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

さらに続きです。

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)

続きです。

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)

ずいぶん前から話題になっている 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モジュール

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モジュール入手

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

ESP-8266用ArduinoIDEでサンプルを動かす

環境構築とサンプルを動かす話を一つの記事にしたら長くて読みにくくなってしまったので、2つに分割します。この記事は環境構築の続きです。

ESP8266自身で動かすWebサーバーサンプルのテストと、ESP8266をNTPクライアントにするサンプルのテストです。

サンプルのコンパイルと書き込み

以下の手順でサンプルの動作を確認しました。

  1. 「ファイル」⇒「スケッチの例」⇒「ESP8266mDNS」⇒「mDNS_Web_Server」を選択してみます。
  2. 23行目にSSIDを、24行目にパスワードを設定する箇所がありますので、そこにそれぞれの環境に応じた設定をします。
  3. 「ファイル」⇒「名前をつけて保存」で適当なディレクトリを作って保存します。
    (あたり前といえばあたり前ですが、保存しないとうまく動作しません)
  4. ESP8266ボード側はブートローダの起動状態にしておきます。(GPIO0をGNDに落とした状態でリセットをかけて、リセット解除しておきます。リセット解除後はGPIO0はGNDに落ちていても落ちていなくても構いません。なお、ESP8266のファームウェアバージョンはv0.9.5のものを使用しています。)
  5. 「ツール」⇒「シリアルモニタ」でシリアルモニタを起動しておきます。速度は115200bpsです。
  6. 「スケッチ」⇒「マイコンボードに書き込む」でコンパイルと書き込みを行います。
  7. 書き込みが終わると自動的に実行されます。
    screen8
  8. シリアルモニタ側にIPアドレスなどの情報が表示されます。
  9. ブラウザからそのIPアドレスにアクセスすると、ESP8266上で動作するWebサーバからのメッセージ(「Hello from ESP8266 at 192.168.xxx.xxx」)が取得できます。
    下記はAndroid上のブラウザからIPアドレス指定でアクセスした後のシリアルコンソールの表示内容です。
    screen9

同様にNTPClientなども動作しました。

Windowsだけではなく、Linuxでもこれだけお手軽に動かせるようになってきています。かなりお手軽にESP8266を動かす環境が整ってきていることを感じますね。

※上記の動作確認は接続先のアクセスポイントを含め、シールドルーム内で実施しています。早く技適対応済みのモジュールが入手できるようになって欲しいものです。

Linux版ESP-8266用ArduinoIDEのインストール

Linux版のESP8266対応のArduinoIDEのインストールが簡単になっていましたので、その方法でLinux32bit環境(LinuxMint17環境)にインストールしてみました。
ArduinoIDEの1.6.4からボードマネージャ(Boards Manager)を使ってサードパーティのプラットフォームパッケージのインストールができるようになったようです。そこで、ESP8266用のプラットフォームパッケージが準備された、ということみたいです。
このプラットフォームパッケージを使うと、超簡単にArduinoIDEからESP8266を使うことができます。現時点ではWindows,MacOS、Linux(32bit/64bit)のパッケージが準備されているようです。

(7/15に64bit版Linuxでもサンプルのコンパイルまで確認してみました。手順は概ね同じですが、若干の記載漏れを加筆しました。また、64bit版ではファイル名などで32になっているところが64になったりします。)

このプラットフォームパッケージの特筆すべき点は「AVRマイコンなど他のマイコンを必要とせず、ESP8266モジュール単体でArduinoとして動作しつつ無線LANでの通信ができる」ということです。

大事なこと(すごいこと)なのでもう一度書きます。Arduinoとして動作させるのに、(書き込み時は別として)ESP8266モジュールと電源以外の部品は必要ありません

たぶん、ArduinoIDE自体で依存するモジュールがあると思います。build-essentialやdefault-jdkなどは事前にインストールしておくほうが良いかと思います。

ArduinoIDEのインストール

arduino.ccからLinux32bit版のArudino IDEをダウンロードしてきます。ダウンロードが完了したら、アーカイブを展開します。

端末(コンソール)を開いて、ホームディレクトリから

$ xzcat ダウンロード/arduino-1.6.5-linux32.tar.xz | tar -xv
$ ./arduino-1.6.5/arduino

として、開発環境を起動します。
(ダウンロード場所はディストリビューションなどに応じた場所を指定してください。上記ではホームディレクトリ直下にarduino-1.6.5というディレクトリができて、そこに展開します。)

screen1

「ファイル」⇒「環境設定」にて、環境設定の画面を開きます。開いたら、「Additional Boards Managers URLs:」に「http://arduino.esp8266.com/package_esp8266com_index.json」と入力し、OKを押します。

