うんざりしたので、ブラウザを作っている
(adayinthelifeof.nl)- 個人的にニュースを避けていた経験が技術ニュースにもつながり、繰り返される否定的な変化に無力感を覚えた末、自分でブラウザを作ることにした
- Hacker Newsで、望まないアップデート、サブスクリプション料金の値上げ、個人情報の収集、暗号化禁止の議論、ブラウザ・エコシステムの支配といった流れを見続けてきた
- 今回は避けるだけではなく、プログラマーとしてコードを書いて公開する形で、小さな抵抗を試みる
- プロジェクトが完成したり、主流ブラウザになったりする可能性は低いと見ており、助けが得られなければすぐに中断されるかもしれないとも認めている
- 非商用で公開されたブラウザプロジェクトが他の人の刺激となり、より多くの代替プロジェクトにつながることを期待している
ニュース回避がブラウザ開発につながった経緯
- 約10年前、車で顧客先を頻繁に行き来しながら、オランダのBusiness News Radio(BNR)やRadio 1を聴いていたが、ある日ラジオを消して以来、ニュースを再び聴きたいと思わなくなった
- ニュースでは戦争や汚職のような悪い出来事ばかりを繰り返し聞かされると感じ、個人としてその問題を解決する方法はないと考えた
- その後、ニュースを聴くこと、見ること、インターネットでニュースを探すことを避けるようになり、8時のニュースが始まるとチャンネルを変えるか、ニュースが流れている部屋を離れた
- 重要な知らせはいずれ人づてに入ってくると考え、一般ニュースの代わりにRedditの一部サブレディットと技術ニュースだけに限定して触れるようにした
技術ニュースでも繰り返された無力感
- 技術ニュースの98%ほどはY CombinatorのHacker News経由で見ていたが、時間がたつにつれ、10年前に一般ニュースで感じていた感情が再び大きくなった
- 繰り返し目にした問題は、望まないアップデート、約束の反故、サブスクリプション料金の値上げ、企業買収、より多くの個人情報を収集しようとする試みなどだった
- 政府が児童性犯罪者を理由に暗号化を禁止しようとする流れも、同じ問題の一部だと見ている
- ブラウザは世界中のほぼすべての人が時間を過ごす場所であるため、特に重要な対象になっている
- ブラウザ自体が広告を表示するようになれば、サイト上の広告をブロックする広告ブロッカーでは対処が難しくなる可能性がある
- 特定ブラウザ専用の拡張機能によって、他のブラウザではサイトを使いにくくした事例があり、独占問題を避ける方法が生まれれば再び繰り返される可能性があると見ている
自分で作ることにした理由と低い期待値
- 今回は単に避けるのではなく、プログラマーとしてブラウザを自分で開発し、コードを共有できると判断した
- ブラウザを作ることにした理由は2つある
- ごく小さな形であっても押し返すための試み
- 以前からブラウザを自分で作ってみたかったという個人的な理由
- プロジェクトに大きな期待は置いていない
- 完成するとは期待していない
- 手伝ってくれる人がいなければ、すぐに消えてしまうかもしれないと見ている
- 既存の大手ブラウザを打ち倒す支配的なブラウザになるとは期待していない
- 望んでいる姿は、非商用目的でオープンであり、他の人が刺激を受けて自分のプロジェクトを作れる状態である
- プロジェクトの進捗はcodemusings.nlの進捗記事で確認できる
- プロジェクトのリポジトリはjaytaph/gosub-browserにある
1件のコメント
Hacker News の意見
投稿者です。肯定的・否定的・中立的なコメントのすべてに感謝します。いくつか付け加えると、貢献できるブラウザプロジェクトはすでにたくさんあり、そのほうが効率的だというのはその通りですが、そうするとブラウザが数えるほどしか残らなくなります。私は多くのブラウザがあり、人々に選択肢があるほうを望んでいます。
これは明らかに個人プロジェクトです。テック業界にうんざりしていたからだけではなく、いずれ始めていたことだと思いますが、何も変えられないという無力感に腹が立っていて、これが私なりに何かをやってみる方法です。実際にブラウザが完成するとは期待していません。人々が私のコードを見て笑うなり、より良いアイデアを得るなりしてくれればと思っています。たとえば WHATWG のサイトのように、HTML5 トークナイザーとパーサーのアルゴリズムが段階的に説明されていれば、誰でも自分の HTML5 パーサーを書きやすくなります。Google や Microsoft が市場支配力を背景に、クローズドな形式のカスタム HTML5、たとえば ghtml のようなものを作ったら、誰が止められるでしょうか。最初から始めようとしている理由は、下層にある技術的な難しさをもっと知りたいからです。
「ニュース」の悲惨さについての話にも共感します。心理戦ではこうしたものを士気低下(sapping) と呼びます。かつては敵が抵抗の意思をくじき、無力にするためのプロパガンダを行い、古典的な例が Lord Haw-Haw でした。https://en.wikipedia.org/wiki/Lord_Haw-Haw
今日では、主流ニュースチャンネルやテック巨人たちが、人々を永続的な絶望と不安の中に縛りつけようとしているように見えます。テックに関する言説も、冷笑、回避、否定、諦め、学習性無力感の穴のようで、最近インタビューと感情分析を多く行ったところ、結果はひどいものでした。「tech」という言葉そのものが「抵抗は無意味だ」と同義語になっていくように感じます。成功を期待するからではなく、模範を示し、自分の正気を保つために何かをすることは、最も前向きで人間的な反応です。
Linus Torvalds 風に言えば、「GNU のように大きくプロフェッショナルなものを作ろうとしているのではなく、自分のためのものだ」という姿勢で作ると、はるかに少ない労力で多くを達成できます。そうすれば実用的に妥協でき、学習用であれ実用であれ、「製品」を作るときよりもずっと小さな労力で、自分にとって役立つ何かに到達できます。私の個人プロジェクトでも、こうした小さな個人プロジェクトを見つけて一部を再利用し、まったく違う方向へ進んだことが何度もありました。巨大で機能が完備された獣を削ったり合わせたりするより、「十分近い」小さなプロジェクトを拾い上げるほうがはるかに簡単です。ブラウザの複雑さの多くは、すべてのサイトとすべての利用シナリオをサポートしなければならないことに由来しますが、自分のために作るなら、自分が気にするサイトが十分うまく動くようにすることに集中できるので、問題は大きく減ります。もっと多くの人に「不可能な」プロジェクトへ挑戦してほしいです。全体がすぐ他人の役に立たなくても、一部は役に立つかもしれませんし、ときには Linux のように小さな個人プロジェクトからより大きなものが生まれることもあります。
誰かのプロジェクトを無用な時間の浪費だと言うのに使う時間の半分でも建設的なことに使っていれば、世界にはずっと多くの素晴らしく興味深いプロジェクトがあったはずです。まったく試さないより、大胆で野心的なことに失敗するほうがましです。
現代の Web ブラウザのすべての機能を実装する必要はありません。Battery API、Gamepad API、USB のようなものは不要で、重要な HTML、CSS、JS に集中すればよいのです。最悪の場合でも、新しいことを学べます。プロジェクトの幸運を祈ります。
「何も期待していない、終わらせるとも期待していない、手伝ってくれる人がいなければすぐ死ぬプロジェクトだ、市場の巨大プレイヤーたちを倒す支配的ブラウザになるとも期待していない」という言葉は、Linus が comp.os.minix に投稿したLinux 最初の発表に似ています。
「minix を使っている皆さん、こんにちは。386(486)AT クローン向けの自由なオペレーティングシステムを作っています。ただの趣味なので、gnu のように大きくプロフェッショナルにはならないでしょう……」で始まり、bash と gcc を移植済みで、数か月以内に実用的な何かが出てきそうであり、実装を約束はしないが欲しい機能を知らせてほしい、と書いていたあの投稿です。最後には、minix のコードはまったく含まず、マルチスレッドのファイルシステムはあるが移植性はなく、おそらく AT ハードディスク以外はサポートしないだろう、とも述べていました。
プロジェクトがどこまで行くかは誰にも分かりません。そして自分の理由でやっていることなら、ある意味ではそれは重要ですらありません。
ブラウザとオープンなWebについて、HNでここまで否定的な雰囲気になるのは見慣れない。成功するかどうかに関係なく、非常に価値ある試みだと思う
成果物が巨大テック企業の動機に左右されない半端なブラウザにすぎなかったとしても、いつかFirefox依存をやめなければならない時が来たら役に立つかもしれない。Firefoxはとても好きなので、そんな日が来ないことを願っているが、Webにアクセスするとき、自分のブラウザが一種のボトルネックになっていると気づいた。同じコンテンツを見られる別のWebサイトもあるし、使える別ブランドのコンピュータもあるが、間にはいつもFirefoxがある。他のブラウザもあるが、たいていはGoogliumだか今では何という名前だか、その系統に見える。だから健闘と成功を祈りつつ、RSSフィードを購読して、ときどきプロジェクトをのぞいてみるつもりだ
実際には可能だという証拠もある。Ladybirdはゼロから作られ、もともとはC++標準ライブラリまで自作しており、3〜4年のパートタイム作業を経て、今ではDiscordも遅いながら動かせる。現在はフルタイム開発者もいる。GoSubはcargo.lockを見る限り、すべてをゼロから実装しようとしているわけではなさそうで、画像デコーダーのようなものは既製品を使う可能性が高く、より速く成長する潜在力もありそうだ
今「ブラウザをゼロから書く」というのは、実質的には箱の中のポータブルOS、つまりWebプラットフォームを実装し、Googleが自社ブラウザに追加することにしたものと互換にする、という意味に近い
ブラウザは機能とAPIがあまりにも膨大で、Googleの絶え間ない機能変更と支配力に追いつくのは難しく、Microsoftでさえ成し遂げられなかった。関連する個人プロジェクトとしてTersenetがある。 https://github.com/runvnc/tersenet
ほとんど実装のない概念に近いが、人々が実装できるように要件を意図的に選んでいる。完全なWebブラウザよりはるかに複雑さが少ない。GPT-4との関連議論もある。 https://chat.openai.com/share/16d02b78-f876-4c87-949a-a60b4f...
実在し実用的なGeminiプロジェクトも関連している。 https://geminiprotocol.net/ Tersenetのアイデアに着想を与えた
WebSQL、IndexedDB、サービスワーカー、WebGL、WebGPU、WebBluetooth、WebRTCのようなものは、全部存在しないかのように振る舞えばいい。実際のWebサイトの99%、Web「アプリ」ではないサイトは、機能を失わないはずだ
個人的には、Blinkとその親戚であるWebKitのモノカルチャー、そしてGecko/Quantum以外にも代替エンジンがもっとあるといいと思う。WebKitに吸収される前にKHTMLが占めていた場所を代替する何か、あるいは実験できるもう一つのオープンソースの選択肢があるといい
この考えに大いに賛同する人たちが、使うサブセットについて合意してくれるとよいし、Googleブラウザがやることをすべてやらないブラウザでも満足できる。私はuMatrixでGoogle機能のかなりの部分をオフにし、google.comドメインは絶対に許可リストに入れず、それでも世界は終わらないと証明するように使っている。動かないサイトは相対的に少数だ
大多数のWebサイトは、Google専用に最近作り出された広告技術、AMP、DRMのようなものに従いたいとは思っていない
Mozillaや他のところが、誰もが使える独立したJavaScript「VM」を作るべきなのかもしれない
「本物の」ブラウザがどう動くのかまったく知らなかったが、自分でブラウザを書くことにした者として、それもカスタムレイアウトエンジンまで作った立場から、ただやってみればいいと言いたい
自分のコードでWebサイトがレンダリングされるのを見るのは、コードや出力がどれほどめちゃくちゃでも、とてもやりがいがある。私のプロジェクトは2年半ほど経ち、今ではHNと簡単なブログをそこそこレンダリングできる。もともと置き換えようとしていたw3mより客観的に優れているかというと、必ずしもそうではなく、まだいくつかの作業ではw3mに戻っている。それでも思いがけない作業に役立っているし、プログラミングについて多くを学べたし、何にせよ動くというのは素晴らしい。 https://sr.ht/~bptato/chawan
ブラウザを作るということは、レンダリングエンジンとレイアウトエンジンを作るという意味。できないことではないが、かなり大きな仕事ではある。
ただし、もっと実りのある可能性が高いことも多い。Servo を Nyxt Browser に移植したり、WebKit/Servo/Gecko をフォークして、この10年で広告会社が注入してきた、ユーザーに有害な侵襲的 Web 標準を取り除くこともできる。どうせゼロから作るならやらなければならない作業なのだから、最初から始めるより、すでに一緒に取り組む意思のある既存コミュニティから始めるほうがよい。
Gecko はモノリスの定義に近く、攻撃面を取り除くのは不可能で、Tor でさえ内部 API やブリッジの変更のたびに壊れる、ひどいスタブ差し替え方式を使っている。ただし、アップストリームに一人で追随するのは不可能なので、コントリビューターとメンテナーが必要。サイバーセキュリティの観点から攻撃面をできる限り文書化し、残作業と最終的に削除すべきものを書き留めている。 https://github.com/tholian-network/retrokit/blob/main/SECURI...
RetroKit を自分の Browser Stealth の WebView として使いたいので、かなり主観的かもしれない。Browser Stealth はフィルタリングプロキシ、スクレイパー、分散キャッシュとして動作する。 https://github.com/tholian-network/stealth 現在 golang で書き直し中。
https://github.com/pop-os/cosmic-text のようなテキストレイアウトエンジンと組み合わせる必要があり、まだすべての機能をサポートしているわけではない。現時点で欠けている代表的な機能は
float、display: inline-block、box-sizing: content-box、position: static。ただし Block、Flexbox、CSS Grid はサポートしており、さらに追加中。大仕事なのは確かだが、献身的な小規模チームにとって最も不可能なこと、とまではいかない。
まずは合理的に単純な HTML サイトをレンダリングすることから始めればよく、急ぐ必要もないし、標準の隅々まで実装しなければならないという厳格なルールもない。Web ブラウザと Web は、見事なまでに人間的だ。
既存のエンジンを持ってきて接続し、いつでも差し替えられるほどモジュール化しても、それでも十分に本物のブラウザだ。個人的には、ここの人たちは内部の歯車に集中しすぎているように思うし、実際にはレンダリング/レイアウト/スクリプティング以外にも、よりよいインターフェースと他の構成要素が必要だ。
応援している。ぜひ続けてほしい。
Python で ORC Solver アルゴリズムのごく小さな一部を実装し、レンダリングには wxWidgets を使った。テキスト幅を計算するために wxWidgets のテキスト範囲 API を使った。ORC Solver のホワイトペーパーはこちら。 https://yuejiang-nj.github.io/Publications/2020CHI_ORCSolver...
分枝限定法(branch and bound)をどう実装するか考えているところなので、関連情報があるとありがたい。組版アルゴリズムを見るには TeX のコードベースを研究する必要がありそうだし、レイアウトのビンパッキングには JavaScript ライブラリ Masonry を使うのもとても面白かった。
「俺の HTML が欲しければくれてやる! 探してみろ! この世のすべてをそこに置いてきた」
「かくしてハッカーたちは夢を追って HyperText Line を目指し、世界は真の大ブラウザ時代へと突入した!」
何年もの間、ブラウザは越えられない山だと信じていたが、今では私たちにもできると信じる人がますます増えているようだ。2秒で考えた分析では、新しいブラウザ制作者たちは既存の巨大な怪物をまねて競争しようとしているのではなく、Web を変えたいからこそ、こうした流れが見えているのだと思う。気に入っている。
文章の政治的な部分については、世界は壊れていて、壊れたニュースばかり読むのは疲れること。ただし、現実から切り離されて「非政治的」になるのは、人類を諦めること、つまり自分の子どもや甥・姪、親友たちの子どもを諦めることだと思う。
世界を変える必要まではなく、自分のコミュニティの小さな変化だけでも十分。特にコーダーとして、私たちが作るものは世界中の何千人にも影響を与え、方向を変え得る。全員が時間の3〜5%だけでもコミュニティ支援や何らかの活動に投資していたら、状況は違っていたのだろうかと時々考える。
ニュースで読むどんなことも自分の投票行動を変えることはないだろうが、それこそ実はニュースを見る最も良い理由なのだろう。
言ってみれば、私は世界を諦めた。ただし、他人の子どもは私の責任ではない。「正しいこと」をしようと他の人たちと同じくらいはやるが、それ以上はしない。以前はこうしたことに悩み、個人のフットプリントを減らそうとし、持続可能性や将来世代のことも考えていたが、希望を失った。潮流に逆らって戦っているような感覚だった。今は自分のフットプリントが平均より大きくならないようにし、周囲の人たちに親切にしようとしているだけ。
Rustが必須なら、Servoに貢献しながら小さなPRから送って学ぶほうが有益そう。https://github.com/servo/servo
ただ、既存のコードベースを読むのが難しかったり、自分ならもっとうまくやれると思ったりして「ゼロから」プロジェクトをやってみたことがあるので、気持ちは分かる。人それぞれのやり方があるものだ。
同様に、ServoはFirefoxブラウザの一部を置き換えるよう設計されていて、「Geckoの形をした」穴にはまる必要があった。たとえばFirefoxの他の部分との互換性のために、複数の箇所でUTF-16文字列を使っている。今なら現代的なRustでServoを書き直して、より小さく、軽快で、おそらくより高速にできるかもしれない。