c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

多量のデータをストリームして省メモリで統計処理するgemを作った

log を撫でまはし乍らごそごそしてゐたら出來てゐたので gem にした。

github.com

N 個のデータから成る large_data が在り Ruby の Enumerable として取得出來る時、標準偏差や分散等を計算しやうとしたら、単純にやると N 個のデータをディスクに置かなければならない。全体の平均を計算した後でなければ標準偏差は計算出來ないから、得られた N 個のデータを何処かに保存しつつ平均を得た後、保存した N 個のデータを読み出しつつ標準偏差を計算してゆく。2 pass 掛かってゐる。何の爲の Enumerable だったのか。

stream_stat を使へば、

p StreamStat.new(large_data).inject { |_a, stat| stat }.sd

と 1 pass で標準偏差を計算出來る。上記 inject の中の stat 變數は、途中結果を保存してゐる。今は、平均 (算術平均)・分散・標準偏差・最大値・最小値を計算してある。avg・variance・sd・max・min の名のメソッドで參照出來る。メモリーには幾つかの方法に就いて浮動小數点數計算の誤差を検討し、總數・平均・二乘の平均・最大値・最小値の五つを保持してゐる。データ數がどれだけ増えようが五つだけで濟む。

今後は、中央値と最頻値を計算しやうと思ふ。中央値や最頻値そのものは、N 個のデータに対し N 個の情報を保存しなければならず、省メモリに計算出來ない。そのものではなく類似を探してゐる。確率的な計算を行なふ類似は幾つか在るやうだ。それも検討するし、確率的なオンラインアルゴリズムでなく、幾何学的な類似でオンラインで計算出來るものも探さうと思ふ。

Rustをスクリプト言語としてコンパイルせずに呼び出す

コンパイルはする。

crystal run や go run や rdmd や runghc のやうに、事前ビルドのコマンドを走らせる事無くインタープリタのやうに實行する機能が Rust には無いらしいので自作した。

#!ruby -rdigest/sha2
o="/tmp/#{Digest::SHA512.file __FILE__}-#{File.basename __FILE__}";IO.popen(["rustc","-","-o",o],"r+"){|io|io.write DATA.read}unless File.exist? o;system o,*ARGV
__END__
// Rustコード

Rust です(〃l _ l)

このやうにして、

#!ruby -rdigest/sha2
o="/tmp/#{Digest::SHA512.file __FILE__}-#{File.basename __FILE__}";IO.popen(["rustc","-","-o",o],"r+"){|io|io.write DATA.read}unless File.exist? o;system o,*ARGV
__END__
use std::env;

fn main() {
  let args: Vec<String> = env::args().collect();
  println!("Hello World! {}", args[1]);
}

./sample.rs momonga

として使へる。

標準ライブラリが充實してゐる事を願ふ。

追記 20161028

毎回 Rust コードにコピペするのは面倒なので矢張り外部スクリプトにした。此れ

#!/usr/bin/env ruby -rdigest/sha2 -rtmpdir
o = File.join Dir.tmpdir, "#{Digest::SHA512.file ARGV[0]}-#{File.basename ARGV[0]}"
IO.popen(['rustc', '-', '-o', o], 'r+') { |io| io.write IO.read(ARGV[0], encoding: Encoding::UTF_8) } unless File.exist? o
system o, *ARGV[1..-1]

を rust-run 等の名で PATH の通ったディレクトリに保存し、

#!/usr/bin/env rust-run
fn main() {
  println!("Hello World!");
}

とすれば使へる。

Serverless Framework (1.0) でAWS LambdaとAWS API Gatewayを設定する、單純なサンプルを書いた

Serverless Framework (1.0) で AWS Lambda と AWS API Gateway を設定する、單純なサンプルを書いた。

github.com

説明は全部 GitHub の方に書いてある。

f:id:Kureduki_Maari:20161019175426p:plain

サーバーレスアーキテクチャの好い所は、インフラの管理とアプリケーションの處理とを分離出來る事だ。インフラはアプリケーションの内容を考へずに抽象的な構成を管理する。アプリケーションはインフラの事を考へずに抽象的に處理を行なふ。アプリケーションとしては抽象化せざるを得ない。インフラがアプリケーションの内容やプロセスの狀態を決して考慮して呉れないからだ。

Terraform が餘りにも大變なので Serverless Framework は癒やしである。Serverless Framework に就いては以下に雜なスライドを上げた事が在った。

Serverless Framework (1.0.0-beta2) が在ります - c4se 記:さっちゃんですよ ☆

Gitの要らないlocal & remoteブランチを撰んで消すツールを作った

git cleanup-branch

で消せる。

github.com

feature ブランチ等、Git の merge 濟みのブランチが local にも remote にも溜まってゆく。注意してゐれば溜まらないのだが、注意を怠ると溜ってゆく。git branch -a --merged で一覧し、消したいブランチを撰び、git branch -d BRANCHgit push REMOTE :BRANCH で消してゆく事は出來る。毎回此れを遣る譯だ。嫌だ。

ツールに任せる事にしやう。消してはいけないブランチも在るから、撰ぶ手間は減らせないが、一氣に撰んで後は見ておく丈に出來る。

デモ

GitHub 上の release からバイナリを下載[download]する。或いは GitHub から HEAD のソースコードを clone して、make する。HEAD のバージョンは NCurses を使ってゐるので、Crystal と libncurses が要る。git-cleanup-branch と云ふバイナリが手に入るから、此れを PATH の通ったディレクトリに置く。Git は git-x と云ふバイナリが在れば此れを git x とサブコマンド風に呼べる。ので git-cleanup-branchgit cleanup-branch としても實行できる。Git リポジトリに移動して此れを實行すると、目的を達せられるだらう。

Crystal で開發したり、對話的な CUI を作ったり、對話的な CUI を Cucumber でテストしたりと、面白かった。