<?xml version="1.0" encoding="SHIFT_JIS"?>
<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"
	xml:lang="ja">
	<channel rdf:about="https://mitsuki.engawa.org/index.rdf">
		<title>Mitsuki's Magic Laboratory</title>
		<link>https://mitsuki.engawa.org</link>
		<description>生温い技術屋がぼんやりする日々</description>
		<dc:creator>mitsuki</dc:creator>
		<admin:generatorAgent rdf:resource="http://www.blosxom.com/?v=2.1.2"/>
		<admin:errorReportsTo rdf:resource="mailto:mitsuki at engawa dot org"/>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="https://mitsuki.engawa.org/Ruby/20090325_cpuid.html"/>
				<rdf:li rdf:resource="https://mitsuki.engawa.org/Ruby/20070914_dotdot.html"/>
				<rdf:li rdf:resource="https://mitsuki.engawa.org/Ruby/20070730_load.html"/>
				<rdf:li rdf:resource="https://mitsuki.engawa.org/Ruby/20070410_hash.html"/>
				<rdf:li rdf:resource="https://mitsuki.engawa.org/Ruby/20070223_values_at.html"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="https://mitsuki.engawa.org/Ruby/20090325_cpuid.html">
		<title>RubyでもCPUIDしてみた</title>
		<link>https://mitsuki.engawa.org/Ruby/20090325_cpuid.html</link>
		<description>perl から任意の C ライブラリを呼び出す方法 - id:kazuhookuのメモ置き場Perl で Win32::API プログラミング入門 - TAKESAKOのはてな出張所TAKESAKO @ Yet another Cybozu Labs: Pure Perl で Acme::x86::CPUID を作りました　Ruby でもやってみました。1.9 系でしか動かないはず（1.8 系は DL クラスが別物なので）。動作確認は Cygwin 上の 1.9.1 のみ。　CPUID を取得して、Windows のメッセージボックスで表示してます。　機械語は竹迫さんのをまるぱくり。#!/usr/bin/env rubyrequire 'dl'cpu = "\0" * 48bin = "S\xbf#{ [cpu].pack('p') }\xb8\x02\x00\x00\x80" 　ぶくまコメントにもちらっと書いたけど、ベーマガの投稿プログラム（POKE 文でメモリに機械語セットして呼び出す奴）を思い出して笑ったのは、わたしだけではないはずだ（多分）。</description>
		<dc:subject><a href="/Ruby">Ruby</a></dc:subject>
		<dc:creator>mitsuki</dc:creator>
		<dc:date>2009-03-25T16:11+09:00</dc:date>
		<content:encoded><![CDATA[&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/kazuhooku/20090313/1236931258&quot;&gt;perl から任意の C ライブラリを呼び出す方法 - id:kazuhookuのメモ置き場&lt;/a&gt;
&lt;li&gt;&lt;a href=&quot;http://d.hatena.ne.jp/TAKESAKO/20090324/1237879559&quot;&gt;Perl で Win32::API プログラミング入門 - TAKESAKOのはてな出張所&lt;/a&gt;
&lt;li&gt;&lt;a href=&quot;http://labs.cybozu.co.jp/blog/takesako/2009/03/x86cpuid.html&quot;&gt;TAKESAKO @ Yet another Cybozu Labs: Pure Perl で Acme::x86::CPUID を作りました&lt;/a&gt;
&lt;/ul&gt;

&lt;p&gt;
　Ruby でもやってみました。1.9 系でしか動かないはず（1.8 系は DL クラスが別物なので）。動作確認は Cygwin 上の 1.9.1 のみ。&lt;br&gt;
　CPUID を取得して、Windows のメッセージボックスで表示してます。&lt;br&gt;
　機械語は竹迫さんのをまるぱくり。

&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env ruby

require &apos;dl&apos;

cpu = &quot;\0&quot; * 48
bin = &quot;S\xbf#{ [cpu].pack(&apos;p&apos;) }\xb8\x02\x00\x00\x80&quot; &lt;&lt;
      &quot;P\x0f\xa2\x89\x07\x89_\x04\x89O\x08\x89W\x0c\x8d\x7f\x10X\x8d\@\x01&quot; * 3 &lt;&lt;
      &quot;[\xc3&quot;
DL::CFunc.new([bin].pack(&apos;p&apos;).unpack(&apos;L!&apos;)[0], DL::TYPE_VOID).call []

DL::CFunc.new(DL::dlopen(&apos;user32&apos;)[&apos;MessageBoxA&apos;], DL::TYPE_LONG, &apos;MessageBox&apos;, :stdcall).
    call [0, cpu.gsub(/\0/, &apos;&apos;).gsub(/\s+/, &apos; &apos;), &quot;CPUID&quot;, 0].pack(&apos;L!ppL!&apos;).unpack(&apos;L!*&apos;)


&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;
　ぶくまコメントにもちらっと書いたけど、ベーマガの投稿プログラム（POKE 文でメモリに機械語セットして呼び出す奴）を思い出して笑ったのは、わたしだけではないはずだ（多分）。
]]></content:encoded>
		<trackback:ping rdf:resource="https://mitsuki.engawa.org/Ruby/20090325_cpuid.trackback"/>
	</item>
	<item rdf:about="https://mitsuki.engawa.org/Ruby/20070914_dotdot.html">
		<title>条件式中の範囲式</title>
		<link>https://mitsuki.engawa.org/Ruby/20070914_dotdot.html</link>
		<description>　Ruby（や Perl）の範囲式 .. は、if 等の条件文内（やスカラーコンテキスト）で使うと、条件1でONになり条件2でOFFになるという、フリップフロップのような動作をする：% ruby -e '10.times do |i| print i if i == 3 .. i == 6 end'3456　しかし、範囲式をメソッドに追い出してしまうと、期待する動作をしなくなる：% ruby -e 'def foo(i) print i if i == 3 .. i == 6 end; 10.times do |i| foo(i) end'3　おそらく、範囲式の状態はローカルスコープになっているため、メソッドを抜けたところで消えてしまうんじゃないかと思う（フリップフロップだけに「揮発」か？）。利にはかなってるかもしれないけど使いづらい。　ちなみに Perl の場合はというと：% perl -e 'for (1 .. 10) { print if $_ == 3 .. $_ == 6 };'3456% perl -e 'sub foo { print if $_ == 3 .. $_ == 6 }; for (1 .. 10) { foo };'3456　といった具合で、実に期待通りに動く（多分 closure 的に状態保持してるんだろう）。　じゃあ Ruby でも closure にしてみればいけそうかな？：% ruby -e 'foo = Proc.new do |i| print i if i == 3 .. i == 6 end; 10.times do |i| foo[i] end'3456　めでたしめでたし……？</description>
		<dc:subject><a href="/Ruby">Ruby</a></dc:subject>
		<dc:creator>mitsuki</dc:creator>
		<dc:date>2007-09-14T13:01+09:00</dc:date>
		<content:encoded><![CDATA[　Ruby（や Perl）の範囲式 .. は、if 等の条件文内（やスカラーコンテキスト）で使うと、条件1でONになり条件2でOFFになるという、フリップフロップのような動作をする：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
% ruby -e &apos;10.times do |i| print i if i == 3 .. i == 6 end&apos;
3456
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　しかし、範囲式をメソッドに追い出してしまうと、期待する動作をしなくなる：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
% ruby -e &apos;def foo(i) print i if i == 3 .. i == 6 end; 10.times do |i| foo(i) end&apos;
3
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　おそらく、範囲式の状態はローカルスコープになっているため、メソッドを抜けたところで消えてしまうんじゃないかと思う（フリップフロップだけに「揮発」か？）。利にはかなってるかもしれないけど使いづらい。&lt;br&gt;
　ちなみに Perl の場合はというと：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
% perl -e &apos;for (1 .. 10) { print if $_ == 3 .. $_ == 6 };&apos;
3456

% perl -e &apos;sub foo { print if $_ == 3 .. $_ == 6 }; for (1 .. 10) { foo };&apos;
3456
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　といった具合で、実に期待通りに動く（多分 closure 的に状態保持してるんだろう）。&lt;br&gt;
　じゃあ Ruby でも closure にしてみればいけそうかな？：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
% ruby -e &apos;foo = Proc.new do |i| print i if i == 3 .. i == 6 end; 10.times do |i| foo[i] end&apos;
3456
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　めでたしめでたし……？
]]></content:encoded>
		<trackback:ping rdf:resource="https://mitsuki.engawa.org/Ruby/20070914_dotdot.trackback"/>
	</item>
	<item rdf:about="https://mitsuki.engawa.org/Ruby/20070730_load.html">
		<title>load '~/.someconf'</title>
		<link>https://mitsuki.engawa.org/Ruby/20070730_load.html</link>
		<description>　Ruby で設定ファイルを読み込む定番は Kernel.load だけど、なんとなく設定項目をローカル変数にしたら何も読み込まれなくて、きょとん。~./someconf:someconf = 'is in HOME'p local_variablesp selfsome.rb:somerb = 'is in somewhere'load '~/.someconf'p local_variablesp self実行結果：/path/to/somewhere>ruby some.rb["someconf"]main["somerb"]main/home>　どうやら load 元と load 先ではスコープが違うらしい（load 先が別メソッド内にあるような感じ？）。self は共通なので、インスタンス変数にするのが正解なのかな（@someconf みたいに）。</description>
		<dc:subject><a href="/Ruby">Ruby</a></dc:subject>
		<dc:creator>mitsuki</dc:creator>
		<dc:date>2007-07-30T19:28+09:00</dc:date>
		<content:encoded><![CDATA[　Ruby で設定ファイルを読み込む定番は Kernel.load だけど、なんとなく設定項目をローカル変数にしたら何も読み込まれなくて、きょとん。
&lt;blockquote&gt;&lt;pre&gt;&lt;em&gt;~./someconf:&lt;/em&gt;&lt;code&gt;
someconf = &apos;is in HOME&apos;
p local_variables
p self
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;em&gt;some.rb:&lt;/em&gt;&lt;code&gt;
somerb = &apos;is in somewhere&apos;
load &apos;~/.someconf&apos;
p local_variables
p self
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre&gt;&lt;em&gt;実行結果：&lt;/em&gt;&lt;code&gt;
/path/to/somewhere&gt;ruby some.rb
[&quot;someconf&quot;]
main
[&quot;somerb&quot;]
main
/home&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　どうやら load 元と load 先では&lt;a href=&quot;http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/34274&quot;&gt;スコープが違うらしい&lt;/a&gt;（load 先が別メソッド内にあるような感じ？）。self は共通なので、インスタンス変数にするのが正解なのかな（@someconf みたいに）。

]]></content:encoded>
		<trackback:ping rdf:resource="https://mitsuki.engawa.org/Ruby/20070730_load.trackback"/>
	</item>
	<item rdf:about="https://mitsuki.engawa.org/Ruby/20070410_hash.html">
		<title>Ruby の hash key は object そのまんま</title>
		<link>https://mitsuki.engawa.org/Ruby/20070410_hash.html</link>
		<description>404 Blog Not Found:perl|javascript - 文字列じゃないhash key　JavaScript や Perl の場合ハッシュのキーは文字列限定なので、オブジェクト（Perl はそのリファレンス）をハッシュのキーとして使った場合、ハッシュからキーを取り出したらもはやオブジェクトではなくなってしまう、という話かな（Tie::RefHash なんてあるのね……）。　Ruby の場合、データはすべてオブジェクトであり、ハッシュは「オブジェクトとオブジェクトを関連付ける入れ物」なので、キーにしたオブジェクトをハッシュから取り出しても元のオブジェクトのまま。そのため、以下のような破廉恥(?)なコードがごく自然に書けてしまう：input = [ 'hogehoge', 'foooooooo', 'nyoron' ]reply = { 'hoge' => 'fuga', /fo+o/ => 'bar' }input.each do |instr|    reply.each do |key, val|        puts "#{instr} -> #{val}" if instr[key]    endend　このコードは、配列 input の各文字列に対して、ハッシュ reply のキー（文字列または正規表現オブジェクト）を引数に [] 演算子を適用し、結果が FALSE/nil でなければハッシュの値を表示する。文字列の演算子 [] は、[] の中身が文字列なら普通の比較、正規表現オブジェクトなら正規表現にマッチする文字列を返す（一致・マッチしなければ FALSE/nil を返す）。実行するとこんな感じ：> ruby test.rbhogehoge -> fugafoooooooo -> bar> 　ちなみにこれ、最近遊びで書いてる IRC bot "mistral" の自動応答機能の心臓部の抜粋なのだけど、Ruby のこの性質のおかげで、特に工夫するでもなくキーワードに文字列だけでなく正規表現も使えてしまうので便利（キーワード登録時には正規表現であることを明記する I/F は必要だけど）。</description>
		<dc:subject><a href="/Ruby">Ruby</a></dc:subject>
		<dc:creator>mitsuki</dc:creator>
		<dc:date>2007-04-10T21:13+09:00</dc:date>
		<content:encoded><![CDATA[&lt;blockquote&gt;
&lt;a href=&quot;http://blog.livedoor.jp/dankogai/archives/50806528.html&quot;&gt;404 Blog Not Found:perl|javascript - 文字列じゃないhash key&lt;/a&gt;
&lt;/blockquote&gt;
　JavaScript や Perl の場合ハッシュのキーは文字列限定なので、オブジェクト（Perl はそのリファレンス）をハッシュのキーとして使った場合、ハッシュからキーを取り出したらもはやオブジェクトではなくなってしまう、という話かな（Tie::RefHash なんてあるのね……）。
&lt;p&gt;
　Ruby の場合、データはすべてオブジェクトであり、ハッシュは「オブジェクトとオブジェクトを関連付ける入れ物」なので、キーにしたオブジェクトをハッシュから取り出しても元のオブジェクトのまま。そのため、以下のような破廉恥(?)なコードがごく自然に書けてしまう：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
input = [ &apos;hogehoge&apos;, &apos;foooooooo&apos;, &apos;nyoron&apos; ]
reply = { &apos;hoge&apos; =&gt; &apos;fuga&apos;, /fo+o/ =&gt; &apos;bar&apos; }

input.each do |instr|
    reply.each do |key, val|
        puts &quot;#{instr} -&gt; #{val}&quot; if instr[key]
    end
end
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　このコードは、配列 input の各文字列に対して、ハッシュ reply のキー（文字列または正規表現オブジェクト）を引数に [] 演算子を適用し、結果が FALSE/nil でなければハッシュの値を表示する。文字列の演算子 [] は、[] の中身が文字列なら普通の比較、正規表現オブジェクトなら正規表現にマッチする文字列を返す（一致・マッチしなければ FALSE/nil を返す）。実行するとこんな感じ：
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
&gt; ruby test.rb
hogehoge -&gt; fuga
foooooooo -&gt; bar
&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
　ちなみにこれ、最近遊びで書いてる IRC bot &quot;mistral&quot; の自動応答機能の心臓部の抜粋なのだけど、Ruby のこの性質のおかげで、特に工夫するでもなくキーワードに文字列だけでなく正規表現も使えてしまうので便利（キーワード登録時には正規表現であることを明記する I/F は必要だけど）。]]></content:encoded>
		<trackback:ping rdf:resource="https://mitsuki.engawa.org/Ruby/20070410_hash.trackback"/>
	</item>
	<item rdf:about="https://mitsuki.engawa.org/Ruby/20070223_values_at.html">
		<title>Ruby の Struct#values_at に Symbol は使えない？</title>
		<link>https://mitsuki.engawa.org/Ruby/20070223_values_at.html</link>
		<description>　マニュアル読むと Symbol が使えるサンプルがあるのだけど、実際やってみるとエラーになる in 1.8.4 and 5。#!/usr/bin/env rubyFoo = Struct.new(:foo, :bar, :baz)obj = Foo.new('FOO', 'BAR', 'BAZ')p :bar.to_ip obj.values_at(0, :bar, 'baz')    # => ["FOO", "BAR", "BAZ"]とやるとbash-3.2$ ./test.rb10345./test.rb:5:in `values_at': offset 10345 too large for struct(size:3) (IndexError) from ./test.rb:5bash-3.2$となってしまう。どうも :bar をハンドルに強制変換して範囲エラーになってる気がしてソースを読んでみると（struct.c）、数値と範囲と強制数値変換は実装されているけど、Symbol や 文字列から index を算出するようなコードが見当たらないので、未実装……なのかな？？（どうでもいいけど、Struct の中身って実装レベルだと Array なのね）</description>
		<dc:subject><a href="/Ruby">Ruby</a></dc:subject>
		<dc:creator>mitsuki</dc:creator>
		<dc:date>2007-02-23T12:22+09:00</dc:date>
		<content:encoded><![CDATA[　マニュアル読むと Symbol が使えるサンプルがあるのだけど、実際やってみるとエラーになる in 1.8.4 and 5。
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
#!/usr/bin/env ruby
Foo = Struct.new(:foo, :bar, :baz)
obj = Foo.new(&apos;FOO&apos;, &apos;BAR&apos;, &apos;BAZ&apos;)
p :bar.to_i
p obj.values_at(0, :bar, &apos;baz&apos;)    # =&gt; [&quot;FOO&quot;, &quot;BAR&quot;, &quot;BAZ&quot;]
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;とやると
&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;
bash-3.2$ ./test.rb
10345
./test.rb:5:in `values_at&apos;: offset 10345 too large for struct(size:3) (IndexError) from ./test.rb:5
bash-3.2$
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;
となってしまう。どうも :bar をハンドルに強制変換して範囲エラーになってる気がしてソースを読んでみると（struct.c）、数値と範囲と強制数値変換は実装されているけど、Symbol や 文字列から index を算出するようなコードが見当たらないので、未実装……なのかな？？&lt;br&gt;
（どうでもいいけど、Struct の中身って実装レベルだと Array なのね）
]]></content:encoded>
		<trackback:ping rdf:resource="https://mitsuki.engawa.org/Ruby/20070223_values_at.trackback"/>
	</item>
</rdf:RDF>
