Crystal で作る簡單インタラクティブ CUI。Crystal で面倒臭い作業を殺せ
Git の要らない local & remote ブランチを撰んで消すツールを作ったで書いた tool を紹介したものだ。其の後多量の branch が在っても scroll 出來る UI を作ってゐるが、UI を組む DSL がどうあるべきか惱んでゐる。
.。oO(此のblogは、主に音樂と考察と Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)
音樂は SoundCloud に公開中です。
考察は現在は主に Scrapbox で公表中です。
Programming は GitHub で開發中です。
Crystal で作る簡單インタラクティブ CUI。Crystal で面倒臭い作業を殺せ
Git の要らない local & remote ブランチを撰んで消すツールを作ったで書いた tool を紹介したものだ。其の後多量の branch が在っても scroll 出來る UI を作ってゐるが、UI を組む DSL がどうあるべきか惱んでゐる。
private-values // Speaker Deck
private-values: 秘密情報や個人的な file を共有リポジトリから隠す爲のツールで紹介した tool だ。今あたらしい機能を一つ考へてゐる。複數の team で使へるやう、site (假り名) と云ふ概念を入れやうと思ってゐる。後方互換性は保てる見通しでゐる。
Serverless Framework を本番環境に投入するために // Speaker Deck
Tutorial は以下に書いた。本當に簡單なのだ。 Serverless Framework (1.0) で AWS Lambda と AWS API Gateway を設定する、單純なサンプルを書いた
纏め丈轉記しておかう。
log を撫でまはし乍らごそごそしてゐたら出來てゐたので gem にした。
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 個の情報を保存しなければならず、省メモリに計算出來ない。そのものではなく類似を探してゐる。確率的な計算を行なふ類似は幾つか在るやうだ。それも検討するし、確率的なオンラインアルゴリズムでなく、幾何学的な類似でオンラインで計算出來るものも探さうと思ふ。
コンパイルはする。
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
として使へる。
標準ライブラリが充實してゐる事を願ふ。
毎回 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!"); }
とすれば使へる。