2012年11月28日 星期三

OS X 上如何 restart deamon

在 FreeBSD 上,如果我們要 restart syslogd, 作法是:

/etc/rc.d/syslogd stop
/etc/rc.d/syslogd start

然而在 OS X 下並沒有 /etc/rc.d/ , 當然也看不到這類 deamon script.

根據 Apple Mailing Lists,  就直接kill它, launchd會重新把它跑起來。

2012年10月1日 星期一

在mac中,用 Virtualbox boot 外部實體裝置的問題

問題一(已解決):vmdk建好了,卻無法加入VM?

如何用 VBoxManage 建立一個指向實體裝置的 vmdk 檔,google一下就會有很多資料。
要注意的是,在mac下這個指令必須以sudo執行。

然後在Virtualbox GUI畫面,建立新的VM、「加入現有硬碟」這一步就卡住了。
(注意,在加入硬碟時必須把該硬碟「Eject(退出)」。OSX會自動加載,請把它退出。否則Virtualbox會告訴你「resource busy」。)

http://ubuntuforums.org/showthread.php?t=1914382
https://forums.virtualbox.org/viewtopic.php?f=8&t=50326

上面兩篇討論串指出,The medium <filename> can't be used as the requested device type 錯誤是使用者權限的問題。
我試過對該vmdk檔以 chown 把擁有者改回自己、以 chmod 把權限改成777,即使如此還是無法加入硬碟。
猜想,應該是由於該檔案指向/dev/disk2,而/dev底下的裝置只有root權限才能存取所致。
故解法變成,`sudo Virtualbox`:以root權限啟動Virtualbox。
這方法work,不過要注意開起來的Virtualbox會與你平常用的分開。在這裡創建的東西會存在 /var/root/VirtualBox VMs/ 底下。

雖然每次用都要以root權限較麻煩,但至少可以work。

[2012/10/2 下午11:05 更新]
找到mac的解法了,網址如下:http://www.garrettbartley.com/2010/06/12/running-bootcamp-using-virtualbox/
linux的解法是讓user加入disk群組,以取得磁碟存取權限;然而mac無法這樣做。上述網頁是將/dev/disk1用chmod改變權限;然而重開機即失效,故令寫一支applescript並存為應用程式。


問題二:無法以EFI開機

我目前遇到第二個還沒能解決的問題是,當外部裝置以EFI開機會失敗。
日前製作了一份小白整顆硬碟的拷貝,OSX已經安裝rEFInd。照理說這顆硬碟開機會進入rEFInd的選單畫面,但VirtualBox只是閃了一下就結束程式了。

問題三(已解決) :eject flash USB,/dev/disk2卻不見了?
在Finder「退出」,對不同USB裝置的意義也不同。退出外接硬碟,/dev/disk2還會留著;退出flash USB,/dev/disk2會一起消失。
解法是,在終端機下指令`diskutil unmountDisk /dev/disk2`.
這樣Finder上的圖示會消失,而/dev/disk2卻會留下來。
參考:http://apple.stackexchange.com/questions/40112/how-do-i-mount-ejected-external-usb-flash-storage

問題四:用實體裝置的vmdk當做硬碟,會無法透過光碟開機
其實還有一種可能,即root權限下的VirtualBox不能做這件事。這想法不太合理,但我還沒測試過所以還是不將他排除。


2012年9月14日 星期五

讓 Qt 連上 MySQL

這過程實在太痛苦了,故筆記一篇。
兩年半前曾經搞過一次,但沒記錄。我還清晰地記得,自己成功地編譯安裝Qt,是我進入UNIX世界的契機。
當時的OS是雪豹,跟的一些文件也不曉得跑哪兒去了。

----

OS: 10.8.1 Mountain Lion
Qt 4.8.1 (抓官網dmg下來裝)
MySQL 5.5.27 (抓官網dmg下來裝)

故事是這樣的:我在寫一支Qt程式,需要資料庫。一開始抱著玩玩新玩具的心情選了SQLite,很順利的連接運作彷彿一切都是這麼自然。

然後得知該應用會需要處理非常大量的資料,我不確定SQLite有沒有辦法處理,且未來有可能需要做成multi-client存取一個資料庫的情況,我決定換成MySQL。
這就是苦難的開始。

