2011年11月24日木曜日

MySQL Connector 64bitでMS-AccessからMySQLにテーブルリンクを作成できない

Linux上に構成したMySQLをMS-Accessから見られると便利だ。
MySQL Connector/ODBC でそれができる。
ODBC経由で接続して、MS-Accessからテーブルを表示したり、編集したりできる。

Windows 7の64bit版を使っているので、MySQLのサイトから
「Windows (x86, 64-bit), MSI Installer」
という64bit版のプログラムをダウンロードした。バージョンは5.1.9だ。
しかし、MS-Access上でテーブルへのリンクが作成できなかった。

どうやってもできなくて
「Windows (x86, 32-bit), MSI Installer」
という32bit版に入れ替えると、使うことができた。

それで使えているから別にいいのだが、Windows 7の64bit版なので、MySQL Connectorも64bit版が正しいような気が…なぜ?

ユーザー登録システムの捨てアド対策

ウェブサイト等のユーザー登録システムを作成していて、ユーザー登録フォームにメールアドレスの入力欄を設けている場合がある。
メールアドレスのフォーマットをチェックしたり、ドメインの存在チェックをして、正しいメールアドレスが入力されているか確認したりするのはよく行われる。

それ以外に短時間で消滅するメールアドレスが存在することも知っておいたほうが良い。
インターネットサービスの中には、10分程度の時間だけ一時的に存在して、しばらくすると消滅するメールアドレスを発行しているところがある。いわゆる「捨てアド」である。
そのようなメールアドレスでユーザー登録された場合は、ウェブサイトはユーザーと連絡不能になる。
ウェブサイトが何かのダウンロードサービスをしているような場合には、目的の物をダウンロードするために、そうした一時的なメールアドレスが使われることがあるようだ。
ウェブサイトに正しいメールアドレスを入力させるのが、スパムメール等、ユーザーが望まないものを送りつける目的であれば論外であるが、正当なウェブサイトなら、連絡不能になる不都合が起こることも考えておかなければならない。

一時的なメールアドレスが入力されたかをチェックするには、そうしたメールサービスが発行するメールアドレスのドメイン名部分をチェックする方法がある。
そして、ユーザー登録フォームに不正なメールアドレスが入力された場合はエラーを表示し、ユーザー登録できないようにする。

そのようなメールアドレスを入力する者がウェブサイトを利用する意思がないユーザーであるとみなすとすれば、不正なメールアドレスであることが分かった上でユーザー登録を許し、目的とする行為(消極的な投稿や目標とするものの取得)が行えないようにするのも方法だろう。

また、入力されたメールアドレス宛に確認のメールを送信し、メールに記載されたアドレスにアクセスさせることでユーザー登録を完了させるシステムとしている場合には、確認メール送信までの時間を長くするのも対策になる。

運用時には、新しいユーザーが登録されたら、常にドメイン名部分をチェックするようにしておきたい。日本国内でよく使われるドメインはISPや企業名、gmail、Yahoo等が多い。
実はそれほど種類は多くないし、一時的なメールアドレスのドメインはあまり見かけない名前のことの方が多いので、あやしいドメイン名というのはすぐに気がつく。あやしいドメイン名でユーザー登録された場合には、該当のウェブサイトをチェックして、一時的なメールサービスであることを確認し、ウェブサイトの不正メールアドレスリストに追加しておく運用とすることで、新たなドメインの登場に対抗する。

一時的なメールアドレス以外にも、無料で作成可能なフリーメールでも同様の心配がある。これはgmail、Yahoo、hotmail等、多くの種類がある。この辺りは仕方ないとするか、厳格に取り締まるかはサイトの運用方針次第だろう。

このような対策を考えることになるのは、メールアドレスを転売する業者や、広告メールを配信する業者が存在していることで、ユーザーがメールアドレスの登録をためらうためだ。
その結果、真っ当なウェブサイトまでもが怪しまれることになる。
しかし、ユーザーに悪質なケースも見られる。表に出てくることは少ないが、ウェブサイトを運営していると、遭遇するユーザーモラルは様々だ。
ウェブサイトは自分の身を守るために、ユーザーを甘く見て油断するようなことはできないのが現実だ。

