LIFULL Creators Blog

LIFULL Creators Blogとは、株式会社LIFULLの社員が記事を共有するブログです。自分の役立つ経験や知識を広めることで世界をもっとFULLにしていきます。

Google I/O 2017 旅日記 〜DAY ZERO〜

こんにちは。Android開発グループの衛藤です。
前回の記事では、準備編をお送りしました。
さて、いよいよ出発の日となり、荷物のパッキングも無事に終わりあとは待つだけ!

成田空港〜San Jose空港〜からのイミグレ

f:id:LIFULL-etotake:20170517064056j:plain:w500
早めに成田空港着。機内食があるため軽く昼食を済ませて出発ロビーで待機中。
I/Oに行く人で結構混んでますね。ほぼ満席状態。
初のボーイング787で飛び立ちました。機内で全く眠れず昼夜逆転状態で到着・・・

そして無事にSan Jose空港に到着し、イミグレへ。 入国には2時間程度かかるという事前情報もありましたが、30分ほどであっさりと入国完了。

f:id:LIFULL-etotake:20170517064049j:plain:w500
ハローサンノゼ!!

I/Oバッジのピックアップ

f:id:LIFULL-etotake:20170517145251p:plain:w500
バッジのピックアップは早いほど良い!ということで空港到着後すぐにスマホ起動→UBERで現地へ。
空港からは20分程度なので意外と近いところにあるようです。

初めてのUBERだったので緊張しましたが、使い方は非常に簡単でした。
現在位置がデフォルト設定なので、行き先を地図上で指定して配車ボタンを押すだけ・・・後はアプリに車種が表示され、その車が迎えに来てくれます。

ちょっと寄り道してほしかったので、試しにドライバーに聞いてみると「アプリから指示されたGPSルートに従って運転するだけだからねぇ」という感じでやんわり断られました・・・
ただ、そういう事なのでタクシーと違って回り道されたりすることはなさそうですね。

ということで、無事I/O会場にも到着しました。
f:id:LIFULL-etotake:20170517064032j:plain:w500

I/OのQRコードをかざしてバッジを受け取り、無事に明日からの参加を待つことができそうです。
f:id:LIFULL-etotake:20170517064040j:plain:w500
こんな感じでそこまで並んでもいなかったです。

Google Merchandise Store

f:id:LIFULL-etotake:20170517064259j:plain:w500
時間が余ったので、ふらっとGoogle Merchandise Storeに立ち寄りました。
せっかくなので会場から歩いて行ったのですが、Googleの街が広すぎ、また寝不足により疲れがピークに。しかもデカイスーツケース付き。

なんとかお土産の大量購入に成功し、フラフラしていたら・・・

f:id:LIFULL-etotake:20170517064251j:plain:w500
例の彼がいました!!
ここで初めてGoogleに来た実感が湧いてきました!
f:id:LIFULL-etotake:20170517064243j:plain:w500
人々が彼の写真を撮る名所のようです。

INTEL GOOGLE I/O DAY ZERO PARTY 4.0

f:id:LIFULL-etotake:20170517144017j:plain:w500

Google I/Oは明日5/17から始まりますが、前日はIntelで前夜祭のようなイベントが開催されます。 初めてで緊張しますが、飛び込んできました!
内容的にはIntelの最新技術取り組みのブースが多数展示されており、Intelエンジニアと直接話すことが出来ます。
会場はクラフトビールのお店で開催されるため、様々なビールと食事が無料で楽しめます!
日本人も参加しており、話すことが出来たのも貴重な体験です。

f:id:LIFULL-etotake:20170517144038j:plain:w500
初めてカルトレインも乗りました。日本の電車に比べて賑やかですね。

f:id:LIFULL-etotake:20170517144031j:plain:w500
会場の様子。DJが音楽を流し続けながら・・・

f:id:LIFULL-etotake:20170517144009j:plain:w500
外ではタコスやsushiなどが無料で食べられます。タコスがおすすめです。

f:id:LIFULL-etotake:20170517144113j:plain:w500
23:00くらいまで続くらしいです。

そしていよいよ明日からGoogle I/O 2017開催!
明日のためにも今日は早めにお休みします!

Google I/O 2017 旅日記 〜DAY ONE〜へと続く…

Google I/O 2017 旅日記 〜準備編〜

f:id:LIFULL-etotake:20170512152425j:plain

こんにちは。Android開発グループの衛藤です。
2017年5月17日〜2017年5月19日 Google I/O 2017が開催されます。
今回、初のGoogle I/O参加が決まり、大変楽しみにしています。
折角なので旅日記として体験した事を記録としてブログに残そうと思い、記事を書き始めました。
また、出来る限りタイムリーに記事を上げたいため、現地から投稿を行う予定です。
気になる方は是非ご覧ください!

