2008/02/29

Flex Scheduling Framework

Adobe Labsにスケジュールコンポーネント用のフレームワーク「Flex Scheduling Framework」が公開されています。

簡単ですがサンプルを作成したので掲載します。


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="flexlib.scheduling.*" applicationComplete="applicationCompleteHandle()" backgroundGradientColors="[#c0c0c0, #c0c0c0]">

<mx:Script>
<![CDATA[

import mx.collections.ArrayCollection;
import mx.collections.IList;
import flexlib.scheduling.scheduleClasses.ColoredScheduleEntry;
import flexlib.scheduling.scheduleClasses.SimpleScheduleEntry;

[Bindable]
private var start:Date;

[Bindable]
private var end:Date;

[Bindable]
private var dataProvider:ArrayCollection;

private function applicationCompleteHandle():void {

start = new Date(2008, 0, 1, 9, 0, 0);
end = new Date(2008, 0, 1, 17, 59, 59);

var entries:ArrayCollection = new ArrayCollection();

var row1:IList = new ArrayCollection();
var entry1:ColoredScheduleEntry = new ColoredScheduleEntry();
entry1.startDate = new Date(2008, 0, 1, 9, 30, 0);
entry1.endDate = new Date(2008, 0, 1, 11, 59, 59);
entry1.label = "会議";
entry1.backgroundColor = 0x663333;
row1.addItem(entry1);

var row2:IList = new ArrayCollection();
var entry2:ColoredScheduleEntry = new ColoredScheduleEntry();
entry2.startDate = new Date(2008, 0, 1, 13, 0, 0);
entry2.endDate = new Date(2008, 0, 1, 15, 59, 59);
entry2.label = "プログラミング";
entry2.backgroundColor = 0x336633;

row2.addItem(entry2);

entries.addItem(row1);
entries.addItem(row2);

dataProvider = entries;
}

]]>
</mx:Script>

<mx:VBox x="0" y="0" height="100%" width="100%" verticalGap="0">
<ns1:Timeline id="timeline" width="800" height="20" startDate="{start}" endDate="{end}"/>
<ns1:ScheduleViewer id="scheduleViewer" width="800" height="300" startDate="{start}" endDate="{end}" dataProvider="{dataProvider}" entryLayout="flexlib.scheduling.scheduleClasses.layout.SimpleLayout" entryRenderer="flexlib.scheduling.scheduleClasses.renderers.ColoredSolidScheduleEntryRenderer" x="53" y="143"/>
</mx:VBox>

</mx:Application>



下記の画像が実行結果



タイムラインを表示するコンポーネントとスケジュールを表示するコンポーネントは分かれているようです。

タイムラインを表示するには「flexlib.scheduling.Timeline」クラスを使用し、スケジュールを表示するには「flexlib.scheduling.ScheduleViewer」クラスを使用します。

スケジュールをドラッグ&ドロップで移動できるといいのですが、軽くドキュメントを見た限りでは見つかりませんでした。対応しているのでしょうか?

ラベル:

2008/02/28

FlexBuilder3を使ってみて

FlexBuilder3が正式にリリースされたので使ってみました。
私の感想ですがFlexBuilder2と比べて格段に良くなったと感じました。

一番嬉しいのはリファクタリングの名前の変更ができるようになったことです。
今まではこの機能がなかったので、クラスの名前を変更したい場合は大変でした。

FlexBuilder3ではFlex2のアプリケーションを開発できないと思っていましたが・・・
FlexBuilder3からEclipseのJDTがJDKを変更できるのと同じように、FlexのSDKを変更できます。



他にも、UIをデザインする画面で拡大できるようになったり、UIコンポーネントの背景色を選択するカラーピッカーが使いやすくなったりと、細かいところもいろいろ変更されているようです。


私はまだ使用していませんが、プロファイリング機能が追加されたのでパフォーマンスチューニングも楽になりそうですね。

ラベル:

2008/02/27

Flex2のnavigateToURL

Flex2から任意のURLを新しいブラウザで開きたい場合は「flash.net.navigateToURL」関数を使用すると簡単にできます。

navigateToURLの第一引数には「URLRequest」のインスタンスを、第二引数にはリクエスト結果を表示するウィンドウを指定します。

リクエストメソッドとして「POST」を使用したい場合は「URLRequest」の「method」プロパティに「URLRequestMethod.POST」を設定します。

