Monzilloの第一歩

開発:さーてそれではなんかやってみましょうか。

社長:宿願のfile URLの表示を。特にパンくず。

基盤:ソースはどこでしょうね。find . -type f -exec grep "Up to higher "{}" "";" ・・・重い。帰ってこないですね。Eclipseとか使いたいなー。

開発:Windows Explorer は「File Explorer」と名前を変えました。ですって。2018年5月。というか、コマンドキーを押しながらEを押すと開くんだそうです。知らなかった。アイコンまでマウスを動かす必要なかったのかー。

基盤:あ、ぽろっと出た。

u18$ find . -type f -exec grep "Up to higher" "{}" ";"
DirGoUp=Up to higher level directory

基盤:しまった、どのファイルかわからない(笑)。なんにしても、Cで書いてあるわけじゃないですね。ちょっと嫌な予感。でファイル名を表示したいんですが。man grep。あ、-H オプションというのがあるのか。再実行。

開発:それって、あるとは思ってたんですが、30年以上man もせず、不便してました (^-^;

社長:そう言えば、Mercurial とか何も使って無いですね。検索機能とかあるのでは?

基盤:あ、出ました。

u18$ find . -type f -exec grep -H "Up to higher" "{}" ";"
./thunderbird-77.0/netwerk/locales/en-US/necko.properties:DirGoUp=Up to higher level directory

開発:なんだ、プロパティというか定数集めたファイルみたいなやつか。

基盤:開いたら、あちこちに非ASCIIというかバイナリみたいのが入ってるげなんですが。生成したファイルですかね?で当該の定義がこれ。

# Directory listing strings
DirTitle=Index of %1$S
DirGoUp=Up to higher level directory
ShowHidden=Show hidden objects
DirColName=Name
DirColSize=Size
DirColMTime=Last Modified
DirFileLabel=File:

開発:まー locale てあるから、言語ごとにあるんでしょうね。

基盤:いえ、en-US しかないですね。打ち捨てられ感。まあちょこっといじってみましょう。全部大文字にしちゃえ UP TO HIGHER LEVEL DIRECTORY。バイナリだといじっちゃいけないかも。でもちょっとおまけして、make。make run。おー、大文字に変わった。

最初のいたずら

開発:それでこの necko っていうパーツというか何か、何ですかね。firefox necko でぐぐる。あー、ネットワークモジュールのことですか。https://developer.mozilla.org/ja/docs/Necko

ネットワークライブラリ (Necko) は、トランスポートからプレゼンテーションレイヤーに至るネットワーキングにおける、複数のレイヤーに対応したプラットフォームに依存しない API を提供します。この API は Mozilla クライアントで利用されますが、他のネットワーククライアントを書く際にも使用することができます。
・・・
最新のソースコードは netwerk/ で見ることができます。

基盤:ああ、netwerk/の下ですか。検索が速くなります。でもそのハイパーリング、Service Unavailable ですね (^-^;

u18$ find netwerk -type f -exec grep -H "DirGoUp" "{}" ";"
netwerk/streamconv/converters/nsIndexedToHTML.cpp:    rv = mBundle->GetStringFromName("DirGoUp", parentText);
netwerk/locales/en-US/necko.properties:DirGoUp=UP TO HIGHER LEVEL DIRECTORY (^-^)/

基盤:cpp でした。ホッ。vi nsIndexedToHTML.cpp。けっこうでかいですね861行。ファイルにもファイル内にも更新日付が無いというというのが悲しいですが。/DirGroup。ああ、ここです。

  if (!parentStr.IsEmpty()) {
    nsAutoString parentText;
    rv = mBundle->GetStringFromName("DirGoUp", parentText);
    if (NS_FAILED(rv)) return rv;

    buffer.AppendLiteral(R"(<p id="UI_goUp"><a class="up" href=")");
    nsAppendEscapedHTML(parentStr, buffer);
    buffer.AppendLiteral("\">");
    AppendNonAsciiToNCR(parentText, buffer);
    buffer.AppendLiteral("</a></p>\n");
  }

基盤:でその直下に、こう続きます。てことは、これ、file だけなくて、FTP とかにも共通なんですかね。

  if (uri->SchemeIs("file")) {
    nsAutoString showHiddenText;
    rv = mBundle->GetStringFromName("ShowHidden", showHiddenText);
    if (NS_FAILED(rv)) return rv;

    buffer.AppendLiteral(
        "<p id=\"UI_showHidden\" style=\"display:none\"><label><input "
        "type=\"checkbox\" checked onchange=\"updateHidden()\">");
    AppendNonAsciiToNCR(showHiddenText, buffer);
    buffer.AppendLiteral("</label></p>\n");
  }

  buffer.AppendLiteral(
      "<table>\n"
      " <thead>\n"
      "  <tr>\n"
      "   <th>");

開発:HTMLべた打ちがうれしいような悲しいような。まあこれで全然問題ないと思うけど。つまりその、AppendLiteral してる buffer あたりをいじればいいのかな。

基盤:そうですねぇ・・・どんなHTMLソースになってるのかと見てみると、こんなのが出て来ちゃて。

基盤:いったんHTMLを生成してそれを普通に解釈するという作りにはなってない感じですね。ちなみにOperaはこんなふうに、ごく普通です。

開発:すこし雲行きが怪しいですね・・・まあでも、そのAppendLiteral というのを試してみましょう。

基盤:ではとりあえずこんな感じで。

buffer.AppendLiteral("<pre>\n");
buffer.AppendLiteral(" @ @ <br>\n");
buffer.AppendLiteral("( - ) {DirGoAncestors} <br></pre>\n");

開発:あれ?

基盤:あはは、途中まで書きかけてコンパイルしちゃいまたね。というかここで生産性上の深刻な問題が。main()とかさっきのlocaleとかは firefox 本体にあってmakeでサクッとできますが、Neckoとかはshared libraryになるわけです。で、それを作るのに例のクソ重いrastccとldが走る。これ10分がかりです。おそらく、リリース用の入念チェックか何かをしているんで、開発用のmakeにすればいいんだとは思いますが。あできた。mach run。あれー、鼻の下が長くなっちゃいました(笑)

社長:ところでこれ、Goで書いた部品を組み込んだりしちゃいけないんですかね?

開発:Mozilla Public License ってすごく緩いんじゃ無いですかね。そもそも社内でいじってるうちは何の問題も無いかと。

基盤:あー、さっきからUbuntuが反応しないなと思ってたら、こんなことに。またディスクフルです。「ディスクでの重大なIOエラー」で一時停止してます。

基盤:VM用に139GBに達してますね。あー、まずはAvast削りますかねっと。さようならー。1GB空きました。あと大口だとAcrobat DCが2.5GB。当面もうWindowsでAcrobat使うことないですね。アンインストール。しかしAcrobatのくせになんで2.5GBもガメてるんですかねえ?しかもいつまで削除の準備中なのやら…。Windows Softoware Development Kit, 18/04/2020。なんすかこれ?2.35GB。

開発:いや、ちょっとWindows のドライバーでも書いてみようかなと・・・

基盤:削除で。しかし、Acrobatは何やってるんでしょうね?最後の抵抗?

開発:どっかに何か隠れて無いですか?

基盤:・・・このようなものが。なんで派手派手しくポップアップしなかったんですかね。RemoteDesktopのせいかな?でも、前から時々あるんですね。タスクバーでこっそりチカチカしてるとか。

基盤:あれ、どこからともなく8GBの空きが。またHyper/Vの仕業でしょうか?おー、HV復活してますね。

基盤:Development Kit の削除も忘れずにっと。

開発:ただ、思うにホストのディスクが256GBしかないのに、半分以上VM用ってのは、何かアンバランスですね。

社長:うーん。レノボ君にはSSDを増設しますかね。内蔵か外付けか。それが問題。

基礎:さて、10GB空きができたのでUbuntu再開。おや、今回はちょっと時間がかかりましたね。fsck的な回復してたのかな・・・あれ、またおかたまりですか。作業用のディスクが足りないのかなー。

開発:あれー、Windows版のDeleGateのmakeができなくなっちゃってます。Visual Studio の include がない。シクシク。アンインストールした Development Kit というのに含まれてたんじゃないですか・・・

基礎:この際 Office もアンインストールしましょう。

開発:マジ?

基礎:だってもう1ヶ月以上、Winodwsでは使って無いですからね。今後も使うことはないでしょう。アンインストール。ぽちっと。iTunesもTeamsもぽいぽいぽいっと。エンドユーザ様が使うツールはWindowsにはいらん。このVisualStudio系の山のようなのも一旦削ります。かたっぱしからぽいぽいぽいっと。あーっ快感!

開発:社長・・・

社長:構いません。続けて下さい。

基礎:全てはHyper/Vのために!わーいHyper/Vが再開しました。おー、40GB空きましたね。もう Hyper/V無しで生きていけない。

社長:ところで私は、以前から赤系が苦手なんですが、好きな赤もあります。茜とか柿右衛門とか。Ubuntu18デスクトップの右上のほうは、かなり好きです。

開発:でも、圧縮すると、パレットのせいなんでしょうけどずいぶんひどい色になっちゃいますね。l好ましいといっているのはこの部分ですが。

基盤:そのへんは、WordPressで使ってる圧縮ツールの問題じゃないですかね。あんまり色あいの保持を考えてないとか。MacのPreviewで小さくすればこんな感じ。

開発:かなりまともです。

社長:Apple製品はすべてまともです。ただし iClould を除く。

開発:うちで構築するWordPressサーバにはこういうのを使いたいですね。

基盤:そういえばコンパイル終わってました。こんな感じ。

社長:おお、良いですね。あとはパスにアンカーつければ。

開発:しかし、リブートしちゃうと、複数ログインしていたヒストリーの一つしか残らないのが悲しいです。さっき何やってたんだろうと。

社長:そもそもSSHとかじゃなくて、ふつうにブラウザからHTTPサーバに入って、ブラウザをターミナルエミュレータとして使えればいいんじゃないですかね。mod_terminal とかあるんでは?接続後にプロトコルを変更(UPGRADE?)するメソッドってありましたよね。

開発:Upgradeヘッダですね。

基盤:どのブラウザも ssh://hostname とか telnet://hostname というスキームは受け付けますが、いずれも端末アプリに投げるだけですね。まー、ブックマークとして管理できれば多少便利かも。

開発:それはそうと file URLのアンカーを片付けましょう。要は、file:///p1/p2/ という文字列を、こんなふうに変換するだけで良いはずです。

file:///p1/p2/...

 ↓ 生成

<a href=file:///>file:///</a>
<a href=file:///p1/>p1/</a>
<a href=file:///p1/p2/>p2/</a>

社長:split と join ですかね。scanf と printf というか。

開発:C++でどうやるのかというと・・・ぐあー、なんかやたら std:: というのがうざいんだけど。

* * *

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

開発:C++流のやり方でやろうかと5分くらい調べたのですが、嫌気が差してCで書くことにしました。

社長:(笑)

開発:それで問題だったのは、mozilla が使っている文字列のクラスと名前のCの文字列とのやりとりです。その文字列は nsCString というやつなんですが、どういう定義なのかソースコードを探してもよくわからず、結局ようやくMDNにドキュメントがあることがわかりました。

開発:それで思ったのですが、ちょっとかじっただけですがGo言語なら、ライブラリを検索するのも簡単だし、その仕様もとてもわかりやすく、かつ見やすく説明されていることがほとんどです。一方、mozillaのは、どこの廃屋?感がヒシヒシ感じられます。まあ、わかってみれば何の事は無いのですが。とにかく、とっつきにくいというか、最初の一歩の敷居が高いです。

開発:そもそも私は文書、特にウェブのページとかでその作成・更新日が記載されてないのって、アンビリーバブルなんです。それがいつ記述されたものなのか、文書を読む上で、どのくらい真剣に読むか、あるいは読まずにスキップか判断する上で、最も重要な情報のはずなのに。プログラムにしたってそうです。

基盤:とまー、ぶーたれていたわけですが、実は先ほど、mozilla のソースやドキュメントについて、まともな記載がされているサイトを見つけました。その名も firefox-source-docs.mozilla.org です。Firefoxのビルドについてもとてもわかりやすくまとめてあります。で、いまその指示書どおりにやり直しているところです。基本的には同じ事のようではあるのですが。まあ、MDNは実際、廃屋だったんですね。

基盤:で、こっちのやり方でやったら、流石に最初のダウンロードだけは数十分かかりましたが、ビルドは1分15分で終了でした。

 1:15.13 Packaging quitter@mozilla.org.xpi...
 1:15.26 Packaging mozscreenshots@mozilla.org.xpi...
 1:15.40 0 compiler warnings present.
 1:15.43 Overall system resources - Wall time: 75s; CPU: 0%; Read bytes: 0; Write bytes: 0; Read time: 0; Write time: 0
To view resource usage of the build, run |mach resource-usage|.
 1:15.44 Your build was successful!
To take your build for a test drive, run: |mach run|
For more information on what to do now, see https://developer.mozilla.org/docs/Developer_Guide/So_You_Just_Built_Firefox

基盤:高速化のミソは、コンパイル済みのオブジェクトを自動的に落としてくれることです。そうさせるには、mozconfig ファイルに以下の一行を書く、これだけです。

ac_add_options --enable-artifact-builds

開発:ただ、少しでもいじるとその影響範囲はどうなるんでしょうね。特に、全体におよぶオプションを変えた時には、結局全体の再コンパイルになるのではないかと思います。

開発:それはともかく、最初の第一歩の要件だった、「上のディレクトリ」でなく「上位の各ディレクトリへの直接移動」ができる機能はできました。

開発:mozilla の流儀に慣れるのに少し手間取りましたが、やることは簡単なので、実際簡単に実現できました。この機能は少なくとも私にとってはとっても必要なものでした。このような機能がこれまで Mozillaで、あるいはApache等のサーバ側でも、実現されてこなかったのが不思議でなりません。

基盤:できましたねー。ただ、もうちょっと何か見栄えのする見せ方が必要かもしれませんけど。カーソルあてるとポップアップするとか 。details活用するとか。既存の表示の中に差し込むのもあれなので、完全にオリジナルのページにしたほうが良いと思います。あとやっぱり、Windows版もMacOS版も欲しいなあ。

社長:素晴らしい。地味だけど、one giant leap for our company です。

--
2020-0607 SatoxITS

記念写真

開発:それではさっそく、なんかいじってみますか!

社長:ちょっとその前に記念写真を撮っておきましょう。我が社のMonzillo計画最初の一歩の手前です。ビルドは通ってますね?

基盤:一応、browser/app/nsBrowserAPp.cpp のmainの先頭に当市のシンボルキャラクタAAを入れました。

広報:ロゴはまだ考え中で・・・

社長:よいですよいです。こういう時はためらわずに。

基盤:ではいきます。rustc さんもOKかな。ではハイ、ヒール。パシャ。

Mac > RemoteDesktop > Windows > Hyper/V > Ubuntu > Monzillo

基盤:ところでこれは本当にMonzilloていう名前にするんですか?

社長:社内開発コードですからノリで。私の辞書にも登録っと。あ、でも一応ドメイン名とっとこうかな。monzillo.work 1円也と。プチ。

経理:社長、.inc にチェック入ってますよ。

社長:ギョ。なぜだ・・・プツ。 指差し確認、Go!

経理:当社70〜72番目のドメイン名となりました。自動更新お断りも忘れずにしときます。ペチっと。

基盤:これ全部他社に移管するんですか?XSOの嫌がらせ半端ないですが。

社長:来年も継続する分は移管して、移管先で更新します。でも生き残るのは10件くらいかなぁ・・・

--
2020-0607 SatoxITS

Monzilloブラウザの開発

社長:あっしニャー関わり合いのねえこって。の木枯し紋次郎って上州生まれって設定なんですよね。

基盤:3分間待つのだぞ、ってやつですね。じっと我慢の子であった、ってコマーシャル覚えてます。

開発:さーて、なんかいじってみましょうかー!

基盤:それが今、復活したVMを圧縮してアーカイブ中でして。30MB/s くらいでしか進まないので、100GBのバックアップに数十分かかってしまうという。まあ、月曜にディスクが来たら、まずコピーだけして、圧縮・アーカイブは後ほどゆっくりで出来るんですが。

社長:思うに、ファイルの複製なんていちいちアプリ層まで上げないでOS内でやってくれれば、かなり高速化すると思うんですけどね。それとか、片方で読んでて片方で書き換えて使うなら、copy on write 的なカーネル機能を活かすとか。

社長:この波形、故郷の上州で見る山並みに似てます。三山的な。

開発:まあ、zipの処理に律速されてるんでしょうけど、CPUを使い切ってないのは、うまく読み書きとインターリーブされてないんですかね?

基盤:この場合ZIPは全6コアを並列に使ってやってるみたいですね。並列化してるってことは、結構でかい単位でブロック化してるってことですかね。書き込みの波形がキートップの並びのようで面白いです。もしや、マルチフェーズの圧縮でパイプラインとか?

開発:そうですか。確かに圧縮でサイズが1/4になるのは魅力なんだけど、圧縮って重いよね。ただの転送より10倍以上遅い。特に高速化したネットワーク上の転送なら、圧縮しないで送ったほうが速かったり。回線が100MB/sの能力があるのに、PCで必死に25MB/秒に圧縮するのって意味ないよね。

社長:それはちょうど今のプロッサ能力と広域ネットの幅とが鬩ぎ合ってる感じで、どっちにも転びますよね。ネットの性能をモニターして、臨機に最適な圧縮方法・圧縮率を選択できると良いのでしょうけど。可逆圧縮の場合、そういう事ってやられているんでしょうかね?

基盤:まあディスクにしても、4倍というのは同価格のSSDとHDDの容量差に近いですから。HDDには圧縮しないでアーカイブしても良い。すると回復も高速にできる。どうするかは他の条件次第ですね。

開発:まあHyper/Vのチェックポイントを使う場合の賢いアーカイブの方法というのもあるのでしょうね、きっと。

基盤:OneDriveで何かしないですかね。同じ会社の製品なんだし。全般的に、インテリジェントなドライブを目指している感じだし。

社長:まああそこは、横の連携無さそうですしねえ。ネットワークさえつながってなかったりして。

基盤:あ、アーカイブ終わりました。

開発:では、いよいよ。

--
2020-0607 SatoxITS

Hyper/V最高!

開発:それではさっそく、なんかいじってみますかね。

社長:当社で独自変更したのには、なんかFirefoxじゃないモジリを入れたいんだけど。Monzillo とか。ダメなのかな?

基盤:・・・悲しいお知らせです。さっき仮想マシンを一旦落としてチェックポイントを潰そうとした時に、なにかガチャガチャやったせいか、壊れました。

開発:あら。

基盤:残念ながら、HVはフールプルーフには出来てないようです。

開発:何が起きたんですか?

基盤:それがこの、チェックポイントをマージする時のディスクアクセスが面白くてですね。さっき潰した時にピークではSSDに300MB/秒を超えてアクセスしてました。なので、HDDにした時にこれを律速されないかというところに興味。

開発:なるほど。その時が一番高速アクセスしそうですね。普通の使い方では頻繁にやらないとは思うけど。差分ディスクというのはとても面白いと思う。今気になってるのは仮想ディスクのバックアップにかかる時間だけど、それも差分だけなら高速化できそうだし。rsyncと組ませたら完璧かな。まあお金持ちなら全部RAMでやっちゃたりするんでしょうけど。FeRAMのディスクとか無いのかな?

基盤:おっと今気づいたんですが、ホストのSSDが満杯になってます。このせいですかね?

基盤:で、さらに今みると、C:ドライブが完全に満杯になってました。

基盤:つまり、バックグラウンドで何かやってます。HVのメッセージに「ディスク結合が保留中です」とありますから、ひょっとしてディスクを空ければ再開してくれるの?と期待しました。それでいらないファイルを見つけてなんとか11GB空けまして(まだゴミがあったのでした)、Hyper/Vをつついてみたところ、なーんと、復活してしまったんです!

基盤:偶然ですが、その感動の一部始終が録画されてました↓

蘇るHyper/V仮想マシンの一部始終

基盤:結論。Hyper/Vはフールプルーフでもありました。

開発:うーむ。それはよかった。でも、ちょっと寡黙過ぎるよね。もうちょっと、何やっているのか主張してくれたほうが良いのではあるまいか?

社長:すばらしい。Hyper/V最高ですね。当社認定CC候補確定。

基盤:それはそうと、Macでラクラクスクリーンショット撮りまくってるとすぐにデスクトップがいっぱいになっちゃいますよね。

基盤:確かにスタックにすれば片付くんですが。

基盤:スタックをやめるとぶちまけるのって、バグでしょうか?

開発:まあデスクトップじゃないとこに撮ったのを入れてもらればいいっていう話ですけどね。

社長:昔から不思議なんですが、なぜ全てのフォルダがデスクトップと同じように表示するモードを持たないんでしょうね?逆についてもですけど。

--
2020-0607 SatoxITS