goo blog サービス終了のお知らせ 

Smile Engineering blog ( スマイルエンジニアリング・ブログ )

ジェイエスピーからTipsや技術特集、プロジェクト物語を発信します

ServiceWorker

2015-10-02 09:18:46 | 最新技術動向展開
前回の記事を書いてからずいぶんと時間があいてしまいました。
今回は前回の予告通り、「ServiceWorker」についてご紹介したいと思います。

ServiceWorkerとは何かを簡単に説明しますと、「バックグラウンドでJavaScriptを動作させ、
様々な処理をWebページの状態に関係なく実行することができる機能」です。
Webページ上のJavaScriptとは別のスレッドで動作する形となり、Workerの一種となります。
それでは簡単に使い方をご説明します。


■インストール方法
ServiceWorkerを使うにあたってはまず、Webページ上で動作するJavaScriptから
ServiceWorkerとなるJavaScriptファイルをブラウザにインストールする必要があります。
インストール後にServiceWorkerは待機状態となり、画面を更新することで動作が開始します。
ServiceWorkerのJavaScriptに記述することで、独自のインストール処理を指定することもできます。

  ◆UIスレッド
  // ServiceWorkerをインストールする。
  navigator.serviceWorker.register("serviceWorker.js");

  ◆ServiceWorkerスレッド(serviceWorker.js)
  // UIスレッドでnavigator.serviceWorker.register関数が呼ばれると、
  // ServiceWorker側ではinstallイベントが発火する。
  // event.waitUntil関数を利用すると、
  // インストール処理に独自の処理を追加することができる。
  self.oninstall = function(event) {
    event.waitUntil(
      // Promiseを用いた非同期処理を指定する。
      new Promise(function(resolve, reject) {
        // ~処理~

        // 処理が完了したらresolve関数を呼ぶ。
        resolve();
      });
    );
  }


■ServiceWorkerの開始方法
先ほどまででServiceWorkerをインストールすることはできました。
しかしそのままでは画面を更新するまでは動作が開始しません。
インストールしてすぐに動作させたい場合はclaim関数を呼ぶ必要があります。

  ◆ServiceWorkerスレッド
  // ServiceWorkerがactivateされた後でないとclaim関数を呼ぶことができない。
  // なのでactivateイベント中に実行する。
  self.onactivate = function(event) {
    event.waitUntil(self.clients.claim());
  };


■ServiceWorkerとUIスレッドの通信方法
ServiceWorkerはUIとは別のスレッドで動くため、
直接データをやり取りしたり、ServiceWorkerから画面を操作したりすることができません。
そのため、MessageChannelを用いて通信する必要があります。

  ◆UIスレッド
  // ServiceWorkerからの連絡を受け取れるようにする。
  var messageChannel = new MessageChannel();
  messageChannel.port1.onmessage = function(event) {
    // event.dataにデータが格納される。
  };

  // ServiceWorkerへデータを送る。
  navigator.serviceWorker.controller.postMessage("message", [messageChannel.port2]);

  ◆ServiceWorkerスレッド
  // UIスレッドからの連絡を受け取れるようにする。
  self.onmessage = function(event) {
    // event.dataにデータが格納される。

    // 応答を返す。
    e.source.postMessage("Response is here.");
  };

ただし、この方法ではUIスレッドからServiceWorkerへ通信することはできても、
ServiceWorkerからUIスレッドへ通信することができません。
ServiceWorkerから通信するには、ServiceWorkerが保持するClientsを利用する必要があります。
長くなるため、今回は割愛させていただきます。


■ServiceWorkerを使ってできること
ServiceWorker内ではDOMへアクセスすることができません。
また、完全に非同期な設計をされているため、XHRやlocalStorageなどの同期型APIも利用できません。

その代わりに、新たに用意された各種APIを利用することで様々なことが実現できます。

◆Fetch API
XHRの代わりにHTTP通信を可能とするAPIです。
キャッシュの制御やCORSなどをXHRよりも細かく制御することができます。
また、UIスレッドにてXHR通信を行った際に、ServiceWorker側でその通信をフックして、
サーバーの代わりに応答したり、別のリクエストに書き替えたりすることができます。

◆Cache API
詳細なキャッシュ制御を可能とするAPIです。
Fetch APIと組み合わせて、
「キャッシュがあればそこから応答し、なければサーバーに問い合わせる」
というような、これまでブラウザが自動でやっていたキャッシュに関する部分を
自分たちで制御することができます。

