WHAT'S NEW?
Loading...

フォームヘルパに関して(CakePHP Advent Calendar 12st)

« 11日 msng氏「CakePHPでデバッグレベルが0の時だけ発生するエラー
Datasourceを使い倒す」kaz_29氏 13日 »

スタンド名「スパスティック」
特技「空気読まない」
俺のスタンドだ。距離はゼロメートル。
むしろ俺自身がスタンド。

さて、CakePHP Advent Calendar 12日目の担当だ。
なんで12日目を選んだかというと、12という数字がすきだからだ。
それにyamlよりiniファイル好きな俺としては、12はドメスティックに愉快だとおもわないか?

ま、そんな話は完全に無視して良い。

12ということで、テストしたCakePHPのバージョンは1.2を使用してみた。

ところでテーマだけど、俺はフォームヘルパーに関して、ざっくりとやってみたい。

完全にオレオレフレームワークでプロプライエタリな開発環境だが、いい加減メジャーなフレームワークに移行したいといういろいろな開発者、もしくはその関係者に対して、俺はCakePHPがMVCフレームワークの中でもかなりの勢いがあるし、何しろ俺がやってるから俺が直接教えることができるんだ!的な普及活動をしているんだけど、質問の多くを占める、inputタグに関する滞りを払拭してみたいと思った。

CakePHP勉強会「eat the Cake」第1回目のレポート

さる11月2日、弊社ライトアップでCakePHPの勉強会をやったんだ。
主催は俺で、こういったカンファレンスは初めてだったので、やや緊張はしたものの、生来いいかげんな性格なので、意外に大丈夫なんだなということがわかった次第。

というわけで勉強会のレポートをする。

使用したスライドは以下。


部分的に(マーカーなどが)文字化けしてしまっているので読みにくいかもしれないが、そこら辺は脳内エンコードが達者な日本人には特に注意しないでもご理解いただけると思うので、直さないでそのまま使用させていただく。

CakePHP用寝ぼけたバリデーションメッセージを起こす

CakePHPのバリデーションは非常に便利だ。1.1時代はかなりショボすぎる感があったけど、1.2になって、直感的にかなり分かりやすいものになった。

具体的に例を出すと、例えばメールフォームがあたっとして、内訳が
  • 件名:subject
  • 宛先:to
  • 本文:body
