ラベル Terminal の投稿を表示しています。 すべての投稿を表示
ラベル Terminal の投稿を表示しています。 すべての投稿を表示

Pseudo TotalTerminal(偽の TotalTerminal)

今年に入ってやっと El Capitan にアップグレードしました。今までは新しい OS は必ずクリーンインストールしていたんですが、今回は Yosemite から直接 El Capitan に。不具合が出るかどうか分かりませんが、今のところ順調。

El Capitan といえば、ちょっと前に TotalTerminal が動かない、という話題を拝見しました。

最終的には Alfred のワークフローで問題は解決したようなのですが、問題としてオモシロイと思ったので作ってみました。


TotalTerminal の挙動をすべて再現できるわけではないのですが、以下の部分を作ってみます。

ひとまずこのスクリプトを実行することで、

  • Terminalが動いていなければ起動して最前面に
  • Terminalが裏にいるなら最前面に
  • Terminalが最前面にいるなら裏に回す

ことはできるようになった。


El CapitanでTotalTerminalが動かないならAppleScriptで代用すればいいじゃない? - TOKOROM BLOG

アプリケーションの状態を調べる方法はいろいろありますが、起動しているかどうかを確認したいなら、AppleScript が定義している application クラスの running 属性を調べてみればいい。

running of application id "com.apple.Terminal"
--> false

結果は真偽値で返ってきます。true なら起動中。これで最初の「Terminal が動いていなければ起動して最前面に」は以下のようにかけます。

if not (running of application id "com.apple.Terminal") then
    -- 起動していないなら起動して最前面に
    activate application id "com.apple.Terminal"
end if

次の「Terminal が裏にいるなら最前面に」も application クラスの frontmost 属性を使って調べることができます。

if not (frontmost of application id "com.apple.Terminal") then
    -- 最前面にいないなら前面に持ってくる
    activate application id "com.apple.Terminal"
end if

frontmost が true だと最前面にいるということなので最後の「Terminal が最前面にいるなら裏に回す」は次のようになります。

tell application "Finder" to set visible of process "com.apple.Terminal" to false

ここだけ application クラスではどうにもできないので Finder で処理しています。全部を組み合わせると次のようになります。


以上をスクリプトファイルとして保存すれば完成。これでも一応動作するのですが、課題も書かれています。

現在の課題としましては、

  • Terminalが起動しているがウィンドウがないときはウィンドウがないままアクティブになる(困ってはないけど勝手にウィンドウ作ってくれればスマート)
  • かっこよくない(冗長かもだが、TotalTerminalみたいにかっこよく動くとより良い)
  • プロセスの名前が常に Terminal でよいのかがよくわからん
  • Terminalが既にカレントのときにCommand+Tabキーを送って裏に回してるけど、もっとスマートな方法あるんじゃない?

などがありそうです。


El CapitanでTotalTerminalが動かないならAppleScriptで代用すればいいじゃない? - TOKOROM BLOG

いくつかは解決できるけど、面倒なものもありますね。

Terminal が最前面に来た時にウィンドウがなければ新しく作るというのは reopen 命令を使えば解決します。

-- 最前面にいないなら前面に持ってくる
activate application id appID
-- ウィンドウがないなら新しく作る
reopen application id appID

次の「かっこよくない」というのは...ウィンドウを上からスライドして表示、非表示のことでしょうね。できなくもないのですが...ちょっと手間が必要ですね。また、いつかということで(結局、やらない)。

「プロセスの名前が常に Terminal でよいのかがよくわからん」というのは、確かに AppleScript ではいつでも問題です。

ちょっと前まではアプリケーション名がバージョンアップにより変わりましたなんてことはよくあり、その度にスクリプトの修正を繰り返していました。

それはさすがに面倒なのでアプリケーションのバンドル ID(bundle identifier)から名前を取得するようにしています。この ID が変更になることはそうそうないので...。ちなみにこの ID を書き換えるだけで他のアプリケーションにも対応できます(あら、不思議)。

最後の Command+Tab キーでの Terminal の非表示はプロセスの属性 visible で変更できるのでそれを用いています。

最後にショートカット割り当てですが Apptivate、BetterTouchTool(有料になりましたね)、Karabiner などがあります。

もちろん AppleScript を実行できるランチャーならなんでもいいのですが、個人的には割当が簡単な BetterTouchTool を使っています。


Google のコマンドラインツールを使ってみる

Google から Google の各種サービスをコマンドラインから操作できるツール(GoogleCL)が出たようで、さっそく試してみました。

