Slideshareに「Chrome Packaged Apps」なんて資料を上げちゃった訳ですけど、、、その経緯などを書いてみます。

まず、Chrome Packaged Appsって何??ってところです。

ど〜ん!!これです http://developer.chrome.com/trunk/apps/about_apps.html

Google I/O 2012でアナウンスされ、Chromium Blogで 2012/08/09 に正式に告知されったぽいです。( http://goo.gl/R1yVp ) 簡単にいうと「Chrome Packaged AppsとはWebAppsをNative Appsのように見せることができちゃう&WebAppsでは使えないRawSocketを送受信できたり、BluetoothとかのデバイスにアクセスできるAPIが用意されたPlatform(?)」という感じです。個人的にはLaunch当初にちょっとお触りしたきり、気になりつつも放置しちゃっていました。

が、1月末に仕事(NAMM Show)でアメリカに行った際、Chromebookを購入してみて、「なるほどChrome Packaged AppsはChromeOS(WebOS)上でのNativeAppsか!」と気がつき(今更。。。)「やっぱりおもしろいじゃん。」ということで現状をまとめた、結果がこの(あの?)資料▼だということになります。特に勉強会等で発表をした訳ではありませんf(^-^;)

Chrome Packaged Apps from Ryoya Kawai

Chrome Packaged Appsは基本WebAppsですので、その言語はHTML、JavaScript、CSSなので「開発言語はHTML5です!」と言えますね。資料の中でも書いてますが、一度の覚えてしまえばNativeApps的なものまで書けちゃうHTML5。NTTコミュニケーションズさん主催のWeb of Things カンファレンスにお邪魔させていただいたときに株式会社ニューフォリア 取締役 最高技術責任者 の 羽田野氏 が「HTML5の最大の魅力は言語を複数勉強する必要がないんですよ」とおっしゃっていてものすごく納得し、「Build Once, Run Everywhere」という夢のような言葉に対抗するこんな言葉を思いつきました。

「Learn Once, Build Everywhere」

そのままですが「一度学習(Learn)したら、どこでもアプリを作れます(Build)よ」という意味で、自分ではかなりお気に入りの言葉ですf(^-^;) ちょっと言い過ぎですかね。

ということで、何が言いたかったのかよくわからないPOSTになってしまいましたが、今回はこのへんで。

12月5日にもレビューしましたが、アップデートされていますので再度レビューします。
仕様はここを参照しています。(hogeは前回のレビューからの変更点です。漏れがあったらごめんなさい><)

最初に全体的な構成です。
(i)がinterface、(m)がmethodを示しています。また「->」の意味ですが、例えば「A -> return B」だとすると「Aを実行すると戻り値としてBがくる」という意味で使っています。

(i)Navigator
   (m)requestMIDIAccess -> return void;
  (i)MIDIAccess
   (m)getInputs -> return sequence<(i)MIDIPort>
   (m)getOutputs -> return sequence<(i)MIDIPort>
   (m)getInput -> return (i)MIDIInput
   (m)getOutput -> return (i)MIDIOutput
  (i)MIDIPort
  (i)MIDIInput
  (i)MIDIOutput
   (m)send -> return void
  (i)MIDIEvent

次に(i)のついているinterfaceを説明します。

Navigator
    interface Navigator {
      void requestMIDIAccess(successCallback, optional errorCallback)
    }
  MIDIAccess
    (UserAgentに接続されているMIDI機器のリストアップ、またアクセスを可能にします)
    interface MIDIAccess {
      sequence<MIDIPort> getInputs();
      sequence<MIDIPort> getOutputs();
      MIDIInput          getInput(MIDIPort or DOMString or short target);
      MIDIOutput         getOutput(MIDIPort or DOMString or short target);
    }
  MIDIPort
     (MIDIのInput/Outputポートで、名前、製造会社、MIDIポートのタイプ(input/output)、ユニークIDを提供します)
    interface MIDIPort {
      DOMString    id;
      DOMString?   manufacturer;
      DOMString?   name;
      MIDIPortType type; // input or output
      DOMString?   version;
    }
  MIDIInput
     (onmessageはMIDIメッセージを取得した時のEventHandlerを定義します)
    interface MIDIInput : MIDIPort {
      attribute EventHandler onmessage;
    }
  MIDIOutput
    (MIDIPortに組み込まれていて、またMIDIメッセージをOutputポートへ送信するメソッドを提供します)
    interface MIDIOutput {
      void send(sequence<octet> data, optional double timestamp);
    }
    (※octetとはココで定義されている通りで「[0, 255]の値をとる符号なしInteger」です)
    (※SysExのような長いMIDIデータを効率的に渡す手段としてUint8Arrayも使用可能です)
  MIDIEvent
       MIDIInputのonmessage handlerに渡されたEventオブジェクトで、
       MIDI data byteに加えてtimestampも含まれています。
    interface MIDIEvent: Event {
      attribute double      receivedTime;
      attribute Uint8Array  data;
    }
    (※Uint8ArrayのdataにはMIDIメッセージが1つずつ入ってきます)

最後に(m)のついているmethodの説明です。

  requestMIDIAccess(successCallback, optional errorCallback)
        (ユーザーシステムにあるMIDI機器のリスト、アクセスを取得します)
        successCallback: MIDI機器が取得できた場合のCallback
        errorCallback: なんらかの理由でMIDI機器を取得できなった場合のCallback
  getInputs()
        引数なし
        利用可能なMIDI input port[(i)MIDIInput]のリストを配列で返す
  getOutputs()
        引数なし
        利用可能なMIDI output port[(i)MIDIOutput]のリストを配列で返す
  getInput(target)
        target: (i)MIDIPort、または、(i)MIDIPortのid[DOMString]、
                         または、 getInputs()で取得したindex[short]
  getOutput(target)
        target: (i)MIDIPort、または、(i)MIDIPortのid[DOMString]、
                          または、getOutputs()で取得したindex[short]
  send(sequence<octet> data, optional double timestamp)
        data: sequence<octet> 
        timestamp: double

といった仕様になっています。

前回のレビューとの差分をリストアップすると以下の通りです。

Method名の変更

  • getMIDIAccess() → requestMIDIAccess()
  • enumerate{Inputs, Outputs}() → get{Inputs, Outputs}()

Attribute名の変更

  • (i)MIDIPort: fingerprint → Id

型の変更

  • data(@(i)MIDIOutput)): Uint8Array → sequence
  • timestamp: DOMHighResTimeStamp → double (millisec order)
  • onmessage(@(i)MIDIInput): callback → EventHandler

