icon Rubyもの
NavigationBar RubyRingHome Prev Next
←前】 【一覧】 【輪頁】 【次→

オブジェクト指向スクリプト言語Ruby を使った自作スクリプトのなどのページです。なかなか使いやすい言語です。楽に書けないかなあと思ってるところが、実際楽に書けるという、気の利いたスクリプト言語です。

ここには自作のRubyものを置いてみます。 たいした物はありませんが、枯れ木も山のにぎわいと言いますよね。 一応、人の役に立ちそうではないか?というもののみにはするつもりです。(本当か?)

私はLinuxとWindowsの両方を使っています。念のため。常用はWindowsで、Linuxが 屋台骨です。というか、いつもWinからtelnetしてるので、 LinuxからWinに窓が簡単に開ければ最高なのですけど。←最近どうでも良くなった

ここにあるものはすべて「無保証」ということでお願いします。


Last update 05/08/28
tagiterの説明に誤記があったので修正。(nth_trailer→nth_tailer)

Index

順序替えました。

メモ 拡張ライブラリを含むもの 純Ruby(?)のもの なんかもう使わなくなってしまったもの。 謎。山のにぎわいの枯れ木(他が育ってきたので伐採?)

メモ

間抜けながら、私がよくハマったことなど。

Rubyに慣れるまではよくハマり、理由がわからずに悩みました。とりあえずruby1.4.5で確認。

かっこの省略
Rubyのメソッドは、かっこを省略して
Time.gm 2000,2,11,12,34,56
などのように呼べますが、
Time.gm (19+1)*100,2,11,12,34,56
とすると変なことになります。引っかかった時は自作のメソッドだったので、 なにやら結果が変に...(この例ではエラーになります)
原因は、 (Time.gm(19+1)) * 100,....と解釈されるため。

演算子はどっちにくっつく?
よく言われているようですが、演算子は基本的に、 左側の変数にくっつけないと混乱の元になります。
p 1 +2
は通りますが、
a=1
p a +2

はエラーになります。
原因は、後者は p a(+2)と、+2が引数と解釈されてしまうためです。
a=1
p a+ 2

a=1
p a + 2

ならOK。

ローカル変数と等号付きメソッド
またやっちゃったので追加。
オブジェクトのインスタンス変数などへのアクセス方法として、 test=(val)などのメソッドを定義することがありますが、 これはレシーバをちゃんと書かないとややこしくなります。下記のスクリプトの 結果は、"hogehoge"が2度表示されます。booでtest=()を呼んだつもりにもかかわらず。
class Test
  def test=(val) @ival=val       end
  def print()    p @ival         end
  def boo()      test = "PINPON" end
end

a = Test.new
a.test="hogehoge"
a.print
a.boo
a.print
こういうときは、しっかり"self"をレシーバに指定しましょう。testはローカル変数じゃないぞという主張です。self.test="PINPON"

拡張ライブラリを含むもの

go PalmSync
もともとあったのがこれ。RubyでPalmPilotを扱うものです。
とりあえず詳しくはこちらのページへ。 おそらくUnix用でしょう。
ちらちらと反応を頂きます。ありがたい限りです。
go VisualuRuby計画(仮称)
Windows上で、VisualBasicの代わりにRubyで何とか出来ないかということで がんばってみることにしました。この先どうなるかは未定。
へろへろですが途中経過を配布してみました。→それなりになった?
dw Ruby-EB
EB Libraryを利用して、Rubyで電子ブックを読むためのライブラリです。
結構利用している人が多いようですね。rpmなども作成して下さる方々が居ます。
ページを分離しました。
ver2を機にsourceforgeに移動しました。

純Ruby(?)のもの

dw fpopper (fpopper0.3.tar.gz)
メール受信のプロトコルであるPOP3のプロキシです。
付属のreadme.rdから説明ページ作りました。POPプロキシfpopper
昔書いた構造図がこれ。FilterPopperってのが、このfpopperのことです。
popサーバに存在するメールをフィルタリングし、その部分集合のみがメール ボックス上に見えるようになります。(つまりメール総数が減る)
低速通信環境下のクライアントから、SPAMなどの不要なメールを取得しないために作成されました。ただし、プロキシとメールサーバ間の通信が遅いと利用する意味がなくなります。
プロキシサーバ側の設定ファイルによって、メールにタグ付けし、特定のタグを持つメールのみでメールボックスを構築したり、特定のタグを持たないメールのみでメールボックスを構築できます。
POP3をAPOPに変換するおまけ機能付き(ポート番号の後ろにaを付ける)。ただし、クライアントとプロキシ間の通信は通信経路上でのぞき見可能なので、ここの暗号化その他は各ユーザさんでよろしくやってください。
タグ付けルールは、全体に有効なルールと、各メールサーバ(とポート)別に有効なルールの2種類があります。
例としては、このプロキシに!ignore#username@pop.server.net でログインすると、 ignoreのタグが付いていないメールのみでメールボックスを構築します。(!が反転マーク)
0.2からエイリアスを使えるようにしました。スクリプトと同じディレクトリのalias.defに、 notnormal = !ignore#username@pop.server.net と書くと、notnormal というユーザ名が右辺のもののエイリアスになります。
ログイン時にメールの情報を取得するので、ログインに時間がかかります。
昔書いた構造図がこれ。FilterPopperってのが、このfpopperのことです。
インストーラはありません。適当なディレクトリに展開して、そこで使って下さい。

