Satoryu's Diary

Rubyが好きな貧乏プログラマーの日記。日々の生活、開発に関するメモとか考えとか。


2017年10月28日 [長年日記]

_ 楽天テクノロジーカンファレンス2017 に少しだけ参加してきた。 #rakutentech #rtech_unconf

娘の塾の送り迎えと被ってて参加が難しかったのだけど、漆原さんの話を聞きたくて、参加してきた。

IMG_4376

今年で36になってから、この先どう進んでいこうか考えている。
今後もエンジニアとしてやっていきたいが、周りにモデルとなる人がいない。
誰かと同じパスを通りたいという訳ではないが、参考になる人が身近にいない*1
エンジニアではなくマネージメントとして進んだ人、直接コードを書かずに上流工程のみで食べていっている人と様々だが、コードやプロダクトを目の前にしているエンジニアで居続けている人は身近に見当たらない。そんな状況の自分にとって、このセッションタイトルはとても魅力的だったし、自分の考えとすごく合うところだった。

漆原さんの仰る「世代を越えて繋がる」というのは大切だと思った。
当たり前だけど、年を取っていったら仕事で関わる人は、年下の方が多くなる。そんな中で、新しい技術やビジネスに携わっているのも下の方が多くなる。
そういった人たちとどう関わっていくかで自分自身の技術にも影響していくんだと思う。そのために漆原さんが取っているアクションとして、若い世代へコミットする、そして(勝手に)若い人を自分のメンターとする、というのがすごいと思った。年功序列というか、日本的な考えというか、なかなか若い人に教えを請うというのが難しい。自分は年齢とか気にしたことは無いが、出来ているかというとなかなか怪しい。

そして、一貫して言っていたのが「楽しいは最強」ということだ。
RubyKaigi 2011で情熱プログラマーのサイン会でチャド・ファウラーが書いてくれたメッセージが「Keep it fun!」。そして、Rakuten Technology Conference 2013でデイブ・トーマスが達人プログラマーにサインしてくれた時にくれたメッセージが「Make it fun!」。楽しいことはやはり重要なんだとあらためて思った。逆に言えば、楽しいと思えなくなった時にエンジニアの辞め時なんだろう。

  • 今繋がっている人たちで若い世代とつながれているか
  • 会いたいと思った人に会えているか
  • メンターと思える人がいるか

といったことを都度振り替ってみようと思った。
これからも楽しくエンジニアとして生きていくために。

*1 後から考えてみると、身近にいないだけで、SNSで繋がっていて、ちょっと遠くにはいる。


2017年10月09日 [長年日記]

_ 「ピープルウェア」を読んだ。

何かのセールで購入したピープルウェアを読み終えた。「働き方改革」という言葉が出回っている今に読むと良い本だと思った。

ソフトウェア開発のための良い環境とは何かということが、著者のトム・デマルコ氏や氏の関係者らのコメントを交えながら書かれていた。おそらく、エンジニアとしてコードを書いて長らく仕事をしたことがある人なら、この本に書かれていること読めば、「そうだそうだ」と頷くのだと思う。
ソフトウェア開発に限らず、複数人で1つの目的に向かってチームで仕事をしている人たちにも、同じことが言えるのだと思うので、ITに関わらない人たちも読んで欲しいです。ITに関わる人たち、特にオフィスの環境やコミュニケーションの設計に関わる人は読んでください。

この本の初版が30年前に書かれてるのに、それに共感してるのってまだまだ自分の周りがその頃から進んでないってことなんじゃないかと思うと残念な感じがする。


2017年10月08日 [長年日記]

_ OSS Gate 東京ワークショップ PHPカンファレンス2017会場編にサポーターとして参加してきた。 #oss_gate #phpcon2017

毎年この時期に大田区PiOで開催されるPHPカンファレンス の中で1会議室をお借りして開催できることになったので、サポーターとして参加してきた。ビギナーが8名、サポーターが4名。カンファレンスと同時開催ということで、参加人数がどれだけ来るか心配だったが、昨年に東京Ruby会議で開催したときと同じくらいで安心した。