PHPのPDOでデータベース接続をプールする方法

PHPのPDOでデータベースを扱う場合に、データベースの接続をプールして使い回してくれる方法がある。
スクリプト実行のたびに再接続しているとオーバーヘッドが生じるからだ。

例えば以下のようにしてPDOのインスタンスを作成すると良い。
----------
$pdo = new PDO('mysql:dbname=test;host=localhost', 'user', 'password', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_PERSISTENT => true));
----------
「PDO::ATTR_PERSISTENT => true」の部分がそれ。
後はPHPにおまかせで良い。
こういうものが用意されているがPHPの便利なところだ。

接続プールとは関係ないが、この例ではMySQLで文字コードにutf8を指定している。MySQLでutf8を使っている方はこのようにして文字コードも指定すると良い。

ユーザー登録システムにおけるパスワードの強度チェック

ウェブサイト等でユーザー登録が必要なシステムを作成する場合に、注意する点がいくつかあるが、そうした中のひとつとして、ユーザーが設定するパスワードにも気をつけておきたい。
ユーザーが安全性の低いパスワードを設定した場合には、「あらし」や「なりすまし」が発生する危険性がある。
そのような場合には、ウェブサイトのセキュリティ管理にまで追求が及ぶこともあり、ユーザー、ウェブサイトともに被害を被る。
新規ユーザー登録時や、パスワード変更時に、パスワードの強度をチェックするようにしておき、強度が低すぎるパスワードは受け付けないようにしておく方が安全だ。

チェックする項目としては以下のようなことが考えられる。
・数字のみのパスワードは受け付けない。
 12345678
 111222333

・キーボード配列に沿ったパスワードは受け付けない。
 1qaz2wsx ・・・ 1キーと2キーから下に押していったパターン
 qazwsx ・・・ qキーとwキーから下に押していったパターン
 qwertyuiop ・・・ qキーから右に押していったパターン
 741852963 ・・・ テンキーを下方向に押していったパターン

・特定の文字列を含むパスワードは受け付けない。
 password
 pass
 hoge
 hogehoge
 hogefuga
 サイト名等

・繰り返しパターンのパスワードは受け付けない。
 abcdabcd
 abcabcabc
 abcddcba

・ユーザーIDを含むパスワードは受け付けない。
・含まれる文字の種類数が少ないパスワードは受け付けない。

キーボード配列等の文字列パターンは以下のPHPプログラムのように、正順、逆順どちらでも受け付けないようにしておくと良い。
----------
$pattern = "1234567890".
    "abcdefghijklmnopqrstuvwxyz".
    "qwertyuiopasdfghjklzxcvbnm".
    "qazwsxedcrfvtgbyhnujmikolp".
    "1qaz2wsx3edc4rfv5tgb6yhn7ujm8ik9ol0p".
    "zaqxswcdevfrbgtnhymjukilop".
    "zaq1xsw2cde3vfr4bgt5nhy6mju7ki8lo9p0".
    "741852963963852741";
if(stristr($pattern, $password) != false)
    return false;
if(stristr(strrev($pattern), $password) != false)
    return false;
return true;
----------

PHPでメール送信する方法

PHPのプログラムからメール送信するにはmail()を使うことで簡単に行える。

サンプルプログラムは下の通り。
通常、このプログラムで変更が必要なのは最初の4行の$toMailAddress、$subject、$mes、$headerに入れる内容だけで良いと思う。

-----------
$toMailAddress = "test@test.com";
$subject = "メールタイトル";
$mes = "こんにちは\n本文";
$header = "From: test@test.com\r\n";

mb_language("ja");
mb_internal_encoding("ISO-2022-JP");
$subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8");
$subject = mb_encode_mimeheader($subject,"ISO-2022-JP");
$mes = mb_convert_kana($mes, "KV", "UTF-8"); // 「半角カタカナ」を「全角カタカナ」に変換
$mes = mb_convert_encoding($mes, "ISO-2022-JP", "UTF-8");
if(!mail($toMailAddress, $subject, $mes, $header))
    error_log("メール送信エラー");
-----------

