八月 13, 2016

marr's weblog
marrtw
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>

四月 29, 2016

marr's weblog
marrtw
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
is about »

tag cloud

» Get Your PyCon Taiwan 2016 Tickets

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

二月 3, 2016
» Embedded Systems 中的 Resource 管理

開發 Embedded Systems 常常會碰到 f/w 要用到圖、字型、甚至音樂等 resource 的情況。實務上一種處理方式是將這些 resource 轉換後串成一個大的 C array 。然後再用 resource ID 去讀取它們。一些書上稱這種轉換的工具叫 Resource Maker 。不過我不會採取這種作法,雖然還是透過 resource ID 讀取,但不把 resource 轉成 C array ,而是直接轉成 binary 格式,要用時才去 storage 裡 load 進來,因為這樣比較節省記憶體空間。多年前我就用 Python 寫了類似的工具,那時我把這支程式稱作 weave 。後來慢慢精練,演變成今天要介紹的 ResourceLink 。同樣地,這裡我主要也是著重在 ResourceLink 裡用到的領域專用語言,來看看我怎麼描述這些 resource

二月 1, 2016
» 利用 LangConvert 工具處理多國語言

開發 Embedded Systems 相關應用時,常得處理多國語言。而系統資源受限的的場合,就算掛了 OS,往往也沒內建多國語言。這時候只能捲起袖子自己處理了。自幹的過程,很直覺地,多數人都會想到要有個類似右圖這樣的 Excel 字典檔當作翻譯表。有了翻譯表後,我們還要有個字庫(font)。為了存取字庫裡的字,我們要先決定字序(character order)。有了字序後,我們就能根據字序,把翻譯表裡面的多國語言訊息,一一轉換成字序的串列(a sequence of character orders)。要秀某個訊息時,就根據這個字序列,回過頭把字庫裡的字形(glyph)抽取出來顯示。如果要通吃幾乎各國的語言,一個奢侈的做法是直接用 Unicode 當字序,建立完整的字庫。不過這不適合用在資源受限的場合。多年前,我遇到決定字序的問題時,想了一種簡單又好用的表示法。以 ASCII code

一月 28, 2016
» 利用 PicCrop 工具來切圖

記得小學製作海報時,會用剪貼的方式分工,快速拼湊出一張教室海報。時代進步了,現在大家都用電腦,我好幾次觀察到現在美術人員幫忙設計 UI 時,也常常會先把整體畫出來,然後再一塊塊的剪下來。這些剪下來的圖,還有個貼切的稱呼,叫「切圖」 現在有很多現成的切圖工具,幾乎都搭配 Photoshop 使用,甚至 Phothoshop 本身對這道工序也提供一定的支援。不過我沒打算在這介紹這些搭配 Photoshop 的圖形化工具,而是想設計一個專用的語言,來執行這個切圖的動作。 這個語言要告知原始圖檔,然後再列出每張被切下來的圖的位置、大小、甚至名字等。舉個例子,假設我要把圖中八個紅線匡起來的部分,一一切下來存檔。 最簡單的描述方式,大概就長這樣子: # source picture #--------------- ipod-touch-5th-black.png # x, y,

一月 24, 2016
» The Menu Show

接連多日的年假已接近尾聲,吃吃喝喝之餘,很自然地就想到一個跟吃喝有關的練習。雖然年假前在公司搞的相框產品確實用到各式 UI 選單(menu),但我在這裡要聊的是名副其實的菜單(menu)。 為了製作精美的菜單,我用 Google 搜來幾張食物的圖片準備用作底圖,除了一張用作食物主選單底圖外,其餘三張分別用作飲料類、水果類和蔬菜類等用途。考慮到要製作的菜單不只一張,且每張菜單的內容會一直修改,所以我不打算用繪圖軟體繪製菜單,這個重任當然要照慣例,委託給爬說語。要執行這支程式,必須先以 YAML 語法,利用文字編輯器寫下菜單的內容及呈現方式,存成 menu.yaml 。程式執行時會自動讀進這個描述檔,然後描繪出期望的菜單來。例如說,有張菜單長成這樣: 這是一張飲料類的菜單,它有 Coffee, Juice, Soda Water, Tea 等選項,要產生這張菜單, menu.yaml

十月 26, 2015

marr's weblog
marrtw
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
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
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
is about »

tag cloud

» Anaconda on Windows

二月 9, 2015

marr's weblog
marrtw
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
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.

八月 14, 2014

marr's weblog
marrtw
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
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
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
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
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 程式碼。

六月 5, 2014

marr's weblog
marrtw
is about »

tag cloud

» Front Page Editing Made Easy

首頁給人的第一印象,很重要,對 Web Master 而言,他們還在意能否輕易地編輯首頁內容。

長久以來,Plone 有很多模組都想處理這個問題,但改善有限,直到 collective.cover 模組問世,才讓人眼睛一亮。有圖有真相? 先看影片介紹,還有這個範例網站 http://www.vtv.gob.ve/

在實作上,它利用 Cover Content Type 來儲存 Layout 資訊,你可以選用預設 Layout,或是透過 Layout tab 自訂細節。每個小格子被稱為 Tile,它可以再被指派 Carousel、Collection、Embed、RichText 等不同功能。

五月 27, 2014

marr's weblog
marrtw
is about »

tag cloud

» plone.i18n Configuration

Plone 多國語文支援,相當成熟,想要讓網站支援中英文訊息介面,下列是基本的設定技巧:

在 ZMI 的 portal_languages 先勾選 Allow combined language codes like de_DE or en_UK. 並儲存,再從 Allowd Languages 欄位設定要支援的語系值,例如同時要支援「中文」和「英文」,可以先點選 Chinese (Taiwan) (zh-tw) 項目,再按住 Ctrl 鍵,點選 English (en) 並儲存,再從 Default Language 欄位選擇預設語系,例如 Chinese (Taiwan) 就行。

Negotiation Scheme 欄位,通常只需要勾選 Use cookie for manual override. 就行。

預設顯示的訊息文字是「繁體中文(臺灣)」,如果想要修改,可以到 plone.i18n/locales/languages.py 檔案,找到下列的設定內容:

u'zh-tw' : {u'name' : 'Chinese (Taiwan)',
u'native' : '繁體中文(臺灣)',
u'flag' : u'/++resource++country-flags/tw.gif'},

biggo.com.tw

A Django site.