Above & Beyond

日々のアウトプット記録

Repro Tech #7 Practical AI Supported by NAVITIME

04/04(木) は「Repro Tech #7 Practical AI Supported by NAVITIME」に参加してきました。

repro-tech.connpass.com

f:id:kabukawa:20190330195042p:plain:w500

会場は NAVITIME さん。

f:id:kabukawa:20190405143120j:plain


目次


Repro Techとは

昨年開催されたAIの回の参加報告がありますので、こちらも併せてどうぞ。

kabukawa.hatenablog.jp


タイムテーブル

時間 内容
19:00 開場
19:30 はじめに
19:40 深層学習を速くするいくつかの方法 by Kota Uenishi
20:05 データサイエンスレガシーコードに立ち向かう by Sho Shimauchi
20:30 休憩 (軽食)
20:35 不確実性と上手く付き合う意思決定の手法 by Takashi Nishibayashi
21:00 REPROのAI機能を支える技術 by Takeshi Kamada
1:25 LT : Sponsor AIを選択する自由
21:30 懇親会
2:30 解散

内容

f:id:kabukawa:20190405143132j:plain


深層学習を速くするいくつかの方法

Kota Uenishi さん(Preferred Networks)

speakerdeck.com


なぜ深層学習を速くするのか?

👉 PFNは最新の研究や技術を最も早く実用化する

  • 機械学習(深層学習)の開発サイクル
    f:id:kabukawa:20190405153054p:plain:w500
    • [深層ネットワークを定義]
    • [学習実験をしてモデルを作る]
    • [テストデータで精度を確認する]
      という作業の繰り返し、つまり学習フェーズが試行錯誤のボトルネック

👉 強いモデルを作るためには

  • よいデータで学習すること
  • よいネットワークであること
  • よいレシピで学習すること
  • よいハイパーパラメータが与えられること
  • 何度も繰り返し試行錯誤すること

👉 1GPUで速くする

  • 深層学習 ≒ DNNをSGDでデータに対して最適化する
    1. データをシャッフルしてミニバッチに分割する
    2. 分割したミニバッチごとに、モデルに対してまとめ
      1. 前向き計算をして推論結果を出す
      2. 推論結果と正解データのズレ(距離)を計算
      3. ズレをもとに後ろ向き計算(backpropをする)
      4. 後ろ向き計算で得られた勾配の平均を計算
      5. 勾配をモデル䛾パラメータに反映
        この手順を好きなだけ繰り返す

👉 並列処理で速くする

  • ChainerMNによる分散学習
  • All-Reduceを速くする

👉 ハードウェアで速くする


個人メモ:

  • データやアルゴリズムの改善の繰り返しはどの会社でも行われてはいるけど、そのサイクルの速さはやっぱりPFN凄いと感じる。
  • 研究やPoCの速さというのは研究自体の力もあるけど、それを支える開発やインフラのエンジニアの力も相当必要。
  • Kubernetes(kubeflow)によって試行錯誤を速くできるように、という判断ができるのが強いなと思った。普通の会社なら構築や運用が複雑になったりすると考えるだけで尻込みしそう。
  • 自前でハードウェアを開発できるというのも強い。クラウドで大量の計算リソースが手に入るようになったとはいえ、専有できるハードウェアを作れる/持っているというのは貴重だし、最終的にはそこが地力の差になって現れてくると思っているので、これは本当に凄いこと。

データサイエンスレガシーコードに立ち向かう

Sho Shimauchi さん(Solutions Architect at Luminoso Technologies.)

speakerdeck.com


👉 今の仕事で得た知見

  • 今までの自分の認識: 機械学習をやるには大量にデータ集めて前処理して特徴エンジニアリングしてモデル作って検証して……が終わってからそのモデル使って何かをし始める
  • 今の自分の認識: 「さいきょうのモデル」がある前提でその先の仕事をする世界がある

👉 データサイエンスレガシーコード

「レガシーコードとは、単にテストのないコードです」

レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)

  • データサイエンスのコードはテストがないコードである(ことが多い)
  • しかしこれらのコードを別のアプリやサービスに組み込んだり、保守をしなければいけないケースは増えてくる
  • このようなコードをデータサイエンスレガシーコードと呼んでいる

「バグを見つけることは重要ですが、直近の目標は変更をより確実に行うための役立つテスト環境を作ることです」

