scp驚速化

開発:なんか変な時間から始業になりました。

社長:涼しい夜に仕事をするというのは合理的かと思います。

経理:そういえばでんこちゃんの家計簿が見れるようになりました。

基盤:この赤い線、世間一般世帯の平均ということだと思いますが、それにとても近いのが驚きですね。

社長:うちと違って一般家庭では夏場は冷房を入れると思うんですが、大したピークにも見えないのが不思議です。

* * *

開発:さて、問題のscpのアップロードですが、scp.c の中の source という関数の中のループで実行されています。ですが、そのあたりは 7.7と7.8で違わない。そこから呼ばれて実際に送信を行っているatomicio6という関数もです。

開発:で、scpがどこに出力をしているかなのですが、サーバへのコネクションを張ったsshに違いないと思うわけです。実際、転送中のプロセスはこんな形になっています。7.7と7.8で違わない。

開発:それでは、ssh は何をしているかというと、ssh.c の ssh_session2 から clientloop.c:client_loopを呼んでいて、client_loopではselectで待っている。何を待っているかと言えば、やはりサーバへの送信が可能になっているのを待っているのかなと思うわけです。

社長:pollじゃなくてselectなのがBSD的なんでしょうかね。私も昔はselectでしたが。pollのほうが使いやすかったので、すっかりpollになりました。

開発:しかし人の書いたプログラムの動作を追うには、ブレークポイント機能のあるIDEがないと手間ががかかるというのをつくづく感じますね。まあマルチプロセスだとちょっと厄介ですが、scp | ssh のこれとか、別にスレッドで良いと思うんですが。そのほうが性能も多少良いかも知れないし。

開発:で、output のselectの対象になってるサーバ向けのソケットのバッファサイズは87KBあるので、問題ないと思われます。そもそも 7.7 と同等でしょうし。実際これを512KBとかにしてみても、変化はありません。

社長:なるほど。となると、どこかでしょうもない遅延が入ってるんでしょうね。わくわく。

* * *

社長:ところで Vivaldi をメインブラウザにしてから2ヶ月になります。操作感的な面白さはやや飽きたというか、良し悪しな面もあるように思うようになりました。基本機能的なところで完成度が今ひとつに感じるところもあります。ですが、やはりVivaldiがいいなと思う点は、複数の別個のユーザとしてプロファイルを定義できて、使い分けられる所かなと思います。そしてセッションの保存と回復。現在開いているウィンドウ・タブのセットを名前付きで保存して、回復できる。これはまさに、昔からずっと欲しかった機能なわけです。

社長:ちょっと残念なのは、複数のセッションを並列で持てないように見える点。あと、セッションをまるごと削除できないようにみえる点です。あるいは、各セッションに含まれるウィンドウとタブを一覧表示する機能が無いように見えること。タスクウィンドウみたいので良いと思うのですが。

社長:Vivaldiには、ブラウザを使うにあたって、あるユーザとして、あるセッションの中で、あるウィンドウを開いているのだ、あるいは開くのだという使い方を、もっと明確に押し出してい欲しいと思いますね。だから、使い始める時に「デフォルトのユーザ」として「デフォルトのセッション」の中に居るのだということをわかりやすくしてほしい。あるいは「保存されたセッション」に「デフォルトのセッション」が無いのも片手落ちと思います。これはもやもやっとしているし、勝手に回復することになっているのが良いとも限りません。

基盤:Person1とか英語としてもイマイチですが、日本語版でもなにか工夫して欲しいものです。

開発:日本語のソフトだと「既定ユーザ」とかが好まれそうなw

社長:あとは複数のユーザ(プロファイル)の間でセッションというかウィンドウやブックマークを共有出来ないのも困ることがあります。たとえばこのセッションやブックマークはどのユーザと共有する、という設定ができると良いと思います。そしていずれかはそれらを、別種のブラウザとの間でも共有できると良いのですが。

開発:まあ抱き合せ機能で囲い込み合戦中でしょうからね。そういう共有のための標準化がされてしまった後に、Vivaldi独自の強みというのを維持し続けられるかも問題かなと思います。

社長:個別には実現技術的に難しい話ではないでしょうしね。

基盤:カスタマイズ能力を標榜するなら、カスタマイズを支援するウィザード的なものも充実してほしいですよね。沢山の設定項目の中でどれが自分の興味のあるものかとか。あるいは、プレカスタマイズされたテンプレート的なものを提供するとか。カスタマイズ情報のエクスポートとインポートって出来るんですかね?

社長:だれそれ監修の設定セットとかテーマとか、設定に名前を付けられるようになると良いですね。

* * *

開発:さてそれで、selectにラッパーをかけて、動作を観察しました。selectに 10ms以上かかった場合だけ出力しています。まず 低速な7.8の場合。

開発:[3]というのは、サーバと接続しているソケットのファイルディスクリプタです。一方、高速な7.7の場合。

開発:7.8では10msを大きく超えることが無く、また入出力が同時にreadyになることが多い。一方7.7では待ちが50ms程度かかることが多く、しかも送受信一方ずつしかreadyにならない。これが10倍の性能差の原因かと思われます。

社長:監視しているファイルディスクリプタの数の 8 と 7 の違いは何でしょう?

開発:selectの第一引数の仕様はなんだか混乱していて、あまり真剣に設定したことが無いですね。実際このケースでは、待っているのは [3] だけなんです。

開発:えーと。ここは単にサーバと通信を双方向中継してるだけだと思うんですが、なんでこんな複雑そうに見えるかと言うと、sshはスレッドを使ってないんですね。PAMスレッドでしか使ってない。それで、I/Oをnonblockingにして、自力で双方向の中継を実装している。こういう実装法だと、上り下り両方がreadyの場合にも、片方ずつしか中継できないんで、nonblockingとは言え、並列性が活かしきれない気がします。特にマルチコアでは。

社長:なぜにそのような実装になっているんでしょうね?

開発:sshは1995年以前に作られたもののようです。当時は標準のスレッド技術が無かったと思います。それに、スレッドだとメモリを余計に食うというのはありますよね。あとは、やりたい場合にはですが、上り下りの間の同期を制御しやすいとか。

社長:確かに… DeleGateでも色々なスレッドとお付き合いしました。

開発:えーと。もっと恐ろしいことがわかりました。scp から ssh にデータを送っているわけですが、これは pipe でできていました。

社長:pipe ってバッファサイズが 4KBとか…

開発:最近では64KBのようですが。でも、ファイルを読んでただ送っているだけなわけです。なら、SSHにファイルディスクリプタを継承すれば良いのにと思うのですが。まあ、パイプ経由でコマンドも送るんでしょうけど。

社長:Windowsではソケットのハンドルはファイルディスリプタ的に継承されないですしね。

macOS ssh upload の、呪い…

基盤:クラウドのサーバにscpでファイルをアップロードするのが異常に遅いのが気になっていました。

開発:なんか1MB/sくらいしか出ないとか。

基盤:で、どうやらそれは macOS 固有の問題なのでは無いかということがわかりました。まず、上りは1.1MB/s。

基盤:一方、下りは11MB/s。

基盤:これは、途中の回線が非対称なのか、サーバ側でチョークされてるのかと思っていたのですが、実はFTPなら両方とも11MB/s以上でることがわかりました。FTPサーバはDeleGate、クライアントはncftpです。

基盤:それでもしやと思い、Parallels上のUbuntuからも試してみました。

開発:対称ですね。

基盤:いったい何やってんですかね?iMacでも同様です。

開発:まあ、tcpdump してみればわかるでしょうけど。

基盤:めんどうくさいんですよね。

社長:統計情報だけ見れればよいのですけどね。

開発:それもこれも、macOSのアクティビティモニタがおもちゃのタコだからいけない。

社長:それをどうにかしようというのが4月の予定でしたが…

基盤:/etc/ssh/ssh_config とか ~/.ssh/ssh_config とか特になにも設定してないようです。

基盤:ローカルなホストとでは、上り下り対称です。

開発: 1Gbps使い切ってますね。

社長:ひょっとしてsocketのバッファが小さいとかじゃないですかね。送受信でサイズが非対称なのはよくあることです。昔は数十KBの世界でしたが、最近では1MBなんていう設定も見ます。

開発:そういうシンプルな話ですかね… とりあえずDeleGateのtcprelayを通してみますか。まずDeleGateのソケットバッファって…

社長:I/Oともに131072バイト、つまり 0x20000バイトにしてますね。10年前では常識的なサイズだったようにも思います。

開発:ではこれで、idg9 -fv -P9022 SERVER=teprelay://jp1:22とかして、ローカルの9022ポートをdg9サーバのSSH/22につなぐ。でもって scp …

基盤:驚愕の25倍速

開発:なぜか送信だけ速くなりましたね。もういっちょトライ。

社長:送信パケット自体は60MB/s出てるようですね。いや、これってマシンローカルのパケットもカウントしてるのかな。だとすると値が2倍に出ますが。

開発:DeleGateでソケットバッファサイズを指定するのってどうするんでしたっけ。

社長:SOCKOPTとかなんとか… マニュアルを見て下さい。

開発:… これですね

社長:ああ、キオスクのだじゃれだったのを覚えています。

開発:-Fver には反映されないような。まあ、1MBにしてみますか。-vd SOCKOPT=buffsize:1024kic+1024kos を添加… DeleGateのログは…

基盤:拡張されてますね。

基盤:劇的には変わらないですね。

開発:いや立ち上がりは劇的なんで、どっかで自動的に抑制するアルゴリズムが働いてるんじゃないですかね。250MBではどうか。

社長:まあ、2割程度の変動はあると。

開発:でたとえばバッファサイズを8KBにすると、1MB/sになります。

基盤:SSH自体が何か動的な制御をしている可能性もありますよね。

社長:しかし、TCPは立ち上がり時にバッファサイズを自動調整するのは知ってますが、全速巡航の時に何かするとは思えないんです。そこはまた何かのチョーク的なものが働いているのかも。

開発:この場合はDeleGateというユーザプロセスがバッファ機能を果たしていて、マルチコアだからパイプラインが効くということかと思いますが、そもそもscpというかsshのソケットバッファを大きくすればよいのでは無いかと思いますね。オプションであるんですかね?

社長:ですが、この問題はssh/scpに限らないわけです。ソケットバッファのサイズを前時代のまま放置しているOSとかアプリとかライブラリっていくらでもあるのかなと。というか、ソケットバッファだけでなく、アプリのI/Oバッファが小さい場合も、システムコールは増えるし。

開発:対処法はこういうところですかね。

  • カーネル内のバッファサイズサイズの設定
  • アプリ(ユーザプログラム)のバッファサイズの設定
  • TCP中継サーバ(バッファリング・圧縮、明示的 / 透明)

社長:アプリでやる場合には、send / recv あたりを動的ライブラリでラップするのが良さそうです。

基盤:これはひょっとして、Macのシステム環境設定にあるのでは… Network > Advanced … それっぽいのは無いですね。

開発:あまり全域に影響が及ぶ設定だと、リソースが無駄になるとか、予測不能な副作用もあるんでしょうね。だから「遠隔との大規模ファイル転送」にTCPを使う、という場合にだけ適用できるようにする、自動判別もしくは明示指定、というのが良いのかなと思います。

社長:うーん、タイムスリッパでやったように動的ライブラリではできそうだけど、トランスペアレントプロキシ方式が面白そうです。これだと、既存のプログラムには何の影響も与えない。パイプライン動作とか、対向で使えば圧縮とかもできそう。この線を試してみたいですね。

経理:先程の固定電話は、鹿児島から黒酢ドリンクのセールスでした。今あちらでは気温が35度に達しているそうで、大変ですね。種子島のとっぴーの話とかで盛り上がっちゃいました。

