八月 13, 2016

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Plone5 Theme Customization

Plone5 is released for quite a long time, but recently I finally get a chance to work with its default Barceloneta Theme. For Plone5 new comers, be sure to read first the article "Customize Plone 5 Default Theme On the Fly". One small thing about the Barceloneta theme, from the Front Page text, there's a big welcome string, named hero text, later turned into @@hero view in Plone 5.0.3. So you can reference the following code to highlight some text:

<div class="hero">
<h1>Welcome!</h1>
<p><a class="context" href="http://plone.com" target="_blank">Link</a></p>
</div>

Separated text, say in the end paragraph, with the hero class will display in the same box.

Barceloneta uses LESS as a pre-processor to generate the final CSS files. In addition, its LESS/CSS is not registered on the registry, so you need to compile it with gruntfile.

Then, if you want to develop your custom theme in the filesystem, take a look at plonetheme.persona. Persona Theme is good for blog-style site, not suitable for portal, anyway it is a good start to learn about customization based on Barceloneta. Here is the development buildout log:

$ bin/buildout -c develop.cfg
mr.developer: Queued 'plonetheme.persona' for checkout.
mr.developer: Filesystem package 'plonetheme.persona' doesn't need a checkout.
Develop: '/home/marr/plone505/zinstance/src/plonetheme.persona'
Uninstalling zopepy.
Uninstalling instance.
Installing _mr.developer.
Generated script '/home/marr/plone505/zinstance/bin/develop'.
Installing instance.
Getting distribution for 'mockup-highlightjs'.
Got mockup-highlightjs 1.0.0a2.
Getting distribution for 'plone.app.themingplugins'.
Got plone.app.themingplugins 1.0.
Getting distribution for 'z3c.jbot'.
Got z3c.jbot 0.7.2.
Generated script '/home/marr/plone505/zinstance/bin/instance'.
Generated interpreter '/home/marr/plone505/zinstance/parts/instance/bin/interpreter'.
Generated script '/home/marr/plone505/zinstance/bin/pilprint.py'.
Generated script '/home/marr/plone505/zinstance/bin/pilconvert.py'.
Generated script '/home/marr/plone505/zinstance/bin/enhancer.py'.
Generated script '/home/marr/plone505/zinstance/bin/thresholder.py'.
Generated script '/home/marr/plone505/zinstance/bin/viewer.py'.
Generated script '/home/marr/plone505/zinstance/bin/explode.py'.
Generated script '/home/marr/plone505/zinstance/bin/player.py'.
Generated script '/home/marr/plone505/zinstance/bin/pildriver.py'.
Generated script '/home/marr/plone505/zinstance/bin/pilfile.py'.
Generated script '/home/marr/plone505/zinstance/bin/painter.py'.
Generated script '/home/marr/plone505/zinstance/bin/createfontdatachunk.py'.
Generated script '/home/marr/plone505/zinstance/bin/gifmaker.py'.
Generated script '/home/marr/plone505/zinstance/bin/pilfont.py'.
Updating repozo.
Updating backup.
Installing zopepy.
Generated interpreter '/home/marr/plone505/zinstance/bin/zopepy'.
Updating unifiedinstaller.
Installing test.
Generated script '/home/marr/plone505/zinstance/bin/test'.
Installing diazotools.
Generated script '/home/marr/plone505/zinstance/bin/diazocompiler'.
Generated script '/home/marr/plone505/zinstance/bin/diazorun'.
Generated script '/home/marr/plone505/zinstance/bin/diazopreprocessor'.
Installing checkdocs.
Installing mrbob.
Getting distribution for 'MarkupSafe==0.23'.
Got MarkupSafe 0.23.
Generated script '/home/marr/plone505/zinstance/bin/mrbob'.
Installing releaser.
Generated script '/home/marr/plone505/zinstance/bin/fullrelease'.
Generated script '/home/marr/plone505/zinstance/bin/postrelease'.
Generated script '/home/marr/plone505/zinstance/bin/lasttagdiff'.
Generated script '/home/marr/plone505/zinstance/bin/addchangelogentry'.
Generated script '/home/marr/plone505/zinstance/bin/bumpversion'.
Generated script '/home/marr/plone505/zinstance/bin/prerelease'.
Generated script '/home/marr/plone505/zinstance/bin/release'.
Generated script '/home/marr/plone505/zinstance/bin/longtest'.
Generated script '/home/marr/plone505/zinstance/bin/lasttaglog'.
Generated script '/home/marr/plone505/zinstance/bin/pocompile'.
Versions had to be automatically picked.
The following part definition lists the versions picked:
[versions]

