Web 框架雜記

codeIgniter 將 控制器與模型 物件都定位在函式 的集合,比較接近靜態類別的函式集如 Math.abs ..Math.pie 。

django 則沒說明 控制器與模型 需要用物件來設計,給使用者自行抉擇的空間,都採用 module 內包含數 func 來實做, 但支援的 orm 可以讓存取資料表等同於物件的操作。

如果沒特別設計,依照兩個框架最原始的介紹與建議的基礎開發,兩者在控制器的差異不大,但 django 較沒有去解釋物件的用法,大都是用在各種工具元件的情況 如 Form , Session,因為原先物件導向的設計就比較偏向元件的重用,而不是函式的集合,所以 django 較符合原始意義。

那 codeIgniter 這樣設計有什麼好處呢?

將 PHP 按照順序執行的流程,整理成物件的生命週期,雖然異於物件導向原始的意義,但流程控制較容易掌控,在程式規模擴增時,也讓尋找程式碼實際檔案變的更加容易,且也提供 library 的方式來讓使用者擺放擴增的 classes。

但其 library 對於各式的 classes 的引入,不夠 friendly ,對檔案與類別名字有所限制。

整體來說,物件雖重用性不高,但對於限制程式擴增的模式來說,有良好的效果,如能搭配 modules 的概念,系統也能成長到一定的規模。

對於 php 還沒有支援命名空間的版本來說,當用 函式 來組織,很容易會有名稱的衝突,如果要退一步,就要用各種累贅的命名慣例,而透過多一層類別封裝函式,解決了這種情況,但遇到控制器與模型名稱衝突時,可能還是需要靠命名空間來解決,抑或是這種設計容易造成不具意義的物件(函式集),所以命名才會成為煩惱吧。

django 的彈性

….

jpgraph 2.2 中文支援

很久以前的一篇文章…庫存一下…

官方網站 http://www.aditus.nu/jpgraph/

使用2.2版 官方連結 http://hem.bredband.net/jpgraph2/jpgraph-2.2.tar.gz

src/jpgraph.php 內

6256行左右有 $txt = $this->langconv->Convert($txt,$this->font_family);

似乎是將簡體中文轉成 utf-8 而我網站內使用的是 utf-8 而且我用的是繁體中文,所以註解掉這行。

63行部份有定義字型的位置,我網站內使用的是Linux 而我又不是伺服器管理者動不到原先字型的目錄,所以將字型之置換於 jpgraph 安裝目錄下所以改成這樣。

if (!defined('TTF_DIR')) {
   if (strstr( PHP_OS, 'WIN') ) {
      $sroot = getenv('SystemRoot');
      if( empty($sroot) ) {
         $t = new ErrMsgText();
         $msg = $t->Get(12,$file,$lineno);
         die($msg);
      }
      else {
         DEFINE('TTF_DIR', $sroot.'/fonts/');  //windows下的位置
      }
   } else {
      DEFINE('TTF_DIR','/home/mlwmlw/www/jpgraph/'); //unix下的位置
   }
}

JPG-CONFIG.INC
此檔控制一部分字型的選擇,內有此行定義繁體中文字型的字體

//JPG-CONFIG.INC
DEFINE('CHINESE_TTF_FONT','simhei.ttf');

可使用 FF_CHINESE aka FF_BIG5 不過這似乎此檔不是關鍵定義字型的部份,在網路上找到的文件選中文程式中設定都是 FF_SIMSUN,FS_BOLE

接著看 jpgraph_ttf.inc.php 注意此文件內的設定字體陣列,發現了 jpGraph 定義字型的關鍵程式,

我們要改的部份240行

//jpgraph_ttf.inc.php
/* Chinese fonts */
FF_SIMSUN => array(FS_NORMAL	=>'simsun.ttc',
FS_BOLD	=>'simhei.ttf',
FS_ITALIC	=>'',
FS_BOLDITALIC	=>'' ),
FF_CHINESE => array(FS_NORMAL	=>CHINESE_TTF_FONT,
FS_BOLD	=>'DFFN_M9.TTC',
FS_ITALIC	=>'',
FS_BOLDITALIC	=>'' ),

字型規則

FF_*** 選擇主要類別,FS 選擇字型,每個FF定義了每個字型的對應屬性,我將 CHINESE 內的 NORMAL 與 BOLD 放置了兩個我需要的字體,
之後程式在 SET_FONT 時就看要那個字體就應對著選擇 FF_CHINESE,[FS_NOMAL OR FS_BOLD]。

這樣在跑應該就能有中文了。

程式碼顏色凸顯 用於 office

原由:

時常有需要做投影片裡面都會放到程式,有很多工具可以做,只是都是單純 html,而貼到 PowerPoint 上就會有一些跑掉,

找到最適合的工具是 highlight ,他支援的很完整,語言、樣式,還有介面完善的GUI與API。GUI部份其實很完整了,但是因為他是用 pre 包覆的,所以貼到 Office 換行跟空白都會有些跑掉。而且輸出到剪貼簿的格式也不是 html,要自己在存成 html 來複製再貼。

他另外也有一個類別給 PHP 跟 Python,內部實做其實只是用 pipe 去發指令收回應。

所以我寫了個小程式整理一下輸出的結果,讓貼到 Office 後格式儘量不要跑掉…。

隨便做的說明:


轉換結果範例:

 1 //Examle
 2 public class Fibonacci {
 3     public static long fib(int n) {
 4         if (n <= 1) return n;
 5         else return fib(n1) + fib(n2);
 6     }
 7 
 8     public static void main(String[] args) {
 9         int N = Integer.parseInt(args[0]);
10         for (int i = 1; i <= N; i++)
11             System.out.println(i + “: “ + fib(i));
12     }
13 }

程式網址:

Syntax highlight for Office

PHP 5.3.3 Closure

心血來潮,把本來伺服器上 yum 裝的 PHP 換成 5.3.3 ,搭配 yum 安裝的 httpd 遇到一些小問題,都好解決,紀錄一下

yum install httpd-devel mysql-devel

./configure –with-apxs2=/install-path –with-mysql=/install-path

再裝就沒什麼問題了

然後就來寫一下

$curry = function($a) {
   return function($b) use ($a) {
      return $a+$b;
   }
}
$curry_add= $curry(1);
echo $curry_add(2);// result = 3
($curry(1))(2); //error

感覺學的跟 JavaScript 很像,又多了一些蠻麻煩的語法 (use),本身感覺又不像 Js 開發流程的輕便,感覺有點不太適合這樣寫..

有點怪..