2011/12/14

OFBiz Go

App 很紅, 主要在行動設備上, 上下游都很火紅。要談的 App 是現在不太紅的 Ent App (Enterprise Applications), 或是說已經紅過了, 但仍然是每個公司, 組織都會用到的。

App 多是產品, 而 Ent App 是種社會(Social), 俗名是江湖, 充滿交流與妥協, 大多以專案形式進行。就算從產品開始, 後面也會帶專案, 常見區分出軟體, 硬體, 開發, 維護, … 各個階段。

由於 Ent App 牽涉層面通常既廣又深, 以技術角度來看, 擴散方式(銷售, 安裝)一直沒太大改變。現在雖然服務導向, 雲端喊得震天嘎響, 但除了網路基礎服務(信件,檔案), Web應用或特殊應用, 要把 Ent App 放上去, 應該還有些東西要準備好。用雲端的榜樣電與水比擬, 水除了自來水, 還有各式來源; 電除了公共設施, 也有可移動型的, 或私人備援。因此資料的移動能力要具備, 否則還是有些不足。

開放源碼讓技術普及, 加上硬體設備的大幅提升, 過去得詳加規劃, 才能執行的 Ent App, 現在只要在雲端或筆電開個 VM (虛擬機器) 就行開工。再者, 小公司不需要 24 小時運轉的系統, 功能有的話, 需要時再開啟。甚至中型單位, 只要合宜的環境及配套規劃, 也能朝這方面努力。

首先, 要面對的問題是 … 怎麼去開始?

OFBiz 下載頁面中, 寫明只要有 JDK(Java 1.6 SDK), 下載 zip 後解開壓縮檔, 執行指令就可以開始。

似乎還算容易?

但每個平台準備 JDK 其實都不太一樣, 更不用說如果發生衝突的話要怎麼辦, 例如在 Linux 上用 OpenJDK。這些說明字句雖少, 看起來簡單, 毫無疑問是寫給工程人員看的。再加上 Ent App 的社會屬性是有機成長, 如果要修改, 要調整, 按照慣例就得靠自學, 或找人助拳。

以整個過程來看, 愈到後面, 障礙愈高, 的確是不太容易推動。

之前在一種應用源碼管理的實作討論過 可短小, 可長久, 可分享 的客製化方式。路雖然通了一小段, 但想想, 比原來 OFBiz 官方的安裝方式還要複雜, 素人要開始, 會有不小的障礙。

因此做了 OFBiz Go 用一個步驟完成 所有 繁瑣的準備工作。

準備工作有:

  1. 下載必須的 JDK, Python, Subversion, Mercurial 以及相關工具(patch, diff, cURL, 或 Wget), Windows 要再加 MinGW
  2. 安裝妥上面這些東西, 做好設定 … 例如系統變數, Mercurial 的設定, 與 virtualenv 的環境。

當然如果機器上已經有的軟體項目, 就略過不下載, 也不安裝。

寫上一篇的時候, 略過這些步驟。對熟悉這些工具的人, 早就備妥; 但不熟悉的人, 繁瑣且容易漏東漏西的過程, 反而造成困擾。即使自己做, 將這些裝到 Linux, 也碰上不少問題。

想做個 VM 來用, 但每次要把數 GB 的東西搬來搬去, 還得搬進雲裡頭, 舉重若輕恐怕也不太容易辦到。

在支援 Windows 前提下, 也考慮 Puppet, Chef, 或老牌 CFEngine 這類 組態管理 工具。但即便輕如 CFEngine 都必須做額外的安裝設定, 所以這工具還是留給 應用系統, 做為其中的組件。

剩下可用的大概就是系統腳本語言(Shell Script)。

OFBiz Go 是先在 OS X 上寫個 .sh 做完上述工作。然後找到 Windows 2008 用 Powershell 寫個 .ps1。最後用 VMWare 開啟 Ubuntu 11.10, 原本認為 OS X 小改就可以用, 但還是改了不少。

比較特別是 Powershell 挺有 Power 的 … 要正確合法下載 JDK, 需使用者同意。Powershell 可控制 IE 瀏覽器帶出正確下載網頁, 當使用者點選同意後, 繼續腳本的工作。

目前在 OS X 10.6, Windows 2008R2 / 7, 還有 Ubuntu 11.10 測試過。OS X 可能會不太行, 因為環境不乾淨。;-)

只要腳本的下載, 安裝, 驗證的工作做完, 就可和 應用程式源碼溝通。把繁瑣的過程, 劃分成兩個階段, 方便入門者, 也方便自己。

