ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2014年1月14日火曜日

アメブロまたはBloggerでMarkdownでブログを書くためのmd2ameblo作った話

http://md2ameblo.herokuapp.com/ (ソースコード )

といっても半年以上前に作ったやつなんですが、今回Angular.jsを使ってUIをけっこう変えたのであらためて告知。

これは何?

MarkdownのテキストをアメブロやBlogger向けのHTMLに変換するヤツ。作ろうと思ったきっかけは会社でエンジニアブログを書かなくてはいけない時に、アメブロのエディタがアレ過ぎて辛かったので(*1)ついカッとなって作った。

*1) HTMLタグを書くエディタモードでも、改行が勝手にbrとか挿入されてm9(Д)プギャーってなる

自分の使い方

自分はブログはBloggerで書いていて

  1. wri.pe でMarkdownで記事を保存
  2. md2ameblo でHTMLに変換
  3. Bloggerのエディタにコピペ
  4. 「ブログに書いた」という意味合いでwri.peで該当の記事をアーカイブ

という感じで使ってる。今年は昨年よりもっとブログを書こうと思っているので、ガンガン使っていく所存です。

使った技術

  • Angular.js
  • Python (サーバサイド)
    • bottle
    • misaka - MarkdownをHTMLに変換するライブラリ
  • Heroku

データベースも使ってないのでHerokuに置いてある。git push でディプロイできてHeroku超便利。

今後

やっぱり変換かけるのが面倒なので、wri.pe的なエディタ作ってそこからワンクリックでBloggerに投稿するやつを作り中。

アメブロ Perfect GuideBook
posted withamazlet at 14.01.13
榎本 元

ソーテック社

売り上げランキング: 3,535

2013年10月20日日曜日

標準出力・標準エラー出力をキャプチャするPythonのライブラリを作った

https://pypi.python.org/pypi/iocapture

PerlでいうCapture::Tiny みたいなやつのPython版が欲しかったので作ってみた。Python3にも対応させた(つもり)。

2013年9月20日金曜日

PyCon APAC 2013 2日目に行ってきた(2) #pyconapac

ちょっと間が空いてしまったけど、PyCon APACの2日目の後半。Pythonでハードウェアを操る話、ちょうどRasberryPiを買ったので耳寄り情報が多かった。とりあえずpyserialは入れとけと。

あとDjangoのデバッグの話は、django-debug-toolbarなど興味深かった。これって他のフレームワークにも移植されてて、Flask版やBottle版もあるみたい。そういえばBottleはwerkzeugで動かすこともできたような。

PythonでハードウェアをWebAPIにした話

  • 北神雄太さん @nonNoise
  • 所属:ArtifactNoise
  • 職業:発明家
  • 主な開発:Elpis Framework
  • スライド
気になってる話題
  • Tessel
    • JavaScript, Nodeが動くらしい
  • Arduino YUN (アードゥイーノ ヤン)
    • Linuxが乗ってる
  • GALAXY Gear
  • Nymi
ハードウェア界隈の話
  • Arduinoの進化
  • RaspberryPiなどのカード型PCの登場
  • RaspberryPiのPiはPythonのパイらしい
  • PyGameが標準で入っている!
  • Linuxなら標準で入っているので、カード型PCでPythonを動かし、特殊なハードウェアをコントロールする新しいムーブメント
Pythonでハードウェアを扱う方法
  • Pyserialを使う。簡単
  • USBが刺さった時にどっちのポートが刺さったかわからない
  • USB Serial変換チップ
    • USBがttyとして認識される!
    • USBのドライバを書かなくてすむ
  • マザーボードのIOを直接操作できる
ハードウェアとのやりとり
  • 基本的にはコマンド方式がほとんど
    • 1(前へ進む), 2(後ろへ進む)
ハードウェアをWebAPIにする

(メモあんまり残ってない)

ser.getline()

Django最速デバッグ指南

django-pdb
  • -pm
    • Exception出たらデバッガが起動する
django-devserver
  • SQLのクエリのログ
  • リクエストの情報
  • プロファイリング情報

などをコンソールに出力。

