holicRSSFeed

#143 「プログラムマン」 2011-12-03 (Sat)

 ハッキングマンの憧れはハッカー。そしてプログラムマンの憧れはプログラマー。私もデスクトップ環境で動くアプリケーションを作ろうと挑戦して、その度に挫折するプログラムマン。だいたいデスクトップ環境で動くアプリケーションで、あると便利なものというのは既にあるものだったりしますし、そうでない場合はちょっとしたスクリプトを書いてターミナルやcrontabで実行した方が便利だったり。苦労してアプリケーションをプログラムする意味があまりないようにも思えてしまいます。

 だけどプログラムマンとしては「いまちょっとプログラミングしてる」とか言ってみたいし、ダブルクリックで起動する何かも作ってみたくなります。そして時にはスクリプトだけでは出来ないことをやりたくなったりもするのです。


 それで一体何がしたくなったのか?というと、下のスクリーンショット画像です。



別にBlack-holicの記事を書きたくなったワケではなくて、画像は使い方の一例です。つまり「ちょっとしたメモをデスクトップ上に付箋紙風に表示したい」ということです。そこでプログラムマンは考えます…。


(ここまで書くのを忘れて書くのを忘れていましたが、今回はMac向けなので他のOSの方は参考程度に読んでください。というか、Macの人にとっても参考程度の事しか書かれません。ここはそういうコーナーなのであしからず。)


(ついでに書いておくと、なるべく多くの人に解るように、知っている人には意味のないような事も中途半端に詳しく説明するハッキングマン、プログラムマンの入門編的な感じで書いていきます。)

 そんなわけで「ちょっとしたメモをデスクトップ上に付箋紙風に表示したい」を作りたくなったのですが、これをMacのアプリケーションとして作るにはどうすれば良いのか?プログラムマンとして一応パソコンにはXcode(Macでプログラムを開発するためのアプリケーション)もインストールしてあるし、本を見ながらメモ帳アプリケーションを作ったりハローココア!もしたことがあります。でもそこから今回の目的のものを作るには一気にハードルが高くなっているような気もします。どういう風にやれば作れるのか?という事がイメージできない時には大抵のことが上手くいかないですし。


 それでXcodeで作るのは無理という事になったので、簡単に諦めます。これで打つ手がなくなったのか?というとそうでもなかったりします。デスクトップに何かを表示するならGeekToolというステキなアプリケーションがあるのです。このアプリケーションを使えばシステムが書き出すログファイルやウェブ上の画像などをデスクトップに表示できるのですが、こういうものを使うとプログラムという感じはしなくなってしまいます。

 でも気にせず続けるのです。それに、このアプリケーションだけでは目的は達成できませんし、そのためには他にアレとアレも使って、その時にちょっとだけコードも書くから大きな意味ではプログラムすることにもなるのです。

 とりあえず「デスクトップに表示」というところはGeekToolでなんとかします。表示するメモのテキストファイルを任意の場所に保存して、それをGeekToolで表示すれば良いだけです。



こちらはGeekToolの設定画面。目的に応じて「File」「Image」「Shell」のアイコンをデスクトップ上にドラッグするとその場所に情報が表示されます。今回はテキストファイルの内容を表示するので「File」が良いような気もしますが、これは主にログなどの監視向けで、ファイルに変更があったら即座に表示内容も変更できるように常にファイルの監視をします。便利ではあるのですが大量に使うとパソコンにかかる負荷が大きくなりそうなイメージなので「Shell」を使うことにします。

 「Shell」は設定画面で指定したコマンドシェルスクリプトを実行して、その結果を画面に表示します。間隔を指定すれば繰り返しコマンドを実行してくれます。


 ファイルの内容を表示するコマンドはいくつかありますが、「cat」を使うと日本語の文字化けが起こりづらいようなので私はいつもcatを使っています。



