Hatena::ブログ(Diary)

雨ときどき晴れ このページをアンテナに追加 RSSフィード Twitter

2011-05-22

CakePHPでお問い合わせフォームを作ってみた。

CakePHP でお問い合わせフォームを作ってみました。

f:id:nogusa:20110523044559p:image:w400

実行環境

仕様
  • ページ構成は、入力、確認、完了の3ページ。
  • 入力項目は、名前、メールアドレス、本文の3種類。
  • 入力ページでは、入力内容をモデルのバリデーションでチェック。
  • 完了ページにて、問い合わせた人にメールを送信。
  • メール送信ログとして、送信メールにはBccで管理者メールアドレスを設定。
使用するプラグイン

プラグインの設置方法はリンク先をご参照ください。

作成するファイル
  • コントローラー
    • /app/controllers/contacts_controller.php
  • モデル
    • /app/models/contact.php
  • ビュー
    • /app/views/contacts/index.ctp(入力)
    • /app/views/contacts/confirm.ctp(確認)
    • /app/views/contacts/finish.ctp(完了)
    • /app/views/elements/contact_input.ctp(入力部分に使用するエレメント)

ビューの contact_input.ctp は、入力、確認ページで使用します。

ソース

コントローラー
  • ファイル名:/app/contollores/contacts_contoroller.php
    • ページのURLは変更せず、POSTされた値に応じて表示する内容を変更。
    • 完了ページでのページリロードによるメール再送信の防止。
    • メール送信には SMTP 送信を利用。
<?php

class ContactsController extends AppController {
  public $name = 'Contacts';
  public $uses = array('Contact');

  var $helpers = array('Html', 'Form', 'xformjp', 'Cakeplus.Formhidden');
  var $components = array('Qdmail', 'Qdsmtp');

  function index(){
    if (isset($this->params['form']['confirm'])) { //確認ページ
      if (!empty($this->data)){
        $this->Contact->set($this->data);
        if ($this->Contact->validates()) {   //バリデーション問題なし
          $this->Session->write('reload', false);  //リロード対策セッションの登録
          $this->params['xformHelperConfirmFlag'] = true;  //確認画面の表示に切り替える
          $this->render('confirm');
          return;
        }
        $this->render();
        return;
      }
    } else if (isset($this->params['form']['back'])) { //入力ページに戻る
      $this->render();
      return;
    } else if (isset($this->params['form']['finish'])) { //完了ページ
      if (!$this->Session->read('reload')) { //リロードした場合はメール送信しない。
        $name = $this->data['Contact']['name'];  //フォームからデータ取得
        $email = $this->data['Contact']['email'];
	      
        $this->send_mail($email, $name);  //メールを送信
        $this->Session->write('reload', true);  //リロードフラグを立てる
      }
      $this->render('finish');
      return;
    }
  }
  
  //メールを送信します。
  function send_mail($email, $name) {
    $admin_email = 'admin@hoge.jp';  //管理者のメールアドレス
    $admin_name = '管理者';  //管理者の名前
  
    $mail_param = array(            //SMTPの設定
        'host' => 'smtp.hoge.jp',   //ホスト名
        'port' => 587,              //ポート
        'from' => 'admin@hoge.jp',  //Return-path
        'protocol' => 'SMTP_AUTH',  //認証方式
        'user' => 'admin',          //SMTPサーバーのユーザーID
        'pass' => 'password'        //SMTPサーバーの認証パスワード
    );
  
    $this->Qdmail->reset();  //リセット
    $this->Qdmail->allwaysBcc($admin_email);  //常にBcc設定で管理者に送信
	
    $this->Qdmail->smtp(true);	//SMTP設定
    $this->Qdmail->smtpServer($mail_param);
	
    $this->Qdmail->to($email, $name);    //送信先
    $this->Qdmail->subject('お問い合わせを受け付けました');   //件名
    $this->Qdmail->from($admin_email, $admin_name);  //送信元
    $this->Qdmail->text('本文です。');  //本文
    $this->Qdmail->send();  //メールを送信
  }
}
モデル
  • ファイル名:/app/models/contact.php
<?php

class Contact extends AppModel {
  public $name = 'Contact';
  public $actsAs = array('Cakeplus.AddValidationRule');
  
  var $useTable = false;  //データベースのテーブルを使用しない
  
