星期四, 11月 29, 2012

[書]Rapid Development - Taming Wild Software Schedules

已經忘了內容了,不過一句應該就可以帶出整本書的重點
「要快速沒有明確的方式,但避免已知的錯誤,就不會拖慢開發速度」


People

  • Undermined motivation
    Weak personnel
    Uncontrolled problem employees
    Heroics
    Adding people to a late project
    Noisy, crowded offices
    Friction between developers and customers
    Unrealistic expectations
    Lack of effective project sponsorship.
    Lack of stakeholder buy-in
    Lack of user input
    Wishful thinking

Process

星期一, 11月 05, 2012

Effective Java

8. Exceptions
條款39:只在異常情況下才使用異常機制

條款41:不要濫用checked exceptions
Checked exception會強制程式員處理異常狀態,因此過程使用會使API用起來很不方便。
如果API用戶無法做得更好,那麼他比較適合使用 unchecked 異常。
條款42:儘量使用Standard exceptions
常用的異常 (Effective Java p.177)

  • IllegalArgumentException
  • IllegalStateException
  • NullPointerException
  • IndexOutOfBoundsException
  • ConcurrentModificationException
  • UnsupportedOperationException
「選擇使用哪一種異常」並不是一種精確科學,因為並不互斥

星期二, 10月 30, 2012

eclipse 安裝 egit

兩種方法

  • Help > Install New Software
    開啟後,輸入 http://download.eclipse.org/egit/updates
    即會看到egit相關套件,點選安裝即可
  • Help > Eclipse Marketplace Client
    另一種方法,透過Eclipse Marketplace Client裝
    其實是第一種不知為何不起來,才試第二種
    開啟視窗後,輸入"egit",安裝即可

星期一, 10月 08, 2012

Eclipse “cannot be resolved to a type” error

不知什麼問題,明明上一次才compile過,也沒動到任何東西
發現在project name(右鍵)/properties裡的Java Build Path

改了JRE的環境,本身是裝jdk1.7 但這裡是寫1.5(如左圖)
就改了一下... 然後就... 好了...






後記...
跟java版本無關,而是重新compile的問題
maven不會對未更動的檔案重新compile,因此有更動的檔案(該檔案需重新compile)後
就會出現cannot be resolved to a type

解決方法:
就重新設定JRE環境,就會自動重新build一次
不曉得這是ecilpse問題還是maven問題

Reference
Eclipse “cannot be resolved to a type” error

星期三, 9月 19, 2012

ORA-24408: could not generate unique server group name

還以為是沒裝好oci8,試了半天最後把dba抓來問
才知道如果該server有設定主機名, 就要給ip對應主機名
vi /etc/hosts
192.168.1.10 localhost #將ip指向主機名

這樣就可以正常run了

Reference
ORA-24408: could not generate unique server group name

星期五, 9月 14, 2012

查linux相關process

  • 執行緒狀態 (ps)
    1. 自己 bash 程序
      ps -l
    2. 觀察系統所有的程序資料
      ps aux
    3. httpd是否執行中
      ps -ef | grep -i httpd
  • 網路連線狀態 (netstat)
    1. 顯示所有 port 80 的連線,並把結果排序
      netstat -an | grep :80 | sort
References

星期四, 9月 13, 2012

編碼問題

一堆encode方法,搞不清楚用的時機嗎
嗯  我承認我記不起來...
  • base64encode
    將資料利用64個字母(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/)來表達,具不可讀性
    標準的Base64並不適合直接放在URL裡傳輸,因為URL編碼器會把標準Base64中的「/」和「+」字元變為形如「%XX」的形式,而這些「%」號在存入資料庫時還需要再進行轉換,因為ANSI SQL中已將「%」號用作通配符。
  • urlencode
    看完base64encode的問題,就應該瞭解為何需要urlencode了。urlendcode會轉成%XX
  • htmlentities

    如果要在網頁上出現html碼,就要透過htmlentities編碼
    也就tag的大於會變成%lt;,小於會變成%gt;
    decode: html_entity_decode()

    *htmlentities跟htmlspecialchars幾乎一樣,但htmlentities也會把中文轉成成html的東西,所以要注意

常見問題
GET傳送中文時會變成亂碼
用Big5編碼透過URL傳送GET不會有問題,但是如果使用UTF8編碼您會發現中文都會變成亂碼,這時候您要使用GET傳送時,必須先使用urlencode將要傳送的資料加密,這樣傳送中文則會正常。

星期五, 9月 07, 2012

UML各圖使用時機


  • 何時用類別圖
    類別圖是UML的主幹,隨時都用得到,而最大麻煩在包含太多東西
    • 不要試著用到所有表示法
    • 盡可能使用非常簡單的表示法
    • 不要畫出所有東西的模型。重心放在關鍵地方。常用得到、時時更新。
  • 何時用循序圖
    想知道幾個物件在某個使用案例中的行為時

Reference
UML精華第三版

星期三, 9月 05, 2012

