タグ

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

  • 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
  • python2.6からはepoll、kqueueが使える - Doge log

    こんにちは!DQNです! python2.6はいろいろ変更点が入って便利になります。 python2.6からはselectモジュールにepoll、kqueueが追加されます。 DQNが思うに変更点の目玉のひとつかだけど余り触れられてないと思うので書いて見る。 ほぼCのラッパーなので使い方もほぼ同じです。 Macなのでkqueueのサンプルです from select import * kq = kqueue() file = open('test.txt', 'r') ke = kevent(file.fileno(), KQ_FILTER_VNODE,\ KQ_EV_ADD|KQ_EV_ENABLE|KQ_EV_ONESHOT,\ KQ_NOTE_WRITE|KQ_NOTE_DELETE, 0, 0) active = True while active: events = kq.con

    python2.6からはepoll、kqueueが使える - Doge log
    Surgo
    Surgo 2012/05/14
  • protocolを使って既存の関数の振る舞いを変える - Doge log

    こんにちわ、高校生です。 今回はprotocolを使った話です。 通常の場合 user=> (bit-and "生" "死") IllegalArgumentException bit operation not supported for: class java.lang.String clojure.lang.Numbers.bitOpsCast (Numbers.java:994) bit-andはNumbersしか受け付けない関数なので当たり前のごとくうまくいきません。 異なる型でもいい感じに処理をして欲しい場合にはprotocolで既存関数も拡張ができます。 (defprotocol bit-protocol (bit-and [x y])) (extend-protocol bit-protocol java.lang.String (bit-and [x y] (let [a

    protocolを使って既存の関数の振る舞いを変える - Doge log
    Surgo
    Surgo 2012/03/28
  • jinja2風なテンプレートをパースする - Doge log

    こんにちは、高校生です。 Parserはいつも人の使ったり、ragel先輩に吐かせたり楽してたのですがシンプルなものなら書けるかなと思い書いてみました。 (import '(java.util.regex Pattern)) (require '[clojure.string :as string]) (def sp-chars #"([\\\\*+\\[\\](){}\\$.?\\^|])") (def ^:dynamic *bt* "{%") (def ^:dynamic *bv* "{{") (def ^:dynamic *bc* "{#") (def ^:dynamic *et* "%}") (def ^:dynamic *ev* "}}") (def ^:dynamic *ec* "#}") (defrecord Text [data]) (defrecord Tag [data

    jinja2風なテンプレートをパースする - Doge log
    Surgo
    Surgo 2012/03/16
  • 継続的にタスクを実行するleiningen plugin - Doge log

    こんにちわ、高校生です。 leiningenも2.0-previewが出てきていろいろ機能強化されてきていますね。 ただleiningen 2.0ではinteractiveタスクがなくなっています。 ビルド毎にleiningenを起動をするのもだるいなあと思い、プロジェクト内のファイル変更を監視し タスクを起動するpluginを書きました。 もちろんleiningen 2.0じゃないと動きません。 (ns leiningen.cont "Continuous target task" (:use [clojure.string :only (split)] [clojure.repl :only (pst)]) (:require [leiningen.help :as help] [watchdog :as watchdog])) (defn- create-taskmap [task

    継続的にタスクを実行するleiningen plugin - Doge log
    Surgo
    Surgo 2012/03/14
  • 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
  • web2pyを使おう! - Doge log

    おはようございます!小倉智昭です! ちんこうp!ちんこうp! いやあid:moriyoshiがパイプカットするとかしないとかで盛り上がってる中恐縮なんですが今回は @aodag先生から、アドベントカレンダーが回ってきたのでその話をしたいと思います。 web2py webフレームワークということなので今回はweb2pyを紹介したいと思います。 正直書くことがなくて困ってたので「ドキッ!漢字だらけのwebサーバ、eurasia」の話を書こうかと 思ったですがやめました。 漢字読めないし。 で話を戻します。 よくpython初心者に使うwebフレームワークなら何がいいですけねー?みたいな話がありますが、 もちのろん答えは決まっています。pyramidじゃなくweb2pyです。 djangoなんて難しいので使ってられません。 web2pyはシンプルにwebアプリケーションを書けるフレームワークです

    web2pyを使おう! - Doge log
    Surgo
    Surgo 2010/12/03
    "Python C/APIで拡張モジュールを書くときにMakefile書くとかそーいう嘘情報は無視してください。"
  • Python Hack-a-thonで話してきた - Doge log

    そんときの資料です。 meinheldView more presentations from Yutaka Matsubara. とりあえず書いたって感じ

    Python Hack-a-thonで話してきた - Doge log
  • http_parserを乗せ変えた話 - Doge log

    こんにちわ、情弱DQNです。 最近は寝かしていたpicowsを見直しています。 その時にとある事が気になったのでhttp_parserを乗せ変えました。 でその時の話。 以前まで 今まではmongrel, thinなどでも使われているZedの書いたragelベースのhttp parser を使用していました。 もちろんですが、python版に書き直しています。 (余談ですがeventletの作者も同じようなものを作ってますが、メモリリークしてます...) ragelベースのparesrは記述が比較的楽だし、それなりに速いので便利です。 (ただコールバックスタイルが好きかどうかって話もあるかも知れません) mongrelのパーサの処理の流れは大体こんな感じです。 start actionで開始位置のポインタをマーク 読み進め、条件にマッチしてるか判断 条件にマッチしなくなるとendと解釈 e

    http_parserを乗せ変えた話 - 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
    Surgo
    Surgo 2010/08/30
  • meinheld websocket - Doge log

    こんにちわ、しのまりファンことmopemopeです。 meinheld 0.3よりwebsocketをサポートする予定です。 websocketはmiddleware経由で取得できます。 WebSocketMiddlewareを使うとenvironからwebsocketを取得できます。 シンプルなチャットはこんな感じ。 meinheld/websocket_chat_simple.py at dev · mopemope/meinheld · GitHub import os from meinheld import server, middleware, websocket participants = set() """ @websocket.WebSocketWSGI def handle(ws): participants.add(ws) try: while True: prin

    meinheld websocket - Doge log
    Surgo
    Surgo 2010/08/30
  • tornadoの話 - Doge log

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

    tornadoの話 - Doge log
    Surgo
    Surgo 2009/09/28
    [tornade]
  • 1