準備編

f:id:LIFULL-etotake:20170512111856j:plain:w300
Google I/O初参加に向けて、これまで準備を行ってきましたのでまずは準備編としてまとめます。
最後にTODOリストも用意しましたので、来年参加する方々の参考になれば嬉しいです。

Google I/Oチケットに当選したら

毎年、Google I/Oのチケットは抽選で決まります。
今年は2月22日あたりから申し込みが始まりました。後日抽選の結果としてGoogleからメールが届くので、その時点で当選・落選が確定します。

残念ながら落選した場合…

キャンセルが出る場合もあるそうなので、もしかすると当選に繰り上がる可能性も・・・!?

当選したらまず行うこと

  • 航空券
    直行便はすぐに予約で埋まってしまい、経由便しかなくなるので要注意。

  • ホテル
    Google I/Oが開催される近辺のホテルが次々と埋まっていき、最終的には空いていたとしてもかなり価格が高騰します。
    私はとあるホテルを予約しましたが、その時に比べて1万円近く跳ね上がっていました。
    場合によってはAirbnbを使って安く済ませるのも有りかと思います。

Expediaなどでホテルと航空券を一気に予約する方がおすすめです。(ホテルへの予約確認も全て代行して行ってくれるため。また24時間サポートなので何かあれば電話で相談すれば良い)
安いがキャンセル不可、というものもあるので注意が必要。

滞在する場所選びも重要

今年も去年と同様Mountain ViewのShoreline Amphitheatreで開催されます。
私はMountain View近辺にてホテルを予約しましたが、San Francisco近辺で取る方も多いようです。
また、毎年Google I/OのWebサイトにGoogle推奨ホテルが掲載されており、Googleによって予め部屋がブロックされているとのこと。
ただ少し高めのホテルなため予算との兼ね合いで決めると良さそうです。
ホテルによってはGoogle手配のシャトルバスもあり、イベント現地まで無料で送迎してくれます。

I/Oのスケジュールを把握&座席予約

Google I/OのスケジュールはGoogle I/OのWebサイトで発表されます。
Googleアカウントでログインすると、セッションそれぞれ「+」ボタンで印を付けることができるようになり、My I/Oタブでフィルタリングされて表示されるなど、当日のタイムスケジュールを組む際に便利なので活用できそうです。
セッションについては、前もって座席予約をしておくことが出来ます。

また、AndroidiOSでGoogle I/Oアプリも公開されます。
アプリでは会場のマップも表示され、現地では必須アプリになりそうですね。

Android版アプリの会場マップ
f:id:LIFULL-etotake:20170511105313p:plain:w300

当日までにやっておくと良いこと

Google+のコミュニティ参加

Google+のアカウントを持っていれば、Google I/Oに関するコミュニティに入ることが出来ます。
イベント当日までにホテル事情やスケジュールのアップデート情報等、タイムリーに把握することが出来るのでおすすめです。
私はGoogle I/OGoogle I/O GDC Japanコミュニティに参加させていただきました。

Intel’s Google I/O Day Zero Partyの参加登録

毎年開催されているようですが、前夜祭イベントがI/O前日に開催されます。(今年は2017/5/16 19:00~)
Eventbriteで公開されるので、興味があれば事前に予約しておくとよいです(21歳以上)。私も参加してみることにしました。
前日においしいクラフトビールを飲みながら様々な国のエンジニアと交流するはいかがでしょうか?
会場へは近くのカルトレインの駅からシャトルバスが出るとのこと。

TODOリスト

簡単に必須項目についてのTODOリストを作ってみました。
他にもたくさんあると思いますが、とりあえずないと困るであろうものをピックアップしています。
一般的な海外旅行の必需品等は除いています。

項目 内容 備考
パスポート 期限を確認する 1週間ほどかかるので余裕を見て
ESTA ESTA公式サイトから申請 原則出発72時間前までだが、早めのほうが吉
米国国土安全保障省(DHS)により2009年1月12日から義務化
eTa カナダ経由になる場合は必須
宿泊 ホテルやairbnbなど I/O WebサイトにGoogle推奨ホテルが掲載
早めに予約推奨
航空券 近いのはSJC 早めに予約推奨
Wifi/SIM 現地での通信用 海外SIMの方が安いが、SIMフリー端末が必要
海外旅行保険 楽天トラベルなどで申請する
たびレジ登録 外務省のWebページから登録 旅行者情報の登録
モバイルバッテリー 大容量だと安心 個数や容量に関して機内持ち込み制限もあるので航空会社のHPで確認を行うこと
変圧器 必要があれば スマホ等は基本ユニバーサル仕様なので問題ないはず ※1
印刷物 パスポート
Google I/Oチケット
ホテルの予約確認ページ
航空券のeTicket控えなど
万が一のときのため
水筒 会場のウォーターサーバーで水分を蓄えておく 気温差が激しく、昼は暑いらしい
Uberアカウント 現地移動手段として 予めクレジット登録も済ませておく
日焼け止め 黒焦げ対策 日光が強い

