11/10/2012

[閱讀] 20世代,你的人生是不是卡住了

本人今年已過了20有5,應該有很多人跟我一樣,對未來感到徬徨。

有的人徬徨於生活的不上不下,有的人徬徨於對自身的迷茫;徬徨有很多種,而我總是擔心自己仍然做得不夠好、仍然跟理想中的樣子差了好大一截、是不是做得到幻想中的期望?究竟多餘的是期望本身,還是擔心這件事呢? 雖著年紀增長,身邊愈來愈多比自己年長上超過三歲的朋友,而同年齡的朋友也相對地愈來愈少遇到。從他們口中,常常聽到這樣的話:「反正妳還年輕。」、「真好,妳還年輕!」、「妳還有時間呀!」,說實在的我個人非常討厭聽到這樣的安慰,對我來說他們的態度很像是「打馬虎眼」,也更加令我懷疑「我真的還有那麼多時間嗎?」 也許他們只是想讓我知道我還有很多可能,但怎麼想,我都覺得我沒時間了.. 其實在同輩之間,我的薪資水準還算是挺可以的了,難道這一切真的是我想太多了嗎? 

這本書給了很多重要的指引,不像市面上的「30歲前一定要做的55件事」,或是「35前一定要完成的20件事」之類的充滿表面的噱頭標題,它點出了這段時間是否真的那麼重要、重要的原因、影響的可能,和必須懂得面對的觀念,還有重要的:你到底該跨出哪一步。全書分為《工作》、《愛情》、《腦部與身體》。《工作》告訴你面對工作產生的壓力與人生方向的徬徨在處理上的正確性,《愛情》點醒你這世代所面對的根本問題到底是什麼。前兩大分類很棒,我想一位能夠主宰這兩塊的人,也是公認擁有魅力人生的人吧!《腦部與身體》告訴你,在醫學面,20世代在人格形成上之所以如此重要的佐證和隨之而來必須正視的問題,幾乎可以說就是這些原因能夠告訴我們 Why your twenties matter and how to make the most of them now. 看完這本書,我簡直感動地也想去做心理諮商了(作者的職業)。

以下,打算節錄各章節讓我印象深刻、值得思考或是感動的句子,加上個人時不時的碎碎念,形成整篇讀書心得。


10/28/2012

在SDCard上自動執行指定之應用程式

最近寫了一個在SD card上自動執行某應用程式的小程式
這程式可以以不透過定義autorun.ini 或是 regidit的方式,在硬體插入SD card後自動進入指定的application
稍微看了一下網上的資料大多都是英文的,中文也以簡體居多,所以決定順手記錄下來

Visual Studio 2005 C++ for WinCE
Windows smart device program, Windows application program
透過Wizard產生project會產出很多程式碼,這邊只寫出這項功能必要加上的部分,可以自己去決定該加在cpp的哪個位置

//定義application在SD card路徑
#define APP_PATH (L"\Storage Card\\APP.exe")
//可以定義若application開啟不成功的需要文件
#define APP_STARTUP_PATH (L"\Storage Card\\APP.exe")

int WINAPI WinMain( HINSTANCE hinstance,
                    HINSTANCE hPrevlnstance,
                    LPTSTR lpCmdLine,
                    int nCmdShow)
{

   SHELLEXECUTEINFO sheExeInfo = {0};
   //exe APP.exe
   sheExeInfo.cbSize = sizeof(SHELLEXECUTEINFO);
   sheExeInfo.fMask = SEE_MASK_NCLOSEPROCESS;
   sheExeInfo.hwnd = NULL;
   sheExeInfo.lpVerb = NULL;
   sheExeInfo.lpFile = APP_PATH;
   sheExeInfo.lpParameters = L"";
   sheExeInfo.lpDirectory = NULL;
   sheExeInfo.nShow = SW_SHOW;
   sheExeInfo.hlnstApp = NULL;
   ShellExecuteEx(&sheExeInfo);

}




9/16/2012

First Using Git Hub

general big rules:



- start your own project on GitHub: Create A Repo
- start a new project that based on other's one on GitHub: Fork A Repo
  remember to clone one to your local machine, you can also obtain it via clicking "Clone in Windows"

Install RoR

must installed first:

