YukiTask - 結城浩のタスク管理ツール(結城タスク)
はじめに
このスクラップには、YukiTaskに関する結城の個人的なメモを書いていこうと思います。
YukiTaskに関してはいろんなアイディアやグッドプラクティスがあるのですが、それに気づくのは仕事まっ最中であることが多く、なかなか腰を落ち着けてまとめることができません。
なのでZennのスクラップを使って、思いついたことを書き残していくのがいいかなと考えています。
のんびり気長に更新していきます。
結城の個人的なメモなので、YukiTaskの基本的な情報については特に解説していません。YukiTaskに関する基本的な情報は(だいぶ古くなっていますが)下記をごらんください。
Contributionのグラフはほとんど見ていない
YukiTaskのアイコンでお化け坊やがContributionのグラフを持っていますが、現在はまったく見てませんね。どのプロジェクトをどれだけやっているかの記録自体は粛々と取っていますが、グラフとして「このプロジェクトは最近サボっている」などとみることはありません。
見るようにしてもいいな。
make help
help
は、そのプロジェクトでのYukiTaskのターゲット一覧を表示するターゲットです。
久しぶりにそのプロジェクトを訪れたとき、ここでできることを忘れていたりします。そんなときにmake help
を実行すると何ができるかのターゲット一覧を表示してくれます。
例
$ make help
make g --- OmniGraffleを開く
up --- snap "360ch5"を行う
make ev --- 進捗状況とgrep TODO
make link --- link.hyuki.net更新へ
make preview --- 自動的にプレビューするためのプログラムを起動します。 -here と書いたところがトップになります。
make pkill --- make previewで起動したプレビューアを終了します
ターゲット
make TARGET
のTARGET
の部分をターゲットと呼びます。これはmakeの用語です。
YukiTaskでは実際にターゲットを作ることは少なく、phony targetを利用します。
コマンド
YukiTaskのmakefile
中で呼びだすプログラムやツールをコマンドと呼びます。
「ターゲット」はmake TARGET
のTARGET
部分ですが、「コマンド」はそのOS上で動作するプログラムです。
変数
YukTaskのmakefile
中で使っている「現在の処理対象」を表すものを「変数」と呼びます。これはmakeの用語です。current
やmain
など。
make fig
fig
は、そのプロジェクトで作成している画像一覧を表示するターゲットです。
本を書いているときの図版一覧などを表示します。
関連コマンド
-
fig-thumbnail
指定したディレクトリ中の画像ファイルをサムネ付きで一覧表示するコマンド。
相互関連をつけるならScrapboxで作った方がいいかもしれない。
make g
g
は、本を書くプロジェクトで使っているOmniGraffleを起動するターゲットです。
一文字のターゲットは意外に忘れないものです。忘れてもmake help
で表示するようにしておけば大丈夫。
make show
show
は、標準的に使っているターゲットで「最新成果物を表示する」ものです。
show
はコマンドでもあります。「標準的に使っているターゲット」はそれ自体をコマンドにしている場合があります。
- 「標準的に使っているターゲット」には名前があった方がいいかもしれませんね。
- また「標準的に使っているけれど、コマンドにしていないターゲット」もあります。たとえば
help
など。 - そのあたりの使い分けは現在のところかなりアドホックです。
基本的な作業の流れ
YukiTaskでの基本的な作業の流れは、e
→mk
の繰り返しで成果物を作り、up
で成果物を公開/アップロードし、bk
でバックアップするというもの。
作業自体の管理として、m
でmakefile
の編集をし、f
でアップロードの設定ファイルを編集します。
補助的な作業として、show
やmake view
で成果物や参考資料を表示したり、help
でターゲット一覧をみたりします。
このくらいの抽象度でプロジェクトを管理するのがYukiTaskです。
make ev
ev
は、現在の進捗状況を評価・表示するためのターゲットです。
たとえばメルマガを書いているときには以下のように進捗が表示されます。
$ make ev
11573 mm523.txt 96% ************************************************..|
11411 mm524.txt 95% ***********************************************...|
9458 mm525.txt 79% ***************************************...........|
10243 mm526.txt 85% ******************************************........|
11104 mm527.txt 93% **********************************************....|
11800 mm528.txt 98% *************************************************.|
10414 mm529.txt 87% *******************************************.......|
10097 mm530.txt 84% ******************************************........|
11717 mm531.txt 98% ************************************************..|
10432 mm532.txt 87% *******************************************.......|
make link
link
は結城が使っているURL Shortenerの更新をうながすターゲットです。
たとえばWeb連載を書いているときにmake link
を実行すると、URL Shortenerの設定ファイルをエディタでオープンし、編集すべき当該箇所を検索してくれます。さらに、保存して終了すると設定ファイルをgit commit && git push
することでURL Shortenerの内容を実際に更新します。
current = 現在の編集対象物
current
は「現在の編集対象物」を表す変数です。
結城メルマガを書いているときには current = mm123.txt
のように次に配信する号のためのテキストファイル名を設定しておきます。そしてもちろん、この変数を使って、e
というターゲットで編集したり、mk
やall
で成果物を作ったり、show
というターゲットで表示したりするのです。
最近は current
ではなくてid
を使う場合もあって、プロジェクトごとにばらつきがあります。id
を使うのは短いからです。
main = 現在のメインとなる編集対象物
main
は「現在のメインとなる編集対象物」を表す変数です。
current
の違いがわかりにくいので、本を書く場合で説明します。
-
current
は現在書いている章のファイル(たとえばchapter2.tex
) -
main
は各章をincludeしているメインのファイル(たとえばmybook.tex
)
make tweet
tweet
は「そのプロジェクトに関するツイートをする」ためのターゲットです。
典型的な処理は「ツイートのテンプレートをエディタで起動する」や、もっと積極的に「ツイートのテンプレートをpbcopy
コマンドでクリップボードに入れる」などです。
たとえば、ニュースレターを発行した後、その告知ツイートを行うときに使います。
pbcopy
pbcopy
は、クリップボードにテキストをコピーするMac標準のコマンドです。詳しくはman pbcopy
でマニュアルが得られます。
EDITOR = 標準テキストエディタ
EDITOR
は「標準テキストエディタ」のコマンドを表す変数です。これはUNIXで標準的に使われている変数になりますので、makefile
内で明示的に記述する必要はないかもしれません。
たとえば結城は、~/.bash_profile
中で以下のように設定しています。
export EDITOR=/opt/homebrew/bin/vim
makefile
中では、以下のように使います。e
はターゲット、@
はコマンドラインのエコーバックを抑止する文字、current
は現在の編集対象となっているファイル名を表す変数です。
e:
@ $(EDITOR) $(current)
make delete-sharing
delete-sharing
は「共有の期限切れになったファイルを削除する」というターゲットです。
このターゲットそのものが重要というよりも、ターゲットのネーミングに関する知見がここにあります。
通常はYukiTaskのターゲットは「よく使うもの」を設定します。よく使うので短いターゲット名にすることが多いでしょう。
でもターゲットの中には「頻度は低いけれど、重要で、繰り返し実行される」というものもあります。そのときには意識的に長めの名前、複合的な名前を付けるのがよいでしょう。誤って実行されることを防いだり、それを実行したら何が起こるかわかりやすくなるからです。
here SHORTNAME
と here LONGNAME.WITH.DOMAIN
here
コマンドで現在のプロジェクトに移動するショートカット(alias)を登録するときには、いつも使う短い名前(SHORTNAME)と、しばらくたって忘れたときでも使えるドメイン付きの長い名前(LONGNAME.WITH.DOMAIN)の二種類を登録するといいでしょう。
たとえば、結城浩の作業ログについてはSHORTNAMEとしてlog
を、LONGNAME.WITH.DOMAINとしてはlog.hyuki.net
を登録しています。
ふだんはlog
で十分なのですが、何かの拍子に別のプロジェクト名でlog
を上書きしたときや、すっかりプロジェクトにくるショートカットを忘れてしまったときのために、log.hyuki.net
でもプロジェクトに行けるようにするのです。
so
コマンドと_alias
ファイル
so
コマンドでsource _alias
を実行します。
_alias
にはそのプロジェクト固有のaliasを書いておきます。
いつも編集するファイルがいつも複数あるような場合、e
ターゲットだけではまかなえない場合があるので、その対処のためです。
全体のaliasに指定するとコンフリクトを起こす危険性があるので、そのプロジェクト固有のaliasとして_alias
ファイルに明記しておくのです。
たとえば、いつもstyle.css
とindex.html
を編集するような場合、次のように_alias
に書いておきます。
alias css=`vi style.css`
alias ind=`vi index.html`
これで、so
すると、css
とind
がそのプロジェクトで使えるコマンドになります。
_alias
で指定する名前はアドホックに決めて構いませんが、指定する前にtype css
などとしてaliasやコマンドとコンフリクトしていないかチェックするといいでしょう。
mk
するのに複数のケースがある場合
mk
するのに複数のケースがある場合の対処法です。
以下のように_alias
ファイルに書いておきます。
alias mmk='make all'
alias mmi='make ids'
そしてmakefile
には次のように書きます。
mk:
@ iputs 'mmk はmake allを実行します。`
@ iputs 'mmi はmake idsを実行します。'
@ iputs 'ただし、最初に so によって source _alias を実行してください。'
all:
# allの実行内容
ids:
# idsの実行内容
このようにすると、いつもの手癖でmk
を実行したときに次のようなガイダンスが表示されます。
$ mk
mmk はmake allを実行します。
mmi はmake idsを実行します。
ただし、最初に so によって source _alias を実行してください。
iputs
コマンドとcputs
コマンド
iputs
コマンドは情報表示用に青色で表示するecho
です。
cputs
コマンドはエラー表示用に赤色で表示するecho
です。
make diff
diff
は「ある特定の差分を表示する」ターゲットです。
たとえば、前回のリリースからの差分を表示するときなどに使います。
ls -lD format
で特定のファイルのタイムスタンプ表示をフォーマットする
$ ls -lD 'DATE=%Y-%m-%d TIME=%H:%M:%S' filename
..... DATE=2022-06-30 TIME=22:14:35 filename
R
コマンド
R
コマンドはREADME.md
を編集するコマンドです。
make new
new
は新しい何かを作るためのターゲットです。
たとえばブログ記事で新しい投稿を作るときなどに利用します。
make lint
lint
は成果物をチェックするためのターゲットです。
たとえば文法事項のチェック、いわゆるlintツールの起動、あるいは音声合成による読み上げなどに利用します。
make url
url
は関連URLを表示するためのターゲットです。
たとえば成果物が公開されるWebサイトのURLなどです。
H
コマンド
H
コマンドはhistory.txt
を編集するコマンドです。
類似のコマンドに、R
(README.md
)やT
(TODO
)などがあります。
結城は使っていませんが、人によってはC
(Change.log
)も便利かもしれません。
id = 現在の編集対象物を示すID
id
は「現在の編集対象物を示すID」を表す変数です。
Web連載を書くときに、連載第369回を編集しているときのmakefile
の冒頭は次のようになっていました。
...
id = 368# 2022-09-09
id = 369# 2022-09-16
# latest_id
# id = 370# 2022-09-23
current = ../doc/$(id).tex
つまり、連載の回をidで指定しておき、コメントにそれを公開するはずの日付を書いておき、最前線を表すためにmakefile
中にlatest_id
というコメントを書いておくということです。
さらに、編集ファイル名current
は変数id
を用いて構成しています。
make LS
LS
はリモートでls
に類することを行うターゲットです。
ローカルとリモートで同じmakefileを使い回しているので、大文字の実行によってリモート実行(ssh)を意味することにしています。
LS:
@ ssh YourHostName '(cd /Your/RemoteWorking/Dir ; ls )'
YoutHostName
は~/.ssh/config
で指定するホスト名のつもりです。
make MAKE
make LS
と同様です。
MAKE:
@ ssh YourHostName '(cd /Your/Remote/Working?dir ; make )'
make env
, make showenv
env
は環境変数に関わるターゲットです。
プロジェクトによっては、env
とshowenv
の二つを使います。
Netlifyなどの静的Webサイトホスティングの環境変数設定セクションをブラウザで表示したり、あるいはローカルな~/.bash_profile
に記述されている環境変数をgrep
などで表示したりします。
env:
@ open 'https://app.netlify.com/sites/EXAMPLE-DOT-COM/settings/deploys#environment'
showenv:
@ grep EXAMPLE_ACCESS_TOKEN ~/.bash_profile
make func
func
はFunctionsに関わるターゲットです。
Netlifyは静的Webサイトのホスティングを行いますが、サーバサイドで処理を実行できるFunctionsという機能があります。それに関わる設定画面を表示します。
func:
@ open https://app.netlify.com/sites/EXAMPLE-DOT-COM/functions
make ENV
ENV
はリモートホストの環境変数に関わるターゲットです。
単純にssh
を利用してcat .env
を行う場合もありますし、ssh
を利用してリモートホストでmake env
を利用することもあります。
ENV:
@ ssh REMOTE-HOST '(cd ~/MyProject && cat .env)'
make logseq
, make dyna
, make graffle
logseq
,dyna
,graffle
はそれぞれLogseq, Dynalist, OmniGraffleを表しているターゲットです。
そのプロジェクトで標準的に使うアプリやファイルをターゲットに結びつけておき、make アプリ名
でそのアプリを起動します。
make help
で一覧が表示されるようにしておきます。
アプリによっては特定のスキーマを持っており、そのURLを利用してファイルをすぐに開いた状態にできます。たとえばLogseqの場合にはlogseq://graph/dbname?page=ページ名
という形のURLになります。
logseq:
@ open "logseq://graph/dbname?page=xxxxxxxxxxx"
help:
@ echo 'make logseq でLogseqを起動します。'
make mid
mid
は画像生成AI midjourney のプロンプト例を表示するターゲットです。
そのプロジェクトでバナー画像やアイキャッチ画像を作るときに使います。
関連コマンドmid-banner
によって記事のタイトルやアイコン画像を付加します。
h
h
はmake help
のaliasです。
YukiTaskのコマンドやターゲットが充実してくるとともに、make help
の重要性も高まります。h
はシェルのhistory
コマンドのaliasにすることも多いですが、make help
にするのもよいでしょう。
alias h='make help'
c
c
はmake config
のaliasです。
そのプロジェクトの設定やconfigurationを行うために使います。直接的に、たとえばc
をvi config.yaml
のように実装してもかまいませんが、プロジェクトごとに「設定」の意味はかわりますので、make config
という形で間接的に参照し、実装はそのプロジェクトのmakefile
に記述する方が柔軟性は高くなります。
alias c='make config'
.PHONY: config
config:
@ vi config.yaml
make config
config
は設定を行うためのターゲットです。vi config.yaml
のように実装したり、vi ~/.ssh/config
のように実装します。実装するというのはmakefile
に記述するという意味です。
make list
list
は一覧を得るためのターゲットです。そのプロジェクトでの「一覧」を適切なフォーマットで表示します。特定のファイルのls
を取るのでもいいですし、特定のファイルの内容の一行目だけを表示することもあります。
たとえばLaTeXで原稿を書いているとき、各ファイルが章に対応しているとします。一行目にその章のタイトル\chapter
があると仮定して、make list
によってLaTeXファイルを見て章のタイトル一覧を得ることができるでしょう。
ll
などにmake list
をaliasすればさらに便利になります。
~/.bash_profile
alias ll='make list'
以下の例では、make list
を実行すると、そのプロジェクトの bin/list-files
を実行します。bin/list-files
は自分で実装しておきます。
makefile
list:
@ bin/list-files
お知らせ:今週のYukiTask
結城浩のメールマガジンで「今週のYukiTask」というコーナーが始まりました。
Webページで公開している内容がベースになりますが、そこに書かれている情報だけではなく「何を考えてそうしたのか」という部分も合わせてご紹介できたらいいなと思っています。そしてもちろん、私自身もそこを明確に言語化したいと思っています。
make readme
(r)
readme
はGitHubのREADME.mdのプレビューを表示するターゲットです。r
をaliasにしたらどうかと検討しています。
-
T
は、TODO
を編集するalias -
R
は、README.md
を編集するalias -
make readme
は、README.md
のプレビューを表示するコマンド(readme
がターゲット) -
r
は、make readme
のalias
make howto
howto
は手順書やマニュアルを表示するターゲットです。GitHubのreadme, GitHub Gist, esa, テキストファイルの表示、Logseqなどに置かれた「そのプロジェクトの手順書」を表示します。
バリエーションとして howto-SOMETHING
でSOMETHING
をするための手順書を表示するターゲットもあり得るでしょう。
howto:
@ open 'https://example.com/howto.html'
make usage
usage
はそのプロジェクト固有の自作ツールの使い方をまとめて表示するターゲットです。作ったツールを順番に--help
オプションを付けて実行するイメージです。
usage:
@ puts "bin/myTool1"
@ bin/myTool1 --help
@ puts "bin/myTool2"
@ bin/myTool2 --help
関連ターゲット
help
はmakefileそのもののヘルプを表示します。
TODO
でコミットログの下書きをする
TODO
の末尾には最前線の情報が集まるので、そこでコミットログの下書きをしておきます。TODO
末尾をコピーしてしてからup
を実行し、git commit
で起動されるコミットログ編集画面でペーストするとスムーズに流れます。
make aws-user
aws-user
はそのプロジェクトに関係したAWSユーザの管理ページを表示するターゲットです。同様にaws-domain
やaws-role
なども使うことができるでしょう。
aws-user:
@ open "https://REGION.console.aws.amazon.com/iam/...”