第二引数はHTMLのAタグに指定する「target」属性のようなもので新しいブラウザを開きたい場合は「_blank」、現在のウィンドウで開きたい場合は「_self」を指定します。

下記にサンプルを掲載します。


var request:URLRequest = new URLRequest("http://www.google.com/");
request.method = URLRequestMethod.POST;
navigateToURL(request, "_blank");


これを実行すると新しいブラウザが開き、GoogleのWebサイトが表示されます。

ラベル:

2008/02/25

Flex2でXMLオブジェクトに変数の値を埋め込む

Flex2ではXMLオブジェクトにXMLデータをリテラルで設定する際に、変数の値を埋め込むことができます。

変数を埋め込むにはスコープ上に存在する変数名を「{}」で囲みます。
例えば変数「name」を埋め込む場合は「{name}」となります。

これはXMLの構造が変化しないデータを扱うときに大変便利です。
下記に簡単ですがサンプルを掲載いたします。


var id:int = 100;
var name:String = "山田太郎";

var xml:XML =
<employees>
<employee id={id}>{name}</employee>
</employees>;

trace(xml.toXMLString());


このプログラムを実行するとコンソールに下記のメッセージが表示されます。

<employees>
<employee id="100">山田太郎</employee>
</employees>

ラベル: ,

2008/02/24

Python2.5のwith文

Python2.5からwith文が導入されました。with文を使用すればtry文のfinally節で行っていた後処理が明快に記述できます。

例えばファイルを開いてデータを読み出してからクローズする場合は下記のようになります。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import with_statement

# try finallyを使用
try:
file = open(r"C:\test.txt", "r")
for line in file:
print line
finally:
file.close()

# withを使用
with open(r"C:\test.txt", "r") as file:
for line in file:
print line


今回、MySQLに接続してクエリを実行してから接続を閉じる処理をwith文で作成してみたので掲載したいと思います。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import with_statement

import MySQLdb

class MySQLConnector(object):

def __init__(self, username, password):
self.username = username
self.password = password

def __enter__(self):
self.connection = MySQLdb.connect(db="test", host="localhost", port=3306, user=self.username, passwd=self.password)
self.cursor = self.connection.cursor()
print "called __enter__"
return self.cursor

def __exit__(self, type, value, tb):
self.cursor.close()
self.connection.close()
print "called __exit__"


if __name__ == '__main__':

with MySQLConnector("testuser", "testpassword") as cursor:
cursor.execute("select * from testdata")
for row in cursor.fetchall():
print row



上記のサンプルを説明すると、with文は最初に「__enter__」メソッドを呼び出し、with文から抜け出すときに「__exit__」メソッドを呼び出します。
「__enter__」メソッドの戻り値がwith文の変数(上記のサンプルでは「as cursor」の部分です)に代入されるようです。

※with文の中で例外が発生した場合でも「__exit__」メソッドが呼び出されます。

ラベル:

2008/02/23

SQLiteのデータを操作するツール

SQLiteのデータをコマンドから操作するのが面倒になり、データを操作する便利なツールがないかWebで捜したところ・・・

2つありました。「SQLiteCC」と「SQLite Database Browser」という名前のツールです。
両方使ってみた結果、私としては「SQLite Database Browser」の方が使いやすく感じました。

SQLiteCCはデータを更新すると強制終了されるのと、テーブルを作成できないので最近は使用していません。

なので、最近は「SQLite Data Browser」を使用しています。
ちょっとしたデータを格納するのにSQLiteは手軽で便利ですよね。

SQLiteについては下記の書籍が一番まとまっています。

ラベル: ,

2008/02/22

mx.controls.textClasses.TextRangeクラス

以前から気になっていたFlex2のTextRangeクラスを使ってみました。このクラスを使用すれば「TextInput」や「TextArea」に表示されている文字のスタイルを変更することができます。

例えば「editor」というidの「TextArea」に表示されている文字の選択部分を太字にしたい場合は・・・


var textRange:TextRange = new TextRange(editor, true);
textRange.fontWeight = "bold";


とすればOKです。
TextRangeクラスのコンストラクタの第一引数には「TextInput」や「TextArea」などのインスタンスを、第2引数はtrueを設定します(詳細はリファレンスを参照ください)。

文字を太字にする以外にも、下記のようにたくさんのスタイルを設定できるようです。
 ・文字の色
 ・文字の書体
 ・文字の大きさ
 ・カーニング
 ・文字間
 ・文字の整列
 ・斜体
 ・文字にリンクを設定