◆Push API
スマートフォンなどに通知を出すことができるAPIです。
これまでのWebでは、ブラウザを閉じたり、タブを閉じたりすると、
Webページから何かアクションを起こすことができませんでした。
Push APIを利用することで、ユーザがWebページから離れたあとも
「通知」という形でアクションを起こすことができるようになります。

◆Background Sync
「通信ができるようになったら自動で通信」というような処理を可能とするAPIです。
ServiceWorker、Fetch API、Cache APIを組み合わせることで、
端末がオフライン状態でもWebページを表示することが可能になります。
しかし、コメントを投稿したりすることはできません。
そういった場合に、「通信ができるようになったらあとで投稿」することができます。

他にも例えばこんな使い方ができるようです。
https://www.youtube.com/watch?v=2ugAVXRkr9U


いくつかAPIを紹介しましたが、他にも仕様検討中のAPIがいくつかあります。
上で紹介したAPIについても、仕様検討中の機能があったりします。
これまでの「Webページ」では考えられなかった機能がたくさん実現されそうですね。
今後の動向に期待です。


最後に、現在の仕様をもとに作られたServiceWorkerのデモサイトをご紹介します。

・ServiceWorkerとPush APIを用いたチャットサイト
 http://www.locchat.com/

 簡単な利用手順 
 1.Android端末のChromeブラウザから上記のサイトを開いてください。
  「通知を送信しようとしています。」というポップアップが出るので、許可してください。
  そうしたら、タブを閉じて、Chromeブラウザを終了してください。
 2.今度はPCのChromeブラウザから上記のサイトを開いてください。
  画面上部の入力欄からメッセージを入力して、Enterを押してください。
 3.Android端末に通知が届きます。

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

ジェット

2015-08-26 09:00:00 | 最新技術動向展開
日本国産のジェット旅客機(MRJ)が、そろそろ就航するだろうということで、
今回は飛行機のエンジンに関する技術の話題です。

好奇心を刺激する点では、やはりジェットの方が魅力あります。
プロペラ機のエンジンは自動車のエンジンとあまり変わらないので、
ここでは特に触れません。

ジェットエンジンを簡単に説明しますと、形は筒状になっていて
前方から取り込んだ空気を圧縮しながら燃焼室へ運び、
燃料と圧縮空気を燃やして後方から排気する流れです。

1.吸気
2.圧縮
3.燃焼
4.排気

自動車のエンジンは燃焼の力を回転として取り出しますが、
飛行機のジェットエンジンは排気を推進力として取り出す方式です。

全く異なるアプローチでエネルギーを取り出すので、2つの技術に接点など無いと思っていましたが、
エネルギーを取り出すまでの工程(プロセス)を整理してみると、
実は同じ工程を経てエネルギーを取り出していることに気が付きます。

経験上の話ですが、色々な事象には、効率の良い工程というものがあって、
突き詰めて行くとだいたい同じ方針になると思っています。
つまり、飛行機のエンジンの工程を改善して効率を上げる事に成功したなら、
自動車のエンジンにも応用ができると必然的に期待してしまいます。

ここで、ジェットエンジンの種類について確認しますと、
大きく2つに分類されます。

①ターボジェットエンジン
 自然吸気でエンジン内に空気を取り込み、圧縮室にある低圧コンプレッサで圧縮し、
 燃焼室で圧縮した空気に燃料を混ぜて連続的に燃焼させます。
 車のエンジンと違い、常に燃焼が続くので大きな力を発生させられますが、
 その分、燃料の消費が激しいことが想像できます。
 燃焼した空気は後方から排出する際、低圧コンプレッサを稼働させるためのタービンを回します。
 排気でタービンを回して空気を圧縮する力を取り出しているので、
 名称にターボと付いているわけです。

②ターボファンエンジン
 ターボジェットエンジンに吸気ファンを追加したものを指し、
 ほとんどのジャンボジェットで、この方式を採用しています。
 コアとなる部分は同じですが、低圧コンプレッサと同じ回転軸で吸気ファンを回します。
 推進力は吸気ファンによるものが主となり、吸気された空気はバイパスエアと呼ばれ
 圧縮室や燃焼室の外側を通りますので、音を遮る効果もあるそうです。
 ちなみに、ジャンボジェットの吸気ファンのブレード1枚の価格は1千万円ほどで、
 エンジン1機で約20枚ほど付いています。

ターボファンエンジンでは、比較的新しい技術として
吸気ファンの回転数を変則ギアで制御する仕組みがあります。

