關於本報

自由軟體鑄造場電子報
報主:中央研究院資創中心
創刊日期:2004-06-03
發報頻率:雙週刊
訂閱人數:3,349
官網:

近期電子報


訂閱便利貼


將貼紙語法置入您的網站或部落格當中, 訪客可以輸入mail取得認證信,並按下確認連結後, 快速訂閱您的報紙。
預覽圖
訂閱自由軟體鑄造場電子報報
自由軟體鑄造場電子報
-----------------------------------------------------------------------------------------------------
Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

自由軟體鑄造場電子報
發報時間: 2011-06-18 16:00:00 / 報主:OSSF
[公益聯播]新聞專區
本期目錄
CallGraphviz—依據 cscope、Graphviz 以及 xdot 實作的 call graph visualizer
DrupalCamp Taipei 2011 已開放報名
把開發當興趣的開發者聚會-Hacking Thursday
用自由軟體 Plone 來架設網站 (6)-動態網頁
5 個使用 Drupal 作為架站平台的好理由!
自由軟體鑄造場 誠徵活動企劃及業務推廣專員
自由軟體鑄造場 誠徵網站程式開發工程師
報主的話
CallGraphviz—依據 cscope、Graphviz 以及 xdot 實作的 call graph visualizer

Rex/文

開源工具現狀

許多開發者都有介入中大型專案的經驗,有時候也常常需要理解原始程式的設計,因此或多或少都有在程式碼迷宮中找路的經驗。有些專案,程式碼結構嚴謹,軟體設計時應用設計模式 ( Design Patterns),往往只要見名稱、參數,即可推斷程式結構,閱讀上如沐春風。

但若碰到未經重構的成年老專案,程式邏輯因為年久失修,塞滿各個開發階段的臨時解決方案,常常已經複雜到難以一眼望穿理解。若是記憶力虛弱如我,常常追了後面幾千行、跳了三個檔,就忘了前面幾個檔案的函式名稱。於是常常以紙本畫流程圖輔助理解,但是手繪圖往往不敵跳來繞去的程式碼邏輯。還是得靠程式碼解析視覺化工具來協助理解。

繪製  call graph 的工具非常多,一般可以分作  dynamic analysis static analysis 兩種作法。在臺灣,最知名的商業版本工具,大概是 Source Insight。不過我不用 Windows,對於缺乏原始碼的開發工具興趣也不大。

開源的 dynamic analysis 包含諸如 Jserv 介紹過CodeViz 或是 ncc。不過這類工具需要 patch GCC,不適合嵌入式系統專案。因爲原始碼常常只支援特定平臺,或是無法取得編譯工具原始碼。此外,不同版本的 compiler 偶爾會造成不同的問題,造成使用上的困難。

一種比較乾淨的作法是像 KCachegrind 利用 valgrind 來收集資料,或 Gprof2Dot 利用 gprof 的輸出資料。再者是利用 GCC 的除錯功能,把 internal representation (RTL) 倒出來,再用 egyptPython-RTL 來判讀或繪圖。

至於開源的  static analysis,則包括 Fred Chien 介紹過cflow,或是 Doxygen 也有類似的繪圖功能。也有工具是配合 cscopeGLOBAL,例如有人幫 cscope 刻過 圖形界面,Vim 有個 CCTree 可用。

CallGraphviz

以上這些工具各有優缺點。最常見的問題是許多工具無法處理  function pointer dynamic dispatch,最終還是需要人力介入。另外一個使用上的困擾是,這些程式會一口氣畫出整個程式碼的結構圖。

太多資訊其實妨礙理解,因爲用途常常只是追一個臭蟲,程式開發者只想畫出特定路徑來釐清問題。而 context-sensitive 的 call graph 測試工具又耗費資源。

若用 CodeLiteCode::BlocksEclipse CDT 等開發工具,這些工具已經內建或者整合了 cscopeGLOBAL,提供 symbol lookup 功能。開發者很容易用滑鼠查閱函式定義或實做,也可以搭配 LXR 來瀏覽程式碼。已經不需要像是 cbrowser 這類專屬的程式碼瀏覽工具。

