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

Python

django-ftpserver 0.5.0

django-ftpserverのバージョンを0.5.0に上げました。 pypi.python.org pyftpdlibのFileSystemにDjangoのStorageAPIをつなげる機能を追加してみました。 StorageAPIとつなげると、面白そうだなーというのは前から考えてたんですが、StorageAPI側の機能が足り…

プログラミング学習サービスPyQの紹介

PyQというプログラミング学習サービスの紹介と宣伝です。 ↓ これ ↓ 以前、私が勤務していた株式会社ビープラウドが開発しています。 ビープラウドは、Python言語が得意でシステム開発をやってる会社です。connpassというイベントサイトの開発、運営もやって…

Kerberos認証とPython

Windowsで認証にActiveDirectoryを使っている環境だと、シングルサインオン(SSO)などやるときにKerberos認証を使いたいこともあるだろうということで調べていました。 他の認証方法はNTLMがあるけど、非推奨のようなのでKerberosのほうを調べることに。 Kerb…

AWS LambdaをPython3.6とChaliceで試す

AWS LambdaがようやくPython3に対応したそうなので試してました。 AWS Lambda Supports Python 3.6 Lambdaを使う際、Pythonランタイムだとchaliceというフレームワークを使うと楽なのですが、Python3サポートに合わせてchaliceもバージョンが上がっていまし…

Travis CIのmatrixでtoxを実行する

Djangoフレームワークに依存するPythonのモジュールを作っていると、複数のPythonバージョンと複数のDjangoバージョンでテストコードを実行する必要があります。 手元で実行する場合はtoxを使うのですが、CIツールでもテストを実行したいです。 Welcome to t…

Django 1.11がリリースされましたね

Djangoフレームワークの1.11がリリースされましたね。 Django 1.11 released | Weblog | Django 1.11はLTS(Long Term Support)バージョンです。メンテナンス期限はリリースから3年後までなので、2020年4月までになります。 1つ前のバージョン1.10のメンテナ…

SphinxでPDFをビルドするためのDockerイメージを作った

Sphinxでlatexpdfjaコマンドを使ってPDFをビルドするには、latexのインストールされた環境が必要になります。 Ubuntuだとtexlive-fullパッケージで必要なパッケージをインストールできるっぽいというのを把握しました。 texlive-fullは依存パッケージがたく…

dogpile.cacheでpickleシリアライズせずにRedisに値を保存する

Python用のキャッシュフレームワークでdogpile.cacheというモジュールがあります。 Welcome to dogpile.cache’s documentation! — dogpile.cache 0.6.2 documentation Redisに保存するバックエンドも提供されているんですが、そのまま使うと値はpickleシリア…

ThriftPy+gunicorn_thriftでRPCサーバーを動かす

ThriftPyを使って作ったサーバーを動かすのに、thriftpy本体が持ってるサーバークラスを使ってもいいのだけど、タイムアウト処理やマルチプロセス動作だとかやるのが少し面倒だなーと考えてました。 githubでサーバークラスを差し替えるpull requestを出して…

Procfileを扱う

Procfileというのを使ったのでメモを残す。 Procfileという名前のファイルを作って、アプリケーションの起動コマンドをまとめておくと、Procfileを扱うツールから簡単に実行できる。 Procfile: web: gunicorn -w 4 main:app 0.0.0.0:$PORT test: py.test . …

ThriftPyを使ってPythonでThriftのRPCを扱う

Python3でApache Thriftを扱うライブラリは無いか探してたところ、ThriftPyというのがあるらしいとわかったので試してました。 ThriftPy — ThriftPy 0.3.9 documentation ThriftPyは、ApacheThriftのPython版と比べると、PurePython実装(Cythonによるスピー…

Pythonでファイルディスクリプタをサブプロセスに渡す

Pythonのsubprocessモジュールでサブプロセスを実行するときに、親プロセス側で開いたファイルのファイルディスクリプタを渡す方法。 subprocess.Popenのpass_fds引数を指定すると、指定したファイルディスクリプタは閉じられないようだ。 試したPythonのバ…

pipでPythonパッケージのソースアーカイブをダウンロードする

PyPIに登録されているPythonパッケージのソースコードをダウンロードする際、毎回PyPIのページを開くのが面倒だなーと思ってたのだけど、pipでダウンロードできた。 pip download --no-binary :all: --no-deps <package> 参考 pip download — pip 8.1.2 documentation</package>

Raspberry Pi 2 Model B でPythonを使ってLチカ

Raspberry Piを買ったのはかなり前だったりするんですが、放置してたのを動かしてみました。 とりあえずはLチカ youtu.be コード main.py from RPi import GPIO import time def main(): GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) try: state = Tr…

