聚會時間公告: 11月份聚會為11月15號星期六下午兩點在MocaMona / 講者:shawn Topic: Hello BIOS: EFI, an opensource firmware framework

十二月 1, 2008
» PHP 追蹤此 函數 被哪些 function 呼叫來使用過

現在大多程式都會在基本的 Libaray 上, 多包上幾層的 function 後再來使用, 但是要 Debug 時, 要如何知道在 call 此 function 前, 到底是哪個 function 呼叫到你, 呼叫到你之前, 到底有經過幾個 function? 怎麼印出從剛開始一直到呼叫你這個 function 前的所有 function list?

Debug back trace function

在之前都是透過 debug_backtrace() 來寫個簡易的 function 來追蹤, ex:

<?php
function get_backtrace()
{
    $history = debug_backtrace();
    $msg = '';

    foreach ($history as $i => $line) {
        $msg .= "#$i {$line['function']}() called at [{$line['file']}:{$line['line']}]\n" ;
     }

    return $msg;
}
?>

現在發現有更簡單的 debug_print_backtrace() 可以用, 連之前的 function 都不用寫了~

使用範例

<?php
function a() {
    b();
}

function b() {
    c();
}

function c(){
    debug_print_backtrace();                                                                                                
    // print_r(get_backtrace()); // 要用這個記得把上面的 function 加進來.
}

a();
?>

debug_print_backtrace() 的結果

  • #0  c() called at [/tmp/a.php:7]
  • #1  b() called at [/tmp/a.php:3]
  • #2  a() called at [/tmp/a.php:15]

get_backtrace() 的結果

  • #0 get_backtrace() called at [/tmp/a.php:12]
  • #1 c() called at [/tmp/a.php:7]
  • #2 b() called at [/tmp/a.php:3]
  • #3 a() called at [/tmp/a.php:15]

八月 18, 2008
» 查看 PHP extensions(*.so) 的 Function/Object 列表

平常我們使用的 PHP extensions 很多, 像 GD, cURL 等都是 extensions. 更多的 PHP Extension 可見 PECL :: The PHP Extension Community Library.

這些都是有文件的, 但是若遇到是別人寫, 沒有文件的該怎麼辦.. Q_Qa.. 要如何查看此 Extension 裡面有哪些 function/object 可以用呢?

這時後可以用 nm, 詳細解釋: nm - list symbols from object files

查看使用方式

假設現在是 Debian Linux, PHP5, 有安裝 php5-gd 和 php5-curl 的環境:

  1. cd /usr/lib/php5/20060613+lfs
  2. nm -D gd.so # 下述只截錄一小段, 完整的可自行執行看看就知道.
    00012dd0 T zif_gd_info
    00007a70 T zif_image2wbmp
    00011be0 T zif_imagealphablending
    0000ce60 T zif_imagearc
    0000bb70 T zif_imagechar
    0000bb30 T zif_imagecharup
    00006f10 T zif_imagecolorallocate
    000117a0 T zif_imagecolorallocatealpha
  3. nm -D curl.so
    00002a40 T zif_curl_close
    00003a60 T zif_curl_copy_handle
    00002990 T zif_curl_errno
    00002b40 T zif_curl_error
    00003660 T zif_curl_exec
    00002c20 T zif_curl_getinfo
    00003e30 T zif_curl_init
    00009a20 T zif_curl_multi_add_handle
    000091b0 T zif_curl_multi_close
    000095d0 T zif_curl_multi_exec
    000094f0 T zif_curl_multi_getcontent
    000092e0 T zif_curl_multi_info_read
    00009b80 T zif_curl_multi_init
    000098f0 T zif_curl_multi_remove_handle
    00009720 T zif_curl_multi_select
    00008f90 T zif_curl_setopt
    00008e20 T zif_curl_setopt_array
    00004cb0 T zif_curl_version

看 T 系列, 把 "zif_" 拿掉, 就是 function name 囉~ :)

若沒有文件的狀況下, 就希望 Function name 是易懂的名字吧~ XD

八月 11, 2008
» Mplayer 聲音比較快, 畫面比較慢

Hp Compaq Nc6000 的 notebook 灌 Ubuntu/Debian Linux 後, 從來沒拿來看電影, 最近突然想要在睡覺前來看電影, 就灌個 Mplayer 來看, 遇到 Mplayer 聲音比較快, 畫面比較慢 的狀況.