如果需要手動將目前程式情境視覺化的工具,也可以在網路上找到。網路上已經有其他開發者做了 Bash: C Call Trees and Graphs 或是 global-calltree。或是像 Yao-Po Wang方法,記錄函式進出點,再手動繪圖。

上述工具大多是整合 shell scripts,操作上有點不便。另外我也不喜歡 Call Tree 的圖式,因爲樹狀圖無法表現遞迴或交互關係。

於是查找一下,決定拿 cscope 加上 GraphvizDOT 語法來用,改了一個 CallGraphviz。它的功能是以 Graphviz 做為前端,後端還是使用 cscope 查 symbols,為了可以即時瀏覽便取用 xdot 當作介面。xdot 是以 PyGtk 開發,非常容易更改,不到三百行就加入我需要的功能。

CallGraphviz—依據 cscope、Graphviz 以及 xdot 實作的 call graph visualizer

▲ 圖1 使用 CallGraphviz 自動畫出的程式邏輯流程圖

使用方法:

* 執行 python visualizer.py
* 按下【New】,選擇要分析 C/C++ 專案目錄。
* 於「Search symbol」鍵入要追蹤的函式名稱。
* 每次鍵入新名稱,他會自動對應圖中已輸入函式是否爲 caller or callee,並自動畫圖。

CallGraphviz 可以將繪圖結果存成 dot 格式檔案,然後再利用 dot 指令轉換格式。不過它只紀錄曾經查過的名稱,開啟時重新查 cscope 而已。若圖大時,每次開啟可能會十分緩慢。

CallGraphviz 原始碼可於 github 下載,授權採用 GNU Lesser General Public License。

延伸閱讀:Python Call Graph

作者簡介

蔡志展 (Rex Tsai) 或網名 chihchun,現為自由工作者,從事開源軟體顧問或開發服務。倡議並推廣自由軟體與開放源碼,早期 KaLUG 成員,現常出席 Tossug、Hacking Thursday 聚會,亦是開源人年會(COSCUP)籌備志工。長期 Debian、OpenWrt 使用者。關注議題甚廣,進一步資訊請參考 http://people.debian.org.tw/~chihchun/

DrupalCamp Taipei 2011 已開放報名
Drupal 社群/文

DrupalCamp Taipei 2011 已開放報名2011 年 DrupalCamp 又來跟你碰面了!Drupal 是一個邁向第二個 10 年的 Open Source CMS 系統,將近萬種模組可以被直接安裝應用,全球共有 7000 個以上的開發者加入它的更新和修改,社群活絡程度足以媲美 Linux Kernel 的運作狀況,除此之外、它更連續兩年贏得了 Open Source CMS 平台大獎!

我們將在今年的 7/9、7/10 於台北的中國科技大學(近捷運萬芳醫院站)舉辦為期兩天的活動,預計可以容納 300 人到場共襄盛舉,今年除了一整天的多軌議程外,還有第二天的社群活動,歡迎有興趣參與的朋友可以立刻完成線上報名,以免向隅!

【研討會資訊】
◎ 時間:2011 年 7 月 9 日 ~ 10 日
◎ 地點:台北市文山區興隆路三段 56 號(中國科技大學 台北校區)
◎ 報名網址:http://registrano.com/events/drupalcamp-2011

把開發當興趣的開發者聚會-Hacking Thursday

李婉婷/採訪

你是否有參加過類似聚會的經驗,參與者為了共同興趣而相聚,聚會中笑鬧聲、交談聲不曾間斷,令人放鬆並且投入,往往等到即將散會,都還來不及瞄一眼牆上時鐘,才驚覺美好的時光飛逝得如此迅速。對於熱衷於寫程式的開放源碼開發者而言,Hacking Thursday(以下簡稱 H4)就是這樣的一個聚會。

