旅とプログラミングを少々

趣味に関する記録などをします。さしあたっては2017年JGC修行とプログラミング入門に関しての内容を連ねていきます。

hledger-webへの移行

会計ソフトのデータを壊したのを機に、プライベートホスト可能かつwebインタフェースがある複式帳簿ソフトウェアへ移行した。備忘録として行った事を記録していく。

Ubuntuサーバーを18.04へ

個人のさほど重要でないサーバーなので適当にバージョンを上げる。さくらのVPSUbuntu 16.04をインストール後、/etc/update-manager/release-upgrades を編集してltsじゃなくともアップデート可能に

# パッケージ情報を反映させる

apt update && apt dist-upgrade

do-release-upgrade と再起動をくりかえした後, do-release-upgrade -dで開発途上のバージョンへ

ssh周りを設定

さくらのVPSiptablesの初期設定があるのでiptables -Lで眺めて障害になりそうなものを消す。さくら提供のUbuntu 16.04では/etc/iptables/iptables.rulesでINPUTへのREJECTルールをコメントアウトして-Dオプションで現在設定も変更、慣れたufwで設定しなおす。

ufw default deny incoming

ufw default allow outgoing

# sshをやたらスキャンの多いポートから変える

ufw allow *****/tcp

# すぐやるので先にweb鯖用も許可

ufw allow 'Nginx Full'

ufw enable

systemctl start ufw

ここからはコンソールではなくssh越しに作業をし、id_rsa.pubを~/.ssh/authorized_keysに加えて鍵でのログインが上手くいった事を確認し /etc/sshd_configでパスワードログイン、ルートログインを不可にする。

 自動アップデート関連

sudo apt-get install unattended-upgrades

sudo dpkg-reconfigure -plow unattended-upgrades

# 一応確認

vi /etc/apt/apt.conf.d/50unattended-upgrades

vi /etc/apt/apt.conf.d/20auto-upgrades

 必要に応じて

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "1";

 とか通知やautoremoveも適当に設定。とはいえ開発版の間は自動化しない方が良かったか。

https

let's encryptを利用する。certbotのプラグインがころころ変わっていてまだ開発途上なので普通にwebrootで使う。正式版が出ても変にプラグインスクリプトで設定を書き変えられるより、こちらの方が楽ではないだろうか。

sudo apt-get install nginx letsencrypt

mkdir /var/www/letsencrypt

vi /etc/nginx/sites-enabled/設定ファイル

# 適当に使うドメインのserverに追加

location ~ .well-known/acme-challenge/ {
     root /var/www/letsencrypt;
     default_type text/plain;
}

 その後実行

 sudo certbot certonly --webroot --staging --webroot-path /var/www/letsencrypt -d example.com

 これで(staging版の)証明書をもらったのでnginxの設定を追加してまたサービス再起動

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

# OCSP stapling しなければ不要だった
# ssl_trusted_certificate /etc/letsencrypt/live/exmaple.com/chain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

# 以下好みに応じて

# ssl_session_timeout
# ssl_session_cache

# ssl_protocols
# ssl_ciphers
# ssl_prefer_server_ciphers

後でLet's encryptで配布されているFakeCAを認証局として認めるブラウザで接続確認する。

この時点でも--stagingを外して--break-my-certs付けて本番用証明書と置きかえ、さらに--keep-until-expiring付きでコマンドを適当にcron実行させて自動更新としても良いが、一応先の設定をミスするとLet's Encryptの更新を阻害してしまう可能性もあるので念の為後回しにした方が良い。

http client certificate

帳簿は広く公開したいものでもないので鍵認証を行う。

/etc/ssl/openssl.cnf を/usr/local/ssl/example.com/等適当なディレクトリにコピーしてきて編集

[ CA_default ] # デフォルトまたは[ ca ] で指定したセクション

dir = どこか適当なディレクトリ/CA用ディレクト

 

# SAN証明書にするならreqやcaのx509_extensionsで読まれるセクションに追加。デフォルトだと多分usr_certとv3_req

[ usr_cert ]

subjectAltName=@alt_names

[ v3_req]

