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

Retty裏入社式2017を行いました!

みなさん、こんにちは。 新卒エンジニアとして4月から入社しました新卒エンジニアの田松、竹野、Brenton(ブレントン)です。 今回はRettyの伝統行事になりつつある「裏入社式」というものについて紹介します。

f:id:rettydev:20170522164423j:plain

Retty裏入社式とは

裏入社式と聞いてピンと来ない方も多くいらっしゃると思いますが、決して怪しいことをしている訳ではありません(笑) Retty裏入社式とは、2016年の新卒が企画し実行したことが始まりとなった行事で、新卒全員で社員を巻き込む行事を企画、運営し、実際に行っているものとなります。 去年の裏入社式の様子はこちらに記事が挙がっています。

今年はこんな新卒が入ってきたんだよ!と全社を巻き込む最初の機会であり、入社後の新卒同士、他社員との繋がり強化や、伝統作りとして今年も開催させて頂きました。また、入社式で社員さんに祝ってもらった僕たちが今度は社員さんに恩返しという意味も込めて楽しい行事を考えてみました。

今年の裏入社式のテーマ

さて、今年の裏入社式ですが新卒の総合職が企画を考案し、今年の新卒にはエンジニアがいるので、その企画に合わせて僕たちエンジニアがサービスを一つ作らせて頂きました。

今年のテーマは「修学旅行」です。 社会人の僕たちが学生の頃を思い出せるような内容を企画組が考えてくれました。修学旅行と聞くと誰でもワクワクしますよね!

開発したサービスは、人から探すマップです。Rettyの強みである実名制という性質を使って、信頼できるあの人が実際に行ってオススメしているお店を地図上から探すことができるというサービスです。このサービスを社員向けに作成し、使って頂きました。

実際に行った内容

実際に行なった内容ですが、複数チームに別れて社員とのゆかりある店をクイズ形式で出題し、そこに来店を朝昼夜と行い、クイズの正解数に応じて景品がもらえるとういうものです。また、途中のレクリエーションでは花屋敷に伺いみんなで遊び、面白い写真大会を行いました。ここで面白い写真を撮ったチームにポイントを付与し、そこでもポイントを稼げる形を取りました。

そこで、クイズの選択肢としてエンジニアが作ったマップ内のお店、口コミを使い、そのままマップのルートに従って来店しました。

サービス概要

今回のサービスは、現段階ではリリースされるものではないので、アプリ内には実装せずスマホwebを利用しました。 自分が選択した人の行ったお店リストが地図上に表示され、口コミを見ることができます。 アプリ版のRettyの地図表示に似たような画面になっていますが、現在、Rettyでは自分が信頼できる人の行ったお店をリストから閲覧することが出来ますが、それをマップに表示する機能が備わっていませんので、今回はこの課題を新卒エンジニア3人で解決してみました。

f:id:rettydev:20170524144055p:plain

機能要件

サービス中の機能要件は

  • Google Map APIを利用し、複数店舗の店の地図表示機能
  • 作成された上記の地図の複製・編集機能
  • ユーザーIDを入力としたお店の簡易な検索ロジック

の3点になります。

サービスの構成

今回作成したWebアプリケーションは、特段凝ったつくりでなくシンプルです。

フロントエンド側は

バックエンド側は

開発時間も限られていることから、なるべく危険を犯さずシンプルな作りにして分業をしやすくし 各分担の担当者が使い慣れているようなもの、を使った形です。

tornado(Python)を利用したWebサーバ

tornadoは、スケーラブルでノンブロッキングなWebサーバを 簡単に構築するためのライブラリです。

C10K問題の解決に向けて、スレッドの使い回しを行ってくれます。 今回のサービスは社員向けだったため 、やや過剰性能になりますが 使い慣れている技術を使う、ということで採用しました。

以下のようなコードでWebサーバが構築できます

from tornado import ioloop, httpserver, httpclient


class MainHandler(web.RequestHandler):

    def __init__(self, *args, **kwargs):
       super().__init__(*args, **kwargs)
       logger.debug(self.get_template_path())

    # GETリクエスト
    def get(self):
       # do something ...
       self.render("index.html")

    # POSTリクエスト
    def post(self):
       # do something ...
       fuga = {"hoge" : "fuga"}
       self.render("index.html", data=fuga)


