星期五, 11月 25, 2011

書:Working Effectively With Legacy Code

一直對TDD很猶豫... 讀完後,決定好好的寫TDD了...
不想要再為了改個地方,而怕東怕西... 決定用這個可以放輕鬆的開發方法..

  • What is legacy code
    legacy code與non-legacy code的差別 - "test"
    接手的人不敢亂改,但如果有test機制,就能夠一步步修改維護
  • Test Coverings
    將程式佈滿測試,就不會害怕去改變他
  • Legacy Management Streategy
    1. Identify change points 
    2. Find an inflection point 
    3. Cover the inflection point a.
      1. Break external dependencies
        作者舉在testing時,重視測試結果,而常綁死gui的實作,造成testing不易
        作者寫了CustomerView的interface,當測試時,就可在不改變結構下,丟空的實作做測試,有mock的感覺
      2. Break internal dependencies
        在測試時是不必要的地方(如產生暫存等),就繼承該class,直接orverriding掉,不要做任何事即可,有stub的感覺
      3. Write tests 
    4. Make changes 
    5. Refactor the covered code.

待續...

星期五, 11月 18, 2011

SQL 常用查詢

  • 從url字串截取domain
    SELECT substring_index(substring_index(trim(leading "https://" from trim(leading http://" from trim(`URL`))), "/", 1), ":", 1) as domain FROM `uchome_app` WHERE 1 `redirect_uri`
    

星期四, 11月 10, 2011

linux切換多重視窗 - tmux

用pietty開發時,經常需要連到其他servers
懶得再開一個pietty,直接用ssh連線做完後,又得要exit掉,回到原本的環境
如果忘了做件事,又要再重連一次,指令密碼一直下,路徑也要一直切
環境一直切換覺得挺煩的,但再開一個pietty來做,切換視窗也是切到暈,常切到不知自己在哪...

今天同事也遇到以上問題,問我知不知道怎麼切換連線
說他有看過,但他不會...

這才一語驚醒夢中人... 對呀!!! 這東西應該有人有做出什麼神奇的工具
我怎麼都沒想過,即然同事都說有看過了,就jfgi了一下...
結果出現screen及tmux這好東西... 試用了一下,真是太感動了
個人覺得最方便的功能如下:
  • 同一個pietty連線,可以使用多個windows
    有點像是用本機登入linux,用F1,F2... 就可以切換多重視窗
    而且可以自定內部視窗的名字,這樣開再多也不怕
  • 視窗保留
    離開tmux後(tmux detach),再下tmux attach能夠保留上一次所有開啟的視窗連線狀態(session)。例如用vim開發常會開好幾個分頁,離開時要全關,下次再一一打開,有時只是離開一下座位,開著編輯畫面總覺得怪怪的,利用視窗保留就能不離開vim或當時的環境,等要用時再取回,這真是太酷了...
    而且能夠開多個session,保留不同的開發環境
  • 保留開發環境(多重seesions)
    個人是習慣每個專案即建相關的session,而該session下就是該專案相關的開發環境

    如此一來,切換專案時,所有的環境(該seesion下的windows)都保留著,在切換專案時,也不用花太多時間回想環境
Install tmux
  • install tmux
    # yum install tmux
    如果找不到套件,先加入epel的repo
    Install EPEL Repository On 32-bit CentOS Linux 5.5:
    # rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
    
    Install EPEL Repository On 64-bit CentOS Linux 5.5:
    # rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
    Reference: Install EPEL Repo CentOS RHEL
  • 啟動tmux
    # tmux
    畫面如下圖所示

    重點在1.session 及2.window
    把每一個session看成獨立一個連線
    而每個session都可如上圖有多個windows
    因此seesion 1 為project A,再對project A開啟多個windows
    而session 2 即為project B, 再對project B開啟多個windows
  • tmux指令(啟動tmux環境)
    • 取回視窗
      $ tmux attach 
      $ tmux attach -t session-id  //指定特定seesion
    • 列出所有sessions
      $tmux ls
    • 更改session名
      $ tmux rename-session -t session1 session2  //把session1改成session2
      或者直接下function key + $

  • tmux視窗指令 ()
    • Ctrl-b c Create new window
    • Ctrl-b d Detach current client
    • Ctrl-b l Move to previously selected window
    • Ctrl-b n Move to the next window
    • Ctrl-b p Move to the previous window
    • Ctrl-b & Kill the current window
    • Ctrl-b $ Rename the current session
    • Ctrl-b , Rename the current window
    • Ctrl-b % Split the current window into two panes
    • Ctrl-b ? List all keybindings
    • Ctrl-b s 切換session,如下圖,列出所有sessions,再選擇要切換的
  • 分割 / 切割視窗 (切出來的叫pane)
    • Ctrl-b q Show pane numbers
    • Ctrl-b alt按著,再按上下左右, 可以調整視窗大小
    • Ctrl-b % 直切
    • Ctrl-b :"split-window" 橫切
    • Ctrl-b Ctrl-o 調換 切割視窗 的 位置
    • Ctrl-b o Switch to the next pane
    • Ctrl-b 上下左右 跳到上下左右的分割視窗
    • Ctrl-b ! 將目前的pane抽成window
    • Ctrl-b x 移除目前的pane
  •  自定key組合
    切割視窗還是先設好key,不然還真不好用,以下是個人參考網路上的設定
    把預設的Ctrl-b改為Ctrl-a,手比較不會抽筋...
    # vi ~/.tmux.conf
    # 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
    set-option -g allow-rename off  #禁止rename,在tmux v1.8 在換路徑時,會一直rename window
    
    # 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
    git branch資訊不曉得為何,偶爾會有出現,後來發現要在git folder裡開tmux才會有,不曉得為什麼