いつものワークショップは午前と午後の1日コースだけれど、今回はおよそ2時間の短縮モードでやった。各ビギナーの方々には事前に対象とするOSSを選んでもらっていたので、導入はスムーズだったと思う。やはり、カンファレンスのPHP関連のOSSが多かった。短縮モードではあったが、いつもの手順でもくもくと進めて、プルリクを送ったり、Issueを送ったりするビギナーがいた。その他のビギナーも、フィードバックは時間内にできなくても、ネタは見つけて、後は整理して送るだけという状態にまでたどり着いたようで何より。

このOSS GateはたまたまRubyコミュニティの人から始まっただけなので、PHPや他の言語のコミュニティでも広まっていくといいなぁ、ということを帰り際にサポーター陣で話をした。
そのためには、まずは自分からPHPコミュニティってどんな人達がいるのか入っていってみよう。


2017年10月04日 [長年日記]

_ 「初めての自動テスト」を読んだ。

この本は、アジャイルサムライのJonathan Rasmussonが書いた、ウェブアプリケーションエンジニア向けの自動テストの入門書だ。アジャイルサムライのように可愛らしいキャラクターと共に、一部対話を交えながら、自動テストの全体観を知ることができる。
エンジニア向けのテストの本というと、テスト駆動開発が有名だが、この本はそれだけでなく結合テストやUIのテスト、そしてそれらの自動化についてカバーしている。

この本のすごいところは、自動テストを書くにあたり必要な基礎知識がわかりやすく書かれている。HTTPやRESTfulなど、それぞれで深く掘り下げて本が書けるものが、この240ページほどの中に収められている。なので、テストコードを書くことになったり、自動化を任された新人が読むのに最適だと思う。エンジニアに限らず、普段コードを書いていないけど開発に関わる人、例えばマネージャーやプロダクトオーナーの方々にも読んで欲しいと思った。


2017年09月23日 [長年日記]

_ libv8 のバージョンについて知る。

久しぶりに少し前のRailsアプリを触ることになって、bundle installしたところ、よくつまづく代表格であるlibv8 のインストールで失敗した。

環境は、

  • macOS 10.12.6
  • Rails 4.2.8
  • Ruby 2.2.2
  • libv8 3.16.14.3

である。ここで関係してくるのは、macOSであることとlibv8のバージョンのみ。

調べてみると、いくつかQiitaの投稿やブログを見つけ、それらの手順はこんな感じ。

$ brew uninstall v8
$ brew tap homebrew/versions
$ brew install v8-315
$ bundle config --local build.libv8 --with-system-v8
$ bundle config --local therubyracer --with-v8-dir=/usr/local/opt/v8@3.1.5
$ bundle install

つまり、インストール済みの最新のv8をアンインストールして、古いバージョンをインストールすると、libv8とtherubyracerをインストールできるということだ。

いままで自分が見つけた解決法に関する記事の中から、上の方法でなぜ解決できるのかを書いているものを見つけられなかったので、調べてみた。

で、タイトルにあるように、バージョンの問題ということがわかった。
そして、そんなに深く調べるとか必要なく、libv8のREADMEにちゃんと書いてあった。

Versions of the libv8 gem track the version of V8 itself, adding its own point release after the main V8 version. So libv8 5.0.71.35.5 and 5.0.71.35.14 both correspond to V8 version 5.0.71.35. Another way to think about it would be that 5.0.71.35.14 is the 14th release of the libv8 rubygem based on V8 version 5.0.71.35

つまり、libv8のバージョンは対応しているv8のバージョンと同じということ。
で、それが違う組み合わせになると、動作するかどうかは互換性が維持されてるかどうかになっていて、メジャーバージョンが違ってたりするとそれが顕著に出るということ。実際に、それまでインストールしてたv8のバージョンを調べてみると、

