根據changelog取版號

以前上傳ppa之前,都是手動打指令,其實應該要自動化才對,今天跨出第一步。第一步當然就是取版號,deb的版號是從debian/changelog來的,所以要從這裡著手。

當前的版號只會在第1行,一開始就想到用 head -n 1來取,用 awk 印出第2欄。可是第2欄前後有 () 呢?該怎麼拿掉呢?不會是要用 sed 吧? 去 GNU awk manual 翻閱了一會,發現有 match 函數,可以用 re 來取 group,所以用 match($2, /\((.*)\)/,arr); 就可以去掉 ()。

去掉 () 之後,想到應該可以把 head 省掉,也用 awk 處理。NR 是一個特殊的變數,當處理一筆(行)時,這個值就會累加。把它限定為 1,就表示只處理第1行了。於是就可以湊出這麼一段script。

CHANGE=`awk 'NR==1 {match($2, /\((.*)\)/,arr);printf("gcin_%s_source.changes", arr[1]);}' debian/changelog`
ls -l $CHANGE

distutils bdist_rpm

CentOS 5.6 裡的MySQL-python是1.2.1,在用django的時候,它給我吐出需要MySQL-python-1.2.1p2 以後的版本才行。
囧掉,這樣不就要抓MySQL-python新版來包,好像會很麻煩說。上MySQL-python官網去看,發現維護者很有意思,他在Amazon上的wish list裡都是大力水手的DVD,如果要贊助他的話,不妨幫他買DVD,Amazon會送到他家裡去。離題了,網站上最新的版本是1.2.3,就先抓下來吧。
python的moodule照慣例都有 setup.py,就想說打 python setup.py –help-commands 來看看,結果喜出望外,裏面有 bdist_rpm 的指令,這表示我可以直接打 python setup.py bdist_rpm 就可以建出 rpm 了。
於是馬上就來 build,首先裝上 mysql-devel,然後執行 python setup.py bdist_rpm,看起來很順利,但最後卻發現沒有 MANIFEST 檔案,而導致失敗。看了一下檔案,發現有 MANIFEST.in,再看一下裏面,沒有什麼要替換的字串 (一般來說,副檔名是 .in 的,都會需要用 sed 來替換一些字串),就直接 cp MANIFEST.in MANIFEST 補上,再重新執行 python setup.py bdist_rpm 就大功告成了。rpm 會放在 dist 目錄下,收工。

cpio的pass through

以前沒想過 cpio 的 pass through 可以做什麼,今天要不是有朋友問我,我大概也不會想到這個。是這樣子的,假定有個目錄 a,裏面有很多目錄跟檔案,可是只要複製 a/b/c/file.txt 跟 a/b/file2.txt 到目錄 t 下,可是沒辦法用 cp -r,因為 cp -r 會把整個 a 都複製過去,總不能先複製過去以後再一個一個刪除吧? 本想說這可能要寫 script 來做了,打了 cp,按了 tab,看有沒有什麼可能的指令可用,就看到 cpio,印象中,cpio 可能是可以。

最初的想法是用兩個 cpio 來做,一個建 archive(cpio -o),一個解到指定的目錄(cpio -i),這樣就行了。用 info cpio 一查,發現 cpio -p 應該就可以做了。

所以試了一下,這裡先建立一個 list 檔案,裏面有兩行:a/b/c/file.txt 跟 a/b/file2.txt,a 目錄下有很多目錄跟檔案,並且有 a/b/c/file.txt 跟 a/b/file2.txt。那麼這兩行指令就可以只把list裡指定的兩個檔案複製到 t 目錄下,並且建立必要的目錄:

mkdir -p t
cat list | cpio -p --make-directories t

閒聊Windows7有感