基盤:随分長電話してましたが、長距離電話って今は安いんですかね。ネット電話?

社長:昼食行ってきます。

* * *

社長:メロンソーダを飲みながら帰社であります。

開発:夏休みですね。

社長:いやー、外はまさに真夏。でも社内は涼しいですね。

基盤:ただいまの室温、31.6度。

経理:心頭滅却すれば火もまた涼し。

基盤:気休めにベランダに打ち水しておきます。

社長:それで今日は初めてのラーメンやさんに入りました。真鯛のスープ+えびすの小瓶。あれはハマりでしたね。

社長:それで食べながら考えたんですが、やはりトランスペアレントプロキシ方式はsuにならないと使えないのが嫌だなと。実現性がOSにも依存するし。それで、accept と connect を動的ライブラリでフックして、socket pairで中継用のスレッドかプロセスを挿入するのが良いかなと。

基盤:気化熱作戦、効かないですね。室温0.1度上昇。

開発:水道の水をラジエータに通すっていうのはどうですかね。室温よりだいぶ低いでしょう。

基盤:東京都の水道水だと8月でも27〜28度くらいのようです。

社長:井戸水があれば強力なのに。あれなら、15度くらいですよね。

* * *

開発:しかしとりあえずscpが高速化できればいいや的なら、DeleGateみたいな中継器を立てて、そこにsshすれば良いので、今でも十分なわけです。ただちょっと使い勝手が悪いのは、複数のサーバを相手にしている場合に、ホスト名とかアドレスを変えるたびにいちいちknown_hostsがー、って言ってくるところです。何なんですかね?

基盤:ユーザの鍵で認証しているのに、その上ホストの認証とか必要なんですかね?ユーザの鍵を盗まれた時点で詰んでるように思うんですが。

社長:鍵認証じゃない場合に必要なんじゃないですかね?あとはログイン後にsuとかでパスワードを入れる場合とか。

開発:現在のセッションのアカウントは認証されてるわけだから、その大元との間でワンタイムパスワードみたいのを発行して、それを中間で入れされる、で良いように思いますね。

社長:まあ、ひとつのテキスト端末で全部やりとりしてるって想定でしょうからね。telnet ならout-of-band的に、端末には表示されないメッセージをエンドツーエンドで交換して、クライアント側のウィンドウなりをポップアップするとかできそうですが。SSHはそういうのできるんですかね?

基盤:パスワードをユーザの鍵で暗号化してloginに渡すのでも良い気がします。

開発:そもそも「ホストにログインする」というホストって何?ログインて何?とも思うのです。まあたしかにsshはコマンドインタプリタとしてホストというものにログインする形態のソフトだから、そういう概念はあるんだと思いますが。リモートにコマンドを送るだけとか、とにかく端末からコマンドshellとか使わない場合も多いわけです。scp とかトンネルとか。

* * *

開発:いやあ、openssh のビルドでつまづいて懲りました。が、わかったことは、scpでのアップロードが遅くなったのは、openssh-7.8からだということです。

開発:Catalina 10.15.6 の ssh は 8.1p1です。

開発:一方 Ubuntu18.04 の ssh は 7.6 だったのです。

社長:OpenSSLの版の影響は無いですか?

開発:同じ OpenSSL 1.0.1l での比較です。

開発:Lunuxでも状況は同じでした。

開発:ただよくわからないのは、openssh のコードを見ても、ソケットバッファのサイズをいじってないことです。となると、バッファがうまる前にソケットをflushというかpushして細切れパケットを発生させているのかも知れません。送信の間にコンテクストスイッチみたいな遅延が入ってるとか。

社長:うーむ、面白いですね。diff を見るのが楽しみです。ちょっとひとやすみしましょう。飲んできます。

— 2020-0804 SatoxITS

はじめての自作NFSサーバ

社長:「はじめての自作◎◎」って悪くないタイトルですよね。

開発:まあ、一般にあまり自作する事のないものだと違和感はあります。

経理:ベストセラーにはなりにくそうですね。

基盤:はじめての自作宇宙船とか。スペースXって結局、国鉄の民営化みたいのとは違うんですかね?

* * *

開発:ああそれで、NFSサーバが固まっちゃう問題は再現しました。

社長:なるほど、自分自身につなごうとしてタイムアウトを繰り返していると。

開発:unfsdを単一プロセスにしていたのでわかりやすかったです。要は、自身がマウントしているディレクトリの下に、自身のマウントポイントが見えているので、再帰しちゃってるんですね。

社長:多段のループだと検出は難しいですが、自分自身なら検出しても良いのにね。

開発:それはそうと、こうなった場合のmountテーブルのクリア方法がわかりません。umount は効かない。diskutil umount force も効かない。

社長:ひょっとして、unfsdを殺しちゃってるからじゃないですか?誰も応答しないから、後片付けができないとか。

開発:あ… そうかもです。unfsd を起動して、umount … ああ、昨日見たこれがぽっと出ました。

開発:でもって Disconnect All。おー、mountがクリアされました。

社長:メデタシ。

開発:「昨日見たFUSEみたいの」なんて、失礼な事を書いちゃいました。とんだ濡れ衣でしたね。

社長:要は、私は eject しちゃいましたもうここにはいません、みたいなメッセージをクライアントに返してから死ねばよいのでしょうかね。

開発:まあ、原因もわかりましたし、方向性は見えましたのでおいおい。

開発:それで、ファイルをクリックで開く時に、それをどう扱うかは結局、拡張子で判断するのが趨勢なわけです。まあ、可変長文字列なのでまさに拡張性もありますしね。なので、

社長:ちょっと待った。ボウリングの試合に行ってきます。

* * *

社長:ただいま。

基盤:どうでした?

社長:130台で始まり、徐々に修正して、200台で終わりました。最初はフォームもタイミングも変でわけがわからなかったんですが、リリース時に右肩が突っ込んだりぶれてた事に気づいたんです。回転軸がぶれては、全てが台無しです。

社長:ああそれで、機能を持つファイルの名前ですが、最後は拡張子で終わる。ファイル名の先頭は本来の名前であるべき。だとすると、name++function.ext といった形になるのかなと思いました。

開発:「++function」の記法は悩ましいですね。?function でも良さそうには思いますが。

社長:「?」は伝統的にshellでファイル名の一文字マッチングに解釈されちゃうのが嫌なんですよね。まあ、おいおい考えましょう。

開発:ではとりあえず「++」がファイル名に入ってたら実行することにしてみます。

開発:またループすると嫌なので、$HOME/unifsv を $HOME/unifcl にマウントすることにします。まずこういうふうにexportsして、unfsdを起動。

開発:でこれをマウントする。

開発:ここにある4つのファイルは全部同じファイルです。ハードリンクしたものです。で、中身を読み出すと、NFSのクライアント側から見た ++ 付きのファイルだけが、実行された結果として見える。

開発:でこれをFinderで開いたりブラウザで開くとこうなります。

社長:ふーむ。機能的には出来てます。Finderやエクスプローラにファイルの名前以外でデータ型を、MIME Content-Type で伝えられると良いのですけどね。

開発:うーん。少なくとも最初のNFSが出来た時にはまだ MIME も無かったですしねw。

基盤:その後のNFSではどうなんでしょうね。

開発:grep -i mime *.h .c … unfs3には無いみたいですね。NFSv4にはあるんですかね… あった。

開発:まあ、これをNFSクライアントが、つまりファインダーやエクスプローラが見てくれるかどうかですが…

社長:見てくれるなら、CGI使ってヘッダにContent-Typeを返す必要なくなりますね。

開発:ものによっては、HTTPサーバである必要もなくなりますね。単にNFSマウントしてfile URLで開けば良い。

開発:ですが、せっかくHTTPでURLにいろんな機能をもたせて普及したわけですから、それをそのままファイル名にも使いたいのも確かです。

社長:HTTP的に考えれば、クライアント側に見えない隠しファイル的に、いろんな属性を付加できればいいんじゃ無いかととは思います。

開発:そうですが… クライアント側から一律な変換機能を叩けるところが、NFSでやる面白さなんじゃないかとも思うわけです。

開発:どうもその、一度ディレクトリをキャッシュしてしまうと、その中に無いパスを追ってくれない的なクライアントの作りになっているように思われるんです。そうなると、無限の組み合わせのある隠し機能というかパラメータを指定することが出来ない。

社長:でも、巨大なディレクトリの中の一つのファイルを開くこともあるわけで。クライアントとしてそういう理不尽な実装をしますかね?

開発:ああでも、これも、ディレクトリの最終変更日付を変える手でしのげますかね。あるいは、このディレクトリ、このファイルはキャッシュするなという指示がNFS的にできるのかもです。明日また確認します。

— 2020-0803 SatoxITS

世の中の全てをファイルとして見る

開発:明日、いやもう今日ですが、大谷くんが先発だそうです。5時10分試合開始予定。

社長:おおそうですか。ではテレビを見る練習をしておかないと… リモコンはどこに行きましたかね。NHKですよね?

開発:BS1です。なんたって女子ゴルフと違ってメジャーですからねw

社長:NEWSWEBもとんと見てなかったです。ええ!照ノ富士復活優勝!?

開発:稀勢の里とのボロボロ対決を思い出しますね。

基盤:相撲やってるのも気づかなかったです。

経理:ところでNHKの衛星契約は受信料が月2000円のようです。ケーブルテレビのほうでまとめて徴収されてると思いますが。

社長:おおっと、4LSU 相当ですかぁ。そう考えるとかなりの額ですね。以前はずっとNHKつけっぱなしでしたから、元が取れてたとは思いますが…

基盤:リモコン発見。電源ぽちっと。そもそもBS1になってますね。準備OK。

* * *

開発:それで、自前のNFSサーバを作りたいと言っていた件ですが、ようやく見つけました。これです。

https://unix.stackexchange.com/questions/45899/why-is-linux-nfs-server-implemented-in-the-kernel-as-opposed-to-userspace

社長:それだ。なんでなんですかね。

開発:nfsサーバをカーネルに取り込んだのは性能向上のためだったが、多くの問題を生んだ。今は反省している、みたいな流れですね。

社長:うちはギンギンにアクセスするために使うんではないので関係ないですね。NFSクライントから別サーバに中継するだけですし、基本、ユーザローカルに動かす個人用のNFSサーバだし。

開発:それでこの記事の中で言及されてるのがまずFUSE。めちゃ遅いという認識は同じですね。一方、ユーザ空間で動くnfsdとしては、unfs3とGaneshaというのが紹介されています。

開発:で両方ともダウンロードして眺めたのですが、これはもうひと目見てunfs3で決まりです。めっちゃ簡単。名前のとおりNFSv3ですが、まあクライアントがそれで許してくれるなら問題ないでしょう。

開発:ビルドはこれだけ。あっというまです。

開発:で、man ./unfsd.8 すると、ポート番号の指定は -m だそう。/etc/exports を変える時には -e。つまり、サーバの起動はこれで良いのではと。

開発:一方でmountはこんな感じ。じゃん!

基盤:通りましたね。

開発:でもって ls とかしてみる。

基盤:見えました。

開発:で書き込みの性能を見る。

基盤:2倍位遅いですかね。約280MB/s、2.28Gbpsです。

社長:うちの使い方には全く問題なさそうです。

開発:ランダムアクセスした時にどうかという話はありますが、主な用途が付加価値的なデータ処理や別プロトコルのサーバへの中継だと考えれば、そちらで律速されますから、問題ないかなと思います。

基盤:アンチウィルスフィルタとか噛ませたら、ファイルI/Oが10MB/sくらいに落ちることもありますからね。あれは本当に不愉快というか使い物にならない。

