サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ブラックフライデー
qiita.com/methane
NOTE: この記事は Inspecting Errors を翻訳したものです。 原文に従い、 Creative Commons ライセンスで公開します。 error インターフェイス型の値を返す関数の一般的な契約は、呼び出し側はその error をチェックする前にそれ以外のいかなる戻り値も利用してはいけないというものです。 多くのケースにおいて、関数が返した error 値は呼び出し元にとって不透明であるべきです。 error が nil かどうかチェックすることで呼び出しが成功したかどうかを知ることができ、そしてそれ以上のことはしません。 少ないケースにおいて、主にネットワークなどプロセス外の世界とやりとりする場合に、呼び出し側がエラーの種別を調べて、操作をリトライするべきかどうかを決める必要があります。 パッケージ作者に対して、呼び出し側がエラーの型を判別して利用できるように返すエラ
原因 stringer がコード生成する際に、単に AST を作るだけじゃなくて型チェックなどまで行っていて、その中の import チェックでこけています。 GOPATH が通ってるのに import がコケてるのは、 golang.org/x/tools/gcimporter が $GOPATH/pkg/ 配下から $GOPATH/pkg/pkg.a などのファイルを探していて、 Go のソースファイルは探していないせいです。 憶測ですが、Go のパッケージ名は慣習的にディレクトリ名と同じになっていますが、実際には package 文にはディレクトリ名以外の名前を指定することもできるため、コンパイラを呼び出さずに高速に解析するための制限なのかもしれません。 解決策1: go install する 上の例で言えば、 go generate pkg の前に go install pkg/s
Windows 用に Python のバイナリパッケージを作成するときに知っておいたほうがいい基礎知識や便利情報をまとめて書いていきます。 Windows でのバイナリパッケージの重要性について Windows 上で Python を使っているユーザーは、 Python の拡張モジュールをビルドする環境を持っている可能性はとても低いです。 もともと Mac に比べてコンパイラをインストールしているユーザーが少ない上に、 Mac 版では OS のバージョンごとにコンパイラが固定されるのに対して、 Windows では OS ではなく Python のバージョンによってコンパイラのバージョンが決まるという事情もあり、自分で調べて Python の開発環境を揃えている人以外が適切なコンパイラをセットアップしている可能性はゼロに近いです。 一方で Windows では python.org が提供
Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article?
h2o Advent Calendar の2日目です。 h2o はスタンドアロンの HTTP サーバーだけでなく、 libh2o というライブラリとしてビルドすることもできます。今回は libh2o をビルドして、 hello world サーバーを作るまでやってみます。 環境は Ubuntu と Mac OS X を想定しています。 cmake h2o はビルドシステムに cmake を利用しています。 brew なり apt-get なりで cmake を用意しておきましょう。 他に、後述する libuv のために automake, libtool が必要です。 C++ も入ってなかったら用意しておきましょう。 libuv h2o のスタンドアロン版では libuv 1.0.x への依存が optional なのですが、 libh2o では必須になっているようです(少なくとも僕は l
datetime モジュールは Python の標準ライブラリの中でも、使用頻度が高い割に罠が多かったり使い方が難しかったりする、あまりイケてないモジュールだと個人的に思っています。 そんな datetime モジュールですが、 Python 2 のプロジェクトを Python 3 に移行した時に大分コードを整理できてちょっと感動したので紹介しておきます。 unixtime との相互変換 unixtime から datetime.datetime への変換は、 ローカルタイムなら.fromtimestamp() で、 UTC なら .utcfromtimestamp() 関数で行います。 >>> import time >>> from datetime import datetime >>> now = time.time() >>> now 1415542873.099776 >>>
ISUCON の季節ですね。 ISUCON では慣習的に各言語で代表的なマイクロフレームワークが使われるのですが、 Python では今のところ Flask がずっと使われています。 Flask は確かに、簡単なサンプルアプリを書くときの見た目はマイクロフレームワークになっています。 しかし、構造的には沢山のフック、シグナルがあったりしていて、重量級の設計になっています。 Flask 本体と Werkzeug を合わせると数万行のサイズです。単なる Hello World アプリでも、数十の関数呼び出しが裏で動いています。 Bottle も、 Flask と同じくマルチスレッド対応で、スレッドローカルを使ったコンテキストスタックがある、拡張機能もあるフレームワークですが、構造は Flask よりも大分質素です。 ソースコードも1ファイル3000行代で、その分フレームワークのオーバーヘッドも
コネクションプールと prepared statement database/sql は、トランザクションを除いて基本的にコネクションをユーザーに見せず、全ての操作をコネクションプール sql.DB を通して行う設計になっています。 コネクションプールと言えば、 prepared statement の実装が気になります。 prepared statement は基本的にコネクションに紐付いていて、 プレースホルダ付きのクエリを投げてコネクションローカルの「ハンドル」を貰う 「ハンドル」にパラメータを送ってクエリを実行する 「ハンドル」を閉じる(あるいはコネクション自体を閉じる) という流れになるので、コネクションプールと組み合わせて使う場合には、 毎回ハンドルを取得&開放する (1クエリに3回通信が発生) ハンドルを開放しない (DBサーバー側のリソースを食いつぶす) コネクションごとに
Travis-CI には Github release にファイルを登録する機能があります。 (参考) この機能と Go のクロスコンパイル機能を使って、 tag に自動的に Windows 向けのバイナリを登録してみます。 成功したリポジトリがこちらにあります。 methane/localserver Makefile で Windows 向けバイナリを作る GOOS と GOARCH を指定してクロスコンパイルし、 Github にアップロードしたい zip ファイルを作ります。ここでは Windows 用の 32bit 版だけ用意しています。この例では localserver-win32.zip が生成されます。 Travis CLI を使って準備 gem install travis をして、 travis のコマンドラインツールが実行できるようにしておきます。 (gem とか面倒
zip ファイルは最近の仕様では UTF-8 でファイル名を格納できるのですが、多くの場合レガシーな環境依存文字コードでファイル名が格納された形式が使われています。日本語の場合は Windows に合わせて Shift-JIS (cp932) が使われることが多いです。 Python 2 では zipfile モジュールが返すファイル名はバイト文字列だったのでそのまま cp932 のファイル名が返ってきたのですが、 Python 3 では文字列が Unicode に統一されたため、 zip ファイルを読み込むとファイル名がデコードされて文字列になって返ってきます。 が、もちろん日本語の慣習がデフォルトの挙動になってるわけではないので、このままでは文字化けしてしまいます。 Python 3.4 の zipfile モジュールを読むと次のようになっていました。
Flask アプリのテストで、簡単なものなら sqlite のメモリDBを使えば良いですが、複雑なアプリだと本番環境と同じ RDBMS を使って実行したいことが多いです。 その際、テストごとにDBを初期化すると遅いので、コミットせずに毎回ロールバックで対応したいのですが、 Flask.test_client や WebTest などを使って複数のHTTPリクエストを行うテストでは、リクエストをまたいでデータを引き継ぐ必要があります。 これを実現するために、 テスト中は session.commit() を session.flush(), session.expire_all() に置き換える リクエスト終了時、通常は session.remove() し、テスト中は session.expire_all() する テストごとに session.remove() する。 というカスタマイズ
ロギングの環境設定 という公式ドキュメントにも警告があったのですが、思いっきりハマってしまったので記事にしておきます。 Python の logging モジュールは、 addHandler() などのメソッドを呼び出して構成する以外に、 ini 形式の設定ファイルを元に構成する logging.config.fileConfig() や、 dict 型の設定情報を元に構成する logging.config.dictConfig() を使って構成することができます。 import logging.config logging.config.dictConfig({ 'version': 1, 'handlers': { 'default': { 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'stream': 'ext://sys.
便利な Enum 型 ですが、 Web アプリで使う場合は O/R Mapper でそのまま使いたいですよね。 SQLAlchemy は、 TypeDecorator を使って、既存の型をラップした独自型を簡単に定義できます。 Integer をラップして Enum を保存してみます。 from __future__ import print_function, division, absolute_import from sqlalchemy import Integer from sqlalchemy.types import TypeDecorator class EnumType(TypeDecorator): """Store IntEnum as Integer""" impl = Integer def __init__(self, *args, **kwargs): sel
2012 Pythonアドベントカレンダー(Webフレームワーク) #python_adv の5日目担当です。 この記事は自分のBlogとのマルチポストになります。 http://methane.hatenablog.jp/entry/2012/12/05/134206 Flaskはオモチャじゃないよ PyCharmなどのIDEがFlaskに対応を始めたり、Flask はそろそろ Django に続く Python の Web フレームワーク No.2 と名乗れそうなほど広まってきています。(その割にPython3対応遅いけど) Flaskと言えばマイクロフレームワーク、Hello World が簡単に書けるヤツで有名ですよね。 これを見るとオモチャっぽく見えるんですが、Flaskは1つのPythonインタプリタに複数のアプリを載せたり、1つのアプリの複数のインスタンスを載せたりできるしっ
Linux で Python をビルドするとき、 --enable-shared という configure オプションがありるので、その解説とTipsを紹介します。 具体例として Python を挙げていますが、話の内容のほとんどは他の言語やライブラリでも共通だと思います。 --enable-shared とはなにか このオプションを指定しない場合、主要なバイナリファイルとして python という実行ファイルと libpython2.7.a (Python 2.7の場合) というライブラリファイルができます。 --enable-shared をつけた場合、 libpython2.7.so というダイナミックリンク用の shared object も生成され、 python はこの shared object をダイナミックリンクするようになります。 Debian などの Linux デ
PyFes 2012.11 発表資料です。 システムコールに焦点を当てて、 meinheld のアーキテクチャを紹介します。 アーキテクチャを説明するために Pure Python でサンプル実装を書いていますが、ちゃんと動くし、HTTPリクエストのパースを端折っているので 10000req/sec 以上出ます。 イベントドリブンのコードでフローが判りにくい場合は python -mtrace -t --ignore-module socket webserver1.py などのようにトレースしながら実行するといいでしょう。 前提 今日は、シンプルなレスポンスを返すだけの条件でをひたすら req/sec を追求する話をします。 たとえば、 nginx の lua モジュールで "hello" と返すだけとかです。 静的ファイルを配信するサーバーとかだともっと別のことも考えないといけません。
ある条件でソートされているIDのリストを与えられて、なんとなく近い範囲でマッチングさせたいという要件があった。配列からの任意の要素の取り出しは O(n) だけど、末尾や末尾から固定した範囲の要素に限って言えば O(1) なので、後ろの方からマッチングさせながら要素を取り出していけば O(n) でマッチングできるはず。 なんにも難しいことは無い話で、 Python で書けばこうなる。 list.pop() が末尾からのインデックス (-1 が最後の要素を表す) を許すのが地味に便利だ。 # coding: utf-8 def match(seq, r=100): from random import randint # 奇数個の時に先頭周辺の要素がボッチになるのが嫌なら、先に後ろの方の # 要素を取り除いて偶数にしておくこと. while len(seq) >= 2: # 引数を省略すると末
Python の標準ライブラリのファイル操作、 os にあるのか os.path にあるのか、 shutil にあるのかで悩むことないですか? paver.path モジュールにある path クラスを使うと、ファイル操作が Python の標準ライブラリよりも簡単になります。 使い方 path クラスも paver.easy に入っているので、 from paver.easy import * してあると path だけで利用できます。 この path クラスは文字列を継承して、その文字列を引数に取るような操作をするメソッドを定義しています。また / 演算子にパスの結合操作をオーバーライドしていたり、その他さまざまな便利メソッドを定義してあります。 >>> from paver.easy import * >>> root = path('/') >>> root path(u'/')
このページを最初にブックマークしてみませんか?
『@methaneのマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く