燃費を良くするためには、吸気ファンを大型化するのが近道でしたが、
タービンと同一軸では毎分1万回転以上で回転する事となり、
ブレード先端が音速を突破して衝撃波を伴う騒音が問題となりました。
そこで、吸気ファンの回転軸をタービンと別軸とした上で
変速ギアにより回転数を下げる手法が取られました。

しかし、変速ギアを組み込む事により、燃費は良くなるものの
信頼性やメンテナンス性の問題が大きいため、あまり実用化が進んでいないようです。

MRJが就航する頃、問題点が解決されていれば、
燃費面が向上されているはずなので、航空機料金が安くなるかも知れませんね。


monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

ディープラーニング~Deep Learning(深層学習)【利用編】

2015-08-05 19:23:58 | 最新技術動向展開
先月7/7の「ディープラーニング~Deep Learning(深層学習)【学習編】」にて、
「Google Photos」について頭出ししましたが改めて。

今年の5月末頃に発表された「Google Photos」は衝撃でした。
ストレージの容量を気にせず写真をアップロード出来ることは衝撃です。
さらに驚いたのが、アップロードした写真が自動的に分類されることです。
「小人さんが分類するわけでもないし、すごい!」なんて思いましたが、
この分類を実現しているのが、ディープラーニングの力なのです。
ディープラーニングを使って写真を分析することで、
人や場所、出来事を自動的に分類できるのです。

例えば、
衣食住の情報を大量にあつめて、これらを学習させることでニューラルネットワークを構築するとします。
多種多様の大量なデータで構築されたニューラルネットワークを利用することで、
特定のインプット情報をキーとしてパターンを特定することができます。
「いま食べたいのはきっとこれだ!」とか「これを食べ続けるとこうなってしまいますよ・・・」とか、
ある入力情報をもとに結果を出す事ができます。出来るはずです。

大量なデータでニューラルネットワークを構築して、
これを利用すればディープラーニングを体感できるわけです。

机上レベルでは分かってきた気がしますので、実際に体感してみたいと思います。

ディープラーニングのフレームワークとしては、「Caffe」、「Theano」、「Chainer」などがあるようです。
本記事では、「Chainer」に注目してみたいと思います。

「Chainer」は「Preferred Networks(PFN)」が公開するディープラーニングを実現するための
オープンソース(OSS)です。Pythonのライブラリとして提供されています。

Pythonのプログラムを書いたり、「Chainer」付属のサンプルを使用して、
「Chainer」の理解を深めていきたいと思います。

現在、「Chainer」の実行環境を構築中です。

次回に続く。


monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

ディープラーニング~Deep Learning(深層学習)【学習編】

2015-07-07 12:07:20 | 最新技術動向展開
人工知能の分野で非常に大きな注目を集めている技術です。
ディープラーニングとは、
“ニューラルネットワークを使ったパターン認識技術”です。
今年の5月末頃に発表された“Google Photos”の写真の自動分類を実現している技術です。

ではでは、少しずつ噛み砕いて理解していきましょう。
“ニューラルネットワーク”とは何でしょうか。

ニューラルネットワークとは、脳内の神経回路のネットワークモデルをコンピュータ内で実現しようとしたものです。
脳内には多数のニューロンと呼ばれる神経細胞が存在します。
ニューロンは信号の送受信を双方で行いあうことで、情報処理を行っています。
このモデルをコンピュータ内のネットワークに実現したものがニューラルネットワークです。
複数のニューロンがつながったメッシュの構造をイメージされたかもしれません。
イメージはあっています。特徴的なのが“3種類の層”です。
(そもそも私が図示すればわかりやすいのですよね・・・次回は図を描きますね。)

入力層、隠れ層、出力層の3種類の層(役割)が存在します。
入力に対して単純な変換処理を繰り返し、繰り返し、最後に出力する。
このような処理を3種類の層でこなします。
先に登場した“Google Photos”の写真の自動分類を例に説明します。
入力として画像(写真)が渡され、単純な変換処理を繰り返し繰り返し繰り返し、
最後に「この写真はXXで撮られた写真だ!」といった予測結果を出力する。
このような処理が入力層、隠れ層、出力層の3種類の層で行われます。

「繰り返し繰り返し繰り返し・・・」と記しましたが、この部分が隠れ層の役割になります。
隠れ層は1層ではなく、何層にも重なった構造になっており、この層の重なりが
ニューラルネットの処理精度の向上のポイントとなります。
何層も何層も、深い構造に。
“深い”というキーワードが登場しましたね。
これが、ディープラーニングという名前の由来でもあります。
ディープラーニングでは何層にも重なって構成されたニューラルネットワークが肝ということです。

