2013年10月8日 星期二

地心引力Gravity(有電)

要我用一句話評這部電影,我會說:「這是一部比較接近太空的太空電影」

以太空為題材的電影很多:經典像是連歐巴馬都會弄混的Star Trek和Star Wars;加上怪生物的異形(啊…我內心一點也不把它們當太空電影);算上動畫的Gundam好了;比較真實一點像這部地心引力,2001太空漫遊、Apollo 13,還有一部一堆老頭子修衛星的電影,我忘了叫什麼名字了。

--

像Star Trek 和Star Wars這類的電影,是在拍太空中的地球故事,它們是靠太空的無垠,來發揮無限的想像力,地球上都是異性戀那外星人可不可以是同性戀,啊不對,能不能有犯錯就絕對死刑的民族?少了感情的種族會怎麼樣?如果我們可以隨意修改時間線?機器和肉體合成的集合體?具有無上神力的神族變成人類?
太空有無限的可能性、有無限的故事可以講。 至於真的太空長什麼樣子,其實不是很重要,它在拍地球的故事。

這裡我不想講異形,我除了它太空來的跟瀕臨絕種外一無概念。
至於Gundam雖然有太空、星艦也是無重力,但和真實的太空還是相去甚遠,巨大的鋼彈想動就動,完全無視真實的太空狀況;星艦的無重力胡搞一通,不真不假。

首先拍出真實太空的當屬2001太空漫遊,也成了很多太空片致敬的對象,例如飛到外太空的時候瞬間變成靜音的效果,在新版的Star Trek裡用了不少。

說完這麼多太空片,說回我們的主題Gravity?
這部片跟之前很多評論說的一樣,這完全不是大眾片:
你期待有什麼高潮?沒有=_=
俊男美女?沒有=_=,每個人都包在厚厚的太空衣下,女主角也不正
整片很安靜、很平靜,靜到令人不安……。

正如開頭字幕所說:太空沒有聲音介質、沒有空氣,沒有重力和地面,我們覺得行動很簡單,那是因為我們有地面和重力;這也是為什麼上面會說鋼彈都是亂搞,很多地方主角們移動莫名的自由,想動就動,想停就停,這個無重力只是效果,例如男主角可以飛撲到女主角身上接吻,不是內容。

這片講的是真正的太空,從上而下,你可以看見夜間尼羅河沿岸的燈火、中美洲細長的陸地、北極舞動的極光,宛在夢中。

但當女主角和太空梭脫離,只能無助的飄盪,分不清上下左右,止不住旋轉;就算想抓住國際太空站時停下自己也十分困難。
絕望的無助。
男主角(喬治克隆尼)為了不讓兩人一起飄走,切斷兩人間的連繫索,在太空中這無異自殺,就看見男主角愈飄愈遠、愈飄愈遠…然後不知何時通訊中斷。
孤寂的死亡。
在國際太空站上,當女主角試圖分離降落艙,破片群正在一塊塊擊碎國際太空站。先是一小塊破片飛過,破片漸多,有的打中太陽能電池板,然後大破片擊中主艙,炸出更多破片,化成一堆破片群;一個太空站就這樣無聲的消滅了。
無聲的破滅。
全片充滿著肅殺的氣息,靜到讓你透不過氣。

太空的美麗故然讓人屏息,太空的危險讓人敬畏。 想要體會一下,可以看看這部片,我自評是7分,贏在前所未見的創新;輸在過短、有些單線化的劇情。
但就先前有些負電的評論,我還是要說:如果你進電影院是要享受聲光效果、享受大場面的話,請不要進電影院,這部不對你的胃口。

2013年9月24日 星期二

寫了一個管理帳號的script

差不多去年這個時候,小弟魯蛇剛接任所上的linux工作站網路管理員。
本來以為是個輕鬆的職位,畢竟先代某陳姓大網管超~級~強~,工作站維護得這麼好,佈線設備也都沒什麼問題,我們應該也只要做點基本維護就好,結果工作其實還頗多(OAO)。
要幫所上的人申請新帳號;幾台伺服器還裝著mandriva 2009,久未更新,很多套件可能都過期了,需要用主流的CentOS或Debian來取代;有的工作站連yum都沒有,只能抓rpm,那時候試著要裝yum,結果遇到瘋狂的相依關係,最後只好放棄;最後還有工作用的軟體跟license server需要維護。

最近為了減輕一些工作,就寫了一個自動加入帳號的script,理論上用bash script應該就做得到,不過考量到其中有許多文字處理,數字比對的部分,最後還是用python的譔寫,雖然說nis主機也是debian 5的老主機,必須用python2.5來譔寫有一點troll,不過還是比用shell快一點。

ps:其實linux工作站使用人數比較少,理論上用vim手動加搞不好比較快,不過當作python練習XDD。

