2009年12月22日 星期二

XP theme for GNOME

最近再討論版上看到有網友分享一個XP theme for GNOME環境的套件,看起來很方便,點兩下script就可以變成XP主題,另外也還有還原的script,看起來真的很屌,真的可以魚目混珠呢!
請參考這個網站:
http://ubuntu.online02.com/node/14

不過我沒有去嘗試這個就是了,因為我一點也不覺得XP的佈景好看@_@
不過喜歡XP佈景的朋友可以試試看,順便告訴人家這是一個不會中毒的XP@_@

2009年12月21日 星期一

Gantt chart(甘特圖) on Linux

甘特圖(Gantt chart)是一種描述各項目隨時間開始與結束的一種表達方式,專案管理方面的人可能對於這個東西比較熟悉。我第一次聽過甘特圖是幫老闆修改氣象局計畫細節的時候用的。
很幸運瀏覽Wekey-wiki時發現原來甘特圖已經被透過GanttProject計畫用java寫成一個跨平台的軟體。他是自由軟體,但並不是用GPL來宣告;她上面也聲明可以修改他的原始碼,也可以修改後作商業用途,不過找了一下還是沒看到source code。如果只關心binary的話,我們可以到這裡下載便於安裝GanntProject的版本,或是直接下載最新的版本(2.0.10):
wget -c http://ganttproject.googlecode.com/files/ganttproject-2.0.10.zip
壓縮後放到任何地方都可以,可以發現他是靠著script來啟動ganttproject的。由於java執行的方式跟環境比較特殊,用script來幫助執行java程式是非常常見的手法。我們來看看他的script:

這已經算是寫得很棒的script了!不過我還是想作一些修改:

我只是簡化了一些變數的宣告以及java環境的測試。不過很可惜的,由於作者啟動main方法需要讀取一個xml檔,這種呼叫方式我無法不切換目錄(cd $GP_HOME那行)來完成啟動Main class,而這也是我當初要改這個script的最主要原因。倘若所有環境都包在jar裡面,就不用額外宣告classpath,其實是減輕使用者許多負擔的。
作個軟連結,這個程式就可以上線啦!
chmod +x /opt/ganttproject-2.0.10/ganttproject.sh
ln -s /opt/ganttproject-2.0.10/ganttproject.sh /usr/bin/Ganttproject
這樣就可以直接呼叫Ganttproject來使用囉!
啟動GanttProject!!
新增一個專案來玩玩(其實我根本不知道怎麼用!!)
設定一些可以參考的資訊在上面。
拖曳以設定duration。
可以拖曳進度(黑色的bar)
也可以設定milestone以得知進度狀況。
上面的flash教學是用比較舊版的ganttproject所錄製下來的,我照著教學步驟去作,發現新版根本無法像舊版這樣快樂的使用拖曳來變化duration。
照著flash範例教學所做出來的甘特圖!(真不是普通的醜@_@)
把辛苦的成果匯出看看!(果然是WYSIWYG的醜!!!)

2009年12月17日 星期四

『中央』研究院

今天我跟一個中央畢業的同事聊到:
我: 哇!你們中央的人口還真多耶!我看10的研究助理有8個都是中央的!
同事:呵呵,對阿...
我: 而且一堆台大的研究生來這邊也都是中央畢業的耶!這裡真的是中央的天下耶!
同事:(淡淡貌)呵呵,不然怎麼叫『中央』研究院呢!
我: ....(想想還真有道理!)

2009年12月16日 星期三

SUN的電子證照

由於novell有寄給我電子證照,所以我一直以為所有的廠商都有提供電子證照;日前我寫信去sun總部問,總算遲遲的給了一封回信之後便石沉大海:

說要轉交給合適的處理人員,竟然就這樣沒有下文...真是太糟糕了,我就算不是大宗客戶,但還是客戶阿!後來我找上昇陽教育訓練中心,總算得到一個有或沒有的答覆:

所以如果您跟我一樣再找sun的電子證照,至少目前為止sun都沒有提供電子證書的喔!

2009年12月9日 星期三

Google Chrome beta release!!!

等待已久的Chrome for Linux終於釋出beta版了!!先前使用open source的chromine仍然還有許多問題,其中最為人詬病的就是flash支援的極差。Google釋出beta版大家可是睜大了眼睛在看呢!請各位看官到http://tools.google.com/chrome/?hl=zh-TW下載,或是到http://www.google.com/chrome/intl/zh-TW/w00t.html欣賞一下世界各地勞苦功高的開發人員開發chrome for linux的經過~

假設你常用的是firefox,第一次啟動chrome時會匯入firefox的所有設定,包含書籤、密碼、cache等等,非常貼心。

我迫不及待的想拿他來測試flash!!最好的方法就是拿一個swf來測試啦!玩起音速小子,真是超順暢的啦!!

那麼能不能偵測到我的JRE呢?測試看看便知道!

可以偵測到耶!真是方便!

如果預設的字型跟locale以及coding都不適合的話,也很方便做細部調整!

等待各位去發覺的extension!!

還有很多佈景主題喔!不過,當然沒有firefox多就是了!

目前為止還沒發現太多問題,我想請大家依起共襄盛舉測試beta版的chrome for linux,畢竟大家真的等了好久好久!!

我最常用的幾個extension!跟大家分享!!

我強力推薦使用chrome的原因是,chrome非常的輕巧,她可以一次開20多個分頁不會當機,然後關閉再開啟的這些分頁也很快的起來;相較之下,firefox就非常笨重且耗資源,光是開四個分頁cpu loading就超過50%!基於效率跟安全性,我會選擇google chrome。

