「Heroku社エバンジェリスト相澤氏が語るDay1「What is Heroku?」APC勉強会#5」に参加してきました

全3回を予定しているHeroku勉強会の第1回目となります。アプリケーション開発者の生産性を最大化するプラットフォームクラウドの概要と機能について、米国Heroku, Inc.の相澤歩さんにお話頂きました。

Herokuとは

プロフェッショナルなアプリケーション開発者のための世界で最も先進的なプラットフォーム・クラウド

Herokuの特徴

  • サーバーを意識しなくて良い
  • あらゆる言語・フレームワークを利用可能
  • アプリケーションの状況を全て可視化
  • 信頼と実績

サーバーを意識しなくて良い

  • 普通はサーバーの構成や調達方法を考えなくてはいけない
  • Herokuはそれらを考える必要がない

Gitを使ったデプロイ

  • Herokuがこの方式を導入した2008年くらいはバージョン管理環境とデプロイ環境を同じにするのは珍しかった
  • バージョン管理はみんな使っているのでHerokuはみんな使える
  • Herokuは全てのデプロイを保持している
    • 全てのバージョンの復元が可能

継続的デプロイ

  • Jenkins、Travis CIなどとの連携も可能
  • Gitを使っているからインテグレーションが簡単にできる

アプリケーションのスケールが容易

  • サーバーが1台だと同時アクセス数が限られる
    • キャパシティを考えて、サーバーの構成を設計しなければいけない
  • Herokuであればその必要がない
    • 管理画面のスライドバーを動かすだけでスペックを変えることができる
    • スケールはAWSでもできるが、他のアプリケーションサーバと矛盾なく設定するのはそれなりのスキルが必要
  • アイディアが受けるかどうか分からなくてもとりあえずリリースして、その後で自由にスケールすることができる

アドオン

  • 100種類以上のアプリケーションがある
    • 例えばBIツールで分析したい場合、Treasure Data Hadoopのアドオンを設定するだけで可能

あらゆる言語・フレームワークを利用可能

  • RubyJavaPythonPHPClojure、node.jsに対応している
    • 言語のセキュリティ脆弱性の対応も全てHerokuで行っている
  • Ubuntu上で稼働するプログラミング環境を立ち上げることもできる
    • しかし公式サポートはしていない

アプリケーションの状況を全て可視化

  • 一連の動きがログストリームというところに入っている
    • アプリケーション、データベース、ルータのログを全て一連のログで出力している
    • フィルタリングすれば見たいところで見られる

可視化のためのアドオン

  • New Relic

    • アプリケーションのパフォーマンスを測定
    • 何がパフォーマンスのボトルネックかを見ることができる
  • Librato

    • プラットフォーム(メモリの状況、コネクションがどれくらい張られているかなど)の情報が見られる
    • 購入履歴など独自の情報を可視化することも可能
  • Papertrail

    • ログを貯めることができる
    • 適当なタイミングでアーカイブも行ってくれる
    • こういうツールは地味だが作るのが大変
    • アドオンを使えば簡単に実現できる
  • デベロッパーはプロダクトの価値創造に集中することができる

信頼と実績

Herokuをはじめよう

  • 書籍『プロフェッショナルのための実践Heroku入門』

    • 本番として使うTipsはあまりWeb上にはないが本書には書いてある
    • トラブルシューティングも書いてある
  • 開発ツール

    • インストールする必要がある
    • Mac OS XWindowsLinux対応
    • 入っているもの
      • Herokuコマンド
      • Foreman:herokuと同じ動作環境を立ちあげられる
      • Git
  • 稼働状況レポート

    • 何かあればすぐにレポートが上がってくる
    • 対応状況も分かる
      • ここに何も書いていなければアプリケーションの問題と分かる
  • プラットフォーム・サポート

    • 問い合わせチケットを投げることができる
    • サポーターは世界で10人弱いる
      • 色んな時差に対応したサポーターがいる

「NLP勉強会 #1 #NLPStudy」に参加してきました

初心者向けのセッションから、word2vecのような最先端のツールの紹介、また参加者同士の交流ができるワークショップなど、非常に実りの多い幅広い方向けの勉強会でした。

NLP勉強会 目的・進行方針について

 

(再)入門自然言語処理 #01

@yamano357さんによる発表。

自然言語処理の要素技術

  • 形態素解析
    • わかち書き:入力文を単語に分割
    • 原形化:語形・活用変化している単語を原形に戻す
    • 品詞タグ付け:単語の品詞を決定
  • 統語解析
    • 「綺麗な黒髪の女性」は「綺麗な」が「黒髪」にかかるのか「女性」にかかるのか分からない
    • 「言語の文法」に従って文法構造を解析
  • 意味解析
    • 「単語自体の意味」と「単語間の意味関係」を解析して文の意味を同定
  • 文脈解析
    • 文の意味は文脈の中で決定されると考えるため、複数の文を解析の単位と見なす
    • 省略解析、テキスト構造の構築