django-debugtoolbarはテンプレートを使っていないと表示されない。APIだとデバッグ情報は見れない。あとJSが走るのでJSゴリゴリ書いているとエラーになる可能性がある。

runserverwerkzeug
  • Flaskの人が作っているWSGI実装
  • ブラウザ上でインタラクティブなデバッガーが使える
logging
  1. logger.error(Invalid code: %s%azunyan)
  2. logger.error(Invalid code: %s,miotan)

2.が正しい。理由は2.で書いておくとログ集約ができるから。

重要な点

  • 正しく使う
  • ログレベルの認識を一致させる
  • ログの頻度の統一

debug,info,warning(warn),error,critical(crit)

  • debug
    • 開発時のみ出力
  • info
    • ファイル出力
  • warning
    • 機能は動作してるけど何か間違っている
    • 処理は継続できるけど何かがおかしい
    • バリデーションエラーぐらいの認識
  • error
    • 500エラー
    • バッチが落ちるレベル
  • critical
    • 使わない
その他開発・運用で使っているツール
  • PyCharm: Python向けIDE(IntelliJ)
  • Sentry: ログ収集プラットフォーム
    • ログを集約してメールで通知とか
まとめ
  • デバッグには何が起こっているのかを理解するのが大事
  • ツールを正しく使えばデバッグ時の負荷を減らせる

2013年9月17日火曜日

PyCon APAC 2013 2日目に行ってきた(1) #pyconapac

今日も基調講演は聞けなかったんだけど、その日のうちにYouTubeにアップされていたので早速見てみたら、リアルタイムで見れなかったのがすごい悔やまれる内容だった。Pythonが遅いとか、信頼できるシステムを作りにくいとか言われるけど、本当この人の言っている通りだなぁと思った。自分は普段Java書いてて、Javaはたしかにスレッドがあるから速いしスケーラブルだけど、その速さ・スケーラブルさを必要とするシーンって一体どのぐらいあるんだろう?っていうのはいつも思っていて。よく「TwitterがRailsやめてJVMに移行したからこれからはJVMの時代だぜヒャッハー」みたいなことをいう人がいるけど、「TwitterレベルのトラフィックだからJVMが必要」なんであって大抵のケースにはJVMは必要ないんだよねー。だってDropboxですらPythonなんだもの。

あと、清水川さんの2.5から3.3まで対応させる話、ちょうどtomahawk をPython3対応しないとなぁと思っていたので渡りに舟だった。sixっていうモジュールは名前は知っていたんだけどあそこまで便利に使えるヤツだとは知らなかったので、その話が聞けただけでも今日は来た甲斐があった。

Keynote: One Million Lines of Python

  • Rian Hunterさん
  • Dropboxの3人めの社員
  • 最初の仕事はLinux版のデスクトップクライアントを作ることだった
  • 動画
  • C, Python, Haskell を書く
  • Python makes me feel good
動的型付け言語ではRobustなシステムは作れない?
  • You can build a reliable foundation with Python
  • We did (かっこいい!)
「Pythonが遅い」問題
  • あなたのコードのボトルネックはCPUバウンドな処理なのか?
    • たいてい違う
  • CPUバウンドじゃないなら、Pythonが遅くてもそれは関係ない
  • 本当にCPUバウンドなら、その部分だけCで書けばいい
GIL
  • multithreading以外にもmultiprocessingがある
Dynamically typed じゃなくて Duck typing
  • これ に感銘を受けた(The Zen of Duck Typing)

Python2.5から3.3で動作するツールの作り方

  • @shimizukawa さん
  • ビープラウド所属
  • スライド
  • 題材は sphinx-intl
sphinx-intl

国際化機能をサポートするツール

  • potから言語別poの生成、更新、ビルド
  • モチベーション
    • sphinxの対応バージョンが2.5-3.3
  • 本体500行ぐらい
2.5から3.3の違い
  • ライブラリの違い
  • ビルトイン関数の違い
  • 文法の違い
ライブラリの違い
  • optparse(まだある)
    • argparse(2.7以降、3.2以降)
  • OrderedDict(2.7から)
