Archive@2007/10

ノートPC買い替えたい。

ノートPCを買い替えたいなぁ。って思ってる矢先に、 kjirou さんが買い替えてたよ。羨ましい。

今使ってる PowerBook は既に病んでいて、 ディスプレイに映し出される映像が、 気まぐれに極彩色に変貌する。(Python温泉でも発症)

新しい MacBook が出たら買おうかと思っているものの、 コーディングにしか使わないなら、 ThinkPadUbuntu とかでも良いような気もする。 そのへんどうなんだろ?

tukiichi さんがこの組み合わせでやってたよう気がするので、 今度聞いてみよっと。

Posted at: 
2007/10/28 21:18:58
3 Comments
0 TrackBacks
Tags: 
memo
Trackback: 
http://humming.via-kitchen.com/2007/10/28/need-new-notepc/trackback/

Python温泉に行ってきたよ。

Python温泉 に参加してきたよ。 台風通過のため大雨続きだったものの、 いろんな話を聴く事が出来て、得るものが盛りだくさんなイベントだった!

その中でも気を引いたのは Voluntas さんに教えてもらった pytst 。 キーワード置換を行ってくれる代物なのですが、 処理速度が抜群に速くてビックリした。 日本語でもちゃんと動作してたし、 使い方次第で色々応用が利きそう。(な予感。) Ubuntu だと、ちょっとソースいじれば入るらしいので、 ヒマ見つけて触ってみようと思う。 Mac に入らないのは潔くあきらめる方向で。

あと、開発環境(ってか vim )の話も盛り上がった。 sgkさんの vimmer っぷりに感動。 自分はまだまだ使いこなせてないなぁ。と再認識。 教わったもののなかで第1弾として、

  • set number しない。 C-g で確認する。
  • set statusline しない。 setglobalsetlocal で確認する。
  • H, M, L を癖にする。

を叩き込む方向で。 いつか「 vim の全ては正規表現。」って言えるようになりたいっすなぁ。 pateo さんが vimmer を目指しているそうなので、 負けないように頑張ろう。

早くも次回の Python温泉 の話が上がってきてるよ。 コレばっかりは参加出来る事を祈るばかり。 興味を持たれた方は Python 温泉 公式サイト をご覧くださいまし。

今回参加された皆様、お疲れさまでした!

Posted at: 
2007/10/28 19:49:51
0 Comments
0 TrackBacks
Tags: 
pyspa
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/28/join-pythonspa/trackback/

ActionScript3で半Singleton

それなりブログ さんの AS3で半Singleton に触発されて、 ちょっと試してみたよ。

ActionScript の制限でコンストラクタは public 宣言しないとダメらしく、 完全なSingletonは無理っぽい。 まぁ、そこらへんは「半」って事で、こんな感じでどうでしょ?

package
{

    public class Singleton
    {
        /**
         *  インスタンスを保持。
         */
        private static var _instance:Singleton;

        public static function getInstance():Singleton
        {
            // 既にインスタンス化されているかチェック。
            if (!(_instance is Singleton))
            {
                // インスタンスを生成し、保持する。
                _instance = new Singleton();
            }
            return _instance;

        }

    }

}

これだと1回目のnewを気にしなくて良いかなぁ?なんて思ったり。 検討違いだったらすんません。

Posted at: 
2007/10/24 23:23:19
2 Comments
0 TrackBacks
Tags: 
ActionScript
Flash
Trackback: 
http://humming.via-kitchen.com/2007/10/24/singleton-on-actionscript3/trackback/

Djangoで405 Method not allowedをキレイに処理したい。

Django でHTTP STATUSの405を出したいと思って、 ソースとほんのり追いかけてみたよ。

django/http/__init__.py の380行目あたりに HttpResponseNotAllowed なクラスがあるんですが、 こんな感じになっていて permitted_methods 以外はセット出来ない様子。

class HttpResponseNotAllowed(HttpResponse):
    status_code = 405

    def __init__(self, permitted_methods):
        HttpResponse.__init__(self)
        self['Allow'] = ', '.join(permitted_methods)

