タグ

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

  • タイムスタンプの精度を落とすときは切り捨てろ - methaneのブログ

    とあるプロジェクトでナノ秒からミリ秒への変換で四捨五入してきた人がいて、時刻を扱うときは保存精度未満は切り捨てるべきというのが常識になっていないなーと思ったので。 2023-10-01 を、何年か表示する時に、2024年に丸める人はいないだろう。 13:45 が何時か表示する時も、13時と表示するだろう。(口頭で何時?と聞かれたら14時と答えるかもしれないけれど) つまり、ある精度で表した時刻は、実際には次のような半開区間を示しているのである。 2023-01-01 00:00:00 <= 2023年 < 2024-01-01 00:00:00 13:45:00.000 <= 13:45 < 13:46:00.000 そして、そう決めたからには一貫して同じように、指定精度未満は切り捨てというルールを維持しなければならない。秒以下は四捨五入で、とかやってはいけないのだ。 一貫しないと何が問題

    タイムスタンプの精度を落とすときは切り捨てろ - methaneのブログ
    xef
    xef 2024/04/20
  • 構造化ログのフォーマット logfmt vs JSON lines - methaneのブログ

    構造化ログのプラクティスをあちこちで調べていたら、logfmtを推奨する記事を見つけたので調べてみました。 先に結論を言うと、JSON linesを使っておくのが良さそうです。 logfmt について logfmtとはスペース区切りで key=value を並べたフォーマットです。文字列にはクォートとエスケープによってスペースや改行を含められます。 at=info method=GET path=/ host=mutelight.org fwd="124.133.52.161" dyno=web.2 connect=4ms service=8ms status=200 bytes=1653 (logfmt から引用) あちこちで logfmt のリファレンスとして紹介されているのはこの記事です。 https://brandur.org/logfmt 発明されたのはどこか分かりませんが、流行

    構造化ログのフォーマット logfmt vs JSON lines - methaneのブログ
    xef
    xef 2024/03/04
  • sql.Null[T] をGo 1.22に追加しました - methaneのブログ

    Go 1.22 のリリースが近づいていますが、その中でdatabase/sqlにNull[T]を追加したので紹介しておきます。 database/sql パッケージにはNullByte,NullBool,NullFloat64,NullInt64などのNullableなカラムを扱うための型が用意されているのですが、NullUInt64はありませんでした。 UInt型が標準的ではなく、driver.Valueにもuint64が含まれていないからです。 一方でMySQLはunsigned tinyint~bigint型があるのでgo-mysql-driverもuint64には対応しています。32bitまではint64で、64bitではuint64で扱うようになっています。 だからと言ってドライバー独自に NullUInt64 を提供すると、他のパッケージも同じ型を提供した時に混乱の元です。 と

    sql.Null[T] をGo 1.22に追加しました - methaneのブログ
    xef
    xef 2024/02/08
  • RawBytesは使い捨てよう - methaneのブログ

    go-mysql-driverに来たバグ報告を調べていたら、 database/sql.RawBytes の利用方法にハマるとデバッグの難しい落とし穴があったのを見つけたので、Go側のバグとは断言できないもののGo側で直すべきだと報告しました。他の人がハマらないように簡単に解説しておきます。 github.com RawBytesはtype RawBytes []byteのように宣言されていて、[]byteのように扱える。[]byteとの違いは、利用可能期間が短くてrows.Scan(&in)からrows.Next()かrows.Close()までの間にしか使えないという制約があることだ。 rows.Next()が呼ばれた時、ドライバーは受信バッファの中の文字列等のデータを浅い(shallow)コピーで返すことができる。そのデータは次にrows.Scan()が呼ばれた時に使われるのだが、S

    RawBytesは使い捨てよう - methaneのブログ
    xef
    xef 2024/01/24
  • Python 3.12 から Unicode のサイズが小さくなります - methaneのブログ

    Python 3.11 までは、空文字でも64バイトのメモリを使用していました。(64bitプラットフォームの場合) Unicodeの内部表現のうち一番小さい PyASCIIObject 構造体が48バイトで、その構造体の後ろにASCII文字列が続きます。その文字列はNUL終端されているので、空文字列でも1バイト追加されて49バイトになります。 >>> sys.getsizeof("") 49 さらに小さいメモリブロックのアロケートをしているpymallocがメモリを(アライメントの関係で)16バイト単位で割り当てるので、49バイトのmallocでも64バイトが確保されてしまいます。 Python 3.12 からは、PyASCIIObject構造体から wchar_t* 表現をキャッシュするポインタが消え、40バイトになりました。それでASCIIで7文字までの文字列であれば48バイトに収ま

    Python 3.12 から Unicode のサイズが小さくなります - methaneのブログ
    xef
    xef 2022/05/18
  • PyPIのTOP 4000 パッケージのsdistをダウンロードする - methaneのブログ

    Deprecate済みの機能をそろそろ削除していいかどうか悩んだときに、Githubのソースコード検索だとソースコードのコピーが置いてある個人リポジトリがたくさんあったりして役に立ちません。 PyPIのミラーを作って全部のパッケージを確認できればいいのですが面倒なので、とりあえずTOP4000パッケージだけを対象にしてソースパッケージのダウンロードして調査しています。 まずTOP4000パッケージのリストですが、 Top PyPI Packages というサイトから入手できます。BigQueryで自分でリストを作るよりもお手軽です。 hugovk.github.io つぎにパッケージをダウンロードする方法ですが、 pip download だと --no-deps つけてもビルド依存関係を解決しようとしたりしてうまくいかなかったので、PyPIのJSON APIからsdistを見つけてダウン

    PyPIのTOP 4000 パッケージのsdistをダウンロードする - methaneのブログ
    xef
    xef 2020/07/06
  • Python の新しいプロファイラ vmprof が面白い - methaneのブログ

    PyPy 2.6 と同時に、 vmprof という CPython/PyPy 用のプロファイラが登場しました。 私はまだ PyPy では使っていませんが、CPythonプロジェクトをこれでプロファイル取ってみたらなかなか面白かったので紹介します。 概要 Python にはもともと標準ライブラリとしてプロファイラ (cProfile) が付いてきていますが、これは関数の呼び出しと戻りでコールバック関数を呼び出しつつ実行時間を計測するタイプのプロファイラで、短時間でも正確なプロファイルが取れる反面、オーバーヘッドが大きく、小さい関数をたくさん呼び出す部分がオーバーヘッドでより大きく見えてしまうなどの問題がありました。 これと別の種類のプロファイラとして、定期的にサンプリングして、サンプルが多いところが実行時間も多いハズ、というプロファイラもあります。こちらはある程度の量のサンプルを集めないと

    Python の新しいプロファイラ vmprof が面白い - methaneのブログ
  • Python 2/3 両対応のために `unicode_literals` を使うべきか - methaneのブログ

    背景 Python 2 用のコードを書くときは、 Python 3 対応を見越して # -*- coding: utf-8 -*- from __future__ import division, print_function, absolute_import をテンプレとして書いています。 __future__ はファイルごとにバラバラだと混乱を招くので、今関わってるプロジェクトでもこれを新規ファイルのテンプレとして登録してもらってます。 Python 3 の構文、リテラルを有効にする __future__ のうち、 unicode_literals だけは今まで使っていなかったのですが、ふと「あ、やっぱり使うべきだな」と思いついたので、そのへんをまとめます。 第三の文字列型 native string Python 2 には2つの文字列型 str (bytes) と unicode が

    Python 2/3 両対応のために `unicode_literals` を使うべきか - methaneのブログ
    xef
    xef 2014/01/20
  • Python でシェル経由でコマンド実行するときのバッドノウハウ - methaneのブログ

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

    Python でシェル経由でコマンド実行するときのバッドノウハウ - methaneのブログ
    xef
    xef 2013/12/23
  • 次世代標準非同期I/Oフレームワーク asyncio (Tulip) - methaneのブログ

    Python Advent Calendar 2013 の4日目です。 Python 3.4 で標準ライブラリに追加される asyncio を触ってみます。 なお、 Tulip とは asyncio のリファレンス実装のプロジェクト名です。 背景 Python はよく非同期 I/O プログラミングに使われます。 Twisted, Tornado, gevent, eventlet, pyuv などのフレームワークがあります。 これらのフレームワークの問題点として、ライブラリの再利用性の低さが挙げられます。 たとえば Twisted 用に書かれた XMPP ライブラリは、そのままでは Tornado で 利用することができません。 この問題の解決策として、良くイベントループの乗り入れが行われます。 GUIアプリケーションに組み込む場合などを考えて、多くのフレームワークが最初から イベントルー

    次世代標準非同期I/Oフレームワーク asyncio (Tulip) - methaneのブログ
    xef
    xef 2013/12/05
  • Go で書いたサーバーを管理するには circus が便利 - methaneのブログ

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

    Go で書いたサーバーを管理するには circus が便利 - methaneのブログ
    xef
    xef 2013/11/11
  • PyMySQL のコントリビュート始めました - methaneのブログ

    MyKaze を作ってみたり、 http://www.techempower.com/benchmarks/ で PyPy を使ってみたりして、 PyMySQL の重要さを強く感じました。 libmysqlclient は non blocking IO との相性が悪いし、 MySQLdbPython/C API をガッツリ使ってるので CPython でのパフォーマンスはいいものの逆に PyPy でのパフォーマンスは期待できません。 今後 Tornado, Tulip などと PyPy を組み合わせた高性能なサーバーを書くときには Pure Python の PyMySQL のほうが、 I/O 部分のカスタマイズや PyPy との相性で嬉しいです。 ちょうど時を同じくして、 PyMySQL のメンテナが交代し、停滞していた PyMySQL の開発が再開しました。 そこで I/O 部

    PyMySQL のコントリビュート始めました - methaneのブログ
  • Python の WebSocket ライブラリ - methaneのブログ

    ちょっと調べてみたら、想像してたよりもライブラリが充実していたので、各ライブラリの特徴をまとめておきます。 AutobahnPython Autobahn が Python 用にサーバー、クライアント用のライブラリを提供しています。 AutoBahn Python は Pure PythonTwisted に依存しています。 Twisted を使うなら Autobahn でいいのですが、そうでない場合は別のものを使う必要があります。 Autobahn は Python 用以外に JavaScriptJava(Android) 用にもライブラリを提供していて、また他の多くのプロジェクトでも利用されている WebSocket 用のテストスイートも提供しています。高品質な WebSocket ライブラリがいっぱい揃っているのは多分このテストスイートのおかげでしょう。 Tornado

    Python の WebSocket ライブラリ - methaneのブログ
  • ropevimをインストールしてみる - methaneのブログ

    rope とは Python で書かれた、 Python コードに対するリファクタリング等を行うためのモジュールで、主に IDE やテキストエディタに高度な Python のサポート機能を追加するために利用されています。 私はかなりのデフォルト教信者でたいてい IPython と最低限の設定をした vim だけでコードを弄っているのですが、 PyCharm を触ってみてやっぱりIDEの持ってる機能は便利だと実感したので手を出して見ることにしました。 この記事ではとりあえずインストールについてまとめてみます。 vimが利用している Python を確認する 私は主に MacBookMacPorts の Python と、 Kaoriya-MacVim を使っています。 vim が利用している Python がどれかと、そのモジュール検索パスを調べるために、とりあえず vim のコマンド

    ropevimをインストールしてみる - methaneのブログ
    xef
    xef 2013/01/11
  • Python で TDD してみる - methaneのブログ

    RSpec の入門とその一歩先へ がとてもよい記事だったので、 Python で写経させてもらいました。 https://github.com/methane/pytest-tut Ruby コミュニティと Python コミュニティの考え方の違いも見えて面白いと思います。 環境は Python 3.3 で、実行には py.test コマンドを使いましたが、 py.test の機能は特に使っていないので nose でもなんでも大丈夫です。 ファイルの作成 まずは空の実装とテストを作ります。 message_filter.py class MessageFilter: pass message_filter_test.py 最初のテストを書く py.test は .should といったメソッドを勝手に生やしたりはしません。普通に assert 文を書きましょう。 --- a/messege

    Python で TDD してみる - methaneのブログ
    xef
    xef 2013/01/08
  • Python のカッコ無いところを紹介してみる - methaneのブログ

    Haskellのカッコいいところを紹介してみる をみて、 Python と比較してみようと思います。 以下、 heading は上記記事の heading の引用で、 Python のことではなく Haskell の特徴です。 数学英語の知識で「読める」表現が多い 一応、 instanceof など多くの2引数関数が、 infix で書いたら左に来るものが第一引数というルールを守っているので、頭の中ではそれで引数の順序を補完して、 if instanceof(x, int) は "if x is instance of int" と読んでいます。引数の順序がどっちだっけ?と迷うことはほとんど無いです。 しかし残念ながら Python は中置記法はありません。構文をシンプルに保つ方を取っているんでしょうね。 import Data.List import Data.Function xs

    Python のカッコ無いところを紹介してみる - methaneのブログ
    xef
    xef 2013/01/05
  • 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のブログ
    xef
    xef 2012/12/25
  • Flaskのカスタマイズについて - methaneのブログ

    2012 Pythonアドベントカレンダー(Webフレームワーク) #python_adv の5日目の記事です。 明日は @altnight にお願いします。 Flaskはオモチャじゃないよ PyCharmなどのIDEがFlaskに対応を始めたり、Flask はそろそろ Django に続く Python の Web フレームワーク No.2 と名乗れそうなほど広まってきています。(その割にPython3対応遅いけど) Flaskと言えばマイクロフレームワーク、Hello World が簡単に書けるヤツで有名ですよね。 import flask app = flask.Flask(__name__) @app.route('/') def index(): return "Hello, World." app.run(debug=True) これを見るとオモチャっぽく見えるんですが、Fla

    Flaskのカスタマイズについて - methaneのブログ
    xef
    xef 2012/12/05
  • 標準入出力のエンコーディングを指定する3つの方法の使い分け - methaneのブログ

    そこまでおっしゃるなら、というわけで書いたのが以下。 #!/usr/bin/env python3.2 # -*- coding: utf-8 -*- import sys, os if 'PYTHONIOENCODING' in os.environ: for line in sys.stdin: chars = list(line.rstrip()) print('☆'.join(chars)) else: os.environ['PYTHONIOENCODING'] = 'UTF-8' sys.argv.insert(0, sys.executable) os.execvp(sys.argv[0], sys.argv) …強引さが増してるぞおいwllevalのようなsandbox環境では余計動かないしww http://blog.livedoor.jp/dankogai/archiv

    標準入出力のエンコーディングを指定する3つの方法の使い分け - methaneのブログ
  • 勝手に採点 (Re: 自分ならこう書く - pythonでA*) - methaneのブログ

    自分ならこう書く - pythonでA* - ラシウラより def astar(init, goal, nexts, distance=lambda path: len(path), heuristic=lambda pos: 0): import heapq queue = [] checked = [init] heapq.heappush(queue, (distance([init]) + heuristic(init), [init])) while len(queue) > 0: score, path = heapq.heappop(queue) last = path[-1] if last == goal: return path for pos in nexts(last): if pos in checked: continue checked.append(pos)

    勝手に採点 (Re: 自分ならこう書く - pythonでA*) - methaneのブログ
    xef
    xef 2012/05/27
  • 1