2016年2月29日月曜日

node express ectにbootstrapを組み入れてみる

node express ectにbootstrapを組み入れてみる。

まず、次のサイトにアクセスする。

http://getbootstrap.com/


"Download Bootstrap"ボタンを押す。


"Download Bootstra"ボタンを押すとzipファイル(自分がダウンロード時のファイル名は、"bootstrap-3.3.6-dist.zip"でした。) をダウンロードする。

そして、ダウンロードしたzipファイルを解凍する。


この解凍されたcss、fonts、jsのフォルダをnodeのプロジェクトのpublicフォルダにコピーする。
nodeのプロジェクトのpublicフォルダには、はじめからjs及びcss用のフォルダとして、それぞれjavascripts、stylesheetsフォルダがあるが、今回はbootstrapのために、これらのフォルダは使用せず、ダウンロードしたzipファイルから解凍されたcss、fonts、jsのフォルダをそのまま、コピーすることにする。


コピー後


そして、今回は組み込んだbootstrapの動作確認のために、bootstrapのExsamplesにあるBootstrap themeのButtonsの部分を取り込んで正しく表示できるようにする。
* Examplesの中身を確認する方法は以下の記事を参照のこと。
  Bootstrapのサンプルを見る

Bootstrap themeのButtons部分のコードは次の通り。
これをindex.ectファイル内に組み込む。

  1. <div class="page-header">
  2. <h1>Buttons</h1>
  3. </div>
  4. <button class="btn btn-lg btn-default" type="button">Default</button>
  5. <button class="btn btn-lg btn-primary" type="button">Primary</button>
  6. <button class="btn btn-lg btn-success" type="button">Success</button>
  7. <button class="btn btn-lg btn-info" type="button">Info</button>
  8. <button class="btn btn-lg btn-warning" type="button">Warning</button>
  9. <button class="btn btn-lg btn-danger" type="button">Danger</button>
  10. <button class="btn btn-lg btn-link" type="button">Link</button>
  11. <button class="btn btn-default" type="button">Default</button>
  12. <button class="btn btn-primary" type="button">Primary</button>
  13. <button class="btn btn-success" type="button">Success</button>
  14. <button class="btn btn-info" type="button">Info</button>
  15. <button class="btn btn-warning" type="button">Warning</button>
  16. <button class="btn btn-danger" type="button">Danger</button>
  17. <button class="btn btn-link" type="button">Link</button>
  18.  
  19. <button class="btn btn-sm btn-default" type="button">Default</button>
  20. <button class="btn btn-sm btn-primary" type="button">Primary</button>
  21. <button class="btn btn-sm btn-success" type="button">Success</button>
  22. <button class="btn btn-sm btn-info" type="button">Info</button>
  23. <button class="btn btn-sm btn-warning" type="button">Warning</button>
  24. <button class="btn btn-sm btn-danger" type="button">Danger</button>
  25. <button class="btn btn-sm btn-link" type="button">Link</button>
  26.  
  27. <button class="btn btn-xs btn-default" type="button">Default</button>
  28. <button class="btn btn-xs btn-primary" type="button">Primary</button>
  29. <button class="btn btn-xs btn-success" type="button">Success</button>
  30. <button class="btn btn-xs btn-info" type="button">Info</button>
  31. <button class="btn btn-xs btn-warning" type="button">Warning</button>
  32. <button class="btn btn-xs btn-danger" type="button">Danger</button>
  33. <button class="btn btn-xs btn-link" type="button">Link</button>


いよいよ、動作確認。
ブラウザで表示すると次のようになった。組み込んだbootstrapが、正しく動いている。



今回のbootstrapの動作確認に関連あるソースコードは以下の通り。

