あっさりと

ソフトウェアや技術話など諸々

gettextでセットした翻訳情報を同一プロセス内でクリアする方法

前提

・日本語がデフォルトの情報
・英語の翻訳リソースが用意されている。
PHPにて実行。

問題点

  バッチのループ処理等でgettextで翻訳情報をセットすると連続する次処理の時もセットした情報を引き継いでしまう。

<ループ1回目>日本語
     ↓
<ループ2回目>(gettextにて翻訳出力)英語
     ↓
<ループ3回目>(日本語に戻したいが)英語(のままになってしまう)

・処理コード抜粋
2回目のループ時だけ以下をコールしている。

setlocale(LC_MESSAGES, "en_US.utf8");
bindtextdomain等諸々〜

3回目ループ時も引き続き英語情報が出力されてしまう。

調査

そもそもデフォルトのロケールはなんだろうという事でデフォルトの情報を見てみると"C"だった。

echo setlocale(LC_MESSAGES, ""); //  デフォルト値として"C"

環境を確認。

$ locale -a
C
C.UTF-8
〜

*ご自身のロケール環境に合わせて考えてみてください。

解決

前述のループ3回目のタイミングで以下をコール。

setlocale(LC_MESSAGES, "C");

Cロケールの翻訳情報は用意してないので再度デフォルトの日本語で出力された。
とりあえず要件は満たせましたという事で。

SQLアンチパターンを読んで

説明不要なほど有名な技術書籍ですが自分なりの感想。

「良いと思った点」

  • 具体例がわかりやすい

各章でそのアンチパターンが発生する背景となる具体例から説明が開始されておりかなり読みやすい。

具体的背景 → アンチパターンの見つけ方 → アンチパターンの弊害 → 対策例


基本的に上記の流れで解説が進み理論的に知っていた事も具体例を持ってまさに体得する感じで理解出来た。

  • 定石的な手法を知れる
論理設計、物理設計、クエリ、アプリケーション設計

初心者が引っかかりそうな部分を一通り網羅しており定石的な事を教えてくれる先輩がいない時に参考に出来そう。
逆に本書の理解度半分以下なら単独でDBスキーマを変更するような案件を担当するのは厳しいかも^^;

  • 使えそうな技術Tips

多重階層な情報を表す時、閉包テーブルを使うと便利だったり、 ログイン失敗時にIDとパスワードどちらを間違ったのか明確にしたりなど色々


「オススメする読者層」

  • とりあえずSELECT, UPDATEなどを使って処理が書けるけど効率的な処理や構造を学びたいSQL初心者

  • 理論的な事は色々知ってるけどもっと内容を明確に理解したいSQL中級者

実際には理想論通りにはいかないことも有るけど、定石知った上で崩す方が良いよねって事で。。

SQLアンチパターン

SQLアンチパターン