twirp-ruby概要

はじめに

twirpというgRPCと似たようなRPCフレームワークを触っている中でのメモ。twirpはgRPCと似ていますがHTTP2に限定されずHTTP1.1でも使用できる便利なやつです。

基本

github.com

twirp-rubyはtwirpをRubyで動かすやつです

登場人物

  • Service...ProtocolBufferで定義されたService。その中身は実はRackアプリケーション

  • Handler...Serviceがどう動くかを定義

  • Client...Service呼ぶやつ

ServiceはServiceをRackアプリケーショとして定義するが、どう動くかについては定義していない。Handlerを差しこむことで中身の動きを定義する 例:

HogeService.new(FugaHandler)

ちなみに以下のような形でHookポイントがあるので、各Hookポイントで処理を書くことが可能

routing -> before -> handler -> on_success
                             -> on_error

具体的なService, Handler, Clientのコードは以下となる

module Example
  class HelloWorldService < Twirp::Service
    package "example"
    service "HelloWorld"
    rpc :Hello, HelloRequest, HelloResponse, :ruby_method => :hello
  end

  class HelloWorldClient < Twirp::Client
    client_for HelloWorldService
  end
end

class HelloWorldHandler
  def hello(req, env)
    if req.name.empty?
      return Twirp::Error.invalid_argument("name is mandatory")
    end
    {message: "Hello #{req.name}"}
  end
end

Service内で使用しているメソッド詳細

  • package... Serviceのパッケージ名を定義。まじでパッケージ名的なことにしか使われない
  • service...Serviceのサービス名を定義。まじでサービス名的なことにしか使われない
  • rpc... Twirp::Serviceにはrpcsというrpcの定義をためる変数がある。そこにrpcを追加する

rpcsには以下のようなデータが追加される

twirp-ruby/service_dsl.rb at 3ec36d2653a14eb8cc73409fb20889e8484db371 · twitchtv/twirp-ruby · GitHub

rpcdef = {
  rpc_method: rpc_method.to_sym, # as defined in the Proto file.
  input_class: input_class, # google/protobuf Message class to serialize the input (proto request).
  output_class: output_class, # google/protobuf Message class to serialize the output (proto response).
  ruby_method: opts[:ruby_method].to_sym, # method on the handler or client to handle this rpc requests.
}

@rpcs ||= {}
@rpcs[rpc_method.to_s] = rpcdef

Clientからの呼び出し方法

twitchtv/twirp-ruby

# Equivalent RPC calls
client.rpc(:Hello, HelloRequest.new(name: "World")) # generic rpc method
client.hello(HelloRequest.new(name: "World")) # DSL method with message object
client.hello(name: "World") # DSL method with message attributes

gRPCと違い、Requestクラスを使わずともHashで呼べる

Client呼び出し時の戻り値

The response is a Twirp::ClientResponse object with the properties data (success) and error (failure).

しかも、errorは Twirp::Error が返される。gRPCと違い直接ProtocolBufferで定義したmessageを返さないので注意。

Rails連携

github.com

2018年振り返り

前年は2Bサービスの提供や課金、SEO対策などをやっていました。 2017年に立てた目標が達成できているか、2018年を振り返ってみます。

3行で:

  • 2017年にたてた目標はまぁまぁ達成できました
  • プライベートもなかなかしんどい時期ありましたが私は元気です
  • 2019年からは目黒や自由が丘にいます
続きを読む

RequestId付きのRailsのログをvimで便利に見る

Railsではconfig.log_tagsuuidを指定することでRequestId付きのログを出力できます。 RequestIdつきのログを確認するとき、以下のような欲望があります。

  1. 特定のパターンでフィルタしたい
  2. マッチした行だけでなく、関連するRequestIdの行を全部表示し、リクエスト全体の流れが知りたい。

例えば特定のControllrのActionのログをフィルタしたいときや、特定のユーザーのログを見たいときなどです。 vimで関数を定義することで実現できたので記しておきます。

検証環境:

Railsのログはconfig/application.rbとかに以下のようなconfigがはいってるやつです。

config.log_tags = [:uuid]
続きを読む

Parser gemを用いたプロファイルコードの挿入

小ネタです。

JavaScriptの関数の開始と終了にプロファイル用のコードを挿入し、シンプルなプロファイリングをするという記事が以下:

itchyny.hatenablog.com

ASTの一つの使い方としてとても面白いです。 Rubyの場合どう実現したらいいのか興味が出たのでやってみました。最終的にはwhitequark/parser を用いたRewrite処理で実現できました。

続きを読む

データ起点でのプロダクト改善の取り組み: 8月

こんにちは。普段はClearと呼ばれる教育系アプリに対して、Ruby on Railsでの開発やインフラの整備、Androidのレビューを行っています。趣味でアクセスログ解析を行っていました。

2018年8月からプロダクトの開発方針を変更し、データの観点からもアプリの各種KPI向上を目指すことになりました。 そこでの取り組みについて、まだまだ手探りですが誰かの役に立つかもしれないので備忘録を兼ねて記しておきます。

前提

  • 世界で200万DLくらいのC to C学習アプリ
  • アプリからのアクセスログAWS Redshiftにたまっている
  • データ観点での施策は既存機能にまつわる課題の解決に留める。より大きな目線での課題解決はデザイナーが担当

なぜやるのか

これまでの開発方針ではMAUなどの主要KPIの増加を狙うため施策を行っていましたが、個人的に以下の問題があると感じていました

  • 施策に効果があったか評価をしない
  • 施策に効果があるかどうかわからないまま結構な工数を消費しがち

またこれまでユーザーへのインタビューなど行い、ペルソナなどもつくっていましたが、うまくそれをプロダクト開発に活用できていないのも気になっていました。仮説に対する学びを得る、無駄な工数を減らす、ユーザーから得られた情報を活かすという想いから開発方針の変更に至りました。

こんな人におすすめ(だと思う)

  • リーンスタートアップやInspiredをよんだが何したらいいのかいまいちわからない人
    • 僕もよくわからないので試行錯誤してる最中です
  • プロダクトチーム5人以下の小さな会社
    • おそらく大きな会社だとグロースチームや分析チームなどいろいろな役職の人がいるので、より効率的なやり方があると思います。
続きを読む

第29回 Pythonもくもく会に参加しました

Pythonもくもく会に参加し、画像処理やOCRについて取り組みました。

Pythonもくもく会

前職の先輩であるF#/Rust/Python使いの@meganehouser氏に紹介され、第29回Pythonもくもく会に参加しました。

mokupy.connpass.com

@meganehouser氏は第一回に参加したことがあるとか。

参加者の方は僕と同じく初心者の方、業務でDjangoを触っている方、機械学習屋さんなどいろいろな人がいました。

続きを読む

RedashのVimプラグインvim-redashを作りました

VimからRedashを操作できるプラグインvim-redashを作りました。

github.com

vim-redashについて

vim-redashとはRedashを操作するVimプラグインです。バッファ上のSQLを実行し、その実行結果を Vim へ出力/Redashに投稿できます。

f:id:koyamay:20180307041809g:plain:w500

続きを読む