いつも読んでいるブログで資格についての記事を読みました。
私が資格を取ろうとしない理由
これに触発されて、私も資格について色々思うことを書いてみることにします。

私は社会人になりたての頃、早く一人前になりたくて色々な資格試験に挑戦しました。
幸い、5つほど取ることができましたが全て情報処理推進機構(IPA)のものです。


今思うと、資格を取って一番役に立っているのは、意外かもしれませんが試験勉強でした。
私自身は学生の頃からコンピュータ関係に興味があり、趣味レベルですがプログラムも一通りできました。
たぶん、最低限の仕事をこなすのなら資格は必要ではなく、業務の勉強のみでよかったはずです。
ですが、この時点で持っている知識というのは「私が興味を持つ」ものであり、自分が満足できる「最低限の」ものです。
試験勉強をするということは、「私が興味を持っていない」ものも含まれており、どの程度の知識が必要かというのも試験で客観的に判断できます。


この強制された知識の範囲と深さが役に立つと思うのです。
勘違いされると困るの敢えて書きますが、私は「資格さえ持っていればいい」と言いたいのではありません。
また、資格に合格できる知識が全て仕事に必要な知識でもなく、また仕事に必要な知識でも試験に出ないものもあります。
ですが、知識の幅や深さを広げるための動機付けに資格制度が利用できると思うのです。


資格反対論者と話す機会があったので色々話を聞いてみたのですが、彼らの言い分が私には納得できませんでした。
彼らは、「試験で問われる内容は実際の業務で要らないものが多いから意味がない」とよく言います。
本当にそうでしょうか。
試験勉強に本気で取り組んで、資格を取って、その後で本当に要らないと思うのなら納得できます。
ですが、今まで出会った資格反対論者で資格を持っている方はいませんでした。
自分で試していないものを批判するって、おかしいと思うのですが…。


ちなみに私は、いわゆるベンダ資格というものは持っていません。
ベンダの製品を使えるかどうかを証明する資格を用意するくらいなら、ベンダは製品を誰でも使えるようにすべきだからだと思うからです。
逆に言うと、資格が必要なくらい難しい製品を使いたくないからです。
…この部分は、ベンダ資格を持っていない私の負け惜しみとも言えますがあせる

接続したデータベースやネットワークの切断だとか、テンポラリファイルの削除だとか、プログラミングしていると後処理を書くことがあるかと思います。
JavaやPHP5等ではfinally節やデストラクタで後処理を書くことが多いと思いますが、PHP4ではクラスは定義できますがデストラクタの仕組みはなく、finally節どころかcatchさえできません。

スクリプトの最後に後処理を書けばいいかとお思いの方がおられるかもしれませんが、それではexit関数が呼ばれた場合や、ブラウザの停止ボタンが押されて中止された場合に、最後に書かれた後処理が実行されなくなってしまいます。

そこで、PHP4では register_shutdown_function 関数を使います。
この関数に関数名を登録しておくと、スクリプト終了時に実行されることになります。
これは、ブラウザの停止ボタンを押した場合など、スクリプトが中止された場合でも有効です。

参考資料:
PHPマニュアル (register_shutdown_function)
最近、目を引くキーワードがでてきて、それが一人歩きしているような気がしてなりません。
タイトルにも書きましたが、アジャイルやAJAX、Web2.0などが代表的なものです。
Web2.0に至っては、私には意味不明です。マーケティング的な意味と技術的な意味が混在していて、本当は何を指す言葉なのかサッパリです。

最近はXPに代表されるアジャイルな手法がもてはやされていますが、その前のRUPやMDAやUMLの騒ぎはどうなったかも気になるところです。
SIer等の上流工程(と言われる部分)にかかわっている方々はバリバリ使っていると思いますが、私がかかわるような小さな案件では、MDAなど影も形もなくなってしまいました。

・・・SOAという言葉もそろそろ飽きられてきていますし、次の流行はSaaSですかね。

稀に、HTML中に"red"などという名前のクラス名を使ったサイト見かけることがあります。このように見た目をクラス名やID名にすると変更に弱くなり、スタイルシートの適用によって得られる利益が半減してしまうように思います。


