読者です 読者をやめる 読者になる 読者になる

人権真骨頂

とくがたかいことでゆうめい

Crystalでhttpstat実装した

さいしょに

この記事はCrystal Advent Calendar24日目の記事

qiita.com

前日はhaijuさん.   

TL;DR

  • ほぼ初めてCrystalを触った
  • 手始めにhttpstatを作ってみた

f:id:upamune:20161224215639p:plain

httpstatとは

id:b4b4r07さんの記事を読むのが一番はやいと思う.

www.tellme.tokyo

簡単に言うと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_sto_h で変換できる感じが新鮮.色々機能あるっぽいのでdocsをちゃんと読んでおきたい.どんどん書いて世界観を感じていきたい.

crystal init app httpstat でプロジェクト生成できるのも良いし, gofmt が大好き人間としては crystal tool format が用意されているのも嬉しい.

各種べんりツールはこちらのブログを参考にするとべんり.

rhysd.hatenablog.com

開発スピードとしては,1ヶ月に一度くらいにアップデートがある感じ?

Tags · crystal-lang/crystal · GitHub

このブログを書いているときにもアップデートがあった.

さすがにプロダクションに入れることはやらないけど(社内ツールには入れたりするかも),来年はGolangとCrystalをやっていこうと思う.