脱水バランサー

基盤:私は今、猛烈に感動しております。

社長:洗濯してたようですね。

基盤:この、低反発ウレタンのを自動で洗濯・脱水・乾燥するのが長年の悲願でした。

開発:あれは、脱水時にドラムが暴れるので断念して足踏み脱水+自然乾燥でしたね。

社長:あぶみ式ってなんか聞いたことがあるような。ああ、あれはアプト式ですか。

基盤:基本的な問題は、なまじ洗濯槽のキャパが大きいので偏りが大きくなる、回転のモーメントで暴れるわけです。

社長:だって、容量的にはあの12kgのしか選択肢が無かったんですよ。自動乾燥を考えればドラム式しか無いですが、あのメーカーのはダンパーがよく出来てて静音だっていう評判だったし。温水泡洗浄でヒートポンプ乾燥。液晶のコンソールもなかなかよく出来てるし。夢の家電としてお迎えしたのですが。

開発:前の機種は、温風だけの乾燥なんで超加熱。緊急停止してドアを開けてもらうよう説得するのが大変でした。エラーメッセージじゃなくべエラーコードでしたし、何が不満なのかこちらにはわかりかねるというか。

社長:メールかSMSをくれても良いですね。

開発:ソーシャル?あるいはプロモーション?

基盤:でも、これはスカスカで回すから偏って暴れる。タオル1枚でもです。静かに回ってくれるのは、中身が空っぽのメンテナンス作業の時だけでした。

社長:足元のパンのあたりの足回りの強化とか、必要な経費は出せます。

経理:上限20LSUくらいでお願いします。

基盤:ていうかこの、台所の換気扇のヒーヒー言う音がヒジョーに嫌なのですが。なんとかなりませんかね。

経理:不動産屋さんに相談してみましょう。とりあえず切ります。

基盤;まあそういうことで、とりあえず洗えるものをかき集めて、毛布とかも詰め込んでみました。槽内満タン状態。

開発:いわゆるパディングですね。最近はCSSの夢をよく見ます

基盤:まあ、洗い始めて水を吸っちゃうと見た目ぺちゃんこなんですが。

基盤:さーて、それで回してみると。いかがでしょう。…。いつもならすすぎ用の脱水時点で断念途中棄権ですが、あっさりと通過しました。

経理:素晴らしい。

開発:これ、槽内照明が8秒くらいで切れてしまいますね。一番のハイライト観戦が邪魔されてしまう。何考えて作ってんですかね?

基盤:まあそこは、われわれの感覚とは違うユーザを想定してるんじゃないですかね。

* * *

基盤:そういうことで、最大の山場、乾燥開始前の脱水フェーズに到達しました。

洗濯:うーんんん、ひゅーんん、だっだっだ… だんだん!しゅーん。プシュう。

社長:結局暴れて断念したような・・・

基盤:いや、これからまたリトライが始まります。捲土重来です。今呼吸とバランスを整えているフェーズかと・・・おっとまた来た。

洗濯:うーんん、ひゅーんん、たったったた、シュイーンン、グッグッグーグルンンンンーーーゥゥン…ジャボジャボ。ゴボ。

開発:回りきりましたね。今のが1000回転の音?

基盤:しかし、乾燥フェーズに入ってから厳しい脱水に挑むのも不思議な気はします。せっかく液晶パネルがあるので、意図を説明して欲しいですね。まあ、脱水フェーズは通過してるから、普通に外に出して乾燥するのでも良いですが。

社長:何にしても、恐怖かつ不可能と思われていたウレタン洗濯がこのように楽しく心地よいものになろうとは。我社創立以来最大のブレークスルー・慶事ではないでしょうか?

基盤:ということで、ついに乾燥作業の低速回転に入りました。残り3時間40分。

開発:しかしこのウレタン、本当にこの中で乾くんですかね?外に出して乾かしたほうが良くないですか?

社長:まあ良いではないですか。めでたいので飲みに行きましょう。

開発:というか、中身が少ないと暴れるという話は良く聞くし、何か詰めれば良いとも聞いていたんですが、実際それだけで解決するとは。これ、自動的に水でバラストしてバランスとるとか出来ないんですかね?