optparseとargparse
  • optparseよりargparseの方が使いやすい
  • 2.7, 3.2以降で標準ライブラリになった
    • pip install argparse でインストールできる
  • sphinx-intl ではoptparseをまだ使っている
    • なるべく標準ライブラリで動かしたいので
OrderedDict
  • Dicionaryだけど順番を保持してくれる便利なアレ
unicode, str, bytes
  • Python2のstr()はPython3のbytes()
  • 2のunicode()は3のstr()
funccodeと code _

関数オブジェクトの属性を取る
関数の引数の数や変数名とかいろいろ取れる

argcount = spam.func_code.co_argument
spam.func_code.co_varnames[:argcount]

argcount = spam.__code__.co_argument
spam.__code__.co_varnames[:argcount]
callable
  • 3.0,3.1で組み込み関数から消えたが3.2で復活した
  • そのオブジェクトが関数として呼び出し可能かどうか判定する
  • なんで削除されたのだろう?
try:
   callable = callable
except NameError:
   def callable(obj):
      __mro__みて__call__があるか調べる
execfile消滅
  • evalみたいなもん?
  • open(), read(), compile(), exec() をやれば同じことができる
  • execもPy3で文から式に変わった
with
  • 2.5から fromfuture import with_statement
  • 2.6以上はimportしなくても使える
print文とprint関数

Py2はprintは文

# Py2
> print 'spam', 'egg', 'ham'
spam egg ham

> print('spam', 'egg', 'ham')
('spam', 'egg', 'ham')

# Py3
> print('spam', 'egg', 'ham')
spam egg ham
print >>sys.stderr, ,
...
print 'done'

print('image', filename, 'loading...', end=' ', file=sys.stderr)
data = load_image(filename)
print('done.')
  • fromfuture import print_function
    • python2.5では使えない
    • じゃあprint関数を自分で実装するか!
じゃあどうやって2でも3でも動かすか
  • 2to3を使う
  • 両対応コードを書く
  • sixを使う
    • 2 x 3だからsixっていう名前らしい
2to3
  • Py3には2to3が用意されている
  • Py2をPy3に変換するプログラム
  • setuptoolsはsetup(2to3=True)って書いておくとインストール時に変換できる
Pros
  • 既存の資産を簡単に活かせる
Cons
  • 2to3は遅い
  • テスト実行のために毎回2to3を動かす必要がある
  • Py3でのみエラーがある場合、変換後のコードで問題があると面倒
両対応コード
  • 2to3がいらない
  • デバッグしやすい(重要)
  • Py2.6以降ならだいたいPy3互換の書き方ができる
  • Py2.4対応は可能だが絶望的
  • Py2.5を投げ捨てたくなる
  • 差異の吸収を自前で実装するのはつらい
    • print関数とかね
sphinx-intlはどうしたか
  • 諦めてsixを使った
six
  • 1.4.1 release (2013/9/2)
  • 2.4から3.3まで対応
  • 移動や名前変更は内部でバージョン判定して呼び直している(movesパッケージ)
  • execfileだけは自前で実装する必要がある
sphinx-intlで避けられなかった2to3
  • sphinxのconf.pyはユーザが書くものなので、2か3で書いてあるかわからない
  • execfileで読み込んでエラーが出たら2to3で変換する、という方法で対応した
パッケージングにおける課題
  • distlib登場。3.4で同梱予定
  • wheel登場。eggの代わりのパッケージのバイナリフォーマット
  • distribute廃止。setuptoolsに統合された。setuptoolsがPy3対応
Py2,3で動作するsetup.pyを作る
  • Py2,3で動作するようにしておく
  • 2to3もsetup.pyに対しては動かせない
  • 特定バージョンの場合に依存パッケージがある場合は自前で定義する
requires = [ 'six', 'polib', 'sphinx' ]
if sys.version_info < (2, 7):
   requires.append('ordereddict')

transifexってなんだろ?

  • 対応しているバージョンはsetup.pyのclassifiersにかこう!
    • Python3をclassifi入れるとpypiのロゴに3がつく!!
まとめ
  • Python2.5はそろそろ消滅するべき!
    • 会場内には一人しかいなかった
    • AppEngineはちょっと前まで2.5しかサポートしてなかった
    • CentOS5は2.4, CentOS6は2.6
  • 2to3は大変
  • sixは便利
