<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://blog.bs2.to/styles/rss.css" type="text/css"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <channel>
  <title>LGJ Notes</title>
  <link>http://blog.bs2.to/EdwardLee</link>
  <description>蒙古大夫 2.0。
這裡紀錄的都不是我的專業，我的專業就是不專業。別傻了，什麼是專業？</description>
  <pubDate>Thu, 18 Mar 2010 18:56:34 +0800</pubDate>
  <generator>http://blog.bs2.to</generator>
        <item>
   <title>Ruby free ebook：The Book Of Ruby</title>
   <description>
    `&lt;a href=&quot;http://www.sapphiresteel.com/The-Little-Book-Of-Ruby&quot;&gt;The Little Book Of Ruby&lt;/a&gt;&#039; 的作者 Huw Collingbourne 又一力作：`The Book Of Ruby&#039;。將會在這幾個月內完成，每完成一章就會放到網頁上供下載（PDF 格式）：&lt;p&gt;

&lt;a href=&quot;http://www.sapphiresteel.com/The-Book-Of-Ruby&quot;&gt;http://www.sapphiresteel.com/The-Book-Of-Ruby&lt;/a&gt;&lt;p&gt;

原來的 Little book 為 10 章 87 頁，這次已經增至 20 章，400 多頁，請不要錯過。&lt;p&gt;&lt;br/&gt;&lt;br /&gt;&lt;p&gt;
關於本文的討論區：&lt;br /&gt;
&lt;a href=&quot;http://hyperrate.com/topic-view-thread.php?tid=5157&quot;&gt;http://hyperrate.com/topic-view-thread.php?tid=5157&lt;/a&gt;
   </description>
   <link>http://blog.bs2.to/post/EdwardLee/13226</link>
   <comments>http://blog.bs2.to/post/EdwardLee/13226</comments>
   <guid>http://blog.bs2.to/post/EdwardLee/13226</guid>
      <dc:creator>EdwardLee</dc:creator>
      
    <category>Ruby 物語</category>
         <pubDate>Fri, 06 Jun 2008 19:11:01 +0800</pubDate>
   <source url="http://blog.bs2.to/rss/rss20/EdwardLee">LGJ Notes</source>
     </item>
          <item>
   <title>inject</title>
   <description>
    &lt;a href=&quot;http://en.wikipedia.org/wiki/Smalltalk&quot;&gt;Smalltalk&lt;/a&gt;
語言有一個 inject 功能，現在
Ruby 也移過來了。&lt;p&gt;&lt;br/&gt;在 &lt;tt&gt;ri Enumerable#inject&lt;/tt&gt; 裡頭的解釋是這樣的：
&lt;pre&gt;
------------------------------------------------- Enumerable#inject        
enum.inject(initial) {| memo, obj | block }  =&amp;gt; obj
enum.inject          {| memo, obj | block }  =&amp;gt; obj
-------------------------------------------------------------------
Combines the elements of _enum_ by applying the block to an
accumulator value (_memo_) and each element in turn. At each step,
_memo_ is set to the value returned by the block. The first form
lets you supply an initial value for _memo_. The second form uses
the first element of the collection as a the initial value (and
skips that element while iterating).
&lt;/pre&gt;
嗯，好像不知道他在說什麼，看一下裡頭的例子：
&lt;pre&gt;
# Sum some numbers
(5..10).inject {|sum, n| sum + n }              #=&amp;gt; 45
# Multiply some numbers
(5..10).inject(1) {|product, n| product * n }   #=&amp;gt; 151200

# find the longest word
longest = %w{ cat sheep bear }.inject do |memo,word|
   memo.length &amp;gt; word.length ? memo : word
end
longest                                         #=&amp;gt; &quot;sheep&quot;

# find the length of the longest word
longest = %w{ cat sheep bear }.inject(0) do |memo,word|
    memo &amp;gt;= word.length ? memo : word.length
