ZEALOTエンジニアブログ
Alfred

Doit.imのタスクを表示するAlfred Workflowを作ってみた

Pocket

数年前にGTDに興味を持ち「はじめてのGTD ストレスフリーの整理術」なんかを読んだりして、自分のタスクはオンラインのツールで管理するようになりました。当時は有志数名(このときのメンバーは現在社員)でGoogle App Engine上にGTDのWebアプリをのせるなんていうこともやっていましたが、現在はDoit.imに落ち着きました。このアプリは基本的にWebベースなのですが、iPhone/Android用のアプリやMac/PC用のアプリが提供されているので、いつでもどこからでも快適に利用できるのが良いです。

そして去年あたりからMacのランチャーをAlfred v2に替え、さらにこの記事を読んでから「Workflow超絶便利!」ということになり、Doit.imのタスクもAlfredでなんとかしたいと思うようになりました。検索してみるとオフィシャルのWorkflowが提供されているようだったので、早速それをインストールして使い始めました。

が、このWorkflow、タスクの追加ができるのみで参照系は一切提供されていませんでした。確かにクイックにタスク追加できるのは便利なのですが、同じくらい簡単に今やるべきことを見たいと思うわけです。

なければ作ろう!

前置きが長くなってしまいましたが、そんなわけでないものは作ってしまおうということになり、3日くらいで作成しました。本当は1日半でほぼ完成したのですが、ある不具合に遭遇して(後述)、それを解決するのに時間がかかってしまいました。作成したWorkflowは以下のリンクからダウンロードできますので、使ってみてください。

Alfred2 Doit.im

hotkey-today

事前準備

事前に以下の準備をしておく必要があります。

主な機能

  • Doit.im上のタスクをAlfredで表示します
  • タスクのプライオリティに応じた色付きアイコンを表示します
  • inboxとtoday、nextのタスクを表示します
  • 各タスクの詳細をブラウザで開くことができます

インストールとセットアップ

  1. Alfred2 Doit.imをダウンロードします
  2. ダブルクリックしてAlfredにインポートします
  3. Alfredを起動してdiiとタイプします
  4. Doit.imにログインするためのダイアログが表示されるのでアカウント情報を入力します
    dialog-username
    dialog-password

利用可能なコマンド

  • dii
    inboxのタスクを表示します
  • dit
    todayのタスクを表示します
  • din
    nextのタスクを表示します

RubyでのWorkflowの作り方

AlfredはWorkflowの作成方法を公開しているので、それに従って作ることができます。対応している言語も多い3ので自分に合った開発ができるのも特長だと思います。今回作成したWorkflowはWebへのアクセスが必要で、かつDoit.imの認証も通さなければならなかったため、スクレイピング経験のあるRubyを選びました。

素でそのままコーディングをしてもいいのですが、既にAlfred Workflowを作成するためのGemを公開している方がいたのでそれを利用させてもらいました。また、そのGemを利用したWorkflowプロジェクトのテンプレートも用意されているので至れり尽くせりです。しかし、いざ作り始めてみるとREADMEの説明のような状態にならず、大ハマリしてしまいました。どうやらMavericksには対応していないようで、こちらの記事によるとForkして対応しているテンプレートがあるようだったので、それを使うように変更しました。

実装方法はテンプレート内のmain.rbあたりを見ると良いと思います。やりたいことに集中できるように、WorkflowのAPI的な部分はあまり意識することがないようになっています。

ビルドしたWorkflowを配布すると動かない問題

既に説明しているとおり、このWorkflowはWebサービスであるDoit.imにアクセスする必要があります。また、このDoit.imでは現在のところ正式なAPIが公開されていないので、ブラウザで利用するのと同じようにタスク一覧を取得する必要があります。ということでRubyのMechanizeを利用してスクレイピングの要領でタスク一覧を取得するように実装しました。

この実装、ローカル環境では正常に動作するのですがrake export4して出力されるパッケージを他のMacで動かそうとすると動作しないのです。そしてログも出力されないのでなかなか原因を特定できません。数時間いろいろ探ってみてようやくそれらしい原因を突き止めました。実はMechanizeは内部的にNokogiriを利用しており、Nokogiriの構成にはバイナリのライブラリが含まれているのです。どうやらrake exportするときにはこのライブラリがきちんと梱包されずにパッケージングされ、他の環境ではそのライブラリを見つけられずに落ちてしまっているようでした。

Mechanizeはブラウザでユーザが操作するような遷移(ログインしてセッションを保持するなど)やCookieの保存やロードを簡潔に実装できるので、今回も何も考えずにMechanizeを利用していたことが問題となってしまいました。

原因がわかったのでMechanizeとNokogiriを利用しない実装に変更しなければならないわけですが、Rubyの標準ライブラリだけでは実装が面倒なのでなんとかラクをしたくて探しまわってみたところ、httpclientなら実現できそうでした。これまでも簡単なHTTP通信実装では利用していましたが、実はCookieの保存やロードもできるというのは知りませんでした。しかも、依存ライブラリもないのでクリーンに利用することができます。

まとめ

途中ハマったところはあったものの、Workflowそのものは意外と簡単に実装できることがわかりました。なお、ソースはGithubで公開しています。PRも大歓迎です。

tocky / alfred2-doit-im


  1. Mac App StoreでもAlfredが提供されていますが、これはバージョンが古いのでサイトからv2をダウンロードします。 

  2. Alfred Workflowを利用するためにはPowerpackを購入する必要があります。 

  3. Alfred Workflowは内部的にはMacに入っているシステムのPHPやRuby、Pythonなどを利用しているようです。 

  4. Alfred 2 Workflow Ruby TemplateのRakeで提供される、パッケージ作成のためのコマンドです。 

Pocket