由於大部份工具和 Python 相關(Fabric, MQ), 下週三(2011/12/21) 晚上 19:30 在新竹的 PyHUG 會描述 配置方式應用客製 兩階段的安排, 及運作細節。除了 Ent App, 很多類似的狀況, 也可用相同方式處理。歡迎參加, 和我們一起討論。

2011/10/31

數位中樞

今年初(2011)在考慮資料問題, 腦中閃過一個字詞 "data hub", 而後 data 範圍擴大, 改為 digital。在網路搜尋 "digital hub", 赫然發現 10 年前已在某個場合上提出

賈伯斯先生當時提出 digital hub 是 Mac, 圍繞 hub 周圍的是音樂播放器, 手機, 數位相機/攝影機, 影音播放, PDA, ... 等等設備。

Digial Hub

看了一會, 難免感嘆即使同個字詞, 在不同背景產生的意義與結果是完全不同。特別是 hub 旁邊的設備已被征戰過一輪, 圖片的戰略意義更能凸顯出來。

上禮拜和某長輩聊到創業的話題, 提到 digital hub。再搜尋一次, 果然有人把該圖視為霸業的開端, 而在今年中 digital hub 向雲端轉進

另外, 也看到我們的 B 社, 相隔 2 年, 在 2002 年末就追上驥尾, 推出產品, 其實算快了。但和韓國的 S 社比較, 就很堪玩味。

最後心得是 ... 如果常留意業界資訊, 應該就不會去想 digital hub 這組字詞。

2011/10/02

泛 Markdown 編輯器

Markdown 專治滑鼠過動, 加持文件檔案撰寫。主要功效是運鍵如飛, 也能有好看好編的文件。

即便使用 Markdown 只要能輸入文字的編輯器都行, 然後再加工處理。先前找相關軟體, 只有少數編輯器, 網誌特用編輯器, 還有就是深具實驗性但得常重開程式的佛心開源類。現在相關應用已遍地開花, 這幾天在更新一些軟體, 就發覺 Markdown 被普遍支援且種類繁多, 也因此補入一些工具 …

BBEdit TextMate Espresso MarsEdit nvALT Scrivener Byword Marked
格式 MD MD/MMD MD MD MMD MMD MMD MMD
預覽 即時 手動 手動 即時 即時 批次 手動 唯讀
用途 通用編輯器 網誌庫 文件庫 專寫
(M)MD擋
專看
(M)MD擋
特色 老牌 現代 網頁 網誌 Simplenote
同步
寫作 好看 方便
$ $$ $$ $$$ $$ 0 $$ $ $

這樣看下來, 剛開始入門的首選非 nvALT 莫屬, 有看到不少都是 Byword + Marked 組合搭配使用。個人是習慣所有文件與工作日誌都放在 Scrivener, 因為分門別類/關聯/搜尋/輸出都便利。檔案編寫原本用 BBEdit, 正試用 Byword + Marked。另外 nvALTSimplenote 同步的特性, 方便文件跨平台與透過瀏覽器分享, 也置入工作流程中 …

2011/04/28

一種應用源碼管理的實作

這是之前 應用系統的版本管理 一文的實作, 目的是開源應用系統的版本管理。嘗試解決應用系統的客製化部份, 除了快速跟隨主要版本的提升, 同時也方便系統的繁殖 ... 預防天災(?)

這裡以 OFBiz r1096871 為例, 檔案有 {java:1436, xml:2626, groovy:454, properties:103, js:451, css:101, jar:391}, 它一直保持在更新的 狀態

面對必要的客製化, 過去常用上游分支 (vender branch) 手法處理, 以固定目錄版本管理為主, 實務上要面對許多細節。現在流行的分散式版本管理, 加上 rebase 大大改善舊有的方式。但分支有版本相依的特性, 而 OFBiz 的版本存檔 (snapshot) 就有 215mb 之譜 ... 要保存和轉移都負擔。

利用補丁管理(Patch Management)是不錯的主意, Mercurial 的 MQ 到 1.8 已經相當成熟。唯一問題是 OFBiz 使用 Apache 官方版本管理 Subversion, 由於版本存檔太大導致 hg-svn 掛點, 不得不生出對策。

因此, 題目變成上游是 svn (原本用 git, 簡化問題還是用 svn 示範), 實際處理用 hg 加 mq。

以自己流通的 mq 版本存檔為例, 大小約 100kb 左右(zip), svn 與對應 hg 則依需要而建。在 hg 功能的協助下, 能快速跟隨 trunk 版本更新, 而 mq 存檔小也利於保存和繁殖。(OFBiz 的 mq 範例放在 bitbucket )

