2012/03/28
AdSense QuickStart
2012/03/19
Why I Love Python
"Everyone can be taught to sculpt: Michelangelo would have had to be taught how not to. So it is with the great programmers." -- Alan Perlis
當我要回答「為什麼喜愛 Python」這問題,最好是配合提問者的背景。
對於沒接觸任何程式語言的入門者,我會說: 入門 Python 很容易,而且很有趣。
對於某種語言邊用邊幹譙的朋友,我會說: Python 支援豐富,讓你快速處理問題核心。
對於某種語言用得很愉快的朋友,呃,大概不會問我「為什麼喜愛 Python」。
那麼,我又如何對自己回答這個問題呢?
「我想要一個用起來直覺,十年百年之後,還能用來解決問題的程式語言。」
可見的未來,越來越多人需要使用 scripting 語言,客製化自己的應用程式,想像我們要解決某個問題,總不希望解決問題的工具本身也帶來太多問題,學習新程式語言的成本,應該要越低越好,帶來的效益,應該要越高越好。
如果一個人只能選一種程式語言來學習,Python 當然是很好的選擇,如果要學習不只一種程式語言,Python 的基礎也對其他語言有所幫助。Peter Norvig 在 Teach Yourself Programming in Ten Years 裡提到,學習程式語言的核心,在於思惟,而不在於語法,一個程式語言如果不能帶來新的思惟,不值得花時間去學它。
"There should be one -- and preferably only one -- obvious way to do it." -- The Zen of Python
讓世界變得更美好,有很多事情該做,PyCon Taiwan 就是其中之一。你也不要錯過。
2012/03/16
Fix Content Lead Image Display
collective.contentleadimage 可以為 Plone Content Type 新增一個 lead image 欄位,上傳圖檔來改善內容項目的顯示效果。不過,在管理編輯的 Content 頁籤裡,lead image 還是會顯示出來,這就造成畫面的困擾。
在處理顯示工作的 page template 裡,像是 collective.contentleadimage/borwser/leadimage-body.pt 檔案,加上 not context.REQUEST['URL'].endswith('folder_contents') 的判斷式,應該有助改善這問題。
這樣的撇步也可以應用到 dropdown menu 場面,如果有某個目錄不想在下拉選單裡出現,可以加上判斷式:
<a tal:condition="python: not (item_url.endswith('my_folder/sub_folder') or item_url.endswith('my_folder/another_folder'))"
2012/03/12
古地圖考證陳友蘭溪之由來
2012/03/08
collective.flowplayer with custom flash link
Plone 裡使用 collective.flowplayer 來嵌入影片,如果檔案放在 dropbox 之類的空間,可以試用下列的方式,先在 Page 裡編輯下列的 HTML 內容:
<object data="http://mysite.com/++resource++collective.flowplayer/flowplayer.swf" height="214" type="application/x-shockwave-flash" width="280"> <param name="data" value="http://mysite.com/++resource++collective.flowplayer/flowplayer.swf" /> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="flashvars" value="config=http://mysite.com/my-folder/config.js" /> <param name="src" value="http://mysite.com/++resource++collective.flowplayer/flowplayer.swf" /> </object>
然後到 ZMI 的 my-folder 目錄裡,建立 config.js 檔案,內容如下:
{'clip': {'scaling':'fit', 'autoBuffering':true, 'autoPlay':true, 'baseUrl':'http://dl.dropbox.com', 'url':'http://dl.dropbox.com/u/myid/myfile.flv' }, 'canvas':{'backgroundColor':'#112233'}, 'plugins': {'controls': {'time':true, 'volume':true, 'fullscreen':true }, 'content': {'url':'flowplayer.swf', 'html':'Flash plugins work too'} } }
2012/03/06
Input Lines of Data in Page Template Form
原本運作正常的 CMF Action 編輯表單的程式碼如下:
<input type="text" name="new_author:list" value="author" size="40" tal:condition="canModifyItem" tal:attributes="value obj/getAuthor; id string:${item}_author;" />
現在要改成 authors 資料,也就是 LinesField 欄位格式,根據提示,<input /> 要改用 <textarea />,找到 Products/CMFDefault/skins/zpt_content/metadata_edit_template.pt 裡面有範例:
<th i18n:translate="">Contributors</th> <td tal:define="contrib_lines python: '\n'.join(options['contributors'])"> <textarea name="contributors:lines" rows="5" cols="31" tal:content="contrib_lines"></textarea> </td>
Change Plone TinyMCE Default Image Dimension
這個問題原本在 http://stackoverflow.com/questions/7034187/change-tinymce-default-image-dimension 提出,當時 Plone 4.0.7 環境按照回答去改,並沒有成功,後來 Plone 4.1.3 環境有成功。暫時懷疑是 Products.TinyMCE 有更動,有空再比對了。
不過,還有另一種處理途徑,是修改 Products/TinyMCE/skins/tinymce/plugins/ploneimage/js/ploneimage.js 的內容,把
if (nd.value == dimension) { nd.selected = true; }
改成
if (dimension != '' && nd.value == dimension) { nd.selected = true; } if (dimension == '' && nd.value == '@@images/image/preview') { nd.selected = true; }
2012/03/05
First Step with Git
許多 Plone Collective 程式碼都從 subversion 搬到 git 了,今天拿 Products.AutocompleteWidget 當例子,記錄操作過程:
$ cd src $ git clone https://github.com/collective/Products.AutocompleteWidget.git Cloning into Products.AutocompleteWidget... remote: Counting objects: 217, done. remote: Compressing objects: 100% (107/107), done. remote: Total 217 (delta 88), reused 215 (delta 86) Receiving objects: 100% (217/217), 50.84 KiB, done. Resolving deltas: 100% (88/88), done. $ cd Products.AutocompleteWidget $ git status # On branch master nothing to commit (working directory clean)
不過,比對程式碼之後,發現最新版本的內容,還是源自於 subversion,目前 1.4.0 是以 http://svn.plone.org/svn/archetypes/MoreFieldsAndWidgets/Products.AutocompleteWidget/branches/improved_multivalued_fields_management 為基礎。
2012/03/01
Script to List Items
不需要建立模組,在 ZMI 新增 Python Script 就能在 Plone 環境執行簡單的查詢工作,例如顯示 News Item 的基本欄位資料。
from Products.CMFCore.utils import getToolByName request = container.REQUEST catalog = getToolByName(context, 'portal_catalog') path = '/mysite/news' for brain in catalog(portal_type='News Item', path=path): try: obj = brain.getObject() print "%s, %s, %s, %s" % \ (brain.getPath(), obj.Title(), obj.Contributors()[0], obj.EffectiveDate()) except: pass return printed
上述執行結果,是方便另存成 CSV 檔案格式。
from Products.CMFCore.utils import getToolByName catalog = getToolByName(context, 'portal_catalog') areas = ['TaipeiCity', 'NewTaipeiCity'] path = '/mysite/myfolder' for i in areas: brains = catalog(portal_type='Image', path=path+'/'+i) print "%s: %d" % (i, len(brains)) print "Total: %d" % len(catalog(portal_type='Image', path=path)) return printed