さらば Azure

社長:当然そういう流れになりますね。

基盤:今日からアマゾン祭り、仮想マシン大セールです。

経理:Azureの仮想マシンが月3,000円になって納得していたのですが、アマゾン Lightsailなら月500円でできるということでしょうか。

開発:プライム会員費と同等ですね。

経理:そういう表現をすると、イマイチお得感が薄れますが。

基盤:今のAzureの1台と同じ費用で6台並列イケます(笑)。今のところ気になるのは転送量2TBという制限だけですね。でも、転送量が必要なサーバがあれば、それだけちょっとクラスを上げればOK。

開発:サイズの大きなファイルはクラウドのドライブでっていう手もありますね。

社長:URLでアクセスできると良いのですが。

開発:GoogleDocsのファイルとかURLでアクセスできますから、できるんじゃないですかね?

基盤:ディスクが40GBというのは、アクティブなデータの量としては十分ですが、ログとかアーカイブ用には不足です。ですがこれもクラウドのドライブをマウントするという手が考えられます。ちょっと気になるのはFUSEとかが異常に遅いこと。これは例えば隣のWindowsサーバ仮想マシンでマウントしたのをSMBとかNFSでLinux仮想マシンから見るみたいので改善できるかも知れません。

基盤:それはそうと、iMac 開封しませんか?

開発:世の中に台形のダンボール箱があるということを始めて認識しました。あれが上海からやって来たとは。運ぶのも大変だったろうし、無意味に破損の危険性を増してますよね。受取人の笑いを取れるのと釣り合わないでしょう。何考えてんだApple。

経理:もとは6/29着という話でしたが3日早まりました。定形外で予測が難しかったんでしょうかね。

社長:開けたいのは山々ですが、取り掛かるとしばらく仕事にならない危険性があります。その前に片付けて置いたほうが良い事。

経理:一日20円で済むはずのクラウドのサーバ代が、現状では100円。毎日80円が損なわれている事が気になります。

社長:ではまず引っ越ししましょうか?どのくらい時間が掛かりますかね?

基盤:そうですね。支配的なのは現行のサーバからファイルを転送する時間ですね。現行Azureの30GBのディスクはほぼフル。圧縮して10GBつまり10,000MB程度になるとします。転送が最悪1MB/秒とすると10,000秒、2〜3時間かかると思われます。これは以前の引っ越しでもそういう感じでした。その後は、設定と確認に1〜2時間、くらいでしょうか。

社長:じゃ、それ今日やっちゃいましょう。

基盤:ラジャー。

* * *

社長:で、どんな感じですか?

基盤:それが Azure アジアと AWS 東京の間は 10MB/s 以上出ますね。なので転送は想定していた10分の1で終わりそうです。サーバのデータは展開した状態で20GB、100万ファイルというところですが、df で増加分を見ていると、15MB/s、1000ファイル/秒で受け取っています。

開発:それだと、受け取った側でファイルを展開したり書き込みするところが律速段階になっているかも知れませんね。

基盤:それはそうと、sudoers の追加のし方を全く忘れてまして。というか、私が覚えた頃とは違うのかも知れません。何にしても、sudo しなければならないのはファイルのモードとオーナを変える時だけなんですが。あ、ファイル容量的には転送完了しましたね。あとはアクセスカウンターのファイルが半分くらいあったりして。これ、作りが間違ってますよね(笑)

社長:作り変えようと思っていたんですが、ちょうどその後この仕事から離れてしまったんです。まあ、こういう転送とかバックアップの時には害ではあります。

基盤:このライトセールお仕着せの構成サーバ、Bitnami WordPressパックので Ubuntu 16.04 なんですが。Linuxカーネル的には4.4ですが。

開発:まあうちは基本カーネルの機能、しかもありふれた機能しか使わないから構わないんじゃないですかね。

基盤:昨日、OSのみの Ubuntu 18.04も試したんですが、ハード構成は同じはずなのに妙に遅かったんで。いずれ、ちゃんと性能評価はしないといけないです。

開発:ひょっとして、バーゲンセールなんで当たり外れがあるとか?

基盤:あ、ニュースのメッセージIDのリンクを受け取りはじめましたよ。これも大量にあるんですよね。終わった。転送ファイル数80万、所要時間40分でした。du 的には18.5GB。

開発:それでは DeleGate の etc に行って sh httpd。あ、80をbindできないと。subin/dgbind のオーナとモードを変えて再トライ。あれ?

基盤:apache が使ってるからじゃないですか。

開発:あそうか、ではとりえず apache2 には死んでもらおう。kill !。再び sh httpd ... おお、立ち上がった。telnet localhost 80 ... 反応よし。うちのブラウザから繋いで見る。

基盤:繋がりました。このページ見たの、久しぶりです。

開発:贔屓目じゃなく、XSOのWordPressへのリバースHTTPSプロキシの反応が速いですね。これつまり、XSOの近くにアマゾンが居るのかな?XSOはAWSで出来てるとか。

基盤:まず AWS から its-more.jp に ping。

AWS$ ping its-more.jp
PING its-more.jp (163.44.xxx.xx) 56(84) bytes of data.
64 bytes from XSO (163.44.xxx.xx): icmp_seq=1 ttl=41 time=3.01 ms
64 bytes from XSO (163.44.xxx.xx): icmp_seq=2 ttl=41 time=2.96 ms
64 bytes from XSO (163.44.xxx.xx): icmp_seq=3 ttl=41 time=3.04 ms

開発:3ms。ほぼ最速ですね。

基盤:次に Azure から同上。

Azure$ ping its-more.jp
PING its-more.jp (163.44.xxx.xx) 56(84) bytes of data.
64 bytes from XSO (163.44.xxx.xx): icmp_seq=1 ttl=49 time=51.0 ms
64 bytes from XSO (163.44.xxx.xx): icmp_seq=2 ttl=49 time=51.0 ms
64 bytes from XSO (163.44.xxx.xx): icmp_seq=3 ttl=49 time=51.2 ms

開発:50ms 😉 それでリバースプロキシがあんなに遅かったのか・・・

基盤:sudo apt install traceroute。traceroute its-more.jp 。。。

開発:うーん、AWSのほうも18ホップしててこれですか。

基盤:Azure では通らないですね。セキュリティゾーンとかの設定が必要なのかも。

開発:まあいずれ死ぬほど暇な時があったら試しましょう。

基盤:それではさっそく、DNSサーバに登録しましょう。

開発:とりあえず XSO の DNSサーバにある delegate9.org からですかね。

基盤:IPアドレスはどうしましょう?

開発:まあなんでも良いのですが。いくつかとってみて良さげな番号を選びますか。

基盤:そういえば固定IPアドレス5つまで無料、の件ですが、1台に5つ無料という意味ではなくて、まあそりゃそうでしょうね、1アカウント5つまで無料という事のようです。逆に1台に複数割り当てられるのか不明。

社長:うーん、8年前にクラウドに移行する時には当然EC2を考えたのですが、Azureのほうがバカチョンで良かったからAzureにしちゃったんですよね。あの時EC2にしていれば私の老後の蓄えも…

開発:まあでも現状のEC2を見てもAzureより劇的に安いというわけでも無いですから、やはりこの Lightsail がとんでもないってことじゃないですかね。

基盤:それでは XSO のDNSサーバのAレコードをこっちに向けます。なんでこうかったるいんでしょうね。ぷちぷち。コピペという技術がなかった時代に出来たUIなんでしょうかね?どうしても人間の手を煩わせないと気がすまない的な奴。ぷちぷち。ひー、入れ終わりました。GO!

開発:さて、どのくらいで開通しますかね。

基盤:例によって繰り返し dig するスクリプトを動かしてと。あ、いちおう dig @01.xsodnsv.jp delegate9.org。はい、正しく登録されております。

社長:基本的にはこれで終了ですね。所要2時間でした。

基盤:あれ?もうほとんど浸透してるようです。数分でした。

開発:おお、HTTPSリバースプロキシもさっくさくです。

基盤:次はNSごと。その次はレジストラ移動ですね。すっきり爽やか。