1. Ruby Language

Windows 系統可選擇一個好用的 Third Party Tools 裝: Ruby Installer

2. RubyGems packaging system

check out at here

3. SQLite3 Database

check out at here

some recommend guides:


what is Rails?

    you can skip this part if you want. check out the Chinese version here

Basically, the Rails philosophy has following three main guiding principle:
  • DRY – “Don’t Repeat Yourself” – suggests that writing the same code over and over again is a bad thing.
  • Convention Over Configuration – means that Rails makes assumptions about what you want to do and how you’re going to do it, rather than requiring you to specify every little thing through endless configuration files.
  • REST is the best pattern for web applications – organizing your application around resources and standard HTTP verbs is the fastest way to go.
Installing Rails:

  For Windows user, check RailsInstaller

Start a project (default under C:\Sites\)..

$ rails new demo

go into the directory
$ cd demo

connect to the server
  's' == server
  'g' == generate
  'c' == console
$ rails s
or
$ rails server

installes with well IDE..
I choose Sublime Text2

edit ur page..
go into the path which contain the ruby cmd
$ cd C:\SelfProjects\RailsInstaller\Ruby1.9.3\bin
pass Rails 'rails' command to Ruby
$ ruby C:\Sites\demo\script\rails g controller home index

7/07/2012

[basic] writing batch file

noted:
1) 一指令一行
2) .bat 檔名勿與 DOS指令同名
3) 指令錯誤 Bad command or file name / 語法錯誤 Syntax error
4) .exe & .com 執行順序優先於 .bat, 因此同名時執行批次檔需打入全名
5) terminate execution by Ctrl+C or Ctrl+Break
6) 批次檔是一種文字檔案 (ASCII)

ECHO
@ECHO ON 顯示批次檔命令於螢幕上
@ECHO OFF 不顯是批次檔命令於螢幕上

正常而言一般都是會顯示的,可透過ECHO控制

REM
當註解使用
REM THIS IS JUST A COMMENT...

%
代換參數,後面跟著一個阿拉伯數字,%1~%0表示
變數的值由呼叫批次檔的指令指定

%VARIABLE%
環境變數
  %STUDENT%

PAUSE
暫停

SET
顯示、設定、或移除環境變數
SET [variable=[string]]
 variable 環境變數
 string 給的值
  SET
  SET variable=
  SET variable=value

 ex
 SET %1=ASTRING
 SET %CLASS%=
 SET %STUDENT%=ALLY

CALL
在不中止目前BAT的情況下,使用同一環境呼叫別的BAT來繼續執行
ex
REM SEND %STUDENT% TO SPECIFIC CLASS, PROCEED BY SetClass.bat
CALL SetClass.bat STUDENT

ERRORLEVELS
通常拿來用作 IF ERRORLEVEL 使用
ERRORLEVEL不是一個standard feature,他是根據前一行code的執行狀態所回傳的值
正確來說叫作return code
一般而言,0 代表值行順利,1 以上代表發生問題,但有例外存在。

IF ERRORLEVEL 有一個特別的現象非常實用,將在 IF 介紹


IF
當條件為真時執行command
IF [NOT] ERRORLEVEL number command ERRORLEVEL大於等於指定的數值時為真
IF [NOT] string1==string2 command 兩string相等時為真, 大小寫有分, 使用 /I 可不分大小寫
IF [NOT] EXIT filename 如果指定的檔名存在便離開

FOR
使用方式相當多
FOR %variable IN (set) DO command [command-parameters]
在使用FOR時, %v要以%%v表示, 大小寫有分


.....今天就先記錄到這....

5/05/2012

版本控制 using SVN

當檔案一多,各式各樣的修改和增加功能的動作也愈多,就會自然的需要管理Version的工具
這些工具就叫作version control system
之前用過VSS (Visual SourceSafe)
這次使用的是SVN (Apache Subversion)
常見的CVS (Concurrent Versions System)也是這樣的工具。SVN最初的構想即是發展成一個可取代CVS的version control system,而且是FREE的。


版本控制的立意滿好理解的。
不外乎就是因為人多手雜,因此需要有一人、一個地方、或在這裡可以說是一樣工具,去管理這樣的場面,避免發生慘絕人寰的命案。