jQuery相關extend用法

  • jQuery.extend
    說明:為jQuery增加method
    例:jQuery本身無$.add,為此增加個add method
    jQuery.extend( {     
        add:functioin(a,b){
            return a+b;     
        }   
    });
    用法
    alert($.add(5,3));  //print 8

  • jQuery.fn.extend
    說明:為selector增加jQuery method
    例:jQuery本身對selector有height(), width(),但沒有color(),為此增加color method
    jQuery.fn.extend({ 
        color: function (val) 
        { 
              if (val == undefined){           
                   return  $( this ).css( "color" ); 
                } else {      
                  return  $( this ).css( "color" , val); 
                } 
        } 
    }) );
    用法
    $("input").color("red"));  //所有input都是紅字

  • 匿名method寫法
    //1.一般function寫法
    function method1(m){alert(m);}   
    
    //2.暱名function,需有變數接
    var method2 = (function(m){alert(m);}) 
    method2("Hello");
    
    //3.直接傳參數進暱名function呼叫
    (function(m){alert(m);})("Hello")
  • (function ($){ ... })(functionName)
    指為了避$的衝突
    可以包在這裡面,如此一來$就不會衝到,即使設了jQuery.noConflict()
    常用在寫jQuery plugin
Reference jQuery.fn.extend 與jQuery.extend 用法 What a heck is a (function ($){ ... })(jQuery)

星期二, 8月 21, 2012

快樂寫程式

幾年前讀過Beyond Java,提到java的生產力太低,當時看不太懂作者提出的問題,例如強型別的宣告,自己覺得處處要宣告比較麻煩一點,不過這點會影響很大嗎?而作者大力推薦用ruby等語言,雖然有自己練習一下,可能還沒真正拿來開發過系統,所以沒有太大的感觸...

再去看看其他用ruby的使用者,都說只是想開心的寫程式,當時還以為是因為rails的關係,那年自己正在寫ORM及data mapper的東西,寫了一堆物件滿是覺得有點麻煩,看rails可利用指令去達成這些程式碼,不過這也跟程式語言本身無關呀。

原來如此

這幾年都用php開發,而最近有需要把一段php轉用.net實作,這才發現... 我的天啊,強型別這東西真是讓我想殺人!
  • 回傳值要宣告!(strong type, weak type)
  • 這感覺很直覺,可是有時我不知道我要回傳什麼,聽起來很怪,不過太常用,而且用的很順,例如取user的總數,當失敗時,不想用exception(上層要try catch,很煩 註1),想回個error code及error message 的object就沒辦法了。   
    再來php array,及 json用多了,要乖乖轉換成強型別的語言真的是要人命。php想加什麼就加,超級動態的亂加,可是.net方面,就得乖乖的宣告相對映的object,才能decode,如果有新增時,又得再去class定義,用到受不了,中途改用hashtable來存,又一直覺得用起來很不順手,再改回object,又定義到快起肖,這時才感受到弱型別真是好東西。 
  • 轉型
    int count = 10;
    System.out.println("index: " + String.valueOf(count));
    得自己把count轉成string,雖然沒什麼,不過實際在寫還挺煩的
  • overloading
  • beyond java裡,有提到overloading很不方便,只因參數不同,就得新宣告一個method,在讀完的當下認為本來就該宣告,不同參數會做不同的事,怎麼能寫在同一個method。 不過最近還真的覺得何止不方便,超煩的,有時參數只當config用,給不給都可,但就被逼著再寫一個method

後記:跟同事聊過,強型別問題,不過同事只用過java,對這沒感覺,我也說不上來


Reference

  • Beyond java (好.. 我承認我是看中文版「超越java」)

星期二, 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

星期四, 6月 28, 2012

常用sed與awk


  1. 統計行數
    單一檔案
    awk 'END{print FNR}' xxx.log

    多個檔案
    awk 'END{print FNR}' *.log
    用linux本身的wc指令也可達到效果
    wc -l *.log
  2. 取出重覆及不重覆次數
    [root@test]# cat a.txt
    12 1209185885333940
    12 1209185089989307
    12 1209185891525318
    13 1209186004855839
    13 1209185995006463
    13 1209185995006463

    awk '{a[$1]++}flag[$1,$2]!=1{b[$1]++}{flag[$1,$2]=1}END{for (i in a)print i,a[i],b[i]}' a.txt
    --
    12 3 3
    13 3 2
    reference: 请教awk如何同时统计 总数与不重复个数?
  3. 列出符合的資料
    • 單筆
      sed '0,/PARSE_FROM_HERE/' a.txt
      awk '/regex/ {getline;print}' a.txt
    • 之後(含符合項)
      awk '/regex/,0' a.txt
      awk '/regex/,G' a.txt
    • 之後(不含符合項)
      sed '0,/regex/d' a.txt
      awk '/regex/ {getline;print}' a.txt
    • 之前
      試半天用不出來,乾脆先倒過來讀,就可用上面的方法做出來了
      sed '1!G;h;$!d' test | awk '/regex/,0'

星期二, 6月 26, 2012

vim及tmux視窗常用指令

兩個切換視窗切到指令都亂了
  1. 合併兩個即有視窗
    • vim: vert sb#
    • tmux
  2. 將目前的pane抽成獨立視窗
    • vim:
    • tmux: CTRL-b !
  3. 分割頁切換
    • vim: CTRL-W 方向鍵
      或是CTRL-W j(往右) or w(往下),大寫則相反
    • tmux: CTRL-o

星期二, 6月 19, 2012

php與awk

  1.  在php中執行shell
    可利用shell_exec
    shell_exec('ls -l');
  2. 使用awk
    $data = shell_exec("awk '{print $1}' " . $filepath );
  3. 取得單行awk內容
    由於shell_exec是一次將每行內容回傳,如果要一行行取得awk的資料就要搭配exec
    $feeds = array();
    exec("awk '{print $1}' " . $filepath, $feeds );
    foreach($feeds as $feed)
        echo $feed . '< br/>';
    

