「python」カテゴリーアーカイブ

open (file object)

ファイルのオープン

utf-16 でエンコードされた csv ファイルの読み出し。(書き出しは unicode_escape。)
f = open('keyword.csv', encoding='utf-16')
for l in f:
    print(l.encode('unicode_escape'))
または、
with open('keyword.csv', encoding='utf-16') as f:
    for l in f:
        print(l.encode('unicode_escape'))
... 続きを読む

sitemap中の%エンコードされた日本語のURLの一覧

sitemap.xml を確認しようとするが、日本語の URL にしていると、sitemap.xml 内の URL が % エンコードされてしまい、内容がわからないということがあるかもしれない。(そんなことで困っている人はいないかもしれないが。。。) python で xml 内の loc タグ内の % エンコードされたURLを日本語にして表示する。 print_sitemap.py
#!/usr/bin/env python

import requests
import sys
from bs4 import BeautifulSoup
import urllib.parse

url = sys.argv[1]
sitemap = requests.get(url)
soup = BeautifulSoup(sitemap.text)
locs = soup.find_all('loc')
for loc in locs:
    print(urllib.parse.unquote(loc.text))
python print_sitemap.py URL BeautifulSoup は xml や、html の解析に便利なので、使ってみてほしい。... 続きを読む

CSV(TSV)からSQLを作る

私は、シェルスクリプトではやりづらいと思うものは、pythonで作ることが多い。 今回は、タブ区切りファイルから SQL 文を出力してみた。 今、保守しているシステムでテーブル構造自体をテーブルに定義するものがある。 例えば、
フィールド名 フィールドタイプ 最小値 最大値
名前 全角 1 10
といった類の定義をDBテーブル自体に行うというもの。 追加しかできない上に定義の時は、WEB からいちいち手入力する必要があるし、複数のDBテーブルに設定する必要がある。えらく時間がかかってめんどくさい。 なんだこれ、とブツブツ言いながら、CSV から SQL を生成するスクリプトを作ることにした。DB に接続して直接DBに登録することもできるだろうが、そこまで時間をかけるのも無駄なので、SQL を print するものにとどめた。 詳しい部分は書けないが、次のようなコード。(python3用) テーブル定義は excel で作られているので、定義部分をコピーしてテキストエディタに貼る。そうすると、タブ区切りになるので、そのファイルを保存して、第3引数で渡す。
import sys
import csv

table_id = int(sys.argv[1])
table_name = sys.argv[2]
table_def = sys.argv[3]

def get_field_type(s):
    if s == '文字(全角・半角)':
        return 0
    elif s == '全角':
        return 1
    elif s == '全角カナ':
        return 2
    elif s == '半角':
        return 3
    else:
        raise Exception

def get_field_length(s):
    if s == '-':
        return "0"
    else:
        return str(int(s))

with open(table_def, newline='', encoding='cp932') as csvfile:
    reader = csv.reader(csvfile, delimiter='\t')
    for row in reader:
        field_id = int(row[0])
        field_name = row[1]
        field_type = get_field_type(row[2])
        sql = """insert into meta_fields (table_id, field_id, field_name, field_type) values({}, {}, '{}', {});"""
        print(sql.format(table_id, field_id, field_name, field_type))
            :
        他にも必要な insert 文を print

設計もこのスクリプトもしょうもないと苦笑してしまう・・・... 続きを読む

python学習法

研究や、仕事上必要に迫られてこのページに辿りつかれた場合、python にはよくできたチュートリアルがあるので、試してみてほしい。 これと、ライブラリリファレンスがあればある程度のことはできる。 塾に通う必要も本も必要ないし、私はそうした。 pythonに限らず、リファレンスには、言語やフレームワークを設計した人達の考えが詰まっているので、目次だけでも見たほうがよい。 また、WEB サーバを作りたいのであれば、django をおすすめする。こちらにもチュートリアルがある。 チュートリアルを試してみた後は(途中でやめてもいいと思うが)何でもよいから、テーマを決めて、小さなアプリを作ってみればよいと思う。日々めんどうだな、と思っていることを python で実行できるようにしてみるなどといったことが良いのではないかと思う。

インストール方法

公式な python をインストールしたい場合は、python.orgからダウンロードしてインストール。 データサイエンス関連の機能が必要な場合は anacondaなどをインストールしても良いと思う。... 続きを読む

一般的な用語と python ドキュメントとの対応表

探しにくいドキュメントについて。

一般的な用語から python ドキュメントを参照したい人向け。

制御構造

その他の制御フローツール(チュートリアル)を一読されたい。
while 文
プログラミングへの第一歩(チュートリアル)
if 文
if 文(チュートリアル)
for 文
for 文(チュートリアル)

データ構造

配列、リスト
配列という概念はなく(必要ないのだろう)、リストを使う。リスト型(チュートリアル)|リスト型(ライブラリリファレンス)
連想配列 / ハッシュ / マップ / 辞書
辞書と呼ぶことが多いか。辞書型(チュートリアル)|マッピング型(ライブラリリファレンス)
その他は、python の組み込み型 も参照。

探しにくい用語

丸括弧 () で囲まれたデータ
タプル。リストのような感じだが、変更できない。ドキュメントによると、「,」がタプルを作るため、丸括弧が必要なわけではない。タプルとシーケンス(チュートリアル) | タプル型(ライブラリリファレンス)
角括弧 [] の中に for が入っているデータ
内包表記(list comprehension)。リストの内包表記(チュートリアル)
配列の一部の切り出し
スライス。共通のシーケンス演算(チュートリアル)
... 続きを読む

pythonで開業

そんなふうにキーワードを認識するなら作ってやるわ、と思い作ったネタのページ。

実は改行したい(したくない)人

print で困っている場合

python3 ライブラリリファレンス print 改行したくなければ、end=”を付ける。 python 2.7 で print statement を使う場合は、通常は改行する。末尾に , を入れると改行しない。
print 'hogehoge'
print 'hogehoge',

ソースコード中で改行したい場合

elementtree の改行で困っている場合

PYTHON ELEMENTTREE 出力で改行

本当に開業したい人

思ったほど開発案件が多くないのでおすすめできない。 python にこだわらず、顧客ニーズに合った言語で対応できなければならない。 システムの応答速度、システムのサイズ(コストにかかわる)、開発・保守要員の調達性、既存開発資産の流用性など。... 続きを読む

さくらのレンタルサーバ(スタンダード)で python3.6 + django2.0 を動かす

