今年のオープンソース活動振り返り @ 2023
2023年のオープンソース活動の振り返り記事です。
2023年のオープンソース活動の振り返り記事を書きました!
— azu (@azu_re) December 31, 2023
- textlint/secretlint: 継続的にアップデート
- jsprimer: 第二版の改訂出した、Open Collectiveやっていきたい
- Notionに色々集約するツール書いてた
"今年のオープンソース活動振り返り @ 2023 | Web Scratch"https://t.co/iwUCQfFWiu pic.twitter.com/7qgDjitpQm
今までの振り返りの一覧です。
- 今年のオープンソース活動振り返り @ 2022 | Web Scratch
- 今年のオープンソース活動振り返り @ 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
2023年のGitHubのPublicのContributionsは13020となってますが、これGitHub Actionsで自動更新してるコミットに自分のアドレスを使ってたせいで無駄に増えてしまってます。途中で気づいてBotのアドレスに変更したので、真ん中の濃いところは多分余計なコミットです。
余計なコミットを除外すれば、あんまり変わってないと思います。
Issue/PR
- 作ったリポジトリ: 53
- 作ったIssue: 240
- 作ったPR: 378
グラフにしてみると、去年と大きくは変わってないです。
Notion Plotlyを使って作成しています。
作ったリポジトリ
-
azu/find-node-modules-import: Find specific node modules import statement in your source code
- find-node-modules-import: importsしてるパッケージ名やNode.jsのコアモジュールを検出するツール | Web Scratch
- Node.jsのコアモジュールをimportしてるかを検索できるシンプルなgrepツール
- もう
node:events
とかのNode.jsコアモジュールをPure JSなライブラリから依存するのはやらなくなったので、依存を見つけて消すために書いた - Node.jsコアモジュールに依存しないのは、webpackやviteなど最近のbundlerは自動でNode.jsコアモジュールをpolyfillしなくなってるので、依存するのはメリットがなくなっている
- また、Node.jsコアモジュールのアップデートにpolyfillが追いついてなかったり、Web標準のAPIで代用するケースが増えているから
-
azu/secretlint-blocks: Secretlint for GitHub Blocks
- GitHubがBlocksという実験的な機能を作ってたのでそれのデモとして作った
- GitHub のインターフェースを拡張できる「GitHub Blocks」が Technical Preview となっていました | DevelopersIO
-
jser/10th-years-ago: 10年前を JSer.info で見る
- 10年前のJSer.infoを見れるサイト
- JSer.info: 10th years ago
-
azu/rss-to-twitter: GitHub Actions: RSS to Twitter
- GitHub ActionsでRSSをTwitterに投稿するアクションを作った | Web Scratch
- IFTTTが使えなくなったので、GitHub Actionsでできるツールを書いた
- JSer.info とかの更新の投稿に使ってる
-
azu/omit-dev-label-on-production: esbuild –drop-labels=DEV example
- Release v0.18.13 · evanw/esbuildでサポートされた
--drop-labels=
のサンプル - こういう感じで特定のラベルをDropするという使い方があるのはこれで知った
function main() { DEV: doAnExpensiveCheck() }
- Release v0.18.13 · evanw/esbuildでサポートされた
-
azu/gmail-to-notion: Google Apps Script: Search Gmail and record the search results in Notion.
- Gmailで特定のラベルをつけたらNotionに追加するGAS
-
azu/bluenotiondb: Sync Bluesky/GitHub/Calendar/RSS to Notion.
- Bluesky/GitHub/Calendar/RSSをNotionに同期するbluenotiondbを作った | Web Scratch
- 色々なものをNotionに同期するツール
- Bunで書いて単独のバイナリにして、それをGitHub Actionsから実行するシンプルなツール
- Bluesky/GitHub/Calendar/RSSなどをNotionなどに取り込める
- 今年は色々なものをNotionの取り込むって方針にしてみて、それで作ったツール
- TwitterはAPIが使えないので、Blueskyを使ってる
- https://bsky.app/profile/azu.bsky.social
-
azu/tsconfig-to-dual-package: Node.js dual package tool that add package.json to tsconfig’s
outDir
- Node.jsのCJSとESMのdual packageを作るためのツール
- これが使えるのはどちらかというとPureなライブラリ
- eventmitなどや、secretlintのtypesなど依存がないものをdual packageにするときに使える
- CommonJSからES Modulesへの移行する方法。トップダウンかボトムアップか | Web Scratch
-
azu/eslint-cjs-to-esm: ESLint wrapper for migration from CJS to ESM.
- eslint-cjs-to-esm: CJSをESMへとマイグレーションするツールを書いた | Web Scratch
- CJSをESMにマイグレーションするときにチェックするツールをESLintのラッパーとして書いた
- 結構シンプルな仕組みで便利
-
azu/npmcdn-upptime: Unofficial status page for skypack.dev, unpkg.com, esm.sh
- skypack.dev, unpkg.com, esm.sh を勝手に監視してるステータスページです
- どれもよく使われているnpm CDN(npmパッケージをいい感じにブラウザで利用できるようにするCDN)です
- これを作った理由としてはskypack.devが時々落ちていて、メンテナンスもされてないので、それがわかるようにするためにモニタリングするようにし始めました。
- 過去に落ちた履歴は次のIssueで確認できます。
- https://github.com/azu/npmcdn-upptime/issues?q=is%3Aissue+is%3Aclosed
- npm CDNは便利ですが、どのCDNも落ちることはあるので、productionで利用する場合は何かしらのfallbackが必要になると思います
-
- LocationがJapan かつ GitHub Sponsorsを有効にしてるアカウントの一覧をまとめてるリポジトリ
- GitHub Sponsorsで支援できる人ってどれぐらいいるんだろと思って作った
location:Japan is:sponsorable
というクエリで検索しているだけ- 2023年でだいたい150人ぐらい増えていて、928人ぐらいいるらしい
-
- GitHubのリリースノートを自動化する仕組み | Web Scratchで紹介したmonorepoのリリースフローのサンプルリポジトリ
- GitHubのAutomatically generated release notesを使うことで、一度設定すればCIからnpmへのリリースができるようになる
- textlintやSecretlintなどのmonorepoのリポジトリではこの仕組みを使ってる
-
- Feature request: option to update cache · Issue #342 · actions/cache
- GitHub Actionsのcacheには上書きする方法がなくて、それをやるにはrestore + delete + saveでやる必要があるよというサンプル
-
azu/ejs-injection: ejs is not for user defined template
- EJSってユーザーに書かせて安全なテンプレートエンジンなんだっけ?となって実験したリポジトリ
- クライアントサイドからサーバサイドまで破壊するテンプレートエンジンを利用した攻撃と対策
- ユーザーに書かせていけないテンプレートエンジンではあった
-
aria-owns
が再起するとハングするというChromiumのバグレポを作る時の再現リポジトリ- いつの間にか再現しなくなっててよくわからない
-
- Remix v2ではAppLoadContextの型定義が変わってて、TypeScriptのinterfaceでの型マージをしてねとなってたのでサンプル
- Remix v2へアップデートした時のメモ | Web Scratch
- ただ、declare mergingは好きじゃないので別の方法で解決した
-
azu/babel-traversal-eval-issue: undefined
- Babel/traversal の
path.evaluate()
の脆弱性の調査をしてた - Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code · CVE-2023-45133 · GitHub Advisory Database
- 脆弱性が通るとRCE - サーバでの任意のコード実行ができるので、どういうフローが起きるのか調べてた
Number.constructor('console.log(1)')
という感じのやつ- 気軽に通すパスは見つけられてないけど
- Babel/traversal の
-
azu/ni.zsh: Alternative
ni
written in zsh: npm/yarn/pnpm/bun with the same command- npm/yarn/pnpm/bunを同じコマンドで扱える ni のzsh実装を書いた | Web Scratch
- パッケージマネージャーを色々使うようになってしまったので、同じコマンドで実行できるツールを書いた
- Socketと連携して、パッケージのサプライチェーン攻撃を防ぐ仕組みも入れたので結構実用的に便利
-
- Freee会社設立で作られた会社の一覧を10万件ぐらい調べてみたやつ
-
azu/mubook-hon: epub/PDF reader + Notion Sync + Memo
- Dropboxに入れたepubやPDFなどを読めるウェブアプリ
- 読書のメモはNotionに記録されるようになってて、読んでる位置も同期されるので色々なデバイスで続きが読めるようになってる
- 今年はこれを使って外を歩きながら100冊以上読んでる
Notion
今年は色々なデータをNotionに取り込んで、Notion上でタスク管理するようになった。
色々なデータがNotion上にあるので @
のmentionで指定したものを引っ張ってこれるようになったのが便利。
- Gitコミット
- GitコミットHooksでのコミットメッセージを記録してる
- GitコミットをNotionに記録してみてる | Web Scratch
- 📝 Notes
- VSCodeで書いた一時的なメモを保存する際に、自動的にNotionへ同期
- Bluesky
- bluenotiondbで同期
- GitHub
- bluenotiondbで同期
- アクティビティ(作成したリポジトリ、Issue、PR、push、Release)などが記録される
- Gmail
- https://github.com/azu/gmail-to-notion で、
GmailのGTD/*
系を取り込んでいる - メールで特定のラベルをつけたものをNotionに同期
- https://github.com/azu/gmail-to-notion で、
- メモリーノート: 突発的なメモ
- https://github.com/azu/memory-note で作成
- 記憶に残らないものをメモするためにMemory Noteという仕組みを書いた | Web Scratch
- 音声でメモできるので、忘れないうちに追加できる
- 買い物
- https://github.com/azu/memory-note の worker
- 記憶に残らないものをメモするためにMemory Noteという仕組みを書いた | Web Scratch
- 音声でメモできるので、忘れないうちに追加できる
- iOSのダッシュボードでwidgetとしても見れる
- カレンダー
- bluenotiondbでGoogleカレンダーの予定を同期
- ブログ候補
- 新しく作ったものをブログとして書くので、bluenotiondbでGitHubの検索結果を同期してる
日付ごとのDailyページがあって、そこに自動的に紐づくようになるので、そのページを毎日開いて何するか決めてる。
次のような YYYY/MM/DD
のページを開くツールを書いて、ショートカットでそのページを開けるようにしてる。(これはBunでバイナリ化して使ってる)
import { execFileSync } from "child_process";
import { Client } from "@notionhq/client";
import * as fs from "fs/promises";
import * as path from "path";
// fs cache
const cacheDir = process.env.CACHE_DIR ?? path.join(path.dirname(new URL(import.meta.url).pathname), ".cache");
const databaseId = process.env.NOTION_DATABASE_ID;
await fs.mkdir(cacheDir, { recursive: true });
const getCache = async (key) => {
try {
const data = await fs.readFile(path.join(cacheDir, key), "utf-8");
return JSON.parse(data);
} catch {
return null;
}
}
const setCache = async (key, value) => {
await fs.writeFile(path.join(cacheDir, key), JSON.stringify(value), "utf-8");
}
const notion = new Client({ auth: process.env.NOTION_TOKEN });
const formatYYYYMMDD = (date, sep = "/") => {
return date.getFullYear() + sep +
String(date.getMonth() + 1).padStart(2, "0",)
+ sep +
String(date.getDate()).padStart(2, "0")
}
const getNotionURL = async (databaseId, dateKey) => {
const response = await notion.databases.query({
database_id: databaseId,
filter: {
property: 'Name',
"title": {
"equals": dateKey
}
}
});
const todayURL = response.results.find(item => {
return item.url
});
return todayURL.url.replace("https://www.notion.so/", "notion://you/");
}
const date = new Date();
const dateKey = formatYYYYMMDD(date, "-")
const cache = await getCache(dateKey);
const notionUrl = cache ?? (await getNotionURL(databaseId, formatYYYYMMDD(date, "/")));
if (notionUrl) {
await setCache(dateKey, notionUrl);
}
execFileSync("open", [notionUrl]);
次の記事でも書いてる。
Notionへの集約もそうだけど、機密情報を1Passwordに寄せたり、情報の整理してたのは結構多かったかもしれない。
textlintとsecretlint
textlintはESMで書かれたルールをサポートした。
この際に非同期ロードのAPIを一新している。次の14で古いAPIのサポートを消したい。
意外と@textlint/script-compilerを使ってるケースを見かけるので、なんかここのユースケースがはっきりするともっと色々なところに組み込みやすいのかな。
Secretlintもなんだかんだ継続的にアップデートしていて、色々ルールが増えたりしている。
- @secretlint/secretlint-rule-1password
- 1Password
- @secretlint/secretlint-rule-openai
- OpenAI
プラグインのためにエコシステムが楽なJSを選んだけど、今ならwasmとかでもいけるのでZigかRustでもいいなーとか最近思ってきた。
パターンマッチの仕方もある種のパターンがあるので、それを抽象化したら移植とかしやすくなるかなーとも思ってる。
JavaScript Primer
今年はjsprimerの書籍版を改訂した。
ES2023が正式にリリース(2023年6月27日)される前に、ES2022の対応を入れて改訂版をリリース(2023年6月9日)した。
- JavaScript Primer 改訂2版をリリースしました!/JavaScript Primerはなぜ更新され続けるのか? | Web Scratch
- JavaScript Primer 改訂2版 迷わないための入門書 | azu, Suguru Inatomi |本 | 通販 | Amazon
その後、すぐウェブ版はES2023の対応をして、ライセンスもCC BYに変更した。
あと、去年の今年のオープンソース活動振り返り @ 2022で言っていた、Open Collectiveの対応を進めていて、jsprimerのページも作成した。
Open Collectiveはどちらかという企業のサポートを目的にしている部分があるので、企業がサポートしてくれた場合はサイトやリリースノートにロゴとかを出す仕組みを考えている。
- Open Collective を使ってみた - V - Medium
- 企業にとっては、Open Collectiveの方が優しい
- 受け取る側は、Open Source CollectiveだとHost Feeとして10%の手数料がかかる
- GitHub Sponsorsと違って、分配する仕組みとかがあるのでプロジェクトへのスポンサーとして使いやすい
ただ仕組みだけ作っても使われないと進まないので、どうやったら支援しやすいかとか一緒に考えくれる人を募集しています。興味ある人は連絡をお願いします。
- https://twitter.com/azu_re や
[email protected]
- Open Source Collective · Issue #1674 · asciidwango/js-primer
2024年は、ES2024の対応やNode.jsのアップデートの対応とかをやっていく必要があるので、これをどうやるとプロジェクトとして継続しやすくなるかを考える必要がある。
2024年は、Open Collectiveを使いつつContributorを増やすことに挑戦したい。 ただJavaScript Primer - Open Collectiveにまだ原資がないので、自分で資本金を入れようかと思ったけど、自分のCollectiveに自分でお金入れていいのかがよくわかってない。
Open Collectiveの支払いプロセスとか調べるためにドキュメントとか読んでいたけど、経費精算のプロセスとか会社っぽいと思ったりした。
実際、Open Source Collectiveが一定金額のサポート受けてるオープンソースのメンテナーを社員として雇用して、保険など医療福祉を受けられる仕組みとかもあったりする。
- Open Source Collective is Hiring Maintainers - Open Collective
- Employment, Payroll and Benefits - Open Source Collective
Open Job Letterを考えてるときに、起業の選択肢もあったけど、Open Collectiveをちゃんとやることは起業と似たようなことをやる感じがしたので、こっちをやってみようと思った。
Open Job Letter
あんまりオープンソースとは直接関係ないけど、転職活動を始めたのでOpen Job Letterを公開した。
公開するために書くのはかなりコストがかかるけど、後から振り返るときに読むとコンテキストが分かるので便利。 これもNotionに集約的なことをしている。
まとめ
去年と同じくあまり新しいものを作れてなかった感じはする。
今年作ったものだとmubook-honはかなり使っていて、これによって歩きながら1本を読むのがかなり習慣になった。 歩きながらコードを書いたり、考えられる仕組みができたら、もっとコードを書けるような気がするので、ちょっと考えたい。
去年に引き続きGitHub Sponsorsでの支援結果についてもまとめて公開した。
- GitHub Sponsorsの収入 @ 2023 | Web Scratch
- ご支援いただきありがとうございます!
継続的にやっていくこと と 新しくやることのバランスは大事ではあるので、新しいことは引き続きやっていきたい。 どうしても継続の方がバランスの重みをとってしまいがち(やるかどうかは別として頭に浮かびやすい)なので、新しいことは意識的に見つけていかないと見つからないという感じはしている。
-
室内だったり、人とぶつかりそうもない場所 ↩
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。