end
longest                                         #=&amp;gt; 5
&lt;/pre&gt;
那麼有點懂了。問題是這個 method 是要用在什麼地方的呢？除了累加及階層運算，難不成是去找陣列中最長的那一個元素？這使用 &lt;tt&gt;max&lt;/tt&gt; 不就好了？
&lt;pre&gt;
ongest = %w{ cat sheep bear }
puts ongest.max
&lt;/pre&gt;
我嘗試將 &lt;tt&gt;ri&lt;/tt&gt; 裡頭的說明義譯成中文：
&lt;pre&gt;
當開始時 memo 會被設定為 initial 的值，obj 會被設定為 enum 中的
第一個值，initial 沒被指定，預設初值是第一個元素，此時此一元素並
不加入 iterate。然後，block 處理（例如加總或乘積）後的值變為二輪
的 memo 值，第二輪的 obj 值則是 enum 中的第二個值（無 initial 時
是第三個值），一直到 enum 的最後一個值為止。
&lt;/pre&gt;
不知道是愈譯愈迷糊，還是有一點清楚了？:-D &lt;p&gt;

這其實也可以應用在要將某陣列的每個元素，加上一個固定的東西，例如：
&lt;pre&gt;
name = %w{貴妃 珍妃 珠妃}.inject([]) do |f, m|
    f  ＜＜ &quot;#{m} 來了！&quot;
end
puts name
&lt;/pre&gt;
他執行後的結果將會是：
&lt;pre&gt;
edt1023:~/MyPro/ruby$ ./inject-1.rb 
貴妃 來了！
珍妃 來了！
珠妃 來了！
&lt;/pre&gt;
還有其他妙用嗎？


&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;p&gt;
【註】程式碼中的小於符號是全型的（目前這裡無法在 pre 中使用半型小於符號，請勿直接 copy&amp;amp;paste，否則執行會錯誤。
   </description>
   <link>http://blog.bs2.to/post/EdwardLee/5473</link>
   <comments>http://blog.bs2.to/post/EdwardLee/5473</comments>
   <guid>http://blog.bs2.to/post/EdwardLee/5473</guid>
      <dc:creator>EdwardLee</dc:creator>
      
    <category>Ruby 物語</category>
         <pubDate>Sat, 10 Jun 2006 11:18:36 +0800</pubDate>
   <source url="http://blog.bs2.to/rss/rss20/EdwardLee">LGJ Notes</source>
     </item>
          <item>
   <title>Ruby 開檔</title>
   <description>
    &lt;a href=&quot;http://www.ruby-lang.org/en/&quot;&gt;Ruby&lt;/a&gt;
有許多地方很像
&lt;a href=&quot;http://www.perl.com/&quot;&gt;Perl&lt;/a&gt;，其中之一便是
TMTOWTDI（There&#039;s More Than One Way To Do It.）。我們就來看在 Ruby 中如何開檔。&lt;p&gt;&lt;br/&gt;為了讓問題簡單化，我們開檔的目的就限定在把檔案中的內容像 cat 指令一樣的一行一行的給 print 出來。這裡的檔案我們假設是 &lt;tt&gt;bg5.txt&lt;/tt&gt;，內容就隨意一個純文字檔，因為這不是我們的重點。&lt;p&gt;

第一個方法，直接就用 &lt;tt&gt;open()&lt;/tt&gt;：
&lt;pre&gt;f = open(&quot;bg5.txt&quot;)
f.each do |ln|
  puts ln
end
f.close
&lt;/pre&gt;

開檔通常是要指定這個檔案是要拿來做讀或寫，如果我們不指定，那就是只能讀（&lt;tt&gt;&#039;r&#039;&lt;/tt&gt;），不能寫（請注意，這種情況下，如果 &lt;tt&gt;bg5.txt&lt;/tt&gt; 這個檔案不存在，會出現錯誤）。&lt;p&gt;

同樣使用 &lt;tt&gt;open()&lt;/tt&gt;，我們來看另一種方式：
&lt;pre&gt;open(&quot;bg5.txt&quot;) do |l|
  l.each do |e|
    puts e
  end
end
&lt;/pre&gt;
不一樣的地方是，無需 &lt;tt&gt;close&lt;/tt&gt; 檔案，&lt;tt&gt;open()&lt;/tt&gt; 後如果是接 block 來使用，那麼，這個 block 結束時也會順便關檔。&lt;p&gt;