開発:あとは安定性ですかね。というか、nfs が反応しなくなると、I/O中のプロセスが固まって溜まりまくるという伝統芸的な問題を何とかしたい。

社長:特にdfで様子を見ようとすると固まるあれですね。mount コマンドとかで状態を検査する機能があるとよいかと思いますが。

* * *

基盤:大谷くん、またダメでしたね。

社長:でも今回は1回はもちました。

開発:実戦のブランクも長かったですしね。ピッチャーっていうのはそういうデリケートなポジションなんでしょう。

社長:それはそうと久しぶりにBS1を垂れ流しで見たんですが、悪くないですね。

基盤:ですがあれを常時専用のテレビモニタに映しておくのは電気の無駄ですね。カメラ入力としてキャプチャしてデスクトップに小さく表示しておくのがよいのではないかと。

開発:HDMIをディスクに記録しながら中継したりUSBに出すような製品がありますよね。確か1万円くらい。おそらく、大して電気も食わない。

基盤:ひょっとしてQNAPの上位機種にあるカメラ機能がそのまま使えるとか。

開発:上位版というと、うちのQちゃんより下位機種があるような響きですねw

経理:エアコン無しで、トイレと台所の照明は低消費電力LED化。次はテレビモニタのバックライトかと思います。あ、あとあのオーディオアンプ。

基盤:ケーブルテレビを継続するなら、10年くらい前に廃止キャンペーンしてたこのセットトップボックスも交換したほうが良いかと思います。これもめっちゃ熱くなってるんで。

基盤:ああそれで、iMac用の増設メモリですが、正規版?がクソ高いので、アマゾンで安いのを見つけて発注しました。価格的にはMac用メモリ専門店の1/4くらい。16GBで6,000円強。こないだレノボに入れた8GBのとほぼ同等というか割安です。こなれてはいませんが、日本語も比較的まともだし、質疑にも答えています。

社長:4倍という価格差。ハイリスク、ハイリターンな感じですねw

基盤:といいますか、iMacをカスタマイズする時のオプションによると、うちのiMacで16GBから16GB増やすと+40,000円です。

開発:誰が買うんでしょうね?

基盤:お金持ちの奥さんとか。

社長:運悪く不良品に当たるかどうかですね。

開発:まあ、届いたら徹底的に初期テストをしましょう。

* * *

基盤:といいますか、さっきからディスクがフリーズ気味なんですが。unfs3のせいでは。

開発:そういえば、なんか固まったんでサーバ自体はkillしたんですが、umount とか diskutil umount が効かなくなって…

社長:それは確か soft というマウントオプションを付けると良かったと思います。ファイルシステムとしてはちょっと嫌ですが、普通のアプリケーションプロトコルならタイムアウトで切れるとか普通だし、それに対応するようにプロトコルも実装も作られてますからね。

基盤:まあネットワークを意識したアプリじゃないと、ファイルI/Oが失敗した時の例外処理とか脱出なんて普通コーディングしないですからね。

社長:まー、カレントディレクトリがNFS上だったりするともう、どうにも回復もならなくなるわけです。zshあたりでそのへんなんとかしたいですね。

開発:うーん、だれかが掴んでてbusyのようで… Finderかな?プロセスをkill… あれー、すぐにまた生えてきちゃいますね。今朝も何度か強制unmountしてなんとかなったんですが。あの時はFUSEみたいなアイコンのがポップアップして答えたわけで… その後FUSEをコントロールパネルから抹消した程度なのですが… 呪い?

社長:もう小一時間がんばりました。再現性はあるでしょうから後で精査。リブートしましょう。

基盤:この、シャットダウンに抵抗するやつら、邪魔ですね。どうせ自動回復する機能があるんだから、おとなしく死ねば良いのに。OfficeとかFirefoxとか。ぷち。ぷち。ぷち。さあきれいにまりましたが… なんかくるくるしたままですね。

開発:電源リセットしましょう。

基盤:これやると、フィリップス君にレノボちゃんのDisplay Portのデスクトップがが顔を出すんですよねw で、再びHDMIを選んで MacMiniに戻す。

開発:きれいに立ち上がりました。というか、クラウド系のドライブのマウントがきれいさっぱりになりましたねw

社長:まあ、万が一MacMiniが立ち上がらなくなっても、もうiMacに環境があるし。最後の砦にレノボWin10も控えているわけです。BCPは完璧ですね。

経理:ベランダの打ち水は数分で蒸発してしまいます。

基盤:水道の蛇口がベランダにあると良いのですが… 設計ミスじゃないですかね。台所から引きましょうか。

社長:ていうか、うちのベランダってこんなに広かったんですね。野菜畑でもしましょうか。

* * *

開発:リブートしてからすごく快調で、diskutil なしの umount も普通に通るようになってしまいました。最初 / を export してマウントしたのが問題なのか、今はまだクラウドのドライブがほとんどマウントされてない関係なのか、よくわかりません。というか、unfsd 自体が出していると思っていた :/: の response が無いというようなエラーメッセージ、あーキャプチャし忘れました、MacOSのライブラリが出していたのかもしれません。strings unfsd しても出てこないんです。

開発:それはそうと、unfsd のバイナリはこんな感じ。

基盤:超コンパクト。

開発:ソースはこんな感じです。

開発:daemon.c はNFSプロトコルの出入り口で、実際の処理をやっているのがnfs.cです。

社長:つまり、うちが手をつっこむのは nfs.cだということですね。

開発:リードオンリーのファイルシステムなら、数個の関数しか関係しません。

開発:ちょっと getattr と lookup にprintfを突っ込んでみます。

基盤:簡単過ぎる…

社長:たとえばファイルのメタ情報を仮想的なファイルとして読み書きできると良いですね。何かの拡張子的なものを付けて… たとえばファイル名が name なら ._.name.attr とか。

開発:あれ?open に対応するものは無いですね。とりあえず read…

開発:1パケットに入らないのをread…

開発:ふむふむ。ソースコードはこう。

開発:なるほど、毎回openしてるんですね。ファイルディスクリプタがキャッシュに残っていたら再利用すると。

社長:要するにステートレスなんですね。このあたり、マルチプロセスでnfsdをするときにどう共有するのか。たぶん共有できないから、カーネルに入れたかったと。

開発:プロセス間でファイルディスクリプタを渡すシステムコールはありますよね。あれはWin32でしたっけ?

社長:なるほどー。かなり景色が開けてきました。メシに行きますか。

* * *

社長:外はまさに真夏でしたが、室内はまあ過ごせますね。

基盤:温度計は31.2度になってますけどね。

開発:まあ15年くらい前の時計のおまけのMEMSですけどね。

社長:でも、それで長年、室温を認識してきましたから、絶対値精度は別として比較の基準です。

社長:それで改善案を2つ。1つは、南向きベランダに噴水付き庭園を作る。2つ目は、北向きのベランダからサーキュレータで冷気を取り込む。

基盤:ではこの温度計を北の倉庫室に持ってって測ります。あ、ショックでUPSの電源が抜けました。

UPS:ぴぃー。… … … … … ぴぃー。… … … … …

開発:昔使ってたオムロンのはうつになるほど警告がうるさかったですけどね。

社長:でもMacMiniは平気で動いています。

基盤:では、電源を回復。ぶつ。

開発:けっこうバッテリを食いましたね。

基盤:可愛そうにQちゃんは、バックアップ無しの口に繋がれてました… 立ち上がりに数分かかるんですよね。

開発:なぜそのような迫害を。

基盤:最後に来た時に口が空いてなかったんですね。

QNAP:ぷうーーーーっ!

基盤:でも、元気に立ち上がりました。

社長:で、北の部屋の温度は?

基盤:30.0度でした。南より1度以上低いですね。

社長:風向きは?

経理:金鳥の煙は南から北へ向かって強く。

開発:うーん、とすると、北の部屋から南へ向けて強力なサーキュレータで送風する必要がありますね。

経理:単に北の部屋で仕事するという方法もあるかと思いますが。

社長:自然の風に任せるとすると、南のベランダに噴水付き庭園案は現実身が高まります。昔ガーデニングで使ってた道具は全部廃棄しちゃったから、また揃え直さなくっちゃ♪

開発:近場でガーデニング系を置いてたホームセンターは全部消えちゃいましたからね。品揃えがちゃんとしている店までだと車で20分かかるのが大変です。

基盤:あまくぼにちっちゃい花屋さんみたいのを見かけましたけど。

* * *

社長:さて、では読むと実行して結果を返すようなファイルを作りましょう。

開発:とりあえず popen するって感じですかね。何か拡張子なり属性なり…

社長:属性の拡張は難しいでしょうね。とりあえず、ファイル名に’?’が付いてたら、’?’より前を実行ファイル名にして、’?’から後を引数にするみたいな。

開発:CGIですね。じゃパス名をstrchrして… あれー、read_svc() に渡ってこないですね…。なんかNFSクライアント側でディレクトリのキャッシュしているとか、そんか感じのようにも?

社長:ではとりあえず、拡張子的な目印では。

開発:たとえば .shx ならsystem()で実行して結果を返すと。うーむ、popen()は厳しいですね。何か named pipe 的なものでないとだめかも。とりあえず実行結果をファイルに書いちゃってそれを読む。うーむ、read-only filesystem?では/tmpに書いてやりましょう。Go!

基盤:おお出来ましたね。

開発:いやしかし、2回目からは前と同じ結果が返ってきてしまいますよ。どこかでキャッシュしてますね。ああ、ファイルのタイムスタンプ属性を見てるようですね。じゃあこれを、いつも現在時刻にしてしまう。これでどうかな?

基盤:やった!

社長:うーん、one giant leap ですね。

開発:明るい未来が見えた気がした。unfs3に感謝感激。

* * *

社長:思えば、私が初めてNFSに触ったのは、たぶん 1987年頃の Sun ででした。あの頃、NFSでこういう感じの遊びができたら面白いのにと思ったものですが、当時は商用のSunOSでしたし、たぶん無理でしたね。それが今や、こんなふうにちょこちょこっと出来てしまう。まさに夢のような世界ですね。

基盤:LinuxのNFSは 1993年、unfs3は 2003年に出来てたみたいですけどね。

開発:なにしろ90年代は、Unixワークステーションの全盛期でしたからねえ。1台何百万円はする。Linux?なにそれそのおもちゃ、みたいな感じでしたよ。下手に予算にも恵まれていた。

社長:やはり経済的にもミニマルなところから新しいものは生まれるんですね。ああそうだ、車検が上がったそうなので、取りに行ってきます。

経理:この額、この会社ではとても負担できないですね。

社長:まあ、車は半分趣味だから、尺度が違います。いわゆる社長のポケットマネーです。あっはっは・・はは・・

基盤:いずれ社長機密費とかできると良いですね。

— 2020-0803 SatoxITS

脱冷房宣言

社長:部屋を吹き抜ける風がすばらしく気持ち良いですね。

開発:以前はこんな日も締め切ってエアコンで冷やしてたなんて馬鹿みたいです。

基盤:まあビルだと窓が開かないのが普通ですからね。

社長:今年の気温は例年に比べてどうなんですかね?

基盤:気象庁のページによると、一昨年からはこういう感じです。

社長:なるほど、今年はずいぶん早くから暑い日が多いと思いましたが、そのとおりだったんですね。

開発:一昨年の7月の暑さが異常ですね。

基盤:ちょっと、特定の行とか列を選んでグラフ化する機能は無いようなのですが、気象庁の観測開始以来の最高気温の推移がこれです。

開発:1月に観測組織が発足したんですかね?

社長:私が麦わら帽子で夏休みだった頃です…

