On twitter

RT @christiney35: 最近很多人介紹新朋友合作,真好。我也需要人家介紹 Python 工程師耶~快來吧,Python 工程師!! #fb

follow me on twitter

Archive for August, 2008

CodeIgniter Layout 的做法 4

由於在開發網站過程中, 通常都有個 template 或稱作 layout, layout 包含了整個網站的外觀, 而網站的 layout 通常會切分為 header, content, footer 甚至還有 menu。 而這當中的 content view 則是會隨著不同頁面、功能而變動, 而 layout 則為固定, 這樣可以維持同一個網站界面的一致性, 然而 CodeIgniter 並沒有對這種所謂 partial view 有較好的處理方式。

所以通常都會是像下面這樣的寫法。 載入 foo 這個 content view 到變數之後, 丟到 template view, 最後在 render 出來。

$data['foo'] = $foo;
$view['heading'] = 'heading text';
$view['content'] = $this->load->view('foo', $data, true);
$this->load->view('template', $view);

所以每個頁面就都得寫上兩行 load view 的動作, 寫久了便覺得繁瑣, 其實這個動作透過下面這個 Layout library 是可以簡化的。 這個 library 是在 CodeIgniter wiki 上看來的, 只修改了幾個變數。

<?php
class Layout
{
    var $obj;
    var $layout;

    function Layout($layout = "template")
    {
        $this->obj =& get_instance();
        $this->layout = $layout;
    }

    function setLayout($layout)
    {
      $this->layout = $layout;
    }

    function view($view, $data=null, $return = false)
    {
        $data['content'] = $this->obj->load->view($view, $data, true);

        if($return)
        {
            $output = $this->obj->load->view($this->layout, $data, true);
            return $output;
        }
        else
        {
            $this->obj->load->view($this->layout, $data, false);
        }
    }
}
?>

有了這個 Layout library 之後變可以將載入 view 的程式簡化如下:

$data['foo'] = $foo;
$data['heading'] = 'heading text';
$this->layout->view('foo', $data);

基本上以這個 library 為範例的話, 預設的 template 檔案就要命名為 template.php, 你也可以修改這個 library 的程式碼來符合你現在 template 的檔案名稱, 不過我是覺得就叫 template 還滿直覺的。
而 template.php 裡面則是需要放入 $content 這個變數來存放 foo.php 這個 view。 簡單的 template.php 的範例如下:

<html>
<body>
<?=$content?>
</body>
</html>

當然這個 template 可以像文章一開始講到的, 另外做更細的切分, 我們可以另外開一個 template 的目錄, 裡面存放 header.php, footer.php, 然後在 template.php 裡面載入, template.php 如下:

$this->load->view('template/header');
<?=$content?>
$this->load->view('template/footer');

hmm… 這篇應該要有寫過 view in view 的人才看得懂吧? 超懶畫圖 XD

August 30th, 2008 CodeIgniter Tags: ,

[Lighttpd] get real IP from proxy 0

由於先前在測試用 nginx 放在原本的 lighttpd 前面作 load balance 還是 reverse proxy 什麼的, 不過因為完全沒碰過, 只能亂搞, 沒想到成功了 XD (雖然有設錯, 整個站有掛掉一下下)

本來是想說到時候 StickerAction 撐不住, 可以把 request 分到別台去, 不過看目前的情形都還撐得住, 最高也還沒到 20 req/s, 是我小看了 256slice 阿 ~”~ 不過應該也是因為加了之前做的, 讓圖片快取住的功能, 才能減少一些 request 的。

不過當時唯一有問題的就是, 當我再看 log 跟 session 的時候, 發現, ip 全部都是 127.0.0.1 阿!! :o 幸好之前程式中 session 沒有要 match ip XD 原來 lighttpd 那邊要開 mod_extforward 來取得 client 經過 nginx proxy 後, 原本的 IP 位址。

lighttpd 再 1.4.14 之後就都有 mod_extforward, 只是好像預設的 lighttpd.conf 都不會列出來。 所以只要再 server.modules 裡面載入 mod_extforward 就可以了, 只是記得要放在 mod_accesslog 後面載入, 如下:

server.modules = (
    "mod_rewrite",
    ...
    "mod_accesslog",
    "mod_extforward"
)

然後加上個相信的 IP 來源就可以啦 :D

extforward.forwarder = (
   "127.0.0.1" => "trust"
)

雖然也不知道放個 nginx 在前面有沒有發揮什麼作用就是了 XD anyway 至少之後可以直接把 request 分到另外一台

August 29th, 2008 Linux Tags: , , , ,

關於 Simplepie cache (db cache) 0

這篇還是記錄在 StickerAction 的效能上做的處理。 StickerActionSimplepie 來讀取 RSS, 然後用上了 cache, 來避免一直對外部做 request, 也減少流量的支出。研究了一下 Simplepie 的 cache 儲存方式, Simplepie 就是把他所抓取的 url 做 md5 當成檔名存成 cache 檔案, 檔案裡面則是存放 serialize 後的資料。

所以為了搭配上一篇所提到的存取控制, 計算這次是否有對外部做了 request, 所以寫了下面這一段, 來判斷是否有對外存取, 進而做存取控制。

function is_cached($url)
        $cache_file = 'sp_cache/' . md5($url) . '.spc';
        if (file_exists($cache_file)) {
            return true;
        }

        return false;
}

Read the rest of this entry »

August 28th, 2008 Programming Tags: , , , , ,

簡單化的網頁設計 0

今天看了一篇文章 How Simple Web Design Helps Your Business 說明為何網頁設計要朝向簡單化的設計方向, 不要在網頁上放入太多東西, 特別你是在賣東西阿!

Apple 的網頁總是很精簡, 但很漂亮, 我也總能一目了然的就看出, 現在在主打哪個產品, 我想找的東西在哪, 都可以很快的找到我要的資訊, 或我想購買的產品頁面。像我用的 Slicehost 的網頁也非常簡單, 雖然說, 他們的產品線本來就很精簡 XD

而且現在的網路使用者越來越沒有耐心了阿, 所以當一個頁面放入太多東西, 會讓使用者找不到想要的東西, 或是被太多不相干的東西干擾視線。

基本上, 我個人覺得 8 秒差不多吧, 8 秒過了還沒看到我想要的東西, 就會讓我覺得這個頁面設計的很爛, 因為我就會開始沒耐心了 …

太多重點, 等於沒有重點阿!!!!

August 27th, 2008 Web Design Tags:

StickerAction 對外 request 被擋的處理 2

yahoo error 999
最近在為了減少 StickerAction 對外部的 request 數量作處理, 花了好一些工夫 XD 因為 wretch 那邊大概只要有 50 個 request(一小時或半小時, 阿災), 就會被先前 xdite大大 說的 Yahoo 金鐘罩檔掉了。 請見上圖 Yahoo 999 XD
Read the rest of this entry »

August 27th, 2008 Programming Tags:
Partners of Oceanic / 人生海海

jiwosca