<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[大貓共和國]]></title>
  <link href="http://blog.miaout17.net/atom.xml" rel="self"/>
  <link href="http://blog.miaout17.net/"/>
  <updated>2013-09-03T13:48:41+08:00</updated>
  <id>http://blog.miaout17.net/</id>
  <author>
    <name><![CDATA[Big Cat]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Blogtrans 1.1.0版更新]]></title>
    <link href="http://blog.miaout17.net/2013/09/03/blogtrans-1-1-0-update/"/>
    <updated>2013-09-03T13:38:00+08:00</updated>
    <id>http://blog.miaout17.net/2013/09/03/blogtrans-1-1-0-update</id>
    <content type="html"><![CDATA[<p>Blogtrans 1.1.0 更新 (2013/09/03) <a href="https://sourceforge.net/projects/blogtrans/files/">下載點</a></p>

<p>修正了下列問題：</p>

<ul>
<li>自動修正無名XML檔日期錯誤的問題（如自動將2/31修正為2/28）</li>
<li>新增「工具：清除所有文章類別」功能（無法匯入所有文章至Blogger時可嘗試使用）</li>
<li>修正留言附加於錯誤文章的bug</li>
</ul>


<p>最近無名要關站了，又收到滿多人來信詢問將無名XML備份檔轉為Blogger Atom XML格式的問題。其中最常遇到的問題就是無名的備份檔的日期問題了，無名的備份檔中常會出現2/29、2/30、11/31之類的日期，當然正常的日期解析器(parser)是無法處理這些錯誤日期的，導致Blogtrans無法匯入檔案。之前有人將備份檔寄給我的話，我會幫他們手動修正日期。在1.1.0版中增加了自動修正日期的功能（如看到11/31時會自動修正為11/30），大家搬家應該會順利些吧 :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[OSDC2013]那些函數語言Tutorial沒有教我的事]]></title>
    <link href="http://blog.miaout17.net/2013/04/21/osdc-2013-functional-programming/"/>
    <updated>2013-04-21T02:15:00+08:00</updated>
    <id>http://blog.miaout17.net/2013/04/21/osdc-2013-functional-programming</id>
    <content type="html"><![CDATA[<p>抱著「關於函數語言有一些話想說，想釐清一些誤會」的想法報名了OSDC。原本就覺得這是個不容易講好的主題，準備時又發現比想像困難許多。</p>

<p>事後看到IRC Log的一些留言，投影片誤植Java支援lambda的版本為Java7，實為Java8，謝謝wcpan的指教，投影片已更正。</p>

<p>另外，有人問「rand()算不算pure function呢？」這是一個有趣的問題。若討論C stdlib的rand()，其實這個函數使用了廣域的亂數種子，可由srand()函數設定。每次呼叫rand()時，便會更新廣域狀態，並回傳一個亂數。所以，C的rand()違反了pure function的兩個定義：不讀取或寫入廣域狀態，給予同樣的參數(沒有參數)得到不同結果。</p>

<p>那有沒有可能將亂數定義為純函數呢？</p>

<ul>
<li>密碼學的block cipher在加密和解密時使用擬亂數產生器，產生相同的亂數序列作為每個block加密的密鑰。在討論密碼學時，常會定義pesudo random function為prf(key, seq) :: 位元串列-&gt;位元串列-&gt;位元串列 (<a href="http://crypto.stanford.edu/pbc/notes/crypto/prf.xhtml">參考Standford密碼學課程對PRF的說明</a>)。參數key為密鑰（也可想成seed），seq為計數器，要產生不同亂數時以seq=0, 1, 2&#8230;代入。這是一個數學上的純函數，給予相同定義的參數，一定會得到同樣的結果，</li>
<li>在Haskell的<a href="http://hackage.haskell.org/packages/archive/random/1.0.0.2/doc/html/System-Random.html">System.Random</a> module中，則同時提供了pure及impure的兩種實作：

<ul>
<li>next :: g -&gt; (Int, g) : next 是一個函數，傳入一個亂數產生器後，會得到一個整數亂數，和一個新的亂數產生器。這也是一個純函數的定義。</li>
<li>文件中的getStdRandom型別有些複雜，但可以文件的範例rollDice :: IO Int。RollDice是一個IO Monad，可能會造成副作用(修改廣域狀態)並回傳一個整數值。</li>
</ul>
</li>
</ul>


<p>「產生相同亂數序列」在程式上有許多的運用，如block cipher加密、測試隨機演算法時可以deterministic的重製演算結果、連線遊戲的同步…等。</p>

<p>最後附上<a href="http://www.slideshare.net/miaout17/tutorial-19128603" title="那些函數語言Tutorial沒有教我的事" target="_blank">投影片</a>。</p>

<iframe src="http://www.slideshare.net/slideshow/embed_code/19128603" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen webkitallowfullscreen mozallowfullscreen> </iframe>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Learn Haskell The Easy Way]]></title>
    <link href="http://blog.miaout17.net/2012/05/08/learn-haskell-the-easy-way/"/>
    <updated>2012-05-08T11:12:00+08:00</updated>
    <id>http://blog.miaout17.net/2012/05/08/learn-haskell-the-easy-way</id>
    <content type="html"><![CDATA[<p>今天晚上是台北<a href="http://registrano.com/events/fpug-meetup-1">Functional Programming User Group第一次聚會</a>。</p>

<p>出乎意料地，這次聚會報名非常迅速的額滿了，而其中不乏函數語言高手。相當期待今晚與各位認識 :)</p>

<p>因為是第一次聚會的關係，我把難度設定的較為簡單，試著以比較有趣的方式，分享<a href="https://www.google.com.tw/search?sourceid=chrome&amp;ie=UTF-8&amp;q=haskell">Haskell</a>語言的一些基礎元素。希望讓從未學習過函數式語言的人，也能對Haskell有基本的認知。</p>

<p>Haskell過去給人的印象，或許總是抽象、數學、難以理解。在分享中，我會Demo製作中的<a href="https://github.com/miaout17/haskell-warrior-prototype">Haskell Warrior專案prototype</a>。希望以遊戲的方式，破除大家對於Haskell不易學習的印象。歡迎各位高手給予批評指教。</p>

<p>在此先附上投影片：</p>

<iframe src="http://www.slideshare.net/slideshow/embed_code/12840828" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[OSDC12]相依性管理 - 以Ruby開發為例]]></title>
    <link href="http://blog.miaout17.net/2012/04/16/osdc12-dependency-management/"/>
    <updated>2012-04-16T22:05:00+08:00</updated>
    <id>http://blog.miaout17.net/2012/04/16/osdc12-dependency-management</id>
    <content type="html"><![CDATA[<p>很高興今年在OSDC有機會跟大家分享一些想法。</p>

<p>今年的OSDC讓我學到許多東西，聽到許多前輩精彩的分享，也讓我了解自己在present方面的不足之處。希望下次有機會分享時，能講的更有趣、更清楚、更有深度一些。</p>

<p>(我Lighting talk講惡搞的東西好像都比較有梗&#8230;.冏rz)</p>

<p>但另一方面，高階語言的相依性管理是我一直想討論的議題，我還是認為自己傳達了一些重要的東西。許多人(Ruby開發者)應該都用過我介紹的工具，但或許不是每個人都深思過為何開發流程如此順暢。正因軟體開發是如此的複雜，我們更需要各式各樣的工具避免開發者犯錯，降低開發阻力。尤其是開源專案，為了讓其他人容易貢獻，讓初學容易從中學習，更需要方便的流程讓任何有興趣的人迅速上手。</p>

<p>附上我的投影片：</p>

<iframe src="http://www.slideshare.net/slideshow/embed_code/12553502" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[如何定義 "會" XXX 程式語言]]></title>
    <link href="http://blog.miaout17.net/2012/04/02/programming-language/"/>
    <updated>2012-04-02T21:43:00+08:00</updated>
    <id>http://blog.miaout17.net/2012/04/02/programming-language</id>
    <content type="html"><![CDATA[<p>這是一篇我在Soft_Job版回應的文章。</p>

<p>其實我平時是不逛Soft_Jobs版的，寫這篇文章是因為女友在PTT看到這個主題，好奇我對於這件事的想法。開始動筆後不小心越寫越長，加上那陣子比較忙，結果花了十幾天才段段續續寫完。也感謝女友發揮編輯專業幫我潤稿 :)</p>

<p>以下保留BBS的排版風格，原文轉載於此。</p>

<pre>
作者: yzugsr (Big Cat) 看板: Soft_Job
標題: Re: [討論] 如何定義 "會" XXX 程式語言
時間: Sun Apr  1 23:43:02 2012


面試一個程式設計師時，要注意的面向很多
像是學習能力、溝通協調能力、實作能力…等等

在下是一名阿宅工程師，有時會需要一起面試未來的同事
在這些面向之中，我個人最重視實作和程式語言的部份（其他部份自然也有其他人把關）

以下就「Coding能力」、「語言的概念」、「語言的細節」、「函式庫的使用」幾項
與大家分享一下我在面試時會注意的事

# Coding能力

個人認為測驗Coding能力最有效的方式是「紙筆測試」
也就是不靠電腦/編譯器/除錯器的狀況下，請對方當面完成一段精簡的程式

有人覺得這樣考太難，面試考紙筆寫程式太殘酷
我聽聞不少公司會這樣考(ex. Facebook, Google, 國內一些軔體公司)
約耳趣談軟體中，也有一篇談論到這樣的測驗方式 http://goo.gl/YSCGy
我的標準也比約耳等人要寬鬆許多

拿約耳書上用C語言來考字串反轉的例子說明好了
我會在白板上寫下 void reverse(char * s)，然後提問：

(1). 請實作將字串原地反轉的函式，不得呼叫其他函式
(2). 承上，不得進行動態記憶體配置
(3). 承上，不得使用數值(numeric)型別及運算

並且告訴對方：
不用緊張，沒有一次寫對沒關係，許多人都無法一次寫對。
但希望你能認真思考、除錯。

我會先從(1)問起，如果對方寫對，就再加上(2)和(3)的限制
如果是C語言高手，你給他(1)的限制，他通常會精簡的直接寫出(3)的答案

如果有錯誤，我會告訴面試者會出現什麼樣的錯誤
(Ex. Segmentation fault, compile error)
再詢問對方遇到這種狀況會如何除錯

P.S.提問者至少需要能夠人腦compile&emulate這些程式
    我可以在C/C++/Java/Ruby/Python上做到
    當然…不一定是考同樣的題目

我認為這樣的測驗可以看出許多東西（視題目的性質而定）：
邏輯、思考方式、演算法、抗壓性、對寫程式的熟悉程度
我相信在面試的手法中，這樣做最能直接看出寫程式的實力

# 語言的概念

每個語言都是由若干概念組成的，先從一個例子開始說明吧：

  當一個只會C的人初學Java時，可能會碰到相當的瓶頸
  因為他不只學習了新的語法，還接觸了各種新的概念
  包括object oriented, garbage collection, class, interface, …

  當他再學習C#時，他會發現他只需要學習Java一半的時間，就能熟習C#的基本概念
  在看到某些設計時，他會想到：「喔喔，C#也有類似的設計」

  有一天他突然對腳本語言有興趣，所以他學習了Python，然後又遇到了撞牆期
  他同時接觸了以indent為block的語法
  還要學習dymanic typed, duck typing其實相關的設計方法

  當這個人再去學習Ruby時，他會發現他只需要學習Python一半的時間就學會基本
  當他再學習Lua時，他發現他只需要半天就可以看完語法，可以寫些簡單的小程式了

  數年後，他又因為興趣開始學習Erlang
  第一次接觸到Single-assignment, Functional Programming
  要入門又有好長的一段路要走

我認為重要的不是「會使用多少語言」，而是「對各種概念有多深的了解」
如果對方說會C++和Python，我會問他覺得兩種語言各有什麼特性、優缺點

很多時候對方會講不出來，或許不是面試者完全不了解
可能是對方不夠熟悉，或是不懂特定的專有名詞
這時可以再問一些問題，去試探對方對這些概念的了解程度

前面有版友提到：「我怎麼很少聽到有人自稱會很多程式語言的」
我相信在熟悉各種概念的前提下，要會很多種程式語言並非真的這麼稀奇

但就像Google在某些地區的徵才說明：

  请确保你简历中的所有内容都是可被核实的。例如，如果你的主要编程语言是Java或者
  Haskell，那么面试过程中就可能被问及此类话题。

如果有人說自己會C++
但發現他不懂template，甚至講不清楚物件導向的基本概念
列出C++不但不會加分，還會倒扣一些分數

很多時候，對方對程式設計的了解深淺，只要聊幾句就可以摸清楚
有時還是會碰到不確定對方實力的狀況，這時就看對方在紙筆測驗的表現當參考了

我不會因為對方在履歷上列出很多程式語言而扣分
但會希望列在履歷上的技能都是真材實料的，並會努力（笑）核實這些技能

# 語言的細節

我將初學時比較不會碰到，而在實戰、或看書深入研究才會了解的知識分為此類

舉例來說，像前面版友提到的：
* variable shadowing http://goo.gl/uy9In
* object slicing http://goo.gl/Gk6Ud

要自稱「精通」某個程式語言，就必需熟悉這些部分
才能在事前避開地雷，不致寫出有問題的設計及實作
也能在其他人遇到這類問題時，迅速幫助他找到原因

就我而言，對junior engineer來說這些是bonus，而不是requirement
只要基本概念、邏輯好，這些應該都很容易pick up

對於senior enginner而言
若團隊需要的是精通特定語言、技術的人，這點就很重要
換句話說，若是看重其他經驗/學習的potential
而需要能夠快速上手pick up各種技術的員工，這點就可以比較不看重

但若對方自稱擁有四年C++業界經驗
卻沒碰過、也沒聽過object slicing, variable shadowing
我也會對他的實力產生很大的疑惑

# 函式庫的使用

寫程式的人應該都聽過這句話：「不要總是重新發明輪子，要站在巨人的肩膀上。」
固然，為了練功去重刻底層函式庫是值得鼓勵的
但身為程式設計師，學習迅速利用、整合現有的工具，也是重要的課題

若團隊需要專精某Library/Framework的人材
面試者如果原本就精通那些函式庫，會有很大的加分作用
不過，老話一句，這些能力都是會在面試過程中被仔細提問核實的

然而，比起「用過那些函式庫」，我更重視是否理解函式庫的概念
這點與「語言的概念」相似，每個函式庫都可以拆解成一些核心概念

比方說，Spring核心最重要的概念，或許是Inverse of Control和Dependency Injection
若對方說用過Spring，我會對方為什麼選用Spring，他有什麼重要的特性
如果他說不出專有名詞，我會試著以例子測試他是否理解這些概念

接下來，我可能會問對方覺得Spring有什麼優點與缺點
能講出一些優點，算是基本的合格條件
有時被官方文件/書籍洗腦的結果，大多數的人都可以掰出一些優點
但如果優點/缺點都能侃侃而談言之有理，就代表他真的懂了

我同意約耳說的：「不會因應試者不掌握一種特定的技巧而拒絕他」
這裡我看重的有兩點：

1. 如果真正了解函式庫的概念，學習其他概念相似的函式庫時，很快就能上手
2. 如果對方本身碰的東西夠多，又在許多領域都能提出良好見解
我會相信對方對於學習新概念，也比較具有熱情跟效率的

此外，使用函式庫的時候，難免遇到種種問題
這些問題會來自於自身邏輯的錯誤、對函式庫的誤解、甚至函式庫本身的bug
這部份可以請對方談談之前的開發遇到的問題，以及解決問題的流程
試著了解對方是否擁有獨立解決問題的能力

----

不同的人，不同的團隊風格，在面試時會在意不同的事
以上是我的觀點，分享給大家參考

後記：
其實這篇文章十幾天前就開始動筆寫了
不過越寫越長，加上最近太忙，所以到今天才寫完

--
※ 發信站: 批踢踢實業坊(ptt.cc)
</pre>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[將Wordpress轉移到Jekyll及Disqus]]></title>
    <link href="http://blog.miaout17.net/2011/05/08/convert-wordpress-to-jekyll-and-disqus/"/>
    <updated>2011-05-08T00:00:00+08:00</updated>
    <id>http://blog.miaout17.net/2011/05/08/convert-wordpress-to-jekyll-and-disqus</id>
    <content type="html"><![CDATA[<p>最近越來越不習慣使用Wordpress寫文章。我對於寫文章的方式有下列要求：</p>

<ul>
<li>不使用WYSIWYG編輯器。大多數的WYSIWYG編輯器都有產生不必要的HTML碼、貼code格式跑掉…之類的問題。</li>
<li>可以不用手動撰寫HTML碼(markdown)。</li>
<li>可以使用慣用的純文字編輯器(vim)，撰寫文章如同撰寫程式源碼一樣。</li>
</ul>


<p><a href="https://github.com/mojombo/jekyll">Jekyll</a>是一套Ruby靜態網站產生器，支援<a href="http://daringfireball.net/projects/markdown/">markdown</a>, <a href="http://en.wikipedia.org/wiki/Textile_(markup_language">textile</a>等語法。包括Github Pages在內，已有<a href="https://github.com/mojombo/jekyll/wiki/sites">許多網站</a>使用Jekyll。由於靜態網站沒有留言的功能，可以配合<a href="http://disqus.com/">Disqus</a>或Facebook實作留言。我認為這樣的撰文方式不一定適合一般使用者，但相當適合程式設計師使用。</p>

<h3>使用Pretty Permalink</h3>

<p>所謂pretty permalink是指網址是這種格式：</p>

<pre><code>http://blog.miaout17.net/2011/05/08/convert-wordpress-to-jekyll-and-disqus/
</code></pre>

<p>而非</p>

<pre><code>http://blog.miaout17.net/2011/05/08/convert-wordpress-to-jekyll-and-disqus.html
http://blog.miaout17.net/?p=2241
</code></pre>

<p>若Wordpress與Jekyll都使用pretty permalink，轉換時網址就可以直接對應，方便許多。Wordpress需要在後台設定，而Jekyll的_config.yml中加入：</p>

<pre><code>permalink: pretty
</code></pre>

<p>即可。</p>

<p>順帶一提，我的permalink全部都是英文及橫線組成。若permalink有中文或其他字元，可能會產生問題。若不想改掉，請自行修改程式小心處理。</p>

<h3>將Wordpress資料庫轉至Jekyll</h3>

<p>我原本的blog系統是Wordpress。要將Wordpress搬家到Jekyll、Wordpress留言搬到Disqus，都有現成的工具。但這些工具可能還需要一些workaround。</p>

<p>首先，<a href="https://github.com/mojombo/jekyll/wiki/blog-migrations">Jekyll內建的Wordpress Migrator</a>有幾個問題：</p>

<ul>
<li>yaml中的utf8字串會變成binary format</li>
<li>沒有匯出wordpress中的category和tag資訊</li>
<li>沒有匯出時間資訊，同一天的文章順序可能會錯誤</li>
</ul>


<p>因此，我手動修改了<a href="https://github.com/mojombo/jekyll/blob/master/lib/jekyll/migrators/wordpress.rb">Jekyll Wordpress Migrator的源碼</a>，修改後的源碼位於: <a href="https://gist.github.com/961198">https://gist.github.com/961198</a> 。這裡有許多可以客製化的地方。我決定不匯出Category，只匯出Tags。讀者若有需要，可以自行修改。</p>

<h3>將Wordpress留言轉至Disqus</h3>

<p>最後是將留言匯入Disqus。我研究後，認為最方便的方法是直接將Wordpress XML備份檔匯出。其本上Jekyll匯入Wordpress備份檔時是只認網址的。依前面所述，如果Wordpress及Jekyll都使用pretty permalink，兩邊的網址規則應該是一樣的。如果你更換了網域，只要用文字編輯器將XML檔中的網址取代即可。</p>

<p>此外要注意的是：Disqus在匯入時，會直接以HTTP存取你的網站，抓取標題等相關資訊。所以你<strong>必需</strong>先完成Wordpress轉至Jekyll的動作，並確保網站是可以存取的，最後才能匯入Disqus。</p>

<p>Jekyll就像一塊白布，幾乎什麼功能都沒有提供。使用者可以自行設計HTML及CSS模版，撰寫Tag Could等功能。本站就是一個成功轉換的範例。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blogtrans 1.0.1版更新]]></title>
    <link href="http://blog.miaout17.net/2011/04/30/blogtrans-1-0-1-update/"/>
    <updated>2011-04-30T02:19:20+08:00</updated>
    <id>http://blog.miaout17.net/2011/04/30/blogtrans-1-0-1-update</id>
    <content type="html"><![CDATA[<p>Blogtrans v1.0.1釋出，需要者請至<a href="http://sourceforge.net/projects/blogtrans/files/">SourceForge</a>下載</p>

<ul>
<li>修正了Blogger XML匯出時，PM變AM的問題</li>
<li>先拿掉了其實不能用的Blogger XML匯入功能</li>
</ul>


<hr/>


<p>Blogtrans開發密辛：</p>

<p>2009/05/23: 來寫Blogger匯入功能好了，先寫個不能動的程式碼，之後再補完</p>

<p>一年多沒動Blogtrans後&#8230;&#8230;.</p>

<p>2011/03/05: 疑？有一年多前寫好的code還沒發佈耶，裡面有自動化測試、對無名的XML容錯、和<strong>Blogger匯入功能</strong>耶。來合併一下發佈好了…</p>

<p>&#8230;&#8230;..</p>

<p>使用者：這個MT檔有問題耶，我把他匯出Blogger格式再匯入就讀不進來了</p>

<p>&#8230;&#8230;..</p>

<p>對不起，有問題的大概不是MT檔，是Blogger匯入的功能和作者的腦袋&#8230;..Orz</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Psychedelic: Awesome Syntax Colorizer in Ruby]]></title>
    <link href="http://blog.miaout17.net/2011/03/31/psychedelic-awesome-syntax-colorizer-in-ruby/"/>
    <updated>2011-03-31T16:47:22+08:00</updated>
    <id>http://blog.miaout17.net/2011/03/31/psychedelic-awesome-syntax-colorizer-in-ruby</id>
    <content type="html"><![CDATA[<p>忙錄之中弄了這個惡搞，沒空寫blog介紹了，請自己看首頁吧（逃）</p>

<p><a href="http://miaout17.github.com/psychedelic/">http://miaout17.github.com/psychedelic/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blogtrans 1.0.0版更新]]></title>
    <link href="http://blog.miaout17.net/2011/03/07/blogtrans-ver-1-0-0-update/"/>
    <updated>2011-03-07T15:10:42+08:00</updated>
    <id>http://blog.miaout17.net/2011/03/07/blogtrans-ver-1-0-0-update</id>
    <content type="html"><![CDATA[<p>這幾天收到幾位網友來信，表示Blogtrans無法匯入無名備份檔的留言。此時李組長眉頭一皺，認為案情非常單純：無名修改了備份檔的規格。</p>

<p>Blogtrans這次的更新如下：</p>

<ul>
    <li>針對無名備份檔格式變化，做了對應修正</li>
    <li>不再以日期當版本號，以後將用1.0.0這種格式的版本號</li>
</ul>


<p>請<a href="https://sourceforge.net/projects/blogtrans/files/">至sourceforge下載</a>Blogtrans 1.0.0版。</p>

<hr/>


<p>碎碎唸：看著自己三年前用不熟的python寫的程式，真是有砍掉重練的衝動…不過這是經過許多測試的code，能動就繼續用吧…</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Lightning Talk: RichRC & Hirb-Unicode]]></title>
    <link href="http://blog.miaout17.net/2011/03/02/lightning-talk-richrc-hirb-unicode/"/>
    <updated>2011-03-02T01:23:02+08:00</updated>
    <id>http://blog.miaout17.net/2011/03/02/lightning-talk-richrc-hirb-unicode</id>
    <content type="html"><![CDATA[<p>昨天參加Ruby Tuesday時，中場休息時間得知有個Lightning Talk的機會，於是在台下匆匆忙忙的準備投影片。很高興可以跟大家分享我做的小東西，緊張之下講話有些結巴，還請見諒。</p>

<p>我的投影片已上傳至SlideShare:</p>

<div style="width:425px" id="__ss_7109049"><object id="__sse7109049" width="425" height="355"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lightningtalkrichrchirbunicode-110301185138-phpapp02&stripped_title=lightning-talk-richrchirbunicode&userName=miaout17" /> <param name="allowFullScreen" value="true"/> <param name="allowScriptAccess" value="always"/> <embed name="__sse7109049" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lightningtalkrichrchirbunicode-110301185138-phpapp02&stripped_title=lightning-talk-richrchirbunicode&userName=miaout17" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed> </object> </div>


<p>早上更新了一下RichRC的預設設定，如果有安裝hirb-unicode的話就會自動載入。現在只要執行</p>

<pre lang="bash" line="1">
gem install richrc wirble hirb hirb-unicode
</pre>


<p>把需要的gems安裝好，再到rails app目錄下執行</p>

<pre lang="bash" line="1">
richrc
</pre>


<p>就可以使用具有語法高亮、自動完成、顯示資料表格（並修正Unicode排版問題）的rails console了。</p>

<hr/>


<p>我試著將這些小工具做成使用簡單的懶人包，希望能讓大家（尤其是新手）開發Rails時能夠更順手。</p>

<p>關於細節及進階的客製化可參看：</p>

<ul>
    <li>RichRC: <a href="http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/">部落格文章</a>、<a href="https://github.com/miaout17/richrc">Github源碼</a></li>
    <li>hirb-unicode: <a href="http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/">部落格文章</a>、<a href="https://github.com/miaout17/hirb-unicode">Github源碼</a></li>
</ul>


<p>P.S.進階的使用者可以考慮irb的另一個選擇：<a href="https://github.com/cldwalker/ripl
https://github.com/cldwalker/ripl">ripl</a>。ripl內建的功能比irb少，但源碼只有270行左右，其精簡的架構保留了非常高的擴充彈性，目前也已經有<a href="https://github.com/janlelis/ripl-color_result">語法高亮</a>、<a href="https://github.com/janlelis/ripl-multi_line">多行輸入</a>、<a href="https://github.com/cldwalker/ripl-rails">rails整合</a>等二十多個插件可以使用。可以參看Godfat的文章：<a href="http://blogger.godfat.org/2011/02/ripl-rc-1-ripl-irb-replacement.html">ripl-rc (1) (ripl, an irb replacement)</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[hirb-unicode: 解決hirb中全形文字排列的問題]]></title>
    <link href="http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/"/>
    <updated>2011-02-22T14:31:14+08:00</updated>
    <id>http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/cldwalker/hirb">hirb</a>是可以改變irb資料輸出方式改變的gem，其最常應用的場合就是將rails中ActiveModel的資料轉為表格。但中文網站的開發者，應該常常會碰到表格排列歪掉的問題。</p>

<p>使用hirb前：</p>

<p><a href="http://miaout17.github.com/hirb-unicode/no-hirb.png"> <img src="http://miaout17.github.com/hirb-unicode/no-hirb.png" width="550" /></a></p>

<p>（真是幾乎無法閱讀）</p>

<p>使用hirb後：</p>

<p><a href="http://miaout17.github.com/hirb-unicode/hirb-original.png"> <img src="http://miaout17.github.com/hirb-unicode/hirb-original.png" width="550" /></a></p>

<p>好多了，但是表格歪掉看起來還是很討厭。</p>

<p>其實表格歪掉是由於hirb無法正確計算全型字元的寬度。於是我就包了<a href="https://github.com/gaagaaga/hirb-unicode">hirb-unicode</a>這個plugin，以解決這個問題。使用hirb-unicode後：</p>

<p><a href="http://miaout17.github.com/hirb-unicode/hirb-unicode.png"> <img src="http://miaout17.github.com/hirb-unicode/hirb-unicode.png" width="550" /></a></p>

<h3>安裝hirb-unicode</h3>

<p>在shell下執行：</p>

<pre><code>$ gem i hirb-unicode
</code></pre>

<h3>使用hirb-unicode</h3>

<p>如果是在irb中使用</p>

<pre><code>gem 'hirb-unicode'
require 'hirb-unicode'
</code></pre>

<p>即可自動載入hirb及hirb-unicode，並自動修正unicode排列的問題。</p>

<p>若在bundler的環境下使用（如Rails 3），請在Gemfile中加入</p>

<pre><code>gem 'hirb-unicode'
</code></pre>

<p>以便載入gem。（或者用RichRC載入也可以喔）</p>

<p>然後在可以在.irbrc中或直接在irb進行require的動作：</p>

<pre><code>require 'hirb-unicode'
</code></pre>

<h3>Misc</h3>

<p>其實hirb-unicode的源碼不到30行，利用<a href="https://github.com/janlelis/unicode-display_width">unicode-display_width</a> gem計算長度，再包裝一下切字串的method，其實一下就做完了。原本是想簡單的上個patch到hirb，但作者希望不要增加hirb的dependency，想要將這個功能包成另外的plugin，於是花了很多天往返討論。</p>

<p>Anyway，終於把這個功能包出去了。Happy coding!!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[RichRC: 在Rails3 console中輕鬆使用hirb及wirble的懶人包]]></title>
    <link href="http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/"/>
    <updated>2011-02-13T18:05:59+08:00</updated>
    <id>http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble</id>
    <content type="html"><![CDATA[<p>開發rails應用時，或多或少會需要在console下進行一些操作。但內建的console其實功能有限，於是就有人寫了一些gems來擴充的irb功能。如<a href="https://github.com/cldwalker/hirb">hirb</a>可以將資料表格化，而<a href="http://pablotron.org/software/wirble/">wirble</a>提供了著色、自動完成等功能。</p>

<p><a href="http://blog.miaout17.net/wp-content/uploads/2011/02/Screenshot-31.png"><img src="http://blog.miaout17.net/wp-content/uploads/2011/02/Screenshot-31.png" alt="" title="Screenshot-3" width="578" height="207" class="alignnone size-full wp-image-191" /></a></p>

<p>在rails 2中，要使用這些gems提供的擴充功能，只要簡單地在irb下載入gems就可以了。但rails 3使用了<a href="http://gembundler.com/">bundler</a>管理gems，必需在Gemfile中先加入要使用的gems才可以使用。但修改Gemfile會造成一些問題：這些gems的設定該commit回版本控制系統嗎？我認為不應該，每位開發者可能有自己的偏好設定。另外，使用者可能是clone其他開發源碼的專案，而無法commit東西回去。然而，當有其他人修改Gemfile時，可能會造成conflict需要處理。</p>

<p>對於這個問題，感謝<a href="http://blog.xdite.net/?p=1839">xdite的文章「在 Rails3 上使用漂亮的 console」</a>，指出了可以在bundler.setup執行前搶先載入額外的gems，避過修改Gemfile的問題。文中的做法每要在一個rails app中執行console時，需要修改development.rb, boot.rb, console/rails其中兩個檔案，還是要費些工夫。對於常常clone project下來survey的人來說，這點可能尤其麻煩。</p>

<p>有沒有可能避過這些修改檔案的問題呢？「懶惰的工程師需要勤奮的發明工具」，為了懶得每次修改檔案，我動手寫了一個客製化Rails 3 console的工具：<a href="https://github.com/miaout17/richrc">RichRC</a>。</p>

<h3>安裝</h3>


<p>在shell下輸入：</p>

<pre lang="bash" line="1">
$ gem install richrc hirb wirble
</pre>


<p>P.S. 雖然RichRC預設載入hirb及wirble，但RichRC其實不相依於hirb及wirble這兩個gems。請參看「客製化」一節。</p>

<h3>執行</h3>




<pre lang="bash" line="1">
$ cd railsapp
$ richrc
</pre>


<p>就這樣，不用修改任何檔案，只要將rails console的指令改為richrc即可。richrc預設會執行下列動作：</p>

<ul>
    <li>載入並啟動wirble</li>
    <li>載入並啟動hirb</li>
    <li>設定ActiveRecord的log顯示於console中</li>
</ul>


<p>不用修改任何檔案，三個願望一次滿足。</p>

<h3>客製化</h3>


<p>雖然本文的標題為「RichRC: 在Rails3中輕鬆使用hirb及wirble的懶人包」，但RichRC其實可以任意客製化Rails 3 console載入時額外運行的程式。</p>

<p>RichRC的原理，其實是在「bundler.setup執行前」及「application載入後」執行特定的程式碼。RichRC會讀取一個設定檔，再依設定檔中的邏輯執行初始化的動作。RichRC啟動時，會試圖依下列順序載入設定檔：</p>

<ol>
    <li>當前目錄下的.richrc</li>
    <li>使用者家目錄下的.richrc</li>
    <li>gem中的預設設定</li>
</ol>


<p>目前gem中的預設設定就如上一節所述：載入hirb及wirble，並設定ActiveRecord的logger。要執行客製化，可以在在console下執行：</p>

<pre lang="bash" line="1">
$ richrc customize
</pre>


<p>即可將預設的設定檔複置到./.richrc。接下來就可以修改並加入您想要的gems及設定，前文中有提到，RichRC並不相依於hirb及wirble，如果你不想要這些gems的話，可以將它們拿掉。以下是預設的.richrc：</p>

<div>
  <pre><code class='ruby'>before(:setup_bundler) do
  # You can load extra gems here.
  require 'irb'

  begin
    gem 'wirble'
    require 'wirble'
    Wirble.init
    Wirble.colorize
  rescue LoadError
    puts &quot;Failed to load wirble&quot;
  end

  begin
    gem 'hirb'
    require 'hirb'
    Hirb.enable
  rescue LoadError
    puts &quot;Failed to load hirb&quot;
  end
end

after(:load_application) do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end</code></pre>
</div>


<p>注意：只有在before(:setup_bundler)中，才可以載入額外的gems。另外，在after(:load_application)後，rails的環境才被載入完成，才可以去設定ActiveRecord的logger（您亦可在此對rails其他元件做設定）。</p>

<h3>備註</h3>


<p>注意：在.richrc引入與Gemfile中的gems（及他們所相依的gems）衝突的話，可能會造成問題。</p>

<p>RichRC以MIT License開放源碼，<a href="https://github.com/miaout17/richrc">源碼位於github</a>，有問題歡迎回報。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ruby Tuesday #16: Learning Ruby with RubyWarrior]]></title>
    <link href="http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior/"/>
    <updated>2011-01-26T01:54:00+08:00</updated>
    <id>http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior</id>
    <content type="html"><![CDATA[<p>我在<a href="http://registrano.com/events/ruby-tuesday-16">Ruby Tuesday #16</a>分享的投影片已經上線。<br /><br /><div style="width:425px" id="__ss_6705121"><object id="__sse6705121" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=warrior-tuesday-110125194927-phpapp02&amp;stripped_title=learning-ruby-with-rubywarrior&amp;userName=miaout17"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed name="__sse6705121" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=warrior-tuesday-110125194927-phpapp02&amp;stripped_title=learning-ruby-with-rubywarrior&amp;userName=miaout17" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div><script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;c2=7400849&amp;c3=1&amp;c4=&amp;c5=&amp;c6="></script><br /><br />所有相關的範例源碼都放在github上：<a href="https://github.com/gaagaaga/warrior-tuesday">https://github.com/gaagaaga/warrior-tuesday</a><br /><br />祝武運昌隆 XD</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails3, Mongoid, Devise, Heroku, MongoHQ筆記]]></title>
    <link href="http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq/"/>
    <updated>2010-10-26T10:45:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq</id>
    <content type="html"><![CDATA[<p>最近在看一些NoSQL的東西，於是想以<a href="http://www.mongodb.org/">MongoDB</a>進行一些實作的練習。這篇文章是我在練習過程中，環境設定的筆記。</p>

<h3>Installing Rails 3</h3>


<p>請看我的<a href="http://gaagaaga.blogspot.com/2010/10/rails-3.html">上一篇文章</a></p>

<h3>Installing MongoDB</h3>


<p>我的開發環境是Ubuntu和Windows（在家用Ubuntu、出外用Windows，所以試了兩個環境）。Linux的話，個人建議不要用package system(apt/yum)的MongoDB。首先，絕對不要apt-get install mongodb。我一開始練習MongoDB時，是用apt-get裝的，會抓到一個舊到爆炸(1.4.4)的stable版本，這個版本mongo console client打錯指令還會crash（這是stable版嗎？）。</p>

<p>如果一定要用package的話可以考慮apt-get install mongodb-unstable或apt-get install mongodb-snapshot。但我是直接去官網抓build好的版本，再sudo copy到/usr/bin就好了。</p>

<h3>MongoDB Object Mapper: Mongoid</h3>


<p> Mongo的Ruby Object Mapper有很多種，可以參考官<a href="http://www.mongodb.org/display/DOCS/Object+Mappers+for+Ruby+and+MongoDB">網上的列表</a>。我選用Mongoid的原因有二：</p>

<ul>
    <li>Mongoid的官網做的還滿有模有樣的，看樣子應該有認真維護 XD</li>
    <li>Devise認證機制內建支援Mongoid</li>
</ul>


<p>安裝照著官方installation文件做就好了：</p>

<pre lang="bash" line="1">
  gem i mongoid –pre
  gem i bson_ext
</pre>


<p>如果是Windows系統的話，mongo gem需要build一些native code，所以推薦裝<a href="https://github.com/oneclick/rubyinstaller/wiki/Development-Kit">RubyDevKit</a>，裝完就可以順利的安裝mongo相關gems。</p>

<p>Mongoid使用上非常的簡單，Mongoid蓋掉了ActiveRecord的generators。要快速建出一個能動的環境，在設定好gems後只需要：</p>

<pre lang="bash" line="1">
  rails g mongoid:config
  rails g scaffold article title:string content:string
</pre>


<p>只要mongod開著，這樣就可以動了，不用做data migration。唯一會踩到的雷可能是用了舊版的mongodb，所以就如前面提到的，請不要apt-get install。</p>

<h3>Authentication: Devise</h3>


<p>Devise是一套不錯的rails認證機制，而且內建對Mongoid的支援
一樣照著官方文件做就能動，整合非常簡單。安裝：</p>

<pre lang="bash" line="1">
  gem i devise
</pre>


<p>整合進app：</p>

<pre lang="bash" line="1">
  rails generate devise:install
  rails generate devise User
</pre>


<p>接下來只要在view裡把link接一接就好。如果原本就用過devise，基本上用ActiveRecord或Mongoid沒啥差別。要速查link path helpers的話可以用rake routes。</p>

<p>唯一要注意的地方是要記得自己打index，我原本以為Model中的</p>

<pre lang="ruby" line="1">
  devise :database_authenticatable, :registerable #……
</pre>


<p>這行，會自動在Mongoid Model上加上index。但rake db:mobgoid:create_indexes後，User collection上還是沒有任何index，所以要自己在Model上加：</p>

<pre lang="ruby" line="1">
  index :email, :unique => true
</pre>


<p>然後再執行一次rake db:mongoid:create_indexes，把index打上去。</p>

<p>另外，有人做了Rails3+Mongoid+Devise的整合包。但Devise和Mongoid的整合實在太簡單了，不彷自己做一遍，也比較容易了解細節。</p>

<h3>Deployment Environment: Heroku & MongoHQ</h3>


<p>Heroku是一個雲端的Rails Hosting Platform，其使用方式應該很多文章介紹過了，這裡就不多廢話。基本上注冊好heroku帳號後，在rails app路徑下：</p>

<pre lang="bash" line="1">
  heroku create appname
  git push heroku master
</pre>


<p>就可以把app deploy上去。</p>

<p>MongoHQ是一個雲端的MongoDB Hosting服務，提供了免費(16MB Limit)及付費的MongoDB空間。由於Heroku與MongoHQ有合作，並將MongoHQ做成了Heroku的一個addon，所以整合特別簡單。這裡是官方文件，只要下一行指令：</p>

<pre lang="bash" line="1">
  heroku addons:add mongohq:free
</pre>


<p>heroku就會自動向MongoHQ註冊一個資料庫，並設定rails的環境變數。注意官方文件有個地方沒講的很清楚，在config/mongoid.yml中，多加上mongohq的設定：</p>

<pre lang="yaml" line="1">
  production: 
    uri: <%= ENV['MONGOHQ_URL'] %>
</pre>


<p>設定好後，MongoID就可以吃到MongoHQ的環境變數，並正確地建立資料庫連線。</p>

<p>順便列一下Heroku合作的資料庫中，免費方案的比較：</p>

<ul>
<li>Heroku內建Database: 5MB (Postgre SQL)</li>
<li>Redis To Go: 5MB (Redis)</li>
<li>MongoHQ: 16MB (MongoDB)</li>
<li>Cloudant: 100MB, 500k requrest per month (CouchDB)</li>
</ul>


<p>開發筆記待續…</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[再度考慮搬家]]></title>
    <link href="http://blog.miaout17.net/2010/10/04/move-blog/"/>
    <updated>2010-10-04T04:56:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/10/04/move-blog</id>
    <content type="html"><![CDATA[<p>最近應該比較有閒寫心得了，又開始考慮搬Blog的可能性。其實<a href="http://gaagaaga.blogspot.com/2009/07/murmuring.html">一年前就murmur過這件事了</a>。如果要搬的話，應該就是搬到自己架的Wordpress吧。主要的原因還是這些：<div><ul><li>貼code：Bloggger貼code縮排好像還是有機會跑掉。我真的不喜歡一天倒晚embed gist，然後python&amp;haskell縮排跑掉真的很杯具。另外是Wordpress有儲存文章revision的功能，code不小心貼爛還可以回退，而Blogger就沒招了，只能從原本的code從貼一次。</li><li>貼數學式：雖然有好幾個方法可以在Blogger上貼數學式（先自己用tex轉圖、用Google Graph API&#8230;），可是我都嫌不太方便。我還是較喜歡直接在文章中打類似tex的控製碼。<a href="http://wordpress.org/extend/plugins/wp-latex/">Wordpress有一些plugin</a>可以做到這一點。<a href="http://www.w3.org/Math/">MathML</a>是一個理想的解法，但目前只有Firefox有較完整的支援，而在Chrome慘不忍睹。</li></ul><div>有人有什麼好建議嗎？</div></div></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[OpenFoundry疑似烏龍事件？]]></title>
    <link href="http://blog.miaout17.net/2010/09/19/openfoundry-wtf/"/>
    <updated>2010-09-19T08:47:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/09/19/openfoundry-wtf</id>
    <content type="html"><![CDATA[<p>今天無意間發現中研院OpenFoundry有一篇文章，作者名稱是我的「本名」，但該篇文章並不是我發的。事實上，我的姓氏及名字都不是很常見，google一下大概我的本名，大概可以猜測台灣地區華人並沒有與我同名同姓的人。<br /><br />中午才看完「<a href="http://phyllischan.blogspot.com/2010/09/blog-post_17.html">盜圖者，剛剛賠了我十一萬</a>」這篇文章，遇到這個狀況真怕有人誤會我盜文。為求自我保護，我立即去信OpenFoundry反應此事，在此公佈我的信件內容。因為該文上還有我的個人資料，故涉及該文及我的個資的部份，我會消音處理：<br /><blockquote>您好：<br /><br />今天在瀏覽OpenFoundry網站時<br />無意間發現了一篇文章：「<span class="Apple-style-span"  style="color:#FF0000;">AAAAAAA</span>」<br />(該文網址: <span class="Apple-style-span"  style="color:#FF0000;">OOOOOOOOOOOO</span> )<br />作者姓名竟然與我的名字相同，但本人並未在貴站發表該篇文章。<br /><br />原懷疑為同名同姓，但本人姓名相當罕見<br />資訊領域有人與我同名同姓的機率應相當低。<br />另外，以該文標題至Google搜尋<br />竟然發現<span class="Apple-style-span" style="color: rgb(255, 0, 0); ">BBBBBB</span>索引網站收錄該文時，附帶著我的真實姓名及E-Mail<br />(目前在此網址可以看到：<span class="Apple-style-span"  style="color:#FF0000;">OOOOOOOOOOO</span> )<br /><br />因此，本人懷疑此次事件為OpenFoundry網站問題，造成我的個人資料外洩<br />若真的是這樣的問題，我想要麻煩貴站站方做以下處理：<br />1.將我的名字從該篇文章中刪除<br />2.聯絡<span class="Apple-style-span"  style="color:#FF0000;">BBBBBB</span>站方，將我被索引的個資刪除<br />3.釐清並解釋問題發生的原因，避免此問題再度發生<br /><br />為避免有人懷疑我抄襲原作者的文章<br />基於自我保護，我會立即將本信部份內容公開於本人Blog上<br /><br />期盼站方盡速處理此事<br /><br />Best Regards,<br /><span class="Apple-style-span"  style="color:#FF0000;">XXX</span><br /></blockquote></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blogtrans更新]]></title>
    <link href="http://blog.miaout17.net/2010/08/15/blogtrans-update/"/>
    <updated>2010-08-15T08:56:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/08/15/blogtrans-update</id>
    <content type="html"><![CDATA[<p>剛剛突然想到，之前Blogtrans有改一些code，但一直沒放出來。看了一下git log&#8230;.2009/05/26(汗)。<br /><br />順手打包了一下，上傳到sourceforce，雖然code是一年多前寫的(汗)<br /><br /><em> 增加Blogger匯入功能<br /></em> 處理一些無名XML不是well-form的狀態，或者是出現UTF-8不合法的字元<br />* 增加UnitTest，順便修正了一些minor problem&#8230;.<br /><br />新版的程式一樣可以<a href="https://sourceforge.net/projects/blogtrans/files/">在Sourceforce抓到</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[FLOLAC]心中有Monad，萬物皆Monad]]></title>
    <link href="http://blog.miaout17.net/2010/07/02/everything-is-monad/"/>
    <updated>2010-07-02T15:14:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/07/02/everything-is-monad</id>
    <content type="html"><![CDATA[<p>1.打完之後才突然發現&#8230;.我原本只是想打個輕鬆的心得文，怎麼搞的那麼嚴肅 Orz<br /><br />2.竟然遇到小我X(消音)屆的高中+大學學弟，嚇然發現自己變老人了<br /><br />3.我給了幾個人聯絡方式，可是後來才想到我沒拿任何人的聯絡方式。如果有同學看到歡迎回個文。<br /><br />正文開始 Orz<br /><hr /><br /><br />星期二時，scm老師談到「今年FLOLAC中，Functional Programming的課比較少，選用的是OCaml而不是Haskell，不會討論Monad之類的東西」。有趣的是，我覺得「就Operation Semantics的角度，來討論imperative program的derivation」，這件事本身就有濃厚的FP味道存在。<br /><br />首先，從最基本的&lt;s1, s&gt;-&gt;s&#8217;談起：給予一個statement S1及初始狀態s，會得到最終狀態s&#8217;。對於deterministic semantics，&lt;s1, s&gt;-&gt;s&#8217; and &lt;s1, s&gt;-&gt;s&#8221; imply s&#8217;=s&#8221;。換句話說，如果將S1視為一個routine，給予相同的input，會得到相同的output，這不就是pure function的定義嗎？另外就像<a href="http://joshkos.blogspot.com/2009/05/on-states.html">Josh Ko談過的</a>：與其說FP沒有side-effect，不如說FP沒有implicit state。然而&lt;s1, s&gt;-&gt;s&#8217;這樣的表達法，也讓imperative language中的所有狀態變化被攤開來，使其在某些方面可以像FP一樣地分析。<br /><br />接下來，舉出老師在課堂上給的兩個quiz：<br /><br /><em> 原本derivation只做到statement的層次。如果要將arithmetic expression做derivation，其型別應該是什麼？(Ex. x = y + 5; )<br /></em> 如果語言中出現「具有side effect的arithmetic expression」，其derivation的型別是什麼？ (Ex. x = ++y; )<br /><br />假設算數運算的值域為整數，其中第一個應為&lt;AExp, State&gt; -&gt; int。第二個應為&lt;AExp, State&gt; -&gt;(int, State)。這個答案其實很直觀：前者只要求值，後者求值順便變更狀態。這不是跟<a href="http://cvs.haskell.org/Hugs/pages/libraries/mtl/Control-Monad-State.html">State Monad</a>中的一些型別很像嗎？<br /><ul><li>語意為「修改狀態不求值」<br />&lt;Statement, State&gt;-&gt;State<br />execState :: State s a -&gt; s -&gt; s</li><li>語意為「不改狀態只求值」<br />&lt;AExp, State&gt; -&gt; int<br />evalState :: State s a -&gt; s -&gt; a</li><li>語意為「又改狀態又求值」<br />&lt;AExp, State&gt; -&gt;(int, State)<br />runState :: State s a -&gt; s -&gt; (a, s)</li></ul><br />State Monad是pure functional language中可以模擬imperative language的關鍵，而Operational Semantics又以接近pure functional的方式去分析imperative language（在不涉及parallel與nondeterministic的情況下）。上OP的課時，我反而在心中印證了對於FP的認知。<br /><hr /></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[2010-06 久違的Blog更新]]></title>
    <link href="http://blog.miaout17.net/2010/06/06/2010-06-long-time-no-update-xd/"/>
    <updated>2010-06-06T02:54:00+08:00</updated>
    <id>http://blog.miaout17.net/2010/06/06/2010-06-long-time-no-update-xd</id>
    <content type="html"><![CDATA[<p>十個月沒更新文章了，把最近的事摻在一起記一記：<br /><ul><li>「大鳥共和國」改名為「大貓共和國」(Kero?)</li><li>看了龍紋身的女孩（？）</li><li>參加了<a href="http://code.google.com/codejam">Google Code Jam 2010</a>的比賽，在Round 2（3000名取前500名）被刷掉了</li><li>今年終於跟公司請了十天的假，去參<a href="http://www.iis.sinica.edu.tw/~scm/ncs/2010/04/flolac-2010/">FLOLAC 2010</a>的課程</li></ul><div><hr /></div><div>看完了龍紋身的女孩三部曲，讓我熱血（？）的研究了一陣子破解技術</div><div>雖然目前還只是基礎Wargame都可能卡關的肉腳程度啦</div><div><br /></div><div>我大概還滿嚮往「在資訊領域中極度自由」的感覺的</div><div>不管是「在Open Source的世界中，想要什麼都可以自己來」</div><div>或是「在資訊安全的領域中，如入無人之境」</div><div><br /></div><div>不過這種「想要什麼，信手拈來」的自由，先決條件是在該領域各方面都很強吧&#8230;</div><div><hr /></div><div>GCJ打到前3000名不是什麼太好看的成積</div>沒啥好說的，就是基礎功不夠強吧&#8230;<div><br />一直以來我都用這樣的理由說服自己<br />「對於這方面競賽的能力不夠強，<div>　只是我沒針對Online Judge比賽需要的能力（演算法、解題速度等）做特訓，<br />　而把學習重心放在程式語言、API設計等等，需要架構高階複雜邏輯的地方」</div><div><br /></div><div>其實這根本是藉口藉口藉口藉口藉口</div><div>在比賽中，基本功的不足之處，會一一無所遁形的暴露出來</div><div>演算法、離散數學、機率統計（這個比較少，但寫練習時有一題是要用機率的）</div><div>甚至資料結構的規劃也有問題，有時code寫到一半才發現結構redundant &amp; stupid</div><div><br /></div><div>從大學、研究所、工作，常常聽到</div><div>「這些東西還好啦，除非你從事演算法或學術相關工作，否則用不太到」這樣的說詞</div><div>真的是這樣嗎？我想不是的</div><div>這些基本功的強度會直接影響思考邏輯、工作速度、程式碼品質</div><div><br /></div><div>依我前陣的子的個性，可能是不會把這段寫出來的</div><div>（因為過個一兩年，回頭看自己的文章時會覺得「啊啊啊，當時的自己又弱又愛胡說八道」）</div><div>但依我懶惰的個性，搞不好過一陣子就忘了這件事，一年後還是沒有針對基本功做加強</div><div>寫下來給自己當的目標吧，目標GCJ 2011前25名，加油！</div><div><br /></div><div><hr /></div><div>最後，關於FLOLAC 2010</div><div>自我一兩年前對Functional Programming産生興趣起，就一直對這個課程有興趣</div><div>今年終於向公司請假去參加了，大概也會遇到一些收看此Blog的網友吧 :)</div><div><br /></div></div></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[用git管理具有external的svn repository]]></title>
    <link href="http://blog.miaout17.net/2009/08/20/manage-svn-repository-with-git/"/>
    <updated>2009-08-20T17:47:00+08:00</updated>
    <id>http://blog.miaout17.net/2009/08/20/manage-svn-repository-with-git</id>
    <content type="html"><![CDATA[<p>睡不著爬起來寫blog，明天要早起的說 Orz<br /><br /><hr /><br />git是一套目前非常流行的分散式版本控制系統<br />相信很多人和我一樣，熟析git後就不會想用svn或cvs來管理源碼<br /><br />我最近碰到這樣的問題：<br />專案主要使用svn做版本控制，但是我個人想用git管理<br />大家第一個想到的應該是git-svn<br />但git-svn對於svn external的支援並不完善<br /><br />然而我目前的專案大量的使用了svn:external<br /><br />src/<br />src/A => external to another project<br />src/B => external to another project<br />src/C => external to another project<br /><br />更糟的是，因為專案開發時間的因素<br />A,B,C專案與主專案是共同開發的<br />有的時候我必需修改external library的API，並commit回去<br />有時其他人修改了external library，主專案必需跟著修改<br />(I know it doesn&#8217;t sound good, but it&#8217;s real world problem&#8230;)<br /><br />我試過不管是單純的使用git-svn，或者借助一些shell script<br />都無法順利的處理這個工作流程<br /><br />直到今天我想到一個實在是很瞎的方法：<br /><br />mkdir gitrepo<br />cd gitrepo<br />git init<br />svn checkout svn://my-svn-repo-addr svnrepo<br />echo .svn > .gitignore<br />git add .<br />git commit<br />git chekcout -b svn-tracker<br /><br />白話解釋一下：<br />在gitrepo/ 開一個git repository<br />在gitrepo/svnrepo 開一個svn repository<br />把.svn ignore掉 =.=<br />做一個名為svn-tracker的branch<br /><br />這個看來愚蠢的方法 (對我目前的環境) 出手意料的好用<br />在改code時我都切換到其他branch (並且忘了svn的存在)<br />做任何svn操作時，我先切回svn-tracker branch<br /><br />要做svn update的話就是<br />svn update<br />git add .<br />git commit -a<br /><br />要commit自己的東西回svn mainstream就是<br />git merge work-branch<br />svn add *<br />svn commit<br /><br />當然這些事可以寫shell script來完成<br /><br /><hr /><br />目前最大的缺點大概是沒法將git branch對應到svn branch (很麻煩)<br />不過還好我沒有很在乎&#8230;.反正mainstream svn上沒有人在用branch &amp; tag 功能，大家都只改trunk<br /><br /><hr /><br />這樣做還得到了意外的好處：<br />當要回退到舊版本時，如果沒有特別指定external的revision<br />就算update trunk to older revision，external還是會是最新版的<br />這樣會造成舊trunk + 新external，版本不相容的問題 (如果external行為或API有變)<br /><br />上面的流程，每跑一次svn update<br />就等於把當時的情況做一次snapshot存進git<br />之後也就可以正確地回退版本&#8230;.</p>
]]></content>
  </entry>
  
</feed>
