今年コミットした GitHub のリポジトリを順にみながら2020年の個人開発を振り返ってみる。

実は去年もやろうとしていた企画1、今年こそ年内に公開するぞ。

リポジトリ一覧の取得

去年の記事では API を curl で取得していた2が、今年は GitHub の公式 CLI である gh を使って取得することとする。

jq と gh をインストールし、 ~/.config/gh/config.yml の aliases キーに、次のような内容を追記する。

aliases:
    repos: |
        !gh api --paginate graphql -f owner="$1" -f query='
          query($owner: String!, $per_page: Int = 100, $endCursor: String) {
            repositoryOwner(login: $owner) {
              repositories(first: $per_page, after: $endCursor, ownerAffiliations: OWNER) {
                nodes { nameWithOwner, updatedAt }
                pageInfo { hasNextPage endCursor }
              }
            }
          }
        ' | jq '.data.repositoryOwner.repositories.nodes[] | .updatedAt + " " + .nameWithOwner' -r | sort

ログインして、先程登録したエイリアスでリポジトリ一覧を取得する。

$ gh auth login
$ gh repos | grep '2020' > repos.txt

リポジトリを一つづつ振り返る

以下順番にコミットした GitHub リポジトリを振り返っていく。

lovelab-api

2019年10月から2020年1月にかけての iPhone アプリを開発する演習授業に合わせて作った、TypeScript 製の API サーバ。 データベースを使ったサーバサイドアプリケーションを一人で作ったのは初めてで、サーバ内でどのような処理をしているか、また REST API とはどのようなものかなどの全体を知ることができた。

ドキュメントは手書きしたがエンドポイントが意外と多く3、書くのが大変で中身も整っておらず良い出来とは言えない。 今思えば Swagger などを使うべきだっただろう。

認証系は簡素なもので「ID とパスワードの対で新規登録する」「ログイン時にアクセストークンを発行する」といった動作を自前で実装している。 自前で実装したのは認証認可のしくみを理解していなかったからだ。 スマートフォン用の API においてどのように認証認可が行われるか、HTTP の中でそれはどのように表現されるかがよくわかっておらず、ライブラリを使おうとしても「よくわからんな」という気持ちになった。

そこで、授業でやっていることもあり (リリースまでは求められていない)、良い機会だと思って一連の流れを作ることにした。 「車輪の再発明は無駄」「セキュリティホールの発生に繋がるので自前での実装は避けるべき」といった意見はごもっともだが、作ってしくみを理解するという点ではとても助かった。 普通なら Express.js に使える認証ミドルウェアの Passport.js を使ったり Firebase Authentication や Auth0 などに任せてしまうのがいいだろう。

そういえば Dockerfile を自分で初めて書いたのもこのアプリケーションだった。 Docker は プログラマのためのDocker教科書 第2版 を読んで学び, EC2 上に docker-compose を使って展開していた。

17ti.me

2月に作った、大学の研究室配属前に学生間で希望を調整するために非公式で作った Web アプリケーション。 学内の情報がハードコーディングされているので公開していない。 最終的に対象者の8割以上の人に利用していただいた。感謝。

成績と希望を集計するもので、Vue.js と Firebase (Realtime Database, Authentication), Netlify を利用している。 大学個人に付与されるメールアドレスを用いて Firebase Authentication でログイン機能を設け, Realtime Database 上に集計情報を記録した。

Firebase Authentication は 前月に作った lovelab-api の認証と比べて簡単だし管理画面も良く出来ていて感動した。 Firebase Realtime Database も 全体を1つの JSON として扱うシンプルなデータベースをクライアント側から読み書きできるので楽に作れて素晴らしかった。 車輪の再発明のあとに最新式の自動車に乗った気分。

dotfiles

2020年は私が dotfiles に入門した年でもあった。

dotfiles とは ~/.vimrc~/.bashrc などの各アプリケーション向けの個人設定ファイルの総称で、よくホームディレクトリの中にドットで始まるファイル名で保存されることからこう呼ばれる。 複数のコンピュータで設定を共有するために dotfiles を GitHub で管理する Tips があり、Qiita で知ってやってみたいと思っていたのだ。

3月の春休みに、4月の研究室配属時に研究室のコンピュータのセットアップを爆速で終わらせることを目指して作り始めた。4

最もシンプルな dotfiles は 設定ファイルを別ディレクトリで git の管理下に置きホームディレクトリにシンボリックリンクを貼るものであるが、これにとどまらず様々な機能をもたせることもできる。 私のリポジトリでは、アプリケーションの一括インストールや OS の設定変更、設定ファイルの自動配置などを行うスクリプトも一緒にまとめて管理している。 OS は macOS と Ubuntu に対応させてそれぞれ判断してスクリプトが実行されるし、ついでに GitHub Actions で CI を回したりもしている。

