Create  FrontPage  Index  Search  Changes  Login

RealWorldRuby

Ruby活用事例集

ユーザーによって Ruby がどのように活用されているのか,さまざまの事例紹介を集めています。自分の事例を紹介したいという方は,どんどん書き加えてください。

とりあえず関西オープンソース2004で、この事例集を利用させていただきました。引き続き募集しておりますのでよろしくお願いします。

事例紹介テンプレート

次の情報を記載してください。

  • その事例のタイトル
  • 組織・個人名(匿名・仮名でも可能)
  • 対象とする問題の概要
    • 公開してもいい範囲で、Ruby で何を解決するか、それについて。特に難しいところなどあれば、それについて教えてください。
  • Rubyによる解決の概要
    • 上記問題について、Ruby でどう解決したか。Ruby だから、という部分があると嬉しいです。
  • その他,感想など(Optional)

字数の上限、下限は特に設けませんので、短い事例も、複雑な事例もお寄せください。

海外事例集

Ruby Garden に事例集があります。

http://www.rubygarden.org/ruby?RealWorldRuby


気象観測データの総合的処理

組織または個人名(匿名,仮称も可)

小波秀雄, 京都女子大学

対象とする問題の概要:

Win2000上のアプリケーションを使って24時間取得している気象観測データ(太陽光デー タ,気温,気圧その他)があって,その内容は1時間ごとに CSV ファイルとして特定のデ ィレクトリに書き込まれている。このデータ処理として次のような業務を必要と している。

  • これから得られる膨大なデータファイルをディスク上に整理された形に再配置すること
  • バックアップのためにデータをサーバ(FreeBSD/Alpha,HTTPサーバも兼ねる)と,外部の研究機関に置かれたPCに転送すること
  • このサーバ上でオンデマンドのデータ可視化サービスを提供すること

Ruby による解決の概要:

Win2000機上では,データファイルをディレクトリツリーに移動・再配置, tarball 化,Alpha 機への ftp 転送を Ruby/Cygwin によるアプリケーションで実現してい る。 Rubyの File 関連機能,ネットワーク関連ライブラリが使われる。

処理はタスクマネージャによって自動的に行われる。

Alpha サーバ上では,tarball の解凍,月ごとのデータへの変換,外サーバへの転送, オンデマンドの可視化を Ruby アプリケーションによって実現している。ここでは CGI 関連ライブラリとネットワーク関連ライブラリが活用されていて, cron によって毎日と毎月の処理が自動的に進められる。

ひとこと:

私にとっては Ruby があるからこれをやってみる気になったようなものです。それまで知っていたどの言語でも絶対にやる気力が湧かなかったはず。プログラムの腕そのものは稚拙ですが,稚拙でも使えるという点は,まさに Ruby さまさまでした。

ネットワークを活用した製造装置監視カメラの自動制御とエラー通知システム

組織または個人名(匿名,仮称も可)

株式会社ミッタシステム

対象とする問題の概要:

プラスチック射出成型機のエラー信号を受けて ネットワークカメラの向きを変更、画像を保存し、メールを送信する。

特に難しいところ

  • 開発に時間をかけられない。
  • 現物なしに開発する必要がある (実地で調整する必要がある)。

Ruby による解決の概要:

射出成型機のエラー信号を TCP ソケットで受け取れるようにしておく (Hello Device 1100 を利用)。

WinXP 機上に仕掛けを用意するため Apollo (Delphi/Ruby) を導入した。

最初は Apollo で管理画面を用意したが、その後、外部から管理したい との要望を受け、設定ファイルをサーバに置き、CGI(Ruby) を用意した。 これはその場で実装できた :)

エラー信号の受信部

Ruby の TCPSocket を用いると数行で実装できた。

 # エラーチェックは省略
 s = TCPSocket.open("192.168.11.20", 6001)
 s.write "?x75?x00?x00?x00"
 str = s.read(4)

 i0 = str[0]
 i1 = str[1]
 puts "%04d: %08b %08b" % [cnt, i0, i1]

ネットワークカメラの操作

操作用の CGI が提供されているので Net::HTTP を用いた。

画像の保存