前幾天服務於公家機關的H同學問我關於Windows 7的問題,主要是問軟體不相容以及盜版的問題,他抱怨說,有些軟體在Windows 7上無法使用,有些不能說的秘密的軟體也沒辦法用之前XX的方法來正常使用。我就跟他解釋了,說微軟是很有誠意,早就有緩衝期讓使用者/軟體開發公司能提早轉換到Windows 7,所以不是說一下子就突然要換Windows 7的。然後又跟他說,Windows 7裡好像有個XP相容模式的工具可以繼續讓軟體在XP上執行。邊跟他說明的時候就邊聊,才知道他這樣問(抱怨?)的原因。
H同學服務的單位主要負責測量,所使用的軟體是之前已經離職的同事開發,用來輔助測量工作使用的,也就是說現在沒有人維護了。照理來說,公家機關的人流動率不高才是,但那個已經離職的同事是在業餘的時間自修去做軟體開發,可是卻沒有被適當的升遷,所以就離職,另作打算。至於其他的軟體,像委外開發或是有購買(如AutoCAD)等但沒有簽維護合約的軟體,軟體在Windows 7就有較高的機會遇到問題;那不能說的秘密的軟體多半都是以前可以順利在XP上運行,現在已經不知道更新到哪一版去了的,更不用說了。從這邊可以看出公家機關內部的軟體問題,在一般公司也是會遇到,只是一般公司都會簽訂維護合約以確保軟體可以運作。
電腦大多都是運行XP,經過了這麼多年,總是會舊的,也慢慢被汰換。新的電腦現在都是安裝Windows 7出廠。在第1批安裝Windows 7的電腦來了之後,負責試用的人試用兩天,兩手一攤就說:”我沒辦法適應”,當然辦公室裡的其他人在沒有適當的人教導的情況下,也不是很容易上手,再加上一些軟體都沒辦法用,就一致把Windows 7給隔離了,轉而好好保護執行XP的電腦或者是想把Windows 7降級為XP。電腦的硬體倒是沒什麼問題,有委外進行處理,換了就換,沒什麼好說的。
從閒聊裡,我學到不少:

  • 升級到新的作業系統前,要先試驗單位內的所有軟體都可以正常在新的作業系統上運作,如果不能運作,要儘快尋求協助或更新
  • 單位內若有人有能力去開發、維護一個軟體,那麼這個人就值得留下,不要讓他走了,並且要讓他願意把軟體開源出來
  • 要安排課程與時間讓不熟悉新作業系統的人去熟悉。
  • 不想被軟體公司合約綁住,就要找適當的開放源碼軟體/作業系統來替代。

公家機關在電腦硬體上是可以委外,軟體也是可以,只是我認為應該要取得原始碼,並交給某個特定的單位來維護。這個特定的單位除了維護之外,也可以去開發一些比較偏向專業技術(只有公家機關在用)的系統,這樣應該會比較省錢吧~

django-nonrel之二

另外一個方法是直接參考這篇 4 things to know for NoSQL Django coders的Setting up the environment,裏面有提供一個 zip 連結,下載以後解開,基本上就可以了。這個 zip 提供的 django 是 1.3 beta1。
我遇到的問題是在執行 python manage.py runserver 時所發生的,錯誤訊息說需要 sass,這個工具是一個輔助 css 撰寫的工具,但 10.04 裡所提供的 sass 是 2.x 版的,而 django 裡的 mediagenerator 需要 3.x 的版本。上網找了一下,果然有人遇到,解法是利用 rubygems 來安裝 (Install SASS on Ubuntu 10.04)。
我稍做了一點更動,因為我不想安裝到 user home 裡,所以使用的指令依序是:

  1. sudo apt-get install rubygems1.8 ruby
  2. sudo gem install haml-edge –no-user-install
  3. sudo ln -s /var/lib/gems/1.8/gems/haml-edge-3.1.79/bin/sass /usr/local/bin/sass
  4. sudo ln -s /var/lib/gems/1.8/gems/haml-edge-3.1.79/bin/sass-convert /usr/local/bin/sass-convert

後2個步驟是作 symbolic link,讓 sass 指令能在 PATH 裡找到。最後是預設網頁的問題,這個就請參考 django tutorial 去修改 urls.py 並在 templates 目錄補上預設網頁就可以了。
有點混亂,我試著參考這個 zip 檔案去設定上一篇所開的專案,但 mediagenerator 就是跑不起來。另外就是試著用 tutorial 的 poll 例子去加 admin,可是卻吐 backend 不支援 max 這個方法,研判應該是 admin module內部處理問題。

django-nonrel