何層にも重なったニューラルネットワークがあれば、写真の自動分類も簡単にできそうですね。
さて、このニューラルネットワークはどのように構築するのでしょうか。

そもそもニューラルネットワークは、“学習”と“利用”という概念があります。
先に登場した何層にも重なったニューラルネットワークは“学習済みニューラルネットワーク”とも呼ばれます。

このニューラルネットワークを構築(学習)する方法が大きく分けて2つあります。
この方法を簡単に説明しますと、学習する際に“講師”がいるかいないかの2通りです。

“講師”とは学習する際の見本のようなものです。
入力データを与えてニューラルネットワークを学習させますが、この入力データを与える際に、
「これはこのような分類のデータですよ」といったように教えながら学習させる方法が“講師付き学習”です。
「君たち、自分で学ぶんだぁ!」という方法が“講師なし学習”です。
「先生が教えてくれないと・・・」なんて私は思っていましたが、講師なし学習の手法として
“自己組織化マップ”というモデルも存在します。すごいですね。
自分で覚えられるのですね。「背中をみて育て!」といった職人さんの感覚ですね。
以上、ニューラルネットワークの“学習”についてでした。

次は“利用”について。
“利用”についてはディープラーニングの次回号で記載したいと思います。

monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業

HTML5のお勉強 第3回 ~ApplicationCache~

2015-06-29 10:00:00 | 最新技術動向展開
バージョン1.1が公開された1990年代からずっと更新されていなかったHTTPですが、
とうとう重い腰を上げて、より高速な通信を実現すべくHTTP2にアップデートされるようですね。
特徴としてはこんな感じのようです。

1.既存のHTTPとAPIは変わらず
2.ヘッダ情報の圧縮・差分送信およびバイナリフレーム化
3.同時に複数のリクエストを投げられる
4.同一ホストへのリクエストは1コネクションで処理する
5.Webサーバー側からキャッシュすべきデータを送ることができる(サーバープッシュ)
6.リクエストの中断をWebサーバーへ通知できる

サーバープッシュなどは、非常に魅力的な機能ですね。
HTMLファイルをレスポンスしたと同時に、
必要なリソースをWebサーバー側から送ることができます。
ただし、WebSocketのように双方向通信を実現するものではなさそうですね。

蛇足ですが、現在策定中の仕様では「HTTP/2」か「HTTP2」が正式名称となるようです。
2.0じゃないんですね。



さて、今回のHTML5のお勉強はWeb高速化に密接に関わるキャッシュ機能、
「ApplicationCache」についてです。
Webページを表示するとき、一般的にブラウザはCSSや画像などをキャッシュしています。
しかしその仕様はブラウザごとに異なっており、
意図的にキャッシュさせたりさせなかったりということを実現することができませんでした。

そこで登場したのがこの「ApplicationCache」です。
ApplicationCacheを利用することで、オフライン状態でもページを表示したり、
キャッシュ内容が古い場合に確実に更新したりすることができるようになります。

実際に試すことができるデモページがありました。
http://html5demos.com/offlineapp

ApplicationCacheを利用していないサイトでは、
インターネット通信ができない状態でページを更新すると何も表示されなくなると思います。
しかしこのサイトは一度表示してしまえば、
たとえ通信ができなくとも何事もなかったかのように表示されます。


それでは、ApplicationCacheの使い方、キャッシュの更新の仕方、
削除の仕方を簡単に解説したいと思います。



■ApplicationCacheの使い方
ApplicationCacheを使うにはまず、マニフェストファイルを用意します。
次のような形式で書きます。

  CACHE MANIFEST
  # ↑必ずファイルの先頭に記述する
  # シャープで始まる行はコメント

  # CACHE:の下に書かれたファイルはキャッシュされる
  CACHE:
  index.html
  index.css
  images/img1.png
  images/img2.png
  images/img3.png

  # FALLBACK:の下に書かれたファイルは、オフラインの時に代わりに表示される
  # 右に指定されたファイルが自動でキャッシュされ、オフライン時に利用される
  FALLBACK:
  /online.html /offline.html

  # NETWORK:の下に書かれたファイルはキャッシュされず、
  # 必ず通信して取得される
  NETWORK:
  *

