Less is Best

rubyが好き。技術の話とスタートアップに興味があります。

itamae-plugin-recipe-etcd書いた

結論

etcd v2.0用のitamae plugin書きました。CoreOS以外でetcdの最新系であるv2.x系を試そうする変態さん、ぜひどうぞ。

github.com

なぜ

coreos on etcd0.4.x系を触っている際にetcdクラスタの初期化の際にエラーが発生しまくる事案が発生したため、2015年1月末にリリースされた2.x系を試そうと思い立ち、ついでにレシピも書いた。

etcd v0.4.x系においてはetcdの根幹をなしているraftのプロトコルの実装であるgo-raftの実装がイケてないかつメンテされていない状態のようで、それが原因でのクラスタエラー初期化らしい。etcd2.0ではgo-raftをリプレースした別のraft実装が用いられているようだ。

transporter.ae.decoding.error:proto: field/encoding mismatch: wrong type for fieldの文言のエラーであり、関連するissueはこちら

ふと

coreos + etcdを運用している方々, v2.0への移行はどう対処するのでしょうか? (つい先頃みかけたnanapiさんとか)CoreOSでは自動アップデートがかかるため、逃れられないことが辛いですね。etcdのアップデートを避けて自動アップデートを止めると全く更新されなくなり、CoreOSを採用する意味がありませんし。漁ってみたところmigrationツールが準備中のようですが、詳しい情報を見つけることが出来ませんでした。

アップデート後の挙動がどうなるのかを確認したかったのでetcd 2.0 & fleet 0.9.2の環境かつcentosクラスタ構成のテストをしてみたのですがうまくつながらなかった。etcd2.0 & fleet0.9.2の環境でどういう挙動になるのか調べたかったのですが動くんでしょうか?実際に試してる記事も全くみつけられなかったので私はetcd2.0のアップデートがとても心配です。こちらのコードは今日はもう眠いので後でgithubにでも上げます。

json-schemaからSwiftのAPIクライアントを自動生成するツールを作った

はい、最近なにかと流行っている?json-schema界隈、いかがお過ごしでしょうか。

json-schemaからSwift, Java(未実装)のAPIクライアントを自動生成するツールAriesを作りました。

github.com

機能についてはもう言うこと無いですね。JSONSchemaからSwiftのAPIClientを生成するジェネレータです。Promiseライクに操作したかったので ReactKit/SwiftTask · GitHubを採用。Networking libraryとしてAlamofireを使っています。

なぜ作った

アプリの開発を行うとなったら、今はiOS, Andriodどっちも作るのが当たり前ですよね! どうしたら楽して手っ取り早くクロスフォームでアプリを開発できるのかと、調査を重ねてました。

Xamarin => かなり良さげだけど高い、、お高い+c#知らん。あとロックインコワい。RubyMotion => 好きだったしAndroidも対応きたけど最近下火。 C++でコード共通化 => Dropboxがやってたけど正直かなり鬼門。知識もWebにほとんど落ちてないので1歩歩くごとに地雷を踏みそう。試すしてみたが心折れた。 Rubotoはちょい気になったけどAndroid,Javaの知識薄いので回避。その他大勢のクロスプラットフォームツールたち検討する余地ほぼなし。HTML5も現状検討の余地なし。などなど...クロスプラットフォーム開発についてあとで別記事でまとめておきたい。

頭を悩ませた結果行き着いた先がここでした。

  • iOS,Androidともに知見のおおいネイティブで実装は行う。
  • データベースにRealm, APIクライアントにAriesを使うことでアプリのバックエンド周りの設計と実装をiOS,Androidで共通化させて楽する。アプリのバックエンドの通信周りとデータベース周りを共通化できれば、その分UI層に力を注げるしなかなか良さげ。

なのでどんな感じになるだろうかととりあえず実装してみた。

使い方

コード生成は下記のコマンドにて

$ bin/aries generate json-schema.json --name MyApi \
                                      --url http://api.myapp.com \
                                      --output /path/to/dir

生成されるAPIクライアントはこんな感じ。テンプレートからの生成のためインデントずれてるのはご愛嬌。json-schemaはr7kamura/rack-json_schema · GitHubから拝借しました。

gistb7adef4561ceaaeb9647

これから

まだエクスペリメンタルな実装なのでいろいろと問題を抱えています。

  • 依存関係をうまい具合に解決したい
    • 自動でライブラリとして依存コードもろともプロジェクトまで生成する
    • ミニマルな実装として埋め込む
  • APIクライアントとしての設計
    • iOSクライアントの深淵まで覗いたことがまだ無いため、APIクライアントとしての設計が良いのだろうか。
  • Javaクライアントのジェネレータ

実運用できるまでブラッシュアップさせたい。