2023年のオープンソース活動の振り返り記事です。

今までの振り返りの一覧です。

2023年のGitHubのPublicのContributionsは13020となってますが、これGitHub Actionsで自動更新してるコミットに自分のアドレスを使ってたせいで無駄に増えてしまってます。途中で気づいてBotのアドレスに変更したので、真ん中の濃いところは多分余計なコミットです。

GitHub Public Contributions

余計なコミットを除外すれば、あんまり変わってないと思います。

Issue/PR

  • 作ったリポジトリ: 53
  • 作ったIssue: 240
  • 作ったPR: 378

グラフにしてみると、去年と大きくは変わってないです。

Notion Plotlyを使って作成しています。

作ったリポジトリ

Notion

今年は色々なデータをNotionに取り込んで、Notion上でタスク管理するようになった。

色々なデータがNotion上にあるので @ のmentionで指定したものを引っ張ってこれるようになったのが便利。

日付ごとの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もなんだかんだ継続的にアップデートしていて、色々ルールが増えたりしている。

プラグインのためにエコシステムが楽なJSを選んだけど、今ならwasmとかでもいけるのでZigかRustでもいいなーとか最近思ってきた。

パターンマッチの仕方もある種のパターンがあるので、それを抽象化したら移植とかしやすくなるかなーとも思ってる。

JavaScript Primer

今年はjsprimerの書籍版を改訂した。

ES2023が正式にリリース(2023年6月27日)される前に、ES2022の対応を入れて改訂版をリリース(2023年6月9日)した。

その後、すぐウェブ版はES2023の対応をして、ライセンスもCC BYに変更した。

あと、去年の今年のオープンソース活動振り返り @ 2022で言っていた、Open Collectiveの対応を進めていて、jsprimerのページも作成した。

Open Collectiveはどちらかという企業のサポートを目的にしている部分があるので、企業がサポートしてくれた場合はサイトやリリースノートにロゴとかを出す仕組みを考えている。

ただ仕組みだけ作っても使われないと進まないので、どうやったら支援しやすいかとか一緒に考えくれる人を募集しています。興味ある人は連絡をお願いします。

2024年は、ES2024の対応やNode.jsのアップデートの対応とかをやっていく必要があるので、これをどうやるとプロジェクトとして継続しやすくなるかを考える必要がある。

2024年は、Open Collectiveを使いつつContributorを増やすことに挑戦したい。 ただJavaScript Primer - Open Collectiveにまだ原資がないので、自分で資本金を入れようかと思ったけど、自分のCollectiveに自分でお金入れていいのかがよくわかってない。

Open Collectiveの支払いプロセスとか調べるためにドキュメントとか読んでいたけど、経費精算のプロセスとか会社っぽいと思ったりした。

実際、Open Source Collectiveが一定金額のサポート受けてるオープンソースのメンテナーを社員として雇用して、保険など医療福祉を受けられる仕組みとかもあったりする。

Open Job Letterを考えてるときに、起業の選択肢もあったけど、Open Collectiveをちゃんとやることは起業と似たようなことをやる感じがしたので、こっちをやってみようと思った。

Open Job Letter

あんまりオープンソースとは直接関係ないけど、転職活動を始めたのでOpen Job Letterを公開した。

公開するために書くのはかなりコストがかかるけど、後から振り返るときに読むとコンテキストが分かるので便利。 これもNotionに集約的なことをしている。

まとめ

去年と同じくあまり新しいものを作れてなかった感じはする。

今年作ったものだとmubook-honはかなり使っていて、これによって歩きながら1本を読むのがかなり習慣になった。 歩きながらコードを書いたり、考えられる仕組みができたら、もっとコードを書けるような気がするので、ちょっと考えたい。

去年に引き続きGitHub Sponsorsでの支援結果についてもまとめて公開した。

継続的にやっていくこと と 新しくやることのバランスは大事ではあるので、新しいことは引き続きやっていきたい。 どうしても継続の方がバランスの重みをとってしまいがち(やるかどうかは別として頭に浮かびやすい)なので、新しいことは意識的に見つけていかないと見つからないという感じはしている。

  1. 室内だったり、人とぶつかりそうもない場所