Google AppEngine(之後簡稱GAE)原本就有把django包進去,只是資料庫的使用上,需要自己處理,原本只支援relational database。後來就有人去補這一塊,名字就改稱django-nonrel。GAE官方的文件介紹django時,就直接介紹了這個project:Running Pure Django Projects on Google App Engine
django-nonrel 的官方網頁在:Django-nonrel – NoSQL support for Django,坦白說,從官方網頁我沒找到很清楚的Installation說明,後來才在這一篇Native Django on App Engine裡看到。一般django建立網站的方法是使用django-admin.py startproject your_project來建立,接著再進入專案目錄,使用python manage.py 去做管理。但django-norel建立網站的方法稍微不一樣,是直接checkout一份空的專案骨架來用,而不是使用django-admin.py來建立。步驟如下:

  1. 使用mercurial(hg)去clone以下源碼,我統一都clone到~/hg 下:
    • hg clone https://bitbucket.org/wkornewald/djangoappengine
    • hg clone https://bitbucket.org/wkornewald/django-nonrel
    • hg clone https://bitbucket.org/wkornewald/django-testapp
    • hg clone https://bitbucket.org/wkornewald/djangotoolbox
    • hg clone https://bitbucket.org/wkornewald/django-dbindexer
    • hg clone https://bitbucket.org/twanschik/django-autoload
    • hg clone https://bitbucket.org/wkornewald/django-mediagenerator

    ,依序說明:djangoappengine、django-nonrel、djangotoolbox主要是針對GAE作補完,django-testapp是專案的骨架,dbindexer是實作資料庫處理的底層,autoload負責自動載入library,django-mediagenerator則是可以對css/js做壓縮、加速的library,可有可無。

  2. 複製django-testapp並更名,假設為mysite
  3. 進入mysite目錄下,然後去做symbolic link:
    • ln -s ~/hg/django-nonrel/django
    • ln -s ~/hg/djangoappengine
    • ln -s ~/hg/djangotoolbox/djangotoolbox
    • ln -s ~/hg/django-nonrel/django
    • ln -s ~/hg/django-dbindexer/dbindexer
    • ln -s ~/hg/django-autoload/autoload/
    • ln -s ~/hg/django-mediagenerator/mediagenerator
  4. 大功告成,輸入python manage.py runserver 就可以啟動web server,試著瀏覽 http://localhost:8000 看看吧。如果你想要改用別的 port,跟原來的django不太一樣的,你需要用 python manage.py runserver 0.0.0.0:10080 才可以,原來的 django 可以用 python manage.py runserver 10080 就搞定。

會想試試這個,主要還是因為GAEO後來的開發整個停掉,想說之後也想玩玩django,就乾脆用django-nonrel,以後也對django比較容易上手。

石頭

昨天晚上S來我家檢查濾水器並送濾心過來給我,他是老何介紹給我的,幫我裝的濾水器已經用3年了,那時候大公子還不到一歲的樣子,時間真的很快。
檢查完濾出來的水並確認沒有問題以後,他給我看一顆黑色的小石頭,叫我洗一洗,洗完放到裝了開水的杯子裡。
S:”我們來做一個實驗喔~你手機在旁邊嗎?”
我:”手機在旁邊”
S接著用手機打了通電話到我的手機,旋即掛斷。
S:”好~你單腳站好,兩手往左右伸直,和身體呈90度。”
我照做了,左腳縮了起來,用右腳站。
S:”我要按你的左手臂囉~準備好了嗎?”
我:”好了”
S輕輕一按,我就不平衡,身體往左傾,我趕緊把左腳放下站好。
S:”好,你喝剛剛的水,喝完再用剛剛的姿勢站好。”
我喝完水,站好以後,說:”好了”
這次S按的比剛剛用力,可是我卻沒有像剛剛那麼的不平衡。
很玄…
S:”剛剛打手機的時候,手機的電磁波破壞了你的場,所以你會不平衡。這顆石頭泡過的水可以讓你恢復你的場,你喝完以後就不會不平衡了。”
我心裡暗想,鬼扯,這怎麼可能!
S:”我們再試一次,可以嗎?”
可惡,這次實驗結果居然一樣,接了手機就會不平衡,喝完水,就不會。
S:”這公司新產品,濾水器裡有這石頭,以後有機會,你再參考這產品看看。另外這小石頭就送給你吧~你可以放在杯子、水壺或熱水瓶裡,但要小心不要喝到肚子裡去囉~”
跟他道別、送他出門之後,我在想這石頭真有這麼神奇嗎?
隔天,就今天早上騎車的時候,我就在研究要怎麼驗證這個實驗的真實性。首先要排除人類心理因素,如果知道有這麼一顆石頭,就很難不受到它的影響,另外也要避免讓實驗者知道他正在做實驗,這很重要。根據組織行為課本裡介紹的一個實驗(好像是霍桑做的?),當工廠工人知道他們在做實驗,就因為覺得自己受到重視,而表現的較好。然後,我想應該也要排除掉手機,要想辦法讓實驗者不知道手機的存在,請他等一下,在這個等一下的過程裡去打電話,等完之後,再讓他做那姿勢,並用手壓他的手臂。壓完之後,請他喝水(杯子裡不能有石頭,也不能讓他知道水哪裡來的),再讓他做那姿勢,再壓一次。嗯~這樣應該就可以實驗出那顆石頭是否真的有功效了。
我個人是覺得這跟那顆石頭或手機一點關係都沒有,等之後有空來試試看。

GAE應用程式在哪裡執行

判斷Google Appengine應用程式是在GAE服務上或是本地端,可以這樣用:

from google.appengine.api import conf
app_version, current_config_version, development = conf._inspect_environment()
if development:
print("development")
else:
print("production")