これだと画面が真っ白になってしまうんじゃ? と思いながら試してみたら、案の定真っ白。

なら、 HttpResponse 使って status_code だけ405にしてあげたら素敵になるんじゃ? しかもHttp405とかってException作っておいて、 それを投げるように出来ればもっと素敵になるんじゃ? なんて安易な発想を実装してみた。

SumiTomohikoの日記 さんの 403 Forbiddenを表示するミドルウェア をかなり参考にさせて頂きました。

まずはExceptionを定義。 Http404を読み込んでるのは、どうせなら一緒にimportしたいってだけで、 他に意味は全くないっす。

# vim: fileencoding=utf-8 :

from django.http import Http404


class Http400(Exception):
    pass

class Http403(Exception):
    pass

class Http405(Exception):
    pass

次にミドルウェアとその他もろもろの定義。名前はそれぞれ適当にそれっぽく。

# vim: fileencoding=utf-8 :

from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.template import loader, Context, RequestContext
from exceptions import *


def _bad_request(request, template_name='400.html'):
    """
    HTTP STATUS 400を処理する。
    """
    t = loader.get_template(template_name)
    c = RequestContext(request, {})
    return HttpResponseBadRequest(t.render(c))


def _forbidden(request, template_name='403.html'):
    """
    HTTP STATUS 403を処理する。
    """
    t = loader.get_template(template_name)
    c = RequestContext(request, {})
    return HttpResponseForbidden(t.render(c))


def _not_allowed(request, permitted_methods, template_name='405.html'):
    """
    HTTP STATUS 405を処理する。
    """
    t = loader.get_template(template_name)
    # 要求されたメソッドと許可されているメソッドをテンプレートに渡す。
    c = RequestContext(request, {
        'REQUEST_METHOD'    : request.method,
        'PERMITTED_METHODS' : permitted_methods,
    })
    response = HttpResponse(t.render(c))
    # status_codeの変更。
    response.status_code = 405
    # レスポンスヘッダに許可されているメソッドをセット。
    response['Allow'] = ', '.join(permitted_methods)
    return response


class HttpExceptionMiddleware(object):
    """
    HttpなExceptionを処理する。
    """
    def process_exception(self, request, e):
        if isinstance(e, Http400):
            return _bad_request(request)
        if isinstance(e, Http403):
            return _forbidden(request)
        if isinstance(e, Http405):
            return _not_allowed(request, permitted_methods=e)
        return None

Http404はデフォルトで処理されるので、今回は見ない事に。 それぞれの処理をメソッドではなく関数にしてるのは、 どこか他でも使い回せるかなぁ?なんて浅はかな先読みでしかないです。

あとは、ココで作ったミドルウェアを settings.pyMIDDLEWARE_CLASSES に追加してやる。

MIDDLEWARE_CLASSES = (
    'applications.http.middleware.HttpExceptionMiddleware', # <-- コレを追加。
    ...
)

これで views.py とかでHttp405とかを投げると、 決められたテンプレートでレンダリングしてくれる訳ですが、 リクエストメソッドを確認する為に、 毎回同じ様な処理を書くのがメンドクサイので、 Python の勉強も含めてデコレータも作ってみた。

強烈に参考にさせて頂いたのは Agent Ultra さんの RESTful Representations for Django Views

def restrict(*accepts):
    """
    リクエストメソッドでフィルタリング。
    """
    def decorator(fn):
        def inner(request, *args, **kwargs):
            if request.method not in accepts:
                raise Http405, accepts
            return fn(request, *args, **kwargs)
        return inner
    return decorator

実際使うときはこんな感じになる。

@restrict('POST', 'PUT')
def some_view(request):
    """
    POSTかPUTしか許可されないビューになるよ。
    """

なかなかいい感じ。 期待した通りに動いてくれるし、 コード量も激減出来るし、かなり素敵 :-)

ほぼパクりっぱなしだったけど、 色々勉強出来たのでやってみて良かった! 刺激を与えてくれた某 endless 氏と、参考にさせて頂いた方と、 それを探して来てくださった 常山 さんに激しく感謝!

