インスタント・タイムスリッパ

社長:帰りました。

経理:酒臭いですね。

社長:今日は久しぶりに焼き魚屋で茹でしらす丼でございました。

開発:暗黙でビールが出てきたものの、心なし応対が冷ためでしたね。

社長:金になる客、リピータにはそれに応じて優遇サービスする。極めて理にかなっていると思います。ファミレスじゃないんで。

基盤:たくさんドメインを取ってる顧客には割引とかすべきですよね。複数まとめて更新したら割引とか。

経理:昨日のさたぽんがツケになってますね。

社長:くたばれ現金!いや、最近財布に余裕をみて現金を入れとく習慣がなくなりまして。ツケを連発しております。小さい飲食店と医院が最後の難関ですね。

基盤:おばちゃんに話は通じたんですか?

社長:いや、昨日はたまたま息子さん?が店に居て、英語で応対してくれたんです。おばちゃんは、だいじょうぶ、だいじょうぶ、ありがとね、だけ言ってました。

開発:笑い話に時が変えるよ心配いらないと笑った♪

経理:標準報酬の届けも昨日滑り込み郵送しましたので、罰金50万または懲役6ヶ月の心配はなくなりました。やれば30分で出来る作業なのに。

社長:だって意味が無い作業には5分でも人生の時間を使いたくないじゃないですか。本来、画面上で入力して複製して自動計算してクリックで承認できれば、3分で終わるべき作業なんですから。

経理:それで思い出したのですが、国税は源泉で頂いてますが、地方税の分を忘れてました。いずれこれも差っ引かせていただきます。

社長:源泉徴収じゃなくて、自分で払えたほうがわかりやすいしスッキリすると思うんですけどね。

基盤:やたら複雑なほにゃらら控除とか本当に意味というか根拠がわからない。

開発:なんにしてもしかるべく納税をシステム化すれば、わかりやすくてタイムリーで納得できるものになるんじゃないとも思うんですが。

社長:当面その方面の雇用対策は必要でしょう。

開発:これから先何十年も続くんですかねその対策。もっとクリエイティブな作業に人間の能力を活用すべきと思います。

基盤:そういえば、私は人間ではありません調査では、ロボットは一度たりともクリッカブルマップをクリックしてません。

開発:そういう意味ではやはり、reCAPTCHAみたいな大層な仕組みじゃなくて、単にsubmitをクリッカブルマップにする、ついでにイメージはポイントリスムかQRボタンにするというのが、当社の進むべき技術の道ではないかと思います。

* * *

社長:それで飲みながら考えたんですが、なんなら動的リンカーを自作すれば良いと思います。まあ、自前の shell を作るノリで。ld.so とかって、せっかくの面白さを活かしてないのでは。

開発:まあ、スタッツ取ってワーキングセットを小さくするように再配置するというのは50年前からの技術ですしね。

基盤:ELF互換のPNGとかどうですかね。それかオブジェクトの配置をCSSで決めてJavaScriptでファイアーする。

社長:手作りといっても今はもう部品は揃っているので、組み立てるだけですよ。私が学生の頃は自分でゼロからa.outのダイナミックリンカー作ってました。VAXでは簡単だったんですが、インテルに移植する時にすごく面倒で。あれで86が嫌いになってしまいました。まあ、MSDOSが悲惨だったというのもありますが。そりゃもう立派な体裁の分厚いマニュアルで、1ページに20箇所くらい誤訳があるという。

開発:なんにしてもユーザとOSの境界ですね。

社長:機能というのは境界に形作られるんですね。いわゆるインタフェースです。そこの部分に味が凝縮するから皮が美味しい。

開発:汎用のダイナミックリンカーを作るというのは別にして、特定のプログラムをダイナミックリンクで組み上げるというのも面白そうですね。関係するプログラムを同じ空間に入れちゃったり、スレッドとしてスケジュールしちゃったりとか。

社長:共有メモリで交信できると処理も実装も効率化できるものもあるかもね。そういう意味では、まさにshellを動的リンカーで作るということになりそうです。Dynamic Linking Shell というか。

* * *

開発:さてそれで、Goのバイナリに対してもこの動的ライブラリを噛まして時間を飛ばしてやろうと思ったんですが、Segmentation fault で終わってしまいます。ダイナミックリンクがうまく行ってないんだと思います。

開発:でバイナリをみると、これは statically linked だよとあります。