def make_app():
    return web.Application([
          (r"/", MainHandler), # {endpoint}/ -> MainHandler に ルーティング
       ],
       template_path=os.path.join(os.getcwd(),  "templates"),
       static_path=os.path.join(os.getcwd(),  "static"),
       debug=True, # ファイルの更新の自動同期機能等が有効となる
    )


def main():
    port = 10000
    app = httpserver.HTTPServer(make_app())
    app.bind(port)
    app.start(1)  # CPU数. 0:全てのCPU 
    ioloop.IOLoop.current().start()

また簡易なテンプレートエンジン*1も備えており、下記のようなテンプレートの使い回しが可能です.

<html>
   <title> {% block title %}裏入社式プロジェクト 2017{% end %} </title>

   {% block ext_block %}
   <p> デフォルトの表示  </p>
   {% end %}
</html>
{% extends "base.html" %}

{% block title %}Viewモード{% end %}

{% block ext_block %}
  <p>Hello world!</p>
{% end %}

MySQLにおける地図のハッシュIDの生成

今回サービスを構築する上で GETリクエストのパラーメータに ハッシュIDごとに地図を表示/編集します.

例えば、以下のようなURLを発行します

https://[endpoint]?id=7ae63asofmkl23iord

今回、重複がないような新しいハッシュ値の発行をMySQLだけで実現しました. やり方としては、新しいレコードをINSERTするときのAFTER トリガーに 以下のようなSQLを発行し これを各種データと関連づけただけになります

INSERT INTO ura2017_map_hash (map_id, hash) 
VALUES (NEW.map_id, MD5(NEW.map_id))

UNIQUE制約を設けておくことで, 重複する場合には新しいINSERTは失敗します.

裏入社式を終えて

今回の裏入社式が新卒メンバーでの初めてのチーム開発となりました。新卒だけでチームを組み、企画から開発までみんなで行うといった経験はなかなかできるものではなく大変貴重な機会でした。この行事を通して新卒同士はもちろん、普段喋れないような社員さんたちとも深く交流することができ、多くのことを学ばせていただくことが出来ました。裏入社式がRettyの伝統となり、来年以降も続いていくと面白いですね!

*1:tornado.templateに具体的な仕様・利用例があります.

RettyとKotlinの歩み〜アプリからサーバサイドまで

RettyでAndroidエンジニアとして働いている福井 と サーバサイドエンジニアの石田です。 本日Googleから「AndroidでKotlin正式サポートする」と発表されました! 🎉🎉 そんなKotlinですが、弊社では去年2月頃からプロダクトに導入しています。今回はその歩みと一年以上使ってきた感想をご紹介します。

Androidでの導入事例

最初にKotlinを導入したのはAndroidチームでした。タイミングとしては1.0が正式リリースされる少し前から導入を検討していました。

まずはプロダクトと直接関係ない小さなアプリを書き、これで行ける!と判断したのと正式リリースのタイミングがちょうど重なり導入を決断しました。1 プロダクトに導入する際は、新規ファイルを作成する時にJavaではなくKotlinで書くといったようにファイル単位でじわじわKotlin化していきました。今ではJava : Kotlin = 2 : 1 くらいの割合まで増えています。

現在Androidアプリをリニューアルする計画があって実際に開発も始まっているのですが、今のところ フルKotlin です。特に大きな縛りもなくJavaかKotlinかどちらで書くのかは各開発者に委ねられているのですが、全員がKotlinを選択したということになります。

Androidでの導入してよかったところ

JavaではなくKotlinを選んだ理由はいくつかあるのですが、実際Androidアプリに導入して特によかったところを簡単に2点挙げていきます。

コレクションが便利

Javaと比較してKotlinはコレクションが充実しています。 例えば、ユーザ情報が格納されたListのうち、課金ユーザのみ取り出したいといった場合はこれだけで書けます。 (弊社のサービスではユーザさんに課金する機能はありません。あくまで一例です。)

val premiumUsers = allUsers.filter { it.isPremium == true }

Delegationが充実している

Javaにはない機能としてDelegationがとても便利です!Lazyなんかも好きですが、Observable も大好きです。これを使うと気軽にreactiveなコードが書けたりします。

例えば何かの状態を表す文言を表示するTextViewを表示する場合、その状態をObservableしておけばいい感じに表示されます✌️ コードはたった3行!

    var status by Delegates.observable("") { _, _, new ->
        statusTextView.text = new
    }