# Required by:
# plonetheme.persona==1.0a2.dev0
mockup-highlightjs = 1.0.0a2

# Required by:
# plonetheme.persona==1.0a2.dev0
plone.app.themingplugins = 1.0

# Required by:
# plone.app.themingplugins==1.0
z3c.jbot = 0.7.2

Look into profiles/default/metadata.xml you will see <dependency>profile-plonetheme.barceloneta:registerless</dependency>

七月 14, 2016

marr's weblog
marrtw
marr weblog is about »

tag cloud

» plone.app.event tzinfo

如果你使用新版 Plone 5.x 或 Plone 4.3.x 加上 plone.app.contenttypes 昇級,應該就會遇到 plone.app.event 帶來的 tzinfo 時區衝擊。假設 item = app.mysite.events['20160701'] 那我們可以用 item.creation_date 讀取建立時間,類似 DateTime('2016/07/01 00:30:23.674693 UTC') 這樣的格式,這表示它還是使用傳統的時間格式,試 item.start 和 item.end 的話,會發現類似 datetime.datetime(2016, 3, 23, 16, 0, tzinfo=) 的格式。

文件 Zope DateTime 有基本的說明,可惜並沒有幫到忙,我想要把上述時間轉成 GMT+8 的格式,這會影響到「三月23日」和「三月24日」的差別。找到 Converting Time Zones for datetime Ojbects 讓事情有了進展:

fmt = "%Y-%m-%d"
item.start.strftime(fmt)