社長:飲みに行きましょう。

* * *

Amazon Lightsail 最高!

基盤:さてAWS EC2の仮想マシンですが、これまで作った t2.micro (x86_64) Ubuntu 18.04 は $0.28/day、a1.medium(ARM 64bits)Ubuntu 20.04は $0.77/day ということになりました。

開発:我社として早急に必要でかつ長期的に運用したいのはDNSサーバ+最小限Webサーバですね。そのために $0.77/day は高すぎると思います。月500円で年6,000円、これが適当な線ではないでしょうか?

t2.micro はまずまずだが 8GB SSD は厳しい
a1.medium (ARM) は高い

Lightsail

基盤:それなんですが、AWS EC2 の価格はどうもよくわからないので、Amazon Lightsail というののお仕着せの格安マシンをやってみようと思います。これですと「月額おいくら」という選択が簡単で、価格体系が大変シンプル。まずは、$5でメモリ1GB、1CPU、40GB SSD、転送量2TBというのでやってみたいと思います。お仕着せなので、OSが何かわからないのですが…

基盤:あとこれはよくわからないのですが「静的IPアドレスは固定のパブリックIPアドレスであり、インスタンスにアタッチされている間は5つまで無料」と書いてあるのです。勘違いでないならこれも大変お得です。

基盤:それでサクッとできたインスタンスにログインしてみたら、 Ubuntu 16.04 でした。

aw1% uname -a
Linux ip-172-26-7-51 4.4.0-1102-aws #113-Ubuntu SMP Wed Jan 29 14:54:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

基盤:ディスクも37GB空いています。

基盤:そのくせ、make も cc もインストール済みなんです。CPUは2.4GHzなのではやや遅いですが、実用上問題ないと思います。

aw1% dmesg | grep CPU0
[ 0.240071] smpboot: CPU0: Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz (family: 0x6, model: 0x3f, stepping: 0x2)

基盤:ディスクへの5GBの読み書きに80秒、60MB/s 以上の転送速度で、まず問題ないと思います。

基盤:delegate9.9.13 のコンパイルもサクッと終わります。3GHz の x86 で 80秒くらいですから、妥当です。

real 1m46.784s
user 1m31.612s
sys 0m6.380s

基盤:HTTP のほうへ接続するこういう感じ。

基盤:それでDNSサーバをさせるのに53/UDPを通さないといけないわけですが… どうやらこのネットワークのファイアウォール設定でポチッと追加するだけで良いようです。

基盤:で、適当に hosts ファイルを作って DNS用にDeleGateを立ち上げる。

aw1% cat hosts
1.2.3.4 hello.world

aw1% delegated -P53 SERVER=dns ...

基盤:そして検索!

MacMini% dig @54.238.125.26 hello.world
;; ANSWER SECTION:
hello.world. 21600 IN A 1.2.3.4

基盤:何というお手軽さ!

開発:管理がお手軽で、うちの使い方には全く十分な機能と性能、そしてお値打ち。うーん、これを今まで知らなかったとは。Amazon Lightsail って2016年にデビューしたらしいんですが。

社長:Amazon といえば EC2、でアタマが固着してましたね。でもこれも、良い勉強になったと思います。

-- 2020-0626 SatoxITS

MyChromiumビルド

開発:やはりブラウザ本体にも手を突っ込みたいですね。

基盤:先日Mozillaのビルドを試した時には、色々と苦労しました。よくわかりませんが、どうもその、何か開発環境としてしっくりこない。ドキュメントとコードの維持の現状もなんだか心もとない。しかもビルドが非常に重い。VM上のLinuxで環境を作ったのでイマイチアクセスがしにくい。

開発:それなので、Chromiumもやってみようかと思います。今回はMacOSの上で開発環境を作りたい。

基盤:面白そうです。

社長:複数やって比較してみるのは良いことですね。気分を盛り上げるのにはドメイン名を取るのが一番です。・・・ mychromium.com というドメイン名を取りました。

開発:それでは今日は、MyChromium事始めの日ですね。

基盤:さっそく、MacOS での Chrome開発の手引へ。

基盤:まずシステム要件「the releases currently use the 10.15 SDK.」なのでOKです。

MacMini% ls xcode-select -p/Platforms/MacOSX.platform/Developer/SDKs
DriverKit19.0.sdk MacOSX.sdk MacOSX10.15.sdk

開発:わたしは「macOS」とか「Mac OS X」という表記がしっくりこないのですが「MacOSX」という文字列をみるとホッとしますね。

基盤:では depot_tools というのをダウンロードしましょう。

MacMini% time git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
Cloning into 'depot_tools'…
remote: Sending approximately 31.77 MiB …
remote: Counting objects: 5, done
remote: Finding sources: 100% (5/5)
remote: Total 38977 (delta 26902), reused 38976 (delta 26902)
Receiving objects: 100% (38977/38977), 31.77 MiB | 28.36 MiB/s, done.
Resolving deltas: 100% (26902/26902), done.
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 1.71s user 0.56s system 84% cpu 2.676 total

基盤:3秒で終了です。30MiB/sでダウンロードできてます。

社長:ついでに Machromium.blue というのも取ってみました。

基盤:では、本体のダウンロード開始します。

MacMini% time fetch --no-history chromium

開発:500Mbps出てますね。

基盤:「Expect the command to take 30 minutes on even a fast connection, and many hours on slower ones.」だそうですが、うちは 30分で行けそう。ギガビットのインターネットにして本当に良かったです。あ、終了しました。

fetch --no-history chromium 836.31s user 312.39s system 136% cpu 14:01.15 total

開発:14分でしたね。素晴らしいです。サイズはどのくらいですか?

MacMini% pwd
/Users/ysato/Desktop/MyChromium/mychromium
MacMini% du -s .
34007336
MacMini% find . | wc
632654 632815 51905577