サーバサイドでの導入事例

AndroidチームがKotlinを導入してまもなく、アプリAPI開発チームがKotlinに興味を持ちはじめました。

もともとアプリAPIはJava8で作られた比較的新しいプロダクトで、Optional型やラムダを積極的に使っていたため、当初は導入に消極的でした。

が、チームメンバの1人がおもむろにKotlinでエンドポイントを開発→すんなり動いたことをきっかけに導入に拍車がかかり、新規で作成するファイルや、既存の小さいファイルのリファクタリングを積極的にKotlinで書くようになりました。2 こちらも現在ではJava : Kotlin = 2 : 1 くらいの割合まで増えています。

サーバサイドでKotlinを導入してよかったところ

導入のきっかけはあまり積極的なものとは言えませんが、結果的には導入してよかったと思っています。その中でも特に良かったところを以下に2点挙げたいと思います。

拡張関数が便利

Kotlinには既存のクラスにインスタンスメソッドを追加で生やせる、拡張関数という機能があります。「このクラスにこんなメソッドもあったらいいのに!」と言ったケースに、**Utilsみたいなクラスを生やしたりしなくてよくなります。例えばMapからクエリ文字列を生成する関数を以下のように定義することができます。

fun <K, V> Map<K, V>.toQueryString(): String {
    return this.keys.map { key ->
        this[key]?.let {
            "$key=${URLEncoder.encode(this[key].toString(), Charsets.UTF_8.toString())}"
        }
    }.filterNotNull().joinToString("&")
}

そして、これを定義しておけば、他のインスタンスメソッドと同じように map.toQueryString() とコールすることができます。

データを持つだけのクラスを簡単に記述できる

サーバサイドの場合、他のプロダクトとのやり取りをする上でデータ形式を定義するケースが多いと思いますが、Javaの場合、単にデータを持つだけのクラスを作るだけでもgetter/setterを含めて結構な行数のクラスを書く必要があります。こういったケースのためにKotlinにはデータクラスというものが用意されていて、プロパティを複数個持つだけのクラスをシンプルに記述できます。

data class User(val userId: Int, val userName: String, ...)

KotlinはNULL安全や型推論をはじめとする、モダンな言語の機能を一通り揃えていて、一見目新しい機能はあまり無いように見えますが、エンジニアの直感に沿って、比較的ストレスが少なく書ける言語だと感じます。あと名前がかわいい。

Kotlinを一緒に書いてくれるエンジニア募集中!

Androidはもちろん、いろんなプロダクトでKotlinを書きたいエンジニア募集中です!

また、弊社は毎月Androidもくもく会を開いています。もくもく会とはいっていますが、もくもくするだけだはなく質問タイムを取っているので、「実際にKotlinどうなの?」「こういった場合困らない?」など自由に聞いてもらえます! 弊社に入社したいかはともかく、気軽にKotlin書きたい、使用感を聞いてみたいエンジニアさんはぜひお越しくだだい!

retty.connpass.com


  1. 弊社は各プロダクトで使う言語・フレームワークは各チームの判断に委ねられているのでサクッと導入することができます✌️

  2. 弊社は各プロダクトで使う言語・フレームワークは各チームの判断に委ねられているのでサクッと導入することができます✌️ ※大切なので二回言いました

PyCon mini Kumamoto 参加報告! #PyConKuma

f:id:rettydev:20170425150903j:plain

Retty株式会社に4月から入社しました竹野です。

入社早々になりますが先日の4/24に熊本で開催されました
PyCon mini KumamotoにRettyも参加してきました!

本日はその報告をさせていただきます!

TD;LR

  • PyConだよ。全員あつまれ in 熊本
  • Rettyも参加したよ
  • やっぱりいいよね、Python

PyConとは?

Pythonista(Python使う人)があつまるプログラミング言語コミュニティのことです。 好きなフレームワークPythonを使った開発・分析事例などなど Pythonに対するアツイ思いを語ります!
今回はそんなPyConが熊本にて開催されました、テーマは「未来」です

大盛況で終えたPyCon mini Kumamotoでしたが
今回この場を借りて、その発表の一部をここで紹介させていただきます。

Python お前なによ

キーノートでは Ian Lewisさんより
5年にわたるコミュニティ運営に携われた経験から、Pythonのコミュニティ活動の歴史と これからの課題について整理していただきました。

