星期二, 7月 31, 2012

log4php結合FirePHP

firephp很好用,那怎麼跟log4php結合咧
download: 下載 利用ci寫的


由於ci使用library都得用new實體化
而log4php透過static method(getLogger)取得logger
用起來總是卡卡... 應該說會卡住...
所以寫成library

  1. FirePHP appender
    簡單說,就是多寫個FirePHP的Appender
    這樣log4php就可以使用FirePHP
    class LoggerAppenderFirePHP extends LoggerAppender {
         ...
        public function append(LoggerLoggingEvent $event) {
           if($this->layout !== null) 
               return;
    
           $ci = & get_instance();
           $level = $event->getLevel();
           if($level->isGreaterOrEqual(LoggerLevel::getLevelError())) {
           $ci->fb->error($this->layout->format($event));
           } else if ($level->isGreaterOrEqual(LoggerLevel::getLevelWarn())) {
           $ci->fb->warn($this->layout->format($event));
           } else {
           $ci->fb->info($this->layout->format($event));
          }
         
       }
    }
    p.s. 因為是套用在codeigniter下... 所以有出現個get_instance() XD
  2. config
    <configuration xmlns="http://logging.apache.org/log4php/">
            <appender name="firephp" class="LoggerAppenderFirePHP">
                    <layout class="LoggerLayoutPattern">
                            <param name="ConversionPattern" value="%m"/>
                    </layout>
            </appender>
            <root>
                    <appender_ref ref="firephp" />
            </root>
    </configuration>
  3. logging
        $this->load->library('Log4php');
    
        $this->log4php->log('info',"[behavior] info");
        $this->log4php->log('error',"error");
        $this->log4php->log('warn',"warn");
    結果如下



星期一, 7月 30, 2012

新人網頁程式練習題目

最近訓練新人,想了半天找了幾個練習題,儘可能常用的網站技術都有用練習到
  1. 月曆
    • 基本一週七日版型
      基礎程式邏輯
      html
    • 六、日、今日特殊底色
    • css練習 目前日期
    • 上、下月
      get參數練習
  2. 資料庫拉分頁

    sql
    分頁
    sql語法
  3. javascript練習
    九九乘法表(熟悉語法)
    dom物件操作
    事件觸發
  4. 購物車

    • 購買頁(即時計算金額)
      html
      sql
      javascript
    • 結帳頁
      session

以上應該是大部份有練習到了
再來應該是用MVC架構再重做一次...

install memcache for php

本想說這東西就yum一下就好了...
沒想到重裝時,還真卡住了,想不起來怎麼裝的
還是乖乖寫筆記吧

  • 架memcache server
    1. 事前準備
      yum install libevent
      yum install libmemcached libmemcached-devel
    2. 裝memcache server
      yum install memcached
    3. Start Memcached server
      memcached -d -m 512 -l 127.0.0.1 -p 11211 -u nobody
      d = daemon, m = memory, u = user, l = IP to listen to, p = port)
  • php存取memcache
    1. 事前準備
      利用pecl安裝,如果沒有的...
      yum install php-pear
    2. 安裝memcache
      pecl install memcache
    3. 設定php.ini
      將extension寫入php.ini
      extension=memcache.so
    4. 設定memcache server位置
      $memcache = new Memcache; 
      $memcache->connect('127.0.0.1', 11211) or die ("Could not connect"); //connect to memcached server   
      $mydata = "i want to cache this line"; //your cacheble data   
      $memcache->set('key', $mydata, false, 100); //add it to memcached server   $get_result = $memcache->get('key'); //retrieve your data   
      var_dump($get_result); //show it
就這麼簡單...

Reference

10 baby steps to install Memcached Server and access it with PHP


星期四, 7月 26, 2012

Coding Security Issues

  • 設計篇
    寫程式前先記好「電腦安全的七項設七項設計原則」
    1. 最小權限原則 ( least privilege )
    2. 經濟者是原則 ( econmy of mechanism )
    3. 安全檢測原則 ( complete mediation )
      每一筆資料存取之前,都必須先檢驗是否為合法授權行為
    4. 開放性設計原則  ( open design )
      嚴禁走系統後門的行徑
    5. 分權原則 ( separation of privilege )
    6. 最少共用性原則 ( least common mechanism )
    7. 可接受程度 ( psychological acceptability )
  • 實做篇
    理論太多沒感覺嗎?不然實做黃金三劍客記好就好...
    1. always validate your inputs
    2. always filter your outputs
    3. nerver trust users

    實做細節注意overflow
    避免使用建議使用
    gets()fget()
    strcpy()strncpy()
    stract()strncat()