※中に記述するファイル名に空白等がある場合はURLエンコードする必要があるようです。
適当なファイル(ここではmanifest.appcacheとします)に保存したら、
HTMLファイルに次のように記述します。

  <html manifest="manifest.appcache"> ... </html>

こうすることで、ページを表示したときにマニフェストファイルを読み込ませることができます。
なお、マニフェストファイルは
必ず「text/cache-manifest」というMIMEタイプで送らなければいけません。
Apacheであれば、httpd.confファイルや.htaccessファイルに

  AddType text/cache-manifest .appcache

と追記する必要があります。

これでApplicationCacheを使用する準備は整いました。
実際に試してみれば、きっちりとキャッシュされていることが
開発者ツールなどで確認できると思います。


■ApplicationCacheの更新方法
キャッシュされたファイルは次のいずれかの方法で更新することができます。

  1.マニフェストファイルを修正する
  2.JavaScriptから更新する

マニフェストファイルの中身を修正することで、自動的にキャッシュが更新されます。
コメント内容の修正でもキャッシュが更新されるため、
日付等をコメントとして書いておくと良いかもしれません。
ただし、マニフェストファイルの修正後は2度ページを更新するまで修正内容が反映されません。
これは、1度目のページ更新でキャッシュファイルを更新し、
2度目のページ更新で修正内容を反映するためです。

なお、キャッシュ対象のファイルを更新しても、
マニフェストファイルを修正しない限りページは一切更新されないので注意が必要です。


■JavaScriptからApplicationCacheを操作する
ApplicationCacheはJavaScriptから操作することができます。
具体的にどんなことができるかというと、次の通りです。

  1.ApplicationCacheの状態確認
  2.ApplicationCacheの手動更新

それぞれ簡単に説明します。

●1.ApplicationCacheの状態確認
次のようにすることでApplicationCacheが現在どのような状態かを確認できます。

  switch(applicationCache.status) {
    case UNCACHED:
      // ApplicationCacheを使用していない
      break;
    case IDLE:
      // 何も処理をしていない
      break;
    case CHECKING:
      // 更新確認中
      break;
    case DOWNLOADING:
      // 更新ファイルのダウンロード中
      break;
    case UPDATEREADY:
      // 更新待機中
      break;
    case OBSOLETE:
      // マニフェストファイルにアクセスできないためキャッシュを削除した
      break;
  }

●2.ApplicationCacheの手動更新
次のように記述することで、更新が必要なときに手動でキャッシュを更新することができます。
あくまでキャッシュが更新されるのみで、
ページ内容はリロードするまで更新されないことに注意してください。

  // キャッシュが更新可能になったら呼ばれる関数
  applicationCache.onupdateready = function() {
    // キャッシュを更新する
    applicationCache.swapCache();

    // 必要に応じてページを更新する
    // location.reload();
  }
  // キャッシュの更新確認
  applicationCache.update();

画像などであれば、キャッシュ更新後に個別にリロード処理を実行することで、
ページをリロードしなくとも動的に更新することもできます。
工夫すれば、JavaScriptやCSSファイルもリロードできるかもしれません。

  applicationCache.onupdateready = function() {
    applicationCache.swapCache();

    // 画像をリロード
    var img = document.getElementById("image");
    img.src = img.src + "?preventCache=" + Math.random();
  }
  applicationCache.update();


■ApplicationCacheを削除する
次のいずれかでキャッシュされたファイルを削除することができます。

  1.ブラウザのキャッシュを削除する
  2.マニフェストファイルを削除・リネームする



ApplicationCacheを利用することで、
オフラインでもWebページが表示可能になるほか、Webサーバーの負荷軽減にも役立ちます。
しかし、キャッシュポイズニング攻撃を受けた場合などは非常に危険な状態となります。
そういったことも考慮してうまく活用できれば、より速いWebページが実現できそうですね。


次回はHTML5から少しはなれて、HTTP2のサーバプッシュとApplicationCacheに関わる「ServiceWorker」について解説する予定です。


monipet
  動物病院の犬猫の見守りをサポート
  病院を離れる夜間でも安心

ASSE/CORPA
  センサー、IoT、ビッグデータを活用して新たな価値を創造
  「できたらいいな」を「できる」に

OSGi対応 ECHONET Lite ミドルウェア
  短納期HEMS開発をサポート!

GuruPlug
  カードサイズ スマートサーバ

株式会社ジェイエスピー
  横浜に拠点を置くソフトウェア開発・システム開発・
  製品開発(monipet)、それに農業も手がけるIT企業