Qt 需要個別DBMS的「driver」,而這東西並不隨Qt一併散佈,需要抓Qt source code 下來編譯(只需編譯driver的那一小部分即可)。

抓下source tar ball了,README告訴你:要編譯MySQL driver,請提供MySQL header。
這意味XAMPP武功全廢,請在系統上真的安裝MySQL。

抓下來安裝好,你有了全套MySQL與該有的header與library。

然後照著Qt官網寫的步驟把driver編出來也安裝好了。


但為什麼還是不能動!!!!

App在console上噴的錯誤訊息從來就沒有變過:


QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
("QSQLITE", "QODBC3", "QODBC", "QPSQL7", "QPSQL")
("/Users/mac/QtSDK/Desktop/Qt/4.8.1/gcc/plugins", "/Users/mac/learnQt/ManageSystem-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug/ManageSystem.app/Contents/MacOS")
QSqlQuery::exec: database not open


 這太令人無力了。
怎麼Google都無解的狀況讓人沮喪,我整個下午都在處理這個鳥問題!

最後終於google到一個討論串解決了我的問題。
解法是3行shell script,先export兩個環境變數,接著一個 install_name_tool指令。

我目前仍然不曉得原理為何,看指令令人疑惑。
man page上寫 install_name_tool -change 接受兩個參數, old和new。
但上述討論串給了3個參數。我不確定最後一個是不是默默忽略了。
我猜想,這個指令的功能是把 libmysqlclient.18.dylib 這個檔案重新指向正確的位置、亦即mysql在系統上的安裝位置。


不曉得以後發佈到Window上這樣的過程要不要再來一次(抖)

噢對了,到這裡後,無論是系統的MySQL或XAMPP的MySQL都連得上了。
不過XAMPP的需要額外一行:
db.setConnectOptions("UNIX_SOCKET=/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock");

2012年9月10日 星期一

失控的 mds


查看process開啟檔案的指令
sudo fs_usage -w -f filesys mdworker

似乎某些有問題的檔案會讓 mds 一直替它 reindex. 解決之道是將其納入 private tab.


有些造成問題的目錄請放到 系統偏好設定中,Spolitght 的 private tab.
http://ischack.net/2011/07/mds-mdworker-running-wild-on-os-x-10-6-and-10-7-again/
http://tumblr.amitgupta.com/post/262471673/stopping-runaway-cpu-usage-by-mds-mdworker-and

List Open Files (lsof)

ls -c mds

2012年8月30日 星期四

打開 apache 的 CGI 設定

環境:OS X 10.8.1

OS X 預設狀態下 apache 的 CGI 是關掉的。
根據一個教你使用 lisp 作為 cgi script 的網頁,只要在 conf 檔中改兩個地方即可。
一是 <Directory> section 中, Option 後面要加上 ExecCGI。
二是加上一行 AddHandler cgi-script .cgi。

這裡除了.cgi,你可以加上自己喜歡的語言副檔名讓 apache 認得,例如.py、.pl。我自己加了.lisp。

除了直接改 /etc/apache2/httpd.conf 外,mac 很貼心的提供了 /etc/apache2/users/user.conf,你可以在不更動全域設定的前提下為自己的使用者提供客製化的伺服器設定。
以下是我的 user.conf。


<Directory "/Users/<user>/Sites/">
Options Indexes MultiViews ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>
AddHandler cgi-script .cgi .lisp


另外值得一提的是,user.conf 只對 mac 內建的 apache 生效,XAMPP 不吃喔!
如要讓 XAMPP 的 apache 生效,必須改 /Applications/XAMPP/etc/httpd.conf。

一個好的作法是,在 /Applications/XAMPP/etc/httpd.conf 的最後一行加上
Include /etc/apache2/users/user.conf
這樣就能將修改集中於一處了。

2012年6月7日 星期四

交大北大門拉亞推出「下午茶」

不知道大家有沒有發現,交大北大門的拉亞漢堡,這週悄悄推出「下午茶」囉!



下午茶!一到四下午 2:30-5:00
每週星期一到四的下午 2:30-5:00,青春熱情的老闆與老闆娘等著你 / 妳的光臨:)

