iyuichiの私的開発ログ

渋谷で働くWebエンジニアのログ. Java, Android, iOS, Docker, GCP, AWS, ゲーム開発

Google Cloud NEXT Tokyo '17 に参加してきた(6/14) #2

No-Opsってよく聞くようになったワードの一つ。
サーバレスアーキテクチャーなんてのもバズワード

Googleの環境でデータ処理基盤を構築するとこんなに簡単だよというお話。

Goolge社内ではBig Dataとは言わない。だだDataです。というお話がありました。
データというのは大量にあるのが当たり前でそういったものに慣れているからという、まあGoogleならそうだろうなと。
Googleじゃなくても最近は保存しておくストレージが安く使えるようになったこともあってかログとかをデータとして使うのが当たり前になってきましたね。

以下はセッション内容のメモ。

No Opsで大量データ処理基盤を簡単に構築する

GCPで実現する次世代データ基盤
データを分析するところに注力する(もっと作業時間を確保する)
収集->保存->処理/分析->可視化
Cloud Dataflow -> Apache Beam

この資料がベースかな。

www.slideshare.net


リクルートテクノロジーズでの事例も紹介してもらってよかったですが、
時間が押しすぎて途中で退出する人が多かったのは残念だったかな。

iyuichi.hatenablog.jp

Google Cloud NEXT Tokyo '17 に参加してきた(6/14) #1

cloudonair.withgoogle.com

メルカリ & ソウゾウの世界展開と Google Cloud

AWSを利用していたが技術的なキャッチアップやBigQuery

データ分析基盤としてのGCP

エンジニア以外も使える環境を整えて行くことが大事。
エンジニアに依頼ベースでやっていた
心理的な障壁とそれによる機会損失をなくすためにFlat Rateを契約

Googleの機能よりも良いものを実装できるのか?
Vision APIで得られた結果と、そういうエンジニアを採用するのとどっち?
といった指標として利用している。

メルカリアッテ

AppEngine, Compute Engine -> stackdriver

スケールのための作業は発生していない。
たまに障害はあるが許容できる範囲

生産性
ドキュメント類が充実してきて効率的に習得できるている。
最先端のクラウド技術を利用できることへの精神的な満足感がある。

コスト
利用した分だけ課金される。
費用とROIが容易に予測できる。

特定のクラウドベンダーに依存するということのリスク
依存しないことのリスク
依存することで得られるもの

  • > 他で提供できない機能というのは技術的に高度なものであったりする。それを利用できるメリット。

メルカリ/ソウゾウのエンジニアがGoogle Cloud Next'17 Tokyo と Google Cloud Community fes に登壇します - Mercari Engineering Blog


次のセッション。

Google のデータサイエンティストが語る現場で使える機械学習入門

機械学習系のセッションに興味がありこのセッションを聴講しました。
Google Cloud Next '17 in Tokyo | 6 月 14 日 ( 水 ) ・ 15 日 ( 木 ) | スケジュール

佐藤 一憲さんのデモもよかったです。
BigQueryに格納されたパブリックデータを使って2つのモデルで学習をさせた結果を見せるというものでした。
ラジオ体操はしていなかったw

セッションのメモを以下に。

機械学習(Machine Learning)はこう動く

ルールベースとの違い
ルールベースは単純なルールで切り分けられないものに弱い
MLはルールに頼らない
単純パーセプトロン
ニューラルネットワーク
データ-> モデル-> 予測-> 検証 ->フィードバック-> モデル

8のステップ

機械学習そもそも必要なのか?
日次より頻繁に、データに基づいて最適化するようなものに向いている。

  • 目的

ときたいパズルが何か

  • データの集め方

手動、データが少なすぎるは向かない
自動で多くのデータを集める
必要なデータを厳選する

  • データの前処理

一般にそのままではただのゴミ
全体の8割以上の作業時間がここにかかる
分別整理する
列志向型のデータテーブルにする

  • モデル学習とその方法

線形、非線形
教師あり、教師なし
学習モデルも適材適所

  • モデルのチューニング

チューニングパラメータを一つ変えただけで結果が全然変わる

  • 汎化性能

過去データだけでうまくいっても意味がない。
ノイズに惑わされず、真のシグナルに最もよくフィットすることで
未知のデータに対して高い精度を発揮する割合

  • 検証

効果の有無を見る
pre/post, ROI

  • 改善サイクル

これらのサイクルを回して改善して行く。

開発スピードを維持するには

先日、この記事を見かけて考えたこと。
だんだん開発スピードが遅くなっていくのをどうやってとめたら良かったんだろう? - Mitsuyuki.Shiiba

  • 言われたものをそのまま作っていって整合性を取るためにコードが複雑化していってしまう。
  • 設計に凝りすぎて汎用的に作ったが使われないものが多く、どうしてこうなってる?がわからなくて困る。

どっちもよくある。

どういう意図でその実装をしたのかがわかるようになっていると良いのだけれでなかなかそういうものをドキュメントなのか、プルリクなのかコミットコメントなのかに残しておいて適宜読めるようにってのができてない。

何か良いソリューションはないものだろうか。

目の前のことに追われすぎない、かつ、分からない先のことを想像で考え過ぎない。

これには同意。

想像しすぎて設計と実装に時間をかけすぎるとうまくいった試しがない。
かといってその場しのぎ的なif文で構成された巨大なクラスとかも辛い。

よく考えて、どういう方向で行くか決断し、決断した経緯と意図が残っているとその道のプロにいちいち聞かなくてもよくなるかな。

なんてことをモヤモヤと考えさせられた。

新人へのトレーニングで大切だと思うただ1つのこと