剛開始就先 mplayer -framedrop # 把來不及的捨棄(先求能看 :P), 看起來就順了, 不過感覺還是很遜. (很明顯某些畫面就不見了. Q_Qa)

後來想想應該是 Video driver 的問題(因為畫面跟不上), 就 mplayer -vo help 找合適的用.(之前機器都是用 xv 或 x11 就跑得很順了)

測試結果: mplayer -vo sdl 就可以很順暢的播放囉~ :P

五月 7, 2008
» gVim 的 color scheme (ir_black.vim)

預設 gVim 的 scheme 裡面, 我都用 desert (/usr/share/vim/vim71/colors/desert.vim).

前幾天看到 ir_black 的 scheme, gVim 的 ir_black.vim color scheme 包含 Ruby/Java/HTML 等 syntax, 直接套在 Vim 裡面, 顏色有點暗, 看不太清楚, 不過在 gVim 裡面看起來就很舒服, 應該是 Command line Vim 只有 16 色, 而 gVim 有 256 色的差別吧~:)

關於 ir_black scheme 詳細可見: The last Vim color scheme you'll ever need (頁面內附圖的字型使是 Monaco)

安裝

  1. 下載 ir_black.vim
  2. mkdir ~/.vim/colors/
  3. mv ir_black.vim ~/.vim/colors/
  4. vim ~/.gvimrc (下述 guifont 看你要用哪種字型, 就設那種字型)
    colorscheme ir_black
    syntax on
    set number
    "Linux gVim 用如下\ 12
    set guifont=Monaco\ 12
    "set guifont=Consolas\ 12
    "set guifont=mingliu\ 12
    "Windows gVim 用如下\ 12
    "set guifont=mingliu:h12

作者其它作品 (For Mac 用戶)

其它相關網頁

五月 3, 2008
» CSS 連結屬性:LoVe, HAte

LoVe, HAte 是 CSS Link 屬性在解說時常用來快速記憶的方法. 主要是 a: 在寫的時後, 要依照 a:link, a:visited, a:hover, a:active(LVHA)的順序寫, 不然某些屬性就不會有作用.

不過每次要解說時, 我都只記得 愛,恨, 然後總是想不起來哪個字怎麼對應... XD

趁著在 5/2網頁標準設計課程 看到, 趕快做個筆記~~

說明

  • L: link 未瀏覽的連結
  • V: visited 已瀏覽過的連結
  • H: hover 滑鼠移到連結上
  • A: active 在連結上按下滑鼠

寫法

  • a:link, a:visited, a:hover, a:active { text-decoration: none; }
  • a:link {}
  • a:visited {}
  • a:visited:hover {}
  • a:hover {}
  • a:active {}

五月 1, 2008
» 使用 Apache htaccess 快速於網頁 Header/Footer 插入特定程式

當看到一卡車的檔案, 每個檔案都要進去裡面加個 include 或某些資料, 想到就很辛苦~

另一種做法就是用 Apache .htaccess 的功能, 就可以快速達到這點~

.htaccess 是對整個目錄以下的做動作, 所以下述參數會對此目錄的所有檔案都加上 header.php.

php_value auto_prepend_file / auto_append_file 設定

  • php_value auto_prepend_file "header.php" # 在每個檔案的最上方(前方), 都把 header.php 的內容插入
  • php_value auto_append_file "footer.php" # 在每個檔案的最下方(後方), 都把 footer.php 的內容插入

其它常用設定

  • DirectoryIndex index.html index.htm index.php # 此目錄下如果沒輸入檔名, 預設搜尋順序
  • AddType application/x-httpd-php .html .htm # 讓 .html .htm 都經過 php parser
  • php_value default_charset utf-8 # 預設編碼吐 UTF-8

四月 18, 2008
» PHP 浮點數運算後的比對陷阱

PHP 於浮點數比對都是正常的, 但是如果其中一個浮點數有做過運算, 比對起來就都會是 False.

版本:

  • PHP 5.2.5-3 with Suhosin-Patch 0.9.6.2 (cli)
  • PHP 5.1.6 (cli)
  • 目前測試於此二個版本, 都有此狀況.

詳可見下範例:

<?php
$a = 43.31;
$b = 7.51 + 35.80;

/* 第一次ooxx */
echo ($a == $b) ? "ok\n" : "no\n"; // no

/* 先強迫轉一次浮點數 */
$a = floatval($a);
$b = floatval($b);

/* 再確認一次型態都相同 */
echo gettype($a) . "\n"; // double
echo gettype($b) . "\n"; // double
echo gettype(43.31) . "\n"; // double

