SQLiteにユーザ定義関数を追加しTOMCAT+DBCPで利用する

ユーザ定義関数の追加

SQLiteにはストアドプロシージャはなく、その代わりにユーザ定義関数を追加し、同様の処理を行うようにできます。

org.sqlite.Functionを継承したクラスを作成し、その中のxFuncをオーバラードしたメソッで実装する関数を定義しresultで戻します。

今回の場合には文字列で定義した数字を足しあわせて返すという関数を定義しました。

これを利用する際にはJDBCのコネクションに対しFunction.createでバインドしてやります

バインドする際にSQL文内で呼ぶ関数名を同時に定義します。その後は通常のJDBCの処理と同じです。

DBCPで使う

DBCPで使うサンプルです

  • context.xml

  • TestServlet.java

ここでのポイントはDBCPのコネクションプールからJDBCのコネクションを取得する際に実際のコネクションを取得してやる必要があります。

この部分です。詳細は↓あたりを参考にしてください。

http://stackoverflow.com/questions/6489514/apache-commons-dbcp-connection-object-problem-thread-classcastexception-in-org

http://www.ksky.ne.jp/~snbhsmt/commons-dbcp.html

http://grokbase.com/t/tomcat/users/052spdat5s/tomcat-5-5-7-using-builtin-jdbc-connection-pool-cant-access-real-connection-accesstounderlyingconnectionallowed-true

なおJDBCはsqlite-jdbc-3.7.2.jarではなくsqlite-jdbc-3.8.5-pre1.jarを使用してください。Function.create内のinstanceofでconnectionが実コネクションかどうか判定しているのですが、JDBCが古いほうだと何故かここでエラーになってしまいます。

こんな感じでSQLite+DBCPでユーザ定義関数が追加できます。参考になれば幸いです

20140916追記

DelegateingConnectionを取得した際にコネクションを閉じ忘れるとTOMCAT起動時にエラーというか無限ループに陥ります。注意

Yahooファイナンスの株価を取得してみる その2

前回、株価のヒストリカルデータを銘柄コード別にファイルに落とすところまでできました。このままでは使いづらいのでリレーショナルDBに入れることにします。

ただ、この動作しているマシンがRaspberryPIなので、データベースを入れるというような暴挙はできません。そこで、組み込みきらしくSQLiteを使うことにします。

  • schema

  • hist_import.py

  • hist_imprt.sh

これで動かしてみたのですがちょっとおそいです。というか丸一日動かして1000銘柄も取り込めていない。。。

後ほどチューニングすることにします

Yahooファイナンスの株価を取得してみる

RでYahooファイナンスを取得するモジュール、RFinanceYJを改造し使っていたのですが、あまりの遅さに閉口してしまいました。丸一日掛けても14年分の日次株価は1000銘柄程度しか撮れていません。やり方はこの辺りにまとめています。

http://d.hatena.ne.jp/anagotan/searchdiary?word=%2A%5BR%5D

RaspberryPiを手に入れたこともあり、pythonで書き直してみました。pythonは2.7です

master.py

マスターを取得します 

hist.py

時系列データを取得します 

やっつけで作成しましたがとりあえずファイルに落とすところまでは確認できました。

ちなみに動作環境はRapberryPITypeB+のRASPBIANVersion:June 2014で動いています

Raspberry Pi TypeB+で遊ぶ

昨日ポチッたRaspberryPi、早速届きました。RSコンポーネンツさん仕事が早いです。

早速セットアップ。

MicroSD

上海問屋で以前入手したトラセンドの32G

microUSB電源アダプタ

ソニーエリクソンのMW1付属のものを流用。

モニタ

ソニーの液晶テレビ

要は家にある物でなんとかしてみました。セットアップはMacOSXで行います

SDのフォーマット

通常のフォーマットでFAT32にしておけばOK。

raspberry piのImageのダウンロード

http://www.raspberrypi.org/downloads/

こちらからRASPBIANのZIPファイルをダウンロード。解凍しておきます

イメージの書き込み

ディスクをマウントしコマンドプロンプトのdfで確認します

/dev/disk2s1がSDのデバイスです。マウントを外し書き込んでいきます。

4、5分でイメージが書き終わります。

起動

HDMIケーブルをテレビと接続し、SDカードをセットしたら電源コネクタにマイクロUSBの電源を差し込みます。テレビに起動コンソールが映り始めればOK

だめな場合には、LEDランプの緑がちかちかしているかどうか確認します。こちらがどうやらディスクアクセスのランプのようです。うまく起動画面が出ない場合にはSDにOSがうまく書き込めていないと思いますので、ディスクを変更するなどし再度チャレンジしてください。

RaspberryPIのセットアップ

起動したらディスクやLocaleの設定などを行います

1.Expand Filesystem

そのままの設定だと2GしかSDカードを使ってくれないのでこちらのメニューからすべての領域を使うようにします

