2009-06-01から1ヶ月間の記事一覧
Thread#raiseで、任意のスレッドで強制的に例外を発生させることが可能です。 例外なので、スレッド内で捕捉(catch)して処理を振り別けることができます。 ensureブロックもちゃんと実行されます。 t = Thread.fork { begin p "start" i = 0 while true p i+…
メモリリークも改修できたようなので、クリック証券プラグインを標準添付としたものをjiji-1.1.2としてリリースしました。→Github - unageanu/jiji といっても変更点は、依存モジュールにunageanu-clickclient_scrapを追加しただけです。あと、解説サイトの…
諸般の事情でCygwin環境を新規に作成していたのですが、www::mechanizeのインストール(正確には、その依存モジュールのnokogiriのインストール)で以下のエラーになってはまる。 Building native extensions. This could take a while... ERROR: Error instal…
WikipediaのDependency injectionのページに掲載されてちょっとやる気が出たので、ContainerJSに自動インジェクション機能を追加し、ver 0.4.0としてリリースしました。→Google Code - ContainerJS自動インジェクションは、依存性注入が必要なプロパティに規…
昨日の続き。includeしたmoduleのconst_missingは実行されないわけですが、ふと思い立って以下のコードを試してみたら無事動作しました。戦略的には、 includeしたクラスでconst_missingを定義しておき、 その中で、includeしたモジュールから定義を探す。 …
モジュールで定義されていない定数を参照したとき、Module#const_missingが実行されます。 module A AAA = "AAA" def self.const_missing(id) return "BBB" if id == :BBB raise "not found." end end puts A::AAA puts A::BBB 実行結果です。 AAAは定数とし…
とある製品のWebUIがAJAXな感じになっていたので、どれどれと思ってソースを拝見。 $(foo) とかあって、「お、prototype.jsかな」と思ったらjQueryだった・・・。そのプロジェクトに限らず、最近はjQueryが流行ってる気がするので、そろそろ勉強し始めようか…
RSIを算出するクラスです。 module Signal #===一定期間のレートデータを元に値を算出するシグナルの基底クラス class RangeSignal include Signal def initialize( range=25 ) @datas = [] # レートを記録するバッファ @range = range end def next_data( d…
最小二乗法で配列内の値の傾きを得る関数です。このサイトを参考に実装しています。 #===最小二乗法で、配列内の値の傾きを得る。 #datas:: 値の配列 #戻り値:: 傾き。0より大きければ上向き。小さければ下向き。 def vector( datas ) # 最小二乗法を使う。 …
「uuidtools 2.0.0 と組みあわせて使うとバックテスト実行時にエラーになる」というご報告を頂いたので(ありがとうございます!)、それを改修したjiji-1.1.1をリリースしました。→Github - unageanu/jiji 問題の詳細は以下を参照ください。また、これに加えて…
先週公開したjiji用クリック証券アクセスプラグインですが、連続で2,3日動かしているとメモリ使用量が酷いことに・・・。申し訳ありません。 原因 ※注: 以下はWWW::Mechanize0.9.0 のソースを対象に調査した結果です。ということで、ツールを作って調査して…
癒しを求めてSVNリポジトリを徘徊していたら、昔書いた懐かしいコードを発見したので公開してみます。 任意の処理を実行し、 処理の戻り値または例外を評価して、リトライする必要がある場合、 指定された回数だけ再試行する ための、ユーティリティです。 /…
あれ、Math#maxってないんだっけ。どっかで見た覚えがあるんだが・・・と思ったらこれでした。最大の整数が欲しい場合は、これを使ってこんな感じで書くのがスマートかな。 a=3 b=7 c=5 # 最大の整数を得る。 p [a,b,c].max 実行結果です。 7
任意のインスタンスの所有者(インスタンス変数としてインスタンスを保持するインスタンス)を探索するクラスを書いてみました。 ObjectSpaceを使ってインスタンスを列挙して、全ての所有インスタンスのIDを記録。 記録したデータを元に、逆引きで所有者の一覧…
クラスごとのインスタンスの数を数える関数を書きました。 #インスタンスの数を数える def count_instance count = {} ObjectSpace.each_object {|object| clazz = object.class.to_s count[clazz] ||= 0 count[clazz] += 1 } return count end #インスタン…
いまさらですが、標準出力と標準エラーを同じファイルにリダイレクトするには、リダイレクト先を以下の通り指定します。 $ ruby -e "STDOUT << 'test';STDERR << 'error' > test.txt 2>&1実行すると、"test.txt"に以下が記録されます。 errortest解説はこの…
指数移動平均を算出するライブラリです。 ちょっとリファクタして、移動平均や加重移動平均と共通部分を親クラスに移動しています。ファイルも1つに統合して、APIも微妙に修正してます。 あと、加重移動平均の加重が逆(古いものを重視)だったのも修正してま…
スクレイピング版ClickClient ver 0.1.3をリリースしました。→Github - unageanu / clickclient_scrapこのバージョンから、jiji用のクリック証券アクセスプラグインをリリース物に追加しています。jijiに加えてclickclient_scrapを環境にインストールして設…
配列だとtoString()とかできないので、(これも原罪というやつか) String[] strs = new String[]{ "a", "b", "c" }; System.out.println( strs != null ? Arrays.asList( strs ) : "null" ); とかいう感じで書いていたのだけど、Arrays.deepToString()とかあ…
↓のようなコードがたくさんあって、 int result = 0; result = <処理1>; if( result != 0 ) { return result; } // end if result = <処理2>; if( result != 0 ) { return result; } // end if result = <処理3>; if( result != 0 ) { return result; } // e…
System.exit()が好きなコードですが、案の定、必要な後始末をせずにSystem.exit()してるじゃないか!と思ったら、ShutdownHookが仕込まれていた。 Runtime.getRuntime().addShutdownHook( new Thread() { public void run() { System.out.println("x"); } });…
ちょっと気になったので確認。System.exit()だとfinallyブロックもスルーされるんだったよね! try { System.out.println("a"); System.exit( 0 ); System.out.println("b"); } finally { System.out.println("c"); } 実行結果です。 a「なにこれ、こわい」、…
移動平均もいろいろあるなー。→Wikipedia - 移動平均普通の移動平均は作成済みなので、その次の加重移動平均を実装。 # 一定期間の加重移動平均を得る class WeightedMovingAverage def initialize( range=25 ) @rates = [] # レートを記録するバッファ @ran…
クリック証券のスクレイピング版プラグインもだいぶできつつある(現在稼動テスト&デバッグ中)ので、ぼちぼち組み込みのライブラリを充実させて簡単にエージェントを作れるようにしていきたい。ということで、とりあえずボリンジャーバンドを算出するライブラ…
週末になるとjijiのデモサイトが落ちる問題があって、Ubuntuのアップデートとかでシステムが再起動されてるのかなー?とか思っていたんだけど、ログをちゃんとみてみると、OOM Killerが発動して殺されてるじゃないか!!!名前は聞いたことあったけど動いている…
みたいなHTMLを書いて <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript"> function onEnter() { document.getElementById("stdout").innerHTML += "!!"; return void(0); } </script> </head> <body> <a href="javascript:onEnter();">テスト</a> </body></html>
久々にちょっと早く帰れたので、jijiのクリック証券プラグインを作っていたわけですが、レート情報を取ってくるところで以下のエラーが起きる。 , [2009-06-03T02:25:04.651000 #7420] ERROR -- : can't modify frozen object (TypeError) /usr/lib/ruby/1.8…
WWW::Mechanizeを0.9.2にupdateすると、以下のエラーになってクリック証券スクレイピングライブラリが動作しなくなった・・・。 Iconv::InvalidEncoding: invalid encoding ("Windows-31J", "UTF-8") /usr/lib/ruby/gems/1.8/gems/mechanize-0.9.2/lib/www/m…
ドキュメントを見ながら、データストアを使ったカウンターのサンプルを作ってみました。 カウンタの値を格納するクラス データストアでは、Java Data Objects(JDO)の標準インターフェイスを介して、任意のエンティティ(アノテーションが付与されたPOJO)を…
いまさらですが、 Google App Engine For Javaを使ってみましたよ!といってもCodeZine - Google App Engine for Javaを使ってみよう!にしたがって、アカウントを作ってサンプルアプリをデプロイしてみただけですが。ちなみに成果は以下。http://unageanu-te…