2008/01/31

Pythonのfor文

Pythonのfor文はC言語・Javaなどのように、繰り返し数を指定したループカウンタは使えません。もしループ内でループのインデックスを使う必要がある場合はenumerate関数を使用します。


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

import sys
import codecs

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

names = [u"太郎", u"次郎", u"三郎"]

# 通常のループ
for name in names:
print name

# インデックスを取得するループ
for index, name in enumerate(names):
print index, name

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


太郎
次郎
三郎
0 太郎
1 次郎
2 三郎


と表示されます。私は初めてPythonでプログラムを作成したとき、ループ内でインデックスを取得する方法がわからなく悩みました。

ラベル:

2008/01/30

Pythonで月のカレンダーを行列で取得

Pythonで月のカレンダーを行列で取得するにはcalendarモジュールのmonthcalendar関数を使用します。デフォルトでは月曜日から始まる月のカレンダーの行列を取得できるようです。


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

from calendar import monthcalendar

month_calendar = monthcalendar(2008, 1)

for week in month_calendar:
print week


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



[0, 1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12, 13]
[14, 15, 16, 17, 18, 19, 20]
[21, 22, 23, 24, 25, 26, 27]
[28, 29, 30, 31, 0, 0, 0]



と表示されます。
2008年の1月は火曜日から始まるので最初の週の先頭は0となっています。
週の最初の曜日を変更したい場合はcalendarモジュールのfirstweekday関数を使用してください。

例えば、週の最初を日曜日にしたい場合は


import calendar
calendar.setfirstweekday(calendar.SUNDAY)


と設定すればOKです。

ラベル:

2008/01/29

Pythonで文字列のエンコードを判定する

プログラムを作成していて、文字列のエンコードを判定する必要があり、いろいろ調べると・・・

chardetモジュールを使えば簡単に文字列のエンコードを判定することができるようです。chardetモジュールは標準モジュールに含まれないので別途インストールする必要があり、easy_installでインストールしました。

easy_install chardet

エンコードを判定する簡単なサンプルを作成したので、下記に掲載します。



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

import chardet

print chardet.detect(u"あいうえお".encode("utf8"))
print chardet.detect(u"あいうえお".encode("euc-jp"))
print chardet.detect(u"あいうえお".encode("shift_jis"))
print chardet.detect(u"あいうえお。".encode("shift_jis"))
print chardet.detect(u"あいうえお、".encode("shift_jis"))



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


{'confidence': 0.96906250000000005, 'encoding': 'utf-8'}
{'confidence': 0.98999999999999999, 'encoding': 'EUC-JP'}
{'confidence': 0.5, 'encoding': 'windows-1252'}
{'confidence': 0.98999999999999999, 'encoding': 'SHIFT_JIS'}
{'confidence': 0.98999999999999999, 'encoding': 'SHIFT_JIS'}


と表示されました。confidenceは判定の信頼度のようです。
何故かshift_jisは句読点を含まないとうまく判定できていないようです。

ラベル:

2008/01/28

PythonからGoogle Calendarのデータを取得

PythonからGoogle Calendarのデータを取得するサンプルを作成したので掲載します。後日、時間があればGoogle Calendarのデータを操作するサンプルを掲載したいと思います。



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

import sys
import codecs
import gdata.calendar.service;

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

SOURCE = "RiverStone"

email = "XXXX"
password = "XXXX"

service = gdata.calendar.service.CalendarService()
service.email = email
service.password = password
service.source = SOURCE
service.ProgrammaticLogin()

feed = service.GetCalendarEventFeed()

for entry in feed.entry:

# タイトル
print entry.title.text

# 日時
for date_and_hour in entry.when:
print date_and_hour.start_time
print date_and_hour.end_time

# 場所
for place in entry.where:
print place.value_string

# 説明
print entry.content.text


ラベル: ,

2008/01/27

Eclipse3.3をインストール

今までEclipseをインストールするのに「All-In-One-Eclipse」を使っていましたが、Eclipse3.3系は対応していないようです。

Webでいろいろ調べてみると「Pleiades」というものがあり、とても簡単にEclipse3.3(日本語化済み)といろんなプラグインをインストールすることができました。

これはすごく便利ですね。おすすめです。

ラベル:

2008/01/26

WindowsXPにダウングレード

私が使用しているThinkpad T61にはWindows Vistaがプリインストールされていましたが、現在使用している開発環境がWindows XPでしか動作しないのでWindows XPにダウングレードしました。

Windows VistaのOEM版とDSP版にはダウングレード権を使用できるので、無償でWindows XPにダウングレードすることができます。Windows Vistaのダウングレード権については下記を参照ください。