質問
  • いろんなバージョンでテストするにはどうすれば?
    • テストはtox使うといろんなバージョンでテストできるので便利

Pythonサポーターズ

技術評論社

売り上げランキング: 57,978

2013年9月16日月曜日

PyCon APAC 2013 1日目に行ってきた(3) #pyconapac

というわけで1日目の最後のエントリー。1日目は濃い目のトークが多かったせいか終わった後の疲労感がハンパなかったっす。

実践C拡張モジュール開発

C拡張モジュールを書く意義について
  • Pythonでないといけないのか?
    • Java, Go, Lispなど
    • Rustはやめておけ
  • Cのライブラリを呼ぶだけならctypesでおk
  • 今ならばPyPyも検討
  • 必要な箇所だけCで書く高速化
  • パフォーマンス
    • Cコンパイラによる最適化の恩恵
なぜCythonではダメなのか?
  • 学習コスト
  • 構文などCython自身の知識が必要
  • C/APIの知識も必要
  • Cデバッガで追うことになった場合の対応が難しい
開発環境の準備
  • C/API ドキュメント
  • コンパイラ
  • 開発用Python(debugビルド)
    • ビルドに必要なライブラリ
    • virtualenv, py.test or nose
  • デバッガ(gdb)
  • Valgrind
./configure --prefix=~/opt/py33 --with-pydebug --with-valgrind
make
make install
DebugモードのPythonについて
  • メモリプールの無効化
    • 無効にしないとリーク検出が難しい
  • 生存Object数の表示
  • closeされていないFDなど各種warning表示
  • Valgrind
その他準備
  • エディタ
  • coredumpを吐くようにしておく
$ ulimit -c unlimited

setuptools, distribute

$ python setup.py develop

開発ディレクトリがライブラリのパスに入る

実際の開発

C, Pythonで別々にしておく

  • src
    • Cソース・ヘッダー
  • jega - pythonパッケージ

ディレクトリはC/Pythonで分けた方が無難

setup.pyの役割
  • distutilsを使ってモジュールをビルドするためのもの。Makefileはいらない
  • 環境の判別
  • コンパイルするソース指定
  • コンパイルオプションの設定
    • ライブラリのヘッダー、リンク
  • configure なども実行できる
  • C拡張以外のPythonパッケージのインストール
まずutil関数を書いておく
  • OS,Pythonのバージョンアップチェック
  • Cファイルの一覧作成
  • デバッグモードなどマクロの切り替え
  • 他のライブラリのヘッダーファイルの検索
Python C/API
  • 略語が少ないため、コードが読みやすい
  • ユーティリティ関数も準備されている
  • 2.x, 3.xでもほぼ変わらない(安定)
  • ドキュメントもしっかりしている
コードの記述

ソースファイル
* 1機能毎にわける
* シンプルなファイル名
* ヘッダーとソースは用意する

  • 構造体
    • PyObjectの場合は大文字から始める
    • それ以外は_tで終わる
  • 接頭語
    • モジュール:ExampleMod_xxxx
    • クラス名_メソッド名
static PyMethodDef LoopObject_methods[] = {
   { "switch", ... }
}

Cであるので必ず返り値を返し、エラーであるかをチェックする

  • 例外が発生している場合には必ずNULLを返す
  • Noneを帰す場合は、 Py_RETURN_NONE を返す
  • その他の場合:intでエラー時には負の数を返す

  • New reference

    • 参照が +1 されて返る
    • 通常のPythonコードもコレにあたる
  • Borrowed Reference

    • 参照カウントが上がらない
    • Tuple などがこれにあたる
参照カウントの規則
  • PyObject *型を返す関数
    • 必ず Py_INCREF をしてから返す
    • 呼び出し側で Py_DECREF するコードで統一
  • Borrowedは別関数として分ける
    • DECREF していいのかをわかりやすく
    • 内部で使いまわしたい
ThreadとGIL

