Monthly Archives: 1月 2016

2016-01-28

Progressive Web Apps

こんにちは。GMO NIKKOのY.Sです。
先月、Google for Mobileに参加した際に、Progressive Web Appsの話を聞く機会がありました。

スライド資料:「スマートフォン体験を一歩先へ 〜 プログレッシブ ウェブ アプリの作り方」

なかなか興味深かったので、どういう概念でどういう背景があって生まれたのか調べてみました。

Progressive Web Appsはモダンブラウザの新しい機能(一部ドラフト段階の実験的な仕様もある)を使って、アプリのようなユーザー体験ができるようなWebアプリです。ブラウザで表示されるウェブページには変わりないので、レガシーなブラウザでも最低限のコンテンツを表示します。ストアを通してデプロイされない、パッケージされないという点ではハイブリッドアプリとは違います。

拡張された機能で以下を実現します。

  • アプリインストールバナー
    • 5分以上の間隔で複数回アクセスすると出てくる
    • ホーム画面アイコン、テーマカラー、スプラッシュ画面、フルスクリーン表示などを設定可能
  • Webプッシュ通知
    • GCM利用
  • オフライン利用
    • Cache API
  • アプリのようなUIとインタラクション
    • Applicatoin Shell + Content アーキテクチャ

いずれもService Workerを使うため、その要件であるHTTPSまたはlocalhost上でホストしているページが対象となります。

使われている周辺技術はService WorkerやWeb App Manifestなどまったく新しいというわけではないですが、このような技術の組み合わせに名前を付けることでAjaxやレスポンシブデザインのように多くの人に広まり、使ってもらう狙いもあるようです。Progressive Web Appsという言葉・考え方を提唱したAlex Russell氏のブログに、その辺りについて述べられています。
Progressive Web Apps: Escaping Tabs Without Losing Our Soul

また、上記ブログの中で、放棄すべきでないWebの利点・価値として以下を挙げています。

  • コアな体系化システムとしてのURLとリンク: リンクできなかったら、それはWebではない
  • 人と検索エンジン両方のアクセシビリティのためのマークアップとスタイリング
  • 中心となる機能に追加的に提供されるUIリッチ化とシステム拡張能力
  • 特別な権限や支払いなしで実装自由、実際のところ、標準ベースを意味する

URLやリンク可能にする考え方は、ネイティブ側でもUniversal LinksやApp indexingなどが出てきているので、Webに限った話ではなく、ともに同じ方向を進んでいると言えます。

Google開発者向けの解説ページでは、Progressive Web Apps
を次のように特徴づけています。

  • プログレッシブ ブラウザの選択によらず、あらゆるユーザーに対して動作する。中心的理念としてProgressive Enhancement(プログレッシブエンハンスメント)で作られているため。
  • レスポンシブ どのフォームファクタにも適合する: デスクトップ・タブレット・モバイル、次にくる何でも。
  • 通信環境に依存しない オフライン環境や低品質の通信環境でも動作するようService Workerで機能拡張される
  • アプリライク アプリスタイルのインタラクションやナビゲーションで、アプリのように感じさせる。app-shellモデルの上で作られているため
  • 新鮮 Service Workerのアップデート処理のおかげで常に最新である
  • 安全 HTTPS経由で配信することで、盗聴を防ぎ、改竄されてないことを保証する
  • 発見可能 W3Cマニフェストによってアプリケーションとして識別可能で、Service Workerの登録スコープによって検索エンジンが見つけ出すことを可能にする
  • リエンゲージ可能 プッシュ通知のような機能を通してリエンゲージしやすくする
  • インストール可能 app storeの面倒さなしで、有用だと分かったアプリをホーム画面にキープしておける
  • リンク可能 URLで簡単に共有でき、複雑なインストールを必要としない

Progressive Enhancement(プログレッシブエンハンスメント)は、マークアップされたドキュメント構造でコンテンツの意図が伝わる(セマンティックである)ことを前提として、レガシーブラウザ環境のユーザには最低限の表現でコンテンツを提供しつつ、モダンブラウザなど環境が整ったユーザに対してはよりリッチな表現(ユーザエクスペリエンス)を提供する考えです。このような考えをベースにWebアプリにも展開している、ということが分かります。

実装例

以下、Progressive Web Appsを実装した例として、紹介されているWebアプリです。カバーしている機能が一番多い、Android Chromeで見るとリッチ化されたUXがよく分かります。

まとめ

ネイティブアプリが提供する高速で快適なUI/UXや、ネイティブでしか出来ない機能も多いことを考えると、ネイティブアプリの優位性はそうそう低下しないと思いますが、WebはWebでアプリの価値を上手く取り込もうとしています。限定された機能・サービスであれば、Webアプリで十分カバーできるケースも増えてくるでしょう。