但是實際運作起來, 操作有些瑣碎, 對象也繁多 ... 還好有 Fabric 加持簡化成三種操作, 得以省略一堆指令。

三種操作

  1. 初始 (init)
    拿到 mq 存檔, 加上 OFBiz Apache 上的 zip 檔 (附帶 .svn)。先把 OFBiz zip 檔解開有了 svn 儲存庫 (repository), 再更新與 mq 相同的 svn rev. 版本, 接著複製到 hg 儲存庫。

  2. 更新 (update)
    因應上游 trunk 更新, 把 svn 儲存庫與上游同步, 再更新 hg 儲存庫, 最後把 mq 做 rebase 處理。需要留意 OFBiz 會更新 *jar, 是不在 svn diff 服務範圍, 得由外部 diff 助拳。而後, 視情況對 mq 進行提交 (mqcommit), 或上送(mqpush)。

  3. mq變更 (mqpull)
    上游版本變更與驗證已完成, 並上送 bitbucket (第二個操作)。這時要對運作端進行更新, 先把新的 mq 取下, 依據新 mq 更新 svn 儲存庫, 同時更新對應 hg 儲存庫。


一般使用只要用 初始mq變更 就能保持版本換新, 僅在開發與測試需要 更新(mq commit/push) 的機制。

常見方式是: 只有開發與測試使用版本管理工具, 運作端用 rsync 之類工具同步, 符合標準 開發,
測試, 正式環境 分階段的開發週期。

用 svn-hg-mq 的好處是可從容面對應用系統會遇到的因地制宜 ... 如果不時在 正式環境 被要求改一點顯示文字或邏輯, 用此法就放手去改。然後以 mq commit 保存差異並列管, 之後再看看要怎麼處理, 同時也可放心進行上游版本更新(如果有的話)。

假使開發語言單一, 系統規模在一定範圍之內, 人力還是可以處理。而像 OFBiz 有 java, xml, groovy, ... 子系統多, 關連又盤根錯節, 就最好有固定的方式處理。

實際操作

在 OS X 10.6 + macports 與 Ubuntu 10.10 測試過。

要有 gcc, python, virtualenv, apple/sun jdk 6 (openjdk 6 還是無法使用 OFBiz)。因為 mercurial 1.8 和 fabric 1.0.1 都要用新版, 習慣用 virtualenv 來建, 這時得有 gcc 相關工具備著。


環境建立:
@ /w/proj
$ virutalenv --no-site-packages fab
$ cd fab
$ source bin/activate
(fab) $ pip install mercurial
...
(fab) $ pip install fabric
...
(fab) $ curl -O https://bitbucket.org/tcc/ofbiz-util/raw/38e378fef189/fabfile.py


準備 ~/.hgrc:
[ui]
username = jia@side.org
[extensions]
pager = 
hgext.mq = 
[pager]
pager = LESS='FSRX' less

注意 username, pager, mq 都要有 ... fabfile.py 會用到。


執行:
假設主要目錄是 /w/proj/fab/ofbiz, 會在下面自動建立 svn/, hg/, zip/ 三個目錄 ...
  1. svn/ 目錄為 svn 儲存庫, 和遠端 svn 同步。
  2. hg/ 目錄為 hg 儲存庫, 用來執行應用系統。和本地 svn/ 同步, 並且以 hg-mq 進行客製化處理。
  3. zip/ 目錄存放 ofbiz-trunk-current.zip 檔案, 只在 "初始" 步驟有用, 之後可刪除。
  • 進行初始儲存庫:
    @ /w/proj/fab
    $ source bin/activate
    (fab) $ fab init:/w/proj/fab/ofbiz
    ...
    就會進行, 由於部份操作挺費時間, 或須備妥網路, 像下載 ofbiz-trunk-current.zip 會停下來詢問, 若要執行到底:
    (fab) $ fab init:/w/proj/fab/ofbiz,auto=Y
    ...
    加上參數 auto=Y 即可。
  • 當 mq@bitbucket 有新版本要更新:
    (fab) $ fab mqpull:/w/proj/fab/ofbiz,sync=Y
    ...
    若沒有 sync=Y 就得手動進行 sync:
    (fab) $ fab sync:/w/proj/fab/ofbiz
    ...
目前 mq@bitbucket 沒有開放更新, 得自行建立 mq repository ... 修改 fabfile.py:
  1. 註解第 31 列 hg_mq_url = 'https://bitbucket.org/tcc/ofbiz-mq'。
  2. 打開第 32 列 hg_mq_url = 'file:///w/proj/ofbiz/mq2' 做必要修改。