dw rfs
リファレンスをひくためのスクリプトです。ReFeみたいなもの。
rubyインタプリタのObjectSpaceからクラスを検索し、そのクラスを使ってメソッドを検索します。で、特定できた場合にリファレンスを探しに行きます。
クラスやメソッドが見つからなくても、それなりにリファレンスを探しに行きますが、補完などは効かなくなります。標準で組み込まれないライブラリのリファレンスを補完付きでひくには、-rオプションなどでライブラリを読み込んでから使う必要があります。

動作例(なんだかメッセージが不自然ですね)


    $ ruby rfs.rb Str to_sy  (一つだけヒットする)
    = Query class[String] Method[to_sy]
    == Description of String#to_sym
    --- intern
    --- to_sym ((<ruby 1.7 feature>))
        文字列に対応するシンボル値(((<Symbol>)))を返します。ナルキャラクタ
        ('\0')を含む文字列は (({intern})) できません(例外
        ((<ArgumentError>)) が発生します).

        シンボルに対応する文字列を得るには ((<Symbol#to_s|Symbol/to_s>))
        (または((<Symbol#id2name|Symbol/id2name>)))を使います。

          p "foo".intern

    $ ruby rfs.rb Str to_s (補完により複数ヒットして特定できない)
    = Query class[Str] Method[to_s]
    == Instance methods
      String#to_s, String#to_str, String#to_sym, Struct#to_s

    $ ruby rfs.rb Stri to_s  (複数ヒットするが一致するのは一つ)
    = Query class[String] Method[to_s]
    == Instance methods
      String#to_s, String#to_str, String#to_sym
    == Description of String#to_s
    --- to_s
    --- to_str
    
        (({self})) を返します。
  
引数が一つでも動きます。また、rfs.rbは-rオプションを解釈します。

dw rmake
makeもどき。Rubyスクリプトで記述します。rmake.rbをrequireして使います。
ターゲットとソース(の配列)を与えて、依存関係からなんらかのアクションを起こします。
依存関係はファイルの日付以外を用いるものも(実装すれば)使えます。
複数ルールの一括定義(.c.oみたいなもの)は、正規表現の置換を用います。
      action(/(.*)\.o/, ['\1.c']) |target,deps| {
        s "gcc -c -o #{target} #{deps.join(' ')}"
      }
     
という感じ。(sはsystemのalias)。上記とペアで
      action("hoge.o", ["hoge.c","hoge.h","foo.h"]) 
     
とも書けます。最後はmake("hoge.o")とかmake("hoge.exe")とか。
ちょっと、手元の特定用途向けっぽい感じかも。
srcs = Dir[SOURCEDIR] + Dir[HEADERDIR1]と書いて依存物がざっくり全部、って出来るのも場合によっては楽です。
Rubyスクリプトなので、Makefileよりタイプ量が増える場合が多いです。

dw tagiter.rb
RAA登録しました。 ので、ドキュメントとセットにしたアーカイブ作りました。
美しさを求めないあなたに... という感じ。
更新履歴はtagiter解説ページへ。(最新05/03/02)
tagiter解説ページにマニュアルがあります。
以下駄文

なんかもう使わなくなってしまったもの

dw rear.rb
複数のrubyスクリプトを1本にまとめるアーカイバ。しかも実行できるというものです。つまり、1.rbが2.rbと3.rbをrequireしているとき、これら3ファイルを一つにまとめて持ち運びできます。しかも実行可能。
requireとloadを上書き定義します。で、アーカイブ内のファイルをrequireとloadで読めます。実行されるのはアーカイブ内の最初のファイル。ちょっと名前空間を汚してしまいます。REAR__というモジュールが内部で増えます。
名前の由来はruby executable archiverってことで。
$ ruby rear.rb -create archive.rb script.rb script2.rb .... という感じでアーカイブを作成。-create archive.rbの部分は省略可能で省略すると標準出力に吐きます。
上の例の後、ruby archive.rbとすると、script.rbが実行されます。script.rbでrequire 'script2'としていると、script2.rbはアーカイブ内から読み込まれます。さすがにshared-libraryはアーカイブに加えられませんが、$:に実行時のarchive.rbのパスを追加するので、同じ所に置いておけば読めるようになるはず。
$ ruby rear.rb -list archive.rbでアーカイブ内のリスト表示。
$ ruby rear.rb -extract archive.rbでアーカイブの展開。
Winとかだと、まとめたrbファイルをexeやcom(DOS時代のやつね)化すれば便利ではないでしょうか。
dw PropIni.rb
サンプルスクリプトをコメントアウトするのを忘れてるという、またもや 恥ずかしいミスをこっそり修正。
なかだ様に、無意味なMutexを使っているとのご指摘受けましたので、消しました。 いやはやお恥ずかしい...。ご指摘ありがとうございます。
スクリプトなどで設定を保存するためのもの... だったのですが。 実体は階層化されたHashをファイルに保存するものになっています。
設定項目を構造化出来る点が利点です(だと思っています)。 Marshalの出力とは違って手で編集可能です。 現在の所、文字列だけが扱えます。(数値へは文字列を単に変換するだけです)
例としては、prop["test"]などと書くのは普通として、
a=PropertyIni.new(filename)
a["test"]="sample"
a["hoge.foo"]=1
a["hoge.bar"]=2
function (a["hoge"])
a.save

などと書いたとき、functionには{ "foo"=>1, "bar"=>2 }のハッシュが引数として 渡されます。最後の行にて、filenameで示される設定ファイルに
test=sample
hoge.foo=1
hoge.bar=2

が書き込まれます。次にnewするときに、ファイルから読み込まれます。
設定ファイルは手で書けますが、改行コードはLFであることが必要です。 余分なスペースも無視されません。コメントは#にて。

dw rb2bat.rb
rubyスクリプトをDOS(というかWindows)のバッチファイルにします。それだけ。
ruby rb2bat.rb source.rb > target.bat ってして下さい。
ワンライナーの親戚。ruby hogehoge.rbなんてバッチファイルを作ったりしませんよ。

dw 駅すぱ〜との駅時刻表(クリップボードに転送出来るもの)をNextTrainフォーマットに
私個人は、PalmPilot用のTrainTimeで使用しています。
解釈するekispart.rb
NextTrainフォーマットに変換するtraintime.rb(要ekispart.rb)
VisualuRuby計画(仮称)を使った簡単なフロントエンドvreki.rb(要traintime.rbおよびVisualuRuby計画(仮称))
ekispart.rbの説明は以下。漢字コードは適当に合わせといて下さい。改行は"\n"
作り方
EkiTrainTime.new(駅の時刻表であるクリップボードのテキスト)
title,desc,warningを属性として持ちます。
titleは題名
descは列車種別と説明のHash。例えば {"行先"=>[["無印","京都"],["大","大阪"]], "列車種"=>[["快","快速"]]}
warningは、{" 6:10"=>"休日運休",... }のようなHash。でもまあ使わないでしょ(他のアクセス方法がある)
timetable(h)で、h時の時刻表を返します。
each(start=4)は、列車のあるすべての時刻をyieldします。
startはyield開始時刻。yield内容は|h,timetable|で、h時のtimetableです。
時刻表(timetable)のフォーマットは
[分, {列車符号のHash},運転日注意事項]を要素とする配列です。要素の型は[Integer,hash,String]
列車符号のHashはこんな感じ {"列車種"=>1,"行先"=>0}
列車種1の意味を知りたければ属性desc["列車種"][1]で、例えば["大","大阪"]が得られます。
行先0の意味も同様に、属性desc["行先"][0]で、["快","快速"]となります。
traintime.rb
単にto_sというメソッドを実装してるだけです。これがTRAIN形式の テキストを返します。運転日注意の情報を利用しないので注意して下さい。(ちょっとこれはパースしてられん)
使い方はファイルの最後にもありますが、 print EkiTimeTable.new(STDIN.read).to_s でフィルタの完成です。
vreki.rb
ウインドウが開きます。動作は、Windows環境のみです。 テキストエリアが2つあって、上が元テキスト、下が変換後です。保存ボタンを押すと変換後を保存できます。見比べて一応確認して下さい。
「お任せ」ボタンを押すと、クリップボードの内容を上のテキストエリアにコピー し、変換し、保存用のダイアログが出るところまで自動で進みます。
わかっているバグ
運転日情報を利用していないので、同じ時刻に複数の列車があるように見える場合があります。(例:54分発休日運休と54分発休日運行など)

dw WinUtil.rb
Windows上で私が(一応)便利に使っているモジュールとクラス。(最近MessageBox以外使ってないけど)
拡張ライブラリのWin32APIの皮として使ってます。
特徴は
Win32APIにコールバックが欲しい今日この頃。自分で作れって?ごもっとも。
あれ?CreateProcess付けたと思ったんだけど.. 無くなった?
Ruby-MLにクリップボード回りの話題があり、とても勉強になりました。 GlobalAllocなんかをうまいこと扱う手段あるんですね。

dw mciplay.rb
Windowsでマルチメディアを再生しようと言うアレです。MCI使ってます。 MCIでは録音や録画も出来るようなのですが、再生専用です。
当方の環境では、AVI,MPG,MOV,MID,MP3,WAVの再生を確認しています。 メディアプレーヤで再生出来るものならなんでもOKでしょう。 CDのも実は入っていますが、CTRL-Cなんかでうっかり止めてしまうとデバイスが closeされなくて、再起動するまで二度と再生できなくなります。
使用法はopen/play/pause/stop/closeなどを駆使して下さい。ファイルの最後に 例があります。seekはなんかちゃんと動いてないみたい。(000229)
またVisualuRubyを使うと再生終了などを捉えることが出来ます。 既存のウインドウに表示もできます。VisualuRuby使ったサンプルが mcitest.rb
MCIでもステータスとかポーリングすると再生終了捉えられるかも。 詳しくはMCIの参考資料見てください。


dw CyclicAgent
これこそ、なんとかのにぎわいかも。というか枯れ木でしょう。
RubyのMLでマスコットの話がでたのと、現在使っているWindowsの ポップアップサービス(winpopup.exe)が素っ気なさ過ぎることから、 MicrosoftAgentを使ってみました。 定期的に、あらかじめ登録された「なにか」をします。

リソースをとても食います。リークしてるのか、リソースを食いつぶして いきます(誰のせい?)。Agentとしては致命的ですね。 MS Agent以外のを作ればいいんでしょうか。 私は絵心がないので、こういう部品はありがたいのです。(だれか作ってくれー)
よしだむ氏がruby-chanってのを作られました。ここからたどって

形態は2種類。1つめはWindows単体で動くもの。 2つめは、Agent自体はUnix(Windowsでもよい)で動作し、UDPで別マシンの MS Agentなどを動かすものです。

動作させるべきスクリプトは、、 デフォルトでは、popサーバのメールチェックをする作業と、 雑談を表示する作業が登録されています(Main Partと書かれた所の下)。
Windows上でpopのチェックをする場合、チェック中は何かと遅くなります。

ファイルがたくさん入ってますが、本体はJobMan.rbのクラスJobManagerです。

例(MyAgentクラスが、MS Agentのクラスです)
      require 'JobMan'
      ja=JobManager.new(60, MyAgent.new("Genie","genie.acs"))

      ja.register Proc.new{|name,agent,logger| 
            [処理]
            }, interval_1,tagName
      ja.register Proc.new{|name,agent,logger|
                  say_fortune(agent,logger) },5,"Teller"
    
JobManager.newの引数は、定期的に駆動される秒数(分解能)と、Agentの2つ。
JobManager.registerの引数は、処理自身、間引き数、処理の名前の3つです。 分解能と間引き数を掛け合わせた時間毎に処理が行われます。
上の例では、60x5=300秒毎にsay_fortuneが呼び出されます。
実は別にMS Agentでなくても動かせます。agentという名前になってはいますが 何でも良いので、STDOUTをagentにして処理がagent.print "JOB\n"でも動きます。
popのメールチェックの設定などは、prop.iniに書くようにしたので、 実験時は適当に変更して下さい。
WinNetAgent.rbはVisual Basicで書き直されました。やはりMSものでOLEがらみだけに、相性がよいようです。リソースが謎なまま減っていく現象も起きません。ううむ。
諸般の事情により、VisualBasic版は配布無し。するとしてもソース配布でしょう。
VBにて書き直されたエージェント君の画面取り込み
それにしてもVisual Rubyって作れないものか。 →VisualuRuby計画
Ruby触った直後だと、いろいろうざったい>VisualBasic (991216)


ソフトウエアのページ

連絡先は
mailto: nyasu@osk.3web.ne.jp