開発:実際 readelf -s で見ても、動的リンク用のシンボルテーブルは無いのです。不思議なのは、ld.so がそれでも動的リンクをやろうとしていることです。おかげで原因に気づくのに時間がかかりました。

開発:それで、go build shared library とか検索すると、Go build の動的リンク版があるようなのです。

Shared library in Go? [Stackoverflow/2018]

開発:早速インストールして、ビルドしてみます。

基盤:バイナリちっさ!

開発:これでフォルトはしなくなったのですが、どうもこちらが提供した時刻を使ってくれない。clock_gettime を見ているようではあるのですが。

開発:一方不思議なことに、ld.so で動的リンクをトレースすると、clock_gettimeは出てこない。これは、どこかの動的シンボルから先で静的にリンクされてしまってるのかも知れません。

開発:.map に書くバージョンでのマッチングとか、C++版の型付気シンボル名の問題もあるので、要学習です。

社長:まあ、これは急がなくても。

基盤:それはそうと、今季初めて扇風機を稼働させたら体感温度が3度くらい下がりました。室温29℃なのにやや肌寒い感じです。

経理:冷房費ゼロへの挑戦。

* * *

社長:それで、この作品のアイコンが欲しいですね。

広報:イメージ的にはサイバーな… ガラスのスリッパかなと思います。

開発:笑顔のシンデレラは野獣だった。

開発:名前はタイムスリッパですかね。i をつけて iTS とか。

基盤:i はインスタントとかですかね。

社長:instanttimeslipper 長いですね… instant と time がかぶっているようにも… さすがにどのトップレベルドメインでもイケます。とりあえず .xyz 25円、.work 1円でぽちっ。

基盤:また xso なんですか?

社長:まあよいではないですか。

基盤:すかさずネームサーバの変更。

開発:やはり、登録時にネームサーバを選択できる whois.com はまともですね。少数派なんでしょうか?

社長:さて、通じたかな?

基盤:まだこの段階です。

社長:アクセス試すのが早すぎましたかね。

広報:ロゴの素案ができました。

社長:感じは悪くはないですね。でも長いな。インスタントをちいさくするとか。いっそインスタスリッパとかにしますかね?

基盤:吹き出し的に「即席」って付けるのでも。

広報:こういう感じ?

社長:ふむ。アイコンは?

広報:たとえばそのまんまですが。

社長:うーん。これアリですね。これでしばらく行きましょう。おっと、ドメイン名も開通。ではロゴを貼り付けて。

基盤:ドメイン名長っ(笑)

開発:アイコンに圧縮されると水彩画的な感じがします。

社長:タイムスリッパと点描を連携させられると良いですね。

— 2020-0711 SatoxITS

タイムマシンの開発(大成功)

社長:できたみたいですね。

開発:整理します。やりたいことはアプリが参照するOS機能に変更を加えること。手段は動的ライブラリのすり替え。アプリの実例は date コマンド。変更するのは現在時刻の取得関数。

開発:strace date により、date コマンドが現在時刻を取得するのに使用している関数は clock_gettime と見られます。

開発:そこで、これを以下のように置き換えてみることとします。つまり、1970年1月1日0時22分33秒に固定します。

開発:これをshared libraryにします。

開発:で、これを date コマンドが使うように仕向けます。

開発:そして実行。

基盤:やった!

社長:感動しました。

開発:ブレークスルーはこの「LD_PRELOAD」という指定で、実行開始後最初にユーザの指定した動的ライブラリをロードするというものです。「ユーザやアプリごとに固有の動的ライブラリを設定できると良いのに」と思っていたのですが、まさにそれに相当するものでした。

社長:うーむ、これを使えば、どんな関数でもラッピングできちゃうわけですね… しかも想定外にお手軽。

基盤:自分のOSにごっそり入れ替えてしまったりとか、ネットワークOSにしちゃうとか。

開発:4月に作った ITSTPプロトコルに載せて飛ばすことも出来ます。

開発:あとは、これがLinux上のどこまでのプログラムに通用するか、さらにLinux以外では同じことができるか、です。

社長:プログラム起動時に、その時々に最適な動的ライブラリを生成して使うとかもできそうですね。

開発:まさに動的ですね。

基盤:コンテツのキャッシュとかではカバーできない部分の最適化ができそうです。

社長:いやめでたい。one giant leap for us です。めでたいので飲みに行きましょう。

— 2020-0711 SatoxITS