2008年11月アーカイブ

PHP アプリケーションのセキュリティーには、リモートでのセキュリティーとローカルでのセキュリティーに関するものがあります。リモートとローカル両方でのセ キュリティーに対応した Web アプリケーションを実装するために、PHP 開発者が身につける必要のある習慣を学びましょう。

セキュリティーを考慮する際には、実際のプラットフォームとオペレーティング・システムのセキュリティーの問題に対処した上で、さらに作成するアプ リケーションをセキュアなものにする必要があるということを忘れてはなりません。PHP アプリケーションを作成する際には、可能な限りセキュアなアプリケーションにするために、次の 7 つの習慣を守る必要があります。

  • 入力を検証する
  • ファイルシステムを保護する
  • データベースを保護する
  • セッション・データを保護する
  • XSS (Cross-Site Scripting: クロスサイト・スクリプティング) の脆弱性から保護する
  • フォームへの投稿を検証する
  • CSRF (Cross-Site Request Forgeries: クロスサイト・リクエスト・フォージェリー) から保護する

【 画像 】 女性専用方便器「立可尿」


Melted Signs Street Art by FinalFrontier

Creative melted sings street art in Leeds, UK by FinalFrontier Design.

Melted Signs Street Art by FinalFrontier 2

Melted Signs Street Art by FinalFrontier 3

Melted Signs Street Art by FinalFrontier 4

Melted Signs Street Art by FinalFrontier 5

Melted Signs Street Art by FinalFrontier 6

・オオカミ少女はいなかった 心理学の神話をめぐる冒険
51qmOZhAviL__SL500_AA240_.jpg

学術的には否定されているのに既成事実として何度もよみがえる心理学の話や考え方を叩き割る。

第一章のオオカミに育てられた少女アマラとカマラの話は作り話だったという事実に驚かされた。この事件は幼児期の大切さを説く材料として日本の小学校の道徳や高校の倫理の教科書にも使われてきた。私も学校で聞いた記憶がある。

アマラとカマラについては、発見者らによって詳細な観察日誌(和訳も出版されている) や写真が大量に残されている。二人の少女らしき人物がいたことは事実のようなのだが、オオカミに育てられた、だとか、保護された後の生育状況などは真っ赤 な嘘らしい。著者は専門家ならばすぐに見破れる大きな矛盾を幾つも指摘している。ところが、当時、資料を真に受けた発達心理学者の大物がアメリカに紹介し たために、マスメディアが大きく取り上げて、世界中が本当の話だと信じ込んでしまった。著者は真実の経緯を明らかにしていく。

そして、映画にサブリミナル画像を挿入したらコカコーラの売り上げが倍増したという実験も嘘だという話。この話が虚偽だったことは専門家では常識に なったが、一般向けビジネス書やマーケティングのセミナーなどでいまだに、まことしかやかに引用される。1956年、実験期間は2週間、映画館で、5秒に 一回3000分の1秒のメッセージ画像を挿入した、映画館の入場者数4万5699人、ポップコーンの売上げ57.5%増、コーラの売上げ18.1%増など という数字も出てきて信憑性を高めている。

だが、実際にはそんな実験は行われていないのだ。専門家らは仮に本当にそうした実験をしたとしても効果があるとは考えられないとも述べている。まず 3000分の1秒では光量が少なすぎて、人間の眼が物理的に見ることができないそうだ。しかし、この嘘の実験結果に影響されてか、日本や米国ではテレビ局 がサブリミナル映像を放映することを禁止している。

「根本的なところでは、人間が新しいもの・珍しいものが好きで、なんにでも原因(因果関係)を見たがり、説明をほしがるといったことがある。また、 これまで社会心理学の分野で明らかにされてきた、確証バイアス、同調、ハロー効果、権威への服従、認知的不協和、被暗示性、先入観なども、説明の重要な要 素として使えるだろう。記憶や思考の分野で研究されてきた、記憶の変容のメカニズム、情報源の取り違え、確率の判断の誤りなども、大きく関わっているだろ う。」