とりあえず、インストールした環境などを...。

  • Mac OS X 10.6.4
  • Python 2.6.1(Mac OS X にインストールされているもの)
  • gdata 2.0.10

python や Google Data API は、日常的に利用しているので環境が整っているのだけど、そうでないと Python から利用できる Google Data API(gdata)のライブラリのインストールから始める必要があります。Python が必須ですが、これは Mac OS X に最初から入っているもので構いません。

Python は必要だけど、GoogleCL を利用するために Python の知識はとりあえず必要ありません。Python は GoogleCL が背後で利用しているだけです。

gdata for python のインストール

以前のことなので詳細は忘れてしまいましたが...まず、gdata-python-client - Project Hosting on Google Code から gdata-2.0.10.tar.gz(2010年6月19日現在)をダウンロードします。

gdata を利用するには ElementTree というパッケージが必要なのですが、Mac OS X 10.6 にインストールされている python には既に ElementTree が入っているため、ElementTree をインストールする必要はありません。

以降、Terminal での作業になります。

Terminal を起動し、gdata-2.0.10.tar.gz のある場所に移動します。

$ tar zxvf gdata-2.0.10.tar.gz 
$ cd gdata-2.0.10/
$ sudo python setup.py install

これで Python 用の gdata ライブラリがインストールされます。

gdata さえあれば、Google の各種サービスを Python で利用することができるのですが、GoogleCL は gdata を意識せずに Terminal から Google の各種サービスを利用できるようになります。

直接 Python から gdata を利用するより処理は制限されますが、GoogleCL は gdata を実際に利用するより、気楽に利用できます。

GoogleCL のインストール

googlecl - Project Hosting on Google Code から googlecl-0.9.5.tar.gz(2010年6月19日現在)をダウンロードします。

以降、Terminal での作業になります。

Terminal を起動し、googlecl-0.9.5.tar.gz のある場所に移動します。

$ tar zxvf googlecl-0.9.5.tar.gz 
$ cd googlecl-0.9.5/
$ sudo python setup.py install

以上で GoogleCL を利用するためのライブラリはインストールできました。

実際に使ってみる

GoogleCL は、Terminal から利用します。最初にヘルプを参照しておくといいと思います。

$ google -h

コマンドラインからの利用は以下のようになります。

google [picasa|blogger|youtube|docs|contacts|calendar] TASK [options]

コマンド名の後に利用するサービス、その後に行う処理、最後にオプションを記述します。単純にコマンド名だけを入力すると、対話モードに移行します。

$ google[return] # 対話モードへ
> picasa list title
headerbg-1.png
sidebarbg.png
postbg.png
...
> ^D # 終了(Control-D)

サービスにより利用できるタスクとオプションは異なります。この辺りのことはヘルプに詳しいです。

では、Blogger サイトのリストを取得してみます。

$ google blogger list

Terminal で上記のコマンドを実行すると、ユーザー名を尋ねられます。blogger で利用しているユーザー名(Google アカウントのメールアドレスの @ の前の部分。もしくは、メールアドレス)を入力します。

すると、OAuth による認証を促されます。

Please log in and/or grant access vis your browser at...の後に https で始まる URL が表示されると思います。この URL をコピーし、Safari などのブラウザでアクセスします。

ブラウザで認証を行った後、Terminal に戻り、Enter(Return)キーを押すと、Blogger での記事タイトル一覧と URL が取得できます。認証に失敗すると Failed to get valid access token! と表示されて、処理は終了します。

各サービスは初回実行時にのみ認証を求めます。この認証を行っておくと、以降の操作では認証は必要ありません。

設定ファイル

GoogleCL のインストールが完了すると、ユーザーのホームディレクトリに googlecl という Finder で表示されない非表示のディレクトリが作成されます。

$ open ~/.googlecl

このディレクトリの中に config というファイルがおさめられています。これはテキストファイルで GoogleCL で利用する各種設定が記述されています。この設定ファイルの説明は googlecl-0.9.5(googlecl-0.9.5.ter.gz を解凍したディレクトリ)にある README.config に記述されています。

各サービスにアクセスし、認証を行うとこの設定ファイルにユーザー名が保存されます。また、OAuth で行った認証もこのディレクトリに保存されます。

一度、ユーザー名を入力し、認証が行われると、次回からはそれらの入力は不要になります。別のユーザー名でログインを行いたい場合は、-u オプションを使うことで別のユーザーでログインすることができます。

$ google blogger list -u ユーザー名

設定ファイルはセクションに分割されており、各設定はキーと値のペアで記述されます。セクションは [GENERAL] といった感じで角括弧で囲まれており、直前のセクションとは空行で分割されます。例えば、以下のようになります。

