gettextのmo/poファイルを更新したらApacheを再起動する

PHP logo

サイトを国際化するにあたってgettextを使って、mo/poファイルを作って翻訳を行うということはよくあり、今触っているシステムでもFuelの下で(Fuelのi18nは使わずに)gettextを使って日本語版と英語版の切り替えを実現しています。当然、このファイルは頻繁に更新されるわけですが、ローカルで確認していると更新後にロケールが正しく取得されずに日本語版で英語が表示されてしまうことがよくあります。何度かページ更新したり、時間をおいたりすると直るんですが、ローカルならまだしも本番環境で同じことが起こったら軽く事故ですね。ファイルサイズとかサーバスペックとかでキャッシュ更新タイミングが決まってるのか、運良く本番環境では発生していなかったようですが。

続きを読む

【メモ】MySQLの「LIMIT 0, 1」と「LIMIT 1」

mysql_logo.png 結果の先頭から1件を取得する場合、手癖で「LIMIT 0, 1」と書いてしまいがちなんですが。

SELECT * FROM items LIMIT 0, 1;
これに対してレビューで「LIMIT 1 で良くないですか?」というコメントをいただく。
SELECT * FROM items LIMIT 1;
それで何か変わるって話は聞いたことはないけど、コメント貰ったので一応仕ドキュメントを確認。

続きを読む

【メモ】Amazon SESでメールが送信出来ないとき

メールが送信出来ないにもいろいろ原因は考えられるでしょうが、特にプログラムをいじってないのに送信出来なくなった場合は、サーバの時間がズレていることが多いです。特にオンオフを頻繁に行うローカルの仮想サーバだと、10分とか平気でズレてたりします。 で、ローカルのサーバはすぐに直してすぐに動作確認に使いたいので、次の手順を踏んで直します。

sudo /etc/init.d/ntpd stop
sudo ntpdate ntp.nict.jp
sudo /etc/init.d/ntpd start

「the NTP socket is in use, exiting」エラー

時間がズレているからといって、サーバが修正を試みていないとは限らなくて、このエラーの意味は「今直してるから待って」ということみたいです。ntpdは一気に戻すんじゃなく少しずつ戻すんですね。 Linuxサーバの時刻設定手順とエラー(the NTP socket is in use, exiting) というわけで一回停止して調整、再度起動してやれば綺麗に直せます。 まあ、サービス提供中の本番環境でやることはないとは思いますけども。

続きを読む

【メモ】Macログイン時にVagrantを起動する

vagrant.png ローカル環境の起動は毎日のルーチンで、日によってやり方が変わるとか、今日は起動しないでおこうとか言うこともないので、出来れば自動的に起動しておいて欲しい。もしかしたらVagrantにそういう設定があるのかも知れないけどわからなかったので、次の記事を参考にログイン時に起動するようにしてみました。 Macでログイン時にスクリプトを実行する(Automator不使用) – Qiita

続きを読む

【メモ】 Amazon APIによる商品紹介が上手く動いていないとき

Amazon Amazon APIが上手く動いていない(例えば商品表示がすべて表示されていないなど)場合で、特に大きな仕様変更がない場合、サーバの時刻がずれていることがあります。特に、何らかの理由によりサーバの再起動が行われた場合には、時刻のずれに気付かないことがあります。本来であれば自動的に時刻合わせをしているはずなのですけど、シャットダウンのタイミングによってはntpdがエラーで正しく起動せず、時刻合わせが行われないと言うことがあるらしい。 というわけでこの場合には、管理者権限にて時刻のズレを確認した上で、時刻合わせを手動で行います。

# date ← サーバの時刻を確認
# hwclock --show ← ハードウェアクロックの時刻を確認
# /etc/init.d/ntpd stop
# ntpdate ntp.nict.jp ← 時刻合わせ
# /etc/init.d/ntpd start
ちなみにこれが理由で上手く動いていない場合の、Amazonからのレスポンスは「Amazon returned invalid HTTP response code 400」でした。400ってBad Requestでしょってことなんだけど、まあタイムスタンプズレてれば認証用パラメータも期限切れになるよね(という表現でいいのかわかんないけど)ということで。

