開発者ブログ by playground

playgroundの技術系ブログ

Alfred3 Workflowsの作り方

こんにちは、playgroundエンジニアの蔡樺です。

Macユーザな私はAlfredというアプリに大変お世話になっております。

この記事では,Workflowsにどんな機能があるのか,私が作ったCreate IssueというWorkflowsの作り方とか、それぞれ書きで説明して行きます。

tech-blog.playground.live


Alfredの紹介

AlfredにはWorkflowsという機能があります。

このWorkflowsが非常に強力で、

  • Alfredを立ち上げてアプリ名を入力するとアプリが起動できます。

f:id:playground-live:20171114124216p:plain:w300

  • スリープ、スクリーンセイバー、再起動、ゴミ箱を空にする、システム終了、アプリ終了など、システム・コマンドをAlfredから実行できます。

f:id:playground-live:20171114124725p:plain:w300

  • ファイルやフォルダの検索することができます。

f:id:playground-live:20171114124917p:plain:w300

  • GoogleとかAmazonとか、よく検索するサイトをAlfredから検索できます。

f:id:playground-live:20171114125019p:plain:w300

と、他にも色々ありますが、 Alfredというアプリ上で、一つのまとまった作業を一気に行うことができます。

今回は、AlfredでIssueを検索と新規作成機能を作りました。

Issue新規作成機能はこういう感じです。

f:id:playground-live:20171114142744g:plain:w300


Workflowで使える機能紹介

Workflowsで利用できる機能の説明をします。

実際のWorkflowsはこんなかんじになります。

f:id:playground-live:20171114143852p:plain:w300

パズルのような感覚で入出力を繋げることで機能を作れます。

パズルの部品は大きく分けて4つあり、入力を受け取るTriggerやInputとそれを受けて実行するActionやOutputがあります。部品を組み合わせることで,Workflowが完成します。

ここでは,Alfredを起動した時に出てくる、入力を受けるものをウインドウと呼ぶことにします。

f:id:playground-live:20171114150223p:plain:w300

ウインドウに入力するとき、どのWorkflowかを指定する部分をキー、そのWorkflowに渡す部分を引数と呼ぶことにします。

では、よく利用するWorkflowの部品を紹介します。

Trigger

  • Hotkey:コマンド入力で実行される

  • External:外部のAppleScriptから呼び出せる

  • File Action:Alfredでのファイル操作一覧から実行

  • Contact Action:Alfredでの連絡先操作一覧から実行

Input

  • Keyword:キーと引数を受け取る,引数は必須,可,なしの3つから選択

  • File Filter:キーと引数を受け取り,引数でファイルを検索する.このとき,jpg,png等,欲しい拡張子を設定しておくこと,フィルタを掛けられる

  • Script Filter:スクリプトの実行結果をリストに表示する事ができる

Action

  • Open File:指定したファイルを開く。

  • Reveal File in Finder:指定したファイルのディレクトリをファインダーで開く

  • Browse in Alfred:AlfredのFile Navigaton Systemで指定したファイルを開く

  • Launch Apps/Files:指定しておいたアプリやファイルを開く.利用には,TriggerのHotkeyやInputのKeywordからつなぐのが一般的

  • Default Web Search:デフォルトのブラウザでそのクエリを検索する

  • Open URL:指定しておいたアドレスを開く,カスタムURL(queryを後からはめ込む)も使える,単体だとWeb Searchで追加するものと同じ機能

  • System Command:スクリーンセーバ,シャットダウン,強制終了などが利用可能

  • Run Script:bash, zsh, php, ruby, python, perl, osascriptが利用可能.ただし,ここでスクリプトを入力しておくと、alfredで自動生成されるInfo.plist(テキストファイル)の中で管理されるため、gitなどで管理する場合は、Run Script内では、python hoge.py "{query}"のように,外部スクリプトを実行する形にして切り分けたほうが良い

  • Terminal Command:入力しておいたスクリプトがターミナル上で実行される、ただし、この出力は次の工程では利用できない

Outputs

  • Post Notification:Notification CenterとGrowlが利用可能

  • Large Type:画面中央部に大きなポップアップで前工程の出力が表示される


言語について

その前に、workflows作成に利用できる言語について。

Create IssueはRubyで書かれています。 ですが、もちろん他の言語でも書くことができます。

他に対応している言語は、

  • bash
  • zsh
  • PHP
  • Python
  • Perl

があります。

Debug

AlfredでDebugすることができます。

f:id:playground-live:20171114153356p:plain:w400

Debug buttonを押して、Debug messageが表示できます。


作った物の紹介(プログラム構造)

では、私が作ったCreate Issueの一つWorkflowの作り方を紹介します。

f:id:playground-live:20171114155650p:plain:w300

input

inputはkeywordを選択して、引数は必要です。

f:id:playground-live:20171114155857p:plain:w300

入力値は引数{query}で格納しました。

action

actionはrun scriptを選択して、main.rbのcreateメソットを呼び出し、結果をブラウザーで開きます。

f:id:playground-live:20171114160827p:plain:w500

main.rbでcreateメソットは:

def create(query)
  load_token #トークンを取得
  load_current_repo #レポジトリを取得
  result = post("/repos/#{@current_repo}/issues?access_token=#{@token}", query) 
  puts result #HTTPによりGithubと通信して、レスポンスのURLをresultで格納する
end

Github APIを利用してpostメソット

def post(path, query)
  uri = URI.parse("#{BASE_URI}#{path}")
  http = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true)
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER

  request = Net::HTTP::Post.new(uri.request_uri) #PostでGithubと通信
  request['Content-Type'] = 'application/json'
  request.body = { 'title' => query }.to_json

  response = http.request(request)

  url = response.body
  JSON.parse(url)['html_url']
end

outputs

outputsはPost notificationを選択する。

f:id:playground-live:20171114164021p:plain:w300


参考


ここまで、Create Issueの一つWorkflow----Issueの新規作成が完了しました。

Github APIと連携したAlfred Workflowsの作り方は、このような感じになっています。

できたワークフローは簡単にFileを利用したが、キャッシュにissueの更新は予想より長い時間がかかるという問題があって、今後はDatabase使って改善しようと思います。