延伸閱讀:
Chromium for Linux

2009年11月23日 星期一

日本中國

如果我說中國是日本的一部份。中國都該稱為日本中國,二次大戰沒有美國,中國早就是日本的領土,中國人你們做何感想?

清單上沒有我的國家,有一個歧視我國的字眼出現,我若選了就是自取其辱;我不像國民黨員,不會做這種不知廉恥的羞辱國家的行徑。

一個玩弄民族主義、堅持共產主義的貪婪政權,自以為經濟強大,殊不知自己人民的道德與操守跟經濟完全不能相提並論;原本要下載RHEL5來測試的,操你媽的中國,老子拒用Redhat Linux!

2009年11月17日 星期二

ctime, atime與mtime釋疑

每個檔案都有屬性及內容。除了檔案內容很重要外,時間標記也非常重要--系統管理員可以藉由時間標記進行備份、例行性檢查;使用者可以從時間標記找出重要的檔案,硬碟的I/O也依靠時間標記(time flag)來進行處理。

UNIX系統將時間標記分成三種:

  1. atime(Access time):檔案上次被讀取的時間。
  2. ctime(status Change time):檔案的屬性或內容上次被修改的時間。
  3. mtime(Modified time):檔案的內容上次被修改的時間。

我們可以用一個很簡單的script來印證這些東西。

姑且把他命名為showTime.sh

1. 假設我們建立一個新檔:

touch newFile
執行showTime.sh,你會發現三種時間是相同的:
ctime: Nov 17 23:14
atime: Nov 17 23:14
mtime: Nov 17 23:14
2. 隔一分鐘後,寫入一些東西到檔案裡面:
echo "1st modified" > newFile
結果發現:
ctime: Nov 17 23:15
atime: Nov 17 23:14
mtime: Nov 17 23:15
3. 再隔一分鐘後,讀取這個檔案但不更動內容:
cat newFile
結果發現:
ctime: Nov 17 23:15
atime: Nov 17 23:16
mtime: Nov 17 23:15
4. 在隔一分鐘,僅修改屬性:
chmod g+wx newFile
結果發現:
ctime: Nov 17 23:17
atime: Nov 17 23:16
mtime: Nov 17 23:15

從這個lab裡我們可以得到以下結論:

  • ls -l所列出的長資訊,該時間是mtime。
  • 如果利用touch某檔案,則三種時間屬性均被更新。
  • 如果你修改了某一檔案內容,則ctime與mtime會更新。
  • 如果某檔案僅被讀取或另存新檔,則只有atime會被改變。
  • 如果你只改變檔案屬性(如權限、檔名、所有人或是suid、acl、chattr等),則只有ctime被更新。
  • atime相較之下是最常變動的時間標記,可以將之關閉以增進I/O,特別是多人多工,小檔案多以及laptop環境。filesystem設定裡可以增加noatime屬性,或是chattr +A固定住atime(chattr僅適用於ext2/3/4系列的filesystem)

2009年11月12日 星期四

linux上的pdf合併-刪除-旋轉-編輯-加密-破解密碼筆記

PDF檔案格式是目前最重要的檔案格式之一,因為她可以確實保留住檔案的格式,包含字型以及圖形顏色、比例,並且提供解析度極高的列印效果。本文僅就最常用的合併、拆解、旋轉、加解密,以及簡單的編輯功能作筆記。

