いまさらだけど、マジックナンバーの使用をやめた。
その理由はWordPressを解析したときに、とても見やすかったから。
(WordPressのDBはマジックナンバーの使用を極力避けて作られているのよ)

マジックナンバーとは何らかの意味・状態を0や1などの数値で表す方法であり、そのプログラム設計者にしか理解できない魔法の番号。

例えば、DB TABLEに論理削除を表すフィールドがあったとしよう。
今まで僕の場合は数字の0か1でレコードの論理削除を定義してきた。

0 = 削除されていない状態
1 = 削除されている状態

この方法をやめたの。
で、今はどんな方法を採用しているのかと言うと、

'publish' = 削除されていない状態
'deleted' = 削除されている状態

このように情報自体に意味を持たせておくことでソースコード内の文章が明瞭になり、別の担当者にバトンタッチしやすくなるんだ。知らないひとが作ったWordPressを、誰もが簡単にカスタマイズできるように。

いまさらだけどね。
オープンソースは手軽にWebサイトを構築できる手段のひとつ。
しかし配布元は動作に関して無保証であり、なおかつソースコードが一般に公開されている事から脆弱性(セキュリティホール)が発見されやすい。
もしアプリ内で脆弱性が発見された場合は、世界の有志達が脆弱性にパッチを施した新バージョンを開発し発表するわけだが、現在使用中のモノを定期的にバージョンアップ「しない」無責任なユーザがめちゃんこ多い。
バージョンアップを怠った代償が自身にのみ及ぶのであればどうでも良い話なのだが、そうもいかないのがWeb界の常識。

バージョンアップの責任を放棄し、その後新たに発見された脆弱性を修正しないままにしておくと、悪意あるユーザがその脆弱性を突いてくる。
その脆弱なWebサイトを踏み台に、他の健全なWebサイトやWebユーザに迷惑行為を仕掛けてくるわけだ。

ウチが運営している掲示板サイト(オープンソースは一切使用していない)があるのだが、どこかのWebサイトを踏み台に迷惑な書き込みを残してゆく。
踏み台にされているWebサイトは「phpBB」というフォーラム型掲示板を使用し、バージョンアップを怠っているものと考えられる。
スパム書き込みの内容をGoogleで検索してみると、ウチ以外にも3250ものWebサイトが迷惑行為を受けている模様。つまり1人のWebサイト管理者が責任を放棄したことが原因で、3250人が迷惑していることになるんだね。

オープンソースを採用することは反対ではない。しかし「タダだから」「楽ちんだから」といった安易な理由だけで利用せず、運用するうえでのリスクをちゃんと理解してほしい。
クライアントにオープンソースの利用を勧める人達は、デメリットもしっかりと伝えて欲しい。

こんな偉そうな事を書いているが、いつか私も悪意あるユーザの踏み台になってしまうかも知れない。常に危機感を持って業務を遂行しよう。
掲示板やブログなどの自由投稿型サイトを運営していると、いずれ問題になってくるスパム投稿。
IPアドレスでのアクセス制限には限界があるので、思い切って国レベルでアクセス拒否を設定してみた。

deny from .cn
deny from .kr
deny from .hk
deny from .ru
deny from .ro
deny from .ph
deny from .eu


以下、トップレベルドメインの補足
.cn (中国)
.kr (韓国)
.hk (香港)
.ru (ロシア)
.ro (ルーマニア)
.ph (フィリピン)
.eu (欧州)

2009-01-09 10:10:52 に PostしたCIからFCKeditorを使う記事、以下の記述が抜けておりました。
http://ameblo.jp/dev-okinawa/entry-10189611414.html

codeigniter/application/libraries/fcke.php
FCKeクラス内に以下のメソッドを追加する必要があります。

function __set($name, $value) {
$this->editor->$name = $value;
}

こうすることで、以下の方法でエディタ内に文字を表示することができます。

$this->fcke->Value = '<b>Hello!!</b>';