為了餵飽剛出生的小孩,在老闆夫婦的巧思下,拉亞下午茶於焉誕生囉 XDDDD


由於好像沒什麼人知道,來跟大家介紹一下,希望大家有空可以去捧場 ^^
除了熟悉的潛艇堡、貝果,以及近期推出的厚片土司,最棒的是老闆自製的水果冰沙、果汁牛奶。
木瓜牛奶試賣價 50 元;而冰沙有奇異果冰沙與鳳梨多多冰沙兩種,試賣價 60 元。
筆者今天點的是奇異果冰沙。







用兩顆奇異果打成 500c.c. 的冰沙,上面鋪上奇異果碎丁再淋上焦糖。不加果糖下去打的冰沙並不會太甜,結合奇異果酸、甜與沙沙的感覺,份量連身為男生的筆者都覺得十分足夠。
近拍鋪滿果丁的冰沙


厚片則是一定要推薦的!25 元的厚片土司,有花生、草莓、巧克力、香蒜、椰香五種口味。草莓厚片微甜不膩,其餘則是風味濃郁。
除了用料實在、價格公道,播放輕柔音樂的店面更提供了待一個下午的好去處,誠心推薦給您:)







份量十足的奇異果冰沙與花生厚片


2012年5月16日 星期三

git know-how

(use "git checkout -- <file>..." to discard changes in working directory)

在debug時相當好用,小步前進,若發現剛才修改的地方並無幫助,馬上checkout -- file把剛才未修改的檔案調回來(即捨棄剛才的修改),然後再進行下一次實驗。

這樣就不必擔心在修改的過程中,「把新dug改出來」了。

2012年4月22日 星期日

使用C++0x,clang v.s. g++,以及eclipse。

為了一個#include <array>,踏上開啟C++11神祕門扉的旅程(暈)
我的目的是用CppUTest的同時用到C++0x的功能。

OS: Mac OS X 10.6.8 Snow Leopard
gcc: 4.7
clang: 3.1
eclipse: Helios (for C++)


C++11,或C++0x,的功能可分成兩部分:語言本身和library。

語言特性由編譯器提供,若要用c++0x,在clang必須給參數-std=c++0x。
而g++除了std=c++0x也接受-std=gun++0x。

(網路上有文章說,必須定義前處理器符號__GXX_EXPERIMENTAL_CXX0X__,不過我實驗過g++4.7並不需要這個參數,在終端機或eclipse都是。)

library則不一定。clang需要另外下載libc++自行編譯,並且除了-std=c++0x還要加上-stdlib=libc++。當然,-I...libcxx/lib和-L...libcxx/include的路徑都要明確給出。
g++4.7則在port安裝完成時已經包含library,只要指定-std=c++0x即可,沒有-stdlib選項。
但需要明確指定header位置。以我的機器為例,在/opt/local/include/gcc47/c++。


以下為實驗結果:
clang在終端機卡在這一步:


clang++-mp-3.1 Die.cpp DieTest.cpp RunAllTest.cpp -std=c++0x -stdlib=libc++ -I/Users/mac/learncpp/CppUTest/include -L//Users/mac/learncpp/CppUTest/lib -lCppUTest
Undefined symbols:
  "__ZNKSs5c_strEv", referenced from:
      __Z10StringFromRKSs in libCppUTest.a(SimpleString.o)
ld: symbol(s) not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)

libc++的lib和inlcude路徑都在/usr/lib和/usr/include下設置soft link,應該是找得到。不知為何卡在這一步...

clang在eclipse也卡住,訊息如下:


**** Build of configuration Debug for project Dice ****

**** Internal Builder is used for build               ****
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oRunAllTest.bc ../RunAllTest.cpp
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oDie.bc ../Die.cpp
clang++-mp-3.1 -I/Users/mac/learncpp/CppUTest/include -I/Users/mac/lib/libcxx/include -O0 -emit-llvm -g3 -Wall -c -fmessage-length=0 -std=c++0x -stdlib=libc++ -oDieTest.bc ../DieTest.cpp
llvm-ld -v -L/usr/lib -L/Users/mac/learncpp/CppUTest/lib -native -o Dice RunAllTest.bc DieTest.bc Die.bc -lCppUTest
  Linking bitcode file 'RunAllTest.bc'
  Linked in file 'RunAllTest.bc'
  Linking bitcode file 'DieTest.bc'
  Linked in file 'DieTest.bc'
  Linking bitcode file 'Die.bc'
  Linked in file 'Die.bc'
  Linking archive file '/Users/mac/learncpp/CppUTest/lib/libCppUTest.a'
