Node.jsとの闘い

おはようございます、今日はNode.jsについて理解して行きたいと思います。

不明点1

Node.jsとはなんぞや

このページがわかりやすい!
JSはブラウザ上で動くだけでなく、実はサーバー上でも動くという
なんていうかPHPとかJAVAみたいなシステム(?)とかアプリとかを作る時に使われる言語と似たような特性を実は持っているということ(?)
特にNode.jsはリアルタイム性が必要なアプリなどで活躍するらしい.FacebookメッセンジャーやLineなどのチャットはNode.jsでかけるという.
多分Node.jsがよくわからなかった原因はnode.jsをただ単にJSのファイルに見えてしまっていたからだろう。
新たな言語としてNode.jsを捉えればわかりやすい
Node.jsが出てくると絶対出てくるのが、nodebrewというソフトウェア
Node.jsというのは未だ開発中の言語であるため、そのバージョンupが常に必要なのである。そのバージョンupに用いるのがnodebrewというソフト。

不明点2

コマンドライン引数とは

コマンドライン引数の詳しい説明
コマンドラインをコンソール(キーボードだけで打ち込む画面)と考えて、引数を文字通り、プログラムに代入する値とすればわかりやすい
例えば、Aというプログラムに1+1を計算させるとする。この時、コンソールで A {1+1} みたいに書いたとする。
コマンドライン引数はこの{1+1}の部分を指す、難しくない気がする
これもいい!
あるアプリケーションの上にファイルをドラッグドロップしたらそのアプリケーションでそのファイルが開かれるじゃないですか、
その動作をコンソール画面で行なっているという意味ですね!理解理解

そういえば、Node.jsで書く時にもやはり現れる一行目の'use strict'とは一体何だったでしょうか

'use strict'; を追加することで未定義の変数の使用を禁止するなど、より厳格な文法でプログラムを書くことができる
だから基本的にはファイルの記載することが推奨される

話を戻すと、コマンドライン引数を取得するという文が何を意味しているのか考えよう。
例えばさっきの話でドラッグドロップするファイルが複数あるとするじゃないですか、それを一番目からn番目まで順番をふっていくんですよ
この時に、ARGVとかいうコマンドライン引数を格納してくれる特別な配列が存在して、これを用いれば、どんな引数を代入したか参照できるんですよ
例えば、ARGV[0]とすれば一番目の引数を参照できる、こんな感じで引数を参照することをコマンドライン引数の取得というのである。
次にこのサイト
上のサイトを見るに、Node.jsではコマンドライン引数の取得には、process.argv
が使われていて

コード 入っている情報
process.argv[0] 「Node.js」のパス
process.argv[1] 実行されたプログラムのファイルのパス
process.argv[2] 引数1
process.argv[3] 引数2


こんな感じの決まりになっています。だからコマンドライン引数を取得したければまずprocess.argv[2]です。
パスとは、ファイル、フォルダの場所を示した文字列のことです

不明点3

用語でわからないのが突如大量に出現してきたので、表にまとめることにする!

用語 意味
イベント駆動型プログラミング マウスをポチポチしたり、キーボードをカタカタしたり、何か特定のことが起こったら処理をやってね!なプログラムにすること
 Stream 非同期で情報を取り扱うための概念で、情報自体ではなく情報の流れに注目すること。
アイディアとしては、データを一気に処理するのではなく、ある単位(破片)で読み込み、 後工程に回して処理するようにしたこと。「Stream を制するものは Node.jsを制す」と言われているらしい。
CSV(Comma Separated Values) カンマで区切られたデータ形式のファイル
オブジェクト指向 オブジェクト指向は「『モノ(どんな奴でどう動く)』に注目した考え方」です。
オブジェクト指向の話で登場する「オブジェクト」は「モノ」です。
この「モノ」は「属性」と「操作」の要素を持っています。デュエマのカードを想像すると良い
メソッド オブジェクト指向における、操作の部分を表す言葉。そのオブジェクトはどんな効果がを持つか。

不明点4

Node.jsのモジュールが理解不能!

const fs = require('fs');

  • node.jsでファイルアクセスをする場合には、コアライブラリに含まれる「fs」モジュールを利用する必要があります。コアライブラリに含まれるモジュールや、グローバルなモジュールを利用するには、上記のように記述します。これで、「fs」という変数名で「fs」モジュールへアクセスできるようになりました.

 

const readline = require('readline');

  • ファイルを行ごとに読み込むことができるモジュールを呼び出す。これ自体は何を意味しているかというと、readlineというオブジェクトに、readlineという(メソッド)モジュールを設定したみたいなイメージ、デュエマを思い出そう


そういえばライブラリ>モジュール>関数、メソッドの順番を忘れないように。モジュールの読み込みはこのrequireを用いて行われる。

 

const rs = fs.ReadStream('./popu-pref.csv');

  • fsモジュールの中のReadStream関数を用いて、popu-pref.csvのstreamの形にしたファイル'rs'を作成

 

const rl = readline.createInterface({ 'input': rs, 'output': {} });

  • 'rsというsteamをinputしたら{}というsteamをoutputとしてだす'メソッドをもつオブジェクトrlを作成した。

 

ここで大事なことの復習:アロー関数ってなんだっけ
こちらを参考にして答えると、arrow関数は、本来の表記では必要なfucntionを書かなくて済むようにしたもの、書き方は、(引数,...)=>{...関数の本体...}、実際に関数を実行するにはconsole.log(arrow(X))をすればいい(Xは適当に入れる)

rl.on('line', (lineString) => {
console.log(lineString);
});

  • rlのsteamのなかで、'line'というイベントが発生したら(onの部分)、(lineString) => {console.log(lineString);}という無名関数を呼んでくださいという意味。
    このlineStringには、『readlineがもともとファイルを行ごとに読み込むことができるモジュールであり、行を一単位としているので 、』 'line'というイベントが発生した時点での、その行が代入されます。


ちなみにこの'line'というイベントは何かというと、The 'line' event is emitted whenever the input stream receives an end-of-line input (\n, \r, or \r\n). This usually occurs when the user presses the Enter, or Return keys.

 

rl.resume();

  • rlというstream(これはオブジェクトの属性部分の名称)に情報を流し始める処理である、resumeを呼び出している

 

(lineString) => {
const columns = lineString.split(','); //lineStringで与えられた文字列を、カンマ(,)で分割してcolumnという配列にした
const year = parseInt(columns[0]); //columnの配列の1番目を、parseIntで文字列から整数値に変換し、yearという変数に格納した
const prefecture = columns[2];//columnの配列の3番目をprefectureという変数に格納した
const popu = parseInt(columns[7]); columnの配列の8番目を、parseIntで文字列から整数値に変換し、popuという変数に格納した
if (year === 2010 || year === 2015) {
console.log(year);
console.log(prefecture);
console.log(popu);
} }
上記の関数で、無名関数を実装した。これに意味するところをその横に付け足した。全体での意味は、'line'というイベントが発生したら、年と県と人口を表示する。
読み込むファイルは、一行に「集計年,都道府県コード,都道府県名,男女区分,0〜4歳(人),5〜9歳(人),10〜14歳(人),15〜19歳(人)。。。」となっており、これを配列の形にしたのが(多分)columnだろう

もうまじむずい玄界灘