2008-01-01から1ヶ月間の記事一覧
Thread#interrupt()でスレッドに割り込みます。 (特殊な場合をのぞき、)割り込まれると、スレッドの「割り込まれたフラグ」がtrueになります。 スレッドで実行中の処理がキャンセル可能であれば、定期的にこのフラグをチェックして「trueならキャンセルする…
next()でのタイムアウトをサポートするイテレータを作ってみました。 通常のjava.util.Iteratorのラッパーとして使え、 追加のAPIである「next (long timeout, TimeUnit unit)」を使うことで、タイムアウト指定ありの次要素取得が可能です。 タイムアウト有…
サブクラスから継承元クラスのAPIを呼び出すときに使うsuperですが、RubyのそれをJavaのごとく使ってしまい痛い目に。 Javaが↓こんなだからって、 void hoge() { // 継承もとクラスのhoge()を実行。 super.hoge(); } Rubyでおなじノリで書いちゃダメです。 d…
プロセスが開いているファイルを調べる方法を知ったのでメモ。「lsof」コマンドを使います。 以下は プロセス「26163」が開いている 「/dev」配下のファイル を調べる場合の例。 $ lsof -p 26163 -a +d /dev実行結果です。 COMMAND PID USER FD TYPE DEVICE …
Signal.trapでシグナルが送付された場合の処理を指定できます。これを使ってプログラム実行中にCtrl+Cが押された場合(SIGINTのシグナルが送付される)に特別な処理を実行できます。 # Ctrl + C で停止させられた場合の処理を登録 Signal.trap(:INT){ puts "SI…
Deamonizeのソースより。ObjectSpace.each_object()を使うと、生成されているオブジェクトの一覧を取得できます。引数でクラスorモジュールを指定すると、そのクラスorモジュールを継承するオブジェクトが列挙されます。 # ねこ class Kitten def initialize…
rubyプログラムをdaemonとして実行する方法について。 deamon化の手順 deamon化の手順については「PC覚え書き-プログラムのデーモン化」の解説が詳しい。ポイントは次の通りです。 子プロセスの生成 fork関数を実行して子プロセスを生成し、親プロセスを終了…
Rubyのライブラリで、たまに次のようなコードが最後に付いているソースを見かけます。 ... ライブラリの実装(省略) if __FILE__ == $0 ... ライブラリのサンプルコードらしきもの end 何かと思ったのですが、こうしておくと ライブラリがrubyで直接実行され…
今日の不具合。String#replaceFirstの機能は「指定された正規表現にマッチする最初の文字列を置換する」です。「指定された文字列と同じ最初の文字列を置換する」わけではありません。サンプル。 // こういう場合はうまく置換されるけど、 String path = "/a…
「raise 」した場合、文字列をメッセージに持つRuntimeErrorが発生します。JavaScriptみたく文字列がそのまま飛んできたりはしません。 begin raise "test" rescue RuntimeError puts $!.to_s end 実行結果です。 testRuntimeErrorはStandardErrorのサブクラ…
Module.constantsでモジュールで定義された定数名の一覧を取得できます。 module Test FOO = 0 VAR = 1 # 定数: ねこID KITTEN_MII = 0 KITTEN_TORA = 1 KITTEN_SHIRO = 2 KITTEN_KURO = 3 end puts Test.constants 実行結果です。 KITTEN_SHIRO KITTEN_TORA…
モジュール関数は「def . ... end」の形式で定義する以外に、「Module#module_function」を使って作成することも可能です。 「Module#module_function」はModuleのprivate関数です。 引数つきで実行した場合、指定した関数(シンボルで指定)がモジュール関数…
わざわざ自作しなくても、Yahoo! UI Library: Profilerなんてのもあります。 オブジェクトや関数をプロファイル対象として登録しておくことで、その後の処理で行われた関数の呼び出しを記録/集計してくれます。 回数、平均呼び出し時間、最大/最小呼び出し時…
インスタンスイニシャライザを指定すると、クラスのインスタンス生成時に特定の処理を行うことができます。 クラスの直下( class Hoge { /*ここ*/ } )に「{;...}」の形式で書きます。 スタティックイニシャライザと同じノリですね。 指定した処理は、オブジ…
コンテナで管理しているコンポーネントのプロファイルを取るユーティリティを書いてみました。グローバルインターセプターを使ってさくっと作れます。 コンテナで管理しているコンポーネントのメソッドを呼び出した回数、所要時間を集計して表示します。 コ…
クリック証券にアクセスして、FXのレートを取得するスクリプトです。 ClickClientを利用して、クリック証券WebServiceにアクセスし、レートを取得します。 利用にはクリック証券のアカウントが必要です。 レートは10秒ごとに取得。強制終了するまで動きます…
Enumerable#injectを使うのがスマートかな。 array = [12,343,112,55,74,11] # 配列の平均値を得る。 puts array.inject(0.0){|r,i| r+=i }/array.size # ↑は↓と同じ total = 0.0 array.each{|i| total += i} puts total / array.size 実行結果です。 101.16…
Selector Utilityを使うと、CSSのセレクタを使ってそれにマッチする要素を探索することができます。 CSS3 Selectorが使えるとのこと。 特定のノードを指定して、その配下を対象に検索できます。 マッチしたノードすべてを配列で返すほか、最初に見つかった要…
Chartを使ってCSVから折れ線グラフを作るサンプルです。 サーバーからCSVファイルをダウンロードして解析し、グラフを作成します。 Chartの基本的な使い方はこちらを参照 YAHOO.widget.Chart.SWFURL = "http://yui.yahooapis.com/2.4.0/build/charts/assets/…
Findを使うと、ディレクトリ配下のファイル/ディレクトリ一覧を簡単に列挙できます。 require 'find' # ./tmp 以下のファイルを列挙する。 Find.find('./tmp') {|f| puts f } 実行結果です。 ./tmp ./tmp/dir ./tmp/dir/c.txt ./tmp/dir/b.txt ./tmp/dir/a.t…
Rubyのスレッドは、スレッド固有のデータを持つことができます。Thread.currentで現在実行中のスレッドが取得できるので、これと組み合わせてJavaのThreadLocalのように使うことができます。 ts = [] 3.times{|i| ts << Thread.fork(i) {|i| # # スレッド固…
Futureパターンは、時間のかかる処理の非同期実行と処理完了の待ち合わせをスマートに行うためのパターンです。 非同期スレッドの開始や待ち合わせ処理を、非同期実行を開始する関数と引換券に隠蔽し、 呼び出し側や時間のかかる処理でスレッドを意識する必…
Java5で追加されたStringBuilderについて。名前は聞いたことあるけど使ったことはなかったりするので調べてみた。以下Javadocより。 文字の可変シーケンスを表すクラス StringBuffer とだいたい同じAPIを持つ スレッドセーブではない。(StringBufferはスレッ…
文字列を「%」形式にエスケープする関数を書きました。「%」形式はURLエンコードで使われるエスケープの方式です。URLエンコードではaとかbとかURLで使える文字列をエスケープする必要はありませんが、この関数はすべての文字列を容赦なくエスケープします。…
JSLintというJavaScriptの検証器を発見したので、早速ContainerJSをチェックしてみました。WebUIが用意されているのでソースコードをコピペしてボタンを押すだけ。簡単に使えます。で、以下が見つかった不具合。 行の終わりにセミコロンがない。 なにげに結…
JavaScriptのコメントを抜き出すプログラムを書いてみました。strscanを使うとさくっとできます。 require 'strscan' require 'kconv' class Tokenizer def tokenize(str) tokens = [] s = StringScanner.new( str ) while ( !s.eos? ) if ( s.scan( /\/\*((…
組み込み関数のsprintfを使うと簡単に実現可能です。具体的には次のようにします。 f = 108.233533 puts sprintf( "%.3f", f ) 実行結果です 108.234"%.3f"の部分が出力フォーマットを指定している部分で、以下の形式で書きます。(Rubyリファレンスマニュア…
スレッド間で処理の完了を待ちあわせるには、ConditionVariableを利用します。ConditionVariableはJavaのウェイトセット(Object#wait,notify,notifyAllを使って行うアレ。)のような機能を提供するクラスで、これを利用してスレッド間での待ち合わせ機構(Guar…
tmpdirをrequireすると、Dirクラスに一時ファイルディレクトリを取得するAPIが追加されます。 require 'tmpdir' # 一時ディレクトリを取得する関数が追加される。 puts Dir.tmpdir 実行結果です。(Windows環境) /cygdrive/c/DOCUME~1/<ユーザー名>/LOCALS~1/…
timeoutを使うと、任意の処理の実行時間をチェックし、指定時間をオーバーした場合例外を発生させることができます。 require 'timeout' # 0.1秒以内に処理が終わらない場合、タイムアウトする。 timeout(0.1) { sleep 1 puts "end" } 実行結果です。 xxx/ti…