2011年1月25日火曜日

Apacheで特定のアクセスをログから除外したり、月ごとにログファイルを分けたりする

(2011/1/26変更:ログのローテーションはLinuxだったらlogratateに任せればいいかなと思ってWindows限定の書き方をしたけど、Windowsじゃなくてもrotatelogsを使いたい場面はあると思い変更した。)

Apacheのログ出力設定のメモ。

こんなことをしたい場合の例。

  • SetEnvIfとenv=!を使って、任意のアクセスをログ出力対象外にする
  • ログ内容のフォーマットはcombinedで (もっと詳しくログりたい場合は自分でフォーマットを作る)
  • (Windowsの場合、)Apacheに標準で付いてくるrotatelogsを使って任意の時間でログファイルを分割する

#ログに残さないアクセス元
SetEnvIf Remote_Addr 127.0.0.1      nolog
#前方一致でも可
SetEnvIf Remote_Addr 192.168.       nolog

#月ごとにローテーションする場合は%Y%m
CustomLog "|bin/rotatelogs -l logs/access_%Y%m.log 86400" combined env=!nolog

と、思ったら3年前に自分で既にメモしていた... → floatingdays: ApacheでURIに応じてアクセスログを分ける方法

2011年1月21日金曜日

PHPで文字列をパディング (ゼロ埋め、スペース埋め等)


PHPで、文字列や数字を規定の桁数にするために、スペースやゼロなど任意の文字でパディングする方法。

PHPでゼロ埋め(ゼロ パディング)を書いたときにはよくわかっていなかったけど、久しぶりにsprintf()のマニュアルを見たらやっとsprintf() / printf()の使い方がわかった。
でも、単純なゼロ埋めならstr_pad()の方が分かりやすい。(右寄せならsprintf()の方が短いけど。)


str_pad()の場合

$value = 123;
$len = 5;

//デフォルトはスペース埋め
echo str_pad($value, $len); // => "123  "

//指定した文字で埋める
echo str_pad($value, $len, '*'); // => "123**"

//右寄せにするなら第4引数で指定
echo str_pad($value, $len, '0', STR_PAD_LEFT); // => "00123"
変わったところでは左右の両方を埋めるというオプションもある。
$value = '(^o^)';
$len = 9;

echo str_pad($value, $len, 'w', STR_PAD_BOTH); // => "ww(^o^)ww"


sprintf()の場合
$value = 123;
$len = 5;

//デフォルトは右寄せのスペース埋め
echo sprintf("%{$len}s", $value); // => "  123"

//左寄せにするならマイナスを付ける
echo sprintf("%-{$len}s", $value); // => "123  "

//ゼロ埋めの場合はゼロを付ける
echo sprintf("%0{$len}s", $value); // => "00123"

//十進数ならsでなくdの方がいい?
echo sprintf("%0{$len}d", $value); // => "00123"

//スペースとゼロ以外で埋めたい場合、埋めたい文字の前にシングルクォートを付ける
echo sprintf("%'*{$len}s", $value); // => "**123"
sprintf()はパディング専用ではなく文字列フォーマット用関数なので、他にもオプションがある。詳しくはsprintf()のマニュアル参照。

2011年1月18日火曜日

jQuery UI Tabsでタブのリンクを静的リンクにする方法

jQuery UI Tabsでタブのリンクに普通のURLを書くと、ページ遷移なしでそのURLのHTMLを読み込んでタブ内のコンテンツとして表示してくれる。スムーズでよいが、そのままでは静的なリンクにはできない。

また、タブのリンクのURLをハッシュ(「#」で始まる文字列で、要素のidを指定する)にすると、ページ内の該当要素のみをタブ内のコンテンツとして表示してくれるが、別のページへの遷移としては使えない。


なので、タブの見た目だけを使いたくて、リンクは普通に静的リンクにしたい場合はこんな感じにする。

page1.html

<div id="tabs">

<ul>
<li><a href="#tab-content">タブ1に表示するラベル</a></li>
<li><a href="page2.html">タブ2に表示するラベル</a></li>
</ul>

<div id="tab-content">
ページの内容
</div>

</div>

page2.html
<div id="tabs">

<ul>
<li><a href="page1.html">タブ1に表示するラベル</a></li>
<li><a href="#tab-content">タブ2に表示するラベル</a></li>
</ul>

<div id="tab-content">
ページの内容
</div>

</div>

JavaScript
$('#tabs').tabs({
    //Ajaxで読み込むのを阻止
    select: function(event, ui) {
        var url = $.data(ui.tab, "load.tabs");
        if (url) {
            location.href = url;
            return false;
        }
        return true;
    },
    //選択状態にするタブのindex
    selected: 0 // ← 1つ目のタブなら0、2つ目のタブなら1というように動的に変える
});

ポイント
  • tabs()のselectオプションでタブクリック時は普通にページ遷移するようにする
  • tabs()のselectedオプションで表示中のページのタブを選択状態にする
  • 表示中のページのタブのhref属性はURLではなくハッシュ(#xxxx)にすることにより、そのページのコンテンツを表示する


参考

2011年1月12日水曜日

リンクのリファラをカットしてくれるGoogle Chromeの拡張

HTML5ではreferrerを送らないという記述ができるらしい。
WebKit nightlies support HTML5 noreferrer link relation.ja – WebKit

これを利用して、Google Chromeでreferrerを送らないようにする拡張があった。
Google Chrome拡張 「noreferrer link」を作りました - awef

これでいよいよFirefoxからChromeに本格乗り換えか? (でも面倒だなあ...)


というわけで2011年もよろしくお願いいたします。

ブログ アーカイブ

tags