A note of a person who is learning programming, SakaTaQ

ロック好きのプログラミング学習

Node.jsについて学習した際の備忘録

npmの名前にも使われているnode。
これについてもザッと学習したことをまとめる。

Node.js

JavaScriptは本来クライアント側で動く言語だけど、Node.jsはサーバーサイド側で動くプラットフォーム。
nodebrewというバージョン管理ツールで指定した Node.jsをインストールできる。 インストール方法については別記事でまとめる。

Node.jsの動かし方はrubyファイルの動作のさせ方と同じイメージで

% node

これでコンソールには>と表示され、入力待機状態になる。これをREPLという。

REPL(Read-Eval-Print-Loop)

入力したコードをその場で実行して、結果を表示するツール。
RubyRails学習者としてのイメージは、rails cで使えるirbや、Chromeブラウザ上で使えるConsoleタブ。
終了する場合は Ctrl + C を2回入力する。1回目は(^C again to quit)と出てくるので従えばOK。
 
 
 
 
ファイルに書いたプログラムを実行することもできる。

% node ファイル名
% node ファイル名 引数

例)
% node app.js
% node app.js 10

ファイル名 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);

引数の数字より高い数字になるまで繰り返しで数を足していく処理をする。
10が引数であれば1 + 2 + 3 + ... + 10みたいな感じ。

Node.jsではモジュールという仕組みを使っている為、HTMLの時に使っていたような

(function () {
'use strict';
// 実行したい処理
})()

無名関数で囲う必要がないので、書き方が少し違う。

'use strict'

strict モードでは、従来は受け入れていた一部のミスをエラーに変更します。JavaScript は未熟な開発者にも易しいように設計され、またエラーとすべき操作の一部をエラーとして扱いません。これにより当面の問題を解決したことがありますが、後により大きな問題を引き起こしたこともあります。strict モードではこれらのミスをエラーとして扱うことで、開発者は気づいて修正するようになります。

こちらのサイトより一部抜粋
ざっくりいうと書き間違えがないか厳しく見てエラーが出ているところを教えてくれるモード。
キチンとした書き方ができない間はこれを使うと中々実行できなくなるけど...

process.argv

Node.jsがデフォルトで提供してくれる、コマンドラインの引数が入った配列。

  • [0]にはnodeコマンドのファイルのパスが入る
  • [1]には実行しているプログラムのパスが入る
  • [2]は引数が入る

process.argv[2] || 0; の後ろにある条件付き論理和は左側からTruthy(真)であるかを判定する。
左側の値がFalsy(偽 = null, undefined, 0の形)であれば右側の値を結果として使うという特性を持つ。
コマンドラインで引数があればその値をnumberに代入、なければ0を代入する。

プログラムの実行速度を測定するのにtimeコマンドを利用できる。

% time node app.js

実際にかかった全体の時間と、実行ユーザーとしてかかった時間、システムが別の処理に使った時間が出てくる。  
 

...Nodeは少し思い出があって、Macのアプデしたらnodebrewが消失する事件にしっかり巻き込まれて、Rails起動しなくて焦った一人。 JavaScriptランタイムがないって言われて、gem 'mini_racer'入れろみたいなのが出てきて
「何故入れてなかったものを入れないといけないのか意味不明」
ってなり、サーバーサイドでJS使えないみたいな感じかな?って勘みたいなものでhomebrewからバージョン調べてみたら気付けた。

この時に参考にした記事
なぜ、Ruby on Railsの動作にNode.jsが必要なのか

あれ以来、即アプデが怖くてできない...
もっと実力つけて何でも対応できるようにならなきゃ...😅  
 
 

stream

Node.jsでは、入出力が発生する処理をほとんどこの形で扱う。
非同期で情報を取り扱う為の概念で、情報自体ではなく情報の流れに注目。

factorial()

階乗を計算する関数。引数に渡した数だけ順番に掛ける。再帰処理を同時にやるケースが多いみたいです。
参考にさせていただいた記事

equal()

イコールのこと。比較演算子参考にさせていただいた記事

resume()

ストリームに情報を流し始める処理。
AudioContext.resume()MediaRecorder.resume()に共通している記述は一時停止していた記録や流れの再開とある。

map関数

REPL> [1, 2, 3].map((i) => { return i * 2; })
=> [2, 4, 6]
Arrayの要素それぞれを、与えられた関数を適用した内容に変換する。
「与えられた整数を2倍にする」という関数を配列の各要素に適用して新しい配列を得ている。