一方、Progressive Web Appsを完全にサポートするWebアプリを作るとなったときに、今までとは違った設計・開発が必要なため、それをサポートしてくれる開発ツール・フレームワークなど、これから色々出てくるような気がします。JavaScriptの新しい言語仕様やフロントエンド側フレームワークのトレンドの移り変わりの速さと言い、この分野はしばらく変化が続きそうです。

2016-01-12

kaggleで始める機械学習

スクリーンショット 2016-01-05 14.56.47

はじめまして。GMOアドマーケティングの t.k です。今回は機械学習の勉強にも使える kaggle についてのはじめの一歩になります。

kaggle とは企業や研究者がデータを投稿し、世界中のデータサイエンティストがその最適モデルを競い合うコミュニティです。日々さまざまなコンペティションが開催されており、中には企業が主催し成績優秀者に賞金を出すものもあれば、賞金は出ないがデータサイエンスの技術を学習するためにゲーム感覚で参加できるものもあります。

そして今回、学習用として用意されているコンペティションである、Titanic: Machine Learning from Disaster | Kaggle で予測をしてから回答を投稿するまでの実際の流れを試してみたいと思います。この記事では機械学習の手法などの細かい点には触れませんのでご了承ください。あくまで kaggle を試してみるという観点です。

ちなみにタイタニックはみなさんご存知かと思いますが、1912年に沈没した豪華客船タイタニック号のことであり、このコンペティションの目的は生存者を予測するといったものであります。また、機械学習といえばビッグデータを思い浮かべますが、今回の学習データは少ない件数なので普通のPCでも十分試すことが可能です。予測にはR言語を使用します。

データの取得

まず初めに予測に必要なデータを手に入れます。https://www.kaggle.com/c/titanic/data から train.csvtest.csv をダウンロードしてください。データ項目の説明もここにまとめられています。その他の gendermodel.csvmyfirstforest.py はサンプルになりますのでひとまず不要です。

ファイルをダウンロードしたら内容を確認してみましょう。train.csv とは学習用データのことであり、test.csv は予測対象データになります。変数は Survived が求めるべき目的変数、その他が説明変数(特徴量)です。そのため test.csv には目的変数の Survived(生存情報) がないことがわかります。

ジェンダーモデルによる推定

とりあえず提出フォーマットの確認も兼ねて、データのダウンロードページにもサンプルがあるジェンダーモデルで簡単に生存者を予測したいと思います。女性は生存(Survived=1)、男性は死亡(Survived=0)とするだけの単純なモデルです。なぜ性別を使うのかというと生存確率の差が大きいからですね。

提出フォーマットのヘッダー付き PassengerId + Survived でCSVファイルを作成します。

ファイルが出来たら https://www.kaggle.com/c/titanic/submissions/attach から提出しましょう。

kaggle_submission

少し待つと結果が出ます。76.555%の正解率で3,724人中3,089位でした。Kaggleでは、コンペによって使われている指標が異なりますが、タイタニックでは正解率が指標となっています。kaggle_result_3

ランダムフォレストによる推定

続いてはランダムフォレストで予測をしたいと思います。ランダムフォレストとは識別・回帰・クラスタリングに用いることができる、決定木を弱学習器とする集団学習アルゴリズムです。シンプルなのに高速・高精度であるという特長を併せ持つと一般的に言われています。

まずは説明変数をランダムフォレストが処理可能な形に変換します。機械学習アルゴリズムは数値データを前提としているものが多いので、通常、カテゴリデータは数値データに変換する必要がありますが、ランダムフォレストに関してはカテゴリデータもそのまま扱えます。(カテゴリ数が多いとダメ)ただし、名前に関してはそのままだとカテゴリ数が多くて使用できないので、影響が大きそうな敬称のみ抽出して使用したいと思います。Cabin は欠損値が多いので今回は除外しました。

それではモデルを作成して予測を実行しましょう。

再度結果を提出すると、スコア79.426%の1,401位までランクアップしました。82%以上で100位以内に入れるようです。kaggle_result_4

まだランダムフォレストにデータを突っ込んだだけなので、実際はここからが腕の見せ所という感じでしょうか。説明変数なんかはまだまだチューニングの余地がありそうなので、変数の関係を考えながらやると面白いかもしれません。これであなたも kaggler です!

※ブログ掲載のプログラムのインストールは、自己責任で御願いします。インストール等の結果にかかるハードウェアの不稼働等は、 当ブログでは一切サポートしておりませんので、予め御了承下さい。