みた。
よいおじさん映画だった。店長の家の雰囲気がよかった。あんな書斎のような部屋に住みたい。戸次重幸の役柄との関係性も見ていてよかった。あきらが可愛くて輝いて見えた。これが若さか。
みた。
よいおじさん映画だった。店長の家の雰囲気がよかった。あんな書斎のような部屋に住みたい。戸次重幸の役柄との関係性も見ていてよかった。あきらが可愛くて輝いて見えた。これが若さか。
CRuby 2.4から整数がIntegerに統合されるとともにその子クラスであるFixnumとBignumが廃止されたが、下記のようなコードを使えばそれを手軽に判定できる。
if 1.class.name == "Integer" # 統合後の処理 else # 統合前の処理 end
このようにバージョン番号を使わずに判定することで、JRubyなどの別実装で同様の変更がかかっても同じコードで対応できる。
ちなみにdefined?(Fixnum)
でも同じ判定ができるんだろうけど、
class Fixnum < Integer; end
してるとかといったあたりが気になるので、今回のような判定方法のほうが個人的には好き。
lestrrat-go/server-starterというホットデプロイしてくれるものがある。
これをAlpine LinuxなDockerコンテナ上で使おうとしたら下記のようなエラーが出た。
standard_init_linux.go:190: exec user process caused "no such file or directory"
結論から書くと、原因は依存ライブラリがdynamic linkされた実行ファイルを使っているのが原因だった。どうやらReleasesに置かれている実行ファイルはlibcなどが環境にある前提のものらしく、Alpine Linuxにはそのようなものはないので上記のようなエラーが出てしまっていた。
というわけでgolangで書いたアプリケーションのstatic link化を参考に手元でstatic linkしたものをビルドして使ったら上記のようなエラーは出なくなった。
cd $GOPATH/src/github.com/lestrrat-go/server-starter/cmd/start_server GOOS=linux GOARCH=amd64 go build -a -tags netgo -installsuffix netgo --ldflags '-extldflags "-static"'
しかしここで指定してるnetgoとは何なんだろう :thinking:
Swagger書きたくない…!というところからProtocol Buffersのサービスとメッセージ定義をもとに似たようなことができないかと考えていたところ、yuguiさんのprotocプラグインの書き方を見てできそうな気がしたので試してみた。
そうして上記記事と同じことをprotobuf gemを使って実装してみたのがこちら。
ここでは大したことはできてないけど、plugin.pb.rbやdescriptor.pb.rbを見る限りprotoファイルに記述されている内容はすべて取れそうなので、がんばれはできなくはなさそう。
ただ結局やりたいことって更新されたprotoファイルから継続的にスケルトンのコードを上手いこと生成、挿入することだったりするので、一ファイルを毎回上書きするようなprotocの使い方には合致しないのではという気がしている。もしかしたらCodeGeneratorResponse::Fileのinsertion_pointがそこら辺を上手いこと面倒見てくれるのかもしれないけど、要調査。
ちなみにProtocol Buffersを扱うgemとしてはgoogle-protobuf gemもあるが、現状こちらだけを使ってprotocプラグインを書くことはできない。なぜならこちらには前述のplugin.pb.rbとdescriptor.pb.rbに相当するメッセージの定義が無いためオリジナルのprotoファイルから生成する必要があるのだが、オリジナルがproto2で記述されているため、proto3しか扱えないprotocのrubyの処理系では現状生成することができないからだ。 両gemでインターフェースやクラスツリーは統一されているだろうからprotobuf gemのplugin.pb.rbとdescriptor.pb.rbだけrequireしてgoogle-protobuf gemで処理を実装することもできるかもしれないけど、あまりメリットはなさそう。
作った。
npmだと.env
を読み込むdotenvというライブラリはあるんだけど、それをもってコマンドを実行するコマンドは提供していなかった。Ruby版のdotenvに含まれるdotenv
コマンドみたいなやつ。なので同じようにdotenv
というコマンドを実装した。名前は変えた方がよかったんだろうか :thinking:
実装するにはKernel.exec
のようにexec(3)ができるメソッドが必要だけど、nodeでそれをやるにはkexecというnpmを使う必要があった。child_process.exec
などは結果をコールバックで受ける形になっていてプロセスは切り替わらない。で、このkexecがgypを使っていてインストールをするにはコンパイルが必要になり、ピュアJavascriptなdotenvに追加するのはすでに導入している人がアップデートするときには辛そうだなーと思ったので別のパッケージとした。
引数の処理がナイーブな感じがしているので、また変更を入れるかもしれない。
もともとhubotを起動するためにhubot-dotenvを使っていて、わざわざ.envファイルを読み込むためだけに別のnpmを入れるのもなんかな…と思ったのがこの開発の動機だった。でもよくよく考えればhubotの場合はbin/hubot
というシェルスクリプト経由で起動できるようになっているので、ここに.envを読み込むシェルスクリプトを組み込めばnpmを増やす必要はないということに気づいた。生成されたコマンドを書き換えることにはなるので好き好きではあるけど、備忘録として。