Category: Python

Googleをコマンドラインから使えるGoogleCL

Googleからコマンドラインでアクセスして、各種サービスへの操作ができるGoogleCLがリリースされていますね。Macで使うためにはMacPortsを使えば導入できるそうですが、私はMacのインストーラを使いました。ダウンロードはこちらから出来ます。作者に感謝。

コマンドラインから実行するためのバイナリーと、ライブラリ群がインストーラによりコピーされます。

GoogleCL binary(20KB)
/usr/local/bin/google
GoogleCL libraries(5.7MB)
/System/Library/Frameworks/Python.framework/Versions/Current/Extras/lib/python

現在使えるGoogleのサービスは、Blogger、Calendar、Contacts、Docs、Picasa、Youtubeに限定されています。使う前には一度だけユーザー認証が必要です。試しにカレンダーに登録してみました。

$ google calendar add “Lunch with Jim at noon tomorrow”

一回目に実行すると次のようなメッセージが出てきます。

Did not find config / preferences file at /Users/yamaq/.googlecl/config
… making new one.
Please specify user: hisayuki.yamamoto@gmail.com
(Hint: You can automatically launch your browser by adding “auth_browser = ” to your config file under the GENERAL section, or define the BROWSER environment variable.)
Please log in and/or grant access via your browser at https://www.google.com/accounts/OAuthAuthorizeToken?oauth_token=xxxxxxxxxxxxxxx then hit enter.

最初にGoogleのメールアドレスを入力してenterを押すと、さらにメッセージが出ます。その中にWebブラウザでアクセスするURLが出てきますので、コピー&ペーストしてSafariでアクセスします。

すると上のスクリーンショットのようにボタンが二つ出るので、もちろん「Grant access」をクリックします。

問題がなければこのようになりました。登録は例題のようにやればできたのですが、自由に日付や時間を指定しようとしてもうまくできませんでした。今後のネット上での情報に期待します。

GoogleCLはPythonをベースに使うような仕組みなので、かなり柔軟にスクリプトから操作できると思います。このような方法が提供されることで、ユーザーがおもしろい使い方を生み出していき、さらにGoogleも進化する。こんなポジティブな進化が今後期待できます。

今度はObjective-C

飽きっぽい性格にも関わらず、ずっとひとつのアプリケーションを作り続けています。最初はコマンドラインからしか使えない、シェルスクリプトから始まりました。bashで作ったそのスクリプトは、それなりに動いてくれていましたが、他人が使うにはちょっと素っ気なくて不親切でした。

さらに進化させようと、XMLのパースを実装するためにPythonに手を染めました(笑)以前にも書いた通り、これがなかなか自分には向いていると思いました。その考えは、今後しばらくは変わりそうにありません。コマンドライン版のツールもPython化して一段落なのですが、やはりGUIを持つものを作りたいと野望を募らせます。そして、Python-Cocoaに進むことになります。あと一歩のところまで行きましたが、なかなかパフォーマンス面でうまく行かなかったので、正攻法でCocoaで現在書き直しています。

PythonをやってObjective-Cに移行すると、同じことをやっているつもりでも、文字数の違いが大きいことに気がつきます。そもそも両者を同じ土俵で比較するのはナンセンスですが、単純にセミコロンや、{}などの数だけでも大きく違いますね。こんな文字数の違いで見てもPythonが初心者にお勧めだと言われるのが理解できます。もしこんな私が人にどんな言語を勧めるかということがあれば、このPythonを勧めるでしょう。

こんなサンデープログラマですが、なんとか目的を作ってくじけずにやっています(笑)飽きっぽくて根気がないと親に言われてきた私がなぜプログラミングを壁にぶつかっても続けていけるのか?それは、プログラミングに対してコンプレックスがあるからです。高校の電気科でもFORTRANやBasicに全く馴染めず、PC98には嫌われ、そしてパソコンが身近になってもなかなかプログラミングとは仲良くなれませんでした。これが多分くじけずにあきらめたくない原動力になっています。

