image

  • フォト Amazonギフト券
    ※この時計の時刻は、閲覧しているパソコンのものであり、必ずしも正確な時間とは限りません

検索

最近のトラックバック

無料ブログはココログ

scala

2010-06-06

sinatra アプリから得たデータを extjs の grid で表示する

sinatra アプリから得たデータを extjs の grid で表示する例を以下に置いた。
  http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/Edinet/ria/grid-sinatra/?root=ruby-xbrl

web 上や 書籍には php で作成したアプリからのデータを grid で表示する例がほとんどである。
sinatra で作成した アプリからのデータを extjs で表示する際には、jsonp にすることが必要である。
それらのことを含め、小さなスケルトンを書いた。

2010-01-23

Scala + remote actor で魔法陣を

魔法陣で試すべき組合せを 複数マシンに割り振り、 解を返させる例を Scala で作った。
 http://go.2ch2.net/u/8NAJtZ

3 x 3 魔法陣の解を数え上げるには、 9! 通りの組み合わせをすべてチェックすればよい。
9! 程度なら1 CPU でもなんとかなるかもしれないが、25! とかは無理。
そこで、複数マシンで分散処理させることを考える。

まず  [0 ... 9!] の範囲の数字と、順列を 1 対1に対応させることを考える。
これができると 複数マシンへのタスク割り振りは、(チェック開始の整数値、チェック終了整数値) を決める事で済ませられる。

順列 n! 通り と 数字の対応は次のようにする。
順列の作り方は、 (1,2,...., n) のリストから 何番目の要素を取ってきて並べたか で表現することができる。(最初の要素を0と数える)
3!の順列の場合で説明する。
取り方が (0,0,0) なら 順列 (1,2,3) ができる
取り方が (2,1,0) なら 順列 (3,2,1) ができる。(最後の取り方は、残りは1つだから常に0)

この取り方の数字列 (a, b, 0) に対して 3*a + 2 * b という数値を対応させる。
これは すべての順列から (0 ... 3! -1 の数字) への対応となる。

逆に (0...3!-1) の数字に対して、
数値を 2!, で割った商、その余りを2 で割った商、0 の3つの数字 でつくられる3つの数字の組は、リストの何番目の要素を取っていくかの操作に対応させることができる。

順列          取り方     整数
---------------------------------
1 2 3        0 0 0        0
1 3 2        0 1 0        1  // 2 * 0 + 1
2 1 3        1 0 0        2  // 2 * 1 + 0
2 3 2        1 1 0        3  // 2 * 1 + 1
3 1 2        2 0 0        4  // 2 * 2 + 0
3 2 1        2 1 0        5  // 2 * 2 + 1
---------------------------------

類似の方法で 組み合わせ (n の n乗 通り) の場合分けも 数字へマップすることが可能。

2010-01-09

Scala で hadoop の wordcount

- http://d.hatena.ne.jp/stanaka/20091125/1259124272
> Scala on Hadoop: Hadoop Conference
にある Scala での hadoop の利用例が、俺の環境では動作しなかった。
  hadoops 0.20.1, scala 2.7.7

すこし書き換えて 動作するようにできた。
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/hadoop/wc.scala?view=markup&revision=125&root=ruby-xbrl

エラーになった部分を  hadoops の wordcount の java ソースコードを見ながら java 風の書き方にしただけ。

2010-01-04

Scala で inlineXBRL 処理への挑戦 (その2)

とりあえず、 singile input 系のテストをパスするように @target 処理を追加した。

http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/ixbrl
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test//ixbrl
に commit している。

2009-12-27

Scala で inlineXBRL 処理への挑戦を開始

http://sourceforge.net/projects/inlinexbrl/develop
として、iXBRL -> XBRL 変換実装 (XSLT ベース)  がある。
これの Conformance-site データの変換結果と Scala での自作クラスの出力が意味的にはほとんど一致していることを確認した。
(xslt 実装側に、いくつかバグがあるように思える)