Pythonから呼ばれる以上、スレッドセーフになっている場合がほとんど。N/W IOが走る場合は下記で囲んでおく

  • Py_BEGIN_ALLOW_THREADS
  • Py_END_ALLOW_THREADS
インスタンス継承
  • Cで作成したクラスをPython側で継承
その他
  • Cでも iter を使おう
    • PyObject_GetIter でiterを取得
    • PyIter_Nextで繰り返す
  • PySequence_Fast
    • 高速

DEBUGマクロを使おう

  • 関数の最初、最後にかならずログを表示
  • オブジェクトの生成・削除のログは必ず取る

マクロによる分岐

PyBytesString使う

質疑応答
  • まずはPythonで書いてみて、本当に遅いか判断する
  • Pythonで書くのが大変だと、Cだとさらに大変になる

2013年9月15日日曜日

PyCon APAC 2013 1日目に行ってきた(2) #pyconapac

昨日のPyCon APAC 2013 1日目に行ってきた(1) #pyconapac に行ってきた、の続き。

Interrupt-Driven programming

スライドはまだ上がっていないっぽいんだけど、だいたいこれ と同じだと思われる。SIGALRMによるタイムアウトのハンドリングはPythonだけではなく一般的なUnixであればどの言語でも使えるのでよい手法だなーと思った。それを使いやすくしたのがinterruptingcow でこれは便利そうだと思った。全体的には英語+喋るスピードが速くてほとんど聞き取れなかったけど、スライドの内容はだいたい理解できたと思う。

はじめに
  • bitbucketはDjango
  • githubbitbucketのAPIのレスポンス時間が比較された
    • bitbucketが遅いという内容
  • レスポンスタイムでaverageは見るな
  • slow requests have a big impact
    • ユーザをいらつかせる
    • APIクライアントを壊す(timeout)
    • Rants on Twitter
    • foncus on the remining 2% instead.
logging timeouts

タイムアウトをログに記録する。

コードのイメージ

def handler(*args):
    raise Excepiton("Request timed out")

signal.signal(signal.SIGALRM, handler)

signal.setitimer(signal.ITIMER_REAL, 28)
try:
    アプリケーションの処理
finally:
    signal.setitimer(signal.ITIMER_REAL, 0)

→Tracebackが得られる!あとは遅いところをひたすら治す

  • legacy/bad code often resists refactoring
  • Unpredictable input
interruptingcow

https://pypi.python.org/pypi/interruptingcow

さっきのSIGALRMのあれをモジュールにして使いやすくしたもの。

from interruptingcow import timeout
with timeout(2, RuntimeError):
    なんか処理

みたいに書ける。

Scalable content linkification の例

def prelace(doc, pattern, tmpl):
    try:
        replace処理
    exception TimeoutExcepiton:
        pass
    return doc

with timeout(.1, TimeoutException):
     print replace(doc, re.compile, '<a href="">sss</a>')
django-timelimit

これもこの人が作っているモジュール。詳細は調べきれてない。

Unique Aspects
  • works with legacy code
  • Generic solution to different problems
  • Optimistic approach (EAFP vs LBYL)
まとめ
  • Page render times highly dependent on runtime factors
  • Page timeouts have a disproportinally large impact
  • Refactor, pre-compute, paginate, remove funcionality, etc
  • Time-box expensive code with cheap fallback
  • interruptingcow - time-box arbitrary Python code
  • django-timelimit - time-box Django template fragments
  • the average color of the universe isCosmic Latte

Fabric for fun and profit

Fabricはちょっと前にFabricの豆知識 で書いたようにちょっと触ってたのでわりと復習的な感じだった。

はじめに
  • We script everything
  • We ssh in and out servers all the time
  • FabricはPythonでsshでやっていたことを効率よくするためのツール
Fabricの簡単な説明
  • fabfile.py
  • @task
  • $ fab hello
Environment configuration
@task
def production();
    env.user = 'pdfs'
    env.hosts = [ 'example.com' ]

it is just python. we can mix python codes into system commands

Vagrant development
$ fab vargrant -- sudo service couchdb restart
Fabricの代替
  • Ansible - Chefのような構成管理ツール
  • Invoke - タスクを定義して実行

How the Mock library helps me developing client-side applications

