<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>ダメ出し日記 &#187; Ruby</title>
	<atom:link href="http://www.sfo.jp/blog/archives/category/software/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://www.sfo.jp/blog</link>
	<description>自称・独立&#38;OSS系(?) SE、さとうふみやすの日記。OSS テクノロジ(株)に勤務。</description>
	<lastBuildDate>Fri, 23 Oct 2009 08:10:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>組込みデビュー? (キメラ・サーチ on ARM)</title>
		<link>http://www.sfo.jp/blog/archives/2008/10/on-arm.html</link>
		<comments>http://www.sfo.jp/blog/archives/2008/10/on-arm.html#comments</comments>
		<pubDate>Fri, 24 Oct 2008 08:23:39 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2008/10/on-arm.html</guid>
		<description><![CDATA[こんな環境にキメラ・サーチを入れてみた。

# uname -a
Linux foobar 2.6.22.7 #7 Tue Oct 21 22:36:39 JST 2008 armv5tejl unknown
# cat [...]]]></description>
			<content:encoded><![CDATA[<p>こんな環境に<a href="http://www.osstech.co.jp/product/chimera">キメラ・サーチ</a>を入れてみた。</p>

<pre><code># uname -a
Linux foobar 2.6.22.7 #7 Tue Oct 21 22:36:39 JST 2008 armv5tejl unknown
# cat /proc/cpuinfo
Processor       : ARM926EJ-S rev 0 (v5l)
BogoMIPS        : 266.24
Features        : swp half thumb fastmult edsp
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant     : 0x0
CPU part        : 0x926
CPU revision    : 0
Cache type      : write-back
Cache clean     : cp15 c7 ops
Cache lockdown  : format C
Cache format    : Harvard
I size          : 32768
I assoc         : 1
I line length   : 32
I sets          : 1024
D size          : 32768
D assoc         : 1
D line length   : 32
D sets          : 1024
Hardware        : Feroceon
Revision        : 0000
Serial          : 0000000000000000
# free
total         used         free       shared      buffers
Mem:       125780       101916        23864            0           52
Swap:      1004020            0      1004020
Total:      1129800       101916      1027884
# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot      Start         End      Blocks  Id System
/dev/sda1               1         125     1004031  83 Linux
/dev/sda2             126         748     5004247+ 83 Linux
/dev/sda4             749       60801   482375722+  5 Extended
/dev/sda5             749         873     1004031  82 Linux swap
/dev/sda6             874       60690   480480021  83 Linux
</code></pre>

<p>ハードディスクもあるし、
普段との違いは CPU アーキテクチャくらい?
ということで、全然組込みプログラミングじゃないです。</p>

<p>クロスコンパイルとかに少々悩みつつ、
Scratchbox 2 + QEMU に寄り道したりして、
ようやく場当たり的パッケージングとインストールが完了。
今後 Scratchbox を使ったクロスコンパイル環境作りには力を入れたいが、暇があるかどうか。</p>

<p>何はともあれ、キメラ・サーチを初実行 on ARM。</p>

<pre><code># time /opt/osstech/bin/chimera-crawler
real    0m28.299s
user    0m24.310s
sys     0m2.570s
</code></pre>

<p>&#8230;遅い!
メモリ 128MB も心許ない。大丈夫か?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2008/10/on-arm.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Perl ⇔ Python ⇔ Ruby</title>
		<link>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html</link>
		<comments>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html#comments</comments>
		<pubDate>Tue, 17 Jun 2008 13:18:07 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html</guid>
		<description><![CDATA[Python, Ruby でコーディングする際に躓いた Perl ならわかるんだけど… な事柄のハウツー。2008-06-18 更新。Special thanks to ミラクル組。

リンク


文字列操作の比較表:  [...]]]></description>
			<content:encoded><![CDATA[<p>Python, Ruby でコーディングする際に躓いた <q>Perl ならわかるんだけど…</q> な事柄のハウツー。2008-06-18 更新。Special thanks to ミラクル組。</p>

<h3>リンク</h3>

<p><dl>
<dt>文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++</dt>
<dd><a href="http://0xcc.net/blog/archives/000137.html">http://0xcc.net/blog/archives/000137.html</a></dd>
<dt>配列操作の比較表: Ruby, Python, JavaScript, Perl, C++</dt>
<dd><a href="http://0xcc.net/blog/archives/000043.html">http://0xcc.net/blog/archives/000043.html</a></dd>
</dl></p>

<h3>バージョン番号</h3>

<h4>コマンドライン</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>perl -v</kbd>
This is perl, v5.10.0 built for x86<em>64-linux-gnu-thread-multi
<var>いっぱい</var>
$ <kbd>perl -V</kbd>
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
<var>もっといっぱい</var>
$ <kbd>perl -e 'print $],"\n"'</kbd>
5.010000
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="terminal"><code>$ <kbd>python -v</kbd>
Python 2.5.2
$ <kbd>python -c 'import sys; print "%d.%d.%d" % sys.version</em>info[:3]'</kbd>
2.5.2
$ <kbd>python -c 'import sys; print "%d.%d" % sys.version<em>info[:2]'</kbd>
2.5
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>ruby -v</kbd>
ruby 1.8.7 (2008-05-31 patchlevel 0) [x86</em>64-linux]
</code></pre>
</dd></p>

<h3>標準モジュールパスの表示</h3>

<h4>コマンドライン</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>perl -e 'print map {"$<em>\n"} @INC'</kbd>
/etc/perl
/usr/local/lib/perl/5.10.0
/usr/local/share/perl/5.10.0
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site</em>perl
.
$ <kbd>perl \
-V:installsitearch \
-V:installsitelib \
-V:installvendorarch \
-V:installvendorlib \
-V:installarchlib \
-V:installprivlib</kbd>
installsitearch='/usr/local/lib/perl/5.10.0';
installsitelib='/usr/local/share/perl/5.10.0';
installvendorarch='/usr/lib/perl5';
installvendorlib='/usr/share/perl5';
installarchlib='/usr/lib/perl/5.10';
installprivlib='/usr/share/perl/5.10';
</code></pre>
</dd>
<dt>Python</dt>
<dd>FIXME: Python 2.5(?) には vendor-packages もあるみたい。
<pre class="terminal"><code>$ <kbd>python -c 'import sys; print sys.path'</kbd>
['', '/usr/lib/python25.zip', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages/Numeric', '/usr/lib/python2.5/site-packages/PIL', '/var/lib/python-support/python2.5', '/var/lib/python-support/python2.5/gtk-2.0']
$ <kbd>python -c 'from distutils.sysconfig import get<em>python</em>lib; print get<em>python</em>lib()'</kbd>
/usr/lib/python2.5/site-packages
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>ruby -e 'puts $LOAD_PATH'</kbd>
</code></pre>
</dd></p>

<h3>モジュール検索パスの追加</h3>

<h4>環境変数</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export PERL5LIB='/site/lib/perl'</kbd>
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export PYTHONPATH='/site/lib/python'</kbd>
</code></pre>
</dd>
</dl>
<dd>
<pre class="terminal"><code>$ <kbd>echo '/site/lib/python' &gt;/usr/lib/python2.5/site-packages/site.pth</kbd>
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="terminal"><code>$ <kbd>export RUBYLIB='/site/lib/ruby'</kbd>
</code></pre>
</dd></p>

<h4>スクリプト</h4>

<p><dl>
<dt>Perl</dt>
<dd>
<pre class="code"><code>use lib '/site/lib/perl';
</code></pre>
</dd>
<dt>Python</dt>
<dd>
<pre class="code"><code>import sys
sys.path.append("/site/lib/python")
</code></pre>
</dd>
<dd>
<pre class="code"><code>import site;
site.addsitedir('/site/lib/python')
</code></pre>
</dd>
</dl>
<dt>Ruby</dt>
<dd>
<pre class="code"><code>puts $LOAD_PATH.push("/site/lib/ruby")
</code></pre>
</dd></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2008/06/perl-python-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: 外部コマンドとの IPC</title>
		<link>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html#comments</comments>
		<pubDate>Sun, 10 Jun 2007 17:03:22 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[ダメ出し]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html</guid>
		<description><![CDATA[
ある Samba のバグ
を回避する方法を探っている。
Samba をアップグレードできないことが想定されるため、
クライアント側 (今回は Ruby スクリプト) で対処しなければならない。
そこで、
Ruby スク [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="https://bugzilla.samba.org/show_bug.cgi?id=4683">ある Samba のバグ</a>
を回避する方法を探っている。
Samba をアップグレードできないことが想定されるため、
クライアント側 (今回は Ruby スクリプト) で対処しなければならない。
そこで、
Ruby スクリプトから Samba の rpcclient コマンドを利用して SID の名前解決を実行すべく、
外部コマンドと <acronym title="Inter-Process Communication">IPC</acronym> するクラスを書いてみた。
</p>

<p><pre class="code"><code>#!/usr/bin/ruby -w</p>

<h2>IPC class with external command</h2>

<p>class CmdIPC
attr<em>reader :reader, :writer
def initialize(command, *args, &amp;ipcproc)
if command.class == Array
@command, @arg0 = command
else
@command = @arg0 = command
end
@args = args
@ipcproc = ipcproc
@pid = nil
start</em>command
end
def start<em>command
@reader, c</em>writer = IO.pipe
c_reader, @writer = IO.pipe</p>

<h2>Parent process returns here</h2>

<p>return if @pid = fork</p>

<h2>Child process</h2>

<p>begin
@reader.close
@writer.close
STDIN.reopen(c<em>reader)
STDOUT.reopen(c</em>writer)
c<em>reader.close
c</em>writer.close
exec([@command, @arg0], <em>@args)
rescue =&gt; e
raise "cannot execute external command: #{@command}: #{e}"
end
end
def stop<em>command
if @pid
@reader.close
@writer.close
Process.kill('TERM', @pid)
Process.waitpid(@pid)
end
@pid = nil
end
def restart</em>command
stop<em>command
start</em>command
end
def ipc(input)
@ipcproc.call(self, input)
end
end
if <strong>FILE</strong> == $0
lookupsid = CmdIPC.new('/usr/bin/rpcclient', '-U%', '-d0', '127.0.0.1') {
|sid, reader, writer|
writer.puts("lookupsids #{sid}")
next unless line = reader.gets
next unless match = line.match(/^S(?:-\d+)+\s(.</em>)\s+&#40;\d+&#41;$/)
next match[1]
}
puts lookupsid.ipc('S-1-1-0')
puts lookupsid.ipc('S-1-3-0')
puts lookupsid.ipc('S-1-3-1')
end
</code></pre>
<p>
注意: この実装では、出力をバッファリングするコマンドに対しては利用できない。
</p>
<p>
(まだ素人なので)この実装がオブジェクト指向的 (Ruby 的) に美しいかどうかはよくわからないが、
参考書を片手に数分でそれっぽいのが完成してしまった。
ちょっと感動した。
Ruby だとより直感的に書けるということかな。
ソフトウェア関係で感動したことは、過去、両手で足りる回数しか経験がないので、
貴重な体験だった。
</p>
<p>
一点気になるのは、<code>CmdIPC.new</code>
に渡しているコードブロックには <code>return</code> 文が書けないこと。
Ruby のリファレンスを読めば理由は納得できるのだが、
<code>next</code> は違和感ありすぎ。
せめて <code>break</code> ならいいのだけど、
それだと LocalJumpError 例外が発生して
<q><code>break from proc-closure</code></q> と文句を言われる。
何か間違っているのかなぁ?
</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/06/ruby-cmdipc.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby: SMB/CIFS 共有をブラウズ</title>
		<link>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html</link>
		<comments>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html#comments</comments>
		<pubDate>Tue, 05 Jun 2007 15:41:25 +0000</pubDate>
		<dc:creator>fumiyas</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Samba]]></category>
		<category><![CDATA[仕事]]></category>

		<guid isPermaLink="false">http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html</guid>
		<description><![CDATA[Post Perl は Ruby に決定。
た〜だ〜い〜ま〜勉強中〜♪ 本日 4日目。
久しぶりの勉強のためか脳疲労が激しいけど、楽しい〜♪
当然のように特有のクセがあって苦労しているけど、
どのクセも何故そのようになっ [...]]]></description>
			<content:encoded><![CDATA[<p>Post Perl は Ruby に決定。
た〜だ〜い〜ま〜勉強中〜♪ 本日 4日目。
久しぶりの勉強のためか脳疲労が激しいけど、楽しい〜♪
当然のように特有のクセがあって苦労しているけど、
どのクセも何故そのようになっているかの理由が感じられるし、
何より違和感や不快感がない!
慣れれば慣れるほど、さらに気持ちよくコーディングできそう。
Perl や PHP や Python やシェルでコーディングしていると、
違和感・不快感を感じることしきりだもんなぁ。</p>

<p>実は Ruby の勉強と平行して Samba 共有内のファイル検索ツールを今月中に作らねばならないのだけど、間に合うかしら!? いや、間に合わせねば。
Ruby の素晴しさを引き出すには時間が足りないかもしれないけど、
そこそこは使い熟せそうな感触を得ている。</p>

<p>初 Ruby スクリプトは以下のような感じ。突っ込み歓迎。
<a href="http://rubysmb.sourceforge.net/">Ruby/SMB</a> を利用して
SMB 共有内の特定の拡張子のファイルを一覧表示する Ruby スクリプト:</p>

<pre><code>#!/usr/bin/ruby -w

require "smb"

## Override SMB::Dir::Entry#url to hide "user:password" in URL
class SMB::Dir::Entry
  alias original_url url
  private <img src='http://www.sfo.jp/blog/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> riginal_url
  def url
    return original_url.sub(%r#^([^/:]+://)(?:[^/]+@)?#, '\1')
  end
end

$ext = %w(odt ods odp doc xls ppt pdf txt htm html)
$server = "127.0.0.1"
$user = "testuser"
$password = "testuserpassword"
$server.downcase!
$auth = [nil, $user, $password]
$ext_re = Regexp.new("\\.(#{$ext.join("|")})$", Regexp::IGNORECASE)

def crawl(dir)
  dir.direntries.each do |entry|
    next if entry.name =~ /^\.\.?$/
    ## FIXME: SIGSEGV protector (libsmbclient's bug?)
    next if entry.url.length &gt; 1000
    if entry.file?
      if entry.url =~ $ext_re
        puts entry.url
      end
    elsif entry.dir?
      begin
        entry_dir = entry.open
        crawl(entry_dir)
      rescue =&amp;gt; e
        e_message = e.to_s.sub(/ - smb:\/\/.*/, '')
        STDERR.puts "#{$0}: cannot open directory: #{entry.url}: #{e_message}"
      ensure
        entry_dir.close if entry_dir
      end
    end
  end
end

SMB.on_authentication do |server, share, workgroup, user, password|
  $auth
end

begin
  server = SMB.open("smb://#{$server}/")
  #server = SMB.open("smb://#{$user}:#{$password}@#{$server}/")
rescue =&gt; e
  STDERR.puts "#{$0}: cannot connect to server: #{$server}: #{e}"
  exit 1
end
server.direntries.each do |entry|
  if entry.file_share?
    begin
      entry_share = entry.open
      crawl(entry_share)
    rescue =&gt; e
      STDERR.puts "#{$0}: cannot connect to share: #{entry.name}: #{e}"
    ensure
      entry_share.close if entry_share
    end
  end
end

exit 0
</code></pre>

<p>以下は Ruby/SMB beta3 用のパッチで、
SMB.on_authentication のバグ修正とログレベルを 0 に変更する修正:</p>

<pre><code>--- rubysmb-beta-3/rubysmb.c.dist   2002-10-17 20:13:48.000000000 +0900
+++ rubysmb-beta-3/rubysmb.c    2007-06-05 23:52:11.698527382 +0900
@@ -112,9 +112,9 @@ static void auth_fn(const char *server,
 if (RARRAY(ary)-&gt;len != 3) {
   rb_raise(eSmbError, "array should contain workgroup, username and password to use as authentication");
 }
-
-  wg = RARRAY(ary)-&gt;ptr[1];
-  un = RARRAY(ary)-&gt;ptr[0];
+
+  wg = RARRAY(ary)-&gt;ptr[0];
+  un = RARRAY(ary)-&gt;ptr[1];
   pw = RARRAY(ary)-&gt;ptr[2];
   if (!NIL_P(wg)) {
@@ -167,7 +167,7 @@ void Init_smb()
 {
   int err;
-  err = smbc_init(auth_fn, 1);
+  err = smbc_init(auth_fn, 0);
   if (err &lt; 0) {
     rb_raise(rb_eRuntimeError, "Error loading libsmbclient: %s\n", strerror(errno));
   }
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.sfo.jp/blog/archives/2007/06/my-first-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