ラベル: ,

2008/02/21

正規表現の書籍

仕事で正規表現を使う機会は割と多いと思います。正規表現について一番体系的にまとまっているのはオライリーの「詳説 正規表現」ですよね。(来月に第3版がでるようです)



この本は詳しい情報が掲載されているのですが、手軽に手早く調べるのには向いていません。(じっくり精読するタイプです)

持ち運びやすく、手軽に手早く調べるには下記の書籍がおすすめです。



対応処理系も掲載されていて、持ち運びやすく大変重宝しています。

ラベル:

2008/02/20

BeautifulSoupである属性が存在する要素を抽出

BeautifulSoupである属性が存在する要素を抽出するには、findAllメソッドにキーワード引数を渡して使用するようです。具体的にはキーワード引数名に捜したい属性名を、値にTrueを設定してfindAllメソッドを呼び出します。

例えば「href属性」が存在する要素を取得する場合は下記のようになります。


soup.findAll(href=True)


となります。
簡単ですが、サンプルを作成したので掲載します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs
import re

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import NavigableString
from BeautifulSoup import Tag

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

html = """
<div>
<a href="http://www.google.com/" onclick="testMethod1">Google</a>
<a href="http://www.yahoo.co.jp/" onclick="testMethod2">Yahoo! Japan</a>
<a href="http://www.r-stone.net/" onblur="testMethod3">RiverStone</a>
</div>

"""

soup = BeautifulSoup(html)

for tag in soup.findAll(onclick=True):
print tag


上記のプログラムを実行すると、コンソールに下記のメッセージが表示されます。

<a href="http://www.google.com/" onclick="testMethod1">Google</a>
<a href="http://www.yahoo.co.jp/" onclick="testMethod2">Yahoo! Japan</a>

ラベル:

2008/02/19

Firefox Mouse Over Dictionary + 英辞郎

FirefoxにMouse Over Dictionaryという英辞郎の辞書データに対応したアドオンがあります。
ブラウザ上で英単語にマウスを当てるとサイドバーに英辞郎の辞書から引いたデータを表示してくれるので、非常に便利です。

英辞郎を持っている方は、是非おためしください。

ラベル:

プログラミングGaucheが3月に発売

Oreillyからのメールによると「プログラミングGauche」が3月に発売されるようです。

4月には「ビューティフルコード」の和訳が出版されるようなので楽しみです。

ラベル:

2008/02/18

StringIO

Javaでいうと「StringReader」のようなクラスが必要になりPythonのドキュメントを見るとStringIOというクラスがありました。

StringIOはファイルオブジェクトのメソッドと属性を備えるクラスで、データをファイルではなくメモリ上に持ちます。

簡単なサンプルを作成したので、下記に掲載します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs

from StringIO import StringIO

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

buffer = StringIO("")
buffer.writelines(u"あいうえお\n")
buffer.writelines(u"かきくけこ\n")

print buffer.getvalue()
buffer.close()

buffer = StringIO(u"さしすせそ\nたちつてと\n")

for line in buffer:
print line.strip()

buffer.close()

上記のプログラムを実行すると・・・

あいうえお
かきくけこ

さしすせそ
たちつてと

と表示されます。
StringIOよりも高速なcStringIOというクラスがあるようですが、Unicodeをサポートしないようです。

ラベル:

2008/02/17

PyAMFを使ってみた

PyAMFを使用すればPythonとActionScript3とのデータのやりとりをオブジェクトで行うことができます。PyAMFはDjango・Pylons・CherryPyなどのWebフレームワークに対応しています。

今回はDjangoとFlex2の間でデータを送受信する簡単なサンプルを作成しました。
まずはFlex2ですが「NetConnection」クラスを使用してDjangoにデータを送信します。

■PyAMF.mxml


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="applicationCompleteHandle()">

<mx:Script>
<![CDATA[

public function applicationCompleteHandle():void
{

var netConnection:NetConnection = new NetConnection();
netConnection.connect("http://localhost:8080/pyamf/");

var p:Person = new Person();
p.name = "山田 太郎"
p.age = 28;

var responder:Responder = new Responder(onResult, onError);
netConnection.call("greeting", responder, "Hello PyAMF", p)
}


private function onResult(result:*):void
{
trace(result)
}

private function onError(error:*):void
{
trace(error)
}

]]>
</mx:Script>

</mx:Application>