pdftk(pdf toolkit)是一套可以拆解、合併pdf的超實用小工具,還可以進行加解密,頁面旋轉、解出metedata,書籤、資料欄位等非常多專業功能!解決了往常只有Adobe Acrobat Professional才能使用的功能。隨著pdf越來越普及,字型跟格式都越來越要求跟在不同平台下有完全相同的呈現方式,我們確實是需要學習這樣的實用工具。更棒的是,他是開放原始碼並且以GPL授權的軟體,在許多linux上都是可以直接安裝的,太方便了!
以下我僅翻譯網頁中的範例,在加上自己的註解作為筆記。

  1. 合併多個pdf檔:
    pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
  2. 從數個pdf檔取出某幾頁並合併成另一個檔案:
    pdftk A=1.pdf B=2.pdf cat A1-7odd B2-endeven output combined.pdf
    取出1.pdf的1,3,5,7頁跟2.pdf的2~最末頁,合併成combined.pdf
  3. 頁面旋轉:
    pdftk src.pdf cat 1E 2-endoddW 2-endevenS output.pdf
    第一頁順時針旋轉90度,之後的奇數頁逆時針90度,偶數頁轉180度。
    其中,E=R(right), S=D(down), W=L(left),當然也可以ESW跟RDL混用。
  4. 整份文件上下顛倒:
    如上,其實就是使用D或S參數:
    pdftk src.pdf cat 1-endS output rotated.pdf
  5. 加密pdf檔案:
    pdftk預設的加密強度是128bits,範例如下:
    pdftk plane.pdf output encypt.pdf owner_pw 加密密碼
    另一個強度較小的為40bits,他可以節省不小檔案大小:
    pdftk plane.pdf output encrypt.pdf owner_pw 加密密碼 encrypt_40bit
  6. 加密檔案其實只是限制你不能修改某些受限的部份,如果要求輸入密碼才能開啟這份pdf檔:
    pdftk encrypt.pdf output lock-encrypt.pdf user_pw 使用者密碼
  7. 解密檔案:
    pdftk encrypt.pdf input_pw 加密密碼 output decrypt.pdf
  8. 檔案加密還為了防止他人複製、修改及列印內容。要允許使用者可以列印:
    pdftk plane.pdf output encrypt.pdf owner_pw 加密密碼 user_pw 使用者密碼 allow printing
    允許的動作如下:
    1. Printing

      高品質列印
    2. DegradedPrinting

      低品質列印
    3. ModifyContents

      允許修改內容(包含架構)
    4. Assembly

      僅允許修改架構
    5. CopyContents

      Also allows ScreenReaders
    6. ScreenReaders

      ...這個不是很懂
    7. ModifyAnnotations

      可修改註解
    8. FillIn

      ...這個不是很懂
    9. AllFeatures

      以上所有的options全都開放。
  9. 合併兩個檔案成一個為加密的檔;其中一個檔為加密檔案:
    pdftk A=encrypt.pdf B=plane.pdf input_pw A=加密密碼 cat A B output combined.pdf
  10. (少用)若pdf的page串流有經過壓縮,則會無法修改pdf code。利用uncompress來解壓縮:
    pdftk src.pdf output plane.pdf uncompress
    同理,你也可以下compress指令來壓縮。
  11. 將pdf檔每一頁獨立存成個別的pdf檔:利用burst指令
    pdftk large.pdf burst
    他會在當前目錄產生一個doc_data.txt的log檔作為紀錄。
  12. (少用)修復資料串流長度以及XREF table:
    pdftk broken.pdf output fixed.pdf
  13. (少用)加入浮水印:
    pdftk contents.pdf background Watermark.pdf output contents_WM.pdf
    pdftk contents.pdf stamp Watermark.pdf output contents_WM.pdf
    從指令上也能看出是否要讓浮水印蓋過圖片,細節上還請參考Lloyd神人的在 PDF 上加浮水印
  14. 印出pdf檔裡所有的metedata(就是書籤、頁籤、所有屬性等等):
    pdftk A.pdf dump_data output report.txt

事實上還有更多細節的功能,不過礙於自己也不是很懂,節錄這些常用的功能應該就非常足夠。另外,關於PDF密碼的一些概念,這裡作一些簡單的介紹。pdf的「密碼」大致兩種類型,一種叫Document-open password,另一種則是Permission password。Document-open password是開啟這個pdf檔所需要的密碼,跟使用者比較相關,也稱之為user_pw;Permission password比較像是administrator/owner的密碼,只有所有人才能修改裡面的內容以及關鍵屬性,又稱之為owner_pw。在pdf 1.4以及更早的時代(也就是acrobat 5.0),加密強度僅40bits;到了現在強度已經到128bits;到了Acrobat 9.0以後,導入了AES加密演算法之後,加密強度已經高達256bits,不過pdftk還不支援這麼高的強度;就算支援,做雜湊加密跟解密的時間也會很久。

其實你還可以找到pdftk的gui版本--GUI for pdftk,該作者也大方的提供了各種不同版本給各種作業系統使用,不過他所使用的函式庫實在是太舊了,就算我用軟連結仿造一個他要的版本給他,在執行上仍會有macro mismatch的錯誤,反正pdktk幾乎是無敵的,我也就不理會是否有圖形介面了。

在Windows下有著名的軟體:PDF password recovery--能破解pdf密碼的障礙,那麼在linux底下呢?

pdfcrack是一套基於GPL的開放原始碼的程式,她自動偵測加密長度,並且用內建字典逐個測試。破解密碼時間的長短仰賴於cpu的能力。sourseforge僅提供原始碼,不過別擔心,編譯一定會成功的,只要你有裝gcc的話。


另一個方法是使用wine去模擬windows下破解pdf密碼的軟體。我以pdf password remover做測試,並且利用pdftk隨便加密一個pdf來試驗,發現雖然她似乎能很快的
產生一個乾淨的pdf檔,但是我的pdf內容卻全部被清空!不知道是wine的原因還是如何,總是這看來不太成功。

另一個解決方案則是GuaPDF。GuaPDF這間公司提供了Demo, Local Quad, Distributed以及UNLIMITED四種版本,包含solaris,linux,windows,macos四種平台。Demo版本是免費使用的,如果你的顯示卡是nvidia的晶片且安裝了cuda驅動程式,解密速度可以比一般僅用cpu功能的電腦快上七倍。

linux Demo
MacOS Demo(Intel)
Solaris Demo
Solaris x86 Demo



利用GuaPDF能快速的產生一個未經加密的pdf檔,解密之後用Acrobat reader可能會有一些錯誤訊息,這是很正常的。