不過，開檔後又還有一串的 block 碼，好像有點麻煩，我們來看更簡單的方式：
&lt;pre&gt;open(&quot;bg5.txt&quot;) do |f|
  puts *f
end
&lt;/pre&gt;

&lt;tt&gt;open()&lt;/tt&gt; 傳回 File 物件，我們當然無法直接給印出來，但有一個簡單的方法，就是 &lt;tt&gt;*f&lt;/tt&gt;，這是指 File 裡頭的每一行所形成的陣列，這樣就可以印出來了（puts 會自動把陣列中的元素轉為字串型態來印出）。當然，這裡的 &lt;tt&gt;*f&lt;/tt&gt; 和 &lt;tt&gt;f.to_a&lt;/tt&gt; 的意思就一樣了，就是把他轉成陣列（Array）。&lt;p&gt;

還有嗎？當然有啦！直接使用 &lt;tt&gt;IO.foreach()&lt;/tt&gt;：
&lt;pre&gt;IO.foreach(&quot;bg5.txt&quot;) do |l|
  puts l
end
&lt;/pre&gt;

或者 &lt;tt&gt;IO.readlines()&lt;/tt&gt; 亦可：
&lt;pre&gt;puts IO.readlines(&quot;bg5.txt&quot;)&lt;/pre&gt;

一行就解決了。好玩吧！:-)&lt;p&gt;

不過，以上都要寫成 script 檔案，存檔後修改成可執行檔權限，才可以去執行他。那麼我們是否可以使用一些 script 語言強大的「一行文」指令呢？請看：
&lt;pre&gt;
ruby -e &#039;puts IO.readlines(&quot;bg5.txt&quot;)&#039;
&lt;/pre&gt;
這樣就成了，喜歡一行文的朋友，別錯過了！&lt;p&gt;

但以上是固定一個特定的檔案，如果我們只是想像 cat 一樣把檔案內容 print 出來，又不想是固定在一個特定的檔案，以便彈性更大的話呢？請看：
&lt;pre&gt;
ruby -e &#039;puts *ARGF&#039; bg5.txt
&lt;/pre&gt;

後面接的 &lt;tt&gt;bg5.txt&lt;/tt&gt;，換成任何一個純文字檔都可以，這裡的 &lt;tt&gt;ARGF&lt;/tt&gt; 是 Ruby 裡頭的一個特殊物件，他代表參數列所讀入的檔案的每一行，也可以使用特殊的符號 $＜ 來代表。所以，可以寫成：&lt;br /&gt;
&lt;pre&gt;ruby -e &#039;puts *$＜&#039;  bg5.txt&lt;/pre&gt;

這就更簡單了！還有嗎？別忘了 TMTOWTDI，當然是還有，例如 &lt;tt&gt;File.new()&lt;/tt&gt; 的方式，使用 pipe 的方式……等等，請各位自由發揮吧！



&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;p&gt;
【註】程式碼中的小於符號是全型的（目前這裡無法在 pre 中使用半型小於符號，請勿直接 copy&amp;amp;paste，否則執行會錯誤。
   </description>
   <link>http://blog.bs2.to/post/EdwardLee/5461</link>
   <comments>http://blog.bs2.to/post/EdwardLee/5461</comments>
   <guid>http://blog.bs2.to/post/EdwardLee/5461</guid>
      <dc:creator>EdwardLee</dc:creator>
      
    <category>Ruby 物語</category>
         <pubDate>Wed, 07 Jun 2006 20:01:29 +0800</pubDate>
   <source url="http://blog.bs2.to/rss/rss20/EdwardLee">LGJ Notes</source>
     </item>
          <item>
   <title>找尋字碼</title>
   <description>
    在&lt;a href=&quot;http://blog.bs2.to/post/EdwardLee/5112&quot;&gt;〈Unicode 中文部首起始碼位〉&lt;/a&gt;一文中，曾經列出中文各部首的起始 Unicode 碼位，作用在於在字型編輯器中找字的時候，可以由這個字的 Unicdoe 碼（UCS-2/UCS-4）來找（使用純文字來找字亦可，該篇文章已附上修正）。&lt;p&gt;&lt;br/&gt;一個字，當然是可以有許多不同的編碼，例如「果」，他的 Big-5 碼是 &lt;tt&gt;0xAA47&lt;/tt&gt;，但 UTF-8 的編碼則是 &lt;tt&gt;0xE69E&lt;/tt&gt;，在 UCS-2 的編碼又變成 &lt;tt&gt;0x679C&lt;/tt&gt;。而字型中的編碼則是使用 UCS-2/UCS-4 的方式。所以要找一個中文字，如果可以很快的得知他的 UCS-2/UCS-4 編碼，我們就可以很快的在字型編輯器中找到這個字。&lt;p&gt;