経理:意味もわからず詰め込まれて洗われてしまう洗濯必要無いモノも気の毒ですよね。

社長:うーん。自動的にバランスを取るもの。回されるエネルギーも少しは回収したいものですが… 減速する時とか。

基盤:振動でイルミネーションするみたいなバランサーでどうですかね。槽内がすごくにぎやかで見てて楽しいのでは。

開発:ピエゾ+LEDででイケそうですね。でも、防水がどうなのか。

* * *

洗濯:ぴー ぴー ぴー ぴー

開発:ふあ?あ。あー、よく寝た。

社長:あれはモールス信号的には、ム ム ム ム、です。

基盤:乾燥終わりましたね。どれ。おー、ふかふかで槽内がパンパンに。

開発:すばらしい、ウレタンもちゃんと乾いています。

社長:うーむ、我社最高の家電を再発見しました。これぞ文明の利器。

-- 2020-0706 SatoxITS

かなローマ字変換

社長:ローマ字入力とかな入力を切り替えるコントロール+スペースを押すのも億劫になりました。

開発:Apple の日本語キーボードならスペースキーの両脇の切替キーでできますよね。トグルじゃなく。

基盤:コントロールキーもでかいと思います。あの箱を開けましょう。

社長:一体誰が使うのか知りませんが、このCapsLockキーというの。昔は引っこ抜いたりコントロールと入れ替えて使ってましたけどね。もうめんどくさくなって。

開発:少し前までは専用キーにまで指を伸ばさなければならなかった事を考えれば、贅沢な話です。

社長:それで、ひらがなローマ字変換をやってみてはどうかと思ったわけです。

開発:昔はそういう遊びもしたような記憶が。

社長:でまあ私の辞書をこのように作ってみまして。

社長:one small step for a man,one giant leap for man kind.どうです、記号キーさえ要らないんです。とてもらくちん。

基盤:Google 翻訳でできるかも。

社長:勝利w

基盤:日本人の英語を英語に翻訳する機能は必要だと思います。

開発:まあ昔のWnnやKannaではオートマトンをいじれましたけどね。Google IMEでそれができないですかね。

社長:ああ、ここは英語を入力したがってるなと思ったら英語入力になるとか。シフトで大文字を入れると英単語状態になるのは知っているのですが、macOSとかいうタチの悪い表記もありまして。

基盤:OSとかアプリのショートカットキーなんかもオートマトンで定義できると良いですね。

社長:まあローマ字かな変換、かな漢字変換は機能を呼び出す呪文みたいなものですよね。だからこれで、端末でコマンドの alias を定義したりとかできるはずです。メニューを呼び出したりとか。

開発:プログラミング言語の構文というか字句も定義できますね。変数名のコンプリーションなんかも同じ方式でできるはず。プログラミング環境からオートマトンや辞書を取り込む。現在のプログラムのスコープの中で動的にオートマトンを変える、とか。

基盤:電卓もできるとよいですね。1+2と入れると3と出る。0x100と入れると256と出る。$1と入れると107円と出る。いめと入れると http://www.google.co./ime/と出る。

社長:検索とか翻訳を入力で統括すればいいですね。

開発:辞書という意味では、現在入力してる文書からとか、もろもろ文脈とかから自動的に生成してくれると良いなとは思います。それでオートコンプリーションとか。

基盤:あうんというか、みなまで言うなみたいな。

開発:辞書の自動生成とかやってた人居ませんでしたっけ?

基盤:HTMLとかCSSの知識というか構文なんかも覚えさせられると楽ですね。

社長:日本語IMEという枠の中で日本語入力をする時にしか使わないのは勿体無い話です。せっかくなので、常にONにして使いたい。英語とか他の言語の人にもおすすめしたい。

開発:といいますか、ここではASCIIオンリーとか、このフィールドは数字だけとか、このパスワードのフィールドを入れる時は英数字だけとか、そういう環境制約を察知してくれると、ありがたいですね。

基盤:アプリケーション単位ではできるんじゃなかったでしたっけ?

社長:フォームの入力でフィールドがやたら狭かったり字が小さかったりでムカつくことも多いです。ポップアップするウィンドウで入力するモードはあるんですかね?