自然言語処理の周辺技術

自然言語処理の応用技術

  • テキスト分類
  • 情報検索
  • 機械翻訳
  • 情報抽出
  • 自動要約
  • 質問応答
  • 対話システム

 

すぐに始める自然言語処理

@yamano357さんによる発表

自然言語処理ツール

言語資源

使用状況(頻度が多いもの)

 

word2vecのご紹介

@piroyoungさんによる発表。

 

言語モデル入門

@akkikikiさんによる発表。

 

MeCab辞書作りについてのご相談

@nezuqさんによるアイディアソン。

ワークショップの結果はこちら

素人がTF-IDFでキーワード抽出やってみた

@smzkngさんによる発表。

 

言語処理本紹介

@yamano357さんによる発表。

「ReactiveCocoa Tokyo #rac_tokyo」に参加してきました

@ninjinkunさんが発起人の一人で、Cocoa勉強会関西の特別編としてReactiveCocoaの勉強会を行ったところ、東京でもやろうということで開催されたとのことです。

はじめてのReactiveCocoa

ChatWorkの@tinpayさんによる発表。6月からReactiveCocoaで開発を行っているとのこと。

ReactiveCocoaって

  • リアクティブプログラミングをサポートするライブラリ
  • MVVMを実現するために利用する
  • CocoaPodsでインストールできる

リアクティブプログラミング

  • 命令型プログラミングは直ちに評価される処理を記述する
  • 対して、リアクティブプログラミングは関係性は関係性を記述する
a = 1;
b = a + 2;
a = 3;
print(b);
  • 命令型だと出力は3だが、リアクティブプログラミングだと5になる

MVVM

メリットとデメリット

メリット

  • ViewControllerがスッキリした
    • 処理はViewModelに記述される
  • テストが書きやすい
  • 一時変数がなくなった
    • バグが減る

デメリット

  • 難しい。。。。。。。
    • 1ヶ月くらいでは今までどおり書いたほうが何倍も早い
    • まずはViewModelへのデータバインディングのみ使うのがいいかも
  • Signalを連鎖し過ぎると見にくい
    • 保守が大変な気がする
    • RACメソッドを上手く組み合わせる

まとめ

  • 難しい
  • 直感的に書けない
  • もどかしい
  • でもソースは綺麗になる
  • 頑張りましょう\(^o^)/

 

FrilでのReacitiveCocoa事例

株式会社Fablicの@ninjinkunさんによる発表。

なぜ今ReactiveCocoaか

  • アプリの複雑化
  • Webサービス連携アプリの増加
  • アプリが非常に多くの"状態"と"非同期処理"を持っている
    • 多数のAPIと非同期に通信し、状態を適切に更新し、ユーザに表示する
  • Modelの更新、通知、Viewの更新

RPの特徴

  • イベント駆動、拡張性、障害への耐性、応答性

RPの用途

  • サーバーでもクライアントでも使える
    • Netflixではサーバとクライアントの中間レイヤーで使われている

ReactiveCocoaの段階的な採用

FrilのRAC利用ポリシー

段階的な採用

  • テキストのValidation
    • バリデーションしてボタンをenableにする
  • delegateラッパー
  • KVOラッパー

MVVMへの緩やかな移行

なぜMVVMが必要か

  • SNSアプリでは状態をViewController間で共有することが多い
  • エントリの情報の追加、編集、削除
  • ViewModelをbindすればViewは自動更新にしたい

ReactiveCocoa本のMVVM

僕の考えるゆるいMVVM

Frilの商品VM

  • 複数JSON由来NSObjectを持っている
  • VMを中間レイヤーとして使う
  • 商品ViewModelとAPIの構造は異なる

まとめ

  • ReactiveCocoaの段階的な採用
    • Validationでの仕様、delegateラッパー
  • MVVMへの緩やかな移行

 

freee社でのReactiveCocoa活用例

freeeの@yo_wakaさんによる発表

freeeのiOSアプリ

  • 確定申告や小規模法人決算をカンタンに
  • 既にWeb版がある
  • エンジニア2人で1ヶ月で開発
  • ReactiveCocoaを採用

ReactiveCocoa採用の背景

  • アプリを出して終了ではない
  • 会計サービスはUIが複雑
  • スタートアップで後から設計変更してる余裕ない
  • 変更に強い設計が必要
  • Viewの状態管理が複雑
  • 複数のモデルを管理しないといけない