Posted at: 
2007/10/24 00:30:36
0 Comments
1 TrackBack
Tags: 
Django
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/24/processing-more-clearly-405-on-django/trackback/

URLRequestのリクエストメソッドが固定されてしまう?

Flash からリクエストを送信する時のメモ。

URLVariables を使ってデータを渡す場合、 URLRequest のdataプロパティにセットするらしいんですが、 そのままやるとリクエストメソッドがなぜかPOSTになってしまう。

追記 PUTやDELETEだと、ちゃんと送信されるっす。berian氏サンクスです。

//  URLRequestの生成。
var request:URLRequest = new URLRequest('http://example.com');
//  リクエストメソッドにGETを指定。
request.method = URLRequestMethod.GET;

//  リクエストするデータの作成。
var variables:URLVariables = new URLVariables();
variables.key1 = 'value1';
variables.key2 = 'value2';

//  リクエストにセット。
request.data = variables;

//  ローダを生成とリクエスト送信。
var loader:URLLoader = new URLLoader();
loader.load(request);   // <-- 結果がなぜかPOSTになる。

URLRequest - ActionScript 3.0 コンポーネントリファレンスガイド を見てみると、 GETでもPOSTでもイケるっぽい事書いてあるんだけどなぁ。そういう仕様?それともバグ?

特にやりようも知らないので、とりあえずこうしてみたよ。

request.url += '?' + variables.toString();

var loader:URLLoader = new URLLoader();
loader.load(request);   // <-- コレだとちゃんとGETになる。

URLVariables をtoStringすると、ちゃんとエンコードして返してくれるらしい。 間に入る?が気持ち悪いものの、エンコードしてくれるのはありがたいので、 ひとまずコレで落ち着いたかな。

関係ないけど、 URLRequestMethod にGETとPOSTしかないのが微妙に気になる。 PUTとDELETEも入れといてほしいなぁ。って、ちょっと思ったり。

Posted at: 
2007/10/21 22:08:52
5 Comments
0 TrackBacks
Tags: 
ActionScript
Flash
Trackback: 
http://humming.via-kitchen.com/2007/10/21/fixed-requestmethod-on-urlrequest/trackback/

mingにフォントがセット出来ない。

ming で日本語を扱うために、 ttfなフォントをfdbに変換する必要があるらしい。 ming 0.4.0beta2からは ttftofft ってのがデフォルトで入っていて、 コレを使ってttfからfftに、 makefdb を使ってfftからfdbに変換するらしい。

今回は 独立行政法人情報処理推進機構のフォント(IPAフォント)付き を変換してみる。

