Developers Summit 2013レポート(1)

遅きに失した感がありますが、デブサミ2/14分のレポートです。

実はデブサミに参加したのは今回が初めてでした。 長い坂を降りて目黒雅叙園へ。 最初間違ってアルコタワーに入ってしまい、中から雅叙園へ回りました。後で聞いたところによると、エスカレーターを使って行けるルートがあるようですね。ぐぐるとすぐ見つかりました。

Webブラウザの時代は終わるのか?〜スマホアプリとHTML5の未来〜

ウェブが破壊したもの
  • 20年前のPC, MacCUIからGUIへの移行期にあり、PCは生産作業ツールだった
    • 当時はGUIが競争力の源泉と考えられていた(例: Apple vs MS裁判 1988-1994 → Apple敗訴)
    • GUI操作の特徴: シングルクリックで選択、ダブルクリックでデフォルトアクション
  • ところが1995年インターネットが登場し、PCはコミュニケーションツールに変わった(それ以前もパソコン通信はあった)
    • ウェブブラウザのUIはOS非依存
    • ブラウザ操作の特徴: シングルクリックはページ遷移
  • インターネットとブラウザの登場でOSメーカー(MS)とウェブ企業(Google等)の戦略は互いにつぶし合う様相に
iPhoneの登場とスマホアプリ
  • Apple社の戦略はOSメーカーとブラウザのつぶし合いとは違う
    • アプリならではの長所を生かし、AppStoreというエコシステムを形成
  • スマホへのブラウザアプリの最適化は不可能ではないとはいえ、専用にするならアプリの方が楽、クロスプラットフォームにしようと思うと互換性で苦労する
  • スマホアプリ=進化したウェブアプリなのか? Webの通信を使いながら、より優れたUXを提供できる。ウェブが終わりってアプリの時代が来るのか?
ウェブ vs アプリ

哲学

  • Webの基本3要素(Tim Berners-Lee)はHTML, HTTP, URI。一番重要なのはURI
    • URIができたので誰でも同じ情報を参照できるようになった。Google検索もURIがあるから可能
  • スマホアプリ=ウェブを補完する存在
    • better UXでウェブをサポートするが、URIは扱わないか意識させない作り

市場

  • スマホアプリ市場の規模感: 広告などと比べると小さい。日本のソーシャルゲームくらい
  • すべてのウェブサイトはアプリ化するのか?
    • メリットは業態によって様々。零細通販では開発費がペイできないかも
    • アプリ化のデメリットももちろんある: 開発コスト、アップデート頻度低下

技術

  • ウェブブラウザも進化している
  • W3C Push API
    • ウェブサイトからスマホへのpush通知。通知を受けるとブラウザが起動
  • 事例: ngCore on HTML5
    • ngCore: DeNAが提供するゲーム開発環境(ngMocoから)
    • JSでゲーム開発 → OpenGL等のネイティブAPIを利用
    • 2年前は夢物語と言われた → 今は結構動く
まとめ
  • スマホアプリ vs ブラウザアプリ: 対立というより相互補完の関係にある
    • アプリ: UIに優れる、ブラウザ: 幅広い用途に対応
  • 用途別分類: 横軸: 高度なUI←→機種非依存; 縦軸: 利用頻度としてプロットしてみる
Action!
  • できないと決めつけていることはありませんか
感想

スマホアプリとブラウザアプリは相互補完の関係にあるというのは実感としてもわかります。上手な分担ができれば使い勝手はよくなりそうです。アプリとブラウザ間でログインセッションの共有がもっとスムーズにできるといいな、などと連想しました。

トランザクショントレース

パフォーマンスチューニングとは
  • 要件を満たすための改善活動 → 目標がある
  • 3つのアプローチ → ずらす、変える、増やす
  • FAQ: 対策がわからない → 問題・原因がわかったつもりでクリアになっていないケースが多い
    • クリアにできない: 解明手段がない、セキュリティー上見えない
    • クリアにしたくない: メンタルな理由
パフォーマンス低下 - どうする?
  • アーキテクチャによって打つ手は違うだろうが、アプローチは本来同じであるはず
  • 標準アプローチを確実に押さえることが重要
  • Front-Back-DBのマルチtierの例