環境の文字コードはUTF-8、CentOS 5.7 + PHP 5.3.8を使っている。

複数システムの結合は絶対に一回でうまくいかない

古いシステム開発の手法では単体テスト、結合テスト、総合テスト等と呼ばれるテスト行程の種類がある。
結合テストはどのレベルの結合をいうのかということはあるが、プログラムのある部分同士を連動させて動作させた場合のテストである。

結合テストだけの話ではないのだが、異なる環境で作成されたプログラムを結合させた場合、確実に動作しないと思って間違いない。
結合部分が、関数呼び出しか、ファイルか、ネットワークか等に係わらず、双方のインタフェース仕様をどんなに厳格に定義したとしても、2つのプログラムを別々に作り、はじめて結合すると、絶対に動かない。

これは理屈ではなく、少し宗教じみた話である。マーフィーの法則のようなものだ。
簡単なインタフェースで自信満々でも、絶対に一発では動かない。
うまくいくことを信じてことを進めると確実に残業するはめになる。
うまくいかないことを前提に考えておいてよいし、心配しなくてもそのようになる。

キーボードのタイピング音がうるさい人は注意

もうずいぶん昔だが、UNIXサ-バーのとてもタイプ感の良いキーボードで仕事をしたことがあった。
そのキーボードを叩きながら、タッチタイピングで軽快に入力している自分の姿を想像して、きまっていると悦に入っていたかもしれない。
今思うと恥ずかしい。

今の時代、キーボードのタッチタイピングはすっかり見慣れた光景だ。IT関連の技術者だけでなく一般の人も普通に行なっている。識字や算数の感覚に近く、できることが当たり前で、もう意識すらしない。
いまさらキーボードのタッチタイピングがどうこうという話をしても懐かしく感じる。

最近、会社のオフィスで仕事をしていると、周囲のキーボードの音が気になることが多い。
私が神経質すぎるのが一番の原因だが、そうはいっても集中力を欠いてしまい一時的に頭の回転を止めさせられることがある。

大きな音のするキーボードを使っている人は周囲に迷惑をかけていることがある。
キーボードのタイピングが速いというのは、周囲から羨望の目でなく、顰蹙の目で見られているだけだ。

プラスティッキーなカチャカチャ音のするキーボード。エンターキーやスペースキ-等が、パンッ、カンッ、と、鋭い音のするキーボードは要注意。
特に高速にタイピングできる人こそ気をつけたい。

ブログやホームページのアクセスアップ方法を考える

ホームページやブログを作成しているような人は、自分のサイトに多くの人が訪れて欲しいと考えることがある。
純粋に自分の発信する情報を見てもらいたいと願ったり、アフィリエイト等で広告収益を得たいと考える人。
アクセスアップのためにランキングサイトに登録してみたり、SEOで検索エンジンから人を集めたいと考えたりする。

アクセスアップを願うことや、その活動をしてみることは良いと思う。その結果、残念ながらあまり結果は得られないだろう。
客観的に考えてみると良い。世の中、大量のウェブサイトがある。そう簡単にいくわけがない。

そういう私も色々考えたりするが、今思うことは、もうアクセスアップはあまり考えないようにしてはどうかと。
要するに、あきらめてしまうのだ。
アクセスなんかなくたっていいじゃないか。
自分が成長し、少数の訪問者か、あるいは自分ひとりが楽しめたらそれでよし。
自分色のサイトを作ろう、と。

アクセスアップばかり考えているサイトというのは、どうしても下心が見えてしまう。サイト訪問者というのはそうしたことを敏感に感じ取る。訪問者に余計なことを感じてもらってもイメージダウンになるだけだ。
ホームページにせよ、ブログにせよ、その作成にかかる労力に対して見返りは小さく、割に合わないのが普通だ。
結局、人の欲というのは尽きることがないので、どこまでいっても満足することなどない。

ブログだったら、100%自分のポリシーで満たされた世界一理想的なサイト。
ホームページだったら、細かなレイアウトまで思いのまま。部屋の中の家具の配置を考えるような楽しさがある。
アクセス数よりも、自分の頭の中に思い描くものを形にしていく。それを思うだけでエキサイティングだ。