■Person.as

package
{
public class Person
{

public var name:String;
public var age:int;

}
}


続いてDjango側は「pyamf.remoting.djangogateway.DjangoGateway」クラスを使用してFlex2とのデータを送受信します。
views.pyなどにDjangoGatewayを定義してDjangoGatewayのコンストラクタに公開したいメソッドの名称とメソッド自身を辞書に格納して渡します。


def greeting(request, message, person):
print message
print person.name.encode("cp932")
return "Hello Flex2"

gw = DjangoGateway({'greeting':greeting})


あとはurls.pyで上記の「gw」が呼び出されるように設定します。(greetingメソッドを直接呼び出すわけではありません)

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^pyamf/', 'rstone.moblogger.views.gw'),
)


上記のプログラムを実行するとDjangoでは・・・

Hello PyAMF
山田 太郎

と表示され、Flex2では・・・

Hello Flex2

と表示されました。
Flex2からDjangoに送信したPersonクラスですが、Djangoでは「pyamf.ASObject」になるようです。

ラベル: ,

2008/02/16

Pythonで全角から半角への変換

Pythonで全角カナを半角カナに変換したくて、そのようなモジュールがあるかWebで調べたところ・・・

見つかりました。
zenhan.pyというモジュールで下記のブログで公開されているようです。

blogSetomits zenhan.py0.4


早速、ダウンロードして使ってみました。このモジュールでは「半角→全角」と「全角→半角」に変換できるようです。

下記に簡単なサンプルを掲載します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs
import zenhan

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

s1 = u"アイウエオ1234567890ABCDEF@"
s2 = u"アイウエオ1234567890abcdef@"

# 半角から全角に変換
print zenhan.z2h(s1)

# ASCIIとカナだけ変換したい場合
print zenhan.z2h(s1, zenhan.ASCII|zenhan.KANA)

# ASCIIと数字だけ変換したい場合
print zenhan.z2h(s1, zenhan.ASCII|zenhan.DIGIT)

# 数字だけ変換したい場合
print zenhan.z2h(s1, zenhan.DIGIT)

# ASCIIだけ変換したい場合
print zenhan.z2h(s1, zenhan.ASCII)

# 半角から全角に変換
print zenhan.h2z(s2)


■実行結果

アイウエオ1234567890ABCDEF@
アイウエオ1234567890ABCDEF@
アイウエオ1234567890ABCDEF@
アイウエオ1234567890ABCDEF@
アイウエオ1234567890ABCDEF@
アイウエオ1234567890abcdef@

ラベル:

2008/02/15

Pythonで「~」をエンコードすると例外が発生

Pythonで「~」をSJISやEUCにエンコードすると例外が発生します。

※cp932やmbcsを使用すれば例外は発生しません。

■検証したコード

#!/usr/bin/env python
# -*- coding: utf-8 -*-

s = u"~"

try:
s.encode("shift_jis")
print "shift_jis ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jis_2004")
print "shift_jis_2004 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jisx0213")
print "shift_jisx0213 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("euc_jp")
print "euc_jp ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("utf8")
print "utf8 ok"
except UnicodeEncodeError, e:
print e


上記のプログラムを実行すると・・・

'shift_jis' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'shift_jis_2004' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'shift_jisx0213' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
'euc_jp' codec can't encode character u'\uff5e' in position 0: illegal multibyte sequence
utf8 ok

と表示されます。

文字コード「U+FF5E」を文字コード表で見てみると・・・


Fullwidth Tildeとなっており、さらにWebで調べるとWindowsの問題のようです。

WAVE DASH - FULLWIDTH TILDE問題

これはFullwidth TildeをWave Dashに変換すれば解決できるようです。


下記に修正したプログラムと出力結果を掲載します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import string

s = u"~"
s = string.replace(s, u'\uff5e', u'\u301c')

try:
s.encode("shift_jis")
print "shift_jis ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jis_2004")
print "shift_jis_2004 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("shift_jisx0213")
print "shift_jisx0213 ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("euc_jp")
print "euc_jp ok"
except UnicodeEncodeError, e:
print e

try:
s.encode("utf8")
print "utf8 ok"
except UnicodeEncodeError, e:
print e


shift_jis ok
shift_jis_2004 ok
shift_jisx0213 ok
euc_jp ok
utf8 ok

ラベル:

2008/02/14

codecsで使えるエンコーディング