トランザクショントレース技術
  • Compuware社製品PurePath
  • ユーザーのクリックからDBクエリーまでをひもづけてトラッキング
  • 問: ネットワークモニタリングとは違うのか?
    • ネットワークモニタリング: スイッチにしかけてデータの流れを見る
    • トランザクショントレース: アプリケーションの動きを見ている
  • ユーザーのクリック → HTTPリクエスト → 各サーバーのどのメソッドを通るかを階層表示
PurePathの仕組み
  • タギングを使ってデータを識別
    • 各サーバーにインストールされたエージェントがメッセージにタグをつけていく
    • タグを分析サーバーに集約・分析
    • 流れに付随する引数なども取ってくる
    • 必要なコンテキスト情報をすべて取ることができる
  • PurePathの特長
デモ
  • よくある質問: このネットワーク図って、自分で定義しないといけないんですよね?
    • → サーバー間のトラフィックは実際の呼出しを分析して自動でネットワーク図作成
    • doLoginの第1引数がユーザー名と定義しておけば、ユーザーのクリックからの追跡を抽出できる
    • 取得したトランザクショントレースをexport → 別の技術者がimportして分析
      • 正常時のトレースと比較(リグレッション分析)
      • 今回のデモの例: authenticateメソッドが735回も余分に呼ばれている!
  • PurePathの機能
チューニングのアプローチが変わる
  • ログ分析 → トランザクショントレース
  • 再現待ちという仕事がなくなる → すぐに分析
  • 勘と経験 → 科学的、説明可能な分析
  • → 標準化
Action!
  • 快適なアプリケーションを通じて、快適な社会を作りましょう
感想

トランザクショントレース技術のすごさがよくわかるデモでした。他の技術と比べたとき、トランザクショントレースの弱点はなんだろうと思いました。

Ruby 2.0

  • 14-A-3
  • @yukihiro_matz
  • スライド
  • 毎年devsumiでは聴衆おいてけぼりで話せと言われている
  • 今日はRuby 2.0の好きなところを話す
Ruby誕生
  • Rubyを作りはじめたのが1993年2月24日。
  • この日に「Ruby」という名前が決まった
    • 概念としてのRubyが生まれたのはこの名前が決まった瞬間。そのときにRubyが誕生したと思っている
    • 会社にコンピュータがあってメールも使えたので、いっちょ作るか、と始めたのがRuby
    • あと10日で20周年
  • 言語を作るのは大変。"Hello World"を動かそうとすると文字列を作らなきゃいけない。そのためには文字列オブジェクト、文字列クラス、Objectクラス、といもづる式にいろんなものが必要に。出力するにはIOオブジェクト……
    • 最初のHello Worldが出るまでに半年かかっている
  • 1995年12月 Version 0.95初公開
    • 人にあげるたびに0.01ずつバージョンを上げていた
  • 1998年の1.2以降、開発系と安定系で分かれる
    • 盆と暮れに出すのが目標
  • プロットすると、2.0前でサチってしまいそう
    • 「これは本当に2.0にふさわしいんだろうか」という心理的ブロックがある
  • 一昨年2.0を出すとアナウンス「2013年2月24日にRuby2.0を出す」
とうとうやってきた2.0
  • Ruby2.0の話はこれまでずっとしてきていた
  • 過去の2.0候補
  • RubyConf2001 最初のRubyConf。キーノートで言及
    • 911があった年で米国入国が大変だった
    • スーツケース全部開けられた
    • Florida州タンパ。OOPSLA会場にて
    • 出席者32人の小さなカンファレンスだった
    • VM、新GC、ネイティブスレッド、埋込API
    • 心理的壁にもこのときすでに言及
    • 当時の構想: コア実装の置き換え
      • Perl, Pythonと比べて遅い遅いと言われていた
  • ここで言われていることはほとんどRuby 1.9で実現された
    • VMYARV ささだこういちさん Rubyバイトコード
    • GC → 世代別GC ひやまさん 1.6→1.7 でメモリ割当てを変更したらかえって遅くなってしまった
      • → 1.9ではLazy Sweepを導入。2.0ではbitmap marking
    • native thread → 1.8まではgreen thread(ユーザーレベルスレッド)
      • Ruby開発開始当時はマルチコアCPUもなかったし普通の人がマルチスレッド使う方が効率的という考え方はなかった
      • キレイにプログラムを書けるようにスレッドを用意した
      • 1.8ではthread切りかえのたびにスタックをまるごとコピー。リンクしたいネイティブライブラリがマルチスレッドだと相性が非常に悪い
      • 1.9ではnative thread。すべてのライブラリの再入可能性を保証できないのでGiant Interpreter Lockを使った。IOするときはロックを外すのでOK。IO heavyなプログラムでなければ使えないと文句を言われる。JRubyはnative threadだよー、とよく自慢される
    • 埋込API → 1.9では不採用。C APIについては互換性あり