然後與 trunk@OFBiz 同步:
(fab) $ fab update:/w/proj/fab/ofbiz
...
接著提交寫入, 並上送:
(fab) $ fab mqcommit:/w/proj/fab/ofbiz,push=Y
...
若沒下 push=Y, 要手動進行上送:
(fab) $ fab mqpush:/w/proj/fab/ofbiz
...

全部操作就這樣了。

建置 OFBiz 前先置入 hg-mq:
@/w/proj/fab/ofbiz/hg
(fab) $ hg qpush -a
...

然後按 OFBiz 安裝進行:
(fab) $ ./ant clean-all
...
(fab) $ ./ant run-install-extseed
...
(fab) $ ./ant create-admin-user-login
...
(fab) $ ./startofbiz.sh

...

如果要建立另一份系統做開發, 把目錄 /w/proj/fab/ofbiz/ 改為其他的, 例如 /w/proj/yi/side/ ... 依據客製 hg-mq 很快就能建立一套新的應用系統。不用辛辛苦苦裝完系統, 再逐一做客製相關設定。

試試看, 或許有更好的做法 :)

2011/04/20

oXygen XML 中文 PDF 輸出

一直用 oXygen 編輯器來處理 XML 相關檔案, 後來發覺寫文件的功能日益強大, 但輸出 PDF 有些障礙。也不是太大問題, 需要一些設定, 這裡的說明將包含 FO, Docbook, DITA。此外, 索引方面以 DITA 輸出為例, 示範更換 FO 處理器為 XEP 個人版。

以下環境是 OS X 10.6 加上 oXygen XML Editor 12.1。 請留意檔案位置, Windows 下注意 TTF 檔的差異。

另外, FO, Docbook, DITA 都有自由軟體套件, 協助編寫文件, 沒有 oXygen 編輯器也能運作。

FO 設定

  1. 產生字型規格檔, 參考: http://xmlgraphics.apache.org/fop/0.95/fonts.html

    假定把 FOP 1.0 安裝在 /w/j/x/fop-1.0 目錄。執行下列指令, 產生字型規格檔:

    $ export CL=/w/j/x/fop-1.0/build/fop.jar:/w/j/x/fop-1.0/lib/avalon-\
    framework.jar:/w/j/x/fop-1.0/lib/commons-logging.jar:/w/j/x/fop-\
    1.0/lib/commons-io.jar
    $ java -cp $CL org.apache.fop.fonts.apps.TTFReader \
    /Library/Fonts/Arial\ Unicode.ttf ArialUnicode.xml

    產生 ArialUnicode.xml, 放在 /w/proj/xml/fo/ArialUnicode.xml

  2. 建立 FOP 設定檔 userconfig.xml, 放在 /w/proj/xml/fo/userconfig.xml

    <fop version="1.0">
      <base>.</base>
      <renderers>
        <renderer mime="application/pdf">
          <filterList>
            <value>flate</value>
          </filterList>
          <fonts>
            <font metrics-url="file:///w/proj/xml/fo/ArialUnicode.xml" 
                embed-url="file:///Library/Fonts/Arial Unicode.ttf"
                kerning="yes">
              <font-triplet name="ArialUnicodeMS" style="normal"
               weight="normal"/>
              <font-triplet name="ArialUnicodeMS" style="normal"
               weight="bold"/>
              <font-triplet name="ArialUnicodeMS" style="italic"
               weight="normal"/>
              <font-triplet name="ArialUnicodeMS" style="italic"
               weight="bold"/>
              <font-triplet name="any" style="normal" weight="normal"/>
              <font-triplet name="any" style="normal" weight="bold"/>
            </font>
          </fonts>
        </renderer>
      </renderers>
      </fop>

    其中字型名稱 name="ArialUnicodeMS" 從 /w/proj/xml/fo/ArialUnicode.xml 裡頭的名稱參考而來。

  3. 修改 oXygen 設定 Preferences ➠ XML ➠ XSLT-FO-XQuery ➠ XQuery ➠ FO Processors

    找到 Configure file 項目改為 /w/proj/xml/fo/userconfig.xml