但是畢竟是demo版,您可能會遇到下列錯訊息:

  Guaranteed PDF Decrypter v. 3.1 (freeware DEMO version) - CPU version
 (c) PSW-soft, 2000-09, by P. Semjanov, S. Lysak. http://www.guapdf.com
 This product includes software developed by the OpenSSL Project
 for use in the OpenSSL Toolkit. (http://www.openssl.org/)

'Corring, Kay, JP 2001, slab window Argentina.pdf' is the uncompressed document with 40-bit RC4 encryption
This document has no user password, only restrictions present

Key found! (exact value is  7F 7A AC E3 FC)
Would you like to decrypt it now?y
Decryption in progress, please wait...
  0% complete
Warning: Demo limitation reached in line 430
Your file is 100% supported by GuaPDF and decryption is guaranteed, but
demo limitation was reached and file was not fully decrypted and saved as
'Corring, Kay, JP 2001, slab window Argentina.decrypted.pdf'.
It may contain only few (or zero) readable pages and/or produce any error messages.
Please get the full version to correctly decrypt this file.
這是因為demo版限制只能用在430行以內的pdf檔,只好依照需求去跟他買羅~

所以現在我可以用pdftk來任意整理我的pdf文件,GuaPDF來克服某些學術檔案無法列印或複製的問題。

如果要編輯pdf檔案本身,除了要有好工具之外,還需要會一些pdf的語法,這就超過了筆者的能力範圍;不過簡易的修改pdf,仍然可以透過pdfedit這個小程式來幫忙:


pdfedit可以從套件庫裡直接安裝喔!建議閱讀官方網站提供的閱讀文件。如此一來,編修pdf檔時就不需要用vbox開一個windows又使用盜版軟體了!

2009年10月20日 星期二

自動重開機500次?

在bbs的linux版上看到有網友想找可以自動reboot500次的linux程式,我覺得很有趣;不過一下就把script公佈出來,一點趣味也沒有。所以我就先把解答寫在這裡,也許有一天,他會找到這篇。

重開機500次可能是要測試硬體吧,這就超過我的專長;不過自動重開機卻可以用8行不到的script輕鬆解決:

修改/etc/rc.local,新增一行如下:

[ -e /boot/autoReboot.sh ] && bash /boot/autoReboot.sh
然後新增一個/boot/autoReboot.sh內容如下:

所需要會的技巧相當簡單:
1. 會使用while loop。
2. 會使用test敘述。
3. 會使用shell script裡的整數運算(雖然他非常陽春)。
4. 會使用function(雖然他非常陽春)。
5. 知道開機時要額外啟動的命令檔為何。

2009年10月10日 星期六

大小寫互換--進階版

最近用select寫了一個進階版的大小寫互換程式,供各位參考。

2009年10月1日 星期四

變數值代換(variables substitution)精簡筆記

變數值代換相較於指令代換,是一般使用者比較少碰到的;不過當你要成為一位合格的bash/csh programmer,變數值代換可是要跟吃飯喝水一樣自然。

Case 1. ${variable-'defaultValue'}
意義:當variable不存在時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在此變數名稱。

結果:

Maxsolar
       <---沒有輸出
可以發現,第一行的Maxsolar是利用變數值替換得來的,但是事實上我們並沒有真的設定myname,因此echo的結果為無。

Case 2. ${variable:-'defaultValue'}
意義:當variable不存在或為空值時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在或變數值不改變。

結果:

Maxsolar
       <---空的輸出
可以發現,由於myname存在但為空值,因此暫時被設定成Maxsolar,但隨即變失去了Maxsolar這個值,因此第一行輸出Maxsolar,第二行的輸出為空值(請注意跟case 1的「沒有輸出」看起來一樣,意義卻不相同)。

Case 3. ${variable:='defaultValue'}
意義:表示variable若不存在或為空值,則指定defaultValue給variable。variable將在整個script裡都為defalutValue。
這是最為常見的變數值替換。

結果:

Maxsolar
Maxsolar
可以發現,由於myname是空值,因此利用":="將myname的值永久設定成Maxsolar(所謂永久,指的是在此script的生命週期裡)。因此兩個輸出都會是Maxsolar。
事實上,在我們的終端機裡控制命令列最前面的 使用者名稱@主機名稱:工作路徑 的這個表示法,就是在~/.bashrc裡利用此變數替換方法來達成的:

Case 4. ${variable:?'defaultValue'}
意義:若variable不存在或為空值,則會出現在std err上,以檢查變數值是否被正確設定。
此變數值替代表示法常用在debug,而不會真正用在可執行的script上,遇到錯誤就會直接停止,無法利用std err導向輸出。

結果:

test.sh: line 32: myname: Maxsolar
因為myname被預期設定值為Maxsolar,但是卻是空值,因此會觸發一個標準錯誤輸出,script嘎然而止。

Case 5. ${variable:+'defaultValue'}
意義:表示variable若已被設定,則本行的variable暫時被設定為defalutValue,但整個script裡的variable未被改變。

結果:

maxubuntu
Maxsolar
可以發現:myname非空值,因此將會被暫時設定成maxubuntu;但是myname的值不會因此改變,仍然是Maxsolar。

好險,變數值的替換就這五種類型,多看個兩次就可以完全懂了。

小節:

  1. 只想測試變數是否為空值:
    可以用"-", ":-"來檢查,且指定的值只有一行的生命。
  2. 若某變數沒有值,就賦值給他:
    可以用":="來指定
  3. 想檢查該變數值是否為某值:
    利用":?"來debug囉!!
  4. 想臨時改變某一個有值的變數:
    利用":+"來賦值。
  5. 想永久改變某一個有值的變數:
    婀,你一定忘記變數值是可以被override的!直接將某變數指定值給他就可以啦!別想太複雜囉!

2009年9月22日 星期二

檢查目錄下的檔案或資料夾數目

這個script,可以幫你檢查當前目錄下,有多少目錄、檔案、隱藏檔以及連結檔。

用法:
只要在該目錄下,直接執行此script即可。

2009年9月15日 星期二

VirtualBox guest OS USB啟用筆記

雖然用了VirtualBox這麼多年,但是卻是頭一次這麼認真的看待這個嚴肅的題目:如何讓guest OS能夠順利讀到USB介面呢?雖然VirtualBox推出新版本的速度非常快,但是至今仍然沒有任何一個版本是可以不用任何設定就可以讓guest直接讀取USB設備的(MacOSX版除外);如果用的是OSE版本,那可是連USB的支援都沒有!!

由於我只有實體的Debian Lenny、Ubuntu 9.04跟OpenSuSE 11.1,因此這裡只紀錄Debian跟OpenSuSE的解決方法。

Debian下非常簡單,首先必須確定你的帳號有在vboxusers裡面。如果沒有的話,請加入到vboxusers裡面,重新登入就可以了。

萬一重新登入還是沒辦法啟用usb,也別著急,只要控制debian下統一控制mount的script就好。首先我們要先找出USB裝置的gid:

cat /etc/group | grep plug
會得到

這個46便是我們所要記下的gid。

接下來請修改/etc/init.d/mountkernfs.sh,找到domount關鍵字,在其下新增一行如下:

domount usbfs usbdevfs /proc/bus/usb -onoexec,nosuid,nodev,devgid=46,devmod=664
請重新開機,不用修改fstab跟usbfs就可以正常使用usb on guest OS。

OpenSuSE則稍微麻煩一點。SuSE系列的linux沒有usb或是plugdev這類的群組,而是全數交由udev統一控管;想要啟用USB on Virtualbox,該怎麼辦呢?
我們檢視一下/etc/udev/rules.d/10-vboxdrv.rules的內容,可以發現要使用virtualbox的usb,得從vboxusers這個群組下手,而非UserManual上所說的usb群組。

cat /etc/group | grep vbox
會得到

可以得知vboxusers的gid是1001,且我是屬於這個群組裡的一員(這很重要)。

請接著修改/etc/fstab,新增一行:

none /proc/bus/usb usbfs devgid=1001,devmode=664 0 0
許多討論串都只說到這裡,但是筆者無論如何嘗試,但是guest OS就是無法存取usb裝置。很幸運的參考了這個討論串,似乎同時是VirtualBox的開發人員consused建議我們可以在加一個NAME參數到/etc/udev/rules.d/10-vboxdrv.rules
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600" SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664" SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"
變成
KERNEL=="vboxdrv", NAME="vboxdrv", OWNER="root", GROUP="root", MODE="0600" SUBSYSTEM=="usb_device", GROUP="vboxusers", MODE="0664" SUBSYSTEM=="usb", NAME="vbusb", ENV{DEVTYPE}=="usb_device", GROUP="vboxusers", MODE="0664"

請重新開機!這樣你的Guest OS應該就可以讀得到你的USB裝置了!

2009年8月13日 星期四

JavaScript練習筆記(5)

捕捉異常-- try catch以及throw
如果您熟悉java,一定會對於java嚴謹的try catch控制感到佩服(或是厭煩)。事實上,對於異常的捕捉是非常重要的控制,幸好javascript也沿襲這個優點。

  1. 簡單的try catch

    結果會是:


  2. 多加一點花樣!改用confirm()方法

    結果會是:

  3. 利用document.location.href來指定重新導向的位置。

  4. 拋出自定例外(錯誤)
    在java裡,只有例外(或異常)可以處理,錯誤是無法處理的;在javascript的世界裡,所有的例外都可以處理,而且自訂例外--簡直比喝水還簡單呢!

    結果會是:


    所拋出的是一個例外的字串,而非例外類別。

JavaScript練習筆記(4)

在講到物件之前,我們先從陣列這個重要功能開始講起。

  1. 建立你的第一個array!

    結果會是:


    注意,陣列的index是從0開始算起。


  2. 加強型的for語法:for in

    結果也會是:

    跟Java的foreach語法有些不同,但是用意是類似的。傳統的for可以讓你從陣列中依序、依間隔撈出想要的元素值;而for in(或是foreach)語法雖然比較簡單,但是卻只能「每一個」都取出。


  3. 陣列相加
    JavaScript的陣列相加非常容易,他把陣列當成字串方式來處理!

    結果會是:

    透過concat()方法,javascript會幫我們補上一個","作間隔。


  4. 把陣列轉成字串列印--join()並切割--split()

    結果會是:


  5. 排序陣列元素--sort()並自訂排序方法

    結果會是:


    由此可知,英文字母排序是大寫先排完之後,再排小寫。
    印出陣列時,如果小數點為0則只印出整數部份。
    數字也可以跟字串進行排序,只要符合你自己的規則即可!

卸載檔案系統

很多時候卸載檔案系統會遇到一些困難.
這篇文章提供很詳細的解說, 希望可以幫助解決一些問題!
卸載 (unmount)/退出檔案系統

2009年8月12日 星期三

JavaScript練習筆記(3)

彈出式對話方塊

  1. Confirm Box(確認方塊)

    結果會是:


  2. Alert Box(警告方塊)

    結果會是:

    警告方塊只是一個提醒,沒有更多的互動功能。


  3. Prompt Box(訊息提示方塊)

    結果會是:

    prompt()方法可以接受兩個參數:第一個是「提示方塊的title」,第二個是方塊的預設值。


  4. 方法的應用。談到方法,就不得不提到變數。在方法內宣告的為區域變數,生命有要範圍僅在方法的{ }內;方法外的變數為全域變數,所以方法都可以使用。

    結果會是:

JavaScript練習筆記(2)

流程控制與迴圈
上一篇筆記裡忘記提到:JavaScript是區分大小寫,所以跟Java的使用相同!
如果你有任何一種語言的撰寫經驗,這一篇只要輕鬆看過就好!

  1. 你的第一個物件以及簡單的if判斷式:

    結果會是:


    如果您很習慣物件導向的語法,您還可以這樣寫:

    這種方法非常簡潔有力,也不會很難理解,建議大家使用。


  2. Math類別都有一個random()的方法,蠻好玩的!

    結果會是:

    Math.random()會創造出一個範圍大於等於0到小於1的小數,語法跟java幾乎一樣,太好了。

  3. 簡單條件判斷式:(condition)? A : B
    當condition為true時,回傳A, 否則回傳B。適用於僅兩種可能性時,比if的語法簡單多了。

    結果會是:

    你需要特別注意的是:禮拜天是0,禮拜一是1,禮拜六是6,非常好記。


  4. switch case條件判斷式:

    結果會是:


    "break;"的重要性我就不重複提了,default值可以不用再寫"break;",因為他是最後會執行的程式碼。要小心.getHours()是有s的阿!


  5. 關於 邏輯運算子的一點提醒:假設x=5, y=25:
    邏輯運算子 簡單描述 範例
    && and (x < 10 && y > 20)為真
    || or (x==5 || y==5) 為假
    ! not !(x==y) 為真
    在JavaScript裡沒有所謂的鬆散判斷"&"或是"|"。在Java裡, (x < 10 && y > 20)與 (x < 10 & y > 20)解讀上是不相同的。"&&"是聰明的邏輯運算子,假設前者已為false,則後續的比較必定為false,馬上就能回傳所定義的值;"||"也是假設前者已經是true,則總體必然為true,後續就可以不用在比下去了。
    JavaScript都是嚴謹的邏輯判斷式,對於script language來說更能提昇效率。

  6. 來個簡單的for迴圈吧:

    結果會是:

    就是一個簡單的九九乘法表啦!(雖然)沒有排版過真的很醜!
    for迴圈還有加強型的for-in(Java裡為foreach),我們講到陣列之後再回過頭來提一次。


  7. 來個簡單的while迴圈吧!

    結果會是:


  8. 先作一次再說的do-while迴圈

    結果會是:

JavaScript練習筆記(1)

What is Javascript?
根據Wikipedia對於JavaScript的定義:"JavaScript是一種廣泛用於客戶端Web開發的腳本語言,常用來給HTML網頁添加動態功能,比如響應使用者的各種操作。它最初由網景公司的Brendan Eich設計,是一種動態、弱型式、基於原型的語言,內建支援類。以它為基礎,制定了ECMAScript標準。"

您也應該知道,其實Javascript與Java是沒有任何關係的。Javascript最早是Netscape的Brendan Eich所開發的;後來的歷史我並不清楚,最後則又被SUN給買去。"JavaScript最初的確是受Java啟發而開始設計的,而且設計的目的之一就是「看上去像Java」[2],因此語法上有很多類似之處,許多名稱和命名規範也借自Java。"

就我自己認為,Javascript包涵了物件化與非物件化的撰寫風格,想要踏入真正純物件化程式語言的世界(例如java),可以先從javascript感覺那一點點味道。
另外,JavaScript與JScript是不同的喔!JScript是微軟為了對抗JavaScript所開發的,副檔名也取為.js。

初試啼聲

  1. 欲在網頁裡使用javascript,必須網頁內宣告,例如:

    結果會產生:


    利用document.write()將內容寫入網頁。

  2. 你也可以把javascript分開乘另一個檔案,只要用src導入即可:


  3. 你也可以在javascript內使用html語法:

    結果會產生:
    需注意html的語法要包在" "裡面,在外面接受的就是javascript的語法喔!


  4. 如果你熟悉程式語言的話,沒有用{ }控制區塊是很痛苦的,幸好javascript也有區塊的功能:

    結果會產生:

    請以";"作為該script statement的結尾,養成好習慣。另外JavaScript也利用//作為單行註解,利用/*...*/作為多行註解,


  5. JavaScript未必只能在body內宣告。你可以把他宣告在<head>裡,並且在<body>內呼叫javascript的方法:

  6. 因為是宣告在<head>裡,所以這裡看不出效果。利用function宣告一個方法;在這裡我習慣採用JavaBeans的命名方式,方法採用camel case命名方式,並且在html的body內利用onload叫出此自訂方法。

  7. JavaScript使用變數可說相當單純,不用宣告變數的類別;但你還是需要知道他是有類別的區分的:


    結果會是:

    利用+作為串接符號,真是很方便。


  8. 更多變數混用並疊加:


    結果會是:


    可以進行字串相接,也可以作浮點數運算。注意他雖然是script language,但定義變數名稱,變數以及指派運算子"="的中間都可以有空格。
    方法內直接填寫變數名稱會印出變數,如果用" "包住則變成字串,請注意。



2009年8月7日 星期五

Chromium for Linux

當我們談到Chrome for Linux時,就不免會看到Chromium這個字。實際上,這兩者是不同的東西:Google Chrome乃是根據Chromium這個開放原始碼的計畫去實做的。Chromium這個計畫並非以GPL授權,反之是以更自由的BSD的許可方式授權。詳細介紹可以參閱WikiPedia;版本上,Chromium每隔幾小時就會有一個更新,當測試後確定為穩定版本後,就會被Google納入Google Chrome裡,因此可以說Chrome是Chromium的穩定版本。然而,Google並沒有發布Chrome for Linux的穩定版,因此我們在linux所使用的都是Chromium for Linux,或是Google所打包的Google Chrome for Linux不穩定版(還是Chromium,只是灌上了Google的名字罷了),請特別注意。

Google Chrome Chromium

我們可以從Chromium開發者文件找到適合各種平台跟版本的Chromium來安裝。

Mac userGoogle Chrome.dmg
Debian-lile Linux(i386)google-chrome-unstable_current_i386.deb
Debian-lile Linux(amd64)google-chrome-unstable_current_amd64.deb

如果您是Debian的使用者,甚至可以加入google repository到/etc/apt/soutces.list裡:

deb http://dl.google.com/linux/deb/ stable non-free

如果您並非Debian-like的linux,可以到build.chromium.org下載每幾小時更新的「免安裝」版本:相較於以上是由Google官方所打包,這個版本就是最純的Chromium For Linux的版本了。

小結:
1. Chromium For Linux一開始就會偵測系統其他的瀏覽器,並且詢問是否要自動匯入到Chromium裡,很方便也很貼心。
2. 我所安裝的Chromium for Linux(from build.chromium.org)還是無法顯示含flash以及java的網頁,除非啟動時加入--enable-plugins。可以參考Google Chrome Linux 已經堪用了一文,裡面有網友熱心提供的一些建議參數可以使用。
3. Chromium for Linux還沒有實做出privacy feature,因此不建議一般人使用。
4. 尚未支援列印功能。

延伸閱讀:最友善IE版本!

the picture is cited from DeadDog.

gmail專屬圖示

很多人不敢在個人網站上光明正大的擺上自己的email,甚至是作一個連結放在html原始裡都不敢,原因是因為網路上蒐集email的機器人程式實在是太多了!一個比較好的解決方式是:把自己的email作成圖示吧!

於是我搜尋"email +icon +generator",真的出現一個網站可以自訂我們的email圖示,而且不只gmail呢!各位可以利用services.nexodyne.com來產生自己的email圖示喔!

不過!由於網頁是php寫的,我實在不敢保證這過程中我們的emial information會不會被偷偷存下來...如果有疑慮的看官還是別輕易嘗試吧!

完成後我的email圖示如下:

2009年8月4日 星期二

GSAS on Linux安裝筆記

第一次接觸到gsas這套自由軟體,是在成大地科系跟龔老師的高壓礦物研究室學來的。很幸運能夠幫忙開發轉換gsas格式的小程式,僅以此篇作筆記。

一、What's GSAS?
GSAS (General Structure Analysis System)是一套可以藉由中子繞射(neutron diffraction)以及X-ray資料來分析結構模型的一套系統。她可以分析單晶繞射、粉末繞射 (Rietveld analysis),或者兩者同時分析。 愧於筆者並非本領域出身,請詳見該網站的介紹。 作者是Allen C. Larson and Robert B. Von Dreele,Los Alamos National Laboratory。gsas並非開放原始碼軟體,作者也在首頁上說明別寫信跟他要原始碼。

二、下載及安裝
GSAS是一個文字介面(console mode)的程式,想要使用圖形介面還需安裝 EXPGUI;作者建議我們可以安裝bundle的版本:GSAS+EXPGUI。對於Linux的使用者,可以直接下載:

wget -c ftp://ftp.ncnr.nist.gov/pub/cryst/gsas/LINUX_gsas+expgui.tar.gz
假設把gsas放在/opt裡:
tar zxvf LINUX_gsas+expgui.tar.gz -C /opt
此時你需要以root權限設定一些變數:
echo " alias gsasgui=\"/opt/gsas/tcltk84+ /opt/gsas/expgui/expgui\"" >> /etc/skel/.bashrc

echo "export GSASHOME=\"/opt/gsas\"" >> /etc/skel/.profile
echo "export GSAS=\"/opt/gsas/exe\"" >> /etc/skel/.profile
有些linux版本(如RedHat系)可能是/etc/skel/.bash_profile,請自己留意。 最後,你需要在.profile裡對PATH作最後的修正:
export PATH="$HOME/bin:$PATH:$GSAS:$GSASHOME"
正規的Linux設定裡,.bashrc裡規範alias、終端機格式等;在.profile裡規範環境變數、區域變數,因此強烈建議依照筆者的設定方式去設定。 設定完成後,請使用者將/etc/skel裡的設定檔覆蓋到家目錄下即可:
cp /etc/skel/.bashrc ~/
cp /etc/skel/.profile ~/
設定在/etc/skel的好處在後續的維護上,往後新增使用者完全不必在設定一次。

你也可以參考for unix的教學。網站上的教學把alias設定在.profile裡,是違背當初設計的精神的;因此這樣設定雖然不會有誤,但還是強烈建議各位設定在.bashrc,而非.profile。

三、進階設定
使用者可以客製化自己的EXPGUI設定,請參考這裡
    請養成閱讀manual的好習慣,這裡有最新的手冊可以下載。

四、轉換小程式--JRaw2Gsas
我有為成大地科系高壓礦物實驗室寫了一個開放原始碼的小程式--JRaw2Gsas(The Java Raw to Gsas Transforming Program),各位可以到我的協作平台下載使用。不過功能只能轉換成大地科系的兩台X-ray機器,其他的可不保證喔!
這是我寫的第一個圖形程式,也是第一個考過SCJP後寫的小程式,我很高興!雖然功能很簡單,但是我還是把原始碼跟各位分享;只是諸位如果利用我的code修改後,還是要再使用GPL發佈出來唷!

2009年7月27日 星期一

MadEdit --An alternative to UltraEdit on Linux

在windows上非常著名的純文字編輯程式--UltraEdit,可以支援多種格式編碼,也能為各種不同語法彩色註解,甚至搭配一些簡單指令功能還可以直接進行編譯動作。最方便的地方莫過於可以轉換成16進位模式以及選取「欄位」(一般編輯器只能選擇「行」)。不過她畢竟是商業軟體,雖然最近正在努力猛推即將推出的新產品--UEX(UltraEdit for Linux),介面據說會跟windows的版本完全一樣;但她畢竟還是不開放的軟體。

本文要介紹的是一個在Linux下開放原始碼的ultraedit替代方案--MadEdit

由於開放原始碼的關係,各種平台都可以使用,並支援各種Encoding(UTF-8/16/32,Big5,GBK...);以下提供的版本為0.2.9.1,如果需要更新的版本,請參考這邊

Linux i386 rpmdeb
Linux amd64 rpmdeb
FreeBSD i386amd64
Source code code
M$ windows win32-bin


Fig 1.用MadEdit開啟純文字檔案。清楚的標示tab,空白鍵以及斷行符號,也會根據語法有彩色顯示。
Fig 2.可以方便的讓使用者選取欄位。
Fig 3.強力的搜尋功能。
Fig 4.強力的取代功能。

對我而言她已經非常足夠我學術上的使用了,推薦給各位;如果你們覺得有滿意或是不滿意的地方,請各位到這邊回報,讓開放原始碼軟體能夠更進步,謝謝您!

2009年7月26日 星期日

SCJP passed!!!

經過了半年多的努力,我從一個完全不會寫程式、完全不懂java的人提升到拿到了SCJP的證照,也許對很多人來說這是很基本甚至是很容易的事情;但對我這快三十歲又要兼顧其他工作的人來說,我真的讀得很辛苦。

並不怕丟臉,我考了三次才過;我沒有像其他人那麼輕而易舉的過關,我一而再、在而三的反覆練習,熟讀定義跟實做,對我而言是一種辛苦付出的證明,而不是表示我有多厲害的一張證書。

第一次考試:
我幾乎是在懂50%的情況下就去考試的。於是很悲慘的,考試成績很明顯,距離過關還有一大段距離。6.0的考試規定要答對65%才算過關,以總題數72題而言,我至少要答對47才算過關。
第二次考試:
距離第一次考試隔了一個月,我下定決心買了廣受好評的猛虎出閘這本參考書,細心規劃每一個章節;很多部份我如果唸不懂,作實例也不是很能明白,我就會跳到後面的練習題,透過理解題目來了解java。不過這實在不是學習java的好精神,因此很快就被我廢棄了;我超討厭背考古題,我想要真正的融會貫通,於是我下定決心預定的進度沒有讀完就不睡覺,遇到讀不懂的就盡量畫圖來幫助自己記憶。但是說實在的還是很多讀不懂,就先考考看吧!果然成績還是告訴我,拿SCJP還不夠格呢!
第三次考試:
距離第二次考試又隔了一個月;我發現自己唸猛虎還是有些似懂非懂的地方,無論我唸了幾次,不懂就是不懂。於是我只好忍痛再買「SCJP 6.0專業認證手冊」,十個章節規定自己12天內讀完,而我也確實從這一本書上理解許多不懂的地方。由於我知道我這次如果再沒考過,我應該就不會再有時間特地為了準備SCJP而練習java,因此我很扎實的練習,也很勤奮的作筆記,希望這樣的方法能夠避免自己去死被考古題;巨匠建議我選考5.0會比較容易,我想想也好,於是第三次我選考了5.0的版本,很幸運的終於過關了!
我的參考書籍。
為了能夠了解java se裡所提到的,多執行緒程式裡的方法,我大約畫了這張圖有十次之多。沒辦法,我頭腦不好,只好用苦工的方式去記憶跟理解。
Collection是我最害怕的部份,裡面的類別跟方法多如牛毛,對於沒有類似經驗的學習者而言,這真是痛苦的一個部份!我一樣把這個繼承關係圖畫了快要十次,幫助我對於這些類別的關係跟特性有比較系統的理解。
專業訓練手冊讀完一遍之後,又回頭在唸一次猛虎出閘。我為了確保每一題是真的理解,每一題都盡量把每個選項對錯的原因都找出來,並試著寫出正確的答案。
努力的成果終於在三週後寄來了!感謝偉財師在我考上的前兩個月幾乎每次都被我拖到晚上10:30以後才能下班,為了解決我的問題耐心的指導!真是謝謝你啦!如果沒有你的耐心,我的努力可能也很難達成目標!

最後,我還要感謝老婆在我這兩個月忍受我的壞脾氣跟不理不睬,為了讀書我犧牲了很多時間跟老婆相處,感謝你的善解跟體諒!沒有你的支持,我也沒辦法幸運的考過!

更要感謝媽媽給我調氣的補品,讓我免去頭痛的困擾,可以專心的唸書!

結論:
對於像我這樣的人而言,考過SCJP只是表示我看得懂se的程式碼罷了,不能表示我真的有能力靈活運用所有se的技巧。我會趕緊努力把基本功練起來,否則空有一張SCJP而沒有真材實料,恐怕也只是被人戲稱「paper engineer」罷了!
持續努力中!


大概也是一個多月才會收到實體證書喔!