※追伸:安定版と開発版のバージョンができているようです。
安定版は「http://arduino.esp8266.com/stable/package_esp8266com_index.json」、開発版は「http://arduino.esp8266.com/staging/package_esp8266com_index.json」を入力してください。
どちらを選べばいいかわからない場合は当然安定版の方を選びましょう。

「ツール」⇒「ボード」⇒「Board Manager …」を選択します。

screen3

一番下に、「esp8266 by ESP8266 Community」というのがありますので、ここをクリック(選択)すると、右下に「Install」ボタンが現れますので、「Install」ボタンを押します。

screen4

すると、40MBくらいダウンロードした後、Installedになります。

screen6

確認したら、「閉じる」でインストールは完了です。
ESP-8266が使えるかどうかを「ツール」⇒「ボード」で確認します。

screen7

メニューに「Generic ESP8266 Module」「Olimex MOD-WIFI-ESP8266(-DEV)」「NodeMCU(ESP8266 ESP-12 Module)」が増えているのが確認できました。

今回は「Generic ESP8266 Module」で動作させてみます。
選択すると、「ツール」の下に「CPU Frequency」「Flash Size」「Upload Speed」「ポート」などの設定ができるようになっていました。今回はそれぞれ「80MHz」「512K(64K SPIFFS)」「115200」「/dev/ttyUSB0」としています。

サンプルの動作確認は次の記事です。

ESP8266のファームウェア更新

さらにESP8266のファームウェア更新をしてみました。

1.接続

接続は先に紹介した以下の配線でOKです。

IMG_0413s

2.書き換えツールのダウンロード

Pythonで動作するesptool.pyを使います。

$ mkdir ESP8266UPDATE
$ cd ESP8266UPDATE
$ git clone https://github.com/themadinventor/esptool/

3.更新ファームウェアのダウンロード

更新ファームウェア(v0.9.5)をダウンロードします。

$ wget --content-disposition "http://bbs.espressif.com/download/file.php?id=189"

これより新しいバージョンのファームウェアもリリースされていますが、新しいバージョンのものはどうやらボード上のフラッシュメモリのサイズが1MB(8Mbit)必要なようです。ESP-01〜ESP-12として出回っているモジュールはほとんど512KB(4Mbit)のようなので、ATコマンドで使う場合にはこれでダウンロードされる v0.9.5 が最新ということになるのだと思います。それ以降のファームウェアを使う場合には、ESP-WROOM-02などの(おそらく)1MBのフラッシュメモリが搭載されたものが必要になるのでしょう。

4.ファームウェアの書き換え

タクトスイッチ(これでGPIO0をGNDに落とす)を押した状態でUSBケーブルを挿入し、挿入後タクトスイッチを離す(押したままでもOK)。これで書き換えモードになりますので、この状態でesptool.pyを使ってファームウェアの書き換えを行います。

$ cd esp_iot_sdk_v0.9.5/bin/
$ ../../esptool/esptool.py write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin
Connecting...
Erasing flash...
Writing at 0x00000400... (100 %)
Erasing flash...
Writing at 0x00034800... (100 %)
Erasing flash...
Writing at 0x0003ec00... (100 %)
Erasing flash...
Writing at 0x0007ec00... (100 %)
Leaving...
$

これでUSBケーブルを挿し直すと(直さなくてもいけるのかも?)動き出します。

GtkTermで見てみると、最初文字化けします。バージョンアップすると、ATコマンド通信時の速度が9600bpsから115200bpsに変わるようですので、設定をしなおして見てみると、

AT+GMR
AT version:0.21.0.0
SDK version:0.9.5
OK

となっていました。

ちなみに更新前は、

AT+RST

