趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • ESP8266にWebSocketを喋らせてみる

    投稿日 2015年 7月 29日 コメントはありません

    世の中、同じようなことを考える方はいるようで、すでにESP8266+ArduinoIDEでWebSocketライブラリが存在しています。WebSocketが扱えるようになれば、(プログラミングスキルがあれば)クラウド側から好きなタイミングでESP8266に指示をおくることができるようになるはずです。(が、世の中そんなに甘くないんですねぇ〜)

    で、今回見つけたWebSocketライブラリは ESP8266-Websocket です。

    今回の記事はこれのサンプルを動かしてみよう、と苦戦した記録です。作業PCのOSはUbuntu14.10 LTS 64bit、ArduinoIDEのバージョンは1.6.5です。なお、Ubuntuで動かすにあたっては、

    $ sudo addgroup foobar dialout
    ユーザー `foobar' をグループ `dialout' に追加しています...
    ユーザ foobar をグループ dialout に追加
    完了。
    $

    として、/dev/ttyUSB0のアクセス権をユーザーにつけた後、再ログインしないと/dev/ttyUSB0へアクセスできないとしてエラーになります。

    Arduinoのライブラリは ~/Arduino/librariesの下に置けばいいようですので、そこにgitでライブラリを引っ張ってきます。

    ~$ cd ~/Arduino/libraries
    ~/Arduino/libraries$ git clone https://github.com/morrissinger/ESP8266-Websocket
    Cloning into 'ESP8266-Websocket'...
    remote: Counting objects: 286, done.
    remote: Total 286 (delta 0), reused 0 (delta 0), pack-reused 286
    Receiving objects: 100% (286/286), 105.19 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (103/103), done.
    Checking connectivity... done.
    ~/Arduino/libraries$ 
    

    その後、ArduinoIDEで「スケッチ」→「Include Library」→「Manage Libraries」で右上の「Filter your search」で「ESP8266-Websocket」と入力して「INSTALLED」になっていることを確認します。

    scrn1

    次に、WebSocketClientのデモを動かしてみます。

    「ファイル」→「スケッチの例」→「ESP8266-Websocket」→「WebSocketClient_Demo」を選択します。

    scren2

    ソースの冒頭の

    const char* ssid     = "SSID HERE";
    const char* password = "PASSWORD HERE";

    の部分に自分の無線LANのESSIDとパスキーを入力してから、名前を付けて保存します。

    このライブラリはおそらくWindows環境で作成されたのでしょう。Linux環境でビルドしようとすると、ファイル名の大文字小文字で失敗します。そのため、ライブラリの中の以下の部分を修正します。

    WebSocketClient.h と WebSocketServer.h の

    #include "String.h"

    #include "string.h"

    に、

    WebSocketServer.cpp と WebSocketClient.cppの

    #include "base64.h"

    #include "Base64.h"

    とします。

    これでビルドが通るようになりましたが、それでもコネクションに失敗します。禁断のgoto文で接続しに行く部分のみを繰り返すと、何回目か以降は通るようです。ライブラリのWebSocketClient.cppの冒頭にデバッグのための#define文があるので、ここをコメントを外すとデバッグメッセージが出るのですが、これでもハンドシェークの途中で止まっていることはわかるものの、それ以上はなんともわかりません。
    これ以上は間にLANアナライザを入れてみてパケット解析しつつ、RFCを読んで何かおかしいのか調べるしかなさそうです。

    以下は、現時点でのサンプルプログラムを改造したものです。

    #include <ESP8266WiFi.h>
    #include <WebSocketClient.h>
    
    const char* ssid     = "xxxxxxxxxxxxxxxx";
    const char* password = "xxxxxxxxxxxxxxxx";
    char path[] = "/";
    char host[] = "echo.websocket.org";
      
    WebSocketClient webSocketClient;
    
    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    
    void setup() {
      Serial.begin(115200);
      delay(10);
    
      // We start by connecting to a WiFi network
    
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      
      WiFi.begin(ssid, password);
      
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");  
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    
      delay(5000);
      
    RETRY:
      // Connect to the websocket server
      IPAddress remote_addr;
      if(!WiFi.hostByName(host,remote_addr)){
        Serial.println("Cannot resolve hostname");
        while(1){}
      } else {
        Serial.println("hostname resolved");
      }
      
      if (client.connect(remote_addr, 80)) {
        Serial.println("Connected");
      } else {
        Serial.println("Connection failed.");
        goto RETRY;
        while(1) {
          // Hang on failure
        }
      }
    
      // Handshake with the server
      webSocketClient.path = path;
      webSocketClient.host = host;
      if (webSocketClient.handshake(client)) {
        Serial.println("Handshake successful");
      } else {
        Serial.println("Handshake failed.");
        while(1) {
          // Hang on failure
        }  
      }
    
    }
    
    
    void loop() {
      String data;
    
      if (client.connected()) {
        
        webSocketClient.getData(data);
        if (data.length() > 0) {
          Serial.print("Received data: ");
          Serial.println(data);
        }
        
        // capture the value of analog 1, send it along
        pinMode(1, INPUT);
        data = String(analogRead(1));
        
        webSocketClient.sendData(data);
        
      } else {
        Serial.println("Client disconnected.");
        while (1) {
          // Hang on disconnect.
        }
      }
      
      // wait to fully let the client disconnect
      delay(3000);
      
    }

    WebSocketClient.cppをみると、サーバ側からのヘッダの解釈の実装がまだまだであることがわかります。ひとつの可能性として、どうやらここで止まっていそうです。もうひとつは、パケットの受信バッファの処理がどうも変な感じがします。

    いずれにせよ、このライブラリはまだそのままでは使えるものではなさそうな感じです。(ま、よくみると色々と制約があるよ、って書いてあるんですけどね)


  • WebSocketについてちょっと実験してみた

    投稿日 2015年 7月 28日 コメントはありません

    たまたまWebをさまよっていたら、WebSocketの話が目についたので調べてみた。まあ、HTTPに比べると、一旦リンクを張ってしまえばサーバ側からも通信ができるってのが美味しいところ。

    で、ブラウザがWebSocketをサポートしているか確認することができるサイトが

    http://www.websocket.org/echo.html

    なのですが、ここには自分でHTMLを書いて確認したい場合のためのコードが置いてあったりします。で、これを試してみると・・・テキストエディタに貼り付けたら1行になってしまいました(T_T)

    整形しなおしたものをここに置いておきます。

    <!DOCTYPE html> 
    <meta charset="utf-8" />
    <title>WebSocket Test</title>
    <script language="javascript" type="text/javascript">
      var wsUri = "ws://echo.websocket.org/";
      var output;
    
      function init() {
        output = document.getElementById("output"); testWebSocket();
      }
    
      function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function(evt) { onOpen(evt) };
        websocket.onclose = function(evt) { onClose(evt) };
        websocket.onmessage = function(evt) { onMessage(evt) };
        websocket.onerror = function(evt) { onError(evt) };
      }
    
      function onOpen(evt) {
        writeToScreen("CONNECTED");
        doSend("WebSocket rocks");
      }
    
      function onClose(evt) {
        writeToScreen("DISCONNECTED");
      }
    
      function onMessage(evt) {
        writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
        websocket.close();
      }
    
      function onError(evt) {
        writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
      }
    
      function doSend(message) {
        writeToScreen("SENT: " + message);
        websocket.send(message);
      }
    
      function writeToScreen(message) {
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
      }
    
      window.addEventListener("load", init, false);
    </script>
    <h2>WebSocket Test</h2>
    <div id="output"></div>
    

    これをコピペしたら今度は1行になるようなことはなかったです。

    そして、これをローカルで表示させたらこうなりました。

    で、ごにょごにょっとしたことを考えているので、自分の理解の範囲で動作を解釈してみます。(間違ってたら指摘いただけると幸いです)

    1. 動作は8行目から始まって、testWebSocket()が呼ばれる。
    2. 13行目のnewでwebsocketのインスタンスを生成。ここでソケットをオープンする。
    3. 14〜17行目はイベントハンドラ。ソケットをオープンすると、この中の14行目のonopenに設定したハンドラが呼ばれる。(先の13行目から呼ばれるところが変な感じがしますが、Javascriptのスコープの特性から14行目で定義している内容を13行目で使用可能なのですね)
    4. 20行目がonopenのイベントハンドラ。この中で、doSend()を呼んでその先でwebsocket.send()でデータを送信している。
    5. websocket.send()の結果、サーバ側からエコーバックが帰ってくる。
    6. エコーバックを受信すると、16行目で定義しているonmessageのハンドラが呼ばれるので、29行目のonMessage()が実行される。この中で、websocket.close()を呼んでコネクションをクローズ。
    7. クローズすると、15行目で定義しているoncloseに対応したハンドラが呼ばれる。

    比較的簡単に使えそうですね。
    ちょっとだけソケットの使い回しができることを確認してみました。

    ソースコードをちょっとだけ弄ります。

    <!DOCTYPE html> 
    <meta charset="utf-8" />
    <title>WebSocket Test</title>
    <script language="javascript" type="text/javascript">
      var wsUri = "ws://echo.websocket.org/";
      var output;
     
      var n = 10;
    
      function init() {
        output = document.getElementById("output"); testWebSocket();
      }
     
      function testWebSocket() {
        websocket = new WebSocket(wsUri);
        websocket.onopen = function(evt) { onOpen(evt) };
        websocket.onclose = function(evt) { onClose(evt) };
        websocket.onmessage = function(evt) { onMessage(evt) };
        websocket.onerror = function(evt) { onError(evt) };
      }
     
      function onOpen(evt) {
        writeToScreen("CONNECTED");
        doSend("WebSocket rocks START");
      }
     
      function onClose(evt) {
        writeToScreen("DISCONNECTED");
      }
     
      function onMessage(evt) {
        writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
        if( n > 0 ){
          doSend("WebSocket rocks " + n);
          n--;
        } else {
          websocket.close();
        }
      }
     
      function onError(evt) {
        writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
      }
     
      function doSend(message) {
        writeToScreen("SENT: " + message);
        websocket.send(message);
      }
     
      function writeToScreen(message) {
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
      }
     
      window.addEventListener("load", init, false);
    </script>
    <h2>WebSocket Test</h2>
    <div id="output"></div>

    変数nに初期値10を設定して、受信時の動作をnの値によって切り替えています。nが0より大きい場合には次のメッセージを送ってnをカウントダウン、nがゼロならソケットをクローズします。
    結果は、

    Screenshot_soc

    となりました。同じソケットを開いたまま11回のメッセージやりとりができていることがわかります。

    参考にさせていただいた/参考になりそうなサイト


  • Covia F4sのその後(とグアムでのプリペイドSIM事情)

    投稿日 2015年 7月 27日 コメントはありません

    Covia F4sを買った話は以前の記事に書きましたが、その後について気づいた点などを書いてみます。

    現在はCovia F4sの後継でフラッシュが4GBに、RAMが1MBに増量された(そして色も違う)F4s+が出ていて、実はこっちも持っています。黒が欲しかったのと、某アプリが512MBのRAMではバックグラウンド動作できないためです。
    バッテリ容量が小さいのが欠点ですが、手のひらに収まるサイズなのが非常によいところ。F4sの方はF4s+のバッテリ充電器兼いろいろ試してみる対象機になってます。で、お試し機に格下げ(格上げ?)なのでSMS無し版のヨドバシ480円SIMで動かしたりしています。

    で、今回、グアムに持っていった(モバイルルータを別途レンタルして使用)のですが、挙動が不審で、何をやってもすぐに再起動。バッテリ充電だけでも再起動。そしてそのうち、反応がなくなって、電池を外して入れなおさざるを得なくなる、という症状が出ました。(F4s+の方は問題なかったのですが・・)

    RAM周りのハードウェア異常かと思って、日本に帰国したら修理に出すしかないなぁ、と思っていたら、日本では全く異常がありません。F4sを所有されているかたは要注意かもしれません。

    現地SIMがあれば、SIMを入れ替えてどうなるか、とか、SIMを外したらどうなるか、というのも試してみればよかったのかもしれないのですが、日程の関係から今回は現地プリペイドSIMは購入せず。

    グアムでのプリペイドSIM事情

    ちなみに、グアムではマイクロネシアモール日本語のフロアガイドの2階の真ん中の吹き抜け左側のところ)と、グアムプレミアアウトレットに(店舗一覧。お店はこの地図のMの場所)ドコモパシフィックの店舗があります(今回=2015年7月確認)。どちらも有名なショッピングスポットなので簡単に行けるでしょう。ここでドコモパシフィック(NTTドコモとは別会社です)のSIMを買うことができると思います。(以前、一度アウトレットの方で買ったことがあります)

    ドコモパシフィックのプリペイドプランのページはここにあります。ここの記載をみると、プリペイド回線の残高チェック、プリペイド回線間の残高移動、クレジットカードでの残高チャージなどができるようです。また、プリペイドの料金プランはここにあります。SMS、ローカル通話、パケット使い放題3日間で8ドルのようです(が、SIMの価格は入ってないです)。で、10ドル分のプリペイドチャージ付きのSIMが19.95ドルのようです。(追加チャージ用のプリペイドカードは$20、$10、$5の3種類があるようです)

    なので、10ドルのチャージ付きのSIMカードを買って、『3日間ローカル通話・ローカルSMS・データ使い放題8ドルコース』か『5日間データ使い放題9ドルだけど、通話とSMSは有料』で使うかのどちらかでしょうね。設定はお店の人にやってもらうのがいいでしょう。


  • ESP8266からherokuにデータを送ってみる

    投稿日 2015年 7月 26日 コメントはありません

    これまでに node.js + herokuでHTTP GETコマンドを使って最低限のデータの出し入れができることを確認しました。つまりherokuで実用性はないとはいえ、サーバ側の構築ができるようになりました。ただ、セキュリティとか実用性とかそういうのは考えてないので、とにかく最低限ですし、そもそもデータベースを使っていないのでプログラムを再起動されると消えてしまいます。そしてそれは頻繁に起こります。なので、あくまで「ちゃんと作ればできることがわかる」というレベルです。

    次は、ESP8266からherokuにデータを送って、PCからそのデータを読み取れるか試してみます。簡単に済ますためにESP8266側は先に確認したようにArduino IDEで構築します。heroku側は先の「hello-heroku2」のままにします。

    Arduino側のスケッチはサンプルの「ESP8266WiFi」の下の「WiFiClient」を元にしています。一旦、WiFiClientを開いて、名前(今回は「HerokuClient」にしました)をつけて保存します。
    その後、ESSIDとWiFiのパスワードの設定、先の「hello-heroku2」に合わせたGETメソッドに合わせたURLの生成の部分を修正します。今回は、起動すると1から順にデータをheroku側にセットするだけとしました。

    修正後のソースは以下のようになりました。元のソースはdata.sparkfun.comのサービスにデータを送るようになっていたようですが、今回はそれを変更しています。(コメントは修正していませんので、そのままになっています。また、WiFiの設定関連は当然伏せてありますので、環境に合わせて修正が必要です。)

    /*
     *  This sketch sends data via HTTP GET requests to data.sparkfun.com service.
     *
     *  You need to get streamId and privateKey at data.sparkfun.com and paste them
     *  below. Or just customize this script to talk to other HTTP servers.
     *
     */
    
    #include <ESP8266WiFi.h>
    
    const char* ssid     = "xxxxxxxxxxxxxxxx";
    const char* password = "xxxxxxxxxxxxxxxxxxxx";
    
    const char* host = "whispering-basin-7319.herokuapp.com";
    int count = 1;
    
    void setup() {
      Serial.begin(115200);
      delay(10);
    
      // We start by connecting to a WiFi network
    
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
      
      WiFi.begin(ssid, password);
      
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");  
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    }
    
    int value = 0;
    
    void loop() {
      delay(5000);
      ++value;
    
      Serial.print("connecting to ");
      Serial.println(host);
      
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
      const int httpPort = 80;
      if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
      }
      
      // We now create a URI for the request
      String url = "/";
      url += "?DATA=";
      url += String(count++);
      
      Serial.print("Requesting URL: ");
      Serial.println(url);
      
      // This will send the request to the server
      client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" + 
                   "Connection: close\r\n\r\n");
      delay(10);
      
      // Read all the lines of the reply from server and print them to Serial
      while(client.available()){
        String line = client.readStringUntil('\r');
        Serial.print(line);
      }
      
      Serial.println();
      Serial.println("closing connection");
    }
    
    

    これで、ESP8266モジュール側をGPIO0をGNDに落とした状態でリセット解除することでブートローダ状態で待機させてから、ArduinoIDEで「マイコンボードに書き込む」とするとコンパイルと書き込みが行われてプログラムが走り出します。
    事前にシリアルモニタを起動しておくと、

    Screenshot--dev-ttyUSB0

    という感じでWiFiのアクセスポイントに接続し、その後herokuへDATAを1から順にセットしている様子が確認できます。(日本語が文字化けしてますが、まあいいでしょう)
    PC側からherokuにアクセスすると、

    Screenshot-Mozilla Firefox-13

    という感じで、ESP8266からセットしたデータを確認することができました。

    これでESP8266からherokuへのデータのアップロードと、ブラウザによるherokuにアップロードされたデータの確認ができたことになります。実用にするにはheroku側はデータベース使わないとね、とか、複数のESP8266に対応しないとね、とか、セキュリティ全く無いじゃん、とか、山ほど考慮するべきことがありますが、最低限遊べるレベルには到達したのではないでしょうか。

    heroku + node.js + ESP8266 + ArduinoIDEの組み合わせでIoT環境を試すレベルであれば簡単に構築できることがわかりました。もちろん、リソースをかければ本格的な環境にアップグレードすることもできると思います。あとはこの環境をどう使うか、ということですね〜。


  • Heroku+Node.jsでHelloWorldしてみた(4)

    投稿日 2015年 7月 26日 コメントはありません

    16. クライアントによって異なる動作をさせる

    GETメソッドのパラメータが扱えることがわかったので、これで区別させてみたいと思います。まずは適当な作業用のディレクトリを作ります。

    ~/heroku $ mkdir hello-heroku2
    ~/heroku $ cd hello-heroku2/
    
    

    次にソースコードを準備します。内容は下記の通りでhello2.jsという名前で保存します。

    var express = require("express");
    var app = express();
    var hold = undefined; 
    
    app.get('/', function(request, response) {
        console.log(request.query); // for logging
        var data = request.param('DATA');
    	if(data){
            hold = data;
    	    response.send('データを受け付けました<BR />'
                + '受信したデータは' + hold + 'です。<BR />');
        } else {
            if(hold){
                response.send(
                      '最後に受信したデータは' + hold + 'です。<BR />');
            } else {
                response.send(
                      'まだ受信したデータがありません<BR />');
            }
        }		
    })
    

    次に、package.jsonファイルを作成します。

    {
      "name": "hello-heroku2",
      "version": "0.0.1",
      "dependencies": {
        "express": "4.13.x"
      },
      "engines": {
        "node": "0.10.x",
        "npm": "1.4.x"
      }
    }
    

    これまでの例と名前の部分しか変わっていません。
    作成したら、npmで必要なパッケージをインストールします。

    ~/heroku/hello-heroku2 $ npm install
    
    

    次にProcfileを用意します。これはファイル名に合わせて修正します。

    web: node hello2.js
    
    

    ローカルでアプリを動かしてみます。

    ~/heroku/hello-heroku2 $ foreman start
    17:37:45 web.1  | started with pid 7322
    17:37:45 web.1  | Listening on 5000
    
    

    ブラウザで「http://localhost:5000/」にまだデータがない旨、表示されます。次に「http://localhost:5000/?DATA=100」としてアクセスした後、再度「http://localhost:5000/」にアクセスすると、セットした値(100)が表示されます。

    次にherokuの作成済みのリポジトリにデプロイしてみます。

    ~/heroku/hello-heroku2 $ git init
    Initialized empty Git repository in /home/xxx/heroku/hello-heroku2/.git/
    ~/heroku/hello-heroku2 $ heroku git:remote -a whispering-basin-7319
    set git remote heroku to https://git.heroku.com/whispering-basin-7319.git
    ~/heroku/hello-heroku2 $ git add .
    ~/heroku/hello-heroku2 $ git commit -am "1st edtion"
    [master (root-commit) be8f876] 1st edtion
     (途中略)
     create mode 100644 package.json
    ~/heroku/hello-heroku2 $ git push heroku master
    Counting objects: 300, done.
     (途中略)
    To https://git.heroku.com/whispering-basin-7319.git
     * [new branch]      master -> master
    ~/heroku/hello-heroku2 $ 
    

    「$ heroku open」として、動作確認してみます。

    Screenshot-Mozilla Firefox-10

    起動した直後なのでデータがない状態です。
    次に、URLを「https://whispering-basin-7319.herokuapp.com/?DATA=12345」としてみます。

    Screenshot-Mozilla Firefox-11

    データが設定できました。URLを元に戻してリロードし、記憶しているか確認してみます。

    Screenshot-Mozilla Firefox-12

    データがherokuのサーバ側に記憶されていることが確認できました。

     


  • heroku+node.jsでHello Worldしてみた(3)

    投稿日 2015年 7月 25日 コメントはありません

    さらに続きです。

    14.変数の扱いを見てみる

    プログラムを以下のように修正してみました。

    var express = require("express");
    var app = express();
    //app.use(express.logger());
    var count = 1;
    
    app.get('/', function(request, response) {
    	response.send('Hello wonderful Heroku world! <BR />'
          + 'あなたのアクセスは' + count + '回目です');
        count++;
    })
    
    var port = process.env.PORT || 5000;
    app.listen(port, function() {
    	console.log("Listening on " + port);
    });
    

    ローカルで実行してみます。

    ~/heroku/hello-heroku $ foreman start
    14:09:38 web.1 | started with pid 5102
    14:09:38 web.1 | Listening on 5000

    リロードするたびに数値が増えます。

    Screenshot-Mozilla Firefox-3

    次に、デプロイしてみます。

    ~/heroku/hello-heroku $ git add .
    ~/heroku/hello-heroku $ git commit -m "counter edition"
    [master 925a6e3] counter edition
     1 file changed, 4 insertions(+), 1 deletion(-)
    ~/heroku/hello-heroku $ git push heroku master
    Counting objects: 5, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (3/3), 378 bytes | 0 bytes/s, done.
    Total 3 (delta 2), reused 0 (delta 0)
    remote: Compressing source files... done.
    remote: Building source:
    (途中略)
    remote: -----> Discovering process types
    remote:        Procfile declares types -> web
    remote: 
    remote: -----> Compressing... done, 6.1MB
    remote: -----> Launching... done, v5
    remote:        https://whispering-lake-8767.herokuapp.com/ deployed to Heroku
    remote: 
    remote: Verifying deploy.... done.
    To https://git.heroku.com/whispering-lake-8767.git
       760e08d..925a6e3  master -> master
    ~/heroku/hello-heroku $ heroku open
    Opening whispering-lake-8767... done

     

    ブラウザが開いたのでリロードしてみます。

    Screenshot-Mozilla Firefox-4

    やはりリロードするたびにカウンタが増えます。しばらくは実行環境が維持されるようです。確か、何時間かで実行環境が消える(表現が適切ではないかも)と書いてあったので永続的な値はデータベースに頼るべきなのでしょうが、実験レベルであれば変数でもいいのかもしれません。

    15.GETメソッドのパラメータ渡しをみてみる

    hello.jsを以下のように改変。
    ここの記事を参考にさせてもらいました。request.param(パラメータ名)で容易に取得できるようです。他にもExpressの使い方でいろいろ参考になる記載がたくさんありますので、後でじっくり読ませてもらいたいと思います。

    var express = require("express");
    var app = express();
    //app.use(express.logger());
    var count = 1;
    
    app.get('/', function(request, response) {
        console.log(request.query); // for logging
        var username = request.param('username');
    	response.send('Hello wonderful Heroku world! <BR />'
          + 'あなたのアクセスは' + count + '回目です<BR />'
          + username );
        count++;
    })
    
    var port = process.env.PORT || 5000;
    app.listen(port, function() {
    	console.log("Listening on " + port);
    });
    

     

    ローカルでテスト。

    ~/heroku/hello-heroku $ foreman start
    15:28:14 web.1  | started with pid 6050
    15:28:14 web.1  | Listening on 5000
    15:30:08 web.1  | {}
    15:30:08 web.1  | Thu, 23 Jul 2015 06:30:08 GMT express deprecated req.param(name): Use req.params, req.body, or req.query instead at hello.js:8:28
    15:30:57 web.1  | { username: 'tomono' }
    15:31:39 web.1  | { username: 'ともの' }
    

     

    1回目はパラメータなし、2回目以降はパラメータ付きでテストしました。下記は2回目、3回目のスクリーンショットです。

    Screenshot-Mozilla Firefox-5

    Screenshot-Mozilla Firefox-6

     

    日本語(Unicodeでしょう)も大丈夫な感じですね。
    herokuにデプロイして試してみます。

    ~/heroku/hello-heroku $ git add .
    ~/heroku/hello-heroku $ git commit -m "parameter test edtion"
    [master 043fb81] parameter test edtion
     1 file changed, 4 insertions(+), 1 deletion(-)
    ~/heroku/hello-heroku $ git push heroku master
    Counting objects: 5, done.
      (途中略)
    To https://git.heroku.com/whispering-lake-8767.git
       925a6e3..043fb81  master -> master
    ~/heroku/hello-heroku $ heroku open
    Opening whispering-lake-8767... done

     

    アクセスして試してみます。

    Screenshot-Mozilla Firefox-7

    Screenshot-Mozilla Firefox-8

    Screenshot-Mozilla Firefox-9

    無事にローカルと同様に動作しました。GETメソッドでのパラメータ渡しも簡単にできそうです。


  • heroku+node.jsでHello Worldしてみた(2)

    投稿日 2015年 7月 25日 コメントはありません

    続きです。

    6.Dashboardから新規アプリ作成

    ここで、herokuのDashboardを見ると、作成したサンプルアプリが見えています。今回の場合、mysterious-river-xxxxが作成したサンプルアプリです。

    screen-1003

    また、右上の「+」が新規アプリ作成に使用するボタンのようです。

    「+」を押すと新規アプリケーションの名前を聞いてきます。ただ、optionalなので、そのまま「Create App」してみます。

    Screenshot-1004

     

    whispering-lake-8767」という名前のアプリになったようです。続けてやるべきことが記載されています。これに沿って、アプリケーションのリポジトリを作成してみます。

    ~/heroku $ mkdir hello-heroku
    ~/heroku $ cd hello-heroku/
    ~/heroku/hello-heroku $ git init
    Initialized empty Git repository in /home/xxx/heroku/hello-heroku/.git/
    ~/heroku/hello-heroku $ heroku login
    Enter your Heroku credentials.
    Email: xxxxxxxxxx@xxxxx.xxx
    Password (typing will be hidden): 
    Authentication successful.
    ~/heroku/hello-heroku $ heroku git:remote -a whispering-lake-8767
    Installing Heroku Toolbelt v4... done
    Installing plugin heroku-git... done
    set git remote heroku to https://git.heroku.com/whispering-lake-8767.git
    ~/heroku/hello-heroku $

    として、アプリケーションのリポジトリを作りました。

    7. Node.jsでアプリケーションを作成

    以下の内容のサンプルアプリを作ってみました。内容は参考にさせていただいたこちらのサイトそのままです。ファイル名はhello.jsとしました。

    var express = require("express");
    var app = express();
    app.use(express.logger());
    
    app.get('/', function(request, response) {
    	response.send('Hello Heroku world!');
    })
    
    var port = process.env.PORT || 5000;
    app.listen(port, function() {
    	console.log("Listening on " + port);
    });

    8. package.jsonファイルを作成

    次に、packages.jsonファイルを作成します。

    ~/heroku/hello-heroku $ npm init
    This utility will walk you through creating a package.json file.
    It only covers the most common items, and tries to guess sane defaults.
    
    See `npm help json` for definitive documentation on these fields
    and exactly what they do.
    
    Use `npm install <pkg> --save` afterwards to install a package and
    save it as a dependency in the package.json file.
    
    Press ^C at any time to quit.
    name: (hello-heroku) 
    version: (1.0.0) 0.0.1
    description: Study for heroku and node.js
    entry point: (hello.js) 
    test command: 
    git repository: https://git.heroku.com/whispering-lake-8767.git
    keywords: Hello World
    author: 
    license: (ISC) 
    About to write to /home/tom/heroku/hello-heroku/package.json:
    
    {
      "name": "hello-heroku",
      "version": "0.0.1",
      "description": "Study for heroku and node.js",
      "main": "hello.js",
      "scripts": {
        "test": "echo \"Error: no test specified\" && exit 1"
      },
      "repository": {
        "type": "git",
        "url": "https://git.heroku.com/whispering-lake-8767.git"
      },
      "keywords": [
        "Hello",
        "World"
      ],
      "author": "",
      "license": "ISC"
    }
    
    
    Is this ok? (yes) 
    ~/heroku/hello-heroku $

     

    これで packages.jsonファイルが作成されました。
    ・・・が、(予想通りですが)依存関係などは手動で追加のようです。

    各パッケージのバージョンを調べます。

    ~/heroku/hello-heroku $ node -v
    v0.10.37
    ~/heroku/hello-heroku $ npm --version
    1.4.28
    ~/heroku/hello-heroku $ npm view express version
    4.13.1
    ~/heroku/hello-heroku $

    ということで、packages.jsonファイルを修正します。

    {
      "name": "hello-heroku",
      "version": "0.0.1",
      "dependencies": {
        "express": "4.13.x"
      },
      "engines": {
        "node": "0.10.x",
        "npm": "1.4.x"
      }
    }

    9. npmで必要なパッケージをインストール

    npmで必要になるパッケージをインストールします。

    ~/heroku/hello-heroku $ npm install
    npm WARN package.json hello-heroku@0.0.1 No description
    npm WARN package.json hello-heroku@0.0.1 No repository field.
    npm WARN package.json hello-heroku@0.0.1 No README data
    express@4.13.1 node_modules/express
    ├── escape-html@1.0.2
    ├── merge-descriptors@1.0.0
    ├── cookie@0.1.3
    ├── path-to-regexp@0.1.6
    ├── utils-merge@1.0.0
    ├── cookie-signature@1.0.6
    ├── methods@1.1.1
    ├── fresh@0.3.0
    ├── range-parser@1.0.2
    ├── array-flatten@1.1.0
    ├── vary@1.0.1
    ├── etag@1.7.0
    ├── content-type@1.0.1
    ├── parseurl@1.3.0
    ├── serve-static@1.10.0
    ├── content-disposition@0.5.0
    ├── depd@1.0.1
    ├── on-finished@2.3.0 (ee-first@1.1.1)
    ├── finalhandler@0.4.0 (unpipe@1.0.0)
    ├── qs@4.0.0
    ├── debug@2.2.0 (ms@0.7.1)
    ├── proxy-addr@1.0.8 (forwarded@0.1.0, ipaddr.js@1.0.1)
    ├── send@0.13.0 (destroy@1.0.3, statuses@1.2.1, ms@0.7.1, mime@1.3.4, http-errors@1.3.1)
    ├── type-is@1.6.5 (media-typer@0.3.0, mime-types@2.1.3)
    └── accepts@1.2.11 (negotiator@0.5.3, mime-types@2.1.3)
    ~/heroku/hello-heroku $

    10. Procfileの作成

    Procfileを作成してプロセスタイプを宣言します。

    web: node hello.js
    

    ここまでで以下のファイルが準備できました。

    ~/heroku/hello-heroku $ ls -la
    合計 28
    drwxr-xr-x 4 xxx xxx 4096  7月 23 13:06 .
    drwxr-xr-x 4 xxx xxx 4096  7月 23 12:28 ..
    drwxr-xr-x 7 xxx xxx 4096  7月 23 12:29 .git
    -rw-r--r-- 1 xxx xxx   20  7月 23 13:06 Procfile
    -rw-r--r-- 1 xxx xxx  280  7月 23 12:36 hello.js
    drwxr-xr-x 3 xxx xxx 4096  7月 23 12:50 node_modules
    -rw-r--r-- 1 xxx xxx  162  7月 23 12:49 package.json
    ~/heroku/hello-heroku $

    11. ローカルからアプリを動かしてみる。

    ローカルからアプリを動かしてみると・・・

    ~/heroku/hello-heroku $ foreman start
    13:08:41 web.1  | started with pid 3965
    13:08:41 web.1  | 
    13:08:41 web.1  | Error: Most middleware (like logger) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
    13:08:41 web.1  |     at Function.Object.defineProperty.get (/home/xxx/heroku/hello-heroku/node_modules/express/lib/express.js:99:13)
    13:08:41 web.1  |     at Object.<anonymous> (/home/xxx/heroku/hello-heroku/hello.js:3:17)
    13:08:41 web.1  |     at Module._compile (module.js:456:26)
    13:08:41 web.1  |     at Object.Module._extensions..js (module.js:474:10)
    13:08:41 web.1  |     at Module.load (module.js:356:32)
    13:08:41 web.1  |     at Function.Module._load (module.js:312:12)
    13:08:41 web.1  | exited with code 8
    13:08:41 web.1  |     at Function.Module.runMain (module.js:497:10)
    13:08:41 system | sending SIGTERM to all processes
    13:08:41        |     at startup (node.js:119:16)
    13:08:41        |     at node.js:935:3
    ~/heroku/hello-heroku $

    となってエラーになってしまいました。
    読んでみると、「たいていのミドルウェア(loggerのようなもの)はExpressにはもはやバンドルされてないので個別にインストールしなきゃダメよ。https://github.com/senchalabs/connect#middleware を見てね。」だそうです。

    が、リンク先を見ても特にloggerに関する記載はないので、ソースコードを

    var express = require("express");
    var app = express();
    //app.use(express.logger());
    
    app.get('/', function(request, response) {
    	response.send('Hello Heroku world!');
    })
    
    var port = process.env.PORT || 5000;
    app.listen(port, function() {
    	console.log("Listening on " + port);
    });

     

    として、loggerをコメントアウトして使わないようにしてみました。
    すると、

    ~/heroku/hello-heroku $ foreman start
    13:18:58 web.1  | started with pid 4082
    13:18:58 web.1  | Listening on 5000
    
    

    となって、無事起動している模様。ブラウザで見てみると、

    Screenshot-Mozilla Firefox

    となり、無事に表示されました。

    12. herokuでアプリを動かす

    herokuで動かしてみます。ログが長いですが、後で見返すときのためにそのままで。

    ~/heroku/hello-heroku $ git init
    Reinitialized existing Git repository in /home/xxx/heroku/hello-heroku/.git/
    ~/heroku/hello-heroku $ git add .
    ~/heroku/hello-heroku $ git commit -m "1st edition"
    [master (root-commit) ca0b038] 1st edition
     258 files changed, 40123 insertions(+)
     create mode 100644 Procfile
     create mode 100644 hello.js
     create mode 100644 node_modules/express/History.md
     create mode 100644 node_modules/express/LICENSE
     create mode 100644 node_modules/express/Readme.md
     create mode 100644 node_modules/express/index.js
     create mode 100644 node_modules/express/lib/application.js
     create mode 100644 node_modules/express/lib/express.js
     create mode 100644 node_modules/express/lib/middleware/init.js
     create mode 100644 node_modules/express/lib/middleware/query.js
     create mode 100644 node_modules/express/lib/request.js
     create mode 100644 node_modules/express/lib/response.js
     create mode 100644 node_modules/express/lib/router/index.js
     create mode 100644 node_modules/express/lib/router/layer.js
     create mode 100644 node_modules/express/lib/router/route.js
     create mode 100644 node_modules/express/lib/utils.js
     create mode 100644 node_modules/express/lib/view.js
     create mode 100644 node_modules/express/node_modules/accepts/HISTORY.md
     create mode 100644 node_modules/express/node_modules/accepts/LICENSE
     create mode 100644 node_modules/express/node_modules/accepts/README.md
     create mode 100644 node_modules/express/node_modules/accepts/index.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/HISTORY.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/LICENSE
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/README.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/index.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/HISTORY.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/LICENSE
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/README.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/db.json
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/index.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db/package.json
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/mime-types/package.json
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/HISTORY.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/LICENSE
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/README.md
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/index.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/lib/charset.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/lib/encoding.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/lib/language.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/lib/mediaType.js
     create mode 100644 node_modules/express/node_modules/accepts/node_modules/negotiator/package.json
     create mode 100644 node_modules/express/node_modules/accepts/package.json
     create mode 100644 node_modules/express/node_modules/array-flatten/LICENSE
     create mode 100644 node_modules/express/node_modules/array-flatten/README.md
     create mode 100644 node_modules/express/node_modules/array-flatten/array-flatten.js
     create mode 100644 node_modules/express/node_modules/array-flatten/package.json
     create mode 100644 node_modules/express/node_modules/content-disposition/HISTORY.md
     create mode 100644 node_modules/express/node_modules/content-disposition/LICENSE
     create mode 100644 node_modules/express/node_modules/content-disposition/README.md
     create mode 100644 node_modules/express/node_modules/content-disposition/index.js
     create mode 100644 node_modules/express/node_modules/content-disposition/package.json
     create mode 100644 node_modules/express/node_modules/content-type/HISTORY.md
     create mode 100644 node_modules/express/node_modules/content-type/LICENSE
     create mode 100644 node_modules/express/node_modules/content-type/README.md
     create mode 100644 node_modules/express/node_modules/content-type/index.js
     create mode 100644 node_modules/express/node_modules/content-type/package.json
     create mode 100644 node_modules/express/node_modules/cookie-signature/.npmignore
     create mode 100644 node_modules/express/node_modules/cookie-signature/History.md
     create mode 100644 node_modules/express/node_modules/cookie-signature/Readme.md
     create mode 100644 node_modules/express/node_modules/cookie-signature/index.js
     create mode 100644 node_modules/express/node_modules/cookie-signature/package.json
     create mode 100644 node_modules/express/node_modules/cookie/LICENSE
     create mode 100644 node_modules/express/node_modules/cookie/README.md
     create mode 100644 node_modules/express/node_modules/cookie/index.js
     create mode 100644 node_modules/express/node_modules/cookie/package.json
     create mode 100644 node_modules/express/node_modules/debug/.jshintrc
     create mode 100644 node_modules/express/node_modules/debug/.npmignore
     create mode 100644 node_modules/express/node_modules/debug/History.md
     create mode 100644 node_modules/express/node_modules/debug/Makefile
     create mode 100644 node_modules/express/node_modules/debug/Readme.md
     create mode 100644 node_modules/express/node_modules/debug/bower.json
     create mode 100644 node_modules/express/node_modules/debug/browser.js
     create mode 100644 node_modules/express/node_modules/debug/component.json
     create mode 100644 node_modules/express/node_modules/debug/debug.js
     create mode 100644 node_modules/express/node_modules/debug/node.js
     create mode 100644 node_modules/express/node_modules/debug/node_modules/ms/.npmignore
     create mode 100644 node_modules/express/node_modules/debug/node_modules/ms/LICENSE
     create mode 100644 node_modules/express/node_modules/debug/node_modules/ms/README.md
     create mode 100644 node_modules/express/node_modules/debug/node_modules/ms/index.js
     create mode 100644 node_modules/express/node_modules/debug/node_modules/ms/package.json
     create mode 100644 node_modules/express/node_modules/debug/package.json
     create mode 100644 node_modules/express/node_modules/depd/History.md
     create mode 100644 node_modules/express/node_modules/depd/LICENSE
     create mode 100644 node_modules/express/node_modules/depd/Readme.md
     create mode 100644 node_modules/express/node_modules/depd/index.js
     create mode 100644 node_modules/express/node_modules/depd/lib/compat/buffer-concat.js
     create mode 100644 node_modules/express/node_modules/depd/lib/compat/callsite-tostring.js
     create mode 100644 node_modules/express/node_modules/depd/lib/compat/index.js
     create mode 100644 node_modules/express/node_modules/depd/package.json
     create mode 100644 node_modules/express/node_modules/escape-html/LICENSE
     create mode 100644 node_modules/express/node_modules/escape-html/Readme.md
     create mode 100644 node_modules/express/node_modules/escape-html/index.js
     create mode 100644 node_modules/express/node_modules/escape-html/package.json
     create mode 100644 node_modules/express/node_modules/etag/HISTORY.md
     create mode 100644 node_modules/express/node_modules/etag/LICENSE
     create mode 100644 node_modules/express/node_modules/etag/README.md
     create mode 100644 node_modules/express/node_modules/etag/index.js
     create mode 100644 node_modules/express/node_modules/etag/package.json
     create mode 100644 node_modules/express/node_modules/finalhandler/HISTORY.md
     create mode 100644 node_modules/express/node_modules/finalhandler/LICENSE
     create mode 100644 node_modules/express/node_modules/finalhandler/README.md
     create mode 100644 node_modules/express/node_modules/finalhandler/index.js
     create mode 100644 node_modules/express/node_modules/finalhandler/node_modules/unpipe/HISTORY.md
     create mode 100644 node_modules/express/node_modules/finalhandler/node_modules/unpipe/LICENSE
     create mode 100644 node_modules/express/node_modules/finalhandler/node_modules/unpipe/README.md
     create mode 100644 node_modules/express/node_modules/finalhandler/node_modules/unpipe/index.js
     create mode 100644 node_modules/express/node_modules/finalhandler/node_modules/unpipe/package.json
     create mode 100644 node_modules/express/node_modules/finalhandler/package.json
     create mode 100644 node_modules/express/node_modules/fresh/HISTORY.md
     create mode 100644 node_modules/express/node_modules/fresh/LICENSE
     create mode 100644 node_modules/express/node_modules/fresh/README.md
     create mode 100644 node_modules/express/node_modules/fresh/index.js
     create mode 100644 node_modules/express/node_modules/fresh/package.json
     create mode 100644 node_modules/express/node_modules/merge-descriptors/LICENSE
     create mode 100644 node_modules/express/node_modules/merge-descriptors/README.md
     create mode 100644 node_modules/express/node_modules/merge-descriptors/index.js
     create mode 100644 node_modules/express/node_modules/merge-descriptors/package.json
     create mode 100644 node_modules/express/node_modules/methods/HISTORY.md
     create mode 100644 node_modules/express/node_modules/methods/LICENSE
     create mode 100644 node_modules/express/node_modules/methods/README.md
     create mode 100644 node_modules/express/node_modules/methods/index.js
     create mode 100644 node_modules/express/node_modules/methods/package.json
     create mode 100644 node_modules/express/node_modules/on-finished/HISTORY.md
     create mode 100644 node_modules/express/node_modules/on-finished/LICENSE
     create mode 100644 node_modules/express/node_modules/on-finished/README.md
     create mode 100644 node_modules/express/node_modules/on-finished/index.js
     create mode 100644 node_modules/express/node_modules/on-finished/node_modules/ee-first/LICENSE
     create mode 100644 node_modules/express/node_modules/on-finished/node_modules/ee-first/README.md
     create mode 100644 node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js
     create mode 100644 node_modules/express/node_modules/on-finished/node_modules/ee-first/package.json
     create mode 100644 node_modules/express/node_modules/on-finished/package.json
     create mode 100644 node_modules/express/node_modules/parseurl/.npmignore
     create mode 100644 node_modules/express/node_modules/parseurl/HISTORY.md
     create mode 100644 node_modules/express/node_modules/parseurl/LICENSE
     create mode 100644 node_modules/express/node_modules/parseurl/README.md
     create mode 100644 node_modules/express/node_modules/parseurl/index.js
     create mode 100644 node_modules/express/node_modules/parseurl/package.json
     create mode 100644 node_modules/express/node_modules/path-to-regexp/LICENSE
     create mode 100644 node_modules/express/node_modules/path-to-regexp/Readme.md
     create mode 100644 node_modules/express/node_modules/path-to-regexp/index.js
     create mode 100644 node_modules/express/node_modules/path-to-regexp/package.json
     create mode 100644 node_modules/express/node_modules/proxy-addr/HISTORY.md
     create mode 100644 node_modules/express/node_modules/proxy-addr/LICENSE
     create mode 100644 node_modules/express/node_modules/proxy-addr/README.md
     create mode 100644 node_modules/express/node_modules/proxy-addr/index.js
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/forwarded/HISTORY.md
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/forwarded/LICENSE
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/forwarded/README.md
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/forwarded/index.js
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/forwarded/package.json
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/.npmignore
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/Cakefile
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/LICENSE
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/README.md
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/ipaddr.min.js
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/lib/ipaddr.js
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/package.json
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/src/ipaddr.coffee
     create mode 100644 node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js/test/ipaddr.test.coffee
     create mode 100644 node_modules/express/node_modules/proxy-addr/package.json
     create mode 100644 node_modules/express/node_modules/qs/.eslintignore
     create mode 100644 node_modules/express/node_modules/qs/.npmignore
     create mode 100644 node_modules/express/node_modules/qs/.travis.yml
     create mode 100644 node_modules/express/node_modules/qs/CHANGELOG.md
     create mode 100644 node_modules/express/node_modules/qs/CONTRIBUTING.md
     create mode 100644 node_modules/express/node_modules/qs/LICENSE
     create mode 100644 node_modules/express/node_modules/qs/README.md
     create mode 100644 node_modules/express/node_modules/qs/bower.json
     create mode 100644 node_modules/express/node_modules/qs/lib/index.js
     create mode 100644 node_modules/express/node_modules/qs/lib/parse.js
     create mode 100644 node_modules/express/node_modules/qs/lib/stringify.js
     create mode 100644 node_modules/express/node_modules/qs/lib/utils.js
     create mode 100644 node_modules/express/node_modules/qs/package.json
     create mode 100644 node_modules/express/node_modules/qs/test/parse.js
     create mode 100644 node_modules/express/node_modules/qs/test/stringify.js
     create mode 100644 node_modules/express/node_modules/qs/test/utils.js
     create mode 100644 node_modules/express/node_modules/range-parser/HISTORY.md
     create mode 100644 node_modules/express/node_modules/range-parser/LICENSE
     create mode 100644 node_modules/express/node_modules/range-parser/README.md
     create mode 100644 node_modules/express/node_modules/range-parser/index.js
     create mode 100644 node_modules/express/node_modules/range-parser/package.json
     create mode 100644 node_modules/express/node_modules/send/HISTORY.md
     create mode 100644 node_modules/express/node_modules/send/LICENSE
     create mode 100644 node_modules/express/node_modules/send/README.md
     create mode 100644 node_modules/express/node_modules/send/index.js
     create mode 120000 node_modules/express/node_modules/send/node_modules/.bin/mime
     create mode 100644 node_modules/express/node_modules/send/node_modules/destroy/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/destroy/index.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/destroy/package.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/HISTORY.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/LICENSE
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/index.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/LICENSE
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/inherits_browser.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/package.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits/test.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/http-errors/package.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/.npmignore
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/LICENSE
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/build/build.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/build/test.js
     create mode 100755 node_modules/express/node_modules/send/node_modules/mime/cli.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/mime.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/package.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/mime/types.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/ms/.npmignore
     create mode 100644 node_modules/express/node_modules/send/node_modules/ms/LICENSE
     create mode 100644 node_modules/express/node_modules/send/node_modules/ms/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/ms/index.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/ms/package.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/statuses/LICENSE
     create mode 100644 node_modules/express/node_modules/send/node_modules/statuses/README.md
     create mode 100644 node_modules/express/node_modules/send/node_modules/statuses/codes.json
     create mode 100644 node_modules/express/node_modules/send/node_modules/statuses/index.js
     create mode 100644 node_modules/express/node_modules/send/node_modules/statuses/package.json
     create mode 100644 node_modules/express/node_modules/send/package.json
     create mode 100644 node_modules/express/node_modules/serve-static/HISTORY.md
     create mode 100644 node_modules/express/node_modules/serve-static/LICENSE
     create mode 100644 node_modules/express/node_modules/serve-static/README.md
     create mode 100644 node_modules/express/node_modules/serve-static/index.js
     create mode 100644 node_modules/express/node_modules/serve-static/package.json
     create mode 100644 node_modules/express/node_modules/type-is/HISTORY.md
     create mode 100644 node_modules/express/node_modules/type-is/LICENSE
     create mode 100644 node_modules/express/node_modules/type-is/README.md
     create mode 100644 node_modules/express/node_modules/type-is/index.js
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/media-typer/HISTORY.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/media-typer/LICENSE
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/media-typer/README.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/media-typer/index.js
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/media-typer/package.json
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/HISTORY.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/LICENSE
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/README.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/index.js
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/HISTORY.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/LICENSE
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/README.md
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/db.json
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/index.js
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db/package.json
     create mode 100644 node_modules/express/node_modules/type-is/node_modules/mime-types/package.json
     create mode 100644 node_modules/express/node_modules/type-is/package.json
     create mode 100644 node_modules/express/node_modules/utils-merge/.travis.yml
     create mode 100644 node_modules/express/node_modules/utils-merge/LICENSE
     create mode 100644 node_modules/express/node_modules/utils-merge/README.md
     create mode 100644 node_modules/express/node_modules/utils-merge/index.js
     create mode 100644 node_modules/express/node_modules/utils-merge/package.json
     create mode 100644 node_modules/express/node_modules/vary/HISTORY.md
     create mode 100644 node_modules/express/node_modules/vary/LICENSE
     create mode 100644 node_modules/express/node_modules/vary/README.md
     create mode 100644 node_modules/express/node_modules/vary/index.js
     create mode 100644 node_modules/express/node_modules/vary/package.json
     create mode 100644 node_modules/express/package.json
     create mode 100644 package.json
    ~/heroku/hello-heroku $ heroku create whispering-lake-8767
     !    Name is already taken
    ~/heroku/hello-heroku $ git push heroku master
    Counting objects: 298, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (277/277), done.
    Writing objects: 100% (298/298), 279.54 KiB | 0 bytes/s, done.
    Total 298 (delta 41), reused 0 (delta 0)
    remote: Compressing source files... done.
    remote: Building source:
    remote: 
    remote: -----> Node.js app detected
    remote: 
    remote: -----> Creating runtime environment
    remote:        
    remote:        NPM_CONFIG_LOGLEVEL=error
    remote:        NPM_CONFIG_PRODUCTION=true
    remote:        NODE_MODULES_CACHE=true
    remote: 
    remote: -----> Installing binaries
    remote:        engines.node (package.json):  0.10.x
    remote:        engines.npm (package.json):   1.4.x
    remote:        
    remote:        Resolving node version 0.10.x via semver.io...
    remote:        Downloading and installing node 0.10.40...
    remote:        Resolving npm version 1.4.x via semver.io...
    remote:        npm 1.4.28 already installed with node
    remote: 
    remote: -----> Restoring cache
    remote:        Loading 1 from cacheDirectories (default):
    remote:        - node_modules (exists - skipping)
    remote: 
    remote: -----> Building dependencies
    remote:        Prebuild detected (node_modules already exists)
    remote:        Rebuilding any native modules
    remote:        express@4.13.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express
    remote:        accepts@1.2.11 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/accepts
    remote:        mime-types@2.1.3 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/accepts/node_modules/mime-types
    remote:        mime-db@1.15.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db
    remote:        negotiator@0.5.3 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/accepts/node_modules/negotiator
    remote:        array-flatten@1.1.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/array-flatten
    remote:        content-disposition@0.5.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/content-disposition
    remote:        content-type@1.0.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/content-type
    remote:        cookie@0.1.3 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/cookie
    remote:        cookie-signature@1.0.6 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/cookie-signature
    remote:        debug@2.2.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/debug
    remote:        ms@0.7.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/debug/node_modules/ms
    remote:        depd@1.0.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/depd
    remote:        escape-html@1.0.2 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/escape-html
    remote:        etag@1.7.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/etag
    remote:        finalhandler@0.4.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/finalhandler
    remote:        on-finished@2.3.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/on-finished
    remote:        ee-first@1.1.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/on-finished/node_modules/ee-first
    remote:        unpipe@1.0.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/finalhandler/node_modules/unpipe
    remote:        fresh@0.3.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/fresh
    remote:        merge-descriptors@1.0.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/merge-descriptors
    remote:        methods@1.1.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/methods
    remote:        parseurl@1.3.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/parseurl
    remote:        path-to-regexp@0.1.6 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/path-to-regexp
    remote:        proxy-addr@1.0.8 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/proxy-addr
    remote:        forwarded@0.1.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/proxy-addr/node_modules/forwarded
    remote:        ipaddr.js@1.0.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js
    remote:        qs@4.0.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/qs
    remote:        range-parser@1.0.2 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/range-parser
    remote:        send@0.13.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send
    remote:        destroy@1.0.3 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/destroy
    remote:        http-errors@1.3.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/http-errors
    remote:        inherits@2.0.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits
    remote:        statuses@1.2.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/statuses
    remote:        mime@1.3.4 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/mime
    remote:        ms@0.7.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/send/node_modules/ms
    remote:        serve-static@1.10.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/serve-static
    remote:        type-is@1.6.5 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/type-is
    remote:        media-typer@0.3.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/type-is/node_modules/media-typer
    remote:        mime-types@2.1.3 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/type-is/node_modules/mime-types
    remote:        mime-db@1.15.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db
    remote:        vary@1.0.1 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/vary
    remote:        utils-merge@1.0.0 /tmp/build_43de9929d38da5c4dbc5d90d1788e976/node_modules/express/node_modules/utils-merge
    remote:        Installing any new modules (package.json)
    remote: 
    remote: -----> Caching build
    remote:        Clearing previous node cache
    remote:        Saving 1 cacheDirectories (default):
    remote:        - node_modules
    remote: 
    remote: -----> Build succeeded!
    remote:        └── express@4.13.1
    remote:        
    remote: -----> Discovering process types
    remote:        Procfile declares types -> web
    remote: 
    remote: -----> Compressing... done, 6.1MB
    remote: -----> Launching... done, v3
    remote:        https://whispering-lake-8767.herokuapp.com/ deployed to Heroku
    remote: 
    remote: Verifying deploy.... done.
    To https://git.heroku.com/whispering-lake-8767.git
     * [new branch]      master -> master
    ~/heroku/hello-heroku $ 
    
    

    ブラウザで見てみます。

    Screenshot-Mozilla Firefox-1

    無事に動作しているようです。

    ※1:「$ heroku create」だけを実行すると、適当な名前でアプリが作成されてしまうようです。リポジトリの名前との関係が今ひとつ理解できていません。
    ※2:上記の例ではFirefoxでURLを手打ちしましたが、「$ heroku open」でブラウザが開いてアプリを動かしてくれます。

    13. メッセージを変えてみる

    ソースファイルを以下の通り修正してみました。

    var express = require("express");
    var app = express();
    //app.use(express.logger());
    
    app.get('/', function(request, response) {
    	response.send('Hello wonderful Heroku world!');
    })
    
    var port = process.env.PORT || 5000;
    app.listen(port, function() {
    	console.log("Listening on " + port);
    });
    
    

    herokuにアップロードして確認します。

    ~/heroku/hello-heroku $ git add .
    ~/heroku/hello-heroku $ git commit -m "2nd edition"
    [master 760e08d] 2nd edition
     1 file changed, 1 insertion(+), 1 deletion(-)
    ~/heroku/hello-heroku $ git push heroku master
    Counting objects: 9, done.
    Delta compression using up to 2 threads.
    Compressing objects: 100% (7/7), done.
    Writing objects: 100% (7/7), 647 bytes | 0 bytes/s, done.
    Total 7 (delta 5), reused 0 (delta 0)
    remote: Compressing source files... done.
    remote: Building source:
    remote: 
    remote: -----> Node.js app detected
    remote: 
    remote: -----> Creating runtime environment
    remote:        
    remote:        NPM_CONFIG_LOGLEVEL=error
    remote:        NPM_CONFIG_PRODUCTION=true
    remote:        NODE_MODULES_CACHE=true
    remote: 
    remote: -----> Installing binaries
    remote:        engines.node (package.json):  0.10.x
    remote:        engines.npm (package.json):   1.4.x
    remote:        
    remote:        Resolving node version 0.10.x via semver.io...
    remote:        Downloading and installing node 0.10.40...
    remote:        Resolving npm version 1.4.x via semver.io...
    remote:        npm 1.4.28 already installed with node
    remote: 
    remote: -----> Restoring cache
    remote:        Loading 1 from cacheDirectories (default):
    remote:        - node_modules (exists - skipping)
    remote: 
    remote: -----> Building dependencies
    remote:        Prebuild detected (node_modules already exists)
    remote:        Rebuilding any native modules
    remote:        express@4.13.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express
    remote:        accepts@1.2.11 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/accepts
    remote:        mime-types@2.1.3 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/accepts/node_modules/mime-types
    remote:        mime-db@1.15.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/accepts/node_modules/mime-types/node_modules/mime-db
    remote:        negotiator@0.5.3 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/accepts/node_modules/negotiator
    remote:        array-flatten@1.1.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/array-flatten
    remote:        content-disposition@0.5.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/content-disposition
    remote:        content-type@1.0.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/content-type
    remote:        cookie@0.1.3 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/cookie
    remote:        cookie-signature@1.0.6 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/cookie-signature
    remote:        debug@2.2.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/debug
    remote:        ms@0.7.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/debug/node_modules/ms
    remote:        depd@1.0.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/depd
    remote:        escape-html@1.0.2 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/escape-html
    remote:        etag@1.7.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/etag
    remote:        finalhandler@0.4.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/finalhandler
    remote:        on-finished@2.3.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/on-finished
    remote:        ee-first@1.1.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/on-finished/node_modules/ee-first
    remote:        unpipe@1.0.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/finalhandler/node_modules/unpipe
    remote:        fresh@0.3.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/fresh
    remote:        merge-descriptors@1.0.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/merge-descriptors
    remote:        methods@1.1.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/methods
    remote:        parseurl@1.3.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/parseurl
    remote:        path-to-regexp@0.1.6 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/path-to-regexp
    remote:        proxy-addr@1.0.8 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/proxy-addr
    remote:        forwarded@0.1.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/proxy-addr/node_modules/forwarded
    remote:        ipaddr.js@1.0.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/proxy-addr/node_modules/ipaddr.js
    remote:        qs@4.0.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/qs
    remote:        range-parser@1.0.2 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/range-parser
    remote:        send@0.13.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send
    remote:        destroy@1.0.3 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/destroy
    remote:        http-errors@1.3.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/http-errors
    remote:        inherits@2.0.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/http-errors/node_modules/inherits
    remote:        statuses@1.2.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/statuses
    remote:        mime@1.3.4 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/mime
    remote:        ms@0.7.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/send/node_modules/ms
    remote:        serve-static@1.10.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/serve-static
    remote:        type-is@1.6.5 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/type-is
    remote:        media-typer@0.3.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/type-is/node_modules/media-typer
    remote:        mime-types@2.1.3 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/type-is/node_modules/mime-types
    remote:        mime-db@1.15.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/type-is/node_modules/mime-types/node_modules/mime-db
    remote:        vary@1.0.1 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/vary
    remote:        utils-merge@1.0.0 /tmp/build_613eb4a9c27e30554a15fcbbb230a300/node_modules/express/node_modules/utils-merge
    remote:        Installing any new modules (package.json)
    remote: 
    remote: -----> Caching build
    remote:        Clearing previous node cache
    remote:        Saving 1 cacheDirectories (default):
    remote:        - node_modules
    remote: 
    remote: -----> Build succeeded!
    remote:        └── express@4.13.1
    remote:        
    remote: -----> Discovering process types
    remote:        Procfile declares types -> web
    remote: 
    remote: -----> Compressing... done, 6.1MB
    remote: -----> Launching... done, v4
    remote:        https://whispering-lake-8767.herokuapp.com/ deployed to Heroku
    remote: 
    remote: Verifying deploy.... done.
    To https://git.heroku.com/whispering-lake-8767.git
       ca0b038..760e08d  master -> master
    ~/heroku/hello-heroku $ heroku open
    Opening whispering-lake-8767... done
    ~/heroku/hello-heroku $ 
    
    

    ブラウザが開いて修正されたことが確認できます。

    Screenshot-Mozilla Firefox-2

     

     

     


  • heroku+node.jsでHello Worldしてみた(1)

    投稿日 2015年 7月 24日 コメントはありません

    ずいぶん前から話題になっている heroku を試してみました。今回は、herokuとnode.jsを使ってHello Worldしてみましたので、その記録です。
    JavaScriptを使うのもほぼ初めて、herokuも初めて、当然Node.jsも初めて、という初めてづくしなのでおかしなところもあるかもしれません。環境はLinuxMint17.1 32bitです。

    参考にしたのは「2013-07-07 herokuでNode.jsの動く環境構築してみた!」です。基本的には(2)まではこの記事を辿っただけです。(途中からNode.js + Express環境前提での記載になります)

    1.herokuのアカウント作成&準備

    herokuのサイトでサインアップします。お決まりのメールアドレスをIDとするタイプです。
    メールアドレスをIDとして入力すると、そのアドレスに確認用のリンクアドレス付きのメールが送られてきます。そこにアクセスしてパスワードを設定します。

    パスワード設定後、ログインすると、どの言語を使うか(Getting Started with Heroku)聞いてきます。

    Screenshot-1000

    今回はNode.jsを選択してみます。

    Screenshot-1001

    Node.jsとnpmがインストールされていることが条件のようですので、ここで一旦herokuから離れます。

    2.node.jsとnpmのインストール

    すでにnodejsコマンドとnpmコマンドはインストール済みなので割愛。
    デフォルトで入っているアマチュアパケット無線用のnodeパッケージを削除(中身はないようだけど)して、node.jsをインストールします。

    $ sudo apt-get --purge remove node
    $ sudo apt-get --purge remove nodejs
    $ sudo add-apt-repository ppa:chris-lea/node.js
    $ sudo apt-get update
    $ sudo apt-get install nodejs
    $ nodejs -v
    v0.10.37
    $ node -v
    v0.10.37

    無事にインストールできたようです。

    3.heroku toolbeltのインストール

    「Getting Started with Node.js on Heroku」のSet upのところで、heroku toolbeltのインストールをします。Debian/Ubuntuを選ぶと、コマンドラインで以下を実行するよう表示されます。

    Screenshot-1002

    Rubyがインストールされている必要があるようですので、以下の通りコンソールから入力します。

    $ sudo apt-get install ruby

    とした後、

    $ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

    としてインストールします。

    4.herokuにログイン

    ~/heroku $ heroku login
    Enter your Heroku credentials.
    Email: xxxxxxxxxx@xxxxxx.xxx
    Password (typing will be hidden): 
    Authentication successful.
    ~/heroku $

    問題なく成功したので、Set upのところの「I have installed the Toolbelt」をクリックします。すると次の「Prepare the app」に進みます。

    5.サンプルアプリを動かす

    Getting Started with Node.js on Heroku」の「Prepare the app」「Deploy the app」「View logs」に沿って操作していけばサンプルアプリは容易に動きます。
    詳細は省略。その後の説明は、

    • ログは「$ heroku logs –tail」で確認可能
    • Procfileにはアプリを起動するためのコマンドを記述する。プロセスタイプの「web」に続いて、node.jsの場合には「node ファイル名.js」。webはherokuのHTTPルーティングスタックを使うためのもので、デプロイされた時にWebトラフィックを受信する、ということみたい。
    • package.jsonにはアプリケーションの依存関係を記述する。ファイルは「$ npm init」で作成できる。packages.jsonはアプリケーションのherokuで動かす際のNode.jsのバージョンと、アプリケーションの依存関係の両方を決定する。アプリケーションがデプロイされると、herokuはpackages.jsonを読み込んでnpm installコマンドを使って適切なバージョンのnode.jsと依存ファイルをインストールする。
    • アプリケーションをローカルで動かすためには「$ foreman start web」とするが、LinutMint17.1では「node」コマンドはアマチュアパケット無線用のNodeとなっており、node.jsは「nodejs」コマンドで起動することになっているため失敗してしまう。.bashrcに「alias node nodejs」と記述して新しいterminalで起動してもダメ。「$ sudo ln -s nodejs node」としてからだと、
      ~/heroku/node-js-getting-started $ foreman start web
      11:04:52 web.1  | started with pid 10609
      11:04:52 web.1  | 
      11:04:52 web.1  | /home/xxx/heroku/node-js-getting-started/index.js:2
      11:04:52 web.1  | var app = express();
      11:04:52 web.1  |           ^
      11:04:52 web.1  | TypeError: object is not a function
      11:04:52 web.1  |     at Object.<anonymous> (/home/xxx/heroku/node-js-getting-started/index.js:2:11)
      11:04:52 web.1  |     at Module._compile (module.js:456:26)
      11:04:52 web.1  |     at Object.Module._extensions..js (module.js:474:10)
      11:04:52 web.1  |     at Module.load (module.js:356:32)
      11:04:52 web.1  |     at Function.Module._load (module.js:312:12)
      11:04:52 web.1  |     at Function.Module.runMain (module.js:497:10)
      11:04:52 web.1  |     at startup (node.js:119:16)
      11:04:52 web.1  |     at node.js:902:3
      11:04:52 web.1  | exited with code 8
      11:04:52 system | sending SIGTERM to all processes
      ~/heroku/node-js-getting-started $

      となってやはりうまくいかない。
      ぐぐるさんに聞いてみると・・・同じ課題の人がいるようです。前の方の「2.node.jsとnpmのインストール」を修正しました。
      改めて試してみましたが、

      ~/heroku/node-js-getting-started $ foreman start web
      11:24:13 web.1  | started with pid 14932
      11:24:13 web.1  | 
      11:24:13 web.1  | module.js:340
      11:24:13 web.1  |     throw err;
      11:24:13 web.1  |           ^
      11:24:13 web.1  | Error: Cannot find module 'express'
      11:24:13 web.1  |     at Function.Module._resolveFilename (module.js:338:15)
      11:24:13 web.1  |     at Function.Module._load (module.js:280:25)
      11:24:13 web.1  |     at Module.require (module.js:364:17)
      11:24:13 web.1  |     at require (module.js:380:17)
      11:24:13 web.1  |     at Object.<anonymous> (/home/tom/heroku/node-js-getting-started/index.js:1:77)
      11:24:13 web.1  |     at Module._compile (module.js:456:26)
      11:24:13 web.1  |     at Object.Module._extensions..js (module.js:474:10)
      11:24:13 web.1  |     at Module.load (module.js:356:32)
      11:24:13 web.1  |     at Function.Module._load (module.js:312:12)
      11:24:13 web.1  |     at Function.Module.runMain (module.js:497:10)
      11:24:13 web.1  | exited with code 8
      11:24:13 system | sending SIGTERM to all processes
      ~/heroku/node-js-getting-started $

      となってうまくいきません。(気を取り直して再起動すると、Synapticがherokuとheroku-toolbeltのアップデートを要求してきましたが、その後でもやはりダメ・・・)
      「$ npm install」したあと「$ npm init」で package.json を作りなおしたらうまくいった模様。

    • その他、herokuの外のサービスとして長大なログを取るもの、コンソール起動の仕方(ワンライナーを動かすなど)、環境変数の渡し方・取得の方法、データベースの使い方などの記載があります。

    (2)へ続きます。


  • EMW3165モジュール

    投稿日 2015年 7月 14日 コメントはありません

    Hack a Dayの記事からですが、EMW3165というIoTモジュールが登場しているようです。記事のタイトルでは、「NEW PART DAY: THE ESP8266 KILLER」となっています。

    データシートによれば、

    • 100MHz動作のCortex-M4コア
    • 2MBのSPIフラッシュと512KBのオンチップフラッシュ
    • 128KBのRAM
    • GPIOが22ピン

    というのが概要です。STM32F4とSDIO接続のWiFiチップ、SPIフラッシュ2MBの組み合わせのようですので、いつぞやのEMW3162モジュールと大差ありませんが、今回特筆すべきは価格かもしれません。Seeed studioに出ている価格では$7.95なので、ESP-WROOM-02では容量が足りない、という場合には選択肢に上がってくるかもしれません。(もっとも、FCCとCEマーキングしかないので、日本では使えません)

    ただ、本質的な部品点数ではESP8266の方が少なくなる(当たり前ですが・・)ので、「ESP8266 KILLER」というにはちょっと役不足な感じがします。


  • 技適マーク付きESP8266モジュール入手

    投稿日 2015年 7月 12日 コメントはありません

    早く技適マーク付きESP8266モジュール欲しいな〜、と思ってググっていたら、スイッチサイエンスESP-WROOM-02の技適マーク付きの扱いがあることを発見。さっそくポチってしまいました。7/10に注文して、今日7/11には入手。速くて便利。

    いま改めて気づいたのですが、スイッチサイエンスのプレスリリースが出たのも7/10だったんですねぇ。そちらにはピッチ変換済みモジュールに関する記載もありました。
    モジュールは1.5mmピッチのSMD実装前提の形状ですので、慣れてない人はピッチ変換済みモジュールのほうがお手軽でしょう。

    ESP-WROOM-02

    よくみると、ESP-WROOM-02って、ESP-12にあった青色LEDがなくなってます。まあ、消費電力追い込む場合にはLEDも邪魔ですから、それはそれで良しかと思いますが、デバッグ中は不便そうです。

    一方で、CerevoからもESP-WROOM-02とピッチ変換基板が発売されています。Cerevoって聞き覚えあるけど何だっけ、と一瞬考えてしまいましたが、ustreamなどの機器で結構名前が出ていた会社です。Cerevoの中の人もきっとESP8266の可能性が気になっちゃったんでしょうねぇ。ブログの記事にまでなっちゃってます。

    話をESP-WROOM-02に戻します。さて、こいつならシールド環境などという面倒くさいことを言わずにあれこれできます。これからいろんな人が懐に暖めていたアイデアが花咲くことと思います。自分もアイデアだけはある(あ、部品もある)んですが、なかなか時間が・・・というのと、体調崩してしまっているのでどうなることでしょう。