基盤:34GBですね。Mozillaは10GB程度でしたから、かなりでかい。うーん、SSDの残り12GBになってしましました (^-^; HDDの上に移したほうが良さそうです。

開発:まあ、6/29にはiMac来ますから、それまでなんとかやりくりしましょう。

基盤:ではビルドのセットアップ。

MacMini% pwd
/Users/ysato/Desktop/MyChromium/mychromium/src
MacMini% time gn gen out/Default
Done. Made 13801 targets from 2310 files in 9057ms
gn gen out/Default 13.57s user 4.53s system 188% cpu 9.621 total

基盤: Faster build のお勧めに従って、オプション設定。

MacMini% cat > args.gn
is_debug = false
is_component_build = true
symbol_level = 0

基盤:あと、ccache というのを入れるとコンパイルが高速になるよとありますね。「 It speeds up recompilation of C/C++ code by caching previous compilations and detecting when the same compilation is being done again. 」。同じコンパイルって普通Makefileで日付見てスキップされると思うけど、そういう事ではないみたいですね。インストールしておきましょうか。昨日 brew というのも入れましたし。あれ、でも、brew の結果どこにインストールされたやら。よくわかんないのでこれはパスします。

基盤:さて、それではビルド行きます。

MacMini% time autoninja -C out/Default chrome

kaihatsu: nanka nihongo nyuuryokudekinakunarimasita 😉

kiban: this application te kono vivaldi no kotodesukane?

基盤:あ、あのVivaldiのタブのプロセスだけ変換エンジンと切れたんですかね。いやーそれにしても凶暴ですねぇ(笑)

開発:メモリが8GBしか無いのに600もプロセス走ってますしね。これだけひどい目にあってるMacMiniも世の中にそうは無いでしょう(笑)

基盤:このノコギリ状のメモリプレッシャーの遷移が面白いですね。

* * *

社長:MyChromium、どんな感じですか?

開発:いやはや懲りました。Chromiumのビルドがこんなにディスクを食うなんて… これって最終的に200GBくらい行きますかね?

基盤:256GBのSSDでかつかつでやってちゃどうにもならなかったですね。はじめから4TBのHDDのほうでやるべきでした。

開発:足りなくなっては捨てられるゴミを捨てるという繰り返しでした。でも、おかげで100GB以上SSDが空きました。

基盤:半分がゴミだったとは(笑)

開発:しかもVivaldiでメモリがぱんぱんのところで走らせたからスワップしまくりという、悲惨な状態でした。

基盤:プロセスのスワップアウトでだいぶSSDを痛めたでしょうね。

開発:なんか10TBずづ読み書きとか出てたけど、あまり思い出したくない・・・

基盤:アクティビティモニタのスナップショットは撮ったのですが、どっかに消えちゃったみたいです。

開発:しかし、毎秒何十万回もスワップできちゃったりするところがある意味素晴らしいと言うか。

基盤:メモリ不足でスワップはするは、コンパイルでIOしまくるはで、SSDも悲惨だったことでしょう。

基盤:結局HDDでやりなおしたら世の中は平和です。2時間くらいで終わりますかね?

基盤:Mozillaの rustc はめっちゃ重かったイメージがあるんですが、Chromium の C は細切れにしてあるのか、一つずつが軽いですね。

開発:というか、CPUが60%前後になるってことは、やはりディスク I/O がネックなんでしょうかね?tmpfs を RAMディスクにしたら早くなるとか。MacOSでのプロセスのforkのオーバヘッドの関係かも?

基盤:アクティビティモニタで見ると、ユーザ時間はテンパってるんですけどね。

基盤:df してみると、MacOS には tmpfs といのが無いですね。あと、ファイルを rm しても df に反映されないのが気持ちわるくて。ジャーナリングってやつだからでしょうか?

社長:昔、translucent file system (TFS)というのがあって。ファイルシステムを重ね合わせられるという仕組みで、すごく面白いと思ったのですが、なぜか流行らなかったですね。ああいうのができれば、そういうトランスペアレントな配置ができるかなと思うんですが。

開発:アクセス頻度の低いやつ自動的に裏方のHDDに送るって感じですかね。アプリケーションやユーザの見た目にはわからない。まあ、移動中はロックが必要でしょうけど。

社長:めったに使わないファイルとか、遅くても良いファイルとかはHDDに、っていちいち配置を変えるのも面倒だから、SSDをキャッシュ的に、HDDをバックエンドにして、アプリケーション側としてはどっちにあるか気にしなくて良いようなファイルの配置ができると良いのですが。

開発:そもそも移動の判断と実行はユーザの手動でやっても良いかも知れませんね。とにかく、ファイルの論理名は同じであって欲しい。実体を持たない、名前の管理だけするというか、ビューだけ提供するみたいなファイルシステムがあっても良いのではないですかね。リバースプロキシみたいな。

社長:相対パスのシンボリックリンクを提供してくれたりとかが良いですね。というか、もっと機能的な付加価値も。

開発:まあその付加価値的をどこでつけるのか、ずっと考えてきたわけですけども。

基盤:その後1時間経過、毎秒約2ファイル消化で進行しています。残り1万5千くらいありますので、このペースだとあと2時間以上はかかりますね。

開発:結局足掛け2日間ですか(笑)

基盤:でも、No space に怯える必要が無くなって気が楽。

基盤:というかさっきからFinderが固まってますね。

開発:df が固まるって、どこかのマウントが死んでるんですね。

基盤:これ、スクリーンショットが取れなくなっちゃうのが痛いです。

開発:Finderを殺したらデスクトップが超すっきりしました(笑)

基盤:Relaunch とか効かないですね。

開発:initプロセスに何とかしてもらうんだと思うんですが… そもそも、SSD の df が全然回復しないし、あちこち反応しなくなった感じだし、リブートしちゃいましょう。

基盤:そうですね…

* * *

開発:リブートしてしばらくしたら df がスカッと 50% に(笑)

基盤:回収がうまくされなかったんでしょうかね。何にしても、MyChromeビルド再開します。

基盤:なんだかかなり遅い領域に入りました。ファイルがでかいとかですかね。

開発:何にしても数万というファイルをコンパイルするわけで、我々がふだんmakeでやるようなログをダラダラ端末に流すような世界では全くないですね。Mozillaもそうでしたが。

基盤:別ウィンドウを開くとか、詳細なログをファイルに残してそれをtailで見るとかでも良いですけど。やはりなにかビュンビュン流れてれば気休めにもなるような(笑)

開発:ところでこれ、終わると何ができるんでしたっけ?

基盤:Chromium.app ができるそうです。でも朝方まで掛かりそう…

開発:じゃ寝て待ちますか。

* * *

基盤:終わりました。

開発:終わりましたね。

基盤:2,3時間で終わるだろうと思ったらほぼ一日がかかり。ccache というのを入れがほうが良かったかもですね。

開発:次回はそうしましょう。

基盤:711MBのシェアードライブラリというのもなかなかのものです。

MacMini% du -s Chromium.app
417000 Chromium.app

基盤:ビルド使ったディスク容量は、115GBでした。

開発:まあスワップとかtmpとかに使ったり、他の作業してたりとかで、130GBくらいは空きが必要だったわけですね。

* * *

社長:それでは進水しましょう。

基盤:立ち上がれ MyChrome! ・・・

開発:立ち上がらないですね?

基盤:CPUは食ってるみたいですが… あ、なんか動き出した。

開発:MacOS用MyChromium、ただいま立ち上がりました!

社長:記念撮影しましょう。パシャ。

基盤:2度めからの立ち上がりはまだまともですが、でも8秒くらいかかりますね。

Chromium.app/Contents/MacOS/Chromium 16.08s user 1.57s system 211% cpu 8.351 total

開発:確か、shared library 版にするとビルドは速いけど実行速度が遅いって注意書きにあったような。

社長:Mozilla には Mozillaの、ChromiumにはChromium の、一筋縄では行かないところがありそうですね。

-- 2020-0625 SatoxITS

GoでWebAssembly

開発:extension を HTML、CSS、JavaScript だけで書くのはやはり厳しいので、やはり複雑な処理は現地の言語で書きたいと思います。

社長:適材適所で行きましょう。

基盤:WebAssemblyというやつですね。

WebAssemblyって

開発:WikiでWebAssemblyを検索…

社長:Wikipediaの定期寄付って最低が月300円みたいですね。うちには敷居が高い…

基盤:コーヒー一杯を軽んじてる感じです。私なんて学生時代はコーヒーとか高嶺の花というか天上界の人の飲み物でしたよ。今だってそれでクラウドの仮想マシンが1ヶ月動くんですが… AWSで$3.5/monthのやつをポコポコ立ててみようと思ってるのですが。

https://ja.wikipedia.org/wiki/WebAssembly

WebAssemblyは、ウェブブラウザのクライアントサイドスクリプトとして動作するプログラミング言語(低水準言語)である。wasmとも称されており、ブラウザ上でバイナリフォーマットの形で実行可能であることを特徴とする[2]。2017年現在開発が進められており、最初の目標としてCとC++からのコンパイルをサポートすることを目指している[3]他、Rustがバージョン1.14以降で[4]、Goがバージョン1.11以降で[5]、Kotlin/Nativeがバージョン0.4以降で[6]で対応するなど、他のプログラミング言語のサポートも進められている。

開発: Go でも使えるというのがとても魅力だと思います。面白いのがWikiの中のこの部分。

WebAssemblyはポータブルなスタックマシン[7]であり、既存のウェブブラウザで広く用いられているJavaScriptと比べ、構文解析と実行が高速になるよう設計されている[3]
...
内部的には、wasmコンパイラシステムは中間コードを扱うためにS式を使用している

基盤:S式!40年以上タイムスリップしました。

開発:Goでのサポートは Go 1.11、 2018-08-24 のブログでアナウンスされてます。約2年前ですね。

https://blog.golang.org/go1.11

Go 1.11 also adds an experimental port to WebAssembly (js/wasm). This allows programmers to compile Go programs to a binary format compatible with four major web browsers. You can read more about WebAssembly (abbreviated “Wasm”) at webassembly.org and see this wiki page on how to get started with using Wasm with Go.

基盤;「four major web browser」って、Safari が仲間外れなんでしょうかね(笑)

社長:私は最近、Safari には Safari なりの良い点、面白い点もあるとは思ってるんですけどね。でも唯我独尊のApple社製ですからねえ…

https://golang.org/doc/go1.11#wasm

WebAssembly

Go 1.11 adds an experimental port to WebAssembly (js/wasm).

Go programs currently compile to one WebAssembly module that includes the Go runtime for goroutine scheduling, garbage collection, maps, etc. As a result, the resulting size is at minimum around 2 MB, or 500 KB compressed. Go programs can call into JavaScript using the new experimental syscall/js package. Binary size and interop with other languages has not yet been a priority but may be addressed in future releases.

開発:Goのバイナリがでかいというのは定番ですが、別に2M程度ならちょっとした画像程度だから、転送量としては気にならないですね。

As a result of the addition of the new GOOS value "js" and GOARCH value "wasm", Go files named *_js.go or *_wasm.go will now be ignored by Go tools except when those GOOS/GOARCH values are being used. If you have existing filenames matching those patterns, you will need to rename them.

More information can be found on the WebAssembly wiki page.

誰でも最初は Hello world

開発:でその wikipage にお待ちかねの Hello world があるので、今日はそれをやってみます。まず、使用するのはおなじみのこれ。

% cat > hello.go
package main
import "fmt"
func main() {
  fmt.Println("Hello, WebAssembly!")
}

開発:こいつを WebAssembly にコンパイルします。

Set GOOS=js and GOARCH=wasm environment variables to compile for WebAssembly:

$ GOOS=js GOARCH=wasm go build -o main.wasm

基盤:これ、ちょっと意味がわからないんですが、環境変数を設定しているって意味ですかね。

開発:そうらしいです。bash からの仕様なんですかね?

% XX=a printenv XX
a

開発:あと、go ファイルを指定しないと、カレントディレクトリの .go を勝手に探してやってくれるようです。

基盤:徹底して手間を省く気満々ですね。

開発:で、build で main.wasm が出来ました。

MacMini% ls -l
total 4432
-rw-r--r-- 1 ysato staff 78 Jun 24 09:04 hello.go
-rwxr-xr-x 1 ysato staff 2262220 Jun 24 09:17 main.wasm

基盤:噂通り2MB超 🙂

開発:あと、パッケージは main パッケージ一つにしてね、とあります。

Note that you can only compile main packages. Otherwise, you will get an object file that cannot be run in WebAssembly. If you have a package that you want to be able to use with WebAssembly, convert it to a main package and build a binary.

基盤:それって go build で自動的には出来ないんですかね。ただ面倒だったのかな。

開発:さらにチュートリアルに言われるがままに。

% cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .

% cat index.html
<html>
 <head>
  <meta charset="utf-8"/>
  <script src="wasm_exec.js"></script>
  <script>
   const go = new Go();
   WebAssembly.instantiateStreaming(
    fetch("main.wasm"),go.importObject).
     then( (result) => { go.run(result.instance); } );
  </script>
 </head>
 <body></body>
</html>

基盤:よくわからないけど、2つ目のスクリプトはmain.wasm をフェッチして実行する、ということのようですね。

開発:準備OK。こういう事になりました。

FILE URL は通らなかった

開発:で、この index.html をクリックすると…

基盤:真っ白ですね。

開発:HTMLをコピペ間違えたかな?

基盤:問題なさそうな。インスペクタでは?

開発:え?

Fetch API cannot load file:///Users/ysato/Desktop/GoWasm/main.wasm. URL scheme must be "http" or "https" for CORS request.

基盤:あれま。

開発:なんで file scheme じゃいかんのですかね?HTTPサーバって言ってもただファイルを提供してるだけだろうし、HTTPよりは直接見えるFILEのほうが素性が知れてるし高速だと思うのですが… 自分自身より遠くの他人を信用するってどういう事だろう。ちょっとがっかり。

基盤:サーバ名の部分を何かに使っているとか?

開発:ブラウザ自身にHTTPサーバのコードを含んでいてforkするだけでいいんじゃないかなぁ。

DeleGateは通らなかった

開発:気をとりなおしてサーバ経由にします。とりあえず勝手知ったる DeleGate でちゃちゃっと。

% delegated -fv -P9999 SERVER=http MOUNT="/* $PWD/*"

開発:でどうかな?

基盤:ふたたび真っ白ですね。

開発:何がご不満なのでしょうか?

基盤:ああ、MIME タイプ をapplication/wasm にしろと。

開発:それじゃDeleGateにファイル型を教えましょう。真ん中あたりは Gopher 用の定義だったりする年代物。

FILETYPE=".wasm:9:BIN:binary:application/wasm"

開発:これでどうかな?

開発:え?手でアクセスしてもこう返ってきてるのに…

HTTP/1.0 200 OK
Date: Wed, 24 Jun 2020 04:24:23 GMT
Server: DeleGate/11.0.2
DeleGate-Ver: 11.0.2 (delay=0)
MIME-Version: 1.0
Content-Type: application/wasm
Content-Length: 2262220
Last-Modified: Wed, 24 Jun 2020 00:17:07 GMT

基盤:ここはとりあえずチュートリアルに従いましょう。

祝Hello World!

開発:仰せのとおり goexec でと…

# install goexec: go get -u github.com/shurcooL/goexec
$ goexec 'http.ListenAndServe(`:8080`, http.FileServer(http.Dir(`.`)))'

基盤:go get 帰ってきませんね。なんかプログレス報告がほしいところです。あ、終わった。数分かかったような。

開発:goexec っと。あれ?PATHが通ってないですね。export PATH=$PATH:$HOME/go/bin。これでいかがでしょうか?

基盤:通りましたね。

基盤:GoのHTTPは何を返してるんでしょうね?

HTTP/1.0 200 OK
Accept-Ranges: bytes
Content-Length: 2262220
Content-Type: application/wasm
Last-Modified: Wed, 24 Jun 2020 00:17:07 GMT
Date: Wed, 24 Jun 2020 04:48:41 GMT

開発:私は違いがわからない男。

基盤:Accept-Ranges の有無で引っかかってるとか。

開発:まあ、あとで調べます。ちょっとシラケちゃいました。ブレークしましょう。

* * *

HomeBrewで道草

基盤:引き続き Node.js のススメがついてますが。

開発:いやはやこれだけ簡潔なチュートリアルで、おまけまでついちゃう。Goのセンスは素晴らしいです。どれどれ…

MacMini% GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec" .
/usr/local/go/misc/wasm/go_js_wasm_exec: line 14: exec: node: not found
exit status 127

基盤:Node がインストールされてないってことですかね。macos node install で検索… Homebrew というのでインストールするようです。apt みたいなやつですかね。インストール方法…

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

開発:curl は入ってるからこのままでイケるしょう。コピペしてGo!

開発:うーん、なんで$HOMEの下に作ってくれないのかな。

基盤:/usr/local の下だし、いいんじゃないですか?

開発:うーん、おそらくcurlの出力スクリプトを変えればイケるのでは… grep local。

# On macOS, this script installs to /usr/local only.
  HOMEBREW_PREFIX="/usr/local"
  HOMEBREW_REPOSITORY="/usr/local/Homebrew"

開発:ほらね。

基盤:どういうスクリプトなんでしょう。

# On macOS, this script installs to /usr/local only.
# On Linux, it installs to /home/linuxbrew/.linuxbrew if you have sudo access
# and ~/.linuxbrew otherwise.
# To install elsewhere (which is unsupported)
# you can untar https://github.com/Homebrew/brew/tarball/master
# anywhere you like.

基盤:Macでは選択不可、Linuxでもunsuppotedですって。

開発:そうですか。/usr/local を飲みます。毒まんじゅうでもあるまい。RETURN をぽち。

基盤:なんかすごいやってますが… あ、終わった。数分がかりでしたね。

開発:では再チャレンジ!あれ?ああ、brew をインストールしただけで、node はまだだった(笑)。では、brew install nodebrew…

開発:何だコリア?

基盤:Node.jsのサイトに行ってみましょう。

開発:なんだ、パッケージあるんじゃない。じゃ、推奨のLTSをば。ぷち。ぷちっと。

開発:おーいえーす、あいアグリー。

基盤:これ、アマゾンドライブにインストールしたら面白そうですね(笑)

開発:はい終了。

開発:で一応確認。

MacMini% which node
/usr/local/bin/node

基盤:OK。

Node でWebAssmblyを Go

開発:ではおもむろに再チャレンジ…

$ time GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec" .
Hello, WebAssembly!

real 0m0.656s
user 0m1.650s
sys 0m0.159s

基盤:くっそ重いですね(笑)

開発:real より CPU が多いってどういうこと?ああ、マルチコアでのユーザ時間の和かな。

MacMini% time GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec" .
Hello, WebAssembly!
GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec"
1.66s user 0.31s system 189% cpu 1.036 total
MacMini%

基盤:そのようです。

開発:まあ、ブラウザ無し、サーバ無しでテストできるんで、多少遅くてもOKじゃないですかね。

基盤:それにしても、本題で無いところにばかり時間を取られますね。

開発:最初だからしかたが無いです。ブレークしましょう。

* * *

Goでシステムコール

開発:されそれで、本題の SandBox で何ができるかです。

基盤:システムコールとかみんなトラップされてるんですかね?

開発:まずは uptime とか top 的な事したいです。

基盤:あれ?そういえば今日午前中にICカードのリーダライタが納入されたはずなのですが、携帯にぶぶっと来ないですね。

開発:ちょっと熱中してたし…

基盤:ちょっと郵便受け見てきます。・・・ 来てました。JPだからメールでお知らせがなかったんですね。配送オプションで指定できたりするのかな?それはそうと、肝心の非接触リーダ・ライタが入ってません。

経理:アマゾンで確認します。・・・ ああ、それだけ6/26日に別便で来ます。

基盤:なーんだ。

開発:それで、Go自体はどんな system callもできる道有ですね。uptimeのライブラリとかないかな。どうも、探し方がわからない。あ、gopsutil というのの、package host というのに Uptime() という関数がある模様。

func Uptime() (uint64, error)

基盤:これ、Unixtime の64ビット版ですかね?

開発:じゃないですかね。ああ、Uptime() じゃないけどここに gopsutil の使い方の例が。

MacMini% cat mem.go
package main
import (
"fmt"
"github.com/shirou/gopsutil/mem"
)
func main() {
v, _ := mem.VirtualMemory()
// almost every return value is a struct
fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent)
// convert to JSON. String() is also implemented
fmt.Println(v)
}