星期二, 6月 12, 2012

將url字串的參數轉為array

  1. 取出query部份
    $url = 'http://username:password@hostname/path?arg=value#anchor';
    $urlinfo = parse_url($url);
    ------------------------
    Array
    (
        [scheme] => http
        [host] => hostname
        [user] => username
        [pass] => password
        [path] => /path
        [query] => arg=value
        [fragment] => anchor
    )
  2. 轉成array
    $str = "first=value&arr[]=foo+bar&arr[]=baz";
    parse_str($str);
    echo $first;  // value
    echo $arr[0]; // foo bar
    echo $arr[1]; // baz
    
    parse_str($str, $output);
    echo $output['first'];  // value
    echo $output['arr'][0]; // foo bar
    echo $output['arr'][1]; // baz

References

星期一, 6月 11, 2012

php連oracle stored procedure

  • sql
    1. 建立連線
      $conn = oci_connect('YOUR_ACCOUNT', 'YOUR_PASSWORD','//IP_ADDRESS:PORT/SERVICE_NAME');
    2. 下sql
      $sql = "SELECT ID, NAME as \"name\"
      FROM CATEGORY
      WHERE PARENT_ID = 0 AND STATUS = 1
      ORDER BY CATEGORY_ID ASC";
    3. 取資料
      $stid = oci_parse($conn, $sql);
      oci_execute($stid);
      $nrows = oci_fetch_all($stid, $res,0, -1, OCI_FETCHSTATEMENT_BY_ROW);

      //echo "$nrows rows fetched
      print_r( $res);*/
  • stored procedure
    1. 建立連線
      $conn = oci_connect('YOUR_ACCOUNT', 'YOUR_PASSWORD','//IP_ADDRESS:PORT/SERVICE_NAME');
    2. 連stored procedure
      假設sp名為myStoredProcedured,目的是將取到的時間轉為unit timestamp
      $sql ="begin
      :result := myStoredProcedured(:result => to_date(:myDate,'yyyy-mm-dd'));
      end; ";
      $stmt = oci_parse($conn,$sql) or die('could not parse statement.');

      //bind參數
      oci_bind_by_name($stmt,':result',$result,10); //回傳值需靠參數回傳
      oci_bind_by_name($stmt,':myDate',$myDate,10);

      //給值
      $myDate = '2012-06-12';

      //取值
      oci_execute($stmt) or die('execute');
      print_r($result);
    3. 給參數

星期日, 6月 03, 2012

linux個人環境設定

每次重灌或換個新環境就得憑記憶重設定
乾脆直接記下來省時間...
感謝Dockerfile等工具... 以後這些都可以不用理了...

  1. bashrc
    vim ~/.bashrc
    
    export TERM=screen-256color #註1
    

    註1: lose vim colorscheme in tmux mode

  2. vim 環境設定
    • 環境
    • 縮排
  3. tmux
    # General configuration.
    # $ tmux show-options -g
    set -g base-index 1
    set -g display-time 5000
    set -g repeat-time 1000
    set -g status-keys vi
    set -g status-utf8 on
    set -g status-bg black
    set -g status-fg white
    set -g status-justify left
    set -g status-interval 1
    set -g status-left-length 15
    set -g status-right-length 55
    set -g status-left "#[fg=white,bright] #[fg=yellow,bright]#S #[default] |"      # session-name
    set -g status-right "#[fg=red,bright][ #[fg=cyan]#(git branch --no-color | sed -e '/^[^*]/d' -e 's/* //') #[fg=red]]#[default] #[fg=yellow,bright] %Y-%m-%d #[fg=green]%H:%M:%S #[default]#[fg=magenta,bright]#[default]"
    
    # window setting
    setw -g utf8 on
    setw -g window-status-format " [#I] #W "
    setw -g window-status-current-format " [#I] #W "
    setw -g window-status-current-fg black
    setw -g window-status-current-bg green
    setw -g window-status-current-attr default
    
    # using function keyCtrl+A
    unbind C-b
    set -g prefix ^A
    bind a send-prefix
    
    # split window
    unbind %
    unbind '"'
    bind v split-window -h
    bind | split-window -h
    bind h split-window -v
    bind - split-window -v
    

    設好後,重啟config
    tmux source-file ~/.tmux.conf
  4. git

星期三, 5月 30, 2012