さくらのレンタルサーバで、python で書いた web アプリを動かそうとすると、cgi を使うしかない。 django を cgi で動作させるスクリプトがあるのでそれを使ってみた。 シェルを使う必要があるので、スタンダードプラン以上が必要。さくらのレンタルサーバ、しばらくの間、使えるのはWEBサーバだけと誤解していたが、シェルもコンパイラも使えるので、普通にサーバとして使える。(ただし、FreeBSD) wsgi で動かしたほうが速いんだから、さくらインターネット使いたいのなら vps 借りればいいのでは? とは思うが、ちょっとしたことを試すのに、サーバー自体の設定をしなくてよいので。
  • 以下を参考に python3.6 をインストールする。
  • 以下を参考に django 諸々をインストールする。
試用・お申し込みはこちらから。 さくらのレンタルサーバ ビジネス ... 続きを読む

音声をテキストに変換(google speech api)

google の cloud speech api のサンプルを使用。 transcode.py の
language_code='en-US'
language_code='ja-JP'
に変える必要あり。 wav ファイルは、16k 1ch でないと駄目なようなので、(transcode.pyの設定を変えればよさそうだが)
ffmpeg -in infile.wav -ac 1 -ar 16000 outfile.wav
などで変換する。 TBS のニュースを xperia で録音して PC にダウンロードして変換:
Transcript: 大月1日に召集される特別国会で自民党は大島理森前衆院議長再任する方針を固めました
Transcript: 衆院議長が総選挙ごとに交代する寒冷になっていますが天皇陛下の退位を実現する法整備で調整に当たったことなどが消化された他太陽控え衆院議長は皇室会議のメンバーであることなどが考慮されたい年の見通しとなりました大島氏は国会運営に精通していて野党とのパイプがあることなども考慮されたもの
まあまあいい感じかもしれない。 鬼平犯科帳のオープニング: 1st try:
Transcript: いつも世にも悪は
Transcript: その頃67巻クワ型盗賊改方という特別警察を設けていた
Transcript: ダークな床濡れを容赦なく取り締まるために行った時の機動性を与えられたこのすけ盗賊改方のお父さんこそが長谷川ふとんで鬼の映像
2nd try:(flac でエンコードして storage にアップして変換)
Transcript: いつも世にも悪は絶え
Transcript: その頃67巻クワ型盗賊改方という特別警察を送っていいんだと悪魔族の群れを容赦なく取り締まるために僕の希望を与えられたこのすけ盗賊改方のお父さんこそが備わっている人呼んで鬼の平蔵である
3rd try:(1st try と同じ wav)
Transcript: いつも世にも悪は
Transcript: その頃67巻クワ型盗賊改方という特別警察を設けていた
Transcript: ダークな床濡れを容赦なく取り締まるためにドキドキ同性を与えられたこのすけ盗賊改方のお父さんこそが長谷川ふとんで鬼の映像
まあ、人間でもこのくらいの聞き間違いはあるかもしれない。鬼平犯科帳を読書か試聴させ続ければ、認識が強化されるのかもしれない。... 続きを読む

株の自動売買

日経平均株価が何十年かぶりの高値を付けたという景気のいい話を聞いたので(景気の良さは実感できないが・。。。)、pythonで自動売買ができないのか考えてみた。 自分は下手なのと、資金が無いのとで、しばらく遠ざかっていたが、売買の方法だけ考えて、あとは機械に処理させたほうが良いのではないだろうか・・・python でも、そういったシステムを作れるだろうか。 たまたま時間があったので、HetaTraderというプロトタイプを作ってみた。なかなかふざけた名前で気にいっている。そのうち、自分より上手に売買してくれるかもしれない。 entry/exitのトリガーと、entry/exitの実行に分けられるかと思う。

売買のタイミング

株価の取得には、チャートギャラリーというソフトが必要。Yahooファイナンスでも株価は取れるが、過去の値段を取ったりするのはなかなか面倒だ。Excelに取り込めるとあるが、Pythonからもアクセスできた。 チャートギャラリーの Active market データベースだと、検索性が悪いので、sqlite3 に取り込み直す。権利落ち修正値段を見る必要があるので、view で補正している。 sqlite3 への取り込みの時に、52週の高値/安値、20日移動平均値、21日標準偏差を別のテーブルに格納している。python3 では、statistics ライブラリが追加になっていて標準偏差の計算が簡単になっている。 もっと綺麗に実装できるだろうが、機能するか見たいだけなので、お許しを。

売買の実行

ほんと、個人で使える API を用意してほしい・・・ かろうじて使えそうなのは、楽天証券の携帯画面。サポートが続けばいいのだが。 entry は、寄付きか引け、exit は逆指値でいいので、これで十分だ。 まだ未完成だが、ログイン/注文画面への遷移/ログアウト、あたりは確認してみた。

今後

また、追ってレポートしたい。... 続きを読む

python でマージャンの点数計算をしてみる (5)

とりあえず、タンキ、トイツ、コーツ、ジュンツを抽出してみたいと思う。めんどうになってきたので、ソースを貼る。 point_calc.py
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)

data_list.sort()
print(data_list)

# 一個だけ
def fetch_tanki(data_list):
    return [data_list[0], data_list[1:]]

# 対の牌
def fetch_toitsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    toitsu = []

    pai = data_list.pop(0) # 先頭の要素を取り出す
    toitsu.append(pai)

    # 同じ牌がなければ None を返す
    if pai not in data_list:
        return None

    data_list.remove(pai)
    toitsu.append(pai)

    return [toitsu, data_list]

# 同じ牌3個
def fetch_kotsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    kotsu = []

    pai = data_list.pop(0) # 先頭の要素を取り出す
    kotsu.append(pai) # kotsu = [pai]

    for i in range(2): # 2回ループ
        # 同じ牌がなければ None を返す
        if pai not in data_list:
            return None

        data_list.remove(pai)
        kotsu.append(pai)

    return [kotsu, data_list]

# 同種で数字が3個並ぶ
def fetch_juntsu(data_list):
    # 牌がなければ None を返す
    if len(data_list) == 0:
        return None

    juntsu = []

    pai = data_list.pop(0)
    juntsu.append(pai) # juntsu = [pai]

    for i in range(2):
        pai = next_pai(pai) # pai の数字を 1 増やした牌を返す
                            # 数字が1-9でなければ None
                            # 字牌は None とする
        if pai is None:
            return None

        if pai not in data_list:
            return None

        data_list.remove(pai)
        juntsu.append(pai)

    return [juntsu, data_list]