Generating Bitcode To Dice.bc
Generating Assembly With: 
'/opt/local/libexec/llvm-3.1/bin/llc' '-x86-asm-syntax=att' '-o' 'Dice.s' 'Dice.bc' 
Generating Native Executable With:
'/usr/bin/gcc' '-fno-strict-aliasing' '-O3' '-o' 'Dice' 'Dice.s' '-L/usr/lib' '-L/Users/mac/learncpp/CppUTest/lib' '-lCppUTest' 
Dice.s:32:Unknown pseudo-op: .cfi_startproc
Dice.s:39:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:39:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:45:Unknown pseudo-op: .cfi_endproc
Dice.s:49:Unknown pseudo-op: .cfi_startproc
Dice.s:56:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:56:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:64:Unknown pseudo-op: .cfi_endproc
Dice.s:68:Unknown pseudo-op: .cfi_startproc
Dice.s:75:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:75:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:78:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:78:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:81:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:81:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:83:Unknown pseudo-op: .cfi_offset
Dice.s:83:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:85:Unknown pseudo-op: .cfi_offset
Dice.s:85:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:112:Unknown pseudo-op: .cfi_endproc
Dice.s:116:Unknown pseudo-op: .cfi_startproc
Dice.s:123:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:123:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:131:Unknown pseudo-op: .cfi_endproc
Dice.s:135:Unknown pseudo-op: .cfi_startproc
Dice.s:141:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:141:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:144:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:144:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:147:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:147:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:150:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:150:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:153:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:153:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:155:Unknown pseudo-op: .cfi_offset
Dice.s:155:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:157:Unknown pseudo-op: .cfi_offset
Dice.s:157:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:159:Unknown pseudo-op: .cfi_offset
Dice.s:159:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:161:Unknown pseudo-op: .cfi_offset
Dice.s:161:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:163:Unknown pseudo-op: .cfi_offset
Dice.s:163:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:211:Unknown pseudo-op: .cfi_endproc
Dice.s:215:Unknown pseudo-op: .cfi_startproc
Dice.s:222:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:222:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:230:Unknown pseudo-op: .cfi_endproc
Dice.s:234:Unknown pseudo-op: .cfi_startproc
Dice.s:240:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:240:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:243:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:243:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:246:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:246:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:249:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:249:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:252:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:252:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:255:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:255:Rest of line ignored. 1st junk character valued 53 (5).
Dice.s:258:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:258:Rest of line ignored. 1st junk character valued 57 (9).
Dice.s:260:Unknown pseudo-op: .cfi_offset
Dice.s:260:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:262:Unknown pseudo-op: .cfi_offset
Dice.s:262:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:264:Unknown pseudo-op: .cfi_offset
Dice.s:264:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:266:Unknown pseudo-op: .cfi_offset
Dice.s:266:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:268:Unknown pseudo-op: .cfi_offset
Dice.s:268:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:270:Unknown pseudo-op: .cfi_offset
Dice.s:270:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:362:Unknown pseudo-op: .cfi_endproc
Dice.s:366:Unknown pseudo-op: .cfi_startproc
Dice.s:372:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:372:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:374:Unknown pseudo-op: .cfi_offset
Dice.s:374:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:387:Unknown pseudo-op: .cfi_endproc
Dice.s:391:Unknown pseudo-op: .cfi_startproc
Dice.s:397:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:397:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:399:Unknown pseudo-op: .cfi_offset
Dice.s:399:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:412:Unknown pseudo-op: .cfi_endproc
Dice.s:416:Unknown pseudo-op: .cfi_startproc
Dice.s:422:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:422:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:424:Unknown pseudo-op: .cfi_offset
Dice.s:424:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:437:Unknown pseudo-op: .cfi_endproc
Dice.s:442:Unknown pseudo-op: .cfi_startproc
Dice.s:447:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:447:Rest of line ignored. 1st junk character valued 49 (1).
Dice.s:450:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:450:Rest of line ignored. 1st junk character valued 50 (2).
Dice.s:453:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:453:Rest of line ignored. 1st junk character valued 51 (3).
Dice.s:456:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:456:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:459:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:459:Rest of line ignored. 1st junk character valued 52 (4).
Dice.s:462:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:462:Rest of line ignored. 1st junk character valued 53 (5).
Dice.s:465:Unknown pseudo-op: .cfi_def_cfa_offset
Dice.s:465:Rest of line ignored. 1st junk character valued 54 (6).
Dice.s:467:Unknown pseudo-op: .cfi_offset
Dice.s:467:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:469:Unknown pseudo-op: .cfi_offset
Dice.s:469:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:471:Unknown pseudo-op: .cfi_offset
Dice.s:471:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:473:Unknown pseudo-op: .cfi_offset
Dice.s:473:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:475:Unknown pseudo-op: .cfi_offset
Dice.s:475:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:477:Unknown pseudo-op: .cfi_offset
Dice.s:477:Rest of line ignored. 1st junk character valued 37 (%).
Dice.s:582:Unknown pseudo-op: .cfi_endproc
llvm-ld: 
Build error occurred, build is stopped
Time consumed: 1622  ms.  