※1: 変換プラグについては、北米であれば日本と同じAタイプのため基本的には不要。電圧の違いだけ注意すること(電源タップ持参する場合、120V対応でないと燃えたりする)

電源関連については、以下のUSB用の電源アダプタが非常に便利です。
Anker | PowerPort Speed 5 Quick Charge 3.0 | Black
f:id:LIFULL-etotake:20170512095749j:plain:w300
今回、電子機器関連は以下のものを持っていくのですが、多すぎてUSBのアダプタがかさばる&コンセント足りないかも問題を解決してくれます!しかも海外電圧対応。

  • Android
  • iPhone
  • Wifiルーター
  • モバイルチャージャー(充電はUSB2ポートで急速充電タイプ)

最低でもUSB充電が5つもあり、充電問題に悩まされそうなので購入しました。そこまで重くもなく大きすぎることもなく、重宝しそうです。

社外向け報告会の告知

2017/5/26(金)に株式会社LIFULL 半蔵門オフィスにてGoogle I/Oの報告会を行います!
今年4月に移転したばかりのキレイなオフィスに是非足を運んでみてください!

f:id:LIFULL-etotake:20170511125444p:plain

以下connpassのページよりお申込みください。
LIFULL.apk #1 - Re: Google I/O 2017

スピーカー枠やLT枠も募集中です。
皆様の参加を心よりお待ちしております♪


Google I/O 旅日記 〜DAY ZERO〜 へ続く…

アプリをApple TVに対応するときにデザイナーが考えたこと

こんにちは、LIFULL HOME’Sアプリのデザイナーをしている、コイズミです。

この度、LIFULL HOME’SはiOSアプリをApple TVに対応させるアップデートを行いました! LIFULL HOME’SのApple TVアプリは、新築マンションを特集(ペット可や駅近など)から探すアプリです。 f:id:nextdeveloper:20170405112336p:plain

※東京・神奈川・千葉・埼玉・名古屋・大阪のみ対応

新築マンションって、写真がきれいで夢が広がりますよね! 今回は、tvOSのアプリ開発を通して、iOSアプリと提供するUXの違いや、デザイナーが気をつけるべきポイントをお伝えしたいと思います。

f:id:nextdeveloper:20170405112433p:plain

LIFULL HOME'Sアプリ ダウンロードはこちら

続きを読む

継続的社内勉強会を支える仕組み

お久しぶりです。 半年ぶりになってしまった技術基盤部の相原(kaihar4)です。

今回は、私が入社した直後あたりから続いている社内勉強会のTech Talk Lunchについてと、そのTech Talk Lunchを長く続けていくために取り組んでいる仕組みの紹介をしていきたいと思います。

  • Tech Talk Lunchとは
  • 長く続けていくための仕組み
    • トピックを限定しない
    • トピックは持ち寄り
    • ランチタイム開催
  • 社内勉強会を続けるメリット
    • 技術的視野の広がり
    • 他部署との関係構築
    • 発信の習慣化
    • 情報収集の習慣化
  • さいごに

Tech Talk Lunchとは

Tech Talk Lunchとは、その名の通りお昼に開催される私が知る限り社内でも有数の長く続いている定期開催の社内勉強会です。

毎週月曜日の13時から14時までの1時間、前の週の最新ニュースを中心に各自がトピックを持ち寄り、1人5~10分程度を目安に持ち寄ったトピックを自由に共有します。 持ち寄るトピックに制限はなく、現在でもビジネス的なものからアカデミックな論文の紹介、土日に読んだおすすめの技術書に面白いウェブサービスの紹介まで、様々なトピックが共有されています。 また、共有形式もスライドを用意するといったことはなく、大抵はウェブページを見ながらであったり、用意していても簡単なメモ書き程度で、緩く共有するというコンセプトとなっています。

最初はチームのメンバー3人でスモールスタートしたTech Talk Lunchも、こうした開催方法を続けた結果、それほど大きくない会議室で開催しているものの毎度満員御礼となり、参加者も新卒1年目からベテランエンジニアにマネージャまでと幅広く参加する社内勉強会となりました。

