Node.js

ここまでで、HTMLJavaScript というプログラミング言語、そして、LinuxGit というプログラミングのためのツールを学んできました。

ついにここから Web サービスを作っていきます。
これからの節では、セキュリティの問題のない秘密の掲示板が作れるようになります。

この回を学習する前に

この回では、以下の事項が前提となっています。

ここまで入門コースを順番に学習してきた方は既に完了できているはずですので、そのまま学習を開始しましょう。
途中からこの教材を学ぶ方は、学習を開始する前に全て完了させておいてください。


皆さんはニコニコや Google、LINE などの沢山の Web サービスを利用しているかと思います。
これからは、このような多彩な機能を持つ Web サービスの開発にとりかかっていきます。

そして Web サービスを開発するために Node.js を利用します。
今回は、この Node.js を使った簡単なプログラミングを体験してみましょう。

Node.js

Node.js (ノード・ジェイエス) とは、JavaScript でプログラミングすることのできる、サーバーサイド向けのプラットフォームです。 サーバーサイドとは、 サーバークライアント型のサービスのサーバー側のソフトウェアのことを指します。

また現在では、Node.js はサーバーサイドに限らず、開発用ツールやデスクトップアプリの開発にも使われています。ここまで使ってきた VS Code も Node.js を使って作られています。

Node.js は、複数のコアを持つ CPU を活かす必要のない処理では、 C++ や Java と言った高速なプログラミング言語と同等のパフォーマンスを発揮します。

また Node.js の言語である JavaScript は、スクリプト言語であり、手軽に開発できます。
スクリプト言語は、 C++ や Java などで必要な「コンパイル」という機械語への変換を必要としないのです。

JavaScript と Node.js を覚えれば、あらゆるシーンで利用できるソフトウェアを一通り作ることができます。

Node.js のインストール

Node.js 自体は WindowsやmacOSでも使えますが、実際に Web アプリを動かすサーバーは Linux である事が多いため、開発環境も Linux に合わせる方が望ましいといえます。そのため、この教材では Ubuntu に Node.js をインストールしていきます。

さっそく、 Node.js をインストールしてみましょう。

いつも通りコンソールを起動しましょう。

コンソールの起動方法を確認する

Node.js のバージョン管理

Node.js をインストールするために、 nodebrew という、 Node.js のバージョンを管理するツールを導入します。

なぜ、 Node.js というプログラミング言語自体にバージョン管理が必要なのでしょうか。

それは Node.js が現在も開発中のプログラミング言語だからです。
日々様々な改善が行われ、新バージョンで機能が変更される、ということもあります。
それゆえ、今まで利用していた機能が、次のバージョンで使えなくなるということもありえます。

そのようなことを防止するために、どのバージョンの Node.js を利用しているのかを明確にし、そして必要に応じてバージョンを切り替えたりできると便利なのです。
nodebrew を使えば、このようなことは簡単に行なえます。

ちなみに、Python や Ruby などといった他のプログラミング言語でも、こういったバージョン管理のツールは存在します。

バージョン管理の概要

では nodebrew をインストールするため、以下のコマンドを実行してください。

curl -L git.io/nodebrew | perl - setup

サーバー上から取得したプログラムを、パイプを使って Perl というプログラミング言語で実行しています。

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

以上のように表示されれば成功です。

そのまま、 パスを通す設定を行います。
以下のコマンドを実行します。

echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.profile

ここでいうパスとは、コマンドとなるプログラムが含まれているディレクトリの設定のことで、 PATH という名前の環境変数に値を代入することで、設定することができます。

今回はリダイレクトを使って .profile というファイルに追記することで、設定を編集しています。
.profile は、シェルの起動時に自動的に実行されるシェルスクリプトファイルです。

このように、追記リダイレクト >> を使うと、簡単に各種ファイルに設定を書き加えることができますが、打ち間違えて追記してしまったときに、間違いに気づきにくいので注意が必要です。
また、誤って普通のリダイレクト > をしてしまうと、既存のファイルを上書きして消してしまうこともあります。
不安であれば、素直に vim などのエディタを使って追記しましょう。

vim ~/.profile

次に、本来起動時に読み込まれる .profile を、今すぐ読み込むためのコマンドを実行します。

source ~/.profile

ここまで完了したら、

nodebrew

と打ち込んで、

nodebrew 1.0.1

Usage:
    nodebrew help                         Show this message
    nodebrew install <version>            Download and install <version> (from binary)
    nodebrew compile <version>            Download and install <version> (from source)
    nodebrew install-binary <version>     Alias of `install` (For backword compatibility)
...

