今年のオープンソース活動振り返り @ 2022
2022年のオープンソース活動の振り返り記事です。
今までの振り返りの一覧です。
- 今年のオープンソース活動振り返り @ 2021 | Web Scratch
- 今年のオープンソース活動振り返り @ 2020 | Web Scratch
- 今年のOSS活動振り返り @ 2019 | Web Scratch
- 今年のOSS活動振り返り @ 2018 | Web Scratch
- 今年のOSS活動振り返り @ 2017 | Web Scratch
- 今年のOSS活動振り返り @ 2016 | Web Scratch
- 今年のOSS活動振り返り @ 2015 | Web Scratch
- 今年のOSS活動振り返り @ 2014 | Web Scratch
2022年のGitHubのPublicなContributionsは7000~8000ぐらいを推移していました。
Privateリポジトリも含めると大体1.5倍ぐらいなので、あんまり変わってない感じがします。
データの取得には次のツールを使いました。
Issue/PR
- 作ったリポジトリ数: 53
- 作ったIssue: 231
- 作ったPR: 318
グラフにすると次のようになってます。
Notion Plotlyを使って作成しています。
"https://notion-plotly.netlify.app/line.html?"+
"Repository.y=" +prop("Repository") + "&Repository.x="+prop("Year") +
"&Issue.y=" +prop("Issue") + "&Issue.x="+prop("Year")+
"&PR.y=" +prop("PR") + "&PR.x="+prop("Year")+
"&sortBy=x"
2022年は、新しいものはあんまり作れてなくて、既存のものを大きく更新する方に時間を使っていた感じがします。 JavaScript Primerやtextlintに大きく更新を加えていた感じがします。
作ったリポジトリ
作ったリポジトリを眺めながら、今年の活動を振り返ってみます。
- azu/komesan: View comments about the site
- Komesanというはてぶ、Twitter、HackerNewsのコメントを見るツールです
- Komesan: 指定したURLに関連するはてなブックマーク、Twitter、HackerNewsのコメントを表示する | Web Scratch
- Cloudflare PagesとRemixを使ってみたくて作ったシンプルなツールですが、結構使ってます。
- モバイルでも同じようにみれるようになってて、便利。
- Remixは自分専用のアプリでもかなり使ってて、個人専用ならCloudflare Workers KVSで大体間に合うので便利です。
- トランザクションロックがなくてもなんとかはなるので… Durable Objectsを使うとDistributed-Lockを作れますが。
- Cloudflare Pagesにデプロイすれば、ネットワークとしては最速になるので、個人用途だとスケールをあんまり気にしなくていいため最適な感じはしてます。早い、安い、簡単
- Pub/SubやD1とCloudflare Workers and micro-frontends: made for one anotherあたりを実際に動かすアプリケーションも作ってみたいなと思ってます
- jser/product-name: An API that provide product/library name for a URL.
- JSer.infoのデータセットから、JavaScriptのライブラリ名とかプロダクト名を取得するAPI
- Deno Deployで動いています
- https://jser-product-name.deno.dev/
-
$ curl https://jser-product-name.deno.dev/ [{"name":"jQuery Mobile","url":"http://jquerymobile.com"},{"name":"jQuery","url":"http://blog.jquery.com"},{"name":"Node","url":"http://blog.nodejs.org"},{"name":"Bootstrap","url":"http://blog.getbootstrap.com"}, ...]
- Deno DeployはこういうシンプルなAPIを作って置く場所として便利な気がします
- Cloudflare Workersだとちょっとデプロイまで面倒だったり、こういうかき集める的なCPU使う処理は向いてない感じもする
- このAPIは、PostemでJSer.infoにデータを溜めるときに使ってます。
- このAPIでリリースページのURLからライブラリ名を取得できるので、自動的にリード文を作っています
- バージョン番号とかは書き間違えることが多いので、そういうミスがなくせます
- この辞書は結構便利で、JSer.infoで使ってるので新しいものも増えていくので何か使い道がありそうな気はしています
- honkit/honkit-plugin-ga: HonKit plugin for Google Analytics 4.
- HonKitのGA4プラグイン
- azu/fz-browse: fzf-like fuzzy finder tool but view search results on browser.
- fz-browse: fzfライクな自由度の高いインタラクティブな検索ツール、ただしブラウザに表示する | Web Scratch
- 元々、ローカルのPDFやepubを全文検索したくてそれを汎用ツールとして作ったもの
- fzfみたいにコマンドを組み合わせて使うけど、そのUIはブラウザのGUIでやるという仕組みです
- 結構仕組み的にSteam使ったり、ReactのuseTransitionを使ったりと面白いことしてた気がします
- とりあえず電子書籍の検索問題がある程度解決できたのでよかった
- security-alert
- GitHubのSecurity AlertをIssueとかコメントにしたりするツール群
- 色々PR受付けていたら、Organizationに移動してた
- textlint-rule/textlint-rule-pattern: A textlint rule that checks by RegExp patterns.
- textlintで汎用的に正規表現でチェックできるルール
- 汎用性がかなり高めなルールなので、使うタイミングが難しそう
- @secretlint/secretlint-rule-pattern - npmがあるけど、textlintにはないので作った
- packemon issues
- CJSとESMのdual packagesに対応するツールは実際ほとんどなくて、Packemonはそれをやってたのでひたすらバグレポートしてた
- azu/packemon-require-filed-missing
- azu/packemon-cjs-issue: test
- azu/packemon-mjs-__dirname-error
- azu/packemon-native-dynamic-import
- azu/packemon-cjs-and-mjs-wrapper
- azu/packemon-input-main-issue
- azu/packemon-build-formats
- Node.js
exports
フィールドはあまりにも難しすぎて設計的に破綻してる感じがした - ツールの対応がバラバラすぎて、正解がない感じになる
- azu/file-cache: Node.js library that provide a cache for file metadata or file content.
- Node.jsのツールで–cacheフラグを実装するためのライブラリを書いた | Web Scratch
- ESLintとかPrettierとかいろんなツールはファイルキャッシュを実装してるのだけど、それが毎回手作業すぎるので、ライブラリを書いた
- このライブラリにPackemonとmoonを使ってdual packageに対応してる
- 🌕 moonでのmonorepo管理とpackemonでのCJS/ESMのdual package
- これに関係して、npm 6 + npx + corepack + dynamic import + macOS/Linuxで動作がおかしい問題に遭遇した(未解決、workaroundはnpxを使わない)
-
[ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING]: A dynamic import callback was not specified.
- https://twitter.com/azu_re/status/1603248810720829440
- azu/javalin-cors
- JavalinというJava/Kotlin向けのWebフレームワークで、CORSのセキュリティIssueがあったので作ったPoC
- 具体的には、リクエストOriginをそのまま
Access-Control-Allow-Origin: <request origin>
として返すオウム返しのヘッダ問題があった - Same Site Cookie以前は、これがあるとセッションハイジャックとかに繋がっていたけど、調べてみるとSame-Site: Laxではこの問題の影響は自動的に軽減されてた
- CORS: “Allow All Origins” implemention in major framework
- このオウム返し問題はJavalin 5.0で修正された
- Javalin 5.0 stable is ready! - Javalin - A lightweight Java and Kotlin web framework
- Migration guide, v4 to v5 - Javalin - A lightweight Java and Kotlin web framework
- azu/bi-epub-reader: Standalone Epub reader using Bibi.
- BibiとElectronを使ったEpubビューア
- Maintainer Month: epubリーダーアプリ bi-epub-readerを作った | Web Scratch
- BibiはJavaScriptで書かれたEpubリーダ
- Epub.jsより表示は綺麗で縦書き対応してたりする
- 一方でBibiはAPIがほぼドキュメント化されてなくて、ソースコードを読みながら探り当てる感じ
- https://github.com/satorumurmur/bibi
- リバースエンジニアリング的な作業だったので、今年読んでて一番難しいコードだったと思う
- プログラミングよくわかってないとき、こういうひたすら実行して動作を割り出していく作業をよくやってた気がする(試行回数で突破する)
- 他にもBibiを使ったものを作ってたので、やっと表示してるテキストを取得する方法とかページ番号を取得とか色々わかった気がする
- どこでも動くメモ付きのepub/pdfリーダ作りたいので、来年また挑戦する気がする
- azu/github-advisory-database-rss: GitHub Advisory Database RSS Feeds.
- GitHub Advisory DatabaseのRSSをGitHub Actionsで作ってる
- RSS Feeds for GitHub Advisory Database
- ライブラリの脆弱性情報は大体これみてる
- honkit/honkit-plugin-sandpack: A HonKit plugin for Sandpack
- HonKitのSandpackプラグイン
- JavaScript Primer - 迷わないための入門書 #jsprimerで使って、ブラウザ上でアプリをそのままいじって編集できるエディタを埋め込んでる
- Ajax通信 · JavaScript Primer #jsprimer
- Todoアプリ · JavaScript Primer #jsprimer
- これでjsprimerに載ってるコードで、ブラウザ上で実行できないのはNode.jsぐらいになった
- やっぱり学習するときはコード実行しないとわからないので、それのイテレーションをできるだけ小さくしたい
- Sandpackはちょっと制約があって扱いにくいけど、よくできてる
- 内部の実装(テンプレート)をちょっと気にしないと扱えないけど、UI的に必要なものは大体あるという感じ
- azu/book-review: 本を読んだ感想を書くブログです。
- 今年作ったわけじゃないけど、GitHub Releasesをブログにするアイデアを扱ってる
- 1クリックで始めるGitHubリリース as a ブログ | Web Scratch
- GitHubの機能を色々使って遊んでるけど、GitHub Releasesをブログにすると結構面白くて、意外と実用的
- GitHub Actionsと組み合わせると、ワークフロー的な拡張性はかなり高くて、始めるのはとりあえず簡単なのがいい
- ブログって作ると作ったきり放置なので、コンテンツだけを管理ぐらいの方がいいなーと毎回思ってる
- azu/amazon-cover-markdown: Copy Amazon Image as a Markdown code
- Amazonの書影のMarkdownコード取得するだけのツール
- これもDeno DeployとFreshで作ってる
- fresh - The next-gen web framework.
- Fresh 生成するコード多すぎてDenoっぽくないとか触ってて思った
- azu/kindle-highlight-to-markdown: Convert Your Kindle highlight & Note to Markdown/JSON
- KindleのメモをMarkdownに変換するライブラリ
- KindleのメモとハイライトをMarkdownにするJavaScriptライブラリを書いた | Web Scratch
- こういうのとりあえずnpmにpublishすれば、ブラウザからESMとしてロードして使えるようになったので、ブックマークレットもなんか作りやすくなった気がする
- azu/url-cheatsheet: URL manipulation cheatsheet for JavaScript
- [JavaScript] URLを文字列結合で組み立てないために、url-cheatsheetを作った | Web Scratch
- URLとURLSearchParamsが便利だよって書きたくて作った
- 実際URLに
String.prototype.replace
とか文字列結合でURLを組み立て脆弱性を作ってるケースはたくさんみてるので、それをどうにかしたかった
- secretlint/secretlint.github.io: Secretint Demo Site. Online Checker
- https://secretlint.github.io/
- Secretlintでこれ検知できるっけ? と思ったときにCLIを叩くのが面倒だったのでブラウザで動くページを作った
- CodeMirror(6+)を使ってるけど、1時間ぐらいでLint付きのエディタできて便利だった
- ただAPIが小難しいので、Exampleがもっとたくさん欲しい
- これブログ書いたつもりで書いてなかった
- SecretlintはGlobal Hookに入れてるので、常に動かすようにしてる
- azu/git-hooks: @azu’s global git hooks
- なので、ちょこちょこアップデートできてる気がする
- Secretlint 5をリリースした。SARIF形式の対応、Configのバリデーション強化、Slackのxapp-トークンの検出に対応 | Web Scratch
- やっぱり使わないとアップデートしなくなる
- この辺の話は Maintainer Month: オープンソースをメンテナンスするコツ | Web Scratch で書いた
- azu/notion-plotly: Create embed graph page from Notion Database.
- Notionのデータベースのデータを可視化するグラフURLを作成する | Web Scratch
- Notionにグラフがない + 外部データ渡したくない -> 作ろう
- URLにデータを持たせてグラフ表示するだけのサイト
- ペライチなサイトなので、適当にコード書いて作ってる感じ。こういうのJSのいいところだなーと思う
Maintainer Month
GitHubが6月にMaintainer Monthというイベントをやってて、6月の後半になってその存在に気づいた。
気づいたのは、GitHubからスポンサーされて通知が来てたからだったと思う。
自分もMaintainer MonthでGitHub Sponsorsの対象だった。https://t.co/gOU8eE79ta
— azu (@azu_re) June 25, 2022
Thanks to @github, Sponsors, and Maintainers 🎉 pic.twitter.com/EDqEbB2Hkq
オープンソース活動の透明性について色々考えていたので、色々書いてみるかーと思って1週間で5記事ぐらい書いた。
- Maintainer Month: オープンソースのメンテナーがやっている仕事 | Web Scratch
- Maintainer Month: なぜtextlintを作ったか | Web Scratch
- Maintainer Month: オープンソースをメンテナンスするコツ | Web Scratch
- Maintainer Month: epubリーダーアプリ bi-epub-readerを作った | Web Scratch
- 初めてでもわかる、GitHub Sponsorsでオープンソースを支援する方法
オープンソース活動と支援のスタンスはこの辺でも色々書いている。
自分の生活の中にはオープンソースがある気はしているけど、オープンソースに生活は依存しないようにしてる気もする。 これは、“オープンソースと報酬”の話でよくある反応だけど、オープンソースだけで生活できるだけの報酬が(まだ)得られないみたいな反応を見る気がする。
個人的には、報酬の金額を別にしても、趣味的なオープンソースの報酬だけで生活するのは健全的にやるのが難しいと思ってる。 生活がその報酬に依存してる場合、その報酬がなくなると生活が止まるので、それは実質仕事としてやらないといけないということになる。 GitHub Sponsorsとかは特にそうだと思うけど、オープンソースのスポンサーとは別に契約書を結んでいるわけじゃないので、スポンサーをやめるのは自由だと思う。 普通の仕事なら契約を結んだり労働法での保護があるので、突然止まった場合も対応ができるけど、そうじゃない場合は突然止まってしまう。
なので単純に同一なもの(十分な金額があるから生活できる)と扱うのは難しいと思ってて、精神的にもそういう意識でやるものは別のものとなる気がする。
GitHub Sponsorsの募集を始めてから2年が経ったので振り返るでも書いていたけど、 基本的な生活費は労働で稼いで、消耗品の費用負担とかをオープンソースで稼ぐくらいのバランスの方が良いのかなと思う。
このバランスを変えようと思ったら、趣味的なオープンソースを労働として扱うように変化するとかになっていく気もする。 もしくは、趣味の範囲を拡大解釈してしまうとかもありそう(自分はこっちのタイプ)。
JavaScript Primer
2022年の前半は、jsprimerのES2022対応をやっていてECMASCriptのアップデートに合わせてリリースできた。
- jsprimerのES2022対応中、コントリビュート歓迎です | Web Scratch
- JavaScript Primer 4.0.0: ECMAScript 2022に対応したJS本 | Web Scratch
Sandpackを使ったエディタとかも組み込んだので、色々学習しやすくなったと思う。
あとは、来年はJavaScript Primerの出版版を改訂する予定なので、その改訂作業をやっていた。 全体的に見直して、リファクタリングしたり、図を追加したり、コードを更新したりしている。
2019年ごろの初版リリース時に 読んだことあるよーって人向けの、リリース時からの差分です。
— azu (@azu_re) December 23, 2022
ほとんどの章に手を入れたり、現代に合わせて色々Deprecatedにしたり書き換えたりしています。
詳細は https://t.co/UqxiRNKPeF pic.twitter.com/JuVq5emqEZ
こういう文章のリファクタリングが気軽にできるのは、textlintとpower-doctestで大量のテストを作ってるからな気はします。 一方で、文章に対して新機能をPull Requestをする人はやっぱり少ないという現状があるので、これをどうにかしたい。
来年はJavaScript Primerのメンテナンス体制の仕組みを作っていきたい。
今考えていることとしては、Open Collectiveなどでスポンサーを募集して、そのスポンサーの費用をjsprimerの更新のための資産として扱うというのを考えている。 JavaScript Primerは、毎年ECMAScriptのアップデートに合わせて更新していて、その対応に大体1ヶ月分ぐらいの作業時間がかかるイメージ。 その1ヶ月分の作業となる費用を目標値に設定してスポンサーを募集し、その費用でメンテナンスできる人を増やしていく、というのが考えている仕組み。 (LiberapayやOpen Collectiveを触ってみたいという理由もあります。Open Collectiveはちっちゃい会社みたいだなと思った)
個人というよりは企業がスポンサーになるイメージで、何かいいバランスの仕組みがないかなと考えている。 Railsガイドの協賛プランとかの話は、だいぶ近いのかもしれない。
実際にデータがまだ整理されてないので、それを整理するところから始める気がします。 実際にスポンサーすることで何かができると嬉しいのかやデータとして何があると嬉しいのかとか、その辺がわかってないので興味ある方は [email protected] または @azu_reへ連絡してください。 (会社でよく参照されてますとかそういうレベルでもいいです)
jsprimerのアクティブユーザー数は大体月2万人
この話は先ほどの個人のオープンソース活動とはちょっと別で、チームとしてのオープンソース活動について考えていて出てきた内容です。 ソフトウェア中心のオープンソースの中でも深く参加する人が少ない印象のドキュメント系(翻訳はちょっと例外っぽい)のオープンソースについて、どうしたらより多くの人が参加できるかを考えたいです。 ソフトウェアはメンテナーが交代するのはよくあることなのに、文章や書籍は著者が変わらないのは不思議だなーと思って考えていました。
textlint
textlint は、Node.jsのESM対応という難題に対処し始めました。
ESMは非互換性がとにかく広くなりがちなので、フラグで切り替えられるようにして、古い実装と共存できる方針で対応しました。 CLIの場合はあまり気にすることはないですが、パッケージとして参照される場合の非互換性はかなり広いと改めて思いました。
v12.3.0で中身をかなり書き換えているので、だいぶスッキリした気がします。 古い実装が消せれば、かなりメンテナンスしやすくなるんじゃないかなと思います。
これは、5年ぐらい前にmonorepoにしたりTypeScriptにしたりした時のリファクタリングがなかったらできなかった気もします。
このときに関数に対するユニットテストは脆い部分があるのがわかって、CLIというインターフェースに対するテストを追加してました。
また、実際のパッケージを使ったテスト(Example Testと呼んでいる)や実際にtextlint
を使ってるプロジェクトに対するE2Eテストなども増やしていました。
これらのレイヤーの高めなテストがあったので、今回の内部実装を丸っと切り替えるときに同じテストがほとんど使えて、かなり安心して実装できた気がします。
textlint自体をESM化するというのもやりたいので、ここに興味がある人は是非言ってください。 多分、もう技術的な問題はないので、あとは書き換えていくのをどうやるかという話になると思います。
その他
今年は習慣を変えたり、昔から引っかかってたものをだいぶ整理してた気がします。 あと旅行というかワーケーションみたいなことをよくやってたので、33/365ぐらいは家にいなかったみたいでした。
特にコード的に何かあるわけじゃないですが、Notionを使って整理することが増えたかなーという感じがします(NotionはDBとして認識してる)。
- 買ってよかったもの、使ってよかったもの @ 2022 | Web Scratch
- メールの受信トレイを空にするInbox Zeroを始めた | Web Scratch
- パスワード管理/MFA管理の戦略 | Web Scratch
- ディスプレイを鏡の代わりにして、鏡のスクショ画像をNotionに記録できるようにした | Web Scratch
あとは、オープンソースとセキュリティはかなり近くなってきてるので、メンテナーがそれを考えないといけない感じになっている気がします。
この辺は、うまくカバーできないと負荷が集中しやすい領域なので、その辺は常に見ておきたいです。 1Password for Open Source Projectsの申請をしたとかも、使うものはちゃんと使うというところからスタートしてる気がします。 パスワード管理/MFA管理の戦略とかに取り組んだもの、ずっと頭に残りがちなやつだったためです。
Open Source向けのプラン
次のサービスでオープンソースのメンテナー向けのプランを利用させてもらっています。
- Netlify: オープンソースプランを利用させてもらってる
- 1Password: オープンソース向けのチームプランを利用させてもらってる
- GitHub Copilot: オープンソースのメンテナー向けの無料プランを利用させてもらってる
まとめ
毎年、その時に思ってることをとりあえず書いてるだけなのでまとめはないです。
- オープンソース、JavaScript Primerのメンテナンス、透明性について考えたい
- textlintのESM対応を完了させる
- 新しいものを作る
- 本を読む、聞く、書く
- オープンソースとセキュリティとメンテナーの関係を考える
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。