この本では、この手法を 仕様化テスト と呼んでいる

👉 pytest

テスト駆動Python

テスト駆動Python

  • Pythonのテストフレームワーク
    $ pip install pytest pytest-cov pytest-randomly pytest-mock でインストール
    • テストカバレッジを計測する
      pytest-cov · PyPI
      $ pytest --cov=source_dir --cov-report=html で実行
    • モックオブジェクト(あるオブジェクトを擬装するオブジェクト)を使うためのツール
      pytest-mock · PyPI
    • テスト実行時にランダムな順序で実施する暗黙的にテストの実行順序を仮定したテストが混じってないかを確認可能
      pytest-randomly · PyPI
      $ pytest --randomly-seed=1234 で実行(1234はシード値)

👉 scripttest

コマンド実行をそのままテストに落とし込むための、機能テストツール
scripttest · PyPI
$ pip install scripttest でインストール

👉 flake8

  • コードフォーマッター兼静的解析ツール
    flake8 · PyPI
    $ pip install flake8 でインストール
    $ flake8 target.py で実行

👉 プロファイリング


個人メモ:

  • AI/機械学習のプロジェクトをプロダクション環境で運用し始めれば、レガシーコードとの闘いは必ずある、というのはよく分かる。
  • そういうコードにはテストがないことが多い、というのもありがち。
  • 時間/リソースを割けるかとか顧客が金を出すかはなかなか難しいということはあるものの、そうなる前にここに挙げられたツール類を入れてレガシーコードを改善するというのは禿同。
  • ところで、プロダクション向けコード書くのに、みんな何使っているの?PyCharm?まさかJupyter notebookで書いたコードをそのまま?まさか、いや、それもあり得る気がしてきた。。。

不確実性と上手く付き合う意思決定の手法

Takashi Nishibayashi さん(Software Engineer at VOYAGE GRUOP)

speakerdeck.com


機械学習で得た予測値をどのようにして使うか、予測の次の意思決定のフェーズに注目

  • 予測システムと意思決定
  • ビジネスにおける最適化
  • ラベル無しデータの探査
  • 予測モデルの不確かさを行動に反映する
  • オンライン最適化

👉 予測システムと意思決定

f:id:kabukawa:20190406122948p:plain:w500

  • できれば自動で決めたい、ではどうすれば?
  • むしろアプリケーションエンジニアの仕事は自動化がメイン

数理最適化

  • ある制約の元で目的関数を最大(最小)化するパラメータを求める
  • 不確実性の無い問題とは?

例:生産計画

  • 予測を利用した最適化
  • 予測を利用している時点で、何らかの不確実性を内包している

紹介する主な方策

  • 以下の繰り返し
    1. 予測
    2. 意思決定・行動
    3. 結果の観測
    4. 予測器の更新

余談: 最適とは何か?

f:id:kabukawa:20190406123915p:plain:w500

能動学習(Active Learning)

f:id:kabukawa:20190407002806p:plain:w500

貪欲法(Greedy Algorithm)

f:id:kabukawa:20190407002826p:plain:w500

補足: さらなる困難

f:id:kabukawa:20190406124149p:plain:w500

note.mu

  • 最適とは一体何なのか

👉 まとめ

f:id:kabukawa:20190407003439p:plain


参考文献:

  1. [1806.10692] ActiveRemediation: The Search for Lead Pipes in Flint, Michigan
  2. [1209.3353] Further Optimal Regret Bounds for Thompson Sampling
  3. バンディット問題の理論とアルゴリズム (機械学習プロフェッショナルシリーズ)
  4. [1209.3352] Thompson Sampling for Contextual Bandits with Linear Payoffs
  5. Incrementality Bidding & Attribution by Randall A. Lewis, Jeffrey Wong :: SSRN
  6. パターン認識と機械学習 下 (ベイズ理論による統計的予測)
  7. 情報理論の基礎―情報と学習の直観的理解のために (SGC Books)
  8. "Introduction to online convex optimization."
  9. [1708.03741] Online Convex Optimization with Stochastic Constraints

個人メモ:

  • 話されている内容が具体的な手法についてという事もあり、基礎的なところを理解できていないことを痛感した。
  • 参考文献が示されているので、これらを読んで勉強をしていきたい。
  • 水道管のプロジェクトの結末についてのnoteの記事は読んでいたけど、使われていた手法と併せて話を聞くと更に興味が湧いたのでありがたかった。