  public $validate = array(
  		'name' => array(  //名前
            'maxLengthJP' => array(
                'rule' => array('maxLengthJP', '50'), //日本語50文字以内
                'allowEmpty' => false,
                'message' => '50文字以内で入力してください'
            ),
            'notEmpty' => array(
                'rule' => 'notEmpty',
                'message' => '名前を入力してください'
            )
        ),
        'email' => array( //メールアドレス
            'email' => array(
                'rule' => array('email', true),  //メールサーバーのホストが存在するか調べる
                'message' => 'メールアドレスを正しく入力してください'
            ),
            'notEmtpy' => array(
                'rule' =>'notEmpty',
                'message' => 'メールアドレスを入力してください'
            )
        ),
        'body' => array(  //お問い合わせ内容
            'maxLengthJP' => array(
                'rule' => array('maxLengthJP', '500'), //日本語500文字以内
                'allowEmpty' => false,
                'message' => '500文字以内で入力してください'
              ),
            'notEmpty' => array(
                'rule' => 'notEmpty',
                'message' => 'お問い合わせ内容を入力してください'
            )
        )
  );
}

?>
ビュー
  • ファイル名:/app/views/contacts/index.ctp
    • 入力ページ。
<h2>お問い合わせ</h2>
<p>名前、メールアドレス、お問い合わせ内容を入力してください。</p>
	
<?php echo $xformjp->create('Contact', array('type' => 'post', 'controller'=>'contact', 'action' => '.')); ?>
<?php echo $this->element('contact_input'); ?>
<?php echo $xformjp->submit('確認', array('name' => 'confirm', 'div' => false)); ?>
<?php echo $xformjp->end(); ?>

  • ファイル名:/app/views/contacts/confirm.ctp
    • 確認ページ。
<h2>お問い合わせ</h2>
<p>下記の入力内容を確認してください。</p>
	
<?php echo $xformjp->create('Contact', array('type' => 'post', 'controller'=>'contact', 'action' => '.')); ?>
<?php echo $formhidden->hiddenVars(); ?>
<?php echo $this->element('contact_input'); ?>
<?php echo $xformjp->submit('戻る', array('name' => 'back', 'div' => false)); ?>
<?php echo $xformjp->submit('送信', array('name' => 'finish', 'div' => false)); ?>
<?php echo $xformjp->end(); ?>

  • ファイル名:/app/views/contacts/finish.ctp
    • 完了ページ。
<h2>お問い合わせ</h2>
<p>お問い合わせを受け付けました</p>

  • ファイル名:/app/views/elements/contact_input.ctp
    • 入力部分に使用するエレメント。
    • コントローラーで設定されるフラグによって、入力と確認用に表示が切り替わる。
<table>
  <tr>
    <th>名前</th>
	<td>
      <?php echo $xformjp->input('name', array('type' => 'text')); ?>
      <?php echo $xformjp->error('name'); ?>
    </td>
  </tr>
  <tr>
    <th>メールアドレス</th>
    <td>
      <?php echo $xformjp->input('email', array('type' => 'text', 'class' => 'text_l')); ?>
      <?php echo $xformjp->error('email'); ?>
    </td>
  </tr>
  <tr>
    <th>お問い合わせ内容</th>
    <td>
      <?php echo $xformjp->textarea('body', array('rows' => '10', 'cols' => '40')); ?>
      <?php echo $xformjp->error('body'); ?>
    </td>
  </tr>
</table>

2011-05-16

Thunderbird のメール一覧の件名と開いた内容が違うときの対応

ボクはメインのメーラーとして Thuderbird を使用しています。

この Thuderbird ですが、ときどき受信メールの一覧に表示されている件名と

開いた内容が違うといった症状が発生していました。


例えば、新着で Sofmap.com から届いたメールと思って開いてみると、

1年前に届いたドスパラのメール内容が表示される、といったかんじです。


また、このとき件名と内容が違うメールを開くと Thuderbird の動作が非常に重くなり、

全体的にフリーズ気味な状態になってしまいます。


今回は、この症状の対応方法が分かったので、メモとして残しておきます。

使用環境


対応方法

1.Thuderbird のメイン画面にて、問題のメールがあるアカウント名、もしくはフォルダを右クリックして、

プロパティ」をクリックする。

f:id:nogusa:20110517021221p:image

2.「フォルダのプロパティ」→「一般情報」タブにて「フォルダを修復」をクリックする。

f:id:nogusa:20110517021420p:image


「フォルダを修復」をクリックしたとき、すぐには動作が完了せず、少しフリーズ気味な状態になるかもしれません。


参考

2011-04-14

LANDISK の HDL2-G2.0 を 1TB×2→2TB×2 にしてみた。

昨年、LANDISK の HDL2-G2.0 の HDD(1TB)が1台壊れてしまいました。