subjectAltName=@alt_names

[ alt_names ]

DNS.1 = example.com

DNS.2 = *.example.com

 

# 以下は適当に

 

countryName_default = JP

# 他のdistinguished_nameも値を入れておいた方が楽

 

# CA policy は緩めに

stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional

 

# CAやreqで使うハッシュ方式

default_md  = sha256 # opensslのビルドによってもっと好みのに変える

default_bits = 2048 # mdによって適当な値が違うのでこちらも変え忘れない

まずはreqを作る。さきほどの設定をさらにコピーしてきて

 basicConstraints=CA:FALSE
 nsCertType = server, email, object

 に変更(clientreqconfig.cfgとする)し、

 sudo openssl genrsa -rand /dev/urandom -aes256 -out ./ClientSecret.key 2048

# /dev/urandom で良しとしているが、環境によっては/dev/randomでも十分使えるかもしれない。使えるなら使ってみたい。

# すぐ使うパスフレーズを入力したりする

openssl rsa -text -noout -in ./ClientSecret.key

sudo openssl req -new -config ./clientreqconfig.cnf -sha256 -key ./ClientSecret.key -out ./CSRrequest.csr

# さきほどのパスフレーズを入力したりする

openssl req -text -noout -in ./CSRrequest.csr

 opensslのビルドによって使える暗号化方式が違うのでその辺りは適宜読み変える。

csrを自分で認証する。CA用にもう一度openssl.cnfをコピーして

basicConstrants=CA:TRUE

nsCertType = client, email

と書きかえ(caconfig.cfgとする)、

 CADAYS="-days 3650" DAYS="-days 3650" SSLEAY_CONFIG="-config ./caconfig.cnf" CATOP=適当なディレクトリ/CA用ディレクトリ sudo -E /usr/lib/ssl/misc/CA.sh -newca

 で作成、

openssl req -text -noout -in ./careq.pem
openssl x509 -text -noout -in ./cacert.pem

# 特にここでCA:TRUEでないと困るのでよく確認
openssl rsa -text -noout -in ./private/cakey.pem

 その後署名してclient証明書を作り、配布用にまとめてpkcs12フォーマットのものも作る。

 sudo openssl ca -config clientreqconfig.cnf -md sha256 -cert CAのディレクトリ/cacert.pem -keyfile CAのデイレクトリ/private/cakey.pem -out Clientのディレクトリ/ClientCert.crt -infiles Clientのデイレクトリ/CSRrequest.csr

 

