2009年4月26日日曜日

MacPortsを使って、Pythonの開発環境を整えてみた

ここ最近勉強会続きだったため、複数のバージョンのPythonの開発環境の整備をする必要に迫られました。
まずはPython2.6.2をインストールしようと考えたのですが、python.orgからdmgでダウンロードしてインストールすると余計な物をたくさんインストールされてしまいますし、何より環境の切り替えが大変です。
(Mac付属の2.5.1でないとDjangoがエラーを吐いたりするため、いつでも2.5.1に切り戻せるようにしたい)

そこで今回はMacPortsを使って開発環境を整えてみました。

■Pythonのインストール
これはMacPortsから以下のコマンドを実行するだけでいけました。
sudo port install python26

ただ、依存するモジュールが非常に多いためビルドに大変時間がかかりました。MacBook Airで、およそ1時間ぐらい。
これで/opt/local/Library/Frameworks以下にPython.frameworkがインストールされるのですが、インストールしただけでは自由に元々存在するPython 2.5.1との切り替えができません。
そこで、同じくMacPortsで提供されている、python_selectというスクリプトをインストールします。
sudo port install python_select

インストールしたら、以下のようにして自由にPythonのバージョンを切り替えることが出来ます。
$ python_select -l #利用可能なバージョン一覧を表示
Available versions:
current none python25-apple python26
$ python_select python26 #python2.6に切り替え

こいつは大変便利です。

■Djangoのインストール
DjangoもMacPortからインストールできます。
sudo port install py26-django

Djangoだけではなく、jinjaやSQLAlchemy, Werkzeugなど、名前の知られているPythonのフレームワークはすべて存在しているようです。とっても楽ちん。
ちなみにインストールできるportとしてpy25-djangoのようにPythonのバージョンを指定しているものと、py-djangoのように指定していないものがありますが、py-djangoをインストールしようとすると突然Python2.4をインストールしようとしやがりましたので、基本的にはPythonのバージョンを指定しているportを選んだ方が良さそうです。

さて、MacPortでインストールしたPythonのためにDjangoをインストールするのは簡単でしたが、
問題になってくるのは元々標準で入っているPython2.5.1のためにDjangoをインストールするときです。
easy_installが使えるようなので、今回はeasy_installを使ってインストールしました。
sudo easy_install django

ただしportと比較すると後からアンインストールするのが面倒だという欠点があります。portが使えるならportがいいですね。

■PILのインストール
PILのインストールも基本はMacPortで。
sudo port install py26-pil

問題はPython 2.5.1にインストールするときです。私の環境では、easy_installが失敗してしまい簡単にインストールできませんでした。
悩んだあげく、PILのウェブページからPython Imaging Library 1.1.6 Source Kitをダウンロードし、直接setup.pyを実行して解決しました。
tar zxvf Imaging-1.1.6.tar.gz
cd Imaging-1.1.6
sudo python setup.py install

2009年4月17日金曜日

第1回java-ja温泉に行ってきます

http://java-ja.yoshiori.org/index.php?%E7%AC%AC%E5%8D%81%E4%B8%89%E5%9B%9E

以下、やろうと思っていることリスト
  • 昔作ったGAEアプリを作り直し、Werkzeugなんか使ってみたい
  • iPhoneアプリを作成する、こないだ書いたPythonのツールを移植するだけ
  • Javaはインストールすらしていません

2009年4月13日月曜日

Google App Engineのcronは、users.is_current_user_admin()では認証できない

先日作成したまとめの内容に間違いがありましたので、訂正してお詫びさせていただきます。

users.is_current_user_admin()を利用して、RequestHandler中にて起動ユーザーがcronかどうかを判定することが出来ると記事に掲載しておりましたが、
実際には出来ない模様です。

以下の方法にて検証を行いました。
1.まずはこのようなRequestHandlerを作る
class CronFetch(webapp.RequestHandler):
    def get(self):
        if not users.is_current_user_admin():
            logging.warn('CronFetch invoked by non-admin user:%s' % users.get_current_user())
            return
        logging.info('CronFetch begin')
        # この間に処理を記述
        logging.info('CronFetch end')