Pythonがこれだけ活用されるようになったのは
後方互換性を保証することで積みあげられたた長年の信頼の結果」という お言葉を寺田さんからいただいてハッとしました。 プログラミング言語においても大切なのは「人」であることに違いありません

余談ですがPyConJP恒例の 「おまえ、誰よ?」の元祖がイアンさんというのに驚きでした!

まだ見ぬバグゼロという未来

SQUEEZE レガシーコード改善録(スライド)

SQUEEEZE 新井さんよりの社内での取り組みについての発表でした。
Python成分は少なめですが、内容は特濃!

「テストコードがほとんぞ存在しなかった現場」で
「テストを書く習慣を普及させる」までのお話です。

企業のあるあるからに始まり、コードの品質を保証するための文化普及させるまでの勘所や
大事なマインドセット弊社にも取り入れるべきところは皆悪と思います。
数値の見える化がみんなの意識を変えていく、というお話がとても印象的でした。

Python@AWS LambdaとDjangoを使ってアスキーアート自動生成Webアプリを作ってみた

熊本に本社を構える株式会社ワイズリーディングの矢野さんからのご発表!
asciiアートを画像から自動生成するサービスを構築するお話しでした。

画像→ascii文字の系列変換を行うための問題の定式化から
それをWebにのっけるまでのお話は、「おぉー」となるところが多く、聞いていてとてもワクワクしました!

PyCon JP 2017でのご発表も検討されているそうなので、参加される方は必見です!

Rettyからの発表

大盛り上がりのPyCon mini Kumamotoでしたが
弊社の岩永、中川の発表に加え、僕もLTさせていただきました!!

数理モデリングからはじめるPython数理最適化

f:id:rettydev:20170425150906j:plain

弊社の岩永が数理最適化に関する発表を行いました。

発表ではPythonライブラリのPuLPを利用した数理最適化の導入にはじまり
Retty上のデータを活用して「グルメな人で東京のおいしいお店を網羅する」問題を
数理最適化の問題として解きました。

ScrapyとRedashではじめる野球統計学福岡ソフトバンクホークスを添えて

f:id:rettydev:20170425150905j:plain

ScrapyとRedashではじめる野球統計学(スライド)

野球xPythonといえば…中川さん!
今回は得点価値からみた、福岡ソフトバンクホークス北海道日本ハムファイターズの打線の分析について発表を行いました。

Pythonによる自然言語処理 2017 〜spaCyの紹介〜」(LT)

f:id:rettydev:20170425150907j:plain

Pythonによる自然言語処理2017 〜自然言語処理ライブラリ spaCyの紹介〜

Python自然言語処理ライブラリspaCyについて簡単に紹介してきました。
spaCyでは自然言語処理用途に特化したインタフェースを提供してくれます。

せっかくなので簡単に解説させてください パイプラインや系列ラベリングのデコーディング、学習などの自然言語処理用途に特化した インタフェースを提供してくれるライブラリはほとんどないのですが、spaCyはそれを提供してくれます。 そしてIndustrial-Strengthとうたうだけに、これまでのライブラリと比べると速くなっています。

僕のなかでのイチオシは オンライン学習によるモデルの更新も可能になっています。
特に自然言語処理タスクはドメイン依存の傾向が強いため、この更新機能は実応用する 上で嬉しい機能となっています。

PyCon mini Kumamotoを終えて

今回参加して、みなのPythonにこめる想いを肌で直に感じることができました!  

マイコンからWebサービス、ネイティブアプリの構築方法、そして機械学習やデータ分析まで これだけ多くの分野の方々が、一同に会し共有できる場というのは滅多に無いように感じます。 これもひとえにPythonの開発やコミュニティ運営に携わってきた方々の血と涙の結晶によるものです。

運営のみなさま、熊本のみなさまありがとうございました!

f:id:rettydev:20170425150910j:plain

【オマケ】RettyはPyCon JP 2017にプラチナスポンサーとして協賛いたします!

RettyはPyCon mini Kumamoto 2017に引き続き、

日本最大のPythonのお祭りPyCon JP 2017にプラチナスポンサーとして協賛させていただくことになりました!

PyCon JP 2017スポンサー一覧

当日は企業ブースの出展やノベルティーだけでなく、社内のPythonista達がPyCon JPを盛り上げるべく色々と準備をしていますのでお楽しみに!!

