読者です 読者をやめる 読者になる 読者になる

Pythonのsmtpdモジュールで開発用のメールサーバーを用意してUpstartで動かす

PythonのsmtpdモジュールはSMTPサーバーを実装するためのクラスを提供するが、コードを書かなくても利用できる。 開発用のメールサーバー(実際にメールを配送せず、内容をファイルに出力)として使うにはDebuggingServerクラスを使う。 20.13. smtpd — SMTP …

Celeryでキュー名を指定してタスクをルーティングする

2つ以上のホストでcelerydを起動し、タスクを処理させるホストを明示的に指定したい場合には、キュー名を指定することで実現できる。 Routing Tasks — Celery 3.1.23 documentation 試したバージョンは、Python 2.7、Celery 3.1.8、BrokerはRabbitMQ。 ワー…

UbuntuでPythonからcx_Oracleモジュールを使ってOracle Database 11gに接続する

Oracle Databaseを使うのは初めて。最新版は12cだけど、11gがまだ結構使われてるっぽい。 PythonからOracleに接続する場合はいくつか方法があるけど、今回はcx_Oracleを使うことにする。 試した環境は、Ubuntu 12.04、Python 2.7。 cx_Oracle cx_Oracleは9i…

Djangoでフォームセットを使って複数のレコードを一括編集する

1つのモデルの複数レコードを編集するのなら、ModelFormのフォームセットを生成するといいのだけど、modelformset_factoryという関数があるのでそちらを使用してみる。 ドキュメントに載っていないのでバージョンアップで動かなくなる可能性あり。 modelform…

DjangoでSOAPウェブサービスを実装する

PythonでSOAPを扱う場合、いくつかサードパーティモジュールがあるのだけど、久しぶりに調べてみたら、Spyneというのがそこそこ活発に開発されてるようだ。 spyne - RPC that doesn't break your back. どうやら、 soaplib の開発を停止して rpclib というモ…

django-edamameというライブラリを公開しました

django-edamameはDjangoで複数のビュー関数、ビュークラスをまとめる機能を提供します。 django-edamame 0.1 : Python Package Index このアイデア自体は数年前から持っていて、実装コードではちょくちょく使ってた。 複数のビューをまとめて似たような機能…

Djangoでサイトの利用者ごとに翻訳の言語設定を切り替える

Djangoで、サイトの利用者ごとに言語設定を切り替えたい。 DjangoはセッションやCOOKIEの値を参照して、どの言語に翻訳するかを決める仕組みをミドルウェアで提供している。 言語設定の検出メカニズム - 翻訳 ― Django 1.4 documentation フォームから送信さ…

Djangoでモデルクラスを差し替え可能にする

Django1.5からdjango.contrib.authのユーザーモデル(User)を差し替えることが可能になっているが、この機能を実現しているのがMetaサブクラスのswappableオプション。 このオプションを使うと、settingsの設定でモデルクラスを差し替える機能をアプリケーシ…

Djangoのログ出力をFluentdで集める

Djangoのログ出力をFluentdで集める方法について。 ログレベルがERRORやWARNINGのものはSentryを使うのが便利だと思うけど、それ以外のINFOやDEBUGはSentryに入れるには数が多すぎるのでどうするか考えてて、最初はローカルのファイルに書き出していた。 け…

Django1.6のsettings.pyと管理サイト