ネットワークカメラが MJPEG で画像を流すので、以下のように処理した。

 HEADER = "--myboundary?nContent-type: image?/jpeg?n?n"
 IMAGE_DIR = "/cam/images"

 @camera_host = "192.168.11.18"
 @camera_port = 8080

 def capture(host=@camera_host, port=@camera_port, user='', passwd='')
   request = Net::HTTP::Get.new('nphMotionJpeg?Resolution=160x120&Quality=Standard')
   request.basic_auth(user, passwd)

   buf = ''

   Net::HTTP.start(host, port) {|http|
   http.request(request) {|response|
   response.read_body {|body|
     idx = body.index(HEADER)
     if idx.nil?
       buf << body
     else
       buf << body[0, idx-1] if idx != 0
       unless buf.empty?
         time = Time.now
         fname = time.strftime('%Y%m%d%H%M%S') + '.jpg'
         open(File.join(IMAGE_DIR, fname), 'wb') do |o|
           o.print buf[buf.index("?xFF?xD8") ... buf.rindex("?xFF?xD9")+2]
         end
         return fname
       end
       buf[0..-1] = body[idx+HEADER.size .. -1]
     end
   }}}
   nil
 end

メールの送信

Net::SMTP を用いた。 サーバへ画像をアップロードし、メールにURLを記すようにした。 アップロードもメールで行った。 画像をメールに添付し TMail を用いてメールサーバで処理した。

おわりに:

Ruby (言語と有用なライブラリ群) のおかげで容易に開発できた。 上記のプロジェクトの成功を受けQRコードを用いた管理システムを 受注できたのだが、これも Ruby で開発する予定である。

Adobe Illustratorの機能を強化するためにライブラリ作成

組織名:

志村 (hs9587)

対象とする問題の概要:

Adobe Illustrator で図を書く。

折り紙の折り線図を書く必要があった。

  • 後工程(イラストレーター、デザイナーによるテクスチャーやレイアウト)の便宜のため、Adobe Illustrator 形式のデータが望ましい
  • 頂点等三角関数での座標計算での指定を原則とする。
    • マウスと対話式入力による描画では難しい。
  • Asobe Illustrator (ver. 10以降、ver. 9 では拡張機能)自体のスクリプト機能は、まだ原始的(Illustratorでの手作業に即したものである)で抽象化が十分でない。例えば、
    • 「点A から点B までの線を与える」というようなことは定義されていない
    • 「描画オブジェクトを作成し、端点を二つ作成し、夫々の座標をA、Bとし、点の種類を指定し、辺は線で繋ぐようにし、内部は塗らない」とか。

Rubyによる解決の概要:

Windows版 Illustrator について、Win32OLE 経由でそれを呼び出し、 スクリプト機能をラップするとともに、線を引く (山折り線、谷折り線)、字を書く 等 ある程度抽象化したライブラリを作成して作図した。

Win32OLE にて method_missing による Illustratorメソッドの呼び出しを、 途中で捕まえることで、(Illustrator側で)レベルの異なるオブジェクトの メソッドを (Ruby側では)統一的に扱えるようにした。

これには、各種オブジェクト、メソッドを自由に再定義できるという、 Ruby の特質が非常に便利だった。

ライブラリ 作成中に遭遇したちょっとしたことは下記に記載。

ActiveScriptRubyでIllustrator 10

作図例

「ハロと風船の折り紙 」

北野勇作どうぶつ図鑑(1〜6)【ハヤカワ文庫JA】北野勇作 2003/4〜2003/6, イラスト 西島大介 / デザイン 大塚ギチ

  • (1)ISBN-4150307164 かめ
  • (2)ISBN-4150307172 とんぼ
  • (3)ISBN-4150307180 かえる
  • (4)ISBN-4150307199 ねこ
  • (5)ISBN-4150307245 ざりがに
  • (6)ISBN-4150307253 いもり

各、表題の動物の折り紙の彩色折り紙展開図を折り込み。 山折り線、谷折り線いり展開図は、上記方法で作図したものに、 西島大介さんがイラストを付けたものです。

アニメージュ 2003年10月号 徳間書店 別冊付録「SEEDであそぼ!BOOK」ガンダムSEED折り紙教室

「キラが避難民の少女にプレゼントされた、あの花の折り紙を作ってみよう!」