Pythonのcodecsで使用できるエンコーディングは「encodings」モジュールにあるようです。どこにあるのか気になってはいたのですが、偶然に見つけることができました。

私の環境(WindowsXP)では「C:\Python25\Lib\encodings」になります。

SJISだけでも・・・

・shift_jis
・shift_jis_2004
・shift_jisx0213

何種類かあるようです。

ラベル:

2008/02/13

BeautifulSoupを使って要素を追加する

BeautifulSoupを使ってHTMLに要素を追加する機会があったのでサンプルを掲載します。BeautifulSoupでは要素をTagクラスとして扱うので、要素を追加する場合はTagクラスのインスタンスを生成して、親となる要素(Tagクラス)の「insert」メソッドで追加することができます。
また、要素にテキストを追加したい場合は「NavigableStringクラス」を使用すれば追加できるようです。

下記が簡単なサンプルです。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import NavigableString
from BeautifulSoup import Tag

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

html = """
<div>
<a href="http://www.google.com/">Google</a>
<a href="http://www.yahoo.co.jp/">Yahoo! Japan</a>
</div>

"""

soup = BeautifulSoup(html)

tag = Tag(soup, "a")
tag["href"] = "http://www.r-stone.net/"
text = NavigableString("リバーストーン")
tag.insert(0, text)

soup.div.insert(0, tag)

print soup.prettify()



このプログラムを実行すると



<div>
<a href="http://www.r-stone.net/">
リバーストーン
</a>
<a href="http://www.google.com/">
Google
</a>
<a href="http://www.yahoo.co.jp/">
Yahoo! Japan
</a>
</div>




と表示され、正常に要素が追加されているようです。

ラベル:

2008/02/11

Last.fmのAPI

Last.fm API に「あるアーティストと関係の深いアーティストを取得」するAPIがあります。そのAPIをPythonから使用するサンプルを作成しました。

データ形式としてプレインテキストとXMLに対応しているようです。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib import urlopen

try:
from xml.etree import ElementTree
except:
from elementtree import ElementTree

def create_url(artist):
return "http://ws.audioscrobbler.com/1.0/artist/%s/similar.xml" % artist


data = urlopen(create_url("beatles")).read()
print data
etree = ElementTree.fromstring(data)

for index, tag in enumerate(etree.getiterator("artist")):
print (index + 1), tag.find("name").text


上記のプログラムを実行すると「Beatles」との関係が深いアーティストが100件表示されます。

■実行結果(上位20件)

1 John Lennon
2 The Rolling Stones
3 Led Zeppelin
4 The Who
5 Paul McCartney
6 Pink Floyd
7 The Beach Boys
8 George Harrison
9 The Doors
10 David Bowie
11 Simon & Garfunkel
12 Jimi Hendrix
13 The Kinks
14 Queen
15 The Velvet Underground
16 Cream
17 Oasis
18 Coldplay
19 Paul McCartney & Wings
20 Franz Ferdinand

ラベル:

2008/02/10

PILを使ってWeb上の画像を読み込む

PythonのPIL(Python Imaging Library)を使用してWeb上の画像を読み込む必要があったので、簡単なサンプルを作成しました。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import Image
import urllib

from cStringIO import StringIO

buffer = urllib.urlopen("http://www.r-stone.net/blogs/satoshi/uploaded_images/blog2008020901-705040.jpg").read()
image = Image.open(StringIO(buffer))

image.thumbnail([100, 100])
image.save(r"c:\test.jpg")

ラベル:

2008/02/09

Launchy

WindowsにもMacのQuickSilverのようなソフトウェアがないのか?と思って捜してみると・・・
Launchyというのがありました。

これはすごく便利ですよね。かれこれ半年以上使っていますが、すでに手放せないソフトウェアです。

使用方法はシンプルで、任意のショートカットキーでLaunchyを起動して目的のアプリケーションの名前を入力するだけです。


これを使うようになってから、わざわざスタートメニューを開いてアプリケーションを起動するという手間が無くなりました。

ラベル:

2008/02/08

BeautifulSoupを使ってHTMLを解析

PythonでHTMLを解析してHTMLのタグをいろいろ操作する必要があり、調べてみると「BeautifulSoup」という便利なモジュールがありました。

BeautifulSoup

早速使ってみましたが、これはすごく良いですね。簡単にHTMLを解析して操作することができました。しかも、HTMLだけではなくXMLにも使えるようです。

EasyInstallに対応しているので、下記のコマンドで簡単にインストールすることができました。