中文 FO 測試

  1. 編修原 oxygen/samples/fo/Miscellances/helloWorld.fo 改為 helloWorld-u8.fo:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- Example from: http://www.renderx.net
      Copyright © 2004 RenderX, Inc.-->
    <fo:root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page">
          <fo:region-body margin="1in"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body" font-family="ArialUnicodeMS">
          <fo:block>Hello, world! 大家好!</fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  2. 產生 PDF: 選單 Document ➠ Transformation ➠ Apply Transformation Senario 產生。

    或按 cmd + shift + T, 選擇 PDF (第一次要選 FO PDF)。

Docbook 設定

做妥上面 FO 設定。修改 oxygen/frameworks/docbook/xsl/fo/docbook_custom.xsl 在 </xsl:stylesheet> 前, <!-- end oXygen patch. --> 之後, 加上:

<!-- Traditional Chinese patch -->
<xsl:param name="body.font.family">ArialUnicodeMS</xsl:param>
<xsl:param name="body.font.size">12</xsl:param>
<xsl:param name="monospace.font.family">ArialUnicodeMS</xsl:param>
<xsl:param name="title.font.family">ArialUnicodeMS</xsl:param>
<!-- end Traditional Chinese patch -->

中文 Docbook 測試

  1. 修改 oxygen/samples/docbook/v5/sample.xml。Author 模式下, 在文字後加入中文, 例如:

    <sect1>
        <title>Inline Markup and Images 大家好</title>
  2. 產生 PDF, 同 FO 方式 ... cmd + shift + T 選擇 PDF (第一次要選 Docbook PDF)。

DITA 設定

  1. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/fo/font-mappings.xml

    找到以下字樣:

    <physical-font char-set="Simplified Chinese">
        <font-face>AdobeSongStd-Light</font-face>
    </physical-font>

    增加類似段落(共三處):

    <physical-font char-set="Traditional Chinese">
        <font-face>ArialUnicodeMS</font-face>
    </physical-font>
  2. 複製 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/fo/i18n/zh_CN.xml 成為同目下新檔 zh_TW.xml

    修改此 zh_TW.xml 內容, 把 <alphabet char-set="Simplified Chinese">...</alphabeat> 改為:

    <alphabet char-set="Traditional Chinese">
      <character-set>
        <character-range>
          <start include="yes">&#x0100;</start>
          <end include="yes">&#xff00;</end>
        </character-range>
      </character-set>
    </alphabet>

    很偷懶的方式, 需要修正。

  3. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/fop/conf/fop.xconf

    在 fop ☞ renderers ☞ renderer mime="application/pdf" ☞ fonts 下增加:

    <font metrics-url="file:///w/proj/xml/fo/ArialUnicode.xml"
        embed-url="file:///Library/Fonts/Arial Unicode.ttf" kerning="yes">
      <font-triplet name="ArialUnicodeMS" style="normal" weight="normal"/>
      <font-triplet name="ArialUnicodeMS" style="normal" weight="bold"/>
      <font-triplet name="ArialUnicodeMS" style="italic" weight="normal"/>
      <font-triplet name="ArialUnicodeMS" style="italic" weight="bold"/>
      <font-triplet name="any" style="normal" weight="normal"/>
      <font-triplet name="any" style="normal" weight="bold"/>
    </font>
  4. 建立 zh_TW 必要檔案, 在 oxygen/frameworks/dita/DITA-OT/demo/fo/cfg/common/ 下要有三個檔案:

    • index/zh_TW.xml

      複製 zh_CN.xml 修改, 先將 <language>zh-TW</language> 改為正確對應。下半部所有中文的 index.group 改為只有(也是需要修正):

      <index.group>
        <group.key>中文</group.key>
        <group.label>中文</group.label>
        <group.members>
          <char.set start-range="一" end-range="龤"/>
        </group.members>
      </index.group>
    • properties/zh_TW.properties

      chm.native.encoding=big5
      chm.project.language=0x404 Traditional Chinese
    • vars/zh_TW.xml

      複製修改, 可能必要的是 "Product Name"(顯示在 PDF 上方頁角), 其他隨意。

  5. 修改 oxygen/frameworks/dita/DITA-OT/demo/fo/build.xml 增加:

    <property name="document.locale" value="zh_TW"/>

    在 <property name="customization.dir ...> 上即可。

中文 DITA 測試

  1. 開 oxygen/dita/ 下某 DITA 專案, 開專案下的檔案在 Author 模式下修改, 增加中文字, 例如:

    <title>Changing the oil in your car 測試看看</title>
  2. 產生 PDF, 同 FO/Docbook 方式 ... cmd + shift + T 選擇 PDF (第一次要選 DITA Map PDF)。

安裝 XEP 個人版

FOP 1.0 還不支援索引(indexing)功能, 請參考 http://xmlgraphics.apache.org/fop/compliance.html#fo-object-indexing-section

