星期三, 2月 28, 2007

[link] William McVey的Pycon 2007筆記與OLPC

圖片請點此

http://wamber.net/static/PyCon-2007/export-with-imagemap/PyCon2007.html

http://wamber.net/static/PyCon-2007/

William McVey用FreeMind製作了pycon2007的筆記,
除了筆記製作的非常精緻之外,
我也注意到One Laptop Per Child這場talk又被打了兩顆星星,
網路上也不少有參與pycon的 blogger也大都對這場OLPC talk讚譽有加.

Python原本就是適合兒童學習使用, 能開闊心智的程式語言跟開發環境,
而這次OLPC計畫選擇了Python,
全面採用Python開發GUI圖形介面(called sugar)跟檔案系統(a version-controled "object store "called "Yellow"),
而在鍵盤上有一個瀏覽程式碼的按鍵可以方便有興趣的兒童瀏覽及修改.
讓開放原始碼的精神徹底的被實現(使用者這次真的可以輕易的獲得原始碼修改並即時調整系統)
的確是可以被稱作一項了不起,
可以改變世界教育方式跟傳達開放原始碼精神的計畫.
也難怪國外的Pythoner會對這場talk如此讚賞了.

OLPC百元電腦預計於今年將會出貨,
OLPC的軟體將會是100%自由軟體,從BIOS,作業系統跟應用軟體全部都是,
主要會先供貨至開發中國家,
相信對Python知名度及普及度的提高將有大大的幫助.

(我也好想買一台: 三千多塊台幣內含linux,browser,mplayer跟Python的筆記型電腦...
你說你想不想買...)


有關OLPC在這次Pycon的熱烈情況及更詳細的內容可以看這篇: http://www.freesoftwaremagazine.com/blogs/olpc_kicks_off_pycon_2007/
另外Wikipedia也有OLPC的簡要說明

星期一, 2月 26, 2007

POT眾整合版的The Zen of Python "Python之道" 好讚啊!!!

果然有個Wiki是好東西, 
可以很方便的融合大家對"Python之禪"的理解.
如果有Python玩家還沒"禪定"的就趕快去POT報到吧!

這句句都是至理名言的The Zen of Python
翻成中文的感覺還是很酷啊~~ ^_^

http://wiki.python.org.tw/The_Zen_Of_Python

The Zen of Python "Python之道" 整合版

美優於醜,

顯明好過隱晦。

簡為上,繁複次之。

晦澀為下。

平順善於巢雜。

寧散不為短巧,

村婦可讀。

特例並不值得我們打破原則。

雖然,理想終究不敵現實。

不靜靜的放過任何錯誤,

除非你是故意的。

隱者,晦者。不臆,不筮。

事情要有一種明顯的作法,最好也只有一種,

雖然不是荷蘭人的你,一開始可能看不出來。

現在開始,強過不作,

雖然有時候不處理比*馬上*處理更好。

不易解釋的實作方式,就不是好方式。

容易解釋的實作方法,說不定是好方式。

命名空間是個頂呱呱的點子 -- 儘量用!

ps: 如果分成古文版跟白話文版 分開來翻譯那就更好了,
古文典雅容易記誦,白話淺顯容易理解,
看看有沒有高手能編個RAP出來還能當饒舌歌唱那就更酷了 :P

ps2: Thinker解釋了Sparse is better than dense, Readability counts. 寧散不為短巧,村婦可讀 的Python精神.

今年七月 Python3.0a1 發表 ?!

http://mail.python.org/pipermail/python-dev/2007-February/071375.html

看來這次似乎是認真的, 準備一口氣把GvR感覺不pythonic的東西全拿掉了.

這次語法淨化一次到位果然是大手筆:
照py3k的規劃, print 改成function,
map(),reduce(),filter()全移了.
xrange() raw_input() apply()也不見了.
operator / 不再是c的整數除法 改成浮點數運算了,
classic class消失了...
blahblah還有很多請自行參考http://www.python.org/dev/peps/pep-3100/

似乎由於不向後相容的關係, 這次會發表python2升3語法的工具,
不過還是沒想到今年的年中就會發表第一個alpha版,
之前GvR不是還在抱怨py3k沒人理嗎? =.=

明年就會有3.0final.... 這實在來的太快了 =)
話說這不少linux distribution都還停在python2.4啊...
總而言之, 這語法改變的適應期也還不算太短, 就慢慢來吧.

星期五, 2月 23, 2007

[快訊] PotWiki : 台灣官方Python維基上線 !

http://wiki.python.org.tw/Pot

[本blog訊] 台灣官方Python維基於農曆新年期間上線,全台人民歡欣鼓舞,共同迎接Python台灣官方維基的到來。激情滿懷的Pot User四處奔走相告,PyTUG眾無不信心滿滿,幹勁倍增。

展望未來,Potwiki是推動全台Python跨越目前發展的重大民心工程、發展工程、希望工程。而深入閱讀Potwiki的內容,總能喚起一股青春的力量,一種創造的激情,一段永不停止的追求。

新的一年,讓人充滿了對Python@TW的憧憬和期待。
妳也喜歡Python嗎? 現在就加入Pot的行列吧!

[記者小正太提姆 於 光明會幼幼台激昂報導]

[link] YUI now has Free Hosting.

http://developer.yahoo.com/yui/articles/hosting/

YUI最近除了把版本跳了兩號之外, 又作出大動作: Free Hosting For YUI users.

YUI內含javascript/CSS/圖片, 現在免去下載直接可以使用確實省了一番功夫.

jQuery原本也是這麼做, 不過據說一陣子下來流量驚人.