easy_install beautifulsoup

下記に簡単なサンプルを掲載します。

■HTML内の特定のタグを取得

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Tag

html = """
<ul>
<li><a href="aaa.html">aaa</a></li><p>
<li><a href="bbb.html">bbb</a></li>
</ul>

"""

soup = BeautifulSoup(html)

# aタグを取得
for tag in soup.findAll('a'):
print tag


■出力結果

aaa
bbb


■タグを削除(Tagクラスのextractメソッドを使用)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Tag

html = """
<ul>
<li><a href="aaa.html">aaa</a></li><p>
<li><a href="bbb.html">bbb</a></li>
</ul>

"""

soup = BeautifulSoup(html)

#print soup.prettify()

# aタグを取得
for tag in soup.findAll('a'):
tag.extract()

print soup.prettify()


■出力結果

<ul>
<li>
</li>
<p>
</p>
<li>
</li>
</ul>


■タグを別のタグで置き換える

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from BeautifulSoup import BeautifulSoup
from BeautifulSoup import Tag

html = """
<ul>
<li><a href="aaa.html">aaa</a></li><p>
<li><a href="bbb.html">bbb</a></li>
</ul>

"""

soup = BeautifulSoup(html)

#print soup.prettify()

# aタグを取得
for tag in soup.findAll('a'):
t = Tag(soup, "foo")
tag.replaceWith(t)


■出力結果

<ul>
<li>
<foo>
</foo>
</li>
<p>
</p>
<li>
<foo>
</foo>
</li>
</ul>

ラベル:

2008/02/07

Pythonの書籍

Pythonの勉強をするために何冊か本を購入しました。私がよく参考にする本は下記の4冊です。

Pythonチュートリアル
初めてのPython 第2版
Python クックブック 第2版
Pythonクィックリファレンス

仕事などでプログラムの経験がある場合は上記の4冊があれば、一通り勉強できると思います。
読み進める順番は・・・

1. 初めてのPython
2. Pythonチュートリアル
3. WebでPython2.5の勉強
4. Pythonクィックリファレンス
5. Pythonクックブック

がおすすめです。
また、プログラムの経験が浅い場合は下記の書籍が参考になると思います。

Pythonで学ぶプログラム作法
みんなのPython
実践Python~文字列操作からWebアプリケーション開発まで

私は読んだことがありませんが、入門書として下記の書籍もあるようです。

はじめてのPython―「生産性」「汎用性」に優れ、習得が容易なプログラミング言語 (I/O BOOKS)
速効!Pythonプログラミング―バージョン2.5対応

ラベル: ,

2008/02/06

DjangoのテンプレートでHTMLを出力

Djangoのテンプレートで直接HTMLを出力する必要があり、テンプレートのパラメータにHTMLを格納して出力したところタグがエスケープされてしまいました。

原因を調べたところ、「django.template.Context」クラスのコンストラクタのパラメータ「autoescape」がデフォルトでTrueになっているようです。

今まではショートカット「render_to_response」を使ってレスポンスを生成していましたが、下記のようにプログラムを変更して対応しました。


t = loader.get_template('post.html')
c = Context({'html':html}, False)
return HttpResponse(t.render(c))

Contextのコンストラクタの第2引数にFlaseを渡すのがポイントです。

ラベル: , ,

2008/02/05

PyDevでDjangoのアプリをデバッグする

EclipseのPyDevを使用すればDjangoを使用して作成したWebアプリケーションをデバッグすることができます。簡単ですが下記に手順をメモします。

[環境]
Windows XP
Eclipse3.3.1
Python2.5
Django0.97

1. コマンドプロンプトでEclipseのワークスペース直下に移動してプロジェクトを作成



2. EclipseにてPyDevのプロジェクトを作成する



プロジェクト名には「1」で作成したプロジェクトと同じ名前を入力し、プロジェクトタイプの選択を「Python2.5」に設定して「デフォルトのsrc…」のチェックをはずす。



3. コマンドプロンプトで「DjangoDebugSiteプロジェクト」直下に移動してアプリケーションを作成


4. EclipseのPyDevプロジェクトをPYTHONPATHに追加

「2」で作成したプロジェクトを右クリック->プロパティ->「PyDev -PYTHONPATH」->「ソースフォルダの追加」にてプロジェクトをPYTHONPATHに追加する



5. 動作可能なDjangoのアプリケーションを作成(適当に動作可能なプログラムを作成してください)