XEP 個人版非商業用可取代 FOP 產生索引 http://www.renderx.com/download/personal.html

  1. 下載, 安裝到 /w/j/x/XEP/。

  2. 修改 /w/j/x/XEP/xep.xml 增加 (搜尋到 font-group):

    <font-group xml:base="file:/Users/tcchou/Library/Fonts/"
        label="Windows TrueType" embed="true" subset="true"> 
      <font-family name="ArialUnicodeMS">
        <font><font-data ttf="Arial Unicode.ttf"/></font>
      </font-family>
    </font-group>

    把 Arial Unicode.ttf 複製到個人字型目錄, 因為還有其他字型 ...

  3. oxygen 增加 XEP

    Preferences ➠ XML ➠ XSLT-FO-XQuery ➠ XQuery ➠ FO Processors

    點選 "If you have a custom XEP installation ..." 旁的 Browse 按鈕, 選擇 /w/j/x/XEP/xep 。

  4. 點選 "Configure Transformation Scenario", Duplicate "DITA Map PDF" 選擇 Processor: XEP 。

  5. 選擇 DITA 下專案(it-book 有 indexing 範例), 產生 PDF ... cmd + shift + T 。

2011/03/28

OSDC.TW Tabledown 演講資料與問答

週日(27) 在 OSDC.TW Tabledown 演講的投影片:


利用一些時間把範例整理上傳到 Google code

除了把 Tabledown 修完, 有個 pip 的 req. 檔案能協助把演講提到的 twill, scotch, mechanize, Beautiful Soup, Tabledown 都給裝妥。先將 python, pip 裝完, 接著再參考 00README.txt。

範例要執行, 可能有困難的地方是將 OFBiz 裝起來。而 User 的 Id 預設為數值累加, 不太方便。附上一個修補使 Id 能和 UserName 相同 (試過今天的 trunk)。得事先裝好 Java 6, 接下來再花些時間建系統 ... 有問題的話也請提出 :-)

另外, 把當天遇到的 Q & A 整理如下:
  1. 在某頁從資料庫到試算表的做法為何?
    ⇒ 投影片的試算表是以 "人" 的角度建立資料表達的方式, 都是手工建立的。僅示範從試算表到 Web App 單向, 主要是跨越資料關連,多個畫面,細節這些煩瑣與難度。從資料庫到試算表要自動達成更接近人需要的, 應該是另一個題目。
  2. 如何執行?
    ⇒ 目前範例都是寫死的, 在命令列下執行 XD 日後考慮有無更彈性的做法, 像提供 plugin, 只要準備好試算表加上 plugin 就能處理妥。
  3. 接受的試算表格式? 雲端?
    ⇒ 目前沒有能力處理雲端試算表, 只有 python-excel 專案能接受的 .xls 檔案。
  4. 能否即時執行, 和後端同步?
    ⇒ 範例中時間表(Timesheet)有想過直接與 Web App 同步, 有點這種味道? 但要考量資料同步問題 … 沒直覺的解法, 暫時擱著。([事後] 先解 Q1 問題, 再為 collections 做 diff, 或許類似 git snapshot 做法)
  5. 問題加密 (POS?) … 和 Td 無關, 所以加密 XD
    ⇒ 回覆加密 (POS!)
  6. 範例中 Master 與 Detail 關連?
    ⇒ 簡單版: 沒有關連; 真相版: Master 是鍵值式資料, Detail 是條列式資料 … 原則上都可以多個。而資料的關連由開發者(程式)決定, 例如在專案 Master 有人員 ID 以逗號隔開, 實際上在專案資源畫面有多筆資料。
後來看了 sleepnova 推薦的 Prezi, 另外想到試算表與 XML, Json, Yaml, … 相比, 雖然個個都能記錄資料, 但使用者愛用的原因, 該是較能掌握東西放在哪裡, 即使只有列和行。

感謝四方大德惠予討論, 也謝謝 hcchien 與 OSDC.TW 工作人員的辛勞 :-)

2011/02/18

開放源碼資訊應用系統的開發觀點

資訊應用系統較開放的定義: 公司、組織所需要的應用系統, 下面縮減為企業應用(Ent App), 與當下常見移動 (Mobile) 和 Web 應用有所區別。開放源碼顧名思義即可。身處在公司組織中, 資訊系統所涵蓋的可能是有什麼用什麼, 或依需要採買。企業應用則依公司組織的需求, 所打造的應用 … 有些是獨立系統, 或某個系統的擴充。常要與不同單位, 甚至跨公司組織的各系統聯繫以協同作業。