$ brew info v8
v8: stable 5.1.281.47 (bottled)
Google's JavaScript engine
https://github.com/v8/v8/wiki
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/v8.rb
==> Dependencies
Optional: readline ✔
==> Requirements
Build: python ✔, git ✔
Required: macOS >= 10.7 ✔
==> Options
--with-readline
        Use readline instead of libedit

ということで、やはり違うバージョンだったのでエラーが起きていたことがわかった。

もし今後、v8のインストールで失敗した時は、バージョンを確認することでサクッと解決できるかもしれないので、チェックしてみましょう。


2017年09月17日 [長年日記]

_ rakuten_web_service 1.7.0 リリース

楽天の提供するウェブAPI「楽天ウェブサービス」のオフィシャルRubyクライアントであるrakuten_web_serviceの1.7.0をリリースしました。
明日からRubyKaigi 2017ということで、なんとなくそれに合わせてのリリースです。

変更点

  • RakutenWebService::SearchResultRakutenWebService::Response にページングのためのメソッドを追加しました。
  • gemspecに定義されている開発用gemから、Visual Studio CodeのためのものをGemfileに移しました。
  • README.ja.md の一部内容が古いので直してもらいました。
    • jinco13さん、ありがとうございました!

詳細はCHANGELOG からご確認ください。

参考


2017年09月03日 [長年日記]

_ Retty Tech Night 2017 に行ってきた。 #Retty_tech_cafe

ユーザー同士で美味しいお店を紹介しあうグルメサービスRettyさんがオフィスを麻布十番に移転したてのほやほやに開催されたRetty Tech Night 2017 に行ってきました。

会場はこんな感じでとてもキレイでした。Wifiや電源もたくさんあるので、普段はオフィスよりもこちらのカフェスペースで仕事する人も多いんだとか。また、PythonやAndroidのもくもく会の会場としても使われているそうです。確かにここは広々としたスペースで集中しやすそう。

iPhoneのカメラの調子が悪く、ここから写真は撮れなかったので、各発表のスライドと一緒に振り返ってみる。

KotlinとReduxをAndroidアプリに導入したら

@muumuumuumuu さんによる、今絶賛取り組んでいるというRetty のAndroidアプリのKotlin化とRedux導入で見つけた知見の話でした。
発表中に行われた会場アンケートでは、業務でKotlinを使っている方は10名程度、更にReduxを組み合わせているとなるとなんとゼロ!ということで、かなり先進的な取り組みなのかもしれない:: fn 'Androidのことは専門外なのでよくわかっていない' }}。
Reduxは、React.js をさらに被せたフレームワークのようなもので、状態、アクティビティ、ビューを定義し、共通のステートを持つことで、操作に対する一貫した状態の変更を実現するもののようだ。Redux自体はJavaScriptのライブラリであるが、それをKotlinでそれっぽい実装が出来るようにしてくれるのがRedux-ktで、Rettyさん初OSS tada として公開されている。
まだ、KotolinやReduxを使ったアプリをプロダクションとしてリリースできていないが、その中で出てきた色々な問題(例えばStateはどういう単位にするのか)などが出てきており、設計方針やプラクティスはAndroidのコミュニティでもまだまだこれからのように見えた。きっと、そこら辺がPull-Requestを送るチャンスではあると思うので、OSS化したのはとても良い取り組みだと思う。

バックエンドが異なるサービスの差分を
APIで吸収してみた話

既視感ある登壇者*1による、多国展開した際に各国のアプリケーションとAPIとの間のやりとりを整備した話でした。
現在Rettyさんは日本以外に台湾、シンガポールへ展開しており、各国ごとにモバイルアプリケーションとそのバックエンドのAPIを作っていました。アプリケーションを複数持つのではなく、アプリ自体は1つとして、ユーザーの利用している国を識別し、バックエンドを切り替える方法もありますが、アプリ側に似たような分岐が沢山出て来るのも辛そうなところ。そこで、アプリと通信するAPIサーバーのエンドポイントを統一し、APIが柔軟にユーザーの国に合わせてレスポンスを返す仕組みにしたそうです。
その実装自体は、パブリッククラウドで提供されているサービスを使うのではなく*2、自前でNginx Moduleを作成し、リクエストを振り分けるようにしている。発表後のッ質問でも出ていたのだけれど、今後のさらなる多国展開、もしくは特定の地域からのアクセス負荷で、このNginxがボトルネックになりそう。回答にもあったように、今のところは yen でNginxを増強して解決するようだ。