その後、残ったHDDをパソコンに内蔵して使っていたのですが、気づけば HDD も値段が下がり、

安価な2TBの HDD だと2台買っても1万5千円でお釣りがもらえる時代になりましたー。


ということで、放置したままではもったいない HDL2 を有効活用すべく、

1TB×2から2TB×2への増量を行ってみました。

f:id:nogusa:20110212172756j:image:w400

状況整理

LANDISK HDL2-G2.0 スペック
故障した状況

ある日、HDL2 に内蔵されている HDD の1台が起動直後に停止するようになった。

そのとき、ステータスランプは赤表示。

保証期間が過ぎていることもあり、そのまま放置することになった。

ちなみに RAID0 で動作させていたため、データは取り出せない状態に。。。


HDL2 を I-O DATA に発送

Google で「HDL2 増量」で検索すると増量の方法が書いてあるページに

辿り着けるため、ボクもそのページを参考にやってみようと思いました。


しかしながら、HDL2 に内蔵されていた壊れていない方の HDD は、Windows で使うために

NTFS で全てフォーマットしちゃったんですよね(笑)。

HDL2 関連の記事を読んでいると HDL2 の OS 部分は HDD に記録されているらしい。。。

ボクはフラッシュメモリか何かに記録されているのかと勝手に勘違いしていましたよ。


以上の理由により、このままでは HDL2 増量はできないことが分かったので、I-O DATA に Web から問い合わせてみました。

内容としては、「HDL2 に内蔵されている HDD の1台が故障してしまい、残った1台も Windows で使うために

NTFS でフォーマットしてしまったので HDL2 が起動できないよー」みたいなかんじ。

回答としては、「HDL2-G2.0 に元々内蔵されたいた HDD を装着した状態で修理センターに送ってください、

検査して修理可能か判断します」ということでした。送料は自払い。


それから、HDL2 を梱包して修理センターに送った後、検査が終了したメールが送られてきました。

「保証期間切れのため、故障した HDD を交換すると15,060円(税別)になります」

HDD 高いなぁ」と思いつつ、「正常な方の HDDOSインストールしてもらうだけで大丈夫です」と

返信したところ、別途費用がかからずに HDL2 が送られてきました。OSインストールされています。

f:id:nogusa:20110208105147j:image:w400

I-O DATA に問い合わせてから、修理された HDL2 が送られてくるまで約4週間。

結構、時間がかかりましたが、出費としては修理センターに送る送料のみだったので

まあ、良しとしよう。


HDL2 を増量してみる前に

必要なもの
あると良いもの

上記2点については、交換後の HDD の上部に取り付けることで HDD がグラグラ揺れるのを防ぎます。


HDL2 増量やってみる

増量する空の HDD に HDL2 の OS をコピーする

OS をコピーする方法としては、HDL2 が起動できる HDD を丸ごと

空の HDD にコピーする方法が一番簡単だと思われます。


HDD 丸ごとコピーの方法として、Windows だとパーティション管理ソフトを使うとできるみたいです。

ですが、今回は dd コマンドで普通にコピーしてみたいと思います。

コピー手順
  1. Linux な PC にコピー元、コピー先の HDD を接続する。
  2. PC 起動後、「fdisk -l」で接続した HDD を確認する。
  3. dd if=コピー元 of=コピー先」でコピーする。
    • 例:コピー元→/dev/sdd、コピー先→/dev/sde だった場合は「dd if=/dev/sdd of=/dev/sde」となる。
  4. parted を使う。
    1. 「parted コピー先」でコピー先の HDD を選択して、「print」で現状確認する。
    2. 番号4のタイプが拡張領域(extended)を「resize 4 2904MB 2000GB」で最大まで広げる。
    3. 「quit」で parted を終了する。
  5. fdisk を使う。
    1. 「fdisk コピー先」でコピー先の HDD を選択して、「p」で現状確認する。
    2. 番号6のパーティションを削除するために「d」コマンド実行後にパーティション「6」を選択する。
    3. 「w」で変更したパーティションを書き込み、fdisk を終了する。
  6. 「mkfs.xfs コピー先(パーティション番号6)」で xfs のフォーマットを行う。
    • 例:コピー先→/dev/sde の場合、「mkfs.xfs /dev/sde6」となる。

dd コマンドによるコピー時間としては

1000204886016 bytes (1.0 TB) copied, 61489.1 seconds, 16.3 MB/s

約17時間くらいでした。使用したPCはこちらのものです。