MVCの問題点

  • ViewとModelが1対1とは限らないのでビジネスロジックが散らばる
  • APIどこのレイヤが叩くねん問題
  • Web版が抱える問題を解決したかった

ReactiveCocoa

勉強し始めの頃

Pros/Cons

  • Pros
    • 1つsignal設計すると使い回しがしやすい
    • カテゴリ拡張がとにかく便利
    • RACObserverサイコー
  • Cons
    • SubscriberやRACSignalのコードを理解するのが難しい
    • RACが死ぬと我々も死ぬ

 

var RAC3 = ReactiveCocoa + Swift

ReactiveCocoaのコミッターである@ikesyoさんの発表。

  • APIやクラス名など今後変更される可能性は大いにあります
  • RAC3作ってたけどSwiftが出たため、RxSwiftが合流するかたちで開発を進めている

New Concepts

  • Generics Support
  • ColdSignal
  • Subscriber
  • HotSignal
  • ObservableProperty
  • Action

Swift版のReactiveCocoaを組み込む方法

 

LT

CDEvents+ReactiveCocoa でファイル監視

@uasiさんによる発表。

ReactiveCocoa Pitfalls at freee

@yonekawaさんによる発表。

distinctUntilChangedの使いどころ

@at_akaさんによる発表。

Bolts-iOSを"ちょっと"駆使した非同期処理の例

@huinさんによる発表。

「nanapi勉強会 vol4」に参加してきました

nanapiさんとはてなさんが共同で主催された、開発フローや開発手法、継続的インテグレーションや継続的デリバリーなどDeveloper Productivityに関する勉強会、「nanapi勉強会 vol4 - 【nanapi x はてな】はてなとnanapiの開発フロー」に参加してきました。

オープニング

@wadapさんによる発表。

  • 開催の経緯
    • 福岡でnanapi勉強会vol3を開催
    • 京都でもやってほしいとはてな@stanakaさんから要望が
    • せっかくなら東京でもやりたいです
    • vol4開催
  • 来週京都でも近い内容でやる(はてなさんのオフィスで)

nanapi IGNITIONチームの開発フローとその構築 / nanapi

@vexus2さんによる発表。

  • 自己紹介

  • IGNITIONチームにおける開発フロー

    • 社内外の起案でタスク発生
    • スクラムでタスク化
    • 開発
    • リリース
  • スクラムについて

    • 以前は物理カンバンに付箋でやっていた
    • 物理カンバンを廃止を禁止した
      • 付箋とIssuesとの二重管理に
      • 物理看板の移動が面倒
      • ログとして残せない
    • PivotalTracker導入
      • 各チケットでの優先度付けが楽
      • チケットのフローがシンプル
      • Slackなど外部コミュニケーションツールとの連携が楽
      • GitHub連携も
      • 朝会は自席のモニタの前で行っている
  • 基本はGitHub Flowに則る

    • masterブランチは常にリリース可能に保つ
    • masterへの取り込みはfeatureブランチからPull Request
    • テストを書いてあるならリリースしてもOK
    • CSSの細かい修正などはそのままリリースOK
    • 型にまはりすぎない
  • デプロイ

    • Pull Request経由で行う
    • masterへのマージでCircleCIを介してAWSに自動デプロイ
      • HubotでSlackに通知
    • Hubot経由で手動デプロイも
  • CircleCIを選んだ理由

    • スペック的にcircle > travis
    • bundle installとかで決定的な速度差
    • SSHでアクセス可能
    • テストが落ちたらSlackで通知
  • Jenkinsは使わない

    • カスタマイズ性が高いがメンテコストも高い
    • Jenkins職人が発生する
    • チームでメンテし続けられるなら良いト
  • チームに最適なものを選択する

    • "自分が"ではなく"チームが"で考える
    • あまり欲張りすぎない
      • 高機能すぎるとチームに根付かせるのが大変
    • IGNITIONではグローバルスタンダードを重視
  • 社内のエヴァンジェリストになる

    • ツールを押し付けても絶対に根付かない
    • チャットツールをSlackに乗り換えた事例
      • コミュニケーションツールは反発が起こりがち
      • 全力でドキュメントを読んで、翻訳したり、チップスをまとめた
    • 誰よりもそのツールを使い伝搬していく
  • 現状に満足せず、モダンな環境を求め続ける

  • PR

はてな Mackerel チームの開発フロー / はてな

