月別アーカイブ: 2014年5月

【cakePHP】.htaccessでmod_rewriteを使いつつ特定のURLをBASIC認証なしにする

毎日スパムコメントを捨てています、自宅プログラマです。

さくらのレンタルサーバーってCGI版PHPなんで、CakePHPの認証モジュールを使えないんですよねー。そういうわけで、apacheでBASIC認証かけていました。最初の.htaccessはこうです。

AuthUserFileは自分で作ってくださいね。bakerattaというのはfoobarやhogeと同じようなメタ構文変数ってやつです。

How to make Basic Auth exclude a rewritten URL
をみて

をやるとmedicine以下の時だけ$_SERVER[‘REDIRECT_noauth’]という変数ができてました。$_ENVにも同じものが。なんだ、これ、おもろー。なんでREDIRECT_がつくんだろ。$_SERVER[‘REDIRECT_REDIRECT_noauth’]ってのもできるし。そっか、URLが書き換わるたびにhtaccessを評価するんですね。
って、最初、環境変数がセットされているか確認の仕方が分からず、ここまででかなり苦労しました。呼び出したPHPでphpinfo()を実行すればapacheの一時変数も$_SERVERに入るんで、これで足がかりができました。
phpinfoの結果

んで、それでもうまくいかず、いろいろやっているうちに結局mod_rewriteの環境変数使わなくてもSetEnvIfだけでいけました。

Satisfy にanyを設定することにより、ユーザー認証だけでなくホスト制限もみてくれるようになります。
これで通常はBASIC認証かけつつ、medicineディレクトリ(と、そこから呼び出されているcss/imgディレクトリ)以下がBASIC認証対象外になりました。

ポイントは、Rewrite書き換え前と書き換え後、2つのURL両方を書いておくことです。

SetEnvIfを使ってBASIC認証解除したいURLを加えていけばいいので分かりいいですね。

## 2016/03/16 追記
img/x.gifのようなファイルをリクエストしているにも関わらずファイルがみつからない404の時にもBASIC認証がでていたので
SetEnvIf Request_URI “/webroot/index.php” noauth
を追記しました。
ファイルがない場合、cakePHPはwebroot/index.phpにリダイレクトするのでここも許可対象に入れたということです。一見すべてのアクセスが許可されたように思えますが、URLが書き換えられる前もチェックされるのでこれでいいのだ!
あと、特定のコントローラだけBASIC認証かける時とかはPHPで処理した方が簡単です。
HappyQuality – [CakePHP][PHP]コンポーネントを利用せずにベーシック認証を実装する

【PHP】mb_strimwidthの使い方

最近、蛍が飛んでるようです。以前から家の裏とかもちょこちょこ蛍が飛んでたりしてたんですが、自分が田舎に帰ってきた9年ぐらい前から、近くの川で蛍で本格的に乱舞するようになってます。


さて、PHPって、本当に親切な関数がたくさんあるんですが、mb_strimwidthもこんな親切でいいの!と思う関数のひとつですよね。

記事をリストに並べたりした時に、文字数を短く丸めたいときに好きな文字数で丸める上に「…」とか「(続く)」とか、丸めた時だけお尻に文字をつけられます。この処理が一行で出来るなんて便利!

パラメータは順番に

str 丸めたい文字列。
start 開始位置のオフセット。文字列の始めからの文字数 (最初の文字は 0) です。
width 丸める幅。
trimmarker 丸めた後にその文字列の最後に追加される文字列。
encoding encoding パラメータには文字エンコーディングを指定します。省略した場合は、 内部文字エンコーディングを使用します。

となっています。

 

実行結果:

ただ、mb_系のマルチバイト関数全体がそうですがちょっと使いづらいところもあり、自前で処理している人も多いとか。でもせっかくPHPの中にあるんなら、そっち使いたいです、わたしは。

mb_strimwidthのはまりポイントは2つ。

1.第3引数のwidthは文字数でもバイト数でもなく文字幅。

バイト数だったら、UTF-8の全角文字は3バイトになるところですがどの文字エンコードでも全角は2です。ここを間違うと意図したところで切れなくて困ります。

英数、半角カタカナは1と数えます。見た目の大きさを基準にしているということです。ただ、タブ文字とか改行も1と数えるので、単純に見た目とも言えなかったり。この辺は、プログラマなら分かるよね?…という目配せ的なアレですね。

2.第4引数のtrimmarkerの文字幅もwidthに含まれる

と書くと分かりやすいでしょうか、手順から考えると。

3.第5引数のencodingは必ず指定する、絶対。

とうとう、最後の第5引数まできちゃいました。マルチバイト関数の文字エンコーディング指定は分かる人はいちいち指定する必要もないんでしょうが、ね。

encodingは指定しなければ内部文字エンコーディングになるんですが、指定しておけば間違いないです。ここを間違った文字エンコーディングにすると文字化けします。

ちなみにmb_internal_encodingで事前に文字エンコーディングを指定してやるのも有効です。