iXBRL 変換には、@target  による複数出力データ仕様がある。cnformance-suite にはデータがあるだけで、
makefile では、このデータでのテスト実施はされない。

このテストが makefile で動作するようにしてから、 @target 処理を自作クラスに追加するつもりである。

http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/ixbrl
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test//ixbrl
に commit している。

2009-12-23

Scala で 有理数処理を

Web 上のいろいろなサンプルを参考にして、計算式を 有理数で処理する例を作成した。
有理数で処理するというのは、
  "1/3 +1/2" を 0.833333 とせずに
  5/6 の分数として計算する
ということ。
もちろん (1/3) * 3 は 0.9999... でなく、正確に 1 として計算する。

現状でのソースコードは以下。有理数クラスと、計算式パーサー から構成される。

有理数クラス
----------------
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/rational/
  Main.scala            // 有理数クラスの呼び出しサンプル
  Rational.scala      // 有理数クラスの実装
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test/rational/
  RationalTest.scala  // 有理数クラスの junit テストケース

計算式パーサー
-------------------
http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl/
  calc3.scala // 実装
      これに対する junit テストは未作成。
      ただし、BigDecimal で計算をするケースでの計算式パーサーとその junit テストが以下にある。
      http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl2/
      http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/test/calc/dsl2/

じつは、この計算処理を RemoteActor で client/server 構成にした例も作成してある。
 http://sourceforge.jp/projects/ruby-xbrl/svn/view/trunk/ScalaApplication1/src/calc/dsl/
  server.scala
  client.server
である。
使い方は2つのコンソールを開き、
コンソール1: $ scala -cp . calc.dsl.server
コンソール2: $ scala -cp . calc.dsl.client
とするだけである。

client 側で 数式を入力して改行すると、計算結果が表示される。
空行の入力で client プログラムは終了する。(server 側は 現状では ctrl-c で中止するしかない)

計算結果は、分数形式と小数形式の2通りで返ってくる。循環小数部は { }  で囲んで表す。( 0.33333 は 0.{3} となる。)

クライアント側の操作画面例を示す。(太字が入力文字)
--- ここから ---
$ scala -cp . calc.dsl.client
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8 -Xmx1024m
Start client.
Input Expression:
1
  result:None (=1)
Input Expression:
1/3
  expr:    1/3
  result:  1/3
  resultx: 0.{3}
Input Expression:
1/2+1/3
  expr:    1/2+1/3
  result:  5/6
  resultx: 0.8{3}
Input Expression:
355/113
  expr:    355/113
  result:  355/113
  resultx: 3.{1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168}
Input Expression:
   // <- ここは 空行を入力した
Stop client.
---- ここまで ------

google の検索で "1/2 + 1/3" と入力すると
  (1 / 2) + (1 / 3) = 0.833333333
と表示されるが、 "5/6" とは表示されない。
表計算ソフトでもこのような有理数計算モードが選べるようになると良いとおもう。

P.S. [業務連絡] この投稿と sourforge.jp への commit は許可取得済

2008-11-09

jruby と ruby での DB アクセスの速度 (その3)

ATOKダイレクトプラグインで郵便番号検索

自宅には、Windows マシンが無いので、休日に会社マシンで、ATOK ダイレクトプラグインの環境を設定し、すこし遊んでみた。

web 上のいくつかのサンプルコードで、作り方を勉強した後、
昨日作った ruby での郵便番号番号検索を、ATOK プラグイン化してみた。
郵便番号の一部 or 住所の一部で検索できるようにしてある。
作ってみて思ったのは、2点。
1. ATOK の選択候補画面のカスタマイズもユーザー側でできるようにして欲しいということ。
   候補画面の GUI も ruby で作りたいものだ。
2. Debug 環境は、もう少し工夫したものが作れそうな気がする。
    Netbeans 上でのデバッガをつかえような、実行用メインメソッドをつくれば済む?

なお、sqlite3 の DB は、 firefox のプラグインの SQLite Manager を使うと内容確認などには便利。

$ cat zip-search.rb
#! /usr/bin/ruby -Ku

$KCODE = 'u'