Mackerelチーフディレクターである@motemenさんによる発表。

  • Mackerelについて

    • クラウドパフォーマンス管理サービス(はてなの新サービス)
    • 社内ビジネスプランコンテストから発展
  • From Perl to Scala

  • なぜScalaを選んだのか

    • Perlの次の言語
    • 中規模開発に耐え、堅牢なもの
    • リード開発者の趣味
      • (本当はHaskellがよかった)
    • 詳しくはScala in Perl Company参照
  • Scala

    • 静的型付けの安心感
    • しかしコンパイルが遅い
    • 事例

      • デプロイする
      • ちょっとミスった -> 30秒で治す
      • デプロイ完了まで2時間かかる
    • のんびりとした開発

      • デプロイをちゃんと準備して行う
      • 高速化してデプロイまで30分で終わるようになった
  • スクラムの導入

    • スプリント開始時にタスクを入荷
    • スプリント終了時に振り返り
    • WEB+DBの特集でやりたいと思った
  • スプリントの開始:棚卸し会

    • 月曜の朝2時間
    • プロダクトバックログを見ながらタスクを決定
    • Google Spreadsheetを使っている
      • 優先度順、後ろはごちゃごちゃ
      • どのスプリント、完了したかなど
  • タスクの検討

    • 1Pull Requestにできるくらいの粒度にタスクを分割
  • スプリントの終了:振り返り会

    • 金曜日の夕方1時間
    • スプリントの達成度を振り返る
    • 個人・チームのKPT
    • 今後のスケジュールを確認
  • MackerelチームとScrum

    • プロダクトもチームもゼロから
    • やりたいことを着実に進めていく
    • やりながら変化していった
  • タスクはGitHub Issue

  • リモートワーク

    • はてな東京開発センター
      • 2014年にようやくエンジニアが入社した
      • Mackerelチームに入った
      • もともとリモートの予定があったのでツールは検討してあった
    • 『強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」』が良い
    • あの人存在感無いね、にしない
      • 東京の人が存在感なくならないように
      • 雰囲気を揃える
      • オンラインビデオチャットで朝会
      • 雑談の時間を取る
    • Remote Tool

      • zoom
        • 全員の顔が一望できる
        • フリーだと40分限定→長々とミーティングするのを抑えられる
      • Sqwiggle
      • GitHub & Slack
      • polycom
    • to be continue

      • まだまだ始まったばかり
      • 機材が大事そう
      • 全員がリモートワークを意識する
  • PR

    • はてな東京オフィスでリモートワークしたい人募集

開発フローパネルディスカッション

@vexus2さん, @wadapさん , @motemenさん, @songmuさんがご登壇。

以下、w:@wadapさん、 v: @vexus2さん、m: @motemenさん、s: @shiba_yu36さん。

w: 皆さん、自己紹介と自分のこだわりポイントを。

v:こだわりは早いものを重視すること。無駄なことを省きたい。私生活では自動化しきれてない。

m: こだわりは一人でつっぱしらない。みんなの様子をみる。意識をそろえる。

s: 1ヶ月前にはてなに入社。前職はソーシャルゲーム会社でリードエンジニア。35人チームでコミュニケーションに苦労したが、その中でスクラムや開発手法を学んだ。チームでの開発は最高に楽しいのでそれをブーストしたい。

w: 前職と違いは?

s: モチベーションが高くて、かっちりやってる。

w: 失敗経験をもとにこうなってるみたいな話をしたい。スクラムについてはどうですか?

m: スクラムでスプリント切ったら作業に集中できる。しかしスプリントを繋げることを考えてなかった。目の前のことをひたすらやっていて、どんなプロダクトにしたいかというマクロな視点が欠けてしまった。

w: 解決策は?

m: エンジニアとして楽しいからだけではなく、全体のプロダクトバックログを気にする。そういうことに対して意識的に時間をとる。

s: 自分の場合は、前職で大きいチームだったのでスクラムをそのまま適用するのが難しいと思った。エンジニアは新しいことをやりたがるが、それ以外がついてこれない。こちらがスクラムとか言ってもディレクター、デザイナーはピンとこない。SubversionRedmineで満足してるのになぜ?そういうところをケアする。サポートする人を作る。

w: チームに編集長がいたvは?

v: 編集長はスクラム外。ディレクターは中にいた。コードを書かないがGitHubをコミュニケーションツールとして覚えてもらった。特に失敗はなかった。

w: nanapiは文化的にエンジニアがツールを決めて他の人に合わせてもらう。はてなさんは?

s: はてなもエンジニアが主導している。エンジニア以外の人も意外と技術に詳しい。node.js触ってたり。

w: お互いの会社ではいろんなプロダクトをやっている。サービス毎に開発手法を変えてるのかある程度決まったフォーマットがあるのか。

s: 前の会社もいろんなサービスをやっていたがリードエンジニアの裁量に任されていた。IRCでつながっているのでなんとなく把握している。毎週リードエンジニアが集まって共有会をしていた。

m: はてなでもSlackやIRCで流れてくる。リードエンジニアが集まる会もある。エンジニアの異動に伴ってツールが入ってきたりする。ブログチームが平均年齢が若くていろんなことを積極的に導入している。そこから引っ張ってる。

