2007-10-29

[メモ]djangoのmodelのカスタムSQLでujisのトラブル回避

MySQLでujisを使っている場合、djangoのカスタムSQLで日本語を使おうとすると、以下のエラーがでる。

UnicodeEncodeError at /***/***/
'latin-1' codec can't encode characters in position 170-172: ordinal not in range(256)
Request Method: GET
Request URL: http://**.**.**.**/***/***/
Exception Type: UnicodeEncodeError
Exception Value: 'latin-1' codec can't encode characters in position 170-172: ordinal not in range(256)
Exception Location: /usr/local/python25/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-x86_64.egg/MySQLdb/cursors.py in execute, line 149
Python Executable: /usr/local/python25/bin/python
Python Version: 2.5.0


ぐぐると自分が過去にTurboGearsMLに投稿した記事が出てきた。
http://groups.google.com/group/turbogears-ja/browse_thread/thread/69bc1ff4d86eca33/d18807e59a924bb3

ここではみなさんうまくきれいに解決されたようだが、相変わらず自分はうまくいかないので、以下をsettings.pyに書いて解決。
DATABASE_OPTIONS = dict(charset="ujis", read_default_file="/etc/my.cnf")

(ただし、/etc/my.cnfにデフォルトcharsetをujis指定で設定しておく。)

本当は↓みたいなのでうまくいけばいいんだけど、なんかそうならない。
DATABASE_OPTIONS = dict(charset="ujis", use_unicode=1)

2007-10-11

言語の比較記事

Ruby に比べて Python の面倒なところ
こういう他の言語を深く知っている方の感想は読んでためになる。
自分が無意識に適応してるけど、実はめんどうなことをやっているんではないかというふうに相対化した視点を得るきっかけになるのはいいことだ。

で、挙げてある「Pythonの面倒なところ」もたしかに的を得たものばかり。
printが文であることなどは自分も含めたPythonを日頃使う人も違和感を感じることもあるんじゃないだろうか。

ただ、そういう疑念が湧いたとしても、Pythonのようにそれなりに多くの先人の知恵が集まってできている言語では、たとえばprintが文になっているのもそれなりの利点があったからなのかもしれないと想像している。(うろ覚えだがPython3系ではprintが関数になるんじゃなかったけ?たぶんまた考え直したんだろうか。)

たとえば、代入が値を返さないというのは、


if a = 10:
....

のようなケアレスミスを直ちに検出できたりするから個人的にはすごく好きな点だったりする。

selfをいちいち書くのも、そのクラスの名前であることが強烈に分かるのでとても愛すべきポイントだったりする。逆にC++を書くときはthis->を書きたくて書きたくてしょうがなく感じるときもある。(がまんしてできるだけ書きませんが。)

importも、これを日々いちいち書く事で、予約語が少なく済んでいるということを骨身に沁みて感じることができたり、関数やクラスをモジュール単位で整理して思い出せるので好きなポイントだ。

returnも、どこで値が返っているかをエディタの検索で色付き反転させて一気に見る事ができてすごくいい。

ああ、なんかこうして書いていくとほんとにきりがなくて、自分はPythonに魂をうばわれているんじゃないかと思うよ。

2007-10-05

あるPython信者がたどったHaskellの入り口までの道のり

Haskellの勉強がついにその入り口の敷居を超えた気がするので、ここまでの経緯を記録しておく。

* 1年ほど前、、、「入門Haskell」を購入して一読するも理解できず。

* その1ヶ月後、、、「ふつうのHaskell」を購入して一読。途中まで写経。全体像がぼんやり見えてくるも未だ「代数的データ型」とか「型クラス」とかが一体何のためにあるか理解できず。モナドに至っては全くわからない状態。

* それからしばらくして、「モナディウスの解説ページ」を発見。Haskellでのプログラミングの進め方が、これまでのプログラミングとはずいぶんと違うことを発見。「代数的データ型」とか「型クラス」とかがわかり始める。

* それからしばらくして、仕事で作ったPythonの短いスクリプトをHaskellに移植してみる。やっぱりPythonのほうが楽だし実行時のパフォーマンスもはるかにいいし、Haskellを勉強する意欲が失せる。

* それからしばらくして、「SICP」を読み始めるも、途中のambが出てきたあたりで挫折。写経せずに電車内での読書にしていたのが敗因か。しかし、そこまででもいろいろ深い内容でためになる。この時期、自分のPythonのプログラムにやたらとmap、filter、lambdaが増え始め、そのPythonにあるまじき傾向に自制の必要を感じる。

* それからしばらくして、OCamlに手を出すも、データ型の扱いがシビアすぎて萎える。

* しばらくは時々Haskellに思いを馳せるだけの日々。結局どういうときに「代数的データ型」を使って、どういうときにただのリストとかpairで済ませるのかにうじうじと思い悩む。。。

* 数日前、「Haskellのお勉強」の写経を始める。いろいろわかり始める。敷居を超えた感を初めて味わう。

* 二日前、モナドの定義やモナド則を、チラシの裏に書いて試行錯誤してなんとか理解。モナドの演算の「m >>= k」は、「(>>= k)がmに右から作用する」と読む事で理解が深まることに気づいた。(←この視点で可換図式を書いてモナド則を理解するのがいいようだが、合っているかの自信はない。)ただこれが実際にプログラミングでどう役に立つのか、特にdo式をどういう文脈で理解すべきか、IOモナドの詳細とか、Listモナドをモナドと見なすことのご利益の理解はこれから。

* 今日、仕事であるバッチの複雑な計算処理をHaskellで書いてみた。ベクトルの各種演算とか、ファイルのIOがたらふくあるようなやつです。でも予想外にすんなり書けて驚いた。60行ぐらいの規模のプログラム。こんなに短くなるとは予想していなかった。可読性はPythonには劣るものの、なんだか気持ちいいプログラムになって満足。でも、あちこちでmap, filter, zip系を使うので、書いてある内容の密度はすごい。


ここまで1年かかっているが、昔3回ぐらい挫折を繰り返しながら数年のレンジでC++を身につけたのに比べると、まだましな道のりだろう。

2007-10-04

[メモ]Python信者から見た、Javaを使いたくない理由

ちょっとメモしておきます。
* generatorがない。
* 関数を返す関数とか、関数の配列を作ったり、それらを活用することが推奨されていない。
* lambdaがない。無名クラスのような大げさな書き方が必要。
* map, filter系関数がない。imapやifilterはもちろんない。
* 動的配列、ハッシュマップ、集合などの便利なコンテナをコンパクトに記述できない。1.4系では取り出すたびにキャストが必要なので不便。
* 最近、業界標準になってしまった某IDEが重過ぎる。
* catchを必ず書く必要がある。
* sortでcomparatorを書くのが面倒くさい。
* 大げさなライブラリは外付けでたくさんあるが、細かい気の利いたライブラリがない。(CSV読み込みとか、簡易に使えるXMLRPCサーバーとか)