のようにバージョンや使い方が表示されることを確認してください。これで nodebrew のインストールが完了です。
なお、あなたの環境で表示される nodebrew のバージョンは上記の 1.0.1 とは異なるかもしれませんが、気にする必要はありません。


nodebrew を使って Node.js をインストール

Node.js のバージョン管理ツールである nodebrew がインストールできたので、これを使って Node.js のバージョン v8.9.4 をインストールします。

nodebrew install v8.9.4
nodebrew use v8.9.4

以上のコマンドを実行しましょう。

use v8.9.4

と表示されればインストールが完了し、v8.9.4 が使われる設定になりました。
念のため、実際に Node.js のバージョンを表示して確認してみましょう。

node --version

以上のように、node コマンドにオプション --version を与えるとバージョンが確認できます。

v8.9.4

以上のように表示されたでしょうか。

Node.js を使ってみよう

今度は Node.js を動かしてみます。

node

とだけ入力すると、

>

と表示され、コンソールが入力を受け付ける状態になったと思います。
これは REPL というものです。

REPL

REPL (レプル) とは、 Read-eval-print loop の略称で、入力したコードをその場で実行して、結果を表示するツールです。
以前に Chrome のデベロッパツールの Console で JavaScript を試した環境と同じようなものです。

試しに、

2 * 3

以上を入力して、2 かける 3 を計算させてみましょう。

6

と計算結果が表示されます。

REPL は、 Ctrl + c を二度入力することで終了することができます。
終了せてみましょう。

>
(^C again to quit)
>

これで、通常のシェルのコマンド入力画面に戻ることができたと思います。

Node.js のプロジェクト

Node.js は、先ほどのように REPL で動かすこともできますが、プログラムをファイルにまとめて書いて動かすこともできます。

HTML の時と同じように、プロジェクトディレクトリを用意して編集を開始しましょう。

mkdir workspace/my-first-node-js
cd workspace/my-first-node-js
touch app.js

以上のコマンドを実行します。
app.js という、JavaScript ソースコードを書くファイルを作成しています。

ここまでできたら、 my-first-node-js ディレクトリを、フォルダとして VS Code で開きましょう。

VS Code の左のファイル一覧から app.js を選択し、下記のソースコードを入力しましょう。

'use strict';
const number = process.argv[2] || 0;
let sum = 0;
for (let i = 1; i <= number; i++) {
    sum = sum + i;
}
console.log(sum);

これは、1 からコマンドラインの引数で与えられた数までを合計するプログラムです。コードを細かく見ていきましょう。

'use strict';

この部分は、JavaScript を Strict モードで利用するための記述です。
ただし、Node.js ではモジュールという仕組みを使っているため、HTML に組み込む JavaScript を書いていたときのように、 無名関数で囲う必要はありません。

const number = process.argv[2] || 0;

このコードは、number という定数に、process.argv[2] の値を代入します。
process.argv は Node.js がデフォルトで提供してくれる、コマンドラインの引数が入った配列です。

なぜ添字として 2 番を使っているかというと、0 番には node コマンドのファイルのパスが入り、
1 番には、実行しているプログラムのファイルのパスが入る、という決まりがあるためです。
コマンドの後ろに書いた最初の引数は process.argv[2] なのです。

なお、以下の || を使った書き方は初めて見るかもしれません。

const number = process.argv[2] || 0;

このコードが実行されると、process.argv[2] が 0 や null や undefined などの Falsy な値である場合、number には 0 が代入されます。

なぜこんなところで、条件付き論理和の論理演算子 || を使ったのでしょうか。

条件付き論理和は、先に左側に書かれた値を見て Truthy であれば、その値を結果として使います。
そして左側の値が Falsy であれば、その右側の値を結果として使う、という特性があります。

その特性を利用して、選択的な代入を行っているのです。

試しに

node

以上のコマンドで REPL を起動して、

null || 1;
undefined || 1;
0 || 1;
2 || 1;

それぞれ評価してみましょう。すると、

1
1
1
2

と表示されたはずです。

上の 3 つではすべて、左側の値が Falsy なので、右側に書かれた値 1 が結果になっています。
それに対して最後の 1 つでは、左側の値が Truthy なので、左側に書かれた 2 が結果になっています。

const number = process.argv[2] || 0;

つまりこれは、コマンドライン引数が指定されていればその値、そうでなければ 0 を、変数 number に代入するというコードなのです。

let sum = 0;
for (let i = 1; i <= number; i++) {
    sum = sum + i;
}
console.log(sum);

この部分は、以前にも練習したよくある for 文です。
1 から number までの数字までを順に足して合計し、最後に sum の値を出力しています。

