update
cat /etc/redhat-release
yum update
history
shopt
vi /etc/profile.d/history.sh

HISTTIMEFORMAT='%F %T '
HISTSIZE=100000
HISTFILESIZE=100000
HISTIGNORE='history:pwd:ls:ls *:ll:w:top:df *'      # 保存しないコマンド
PROMPT_COMMAND='history -a; history -c; history -r' # 履歴のリアルタイム反映
timezone
ll /etc/localtime
timedatectl
date

timedatectl set-timezone Asia/Tokyo
apache
systemctl status apache
systemctl status httpd

yum install epel-release
yum install https://repo.ius.io/ius-release-el7.rpm

vi /etc/yum.repos.d/epel.repo
vi /etc/yum.repos.d/ius.repo
enabled=0

yum install centos-logos.noarch mailcap openldap-devel expat-devel libdb-devel openssl perl
yum --enablerepo=epel install nghttp2 brotli
yum install --disablerepo=base,extras,updates --enablerepo=ius httpd httpd-devel mod_ssl
yum list | grep httpd
systemctl start httpd
systemctl enable httpd.service

httpd -h
httpd -S
httpd -t -D DUMP_VHOSTS
httpd -t -D DUMP_RUN_CFG
httpd -v
httpd -V
httpd -l
httpd -t -D DUMP_MODULES
httpd -M
httpd -t -D DUMP_INCLUDES

ll /var/log/httpd/
less /etc/logrotate.conf
less /etc/logrotate.d/httpd

mkdir /var/www/html/php
chmod 777 /var/www/html/php/
ps aux | grep httpd
systemctl reload httpd
systemctl status httpd
systemctl restart httpd
systemctl status httpd
php5.4
yum info php
rpm -q --changelog php | grep CVE | less

yum install php
php -v
php -r 'phpinfo();'  | less
php modules
php -m | less
yum list --enablerepo=epel | grep php | less
yum install php-bcmath
php -m | less

vi bcmath.php
php bcmath.php
vi gettext.php
php gettext.php
vi gettext.php
php /var/www/html/php/phpinfo.php | less
yum list --enablerepo=epel | grep php | less
yum install php-pgsql
vi postgresql.php
php postgresql.php
mkdir php
vi *.php php/.
mv *.php php/.

php -m | less
yum install --enablerepo=epel php-pecl-redis
php -m | less
vi redis.php
php redis.php
php -m | less
postgresql13
yum install postgresql
yum install centos-release-scl
yum repolist -q
yum repolist all | less
vi /etc/yum.repos.d/CentOS-SCLo-scl.repo
vi /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
↓
enabled=0

yum repolist all | less
yum repolist -q
yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install postgresql13-contrib
yum install postgresql13-devel

yum repolist -q
yum install --enablerepo=epel postgresql13-devel
systemctl enable postgresql-13.service
ll /var/lib/pgsql/13/data/
PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" /usr/pgsql-13/bin/postgresql-13-setup initdb
ll /var/lib/pgsql/13/data/
su - postgres

vi /var/lib/pgsql/.pgsql_profile
↓
PATH=/usr/pgsql-13/bin:$PATH
export PATH

which psql
psql -v
psql --version
/usr/pgsql-13/bin/psql --version
ls /bin/psql
ll /bin/psql
ll /etc/alternatives/pgsql-psql
pg_ctl
source .bash_profile

psql -l
psql -U postgres
createuser --login --pwprompt centos
createdb --owner=centos centos
systemctl start postgresql-13
ps aux | grep master
psql -U postgres
psql -l
redis6.2
yum list | grep redis
yum list --enablerepo=epel | grep redis
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
vi /etc/yum.repos.d/remi.repo
vi /etc/yum.repos.d/remi-safe.repo
↓
enabled=0

yum info --enablerepo=epel,remi redis
yum install --enablerepo=epel,remi redis
less /usr/lib/systemd/system/redis.service
systemctl status redis
systemctl enable redis
systemctl status redis
ps aux | grep redis
systemctl start redis
ps aux | grep redis
redis-cli ping
systemctl status redis

less /etc/logrotate.d/redis
pure-ftpd1.0.43
yum list | grep pure | less
yum list --enablerepo=epel | grep pure | less
cat /etc/redhat-release
yum update centos-release
→アップデート無し

yum repolist all | less
yum info --enablerepo=C7.0.1406-base pure-ftpd
yum search --enablerepo=C7.0.1406-base ftp
yum search ftp | less
yum install pure-ftpd
yum repolist all | less
yum list --enablerepo=epel | grep pure