折り方説明図。上記方法で作図したものを、アニメージュ編集部のデザイナーさんが レイアウト、写真添付など完成させたものです。

研究のインフラとしての Ruby

組織または個人名:(匿名,仮称も可)

九州工業大学 情報工学部 知能情報工学科 野村・中村研究室

対象とする問題の概要:

自然言語処理の研究に際しては小道具としてのプログラムやデモプログラムで 様々なテキスト処理が必要となります. 当時,テキスト処理能力と開発効率とに優れていることから Perl を 使っていたのですが,大きな問題がありました. 大学の研究室としての性格上,学生の入れ替わりに伴って引き継ぎが必要と なるわけですが,他人の書いた Perl スクリプトは非常に読みづらく, 読み解くよりも自分で書き直した方が早いというケースが多発しました. そこで,Perl と同等以上のテキスト処理能力と開発効率を持ち,Perl よりも 読みづらいプログラムに *なりにくい* ような言語が求められました.

Ruby による解決の概要:

候補に上がったのは Python と Ruby (1.1b くらいだったと思います) でした. Python は「インデントで構造が決まる」という点から,エディタを十分には 使いこなしていない学生が扱う際のタブ設定の違いや操作ミスから思わぬ トラブルを招くことを恐れたため不採用とし,Ruby を選択しました. 今では,研究室に配属された学生に毎年 Ruby のゼミを行っています. Ruby を使うようになってからは,Perl を使っていたころよりも 以前の研究資産が無駄になることが少なくなりました.

メールHack3題

組織・個人名(匿名・仮名でも可能)

にしたかお

対象とする問題の概要

  • 1. 携帯電話へのメール転送
  • 2. メールでのスケジュール管理
  • 3. メールへのRSS配信

Rubyによる解決の概要

1. 携帯電話へのメール転送

postfixの拡張メールアドレス機能とrubyスクリプトを組み合わせ,携帯電話 へ転送したメールに直接返信しても携帯電話のメールアドレスが表示されない よう下図のような書き換えを行う。

 転送元メール
 From: somebody@bar.com
 To: me.mbile@hoge.jp
     ↓
 転送用スクリプトによるアドレス書き換え
     ↓
 From: me.recv.keyword.somebody._40_.example.com@hoge.jp
 To: me.mogemoge@docomo.ne.jp
 返信
 From: me.mogemoge@docomo.ne.jp
 To: me.recv.keyword.somebody._40_.example.com@hoge.jp
     ↓
 返信用スクリプトによるアドレス書き換え
     ↓
 From: me.mbile@hoge.jp
 To: somebody@bar.com

第三者に返信用スクリプトを利用されないよう,返信用スクリプトでは Recieved:ヘッダ,Fromヘッダにより送信者を確認するとともに,転送用スク リプトでFromにランダムなキーワードを埋め込み保存,返信用スクリプトでは 保存されたFromに合致するToにしかメールを転送しないようにしている。

青木峰郎氏作のTMailライブラリおよびRuby標準添付のnet/smtpライブラリを 使用することで,転送用スクリプト,返信用スクリプトともに30行程度で上記 機能を実現している。

2. メールでのスケジュール管理

特定のアドレスにスケジュールを書いたメールを送信することで,imap対応メー ラおよびWebでスケジュール確認を行っている。(MHCのimap/web対応,機能縮 小版)

スケジュールの登録は,TMailなどを用いたRubyスクリプトでメールのSubject および本文からスケジュール対象となる日付,時刻を推測し,Date:および Subject:ヘッダを書き換え,日付別のimapフォルダに配信する事で行い,確認 は,imap対応メーラ,高林哲氏作mobileimapなどを用いて行っている。

3. メールへのRSS配信

RSSリーダの無い環境でRSSを受信できるよう,net/http, rexml, TMailなどの ライブラリを使用して,受信したRSSをメールに配送するRubyスクリプトを作 成した。(この成果物は24hoursとして公開している。)

その他,感想など

いずれもRubyならではという利用方法では無いが,ほぼその場の思いつきでコー ディングを開始し,1時間程度で実利用が可能となった。 充実したライブラリとRubyの生産性の高さのおかげであろうと感じている。

機器のシステムログの解析等

組織または個人名:(匿名,仮称も可)

匿名

対象とする問題の概要:

Rubyを適用している業務課題はいろいろあります。 最も便利なのが機器のシステムログの解析でしょうか。 grep でがんばって集計するのもありですが、 Rubyを使うと正規表現と後方参照がシンプルに書けるのが楽ちんです。

例えば、ある機器に正常にログインしたユーザーのログをmatch するのに

## regexp for login log

ip_exp = /\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]/
time_stamp_exp = %r|(\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2})|
uid_exp = /\w+\(.+\)\[(.+)\]/
host_exp = /(\w+)/

login_exp = /#{ip_exp} - #{uid_exp} - #{time_stamp_exp} - #{host_exp} - Login succeeded for/

File.open(log_file).each{|line|
    if matched = login_exp.match(line) then
        # extract fields
        ip = matched[1]
        uid = matched[2]
        time_stamp = str2time(matched[3])
        host = matched[4]
.......

と、正規表現のパーツを書いておいてから合成できるんで、 長い長い暗号のような正規表現を書かずにすみますし、 他人にみせたときもわかりやすい。

正規表現に加えて重宝するのが Marshal.dump/load です。 syslog サーバー上で、複雑な解析後に生成したカスタムクラスの配列や、 HashのHash などの複雑なデータ構造も、 Marshl.dump 一発でファイルに落とせます。 (Python にもあるっていわないで。。。)

dump した解析データファイルはWindows に持ってきて、 Marshal.load して、win32ole でExcel にぺたぺた。

Ruby による解決の概要:

正規表現が書きやすく他人にわかりやすく記述できる(と、私は思っている)。

Ruby がunix, Windows の両プラットホームをサポートし、 Marshal.load/dump でデータを簡単に持ってくることができるので(一般人向け)レポート作成に便利だ。

IMAPの未読確認

組織・個人名(匿名・仮名でも可能)

したも

対象とする問題の概要

IMAPで全フォルダの未読がないかを確認する。 (フォルダを指定して調べるツールが多かったので勉強がてらに…)

Rubyによる解決の概要

Net::IMAPとRuby/GTK2を利用してとりあえず判るようにはした。

その他,感想など

理解してないので間違いだらけかと思いますが…誰か正しい使い方を教えてくれるとうれしいなあなどと甘えた考えをもってここに記載させていただきます(こら)。

Rubyを使った電気測定のデータコレクション

組織名:

千葉大学工学部共生応用化学科  西山 伸

対象とする問題の概要:

  • 自作測定装置についているデジタルボルトメータの値を一定時間ごとにGP-IBインターフェースを介してパソコンに読み込み、そのデータをいろいろ加工して画面にプロットする。
  • これを、Windowsしか触ったことのない学生でも使えるインターフェースにする。
  • こういう場合普通VisualBasicを使うことが多いかもしれないが、お金をあまりかけたくない(OSは仕方ないけど)。あと、VBはやっぱり使いたくないし・・・:)。

Rubyによる解決の概要:

  • 古いAptiva + Windows98 + Cygwin + Ruby 1.6の環境を用いた。
  • GP-IBインターフェースカードの制御部分(データ取り込み部分)のみCでライブラリを書いた。
  • 残りのロジック(たとえば、熱電対の発生電圧から温度を求めるなど)はRubyで書いた。このあたりは、クラスライブラリにしておいたので、再利用可。
  • GUI部分は、NyasuさんのVisualuRubyを用いて作成。すごい簡単。ただし、前に使っていたN88Basicのプログラムと操作性で互換性を持たせる。

スクリーンショット:seebeck.gif

感想:

はっきりいってRubyがなかったら、GUIを使ったプログラムは作ろうとは思わなかったし、 まともに完成させることもできなかったと思う。

私は材料の研究者で、プログラミングにはそれほど時間を避けられない。なのでVC+MFCは 覚えられなかったし、Javaも前に少し使って辟易していた。 Rubyを知らなかったら、むかーし作ったN88Basicでのプログラムを使いつづけるか、CUIを 学生に強いるかだったと思う。

ほんとにRubyには感謝しています。何かプログラムで問題を解決しようとするとき、 Rubyの生産性は驚異的だと思う。

Last modified:2005/07/13 16:50:29
Keyword(s):
References:[FrontPage] [TODO] [過去のニュース]
This page is frozen.