2010/01/27

googe app engine 用に PIL(Python Imaging Library) をインストール

Snow Leopard の Python は 2.6.1 で、2.6 対応の PIL はパッケージされていない!。仕方ない。ということで本家サイトからPython Imaging Library 1.1.7 Source Kit を落としてきてインストール。

tar.zg なのでそのまま、適当なディレクトリに解凍後、

sudo python setup.py install

とすれば、インストール終了です。簡単簡単。

PIL 1.1.7 SETUP SUMMARY
--------------------------------------------------------------------
version 1.1.7
platform darwin 2.6.1 (r261:67515, Jul 7 2009, 23:51:51)
[GCC 4.2.1 (Apple Inc. build 5646)]
--------------------------------------------------------------------
--- TKINTER support available
*** JPEG support not available
--- ZLIB (PNG/ZIP) support available
*** FREETYPE2 support not available
*** LITTLECMS support not available
--------------------------------------------------------------------

途中で、セットアップサマリーがでるので、support not available なライブラリをサポートしたい場合は別途ライブラリのインストールが必要です。あれ... JPEGlib サポートしてないのか...。

2010/01/26

Django の view は柔軟過ぎて難物

Django フレームワークを採用して、一通り Django について本など読みましたが、url ディスパッチャと view の関連が柔軟過ぎて分かったようなわからないような。

結局 view は HTTPRequest を受け取って、Response を返すのが仕事なのですが、url ディスパッチャから Middleware を経て、view をどのように構成すべきかそのあたりがモヤモヤ...。

しかし、インターネット時代はいいですね。The Django Book (日本語) はとても丁重に書かれています。

あとは実践あるのみ。

2010/01/25

引き続き google app-engine-patch

まず、app-engine-patch のインストールから
app-engine-patch からファイル一式を落として展開します。

以上。

というわけで、google-app-engine SDK がインストールされていれば、好きな場所に展開できインストール終了です。展開したディレクトリ下の myapp ディレクトリがサンプルのアプリケーションとなるわけですが、app-engine-patch は、ちょっとひねくれた構造というか、展開したディレクトリ直下にサンプルが実装されていて、myapp も1アプリケーションとして定義してあります。

Django では、 myapp のレベルに実装すべしという作法らしいので、自アプリケーションは meapp レベルに作成して問題ないのですが、サンプルとして定義してある展開ディレクトリからサンプルアプリケーションを取り除き共通部分のみ残すようにしなくてはなりません。ちょっとめんどくさい(まあ残しておいてもいいですけど...)。

JQuery も組み込まれているので、最新版が使用したい場合は、js ファイルなども置き換えます。

 ユーザー認証もデフォルトで Django になっていたり(google app engine なら最低 google 認証つかうでしょ)予想の通り、Djanngo の設定やファイル構成が理解出来ていないと上手く扱えず、敷居が高いです。

でも、一度理解できれば、google 認証以外の一般認証のセッション管理もフレームワークがやってくれるので、楽ちんです。

セッション管理など細かくやらないのなら webapp で十分、一般ユーザー認証などが必要な場合は、Django など他のフレームワークも検討したほうがよいという感じです。

2010/01/22

geegle app engine + Django app-engine-patch

google 認証 + 一般ユーザー認証の複合技で、Web アプリを構築する方針になったので app-engine-patch を採用することにしました。

現在のリリース状況はこちら、app-engine-patch-1.0.2.3.zip が正式リリースの最新版です。1.1RC1 は、使ってみましたが、少なくとも私の Mac Snow leopard 10.6.2 ではコアダンプしたのでちょっと危険。という訳で 1.0.2.3 を使用しましたが、サンプルが動かない...。

{% if user.is_authenticated %}
  Welcome, {{ user.username }}
  <a href="{% google_logout_url request.get_full_path %}">Logout</a>
{% else %}
   <a href="{% google_login_url request.get_full_path %}">Login</a>
{% endif %}

で、TemplateSyntaxError: Invalid block tag: 'google_logout_url' となって終了...。
調べたところ、Issue 152 に登録されてましたorz。

{% load googletags %}

を追加することで正常動作しました。
こんなペースじゃ遅々として開発が進まない(って昨日も言ったっけ)。

2010/01/21

jquery.form.js を使ってみようと思ったけど