每個星期四的晚上,都會有一群開發者在 101 迎風城咖啡主題美食館南西店(如遇店家整修,則可能改至民權西路 11 號之 101 咖啡主題美食館民權店)裡進行固定聚會。H4 聚會沒有事前安排固定主題,完全以隨性、自由的方式分享;無論是工作上遇到的難題亦或是最近習得的新技術,都是成員們口中談論的話題。有時討論狀況過於熱烈時,興致一來還會當場架起投影機及錄影設備開始進行實作分享。除此之外,成員們還會一起開發開源專案,從歷史來說,H4 聚會就是先從開發討論開始,漸漸演變成現在十幾個人的固定社群聚會。

起初 Mat 和 Thinker 兩個人於 Tossug 社群聚會中結識,大約從 2009 年 4 月開始,因為想要一起做專案,於是另外相約在星期四碰面討論,後來經由社群朋友的口耳相傳,漸漸有愈來愈多人來共同參與。而在 Mat 的努力奔走維繫之下,聚會的人數得以維持在一定的水準,其後,參與 H4 聚會也就成為國內開源專案的開發者,在星期四下班後的另一個選擇。

或許是因為對於寫程式有一股莫名的熱忱,H4 的成員往往會將程式融入到生活中,遇到無法決定的大小事都會想要用程式來解決。例如要決定每個人分享的順序或是遇到要抽籤的時候,就會有人主動開始寫程式,用程式亂數產生的結果來決定分享的順序或選出籤王是誰。還有一次因為聚會地點沒有定論,也是透過分析程式,將每個人住家的經緯度輸入去計算,找出對每個人來說最方便的最佳解。另外,對於重複的、不需動腦的例行公事,H4 成員也都交由機器人來代勞,寫了一支機器人程式,在論壇上固定發送聚會通知,以最省力且有效率的方式達成目的。

除了將程式帶進自己的實際生活外,對於技術面的公共事務 H4 的成員也展現出十足的熱情。不難發現他們經常在各大論壇上出沒,有人提出技術相關的疑惑時,他們就會跳出來幫這些疑難雜症找出解答,將程式的 source code 挖出來研究,找到問題所在,並將相關的 Bug 修改好。也因為看到 H4 成員對於開發的投入及寫程式的熱情,不乏國內廠商紛紛主動提供外包案或工作職缺的資訊到 H4 論壇上,不僅如此,H4 輕鬆自在又能提升實力的聚會模式也被社群朋友帶到香港,今年 5 月香港的開發者成立了 Hacking Thursday Hong Kong-駭能工程,並在其官方部落格上聲明舉辦開發者聚會的點子是源自台灣 Hacking Thursday 聚會,從這個範例看來,在許多方面 H4 聚會都已經受到各界的認同與肯定。

把開發當興趣的開發者聚會-Hacking Thursday
▲ H4 聚會平常歡樂討論的情形

其實有很多參與 H4 的社群朋友都不是資訊相關領域的本科生,H4 雖然是開發者的聚會,但是也有不少創投、自由工作者、藝術家等以寫程式為興趣的開發者共同參與。H4 的成員把寫程式當成一種興趣,有不少人是靠著自學的方式投入開發的行列。成員 FourDollars 說:「對寫程式有沒有熱忱看眼神就知道了,熱愛寫程式的開發者在談論技術時,眼睛會發亮,並且散發出專注、狂熱的感覺!」

撇去白天上班的緊繃壓力,晚上在 H4 與朋友研究、交流新技術與新發現,開玩笑時可以放肆大笑,研究技術時可以認真投入,對什麼專案有興趣就找志同道合的朋友合作開發!對於 H4 成員來說,聚會不僅是個可以放鬆和增進能力的地方,還是一個認識朋友結交知己的場所,在這樣互相合作進步的動力驅使之下,不但能激發參與者更多創意點子,更能找到協力開發程式的樂趣與能量。

Hacking Thursday 官方網站:
http://hackingthursday.wikidot.com/

Hacking Thursday Google 網上論壇:http://groups.google.com/group/hackingthursday?hl=zh-TW

用自由軟體 Plone 來架設網站 (6)-動態網頁

marr/文