REPROのAI機能を支える技術

Takeshi Kamada さん(Repro)

speakerdeck.com


👉 話すこと

👉 Repro AI Labs.

  • データ分析
  • PoC
  • ML Ops
  • Repro本体への機能追加

アーキテクチャ(Repro)

f:id:kabukawa:20190407010613p:plain:w500

最近のCTOの発表


👉 ML基盤

f:id:kabukawa:20190407010719p:plain:w500

👉 最速リリースのポイント

  • 構築が楽なサービスを使った
  • Repro本体の既存の仕組みに乗れた

👉 最速でリリースしたツケ

  • 前処理・学習・予測全て1スクリプト1タスクで実行
    • 途中でコケた時に全て再実行…
  • 処理時間が線形に増加してスケールできない
    • 一時期は7時間かかっていた…
  • 捕捉できてないエラーがあった
    • コケていたことに気付かずインシデントに…

👉 Dataprocアンチパターン

  • Jupyter notebookもscikit-learnもインストールできる
  • やろうと思えはMLバッチ処理に使える?!
  • でもやらないほうがよい
    • Python側でマシンリソース使いすぎた時にSparkのJobが落ちる

👉 改善できた理由

  • 今後のAI機能開発を見据えたチーム増員
  • AIエンジニアに不足しがちな視点を補完(きっとアルゴリズムや予測精度で頭いっぱいですよね)

まなび

  • 推測するな 計測せよ
    • 適切にログを追加
    • 通信に無駄に時間がかかっていたのがわかって改善につながった
  • 技術スタックの理解を深める
    • 知らないと使えない
    • 知ることで監視設定など追加できた
  • 雰囲気で運用をやらない
    • チームでSLO設定
    • Redashのダッシュボード作成
  • リファクタリング
    • 前処理・学習・予測を分割した
    • 再実行しやすくなった
    • SocketTimeoutException がでなくなった

f:id:kabukawa:20190407013539p:plain:w500


個人メモ:

  • こういう実務での改善や運用周りの話は、聞いていて学びが多いので聞くことができて良かった。
  • マルチクラウドを使う時のポイント/注意点は色々あると思うので、その辺りが聞いてみたいと思った。

AIを選択する自由

大川舞子 さん(NAVITIME)

www.slideshare.net


結論

  1. どうしてAIを使うのか?
  2. AIの方が楽だからと言える時だけ AIを選択しよう

NAVITIME社のレコメンデーションの歴史

  • 機械学習黎明期に0から機械 学習モデルを実装。
    • → 改善しても精度が良くな らない。メンテ辛い
    • → 費用対効果が伴わない ため一度機能をクローズ

なぜ今 AIでレコメンデーションを 作っているのか?

  • 外部サービスが提供されつつある
  • 学習データがシンプルで既存資産が利用できる
  • 機は熟した

検討した方法

  • 自分で機械学習モデルを作る
  • OSSを利用する
  • 外部サービスを利用する Amazon Personalize (beta)

Microsoft / Product Recommendations Solution

  • Microsoft の AI レコメンド サービス がOSS
  • eコマースレコメンドに最適化したモデル/パラメータが 利用可
  • REST API / テストツール/ Swaggerも同時提供

github.com

学習データについて

モデル生成(日次)の処理の流れ

f:id:kabukawa:20190407015405p:plain:w500

推論(ユーザーリクエスト)

f:id:kabukawa:20190407015427p:plain:w500

将来的にはサービス本体もオンプレからクラウド

f:id:kabukawa:20190407015506p:plain:w500

まとめ

費用対効果があると 判断した時だけ AIを選択することで 世界平和を実現しよう


個人メモ:

  • 確かにML系のクラウドサービスは充実してきているし、OSSも増えているので機は熟したというのは分かる。
  • 自前で作るだけでなく、適切な(要件にFitする)サービス/OSSを探して適用するというところも技術者としては必要になってくるのではないか?
  • 当たり前ではあるけど、AIありきではない、なぜ必要なのか?それに対する必要な資金は用意されているのか、というところがこれからますます大事になってくるんだろうな、ということを思った。

懇親会

f:id:kabukawa:20190405143143j:plain

楽しくお話をさせていただいた皆様、ありがとうございました!


まとめ