pyftpdlibを使って1ユーザー専用のFTPサーバーを作った

pyftpdlibを使って、1ユーザー専用のFTPサーバーを作ってました。 でかいデータの受け渡しなんかに使ったりするのにFTPサーバーがやっぱり便利なんで。 ついでにDockerを試したりしてた。 GitHub - tokibito/soloftpd: FTP server application. soloftpd 0.4…

DjangoのDeprecationWarningを確認する

Djangoフレームワークでは、APIが変更、廃止される場合には、次のバージョンですぐに変わってしまうのではなく、警告を上げた上で2つ先のバージョンで削除されることになっています。 Deprecation policy Pythonの組み込み例外であるDeprecationWarningを継…

cx_Oracleをマルチスレッドで使う

PythonでOracle Databaseに接続するには、cx_Oracleを使う。 マルチスレッド環境下でcx_Oracleを使う場合にハマったのでメモを残す。 Oracleのクライアントライブラリは、マルチスレッドで使う際には、OCI_THREADEDというモードで使わないといけないらしい。…

concurrent.futures.ThreadPoolExecutorを使ってみる

Python 3.2から追加されたconcurrent.futuresモジュール。 ThreadPoolExecutorを使うと、スレッドプールで処理を実行できる。 コード main.py import time import threading from concurrent.futures import ThreadPoolExecutor def spam(): for i in range(…

スレッドが終了するタイミングについて検証

Pythonでスレッドをしばらく使っていなくて、どういう動きするのだったか忘れてたので、検証したメモを残す。 試した環境は、Ubuntu 14.04、Python 3.5.1。 検証に使ったコード main.py: import threading import os import sys import time import signal d…

funkload-friendlyというモジュールを作りました

FunkLoadはPythonで作られたWebアプリケーション向けの負荷試験ツールです。 レポートがわかりやすいので、負荷試験の際によく利用してます。 便利ではあるのですが、いくつか使いづらい点があったので、funkload-friendlyというラッパーモジュールを作りま…

テンプレートからプロジェクトを生成できるcookiecutterを試す

cookiecutterは、テンプレート(雛形となるファイル群)を元に、プロジェクトファイル(ディレクトリやファイル)を生成できるコマンドラインツール。 Pythonで作られている。 GitHub - audreyr/cookiecutter: A command-line utility that creates projects fro…

unittest.mock.patchの使用例

Pythonの標準ライブラリに含まれるunittest.mockモジュールの使い方メモ。patchのみ。 試したバージョンは、Python 3.5 テスト対象 main.py import subprocess def say(message): """echoコマンドでmessageを実行する """ return subprocess.call(['echo', m…

Djangoで複数のデータベースを使う際に、モデルごとに使われるデータベース名を取得する

Djangoで複数のデータベースを使う際に、データベースルーター(Database router)を設定すると、モデル毎にデータベースを切り替えたりできます。 Multiple databases | Django documentation | Django データベースルーターが設定されている場合に、アプリケ…

復数のレコードをまとめて更新する際にdjango-bulk-updateが便利

既存の復数のレコードをまとめて更新する際にdjango-bulk-updateというパッケージが便利だったので紹介します。 GitHub - aykut/django-bulk-update: Bulk update using one query over Django ORM 通常のDjangoのORMを使ったレコードの更新 Djangoで既存の…

jedi-vimのrpcフォークをWindowsで使ってみた

メモ書き。jedi-vimのjedi部分をRPCで動かすforkを@nakamurayが作ってくれたのでWindowsで動かしてみてた。 https://github.com/nakamuray/jedi-vim/tree/rpc https://github.com/nakamuray/jedi-vim/tree/rpc2 そのままではWindowsで動かなかったので、手元…

dulwichを使ってPythonでGitのカスタムコマンドを作る

Gitのコマンドがわかりづらくて好きになれないんですが、気に入らない部分はカスタムコマンドを作ればいいよね。 ということで方法を調べてました。 カスタムコマンドの作り方 Gitのカスタムコマンドは、「git-コマンド名」のような実行可能ファイルを用意し…

PyPy3 2.4.0を使ってみた

最近、仕事でPyPy3を試したりしているので、メモを書き残しておく。 PyPy - Welcome to PyPy インストール 今回はUbuntu 14.04LTSで試した。PyPy3はPPAリポジトリに無いので、Linux向けのコンパイル済みバイナリをダウンロードして使うことにした。 利用する…

Mercurialのextensionを作る

Mercurialのextensionは、hgext/モジュール名.pyというレイアウトで作ればいいみたい。 Python 2.7、Mercurial 3.5.2で試した。 $ hg hello Hello world!GitHub - tokibito/mercurial-helloworld: helloworld mercurial extension

Pythonでプログラムの終了コードを指定する

Pythonでプログラム(プロセス)の終了コード(終了ステータス)を指定して終了するには、sys.exitの引数に数値を指定する。 試したのはPython3.4。 29.1. sys — システムパラメータと関数 — Python 3.4.3 ドキュメント コード main.py import sys def main(): #…

PythonでUnixドメインソケットを使って通信する

サーバー側 サーバー側のプログラムは、指定したファイルパスにソケットファイルを作ってクライアント側からの接続を待ち受けます。 server.py この例では、 /tmp/myapp.sock というパスにソケットファイルを作成します。クライアント側から送信されたデータ…

Djangoのプロジェクトに管理コマンドを追加する

Djangoのmanage.pyは独自に管理コマンドを作成して追加できます。 ここでは、「myapp」という名前のDjangoアプリケーションに対し、「summation」という名前のコマンドを実装する例を紹介します。 myappはプロジェクトに作成済みで、INSTALLED_APPSに追加済…

Djangoのエントリポイントとアプリケーションの仕組み

PyCon mini Sapporo 2015で、「Djangoのエントリポイントとアプリケーションの仕組み」というタイトルで話しました。 資料はSlideshareに置いてます。 Djangoのエントリポイントとアプリケーションの仕組み

Djangoの管理コマンドを作る際にdjango-extensionsのcreate_commandコマンドを使う

Djangoのmanage.pyスクリプトのサブコマンド(管理コマンド、management command)を追加するには、Djangoアプリケーション内に「management/commands/コマンド名.py」のようにモジュールを作成しますが、頻繁に使うわけでもないので作法をよく忘れてしまって…

DjangoテンプレートのstaticタグとSTATIC_URLコンテキスト変数の使い分け

Djangoテンプレートで静的ファイルのパス指定時にdjango.contrib.staticfilesのstaticタグとSTATIC_URLのどちらを使うべきか、という質問があったので、少し調べました。この記事はDjango 1.8のドキュメントとコードを参考にしています。 結論としてはstatic…

Django 1.8で追加されたSecurityMiddlewareについて

Django1.8で増えた機能でSecurityMiddlewareというものがあります。 何ができるのか把握しておきたかったので調べていました。 django.middleware.security.SecurityMiddleware コードはこのあたり。 django/security.py at stable/1.8.x · django/django · …

Djangoのメッセージフレームワークのストレージについて

Djangoフレームワークには、利用者ごとに一度だけ表示するメッセージ(フラッシュメッセージ)を扱う機能(django.contrib.messages)が含まれています。 The messages framework | Django documentation | Django メッセージは、複数のリクエストをまたいで表示…

django-celeryを使わずにDjangoとCeleryを組み合わせて使う

DjangoとCeleryを組み合わせて使う際に、django-celeryのモデルのテーブルを作りたくなかったり、各種機能が不要でシンプルに動かしたかった。 Celery - Distributed Task Queue — Celery 3.1.23 documentation Celeryやdjango-celeryはドキュメントが少し足…

Pythonプロフェッショナルプログラミング第2版が発売されました

タイトルの通り、会社(ビープラウド)のメンバーで執筆したPythonプロフェッショナルプログラミングですが、好評だったようで第2版を出すことができました。 初版から3年ほど経ち、古くなったコンテンツも多かったので、今回大幅に内容を変更しています。 店…

Django1.7の管理サイトでアプリケーション名を変更する

Django1.6以前のバージョンでは、管理サイトで表示されるアプリケーション名を変更する方法は通常の使い方では提供されていませんでした。 変えたいのはこの「Myapp」という部分。 Django1.7ではアプリケーションごとの設定が抽象化、再利用可能な仕組みが導…

DjangoでDEBUG=Falseの際にSQLのログを出力する

Djangoでクエリのログを出力したい場合、ロギングの設定でdjango.db.backendsのロガーを設定すればできます。 ただし、これはsettings.DEBUG=Trueのときにしか出力されないようになっています。 これはドキュメントにも書かれています。 ロギング — Django 1…

Django 1.5.3以降で変更されたセッションのシリアライズについて

Djangoのセッションデータは、settings.SESSION_ENGINEで指定されたクラスによって保存されます。 Django 1.5.3より前のバージョンでは、セッションデータのオブジェクトをシリアライズ、デシリアライズする処理は、ここで指定されるバックエンドクラスに任…

Python札幌の勉強会で話してきました

Python札幌の勉強会でPython3、Django、ApacheSparkの話題で話してきました。 slideshareに資料をアップロード済み。 Python札幌201406 from Shinya Okano 今回の札幌訪問はオープンソースカンファレンス北海道に参加したり、えにしテックさんのオフィスを訪…

GoogleAppEngine/Pythonでparamikoを使ってSSH接続

GoogleAppEngineでsocketが使えるようになったのは1年ぐらい前だった気がしますが、使ったことなかったので試してました。 Sockets Python API Overview | Python | Google Cloud Platform まだプレビューリリースですね。 socketを使えるのならparamikoでSS…

GoogleAppEngine/PythonからGoogleCloudStorageを使う

AppEngineで動かすアプリを作っていて、Blobstoreを使おうかなーと思って久しぶりにドキュメントを見たら、CloudStorageを使うことが推奨されていたので、試してた。 https://developers.google.com/appengine/docs/python/googlecloudstorageclient/?hl=ja …

rst2pdfでblockdiagを有効にする

rst2pdfはreStructuredTextからPDFを生成してくれるツールです。 blockdiagディレクティブを入力ファイルに書いても、そのままでは動作しません。 rst2pdfの拡張の仕組みを使うことでblockdiagを有効にできます。 試したバージョンは、Python 2.7、rst2pdf 0…

python-ldapとpython3-ldapについて

PythonからLDAPサーバーを操作するために使うクライアントライブラリについて。 python-ldapとpython3-ldapというのがある。 最初はpython3-ldapのほうはフォークか何かだと思っていたのだけど、コードを読むと全く別物でした。 それぞれについて特徴を整理…

Funkloadのテストコードの書き方について

fl-run-benchコマンドで実行するテストコードの書き方についてメモ。 Cyclesの値はCU(ConcurrentUser)の数 durationに設定した秒数の間、テストを繰り返し実行する レポートにでるSUCCESSやERRORの数はテストを繰り返し実行したときの結果を集計したもの デ…

FunkLoadでJSONをPOSTする

FunkLoadでJSONをPOSTする方法を調べたのでメモ。 FunkLoadでJSONを送信するテストコード funkload.utils.Dataを使うと、Content-Typeを指定してデータ列を送信できる。 test_Simple.py # coding: utf8 import unittest import json from funkload.FunkLoadT…

PythonでParquetフォーマットを扱ってみたいので調べていた

ParquetフォーマットをPythonから扱ってみたいので調べていた。 GitHub - jcrobak/parquet-python: python implementation of the parquet columnar file format. githubにあったものを見つけたけど、まだバグが結構あるっぽい。書き込みなども実装されてな…

Pythonの研修サービスを始めました

勤務先でPythonの研修サービスを始めることになりました。 BeProud Python Training (Pythonプログラミング研修) 私も講師の一人です。受託開発の業務でも5年以上Pythonを使っているので、ノウハウは蓄積されてます。 よろしくお願いします!