在前篇文章裡,我們已經建置了 Event Folder Signup 兩個型別,接著,仍要依照專案需求,繼續調整功能及程式邏輯。展現網站功能的時候,我們總希望它能緊密結合視覺設計成果,另一方面,套用新的視覺設計時,會希望它不影響既有的程式邏輯。那麼 Plone 如何做到這個要求?控制視覺設計的檔案又放在哪裡呢?


Plone 系統預設的網頁呈現效果,著重在功能上,而且緊扣著內容管理的動線邏輯,這在 Intranet 的場合,可能已經足夠,但在對外服務的網站場合,通常需要調整頁面。在本文裡,我們將介紹佈景主題、視覺元件、動態網頁的相關技巧。

 

 

準備工作

 

之前介紹過 buildout.cfg 檔案,裡面有個 debug-mode 參數,記得要指定為 on,執行 bin/buildout 生效後,它會動態記錄在 parts/instance/etc/zope.conf 裡面,線上的 Plone 就會即時反應 HTML CSS 的修改結果,在 ZMI portal_css portal_javascripts 裡,也看得到 Development mode 選項啟用中,如圖1 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖1 portal_css Development mode 選項

 

瀏覽器通常會搭載輔助工具,協助存取 HTMLCSSJavaScript 檔案資源,以 Firefox 為例,搭配安裝 Firebug 後,利用 inspect 選項檢視 layout 和網頁元件,或是離線編輯 HTML CSS 內容,都能帶來事半功倍之效,如圖2 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖2 Firebug 操作畫面範例

 

以上只是最基本的選項及工具,想要調整更多項目,當然可以搭配其他工具,或是自行閱讀工具的細項說明。


 

佈景主題

 

我們把 Theme 稱為「佈景主題」,它是網站整體視覺設計的成果,包括 layoutcoloricon 之類的設計元素,還有 page templatestyle sheetimagejavascript 資源檔案。

Plone 4.0.x 預設的佈景主題稱為 Sunburst,值得一提的是,部份功能使用 AJAX 效果,畫面外觀如圖3 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖3 Sunburst 佈景主題畫面

 

Sunburst layout 概分為四個區塊,如圖4 所示。

1. 表頭區塊

2. 主要內容區塊

3. 資訊方框區塊

4. 表尾區塊

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖4 Sunburst layout 示意

 

就既有的系統架構而言,佈景主題是 Plone 裡的一個模組,想換佈景主題,跟啟用新模組的步驟一樣,先在 buildout.cfg 加上模組名稱,下載安裝後,再到 Plone Setup Theme settings 裡選定想要的佈景主題,如圖5 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖5 佈景主題設定畫面

 

Default theme 下拉選單裡,可以看到 Plone Classic Theme 選項,它是 Plone 4.0.x 以前的預設佈景主題。

 

 

視覺元件的處理

 

由於佈景主題模組裡的許多元件,也都適合獨立介紹和運作,因此,我們另外將它們統稱為視覺元件。目前 Plone 處理視覺元件的架構,整理如圖6 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖6 Plone 視覺元件架構

 

實作視覺元件時,具體的方式主要分成四類:

1Skin Layer 方式-通常是透過 ZMI portal_skins 目錄,編輯裡面的 Page TemplateCSSPython Script。這個機制屬於舊的方式,它的功能可以完整由下列的其他方式取代。

2Browser View 方式-View Python class Page Template 組成,透過 configure.zcml 檔案註冊後,可以透過 http://localhost/mysite/@@my_view 的形式來執行。

3Viewlet 方式-和 Browser View 類似,但需要搭配一個 Viewlet Manager 來註冊。

4Portlet 方式-和 Viewlet 類似,但可以搭配設定檔,在特定的 Portlet Manager 裡顯示。它的顯示位置預設在 layout 的資訊方框區塊裡。

 

這麼多種方式,不如找一個簡單的切入點來示範,例如我們只想調整佈景主題裡的一部份,像是取消搜尋方框的顯示,該怎樣辦呢?

 

 

Viewlet 和 Viewlet Manager


