PHPのissetにひそむ罠?

PHPを使っている人ならしっているであろう、issetという関数。
読んで字のごとく、変数がセットされているかどうかを確認する関数です。
・・・と、つい最近まで信じていました。
たとえば、以下のような時

$data = aray(
          'a' => 'hoge',
          'b' => NULL
          );
print (isset($data['a'])) ? "a:TRUE" : "a:FALSE";
print (isset($data['b'])) ? "b:TRUE" : "b:FALSE";
print (isset($data['c'])) ? "c:TRUE" : "c:FALSE";

「a:TRUE」「b:TRUE」「c:FALSE」

となると思っていたのですが、実際は

「a:TRUE」「b:FALSE」「c:FALSE」

となります。
そんな馬鹿なと思って公式を確認してみると、

「変数がセットされており、それが NULL でないことを調べます。

と、しっかり書いてあります。
気づいた瞬間、「マジですか。。。」と、ちょっと口がポカーンとなりました。
多分そこを勘違いしている人はかなり多いと思うので、もし知らなかったという人は注意が必要です。

この記事の続き?を書きました。
PHPのissetとarray_key_exists

簡単にローカルでSMTPサーバを動かす

私は今、XAMPPでローカルサーバを立ててWebアプリケーションの開発をしているのですが、その時にメール送信のロジックを組むことも多々あります。
代表的なのだと、メールフォームだとか。

ですが、XAMPP単体だとメール送信は当然できないので、別でSMTPサーバがいるのです。
自分の使っているメールのSMTPサーバでもいいのですが、SMTP-AUTHとかが必要になるとややこしく。

そんな時に役立つmelonというツールがあります。
使い方は超簡単で、

1.ダウンロードして解凍したファイルのmelon.exeを起動させる
2.php.iniなどのSMTPサーバを「127.0.0.1」に、ポートを「25」に設定

するだけです。
難しい設定も何もなくメールの送信が可能なうえ、他にも機能が豊富ですので試してみるのもいいかもしれません。

Webアプリケーションを作る時、セキュリティ対策してますか?

Webアプリケーションを作るにあたって、セキュリティ対策は切り離せないです。
自分のPCであれば、

「後はセキュリティソフトにお任せ!」

で済んだりするのですが、Webアプリケーションだと制作者がその対策を直接しないといけないです。

一時期mixiで有名になった「ぼくはまちちゃん!」騒動の元凶である、クロスサイトスクリプトフォージェリの脆弱性なんかは、うっかりミスでおこってしまう可能性があるので恐ろしいです。

とはいえ、正直何からしたらいいかわからないという人(私含む)に朗報!
こんな素敵な記事がありました。

Webアプリにおける11の脆弱性の常識と対策 – @IT

これで完璧というわけではないですが、Webアプリケーションを作っている人は一度目を通すといいと思います。
知っている人も、再確認の意味で見て損はないのではないかと。

MTにSyntaxHighlighterを導入する1

※2009年9月9日、IE7で確認したところ、ソースコードの領域が2つ出現するバグが発生していましたので、急遽SyntaxHighlighterを解除しました。
また手すきの時にでも調整します。

※2009年9月10日に調整しました。
その後の調整の話を書きました。

ブログを書き始めると、ソースコードとかを書くことも多くなるかなと思い、自動でソースの色分けしてくれるプラグインか何かがないかなーと探してたら、ありました。

SyntaxHighlighterというJavascriptを用いたものです。
Perlとか使ってないので、導入もしやすいです。
対応している言語は
@C++
@C#
@CSS
@Delphi
@Java
@Java Script
@PHP
@Python
@Ruby
@Sql
@VB
@XML/HTML
のようで、十分なカバー量です。

参考:ソースコードを綺麗に表示するJS「dp.SyntaxHighlighter」 – Caraldo.net


ダウンロードして解凍したら、
・css
・Scripts
・Uncompressed

のフォルダができます。
CSSはそのまま読み込ませるか、自分のベースに使っているCSSに追記するカタチでも。
あと使うのは、Scriptsに入っているJSファイル群です。
言語別に分かれているので、必要な分だけアップします。
shCore.jsは必須です。


アップしたら、ヘッダーに記述。
私はMovableTypeのヘッダーテンプレートに

<script type="text/javascript" src="<$mt:BlogURL$>common/js/shCore.js"></script>
<script type="text/javascript" src="<$mt:BlogURL$>common/js/shBrushJScript.js"></script>
<script type="text/javascript" src="<$mt:BlogURL$>common/js/shBrushPhp.js"></script>
<script type="text/javascript" src="<$mt:BlogURL$>common/js/shBrushCss.js"></script>
<script type="text/javascript" src="<$mt:BlogURL$>common/js/shBrushSql.js"></script>
<script type="text/javascript" src="<$mt:BlogURL$>common/js/shBrushXml.js"></script>

という風に追記。
また、

<script type="text/javascript">
window.onload = function () {
dp.SyntaxHighlighter.ClipboardSwf = 'js/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
}
</script>

とヘッダーに記述してwindow.onLoadイベントで呼び出してあげる必要があるのです。
が、例えばbodyにonLoadイベントがあると、それと干渉してしまいます。
MTの仕様なのか、私のお借りしたテンプレートがそうなのかわからないのですが、bodyにonLoadイベントがあったので、はじめはうまく動いていなかったです。
なので、↑のコードを

<script type="text/javascript">
function SyntaxHighlighter() {
dp.SyntaxHighlighter.ClipboardSwf = 'js/clipboard.swf';
dp.SyntaxHighlighter.HighlightAll('code');
}
</script>

こんな感じに少し変えて、他のbodyにあったonLoadイベントの後に

<body onload="hogehoge();SyntaxHighlighter();">
という風に記述すると動くようになります。
あとは変換したいところを
<pre name="code" class="xml">
</pre>

でくくってあげると完了です。

class名は、そのソースコードを色分けする言語名です。
http://code.google.com/p/syntaxhighlighter/wiki/Languages
ここのAliasesの欄を参考に、クラス名に必要なクラスを指定してあげてください。

auの携帯で、PHPからprintされた1バイトの文字は出力されるようになったのかな?

今でもそうなのか分からないのですが、1年前にハマった現象のお話。

シンプルだったauのPOST問題 – 畝田ブルースマンの休憩室

↑このブログの記事にもあるのですが、私も携帯サイトのメールフォームを作っている時に1バイトの
print出力ではまったことが。

その時はこんな感じで

&lt;input name=&quot;shop_id&quot; value=&quot;&lt;?php print $shop_id; ?&gt;&quot; type=&quot;hidden&quot; /&gt;


みたいな感じで書いていたんですが、shop_idが飛んでくる時と飛んでこない場合があって、おかしいおかしいと思っていたら、どうも1バイトのコードが飛んでこないことが判明。
PHPがおかしいのかと思ったりもしたけれど、softbankやdocomoだと問題なく、auだけでおこる現象。
最終的に、shop_idをゼロパディングして2桁にするようにして解決したんだけれど、この記事を書こうと思って調べてたらこんな記事が。

au携帯のSSLで文字化け – LAPISLAZULI HILL#Hatena


output_bufferingをonにするなんて想像しなかったので、私の時の問題がこれで解決したのかどうかはわからないのですが、もし同じ問題に直面した人は試してみるといいと思います。