<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6168713791789324667</id><updated>2011-07-31T11:11:36.429+08:00</updated><category term='Others'/><category term='Coding'/><category term='Web Game Experiences'/><category term='Widget'/><category term='Book'/><category term='Security'/><category term='Blog'/><category term='C/C++'/><title type='text'>Ulyness's Coding Square</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-3095190389246537798</id><published>2009-10-27T09:59:00.009+08:00</published><updated>2009-10-27T10:07:56.955+08:00</updated><title type='text'>多重Singleton時的問題，與嘗試解決</title><content type='html'>一樣是寫遊戲時遇到的狀況。因為越來越複雜了，不寫下來搞不好過一段時間我就忘了。（關於Singleton是什麼我就不在這邊介紹了，請參閱「Design Pattern」，有中文版）&lt;br /&gt;&lt;br /&gt;首先是一開始。我的遊戲需要以PHP提供的標準函式庫連接SQL資料庫，其中需要保管該次連接唯一的connection。最早是在最上層開一個connection，然後逐層傳下去。想也知道這樣缺乏效率（主要是&lt;span style="font-weight: bold;"&gt;每個&lt;/span&gt;function都需要有那麼一個傳入欄位），所以後來改的作法是採用Singleton。要的function自己去拿一份reference出來。&lt;br /&gt;&lt;br /&gt;我的Singleton的實作方式是將reference以static member的形式存在class中，然後每次需要時就去拿該object的reference出來。PHP的object是在沒有人reference到他時才釋放。因此在這裡，該object的release是在全部程式碼執行完要釋放static member的Shutdown階段。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;##ReadMore##&lt;br /&gt;好了，SQL connection的問題解決，再來是SQL的table（跟row）。我把SQL各table取名為XxxxDB（xxxx是table名），例如：CharDB ，BattleDB。每個object代表一個row。construct的時候讀出資料存入row，destruct的時候檢查有哪些值被更新了，寫入資料庫後才結束。&lt;br /&gt;&lt;br /&gt;這樣的作法運作正常，但有個問題：在多層的function call裡面，容易造成資料不同步的情形。比如說現在的狀況是，function a呼叫b然後b呼叫c。在a跟b跟c裡面都各自造出了CharDB的同一個row的object。c裡面那個object改動了數值，並在離開c的scope後寫入了資料庫。但a跟b裡面持有的還是舊的資料，並沒有跟資料庫同步到。&lt;br /&gt;&lt;br /&gt;在這邊一開始要寫Singleton時遭遇到困難（後述），因此採用的是別的方法。那時最後的作法是當c的值更新時，他會去通知a跟b之後要記得取得新值。&lt;br /&gt;&lt;br /&gt;這個做法彆扭了些，而且某些狀況下需要手動處理。（想一下上面的a,b,c的狀況，但是這次是a在呼叫b之前造出該object並改動了值。在這裡a還沒有到scope結束所以不會寫入資料庫，但不寫入資料庫b就得用錯誤的資料。因此，a得&lt;span style="font-weight: bold;"&gt;手動進行寫入&lt;/span&gt;）因此我又開始想Singleton的作法了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在這邊講一下XxxxDB也用Singleton時的問題。如上所述，Singleton的object，釋放時機是Shutdown階段。可是我們現在用到了兩類用途不同的class。&lt;span style="font-weight: bold;"&gt;其中一個會用到另一個&lt;/span&gt;。XxxxDB在釋放時有可能會更新資料到資料庫，因此這時SQL connection不能被釋放。但是這兩個都是Singleton...&lt;br /&gt;&lt;br /&gt;所以看來我們得控制Shutdown階段，release的順序了。有人可能想到，在XxxxDB的object裡面存放一個SQL connection的reference如何？嗯，我試過了，不過顯然Shutdown階段release時不會去管還有沒有reference。所以SQL connection還是有可能在XxxxDB之前釋放，失敗。另外，PHP沒有辦法讓你調整Shutdown階段釋放資源的順序。（我懷疑有哪個程式語言有）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;後來我找到的作法是，標準函式庫的register_shutdown_function()。這個函式會讓你註冊一到數個function，並在Shutdown開始前依序呼叫它們。所以我利用這個函式，在Shutdown開始前把各XxxxDB來自static member的reference清掉。這樣，object的reference就斷光並開始自動release。XxxxDB在Shutdown開始前release完畢，SQL connection則在Shutdown時release。順序正確。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;不過有那麼簡單我就不會想發這篇了。新的問題是出在一個名為BattleDB的class。因為Web Game的某些特性，單場戰鬥的資料不能只放在記憶體還得寫入資料庫，而這就是對應的class。&lt;br /&gt;&lt;br /&gt;BattleDB的重點在於，為了操作方便，他存有兩個CharDB的object的reference。然後還有一個名為BattleAct的class。這是為了處理行動回數等資料方便而造出的class。每個BattleDB的object持有一個BattleAct的object。為了方便，每個BattleAct也同樣持有&lt;span style="font-weight: bold;"&gt;對應的BattleDB的object（的reference）&lt;/span&gt;。而在我將XxxxDB處理的部份改為Singleton後，BattleDB這邊動作出了問題。&lt;br /&gt;&lt;br /&gt;我原本以為是CharDB的object的reference釋放上的問題，不過後來發現不是。重點在於BattleAct持有的BattleDB object reference。想像一下。原本BattleDB object是在Shutdown階段前，因為register_shutdown_function()的呼叫而切斷static member的reference。釋放。&lt;span style="font-weight: bold;"&gt;但是現在BattleAct還有它的reference&lt;/span&gt;。而BattleAct object本身的reference被BattleDB object持有，也不會自動釋放。所以變成得到Shutdown，釋放所有資源時才release。若這時SQL connection已經release，自然的問題就出現了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;問題的解法呢。目前的作法是每次BattleDB用完時就呼叫自訂函式Close()，在裡面把BattleAct釋放掉。幸好BattleDB使用到的時機挺單純的。不過當然了，這樣做彆扭又可能對未來的擴充造成影響，之後可能還是得改。一個做法是把BattleAct併回BattleDB內部，取消相互reference問題。&lt;br /&gt;&lt;br /&gt;這次的教訓是：&lt;span style="font-weight: bold;"&gt;注意相互reference的dead lock&lt;/span&gt;...尤其在記憶體自動回收的程式語言中。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-3095190389246537798?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/3095190389246537798/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=3095190389246537798' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3095190389246537798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3095190389246537798'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/10/singleton.html' title='多重Singleton時的問題，與嘗試解決'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-5990822192615712529</id><published>2009-05-31T21:42:00.000+08:00</published><updated>2009-05-31T21:43:07.917+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book'/><title type='text'>[書評]Web安全測試錦囊妙技</title><content type='html'>電腦書，題材如其名，出版社歐萊禮。&lt;br /&gt;&lt;br /&gt;這本的主題是教你如何用各種免費軟體搞掛....噢不，測試Web應用程式。要注意的是，這本主要採用的是測試員的角度，也就是說「你沒有完整的Server端程式碼也沒有相關知識，也許你可以跟工程師要，但是不太可能太頻繁或詳細」的立場。如果你自己就是Web應用程式的撰寫者，會免去不少麻煩，但其中幾個也會不那麼需要做。當然，相關知識先有總是好的。&lt;br /&gt;&lt;br /&gt;內容上，書中詳細的提到了各種基礎動作跟比較具體的攻擊法。更詳細的深入的話，書中有介紹網站跟書籍。&lt;br /&gt;&lt;br /&gt;如果對Web安全議題沒有多少了解的話，這本相信是很不錯的入門書籍。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-5990822192615712529?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/5990822192615712529/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=5990822192615712529' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5990822192615712529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5990822192615712529'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/05/web.html' title='[書評]Web安全測試錦囊妙技'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-1250799982201256604</id><published>2009-05-21T09:39:00.006+08:00</published><updated>2009-05-21T10:18:32.439+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>Web Security測試用工具</title><content type='html'>以下是從「Web安全測試錦囊妙計」第二章擷取出來的（歐萊禮出版，原書名Web Security Testing Cookbook）。目的是為了我不用每次都打網址...XD&lt;br /&gt;&lt;br /&gt;下面列表我會寫上必要的註解，不過還是建議需要的話自己去看原書&lt;br /&gt;&lt;br /&gt;工具列表：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.moztw.org/"&gt;Firefox&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Fx Extension:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/655"&gt;View Source Chart&lt;/a&gt; (不適用Fx3，但有適用的實驗版本)&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/1843"&gt;Firebug&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/966"&gt;Tamper Data&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/4510"&gt;Edit Cookies&lt;/a&gt; (適用於Fx3的是新版：&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/573"&gt;Add N Edit Cookies&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/59"&gt;User Agent Switcher&lt;/a&gt; (不知為何裝起來沒作用...)&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/zh-TW/firefox/addon/125"&gt;SwitchProxy&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://dawes.za.net/rogan/webscarab/WebScarab.jnlp"&gt;WebScarab&lt;/a&gt; (需要Java Runtime)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Perl (Windows: &lt;a href="http://www.activestate.com/downloads/"&gt;ActivePerl&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.owasp.org/index.php/Category:OWASP_CAL9000_Project"&gt;CAL9000&lt;/a&gt;&lt;br /&gt;注意：原作者有警告，不要把這東西放在網路Server上，請在本機端環境操作他&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.pluralsight.com/tools.aspx"&gt;ViewState Decoder&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://curl.haxx.se/download.html"&gt;cURL&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.squarefree.com/pornzilla"&gt;Pronzilla&lt;/a&gt; (這是一組而非一個工具)&lt;br /&gt;注意：這些是為了情色目的開發的工具，但只要你不針對該方向使用，工具本身事「純真無邪」的（書上就這麼寫XD）。&lt;/li&gt;&lt;ol&gt;&lt;li&gt;RefSpoof: 修改HTTP Referer&lt;/li&gt;&lt;li&gt;Digger: 目錄橫跨(Directory traversal)工具&lt;/li&gt;&lt;li&gt;Spiderzilla: Website Spider&lt;/li&gt;&lt;li&gt;Increment &amp;amp; Decrement: 竄改URL參數&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.cygwin.com/"&gt;Cygwin&lt;/a&gt; (建議加裝Perl)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.cirt.net/nikto2"&gt;Nikto 2&lt;/a&gt;  (需要Perl &amp;amp; Cygwin, 需要&lt;a href="http://sourceforge.net/projects/whisker"&gt;LibWhisker&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://portswigger.net/suite/download.html"&gt;Burp Suite &lt;/a&gt;(非完全免費，但免費的部份就有用)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://httpd.apache.org/download.cgi"&gt;Apache HTTP Server&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-1250799982201256604?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/1250799982201256604/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=1250799982201256604' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1250799982201256604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1250799982201256604'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/05/web-security.html' title='Web Security測試用工具'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-8294989724249500929</id><published>2009-05-12T10:25:00.001+08:00</published><updated>2009-05-12T10:28:40.990+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>以索引的方式取用Smarty的config變數</title><content type='html'>我遇到的狀況是這樣。假設我在Smarty的config檔裡面寫了這樣的內容：&lt;br /&gt;&lt;blockquote&gt;level1 = 等級一&lt;br /&gt;level2 = 等級二&lt;br /&gt;level3 = 等級三&lt;/blockquote&gt;一般來說在template裡面，我要呼叫上述內容的寫法是：&lt;br /&gt;&lt;blockquote&gt;{#level1#}&lt;/blockquote&gt;&lt;br /&gt;問題來了，如果我現在要依照PHP檔輸入的內容動態的取用上述內容的話呢？&lt;br /&gt;比如說，透過PHP檔內的動作，現在template裡有個變數$para，內容是"level1"。&lt;br /&gt;我想用它來取得config檔內同名的變數的數值。&lt;br /&gt;&lt;br /&gt;很直覺的想法會是&lt;br /&gt;&lt;blockquote&gt;{#$para#}&lt;/blockquote&gt;之類的對吧？不過很可惜，Smarty不支援這種語法。&lt;br /&gt;Smarty的config檔的變數(已讀入的)也會以$smarty-&gt;config-&gt;level1之類的方式儲存，&lt;br /&gt;不過當然的，我也不能寫成$smarty-&gt;config-&gt;$para。&lt;br /&gt;&lt;br /&gt;另一種想法是config裡面能不能直接寫陣列？&lt;br /&gt;我自己嘗試不行，我也沒看到哪個範例可以的。&lt;br /&gt;&lt;br /&gt;最後達成的作法是藉由template內嵌php程式碼。&lt;br /&gt;將config的內容重組成template variables的陣列，傳入template中。&lt;br /&gt;&lt;blockquote&gt;$ar = array('level1', 'level2', 'level3');&lt;br /&gt;foreach($ar as $v)&lt;br /&gt;{&lt;br /&gt;    $ar2[$v] = $this-&gt;get_config_vars($v);&lt;br /&gt;}&lt;br /&gt;$this-&gt;assign('ar', $ar2);&lt;/blockquote&gt;然後在template裡面使用。&lt;br /&gt;&lt;blockquote&gt;$ar[$para]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;雖然是相當拐彎抹角的作法，不過會比在template裡面寫一堆重複的程式碼好多了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-8294989724249500929?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/8294989724249500929/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=8294989724249500929' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/8294989724249500929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/8294989724249500929'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/05/smartyconfig.html' title='以索引的方式取用Smarty的config變數'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-4604894334915318327</id><published>2009-05-05T12:00:00.004+08:00</published><updated>2009-05-21T09:54:57.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><title type='text'>如何建立單機性質的SVN版本控管</title><content type='html'>&lt;span style="font-weight: bold;"&gt;單機性質SVN&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;版本控管以及備份的重要性應該不用多講了，而SVN有多麼優秀也不用多提。&lt;br /&gt;只是一般聽到的SVN都是需要一個網路上的SVN Server，&lt;br /&gt;那自己寫點小東西，沒有SVN Server又想要版本控管的話該怎麼辦呢？&lt;br /&gt;這就是這篇文章的主題。建立一個個人的SVN版本控管。&lt;br /&gt;基本上是參考&lt;a href="http://vincenthomedev.wordpress.com/2007/10/15/setup-svn-local-repository-step-by-step/"&gt;這篇&lt;/a&gt;的，不過我會用中文口語的講出來。&lt;br /&gt;&lt;br /&gt;步驟：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;下載TortoiseSVN最新版。我是用Windows版&lt;/li&gt;&lt;li&gt;選擇你要拿來存放版本控管的內容的目錄(最好是空的)，&lt;br /&gt;檔案管理員右鍵-&gt;TortoiseSVN-&gt;Create Repository here...&lt;/li&gt;&lt;li&gt;接下來就可以使用Repository Browser連到該目錄了，&lt;br /&gt;位址類似這樣：file:///Q:/THBRsvntest&lt;/li&gt;&lt;li&gt;在把該目錄作最初的整理後（比如trunk/branches/tags三分法），將初始的程式檔案import進來。&lt;br /&gt;在你要載入的資料夾上，檔案管理員右鍵-&gt;TortoiseSVN-&gt;Import...。&lt;br /&gt;注意&lt;span style="font-weight: bold;"&gt;該資料夾不會一併import&lt;/span&gt;，只有資料夾的內容會。&lt;br /&gt;還有，被你指定import的資料夾並&lt;span style="font-weight: bold;"&gt;不會&lt;/span&gt;因此就有版本控管。要再進行checkout才行&lt;/li&gt;&lt;li&gt;進入Repository Browser，對你要checkout的資料夾右鍵-&gt;Checkout...。&lt;br /&gt;注意一樣，只有資料夾內的內容會被checkout。&lt;/li&gt;&lt;li&gt;checkout出來的資料已經有了版本控管了。剩下的跟一般TortoiseSVN用法相同。&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;以隨身碟做為存放Repository的裝置&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;上述作法我遇到的主要問題之一是，如果你在兩個以上的地方都有電腦而且都會寫程式，使用頻率還差不多怎麼辦？分別建立單機SVN是個辦法，但是版本控管不能統一。&lt;br /&gt;&lt;br /&gt;另一種作法是，同樣分別建立單機SVN，但是建立在同一個隨身碟上。兩台(或以上)的電腦對同一個隨身碟做checkout跟commit，所以版本控管的來源只有一個。比較有問題的是隨身碟的代號可能每次放入時不一樣（已經插了其他裝置導致代號改變...之類的），每次都來一次Relocate又太麻煩了。我的作法是將隨身碟的代號改為一個較少用的代號，這樣就比較不容易被其他會插拔的裝置影響到。（更改代號可以從我的電腦-&gt;管理-&gt;磁碟管理裡面著手）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-4604894334915318327?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/4604894334915318327/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=4604894334915318327' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4604894334915318327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4604894334915318327'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/05/svn.html' title='如何建立單機性質的SVN版本控管'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-7356867046404865394</id><published>2009-04-24T17:12:00.003+08:00</published><updated>2009-05-21T09:54:57.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><title type='text'>(要錢的)軟體開發工具小調查</title><content type='html'>&lt;span style="font-weight: bold;"&gt;UltraEdit&lt;/span&gt;:&lt;br /&gt;49.95美金。目前v.15版。還沒仔細試過與129.95美金的UEStudio的差異....&lt;br /&gt;在&lt;a href="http://store.pchome.com.tw/pcsoft/M02979659.htm"&gt;PChome商店街&lt;/a&gt;跟&lt;a href="http://buy.yahoo.com.tw/gdsale/gdsale.asp?gdid=1206634&amp;amp;act=gdsearch"&gt;Yahoo奇摩購物中心&lt;/a&gt;有代理版。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Visual Studio&lt;/span&gt;系列：&lt;br /&gt;目前2008。最便宜的Standard版本&lt;a href="http://www.microsoft.com/Taiwan/shop/product/Standard/Studio.htm"&gt;似乎是10590台幣&lt;/a&gt;。（原價記得是300美金）&lt;br /&gt;&lt;a href="http://www.microsoft.com/express/download/"&gt;有免費的Express版&lt;/a&gt;，但不支援ATL跟MFC。想用到這些東西的話請買Standard版本。&lt;br /&gt;不知道該說他黑心還是慷慨。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Visual Assist&lt;/span&gt;系列：&lt;br /&gt;Whole Tomato Software出的，跟Visual Studio搭配提昇功能用的輔助套件。&lt;br /&gt;&lt;a href="http://www.wholetomato.com/purchase/default.asp"&gt;正常可大量授權可續約的版本一套249美金，個人版本則是99美金。&lt;/a&gt;&lt;br /&gt;在價格不怎麼便宜外，這套軟體不支援Express版。&lt;br /&gt;（不過用習慣了就會覺得想要繼續使用...）&lt;br /&gt;&lt;br /&gt;主要的功能....&lt;br /&gt;&lt;ul&gt;&lt;li&gt;提示功能的加強。Visual Studio原本只會對class的method跟variable名作提示而已，裝了Visual Assist後打任何關鍵字都會自動提示。&lt;/li&gt;&lt;li&gt;Refatoring。諸如一次大量改名之類的....&lt;/li&gt;&lt;li&gt;上色。把巨集／變數／常數等加以不同的上色。&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-7356867046404865394?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/7356867046404865394/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=7356867046404865394' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/7356867046404865394'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/7356867046404865394'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/04/blog-post.html' title='(要錢的)軟體開發工具小調查'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-8304160903378335728</id><published>2009-04-23T16:02:00.000+08:00</published><updated>2009-05-21T09:54:57.127+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><title type='text'>Doxygen補充</title><content type='html'>原本主要是看&lt;a href="http://www.stack.nl/%7Edimitri/doxygen/docblocks.html"&gt;Documenting the code&lt;/a&gt;頁面來寫相關註解，&lt;br /&gt;不過發現有一些指令他沒有詳加解釋...就去找了&lt;a href="http://www.stack.nl/%7Edimitri/doxygen/commands.html"&gt;command的完整頁面&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;個人來說比較有用的是下面的&lt;a href="http://www.stack.nl/%7Edimitri/doxygen/commands.html#cmdattention"&gt;Section indicators&lt;/a&gt;的部份就是了...&lt;br /&gt;諸如\param, \sa, \return, \retval之類的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-8304160903378335728?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/8304160903378335728/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=8304160903378335728' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/8304160903378335728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/8304160903378335728'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/04/doxygen.html' title='Doxygen補充'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-2200002360644616831</id><published>2009-04-01T11:09:00.007+08:00</published><updated>2009-05-21T09:54:57.128+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><title type='text'>Doxygen 細項設定memo</title><content type='html'>把幾個重要的細項列出來....&lt;br /&gt;這邊指的是Windows版的GUI的Wizard／Expert tab下面的項目。&lt;br /&gt;不過其他版本應該很容易依樣畫葫蘆。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wizard&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Scan recursively：讓他搜尋到子目錄&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mode&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"Select the desired extraction mode:"：除非已經做了完整的註解，否則All Entities才能列出足夠的資料&lt;/li&gt;&lt;li&gt;"Include cross-referenced source code in the output"：勾起來則會把原始碼一起文件化並加上link。建議勾選&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Output&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HTML→"with frames and a navigation tree"：會在左邊以frame建立索引連結&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;##ReadMore##&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expert&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Project&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CREATE_SUBDIRS：建立複數個目錄。怕同一目錄裡檔案太多的選項&lt;/li&gt;&lt;li&gt;INLINE_INHERITED_MEMB：將子類別從父類別那邊繼承來的method也列出。不包括constructor、destrcutor跟assignment operators&lt;/li&gt;&lt;li&gt;STRIP_FROM_PATH：將原本完整列出的檔案位置消去指定的path&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Build&lt;br /&gt;&lt;ul&gt;&lt;li&gt;EXTRACT_PRIVATE：列出private成員&lt;/li&gt;&lt;li&gt;EXTRACT_STATIC：列出（C/C++）檔案的static內容&lt;/li&gt;&lt;li&gt;SHOW_DIRECTORIES：列出目錄結構。適合依照目錄分層的project&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Source Browser&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SOURCE_BROWSER：產生頁面詳列Source code。強烈建議。&lt;/li&gt;&lt;li&gt;INLINE_SOURCES：是否將原本只包含declaration的文件改成顯示完整的definition。注意資料太多反而會模糊焦點。建議不要。&lt;/li&gt;&lt;li&gt;REFERENCED_BY_RELATION：將用到此成員的method等列出。強烈建議&lt;/li&gt;&lt;li&gt;REFERENCES_RELATION：將此成員用到的method／variables等列出。強烈建議。&lt;/li&gt;&lt;li&gt;REFERENCES_LINK_SOURCE：若勾選，則上述兩個項目列出的連結連往Source code頁面，否則連往文件。看個人需求。&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;HTML&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GENERATE_TREEVIEW：跟Wizard的"with frames and a navigation tree"同作用&lt;/li&gt;&lt;li&gt;TREEVIEW_WIDTH：上述TreeView的寬度&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-2200002360644616831?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/2200002360644616831/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=2200002360644616831' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/2200002360644616831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/2200002360644616831'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/04/doxygen-memo.html' title='Doxygen 細項設定memo'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-6791753991155494553</id><published>2009-03-26T16:49:00.002+08:00</published><updated>2009-05-21T09:54:57.128+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coding'/><title type='text'>從程式碼自動生成說明文件 - Doxygen</title><content type='html'>官方網站：&lt;a href="http://www.stack.nl/%7Edimitri/doxygen/index.html"&gt;Doxygen&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;可以生成HTML、LaTeX、Man Pages、RTF跟XML，不過我只有用HTML。&lt;br /&gt;支援C/C++/Java/C#/PHP/Fortran/VHDL，&lt;br /&gt;會將你的程式碼讀入，生成簡明易懂的說明文件，&lt;br /&gt;並將交互參照的部份自動建立連結。&lt;br /&gt;當然，沒有註解的話它並不會自己幫你生成註解，註解還是得你自己寫 XD&lt;br /&gt;註解該怎麼寫才會被讀到，請參考官網文件&lt;br /&gt;&lt;br /&gt;不確定其他版本狀況，不過Windows版有一個有GUI的Wizard，&lt;br /&gt;可以經過簡單的設定之後就生成文件出來。&lt;br /&gt;如果想要自己詳細設定的話，Expert Tab裡也可以調。&lt;br /&gt;&lt;br /&gt;以下註記一些比較需要注意或是容易忘記的memo...&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Source code directory可以有複數個。要在Expert→Input→INPUT調。&lt;/li&gt;&lt;li&gt;對於某些source code不能寫成UTF-8的project，可以用它的轉碼功能。&lt;/li&gt;&lt;ul&gt;&lt;li&gt;像部分C/C++ compiler不吃UTF-8原始檔，要轉碼成UTF-8再生成文件又大費周章&lt;/li&gt;&lt;li&gt;但要注意有些狀況轉碼會失敗....比如說，我從big5轉UTF-8，內含「／」好像就會失敗。不確定為什麼。&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;如果要顯示Static function或private method/member，要到Expert → Build → EXTRACT_PRIVATE ／ EXTRACT_STATIC調。&lt;/li&gt;&lt;li&gt;要顯示目錄（比如說，如果文件包括好幾個小project，彼此是用目錄來區分的），要到Expert → Build → EXTRACT_PRIVATE／SHOW_DIRECTORIES調。&lt;/li&gt;&lt;li&gt;原本是設計給英文語系用的，所以一部份地方要注意一下。比如說，他會自動將class name/file name等辨識並加連結，但是如果這些跟中文連在一起的話就不會識別出來（英文的字是以空格分開的嘛），所以最好這類名稱前後都各加空格格開。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-6791753991155494553?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/6791753991155494553/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=6791753991155494553' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/6791753991155494553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/6791753991155494553'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/doxygen.html' title='從程式碼自動生成說明文件 - Doxygen'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-3849669135604149667</id><published>2009-03-22T22:20:00.000+08:00</published><updated>2009-03-22T22:21:55.862+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><title type='text'>協助HTML／JavaScript／CSS開發的Firefox擴充套件</title><content type='html'>之前搞Firefox擴充套件開發的survey時找到幾個不錯的，&lt;br /&gt;連同之前在用的一併列出。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DOM Inspector&lt;/span&gt;&lt;br /&gt;觀察DOM tree用的套件。原本是Fx內建，Firefox 3還哪時候開始變成額外擴充。&lt;br /&gt;（變額外擴充也好，因為原本內建但是要在安裝時特地選起來，很容易漏過）&lt;br /&gt;雖然說底下要介紹的Firebug比他強大些....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Firebug&lt;/span&gt;&lt;br /&gt;同樣是觀察DOM tree用的，不同的是它有簡單明顯的UI，&lt;br /&gt;當游標移到tree的某條敘述上，對應的顯示的部份會以遮罩突顯出來，&lt;br /&gt;所以能很快的找到自己要的部份的code的位置。&lt;br /&gt;必備套件。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JavaScript Debugger&lt;/span&gt;&lt;br /&gt;這套強大的地方在於，他是個可以逐步執行並下中斷點的JavaScript Debugger。&lt;br /&gt;就這樣，不過也夠強悍了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web Developer&lt;/span&gt;&lt;br /&gt;可以進行很多網頁細部設定。比如說關掉Javascript、對Cookie的操縱、取得JavaScript內容等等。&lt;br /&gt;很多項目不會很常用，不過需要時就會覺得蠻好用的。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Console²&lt;/span&gt;&lt;br /&gt;將錯誤主控台的UI稍稍改裝。&lt;br /&gt;老實講改的不多（而且稍微有點醜....），不過有比沒有好。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Extension Developer&lt;/span&gt;&lt;br /&gt;很多輔助Extension開發用的功能，不過也有助於網頁開發。&lt;br /&gt;比如說Extension的包裝、即時的Javascript command line、&lt;br /&gt;即時的HTML Editor和Regular Expression Evaluator。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-3849669135604149667?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/3849669135604149667/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=3849669135604149667' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3849669135604149667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3849669135604149667'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/htmljavascriptcssfirefox.html' title='協助HTML／JavaScript／CSS開發的Firefox擴充套件'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-1332637010919456107</id><published>2009-03-19T15:31:00.002+08:00</published><updated>2009-03-19T16:04:06.701+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>Firefox Add-on撰寫memo (2)</title><content type='html'>&lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;逐步建立Extension的教學&lt;/a&gt;&lt;br /&gt;很好用所以重貼一遍。注意裡面只有講到XUL。整合JavaScript和CSS的部份請自己另外找。&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/En/Firefox_addons_developer_guide"&gt;另一個教學&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/XUL"&gt;XUL&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/XUL_Explorer"&gt;XUL Explorer&lt;/a&gt;&lt;br /&gt;輔助開發XUL的工具&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/XUL_Overlays"&gt;XUL Overlays&lt;/a&gt;&lt;br /&gt;講解XUL Overlays（整理大大小小XUL整合成UI的概念）&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/DOM/window.dump"&gt;JavaScript的window.dump&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Code_snippets"&gt;Extension常用的程式碼片段&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/XPCOM"&gt;XPCOM&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Plugins"&gt;Plugins&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-1332637010919456107?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/1332637010919456107/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=1332637010919456107' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1332637010919456107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1332637010919456107'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/firefox-add-onmemo-2.html' title='Firefox Add-on撰寫memo (2)'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-4105848397663090685</id><published>2009-03-17T17:26:00.001+08:00</published><updated>2009-03-17T17:26:59.747+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>Firefox Add-on撰寫memo (1)</title><content type='html'>因為工作有點相關所以順便survey。&lt;br /&gt;東西太多了，不記點memo再看頭會痛....&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Extensions"&gt;官方相關主頁面&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Building_an_Extension"&gt;逐步建立Extension的教學&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Setting_up_extension_development_environment"&gt;建立一個適合撰寫Extension的環境&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/Install.rdf"&gt;Install.rdf的細節&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://developer.mozilla.org/en/XUL_Tutorial"&gt;XUL教學&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-4105848397663090685?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/4105848397663090685/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=4105848397663090685' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4105848397663090685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4105848397663090685'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/firefox-add-onmemo-1.html' title='Firefox Add-on撰寫memo (1)'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-1496117732886756291</id><published>2009-03-17T14:11:00.001+08:00</published><updated>2009-03-17T17:26:02.912+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>iGoogle與Gadget (3)</title><content type='html'>因為工作關係大致試寫了一兩個純測試用的Gadget。&lt;br /&gt;測試出來的重點大致如下：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google提供給Gadget的API多半是介面相關的，也就是說如何控制Gadget呈現給使用者的樣貌。&lt;/li&gt;&lt;li&gt;Remote取得資訊的方式基本上是HTTP中的GET。POST跟https基本上不行（也許有辦法技術性躲開）。不可能另開socket。&lt;/li&gt;&lt;li&gt;顯示「需要登入」的資訊會有問題。比如說，我想要用Gadget顯示pixiv的內容，所以事先在pixiv登入，然後把pixiv內嵌到Gadget中希望能看到我的pixiv頁面，但是失敗。失敗的原因其實也很簡單：因為不能跨domain存取cookie。這會造成安全性問題。&lt;br /&gt;&lt;br /&gt;目前想到的解法都不怎麼有效，因為使用者得讓Gadget「轉交」帳號密碼，會引發盜帳號的疑慮....。這應該是Web widget共通的限制了。無解。&lt;br /&gt;&lt;br /&gt;唯一能避開這個問題的只有平台提供者本身的widget，因為沒有domain問題－在iGoogle平台上就是Google自己。所以Google Reader跟GMail的內嵌能運作正常。&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-1496117732886756291?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/1496117732886756291/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=1496117732886756291' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1496117732886756291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1496117732886756291'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/igooglegadget-3.html' title='iGoogle與Gadget (3)'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-758803967886842370</id><published>2009-03-10T16:28:00.003+08:00</published><updated>2009-03-17T17:26:02.912+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>iGoogle與Gadget (2)</title><content type='html'>因為這樣跟那樣所以又研究了一下。算是暫時memo。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/ig/submit"&gt;提交Google Gadget&lt;/a&gt;&lt;br /&gt;提交gadget的網頁，有提醒最好有哪些東西，還有相關條款。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.google.com/webmasters/gadgets/"&gt;將 Google 小工具新增到您的網頁上&lt;/a&gt;&lt;br /&gt;用JavaScript將gadget內嵌到網頁上。&lt;br /&gt;可以在網頁上使用原本放在iGoogle的gadget。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/intl/zh-TW/apis/gadgets/docs/legacy/reference.html"&gt;Gadgets API Reference&lt;/a&gt;&lt;br /&gt;往下拉是Google提供的JavaScript API&lt;br /&gt;&lt;br /&gt;##ReadMore##&lt;br /&gt;&lt;br /&gt;Google Gadget的相關條款：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://code.google.com/intl/zh-TW/apis/gadgets/docs/terms.html"&gt;Google Gadgets and Themes API Terms of Service&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/webmasters/gadgets/terms.html"&gt;Google Gadget內嵌到網頁上時的服務條款&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/webmasters/gadgets/usage.html"&gt;Google官方Gadget內嵌到網頁上時的使用限制&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;第二點的重點歸結（個人memo用，要正式使用請去上述網址自己確認）：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gadget可商業使用，但需符合Gadget設計者的使用條款以及法律限制（Google官方寫的Gadget的使用條款即上面的第三點）&lt;/li&gt;&lt;li&gt;不可移除「gadgets powered by Google」字樣以及「+Google」按鈕。如果你條列出眾多Gadget你必須註明來源。Google有權將「+Google」按鈕置換成廣告或其他東西。&lt;/li&gt;&lt;li&gt;Google不為Gadget做背書。製作Gadget的第三方有權隨時停止Gadget&lt;/li&gt;&lt;li&gt;如果該小工具違反著作權法或其他法律，你同意將它移除。不管是你自己發現或Google如此告知你。&lt;/li&gt;&lt;li&gt;Google可隨時修改此條款。Google有權因為你違反使用條款或Google自行做的判斷來隨時停止此服務。&lt;/li&gt;&lt;/ul&gt;第三點的重點歸結：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Google News, Google Video跟Youtube的官方Gadget不得使用在商業網站&lt;/li&gt;&lt;li&gt;Google Maps的官方Gadget不能使用在需要付費才能閱讀網站內容的網站&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-758803967886842370?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/758803967886842370/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=758803967886842370' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/758803967886842370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/758803967886842370'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/igooglegadget-2.html' title='iGoogle與Gadget (2)'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-624523319933216788</id><published>2009-03-04T16:34:00.002+08:00</published><updated>2009-03-04T16:39:45.883+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>PHP的小小抽象滲漏 2</title><content type='html'>最近有點累所以之前想寫的東西一直沒上來。先來寫個小的。&lt;br /&gt;&lt;br /&gt;延續上次的抽象滲漏。一樣是在__get跟__set上的問題。&lt;br /&gt;通常來說，你可以透過傳參考來讓function回傳內容，&lt;br /&gt;比如說，function a(&amp;amp;$b, &amp;amp;$c)。&lt;br /&gt;在a裡面把$b跟$c賦值，值就會存到外面(傳入)的變數裡面。&lt;br /&gt;&lt;br /&gt;不過問題來了。使用__set跟__get「造」出來的member這樣做會有問題。&lt;br /&gt;而且有些時候連警告訊息都不會出現。&lt;br /&gt;&lt;br /&gt;聽起來很理所當然嗎？知道原理的話當然是啊。&lt;br /&gt;不過光看表面的code有時不易分辨耶。&lt;br /&gt;&lt;br /&gt;只是小小紀錄。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-624523319933216788?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/624523319933216788/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=624523319933216788' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/624523319933216788'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/624523319933216788'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/03/php-2.html' title='PHP的小小抽象滲漏 2'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-5829362195244775840</id><published>2009-02-23T14:51:00.002+08:00</published><updated>2009-02-23T14:57:42.851+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>用C/C++加入/退出Multicast Group的方法</title><content type='html'>在VLC裡面找這部份，看了wikipedia就往IGMP的方向找，結果證實是浪費時間... orz&lt;br /&gt;&lt;br /&gt;總而言之，&lt;a href="http://www.cs.unc.edu/%7Ejeffay/dirt/FAQ/comp249-001-F99/mcast-socket.html"&gt;參考這裡&lt;/a&gt;。簡單的講，加入Multicast Group是用setsockopt()搭配&lt;span style="font-weight: bold;"&gt;IP_ADD_MEMBERSHIP&lt;/span&gt;這個參數。範例請參考上述網頁。離開則是&lt;span style="font-weight: bold;"&gt;IP_DROP_MEMBERSHIP&lt;/span&gt;。&lt;br /&gt;&lt;br /&gt;其他還有IP_MULTICAST_IF, IP_MULTICAST_TTL, IP_MULTICAST_LOOP等。不過因為我只是要找出VLC哪部份在弄Multicast，所以就沒去詳細嘗試這些的功用是什麼了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-5829362195244775840?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/5829362195244775840/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=5829362195244775840' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5829362195244775840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5829362195244775840'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/ccmulticast-group.html' title='用C/C++加入/退出Multicast Group的方法'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-3424343372757080453</id><published>2009-02-23T12:14:00.002+08:00</published><updated>2009-02-23T12:19:04.312+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blog'/><title type='text'>Blog顯示程式碼</title><content type='html'>貼了程式碼才發現上次改網誌主題，所以之前編的CSS跑掉了....&lt;br /&gt;用"blog 程式碼"之類的關鍵字去找結果找到一堆沒處理好縮排的，&lt;br /&gt;千辛萬苦才找回以前參考用的&lt;a href="http://formatmysourcecode.blogspot.com/"&gt;這個&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;現在的做法是，在CSS裡面加下面這段：&lt;br /&gt;&lt;pre class="code"&gt;&lt;code&gt;pre.code  {&lt;br /&gt;  display: block;&lt;br /&gt;  font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace;&lt;br /&gt;  color: #000000;&lt;br /&gt;  background-color: #eee;&lt;br /&gt;  font-size: 12px;&lt;br /&gt;  border: 1px dashed #999999;&lt;br /&gt;  line-height: 14px;&lt;br /&gt;  padding: 5px;&lt;br /&gt;  overflow: auto;&lt;br /&gt;  width: 100%&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;然後程式碼就前面加上&lt;span class="simpara"&gt;&amp;lt;pre class=code&lt;/span&gt;&lt;span class="simpara"&gt;&amp;gt;&lt;/span&gt;&lt;span class="simpara"&gt;&amp;lt;code&lt;/span&gt;&lt;span class="simpara"&gt;&amp;gt;&lt;/span&gt;&lt;span class="simpara"&gt;，&lt;br /&gt;後面加上&lt;/span&gt;&lt;span class="simpara"&gt;&amp;lt;/pre&lt;/span&gt;&lt;span class="simpara"&gt;&amp;gt;&lt;/span&gt;&lt;span class="simpara"&gt;&amp;lt;/code&lt;/span&gt;&lt;span class="simpara"&gt;&amp;gt;這樣。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-3424343372757080453?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/3424343372757080453/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=3424343372757080453' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3424343372757080453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/3424343372757080453'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/blog.html' title='Blog顯示程式碼'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-5817148047334298457</id><published>2009-02-23T11:03:00.006+08:00</published><updated>2009-02-23T11:29:31.180+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C/C++'/><title type='text'>C語言: 讀出";"結尾的字串</title><content type='html'>&lt;pre class=code&gt;&lt;code&gt;while( sscanf(pStr, &amp;quot;%[^;]&amp;quot;, scan)==1 )&lt;br /&gt;{&lt;br /&gt;    pStr += strlen(scan);&lt;br /&gt;    while(*pStr == ';')&lt;br /&gt;        pStr++;&lt;br /&gt;    printf(&amp;quot;%s\n&amp;quot;, scan);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;sscanf(..., "%[^;]", ....)這個用法其實很多地方有寫是有寫，&lt;br /&gt;可是寫的很隱密....。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-5817148047334298457?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/5817148047334298457/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=5817148047334298457' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5817148047334298457'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/5817148047334298457'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/c.html' title='C語言: 讀出&quot;;&quot;結尾的字串'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-6575384527613186537</id><published>2009-02-23T08:41:00.003+08:00</published><updated>2009-02-23T08:55:16.508+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Others'/><title type='text'>從一件小事看iPod nano的歌曲星等實作機制</title><content type='html'>我平常在外聽音樂用的是iPod nano。用了四年以上的古董了。&lt;br /&gt;（不過小小一台很方便，雖然偶爾有點秀抖，電池也開始衰退了）&lt;br /&gt;&lt;br /&gt;平常聽歌都是編輯一個「某某歌手多少星等以上」的Smart playlist，&lt;br /&gt;不過這樣就得歌曲要給星等。最近新增還沒給星等的歌曲又有點多，&lt;br /&gt;就想說先來排序(用自己寫的簡單javascript)，然後看哪個區間要給星等。&lt;br /&gt;&lt;br /&gt;所以排序完。把原本有給星等的歌通通取消星等。&lt;br /&gt;依照排序的結果一個一個給分。嗯，這邊五分....這裡開始四分....以下略。&lt;br /&gt;&lt;br /&gt;今天早上要聽歌的時候打開同樣的Smart playlist發現，&lt;br /&gt;咦，歌曲的列表怎麼是照我給分的順序？&lt;br /&gt;##ReadMore##&lt;br /&gt;&lt;br /&gt;理論上如果歌曲是以資料庫的方式，每首歌給一個row來存的話是不太可能會這樣的。&lt;br /&gt;給五星就是五星，五星的歌曲間不會有任何區分，先給後給都一樣。&lt;br /&gt;資料庫本身不會記憶被給星等的時間。&lt;br /&gt;&lt;br /&gt;我最後的結論是，他們星等是另外維持一個列表，&lt;br /&gt;表上列出哪些歌是五星，哪些歌是四星，依此類推。&lt;br /&gt;由於這樣你把歌曲給星等時，不是像資料庫一樣分數被「改」動而是被「加」上去的，&lt;br /&gt;所以會有加上去的先後順序。會依照加上去的順序列出歌曲。&lt;br /&gt;&lt;br /&gt;至於為什麼會這樣我就不知道了。&lt;br /&gt;也許因為給星等的歌通常不多，避免佔據空間？（可是一首挺多1Byte耶）&lt;br /&gt;也許這樣比較快？或者只是因為這是四年多前的iPod了，現在已經改掉了。&lt;br /&gt;&lt;br /&gt;不過這樣的排序方式對我來說也方便就是了 :p&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-6575384527613186537?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/6575384527613186537/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=6575384527613186537' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/6575384527613186537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/6575384527613186537'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/ipod-nano.html' title='從一件小事看iPod nano的歌曲星等實作機制'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-1696644673306990530</id><published>2009-02-22T22:38:00.002+08:00</published><updated>2009-02-23T10:11:03.174+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>Mysql的Truncate與Lock</title><content type='html'>只是小小附註。lock tables跟truncate table不能一起用...。&lt;br /&gt;當你lock某個table，你就不能truncate他。&lt;br /&gt;&lt;br /&gt;某些狀況下這有點麻煩....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-1696644673306990530?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/1696644673306990530/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=1696644673306990530' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1696644673306990530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/1696644673306990530'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/mysqltruncatelock.html' title='Mysql的Truncate與Lock'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-26125863643652007</id><published>2009-02-19T17:53:00.003+08:00</published><updated>2009-02-23T10:11:03.174+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>PHP的小小抽象滲漏</title><content type='html'>關於什麼是抽象滲漏請看&lt;a href="http://local.joelonsoftware.com/wiki/The_Joel_on_Software_Translation_Project:%E6%8A%BD%E8%B1%A1%E6%BB%B2%E6%BC%8F%E6%B3%95%E5%89%87"&gt;這裡&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1.Firefox的自動reload&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;在未指定字碼而且實際字碼與Firefox的預設不同時，&lt;br /&gt;Firefox會先讀入一次，判斷目前所使用的字碼不對，&lt;br /&gt;然後&lt;span style="font-weight: bold;"&gt;再跟Server要一次資料&lt;/span&gt;。所以PHP之類的CGI會被執行兩次。&lt;br /&gt;所以，網頁請寫好Content-Type的header。&lt;br /&gt;（什麼，你說這不是理所當然的嗎？&lt;br /&gt;嗯，的確是，不過我現在程式還在寫內部部分還沒要處理UI，&lt;br /&gt;這部份隨便寫寫結果就中招了。）&lt;br /&gt;&lt;br /&gt;順帶一提IE不會這樣。他會直接用亂碼印出來。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2.empty的抽象滲漏&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;##ReadMore##&lt;br /&gt;PHP的empty()只能拿來判斷變數。&lt;br /&gt;如果你拿它來判斷函數回傳，他會給你一個錯誤訊息。&lt;br /&gt;到這邊都很正常。&lt;br /&gt;&lt;br /&gt;不過PHP 5.x開始多了個類別的method，叫__set跟__get。&lt;br /&gt;__get的功用是他會在找不到member時以這個method去找資料。&lt;br /&gt;比如說如果變數實際上沒有$t-&gt;num，他就會去呼叫$t-&gt;__get('num')。&lt;br /&gt;&lt;br /&gt;實際上來說，這兩個就只是語法上的甜頭就是了，&lt;br /&gt;因為一般使用上可以自己寫兩個函式，比如說Set()跟Get()來做同樣事，效果一樣。&lt;br /&gt;好處只是，你可以寫$t-&gt;num++而不是$t-&gt;Set('num', $t-&gt;Get('num')+1)。&lt;br /&gt;&lt;br /&gt;問題出在於，當你empty($t-&gt;num)時。&lt;br /&gt;假設$t-&gt;str會回傳字串，而你想要判斷這是不是個空字串，&lt;br /&gt;他不會照你預期的回傳，也不會有錯誤訊息。&lt;br /&gt;就算字串有東西，他會照樣回傳true。&lt;br /&gt;而你就字面上看，empty($t-&gt;str)怎麼看都沒有問題。&lt;br /&gt;&lt;br /&gt;順帶一提strcmp($t-&gt;str, "")===0也一樣會出錯。&lt;br /&gt;我最後成功時是使用strlen($t-&gt;str)===0。&lt;br /&gt;&lt;br /&gt;供參考。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-26125863643652007?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/26125863643652007/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=26125863643652007' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/26125863643652007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/26125863643652007'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/php_19.html' title='PHP的小小抽象滲漏'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-7519685552370472365</id><published>2009-02-17T15:02:00.002+08:00</published><updated>2009-03-17T17:26:02.913+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Widget'/><title type='text'>iGoogle與Gadget</title><content type='html'>又是一個暫時不會用到的東西....&lt;br /&gt;&lt;br /&gt;總而言之研究了一下Gadget。就iGoogle上那堆小工具。&lt;br /&gt;大致上的結論是：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;是XML、HTML跟JavaScript混成。另外有gadget特有的API。&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/igoogle/docs/igoogledevguide.html#ops"&gt;起頭教學&lt;/a&gt;&lt;/li&gt;&lt;li&gt;原始檔要自己找Server存。沒有的話，上面頁面提供的Google Gadgets Editor可以讓你存在Google的空間。&lt;/li&gt;&lt;li&gt;可以加點&lt;a href="http://tinyurl.com/5vwwaz"&gt;developer tool&lt;/a&gt;來協助開發。雖然實際上裡面有用的只有一個，可以拿來看別人的Gadget的程式碼&lt;/li&gt;&lt;li&gt;完整API列表在&lt;a href="http://code.google.com/apis/gadgets/docs/dev_guide.html"&gt;這&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;看起來這現在跟OpenSocial API整合了...。暫時不關我事就是了。&lt;br /&gt;（除非哪天mixi、plurk或pixiv提供足夠的支援）&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-7519685552370472365?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/7519685552370472365/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=7519685552370472365' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/7519685552370472365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/7519685552370472365'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/igooglegadget.html' title='iGoogle與Gadget'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-675874651942018133</id><published>2009-02-17T12:02:00.002+08:00</published><updated>2009-02-23T10:11:03.174+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>網頁的檔案上傳(以及php的處理與驗證)</title><content type='html'>因為這樣跟那樣所以去查了。暫時用不著，先記起來。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tw2.php.net/manual/en/features.file-upload.post-method.php"&gt;這裡&lt;/a&gt;的範例一有HTML的示範，範例二則是PHP的部份。&lt;br /&gt;檢查$_FILES['userfile']['type']可以確認副檔名，&lt;br /&gt;不過僅只是副檔名，沒有分析檔案內容，所以參考就好。&lt;br /&gt;順帶一提，照範例程式的話，重複上傳同名檔案後面會蓋到前面的。&lt;br /&gt;&lt;br /&gt;分析檔案內容的話，好像有個&lt;a href="http://tw2.php.net/manual/en/function.mime-content-type.php"&gt;mime_content_type&lt;/a&gt;，&lt;br /&gt;不過官網不建議。建議使用的&lt;a href="http://tw2.php.net/manual/en/ref.fileinfo.php"&gt;Fileinfo&lt;/a&gt;則是要PHP5.3.0版。&lt;br /&gt;在更早的版本是算PECL的一部分的樣子。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-675874651942018133?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/675874651942018133/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=675874651942018133' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/675874651942018133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/675874651942018133'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/php.html' title='網頁的檔案上傳(以及php的處理與驗證)'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6168713791789324667.post-4332881836847561866</id><published>2009-02-16T20:59:00.004+08:00</published><updated>2009-02-23T10:11:03.174+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Game Experiences'/><title type='text'>Web Game: 該lock全部或是部份的table</title><content type='html'>＊以下是個人寫Web Game中途產生的心得。&lt;br /&gt;很有可能不適用於其他類型的應用程式，請注意。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;話說從頭&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;包括Web Game在內的多人網路遊戲都需要對資料庫或檔案進行鎖定(lock)。&lt;br /&gt;鎖定的目的我原本寫了個範例出來，不過這樣這篇文章會太長所以算了吧。&lt;br /&gt;抽象一點的舉例，就像是在白板上留言，要一個人寫完才能輪別人，否則留言就會看不懂。&lt;br /&gt;多人遊戲時大家也得排隊輪著讀寫資料庫（雖然這動作時間很短所以看起來像大家同時）。&lt;br /&gt;&lt;br /&gt;今天要講的是，一次該鎖定多少？&lt;br /&gt;&lt;br /&gt;##ReadMore##&lt;br /&gt;&lt;br /&gt;資料庫通常會起碼提供你一次最低可鎖定到一個table。&lt;br /&gt;假設現在有三個table分別代表角色(char)，地區(area)跟組隊(team)。&lt;br /&gt;你可以鎖定它們其中之一，其中兩個或全部。&lt;br /&gt;&lt;br /&gt;直覺的想法是，需要幾個就鎖定幾個。&lt;br /&gt;如果自己暫時不會用到，就給別人用啊。&lt;br /&gt;假設A鎖定了char跟area，B鎖定了team。&lt;br /&gt;A跟B就可以同時動作而不會互斥。&lt;br /&gt;效率比雙方都一次全部鎖定，B要等A做完要來的好。&lt;br /&gt;&lt;br /&gt;理論上如此，而且其他應用程式很可能是對的，但遊戲不是。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;因為沒有漸進式鎖定&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;首先原因是，我不確定其他資料庫，不過Mysql的lock是一次性的。&lt;br /&gt;你不能先lock char，然後跟資料庫講我要多lock area。&lt;br /&gt;這樣做會把char解鎖才去鎖定area，而不是你所想的鎖定了兩個table。&lt;br /&gt;&lt;br /&gt;事實上這是很合理的，想一想下面這個情況：&lt;br /&gt;A鎖定了char跟area而B鎖定了team。&lt;br /&gt;A想要多鎖定team，B想要多鎖定char。&lt;br /&gt;要不就雙方都拿不到（因為在對方那邊，而且對方不會放手），&lt;br /&gt;要不就資料庫提供更複雜的機制解決這問題。&lt;br /&gt;&lt;br /&gt;所以你不能漸進式鎖定。你在發出lock指令時就得指定好所有的table。&lt;br /&gt;&lt;br /&gt;可是寫遊戲，通常資料庫存取動作並沒有那麼單純。&lt;br /&gt;要在開頭就完全確定這裡只會用到某些table是很困難的。&lt;br /&gt;有可能今天你要加某個功能，所以這個角色動作就得多使用到一個table。&lt;br /&gt;&lt;br /&gt;更糟一點的狀況是，那個功能隱藏在好幾層函式呼叫的下面。&lt;br /&gt;你得一層一層爬上去，找到到底誰呼叫了那個函式。&lt;br /&gt;如果你每次做這個動作就得往上爬個四層尋找會呼叫它的&lt;span style="font-style: italic;"&gt;一百個&lt;/span&gt;地方，&lt;br /&gt;改個幾次你大概就投降了。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;效率問題？&lt;/span&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;更重要的一點是，全部一次鎖定其實也沒什麼效率問題。&lt;br /&gt;&lt;br /&gt;這邊的重點是，這是遊戲，而且還是Web Game。&lt;br /&gt;遊戲的重點是玩家的角色。Web Game的動作則都是由玩家觸發的。&lt;br /&gt;也就是說，&lt;span style="font-weight: bold;"&gt;90%以上的鎖定都一定會包括角色(char)的table&lt;/span&gt;。&lt;br /&gt;既然大家都要用到同一個table，那部份鎖定跟全部鎖定是一樣的&lt;br /&gt;－不管怎樣都要排隊。&lt;br /&gt;&lt;br /&gt;而且一次全部鎖定，也可以讓你不用去思索什麼時候該開始鎖定－&lt;br /&gt;每個指令執行期間全部鎖起來就對了。&lt;br /&gt;不用去看哪些動作有用到資料庫哪些沒有，省掉coding時考慮這些的麻煩，&lt;br /&gt;可以更直接而輕鬆的使用資料庫。&lt;br /&gt;&lt;br /&gt;所以我的建議是，如果你是要寫遊戲的話，就全部鎖定吧。&lt;br /&gt;coding會方便很多，又不會真的犧牲多少效率。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6168713791789324667-4332881836847561866?l=ulyness-ps.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ulyness-ps.blogspot.com/feeds/4332881836847561866/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6168713791789324667&amp;postID=4332881836847561866' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4332881836847561866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6168713791789324667/posts/default/4332881836847561866'/><link rel='alternate' type='text/html' href='http://ulyness-ps.blogspot.com/2009/02/web-game-locktable.html' title='Web Game: 該lock全部或是部份的table'/><author><name>Ulyness</name><uri>http://www.blogger.com/profile/08533565364940841252</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://2.bp.blogspot.com/_w1HDT-pYcSA/SZgTdBKjVOI/AAAAAAAABnQ/3PHyDicRnxE/S220/9229305_3754307770.jpg'/></author><thr:total>0</thr:total></entry></feed>