Retty のインフラを支える技術

まず登壇者の鈴木さんが、「農家兼書道家兼SRE」というポジションに圧倒されるところから始まった。今は主に仙台でリモートで勤務されており、こういうイベントなど定期的にオフィスに来ているそうです。GoogleがSREを表に出してから、色々な会社でSREというポジションが出来てきている中、RettyさんでのSREは「全体のアーキテクチャの設計、構築、運用」がメインなようだ。サーバーサイドアプリケーションはDockerで運用されるようになっており、開発者は彼ら自身でDockerfileを書き、ElasticBeansへデプロイすることができているので、運用やSREから独立して仕事ができているようだ。SREはそれら以外の、例えば先の発表にあったようなNginxやDB(RDS)の監視や運用などを担当している。最後に鈴木さんが言っていたように、RettyさんでのSREは裁量を持っていて自由に動けているというのは良い。

Rettyの機械学習のこれまでまとめ

スライドがまだ公開されていないようだったので、文章だけ。

Rettyの機械学習基盤といえば、秋葉原で購入したパーツで自作ということで有名。詳しい内容は、QiitaやSoftware Design にも記事があるので読んでみるととてもおもしろい。

という機械学習基盤がどのようにして出来てきたのかという経緯の話がメインでした。元々、TensorFlowで出ていたチュートリアルを試して、それがRettyにも活用できそう、という閃きで実際にプロトタイプを作ってみたら上手くいったので、そのまま導入まで話が進んだというのは、スピード感がある。
事例で出てきたのは、ユーザーがアップロードした画像の分類。以前はその作業の殆どが人の手によるものだったのを機械学習で置き換えていった。しかし、機械学習で作成された分類器も万能ではなく、料理は高い精度だけれど、店舗の外観・内装についての精度は低かったそうだ。そこで、料理と判別できたら機械学習の結果をそのまま用い、そうでなかった場合は従来通りに人力で分類することで、人の作業量自体を減らすことに成功している。使えるところで使う、というところで少しずつ導入していくのは、機械学習に限らず、ツールなどの導入で重要なところ。
また、それを色々な分類器を定義できるようにツール化しており、その入力がCSVというのも個人的には良い設計だと思った。なるべく多くの人が扱いやすいインターフェースを採用することで、結果的に、エンジニアの負担を少なくビジネスは早くすることができると思う。スタートアップらしい感じだった。

懇親会

Rettyさんのオフィスのある麻布十番近辺で有名のお店「天のや」さんのたまごサンドが最高でした。

なんか色々聞いたことをメモっとく。

  • 現在麻布十番のオフィスには100名くらい。うち40名がエンジニア。
  • 基本はオフィスでの勤務。家庭の事情などを考慮してリモートは可能。
  • オフィスも見せてもらったけど、6つくらいのデスクで島が作られて、それらが並んでた。それらの間を遮るものが少なくて、とても広い。
  • うわさの機械学習基盤も見せてもらえた。基盤むき出しのままで稼働してるものもあって、自作感がすごい。
    • 総工費は100万もしなかったらしい。
    • 電源もオフィスにある通常のものを利用。月の電気代は不明。
  • Rettyのユーザーとの交流会を

創業から6年が経ち、ユーザー数も増えて、社員数が増えつつも、拠点を1ヶ所にし、社員同士やユーザーとの繋がりを大事にしている雰囲気があり、スタートアップらしさが残ってて良い雰囲気の会でした!Rettyさん、ありがとうございました!

天のやのたまごサンドによる多幸感の余韻が…

参考

*1 元弊社社員。たまたまデスクが近かった頃があるから既視感ある。

*2 そもそもあるのかな?