# pai は 種類+数字
# 字牌の時は種類のみ
def next_pai(pai):
    # 1文字だけの時は None
    if len(pai) != 2:
        return None

    num = int(pai[-1]) # 末尾の数字(文字)を数値に変換
    num += 1
    if num <= 1 or num >= 10: # num が 1 になる時は'萬0'などを入力した場合。
                              # 一応チェック。
        return None

    return pai[0]+str(num)



# deepcopy でないと data_list が書き換わる
import copy
print(fetch_tanki(copy.deepcopy(data_list)))
print(fetch_toitsu(copy.deepcopy(data_list)))
print(fetch_kotsu(copy.deepcopy(data_list)))

# ジュンツテスト用
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)

print(fetch_juntsu(copy.deepcopy(data_list)))
実行結果
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
['筒1', '筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
['筒1', ['筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
[['筒1', '筒1'], ['筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
[['筒1', '筒1', '筒1'], ['索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']]
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
[['萬3', '萬4', '萬5'], ['萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']]
実行結果、本来は見やすいようにすべきだろう。 タンキ、トイツ、コーツ、ジュンツのリストの後ろに、残り牌のリストを出力している。 残り牌を同じように解析すれば、牌の組み合わせを表示できるのではなかろうかと思う。 ただ、このコードの不満なところは、牌の先頭からしか切り出せないことだ。 普通はもっと考えて作るかもしれないが、私の作り方は、おおむねこのような感じだ。 また時間をみて続けたい。... 続きを読む

python でマージャンの点数計算をしてみる (4)

牌を切り出すのに少し試行錯誤してみたいと思う。 実行後、IDLE の画面に次のように表示されていると思う。
>>>
python を起動した時にも表示される。ここで、python の文を入力することができる。変数を表示させたい時は、そのまま変数名を入力すればよい。 牌を並べかえておこう。
>>> data_list.sort()
>>> data_list
['筒1', '筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
並べ替えは辞書順になるので、萬を最初に、字を最後にするような並べ替えについては後で考えたいと思う。 リストの先頭にある牌を取得
>>> pai=data_list[0]
>>> pai
'筒1'
リストの先頭にある牌を除いたリストを取得。
>>> rest=data_list[1:]
>>> rest
['筒1', '筒1', '索3', '索3', '索6', '索7', '索8', '萬3', '萬4', '萬5', '萬5', '萬6', '萬7']
[1:] のような書き方ができるのは便利だと思う。マイナス値を指定すると文字列の末尾からカウントする。これも便利。 牌の種類と数字を取得
>>> pai[0]
'筒'
>>> pai[1]
'1'
やはり、数字は文字列の1でなく、int の 1 がよかろうか。
>>> int(pai[1])
1
しかし、東南西北白發中だとどうなるだろうか。
>>> jihai='東'
>>> jihai[0]
'東'
>>> jihai[1]
Traceback (most recent call last):
  File "<pyshell#66>", line 1, in <module>
    jihai[1]
IndexError: string index out of range
>>> 
これは後で考えることにしよう。 筒1筒1、筒1筒1筒1、筒1筒2筒3のパターンを探す必要がありそうだ。 つづく それにしても、python のリストは便利すぎる。
[1,2,3,'test','test',True]
のように何でも入る。C言語などで苦労した者が見ると、何これと思うだろう。... 続きを読む

python でマージャンの点数計算をしてみる (3) — 準備

wikipedia にある、門前清自摸和をやってみたいと思う。 windows に python 3.6 をインストールして  IDLE を起動してみよう。 mac なら、何かテキストエディタでファイルを作り、 python3 ファイル のようにして実行する。 まず、wikipediaや麻雀雑誌にある牌の並びをリスト化したい。 しかし、リスト入力は、””を付ける必要がありめんどうなため、 萬3萬4萬5萬5萬6萬7筒1筒1筒1索3索3索6索8索7 という文字列をリストにすることを考えたい。 リスト化の都合上、牌の間は空白で区切ることとする。 少しずつやっていこう。 IDLE から、New -> File して以下のように入力する。
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)
File->Save As で mahjong とでもいうフォルダを作り、point_calc.py とでも名前をつけて保存しよう。 Run->Run Module でプログラムを実行してみる。
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
>>> 
のように表示された。何か楽しそうだ。 リストに変換してみよう。先程のファイルの末尾に2行追加する。
data = "萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7"
print(data)

data_list = data.split(' ')
print(data_list)
Run Module してみよう。
萬3 萬4 萬5 萬5 萬6 萬7 筒1 筒1 筒1 索3 索3 索6 索8 索7
['萬3', '萬4', '萬5', '萬5', '萬6', '萬7', '筒1', '筒1', '筒1', '索3', '索3', '索6', '索8', '索7']
のように文字列がリストになっているものが表示される。 すぐに実行でき、何でも print できるのは python の良いところだと思う。 つづく... 続きを読む

python でマージャンの点数計算をしてみる (2)

なぜ、マージャンの点数計算を題材として選んだか・・・ややこしいからだ。ここでは、python だが、好きな言語を使って考えてみればよいと思う。 マージャンの戦略を考えたり、プログラム同士を戦わせたり、など色々よくばりたいとは思いつつも、今回は、python 普及が目的なので、マージャンの点数計算に絞りたいと思う。目的/目標を明確にすることは重要だと思う。そうでないと、終わりが見えない。 マージャンを知らない人が読むと素通りされそうなので、ルール等をおおざっぱに説明しておく。 4人で行うゲームで、マンズ1-9(1萬-9萬)/ピンズ1-9(1筒-9筒)/ソーズ1-9(1索-9索)/東南西北白發中それぞれ4枚ずつの牌を使う。 牌が13枚配られ、毎回1枚ずつ引く(ツモ)か、他の人が捨てた牌をもらって(チー/ポン/カン)いき、役が完成したら上がって点がもらえる。   点数の計算方法は、基本的には、wikipedia の計算式や、のとおりだ。 おおむね役で決まる(それに応じて符は自動的に決まるので)のだが、例えば、「1萬1萬1萬2萬2萬2萬3萬3萬3萬」は、「1萬2萬3萬/1萬2萬3萬/1萬2萬3萬」とも「1萬1萬1萬/2萬2萬2萬/3萬3萬3萬」とも解釈できるため複雑そうだ。役も沢山あるので、組み合わせも多そうだ。記事を書き出してみたものの、いつ完成するのか・・・   順番に並べかえたり、牌の種別を調べたりすることが必要そうに思えるが、まずは、牌のデータの持ち方を決めることにしたい。 萬筒索字牌の種類で並びかえ、数字の小さいものから順に並べることが多いので、萬1、萬2、東、南、西などの文字列でデータを表してみることにしたい。そのほうが print できるし便利だろう。 さて、ポン、チー、カン(明槓-他人の捨てた牌で4枚の組にする、暗槓-自分がツモった牌で4枚の組にする)、など、役数にも影響するので、これらも識別する必要がありそうだ。 とりあえず、データの持ち方は、リストにして、 [“萬1”, “萬2”, …., 同種で順に並んだ3個の牌の組, 同じ牌3個の牌の組, 同じ牌4個の牌の組] とし、「牌の組」には、他からもらったものか(鳴いた)ものかどうか区別できるような構造にしてみようかと思う。 これを、 [[牌の組, 牌の組, 牌の組, 牌の組, 牌の組], [牌の組, 牌の組, 牌の組, 牌の組, 牌の組],…] に変形するか、 [牌, 牌, …] に展開するか して、役に一致するかを判定すればよいのではなかろうか。   つづく・・・かな?w  ... 続きを読む

python でマージャンの点数計算をしてみる (1)

python で何ができるのか、また、ソフトはどのようにして作るのか、その一例として、マージャンの点数計算でもしてみようと思う。 中学生の頃、ベーシックマガジンか、月刊マイコンか、Oh!MZ か忘れたが、マージャンって面白そう、と思い、その頃は雑誌に印刷された BASIC のソースコードをポチポチ入力して遊んだ記憶がある。 だが、BASIC なので、よし、ロン、と思っても、タイプミスしていて、その度にデバッグしていた楽しい思い出がある。 python でもタイプミスしていると、Exception が発生して、その度に当時を思い出す。 なんとなく、自分のバックグラウンドのような気がするので、それを python で再現してみようと思う。 つづく・・・といいんだが      ... 続きを読む

Pythonでできること

python を学ぶべきなのか考えている人のために、私が python を使っている理由と python でできることの具体例について書いてみた。 [toc]

なぜ Python を使うことにしたのか

セキュリティ

私が、とあるセキュリティ企業(残念ながら解散しましたが)で研究開発を行っている時、TCP/UDP(IPv4/v6) のフレームに細工をしてネットワークに送信するテストが必要でC言語や perl を使って作っていました。 結構めんどうで何か良いツールが無いかと思い探していたのですが、scapyという python で書かれたパケット操作ツールがあると知りました。このツールが perl を捨てて python にしよう!と思ったきっかけでした。 scapyはレイヤ(IPヘッダ、TCPヘッダ、ペイロードなど)ごとにデータを加工したり、組み立て直して送信したりもできたので、非常に便利でした。もちろん、ファイルにも出力することができるので、LSI設計用のテストデータを作ったりするのにも使いました。 (冷や汗もんでしたが、何とかチップは完成して、動作はしました。商品化には至りませんでしたが。) とにかく、リスト操作が非常に簡単、ライブラリが豊富、実行が簡単などといった特徴があったので、C や perl から乗り換えました。

WEB アプリケーション

同時に、ユーザにサービス提供用のWEBサイトやWEBインタフェースをPerlやPHPで作っていたのですが、かなり面倒で、セキュアかつ短納期で作れるものだろうか。。。と議論していました。参考までに、どのようなセキュリティ対策が必要か、ということに関しては、IPAの安全なWEBサイトの作り方が参考になります。 クロスサイトスクリプティング対策、csrf対策、SQL injection対策など、pythonを使った物で調べていたのですが、djangoという WEB アプリケーションフレームワークが良いのではないかと先ほどのセキュリティ企業の創業者は言っていました。 使ってみたのですが、非常に洗練されています。セキュリティ、ORM(Object Relation Mapper)、テンプレートがよく考えられています。 django のセキュリティ機能については security in django をご覧ください。この章を読むだけでも、セキュリティの勉強になります。 django については、別途書こうと思います。

Pythonでできること

自分が使う順に挙げてみます。

コマンド出力結果やログなどの抽出、整形

文字列のパターンマッチングが強力なのでテキスト処理によく使っています。ある文字列のこのパターンの部分だけ取り出して、DB化、もしくは、一覧出力したい、などといったことがある場合に使っています。
  • web サーバーのログの、ある特定の IP アドレスにマッチしたものの referer だけを取り出したい
  • あるパターンのファイル名を持ったファイルを、別のサーバーにコピーしたい など

CSV ファイルの処理 (例えば DB への登録)

CSV 形式のファイルを DB 化して検索したい、また、逆に、CSV 化したいといったことは良くあるのではないでしょうか。 CSV ライブラリは標準で付属しています。

excel ファイルの操作

openpyxlを使って excel ファイルから読んだり書いたりできます。 別の記事もご参考に

DBアクセス

DB は、簡単なものならば、標準ライブラリ sqlite3でも良いでしょう。 mysql へのアクセスは Connector/python、Postgres へのアクセスは psycopg などがあります。

Network のテストやセキュリティの調査に

scapy は、レイヤ(IPヘッダ、TCPヘッダ、ペイロードなど)ごとにデータを加工したり、組み立て直して送信したりできるので、非常に便利です。私が python を使おうと思ったきっかけです。 セキュリティの専門家は、canvasを使うかもしれませんが、これは python で作られていて、拡張も python でできたと記憶しています。

対話型ツールの自動化 – pexpect

私は、例えば、常時 ssh 接続しておきたい場合がありますが、よく切れるので再接続させたい、といったケースに使っています。接続する時にパスフレーズを入力させ、切断されたら、再度接続する、といったことに使っています。(常時 ssh でポートフォワードさせるため。)

ドキュメント作成

ファイルは reStructureというマークアップ(マークダウン?)方式で簡単に作成できます。 reStructure形式の良いところは、可読性。そのままのテキストでも読めるし、sphinxなどのプログラムにかければ綺麗にフォーマッティングされ、HTML、PDF、man、epubなどの形式で出力することができます。(PDF出力するにはインストールが難しそう?) 生成したhtmlファイルをWEBサーバに転送すればWEBサイトになります。(WordPress を使うほうが簡単ですが・・・)

WEB アプリケーション構築

WEB フレームワーク djangoを使って WEB サーバを構築することができます。 元々ニュースサイトを簡単に構築するために作られた web application framework。 url のパターンと、そのパターンにマッチした場合に呼び出される python の関数を記述する形で書くことができます。 python で書いたクラスが db と対応づくように考えられていて、クラスのメソッドを呼び出すと db アクセスに自動的に変換されます。sql を書く必要はなく、クラスを書くだけでよい。sql の知識は必要だとは思いますが。 表示は、テンプレート経由で表示されて、そのテンプレートには、python の変数が対応づきます。(当然エスケープされて出力されます。) その他、主要なセキュリティ対策が内蔵されていて、学習まで若干時間がかかる印象ですが、とてもよいものだと思います。

WEB からの情報収集

requestsbeautifulsoup を使って公開している web サイト上のデータを DB 化するなど。いわゆるスクレイピング。 株価、競馬、ロトなどの研究(?)に使えるかも?

Windows デスクトップアプリケーション

Python で書いたアプリケーションは、py2exeで exe ファイルにすることができます。私は、Python 2.7 でしか使ったことがありませんが、Python 3.3 以降でも使えるようです。

科学技術計算、データサイエンス(機械学習他)

  • num.py
  • scipy などが古くから使われています。
Top 15 Python Libraries for Data Science in 2017

Python でできることの具体例

Python の学習法

Python の本を買って勉強するのも良いと思いますが、 Python にはすばらしいチュートリアル があります。 今でも電卓として使っています。 Windowsならば、PythonのWEBサイト からpythonをダウンロードしてインストールしてスタートメニューから起動、mac/linux ならば、通常インストール済みなので、コマンドラインからpythonと打てば実行できます。

Python のわかりにくかったところ

プログラミング言語を何か触ったことがあれば、Python を使うのは難しくはないと思いますが、あまり馴染のない部分があります。

リストと辞書

C や java など普通は配列があるのですが、python を使い始めた時、どう扱えばいいのか戸惑いました。 配列のような順番に格納するものはリストを、連想配列、ハッシュ、マップなどと言われるタイプのキーワードと値が対応づくものは辞書でデータを保持します。

ループ

範囲を表す range は他のプログラミング言語とは少し違いがあるかもしれません。
for i in range(10):
print(i)
range(10) の結果は、
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
です。 また、リストの要素を順番に処理するのも簡単にできます。
for l in 何かのリスト:
print(l)

内包表現

括弧[] の中に for で書くリスト、そもそも、それを何と呼ぶのか覚えられず、ドキュメントを探すのが非常に大変でした。内包表現(list comprehension)です。
[i*2 for i in range(10)]
のようなものです。

その他

標準ライブラリだけでもかなりの数があるので、探せるようになるまで結構大変でした。 ですが、ライブラリリファレンスがわかりやすく分類されています。 その他のライブラリをインストールするのは、pip コマンドで簡単にインストールできます。

Python は商売になるのか?

私は、親会社が一部上場企業であるとある会社から受託しているのですが、元々はその会社からは、Python がらみで取引することにはなったのですが、今は Python に関する問い合わせはありません。 Python プログラマーの年収云々の記事がありますが、それはそれで調査に基くもので正しいかもしれませんが、全体のパイが大きいのかどうかには疑問があります。ですので鵜呑みにしないように。私の周辺では、php(+javascript)、java(+javascript)、.net、また、関西だからかもしれませんが、組み込み(アセンブラ+C) の案件が多いように思います。 そうは言っても、自分の仕事の効率化のために Python は欠かせないものです。開発時には、データベースや CSV の変換に使ったり、テスト用の WEB サーバを構築しています。また、サーバーの運用のため、AWS で稼動している ec2 インスタンスや WEB アプリケーションを監視するためのスクリプトを提案しています。 応用範囲が広く、Google や Amazon の API にも比較的簡単にアクセスできるので触ってみて損は無いと思います。... 続きを読む

python で loto6 の番号照会

ついでに、loto6 が当っているかどうかを調べてみましょう。

4, 11, 23, 27, 35, 42 が当たりで、

買ったくじが
8, 11, 22, 27, 30, 38

だった場合。

ベタな方法:
>>> count = 0
>>> atari = [4,11,23,27,35,42]
>>> for i in [8,11,22,27,30,38]:
…     if i in atari:
…         count += 1

>>> count
2

set (集合)を使う方法:
>>> set([8,11,22,27,30,38]) & set([4,11,23,27,35,42])
set([27, 11])
>>> len(_)
2

len のリターン値が
6 なら、1等、
5 なら、3等、
4 なら、4等
3 なら、5等
ということになります。
(2等は、ボーナス数字を set に追加して and すればよいです。)

コンパイルなしでできるので、手軽です。

... 続きを読む

excel の帳票を台帳にする

一件一様の excel でできた帳票を台帳にするという作業が結構あると思います。
今回は、xls ファイルを csv 形式で出力してみたいと思います。
カレントディレクトリの *-数字4桁.xls から、sample_report.csv へ出力します。

適当に改変して使ってみてください。

generate_report.py

#!/usr/bin/python3
# encoding: utf-8
import xlrd
import glob
import datetime
import csv
import sys
import re

# 数字なら datetime 型の変数にして返す
# 数字でなければ、そのまま返す
def exceldate(v):
    if isinstance(v, int):
        return datetime.date(1899,12,31) + datetime.timedelta(days=v)
    else:
        return v

# rev. を取り除く
def norev(v):
    return re.sub(r’rev.’, ”, v)

def main():
    # ファイルをオープン
    with open(‘sample_report.csv’, ‘w’, newline=”) as csvfile:
        writer = csv.writer(csvfile) # csv として書き出すため writer を作る

        # カレントディレクトリにある末尾が – 数字4桁.xls のファイルを
        # 一覧にする
        files = glob.glob(‘*-[0-9][0-9][0-9][0-9].xls’)
        for f in files:
            wb = xlrd.open_workbook(filename=f) # ワークブック
            ws = wb.sheet_by_name(‘帳票’) # ワークブックの ‘帳票’ というシート

            # csv として出力
            writer.writerow(
                    [int(ws.cell_value(0,0)),
                    ws.cell_value(0,1),
                    exceldate(ws.cell_value(0,2)),
                    norev(ws.cell_value(0,3))])

if __name__ == “__main__”:
    main()


xlsx 形式のファイルの場合は、openpyxl というライブラリがあります。
https://openpyxl.readthedocs.org/en/2.3.3/#sample-code
などをご参考に。

... 続きを読む

python でロト6の最新当選番号を取得してみる

WEBページの表示方法が変わっていて、以下の方法では取得できなくなっていました。 くじ、ロト6などの結果を取得する方法をごらんください。そのままCSVで取れそうです。(GIST)
python では、文字列処理が簡単にでき、インターネット上のデータへのアクセスも簡単にできます。 そこで、python でロト6の最新の当選番号を取ってみたいと思います。 ライブラリリファレンスの urllib のあたりを見てみると、Requests モジュールというのがおすすめなようなので、まず、このモジュールをインストールしておきます。(pip をインストールしておく必要があります。)
pip install requests さて、みずほ銀行のホームページからデータを取ってみます。
>> import requests >>  r= requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’) >> r <Response [200]>
取れたようです。
>> print(r.text)
文字化けしているようです。
>> r.encoding ‘ISO-8859-1’
クイックスタートを見ると、encodingsを変えればよさそうです。
>> r.encoding=’utf-8′ >> print(r.text)
文字化けせず表示されるようになりました。 html が返ってきています。 <table class=”typeTK”> : <!–end .typeTK–></table><table> の部分に格納されているので、ここを取り出せばよいですね。 python の標準ライブラリを使って頑張ってもいいのですが、めんどうなので、BeautifulSoup というライブラリを使います。 quit() で一旦抜けて、pip install beautifulsoup4 を実行します。 もう一度、python を起動します。
>> import requests >> r=requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’) >> r.encoding=’utf-8′
をもう一度打ちなおします。
>>> import bs4
>>> s = bs4.BeautifulSoup(r.text)
とします。
>>> s.title
<title>u307fu305au307bu9280u884c u5b9du304fu3058u30b3u30fcu30cau30fcuff1au30edu30c86xa0u6700u65b0u56deu53f7</title>
>>> print(s.title)
<title>みずほ銀行 宝くじコーナー:ロト6&nbsp;最新回号</title>
とか、
>>> s.find_all(‘table’)
[<table class=”typeTK”>
:
</table>]
>>> t=_
>>> len(t)
3
>>> t[0]
<table class=”typeTK”>
:
</table>
といったことができます。
あまりに簡単すぎて笑ってしまいます。
今回は、3回分掲載されているので、len(t)には3が返ってきました。
>>> len(t[0].find_all(‘tr’))
11
確かに表には 11 行あります。
先頭行は取れているでしょうか。
>>> t[0].find_all(‘tr’)[0]
<tr>n<th class=”center wide33p”>u56deu5225</th>n<th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>n</tr>
th 要素だけでできているようなので、
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)
[<th class=”center wide33p”>u56deu5225</th>, <th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>]
>>> len(t[0].find_all(‘tr’)[0].find_all(‘th’))
2
確かに 2 列あります。
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)[1]
<th class=”center bgf7f7f7″ colspan=”6″>u7b2c1052u56de</th>
>>> t[0].find_all(‘tr’)[0].find_all(‘th’)[1].text
u’u7b2c1052u56de’
>>> print(t[0].find_all(‘tr’)[0].find_all(‘th’)[1].text)
第1052回
第1052回というのが取れています。
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)[0]
<td class=”center extension”><strong>06</strong></td>
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)[0].text
u’06’
(先頭の u は unicode 文字列を意味しています。version 2.7系で実行しているので。)
本数字のほうはどうでしょう?一つ目の表の3行目に、td タグで書かれているようなので、
>>> t[0].find_all(‘tr’)[2].find_all(‘td’)
[<td class=”center extension”><strong>06</strong></td>, <td class=”center extension”><strong>26</strong></td>, <td class=”center extension”><strong>34</strong></td>, <td class=”center extension”><strong>37</strong></td>, <td class=”center extension”><strong>42</strong></td>, <td class=”center extension”><strong>43</strong></td>]
>>> len(_)
6
6個取れました。
全部表示してみましょう。
>>> for i in t[0].find_all(‘tr’)[2].find_all(‘td’):
…     print(i)
<td class=”center extension”><strong>06</strong></td>
<td class=”center extension”><strong>26</strong></td>
<td class=”center extension”><strong>34</strong></td>
<td class=”center extension”><strong>37</strong></td>
<td class=”center extension”><strong>42</strong></td>
<td class=”center extension”><strong>43</strong></td>
タグが邪魔なので、
>>> for i in t[0].find_all(‘tr’)[2].find_all(‘td’):
…     print(i.text)
06
26
34
37
42
43
リストにして持っておくと、後々便利かもしれません。
>>> [i.text for i in t[0].find_all(‘tr’)[2].find_all(‘td’)]
[u’06’, u’26’, u’34’, u’37’, u’42’, u’43’]
文字列でなく、数字のリストで持つ場合、
>>> [int(i.text) for i in t[0].find_all(‘tr’)[2].find_all(‘td’)]
[6, 26, 34, 37, 42, 43]
後はこのリストと、申しこんだ番号を比較すればよいですね。
これについては、また、次回にでも。
loto6_latest.py
import requests import bs4 r= requests.get(‘http://www.mizuhobank.co.jp/takarakuji/loto/loto6/index.html’) s = bs4.BeautifulSoup(r.text, “lxml”) t = s.find_all(‘table’) l = [int(i.text) for i in t[0].find_all(‘tr’)[2].find_all(‘td’)] print(l)
※ 私の環境では、実行すると、warning が出るので以下のようにしています。 s = bs4.BeautifulSoup(r.text, “lxml”)... 続きを読む

python でロト6の番号を選ぶ

python で何ができるのか、という疑問が多いようなので、今回は、python でロト 6 の番号を選んでみようと思います。(まあ、クイックピックを選べばいいのですが。)

ロト6のルールは以下のとおりで、1-43の数字から異なる6個の数字を選びます。
http://www.mizuhobank.co.jp/takarakuji/suji/loto6/index.html

使い方を学ぶため、対話型でやってみましょう。
まず、python を起動してください。

Python 2.7.2 (default, Oct 11 2012, 20:14:37)
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>>

のようになりますね。(ちょっとバージョン古いですが)

ライブラリリファレンスを眺めて、random というモジュールがあるので、それを使えばよさそうです。

おおまかな流れとしては、1-43 のリストを作って、ramdom.sample という関数で選べそうです。

>>> range(43)
[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, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42]
となりますね。0 から 43 – 1 のリストが返ります。
それぞれ、1ずつ足したいので、
>>> [i + 1 for i in range(43)]
[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, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43]
とすればよさそうです。

さて、6個の数字を選んでみましょう。
>>> random.sample([i + 1 for i in range(43)], 6)
[42, 27, 36, 31, 7, 21]

これだとマークシートに書く時にめんどうなので並べかえます。

>>> l2 = _
で一旦別のリストに入れておきます。対話型の時は、_ に直前の結果が入っていて便利です。
>>> l2
[22, 3, 32, 39, 4, 43]

並べかえます。
>>> l2.sort()
>>> l2
[3, 4, 22, 32, 39, 43]
>>> print(l2)
[3, 4, 22, 32, 39, 43]

これを毎回やるのは面倒なので、スクリプトにしましょう。
メモ帳でも vim でも何でも良いので、以下のようなファイルを作ります。

# coding: utf-8
# ロト6 あたりますように
import random

numbers = [ i + 1 for i in range(43)]
luckey_numbers = random.sample(numbers, 6)
luckey_numbers.sort()
print(luckey_numbers)

これを loto6.py として保存します。

python loto6.py

楽しくないですか?

私が python がいいなと思う理由は、この対話型の機能です。
ライブラリの使い方を試してみるのにとても便利だと思います。

次回は、これを WEB アプリにしてみようかなと思います。

# ですが、別に、python にこだわる必要はありません。
# 何か言語を習得しようと思ったら、とにかく、その言語で書いてみるというのが大切かなと思います。
# 一つ完璧にマスターすれば、他の言語も似たようなものですよね。

... 続きを読む

django 1.5 release

日本で django を使っている方がどのくらいおられるかわかりませんが,
2013/2/26 に django 1.5 がリリースされていました。
https://docs.djangoproject.com/en/1.5/releases/1.5/

主要なアップデートは,

  1. configurable User model
  2. python 3 のサポート
  3. new style url タグへの移行

とのこと。

1
詳しくは見ていませんが,組み込みの User モデルをカスタマイズできそうです。
ユーザ名の長さ制限を変えたり,first name / last name 以外のユーザ名を使うといったことが
できるようになります。その他,誕生日を追加するといったことが例として載っています。

2
python 3 をサポートした最初のリリース。

3
{% url myview %} -> {% url “myview” %}


その他機能追加(What’s new in Django 1.5),機能削除(Features deprecated in 1.5)があるようなので,上記,release note をご確認ください。

... 続きを読む

python sqlite3 列名でアクセス

今さら,という気がしなくもないですし,
sqlite3 のライブラリリファレンス書いていることではありますが,

conn = sqlite3.connect(ほげほげ)
の後で
conn.row_factory = sqlite3.Row
としておいてやれば,fetchone の結果などに対して,
ret[‘列名’]
などとしてアクセスできるようになるみたいですね。


... 続きを読む

django で動くフリーなオークションシステム

little-ebay というのを django 1.4 で動くようにしてみました。
https://github.com/moriya9n/little-ebay

決済まわりはステータスの変更っぽいことができるだけで何も実装されてなさそうですね。
シンプルなように思えるので,お好に応じてカスタマイズできるかもしれません。
(というか,カスタマイズしようと思っています。)

... 続きを読む

django 1.4 で少し変わったなと思う点


それほど django を使いこなせてはいませんが。。。細かいところが使いやすくなったように思います。おおっ,と思った順に。

  django-admin.py startproject <mysite> で作られるファイル

wsgi.py が生成されるようになった。
<mysite> ディレクトリの下に <mysite> ディレクトリができてここに,urls.py, settings.py, wsgi.py が書き出されます。(wsgi 使用時の apache 設定など,ドキュメントが少し親切になっているような?)

wsgi の設定をする時に,sys.path に append して。。。といったことが必要なくなっているのではないでしょうか。


タイムゾーンの扱い

DateTimeFields など,日付と時刻に関するものが,タイムゾーン付きで返ってくるようになった。(タイムゾーンを考慮していない部分にはウォーニングが出ていました。ソフトを修正していなくてもそれなりに動く?)



以下参照:
https://docs.djangoproject.com/en/1.4/releases/1.4/#what-s-new-in-django-1-4

... 続きを読む

pywin32 の日本語の扱い


デスクトップにショートカットを作ろうと思い winshell であれこれ試していたのですが,どうも,python 2.x 系だと文字列の問題があるように思います。例えば,ショートカットが指す先を読みだすと,mbcs の文字列が返ってきます。


ソースを追ってみたところ,windows 用の拡張モジュール pywin32 (http://sourceforge.net/projects/pywin32/) の win32com が呼び出され,このモジュールは,2.x 系用には UNICODE が定義されないでコンパイルされてそうな。。。3.x 系では UNICODE が定義されてコンパイルされるようですね。

まあ,既知のことかもしれませんが。

というわけで,これを機に python 3.2 あたりに移行しようかと思ってしまいました。... 続きを読む

amazon s3 と google cloud storage

クラウドにデータをバックアップしようと思い,s3 を使おうとしていたのですが,どうも今ひとつです。FreeBSD (8.2を使ってます) で s3fs を使って s3 のバケットをマウントして,例えば,dump コマンドでダンプしようとすると,カーネルがパニックってしまうような。。。 今日,少し謎が解けたような気がしました。 boto という python のライブラリを使って,以下のようなことをしていました。 import boto from boto.s3.connection import S3Connection
conn = S3Connection(‘access_key’, ‘secret_key’)
bucket = conn.create_bucket(‘bucket_name’)
from boto.s3.key import Key k = Key(bucket)
k.key = ‘key_name’
k.set_contents_from_filename(‘filename’)
set_contents_from_なんちゃらという関数がいくつかあります。set_contents_from_stream なんかを使えば,標準入力から s3 に書けるのかな,と思い試してみたところ,どうも,サポートされていなさそうなエラーメッセージが。 あらかじめサイズの決まっているファイルしか置けないように思えました。想像ですが,巨大なファイルを置こうとすると,メモリか,テンポラリーファイルに置かざるを得ないので,処理しきれないのかもしれません。 で,以下が本題かもしれません。 set_contents_from_stream が使えそうなサービスは何だろうと思い,検索してみると,google cloud storage なんかは対応しているのかもしれません。google のドキュメントを読むのがだるい方,以下ご参考まで。 1. google apis console にアクセス。 services の google cloud storage を on billing を enable にする (checkoutで) 2.  https://developers.google.com/storage/docs/gsutil_install に書いてあるとおりなんですが,
  • gsutil.tar.gz をダウンロード
  • ホームディレクトリに展開 (ホームディレクトリ/gsutil ができる)
  • export PATH=${HOME}:$HOME/gsutil する。(要は PATH に追加する。)
  • gsutil config
  • 認証コード待ちになりますが,その上あたりに URL が表示されているので,ブラウザにコピペして開く。gsutil がほにゃららと表示されるので許可。認証コードが表示されるので,それを認証コードとしてコピペ。
  • project-id? になるので,apis console に行って google cloud storage を表示させ,x-goog-project-id: の右にあるコードをコピペ。
あとは, gsutil ls  とか echo ‘hogehoge’ | gsutil cp – gs://mybackup/test.bin だとかして使えます。 boto を使ってプログラムを作ればいいか,と思っていたのですが,コマンドラインを愛用する人々には gsutil のようなツールは便利でしょうね。 パイプが使えるなんて嬉しすぎます。 使いものになるのかどうか,十分試してないんでわかりませんが,後日,失望したブログを書いていたらごめんなさい。... 続きを読む

python で html の要素を操作する簡単なモジュール

html のソースから,a の href の部分や,img の src を取り出したり書き換えたい思ったことはありませんか? python の BeautifulSoup というモジュールを使えばかなり簡単に取り出せます。
ドキュメントはこちらを。http://www.crummy.com/software/BeautifulSoup/

例:
== imgsrc.py ==
import sys
import BeautifulSoup

s = BeautifulSoup.BeautifulSoup(open(sys.argv[1]).read())
imgs = s.findAll(‘img’)
for img in imgs:
print img[‘src’]

$ python imgsrc.py hogehoge.html

... 続きを読む

winshell

http://winshell.readthedocs.org/en/latest/index.html
python で
  • デスクトップやスタートメニューのフォルダーへのアクセスが簡単
  • ショートカットファイルを作ったり変更したりするのが簡単
  •   explorer のコピー機能を呼び出せる
ver 0.4.1 では,ショートカットの修正ができない。
ver 0.4.2 (github にある) は,python setup.py install でインストールすると
__VERSION__ がインポートできずエラー。(しかたないので winshell.py の先頭の __VERSION__ を
コメントアウト)
threading.Thread で実行すると固まってしまうようなので,
target 関数の先頭で win32com.CoInitialize() をしてやらないといけない?

... 続きを読む

django+south migrate 失敗

django で south を使っている時,schemamigration をすると,これまでにないフィールドに値をセットしようとします。>>の後ろにセットしたい値を入れればいいんだと思います。

で,None をセットして,一方では,model のほうで,null = True で無かったのか,migrate 時にエラーになってしまい元に戻せない状態になってしまいました。

とりあえず,該当する object を python manage.py shell で全部削除した後,python manage.py migrate –fake とすると,復活しました。正しい方法かどうかわかりませんが。

python manage.py migrate –list すると,migration の一覧が表示されます。
python manage.py migrate –fake は,実行されていない migration を実行したことにするということなんでしょうかね。

... 続きを読む

django を使ってモデルを変更するが,データベース上のデータをそのまま使うには

WEB アプリケーションを作る時,データベースの列を追加するのに,通常,どうやっているのか私は知りませんが,何か良いツールなりフレームワークなりがあるのでしょうか。django を使って model を変更する場合には,south というのが便利と思いました。私は,django を使い始めた時からずっと使っています。

http://south.aeracode.org/ です。

INSTALLED_APPS に ‘south’, を追加して,python manage.py syncdb した後,
初回:
python manage.py schemamigration appname –initial
python manage.py migrate appname –fake (syncdb をした時に models を既に作っている場合はエラーになるので –fake を付ける?)

次回以降:

python manage.py schemamigration appname –auto
python manage.py migrate appname

みたいな感じだったと思います。( いまひとつ schemamigration や migrate のオプションの使い方を理解してませんが。)大きな修正は schemamigration できないかもしれないし,migrate できず困ってしまう場合がありますが。

... 続きを読む

google app engine で django を使いたい!

python で WEB のアプリケーションを作るには,セキュリティの確保なども考えると,私は,django を使うのが良いという結論に至りました。私の周囲の方々は,賛成してくれませんが。。。(まあ,好みもありますし,ajax を多用するようなシステムにはマッチしないかもしれません。)

https://www.djangoproject.com/

です。何が便利かというと,使ってみた感じでは,

  • データベースとのやりとりが python ぽく書ける
  • データベースの管理ツール(データの編集,削除などができます)の自動生成
  • テンプレートを使ってデザインとロジックを分けることができる
  • フォームを作る時にデータベース定義(モデル)から生成できる
  • クロスサイトスクリプト,CSRF などへの対策が考えられている
  • メール送信 API が簡単になっている
  • ファイル関連の API がディレクトリトラバーサルを考慮して作らている
  • ドキュメントが充実している

などなど。

google app engine でも django (python) を使いたいと思いましたが,
http://www.allbuttonspressed.com/projects/djangoappengine
を使うのが良いのではないでしょうか。ただ,メインのメンバーが起業するか何かで抜けてしまったようで,今後の更新はどうなるのかわかりませんが,使いやすいように思うので,更新は続くのでしょう。(と期待していますが。)

google のデータベース API は直接使えない感じですが,django に慣れている人には逆に便利かも。

ファイルを持ってきてコピーするのが面倒だったりすると思うので,まとめてみました。以下をお使いくださいませ。
http://sites.google.com/site/kizamiudn/home/djangogae.template.zip

... 続きを読む

python で書かれた CMS (content management system)

WEB フレームワーク別に

  1. Zope
    • Plone
      • 単体で WEB サーバとして動作。
      • インストール後,すぐに使える。
  2. Django
    • merengue
      • django と同様にしてサイトの設定を作成。
      • 起動すれば,すぐに使える。(レイアウト・コンテンツの編集が可能)
    • django-cms
      • django と同様にしてサイトの設定を作成。
      • 起動すれば,すぐに使える。(レイアウトの変更や,ポータルメニューの配置方法がいまひとつわからず。)
    • pinax
      • django と同様にしてサイトの設定を作成。
      • テンプレートの記述が必要?
  3. Pyramid (Pylons)
    使いやすそうなのが見つからず。
... 続きを読む

tkinter のドキュメント

http://wiki.python.org/moin/TkInter にも書いてありますが,


http://www.pythonware.com/library/tkinter/introduction/
がよくまとまっていると思いました。例も豊富でわかりやすいです。
(英語を読むのが苦でなければ)... 続きを読む