ついでに該当記事 も修正。
普段開発している環境は http://localhost/
phpMyAdminをのURLを http://phpmyadmin/ で呼び出せるようにしようかなと思った。

C:/Windows/system32/etc/hosts に、以下の1行を追加。
127.0.0.1 phpmyadmin

httpd.conf またはインクルードしている.confファイルに Virtualhost 設定を書き加える。
<VirtualHost *:80>
ServerName localhost
</VirtualHost>

<VirtualHost *:80>
ServerAdmin admin@hogehoge.com
DocumentRoot D:/localhost/phpmyadmin/www/
ServerName phpmyadmin
ServerAlias phpmyadmin
<Directory />
AllowOverride All
Allow from All
DirectoryIndex index.php
</Directory>
</VirtualHost>

Apacheを再起動すると、ローカルにヴァーチャルホスト環境がつくられる。

http://localhost/ これまでのローカルホストサイト
http://phpmyadmin/ 今回新たに設置したphpMyAdmin


MAMP 環境の場合は /etc/hosts で同様の設定を実施し、.conf ファイルを調整すれば同じ事ができるよ。

これ、オススメ。



WordPress2.7 でのお話し。

もし WordPress外部で特定カテゴリの記事だけを自作プログラムで抽出したい場合の方法をメモしてみる。
(WordPress内部の場合は簡単だから解説は必要ないよねw)

仮にカテゴリスラッグ名"food"があったとする。
この場合、テーブル`wp_terms` の `slug`フィールドを検索し、`term_id` を取得する。
SELECT `term_id`
FROM `wp_terms`
WHERE `slug` = 'food';
取得した`term_id`から、`wp_term_taxonomy`テーブルの`term_taxonomy_id`を取得する。
SELECT `term_taxonomy_id`
FROM `wp_term_taxonomy`
WHERE `term_id` = wp_terms.term_id;
さらに、先ほど取得した`term_taxonomy_id`で、`wp_term_relationships`から記事IDを取得するの。
SELECT `object_id`
FROM `wp_term_relationships`
WHERE `term_taxonomy_id` = wp_term_taxonomy.term_taxonomy_id;
ここで取得できた`object_id`が記事ID(wp_posts.ID)ってわけ。
ここでは3回のクエリに分けて書いたけど、実際使うときはサブクエリでSQLをまとめたほうがいいですから。

※この記事はあくまで僕の作業メモです。
  もし内容に間違いがあった場合、ご指摘いただければ幸いです(笑)

  掲示板の運営で一番苦労するのがスパムボットによる迷惑書き込み。
アダルトサイトの宣伝やフィッシング詐欺によく使われちゃうので、もし皆がこのような書き込みを見かけたときは絶対にリンクをクリックしないでね!!

で、僕の掲示板サイトで地道に収集したスパムボットのIPアドレス17,317個を一挙公開。
スパムボットでお悩みの方はご活用くださいな。.htaccess ですぐに利用できるよう "deny from" を付けてあります。

こちらからダウンロード (zip形式 108.5KB)

ちなみに僕のサイトの場合は、世界情勢によっては中国・韓国からのアクセスも遮断しています。
deny from .cn
deny from .kr



WordPress 2.7でのお話し。
例えばカスタムフィールドに「都道府県」という情報があり、「沖縄県」を設定している記事だけを抽出したいとしよう。

・カスタムフィールドの設定
  キー = pref
  値  = 「沖縄県」を含む47都道府県名

この場合、目的の記事情報と関連する`wp_postmeta`テーブルには以下の情報が INSERTされている。
meta_key  = 'pref'
meta_value = '沖縄県'

ここで`wp_postmeta`テーブルの構造を少し解説。

フィールド名 データ型 意味
meta_id bigint(20) 当テーブル内のユニークID
post_id bigint(20) 記事のID (`wp_posts`テーブルの`ID`フィールドの値を指す)
meta_key varchar(255) 今回の場合は'pref'が入る
meta_value longtext 今回の場合は'沖縄県'が入る

つまり、都道府県フィールドで「沖縄県」が設定されている記事IDは以下のSQLで取得できるんだね。