例えば、仕事でWebページを製作していたとします。スタイルシートでデザインを別途定義できるようにし、変更にも強くなっています。ですがエラーメッセージに対して適用するクラス名は"error"ではなく"red"になっています。完成が近づいたある日、あなたの顧客や上司が「エラーメッセージの文字は赤色でなく黄色にしないといけない」と要求してきた場合、変更に対する仕事量はどのくらいになるでしょうか。

全てのHTML中の"red"クラスを"yellow"とするなら、全てのHTMLを見直す必要があります。全てのHTMLをひとつずつ開いて"red"を検索し、それがエラー文字列に対して適用されていれば"yellow"に変更するという作業になるはずです。


もしくは、下のようにクラス名が"red"なのに内容は"color: yellow;"とするという方法もあります。

red {

color: yellow;

}

この方法を採るとクラス名と内容が一致していない保守しづらいサイトになってしまいます。

さらに悪いことに、エラー文字とは関係なく単に赤色文字列を表示したい場合に"red"クラスを使っていれば、その部分も黄色に変更されてしまいます。これを防ぐためにはやはり全てのHTMLをチェックする必要があるでしょう。


もし、エラーメッセージに対して適用するクラス名を"red"ではなく、"error"等、見た目ではなく意味をクラス名にしていればどうなるでしょうか。スタイルシートファイルの"error"クラスを、

error {

color: red;

}

から

error {

color: yellow;

}

に変更するといった作業だけで済むはずです。

これは"left"等というクラス名にも当てはまります。leftと名づけられたボックスが、いつまで画面の左側に表示されているでしょうか。

私はWebニュースの巡回を日課にしていますが、ふとしたことで興味深いブログの記事を見つけました。
団塊~シニア層向けのWeb設計 やっちゃいけない10のUI
そこからリンクをたどって役に立ちそうなページをいくつか見つけました。
シニアはログインでつまづく?!
シニア向けウェブサイト構築のための10のポイント
シニア向けウェブサイトの色
私自身は基本的に業務システムや中年より若い方を対象にしたサイトばかりに携わってきたので、目から鱗の思いでした。
今後は高齢化社会になっていと言われていますし「シニア向けデザイン論」みたいなものも活発になるのかもしれません。

現状では、デザイナさんから挙がってくるデザインを見ると、表示幅やフォントサイズが固定されているものが多いように思います。
表示幅やフォントを固定したほうがレイアウトが固定できデザインしやすいのでしょうが、これではブラウザの機能で文字を大きく表示している方は読めなくなってしまうのではないでしょうか。そういう意味ではFlashも同じです。

そこで私がお勧めしたいのが、スタイルシートでpxやpt単位で指定している部分を全てem単位で指定するというものです。
emという単位は、1emを英字「M」の高さとして定義されています。
指定の仕方は
p {
margin: 0.5em;
}
というような感じです。
このように指定すればブラウザの設定で表示する文字の大きさを変えても、それに合わせてマージン幅などが変更されるので、レイアウトの崩れを防止することができます。

ただ、この方法には一つ問題があります。
ボタンなどの画像が文字の大きさに連動しないということです。画像の幅や高さをem単位で指定すればある程度解決できるのですが、無理やり拡大や縮小するので画像が汚くなる可能性があります。
この問題は今後、SVGなどのベクタ形式の画像が普通にブラウザに表示できるようになれば解決できるはずだと考えています。
早くIEが対応してくれればいいのですが…。


現在サイトを見ている人の人数を数えたいという要求がありました。

HTTPは基本的に状態を持たないステートレスなものなので、厳密に言えばアクセス中の人数をカウントすることは不可能です。そこで(かなり曖昧ですが)、セッションが有効であればアクセス中とすることにします。

PHPにおけるセッションはデフォルトではファイルに保存されています(session.save_handlerで変更可能です)。1セッションにつき1ファイルになり、無効なセッションは削除されていきます。そこでセッションファイルが保存されているディレクトリにあるファイルの数をアクセス中の人数とすることとしました。ただし、同一サーバ上の他のサイトでもPHPを動かしていてセッションを使っている場合、そのままではセッションファイルが保存されるディレクトリも共通になります。そこでセッションを開始する前に、対象のサイト独自でセッションファイルを保存するディレクトリを指定します。スクリプト内で指定するには、以下のようにsession_save_path関数を使用します。これはsession_start関数の前に呼び出す必要があります。