/* 第二次ooxx, $b != 43.31 */
echo ($a == 43.31) ? "a=43.31\n" : "a!=43.31\n"; // a=43.31
echo ($b == 43.31) ? "b=43.31\n" : "b!=43.31\n"; // b!=43.31

/* 再確認一次型態, 值 都相同 */
var_dump($a); // float(43.31)
var_dump($b); // float(43.31)

echo $a . "\n"; // 43.31
echo $b . "\n"; // 43.31

/* 第三次ooxx, $a != $b => 43.31 != 43.31? */
echo ($a == $b) ? "ok\n" : "no\n"; // no

/* 轉換成字串來比對 */
$a = strval($a);
$b = strval($b);
echo $a . "\n"; // 43.31
echo $b . "\n"; // 43.31
echo ($a == $b) ? "ok\n" : "no\n"; // ok

/* 試試後面多 0 的狀況 */
$a = 43.31;
$b = 7.51 + 35.800;
// 保險點可以先轉 float 後, 再轉 str
// ex: $a = strval(floatval($a));
$a = strval($a);
$b = strval($b);
echo $a . "\n"; // 43.31
echo $b . "\n"; // 43.31
echo ($a == $b) ? "ok\n" : "no\n"; // ok
?>

上述例子遇到的狀況就是, $a = 43.31, $b = 7.51 + 35.80, 明明都是 43.31, 但是比對判斷 $a 就是都不等於 $b, 不知道是踩到地雷, 還是這樣子的寫法本來就不對, 還請有經驗的人指導. Orz.

最後想到的解法是, 轉成字串再來比對就通過了....

其它解法

感謝 Jace 的指點: 電腦就是差分器, 它的小數是用 1/2 + 1/4 + 1/8 .... + 1/n 這樣的做法, 所以有出現 000001 的差距(雖然我也是猜想這樣, 但是印不出 000001 就是覺得怪怪的), 0000001 這種是不會被表示出來的.

參考 小數點不準 這篇文章的內容, 看起來是用 bcadd 來解決, 詳如下:(範例有另外使用 bccomp 來做比對動作)

<?php
$a = 43.31;
$b = bcadd(7.51, 35.8, 2);
/* 下述兩者比對方式都可以 */
echo ($a == $b) ? "ok\n" : "no\n"; // ok
var_dump((0 == bccomp($a, $b, 2))); // true
?>

註: bcadd() 的方式是, 前面兩個參數相加, 第三個參數是要取幾位, 此範例是要取兩位, 所以寫 2, 超過小數 2位的會自動被移除, 所以值就會相等就不會有 000001 的狀況.

二月 6, 2008
» Ruby 程式語言初步學習

每次都說要學 Ruby, 但是都沒有動力去學~ 買了 "Ruby Programming - 向Ruby之父學程式設計" 這本書, 也是一直沒看, 正好昨天剛從美國回來, 時差因素睡不著, 趁凌晨就花點時間把這本書看完, 順便做了一些筆記~(第 1~9 章的筆記, Module 部份暫時不寫, 尚未理解, 等測試後再另外補充)

相信程式有基礎的, 應該看看就懂了~ :)

感覺 Ruby 的程式寫起來, 蠻語意化的. 型態分別一律都是 Object, 所以要再注意一下.(PHP 一律都用 $, 在 Ruby 有分 $/@/@@ 等).

至於 Rails, 等 Ruby 再熟悉一點再碰, 不要還不會走路就想要跑~ :)

Ruby 的 彈性很大, 然後 Rails 就是綁死寫法(MVC). 我覺得 語言彈性大(也要夠簡單), Framework 綁死寫法, 這樣會比較容易被一般大眾接受.

ruby 要直接在 command line 執行的話, 會有亂碼的問題, 解法: ruby -Ku # u => UTF-8

Print/puts/p/pp

  • print("hello world\n")
  • puts("hello world")
  • p "100" # 類同 print_r
  • p 100
  • print("sin(3.1415) = ", sin(3.1415), "\n")
  • require "pp"; pp array  # 格式排的比較好看的 p

前端頁面要秀出

  • h()

Class type

  • Numeric
  • String
  • Array
  • Hash
  • Regexp
  • File

Variable

  • 區域變數 小寫字母 或 _ 起頭的變數
  • 全域變數 $ 起頭的變數
  • 實體變數 @ 起頭的變數
  • 類別變數 @@ 起頭的變數
  • 虛擬變數 true / false / self