があったとする。
それらにバリデーションを入れる場合、例えば件名は空禁止、toはemail形式、本文は最低5文字(実際には5バイト)入力するのを強制する場合は、以下のような内容でモデルを設定することになる。
class Mail extends AppModel {
  public $name = 'Mail';
  public $validate = array(
    // 件名のバリデーション
    'subject' => array(
      // 空入力
      array(
        'rule' => array('notEmpty'),
        'message' => '件名を入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
    // 宛先のバリデーション
    'to' => array(
      // email形式
      array(
        'rule' => array('email'),
        'message' => '正しいメールアドレスを入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
    // 本文のバリデーション
    'body' => array(
      // 入力文字数
      array(
        'rule' => array('minLength', 5),
        'message' => '最低5バイトは入力してください',
        'last' => true,
        'required' => true,
      ),
    ),
  );
記事を書いた後CakePHP武将のecworks_masap氏に言われて気がついたんだけど、1点注意!「5バイト」なんて文字は運用では使わない。ユーザに対して「バイト」なんて単位を書くのはおかしいからだ。しかしここではあくまで例として(minLengthを使ったため)コードとの整合性を重視し、あえて「5バイト」と書いてみた。
各フィールド名の中には複数の条件を入れることができる。そしてそれらの条件1個1個に名前を付けることもできるが、今回は1つのフィールドに1個しか条件を入れてないので、特に名前は付けていない。

だから、'subject' => array()の中にいきなりarray()で条件をかいている。

各条件のコメント分にも書いてあるような内容を名前にしておくとあとで便利になる場合がある。もしくは厳密に名前を独自に付けることによるコントローラ側でのバリデーション判別などする場合も便利になる。具体的には以下のように、いきなり
array()ではなく、名前を指定してarray()を代入する。
'subject' => array( 'empty_case' => array( 'rule' => ・・・・・・ 'required'=> true));

CakePHPで多言語対応をする 【2/3】

言語切替ボタンを付けてみようじゃないか。

最終的にはフリーな国旗アイコンなどをゲットして、好きなレイアウトにすれば良い話なので、とりあえず全部テキストでやっていく予定。

完全にどのページからでもいつでも言語を切り替えられるのかと言われれば、「正解です」といえる様な処理なんだけど、ページネータなどのnamedパラメータが絡むテストはしていないので予めご了承していただきたい。
何事もそうだけど、「この処理は完全に全ページで正しく動くのか?」とか「1箇所でも挙動が怪しい場合は実装するな!」とか、そんな予測コストなんかはっきりいって犬が喰えば良い

なんかあった時のことを考えつつも、「こうなる可能性もあるが、ここはひとまずこう実装しておく」という、対応コストで作っておかないと、あなたは何時まで経っても自宅に帰れなくなる

そして「そんな事いってもそういう仕組で仕事が進んでいるんだからしょうがないじゃないか」と言う人がいるかも知れないが、それはそういう星の下に生まれたことを己が悔やむしかない。そしてもっと良い会社に転職できることを(俺は本当に)切に願う。

大企業のクソフローなんか無視してなンぼ。
というわけでひとまず、新規でCakePHPを構築してみることにする。
  1. CakePHPのダウンロードと設置後、最低限の設定
  2. Dashboardsコントローラ
  3. POファイル作成
  4. 言語を変更
  5. 言語切替処理
  6. リファラを使う
だいたいこういった内容と流れになる予定だ。

当然だがXAMPPなどのLinux詐欺な環境での動作確認は一切してないので、こちらもあわせてご了承いただきたい。あくまで純粋なLAMP環境を前提としている。

もしLinux詐欺をやめて、正しいLinuxを使いたくなった場合、VMwareを使うと良い。
詳しくはこちらを参照されたし。

さて早速取り掛かろう。

■CakePHPのダウンロードと設置後、最低限の設定

今回は会えて1.2を使う。というのも、1.3は1.2と比べると変更点が多く、まだ俺自身調査しきれていないからだ。

世の中には便利な本もある。『Pocket詳解 CakePHP辞典』だ。
俺はまだこの本は手に入れて無い。しかしこの本は正直欲しい。そのうち買う。

マロはどうしても1.3じゃなきゃイヤじゃ!的なわがままちゃんは、こういった優れた書籍をゲットし、己で修行していただければと思う。

さて、CakePHPの1.2.8をダウンロードしたとして、Apacheの設定も終え、早速初期設定といこうじゃないか。

まずは余計なファイルの削除と、最低限の設定。

CakePHPで多言語対応をする 【1/3】

日本人は日本人の為だけに日本語のみを用意するのが好きであるし、それ自体が文化でもある。
俺はこういった日本の文化を、最高にくだらない低レベルなクソFuckでSuckな文化(略してガラパゴス)だと思っているんだけど、それに気づいたときには時すでに遅し。

なにしろ俺自身、どっぷりそんな日本の完全プロプライエタリ文化に染まりきっていた。
要するに俺もそこらの役所のおえらいさんとかと同じ、クソFuckでSuckなヘタレということである。こりゃたまらんぜ。

というわけで、俺自身が俺に向けて、そんな“実は俺が一番SUCKだった”説から脱却せよと言ってみたい気持ちをそのままストレートに表現するために、そして、仕事で多言語が要求されているのもあわせて、CakePHPで多言語対応をしてみようと思う。

その前にまずは、ブラウザで言語はどのような扱いになっているのかを知っておく必要がある。

まずこんなスクリプトを用意し、ブラウザで実行してみる。
print_r($_SERVER['HTTP_ACCEPT_LANGUAGE']);
俺の環境では以下のような結果になった。

Google Chrome 7.0
ja,en-US;q=0.8,en;q=0.6

FireFox 3.6
ja,en-us;q=0.7,en;q=0.3

IE8
ja

Opera 10
ja-JP,ja;q=0.9,en;q=0.8

さて、なんじゃこりゃ、というのが正直な結果だが、よく見ると国名らしき単語と数値が表示されているのがわかる。

実はこれ、カンマで改行し、セミコロンで区切ると分かりやすい。
Chromeを例にとると、このようになる。

ja
en-USq=0.8
enq=0.6

さらに分かりやすく、テーブルヘッダを入れてみるとこうなる。

言語名品質値
ja
en-USq=0.8
enq=0.6

そしてさらに表示された順序も加えると、

順序言語名品質値
1ja
2en-USq=0.8
3enq=0.6

となる。

これが何を意味するのかというと、実はただ単純にブラウザに対して表示させる言語の優先度を順位を元にして設定しているというだけのこと。

jaの場合は品質値がないが、これは自動的に1という数値が割り当てられているようだ。

品質値の浮動小数点は、実はこれも優先順位をあわらしている。

試しにChromeの設定を変更し、
  1. 日本語
  2. 英語(アメリカ合衆国)
  3. 英語
の英語部分を入れ替えてみて
  1. 日本語
  2. 英語
  3. 英語(アメリカ合衆国)
にした場合、先程のスクリプトの実行結果は
ja,en-US;q=0.8,en;q=0.6
から
ja,en;q=0.8,en-US;q=0.6
に変わる。

大体ご理解いただけただろうか。

Fedora13 on VMwareでカーネルクラッシュの巻

突然やってきた。
VMwareでFedora13を起動したところ、画面上に見慣れないアイコンが。


クラッシュレポートだったかな。
中には、kernelがクラッシュしたでおますよ!うほ!と書かれていた。

そもそもVMなんで、別にクラッシュしたからといって、本気で「ジーザス!」とは言わないですむし、そもそもそれもVM使う目的でもあるわけだから、「貴様ごときに男らしさは求めてねぇズラ!」と思いながら、レポートを見てみた。

どうもあやしい。なんだこれは。

Guest filesystem driver                                           [FAILED]
Mounting HGFS shares:                                             [FAILED]
Guest memory manager:                                             [FAILED]
Guest vmxnet fast network device:                                 [FAILED]
VM communication interface:                                       [FAILED]
VM communication interface socket family:                         [FAILED]
Blocking file system:                                             [FAILED]
Starting abrt daemon: abrtd: Failed to start: timeout waiting for child
                                                                  [FAILED]
FAILEDだらけじゃねぇかオラ!

そしてそもそもだが、HGFSってなんぞや?という素朴すぎる疑問が残った。
こんなものがカーネル先生をクラッシュさせたのか?ニダ?

いろいろ調べてみると、どうやらVMware-toolsを入れなおしたほうがよさそうなことがわかったので、VMメニューからvmware-toolsの再インストールを選択し、やり直してみた。

俺はVMware-toolsを入れた後は必ず再起動させているんだけど、とりあえずこれで落ち着いたようだ。カーネル先生は健在だ。

しかし、インストール中にこんな表示があった。
Creating a new initrd boot image for the kernel.
   Checking acpi hot plug                                  [  OK  ]
Starting VMware Tools services in the virtual machine:
   Switching to guest configuration:                       [  OK  ]
   Guest filesystem driver:                                [  OK  ]
   Mounting HGFS shares:                                   [失敗]
   Guest memory manager:                                   [  OK  ]
   VM communication interface:                             [  OK  ]
   VM communication interface socket family:               [  OK  ]
   Blocking file system:                                   [  OK  ]
   File system sync driver:                                [  OK  ]
   Guest operating system daemon:                          [  OK  ]
   Virtual Printing daemon:                                [  OK  ]

すげぇ気持ち悪いよなーこういうの。

結局カーネル先生は大丈夫くさいけど、また再発しないとも言い切れない。
もう少しよく調べてみようと思ったんだけど、すぐに解決した。

VMのファイル共有をONにすればよいらしい。

なるぺちょ。

ではさいなら。

CakePHP用フォームの整列jQueryプラグイン

どうしてもCakePHP内のビューやコントローラ内で、php自体によってHTMLタグを生成したいという人以外は、可能な限り以下の方法をとると、寝覚めが良いはずだ。
  • HTMLタグには極力アトリビュートを付けない
  • 付けるのは少しのIDといくつかのclass程度
  • 当然TABLEタグでレイアウトなんぞは組まない
 どういう事かというと、吐出されたHTMLタグまでをphpで制御しようというのはおかしいと思っているから、そういう完全に見た目という意味でのビューは、jQueryなどのクライアントサイドスクリプトでやっちまえばいいだろう。

こういう考えで開発していくと、CakePHPのFormヘルパーが吐き出す、そっけなく簡素で女々しいHTMLタグも、むしろそれでいてくれてありがとうと思えるほど便利になる。

さて、俺が何を言いたいのか、わかっていただけてるかな。


「CakePHPのFormヘルパーで出力されたラジオボタンを整列したい」という問に対してphpでHTMLタグを出力させ、cssなどで整形するという解決

これ、完全に、デザイナの領域なのに、開発側で対応しようというのがそもそもの間違いであり、こういった作業は往々にして大した結果に至らない。要するに解決にならない場合が多いのではないだろうか。

とにかく、無理矢理が良くない、ということを言いたい。

CakePHPはほぼphpで書かれたMVCだけど、Vから先のことはこう考えるとよいだろう。

JavaScriptで、HTML(DOM)とCSSをコントロールする

だ。俺が言いたいことがわかっていただけたかな。

CakePHPのMVCよろしく、jQueryをコントローラとし、DOMで拾う内容をモデルとし、それらを吐き出すためにcss、場合によってはHTMLで整形してビューとする、というような流れを考えたほうが良い。

このほうが何しろソースは綺麗になるわ、サーバの負荷分散にもなるわ、デザイナのスキルアップにもなるわ、開発者の手間も省けるわ、で、いいことずくめだ。どうしてやらない?と俺は聞きたい。

ちなみにこの方法が実現できない様な糞ブラウザ(IE)を上司から要求されたら、そいつにこう言ってあげるとよいだろう。

「おや?部長、口からクソがはみ出てますよ?」

と。


というわけで、前置きが長くなったけど、CakePHPで素直に出力したcheckboxを、DOM操作で整列させるjQueryプラグインを作ったので披露してみたい。

CakePHP側では以下のようなビューを使用することとする。
echo $form->input('hobbies', array(
      'type' => 'select',
      'multiple' => 'checkbox',
      'options' => $masters['hobby'],
      'div' => true,
      'label' => false,
    ))
$masters['hobby']には、find('list')などして生成したマスタデータが入っている。

そしてこのビューを素直に表示させたときのサンプルがこうだ。
 まぁこんな感じだよな。当然縦に長くなる。

正直いって、生粋の開発者として長年生きてる人にとっては、この時点でこれ以上いじるのはやめたほうが良い。ろくなことがない。デザイナがやりにくくなるだけだ。2列にしてと言われても、開発者はやっちゃだめだ。

CakePHP1.3で配列ベースの国際化を試す

昨日CakePHP1.3の挙動を調べていたんだけど、何がやりたいかというと、実は英語、中国語、韓国語、日本語のSNSを作る事になっているので、完全に国際化をさせないといけない。

今まではCakePHP1.2を長い間使っていたけど、バーチャルフィールドに惹かれてCakePHP1.3を使うことにした。

CakePHP1.3ではapp/libsというディレクトリが増えていて、知人が言うには「何でもいれると良いよ!(MASA-Pさん)」とのことなので、何でもいいからいれてみることにした。

何を入れるかというと、まずはマスタ系の文字列を格納しておきたい。
というのも、1年ほど前、データベースでi18n対応したとき、あまりの面倒くささと手際の悪さで、__()関数使ったほうがメンテナンシビリティ高いアルよ!と独断している状態を続けている。

というわけなんだけど、さすがにすべてのリテラル文字列を配列に入れて宣言するのは、いくらなんでもメモリ使いすぎなので、カテゴリ別に関数にしておくことにした。

CakePHP1.3の話




SQLの修行は一旦おいておき、CakePHP1.3がどういう動きをするのか調べてみた。


上から順番にインデントさせて書いてみた。
さすがに作りが凝ってる。

■/index.php
・各種定数の定義

  ■/app/webroot/index.php
  ・各種定数の定義
  ・bootstrapの読み込み

    ■/cake/bootstrap.php
    ・PHPバージョン定数の定義
    ・PHPエラー表示に関する設定
    ・/cake/basics.phpの読み込み

SQLでちゃんとしたランキングを作る【1/3】

SQLを使ってランキングを表示させるなんてことをやったことがある人もいるだろう。
たとえばメンバー(訪問者という意味でのユーザは2種類あって、登録ユーザをメンバー、非登録ユーザをビジターと呼んでいる)にポイント属性が設定されていて、そのポイントを毎日集計する、そしてその結果、上位から10件取り出せば、ランキングデータが1位までそろう、というものだ。

ちょっと待て!!
それたぶん、インチキ!!

MySQLであれば、
select * from histories
order by point desc
limit 10
と吐けば、pointが高い順に上から10件の結果を得ることはできるが、ただ10件取得するだけで、ランキングとして正しいかどうかは別問題だ。

というのも、同位の場合があるからだ。

ある2人のユーザが同ポイントだった場合、内部ではpointではなくidや登録日などの順で順位が変わってしまうということになる。正直これは不本意だ。

というわけで、いくつかパターンを考えてみる。以下は、3位が二人いる場合を例にとってみた。

順位シーケンシャル 順位スキップ
10件まで 1 2 3 3 4 5 6 7 8 9 1 2 3 3 5 6 7 8 9 10
10位まで 1 2 3 3 4 5 6 7 8 9 10 1 2 3 3 5 6 7 8 9 10

これだと、右下の「順位スキップ」+「10位まで」がよさそうだが、実はそうじゃない。
さらに以下は、3位が二人、8位が3人いる場合になる。

MySQLでクロス集計してみた【2/2】

先日のSQLでクロス集計した際、助言をいただけて別の方法で解決した(Dupont氏に感謝)。

俺なりに何が違うのか考えてみた結果、
  • sum()とcount()で結果が違う
  • coalesce()関数とは
の2点に絞って調査してみた。

まず前回俺が書いたSQLは以下になる。
select name as '商品名',
 count(case when color='白' then 1 else null end) as '白',
 count(case when color='黒' then 1 else null end) as '黒',
 count(case when color='赤' then 1 else null end) as '赤',
 count(case when color='青' then 1 else null end) as '青',
 count(case when color='緑' then 1 else null end) as '緑',
 case
  when name='ビックリ弁当箱' then sum(field(name, 'ビックリ弁当箱'))
  when name='最果てグローブ' then sum(field(name, '最果てグローブ'))
  when name='無駄毛ロンガー' then sum(field(name, '無駄毛ロンガー'))
  else null
 end as '合計'
from history
group by name with rollup
そしてDupont氏の助言は以下。
SELECT COALESCE(`name`, '合計') AS `商品名`,
SUM(CASE WHEN `color`='白' THEN 1 ELSE 0 END) AS '白',
SUM(CASE WHEN `color`='黒' THEN 1 ELSE 0 END) AS '黒',
SUM(CASE WHEN `color`='赤' THEN 1 ELSE 0 END) AS '赤',
SUM(CASE WHEN `color`='青' THEN 1 ELSE 0 END) AS '青',
SUM(CASE WHEN `color`='緑' THEN 1 ELSE 0 END) AS '緑',
COUNT(*) AS `合計`
FROM `history`
GROUP BY `name` WITH ROLLUP;
※COALESCE()関数とWITH ROLLUPは条件が一緒になるように追記してる

大文字小文字は抜きにして、基本的にcount()がsum()になっている点と、小計がcase式か、count()か、という点が大きく違う。

Windowsをちゃんと使って仕事を楽にする【3/3】

パソコンがおかしくなってから

え、パソコンって壊れるんだ!

と言う人もいた。そりゃ電気製品だし、立派に諸行無常の理を表すわけですよ。

それとは別に、たとえば描画が追いつかなくて一時的に画面が崩れたりしたら、

あ、壊れた!買い買える!

とか、

あ、壊れた!どうしよう買ったばかりなのに!

とか、慌てふためく人も多くいた。買ったばかりというのは大抵1年以上たっていたりするわけで、別にどうでも良い話し。

ところで、おかしくなってからあわててデータをバックアップしても、なかなかうまく行かない場合がある。すぐに終わるときはまるで壊れてないかの様にスムースに話しが進むのだが、意外に致命的な不具合が起きてしまっても正しく起動しちゃったりするので、かなり性質が悪い。

たとえばboot.iniが破損すると、Windowsがウンともスンとも言わなくなる場合が多いが、MFTが破損した場合、Cドライブなら致命的だが、Dドライブなどの物理的に別のドライブだった場合、なんと正しく起動してしまうわけだ。

そして、Dドライブを使おうとしたりして、アクセスが始まると、まるで時間が止まったかのように、パソコンは何も反応しなくなる。

Windowsをちゃんと使って仕事を楽にする【2/3】

さて、普段は絶対に使わなさそうな方法でアプリケーションを起動してみてどう思っただろうか。

昔(20年ほど前)の、いわゆるマイコンと言われた時代では、デスクトップ、アイコン、フォルダなどの仕組みは全く搭載されておらず、当然マウスというものもなかった。すべてキーボードで操作する。

MSX(1983年)の画面

その時代を経験している人としていない人では、基本的にコンピュータに対する操作自体に大きな差があるとおもう。

しかし、正直言ってWindowsやMac OS系のインタフェースからコンピュータを始めた人にとっては、

そんな太古のネタなんかしらんがな!!

で一蹴されてYOU LOSE!

Windowsをちゃんと使って仕事を楽にする【1/3】

大抵町のパソコン教室ってのは、パソコンは教えてない。

では高い金を払って若造に何を教わっているのか。
それは、Microsoft Officeである。

つまり、Microsoft Officeが使えるようになれば、それはパソコンが得意だという事になってしまう。

正直、ハショりすぎだと思う。

俺は幼少の頃からコンピュータをいじっているから、1995年だか1996年だかにWindows95を初めて触ったとき、特に抵抗はなかったが、それにしても昨今、誰かに教わらないと何も覚えられないというのはあまり理解したくない事実である。遺憾である。

なぜなら、

コンピュータは人間を補佐するべき存在

であるのに、補佐する側の使い方が分からないと言うのは、全く持って本末転倒だからだ。補佐される側が余計な消耗を繰り返してしまう。全く逆の効果だ。

そもそもコンピュータというのは計算機だ。だから計算は得意。

ゲームだって計算だし、ペイントで絵を書くのも計算だ。CPUがしっかり計算してくれた結果、アプリケーションがアプリケーション毎に決められた手順で画面に文字などを表示しているに過ぎない。

もし画面への結果を求めないでいい場合、たとえばbeepとコマンドを打つと音が鳴るだけで、画面には何も表示はしない、なんて場合もあるが、大抵、最近のアプリケーションは画面を構成している。つまりGUIを持っている。

たとえば音が鳴ったらインジケータが上下する、などの表示が存在するわけだ。必ずといって良いほど、画面に何かを表示させると言う、リソースの無駄遣いを意図的にさせているわけだ。

MySQLでクロス集計してみた【1/2】


たとえば
  • 最果てグローブ
  • 無駄毛ロンガー
  • ビックリ弁当箱
の3つの商品がそれぞれ
の色バージョンがあったとして、
それぞれどれだけ売れたのかを集計とかやってみる。

似たような作業が実務で発生し、SQL未熟者の俺としては、これはぜひ覚えたいと思い、いろいろ試行錯誤してみたら出来たので、備忘録がてらかいておく。

結果として、イメージされる表にするとこういう感じ。

商品名
ビックリ弁当箱11212
最果てグローブ22210
無駄毛ロンガー10212

都道府県別に男女数を出すような、こんな感じをイメージしてもよい。

都道府県
東京都 58
神奈川県 47
千葉県 031


メールを無断で無許可に削除してくれるThunderbirdからOperaに移行する【3/3】

さて、Operaメーラを使ってみていただけてるだろうか。
使う気がないのであればすぐに去ると良い。

今回はOperaメーラならではの機能を簡単に紹介しようと思う。

その前に一言。

ThunderbirdからOperaへメーラをチェンジ!というのを強く推奨しているわけではなく、ただThunderbirdを使っていたけどいやになったのでほかに何かメーラないかな、あ、Operaがあるじゃん!そして使ってみたら意外にこれ良いお!!!というだけの話しだ。

なので、ThunderbirdからOperaにメールをインポートするのは、デフォルトの機能を使った方法のみを説明しておく。しかも欄外に。
  1. 「設定」>「インポート/エクスポート」>「メールをインポート」を選択
  2. 「アカウントウィザード」が開くので「Thunderbirdからインポート」を選択して「次へ」
  3. 「開く」ボタンでThunderbirdのプロファイルデータ(デフォルトだとC:\Documents And Settings\<ユーザ名>\Application Data\Thunderbird¥Profiles\<ハッシュ値>\prefs.js)を選択
  4. 「インポート項目」にインポート可能なメールボックスが表示されるので中身を確認しておく
  5. 「<新規アカウント>」の部分を、Operaに存在するどのアカウントにインポートするか選択する(「設定をインポート」チェックボックスが自動でON/OFFされる)
  6. 「メールをインポート」にチェックが入っているのを確認し、「次へ」ボタンをクリック
  7. ほかにインポートしたい項目があれば4から繰り返す
ただ、Thunderbird自体をアンインストールしなければ、いつでも起動してしまえば中身を確認できるよね?と言いうことで、上記方法で思った通り出来なかったとしても、自分で調べて欲しい。

メールを無断で無許可に削除してくれるThunderbirdからOperaに移行する【2/3】

まずはOperaをダウンロードするところからはじめる。
Operaのダウンロード先はここだ。

「地球上で最速のブラウザ」と歌っているが、まぁ表示が速い事は事実なので鵜呑みにしてみるとする。

間違えても携帯版のOperaを選んではいけない。あくまでPCで使うのが目的だ。

ダウンロードしたらほかのアプリと同じようにインストールしよう。ここまでは特に問題ないはずだ。

さて、Operaを起動してみると、どこからメールを使えるようになるのかが良く分からない形になっている。

というのも、前回書いたが、まずはメールアカウントを作成しないと、メールというツールメニューは表示されないようになっているので、兎に角メールアカウントを作成しようじゃないか。
ここでは仮に、以下のようなアカウントを使う事とする。

アカウント名オガーン
メールアドレスogaaaan@example.com
ユーザ名ogaaaan
パスワードshiranugahotoke
送信サーバsmtp.example.com
受信サーバpop.example.com

もちろん上記情報は嘘偽りを含んだ情報なので、実際には存在しないことを断っておく。
自分のメールを送受信したいのであれば、上記項目をすべて自分のアカウントに置き変えて、以下読み続けると寝覚めが良いだろう。

で、早速Operaに自分のアカウントを登録してみようじゃないか。

メールを無断で無許可に削除してくれるThunderbirdからOperaに移行する【1/3】

ずっとThunderbirdを使ってメールを送受信してきた。バージョン1の時からだ。

その前はシェアウェアのBecky!を使っていたが、どうしてもLinuxとWindowsで共通のメーラを使いたかったので、Thunderbirdに替えたと言う流れである。

Becky!は今でもお勧めのメーラだ。だけど俺はThunderbirdに完全移行した。

バージョン1のThunderbirdは、そりゃもう酷いのなんのって、受信ボックスが壊れるわけですよ。復旧しようにも、当時は情報が皆無。頭に来て全部消した。

バージョン2のThunderbirdは、そりゃもう酷いのなんのって、受信ボックスが壊れるわけですよ。復旧しようにも、すでにメールが削除されてしまっているので、できない。

バージョン3のThunderbirdは、そりゃもう酷いのなんのって、特定のメールフォルダが勝手に削除されたりするわけですよ。復旧しようにも、数百通あったメールのファイルサイズがすでにして2kbとか、すでにこれ消えてるよねって結論に至る。実際消えてたし。

FireFoxもそうだけど、どうもMozillaの製品は長く使うに耐えうるものではないと言う結論を出したくなる現象が多発する。

個人的には、メールというプロトコル、メーラというソフト、そして仕事や携帯でメールを使うと言う文化が大嫌いなんだけど、すでにそういった環境が普通になりつつあり、メールを読まないと怒られるという、意味不明な文化が社会的に浸透し切ってしまっているので、ご他聞にもれず俺もメーラを使うことにはしている。

メールというのをその程度の低質なものと理解しているので、たかがメールなんかのために、アホみたいに復旧タスクなんかをこなしたくないと思っている。

だから不具合が出れば、すぐに別のメーラを使うようにしている。今回はThunderbird3をやめる事にした。

さよならThunderbird。ありがとうとは言わないよ。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【8/8】

今回はインスコしたパッケージの設定を行い、さらにWindows上で開発する際に便利なsambaも入れてみようと思う。

■各種パッケージライブラリのインスコ

まず設定に先立ち、必要なパッケージライブラリを豪勢にインスコしよう。
そのためにはrootになる。
# su -
パスワード
今回入れるライブラリは以下になる。
php-bcmath 任意精度演算に関する精度の拡大。つまり符号なし32ビット演算がオーバーフローを起こし、2038年問題を引き起こすのを未然に防ぐためにこれを入れておく
php-devel phpの開発者向けライブラリ。
php-gd GDライブラリのphp版
php-imap phpでIMAPをいじる場合に使用
php-ldap phpでldapをいじる場合に使用
php-mbstring 日本語圏なら必須。全角を正しく扱えるようになる(ただし完璧ではない)
php-mcrypt 暗号化のライブラリ。いろいろなOSSで使用されるので入れておく
php-mysql MySQLを使うなら必須
php-pdo phpでDBをいじる際、一番処理が速いので入れておく
php-pear phpで作られた各種ライブラリへのアクセス用に入れておく
php-pspell phpで辞書を扱う際に使われる便利なライブラリ。使用頻度は低いがオモロいので入れておく
php-snmp phpでsnmpを使う場合に使用
php-soap phpでsoapで通信する場合に使用
php-tidy htmlスクレイピングライブラリ
php-xml xmlを簡単に扱えるようになるので入れておく
php-xmlrpc xmlを使ったサーバ間通信などで使うので入れておく
mod_ssl なんちゃってSSLで使うので入れておく
mod_perl PerlをCGIじゃなくApacheモジュールっぽく動かして高速化するので入れておく
mod_dav_svn Subversionをhttp経由でアクセスさせるのに必須

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【7/8】

さて、今回はCentOSにインスコ(インストール)されているパッケージなどをアップデートする予定だ。

基本的に、と言うよりむしろ現在では当然の如く、yumコマンドでパッケージをインストールする(ソースコンパイルやrpmを作ったりするのは一度やって置くべきだ)。

Yumex(Yum Extender)というGUIソフトを使うと、グラフィカルにインスコすることも出来るが、ここではあえてコマンドラインで入力する事にする。

まずはCentOSにログインしよう。前回OSのシャットダウンではなく、VMPlayerを直接閉じていれば、勝手にサスペンド状態になり、直前の状態から再開することが可能になる。これがVMPlayerの便利なところのひとつだ。


「仮想マシンの再生」をクリックすると、「仮想マシンの状態を復元しています...」となり、だいたい20秒前後で元の状態に戻る。こりゃ便利。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【6/8】

さて、無事にCentOSにログインできたら、まずはこれからたくさん行わなくてはならない設定に先立ち、まずは簡単に使い勝手を向上させてみる。

最初に行うのは、画面の解像度だ。さすがに今のままでは小さすぎる。


上部メニューバーから「システム」>「管理」>「ディスプレイ」と進めてみる。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【5/8】

さて、CentOSのisoダウンロード、VMPlayerのインストールが終わったら、後はダウンロードしたCentOSのisoをVMPlayerで使えるようにセットアップする。

■仮想マシンの作成

まずVMPlayerを起動する。


これから作るCentOSは、Windows XP内に仮想的に(それでいてXAMPPより確実に正しく実行できる)インストールするLinux環境である。なので仮想マシンと名前がつけられている。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【4/8】

さて、VMWare Player(以下VMPlayer)のダウンロード、CentOSのisoダウンロードが終わっていると言うことで、早速環境構築に入ろう。

まずはVMPlayerのインストールだ。ダウンロードしたVMware-player-3.0.0-203739.exeをダブルクリックし、インストーラを起動させる。
※まれに起動直後エラーになる事があるが、「キャンセル」 ボタンで最初からやり直せば問題なく進められるはず


まずはこのVMware-player-3.0.0-203739.exeが何をするために存在するのかを説明するフェーズになる。なぜVMPlayerをインストールしたいのに、わざわざVMPlayerをインストールしますよ的な画面があるかと言うと、たまにだが、「Setup.exe」という名前の、そもそも何をインストールする実行ファイルだ?なんて、ファイル名から判別が出来ないインストーラを作る適当な企業が幅を利かせる中、この説明画面があるだけで、一度実行してみて何のインストーラなのかが分かるようになっている。のかどうかはしらんが、「Setup.exe」なんてファイル名を付けるべきでは無い。その点このVMPlayerはちゃんとVMware-player-3.0.0-203739.exeという、ビルド番号まで含めた丁寧なファイル名になっているので安心だ。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【3/8】

VMWare Player(以下VMPlayer)のダウンロードが終わったら、次はLinuxの準備だ。
今回はCentOS5.4のDVDのisoイメージをダウンロードする事にする。

ダウンロードする際、通常の方法でブラウザから落としても良いが、すばやく落とすために、torrentファイルを使用する事とする。

torrentファイルを使用するには、BitTorrentやBitCometなどのソフトが必要になる。あらかじめインストールしておこう。特にLinuxディストロによってはisoファイルはtorrentのみ対応、なんてこともあるわけで、ダウンロードも速くなるし、持っていて損はしないソフトだ。

俺の場合BitCometを使用している。こちらからダウンロード可能だ。もちろんフリーだ。
そして肝心のCentOSだが、こちらのFTPサイトから落とそう。落とすファイルは「CentOS-5.4-i386-bin-DVD.torrent 」だ。
このtorrentファイルはCentOSのisoファイルではない。ダウンロードしたいファイルの情報が書かれているだけで、その情報をBitCometなどのソフトに渡してやることにより、通常よりはるかに素早く目的のファイルをダウンロードすることが可能になっている。
BitCometを起動し、落としたCentOS-5.4-i386-bin-DVD.torrentをドラッグ&ドロップすると、以下のような画面になる。


メイン画面右下にセンスのかけらもない広告がセンスのかけらもない状態で表示されているが、完全に無視し、「今すぐダウンロード」ボタンをクリックし、すぐにCentOSをダウンロードすることとする。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【2/8】

まず最初に断って置くが、VMWareの入手は、Vectorや窓の杜なんかから簡単に好きなソフトをダウンロードするような容易なものではない。それらには程遠く、非常に面倒くさい手順が待っているわけだ。しかも基本的にインタフェースは英語である。

ただし、日本語で書かれたマニュアルPDFがダウンロード可能なので、まず最初にこれに目を通して置く事を強く薦める。なお、このマニュアルも、書いてある事は一部実際とは違っているようなので、臨機応変に対応してダウンロードして見ようと思う。

ちなみにお伝えしておくと、これから多くのソフトをインストールし、多くの設定を行うことになるが、その程度(英語サイト、登録ウザすぎなど)の関門をクリアできないといけない。あらかじめ少しの精神的覚悟を決め、がんばって進めよう。

まずはVMWareというソフトをダウンロードする。
ここから過去のバージョンを簡単にダウンロードすることが出来るが、当然最新バージョンはダウンロードできない。使い勝手が格段に違うので最新バージョンを使うため、面倒だがVMWareが期待している登録手順を踏まえるとする。
具体的な手順としては、
  1. ユーザ登録
  2. メールアドレスのアクティベーション
  3. ソフトウェアのダウンロード
の3つになる。順を追って説明しよう。

XAMPPでWeb開発などをしている人は直ぐにVMPlayerに変えたほうが良い【1/8】

まずXAMPPと言うものは何か、と言う事を、個人的経験から怒りと憎しみをこめて説明してみる。

ApacheやPHP、MySQLなどの、いわゆるAMP系といわれるアプリケーション郡は、Windows版も存在する。今まではそれらを個別にインストールし、Windows上に仮想的な対Linux環境を構築していたわけだ。

しかし、ApacheやMySQL、そしてPHPやPerl、場合によってはPythonなどを全て個別にWindowsにインストールするには、かなりの時間と労力を要する。

それらの作業を強烈に短縮できるように、全て一つにまとめてしまおうとしたのがXAMPPだ。手軽だが、正直言って業務で使い物になったことは今の所一度も無い。はっきり言うと、かなり壊れかけのソフトと言うか、とにかく必要以上にストレスを溜めるだけの存在だと思っている。

XAMPPというアプリ1個で環境がそろうために、いろいろな設定が固定されてしまっている。自由度も低いし、さらにそれらの連携も正しく動いていない。
しかしもっとも悪質なのは、再起動ボタンをクリックしても「再起動なんてできましぇ~ん!」としか表示しないコントロールパネルだ。お前は何をいっているんだ?的な。

それに、XAMPPを使わない最大の理由は、

XAMPPでWebサーバ運用してる奴なんかいるのか?

だ。

FTPSもSFTPも使えるフリーで高機能なFTPクライアント「Filezilla」を使う【2/2】

さて、基本的なインタフェース設定はもう問題ないと思う。次は実際にサーバに接続するための設定を行う。

基本的にFFFTPを使っていたユーザ向けの記事になるので、WinSCPユーザなどはほとんど理解できているとは思うので、内容が低レベルでもご了承いただくことにする。

まず、接続したいサーバ情報は手元にあるはずなので、ここでは仮想的に以下の接続情報を使うことにする。もちろん内容はデタラメだ。

フゲフガプロジェクトのサーバ情報
ホスト名 example.com
IPアドレス 192.168.1.1
ID hogehoge
パスワード fugafuga

上記の様な接続情報は、ネットワーク管理者やプロジェクトマネージャ、リーダーなんかからもらっているはずだ。なので、FFFTPのパスワードが米印でわからない、と言う事は一般的にありえないはず。もしパスワードが分からないのであれば、分かる人に聞くか、サーバ管理者に新しいパスワードを設定してもらい、それを教えてもらうのが良い。間違ってもパスワードを平文メールで送ってもらったり、声に出して電話で確認するなどはしてはいけない。ソーシャルハッキングのネタになるだけだ。

というわけで、上記接続設定をFilezillaに設定してみよう。

FTPSもSFTPも使えるフリーで高機能なFTPクライアント「Filezilla」を使う【1/2】

FFFTPはFTPクライアントソフトだ。しかもフリーだ。
NextFTPもFTPクライアントソフトだ。これは有料だ。

このたび、FFFTPに関してのセキュリティホールなんかが取りざたされているが、そもそもこの時代にFTPを使っているという時点で、個人情報保護法的にもコンプライアンス的にもアウトなのは言うまでもない。

いまだにFTPなんていう、まるでスラム街を美女が全裸で歩くような仕組みのプロトコルを使っているのは危険過ぎるのは当然ご理解いただけているとは思うが、「そんなことは知ってるけど現実は違うんだよ!」という、実は会社の政治的背景、もしくはクライアント側(客先)の都合によって、セキュリティ思想が封じ込められてしまっているという担当者も多くいるはずだ。

大抵そういうセキュリティをないがしろにする会社は淘汰されると思うし、それを期待しているわけでもあるが、そういった「FTPが悪い!」「SCPやFTPSにしろ!」という啓発は抜きにして、単純に

FFFTP以外でフリーのFTPクライアントソフトってなにかある?

という質問を仮想的に立て、それに答える形で書いていこうと思う。
しかしそっけない解答をすれば、答えは1個で、

俺たちにはFilezillaがあるではないか!!

PHP とjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【10/10】

今回で「PHP とjQueryライブラリ「jqPlot」で綺麗なグラフを描画する」シリーズは最終回にしたおきたい。
というわけで、vote.ctpの説明をする。

現状のvote.ctpは以下のようになっているはずだ。

[/app/views/quickpolls/vote.ctp]
<div id="graph" style="width:600px;height:300px;margin:30px;"></div>
<script type="text/javascript">
  var data = [<?php echo $data;?>];
  plot = $.jqplot('graph', [data], {
    title: 'モビルスーツ人気投票',
    series:[{renderer:$.jqplot.BarRenderer}],
    axes: {
      xaxis: {
        renderer: $.jqplot.CategoryAxisRenderer,
        tickRenderer: $.jqplot.CanvasAxisTickRenderer,
        tickOptions: {
          enableFontSupport: true,
          angle: -30
        }
      }
    }
  });
</script>
読みこんでいるプラグインは以下になる。
プラグイン名 説明
jqplot.barRenderer.min.js 棒グラフを描画するのに必須
jqplot.categoryAxisRenderer.min.js カテゴリを反映させるために必須
jqplot.canvasAxisTickRenderer.min.js tickの表示や角度を付ける場合に必須

PHP とjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【9/10】

ビュースクリプトでビジネスロジックを書いてしまうと言うのがどうしてダメなのか、もしくはどうして気持ちが悪いのか、というのを考えて見よう。

そもそもPHP君からしてみれば、動かしているPHPファイルがMだろうがVだろうがCだろうが、全く関係ない。もっとプリミティブな階層で動かしているので、そんな話は全く理解してないはず。

しかし、人間から見た場合、情報を扱うレイヤ、表示するレイヤ、それらを管理するレイヤという風に分けた方が、脳みそが分かりやすいからだ。

なので、只の思想と言うことになる。只の思想を実装に代えた物がMVCフレームワークだ。だからビュースクリプトにビジネスロジックを書くことに対しては、極端な話、只の個人の好き嫌いと言う事になる。

それを、「MVCフレームワークだから当然Cでビジネスロジックを実装し、Vは表示のみだろう」という話に持って言ってもし様が無いわけで、正直、全く理由になってはいない。何しろ只の好みの問題なのだから。

とはいえ、せっかく人間が作ったこれらの思想、CakePHPで言うところの規約にも当てはまるが、自ら破るのもなんだか後味が悪いし、どうせ複雑なものであるならば、最初は正攻法で攻めて見たいと思うのは多くの人がそう思っても否定出来ないと思う。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【8/10】

CakePHPを使用して、jqPlotの表示テストを行う。
用意するものは当然としてCakePHPだ。バージョンは安定している1.2を使う。
プラットフォームはLinuxだが、XAMPPなどを使用している人は適宜自分の環境に合わせて構築していただこう。XAMPPは止むを得ない場合以外は使ってないので良く分からんのだ。

CakePHPをダウンロード後展開し、最低限の設定が終わっていることを前提とする。そしてアクセスする際のURLは
http://example.com/cake_test/
とする。

ドキュメントルート内の「/cake_test」を仮想的なドキュメントルートにしたいので、CakePHPにそれを教えておかないとマズい事になる。どういうことかと言うと、CSSやJavaScript、画像などの絶対パスがおかしくなる。/imgなどとすると、/cake_test/imgではなく、/imgを見てしまうからだ。これはmod_rewrite側で指定するのが楽だ。
各「.htaccess」にRewriteBaseを記述しておく必要があるので、以下の様に編集しておく。
変更ファイル 追記内容
/cake_test/.htaccess RewriteBase /cake_test
/cake_test/app/.htaccess RewriteBase /cake_test/app
/cake_test/app/webroot/.htaccess RewriteBase /cake_test/app/webroot
これで絶対パスが正しく認識されるようになる。mod_rewrite便利すぎ。

次にデータベースだ。データベース名はjqplotとして作る。
create database `cake_test` default character set utf8 collate utf8_general_ci;


PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【7/10】

さて、jqPlotの大まかな概要と実装方法が分かったことで、これを実用させてみようと思う。
使うフレームワークはCakePHPだ。よって、言語はPHPと言う事になる。

実際に作業に入る前に、俺の考えを少しだけ、説明したいと思う。

以前までWebアプリはPerl(当時はバージョン4)で開発していたが、CGIという仕組み上、どうしても納得行くレスポンスが取れず、デバグもやりにくかった。しかしPHP(当時はバージョン3)が登場し、一気にPHPでの開発にシフトした俺だが、今ではむしろフレームワークを使うことによる余計なプロセスが、個人的にPerlをやっていた時代よりWebサーバに負担をかけているのを自覚し始めている。
※1個のクエリで済むところを、20個ほどのクエリが走っているときもある

要するにフレームワークは開発者のエゴでしかないわけだ。
  • O/Rマッピングで多様なDBと接続!
  • ビジネスロジックとビューの完全分離!
などなど。

個人的には時代を考慮した結果、人間にタスクが割り当てられない状態で開発するのが良いと考え、プロシージャルじゃなければなんでもいいわけだ。しかしそれがフレームワークと直結しているとは思っていない。

これに関しては、ゲーム開発を経験したことがある人はご理解いただけると思う。
メモリの使い方に関する思想など、正直、ゲーム開発とWeb開発は正反対といってよい。Webはメモリをじゃぶじゃぶ使いすぎる。さらにApacheの勉強が足りない人が意外に大勢いることが分かった(もちろん俺だって勉強中だ)。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【6/10】

今回は円グラフを描画させてみようと思う。
基本的にはPieレンダラープラグインを読み込み、それをレンダラーに指定すればOKなはずだ。
早速いってみよう。

まずは円グラフのプラグインであるPieRendererを読み込む。headタグ内を以下のように編集する。
<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.min.js"></script><![endif]-->
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
<script type="text/javascript" src="plugins/jqplot.pieRenderer.min.js"></script>
これで円グラフを描画させる準備が整った。

次にデータを指定してみようと思う。
円グラフだからといって、データの合計が100になっている必要はない。好きなパラメータを好きなだけ指定することが出来るので、とりあえず以下のように設定してみた。
$(document).ready(function(){
  var data1 = [5,1,6,5,7,3];
  plot = $.jqplot('graph', [data1]);
});
それから円グラフなので、描画領域を正方形に変更してみた。
後で凡例を表示させるなど、編集をする場合、適宜サイズを調整しておこう。
<body>

<h1>jqPlot Test 3</h1>
<div id="graph" style="width:400px;height:400px;margin:30px;"></div>

</body>
このままではまだ折れ線グラフのままだ。
plotオブジェクトにrendererプロパティを設定し、PieRendererプラグインで描画させてみよう。
今回は全体設定であるseriesDefaultsプロパティを使ってみた。
plot = $.jqplot('graph', [data1],{
    seriesDefaults:{
      renderer:$.jqplot.PieRenderer
    }
  });
さて、これだけで画面に円グラフが表示されたと思うが、いかがだろうか。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【5/10】

さて、折れ線グラフのデータを元に、まずは棒グラフを作成してみよう。
最初にほぼプレーンな折れ線グラフを描画してみる。分かりやすいように、読み込むライブラリは最低限にしておく。
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
データなどの定義はこのようにしてみた。
$(document).ready(function(){
  var data1 = [8,5,7,6,9,12,5,1,2,4,3,7,1,2,1,3,4,6,9];
  plot = $.jqplot('graph', [data1]);
});
少々x軸方向へのデータが多いので、HTMLで作成した描画エリアも多少サイズを変更しておいた。
<h1>jqPlot Test 2</h1>
<div id="graph" style="width:600px;height:200px;margin:30px;"></div>
これをブラウザで表示させると、以下のようになった。
これを折れ線グラフから、棒グラフへ変更してみる。
デフォルトでは折れ線だが、そのほかの形式へ変更するには、都度プラグインを読み込む必要がありそうだ。棒グラフの場合、barRendererプラグインになる。
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
<script type="text/javascript" src="plugins/jqplot.barRenderer.min.js"></script>
これで棒グラフを描画する準備が整った。
次に、plotに対して例によってオプションを指定しよう。グラフ全体に関わるデフォルト値として、seriesDefaultというプロパティが用意されているので、早速追記しておく。
plot = $.jqplot('graph', [data1], {
    seriesDefaults: {
    }
  });
さて、このseriesDefaultに何を指定するのか、だ。このままでは折れ線グラフは棒グラフにはならない。よって、グラフの形態を変更するためのrendererプロパティをまずは記述しようじゃないか。
plot = $.jqplot('graph', [data1], {
    seriesDefaults: {
      renderer:$.jqplot.BarRenderer
    }
  });
これで棒グラフが描画されるはずだ。早速ブラウザで見てみる。
棒グラフにはなったはなったが、なんじゃこれは。使い物になるレベルではない。これではよろしさが皆無である。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【4/10】

さて、次にインタフェースの挙動をカスタマイズしてみよう。
まずは、グラフのデータのポインタにマウスオーバーすると、ツールチップを表示するようにして見る。
これにはhighlighterというプラグインが必要になる。
まずは読みこんでみる。headerタグ内に以下を追記する。
<script type="text/javascript" src="plugins/jqplot.highlighter.min.js"></script>
これでツールチップを表示するハイライト機能が読みこまれた。
次に、ハイライト機能を実際に記述してみよう。
highlighterプロパティに、ツールチップの位置、フォーマットなどが指定可能だ。
plot = $.jqplot('graph', [data1, data2], {
    title:'会員サイト アクセス数',
    legend:{
      show:true,
      location: 'nw',
      yoffset: 6
    },
    series:[
      {label:'メンバー'},
      {label:'ビジター'}
    ],
    axes: {
      xaxis:{
        renderer: $.jqplot.DateAxisRenderer,
        min:'2010/01/01',
        max:'2010-01-04',
        numberTicks: 4,
        label: '過去7日分'
      },
      yaxis:{
        min:0,
        max:12,
        label:'アクセス数'
      }
    },
    highlighter: {
      tooltipLocation: 'n',
      tooltipFormatstring: '<strong>%d</strong>'
    }
  });
この状態でブラウザでグラフを表示させ、データのポインタにマウスを当ててみよう。
ツールチップがフェードインして表示されるようになった。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【3/10】

さて、次はグラフに凡例を表示させてみよう。その前に、jqPlot付属のCSSを適用させておく。これできれいに凡例が表示できるようになる。

もっとも、最初からCSSを読み込んでおけば問題はないが、今回は流れ的にこの時点でCSSを実装することにした。
というわけで、headタグ内を以下のように編集してみた。
<title>jqPlot テスト</title>
<link rel="stylesheet" type="text/css" href="jquery.jqplot.css" />
・・・
これできれいなデザインでグラフを描画できるようになる。FireFoxとIEで描画の差がほとんど無くなるので、以後はFireFox 3.5のキャプチャを使用することにする。
さて、このグラフの左上に、「アクセス数」などの凡例を表示させて見る。ただ、データが1個だと凡例も1個になり、少々さびしいので、まずはデータを2個に増やすことにした。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【2/10】

さて、前回はグラフの表示オプションは一切指定せず、デフォルト状態で表示してみた。
これはこれでキレイなグラフだが、いろいろ足りないことがある。ざっとあげると、
  • 軸の数値が半端
  • 凡例が無い
  • 棒グラフなどの別の形式も使用したい
などがあるとおもう。
まずは横軸の数値を、日付に変更してみよう。

日付をティッカーとして表示するには、面倒だがプラグインを読みこまないといけない。このjqPlotは、基本機能以外はほぼすべてプラグインとして実装する形式なので、scriptタグをたくさん記述する羽目になる。まぁjQueryを使う時点であきらめなければいけない要素でもあるのだが、素直に実装してみよう。

まず、plugins/jqplot.dateAxisRenderer.min.jsを読みこむように、headタグ内にscriptタグを追記する。必ず、jquery.jqplot.jsもしくはjquery.jqplot.min.jsの後に読みこむように記述する事。
<!--[if IE]><script language="javascript" type="text/javascript" src="excanvas.min.js"></script><![endif]-->
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
<script type="text/javascript" src="plugins/jqplot.dateAxisRenderer.min.js"></script>
これで準備が整った。
次に、jqplotメソッドの3番目の引数として、JSON形式で各種プロパティを設定して行く。プロパティは、axesという名前が付いている。これは軸、つまり英語で言うところのaxisの複数形だ。axes内にx座標の軸、y座標の軸を設定する事が出来るようになっている。

PHPとjQueryライブラリ「jqPlot」で綺麗なグラフを描画する【1/10】

Webサイト上にグラフを表示させたいとき、最初に思いつくのがpChartだ。PHPのグラフライブラリで、非常にカスタマイズ性に優れている。ストリームでグラフ画像を出力することも出来る。

他にはFlashベースでXMLを読み込んで表示させる方法もあるが、今のところフリーで使えるFlashグラフはあまり良いものを見つけられてない。

今回、今まで手を出してなかったJavaScriptによるグラフ描画を試してみようと思う。
個人的にjQueryを多用するので、jQuery専用のグラフライブラリ「jqPlot」を使用してみる。

jqPlotは大前提として、
  • jQuery
  • excanvas
の使用が必須になっている。
jQueryはいわずと知れたJavaScriptの超汎用ライブラリだが、excanvasはIE向けにcanvas機能を実現する、いわばCANVASハックなライブラリだ。

入力フォームを作成する際に気をつけていること

個人的に気をつけていることなので、別にこれを読んでいるあなたがやらなくてはいけないと言う事は全く無いし、この内容を啓蒙しているわけでもない。
そもそも「~をするための~個の~」などのタイトルをつけるのは嫌いだ。個数なんかどうでもよい。

というわけで本題だ。
フォームにデータを入力する際/させる際、まず大原則として以下の2個が上げられると思う。
  1. 可能な限りデータベーステーブルに沿った形で正しいデータを入力して欲しい
  2. 可能な限り入力したくない
1は開発者側のエゴだ。2はユーザ側のエゴだ。そして現状、多くの新しく作られて発表されたサービス(Web2.0的なもの)は1を踏襲している。

例を挙げよう。住所を入力しなくてはならない場合を想定してみると、欲しい情報としては、
  • 郵便番号
  • 都道府県
  • 市区町村
  • 番地
  • 建物名
があげられると思う。一般的な項目だ。
よって、多くの開発者は、この各項目ごとにデータベースフィールドを作成すると思う。

PHP関数「compact」と「extract」を試してみる


PHPにはcompact、extratと言う関数がある。
CakePHPをやっている人なら、compactは何度かお目にかかった事があるんじゃなかろうか。

PHP公式マニュアルを斜め読みしながら開発をしていると、知っているけど実はちゃんと分かっていなかったと言うことがたくさんあるとおもう。

今回はcompactとextractを試してみようと思う。
まずはextractだ。
int extract ( array $var_array [, int $extract_type = EXTR_OVERWRITE [, string $prefix ]] )
配列からシンボルテーブルに変数をインポートします
これはつまりどういうことかと言うと、実際にやってみると早い。

Windowsゲームのプレイ内容をキャプチャして動画にしてくれるソフト

数多くあるMMROPGや、OblivionなどのオフラインSRPGなど、自分のプレイを見直したり、決定的瞬間を収めるためにも、動画としてプレイ内容を保存する方法がいくつかある。

使用するには動画キャプチャソフトというものが必要だ。

キャプチャといっても、何も特別なキャプチャボードを購入し、PCに実装するような事は必要ない。
※ちなみにそういったハードウェアを使う場合、テレビの録画などで使うようだ

ここでは一般的なソフトを使って、ゲームをキャプチャして見ようと思う。

試したのは以下のソフトだ。

なんちゃって動画キャプチャツール
カハマルカの瞳
劇場版ディスプレイキャプチャ あれ
汎用デスクトップキャプチャ アマレココ
Flaps

使用したゲームはBethesda Softwareの名作、Oblivionだ。

Bloggerのブログ記事内でプログラムなどのコードをハイライトして表示させる

先ほど、Bloggerでもコードハイライトが使えないかと調べていたら、すぐに見つかった。
要するにこれはBloggerで使えるウィジェットだ。

まずはこちらのサイトへ進み、「Add To Blogger」という小さなボタンがあるのでクリックする。

そうするとBlogger内のブログを選択するページになるので、コードハイライトをさせたいブログを選択する。
このとき、タイトルをそのままにしておくと、サイドバーにこのウィジェットが表示されてしまうので、タイトルは全文字列を消しておこう。

次に、「ウィジェットを追加」ボタンをクリックすれば、ウィジェットのインストールが完了だ。


何かコードを書いてみる。
たとえばSQL。

select *
from users as User
where User.approval = 1
order by User.created desc
limit 1

このSQLをハイライトさせるため、前後をPREタグで囲む。
囲んだ後、開始タグ内に以下のアトリビュート指定をいれておく。

Thunderbird 3でGmail(+Livedoorメール)、Yahooメール、Hotmailを送受信する設定

Thunderbirdは3になってから、特別なアドオン無しで
  • Gmail
  • Yahooメール
  • Hotmail
の送受信を行えるようになった。
※以前から出来たっけ?

これは各Webメールサービス側での対応もあったからだと思う。

と言うわけで、各Webメールサービスを利用するため、アカウント設定をしてみた。

CakePHP1.2で内容をカスタマイズしたCSVをダウンロードさせる【3/3】

さて、正しくCSVファイルがダウンロードされただろうか。
今回はCSVファイルのカスタマイズなので、ここまでで終わりではない。

このようなCSVファイルを
id item_id name price created
1 1 あきたこまち 1980 2010-01-01 24:59:59
2 2 ささにしき 2034 2010-01-01 24:59:59
3 3 こしひかり 1680 2010-01-01 24:59:59
4 1 あきたこまち 1980 2010-01-01 24:59:59
5 3 こしひかり 1680 2010-01-01 24:59:59

このようにしたいわけだ。

ID 商品名 単価 個数 合計額
1 あきたこまち 1980 2 3,960円
2 ささにしき 2034 1 2,034円
3 こしひかり 1680 2 3,360円

それではやってみよう。


CakePHP1.2で内容をカスタマイズしたCSVをダウンロードさせる【2/3】

■CSVヘルパーのインストール
まず、CakePHP1.2で使えるCSVヘルパーを落とす。
【PHP5】
http://bakery.cakephp.org/articles/view/csv-helper-php5
【PHP4互換】
http://ifunk.net/cakephp/helpers/csv.php.txt

リンク先はPHP5と、PHP4互換の2種類あるが、今回念のためPHP4互換を使ってみる。
ページを表示したらコピーして、csv.phpという名前で保存する。
※WebサーバがPHP5のみインストールされているのであれば、躊躇無くPHP5版を選ぶと良い。

というわけで、csv.phpファイルを
[/Path/To/CakePHP/App/views/helpers/csv.php]
に設置する。
これでCSVヘルパーのインストールは完了。

CakePHP1.2で内容をカスタマイズしたCSVをダウンロードさせる【1/3】

CakePHP1.2でDBテーブルの内容をCSVファイルとしてダウンロードさせる話を以前した。
参照:http://ameblo.jp/hyperdev/entry-10412507754.html

基本的にはCSVヘルパーを追加し、コントローラでデータを取得後、ビューファイル側である程度整形して出力するものだ。

この際、コントローラ側では、データを集計して新たなフィールドとしてCSVに追加したり、項目名をテーブルのフィールド名ではなく、日本語で設定したいなど、いろいろ業務レベルで使うには物足りないものを追加しておかないといけない。

というわけで、単純且つ富豪的に考えてみた。
DBテーブルは売上げテーブルみたいな感じを想定し、priceを合計して支払フィールドとしてやってみる。

mod_rewriteでディレクトリ別にSSLのON/OFFを切り替える

以下の様なディレクトリがあったとする。

A. htdocs/sslon/
B. htdocs/ssloff/

Aのディレクトリ内は必ずhttp://から始まるURLに、
Bのディレクトリ内は必ずhttps://から始まるURLにしてみるテスト。
  1. htdocsに.htaccessを作成
  2. SSLを有効にするために以下を記述
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/sslon/.*$
RewriteRule /.*$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
これで、/sslon内のコンテンツは必ずsslが有効になり、https://になる。

簡単に説明すると、
まず1行目でRewriteを有効にするため、RewriteEngineに対して引数にOnを与える。
RewriteEngine On
これでmod_rewriteの機能を使えるようになる。

オガーン@ハルテリアについて

オガーンってのは俺のニックネームで、ハルテリアってのは俺のニックネームなんだけど、どっちがどっちだか別に気にする必要はない。ただ、オガーンだけだと短い気がしたので何かくっつけてみようと思っただけ。ちなみにハルテリアってのは微生物の名前で、詳しくはググればすぐに分かる。

実は最初にぱっと思いついたのがカウロバクター・クレセンタスだったが、ハルテリアの方が文字列が短いのでこっちにした。カウロバクター・クレセンタスも微生物で、詳しくはググればすぐに分かる。

ハルテリアとかカウロバクター・クレセンタスとか好きだけど、一番好きな微生物はクマムシだ。詳しくはググればすぐに分かる。
 
ちなみにブログ名になっているトーハムというのはトーハム ゼッドの事。ダンジョンマスターというすばらしくやっかいなおもろいRPGの主人公だ。詳しくはググればすぐに分かる。