これって、 Ajax はサポートするけど通常の POST/GET 形式でリクエストして、JSON で受けとれる物だったのね。と言うわけでボツ。

google app engine の投稿には、JSONRequest にすることも検討すべしとあるが、JSONRequest の説明を良く読むと、純粋に JSON でデータのやり取りをするだけ、クッキーなど無視。と書いているのでそれはそれでどうなの?と言うわけでまたまたボツ。

結局、json2.js と jquery の組み合わせで、Ajax が一番無難であるという結論になりました。

う〜ん。開発遅々として進まず...

2010/01/20

google app engine で Ajax

今時の Web アプリケーションなら google app engine でも Ajax でしょ。ということで色々調べて実装していますが、う〜ん。めんどくさいんだよぉ。

まず、見るべきページは、 ここ。結局ページ遷移を伴わない HTTP 通信なのだから Socket でいいじゃんよ(HTML5 ではサポートが考慮されているようですが...)。

python 側は simplejson が使えるし、javascript は、jQuery (と必要なら json2.js) で JSON を使えば良さそう。

クライアント/サーバー環境だとデバッグがめんどくさい(特に app engineは)。ローカルで動いたように見えてもデプロイして動かすと動かなかったりするし...。

最近は、根気!根気!と呪文のようにコーディングしています。 

flexigrid その後

flexigrid 1.0b3 を使ってましたが、flexAddDataメソッドを使って表にデータを追加しようとすると、追加ではなくでデータの置換えになってしまうことがちょっと嫌になったので、新しいメソッド flexAppendDataを追加してみた。