所以後來就不建議人直接內嵌.

jQuery不過20K就流量驚人. 何況是更"碩大"的YUI.

不過 Yahoo! 果然是財大氣粗. 連widget的圖片都幫忙hosting了.

看來是有流量限制的網站的首選js library. YAHOO! 幫妳節省了頻寬. :P

Anyway, Nice Job!

看來過一陣子可以試試看直接在blogger用YUI了.

(無責任發言: 怎麼不快把jack簽下來這樣可以順便hosting一下ext :P)

星期二, 2月 20, 2007

[link] [screencast] 整合Django與PHP

http://showmedo.com/videos/video?name=pythonNapleonePyConTech2&fromSeriesID=54

ShowMeDo上放了有關這次PyCon2007網站架設的講題影片,
看了之後才發現原來PyCon2007的網站是由php的wiki跟django"合力"製作完成的. :)

這個影片示範了這次PyCon2007如何透過Django的Custom Template Loader
整合PHP的wiki pmwiki (恰好是Kalug的Wiki Engine :) )進入Django,

講者還示範了整合他老婆的Wordpress Blog進入Django的過程.

very cool!

星期一, 2月 19, 2007

[link] PyPy 0.99.0 released !

http://codespeak.net/pypy/dist/pypy/doc/news.html

光看這個版本號就非常令人興奮. 沒想到1.0指日可待了 :)

PyPy一直是我非常關注的專案,
作者群裡面包含了Psyco的作者跟不少很有經驗的開發者,
加上有金主奧援, 可以看作是Scripting Language的指標專案之一.

專案的目標主要是用python來撰寫Python Interpreter,
PyPy的實作相對於其他如Cpython/Jython/Ironpython的好處是:

1. 讓Interpreter核心程式碼更容易懂:
使用Python而非傳統使用C或C++或java或C#

2.更容易移植
PyPy基本上顛覆了傳統撰寫Interpreter的方式,
PyPy並不是對特定平台而寫,而是寫出來之後低階與機器相關的部份透過"language specification"來翻譯.
所以實際上Interpreter的核心不論在哪個平台其實程式碼都是一樣的.
只有低階的部分由rpython撰寫並透過不同的翻譯器翻譯成目標平台的語言.

目前的svn code裡面的平台翻譯器有C/Java/.net/Common Lisp/Java script/squeak(small talk)/llvm. (翻成Javascript倒是挺有趣的, 這裡還示範了怎麼用pypy在django裡作ajax =.= 不過這麼前衛然後再加一層的技術目前我是不敢真的用在專案上的 除非pypy1.0之後有很多人採用 不然暫時我還是喜歡乖乖的寫我的javascript :P 不過有興趣而且不喜歡javascript的人倒是可以看這篇Developing web applications with PyPy)