w: 会社共通のものはない?

s: GitHub使いましょう程度

w: vは?

v: nanapiはCakePHPでやってた。しかしIGNITIONではRailsを導入。CakePHPRailsの知識の共有をどうするか。チャットだと流れてしまう。どうまとめるか。nanapiではナレッジをストックする場所を作っている。

w: はてなさんは?

m: はてなグループを使っている。ブログエントリーとして残している。それで情報が貯まっている。

w: 開発手法やツールは新しいのを導入して、固定化しすぎないのが重要。今気になってるものはありますか?

s: いいマイクが欲しい。リモートワークではそこが一番重要。長時間の会話だとノイズがストレスになってくる。リモートが強いチームを作ると思っている。

w: リモートワークには興味がある。マイクはアンサーで聞いてみたらいいのでは?

m: 自分はCircleCIを使ってみたい。今はJenkins。社内にあるからいいやとなっている。外部のものを使ってみたい。

w: Jenkinsおじさんがいる?

s: おじさん化する若者もいる

v: 自分はTaiga.io。プロジェクトマネージメントツール。バンダムチャートがかっこいい。

w: かっこいい?

v: かっこよさ重要。グラフィカルなツールだとテンション上がる。

w: さて、最後の質問。開発手法に正解はあると思いますか?

v: 王道はある。しかし王道に基づいているツールが最適解ではない。効率性を求めすぎてサービスが疎かになることは防ぎたい。

s: 開発手法はあくまで手段。最高のチームで最高の開発をしたい。 強いチームはオフィスを捨てる: 37シグナルズが考える「働き方革命」』には自律的に働くことが書かれている。各々が自律的に働かなければいけない。それはOSSと似ていると思う。そういう開発をしたい。

m: 手法はあくまで手法。チームが変われば手法も変わる。

質疑応答

皆さんは情報をどう集めていますか

v: はてぶ、RSSで情報を見ている。海外系のツールが多いので一次情報に触れられるように心がける。

m: はてぶを使ってます。お気に入りにいれておいて、その人がブックマークしたものをウォッチする。GitHubでもウォッチする。

s: はてぶ使ってます。RSSに出力してRSSリーダーで見るとか。naoyaさんなどホットな人を追いかける。OSS開発をやっているとツールに触れる機会が増える。

スマホアプリ開発とWebアプリの開発で違いについて

m: 隣のチームを見てると、プロトタイピング開発を行っている。画面作りがシビア。そこに注力している。

s: 前の会社でやっていた。慎重さがもとめられる。リリースサイクルが違う。サーバサイドのコードとクライアントサイドでリポジトリを分ける。そこでバージョンを合わせる必要がある。基本は変わらない。手法が確立されていない。テストが難しい。ロジックのテストはCIを回す。UIはわかっていない。

v: リリースに対する感覚が慎重になる。サーバサイドもクライアントも慎重になる。

海外でもリモートワークは可能か?通信速度や時差の問題は?

s: まだわからないが時差があるのは大変そう。レビューする時間を決めるなどを行っているらしい。まだ無理だとは思っていない。これから大変なことが起こるかも。

m:時差は大変。通信速度はあまり問題ではない。文字ベースなので。相手の顔が想像つかないと難しいかも。

v:リモートでやってる人。3人くらい。

今、5,6人のチームで開発を始めるところ。手法のとっかかりをどうするべきか。

s: 前の会社でスクラムでやろうというときにワークショップを受けた。みんながスクラムに対して前向きになる。まずは基本を抑える。テストの書き方を準備しておく。

m: 出来上がった場所がないと落ち着かない。リーダーが枠組みを先に決める。それから改善していく。

v: 最初にオーナー、リーダーが基盤を作る。方向性をメンバーに周知し、ブレないようにする。そこからブレークダウンしていく。

w: 自分はnanapiにスクラムを導入した。会社に周知しまくった。

どういうツールを入れたらいいか、時間も取りづらい

v: チームが不便に思っていることを考える。そこを自動化するツールを考える。時間をとるのは上司にコミットする。効果を明示する。

m: 仕事さぼってやればいい。それでみんなが良くなれば成功。CI回すくらいはやっておくといい。

s: Productivityはやってると楽しくなる。しかしすごく難しい。成長したWebサービスでも過去の負債に悩んでいるところはすごく多い。その状態をさらけだせるとこはさらけだして共有すればいいんじゃないか。オープンにしたら同じ悩みを抱えている会社は多いと思う。

「yidev 第16回勉強会」に参加してきました

2014年9月27日(土)に開催されましたYokohama iPhone Developers 勉強会 第16回に参加してきました。