Microsoft Windows Vista : Windows Vista のダウングレード権 (旧バージョンソフトウェアの使用) について

ThinkPad T61には WindowsXP用のソフトウェアやドライバが提供されているのでスムーズにダウングレードすることができました。ダウングレードの手順は下記のサイトを参考にしました。

T61 Vista→XPダウングレード改
ThinkPad T61 でXPにダウングレード

やはり、Vistaと比べてXPは軽快ですね。ダウングレードして良かったと思います。

ラベル:

2008/01/25

OpenOLAPについてのメモ

2008/01/24

O'Reilly Maker

O'Reilly MakerというO'Reillyの本にそっくりな画像を作れるサービスがあるようです。
試しに作ってみましたが、これはおもしろいですね。O'Reillyの本が好きな人にはたまらないですよね。


ラベル:

2008/01/23

PythonからGoogleSpreadsheetを更新する

Pythonから「gdata-python-client」を使用してGoogleSpreadsheetの値を更新することができます。簡単なサンプルを作成いたしましたので下記に掲載します。

※プログラムに定義されている変数に適切な値を設定してください。

_username: GoogleAccountのメールを設定します。
_password: GoogleAccountのパスワードを設定します。
_key: GoogleSpreadsheetにアクセスした際のURLに表示される「key」の値を設定します。


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

import sys
import codecs
import gdata.spreadsheet.service

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

# GoogleAccountのメール
_username = "xxxxx"

# GoogleAccountのパスワード
_password = "xxxxx"

# SpreadsheetのURLに表示される「key」の値 ccc?key=
_key = "xxxxx"

service = gdata.spreadsheet.service.SpreadsheetsService()
service.email = _username
service.password = _password
service.source = "RiverStone"
service.ProgrammaticLogin()


worksheets = service.GetWorksheetsFeed(_key)
sheet_ids = []

for entry in worksheets.entry:
sheet_ids.append(entry.id.text.split("/")[-1])

for index in range(1, 10):
service.UpdateCell(index, index, str(index * index), _key, sheet_ids[0])

更新対象となるスプレッドシートを開いた状態で上記のプログラムを実行すると、リアルタイムで値が設定されるようです。見ていると面白いですね。

ラベル: ,

2008/01/22

Pythonから最寄りの駅情報を取得する

HeartRailsが提供するWeb APIを使えば、経度・緯度で指定した地点周辺の駅情報を取得できるようです。

今回はPythonからAPIを使用するサンプルを作成いたしましたので掲載します(地点として弊社のある網走市を設定しました)。



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

import sys
import codecs
import urllib
import elementtree

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

encoding = "utf-8"
url = "http://express.heartrails.com/api/xml?"

query = {
"method": "getStations",
"x": 144.265305,
"y": 44.019592,
}

url += urllib.urlencode(query)

result = urllib.urlopen(url).read()

print result

上記の他にも「路線情報取得API」や「駅情報取得API」などがあるようです。
詳しくはHeartRailsのサイトをご覧ください。

ラベル: ,

2008/01/21

EclipseでPythonを使う

今まで、Pythonのプログラムを書くときはEmacsのpython-modeを使用していましたが、近頃はEclipseのPythonプラグイン「PyDev」を使用するようになりました。

PyDevを使用すればプログラムにブレイクポイントを設定してデバッグもできるし、プログラムの途中まで入力すれば下の画像のように補完してくれます。



Eclipseに慣れていて、Pythonでプログラムを書く人にはおすすめです。

ラベル: ,

2008/01/20

Pythonからコマンドを実行する

Pythonからコマンドを実行する機会があったのでメモ。
Pythonからコマンドを実行には「osモジュール」の「systemメソッド」を使用する。

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


import os

os.system("dir")

raw_input()

ラベル: ,

2008/01/19

DjangoとTurboGears

最近、PythonのWebアプリケーションフレームワークについていろいろ調べています。
DjangoTurboGearsが良さそうですね。

Djangoの方が日本語の情報が多くて人気があるみたいですが、TurboGearsで使われているテンプレートエンジンのKIDが私好みなんですよね。

ラベル: , ,

2008/01/18

Pythonを使用してBloggerのデータを取得

PythonにはGoogle Data APIのパッケージ(gdata-python-client)が提供されているので比較的簡単にBloggerのデータを取得することができます。

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

動作環境として、Pythonのバージョンは2.5、gdata-python-clientのバージョンは「1.0.10.1」を使用します。また、変数「username・password・blogid」は適切な値に置き換えてください。


# -*- coding: utf-8 -*-

