経費計量単位・LSU

社長:あー、ただいま帰りましたあ。

経理:酒臭いですね。

社長:今日のお会計も10 LightSale Unit 手前で踏みとどまりました。

経理:金銭感覚の精度が向上しましたね。

基盤:しかし1時間で10 LSU というのは、アマゾンLSUを 10 x 24 x 30、つまり仮想マシン7,200台を1時間稼働させたのに相当しますね。

社長:人間の能力もまだまだ、捨てたものではないと。

経理:LSU = 500円/月ですから、0.694円/時間です。

開発:精確には 1 USD ≦ 107.5 JPY ですし、送金の手数料も 3% かかるとすると、実際には LSUは 555円/月でしょう。ゴジラですね。というか私は今「いじょう」を≦にGoogle IMEが変換してくれなかった事に衝撃を受けました。早速登録。

社長:今やLSUは当社の東京ドームとなりましたね。

広報:単位記号を考えてみました。

基盤:も?

基盤:毛?

社長:そういえば委譲と言えばdelegationかな。

基盤:もっともいかなライトセールとは言え、一アカウントで1秒に2台を1時間作り続けて、それを1時間後に全部壊すのは人間の手では無理ですね。

開発:ライトセール全体ではそのくらいは軽くさばくでしょうけどね。

社長:そう、さっき飲みながら考えたんですが、一般的に入り口ではロボットかどうか認証が厳しいけど、中に入ってからロボットかどうかはあまり問い詰められないですよね。それはどうなんだろうと思ったわけです。

社長:だって認証は人間として済ませて、あとはロボットプログラムをプラグインなりエクステンションなりで、ガンガン走らせることはできるわけです。そういう振る舞いに対して、各社はどういう対処をするのだろうかというところに興味を持ちました。

基盤:今日は良い番号が出るまでIPを取って捨ててというのもやりましたが、所詮人間の手作業では20回くらいで嫌になります。

開発:人間以外による操作を禁止するとか、あまり書かないでしょうしね…

社長:どこまでが許容できるマニュアルでどこからがオートクルーズかなんて、定義が難しいですよね。たとえば仮想マシンを立ち上げるまでの数回の操作を1クリックでできるようにするスクリプトを作って、それをクリックする事を禁じるのは難しいと思うんです。でそれなら、人間の手で1秒に2回くらいクリックするのは簡単です。さらに、一つのボタンを1秒に2回押す、完全に独立なプログラムなり装置を持ってきて、それを押させる。これを止められるのか。

開発:その昔あの事件の時「私、何か悪い事してますかね」って村上さんが言ってましたね。システムの正常系として出来てしまうことを、やってはいけないんでしょうかという。

基盤:そういう事を考え出すとまた、短絡的にシステムを使いにくくして対応してくる可能性はありますね。そういう意味では使いにくい管理コンソールのUIとか、ある意味先進的なのかも知れません。

社長:一生懸命作ってるふりをして使いにくいシステムを編みだすという高等技術が発展する時代が、やがて来る。

-- 2020-0704 SatoxITS

ネームサーバ再移転

基盤:ネームサーバを引っ越したいと思います。

開発:え、また?なぜ。

基盤:一つにはネームサーバのアドレスを固定するため、一つにはそれをネームサーバに専用化したいため、一つにはAmazon Linuxを実用に使ってみたいためです。

基盤:実はライトセールの使い方を勘違いして、ネームサーバには固定アドレス(パブリックな静的アドレス)を与えていなかったのです。今のネームサーバのインスタンスのネットワーキングはこうなっています。

基盤:この 3. ではじまるアドレスは、このインスタンスを作成した時に割り振られたもので、良いアドレスだと思ってこれにしました。ですが「インスタンス生成時に割り振られたアドレスを静的にする」というオプションは、ライトセールには無いのです。勘違いしてしまった理由の一つは、このインスタンスを管理する画面と、全インスタンスを管理するための画面が、なまじ型式が統一されているためです。全体の管理画面(ホーム)はこうなっています。

基盤:で、このネットワーキングを見るとこういう様子。

経理:アタッチされてないIPアドレスって、余計に課金されるんですよね。

基盤:気になるのは「DNSゾーンの作成」というところで、ここでAWSが提供するネームサーバも作れるわけです。これは Amazon Route 53 などを使います。で、ここで作ったDNSゾーンをそのネームサーバに管理委託するみたいな感じになるかと思います。ですが、うちでやりたいのは多数のトップレベルドメインの管理ですし、そもそもネームサーバで楽しむのが目的の一つですから、ネームサーバは自前で作るという道しか無いと思います。

基盤:で、現在のネームサーバホストは Ubuntuですが、沢山インスタンスのアドレスを試作する過程で ns0f という一時的な名前を付けました。ですがこの呼称は変更できないようです。内部的なインスタンス名とは言え、イマイチしっくりしません。一方、ns1 という名前で作ったのはたまたま Amazon Linux でした。これは試用してみて、機能性能的に問題が無いことを確認しています。デフォで NFS サーバがインストールされてるとか、サーバとして利用するには望ましい傾向のパッケージなのかも知れません。なんといっても Amazon Linux というくらいですから、アマゾンによる Long Time Support は当然期待します。Linuxカーネルの版はLinux/4.14.181-108.257.amzn1.x86_64、2020年5月27日付、一ヶ月ちょっと前です。

基盤:ということで、この ns1 という名前の Amazon Linux のインスタンスを今後我社のネームサーバとしたいと思います。

基盤:それで、良いアドレスにあたらないかと、静的IPの生成を試してみます。

54.168.5.142
18.176.229.115
54.249.17.107
18.176.229.115
54.249.17.107

基盤:えーと、削除して生成すると、同じアドレスが巡ってきますね(^-^)。17.107 というのはなかなか悪くないので、候補として残します。

13.113.33.216

開発:おっと、これはなかなか語呂が良いですね。これも候補に

3.114.178.117

基盤:これもなかなか。3. だし。

52.69.148.36
18.178.87.103

基盤:これもなんだか良いですね。次。

開発:いたずらをすると英語で叱られますよ、ってやつですかw

基盤:ライトセールでは固定アドレスは 5つまでな、っていう制約ですね。他のアカウントを使ってサイコロ振りを続けますか?w 今の残っている候補はコレ。

基盤:わたしの好感度的にはこうですかね。

3.114.178.117 2位
13.113.33.216 1位
18.178.87.103 4位
54.249.17.107 3位
54.238.125.26(運用中のdelegate.orgに使用中)

開発:使用中のアドレスが一番つまらないですねw

基盤:でも運用中だから外せない。動いている間は保持してくれるとかすると良いのですが。

開発:ライトセールもこのへん、もっと楽しくアドレスを選べるUIにしてほしいものですね。

基盤:では4位を落として続けます。

54.199.42.158
54.178.28.243
54.199.42.158
54.178.28.243

開発:やっぱり、再利用されて回ってきてしまいますね。

基盤:3位も落として続けます。

54.178.63.130
54.249.17.107

基盤:復活してしまいましたw

54.95.143.38
18.181.38.61

基盤:おっとこれはちょっと良いかも。ノミネート。

54.194.117.232
52.69.18.91

開発:初めて出ました、全部2桁。

基盤:ということで現在の候補と私から見た好感度。

18.181.38.61  1位
13.113.33.216 2位
52.69.18.91  3位
3.114.178.117 4位
54.238.125.26 (使用中)

開発:そうですね。全部で9桁なのも高評価。18.181.38.61。これにしましょう。

基盤:こういうところがIPv4 の楽しさですね。

社長:昼食はどうしますかね。

基盤:飲んで食べて昼寝するとどうしても3時間くらいかかるので、今日はパスします。

開発:私もパス。

社長:では、久しぶりにカップヌードルシーフード味にしますか…

* * *

基盤:仕事の合間にお湯を注ぐと、気がついたら10分て普通ですよね。ずずっ。

開発:タイムリーに食したのは久しぶりです。ずずっ。

社長:まあ、カップヌードルにコシという概念はないですけどね。ぺろぺろになるのもまた良し。ずずっ。

基盤:でも、完全にスープが麺に吸収されて一体のゲル状にまでなるとどうも。ずず。

開発:あれも一応、スープまで完食っていうことになるんでしょうね。ず。

