閒聊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")

電影流水帳(2011/4/27~2011/5/25)

整整一個月就這樣過去了…

  • Love and other drugs(IMDB, Wikipedia),中譯:愛情藥不藥。這部片蠻感人的,雖然有點芭樂。Jamie出生於醫學世家,可是卻跑去當了藥廠的業務員,賣起藥來。賣藥的過程裡,遇見了Maggie,一見鍾情,也在床上一見如故,就像是遇見100%的女孩,並過了依段快樂的時光~可是,Maggie有帕金森氏症,他們因為這個而爭吵甚至分開,分開一陣子以後,Jamie發現他不能沒有Maggie,就趕緊去告白,然後復合。這部片子裡有不少裸露畫面,但很自然,Hathaway在這部片子裡看起來超有魅力的說~
  • Hero(IMDB, Wikipedia)。上英文課時,老師讓我們看的,是一部批判媒體的片子,除了劇情不錯以外,飾演主角的演員也都是一時之選,相當好看。Bernie是一個自私自利的人,他離婚了,而且被法律訴訟給困住。某天下著雨的晚上,他正要帶兒子去看電影的路上,還沒接到兒子,就遇到飛機失事。飛機快要爆炸了,他幫忙打開機艙,機艙裡的乘客紛紛逃出,裏面有個小孩要求他幫忙救出他的父親,他看到這個小孩,動了惻隱之心,就進去救了好多人,之後就離去。救人的過程裡,他順手牽了女記者的皮包。當然,就跟他兒子爽約了,他想要跟他兒子解釋,可是被他前妻給轟了出去。女記者找到爆點,就趕緊大肆報導,想找到這個救人的人,後來有個流浪漢出來冒認了,想不到卻以假亂真。這個流浪漢心裡很掙扎,他想說只是出來冒充,卻一夕成名,媒體報導成這樣,想下台也很難下台。後來就想自殺,此時女記者已經找到Bernie,他以為Bernie是那個轉手流浪漢皮包然後威脅流浪漢的人,就帶去,結果Bernie卻跟要跳樓的流浪漢聊開了,並達成協議,讓流浪漢繼續行善,Bernie拿錢。女記者之後也認出了Bernie就是救她的人,之後也沒有再重新報導,就這樣各取所需,算是一個快樂的結局。
  • 127 hours(IMDB, Wikipedia),中譯:127小時。這部片是一個獨自去爬山健行的人的故事,出發前都沒跟任何人講,結果途中失足,被石頭壓到手,獨自在荒郊野外過了127小時,後來自己把手給弄斷才脫困的故事。故事很簡單,看完以後覺得手真的是超痛的啊!!怎麼會有人能把自己手弄斷而不昏倒的,超厲害的。

pixnetalbummaker(3)

承蒙jnlingslin二位pixnet開發者的幫忙,現在連後端都不用刻了,只要搞定前台的javascript就可以去PIXNET album撈圖。就用jQuery.getScript()與PIXNET API 吐jsonp就可以達成。
然後也參考這篇Asynchronous Image Loading with jQuery,為圖片加上了動態載入的效果。目前比較傷腦筋的問題就排版問題,發生的情況有以下幾個:一個是當圖寬高值過大時,一個是當圖片數目過多時。這再想辦法好了。
之後可能會來看OAuth吧,看可不可以自動去 PIXNET blog 、blogger、facebook 貼文,就不用手動複製然後貼上了。
對了,網址是http://pixnetalbummaker.appspot.com

jsonp

前兩年有使用過,可是最近想起來時,卻發現什麼記憶都不剩,只記得好像是解決 cross domain 的方案。上網找了一下,終於讓我給想起來了,下面用我懂的話來寫,這樣下次又忘記時,可以很快想起來。
在利用 xmlhttp(或form) post/get 時,目標的網址(action)跟目前網頁的網址必須是在同一個網域上,否則會無法post/get。該怎麼解決呢?就要利用所謂的 jsonp。jsonp 是利用動態安插 script tag 的方式來繞過 cross domain 的限制,script tag 裡的 src 不受 cross domain 的限制,一般來說,src 裡的網址會多加一個參數 callback (當然,不一定要叫作callback),也就是說,後端收到這個 request 時,會去進行處理(一般會處理為json資料),最後輸出時,會輸出 javascript ,並且將 json 資料傳入你指定的 callback並執行,這樣就完成了。
本來以為 PIXNET API 可以直接利用 jsonp,就不需要另外刻後台來拉資料,結果今天去看時,發現沒有,大概是之前眼花了吧…

pixnetalbummaker(2)

GAEO 0.5 beta用的不順,再加上開發已經停止,所以還是用回文件相對比較多的0.3版。

之前從trunkly-python抄來的代碼不太適用於PIXNET API,所以稍做了改動,原本是這樣使用的:

print( pixnet.get_users_elleryq() )
print( pixnet.get_album_sets( {'user': 'elleryq' }) )

現在得這樣用:

print( pixnet.get_users( "elleryq", {} ) )
print( pixnet.get_album_sets( parameters={'user': 'elleryq' }) )

是說,應該要好好來研究一下cross domain的xmlhttp,這樣根本就不用寫後台了,直接呼叫PIXNET API就好~

歡樂智多星的機率隨想

歡樂智多星是胡瓜在衛視中文台主持的節目,遊戲的規則是,參加的人有30萬,每關有3個選擇,然後可以選擇全部押在一個答案上,或是分散,只要過了五關,剩下的錢就你的。
先不考慮最低的押注是1萬的這個規則。最早的規則是可以把錢分散在3個答案上,所以這樣子的機率是 (1/3) ^ 5 = 1/243,最近看的時候,發現節目修改規則了,變成你只能把錢分散在兩個答案上,看起來過關機率降低了,但是實際上,只要排除掉不可能的那個答案,然後平均分散押注在另外兩個答案的話,這樣子機率是 (1/2) ^ 5 = 1/32,反而提高了!!
現在在加上最低押注是一萬的規則。如果把錢分散在3個答案上,押注金額較多的又剛好過關,那麼,

  1. 10萬:10萬:10萬
  2. 4萬:3萬:3萬
  3. 2萬:1萬:1萬
  4. 孤注一擲
  5. 孤注一擲

同樣的情況,但只能把錢分散在兩個答案上,這邊再加上一個都會過關的假定:

  1. 15萬:15萬:0
  2. 8萬:7萬:0
  3. 4萬:4萬:0
  4. 2萬:2萬:0
  5. 1萬:1萬:0

從上面的分析看來,參賽者不再一定需要知道正確答案,也就是你可以什麼都不知道,在此情況時,嚴格執行排除最不可能的答案,並且把錢平均分散在其他兩個答案上,這樣最後至少可以得到一萬元。相較之前的規則,在第四次以後就只能孤注一擲的情況來說,節目的新規則把勝率提高許多。