(例)
session_save_path("session_dir");
session_start();

セッションファイルをカウントするコードは以下のようになります。


(例)
function getActiveCount() {
  $path = session_save_path();
  if (empty($path)) {
    return 0;
  }
  
  $files = glob("$path/sess_*");
  if ($files === false) {
    return 0;
  }
  return count($files);
}

できるだけ厳密に人数を数えたい場合は、セッションファイルの削除タイミングを調節する必要があります。これは、設定ファイルの以下の項目に該当します。


session.gc_probability
session.gc_divisor
session.gc_maxlifetime
session.cache_expire

参考:
PHPマニュアル CXXXVII. セッション処理関数(session)
ユーザが入力した文字列を画面に出力したい場合、気をつけるべき事柄がいくつかあります。
その一つが、今回のお題である「出力する文字列はサニタイジングすること」です。
PHPには文字列をエスケープするための関数がいくつか用意されていますが、サニタイジングするためにはhtmlentities関数を使用し、しかも第2と第3引数を指定する必要があります。

(例)
$string = htmlentities($string, ENT_QUOTES, mb_internal_encoding());

よくhtmlspecialchars関数が使われていたり、htmlentities関数を使っていても第1引数しか指定されていなかったりしますが、これでは穴が残ることになります。

参考:
PHP マニュアル htmlentities
私はたまに画面のキャプチャを撮る必要に迫られることがあります。
客先でのテスト結果を記録するためだとか、取り扱い説明書を作るためだとか、テストで不具合が出たときの証拠だとか、理由はさまざまですが。
WindowsですとCtrl+PrintScreenキーでもかまわないのですが、キャプチャ→ペイントブラシ起動→トリミング→保存という手順が面倒ですし、ブラウザに表示している内容をキャプチャしたい場合などは手動でスクロールして結合するという面倒な作業が発生したりします。
そこで私がお奨めするソフトは「キャプラ」 です。
このソフトを使えば、画面キャプチャと保存がクリックだけでできますし、トリミングも簡単です。しかも、設定によってはスクロールも自動でやってくれます。
もしお気に入りのキャプチャソフトがなければ、一度試してみてはいかがでしょうか。

リレーショナルデータベースのテーブル設計を行っていると、どのカラムにインデックスをつければよいかがよくわからなくなってしまうのは私だけではないと思います。
DBMSがMySQLやPostgreSQLの場合、私はEXPLAIN句を使ってインデックスのつけ忘れがないかをチェックするようにしています。
EXPLAIN句を使うとSELECTクエリの実行計画が表示されるようになり、この情報を元にテーブルのインデックスを設定していきます。

MySQLの場合
EXPLAIN SELECT ...
を実行すると表示されるテーブルのうち、チェックすべきカラムは「type」です。
このtypeカラムに「ALL」と表示されているレコードがあれば、そのテーブルのインデックスを見直す必要があるかもしれません。

PostgreSQLの場合
EXPLAIN SELECT ...
を実行すると表示される「QUERY PLAN」に「Seq Scan on」から始まる行がある場合、onの後に続くテーブルのインデックスを見直す必要があるかもしれません。

(注意)
テーブルのインデックスは万能ではないので、何でもつけていればよいというわけではありません。
インデックスをつけすぎると更新性能が低下してしまいます。
またデータの種類によってはインデックスをつけても検索速度の向上が見込めない場合があります。
その最たる例はブーリアン値や性別のような限られた少ない種類のデータしか格納されないカラムです。
DBMSによっては、こういったデータ用のインデックス技術が実装されているようですが…。

参考:
PostgreSQL 文書
MySQL 4.1 リファレンスマニュアル
配列の内容を文字列ではなく数値としてソートするには以下のようにします。

array.sort(comparator);

function comparator(value1, value2) {
var index1 = parseInt(value1);
var index2 = parseInt(value2);
return index1 - index2;
}


比較関数(上記の場合はcompareator関数)を入れ替えることにより、色々な順序や方法でソートすることができます。