ミームの死骸を待ちながら

We are built as gene machines and cultured as meme machines, but we have the power to turn against our creators. We, alone on earth, can rebel against the tyranny of the selfish replicators. - Richard Dawkins "Selfish Gene"

We are built as gene machines and cultured as meme machines, but we have the power to turn against our creators.
We, alone on earth, can rebel against the tyranny of the selfish replicators.
- Richard Dawkins "Selfish Gene"

Go言語でAsanaのコマンドラインなクライアント作った

こんてんつ

  • これはなに
  • つかいかた
  • GoかわいいよGo
  • これから

これはなに

去年から仕事のタスク管理にAsanaを使ってる.

f:id:Hash:20140816063717p:plain

...んだけど, Webインターフェイスがイマイチ. 重いし, 愛用してるViChromeとの相性が悪いのか多言語での利用をあまり考慮されていないのか, 入力文字の変換中に勝手に確定されてしまったりとストレスがたまる.

なので, 最近周囲でGo機運が高まってきたこともありGoでクライアントを書いてみた

memerelics/asana -- GitHub

つかいかた

せっかくの機会なのでHomebrewでインストール出来るようにしてみた. memerelics/homebrew-asana レポジトリを作成してgo getするだけのFormulaを書いておけば,

$ brew tap memerelics/asana
$ brew install asana

で入る. tap便利. Macじゃない人は

$ go get github.com/memerelics/asana

でどうぞ. うまく動かなかったら教えてください.

で, 使い方. だいたいREADMEと同じ内容になってしまいそうだけど.

Asanaは API KEYを使って認証するのが簡単なのでkeyを設定します. 専用のasana configというコマンドがあるのでそいつを叩く.

$ asana config
visit: http://app.asana.com/-/account_api
paste your api_key: _ <Copy API KEY from URL above and paste it.>

f:id:Hash:20140816063224p:plain

Asanaの設定画面からAPI KEYをコピペしてEnter押せば, 次にworkspaceを選択させられる(workspaceが1個しかなければ自動でそれ選択). 以上で設定完了, 設定内容は~/.asana.ymlに保存される.

タスク一覧を見るにはasana tasks

$ asana tasks
 0 [ 2014-08-23 ] 厚生労働省のデータを元に栄養素の摂取量基準作成
 1 [ 2014-09-01 ] co-meetingをEverNoteに
 2 [ 2014-09-01 ] RSSをbotに吐かせたい.
 3 [ 2014-12-11 ] 食べログ「行った・行きたい」を取得して表示するアプリ
 4 [            ] Android公式チュートリアル by Googleをひと通り

なんかこんな感じで出てくる. タスク番号, 期日, タイトル. asana task -v <task_id>とすれば詳細が見れる. このtask_id長いのでそのうちなんとかする(20140824 =>なんとかした).

$ asana task -v 1

[ 2014-09-01 ] co-meetingをEverNoteに
--------
co-meetingをEverNoteに
------------
created_at: April 03 2014 06:31:52 AM
url: https://www.evernote.com/Home.action#n=62e6c95d-8888-0000-ac23-aaaaaaaaa05b

----------------------------------------

assigned to you (2014-04-03T07:22:35.735Z)
--------
changed the due date to May 1 (2014-04-03T07:22:35.785Z)
--------
重要度は増すばかり
by memerelics (2014-06-13T03:24:23.187Z)
--------
APIはあるけどGETがないという...
by memerelics (2014-06-21T07:04:34.979Z)
--------
changed the due date to September 1 (2014-08-15T20:24:21.917Z)
--------

コメントや"assigned to you"といったhistoryを表示しなくてもいいときは-vを外す.

出自を少し説明すると, このタスクはEverNoteの「やりたいこと」Notebookに突っ込んだNoteがIFTTTで自動的にAsanaに登録されたもの.

タスクが完了した時は

$ asana done 1

期日を更新するときは

$ asana due 1 2014-09-21

あと, コメントを投稿.

$ asana comment 1

するとエディタ(実際には$EDITOR環境変数を見てる)が開いてコメント編集画面になる.

f:id:Hash:20140816063221p:plain

git commitの真似をしたくて頑張った. けっこう実装苦労したんだけど, ちょこっと「了解」とか書くだけの時もあるし, git commit -m相当のワンライナでコメントする機能もあったほうがいいなと今気付いた.

GoかわいいよGo

以下実装, とGoの楽しさについて. 「そんな新しい概念もないし, goroutineを除けば惹かれる要素もなさそう」と, チュートリアルをさっと流した程度でGoにはしばらく無関心だったのですが, いざ真面目に使ってみるとなんだこれってくらい書きやすい. ポイントを箇条書きすると,

  • gofmtの存在. 書式のブレを規約で回避.
  • 賢い型付け.
    • 型があることにより「ポカミス」を事前回避できるのが心強い.
  • 基本的なライブラリがひと通り揃ってる.
  • 例外がないのも意外と良い.

といったところだろうか. 何かいい表現思いついたらあとで追加する.

とくに型素敵. また, ビルドするとパッケージや変数の不使用もチェックされるので, コードがクリーンに保たれる. 脳味噌を些末事に使うことなくコード書ける気持ちよさ!

Emacsで保存時に自動的にフォーマットするgo-mode設定はこんな感じです.

例外がないのってどうよ? と思ったけど, いちいちチェックするのはめんどくさいものの, エラーを逐一ハンドリングすることでコードの見通しはよくなる気がする. 先の不使用チェックとも合わせて基本的に「小姑のように整頓していくことで, コードが決定的に破滅するのを防ぐ」スタイルなのかな. 上位1%かそこらの上澄みエンジニアが集まるGoogleが創り出したのが, わかりやすさを重視する小姑言語, って考えると面白い.

まだよく理解してない(と自覚してる)のがinterface, goroutineなので実装して出会ったら集中的に勉強する.

これから

最低限の機能が実装できて, 普段使いとしてはそこそこ使える感じになってきた. Asana使ってる人ヘーシャ以外で見たことないからニーズないんじゃねーのと思うけど, よかったらどうぞ.

上に書いたように, そもそもWebインターフェイスが重いというのが作成モチベのひとつだったので, 手元でサクサク動かせるように高速化はしたいと思ってる. 来週くらい. 複数のendpointを叩いているコマンドはgoroutineで並行処理させたり, リストをcacheしたり(破棄タイミングどうしよう), という方向をイメージしてるけどどうかな...

メインは速度だけど, 細々した使い勝手は改良して行くつもり. 特に長々したtask_idを打つのがイヤなので, index(何行目か)でアクセスできるようにしたい. asana done i1とか. i1-i5で一気に完了できたりすると気持ちよさそう(これもgoroutineが活きる).

いじょ

以上, しれっと4年ぶりの更新. はてなブログMarkdownで書けるのいいね.

追記 20140824

「これから」で書いた予定はだいたい実装できたのでv0.1.0に上げました.

  • キャッシュしたりtask詳細取得のところでgoroutineを使ったりしてちょっと速くなった
  • indexを使って0,1,2という番号でタスクにアクセスできるようにした

コレに伴って本文の例もすこし修正.