RettyではPythonistaなメンバー達と一緒にビックデータ基盤を作りたいエンジニアを募集しています!

Retty流Pythonのススメ

みなさんこんにちは.

お店さん*1商品(FRM*2商品開発)チームでTech Lead(エンジニアリーダー)をしています, nakagawa(@shinyorke)ともうします.JOINしてから3ヶ月たちました.

FRM商品開発チームではエンジニアチームのマネジメントやプロダクト企画・開発を行いつつ,個人としてはPythonが大好きで公私共に良く触って(愛して)います.*3

このエントリーでは,最近のRettyにおけるPythonの利用事例や学び方を紹介したいと思います.

  • Rettyのエンジニアチームの雰囲気を知りたい
  • 機械学習・Deep Learning以外のPythonの使われ方ってあるの?
  • 学ぶ際のオススメが知りたい

上記のどれかに当てはまる皆さま,是非最後までお読みいただけると幸いです.

Retty流Pythonのススメ

「RettyにおけるPython利用状況」「Python学習ノウハウ」「コミュニティ」の3つのテーマで紹介します.

使い方〜RettyにおけるPython利用状況

RettyではプロダクトのコードとしてPHP,Java,Javascript(node.js), Kotlinなど様々な言語・フレームワークが使われています.*4

Pythonもよく使われている言語の一つで,

  • 機械学習自然言語処理など,データサイエンティストなお仕事.いわゆる「PyData*5」と呼ばれる分野.
  • サービスレベルでのデータ運用(ETLなど).データベースやログなどからデータを収集&活用するためのスクリプトやバッチなど.RettyではTreasure Dataとの連携周りで活用しています.
  • 手元の作業(CIやデプロイなど)を楽にするためのスクリプトや便利ツール作成・運用. bashzshで書くのには重いな…というものをPythonで開発など.
  • 管理ツールなど,小規模のWebプロダクト開発. 私の観測範囲内ではWebフレームワークとしてDjango*6がよく使われています.

といった形でプロダクトやツールで目的に合致している箇所で活用しています.

ユーザーさんやお店さんが使うサービス・プロダクトへの適用については,リニューアルのタイミングでPythonでリニューアルする計画があり,徐々にではありますが進めている最中だったりします.

学び方〜RettyにおけるPython学習のノウハウ

主に私の啓蒙活動になります笑.

徐々にPythonistaが増えてきて,Pythonをはじめようかな?覚えようかな?といったエンジニアメンバーもちらほら増えてきており,オススメの学び方や本について聞かれる機会が多くなりました.

そんなメンバーの皆さんが快適かつ素早くPythonを学習できるよう,社内のQiita Teamに学習のためのTipsページを立てています.

ちなみに私は以前Python入門者向けの学習フローを公開しており,こちらで得た知見および過去の実践経験*7を元に,社内のQiita Team内にページを作成・公開しています.

ここですべてを公開できないのが残念ですが,これからPythonを覚えるぞ!という方にポイントを簡単にご紹介します.

Python 3を使うこと

  • Python 2は2020年でサポートが終わる. PEP373に明記されています.
  • PyDataやWebフレームワークもほぼ全てPython 3対応が進んでおり,2を選ぶ理由が限りなく少ない.
  • AWS LambdaやGoogle App EngineなどのPaaS系サービス,インフラ系ツール(aws cli, gcloud)などは一部未対応,ここだけ2を使う.

AWS LambdaはPython3.6に対応がされているとのことです!リリースノート(AWS)

公式のチュートリアルを活用

コミュニティのイベントや勉強会に参加する

その他いくつか細かいポイントがあるのですが,こちらはまた別の機会で紹介できればと思います.

コミュニティ〜参加・登壇の支援とスポンサー

学ぶためには社内の知見のみならず,外のコミュニティを活用して幅広く知見を得ることも重要です.

Rettyではコミュニティ主催のイベント・カンファレンスや勉強会の参加をチケット代・交通費負担などで積極的にサポートしており,DroidKaigi 2017データ分析基盤Nightなど,登壇するメンバーも増えてきています.

Python使いも負けてられない!…ということで,この度4/23(日)に開催される「PyCon mini Kumamoto 2017」にゴールドスポンサーとして協賛させていただくことになりました!

kumamoto.pycon.jp

Rettyからはスポンサードの他,データサイエンティストの岩永が数理最適化について,そして僭越ながら私nakagawa(野球の人)はScrapy*8とRedash*9を用いた野球データ分析についてトークをさせていただきますので,お時間がある方は是非いらしてください!