try:
from xml.etree import ElementTree # for Python 2.5 users
except:
from elementtree import ElementTree

from gdata import service
from gdata.service import Query
import gdata
import atom
import getopt
import sys
import codecs

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

username = "xxxxxx"
password = "xxxxxx"
blogid = "xxxxxxxxxxxxxxxxxxx"

service = service.GDataService(username, password)
service.source = 'RiverStone'
service.service = 'blogger'
service.server = 'www.blogger.com'
service.ProgrammaticLogin()

query = Query()
query.feed = '/feeds/' + blogid + '/posts/default'
feed = service.Get(query.ToUri())

# ブログのタイトルを出力
print feed.title.text

# 投稿した記事のタイトル・内容・タグを出力
for entry in feed.entry:

print "--------------------------------------"
print "title: " + entry.title.text

tags = ""

for category in entry.category:
print "tag: " + category.term

print unicode(entry.content.text)[0:20]

print "--------------------------------------"


私の環境では、下記のデータが出力されました。

Develogger
--------------------------------------
title: Pythonを使用してBloggerのデータを取得
tag: Python
tag: GoogleDataAPI
PythonにはGoogle Data
--------------------------------------
--------------------------------------
title: Googleの証明書の期限が・・・
tag: Google
今日の昼過ぎにGmailにアクセスしたと
--------------------------------------

ラベル: ,

2008/01/17

Googleの証明書の期限が・・・

今日の昼過ぎにGmailにアクセスしたところ・・・
サーバ証明書の期限が切れているというエラーダイアログが表示されました。





Googleのサービスを毎日利用してますが、このようなエラーダイアログを見たのは初めてです。 貴重な?体験でした。

ラベル:

2008/01/16

Migration Toolkitで大きなテーブルを移行

MySQL Migration Toolkitで大きなテーブル(データ量が12万件)を移行したところ、エラーが発生して移行できませんでした。

いろいろ調べてみると「max_allowed_packet」のサイズが小さいことが原因でした。

my.cnfに


max_allowed_packet = 20M



と設定して、MySQLを再起動してからMySQL Migration Toolkitで移行したところ正常に移行できました。
大きなデータベースを移行する場合は、数回に分けて移行するか、上記の「max_allowed_packet」に大きめな値を設定する必要があるようです。

ラベル:

2008/01/15

MySQL3からMySQL5へ移行

MySQL3からMySQL5に移行する必要があり、手軽に移行する方法をWebで探すとあっさり見つかりました。MySQLにはMySQL Migration Toolkitという移行を簡単にするツールが提供されているようです。




使い方は簡単で、ステップに沿って必要なデータを入力して「Nextボタン」を押していけば完了します。

MySQL3 UTF8のデータベースをMySQL5に移行する場合は問題なく移行できましたが・・・・

MySQL3 SJISのデータベースをMySQL5に移行したところ、MySQL Migration Toolkitが落ちてしまいました(私の環境では100%再現するようです)。

SJISのデータベースは移行できませんでしたが、UTF8のデータベースは驚くほど簡単に移行できました。便利なツールですね。

ラベル:

2008/01/14

新しい仕事の道具

昨年の話ですが、仕事で使用するコンピュータを新しくしました。
弊社では、各個人が使用するコンピュータを自由に選ぶことができるので、私は「ThinkPad T61」にしました。

ノートパソコンと決めたときから、私の選択肢としては

・ThinkPad
・MacBook Pro

しかありませんでしたが、業務においてWindowsを使わなくてはならないので「ThinkPad」にしました。



私は「ThinkPad T61」に下記の周辺機器を接続して使用しています。

ディスプレイ: DELL 21インチ 液晶ディスプレイ
キーボード: Happy Hacking Keyboard Professional2
マウス : Logicool VX Revolution
ドッキングデバイス: アドバンスド・ミニ・ドック


ThinkPadを使ってみて良かったところは・・・

・シンプルなデザイン
・打ちやすいキーボード
・使いやすいトラックポイント
・ドックを使うことにより、簡単に周辺機器を接続できる

ThinkPadを使ってみて悪かったところは・・・

・OSがCDで提供されない(HDDから初期状態に復元できる)
・タッチパッドが不必要
・キーボードの配列が日本語配列(購入時に英語配列に変更できませんでした)

自宅では「ThinkPad X32」を使用していますが、今回「ThinkPad T61」を使ってみた感想としては良い意味でX32と変わっていませんでした。

GNUプロジェクトで有名なリチャード・ストールマン氏も「ThinkPad」を使用しているんですね。

リチャード・ストールマン@GNUは、笛を吹く!

ラベル: ,