2 ポイント 投稿者 GN⁺ 2024-11-12 | 1件のコメント | WhatsAppで共有
  • Typepadの終了により、既存のブログ運営者はログインとファイルへのアクセスができない状態で、ドメインやコンテンツの移行要否を自ら整理する必要があります
  • サービス終了日は2025年9月30日で、それ以降はアカウントへのログインは提供されません
  • 終了日以降の期間まで年額料金を支払った顧客には比例配分による返金が行われており、返金明細が見当たらない場合は銀行への確認が必要です
  • すべてのブログデータは削除される予定で、個人情報関連の問い合わせ以外に、アクセス延長や復旧の手段は提供されません
  • Typepad Domainsで登録されたドメインは2025年10月27日にReseller Clubへ移管され、新しいプラットフォームに接続するには既存のTypepad向けCNAMEを削除する必要があります

サービス終了後のアカウントとデータの取り扱い

  • Typepadのサービス終了日は2025年9月30日です
  • 終了日以降、ユーザーはアカウントにログインできなくなります
  • 終了日以降の期間まで年額サービス料金を支払った顧客には、比例配分による返金が行われます
    • 明細書に返金が表示されない場合は、銀行に問い合わせる必要があります
    • 有効なクレジットカードが登録されていない場合、返金処理が行われていない可能性があります
  • 終了後はファイルへのアクセスが停止され、別途延長も提供されません
  • すべてのブログデータは削除される予定で、個人情報関連の問い合わせはprivacy@newfold.com宛てに行う必要があります

Typepad Domainsの移管と新しいブログへの接続

  • Typepad DomainsはLogicBoxesのリセラーであり、Typepad Domainsに登録されているすべてのドメインは、2025年10月27日に別のLogicBoxesパートナーであるReseller Clubへ移管されます
  • 対象ユーザーにはReseller Clubから追加案内のメールが届きます
  • LogicBoxesからドメインを別の場所へ移管する必要はなく、その後もReseller Clubを通じて継続管理できます
  • 新しいブログサービスやプラットフォームにドメインを接続するには、既存のTypepadを指すCNAMEレコードを削除し、新サービスの要件に合わせて設定する必要があります
    • 2025年10月27日より前は、Typepad Domainsにログインして設定します
    • 2025年10月27日以降は、Reseller Clubにログインして設定します
  • Typepad Domains以外のレジストラを利用している場合も、そのレジストラでTypepadを指すCNAMEレコードを削除し、新しいブログサービスやプラットフォームを指すように設定する必要があります
  • 特定のブログを探している読者は、そのブログがどこで再公開されたかを当該ブロガーに直接問い合わせる必要があります
  • 追加の問い合わせは、Network Solutionsの電話またはチャットで行えます