Plone 網站首頁為例,諸如 logo、搜尋方框、導覽列,都是一個 Viewlet,數個 Viewlet 再由一個 Viewlet Manager 管理。管理者可以從 http://localhost:8080/mysite/@@manage-viewlets 之類的網址,進入 Viewlet 管理介面,如圖7 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖7 @@manage-viewlets 管理介面

 

每個 Viewlet 都有自己的名稱,像 logo 的名稱是 plone.logo,每個 Viewlet Manager 也有自己的名稱,像表頭區塊的名稱是 plone.portaltop。同時,Viewlet 可以被指定隱藏或顯示,以 plone.searchbox 為例,點擊 Hide 選項後,搜尋方框就被取消顯示,另外,也可以在同一個 Viewlet Manager 裡調整順序,如圖8 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖8 Viewlet 設定項目示範

 

透過 Viewlet Viewlet Manager,可以輕鬆管理 Portlet 之外的視覺元件大項,但是,Viewlet Manager 的順序和顯示與否,又是如何被控制的呢?

 

 

main_template

 

ZMI portal_skins 裡,點選 Properties 頁籤,在畫面下方可以看到 Default skin 設定為 Sunburst Theme,因此 Sunburst Theme Skin Layer 清單項目,包括 customsunburst_imagessunburst_templates,會依序被讀取,如圖9 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖9 Sunburst Theme Skin Layer 清單

 

回到 portal_skins Contents 頁籤,從 sunburst_templates 可以找到一個 Filesystem Directory View 物件,名稱叫做 main_template,它就是控制 Viewlet manager 順序和顯示與否的檔案,如圖10 所示。

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖10 sunburst_templates 包含的 main_template

 

sunburst_templates 是一個 Skin Layer 目錄,main_template 是一個 Page Template 檔案,留意到程式碼的內容呈現灰色底,代表不能修改,要點選 Customize 按鈕後,才可以修改 main_template 的程式碼,如圖11 所示。

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖11 點選 Customize 按鈕可以修改 Page Template

 

上述動作會把 main_template 檔案,從 sunburst_templates 複製到 custom 目錄,留意到程式碼的內容呈現白色底,代表可以編輯,試著讓<div tal:replace="structure provider:plone.portaltop" />失效,這代表取消 plone.portaltop 這個 Viewlet Manager 的顯示,如圖12 所示。

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖12 編輯 main_template 取消 plone.portaltop

 

 

Skin Layer

 

練習操作後,讓我們檢視 Skin Layer 的運作原理。以 Sunburst Theme 為例,Plone 會由上而下尋找資源檔案,也就是 customsunburst_imagessunburst_templates 之類的順序,尋找資源檔案,如圖13 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖13 Sunburst Theme layer 順序設定值

 

每個 layer 裡包含數個資源檔案,像是圖檔、CSSPage Template 檔案,例如 sunburst_images 裡找得到許多圖檔,sunburst_styles 裡找得到許多 CSS 檔案。

 

數個 layer 可以組成一個 Theme Skin,以 Plone Default 為例,這個 Skin 最上層的 layer custom,如果 custom 目錄裡有個 logo.jpg 圖檔,它會蓋掉 plone_image 目錄裡的 logo.jpg,如圖14 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖14 custom 目錄的資源檔案優先被讀取

 

圖檔 logo.jpg 的來源,可以進入某個 layer 點擊 Custom 按鈕獲得,也可以直接在 custom 目錄,從項目下拉選單新增 Image 獲得。我們沒有示範 CSS 或其他資源檔案的例子,但它們的運作原理跟操作方式,都是完全一樣的。

 

Skin Layer 雖然是舊的方式,由於設定方式簡單,目前還是常被使用,像是換 logo CSS 的場合,特別適合用這種方式。

 

 

Page Template

 

如前所述,不管用哪一種視覺元件的處理方式,都會牽涉 Page Template,接著,我們把焦點放在這個資源檔案上。

 