cd /usr/local/src/
yum install wget
wget https://download.pureftpd.org/pub/pure-ftpd/releases/obsolete/pure-ftpd-1.0.43.tar.gz
tar xvzf pure-ftpd-1.0.43.tar.gz
cd pure-ftpd-1.0.43
yum install gcc
yum install openssl-devel
./configure --with-everything --with-paranoidmsg --without-capabilities --with-virtualchroot --with-uploadscript --with-tls
make
make install

https://gist.githubusercontent.com/zrong/c9588a17ccb15e75fdf7/raw/a24c563bfe0cdc238952ce24f560a8de42631c0f/pure-ftpd.sh

systemctl status pure-ftpd
cp configuration-file/pure-ftpd.conf /etc/.
cp configuration-file/pure-config.py /usr/local/bin/.
vi /etc/init.d/pure-ftpd
chmod 755 /etc/init.d/pure-ftpd
chmod 755 /usr/local/bin/pure-config.py
/etc/init.d/pure-ftpd start
ps aux | grep pure
yum install ftp
ftp localhost
java1.8.0
yum list | grep java | less
yum install java-1.8.0-openjdk
java -version
node.js14
yum list --enablerepo=epel | grep node | less
curl -fsSL https://rpm.nodesource.com/setup_14.x | bash -
vi /etc/yum.repos.d/nodesource-el7.repo
yum list | grep node
yum list | grep node | less
yum install nodejs
node -v
npm install forever -g
vi index.js
node index.js
forever start index.js
ll
vi node.js
mkdir node.js
mv index.js node.js/.

解説記事は色々流れているけど、実際に触ってみないと覚えないので。

歴史の整理

async / await は Promiseと関連している。まず、時系列を整理。

  • 昔の Node では Promise が独自実装されており。2010年頃 deprecate された、という話がある。
  • Node.js v0.11.13 より、ES2015/ES6 Promise が利用可能に
  • Node.js v7 より ES2017/ES7 async/await が利用可能に。

Promise

async / await を理解するにあたってはまずPromiseから。
例えば次のようなHTTPリクエストの非同期処理を考える。

 

この例では、★1まで処理が進行して関数を抜けてしまってから、★2が実行される。
node.js の イベントループモデルはそもそもがそういうものなのだけど、
やっぱり同期処理的に書いたり処理した方がいいよね、ということで可能にしたのがPromiseで、
次のように既存処理を括って書ける。

この場合、★1まで処理が進行した後、★2で応答を返すまで Promise が処理を返さない。
★2が実行されると、★3以降の処理が実行される、というもの。
ちなみに、上記の例で、呼び出し側は次のようになる。

 

async/await

async/awaitは、上記 Promise の呼び出しを簡略化して、
かつ、処理の流れ自体を同期化する仕組み。

async

async の簡単な説明、

  • async をつけた関数は、Promiseを返す
  • async function が return した場合、Promise は戻り値を resolve する。
  • async function が 例外等を throw した場合、Promise は、それを reject する。

要は、既存の関数をそのまま、同期処理に変えることができる。
しかし、ポイントがあって、あくまで「その関数」内の return / throw に作用するので、上記に示したような、ライブラリのコールバックには対応できない。(と思う)
なので、async で Promise 実装を簡潔化しよう、と思っても、Promise は残らざるを得ない。(はず)
※ async function って、「非同期で処理される関数です」じゃなくて、「非同期処理を含む関数(だけどPromiseで同期的に処理できる)です」ってことですね。ちょっと混乱した。

await

対して、await。

  • async function 内でしか使えない。
  • await を指定した関数の Promise が返却されるまで処理を待機する。

なので、await で同期的に待つ、という事をしたい場合は、その関数自身が async function である必要があり、
つまりは、Promise を返すことになり、つまりは、同期的に処理されうる関数になる。
なので、await で待つことを決めた時点で、その関数は同期的な関数になり、その関数が async function になることで、その上位の関数にも、同期関数になるかどうかの選択を与える、という連鎖が続く。
これが最上位まで続くと、そのコールスタック全てが同期的に処理されることが、言語的に保証される。
というものなんだな、という理解。
Promise を待つ場合、従来の then, catch が使えるので、await を使う必要は必ずしも無いが、処理を簡潔にさせる等の理由で使うという判断ができる。
上記の呼び出し例は、await を使うと、次のように書ける。

 

エラー処理のために、try – catch も、Promise 同様に then, catch を使うこともできるが、
catch を使った方が処理が簡潔に書ける。

 