開発:それでは go run ...

MacMini% go run mem.go
mem.go:6:8: cannot find package "github.com/shirou/gopsutil/mem" in any of:
/usr/local/go/src/github.com/shirou/gopsutil/mem (from $GOROOT)
/Users/ysato/go/src/github.com/shirou/gopsutil/mem (from $GOPATH)

開発:パッケージが無い言ってます。まあそりゃそうか。ダウンロードすれそこに置けばいいのかな。でも面倒くさい… きっと、apt-get 的なものがあるに違いないと思うのですが。

基盤:それ、前やったことありますけど。忘れました。

* * *

基盤:これでした。

go get PackageName

開発:やれやれですね。では go get github.com/shirou/gopsutil/mem ... 出来ました。そして再び go run !

MacMini% time go run mem.go
Total: 8589934592, Free:1008758784, UsedPercent:71.788216%
go run mem.go 0.33s user 0.19s system 76% cpu 0.673 total

基盤:出ました、が、0.67秒、くっそ重い。

開発:コンパイルしましょう。

MacMini% time go build mem.go
go build mem.go 0.09s user 0.21s system 83% cpu 0.359 total
MacMini% time ./mem
Total: 8589934592, Free:1101942784, UsedPercent:64.464474%
./mem 0.00s user 0.00s system 7% cpu 0.053 total