總之目前還沒用clang++成功過(攤手)
而g++4.2太舊不支援C++0x,要先用port安裝gcc47。

終端機下OK。
g++-mp-4.7 -std=c++0x Die.cpp DieTest.cpp RunAllTest.cpp -I/Users/mac/learncpp/CppUTest/include -L/Users/mac/learncpp/CppUTest/lib -lCppUTest

eclipse下也OK,不過必須做一些設定:
一、Project->Properties->C/C++ build->Settings->GCC C++ compiler,command那一欄原本填g++,改成g++-mp-4.7。
雖然我已經為g++-mp-4.7設soft link,但對eclipse無效,我猜想eclipse可能是用which {command}來選指令的。總之,在這裡要明確給出哪個版本的g++。
(20120604補充:Project->Properties->C/C++ build->Settings->MacOS X C++ linker 也要改成g++-mp-4.7。今天在把compiler改成4.7後遇到拋出的exception無法catch的怪問題,linker也改用4.7後解決。)
二、Project->Properties->C/C++ build->Settings->GCC C++ compiler->Miscellaneous,Other flags加上-std=c++0x。
三、這步是可選的。Project->Properties->C/C++ build->Settings->GCC C++ compiler->includes,
加入一條/opt/local/include/gcc47/c++。我發現即使不加編譯也會成功,但eclipse在include C++11特有的hearder旁會顯示問號。為了讓eclipse幫我們做更多事,還是加上去吧!


2012年3月29日 星期四

lex處理C註解的兩種方式

方法一:



"/*"  {
        int c1 = 0, c2 = input();
        for (;;) {
            if(c2 == EOF)
                break;
            if(c1 == '*' && c2 == '/') {
                printf("comment:\n %s\n", yytext);
                break;
            }
            c1 = c2;
            c2 = input();
        }
      }



方法二:


%x CMNT

%%

"/*" BEGIN CMNT;
<CMNT>.
<CMNT>\n
<CMNT>"*/"BEGIN INITIAL;

替emacs加入「flex mode」

google一下就會找到emacswiki這個網站。它設計得很好,頁面下方的se also連結通常都有你需要的資訊。

1. 至 http://ftp.sunet.se/pub/gnu/emacs-lisp/incoming/flex-mode.el 下載mode file。
2. 將其放入~/.emacs.d/lisp。(這個資料夾要自己建)
3. 在.emacs中加入