設定画面はこんな感じで。Commandのところに「cat [テキストファイルへのパス/ファイル名]」(*1)を入力。繰り返しの感覚は5分にしてあります。(ファイルに更新がなければ5分ごとに無駄なコマンドを実行することになりますが、常に監視するよりは無駄が少ないですし。)

 いきなり最終段階であるGeekToolの事を書いてしまいましたが、その前のテキストファイルを生成する方法を書かないといけません。このテキストファイルがないと何も表示されませんし。

 テキストファイルを作るといってもいちいちテキストエディットみたいなアプリケーションを起動して文字を入力していたら手間がかかりすぎです。「ちょっとしたメモをデスクトップ上に付箋紙風に表示したい」ということなので「ちょっとしたメモ」のために手間はかけられません。


 そこで思いついたのがMac OSXで使える便利コマンドを使う方法です。pbcopy, pbpasteMacWiki)を使うと文字をコピーしたりペーストしたりが出来るようになります。

 メモしたい単語をあらかじめコピーしておいて、それをpbpasteで書き出すシェルスクリプトを作れば簡単にテキストファイルを作ることができます。


 シェルスクリプトってなんなのか?ということでもありますが、コマンドを組み合わせて自分だけの新しいコマンドを作れてしまうもの、という感じ?とにかく、ハッキングマンにも書ける簡単シェルスクリプトを掲載すると次のような感じですが。

#!/bin/sh

theFile="/テキストファイルへのパス/ファイル名"

pbpaste | /opt/local/bin/nkf -w > $theFile

 何が書いてあるかというと、最初にファイルを書き出す場所とファイル名を決めて、そのあとpbpaste。文字コードをutf-8に統一するためにpbpasteの出力をnkfというコマンドに渡して、それを最初に決めた場所に書き出している、ということです。ちなみにクリップボードにテキストがコピーされてない場合は何も出力されないでカラのファイルが出来るみたいです。


("theFile"みたいな変数名はあまり見かけませんが、おそらく悪い例に違いないです。)


(nkfはOSXにはインストールされていないので別途インストールする必要があります。そういうコマンドはあらかじめコマンドの場所を指定するか、コマンド名をフルパスで書かないと動かなかったりします。上の例はMacPortsでインストールした場合のコマンドの場所です。)

 シェルスクリプトを書くところまでは出来たのですが、ここからが問題です。シェルスクリプトを実行するにはターミナルを開いてやらないといけません。あるいは先ほどのGeekToolを使うという手もありますが、どちらも良い方法ではないです。

 ターミナルを開くのは手間がかかりすぎで、これではテキストエディットみたいなアプリケーションでやるのと変わりません。GeekToolを使えば定期的にシェルスクリプトを実行する事が出来ますが、関係ない作業でコピーした文字も実行されるたびにテキストファイルに書き出されてファイルが上書きされてしまいます。


 メモを保存したい時に1度だけ、そして極力簡単に実行できる方法を探さないといけません。そこで今回のメインともいえる便利アプリケーションのご紹介。「Platypus」を使うとシェルスクリプトをダブルクリックで実行可能なアプリケーションのようなものに出来てしまうのです!


 なぜかテレビ通販のようになってきましたが、酔ってませんよ。(そろそろ深夜なので飲みたくなってますが。)でもちょっとテンションが上がる感じでPlatypusは面白いアプリケーションなのです。


 面白さを説明していると長くなるのでとにかく先に進みますが。



起動したらこんな感じです。「App Name」のところはふざけてますけど、実際には先に「Script Path」にさっき書いたシェルスクリプトへのパスを入力するか、面倒な場合はその下の「Select...」でシェルスクリプトのファイルをいつものファイル選択画面で選ぶとシェルスクリプトにつけた名前がApp Nameに勝手に表示されます。

 ふざけたためにどうでも良い説明が必要になってしまいましたが、今回設定する場所は「Output」を"None"に。真ん中の段の右側のチェックを入れる場所は全部チェックを外しておく、というところでしょうか。あとは初期設定のままで問題ないはずですが。


 設定が出来たら「Create」をクリックすると、書き出す場所を選ぶいつものウィンドウが表示されるので、場所を決めてさらに「Create」で出来上がりです。


 試しに何かの文字をコピーしてできあがったアプリケーション風のものをダブルクリックしてみます。見た目では何も起きていないように思えますが「/テキストファイルへのパス/」に「ファイル名」というテキストファイルが出来上がっていればほぼ成功。さらにそのテキストファイルを開いてコピーした文字が書いてあったら大成功!

 これでだいぶ良くなって来ました。ネットサーフィン中に見つけた面白い単語をメモしたくなったら選択してコピーして、さっきのアレをダブルクリック。そうすればGeekToolで5分に1度実行されるシェルスクリプトがそのメモをデスクトップに表示してくれるようになります。

 自分で書いてメモする時でも、インターネットブラウザなどが起動している状態だったら検索窓など、どこでも良いので文字の入力できるところにメモを書いて、それを選択してコピーすればお手軽です。(アプリケーションを何も起動してないし、文字を入力できる場所がない!と思ってもメニューバーの右上に「Spotlight」があるじゃないか!)


 これで見事プログラムマンの作品が完成という感じですが、ここでハッキングマンが登場してしまいます。ハッキングマンとしては何かが気に入りません。そうです。ハッキングマンはダブルクリックが嫌い。出来ることなら全てをキーボードのショートカットで済ませたいのです。なぜって、そっちの方がハッキングっぽいから。

 そこでハッキングマンが最終仕上げをします。(しかし、この最終仕上げで思わぬ展開が?!)

 アプリケーションの起動をキーボードショートカットに割り当てるものというのはけっこうありますが、ハッキングマンのお気に入りは「Quicksilver」です。(詳しくは「わかばマークのMacの備忘録 : Quicksilver」が解りやすいです。)


 QuicksilverのTriggerという機能を使うとアプリケーションの起動などがキーボードショートカットに割り当てられます。



