タグ

ブックマーク / methane.hatenablog.jp (19)

  • Go にジェネリクスがなくても構わない人たちに対する批判について - methaneのブログ

    なんども繰り返される話でうんざりなんだけど、繰り返されるたびに反論するのもアレなので、URL貼れるように記事にしておく。 Goが頑なにジェネリクスいらないというだけ他の言語勢から失笑買ってるというのは自覚して— {{alert()}} (@mizchi) 2017年9月19日 頑なに要らないと言ってる人が具体的にどの発言のことを差してるのか分からないけど、コア開発者たちはツールチェインやランタイムの進化を優先していただけで頑なに拒否してたりはしません。今はツールチェインやランタイムが大分進化したから、Goの適用範囲を広げるためにジェネリクスを含めて機能追加も検討し始めようかっていうフェーズです。 あとどの言語にもちょっと公平的な見方ができなくなった痛いファンはいるもので、そういった人たちをいちいちあげつらってこういう言い方で失笑するのは、別に止めはしないけど自分の格を下げるだけだと思う。

    Go にジェネリクスがなくても構わない人たちに対する批判について - methaneのブログ
    ikeikeikeike
    ikeikeikeike 2017/09/20
    Goで縛りプレイの話
  • CPython の Core Developer になりました - methaneのブログ

    Python 3.6 に取り込まれた dict の新実装などでコアコミッターに興味を持ってもらい、 Core Developer (要するにコミッター) に推薦しようか?という提案をもらいました。 最初はコミッターとか面倒そうだし、コミットメッセージとかNEWSエントリー(通常パッチをコミットするときにコミッターが書く)とかを英語で書くのも英語が得意な人がやったほうがいいだろうし、とりあえず github に移行するまでは様子見しておこうと思ってたのですが、 dict 関係のパッチがいくつもレビュー待ちでなかなかコミットされないのを見て「やっぱりアクティブなコミッターが全然足りてない」と考え直し、志願することに。 で、先月末にコミット権をもらった(というか push できる権限を持った hg アカウントに ssh 鍵を登録してもらった)のですが、新米コミッターは簡単なパッチでも他のコアコミ

    CPython の Core Developer になりました - methaneのブログ
  • Python と Ruby と typing - methaneのブログ

    うーん、structural subtypingとダックタイピングは同じものなんだろうか。— Yukihiro Matsumoto (@yukihiro_matz) 2016年9月8日 https://t.co/5Rv86piThC wikipediaによると似て非なる物のようですね。 https://t.co/VwIg39h5M0— INADA Naoki (@methane) 2016年9月8日 この話題について補足しておきます。なお、僕はTAPL脱落組なのであまり正確性は期待しないでください。 背景 Ruby Kaigi で Matz が Ruby3 に向けて考え中の静的型について話されたようです。 少し前から、 Python でも Guido が Dropbox での大量のコードベースを改善していくために type hinting がほしいということで PEP 484 を始めました

    Python と Ruby と typing - methaneのブログ
  • CPython の GC チューニング - methaneのブログ

    ISUCON は Go で参戦しているんだけど、複数のチームが Python で予選通過したらしいので、応援のために Tips を公開していこうと思う。 目次 CPython の GC について 統計情報を出力する 第一世代GCの間隔を調整する Out of Band GC 循環参照を見つけて対処する CPython の GC について CPython のGCは参照カウント+循環参照コレクタだ。そして参照カウント方式は(幾つかの欠点はあるものの)Webアプリのボトルネックになったりはしにくい。 なのでGCチューニングの基は次のようになる。 循環参照を避ける 循環参照コレクタの呼び出しタイミングを制御する 循環参照コレクタは、生きているオブジェクトの数がある程度増えると第一世代が実行され、第一世代が一定回数実行されると第二世代が、第二世代が一定回数実行されると第三世代が実行される。 各世代

    CPython の GC チューニング - methaneのブログ
  • PyMySQLのメンテナにSQLAlchmey開発者のMike Bayer (@zzzeek)さんが参加しました - methaneのブログ

    このブログでも数回紹介していたとおり、今メジャーな PythonMySQL ドライバ3つのうち2つ (MySQL-python の fork の mysqlclient と PyMySQL) を僕がほぼ単独でメンテナンスしている状況でした。 メンテナンスしているといっても、両方とも MySQL-python との互換性を第一に掲げているので、 Python 3 対応が終わった後はほとんど進化は無くて、淡々とバグの修正を積み重ねては1年に1度以上リリースするという程度です。 実際には Python では PostgreSQL 周りに比べて MySQL 周りは遅れていて幾つか改善案はあったのですが、子育てや他にも Python でやりたい事があったり仕事でも Go で楽しんでたりして手を付けられていませんでした。 そんな状況の中、 Mike さんが PyMySQL-Users ML に突

    PyMySQLのメンテナにSQLAlchmey開発者のMike Bayer (@zzzeek)さんが参加しました - methaneのブログ
  • Unix Domain Socket において keep-alive が性能に与える影響 (Gazelle vs Meinheld) - methaneのブログ

    id:kazeburo さんが Gazelle という高速な Perl 用の Web アプリケーションサーバーを公開されました。 Gazelle - Plack Handler for performance freaks #yokohamapm from Masahiro Nagano Gazelle の特徴のうち幾つかは、 id:mopemope 作の Meinheld と同じです。 IO周りは全てCで書かれている accept4 や writev などの Linux 独自のシステムコールを利用している 一方で異なる点もあります。 Meinheld は HTTP/1.1 に対応していて、 keep-alive が利用できる。 Meinheld は greenlet というコルーチンを利用して、 long polling や SSE に対応している。 Meinheld が http-pa

    Unix Domain Socket において keep-alive が性能に与える影響 (Gazelle vs Meinheld) - methaneのブログ
  • mysqlclient が Django の推奨ドライバになりました - methaneのブログ

    MySQL-Python (MySQLdb) のメンテナンスが停滞したことで fork して後方互換性を保ったままメンテナンスをしている mysqlclient ですが、 Django の recommend になりました。 Databases | Django documentation | Django もともと推奨になっていた MySQLdbPython 3 をサポートしないままメンテナンスが停滞していることが問題になり、対立候補が MySQL Connector/Pythonmysqlclient でした。 Oracle 公式の安心感(僕個人が片手間にやってるよりは圧倒的に開発リソースを避けるはず)も捨てがたいのですが、クエリ結果のカラム数×行数(=MySQLパケット数)が多い時に Pure PythonMySQL Connector/Python と libmy

    mysqlclient が Django の推奨ドライバになりました - methaneのブログ
    ikeikeikeike
    ikeikeikeike 2014/10/28
    ごいすー
  • mysqlclient-python を簡易的に非同期I/Oに対応させた - methaneのブログ

    libmysqlclient を利用した PythonMySQL ドライバである libmysqlclient-python を、 gevent, meinheld など非同期I/O + 軽量スレッド環境で使いやすいようにしました。 libmysqlclient の API について libmysqlclient は基的に同期IOのことしか考えられていません。 ですが、クエリを投げてそのステータスを返す mysql_real_query() に限り、代替手段として mysql_send_query() でクエリを送信してから、ステータスを待つ mysql_read_query_result() を呼ぶという事ができます。 また、 MYSQL 型の net.fd というメンバから fd を取得することができます。 これらを組み合わせて、 mysql_send_query() でクエリ

    mysqlclient-python を簡易的に非同期I/Oに対応させた - methaneのブログ
  • mysqlclient をリリースしました - methaneのブログ

    前回の記事で しかし、長年の実績がある家といえども、個人プロジェクトで、1年に数回しかコミットされてない現状です。 一応、「いま転職直後で時間ないんだけど、できれば週末に見ておくよ」という感じのレスを貰ったのでしばらく待ってみますが、進展がなければ別名で PyPI に登録してしまうつもりです。 と書いたのですが、まだ家にマージされていないので、娘が家に来てあまり活動ができなくなる前にリリースしてしまいました。 mysqlclient Windows 用には、今風のバイナリパッケージである wheel をビルドしてあります。 ビルドに必要だった MySQL Connector/C が、インストーラを使うと、 x86 と x64 が排他になる(片方をインストールするともう片方が自動的にアンインストールされる)ので地味にハマりました。 Windows 版の wheel の準備は、 Windo

    mysqlclient をリリースしました - methaneのブログ
  • MySQL-python の Python 3 対応 - methaneのブログ

    去年10月に Python 3 の MySQL ドライバ事情 という記事で次のように書いていました。 多分デファクトスタンダードな MySQLドライバなのですが、現状リリースされている 1.2.4 では Python 3 対応ができていません。 Fork の MySQL-for-Python3 が推奨されます。 最近 MySQL-python の方に Python 3 対応の準備的な Pull Request (古い構文を Python 2/3 両対応の構文に置き換える) がちらほらあり、やっぱり中途半端にメンテされてない Fork より家に対応してもらわないとなぁということで、エイヤで Python 3 対応してしまって 少し大きめの Pull Request を投げました。 しかし、長年の実績がある家といえども、個人プロジェクトで、1年に数回しかコミットされてない現状です。 一応、

    MySQL-python の Python 3 対応 - methaneのブログ
  • Python でシェル経由でコマンド実行するときのバッドノウハウ - methaneのブログ

    PHPだってシェル経由でないコマンド呼び出し機能が欲しい コマンド実行でシェルが怖いなら使わなければいいじゃない どちらの記事でも Python の subprocess を使ってシェルを介在せずにコマンドを実行する方法が紹介されています。 シェルを介在すると、エスケープの問題考えるのが面倒だったり、 kill してみたらシェルだけ殺して肝心のコマンドがずっと残ってるというアホみたいな問題を避けられるのでお勧めです。 いい子はこれを使いましょう。 この記事ではどうしてもシェルの機能が使いたい場合や、 subprocess の PIPE の組み立てが面倒な場合のための、バッドノウハウを紹介していきます。 ちなみに、バッドノウハウと呼んでるのは、安全安心 one size fits all ではなく、メリット・デメリット・やり方をいちいち調べないといけなくて、しかもその調べる行為がほとんどコン

    Python でシェル経由でコマンド実行するときのバッドノウハウ - methaneのブログ
  • Go で書いたサーバーを管理するには circus が便利 - methaneのブログ

    Go を使うとサーバーとアプリケーションの境界が無くなり、アプリケーションサーバーを書けるようになります。 それは良いことなのですが、アプリケーションを書く人が、従来サーバーを書く人が設計していた機能を理解して実現できないと、運用できないサーバーができあがる結果になってしまいます。 例えば Apache は、 master, worker プロセスが分離していて、設定変更を反映させるときなどは新しい worker を作ってから古い worker を殺すことで、サービスを一瞬も止めずに worker を再起動していました。これを graceful restart と呼びます。 Go で 1024 以下のポートを Listen するアプリを作る で触れたとおり、 Go はプロセス管理システムを作るのには少し向いていない面がありますし、せっかくアプリケーションプログラマーが簡単にサーバーを書ける

    Go で書いたサーバーを管理するには circus が便利 - methaneのブログ
  • distribute と setuptools がマージされた - methaneのブログ

    setuptools の開発が停滞し、 fork の distribute が開発を継続していた状態で、初心者にとって最初の大きな罠になっていました。 この2つがマージされることになり、 setuptools 0.7 がリリースされました。 移行手順 How do I upgrade... にあります。 setuptools からの upgrade あまり居ないとおもいますが、 setuptools 0.6x を使っている場合は、 easy_install -U setuptools で upgrade できます。 distribute からの upgrade 移行用パッケージとして、 setuptools 0.7.x に依存する空の distribute 0.7 が提供されています。 ただしこの方法は実験的なものという扱いで、 distribute 0.7 は PyPI にはアップロード

    distribute と setuptools がマージされた - methaneのブログ
  • Flaskの闇 - methaneのブログ

    Merry, Xmas. Python advent calendar 2012 (#python_adv) 24日目の記事を、ミクパの再放送をBGMにお送りします。 今日は Flask のイケてないところとのつきあいかたを紹介します。 循環 import 問題 app.py 1ファイルだけの構成から成長してファイルを分け始めるときに突き当たるのが循環import問題です。 今まで1モジュールだった app.py を myapp/__init__.py にして、 view 関数を myapp/views.py の中で定義していきたいとします。 #myapp/__init__.py from flask import Flask app = Flask(__name__) import myapp.views #myapp/views.py from myapp import app @ap

    Flaskの闇 - methaneのブログ
  • tracebackをログに残す場合のお約束コード - methaneのブログ

    import traceback try: ... except: log.error(traceback.format_exc()) raise 例外は、こまめにチェックするよりも、あえてチェックしない方が良いことがある。 とくに、例外をcatchしておいて、結局自作の情報量が少ない例外を再送出するのは最悪。 エラーが起きたらログだけ取って、例外自体はそのまま上に流したい場合は、exceptブロックの中でraiseする。Webアプリにありがちなシチュエーション。 traceback.format_exc()は超便利だけどすぐ忘れるのでここにメモしとく。

    tracebackをログに残す場合のお約束コード - methaneのブログ
  • len が関数になっている理由 - methaneのブログ

    http://d.hatena.ne.jp/pashango_p/20090702/1246550203 len()がリストのメソッドでないのも同じ理由です。 オブジェクト指向的に考えれば、リストのメソッドであるべきなのに、わざわざビルトイン関数にしたんです。 「オブジェクト指向的に考えれば、リストのメソッドであるべき」って感じで、オブジェクト信者はそれが正義みたいに考えちゃうんだろうね・・・ Pythonは合理主義。「オブジェクト指向的に○○」よりも、一貫した少なくて明確なルールを重視する。 len() が .length() メソッドだったらどうなるか。あるコンテナは .length() の代わりに、 .len() や .size() という名前を使ってしまうかもしれない。「サイズを取るメソッドは.length()」という 暗黙のルールができてしまい、そのルールが頭に入っていない人が一

    len が関数になっている理由 - methaneのブログ
  • Python3 Advent Calender 3日目 - New GIL を理解する - methaneのブログ

    2011 Pythonアドベントカレンダー(Python3) - connpass の3日目を担当します。 Python 3 がリリースされてから、 Python の進化は主に Python 3 で行われ、そこから Python 2 にバックポートできるものがバックポートされています(例: GCのチューニング、辞書の内包表記など)。 しかし、 Python 2 は 2.7 で新規開発を終了しており、 2.7 にバックポートされなかった機能はもう Python 3 に移行しないと利用することができません。今日は、そんな機能のひとつである New GIL を紹介します。 なお、今日紹介する内容のほとんどは UnderstaindingGIL で紹介されている内容を僕なりに要約したものです。(ただし、翻訳ではありません) 著作権の扱いがわからなかったのと、代わりに自分で図を書き起こすのが面倒だっ

    Python3 Advent Calender 3日目 - New GIL を理解する - methaneのブログ
  • Python の GIL 排除のために Software Transactional Memory が注目されている理由 - methaneのブログ

    あるいは、Pythonは参照カウント方式だからGILを排除できないという誤解に対する回答。 参照カウントってアトミックなインクリメント・デクリメントさえあればセマフォとか使わないでも並列化できるんで、パフォーマンスが滅茶苦茶落ちるということはない。参照カウントに対する修正が頻発するんで、同じオブジェクトを複数のスレッドが頻繁に操作したらコア同士で1次キャッシュの取り合いになって性能上がらないけど、現状よりはだいぶマシだ。 Python で GIL の除去が難しいのは、PythonJava よりも高級なアトミック性をもつ言語だからだ。例えば、 # d1, d2 は両方ローカル変数にある辞書. d1.update(d2) これは、Python VMレベルでは、 d1 の参照、 update メソッドの参照、 d2 の参照、メソッドの呼び出し、という処理になるんだけど、このうち dict.

    Python の GIL 排除のために Software Transactional Memory が注目されている理由 - methaneのブログ
  • gevent で proxy server を作る - methaneのブログ

    Flash製アプリの試験用のアクセスパターンを作りたくて gevent を使って簡単なproxy serverを作った。 localhostの8000版で立ち上がるので、FoxyProxy などで、特定のドメインに対する proxy として登録してやると、リクエストを再現するのに必要なデータをmsgpackフォーマットで保存していく。 from gevent.pywsgi import WSGIServer from gevent import monkey from msgpack import packs import httplib def handler(environ, start_response): host = environ['HTTP_HOST'] method = environ['REQUEST_METHOD'] body = environ['wsgi.input

    gevent で proxy server を作る - methaneのブログ
  • 1