まとめ

いかがでしたでしょうか?

RettyでのPython活用事例を通じて,学習の仕方やコミュニティ・イベントの参加などのきっかけ作りになってもらえれば幸いです.

最後になりましたが,RettyではPython使いを募集しています!

食やPythonに関するお話はもちろん,PyCon mini Kumamotoの土産話やこのブログに対する意見ツッコミなど,お話をしたくなった方は是非遊びに来てください!

素敵なPythonistaライフを!

*1:レストランや飲食店のこと.Rettyではみなさんへの敬意を大切にする意味でお店さん,と呼んでいます.同様の理由でユーザーはユーザーさんと呼んでいます

*2:Fun Relationship Managementの頭文字でFRMと呼んでいます,いわゆるCRMのC(Customer)の部分をお店さんから見た場合のFun(ユーザーさん)に置き換えたプロダクトとなります.

*3:Pythonコミュニティーでは「野球の人」と呼ばれています.詳しくは「野球 Python」「野球統計学」「セイバーメトリクス」で検索してみてください.

*4:言語やフレームワークの取捨選択は各チームのTech Leadとチームに委ねられているため,様々な環境が存在します.

*5:https://pydata.org/ Pythonを用いたデータに関するあらゆることをオープン化してデータ活用をもっと便利にしよう,という取り組みとコミュニティのこと.日本にもPyData.Tokyoほか,幾つかのコミュニティがあります.

*6:Pythonで最もメジャーなWebフレームワークで,海外ではInstagramをはじめ事例が多数,日本ではチケットキャンプさん,connpass(ビープラウドさん),ビザスクさんなどで使われています.

*7:仕事で触り始めたのが2011年なのでかれこれ6年ちょっとPythonにたずさわっています

*8:Python製のWebクローラ・スクレイピングフレームワーク.サイトの収集からデータ取得まで,DjangoRuby On Railsの用にアプリとして書けるのが特徴 https://scrapy.org/

*9:Pythonベースのデータ分析・基盤ツール.TableauやMackerelと同じような用途で用いられる https://redash.io/

DroidKaigi 2017でAndroidアプリのパフォーマンス改善について発表しました

RettyでAndroidエンジニアとして働いている福井です。 3月9日、10日と二日間に渡って開催されたDroid Kaigi 2017にスピーカーとして参加してきました。

概要

提出したプロポーザルを引用します。

Androidアプリ開発で避けて通れないパフォーマンス改善ですが、細かいtipsなどの話がされがちです。どこから手をつけていいのか、どうやって調査していくのかのノウハウはあまり多く語られていません。

本セッションでは実際のオープンソースのアプリ(Android N Easter Egg Neko) を題材に、パフォーマンスが悪化した際に「どのように調査するか (Android Studioなどのツール使い方)」から「実際のコード改善」までの一連の流れをお話しします。皆さんが自分のプロダクトで実際にパフォーマンス改善できるようになる知見を共有するのがゴールです。 また、初心者でも手をつけやすいよう、普段から開発者が慣れ親しんでいるAndroid Studioやadbのツールを取り上げたいと思います。

RettyではAndroidもくもく会を毎月実施しており、Android初心者の方ともお話しする機会がよくあります。そこで感じるのは、設計のお話はweb上でよく見かけるけので(バズワード的に)最近Androidを始めた方でも話題についてこられるけれど、デバッグ関連の技術についてはそれほど変化がない分野だからか目にする機会が少ないんだなぁということでした。デバッグ技術の中でも、他の人より少し知見がある*1パフォーマンスのお話をしようと思い、このテーマを選択しました。

発表内容

私のトークテーマはパフォーマンス改善についてでした。オーディエンスの対象を初心者から中級者としていたため、わかりやすく丁寧に伝えるように心掛けたのですが、その結果全セッションの中でおそらく一番ゆるふわでほっこりセッションになったんじゃないかなぁと思います。

発表してみて

割と低レイヤーの知識が必要になってくるパフォーマンス改善を対象にしてしまったのですが、なるべくわかりやすく簡単に噛み砕いて伝えられるように頑張りました。改善前後の比較のスライドではオーディエンスの人が拍手してくれたりと嬉しかったです。