基盤:減塩とかの話じゃないですよね。ず。

社長:あー、ビールが飲みたいなぁ。買い置き常温の黒ラベルはあるんですが。ずず。

開発:冬場は常温も悪くないですけどね。今だと泡にしかならないし。ず。

基盤:ずー。。完食。

社長:そういえば昨日はあの謎の定食屋さんでしたが、タンメンに野菜をてんこ盛りに載せてって言ったら、本当に死ぬほど載ってきました。やっぱタンメンに載っている野菜って美味しいですよね。麺も悪くはなくて。食べられませんでしたけど。

基盤:今度から麺は1/16玉くらいにしてもらうとよいですね。

* * *

基盤:またあの咳き込みおばさんが… 屋外まで咳き込みに出てるのかな?

基盤:それはそうと、現状当社の保有する固定アドレスとVMはこういう事になっています。

基盤:今運用に使われているのはWebサーバ用とネームサーバ用。他の3台は評価用なのでいつでも捨てられます。ns0eは手がすべって0.5GBメモリ$3.5プランにしてしまったものですが、試しに使った限りでは何も問題がありませんでした。この点は、全く使い物にならなかった Azure の 0.5GB とはえらい違いです。

開発:揮発性の仕事の内部での並列処理用に飼うのは良いかもですね。8台並列にしても$28/月。

社長:いつか負荷分散が必要になるような状況になると良いですねえ。

基盤:アマゾン提供のロードバランサーはあるのですが、それって自分たちで作ったほうが面白いと思います。Linux でルータ専用機を作って NAT / NAPT したいと思います。

開発:ライトセールでは一台に複数のIPアドレスは振れないんですか。そうしないと面白みが半減ですね。その点はちょっと残念。

基盤:そのあたり用にだけ EC2 を一台飼うという方法はあるかと思います。ネットワーク性能次第では、高速な出入り口を EC2 に付けて、処理はリージョン内のライトセールに投げるという選択はありかと。

基盤:さてそれで。お試しに作った Amazon Linux にはたまたま ns1 という名前を付けたので、これをそのまま新ネームサーバ(プライマリw)として使いたいと思います。この他に、AmazonLinux間での連携を試したいので、もう一台AmazonLinux。せっかくなのでBSD系も一台。せっかくなのでWindowsも一台。Amazon 2、Ubuntu 1、BSD 1、 Windows 1 という構成になります。

社長:いや、別に5台に収めることにこだわらなくても…

基盤:そうですか… では、一日20円の課金ですし、1週間くらいのスコープでやります。

基盤:今後の作業の流れです。

  1. 現行(旧)NS(Ubuntu)の内容を新NS(AmazonLinux)にごっそり移して稼働させる
  2. 新NSには上記のIPアドレス18.181.38.61をふる
  3. そのアドレスをns1.its-more.jp と ns1.delegate.org として xso と nso に登録
  4. 現有のドメイン名のプライマリNSをごっそり新NSに向ける
  5. 旧NSへの問い合わせが静まったらそのアドレスを廃止する

基盤:今回の移行では、ネームサーバのコンテツ自体は共通なので、5.はそれほど待たずにやてしまって良いとは思います。

開発:まあ、名誉セカンダリとしてしばらく残留でも。

社長:了解。

基盤:では作業開始します。

基盤:ああ、まず静的アドレスふっちゃいますかね。

基盤:このインスタンスの種別を示す変なアイコン、何かと思ってたんですが、よくみると宅配アマゾンの段ボール箱のようですw。これ、生きているインスタンスのアドレスすげ替えたら何が起こるんでしょう…

開発:もともと自分のプライベースアドレスしか知らないから、マシン自体は何も気づかなそうですね。

基盤:アタッチNo1。

基盤:でインスタンスを見る。

基盤:簡単過ぎる… これ以上に簡単にする必要性を感じませんね。Azureの10倍くらい簡単です。

基盤:さてそれで、旧アドレス向けに開いたターミナルは固まっております。

基盤:そして、インスタンス概要にあるコンソールのアイコンを押します。

基盤:ぽちっと。

開発:簡単過ぎる。

基盤:ただし思うに、このブラウザ式コンソールはアマゾンのHTTPサーバを経由してインスタンスにつながっているわけですから、インスタンスのプライベートアドレスのほうにSSHしてやれば、パブリックアドレスを変えられても、コンソールも切断もされず作業を継続できるのになとは思います。

基盤:さてそれでは、この ec2-user のままでは当社的には色々不便ですから、新しいユーザを追加します。sudo adduser xxx。あ、RedHat はこの時にパスワードを聞いてくれないのか… sudo passwd xxx。su xxx。ls -lat。シンプルな .bashrcがあるのみです。とりあえず ec2-user から .ssh をコピー。ああ、sudo ができない。ec2-user に戻って sudo visudo。ec2-user の .ssh をコピーして chown xxx。ナマ端末からxxxにSSHでログイン。OKです。

開発:デフォルトのユーザ名以外にログインできないのがブラウザ式コンソールの残念なところですね。まあ、昨日検討したような方法でユーザ名をマッピングしちゃえばいいんでしょうけど。

社長:デフォルトユーザでログインされて、1秒以内にキーボード入力が無かったら、指定のユーザにsuしちゃうとかでどうですかね。

基盤:おっと、タイムゾーンの設定がUbuntuみたいにシンボリックリンクでは無いですね。あーでも、/usr/share/zoneinfo/Asia/Tokyo を /etc/localtime にシンボリックしてOK。受け入れ準備完了です。

基盤:で、引っ越しスクリプト書いてGo!。まあ20分くらいですかね。しまった。tar に z つけるの忘れた‥ どうしましょうね?こういう時にrsyncだったら。

開発:っと言う間にもう6割くらい終えてますね。待ちましょう。

基盤:まってる間に crotab -e を味見。… 何も聞かずに黙ってvi。よしよし。おー、空っぽだ。素晴らしいというか潔いというか。

開発:crontab の意味をわからずに crontab をいじっちゃいけないですよね。man しろと。

基盤:おや、PATHの先頭に . がw。さすがに私は最後に入れますけどね。

社長:当社のテイストに極めてよくマッチしております。

開発:Ubuntuよりはうちの流儀にあってますかね。

基盤:というか、AmazonLinux のイメージって、そのままローカルのVMサーバとの間でホイホイ移動できるでしたっけ。Hyper/V で AmazonLinux ってアリかもですね。

社長:そういえば、MacOS版のHyper/Vだと豪語していた Parallelsはどうなりましたかね。

基盤:あれは、iMacでやってみますかね。あるいは、退役するこのMacMiniの余生をつぎ込むか… あ、コピー終わりました。

開発:20分ちょっとでしたね。

基盤:ユーザ用にコピーするのはシェルのalias集。source ...。うーむ楽ちん。

開発:alias をログイン元で一括管理できるんでしたっけ?

社長:少くとも私の作ったリモートshellでは出来ました。

基盤:dgbind を chown, chmod。でおももろに sh httpd 。。。OKです。全サーバ起動。OKです。ブラウザから http://18.181.38.61 … OKです。ssh ログイン再確認、OKです。

開発:あれ?Ubuntu 18の旧NSに比べると、SSHログインがサクッときますね。

基盤:なんででしょうね?あっちはもう仕事してるからとか?

基盤:で、crontab -e でリブート時のサーバー起動スクリプトを追加。sudo reboot。さて、このリブートの遅いのがEWSの不満な点なわけですが… お、でも40秒弱で立ち上がりましたね。ふーむ。

開発:おや?リブート時に自動的にDeleGate系サーバ起動してないですね。@reboot がないとか?

基盤:man 5 crontab。ありますね。mail。。無い(笑)。cat /var/spool/mail/xxx … ああ、スクリプトが間違ってました。でも Ubuntu では見逃してくれたんですが… とりあえず reboot。再度ログインして ps xf。サーバ類起動確認OK。運用開始準備完了です。

開発:スクリプトの間違いとは?

基盤:crond から起動される時の PATH に . が入ってないんですね。手動での起動とcronでの自動起動は共通にしたいわけですが。だから cd $HOME 後に、source .bashrc じゃなくて、source ./.bashrc とする必要があった。

開発:なるほど。正しい。

