<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>笨頭哥的沒營養文章集</title>
	
	<link>http://blog.hubert.tw</link>
	<description>Hubert's Blog</description>
	<lastBuildDate>Thu, 12 Apr 2012 09:18:35 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/hubert" /><feedburner:info uri="hubert" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>地址</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/l4Rpqa-hhX8/</link>
		<comments>http://blog.hubert.tw/2012/04/12/%e5%9c%b0%e5%9d%80/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 09:18:35 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Murmuring]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=608</guid>
		<description><![CDATA[左前方的同事即將要離職了，一如往常地，信件還是在午後送到他的手中。 那麼再下個禮拜呢？那些寫著同樣地址的信件會去哪裡呢？ 信件無情緒的投遞著，並且轉送。 那是誰寄給他的呢？是張旅行明信片嗎？是大買場大量灑出的特惠消息嗎？ 還是藍色紙張的電信帳單？ 改變的時候，我們連地址都改變了，一個一個通知說，我換地址了。 那些重要的東西不會寄失，只有宛如無機質的廣告被寄出，然後停頓。 Hi, 我換地址了。 也許期待的不是什麼，只是害怕寄丟而已。]]></description>
			<content:encoded><![CDATA[<p>左前方的同事即將要離職了，一如往常地，信件還是在午後送到他的手中。</p>
<p>那麼再下個禮拜呢？那些寫著同樣地址的信件會去哪裡呢？</p>
<p>信件無情緒的投遞著，並且轉送。</p>
<p>那是誰寄給他的呢？是張旅行明信片嗎？是大買場大量灑出的特惠消息嗎？<br />
還是藍色紙張的電信帳單？</p>
<p>改變的時候，我們連地址都改變了，一個一個通知說，我換地址了。<br />
那些重要的東西不會寄失，只有宛如無機質的廣告被寄出，然後停頓。</p>
<p>Hi, 我換地址了。</p>
<p>也許期待的不是什麼，只是害怕寄丟而已。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/l4Rpqa-hhX8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2012/04/12/%e5%9c%b0%e5%9d%80/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2012/04/12/%e5%9c%b0%e5%9d%80/</feedburner:origLink></item>
		<item>
		<title>用 Microsoft Translator API 翻譯 properties 檔案</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/RpWJkD5s3CQ/</link>
		<comments>http://blog.hubert.tw/2012/01/11/%e7%94%a8-microsoft-translatorapi-%e7%bf%bb%e8%ad%af-properties-%e6%aa%94%e6%a1%88/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 03:47:03 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Microsoft Translator API]]></category>
		<category><![CDATA[properties]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=600</guid>
		<description><![CDATA[因為另外一套要錢，所以來用 Microsoft Translator API 隨手寫寫，一年沒寫文章，也許有點刻意，差不多該是改變的時候了。]]></description>
			<content:encoded><![CDATA[<p>因為另外一套要錢，所以來用 <a href="http://www.microsofttranslator.com/dev/">Microsoft Translator API</a></p>
<pre class="brush: python; title: ; notranslate">
#!/usr/bin/env python

# coding: utf-8

import urllib
import sys
import xml.dom.minidom

# Get Bing AppID from https://ssl.bing.com/webmaster/developers/appids.aspx
BING_APPID = 'KERO~'

FILE_FROM = 'lang.properties'
FILE_TO = 'translated.properties'

LANG_FROM = 'en'
LANG_TO = 'zh-chs'

def translate(text, from_lang, to_lang):
    base_url = 'http://api.microsofttranslator.com/v2/Http.svc/Translate?'
    data = urllib.urlencode({'appId':BING_APPID,
                             'from': from_lang.encode('utf-8'),
                             'to': to_lang.encode('utf-8'),
                             'text': text.encode('utf-8')
                            })

    url = base_url + data
    response = urllib.urlopen(url).read()

    dom = xml.dom.minidom.parseString(response)
    result = dom.documentElement.childNodes[0].nodeValue

    return result.encode('utf-8')

def parse_properties(filename):
    langs = {}
    with open(filename, 'r') as f:
        lines = [ line.strip() for line in f.readlines() ]
        for line in lines:
            idx = line.find('=')
            if idx == -1:
                continue

            (key, val) = (line[:idx], line[idx+1:])
            if not key:
                continue

            langs[key] = val

    return langs

def main():
    langs = parse_properties(FILE_FROM)
    translated = { k: translate(v, LANG_FROM, LANG_TO) if v else &quot;&quot;
                   for k,v in langs.items() }

    with open(FILE_TO, 'w+') as f:
        for k,v in sorted(translated.items()):
            f.write(&quot;%s=%s\n&quot; % (k,v))

if __name__ == '__main__':
    main()
</pre>
<p>隨手寫寫，一年沒寫文章，也許有點刻意，差不多該是改變的時候了。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/RpWJkD5s3CQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2012/01/11/%e7%94%a8-microsoft-translatorapi-%e7%bf%bb%e8%ad%af-properties-%e6%aa%94%e6%a1%88/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2012/01/11/%e7%94%a8-microsoft-translatorapi-%e7%bf%bb%e8%ad%af-properties-%e6%aa%94%e6%a1%88/</feedburner:origLink></item>
		<item>
		<title>以 boost type traits 在 compile time 檢查 function 的 prototype</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/k3FlUn9hC4g/</link>
		<comments>http://blog.hubert.tw/2010/08/22/%e4%bb%a5-boost-type-traits-%e5%9c%a8-compile-time-%e6%aa%a2%e6%9f%a5-function-%e7%9a%84-prototype/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 14:19:51 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[boost]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=592</guid>
		<description><![CDATA[在使用 Google C++ Mocking Framework 的時候很可能遇到一個情況，當原本的 virtual function 的 prototype 改變的時候，你所 mocking 的 prototype 很可能不是預期會被呼叫的那個。 舉例來說 然而有一天，有一個新同事覺得他必須傳一個參數 int 進到 FuncB 當中，就直接對於宣告與實作動了手腳，所有的測試以及 production code 都沒有問題，直到跑了這個 unit test 才發現，原本預期被呼叫的 void (CA::*)() 沒有被呼叫，實際被呼叫的是 void (CA::*)(int) 這個版本。 那麼我們可不可以直接產生出 Google Mock Framework 所需的 function prototype &#8230; <a href="http://blog.hubert.tw/2010/08/22/%e4%bb%a5-boost-type-traits-%e5%9c%a8-compile-time-%e6%aa%a2%e6%9f%a5-function-%e7%9a%84-prototype/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>在使用 <a href="http://code.google.com/p/googlemock/">Google C++ Mocking Framework</a> 的時候很可能遇到一個情況，當原本的 virtual function 的 prototype 改變的時候，你所 mocking 的 prototype 很可能不是預期會被呼叫的那個。<br />
<span id="more-592"></span><br />
舉例來說</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;gmock /gmock.h&gt;
#include &lt;gtest /gtest.h&gt;

class CA
{
protected:
    virtual void FuncB() {
        std::cout &lt; &lt; &quot;CA FuncB&quot; &lt;&lt; std::endl;
    }

public:
    void FuncA() {
        FuncB();
    }
};

class CAOverrider: public CA
{
public:
    MOCK_METHOD0(FuncB, void());
};

void OverrideFuncB(){
    std::cout &lt;&lt; &quot;Override FuncB&quot; &lt;&lt; std::endl;
}

TEST(CATest, ExtractAndOverrideFuncB)
{
    using ::testing::Invoke;

    CAOverrider ca;
    EXPECT_CALL(ca, FuncB())
        .WillOnce(Invoke(OverrideFuncB));

    ca.FuncA();
}
</pre>
<p>然而有一天，有一個新同事覺得他必須傳一個參數 int 進到 FuncB 當中，就直接對於宣告與實作動了手腳，所有的測試以及 production code 都沒有問題，直到跑了這個 unit test 才發現，原本預期被呼叫的 void (CA::*)() 沒有被呼叫，實際被呼叫的是 void (CA::*)(int) 這個版本。</p>
<p>那麼我們可不可以直接產生出 Google Mock Framework 所需的 function prototype 呢？一開始的腦袋先動到 <a href="http://www.boost.org/doc/html/typeof/tuto.html">BOOST_TYPEOF</a> 這個 macro，不過我馬上意識到，這樣所產生出的型別是帶有 CA::* 這樣的 member pointer，與 Google C++ Mocking Framework 所需的並不相同。</p>
<p>在翻過一些文章之後，我發現過去曾經有人在 boost type traits 當中加入 <a href="https://svn.boost.org/trac/boost/browser/sandbox/type_traits/boost/type_traits/remove_member_pointer.hpp ">remove_member_pointer.hpp</a> 這個檔案</p>
<p>於是關鍵的那行就可以改成</p>
<pre class="brush: cpp; title: ; notranslate">
class CAOverrider: public CA
{
public:
    MOCK_METHOD0(FuncB,  boost::remove_member_pointer&lt;boost_typeof (&amp;CA::FuncB)&gt;::type);
};
</pre>
<p>如此一來就能夠在編譯的時期意識到這個問題了。</p>
<p>回到問題的本質上，這個問題起因於 MOCK_METHOD0 並沒有辦法明確指出他有 override CA 的 FuncB。這個問題似乎也在 C++0x 的 <a href="http://www.open-std.org/Jtc1/sc22/WG21/docs/papers/2009/n2928.htm">Explicit Virtual Overrides</a> 提出解法了。</p>
<p>我想這個解決方法並不是相當優雅，但也讓我開始意識到 C++ 的 template, type 以及 trait 的多樣性，也驅使我由這點再開始閱讀 Boost MPL，雖然現在才剛剛開始，但或許之後也慢慢會有不同的思維吧！</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/k3FlUn9hC4g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/08/22/%e4%bb%a5-boost-type-traits-%e5%9c%a8-compile-time-%e6%aa%a2%e6%9f%a5-function-%e7%9a%84-prototype/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/08/22/%e4%bb%a5-boost-type-traits-%e5%9c%a8-compile-time-%e6%aa%a2%e6%9f%a5-function-%e7%9a%84-prototype/</feedburner:origLink></item>
		<item>
		<title>關於 Agile 我想說的是</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/ep4T0wT2JWs/</link>
		<comments>http://blog.hubert.tw/2010/07/19/%e9%97%9c%e6%96%bc-agile-%e6%88%91%e6%83%b3%e8%aa%aa%e7%9a%84%e6%98%af/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 16:09:23 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Software Engineering]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=587</guid>
		<description><![CDATA[坐在床上，老實說我沒想到在連續忙了好多天之後，還想打出這樣一篇混亂而隨性的文章。 有時候我覺得瘋狂，或是覺得難以想像，耳邊忽然冒出許多像是 Agile, Scrum 這樣嶄新的名詞，許多工程師、或是 Project Manager 開始上這些「認證」的課程。所以我身邊多了一些 Scrum Master，或是一些帶領工程師進入新 process 的人。 有人說 Agile 對軟體是有意義的，因為他讓每個人「必須」 溝通：讓所有人知道你在做什麼，是不是做對的事情。合乎 spec 嗎？有測試嗎？ 透明化：隨時公開專案的進度 （附註：我知道 Agile 的精神還有測試。） 如果單只是如此，那你的 Agile 可能並不是 Agile，而可能只是在傳統的執行面上，加上一層「看似溝通」的保護。容許我這樣說，如果在 Agile 的精神之外，每天的 daily stand up meeting，只是把 weekly report 變成 daily report 而已。即便如此，我覺得溝通絕對是有益處的。適度的回應讓專案進度變得透明，也能確保 design 與 &#8230; <a href="http://blog.hubert.tw/2010/07/19/%e9%97%9c%e6%96%bc-agile-%e6%88%91%e6%83%b3%e8%aa%aa%e7%9a%84%e6%98%af/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>坐在床上，老實說我沒想到在連續忙了好多天之後，還想打出這樣一篇混亂而隨性的文章。</p>
<p>有時候我覺得瘋狂，或是覺得難以想像，耳邊忽然冒出許多像是 Agile, Scrum 這樣嶄新的名詞，許多工程師、或是 Project Manager 開始上這些「認證」的課程。所以我身邊多了一些 Scrum Master，或是一些帶領工程師進入新 process 的人。<span id="more-587"></span></p>
<p>有人說 Agile 對軟體是有意義的，因為他讓每個人「必須」</p>
<ol>
<li>溝通：讓所有人知道你在做什麼，是不是做對的事情。合乎 spec 嗎？有測試嗎？</li>
<li>透明化：隨時公開專案的進度</li>
</ol>
<p>（附註：我知道 Agile 的精神還有測試。）</p>
<p>如果單只是如此，那你的 Agile 可能並不是 Agile，而可能只是在傳統的執行面上，加上一層「看似溝通」的保護。容許我這樣說，如果在 Agile 的精神之外，每天的 daily stand up meeting，只是把 weekly report 變成 daily report 而已。即便如此，我覺得溝通絕對是有益處的。適度的回應讓專案進度變得透明，也能確保 design 與 implementation 與 spec 是相同的（有種 BDD 的意味）。</p>
<p>回想起碩士班的時候，指導教授會回復你每一封 E-mail，如果沒有特別的 comment，可能就只是一封「Good, Y.B」這樣的回復。現在想起來，其實我覺得很安心，老師雖然不知道什麼是 Agile 或是 Scrum 這些近代的 process，但是我們之間有種默契，至少老師知道我做了什麼，對於我的 Weekly Report 有什麼想法。或是我也知道哪一件事情正在進行，老師可能之後還會再回覆我。</p>
<p>我想 Agile 會不會只是一種手段？即便還沒有 Agile，因著彼此的信任，卻達到某種 Agile 執行面的手法。</p>
<p>如果 Agile 和許多現今的 Software Engineering 是一種手段，但這些方法若不是建立在彼此的信任關係上，會是如何呢？舉例而言，如果公司上面說我們的精神是「Change」，也可以敞開心胸說「真心話」，但你不信任你的主管，總是私底下抱怨，也覺得 Change 是一種累贅。那麼，這樣的 slogan 就只是上面長官打高空的伎倆，沒有任何意義。</p>
<p>我想 Agile 與許多軟體開發的技巧相同，你不只仰賴傳遞「執行面」的事物，而是使人真正從內心信服，這些改變是有意義的，能夠真實幫助每天的工作。你當然可以透過每次舉辦的 Workshop 進行想法的傳遞，但更重要的是，這種信念必須透過一種類似「傳教士」的生命，每天切實地影響團隊當中的每個人。然後逐步使人信服，並且融入每天的生活與想法才行。</p>
<p>軟體開發除了軟體的本質之外，還是一門與人的學問，每個參與者都能察覺細微的氣氛轉變。而專案的帶領者是不是又能真實的關心每個人執行的狀況，並依照彼此的需要去做調整，再更深的推展出 process 面的技巧，因應改變，也「準時」交出「好的軟體」。</p>
<p>至於現在的我，我想我還只是一個初出茅廬的工程師，關於軟體工程，我還懂得太少。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/ep4T0wT2JWs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/07/19/%e9%97%9c%e6%96%bc-agile-%e6%88%91%e6%83%b3%e8%aa%aa%e7%9a%84%e6%98%af/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/07/19/%e9%97%9c%e6%96%bc-agile-%e6%88%91%e6%83%b3%e8%aa%aa%e7%9a%84%e6%98%af/</feedburner:origLink></item>
		<item>
		<title>去那更遙遠的地方</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/Q1BYSqLTAOU/</link>
		<comments>http://blog.hubert.tw/2010/05/30/%e5%8e%bb%e9%82%a3%e6%9b%b4%e9%81%99%e9%81%a0%e7%9a%84%e5%9c%b0%e6%96%b9/#comments</comments>
		<pubDate>Sun, 30 May 2010 00:41:00 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Murmuring]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=584</guid>
		<description><![CDATA[你在凝望些什麼？ 是那車水馬龍轉眼消逝的既視記憶， 又或者是內心底部那沈澱莫名的空靈感。 我說或許， 我（或者我們）都只是必須離開。 如果必須如此， 那我們絕對必須以極盡歡愉（甚至狂喜）的腳步跳躍著吧！ 因為， 我們將奔向另一個遙遠的國度。 於是我在你面前駐足， 以這張相片， 簽署我們遠行的約定（即使形式並不完全）。 Farewell，my friend 再會了，另一個旅人。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/hub19/4651475670/"><img src="http://farm5.static.flickr.com/4019/4651475670_79928ce839.jpg" alt="遺忘之後，然後遠行" /></a></p>
<p>你在凝望些什麼？<br />
是那車水馬龍轉眼消逝的既視記憶，<br />
又或者是內心底部那沈澱莫名的空靈感。</p>
<p>我說或許，<br />
我（或者我們）都只是必須離開。<br />
如果必須如此，<br />
那我們絕對必須以極盡歡愉（甚至狂喜）的腳步跳躍著吧！<br />
因為，<br />
我們將奔向另一個遙遠的國度。</p>
<p>於是我在你面前駐足，<br />
以這張相片，<br />
簽署我們遠行的約定（即使形式並不完全）。</p>
<p>Farewell，my friend<br />
再會了，另一個旅人。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/Q1BYSqLTAOU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/05/30/%e5%8e%bb%e9%82%a3%e6%9b%b4%e9%81%99%e9%81%a0%e7%9a%84%e5%9c%b0%e6%96%b9/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/05/30/%e5%8e%bb%e9%82%a3%e6%9b%b4%e9%81%99%e9%81%a0%e7%9a%84%e5%9c%b0%e6%96%b9/</feedburner:origLink></item>
		<item>
		<title>Use VERSIONER_PYTHON_PREFER_32_BIT=yes in Snow Leopard</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/gviIYpQ_toM/</link>
		<comments>http://blog.hubert.tw/2010/03/04/use-versioner_python_prefer_32_bityes-in-snow-leopard/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 08:21:00 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA["Snow Leopard"]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[VERSIONER_PYTHON_PREFER_32_BIT]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=574</guid>
		<description><![CDATA[In python, you can use ctype (dl is deprecated now) to load dynamic link library. In 10.4 and 10.5 it may work fine, but it may occur errors in 10.6, such as /Library/Frameworks/dummy.framework/dummy: no matching architecture in universal wrapper Since &#8230; <a href="http://blog.hubert.tw/2010/03/04/use-versioner_python_prefer_32_bityes-in-snow-leopard/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In python, you can use <a href="http://docs.python.org/library/ctypes.html">ctype</a> (<a href="http://docs.python.org/library/dl.html">dl</a> is deprecated now) to load dynamic link library. In 10.4 and 10.5 it may work fine, but it may occur errors in 10.6, such as</p>
<blockquote><p>
/Library/Frameworks/dummy.framework/dummy: no matching architecture in universal wrapper
</p></blockquote>
<p>Since the python in Snow Leopard is 64-bit in default, for those libraries which does not support 64-bit. You can test your library by</p>
<blockquote><p>% file /Library/Frameworks/dummy.framework/Versions/Current/dummy
</p></blockquote>
<p>If you library is i386 only, you may need to handle it in this way.</p>
<blockquote><p>
% export VERSIONER_PYTHON_PREFER_32_BIT=yes<br />
% python your_script.py
</p></blockquote>
<p><a href="http://blog.ericsk.org/">ericsk</a> has also mentioned this for <a href="http://www.wxpython.org/">wxPython</a> in <a href="http://www.plurk.com/p/3zg4c0">his plurk</a></p>
<p>For more information, you can read the man page in your Snow Leopard.</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/gviIYpQ_toM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/03/04/use-versioner_python_prefer_32_bityes-in-snow-leopard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/03/04/use-versioner_python_prefer_32_bityes-in-snow-leopard/</feedburner:origLink></item>
		<item>
		<title>黑白的風景</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/KCdUmuAw2mk/</link>
		<comments>http://blog.hubert.tw/2010/03/04/%e9%bb%91%e7%99%bd%e7%9a%84%e9%a2%a8%e6%99%af/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:52:58 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Murmuring]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/2010/03/04/%e9%bb%91%e7%99%bd%e7%9a%84%e9%a2%a8%e6%99%af/</guid>
		<description><![CDATA[可能因為我們用錯了模式，所以那看出去的風景才是黑色的。給自己，還有每個陷在情緒以及苦難中的人。 上帝必與我們同在。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/hub19/4373219692/"><img alt="" src="http://farm3.static.flickr.com/2769/4373219692_98d2d84ea5.jpg" title="法善寺橫丁一隅" class="alignnone" width="500" height="333" /></a></p>
<p>可能因為我們用錯了模式，所以那看出去的風景才是黑色的。給自己，還有每個陷在情緒以及苦難中的人。</p>
<p>上帝必與我們同在。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/KCdUmuAw2mk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/03/04/%e9%bb%91%e7%99%bd%e7%9a%84%e9%a2%a8%e6%99%af/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/03/04/%e9%bb%91%e7%99%bd%e7%9a%84%e9%a2%a8%e6%99%af/</feedburner:origLink></item>
		<item>
		<title>Using minimock for Python unit testing</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/djnqx1bs3Jk/</link>
		<comments>http://blog.hubert.tw/2010/02/24/using-minimock-for-python-unit-testing/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 02:44:43 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA["unit test"]]></category>
		<category><![CDATA[minimock]]></category>
		<category><![CDATA[mock]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=568</guid>
		<description><![CDATA[我也忘了什麼時候開始習慣作 unit testing 了，可能是前一個專案在 Xcode 上就開始學著寫一點測試了。 這次在閱讀 Writing Testable Code 對於 6. Static methods: (or living in a procedural world)，格外有感覺。 尤其是修改別人的程式碼的時候，如果他總是直接呼叫 static method，不讓你用 mock object 把 implementation 換掉的話，這樣在測試起來就顯得麻煩的多。舉例來說，有一個 class method 會呼叫 SSHHelper.execute_ssh 這個指令去遠端執行一些東西，但這對 unit testing 而言就是一種外部的 dependency，你絕對不希望他真的在測試的時候跑出個 ssh 真的連過去執行些什麼吧。 剛好這次用 &#8230; <a href="http://blog.hubert.tw/2010/02/24/using-minimock-for-python-unit-testing/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>我也忘了什麼時候開始習慣作 unit testing 了，可能是前一個專案在 Xcode 上就開始學著寫一點測試了。</p>
<p>這次在閱讀 <a href="http://googletesting.blogspot.com/2008/08/by-miko-hevery-so-you-decided-to.html">Writing Testable Code</a> 對於 6. Static methods: (or living in a procedural world)，格外有感覺。</p>
<p>尤其是修改別人的程式碼的時候，如果他總是直接呼叫 static method，不讓你用 mock object 把 implementation 換掉的話，這樣在測試起來就顯得麻煩的多。舉例來說，有一個 class method 會呼叫 SSHHelper.execute_ssh 這個指令去遠端執行一些東西，但這對 unit testing 而言就是一種外部的 dependency，你絕對不希望他真的在測試的時候跑出個 ssh 真的連過去執行些什麼吧。</p>
<p>剛好這次用 <a href="http://pypi.python.org/pypi/MiniMock">MiniMock</a> 作我們的 mock library，因為他的因素，你就可以這樣作</p>
<pre class="brush: python; title: ; notranslate">
minimock.mock('SSHHelper.execute_ssh', returns=ssh_output)
</pre>
<p>如此一來，execute_ssh 這個 method 的結果就可以簡單的換成你預期的 ssh_output。</p>
<p>如果是本來就有比較好的設計的話，你也可以用 minimock.Mock (注意大小寫)，去產生一個 mock object 出來。</p>
<pre class="brush: python; title: ; notranslate">
mock_fs = minimock.Mock('MockFileSystem')
mock_fs.size.mock_returns = 1
mytools.fs_imp = mock_fs
</pre>
<p>如此一來 mock 就顯得簡單多了……</p>
<p>話說回來，之前想寫的 objective-c 跟 DTrace 的 topic 真的都忘的差不多了，算了，以後再說吧，也許之後把 python 的 <a href="http://www.python.org/dev/peps/pep-3134/">Exception Chaining and Embedded Tracebacks</a> 的想法整理一下再丟出來吧。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/djnqx1bs3Jk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/02/24/using-minimock-for-python-unit-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/02/24/using-minimock-for-python-unit-testing/</feedburner:origLink></item>
		<item>
		<title>Hide Menu Bar in Firefox 3.6</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/ieI8QW2vYuM/</link>
		<comments>http://blog.hubert.tw/2010/01/22/hide-menu-bar-in-firefox-3-6/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:36:18 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[firefox]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Firefox HTML]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=565</guid>
		<description><![CDATA[Firefox 3.6 開始可以隱藏 Menu Bar 了，所以這樣再搭配上 Tree Style Tab，整個可視範圍就大了起來！不過，也因為這樣，這次主打的 Pesonas 在這種環境下就顯得很無奈了，能妝點的範圍太有限了……。 接著等著看，HTML 5 能改變世界多少，看什麼時候會真的有 File API 的服務出來。]]></description>
			<content:encoded><![CDATA[<p>Firefox 3.6 開始可以隱藏 Menu Bar 了，所以這樣再搭配上 <a href="https://addons.mozilla.org/en-US/firefox/addon/5890">Tree Style Tab</a>，整個可視範圍就大了起來！不過，也因為這樣，這次主打的 <a href="https://mozillalabs.com/personas/">Pesonas</a> 在這種環境下就顯得很無奈了，能妝點的範圍太有限了……。</p>
<p><a href="http://www.flickr.com/photos/hub19/4294893417/"><img src="http://farm3.static.flickr.com/2700/4294893417_549e2ed226.jpg" alt="My Firefox 3.6" /></a></p>
<p>接著等著看，HTML 5 能改變世界多少，看什麼時候會真的有 <a href="http://dev.w3.org/2006/webapi/FileAPI/">File API</a> 的服務出來。</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/ieI8QW2vYuM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/01/22/hide-menu-bar-in-firefox-3-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/01/22/hide-menu-bar-in-firefox-3-6/</feedburner:origLink></item>
		<item>
		<title>如何讓 moodle 的 Certificate mod正確顯示中文</title>
		<link>http://feedproxy.google.com/~r/hubert/~3/ZDdFT8Bb_QU/</link>
		<comments>http://blog.hubert.tw/2010/01/02/%e5%a6%82%e4%bd%95%e8%ae%93-moodle-%e7%9a%84-certificate-mod%e6%ad%a3%e7%a2%ba%e9%a1%af%e7%a4%ba%e4%b8%ad%e6%96%87/#comments</comments>
		<pubDate>Sat, 02 Jan 2010 04:03:37 +0000</pubDate>
		<dc:creator>Hubert</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[moodle certificate 中文 tcpdf]]></category>

		<guid isPermaLink="false">http://blog.hubert.tw/?p=559</guid>
		<description><![CDATA[其實我的正職跟網頁一點關係都沒有（爆） moodle Certificate Module 是一個讓 moodle 可以做出結業證書的 module，不過以原本的狀況而言，沒辦法很正確的生出中文的 pdf，這時候就需要動一些手腳。 你可以從 type/unicode_landscape/certificate.php 知道他用的 tcpdf 是 moodle 本身的 然後我發現新版的 tcpdf 裡面有 CID-0 的支援，就索性照著 TCPDF Fonts 把一些字型丟進去跑跑看，像是文泉驛正黑體、王漢宗自由字型。 後來想想，似乎沒有不用這麼麻煩。直接用 arialunicid0 這個 tcpdf 有的設定就好，把他的設定改成我要的中文 再把 certificate 的字型稍微換一下就好，把原本的 FreeSerif 跟 FreeMono 換成 arialunicid0，再注意一下，新的 tcpdf 已經沒有 TCPDF_Protection &#8230; <a href="http://blog.hubert.tw/2010/01/02/%e5%a6%82%e4%bd%95%e8%ae%93-moodle-%e7%9a%84-certificate-mod%e6%ad%a3%e7%a2%ba%e9%a1%af%e7%a4%ba%e4%b8%ad%e6%96%87/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>其實我的正職跟網頁一點關係都沒有（爆）</p>
<p><a href="http://docs.moodle.org/en/Certificate_module">moodle Certificate Module</a> 是一個讓 <a href="http://moodle.org/">moodle</a> 可以做出結業證書的 module，不過以原本的狀況而言，沒辦法很正確的生出中文的 pdf，這時候就需要動一些手腳。<br />
<span id="more-559"></span><br />
你可以從 type/unicode_landscape/certificate.php 知道他用的 tcpdf 是 moodle 本身的</p>
<pre class="brush: php; title: ; notranslate">
include '../../lib/tcpdf/tcpdfprotection.php';
require_once('../../lib/tcpdf/config/lang/eng.php');
include '../../lib/tcpdf/tcpdf.php';
</pre>
<p>然後我發現新版的 tcpdf 裡面有 CID-0 的支援，就索性照著 <a href="http://www.tecnick.com/public/code/cp_dpage.php?aiocp_dp=tcpdf_fonts">TCPDF Fonts</a> 把一些字型丟進去跑跑看，像是<a href="http://wenq.org/?ZenHei">文泉驛正黑體</a>、<a href="http://zh.wikipedia.org/wiki/%E7%8E%8B%E6%BC%A2%E5%AE%97%E8%87%AA%E7%94%B1%E5%AD%97%E5%9E%8B">王漢宗自由字型</a>。</p>
<p>後來想想，似乎沒有不用這麼麻煩。直接用 arialunicid0 這個 tcpdf 有的設定就好，把他的設定改成我要的中文</p>
<pre class="brush: php; title: ; notranslate">
$enc='UniCNS-UTF16-H';
$cidinfo=array('Registry'=&gt;'Adobe','Ordering'=&gt;'CNS1','Supplement'=&gt;0);
include(dirname(__FILE__).'/uni2cid_ac15.php');
</pre>
<p>再把 certificate 的字型稍微換一下就好，把原本的 FreeSerif 跟 FreeMono 換成 arialunicid0，再注意一下，新的 tcpdf 已經沒有 TCPDF_Protection 這個 class，直接 new TCPDF 就好。</p>
<p>這樣做出來的 pdf 也比直接嵌入wang ttf 的來的小，大概 22K 附近，效果也還不錯。在這邊備忘一下，要不然之後大概又忘記怎麼做了 XD</p>
<img src="http://feeds.feedburner.com/~r/hubert/~4/ZDdFT8Bb_QU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.hubert.tw/2010/01/02/%e5%a6%82%e4%bd%95%e8%ae%93-moodle-%e7%9a%84-certificate-mod%e6%ad%a3%e7%a2%ba%e9%a1%af%e7%a4%ba%e4%b8%ad%e6%96%87/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.hubert.tw/2010/01/02/%e5%a6%82%e4%bd%95%e8%ae%93-moodle-%e7%9a%84-certificate-mod%e6%ad%a3%e7%a2%ba%e9%a1%af%e7%a4%ba%e4%b8%ad%e6%96%87/</feedburner:origLink></item>
	</channel>
</rss>