パフォーマンスの改善は地道な作業ですが、ユーザさんの満足度にも直結する重要な作業です。開発者の目線でも、パフォーマンスを阻害する原因をコードの中から見つける宝探しのようなワクワク感があって個人的には好きな作業です。普段なかなか手を出せないでいる人の一歩を踏み出すきっかけになれば嬉しいです。

おまけ

今年のDroid Kaigiにはフォトブースが用意されていたのでRetty Androidエンジニア勢で撮ってもらいました!

f:id:rettydev:20170313133000j:plain

この愉快な3人と一緒に働いてくれるAndroidエンジニアさんがいらっしゃったら是非下記からご応募してください!٩( ‘ω’ )و 一緒にKotlin書きまくりたいそこのあなたも、週一でリリース出して施策を回しまくりたいそこのあなたもお待ちしています!!

www.wantedly.com

*1:私は前職が組み込み系なので、パフォーマンスにセンシティブなお仕事でした。メモリリークという単語に未だに怯えます!

日本初上陸!NVIDIA Quadro GP100×Ryzenマシンが #bcu30 に登場します!

f:id:rettydev:20170309171946p:plain

※3/10 9:20 消費電力ワット数に誤りがあったため修正

みなさんはじめまして.

今年の1月からRettyにエンジニアとしてJOINしました, nakagawa(@shinyorke)ともうします.*1

Rettyではお店さん向けプロダクトのエンジニアリーダー(Tech Lead)やエンジニアチーム全体のスクラムマスターを,プライベートではPythonと野球をテーマに分析やプロダクト開発をさせてもらっています(「野球」「Python」で検索すると色々出てきます!).