首先先了解你是在Trunk還是在Branch?
雖然聽說Alice's adventure in Wonderland裡的精靈曾經告訴Alice說「如果妳不知道妳要去哪裡,那麼現在你在哪裡一點都不重要。」我還是覺得若能更清楚現在的情況,還是對將要去哪裡有
幫助的。

Trunk                    //主幹,也就是你這堆東西develope的主幹
Branches               //分支,從主幹而來的,可能加上或砍掉一
                                些東西,另外修改了某些功能
   svn copy http://svnserver/calc/trunk http://svnserver/calc/branches/my-calc-branch -m 'create a branch'  
另外,可利用Tag來保存Release的史料


事情的發展上基本上是這樣:

Svnadmin create    //SVN manager set Reposity,並在這裡設置使用者帳密、權限
SVN import          //import專案資料夾進Reposity,主要用意在建立結構
  svn import project_directory http://DOMAIN/svn_project
  svn import project_directory file:///SVN_PATH/svn_project


Svn checkout(co)        //check out the source you need from Reposity
  svn co http://SVN_PATH/svn_project
  svn co file:///SVN_PATH/svn_project
  svn co -r 7 file:///var/lib/svn/dev/projects           //指要第七版



Svn update(up)          //確保自己working base端source的更新正確性
  SVN_CHECKOUT_DIR$ svn up

svn add
  SVN_CHECKOUT_DIR$ svn add filename 或 svn add directory
svn delete
svn copy
svn move

Svn status(st)            //查看己方檔案/結構 跟線上SVN的差異
  SVN_CHECKOUT_DIR$ svn st


Svn diff                   //查看檔案內容跟線上SVN的差異
  svn diff #       //compare with previous version
  svn diff -r9237:9238      //compare with pointed version


Svn commit(ci)          //覆蓋回SVN上現在的版本,版本更新
  SVN_CHECKOUT_DIR$ svn ci


Svn revert                 //還原到SVN上最新的版本
  SVN_CHECKOUT_DIR$  svn revert [file | directory]


Conflict
進行以上動作時,難免會遇到Conflict(衝突),也就是可能有兩人(以上)同時對檔進行修改,而SVN並無法決定該更新哪一部份,這時就得靠人把這些檔案做一個確定性的合併(Merge),繳回(Commit)統一後的版本給線上SVN。


處理Merge這樣的工作你可以使用多種Merge的工具去處理,必須注意的是,這樣的情形必須「用 resolved  將自動產生的檔案刪除, 才能正常 commit」
    svn resolved filename            //刪除自動產生的diff檔案 
                                                            ex: .r9366, .r9367, .mine


其他command,詳細可參考這裡


另外,請注意由於你使用的SVN可能是來自於非Subversion所release的工具,因此還是得去下載CollabNet Subversion(建議)。比如當你發現你的電腦告訴你svn並非你的內部或外部指令時..(這當然就是抓command line那個啦~)






以上內容參考自

SVN 基本指令教學@Tsung's Blog

Version Control with Subversion PDF - 作者: 邱茂森

Version control with Subversion

4/15/2012

[未完] about Template

Template 照理說是一個非常好用的概念
很可惜的不論是Basic programming class or Advanced class 都沒有深入地去了解怎麼去使用這項function
這裡筆記的是based on C++ programming
從美國回來以後總算是開始工作了
注意到了將template實用的例子
趁這個機會好好整理一下這方面的概念,以往寫一些練習其實都沒什麼用到這個func,所以概念還真挺容易模糊掉的呢...

[開始]

3/04/2012

[轉錄] Java static,final 基本概念

java之於我就像是美食界之於特瑞柯一樣
噢 我想應該是 美食界之於小松 一樣吧 (就體能論..)
anyway, 就是想把一些我認為介於初~中級之間,甚或是我認為需要重新筆記整理的觀念,都記錄起來 
好不容易找到一篇還滿淺顯易懂的文章,不然看著一面面的Thinking in Java還真是無所適從呢.. 

<<以下來自 Ken Yang 筆記 >>

從很久以前我就了解到,

不僅僅要知道know how, 還要知道know why,

舉個例子,當我派工作給底下的人做時,

例如要他做出一個發送mail的功能出來, 

