Hatena::ブログ(Diary)

kurainの壺

2013-02-19

Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス"

19:37 | Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス"を含むブックマーク Mac を使っているなら必ず使うべき2つの機能 "Automator" と "サービス"のブックマークコメント

f:id:r_kurain:20130219192544g:image

Automator ってなんか超高機能なマクロみたいなイメージがありますが、とても便利なのでご紹介。

もともとは、会社の上司が Windows から Mac に移行したのだけれど、"秀丸みたいに選択範囲を ruby で evalできないの" とおっしゃっており、しかも Emacs は微妙とのことなので、Automator でどうにかしてみた。Service でできるんじゃないかねと教えてくれた同僚に感謝。

追記(2013/02/24)

デバッグ方法を別エントリに書きました

できること

文字列選択して Ctrl+= を押すと選択文字列ruby で実行されます。編集可能なテキストエリアならだいたい何処でも。

作り方

f:id:r_kurain:20130219185514p:image

f:id:r_kurain:20130219185516p:image

  • "ruby -Ku" と書く

f:id:r_kurain:20130219185517p:image

f:id:r_kurain:20130219185515p:image

  • テキストエリアで、ruby のコードを選択する。さっき決めたショートカットキーを押す。コードが実行される。

f:id:r_kurain:20130219192544g:image

  • Ctrl-z で動作を取り消して、もとのコードに戻せるのもポイント高いですね。

ポイント


ショートカットキーが設定できるのが、とても重要で、画面ロックのショートカットキーも簡単にできます。

画面ロックの作り方

  • 途中まではさっきの例と同じ

f:id:r_kurain:20130219185513p:image

とすれば、画面ロックのための service になります。

発展型

スクリーンショットを撮って、fotolife に upload する。という gyazo みたいなスクリプトが一時期はやりましたが、これもショートカットキーから呼べるとかなり便利です。

use strict;
use warnings;
use Config::Pit;
use WebService::Hatena::Fotolife;
use IPC::Run qw(run);

my $conf = Config::Pit::get("hatena.ne.jp");
my $file_name = $ARGV[0];
my $tmp_filename = '/tmp/screencapture.png';

if ($file_name || run(['screencapture', '-i', $tmp_filename])) {
    my $hatena = WebService::Hatena::Fotolife->new;
    $hatena->username($conf->{user});
    $hatena->password($conf->{pass});

    my ($date) = $hatena->createEntry(
        filename => $file_name || $tmp_filename,
        folder   => 'work',
    ) =~ /(\d{14})$/;
    my $url = sprintf "http://f.hatena.ne.jp/%s/%s", $conf->{user}, $date;

    run(['open', $url]);
}

こんなスクリプトを書いておいて、

f:id:r_kurain:20130219185009p:image

こうやってサービスを作ると、ショートカットキー一発で、スクリーンショット取得と fotolife への upload まで完了できます。

y_gurikoy_guriko 2013/02/20 10:40 こんにちは、たかはしと申します。
試しにやってみたのですが、うまくいきません。。

ショートカットを呼び出すと
 「アクション“シェルスクリプトを実行”でエラーが起きました。」
となってしまいます。

シェルの設定が「/usr/local/bin/zsh」になっていて『これが原因かな』と思い記事通りに「/bin/bash」へ変更して実行すると、今度は何も起きませんでした。

これ使えたら便利だなーと思ったので、何か分かればよろしくお願いします。

r_kurainr_kurain 2013/02/20 11:34 シェルの設定はどちらでも大丈夫です。(/usr/local/bin/zsh が存在していれば)
"アクション“シェルスクリプトを実行”でエラーが起きました"

となっている場合は、実行されている ruby スクリプトが間違っている可能性が高いです。
ターミナルなどで
ruby -e 'あなたの実行したいコード'
というような感じで、ruby のコードを実際に実行してみて、syntax error が無いか確認してみて下さい。

ruby のコードが問題無く動く場合は、"ドロップダウンリストで選べるオプション"、たとえばサービスが受け取る選択項目などが、この記事の画像と合っているか確認してみて下さい。

wmv変換wmv変換 2013/02/20 17:02 とても便利ですね。Macでwmv変換したいなら、http://www.iskysoft.jp/article/how-to-play-wmv-video-on-mac.htmlまでご参考ください。