去年 2010 接觸一個國外頗具規模組織的企業方案導入, 從基礎設施開始到應用系統的那種。儘管方案已落入 M 社手中, 仍有許多可深入思考借鏡之處。

這個需要方案的組織, 雖然考慮過開放源碼方案, 對技術有想像, 對未來有憧憬, 最後還是回到踏實的 … 支援問題。

按捺支援問題, 整理過程中一些溝通討論的部份。

從頭開始的組織, 討論的觀點有多高? 大概有太空那麼高。平常較常用的辭彙字眼, 鮮少在此時派上用場。與非開發者進行討論, 還是得用流行 … 呃, 太空的觀點來溝通, 也難怪不斷有人創造一些東西來滿足。在其中討論的議題有目錄服務, 檔案分享搜尋, 管理監控, 入口網站, 工作流程, 應用系統, … 等。前三個題目, 一般公司組織都給 M 社綁住, 接下來似乎 M 社都把東西都準備好, 都可一次夠足儘管用。

曾被詢問: 如果不用 M 社方案, 這些問題如何解? 兜幾家公司產品才解決又沒參考案例, 說服力自動下降。能否找到適當資源滿足這些要求, 就成了給自己的寒假作業。

選擇以 Java, Python 為基礎, 避免對作業系統的依賴太深。

把問題劃分幾個區塊, 否則以系統/應用分太簡略, 純以開發觀點來看又太複雜:

  • 應用系統: 這是已經存在並使用的應用。ERP, B2B, 入口網站, 網購平台, 生產系統, … 甚是以套件存在的論壇, 而開發成果也在此區塊。
  • 基礎系統: 不需要應用也存在的系統。例如電子郵件, 資料庫, 網站網路服務(Web/FTP), …。
  • 工具: 基本上是支援開發相關工具。像源碼的版本管理, 記錄工作的事例追蹤, 負責測試建置, 文件產生, 資料處理, …
  • 開發作業: 可以是獨立的應用, 但通常除了基礎系統, 也與其他應用系統打交道。現在複雜環境, 選適當語言外, 更需要適當框架加持。

這些區塊的涵蓋面是否恰當, 以流行的 Web 框架來檢視: 資料庫/網站在基礎系統; 編輯器/版本管理在工具區; 開發框架本身在開發作業區; 如果套在入口網站裡, 就看成在應用系統區。

再來把之前討論議題在放進來:
  • 目錄服務: 有名的 OpenLDAP 使用過一陣子, 那時要編得安全一點不太容易。現在 ApacheDS, 有 Java 環境就能很快上手。雖沒 M 社搭配其作業系統的特異功能, 但具備 Kerberos, DNS, NTP, DHCP。另有 Directory Studio 處理綱目和資料都便利, 而單一簽入(SSO)可交給 CAS 處理或 PicketBox。這些放到基礎系統區。
  • 檔案分享搜尋: 從歷史來看, M 社把之前拳王 N 社撂倒後就一直雄據著, 不過移動設備和 Web 普及應該稍有機會推動一下這板塊 … 內容管理交互服務(CMIS)。實作不少, 偏好的是 Nuxeo, 實際選擇視需求而定。也放到基礎系統區。
  • 管理監控: 之前做都是一兩個系統加上數個服務, 要求是把自己做的管好就好, 沒從組織觀點來看。這方面有許多成熟產品, 例如 SpringSurce 有併入 Hyperic。會考慮的是 Zenoss, 畢竟現在有各式各樣服務, 彈性大一些會比較好。而 Java 在開發作業考量與 Zenoss 搭配, 執行記錄方面從 log4j 著手走 syslog 即可。還是放到基礎系統區。
  • 入口網站: 已經流行過好一陣子的題目, 或許每個人都有自己的一套, 就略過。分類的話, 由於依使用方式不同而有差異, 所以放應用系統區。
  • 工作流程: 推薦的是原 jBPM 開發人員從 jBoss 離開, 在 Alfresco 支持下做的 Activiti 專案。從 2010 年底釋出 5.0 以來, 2011 的前兩個月都按表操課, 穩定釋出新版本 5.1, 5.2。具備彈性流程工具外, 比較特別的是考慮開發人員甘苦, 不會一昧討好商務端人員。Activiti 可考慮嵌入與應用共存, 但從服務獨立、聯合管理的角度, 應該是單獨存在的系統, 因此放到基礎系統區。
  • 應用系統: 從開發觀點來看, 只要一個語言就可做任何事, 然而任何人能完成的事情都是有限。現成開源應用系統也不少(ERP, CRM), 加上在雲端的就更多。但能否存活, 像後者在 2010 收了好幾家, 特別讓人有疑慮。因此期望把關鍵資料放在自己可以掌握的地方, 彈性/好用是必需的, 但也不會因為開發專案的公司策略調整或併購而影響。因此選擇 OFBiz 來擔任企業核心的應用系統。