2.cron.yamlを記述する
cron:
- description: Test cron
  url: /cron/fetch
  schedule: every 1 hours
  timezone: Asia/Tokyo

3.本番環境にデプロイして、admin consoleから確認してみる


ごらんの通り、users.get_current_user()の結果がNoneになります。
おそらく2009/04/13現在では、Google公式のドキュメントにあるとおりapp.yamlで指定する以外にcron起動かどうかの認証を行う方法はなさそうです。

2009年4月12日日曜日

Mac OS XのBlogライター、ectoを試してみる

前回に引き続き、今度はMac OS Xで最も優れたBlogエディタとの呼び声も高い、ectoを試してみました。

■タイトルのテスト



ちょっと崩れたHTMLを書いた結果がこれだよ! abesihidebuたわばおおお!?なんだこれ!?うまくいった!!!

でも改行を入れないとダメみたいね>< なんだそれ・・・


どういう風にアップロードされるのか 見てみようかな 列挙使いたいな
あべし
ひでぶ
たわば



■以下、余りにも使いづらいので結局普通に編集
詳しいことはよくわかりませんが、この子もWYSIWYGエディタが思いっきり悪さをするのでHTMLエディタのみを使うのが正解のようです。
WYSIWYGエディタからHTMLエディタに戻ってくると勝手にPタグやBRタグを大量に付与されてしまうため完全に文章が壊れます。


あと、タグを適切に閉じないとものすごく怒られます。ひどい。


最大の問題は、このような投稿済みの記事を取得してきたら・・・


こんな風に猛烈に崩れます。これはちょっとなぁ。まぁ、Bloggerの改行をBRタグに置換するなんていう男気のないオプションを使って、純粋なHTMLで記述していない私が一方的に悪いのですが、しかしその辺もうまく対応して欲しいです。

うーん。結論から言うといまいちです。画像アップロードもFlickerにしか対応していないように見えますし。Picasaに投稿したいんですけれど。
MovableTypeやWordpressを個人で利用されている方にはおそらく福音のようなソフトなのでしょうが、しかしBloggerを利用している私にはいまいち使い出がよくなかったです。
しばらくはPetrus Bloggerを使ってみることにします。

Mac OS XのBlogライター、Petrus Bloggerを試してみる


Blogger付属のWYSIWYGエディターを使っていると、Preタグの中身の空白が消えたり化けたりすることがあることが分かったため、やむなくBlogger付属のエディターを使うことが出来なくなってしまいました。

そこで、外部のBlogエディターを導入してみることにします。



■タイトルのテスト
タイトルはfontタグになるみたいです

目についた機能を列挙してみると、
  • Bloggerの機能と連携していて、アプリケーションのメニューからBloggerのDashboardを一発で開いたり出来る。過去記事の編集も可能
  • HTMLタグの入力補助や入力補完は一切無い
  • 画像のアップロード補助も一切無い
  • BloggerのLabelに関しては完全にサポートしている、入力補完はないが入力補助がある

@interface PreTagTest
    NSString *test1;
    id delegate;
@end

@property (retain)NSString *test1;
@property (assign)id delegate;


画像アップロードテスト

↑Edit > Upload Photoを実行するとこのリンクが自動的に張られるのですが、見ての通り表示できません。


Blog > Albumsを押すとアルバム全体が開くので(全体です、二度目以降はキャッシュしているみたいですが、1回目はむちゃくちゃ待たされます)、それから写真を選んでPicasaのページを開き、さらにそこから自分でリンクを拾ってきてようやく表示できます。
使い物にならん・・・orz

ううん、なかなか便利なんですが、編集機能がちょっと弱すぎる感じがしますね。せめてタグの挿入ぐらいはしてくれないとなぁ。画像もドラッグ&ドロップでサクッと入れたいです。

2009年4月9日木曜日

Google App Engineのcronサポートまとめ



http://code.google.com/intl/en/appengine/docs/python/config/cron.html

■注意
以下の情報は2009/04/09現在(Google App Engine 1.2.0.0)の情報です。皆様がごらんになっているときには古くなっている可能性があります。



■時間指定方法
cron.yamlを書く
本家cronとは記法が異なるが、本家cronとほぼ同様のスケジューリングが可能
起動タイムゾーンの指定も可能
cron:
- description: daily summary job
  url: /tasks/summary
  schedule: every 24 hours
