2012年4月3日火曜日

DjangoのQueryDict instance is immutableエラー

Djangoでは端末からGET/POSTされた値が
requestオブジェクトに格納されます。

参照するにはこんな感じ。
print request.POST['text']

でも、POSTされた値を編集したい事もあります。

if request.method == 'POST':
str = request.POST['text']
#strの値を書き換える処理
request.POST['text'] = str

ここで値を上書きしようとすると例外が発生します。

AttributeError at /add

This QueryDict instance is immutable
Request Method: POST

こんな感じ。

request.POSTはQueryDictというオブジェクトで、書き換え不可になっている為このエラーがでます。

いかにもPythonらしい躾けのエラーですね(笑)

というわけで、書き換えたい場合はQueryDictオブジェクトが持つcopyメソッドを使用してコピーを作ります。

if request.method == 'POST':
cp = request.POST.copy()
str = cp['text']
#strの値を書き換える処理
cp['text'] = str

これならエラーになりません。

また一つ勉強になりました。

2012年3月30日金曜日

Pythonにおける絵文字の処理

まだまだ格闘中ですが、すこしずつ前進している気がする…

現在利用を考えているライブラリは
emoji-python

でもこの2つの最高の材料を組み合わせるのが難しい。
まず、docomoの絵文字を使ってテスト
u'\ue6ec'
でこいつを
emoji-pythonに変換してもらおうとすると

UnicodeEncodeError: 'ascii' codec can't encode character u'\ue6ec' in position 0: ordinal not in range(128)

と、エラーを吐いちゃう。
ドキュメントを読むとUTF8で渡せと書いてある。
あー、そうか!DjangoではまだUnicodeで持ってるから明示的にUTF8に変換しないといけないのか!

というわけで、正解は
Python 2.7.2 (default, Mar 19 2012, 14:48:20)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import emoji
>>> obj = emoji.factory('docomo', 'utf-8')
>>> obj.convert(u'\ue6ec'.encode('utf-8'))
'[d136]'
こうでした。

2012年3月26日月曜日

CentOS5.5にPython2.7とDjango1.3をインストール

CentOS 5標準でインストールされているPythonのバージョンは2.4
このバージョンでは古すぎて一部のPythonライブラリが使用出来ないので
2.x系統の最新版であるPython2.7をインストール

mod_pythonをインストール

まずはソースを持ってくる
wget http://archive.apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz

展開してcongigureする時に引数が必要

./configure --with-python=/usr/local/bin/python --with-apxs=/usr/sbin/apxs

あとは
make
make install
でmod_pythonが最新版に適用されるのでhttpdを再起動
/etc/init.d/httpd restart

この状態でDjangoのアプリを実行しようとすると
エラーが発生する。

 [Errno 13] Permission denied: '/root/.python-eggs'  The Python egg cache directory is currently set to:    /root/.python-eggs

これは
/etc/httpd/conf/httpd.conf
に下記を追記して対応
SetEnv PYTHON_EGG_CACHE /tmp/python-egg
su www
mkdir /tmp/python-egg
しておくこと。

2012年3月8日木曜日

Google Playで映画を見る!(Macで)

Android Marktが名称変更し、Google Playになりました。

いままでも映画レンタルをやっていたので、AppleのiTunes storeと
同様アプリだけの場所ではなくなったというのもあるのでしょうが
名前が変更した理由は「Android」だけがターゲットではない。
というGoogleの意思でしょうかね。

というわけで、素朴な疑問として、Google Playで映画レンタルして
PC(Mac)で再生出来るのか、をテストしてみました。

Google Playのページに行くと、まずアプリしか表示されませんが
動画という項目がある
のでクリックすると、レンタルできる動画が表示されます。
今回は20円キャンペーンでやっている、アル・パチーノ主演の名作「スカーフェイス」を
借りてみました。

Googleのアカウントでログインしていれば、Google Checkoutであっという間に決済終了。

こんな感じで再生可能になりました。























もちろん、再生ボタンをクリックすると、すぐに再生されます。


画質については…微妙。480pが最大です。
エンコード設定なのかビットレートなのか、画質としてはHuluに軍配があがりますね。

Youtubeでも閲覧出来ます。
URLは

http://www.youtube.com/watch?v=DVHUZXCeE2I

になってます。もちろん購入したGoogleアカウントでログインしてないと見られません。
試しにiPhoneから見られるかな?と思ってテストしましたがエラーメッセージがでてダメでした。

Youtubeにログインして再生出来る機器なら見られるのかも、未知数です。
GoogleアカウントでログインすればどのPCからでも見られますので
アクセシビリティはGoodですね。ただ、画質についてはBadです。
Androidタブレットは1280x780くらいの解像度端末が出ているので、
それでこの画質ではしょんぼりですねー。高画質化に期待、というか
このコンテンツが480pなだけかもしれません。

それにしても「スカーフェイス」すごい映画。
個人情報収集に関してあれこれ言われているGoogleが最初にキャンペーンで出したのが
この映画だっていうのには、作中の「the world is yours」の気分だからなのか?
などと邪推してしまいました。

2012年2月13日月曜日

brew install coreutilsするとエラー

brew install coreutilsを実行しようとすると

Error: You must install XZutils: brew install xz

と出力されるので

brew install xz

してから
brew install coreutils
すると成功するっぽい。

brewコマンドって依存関係を自動解決してくれるはずじゃないの?というツッコミいれたくなるなぁ。