そんな私のRetty Tech Blogの初エントリーはPythonの何か…といいたいところですが,今度の週末(3/11)に開催されるU30若手エンジニアが集うカンファレンス「Battle Conference U30(#bcu30)」の企業ブースに登場する最新の機械学習マシン,

日本初上陸!NVIDIA Quadro GP100マシン×Ryzen

について,ちょいとお話させて(ドヤらせて)もらえればと思います!

【おさらい】Rettyの機械学習と基盤の歴史

昨年のRetty Advent Calendarのラストで, CTOのtaruさんが,

Retty 機械学習基盤を秋葉原に買い物に行って自作した話

を公開した所,はてなブックマークでホットエントリー入りなど,大変大きな反響をいただきました.

qiita.com

改めまして,ありがとうございます(._.)

その後, TensorFlow User Group #3でも改めて紹介させてもらったりなど,今年に入ってからも数々の反響をいただいています.

TFUG#3 Retty流 「2200万ユーザさんを支える機械学習基盤」 の作り方 // Speaker Deck

TFUG#3 RettyにおけるDeep Learningの自然言語処理への応用事例 // Speaker Deck

そろそろ新ネタが必要な予感!?

…と言うわけではないのですが(笑),

面白いことをやろう新しい機械学習基盤を作って「Battle Conference U30(#bcu30)」に出展しよう!ということになり,RyzenをGetした3/3から企画がスタートしました.

なお,写真でお察しの通りこちらのマシンはtaruさんはじめ,有志のメンバーが #bcu30 のために夜なべして作りました.*2

f:id:rettydev:20170307161548j:plain RyzenをGetしてご満悦のtaru&jp_taku2

f:id:rettydev:20170309174320j:plain Quadro GP100×2枚が刺さっているところ

f:id:rettydev:20170309174414j:plain Ryzen(の箱)

f:id:rettydev:20170309172219j:plain 組み立てているところ

f:id:rettydev:20170309172316j:plain 起動したところ(左側,右隣はAkibaフラッグシップモデル)

ここがすごい!「NVIDIA Quadro GP100×Ryzen」マシン

日本初上陸!

最新Retty機械学習マシンは,先月発表されたばかりの NVIDIA 純正 GPU Quadro GP100 を2基搭載しています! しかもこのデバイスは日本で今週出荷が始まったばかりの新品ほやほやで,日本では Retty 機械学習マシンにしか搭載されていません(2017/3/8現在).この貴重なGPU を,先週発売解禁になった AMDの新CPU Ryzenと組み合わせており,唯一無二の最新機械学習マシンです!

主な特徴

  • 3584基のCUDAコアをもつQuadro GP100を2つ搭載,FP16で40TFLOPSというスパコン並の計算能力.
  • 帯域幅 720GB/s の超高速メモリ"HBM2"を合計で32GB搭載.大きなモデルもどんと来い.
  • PCIeの5倍の帯域を持つ"NVLink"で2つのQuadro GP100を連結.マルチGPUで抜群のスケーラビリティ…を近々発揮する予定*3

家庭用電源で最新のスパコンが動く!

そんなリッチな環境,家庭用電源では動かないのでは!?

…と思いきや,

  • Quadro GP100は1基あたり235W
  • Quadro GP100 ×2基で470W,他の諸々を加えて1,000W未満(推定値)

これなら一般的な家庭用電源(15A×100V)でも問題なく使えます.

なお,マシンはファンの音がほとんどせず,静音性という観点でも家庭でも使えそうです.

触りたくなってきました?

というわけで, (2017/3/9現在)日本に一台しかない機械学習マシンがBattle Conference U30(#bcu30)のRetty企業ブースに登場します!

触れてみたい・触りたい方は是非Rettyの企業ブース,

  • 触れる・遊ぶ!
  • TwitterInstagramなどでシェアする!!
  • (長く触って遊びたくなったら)Rettyメンバーとつながる!!!

という感じで気楽に遊びに来ていただければと思います!

また, (主にOver 30なため) #bcu30 に来られない方は, Wantedlyなどを通じて遊びに来てもらえればと思います!!

なお,(Over 30ですが)当日私もRettyブースにいますので,一緒に盛り上げていけたらなと思っています!

それでは3/11会場でお会いしましょう!

*1:JOINに関するあれこれはこちらのブログに詳しく書いてあります.

*2:3/3のRyzen発売日から並んで即作ってました笑

*3:現時点(2017/3/9)ではマザーボードが対応していないため,NVLinkが使えない状態ですorz近日中に対応する予定です!

データ分析基盤Nightに登壇しました

Rettyのjp_taku2です。

Rettyでは最近、エンジニアが増えてきて AdventCalendar を書ききれる程になりました。
それに伴い、今まではデザイナーやプランナーも一緒に書いていたこのブログをTech Blogとしてリニューアルすることになりました。

今回のテーマは僕がデータ分析基盤Nightに登壇してきたので、それについて書きます。

概要

イベントへの応募が多く来られなかった方も多数いたので、概要を書いて置きたいと思います。
また、Speaker Deckの方にも記載しております。

Rettyの分析基盤の歴史について

Rettyの分析基盤は資料にあるように、Treasure Data、Treasure Data + BigQuery、現在の分析基盤というような順に状況に合わせて変化をしてきました。使用していた際にでた課題は以下の通りです。
Treasure Data
→利用ユーザーが増えてしまい、分析に時間がかかるようになってしまいました。
Treasure Data + BigQuery
→データーの管理が利用している人になってしまい、同じようなデータを別々に出す状態になってしまいました。

現在の分析基盤について

f:id:rettydev:20170223162436p:plain Rettyのデーター分析基盤はAWS AthenaBigQueryハイブリッドで構成されています。 DWHにはS3とAWS Athenaを使用し、データ自体はS3にファイルとして保存することにより、移行の行いやすさと利用のしやすさを意識した作りにしました。 DMに関してはBIツール用にはRDSを使用し、AdHoc分析用にはBigQueryを使用することにより、分析者がストレスなく使える状況を作りました。

機械学習基盤に関して

機械学習基盤は自前でパーツを購入し、オープンソースで構築をしています。 maasjujuを使用しサーバーの構築を行い、cephkubernetesDockerを使用することにり、どのサーバーにログインをしても同じデーターを使用することが可能な環境を構築しています。 GPUに関しては統一されたものを置くわけではなく、用途や状況に合わせて利用ユーザーがサーバーを選択して作業を行います。 その他詳しい内容に関しては以下の記事を参照してください。

qiita.com

まとめ

今回作成した分析基盤が今後も永続的に使い続けられるとは思っていないため、移行のし易さを考慮して設計をすることができたのではないかと考えています。
しかし、今後の課題としてはログを送信する箇所で影響が出ないように改善していく必要があると考えています。
また、分析するためのデータの鮮度をあげていくということも課題になっています。
機械学習基盤に関しては利用ユーザーが増えてきたため、安定性を上げて行こうと考えています。
 
 
 
今後はRetty Tech Blogとして記事を出していきますので、今後の記事も楽しみにしていてください。