dotfiles を始めてよかったのはシェルに親しめたことだ。 まずシェルスクリプトを書く機会が圧倒的に増えた。 それまでは普段書かないので if の記法ですら毎度 ggっていたくらいだったが、dotfiles を凝りだすとシェルスクリプトを書く必要が出てきて覚えた。

他にも.vimrcを改造してプラグインを入れたり、シェルにエイリアスもたくさん貼るようになって便利になった。 設定ファイルを壊してもすぐ直せるので色々試せるのが良い。

pdef

dotfiles の開発にあわせて、macOS の設定を保持する UserDefaults をシェルから書き換えたくなって作ったツール。 詳細は当時のブログ記事に書いている。

書いた記事: Macの設定を自動化するdefaultsコマンドと、それを助けるpdef / (余談) User Defaultsとproperty list(plist)

memo.yammer.jp

このブログ (memo.yammer.jp) と個人のページ (yammer.jp) を用意したのも 2020年。

このブログはやんまーのブログとは別にメモや作業記録を雑に投稿するために作ったのに、使い分けが出来ておらず完全に迷走している。 でも記事を書くハードルが下がったのはとても良くて「とりあえず雑に投稿しておくか」と自分で思える。

Hugo で出来ていて、最近デザインの変更と OGP 対応をした。 拡張したい機能がいくつかあるのでそのために来年は勉強も兼ねて Hugo から Next.js に置き換えたい。

yammer.jp

個人のページ。 最初は linktree5 を真似して SNS のユーザページのリンクなどを含む HTML と CSS だけのページをおいていた。 最近作り変えて自己紹介と記事の一覧も表示している。

はてなブログ

去年 Nuxt.js で作ったブログをはてなブログに移行した。 移行にあたって、画像を AWS S3 に移したり、旧ドメインをリダイレクトしたり (yammerjp/blog.yammer.fun)、はてなブログの記事管理 CLI (yammerjp/gimonfu)を作ったりした。

最初は一括投稿のために hatenablog-post という CLI ツールを作ったが、それ以外の機能も欲しくなって gimonfu という CLI ツールに発展した。 gimonfu は初めて npm publish したが、インターネット上のどこかで使ってくれている人がいるようで嬉しい。

書いた記事: gimonfu で、はてなブログの記事を GitHub と同期する - Qiita

willani

2020年に一番時間を費やしたのが C コンパイラの willani。 5月から2ヶ月くらい作って7月半ばに止まっているが、一応コンパイラ自体のセルフホストは達成した。 (プリプロセッサが未完成。) また気が向いたら続きをやりたい。

自作したことで今までブラックボックスだったコンパイラがどんな動作をしているか知れて楽しかった。

書いた記事: 数日前からCコンパイラを書き始めた。 / 自作Cコンパイラの途中経過 / 自作コンパイラのセルフホストに挑戦中 / 自作コンパイラのfor文バグ / C言語の構造体メンバのアライメント (x86_64, Linux (System V ABI))

mopm

既存のパッケージマネージャに不満を持ったので作り始めたソフトウェアのインストール支援ツール。 Golang の入門も兼ねて秋に作り始めたが、しばらく進めていくと「これは HomeBrew の劣化版では?」という気がしてきて手が止まっている。

その他

その他。

...

この他にも2020年に手を付けていた自分のリポジトリやフォークしたリポジトリがあるが、ここでは省略する。

総括

良かったこと

2020年はコロナで家にいたということもあり、自分の時間がとれて継続的に何かしらを作っていた気がする。(後半は研究のために前半ほどの勢いはなかったが。) 昨年ある面接で「作ったものはもっと公開しよう」とアドバイスをもらった事があり、それに従ってなるべくパブリックリポジトリで公開するようにしていた。

結構飽きずにキリのいいところまで作り続けられた。 そのおかげで npm publish や、HomeBrew の Formulae としての公開に繋がった。

また、自分が作りたいものを作るときに新しい技術に少しずつ手を広げていけたように思う。

改善したいこと

「コードを読む機会が少ない」

これに尽きると思う。 OSS などの他人の書いたコードを読む機会が全然なくて、どこから手をつけていいのかもわからない。 コードリーディングってどうやってするんでしょう?... 働き始めたら他人のコードを必然的に読むことになると思うが、結構不安。

来年も

ものを作るのは楽しい。 今年ほど時間の余裕がないだろうが、来年も新しいことを学ぶためにも何か作りたい。 作りたいものは50個くらいある6

以上。

Footnotes

  1. リポジトリで振り返る2019年 – memo.yammer.jp

  2. 去年のように API をcurlで叩くなら、basic 認証ではなくアクセストークンで行う必要がありそう。Basic認証は廃止されたはず。

  3. lovelab-api のドキュメント

  4. 結局新型コロナウィルス感染症の影響でリモートになったので研究室のコンピュータをセットアップすることはないまま卒業しそうである。

  5. linktree は SNS の自分のページへのリンクなどをまとめて表示する Webページを作成できるサービス。

  6. 自分のメモの中に作りたいアプリケーションのネタ帳があり、そこに書かれた数。