Taiga Installation Troubleshootings
Installation assumptions :
- On Ubuntu 16.04.1 LTS
- Followed : http://taigaio.github.io/taiga-doc/dist/setup-development.html
- It's a little different form setup-production.html ...
- Using taiga-back @ github, cloned 2017-01-14, taiga-front @ github, cloned 2017-01-16
Back-end Issue :
- django.db.utils.OperationalError: FATAL: Peer authentication failed for user "taiga"
- check your settings/local.py for password configuration of user "taiga"
- If that doesn't work
- check your /etc/postgresql/9.x/main/pg_hba.conf
- revise the line "local all taiga peer" from space-based separation to tab-based separation
- service postgresql restart
Front-end Issue :
- No such file or directory -- /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake when installing scss-lint
- find your rake command (using whereis command maybe)
- in my case the rake command is found in /usr/bin/rake
- create directory /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/
- soft-link /usr/share/rubygems-integration/all/gems/rake-10.5.0/bin/rake to /usr/bin/rake
- re-install scss-lint as instruction
下午1:46 | 標籤: Django, linux, python, Taiga | 0 Comments
Django Background Tasks Installation & Migration
* 注意以下是使用延續開發的 Django-Background-Tasks 而不是舊版的 Django-Background-Task
Installation 按照 Django-Background-Tasks GitHub 上的說明就沒問題, 但是要注意的是說明中沒有提到 DB Migration 的步驟, 可能這是常識了 ?
如果沒做 DB Migration 的話, 直接嘗試寫 example code 執行會出現類似以下的錯誤訊息:
"django.db.utils.OperationalError: no such table: background_task"
也就是 DB 中找不到 background_task table
這時候回頭去做 makemigrations 會發現...
還是出現了 "django.db.utils.OperationalError: no such table: background_task" !!!
這個原因與 stackoverflow 上可以查到的 不相同, 該例子是使用 makemigrations background_task 指定要變動的 package 就可以解決.
真正的原因出在 example code 撰寫中可能牽涉到的調用 background_task table 的部分. 在我的例子中, 是 example code 在 views.py 中加入了 import MyApp.routine_tasks ( routine_tasks.py 是我用來放預計要背景執行的工作 ), 而 routine_tasks.py 中又有 from background_task import background , 所以就出現問題了~
結論: 進行 makemigration 要在加入了相關 code 之前進行
1. Install & set settings.py
2. do makemigrations & migrate before add any example code
3. add example code
上午10:31 | 標籤: Django, python | 0 Comments
Python Default Encoding Error 一次性解決方案 ( utf8 或其他 )
利用 Python 處理不同文字資料時, 特別是中文, 十之八九會遇到 encoding 的問題. 就會看到 CLI 出現討厭的 ...... ascii codec can't encode character blahblah ......
在 Python 3+ 中應該比較不會發生, 但 Python 2.7 還是經常會...
一個做法是在發生問題的 module 一開始加入:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
除了這個做法之外, 也可以利用 site-packages 一次性解決這個問題.
參考 https://www.v2ex.com/t/90659
只是把預設編碼改為 utf8
在 Python27\Lib\site-packages 中加入一個 set_utf8_encoding.py ( 檔名隨意瞜 ), 內容是:
import sys
sys.setdefaultencoding('utf8')
然後重新開啟你的 Python 執行環境 ( 例如 CLI, 就重開他 ), 讓 site-packages 被重新載入就 ok ~~
一次性作法的處理比較好應對安裝 packages 時遇到這個問題, 例如安裝 Django 1.10.4 到 Python 2.7 的中文環境好像就會出現 encoding error ... 這時這樣解決就容易多了
下午3:57 | 標籤: python | 0 Comments
Graph Cut Image Segmentation with A Center ( Star Shape Prior )
在找某種 Tool 的過程中發現這個有趣的工具: Segmentation Graph Cut
它事實上是這篇 Paper 內容的實作:
Olga Veksler, "Star Shape Prior for Graph-Cut Image Segmentation," European Conference on Computer Vision, pp.454-467, 2008
雖然 Google Code 頁面上沒有明寫, 不過猜 Project Owner 就是作者本人. 因為 Tool 裡面包含的 Samples 跟 Paper 內容的範例圖都一樣, 同時如果你從 SVN 上 Check-out, 而不是只抓 Binary 的話, 會發現 Repository 裡面還有兩篇相關的 Paper PDF, 如果不是自己有版權, 應該不至於敢直接放到 Repository 裡面吧.
Anyway, 這篇 Paper 跟這個 Tool 的重點很單純, 就是要把所謂的 Star Shape 加到利用 Graph Cut 作 Image Segmentation 的方法中. 至於所謂的 Star Shape, 採用 Paper 中的定義:
A star shape is defined with respect to a center point c. An object has a star shape if for any point p inside the object, all points on the straight line between the center c and p also lie inside the object.
如果用圖來舉例解釋的話, 大概是像下面的 (a) 不管怎樣裡面的任一點都可以做為 Center C, (b) 只有部分的點可以做為 Center C, 因為有些點無法讓 P 的條件符合, (c) 不管哪裡都不存在 Center C 可以讓 P 的條件符合.