基盤:0.05秒、合格です。

開発:そうか、8GiBって、8*1024^3 = 8589934592 なんですね。ちょっと得したような気分。

基盤:準備完了ですね。

開発:長い道のりでした。ちょっと一服しましょう。

* * *

社長:我社もコーヒーメーカーという文明の利器を導入しましょうかね?

開発:いえ、お湯を沸かしてこのドリップパックを入れるのが、ちょうど良い休憩になるように思います。

基盤:ガス台まで徒歩3秒。

社長:しかし、1パック20円って。しかも十分美味しい。一体コーヒーの適正価格ていくら位なんですかね。

開発:そういえば最近はインスタントコーヒーというのを見なくなりました。レギューのパックが安くなったからでしょうか?

社長:インスタントに作れるというメリットはまだあると思いますけどね。

* * *

禁じられた遊び

開発:さて、せっかくなので本番前に Node.js でリハーサルです。

基盤:引っ張りますね。

MacMini% cat mem.go
package main
import (
"fmt"
"github.com/shirou/gopsutil/mem"
)
func main() {
fmt.Printf("---- mem.go ----\n")
v, _ := mem.VirtualMemory()
fmt.Printf("Total: %v, Free:%v\n",
v.Total, v.Free)
}

開発:これを Wasm にして。

MacMini% GOOS=js GOARCH=wasm go build -o main.wasm

開発:node で実行!


MacMini% GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec" .
---- mem.go ----
panic: runtime error: invalid memory address or nil pointer dereference
(signal 0xb code=0x0 addr=0x0 pc=0x0]

goroutine 1 [running]:
main.main()
/Users/ysato/Desktop/GoWasm/mem.go:10 +0x6
exit status 2

開発:終わった(笑)

基盤:エラーコードにはなんと?

開発:プリントしましょう。

MacMini% cat mem.go
package main
import (
"fmt"
"github.com/shirou/gopsutil/mem"
)
func main() {
fmt.Printf("---- mem.go ----\n")
v, err := mem.VirtualMemory()
if( err != nil ){
fmt.Println("-- err -- ",err);
}else{
fmt.Printf("Total: %v, Free:%v\n",
v.Total, v.Free)
}
}
MacMini% GOOS=js GOARCH=wasm go build -o main.wasm
MacMini% GOOS=js GOARCH=wasm go run -exec="$(go env GOROOT)/misc/wasm/go_js_wasm_exec" .
---- mem.go ----
-- err -- not implemented yet

開発:うーん「not implemented yet」がおざなりの回答なのか、どうかですね。コンパイルの時点ではエラーは出ないから、実行環境によっては許可されるアクセスなのかも知れない。Node.js で実装されていないという意味かも。

基盤:ほぼ絶望的な状況ですが、一縷の希望を抱きつつ本番のブラウザへ。

開発: 開け http://localhost:8080 !

基盤:最終的かつ不可逆的に終了しました。

開発:まあ、最終的かどうかはわからないです。

開発:ただ、どの道、file URL で wasm にアクセスできない時点で、我々の進む道は絶たれていたのです。どの道ローカルにも HTTPサーバが必要なのなら、そっちでそういう処理はやれば良いとは言えます。

* * *

携帯:(ぶるぶるぶる)

社長:はい。えっそうなの。うん、出られます。じゃ。

社長:コロナの影響で中断していたボウリングのリーグ戦ですが、先週から再開してたそうです。来週が最終戦になっちゃうとか。

開発:ええー!

基盤:われわれの唯一のフィジカル健康法が…

社長:てかもう投げ方忘れちゃったけど(笑)来週が楽しみですね。

* * *

開発:さて楽しかったGo WebAssembly チュートリアル、一応最後まで目を通しますか。Get Going with WebAssembly ... 面白そうだけど、同時通訳とか付いてるといいな。DOM、Canvas。うーん、JavaScirpt で書くのより何がうれしいんだろう?「You can use net/http library to make HTTP requests from Go」これってどこにでもつなげるってわけじゃないんだよねきっと。Further examples。やっぱグラフィックスは面白いね。Reducing the size of Wasm files… えー、これはすごい。「At present, Go generates large Wasm files, with the smallest possible size being around ~2MB. If your Go code imports libraries, this file size can increase dramatically. 10MB+ is common.」。TinyGo「The "Hello world" example is 575 bytes. 」それはすばらしい。これはもし本気でやる時になったら要検討です。