require 'timeout'
require 'rubygems'
require 'active_record'
require 'nkf'

module Atok_plugin

  class Zip < ActiveRecord::Base
    def to_s
      return  "#{col1}|#{col2}|#{col3}|#{col4.toutf8}|#{col5.toutf8}|#{col6.toutf8}|#{col7.toutf8}|#{col8.toutf8}|#{col9.toutf8}|#{col10}|#{col11}|#{col12}|#{col13}|#{col14}|#{col15}"
    end
  end

  def run_process( a_request_data )
    ActiveRecord::Base.establish_connection(
                                            :adapter  => "sqlite3",
                                            :database => "zips.db",
                                            :timeout  => 5000
                                            )
    # ログをファイルに出す
    # ActiveRecord::Base.logger = Logger.new("debug.log")

    res = []
    timeout(20) do
      key = "%" + a_request_data['composition_string'] + "%"
      res = Zip.find(:all, :conditions => ["col3 like ? or col7 like ? or col8 like ? or col9 like ?", key, key, key, key])
    end
    ans = []
    res.each do |r|
      ans << {'hyoki' => r.col3 + "|" + r.col7 + r.col8 + r.col9, 'comment' => r.to_s}
    end
    {'candidate' => ans}

  rescue Exception => e
    {'candidate' => [{'hyoki' => 'エラーが発生しました', 'comment' => e.to_s}]}
  end

end

ローカルマシンの DB 管理するよりは、memcached でデータを共有したほうが良い気がする。
memcached で、社員名簿 (名前、内線番号、所属部署) などを保持して、それを ATOK + ruby で検索したり、データ内容の保守ができるようにするぐらいが向いているかな。

ともかくここ2日の作業で、10 万件を超える郵便番号の検索が ATOK + ruby で十分可能なことが分かった。
XBRLデータから科目ID, 科目表記名、期間毎の値 をDBに保持して それを検索するようなことは、問題なく実現できそうだとの感触を得られた。

jruby と ruby での DB アクセスの速度 (その2)

scala でも sqlite3 に入れた郵便番号を検索させてみた。

$ cat  search.scala
/
// $ calac search.scala
// Then
// $ scala -classpath .:sqlitejdbc-v053.jar sqlitetest
//  or
// $ java -cp .:sqlitejdbc-v053.jar:/opt/local/share/java/scala-library.jar sqlitetest
//

import java.sql._

object sqlitetest extends Application {

  var conn: Connection = null
  var stat: Statement = null
  var rs: ResultSet = null

  try {

    Class.forName("org.sqlite.JDBC")

    conn = DriverManager.getConnection("jdbc:sqlite:zips.db")
    stat = conn.createStatement 
    rs = stat.executeQuery("select * from zips where col3 like '100000%';")

    while (rs.next()) {
      println(
    rs.getString("col1") + "|" +
    rs.getString("col2") + "|" +
    rs.getString("col3") + "|" +
    rs.getString("col4") + "|" +
    rs.getString("col5") + "|" +
    rs.getString("col6") + "|" +
    rs.getString("col7") + "|" +
    rs.getString("col8") + "|" +
    rs.getString("col9") + "|" +
    rs.getString("col10") + "|" +
    rs.getString("col11") + "|" +
    rs.getString("col12") + "|" +
    rs.getString("col13") + "|" +
    rs.getString("col14"))
    }
  } catch {
    case e => e.printStackTrace
  } finally {
    if (rs == null) rs.close
    if (stat == null) stat.close
    if (conn == null) conn.close
  }
}