現代のRuby2.0の起源
    • RubyConf2003のキーノートで言及
      • キーワード引数、新ハッシュリテラル、メソッドコンビネーション、セレクターネームスペース
    • 心理的壁を乗りこえられたのは
      • 20周年記念 Anniversary Driven Development
        • 20だから2.0みたいな。2000円札みたいな
      • キーワード引数、メソッドコンビネーション、セレクターネームスペースがそろったというのが大きい
Ruby 2.0の新機能紹介
  • キーワード引数
    • 名前つきオプショナル引数
    • 呼び出すほうは新ハッシュリテラル(1.9から使えるsyntax)
      • 一番最後の引数がハッシュだとブレース不要(昔からあるルール)
    • Ruby 1.9では問題がある。渡されるほうはhashで受けて手動で分解しないといけない
    • 2.0ではメソッド定義側で書けるようになった
      • def downto(from, to, step: 1)
    • APIの柔軟性、ドキュメント化、読みやすさ、覚えやすさ
  • Module#prepend
    • メソッドコンビネーションの実現
    • 既存のクラスの修飾
    • alias_method_chain: Railsで多用
      • 欠点: 名前衝突の危険、名前管理が必要、修飾のグループ化が困難
    • メソッドコンビネーション: CLOS (CommonLisp Object System)から
      • デフォルトで定義されているもの: before, after, around
      • 正直言うとRubyにはオーバースペック
    • 純化したもの → Module#prepend
    • prepend: 前につける: includeは後ろに追加、prependは前に追加
      • includeは自モジュールが優先だが、prependは入れた方が優先
    • 既存のメソッドをwrapし、superで呼び出す。その前後に追加の処理を記述
  • Refinements: 既存クラスの拡張
    • メソッドの追加、wrap
    • オープンクラス: クラス再定義。mathn, jcodeで使用
    • 実用するのは難しい。スコープ問題がある。クラスを再定義してしまうと、プログラムの他の部分に影響をおよぼす
    • そこでRefinements
      • スコープ限定のオープンクラス → 実験的機能として入れることに
      • 実験的とは? 実はJRubyなどで実装しようとして問題が発生
        • → 入れないと誰も使ってくれない。ブランチをDLして使ってみる人はいない
    • module R内でrefine String do ... end
      • using Rが有効なスコープ内でだけ、refinementsが使える
    • 他の言語の試み
      • Smallscript: Selector namespace
        • メッセージの名前空間分離による多重化。挙動が難しい(継承すると大変)
      • Smalltalk/Java: Classbox
        • 既存クラスを置き換える。GUIのlook&feelを変えちゃう例。local rebinding → lispの動的スコープ
      • C#: 拡張メソッド
        • Scalaのimplicit。追加しかできない
      • Classic: プロファイル。matzの卒論
        • ひとつの構造体に複数のインタフェース「プロファイル」。同じクラスに属するプロファイル間で相互に代入可能
  • Enumerable#lazy
    • 関数型プログラミング?
    • 関数型ワナビーとして
    • メソッドチェーン (1..Float::INFINITY).map{..}.select{..}.first(3) → 動かない(途中のmap, selectがeager動作)
    • 提案。遅延評価版のメソッドを作る: map_lz, select_lz (lazyが_lzになっている時点ですでになまけものだw)
      • 全部を置きかえるのめんどくさい
      • 遅延(lazy)を求めるものは怠惰(lazy)である
    • 最初にlazyってやればいい → ナイスアイディア
      • (1..Float::INFINITY).lazy.map{..}.select{..}.first(3)
      • 中身はいろいろ大変
  • その他の新機能
    • デフォルトUTF-8
    • Dtrace/TracePoint
    • 性能向上: VM,GC,Win上でのrequire
Ruby 2.0以後
    • 言語としてはほぼ完成。これ以上はやりたいこともあるが言語をこわさないといけない
    • そうは言っても、進化は続けなければならない
      • 性能改善: JITとか
        • JRubyが後発なのにうちの方が速いとか言っててムカツク
      • 適用分野拡大: 組み込み、ハイパフォーマンス
      • マルチコア
      • アクター
      • multiple VM