続きを読む

班分けAI

こんにちは、MAM開発グループの椎橋です。 MAMとはマーケティングオートメーションの略で、マーケティングに関する機械学習アルゴリズムを作ったり、データ分析をして改善につなげたりしています。

今回は社内制度のクリエイターの日を2日間利用して、社員旅行の班分けの最適化モデルを作りました。 以前はこの制度を利用してサーバ・ミドルウェアの勉強をしました。 nextdeveloper.hatenablog.com

弊社の社員旅行は多くの社員が参加し、最高に盛り上がる大イベントです。 社員旅行委員が予算の見積もりからスケジュールまで計画を立ててくれるのですが、 そのスケジュールの中にアクティビティと呼ばれるイベントがあります。 これは班に分かれて観光やスポーツなどを楽しむというもので、私は昨年そば打ちを体験しました。 複数あるアクティビティのうち参加できるのは一つだけな上に、人数の上限が設定されているために希望したアクティビティに参加できるかどうかは分かりません。 昨年は社員旅行委員が抽選と手動調整によって班分けを行いましたが、数時間かかったらしいので最適化モデルを作ることにしました。

データ抽出

まずは、計算に用いるデータを準備します。 Google フォームで社員の希望調査を行い、集計結果を以下のように変換します。

名前ID 性別 group_1 group_2 group_3 group_4
id_1 1 1 3 -1 2
id_2 -1 2 3 1 -1
id_3 -1 3 1 2 -1

性別カラムは男性なら1,女性なら-1を取るようにし、各アクティビティの希望順位をgroupカラムに記します。希望していないアクティビティには-1を割り当てました。

定式化

次にこの問題を数式に変換します。

定数

まずは定数を以下のように定めます。

説明 表記
参加する社員[人] $N$
班(アクティビティ)の種類 $ M $
班 $j$ の上限人数[人] $g_j$
社員 $i$ の班 $j$ への希望度 $h_{ij}$
社員 $i$ が男性なら 1, 女性なら -1 を取る $s_i$

$h_{ij}$は希望順位から算出した定数で、算出方法は割愛します。また、添え字集合を以下のように定義しておきます。 $$I \mathrel{\mathop:}= \{1,\ldots,N\}$$ $$J \mathrel{\mathop:}= \{1,\ldots,M\}$$

変数

次に、問題を解くための変数を以下のように設定します。

説明 表記
社員 $i$ が班 $j$ へ参加するなら 1, 不参加なら 0 を取る $x_{ij}$

これにより、$x_{ij}$を任意の $i$, $j$ に対して定めることで班分けを一意に決定できます。

モデリング

上記を用いてモデリングします。 まず、$x_{ij}$は 0 もしくは 1 を取る変数で、参加できる班は 1 つのみであることから、

$$ x_{ij} \in \{ 0, 1\},\ \forall i\in I,\ \ \forall j \in J $$ $$ \sum_{j \in J}{x_{ij}} = 1, \ \ \forall i \in I $$

という式を作れます。これは以下のような行列形式で考えるとわかりやすいです。

group$_1$ group$_2$ $\cdots$ group$_{M}$
社員 $i$ $x_{i1}$ $x_{i2}$ $\cdots$ $x_{iM}$

社員 $i$ は一つの班に属するのでいずれかが 1 でそれ以外はすべて 0 になり、それを上記の式で表しています。そして、すべての社員に対してこの式を満たさなければいけないので、各 $i$ に対して制約が設定されています。

各班には人数の上限が設けられているために、 $$ \sum_{i\in I}{x_{ij}} \leq g_j, \ \ \forall j \in J $$ を加えます。今度は班 $j$ についての制約で行列形式のデータを列で見るとわかりやすいです。

group$_j$
社員 $1$ $x_{1j}$
$\vdots$ $\vdots$
社員 $N$ $x_{Nj}$

列で和を取れば班 $j$ に属する人数を計算できるので、これが班 $j$ の上限人数以下になるようにします。 そして、目的は希望度を最大化しつつ班の男女の人数の比率をできるだけ等しくすることで、以下のようにします。 $$maximize: \sum_{i\in I}\sum_{j\in J}h_{ij}{x_{ij}} - \alpha\max_{j\in J}\left({\left|\dfrac{\displaystyle \sum_{i\in I}{s_ix_{ij}}}{g_j}\right|}\right)$$

