Crystalでhttpstat実装した
さいしょに
この記事はCrystal Advent Calendar24日目の記事
前日はhaijuさん.
TL;DR
- ほぼ初めてCrystalを触った
- 手始めにhttpstatを作ってみた
httpstatとは
id:b4b4r07さんの記事を読むのが一番はやいと思う.
簡単に言うとcurlのラッパーで応答時間がグラフィカルに表示されるやつです.
最初にPython 実装が,続いてGolang, PHP, Node.js, Bashなどの実装が公開される.だけど,Crystalの実装は見つからなかったので作ってみた.
つくってみて
Python実装をそのままCrystalに移植した感じになった.もっと良い感じにできると思う.
Colorize
というモジュールが標準で用意されててべんりだった.
Colorize - github.com/crystal-lang/crystal
puts "cyan".colorize.cyan.to_s
とやればシアンで出力されてべんり.
JSONとクラスの対応は JSON.mapping
を利用する感じ.
class Stat JSON.mapping({ time_namelookup: Float64, time_connect: Float64, time_appconnect: Float64, time_pretransfer: Float64, time_redirect: Float64, time_starttransfer: Float64, time_total: Float64, speed_download: Float64, speed_upload: Float64, remote_ip: String, remote_port: String, local_ip: String, local_port: String, }) end stat = Stat.from_json(json_str)
とやればマッピングできる.
Crystalはクロスコンパイルできますよとのことだったので,macOS上でLinux用にクロスコンパイルしようとしたが,ドキュメント通りにやったができなかった.
[lala.local]% crystal version Crystal 0.20.1 (2016-12-05) [lala.local]% crystal build src/httpstat.cr --cross-compile --target "x86_64-unknown-linux-gnu" [lala.local]% docker run -it -v $(pwd):/work --rm dockcross/linux-x64 /bin/bash [root:/work] 1 # cc httpstat.o -o httpstat -lpcre -lrt -lm -lgc -lunwind /usr/bin/ld: cannot find -lpcre /usr/bin/ld: cannot find -lgc /usr/bin/ld: cannot find -lunwind collect2: error: ld returned 1 exit status
GOOS=linux GOARCH=amd64 go build
的なノリでできると思っていたけどできなかったので急にしんどくなってやめた.どうやればいいんですかね....
かんそう
ベターッと書いてしまったので良い感じに書き直したいが,現状使えているのでフムーという感じになっている.
普段Golangばっか書いててる人間としては zip
, map
等のリスト操作系とか to_s
,to_h
で変換できる感じが新鮮.色々機能あるっぽいのでdocsをちゃんと読んでおきたい.どんどん書いて世界観を感じていきたい.
crystal init app httpstat
でプロジェクト生成できるのも良いし, gofmt
が大好き人間としては crystal tool format
が用意されているのも嬉しい.
各種べんりツールはこちらのブログを参考にするとべんり.
開発スピードとしては,1ヶ月に一度くらいにアップデートがある感じ?
Tags · crystal-lang/crystal · GitHub
このブログを書いているときにもアップデートがあった.
Crystal 0.20.3 released! https://t.co/i5rmmRXgsO
— Crystal Language (@CrystalLanguage) December 24, 2016
さすがにプロダクションに入れることはやらないけど(社内ツールには入れたりするかも),来年はGolangとCrystalをやっていこうと思う.