2009年10月25日

とちぎRuby会議02 - その1(LT)

slide_000

とちぎRuby会議02がありました!普段は技術や「普及するには?」ということについて語られることが多いIT系イベントですが、仕事としてのマインドについて多くのメッセージを聞くことができました。今回はその中でLTの発表をしてきましたので、スライドとスクリプト(時間の関係でかなり削りましたが)を公開します。裏切り者感たっぷりのスライドですが、最後までおつきあいください。

slide_001

今回ご紹介したいものが、このSphinxです。

slide_002

Wikiみたいなプレーンテキストの簡易マークアップから整形してくれるツールです。相互リンクも張ったり、索引を作ったりもしてくれる。LaTeXを経由しないPDF出力は現在活発に開発されている部分。これができるとかなり強力です。コードハイライトも、nginxというリバースプロキシーサーバの設定ファイルみたいな、超マニアックなフォーマットのハイライトにも対応していたりします。

slide_003

僕の最近の活動はSphinx関連が多いです。

slide_004

まずはドキュメントの翻訳。夏休みをつぶしてやりました。今も普通に使う部分はほぼ完了。拡張機能周辺だけが残っている状態です。浴衣の女性とかが街を歩いているわけですよ。花火大会、お祭り。Sphinxには、そのような一夏の思い出を捨てでもなお、価値があります。

slide_005

あとは検索の多言語対応。これはパッチを投げています。開発者の人は忙しそうなので、取り込まれるかはわかりませんが。

slide_006

テキストで擬似コードを書くと、シーケンス図をSphinxに画像にして入れてくれるプラグインも作りました。

slide_007

それではインストールの仕方の説明をしていきます。まず準備としてしておかなければならないことがあります。この会場はMacを使っている人が多いと思うので、Macの説明だけしますね。

slide_008

(メモ:)ここは1文字ずつ増えていくように20枚以上スライドがあって、タイピングしているような演出をしました。

slide_009

残念ながら、SphinxはPythonで書かれたプログラムだったのです。すみません。

続きを読む
posted by @shibukawa at 11:35 | Comment(69) | TrackBack(1) | Ruby はてなブックマーク - とちぎRuby会議02 - その1(LT)

2009年08月12日

RubyでJavaのsynchronizedを

注意!コード間違ってました。インスタンスを2度生成すると、aliasが2度働いて無限ループになってしまいます。initialize内のコードが2度走らないようにする必要があります。


taken by sun dazed under CC-BY-SA

最近Rubyで遊んでいます。本当はRubyで遊ぶのが目的ではなかったのですが。今までの変遷。

PySpecの新バージョンを作ろう
→PySpecの新バージョンでは新しいアーキテクチャーに挑戦しよう
→軽量メッセージキューを実装しよう。名前は栃木っぽくberryMQ
→せっかくMQなら多言語対応しないと面白くないよね。Ruby版作ろう。
→言語間の通信はXML RPCでもいいけど、JSON RPCかな?Ctrl+Cで止まらないの不便だな
→Rubyはデコレータないのか?似たようなやつに挑戦してみるか?
→MQでPythonのAPIではメソッドの上書き使っているけど、Rubyではどうやるんだろう?←イマココ

ということで、遠回りしまくってます。で、Rubyのメソッドの上書きをやろうと思ったのですが、なかなかうまくいかず、@takaiのアドバイスを元にうまくいきました。せっかくできたのだし、toRubyでスレッドとかミューテックスあたりの勉強をしていることもあり、Javaで「内部実装はすごい」という噂のsynchronizedを実装してみました。使ってみたサンプルコードはこんな感じ。デコレータと組み合わせて、メソッド宣言の前にsynchronized宣言をpublicとかみたいに書くことで、インスタンスのロックが自動で行われるようになります。あと、Javaっぽい、メソッド内でのsynchronizeブロックもできます。

最初、synchronizedの仕様を誤解していたけど、咳さんにアドバイスをもらって、修正しました。@takaiさん、咳さん、ありがとうございました。

class TestClass
  include Synchronizable
  
  synchronized
  def test_method1(name)
    3.times do |i|
      puts "test_method1 => #{name}: #{i}"
      sleep 1
    end
  end

  def internal_lock(name)
    synchronize do
      3.times do |i|
        puts "internal_lock => #{name}: #{i}"
        sleep 1
      end
    end
  end
end
 
sample = TestClass.new()
thread1 = Thread.new {
  sample.test_method1("sub thread 1")
}
thread2 = Thread.new {
  sample.internal_lock("sub thread 2")
}
sample.test_method1("main thread")
thread1.join
thread2.join

実際のコードは「続きを読む」からどうぞ。

続きを読む
posted by @shibukawa at 10:02 | Comment(41) | TrackBack(1) | Ruby はてなブックマーク - RubyでJavaのsynchronizedを

2009年07月26日

RubyにもPythonのデコレータを

Pythonのデコレータがとっても便利です。すごくステキ。シンプルな文法のシンタックスシュガーなのに、夢がすごく広がります。僕がデコレータを本格的にさわったきっかけは、TurboGears。ビューのクラスのメソッドに、@exposeとやると、そのメソッドがルーティングテーブルに登録されて、ブラウザからそのメソッド名のURLをたたくと、外から呼び出せるようになる、という仕掛けです。実際に、内部で行われている処理はこんな感じです。

#pythonのデコレータのサンプル
@expose
def exposed_method():
  pass

#こうやって解釈される
def expsed_method():
  pass
exposed_method = expose(exposed_method)

PySpecではテストメソッドの宣言をしたり、wxPythonのユーティリティ関数でイベントハンドラを定義したり(@expose(wx.EVT_BUTTON, "EXIT_BUTTON)みたいな感じで定義できるようにしている)、メソッドに新しい情報を付加したり、関数をラップして処理を割りこませたり、もう、これなしでは設計できないぐらい、いつも便利に使っています。

Rubyにも、デコレータ的なメソッドがあります。publicとかですね。publicと書いたら、その後に定義されたメソッドが全部publicになるという。きっと、「これから登録されるメソッドの公開度はこうしますよ」という情報がクラスの中にあって、それが設定されるような感じかな、と思っています。というわけで、このpublicみたいに、クラス宣言の中で使えて、メソッドに情報を付加するという、デコレータ的な仕組みを実装してみました。サンプルコードとしてはこんな感じです。

class TargetClass
  include DecoratorEnabler # includeするとデコレータ"expose"が使用可能に
  # これは公開しないメソッド
  def not_exposed_method
  end
expose
  # これは公開するメソッド
  def exposed_method
    p "exposed_method()"
  end
end

実現にあたっては、twitter上で、@itawasaさん@shimizukawaさん, @ikasamtさんから参考情報などを教えていただきました。ありがとうございます。

サンプルコードでは使っていませんが、publicとかと違い、メソッドの呼び出し時にパラメータも渡せるようになっています。それでは実装を公開します。

続きを読む
posted by @shibukawa at 17:39 | Comment(127) | TrackBack(1) | Ruby はてなブックマーク - RubyにもPythonのデコレータを
検索ボックス

Twitter

www.flickr.com
This is a Flickr badge showing public photos and videos from shibukawa.yoshiki. Make your own badge here.
<< 2017年05月 >>
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
最近の記事
カテゴリ
過去ログ
Powered by さくらのブログ