開発:それならラインエディターの機能も欲しいですね。

基盤:行にこだわる必要もないんじゃないですかね。要するにテキストエディタになっちゃえば良いかと。

社長:まあ、プレインテキストに限定される必要もないという話ですね。

基盤:なんかさっきから固定電話が鳴り続けてますが、人間からじゃないですか?

経理:(かちゃ)。はい。え?はい、はあ、いえ、まだ大丈夫ですから、はい。さようなら。ぷちっ。

経理:終活セミナーのお誘いでした。

社長:せめて就活セミナーにして 😉

-- 2020-0706 SatoxITS

GoogleモールスIME -.-.

社長:もはや Google IME 無しでは日本語入力が出来ない、というかしたくない体になってしまいました。

基盤:なんか、モールス入力バージョンも出てますが。

開発:マジかw

社長:ほほー。私は英語のモールスなら組み込み系の基板のLEDやブザーで使ってたんで、何文字かは知ってるんですけどね。練習してみましょう。… うーむ、なかなか難しいな…

社長:とりあえず一面クリアw

開発:これはマウスよりキーのほうがやりやすいですね。

基盤:でも、マウスだけでやりたい場合もありますよね。片手が頬杖用にふさがっている時とか。画面キーボードとかうざいし。

開発:マウスのドラッグでできるフリック入力とかありそうですね。

社長:最近 Vivaldi でブックマークのダブルクリックに違和感を感じてしまうので、リハビリに良いかも。

開発:いやこれは、ダブルクリックどころの話では無く、まじでクリックの時系列パターンだけで豊富な情報を伝えられるという話ですよね。

基盤:reCAPTCHA をモールス押ししたら褒めてくれたりしないですかね。

開発:そういうアメも必要ですよね。というか私、ヒトによって押すボタンの中の位置の個性があるんじゃないかと思って、それをクリッカブルマップで調べたら面白いかなと考えています。

社長:モールスを入れるには、キーボードもマウスも、リアクションが大きすぎると思いますね。特にスペースキーは。

経理:まだダンボール箱から出てないAppleのキーボードは軽いですよね。ああ、ビデオに出てくるお兄さんが使ってるのは MacBook みたいですよ。

社長:vi 使いなら J だと思うんですが。なんかもっと軽い反応のもの…

経理:たしかマジックパッドというものも、箱に入っているはずですが。

開発:JとKで、短点と長点という方法もあり得ますね。右手がふさがってるときは、左手でDとFとか。

社長:複数キーを使うなら、文字の終了を示すキーも加えたいですね。Lかスペースかな。たとえば、イが .- でオが .-...、カが .-.. ですから、イは JKL、オは JKJJJL、カは JKJJL とか。

基盤:5本指5ビットパラを使える前提なら、1ビットシリアルのモールスより効率的なコーディングはあるとは思いますね。

開発:というか、実は何語に限らず、片手だけで入力する方式とかあるんじゃないですかね。需要は昔から絶対あったはず。

社長:ジョニーは戦場へ行った…

基盤:複数のキーを同時に押したことがセンスできるなら、10本指がある人は、悪くても8ビットパラレルでいけますから、256 文字までワンタッチでイケますよw

開発:とはいえ、まあとりあえずは、かな入力じゃないですかね。

基盤:というか、こんなに広い画面があるんだから、文字盤とか候補をどーんと出してもいいんじゃないですかね。かな漢字変換より前の時代みたいに。Goolge IME のこのコセコセと白黒に縮こまった感じがどうも。多少透明にするとか、色に意味をもたせるとか、やれば良いのに。

開発:というか、一文字拾うのと文字列をコピペするのは連続的みたいなものだから、自分で文字盤的テキストを定義して、その中の文字を1クリックしたらそれがコピペされるような漢字でどうかな。複数文字というか文字列をコピペしたかったらドラッグする。これは、専用の文字盤でも良いし、普通に書いてる文書とか、見てるテキストから拾えるのも良い。どんなアプリにも対応というなら、画面のOCRでも良い。

基盤:まあ、コピペだけで文章書けますよね一応。