leelaleela 2013/02/20 17:24 便利すぎます。素晴らしいTips、ありがとうございます。

ところで、Rubyコードが間違っていた場合、「アクション“シェルスクリプトを実行”でエラーが起きました。」とダイアログが出るのでなく、syntax errorのエラー文で置き換えてくれるようにはできないのでしょうか?

leelaleela 2013/02/20 17:58 行けました。
「echo `ruby -Ku -e "$@" 2>&1`」
とすると、コードが間違った時にシンタックスエラー出力で置き換えられます。

これで、長いRubyコードでも試行錯誤できますね。

leelaleela 2013/02/20 18:06 あ、言い忘れていました。
上のスクリプトでいく場合は、「入力の引き渡し方法:」メニューで「引数として」を選んでください。

r_kurainr_kurain 2013/02/20 18:27 y_gurikoさん
前言を撤回しておきます。 /bin/bash のほうが良いかもしれません。手元の環境では /usr/local/bin/zsh では上手く動きませんでした。

leela さん
leela さんの方法でも上手く動くのですが、出力の改行がなくなるようです(僕の環境では)。
ということで、エラーの確認もしたければ入力の引渡し方法を "stdin へ" で出来るように

"ruby -Ku 2>&1 || echo;"

とすると良いかもしれません。 "|| echo" はスクリプトが正常終了しないと、Automator が正しく動かないのでつけています。

leelaleela 2013/02/20 19:07 r_kurainさん
ありがとうございます。"ruby -Ku 2>&1 || echo;"で改行行けました。

コメント投稿した後に私も改行が無くなる事に気付きまして、
eval echo '$'"'`ruby -Ku -e "$@" 2>&1`'"
なんて複雑な解決策を思いついたんですが、
たしかに
ruby -Ku 2>&1 || echo;
の方がスマートですね。そうかー || echo; なんてやり方があったのか。知りませんでしたw
ありがとうございました。

leelaleela 2013/02/20 22:35 たびたびすみません。
このRubyコード実行のサービスの結果には満足しているのですが、
私のマシン(MacBook Pro 2012年モデル)では実行に7〜8秒もかかってしまいます(2回目以降は多少速くなりますが)
もっと高速に動作させることはできないでしょうか?

r_kurainr_kurain 2013/02/20 23:53 leela さん
コードの内容にもよるので、なんとも言えないところですね。
小さいプログラムでないなら、プログラムのプロファイリングをしてボトルネックを探すしかないです。

leelaleela 2013/02/21 01:43 レスありがとうございます。
いえ、本当に短い、テキストを出力するだけの1行プログラムです。
ruby -e コマンドで直接やったらあっという間でした。
ネットを検索してみると、どうやらAutomatorで作成したサービスは一般的に起動が遅いらしいですね。将来的にAppleが改善してくれるといいんですが……。

y_gurikoy_guriko 2013/02/21 09:32 >r_kurain さん

ご回答と検証ありがとうございます。
一応、シンタックスの確認も行なっていて、設定も画像に合わせていたのですがダメでした。ありがとうございました!

shoshinsyashoshinsya 2013/02/21 10:24 ruby自体をよく知らないので、質問させてください。

ターミナルで「ruby -v」を実行すると、「ruby 1.8.7 (2012-10-12 patchlevel 371) [i686-darwin12]」と表示が出るので、
rubyはインストールできていると思うのですが、何度やってもうまくいきません。

インストールするrubyのバージョンが違うのでしょうか。

お手数ですが、アドバイスをよろしくお願い致します。

r_kurainr_kurain 2013/02/24 01:16 leelaさん
手元のSSD搭載macでは快適に動いてるので、SSDつかってみるのもありかもしれません。(無責任に言っています)

y_guriko さん
あとで、もう少しデバッグ方法書きます

shoshinsyaさん
ruby のバージョンは問題無いと思います。あとで、デバッグ方法を書きます。

celladorsaikoucelladorsaikou 2013/05/11 02:08 なるほど

参考になりました

他の記事も拝見させていただきます

ありがとうございます

  • 20131208220000
  • 20131208215629
  • 20130224220108
  • 20130224220109
  • 20130224215833