社長:/var/spool/mail/mbox に cron のエラーが入るとか。私はひじょーに、AmazonLinux が気に入りました。いっぷくしましょう。

* * *

基盤:さてそれではこの ns1 を its-more.jp と delegate.org に登録します。

開発:ゴッドブレス 18.181.38.61。

基盤:とその前に、dig @18.181.38.61 satoxits.com … あれ、返事がない。

開発:ファイアウォール開けてないですね。

基盤:そうか。なんで HTTP は通ったのかな。… ああ、デフォルトで 22 と 80 が開いてるんですね。微妙なデフォルト設定… では 53 も通します。あと443と Ping もかな。うーむお手軽。Azureの10倍以上は簡単ですね。

開発:惜しいのはその「作成」の位置だよね。なんで右にアラインしてるんですかね。左寄せいにしてボタン形状にすれば良いのに。そもそもユーザ目線で言えば「作成」じゃなくて「追加」だよね。

基盤:で再度会社からdig @18.181.38.61 ... OK。ping … OK。うーん、なぜか Ubuntu より若干速いです。

開発:まだトラフィックがゼロだからですかね??

基盤:では nso にて ns1.delegate.org を登録。18.181.38.61。

開発:この 18181 の部分は、すぐに覚えられますね。

基盤:しつこいなー。change じゃなくて新規の追加なんだから遅延なんてないでしょうに。オンデマンドで検索じゃないんですか?

基盤:まじ?自分の中に反映されるのに時間がかかるとか?リロード。

基盤:よかった。digでも確認。OK。

基盤:しかしこの情報を見るかぎり、そのレコードがいつ更新されたかという情報は無いですね。そうなると、古いキャッシュで上書きされても不思議ではない。

社長:確かに。位置レコードごとのタイムスタンプは無かった気もします。

開発:だとすると、DNSって悲しいプロトコルですね。

基盤:次に xso …

基盤:またこれか…

社長:今日は時間もあるし、数分待ってみましょうかw いっぷくしましょう。

社長:大家さんがくれた大根のまるかじり、気分もスキッとするし、とても良いです。

開発:そういえばスーパーに行けば桃が売ってるでしょうね。

社長:桃のまるかじりから始まりましたからね。あの高貴な香りを味わいたい。でももう高嶺の花的なイメージですが。

社長:スーパーまで歩いてけるところも探したんですけどね。ドラッグストアでもいいかということで、近くにいい感じにさびれかけた飲食店が多いここになったわけですが。

基盤:まだ回ってますが。そういうアプリなんですかね。

開発:JavaScriptでしょうね。なんか既存のセッションに邪魔されてるんだと思うんですが。5種のブラウザが動いていてタブが何十もあるからどこにあるのやら。

社長:タブの検索できますよね。というかタスクの検索。

基盤:これかな?プロセスをkill!あ、繋がりました。

開発:さすがに複数並列セッションを禁じてるわけでも無いようですから、正常に活動も終了もしてない?セッションがあると固まるって感じですかね。

社長:セッションのタイムアウトについてはAWSなんかもかなり工夫している気配がありますから、簡単な問題では無いんでしょうね。

基盤:しかし、ネットワーク業界の会社のサーバなんですけどねぇ…

基盤:でDNSレコードの設定… あれれ?ns.its-more.jp すら無い。なんだコリア。

開発:ああ、それはレンタルサーバ用のDNSの方へ行って下さいってやつですよ。

基盤:ぐあー紛らわしい。使われてないDNSサーバならそうメッセージ出してほしいですね。ワンストップサービスで無くてもよいんで。なんかもう間違ってここに Gmail の MX を必死に登録しちゃったらしくて自分が可愛そうになります。これのせいで G Suites と契約する時に手間取ってしまったんですよ。…じゃま、気をとりなおして。レンタルサーバにログインして?。これか、ドメイン。DNS編集マークらしげなアイコンをクリック。おー、20件以上レコードがありますね。この TXT レコードの意味に興味を持ちます。

開発:まあいずれ全部サーバ類を引き上げるとしても、このDNSレコードとレンタルサーバだけは残すんでしょうね。

社長:いちおう、創業の地みたいな。

基盤:では、ns1.its-more.jp A 18.181. ... 忘れた。18.181.38.61 追加します。TTL 600 は NS 用アドレスとしてはちょっと短いですかね。まあよい。確認する。追加する。

開発:まあ「!」を付けるほどの事かなとは思いますが。

社長:いや、プロ相手なら別として、これくらいのほうが親身な感じで良いのでは。あとは失敗した時辛い時にも同じ調子で世話をしてくれるかです。

開発:というかこの会社のシステムのツギハギ感なんとかならないですかね?4世代住宅みたいな。

基盤:dig ns1.its-more.jp 確認。OK。dig @ns1.its-more.jp satoxits.com。OK。あとは、約80個のドメインのNSレコードをまとめて変えて終了です。

基盤:それでちょっと、DNSサーバの応答時間に興味を持ったので調べました。単純にうちからの pingですが。xso は普通に 6ms で帰りますが、nso は worldnic.com で、250ms も掛かるんです!AWS Tokyoからやっても同様です。日本からのアクセスをメインにする .jp ドメインのネームサーバとしては、あり得ないと思います。

開発:そりゃまあキャッシュもしたくなるわなって応答ぶりですね。

社長:まああそこはほぼ、動態保存博物館として使うだけです。

* * *

基盤:さて仕上げは、各ドメインのNSレコードの変更です。がその前にちょっと。さっき登録したばかりでまだどこにもアナウンスしてない ns1.delegate.org と ns1.its-more.jp ですが、このサーバの HTTPに対してすでに googlebot.com とかからアクセスがあります。どうやって検知したんでしょうね?

開発:アドレスで来ているのかな。

基盤:荒らしロボットは、存在しないパス名を探って来たりワンギリなんでわかるのですが、さすがに googlebot とかは普通に / にアクセスしてきています。

開発:この記事へのクロールとの時間関係を見ればわかるかも知れませんね。

基盤:えーと、googlebot はこの記事(p=9820)に 17:22 と 17:28 に来ていますね。

基盤:xso のレンタルサーバはIPアドレスで記録していますが、逆引きするとこうです。

42.68.249.66.in-addr.arpa. 300 IN PTR crawl-66-249-68-42.googlebot.com.
40.68.249.66.in-addr.arpa. 300 IN PTR crawl-66-249-68-40.googlebot.com.

基盤:一方で、ns1 の方へのアクセスは 17:32, 33 となっています。

基盤:残念ながら Referer 情報は "" なので、どこを見て来たのは不明なのですが、意味深な時間関係と思われます。

開発:アンカーは付けてないけど、http://18.181.38.61っていう文字列があるから、それを拾ったんですかね。

社長:まあこういう事を追跡するために、アクセス時刻とクライアントアドレスを暗号化した文字列を埋め込んだURLを生成する機能をDeleGateにも付けてあるわけですよ。

開発:ですがここは Apache で WordPress のページですからねえ。まあでも、普通に JavaScript でそういうURL文字列を生成すれば、同じ事を簡単にできるんじゃないですか?

社長:そうですか・・・ じゃあやってみて下さい。面白そうだし。

基盤:そろそろ夕方で、あの咳き込みがはじまるんじゃないかと不安です。

経理:冷房費節減のため、窓は開放することにしています。

開発:ノイズキャンセラー作ると良いかもですね。

開発:うーん、クライアントサイドの JavaScript になっちゃうと、それをクライアントが解釈して実行してくれるかという問題はありますね。あくまでもページの中のアンカーに静的に存在したように見えるURL文字列で無いといけない。となると結局SSI的なもの。うーん、埋め込み HTML に <!--#echo ... > とか書いても <?php ... ?> とか書いても素通しですね。

社長:それは確か、functions.php というファイルに関数を定義して、ショートカットで呼び出すのだというのを4月に読みかじりましたよ。

開発:結局 PHP 触るのかあ… まあ、もう CSS も食らっちゃたし皿までですかね… find … うちの functions.php ってこれですかね。

~/public_html/its-more.jp/ja_jp/wp-content/themes/twentyseventeen/functions.php

開発:で、ここになんか関数を定義して、ショートカットの名前を定義すると。