転機が訪れたのは10年くらい前でしょうか。AMXという映像機器向けの制御プログラム言語があります。少しだけスケジュールに余裕があったので、無理を承知で私に任せてくれるチャンスを与えてくれた同僚がいました。そのプロジェクトは一応形にはなって、納品することができたのです。それ以来、なんとか自分にもできるのではないかと感じられるようになりました。この同僚は今ではこのyamaq blogのreaderの一人ですが、この場を借りて感謝を申し上げます。

不思議とこれ以降は壁にぶつかっても、へこたれることはあってもあきらめることはなくなりました。そのときは解決できなくても、自分の中のQueueに入れておくのです。これで、時期が来たらまた思い出して取り組むのです。こうやって何度かQueueから出し入れすることで、なんとか強敵に向かっていってボスキャラをやっつけられるようになりました。

これが私のこれまでのプログラミング史です(笑)趣味の域を出ていませんが、プログラミングしていると普段使わない脳の部分を活性化しているのがわかります。今後も老化を防ぐ目的にも(笑)、あきらめずに継続していきたいと思います。

Cocoaでコマンド実行の選択肢

Mac OS Xで使うためのアプリケーションをCocoaの環境で作っています。インターフェースもある程度の形になり、当初イメージしていた形まであと一歩のところまで来ています。あと一歩なのですが、その一歩にてこずっています。

アプリケーションの中から、BSDバイナリーを実行したいのですが、Pythonのpopen2を使うと、レインボーカーソルが途中から回りだして、フリーズではないのですが、かなりアプリケーションが一杯一杯な感じになってしまいます。

ここまではPythonをベースに書いてきたのですが、やはりネイティブなObjective-Cにはかなわないということなのでしょうか。試しにPythonからNSTaskを実行したらなんとなく軽く処理している感じではあります。

そもそもPython+Cocoaという挑戦的な?手法を今回は採用しているので仕方がない気はしますが、なんとかこれを乗り切って自信をつけたいところです。

お金は好きだけど¥マークは嫌い

この数週間の間、CocoaやPythonとどっぷり付き合っています。どうしてこれまでPythonを使ってこなかったのかと、深く深く後悔します。私なんかが日頃コンピュータを使うために何かを自動化したいと思ったときに、何を使えば良いかという選択肢を考えたときに、Pythonはかなり広く守備範囲を持っているので、大抵のことはクリアできると思います。先日書いて未検証の、シリアルポートのコントロールもサポートしているそうですから。

そんなこんなでCocoa+Pythonという変態チックな環境で自分なりにゴリゴリやっていますが、ちょっとはまったエラーがありました。それが¥記号です。以前書いておいたPythonのコードがあって、そこからXcodeの方へコピー&ペーストしたのですが、その中にこの憎き¥マークが混じっていました。作成したときはバックスラッシュになっていましたが、テキストエディタを経由したため変更されていました。

当初この¥記号を含むラインは#でコメントアウトしていたので、余計に発見を遅らせることになりました。最初はなぜ突然エラーでbuildできないかがわからず、コンソールを見ろなんていうメッセージですが何も残っていません。何度もじっくりと見ると、デッバッガーコンソールの中にしっかりとヒントがありました。ログというのは、ぱっと見は見過ごしがちですが、しっかり見ると必ずヒントがありますね。

お金の¥は気持ちいいですが、コードの中の¥は気をつけましょう。インターナルエラーになってしまいます。

CocoaでPythonを使う利点

CocoaでObjective-C以外の言語を使うのにどんな利点があるのか、は棚に上げたお話です。このところPythonでシェルスクリプトの延長でいろいろやっていますが、さらに進んでCocoaのフレームワークをPythonのコーディングでやってしまおうと、ネットでいろいろ調べていました。Pythonは手軽にスクリプト言語の良さで、「書くthen検証」をすぐに繰り返せるので便利でした。しかし、運用面ではTerminal.appでしか使えないので、他の人に配って使ってもらうにはいやがられることもあり、やはりユーザーインターフェースをかぶせて、見た目を取り繕ってあげたいと思っていました。