社長:ライバルは音声入力かなとは思いますが。でも、スマホでならまだしも、あれは全然流行らないですよね。

開発:社長には滑舌の高い壁がありますが。

社長:それでは「自由に入力コース」に進級します。やはりHello World「こんにちはせかい」ですかね。

社長:(ため息)

基盤:思うに、そのまんま . と - とスペースキーで入れられれば良くないですかね?どうせJavaScript でしょうからいじってみませんか?

社長:まあ、キーボードが酒浸しになった時に、特定のキーしか効かなくなってしまった私のMacBook Airを Google が救ってくれるかも知れないのですよ。練習あるのみ。

社長:あれ?意外と簡単。でも、完成しても褒められ方が薄くてちょっとさみしい… あけおめことよろ…

開発:これ、ロボットにもできますかね。

社長:ロボットの良心に訴える新方式。特許申請の準備を。

基板:これって文字が確定するごとに音声出してくれないですかね。

社長:てか、BSとか undo ってモールスではできるんですかねえ、ポチっ。

基板:やられましたねw

開発:再変換とか候補選択はどうなってるんですかね。

社長:そのへんの機能の呼び出しはメニューとか、GUIなら色々補完できますね。必要なのはナマのアルファベットの入力。文字盤からの選択やらフリックに勝てるもの。

開発:まあスマホではやってることですしね。

社長:いや、これまじで使えるんじゃないですかね。ライセンスを調べておきましょうよ。それで、これはなんですかね?わくわく。

基盤:彼らは冗談のつもりなのかも知れませんw

開発:我社もモールスは検討していましたが、してやられましたね。

社長:Googleに負けた…

基盤:まあ会社の規模も違いますし。

社長:いや、入力だけでなく、聴覚が衰えてくる出力としてもモールスは優秀。基板が奏でるモールスのメッセージというのは味のあるものでした。そういう実用エンタメ要素もある。それにうちはまだ テルミンIME という最終兵器があります。

基盤:それって手話の事ですか?

-- 2020-0706 SatoxITS

http://no.such.domain

開発:どうもブラウザごとにURL窓の解釈が違うのが気になります。特に /etc/hosts を見てくれないような

開発:例えば /etc/hosts に以下のように書きます。そうすれば、http://no.such.domain にアクセスしてくれると思いきや、そうでも無いのです。

開発:Chromeは検索に飛んでしまいます。ただ、あなたの意図は http://no.such.domain か?と聞いてくるので、クリックすると飛ぶことができます。で、一回学習すると、その後はサーバ名として解釈するようです。

開発:Firefoxも同様ですが、もう少し親切。

開発:Edgeでは検索エンジンをBingにしているのでBingに飛びましたが、本当に no.such.domain に飛びたいのか?と聞いてきました。

開発:OperaはGoogle検索に飛んでおしまい。

開発:Vivaldiの場合は… 聞かれたのかどうかちょっと覚えてません。が、Opera系だと思うのに振る舞いが違います。

開発:これがドメイン名型式でない、no-such-domain と入れると問答無用で検索になります。あ。… http://no-such-domain であれば繋がりますね。

開発:そうか、/etc/hosts を見ないわけではなくて、単に単語をHTTPサーバ名と解釈するかは優先順位が低いということですね。最近 http:// とか入れることが無くなったので、気が付きませんでした。

社長:まあ、サーバ側が意図しているホスト名でなければ普通は拒否されますけどね。特にHTTPSだと。

開発:ですが、ホスト名の部分で情報を伝えることが有利である場合もありますね。URLのパスの部分でユーザの意図する情報を伝えるのが簡単で無い場合が多い。かと言ってクッキーは可視性とかに問題がある。とすると、arg.command.user.host.domain みたいに、やりたいことをサーバ名の部分で伝えるというのも一つの選択肢かなと思うんです。

社長:ドメイン名の検索は丸見えだしキャッシュもされるとなると、セキュリティとかプライバシーに関連する情報は乗せられないですけどね。

-- 2020-0706 SatoxITS

ドメインNS大移動

社長:それでは、移動を決行しましょう。

開発:お願いします。

