サイトアイコン 上尾市のWEBプログラマーによるブログ

「Webプログラミングが面白いほどわかる本」の感想・備忘録2

「Webプログラミングが面白いほどわかる本」の感想・忘備録1の続き

Mapオブジェクトのソート(JavaScript ES2015)

const map = new Map();
map.set('takahashi', {sex: 'male', age: 39});
map.set('yamada', {sex: 'female', age: 22});
map.set('tanaka', {sex: 'female', age: 51});
const sortedArray = Array.from(map).sort((person1, person2) =>{
  return person1[1].age - person2[1].age;
});
console.log(sortedArray);
// Array.from(map)でMapの各アイテムを要素とした2次元配列が返却される。

timeコマンド

コマンドの実行にかかった時間を測定することができる。
time node hoge.js
real 0m0.067s
user 0m0.054s
sys 0m0.011s

real:実際の時間
user:realのうち、今の実行ユーザーとしてかかった時間
sys:システムが別なことに使った時間
プログラムの処理にかかった時間=userの時間と思えばいい。

JavaScriptのライブラリ

JavaScriptの標準オブジェクトとNode.jsのライブラリは知っておいて損はない。
以下の2つのサイトは目を通しておくと良い。

npmのrequestライブラリ

// HTTPリクエストを簡単に送ることができる。
npm install requestでインストール。
const request = require('request');
request('http://www.goole.com', (error, response, body) =>{
  console.log(body);
});

npmパッケージの作り方

新規作成したディレクトリ内でnpm -y initを実行しpackage.jsonを生成。
index.jsに関数を定義し、module.exports = {名前: 関数}; で公開する。
使用する際は、npm install ../sumのようにローカルディレクトリを指定してインストールする。
npm install sumだとnpmjs.comに登録されたsumがインストールされてしまうので注意
アンインストールはnpm uninstall sum

mkdir sum
cd sum
npm -y init
function add(x, y) {
  return x + y;
}
module.exports = {
  add: add
}
// 自作したsumライブラリを使う
const sum = require('sum');
console.log(sum.add(3, 6));

同期I/Oと非同期I/O

Node.jsはマルチプロセスやマルチスレッドではなく、シングルスレッドで非同期I/Oを実行する。
デフォルトでは非同期I/Oだが、Syncがついた同期I/O用の関数も用意されている。

const fs = require('fs');
 for (let i = 0; i < 3; i++) {
   fs.appendFile('./hoge2.csv', 'あ', 'utf8', ()=>{});
   fs.appendFile('./hoge2.csv', 'い', 'utf8', ()=>{});
   fs.appendFile('./hoge2.csv', 'う', 'utf8', ()=>{});
 }
 // 非同期I/Oのため「あいう」の順番にはならない
const fs = require('fs');
for (let i = 0; i < 3; i++) {
  fs.appendFileSync('./hoge2.csv', 'あ', 'utf8', ()=>{});
  fs.appendFileSync('./hoge2.csv', 'い', 'utf8', ()=>{});
  fs.appendFileSync('./hoge2.csv', 'う', 'utf8', ()=>{});
}
// 同期I/Oのため「あいう」の順番が保証される

MapオブジェクトをJSON形式でファイルに保存(JavaScript ES2015)

const fs = require('fs');
const map2 = new Map();
map2.set('name', '佐藤');
map2.set('age', 55);
map2.set('sex', 1);
fs.writeFileSync('hoge.json', JSON.stringify(Array.from(map2)), 'utf8');
// [ [ 'name', '佐藤' ], [ 'age', 55 ], [ 'sex', 1 ] ]
※ハッシュではなく通常配列なので、nameやageも値となる

読み込み処理

try {
  const data = fs.readFileSync('./hoge.json', 'utf8');
  const map3 = new Map(JSON.parse(data));
  console.log(map3);
} catch (e) {
  console.log(e);
}
// Mapのコンストラクタには[["キー名", 値], ["キー名", 値]]の2次元配列を渡すことができる

HTTPモジュールでWEBサーバを作成

const http = require('http');
const server = http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/plain; charset=utf-8'
  });
  res.write('あなたのユーザーエージェント:' + req.headers['user-agent']);
  res.end();
});
const port = 8000;
server.listen(port, () => {
  console.log('listening...')
});
モバイルバージョンを終了