では、 Ctrl + c を二回入力して、REPL を終わらせ、以下のコマンドを入力します。

node app.js 100

結果として

5050

が表示されれば成功です(1 + 2 + 3 + ... + 100 = 5050 です)。
これで、 Node.js を利用したプログラミングができるようになりました。


最後に今のコードを、GitHub に上げましょう。

  1. https://github.com/ にアクセスし、「 New repository 」をクリックします
  2. my-first-node-js という名前で「 Create repository 」をクリックします

ここで 「 …or push an existing repository from the command line 」以下に表示されたコマンドをひかえておきましょう。

GitHub のリポジトリの作り方を確認する

GitHub にリポジトリができたら、コンソールで git リポジトリを作成しコミットしましょう。

git init
git add .
git commit -m "first commit"

その後、GitHub で作ったリポジトリに表示された

git remote add origin git@github.com:${自分のGitHubアカウント名}/my-first-node-js.git
git push -u origin master

を実行します。
これで、あなたの書いたコードは GitHub で管理されるようになりました。

なお、Windows の VS Code で clone した Git リポジトリを開くと、「Git が見つかりません」というエラーが表示されることがあります。
これは Windows に Git が存在しないために表示されるものですが、この教材では仮想環境上の Ubuntu で Git の操作を行うため、無視して構いません。
「今後は表示しない」をクリックしましょう。

「Git が見つかりません」というエラーに対しては「今後は表示しない」をクリック

まとめ

  • Node.js は、サーバーサイドプログラミングができるプラットフォーム
  • nodebrew という Node.js のバージョン管理ツールで、指定した Node.js のバージョンをインストールできる
  • Node.js は REPL で実行することも、ファイルに書いたプログラムを実行することもできる
  • 条件付き論理和 ( || )は、選択的代入に利用できる

練習

Node.js で、1 以上の自然数の階乗を求める関数を実装してみましょう。
なお、階乗とは 1 からその与えられた自然数までの数をすべてかけたものです。たとえば 5 の階乗は、5 * 4 * 3 * 2 * 1 で、120 になります。
GitHub の練習問題リポジトリをフォークして、正解のプルリクを送ってください。

まず GitHub 上でフォークし、自分の intro-curriculum-3001 リポジトリをローカルに clone してはじめましょう。

intro-curriculum-3001 のフォークボタン

clone のしかたを確認する

cd ~/workspace
git clone git@github.com:${自分のGitHubアカウント名}/intro-curriculum-3001.git
cd intro-curriculum-3001

このようにリポジトリの内容をローカルにクローンすることで、自分の手元で編集ができるようになります。
VS Code で、intro-curriculum-3001 フォルダを開き、 app.js の中身が下記の通りになっていることを確認しましょう。

'use strict';
/**
* 与えられた自然数の階乗を返す
* 階乗とは、1からその与えられた自然数までの数をすべてかけたものです
* @param {Number} n
* @returns {Number}
*/
function factorial(n) {
    let result = 1;
    // TODO このコメントを消して正しく実装してください。
    return result;
}
const assert = require('assert');
assert.equal(factorial(1), 1, `1の階乗は1ですが、実際は${factorial(1) }でした`);
assert.equal(factorial(2), 2, `2の階乗は2ですが、実際は${factorial(2) }でした`);
assert.equal(factorial(3), 6, `3の階乗は6ですが、実際は${factorial(3) }でした`);
assert.equal(factorial(10), 3628800, `10の階乗は3628800ですが、実際は${factorial(10) }でした`);
console.log('すべてのテストを通過しました');

factorial が階乗を計算する関数です。
この関数が未完成の状態になっていますので、正しく階乗を計算して返すようにコードを書いて完成させてください。

const assert = require('assert');

この部分は Node.js が持つアサーションという機能を、オブジェクトとして読み込む記述方法です。詳しくはこの後の回で説明していきます。

また、ここで使われている ` (バッククオート) で囲まれている文字列は、 ${プログラム内の値} という形式の文字列を含めることで、変数の値を埋め込むことができる Template Literal という機能になります。

実装が完了したら、

node app.js

を実行してください。
すると、コードの後半に書かれている assert によるテストが実行されます。

間違っている場合には、

assert.js:89
throw new assert.AssertionError({
^
AssertionError: 2の階乗は2ですが、実際は1でした

以上のように間違っていることが表示されます。
全てのテストに成功した場合は

すべてのテストを通過しました

と表示されます。
全てのテストが通るようになったら、GitHub へ push し、プルリクを作成しましょう。


解いてみたので、答えを表示する


この教材は、N予備校 により提供されています。