$ time scala -classpath .:sqlitejdbc-v053.jar sqlitetest
13101|100  |1000000|トウキョウト|チヨダク|イカニケイサイガナイバアイ|東京都|千代田区|以下に掲載がない場合|0|0|0|0|0
13101|100  |1000004|トウキョウト|チヨダク|オオテマチ|東京都|千代田区|大手町|0|0|1|0|0
13101|100  |1000002|トウキョウト|チヨダク|コウキョガイエン|東京都|千代田区|皇居外苑|0|0|0|0|0
13101|100  |1000001|トウキョウト|チヨダク|チヨダ|東京都|千代田区|千代田|0|0|0|0|0
13101|100  |1000003|トウキョウト|チヨダク|ヒトツバシ(1チョウメ)|東京都|千代田区|一ツ橋(1丁目)|1|0|1|0|0
13101|100  |1000005|トウキョウト|チヨダク|マルノウチ(ツギノビルヲノゾク)|東京都|千代田区|丸の内(次のビルを除く)|0|0|1|0|0
13101|100  |1000006|トウキョウト|チヨダク|ユウラクチョウ|東京都|千代田区|有楽町|0|0|1|0|0

real    0m0.658s
user    0m0.397s
sys    0m0.176s

エラー処理の書き方がだめだが、速度はまあまだ。
jruby が遅かったのは、ソースのコンパイル時間が発生する為と思われる。
jrubyc でコンパイルすれば、速くなるかな?

$ jrubyc jserach.rb

$ java -cp .:$JRUBY_HOME/lib/jruby.jar jsearch
Exception in thread "main" jsearch.rb:4:in `require': no such file to load -- pp (LoadError)
    from jsearch.rb:4
    ...internal jruby stack elided...
    from Kernel.require(jsearch.rb:4)
    from (unknown).(unknown)(:1)

うーん、jrubyc で compile した class の実行法がうまくいかないなぁ...

2008-03-25

DouKaku? の ポーカーの役判定

http://ja.doukaku.org/121/
>> ポーカーの役判定
の いろいろな言語での解答例をいろいろ読んでみている。

Scala, Haskell はなかなか短い。
prolog は思ったより長いし、なぜか理解しにくいなぁ。
java, 長過ぎる...

2008-03-21

scala で xml を扱う

scala で XML は簡単に扱える。(ruby 並み)

doukaku.org にあった net から html を取得して、特定の値を取り出す例だ。

$ cat Rss.scala
// See http://ja.doukaku.org/19/nested/
//     http://www.scala-lang.org/docu/files/api/scala/xml/parsing/ConstructingParser.html

import scala.xml.parsing.ConstructingParser
import scala.io.Source

object Rss {
  def main(args : Array[String]) {

    // val url = "http://feeds.feedburner.com/Scala"
    val url = "http://ja.doukaku.org/feeds/comments/"

    val data = Source.fromURL(url)
    val elem = ConstructingParser.fromSource(data,true).document().docElem

    println((elem\"channel"\"lastBuildDate").text)

    // import scala.xml.PrettyPrinter
    // Console.println( new PrettyPrinter(80 /*width*/, 2 /*indent*/).format(elem) )
  }
}

コンパイルして、実行しよう。
$ scalac Rss.scala
$ scala -cp . Rss

Thu, 20 Mar 2008 09:20:47 -0000

scala での xml の処理の方法の入門は次のページが面白い。
- http://burak.emir.googlepages.com/scalaxbook.docbk.html
> > scala.xml

val company  = <a href="http://acme.org">ACME</a>
とか、
val embBook =
    <phonebook>
      <descr>
        This is the <b>phonebook</b> of the
        {company} corporation.
      </descr>
    </phonebook>;
のように、変数に直接 XML を記述したり、XML 中に変数を埋め込んだりできるのだ。
XML を扱う上ではとても便利。(java だとそうはいかず、面倒だ)

記事中のソースコードは subversionで取得できる。
http://lampsvn.epfl.ch/svn-repos/scala/scala/trunk/docs/examples/xml/phonebook/

閲覧するだけなら
https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/docs/examples/xml/phonebook

xfy/xvcd で scala スクリプトをそのままかけるようにすることと、 java の代わりに scala で logic を記述することの両方をサポートすると面白そうだ。

より以前の記事一覧

mokuji

2013年12月
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        

google

  • twitter
  • __
  • _
    Googleボットチェッカー

合わせて読む

  • 合わせて読む
    フィードメーター - katoy: cocolog あわせて読みたい

リンク