iOS界隈で著名な方々が集まる非常にハイレベルな勉強会でした。

Getting started with Handoff

2tchの中の人、『iOS SDK Hacks』の著者である@sonsonさんによる発表。

  • Handoffでできること
    • ネイティブアプリからOS XSafariを起動
    • OS XSafariからネイティブアプリを起動
    • ネイティブアプリ同士でhandoff可能
    • アプリが死んでるときでも自動起動
  • 必要要件
  • UserInfoの中にオブジェクトを入れて、投げる
  • NSUserActivityのインスタンスがスコープを外れると落ちる
  • Streamを使えば大容量のファイルを通信可能

Custom Keyboard について

特殊文字の中の人である@haranicleさんによる発表

  • Custom KeyboardはiOS8から導入されたApp Extensionの一つ
    • システムキーボードの代わりに使用できる
  • 機能
    • NextKeyboardは絶対必要
      • 他のキーボードに移れなくなるため
    • ガイドラインではシステムキーボードみたいにしろって書かれている
    • ホストアプリがカスタムキーボードの使用を拒否していたら使えない
  • UIInputViewControllerを使って実装していく
    • 毎回initから呼ばれるので、initからviewDidAppearまでを出来る限り軽くすべき
    • ボタンの表示はNextKeyboardボタンだけでも早く表示する
    • StoryboardはUIInputViewControllerには使えない
  • ハマりどころ
    • シミュレータでキーボードが出ないときはToggleSoftwareKeyboardで出す
    • コードでAutoLayout設定するのが大変
  • その他
    • viewDidAppear以降のタイミングならキーボードの高さを買えられる
    • Info.plistからネットワークへの接続や位置情報収集の設定が可能
      • In-App Purchaseも設定可能

UIテストの決定版

@kitasukeによる発表

  • UIテストツールの決定版などない
  • UIテストの目的
    • 思わぬところで起こるUI関連の不具合を防ぐ
  • あまり変わらないなところをUIテストすべき
  • UI操作はほとんどできる
    • カメラロールから写真選択ができなかった
  • Accessibilityを使っているツール
    • 対応する箇所を埋めていく
  • XCTestを継承しているのでほぼ一緒
  • 全画面遷移のスクリーンショットを保存可能
    • しかし画像をいちいち見てられない
    • ImageMagickのmontageコマンドを使えばタイル状にできる
    • ImageMagickcompositeコマンドを使えば画像のdiffが取れる
  • Travis CIでそのテストも可能
  • UIテストの利点・欠点
    • 良い点:運用コストが下がる
    • 悪い点:UI実装者とテストケース実装者が異なる

スクショから始まるデバッグについて

@dealforestさんによる発表。

  • シミュレーションでのデバッグは容易だが、AppStoreからインストールされたアプリでのデバッグが非常に困難
    • アプリを配布した後は、print debugやbreak pointがほぼ不可能
    • 情報が少なくてもバグが再現できればよい
  • できることはあるにはある
    • Crash Reportの収集
      • Clashlitics、Bugsnagなど
      • クラッシュしないとでてこない
    • NSError、NSExceptionの収集
    • スクショをとって共有
    • その他
      • Helpshiftとかでユーザからの問い合わせ
      • レビューを見る、エゴサーチ
  • ユーザからこんなバグがあったとスクショが送られてきたとする
    • スクショからバグを推測するのがたいへん
    • デバッグに必要な情報が欲しい
    • 画像としてそういう情報を出力すればいいじゃない
  • DFTDebugScreenshotを作った
  • 考えられる応用
    • AutoLayoutでConstraintsで出力できる
    • UIWebViewでjsの情報を出力できる
  • 今後
    • UIViewControllerのdebugObjectをいつでも取得できるようなinterfaceを追加するつもり
    • colorizeして画像にするつもり
    • AccessTokenやcokieを出力したとき用に暗号化

SpriteKit ゲームを Swift で書いてみる

『Xcode5完全攻略』著者である@studioshinによる発表。

  • WWDC行ってきた
    • Swift登場した
    • 忙しくて手が回せていなかったがキャッチアップした
  • 著書に収録しているObjective-Cで書いたシューティングゲームSwiftで書き直した
  • ほとんど1対1で書いていける
    • アクションもほぼ対でかける
  • asを書くキャストが慣れない
  • !、?のオプショナルが必須になり、そこでエラーがよくでる
    • オプショナル大変

ドメイン駆動開発 入門編

