Python mini Hack-a-thonに参加してきました。
昼食時にPyConJPの寺田さんや世界の小宮さんの話を聴けるなど、
非常に楽しい一日になりました。
で、重要なHack-a-thonで何をやっていたかというと、
まずPython ORMの調査
これはstormというORMを使ってみるというところで進めていました。
とあるRDBで使いたいのだけれどそのRDBでの利用についての記述が一切ない。
試したかったけど自分のマシンにそのRDBをインストールするのが嫌だったので、
SqlAlchemy、elixir、sqlobjectでサンプルコードを書いてsqliteにデータを入れたり消したりということを試して遊んでました。
昼食後眠くなり、ORMの調査は放棄して、
ProjectEulerの問題解いたり、自分のgae上のwebアプリ直したりしてた。
最後の3時間くらいで成果発表用の何かを作成しようと思って、
akb48のメンバーを検索するモジュールを書いてました。
pyfesでのmoriyoshiさんの発表に感銘を受けたので完全にパクリです。詳細はこちら
moriyoshiさんはperlのacmeの移植だそうなんで、移植のパクリです。お恥ずかしい。
せっかくなんでgithubに上げました。(ドキュメント空です。すんません。後追加します。)
https://github.com/shocking-noise/akb48
実行方法は下記の通り
1.必要なモジュールのインストール(BeautifulSoup、yaml)
2.scraperを実行してyaml生成
3.akb48モジュールをインポートして利用
こだわりポイントは誕生日から今日の年齢を算出するところです。
(ググッてコピペレベルですが)
発表後の指摘として、yamlは邪道だという話があったので、
クラスを生成するコードジェネレータ作るように修正したいです。
(本当のファンなら一字一字コードを打つべきという意見も・・・、別にファンでは無・・・(略))
他の方々の発表は興味深いものが多くで、とても面白かったです。
自分もPyPIにあげられるようなライブラリ作れるようになりたいなぁと思いました。
次回も時間が会えばぜひ参加したいです。
主催者の皆様ありがとうございました。
(追記)
調べたら、moriyoshiさんがpyakb48というモジュールをPyPIにあげていたようです。
中身みたのですが、かなりちゃんとつくられていました(doctestとかもある)。
私のは超劣化コピーですね。勉強して出なおしてきます。
2011年10月23日日曜日
2011年8月24日水曜日
Pythonで演算子オーバーロード
今更ながらPythonの演算子オーバーロード について調べたのでメモ。
クラスのメソッドを作成するだけなので 簡単にできますね。
普段はJavaで書いているから演算子オーバーロードが頭にないなー。
使ってるライブラリでも演算子オーバーロード見たことない気がする。
(知らないだけか?)
効果的に使えるようになりたいですね。
クラスのメソッドを作成するだけなので 簡単にできますね。
class OverLoadTest(object):
def __init__(self, a):
self.a = a
# +
def __add__(self, b):
self.a = self.a + b
# -
def __sub__(self, b):
self.a = self.a - b
# /
def __div__(self, b):
self.a = self.a / b
# *
def __mul__(self, b):
self.a = self.a * b
def __repr__(self):
return str(self.a)
if __name__ == "__main__":
o = OverLoadTest(5)
print o
o + 5
print o
o - 5
print o
o / 5
print o
普段はJavaで書いているから演算子オーバーロードが頭にないなー。
使ってるライブラリでも演算子オーバーロード見たことない気がする。
(知らないだけか?)
効果的に使えるようになりたいですね。
2011年8月7日日曜日
FlaskでStreaming
久々にFlaskドキュメントページ見てたら、
Streamingのsnipetが掲載されてました。
(もしかして結構前から?)
Werkzeugには0.5から機能としてはあるみたいなんで、
きっと昔からできたんでしょう。
なかなか使い道ないけどTwitterのようなStreamingAPIとかかっこ良いですよね。
つーことでコード。
ResponseにStreamingするためのジェネレータを渡すだけ。
direct_passthroughはジェネレータを変更させないための引数らしい、wrapして返すため、後で変更されても影響を受けないようになると思われる(WSGIの仕様っぽい)。
mime/typeはお好きなものを。
それにしても簡単だなー。
Streamingのsnipetが掲載されてました。
(もしかして結構前から?)
Werkzeugには0.5から機能としてはあるみたいなんで、
きっと昔からできたんでしょう。
なかなか使い道ないけどTwitterのようなStreamingAPIとかかっこ良いですよね。
つーことでコード。
from flask import Flask
from flask import Response
import time
app = Flask(__file__)
@app.route("/streaming")
def streaming():
def generate():
while True:
time.sleep(1)
yield "test\n"
return Response(generate(),direct_passthrough=True,mimetype='text/plain')
if __name__ == "__main__":
app.run()
ResponseにStreamingするためのジェネレータを渡すだけ。
direct_passthroughはジェネレータを変更させないための引数らしい、wrapして返すため、後で変更されても影響を受けないようになると思われる(WSGIの仕様っぽい)。
mime/typeはお好きなものを。
それにしても簡単だなー。
2011年7月2日土曜日
Pythonで動的にサブクラスを生成
excelとかDBとかにテストケース用のデータを追加したら
勝手にテストクラスにテストケース(つまりテストメソッド)が追加される、
とかそういうことをやりたい。
で、unittest.TestCaseクラスのサブクラスを
テストデータから動的に生成して実行したいと思ったときに、
どうやれば良いのかちょっと悩んだので、メモ。
動的にサブクラスを生成するのは、
非常に単純でtype関数を使えばできる。
type関数は[クラス名]、[親クラスのタプル(多重継承も可)]、[付与したい属性の辞書]で
動的にクラス生成をできる。
動的にテストクラス(unittest.TestCaseのサブクラス)を生成して、
動的にテストメソッドを追加することができる。
これを応用すればソースコード書かずにテストクラス、テストメソッドを動的に追加するようなプログラムができる。
勝手にテストクラスにテストケース(つまりテストメソッド)が追加される、
とかそういうことをやりたい。
で、unittest.TestCaseクラスのサブクラスを
テストデータから動的に生成して実行したいと思ったときに、
どうやれば良いのかちょっと悩んだので、メモ。
動的にサブクラスを生成するのは、
非常に単純でtype関数を使えばできる。
type関数は[クラス名]、[親クラスのタプル(多重継承も可)]、[付与したい属性の辞書]で
動的にクラス生成をできる。
import unittest
def create_testmethod():
"""
テストメソッドを動的に生成
"""
def testMethod(self):
self.assertEquals(1,1)
return testMethod
def create_testclass():
"""
TestCaseのサブクラスを動的に生成
"""
test_class = type('TestA', (unittest.TestCase,), {})
setattr(test_class,'testMethod',create_testmethod())
return test_class
def suite():
"""
テストスイートを生成
"""
suite = unittest.TestSuite()
test_class = create_testclass()
suite.addTest(unittest.makeSuite(test_class))
return suite
if __name__ == "__main__":
unittest.TextTestRunner().run(suite())
動的にテストクラス(unittest.TestCaseのサブクラス)を生成して、
動的にテストメソッドを追加することができる。
これを応用すればソースコード書かずにテストクラス、テストメソッドを動的に追加するようなプログラムができる。
Quick Lookup:
2011年5月27日金曜日
DebugToolbarをFlaskにも
Flaskいいよー。Flask。
extensionsもガンガン増えてかなり色々なことができるようになりました。
今日のネタはDebugToolbarです。
ちょっとハマったりしたのでそのメモがわりに。
DebugToolbarはDjangoのextensionでもあるものらしく、
レスポンスタイムとかログとかHttpHeaderとか見れるすぐれもの。
Flaskでも使えるとなれば(Djangoでは使ったこと無いけど)これは試してみるしか
いつものようにeasy_install なり pipなりでflask-debugtoolbarをインストールしたらええやないか。
実行する最小セットは下記の通り。
これでローカルホストからは右にデバッグ用の怪しいボタンが出てくるので、
押すと色々なデバッグ情報が見れるようになる。
自分の環境ではflaskがurl_ruleっていう関数がねーみたいなエラーがでたので、
flaskを最新版(0.7)に換えたらOKでした。
こういうのが増えてくると開発しやすくなりますねー。
extensionsもガンガン増えてかなり色々なことができるようになりました。
今日のネタはDebugToolbarです。
ちょっとハマったりしたのでそのメモがわりに。
DebugToolbarはDjangoのextensionでもあるものらしく、
レスポンスタイムとかログとかHttpHeaderとか見れるすぐれもの。
Flaskでも使えるとなれば(Djangoでは使ったこと無いけど)これは試してみるしか
いつものようにeasy_install なり pipなりでflask-debugtoolbarをインストールしたらええやないか。
実行する最小セットは下記の通り。
from flask import Flask
#DebugToolbarをインポート
from flaskext.debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
#パネルを登録
app.config['DEBUG_TB_PANELS'] = (
'flaskext.debugtoolbar.panels.headers.HeaderDebugPanel',
'flaskext.debugtoolbar.panels.logger.LoggingPanel',
'flaskext.debugtoolbar.panels.timer.TimerDebugPanel',
)
#Debug用のシークレットキーを追加、デバッグモードON
app.config['SECRET_KEY'] = 'asd'
app.config['DEBUG'] = True
toolbar = DebugToolbarExtension(app)
@app.route('/')
def test():
app.logger.info("hello")
return ""
if __name__ == "__main__":
app.run()これでローカルホストからは右にデバッグ用の怪しいボタンが出てくるので、
押すと色々なデバッグ情報が見れるようになる。
自分の環境ではflaskがurl_ruleっていう関数がねーみたいなエラーがでたので、
flaskを最新版(0.7)に換えたらOKでした。
こういうのが増えてくると開発しやすくなりますねー。
ラベル:
flask,
flask-extensions,
python
2011年5月22日日曜日
挿入ソート
アルゴリズムクイックリファレンス買いました。
購入動機は、
・アルゴリズムは大学生以来(しかも1-2年の時)やってないのでかなり鈍っている
・グラフ系のアルゴリズムとか学生時代にほとんどやってない
・プログラミングコンテストの予選を突破できるようになりたいので正しいアルゴリズムをきちんと学びたい(正しいアルゴリズムを選べるようになる、計算量を意識できるようになる)
です。
つーことで早速挿入ソート
(多少Pythonicに直した…つもり)
オーダー
最良 O(n)
平均 O(n^2)
最悪 O(n^2)
挿入ソート特徴
要素数が少ない、最初からほぼ整列しているデータに対して有効
感想
かなり男らしい実装だが、
ほぼソートされている場合insert関数のwhileが小さくなるため、
結構高速に動作するらしい。
がんばって一冊みっちり勉強したいとこです。(意気込み)
購入動機は、
・アルゴリズムは大学生以来(しかも1-2年の時)やってないのでかなり鈍っている
・グラフ系のアルゴリズムとか学生時代にほとんどやってない
・プログラミングコンテストの予選を突破できるようになりたいので正しいアルゴリズムをきちんと学びたい(正しいアルゴリズムを選べるようになる、計算量を意識できるようになる)
です。
つーことで早速挿入ソート
(多少Pythonicに直した…つもり)
def sort(a):
for i, e in enumerate(a):
insert(a, i, a[i])
def insert(a, pos, value):
i = pos - 1
while i >= 0 and a[i] > value:
a[i + 1] = a[i]
i = i - 1
a[i + 1] = value
if __name__ == '__main__':
data = [6, 3, 2, 1, 5, 4]
sort(data)
print data
オーダー
最良 O(n)
平均 O(n^2)
最悪 O(n^2)
挿入ソート特徴
要素数が少ない、最初からほぼ整列しているデータに対して有効
感想
かなり男らしい実装だが、
ほぼソートされている場合insert関数のwhileが小さくなるため、
結構高速に動作するらしい。
がんばって一冊みっちり勉強したいとこです。(意気込み)
2011年5月3日火曜日
Pythonの命名規則のおさらいじゃい
どうもこんにちわ。
いきなりですけどPythonのみでコーディングしている人は少ないのではないでしょうか。
私もJavaとPythonとjavascriptなどの複数の言語を業務で扱うことがあり、
ある程度慣れては来ていますが、命名規則がごっちゃになったりします。
つーことで今更ながらPythonの超基本命名規則(by PEP8)のおさらい。
見返して思ったのはモジュール名にアンダースコアつけてるかも。恥ずかし。
※たまにあるビルトイン系の関数名がmixedCaseになっていると混乱する元になりますね。
いきなりですけどPythonのみでコーディングしている人は少ないのではないでしょうか。
私もJavaとPythonとjavascriptなどの複数の言語を業務で扱うことがあり、
ある程度慣れては来ていますが、命名規則がごっちゃになったりします。
つーことで今更ながらPythonの超基本命名規則(by PEP8)のおさらい。
| 名称 | 規約 | 例 |
| module名 | lowercase | hamegg.py |
| class名 | CapWords | class HamEgg(object):… |
| exception名 | CapWords | class HamEggException(Exception):… |
| 関数名 | lowercase_with_underscores | def ham_egg():… |
| 関数名(既存の文脈※) | mixedCase | def hamEgg():… |
| メソッド名 | lowercase_with_underscores | def ham_egg(self):… |
| インスタンス変数名 | lowercase_with_underscores | self.ham_egg = None |
| 定数 | UPPER_CASE_WITH_UNDERSCORES | HAM_EGG = "ham_egg" |
見返して思ったのはモジュール名にアンダースコアつけてるかも。恥ずかし。
※たまにあるビルトイン系の関数名がmixedCaseになっていると混乱する元になりますね。
登録:
投稿 (Atom)