GWも終わりしばらく長期休暇がないことに気づいた今日この頃。
4月に新卒で入社した方もそろそろ社会人としての生活に慣れてきたでしょうかね。

仕事はまだまだこれから覚えることがたくさんあるでしょう。
半年くらいすればだいぶわかることの比率も上がってくるんじゃないかな。

Qiitaに「エンジニアを指導する立場の人こそ読んでほしい、新卒エンジニアが1年間で上司に感じた5つのこと」なんて記事があってコメントがたくさん付いていたのでちょっと読んでみました。

qiita.com

記事を読んだみなさんの反応は様々です。

記事とそこに付いたコメントもざっと読んでいて感じたのは、
教える側も教わる側にもHRTが大切なんじゃないかと。
そう、「謙虚(Humility) 、尊敬(Respect) 、信頼( Trust) 」というアレです。

謙虚な姿勢で相手をリスペクトして相手の立場に立って行動できればお互いにストレスが減ると思います。
新人だから先輩が教えるのは当然、そうかもしれませんが態度にそれが出ていると気持ちよくはないかな。
教える側も自分が苦労したことはなるべく親切に対応してあげた方が良いと思うし。

信頼はある程度の実績を重ねた上で本当に得られるものだと思うので謙虚に相手を尊敬する態度でコミュニケーションをとって信頼を勝ち得れば働きやすくなると思われ。

こいつ大丈夫そうだなと思われていれば、ちゃんとググったの?同じミスするな!とかいちいち言わないと思うんです。

それと考えを押し付けるな系の主張にもそれを言っている人をリスペクト(絶対的に信じ従えという意味ではなく一旦は受け入れる・やってみるくらい)して実践した上で自分の意見も出していくと良いと思います。
教える側も新人の意見だからと軽くみず一旦は受け入れた上で、もしくは本人のやり方でやってもらった上で振り返りをしてみると良いのかな。

これを実践するのに心に留めておきたい言葉
守・破・離
『形を持つ人が形を破るのが型破り。形がないのに破れば、形無し。』

まあ型を知らずに自分がやりたいようにやるのは違うよ!ってこと。

HRTを忘れずに!

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

Team Geek ―Googleのギークたちはいかにしてチームを作るのか

改めて読んで見たい "Site Reliability Engineering"

何気なしにデブサミのこの記事を読んで、
thinkit.co.jp

記事の中の以下のようなワードが今の自分に響いたので改めて原文にも目を通したいなと。

  • 「運用という作業に50%以上の時間を使わないこと」
  • 稼働する時間の半分以上を「運用を自動化するためのコードなどを書くこと」
  • Googleにとっての運用とは、「人間のインタラクションを極力少なくしてソフトウェアで解決する」ことだと言える。

Google - Site Reliability Engineering

オライリーから紙の本も出ているけれど、ウェブで無料で公開されているので少しづつ読んでいこう。

Site Reliability Engineering: How Google Runs Production Systems

Site Reliability Engineering: How Google Runs Production Systems

  • 作者: Betsy Beyer,Chris Jones,Jennifer Petoff,Niall Richard Murphy
  • 出版社/メーカー: Oreilly & Associates Inc
  • 発売日: 2016/04/16
  • メディア: ペーパーバック
  • この商品を含むブログを見る

iOSの自動継続をサーバサイドだけでハンドリングできるのか??

qiita.com

latest_receipt, latest_receipt_infoというレシートのフィールドに関して、

The values of the latest_receipt and latest_receipt_info keys are useful when checking whether an auto-renewable subscription is currently active. By providing any transaction receipt for the subscription and checking these values, you can get information about the currently-active subscription period. If the receipt being validated is for the latest renewal, the value for latest_receipt is the same as receipt-data (in the request) and the value for latest_receipt_info is the same as receipt.

Validating Receipts With the App Store

こんな感じで、最新の自動継続した情報を取れると言っている一方でiOS6スタイルのレシートでだけ返される値だとも書いてあって困る。

Only returned for iOS 6 style transaction receipts for auto-renewable subscriptions.

サーバ側でレシート検証をする必要があるケースとして、複数のプラットホームで決済可能なサービスでPCやスマートフォン以外の場所でもサービスを受けられる場合にはアプリを起動しなくてもサービスの継続または停止の判定をしなくてはならないと思います。

アップルのレシートに含まれるin_appは送信したレシートが発行された時点までの履歴しか入っていない認識で、latest_receipt_infoの中には初回購入後に定期購読で自動継続されたものも取得できるはず。

その項目がiOS6までしか利用できないものだとしたら非常に困る。

You also asked “Essentially my question is this: "If a user has successfully purchased an auto-renewing subscription does that imply that the "latest_receipt" and "latest_receipt_info" fields will always be populated in the receipt validation response?"
Yes - unless there is a problem with the verifyReceipt server.

latest_receipt and latest_receipt_info fields -... | Apple Developer Forums

ここのスレッドを見る限りではアップルのエンジニアらしき人がauto-renewされるアイテムを買った場合には"latest_receipt" and "latest_receipt_info" が含まれると言っているのでiOS7以降でもサーバサイドだけで自動継続の確認ができると思って良いのかな?

UNDOCUMENTED featureだといつ変更されるかわからなくって困る。

Gmailの古いメールをお掃除する

qiita.com

この記事を見つつ少しアレンジして見ました。

スプレッドシートで整理対象にしたいラベル名と保管日数を指定します。
f:id:iyuichi:20170131095934p:plain

このスクリプトを実行します。
配列に直接記載するのではなくてスプレッドシートで設定を書けるようにして見ただけですが、個人的には便利。
これをトリガーで毎日実行して使ってます。


ラベルと保管日数をスプレッドシートで指定して保管日数を超えているメールを削除するGAS