Ruby 習慣命名法

  • variable: sort_list_by_name
  • function name: sortListByName

Variable

  • age = 18
  • name = 'Jon'
  • hello = 'Hello World,'
  • hi = hello + name # Hello World,Jon

Comment

  • =begin
  •   comment
  • =end
  • # comment

Array

  • name = []
  • name = ["abc", "def", "ghi", "jkl"]
  • print "first name", name[0], "\n" # abc
  • p name[1] # def
  • p name # ["abc", "def", "ghi", "jkl"]
  • name.size # 4
  • %w: 元素是字串且不含空白
  • lang = %w(Ruby Perl Python)
  • p lang # ["Ruby", "Perl", "Python"]

Hash

  • name = {"normal" => 0, "small" => -1, "big" => +1, "same" => "the same"}
  • p name["normal"] # 0
  • p name["big"] # +1
  • name["verybig"] = "+2"
  • p name["verybig"] # "+2"
  • name.each { |key, value|
  •     print "This: ", key, " => ", value, "\n"
  • }

Regex

  • p /Ruby/ =~ "Ruby" # 0 (first position)
  • p /Ruby/ =~ "Diamond" # nil
  • p /Ruby/ =~ "It's Ruby" # 5
  • p /Ruby/i =~ "ruby" # 0

If/else

  • p (1 != 1)
  • if "Ruby" == "Ruby"
  •     print("true")
  • end

[then 可省略]

  • if "Ruby" == "Ruby" then
  •     print("true")
  • end
[then 可省略]
  • if "Ruby" == "Ruby" then
  •     print("true")
  • else
  •     print("false")
  • end

[then 可省略]

  • if x > 1 && x < 10 then
  •     # a
  • elsif x == 5 then
  •     # b
  • else
  •     # c
  • end

一行寫法: print "a > b" if a > b

[then 可省略]

  • unless a > b then
  •     # print a < b condition
  • end

[then 可省略]

  • item = array[0]
  • case item
  • when String then
  •     puts "This is a String."
  • when Numeric
  •     puts "This is a Numeric."
  • when /^From/i
  •     puts "First word is From."
  • else
  •     puts "This is a something."
  • end

case 中, when 用的是 ===, === 是 比對 區段所指定的值

  • # when A => if A === value
  • p ((1..3) === 2) # true
  • p /zz/ === "zyzzy" # 2
  • p String === "xyzzy" # true

Loop

times
  • 100.times {
  •     print "print 100 times"
  • }

[do 可省略]

  • 100.times do
  •     print "print 100 times"
  • end
for
  • sum = 0
  • for i in 1..5
  •     sum += i
  • end
while/do
  • [do 可省略]
  • i = 1
  • while i < 10 do
  •     puts(i)
  • end
util (while 反過來)
  • util sum > 50
  •     sum += 1
  • end

each (foreach)

  • name = ["abc", "def", "ghi", "jkl"]
  • name.each { |n|
  •     print n, "\n"
  • }

loop (無窮迴圈, 要搭配 break/next/redo)

  • break: 停止動作, 馬上跳出迴圈
  • next: 直接跳到迴圈的下一個 (continue)
  • redo: 以相同的條件重新進行這一圈
  • loop {
  •     puts "hello world"
  • }

例外處理

  • begin
  •     有可能發生例外的處理動作
  • rescue
  •     例外發生時的處理措施
  •     retry # 重新再跑一次 begin
  • ensure
  •     無論例外發生與否都堅持要執行的動作
  • end
  • $! 最後發生的例外(例外物件)
  • $@ 最後例外所發生的位置相關資訊
  • 例外物件的方法:
  • class 例外種類
  • message 例外的訊息
  • backtrace 例外的發生位置資訊($@ = $!.backtrace)

Function

  • def hello
  •     print "hello world"
  • end
  • def hello2(a, b=1, c=2)
  •     print "hello world"
  • end
  • hello(); hello2(1, 2, 3)

Class

說明:(可用可不用)

  • attr_reader :name 只定義用來讀取的方法(定義 name 方法)
  • attr_writer :name 只定義用來寫入的方法(定義 name= 方法)
  • attr_accessor :name 定義用來讀取與寫入的方法(定義上述兩種方法)