今回もとても充実した内容で、あっという間の2時間でした。 知らないことも多く、まだまだ勉強が足りないと思ったので、今回の内容に対して自分でも知識を深めていきたいなと思いました。 3回目の参加になったのですが、開催されるたびに内容も運営も充実してきていて、とても良い勉強会だと思っています。 また次回開催されるときには是非参加したいです。

登壇者、スタッフ、参加者の皆様、ありがとうございました!

DevRel Meetup in Tokyo #40 〜オウンドメディア成功の秘訣〜

04/03(水) は「DevRel Meetup in Tokyo #40 〜オウンドメディア成功の秘訣〜」に参加してきました。

devrel.connpass.com

f:id:kabukawa:20190330185734p:plain:w500

会場は hoops link tokyo さん。

f:id:kabukawa:20190404142622j:plain

入り口が分かりづらいのですが、普通に銀行に入って、右奥にあるエレベーターで6Fまで上がります。 メチャクチャオシャレなスペースです。


目次


DevRel Meetup in Tokyo とは

前回の参加報告はこちらです。

kabukawa.hatenablog.jp


タイムテーブル

Time Note
19:00 開場
19:15 挨拶&会場紹介&自己紹介
19:30 はてなが考えるオウンドメディア運用のポイント
by 松本 尚哉さん@はてな
19:50 休憩
20:00 『さくらのナレッジ』の運営から見えるもの
by 法林 浩之さん@さくらインターネット
20:20 勉強会メンバーから学んだ、明日から使えるオウンドメディア TIPS 3つ
by 壽 かおりさん@シックス・アパート
20:40 LT1:IBMサイトに見るオウンドメディアのコアと変化 山下さん@IBM Developer編集長
LT2:自社ブログのファン獲得に成功した一つの作戦 m. ishizaki@イメージ情報システム さん
LT3:(非公式)と(仮)のパラレルキャリア 生方可奈子 さん@株式会社ビットキー
LT4:営業がいないヌーラボのオウンドメディア事例 井上美穂 さん@株式会社ヌーラボ
21:00 懇親会
21:45 終了

内容

いつものように飲み物と食べ物が最初から提供されて、それらを飲みつつ摘みつつ緩やかに始まりました。 自分は飲んでいる薬の関係でアルコールは無し。 ソフトドリンクも提供されているのですが、自前で持ち込んだソフトドリンクを飲みながら参加です。

f:id:kabukawa:20190404143010j:plain

最初にMCの大泉(@beajourneyman)さんによるオープニング。

これからのDEVREL MEEIUP

  • 04月03日 DevReI Meetup in Tokyo #40 ← イマココ
  • 04月14日 技術書典6@池袋
  • 04月18日 DevReI/Beginners #4 @新宿
  • 04月23日 DevReI/Community #2@口フトワーク
  • 05月08日 DevReI Meetup in Tokyo #41 出版/編集
  • 05月某日 DevReI/Eng1ISh #6
  • 06月03日 DevReI Meetup in Tokyo #42

色々盛りだくさんで「DevRel春のパン祭り(但しパンは無い)」って感じですね!(笑)


名物の自己紹介、今回は人数が多いので一人15秒で。 この短い時間でもスマートに自己紹介できる皆さん、さすがエバンジェリスト達と思わずにはいられない。 そして参加者の多彩さは本当に凄い。 自分もそうだけどDevRelをやってないという人の参加も結構いるし、新規の参加者の割合も半分くらい。 しかも去年末くらいから参加者数がガンガン増えていて、今回も60名近く。 ついにDevRelの波が日本にも来たか!というお気持ちです。


今回のテーマは「オウンドメディア成功の秘訣」。

オウンドメディア、最近よく見かけるようになったけど、成功していると思えるものはそんなに多くないんじゃないか?という感覚があったので、そのあたりの話が聞けると良いなと思って参加しました。

尚、当日のツイートはトゥギャられていますので、こちらもあわせてどうぞ。

togetter.com


はてなが考えるオウンドメディア運用のポイント

松本 尚哉 さん@はてな

f:id:kabukawa:20190404150518j:plain:w300

[資料は公開されたら追記します]


  • はてなのオウンドメディア支援について
  • はてなが支援するオウンドメディアの事例
  • はてなが考えるオウンドメディア運用のポイント

はてなのオウンドメディア支援について

はてなのサービス