心理学の実験結果というのは、私たちが日常会話のネタにしやすいものだから、ということもあるだろう。物理や化学の実験よりも、心理学の実験は素人でも理解しやすく、尾ひれをつけやすいのだ、と思う。

この本には、オオカミ少女とサブリミナルのほか、言語と虹の色の数の関係、双生児の研究、なぜ母親は左胸で抱くか、プラナリアの学習実験、恐怖条件 づけとワトソンの育児書など、どこかで聞いた話が次々に出てくる。意識的にあるいは無意識に実験者が結果を作り出してしまう事例の研究書だ。読み物として も面白い。

・心は実験できるか―20世紀心理学実験物語
http://www.ringolab.com/note/daiya/archives/003773.html

・ 「心理テスト」はウソでした。 受けたみんなが馬鹿を見た
http://www.ringolab.com/note/daiya/archives/003417.html

081021a.jpg


真のPC好きには、心地よいレストランでしょうなぁ…。

レストランに入って席に着くと、いきなり頭上のプロジェクターからPCオンという感じですよ。テーブルクロスが、お好みの壁紙にチェンジできるのはもちろんのこと、料理が運ばれてくる予定のプレート部分が、あらかじめラウンドスペースになっていて、そこへデジタル映像でリアル感あふれる注文料理を再現! 気に入ったら、そのままテーブルディスプレイタッチして注文という流れになっているようですね。

これ、ちょっと聞くだけでは、なんかテクノロジー尽くしで、ちょっと温かみに欠けるようにも感じるかもしれませんが、実はとってもオシャレハイセンス! その魅惑の店内の様子を、続きのフォトギャラリーにてご確認ください。
 

081021b.jpg
081021c.jpg
081021d.jpg



イギリスはロンドンのウエストエンド(West End)に出現した、斬新な「Inamo」レストラン。ウェイターと会話を交わすことなく、お好みの料理をビジュアルでチェックして注文したり、気分に合わせて、テーブルクロスの雰囲気を次々と変えたり、さらには、テーブルディスプレイから、ネット検索やゲームプレイ、注文料理のリアルタイム状況の確認に至るまで、自由自在に楽しめるのが話題を呼んでいるそうです。

クールなデザインに徹底的にこだわった、Blacksheepプロフェッショナルデザイナー陣のセンスが光るのも、人気の秘密と紹介されてますよ。料理がライトアップされるとこなんかは、ちょっと憎いですよね…。

10 Most Sought-after Skills in Web Development - NETTUTS

1つは極めたい、需要の高いWeb開発に関する技術、ということでエントリがあがっていました。

  1. MVC等、各種フレームワークの知識
  2. JavaScript、Flashを使ったウィジェット作成の技術
  3. 独自のCMSテーマを作成する技術
  4. CMSのカスタマイズやプラグイン作成を行える技術
  5. PSDファイルをXHTMLに変換する技術
  6. JavaScript開発技術、JavaScriptプラグインの作成技術
  7. Facebook/Myspaceアプリの作成技術
  8. iPhoneアプリケーション作成技術
  9. Eコマースの導入技術
  10. Flash&ActionScriptの技術

日本でも同じ状況かどうかは分かりませんが、スキルアップのためには何を学べばよいか?という方向性に迷っている方には1つの参考になりそうですね。

PHPでwebアプリケーションを作成するとき、 皆さんはロギング(ログの出力)をどうされているでしょうか。 今回は、テキストファイルへロギングする方法をいくつか紹介したいと思います。

error_log関数

PHPでは、標準の関数として error_log関数が用意されています。 使い方はとてもシンプルです。2番目の引数に「3」を指定することで、 テキストファイルにログを出力することができます。

error_log('message', 3, '/var/tmp/app.log');

syslog関数

また、syslog関数も 標準で用意されている関数です。syslog経由でテキストファイルにログを出力することができます。Windowsの場合は、イベントログでエミュレートされます。