回頭看各區塊, 應用系統依實際狀況而定, 基礎系統補上即時訊息(IM) Openfire 做即時通訊, 另外以通用伺服器 Felix, Karaf, Camel, ServiceMix 統籌日漸增長的服務。工具區塊比較被熟悉, 也常見許多討論個人、團體開發過程中面對的問題與解決方式。這裡對之前 近未來 IT 開發 一文做補充, 成為開發作業區塊:
  • 穩定層: 包含應用系統與基礎系統, 有穩定的界面。例如 ERP 財務的界面, 或像檔案傳輸的方式也固定。
  • 動態層: 原本以樣板打造動態層, 要含括一般且普遍的情況下, 得選用框架。以 Web 來說, 會用 Grails, 他和原本 Java 與企業大宗資源 DB 溝通方式非常的 … 一脈相承, 能快速且彈性建立 Web 應用或服務。在 Web 應用方面, 加上 ZK 協助能使用先進的 Web 技術, 卻毋需太煩惱衍生的問題。而面對複雜的服務與模組, 有更強力的 Scala/Akka 組合以函數編程與靜態語言協助建立穩定的服務。
  • 領域層: 有了上面分門別類的區塊提供各式的服務, 接下來在 grails 與 akka 下, 開發領域相關的東西。

整理如下圖:

歡迎指教與補充。 :)

參考連結:

2011/01/09

Tabledown

目前資訊技術兩股趨勢: 一個是普及的行動設備, 一個是數大的雲端計算。在兩者激盪之下, 各種應用遍地開發。從 TIOBE 索引排名, 以及陸續開張的軟體商店, 就可看出百家(?)爭鳴, 且各家皆各自擁有龐大的支持群眾。

普及的行動設備會演變成為一個人擁有多個設備, 但不連線(不連續)就會造成的問題。Dropbox 解決了檔案問題, 讓檔案同步因此大受歡迎。而雲端運算到後面各個服務的連結也會造成不連續, 簡單舉例: 金流可連續完成, 但物流就不可能。

從結果來推論需求, 如果生產, 金流, 物流都上雲端了, 那在手上(設備)要掌握什麼資訊?
(嗯 … 產品的規劃設計是另一件事。)

要掌握的資訊, 可能人人不同, 也可能隨客戶的客戶而不同(B2B)。

雖然流行的腳本語言(Scripting)能因應快速的變更, 大部分時候在程式碼與資料間是有清楚的界線。這個界線是 … 使用者(或客戶)非常在意資料, 而程式員則關注程式碼。即便可選擇的開發工具很多, 也都很強大, 但幾乎是建立 MVC 下, 類似 rails 模式, 或者是說與資料庫關係密切, 這些都屬於連線(連續)的形式。

最好能夠做到『碼即資料, 資料即碼』(code is data, data is code), 由使用者在掌握資料即能驅動後頭的雲端, 即使不連接也可讓服務運作下去。

不論如何, 資料還是需要載體(Container), 最好的載體應該是試算表。它除了能放置資料, 還能兼顧人們視覺操作的慣性, 可將資料的顯示位置, 存在與否, 還有排列做調整。如果沒有應用程式, 這種方式應該是首屈一指的資料載體。

主角都現身, 可想像一下: 透過試算表來連接各種後端的服務(雲端)。資訊服務業能透過試算表輸入資料(例如使用者需求), 再批次進入報價服務, 每月產生報價單寄送給客戶。至於損溢, 現金流量, 庫存也可定時同步到試算表 … 並竟不是每個人都每秒十萬上下。

基於這樣的出發點, 建立了 Tabledown 專案。簡單來說, 是能夠讓試算表與集合資料(lists, hashes)做雙向資料交換, 透過一個對映集合設定(mapping collections configuration, MCC)來轉換。

已完成的是概念雛形的驗證, 就是在 google code 頁面的範例。陸續會做一些修正, 使用雲端試算表, 以及與 ERP, BPM 連接。

Tabledown 目前是組 Python 的程式庫, 希望有機會改頭換面成為一般工具。而 Tabledown 命名的點子是從 Markdown 而來。



參考