Map

var map = new Map();で空のMapオブジェクトを生成できる。 これにより生成されるオブジェクトはキーと値の組み合わせの形で保持できる、とあるのでrubyでいうハッシュに近い感じだと思ってる...けど、連想配列っていう言葉で表現されてますね。
参考にさせていただいた記事

Math

数学的な定数と関数を持つプロパティとメソッドを持つ組み込みオブジェクト。関数オブジェクトではない。やたらと色んなところで出てくる。
参考にさせていただいた記事

Math.floor()

引数として与えた数以下の最大の整数で返す。静的メソッド。
Math.floor( 45.44);=> 45
Math.floor(-45.05);=> -46
参考にさせていただいた記事

Math.random()

そのまま使用すれば0以上1未満の浮動小数点の擬似乱数を返す(0.6235435みたいな感じ)。
Math.floorと合わせて使うことでいろいろな範囲の乱数として実装できる。

const names = ['太郎', '次郎', '三郎', '四郎'];
const name = names[Math.floor(Math.random() * names.length)];
console.log(name);
=>実行するたびに結果が変わる。

2行目で一番最初に見る部分として、今回のケースだとMath.random() * 4になる。 Math.floor()で囲っているので小数点を省いた整数に切り捨てされたものが、[ ]内の添字になり、names[ ]の形になったものをnameに代入させている、と。
参考にさせていただいた記事

Templete Literal

`(バッククォーテーション)で囲まれている文字列に${プログラム内の値、変数など}という形式の文字列を含めることで変数などを埋め込むことができるテンプレートリテラルという機能になる。

for-of構文

for (let culc of map) { // 繰り返したい処理内容 }
MapオブジェクトやArrayなどの中身をofの前の変数(ここではculc)に代入してforと同じループ処理する書き方。 配列に含まれる要素を使いだけで添字は不要な場合に有用。

二つのお店の看板メニューで各々得られるカロリーの摂取効率の計算を行うとする。

console.log(map);
=>
Map {
  '好き家' => { signboard: 350, calorie: 400, perform: null}, 
  '待つ屋' => { signboard: 300, calorie: 320, perform: null}
}
for (let culc of map) {
  const value = culc[1];
  value.perform = value.calorie / value.signboard;
}
console.log(map);

Mapオブジェクトにfor-ofを使用した場合には、キー、バリューと要素が二つある配列が変数に代入される。culc[0]でキーである店の名前(好き野など)、[1]であれば{}の中にあるオブジェクトを取得する。
取得したvalueに対してメソッドを使用する形でキーを入力する(.calorieなど)と値を取り出すことができる。
繰り返し処理後の実行結果は

Map {
  '好き家' => { signboard: 350, calorie: 400, perform: 1.14285714}, 
  '待つ屋' => { signboard: 300, calorie: 320, perform: 1.06666666}
}

これで値段あたりの摂取カロリー量の計算を出来たことがわかった。

const assert = require('モジュール名')

モジュールをオブジェクトとして読み込む記述方法。

assert

Node.jsが持っているアサーションという簡易テストの為のモジュール。
const assert = require('assert')
参考にさせていただいた記事

fs

FileSystemの略で、ファイルを扱う為のモジュール。
const assert = require('fs')

readline

ファイルを1行ずつ読み込む為のモジュール。
const assert = require('readline')

nodegrind

処理に時間がかかっている様子、メモリの使用量を調べる方法にプロファイルがある。
これらを見る為のプロファイルツール。
nodegrind -o app.cpuprofile app.jsを実行することで「app.cpuprofile」ファイルにプロファイルの様子が出力される。
Google Chromeデベロッパーツール[Profile]タブで見ることができる。

指数オーダー

O記法でO(a^n)と記述。aは定数で、指数オーダーの計算はコンピュータは難しい。
回を重ねると倍々に計算回数が増えるような処理の増え方をいう。

線形オーダー

O記法でO(n)で、nに対してn倍処理時間がかかるオーダー。
基本的にはnに対してn倍の時間をかければ解くことができるので処理が圧倒的に速くなる。


JavaScriptは派生も多く学習がとても大変でした。これ、使いこなせる日が来るのだろうか...
とりあえず今は学び続けるしかない。

したらな❗️ 👋