cocominapさんによる発表。

  • ドメインは現実世界寄りの考え方
    • Todo管理アプリがあったとして、タスク記録やスケジュール管理がドメイン
    • Taskなどのクラスがドメインで、Networkのようなクラスは非ドメイン
  • お客様から開発者全てを含めてチーム
    • チームの真ん中にドメインを持ってくる
    • チーム全体が共通の言語・ドキュメントを使う
  • メリットは行き違いや混乱を防ぐことができる
  • 最適な概念を見つけていく
    • 最初から完璧はない
  • モデルと実装を結びつける
  • 以下、質疑など
    • ドメイン駆動開発は何百人月を要するような巨大なソフトウェア開発を対象としている
      • スマホアプリ開発では誤解が生まれにくい
    • ドワンゴPHPでぐちゃぐちゃだったソフトウェアをDDDを用いてScalaで書き直した
    • すごくいい本 -> 『エリック・エヴァンスドメイン駆動設計』

「API Meetup Tokyo #3」に参加してきました

2014年9月26日(金)に開催されましたAPI Meetup Tokyo #3に参加してきました。

本勉強会はApigeeさんが主催するもので、Web API に携わる開発・企画担当者が、API まわりの様々な要素技術や適用事例を一緒に学ぶオープンな勉強会であり、今回はその3回目となります。

 

ヌーラボサービスにおけるAPI設計・運用のこれまでとこれから

最初は、株式会社ヌーラボ テクノロジー・エバンジェリスト 染田 貴志さん(@tksmd)の発表

API Meetup #1、#2の振り返りとAPIの概観から、ヌーラボにおける実際のAPI設計・運用のお話をして頂きました。

  • なぜ今APIなのか
    • これまでのAPIはデータの一部を取得できるなど補完的な役割だった
    • これからはAPIがサービスそのものとなっていく
  • APIエコシステム
    • Evernoteでは、API連携したアプリケーションがユーザの満足度を上げている
    • 色んなサービスがAPIで繋がり、新たな価値が提供される
  • ヌーラボの事例1 - APIの世代交代
    • Backlogでは2007年からAPIv1を提供していた
      • XML-RPC、HTTP Basic認証など今ではレガシーな方式だが、当時は十分使われていた
      • 機能はサービス全体の一部であった
    • 2014にv2を提供開始
      • REST/JSONAPI Key、OAuth2など現在のトレンドをキャッチアップ
        • 数年でv1の方式がレガシーなものになった
      • 機能はほとんどすべてのことをAPIで出来るようにした
    • 移行ポリシー
      • v1は廃止しないが新機能追加もせず、新規ユーザにはv2を推奨し、機能要望もv2のみ受け付ける
    • アーキテクチャ
      • v1はBacklogアプリケーションの中にAPIが入っていたが、v2では外に出した
      • 実装が2つ必要になり、複雑な処理はバグの元となるので、複雑な処理はv1を内部的に呼び出す
      • v1はJava、v2はScala
  • ヌーラボの事例2 - エディタ機能の外部提供のアプローチ
    • Cacooはもともとエディタ組み込みのニーズがあった
      • 広告素材の編集などをリモートでリアルタイムで行いたいが、自社で作るのは大変なのでCacooのサービスを利用したい
    • SDKを提供しニーズに答えた
      • オンプレミス版で提供し、専用のAPIを設けることで細かいニーズに答える
  • ヌーラボの事例3 - APIを核にしたサービス設計と実装
    • Typetalkはモバイルファーストで設計した
      • 認証の部分を分けて、Web用認証・OAuth2認証それぞれから同じAPIロジックを叩く
        • APIの外部提供はOAuth2認証経由
    • 実装コストが2倍にならないようなアーキテクチャを設計し、また、モバイルにやさしいものにする。
  • APIのこれから
    • 以前からYahoo! Pipesのようなマッシュアップツールがあった
    • しかし最近はIFTTTの登場など、開発者以外でも手軽にAPIを組み合わせて価値を創造することができる
    • APIそのものはサービスと同等の提供価値に

古すぎず新しすぎない技術をキャッチアップし続け、また既存のサービスがレガシーになり始めたら積極的に改善を行っている印象を受けました。

また、染田さんの発表も非常に分かりやすく丁寧で、APIそのものを取り巻く環境の変化を咀嚼することができました。

 

WebRTCにより可視化されるリアルタイムクラウド。求められるAPI

続いて、NTTコミュニケーションズ株式会社 小松 健作さん(@komasshu)の発表

