ブラウザの色好み

社長:ただいま帰りました。

経理:酒臭いですね。

社長:今日は12LSUを投じて我社枢軸の精神衛生および創造性に多大の寄与をもたらす、… というか、部屋がやけに暗いというか。

経理:照明を絞ってみました。測るのが難しいのですが、数ワット削れている可能性があります。

開発:蛍の光窓の雪のような。

基盤:ホタルの発光は有機ELの元祖なんでしょうけど、普通窓の雪は発光しないですよね。ヤバいものが混じってなければ。

社長:君はチェレンコフの光を見たことがあるか。

開発:融解の熱が何らかの作用で光に転じているとか。

社長:常温核融合もびっくりですが。新しい触媒?まあ生体なら有り得るんでしょうね。雪の結晶の形をした微生物だったとか。

基盤:スクリーンセーバを合成で作るなら、ホタルが飛び交ってるような風景を作って欲しいですね。

開発:線香花火とか。

社長:おばけ屋敷とか。

経理:三流紙に書かれそうですね。社内はまるでお化け屋敷のようだった(捜査員談)

広報:メディアを呼んで何かプレス発表してみたいです。

社長:うーむ、ブラックライトは清涼感を醸すのに良いかも知れないですね。

社長:ああそれで飲んでる時に、前々から気になっているFirefoxの色使いについて、考えたのですが。

社長:あれっていわゆるRGBモデルじゃなくて、アドビモデルとかいうやつなんじゃないだろうかと。

基盤:PDF臭いですね。セピアっぽい。

開発:モニタで見るようには出来てない?

社長:主要5+1ブラウザを並べてみます。

社長:まあ、ひと目見て右下がFirefoxだとわかるわけです。色で。

基盤:うーん、その他も、どれが何のブラウザかわかるようになりましたw

開発:というか、ブラウザごとにアイコンはあるんで、それを右下あたりに主張してもいいんじゃないですかね。ユーザの設定でもいいですけど。

社長:画像の圧縮のアルゴリズムというかポリシーはCSSとかでも既定されていると思うんですが、たぶん細部は実装依存。で、Firefox以外はOSが提供しているライブラリか、Chromiumの共通ライブラリを使ってるんじゃないだろうかと思うわけです。

開発:なんにしても印刷用のヘッダのバナーは、ブラウザの生成に任せるのではなくて、明示的に提供してあげたほうがよいでしょうね。著作者もびっくりな色で印刷されたら、権利問題じゃないかと。

社長:PDF といっても、画面で見る時と印刷する場合がありますから、用途を選択できると良いと思います。

基盤:自動変換できるんじゃないでしょうか?

社長:それはそうと、今日は帰社して快適だなと思ったら、私の体調のせいではなくて室温が29度を切っていますね。

経理:ずっと窓を締め切ってエアコンをつけっぱなしにしていると気が付かないですよね。

開発:今日は洗濯日和とか気象予報士が言ってますけど、今日はこういう風向きだから、窓を開けて自然の風を楽しむ日和ですみたいな事を言ってほしいですね。言ってるのかも知れないけど。

社長:花粉予報はみっちりやってますよね。

基盤:まあ民放とかでは公共の電波でくだらない星占いとか流してますけどねw

社長:私もいい年まで血液型性格判断を受け入れてた口だし(笑)。民放はエンタメなんだからいいんじゃないですか。スポーツの中継しか見ないけど。

-- 2020-0807 SatoxITS

祝30000カウント

基盤:早めに祝賀会場を設営しました。

開発:何をカウントしてるんだかわからないんですけどねw

社長:ああそれで、記念写真に限らないですが、情報にはかならずその発生日付が必要だと思うんです。

開発:前回の20000の時には間に合いませんでしたが、今日はできそうです。ネームサーバ移転の時に書いたPHPの関数をショートコードで参照すればよいかと。

開発:ああ、reqTimeというショートコードを作ってますね。ではこれをそのまま使用します。ブロックの中でならこう。

1716017939

社長:おっと、ナマのunixtimeなんですね。

開発:とりあえず。というか、ヒト可読性が低いほうが良いこともあるかと。で、これをサードバーに入れるには… あれ? とうか、このカウンターをブロックで埋め込むショートコードはわかっているのです。表示オプションとか全部デフォルトで良いなら単に、[ ] の中に ads-wpsitecount と書けば良い。するとこうなる。