第一項は希望度の総和、第二項は疑似男女比差を表しています。 班 $j$ に属する男性、女性の比率の差は $\displaystyle \left|{\sum_{i\in I}{s_ix_{ij}}}\big{/}{\sum_{i\in I}{x_{ij}}}\right|$ で表せますが、計算を容易にするために班の合計人数を班の上限人数に置き換えて疑似男女比差とみなし、定数 $\alpha>0$ を掛けています。標準形に変換する際は新たな変数 $y$ と以下の制約を加えれば実現できます。

$$ y \geq \dfrac{\displaystyle \sum_{i\in I}{s_ix_{ij}}}{g_j}, \ \ \forall j\in J$$ $$ y \geq -\dfrac{\displaystyle \sum_{i\in I}{s_ix_{ij}}}{g_j}, \ \ \forall j\in J $$

これにより $y$ は $\displaystyle \max_{j\in J}\left(\ {\left|\sum_{i\in I}{s_ix_{ij}}\big{/}g_j\right|}\ \right)$ 以上の値を動くことができますが、目的関数値を極力下げないようにするために最適解で $y^*$ は$\displaystyle \max_{j\in J}\left(\ {\left|\sum_{i\in I}{s_ix_{ij}}\big{/}g_j\right|}\ \right)$ になります。

以上をまとめますと、以下のモデルで書けました。

\begin{align} maximize && \sum_{i\in I}\sum_{j\in J}h_{ij}{x_{ij}} - \alpha y && \\ subject\ to && \sum_{j\in J}{x_{ij}} = 1, && \forall i \in I\\ && \sum_{i\in I}{x_{ij}} \leq g_j, && \forall j \in J\\ && g_jy \geq \sum_{i\in I}{s_ix_{ij}}, && \forall j \in J\\ && g_jy \geq - \sum_{i\in I}{s_ix_{ij}}, && \forall j \in J\\ && x_{ij} \in \{ 0, 1\}, && \forall i\in I,\forall j \in J\\ && y \in \mathbb{R} && \end{align}

実装

設計ができたので、Pythonで実装します。

import pulp
'''省略'''
problem = pulp.LpProblem("problem", pulp.LpMaximize)
x = pulp.LpVariable.dicts("x", (range(n), range(m)), 0, 1, "Continuous")
'''省略'''

ポイントは$x_{ij}$を0-1変数(Binary)ではなく$[0,1]$ の実数変数(Continuous)にしていることです。理由は行列のユニモジュラ性を利用していて、最適解で $x_{ij}$ は整数になることが保証されているためです。組み合わせ問題は変数を増やすと爆発的に計算量が増加しますが、この緩和を適用できると変数が増えても比較的容易に最適解を求められます。

結果

最後に最適化と抽選式で結果を比較します。抽選式は、希望人数を加えても班の上限に達しないならば抽選せずに確定させ、そうでなければ抽選によって班に加えるメンバーを選出する決め方です。比較は希望した班に割り当てられた人数を集計して行い、実行環境はIntel® Core™i5-6200U CPU @2.3GHz, メモリ8GB でした。

昨年の社員旅行で用いられたデータ(一部加工, $N=411, M=14$)で計算すると以下のようになりました。

最適化 抽選式
第一希望 339 349
第二希望 62 20
第三希望 10 13
希望外 0 29
最大男女差比 30% 15%
計算時間 0.6秒 0.3秒

抽選式では希望外の班に割り当てられた社員がいるので、この後手動で調整する必要があります。一方で最適化の結果ではその現象は起きていません。次にデータの規模を大きくして$N=10000, M=100$としました。

最適化 抽選式
第一希望 8318 8512
第二希望 1591 620
第三希望 91 270
希望外 0 598
最大男女差比 33.3% 30%
計算時間 162秒 16秒

この規模になると最適化の効果が顕著になりますね。

まとめ

クリエイターの日を利用して社員旅行の班分け最適化モデルを作りました。整数条件を不要としたモデルにすることで変数が増えても比較的容易に計算できるのが特徴でした。エンジニア支援制度が充実したネクストでは鋭意エンジニア採用中です!新卒・中途問わず、ご興味を持たれた方は是非下記ページを御覧ください。

http://recruit.next-group.jp/

zipkinのバックエンドをAmazon Elasticsearch Serviceに変更してみた

こんにちは、AmazonESでElasticsearch2.3を使っての環境構築が終わった直後にElasticsearch5.1が利用可能になってショックを受けてる技術基盤部の磯野です。

ちょっとだけ時間ができたのでzipkinのバックエンドをAmazon Elasticsearch Serviceに差し替えてみました。

CassandraとElasticsearchどっちにしようかなぁと悩んでいたのですが、zipkinがいつの間にかElasticsearch Serviceに対応していたのでサーバー構築したくない病発症中のためノータイムでElasticsearch Serviceに決定しました。

続きを読む