Example:
  • class HelloWorld # class << HelloWorld
  •     Version = "1.0"
  •     @@count = 0
  •     def initialize(myname="Ruby")
  •         @name = myname
  •     end
  •     # initialize always private
  •     def hello # def HelloWorld.hello(name), def self.hello(name)
  •         @@count += 1
  •         print "Hello, World. I am ", @name, ".\n"
  •     end
  •     public: hello # defalue
  •     def name=(value) # modify @name, => attr_accessor :name
  •         @name = value
  •     end
  •     private: name
  •     def HelloWorld.count
  •         @@count
  •     end
  • end
  • bob = HelloWorld.new("Bob")
  • alice = HelloWorld.new("Alice")
  • ruby = HelloWorld.new # ruby = HelloWorld::new
  • bob.hello
  • p HelloWorld::Version # "1.0"
  • p HelloWorld.count # 1

String class: ext_string.rb

  • class String
  •     def count_word
  •         ary = self.split(/\s+/)
  •         return ary.size
  •     end
  • end
  • str = "Just Anther Ruby Newbie"
  • p str.count_word # 4

繼承

  • class RingArray < Array
  •     def[](i)
  •         idx = i % size
  •         super(idx)
  •     end
  • end
  • eto = RingArray["子", "丑"]
  • p eto[1] # 丑
  • p eto[-1] # 丑

Require file

  • require "hello" # hello.rb
  • hello()

Command line

  • print "First args: ", ARGV[0], "\n"

Read file

  • filename = ARGV[0]
  • file = open(filename)
  • text = file.read # read all file
  • =begin
  • while text = file.gets do # read one line
  •     print text
  • end
  • =end
  • print text
  • file.close

Ruby 物件的唯一性

  • 所有物件都有一個 ID 與 值, 可以用 object_id 或 __id__ 取得
  • ary1 = []
  • ary2 = []
  • p ary1.object_id # -605604308
  • p ary2.__id__ # -605604309
  • ary3 = ary1

Check 是否為相同物件 (equal 的 "? / ()" 中間不能有空白)

  • p ary1.equal?(ary2) # false
  • p ary1.equal?(ary3) # true
  • p "".empty? # true
  • p "AA".empty? # false

Type

  • ad = ARGV[0].to_i # ad = "1980".to_i (to integer)
  • print ad - 1911
  • p "12.3".to_f # 12.3
  • p 1.2.round # 1
  • p 1.8.round # 2

Other

  • ary = [] # ary = Array.new
  • str = "Hello"
  • p ary.class # Array
  • p str.class # String
  • p str.is_a?(String) # true
  • p str.is_a?(Object) # true

其它相關網頁

十一月 29, 2007
» HTML 預設選取參數(checked/selected)

何時要用 checked, 何時用 selected, 常常都會搞混 .... 整理一下比較實在.

  • checkbox: checked
  • radio: checked
  • select: selected
  • 總之: input 欄位的都是用 checked, select 的用 selected.

Form 的 Input 型態(<input type="型態">)

  • text
  • password
  • file
  • submit
  • image => 這個要另外加上 src="" 的屬性
  • button
  • reset
  • hidden
  • checkbox => 預設勾選 checked
  • radio => 預設選取 checked
  • <input disable> 會把此欄變灰色, 不能 輸入/修改 資料.
  • <input readonly> 此欄的資料就將是唯讀, 沒辦法修改. (感謝 ㄚ凱 提供)

Form 的  Select:(<select><option> ...</option></select>)

  • option => 預設選取 selected

其它參考

十月 2, 2007
» PHP: 數值爆表, 出現科學記號的解法(科學記號 轉換成 數值)

在 MySQL 設定欄位型態是 float, 然後存入 1000000, 再撈出此資料, 會秀出 1e+06 的科學記號(MySQL 內部也是存這個值).

在 PHP 裡面只要用 number_format 的 function 就可以解決此問題, 範例如下:

$num = 1e+06;
echo number_format($num);

原本 echo $num 會印 1e+06, 透過 number_format 後, 就會秀出 1,000,000 囉~ :) 

九月 20, 2007
» CSS: 讓圖片蓋在 Flash Player 上面(使用 z-index)

要讓圖片能浮在 Flash 上面, z-index 怎麼設都沒用, 都會被 Flash 蓋掉.

Flash 設法

先來看 Flash, 網站上要秀 swf 檔有兩種設法:

  1. 傳統 <object> + <embed> 包 swf 檔
  2. 官方(Adobe)建議: Adobe - Developer Center : 因應宣佈的瀏覽器變更為具備動態內容的網站做好準備, 盡量使用他提供的 AC_RunActiveContent.js 和C_ActiveX.js 來秀 swf 檔, 並另外用 <noscript> 將原本的 <object><embed> 包進來(以防使用者把 Javascript 關閉的狀況).