カエルの格好で登場。 WebRTCの紹介と、そこから見えてくるAPIの潮流についてお話いただきました。

  • 本当のWeb革命は、僕たちが自分たちのためにものを製造し、それを他の人も利用できるようになったことであるクリス・アンダーソン
    • 前世紀までは、多数のSupplierが巨大なProviderに価値を提供し、巨大なSupplierが大量生産・大量消費でConsumerと繋がっていた
    • 今世紀からは、多数のSupplierが多数のProviderに価値を提供し、多数のProviderがそれぞれのセグメントのConsumerに価値を提供する
      • SupplierとProviderはAPIで繋がっている
    • SupplierとProvider間のAPIで最も強力なものがWeb
      • Webはそれ自身をAPIとみなすことができる
  • APIの変遷
  • 2004年からHTML5によってWebが大きく変わっている
    • 通信にフォーカスすると、HTTP/1.1からWebSocketの双方向通信、WebRTCによるP2P通信へと拡大している
    • Webを用いたビデオチャットは今までもあったが、それが民主化している
  • WebRTCを用いた事例
    • ロボットのテレプレゼンス応用
      • WebRTCでロボットを制御し、ロボットについてるカメラからリアルタイムで映像を取得できる
  • NTTコミュニケーションズさんのSkyWayを用いると、WebRTCによるビデオチャットシステムを簡単に構築できる
    • 現在オープンβで利用可能
  • 他にもNTTコミュニケーションズでは色んなAPIを提供しています

WebRTCで非常に有名な小松さんの発表を聞くことができ、非常に嬉しかったです。

自前でゼロからWebRTCによるテレプレゼンスを構築しようとすると非常に大変ではあるが、SkyWayのようなシステムを導入することで開発者は簡単にWebRTCを利用でき、それを用いた価値を提供できる。 そのような世界がついそこまで広がっている。

会議以外での応用も十分期待できると感じられました。

「Gunosyの急成長を支えた技術チームの取り組み実例を大公開!」に参加してきました

2014/09/24(水)にGunosyさんが主催するイベント、Gunosyの急成長を支えた技術チームの取り組み実例を大公開!に参加してきました。

1年で1台->100台まで増やした話

最初は、CTO 石橋雅和さんの発表。

1年で急激な成長を遂げたGunosyのインフラをどう支えていったかというお話でした。

  • Gunosyのサービスが、メール配信→スマホアプリ→夕刊導入→GunosyAdsローンチと拡大
  • その中で、以下のような変化が起こる
    • メール配信時は負荷の大半がメール配信及びリダイレクタであったが、スマホアプリリリースによって負荷がAPIエンドポイントに変わった
    • メール配信はユーザごとに受信時間にズレがあったが、スマホアプリはプッシュ通知によって同時刻に一斉にアクセスするため、スパイクが極めて急峻になった
    • 夕刊導入によって、解析時間の短縮が必要になった
  • 早めにアーキテクチャを決定し、チューニングに専念することで対処

変化していくユーザを検知し改善を行う分析基盤の話

続いて、吉田宏司さんの発表

DAUチームというのは、ユーザのリテンションに責任を持っているということで、この組織名がついているのだとか。

  • 「数字は神より正しい」という方針のもと、開発を行っている
    • 「迷ったら挑戦しよう」でどんどん進める
  • 改善案は新規ユーザに対してテストする
    • 既存ユーザだとバイアスがかかっているので効果が判定しづらい
    • 新規ユーザの定着率を見る
  • 人力でもいいからレコメンドロジックを組む

フルスクラッチで書いたアドサーバの開発運用史

続いて、印南聡志さんの発表

Gunosyの広告に関するお話。

  • 広告による収益の最大化 → 良い広告大量に配信する
  • とにかくクリックされやすい広告を出す(第一の罠)
    • ユーザはストレスを感じ、広告主はコンバージョンの低さに不満
    • ユーザ、メディア、広告主の三者の利益を最大化するような広告を心がける
  • 広告を大量に配信するためにサーバを横に並べる(第二の罠)
    • レイテンシ増大
    • たとえキャッシュでも1箇所を参照するような構成にしない

Gunosyを支える技術

最後は、執行役員 松本勇気さんの発表

推薦アルゴリズムとアド以外の全ての開発に責任を持っている部隊のお話。

  • APIサーバにおける負荷対策
    • TVCMを打つということで性能を一桁上げる必要に迫られる
    • RubyからGoへの移行
    • データのほとんどをプロセスキャッシュに乗せ、別スレッドでDB書き込みを行い、RDBにアクセスしないようにする
  • インフラ管理
    • ChefとOpsworksで管理
    • AWSコンソールからポチポチクリックするだけで構成を作れるよう設計
    • 海外向けは攻めた構成になっている
    • Dockerを本番で使った経験あり(すぐに下げた)
  • フロントエンド開発
    • iOSアプリは細かい周期でリリースできないため、リモート指定UIを導入
    • 自社製組版エンジンを導入し、よりコンパクトに文字列を表示できるように

 

全体的な印象として、積極的に改善を行っていき、常により良いものに変更し続けている姿が印象的でした。 また、非常に若い方が多く、その方々がどんどん経験を積みながら第一線で活躍しておられ、非常に感銘を受けました。