Journal InTime


2015-12-17 (Thu) [長年日記]

_ 累積分布関数

Rubyで累積分布関数を扱う方法を調べてみた。 ぐぐったところSciRubyのstatsampleライブラリを使えばいいらしい。

ドキュメントがあまり見当たらないけど、サンプルのhistogram.rbとかを見るとこんな感じで使えばよいようだ。

require "statsample"

# テスト用に平均値40、標準偏差10のデータを1000個生成
v = Statsample::Shorthand::rnorm(1000, 40, 10)

# 最小値から最大値まで0.5ずつループ
v.min.step(v.max, 0.5) do |x|
  # 値xと、xにおける累積分布値をカンマ区切りで出力
  puts [x, Distribution::Normal.cdf((x - v.mean) / v.sd)].join(",")
end

Normalのところを変えると正規分布以外も扱えるらしい。

LibreOfficeのNORMDIST()関数の結果と比べると一致したのでたぶん合ってると思うけど、使い方が間違ってたら教えてください。

Tags: Ruby

2015-09-12 (Sat) [長年日記]

_ Net::FTP#mlst, mlsdの追加

RFC 3659で追加されたMLST/MLSD(機械処理用のリストコマンド)を実装してみた。 trunkでは以下のようなコードが動くはず。

ftp = Net::FTP.new
ftp.connect("localhost")
ftp.login
p ftp.mlst("welcome.msg")
#=> #<struct Net::FTP::MLSxEntry facts={"modify"=>2013-12-20 18:07:33 UTC, "perm"=>"adfr", "size"=>170, "type"=>"file", "unique"=>"FC00U1E554B", "unix.group"=>"0", "unix.mode"=>"0644", "unix.owner"=>"122"}, pathname="/welcome.msg">
p ftp.mlsd("/")
#=> [#<struct Net::FTP::MLSxEntry facts={"modify"=>2015-09-12 03:59:29 UTC, "perm"=>"flcdmpe", "type"=>"cdir", "unique"=>"FC00U1E554A", "unix.group"=>"65534", "unix.mode"=>"0755", "unix.owner"=>"122"}, pathname=".">, #<struct Net::FTP::MLSxEntry facts={"modify"=>2013-12-20 18:07:33 UTC, "perm"=>"adfr", "size"=>170, "type"=>"file", "unique"=>"FC00U1E554B", "unix.group"=>"0", "unix.mode"=>"0644", "unix.owner"=>"122"}, pathname="welcome.msg">, #<struct Net::FTP::MLSxEntry facts={"modify"=>2015-09-12 03:59:29 UTC, "perm"=>"flcdmpe", "type"=>"pdir", "unique"=>"FC00U1E554A", "unix.group"=>"65534", "unix.mode"=>"0755", "unix.owner"=>"122"}, pathname="..">]

LISTと違ってサーバから返される情報が環境に依存しないので幸せになれるはずだったけど、試してみると以下のような問題があった。

  • そもそもvsftpdでサポートされてない。例えばftp.ruby-lang.orgでは使えない。
  • ProFTPDのMLSTレスポンスの2行目はなぜか250-で始まる(RFC 3659では空白で始まるように規定されているのに)。
  • システム依存のfact(sizeなどのファイル属性)はIANAに登録されることになっているが、 IANAのサイトのOS Specific Fact Namesを見ると、Unix.ctimeとUnix.atimeしか登録されていない。 RFC 3659の例にあるUnix.modeさえ登録されてないのはどうなの?

まあ、そういう自分も2007年に出たRFCの実装を今ごろしているわけだけど。

Tags: Ruby

2015-08-31 (Mon) [長年日記]

_ Ruby技術者認定試験合格教本 Ruby 2.1対応

Ruby 2.1に対応したRuby技術者認定対策本がようやく発売されました。

Ruby技術者認定試験合格教本 Silver/Gold対応 Ruby公式資格教科書(増井 雄一郎/小川 伸一郎/株式会社 日立ソリューションズ 牧 俊男/一般財団法人Rubyアソシエーション 前田 修吾/CTCテクノロジー株式会社)

昨年の10月にRuby技術者認定試験自体はRuby 2.1に対応する改訂が行わましたが、この対策本は新しい試験問題に対応するものです。 従来通りSilver/Goldの両試験に対応していますので、受験を検討されている方はぜひご活用ください。

Tags: Ruby

2015-05-14 (Thu) [長年日記]

_ MySQL/MariaDBの準同期レプリケーションの改善

MySQL 5.5/5.6、MariaDB 10.0の準同期レプリケーションでは、マスタ側でcommitした直後にスレーブからのバイナリログの受信完了通知を待つ仕組みになっているため、commitされたデータが他のセッションからreadされた後でスレーブにフェイルオーバーした際にそのデータが欠損する可能性があり、MySQL 5.7でloss-less semi-synchronous replicationという、commit前に受信完了通知を待つ仕組みが導入されている。

MariaDBの方には同様の修正が入ってないのかなと思ったら、10.1にEnhanced semisync replicationという名前で入っているようだ(この記事を見るとこちらの名前の方が由緒正しい?)。

MySQL 5.6向けのパッチはあるようだが、MariaDB 10.0向けのパッチは見当たらなかった。Googleさんのパッチ袋とかに入ってないだろうか。


2015-04-14 (Tue) [長年日記]

_ Ruby 2.2.2

opensslライブラリの脆弱性が修正されたようなので、Ruby 2.2.2にアップデートしておいた。

リリースに関係されたみなさんに感謝。

Tags: Ruby