4.Internationalisation Options

I1 Change Locale

ロケールをja_JP.UTF-8へと変更

I2 Change Timezone

Tokyoへ変更

I3 Change Keyboard Layout

General Keyboard 105 あたりからJapaneseを選択

8. Advanced Options

A4 SSH

これをONにしておくと外部からSSHでログイン可能

ここまででだいぶ使いやすくなるかと思います。あと固定IPの方が使いやすいのでネットワークの設定を行います。

自宅のネットワーク構成に合わせてaddressとgatewayを設定します。

これで一通りの設定ができたかと思います。必要なパッケージはapt-getが使えるので簡単にインストールできるのが楽ですね

Rでチャートを書いてみる(8)

前回までのスクリプトをぐるぐる回すようにしてみました。

一銘柄ずつとると時間がかかるので並列で動くようにしています

  • RFinanceYJPatch.R

  • getall.sh

現在4000銘柄弱ですのでこれでOKだと思います。ただこれでもまだまだ時間がかかりますが全部取得できるかと思います

Rでチャートを書いてみる(7)

前回でマスターまで取得ができたので、このマスターを用い、全銘柄分のデータを取得することにします。

取得したデータはリレーショナルデータベースへ格納するのが一般的かと思いますので、ここは簡単に扱えるSQLiteに入れることにします。

SQLiteをインストール

MacOSXの場合には以下のコマンドで一発です

つぎにRSQLiteパッケージをインストールします

準備が整ったらスクリプトを用意しこれを実行します

(前回までのRFinaiceYJの拡張関数を実行しておくこと)

かなり時間がかかると思いますが無事SQLiteにはいっていることが確認できます

  • 2014-8-24

もう少し使い勝手よくしてみました

Rでチャートを書いてみる(6)

株価を利用する際には株価コードの一覧が必要となってきます。そこで調子に乗って株価コードの一覧を取得してみました

例によってRFinanceYJに追加する関数です

YahooFinanceの銘柄名の頭文字から一覧を得るページがあるのでこちらからダウンロードするようにしました。

結果ですが、ページ数が多いので若干時間がかかります。

全銘柄とれるようになりました!

  • 2014.8.17

銘柄コード純になるように修正してみました

Rでチャートを書いてみる(5)

いつの間にかQiitaに引用されていました。(^^!

http://qiita.com/HirofumiYashima/items/4b3a3a3e49be59d81e4f

うまく動かないとのことなので修正をしてみました。

RFinanceYJはYahooのHTML変更に振り回されているようで、うまく動かない場合が多いです。

どうもStockTsDataの↓の部分でテーブルの形を決まりきった物として扱っているので、Yahoo側のちょっとした変更(たとえば上の方になんか広告などを追加するとか)に負けてしまっています。

Xpathで解析するようにし、若干の変更には耐えられるように修正してみました。この株価ページにはテーブルが3個あり、その2番目が株価のテーブルですので、最新版の0.3.1にまたまたパッチを当ててみました。こう書き換えます。

この関数だけを読み込んでもだめなので全体を記述しそれをlibrary(RFinanceYJ)に続けて読んでやります

実行結果

長いヒストリカルデータも何のその!!

2014.8.19

HirofumiYashima様の指摘により修正してみました

なお、実行環境はMacOS10.9のR version 3.0.3 です

2015.1.20

こちらの記事はYahooの仕様変更によりとれなくなってしまいました

http://d.hatena.ne.jp/anagotan/20150120

こちらを参照ください

Backbone.UndoをTypescriptで使ってみた その3

昨日のサンプルは、クリックイベントの処理がモデルの中に入っているので、ちょっとイマイチだったので、コントローラ側でその辺りの処理をするように再度修正してみました。また、ArrayなどのUndoに対応できる用にコントローラ側でデータ修正する際に、深いコピーでモデルに入れるようにしないといけないのでその辺りも合わせて修正しました。

  • app.ts

  • index.html

次に単体テストをmochaを使用して記述してみます。

予めmocha.js,mocha.d.ts,mocha.css,asert.js,assert.d.tsを用意しておく必要があります。

書いていてわかったのですが、実はBackbone.undo.jsはデータをスタックする際にタイムスタンプを用いているらしいので、テストユニットでババっと流すと、同じタイムスタンプでスタックされてしまい、思い通りの動きになりません。

そこで、テストユニットにはsettimeoutで少し実行間隔を開けてやることにします。

  • app-test.ts

done()を入れることにより、同期をとったテストを実行できます

  • app-test.html

本来ならば、gruntとphantom.jsを用いてコマンドラインから実行するのが普通でしょうが、このapp-test.htmlをブラウザで開くだけでもテストを実行できます。エラーなどはchromeのデバッグツールで確認して下さい

サンプルはこちらにアップしておきました

https://github.com/anagotan/typescript_sample/tree/master/undo