Leopardと一緒にリリースされたXcode3.0からはCocoaとPythonがさらに仲良くなったそうで、それまでのPyObjCを別途インストールしなくても良くなったとのこと。実際にXcodeだけインストールした私の環境でもUI付きのPythonコードを動かすことができました。すでにPythonで書かれたコードに、UIを付けたいというようなニーズにも対応できそうです。

実際にやってみると随所にCocoaの知識が必要で、まったくPythonだけ知っていればOKということではなかったです。ネットで調べ始めてPyObjCのページは多かったですが、これを実践すると回り道になるので、Scott Paul RobertsonさんのBlogがわかりやすかったです。英語ですが、コードを追いかけていけばなんとかなりました。

オブジェクト指向やクラスの使い方など、まだまだ深く理解はしていませんが、Cocoaだけで勉強していた頃に比べて、Pythonのクラスを勉強してから再度Cocoaのオブジェクト指向を見てみるとこれまでよりも深く入っていけた気がします。一つのことを理解するためには複数からのアプローチが効果的だったということです。なかなかオブジェクト指向に手を焼いている方は、Pythonで回り道をするのが意外と急がば回れになるかもです。

プログラミングのススメ

プログラミングしているときに使っている脳の機能は、明らかに普段の実生活とは違った働きのように感じます。最も近い感じは、算数のドリルを制限時間を作ってやっているイメージです。とはいえ単に数字計算のような算数だけの要素ではないので、あくまでも「近い」と感じるのが私の実生活では算数ドリルです。

とくにこの年になってわざわざ算数をやり直す必要は無いと言われればそれまでなのですが、プログラミングというのは脳に対して適度な圧迫感を与えてくれます。目的に向かって唯一無二な答えを作るまでは、決して許してくれないからです。途中で挫折する日もありますが、翌日にはその宿題を一日引きずってなんとか解決したいと考えます。

理想的なのはプログラミングをやることへの明確な目的を設定することです。これまでいろんなプログラミングの書籍を買っていますが、最初の頃は目的も無く単にその言語の習得が目的でした。Cを使って画像フィルタを作るといった具体的な目的が無く本を読んでいたので、自分への圧迫感が少なかったです。

今回はPythonを使ってREDワークフローを効率化したいという明確で、切羽詰まった目的がありました。これが完成しないと、手作業で苦しむことになるからでした。必要は発明の母と言いますが、何かが背中を押してくれるとプログラミング初心者でもそれなりに形にはなりました。

REDのレンダリング補助ツール

REDワークフローは、まだまだ見落としていることが多くて、日々試行錯誤しています。最近気がついた落とし穴で、Final Cut Proで編集した結果を撮影時のRSXを適用してレンダリングする方法は?というものがありました。

これまでは、

  1. 編集した結果をXMLに吐き出して、
  2. XMLをCrimsonで加工して、
  3. 加工したXMLをRedCineに取り込んで、
  4. RedCineで色調整してレンダリング

これが最も最適だと思っていました。RedCineの部分をApple Colorにするというバリエーションもありますが、この場合はCrimsonは不要です。この流れでは、RSXは一切使わずに編集後に改めて色調整するということになります。

時には、編集後でもRSXをそのままあててほしいというリクエストがあるとのことで、じゃあ何を使うの?ということになりました。Monkey Extractというツールがそれをサポートしてくれるようなのですが、実際に使ってみるとタイムコードがズレるという問題がありました。手動でやるなら、CrimsonでFCPのXMLを読み込んで、その中で数値を手打ちすることで解決はできますが、カット数が多いとこんなことは現実的ではありません。

FCPのXMLをフックにして、そこで使われているカット毎のIN/OUTを読み込んで、それに対応するR3Dを検索して、諸々のセットアップを加え、REDlineでレンダリング、この流れで行ければ理論的にはOKなはずです。XMLのパースが初体験なのでどうするか悩みましたが、Pythonが良さそうです。Crimsonも使っていますし。