あと、ボクはコピー先に使用した HDD を一時 WindowsNTFS フォーマットして使っていたのですが、

その状態のまま dd コピーして使うと、余計なパーティションが残っていて、HDL2 が起動できない事態に遭いました。

そのため、他で使った HDDパーティションを全て削除して、キレイな状態にしておきましょう。

コピーした 2TB HDD を HDL2 に接続する

OS をコピーした HDD と空の HDD を HDL2 に接続して、RAID1 の再構築を行います。

HDD 接続後、HDL2 が無事起動できたらブラウザからアクセスして、RAID の再構築をやってみてください。


ボクの場合では、再構築完了まで1,008分→約17時間かかりましたー。


HDL2 に接続した HDD にゴムを取り付ける

HDL2 に元々内蔵されていた HDD の上部には 四角いゴムが2つ取り付けられています。

これは、HDD とケース上部の隙間を埋めて、HDD が揺れないようにするためだと思われます。


新しく取り付けた HDD には、このゴムが付いていないため、結構グラグラして気になりました。

ということで、それっぽくゴムを取り付けてみました。

使うもの

f:id:nogusa:20110212172155j:image:w400

こちらはホームセンターコーナン)で購入しました。

取り付け

で、1cm×1cmにゴムシートと両面テープを切り取って、 HDD に付けました。

f:id:nogusa:20110212172708j:image:w400

これを HDD の端、計4カ所に取り付けて、ケースのフタを取り付けたところ、

ガッチリ HDD は固定されました。


あとがき

この HDL2 増量化を行ったのは2月くらいになるのですが、なかなか忙しく、やっと書けました−。

最近は、地震とかいろいろ大変な感じになっていますが、とりあえず、自分にできることを考えつつ、頑張ってます。

頑張ろう日本、頑張ろうボク。


参考

2011-01-31

Webmin+Apache+BIND でサブドメインを設定してみる。

ブラウザからApacheの設定ができるWebminですが、いまいち設定項目がわかりにくい部分があったりする。

そんなときは、httpd.confを直接編集した後、Webminで変化したところを探すことで勉強したりしています。


ということで、今回はApacheサブドメインを設定して、ついでにDNSも設定しておく作業を

Webminでやってみたことについて書いておきます。

f:id:nogusa:20110131163801p:image

サーバー構成

設定に使う情報

Apache Webサーバーの設定

  1. Webminにログインする。
  2. サイドパネルの「サーバ」をクリックして表示された項目から、「Apache Web サーバ」をクリック。
  3. タブの「グローバル設定」をクリックして表示された項目から、「ネットワークとアドレス」をクリック。
  4. 表示された「ネットワークとアドレス」では
    1. 「名前による仮想サーバのアドレス」に「100.101.102.103(WebサーバーIPアドレス)」を入力。
    2. 「保存」ボタンをクリック。
  5. タブの「仮想ホストの作成」をクリック。
  6. 表示された「仮想ホストの作成」では
    1. 「アドレスへの接続を取り扱う」で「特定のアドレス」を選択」して「100.101.102.103(WebサーバーIPアドレス)」を入力。
    2. 「ドキュメントのルート」に「/var/www/html/blog/(公開するディレクトリ)」を入力。
    3. サーバ名」に「blog.hoge.com(設定したいドメイン名)」を入力。
    4. 「作成する」ボタンをクリック。
  7. 右上にある「変更を適用」で変更した内容を適用させる。

仮想ホストの作成は、必要なドメイン数に応じて作成する。


BIND DNSサーバーの設定

SaaSesのOsukiniサーバーLTでWebminからDNSサーバーを構築してみる。(1) - 雨ときどき晴れ

SaaSesのOsukiniサーバーLTでWebminからDNSサーバーを構築してみる。(2) - 雨ときどき晴れ

あたりを参考に設定するといいかも。


www.hoge.comやb.hoge.comなど複数のサブドメインを設定する場合は、

追加するレコード名を「*.hoge.com」にすると1つだけで済みます。


設定後に「Apply Configuration」をクリックして、設定を反映させることを忘れずに〜。


あとがき

今回、httpd.confの「NameVirtualHost」の項目名がWebminでは「名前による仮想サーバのアドレス」であることが

分からず、普通に悩んだ。

まあ、英語と日本語訳を見比べるとそのままと言えば、そのままなんですが。。。


あと、最近、SaaSesが回線増強して40Mbps→1Gbpsになったそうな。

サーバー借りている側としては、速くなることはいいことです。

2010-12-20

冬のボーナスがあれば買いたかったパソコン関係のモノたちのまとめ。