async/await の伝搬

async function にすると、Promise が返されるので、呼び出し元では、await 等の Promise 的な処理を行う必要がある。なので、非同期処理が無いにも関わらず、async 化しておくのは無駄のように見える。
async/await モデルにおいては、async function にした時点で、呼び出し元には await を使うことになり、その関数も必然的に async function になるので、という連鎖が続くので、全てを async function にする必要が出てくる。
そうさせないためには、あえて、async function だけど同期的に処理されていることが保証されていて呼び出し元に伝搬させる必要がないから、await は用いず、Promise の処理を行って、async をつけない、ということを行う必要がある。
ということが正解なのかがよくわからない。

 

async/await を使った場合の、伝搬例

 

Lambda の Node.js

Node.js 8.10 ランタイムから、イベントハンドラ自体を async で記述できるようになっている。

 

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-handler.html
なので、中の処理を同期的に書いてもいいよ、ということになっている。
async function では、await が使えるので、中で async function を定義して、コールしていくという作りにできる。

# nodeの準備

cd /usr/local/src

wget https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-x64.tar.xz

xz -dc node-v6.11.2-linux-x64.tar.xz | tar xfv –

cp node-v6.11.2-linux-x64/bin/node /usr/local/bin/node-stable

 

# npm の準備

#npm が存在する環境の場合、そのnpmで良いか確認。

#npm が無い環境の場合、npmをdownload。★環境のnpmが上書きされるので注意

curl -L https://www.npmjs.com/install.sh | sh

#必要に応じてバージョン指定

curl -L https://www.npmjs.com/install.sh | env npm_install=2.11.3 sh

 

#i18next-conv , i18next-scanner の場合

# インストール

npm -g install i18next-conv

# -> /usr/local/bin/i18next-conv -> ../lib/node_modules/i18next-conv/bin/index.js

npm -g install i18next-scanner

# -> /usr/local/lib/node_modules/i18next-scanner/

 

# 実行

/usr/local/bin/node-stable /usr/local/bin/i18next-conv -h

export NODE_PATH=$(npm root -g) && /usr/local/bin/node-stable index.js

# -> include “var Parser = require(i18next-scanner).Parser;”

 

wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz

tar Jxvf wkhtmltox-0.12.3_linux-generic-amd64.tar.xz

cp bin/wkhtmlto* /usr/local/bin/.

 

作ってみたが、文字が重なる・・・

http://dev.furoom.net/jsdoc3/jsdoc3/index.pdf

letter-spacingの問題っぽい。

オプションでも回避できなさそうな・・。残念。。

 

最新版入れてみる

1024 wget https://bitbucket.org/wkhtmltopdf/wkhtmltopdf/downloads/wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1026 tar Jxvf wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1027 rpm -ivh wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm
1028 yum install icu
1029 yum install xorg-x11-fonts-Type1
1030 yum install xorg-x11-fonts-75dpi
1031 rpm -ivh wkhtmltox-0.13.0-alpha-7b36694_linux-centos6-amd64.rpm

 

動かない。

wkhtmltopdf index.html index.pdf
QXcbConnection: Could not connect to display
アボートしました

 

yum install xorg-x11-server-Xvfb

xvfb-run wkhtmltopdf index.html index.pdf

できれいに表示された!

 

でも複数表示できない。

export QT_XKB_CONFIG_ROOT=/usr/share/X11/xkb; xvfb-run wkhtmltopdf DomainSync.html DomainSync.js.ht
ml index.pdf
Error: This version of wkhtmltopdf is build against an unpatched version of QT, and does not support more then one input document.
Exit with code 1, due to unknown error.

 

stable 0.12.3 を使って、

letter-spacing を何とかするしかないのかも

 

–dpi 75 を着けると綺麗に表示された!

wkhtmltopdf –dpi 75 index.html  index.pdf

 

複数ファイル一気にかけようとするとエラーが発生する

wkhtmltopdf –dpi 75 *.html index.pdf
Loading pages (1/6)
Warning: Received createRequest signal on a disposed ResourceObject’s NetworkAccessManager. This might be an indication of an iframe taking too long to load.

 

–javascript-delay を付けると良いようだ

wkhtmltopdf –dpi 75 –javascript-delay 1000 *.html index.pdf

 

用紙幅が少なく感じるのは、

–page-size で調整すればよいのかな

http://stackoverflow.com/questions/6394905/wkhtmltopdf-what-paper-sizes-are-valid

 

A3 B3くらいがおさまりいい気がする

