Mitsukiの魔法実験室

Mitsuki's Magic Laboratory
Since 2002.09.14

RubyでもCPUIDしてみた

Posted at 2009/03/25 16:11 in Ruby

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


#!/usr/bin/env ruby

require 'dl'

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

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


 ぶくまコメントにもちらっと書いたけど、ベーマガの投稿プログラム(POKE 文でメモリに機械語セットして呼び出す奴)を思い出して笑ったのは、わたしだけではないはずだ(多分)。

2008/09/23

Posted at 2008/09/23 20:38 in Diary|Ruby

* 20:35 【ActiveScript】RubyをWindowsで使うスレ【GUI】

480 :デフォルトの名無しさん:2008/09/22(月) 00:30:53
Win32OLEの1.8と1.9の違い(その1)
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole18_ffbb.html
Win32OLEの1.8と1.9の違い(その2)
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole18_9fb9.html
Win32OLEの1.8と1.9の違い(その3)
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole18_c298_1.html
Win32OLEの1.8と1.9の違い(その4)
ttp://suke.cocolog-nifty.com/blog/2008/08/ruby_win32ole18_5f71.html

WIN32OLE_EVENT
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_1.html
InternetExplorer.Application から DWebBrowserEvents2 を導く方法
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_internetex_022f.html
WIN32OLE_EVENTの第2引数の省略
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_b8c0.html
WIN32OLE_EVENT#on_event_with_outargs
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_3.html
WIN32OLE_EVENT#on_event_with_outargs (その2)
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_4ba1.html
WIN32OLE_EVENT#on_event_with_outargs (その3)
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_d617.html
WIN32OLE::VARIANTモジュールとWIN32OLE_VARIANT
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32oleva_81c9.html
Win32OLE 今、実装してみようかと考えているもの
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_90a0.html
Win32OLE 対応できるんだったら対応したいもの
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_2ac7.html
WIN32OLE_EVENT
ttp://suke.cocolog-nifty.com/blog/2008/07/ruby_win32ole_e_2.html

条件式中の範囲式

Posted at 2007/09/14 13:01 in Ruby

 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

 めでたしめでたし……?

load '~/.someconf'

Posted at 2007/07/30 19:28 in Ruby

 Ruby で設定ファイルを読み込む定番は Kernel.load だけど、なんとなく設定項目をローカル変数にしたら何も読み込まれなくて、きょとん。

~./someconf:
someconf = 'is in HOME'
p local_variables
p self
some.rb:
somerb = 'is in somewhere'
load '~/.someconf'
p local_variables
p self
実行結果:
/path/to/somewhere>ruby some.rb
["someconf"]
main
["somerb"]
main
/home>

 どうやら load 元と load 先ではスコープが違うらしい(load 先が別メソッド内にあるような感じ?)。self は共通なので、インスタンス変数にするのが正解なのかな(@someconf みたいに)。

2007/04/18

Posted at 2007/04/18 12:24 in Diary|Ruby

* 12:55 mistral
 内部データの保存を Marshal.dump から YAML.dump に変更したら、文字コード指定付き Regexp の復元でこけたorz
 あと、素の文字列と(YAML化に伴って)\ でエスケープされた文字列それぞれから作った Regexp は hash が違うので(String のままなら一致するのにー)、それぞれを Hash に突っ込んだら重複してしまう。むーん。
 可読形式で保存したほうがいろいろ楽かなーと思ってたんだけど、ますますめんどくさくなりそうなので Marshal に戻そう(しくしく)\。

Page 1/2: 1 2 [>]