define_syslog_variables();
openlog('App log', LOG_PID | LOG_PERROR, LOG_LOCAL0);
syslog(LOG_INFO, 'message');
closelog();

error_log関数とsyslog関数を紹介しましたが、 もちろん、通常のファイル書き込みと同じように ファイルシステム関数を利用してロギングしてもいいですね。 いずれにせよ、ログのフォーマットやログレベルの設定ができないので、 必要な場合は自分でライブラリとして実装しなくてはいけません。

PEAR::Log

PEARで利用できるロギングユーティリティとして、 PEAR::Logがあります。 テキストファイルへのロギングの他に、Eメールやデータベースなどへのロギングに対応しています。 ロギングのフォーマットによっては他のPEARライブラリに依存していることがあるので、注意が必要です。

$conf = array('mode' => 0644);
$log =& Log::singleton('file', '/var/tmp/app.log', 'ident', $conf, PEAR_LOG_INFO);
$log->log('message');

log4php

Javaにlog4jというロギングの定番ライブラリがありますが、 log4phpはそのPHP版です。 ApacheのLogging Service Projectで開発されています。 log4jと同じように、ログの出力フォーマットの制御を細かく行うことができるのが特徴です。 テキストファイルへのロギングの他に、Eメール、データベース、ソケット経由などへのロギングに対応しています。

// 設定
define('LOG4PHP_DIR', 'lib/log4php');
define('LOG4PHP_CONFIGURATION', './log4php.properties');

$logger =& LoggerManager::getLogger('App');

// ログ出力
$logger->info('message');

LoggerManager::shutdown();

ログの出力フォーマット、出力先などはすべて設定ファイル(上記例なら「log4php.properties」)で指定します。 設定ファイルの記述は以下のようになります。

# ログ出力設定(テキストファイル、ログレベルはDEBUG)
log4php.rootLogger=DEBUG, R

# サイズベースのテキストログローテート
log4php.appender.R=LoggerAppenderRollingFile
log4php.appender.R.File=app.log
log4php.appender.R.Append=true
log4php.appender.R.MaxBackupIndex=5
log4php.appender.R.MaxFileSize=1000
log4php.appender.R.layout=LoggerPatternLayout
log4php.appender.R.layout.ConversionPattern="%d %5p [%x] - %m%n"

Zend_Log

Zend Frameworkの中に、 Zend_Logというモジュールがあります。 テキストファイルへのロギングの他に、標準出力、データベースなどへのロギングに対応しています。 Zend Frameworkの1モジュールですが、単体でも問題なく利用することができます。 PHP5以上でないと動作しません。

ログレベルを自分で定義できたり、フォーマッタやフィルタの機能が備わっているので、 カスタマイズが自由にできるという点でいいかもしれません。 それぞれ用意されている抽象クラスを継承して、必要な実装をすれば自由に機能を追加することができます。

// 出力フォーマット
$format = '%timestamp% %priorityName% (%priority%): %message%' . PHP_EOL;
$formatter = new Zend_Log_Formatter_Simple($format);

$writer = new Zend_Log_Writer_Stream('/var/tmp/app.log');
$writer->setFormatter($formatter);

// 出力レベル
$filter = new Zend_Log_Filter_Priority(Zend_Log::INFO);

$logger = new Zend_Log();
$logger->addWriter($writer);
$logger->addFilter($filter);

// ログ出力
$logger->info('message');

最後に

何かしらのフレームワークを利用する場合、 そのフレームワークに付属するロギングモジュールを利用することが多いかと思います。 しかし、PEAR::Logやlog4phpなどのようなロギングユーティリティを使うと、 よりきめ細かなロギングが可能になることもあるのではないでしょうか。 車輪の再発明をしないために、いくつかロギングユーティリティを知っておくのも悪くないと思います。

FancyZoom 1.1  - 最近リリースされたFancyZoom。クリックでアニメーションしながら画像がズーム


Highslide JS - JavaScript thumbnail viewer
Highslide JS, formerly Vevstein Thumbnail Expander, is a piece of JavaScript that streamlines the use of thumbnail images on web pages. The library offers these features and advantages:

画像の拡大プレビューを超クールに行える「Highslide JS」。
サムネイルをクリックするとそのまま画像がズームされ、影付きで写真を表示できます。



設置は次のように行います。

  1. スクリプトインクルード
    <script type="text/javascript" src="highslide/highslide.js"></script>
  2. オブジェクト初期化
    <script type="text/javascript">   
        hs.graphicsDir = 'highslide/graphics/';
        window.onload = function() {
            hs.preloadImages();
        }
    </script>
  3. CSS定義
  4. ポップアップ用の空DIV定義
    <div id="highslide-container"></div>
  5. サムネイル画像リンク作成。class="highslide" かつ onclick="return hs.expand(this)" をアンカータグの属性に指定。
    <a href="images/full-image.jpg" class="highslide" onclick="return hs.expand(this)">
     <img src="images/thumbnail.jpg" alt="Highslide JS" id="thumb1"
      title="Click to enlarge" height="120" width="107" />
    </a>

Live Thumbnail Demo - 画像をその場でズイズイっとリサイズ

(参照記事: サムネイルと元画像の見せ方


FancyZoom meet jQuery // Ordered List // We Make The Web Beautifully Simple

画像をスムーズに拡大できるjQuery版FancyZoom。
サムネイル画像をクリックするとそこからズームされる感じにアニメーションされるFancyZoomのjQuery版が出たみたい



http://gigazine.net/index.php?/news/comments/20081119_adtec/


やっつけ感が漂うパッケージイラスト…

股にバイクを挟んで片足立ちしてるの?


反転画像をマスクしたって…

http://d.hatena.ne.jp/morchin/20080922#p1


  • 変数のスコープをなるべく狭くしろ

他はグローバル変数を使うなとか、モジュール化と界面を意識せよなど。とにかくスコープは重要かつ意外と奥が深い。スコープに関係する機能は、モジュール(パッケージ)、クロージャローカル関数ローカルクラス、変数の種類、アクセス制御など。


他はDRY原則コピペをするななど。自分の場合、2度書く方がシンプルになる場合、2度書くこともある。特に、ifやswitchなどのロジックの中で同じコードが2度現れる場合、ちょっとしたコードでわざわざ別のところで関数やブロックにまとめて、それを参照するのは面倒。但し3度以上現れる場合は関数などにまとめるケースが多いかも。


  • 汎用コード内で条件分岐コードを減らせ

他はifをポリモーフィズムによりなくせなど。条件分岐は汎用性を損なう原因となる。もしくは、1つのロジックの中に2つのロジックが混ざってしまっていて、きちんと分離できていない証拠。テクニックとしては、汎用的なコードをある関数にまとめた場合、その関数の外に条件分岐コードを追い出す。インタフェース、Duck Typing、ハッシュ(辞書)などを利用してifやswitchをなくせる。




  • Simple is the best

他はKISS原則(Keep It Simple, Stupidなどの略)、パレートの法則(80:20の法則)、富豪的プログラミングなど。私のプログラミングにおける座右の銘である。ソースコードは書く時間より読む時間の方が何倍も多いと言われているが、保守が重要になるプロジェクトでは書きやすいよりも読みやすいコードの方が重要になると思われる。もちろんそういう言語を選択することも重要。


  • 開放/閉鎖原則(OCP; open/closed principle)

よくオブジェクト指向の原則みたいに書かれているが、オブジェクト指向に限らずシステムは基本的にそうあるべきだと思う。但し拡張性を持たせることが必ずしも真ではないとも思う。機能を追加するたびに既存のコードを修正しないといけないのは、依存関係が複雑になっている証拠。もしそういう傾向があるなら機能追加のたびに複雑性は指数関数的に上がっているはず。基本的に、機能追加はなるべく線形的な複雑さで行えるべき。すなわちOCPやモジュール化。メタプログラミングとの関係も要チェック(⇒自分)


  • ケースバイケース

他 は狼人間を撃つ銀の弾はないなど。ほとんどのケースにおいては、ケースバイケースであると思う。100%守るべき原則というのは非常に少ない。例えば、時 間がないプロジェクトや使い捨てコードで汎用性にこだわってもしょうがない。状況によって何を優先させるべきかでコードは変化する。


他はいろいろなプログラミング言語を 勉強しろなど。この意見はいろいろな言語を勉強しろと対極な考えであると思われるかもしれないが、私から見れば同じことである。つまり、いろいろな言語を 勉強すべきだが、中途半端にならずに1つか2つの言語を極めろということである。言語は奥が深い。極めれば極める程すばらしいコードが書けるようになる。 言語の勉強に終わりはない。


  • コードの階層化を意識せよ

ソースコードの階層はフラットではない。関数呼び出しを重ねていくとだんだん上の階層になってくるが、上と下の関数は明らかに意味が違う。私は以下のように分類している。一番下の階層がアプリに依存しない汎用的な処理(ライブラリ)である。次の階層が分野(ドメイン)に特化した汎用的な処理(ライブラリ)である。次の階層がアプリ自体の処理(業務ロジック)である。フレームワークなども考えるともっと階層化されるかもしれない。しかしこの程度でも意識するのとしないのでは、ものすごく違いが出ると思われる。



  • MVCを分離せよ

他はデータをハードコーディングするななど。データ、処理、表示を1つのコードの単位(モジュール)の中に混在させるな。分離せよ。


  • テストコードをつけよ

他は単体テストを作成せよなど。テストしやすいようにプログラムを構成すべき。テストしやすいコードはデバッグしやすいし、可読性も上がると思う。例えば、Pythonでベース処理関数にdoctestを付けると関数の挙動を簡単に理解できる。


  • DSLを意識せよ

DSLはうまく使わないとかえって分かりづらくなるというイメージが私の中であるが、うまく使えばコードの可読性が上がったり、例えば正規表現など既存のものを使用した場合にはパフォーマンスも上がるかもしれない。


  • 遅延処理をうまく使え

遅延処理を使用すると動的性を増したり、結合性を弱くできると思う。しかし状態を変えるタイミングがずれるという意味で若干、黒魔術的になる可能性もあるので注意が必要。例えば、Pythonで__getattr__特殊メソッドを使用すると属性に初めてアクセスしたタイミングで属性を構築できる。例えば、追加コードの中であらかじめ想定していなかった属性をクライアントコード側で使用できるので、動的性が増したり、結合性を弱くできると言える。

「変数のスコープは狭いほど良い」と妄信する


変数でもメソッド名でもクラス名でも言えることだが、単純に「スコープは狭いほどよい」という方針でプログラムすると、逆に保守性も可読性も悪いプログラムができあがることがけっこうある*1


http://www.chuonthis.com/extensions/folderpane.php


または


Thunderbirdに表示されるアカウント名は、アカウントを追加した順に並んでいく

好きな表示順にしたくても設定する項目方法

  1. ”C:\Documents and Settings\ユーザー名\Application Data\Thunderbird\Profiles\ユーザー名\適当な名前のフォルダ”にある「prefs.js」をメモ帳などで開く。
  2. user_pref("mail.accountmanager.accounts", "account1,account2,account3,・・・");
    と書いてある行が並び順なので、これを
    user_pref("mail.accountmanager.accounts", "account1,account3,account2,・・・");
    みたいに表示したい順番に並び替えて保存する。
    account2 などが、どのアカウント名に当てはまるかについては、上のほうの行に、
    user_pref("mail.account.account2.identities", "id1"); とあり、下のほうの行に
    user_pref("mail.identity.id1.useremail", "メールアドレス名A");とあるので、
    account2」は「メールアドレス名A」にあたると考えればいいと思います。)

Thuderbirdを再起動すると、上記で並び替えた表示順になっている。


このアーカイブについて

このページには、2008年11月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年10月です。

次のアーカイブは2008年12月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。