SELECT `post_id`
FROM `wp_postmeta`
WHERE `meta_key`='pref' AND `meta_value`='沖縄県';

なぜ今さらこんな事を書いたのかと言うと、僕のカスタムフィールドに対する間違った思い込みがあったため。カスタムフィールドを専用で管理するためのマスタテーブルがあると思い込んで構造解析を進めたためドツボにハマってしまい、2時間近く時間を無駄にしちゃったのよねw

自分への戒めのためにこの記事をいた。
おれ、もっとがんばれ!!



さくらインターネットのホスティングを使ってのおはなし。
PATH_INFOを使って拡張子なしのファイルをPHPとして動かそうとしたんだけど、どうも無理みたい。
"detail" という拡張子なしのファイルがあったとし、この中にはPHPのスクリプトが記載されている。
URL は http://www.hoge.com/detail/param1/param2/index.html

これまでCPIのサーバでは、以下の方法でPHPとして動作させることが出来たんだよね。
.htaccess
<FilesMatch "^detail$">
AddType application/x-httpd-php
</FilesMatch>

さくらインターネットでは以下の方法で対処した。
"detail" を "detail.php" にリネーム。
.htaccess
<FilesMatch "^detail$">
ForceType application/x-httpd-cgi
</FilesMatch>

これで動いた。

いろんなサイトで php.ini "cgi.fix_pathinfo" の設定変更について書かれているが、設定値はゼロのままでいいみたいよ。

追記 2009-01-16 13:00
まぁ mod rewrite を使えばいいハナシなんだけどね。



■弊環境
CodeIgniter1.6.3 日本語パック
FCKeditor 2.6 日本語版
PHP 5.2.1

■参考サイト
http://www.simplecoding.org/podklyuchaem-fckeditor-k-codeigniter.html
ウラジミール スタセンコ(?)さん、ありがとう!!
以下、適当な日本語に訳して書きますね。

■手順
(1) ダウンロードしてきた fckeditorディレクトリをWebルートに配置。
(2) codeigniter/application/config/fckeditor.php 設定ファイルを作成。
<?php
$config['fckeditor_path'] = 'fckeditor/';
$config['fckeditor_url'] = 'fckeditor/';
$config['fckeditor_name'] = 'MyFCKeditor';
$config['fckeditor_height'] = 300;
?>

(3) codeigniter/application/libraries/fcke.php ライブラリファイルを作成
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* FCKeditor接続
* @version 0.1
* @link http://www.simplecoding.org
* @author ウラジミールStatsenko * @ <vova_33@gala.net>
** /
class FCKe {

private $editor = null;

function FCKe() {
$CI = &get_instance();

//設定ファイルからデータを読み込む
$CI->config->load('fckeditor');

$fcke_url = $CI->config->item('base_url').$CI->config->item('fckeditor_url');
$fcke_path = substr(FCPATH, 0, strrpos(FCPATH, DIRECTORY_SEPARATOR) + 1)
.$CI->config->item('fckeditor_path');
include_once($fcke_path.'fckeditor.php');

$this->editor = new FCKeditor($CI->config->item('fckeditor_name'));
$this->editor->BasePath = $fcke_url;
$this->editor->Height = $CI->config->item('fckeditor_height');
}

function __call($method, $arguments) {
return call_user_func_array(array($this->editor, $method), $arguments);
}

//2009.02.16 追記
function __set($name, $value) {

$this->editor->$name = $value;
}
 }

/* End of file fckeditor.php */
/* Location: ./system/application/libraries/fckeditor/fckeditor.php */
?>

(4) .htaccessの mod_rewrite設定で、fckeditorディレクトリをエスケープするよう記述。
(5) コントローラからライブラリを読み込み、ヴューを呼び出し。
//FCKEditor呼び出し
$this->load->library('fcke');
$data['editor'] = $this->fcke->CreateHtml();
$this->load->view('edit', $data);

(6) ヴューでエディタを表示。
//FCKEditor
echo $editor;



これで動くはずよー。