ぽよメモ

レガシーシステム考古学専攻

ライフサイエンス辞書で単語を引くAlfred Workflowを作った

きっかけ

生物学を学んでいる身としては論文を読んでるときとかにパパッとライフサイエンス辞書を引けたら嬉しいなと思ったのと,ただ単に検索結果のURLをブラウザで開くだけなら最初からブラウザ使えば良いよねと思ったので,自作してみることにしました.

Go言語を使ったわけ

ライフサイエンス辞書は通常開くウインドウとは別に,こういった検索方法も存在します.最初はこれをただURL開くだけで良いかとも思ったのですが味気なく,しかしJSONXMLなどのAPIでもないためこれを再利用するにはスクレイピングが必須です.

AlfredのWorkflowでは様々なスクリプトを実行できますし,そのままターミナルを叩けるのですが,スクリプト言語の利用できるライブラリはその環境に依存してしまいます.スクレイピングをするのに外部ライブラリ無しという縛りはあまりにも鬼畜であるので,どうにかしてライブラリを使いつつ,環境依存を減らしたいなと考えたときにGoを思い出しました.

バイナリ一発で動くというのが魅力で,今回の用途に適しているのではないかと考えやったことも無いのにとりあえず書いてみることにしました.

環境

  • Alfred v3.3.1
  • Go 1.8.1
  • Glide 0.12.3

今回はGoのパッケージ管理にGlideを使用しました.なお,このWorkflowを動作させるだけであればGoもGlideも必要ありません.自分でビルドする場合のみ導入してください.

lsd-alfred

リポジトリは以下になります.

github.com

できること

ライフサイエンス辞書から単語を引くことが出来ます.英語,日本語どちらでも検索可能です.
検索方法は以下の4通りあります.

  • 前方一致: lsd begin "{query}"
  • 後方一致: lsd end "{query}"
  • 部分一致: lsd in "{query}"
  • 完全一致: lsd eq "{query}"

検索してブラウザで開く

検索した後Shift + Enterでデフォルトブラウザを使用して開きます.

f:id:pudding_info:20170410104855g:plain

検索してクリップボードにコピー

検索した後Command + Enterクリップボードにコピーします.
また,最前面の入力ウインドウに対して自動的に入力を行います.この設定はWorkflow中のCopy to Clipboard中のオプションを変更することで無効にもできます.

f:id:pudding_info:20170410111425p:plain

f:id:pudding_info:20170410110044g:plain

検索結果から再検索

検索した後Fn + Enterで再検索をかけます(意味があるのかは分からない…)

f:id:pudding_info:20170410110330g:plain

検索結果をさらに検索エンジンにかける

検索した後Ctrl + Enterでググります.

f:id:pudding_info:20170410110650g:plain

検索結果をSpotlight検索にかける

検索した後Alt + EnterでSpotlight検索にかけることができます.(GIF略)

検索結果の一覧ページを開く

See all resultsの項目でShift + Enterすると一覧が開きます.(GIF略)

ホットキーを使用して選択文字列を検索

初期では使用できません.使いたい場合,Alfred Workflowの設定を開いてlsd-alfredのHotKeyの項目に好きなキーを割り当ててください.デフォルトでは部分一致検索を行います.

f:id:pudding_info:20170410123745g:plain

できないこと

まだシソーラスコーパス検索には対応していません.が,原理的には同様にスクレイピングをするだけで実現可能であるため,実装すれば実現は容易です.

まとめ

f:id:pudding_info:20170410111429p:plain

作ろうと思い至ってからGoに入門して完成までだいたい2日でここまできたので個人的には満足です.が,まだまだ常用ツールとしては未熟な作りでひどいコードなので少しずつリファクタリングしていきたい…たぶんバグたくさんあるのでPR待ってます(他力本願)

一応.alfredworkflowなパッケージは以下からダウンロードできます.使用は自己責任で…

Releases · pddg/go-lsd-alfred · GitHub

Alfred Workflowの作り方

ネットを検索していると何か色々とWorkflowの作り方が出てきますが大抵古いです.現在は標準でAlfred 3がエクスポートの機能を持っており,外部ツールを用いる必要はありません.

Alfred無しで(CI等で).alfredworkflowなパッケージを作るにはどうもzip圧縮して拡張子を変更してやれば良いだけ?っぽいです.

以下簡単に手順です.

  1. Blank Workflowを作成し,詳細情報を入力
  2. 作成したWorkflowを二本指タップするとOpen in Finder…が出てくるのでそれを押す
  3. 開いた場所に実行するスクリプトや必要な設定ファイル等を置く
  4. 編集する
  5. Exportする

以上です.

Workflowとスクリプトの連携について

phpなどを使う場合,あらかじめ用意されたworkflow.phpなどを利用する方法が出てきますが,今回のように自作バイナリを叩く場合の記述に関しては全然見当たらなかったので本家の英語ドキュメントを軽く読んでやりました.今でも合っている自信が無いです.

Alfred 3からはXMLだけでなくJSONも使用できます.一応XML後方互換のために残しているだけのような感じなので,JSONを使用していこうと思います.Workflowで使用するのはScript Filterです.

www.alfredapp.com

{"items": [
    {
        "uid": "ID",
        "type": "file|default|skipcheck",
        "title": "title",
        "subtitle": "subtitle",
        "arg": "url",
        "autocomplete": "title",
        "valid": true
        "icon": {
            "type": "fileicon",
            "path": "path"
        },
        "mods": {
            "alt": {
                "valid": true,
                "arg": "url",
                "subtitle": "subtitle"
            }
        },
        "text": {
            "copy": "Text to copy",
            "largetype": "Large Text"
        },
        "quicklookurl": "url"
    }
]}
  • uid: ユニークキー.ここの値を元にソートされるっぽい.
  • type: このオブジェクトがファイルなのか,それ以外なのかを示す.fileを指定すると存在するかのチェックが入るので嫌な場合はskipcheckにせよと書いてある.
  • arg: 表示されたオブジェクトを選択してEnterを押したとき,次に渡される値.URLなど.
  • icon: typepathも空欄にしておくとパッケージに含めたicon.pngが勝手に使用される.
  • valid: Enter押したときに次のアクションを行うかどうか
  • mods: 修飾キーと組み合わせたとき,次に渡す値を変化させることが出来る.例えばalt+ Enterのときはタイトルを出力するが,Cmd+ EnterのときはURLを出力すると言った挙動に出来る.使える修飾キーはCmdAltCtrlShiftFn
  • text: copyの値はコピーしたときクリップボードにコピーされる値.largetypeCmd + Lを押したときに表示されるLargeTypeに表示するテキスト.

最終的に上記の形式(全てを含めなくても良い)のJSONを標準出力にPrintするだけで簡単に使えます.最高.

まとめ

Goは言語自体はシンプルなのですが,どうにもエラー処理やスライスの周りで頭が混乱してしまいます.もう少し使えるようになればかなり便利そう…

Alfred 3,Workflowでできることがとても多くて重宝しています.課金して良かった.