$ ttftofft ipag.ttf
TAG c28
FWSAx_?
       (
        ?       IPAGothicA?zf

なんか変な出力が出てくる。 それに生成されているはずのfftも生成されてない。

ググってみても殆ど情報が出てこないので、 仕方なく ttf2fft をインストールする事に。 Ming/Ruby いじり さんを参考にインストールしてみた。

書かれていた通りにやっても上手くいかなかったものの、 結果的に freetype-2.1.4ttf2fft-1.0 でインストール出来た。

# freetype-2.1.4のインストール
$ tar jxf freetype-2.1.4.tar.bz2
$ cd freetype-2.1.4
$ ./configure --enable-static
$ make
$ cd ..

# ttf2fftのインストール
$ tar jxf ttf2fft-1.0.tar.bz2
$ cd ttf2fft
$ g++ -o ttf2fft *.cxx -I../freetype-2.1.4/include -I../freetype-2.1.4/include/freetype -L../freetype-2.1.4/objs/.libs -lfreetype -lm

後は手順通りにttfをfdbに変換していく。

一通り上手く変換できたっぽいので、 実際に ming に喰わせてみる。

import os
import ming

# フォントへのパス
F_PATH = os.path.join(os.getcwd(), 'IPAGothic.fdb')

t = ming.SWFTextField()
f = ming.SWFFont(F_PATH)

# フォントのセット
t.setFont(f)

フォントをセットするところで、なぜかエラー吐く。 エラー内容はこんな感じ。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/lib/python2.5/site-packages/ming.py", line 537, in setFont
    self.__fonts[font.this]=font
TypeError: unhashable type: 'PySwigObject'

この後ソースと睨めっこしながら色々試してみるも、 結局上手く日本語を表示出来なかった。 やっぱbeta5ってのがダメだったのかなぁ?

どなたか上手く日本語を表示出来た方の情報をお待ちしております!

Posted at: 
2007/10/20 21:51:14
6 Comments
0 TrackBacks
Tags: 
Flash
ming
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/20/cannot-set-font-to-ming/trackback/

mingを入れてみたよ。

職場の方から、 ming ってどうよ?って話が出て来たので、 ちょっとインストールして試してみたよ。

ming を使うと、サーバサイドでswfを生成出来るらしく、 色々な言語から利用出来る便利なライブラリらしい。 それぞれ言語のバインディングは SWIG を使って生成するみたいなので、 先にインストールしておく必要がある。

今回インストールしてみたのは ming-0.4.0-beta5

$ tar jxf ./ming-0.4.0.beta5.tar.bz2
$ cd ./ming-0.4.4.beta5
$ ./configure --prefix=/usr/local/ming\
> --enable-python\
> --disable-perl\
> --disable-php\
> --disable-tcl
$ make
$ sudo make install

次に Python バインディングのインストール。

$ cd ./py_ext
$ python setup.py build
$ sudo python setup.py install

上手くインストール出来てるか、 インタラクティブシェルで読み込んでみる。

>>> import ming
>>> dir(ming)
['JpegBitmap', 'Ming_getScale', ...]

とりあえずインストールは上手くいった模様。 が、しかし、 更新が極端に不安定だったり、 Libming Wiki がところどころエラー吐いたままになってたりと、 使うにあたってかなり不安要素てんこ盛り。

とりあえず、日本語が使えるかどうかまではテストしてみよう。

Posted at: 
2007/10/20 18:11:10
1 Comment
0 TrackBacks
Tags: 
Flash
ming
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/20/tried-install-ming/trackback/

Tracのリダイレクトにバグ?

本日、職場にて、 trac をhttpsで動かしてる方がおられたのですが、 なぜかリダイレクトするとhttpになってしまうとの事。

で、ちょくちょく一緒に調べてみると、 どうやら他にもハマってる人がいるらしく、色々と情報が出て来た。 その中の情報で、 trac/web/api.py にいるRequestクラスの持つredirectを書き換えて治ったよ。 ってのを発見。コイツがリダイレクトを一手に担ってるらしい。

trac-0.10.4 だとこうなってる。327行目あたりを抜粋。

self.send_response(status)
if not url.startswith('http://') and not url.startswith('https://'):
    # Make sure the URL is absolute
    url = urlparse.urlunparse((self.scheme,
                               urlparse.urlparse(self.base_url)[1],
                               url, None, None, None))

多分、ココの self.base_url って中に trac.ini で定義してる base_url が入ってるんだろうけど、 すでにプロトコルの部分を無視してるっぽい。

で、 trunk のソースを一応確認してみると、 こんな感じになってる。 277行目 あたりを抜粋。

self.send_response(status)
if not url.startswith('http://') and not url.startswith('https://'):
    # Make sure the URL is absolute, honor base_url for
    # scheme and host if present
    scheme, host = urlparse.urlparse(self.base_url)[:2]
    url = urlparse.urlunparse((scheme, host, url, None, None, None))

self.base_url からプロトコル部分も取ってくるように変更されてる。なるほど。

無理を承知で書き換えをお願いしたところ、見事に意図した通りに動いたよ。 self.scheme ってのがどこから来てるかは分からないままだけど、 どこかでhttpに固定されちゃってるんだろうなぁ。と推測。

trac-0.11 のリリースが遅れに遅れまくって、 あげくの果てには trac-0.10.5 が表に出て来ちゃってるけど、 早く最新版がリリースされないかなぁ?と思う今日この頃であります。

Posted at: 
2007/10/16 23:15:09
0 Comments
0 TrackBacks
Tags: 
Python
Trac
Trackback: 
http://humming.via-kitchen.com/2007/10/16/bug-on-trac-redirect/trackback/

何かやりたくなってきた!

10月13日に行われた Django勉強会 行きたかったなぁ。 でも、発見した時には既に満員御礼。さらにはキャンセル待ちまで出てたよ。

参加された方のブログを拝見させて頂いていたのですが、 | Woops'dez | Bloggin' さんの コチラのエントリー を見て、 過激にテンション上がって来たよ! 方向性の無いモチベーションが湧いて来たよ!

でも、方向性が無いが故に何をやれば良いかは思いついてない。うーむ。

あんまり深いところは分かってないので、 行き着く先は「Djangoで○○を作ろう!」とかになっちゃいそう。

まぁ、それでも良いかなぁ。なんて。 でも、肝心の○○が埋まらへんのよね。あはは :-P

Posted at: 
2007/10/15 02:48:45
2 Comments
0 TrackBacks
Tags: 
Django
memo
Trackback: 
http://humming.via-kitchen.com/2007/10/15/want-to-do-something/trackback/

PILで文字列を画像に書き出してみたよ。

PIL で文字列から画像を生成する必要があったので、 色々ためしてみたよ。

書き出す為のフォントは 独立行政法人情報処理推進機構のフォント(IPAフォント)付き をあらかじめ /usr/local/grass5 にインストールしておいた。

#!/usr/bin/env python
# vim: fileencoding=utf-8 :

from PIL import Image, ImageDraw, ImageFont

# encoding="unic"を指定しないと日本語が書き出せなかった。
font = ImageFont.truetype('/usr/local/grass5/fonts/ipagp.ttf',
                          25, encoding='unic')

image = Image.new('RGBA', (100, 100))
draw = ImageDraw.Draw(image)

# fontでフォント指定、fillでカラー指定出来る。
draw.text((0, 0), u'ほげほげ', font=font, fill='#000000')

# pngで書き出す。
image.save('hoge.png', 'PNG')

書き出す文字列が改行を含んでいると、 最初の行しか書き出されないみたい。 それにサイズを適当に指定してしまっているので、 長い文字列が来るとはみ出してしまう。

そこで、 ImageFontgetsize で文字列がとるサイズを取得出来るみたいなので、 コレを使ってサイズを取得してみる。

#!/usr/bin/env python
# vim: fileencoding=utf-8 :

from PIL import Image, ImageDraw, ImageFont

s = u"""クロワッサン食べたくなって来たなぁ。
おいしいクロワッサンをスープパスタと食べる。

あ、想像したら、ハラへって来たよ。"""

font = ImageFont.truetype('/usr/local/grass5/fonts/ipagp.ttf',
                          25, encoding='unic')

# 改行で分割して幅と高さを取得する。
lines   = []
width   = 0
height  = 0
for l in s.split('\n'):
    lines.append(l)
    # 文字列を渡すと幅と高さのタプルが返ってくる。
    w, h = font.getsize(l)
    if w > width:
        width = w
    if h > height:
        height = h

# 取得した幅と高さを使ってサイズを指定。
image = Image.new('RGBA', (width, len(lines) * height))
draw = ImageDraw.Draw(image)

# 行ごとに書き出す。
for i, l in enumerate(lines):
    draw.text((0, i * height), l, font=font, fill='#000000')
image.save('hoge.png', 'PNG')

コレで実際に書き出してみたのがコチラ。 透過PNGなので、IEだとちょっとアレですが。

なかなかいい感じ。 PIL もちゃんと使い方覚えないとなぁ。 上手く使うと、もっと面白い事が出来そうな気がするし。

文字列自体に特に意味はありません。

Posted at: 
2007/10/14 08:23:55
4 Comments
0 TrackBacks
Tags: 
PIL
Python
Trackback: 
http://humming.via-kitchen.com/2007/10/14/string-2-image-using-pil/trackback/

Categories

Archives