1件のコメント

 
GN⁺ 2024-11-12
Hacker Newsの意見
  • レビュー中のパッチがある: https://inbox.sourceware.org/libc-alpha/cover.1722193092.git...
    https://issues.redhat.com/browse/RHEL-42410 がきっかけで始まったもので、RHEL 9では何らかの理由で目立ちにくかったグラフィックスタックの安定性問題だった
    少なくとも最初のパッチ、つまり getenv のスレッド安全性修正は glibc 2.41 に入ることを期待しており、バックポートもかなり安全そうだ
    setenv は、glibc がすでに環境変数文字列を決して解放しないため比較的扱いやすく、難しいのは同時実行される unsetenv だ
    スナップショット方式なしでは、getenv が実際に設定されている環境変数の値を返す代わりにヌルポインタを返してしまう可能性がある
    getenv にロックを入れたくはない。setenv なしで使う getenv は、あまりにも昔から非同期シグナル安全(async-signal-safe)と見なされてきたし、ロックを入れるとアプリケーションが壊れる可能性が大きい
    environ 処理の修正は vfork+execve のためにメモリリークを避けるのが複雑で、もう少し議論の余地があるが、これらの追加修正はグラフィックスタックの安定性にはそれほど重要ではない

    • プロセス開始後に追加された変数を連結リストに入れ、アトミックに実装するのはどうだろう
      長さが伸びすぎたら、setenv を実行するスレッドが新しいハッシュマップを作り、古いポインタを新しいポインタへアトミックに置き換えられる
      2つのスレッドが同時に再ハッシュしないよう、現在再ハッシュ中かどうかを示すアトミックフラグを使えばよい
      その間に別のスレッドが setenv を呼んだ場合、追加変数はリストに付け加えられ、後で setenv 呼び出しがあれば処理される
      十分に多くのスレッドが高速に setenv を呼び出すとリストが無限に伸びる可能性はあるが、setenv は頻繁に呼ばれるものではないので、ポインタのアトミック置換の単純さには価値がありそうだ
    • 関連しているかもしれない: “Setenv Is Not Thread Safe and C Doesn't Want to Fix It” (2023) -- https://www.evanjones.ca/setenv-is-not-thread-safe.html と、Rust がどう影響を受けたかについての HN コメント: https://news.ycombinator.com/item?id=38342642
      数十年ものの足元の地雷とは、もどかしい
  • 最近の Linux で Steam がここまでうまく動くのは本当にありがたい
    その現実を実現するために裏で注がれている労力を、当然のものとは思っていない

    • 近いうちに SteamOS の正式リリースをまた出してほしい
      それをベースにゲーミングタワーを作りたい
      Bazzite で妥協することもできるだろうけど、正直 SteamOS にしたい
  • 起動時にすべての環境変数を読み取り、setenv を絶対に使わないことがベストプラクティスなのではと思う
    setenv が意味を持つ唯一の場所は新しいプロセスを起動するときだが、その場合でも現在の environ を複製した新しい environ を作り、新しい値を更新するのが正しそうだ
    getenv/setenv をプロセス間通信のメッセージング機構のように使うのは、Linux で歴史的にスレッド安全でなかった問題に加え、隠れたメモリリークの可能性など、いろいろな問題を招くやり方だ
    記事で macOS ではスレッド安全だと言うとき、このあたりを無視しているように見える

    • いや違う。getenv() を呼ぶライブラリを使うことがあり得る
      Java は述べたような方式を取るが、getenv() を欲しがるライブラリを使う JNI コードでは、なお問題が起きる
  • 本当の質問はこれだ。あるスレッドで setenv を呼び、その変更がすでに存在する別のスレッドにも適用されることを、本当に望むケースはあるのか?
    とはいえ GLIBC は危険な関数をかなりきちんと文書化しているので、自分でロックやコピーを追加することは可能だ

    • 興味深いアイデアだ
      setenv が environ 配列を変更すると期待しているプログラムは確実にありそうだし、posix_spawn/execve に渡す不透明ポインタとしてだけ扱うとは限らない
      スレッド別 setenv をするには、スレッド別の environ 変数も必要になる
      ただし POSIX とは相性が悪い。environ はヘッダで宣言されておらず、プログラマがソースに extern char **environ; 宣言を自分で書くことになっているためだ
      この宣言は、environ がスレッドローカル変数である場合と互換性がない
    • サードパーティ依存ライブラリが getenv/setenv を使う場合、自分でロックやコピーを追加することはできない
      記事でも Steam クライアントで続いている問題としてこの点を扱っている
    • 実際にプラグインで環境変数を設定し、すでに開始済みのワーカースレッドが後でその値を読むようにしている
      私の場合、ワーカースレッドはすべて実行キューで眠っているので問題にはならないが、技術的には、あるスレッドで環境変数を設定し、すでに実行中の別スレッドで読みたい状況だ
    • Glibc は、スレッド安全な putenv()/setenv()/unsetenv()/getenv() を持つ Illumos を参考にできる
    • プロセス間通信にはもっとよい方法がたくさんあるので、こうしたハック的で危険な getenv/setenv 構成が必要になることはない
      どのスレッディングライブラリに共有メモリやメッセージパッシングがないというのか分からない
      おそらく、メインプロセスが HTTPS_PROXY のような変数を変更し、別スレッドでは TCP ソケットを開く前にその変数を確認するライブラリを実行する、といった状況で主に起きるのだろう
  • ちなみに、Macでメモリをリークさせるという決定は、実は約26年前のFreeBSDにまでさかのぼる: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=5604
    OSXがそれを受け継いでおり、Windowsのsetenvもライセンスの関係でBSD系譜である可能性が高くても驚きではない
    26年前にもこのAPIが壊れていることは分かっていたが、バグのあるプログラムをさらに壊してしまう惰性のために修正しなかった
    自分のプロセスの環境変数を変更する必要は、ほとんどないはずだ
    子プロセスには適切なexec関数を使えばよく、それ以外ではグローバル変数を変更して遠く離れたコードが再読み込みして正しく処理してくれることを期待するのではなく、明確なAPIを呼び出すべきだ

    • 「修正できない」という感覚には一部だけ同意する
      現在のAPIではその通りだが、APIをほんの少し変えれば可能になる
      getenv()が返す前に値をstrdup()し、プログラマーが使用後にメモリを解放するようにすればよい
      値が変わる可能性があると考えるなら、プログラマーはgetenv()を再度呼び出す必要があるが、合理的な妥協に見える
      この変更は、古いプログラムがgetenv()呼び出し後にfree()しないたびにメモリをリークさせることになるが、現行バージョンもメモリをリークするので、決定的な問題ではないように思う
      おまけに新バージョンではstrdup()をミューテックスで囲み、setenv()側も同様に処理することでスレッドセーフにできる
  • 同僚がsetenvを「最悪のLinux API」と呼んだそうだが、setenvは本当にLinux APIなのか?
    Linuxが定義したものでもなくPOSIXにあり、Linuxカーネルが実装したものでもなく、すべてユーザー空間にある

    • Linux向けアプリケーションソフトウェアを作っていて、他のサポート対象プラットフォームがWindowsとmacOSという状況なら、その通りだ
      原文の著者と同僚はValveでSteamをサポートしているようなので、そういう文脈だ
      その同僚が最悪と呼んだ理由はPOSIX仕様のせいではない
      POSIXはこの関数がスレッドセーフである必要はないと言っているだけで、スレッドセーフにすることを妨げてはいない
      問題は、ValveがSteamをサポートするすべてのLinuxディストリビューションで使っているCライブラリであるglibcの具体的な実装であり、それらのディストリビューションがすべて「Linux」としてまとめられるためだ
    • 厳密にはGNU libcの制約
      libcが望むならスレッドセーフにできる
      Goのような言語はこの機能を内部的に実装しているため、この制約がない
      POSIX文書自体もこの制限を考慮している: “The setenv() function need not be thread-safe.”
  • Linuxでnethackとチェスを遊びながら育った身としては、Steamの存在自体が驚きだ
    しかしSteamクライアントは本当に奇妙だ
    数カ月はうまく動いていたのに、突然ゲームが起動しなくなったり何かが動かなくなったりして、全ファイルを削除したり再インストールしたりといった奇妙なことをしないと再び動作しない
    筋が通っておらず、Steamクライアントが腐っていくように感じる

    • Steamは最悪のソフトウェアの一つで、この規模の会社としては正直恥ずかしいレベルだ
      異なる設計原則が混ざり合った寄せ集めで、新機能はまったく別のUIとUXで継ぎ足されるだけだ
      クライアントの大部分はWebViewだが、遅くてバグが多く、内部では非常に古く安全でないChromiumバージョンを使っている
      ランチャーはいまだに32ビットプログラムだ
      ただし、他のランチャーがさらにひどいのが悲しいところだ
    • 私の経験では、そうした問題はWindows版Steamにもすべて当てはまる
      むしろLinuxだけを使うようになってからは、そういうことを経験する頻度は減っている
  • SteamクライアントとLinuxプログラミングの両方を垣間見られる、本当に興味深い内容だ
    毎リリースで詳細なリリースノートを書くのが難しいのは理解できるが、こうした作業を知ると「複数の一般的なクラッシュを修正」という表現は、とてつもない控えめな表現

  • 「glibcでこの問題を解決できるなら、機能上の妥協が必要になるかもしれず、『不可能な』POSIX仕様から少し外れるオプトインの仕組みになるかもしれない。合理的な案を提案できるなら、長期的に進められる」という部分は、本当にそうしてほしい

  • なぜそんなに**setenv(3)**を多用するのか、本当に気になる
    思い浮かぶ主な用途はexec(3)のようなものを呼び出す前に環境変数を設定することだが、ここではそういう場合ではないようだ
    記事では子プロセスを起動するときにexevpeを使うとあるので、setenv(3)を使う場面として何が残るのか気になる

    • nm -Dでsetenv/unsetenv/putenvの使用有無を確認でき、私の~/.cargo/bin/*をざっと見ても、それらを使うプログラムが多すぎる
      シングルスレッドかもしれないが、今後もずっとそうだと誰が保証できるだろうか
      考えてみると、シンボル一覧からpthread_createも検出できそうだ
      こうしたシンボルから呼び出しツリーまで追跡する静的バイナリ解析手法もあれば面白そうだ
      ただし**environの使用有無を確認する方法は見当たらない。コンパイラはこれは何にでも置き換えられる