🔙

2025年を振り返る前に週次振り返りを強化する task を書いてみた

に公開1件

tl;dr

  • 年明けからの試みとして週次での振り返りをすることにした
  • task で処理を書いたので晒してみる

習慣

  • 日記兼日報をつける習慣は社会人になってすぐのころから媒体を変えつつずっとやっている(かれこれ30年以上だ)

  • 今はプライベートリポジトリに TIL としてマークダウン形式にしている(月1ファイル)

  • 月次振り返りは3種類やっていて、

    • テンプレート化している日報の集計(集計は振り返り作業タスクとして Issue に出力)
    • インタビュー形式の振り返り(月1ファイルを別で)
    • 失敗学を参考に前月の反省点の深堀りをして改善を計画(別リポジトリに月1ファイル)
  • 振り返りのお遊びにこのあたりのことは書いた

  • で、週次での振り返りはなんとなくで流していたので、より精度を上げるために仕組み化することにした

計画

  • 一時期 Issue を使って振り返りを書いていたこともある
  • クローズしてしまうと見なくなってしまう
  • 検索もぱっとやりにくい
  • 結局テキストでファイルとして保存しておくのが一番手っ取り早い
  • 月1ファイルは VS Code で開きっぱなし
  • 検索は alias gg='git grep' ですぐできる
  • 既存の集計処理を壊したくない
  • 週次振り返りって年52か53回しかない
  • 年1ファイルにしよう
  • って考えたわけ

週次振り返りファイル

# 2026 年の週次振り返り
## Week 1 2025-12-29 / 2026-01-04
## Week 2 2026-01-05 / 2026-01-11
## Week 3 2026-01-12 / 2026-01-18
(中略)
## Week 51 2026-12-14 / 2026-12-20
## Week 52 2026-12-21 / 2026-12-27
## Week 53 2026-12-28 / 2027-01-03
  • 日付の参考 ISO 8601 - Wikipedia
  • 月曜始まり、日曜終わり、週番号 01 はその年の最初の木曜日を含む週
  • 年の最初に生成して til/2026/lookback_weekly.md のような形で保存して VS Code で開きっぱなしにしておく

task で書いた

  • task のプラクティス的にはロジカルな処理は外部ファイルでやるのがよいとされている
  • それは task の cmd 内であれこれするんじゃなくて、外部スクリプト化するのがいいということ
  • なので、Python や Bash やその他なんでも、プログラミング言語で書いてそれを実行するだけにするのが筋
  • (というわけで各種言語やテンプレートエンジンで書いた generate_lookback_weekly をお待ちしていますw)
  • 外部プログラムで書くのは他にもたくさん書いてるし、もっと task を理解したいので、筋は筋として task で書いてみた
  • date 処理、分岐、ループができればたいていの言語では30分もかからないかと思う
  • task は go の text/template と slim-sprig ライブラリでほぼ終わりなので、都合6時間近く溶かしてしまった。。。
  • cmds 内でシェルで書けばそれはそれで早かったと思うんだけどそれだと意味がないので。。。
Taskfile.dist.yaml
task:
  lookbackweekly:
    desc: generate look back on last week file for year
    summary: |
      - 年間の週次振り返りファイルを生成する(1年分を1つのファイルにまとめる)
      - 日付参考 [ISO 8601 - Wikipedia](https://ja.wikipedia.org/wiki/ISO_8601)
      - 月曜始まり、日曜終わり、週番号 01 はその年の最初の木曜日を含む週
    aliases:
      - "lbw"
    silent: true
    vars:
      YEAR: '{{.YEAR | default 2026}}'
      # YEAR の 1月1日
      YEAR_01_01: "{{.YEAR | toString}}-01-01 00:00:00"
      # 1月1日の曜日
      YEAR_01_01_WD: '{{toDate "2006-01-02 15:04:05" .YEAR_01_01 | date "Mon"}}'
      # 週番号 01 の月曜日の日付
      YEAR_WW_01_MONDAY: |
        {{ $offset := "0h" -}}
        {{ if eq .YEAR_01_01_WD "Thu" }}{{ $offset = "-72h" }}{{ end -}}
        {{ if eq .YEAR_01_01_WD "Wed" }}{{ $offset = "-48h" }}{{ end -}}
        {{ if eq .YEAR_01_01_WD "Tue" }}{{ $offset = "-24h" }}{{ end -}}
        {{ if eq .YEAR_01_01_WD "Fri" }}{{ $offset = "72h" }}{{ end -}}
        {{ if eq .YEAR_01_01_WD "Sat" }}{{ $offset = "48h" }}{{ end -}}
        {{ if eq .YEAR_01_01_WD "Sun" }}{{ $offset = "24h" }}{{ end -}}
        {{ date "2006-01-02 15:04:05" (toDate "2006-01-02 15:04:05" .YEAR_01_01 | date_modify $offset) -}}
    cmds:
      - echo "# {{.YEAR}} 年の週次振り返り"
      # - echo "1月1日は {{.YEAR_01_01}}"
      # - echo "曜日は {{.YEAR_01_01_WD}}"
      # - echo "この年の週番号 01 の月曜日は {{.YEAR_WW_01_MONDAY}}"
      -   # Week 1 Monday to Sunday(add 6days = 144h) 理解しやすいように1週目だけ個別に出力
        cmd: |-
          echo -n "## Week 1 "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY) }}"
          echo -n " / "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify "144h") }}"
          echo ""
      -   # Week 2 から 52 までを出力
        for: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52]  # yamllint disable-line
        cmd: |-
          echo -n "## Week {{.ITEM}} "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify (printf "%dh"          (mul (sub .ITEM 1) 168) )) }}"
          echo -n " / "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify (printf "%dh" (add 144 (mul (sub .ITEM 1) 168)))) }}"
          echo ""
      -   # Week 53 が必要かどうか(cmd に vars は書けないことに注意)
        cmd: |-
          {{ $week53_monday := toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify "8736h" }} # 52週分 = 52*7*24 = 8736h
          {{ if and (eq (date "2006" $week53_monday) .YEAR) (lt (date "02" $week53_monday | atoi) 29) }} # 29日未満なら週53あり
          echo -n "## Week 53 "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify (printf "%dh"          (mul (sub 53 1) 168) )) }}"
          echo -n " / "
          echo -n "{{date "2006-01-02" (toDate "2006-01-02 15:04:05" .YEAR_WW_01_MONDAY | date_modify (printf "%dh" (add 144 (mul (sub 53 1) 168)))) }}"
          echo ""
          {{ end }}
  • Go の time だけしか使えない縛りつらたん(ISOWeekとか使えない?)
  • slim-sprig 縛りマジつらたん
  • まだよくわかってないんだけど、offset を d で表現するとうまく動かない?(なので h で処理している)
  • cmds.for はもうちょいいい書き方できないかしら
  • 53週目がいるか要らないかの処理がだるい
  • このまま Taskfile にコピペして task lbw でいけるし task lbw YEAR=2027 みたいに年指定が可能

2025年も終わり

  • 年明けから活用できるように年内に作れてよかった
  • Task ユーザーそこそこいるように見えるんだけどほとんど交流ないの少しさみしい
  • Task チャレンジってゆうか、お題に対してこういう書き方できるぜ、みたいなの欲しいなとか
  • 先にも書いたけど、他の言語でこう書いたぜとか、Task でもこう書けるぜとかお待ちしています

Discussion

rakiraki

記事のファイル名変更するの忘れてた。。。
ここちょっと見直すか。。。