(add-to-list 'load-path "~/.emacs.d/lisp/")
(autoload 'flex-mode "flex-mode.el"
  "Major mode for editing flex documents." t)
(add-to-list 'auto-mode-alist
             '("\\.l\\'" . flex-mode))

第一行指示emacs去該path找檔案;第二行叫emacs在啟動時自動載入該檔案;第三行可有可無,在開啟附檔名.l檔案時自動切換到flex-mode。

reference:
http://www.emacswiki.org/emacs/FlexMode
http://ftp.sunet.se/pub/gnu/emacs-lisp/incoming/flex-mode.el
http://compsci.ca/v3/viewtopic.php?t=15102
http://en.wikipedia.org/wiki/Wikipedia:Wikipedia-mode.el

2012年1月11日 星期三

thread-safe singleton(轉載)

http://www.possibility.com/wiki/index.php?title=SingletonPattern

git tag簡記

記下一個tag 'v1.0'
git tag -a v1.0

看tag
git tag
git show v1.0

把tag push 到github(或任何人)
git push --tags

ref:
http://gitref.org/branching/#tag
http://wptheming.com/2011/04/add-remove-github-tags/

2012年1月5日 星期四

Visual Editor的一個小缺點

new元件時的建構子必須是預設,即沒有參數的建構子。
否則VE會顯示不出來,當然,編譯執行依然一切正常,只是在拉GUI時奇摩子不是很好XD

另外,如果排版亂了,可能是重複setLayout造成的。
通常是,我們自己在被加類別內設定自己喜歡的Layout,但VE會在getXXX裡產生一次setLayout,這時只要把這行註解掉即可。

軟工project筆記,實作ActionListener解法一

1. implements ActionListener
2. 實作(override)actionPerformed
3. 給submit加上addActionListener(this),注意是"this"喔!!


package view.doctor;

import java.awt.GridBagLayout;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;

public class SeePatientFoundamentalDataPanel extends JPanel implements ActionListener {

    private static final long serialVersionUID = 1L;
    private JLabel jLabel = null;
    private JTextField id = null;
    private JButton submit = null;

    @Override
    public void actionPerformed(ActionEvent e) {
        if ((JButton)e.getSource() == submit) {
            JButton jb = (JButton)e.getSource();
            DoctorMainTabbedPane pane = (DoctorMainTabbedPane)jb.getParent().getParent();
            if(pane.parent().loginFrame().patients().get(id.getText()) == null) {
                JOptionPane.showMessageDialog(null, "查無此人喔!");
            } else {
                JOptionPane.showMessageDialog(null, "找到:" + pane.parent().loginFrame().patients().get(id.getText()).name());
            }
        }
    }
    
    /**
     * This is the default constructor
     */
    public SeePatientFoundamentalDataPanel() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        jLabel = new JLabel();
        jLabel.setText("病人ID");
        this.setSize(300, 200);
        this.setLayout(new BorderLayout());
        this.add(jLabel, BorderLayout.WEST);
        this.add(getId(), BorderLayout.CENTER);
        this.add(getSubmit(), BorderLayout.EAST);
    }

    /**
     * This method initializes id   
     *  
     * @return javax.swing.JTextField   
     */
    private JTextField getId() {
        if (id == null) {
            id = new JTextField();
        }
        return id;
    }

    /**
     * This method initializes submit   
     *  
     * @return javax.swing.JButton  
     */
    private JButton getSubmit() {
        if (submit == null) {
            submit = new JButton();
            submit.setText("查詢");
            submit.addActionListener(this);
        }
        return submit;
    }

}

2012年1月2日 星期一

eclipse Visual Editor學習資源

一篇清楚的中文入門教學

安裝搞的我焦頭爛額,筆記成功安裝的要點。
1. 不能online install,請先去這裡,下載最底下的Visual Editor。
2. 下載回ve.tgz,把它解開。
3. 打開eclipse,Help -> Install New Software... -> Add -> Archive... -> ve/downloads/downloads/drops/1.5.0/R201012021328/VE-Update-1.5.0.zip
之後的流程google就有,不贅述囉。

依照官方說明,我用eclipse Helio應該選 ve 1.5版,至於使用其他版本的看倌請自行參照,選擇適合的ve版本囉!


--

另外附上netbean的資料
使用教學
netbean是一套IDE,拉GUI的功能用所生成的code,會到他提供的一系列class。
他提供的Group layout用起來很爽,跟用interface builder滿像,但因為這樣所以綁定IDE了,相容性差。