一、帳號記錄文件:

伺服器使用的帳號記錄是nis,內容跟/etc/passwd沒什麼兩樣,類似這樣: account:passwd:uid:gid:comment:homedirectory:shell
這沒什麼好講的,大部分的內容都是預設,比較不一樣的是我們uid, gid設定:為了管理方便,我們的gid是以1k為單位分給一位教授,對應可使用的1000個uid,例如某葉教授(咦)的gid為10000,那uid就從10000-10999,下一位教授就從gid, uid為11000開始。
註:這樣每個教授可以收1000位學生,就算每學期收個20個,也要收50年才行,應該頗夠用吧XD

二、程式規劃:

規畫程式的功能如下。
功能一,加入使用者:
1. 詢問使用者帳號名稱(account)
2. 列出目前可用的gid列表,要求管理者選擇。
3. 查詢目前表列的uid,取得下一個uid值。
4. 請管理者輸入comment。
5. 列出homedirectory資料夾選項。
6. 詢問使用者密碼。
功能二,刪除使用者:
這個比較簡單,把account comment掉就是了。
第二部分,實際操作:
1. 備份檔案,複製一份檔案,儲存為原檔名.日期。
2. 將要加入的內容寫入passwd檔中。
3. 呼叫ypinit -m更新資料庫。
4. 呼叫ypasswd修改密碼檔,這部分用pexpect達成。
5. 產生一份需要建立新資料夾的資料夾位置,到nfs使用。

三、實作:

上述功能看來有點多,其實寫起來滿快的,幾個小時吧。主要是python功能過於OP,大部分慢下來的地方都是我腦殘忘記該怎麼寫,或是為了使用python 2.5以致需要去查語法。
程式大部分是使用python 的list來硬幹,儲存需要寫入的字串,將需要增加的或刪除的資料新增到list之中。

大概沒什麼好講的,唯一值得一提的就是發現python 整合了expect的功能:pexpect,原本呼叫yppasswd的部分想要用expect來寫,但發現用pexpect比較方便,也可以把改密碼的工作交給python去執行,比分出一個expect script還要方便。
跟上一篇的expect講的差不多,pexpect同樣支援spawn, expect, send等基本語法
例如程式中需要設定新加入使用者的密碼:
for key,val in passwddict.iteritems():
    print("change passwd of user %s" % key)
    rootpass = “rootpassword”
    child = pexpect.spawn("yppasswd %s" % key)
    child.expect('password:')
    child.sendline(rootpass)
    child.expect('password:')
    child.sendline(val)
    child.expect('password:')
    child.sendline(val)
    child.expect(pexpect.EOF, timeout=None)
從存好的dictionary裡面取出一對帳號跟密碼,然後去設定passwd,同樣的缺點也是root密碼會曝光,權限要小心設。

PS:剛剛發現暑假過太頹廢,從八月中到現在都沒寫新文,看到同學們都在當助教惹,自己也要努力點才行。

2013年9月20日 星期五

使用Expect進行大量修改密碼

Expect 最近稍微研究了一下expect這個工具,簡單來說,它可以作為使用者對shell的代言人,本來需要大量使用者回應的工作,可以交由expect來處理,主要的資料是參考資料2,瀏覽書還是吸收技術最快的方法。
最簡單的工作,就是由expect來幫我們輸入密碼,例如我們要改帳號,都需要輸入舊密碼和兩次新密碼,如果有1000個帳號要修改時,等於要輸入3000次密碼,如果兩次新密碼打錯的話還會吃屎重來,真是讓人感到絕望…。
再更簡單一點就是管工作站時,要向其他電腦下命令,如果有10台電腦要執行一樣的命令,而且要用su執行?
結果書上還出現用expect來控制gdb的除錯程序,好像有一點猛…

--

expect最基本的指令大概是: spawn, expect, send,有了這三個就能做不少事情惹。 例如我想從工作站上載東西下來:
#!/usr/bin/expect

set password “mypassword”

spawn scp account@workstation:/etc/hosts . 
match_max 1000
expect "*?assword: "
send "$password\r"
expect eof 
首先我們設定password變數,利用spawn叫shell執行scp指令,當scp要求輸入密碼時,由expect承接,scp輸出內容是account@workstation 's password: ,用*整個接下來;用send把內容傳給shell,就完成一個自動下載檔案的程式了。
唯一要注意的大概只有那個\r回車鍵,沒打那個就相當於打完password後沒按enter,你會看到程式停在螢幕上對你微笑,等你按enter。

上面只是個簡單的例子,回應很單純,不過稍微擴展一下,我們就可以完成一個自動改nis密碼的script
#!/usr/bin/expect

set rootpwd "wwww"
set newpwd [lindex $argv 1]

