開発者ブログ 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使って改善しようと思います。

GithubのIssue、PRを快適にするgemを作りました!

自己紹介

初めまして、playgroundエンジニアの海老沼です。

サーバーサイド(主にRails)やiOSアプリ開発に興味があり、大学に通いながら4ヶ月ほど前からplaygroundで働かせていただいてます。

趣味はテニスと映画鑑賞です。最近はWALKING DEAD観てます。

github.com


gemを作りました!

概要

railsに組み込んでサーバーにあげると、githubのwebhookを受け取って色々処理してくれるgemです。

ベースとなるpghub-baseと、機能別にpghub-lgtmpghub-issue_titleを作りました。

pghub-base

webhookで送られてきたデータを元にapiを叩いたりするなど、共通の処理を記述してあります。

pghub-lgtm

PRをreviewするとき最後にLGTM画像を貼っているのですが、いちいち画像を探して貼り付けるのめんどくさいなーと思っていました。

そこで、自動化してみました。コメントにLGTMという文字があれば、ランダムでLGTM画像を探してきて投稿してくれます!

こんな感じ。

f:id:playground-live:20171016153412p:plain

完全にランダムなので結構面白いです。 たまによくわからないのもありますが

pghub-issue_title

開発のタスク管理にGithubのissueを使っているのですが、issueにref issue(PR)のURLみたいな感じで参照したいissueとかPRのURLを貼ることが結構あります。

でもこれって、URLを貼っただけじゃそのURLに飛んだ先がどんな内容かわからないですよね。

なのでこれも自動化してみました。

ref URLと書くだけで自動でそのissueやPRのタイトルを投稿してくれるように!

こんな感じ。

f:id:playground-live:20171016155917p:plain

同じリポジトリのissue/PRだと#4とかになってしまいますが、それにも対応しています

f:id:playground-live:20171016155953p:plain

簡単に概要を確認できるので便利ですね。

導入方法

めっちゃ簡単です。

1. gemを入れる

rails new 適当な名前して、Gemfileに使いたいgemを書く

# LGTM機能を使いたい場合
gem "pghub-lgtm", "~> 1.0.0"

# Issueのタイトル投稿機能を使いたい場合
gem "pghub-issue_title", "~> 1.0.0"

# 両方
gem "pghub-lgtm", "~> 1.0.0"
gem "pghub-issue_title", "~> 1.0.0"

bundleする

2. ルーティングに追加する

routes.rbにマウントする

Rails.application.routes.draw do
  .
  .
  .
  # パスの部分に適当なパスを指定
  # (例) /github_webhooks とか
  # 既に追加されてるルーティングと違うパスになるように指定してください

  mount Pghub::Base::Engine => 'パス'
end

railsエンジンを使ってマウントする方法についてはrailsガイドで詳しく説明されています。

railsguides.jp

3. 投稿するユーザーのaccess tokenを取得する

Github を開いて、SettingsDeveloper settingsPersonal Access TokensGenerate new token

以下のように設定してトークン作成

f:id:playground-live:20171016152058p:plain

作成できたトークンをメモしておく

4. railsの設定

config/initializers以下にpghub.rbを作成する

以下のように、org名とトークンを指定する

Pghub.configure do |config|
  config.github_organization = "Githubのorganization(or user)名"
  config.github_access_token = "2で作成したトークン"
end
注意

githubにコードをアップする場合は、dotenv-railsとかを使ってアクセストークンを公開しないようにしてください。

5. 作ったrailsアプリをサーバーに上げる

herokuでもAWSでもなんでもOKです

herokuならこのあたりのサイトを参考にするといいと思います

6. github側でwebhookを設定する

issueかPRのメニュー右端のsettingswebhookAdd webhook

アドレスとか色々指定してwebhookを追加する

f:id:playground-live:20171016155135p:plain

7. 完了!

機能を試してみてください!


仕様について

  • pghub-baseというgemがあり、pghub-baseかpghub-issue_titleをインストールすると依存してインストールされるようになっています。
  • 基本的にuserもしくはorganizationでの利用を想定しているので、それ以外のリポジトリの情報を取得、投稿することはできません。
  • Railsエンジンを利用して組み込むので、Rails以外(sinatraとか)では使えません。

pghub-base

faradayGithubAPIを叩いています

github.com

pghub-lgtm

LGTM.in というサイトからLGTM画像を取っています

LGTM.in » Home

https://lgtm.in/g にアクセスするとランダム画像を表示してくれるので、そこからスクレイピングで取ってきています。

このサイトを利用したもので、LGTMのリンクを生成してくれるChrome拡張とかもありますが、やっぱり自動化の方が楽ですよね。

スクレイピングにはmechanizeを利用しました。

github.com

バグとか改善案とかあれば、こちらからissue作成をお願いします!


今回初めてgemを作ったのですが、結構簡単にリリースまで行けてびっくりしました。特異メソッドとかrubyディレクトリ構造とか知識でしか知らなかった部分を実際に実装したので凄く良い勉強になりました。

rubyの知識を深めたい人は、一度gemを作ってみるといいと思います!

最後まで読んでいただきありがとうございました!

Ruby + Github API を利用してalfred3 workflowを作る

自己紹介

初めまして、playgroundエンジニアの蔡樺です。

中国から日本に来て2年になります。

プロジェクト開発(主にRuby)やandroidアプリ開発に興味があり、大学院に通いながら4ヶ月ほど前からplaygroundで働かせていただいてます。

趣味はお菓子を作ることとお茶を賞味することです。

github.com


AlfredのCreate Issueワークフローを作成した。

リリース:https://github.com/playground-live/alfred-github-workflow

作成経緯

  • GitHubのissueは仕事中でよく使うので、もっと効率的に使いたいと思った。
  • GitHubリポジトリの検索ワークフローがあって、issue検索にも適応できると考えた。←(実際にとても参考になりました!)
  • Alfredでissueを検索とか、新規作成とかできれば、すごく便利だと思った。

github.com

概要

Create Issue は Aflred 3対応のGitHub issueを検索と新規ワークフローである。

出来る機能は:

  • issue検索
  • assigned-issue検索
  • all-issue検索(closed issue含む)
  • issue作成

SetUp

  • tokenの取得

repo権限のみをつけたtokenを発行して、取得したtokenをコピーする。

f:id:playground-live:20171101153009g:plain

  • tokenの保存

コピーしたtokenをこのようにalfred で入力する。

gi-auth YourAccessToken

f:id:playground-live:20171101144205g:plain

  • リポジトリ登録

登録したいrepoを選択する。

gi-repo

f:id:playground-live:20171101144544g:plain

機能

  • issue検索

gi

f:id:playground-live:20171101145712g:plain

  • all-issue検索

gi-all

f:id:playground-live:20171101150227g:plain

  • assigned-issue検索

gi-assigned

f:id:playground-live:20171101150908g:plain

  • issue作成

gi-create YourIssueTitle

f:id:playground-live:20171101151259g:plain

  • cacheのupdate

起動するたびにissueの更新をチェックしますが、うまく更新できないときは gi-update を実行してみてください

f:id:playground-live:20171101151732g:plain

参考


今回は初めてAlfredワークフローを作りました。RubyでHTTPの通信とかGitHub APIは今回で実際に使って、最後にできた機能は仕事中で役に立てば凄い嬉しいです。

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

日本語でブログを書くのは苦手ですが、playgroundの皆さんに色々と助けてもらいながら頑張って書きました。

最後まで読んでいただきありがとうございました!