[GENERAL]
regex = True
...

[CONTACTS]
list_style = title,email

regex がキーで True が値になります。このキーは -n(--title) オプションを指定するときに正規表現の使用を許可します。

$ google blogger list title --title=^WWDC # WWDC で始まるタイトルを表示
WWDC のサンプル

GENERAL セクションはすべてのサービスで利用する設定を記述しておく場所です。その他、各サービスごとにセクションは作成されます。

各サービスで利用できるタスクに list があります。これは各サービスの一覧(例えば、Google Docs のファイルの一覧や Blogger のブログタイトルの一覧など)を表示するタスクです。このタスクはオプションとして表示する項目を指定することができます。

例えば、blogger のタイトルと URL を表示させたいなら次のようになります。

$ google blogger list title,url-direct

list の後で title,url-direct と指定してしていますが、この表示する項目の指定を list_style と言います。

設定ファイルには GENERAL セクションでデフォルトの表示設定が次のように指定されています。

[GENERAL]
list_style = title,url-site

list タスクで list_style を指定しない場合、この設定を利用します。一方、Contacts セクションでは list_style は次のように設定されています。

[CONTACTS]
list_style = title,email

このサービスを利用するときはこちらの設定が優先されます。list_style の指定は、各項目を , で区切ります。各項目の間に空白を入れてはいけません。各サービスにより利用できる項目は異なります。詳しくは README.txt に書かれているので参照してみてください。

AppleScript からの利用

do shell script で利用できます。ただし、デフォルトでは google コマンドが /usr/local/bin にインストールされるため、絶対パスを利用します(インストール場所を変更しているときは適宜修正してください)。

do shell script "/usr/local/bin/google blogger list"

Automator からの利用

AppleScript の do shell script から利用できるということは Automator からでも利用できるということです。

コマンドラインから Picasa に画像をアップロードするには次のようにします。

$ google picasa post --title='アルバムの名前' *.jpg

--title オプションで指定するのは既存のアルバムの名称です。上記のコマンドを実行すると、カレントディレクトリ内にある拡張子 jpg のファイルをすべて指定のアルバムにアップロードします。

このとき注意しないといけないのはアルバムの名前です。アルバムの名前の一部が重複しているとアルバムを選択する必要があります。Picasa に「Summer 2008」、「Summer 2008」という名前のアルバムが既に存在し、次のコマンドを実行すると、どちらのアルバムかを確認するために入力を求められます。

$ google picasa post --title='Summer' *.jpg
More than one match for title Summer
0) Summer 2008
1) Summer 2008
Please select one of the items by number: 1 # 数値を指定し、enter

つまり、アルバムの指定をこのように行っていると AppleScript や Automator などからでは実行できないのです(AppleScript や Automator などからでは数値の入力ができないため)。アルバムの名称は一意のものにしておくのが無難です。

一例として Finder の選択項目を Picasa にアップロードする Automator サービスを。このサービスでは「AppleScript を実行」アクションを利用します。「AppleScript を実行」アクションに以下のコードを記述します。

Script Editor で開く

-- アップロード先(Picasa ウェブアルバムで作成したアルバムの名前)
property album : "ALBUM_NAME"
-- アップロードの対象とするファイルの拡張子
property file_extensions : {"png", "jpg", "jpeg", "tiff", "tif"}

on run {input, parameters}

    if input is {} or input is {""} then
        error -128 -- 終了
    end if

    tell application "Finder"
        set file_list to {}
        repeat with this_item in input
            if name extension of this_item is in file_extensions then
                set end of file_list to quoted form of (POSIX path of (this_item))
            end if
        end repeat
    end tell

    if file_list is {} then
        --ファイルがない場合、終了
        error -128
    end if

    set AppleScript's text item delimiters to space
    set file_list to file_list as text
    set AppleScript's text item delimiters to {""}

    set the_command to "/usr/local/bin/google picasa post --title="
    set the_command to the_command & quoted form of album & space
    set the_command to the_command & file_list

    do shell script the_command

    return file_list
end run

最後に

GoogleCL のすべては README.txt、README.config および、コマンドのヘルプに記述されています。これらを熟読することをお勧めします。

わざわざ Python から gdata を 直接たたく必要がない分(Python を知らなくても使えるし)、かなり気楽に Google の各種サービスを利用することができます。また、コマンドラインからの利用なので、AppleScript や Automator との組み合わせも簡単です。

反面、利用できないサービスもありますし、利用できたとしても操作には制限があります。この辺りは今後のアップデートに期待しましょう。