と、こんな事情があって先週からPythonにどっぷりと浸かっていたのです。一応コマンドラインベースのツールは形にはなりました。実運用に移す前に、明日からデバッグです。

Pythonの良さがわかり始める

週末の二日間ではありますが、どっぷりとPython三昧の時間を過ごしました。まだ目標の成果物にはたどり着いていませんが、Pythonの良さの一部分は垣間見れた気がしました。プログラミングは文字通り週末などの限られた時間に集中してやるサンデープログラマなのですが、これまで使った言語と明らかに異なる部分がありました。括弧を入力する数が少ないのです。Objective-CやPHP、シェルスクリプトに比べて入力文字数が少なくできる気がします。まだビギナーなので無駄な括弧が多すぎたということもありますが(汗)

今回は以前シェルスクリプトで作ったものをベースに作り直していますが、Pythonにはswitch文というものが無いのですね。ifの入れ子でしのいでいますが、それがPythonではスタンダードなのでしょうかね。そのあたりも手探りでやっています。どこかの紙面でPythonはもともと学習向けの言語を作ろうとしてスタートしたと読んだ気がします。これは初めてプログラムというものに触れる学習者にとっては最適だと思いました。コーディングがすっきり書けるからです。

しかし、学習する初歩的なものでしか使えないかと言えばそんなことはなくて、その豊富なライブラリを使えばOSの持っている機能を使ったりできるので、守備範囲が広い言語だと感じました。これまではシェルスクリプトでできる範囲で小さなツールを作っていましたが、今後はまずPythonで作ってみるというのが自分にあったスタンダードになりそです。

PythonからXMLを覗く


今週末はPythonと本格的に格闘中です。うまくいけばREDワークフローで使える小さなツールが完成するかもしれません。何事も明確な目標があった方が良いので、あえてそんなターゲットを自分に課したわけです。REDでPythonといえば、有名なCrimsonがあります。私もユーザーですが、なぜCrimsonがPythonを使っているかが何となくですが理解できました。

Pythonはベースになるコアなところはコンパクトにして、それ以外の拡張をモジュールやパッケージで提供するというのがしきたりのようです。XMLの拡張もモジュールが標準で提供されていて、importすることで気軽に使えるのだそうです。まだまだそんな気軽に使えるところまで行っていないので、あくまでも一般的にはです(汗)

XMLをはじめると、SAXやDOMなどという初めて聞いたワードが出てきて、少しはイメージできるようになりましたが、これまでXMLはテキストベースでタグでキーワードを挟んでいる、くらいの認識でしたから、一気に学習したことになります(笑)PythonとXMLは1日使えば私なんかの初心者でも、XMLファイルの中からエレメントを取り出すくらいができます。結構敷居が高くない印象です。

Final Cut Proで書き出したXMLを読むことができたので、うまくいけば小さなツールが完成するかもしれません。

Pythonでシリアル通信できそう

シリアル通信なんて今どき使うのかって言われるかもですが、レガシーなデバイスではしっかりとまだシリアルポートを経由してコントロールできるものが生き残っています。Windows PCからは比較的まだまだコントロールすることは容易なのですが、Mac OS Xからは私はなかなか見つけることはできていませんでした。この前から少しずつ調べ始めたPythonなら、pySerialというモジュールを使えばMacからも接続できそうですね。

Mac側にはラトックのREX-USB60Fがいいようです。Macも正式サポートで、通信状態のLEDが付いているのが便利だとアマゾンの購入者レポートに載っていました。TXよりもRXが来たときにLEDがピカッと点灯してくれると「来てるな」って判断できるのでプログラミングのときに便利です。さっそく購入。

Macのプログラムからシリアル経由で文字列を送れれば、ルーティングスイッチャなどを切り替えることができます。技術者ではないとあのルーティングスイッチャというものは取っ付きにくいようなので、制御をMacからできるようにしてあげれば、多少は敷居が低くなるかもしれません。Pythonからコントロールできれば、いろいろ夢は広がります。