星期三, 7月 27, 2011

git

  • 安裝git
    • install git
      $ yum install git-core
      如果發生No package git-core available.
      $rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm
    • 環境設定
      git config、git script自動完成
  • git操作
    1. 建立Repository
      兩種方法
      • 以該資料夾當成新的Repository
        $ cd (project-directory)
        $ git init
        $ (add some files)
        $ git add .
        $ git commit -m 'Initial commit'
      • 從遠端複製一份Repository
        git clone http://xxxx
    2. 查看版本
      git log
    3. 暫存
      git stash
    4. 重置及還原
      reset, revert
FAQ

  • commit原則 (from ihover's slide)
    • 適當的粒度/相關性/獨立性
      • 以一個小功能、小改進或一個bug fixed為單位
      • 無相關的修改不在同一個commit
      • 語法錯誤的半成品程式不能commit
  • git push error
    git v1.7後 就不允許覆蓋origin的master
    如果當初始化資料夾下git --bare init時
    沒加上參數--bare 就會發生這個錯誤
    refusing to update checked out branch: refs/heads/master
    如果硬要幹的話....
    git config --bool core.bare true
    這樣就可以push了

    另外較好的解決方法是在local開branch開發,再push到origin的branch後,做merge動作 在要push的branch下 $git push origin HEAD:branch2 #branchX未建會自動建 回到origin,用git branch會看到branch2 $git checkout master #假設是master要merge branch2 $git merge branch2

References

星期五, 7月 22, 2011

提升查詢效率與避免LOCK發生

Sql查詢時 會因之前的操作而做lock
因此會有些delay的等待
加了WITH (nolock)就不會理會transaction lock
而直接回覆查詢資料,因而提升回覆速度

  • MSSQL
    SELECT * FROM TABLE WITH (nolock)
    但會有dirty read,所以較不重要資料才可以這麼用
先在DB打開Snapshot功能,再用command or connection string 控制isolation level。
PHP的mssql server driver 不支援 connection string控制isolation level,因此只能用sql command 或者在DB打開RCSI (READ COMMITTED SNAPSHOT isolation),全部查詢就會在此isolation level
  • MySQL
    1. 利set session
      SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
      SELECT * FROM TABLE_NAME ;
      SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
    2. inside a transaction
      SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
      GO

    3. 設定global variable
      SELECT @@global.tx_isolation; (global isolation level)
      SELECT @@tx_isolation; (session isolation level)

MySQL uses table-level locking for ISAM, MyISAM, and MEMORY (HEAP) tables, page-level locking for BDB tables, and row-level locking for InnoDB tables.

http://dev.mysql.com/doc/refman/4.1/en/internal-locking.html

References

星期四, 7月 21, 2011

vim 環境設定

  • 環境
    • 將vi以vim啟動
      就是下vi等於下vim
      # vi ~/.bashrc
      ---------/root/.bashrc----------
      alias vi='vim'  #加入這一行
    • 支援編碼
      vim /etc/vim/vimrc
      
      -----------/etc/vim/vimrc-------------------
      
      set fileencoding=utf-8,big5,gb18030  //支援中文utf-8,繁體big5及簡體gb
    • Turn on or off color syntax highlighting in vi or vim
      • 從環境變數設定
        # echo 'syntax on' >> /root/.vimrc
      • 使用中設定
        //command mode
        
        :syntax on //or off
    • 取消自動產生的*.ext~, .*.swp檔
      這是vi自動產生的備份檔 在/etc/vimrc下加入
      set nobackup #不產生*.ext~
      set noswapfile #不產生.*swp
      set nowritebackup #不管不產生哪一項,這個都要給
      
    • 關掉吵人的beep聲
      set vb
      vb = visual bell
    • 設定tab長度及自動縮排長度
      為了follow PSR規範... 不用tab,要用4個whitespace
      vi ~/.vimrc
      set tabstop=4
      set shiftwidth=4
  • 縮排 indent

    1. 取得indent檔
      先取得相關的indent檔,例如html縮排,會得到html.vim
      其他相關縮排檔
      • javascript
      • jQuery
      • php
      • php(html enhanced)
        由於php裡,常會夾html,而在原php的縮排對html的支援不是很好,所以有人做了加強版
        p.s. 作者預設縮3個空格,如果要改成縮8個,在第27行,set sw=3 //改成8即可
    2. 放到~/.vim/indent 
      如果沒有就自行建資料夾
    3. 啟動縮排
      在~/.vimrc中(如果沒有就自行建),加入 filetype indent on
  • 編輯
    • 取代斷行符號
      用vi編輯時,有時會遇到^M的斷行符號
      雖然不影響,不過還挺礙眼的
      幾百行下來還挺難改的,又打不出取代的符號,總算在找到取代的方法了
      :%s/^V^M//g

      ^v為CONTROL-V,而^m是CONTROL-M當打完這兩個時,就會出現
      :%s/^M//g
  • 縮排
    1. Html, JavaScript
      JavaScript Indent : Javascript indenter (HTML indent is included) , Preston Koprivica  
      直接下載 
      安裝:
      # tar xvf web-indent.tar  //解壓
      # cd web-indent/indent/     //進到html.vim及javascript.vim的資料夾
      # cp *.vim ~/.vim/indent/  //將*.vim全放到runtime目錄下的vim環境

參考網路的範例,調成自己用的
" encoding
 set encoding=utf-8
 set fileencodings=utf-8,cp950,latin1

"syntax
 syntax on " 語法上色顯示
 set nocompatible " VIM 不使用和 VI 相容的模式
 au BufReadPost *.volt set syntax=php
 au BufReadPost *.zep set syntax=php

"indent
 set shiftwidth=4 " 設定縮排寬度 = 4
 set tabstop=4 " tab 的字元數
 set softtabstop=4
 set expandtab

" setting
 set ruler " 顯示右下角設定值
 set backspace=2 " 在 insert 也可用 backspace
 set ic " 設定搜尋忽略大小寫
 set ru " 第幾行第幾個字
 set hlsearch " 設定高亮度顯示搜尋結果
 set incsearch " 在關鍵字還沒完全輸入完畢前就顯示結果
 set smartindent " 設定 smartindent
 set confirm " 操作過程有衝突時,以明確的文字來詢問
 set history=100 " 保留 100 個使用過的指令
 set cursorline " 顯示目前的游標位置
 set laststatus=2
 set statusline=%4*%<\%m%<[%f\%r%h%w][%{&ff},%{&fileencoding},%Y]%=\[Position=%l,%v,%p%%]
 set nu
 set cursorline

 " Color configuration
 set bg="solarized dark"
 color evening " Same as :colorscheme evening
 hi LineNr cterm=bold ctermfg=DarkGrey ctermbg=NONE
 hi CursorLineNr cterm=bold ctermfg=Green ctermbg=NONE

效果見下圖



References

星期一, 7月 18, 2011

window, document, dom的寬與高

  • document
    整份文件的高 $(document).height()
  • window
    視窗(browser)的高 $(window).height()
  • dom物件
    絕對高 $(xxx).position().top; //不是method哦


$(window).scroll(function(){
    console.log('document:%d, window:%d scroll:%d',
        $(document).height(),  //整份文件的高
        $(window).height(),      //視窗(browser)的高
        $(window).scrollTop()); //目前捲的位置
});

星期日, 7月 17, 2011

MySQL - select最佳化分析

利用EXPLAIN幫助索引和查出最佳化的查詢語法
EXPLAIN SELECT * FROM website WHERE url='http://homeserver.com.tw';

欄位資訊,完整版看官網EXPLAIN的欄位說明
Column Meaning
id The SELECT identifier
select_type The SELECT type
沒有union為simple, 其他看官網
table The table for the output row
type The join type
最優至最差的類型為system,const, eq_reg, ref, range, ..., ALL 
possible_keys The possible indexes to choose
key The index actually chosen
如果為NULL,則是沒有使用索引。
key_len The length of the chosen key
長度越短 準確性越高。
ref The columns compared to the index
顯示那一列的索引被使用。一般是一個常數(const)。
rows Estimate of rows to be examined
Extra Additional information
MySQL用來解析額外的查詢訊息。如果此欄位的值為:Using temporary和Using filesort,表示MySQL無法使用索引。

  • Extra
    Extra為MySQL用來解析額外的查詢訊息,其中欄位值所代表的意義如下:
    • Distinct:當MySQL找到相關連的資料時,就不再搜尋。
    • Not exists:MySQL優化 LEFT JOIN,一旦找到符合的LEFT JOIN資料後,就不再搜尋。
    • Range checked for each Record(index map:#):無法找到理想的索引。此為最慢的使用索引。
    • Using filesort:當出現這個值時,表示此SELECT語法需要優化。因為MySQL必須進行額外的步驟來進行查詢。
    • Using index:返回的資料是從索引中資料,而不是從實際的資料中返回,當返回的資料都出現在索引中的資料時就會發生此情況。
    • Using temporary:同Using filesort,表示此SELECT語法需要進行優化。此為MySQL必須建立一個暫時的資料表(Table)來儲存結果,此情況會發生在針對不同的資料進行ORDER BY,而不是GROUP BY。
    • Using where:使用WHERE語法中的欄位來返回結果。
    • System:system資料表,此為const連接類型的特殊情況。
    • Const:資料表中的一個記錄的最大值能夠符合這個查詢。因為只有一行,這個值就是常數,因為MySQL會先讀這個值然後把它當做常數。
    • eq_ref:MySQL在連接查詢時,會從最前面的資料表,對每一個記錄的聯合,從資料表中讀取一個記錄,在查詢時會使用索引為主鍵或唯一鍵的全部。
    • ref:只有在查詢使用了非唯一鍵或主鍵時才會發生。
    • range:使用索引返回一個範圍的結果。例如:使用大於>或小於<查詢時發生。 index:此為針對索引中的資料進行查詢。 ALL:針對每一筆記錄進行完全掃瞄,此為最壞的情況,應該儘量避免。

Reference

星期六, 7月 16, 2011

PHP 效能 - 快取篇

  1. APC
  2. Memcache

何時用APC (獨立在一台server)
  • Application Settings
  • Configuration
  • Data is the same for each user
  • request都由同一台server responses(i.e sticky session)
  • file upload process & sessions (if using sticky session)
何時用Memcache (分散在不同的servers)
  • 當request不保證指向同server時
  • Data is specific or targeted to a user
  • User sessions

References

Apach效能

  1. 確保足夠的RAM
    在無法購買更快的硬體情形下,硬體方面已經沒有方法讓伺服器更快,因此重點要確定有足夠的RAM
    • 利用top或ps檢視apache的process佔用的記憶體
    • 或限制最大的process數,利用MaxClients指令限制
  2. 以ab評校Apache的效能
    解答:apache/bin/ab -n 1000 -c 10 htp://www.example.com/test.html
    ab: 請求url的資源
    -n: request 1000次
    -c: 一次送出10個請求(同步的意思)
    適合用於輕微組態改變,並測試改變前後伺服器的效能
    note:,不要在欲測試的server試ab,因為ab會耗資源,所以效能會低於別台機器發出的ab,且同一台不會有網路delay
  3. 調校保持連線的設定
    解答:啟用KeepAlive指令,並將相關指令設定成合理值
    KeepAlive On
    MaxKeepAliveRequests 0
    KeepAliveTimeout 15

    KeepAlive可讓單一連線上多個請求,減少建立socket連線所需的時間
    MaxKeepAliveRequest即每個連線上允許多少請求
    KeepAliveTimeout 超過閒置時間即斷線,大多數15即可順利運作


Reference
Apache Cookbook, O'Reilly

星期六, 7月 02, 2011

vm指向host為gateway

最近把vm用在自己的nb上跑
利用bridge mode向dhcp取ip

有次到了沒網路的地方 才發覺沒辦法連到vm
才想說用自己的nb當gateway來連,這樣不用怕沒網路,也不用改ip了

想法是把vm的gateway設為自己的nb
不過試了好久,一直沒成功
請教仰哥後,果然成功了
再次感謝仰哥


  1. 選擇Nat模式
    在vm的Network Mode選擇Nat模式
  2. 抄下nat網卡的ip
    vm安裝好後,會建立2張網卡,抄下ip(右鍵/內容... 應該不用教吧)
  3. 設定gateway
    將vm裡的os的gateway設成步驟2的ip即可
  4. 就這麼簡單