wkhtmltopdf –dpi 75 –javascript-delay 1000 –page-size B3 module-*.html index.pdf

 

–minimum-font-size

もあるけど、maxがない。文字大きくしたいのはそんなになさそう

 

jsdocの出力に対してかけたい。

.js.html はソースコードなのでとりあえず省く

index.htmlは最初におきたい

moduleは、moduleとclassで分けたい

wkhtmltopdf –dpi 75 –javascript-delay 1000 –page-size B3 index.html module*[^\.][^j][^s].html global.html index.pdf

 

classとmoduleがごちゃまぜなのでもう一息・・。

jsdoc3、yuidoc, esdocを試した三田

jsdoc3がシンプル。UIが貧弱

yuidocは、UIはいいけど、@method の追加とかが手間

esdocはエラーになったので、ちゃんと確認していない。

 

ひとまず、jsdocのままとしている

UIテンプレートで変えられると思い、探したけど、意外となかった。

 

生成されたHTML

http://dev.furoom.net/jsdoc3/jsdoc3/index.html

 

以下を参考に

http://usejsdoc.org/

http://www38.atwiki.jp/aias-jsstyleguide2/pages/14.html

 

つけとくものは、以下

 

ファイル

@fileoverview

 

モジュール

@exports or @module

 

クラス

@constructor

@extends

→リンクにならない・・。

 

@interface

@implements

あたりも

 

メソッド

@public

@protected

@private

@abstract ※googleに無し

@override

@param

@return

@callback {RedisClient~onSubscribe} ※googleに無し

 

定数

@const

 

ちょっと試したもの

@see

@link

@fires ※googleに無し

 

@fileoverviewと@exportsは別のコメントブロックにしないと正しく表示されない

@callback の後は、クラス名を入れないと正しく表示されない

@linkは、反映されない。ul li の書き方は試してない。

@seeも、リンクは貼られない。。

 

https://github.com/nilesflow/prototype-node.js-jsdoc

foreverをサービスとして起動

CentOS6.6、CentOS7.1

 

init.dの起動スクリプト+logrotate設定

https://github.com/nilesflow/centosetc

 

ログは、/var/log/foreverd.log

Node.jsログは、指定の場所に。

start の2重起動防止。

注意点は、foreverのHOMEディレクトリ。

HOME=xxxxxx

daemonの場合、ログインユーザでないため、/var/forever/.forever

ログインユーザの場合、/home/xxxxx/.forever

となる。

 

コマンドラインからの場合は、以下で参照可能。

HOME=xxxxxx forever list

※通常ユーザの場合、不要。

 

起動ユーザは、ログインユーザとdaemonに対応

forever-service はログ出力が制御できなかった。

initd-forever は、少し不足

 

以下のスクリプトを流用させてもらった

http://multix.jp/daemon-nodejs/

サーバ側

var https = require(‘https’);

var fs = require(‘fs’);
var ssl_server_crt = ‘/etc/pki/CA/certs/せrヴぇr-ca.crt’;
var ssl_server_key = ‘/etc/pki/CA/private/せrヴぇr.key’;
var ssl_ca_crt = ‘/etc/pki/CA/cacert.pem’;
var port = 443;

var options = {
key: fs.readFileSync(ssl_server_key),
cert: fs.readFileSync(ssl_server_crt),
ca: [fs.readFileSync(ssl_ca_crt)],
requestCert: true,
rejectUnauthorized : true,
};

var servers = https.createServer(options, function (req,res) {
fs.createReadStream(“index.html”).pipe(res);
}).listen(port);

var wss = new WebSocketServer({server:servers});

 

クライアント側

var fs = require(‘fs’);
var https = require(‘https’);
var WebSocket = require(‘ws’);

var ssl_client_crt = ‘/etc/pki/CA/client/certs/client.crt’;
var ssl_client_key = ‘/etc/pki/CA/client/private/client.key’;
var ssl_ca_crt = ‘/etc/pki/CA/cacert.pem’;
var ssl_client_pfx = ‘/etc/pki/CA/client/private/client.pfx’;

var options = {
ca : fs.readFileSync(ssl_ca_crt),
agent: false,

// key&certの指定
key : fs.readFileSync(ssl_client_key),
cert : fs.readFileSync(ssl_client_crt),
passphrase : ‘xxxxx’,

// 又は、pfxの指定
// passphrase : ‘xxxx’,
// pfx : fs.readFileSync(ssl_client_pfx),
};

var ws = new WebSocket(‘wss://xxxxx:443/’, null, options);