開発:絶対値で比べるといま一つ違いが見えないので、人間が快適だと思う温度、例えば20度からの差分で表示すると良いかも。

社長:まあ、絶対零度からの絶対値じゃないですけどね。

基盤:なんにしても8月が一番暑い月だということは明白です。

経理:今月冷房無しで乗り切れると素晴らしいですね。

社長:これ、ベタにHTMLのテーブルですね。生データはダウンロードできないんでしょうか?

基盤:えーと。できますね。ただ、サイズ制限は結構厳しいから、条件で絞り込まないと。

開発:全部合わせてもギガバイト程度じゃないんですかね?

基盤:小分けしてロボットにダウンロードさせると良いかもですね。

基盤:たとえば1970年からの最高気温を取り出してExcelに食わせる…

社長:意外と、地球が劇的に温暖化って感じでもないですね。

経理:100年通しても。

基盤:2000年からの毎日の最高気温をグラフにしてみると面白そうですね。

基盤:制限サイズに収まりました。ダウロードをぽち。

社長:夏休みの課題で使われてたりするんですかね?

開発:まだしゃかりきになる時期ではないでしょう。

基盤:再トライ。成功しました。ではグラフにします。

社長:こうやってみると変動してる感は無いですね。

開発:正弦波的になるのかと思ってたので意外です。

基盤:当社設立以来の推移。

社長:なるほど、たしかにもう2ヶ月以上、同じような感じでした。

基盤:一方これが去年の同一期間。

開発:7月末から30度をガンと超えてますね。でその先は…

基盤:8月中旬くらいで収束してますね。

社長:何にしても、絶対的な気温というより、心地よい風が吹いていてくれるかが重要と思います。

基盤:でも、Excelてデータの行数が多くなると選択がかったるいし、風速データとかもう…w

社長:セルの選択を正規表現とかの検索でアドホックにできると良いのにね。

開発:表型式で表示して、どれとどれのセル区間をグラフにするっていうような JavaScript は普通にありますよね。

社長:時系列的な数値のグラフ化という意味では、株価とかの変動のグラフを出しているサイトのやつがすごいですね。ああいうのが標準的なライブラリになっていると良いのだと思います。

経理:この夏を冷房無しで乗り切れると理解しました。

開発:となるとちょっと気が早いですが、冬の寒さをどう乗り切るかが問題かもですね。暖房なしはさすがに…

基盤:パソコンとか熱源を全部をこたつに突っ込むと良いかも。

社長:窓締め切りの高層のビルなんかではどうしようもないですが、普通のアパマンでも夏は冷房が必須だと思っていたのは思い込みだったかもですね。昔、締め切って冷房が弱いと30度超えて死にそうってイメージが強くて。なにせあの頃のパソコン類って合わせると何百ワットもありました。それと一緒に1Kに詰め込まれて生活してたわけで。24時間365日エアコンつけっぱなしでした。バカバカしいですね。

基盤:この建物はベランダのひさしが深いというのも効果的なのかもです。

開発:は。もしや大家さんがどこかでこっそり集中冷房してくれているとか。

経理:ベランダに水打ちとかしたらもっと良いかも。

社長:そういえば、奮発して金鳥の渦巻も買ってきました。アースのと比べてみましょう。

* * *

経理:郵便受けに、また特別給付金の申請書が来てました。3通目です。

基盤:この再送、住民税を浪費させてますね。

社長:私は、今年度は分不相応に払いました。

経理:忘れないうちに出しましょう。8/18締め切りです。

開発:うちが貧しいのはコロナとは一切関係ありませんからって辞退したらカッコいいかも。

社長:太陽フレアの影響はあったかも。

経理:「給付金の受給を希望されない方はチェック欄(□)に×印をご記入下さい」とあります。

社長:強く希望いたします。

経理:受け取る口座はどれにしますか?

社長:うーん、これは会社代表としてではなく、個人の口座でしょうね。あそこにしよう。

基盤:そういえばじゃぱねっと銀行はぺーぺー銀行になるとか。

開発:ちょっと法人口座としてはカッチョ悪いですね。

社長:うちは上下構造がないので全員ぺーぺーです。

社長:ふと思ったのですが、まともに利子の付く預金ってあるんですかね。定期とか。

経理:年利0.2%のところが最高みたいです。ふつうは 0.002%。

基盤:雀って涙腺あるんですかね?

社長:いやこの、身分証をコピーして貼り付けて郵送ってノリ、この先もうなくなるんでしょうね。よい記念です。

開発:ひさしぶりにエプソン君が活躍ですね。

社長:さすがに時々は印刷しないとインクが詰まるとかするでしょうね。いや、こういう作業、実のところ嫌いじゃないですね。さて印刷して。うは、色再現性もへったくれも無いですね。テープのりで貼り付け。このテープのりというのがすごく好きです。考えた出したヒトに感謝したい。ぺりぺり。ぺたっ。

経理:投函しておきます。

* * *

社長:「メールの引用はdetailsにて」という仮題で書き始めたんですが、違う方向に行ってしまいました。

開発:まあ、JavaScript でグラフを描画するって話ですね。

社長:それはずっと懸案でしたし、5月13日にはやり方をブログに書いたのですが。

開発:なんで非公開にしてしまったんですかね。

* * *

経理:金鳥渦巻第1巻に点火しました。

基盤:これはちょっと、いわゆるお線香とは違う傾向の匂い成分が強いですね。

経理:といいますか、アースに比べて渦巻が分離しやすいのが素晴らしいと思いました。色合いもシックで手触りもすべすべ。

社長:そういえば今日ゥエルシァで金鳥買った時に、無性にシンナーが嗅ぎたくなってセメダインを探したのですが、売ってませんでした。

開発:子供の頃にプラモデルづくりに陶酔できたのは、シンナーの作用も大きかったかもですね。

基盤:シンナーとタバコはどっちが身体に悪いですかね。

開発:まあ、タバコでしょう。

社長:シンナーを毎日520円分吸わないと比較としては。

— 2020-0802 SatoxITS

そうだ、スケジューラを作ろう

開発:スケジューラを作ろうと思います。

社長:まあ、時間の管理は全ての基本ですからね。

開発:システムを管理したり何したりするにも、時間の記録と、時間に応じたアクションを管理することが重要です。ですが、たとえば cron では分単位でしかアクションを制御できないので、話にならないわけです。50年前の遺物と言えます。

管理:最低でも秒単位、できればミリ秒単位ですね。

開発:性能を測ったりする上では、ミリ秒の精度では足りないのは明らかです。ですがUnixやWindowsでのユーザ向けプログラムならマイクロ秒はかなり十分です。で、ちょっとプログラムを書きかけたのですが、以前からマイクロ秒を扱うシステムの関数のデータ構造が統一されていないのが嫌な気分なわけです。ならいっそナノ秒にということに。

開発:nanosleep()という関数は、Linunx にも MacOSに互換なものとしてある上、これ、シグナルの処理ともセットになっているので、効率も使い勝手も良いと思います。

社長:おっと、1993にはもう存在したということですか… 私がDeleGateを作り始めた時にはもうあったんですね。

開発:コマンドセット的には、time と date のナノ秒版である ntime と ndate。あとスケジューラとしての nschedかと思います。

基盤:ログを眺めるのに tail -f コマンドをよく使うのですが、あれのタイムスタンプ付き版も欲しいですね。

社長:私は cat というか tee コマンドのタイムスタンプ付き版をDeleGateの中で使ってましたね。

開発:つまり tail -f と cat と tee を統合してタイムスタンプを付けるコマンドですね。

社長:複数のファイルを見張って tail -f してマージしてくれるのも良いですね。

開発:tee の fan out に対して fan in というわけですね。それはまあ、shell でマルチプロセスにすれば出来なくもないですが、一つのプロセスにしたほうが効率が良いですね。というかどうせファイルディスクリプタをselectするだけだから、どこかにソケットをつなげて受信しても良い。popenでも良いかもですね。コマンド引数的には、-i ifile1 -i ifile2 -i iprogram -o ofile1 -o ofile2 -o oprogram 的な。

社長:要は URL を書けばよいのかなと思いますね。あと -o に加えて -a とか。ていうかコレ、実装は要するにプロキシサーバみたいなものになりますね。

基盤:なら、入力と出力を同じソケットにつなげてサーバとかクライアントにしてしまうとか。

社長:まあ変換サーバですね。そういえばそもそも、昔の inetd に登録するプログラムってだいたいそういうものでした。今で言えば CGI プログラムみたいな。

開発:出力がマルチキャスト的になると、どこかの受信者が滞ると全体がフリーズしてしまう危険はあります。となると出力にもタイムアウトを付けないといけない。

社長:fan in をマージして一つのファイルなりプロセスに渡す場合、どこから来たデータかにタグを付ける必要もあるでしょうね。

開発:そういえば、SSDとか想定するなら、CPUがネックになる場合、たとえば 並列 find + grep できると高速化できるのにと思います。

社長:どこからきたどういうコンテンツのデータはどこへ送るとか書けると、ルータになりますね。リフレクタにもなりそう。

開発:入力をパターンマッチして変換できると便利ですね。sed を通すとか?

社長:バスみたいですね。viabusもそんな感じでした。

基盤:だんだんスケジューラじゃなくなって来たような…

社長:スケジューラは、時間という入力を得て自分がデータを発信するんだと思います。順々に処理を実行するとか。データじゃなくてシグナルでも良いかな。となると送り先はプロセスですね。

開発:入力の仕様、変換の仕様、出力の仕様をそれぞれに書いて、結線する感じですね。それぞれオートマトンでも良いですが、メモリに余裕があればスレッドにしてしまうのが良いですかね。

基盤:1スレッドに1MBあげても、1000スレッドで1GBですから、今どきのコンピュータなら楽勝ですね。

社長:プロセスにするかスレッドにするかオートマトンにするかは、処理内容によって選択するんでしょうね。プロセス単位であればいわゆるコマンドshellによるプログラム組み合わせ機能になります。

社長:入力部分は言語処理系になりますね。正規表現だけだと弱いので、LL1くらいは入れたい。BNFで記述する。うーん、ついに学生時代まで戻りました(笑)

開発:学生時代に自分で書いたプログラムの発掘なら、知財とか著作権の問題が無くて良いですね(^-^)