設定画面のTriggersを開いて、下の「+」ボタンをクリックしてHotKeyを選ぶと登録用の画面が出てきます。ここで普通にQuicksilverを使う時と同様に、さっき作ったアプリケーションの名前をタイプするなどして、表示されたら二番目の項目を「Open」にすれば登録完了。最後に「None」となっているTriggerの項目をクリックするとキーを入力するウィンドウが開くので、好きなキーコンビネーションを入力してオシマイ!


(Platypusで作ったアプリケーション風のモノを「アプリケーション」フォルダ以外に保存している場合はそれをQuicksilverが見つけられない時があるので、そういう場合は保存したフォルダをQuicksilverの「Catalog」に登録しましょう。)


 キーコンビネーションを「Command + アルファベット」にすると他のアプリケーションのキーボードショートカットとかぶる事が多くなるのでお勧め出来ません。「Control + アルファベット」なら大丈夫と思うこともあるかも知れませんが、ハッキングマン中級以上になるとControlキーを使ったショートカットも多用するようになるので、ハッキングマンを目指すならこれもお勧め出来ません。

 私は他のキーボードショートカットとかぶる事がほとんどないと思われる「Option + Control + アルファベット」の組み合わせを使っています。

 上の画像で「pasteMemo.app」というのが今回作ったもの。ついでに「ちょっとしたメモ」のテキストファイルの内容をクリップボードに再コピーする「copyMemo.app」というのも密かに作っていたり。その他にもマウスでクリックなんて面倒な事をしないで開きたい「よく使うアプリケーション」が登録されていたりしますが。全部「Option + Control + アルファベット」にすることに決めておくと迷わないので良いです。

 このようにプログラムマンとハッキングマンのコラボでまた一段とパソコンライフが充実したと思われたのですが、まだどこか納得がいかないハッキングマン。そこでハッキングマンはQuicksilverで出来ることを再確認。するとすぐに納得がいかない原因がわかりました。

 ハッキングマンのお気に入りのQuicksilverには「Terminal Module」というプラグインがあるのです。これをインストールするとTerminalで実行するようなコマンドやシェルスクリプトがQuicksilverで実行する事が出来る(?!)


 …ということは、プログラムマンが大いに盛り上がったPlatypusを使ったあの部分が丸ごと必要なくなる?

シェルスクリプトの実行も登録できちゃう


試しにTriggerに登録してみた「pasteMemo.sh」というやつですが、これでも同じ事が出来ることが判明。(画像ではまだキーコンビネーションが設定されていませんが。)


 しかし、プログラムマンも反論します。「アプリケーション化したシェルスクリプトを起動するのはキーボードショートカットだけで出来るけど、Terminal Moduleでシェルスクリプトを実行する場合はキーボードショートカットのあとにQuicksilverのウィンドウが出てきて、そこでさらにリターンをタイプしなければいけないから、手間がかかり過ぎなんだ!」ということです。


 どうやらプログラムマンとハッキングマンは相性が悪そうです。これは今後大きな問題となるかも知れませんが、とりあえず「ちょっとしたメモをデスクトップ上に付箋紙風に表示したい」は上手くいったのです。