其中 (a) (b) 的情況都符合 Star Shape 的定義.
工具的 Binary Release 本身需要 Visual Studio 2008 的一些 Libraries, 我在 Windows 7 沒法安裝, 直接從 SVN 抓下來 SRC, 裡面有 C++ Code ( 尚不清楚實際用途 ) 跟作為 GUI 的 Python Code. 直接利用 GUI.py 執行極可.
請注意會需要 wxPython 跟 Psyco, 沒有的話會要安裝才能繼續執行.
工具目的單純所以容易操作. 載入圖片後利用滑鼠在圖片上指定 C 跟 P. 左鍵 Click 兩下會出現藍色點是 C, 一下的話會出現黃色點是 P.

我本來以為會以 P 作為切割邊線的決定條件的, 但看來不是這樣, 像上圖那樣標記, 最後還是會抓到整朵花 (右下的紅框是結果, 是我額外貼上去的, 工具本身是會呼叫你的看圖程式去開結果圖). 但是如果舉個極端一點的例子, 像是這樣:

基本上還是會割到 Boundary 為止, 我猜跟裡面用到的 Graph Cut 演算法有關. 不過我的 Image Processing 只有到基本的傅立葉程度 = = , 這個就沒法猜了.
當然 Title 寫 With A Center 是有理由的...
在一般的情況下, 只要標記上 C, 不用 P 也是可以抓到, 像是這樣:

而且運算時間算是蠻快的, 扣掉開啟看圖程式的時間, 可以直接把結果接到工具畫面輸出的話, 應該是幾乎到無感的程度吧.
很有趣, 改天有空再來從 Python GUI 研究看看是不是可以直接使用裡面的 Kernel Function, 接到別的程式上.
晚上9:10 | 標籤: image processing, python, Software Tool | 0 Comments
How Matplotlib and NetworkX Work Together : A Case Study on Figure Instances
最初是因為以下的 Code 讓我對這個問題有興趣. 這段簡單的程式碼 Matplotlib 以及 NetworkX 來合作畫圖. 其中 NetworkX 負責 Graph Model 的建立, 而 Matplotlib 則負責 Figure 繪圖的部份.
最後繪出的圖, 如同程式碼所指定的位置, 畫出三個圓點.
而我覺得程式碼有趣的地方在於, 細看程式碼, matplotlib.pyplot 只有在 line 6, 以及 line 20 被使用, 期間 line 9 到 line 18 都是 networkx 的運作.
而, 在此 Script 中, networkx 跟 matplotlib.pyplot 表面上是沒有任何互動的, 沒有任何 Message Passing 或是 Object Communication 出現. 如果單單依照此 Script 中的 Program Logic 作 Program Slicing, 或許就會被乾脆地切成兩個 Program Slices 了.
不過想當然爾, 既然最後可以順利地畫出圖來, 這兩部份的程式碼肯定在背後有進行某種 Communication, 否則不可能在 networkx 中建好 Graph Model, 在 matplotlib.pyplot 中就知道要畫出甚麼樣的 Figure.
經過漫長的 Code Tracing, 大致上可以把 Dependency Graph 整理如下圖 :
其中比較關鍵的是 Matplotlib 在 Figure Management 上, 允許同時間有數個 Figure Instances 存在, 而目前要畫在哪個 Figure Instance 上, 則視乎目前哪個 Figure 被設定為 Activated.
在 plt.figure() 中 ( 事實上為 matplotlib.pyplot.figure() ), 可以透過參數 num ( 可參考 Online Document, 即 Figure Instance Identity ) 指定要 activate 那一個 Figure Instance, 如果 Instance 不存在, 則會產生一個新的 Instance.
而在綠色的流程中 ( 即程式碼 line 9 到 line 18 ), networkx 在 nx.draw_networkx_nodes 進行中會透過 matplotlib.pylab.gca 取得目前為 Activated 的 Figure Instance 其 ax object ( 座標軸物件 ), 之後透過 ax 把要畫出來的 nodes 加進去.
最後 plt.show() 透過 matplotlib.backend_gtk 把圖畫出來.
這 Matplotlib 中的 Figure Instance 取用機制大體上是為什麼原本的 Code Script 中, 在乍看之下 networkx 跟 matplotlib.pyplot 沒有 Communication, 但是還是可以把圖畫出來的主要原因.
晚上11:17 | 標籤: open source, python, Software Tool, visualization | 0 Comments
Operating NS3 with Python
最近可能會要很奇怪地使用 NS2 來作一些 Simulation, 雖然還不是很確定需不需要使用, 最近趁空未雨綢繆一下.
但, 說真的 NS2 雖然大量地被 Network Research 人員使用, 也有很多已高度開發的模組, 但是一來我需要的使用方式其實不是模擬傳統的 Network, 二來不熟悉的大量程式碼真是看不下去. 所以其實我早早就把目標鎖定在 NS3.
NS3 的基本中文介紹在 morechr 的 blog 很早就寫了, 不過一年半來中文的資料也沒增加多少, 想來 NS2 就足夠現在的研究人員使用了吧, 況且 NS3 的重點擺在完全地利用 Script 來操控, 許多需要利用到 Pointer 的模組應該短時間內也很難轉移. NS3 架構概圖 ( 取自 NS3 Official Site ) :
但是對我來說, NS3 看起來似乎比 NS2 易用多了. 主要的操作介面已經提供 Python Binding, 也有實驗性的 PyViz 模組. 光是安裝時一個 $> python build.py 就感覺很爽快 : p
在 Tutorial 上, 我覺得 NS3 官方的 Tutorials 跟 Overview 投影片都很難讓我這初次接觸的人看懂, 倒是 G. Carneiro 的這份投影片(PDF 檔案) 我覺得做的不錯, 搭配 NS3 的 example/tutorial/first.py 程式碼, 一下子就可以了解個大概.
PyViz 模組最近的 ChangeLog 看的不是很明白, 照 changeset 5973 的訊息, 應該是已經 merge 到 NS 3.7.1 了才是. 但是實際下載 NS 3.7.1 看起來是沒有包含 PyViz 的, 所以或許他的意思是在 http://code.nsnam.org/gjc/ns-3.7-pyviz/ 底下 merge 了 NS 3.7.1 , 一番嘗試最後還是使用 Mercurial 複製了一份 http://code.nsnam.org/gjc/ns-3.7-pyviz/ 下來. ( 請跟 ns-allinone 分開 )
在 PyViz 的網站說明中, 提到要再跟最新的 NS3 作 merge 的動作. 不過因為 clone 下來的 ns-3.7-pyviz 已經被開發人員進行過 merge 了, 就不需要再做一次.
使用 PyViz 還需要額外安裝許多模組, 除了基本的 Graphviz 之外, 還有 PyViz 頁面中提到的 pygraphviz, kiwi ... 等等. Ubuntu 的使用者安裝似乎比較方便, 可憐的 Mandriva 使用者 ( 而且還是 MDV 2008 = = ) 就直接乖乖自己安裝吧.
其中
- pygraphviz 可以利用 easy_install 從 pypi 安裝,
- python-kiwi 直接從 Package Manager 找出來裝 ( 不要直接找 Kiwi 來裝, 不一樣的東西 <= 犯錯的笨蛋 ), python-kiwi / Kiwi framework 是連接 GTK+ 的套件
- PyGoocanvas 也沒辦法從 pypi 安裝, 但是手動安裝要補充的套件太多, 相當麻煩, 最後我選擇從 MDV Package Manager 裝比較舊版本 0.9.0 的套件 ( 目前最新為 0.14 ), 反正這是 GTK+ 跟 GooCanvas 的 Binding Package, 從 Package Manager 裝可能還比較安全
- python-gnome2 也是從 Package Manager 裝, 但是在 MDV 裡面似乎是叫做 gnome-python 套件
- python-gnomedesktop 我猜測是等同於 MDV 裡的 gnome-python-desktop 套件
- python-rsvg 在 MDV 底下真的找不到東西裝了, 猜測是裝在 pycairo 裡, 這之前透過 Package Manager 裝過了
- 最後記得到 pybindgen 抓取 1.14.0 版本 ( ns-3.7-pyviz 需求 ), 解壓縮到 ns-3.7-pyviz 底下
接著在 ns-3.7-pyviz 底下執行 :
$> ./waf configure --with-pybindgen=./pybindgen-1.14.0
$> ./waf --pyrun examples/flowmon/wifi-olsr-flowmon.py
首次執行因為要重新 build 整個 ns-3.7-pyviz 所以要跑一段時間. 最後還是出現幾個小問題,
- 缺少 libgraphviz.so.4 , 因為我的 MDV 2008 裡面只有裝 libgraphviz3 , 所以又更新了 libgraphviz4 .
- 找不到 gnomedesktop module, 此模組不知道為什麼被藏在 gnome-python-applet 套件裡, 同樣從 Package Manager 裝上
再重新跑一次:
$> ./waf --pyrun examples/flowmon/wifi-olsr-flowmon.py
這樣一番折騰 ( 所謂的 Dependency Hell 阿 ) 終於把 PyViz 跑起來了.

