タグ

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

  • pyenvを初心者に薦めるのはもうやめよう - methaneのブログ

    Pythonのパッケージ・プロジェクト管理ツールはまだ乱立状態にあって、どれを使えばいいのかわからないから慣れたpyenv+pipを使おうという判断をする人がいるかもしれない。その判断自体は別に否定しないけれども、初心者に教える時にpyenvを教えるのはもうそろそろやめてほしい。 Pythonをソースからビルドするので、コンパイラや依存ライブラリを事前に揃えないといけない。依存ライブラリが足りないと中途半端なPython環境もできうる。 デフォルトで最適化オプション(PGO+LTO)が付いてないので、最適化ビルドしたPythonより~5%程度遅い Windowsで使えない Rye, pdm, Hatch などは python-build-standalone と呼ばれるビルド済みPythonをインストールする機能があるので、これらの欠点が存在しない。 Pythonをインストールするところま

    pyenvを初心者に薦めるのはもうやめよう - methaneのブログ
    honeybe
    honeybe 2024/05/27
  • タイムスタンプの精度を落とすときは切り捨てろ - 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のブログ
    honeybe
    honeybe 2024/04/20
  • Goのerrorがスタックトレースを含まない理由 - methaneのブログ

    Twitterでこんな記事を見かけたので。 zenn.dev ジェネリクスの件もそうですが、Goの言語設計は現実主義なのになにか特別なポリシーによるものだと宗教化されてしまって、ファンには勝手に崇拝されてアンチにはディスられがちだなーと感じます。 Goのエラー処理を改善する実験プロジェクトxerrorsがGo体のerrorsにマージされた時、 errors.New() はスタックトレースを取得していました。しかしGo 1.13がリリースされる前に削除されました。 削除された理由の1つは、今までの errors.New() のパフォーマンスに依存していたコードの速度が低下しアロケーションが増えることです。 github.com しかし、これが理由だと今まで思ってたのですが、実際にはもう1つより重要な理由がありました。エラーのフォーマットです。エラーに複数のフォーマットを持たせようという提案

    Goのerrorがスタックトレースを含まない理由 - methaneのブログ
    honeybe
    honeybe 2024/04/03
  • PythonのマルチスレッドWSGIサーバーの選定 - methaneのブログ

    今までuWSGIをシングルスレッド、マルチプロセスで使っていたのだけれども、昔に比べて外部のAPI呼び出しが増えているのでマルチスレッド化を検討している。 uWSGI uWSGIでマルチスレッドを有効にした時は、各workerスレッドがacceptする形で動作する。スレッド数以上の接続をacceptすることがないので安心。 プロセス内のスレッド間ではmutexで排他されて、同時にacceptを実行するのは1スレッドのみに制限されている。つまりthendering herd問題はプロセス間でしか起こらない。マルチスレッド化でプロセス数はむしろCPUコア数まで減らせるので、thendering herd問題はむしろ今よりも軽減できる。(ちなみにプロセス間でもロックしてthendering herdを許さないオプションもあるけど、プロセス間同期は怖いので使っていなかった。) ただしuWSGIのマ

    PythonのマルチスレッドWSGIサーバーの選定 - methaneのブログ
    honeybe
    honeybe 2024/03/24
  • 構造化ログのフォーマット 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のブログ
    honeybe
    honeybe 2024/03/05
  • uvとRye - methaneのブログ

    先週にRuffを開発しているAstralがuvを発表しました。 astral.sh uvは現在のところはvenv, pip, pip-toolsの基的な機能を提供していますが、将来は"Cargo for Python"になることを目標にしています。 一見すると乱立しているPythonのパッケージ管理ツールにもう一つ加わったように見えますが、Ryeの開発者のArminとuvの開発チームは連携していて、同時に次のような発表をしています。 uv: Python packaging in Rust Rye Grows With UV | Armin Ronacher's Thoughts and Writings Ryeはもともとより良いパッケージツールがどうあるべきかの実証のために作られていて、中身は既存のツールのツギハギだった Ryeがpip-toolsやvirtualenvの代わりにuvを

    uvとRye - methaneのブログ
    honeybe
    honeybe 2024/02/22
  • 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のブログ
    honeybe
    honeybe 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のブログ
    honeybe
    honeybe 2024/01/23
  • 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のブログ
    honeybe
    honeybe 2022/05/19
  • Python 3.15からデフォルトのエンコーディングがUTF-8になります - methaneのブログ

    Pythonがファイルを開くときなどに使われるエンコーディングはロケール(WindowsではANSIコードページ)依存でした。 Unixの世界ではどんどんUTF-8ロケールが一般的になっている一方、WindowsのANSIコードページはなかなかUTF-8になりません。 そのために、Unixユーザーが open(filepath) のようにエンコーディングを指定しないままUTF-8を仮定するコードを気軽に書いてしまって、Windowsユーザーがエラーで困るといった問題が発生します。 また、Windowsでもメモ帳(Notepad.exe)やVSCodeはすでにUTF-8をデフォルトのエンコーディングで使用しています。ANSIコードページがUTF-8になるのを待っていたらどんどん周りの環境から置いていかれ、レガシー化してしまいます。 Pythonがデフォルトで利用するエンコーディングをWind

    Python 3.15からデフォルトのエンコーディングがUTF-8になります - methaneのブログ
    honeybe
    honeybe 2022/04/27
  • PythonのデフォルトエンコーディングをUTF-8にするために - methaneのブログ

    Python がテキストファイルを開く時のデフォルトエンコーディングがUTF-8でないことは、多くのWindowsユーザー、特にプログラミング初心者にとって障害になっています。 UnicodeDecodeError で検索すると、多くのWindowsユーザーが問題に遭遇しているのがわかります。 https://qiita.com/Yuu94/items/9ffdfcb2c26d6b33792e https://www.mikan-partners.com/archives/3212 https://teratail.com/questions/268749 https://github.com/neovim/pynvim/issues/443 https://www.coder.work/article/1284080 https://teratail.com/questions/2713

    PythonのデフォルトエンコーディングをUTF-8にするために - methaneのブログ
    honeybe
    honeybe 2021/02/09
  • easy_install が消えた - methaneのブログ

    ずっと前から deprecated になっていた easy_install コマンドが、setuptools53でとうとう消えました。 今後リリースされる Python にはこのバージョン以降の setuptools がバンドルされ、Python をインストールした時に bin/ ディレクトリに入るゴミが1つ減るはずです。 めでたしめでたし。

    easy_install が消えた - methaneのブログ
    honeybe
    honeybe 2021/02/07
  • バグがあっても接触確認アプリをインストールしてほしい理由 - methaneのブログ

    3行サマリー: アプリではなくOSが接触履歴を取っている 今のアプリはOSの接触履歴をONにするだけ。バグがあっても使わなければ問題ない (特に東京では)今週の接触履歴が今後役に立つ可能性がある とうとう接触確認アプリが公開されました。これで今までよりも圧倒的に効率的に、陽性者の接触者に検査を受けてもらうことができるようになるかもしれません。ワクチンが開発されるまでの間、コロナと戦うための最大の武器になるかもしれません。 www.mhlw.go.jp しかし、Bluetooth が有効になってないと起動しない、利用規約に同意しないでアプリを終了しても同意したことになってる、などのリリース前の準備が明らかに不足してるであろう問題が報告され、炎上しています。 大前提として、これらのバグの責任はもちろんリリースした厚生労働省とその委託先の会社、そしてリリースを急がせた政府にあり、ベースとなったO

    バグがあっても接触確認アプリをインストールしてほしい理由 - methaneのブログ
    honeybe
    honeybe 2020/06/22
  • Homebrew の Python で何が変わって何がもとに戻ったのか - methaneのブログ

    rcmdnk.com 大分混乱した状態になってしまったので、今年何が変わってきたのか、今回の変更でどこまでもどったのかを整理しておきます。 1/19 python という formula が python コマンドをインストールしなくなりました。 python コマンドを起動すると、通常は /usr/bin/python が起動するようになりました。 1.5.0 — Homebrew 3/2 python という formula が Python 3 になり、 Python 2.7 は python@2 になりました。 python formula (Python 3) が python コマンドをインストールするようになったので、 python コマンドを起動すると通常は Python 3 が起動するようになりました。これが npm の gyp とか色んな所をぶっ壊す変更になっていました

    Homebrew の Python で何が変わって何がもとに戻ったのか - methaneのブログ
    honeybe
    honeybe 2018/03/11
  • 3月1日、Homebrew のデフォルトの Python が Python 3 になります。 - methaneのブログ

    以前からアナウンスされていた 通り、 3/1 (日時間では 3/2 になるかも)にデフォルトの PythonPython 3 に切り替わる予定です。 現在そのプルリクエストがレビュー中です。 github.com 具体的には、今まで "python" という formula は Python2.7 でしたが Python 3.6 になります。 Python 2 をインストールするには brew install python2 もしくは brew install python@2 とします。(これまで使えていた python3 という Formula は python への alias になります。) 何らかの理由で意図的に Python 2 を選択しているユーザー以外は、 brew install python で(推奨される)Python 3をインストールできるようになるので、こ

    3月1日、Homebrew のデフォルトの Python が Python 3 になります。 - methaneのブログ
    honeybe
    honeybe 2018/03/01
  • Go が for ループをやめるために足りないもの - methaneのブログ

    ジェネリクスの話題になると常に出てくるのが、 for ループの代わりに関数型スタイルで書きたいという要望です。 for ループで書くのは、可読性が悪く、筋力がいるとまで言う人もいます。 しかし、ジェネリクスが追加されても、このスタイルのプログラミングは実用的にはなりません。ジェネリクス以外にも足りない部分がたくさんあるのです。 例えば、次のようなコードを考えてみましょう。 type PointLog struct { ID int64 UserID int64 Point int32 } // 今の書き方 func UserTotalScore(log []PointLog, userID int64) int64 { var t int64 = 0 for _, p := range log { if p.UserID == userID { t += int64(p.Point) }

    Go が for ループをやめるために足りないもの - methaneのブログ
    honeybe
    honeybe 2017/09/24
  • Re: Re: Go にジェネリクスがなくても構わない人たちに対する批判について - methaneのブログ

    kmizu.hatenablog.com Twitterである程度レスをしたのですが、やはり繰り返される話題なので残る形で書いておきたいと思います。 Goユーザーの中で、ジェネリクスがなくても構わないと主張するユーザーへの批判はしたけど、Goユーザー全てがそうだと思っているわけではない Goユーザーの中でジェネリクス不要論を唱えているユーザーへの批判はしたけど、そういうユーザーを馬鹿にしているわけではない 私の前の記事は、まさに前者の批判に対する返答です。私はGoにジェネリクスを追加することに賛成ですが、別にそうならなかったとしても失望しない程度に「なくても構わない」人です。 一方で後者は、もしGoに限らず一般論としてのジェネリクス不要論だとすれば、批判にも値しないと思いますよ。話題にするつもりはありません。 Goは特に今で言うマイクロサービス的なものを(色んな意味で)効率よく開発するため

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

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

    Go にジェネリクスがなくても構わない人たちに対する批判について - methaneのブログ
    honeybe
    honeybe 2017/09/20
  • Go で書いたサーバーを管理するには circus が便利 - methaneのブログ

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

    Go で書いたサーバーを管理するには circus が便利 - methaneのブログ
    honeybe
    honeybe 2013/11/11
  • GoCon で発表してきました - methaneのブログ

    僕の発表 発表資料というかメモ 発表時間が20分だったので、ISUCONの紹介と、 Go 凄いよってことをアピールしてきました。 あとで流れてる Tweet を見ていたら、僕が一番感動した部分があまり拡散されてなかったので こちらで繰り返しておきます。 去年の ISUCON2 に参加した時、最終的にはカーネル空間で動く Webサーバー兼Memcachedサーバーの recaro を作ったのですが、それ以前に Meinheld や Gonet/http を nginx 並に速くしようと チューニングしていました。 その時に accept4 対応、 nonblock な write を分ける (当時の Go 1.0 ではシステムコールは 基的にブロックするものとして他の goroutine を別スレッドで動かすための処理がシステムコールの たびに実行されていた)、 Date ヘッダを毎

    GoCon で発表してきました - methaneのブログ
    honeybe
    honeybe 2013/10/16
    へぇ。あとでGo。