基盤:それってwasmじゃないbuildでもそうなんですかね。だとするとすごいですけどお腹すきました。

社長:長丁場になりました。午前中に始める前に比べると、かなりこの周辺の景色がはっきりしたいと思います。飲みに行きましょう。

-- 2020-0624 SatoxITS

CSSの夢

開発:うたた寝をしたらCSSの夢を見ました。

基盤:HTML、CSS、JavaScriptの3兄弟の中では意外にもCSSが一番面白いですね。

開発:これは要するにウィンドウマネージャ記述言語だと思うわけです。で、夢というのは、Macのデスクトップが実は隠しCSSで記述されていた、というものです。

基盤:それはNotesの表示がCSSで記述されてたということころから来てそうですね。

開発:要するに全てのアプリがブラウザアプリだったら、ブラウザがデスクトップなわけです。

社長:ブラウザをXサーバにすると良さそうですね。だれか作ってそうな気もしますが。

基盤:X window server chrome extension でググる。うーん、少くとも Android を X Server にっていう話はあるようです。chrome ウェブストアで ... うーん。探し方がわからない。extension にsocketの作成やacceptが許されるのかどうか。

開発:Chrome で RealVNC という話はありましたね。あれもブラウザというかDOMをディスプレイとして使うという話だと思いますが。

基盤:JavaScript でやるなら、WebSocket というのを使うんですかね。

社長:Chromeのウィンドウの中でFirefoxが動いてたりするとシュールで面白そうですね。

基盤:とりあえず Xeyes じゃないですかね。

開発:そういえばこないだ、こんな遊びをしました。ページのHTMLの中にこんなことを書く。