左下角有一個 Advanced 延伸調整選單可以展開, 右下角有 Snapshot, Shell, 以及 Simulate 命令. Snaphot 可以擷取目前截圖存成 PDF 檔案, Shell 可以開啟動態 Manipulation Command Line, 在 PyViz 的說明中有提到. Simulate 就是開始進行 Simulation 的命令.
以下是進行中的畫面, 懶得錄下來放到 Youtube, 截圖就好 XD

可以調整 Zoom 以及速度, 方便檢視 Simulation 可能出錯的地方.

初步的嘗試大概到此為止, 花了不少時間跟功夫, 不過至少有成功執行. 通常這樣的嘗試超過一半的機會最後是不了了之的 : p
晚上8:00 | 標籤: python, simulation, Software Tool | 0 Comments
" Python First " Programming Learning
就在 Java 成為 C/C++ 之外主流 Programming 課程使用語言沒幾年後, 對於 Java 適用性的討論也逐漸開始, 主要以興起的 Scripting Languages 為挑戰對象, 其中又以 Python [1][2] 以及 Ruby [3][4] 為多.
大部分的 Papers 是以 Languages 的特性去論述改為使用 Scripting Languages 的優點, 以及目前使用 Java 對於學生太過複雜等. 不過通常這些特性與實際學習上的影響之間, 有甚麼樣的連結很難說清楚, 而透過問卷對於學生的調查, 通常又受限於問題內容的表達方式, 使得調查結果是否能反應特定的問題有所疑慮.
相較之下我就喜歡 [1] 的說明方式, 利用範例程式碼本身的資訊來比較. 例如一個簡單的 Java Hello World 程式碼其實就暗藏了相當多的 Programming Concepts ( 以下所有圖片取用自 [1] ),
相對來說 Python 的程式碼就比較不具有學生不容易在短時間內理解的資訊 ( 可惜 Paper 沒有直接用一模一樣的程式碼來比 ),
這是很具體的比較, 就我之前當 T.A. 的教學經驗, 其實學生最困擾問題之一是, 在沒有面對任何 Programming Languages 經驗的情況下, 一下子就要弄清楚一段程式碼文字, 裡面一堆不認識的詞彙. 想像如果我們在學英文時是被要求直接看一段英文段落來學, 即便已經知道單字了, 也會是很痛苦吧.
另外在 [1] 中, 也利用一小段落說明 Java 比較適合作為 Second Programming Language to Learning. 基本上我同意這樣的意見, 但是目前似乎在 Python 到 Java, 或是 Ruby 到 Java 之間, 沒有為 Novice Programmer 去探討在 Syntax 以及 Semantics 之間的銜接, 以降低兩個階段之間轉移的 Learning Curve, 同時讓 Student 知道學習不同的 Programming Languages 之間, 可被轉移 (Transferable) 的學習經驗.
References
[1] A. Radenski, " Python First : A Lab-Based Digital Introduction to Computer Science," Proceedings of the 11th Annual SIGCSE Cconference on Innovation and Technology in Computer Science Education, pp.197-201, 2006
[2] Linda Grandell, Mia Peltomäki, Ralph-Johan Back and Tapio Salakoski, "Why Complicate Things?: Introducing Programming in High School using Python," Proceedings of the 8th Australian Conference on Computing Education, pp.71-80, 2006
[3] Robert J. Sheehan, "Teaching Operating Systems with Ruby," Proceedings of the 12th Annual SIGCSE Conference on Innovation and Technology in Computer Science Education, pp.38-42, 2007
[4] A. Ortiz, "Language Design and Implementation using Ruby and the Interpreter Pattern," Proceedings of the 39th SIGCSE Technical Symposium on Computer Science Education, pp.48-52, 2008
上午10:31 | 標籤: paper review, programming learning, python | 0 Comments
Python : os.chmod 的 mode 之 const variable 意義
今天在改 Project 內一部分程式碼的 Bug, 看到 Team Member 用了 os.chmod 來改系統檔案的權限. 之前沒用過, 因此 mode 的部份怎樣調整就查了一下 API Document. 沒想到 Document 裡也只有 mode 的選項列表, 沒解說 = =
查了一下才發現解讀法, 整理如下 :
S_IRGRP S_IROTH S_IRUSR
S_IWGRP S_IWOTH S_IWUSR
S_IXGRP S_IXOTH S_IXUSR
S_IEXEC = S_IXUSR
S_IWRITE = S_IWUSR
S_IREAD = S_IRUSR
S_IRWXG = S_IRGRP | S_IWGRP | S_IXGRP
S_IRWXO = S_IROTH | S_IWOTH | S_IXOTH
S_IRWXU = S_IRUSR | S_IWUSR | S_IXUSR
解讀方式如同上述的顏色標示, R = read, W = write, X = execution ; 而 GRP = group, OTH = other, USR = user, 對照到 Unix 系統的權限設定其實就很清楚了. 而後面的更為複雜的標示, 就是前面基本標示的混合而已.
晚上8:45 | 標籤: python | 0 Comments
Fast Python list exclusion, intersection and union
剛剛跟學長討論到怎樣快速的作 Python list 的 intersection 以及 union. 當然直接用雙層 for-loop 的作法是很直覺, 但是相對來說就會需要 M x N 的 performance cost, 希望在利用 Python 本身語法跟資料結構的特性下, 可以有更容易的作法.
我是想到了用 dictionary 的 key 來紀錄的作法, 同時間也找到這個 mailing list 紀錄也說明了類似的作法, 就從他的範例稍作修改成為以下這樣 :
基本上就是利用 dictionary 的 key 不會重複的特性省掉一些麻煩. 不過嚴格來說這樣也可能還是 M x N 就是了.
上午10:28 | 標籤: python | 1 Comments
為 wxPython 的 Panel 加上背景圖
昨天因為 final project 的 demo 需要, 臨時用 wxPython 建構一個 scenario-oriented demo interface. 不過我之前沒有正式用過 wxPython, 手忙腳亂的找了 wxPython 的一些 examples 來看. 幸好基本概念跟 Java Swing 其實很像, 加上 Python 容易試誤的 scripting language 特性, 相當容易就完成一個簡易的 demo 介面.
在下面的 demo 介面中, 主要是由一張 context diagram, 搭配 scenario 的訊息輸出來作 demo.
Context diagram 是一張 jpeg 圖檔, 利用 wx.StaticBitmap 放在 wx.Panel 上, 然後再把幾個 wx.TextCtrl 放上去, 程式碼大概是像這樣 :
這樣作在 Linux 上跑是沒有問題, 可以順利地出現上面的 demo 畫面, 但是在 Windows 上跑就會變成 image 蓋住所有 wx.TextCtrl 的情況. 看來wxPython 在不同的 platform 上應該會有不一樣的呈現結果.
但是因為 demo 的平台為 Windows, 合作夥伴的 OS 也是 Windows, 還是得想辦法解決此問題, 在 Google 上找了一陣, 在這個 blog 看到一個作法, 稍加修改如下 :
這個作法是 extend 了 wx.Panel, 製造出一個可以顯示 background 的 BackgroundPanel. 然後在 Image 的顯示方面, 並非在 Panel 加了一個 Image 的 object, 而是利用 wx.BufferedDC 以及 PAINT Event, 再利用 wx.BufferedPaintDC 以繪圖的方式在 BackgroundPanel 的畫布上把 image 呈現出來, 避免了 Image object 可能會蓋過 wx.TextCtrl object 的可能性.
不過話說回來, 為什麼在 wxPython 內似乎沒辦法用 Z order 的方式控制元件的上下關係呢, 我記得同樣的概念從 Visual Basic 就有了, 如果有的話會方便許多阿.
晚上7:53 | 標籤: python | 0 Comments
Singleton Pattern Implementation in Python
就在剛剛, 因為需要把某個 object (implemented in Python) 利用 Singleton Pattern 整理成為較正確的 design, 因此驚覺我不知道怎樣在 Python 中完成 Singleton Pattern ^^b
稍微試寫了一下都不太正確, 只好上 Google 找救兵, 結果找到幾個 solutions, 各有差異, 同時也有討論空間的, 就此紀錄一下. 以下的 1. 跟 3. 的名稱是我自己取的, 2. 則是提出者原本就賦予的名稱.
1. Singleton Manager
此種作法是以額外的一個 Singleton Manager 來管理該是 single instance 的 class instances, 在 ASPN 上有一個 example. 這種做法的結果是不同的 client code 會使用不同的 singleton manager object, 但是所有動作是利用 Delegation Pattern 由 Singleton Manager 傳給 class instance.
2. Borg Pattern
Borg Pattern (取名自 StarWar ?) 則是允許該是 single instance 的 class 可以有許多 instances, 但是各個 instances 共享一份 data. 換句話說, 可以看成是利用多個具有相同 behavior 的 object, 但是各個 object 的 state 一致來達成. 在 ASPN 上也可以找到一個 Borg Pattern 的 example.
嚴格來說 Borg Pattern 跟原本 Singleton Pattern 是有點不一樣, 雖然可以說 singleton 的目的是達成了, 但是以 Object-Orientation 的觀點來說, 在 Borg Pattern 內的 objects 彼此之間的 encapsulation 被破壞了, 同時 object identity 也不一致.
3. Inherited Singleton
由於上面的 Singleton Manager 做法在程式碼上來說我覺得不太直覺, 為什麼不能直接把目標 class 變成 singleton class, 而要透過一層 Singleton Manager 的介入 ? 而 Borg Pattern 的缺點上面也說了. 因此繼續往下找, 結果找到一個是 Inherited Singleton 這個 solution. 這是在 Python In A NutShell 書本裡的 example (初版, chapter 5.2.3.2) , 原始來源我就不知道了.
一個簡單的範例如下 :
如此一來所有繼承 Singleton 的 class 就自動會是 singleton class, 在 __new__ 不被 override 的情況下, 只會有一個 instance.
這樣的做法其實等同於把 1. 的 Singleton Manager 給 "embed" 到 Target class 裡面, 而看起來我們可以直接使用 Target class 作為 singleton class.
我最後當然是選擇 3. 啦, 感覺上比較容易維護.
下午4:06 | 標籤: python, software design | 0 Comments
Computer Language Benchmarking by Implementation
在 The Computer Language Benchmarks Game ( http://shootout.alioth.debian.org/ ) 網站上提供了由大約 18 個 benchmarks, 由對於大約 34 種 programming languages 的 implementation 作 benchmarking 的結果. 並提供方便的統計或比較觀點查看結果. 他們的計畫網頁可以在 Alioth GForge 找到 : Shootout@Alioth-GForge
例如 Java 6 -server 對 Python 的比較結果 : ( 這兩者在 CPU Time 跟 Memory Usage 上的差異還真是明顯 )或是可以對於不同的 benchmarks 給予不同的 weights, 進而調整 benchmarking 的結果.
不過當然, 這些 benchmarking 只能反應這些 programming languages 之間比較的小部份面向而已, 就軟體工程的角度而言, 選擇 programming languages 時要考慮的 factors 比這裡所能呈現的多太多了.
但是從這點出發, 是否未來有一天, 我們也可以靠著在這樣的網頁上, 選取跟目前進行中的 project 相關的 benchmarks, 以及要衡量的 factors, 就決定要利用哪種 programming language 進行開發呢 ? 例如上面的 benchmark 中, 包含了許多基本的 data structure 以及 algorithms 作為 benchmarks, 如果這些 benchmarks 可以組合起來, 提供更為 high-level 的 evaluation benchmark, 同時加上不同的 programming languages 在 architectural components 上得 benchmarks, 那麼我們可能就可以找到更多在軟體工程中可以被利用的 benchmarks, 進而更容易決定 programming languages 的選擇.
上午10:54 | 標籤: idea, java, python, software measurement | 2 Comments
Mobile Python : Python and S60 on N95
最近在寫 Embedded Middleware Design 課程的 final project, 有一部分 client 的程式要在 Mobile Devices 上運作, 直接拿實驗室有的 Nokia N95 來嘗試. 如果可以的話當然希望可以用 Python 開發, 嘗試上比較快. 整理一些找到的資源在這篇中.
Nokia N95 應該算是對於開發環境支援度蠻高的智慧型手機吧 (沒辦法, 實驗室沒有 OpenMoko), 至少他有 Python 的支援.
Nokia N95 程式開發相關特徵 :
- Symbian 作業系統 S60 V3.1
- 支援 A2DP 藍芽、紅外線、WiFi、UPnP 連接
- 內建 GPS 模組
另外 Nokia 也提供 Nokia S60 SDK, 包含在 Symbian S60 上開發程式用的相關函式庫以及模擬器, 但是模擬器僅支援 C++, 對於 Java 需要額外的 J2ME SDK 安裝, 同時模擬器對於 Python for S60 目前並無支援.
Python for S60 是一個由 Nokia 主導, 以 Open Source 形式發展的計畫, 目的在於 Symbian S60 上提供 Python 的執行環境. 在一些 packages 上, 特別是 UI 部分, Python for S60 有自己的實作, 並無法採用一般環境下的 Python packages.
其他相關的網路資源略為整理如下 :
- PyS60 SDK
- To install PyS60 SDK, you will need Py2exe
- Look carefully, there is also a well-written SDK API document for download
- To get PyS60 to work, the S60 3rd Edition SDK for Symbian OS for C++ is pre-required
- To install PyS60 3rd Ed SDK for C++, you need Perl at least version 5.6.1
- PyS60 Code Snippets
- You can learn some skills and get some examples from here
- Nokia Open Source Wiki
- Ensymble
- Some people believe that Ensymble is a better choice than using Py2SIS alone
- Ensymble can support Py2SIS by using command :
- $ python ensymble.py ps2sis target-file.py
- Book : Mobile Python (真想買)
- Mobile Python official site
- 網頁內有一些 example codes, 沒錢買書應該也可以抓下來試試看.
不過我的嘗試以失敗告終, 因為不知道為什麼, 使用 Python for S60 撰寫的程式在 N95 實機執行時居然無論輸出的是中文還是英文都會變成方塊字, 左試右試也解決不了, 鑑於時間壓力下只好在 prototyping 時先採用 J2ME 進行開發, Python 就只好看看之後是不是能克服這個技術問題了.
晚上8:08 | 標籤: Embedded System, python | 0 Comments
Python-based Parser Generator & ANTLR Python
前一陣子有需要利用 Parser Generator 產生 Python-based Parser,
用來 parsing Java source, 因此就做了一點 survey.
不過出乎意料的, 找不到幾個好用的工具, 大致上 Python Parser SIG [1]
裡列出的都嘗試過了, 有些雖然可以用, 但是沒有人寫好 Java grammer,
要自己寫實在有點麻煩. 有些則是看起來不錯, 也有 Java grammer, 但是卻
無法成功使用, 例如 PyBison [2].
附帶一提如果有人想嘗試 PyBison 的話, 記得裝 PyBison 時要先裝 :
sudo apt-get install python-dev
sudo apt-get install build-essential
最後我是採用有名的 ANTLR [3], 它的 Python Interface 雖然還在發展中,
但是勉強是可以用了, 小 bug 自己改一下就好.
我使用的流程如下, 提供參考(以 MS 環境為例) :
1. 首先到官方網站下載 ANTLR 3, URL : http://www.antlr.org/
2. 解壓縮到特定資料夾, 例如 C:\antlr-3.0\
3. 設定 CLASSPATH, 讓 C:\antlr-3.0\lib\ 底下的所有 .jar 檔案都在
CLASSPATH 設定內, 可以參考這裡的說明進行 :
http://www.antlr.org/wiki/pages/viewpage.action?pageId=728
4. 到 C:\antlr-3.0\runtime\Python 底下進行 python runtime 安裝, 請參考 :
http://www.antlr.org/wiki/display/ANTLR3/Python+runtime
5. 到 ANTLR 網站上下載 Java grammer file :
http://www.antlr.org/grammar/list
嘗試產生 Python-based Java parser, 請參考 :
http://www.antlr.org/wiki/display/ANTLR3/Antlr3PythonTarget
6. 上述網頁上的 Java 1.5 grammer files 有很多個, 如果是使用 Terence Parr
的 grammer file (我是用這個), 則需要對於產生出來的 JavaLexer.py 以及
JavaParser.py 作一點修改. 此修改為在按照上面網頁執行 parsing 的過程中,
會出現語法上的錯誤, 請把錯誤的部分, 從 Java 語法改為 Python 語法即可.
如果有需要對產生的 Parser 作修改的話, 可以參考 ANTLR Python API Doc. :
http://www.antlr.org/api/Python/index.html
References
[1] Python Parser SIG, URL : http://wiki.python.org/moin/LanguageParsing
[2] PyBison, URL : http://wiki.python.org/moin/PyBison
[3] ANTLR Python, URL : http://www.antlr.org/
下午2:35 | 標籤: code generation, open source, python, Software Tool | 1 Comments
PyDev
PyDev 是一個可以用來做 Python 以及 Jython programming 的 Eclipse-based Plugin. 之前有試用過(還不到 1.0 版的時候), 當時還很陽春, 但已經算是好用了. 昨天猛然發現已經到 1.2.9 版了, 而且在 1.2.8 版就加入了 code-completion, auto-edit, 以及 refactoring 的功能. 對於我來說這三個都還蠻重要的, 可以很有效地加速開發. 不過我很好奇他的 code-completion 是怎做到的, 畢竟 Python 不同於 Java, 要在 programming 時很快地推論出 type 似乎不是很容易的事情. 可能是在做 programming 時, PyDev 在背後不斷地進行 interpretation, 保留 code information 吧, 之前稍微嘗試寫過 Eclipse Plugin, 大概知道怎樣做到.
試了一下, build-in string 的 code-completion :撰寫新的 class 時也會自動補上 self argument :
自己撰寫的 class 也馬上就會在 code-completion 的支援裡了 :
上面是我稍微試了的結果, 其它更多能力可以參考 PyDev 的 ScreenShot, 以及 Release Log
中午12:53 | 標籤: IDE, python | 0 Comments