ここまでやって、まだ不安だったので本当に文字化けしないか調べる時に使ったコード

これをcloud9で文字列とか文字幅とかいろいろ変えてみて、バイナリレベルでみてみたのですが、変な事は起きませんでした。

参考:指定した文字数で文字列をまるめるPHPの関数 mb_strimwidth で、第4引数に「文字列をまるめた後に付加する文字列を指定」する際、色々気を付けないと文字化けるよ、というお話。

 

魔の3歳児とかいうやつに言うことを聞かせる方法

どうも、自宅プログラマです。最近は各方面からお仕事をいただくようになりお断りすることも増えてきました。しかし毎回違った仕事で、初めて学ぶ事が多いのはうれしいのですがさっくり終わらせられないのが悩みの種です。

さてさて、今回は仕事以上に時間をとっているかもしれない、子育てのTIPSです。


子供はなかなか親の言うことを聞かないものです。特に3歳児。ぐずりだすともうだめ。でも本格的にぐずりだす前に、ワンチャンスあるかも。そんな時に、こうしてはどうですか

負けて勝つ作戦

服を着替えようとしないことありますね。無理に脱がせようとすると激しく抵抗、やっと着せてもすぐに脱いでしまう。
こんな時は、「お父ちゃん、あっち向いてるからね、ぜったい、ぜったい見ている間にズボン履かないでね!」と反対の方を向いて「ズボン、はーいーてーなーいーかーなー?」と振り向きます。「よしよし、ズボン履いてないな!」と満足げにうなずいて、また反対を向きます。この繰り返し。振り向いた時に着替えてる途中だったら「わ!どうしよ〜、見てない間にこんなに履いてる、ズボン履いてしまいそうだ〜!ぜったい、見ている間に履いたらだめよ!」と困ったフリ。最後まで履いていたら「わー!ズボン履かれた、悔しい〜!」と負けたフリをします。子供は親の言うことと反対の事をしたという満足感に加えて親に打ち勝ったという勝利感も得られ、もっと、もっと!と服を全部着てしまいます。

交換作戦

手に持ったものを離してくれないとき。無理に引き離すとぎゃん泣き確定。こういう時は、代わりのものをにぎらせてあげましょう。子供って単純ですな。なんでもいいので、その辺にあるもの、例えば洗濯バサミとかを手に取って「ぱっちん、ぱっちん、カニさーん。何でも挟むぞ〜、ん?交換する?」とやるとあっさり手に持ったものを渡してくれます。ポイントは、子供の興味が移るように、何気ないものでも面白いところをみつけてアピールすることです。

数を数える作戦

シャンプーとか、歯を磨くとか、子供が我慢しないといけないものは数を数えるといいです。「10数えるまでがまんしよっかー」とやれば、単に我慢するだけの時間から、目標に向かう時間に変えられ、褒める指標にもなります。もし途中で我慢できなくなっても、「4までいけたよ!すごい、新記録!」とやれば次はもっとできるようになります。

ごっこ遊びにする作戦

体を洗った後も風呂で遊んでいて浴槽に入らない時、そういう時はごっこ遊びにすると言う事をよく聞くようになります。浴槽に入って、「車で遊園地にいくよー、はやく乗って乗って!」とやって浴槽を車に見立てます。エアハンドルを握って、子供を後ろに乗せると肩までお湯につけてくれます。「はい、遊園地ついた!」と風呂からでるとその後もスムーズです。
ごっこ遊びにすると、子供からどんどん提案してくれることがあります。遊園地をコンビニにして欲しいとか、車でなくて船にして欲しいとか、子供からの提案は全面的に取り入れます。子供に遊びの主導権を持たせておくのがポイントです。

競争にする作戦

なかなか寝ないとき、「どっちが長いこと黙って目を閉じてられるか、競争だ!」…これは私の場合はマジで10秒かからず自分が寝てしまうのでめちゃくちゃ怒られます。

トイストーリー作戦

おもちゃがしゃべりだすとか、動いた痕跡があるとか、そういう演出。なかなか保育園に行かないとき、玄関の扉を開けて靴を玄関の先に並べておきます。「大変!お靴が、先に保育園に行ってくるって!」一回くらいは効きます。最初は何が起きたか分からない子供も、事態を飲み込むと「ぼくのお靴、待てー!」と信じてくれるのが楽しいです。
声色を使って「ぼく、リュック!ぼくもつれってって〜!」とバレバレな演出でも子供は付き合ってくれますよ。


以上、実際に使って効果あったものをご紹介しました。応用すればあらゆる状況で使えるんじゃないかと思います。どんなことでも遊びに変えることが出来るんです。

叱ってさせるよりそっちの方がいいかな、と思ってやってます。難点は、時間がかかることと、人がいるところだと親である自分自身がちょっと恥ずかしいということでしょうか。

それでも言う事聞かない、って時は、疲れてるとか、風邪ひいてるとかウンコ漏らしてるとかあるんで、適当に対処しましょう。