=== app.js ===
変更部分はexpressコマンドでプロジェクト生成後にect用に変更した13〜18行目

  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('serve-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7.  
  8. var routes = require('./routes/index');
  9. var users = require('./routes/users');
  10.  
  11. var app = express();
  12.  
  13. // ECT view engine setup
  14. var ECT = require('ect');
  15. var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
  16. app.set('views', path.join(__dirname, 'views'));
  17. app.set('view engine', 'ect');
  18. app.engine('ect', ectRenderer.render);
  19.  
  20. // uncomment after placing your favicon in /public
  21. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  22. app.use(logger('dev'));
  23. app.use(bodyParser.json());
  24. app.use(bodyParser.urlencoded({ extended: false }));
  25. app.use(cookieParser());
  26. app.use(express.static(path.join(__dirname, 'public')));
  27.  
  28. app.use('/', routes);
  29. app.use('/users', users);
  30.  
  31. // catch 404 and forward to error handler
  32. app.use(function(req, res, next) {
  33.     var err = new Error('Not Found');
  34.     err.status = 404;
  35.     next(err);
  36. });
  37.  
  38. // error handlers
  39.  
  40. // development error handler
  41. // will print stacktrace
  42. if (app.get('env') === 'development') {
  43.     app.use(function(err, req, res, next) {
  44.         res.status(err.status || 500);
  45.         res.render('error', {
  46.             message: err.message,
  47.             error: err
  48.         });
  49.     });
  50. }
  51.  
  52. // production error handler
  53. // no stacktraces leaked to user
  54. app.use(function(err, req, res, next) {
  55.     res.status(err.status || 500);
  56.     res.render('error', {
  57.         message: err.message,
  58.         error: {}
  59.     });
  60. });
  61.  
  62. module.exports = app;


=== index.js ===
変更部分はなし。expressコマンドでプロジェクト生成後のそのまま。ただ載せているだけ。

  1. var express = require('express');
  2. var router = express.Router();
  3.  
  4. /* GET home page. */
  5. router.get('/', function(req, res, next) {
  6.     res.render('index', { title: 'Express' });
  7. });
  8.  
  9. module.exports = router;


=== error.ect ===
ectのエラー出力のためのテンプレート。bootstrapとは関係ない。ただ載せているだけ。

  1. <html>
  2. <head>
  3.     <title>Error <%= @error.status %>>/title>
  4. </head>
  5. <body>
  6. <span>
  7.     Error Status: <%= @error.status %>
  8.     <hr />
  9.     <pre><%= @error.stack %></pre>
  10. </span>
  11. </body>
  12. </html>


=== footer.ect ===
ectのフッター部分のテンプレート。bootstrapとは関係ない。ただ載せているだけ。

  1. <div id="footer">
  2. <div class="left">
  3. Generated by ECT</div>
  4. <% content 'footer-info' %>
  5. </div>


=== index.ect ===
また、ExapmlesのButtons部分を取り込んでいる。8〜46行目

  1. <% extend 'layout' %>
  2.  
  3. <%= "This is sample" %>
  4.  
  5. <h1>
  6. <%= @title %></h1>
  7. Welcome to <%= @title %>
  8.  
  9.  
  10.  
  11. <div class="page-header">
  12. <h1>
  13. Buttons</h1>
  14. </div>
  15. <button class="btn btn-lg btn-default" type="button">Default</button>
  16. <button class="btn btn-lg btn-primary" type="button">Primary</button>
  17. <button class="btn btn-lg btn-success" type="button">Success</button>
  18. <button class="btn btn-lg btn-info" type="button">Info</button>
  19. <button class="btn btn-lg btn-warning" type="button">Warning</button>
  20. <button class="btn btn-lg btn-danger" type="button">Danger</button>
  21. <button class="btn btn-lg btn-link" type="button">Link</button>
  22.  
  23. <button class="btn btn-default" type="button">Default</button>
  24. <button class="btn btn-primary" type="button">Primary</button>
  25. <button class="btn btn-success" type="button">Success</button>
  26. <button class="btn btn-info" type="button">Info</button>
  27. <button class="btn btn-warning" type="button">Warning</button>
  28. <button class="btn btn-danger" type="button">Danger</button>
  29. <button class="btn btn-link" type="button">Link</button>
  30.  
  31. <button class="btn btn-sm btn-default" type="button">Default</button>
  32. <button class="btn btn-sm btn-primary" type="button">Primary</button>
  33. <button class="btn btn-sm btn-success" type="button">Success</button>
  34. <button class="btn btn-sm btn-info" type="button">Info</button>
  35. <button class="btn btn-sm btn-warning" type="button">Warning</button>
  36. <button class="btn btn-sm btn-danger" type="button">Danger</button>
  37. <button class="btn btn-sm btn-link" type="button">Link</button>
  38.  
  39. <button class="btn btn-xs btn-default" type="button">Default</button>
  40. <button class="btn btn-xs btn-primary" type="button">Primary</button>
  41. <button class="btn btn-xs btn-success" type="button">Success</button>
  42. <button class="btn btn-xs btn-info" type="button">Info</button>
  43. <button class="btn btn-xs btn-warning" type="button">Warning</button>
  44. <button class="btn btn-xs btn-danger" type="button">Danger</button>
  45. <button class="btn btn-xs btn-link" type="button">Link</button>
  46.  
  47. <% block 'footer-info' : %>
  48. <div class="right">
  49. page: sample</div>
  50. <% end %>


=== layout.ect ===
ectのレイアウト外枠。
以下のbootstrapのテンプレート部分(http://getbootstrap.com/getting-started/#download に載っている。)を取り込んでいる。5、6、8〜10行目


  1. <!DOCTYPE html>
  2. <html>
  3.     <head>
  4.         <meta charset="utf-8">
  5.         <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.         <meta name="viewport" content="width=device-width, initial-scale=1">
  7.         <title><%- @title %></title>
  8.         <link href="css/bootstrap.min.css" rel="stylesheet">
  9.         <% include 'script' %>
  10.         <script src="js/bootstrap.min.js"></script>
  11.     </head>
  12.     <body>
  13.         <% content %>
  14.         <% include 'footer' %>
  15.     </body>
  16. </html>


=== script.ect ===
ectのscriptタグ部分箇所。bootstrapを動作させるために必要なjqueryの読み込みを定義。また、bootstrapsのjsの定義より前の行に定義する必要あり。

  1. <script src="./javascripts/jquery-2.1.4.min.js"></script>


=== package.json ===
bootstrapとは関係ない。ただ載せているだけ。

  1. {
  2.     "name": "bootstrap",
  3.     "version": "0.0.0",
  4.     "private": true,
  5.     "scripts": {
  6.         "start": "node ./bin/www"
  7.     },
  8.     "dependencies": {
  9.         "body-parser": "~1.13.2",
  10.         "cookie-parser": "~1.3.5",
  11.         "debug": "~2.2.0",
  12.         "express": "~4.13.1",
  13.         "jade": "~1.11.0",
  14.         "morgan": "~1.6.1",
  15.         "serve-favicon": "~2.3.0"
  16.     }
  17. }

2016年2月28日日曜日

Bootstrapのサンプルを見る

Bootstrapのサンプル(Examples)を見てみる。

ブラウザで、以下のサイトを開く。

http://getbootstrap.com/getting-started/#download



"Get the source code for every example below by downloading the Bootstrap repository. Examples can be found in the docs/examples/ directory."

と書いてあるので、"downloading the Bootstrap repository" のリンクより、zipファイルをダウンロードする。(自分がダウンロード時のファイル名は、 "bootstrap-3.3.6.zip" でした。)

そして、ダウンロードしたzipファイルを解凍する。
それで、上記のスクリーンショットのサンプル(Examples)はどこかにあるかというと、 "Examples can be found in the docs/examples/ directory." と書いていある通りに、zipファイルから、解凍した後の docs/examplesにサンプル(Examples)があるので見てみる。

* Starter template の場合

  zipファイルから解凍した後の docs/examples/starter-template/index.html なので、このファイルを開くと、Starter template のサンプル(Examples)が、ブラウザに表示される。




* Bootstrap theme の場合

  zipファイルから解凍した後の docs/examples/theme/index.html なので、このファイルを開くと、Bootstrap theme のサンプル(Examples)が、ブラウザに表示される。



なので、http://getbootstrap.com/getting-started/#download の Examples の見てみたいサンプル(Examples)は、zipファイルから解凍した後の docs/examples 以下のそれらしいフォルダ名以下のindex.htmlを開くと見ることができる。

2016年2月27日土曜日

無人走行車

近い未来、無人走行車が普及したら、自動車を運転する人はいなくなる。
そして、人間が自動車を運転することが、一番交通事故が起こる可能性が高くなると考えられるので、当然、規制が掛かる。
次の記事に、無人走行車に関してのことを見かけて、考えてみたんだ。

車の運転はもうすぐ違法になる

無人走行車が普及したら、全てでないが、減ってしまったり、なくなるものを思い浮かぶ。
タクシー、トラックの運転手。自動車事故の保険、自動車学校など。

F1は多分、なくならないだろうな。エンターテイメントだもんな。

そして、自動車免許がなくなったら、身分証明書は保健書、パスポートとかで代替なのか。
てか、身分証明書は技術が進歩したら、顔認識、指紋認識で良いと思うし。
また、自動車免許の更新しなくてよくなるね。
飲酒運転なくなるよ。飲み会にマイカーで行って、マイカーで帰れるよ。

趣味がドライブの人は、趣味が奪われるよ。

無人走行車、世の中を激変させるよ。




Fintechはブルーカラー臭がしない

最近、Fintechって言葉をよく見ますね。
今年の流行ワードでしょ。

ググるとこのような記事が見当たります。

FinTechが金融を変える・・・なぜFinTechが注目されるのか

Fintechは金融ビジネスを一変させる―2016年の予測、トップ4

ここらで世界一わかりやすく「FinTechとは何か」を説明しよう。

今までに、あったもしくは、近未来になるであろう技術を再定義した
ような言葉な感じですね。少なくとも自分にはそう思う。
データマイニング、Web2.0といった言葉のように・・・

ちなみに、WikiPediaの説明には、次のように書いてます。

Fintech

--------------------------------
Fintech(フィンテック、FinTech、Financial technology)とは、情報技術(IT)を駆使して金融サービスを生み出したり、見直したりする動きのことである。1990年代から使われてきた言葉で、2003年からは米国の業界紙アメリカン・バンカー(英語版)が「Fintech 100」と題する業界番付を発表したとされるが、2014年には米国における投資額が前年比約3倍の9887万ドルに達するなどして注目を集めた。 外部に公開した形で開発されることもあるため、オープンイノベーションの一環であるともされる。
--------------------------------

やっぱ、昔からあったのか。
わたくしは、プログラマーやっていてね。ITの専門家とかITコンサルタントとか
頭のいい人の言葉はどうもピンとこないね。ホワイトカラーでなくブルーカラー的なことをずっとやってきたから。
まぁ、ブルーカラーとかホワイトカラーとか分類分けするのもナンセンスだとは思うけど。文系とか理系みたいに。
とにかく、流行ワードが、今まで、役に立ったこととかほとんどないと思う。
泥臭くプログラム書いているんですよ。

会社のお偉いブチョーとかが、これからは、Fintechだとか言って、振り回される人とかいたりしたら悲惨ですね。

今のところ、自分の職場でFintechだ。とかは聞いたことない。
世間はどうなんでしょ。

2016年2月26日金曜日

Apple vs FBI

最近、AppleのiPhoneのアンロックをFBIが要求している件についてよく見たり聞いたりするが、思ったのはやっぱ、Appleすごいよなと。
やっぱ、日本だとこれだけメディアとかで目立つと、途端に掌を変えたりするのだが、
アメリカの企業というのもあるが、自分たちが作ったプロダクト及びサービスにポリシーを大事にしているでしょうね。
でも、ここでAppleが折れたら、Appleを信用が減るのではと思うが。
ともあれ、関心したわけです。

次の記事に書いてあるが、Apple vs FBIの支持はフィフティフィフティといったとこみたいです。

AppleのiPhoneパスワードのアンロック問題でアメリカ人の過半数はFBIを支持(ピュー・リサーチ調べ)

ですが、後で考えを改めた。

なぜか!

次の記事でビル・ゲイツが本件について、言及してるが

ビル・ゲイツ、 「Apple対FBI」に関する発言を明確化。予防措置と議論を求める

「Appleはサンバーナーディーノの銃乱射犯のiPhoneをアンロックすべきだ」と。

なぜなら

「これは政府が情報へのアクセスを求める個別の事例だ」
「汎用ツールを要求しているのではなく、固有のケースだ」
「これは、誰でも電話会社に情報を要求したり、銀行に取引記録を要求したりできることと変わりはない」
「銀行がハードディスクにリボンをかけて『これを切れと言うな、なぜなら今後何度も切れというだろうから』と言うようなものだ」

これを見て、ビル・ゲイツの意見の方がごもっともと思った。
本記事の冒頭では、Appleに対して関心したと言っているが
よくよく考えてると極端に考えすぎていたなと思った。

2016年2月24日水曜日

ドローンの固定翼機ってあったんだ。

ネットサーフィンしてたら、次の記事でドローンの固定翼機のことが書いてあった。

コプター型と固定翼型のドローンは何が違う?

今まで、ドローンって、コプター型のものしかないって思っていた。
もう、完全にヘリコプターって感じ。

ちなみ、「ドローン 種類」のキーワードでググった後の
記事の内容も固定翼機のことなんて見当たらない。
あっても、トライコプター(ローター[回転翼]が3つのドローン)、クアッドコプター(ローター[回転翼]が4つのドローン)、ヘキサコプター(ローター[回転翼]が6つのドローン)、オクトコプター(ローター[回転翼]が8つのドローン)とかのコプター型のことが書いてある。

「ドローン 固定翼」でググると固定翼機のことがでてくるね。
どうやら、CES2016で、Parrot社がDiscoっていう固定翼機を出展したとか、
最高時速80kmとか、今年に販売予定だとか。
次の記事に書いてあるが
このParrot社って、固定翼機のみならず、ラジコンみたいなドローン(タイヤが付いていて地上を走行?)とか、水陸両用のドローンも作っているのか。

Parrot社から固定翼型ドローン発表!プロペラが無くてもドローン?

個人的には、コプター型より固定翼機の方が見た感じは好きだな。
コプター型より固定翼機の機能的比較は、冒頭の記事に書いてあるが
離着陸はコプター型に利点あるけど、スピード、飛行時間、耐久性などは固定翼機の方が
優れているみたいだ。


2016年2月23日火曜日

node express POSTのデータの送信と受信

node express ectでクライアントからサーバにPOSTでデータの送信と受信する処理をプログラミングしてみました。formのsubmitからの送信の場合とjQueryを使用して送信した場合です。

node expressのプロジェクトを生成して自分自身がプログラミングしたソースは次の通りです。(※実際はindex.ect以外のectファイルの編集もしていますが、今回の記事の内容と関係ないので割愛します。)

=== app.js ===
今回、クライアントから受信するPOSTデータをサーバ側で処理するプログラム(sendreceive.js)を紐つけています。(9、29行目)
  1. var express = require('express');
  2. var path = require('path');
  3. var favicon = require('serve-favicon');
  4. var logger = require('morgan');
  5. var cookieParser = require('cookie-parser');
  6. var bodyParser = require('body-parser');
  7.  
  8. var routes = require('./routes/index');
  9. var sendreceive = require('./routes/sendreceive');
  10.  
  11. var app = express();
  12.  
  13. // ECT view engine setup
  14. var ECT = require('ect');
  15. var ectRenderer = ECT({ watch: true, root: __dirname + '/views', ext: '.ect'});
  16. app.set('views', path.join(__dirname, 'views'));
  17. app.set('view engine', 'ect');
  18. app.engine('ect', ectRenderer.render);
  19.  
  20. // uncomment after placing your favicon in /public
  21. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  22. app.use(logger('dev'));
  23. app.use(bodyParser.json());
  24. app.use(bodyParser.urlencoded({ extended: false }));
  25. app.use(cookieParser());
  26. app.use(express.static(path.join(__dirname, 'public')));
  27.  
  28. app.use('/', routes);
  29. app.use('/sendreceive', sendreceive);
  30.  
  31. // catch 404 and forward to error handler
  32. app.use(function(req, res, next) {
  33.     var err = new Error('Not Found');
  34.     err.status = 404;
  35.     next(err);
  36. });
  37.  
  38. // error handlers
  39.  
  40. // development error handler
  41. // will print stacktrace
  42. if (app.get('env') === 'development') {
  43.     app.use(function(err, req, res, next) {
  44.         res.status(err.status || 500);
  45.         res.render('error', {
  46.             message: err.message,
  47.             error: err
  48.         });
  49.     });
  50. }
  51.  
  52. // production error handler
  53. // no stacktraces leaked to user
  54. app.use(function(err, req, res, next) {
  55.     res.status(err.status || 500);
  56.     res.render('error', {
  57.         message: err.message,
  58.         error: {}
  59.     });
  60. });
  61.  
  62.  
  63. module.exports = app;

=== sendreceive.js ===
クライアントから受信したデータ"sendParam"を、クライアントにJSONのデータに含めて、送信しています。(6行目)
  1. var express = require('express');
  2. var router = express.Router();
  3.  
  4. /* POST ajax listing. */
  5. router.post('/', function(req, res, next) {
  6.     res.send({"send parameter is" : req.body.sendParam});
  7. });
  8.  
  9. module.exports = router;

=== index.ect ===
formのsubmitして送信する場合は、"from form" を送信するようにしています。 (14行目)
jQueryを使用して送信する場合は、"from ajax" を送信するようにしています。 (36行目)
  1. <% extend 'layout' %>
  2.  
  3. <%= "This is sample" %>
  4.  
  5.  
  6. <div id="drag-area" style="background-color: lightgrey; text-align: center;">
  7. ajaxボタン送信ボタンを押すと、ajax送信します。<br />
  8. <div class="btn-group">
  9. <button id="btn">ajax送信</button>
  10. </div>
  11. </div>
  12. <form action="/sendreceive" method="post" name="frm">
  13. <input name="sendParam" type="hidden" value="from form" />
  14.     >input type="submit" value="form送信" />
  15. </form>
  16. <div id="test">
  17. </div>
  18. <% block 'footer-info' : %>
  19. <div class="right">
  20. page: sample</div>
  21. <script>
  22.  
  23. $(function(){
  24.     $('#btn').click(function() {
  25.         sendData();
  26.     });
  27. });
  28.  
  29. function sendData() {
  30.  
  31.     $.ajax({
  32.         url: "http://" + location.host + "/sendreceive",
  33.         type: "post",
  34.         data: {"sendParam": "from ajax"},
  35.         success: function(data) {
  36.             alert("データが送信されました。 : " + JSON.stringify(data));
  37.         }
  38.     });
  39. }
  40.  
  41. </script>
  42. <% end %>

また、後でメモとして見返すことを考えて、package.jsonも載せておきます。

=== package.json
  1. {
  2.     "name": "xxx",
  3.     "version": "0.0.0",
  4.     "private": true,
  5.     "scripts": {
  6.         "start": "node ./bin/www"
  7.     },
  8.     "dependencies": {
  9.         "body-parser": "~1.13.2",
  10.         "cookie-parser": "~1.3.5",
  11.         "debug": "~2.2.0",
  12.         "express": "~4.13.1",
  13.         "jade": "~1.11.0",
  14.         "morgan": "~1.6.1",
  15.         "serve-favicon": "~2.3.0",
  16.         "node-stringify": "0.0.19"
  17.     }
  18. }

動作確認したスクリーンショットは次の通りです。

*初期画面表示時
 jQueryを使用しての確認は"ajax送信"ボタンを押下して確認します。
 formのsubmitからの確認は"form送信"ボタンを押下して確認します。





*"ajax送信"ボタンを押下後




*"form送信"ボタンを押下後


2016年2月8日月曜日

node Readable readメソッドの戻り値のバッファについて

nodeのReadableオブジェクトのreadメソッドですが、
readメソッドの引数には、readメソッド実行結果のバッファのバイト数を設定することができるのですが、このバッファの値は、どのように設定されるのか確認してみました。

さて、確認方法ですが、以前にnodeのファイルアップロード処理の記事を書きましたが、
そのファイルアップロードされた内容をReadableオブジェクトのreadメソッドで取得してみました。

ファイル内容は次の通りです。
=== test.txt ===

  1. abc


そして、app.jsで今回、確認でコーディングした部分です。(app.js全体でなく、該当部分のみです。)
=== app.js ===

  1. var fs = require('fs');
  2.  
  3. app.post('/up', upload.single('upFile'), function (req, res, next) {
  4.     var readableStream = fs.createReadStream(req.file['path']);
  5.     readableStream.on('readable', function() {
  6.         var chunk;
  7.         while (null !== (chunk = readableStream.read(8))) {
  8.             console.log('chunk[' + chunk + ']');
  9.             for (var i = 0; i < chunk.length; i++) {
  10.                 console.log("chunk[" + i + "] = " + chunk[i] + " : chunk[" + i + "].toString(16) = " + chunk[i].toString(16));
  11.             }
  12.  
  13.         }
  14.     });
  15.     res.render('index');
  16. });


実行結果は、次の通りです。

  1. chunk[abc
  2. ]
  3. chunk[0] = 97 : chunk[0].toString(16) = 61
  4. chunk[1] = 98 : chunk[1].toString(16) = 62
  5. chunk[2] = 99 : chunk[2].toString(16) = 63
  6. chunk[3] = 227 : chunk[3].toString(16) = e3
  7. chunk[4] = 129 : chunk[4].toString(16) = 81
  8. chunk[5] = 130 : chunk[5].toString(16) = 82
  9. chunk[6] = 10 : chunk[6].toString(16) = a

readメソッドの実行結果のバッファそのものは、ファイル内容の文字列そのものです。
そして、そのバッファを1つずつ、取り出した内容ですが
"a"の文字は、97になっています。これは、UTF8のaを10進数にしているから、97なのです。なので、16進数だと、61ですね。
ちなみに、"あ"の文字の場合は、3バイトなので、16進数だと、e3,81,82になります。
この場合、繰り返しますが、1文字3バイトです。
なので、バッファリング後に文字列処理がある場合を考慮して
バッファリングする時に、文字コードを判定して、1文字に何バイトかの判断が必要になります。
例えば、"あ"の文字の場合に、e3,81のみで、82を次の文字と判断したらいけないです。
e3,81,82です。