from pytz import timezone
item.start.astimezone(timezone('Asia/Taipei')
datetime.datetime(2016, 3, 24, 0, 0, tzinfo=<DstTzInfo 'Asia/Taipei' CST+8:00:00 STD>)

六月 13, 2016

marr's weblog
marrtw
marr weblog is about »

tag cloud

» OpenGeo Suite

Boundless Exchange 是 Boundless GIS Platform 的一部份,它的功能看來是對應了 GeoNode,而 GeoNode 文件表示它是個 GIS CMS,能夠用來新增 Layer, Map, Document (例如 Excel, PPT, PDF 等),也有群組和簡易權限控制,加入我們的歷史圖資或 Shape File 內容,都可以做到,但我沒發現能直接編輯 HTML 或調整呈現的功能。

整體來說,Boundless Exchange 是編輯 GIS 素材最好的 Open Source 系統環境,算是提供地圖資訊的後台便利環境,但直接在上面「說故事」似乎還不適合,短時間內應該要搭配其他能夠編輯 HTML 的前台環境。如果搭配 LocalWiki 的話,方便共同編輯,但呈現形式要調整後,才容易具備彈性。

GeoNode fig1 GeoNode fig2 GeoServer fig1 GeoServer fig2

擴充開發的角度來看,Python 寫成的元件 (像 Django, pycsw) 偏向前端,以 Java 寫成 (例如 GeoServer) 是後端核心,在調整顯示的情境下,主要應是修改 JavaScript 和 Python 的前端元件部份。

四月 29, 2016

marr's weblog
marrtw
marr weblog is about »

tag cloud

» 在地深耕, 迎向國際

2016 台灣 Python 年會 (PyCon Taiwan) 六月 3日 到 5日 在台北南港中研院 舉辦三天,總數超過 40場演講,主題涵蓋資料科學、人工智慧、金融科技、網站開發技術、雲端應用、青少年程式教育,會前搭配專案實作 (Sprint) 和專業課程 (Tutorial) 活動,會後在政治大學搭配新手村 (PyDay) 活動,更多資訊請參考 http://tw.pycon.org/2016/events/overview/ 介紹。

五位主題講者,包含網站技術專家、微軟 Python 工程師、迪士尼動畫工程師,還有黃敬群和唐鳳,兩位出身台灣、自學成才、享譽國際的自由軟體資深貢獻者。

本地出身的主題講者,佔了五分之二,這樣安排,是為了體現 PyCon Taiwan 的願景目標: 發展 Python 技術,提昇社群專業。簡單地說,我們要在台灣搞出一系列一流的產品服務,不限於 PyCon 或 Python,但我們選擇 Python 為核心,從年會出發累積。這個願景方向,我們努力了五年,交出讓自己驕傲的成績單,但還有很大的天地等我們去發展和成長。

如果能作夢,我期待成立台灣 Python 基金會,做什麼事呢? 推展青少年教育,讓 Python 成為各行各業的核心技術,社群專案和講者多到滿出來,台灣成為技術重鎮,工作效率提昇系統穩定成長,大家早點下班去做自己覺得有意義的事。如果要有這樣的一天,那麼搞好一個持續成長的 PyCon,也只是個起點罷。人生苦短,你想做的是什麼呢?

提到程式教學,幾場相關的講題摘要如下:

  • 主題演講 Jim Huang (jserv) 分享應用 Python 在大學作業系統和編譯器課程的經驗,以及 Python 編譯器與虛擬機器的內部設計。
  • 分享兒童程式教學經驗 Teach Kids to Learn Python: Eric Huang 針對小六到高一設計 Python 入門課程,說明學習 Python 應先具備的能力,入門的九個重點,提供上機練習體驗,最重要的是,如何引發學生學習的動機,培養寫程式的能力和自信心。
  • Learning the Basics: 來自香港的十一歲少年 Isaac Li (英文演講) 經由小遊戲的設計概念,分享自己學習 Python 的經驗談,用意是激勵更多青少年朋友接觸程式學習。
  • Coaching Teens to Learn Python: Edward Duh 檢視多種可能適合青少年學習的工具,包括 Raspberry Pi、Minecraft Pi、CheckiO、IPython Notebook 等,並分享教學設計的實務經驗,怎樣讓學習變得有趣。

早鳥優惠到五月1日 18:04,還沒買票的朋友,別錯過囉。

"The past cannot be changed. The future is yet in your power." -- Hugh White

Let's Implement the Future, Together!

四月 28, 2016

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Get Your PyCon Taiwan 2016 Tickets

學習程式語言,第一先要入門產生興趣,再培養良好的自學能力。
寶寶心裡爽,但寶寶還是要說: Python 的好 妙不可言啊
阿榮啊,放假要記得去買 PyCon Taiwan 門票,順便再捐 500 給 OCF 基金會。

十二月 23, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Omeka Notes

安裝 Omeka 2.3.x 之後,有幾個常見問題,依自身實務的需求優先順序來說明:

* Item 只能對應一個 Collection 不能對應多個。所謂的 Collection Tree 通常幫不上任何忙。

* Theme 客製化機制建議先參考這一系列說明,Common Layout 無法依 Item 或 FrontPage 來客製,例如 Disqus Embed Code 無法依 Item (or Item Type) 來顯示

* Navigation 管理方式只有一招,每個 Tab 都要指定 Link URL。

* Item 與 Collection 不能容易地自訂網址。

* 描述欄位的中文斷字預設無法正常顯示,至少要修改下列檔案:

  • application/views/scripts/items/single.php
  • application/views/scripts/collections/single.php
  • themes/.../collections/show.php
  • application/views/scripts/items/browse.php

* 地圖座標搭配 CSV Import 時,無法批次處理。

* Exhibit 的 SubItem Navigation 不能客製化

* Slide Show 模組整合選項有限制,較可行的是像 CSSlider。

* 利用 GetText 建立翻譯用的 pot po 檔,但沒有支援 Multi Lingual 機制。測試用 msgfmt -o 產生的 mo 並沒有成功生效。

* 留意 Version One vs Two 的差異

* Short Code 範例

* Collection 排序調整 數量統計 的範例

試用 Plugin 的心得記錄:

* Youtube 會新增一個匯入介面,輸入個別的影片網址,會自動填寫欄位資料。

* 安裝 GeoLocation Plugin 後,搜尋表單會增加地理相關搜尋欄位,但測試會造成錯誤,要從 application/views/scripts/items/search-form.php 移除 php fire_plugin_hook() 來停用搜尋欄位。

十月 26, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Python Course at NanGang High School

Almost 10 years from now ... http://www.openfoundry.org/en/component/content/article/580-ossf-

Slides at http://www.openfoundry.org/download/cat_view/212

十月 2, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Custom JavaScript Pattern Settings in Plone5

Plone 5 beta 3 is now released. Building from the source code is easier, compared to how we did it before.

$ virtualenv myenv
$ git clone -b 5.0 https://github.com/plone/buildout.coredev ./plone50dev
$ cd plone50dev
$ ../myenv/bin/python bootstrap.py
$ bin/buildout

Playing with Mockup is fun in Plone 5. See Customizing JavaScript Pattern Settings in Plone 5 to get started.

One way to work with your project: checkout the codes in src folder, edit core.cfg to modify eggs and develop under [buildout] section.

六月 26, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» QAs for Python Beginners

學習 Python 前,你可能會遇到下列的疑問,對於這些問題,你心裡的答案是什麼呢?

這裡未必提供完整精準的解析,但希望有助於帶你看到學習程式語言的新觀點。

要懂物件導向才能學習 Python 嗎?

在 Python 中,每個東西都是物件,但,不代表你必須使用物件導向作為 Python 的主要典範,舉例來說,有人仿照 Functional Programming 典範來使用 Python。不懂物件導向觀念,不致於成為學習的阻礙,當然,具備物件導向的觀念,有助於進階議題的學習。

Python 是 Script 語言,執行效率一定比較慢囉?

善用內建函式和內建型別的情況下,Python 的效能並沒有比編譯式語言來得差。常見的建議是,等到程式架構穩定之後,再決定是否要處理效能問題,以及採取怎樣的處理方式。參考下列文件:

  • http://www.python.org/doc/essays/comparisons/
  • http://www.infoworld.com/article/2619428/python/van-rossum--python-is-not-too-slow.html
  • http://www.monitis.com/blog/2012/02/13/python-performance-tips-part-1

Python 的中文書籍很少,需要具備足夠英文程度才能學習嗎?

編寫品質良好的中文程式書籍,是極度吃力不討好的工作,結果就是,我們在市面上很難找到好的中文書。英文書的種類和數量,相對就多些。 想要自學的朋友,先選擇好的英文書和線上文件外,聰明的作法,就是參加同好聚會,線上和實體課程。

需要選好 IDE 才能開始 Python 編程嗎?

Python 世界裡存在許多 IDE 編輯器,免費或付費版本都有,各有愛用者。不少人使用 Vim 或 Sublime Text 就覺得夠用,所以,沒有 IDE 無法編程,對 Python 肯定是不成立的。

Python 的變數不用事先宣告型態,容易造成程式產生難以預期的錯誤或漏洞?

Python 是 Dynamic Typing 語言,使用變數時,不像 C 或 Java 需要事先宣告資料型態。Python 雖然有 Private 變數,但不像一般程式語言那樣具有強制力。通常會利用 Testing 來降低資料型態不明可能造成的問題,另一方面,也利用 Duck Typing 特性來避免資料型態檢查的需要。

六月 25, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Anaconda on Windows

五月 25, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Learning Programming Fast

絕不貪快,按部就班,是學好程式的不二法門,除此之外,還是有五個步驟,有助加速學習:

  1. 先讀範例程式,再讀說明文字。
  2. 打一遍範例程式,執行並測試。
  3. 找個實例練習自己寫程式。
  4. 學習使用除錯器。
  5. 聰明發問,獲得更多角度的解說。

以上我稱之為「程式學習快速秘笈」,原文在這裡

五月 22, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» After-School Class

小孩的媽,最近開始比較住家附近的安親班,用心程度,堪比孟母三遷。

藉由這些親身接觸的機會,我們才體會現代孟母面對怎樣的挑戰。

首先,安親班數量之多,約是便利商店三倍;其次,從業者專注特色,幾近苛求。

有哪些特色呢? 九成會強調純美語、或雙語教學,如果之前沒有足夠的美語根基,要嘛入班前加強訓練,跟上進度,要嘛就不必進去啦,意思是不要拉下既有班級的素質。至於沒有美語課程的安親班,數量雖少,但氣勢也不輸人,強調「省下來」的時間,會加強學生的在校功課,還有戶外運動。

有一家強調網站軟體,小孩回家可以線上複習,「那麼,該怎樣知道小孩有沒有乖乖複習呢?」「我們有會員系統,可以知道誰有沒有登入看影片。」我腦袋浮出的畫面是,哪一天,小朋友們都會安裝好自動登入的外掛程式吧。

總歸一句話,別讓孩子輸在起跑點。但,我依舊納悶,目標在哪個方向都不知道,起跑再早有什麼意義呢?

二月 9, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Plone Widgets

Shelagh Delaney on the cover of Encore, source: http://jadorepop.rumblr.com/

Plone 5 使用 Mockup 做為前端函式庫,目的是讓 Plone 的 Javascript 開發更容易與外界成果結合,像 plone.app.widgets 就是範例成果,它可以取代舊的 Widget 程式,從技術的角度來看,代表我們不必再依賴 z3c.form 來建立 Widget 程式碼。截圖畫面和相關細節,可參考簡報介紹

如果有任何原因,讓你無法直接使用 Plone 5 環境,從 Plone 4.3.4 Installer 起頭,也能方便地啟用 plone.app.widgets,我的方法和步驟如下:

$ vi develop.cfg
[sources]
plone.app.event = git git@github.com:plone/plone.app.event.git branch=1.2.x
plone.app.contenttypes = git git@github.com:plone/plone.app.contenttypes.git branch=1.1.x

[buildout]
eggs +=
plone.app.widgets [dexterity]
plone.app.contenttypes

zcml +=
plone.app.widgets

$ vi versions.cfg
plone.app.jquery = 1.8.3

$ bin/buildout -c develop.cfg
# will stop by the error: There is a version conflict. We already have: plone.app.event 1.1.4

$ vi src/plone.app.contenttypes/setup.py
'plone.app.event [dexterity]' # remove <1.1.999

上述過程適用於全新站台的建立,如果舊站昇級的話,可能會遇到 Tags 欄位未被昇級的狀況。

一月 26, 2015

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Setting Geo Data Programmatically

collective.geo.* allows to geo-reference Plone content types and to display this geo data over a map.

>>> from Testing import makerequest
>>> root = makerequest.makerequest(app)
>>> site = root.mysite

>>> admin = root.acl_users.getUserById('admin')
>>> admin = admin.__of__(site.acl_users)

>>> from AccessControl.SecurityManagement import newSecurityManager
>>> newSecurityManager(None, admin)

>>> from zope.site.hooks import setHooks
>>> from zope.site.hooks import setSite
>>> setHooks()
>>> setSite(site)
>>> site.setupCurrentSkin(site.REQUEST)
>>> folder = site['temples']
>>> folder.objectIds()
['63010023-JTG']

>>> from collective.geo.geographer.interfaces import IGeoreferenced
>>> geo = IGeoreferenced(folder['63010023-JTG'])
>>> geo.coordinates
(121.52559379690797, 25.023316046141368)
>>> geo.hasCoordinates()
True

>>> geo.setGeoInterface('Point', (-105.08, 40.59))

Be careful that coordinates are using floats instead of strings, for example you might get data from CSV files.

Check collective.geo.geographer/README.rst for more details.

十二月 26, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Chinese Language Formula

中文在數位世界裡,理想上的處理方式,認真探討的人很少,實作的累積速度也慢,不過,這份資源值得參考: http://chineselanguageformula.sourceforge.net/

中文語言方程,以構字式為基礎,針對所有的 ISO 639-3 及民族語,採取語言學的正規方法,進行統一處理。目前多組相關的程式碼公開釋出後,原作者想要找人接手維護。

八月 14, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Diazo Beginner Steps

累積 Diazo 的歷史和原理後,最近終於有個小案子能具體實戰。值得注意的是,套用 Diazo 時,並沒有存在特定的標準解法,需要搭配情境和資源現況,再決定從 Theme 或 Content 或 Rule 找到最容易下手的平衡點。

Theme 原始檔是從 ThemeForest 購買,樣版大致分成「首頁」「列表」「個別頁面」三大類,對初學者容易上手的步驟,是先修改首頁 HTML 符合自己的需要,再編寫 Rule 套用首頁的 Theme 和 Content,接著再逐步納入列表和個別頁面的樣版。編寫 Rule 的過程中,需要仔細比對 Content 和 Theme 的 HTML Tag 或是 XPath,為了方便比對,開啟兩個 browser 畫面,利用 Alt + Tab 切換。有個小撇步,在網址後面加上 ?diazo.off=1 就能暫時取消 Diazo 的效果,但在開發階段,全站式的取消效果會更方便。

以 http://diazo.mysite.com/ 為例,如果 Plone Site 在 http://168.168.168.168:8080/drchen 執行,可以在 http://168.168.168.168:8080/drchen/@@theming-controlpanel 指定 168.168.168.168 是「不套用佈景主題的網址」,這樣就可以在 http://diazo.mysite.com/ 顯示 Rule 生效後的結果,在 http://168.168.168.168:8080/drchen 顯示 Untheme Content 的結果。

網址的對應,是 Diazo Rule 最常見的設定工作之一。以下列 Theme 程式碼為例:

<a href="index.html">
<img src="img/logo.png" />
MySite Home</a>

它會被預設轉換成:

<a href="/++theme++drchen.theme/index.html">
<img src="/++theme++drchen.theme/img/logo.png" />
MySite Home</a>

對於圖檔而言,這樣的網址轉換並沒有造成困擾,但是 A Tag 就得額外處理。最直覺的方式,是讀取 Content 實際的 href 屬性值來取代,有趣的是,雖然是要「取代」 Link 值,但 Rule 語法要用 <copy /> 並指定 Attribute,用 XPath 選取 Node 的範例長得像這樣:

<copy attributes="href"
theme="/html/body/div[2]/div[1]/div/div[1]/a"
content="//*[@id='portal-logo']" />

我的理解是,想要取代 Node 時,才用 <replace />。接著,我們以 Global Section 為例,介紹幾個相關的對應情境。

想要逐一取代 Global Section 的 A Tag,我們可以仿照上述技巧,透過下列的範例語法來達成:

<replace theme="/html/body/div[2]/div[1]/div/ul/li[1]/a"
content="//*[@id='portaltab-index_html']/a" />

不過,在這個例子裡,我們應該要連帶處理 <li class="selected"> 的部份,僅是取代 A Tag 的結果並未滿足實際的需要。那麼,取代整個 <ul /> 如何? 事實上,我們想留下 Theme 的 <ul> 但取代掉剩下的 <li /> 部份。幸好,有個 -children 語法能夠漂亮地處理這種需求:

<replace theme-children="/html/body/div[2]/div[1]/div/ul"
content-children="//*[@id='portal-globalnav']" />

我有成功試過其他方法,是先修改 Global Section Viewlet 的 Template 內容,在 <ul> 加上 CSS Class 屬性值,再用 <replace /> 完成取代。相較之下,簡潔的 -children 語法就像一刀斃命。

有時候會遇到一個 Node 裡,同時有數個 A Tag 要指向相關的網址,參考下列的 Theme 原始碼:

<li>
<h2>
<a href="#" title="">
看診科別項目
</a>
</h2>
<div class="news clearfix">
<p class="text">
小兒科、過敏氣喘、耳鼻喉治療<br>
內科、慢性病處方簽<br>
成人、小兒感冒 等
</p>
<a href="#" title="">更多說明</a>
</div>
</li>

利用 //a 的 XPath 語法,可以指定 Node 裡的所有 A Tag,參考下列的 Rule 範例:

<copy attributes="href"
theme="/html/body/div[2]/div[2]/ul/li[1]//a"
content="//*[@id='portletwrapper-ID']/dl/dt/span[2]/a" />

七月 31, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Collection Group By View

A Collection in Plone works much like a report or query does in a database. Based on a set of Criteria such as: content types, dates, or keywords, you can search items and display them in a variety of dynamic ways. By default, there are Standard View, Summary View, Full View, Tabular View and Thumbnail View. What I need is to add an Aggregate View (like Group By). Here is how:

First, create a view.py file in the browser folder, where you define the View class. In my case, the results need to be grouped by category field values. Now I get a dictionary like {'category1': [<plone.app.contentlisting.catalog.CatalogContentListingObject instance at /mysite/myfolder/101-c-1>, <plone.app.contentlisting.catalog.CatalogContentListingObject instance at /mysite/myfolder/101-c-2>, <plone.app.contentlisting.catalog.CatalogContentListingObject instance at /mysite/myfolder/101-c-3>], 'category2': [...]}. With TAL nested loop in the aggregate_view.pt template, we can display the result. Finally register this browser view.

Note that this tip might suit only for collections of limited items. There should be much room for performance improvement. For those who are interested in the details how Collection works, see reference at plone.app.contenttypes/behaviors/collection.py

六月 25, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Install Plone on Codio.com

This is a follow-up for Install Plone in under 5 minutes on Codio.com by David Bain, except Plone 4.3.3 standalone installation is used here.

Codio.com 提供線上開發環境,透過瀏覽器就能操作 Linux 系統,效能相當不錯。

臨時需要乾淨的開發或測試環境嗎? 可試看看 Codio 是否滿足需求。已知沒有 sudo 權限,透過 Box Parts 可以擴充程式語言、資料庫、函式庫等功能,例如 dropbox 就有支援,在持續改進的情況下,說不定教學環境也可採用它。

最簡單的測試方式,是建立一個 Empty Project 的範本。

再從 Tools 選單點選 Terminal 來打開命令介面。

想要安裝 Plone 4.3.3 環境? 在 Terminal 裡執行下列指令:

curl -L http://goo.gl/drKJp8 | bash

在 Project 選單點選 Box Info 可以查詢服務連線的資訊,存取網址的技巧,可參考 Non-Standard Port 的規則說明。或是查看 ChangeLog 了解最新版的支援狀況。

查詢 Package 狀況的範例:

$ parts search python                                                                                                               
apache2_mod_wsgi (3.4)
googleappengine (1.9.5)
jython (2.5.3)
pip (1.5.4-2)
pypy (2.2.1)
python2 (2.7.6-2)
python3 (3.4.1)
setuptools (2.2-2)
swig (2.0.11)
virtualenv (1.11.4-2)

六月 11, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» PyCon APAC 2014 Review

很多過去的事,原本以為只是生命裡的點,你不知道它們會連成怎樣的線,直到機緣成熟,才得以窺見故事的輪廓。

第一年辦 PyCon 時,力邀 Drake 參加,那時彼此不認識,為了介紹這是怎樣的活動,一起吃飯聊天,意外發現我們有哪些共同的朋友。今年,Drake 負責 PyCon APAC 2014 贊助工作,貢獻良多。

PyCon Taiwan 之前的社群聚會,最早包括 2004年 Song 籌辦的 PyZope 活動,還記得的人不多,後來 Thinker 號召的 PycTW 形塑定期活動的基礎,特別是 2011年,活動當天遇到颱風,會眾展現風雨無阻的意志,讓 Yung-Yu 有信心召喚蟒眾啟動定期的大型研討會。台灣年會規模遞增,算是站穩腳步,今年 Yung-Yu 籌畫了專屬的 SciPy 議程,還有 APAC Community Panel,就算三年前能預見這些事,實際看著它們發生,還是有種超現實的感覺。

2000年初學 Python,一見鍾情,雖然懂得很少,還是迫不急待在雜誌上撰文介紹。Tim 那時候是讀者,現在結合 Python 技術開公司,今年成為 PyCon APAC 2014 主席。能由 Mosky 獻花慶生,相信 Tim 那一刻已經忘卻籌備的辛勞。

1995年 Tom 小學剛畢業,學了 Linux 架 BBS 站,2004年學了 Python,現在已經成為全端工程師,最新目標是投入數位音樂表演,今年的閃電秀裡,Tom 展現了創意實作的成果。

PyCon APAC 2014 亮點太多了 [1][2][3],每年規模成長的情況下,號稱這是史上最棒的年會,殆無疑義。

期待明年更棒的年會之餘,別忘了嚮應 Jessica 的呼籲,來年之內為 Python 社群的成長,做一件新鮮事!

六月 6, 2014

marr's weblog
marrtw
marr weblog is about »

tag cloud

» Title Customization Based On URLs

Plone 網站的 <title /> 內容值,預設是由 Content Title 和 Site Title 合併而成,所以瀏覽首頁時,會看到類似「首頁 -- 我的網站」字樣。我想要把結果改成「我的網站」,方法不止一種,最簡單的方法如下:

到 ZMI portal_view_customization 找到 plone.htmlhead.title,它負責 <title /> 的顯示工作。

定義 is_home 變數,判斷網頁位置是否在首頁。

<tal:block define="state context/@@plone_context_state;
is_home python:state.is_portal_root() and state.is_default_page()">
<title tal:condition="python: not is_home" tal:content="structure view/site_title">Site Title</title>
<title tal:condition="python: is_home" tal:content="string:我的網站">Site Title</title>
</tal:block>

以上方法只需要編輯 template 內容,不必修改檔案系統裡的 view 程式碼。

biggo.com.tw

A Django site.