f:id:kabukawa:20190404152606p:plain:w500

コンテンツプラットフォームからオウンドメディア支援へ

  • オウンドメディア専用CMS
  • オウンドメディア編集支援
  • ネイティブ広告

はてなのシステム基盤、コンテンツプラットフォームを活用

  • WEBサービス運営で培ったノウハウやコンテンツ資産でオウンドメディア支援を展開

オウンドメディア支援からコンテンツプラットフォームへの還元

  • 企業ユースの機能をユーザーへ
  • ブログコミュニティの活性化
  • コンテンツの多様化

はてなが支援するオウンドメディアの事例

採用広報

mercan.mercari.com

オウンドメディアを展開する商材・サービスの特徴

  1. 購入までに長期の検討が必要となる、関与度の高い 商材やサービス
  2. 購入・利用にあたり、サービスやブランドに対しての 好意度向上 が重要な要素となる商材やサービス
  3. 単純なPVだけでなく、記事の 反響 や読者との 関係性 を重視

オウンドメディアの役割や特性

ファネル分析 トリプルメディア
f:id:kabukawa:20190404160706p:plain:w300 f:id:kabukawa:20190404161029p:plain:w300

[例]:内部ドキュメントの公開
[ポイント]:突出した質、ユニークな情報、特別感、気づき、学び

recruit-tech.co.jp

careerhack.en-japan.com

[例]:トレンドワードを簡潔に
[ポイント]:整理された資料、シェアしたくなる簡潔さ

www.mermirai.com

blockchain.gunosy.io