6. デバッグの構成を作成するためにmanage.pyをデバッグで起動

デバッグの構成を作成するためにmanage.pyをデバッグで起動します。(エラーが表示され起動しませんが問題はありません)


7. デバッグの構成を修正
「メニュー」->「実行」->「デバッグダイアログを開く」を選択してデバッグの構成を開くと、先ほど起動に失敗したデバッグの構成があります。



引数のタブを選択して、プログラムの引数に「runserver 8080 --noreload」と設定します。


8. あとはプログラムにブレイクポイントを設定してからデバッグで起動し、ブラウザからアクセスすればブレイクポイントで止まります。


やはり、ステップインを使ってデバッグが行えると開発するのが楽ですね。
開発効率が上がること間違いなしです。

ラベル: , , ,

2008/02/04

Pythonで現在の日付を取得してフォーマットする

Javaでは「java.util.Date」クラスを引数なしのコンストラクタで生成すれば現在の時刻が設定されます。また、日付をフォーマットしたい場合は「java.text.SimpleDateFormat」クラスなどを使用すると思います。

Pythonで現在の時刻を取得するには「datetimeクラス」の「nowメソッド」や「todayメソッド」を使用するようです。nowメソッド・todayメソッドの戻り値はdatetimeクラスとなっており、フォーマットしたい場合は「strftimeメソッド」に書式化文字列を引数として渡して呼び出します。

下記に簡単なサンプルを掲載します。


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import codecs
from datetime import datetime

sys.stdout = codecs.getwriter('cp932')(sys.stdout)

now = datetime.now()
today = datetime.today()

print now.__class__
print today.__class__

print now.strftime("現在の時刻は %Y年%m月%d日 %H時%M時%S秒 です。")
print today.strftime("現在の時刻は %Y年%m月%d日 %H時%M時%S秒 です。")


このプログラムを実行すると、私の環境ではコンソールに下記の文字列が表示されました。


<type 'datetime.datetime'>
<type 'datetime.datetime'>
現在の時刻は 2008年02月04日 21時46時08秒 です。
現在の時刻は 2008年02月04日 21時46時08秒 です。

ラベル:

2008/02/03

Flex2でBase64を扱う方法

今まで気がつきませんでしたが、Flex2の標準クラスに「Base64にエンコードするクラス」と「Base64からデコードするクラス」があるんですね。しかもFlex2 リファレンスガイドには掲載されていないようです。

Base64にエンコードするには「mx.utils.Base64Encoder」、Base64からデコードするには「mx.utils.Base64Decoder」を使えばOKです。

下記に簡単なサンプルを掲載します。



var srcByteArray:ByteArray = new ByteArray();
srcByteArray.writeObject("あいうえお");

var encorder:Base64Encoder = new Base64Encoder();

/* Base64でエンコード */
encorder.encodeBytes(srcByteArray);

/* エンコード結果を取得 */
var encodeString:String = encorder.flush();
trace("Base64 Encode: " + encodeString);

var decoder:Base64Decoder = new Base64Decoder();

/* Base64をデコード */
decoder.decode(encodeString);

var dstByteArray:ByteArray = decoder.flush();
trace("Base64 Decode" + dstByteArray.readObject());

ラベル:

2008/02/02

PyDevでカバレッジ

EclipseのPyDevを使ってPythonのプログラム実行する際に「Python カバレッジ」という文字が目に止まりました。PyDevでカバレッジを計測することができるんですね。

使い方は簡単です。

1. 実行したいモジュールを右クリックして「実行->Python カバレッジ」を選択


2. 「ウィンドウ->ビューの表示->その他」を選択


3. コード・カバレージ結果ビューを選択


4. 「ディレクトリーの選択」をクリックしてカバレッジ結果を見たいモジュールがあるディレクトリを選択します



あとはカバレッジ結果を見たいモジュールを選択すれば、通っていない箇所がエラーとなります。


私としては、通っていない箇所がエラーではなく警告の方がいいと思うのですけれどね。

2008/02/01

書籍 BEST SOFTWARE WRITING

Joel Spolsky氏が執筆した書籍「BEST SOFTWARE WRITING」が2008年2月21日に発売されるようです。
Joel on Softwereが良書だったので期待してます。Joel氏はDeveloppers Summit(2月13日)で講演するんですね。もうすでに満席ですが、是非講演を聞いてみたいです。





ラベル: