タグ

ブックマーク / mopemope.hatenablog.com (15)

  • Jegaをリリースした話 - Doge log

    先日、やっとリリースしました。 tobikko時代から考えると数年がかりいじってた気がします。 Jegaについて concurrent networking and cooperative multitasking library for Python3. わかりやすく言うとgeventの後継ライブラリになります。 Python3.x系しかサポートしていません。 URL: https://github.com/mopemope/jega 特徴 Jegaはgevent、evergreen, PEP3156を参考に作られています。 機能的なところはほぼevergreenと同様です。 主な特徴は以下です。 picoevベースの高速なイベントループ greenletベースの協調スレッド c-aresよるDNS lookupの非同期化 非同期処理はFutureにより管理(専用のconcurrent.

    Jegaをリリースした話 - Doge log
  • Common LispでPythonのgeneratorを実装する - Doge log

    結局Lisp書かないとダメだということで格的にPythonから移行しようと思ってます。 まず、今使ってるツールなどをLispに置き換えようと思ったらまあgeneratorが無くてめんどいことに。 というわけでgeneratorを実装しておく。 この手はみんな実装してるので珍しくもなんともない。 定番のcl-contを使う。 (require 'cl-cont) (defun mkstr (&rest args) (with-output-to-string (s) (dolist (a args) (princ a s)))) (defun symb (&rest args) (values (intern (apply #'mkstr args)))) (defun flatten (x) (labels ((rec (x acc) (cond ((null x) acc) ((ato

    Common LispでPythonのgeneratorを実装する - Doge log
  • Python3 Advent Calendar - Pythonで2/3両方で動くコードを書く(C/API) - Doge log

    これは Python3 Advent Calendarの記事です。 こんにちわ、高校生です。 先日、子供(遼くん)が無事生まれましたが、毎日お世話で忙しいです。 Python3 Advent Calendar ということでPython3に関して書いてみたいと思います。 Python3対応というのはまあいろいろあるんですが、Pure Pythonで両方動くコード書こうとなると文法とかいろいろ面倒ですね。 ですがC/APIで書くとマクロで大きく処理を2系、3系と切り替えができるのでので容易に両バージョンをサポートするコードが書けます。 ということで2/3両方をサポートするコードをC/APIを中心に幾つか書いてみたいと思います。 (3系といっても3.2以降と思ってください) Python3の判別 Python3であるかどうかは元々用意されているPythonのバージョンを確認できるマクロで容易に判

    Python3 Advent Calendar - Pythonで2/3両方で動くコードを書く(C/API) - Doge log
  • PySpaアドベントカレンダー 22日目 - Doge log

    はじめに このエントリはPySpaアドベントカレンダーの22日目のエントリです。 PHPとかJavaがクソとか言うエントリではありませんのでご注意願います。 PySpaについて まあ言うことはありません。ロビーでイリーガルな話やヒドいい話などをする合宿です。 コードとか二の次であってみんなの闇を共有する合宿です。 多分逮捕者がでてもおかしくないです。 最近作ってるもの せっかくなので最近作ってるもの話をしておきます。 dismage dismage - MySQL Protocol Server 要は MySQL Protocol を話す Server です。WSGI ライクなインターフェイスを持っています。 isucon 用に作りはじめたのがきっかけです。内部は libdrizzle で作られています。 全て非同期のAPIを使って実装されていますが、毎度のことながら greenlet で

    PySpaアドベントカレンダー 22日目 - Doge log
    heavenshell
    heavenshell 2012/12/22
    dismage!
  • twisted reloaded - Doge log

    twistedを使って開発してるひとがどれくらいいるかわかんないけど。 twistedを使ってると書き換えるたびいちいちサーバを再起動しないといけなかったりする。 djangoなんかは勝手に開発サーバが再起動されるので楽なのに>< いろいろ探したけどtwistedのautoreloadが見つからないので自分で書いてみた。 twisted.python.rebuildではとてもじゃないけど難しすぎ。 なのでWAITを使う。 参考にしたdjangoのautoreloadも元々はCherryPyのコードらしい。 CherryPy3.0からAutoReloadがサポートされてるんだけど同じ方式かな? twistd_reload #!/usr/bin/python from twisted.internet import reactor import sys, os, string, time if

    twisted reloaded - Doge log
  • meinheld Cotinuations - Doge log

    こんにちわ、韓流スターことmopemopeです。 meinheld 0.2よりContinuationをサポートしました。 これでlong poll(comet)も組めるようになります。 chatの例:http://github.com/mopemope/meinheld/tree/master/example/chat/ from flask import Flask, render_template, request, session, jsonify import uuid from meinheld import server, middleware SECRET_KEY = 'development key' DEBUG=True app = Flask(__name__) app.config.from_object(__name__) def create_message(f

    meinheld Cotinuations - Doge log
  • meinheldをリリースした - Doge log

    こんにちわ、闇金業者です。 Cの練習とPEP333の実装として作っていたpicowsですが、せっかくなのでpypiにあげることしました。 名前も変えてmeinheldにしています。 meinheld · PyPI あとbitbucketもなんだか寂しい気がしてきたのでgithubに移動しました。 http_parserの変更など中身は大分変わっています。 明らかに過度のチューニングです。 hello_worldでabでベンチをとるといかに過度のチューニングであるかわかります。 インストール linux onlyです。 pypiから easy_install -ZU meinheld 使いかた 使い方は特に難しくありません。 from meinheld import server def hello_world(environ, start_response): status = '200

    meinheldをリリースした - Doge log
  • plugpyをリリースした - Doge log

    こんにちわ、あらびきプログラマーmopemopeです。 某ライブラリをpythonに移植しようとしてて、plugin周りはなんだかかライブラリ化した方が良さそうだっだので適当に作りました。 plugpy · PyPI 基実装は以下の奴です。 Pluginシステムの実装 - def __mopemope__(self, *args, **kwargs): Pluginの書き方 制限はコンストラクタに引数を持たないといかんって事ぐらいであとは自由です。 一応デフォルトでPluginクラスを継承を推奨します。 (Pluginはコンストラクタに引数を持っています) 足し算するplugin plugins/test_plugin.py from plugpy import * class TestPlugin(Plugin): def on_test(self, x, y ): return x

    plugpyをリリースした - Doge log
  • eventletのクライアントコードサンプル - Doge log

    書いてる人ほぼ見たことないので書いておくかな。 from os import path import eventlet from eventlet.green import urllib2 from pyquery import PyQuery as pq from urlparse import urlparse empflix_url = 'http://www.empflix.com/browsecat.php?page=%s&chid=17&category=mr' save_path = "/tmp" pool = eventlet.GreenPool(2) def get_asian(page=1): q = [] conn = urllib2.urlopen(empflix_url % page) page = conn.read() d = pq(page) for spa

    eventletのクライアントコードサンプル - Doge log
    heavenshell
    heavenshell 2010/05/21
    eventlet のサンプル
  • Flaskを触ってみる 1 - Doge log

    Flaskですがあんまり書かれてなさそうなので書いておきます。 Flaskはmitsuhiko先生が作ったmicroframeworkです。 Flaskが指すmicroは単純に小さいというわけではなく、他のライブラリをつなぎ、シンプルなAPIを 提供する小さなフレームワークのようなイメージです。 Flaskは werkzeug jinja2 に依存し、単体の機能はそれらに任せています. Flaskそれらをうまくつなぎ合わせ、シンプルなAPIをユーザに提供しています。 そのため、Flaskは1ファイルで構成されています。 (つなぎの部分なので小さい。APIのドキュメント込みで900行を切っている) 一応Flaskはmicroframeworkとしていますが、コアはwerkzeugです。 werkzeugは大規模サイトなどの実績もあり、大変便利なライブラリです。 Flask自体で提供されていな

    Flaskを触ってみる 1 - Doge log
  • sqlalchemyで結果をキャッシュする - Doge log

    こんにちわ、sqlalchemyを日で一番使い倒してるであろうmopemopeです。 sqlalchemyのcacheに関して具体的なコードを書いている人がいないのはみんなexampleのあれを見てるからなのか? と思ったのですがあえて書いてみます。 SQLの内容を60秒間キャッシュする例: import hashlib from sqlalchemy import create_engine, MetaData from sqlalchemy.orm import create_session, scoped_session, mapper as sqla_mapper from sqlalchemy.orm.query import Query from sqlalchemy.sql import visitors class CachingQuery(Query): _timeou

    sqlalchemyで結果をキャッシュする - Doge log
  • paverで最新のソースを取得する - Doge log

    僕はsvnやhgなどで落としてるライブラリをあるdir配下にまとめている。 こんなカンジで。 (あくまで例ですよ) ./ -- bespin -- bruce-tpt-read-only -- ctypesgen-read-only -- django -- django-command-extensions -- eventlet -- gaeutilities-read-only -- google_appengine -- jaikuengine-read-only -- jinja2-main -- mako -- nevow -- paver-read-only -- pinax -- pinsor -- projectmgr -- py3k -- pypy-dist -- pyquery -- python26 -- python27 -- remedie -- rope --

    paverで最新のソースを取得する - Doge log
  • tornadoの話 - Doge log

    話題のtornadoについてちょっと書いておきます。 フレームワークについて tornadoは一応wsgiをサポートしていますが気で組むなら独自で持ってるAPIの方がよいでしょう。 独自のAPIの方は必要最低限な処理しかしません。 無駄なアプリケーションコードを少なくすることでパフォーマンスを得ています。 もちろんアプリケーションコード実行間はブロックしていますが、その時間をなるべく少なくしようという 観点で薄いフレームワークになっています。 (ほとんど1ファイルの小さなモジュールになっているはずです) ここで変にwsgi対応のFWを乗せたりしようもんならパフォーマンスはかなり落ちるのでやらない方がいいでしょう。 wsgiはインターフェイスがぬるいためFW側で結構な量のコード実行することになります。 ハッキリいってpythonはそこまで速くありませんのでチリも積もれば。。。といった感じで

    tornadoの話 - Doge log
  • pythonistaのためのphp用の開発サーバ - Doge log

    phpで開発する時の開発用サーバとかよくわからなかった。 未だにapacheとか云々するのもなんだかなあと思うんだけど。 まあpythonistaならwphp使うよねって話。 wphp http://pythonpaste.org/wphp/ こいつはwsgiのインターフェイスでphpをfastcgiで動かしてくれる。 from wphp import PHPApp from wsgiref.simple_server import make_server my_php_app = PHPApp('/path/to/php-files/', php_options={'magic_quote_gpc': 'Off'} ) httpd = make_server('', 8000, my_php_app) httpd.serve_forever() とまあこれでOK。 でもデフォルトでは基

    pythonistaのためのphp用の開発サーバ - Doge log
    heavenshell
    heavenshell 2009/02/25
    これは面白いなぁ。
  • Python力を高めるためのライブラリコードリーディング - Doge log

    id:yuroyoropython力を高めるとか言ってたのを聞いて、自分の場合どうだったかなあと。 思い入れがあるものを簡単に。まあ参考になれば。 pure python系 まずはpure python系 django 結構python初心者のころからdjangoのソースは読んでた。 多分、今ほど大きくなかったからだと思う。 学べることはPEP8、__import__の使い方、デコレータによるトランザクション管理などなど多岐にわたる。 但し、いきなりモデル周りに手を出すときついのでWEB側の入り口である方 django.core.handlers.base.py ぐらいがいいかなと。 middlewareってどうやって呼び出し、実行してるか、urlの解決方法などから入ると割りととっつきやすいかと。 フルスタック故カバーしてる範囲が多いのでずっと参考になる。 標準ライブラリのソース あんま

    Python力を高めるためのライブラリコードリーディング - Doge log
  • 1