2012/03/28

AdSense QuickStart

如果之前對 AdSense 完全沒概念,要先看新手指南,如果迫不及待想註冊,最好先了解付款形式,二級域名原則上不能申請,個人發佈商的情況比較單純,公司發佈商有細節要留意,台灣的公司帳戶只能透過美金支票付款,托收支票時需要繳納托收費用。台灣個人帳戶可以透過西聯付款,隔日就會到帳,很多台灣的銀行都可以提取。可以到論壇了解更多資訊。

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 NorvigTeach 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

古地圖考證陳友蘭溪之由來

楊南郡和徐如林老師二月21日的演講裡,提到古道和古地圖的研究,如何協助歷史文化的考證。例子之一是陳友蘭溪名稱的由來,根據1878年出版的《全台前後山輿圖》,圖中標示的地名為丹柳蘭溪,以閩南語發音和「陳有蘭」相似,故可推知 DANYULAN 之音實為山地地名,而丹柳蘭、陳有蘭均係音譯,原地名意義尚未查出。

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