星期四, 7月 12, 2012

ssl 在ie下網址錯誤

crt1: aa.com
crt2: host2.aa.com

appache裡設定ssl.conf
<VirtualHost *:443>
SSLCertificateFile /etc/pki/tls/certs/aa_com.crt
SSLCertificateKeyFile /etc/pki/tls/private/aa_com.key
SSLCertificateChainFile /etc/pki/tls/certs/aa_com.ca-bundle
</VirtualHost>

<VirtualHost *:443>
SSLCertificateFile /etc/pki/tls/certs/host_aa_com.crt
SSLCertificateKeyFile /etc/pki/tls/private/host_aa_com.key
SSLCertificateChainFile /etc/pki/tls/certs/host_aa_com.ca-bundle
</VirtualHost>
在firefox, chrome都正常
而在...ie時,host2.aa.com的憑證是失效的

研究了很久,發現網址不正確,這下有趣了,明明就是來驗證網址的
居然說網址不正確

這才發現原本應抓host2.aa.com的憑證,居然是抓aa.com,而判斷目前網址錯誤

後來將ssl.conf順序倒了一下就解決了
我想是virtualhost *:443的關係吧
不過寫成;VirtualHost aa.com:443 順序一樣要細的在上
而且還會有warnning指出前者overlap後者

最後發現是萬惡ie沒辦法分辨...
最後只能... 再架個server各自獨立

星期二, 7月 10, 2012

firefox 的 sec_error_unknown_issuer 問題

最近用了Comodo發的ssl憑證建了https
結果在firefox遇到了sec_error_unknown_issuer問題



查了一下得加個ca-bundle設定
在跟comodo申請憑證後,會拿到
  • YOUR_WEBSITE.crt
  • YOUR_WEBSITE.YOUR_WEBSITE.csr
  • YOUR_WEBSITE.bundle..ca-bundle
apache的話到/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/tls/certs/YOUR_WEBSITE.crt
SSLCertificateKeyFile /etc/pki/tls/private/YOUR_WEBSITE.key
SSLCertificateChainFile /etc/pki/tls/certs/YOUR_WEBSITE.ca-bundle


#後記
後來遇到https都連不到,才發現原來在load balance的server上也要給


References

星期四, 7月 05, 2012

偵測新視窗的close event

如何偵測新視窗的close event咧
<script type="text/javascript">
    var win = window.open("secondwindow.html", "_blank");
    win.onunload =onun; 

    function onun() {
        if(win.location != "about:blank") // This is so that the function 
                                          // doesn't do anything when the 
                                          // window is first opened.
        {
            alert("closed");
        }
    }
</script>
不過這方法不能跨網域
也就是如果child開到不同網域,close不會觸發unload事件
解決方法先轉個空白的網頁,裡面夾iframe去連該網頁

後記-跨網頁問題
被同事嗆「閃開! 讓專業的來」 見下面程式碼
也不去bind event,只是持續monitor關了沒...真是好招...
var child = window.open('http://google.com','','toolbar=0,status=0,width=626,height=436');
var timer = setInterval(checkChild, 500);

function checkChild() {
    if (child.closed) {
        alert("Child window closed");   
        clearInterval(timer);
    }
}


References

星期一, 7月 02, 2012

mysql常用日期query

  1. 當天的資料
    select * from table where to_days(column_time) = to_days(now());
    select * from table where date(column_time) = curdate(); 
  2. Between日期
    WHERE (created BETWEEN '2012-06-19' and '2012-06-30 23:59:59' ); 
    注意結尾是最後一天一秒,否則只會出現到前一天的資料
  3. 最近7天,1個月
    WHERE DATE_SUB( CURDATE( ) , INTERVAL 7 DAY ) <= `created_date`;
    WHERE DATE_SUB(CURDATE(), INTERVAL INTERVAL 1 MONTH) <= `created_date`;
  4. 本周
    從當週的Sunday開始到星期六的七天資料
    select * from wap_content where week(created_at) = week(now);
    
Reference