Page Template 有時也稱為 Zope Page Template (ZPT),在檔案系統裡,它的副檔名是 .pt,以 XHTML 為基礎,也就是相容於 XML 標準的 HTML 語法,XHTML 要求程式碼符合 well formed 格式,例如使用 <img />、<span></span>這樣的格式,還有正確的巢狀結構,並使用小寫英文的標籤格式。

 

Page Template 使用 Template Attribute Language 動態網頁語法,簡稱為 TAL。在 TAL 裡,包含了描述屬性資訊的標籤語法,最簡化的 TAL 語法範例,參考圖15 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖15 TAL 標籤語法示意

 

其中 <title>... </title>是原本 HTML 語法的部份,tal:content="here/title" 的部份則是 XML namespaceTAL 語法統一以 tal: 為首,content= 部份用來指明要設定 的內容,而 "here/title" TAL expression 內容,這類的 expression 被規定在 TAL Expression Syntax (TALES) 裡。

 

當網頁版面人員使用 Dreamweaver 之類的工具,讀取上述 XHTML 原始碼時,並不會造成無法解讀的困擾,畫面上會順利出現「Page Title」的標題字樣。當這樣的 Page Template 檔案存放於 Zope 系統裡,它會搭配物件的屬性值與物件方法,動態產生網頁內容,包括執行邏輯判斷和錯誤處理等。

 

不過,Page Template 不應該拿來處理 subroutine class,這類的程式功能,應該寫在 Python Script 裡,再由 Page Template 呼叫取值和顯示。接著,為了入門練習的用途,我們直接在 ZMI 裡,搭配 Plone 系統來建立最簡單的 Page Template

 

 

練習 Page Template 的建立

 

為了練習用途,我們先在 ZMI Plone Site 裡,從新增物件項目的下拉選單,選擇 Page Template,如圖16 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖16 ZMI 裡新增 Page Template

 

在新增頁面的 Id 欄位填寫識別碼,以 mypage 為例,它會成為 URL 的一部份,點選 Add and Edit 按鈕,如圖17 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖17 Page Template 新增頁面

 

在編輯頁面,可以看到預設的程式碼內容,點選 Save Changes 將程式碼儲存生效後,就可以點選 Test 頁籤,檢視程式碼的執行結果,如圖18 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖18 Page Template 編輯頁面

 

預設的執行結果,只出現的簡單畫面,包括 title id 這兩個動態產生的變數值。回到瀏覽器的前一頁後,可以繼續編輯 Page Template 的程式碼內容,如圖19 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖19 預設的 Page Template 執行畫面

 

試著在圖4 Title 欄位,填上內容,按 Save Changes 後,再次測試時,會看見剛才填上的 Title 內容。

 

那麼,我們該如何套上佈景主題,或是讓網頁看起來更豐富呢?

 

 

METAL 巨集語法

 

套用佈景主題的方法,是在<html>裡使用 metal:use-macro="context/main_template/macros/master",並在<body>裡使用<metal></metal>標籤語法,簡化的程式碼範例,如圖20 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖20 使用 METAL 語法的 Page Template

 

我們利用 METAL (Macro Expansion for TAL) 語法,快速引用原本的佈景主題設計成果。上述程式碼範例的顯示結果,如圖21 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖21 套用佈景主題的 Page Template 執行結果

 

巨集 (Macro) 的功能,是讓特定的 HTML 段落,能夠重覆被使用。METAL 是搭配 TAL 的巨集語法,語法以 metal: 開頭,先要有個 define-macro 的內容,後來的 Page Template 才可以用 use-macro 引入巨集內容。例子裡的 use-macro="context/main_template/macros/master",表示在 main_template 裡有定義一個名稱為 master 的巨集,如圖22 所示。

 

用自由軟體 Plone 來架設網站 (6)-動態網頁

▲ 圖22 main_template 定義的 master 巨集

 

 

結論

 

轉寄『第 174 期 CallGraphviz—依據 cscope、Graphviz 以及 xdot 實作的 call graph visualizer』這期電子報

寄信人暱稱  寄信人email
收信人暱稱  收信人email

  • 社群留言
  • 留言報主