以下のようなOpen Issueもありますので、今後も仕様の更新は続くはずです。

AnaheimでやってるNAMM(楽器のトレードショー)を訪問中です。

1日中歩き回ってセミナーみたいのを聞いて楽しく疲れる事ができました!!(時差ボケの為(?)セミナー中寝てしまいましたが。。。)午前中はメインミッションにいい場所を探し回りました。

さて昨晩は以前短期間お世話になった現地法人に勤めるベトナム系アメリカ人の友人に現地ベトナム系の人しか行かないだろう的なノリ、そしてレストランの中はやっぱりベトナム系なお客さんばっかりだったベトナムレストランに連れて行ってもらいました。すっごく美味しかった!!(写真 左:生春巻き、右:ブンチャ(Bun Cha))
場所を聞いておかないとアカンな。

毎年1月に楽器のトレードショー(通称:NAMM )が通例だとAnaheimで行われます。数年前はCESとNAMMに行かせていただくというとってもありがたい海外出張をさせていただいて以来のNAMM出張に来ています。今年も場所はAnaheim, Californiaです。

さて、特にアメリカだと歩いて行けるコンビニ的なところがホテルの近くになかったりして、時間に制約があるのに朝ご飯で時間を取られてしまう事が多いと思うのですが、僕はいつも「サンドイッチ(野菜なし)」を朝ご飯に食べられるように用意しています。
今回もホテルの近くにあるスーパーマーケットを事前に調査しておいて、ホテルに到着して一息入れたらすぐにスーパーマーケット(今回はWalmartでも食料品だけ売ってるWalmart Neighborhood Market)に行って材料を買ってきました。距離は1.5kmくらいでそこそこ近かったです。

これで朝ご飯はスピーディで、美味しく食べられます。パンにマヨネーズ、マスタード、ハム、チーズだけを挟むだけなんですが、おいしいんですよ。ポイントはパンと持参したマヨネーズ。アメリカだと日本のサイズの70%くらいのパンが売っていて、これがチーズの大きさにぴったりなんです。日本で感じられる「えっ、まだチーズに達してないじゃん」的な経験はすることがないのです。
ということでまた機会がありましたら、お試しくださーい!

ちなみに現地のスーパーに行くとこんなのが見られてなかなか楽しいです!!日本ではなかなかお目にかかれない感じですよね。
バレンタインデーだと思われるピンクのクッキー↓

新年あけましておめでとうございます! 2013年のお正月は天気がよく、よい一年になりそうな気がしています。

どちらかというと、レシピのメモ的なPOSTになりますが、、、
スタ丼が食べたくなって、ちょうど豚肉があったのでお昼ご飯に作りました。
レシピはこちらを参考にしましたよっと!
写真を撮るのも忘れる程、うまかった!ということで写真はサンプルです。。。


それでは2013年もよろしくお願いします!!