我們可以使用
&lt;a href=&quot;http://directory.fsf.org/recode.html&quot;&gt;recode&lt;/a&gt;
這個工具，他可以很方便的在各種編碼間做轉換。當然，這篇文章既然是放在
&lt;a href=&quot;http://www.ruby-lang.org/en/&quot;&gt;Ruby&lt;/a&gt;
的項目中，我們當然是用 Ruby 來解決啦！&lt;p&gt;

底下就是程式碼（寫得很簡略，有需要其他的功能請自行加進去）：
&lt;pre&gt;
#!/usr/bin/env ruby
# vim:ts=2 sw=2 et
# uscchar.rb : 將所輸入的字轉換成 ucs2/ucs4 hex.
# Edward G.J. Lee (05/16/06)

require &#039;iconv&#039;

s = ARGV[0]
locale = `echo $LC_ALL`.chomp
if locale == &quot;&quot;
  locale = `echo $LC_CTYPE`.chomp
  if locale == &quot;&quot;
    locale = `echo $LANG`.chomp
  end
end

if locale =~ /UTF-8|UTF8|utf8|utf-8/
  ucs = s.unpack(&#039;U&#039;)
  printf(&quot;0x%x\n&quot;,ucs[0])
elsif locale =~ /[Bb]ig5|zh_TW$/
  ucs = Iconv.new(&#039;utf-8&#039;, &#039;big-5&#039;).iconv(s).unpack(&#039;U&#039;)
  printf(&quot;0x%x\n&quot;,ucs[0])
else
  puts
  puts &quot;Not support yet!&quot;
  puts &quot;Try to add code by yourself.&quot;
  puts
  exit
end
&lt;/pre&gt;&lt;p&gt;

這裡主是用到了 iconv 的 Ruby wrapper 及 unpack 的功能。這樣就無需額外的工具就可以解決轉碼的問題了。他的使用方法很簡單，把要查詢的字加在程式後面當做參數就成了：
&lt;pre&gt;
edt1023:~$ ucschar.rb 果
0x679c
&lt;/pre&gt;&lt;p&gt;

目前他只能用在 Big-5 環境及 UTF-8 環境，有需要其他環境的話，請自行加入。

&lt;p&gt;&lt;br /&gt;&lt;p&gt;
&lt;font color=&quot;red&quot;&gt;【補充及修正】Fri May 19 22:29:04 CST 2006&lt;/font&gt;&lt;br /&gt;
Yunt 使用 Python 也寫了一個，這個比較完善，在任何編碼環境都能使用，請參考：&lt;br /&gt;
&lt;a href=&quot;http://my.opera.com/yunt/blog/show.dml/259916&quot;&gt;http://my.opera.com/yunt/blog/show.dml/259916&lt;/a&gt;&lt;p&gt;

可惜 Ruby 還沒有類似的函式。但我投機了一下，把原來的 Ruby code 修改成：
&lt;pre&gt;
#!/usr/bin/env ruby
# vim:ts=2 sw=2 et
# uscchar.rb : 將所輸入的字轉換成 ucs2/ucs4 hex.
# Edward G.J. Lee (05/19/06)

require &#039;iconv&#039;

s = ARGV[0]
locale = `echo $LC_ALL`.chomp
if locale == &quot;&quot;
  locale = `echo $LC_CTYPE`.chomp
  if locale == &quot;&quot;
    locale = `echo $LANG`.chomp
  end
end

if locale =~ /UTF/i
  ucs = s.unpack(&#039;U&#039;)
  printf(&quot;0x%X\n&quot;,ucs[0])
else
  enc = locale.split(&#039;.&#039;)
  ucs = Iconv.new(&#039;utf-8&#039;, enc[1]).iconv(s).unpack(&#039;U&#039;)
  printf(&quot;0x%X\n&quot;,ucs[0])
end
&lt;/pre&gt;&lt;p&gt;

這樣，除非是只設定 zh_TW 這類的 locale，不然應該是系統上有的 locale 都可以支援了。
   </description>
   <link>http://blog.bs2.to/post/EdwardLee/5332</link>
   <comments>http://blog.bs2.to/post/EdwardLee/5332</comments>
   <guid>http://blog.bs2.to/post/EdwardLee/5332</guid>
      <dc:creator>EdwardLee</dc:creator>
      
    <category>Ruby 物語</category>
         <pubDate>Tue, 16 May 2006 20:11:34 +0800</pubDate>
   <source url="http://blog.bs2.to/rss/rss20/EdwardLee">LGJ Notes</source>
     </item>
          <item>
   <title>Ruby 到底是什麼？</title>
   <description>
    Ruby 是林心如（Ruby Lin）嗎？呵呵，在這個 Blog 裡頭，當然不是。那麼是紅寶石嗎？從某個角度，對某些人而言，可能是。如果有接觸過 script 程式語言，例如 sh,
&lt;a href=&quot;http://www.perl.org/&quot;&gt;Perl&lt;/a&gt;,
&lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt;
這些 script 語言的朋友就知道，&lt;a href=&quot;http://www.ruby-lang.org/&quot;&gt;Ruby&lt;/a&gt;
就是這些同類的 script 程式語言。&lt;p&gt;&lt;br/&gt;那為什麼又要多一種 script 語言出來呢？用原有的不就好了嗎？不為什麼，『一樣米養百樣人』，大家各有所宗各有所好，就這麼簡單（另一個我個人覺得不是理由的理由，那就是改進以前的語言的缺點）。&lt;p&gt;

那麼 Ruby 有什麼特色呢？『據說』（我只能據說，因為我不是電腦程式語言高手）他的特色是：&lt;p&gt;
&lt;pre&gt;
Ruby = [Smalltalk - Unfamiliar syntax ]
            + Perl&#039;s scriptin power
            + Python&#039;s exception etc.,
            + CLU&#039;s iterater
            + 其他的改良
&lt;/pre&gt;
既然提到了
&lt;a href=&quot;http://www.smalltalk.org/main/&quot;&gt;Smalltalk&lt;/a&gt;
表示這個 script 語言，是一種純物件導向（OO）的語言。在 Ruby 的世界裡，什麼東西都是物件。&lt;p&gt;

那麼純 OO 又如何呢？我也不知道，這要問問程式語言的大師們[1]，我只是利用 Ruby 來處理我在字型、排版上的問題罷了！他只是我的一個工具而已，我用得順手，就這麼簡單。一個不順手的工具，再怎麼有長篇大論的意義都不實際。:-D &lt;p&gt;

Well，這篇不太像是在介紹 Ruby，只是宣示我有在用 Ruby 而已，往後有什麼心得再 post 出來吧！&lt;p&gt;

&amp;nbsp;&amp;nbsp;&lt;p&gt;

[1] 哈哈，電腦程式語言大師們也正在吵翻天哪一種語言比較好，大概沒空理會你去問他們，而且，問了十位大師，大概你會有十種答案。:-)
   </description>
   <link>http://blog.bs2.to/post/EdwardLee/4262</link>
   <comments>http://blog.bs2.to/post/EdwardLee/4262</comments>
   <guid>http://blog.bs2.to/post/EdwardLee/4262</guid>
      <dc:creator>EdwardLee</dc:creator>
      
    <category>Ruby 物語</category>
         <pubDate>Sat, 10 Dec 2005 11:43:41 +0800</pubDate>
   <source url="http://blog.bs2.to/rss/rss20/EdwardLee">LGJ Notes</source>
     </item>
     </channel>
</rss>
