日報アドベントカレンダー2023
動機
10月中頃から stella-app.jp がダウンしており、インターネットに日報を提出できなくなっている。日報を書く習慣も次第に失われており、日々を思い返す寄す処が失われてしまうことを危惧している。 そこで、ブログを作りたい と内容がだいぶ被っているものの、12月いっぱいをかけて日報アプリを作成しようと思い立った。アドカレシーズンだし何かやりたいと思ってたから丁度よい。 ログ
12/1
プロジェクトのgitリポジトリ作成
README.mdとindex.htmlのみ
Vercelに新規プロジェクト
githubと連携
とりあえずリポジトリのルートを公開する
Vercelのプロジェクトにドメイン作成してCNAMEをレジストラのDNS設定に追加
CNAMEのサブドメインがnipppoになってていつまで経っても繋がらないミス。いんふらなにもわからない
12/2
要件整理
markdownで記述している日報ファイルがある
日報ファイルをビルドしてHTMLとして出力する
事前ビルドしたファイルを配置する静的サイト
サーバーで動的にページを生成するわけではない
1ファイル作ると1記事になる
「日報は1日1件」とか制限する必要ないなと気づいたのでファイル単位でURL用意
機能要件
必須
markdownをHTMLにビルドしてデプロイするコマンド
テンプレートにmarkdownを変換した本文を埋め込むレイアウト機能
日報の一覧(インデックスページ)
あるとうれしい
日付ファイル名でソートしたページング(prev, next)
OGP
日報の内容自動生成
タイマー投稿
日報の検索
Twitterに投稿
非機能要件
可用性
公開側はvercelに依拠
コマンドは連携するサービスに依拠
性能・拡張性
公開側はvercelに依拠
コマンドは差分ビルドでビルド時間を短縮するように
運用・保守性
公開側はvercelに依拠
コマンドの障害はエラーログを出力する
移行性
公開側は静的ファイル置くだけの構成
コマンド側はシングルバイナリアプリケーションにする
セキュリティ
公開側はgithubへのプッシュ権限でセキュリティ担保
まずいものをコミットしたときどうするか
コスト
速いは正義
12/3
ビルド成果物をgitにコミットするのか問題
まずいものをpushしたらコミットログを削除して対応?
自分しかコミットしないから歴史の改変でOK
githubのコミットハッシュURLはすぐには消えない
issueからリンクされたものやプルリクも同様
forkされたら終わりでは
そもそもビルド成果物をコミットしないという考えもある
方針3パターン
1. プライベートリポジトリにしてコミットする
簡単で安牌
2. パブリックリポジトリにしてコミットする
簡単で安易
問題が起きたときに頑張る
3. パブリックリポジトリにしてコミットしない
ないものをvercelにデプロイできたっけ
vercelコマンドでビルドしてデプロイできる
方針3を選択する
日報というマスターデータをウェブ上で参照できるようにするだけという発想
12/4
Notionに日報プロジェクトを作成
思いつく限りのタスクを書き出しガントチャートにする
完了日ベースのカレンダーを作ってアドベンドカレンダーっぽくする
ここにNotionのプロジェクトページを貼ろうと思ったけど、データベースの一部だけ公開というのはできないっぽい
追加の要件
ブラウザのJSがOFFの状態でも各ページ閲覧可能であること
せっかくHTML吐くのでテキストブラウザで閲覧可能にしたい
スケジュール
のためのタスク洗い出し
のための基本設計
公開側
トップページ、アーカイブページ、日報ページの3画面
トップページには最新の日報1件
アーカイブページは月別のカレンダー
日報ページは1件毎の日報。前後の日報へのリンク。
フィード、画像、CSS、JS等画面外のアセットはルート直下に
12/5
スケジュール
のためのタスク洗い出し
のための基本設計
コマンド側
nippo-cli
シングルバイナリアプリケーション
golang
cli作るときって今でもcobraでいいんですか
nippo-cliプロジェクト作成
12/6
今週中に作らなきゃいけないもの洗い出すぞ
12/7
rustでコマンド書きたいなーと欲が出たけど今から覚えようとしても今月中に終わらないので気持ちを落ち着かせました
12/8
長時間拘束
12/9
風邪
12/10
設計
nippo-cli
nippo init
日報初期化コマンド
githubのc18t/nippoプロジェクト(日報サイトテンプレート)をダウンロードし、各サービスの認証設定を行う
nippo update
githubのc18t/nippoプロジェクトを再ダウンロードする
nippo build
google driveの日報ファイルをダウンロードし、サイトをビルドする
日報ファイルの更新データとビルド結果をキャッシュし、次回ビルド時に差分検証する
nippo clean
nippo buildのキャッシュクリア
nippo deploy
ビルドした日報サイトをデプロイする
スケジュール
引けた。12月中に終わりそう
開発
nippo-cliにgoプロジェクト作成
下記参考にプロジェクトのファイル構成をする
複数のコマンドを含むフォルダ構成の場合、外部から参照されないパッケージフォルダとしてinternal/xxx/xxx.goを作って開発していくとよいようだ。
cobra-cliでコマンド作って、コマンド定義は ./cmd、実装は./internal に配置
go install github.com/c18t/nippo-cli/nippo@latestで nippo コマンドがインストールされるようにした
キャッシュされるのでGOPROXY=direct go install github.com/c18t/nippo-cli/nippo@latestとするとプッシュしたものをすぐビルドするようだ
-ldflagsやdebug buildinfoからバージョン情報を取得できるようにした
進捗率38.5%
12/11
開発
docker-composeでデバッグできる環境を作成
docker compose up -dでコンテナにビルド・デバッグ環境が立ち上がる
起動プロセスでdlvコマンドでリモートデバッグサーバーを立ち上げ待機
起動したコンテナにリモートデバッグ接続してコードのデバッグができるようにvscodeの設定もした
コンテナの中に入ってデバッグもできる
goのデバッガ delve完全に理解した
vimからもデバッグできるようにdapで通信するようdlv dap
dlv dapコマンドの制限事項として、クライアントが接続を切るとサーバーのプロセスが終了する。まじかよ
これのせいでデバッグ実行するとデバッグ抜けたらコンテナ終了する
こんな感じでプロセス終了しても再度立ち上がるループの入ったスクリプトを起動コマンドにした
code:start.sh
# delveのdlv dapはクライアントのdisconnectでサーバープロセスが終了する制限事項があるため、ループで無限に起動させる
while :; do dlv dap -l 0.0.0.0:${DEBUG_PORT} --log --check-go-version=false; done
進捗率41.8%
コードを書け
12/12
開発
昨日の環境だとリモートにマウントしたワークスペースの所有権がホストのユーザーと違う
新規作成したファイルで問題起きそう
対処方法
1. ホストもコンテナもrootで作業する
そうじゃないとき困る
2. イメージ作成時に同一UID,GIDでユーザー作成
イメージ作成時点で固定
3. コンテナ起動時にコンテナ作業ユーザーのUID,GIDを書き換え
かっこいい
かっこいいので3で
コンテナのentrypointにUID,GIDを書き換えて、書き換えたユーザーで起動コマンド立ち上げるスクリプト指定
code:entrypoint.sh
WORKING_DIR=${WORKING_DIR:-/workspaces/go}
CONTAINER_USER=${CONTAINER_USER:-user}
DEBUG_PORT=${DEBUG_PORT:-2345}
export HOME=/home/${CONTAINER_USER}
# カレントディレクトリの uid と gid を調べる
uid=${UID:-$(stat -c "%u" ${WORKING_DIR})}
gid=${GID:-$(stat -c "%g" ${WORKING_DIR})}
# ユーザーのuidをカレントディレクトリに合わせ、home, goディレクトリのuidを変更
usermod -u $uid -o ${CONTAINER_USER} >/dev/null 2>&1
chown -R $uid /go
fi
# ユーザーのgidをカレントディレクトリに合わせ、home, goディレクトリのgidを変更
groupmod -g $gid -o ${CONTAINER_USER} >/dev/null 2>&1
chgrp -R $gid ${HOME}
chgrp -R $gid /go
fi
# uid/gid を指定して CMD 実行
exec setpriv --reuid=${CONTAINER_USER} --regid=${CONTAINER_USER} --init-groups /bin/bash -c "\
git config --global safe.directory ${WORKING_DIR} && \
id && $@"
setpriv完全に理解した
suだとユーザーセッションが始まってあんまりよくない
Linux的にはUID,GIDが変わっていれば権限違うので、必要十分なことをする setprivがあるとのこと
これでファイルの所有権はホストのUID,GIDと一緒になったが、マウントしたルートフォルダだけは起動プロセス=rootになってる
gitコマンド打つと変な権限のリポジトリって怒られるので safe.directory設定
ユーザー(GID,UID)を確認するために id打ってる
これで解決かと思いきや、DevContainerで所有権がめちゃくちゃになった
DevContainerは開発環境起動時に力技で所有権の設定をしているらしく、rootでコンテナ立ち上げて別ユーザーでコマンド実行みたいな変なことすると力技が効かなくなる
仕方がないので2の方針に転換
あっさりできた
Windowsで動作確認しようと思ったけどWSL壊れてた
進捗率43.3%
コードを書け
12/13
開発
nippo initコマンド
自分で書くのがかったるかったので Google Bard に実装お願いしたら廃止されたモジュールをインポートしたり存在しないメソッドを呼び出したり戻り値の受け取り方を誤ってたりでなかなか動かない。結局調べながら手作りした。
進捗率44.8%
12/14
開発
nippo initコマンド
google driveにアクセスするための認証コード取得処理作成
組織 c18t.net に nippo プロジェクトを作成、nippo で APIを使用できるようにした
APIを使ってユーザー情報にアクセスするためのOAuthクライアントIDを作成
組織内部で使うクライアントにした
自分のアカウント登録できない、なんでだっけ。組織に所属してない?
とりあえずテスト状態で組織外へ公開するクライアントにして、テストユーザーに自分を追加
進捗率46.3%
12/15
開発
nippo buildコマンド
google driveの日報ファイルをダウンロードする処理作成
List APIで検索してGet APIをalt=mediaクエリ付きで実行してファイルダウンロード
進捗率47.8%
12/16
開発
nippo buildコマンド
トップページのテンプレートからindex.htmlをビルドする処理作成
レイアウト、ヘッダ、フッタ、インデックステンプレートファイルからindex.htmlを生成する
久しぶりにvscodeのemmet使った
ざっくりカレンダーページテンプレートも作成した
最新の日報ファイルをダウンロードしてMarkdownをHTMLに変換、トップページテンプレートに埋め込む処理作成
やっとコマンドでサイト生成できるようになった
進捗率52.2%
12/17
開発
Goの練習兼ねて書いたコードのツギハギで作っているため重複するコードだらけになってきたので、整理
ついでにレイヤードなアーキテクチャに改修はじめ。さあ脱線しだしたぞ
進捗率53.7%
12/18
開発
脱線しまくり
uber-go/dig 完全に理解した
進捗率53.7%
12/19
開発
uber-go/dig なんもわからん…
仕事
進捗率53.7%
12/20
開発
こうか…こうじゃないか……
仕事
進捗率53.7%
12/21
開発
uber-go/dig わかったかも
仕事
進捗率53.7%
12/22
開発
uber-go/dig 理解した
nippo --vesionのリファクタリングが完了
仕事
進捗率53.7%
12/23
開発
uber-go/dig のドキュメント見ながらコマンドのコントローラーにDIするユースケースをまとめるUsecaseBusを作る
上手く行かない
注入用の構造体のフィールドがプライベートなのがいけなかった
digはリフレクション使ってるからどんな悪さでもできると思ってたけどそうでもなかった。フィールド名の頭文字を大文字にして解決
日報ページのビルド
ページタイトル渡すとtitleタグからドメイン名が消える不具合
上記解消のためテンプレートを修正
nippo updateコマンド
テンプレートを直したのでプロジェクトファイルの再ダウンロード機能使いたくなって着手。うごいた
nippo deployコマンド
裏でvercel --cwd {cache/output} --pordコマンドを呼び出す実装
余裕があったらvercel api叩くいい感じのデプロイコマンドに改修
やっと日報ページ公開
6日分報告
進捗率67.2%
12/24
開発
アーカイブページのビルド
カレンダーモデル
年月
日〜土の7日の列を任意の行数持つ
祝日の概念はなくていい、日報に休みはない
カレンダーUI
正直カレンダーって選択しにくくないか
その月の日報のリンクが一覧で並んでいたほうが良くないか
その他の表示
その月の日報提出率や日報の文字数などの統計情報が出ると面白いのでは
とりあえずできた
進捗率78.7%
12/25
開発
OGP
いい感じの表示にして終わらせたい
マーブル柄の丸を書いてOGP画像にした
Lighthouse採点
https://gyazo.com/b807501b60895dd988c220c043e6a630
振り返り
進捗率85.2%
たいへんにつかれた。労働が全部悪い。