基盤:おそろしげなデフォルト表示ですね。

開発:それで今気づいたのですが、普通に段落ブロックの中にそう書いても埋め込まれるんですね。こんなふうに( 547008

基盤:ならなんでショートコードという特別なブロックが通常の段落ブロックとは別にあるんでしょうかね?

開発:さて、それではこれをサイドバーに入れるにはどうしたら良いのか。サイドバーに通常のブロックが入れられるのか… ダメ元で拡張HTMLに入れると、まんま出てきてしまいます。

開発:拡張HTML以外にはユーザが手書きできるような部品が無いですね…

基盤:その「テキスト」ってなんですかね。プレインテキストとは思えないんですが。

開発:あ。なるほど。

開発:では「テキスト」を追加。

開発:「ビジュアル」表示にしても、ショートコードのままですね。いわゆるプレビューだと思うんですが。

基盤:とりあえず「公開」して閲覧してみては。

開発:やってみますが…

開発:おっと出ました (^-^)/ WordPressのプレビューっていうのはこういうところが不完全ですね。しかしこれが「テキスト」というのはねえ…

社長:WordPress な人にとっては空気のようにテキストなんでしょうね。

開発:こっちのほうがよほど「拡張HTML」の名にふさわしいとおもうんですが。で、拡張HTMLの中でショートコードを呼べるかですが… short code in extended html で検索… ありますね。

開発:どうも <?php echo do_shortcode('[ショートコード]'); ?> という風に書けちゃうみたいですね。やってみましょう。

開発:これでどうかな?「

基盤:空っぽですね。

開発:何か権限の設定とかが必要なんですかね?

社長:普通のテキストの中にしろ拡張HTMLの中にしろ、PHPがナマで掛けちゃうならすごい強力ですね。いちいち functions.php とかいじらなくて良い。

開発:インラインCSSのノリですよね。まあそれはお楽しみとして。asctime 的な strftime 的なものを PHP でどう書くのかなんですが… strftime PHP で検索。そのまんまありましたw

開発:では Date という関数とショートコードを定義して読んでみますと…

[Date]

開発:いちいち大げさですねw まあ予約語なんですかね。では xDate で…

基盤:これはまた破壊的な。

開発:私のどこがいけないの〜。あれ?関数名の前に $ が付いてます。

開発:ではこれを消して xDate 召喚…

2024-05-18 16:39:00 (JST)

基盤:出ました。でもタイムゾーンがJSTじゃないですね。

開発:ではGMTですとお断り書きをw そしてサイドバーの「テキスト」ウィジェットに貼り付け。ほい。

社長:とりあえず最小限の機能要件を満たしましたw ちょっと配置を整理しましょう。

開発:といいますか、ウィジェットとして編集するより手書きで「テキスト」に書いたほうが簡単な事がわかりましたので、カウンターもショートコードにしてしまいます。QRもロゴも近くに来てもらって… こんな配置では?

社長:位置関係的には良いかもですね。あとは隙間をどう調整するか。まあ今回はこれでも十分です。

基盤:このタイムスタンプとログを突き合わせれば、ハエあるキリ番取得者が誰だかわかりますね。でも、秒単位ではちょっと。

社長:DeleGate では %s です。

開発:うーん。無いですね。もとになる値が秒単位だからですかね。秒単位以下だと microtime() かな。

社長:私の業界では msec はミリ秒、マイクロ秒は usec ですけどね。

開発:ではそのまんま使わせていただくとしまして…

基盤:そろそろキリ番が近づいてまいりました。その時にページが Fatal error だと悲しいですね。

開発:じゃあこれ以上いじらずにその時を待ちますか。

社長:といいますか、この時刻はカウンターがカウントアップされた時のものではなくて、このページを閲覧・生成した時の値だから、やっぱりキリ番取得者の特定には使えないですね。

開発:あそうか… てことは、カウンターのウィジェットに手を入れて、カウントアップした時の時刻を記録するようにしないといけないですね。

基盤:あと11…

基盤:20000の時はあと1というところで数分かかって、キリ番を見損ねてしまいました。

開発:やはりキリ番監視ロボットというか、extension が必要ですね。

社長:まあ、カンターウィジェット自体がカウントアップした時に魚拓を取ってくれればよいのかなとも。

基盤:あと8…

基盤:あと5…

開発:数分に1つだからしびれが切れますね。

基盤:とか書いているうちにこないだは見逃したわけです。あと4… このごに及んでfunctions.phpを壊したりしないでくださいねw あと2... あと1...

基盤:30000到達しました。

社長:その時、2020年8月7日、9時34分3秒(グリニッジ標準時)、 ITS more社のサイトは30000ビュー(?)に到達しました。

基盤:まあ最後は10秒間隔くらいでリロードしてましたから、誤差は10秒以内ですね。

開発:WordPress と PHP のこともまた少し学習しました。

基盤:ではまた40000の時に。

社長:いやもう、次は100,000の時でいいかな。

基盤:記念に30003番も魚拓。

-- 2020-0807 SatoxITS

短期記憶力200%増(当社比)

基盤:では、iMacのメモリを増設します。現在16GB。

基盤:で、このカニの腹、ふんどし?みたいなところを開けて増設できるはずなんですが、どうやって開けるのか… おっと、電源のジャックのところにボタンがあると。BMWのキーで押す。固い?えい。深い?えーいいっ

iMac:ぱこっ。

基盤:でこのレバーを引くと出てくると。しかしこの足が邪魔ですね。外せないんですかね?

開発:外せるくらいならモアイ状のまま配達されたりしないのでは。

基盤:でこのメモリの基板を挿すわけですが、あー足が邪魔だ。なんで左右どっちかにオフセットしないんですかね?

基盤:そもそもどっちを表にして挿せばよいのやら。

開発:まあ確率1/2ですね。外れたらその切込みで教えてくれるでしょう。

基盤:えい。

iMac:グスっ。

基盤:当たりました。いまいちガスっとカチッと感が無いですが、先人と同じ高さになりました。ではもう一枚。入れました。

基盤:で蓋を戻して。あれ、これもちょっと難解…。ケーブルを戻して、電源ON。立ち上がりました。

開発:メデタシ。

基盤:なるほど、高いメモリには基板にパーツ番号とかシリアル番号とか記録しているROMが載っているんですかね。

開発:でも製造元情報は安メモリにもありますけどね…

基盤:あれ、この「メモリのアップグレードの手順」てなんですかね?クリック。

基盤:はあ?

開発:サポート用のサーバくらいちゃんと維持してほしいものですね。

基盤:増設したメモリのせいじゃないですよね... MacMini で見てみる。

社長:まあメッセージからして、HTTPサーバの設定異常ですよね。

開発:しかし、なんともメモリがノンプレッシャーですねw

基盤:では、メモリ16GBでは2ゲストOSくらいしか同時に動かせなかったParallelsで、全開行ってみます。

基盤:6ゲストOS並列、なんともないですね。

開発:CPUもまだ余裕がありますね。要はメモリが十分にあればページフォールトとかも起こらないのでまともに動くと。

社長:いやー、ソフトの開発環境としてはもう十分×2くらいですね。素晴らしい。昼食に行きましょう。

-- 2020-0806 SatoxITS

エアコン復活の日

社長:冷房の無い店で飲んできたら身体に熱がこもったような。体調が思わしくありませんです。ふぅ…

基盤:真夜中に室内32度に達してますね。風もなく… はぁ…

開発:冷房入れたらいいんじゃないですかね… ハァハァ…

経理:異議なし…(ぐったり)

基盤:では当社初の冷房運転を。えーとリモコン… というか、エアコンがエラーコードみたいのを表示して停止しています… 電源を入れ直してリセット。ああ、動き出しました。ですがなかなか冷風が出てこないですね。

開発:冷媒が抜けてるとか。冷媒師を呼ばないと。

社長:ああ、冷気を感じます。甦る感じ。

基盤:しかしなんですかねこの騒音。台所の換気扇並なんですが…

開発:古いエアコンだと効率も悪いかもですね。

* * *

基盤:室温29度まで低下。肌寒いくらいに感じますね。

開発:さて、電気代にどう出ますやら。

経理:でんこちゃんで見てみたのですが、当社は通常200Wのようです。8/6朝現在では一昨日8/4のぶんまでが見れます。

社長:みごとにフラットですね。

開発:スマートメータの割には反応が鈍いんですね。

基盤:刻みが100Wですか。

社長:ていうか、自宅内で直にでんこメータと通信したいですよね。PLCでつながらないのかな?

基盤:しかし、このメータを見ると何も活動が無いように見えますね。この会社は無人か?って感じ。

開発:季節柄、幽霊会社w

経理:えーと、動きのある日としては… 7/24(金、体育の日)とか。

開発:なんでしょうね。ブログによると、クラウドを使ってただけの日みたいですが…

基盤:30分刻みの棒が5本、つまり洗濯乾燥機の活動時間と思われます。

開発:なるほど、逆に乾燥が200Wで済んでるってのが意外に思われますが…

経理:そもそももっと前は200W以下で推移していたようです。

経理:それが 7/22 夕方からは200を切ることがなくなりました。

開発:なにがあった日ですかね。

基盤:iMacが稼働し始めた日ですね。

開発:iMacといえば、ブラウザのコンパイルでギンギンにCPUを回した7/29とかは?

経理:時折100Wの上積みが見られます。

基盤:しかしプライバシー保護を考慮してなのか、ナマデータが落とせないようだし、検索というか表示範囲選択方法も弱いようだし。もっとなんとかならないんですかね?

社長:そもそもでんき家計簿にログインできるようになるまでの認証コードの郵送とか、お金と時間もかかってますしね。

開発:これもなにかの雇用対策なんですかね…

基盤:そもそも reCAPTCHA的なのを入れてないのもどうなんだろうという気はしますね。

基盤:せっかくなのでフィリップス君もiMacもUPSに参加させましょう。うーん、フィリップス君50W食ってるように見えます。

開発:バックライトが蛍光灯だったりして。

基盤:次にiMac。おお、起動時に100W以上食いますね。Parallelsで2つのVMを起動。おおーっと、過去最高の248Wを記録しました。

開発:それでも6分は持つと。

基盤:でも安静時には50W。でこれが、全体の安静状態です。

基盤:ついでに扇風機も参加させましょう。

開発:電源パックアップ付きの扇風機w

社長:ある意味、生命線ですから。

基盤:扇風機は全力回転で7Wくらいですね。

社長:我社の全インフラ・ライフラインがこの1万円のUPSにつながっていると思うと、感慨深いですね。

基盤:全パソコンが同時に全力運転した時に、このUPSのキャパの300Wギリというところですね。

基盤:あれ?Power Panelの反応がなくなりました… このソフト、ホストの起動時にはまず安定して立ち上がるんですが…

開発:USBの接続がうまくいかなくなるんですかね。

基盤:Thunderbold口に移してみますが…だめですね。No device connected。ちょっとリブートします。

基盤:何回かQuitを起動をやってみましたが、どうもThunderbolt口なら10秒くらいで確実に接続するみたいですね。macOS的には認識してないようではありますが。

基盤:で、バックライトの消費電力ですが、これがRetinaの一番暗いモード。

基盤:一方、一番明るいモード。

開発:40W近い違いですね。バックライトってそんなに食うのか。

基盤:私が普通に使いたい明るさでは15Wくらいのようです。

社長:スマホでは時間が立つと自動的にバックライトを暗くするとかありますが、デスクトップでもあるんですかね。

基盤:うーん。… 省エネルギーにもスクリーンセーバにもディスプレイにも設定が見当たらないですね。

開発:凝ったスクリーンセーバとかって、逆にすごく電力食ってそうですしねw

社長:それでは仕上げに、UPSのテストをしましょう。電源を抜いて下さい。

基盤:では。ぶつっと。

UPS:ぴーっぴーっ。… … … …ぴーっぴーっ… … … …

社長:でも全て問題なく使えています。

UPS:ぴーっぴーっぴーっぴーっぴーっぴーっぴーっ

基盤:残り5分くらいで連続警告になるみたいですね。

基盤:では全電源電源回復。

開発:モニターをバックアップ系からはずせば、10分くらいってとこですかね。

開発:瞬電対策としてはもともと問題ないですが。サージ対策もありますし。

社長:全モニターが消えても困るから、自動的に暗くなってくれると良いですね。UPSとの設定でそういうことができるのかな。

開発:脳がないフィリップス君がそれをできますかね。USBなりEtherでコマンドを送れるくらいなら、設定に苦労もしてないんですけど。

社長:実はVNCクライアントかXサーバ機能があったとか。

基盤:あれ?裏をみたらフィリップスくんにはUSB-Cが1口、USB3が2口、あとEtherの口がありますよ?まあただのハブかもですが。

開発:ええー。こいつ、いやこの方はそういう高貴な生まれだったのですか。

基盤:ところで只今の室温、31.5度です。

社長:ああそういえば昨夜帰った時に、郵便受けにiMacのメモリとラズパイ3がはいってました。あと電子工作キットw

基板:まずはメモリを増設しましょう。仮想マシンのメモリが厳しいんで。

* * *

経理:でんこ家計簿、昨日の分が見れるようになりました。

開発:きのうも200Wベタですね。

社長:ソフト開発って電気食わない稼業ですねw

基板:フィリップス君のバックライトを暗くしたら安静時の総計140Wを切りました。

経理:ということは、2時間ごとに200Wと100Wをぴこぴこするグラフが見られるということですね。

社長:ああやっぱり、輝度をコンピュータからコマンドで制御したいですねぇ… メシ行ってきます。

基板:しかし、クラウドの仮想マシンて電気代のことを考えると、お得感が増しますね。

* * *

社長:かき氷を買ってまいりました。

基板:シャビイ?shabby?しょぼい?

開発:名前のわりには100円もするんですね。

社長:冷蔵・冷凍庫を失った当社としてのせめてもの暑さ対策です。体内から冷やしましょう。

経理:いえ、べつに電源を入れれば良いと思いますが。

基板:うん、これはなかなか、大人のかき氷ですね。シャグ。

開発:変な名前だと思ったらこれ、シャーベットの意味ですかね。なかなか。

経理:上にのってるレモンスライスがちょっと…

社長:冷凍みかんのようです。子供の頃は恐怖の対象でした。なるほどこれはシャーベットなわけですね。違いのわからない私。

基板:液状化し切る前に完食いたしましたw

* * *

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ではソケットのハンドルはファイルディスリプタ的に継承されないですしね。

* * *

開発:ふぁあぁあ… よく寝ました。

社長:それでどうなりました?

開発:sshのコードを3時間ばかり格闘したのですが、どうもその、サーバとの通信状況でパケットの送受信の戦略が変わるようでもあり、あるいはその先のTCPの転送経路が何か学習するのか、振る舞いがつかめませんでした。とにかく、送受信のバッファを大きくすれば良いというようなシンプルな話では内容です。

開発:ただ、動作原理はわからないですが、途中にアプリケーション層でのTCP中継器を挟めば問題が回避できることは確かです。

開発:そんなわけで、sshがサーバにコネクトした後に、そのソケットに一段フィルター的に中継プロセスをかませることにしました。

開発:特長は、select もスレッドも使ってないところです(笑)

開発:でもってこれを、sshconnect.c に挿し込みます。

開発:そして、環境変数 _ISFENV を定義して ssh や scp をやると、このフィルタが挿入されるという仕掛けです。やってみます。

基盤:おお、10倍速達成!

開発:socketpairにAF_UNIXを使っていると、macOSではNODELAYが出来ないと文句を言って来ますすが、まあそもそものTCP立ち上がりの問題なので、実害はありません。

開発:この対策は、レイテンシがめっちゃ長い外部サーバにはそれほど効きません。USサイトとはRTTが130ms程度ですが、まあ2倍速くらいかなという感じです。

開発:最果ての地、フランクフルトではこんな感じ。

社長:まあでも、2倍高速化すれば十分じゃないですか。

基盤:遠隔でも、ライトセール間なら5MB/sくらい出ますので、一旦ライトセール東京に持っていって、そこからさらに先に配るのが良さそうですね。

開発:そういえば現在、xsoへのアップロードは30MB/sくらい出ます。ところが、macOSでやってみたら、3MB/sくらいしか出ないんです。

開発:ところは腹いせにでっかいファイルを送ってやったら、ジョジョに加速して、34MB/s に到達したりするんです。

基盤:不思議過ぎる… 何がどうこでどう調整されているのやら。

社長:相手によってヒューリスティックに戦略を変える必要があるのかも知れないですね。

開発:奥が深そうです。

社長:それはそうと、せっかく作った isfilter プログラム、なんかの形で公開しましょう。

基盤:このブログじゃだめなんですか?w

-- 2020-0805 SatoxITS

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