社長:スケジューリングのタイミングの指定ですが、時刻表示のワイルドカード的なものが直感的で良いですね。2020-08-02/02:00:00.000 とか、*-*-*/00:00:00 とか、*-*-*/0,6,12,18:00:00:00.000 とか、*-*-*/*:*:00.000 とか。

基盤:IPv6アドレスの省略形みたいのが書きやすいですね。

開発:日付と時刻の間の区切り記号というのが悩ましいところですね。あれは標準があったはずなので、それに従うと良いのだとは思いますが。

開発:ところで今、nanosleepの時間精度をいろんなマシンで観察しているのですが、かなり面白い状況です。他の負荷が高い時に遅れるのは仕方がないとして、スカスカの時にどのくらいの精度があるかなのですが。

開発:ざっくり言って、Unixでも数ミリ秒程度の精度はあるように見えます。ガラ空きの当社アマゾンセール印度支局のAmazon Linuxなんて、数マイクロ秒のふらつきしかないですね。

開発:一方そこそこ仕事をしている東京本部では、時々大きく遅延します。といっても10ミリ秒程度ですが。

開発:通常利用中のMacMiniでも数ミリ秒程度のふらつきです。

開発:何もしてないParallels上のUbuntu 18.04でふらつきが大きいのは、ホストのiMacが何やら色々仕事をしてるからかも知れません。

開発:同じく暇人なHyper/V上のUbuntu 18.04ではふらつきは小さい。0.2ms以下です。これはホストのLenovo自体が暇だからかも知れません。

開発:暇人の最たるものと言えばラズパイ4です。なんといっても組み込み系ですし、さぞやと思ったのですが、それほどでもありませんでした。

社長:プロセスのプライオリティを上げてやるとどうなりますかね?

開発:nice とか使うの、何十年ぶりですかねぇw。sudo nice -20 !

社長:かなり改善はしますね。というかこれ、メモリ空間の中にSysTickレジスタが見えているはずだから、1ms前になったらビジーループでSysTickを観察したりとかすれば、1マイクロ秒より高い精度でスケジュールできるでしょうね。本当のnanosleepができる。

開発:ところで、いつの頃からかラズパイにつながらなくなったなーと思っていたのですが、Etherケーブルが抜けていました。

基盤:物理層の法則ですね。

開発:同じARM LinuxのよしみでQNAPでも動かないかなーとバイナリを持っていきましたが、だめでした。なんというか、実行形式として認識しないようになっているといいますか。

基盤:QNAPは Cortex-A53ですね… ラズパイだと Pi4 は A72 ですが、Rapsberry Pi 3 が Cortex-A53だそうですが。

開発:おおっと、そうですか。A72とA53でバイナリに互換性が無いんですかねー… Mシリーズとか全部互換なんですが。あああれも下位互換ていうだけですね。何にしても実行形式として認知してくれないって、動的ライブラリの関係のような気もするんですが。なにせQちゃんはデバッグ系の機能を全部落としてますから、追えないというか… static link にしてみますかね…

社長:認知されましたね。

開発:てことは、ラズパイ3のバイナリなら動く可能性がありますね。

基盤:ラズパイ3て結構高いんですよね。アマゾンで一番安いところが5200円くらい… まあ、オークションとかでならただ同然かもですが。

基盤:あ、pi 3 A+ 3,300円でありますね。Etherは無いですが無線LANあり。

社長:承認。

開発:早晩QNAPもA72版を出すでしょうけどね… 2万円を維持してくれるかどうかはわかりませんが、ラズパイだって価格は 3 と 4 で変わらないわけだし…

社長:ブラウザのウィンドウとかタブとか、やってる内容ごとにスケジューリングと言うか、少なくとも優先度は変えたいですね。メモリもコンパクションするか否かとか。

社長:それはそうと、わたしはこの、おいしい牛乳パックの注ぎ口のキャップに、テコの原理が採用されたことに、非常に感動しています。目からうろこというか。ぐび。

基盤:ヒトにやさしい技術の使われ方ですね。

— 2020-0801 SatoxITS

Parallels Desktop祭り

基盤:それで Parallels Desktop ですが、どうしましょう。

開発:試用版で色々やってみて、機能性能的に問題なく使えることはわかりました。使いやすいし見た目も、この動作状況のインジケータとかなかなかかわいい。Hyper/Vには無い楽しさです。Mac上で動かすVMサーバとしてはベストのソリューションかも知れません。

基盤:私はこの、Parallels用のUbuntuパッケージの詰め合わせというかセンスが、なんだか好きですね。Parallels用にちゃんと設計されている感じもしますし。 あと、/bin/sh -> /bin/dash になってるところが面白いというか、一事が万事的な感じがします。

経理:アース渦巻第4巻に点火しました。ちょっと飽きたので、今度金鳥も試しましょう。

基盤:それで、選択肢は3つ。スタンダードは1万円で買い切り永久使用できますが、ゲストVMあたりRAM 8GB、4CPUという制約があります。6コアと16GBを持ってるホストの能力をフルに活かすには、4CPUはちょっと残念なところです。

経理:そういうエディション設計ですねw

基盤:それと、このツールの元気さだと、今後の向上が期待できるのでは無いかと思いますので、最新版が使えるサブスクリプションのほうが良いかと思われます。1万円/年です。

社長:では、Proをサブスクライブしましょう。

基盤:なんか安売りクーポンとか乱発してるみたいですが…

経理:ネットで検索しても、どのクーポンが、現在これに使えるのかさっぱりわからないです。このサイトから行ってみます… 1000円お得。

基盤:Toolbox と Access が消えちゃってるのがなんか嫌ですね。

開発:毎年30%オフとかならすごいですが、クーポンて初年度だけですよね。

基盤:毎年新規にサブスクライブするとか。

開発:こういう怪しげなキャンペーンとかクーポンとかやめたほうがいいんじゃないですかね。製品と会社のイメージを落とします。

社長:Microsoftも当初は、WindowsNTキャンペーンのタダ版CDを垂れ流ししてましたけどね。10枚以上は持ってましたw

社長:えーと、もうかれこれ小一時間クーポンを探していますが、この労力によって最低賃金の時給1時間相当を得られるのか?に疑問を持ちます。我社の本来の労働単価は一桁以上違うわけです。普通に買いましょう。

経理:了解です。では、試用版のボタンから行きます。

基盤:ああ、ビジネス版には ToolBox が無償でバンドルされてなかったりするようですね。

経理:ではPro版をPaypalでぽちっ。ライセンスキー出ました。

基盤:では、表示されたライセンスキーをコピペしてぽちっと。

開発:「購入」が消えましたね (^-^)

社長:昔はこの、ライセンスキーを手入力させるソフトが多くて、さんざんつらい思いをしたものです。今で例えれば劣悪版のReCAPTCHAみたいでした。よい時代になりましたね。

* * *

基盤:おっと、MacOS も仮想マシンにできるのですね。Android仮想マシンも面白そう。

開発:Fedora とか CentOS も懐かしいのでインストールしてみますか。

社長:Ubuntuの前はもっぱらFedoraでしたね。

基盤:では片っ端からインストール…

開発:なるほどこれがAndroid OSですか。動きますね。ってこれ、ARM をエミュレーションしてるんですかね。そのせいか、非常に遅い。

基盤:… 死にましたね。

開発:ホストのメモリが16GBでは辛いでしょうね。

基盤:16GB x 2 の追加を2万円くらいでいけます。

社長:しかし仮想マシンイメージのダウンロードにギガビットインターネットは本当にありがたいですね。

基盤:そういうわけで、MacOSのインストールにだけは1時間ばかりかかりましたが、他のOSは数分ですね。

開発:サーバ用のVMなら軽いですが、さすがにデスクトップのOSを数台同時に走らせるのは厳しいですね。CPUがほとんどシステム時間になりますし。

基盤:なにより、メモリがキツイと思います。やはり32GB増量計画ですね。

社長:10年前には各種OS各バージョンの仮想マシンを50台くらいVMwareに持ってましたが、時々クラッシュして2度と立ち上がらなくなるのが恐ろしかったものです。なのでスナップショットは欠かせなかった。昨日から見ていると、クラッシュすることはなきにしもあらずでも、ちゃんと回復しますね。これはゲストOS側の進歩もあるのかなと思います。

開発:当面はUbuntuが主要なお客さんOSだと思いますが、全然問題ないようですので、これからはParallelsですね。

基盤:Hyper/VとホストのLenovoには結構投資しましたが…

開発:まあいずれ、何か実用に生きるか、少くとも思い出にはなるんじゃないですかね。

基盤:そうですか…。では一区切りつきましたので、記念写真をパシャ。

— 2020-0802 SatoxITS

全く新しいアーカイブフォーマット

社長:ただいま°ー!

経理:酒臭いですね。

社長:12LSUを投じたメンタルヘルスケアプロジェクトを完遂して参りました。

経理:ストレススーパーフリーなのに。

社長:あそれで、マスターから仕入れた話なんですが、あの新庄君が現役復帰とかなんとか。

基盤:新庄 現役で検索… 確かにそういう話はあるようですね。

開発:まだ48歳みたいだし、野球という競技ならあり得ない話では無いですね。

社長:明るい話題ですねー。私はネット記事で栗山くんのしょぼくれ様を見かけるたびに気分が暗くなるのです。

基盤:ノムさんも亡くなっちゃいましたしね。

開発:それで、ソースを検索するのに何十万のファイルをNFSでfind grepしてたらとんでもないなとは思うわけです。それに以前から、全文検索ってgrepで良くね?と思ってたところでもあり。ならばいっそ、検索用テキスト兼用のアーカイブフォーマットを作ればどうかと思ったところです。

社長:コンセプトは?

開発:単にgrepできる単一べたファイルです。複数ファイルを単一ファイルにするので、おまけにアーカイブとしての機能も持たせる。しかも単にcatしただけで結合できる。手作業で編集しても壊れない。

基盤:shar とは違うんですか?

開発:shar だと、grep してもヒットした行がどのファイルだかはわからないわけです。

社長:それは以前言っていた、MIMEのマルチパートの話とは違うんですか?

開発:まーーったく違います。あれ?でもないかな?

基盤:さっきから思うんですが、アース渦巻って目に滲みますね…

開発:何にしても、改行コードで終わる「行」というのは、人間の認識と密接不可分にして、一種の可変長レコードとしてもリーズナブルなサイズである傾向があるわけです。

基盤:蚊取り線香は根っこの勾玉状のとこまでくると達成感を感じますね。あれまで全部キレイに燃えるのが技術の粋のような。

社長:時限爆弾甩にも優秀ですね。あれ?甩、用。なんでしょうねこのヒゲの生えた甩って。

開発:子供の頃は、導火線という単語に萌えましたね。

開発:ああ、それで、shar でもいいですよ別に。shellで実行すると分解される、要件はそれだけですよね。

開発:個別ファイル型的には、png のテキスト表現に萌えますけどね。

* * *

基盤:ふぁぁぁああ。よく寝ました。

社長:もうちょっと寝を3回くらいやりましたねw

開発:それで寝ている間に思ったんですが、HTMLをアーカイブファイルとして使うのもあるかなと。

社長:HTML archive だから har 型式ですかね。

基盤:はあw

開発:これは以前検討した、ウェブページの魚拓型式のベースとしても有用だと思うんです。

開発:ただ、バイナリデータを入れるとするとやはり data uri かなと思うんですが、表現できるサイズの制約があります。

社長:メガバイト程度のHTMLデータなら今のブラウザならへっちゃらですけどね。

開発:span かなにか適当なタグにbase64くらいで入れてidつけてdispaly noneにして、JavaScript で取り出すっていうのが妥当な線かも知れません。

基盤:ファイル名だけで探したいことも多いですよね。ただ、特定のファイル型というか、拡張子だけでフィルタしたことも多い。

開発:となると、自分の中に埋め込まれたデータを検索するJavaScriptが必要だということですね。検索結果をテーブル表示したりとか。グラフ表示なんかもできると良いかな。

社長:検索結果の中で検索語にヒットしたところをハイライトして、その前後の文脈を表示するという機能は絶対必要ですね。

基盤:定義・参照関係がわかる文書なら、関数名のような単語がハイパーリンクになっているとうれしいです。

* * *

社長:ああそれで、今週のあたまにやった片付けごとのたまが打ち返されてきてまして、要するにウェブサイトに配布ファイル群を置く場合に、HTTPサーバでディレクトリのインデックスを動的に作るのはまずいということらしいのです。サーバの運用上の問題かも知れません。

基盤:負荷の大きいサーバだと、性能面でも問題でしょうね。

開発:ああ、それなら find -ls の結果を HTML に変換するだけで済みますね。せっかくなので details タグを活用して。で、どのファイルですかね。

社長:月曜にやったこととか、もう完全に忘れてますからね… ああ、Download にあるこの tgz かな?

基盤:というか、Desktop に原型があるようですが。

開発:ああ、これですね。

* * *

社長:ところで、Parallels は結構使えそうなので、あれに Linux を入れてブラウザの開発環境として使ってみてはどうかと思うのですが。

基盤:お試し版がまだ生きてるはず… ああ、Ubuntu 18.04 がありますね。じゃこれをインストール。

基盤:ぐわー。なんですかこのお手軽高速インストール。ライトセールもびっくりしかもデスクトップ版。

開発:1分でダウンロード・インストールですね。確かに55MB/s 出てましたから、数GB程度のファイルなら出来る計算です。

基盤:なにかマウントされてるなと思ったら、ホストのiMacにマウントされてるドライブがデフォで見えるようになってるわけですね。デスクトップ画面が自在にリサイズするし。

社長:昔はVMwareでそうして使ってましたけどね。あと、ウィンドウ毎にホストの中に表示する、ユニなんとかいう機能とか。

基盤:うーん、このiMacにはSSDを2TB付けましたし、このまんまで Chromiumビルドできそうです。やっておきますか。Linux用のインストールの手引を再び開き…

基盤:その前にVMの接続をブリッジにして… sshログインできるようにして… 自分をsudoerに追加して… git を apt install して… では始めます。git で chromiumをクローン。速度の変動が大きいですが13MB/s程度ですね。

開発:一昨日のMac版では10分で終わった所、昨日のLinux版ではダウンロード後のdeltaの処理で2時間かかってしまった難所ですね。

社長:一昨日はLenovoがブーブー、昨日はQちゃんがゴロゴロいってましたが、今日のiMacは全く音なしですね。

基盤:やはりclone自体は20分ですね。さて、これからデルタ地帯がどうなりますか。

基盤:これは昨日と同じ、2時間半コースのペースですね。

開発:うーん、git もちびっとしかCPUを食ってないし、VMホスト直結のSSDを使っているので、ファイルアクセスもネックになってないと思うんですけどね… ひょっとしてネットワークアクセス?

基盤:このガラ空き状態で時間がかかるって、ネットのレイテンシーかなって気はしますけどね。

開発:strace してみますか… 働いているのはさきっぽのプロセスだけですね。でこいつは何をやっているのかな…

基盤:おおっと意外。IOしてないみたいですね

開発:いや、でも端末へ1秒おきに進捗報告出しているんで、これのwriteがトレースに出てこないというのも不思議です。

19275 pts/3    S+     0:00      \_ git clone https://github.com/otcshare/chromium-src.git
19276 pts/3    S+     0:54          \_ /usr/lib/git-core/git-remote-https origin https://github.com/otcshare/chromium-src.git
19287 pts/3    S+     0:22              \_ /usr/lib/git-core/git fetch-pack --stateless-rpc --stdin --lock-pack --thin --check-self-contained-and-connected --cloning https://github.com/otcshare/chromium-src.git/
19511 pts/3    Sl+   10:58                  \_ /usr/lib/git-core/git index-pack --stdin -v --fix-thin --keep=fetch-pack 19287 on parallels-Parallels-Virtual-Platform --check-self-contained-and-connected --pack_header=2,12999042

基盤: git index-pack slow で検索… Git はファイル数が多くなるとすごく遅いようですね。チェックサムに時間がかかっているとか?

開発:いや、こっちはある時点のものをどんと持って来たいだけなんですけどね。20GB程度の。これ、kill しちゃって続けたら不味いですかね?まだ10%しか進んでない…

社長:kill。

開発:では ^C。そして再び git clone… ゼロからダウンロード始まりましたw

社長:最新版のでなくて構わないんで、tarball になってるやつありますかね。

基盤:ありました。

基盤:ダウンロードします。

基盤:なんか勝手にdecompressはじめました。それがデフォの設定のようですね。1.3GB程度の模様。

開発:圧縮の効くソースだと1/10以下になりますからね。

基盤:では、unzip。

基盤:6分でした。

開発:git でやると3時間。zipでやると10分てことですね。

社長:巨大なZIPって、一連で圧縮してもそんなに圧縮率も変わらないでしょうし、100MBくらいずつで分割圧縮・並列解凍できると良いのにね。

基盤:このへんのディスクI/Oは、仮想ディスクにしたらもっと速いでしょうね。

基盤:やっぱり、直属の仮想ディスクでやりましょう。最近のLinuxでは超簡単なのはわかっています。parted で拡大して resize2fs で使用。

基盤:まず、外部のドライブを使った場合。

開発:CPUは40%程度、ほぼシステム時間。ユーザ時間は3〜5%程度ですね。

基盤:次に、内蔵の仮想ディスクでやった場合。

基盤:約10倍速と出ました。

開発:うーん、git clone が何時間もかかったのはこのせいですかね…

基盤:あ、あと今気がついたんですが、RAMの割当が1GBなので8GBにします。CPUもデフォが2なのを5に。

開発:これが例の買い切りとサブスクリプションの分水嶺なわけですね。

基盤:ということで、git clone に濡れ衣を着せてしまった感がありますので、正規の手順で再びやります。

社長:しかし、git って、うちみたいにちょっといじってみようかという人の敷居をすごく高くしてますよね。

開発:まああとはただ、たぶん3時間くらい待つだけですか。

経理:アース渦巻第3巻点火しました。

* * *

開発:それで shell に戻るんですが、printf があって scanf が無いのは片手落ちだと思うわけです。たとえば ls の結果を分解したい。

開発:それなら scanf “%s %d %s %s %d %t %s” M L U G Z T F とかで分解して、printf “%t %10d %s %s” $T $Z $F `md5 $F` なんてできると便利です。

基盤:ここで残念なお知らせです。作業用のディスクをローカルにうつしても git clone は早くはなりませんでした。ちゃんちゃん。ただ、進捗10%くらいまではCPUは数%で推移していたのですが、それ以降ガツンとCPUを使うことが多くなりました。

開発:何もファイルを作ったり書いたりしている形跡も無いし、ひたすらこの15GBの tmp_pack というのをなめてるんですかね?

基盤:tcpdumpしても、何か通信している気配がないです。

開発:スワップしまくってるようにも見えないですしねえ…

社長:ああそれで、shellのscanfコマンドですが、結果を変数というか、ファイルにも受け取れると良いですね。

開発:一般化すると、shellの変数は実は全てメモリマップされたファイルである、というのでも良いかなと思います。

社長:ソケットであっても良いかもですね。

開発:子孫のプロセスから返すデータも、メモリマップされたファイルで受け取れると良いですね。

社長:そのあたり、C言語とかのレベルで、このポインタの先はファイルにあるよというのをサポートしてくれると便利かも知れない。ある種のストレージクラスというか。external で permanent とか sync とか source とか。

基盤:git clone、イキナリ本気モードです。

開発:あたしだってやるときゃやるよみたいな。

基盤:また静かになりました。

開発:しかしこれ、ビルドの様子次第では、Parallels Desktop Pro の線もありですね。少なくとも Acrobat より利用価値が高い。

開発:いやーしかし、この zsh のコーディングスタイルは好きだなー。カッコの前後の空白を別にすれば、ひょっとして自分で書いたのかなーってくらい違和感がありません。

社長:make に awk 使っちゃってたりする所もまた (^-^)

基盤:おっと、git clone 終了しました。所用98分。

社長:それはそうと、ls こそ shell の組み込みコマンドであるべきかなと思うんですが。というか、ファイルのメタ情報をフォーマットして出力する機能が。基盤:それは ls というより stat コマンドみたいですね。

開発:え、このコマンドいつからあったんですかね。man stat、HISTORY … The stat utility appeared in NetBSD 1.6 and FreeBSD 4.10. … BSD May 8, 2003 BSD。へー。

開発:ls の出力を分解して使用するという利用例は、意味がなくなりましたw。こういう感じですかね…

開発:便利ですね。

* * *

開発:ディレクトリのインデックスHTML生成ツールの原型はできたのですが、Macの上で出来たんで Ubuntu に持ってったら動かないんです。stat というコマンド名なんですが、全然仕様も由来も違うんですね。Macのほうが正統なBSD流。Ubuntuのはおもちゃみたいの。

社長:やはり shell の組み込みにしちゃって、その shell だけ持ち歩けばどこでもOKっていうのが良いかもですね。

開発:出力の整数を引き算する必要があったのですが、これも  shell でできないから、久しぶりに dc なんて使っちゃいました。

社長:ポーランド記法!

開発:これもまた、shell に組み込みだったら良いのにと思いましたね。

社長:ツールを作る人は、それが最終の製品だと思って作ることが多いからUIとかファイルI/Oとかも含めて内部依存的にできちゃってて、さらにそれをライブラリとして使う時に難儀しますね。

開発:なので、そのあたりを切り出して、動的ライブラリ化するというのも面白いのでは無いかと思うんです。おそらくライセンス上も問題無い。MozillaやChromeだって、ライブラリにして簡単に使えたら、面白い応用があると思うんです。

社長:ツール・アプリとライブラリの境目は面白いですね。密接に結合するより Unix のパイプでつなぐ式から始まったデータだけで結合したほうが組み合わせてきには面白い。けれど性能的にはデメリットはある。標準化もされにくい。

開発:ライブラリのAPIとか通信プロトコルだと仕様がかっちり決められて互換性が維持されますけど、コマンドの出力データって人間が読めればいいやというか人間の読みやすさに合わせて設計されているから、標準化されにくいですね。

社長:そのあたりもひっくるめて、何をどうすると幸せかを考えていきましょう。

開発:書きなぐりですが、今日書いた部分をアーカイブして置きます。

dir2html.sh

* * *

基盤:結局ParallelsでのChromeのビルドは所要2時間56分(176分)でした。

基盤:同じ版のautoninja がHyper/VのLinuxで3時間40分(220分)でしたが、あれはディスクをQNAPにNFSマウントしていたことによる影響が大きいと思われます。

開発:コンパラブルな性能ということですかね。使い勝手的には、Windows 10 の上のHyper/V のLinux VMをMacからリモートデスクトップで覗くより、Mac自身の上のParallelsでLinux VMで直接いじれたほうが便利ですが。

基盤:実用という意味では、Linux VMの仮想デスクトップをMacの上で直接表示すれば、あまり使い勝手に違いが無いとは思いますけどね。ただ、LinuxのVNCサーバがちゃんと使えるのかということろに課題が。

開発:まああれも、ちゃんとRealVNCにお金を払えばよいのでしょうけどね。

経理:RealVNCは4月に検討しましたね。$4.59/月@1サーバ。1LSUです。

基盤:リーズナブルっちゃリーズナブルですかね。

社長:経費的には問題ないと思いますが、そもそも X Window のほうが良くね?と思うのですが、どうなんでしょう?

開発:本当に更新が必要な情報だけを転送しているわけですしね。情報の作り手が使い手にダイレクトに情報を送る。中間で推測し直したりしない。

基盤:Chromiumって X Window 対応してるんですかね?

— 2020-0731 SatoxITS

ブラウザユニオン

経理:今日は .jp が500円だとxsoからSPAMが来てました。

基盤:.jp は通常2800て表示してますから、これはマジでお得ですよね。

社長:うーん、何か思いついたら買いましょう。でも、.jp で取りたいという動機はあまりないんですよね。うちの社名関係はもう長期に押さえてあるし。

経理:一度 .inc の500円セールしたら xso の株も上がるのにね。

開発:一日で .inc 登録ドメイン数を1万件突破!とか。これは全世界に誇って良いでしょう。

基盤:xso株が暴落して経営破綻じゃね?

* * *

開発:さて、昨日は Chromium がデバッガにうんとも反応しなくて困ったわけですが、結局こういうことでした。

開発:それで、バックトレースに出てくる経路の各所にprintfをはさんで動作を観察したわけです。

開発:バックトレースを見ると、根っこからしばらくは環境設定の層で、途中でブラウザの層、その先にAppKitとかが挟まった先にさきっぽのカーネルに達しています。根っこのほうの層では設定をしてはその先のRunメソッドを呼ぶだけなので、そこに介入しやすい中心ループ的なものがありません。

開発:Firefox ではイベントをpollしては処理するし、実装上pollがラッパーになっているので簡単にフックできました。ですがMac版Chromiumでは mach_msgというシステムコールで待っている模様。これはタイムアウト付きのrecvみたいなもののようで、poll 的な処理と分離ができない。なので、一番さきっぽの所で捕まえるのはちょっと難儀です。まあ、自分でmach_msg にラップしちゃうという手もあるかも知れませんが。

開発:ですがまじめに取り組むとすると、一番下の層に手を突っ込むのは暴力的過ぎるとは思います。Firefox でもですが、普通に外部からのコマンドを受け付けるスレッドを作ってそれをプロセスに入れ込むのが、まっとうな解法なんだろうとは思いますね。そうなると、宿主のプログラムの構造を理解する必要がありますが、特に Chromiumの場合、コードが意味不明な C++ 的呪文で刻まれていて、ちょっとツール無しで追う気になれないという状況です。

社長:まあ、設計のドキュメントを読むという路線もあるかもですけどね。

開発:ただ、こういうエンドユーザに対峙する最前線に居るプログラムが、今日もC++で書かれていて、Cのプログラムを普通に突っ込めるという点には、ちょっと感動的なものがありますね。

開発:なんにしても、Chromiumの作りはとっつきにくいし、MacOSXのガードも固いので手をツッコミにくい感じはします。なので、Mac版のFirefoxか、Linux版のChromiumでやれたらなと思います。

基盤:Chromiumのビルドにはストレージが120GB必要ですから、現行の仮想マシンのように仮想ディスクに置くのは大変ですね。外部にディスクを置かないと。いずれやる必要があるとは思ってましたので、この際にやってみましょうか。

社長:それはそうと、でんこちゃんの家計簿が早く開通しないかとわくわくしています。

社長:それとこのスクリーンセーバー。初代液晶iMacのも印象的でしたが、時代はここまで来たか感があります。電気の無駄とは思いつつ。

開発:iTunesの、音楽を画像化するやつも面白かったですね。

基盤:iTunesって死んじゃったんですかね?

* * *

基盤:ひーはー。いつの頃からか、どうも レノボ君がサンバでマウントさせてくれないと思ったら、こういうことになってました。

開発:ちょっとリストラし過ぎたようですねw

社長:太古の脳の中のブレーカーが落ちていたみたな。

開発:Windowsデビューの時代から一度も全体的な整理統合がされてないんでしょうね。

基盤:色々ひっかかりましたが、Linux用の、というか何からでもNFSでアクセスできるストレージ1TBを用意しました。

開発:それではさっそく。

基盤:手引はGitHubにあるこれですかね?

基盤:では言われるがままに… おっと、そもそも git がまだ無かった。sudo apt install git。なにやら準備した後に、chromium のソースを git clone…

開発:これって昨日Macで10分くらいで終わったやつですかね。

基盤:13GBのかたまりを13MiB/sくらいで落としてますから、20分くらいかかるかもですね。

社長:結局ストレージはQちゃんにしたんですね。

基盤:最初Hyper/Vのホスト直結のHDDをSMBでやろうとしたのですが、しょうもないところで引っかかりました。で、1時間かけてようやくつながったと思ったらやたらファイルの作成が遅い。ならQNAPのNFSにしようとしたら、今度はボリュームの作り方とかNFSの設定の仕方をすっかり忘れてしまっていまして。思い出すと言うより探検し直すのに小一時間。

開発:Qちゃんのドライブがコロコロ言うのが面白いですね。懐かしい響き。

社長:HDDのコロコロ音は悪くないですよね。

基盤:もう少しで終了… 終了。?と思ったらすごいゴロゴロし始めましたね。

開発:Resolving deltas ってあるから、ファイルをなめて差分チェックとかするんでしょうか。これは苦手分野。

基盤:うーん、全体で1000万あるのに、秒1000程度な感じなので、3時間くらいかかりそうです。これは… サムスン512GB SSDが半分空いているので、こっちでやり直しますかね?今ようやく10%。

社長:これはこれで面白そうなので様子を見ましょう。食事に行ってきます。

* * *

社長:帰りましたはー

経理:酒臭いですね。

社長:うーん、中瓶の店だとつい2本飲んじゃうんですよね。よし悪し。ていうか、Qちゃんがおとなしくなってますね。

基盤:結局2時間弱で終わりました。

社長:飲みながら思ったんですが、結局仮想ディスクにするべきじゃないかなと。

基盤:そうですね。今の所20GBしかないので、オンメモリで数分で済んだ話かなと。

社長:それはともかく、Qちゃんの自動ログアウトの時間を長くしましょう。デフォルトでは1時間?。6時間にしましょう。そういう刻みは無い?では一日で。

社長:このダッシュボードせっかくよく出来てるのに、なんでディスクアクセス状況のメータとかグラフが無いんですかね?単独での表示にできないのも不思議です。

基盤:それはともかく、ビルドの手引に従って先に進めます。特に必要もないのにエディタにvimを使ってると書いてるのが面白いですね。依存性のチェック… aptでかなりいろんなパッケージをインストールしております。

開発:いまだに Chromiumの世界では Ubuntu 14.04 がふつーってすごすぎないですか?

社長

社長:まあ、うまく行ってたものをいじって壊したくないでしょうからね。これだけ複雑なソフトだと。

基盤:それより、RAMは16GB以上を強く推奨、ディスクは100GB食うからねってちゃんと書いてあるのが良いですね。

基盤:ツール類のアップデートは2分47秒で終わりました。では、ビルド… じゃなくてまだまだ準備があるんですね。5. Update your checkout and run the hooks… これってまさか、さっきのノリで2時間かかるとか…

社長:時間がかかるようならその間に他の方法も試しましょう。

基盤:では、gclient sync … ああ、これは数分で終わりそうな気配。

基盤:14分7秒でした。gclient runhooks。26秒。ビルドの設定。さて、ようやく autoninja の出番です。autoninja -C out/Default chrome unstable_deb…

開発:ディスクはちょっところころ言う程度ですね。

基盤:順調に進んでます。

開発:今気づいたんですが、右肩に現在時刻を表示してくれるのは macOSのtopのサービスだったんですね。一方この、ターミナルはやる事が無いもんだから妙な情報をウィンドウのバーに表示している… ここに時刻でも出せばよいのに。

社長:これがまた、その場で右クリックで設定もできないという悲しいmacOSの佐賀。あー、コンテクストメニューには一応あるんですね。なんでインスペクトという名前なのかわかりませんが。

開発:全てのアプリのウィンドウが「これと同じサイズの同じコンテンツのクローンを作る」ていうコンテクストメニューを持つべきですよね。Catalina にはぜひ、そういうサポートをして頂きたい。

基盤:バーへの表示文字列はエスケープシーケンスで指定できたりするかもですね。あるいは、出向元のzshと連絡を取って現状を報告してはバーに反映させるとか。

開発:要するに現在実行しているプロセスの引数を表示しているだけみたいですから、shell で自分の引数を変えるようにすればそうなりますね。

社長:昔はpstitleをいじるというのをよくやりましたね。例えば DeleGate ではこんな感じ。

基盤:つまり shell が pstitle というコマンドを持ってれば良いと…

開発:そういえば zsh はソースからビルドしましたから… find zsh -type f -exec grep -i pstitle ‘{}’ ‘;’ … ないですね。bash にはあるのかな。

基盤:あ、ただいま中間折り返し地点を通過。

基盤:時間的な中間点じゃないですけど。

開発:Mac版のビルドと同じようなペースですね。

社長:shell の pstitle を使うとすると、時刻を表示するには、shell 自体に cron的な機能が必要ですね。

開発:shell の外付けにしてシグナルで起動するとかもありですかね。というか、タイムスリッパ式に動的ライブラリを差し替えれば行けそうな。しかもまさに、gettimeofday で。

社長:となると、shell に限らないですね。なんでもOK。ちょっと休憩しましょう。

経理:アース渦巻第2巻に着火しました。ところでお待ちかねのでんこちゃんはなお1週間かかるそうです。

社長:マチカネタンホイザー…/(‘^’)

* * *

基盤:それはそうと、MacMini からの引っ越しが済まない間に、Vivaldiが大変なことになっちゃってて、時々応答がなくなります。

社長:いやわたしは、ブックマークとかせこいこと言ってないで、一度開いたら一生そのまま開いてれば良いと思うんですよ。ああ、これは3ヶ月前に開いたページだなとか。こういう順序で情報を探索して理解したなとか。克明に思い出せるのです。

社長:なんなら、過去に開いた順序どおりに再生して開き直してくれるとありがたいです。まあ、消えちゃう情報も多いですから、全ページ魚拓としても保存してくれると良い。

社長:だいたい、現在タブの一番表にあるやつだけじゃなくて、その下積みになってるやつだって一覧したいわけです。スマホのブラウザの履歴みたいにぱらぱらめくれるとよいですね。

開発:それで、システム全体がぱんぱんになっているかというとそんなでもなくて、Vivaldiだけふんづまり気味なわけです。このへんは、アプリの中での状態が複雑になって管理が重くなってるとか、

基盤:これってなんですかね?

開発:2016年のLightsail発表の時のプレゼン資料ですね… 切ってみましょう… うーん、気持ち、軽くなったような…

社長:まあ Opera のウィンドウはそれ以前からの塩漬け状態だし、Chromeも結構溜まってるので、最近ではSafariを起動することも多くなったのですが。Safariはやはり、印刷機能がイケてますね。サクッと来るしプレビューも良いし、画質が良い。

基盤:Previewってすごいですよね。あれでPDFのデジタル署名機能があったら、AcrobatなんてMove to Trashですよ。

経理:月額1,700円相当で年間契約済みなんですが。

* * *

基盤:3万ファイル通過しました。

基盤:通信がぴょこんと立っているのはさっきsshでログインしたからです。

社長:それにしてもこのQNAP、2万円でこれってすごすぎますね。

開発:ふつうにLinuxですしね。

開発:Cortex-A72積んで Linux機として3万円位で売り出したら衝撃じゃないですかね?

社長:これってWordPress動くんですかね?

基盤:できるようです。というか正式サポートしているようです。

社長:うーん… 内部・開発系と、外部公開系は分けたいから、もう一台買いましょうか…

開発:あと1時間くらいかかりますかね。ちょっくら zsh に pstitle コマンドを入れてみますか。内蔵コマンドはどこかな?

開発:vi Src/builtin.c … へー、printf コマンド内蔵なんですね。じゃお隣におじゃましますよっと。引数をargv[0]にstrcpy()。これだけで良いかな?makeして。えいっ。

基盤:おお!

社長:なんというか、古き良き時代が戻ってきた気分ですねぇ…

開発:ちょっとした改変をするのにシェルなら5分。ブラウザは3日掛かり…

基盤:しかし、ターミナルがこれを見に来てくれるのに、1秒はかからないですが、0.5秒くらいかかるような感じですね。

社長:シェルとブラウザをどう組み合わせるかですね。実装上。それとスクリプト言語として。

開発:shellから見ると、ブラウザの内部状態がファイルシステムとして見えるというのが自然かなとは思いますね。で、特殊ファイルに書き込むとdocumentとして表示されたり、ウィンドウを開いたりする感じ。

基盤:JavaScriptのインタプリタとしても使えますね。電卓とかw

社長:こっち側はシンプルに実装できるのにねえ…

開発:あと、やはり bash も検討はしておいたほうが良いかなとは思います。

基盤:Go言語はどうするんでしょう?

開発:shellに動的リンクしちゃうと良いかも。

社長:すごいリッチなshellになりそうですね (^-^)。名前は ezsh なんてのがいいな。extended zsh、イージーシェル。

* * *

基盤:おっと、40000を超えました。もうそろそろ着陸態勢に。

基盤:すごい勢いで進行しております… 大詰めのリンカーのフェイズに来ました。

開発:Qちゃんがゴロゴロ言ってますね。

基盤:そして終了。

基盤:3時間40分の長旅でした。

開発:てかもう9時じゃないですか。

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

* * *

社長:いっぷくしてて思いついたんですが、mozilla と zsh をくっつけて mozsh とかどうですかね。xso で mozsh.jp を検索… ほら、無いから今日なら500円ですよ。

経理:まあ xso はしょっちゅう500円セールしてますけどね。

基盤:まあ、せっかく出来たので起動してみましょうよ…

一同:起動速っ!

開発:驚速ですね。

基盤:コンマ何秒か。

社長:目が覚めました。

基盤:夢じゃないでしょうね。もう一度起動…

開発:これは使える。まったく使える。ふつうに使える。

社長:というか、macOS版がなんであんなに遅いのかよ、って事ですね。

開発:それではお約束のいたずらを。vi comp*/vers*p … で autoninja -C … うーん、やっぱりここをいじると再ビルドに10分くらいはかかりますね。

