タグ

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

  • 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
  • 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
  • 継続的にタスクを実行する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
  • 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
  • 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
  • virtualenv - Doge log

    最近、流行りのvirtualenvですが、仕組み的なものにあまり触れられてないように 思えたので書いてみます。 機能 とりあえずvirtualenvの機能は ライブラリがまっさらな状態な環境を作る 作られた環境に対してのみモジュールをインストールできる です。 これを実現する仕掛けはそれほど難しくありません。 (virtualenv自体も基的に1ファイルのモジュールです。) とりあえず簡単に見ていきます。 ライブラリパス まっさらなライブラリを持った状態のpython環境はどうやって作るのでしょう? pythonは自分自身のパスの上位のlib/pythonx.xをライブラリとして認識します。 (pythonをソースからprefix指定でビルドした事があればわかると思います。) . |-- bin | `-- python `-- lib `-- python2.5 `-- ここが標準ライ

    virtualenv - Doge log
  • multiprocessing入門 - Doge log

    multiprocessingといっても今まであったos.forkをうまくラップしてくれてる というだけなのでプロセスをforkしたらどうなるの?っていうのを知らないと 扱えないと思われる。 forkすると子プロセスには今までの状態がコピーされるがその後はメモリ空間が 別々になる。 (当たり前の話) だが開いているfdとかファイルエントリテーブルなどは共有される。 どのタイミングでforkするかが個人的には重要。 例ではPIPEはいっさい使ってない。 from multiprocessing import current_process, cpu_count, Process, Manager, Queue import time class Parent(object): def __init__(self, name): self.name = name self.queue = Qu

    multiprocessing入門 - Doge log
  • 文字列連結の効率の話 - Doge log

    追記: ベンチ追加した ふと思ったこと。 ret = ''.join([lst]) が速いというのは正しい。 でもそれはjoin関数が速いという局所的な話。 ありがちなコード lst = [] for i in xrange(10000): lst.append("aaa") ret = ''.join(lst) string joinを使いたいがためにlistをpythonのforで回したりして作成する。 string joinの中身 static PyObject * string_join(PyStringObject *self, PyObject *orig) { char *sep = PyString_AS_STRING(self); const Py_ssize_t seplen = PyString_GET_SIZE(self); PyObject *res = NULL

    文字列連結の効率の話 - Doge log
  • シンプルなWSGIサーバ picows - Doge log

    WSGIサーバの勉強がてらシンプルなWSGIサーバを書き始めした。 まだ全然できてませんけど。 特徴 シングルスレッド 非同期 WSGIのみサポート これだけです。シンプルです。 呼び出しもシンプルでひとつのwsgi appしか載せられません。 他にもシンプルな理由は「全部Cで書いてある」って点もあるかも知れません。 ファイルもpicows.soのみです。 技術要素 picoevベース ragelで吐いたrequest parser 一部のObjectはヒープに直接のっける cStringIOのAPIを直接使用 一応少しはパフォーマンスに気を使っています。 ragelベースの簡易HTTPパーサーなのでチャンクとかそういうのできません。 パフォーマンス まだ細かい部分はできてないです、びみょーですけど。 まだロギングしてないので、同様なfapws3と単純なhello worldで比較してみま

    シンプルなWSGIサーバ picows - Doge log
  • Mercurialのhookをplugpyで書く - Doge log

    まだbranchなんだけど思いついたので書いておく。 次で入れるかも。 Mercurialのhook Mercurialのhookはpythonで書くことができる。 設定するには.hgrcに [hooks] #python:<モジュール名>.<メソッド名> update=python:foo.bar "python:"ではじめて、<モジュール名>.<メソッド名>と書いておくと呼ばれる。 まあ呼ばれるんだけどふつーのモジュール扱いなのでhook用のscriptは PYTHONPATHを通すか、あるいはパッケージにしてinstallなどpythonから見える ようにしなくてはならない。 まあそれがめんどいなあと思ったのでplugpyにhg用のextを追加してみた。 plugpyを使う 設定はこんな感じ [hooks] update=python:plugpy.hg.hook commitだろう

    Mercurialのhookをplugpyで書く - Doge log
  • 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