/(" - ' ;)\

RSSリーダーではこちらをどうぞ→https://feeds.feedburner.com/fuktommy

P2P掲示板「新月」のIPv6対応とかでハマったところ

新月IPv6対応とかをしました。以下ハマりどころを順不同で。

  • Python3.13でcgiモジュールが廃止された
    • しんどい。そのものずばりの置き換え実装のサンプルコードくらい置いておいてほしい
  • DeprecationWarningって昔は何もしなくても出てなかったっけ
    • 環境変数 PYTHONDEVMODE=1 で出る
    • Python3.2以降で出なくなったとのこと
  • pipとかでPython本体のディレクトリにインストールするのはよくないらしい
    • make install で install -D -t ... とかして愚直にコピーする感じに
  • pycファイルをビルドしたあとコピーすると利用されない
    • pyファイルをコピーしたあとにpycファイルをビルドするのが正しいっぽい
    • pycファイルの中にビルドしたときのpyファイルのタイムスタンプが書かれており、コピーするとpyファイルの方が新しくなってしまうため
    • こういうトラブルシューティングってググっても見つからないし、今回はGeminiに聞いても知らなかったし質問をちゃんと理解してくれなかったのでイライラした
  • ApacheでX-Forwarded-Forの中身を操作する方法がなかなか見当たらない
    • ググっても探しづらいし、Geminiに聞いても誤った回答しか言わない
  • X-Forwarded-Forをカンマで区切って利用してなかった
    • ユーザーからのPRで、自分も使わない機能なので気付いてなかった(言い訳)
  • Dockerでroot権限で動かすのはよくないとよく聞く割には非rootで動かす簡単な方法がない
    • useraddとか su -c とかで無理矢理
  • IPv6で外部にアクセスできるけどIPv4のみポート開放している環境で、名前解決するとAとAAAA両方のレコードのあるノードに一生繋がらない
    • IPv4を優先する設定を追加
    • AとAAAA両方のレコードのあるノード側ではできることがない
  • IPv6でバインドできるが名前解決をIPv4でしかしてないバージョンがある(まだネットワーク上に残ってそう)
    • AAAAレコードが一致してもAレコードが一致しないので不正扱いしてしまう
  • CGIHTTPRequestHandlerからwsgirefに移行
    • CGIHTTPRequestHandlerは3.14からdeprecatedだそうな
    • 基本的には self.output.write(...) を yield ... に書き換えればよさそうだが、関数から関数を呼んでいると一筋縄ではいかない。書き換えやすく大量のデータを扱う場合があるところはwsgi的な書き方にしたが、複雑でデータサイズも限られているところはwrite()の中でバッファリングしておく形に
    • 昼食抜きで8時間くらい没頭してた(その大半は書き換えにくいところをyieldにしようとしてたのでボツに)
  • wsgiref利用の実装をしてたらローカルで全てのファイルにアクセス可能になってた
    • コワイ。先にアクセスできるファイルを全て辞書に載せることにした
  • 以前からwsgiを使ってた箇所でレスポンスを格納する一時変数が共用されててレスポンスが混線してた
    • ユーザーからのPRで、自分も使わない機能なので気付いてなかった(言い訳)
  • IPv6の一時アドレスが短時間で変わってしまう問題
    • 諦め。一応検知して再接続するようにはしたが効果は限定的
  • IPv4IPv6で同じノードを二重に認識してしまう問題
    • 諦め。重要な箇所でのノード数のカウントをIPv4, IPv6で分けて影響は減らした
  • IPv6対応ノードがまだ少なそう
    • 重要な箇所でのノード数のカウントをIPv4, IPv6で分けたのでIPv6接続は切られにくくなったと思う
  • 今年後半に出るPython3.14でも動きそう
    • Dockerでバージョンを上げてみた
    • 現状ではpillowのビルドがされてないのでlibjpeg等を使って手元でビルドする