$(#xxxx).flexAppendData(data, insPos)

data は、flexAddData と同じく JSON or XML データ(1行分)
insPosは、行を追加する位置
 ':first' or 指定しない : 表の先頭に追加
 ':last'                     : 表の最後に追加

とりあえず、自分の期待した動作はできるようになったので、パッチを載せておきます(1.0b3用)。

$diff flexigrid.js flexigrid_orig.js

363c363
<             addData: function (is_empty, rowPos, data) { //parse data
---
>             addData: function (data) { //parse data
511,533c511,516
<                 if (is_empty) {
<                     $('tr',t).unbind();
<                     $(t).empty();
<                 }
<                 if (rowPos == ':last')
<                     $(t).append(tbody);
<                 else
<                     $(t).prepend(tbody);
<                 if (!is_empty) {
<                     var i = 0;
<                     $('tbody tr', g.bDiv).each
<                     (
<                         function () {
<                             if (i % 2 && p.striped)
<                                 $(this).addClass('erow');
<                             else
<                                 $(this).removeClass('erow');
<                             i++;
<                         }
<                     )
<                 }
<                 this.addCellProp(rowPos);
<                 this.addRowProp(rowPos);
---
>                 $('tr',t).unbind();
>                 $(t).empty();
>                
>                 $(t).append(tbody);
>                 this.addCellProp();
>                 this.addRowProp();
637c620
<                        success: function(data){g.addData(true, '', data);},
---
>                        success: function(data){g.addData(data);},
676c659
<             addCellProp: function (rowPos)
---
>             addCellProp: function ()
678,679c661,662
<                     $('tbody tr'+rowPos+' td', g.bDiv).each
< //                    $('tbody tr td',g.bDiv).each
---
>                
>                     $('tbody tr td',g.bDiv).each
735c718
<             addRowProp: function(rowPos)
---
>             addRowProp: function()
737,738c720
<                     $('tbody tr'+rowPos, g.bDiv).each
< //                    $('tbody tr',g.bDiv).each
---
>                     $('tbody tr',g.bDiv).each
1078c1060
<         g.addCellProp('');
---
>         g.addCellProp();
1081c1063
<         g.addRowProp('');
---
>         g.addRowProp();
1460,1468c1442
<     $.fn.flexAddData = function(data) { // function to replace data to grid
<
<         return this.each( function() {
<                 if (this.grid) this.grid.addData(true, '', data);
<             });
<
<     };
<
<     $.fn.flexAppendData = function(data, insPos) { // function to add data to grid
---
>     $.fn.flexAddData = function(data) { // function to add data to grid
1470d1443
<         if (insPos == undefined) insPos = ':first'
1472c1445
<                 if (this.grid) this.grid.addData(false, insPos, data);
---
>                 if (this.grid) this.grid.addData(data);
1513c1486
< })(jQuery);
---
> })(jQuery);

2010/01/18

flexigridなかなか良いです

最近、Webのデザインも少し手を出しているのですが、今時のリッチなデザインにするとなかなか大変ですね。

jQueryのようなライブラリを使わないと、とてもやっていけませんが、そのためには jQuery(なり YUI etc...)について、調べなければならなくて先に進むのが大変です。

まあ、一昔前のような混沌とした状態に比べれば、jQuery のようなライブラリがブラウザの差を吸収してくれるので、余程難しいことをしなければ、暗黒面に入り込まなくて済むので、この手のライブラリには感謝!感謝です。

ここ数日、表の表示に Flexigrid を使って評価をしています。書き込みはできませんが、表の幅をエクセルのように操作できるし、JSON 形式のデータを直に読み込めるので、Ajax(JSON 使ってもそう言うのかな?) でもうまく使うことができます。

でも、Web上で色々調べても今ひとつすっきりとした説明が見つからない。この方のページが割と詳しく書いてありますが、もっと総合的な事が知りたいんだよー。

という訳で、web上をさ迷い、やっとやりたい事ができました。
て、自分でそのまとめを書けばいいですね。すみません。

時間があったら(言い訳だー)ちゃんとまとめます。

2010/01/15

webapp と Django

Ajax に苦戦しながらも、 google app engine のドキュメントを読み進めて、google app engine の webapp と Django の実装について、説明が全くまとまっていない(まあ、まとめて書かれたら1冊の本になるか...)感ありありで、自分も結構誤解しているなぁと思ったので覚え書きです。

Google App Engine で Django を実行する
Google App Engine での Django フォームの検証
Google App Engine Helper for Django の使用
app-engine-patch での Django の配信
Zipimport を使って App Engine で Django 1.0 を使用する
Google App Engine で JSON 出力

つまり、Google App Engine のフレームワークは webapp だけど、Django などを使ってもいいですよ。
開発環境には Django も含まれているし、App Engine 用の djangoforms も提供していて Django のフレームワークのように使うこともできます。
webapp じゃなくて、Django フレームワークでやりたければ、1.0 以上を推奨します。
Django を使うには、Zipimport を使用する Helper for Django と app-engine-patch を使う方法があります。

という感じなのかなぁ。
できれば、Django を使いたいのだが、高機能が故に習得には時間がかかる。
悩みところです。

2010/01/14

Google Closure Tools

まだラボ扱いですが、Closure Tools という javascript の optimizer と Library が公開されています。
optimizer の方は、Google App Engine を使って javascript をコンパクトにする例 などが紹介されています。

また、Library の方には、javascript を使用したリッチな UI 部品が紹介されています。

例えばメニューボタン

色々な例があって demo を見ているだけでも結構楽しい。
自分が実装するんじゃなければね:-P。

2010/01/13

世界史上最高のプログラマ

qmail と djbdns の作者、ダニエル・J・バーンスタインについて書かれている記事の和訳があることを雑誌で知り読んでみました。

私は、postfix と bind 派で、どちらも使ったことがありませんし、ソースコードも読んでいません。

おもしろいのは、これだけ偉大な功績を残した人に対しても、嫌悪感をあらわにする人がたくさんいるというくだりです。
彼は、イリノイ大学シカゴ校の数学及び暗号学教授だそうです。彼の妥協のなさが傲慢さとか無礼に感じるらしいですが、まあ、本文にも書かれているようにまったく妥協のない人なのでしょう。こういう人が大規模プロジェクトを指揮すると、失敗しないまでも完璧主義のために予算オーバーで大変なめにあいそうです。

一度、qmail のソースでも読んでみますか。
しかし、それが美しいと感じる感性は、先天的なものなのか?、それとも後天的な学習の結果なのかなぁ。

2010/01/12

反Twitter 宣言

鳩山首相が Twitter を始めましたが、私はつぶやかない 自民・谷垣氏、反ツイッター宣言という記事が載っています。
谷垣氏曰く - 「つぶやきは好きな方にしていただければ足ること」

こんなこといってて大丈夫か?日本。

閑話休題

computerworld にクラウドにデータを保存するのは“危険なこと”なのかと題してコラムが掲載されています。
このコラムもちょっと極端に思えますけど-「リソースと高度なテクノロジーの双方を低価格で提供する最高クラスのクラウド・ベンダーを利用すれば」の限定付だし。

私も、この記事を読んで思い出すのは、「旅客機は世界一安全な乗り物」という話です。
事故が起これば大惨事ですが、めったなことでは起こりません。

自宅に何重もバックアップしていても、火事にですべて焼けてしまったらそれでおしまい。

私としては、データ保存とセキュリティについて、それぞれの方のポリシーがあるとおもうので、クラウドという新しい選択肢が増えたことを素直に活用したいです。

Google の BigTable がどの位の信頼性があるのか、中の人で調べた人はいないのかなぁ。

2010/01/08

民族性の差?

mixi アプリ「サンシャイン牧場」「みんなの農園」は、中国製であることは知っていましたが、Hacker Japan におもしろい記事が載っていました。

日本では、「育てゲーム」に分類されるこの手のゲーム、本国では「盗みゲーム」として楽しまれているそうです。

mixi では、初めの頃、作物などが盗まれるなどと苦情が多々あった記憶がありますが、これって元々「盗みゲー」としてデザインされてるんですね。

いつも携帯片手にチェックしている人も多いとか。
あんた達、自分の時間が一番盗まれてるよ...

2010/01/06

Bookmarklet と Javascript

Bookmarklet とは、Webブラウザのブックマークに URL の代わりに Javascript プログラムを登録したものです。
登録した Bookmarklet を選択すると、URL のページが表示される代わりに Javascript が実行されます。

これって、うまく使うとかなり色々なことができてしまいます。
なにしろ一番のメリットは、Javascript が動作するブラウザであれば拡張機能と違いブラウザの種類を問いません。

ブラウザに表示中の情報は、Javascript からは、DOM として参照/操作できますし、動的 Javascript ロードの仕組みを使用すれば、外部スクリプトの埋め込みも可能です。

色々使い道があると言うことは、悪いことに使おうとするやつもいるわけで...
しかし、今更 javascript 無効って訳にもいかないでしょう。

まあ、そんなこと(やあんなこと)するパソコンに機密情報なんか入れないのが一番です。

2010/01/05

スタートアップの世界

WEB+DB press Vol.53 に「スタートアップの世界」と題して、ポール・グレアムさんのインタビュー記事+翻訳エッセイが載っています。起業するための心構えとアイディアについて書かれていますが、う〜ん。とてもいいことがたくさんかかれていますよ。でもでも、成功しすぎちゃってる人はやっぱり、どこか突き抜けてるなぁ。と感じます。

最も重量な資質は?
・意思 -> 頭脳 -> デザイン力 + よい共同創業者になる人を知っている

これ全部揃ったら確かに最強。

良い訓練とは
・何かを作ることそして、何かを売ること

確かに耳がいたいです。どちらかをやったことがあっても両方やっている人って結構すくないですよね。

エッセイでは、いろいろな分野でまだまだやるべきことがあると、項目を上げてビジネスの狙いところを説明しています。

最後の言葉がいかにもイギリス人らしいので引用させていただきます。
「スタートアップの姿 - 世界の問題の旧式で慈悲深い解決者の上の容赦ない捕食者という組み合わせだ。金を儲ける方法として、これは非常によいものだ。スタートアップは容赦ない競合であるにせよ、競っているのは人々が望むものを作ることで勝つというゲームなのだ」

恐れ入りましたm_m。

2010/01/04

Web2.0を越えて

皆様、あけましておめでとうございます。
今年もよろしくお願いします。

最近は、Web2.0 も一段落で CSS3 と HTML5 に注目が集まっていますが、最近読んだ本では、フレームワークによる MVC(Model View Controller) について書いてあるが数冊ありました。

なんか、MVC なんて聞くと Visual C++ が出た頃を思い出します(古っ)。

一昔前は、javascript は亜流でしたが、Ajax の成功以降、Web の世界も デザイン力に加えて相当のプログラミング力が必要になってきています。Web の世界がアプリケーションプログラムに近づいてきている感じです。

google が成功し続ける間は、この傾向は続くでしょうねぇ。