3.更容易加入JIT compiler
官方宣稱透過"language specification"的方式可以作到傳統Interpreter作不到的事情,
例如替Interpreter加入JIT compiler,讓Interpreter也能達到接近native language的速度.
不過0.99版由於JIT尚未整合進Pypy核心, 所以還未放入,
所以實在是不知道未來PyPy到底能多快. (我對這個一向是抱持著看到才相信的態度 :P)
不過當初的秘密謠言(Rumors have it that the secret goal is being faster-than-C which is nonsense, isn't it?)...
對比現在的0.99版官方宣稱的overall 2-3 slower than CPython實在是無法令人滿意...
最主要是JIT的速度不如預期, 所以只能說請PyPy Team裡的高手多加加油了...

也希望快點有1.0出來囉也希望1.0文件多一點...
現在的文件數目對於我這種只是看著code流口水的EndUser來說實在是有點太少而且編排太亂...

ps: 剛看到reddit上也有人在討論 看起來像是rpython的使用範例.
範例中透過translatorshell.py翻譯Rpython成為C code可以比原先的pure python code快了70倍.
http://programming.reddit.com/info/152lr/comments/c156v0

[link] Satchmo -- 基於Django的電子商務商店架站軟體

應該不少人都有聽過osCommerce這個Opensource的PHP&GPL線上開店架站軟體.

那麼Django有沒有什麼對應方案呢?
答案似乎是有的, Chris Moffitt用BSD版權釋出了基於Django開發的電子商務開店軟體: satchmo

對於這類軟體, 大家總是有疑問, 它穩定嗎, 馬上能用嗎?
基本上這類軟體一定要經過客製化的程序,
而Satchmo還在先期開發中,雖然可用,但不見得符合你的需要.
如果你想要完全不修改就能使用那可能還是花錢買公司的Support比較妥當.
好處是satchmo以BSD版權釋出, 如果你有這類的需求, 多看看別人的程式碼也無妨.

你可以先看看Demo:
Demo站台在此

原作者在Mailing list上也有回答:
"""
1. I think Satchmo is ready with the caveat that it needs to be the
right kind of site. I do not believe any Satchmo sites are live in the
wild. I will say that the "Demo Store" is the current code and does get
a fair amount of activity (i.e. probably more then my real-life store ;)
and so far nothing has gone up in smoke. The features that Satchmo have
work and for me, they are > 90% of the features I need. My wife's store
would have < 50 items, some discounts, authorize.net integration and
possibly some other custom CMS type features. I am confident I could
put Satchmo in and it would work well for me. The only reason I haven't
is that my current site works and I haven't spent the time doing the
HTML/CSS re-design I'd like to do. In some ways, Satchmo already does
more for me than the stock OsCommerce site I'm running now. Of course,
Satchmo does not have the rich amount of modules available like OsCommerce.

I will say that OsCommerce becomes a real nightmare once you start doing
anything more than the stock store. It just feels crufty (partially
because I'm no PHP expert) and I just fear making changes to the store.
I never know how things will break.

I also think Satchmo is stable because it's based on Django. A lot of
the scary stuff around security and having different db support is
handled by the robust Django framework. There's also lots of experience
with how to scale Django that should apply directly to Satchmo.
"""

簡單來說只要有熟Python/Django跟Html/css的人持續修改維護就可以開店了.
大部分用Django開發的軟體,如果了解Django的基本架構就大概知道要怎麼修改而不會爛掉.
(有金主找不到的話, 就到Unofficial Python PlanetKalug灑大錢加上三顧茅廬大概就會有高手跑出來了 XD)

星期日, 2月 18, 2007

[解釋] 什麼是CC強攻魯魯修....

話說似乎有人搞不懂為啥我部落格的授權是CC強攻魯魯修...

解釋出來就不有趣了, 不過既然有人問了(這些不點連結的傢伙)還是解釋一下.
魯魯修是很紅的動畫CodeGeass的男主角,
CC是CodeGeass的女主角, 剛好跟創用CC授權同名.
而CC強攻魯魯修是我看片的感想(跟願望XD)
就拿來Kuso一下了咩.

好吧這個其實也不是重點, 重點是有人看到了我的極惡之華裡的CC照片之後
說: "這個長的這麼受怎麼強攻" ....



人不可貌相你聽過沒有... 特別是你才看過幾眼... orz

這個前幾個月出了特別篇的女主角看起來夠受了吧



可是只要幾年前有看過動畫的都知道.... 她是人人敬畏的人氣養樂多黨黨主席啊 XD


這個看起來溫柔文靜萌死人的少女:


其實是大名鼎鼎的2006萌王腹黑石啊:


動畫是很深奧的啊 XD

[link] The Aha! point for lisp.

Aha! While writing YAQL I accidentally discovered Lisp

Greg Trasuk's Weblog:
"""
And then the AHA! moment happens. I finally "get" Lisp! It's just a string representation of the abstract syntax tree for any language! I could embed a Lisp interpreter in the query parser! I could use Lisp macros to perform optimizations on the query! There's a JJTree grammar for Python in the Jython package, I could parse Python into Lisp programs! I'm onto a Really Big Concept! Possibly the Next Big Thing, the grand unification of all scripting languages! Now I have to move back to Xemacs from Netbeans! All I need to do is increase the output by 15% and the city will be mine! If only I had More Power!
"""

話說自從lloyd大大傳授我他壓箱(真的是壓了好多層箱)
的Emacs Lisp聖書三大本,
最近寫Emacs Lisp寫出興趣來了,
發現其實Lisp很好玩,
以前雖然也沒事會裝裝武林高手,
用用lambda,map,filter...blahblah...
雖然把Code寫成一副很有"尊嚴"的樣子,
但是其實心裡總是覺得夾在Python的Code裡面就怪怪的,
多寫幾個就覺得很醜... 所以其實也只是偶而拿來減少一下loop需求而已.
但是, 果然玩了Lisp之後才知道人家是正牌的... XD

所以最近沒事都在讀讀Practical Common Lisp跟玩玩Emacs,
(不過最常幹的還是看動畫念日文跟網路亂逛), 然後看到這篇其實寫的很不錯.

他沒講到的話 我還真的不知道... 覺得這篇很有啟發性...
把任何語言的AST寫成字串形式其實就是LISP...(筆記筆記)
1958年就應該要知道的東西...
結果總是有人(就是我們這代人)在重造輪子...
算了, 反正造輪子總是比較爽... 自產自銷 XD

不過還是要說... 拜Python教的大家絕對不用氣餒...
Python+Django是無敵的...
(ㄟ lloyd大大...你又可以演吐槽角色了...)

[link] 有趣的geek漫畫 xkcd

http://xkcd.com/
節選幾篇... (xkcd是CC-NC授權)



其實我們的世界是用perl hack出來的... =.= ...




這亂數產生器寫的真是簡潔有力啊...
就叫它MT-AgileDice-19937好了





一直在喊多接觸大自然... 但其實是宅在心裡 :P
嘴巴說不要... 身體倒是挺老實的...





這世界上壞人很多啊...
小弟弟可不要沒事傻傻的去論壇po文章啊...
網路上的叔叔都有練過的喔...
這Youtube鄉民... 當然是千錘百鍊囉...



這... 有用就見鬼了...

老姊曰:"妳這台怎麼沒裝123?"

話說我姐的電腦問題實在是越來越難懂了,

這次她要看朋友的影片時又發功了:

"啊 妳這台win2000怎麼用這個播 不是有那個123 嘛 ?"

123 ??!! 123 !!?! 123 是什麼鬼?!!

難道說我之前替她的電腦裝了Unix底下才有的mpg123 Console播放器???

不可能這麼瞎吧... 就算我再怎麼愛用Unix 我姐也不可能用習慣那種東西吧~~

啊.... 難道是....

不會吧... 原來是...









你馬幫幫忙... 這是一個整天在世界各國開Conference寫Paper...
據說要唸醫學博士的傢伙說出來的話嗎?

人家好歹也是 3 2 1 啦... =.=

ps: 老姊, 這篇被妳看到了不要打我, 誰叫你新年第一天就在耍笨...

星期六, 2月 17, 2007

buildbot setup trac!

http://buildbot.net/trac

buildbot是一個用Python撰寫, 可以用來追蹤軟體專案目前狀況的軟體.

buildbot設立之後,可以定時編譯並且回報軟體是否有成功的編譯/Unit Testing成功.
非常適合用來協助大型軟體的測試跟追蹤新開發程式的臭蟲.
目前已有多個Python開發的Opensource專案每天都透過Buildbot進行測試.

講這麼多廢話, 重點是, Buildbot用Trac新建立了一個Wiki頁面之後,
內容看起來豐富多了. :)

官方網站提供的BuildBot ScreenShot:

直接使用Browser觀看:


透過IRC:


GUI介面即時顯示狀況:


GTK介面的debugclient:

google 密技一覽表

http://www.adelaider.com/google/

Adelaider.com 作了兩張A4的google服務,搜尋方法的小抄PDF檔.
裡面列出了一堆google所提供服務的網址, 甚至連google bot的IP都有.

話說小弟我也是看了這張表, 才知道原來Google連來電五十的服務都有... XD
http://www.google.com/romance


User A: 「Finally I've found my Soulmate! Thanks, Google Romance!」


User B: "I never thought
I'd be writing an online dating testimonial.
Until I met User A…」

這台詞未免也太.....

lython approach 1.0 !?

繼不久前很久沒放出新版本的jython 放出了第一個2.2 beta之後,
lython突然也放出了 1.0版本,
原來是近期多了一位熱血開發者faulkner,
玩了一下發現很不賴, 可以使用CPython的Library啊!!!
排除了Not Enough Library這個問題之後,
Lisp就是非常非常吸引人的程式語言.

lython可以使用Lisp語法/Macro加上Python的Library,
而且仍然是產生.pyc ,
所以即使沒裝lython只要有CPython還是可以跑, 實在是很不錯.
希望faulkner再接再厲,
這樣的話就輪到有人寫一篇 Why lython is an acceptable LISP 的時候了. XD

lython內附的Example之一:


file-hello-world.lth
(import os)

(:= out "/tmp/lythontest")
(if (os.path.exists out)
(os.unlink out)
(print "target file does not exist"))

(:= f (open "/tmp/lythontest" "w+"))
(f.write "Hello World from Lython!\n")
(print "write you a letter in /tmp/lythontest")
(f.close)


Lython的interactive interpreter也學python學的很像:

-bash-3.00$ lython.py
Lython (experimental)
Type "(help)" if you need it.
Ly> (for x (range 10) (print x))
0
1
2
3
4
5
6
7
8
9

星期五, 2月 16, 2007

[link]Programming Language Stories

http://weblog.raganwald.com/2007/02/programming-language-stories.html

這篇好笑(難笑?!)的文章唯一跟Python有關的部份是跟使徒聖彼得對話的這段:

*****RoR閃光開始*****

Peter: “Welcome to heaven. Programming language?
聖彼得: 歡迎來到天堂. 用的程式語言?

Person #3: “Python.”
丙兄(前面Smalltalk跟Common Lisp的人都通過了): Python

Peter: “Room 54. Be very quiet as you pass Room Six.”
聖彼得: 五十四號房. 當你經過六號房時要很安靜的通過.

Person #3: “Why do you keep telling us to be quiet as we pass Room Six?”
丙兄:為甚麼你持續的跟我們說要很安靜的通過六號房?

Peter: “Because the Ruby on Rails People are in Room Six, and they think they’re the only ones here.”
聖彼得: 因為RoR那群人在六號房. 他們認為只有他們在這裡.

*****RoR 閃光完畢*****

但我覺得其實最好笑的是Scheme的部份, 好笑在哪裡?

哎呀, 其實是很難笑啦... 特別是你認真的從頭看到尾之後...

星期四, 2月 15, 2007

Bash-like Tab Completion in Emacs python-mode

Just hacked a bit, and a bash-like tab-completion in emacs python-mode is done. :)

Thanks Yuan Liu's tip and my friend lloyd's advices and tests,
also pymacs and python-mode developers,

it works quite well for tab completion using just tab key in python-mode.

1. install python-mode and pymacs

2. change /usr/share/emacs/site-lisp/python-mode/pycomplete.el to:


;;; Complete symbols at point using Pymacs.
;;; See pycomplete.py for the Python side of things and a short description
;;; of what to expect.