恩,拜Google大神所賜,通常很快都可以找到發送mail的code。 

但是當我細下去問每一行code的用途時, 大多是...."恩...不知道"。

我覺得此風不可長。

甚至有些學弟們搞不清楚何時要用static、final。 

也不懂甚麼是interface、abstract等等之類的。

因為他們也不知道這些東西的作用。

所以用這篇文章來稍微解說一下。

static:

靜態的意思 可以用來宣告一個函數或者變數, 

只要記得當一個函數或者變數被宣告為static時, 他就具有唯一值的概念!!

他就永遠只佔著那一組記憶體空間。 不管該類別被new幾個object,該值永遠都會是一樣的! 

舉個例子!

我們看到下面code的例子
class test{
     static int iValue = 0;
     public test() {
     }
}
public class main {
     public static void main(String[] argv)  {
          test test1 = new test();
          test test2 = new test();
          System.out.println(test1.iValue);
          test2.iValue  = 10;
          System.out.println(test2.iValue);
          System.out.println(test1.iValue);
     } 
}
我們把test這個類別裡的資料成員iValue宣告為static, 

然後再main裡面分別去new兩個object出來。  分別是test1, test2, 

然後先印出test1的iValue出來,(印出0,當然!一開始是0) 

接著我們用test2這個object去將iValue設值設為10, 

接著再去印出test2的iValue出來,(印出10出來,當然!因為設成10了阿)

重點來了!

這時候再印出test1的iValue出來!

大部分的人會覺得,應該是印出0阿, 但是印出的是10。 

原因是因為我們將iValue宣告成static了。

而iValue成為一個共同的變數。

這就是static 的一個特性!

特性一:

永遠會是一個唯一值!!

且static 還有一個特性,

特性二:

static可以透過類別直接存取使用!

意思是我們其實不需要new 一個object出來。

也可以透過類別直接去存取該變數 例子如下!

class test{
     static int iValue = 0;
     public test() {
     }
}
public class main {
     public static void main(String[] argv)  {
          System.out.println(test.iValue);
     }
}

你會發現在main中,我們並沒有new一個object出來!!

也可以存取到test這個類別中的資料成員(iValue)

static的介紹大概到這,  接著介紹final

final:

相較於static,final的概念就容易了解許多!

可以用來宣告一個類別、函數、或者變數。

類別:當宣告在類別上時,該類別就無法被繼承! 

函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫 

變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。

注意!

使用static final需要注意一點!!

如上面所述說的,當我們有一個常數要宣告時, 會宣告如下
public static final String strValue = "ken";
為什麼宣告這樣會有個風險呢? 因為java在進行compile的時候, 會將宣告成static final的變數,直接包進去程式裡面。 什麼意思呢?
System.out.println(strValue);
當你有類似存取strValue的code時,

我們去把java會把compile成的class,

decompile來看  會發現它變成如下的code
System.out.println("ken");
好啊好啊,那到底風險又在哪?

當然啦,

如果你今天有用一些好用的IDE進行開發, 應該是不會遇到這樣的風險, 

以Eclipse為例,只要你一儲存或者執行,Eclipse就會幫你進行compile!

(如果有勾選Build Automatically的話)

可是如果你今天是徒法煉鋼!

自己下指令進行compile的時候... 又剛好你程式改了,

把strValue的值改為"yang", 又剛好你忘記進行compile.... 

這時候...如果有人去存取strValue就會出錯!!

 那怎麼解決??? 我們可以利用static block來進行宣告的動作!!! 如下:
static String strValue;
static{
     strValue = "ken";
}
如果用這樣的宣告方式,即可避免上面述說的問題!

原諒我,太累了。

今天就先講解static,final 基本概念

下篇在講解interface, abstract!!

不過我沒翻到「下篇」就是了@@

筆記用法

想要找個地方做做筆記 或是做做實驗
也不知道這筆記會活多久就是了..=.=
class test{
     static int iValue = 0;
     public test() {
     }
}
public class main {
     public static void main(String[] argv)  {
          test test1 = new test();
          test test2 = new test();
          System.out.println(test1.iValue);
          test2.iValue  = 10;
          System.out.println(test2.iValue);
          System.out.println(test1.iValue);
     } 
}