続きを読む

【メモ】jQueryのPOST通信エラー

5aeea1845616c563c675a7c6424b9d21_s.jpg jQueryのajax関数で送信したときのエラーをハンドリングすると、

  • textStatus : error
  • errorThrown.message: 空
となって原因の特定に時間が掛かってしまいましたが、解決後に症状と原因を考えて列挙するとこんな感じ。

スクリプトの流れ

  1. フォームを生成
  2. buttonをクリックし、イベントハンドラでAjax処理
  3. 引数を付加してPOST通信
  4. サーバ側でDB処理を行う
  5. 成功したらページを再読込み

サンプルコード

$.ajax({
type : 'post',
url : 'sample.php',
data : {
'id' : 'sampleID'
}
}).done(function(data, textStatus, jqXHR) {
// ページを再読み込み
window.location.reload(true);
}).fail(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
console.log(errorThrown);
});

続きを読む

【メモ】PukiWikiのURLの短縮化

PukiWiki

前提

短縮URLサービスを使っても良いんだけど、URLを見てpukiwikiのリンクであることがわかると社内共有とかで便利なので、ほどほどに短縮したい。

プラグインを使う

umoriguさん制作のプラグインを使う 自作プラグイン/s.inc.php – PukiWiki-official umorigu/pukiwiki.urlshortener · GitHub これで、こんな感じに短縮される
http://hoge/pukiwiki/index.php?PHP%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%AC%E3%82%A4%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3
http://hoge/pukiwiki/?&2dc9e012b6

mod_rewriteを使ってさらに短縮

.htaccessファイルを配置。内容はこんな感じ。
RewriteEngine on
RewriteBase /
RewriteRule ^wiki/(.*)$ /pukiwiki/?cmd=s&k=$1
これで、こんな感じに短縮される。
http://hoge/pukiwiki/?&2dc9e012b6
http://hoge/wiki/2dc9e012b6

続きを読む

【メモ】楽天GOLDのFTPにPHPでファイルをアップロードする

(今どきFTPですか?っていう議論はさておき)FTPサーバにアップロードするってこれまでも需要がありそうだったのになぜかやったことがなかったので、調べてやってみた。サンプルコードはこんな感じ。

ポイント

  • ポート番号を「16910」で設定する
  • パッシブモードをオンにする
割と何も難しいこと考えずに実行出来ました。

続きを読む

【メモ】タグに独自属性を設定してjQueryで取得する

独自データ属性 – グローバル属性 – HTML5 タグリファレンス – HTML5.JP

独自データ属性は、名前空間に属さない属性で、その名前は文字列 “data-” で始まり、ハイフンの後に少なくとも一文字が続きます。これは XML 互換で、ASCII 大文字 を含みません。 (中略) すべての HTML 要素に対して、独自データ属性をいくつでも、どんな値でも指定することができます。

使用例

Ippei Suzuki
これを取得するには、 関数data()を使うと便利です。
$('#userName').data('userId');

注意

data()は、もともとは要素にデータを付与しそれを取得するための関数で、HTMLのパースとは関係がありません。付与されたデータはjQueryのキャッシュデータとして保存されます。一方で属性を取得する関数attr()の方は、キャッシュは利用をせずHTMLを読みに行くので、この2つを同時に使うと混乱します。具体的には、atr()で更新したデータがdata()で取得出来ないなど。
$('#userName').data('userId'); //1234
$('#userName').attr('data-userId', '5678');
$('#userName').data('userId'); //1234 ← キャッシュを読み込む
$('#userName').attr('data-userId'); //5678 ← 属性を見る
その辺りは気をつけて上手いこと処理してやる必要があるようです。

参考

独自データ属性 – グローバル属性 – HTML5 タグリファレンス – HTML5.JP jQueryのdata-*属性キャッシュ仕様と対策

続きを読む