- description: monday morning mailout
  url: /mail/weekly
  schedule: every monday 9:00
  timezone: Australia/NSW

■認証
cronによって起動されたURLはadminユーザーによって起動されるため、以下の
2種類の方法で認証が可能
app.yamlのhandlers要素にlogin: adminを指定する
application: hello-cron
version: 1
runtime: python
api_version: 1

handlers:
  - url: /report/weekly
    script: reports.py
    login: admin

2009/04/13追記、以下の方法は利用できません。詳しくはこちらの記事をご覧ください。ご迷惑をおかけいたしまして申し訳ありませんでした。
アプリケーションのRequestHandler内で、users.is_current_user_admin()を利用して判定する(こちらの方法は未確認)
from google.appengine.api import users

# ログインしていない場合やadmin以外の場合にはFalse。adminがログインしている場合のみTrue。
if users.is_current_user_admin():
    # cronジョブをここで実行
else:
    # エラー画面を表示するなど

さらにcronはURLを起動する際にHTTPリクエストヘッダーに以下の要素を付けるため、RequestHandler内でヘッダをチェックすることが出来る
X-AppEngine-Cron: true

■cronタスクの管理方法
cronタスクをアップロードするには、通常のアプリケーションをアップロードするときと同様に以下のコマンドを実行すれば、アプリケーションと一緒にアップロードされる
appcfg.py update

cronタスクだけをアップロードしたい場合場合は以下のコマンドを実行
appcfg.py update_cron

cronタスクを削除したい場合は、cron.yamlを以下のように書き換えてからアップロードすればよい
cron: 

以下のコマンドを実行すれば、現在のcronの設定状況を見ることが出来る(ただし、タイムゾーンを扱う場合はpytzライブラリが必要)
appcfg.py cron_info

■制限
  • 今のところPython版のみ(Java版はない)Java版もある。Java版はcron.xmlを記述する。http://code.google.com/intl/ja/appengine/docs/java/config/cron.html
  • タスクは20個まで
  • 最短実行間隔は1分
  • cron.yamlから起動できるのは自アプリのURLのみ。人のアプリを起動したり、全然関係ないURLを指定したり、シェルスクリプトを起動したりは出来ない
  • cronから対象URLを起動した場合のCPU時間・通信量もすべて従量対象になる

2009年4月5日日曜日

canvasとJavaScriptでゲームなど(2) タイトルつけてみました



http://akisuesandbox.appspot.com/games/zzz
(前回とパスが変わってます、注意)

前回のゲームに悪のりしてタイトルをつけてみました。

ついでにソースコードも公開してみました。まぁ、JavaScriptなので意図しようとも意図すまいとも自動的にオープンソースになってしまいますけれども、一応w
http://github.com/akisute/gae_akisutesandbox/tree/master



以下、余談。

ゲームの画面を制御するにはループと入力受付を制御しなくてはならないのですが、
JavaScriptを用いると、
ループの制御はsetIntevalとclearInterval
入力受付の制御はhogehoge.onmousemoveとかhogehoge.onmousedownに適切なファンクションをセットする
ことで制御が出来るので比較的簡単な気がします。

すごーく昔にDirectXでプログラムを作ったときに
このあたりの制御をするのが余りにも面倒で(といいますか手続き型のプログラミングが面倒で)嫌になって辞めてしまった記憶があります。

最近のゲーム開発環境はどうなんでしょう。特にiPhoneのゲーム開発フレームワークとか大いに気になります。

2009年4月3日金曜日

canvasとJavaScriptでゲームなど




http://akisuesandbox.appspot.com/welcome/zzz

こんなの作ってました。中身は無いに等しいです。



以下駄文。

canvasとJavaScriptは思っていたよりは高速に動作しますが、やはりFlashに比べると遅いです。
ですが2Dグラフィックスの勉強にはcanvas + JavaScriptのほうがFlashより向いていると思います。Flashはかじった程度ですが、2Dグラフィックス(線引いたり四角描いたり)というよりはオブジェクトとアニメーションの制御が中心のような印象を受けました。