2024 年、私は仕事を探していました。コミュニティコンサルタント としてサービスを提供することを決めました。しかし、主に人々が関心を持っていたのは、Discourse サイトの修復や更新に関する技術的なサポートでした。ある潜在的なクライアントは、アカウントを持たない人々がフィードバックを送信するための連絡フォームを追加できるか尋ねました。調べてみたところ、それは 不可能だ と結論づけました。しかし、私は十分な余暇があり、プラグイン開発者チュートリアル に従って何ができるか試してみました。最終的に、連絡フォームプラグイン を開発し、そのクライアントと契約を結びました。[1]
ここで皆さんに明確にしておきたいのは、私はフロントエンドプログラマーではありませんということです。私がどんな種類のプロフェッショナルなプログラマーだったのは 13 年前のことです。HTML フォームの作り方は知っていますが、それが私の知識のほぼ全てです。そのため、チュートリアルの Ember と Handlebars のセクション で苦労し、なんとか機能するハックを組み立てました。幸いなことに、私はテンプレートシステムに慣れていたため、以前の職場でそれらを使用していました。
私は OpenSSL Foundation で仕事を見つけ[2]、ほとんどクライアントを諦めました。しかし、私がプラグインを作成したクライアントは、私の仕事を高く評価してくれたため、リテイナー契約を続けてくれました(彼のためにいくつかの無関係なプロジェクトも手掛けました)。リテイナーを得るために、彼の Discourse サーバーをアップグレードすることにしました。そこで私が目にしたのは以下のエラーでした:
実は、これはクライアントのサイトには表示されていませんでした。なぜなら、私は愚かにも連絡プラグインを ステージングサイト にインストールはしたものの、有効化していなかったからです。そのため、すぐに セーフモード を起動し、プラグインを無効化しました。先週末、何が間違っていたのか、そしてクライアントのためにどう修正できるのかを調べるのに時間を費やしました。
いくつか検索した結果、テーマとプラグインにおける .hbs ファイル拡張子の非推奨化 という記事を見つけました:
Discourse の最新バージョンでは、テーマやプラグインで
.hbsファイルを使用することは非推奨となっています。このファイル形式のサポートは、次の ESR リリース後に削除されます。
これは 3 月のことでした。つまり、私が ESR リリース を使用していた場合、基本的には 9 月末まで修正する時間があったはずです。しかし、私の Discourse 設定は「tests-passed」[3] を使用しているため、数ヶ月早くエラーが発生したようです。
いずれにせよ、修正しなければならない(そうでなければクライアントを失望させることになる)ため、テーマとプラグインを .gjs ファイル形式に自動的に更新する という手順に従って飛び込みました。最初のステップは、開発環境をインストール することでした。なぜなら、最後にこれを試したとき 以来、ラップトップを変更していたからです。[4] ついに Discourse を起動し、プラグインがローカルで壊れていることを確認した後、lint プロセスを実行しました[5]
$ pnpm eslint --fix .
/Users/jericson/src/discourse-contact-plugin/assets/javascripts/discourse/components/contact-form.js
1:8 error Use Glimmer components(@glimmer/component) instead of classic components(@ember/component) ember/no-classic-components
3:16 error Native JS classes should be used instead of classic classes ember/no-classic-classes
3:16 error Please switch to a tagless component by setting `tagName: ''` or converting to a Glimmer component ember/require-tagless-components
20:3 error Use the @action decorator instead of declaring an actions hash ember/no-actions-hash
✖ 4 problems (4 errors, 0 warnings)
プラグインを変更しなければならないのは面倒ですが、少なくとも lint プロセスによってコードを整理し、現代的な形にすることができました。しかし、.gjs への変換を試みると自動スクリプトが失敗しました。そこで、https://ask.discourse.com/ を試してみることにしました。
そこでは 12 件の質問を投稿しました。これらは人間には共有したくないほど、次第に苛立つプログラマーのあがきのようなものです。ある時点で、ボットは私のサブ問題のうちの 1 つに対して「より堅牢で現代的なアプローチ」を提案しましたが、それには . . . .js ファイルと .hbs ファイルが含まれていました。
なぜこれが起こるのか理解しています。これは Meta Discourse の議論に基づいてトレーニングされており、まだ多くの投稿に Handlebars コードが含まれています。その中には 公式のプラグイン開発者チュートリアルの第 2 部 も含まれています。その内容は時間とともに更新されるでしょうが、アップグレードに関する 公式のアドバイス が Meta Discourse で質問するのではなくチャットボットに尋ねるようになっているため、もう少し時間がかかるのではないかと心配しています。
文句を言うべきではないかもしれません。それは私のコードを整理するのに役立ち、人間に尋ねるよりもおそらく摩擦は少なかったでしょう。
プラットフォームの安定性
私は現在 OpenSSL Foundation で働いています。Heartbleed のことで OpenSSL についてご存知かもしれません。それは至る所で使われています。最も人気のあるダウンロードバージョンは 1.1.1 で、2023 年にライフサイクル終了 (EOL) に達しました。次に人気があるのは 3.0 で、2021 年にリリースされましたが、Long Term Support (LTS) リリースとしてまだサポートされています。次は 3.5 で、最新の LTS です。これら 3 つのリリースは、GitHub からのダウンロード のほぼ 3 分の 2 を占めています。
これは少しがっかりです。なぜなら、3.5 にはいくつかの新しい機能 があるからです。しかし、結局のところ、人々が最も気にする機能は SSL/TLS と 暗号プリミティブ の組み合わせです。量子耐性暗号アルゴリズムに興奮しない限り、アップグレードの痛みをできるだけ先送りするでしょう。
もちろん、OpenSSL は Discourse よりもはるかに下位のスタックにあります。しかし、原則は同じです。新しい機能がない限り、人々は破壊的なアップグレードに興味を持ちません。皆さん が Discourse に追加された新しい機能に興奮していることは理解しています。後で最適化を得るために API を変更したい という気持ちもわかります。ただ、動きが速すぎると、コミュニティが構築されるプラットフォームとしての Discourse に悪影響を与えるのではないかと心配しています。
そういえば、Gardening Platforms という非常に有用なスライドデッキがあります。これは Alex Komoroske によって作成されました。スライド 90 は「プラットフォーム+エコシステム」というセクションの始まりで、プラットフォームがそのエコシステムと共進化しなければならない方法を説明しています。この場合、Discourse は、プラグインやテーマのデザイナー、ホスティングサービス、Meta Discourse コミュニティ、そして Discourse 上に構築されたコミュニティを支えるプラットフォームです。スライド 98 のスピーカーノートからの重要な洞察:
しかし、それらは独立しているわけではありません。相補的に関係しています。
一方で行われる行動は他方に影響を与え、その逆もまた同様です。両方向にそれらを結びつけるフィードバックループと考えてください。
彼らは厳密に結びついているわけではなく、それらを結びつけるゴムバンドのようなものです。重力のような引力です。
プラットフォームとエコシステムが互いに対して速すぎると、その絆は破れ、壊滅的な結果を招きます。私は Discourse がエコシステムに対して正しく行動すると信じています。ただ、先週末のような週末には、その信頼が揺らいでいるように感じられます。
私は、それが最終的に 比較的静的なサイト になってしまったにもかかわらず、自分の仕事にほどほどに誇りを持っています。 ↩︎
伏線! ↩︎
これも 更新される必要があります ↩︎
Redis と Rails のインストールは、私が覚えているよりも難しかったです。 ↩︎
ただし、その前に
eslint.config.mjsを 取得することに失敗して多くの時間を費やしました けども: ↩︎