Adobe 提供的 JS 檔下載可見: activecontent_samples.zip, 摘錄網站上的說明:

  • AC_RunActiveContent.js: 您可使用此檔案來解決「外部 JavaScript 解決方案: 適用動態內容的多種情況」中所述的 Flash 和 Shockwave 內容問題。
  • AC_ActiveX.js: 您可使用本檔案來解決「其他動態內容類型的解決方案」一節所述的問題。
  • SampleActiveContent.html: 本檔案提供程式碼範例, 當您在使用 AC_RunActiveContent.js 和 AC_ActiveX.js 檔案時, 可用於 HTML 網頁中。

詳細設法可抓取 zip 檔後, 看 SampleActiveContent.html 即可.(若不用 ActiveX, 可以不用載入 AC_ActiveX.js)

CSS z-index 屬性

再來看 CSS, CSS 的 z-index 屬性: CSS z-index Property, z-index 是數值越大浮在頁面上的越上面, 但是 z-index 只能在使用 position(CSS Positioning) 的範圍內才有效(ex: position:absolute/relative/fixed 等).

上面的 Flash 兩種設法都設, z-index, position 都設進去, 但是要將圖片蓋在 Flash 上, 怎麼都蓋不上去.

正好看到一篇 z-index 的文章(Give Me Some Zzzzz’s), 也有人有問此問題(看下面的留言找 Flash 就會看到), 原來是要對 Flash 著手, 一直對 z-index 找資料, 真是找錯方向了. Orz..

主要解法如下:

針對 <object>/<embed> 的設法:

  • 於 <object> 內加 <param name="wmode" value="transparent">, ex: <object>.... <param name="wmode" value="transparent"> ...</object>
  • 於 <embed> 內加 wmode="transparent" 參數, ex: <embed wmode="transparent" ....>

針對 AC_RunActiveContent.js 的設法:

  • 於 AC_FL_RunContent() 多加 'wmode', 'transparent' 的參數, ex: AC_FL_RunContent(.... 'wmode', 'transparent' ...);
  • <noscript> 內, 應該最好也要加如上述 <object>/<embed> 的參數.

WMODE 的參數解釋可參考: Flash, DHTML Menus and Accessibility 這篇, 下面節錄 Window, Opaque, Transparent 的說明:

  • Window: Use the Window value to play a Flash Player movie in its own rectangular window on a web page. This is the default value for wmode and it works the way the classic Flash Player works. This normally provides the fastest animation performance.(Default Mode: 動畫效能最好)
  • Opaque: By using the Opaque value you can use JavaScript to move or resize movies that don't need a transparent background. Opaque mode makes the movie hide everything behind it on the page. Additionally, opaque mode moves elements behind Flash movies (for example, with dynamic HTML) to prevent them from showing through.(用 JS 移動 或 Resize, 不需要設定穿透性的背景, 此模式會讓背景的東西藏在 Flash player 後面)
  • Transparent: Transparent mode allows the background of the HTML page, or the DHTML layer underneath the Flash movie or layer, to show through all the transparent portions of the movie. This allows you to overlap the movie with other elements of the HTML page. Animation performance might be slower when you use this value.(可讓 HTML/DHTML 的背景圖 或 Flash player 後面的圖片、背景圖 或 Layer 都能穿透 Player 秀出來).

參考

八月 21, 2007
» Subversion commit 取用 svn-commit.tmp

SVN commit 失敗時, 會留下一個 svn-commit.tmp 檔, 把之前打的 log message 留下來, 不過通常都是 svn update 後(合併完成), 馬上又要再 commit 一次, 但若是之前有打長長一篇的 log message 就不想再重打, cat svn-commit.tmp 再 pipe 進去覺得蠻遜的, 總覺得應該要有簡單的做法才對. :P

看看 svn help commit, 發現有 -F 可以用, 平常都只有用 -m 'message' 而已.

  • -m: 在於只有一行打完, 可以快速 commit 用.
    ex: svn ci -m 'log message'
  • -F: 會把檔案內容讀進來, 然後直接 commit, 想當然就用 -F 直接取 svn-commit.tmp 來 commit.
    ex: svn ci -F svn-commit.tmp

PS: commit 完後, 還是要手動 rm svn-commit.tmp.