*1:「パス(path)」ってなんだ?という事ですが、デスクトップ環境風、あるいはMacのFinder風に言うとフォルダの場所という感じです。システムのあるハードディスク内の「私」のホームフォルダ内にあるFileというフォルダ内の「テキストファイル」という名前のファイルをパスで表すには「/Users/私/File/テキストファイル」になります。先頭の「/」がシステムのインストールされたハードディスク、途中の「/」がフォルダを意味していると考えると解りやすいでしょうか。これを知っているとハッキングマンっぽい感じになれるのでわざわざ書いておきました。(ちなみにインターネットのURLにある「/」もだいたい同じ意味です。ただし最初の方の「://」は別の意味。)[戻る]

ここでGoldバージョンを読んでいる人のためだけに、プラスアルファのハッキングマンおよびプログラムマン講座をしてみたいと思います。(この記事はLittle Mustapha's Black-holeがGoldバージョンとSilverバージョンに分かれている時に書かれました。)

 今回のメインになる予定が、実はなくても良かったかも知れないPlatypusですが、色々と楽しい使い方が出来そうな予感もします。今回作ったものはダブルクリックで起動しても、画面上に何も表示されないものでした。でもOutputの項目を変えると面白い使い方も出来ます。


 Outputを「Text Window」にするとシェルスクリプトの出力がウインドウに表示されます。たとえばカレンダーを表示する「cal」というコマンドだけが書かれたシェルスクリプトをアプリケーション化すると、それをダブルクリックするとウインドウに今月のカレンダーが表示されたりします。

 これはアプリケーションとしてはビミョーですが、さらに色々試すとOutputの項目には「Status Menu」というのがありました。これはメニューバーの右側の方に常に表示されている時計とかがある場所に何かを表示出来るもののようです。


 面白そうなので、試しにさっきの「cal」だけのスクリプトをアプリケーション化してみます。そして出来上がったものをダブルクリック!するとメニューバーに怪しい項目が追加されました。

メニューバーからカレンダーが見れちゃう!


試しに作ったものなのでエラーが出ていたり、「Title」とか「Temp Script」とか初期設定のままですが、これはかなりプログラムした気分になれますよ。しかもタイプしたのは「cal」の3文字だけとか。

(エラーを表示させないために cal の後に「2> /dev/null」を追加すると3文字にならないので、なんとなく悔しい。)

 さらにPlatypusはシェルスクリプトだけでなく、PerlやRuby、Pythonなども使えるので好きな言語でcalの出力を日本語化とか加工してみたり「cal」と書くだけでは物足りないハッキングマンも楽しみが広がりますよ。


(ちなみにこういう簡単なスクリプトはわざわざ事前に用意しなくてもPlatypusを起動して「New」というボタンをクリックすると基本的な事(一行目のシェルのパスとか)が入力された編集画面が表示されるので、そこにスクリプトを書けば出来上がりです。)


 まだ色々と書きたいのですが、キリがないのでこの辺でオシマイになってしまいます。一つ書いておくと、真面目にやろうと思っていたsipsを使った「ドラッグ・アンド・ドロップで画像のサムネイルを作るアプリケーション」はなぜか失敗しました。

 sipsを使って「画像ファイルのドラッグ・アンド・ドロップで画像の情報を表示させるスクリプトのアプリケーション」は上手くいったので、問題は画像ファイルの書き出しの部分なのかも知れませんが、詳しいことは解らないプログラムマンなので、偶然上手くいくようになるか、そういう問題がなくなるまでPlatypusがバージョンアップするのを待つしかなさそうです。

 ということで、ハッキングマンツール、プログラムマンツールを紹介しながらアプリケーションのようなものを作ってみましたが。こういう事が出来て調子に乗ってしまうと、ちゃんとしたココアアプリケーションのプログラムをしてみたくなってしまいます。でも、どうしても挫折してしまう私はいつまでもプログラムマン。しかし、これだけ出来れば十分かも知れないのでプログラムマンでハッキングマンなのがちょうど良いのです。

 今あるモノと能力だけを使って工夫して何かを作ることが出来るのがプログラムマンやハッキングマンの素晴らしいところなのです!<嘘>

 でも企業で使っているコンピューターのシステムとかをプログラムマンが作っていたとしたら恐ろしいですが。それはどうでもイイですね。


 プログラムマン万歳!ハッキングマン万歳!とミョーに盛り上げてオシマイです。そして、次回は時期的にそろそろアレなのですが、前回が衝撃の結末でしたし続きがあるのか解りませんがオタノシミニ!