spawn yppasswd [lindex $argv 0]
expect "*?root password:"
send "$rootpwd\r"
expect "*?new password:"
send "$newpwd\r"
expect "*?new password:"
send "$newpwd\r"
expect eof

使用./script account newpasswd,即可自動修改密碼,只要事先把account跟newpasswd打好,一瞬間密碼就改完了,有幾千人都不用怕。雖一的缺點大概是要把root password明文寫在script裡面,這個script一定要保護好,用root擁有然後權限設成700吧。

參考資料:
1. expect man page
2. http://it-ebooks.info/book/2189/

2013年8月8日 星期四

使用gnu make編譯Qt 專案

最近白天跑EM,夜深寫QT。

當然這完全沒什麼,其他同學至少兩年前就寫過了LOL。

只能說Qt 真是相當強大的工具,最基本的signal & slot的概念,如果對GTK的callback熟悉的話,很快就能上手。
一般在寫Qt時,最常用的還是用qmake來產生Makefile,畢竟qmake寫得還不賴,打一次就會產生好Makefile,接著make即可;不過有時個人習慣還是偏好用gnu-make,可以自己編寫Makefile,做一些細部的調整,用qmake的話只要重新產生一次Makefile,這些細部調整就要重新再修改一次。
這篇就是說明一下,要如何使用gnu-make來處理Qt專案。

--

基本上Qt的運作原理,是對原有的C++進行擴展,然後透過Qt提供的解析程式,產生額外的原始碼檔,少了這些額外的原始碼,在編譯的時候會產生一堆可怕的錯誤資訊,要用gnu-make編譯Qt專案,其實只要呼叫這些解析程式來產生原始碼即可;總共會用到的程式有三個:moc, rcc, uic;分別作用是:產生meta object(故名Meta-Object Compiler)、處理resource(resource compiler)檔、產生介面檔(User Interface Compiler)。

一般Makefile裡面會有這些東西,用來把所有的source轉換成object file。
SOURCE_FILE = main.cpp 
OBJECT_FILE += $(addsuffix .o, $(basename $(SOURCE_FILE)))

為了Qt,我們加上下列的變數定義:
#==================================================
# Qt special function
#==================================================
QT_LIBS = -lQtCore -lQtGui -lQtOpenGL
QT_PATH = /usr/lib/qt4/bin
QT_MOCFILE = mainwindow.h
QT_RCCFILE = resource.qrc
QT_UICFILE = first.ui
QT_MOCSOURCE = $(addprefix moc_, $(addsuffix .cpp, $(basename $(QT_MOCFILE))))
QT_RCCSOURCE = $(addprefix qrc_, $(addsuffix .cpp, $(basename $(QT_RCCFILE))))
QT_UICSOURCE = $(addprefix ui_, $(addsuffix .h, $(basename $(QT_UICFILE))))

這一整個區塊與QT有關,所有參數都加上QT為標示。
QT_PATH設定Qt的執行檔位置,如果安裝在其他地方、或要用其他版本就要自己換地方。
QT_*FILE是先定義,moc, rcc, uic分別要處理的檔案,moc會處理所有.h檔,產生含meta object的cpp檔;rcc會處理qrc file,產生相對應的cpp檔;uic則會處理ui,產生可包入的header file。
透過makefile的suffix, prefix,轉成我們需要轉出的檔案名稱,個人的習慣是在這些檔名前加上關鍵字moc_, qrc_, ui_。

--

接著是利用implicit rules來compile所有的物件檔:
TARGET = program
BIN_DIR = bin
LIBRARY_DIR = library
SOURCE_FILE = main.cpp $(QT_MOCSOURCE) $(QT_RCCSOURCE)
OBJECT_FILE += $(addsuffix .o, $(basename $(SOURCE_FILE)))

由於moc和rcc會產生新的cpp檔,因此需要將它們列入;然後就可以用implicit rules執行:

%.o:%.c
  $(CC) -c lt; -o $@ $(CFLAGS) $(INCLUDE)
  @$(MOVE) $@ $(LIBRARY_DIR)

%.o:%.cpp
  $(CXX) -c lt; -o $@ $(CXXFLAGS) $(INCLUDE)
  @$(MOVE) $@ $(LIBRARY_DIR)

moc_%.cpp: %.h 
  $(QT_PATH)moc $(DEFINES) $(INCLUDE) lt; -o $@

qrc_%.cpp: %.qrc
  $(QT_PATH)rcc lt; -o $@

ui_%.h: %.ui
  $(QT_PATH)uic lt; -o $@