Django1.6から、startprojectで作成されるデフォルトのsettings.pyの内容がずいぶん変わってスッキリしました。 以下インラインでコメント。 """ Django settings for myproject project. For more information on this file, see https://docs.djangoprojec…

GoogleAppEngine(PythonSDK)のndb雑感

GoogleAppEngineで動かす予定の、ちょっとしたデータベースアプリケーション(簡単なCRUD)を作るのにgoogle.appengine.ext.ndbを試しに使ってみてます。 少し使ってみて感じたことなど。 dbと比べて、APIの設計がよりDataStoreを効率よく使う方に向いてる(get…

bpmappersのテスト実行をDjango1.6に対応させました

bpmappersのv0.7はDjango1.6で動作することを確認済み。 この機会にtoxのtestenvをちょっと書きなおしてみました。 次のバージョン以降は、Python2.5のサポートは切ろうと思います(tox+virtualenv+pipのバージョンを合わせるのが面倒) 代わりに、Python2.6、…

Bottleでファイルをダウンロードさせる

メモ。bottleを使ってContent-typeを設定してファイルをダウンロードさせる。 Webブラウザでファイルをダウンロードして保存させるには、Content-Typeヘッダにapplication/octet-streamを指定する。 ファイル名を指定する場合はContent-Dispositionヘッダを…

Bottleとpeeweeを使ってゲストブックアプリケーションを作ってみた

Python用のWebフレームワークであるBottleと、O/Rマッパーのpeeweeを使って、Python Professional Programmingの2章のゲストブックアプリケーションを作ってみた。 試したバージョンは、Python2.7、Python3.3、Bottle0.11.6、peewee2.1.5。 ソースコード gue…

Sentryをインストールして実行してみる

複数台あるアプリケーションサーバーのエラーログを集めて見たり、メール通知するのだとSentryは結構使いやすそう。 http://sentry.readthedocs.org/en/latest/ とりあえず、動かしてみる。 インストール virtualenvでeasy_installのオプション指定にてイン…

Django REST frameworkとbpmappersを組み合わせて使う

DjangoでREST APIを簡単につくるためのライブラリは、django-tastypie以外にDjango REST framework(以下rest_framework)というのもある。 Django REST framework これとbpmappersを組み合わせて使う方法を調べたのでまとめる。 rest_frameworkモジュールのソ…

django-tastypieとbpmappersを組み合わせて使う

Djangoでtastypieを使ってREST APIを作る際に、bpmappersをどうやって組み合わせればよいか調べてた。 tastypieのCookbookのページにカスタムの値を追加する例がある。 Adding Custom Values tastypieのソースコードを読んだところ、dehydrateメソッドで値の…

Djangoのsettingsの分割と構造化について

Djangoの設定ファイルであるsettingsの分割、構造化について。 開発、ステージング、本番、テストなど環境ごとにsettingsの内容は変える必要があるので、settings.pyを分割したり、共通部分をまとめたりする。 settingsの分割についてはdjangoprojectのWiki…

PythonからHDFSを操作する

HadoopのHDFS(分散ファイルシステム)にはWebHDFSというREST APIがあり、HTTPで操作できる。 WebHDFS REST API Pythonからこれを簡単に使うためのモジュールを探したところ、PyPIでWebHDFS、pywebhdfsの2つを見つけた。 WebHDFS 0.2.0 : Python Package Index…

CHaserっていうプログラミングコンテスト用のPythonクライアントをPyPIに置いた

全国情報技術教育研究会という主に工業高校が会員になってる組織があって、そこが高校生向けにプログラミングコンテストを毎年やってる。 CHaser2012 - 全国情報技術教育研究会 コンテスト用のサーバープログラムを動かして、そこに2チームがクライアントプ…

DjangoのORMでINSERTのSQL文字列を取得する

タイトルの通り。 DjangoのORMでSELECTのSQLを取得するのは、QuerySetクラスのquery属性を参照すればいいのだけど、INSERTの場合は簡単に取得できる方法がなさそうに見えた。 内部APIをゴニョゴニョすることで、何とか取得できる。 以下、コード例。 myapp/m…

PyCON APAC 2013に参加しました

PyCON APAC 2013に参加しました。 PyCon APAC 2013 - PyCon APAC 2013 チュートリアルデイ チュートリアルBで講師をやりました。 PyCon APAC 2013 チュートリアル - connpass 当日使用した資料が印刷して70ページ程度のものでした。予定通り説明ができて、参…

bpmappers 0.7をリリースしました

タイトルの通り、bpmappers 0.7をリリースしました。 bpmappers 0.7 : Python Package Index 0.6のbpmappers.djangomodelモジュールはPython3で動作しなかったのですが、Django1.5+Python3.2 or 3.3で動作するように修正しました。 sixモジュールを分離して…

PythonからCloudera Impalaにクエリを投げて結果を取得する

PythonからImpalaにクエリを投げて結果を取得したかったので、方法を調べてました。 Impalaの環境はCloudera QuickStart VMを使用し、CDH4.3.0でImpala1.0.1です。 impylaというPythonのモジュールを試してました。 GitHub - laserson/impyla: Python client…

FluentdにPythonから日本語の文字列を投げてみる

Fluentdに対して、fluent-logger-pythonで日本語のデータを投げて正常に動作するか試してみる。 バージョンはUbuntu 12.04(precise)、Python 2.7、td-agent 0.10.35、fluent-logger-python 0.3.3。 fluent_test.py # coding: utf-8 from fluent import sende…

Fluentd(td-agent)のインストールとPythonからの利用

Fluentdを使おうと思って調べてる。 Fluentdを使うと、各種ログを集約したり、いろいろな出力先に振り分けたりが簡単にできる。 Rubyで実装されていて、gemでインストールすることができるけど、今回はRubyの実行環境も含めてパッケージ化されたtd-agentを使…

Upstartを使う

最近、デーモンプロセスの管理にUpstartを使ってる。 PIDの管理をあんまり気にしなくてよかったり、イベント発火の仕組みでプロセス間の依存を解決できるのが楽。 簡単な使い方をメモしておく。 基本的な使い方 /etc/init/ に設定ファイルを設置する initctl…

jsonモジュールのobject_hookを使ってJSONからオブジェクトを生成する

Pythonのjsonモジュールのloads関数には、object_hookという引数があり、JSONの値の変換時にフックすることができる。 詳しくはドキュメントを参照。 18.2. json — JSON エンコーダおよびデコーダ — Python 2.7.x ドキュメント 試したPythonのバージョンは2.…

guestbookアプリをDjango1.5に対応させた

bitbucketに置いてたguestbookアプリをDjango1.5で動くように修正した。 対応前 tokibito / sample_nullpobug / source / django / myproject / (rev:37c9c8d) Django1.0〜1.3ぐらいで動作するコード。汎用ビューがまだ関数だし、staticfilesも使っていない…

drone.ioを試してみた

Travis CIと似たようなCIサービスでdrone.ioというのがあるらしいと聞いたので、試してみた。 Continuous Integration · drone.io GitHubだけじゃなくて、Bitbucketにも対応しているのがうれしい。 ビルドの設定はTravisCIと違ってWeb上のフォームで入力する…

Travis CIでpython3.1が外されていた

bpmappersはbitbucket上で主に開発してるけど、githubにもpushしてTravis CIを使ってる。 最近ドキュメントだけ変更してpushしたらエラーがでてた。 コードは変更してないのになーと思ってTravis CIのログを見たらこんなメッセージが。 ERROR: py31: Interpr…

一時ディレクトリの作成にtempfileモジュールを使う

ファイル操作のテストコードを書いていて、tempfileモジュールが便利だったので使い方のメモを残す。 Pythonの標準ライブラリにtempfileというモジュールがあり、これを使うことで一時ディレクトリやファイルを簡単に作成できる。 10.6. tempfile — 一時的な…

PythonでSPDYのHello worldを実装してみる

SPDYプロトコルがどういうものなのか理解しておきたかったので、spdy/3の仕様を最近読んでる。 SPDY Protocol - Draft 3 - The Chromium Projects で、実際どういう挙動になるのかPythonで実装してみた。 今回は単純にtext/plainで「Hello, SPDY」と表示する…

Pygmentsを使う

Pygmentsをドキュメント読みつつ動かしてみてた。Pygmentsはソースコードなどにシンタックスハイライトを適用するためのライブラリ。 Welcome! — Pygments インストールするとpygmentizeコマンドが使えるので、外部実行ならこれを使えばよし。 Pythonコード…

Pythonでシンボリックリンクとハードリンクを作成する

PythonでLinux上にハードリンクとシンボリックリンクを作成する。 試したのはUbuntu12.04, Python2.7.3。 どちらもosモジュールの関数を使う。 ハードリンクの作成 ハードリンクはos.link関数で作成できる。 >>> import os >>> os.link('test.txt', 'foo') …

緯度経度をUTM図法の座標に変換する

Pythonで緯度経度をユニバーサル横メルカトル図法(UTM図法)の座標に変換するには、PyProjを使う。 pyproj 1.9.5.1 : Python Package Index UTM図法の座標がわかれば、2地点間の距離を求めたりするのが簡単になる。 インストール pipやeasy_installでインスト…

2点を通る直線から離れた位置にある点までの距離を求める

タイトルの通り。2点を通る直線から離れた位置にある点までの距離を求めるのに、NumPyを使って計算します。 点a(x1, y1), 点b(x2, y2), 点c(x3, y3)があり、aとbを通る直線abから離れた位置に点cがあります。 点cから直線abへ引いた垂線の長さをLとします。…

NumPyで2点間の距離を求める

以下の図のような点a(x1, y1)から点b(x2, y2)の距離を求める(aとbをつないだ直線の長さを求める)場合。 ベクトルの長さを求める。 NumPyだとnumpy.linalg.normを使えばいいらしい。 >>> import numpy >>> x1 = 2 >>> y1 = 2 >>> x2 = 4 >>> y2 = 6 >>> a = n…

NumPyで2元1次方程式の解を求める

NumPyの行列計算って強力なんすね。いろいろ試してみてる。 3x + 2y = 14 x + y = 6こういう2元1次方程式の解を求める場合。 NumPyだとnumpy.linalg.solveで逆行列の積を求められるので係数のarrayを作って使えばいいらしい。 >>> A = numpy.array([[3, 2], …

Djangoのrestructuredtextフィルターでblockdiagを使う

Djangoのcontribには、テンプレートでrestructuredtextなどのマークアップをHTMLに変換してくれるフィルタのセット、django.contrib.markupがあります。 https://docs.djangoproject.com/en/dev/ref/contrib/markup/ restructuredtextフィルターを使う場合は…

DjangoとMySQLで緯度経度を扱う

やりたかったことは、指定した緯度経度(GPSから取得した現在位置)に近い場所の検索と距離の算出でした。 DjangoだとPostGIS+GeoDjangoを使えばできますが、今回はデータベースがMySQLであるため、filterでdistanceが使えませんでした。 GeoDjango Database A…

SQLSoupで既存のデータベースを参照する

既存のデータベースのテーブルを参照するのにSQLAlchemyを使おうと思っていたら、 @aodag からSQLSoupというモジュールがあるよと教えてもらったので試してました。 SQLSoupはSQLAlchemyに依存していて(元々はSQLAlchemyの拡張で、最近分離された)、SQLAlche…

Southのマイグレーションのマージ

Mercurialなどのバージョン管理システムでブランチを使っていて、DjangoとSouthを使っている場合、Southのマイグレーションがブランチ間で衝突して、マージしないといけないことがよくある。 その際の解消手順についてメモ。 試したのはDjango1.4.1, South0.…

Django1.4のバルクインサートを試す

Django1.4で、やっと標準でバルクインサートがサポートされた。 QuerySetにbulk_createというメソッドが増えている。 単純なモデルを作って、動きを見てみる。 試したのはMySQL5.5、Django.1.4.1 myapp/models.py class Item(models.Model): name = models.C…

DjangoのORMでサブクエリやrawを使う

試したのはDjango1.4.1。 こういう親子関係のモデルがあったとする。 myapp/models.py from django.db import models class Parent(models.Model): name = models.CharField(max_length=30) def __unicode__(self): return '{}, {}'.format(self.name, getat…

django.contrib.staticfilesを使う

しばらく仕事でDjangoをあんまり使ってなかったので、思い出しつつ新しい機能を勉強しつつ使ってます。 django.contrib.staticfilesはDjango1.3から使える機能。django-staticfilesというパッケージで公開されていたものがDjango本体に取り込まれた形。 http…

django-newauthの使用例

ずいぶん前になるけど、同僚のイアンが社内のDjango用認証フレームワークを公開してた。 django-newauth Documentation — django-newauth 1.0 documentation django-newauthを使う例をbitbucketに置きました。 tokibito / sample_nullpobug / source / djang…

PyConJP2012に参加しました

9/15, 9/16にPyConJP2012に参加しました。 PyCon JP 2012 は盛況のうちに終了しました - PyCon JP 2012 1日目 初心者向けのPythonハンズオンの講師ということで午前1コマ、午後1コマやりました。 資料は公開しています。 PyCon JP 2012 Pythonプログラミング…

PyConJP2012に参加します

事前エントリー的なものです。 さて、今週末はPyConJP2012です。 http://2012.pycon.jp/ http://connpass.com/event/708/ 講師やります 今回は初心者向けのPythonハンズオンの講師をやります。 Pythonプログラミングハンズオン(初心者向け) 資料はまだ書きか…

WindowsMeでDjangoを動かしてみる

某勉強会への参加のためにノートPCを用意する必要があったんですが、ちょっと古いノートPCで遊んでみようと思って押し入れから引っ張りだして来ました。 昔実家で使われていたCOMPAQのPresario1400です。購入したのは11年ほど前です。 このPCは当時でもスペ…