MockというPython3.3から標準に含まれるようになったモックライブラリの説明と、外部のWebAPI呼び出しにおける使い方の説明。Mockって1回使ってみたんだけど個人的には微妙で(でもなんで微妙だったか思い出せない)、個人的にはpy.test のmonkeypatchより複雑なことをしたいときはFlexMock というものを使っている。3.3から標準添付されたので今後はやっぱりこっちを使ってみようかな。

  • @clsung さん from Taiwan
  • 仕事はフリーランス
はじめに
  • モックライブラリはmock以外にMox, Flexmockがある
  • mock はPython 3.3から標準ライブラリになった
Mockの特徴
  • Mock()
  • MagickMock()
  • @patch decorator
How mock helps me
  • Develop/test client-side applications
  • Server-side APIs (Google Drive v2)
  • Client-side request library (requests)
    • HTTP requests
    • HTTP

とかとか。

Mock open() - StringIO

with patch('__builtin__.open') as m:
    m.return_value = ...
patch.object(requests, 'requests', autospec=True).start()
patch('gdapi.utils.retry', lambda: x, y)
その他テストで使える有用なライブラリ
  • factory_boy
  • httpretty
  • testfixtures

2013年9月9日月曜日

Fabricの豆知識

Python製のCapistrano的なツールであるFabric を少しだけ使ってみた。けっこう機能が多いので自分が使いそうなところをまとめておく。バージョンは1.7.0。

Fabricの基本的な機能

下記で任意のコマンドが実行可能
$ fab -H localhost -- uptime
またはfabfile.pyにタスクを書く
from fabric.api import run
def uptime():
    run('uptime')
$ fab -H host1,host2 uptime
$ fab --list

でfabfile.pyに定義されているタスク一覧を表示する。

ホストの定義はenv.hosts または env.roledefsで。
env.hosts = [ 'host1', 'host2' ]
# or
env.roledefs = { 'web': ['host1', 'host2'] }
並列実行
fab -P  -H host1,host2,host3 -- uptime
たくさんのホストにコマンドを実行する時にpasswordをきかれまくる場合

最初にパスワードを入力する

$ fab -I -H host1,host2,host3 -- uptime

引数にパスワードを渡しちゃう(セキュリティ的にオススメできない)

$ fab -p <password> -I -H host1,host2,host3 -- uptime
taskに引数を渡す
$ fab create_user:username=oinume
途中でエラーが発生しても処理を継続させる

-wで失敗しても処理を継続。デフォルトは失敗したらその時点でAbortする
fabfile.py の中で

with warn_only():
    pass

でも可

よくあるユースケース

リモートのサーバにコマンドを発行する
$ fab -H host1,host2,host3 -- mpstat -P ALL 1 1
サーバにファイルをアップロードする
from fabric.api import put

put('authorized_keys', '.ssh/authorized_keys')
rsyncでサーバにファイルをアップロードしたい
from fabric.contrib import project

project.rsync_project(local_dir='authorized_keys', remote_dir='.ssh/authorized_keys')

rsyncはローカルマシンから rsync コマンドを実行するだけのようだ。

rsyncでサーバからファイルをダウンロードする
  • rsync_project()の引数にupload=Falseを指定する
  • サーバが複数ある場合はダウンロード先の /tmp/my.cnf が上書きされちゃうので、ホスト名をサフィックスにつけている。env.host 現在実行しているホスト名が取れる。
from fabric.api import env
from fabric.contrib import project

project.rsync_project(remote_dir='/etc/my.cnf', local_dir='/tmp/my.cnf.' + env.host, upload=False)

Fabricのその他の豆知識

  • colorize-errors: エラーが発生したら赤字になる
  • hide=LEVELS: 出力する情報を制限できる。例えばhide=stdout,stderr,running と指定すると一切の情報が出なくなる
    • stdout: コマンド実行時の標準出力
    • stderr: コマンド実行時のエラー出力
    • running: 実行時の出力
  • -x HOSTS: 対象外にしたいホスト名を指定
  • -i PATH: SSHの秘密鍵を指定できる

Pythonサポーターズ

技術評論社

売り上げランキング: 12,569