感想

まつもとさん、いつも楽しそうにしゃべりますね。キーワード引数はすぐにも使いたいです。Module#prependは下手に手を出すと可読性に難が出そうですが、instrumentation的な使い方が面白くなりそうでしょうか。

RubyiOS/Androidアプリを作るMobiRuby

mruby
  • 概要
    • 省メモリ環境向けのRubyの新しい実装
    • 2012年ISO/JIS Ruby
    • CRubyのサブセット: ないもの: File, Socket, Thread
    • OS/CPU 依存が少ない
      • POSIXが要求されなくなった。C99さえあればいい
  • configurable
    • 不要な機能をコンパイル時に削除
      • evalもいらないとか、Struct, Time, Math, STDIO, Regexp, sprintfなどはでかいから切り離したいとか
    • Tableをhashからlistに
    • 400〜500kからさらに小さく
      • Lego Mindstorm上でも動く
  • mruby target
    • 組込
    • バイスだけでなくアプリにも組み込める。エディタのマクロ言語とか
    • mod_mruby
  • mruby internals
    • VM: RiteVM: Multi VM instance
    • 弱点: スレッドセーフでない
  • 開発
    • 2010年春からクローズでスタート
    • 2012/04/22 GitHubに公開
  • mrbgems
    • 2012/11に@boviが作った(rubygemsとの互換性はない)
    • GitHubからカンタンにインストール
    • クロスビルドサポート
    • mrubyで提供されているライブラリbindings
      • digest, json, iconv, base64
      • 作ってるのは5人くらい
    • mruby: 車のエンジンのようなもの。シンプルな昔のエンジン
MobiRuby
  • 米国から日本への帰国便の中でiPhoneで動くことを確認
  • What's MobiRuby
    • iOS app development kit
    • MITライセンス - mrubyと同じ
    • Objective-Cで使える機能はすべてmrubyで書ける
    • Android版も準備中
    • AppStoreでmobirubyをさがせ
  • Vision
  • MobiRubyコードの例
    • defineはほとんどObjective-C
    • コード補完が効かないのが痛い
  • Next Step
MobiRubyスタック
  • mruby-cfunc: C言語の関数を呼ぶ。mallocも呼べる
  • mruby-cocoa: Cocoaブリッジ
    • CocoaはほぼすべてCから呼べるようになっている
      • mruby-cfuncでたたけば何でもできる
      • 速度が必要な部分などはCで書いた
    • delegate, blockも使える
    • キモイこともできる
      • Objective-CのクラスをRubyで継承、さらにObj-Cで継承
      • ひとつのメソッドだけRubyで定義
    • メモリ管理方法のミスマッチ(refcount vs mark-sweep)
      • 苦労して実装 → 遅い
  • mobiruby-common: iOS/Androidで共通にできるだろう機能
    • mrubyにはrequire, loadがない(なぜならFileがないから)
    • requireを作ってもらった
  • mobiruby-ios: iOS用にパッケージングするためのモジュール
  • ロードマップ
  • current status
    • MobiRuby based appがすでにOK
    • AppStore規約に合うか?
      • 外部から読み込んだコードを実行できてはいけない
      • プライベートAPIをたたいてはいけない
        • 仕様には書いていないがヘッダファイルに書いてあるAPIを使っている → 心配
    • 残存バグ: プロパティーが定義できるが読めない
  • テスト
    • C側のテストはだいたいそろった
    • ObjC側のテストをこれから作っていく
  • Pros
    • Ruby power
    • based on Matz implemented Ruby
    • mrbgems
    • MIT license
    • Compact (〜4000行)
    • mrubyで正規表現がサポートされれば……
  • Cons
    • 不安定。そもそもmrubyがまだバージョン番号もない
    • class/functionsが少ない
    • debugがつらいbacktraceがない
  • FAQ: RubyMotionと比べてどうよ
    • RubyMotion は2万円、MobiRubyは無料
      • 安定性から言って、いますぐ2万円払う方がおすすめですw
    • MobiRubyはMatz実装なのが大きい
Action!
  • MobyRubyの動機: Ruby Powerを世界に
    • JavaScriptiOSアプリを作る会社にいた
    • mrubyのα版をもらえるので作ってみた
    • 競合はしない
  • ワールドワイドのポートフォリオを作りたい
  • 海外のカンファレンスでしゃべる