linux監控磁碟空間

  • df 監控可用磁碟空間與inode數舉
    • 語法
      df [options] [dir]
    • 說明
      顯示dir所的檔案系統磁碟空間用量。df會依據/etc/fastab 組態檔找出dir掛載點,然後顯示檔案系統資訊。若沒指定dir,則df會顯示所有已掛載的檔案系統資訊
    • 常用選項
      -h 以較容易辨識的單位(M、G)顯示數值
      -i 顯示inode用量資訊。若不指定,則顯示磁碟空間用量
      • 範例一
        檢視所有檔案系統的磁碟空間用量:
        # df -h
      • 範例二
        檢視所有檔案系統的inode用量:
        # df -i
      • 範例三
        查看目前工作目錄位於哪個分割區:
        # df .

  • du 監控磁碟用量
    • 語法
      du [options] [directories]
    • 說明
      顯示directories的磁碟使用資訊。如果省略directories,則顯示現行工作目錄的用量。
    • 常用選項
      -a 顯示所有檔案,不只是目錄。
      -c 累計所顯示的項目總用量
      -h 以較容易辨識的單位(M、G)顯示數值
      -s 僅印出指定目錄本身摘要資訊,而不是遞迴顯示每個子目錄
      -S 子目錄的用量不列入計算
      • 範例一
        檢祖/etc/rc.d 的disk用量
        # du /etc/rc.d
      • 範例二
        顯示 /etc 的disk用量:
        # du -sh /etc
      • 範例三
        顯示 /etc 的disk用量,但不包括其下的子目錄:
        # du -Ssh /etc
      • 範例四
        誰耗用最多空間(/home/*):
        # du -csh /home/*
        排序
        # du -cs /home/* | sort -nr  #用h會當成文字 ex, 1k,11k,2k

iframe autoresize

先前一直從iframe內部出發,向parent呼叫調整高度
後來發現... parent自己取iframe的內容高去調整就可以了


References
Iframe Auto Resize Height

將scroller移到最上面

兩個方法
//1.html本身的方法
top  //嗯 就這樣

//2.就把scrollTop設定為0就可以了
 $('html, body').scrollTop(0);

厲害點...加點滑動的感覺


test
top

References

星期六, 5月 26, 2012

php 時間轉換函式

  1. 轉換unix timestamp為可讀日期時間
    date("Y-m-d H:i:s", $timestamp);
    線上轉換
  2. 可讀日期轉換unix timestamp
    strtotime("2009-11-03 11:24:00PM");

星期三, 5月 23, 2012

php array轉xml, json

轉json就沒什麼好說的了,想說轉xml應該也是很簡單的東西,不過還真遇到一些問題
  1. array to xml
    原本在google了一段code後,後來發現有中文xml會掛掉因為有不合法字元,
    後來找到以下的code有編碼過,才知道原是編碼的問題
    function toXml($data = array(), $structure = NULL, $basenode = 'xml'){
       // turn off compatibility mode as simple xml throws a wobbly if you don't.
       if (ini_get('zend.ze1_compatibility_mode') == 1)
       {
          ini_set('zend.ze1_compatibility_mode', 0);
       }
    
       if ($structure == NULL)
       {
       $structure = simplexml_load_string("<?xml version='1.0' encoding='utf-8'?><$basenode />");
       }
    
       // loop through the data passed in.
       $data = $this->_force_loopable($data);
       foreach ($data as $key => $value)
       {
          // no numeric keys in our xml please!
          if (is_numeric($key))
          {
             // make string key...
             //$key = "item_". (string) $key;
             $key = "item";
          }
    
          // replace anything not alpha numeric
          $key = preg_replace('/[^a-z_]/i', '', $key);
    
          // if there is another array found recrusively call this function
          if (is_array($value) OR is_object($value))
          {
             $node = $structure->addChild($key);
             // recrusive call.
             $this->_format_xml($value, $node, $basenode);
          }
          else
          {
            // Actual boolean values need to be converted to numbers
            is_bool($value) AND $value = (int) $value;
    
            // add single node.
            $value = htmlspecialchars(html_entity_decode($value, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, "UTF-8");
    
             $UsedKeys[] = $key;
    
             $structure->addChild($key, $value);
          }
       }
    
       // pass back as string. or simple xml object if you want!
       return $structure->asXML();
    }
    
    function _force_loopable($data){
       // Force it to be something useful
       if ( ! is_array($data) AND ! is_object($data))
       {
          $data = (array) $data;
       }
    
    return $data;
    }
    
  2. 下header
    browser才會當成xml,而不是html
    $array = array(...);
    header('Content-type: application/xml;charset=utf-8');
    exit(toXml($array)) ;
    

結合一下兩者,利用同一個function回覆
//給header用
$_supported_formats = array(
                'xml' => 'application/xml',
                'rawxml' => 'application/xml',
                'json' => 'application/json',
                'jsonp' => 'application/javascript',
                'serialize' => 'application/vnd.php.serialized',
                'php' => 'text/plain',
                'html' => 'text/html',
                'csv' => 'application/csv'
        );


function response($data, $format = 'json'){
    header('Content-type: '.$this->_supported_formats[$format]);
    switch (strtolower($format)){
        case 'xml':                                
                exit($this->toXml($data));
        case 'json':
        default:
            exit(json_encode($data));
    }
}

星期三, 4月 18, 2012

網站上線前測試項目

javascript測試事項
  • 是否支援json
    //檢查json是否存在
    if (typeof (JSON) == 'undefined') { //沒有 JSON 時才讓 browser 下載 json2.js
        $('head').append($("<script src="json2.js" type="text/javascript">
    ));
    
    }
  • 兼容性测试
    不同browser都要試一下

unit test測試事項
  • 邊界值及最大、最小值

get reals一書提到...

對於每一個新功能你需要……
  • 1. 對它說不
  • 2. 強迫它證明自己的價值
  • 3. 如果得到否定的答案,就此打住。如果是yes,繼續往下……
  • 4. 為界面繪製草圖
  • 5. 設計界面
  • 6. 編寫代碼
  • 7-15. 測試,改進,測試,改進,測試,改進,測試,改進……
  • 16. 檢查幫助文字是否需要修改
  • 17. 更新產品預覽流程(如果有必要的話)
  • 18. 更新用於銷售的拷貝(如果有必要的話)
  • 19. 更新服務條款(如果有必要的話)
  • 20. 檢查是否違背之前的任何許諾
  • 21. 檢查價格體系是否受影響
  • 22. 上線
  • 23. 深吸一口氣

星期六, 3月 17, 2012

firefox同步

這實在太強大了...
之前有擴充套件(add-on)可以同步記錄書籤
但現在firefox自己出了"選項/同步",只能記錄書籤已經不夠看了

試用了一下,真的是太棒了
除了書籤外,最重要的是每次換台新電腦就得要重安裝套件
居然連這也能同步,太強了... 我要按個讚

後記...
firefox不知為何在2012.7常當掉
發現是在輸入項(input)時,很容易掛
因為太頻繁了,所以只好先改用chrome

用完Chrome後...
好吧... 我改用Chrome了
因為browser是綁gmail帳號
chrome就自動把書籤、autocompleted都同步了...
firefox強項剩firebug...

星期五, 3月 09, 2012

linux prompt

  1. 設置檔
    • 全users
      /etc/profile or /etc/bashrc
    • 個別user
      ~/.bash_profile , ~/.bash_login , ~/.profile , ~/.bashrc or ~/.bash_logout
  2. 客製化prompt
    PS1='[\u@\h \w] \$ # ' #即為user@host ~

    PS1="\e[\u@\h \w]$ \e]" #即為[user@host ~]
    加框'[', ']',由於是key words所以要加\e
    而0;32m 是指顏色,其他以此類推應該就看的出來了
  3. 加上顏色
    PS1="\e[0;32m[\u@\h \w]\e]$ \e[m]" #即為[user@host ~]
  4. 啟使
    source .bashrc
    or
    . .bashrc
  5. Changing foreground and background bash prompt colors

    Syntax for changing colors in the bash is as follows:
    \033[ -> Indicates the beginning of color in the text
     x;yzm - Indicates color code
     \033[00m - Indicates the end of color in the text  

截錄常用的字元代表意思
Bash special characterBash special character explanationBash special characterBash special character explanation
\] end a sequence of non-printing characters \[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt
\h the hostname up to the first `.' \H the hostname
\s the name of the shell, the basename of $0 (the portion following the final slash) \l the basename of the shell's terminal device name
\$ if the effective UID is 0, a #, otherwise a $ \u the username of the current user
\w the current working directory \W the basename of the current working directory
\D{format} the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation. The braces are required

個人配置檔
#prompt
if [ $TERM = 'xterm' ]
then
        PS1='\e[0;32m[\[\033[02;32m\]\u@\h\[\033[01;34m\] \w\e[0;32m]\$\e[m '
else
        PS1='[\u@\h \w] \$ # '
fi

# colorful man page 
export PAGER="`which less` -s"
export BROWSER="$PAGER"
export LESS_TERMCAP_mb=$'\E[01;36m'
export LESS_TERMCAP_md=$'\E[01;36m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;33m'

References

Bash prompt basics

星期二, 3月 06, 2012

FirePHP no message in FireBug console

忘記更新了什麼東西,結果FirePHP居然沒反應了
goolge了一下,也有人遇到,印象中是更新了FirePHP的套件就解決了

而最近公司更換網域,環境也跟著改變
重新安裝FireBug及FirePHP後,居然又沒反應了
又找不到原本解決的網頁,真是快瘋了

後來注意到firefox有個提醒列
提到要"enable Net Panel ..."
才去開放script及net panel,如下圖

才知道FirePHP需要開啟net panel才能動....

星期四, 2月 23, 2012

What is my IP? (Public IP address)

Using wget
wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
Using curl
curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'

curl -s http://whatismyip.org/
Using Lynx
lynx -dump checkip.dyndns.org

lynx -dump www.whatismyip.com | grep 'Your IP'
Reference Linux command: What is my IP? (Public IP address)

星期二, 2月 21, 2012

mysql grant

最近一個案子要連到廠商的db讀資料
不過不知卡在什麼地方,一直沒辦法連到db
後來想到是mysql沒開遠端連線的權限,想透過phpmyadmin去開
但是限制一堆,只能用ssh進mysql server下指令...
用慣了phpmyadmin.... 要用指令下授權...ㄟ... grant all db.... 什麼.... 放棄
下select就算了,下授權... 不知多久才用一次的東西...google一下吧..
  • 先連db囉
    $ mysql -u root -p
  • 查詢 某 User 的權限
    這樣就可以知道該User是否有從某ip連db的權限
    mysql> select User,Host from mysql.user;
    +------+---------------------------+
    | User | Host |
    +------+---------------------------+
    | root | localhost |
    +------+---------------------------+
    1 rows in set (0.00 sec)

  • add SELECT,INSERT privileges to a user using GRANT
    上例中,root未開放192.168.0.1的連線
    這裡假設開放root(密碼:ok1234)可從192.168.0.1連線db_base下的所有table(利用*來代表所有的table)的權限
    GRANT SELECT,INSERT ON db_base.* TO root@192.168.0.1 IDENTIFIED BY 'ok1234';

References

git增減remote及fetch and pull branch


  • 增加一個remote
    //增加一個在github的remote
    git remote add github https://github.com/username/Hello-World.git
    
    //origin也視成一個remote,所以一樣的方法,只是叫origin
    git remote add origin https://github.com/username/Hello-World.git

當origin或remote有local沒有的branhc要如何抓下來
  • 自己的
    #git branch
    * master
  • Origin或remote的
    #git branch
    check
    * master
  • 利用fetch抓回來
    #git fetch origin check:check 

星期五, 2月 10, 2012

ie中session遺失問題

先前寫個cross site的程式給廠商呼叫
結果最近在說只有ie會掛,firefox, chrome都通過
一試之下,還真的同事的全掛,最有趣的是我的ie卻能過
且我ie 7,8,9全試了,都可以,為什麼.. 還沒查出來

因為ie不能看iframe裡的內容,而自己的電腦又不會有問題
只能請同事看,查到快起肖了
最後發現是session值會不見

看到有人提到session的useragent不同,而ci裡的config會比對,只要關掉即可
可是還是失敗,總之查了半天,突然看到P3P的字眼...
才想到以前也有遇到ie跨網域取不到相關值的問題,加上後就解決了
friday night加班到9點...更~~~~~~~~~~~~

網上有人整理好了
  • How to set p3p http header in ASP.Net?
    HttpContext.Current.Response.AddHeader("p3p", "CP=\""IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\""")
  • How to set p3p http header in PHP?
    header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
  • How to set p3p http header in JSP?
    response.setHeader("P3P","CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'")
  • How to set p3p http header in ColdFusion?
    <cfheader name="P3P" value="CP='IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT'">

References

星期四, 2月 09, 2012

利用 php 本身寫 error log 及 error/warning/notice message

  • error_reporting
    設定php回發生錯誤的等級
    error_reporting(0);  // Turn off all error reporting
    ini_set('error_reporting', E_ALL);  // Same as error_reporting(E_ALL);
  • error_log
    bool error_log ( string $message [, int $message_type = 0 [, string $destination [, string $extra_headers ]]] )
    Sends an error message to the web server's error log or to a file.
    需寫入file,因此需指定file path
    用法
    //log to file
    ini_set('error_log', dirname(__FILE__) . '/error_log.txt');  
    
    // Send notification through the server log if we can not
    // connect to the database.
    if (!Ora_Logon($username, $password)) {
        error_log("Oracle database not available!", 0);
    }
    
    // Notify administrator by email if we run out of FOO
    if (!($foo = allocate_new_foo())) {
        error_log("Big trouble, we're all out of FOOs!", 1,
                   "operator@example.com");
    }
    
    // another way to call error_log():
    error_log("You messed up!", 3, "/var/tmp/my-errors.log");
    
  • error/warning/notice message
    定義log level多配合log4php,不過也可透過trigger_error
    即可靠php本身達成此效果
    trigger_error("Notice Message",E_USER_NOTICE);
    trigger_error("Warning Message",E_USER_WARNING);
    trigger_error("Error Message",E_USER_ERROR);
    如此就不用再掛log4php,就能方便帶訊息
也就是說error_report 是設定php觸發回報錯誤的等級
如果想利用此機制寫自定的訊息就可透過trigger_error
而error_log就自己想log什麼就log什麼

error_report設定篇
開啟是否顯示error及log的等級
  • 在php.ini中設定
    display_errors = On 
    
  • 在.php中設定
    每次要到php.ini設定就太累了,這邊有方法可以直接在.php裡,直接設定log,這樣開發起來就方便多了,且不會動到整體環境
    ini_set('display_errors', 1);   //turn on display error on screen
    ini_set('log_errors', 1);     //turn on log error
    error_reporting(E_ALL); //log all errors and warnings


常見常數定義
列出常見的幾個,其他看官網Predefined Constants
Constant Description Note
E_NOTICERun-time notices. Indicate that the script encountered something that could indicate an error, but could also happen in the normal course of running a script.
E_STRICTEnable to have PHP suggest changes to your code which will ensure the best interoperability and forward compatibility of your code.Since PHP 5 but not included in E_ALL until PHP 5.4.0
E_ALLAll errors and warnings, as supported, except of level E_STRICT prior to PHP 5.4.0.

References

星期日, 1月 29, 2012

亂數order id

最近在寫銷售系統,由於會把order id給客戶,主管反應這樣會被會看出銷售量,所以要改成亂數,避免競爭對手等看出銷售數量。

研究了半天,自己用padding、加亂數的方法似乎還是會被察覺,google後,覺得還是用加密比較簡單

  • two way encryption
    先下載加密法encryption_class.php
    在encryption_class.php裡,有以下兩行
    $this->scramble1 = '! #$%&()*+,-./0123456789:;>=<?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~';
    $this->scramble2 = 'f^jAE]okIOzU[2&q1{3`h5w_794p@6s8?BgP<dFV=m D>TcS%Ze|r:lGK/uCy.Jx)HiQ!#$~(;Lt-R}Ma,NvW+Ynb*0X';
    此加密法是簡單的利用代換字母做加密,記得叫Caesar Cipher什麼的,主要利用自己的key,去對應scramble相同字母的位置
    當然這樣1對1的對應,很容易就被破,所以裡面的function _applyFudgeFactor(),就是在每次計算代換字母就偏移順序
    利用scramble1把key轉換成順序,每次再偏移位置,從scramble2取出該字母當祕文
  • 產生加密後的order id
    <?php
    include 'encryption_class.php';
    
    $crypt = new encryption_class(); 
    
    $key = "A-COMPLETELY-RANDOM-KEY-THAT-I-HAVE-USED";
    // Min length of 8 for encrypted string
    $min_length = 8;
    
    $order_id = 123456789;
    
    print "Original: " . $order_id . PHP_EOL;
    
    $encrypt_result = $crypt->encrypt($key, $order_id, $min_length); 
    
    print "Encrypted: " . $encrypt_result . PHP_EOL;
    
    // DECRYPT
    $decrypt_result = $crypt->decrypt($key, $encrypt_result);
    
    print "Decrypted: " . $decrypt_result . PHP_EOL;
    
    ?>
    結果如下
    Original: 123456789
    Encrypted: 2UD5UIK9S
    Decrypted: 123456789

  • 以數字實作
    不過問題又來了,因為order id用integer,所以要求全是數字
    • 轉ascii code
      就直接全轉3位數的ascii code

      $numeric_cipher='';
      for($i=0;$i<strlen($decrypt_result);$i++){
          $numeric_cipher .= str_pad(ord(substr($decrypt_result,$i,1)),3,'0',STR_PAD_LEFT); //不到3碼,左邊補0至3碼
      }
      

      不過實在太長了,5位數就要長到15個數字
      所以ascii百位數後全不用,即d(100),e(101),...
      這樣padding就只要2位,這樣5位數也只要10個數字
    • 還嫌太長!?最終極版大絕!!!
      由於key是對應scremble的排序...
      把key跟scremble都只放數字,這樣............ 應該夠短了吧...
      就是有點容易猜...不過一時間內應該也夠用了
      order id太長,將來要查也不好查
      • 改encryption_class.php
        //把scramble改成如下,不要重覆,順序可亂擺,不要一樣就好
        $this->scramble1 = '0123456789';
        $this->scramble2 = '2135794680';
      • 改key值
        因為要對應scramble,所以key有什麼值,scramble就要有什麼值,否則對應不到
        至於密文min length長度,當超過明文長度時,預設是在字串後方補上空格
        但因為得全為數字,所以scramble沒有空格,造成空格對應不到,因此不能超過order id的長度

        //key可隨意變化,但key的值一定要出現在scramble裡
        $key='1234534567890';   
        $key='11223344';   
        $key='68490';   
        
        $min_length = strlen($order_id); //因為1對1,所以不能超過order id的長度
        
      結果如下
      OriginalEncryptedDecrypted
      151
      70
      115011
      991999
      100583100
      101585101
      110505110
      111507111
      這就可以看出來,當key、scramble、偏移量相同,位於前面的字母相同時,代碼都會相同,變化不夠大,忘了那資安的名詞叫什麼,意思是當原文變化不大時,密文的變化仍要夠大,如md5等
      因為可變化的太少了,不過應該算堪用了
      另外還有兩個問題
      • original為7時,沒辦法反解
        原作者在decrypt用empty,所以遇到0會當false,改!isset即可
        相同的,當encrypt 0時,也會當成false,也需要改成!isset
      • decrypt result為0xx
        雖是正常,不過ordre id用integer,這個0就會不見,到時會解不回去
      min length問題
      由於是全數字,又密文長度不能超過明文長度,實在容易被猜出來
      那如何超過明文長度咧...
      解法:不補空格,補0,在明文字串前方補足0,由於integer前面有0,也是當成0,所以沒差
      ex. $id = 50; $min_length = 4;
      $id = '0050'; // 補2個0,足4位
      在encryption_class.php裡
      function encrypt(){
          ...
          //$source = str_pad($source, $sourcelen);              //原作法
          $source = str_pad($source, $sourcelen, '0', STR_PAD_LEFT); //新的作法
          ...
      


References
Four ways to generate unique id by PHP
How to generate Unique Order Id (just to show touser) with actual Order Id?

星期四, 1月 19, 2012

該死的ie form

在html包form實在是在平常不過的事了
在firefox, chrome都跑的好好的
沒想到ie跑版,馬上開F12來看一下
天殺的那是在iframe裡... 要到該網頁又要帶參數....好想殺人
查了半天的css實是看不出原因

亂搬了一下form,居然有變化了
最後把margin設為0... 更.. 好了....
同事事後也說,他也遇過,說這form實在很奧妙....

忘了是ie什麼版本影響了... 總之先記下來
ie我恨你...

星期日, 1月 15, 2012

PHP5.3, CentOS,裝Oci8, pdo_oci8

沒連過oracle,一開始要用還真搞不太懂
載了2個檔案,共2G回來,還是不會用
最後看只需載個client的basic,供oci連線即可
看完網路一裝教學,還是裝不起來,在交叉比對下,終於成功了~~~

os: CentOS 6.4
php: 5.3
download Instant Client Downloads
自己的環境是linux 64bit, 所以載了 Instant Client for Linux x86-64
  1. Install oracle instant client
    • oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
    • oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm
    • oracle-instantclient11.2-sdk-11.2.0.1.0-1.x86_64.zip
    # rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
    # rpm -ivh oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm
  2. 設定ORACLE_HOME
    設定ORACLE_HOME的提示真是讓我暈倒,說要指到lib
    設好了,但在install oci時,會掛,最後試出只要到"HOME"就好了
    看下面設定 vi /etc/profile
    export ORACLE_HOME=/usr/lib/oracle/11.2/client64
    export ORACLE_OWNER=oracle
    export ORACLE_SID=ora1
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib
    export PATH=$ORACLE_HOME/bin:$PATH
    export TNS_ADMIN=$ORACLE_HOME/network/admin
    export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
    啟動環境變數
    source /etc/profile
  3. 解壓sdk並把裡面的sdk裡的資料複製到/usr/include
    # unzip oracle-instantclient11.2-sdk-11.2.0.1.0-1.x86_64.zip 
    # cp -fr instantclient_11_2/sdk/include/* /usr/include
  4. install oci
    • Installing OCI8 from PECL 
      • Use 'pecl install oci8' to install for PHP 8.
      • Use 'pecl install oci8-2.2.0' to install for PHP 7.
      • Use 'pecl install oci8-2.0.12' to install for PHP 5.2 - PHP 5.6.
      • Use 'pecl install oci8-1.4.10' to install for PHP 4.3.9 - PHP 5.1.

      p.s. 基本上裝最新版即可,它有向下相融
            就這麼簡單,過程會要求輸入ORACLE_HOME的位置,如果第3步有做的話,就按enter即可 如果找不到pecl,就先安裝pear

      yum install php-pear
      #如果找不到的話,就先增加repository
      rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm
      yum --enablerepo=webtatic install php-pear

  5. 設定php.ini
    vi /etc/php.ini , add the line extension=oci8.so
    再重開apache即可
    # service httpd restart

    這時下php -m 就會看到oci8了~ 開心
  6. 測試
    <?php
    $option = array(
        'ip'            => '10.0.3.20',
        'port'          => '15210',
        'account'       => 'web',
        'password'      => 'FEF00CB',
        'service_name'  => 'WXS4'
    );
    
        $db = "(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={$option['ip']})(PORT={$option['port']}))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME={$option['service_name']})))";
    
        if(function_exists('ocilogon')){
            $c1 = ocilogon($option['account'],$option['password'],$db) or die('OCI Connect error, wrong connection string');
            echo 'OCI Connect pass. yes!!!';
        }else{
            echo 'ocilogon not exists, installment is not correct';
        }
有看到某些文章指出要安裝pdo,自己裝了也一直失敗
後來發現php5.3已經有了,所以不用裝了

全手動安裝

在公司封閉的網路,只能手動安裝可以參考這篇 PHP 5.3 連線 Oracle 的客戶端及 PDO_OCI 模組安裝

issue
  • pdo_oci unsupported oracle version 
由於oracle instantclient可能出了新版,而pdo_oci未更新,可以直接改pdo_oci/config.m4 ,自己加上要的版本,search 一下unsupported version字眼,就可以找到,詳細可參考這篇 

p.s. 改完記得要先phpize --clean,不然configure的內容不會生效哦!!!

星期三, 1月 11, 2012

教授比較強!?

以前唸專科時,學校裡有教授頭術及碩士畢業的講師
曾經有個交大畢業的碩士講師跟我說過
有些學生比較看不起講師,覺得教授等級才夠看

專科時期,算是個人進入資訊領域的起萌期
老師個人當然還是有強弱,不過都覺得可學習的滿多的
也沒有感覺有沒有教授的頭銜有什麼差別

後來進了大學
老師都至少助理教授以上等級,且大多為40多歲以上
且教授等級的老師在業界或學術界都頗具名氣
聽課時,就真的覺得有差,除了講義上的東西,還可以講的更深入
一些理論的東西,也能講的比較活,感覺比較實用

有位教授說了句玩笑話:「教授就是專門把簡單的東西教的很難。」
原本只是會心一笑,後來才體會到,教授已經多年研究這領域,且每年都重複教這東西,已經成精了,而我們這些小毛頭,一時要聽懂,真的不是件容易的事。

所以...
碩士畢業的講師不敢說弱
只能說教授真的滿強的...

星期六, 1月 07, 2012

tmux改 screen 256 color

改了tmux的設定後,發現顏色沒有改
查了一下,知道可用tput color來看
只有8色,不支援256
可在config裡給screen-256color
set -g default-terminal "screen-256color"

不過開vim時,卻發生Terminal entry not found in terminfo 'screen-256color' not known
所以讀預色的ansi
搞的vim都沒顏色了,而且很多vim指令不能下

又看了一下要用
export TERM=screen-256color

不改還好,一改連tmux也進不去
出現 missing or unsuitable terminal: screen-256color

想改回去 已經不知原本的值了
幸好另一台server也有灌,看了原來本的設定是
TERM=screen
改回來就進tmux了

結論...
還是沒顏色... 有改回來就偷笑了
不過應該centos 沒有screen-256color這東西
想辦法搞定,應該就能work了

References

星期四, 1月 05, 2012

ci取db錯誤

codeigniget在db出錯時,會自行印出錯誤訊息,如果要關掉有兩種方法
  • config/database.php設定
    $db['default']['db_debug'] = TRUE;
  • 程式裡設定
    $this->db->db_debug = false;  
關掉錯誤訊息,那如何取得錯誤訊息咧
$this->db->_error_message(); 
因為不管關不關錯誤訊息try-catch都抓不到
所以如要判斷中斷程式得利用affected row
ci論談已經有人寫好function,可配合暫時關掉錯誤訊息,中斷和印出錯誤訊息
function insert_quiet($table = ‘’, $set = NULL)
  {
      $oldv =$this->db_debug;
      $this->db_debug = false;     
      $this->insert($table, $set);
      $e = $this->_error_message();
      $aff = $this->affected_rows();
      $this->db_debug = $oldv;
      if($aff < 1) {
        return($e);
      } else {
        return(true);
      }
  }
Reference