sudo openssl pkcs12 -export -in Clientのディレクトリ/ClientCert.crt -inkey Clientのディレクトリ/ClientSecret.key -certfile CAのディレクトリ/cacert.pem -out ./ClientCertFile.pfx

 これを自分の使いたいブラウザに個人証明書として配布する。(複雑な設定を避けLet's Encryptを使用しない場合は同様にしてnsCertTypeがserverのリクエストを作り、CAで署名する。)

 nginxに以下のような設定を追加する。 ssl_verify_clientをoptionalにし、ssl_client_verify変数を特定のlocationでのみチェックする事で.well-known/acme-challenge/ 以下によるLet's Encryptの更新を邪魔しないようにする。

ssl_verify_client optional;
ssl_client_certificate 先程のCAのディレクトリ/cacert.pem;

location / {
     if ($ssl_client_verify != SUCCESS) {
         return 403;
     }

    # ここに元からあったlocation /の設定

}

sudo nginx -t # 設定を確認

sudo systemctl restart nginx

sudo certbot certonly --webroot --staging --webroot-path /var/www/letsencrypt -d example.com # .well-known/acme-challenge を止めていない事の確認

 証明書を入れたブラウザ、入れていないブラウザでアクセスし、動作確認する。

hledger-webへのプロキシ

hledger-web自体がwebサーバーの機能を持つので、単純に

proxy_pass http://localhost:5000/;

をnginxの設定で指定すれば良い。

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 ログを眺める時のためにこの辺りも一応設定しておく。hledger-web --base-url https://example.com/を起動した状態でアクセスすれば確認できる。

hledger-webのサービス化

hledger-webをUnitとしてsystemdに登録し、サーバー起動時に自動的に起こすようにする。

 sudo vi /etc/systemd/system/hledger-web.service

[Unit]
Description=hledger web server

[Service]
ExecStart = /usr/bin/hledger-web -f /ジャーナルファイルへのパス --base-url=https://example.com --serve
Restart = always
Type = simple
User = ubuntu # シェル等のないユーザを作っておきかえた方が本当は良いが、ジャーナルファイルの権限等がちょっと面倒になる。
Group = ubuntu
WorkingDirectory = /var/lock/hledger-web # 現在はロックファイルくらいしか使わない? 上記ユーザが権限を持つところならどこでも良い。

[Install]
WantedBy = multi-user.target

 これでOK。

sudo systemctl daemon-reload

sudo systemctl start hledger-web

sudo systemctl enable hledger-web

 これでssl認証でweb越しに帳簿を編集できるようになった。無骨な画面でとっつきにくいが、複式簿記の帳簿としてはすごく良い。

マレーシア旅行2(一日目~二日目)

マレーシア旅行2 (二日目まで)

機内で目を覚ますと、もうほぼマレーシア領空内のようでした。客室乗務員の方に入国審査の特別レーンに並べるオレンジの券をなぜか二枚渡され、ほどなくしてクアラルンプール国際空港(KLIA)のサテライト側に到着。この空港は機内乗り込み時に手荷物検査があるタイプなので、到着してすぐに空港探索ができます。

f:id:inaoki:20171028171345j:plain

空港内ならばまだまだ英語も日本語も溢れているので全然不安になりませんね。

入国審査もビジネスクラス客向けのチケットのおかげで空いているレーンを通れ、当座分だけリンギットに両替してさっさと出ました。空港直結のKLIAエクスプレスでKLセントラル駅まで30分の旅。空港が中心街から5,60kmしか離れておらず、変な白タクでも掴まなければ空港から直接タクシーでもそう高くはならないのですが、そこそこ綺麗で速いので安心です。スムーズに行けば18時あたりには駅に着けるはずだったのですが実は成田で離陸が少し遅れ、さらにはクアラルンプールでも着陸が遅れセントラルの駅についたのが19時30分ごろ。その時間帯だと駅構内の店も結構閉まっており寂しい感じでした。

駅からはBUDGET TAXIと呼ばれるチケット制のタクシーでボラれる事なくパークロイヤル・クアラルンプールホテルへ。一昔前の旅行指南本だと異様にタクシーでのぼったくりを警戒されてますが、首都レベルの都市だとこういう感じでどんどんボラれない安心システムが増えていて良いですね。

疲れていたのか写真がほぼ無いのですが、いい感じのホテルです。

PARKROYAL KL Orchid club delux - Spherical Image - RICOH THETA

さて、本当の二日目、ホテルの朝食で選んだのは、もちろんNasi Lemak。何度か聞きかえされて正しい発音は少しシが弱い「ナシレマッ」であると勉強できました。

f:id:inaoki:20171028174753j:plain

ココナッツミルクで炊いた米と炒った豆・小魚、それにソース。たまに各店独自のおかずを追加してバナナの葉で包んだおにぎり状のものがそこらじゅうで売られているのですが、ホテルのものはさすが味も量も豪華でした。唐辛子の効いたソースから野菜の甘みがじんわりと出て、米と良く合います。

 

マレーシアらしい朝食を堪能した後は、散策しつつ一番有名な観光スポットのペトロナスツインタワーへ向かいました。現地の空気感というか街の雰囲気を見るためにわざわざ暑い中地上をくねくねと歩きまわっていて、ちょっとブログに載せられるような写真が全然ないんですが中国の建設会社の建設ラッシュがすごいです。結構自国産業保護がされている様子ながら海外資本ブランド丸出しの現場もあり、建設労働者として連れてこられた人の住んでたところが街の膨張にしたがって地価が上がり追い出され大道路を挟んで向こうにスラム気味に人が残り住もうとしている所あり、景気は良さそうですが比較的安全なスポットというのはまだ点々と観光向けなところだけでしょうか。

 

夜は屋台で食べる事も考えたのですが、脚が棒になっていたのと汚いところも歩きすぎてしまったので綺麗なところで食べようと思いPAVILIONの地下へ。このPAVILION地下、日本で言うならデパート地下と屋上が一緒になったようなもので、レストランにフードコートにスイーツから惣菜屋さんまで本当になんでもあります。寿司やステーキから現地らしい魚と貝のスパイス包み焼きみたいなものまで。安くとも屋台の倍くらい予算が必要そうですが、段違いの清潔さ。しかしこんなのができては屋台街、盛況にはやっていけませんよね……今のうちに食べに行けばよかったと少し後悔しています。

f:id:inaoki:20171028181849j:plain

そういえばPAVILIONでもう一つ後悔が。両替のレートが街中の他所よりさらに良いです。たくさん両替してテナントでそのまま散財してくれって事でしょうね。ここを覗くまでは空港やホテルより良いレートで両替したと満足していたのですが……

 

こんな感じで修行にありがちな市内だけ、1日だけの滞在をめいっぱい楽しみました。

マレーシア旅行1 (1日目)

マレーシア航空修行1日目

1月のマレーシア航空セールを利用し、8万円でNRT-KULを往復し8346FOPを入手してきました。

だいたい季節毎におこなわれる恒例のマレーシア航空のセールでNRT-KUL往復ビジネスクラスが8万円でした。セール品の日時変更が効かないチケットのため予約クラスはZ、JALマイレージバンク - マレーシア航空 の表にある通りマイル積算率は125%、東南アジアですが他社便のためFOPボーナス1.5倍とはならず往復で8346FOPとなります。

往路は朝1番目のMH89便、この便のために朝8:00に成田のマレーシア航空チェックインカウンターがオープンします。初めてのビジネスクラス、初めてのマレーシアと初めてづくしに待ち切れず10分前から待機し、1番目にチェックインしました。今にして思うとあまり並ばずにチェックインできるビジネスクラスカウンターなのにわざわざ待ち時間を作ってしまうのはちょっと馬鹿っぽいですね。搭乗口はサテライトの一番右奥でしたが、サテライトの両側のラウンジを案内されました。もちろんサテライトまで来るのも初めてです。せっかくなので普段行かないラウンジを見てみようと左手側、カンタス航空ラウンジに向かいますが、なんと8時半からオープンとのこと。

f:id:inaoki:20170609105150j:image

早く来すぎました。待つほどでは無いと判断して踵を返しサクララウンジに向かいます。サクララウンジはサテライトでもいつも通りで、カレーに気を引かれながらビールを飲んでのんびりと過ごします。 

 

他社便のためラウンジでアナウンスが無いのと、ラウンジからゆっくり歩いて10分かかる一番端っこの搭乗口だったのでビールだけ楽しんでさっさと動きます。本当に遠いので注意です。

 遅延なく搭乗案内がここでは日本語でも流れ、ウキウキと乗り込むと早速ウェルカムドリンクのサービスが来ました。マレーシアはイスラム教の国なのでお酒ではなくパイナップル、グァバ、アップルジュースの中から選ぶようです。パイナップルジュースを飲みながら席を整えます。

f:id:inaoki:20170613035450j:image

この日の機材は記憶が正しければ一応エアバス330-300、ただし少し古めの内装になっておりビジネスクラスの席も二席隣り合う構造で、通路側の席の自分の隣には自動車会社の出張の外国の方が乗っていました。

 

さて、機内の楽しみといえば機内食。天気もよく気流も安定していたようでシートベルトサインが消えるや否やドリンクサービスとマレーシア航空名物のサテーが立て続けに来ました。

もちろん隙なくこれを見越してあえて一杯目からタイガービールを選択し、欲張りに(ビーフとチキン)両方くれとお願いしています。朝にあまり食べる時間もない便だったので、この時はほとんど皆両方二本ずつなりチキン三本なりとたっぷり頼まれていました。絡めるというよりも乗せるためのようなしっかりとしたピーナッツソースをたっぷりと付けていただきます。

f:id:inaoki:20170613040753j:image

うん、おいしい。甘めのソースと優しめのビールが本当に良く合います。

サテーの皿を下げられるとドリンクのお代わりと共に本メニューの選択を聞かれます。搭乗する前の週にシェフ・オン・コールを頼んでいたので、前菜のみ何にするか聞かれました。

f:id:inaoki:20170613042030j:imagef:id:inaoki:20170613042040j:image

で、和食の前菜を選んで出て来たのがこの通り。見た目よりおいしいなめこおろし茶そばと、ホタテ貝柱のポン酢ジュレに鰆の梅ソース。まるで日本のレストランのよう、とまではいきませんが海外ではまず出会えないクオリティの和食でした。海外航空会社でも成田発便はなかなかやりますね。メインにも期待が高まります。

f:id:inaoki:20170716082339j:image

前菜を平らげるとほとんどすぐ牛フィレ肉のステーキを出されました。これも柔らかなお肉に東南アジアテイストのソースが良く合っていて素晴らしい。機内食とは思えぬ豪華さでついワインもすすみます。

 

そんなわけで食事が終わると眠くなり、ほぼフルフラットまでシートを倒しゆっくりと昼寝を。初めてのビジネスクラスを満喫しました。

Amazon Lightsail雑感

クラウドのメリットを享受できるほど規模の大きくないサービスにとっては手頃な価格や簡易化された管理でいまでも需要の大きいVPSAmazonが参入したのは12月の事。アメリカ東海岸リージョンのサーバのみなので日本人にとってはまだまだ縁が薄いものでしたが、2017年4月のAWSSummitでついにアジアリージョンでのサービス開始を宣言していました。

 アジアに来るならば何かの機会に触る事があるかもしれないので、さっそく個人AWSアカウントでlightsail回りを適当に眺めてみました。何動かすと想定したとかは伏せて完全に雑感で。

インスタンス管理

Lightsail VPSAWSアカウントがあれば借りる事ができるのですが、インタフェースは個人向けを意識したシンプルでモダンウェブっぽいデザインの専用のものです。AWSにありがちなあのずらっと並んだメニューとかはありません。

AWSアカウント作成時点でクレジットカードなどの情報は握られているので、どんなインスタンスが欲しいかとんとんと選んでいって1分でVPSIPアドレスと鍵がもらえます。楽ちん。

EC2のようにAPI経由でインスタンスの増減や稼動を制御できるようになってますが、専用のSDKがあるわりにどこかでみたようなAPIドキュメントが流用してあったりしてEC2をIaaSとして使った事がないとちょっと理解しにくそうな印象。そしてネットワーク周りがだいぶバッサリと消えている気が。はっきり言えば機能制限版EC2なのではないかと。

初期イメージ

ここは最高です。Amazon Linuxではない普通のLinuxが使えます。VPSですから常人が管理できないディストリビューション置かれても困りますしね。

AWSとしての機能

請求はAWSのものと統合されており、完全に同じ事が行えます。CloudWatchで請求額監視もばっちり。ただしそれ以外、通信量だったりCPU使用量だったりは分けられていてWebインタフェースだとどこで確認できるのやらわかりません。APIならGetStatisticsがあるのでおそらく確認できるのでしょうが、ライトユーザに必要なさそうなものは徹底的にWebインタフェースから除いている感じです。

ネットワーク的にも既存のEC2インスタンスとつなぐ事は難しく、やっぱり別物扱いさせたい、クラウドちっくな要素はEC2でやれという事みたいですね。

まとめ

クラウドが透けて見えるけれどあくまで単体VPSとして使わせたいという意思が伝わります。数台のサーバを使いたいだけでEC2慣れしてないならサーバのネットワーク距離的に日本のサービスで良さそうだし、それを越えるならやっぱりEC2なりなんなりのIaaSを検討するべきなのでしょう。

FlightRadar 一本化 旧Pro機能はサブクリプションへ

残念ながら、もうFlighRadar24 Proはアップデートされません。

The New Flightradar24 App — Answering Frequently Asked Questions – Flightradar24 Blog

短くまとめると

Pro版 - 今後アップデートなし。しばらく使いつづけられるが新しいFree版へ移行をすすめる。補償はなく、有料機能が欲しくばサブクリプションへ。

Premium版 - 今後アップデートなし。Free版へ移行してログインすれば同様な機能が利用可能。

Free版 - Premium版と統合。Web/アプリ共用のアカウントで有料機能を使えるようになる。

アンドロイド/iOS/ブラウザ版で全て一本化されたアカウントなのですが、継続支払いプランのみになってしまうので買い切り機能で十分だったPro版ユーザにとっては残念な変更でしょう。

マレーシア航空のChef-on-callウェブサイトがメンテナンス中

マレーシア航空で60分以上のフライト区間ビジネスクラスまたはファーストクラスを予約すると、事前に機内食のオーダーができる。他航空会社でもファーストクラスではたまに提供していたサービスなのだが、マレーシア航空だと嬉しい事にビジネスクラスでもOK、それも特典航空券だろうと割引運賃だろうと関係なく注文できる。

もちろん注文しなくても普通の各クラス向けの機内食を用意してくれるのだが、Chef on Callに並ぶメニューはなかなか美味しそうなので注文しない手はない。

www.malaysiaairlines.com

普段ならウェブサイトで予約番号等を入力すれば写真を見ながら楽々往復分の注文ができるらしい。ところが、たまにメンテナンスでメールや電話での注文しか受け付けなくなってしまう。そして今まさにそのような状況だ。

数度注文を試みても駄目で、一日待って再度試そうとしたところサイトから注文用フォームが消えてメンテナンス中との案内がされている。しかたないのでウェブサイトに掲載されているメニュー表pdfから自分の出発空港に合わせたメニューを選んでメールでお願いすることにした。

Dear whom may concern,

 
I'd like to order the following for my flight dinner of itinerary number: [予約番号]
NRT-KUL flight: Grilled Fillet of Beef with Garlic, Chili and Coriander Sauce (GCC 03 021 B)
KUL-NRT flight: Nasi Lemak with Prawn Sambal and Ikan Bilis Sambal (GCC 11 001 A)
 
Thank you,

噂通りならばその日のうちにメールで注文受け付けを連絡してくれるらしいが、どうなるだろうか。

楽天トラベルでキャセイパシフィックビジネスクラス台北が6万円台

表題の通り、楽天トラベルで台北線のみ航空券+ホテルがすこし安い。先着25名2万円引きキャンペーンも重複させれば4万円台だったらしいが、残念ながら予約できた時には遅かった。

海外旅行予約 - 海外ホテル・格安航空券・海外ツアー【楽天トラベル】

ここからNRT TPEでビジネスクラスキャセイパシフィック航空を指定して検索すると7,8万円ほどの結果が表示され、ホテルを最低ランクまで落とすと6万1000円程度になる。楽天らしい先に進めることを優先させて比較検討させないようなひどい画面構成だが、検索結果が0となる日で検索すると予約可能日が一覧になって他サイトにちょっと劣る程度の使い勝手にはなる。

私もとりあえず繁忙期を避けておさえてから検討中なのだが、そもそも出てくるのは成田発の直行便のみなのでFLY ONポイントは1357 の25%増しの往復で3392ポイントほどだろうか。楽天トラベルは予約画面でもブッキングクラスが表示されないため、憶測しかできない。一応はJALのサイトではビジネスクラスは全て125%だとされているがとにかく情報がない。

JALマイレージバンク - キャセイパシフィック航空 / キャセイドラゴン航空

ちなみに最安6万円台だとホテルは都会のビジネスホテルであり、狭い。ホテル代を考慮してもFLYONポイント効率の面からは決して良いとは言えない。4万円ならば飛びついただろうが、はたして6万円で行くべきか……

楽天はキャンセルしてFLY ONポイント効率の面からもホテルのグレードの面からもキャセイパシフィック公式から良いパッケージが出る事を期待したほうがいいようなとも考えてしまうなんとも微妙なセールの情報であった。