世間的には、そろそろ冬のボーナスを使って、

自分で自分にクリスマスプレゼントを贈る人が発生する頃だと思います(笑)


いつもであれば、ボクも何か買っていたのですが、

今年はどうにもボーナスが貰えなさそうなので、我慢するしかなさそうです。。。


しかし、ボクもいろいろ欲しいモノを考えていたので、

今回は、未練がましくも欲しいモノリストだけでも、ここに残しておくことにしてみました。


SSD - Crucial RealSSD C300 シリーズ 128GB

f:id:nogusa:20101220051520j:image:w200

今年の6月頃、ノートPCに取り付けていたINTELSSDが壊れてしまいました。→ 記事はこちら

それからは、普通のHDD(2.5インチ、5400rpm、80GB)で頑張っています。


しかしながら、一度SSDの状態を満喫していたボクとしては、

HDDはガリガリ音がするし、熱くなるし、遅いしと不満アリアリな感じです。


そこで新しいSSDを検討していたところ、CrucialのSSDを発見しました。


スペック的には、読み込み335MB/s、書き込み140MB/s(SATA-3 6Gbps)。

INTELSSDより速い感じみたい。


ということで、INTEL製のSSDが壊れたボクとしては、

別の会社のモノを使ってみたいという希望に合致したのがこのSSDなんです!


価格的にも25,000円(2010年12月)くらいなので、少し贅沢なHDDと思えば十分手が出せる。。。はず?



HDD - Western Digital WD20EARS-00MVWB0 2TB/SATA

f:id:nogusa:20101220052435j:image:w200

3.5インチの容量2TBのHDDが8.000円弱で変える時代になりました。

ということは、2TBのHDDを2個買ったとしても、15,000〜16,000円で買えてしまうということです。

いやぁ〜、スゴイ時代になりましたよね。ホントに。


これはブログには書いていないことなんですが、ノートPCのSSDが壊れた時期と同じ頃に

I-O DATAのHDL2-G LAN DISK HomeのHDDが1つ異音を響かせながらお亡くなりになりました。

HDL2-Gは2つのHDDで構成されています。

そして、ボクはRAID0(ストライピング)の設定で使用していました。


となると、1つHDDが壊れてしまうと、もう復旧は不可能です。

ただ、このHDL2-GはメインPCのバックアップ用として使用していたため、

致命的に大変な事にならなかったのは、不幸中の幸いです。


そんなこんなで、現在HDL2-Gは電源OFFで待機中。。。


でも、ずっと待機中だと可哀想だ。

ということで考えたのが、新規に2TBのHDDを2個購入して、

RAID1ミラーリング)で活用できないかということです。(RAID0は怖いので)


もともとHDL2-Gには、1TBのHDDが取り付けられていたため、

2TBのHDDを取り付けて動くのかは謎です。また、HDDのメーカーも違うモノです。

そのため、自分でテストしていないので、人にはオススメできませんが、

とりあえず、やったみたいなぁ。

まあ、最悪動かなかったら、メインPCに取り付ける方向で。。。



マウス - Logicool G700

f:id:nogusa:20101220055002j:image:w200

11月くらいから、メインで使っているマウスMX-Rで左クリックがちゃんとできなくなってきました。

具体的には、シングルクリックがダブルクリックになったり、

ドラッグ&ドロップしようとしたらダブルクリックになってしまう状態です。

まあ、これがチャタリングという症状なんでしょう。

あと、充電スタンドに置いても、接触不良でなかなか充電してくれません。


この状況を解決すべく、次期マウス候補を探していたところ、G700に辿り着きました。

G700の特徴は13個のボタンが付いていることです。

正直、使いこなせない気はしますが、おもしろそうなので問題なしです。

他には、レシーバーが小さくなったり、充電方法がUSB接続になったりしています。


実際に店頭で触ってみた感じでは、MX-Rより少し手を広げて握る感じでした。


Logicoolには他にもM950があったりしますが、何となく微妙。

MX-R → M950 の流れが正当なのかもしれないけど、

M950にはDarkfield以外に目立った機能がない気が個人的にします。

まあ、Darkfieldのおかげでガラス上でマウス操作が可能になるので、

十分に素晴らしいことは事実なんですが。


それよりも、おもしろそうなG700を使ってみたいというのが今の心境です。



ということで、欲しいモノリストを書いてみました。

何だか、欲しいモノというよりは、代替え品探しみたいな状態になってしまいましたが。。。


来年には、このリストのモノを全て購入して、レビュー記事を書いてみたいなぁ。