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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です