express

Expressは、Node.jsにおける軽量Webアプリケーションフレームワーク

Express - Node.js Web アプリケーション・フレームワーク
ゼロからはじめるExpress + Node.jsを使ったアプリ開発 - Qiita

これで簡易Webサーバを作ってみる。

これまでは、グローバルでインストール(npm install -g)が多かったが、ここではローカルインストールとする。
まずは、npm initでローカルパッケージ管理できるようにする。

$ pwd
/home/bg1/project/cloud/github.com/Sample/express/express/express/src/express_
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (express_) express_
version: (1.0.0) 1.0.0
description: express sample
entry point: (index.js) index.js
test command: test
git repository: -
keywords: -
author: B.G
license: (ISC) MIT
About to write to
/home/bg1/project/cloud/github.com/Sample/express/express/express/src/express_/package.json:

{
  "name": "express_",
  "version": "1.0.0",
  "description": "express sample",
  "main": "index.js",
  "scripts": {
    "test": "test"
  },
  "repository": {
    "type": "git",
    "url": "-"
  },
  "keywords": [
    "-"
  ],
  "author": "B.G",
  "license": "MIT"
}


Is this OK? (yes) yes
$

mainはとりあえずindex.jsにしておく。
これでpackage.jsonができたとおもうので、Expressをインストール。

$ npm install express
npm notice created a lockfile as package-lock.json. You should commit this file.
+ express@4.16.4
added 48 packages from 36 contributors and audited 121 packages in 4.512s
found 0 vulnerabilities

$ ls
node_modules  package-lock.json  package.json
$

では、index.jsを書く。

requireで取得したexpressはこれ自体が関数の参照になっていて、express()でappオブジェクトが取得できる。
あとは、app.getで、「GETの'/'でアクセスしてきたら'ABCDE'を返す」、といったようなリクエストルーティングが簡単に書ける。
あとは、app.listenで3000番でリッスンする。

$ vi index.js
$ node index.js
Listen port number 3000

あとはlocalhostの3000にアクセスする。

expressサーバ
expressサーバ

このように'ABCDE'を返す簡易Webサーバができた。

Sample/express/express/express/src/express_ at master · bg1bgst333/Sample · GitHub

GetWindowRect

GetWindowRectは、ウィンドウの矩形情報(位置情報やサイズ)を取得する。

GetWindowRect function | Microsoft Docs

WindowProcのWM_MOVE、WM_SIZEで、

GetWindowRectで、スタティックなRECT構造体rcWndにウィンドウの矩形情報を格納する。
デスクトップ画面の左上を原点とするスクリーン座標で左端、上端、右端、下端、の位置が格納される。
そのあとに、InvalidateRectで画面を更新。

WM_PAINTは、

テキストは赤にして、各メンバを文字列に変換して、TextOutで描画している。
InvalidateRectのたびに呼び出されるので、ウィンドウを動かしたり、ウィンドウをリサイズするたびに値が反映される。

実行直後
実行直後

実行直後にこうだとして、ウィンドウを左上に移動させると、

左上に移動
左上に移動

左上が原点なので、全体的に数値は小さくなる。

右下に拡大
右下に拡大

右下に引っ張って、ウィンドウを大きくすると、leftとtopは変わらないが、rightとbottomは大きくなる。

少し右に移動
少し右に移動

少し右に移動すると、leftとrightが少し増える。

Sample/winapi/GetWindowRect/GetWindowRect/src/GetWindowRect at master · bg1bgst333/Sample · GitHub

http

httpは、http関連モジュール。

HTTP | Node.js v11.10.1 Documentation

httpモジュールで、簡易的なWebサーバを作成する。

requireでhttpモジュール参照を取得したら、http.createServerでサーバソケットを作成。
res.writeHeadで、HTTPステータスコードに200、ヘッダ内容は、Content-Typeでtext/plainを指定するだけでいい。(この部分はJSONで随時追加していく。)
res.endでレスポンスは終わるが、そこに最後のHTTPボディメッセージが渡せるので'ABCDE\n'と渡して終わる。
で、そのままポート番号3000番でlistenし、リッスン出来たら、'Local Server Listen'を出力。

$ vi http.js
$ node http.js
Local Server Listen

実行すると、このように待ち受け状態になるので、ブラウザでhttp://localhost:3000/にアクセスすると、

簡易Webサーバ
簡易Webサーバ

'ABCDE'が表示される。
(ただし、しばらくポート占有しっぱなしなので、再度サーバ起動してもlistenできない。この辺の対策はいずれ・・・。)

Sample/nodejs/http/http/src/http at master · bg1bgst333/Sample · GitHub

SetBkMode

SetBkModeは、テキストの背景モード(背景色を描画するか、背景は透過にするか)を設定する。

SetBkMode function | Microsoft Docs

WindowProcのWM_PAINTで、

背景は青、テキストは赤で、TextOutで(50, 50)の位置に描画した後、SetBkModeでTRANSPARENT(透過)にして、TextOutで(50, 100)の位置に再び描画する。

2つ目のテキストは背景なし
2つ目のテキストは背景なし

1つ目のテキストは背景の青が描画されているが、2つ目のテキストは背景が透過されているので、白いままである。

Sample/winapi/SetBkMode/SetBkMode/src/SetBkMode at master · bg1bgst333/Sample · GitHub

fs.open

fs.openで、ファイルを開く。

File System | Node.js v11.10.1 Documentation

fs.openは非同期処理になっていて、開いた結果に対する処理はコールバックやラムダ式で書く。
前回は、開くことに成功したが、失敗した場合はどうなるか。

errがtrueなら、"fs.open error!"を出力してみる。

$ vi fs.js
$ ls
fs.js
$ node fs.js
fs.open error!
/home/bg1/project/cloud/github.com/Sample/nodejs/fs/open/src/fs/fs.js:14
    throw err;    // throwでerrを投げる.
    ^

Error: ENOENT: no such file or directory, open 'test.txt'
$

test.txtを作らずに実行したら、fs.openに失敗して、"fs.open error!"を出力して、このようになった。
まあ、これであってるのかわからないが。

Sample/nodejs/fs/open/src/fs at master · bg1bgst333/Sample · GitHub

SetBkColor

SetBkColorは、TextOutなどでテキストを描画するときの背景となる部分の色を設定する。

SetBkColor function | Microsoft Docs

WindowProcのWM_PAINTで、

背景色は青をセットする。
テキストの描画色はこれまで通り赤をセット。

背景は青
背景は青

このように背景は青になった。

Sample/winapi/SetBkColor/SetBkColor/src/SetBkColor at master · bg1bgst333/Sample · GitHub

fs

fsは、ファイルシステム関連モジュール。

File System | Node.js v11.10.1 Documentation

fsモジュールでファイル'test.txt'を開く。

fs.openで'test.txt'を読み込み専用の'r'で開く。
非同期処理になっていて、結果の処理はラムダ式に書く。
エラーが発生したら、errに詳細が格納されるのでerrがtrueなら、例外としてerrを投げる。
そうでない場合は、console.logで"fs.open success!"を出力。
そのあと、fs.closeでファイルディスクリプタfdを閉じる。
これも非同期処理になっていて、結果の処理はラムダ式に書く。
ここもエラーが発生したら、例外としてerrを投げる。

$ vi fs.js
$ vi test.txt
$ ls
fs.js  test.txt
$ cat test.txt
ABCDE
$ node fs.js
fs.open success!
$

test.txtがあれば、このようにファイルを開くことに成功する。

Sample/nodejs/fs/fs/src/fs at master · bg1bgst333/Sample · GitHub