<style>
 p.site-title > a   { color:#ff0000 !important; }
 p.site-description { color:#ff0000 !important; }
</style>

(ここに上のCSSが埋め込まれています)

開発:すると、バナーのタイトルと説明がこんなふうになっちゃうと。

社長:おおっとこれは刺激的ですね。

開発:CSSはHTMLの解釈の前にスキャンされてベタに上書きされてくので、bodyの中のインラインの style が最後に解釈されて残って、こんなことができちゃうわけです。

基盤:こんなことが出来てしまって良いのだろうか。

開発:CSSの scoped が廃止されたのって、こういうことができちゃう処理系とは整合しないからかなって気がします。

社長:さらにこのあたりをJavaScriptで制御すると、コンテンツを書く人が自分の好きにページのデザインとか動きを変えられるわけですね。

開発:制御の元になるデータをクライアント側からの情報として与えれば、閲覧側の好みにも染められますね。

-- 2020-0623 SatoxITS

年貢の納めはPayBで

経理:住民税の納付ですが、クレジットカード納付でやるのが良いかと思います。

社長:選択肢は?

経理:まず現金で銀行かコンビニか市役所。そうでなければ、口座振替、クレジットカード、スマホアプリのいずれかです。

社長:大原則として、入出金と相手先は全て、銀行口座のログとしてー元記録管理します。あと、支出が発生した瞬間にメールで知らされ確認できること。

経理:ですが、住民税の口座振替に使える銀行は限られていて、社長の銀行は対象外です。

社長:そうですか。しょぼーん。

経理:スマホアプリ納付の場合は基本的にはチャージして決済ですから銀行の口座から送金した記録にはなりません。そういう意味では、クレジットカード納付一択かと思います。で、これはYahoo!公金払いというので払います。ただこれは手数料が、ちょっと高いです。

社長:どのくらい?

経理:ざっくり言って、手数料 1%です。100万円なら1万1千円。

社長:なにかの冗談ですかね?あり得ない。

経理:そうですか…

経理:それでは、少し気になったのですが、スマホアプリの中にひっそり「PayB」というのがあって、事前に登録した口座から即時引き落としなんだそうです。手数料は無し。ただし、1回あたりと1日あたりの利用上限は30万円です。この1回あたりの制限は、コンビニでの現金払いの場合の上限と同じですね。

社長:Pay-easyもだめなの?地方税も払えるみたいなんですが。

経理:対応しているのは一部の地方自治体だけのようです。当市は対応していないらしく。

経理:結局、うちの口座にログが残る形で送金する方法は、クレジット納付の手数料を飲むか、PayBで分納ということになると思います。

社長:PayBでGo。

経理:そうですか。ちょっと市役所に電話して聞いてみます。ぴぽぱ。

* * *

経理:納税課のお兄さんに教えてもらいました。まず当つくば市は Pay-easy の対応予定は無いそうです。4分納を1日で4回払うのは苦笑されてましたが問題無いそうです。コンビニ払いと同じ制約ですからね。あと、納付方法等のお知らせをスキャンしてブログにアップロードするのも構わないと(笑)それはそうと、電話が0.5秒くらいで総合受付につながったのでびっくりしました。

社長:では、PayB で一括4分納方式、これにトライしたいと思います。

経理:ラジャー。まず PayB 対応の銀行ですがこれはOKです。

社長:スマホじゃないといけないんですかね?デスクトップ版PayBってないんですか。

経理:無いみたいですね。というか、スマホ自体が認証のベースになっているのでは。

社長:スマホをデスクトップから操作するアプリを入れればいいのかな。でも、まあいいです。iPhoneでやりましょう。んー、登録登録っと。え?[【ご留意事項】本サービスはビリングシステム㈱が提供しているため、口座振替の登録先は「ビリングシステム㈱」となります。]と来ました。ログ的にはビリングシステムに送金として残るということかな。まあ履歴にコメントをつければ良いか。あれ?金融機関の選択肢が狭い、出てこない…

経理:PayBに電話してみます。ぴぽぱ。

* * *

経理:その他の金融機関は、それぞれの銀行用アプリでやって下さいとのことです。

社長:そうでしたか、とほほ。本家PayBを起動した時に、いろんな金融機関のロゴが並んでましたけどね。 登録の作業の最初に金融機関を選ばせてほしいものです。インストールからやり直しっと。えー、この銀行ではうちの正式社名ってカタカナなのか。ぷちぷち。あー、どうしてこういうのをゼロから入れ直さないといけないのかな。銀行のウェブサイトから PayB 承認クリック一発でよくね?ぷちぷち。ぷちぷち。え!上限は自由に決められるの?ほんとかな。一発全納も夢では無い。ぷちぷち。あー終わった、ぷちっと。メールで承認っと。「登録が完了しました!」

社長:さて、一括全納できるかな?…てか、30万円を超える納付書にはバーコードが無い!これ、手で数字入れられないものか… そもそもそういう縛りなのかな。仕方がない、4回やりますか。

社長:バーコードにカメラを向けて、認識、暗証番号を入れて、ぷち。… 通りました。これは楽ちん!お、銀行のウェブにも出金が記録されました。適用はXXX PAYB。これは住民税ですよっとメモ。引き続き2回め分… あーこの作業、ぷちぷち感覚でけっこう楽しいですね。大変なのはバーコードを認識させるコツ。なんだか斜めから撮ると良いような。お店のレジの人はこれで苦労してるのかな。QRコードならもっとクイックなのに。3回目、4回目。銀行のウェブ画面にメモメモ。完了しました。

経理:なるほど、1件30万円以内は不可避の縛りですが、一日30万円以内というのは本家 PayB での制限で各銀行の PayB ではそうとは限らないということですね。

社長:さて、スマホで取引履歴確認。ふむこっちではどこに払ったかが出てくるわけですね。スクリーンショットを撮ってNotesに保存してMacで見る。OK。この情報ぐらい銀行のウェブページで見れないのかな?おや?上限の変更方法がわからない…

経理:無駄にクレジット払いの手数料をとられずに済みました。

社長:出金の管理もバッチリです。しかし、今どき1次元バーコードだったり、なんとも社会インフラの過渡期のただ中にいるって実感しますね。

-- 2020-0623 SatoxITS

収入印紙と非接触ICカード

経理:法務局で謄本を取ってきました。

社長:おつかれです。

経理:それで思ったのですが、収入印紙って一体なんなのかって。交付申請自体は端末に法務局印鑑カード差し込んでポチポチッとすれば、受付番号票みたいのがぺろって出て後は呼ばれるのを待つだけなんですが。

開発:お役所も効率化しましたよね。

経理:それで番号で呼ばれて行くとここに収入印紙を、て言われるわけです。で、衝立隔てた隣の席で売ってるからそこで購入して貼るわけです。なんなんだろうこの儀式はと。しかも600円も取られんるです謄本って。紙1枚印刷するだけなのに。最低賃金40分ぶんを超える勢いです。

基盤:技術的には申請マシンにクレジットカード挿して支払いまで済ませられますよね。というか交付まで全てが。そもそもコンビニでも、自宅ですらできる事。紙にする必要がそもそも無い。まあ、せめて印紙販売機にしてほしいものです。

開発:作業的には一人でできる事を、ロールごとに別の実物人間がやっているという、興味深い構造ですね。

社長:費用の根拠って、手書きで作成していた時代の作業コストの名残りなのか、システムのコスト回収なんでしょうかね。

基盤:もはや雇用対策としか。

社長:これは各所に遅延とコストを挿入し電子化とネットワーク化を分断する事によるセキュアなシステム構成の一種なのかも知れませんね。振り込み詐欺対策なんかと共通するものを感じます。

開発:歴史的には、印紙類は1872年(明治5年)に導入された、とありますね。当時はハイテクだったのでしょう。

社長:150年の歴史の幕切れに立ち会っているのだと思えば、感動的なシーンと言えるのかも知れませんね。

経理:そういえば、今後お役所に電子申請を行うのに電子証明書が必要なのですが、とても高額です。個人のマイナンバーカード取得のほうが圧倒的にお得ですね。取得まで所要約1ヶ月。

社長:まああなたのでもいいし、私のを作っても良いです。どうせ同じものですからね(笑)

開発:法人の印鑑カードってそれに相当するものだと思うのですが、なんであれをそういう風に使えないんですかね?

基盤:私はマイナンバーカードを使う時に使うICカードリーダー・ライターに非常に興味があります。先行して調達しましょう。

経理:えーと、アマゾンで 1,500円あたりに各種。

社長:ではそれを。

基盤:それとその、ちょっと高いですが非接触のとFelicaを5枚ほど…

社長:おお、面白そうですね。ではそれも。

経理:ラジャー。ぽちぽちぽちっ。明後日午前中に来ます。

基盤:めっちゃ楽しみ。

開発:150年前の先端技術と現代の先端技術が同居するという光景ですね。

社長:まあそれを言うならこの社印とか、何千年の歴史でしょう。歴史の終焉に立ち会っているのですね。

-- 2020-0622 SatoxITS

祝10000カウント

基盤:ブログのサイドバーに表示しているカウンターがちょうど10000になりました。記念写真をパシャ。

社長:これは何の回数ですか?

基盤:先月インストールしたカウンタープラグインのものです。https://its-more.jp/ja_jp/の下の何かに対するアクセスカウントだと思います。一定時間の連続したリロードを除外しているようなので、何かの正確な回数というより、実質的なページビューの傾向を相対的に掴むのに役立つものなのかなと。1日300くらい増えているような。

開発:それはグラフとかに出来ないですかね。

基盤:総回数しか記憶してない可能性もありますが… 調べてみます。

-- 2020-0622 SatoxITS

AWSでARM Linux仮想マシン

開発:AWSでは何度か作っては放置し破棄して来ましたが、そろそろ実用のVMを作りましょう。主な用途はDNSサーバとARMの性能評価。

基盤:そうですね。要件はこれだけですか。
・CPUは ARM
・OSはUbuntu できれば 20.04 LTS
・ディスクは最小限
・固定IPv4アドレス
・月間料金2,000円以内

開発:そうですね。

基盤:では始めます。EC2ダッシュボードからかな。あれ?作成というメニューが無いですね?

開発:どうもその「インスタンスを起動」ってやつじゃないですか?

基盤:普通起動って言うと、既にあるのを起動するって言う意味ですよね。日本語が変なのかな。英語に切り替えましょう。あ「Launch instance」ですね。それなら納得。なんで「作成」とか「作成して起動」って訳さないんでしょう。しかも「開始」じゃなんだかわからないけど「get started」なら感じが出ます。さあ始めましょう的な。まあ進めましょう。

開発:それにしてもなんでオレゴンなんですかね。理由が説明されてない。

基盤:あ、これはアカウントの隣でOregonを選んでるからみたいですね。これは何を選んでいるのやら、Azureには無いやり方。

開発:メニューなりonmouseoverに、これはなにを選択するものなのか一行説明があればね。Tokyoにしましょう。割高かもしれないですが、Azureもアジアにしてるし、てぷこ支援の一環です。

基盤:電気を大切にね…

基盤:Launch!てのも変なんですが。これから Launch の準備するんで。

開発:おっ、Ubuntu 20.04 LTS / ARM ありますね。リストのえらく下に。

基盤:じゃこれを Select ポチッと。

基盤:さて、どれでしょう。最安ので、2.3GHz、メモリ2GBです。ラズパイクラスですね。でもラズパイと違ってSSD付きだし大丈夫かな?

開発:Azureでは1GBのx86で普通にUbuntu18動いてますしね。

基盤:ではこれで確認と作成

開発:無料利用枠とかどうでもいいですね。計算がわからなくなる。今後はこれを表示しない、と。

基盤:インスタンスタイプの編集ってなんですかね。プチッ。… げげっ、振り出しに戻ってしまった!?さっき選んだやつをリストの一番上に出してくれないかなあ。

開発:English / 日本語の切り替えでも振り出しに戻ってしまいますね。何なんでしょうこれ。

基盤:8GBのディスクがデフォで付いてますね。これ削れるのかな?

基盤:だめでした。なら選ばせるなってーの。SSDじゃなくてHDDに出来ますかね?

開発:何言ってるんだかわかりません。HDDを選んだら使いものになるのかとか、おいくらくらい違うのか、知りたいのはそこなんですが。

基盤:Azure で仮想マシンを作る時は、今の構成ですとおいくらですっ、っていつも言ってくれるんですけどね。

開発:ところがどっこい、オプションで付けたディスクの値段を加算してくれないので勘違いしてひどい目にあう人も出る(笑)

基盤:そもそもこないだ試作した t2.micro ってやつだと、立ち上がりが40秒とか50秒とかかかりました。あれは話にならないですね。Azureのb1sだって30〜40秒で起動するんですが。

開発:まあ、デフォのgp2というのにしときましょう。8GBだし、そうぼられないでしょう。

開発:基本、全てデフォルトで良さそうです。というか選択の余地が無い。

開発:それでは「起動」ボタンを…

基盤:なんか違和感あるなあ。英語に切り替えてやり直し。Launch をポチッ!

基盤:・・・

開発:ここでこれを聞いてきますか。

基盤:若干シラケますね。じゃま、心機一転、鍵ペアを生成して、Launch Instance !

開発:これって確か5分くらいかかりまよね。

基盤:この画面て忘れちゃうんですよね。キャプチャ。

基盤:あ、この画面消してしましました。再表示する方法がわからん…

開発:Azure だとバックグラウンドで何やってるかいつも表示されてますよね。

基盤:プロビジョニングがどうとか。あれはあれでうざいんですけどね。カタカナに変換するだけなら機械でもできるだろって。

開発:Google翻訳によると provisioning は中国語で「供應」ですね。で人語「供応」をGoogleさんは「Servant」と訳す。お・も・て・な・し?こういうの、一つの単語で表現しようとするのが無理なんですよね。

基盤:ここに出てくる running が 1 って、以前作ったやつのことですよね。

開発:なんかもう15分くらい経ったけど出来てこないですね… あ、メールが。

基盤:何言ってるんだか、さっぱりかわかりませんね。「お客様は」って私らのことですか?そんなリクエストした覚えはありませんが。

開発:「お客様のリクエストが検証されました」って、検証に成功したって意味ですかね?

基盤:「引き続き問題が発生する場合」ってありますから、何か問題が発生したんでしょうね。いつどういう操作をして何が起きたみたいなログは見られないんですかね。

開発:あ。これっって、Tokyo リージョンには running が1つって意味じゃないですか?

基盤:確かに。オレゴンに一つ。東京に一つ。東京で実行中のインスタンスは…

基盤:おお、さっき立ち上がったってわけですね。じゃあこれか。

開発:SSHでログインしましょう。

基盤:あれ?ログイン名って何なんでしょう?Azureだと自分で決めるのですが。

開発:キーペアを提供しているところになんか説明がないですかね。

基盤:無いですね。AWSのヘルプを検索してもよくわからんですね… なんだあこの検索は。具体的には何なんですかねこの instance-user-name て文字列は。

開発:ぐぐりましょう。aws instance user name ...

開発:答え一発カシオミニ。ですが ubuntu とか一言も。meta description のせいですかね。

基盤:そのページの実体、こうなってます。

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/managing-users.html
Managing user accounts on your Amazon Linux instance

Each Linux instance launches with a default Linux system user account. The default user name is determined by the AMI that was specified when you launched the instance. For Amazon Linux 2 or the Amazon Linux AMI, the user name is ec2-user. For CentOS, the user name is centos. For Debian, the user name is admin or root. For Fedora, the user name is ec2-user or fedora. For RHEL, the user name is ec2-user or root. For SUSE, the user name is ec2-user or root. For Ubuntu, the user name is ubuntu. Otherwise, if ec2-user and root don't work, check with your AMI provider.

基盤:EC2、ドキュメントが腐ってますね。儲かってないのかな?

開発:あなたのところでは Fedora だ CentOS だって今もサポートしているんすかって20ぺんくらい聞いてみたいですね。まあでも、ユーザ名は ubuntu だ、ということで。

基盤:やれやれ。

MacMini% ssh -i aws-xxx-xxx.pem ubuntu@18.180.xxx.xxx
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-1009-aws aarch64)
...

$ uptime
20:47:25 up 41 min,  1 user,  load average: 0.11, 0.03, 0.01

基盤:起動してからログインするまで41分も無駄にしてしまいました。まあでも、普通っぽいですね。ディスクも十分空いていると思います。

開発:Azure の Ubuntu っていきなり8GB以上詰まってませんでしたっけ?

$ df /
Filesystem      1K-blocks    Used Available Use% Mounted on
/dev/root         7959716 1295456   6647876  17% /

基盤:とりあえず g++ だけはインストールしましょう。sudo apt install make g++ ...

$ df /
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/root        7959716 1423948   6519384  18% /

基盤:無問題ですね。でとりあえず cc hello.c。

$ ./a.out
Hello World!

開発:OKですね。

基盤:いやはやしかし、時間を無駄にしてしまいました。さてそれではめっちゃ楽しみにしていた DeleGate の make 所要時間測定を。。むむー、これは遅いですね。ラズパイと同等なの?…

real	4m32.267s
user	4m4.947s
sys	0m25.348s

開発:うーむ。ラズパイ4で6分でしたから、30%以上は速いというとこですかね。ほぼCPUタイム。では、openssl で乱数の生成ベンチマーク。

arm@aws$ time openssl rand 1000000000 > /dev/null

real	0m3.307s
user	0m3.066s
sys	0m0.240s

基盤:一方その頃 Azure 上の x86 では。

x86@azure$ time openssl rand 1000000000 > /dev/null

real	0m3.596s
user	0m3.321s
sys	0m0.088s

開発:なるほど。コンパイラが使うようなCPU命令はx86に比べて遅いけど、randが使う命令はx86と同等ってことかな。あるいはキャッシュのサイズとアプリのメモリアクセスの相性とか。まあうち的にはこの性能で良さそうですね。少なくとも DNS サーバとして使うには無問題。ところでリブートは?

基盤:50秒以上かかりますね。1分半かかったり。どうも AWS は、少なくとも安物マシン同士で比べると、起動が Azure に比べて2倍近く遅い感じがあります。再起動が60秒以上というのは、使い方に制約がかかりますね。これはあきらめるしかないような。

基盤:無駄なところで疲れてしまいました。料金はあとで確認しましょう。いずれにしてもこれが実質最少料金。デフォの8GB SSDにもVM料金とは別に課金があるのかということと、固定 IP アドレスの料金ですね。

開発:でもまあ一日50円では行けそうな。

-- 2020-0622 SatoxITS

広告収入はWikipediaに寄付されます

社長:「この広告スペースの収益は全てWikipediaに寄付されます」ていうような広告スペースがあるといいかなと思いました。

開発:Wikipedia自身は広告が無い不撓不屈の精神ですからね。

基盤:不偏不党では?

社長:他のソフトやサービスの価値/価格と比較すると、Wikipediaには月100円程度を払う(寄付する)のは全く妥当だと思います。

開発:「うちはWikipediaに寄付してます」って公に表明するのはいかながものかという気はしますが。

開発:寄付とか慈善活動やってますって宣伝するのって胡散臭いですし。

社長:いや、うちが直接寄付するというのではなく、広告主起源のお金をWikipediaに仲立ちするだけです。月100円くらいは広告収入取れないですかね?

開発:Wikipediaって営利法人からの寄付を受け付けるんですかね?

社長:別の形の法人を作るという道も考えられます。

基盤:そもそも以前寄付した記憶では、Wikipediaはこちらを特定してないというか。寄付してもあいからずあの募金呼びかけバナーみたいのが出て。まあ別のブラウザを使ったせいかも知れませんが。

社長:そういえば最近、Wikiに入っても昔みたいに「寄付を!」ってうるさくなりましたね。タニマチか脚長おじさんでもついたのかな。

開発:「脚長おじさん」て、実は若い男性だったていう話ですよね。Daddy Long Legs で略して DLL というのが笑えました。

基盤:MacOS の Spotlight なんかも Wikipedia ダイレクトですね。無償のブラウザがスピードダイアルとかにプリセットしているああいうのと対置しているような。ああいう一種の広告をブラウザに埋め込んでもらうのに払うだろうお金、そのお金の一部をWikipediaを利用した機能を実現するためにWikipediaに寄付する、みたいなチェインがあれば。

開発:非常にシンプルには、広告枠のあるウィンドウに、Wikipediaをiframe で表示するとか。でもって Wikiの表示内容に即した広告が出るようにするとか。Wikipediaが嫌がるかな?

基盤:Wikipediaのデータをベースにした extension を作って、その売上を Wikipedia に寄付するとか。

社長:ところでWIkipediaってハイパーテキストだけど、階層的に整理したようなビューってどうなんですかね?全文検索機能なんかもアレですよね。

開発:サイバー化した辞書・辞典というと枠から出てないかもですね。

社長:たとえばWikiのページをベースに、自分なりの書き込みとかした版を自分用簡単につくれるとか。これはまあ、ブックマークの拡張みたいな感じですが。

開発:それの対象は、Wikipedia に限らないですけどね。なので、自分のブックマーク的なWikiページをブラウザでチャカチャカ作れると良いな、という流れです。というかイメージ的には、ユーザはつねに自分用のWikiページというか「ホームページ」を作っていて、そこから外部に向けてでかけて情報を調べて帰って、自分のWikiにフィードバックする、そういうイメージです。ブックマークなんかもその延長。ウェブの当初は、そういう使い方が多かったと思うんですが。

社長:なんにしてもソフトウェアについて「ただだから使う」という時代が続いたのは、少額の(匿名)送金が難しかったからという面も大きいと思うんです。今はそいうバリアがほぼなくなりました。自分の使い方においてそれがどの程度の価値を持つか、そういう観点で自分で価格を決めて、生産者に届けられたら良いのに。そういう意味ではWordPress のプラグインのドネーション方式みたいので良いのかなと思いますが。「適正価格」「適材適所」は我社のスローガンです。

開発:まあソフトの価格を決めるのが需要と供給の法則で無いことは確かです。

-- 2020-0622 SatoxITS