OK
c_��RS��FjS�fJ[��
[Vendor:www.ai-thinker.com Version:0.9.2.4]
ready
AT+GMR
0018000902-AI03
OK

で 0.9.2.4 でした。

※作業はAPを含めてシールドルーム内で行っています。

ESP8266を操作してみる

秋月のAE-UM232Rと三端子レギュレータを接続してブレッドボード上でESP8266を動かしてみました。使用したモジュールは手持ちのESP-12でプリント基板パターンアンテナを使用したFCC認証済みのモデルです。

IMG_0413s

接続回路図はHack a Dayの記事のままです。真ん中下がピッチ変換基板に載せたESP-12モジュール、左上がAE-UM232R、右上に3.3Vを生成する三端子レギュレータを配置しています。真ん中には電解コンデンサとフィルムコンデンサが付いているのですが、これは後述のとおりなかなか動作しなかったので、電源系の不安定さを疑って追加したものです。その右側にはF/W書き込みのためのスイッチもつけてあります。USBで接続する先のPCはLinuxMint17.1 MATE edition 64bit版です。

USBケーブルを接続すると、ESP-12に搭載されている青いLEDが一瞬点滅します。購入直後であればこの状態でスマートフォンなどにWiFiの状態をみるツールを入れてやるとアクセスポイントとして見えます。

次にPC側でターミナルプログラムとしてGtkTermを起動して、シリアルポートに/dev/ttyUSB0を選択し、通信速度を9600bpsに設定すると、入力した文字がエコーバックされるのがわかります。
この状態ではATコマンドを受け付けるはずなので、

AT[Enter]

と入力してやると「OK」と返ってくるはずなのですが、返って来ません。
グーグル先生に聞いてみると、電源不安定だと起きるのではないかとか、そんな話が見つかります。それで電解コンやらフィルムコンやら追加したりしたのですが、状況が変わる気配はありません。

さらに調べてみると、「改行コードは”\r\n”でないと動作しない」という情報が出てきました。そこで、[Enter]の代わりにCTRL+M、CTRL+Jと入力したのですが動作しません。代わりに日本語入力モードになってしまいました。

そこで、一時的にIBus+Anthyの動作を止めてやりATの後にCTRL+M、CTRL+Jと入力してやると無事にOKが返ってきました。同様にいくつかコマンドを打ってみました。

AT+RST


OK
c_��RS��FjS�fJ[��
[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready
AT+GMR

0018000902-AI03

OK
AT+CWLAP

+CWLAP:(4,"aterm-xxxxxx-gw",-54,"xx:xx:xx:xx:xx:xx",10)
+CWLAP:(4,"aterm-xxxxxx-g",-55,"xx:xx:xx:xx:xx:xx",10)

OK

というような感じで無事にアクセスができました。上記の例を見てもわかるとおり、アクセスポイントの検出もできていました。

※上記の動作確認は接続先のアクセスポイントを含め、シールドルーム内で実施しています。早く技適対応済みのモジュールが入手できるようになって欲しいものです。

三項演算子の振る舞い

実は最近調子が悪く、療養中の身で最近記事をかけていません。(ESP8266関係も追っかけられていません)

ただ、Webを彷徨っていたらこんな記事を見かけたので考えてみました。

i%n==0?1:0
ってどんな意味?

との質問。演算子の優先順位から言って、((i%n)==0)?1:0 と等価で、iがnの倍数の時に1になる動きをするのでしょう。

実際にいくつかの言語で試してみました。

1.C言語

#include <stdio.h>
int main(int argc,char *argv[])
{
	int n=5;
	for(int i=0;i<20;i++)
		printf("%d %d\n",i,i%n==0?1:0);
}

となります。コンパイルと実行結果は、

$ gcc foobar.c -o foobar -std=c99
$ ./foobar 
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0

2.Java言語

public class foobar {
	public static void main(String[] args) {

		int n=5;
		for(int i=0;i<20;i++){
			System.out.println(i+" "+(i%n==0?1:0) );
		}
	}
}

コンパイルと実行は、

$ sudo apt-get install default-jdk
$ javac foobar.java 
$ java foobar 
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0

となります。

3.JavaScript言語(Node.js 環境)

n=5;
for(i=0;i<20;i++){
	console.log(i+" "+(i%n==0?1:0))
}

実行は、

$ nodejs foobar-node.js
0 1
1 0
2 0
3 0
4 0
5 1
6 0
7 0
8 0
9 0
10 1
11 0
12 0
13 0
14 0
15 1
16 0
17 0
18 0
19 0

4.JavaScript(ブラウザ環境)

n=5;
for(i=0;i<20;i++){
	document.writeln(i+" "+(i%n==0?1:0)+"<BR>")
}

ブラウザでからのページを開いて、右クリックでJavaScriptコンソールを開いて、上記のプログラムをコピペしてリターンキーを押すと、結果がブラウザ側に表示されます。

5.JavaScript(おまけ)

サーバサイドで実行して、ブラウザで結果を見る場合です。

var http = require('http');

var n=0;
 
var server = http.createServer();
server.on('request', doRequest);
server.listen(8000);
console.log('Server running at http://127.0.0.1:8000/');

function doRequest(req,res){
	res.writeHead(200, {'Content-Type': 'text/plain'});
	n=n+1
	res.write("Try #"+n+"\n");
	for(i=0;i<45;i++){
		res.write(i+" "+(i%n==0?1:0)+"\n");
	}
	res.end('Completed\n');
}

これを foobar-server.js で保存して

$ nodejs foobar-server.js

で実行し、ブラウザで http://localhost:8000/ を表示すると結果が見れます。
firefoxではリロード毎にちゃんとnが1ずつ増えていくのですが、Chromeだと1から始まって2ずつ増えていきます。理由はわかりませんが、リロードの前に無駄な読み込みでもしているんでしょうか。それとも?