前兩項是將c/cpp-編成 .o檔,當遇到QT_MOCSOURCE, QT_RCCSOURCE的檔案,就會由moc, rcc產生。
另外在編譯主程式的相依性中,原本我們只要它編譯所有的OBJECT_FILE,現在還要加上由uic產生的header file:
$(TARGET): $(OBJECT_FILE) $(QT_UICSOURCE)
  cd $(LIBRARY_DIR); \
  $(LINKER) -o $@ $(OBJECT_FILE) $(LIBS); \
  cd ..
  mv $(LIBRARY_DIR)/$@ $(BIN_DIR)
如此一來,就會觸發uic產生出header file。

--

透過以上的設定,即可完成Qt專案的編譯,不過最後還是要說,雖然我這裡是這麼寫,但其實真的用的時候還是用qmake來產生Makefile =w=,套句AZ大神的話「它寫得這麼好幹嘛不用?你白痴嗎。」

結論:這篇網誌是一篇垃圾,寫Qt請愛用qmake。 lol

參考資料:
1. C++ GUI Programming with Qt 4
2. http://woboq.com/blog/how-qt-signals-slots-work.html

2013年8月1日 星期四

你會拒絕政府的好意嗎?

最近許多事情佔據了新聞版面:國軍虐死案、大埔拆屋案,然後是一些媒體刻意掩蓋的台北違法抓人事件,這些都是政府在迫害人民的案例。

--

這其中大埔拆屋案是最有趣的。
儘管劉政鴻牠拆了一堆人的房子,儘管苗栗債務激增,人均負債升到全國第二;關於他只是要炒地補縣庫的證據如此明確,可是他的支持度還是這麼高,甚至天下雜詩民調的滿意度還有68.9%,遠見雜誌的首長大評比,他還是五顆星的縣長。

這是不是怪怪的?
事實上看看遠見雜誌所寫的內文,政鴻縣長的政績,很多都是用錢堆出來的,也導致苗栗縣債台高築。
引用內文:「2008年11月,首次舉辦大型藝文活動,就邀來世界三大男高音卡列拉斯獻唱,免費讓民眾參加音樂饗宴;12月4日至6日三場愛爾蘭《大河之舞》讓民眾目不暇給。2009年3月更加碼舉辦苗栗國際音樂節,邀請情歌王子布萊恩麥肯奈特、鋼琴玩家邁可森與世界三大男高音多明哥演出。」

請到三大男高音而且是免費的活動,這樣要花掉多少錢?(按:我查到是0.021G)還要加上行銷之類的預算,例如在遠見雜誌的廣告,之類。
還別說每年年底的一定要有的跨年晚會跟煙火,你去晚會有付過錢嗎?請歌手的錢是誰出的?

好聽的這叫「執政優勢」,其實就是買票。
我們總認為選舉買票要走到你門前,把裝著錢的信封送你,然後說投某某垃圾;但政府的好意不來這套,它是更隱晦的買票型式,他用活動讓你覺得:這個政府真好,這位首長有在做事,下次也投他吧。明著買票大家會拒絕、會厭惡;暗行的買票,大家會很高興的收下來,連拒絕都不會;最重要的,你會覺得買票者是真有能力,你真的被買了。

那政府的錢從哪來?靠著舉債而來,靠著拆人民的房子炒地皮而來;大家享受免費藝文活動時,就要有人被迫家破人亡;政府宣稱活動產生了多少商機,看清楚,那是政府吸乾一些人的血,用那些血寫出來的。
但…這很弔詭,為了更有效的管理社會,我們創造了政府這個架構,政府不可能不做事,否則就不需要政府了;但政府又不能過度的做事,那樣的好意已經成了壞事;該如何在適當的政策與過度的好意的無限近似漸層上,劃出一條一刀兩斷的界線?我沒有答案。


2014巴西舉辦world cup,人民在網路上呼籲:「非巴西人們,別來world cup」;下一次,當各縣市政府舉辦跨年晚會、發射跨年煙火,將那一小部分被害人民的財產燒盡,化做天上那一瞬的閃光時,你會說:「別去」嗎?

--

參考資料:
  1. 北美智權報:縣市誰先破產?
    http://www.naipo.com/Portals/1/web_tw/Knowledge_Center/Editorial/publish-33.htm
  2. 遠見雜誌:5星滿意度苗栗縣長 劉政鴻:
    http://www.gvm.com.tw/Boardcontent_16177.html
  3. 維基:天下雜誌滿意度調查:
    http://zh.wikipedia.org/wiki/%E5%A4%A9%E4%B8%8B%E9%9B%9C%E8%AA%8C%E7%B8%A3%E5%B8%82%E9%95%B7%E6%96%BD%E6%94%BF%E6%BB%BF%E6%84%8F%E5%BA%A6%E8%AA%BF%E6%9F%A5
  4. Protest against world cup:
    http://metro.co.uk/2013/06/16/brazilians-protest-against-staging-of-dangerous-world-cup-3843409/