社長:うーん、我社はこれからは自家製 Chrome と自家製 zsh で生活ですかね。

開発:できました。では起動。About Chromium …

基盤:ぱちぱちぱち。

開発:「そのしゅん間、私は変わった」「私の心を大きく変化させた」「明るい未来が見えた気がした」ー Rika Kihira(2014

基盤:しかし、ビルドの手引にはストレージ100GB用意しろとあるんですが、最終的にも34GBで終わってるんですよね。全体通してRAMだけでできちゃうサイズです。

社長:なんにしても、Firefox と Chromium の開発環境が揃ったし、気分はバラ色の濡れ落ち葉ですね。飲みに行きますか。

— 2020-0730 SatoxITS

ブラウザシェル

社長:さあ2日目、始めましょうか。

基盤:その前に。せっかくなので Chromium でもやってみたら良いと思います。以前MacMiniでは、ストレージ不足でのやり直しもあって、ビルドに1日単位を要しましたが、iMacでやったらどうなるか見たいというのもあります。

社長:そうですね。

MyChromiumビルド

基盤:それで早速、以前のブログにしたがってやろうと思ったのですが、いきなりXcodeが無いと。で検索したら、Xcode 12 Betaはいかがですかと来ています。Chromiumの要件は11.2以上ということではあるのですが…

開発:どうもUI系の改良版みたいですね。とりあえず11にしましょうよ。11.6がJul 15, 2020 に出てますし。

基盤:了解。では Mac App Store よりダウンロード… え?何かiMac方面から怪音が… どうも全コア全開動作するとファンが唸り出すようです…

社長:大ショック… この人はモニタと一体型だから、分離して身体だけ左遷できないんですよね…

一同:(落胆)

基盤:まあもう少し様子をみましょう。Xcodeがインストールされました。10分以上かかりましたかね。

基盤:で depot_tools を git clone。一瞬でした。

基盤:でもって fetch chromium… しまった、これ –no-history をつけないと大変なんですかね。やり直し。30分くらいかかるよと言われてます。前回もそうだったような。おっと、ダウンロード74.7MB/s、かつて見たことのないスピードです(当社比)

開発:ああまた、iMacのファン音が大変なことに…

基盤:台所のファンとか咳き込みおばさんに比べれば音の質は辛くは無いですけどね。おっと、騒音の甲斐あってか、10分で終了しました。

基盤:ではオススメどおりにargs.gnを書いて。 autoninja 起動。おそらく数時間はかかるでしょうね…

開発:これから数時間もこのスコール状態が続くんですかね?

社長:岩に染み入る蝉の声的な。

基盤:それにしても、フル活動ですね。

基盤:CPUは全開。

基盤:メモリは楽勝。

基盤:ディスクI/Oもスカスカ。

基盤:もう45000のうちの16000行きました。このペースで行けば、2時間かからないですね。Firefoxのビルドと同程度かも知れません。

開発:以前やった時は、途中からすごく遅くなったような。あれはMacMiniのビルド環境のせいだったんですかね?

基盤:半分を通過しました。ここまで所要40分。

社長:食事しているうちに終わるかもですね。タバコも切れたし、メシに行きましょう。

社長:ところでこのシケモク、根っこの部分がコーヒーをかぶって湿ってるんですが、もしやそのせいか、シケモク臭さが感じられません。

開発:ITS more社が提案する新しいスモーキングスタイル。

* * *

社長:ただいま帰ったぞなもし。あれ?静かですね。iMacのモニタ真っ暗だし。ビルド終わりましたかね。

基盤:まだまだですね。1時間で1万ファイル進行。後半に入って1秒に1〜2ファイルというのが前回MacMiniと同じようです。あと1万2千ですから、1時半頃には上がるかと。

開発:でも、このくらいのファン音ならacceptableですね。空港のロビー以下的なw

社長:なんでさっきはしゃかりきに回ってたんですかね。冷却効果を学習してなくて過剰防衛?

基盤:ひょっとしたらバックライトのせいかもですね。思い切り暗くしましょう。どうせ画面共有で見てるから関係ないし。

社長:それで、当社の住環境完全の一環としてこれを購入して来ました。アース渦巻〜!

開発:日本の夏。アロマティック。

基盤:金鳥じゃないんですね。

社長:金鳥のは高かったのです。

経理:なんでこう線香の匂いなんですかね。いろんな香りの蚊取り線香を作れば良いと思うのに。

* * *

基盤:ふぁぁぁあ。あ。

開発:蚊取り線香を感じながらお昼寝から目覚める。日本の夏休みですねえ。

経理:うちって夏休みあるんですかね。

社長:休みたい人は休みたいだけとって下さい。

基盤:さて、iMacも淡々とビルドを消化、残り5000/45000となりました。

開発:ビルド始めてから一度もスワップイン・アウトしてないですね。

基盤:純正でバカ高でしたけど、8GBプラスしておいたのは正解だったと思います。

社長:7月12日の流血事故から17日、かさぶたが完全に取れました。一度もうんだりせず、極めて良好な経過でした。

経理:クルマやさんから電話で、代車が用意できたので車検に出しに来て下さいと。

社長:昔はなんとも思わなかったですが、車検代って高いですね。というか車の維持費。最近では週に2回くらいしか乗らないのに。

経理:もろもろ込みで、月1.5万円くらいかかりますよね。

社長:まあタクシーよりは安いかなというくらいな。

開発:濡れ落ち葉マークは70歳からだそうで。まだだいぶ先ですね。

基盤:あれ、70歳前につけたらいけないんですかね。なかなかの脅し効果があると思うんですが。

基盤:あ、コンパイル終了。着陸姿勢に入りました。

社長:ファンが止まりましたね。

開発:ライブラリのビルドって並列化しないんですかね?

基盤:できそうですけどね。あんまりかからないから気にしないのかな?

基盤:動的ライブラリに入りました。最終段ですね。

基盤:完了。Chromeビルド、所用3時間36分でした。ただ実はこれ、省エネルギーモードで、ディスプレイがオフになるとコンピュータもスリープするという設定になっていたので、食事に行っている間は寝てたのかも知れません。

開発:やらせといてる仕事があるのに、ユーザが目を離したら寝てしまうかも知れないって、よくわからない設定機能ですよね。

基盤:以前ならスリープ機能とか速攻で無効にしてたところですが、最近省エネに目覚めてしまいまして。

経理:そういえば、でんこちゃんの家計簿、パスワードリセットしてログインできました。

開発:2014/06/29 が最終ログイン…

社長:で、ここでもう一発ビルド開始するとどうなりますかね?

基盤:変更なしを認識するのに12.8秒ですね。

基盤:最終的なファイル数 69万9千、119GBとなりました。

社長:コンパイル中は全コア使い切りでCPUで律速のようですから、もっとコアの数に反比例した所要時間になりそうですね。

開発:まあ、ゼロからクリーンにビルドすることはあまり無いでしょうけどね。

基盤:全部のコードが参照しているヘッダとか変えたら、そういう事態になるんでしょうね…

* * *

基盤:では起動します。

開発:一回目って時間がかかるんですよね。

基盤:一分かかりましたね。では一旦終了、2回め。

基盤:4秒弱ですね。

開発:これなら使い物になるかな。

開発:どうして日付を明らかにしないんでしょうね…

基盤:それにしても、例えばこのページの印刷プレビュー状態にするのに15秒かかります。他のブラウザなら数秒以内なんですが…

社長:ともかく、準備完了ですね。一休みしましょう。

* * *

基盤:ところでこないだiMacを進水した時に試しにParallels Desktopを入れてみたのですが、なかなか使えそうに思いました。いくらなら買いですか?

開発:そう… 買い切りなら2万円、サブスクリプションなら月600円くらいですかね。

基盤:parallels desktop 価格で検索… アマゾンで¥7,918です。

開発:買いましょう。

社長:うちはWindows Home実機が無いので、試験用にVMで動かすのも良いかもですね。

基盤:ただし買い切り版(Standard Edition)は仮想RAM8GB、仮想CPU4という制約があります。上のグレードですと、1万円/年。

開発:やや高めですが、常識的な価格設定ですね。

基盤:実は、以前購入したICカードリーダ、ドライバがWindows版しか無いのです。あれが使えるようなら、確定したいと思います。

MyChromium改変

開発:さてさて、ちょっといじってみましょう。まずは、about から。

開発:なのでこれをちょっといじってビルドして起動。

基盤:OK。

社長:HTTPのUser-Agentに目印を入れたいですね。

開発:さて、どこに定義されているのでしょうね。流石に120GBの中からバカ検索するのは時間がかかります… うーん、grep て60MB/sくらいしか出なそうですね。これだと20分以上かかってしまいます。fgrep でやり直し… あまり変わらない… せめてファイル名の拡張子で当たりがつくと良いのですが…

開発:ついでに昨日のpoll()にフックをかける作戦なので poll も検索します。並列に検索するのにSSDだとありがたいですね。…

基盤:それもデバッガで止めて見たほうが早いのでは。

開発:あ… そういえば、MacOSX版 dbx の lldb というのがありましたね。ps | grep chromium …

開発:どれだろう?これあたりかな。sudo lldb -p … ^C … なんか応答が無いですね。単に遅いのかな。その点デバッグモードでもさくさくのARM の CoreSightはよく出来てました。lldb から直接起動してみましょう… runして。このへんで ^C。

開発:ContentMainRunnerってのがFirefoxのと似てますね。cont して。あ、ウィンドウが開いた。^Cしてbt。うーん、… bt が帰ってこない。

開発:あれ?lldbの出力に content_main_runner_imple.ccってありますね。content/app/content_main_runner_impl.ccのことのようです。ふーん…

社長:ちょっと休憩しましょう。クルマ屋さんに車検に出してきます。

* * *

社長:代車はGolfでございました。昔同じ型のに乗ってたことがあるのですが、あれとまったく同じ匂いがするのが面白いです。

開発:その間に find grepが暴走して、こんな面白いものが出来ていました。

開発:新品のSSDの寿命が縮んでしまいました。

社長:1.75TBの検索結果ってのはすごいですね(笑)

開発:要は検索の出力を検索し続けたということかと思います。120GBの検索とは言え、あまりに時間がかかるとは思いました。