[例::キャリア+αの話題
[ポイント]:一般的な話題×フックとなる要素

creator.game.cyberagent.co.jp

tech.smarthr.jp


はてなが考えるオウンドメディア運用のポイント

  • 目的に応じたメディア設計、目標設定
  • 「読後感」を意識したコンテンツ設計
  • コンテンツ流通、ソーシャルメディア
  • メディアのフェーズに応じた運用改善

ブックマークされる記事の特徴

内容 動機
一般性のある話題
(キャリア、働き方)
専門的な話題
最新の情報、トレンド
社会問題
話題の人やモノ
ユニーク・面白い・深い
気づき・学び
誰かに伝えたい
ひとこと言いたい
応援したい
著者を知っている
読ませる記事 感情、動機を起こさせる何か
「読後感」のデザイン


『さくらのナレッジ』の運営から見えるもの

法林 浩之 さん@さくらインターネット

f:id:kabukawa:20190404150532j:plain:w300

セッションの詳細は技術書典6で販売される本に詳しく書かれているということなので興味がある方はそちらも是非チェックしてください!


さくらのナレッジ

knowledge.sakura.ad.jp

  • さくらインターネットが運営するITエンジニア向け情報サイト
  • 「ITエンジニアに役立つ情報&おもしろネタをホスティング・データセンター業界の最前線から全力でシェア!」がモットー
  • 筆者陣が得たナレッジ(知識やノウハウ)を広く共有し、インターネットのさらなる発展に貢献することが目的
  • 2013年4月1日開設

技術書典6にスポンサー(さくらのナレッジとして)出展されるとのこと。

  • ス04 ペンネーム さくらのナレッジ編集部

techbookfest.org


さくらのナレッジ運営体制

  • オウンドメディアチームにて運営
  • 編集部員:3人
    • 3人とも他の業務と兼務
    • 100%の正社員は一人もいない
    • 2人がエンジニア経験あり
    • 先代編集長までは1人編集部だったらしい
  • この他にシステム管理者やWebマーケティング担当者等でチームを編成

さくらのナレッジはさくらインターネットのメディアだが、話題は当社関連に限定していない。 オープンな技術や外部イベントも積極的に紹介

どうしてこうなったか?

  • エンジニアは宣伝が嫌い
    • 直接的なサービス紹介記事を載せても読んでもらえない
    • そこでサービス紹介ではない記事も多く載せることになったのではないか(推測)
  • さくらのナレッジは「さくらインターネットに関心を持ってもらう入り口」という存在
    • 知ってもらうことが目的なので、営業色の強い記事はサイトの趣旨にそぐわない
  • さくらのサービスはインフラ提供サービス
    • さくらのサーバーで動けばどんなソフトウェアも対象

アクセス数、よく読まれる記事、主な検索ワード、アクセス傾向から推測される読者の要望、調査結果から描かれる理想像といったことが話されましたが、こちらは是非技術書典で販売される本の方で。

心の叫び

さくらのエンジニアが書いた
さくナレの記事を読みたい!
自団体の選手が盛り上げなくて
何がオウンドメディアだ!

伝えたいこと

f:id:kabukawa:20190405090156j:plain:w500



勉強会メンバーから学んだ、明日から使えるオウンドメディア TIPS 3つ

壽 かおり さん@シックス・アパート

f:id:kabukawa:20190404150546j:plain:w300

speakerdeck.com


オウンドメディア勉強会

blog.sixapart.jp


コンテンツ制作の協力者を増やそう!

f:id:kabukawa:20190411010636p:plain

社内の人に協力してもらうために

f:id:kabukawa:20190411010455p:plain:w500

「オウンドメディアの目的を供していること」が前提

オウンドメディア運営で得られるもの

  • ファンの獲得
  • ロイヤリティ向上
  • +副次的な効果 ここもアピール!
    • 発信力獲得
    • 他サイトでの転載・寄稿・露出
    • テストマーケの場として
    • 専門家に会いに行きやすい

協力者になりうる人が誰なのかを知る

社内 社外
オウンドメディア編集部メンバー
広報
セールス
エンジニア
サポート
総務などなど
ほぼ全部署のスタッフ
コンテンツマーケ支援会社
編集プロダクション
業界のライターさんに直接
執筆が本業ではない専門家やファン
パートナー会社の方の寄稿
コミュニティメンバー

社内の人に協力してもらうためのアイデア

  • 報奨
    • はてブ数など目標値を満たした人に(数字で判断)
    • 四半期ごとに編集部でMVPを選出(数字で判断しない)
  • 仲間感を醸成するための バッジ、ステッカー 配布
  • 書きたがらない人には喋ってもらって書き起こし
  • セールスサポートメンバーはネタの宝庫 顧客の課題をヒアリング
  • イベントレポートは写真素材と感想メモを貰って編集側で纏めるのもアリ
  • 顔出しNGな人はキャラクターアイコンで
  • 偉い人からアサインされる (ちゃんと根回し、大事)

社外:パートナーの企業や個人

  • 自社の事業を支えるパートナー
  • 「あのオウンドメディアに載りたい」と思ってもらえるメディアにしよう
  • 自分たちも先方のメディアに書くことでバーターにすることもアリ

note.mu

但し、こんな事件も発生しているので、なかなか難しい。

www.haya-programming.com

できれば社内や近い人が書くほうが良いと思ういくつかの理由

  • オウンドメディアこそ、自社の独自性を出して欲しい
    • プロメディアと「同じものを作ろう」は茨の道
    • オウンドメディアを作り、反響を見ながら独自性を磨いていくのもあり
  • ファンが知りたいこと
    • 自社の専門性は?
    • なぜ選ばれて、どう使われている?
    • どんな思いで作っている?
    • 業界の最新技術をどう見ている?


LT1:IBMサイトに見るオウンドメディアのコアと変化

山下さん@IBM Developer編集長

www.slideshare.net


TECHNOLOGISTS RULE THE WORLD 技術者が世界を変えていくお手伝いをする

  • 技術情報を提供する
  • 開発者と話をする
  • 開発者にとって何が一番良いかを考える
  • 開発者の「困った」を一緒に解決する
  • 開発者をヒーローにする

という活動を支えている。

f:id:kabukawa:20190405101049j:plain:w500


コンテンツから見る企業 Webの立ち位置

コンテンツ 特徴
企業系(オウンド) 手段 情報源・主観
ニュース系 成果物 取材・客観
まとめ系(キュレーション) 成果物 集約・二次情報
SNS 結果 場の提供

オウンドメディアあたり?

  • 狭義では、企業が運営するウェブマガジンやブログ
  • トリプルメディア
    • Owned(自社が保有) ────> 企業Webの価値の再発見?Paid 、Earnedとの連携
    • Paid(広告など)
    • Earned(SNSなど)
  • KPI(key performance indicator)の変化
    • [懐古]ページビュー↑↑
    • お客様のアクション

日本 IBM Web サイト

企業 Web 開発者向け 企業 Web
https://ibm.com/jp-ja/ IBM Developer - IBM Developer

技術者向けサイト

時期 特徴
15年前 がっつり製品・サービス寄りの記事が多い
技術カテゴリによる分類が基本

f:id:kabukawa:20190407114036p:plain:w500

Code Patterns

developer.ibm.com


IBM developerWorks 日本語版はIBM Developerサイトに移行

www.ibm.com


LT2:自社ブログのファン獲得に成功した一つの作戦

  1. ishizaki さん@イメージ情報システム

[資料は公開されたら追記します]


自社のブログで継続的に情報発信をし続けた結果、PVが上がって、ファンもできて、界隈での認知度も上がって良いことづくめという内容。

f:id:kabukawa:20190405103724p:plain

月に18本のエントリは仕事をしながらというのを考えると凄い。

発表については早速ブログの方にも書かれているようなので、そちらも参照してください。

imageinformationsystem.hatenablog.com



LT3:(非公式)と(仮)のパラレルキャリア

生方可奈子 さん@株式会社ビットキー

[資料は公開されたら追記します]


スマートロックの会社、ビットキーさん

bitkey.co.jp

ブロックチェーンの基盤を使った鍵管理によって安全性を担保している

f:id:kabukawa:20190405105652p:plain:w500

ワンタイムキーなどを使ったサービスも

f:id:kabukawa:20190405105810p:plain:w500


LT4:営業がいないヌーラボのオウンドメディア事例

井上美穂 さん@株式会社ヌーラボ

speakerdeck.com

分かりやすく書かれた資料が公開されていますので、こちらを参照してください。

資料で紹介されたいくつかのリンクを貼っておきます。

backlog.com

2019.haneda.wordcamp.org


まとめ

今回もとても内容が濃くて、あっという間の2時間、という感じでした。

酒が入ってないので真面目に言いますけど、 #devreljp 毎回サイコーって思うので、もっともっといろんな人が参加してくれるといいな!

そして、登壇者、運営スタッフ、そして参加者の皆様、ありがとうございました!

【東京:高円寺】テスト駆動飲み会 -Test Driven Drinking-【4/01】

04/01(月) は「【東京:高円寺】テスト駆動飲み会 -Test Driven Drinking-【4/01】」に参加してきました。

tddrinking.connpass.com

会場は 株式会社ヴァル研究所 さんのイベントスペース。

f:id:kabukawa:20190404100733j:plain


目次


テスト駆動飲み会とは

昨年参加した時の参加報告がありますので、こちらを参照してください。

kabukawa.hatenablog.jp

テスト駆動開発に全員が参加していてツイートする暇はない、ということでTwitterハッシュタグなどは有りません。 興味が出てきた方は次回は是非参加してみてください!


内容

テスト駆動飲み会という名の通り、まずは飲み物と食べ物から始まります。これは前回も同じですね。

f:id:kabukawa:20190404105540j:plain

今回はたこ焼きがたくさんあった事もあり TDDというのは たこ焼き駆動開発 ということで盛り上がってました。 こういうところもいいですよね。(笑)

はじめての参加だった前回と違って、今回は顔を覚えていただいていたことも有ってリラックスして参加できました。 どういう流れで進めるのかも分かってきたので、リズムがつかみやすかったというのもあります。

お題や使う言語などはその場に集まったメンバーで決めるということで、自分の知らない言語を使ってTDDを学べるというのが面白いです。 今回はPythonを使ってPokerのプログラムを開発するという事になりました。

前回参加したときはほぼ全員知らない言語のGoだった事もあり、言語仕様を理解するところからで結構時間がかかったのですが、今回はPythonということで、知っている人も多くて結構スムーズに進んでいた気がします。

今回もコードは Cyber-dojo で書きました。

cyber-dojo.org

ブラウザさえ有れば、面倒な環境構築なしにテスト駆動でコードを書けるというサイトです。 対応する言語も30以上あります。 更にサンプルコードも用意されていてすぐに始められるので、TDDを手を動かしながら学びたいという人には結構おすすめです。 表記は英語ですけど、コメントなどに日本語を使っても大丈夫なようです

始め方は、まずサイトのトップページで

  • 一人でコードを書く(I'm on my own)
  • 複数人でコードを書く(We're in a group)

のいずれかを選択(ボタンをクリック)します。 今回はモブでドライバーは一人なので I'm on my own の方をクリックします。

f:id:kabukawa:20190404104939p:plain

次に新しくセッションを始めるかを聞かれるので Create a new session をクリックします。

f:id:kabukawa:20190404104956p:plain

最後に、language, test-frameworkのリストから"Python, pytest"、exerciseから "Poker Hands"を選びます。

f:id:kabukawa:20190404105010p:plain

これでメイン画面が開きます。 メイン画面では以下のようなことができます。

  • コードを書く(実装/テストコード)
    f:id:kabukawa:20190404105108p:plain
    f:id:kabukawa:20190404105131p:plain
  • ファイル操作(ファイルの追加/削除/名前変更)
  • テストを実行
  • 要件の確認
    f:id:kabukawa:20190404105153p:plain
  • 結果出力(標準出力/標準エラー出力など)を確認する
    f:id:kabukawa:20190404105208p:plain
  • テスト実行オプション設定

コード画面では保存操作も不要なので、書いてはテスト実行、という手順の繰り返しに集中できます。

今回は7分間ずつドライバー(コードを打ち込む人)とナビゲーター(ドライバーに指示する人達)を交代しながら進めました。

最初に、要件(readme.txに書かれている)から、どんな事をしなければいけないか?というのをホワイトボードに書き出し、その中からナビゲーターがドライバーに書くコードを指示します。 今回はルールや持ち手を実装するのは後回しにして「ペアかどうかのチェック」という簡単な要件から始めました。 全員がPythonやTDDに慣れているわけではないので、最初は簡単なところから初めて感覚とリズムを作るという戦略だったわけですが、これは今回すごくうまく行ったように感じました。

進めるリズムとしては

スタート
 ↓
要件を元にテスト作成
 ↓
テスト実行(失敗:レッド)
 ↓
コードを作成/修正してテスト実行(成功:グリーン)
 ↓
リファクタリング
 ↓
テスト実行(成功:グリーン)
 ↓
スタートに戻る

という感じで、流れ自体は複雑なものではありません。 でも、流れに慣れていないと実装ではなくテストの方を修正しようとしてしまったりして、未だにアタフタしちゃいます(汗

あと、今回Pythonとpytestの組み合わせだったのですが、pytestでは他のxUnitにある setup に相当するものとして @pytest.fixture というのを初めて知りました。これを使うと、最初にインスタンスを作成して、みたいなクドくなりがちな処理を共通化して使うことができるようになります。下のコードの例だと、def test_same_two_numbers(self, checker) の checker という引数部分を @pytest.fixture の直後にある def checker(): の関数で生成して返してくれる、という仕掛けなのですが、なかなかおもしろいなぁと思います。

@pytest.fixture
def checker():
    return Checker()

def test_same_two_numbers(self, checker):
    assert checker.has_pair(1,1) == True

あともう一つ。pytest のコードは class で括ってグルーピングできるようです。うまく使えばいい感じでテストコードの可読性をあげられそうですね。

class Test_one_pair:
    class Test_one_pair:
        def test_same_two_numbers(self, checker):
            assert checker.has_pair(1,1) == True

    class Test_no_one_pair:
        def test_different_two_numbers(self, checker):
            assert checker.has_pair(1,2) == False

この辺りの話はやっとむさんが監修した本にも書かれているようですので、興味があればこちらもどうぞ。

テスト駆動Python

テスト駆動Python

そして気がつけば、今回も予定の2時間はあっという間に過ぎてました。 出来上がったコードは殆ど機能が実装できてなかったのですが、参加者にとっては得られたものはたくさんあった気がします。

今回も終電の時間があるので最後までいられなかったのが残念でした。


まとめ

「ペアで・モブで、プログラミングを楽しむイベントです。お酒をたしなみながらテスト駆動開発にノンビリ取り組んでいきます。」というコンセプトの通り、今回も雰囲気もよく楽しくテスト駆動を体験することができました。テスト駆動開発というのはリズムがあって、それをいい感じで回せるようになるとすごく楽しいし心地良いというのが、体感できる良い勉強会だなぁと思いました。

2ヶ月に1回位のペースで開催されているようなので、興味がある方は テスト駆動飲み会 - Test Driven Drinking - のメンバーになって、イベントの通知メールをチェックするか、Facebook グループの テスト駆動飲み会 に参加申請を出して情報をチェックしてください!

tddrinking.connpass.com

www.facebook.com

自分はできればまた参加したいです。

参加した皆様、今回もありがとうございました!