感想

@masuidriveさんのTLを見ていると、日々@mattn_jpさんとキャッキャウフフしながらmrubyの実装を進めている様子が伺えます。mrubyいろいろ試してみたいです。

こわくない関数型言語

中野さん
  • 関数型言語ってこわい?
  • 関数型言語である」と思う基準は?
    • 関数が値として渡せる?
    • 高階じゃないと関数型じゃない?
    • 参照透過性? 副作用が隠蔽/分離されている? 型推論?
  • 答: 問題が不適切です
    • 「関数型」とはプログラミングスタイルである
    • 言語に依存しない問題
  • そもそも「関数」とは
    • 数学の関数の定義と同じ。入力集合の全ての値に対して結果がひとつ定まる
    • 関数でない例: 同じ値でも出力が変わってしまうもの、入力集合の一部に対して値が定義されないもの
  • 関数はどれ?
    • getchar(), putchar(int c), random(int p), inc(int* x)
    • 答: 問題が不適切。入力集合A、出力集合Bが定義されないとわからない
    • 入力は引数だけではない。出力は返り値だけではない
  • 関数化する
    • スライド参照
  • 関数化の注意点
    • f(g(x))のgを関数化する → gの入力集合が変わる → fの出力集合も
  • 関数型言語?
    • 入出力の集合を知らないといけないはず。どうする?
    • 結局のところ定義が難しい
  • 関数型プログラミングとは?
    • ほとんどが関数であるような記述。非関数をできる限り小さく
    • どんな言語でも書けるが、書きやすい言語は存在する
    • 関数型プログラミングが記述しやすい言語」
  • 関数型のメリット
    • モジュール化しやすい: 並行計算
    • 検証などの最新研究の恩恵: 型検査、モデル検査
    • エアバスA380: OCamlで検証・生成したCで実装されている
  • 関数型: 便利な機能に慣れる必要がありますが理論まで理解する必要はありません
    • Functional is Fun
  • takesakoさんのQ: 「関数」と「函数」の違いって何?
こわくないSML#
  • 上野さん
  • SML# 1993年 .netより前からあるんだよ
  • 2012年1.0リリース、2013年2.0
  • SML#: 強い型付け、eager評価。MLファミリー。OCaml, Standard MLの仲間
  • 関数型は輝かしい未来。Cとかはどろくさい現実。2つの世界は名状しがたい何かで分離されている。そこにはテクニカルな何かがある。SML#は2つの世界を結ぶ。輝かしい未来でなくどろくさい現実を指向した言語 #devsumiB
  • 3Dアニメは関数: 動画(時刻 t) → 画像
  • 多言語プログラミング
    • 手続き的な処理はC、宣言的に書けるところはML
  • pros
こわくないScala
  • 水島さん
  • こわそうなScala
    • implicit conversion, implicit parameter
  • 誤解1: 関数型の概念を理解する必要がある
    • 「タイプ数が少ないJava」になることをおそれない
    • 第一級の関数の活用 → ループから再帰高階関数
  • 誤解2: implicitなんとかを使いこなす必要がある
    • クラッチから書きときは必要ない
    • 標準ライブラリを読むときに勉強すればいい
    • 最初に全てを知ろうとしないことが大切
  • 誤解3: 関数型なコードを書かないとたたかれる
  • 誤解3: Scalazという難しいライブラリを普通に使う
    • コアライブラリの作者が使っていたりする

18:39

ここでMBAが電池切れになってしまい、自分も電池切れになったのでその後のパネルが思い出せません。すみません。
Togetterをどうぞ。

感想

関数型言語は、やろうやろうと思いつつまだ勉強していません。数学の定義から関数を考える、というのが結構わかりやすい気がしました。

その他

ノベルティーをたくさんもらいました。ステッカーとか、バレンタインデーだったのでチョコレートとかも。Amebaウォーター、いつも助かります。

この日のランチは目黒通りまで出たところの居酒屋ランチ。牛タンシチューをいただきました。その席で@kura_labさんから出た意見をツイートしたら、たくさんRTをいただきました

個人スポンサーはGravatarから写真を取っていたようなので、登録メールアドレスから取ってもらってもいいですね(もちろん許可した場合)。

あとはこんなのとかw