基盤:まず新 ns1 においてNSを変更する全ドメインのデフォルトAレコードを ns1 自身に向けました。これより xsoとnsoで全ドメインのNSレコードをns1に向けます。その直後より、テスト用ホスト名を定期的にdigしてNSの伝播状況を連続観察します。

基盤:これまで一発で変更したことがあるのはせいぜい十数ドメインまででしたから、ちょっとどきどきします。では。

基盤:08:10、全サーバ NS設定一斉変更、確認よし。Go!

基盤:約1分後。

基盤:08:12付変更受付メール86通の嵐到来。

基盤:08:18付変更完了メールの嵐到来。

開発:Gmailへの到着はだいぶ遅いですね。6分近くの遅延。

(発信)Date: Sun, 5 Jul 2020 08:18:14 +0900 (JST)
(到着)Received: Sat, 4 Jul 2020 16:24:08 -0700 (PDT)

社長:どこで滞ってるんですかね。詳しく。

基盤:最後にメールボックスに入れるところのようですね。そこまで4秒で到達しているのですが。ここでフィルターしているんでしょうか?6分4秒かかっています。

Received: by 2002:adf:fc8e:0:0:0:0:0
Sat, 4 Jul 2020 16:24:17 -0700 (PDT)
X-Received: by 2002:a17:90a:20ad:
Sat, 04 Jul 2020 16:18:13 -0700 (PDT)
X-Received: by 2002:a17:90a:20ad:
Sat, 04 Jul 2020 16:18:12 -0700 (PDT)
Received: from xso by google;
Sat, 04 Jul 2020 16:18:12 -0700 (PDT)
Date: Sun, 5 Jul 2020 08:18:09 +0900 (JST)

基盤:まあ、こういうのを挿入するのに時間がかかっているとか。

開発:よく迷惑メールフォルダ送りにならないものです。

基盤:まあこのメールボックスは xso からのメール受信専用ですからね。Google だってそのへんは経験上察してくれてるのではw

社長:以前は速攻で嵐が来たものですが、あの時はまだ G Suites じゃなかったんですね。

開発:xso のレンタルメールサーバでしたw

基盤:それはそうと、xso のメールが ISO-2022-JP のプレインテキストだというのにちょっと感動しました。

Content-Type: text/plain; charset=ISO-2022-JP

開発:25年前の技術が生きていますね。

基盤:次に nso においても、2件だけですが、NSの付け替えを行います。

基盤:ぷちっと。

基盤:あれ?

社長:nso って足抜けが作業が一段噛むとか。

* * *

開発:.click だの .work だのが速攻で通じたのは、TLDのDNS サーバが暇だからですかね。あるいは新しめのインフラで処理能力が高いとか、上流の段数が少ないとか、キャッシュの設定が機敏とか。

基盤:クラウド上のホストで観察していると、1時間後くらいには全て変更後の情報が得られたのですが、会社のホストから見ていると、12時間たっても未だに旧NSが参照されたりされなかったりしています。

開発:基幹では速達だけど、末端ではキャッシュが複雑に働いているということかと。

社長:というか、うちのルータとかこのMacMiniが怪しくね?どうも Vivaldi でのリロードも変ですが。

開発:この v6+ の系統もどうなんですかね。クラウド上にHTTPプロキシを置くとかしたほうが幸せかも。

社長:DNS/UDP だけプロキシすれば良いのでは。

開発:でも TCP 全般も、クラウドまで直通すると良いことがあるかも。

社長:まあ、やはり、クラウド上のサーバをおうち用のルータとして使うて感じですかね。

基盤:そういう状況なので、72時間かかるかもよと言っているわけですね。でも TTL 86400とか見たことあるけど 259200 なんて見たことないなあ。

開発:72時間(3日間)で浸透する保証も無いですけどね。DNSの規格上のTTL最大値は7日間。典型的には12時間から24時間だと日付不明のこの記事にはあるけど、それは現状では典型的ではないと思うなあ。

-- 2020-0705 SatoxITS

経費計量単位・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.114.129.31 でしょう。


社長:ずばりでした。

開発:なるほど、そういうことなのか。ヤバい、面白くなって来てしまいました。これでインラインの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