function myHello(){ return "Hello World!"; }
add_shortcode('myHello','myHello);

開発:でこれをショートコードブロックで参照すると。

開発:これでどうですかね。ぽちっ。

開発:ひーっ!

開発:とりあえず functions.php を元に戻してというか、追加分をコメントアウト。リロード。回復。ほっ。で何が行けないって言うですかね。function の宣言は問題無さそうだし。ん?add_shortcut の呼び出しの引数のクォートが閉じてませんでした。ではこれを閉じて。再度ショートコードで参照…


Hello World!

開発:やれやれ。よかった。どういうふうに埋め込まれてるのかな?

開発:なるほど。生成されたという痕跡は無いと。

社長:なるほど、よさげな感じじゃないですが。ていうか、SSI の echo の互換ショートカットとかって無いんですかね?

開発:というか、普通の本文中とか、埋め込みHTML中で呼び出せないと不便ですね。



こんなふうなことをWikiの記法みたいに、通常の文章やHTMLの中で書きたいわけですが… Hello World!

社長:ということは、ショートコードのブロックというのは、埋め込みHTMLブロックにショートコードの識別機能を加えたものみたいですね。

開発:なんというか、コンピュータ屋には理解しがたい世界です。

社長:まあ、使えればそれでいいんじゃないですかね。それでクライアントのアドレスを取る方法は?

開発:PHP client address で検索… こういう感じの模様。

$_SERVER['REMOTE_ADDR'];

開発:ということは、こんな風に functions.php に書いて、こんな風に呼び出すと。

あなたのアドレスはずばり、13.113.33.216 でしょう。


社長:ずばりでした。

開発:なるほど、そういうことなのか。ヤバい、面白くなって来てしまいました。これでインラインのCSSとかJavaScriptとか生成すると、やりたい放題というわけですね。

基盤:それがWordPressのプラグインというやつなんですね。

開発:で、 PHP のマニュアルはどこにあるんじゃろ… ああ、これですね。

開発:で、時間はというと…

基盤:5.1.0 より前は何を使ってたんでしょうね?

開発:さあ。リクエストのDateとか?

開発:えーと、PHPでの文字列の結合は '.' でやりますと… 作りたかったのはこういう感じのものですね。

社長:そういうことですね… といか、いわゆるウェブ広告っていうのはこういう仕組みに作られてるんでしょうね。これをインラインのイメージがフレームにすると表示回数カウンターになると。

基盤:ネームサーバのほうのログにも、上のとおり記録されてます。うわっと。googlebot がこのページからたったいま、ロガーのページに飛んで来たと記録されました。

開発:この 54.238.125.26 っていうのは… リバースプロキシ作戦にはまってますね。

基盤:ということで、準備も出来てますし、NSの一斉移動、決行しましょう。

社長:いや、今日はどうしても外に飲みに行きたいのですが、閉まる時間が近づいてきました。帰ってきてからか、明日にしましょう。

-- 2020-0704 SatoxITS

(2020-0707 touch x2)

世界QRカウンター(への一歩)

社長:何か面白い事をしたいですね。

開発:たとえば。

社長:たとえば、わざわざそれを人間の手でやるの?という面白さが点描にはあるわけです。その逆に、普通は人間が手作業でやるものだと思われているものを機械的にミリ秒でやってしまう。

開発:まあ実用という言う意味では、設立当初から懸案の電子署名ですね。機械がハンコを押す。でもそれって、すでにSSLとともに実用化しているとは言えるかなと思います。サーバがミリ秒でコネクションにハンコを押すという。

社長:結果が人間にとって面白いというか、見える化されることが重要だと思うんです。結果が揮発性では無く、グローバルであることも。

社長:たとえば、以前少しかじったQRですが、あれは生成するのは今や簡単なんですが、通常は人間の手でパラメータを決めて生成するのに、そこそこの手間をかけている。そうでは無く、たとえばHTTPでリクエストしたら、そこに書いたパラメータを反映したQRのPNGが返る。ミリ秒で。

開発:まあ、我が社の先端CGi技術で(笑)。50ミリ秒で返せると思います。工期は2時間くらいですかね。どういう付加価値を付けるのかが問題かなと思いますが。

社長:そこで思ったのが「世界でひとつのカウンター」です。世界で起きたことの全てに一連番号を付与する。タイムスタンプと電子署名付きです。で、そのシリアル番号と署名情報をQRで返す。署名情報はPNGのコメント的チャンクに入れる。

基盤:日付入りのスタンパーって味があって好きなんですが、あれがQRで出来ているという感じですかね。

社長:それで私は qrstamp というドメイン名を取りました。

経理:.online で経費節約でした。

開発:しかし、我社の500円サーバでは、1秒に10回程度、一日に100万回がせいぜいだと思いますけどね。

社長:one small step for man ですよ。百里の道も一歩から。

開発:じゃま、とりあえずやってみますか。

社長:というか私、お昼にビール2本はちょっときつかったです。また眠くなってしましました。寝てる間にやっといてくれるといいな。

開発:それがそうはいかないのが当社の仕組みになっております。

* * *

開発:さて、QRの生成は go のパッケージで簡単にできることが以前の学習調査でわかっています。なので、この go スクリプトをコピペして、Go run!

開発:あ、パッケージが無いですね。こういう時は、go get パッケージ名、でゲットできることも知っております。go get。

開発:それでは再び Go!? no such file ... ああ、stap じゃなくて stamp ですね。では Go!

開発:所要時間260ms。これは想定どおりです。では go build のちに qrstamp!

開発:ということで、10ms以内の生成、png のファイルサイズは825バイトなので1パケットです。

開発:で、これを CGI から呼ぶわけですが… うーん、人間がテストするにはいきなりPNGでダウンロードになっちゃうのはイマイチですね。やはりHTMLの中に表示したい。あと、.cgi で呼び出してダウンロードするとそのもののファイル名になるから .cgi って何型式ですかって怒る人もいると。そもそも何という名前のファイルにするかというのも考えどころです。これもパラメタで伝えるんでしょうね…

経理:ポーン。アマゾンからメールが来ました。

基盤:めっちゃ色々 attempt しましたしねー。よろこびもひとしおです。

開発:うーん、昨日作った点描のを流用しているんですが、このフォームはめちゃダサいな。やっぱ、点描でもそうだし、色のピッキングの共通ライブラリが必要ですね。

基盤:いくらでも既製のがあるんじゃないですかね。

社長:何でもいいので、とりあえず結果が見たいです。

開発:それではミニマルで。こんな感じですかね。

社長:おお、どれどれ、iPhoneのカメラで覗く…

社長:なんか Hello World のまんまですが。

開発:Goでコマンド引数を受け取る方法をまだ知らないのです。というか、タバコが切れました。買ってきましょうか。

社長:いやその前にそこをなんとか。コーヒーを入れて置きますから。

開発:えー、go command line argument で検索。。ああ、os.Args[] という配列ですね。これでどうでしょう?

開発:あれ?なんか反転してしまいましたね。使える文字に制約があるとか?

開発:おや?

開発:はてな?

社長:あ、未開封タバコ一箱発見。一服しましょう。

* * *

社長:長さ制限とか文字セットでは無いですね。構文?

開発:手動テストに切り替えましょう。go run qrstamp.go 1234567890-... うーん、不思議。どういう規則でしょう? 200x200 なのがまずいとか。400x400。変わらないですね。まあ200x200で入りきならいはずが無い。os.Argsの問題?でも無いですね。定数で与えても同じ。

社長:以前 JavaScriptでPNG 生成というのを見ましたね。あれではどうでしょう?

開発:問題なしですね。

基盤:それにしてもこの、一文字入れるごとに生成されるデモ、何度見てもインパクトありますね。

開発:ということは、Go の QR パッケージに何かありますね。MacOS版ではどうかな…

基盤:なんと、問題なし。

開発:go のバージョンは…

基盤:気が遠くなるほど古い?てか日付がわからない。

開発:一応 apt upgrade。うーん、1.10.4 が最新でございます。というか、こういう基本的っぽいプログラムにとって、昔の版とか関係しますかねぇ。

基盤:Goの本家を見てみます。うーん、go1.14.4 が最新だとありますね。tarball を落としてインストールしましょう。っていうか、これなら xso にもそのまま持ってけますね。おやー、scp めっちゃ遅い。1.1MB/s。ライトセールはポートごとにチョークを変えてるんですかね?

基盤:ではインストール手引の仰せのとおりに。というか、今現在の Go って何者?

開発:骨董品ですね。

基盤:では仰せのとおりに /usr/local/go にインストールをば… てか、-C ってオプション。こういうのがあるといいなというか、あるはずだとは思ってたんですよね…

基盤:では。

開発:では、まずは /usr/local/go/bin/go run qrstamp.go 1234...。できたかな?ダウンロードして見る。

基盤:ばっちりですね。

開発:じゃCGIに。

開発:・・・ あれー、だめだな。ライブラリとの整合性?GOROOT環境変数とかかな…

開発:だめだ。本家の人の解説が見つからない。わからん。

社長:ちょっといっぷくしましょう。

* * *

開発:さっきうまく行ったように見えたのはダウンロードしたやつで… カメラで撮ってみる。

開発:う、そうか。枠が無いと、データによっては識別できないということか。つまり、あの青背景が邪魔をしていたのではあるまいか。白背景にしてみるとどうか。

基盤:当たり。

開発:例題をもっと簡単にしましょう。1234567890abcde。

1234567890abcde のQRコード

開発:これは枠なしで生成されてしまうので、カメラで認識できない。一方、1234567890abcd。

1234567890abcd のQRコード

開発:これは枠が生成されるので、カメラで認識される。

基盤:QRって枠というか外との境界に弱いんですかね。意外。

開発:問題は、この Go の QR パッケージは外枠を生成する場合としない場合があること。意図したものでは無いように思われます。いわゆるバグってやつ?

基盤:常に枠を出さないというのなら、それはそれで一貫していると思うんですけどね。

社長:だいぶ見えてきましたね。いっぷくしましょう。

* * *

開発:それにしても意外なところでつまづきました。

基盤:Goの版とか、寄り道をしました (^-^;

社長:でもそれが面白いです。自力インストールの勉強にもなったし。

基盤:まあ、ダウンロードして展開するだけということがわかりましたw

開発:最初、枠なしのやつが「反転している」ように見えたのですが、枠なしだとそれだけ人間の視覚的にも認識が動揺するってことですかね。

開発:Goのパッケージの仕様としては、枠あり、無しを明示指定できるのが良いのでしょうね。というかおそらく、QRの仕様として枠の仕様が規定されているんだろうと思います。

基盤:どういうコーディングなんですかね。っと。

ns0% cd ~/go/src/github.com/boombuler/barcode/qr
ns0% wc *
   66   186  1426 alphanumeric.go
   44   184   978 alphanumeric_test.go
   23    87   573 automatic.go
   30    90   806 automatic_test.go
   59   195  1784 blocks.go
   36   482  2332 blocks_test.go
  416  2321 15495 encoder.go
  134   298  2529 encoder_test.go
   29    79   639 errorcorrection.go
   60  1981 10157 errorcorrection_test.go
   56   160  1136 numeric.go
   26   132   783 numeric_test.go
  166   508  3309 qrcode.go
  126   340  2353 qrcode_test.go
   27    84   681 unicode.go
   18    80   473 unicode_test.go
  310  1540  9417 versioninfo.go
  157   562  4310 versioninfo_test.go
 1783  9309 59181 total

基盤:コンパクトですね。テスト用のコードを除けば 1,152行。

ns0% wc *go
   66   186  1426 alphanumeric.go
   23    87   573 automatic.go
   59   195  1784 blocks.go
  416  2321 15495 encoder.go
   29    79   639 errorcorrection.go
   56   160  1136 numeric.go
  166   508  3309 qrcode.go
   27    84   681 unicode.go
  310  1540  9417 versioninfo.go
 1152  5160 34460 total

開発:うーん、しかしこれ、仕様書を読みながらゼロからCで書いてたらと思うと、ぞっとしますね。

社長:そういえば、スケスケで色付きのとか虹色のQRってどう作るんでしょうね。

開発:PNGにする前にいじるか、PNGにしてからいじるかですね。二値画像ですから、どっちにしても簡単だと思いますが。使いでがあるっていう意味では、PNGの加工のほうが何にでも使えて良いですね。でも、せっかくだからQRのレベルでやるとすると…

func main() {
	// Create the barcode
	qrCode, _ := qr.Encode("Hello World", qr.M, qr.Auto)

	// Scale the barcode to 200x200 pixels
	qrCode, _ = barcode.Scale(qrCode, 200, 200)

	// create the output file
	file, _ := os.Create("qrcode.png")
	defer file.Close()

	// encode the barcode as png
	png.Encode(file, qrCode)
}

開発:qrCode というのを最終的に png.Encode してます。これは barcode.Barcode という型ですね。これは png.Encode が入力とする image.Image をラップしたもののようです。

開発:ところでこのパッケージ全体は barcode という名前なんですが、QRの他に通常のバーコードとか、PDF417とかを実装しているようです。え、PDFってあのAdobeのPortable Document Format?って一瞬ドキドキしたのですが、Portable Data File の略だそうです。

社長:そういえば海外から何か購入した時に見たような記憶もあります。

開発:1991年に発案されたそうですから、2次元バーコードとしては、1994年発明のQRコードより少し先輩ですね。

開発:それで、image.Image というのは何かというと、こういう定義です。

type Image interface {
    // ColorModel returns the Image's color model.
    ColorModel() color.Model
    // Bounds returns the domain for which At can return non-zero color.
    // The bounds do not necessarily contain the point (0, 0).
    Bounds() Rectangle
    // At returns the color of the pixel at (x, y).
    // At(Bounds().Min.X, Bounds().Min.Y) returns the upper-left pixel of the grid.
    // At(Bounds().Max.X-1, Bounds().Max.Y-1) returns the lower-right one.
    At(x, y int) color.Color
}

開発:この辺を Go QR がどうしているかというと、qrcode.go のこのあたりのようです。

func (qr *qrcode) ColorModel() color.Model {
        return color.Gray16Model
}

func (qr *qrcode) Bounds() image.Rectangle {
        return image.Rect(0, 0, qr.dimension, qr.dimension)
}

func (qr *qrcode) At(x, y int) color.Color {
        if qr.Get(x, y) {
                return color.Black
        }
        return color.White
}

開発:これを見ると、At で color.White を返しているところを透明?にすれば良いのかなという気がします。その前にまず、Black を返しているところを Blue にしたらどうなるか。… ああ、Blue なんて undefined だと。というか、そもそもGray16Modelです。では White にしてみる。ムジナになりました(笑)では、White と Black を反転してみるとどうか。変な感じになりました。

開発:Black と White の他に color.Transparent というのがあるようです。これじゃないですかね。

Standard colors.
var (
    Black       = Gray16{0}
    White       = Gray16{0xffff}
    Transparent = Alpha16{0}
    Opaque      = Alpha16{0xffff}
)

開発:うーん、真っ黒になっちゃいますね。というか、カラーモデルが Gray16Model なんでどうにもならないのかも。color.RGBAModel というのにしてみます。おっ!

基盤:大成功、ぱちぱちぱちっ。

社長:これだと何とか、iPhone のカメラも認識します。

開発:白抜きではどうでしょう。

社長:iPhoneのカメラはこっちのほうが得意ですね。

基盤:うーん、面白すぎ。

社長:面白くて疲れたのでひと休みしましょう。

* * *

社長:重ねてみましょう。

社長:ずうっとこれがやりたかったのです。構想6週間。

開発:制作半日、改変コード3行。

基盤:ほとんど関係ないところで迷って時間を潰してしまいましたね。

開発:世界征服カウンターまでたどり着けませんでした。

基盤:た~か~の~つ~め~

社長:良いではないですか。我社にとって one giant leap です。

開発:点描空間の素材にも使いたいですね。

基盤:ていうか、しょっちゅう外でゴホゴホ咳をしているおばさん何者ですかね?気になるというか気に触るというか。

開発:あと、枠がなくなっちゃう件は、qr.Encode でパターンを作った後に、barcode.Scale ていうので指定サイズに拡大フィットさせているようなので、ちょうどパディング無しでサイズにフィットすることがあるということかなと思います。もともとフチを作るという考えは無かったのではないかとも思います。構造上昔のバーコードには要らなかったのかなと。

-- 2020-0703 SatoxITS

ダメ銀行なの?

経理:こんなメールが来ました。

経理:そんなに限度額を低くしてるんですか?

社長:んなこたあない。

基盤:だいたい、今月 AWS から300ドルなんていう請求が来るはずがありません。3.00ドルならわかります。それにこのメール、いつもの .00 もついてないし、非常におかしい。

経理:きちんと電子署名されたメールですから、釣りとか冗談ではないと思いますが。

開発:この銀行、お買い物のアマゾンは通ってますよね。あれって日本国内での送金なんですかね?

経理:JPYになってます。

開発:あそうか。日本のアマゾンだし円で買い物してますね。

経理:円以外で払う場合の限度額とかの設定では無いですか?

社長:そんな設定あったかな?

開発:これ、ライトセールの料金ですよね。払わないと止められちゃいます。

社長:それは非常にまずい。今やライトセールは我社の生命線ですから。

基盤:ライトセールのコンソールにこのような悲しい事を書かれてます。

経理:コンソールのページのリンクから払えますね。

基盤:幸いまだ、ライトセールは止められてはいません。とてもにこやかです。

開発:Gmail なんて金払いが間に合わなかったら瞬時に止められましたよね。恐ろしい。

社長:まずは限度額の設定ですが… どうやるんだろう?おお、この機能検索は素晴らしい。やっぱりこのウェブサイト、よく出来てますね。… うーん、円以外での限度額設定があるようには見えないですね…

社長:うーん、メールをもう一度確認。ああ、このリンク先で設定しろと。おや?「海外ショッピング、限度額0円」になってる、これですかね?かちゃかちゃ、ぷち。これでどうでしょう?

経理:では「確認して支払う」をぽちっ。「支払いを完了する」をぽちっと。

社長:おっと、メールが来ましたね。

基盤:AWSのコンソールではこのように。

開発:めでたし。

経理:銀行からのメールです。

開発:これがそれになったと。

経理:ただいまの時刻、1ドル107.52円です。

基盤:3.07 * 107.52 ... 330.0864 円のはず。

開発:なんで9円多いんでしょう?さっきより円が下がった?

経理:引き落としがされたのが 10:17 でしたが、その時点でも 107.52 よりは高かったと思われます。

開発:うーむ、いつの時点のレートなのやら。あるいは何か手数料が?

基盤:総額の約3%なので、カード手数料っぽいですけど、それってこっちに盛られるわけ?

経理:要確認です。

社長:いやあ、でもとりあえず一件落着といいますか。私的には「限度額」の謎が解けてスッキリしました。USD 3.07 のはずが USD 307 と表示されてましたが、メールの後半にこのようにあります。

基盤:いったいどうやったらそういう画期的にヘマなシステムが実現できるんでしょうね??

経理:限度額だけの問題ではなくて、$3.07 は払えませんでした、限度額を上げたら、339.00円引き落としました、っていう展開は、わかるけど不連続に感じます。

基盤:「元の請求は $3.07 」であったことの明示と、それがなぜ 「引き落とし339.00 円」になったのかの説明が必要ですね。

社長:限度額の件もですね。「海外ショッピングの」利用限度額にかかったとか。でも実はUSD 300と誤認識されて、それが日本円に換算されて、限度額にかかった可能性も無くはないかなと思います。

経理:そういえば昨日、水道代の請求書が来たんですが、コンビニ払い用の請求書ですから、バーコードをスマホの PayB でぴってやって終了です。そういう意味でも、やはり PayB にも対応しているあっちの銀行が当社のメインバンクにふさわしいと思います。

社長:当社にふさわしい銀行(笑)それはともかく、アマゾンAWSがドルでっていうところにも問題の一端があると思いました。

-- 2020-0703 SatoxITS

専属ホスト

社長:/etc/hosts のユーザ版があると良いのにと思います。

開発:自分なりにホストに名前を付けたいことは多いですからね。

!!!

基盤:うわっ、またMacMini落ちた。

経理:そう言えば中にiMacの入ってるはずの台形ダンボールが玄関のオブジェ化してますね。ちょっと邪魔だし。我が社最初の固定資産なのに。

社長:オブジェ指向。

開発:開けたら中からカルロスさんが出てきたりして。

社長:しかし驚くのはこの、Mission Control の仮想デスクトップとそれぞれに配置されてたアプリのウィンドウがちゃんと回復することです。

開発:特にターミナルについては、まあセッションは切れちゃいますけど、やってきた作業の履歴が見れるのが助かりますね。

基盤:そもそも落ちなきゃいいっていう話ではありますけどね。ひょっとして熱暴走ですか?あと、Mission Control については、Desktop 1, 2, 3とかじゃなくて、ユーザに名前つけさせろって世界中で非難ゴーゴーです。

開発:まあゴーゴーするほどこれの愛用者が居るかって話ですけどね。そもそも仮想デスクトップは固定的な名前を付けられるような安定した存在なのかというところが疑問です。

社長:デスクトップごとに、ここはソフト開発用デスクとか、ログ監視デスクとか、社長のブログ執筆机とかw,固定してアプリを配置して、そのままずっと使い続けたいですね。

開発:普通に ~/Desktop の他に ~/Desktop1, ... 式にディレクトリを作ればいいんじゃないかって気もしますよね。

社長:それを言うなら、全てのディレクトリがデスクトップであり得ても良いですよね。単に、このディレクトリはデスクトップ的なビューで表示できます、てなスイッチがあってくれれば。で、そのディレクトリを開くと仮想デスクトップが開く。うーん、それともディレクトリの中でコンテクストメニューを開くと「デスクトップ型式で表示する」でも良いかな。

開発:それと、このデスクではタイル型のウィンドウ配置とか、サムネール置き場とか、デスクトップごとにウィンドウのマネージメントの方式を変えたいですね。ドックとかタスクバーなんかも、デスクトップごとに定義できる。

経理:デスクトップごとに、セキュリティ上のタイムアウトとかスクリーンセーバとか変えられたら安心です。

開発:昔は複数ユーザの間をシャカシャカ切り替えたりもしましたけどね。

社長:うちもいつかそっち方面にも手が出せると良いですね。

* * *

社長:昔はホストに短縮名を付けたり、階層的なドメイン名の省略規則を使ったものですが、最近ではそういう事はほとんどされなくなったように思います。

開発:はじめは /etc/hosts で、そのうち YP、NISが普及して、最終的にはDNS一色になりました。DNSではせっかく階層的になってても、参照する側はFQDNとしてしか使わなくなりましたね。

基盤:というかWindowsの人たちはWORKGROUPみたいなグループの中で名前を付けてましたね。WINS?

社長:そういえば私の先輩は今でも、自分のPCをetlxxxというホスト名にしてます(^^)

開発:GUI化して手打ちでホスト名を入れることがほとんど無くなったという事もあるでしょうね。管理上は、グローバルにいつも同じ名前表記で参照されることが望ましいし。

基盤:ですがインフラの管理作業ではターミナルを使うことが多いので、手打ちでホスト名を入れることも多くて、短い alias があったほうが助かります。

開発:その alias という単語を良く使ってたのは、おそらくYPでのホスト名の alias の事だったように思います。おぼろげな記憶ですが。

社長:短縮名やニックネームを一意に意図する対象に結びつけるというのは、特にコンピュータの世界では根幹ですね。

開発:DNSではドメイン名が直接最終的なアドレスまで変換されるわけですが、名前が多段階にマッピングされる場合もある。ファイル名のシンボリックリンクとか。

社長:まあサーバのマウントというのもまさにそれなんですが。HTTPの世界ではリバースプロキシという特殊な呼ばれ方をしますが。

開発:プログラミング言語の世界では名前のスコープとか寿命とかが明確に規定されていて有用なわけですが、あれと同じような名前の管理をもっと一般的に適用したら面白いと思います。

基盤:ホスト、ファイル、デバイス、ユーザ、それぞれに名前の管理システムが違うのはいかがなものかという気はします。

開発:それは昔なら /etc/hosts であり、/etc/services であり、/etc/passwd であり、/etc/fstab であり、とかしたわけですね。

社長:ユーザ名の識別もDNSでやったら良いのにと思いましたよね。なんでも階層化しちゃう。

開発:ユーザ名とホスト名の間が @ であるというのは、わかりやすくも有り、不連続で嫌だな感も感じはします。

基盤:@はマシンと人間の境界なんだと思いますが。あー、でも人間である必要は無いか。

開発:そこにポート番号を入れられたらいいのにと思いますね。だって、user@host.domain:port って、表記の位置関係が不自然ですよね。何にしても、@より左側の表記方法が定式化されていないのはつまらないと思います。

社長:そういえばドメイン名って、左から右に向けてローカル化する記法ってありませんでしたっけ?

基盤:名前をUUIDに変換するというようなDNS的なものはあるんですかね?まあDNSを使っても良いと思いますが。MACアドレスも逆引きできるといいですね。

開発:何にしても、ものには全てフィジカルに結びついた物理的なIDと、サイバーで論理的でマッピングしたり変換できるIDがあると良いんだろうなと思いますね。

社長:研究としてそういう事をやっているかやってた人は絶対居ると思います。

* * *

社長:それで、ホスト名をユーザが簡単に決めて、自分から見える世界ではいつでもどこでもそれを使えるようにしたい。/etc/hosts以外に簡単な方法はあるでしょうか?

基盤:というかDNS的ならベタファイルじゃなくて、ドメインの階層に従ったディレクトリになるんじゃないですかね。

開発:トップダウンなドメイン名の階層と、横紙破りなaliasの関係がよくわからないですね。

基盤:alias も階層化されるんでしょうね。

社長:それで私は、現行のシステムでホスト名がどう解決されるのか知りたかったわけです。で、strace telnet xxxxx とかして見たのです。で、名前解決のためにどんなファイルとかサービスを見てるのだろうって。

社長:あ、コマンド + +/ー でターミナルの拡大縮小ができるようになりました。さっきリブートするまで効かなくて、なんだろうって思ってたんですが。あれ?拡大が出来ない… おっと、コマンド+Shift+ +でした。なんでこうなるの?

経理:iMac にちゃんとしたMac用のキーボード付属してきてますよね。あとお絵かき用のパッドも。

開発:お絵かき用のパッドで、オレオレ手書きフォント作りたいですね。

基盤:点描に打ち込むんじゃないんですか?

社長:それで、grep -e xxxxx -e open なんてすると、こういう事になってました。

社長:47番に /etc/hosts が出てきてます。それより後はDNS/UDPです。

社長:で、思い出したんですが、何をどういう順序で見るかは、/etc/host.conf で定義できたようなという事。

社長:さらに man host.conf すると、trim というキーワードでローカルドメインのマッチングを制御できるということです。

社長:それで、order に何が書けるかというと、bind, hosts and nis なんですね。私もこれに習ってリゾルバの順序を規定するパラメータを作ったんだと思います。なんで dns じゃなくて bind なのかとか、nis ってまだあるのかしら?とか引っかかりは感じます。

社長:そして man hosts。残念なことに /etc/hosts 以外を見てくれる気配は微塵も無いですね。でも「In  modern  systems, even though the host table has been superseded by DNS, it is still widely used for: bootstrapping, NIS, isolated nodes」という事でした。/etc/hosts に #include とか書けるといいのにな。うーん、Google IMEのショートカットまで変になってきた。

経理:実際このキーボードが終わりかけなんでは。

基盤:怪奇現象に出会ったら物理層を疑えの法則。

開発:ユーザの使う共有ライブラリをすり替えて、openを引っ掛けて、/etc/hosts を read-only で開いたら、/etc/hosts と自分の ~/.hosts をマージしたものを返すとかでどうですかね。

基盤:まあ自分専用のリゾルバを立てるのが自然かなとは思いますが。

社長:そして!最初のほうに出てくる nsswitch というのに見覚えがあったので、man nsswitch.conf してみたら、これがまさに色んな名前のリゾルバーのスイッチだったわけです。で、こっちでは hosts は dns, file, nis だよとあります。そして、db というので何かできる感じはします。というか、/lib/libnss_xxxx.so を参照することになってるんですが、そういうライブラリってもう絶滅しているかも知れないので、自分たちで復活させても被らずに済むかなと言う感じがします。何にしても、昔の人は名前の解釈について統合的に考えてたように思いますね。

基盤:find するとlibnssありますね。x86_64-linux-gnu の下とか。

社長:まあ、既存の共有ライブラリを自分用にラッピングするという話であれば、gethostbyname()だとは思います。

-- 2020-0703 SatoxITS

レンタルWordPressサーバでCGI

開発:さて、それでこのCGIをXSOのWordPressサーバで動かしたいと思うのですが。

基盤:WordPress cgi でググる。・・・ なんだかよくわからないですね。でも、これって単に apache サーバだと思いますから、WordPress のお世話になる必要も無いかと。

開発:まあそうですね。

基盤:ただし!xsoのサーバには Go がありません。su にはなれませんから、apt とかではインストールできません。まあ、手作業でインストールすれば良いとは思いますが。

* * *

開発:xso のレンタルサーバって実体は何なんですかね?

基盤:Linuxで、カーネルは3.10のようです。

xso% uname -a
Linux xso 3.10.0-962.3.2.lve1.5.24.8.el7.x86_64 #1 SMP Fri Jan 4 06:55:54 EST 2019 x86_64 x86_64 x86_64 GNU/Linux

基盤:/usr/lib に yum なんちゃらがあるので、RedHat 系なのかなという気配がします。

xso% ls -ld /usr/lib/yum*
drwxr-xr-x. 2 root root 198 Jan 23 2019 /usr/lib/yum-plugins

基盤:ちなみにうちはレンタルサーバの最安プランでストレージの使用可能総量は300GBという契約になっていますが、このWordPressサーバぶんで物理的には8TBまでは行けるようです。

xso% df .
df: Warning: cannot read table of mounted file systems: No such file or directory
Filesystem 1K-blocks Used Available Use% Mounted on
8415360000 457725056 7957634944 6% /home/oreore

開発:これってSSDという話でしたっけ?8TBの塊なんて拝めるとは?

基盤:このマシンに他のどんなお客さんが居るのかはわかりませんが、ロードアベレージが1を超えているのは普通なので、まるでガラ空きというわけではないように思われます。

開発:メモリが26GBというのはなんだか微妙な数字。しかし、up 511 days って、結構な鉄人ですね。

基盤:CPUの処理能力的には並の下みたいな感じですね。

* * *

開発:では、CGIプログラムをこのサーバに置いてみましょう。とりあえず Goが無いので、.go はコンパイルして持っていきます。コンパイルする側のカーネルは5.3ですが、単にテキストファイルを読んでPNGに変換するだけのプログラムだからカーネルとか関係ないと思います。

開発:で、これを ~/public_html/its-more.jp/pointillism の下に置いて、おもむろにアクセス。

基盤:ふつうに動きますね。

開発:ただし。サーバ側でPNGをキャッシュしているらしく、打った点を含んだPNGがなかなか帰って来ません。

基盤:応答コードがほぼ 304 になりますね。Apacheかnginxの設定なのかな?そういえば、xso のWordPressにサーバ側のキャッシュを無効にするというプラグインが入ってて、有効にしてあります。「サーバーキャッシュの設定を有効にしたままで、新規の投稿をすぐに確認できるようになります。」という説明です。てことは、「そもそものサーバのキャッシュの設定を無効にする」のが簡単な対処法かなと思います。

開発:どういう設定なんですかね。

基盤:nginx server side cache で検索。… これですかね。

https://blog.runcloud.io/nginx-fastcgi-cache/
How To Use Nginx FastCGI Cache (RunCache) To Speed Up Your WordPress Performance

開発:サーバは xso が抑えてるからユーザには手が出なそうです。.htaccess 的なもので制御できないもんですかね。… そもそも何をキャッシュの対象に設定しているのやら。うーん、考えてみればこの cgi の出力自体は毎回更新されるし、*.cgi は除外されているのかも。じゃあ、生成した png を CGI として返してみましょう。

開発:で、どうかな?ぽち、ぽち、ぽち、…

基盤:作戦成功ですね (^-^)

開発:なるほど。普通に使えそうですね。自分の知らないCGIを勝手にキャッシュするような横暴はしなそうですから、これは一般的に通用する解決法と思います。

開発:というかそもそも、今どきのサーバでも普通に .cgi が使えるとは知りませんでしたけどね。

基盤:Go の処理系も持ってきてみますかね。さすがにカーネルの版が遠すぎるのが不安ですが。

開発:そうですね、いずれ手が空いたら試しましょう。

-- 2020-0703 SatoxITS

CGIでうっかりエラー

社長:今ポインティリスムで打刻しようとしたらこんな事になってしまいました。

開発:あれ?昨日から何も変えてないと思うんですが。しかし、ソースを見ればわかるとは言え、適当に書いたソースが直にこう出てきちゃうと恥ずかしいですね。

基盤:HTTP DeleGate のログにはこう出ています。

開発:ああ、その文字列はCGIの標準出力に吐いた記憶があります(笑)。なるほど、HTTPヘッダを吐くより前にエラーメッセージを吐いちゃったということか。

社長:CGIではそういうことをしちゃいがちでしたね。

基盤:何のエラー?

開発:((bad-XY)) と出しているのがDeleGateのログに記録されていますが、要するにHTTPリクエスト・メッセージ中の x, y 座標情報が変だ、特にこの場合には情報が無いというエラーです。キャンバスをクリックしてこのページを呼んだ場合でないと、そうなります。エラーというより、単なるテスト・デバッグ用の情報です。

社長:CGIでは、ヘッダだろうがボディだろうが、一連のストリーム出力でしか無いという事ですね。

開発:何にしても私は、ページ全体を作るのには今どきCGIではいかがなものかという気はしますが、個別部品を作るぶんにはCGIで全然問題ないと思うんです。

社長:ページ固有なCSSを生成するぶんにも問題ないですね。

開発:できることが基本クライアントとの情報交換だけで、自分の実行環境のことを知らないから、逆に環境独立というか、どこに持っていっても動くという強みはあるかなと思います。

社長:インタフェースは最少最小が良いという原則でもありますね。

-- 2020-0703 SatoxITS

WordPressでぞっとするエラー

基盤:ダッシュボードでこういうのが出ました。

ダッシュボード

基盤:編集状態のウィンドウではこういう状態になっています。

投稿編集

開発:同じようなエラーが、XSOで http と https を切り替えた時に出ましたね。ぞっとしました。

基盤:タブを複製しても出ます。ところが、新規にウィンドウを作って同じアドレスにアクセスすると、このように問題なく表示ができるわけです。

新規ダッシュボード

開発:Cookieの違いですかね。ウィンドウ毎に別のものを持っているんでしょうか??

基盤:それで、各ウィンドウでクッキーを見ると、このような違いがあります。

基盤:Cookieを覗いてみると、一つは wp-admin のセッション情報で、これを削除すると当然ログアウト状態になりました。面白いのは、それによって他のウィンドウのCookieも更新されたのです。

基盤:でこの状態でリロードをすると、エラーを表示していた画面が回復しました。

ダッシュボード
投稿編集

基盤:この状況から考えると、問題は2つ。一つは、WordPress が不適切なエラーメッセージを返している。特にedit.php においては、単に必要な Cookie が無いことが異常の根源だと思うのですが「PHPがー、MySQL がー」異常だと、人を恐怖に陥れるデマのような返答をしてくる。index.php にしてもそうです。要は Cookie が腐ってるということでは無いかと思いますが、その可能性について検討も言及もしていない。

基盤:もう一つの問題はVivaldi側。Cookieの更新やタイムアウトをウィンドウ間でシェアするところに不具合があるようにも思われます。まあ、エンドユーザ側のフロントエンドはあらぬ嫌疑をかぶる被害者であることは多いですが。

社長:放送側の問題であっても、映らんといってテレビ受像機がガンガン叩かれてたり。

開発:システムからのメッセージというのは非常に重要ですね。特にエラーメッセージは。

基盤:XSOの「失敗しました。」は傑作でしたが。

社長:そこのところが、有史以来ないがしろにされている感がずっとするのです。正常系は作るけど、異常系の手当に力が入れられていない。もっとも、想定外の異常は正常の場合よりはるかに広いでしょうからわからなくもないのですが。

開発:我々的にはログを見ればなんとかなる、ならまだ良いのですが、ログすらちゃんと提供しないシステムやツールは多いですからね。

社長:まあ、プログラムを書く時に異常処理を書き始めるとごちゃごちゃ膨らんでしまって嫌だというのはあるんですが、あのあたりを自動化して、しかもエンドユーザにわかるレベルのエラーメッセージを生成できたら、すごいことだと思いますね。

-- 2020-0703 SatoxITS

裸電球

社長;ふー、帰りました。今日はうってかわって夏の日差しですね。

経理:酒臭いですね。

基盤:ちかくのそば屋で牛丼ですか。

開発:優香みたいな子が居たとか。

社長:あー、あそこはおそらく中国系の学生バイトさんで回してますね。忙しいとは思えないのに厨房に2人、バイト1人。不思議ワールド。

社長:で帰りがけにゥエルシァに寄った時に、ハッとひらめいたのです。

開発:ポインティリズムの件ですか。

社長:いや、トイレのLED電球がもう海王星から冥王星になりつつあることを。それで入り口そばの雑貨コーナーで見たんですが、なーんと、昔風の電球が2つで200円、LED電球が一個で500円なのです。

基盤:HDDとSSDの価格差より大きいですね。

社長:でスペックを見たら、40W型のシリカ電球は消費電力38Wで定格寿命が1,000時間、一方LED電球の40型相当品は4.7Wで40,000時間なわけです。

基盤:大体ラズパイ vs 省電力PCみたいな感じですね。電球て宣言通りに40Wも食うのかー。ほとんど熱になっちゃってるんでしょうね。

開発:まあ昔は100Wのつけっぱなしくらいなんとも思わなかった時代はありました。

社長:電力消費のランニングコストでもとがとれるかどうか知りませんが、40,000時間といえば1,666日、4.6年なわけです。一方1,000時間というのは、つけっぱなしだと2ヶ月持たないから、頻繁に交換が必要。LED電球はこの間に電球交換の手間が要らないし、一回の交換の作業コストを100円と見積もっても、それだけで1年でもとがとれる勘定です。

社長:ですが、今冥王星化しているLED電球は、まあほぼつけっぱなしだったとは言え、2年弱しか持たなかった。もっとも、あれ自体の定格寿命とか見てなかったですが。それはともかく、さっそく電球交換しましょう。

開発:おっと、今日はまた新しい光り方をしてますね。20Hz くらい?で高速点滅。

社長:うーん、この点滅は高速ビデオカメラでないと撮影不可能ですね。

基盤:なんかそういう光り方をさせる回路かMCUでも内蔵しているですかね?一種のエラーメッセージみたいな。

社長:それではご苦労さんと。うーむ、全然熱くないところが元祖裸電球と違ってありがたいですね。さ、これが新しい電球ですよっと。ぐりぐり。おー。

開発:おー、明るいですね。今度のは昼光色っぽくてより良いと思います。

基盤:それで、終了した電球の頭にはこんな風に。

開発:同じメーカーですね。

経理:台所にその電球のケースが残ってました。

社長:捨てられない症候群。

基盤:60W相当方、8.2W、寿命20,000時間とあります。

開発:おー、ほぼ天命を全うしたと。

基盤:しかし、それから2年でこれだけ長寿命化が進歩したのか、そもそも低輝度のものは寿命が長いのか。数ミリアンペアレベルのインジケータ用LEDだとほぼ半永久的ですよね。

開発:しかしあの不思議な光り方、レギュレータあたりがイカれたんじゃないですかね。

基盤:私はマジで屋内の電源配線はUCB-CかPoEでいいんじゃないかと思うんですが。

社長:うーん。この新しい電球は5年近く持つと期待されます。それよりはわが社も長く頑張りたいものです。

基盤:ところでこの足元のサザエさん、E26口金と言うらしいです。すごい長寿命のスタンダードなんでしょうね。

経理:この旧式電球2つ、200円とは言え、何かに使うんでしょうね?

社長:冬になったら暖房用かな。ひよこを育てて楽しむとか。

開発:裸電球と言えばかぐや姫赤提灯でした。

社長:雨が続くと仕事もせずにキャベツばかりをかじってた♪

基盤:でもキャベツって結構高いですよね。

-- 2020-0702 SatoxITS