(require 'pymacs)
(require 'python-mode)

(pymacs-load "pycomplete")

;;check if prev character is blank-type
(defun char-before-blank ()
(save-excursion
(forward-char -1)
(looking-at "[\n\t\r]")))

(defun py-complete ()
(interactive)
(let ((pymacs-forget-mutability t))
(if (and
(and (eolp) (not (bolp))
(not (char-before-blank))))
(insert (pycomplete-pycomplete (py-symbol-near-point) (py-find-global-imports)))
(indent-for-tab-command))))

(defun py-find-global-imports ()
(save-excursion
(let (first-class-or-def imports)
(goto-char (point-min))
(setq first-class-or-def
(re-search-forward "^ *\\(def\\|class\\) " nil t))
(goto-char (point-min))
(setq imports nil)
(while (re-search-forward
"\\(import \\|from \\([A-Za-z_][A-Za-z_0-9\\.]*\\) import \\).*"
nil t)
(setq imports (append imports
(list (buffer-substring
(match-beginning 0)
(match-end 0))))))
imports)))

(define-key py-mode-map "\M-\C-i" 'py-complete)
(define-key py-mode-map "\t" 'py-complete)

(provide 'pycomplete)


3. change /usr/lib/python2.4/site-packages/pycomplete.py to:
(change your python path if different python version)

"""
Python dot expression completion using Pymacs.

This almost certainly needs work, but if you add

(require 'pycomplete)

to your .xemacs/init.el file (.emacs for GNU Emacs) and have Pymacs
installed, when you hit TAB it will try to complete the dot expression
before point. For example, given this import at the top of the file:

import time

typing "time.cl" then hitting TAB should complete "time.clock".

See pycomplete.el for the Emacs Lisp side of things.
"""
import sys
import os.path
import string
from Pymacs import lisp

sys.path.append(".")

try:
x = set
except NameError:
from sets import Set as set
else:
del x

def get_all_completions(s, imports=None):
"""Return contextual completion of s (string of >= zero chars).

If given, imports is a list of import statements to be executed first.
"""
locald = {}
if imports is not None:
for stmt in imports:
try:
exec stmt in globals(), locald
except TypeError:
raise TypeError, "invalid type: %s" % stmt
except:
continue
dots = s.split(".")
if not s or len(dots) == 1:
keys = set()
keys.update(locald.keys())
keys.update(globals().keys())
import __builtin__
keys.update(dir(__builtin__))
keys = list(keys)
keys.sort()
if s:
return [k for k in keys if k.startswith(s)]
else:
return keys

sym = None
for i in range(1, len(dots)):
s = ".".join(dots[:i])
try:
sym = eval(s, globals(), locald)
except NameError:
try:
sym = __import__(s, globals(), locald, [])
except ImportError:
return []
if sym is not None:
s = dots[-1]
return [k for k in dir(sym) if k.startswith(s)]

def pycomplete(s, imports=None):
completions = get_all_completions(s, imports)
dots = s.split(".")
result = os.path.commonprefix([k[len(dots[-1]):] for k in completions])

if result == "":
if completions:
width = lisp.window_width() - 2
colum = width / 20
white = " "

msg = ""

counter = 0
for completion in completions :
if completion.__len__() < 20 :
msg += completion + white[completion.__len__():]
counter += 1
else :
msg += completion + white[completion.__len__() - 20:]
counter += 2

if counter >= colum :
counter = 0
msg += '\n'

else:
msg = "no completions!"
lisp.message(msg)
return result

if __name__ == "__main__":
print " ->", pycomplete("")
print "sys.get ->", pycomplete("sys.get")
print "sy ->", pycomplete("sy")
print "sy (sys in context) ->", pycomplete("sy", imports=["import sys"])
print "foo. ->", pycomplete("foo.")
print "Enc (email * imported) ->",
print pycomplete("Enc", imports=["from email import *"])
print "E (email * imported) ->",
print pycomplete("E", imports=["from email import *"])

print "Enc ->", pycomplete("Enc")
print "E ->", pycomplete("E")

# Local Variables :
# pymacs-auto-reload : t
# End :


4. add this line into your .emacs
(require 'pycomplete)

That's it!

ps: you can also grab pycomplete.el and pycomplete.py here

ps2: if you install python-mode and pymacs from scratch,
don't forget add these lines in your .emacs:

(add-to-list 'load-path "/usr/share/emacs/site-lisp/python-mode")

(autoload 'python-mode "python-mode" "Python editing mode." t)
(autoload 'jython-mode "python-mode" "Python editing mode." t)
(autoload 'py-shell "python-mode" "Start an interactive Python interpreter in another window." t)
(autoload 'doctest-mode "doctest-mode" "Editing mode for Python Doctest examples." t)
(autoload 'py-complete "pycomplete" "Complete a symbol at point using Pymacs." t)

(add-to-list 'auto-mode-alist '("\\.py$" . python-mode))
(add-to-list 'auto-mode-alist '("\\.doctest$" . doctest-mode))

(add-to-list 'interpreter-mode-alist '("python" . python-mode))
(add-to-list 'interpreter-mode-alist '("jython" . jython-mode))

(add-to-list 'load-path "/usr/share/emacs/site-lisp/pymacs")

(autoload 'pymacs-load "pymacs" nil t)
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")

星期三, 2月 14, 2007

Django小抄

引用:
http://www.mercurytide.com/whitepapers/django-cheat-sheet/
http://digg.com/programming/Django_cheat_sheet

Mercurytide 製作了一份Django 0.95+svn 版的小抄,
裏面包含了Template的內建tags跟filters, ORM model裡的Field Type/Options,跟meta,
小抄裡用了圖型標示,讓人能一目瞭然, 分類很清楚, 製作也很精緻.
值得django user印出來參考.

下載:
pdf版本
png版本 (1600*1280 pixels)

星期二, 2月 13, 2007

[圖解][特別報導] 日本女高中生用機器語言開發AJAX網站





日本人果然很惡搞 :P

ps: 被標題騙的人請舉手 :P

星期日, 2月 11, 2007

ezpyinline 0.1 釋出

http://cheeseshop.python.org/pypi/ezpyinline

ezpyinline是我想改進已經從2001年就沒釋出新版的PyInline的一個新專案.
目的就是想讓Python底下非常容易內嵌C語言來改善速度.

我知道類似的東西很多,
std裡的dl,ctypes, 3-party的pyrex,Boost.python,weave,shedskin等很多...
都是為了改善Python的速度.
但是可沒有一個有作到這麼簡單使用,
讓使用者只需下載一個.py檔案就完成一切.使用者也不需自行編譯C.

因此我覺得ezpyinline特別適合用來評估你的Python程式,
到底哪一部份和有沒有必要使用C改寫.

而ezpyinline的精神基本上就是希望完全不用作任何設定.
第一次使用就自動幫妳編譯, 所有編譯出來的檔案也自動幫妳管理.
使用者只要寫Code, 所有系統維護的事都不用煩惱.

講這麼多都沒用, 試一下就知道了, when you see it, you know it.

安裝:
力求做到無痛及輕量, 有setuptools的, 可以直接 easy_install -Z ezpyinline
沒有超級使用者權限或者不想安裝的使用者也可以下載完直接拷貝
ezpyinline.py到你想要內嵌script的目錄

使用:
安裝或下載完之後, 編輯helloworld.py

#!/usr/bin/python
import ezpyinline

code = r"""
int helloworld() {
printf("hello ezpyinline!\n");
}
"""

ezpyinline.C(code).helloworld()

儲存檔案, 執行python helloworld.py
hello ezpyinline!

嘿, it works :)

網站上有更多說明,
過一陣子我也會把東西跟文件寫詳細一點加到Sourceforge上.

ps:
恩, 不要誤會了,
我可不是鼓勵使用者使用C,

老生常談的"premature optimization is the root of all evil",


Optimization: Your Worst Enemy 也指出
Do not do clever optimizations that have no meaning.

但不得不承認C在某些特定應用目前無人可敵,
在軟體的進程尚未發展到能拋棄C的使用時, (或許數十年之內也不會有)
使用Python, "偶而"加上部分的C是可以被我這種Python基本教義派"原諒"的. :P
既然如此, 何不作的更容易使用?

Emacs的文化衝擊

There's nothing wrong with static type systems.
You just have to realize that when you use them, you're building hardware, not software.
-- Steve Yegge


ESR曾經說, 即使妳不用lisp, 妳也該學習lisp, 因為學習lisp會讓妳成為更好的Progammer.
這幾天玩弄Emacs下來, 我不得不說, 如果妳是Programmer, 即使妳不用Emacs作為編輯器,
妳也該瞭解Emacs, 因為瞭解Emacs會讓妳瞭解什麼是好的軟體設計.

***

Emacs是一個環境, 妳不是在"用"一個Emacs, 而是你"進入"了Emacs, 妳活在Emacs的國度裡.
隨便打開一個*scratch* buffer, 輸入(message "hello") 然後 C-M-x , it's EVALUATE!!
如果以其他系統的角度來說. 你已經做好了你的第一個Emacs plugin.
改好你的.emacs , M-x eval-buffer, 新的設定已經載入了.
RESET? 不, 好的"""軟體"""系統不用reset.
Ok, I'll say, Hardware plugs, Software's spirit is: Evaluate, and it's done.

***

我喜歡Python的introspective跟豐富help, 只要能打開python的直譯器, 我幾乎很少需要書籍或線上文件.
Emacs的系統也是一樣, 我原本不能理解當vim user在強調keystroke時, Emacs User那種不屑/不在意的態度.
我現在能理解了, Emacs擁有非常高明的help系統. 忘記了keystroke, 妳還有GUI, 即使妳像我一樣不使用Emacs的GUI,
Emacs的help系統會讓妳忘了為什麼需要GUI. M-x apropos跟C-h C-h是好朋友,
妳忘了keystroke, 妳可以鍵入長指令查keystroke, 妳忘了長的指令, 妳可以用keystroke查詢,
妳什麼都忘了, 只要妳還記得 M-x apropos或C-h, 還是有辦法記起來.

而一旦defun被eval, 他就能夠立即的被啟動, 回傳的值也立刻能在mini-buffer裡看到,
所有自定義的function妳只要能記得開頭的字母, 也都隨時可以按tab兩次顯現,
喔, docstring, help, 使用etags查詢某個function還能即時探索該function在emacs的elisp code,
所有動作都不必離開Emacs, introspective至如此,夫復何求?

***


Systems should never reboot.
Great software systems are introspective.

我現在很清楚的瞭解他指的是什麼了, 如果妳不能理解, 建議你玩玩Emacs.
Emacs是Dynamic的典範, 是超越了時代的設計,
我很難想像這是一個80年代開始發展的系統.
我以往從來不在意Emacs或者Vim的所謂編輯器聖戰,
原本覺得那是意氣之爭, 但即便對某些人是意氣之爭,
但認真去瞭解Emacs還是教了我很多,
僅在數天之內, 我便開始瞭解聖戰為何而戰.
Vim可能符合了這一代人對軟體,對編輯的期望,
但那是現在, 軟體的歷史還年輕的很, 而Emacs的戰場還在未來.
是因為有了堅持跟夢想, 才會有了這個不流血的戰場.
在可見的未來, Emacs的聖戰將會繼續打下去.

星期六, 2月 10, 2007

安裝Emacs23 於 FreeBSD 4

Emacs23在FreeBSD上沒有gentoo的cvs ports, (emacs-devel是22)
所以得自己來了.
不幸的是這台遠端的機器是4-STABLE的,
而emacs裡的etags需要getopt_long, FreeBSD 4沒有,
所以得多裝個freelibiberty.
(FreeBSD 5+可免掉此步驟) 安裝步驟如下:

#cd /usr/ports/devel/freelibiberty/; make install clean; cd /tmp

想用emacs23-cvs version.
#cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -r emacs-unicode-2 emacs emacs

遠端不需要X
#cd emacs;./configure --without-x

改Makefile, emacs/lib-src裡Makefile的LOADLIBES加入 -liberty (一樣是FreeBSD4才要)
#LOADLIBES= -liberty -lutil -lc

gnu make instead of bsd pmake.
#gmake bootstrap;gmake info;gmake install

ps:
過程中曾因某些不明而且我已懶得瞭解的原因,
需要pkg_* 放在/usr/local/sbin

for x in `ls /usr/sbin/pkg_* | awk -F/ '{print $4}'`
do
ln -s /usr/sbin/$x /usr/local/sbin/$x
done

Emacs

受到lloyd大大的影響,
基本上最近我也加入了拜lisp教之Emacs分會.

剛好Stevey的blog也寫了一篇有關Emacs的文章, 就拿來試一試吧.

果然, lisp在Emacs底下寫很有感覺啊...


(defun blog-column-length ()
"Print stats on current blog column, or blogollum, or whatever"
(interactive)
(save-excursion
(goto-char (point-min))
(let ((char-count 0))
(while (not (eobp))
(unless (looking-at "[ \t\r\n]")
(setq char-count (+ 1 char-count)))
(forward-char 1))
(message "%d chars, %d words" char-count (/ char-count 5)))))


ps:不過我這邊的ntemacs23沒有(require 'cl)
所以就把原本的incf改成了setq.

update: 剛看了這段Emacs Screencast, 非常令人讚嘆.

update2: 又學會一招
http://www.gnu.org/software/emacs/elisp/html_node/Simple-Macro.html#Simple-Macro
(defmacro incf (var)
(list 'setq var (list '1+ var)))

uselessaccount.com 真是太耍寶了




http://uselessaccount.com/

Today's web is crazy. Open ID is a pipe dream. Every direction you turn you're forced to create yet another account. Most of the time it's for one of those throw-away web startups created 10 times a day, but occasionaly it's worth the effort. It might be to purchase some fancy threads, order a pizza or see how fat the Cool Kids from high school have become. When it's that important, you can't afford to drop the ball. With a useless account you can practice without fear. So when it comes to the crunch, you're ready! Sign up now!


非常具有幽默感的網站...

這真是一股清流啊~~ 哈哈~~

OpenID supports by Microsoft !?

http://slashdot.org/yro/07/02/06/2152214.shtml

http://brad.livejournal.com/2287909.html

沒想到連Microsoft也要支持OpenID了,
(雖然凡是說到Microsoft要支援什麼標準都有點可怕 :P)

slashdot雖然一向以戰文+情緒性文章著稱,
但是好的評論確實也不少:

by Bogtha (906264) on Tuesday February 06, @07:50PM (#17914750)

>>> Going back to OpenID, all I need to do is supply my own authentication
>>> server, and I have corroborated my own identification.

Trust and identity are two different things. You're talking about trust. The fact that you can make up multiple identities doesn't matter unless you want somebody to trust one of them for something.

Trust is a big problem; moreso than identity. Furthermore, trust systems have identity as a requirement. And identity is useful outside of any advanced trust system. It makes sense to solve the identity problem first before moving on to complicated web of trust models.

The OpenID people are careful to distinguish between identity and trust. Trust is outside the scope of OpenID, but it's likely that any worthwhile trust system can be built on top of OpenID. You shouldn't use lack of trust as a basis to reject OpenID; in fact large-scale adoption of OpenID may well be helpful in developing a decent trust system.

PS: The one organisation that I expected to support OpenID much sooner than this is Google. Anybody have any ideas why they haven't jumped on board yet?

by CoughDropAddict (40792) on Tuesday February 06, @08:46PM (#17915308)

>>>Unfortunately, OpenID will utterly fail in it's task: it will never be a
>>>trustworthy source of identification.

You seem to be confused about the scope of OpenID. OpenID is not a system for tying user accounts to personal identities. It simply provides secure, distributed user accounts. It's not failing at it's task, it's failing at a task that you seem to want, but OpenID was never designed to solve.

===

Trust and identity are two different things.
也就是會在某一程度上將使用者"認證"(Auth)這個概念分成了"辨" 跟 "求".
這個觀念其實我覺得挺重要的, (至少原本我沒想的這麼清楚)
OpenID提供的功能只是對使用者帳號的識別(區分使用者) ,
Trust這個問題本身不僅包含了辨認, 而且要複雜的多.
對於能不能相信使用者資料所提供的資料, 則不是OpenID所能要求的,
而是透過開發者其他的認證機制.
然而對於大多數不需或無法嚴格確認身份的Web Application來說,
OpenID其實就已經很足夠了. 
而對於需要更複雜機制的Web AP, OpenID則也可以提供一個很好的起點跟架構支撐.

shell script裡使用python的問題

lloyd大大教了我一招: 
把python code寫在環境變數裡面,再用python -c "$code"

不過現在換我解決他的問題了,
他的問題其實說起來很簡單,
就是如何在shell裡不換行透過pipe符號跟python程式溝通?
(把python當unix的tools來用的意思,大部分unix tools都支援stdin入stdout出)

簡單舉例的話就是比如去讀取/etc/passwd裡root的預設shell,
(只是舉例, 當然我們都知道可以直接open('/etc/passwd').read()而不必透過cat,
主要只是為了凸顯程式裡要有stdin跟stdout的使用,
重點是, 環境裡大部分的程式邏輯都是bash寫的, 只有少部份需要使用到python,
所以也不想另外寫.py檔案)

這已經是我能想到最簡單而且還具有可讀性的解法了:

透過python的sys.stdin跟print

cat /etc/passwd | python -c "import sys;print [line for line in sys.stdin if 'root:*' in line][0].split(':')[6].strip()"

re版本:

cat /etc/passwd | python -c "import re,sys;print [line for line in sys.stdin if re.search('^root:\*',line)][0].split(':')[6].strip()"

果然, 要'bash為體,python為用' 還是會遇到幾個小問題:

1.regex 沒內建在python語言(而是在標準庫內). 會不想用.
2.為了少寫那個分行要用的 \ 跟 """ ,不分行方法的python不得不使用比較不清晰的方式.
(這當然是相對於ruby來說)
3.而不換行, 會有一些語法不能用, 因為在python語法裡, 換行跟縮排是有意義的.

ruby有內建的全域變數$stdin, 這是相對應ruby版本中的一種:
cat /etc/passwd | ruby -e 'print $stdin.readlines().grep(/^root:\*/)[0].split(":")[6]'

perl...也有很多寫法,我這個寫法基本上已經接近像是sed的用法了:
cat /etc/passwd | perl -aF: -ne 'print "$F[6]" if /^root:\*/' | head -n 1

恩... 果然...
python真的不是拿來這樣用的 :P
我的理想解答其實是: "放棄shell script,改用python去呼叫shell吧" :P

星期日, 2月 04, 2007

好玩的Flash遊戲 Flash Element TD



這跟django還是python都沒啥關係, 純粹就只是好玩而已 :-)

遊戲網址:
http://novelconcepts.co.uk/FlashElementTD/

網友的中文介紹

ps: 破關感想: 這遊戲實在很有財務概念...
這可比什麼現金流老鼠賽跑的遊戲有創意又好玩的多啊...

我的破關成績:

[link] 使用現有的 Yahoo! 帳號享受 openid

http://idproxy.net/

OpenID的概念很簡單, 只要妳有一個openid帳號,
妳就可以登入所有符合openid標準的網站.
這個概念基本上跟微軟的.net accounts還有google,yahoo的帳號很類似,
所不同的是openid的支援容易並且是公開標準,不為任一單一廠商所擁有.
所以可預見在未來會有更多opensource社群裡的網站支援這個標準.

然而雖然有了openid可以省下到每個網站都要建立/登錄一次帳號的麻煩,
但是不論如何建立一個openid帳號 還是得要輸入基本資料 這還是挺麻煩.
這個http://idproxy.net/就派上用場了,
如果妳有Yahoo!帳號, 那麼你就可以使用Yahoo!的帳號建立openid帳號,
花不到二十秒你的openid帳號肯定建立完成!

接下來你就可以到

http://www.lifewiki.net/openid/OpenIDConsumers
這邊列出的網址去參觀裡面的網站,
而不用特地在每個網站都建立一個帳號了, 是不是很棒呢?

延伸閱讀: 這篇Simon Willson (就是Django建立者其中之一啦)
有解釋他架設的方法.

星期六, 2月 03, 2007

[tip] Feedjack的兩個小問題

前陣子跟Shawnkalug上安裝了Feedjack, 我發現預設的Feedjack似乎有兩個小問題:

1. 使用IE瀏覽會整個亂掉. 這點我已經修復了 基本上只是調整一下CSS,
還有加了一個Check有沒有大頭照存在的filter, 因為一直都用firefox,
所以在這之前完全沒注意到有這個問題, 用了公司測試用的IE瀏覽器才發現,
Feedjack官方網站提供的Example Site除了一兩個有重新設計的之外, 也是全部都爛掉,
Feedjack居然預設完全沒考慮到IE的瀏覽, 這點實在是讓我出乎意料.

2. Tag Cloud顯示有問題:
用了一陣子之後突然發覺tag cloud的錯誤很大...
我blog上明明是django的項目最多, 但字體卻不是最大.
看了一下我的blog tag顯示計數, 再比對Feedjack上的:
In [1]: from feedjack.models import Site
In [2]: x = Site.objects.all()[0]
In [3]: from feedjack.fjcloud import cloudata
In [4]: cloudata(x)[1]
Out[4]:
[{'count': 2, 'weight': 2, 'tagname': 'ajax'},
{'count': 17, 'weight': 5, 'tagname': 'django'},
{'count': 4, 'weight': 2, 'tagname': 'humor'},
{'count': 2, 'weight': 2, 'tagname': 'link'},
{'count': 7, 'weight': 3, 'tagname': 'programming'},
{'count': 11, 'weight': 5, 'tagname': 'python'},
{'count': 3, 'weight': 2, 'tagname': 'talk'},
{'count': 8, 'weight': 4, 'tagname': 'tips'},
{'count': 1, 'weight': 1, 'tagname': 'translation'},
{'count': 5, 'weight': 3, 'tagname': 'web'}]

疑? count 跟weight都沒問題啊,
不過很明顯的Feedjack上的tag cloud跟我的blog上的tag cloud就是長的不一樣,
仔細再查了一下, 阿, style.css居然漏加了cloud_4跟cloud_5的定義:
那我就順便改了一下字體大小, 這樣就可以了.

.cloud_1 {
font-size: 80%;
}
.cloud_2 {
font-size: 90%;
}
.cloud_3 {
font-size: 100%;
font-weight: bold;
}

.cloud_4 {
font-size: 110%;
font-weight: bold;
}

.cloud_5 {
font-size: 120%;
font-weight: bold;
}


這樣就OK了.

[links] django search

http://djangosearch.com/
滿好用的一個網站,
可以隨時閱讀到最新有關django的文章以及source project,
左下角有個地方可以直接將google的django搜尋加入到firefox search engine裡面,
當然, 這個網站本身也是django作的.

[link/tips] add Trackbacks to Django

http://www.personal-api.com/train/2007/jan/31/how-add-trackbacks-django/

這篇文章介紹了如何將trackback加入到django中的作法,
同一位作者也寫了有關pingback在django裡的作法.
http://www.personal-api.com/train/2007/feb/01/pingbacks-xml-rpc-and-django/