スマートフォンやhtml5+CSS3など新技術に四苦八苦。jQuery、AjaxなどJavaScriptも難しいですね。そんなWebに悩む人のネタ帳です。

以前に以下のような記事を書きました。
CakePHPで「404 NOT FOUND」などのエラー画面を構築する
こちらで「cakeError」を使用する方法を紹介しましたが、実は欠点があります。
「cakeError」をコールすると、そのコントローラ内の処理が全てキャンセルされるという点です。

私の場合、コントローラ内の「beforeFilter」でレイアウトのヘッダやフッタを構成する処理を実装していたのですが、「cakeError」によりそれらが実行されず、結果的に作成したエラー画面で意図しないシステムエラーメッセージが表示される事態になってしまいました。

「beforeFilter」などに実装した処理を実行させるためには、AppErrorをオーバーライドしたり、コアファイルを修正して「beforeFilter」を実行するように改良する方法があるようです。
しかし、私の場合、エラーが発生する・しないに関わらず、コントローラ毎にベースとして実行する処理は「beforeFilter」にまとめてあるので、なるべくはコアファイルなどに変更をかけずに対策したいと考えてました。

旧PCから新PCへ作業環境を移すにあたり、FirefoxとThunderbirdを移行したので、その作業メモです。

FirefoxもThunderbirdもMozillaの製品であり、その移行方法は基本的に同じです。
何れも、プログラム部分と個人設定などを含むプロファイルのディレクトリが分かれているので、移行はそのプロファイルを移すことになります。

移行環境

今回、私が実施したのは「Windows7 32bit」から「Windows7 64bit」マシンへの移行です。新旧マシンの共に、Firefoxのバージョンは8.0.1、Thunderbirdのバージョンは9.0.1です。
これより古いバージョンについては未検証ですが、近いバージョンであれば、同じ手順での移行は問題ないと思います。

※後日、「Windows7 64bit」から「Windows8.1 64bit」でも移行しましたが、同手順で問題ありませんでした。

例えばxamppなどを利用してローカルでメールフォームなどを開発する場合、その動作を確認できなくて困ることがあります。
原因は、単純にローカルマシン自身がSMTPサーバではないからです。

xamppにはその問題を解消するために「Mercury」というソフトが同胞されています。これまで、幾度となく何度もチャレンジしたのですが、うまくメールを送信できませんでした。
しかし、今回、設定に成功したのでメモとして残しておきます。

ローカル開発環境の詳細について

今回、ローカル開発環境におけるメール送信環境を実現したのは以下の環境です。

OS Windows7 64bit
XAMPP 1.7.7
Apache 2.0
PHP 5.3.8
Mercury 4.62

もちろんApache、PHP、Mercuryはxamppにデフォルトで同胞されているものを使用しますが、参考までに。

Windowsでファイルを共有する場合、Windows XP以前では「ファイル共有」というメニューから設定できました。
それがWindows Vistaになって、ネットワークセキュリティだか権限だか、そのしくみの詳しくは知りませんが、なかなかファイル共有ができずに、四苦八苦した経験があります。

今回、Windows 7同士でファイルを共有することになりました。
またVistaのような苦労を強いられるのかと思いながら少し調べていたら、Windows 7には「ホームグループ」という簡単にファイル共有が実現できる機能が用意されているようです。

早速ですが、その機能を試してみました。

例えば、同一LAN内に設置した2台のWidows 7マシン、ホームグループを作成するPC1と、ホームグループに参加するPC2でファイルを共有することを想定して、設定を進めてみます。

ホームグループが利用できる設定かどうか?

まず、ホームグループを利用するには、PC1とPC2共にネットワークの設定が「ホームグループ」である必要があります。
確認方法は「コントロールパネル」⇒「ネットワークとインターネット」⇒「ネットワークと共有センター」を開き、「アクティブなネットワークの表示」から使用しているネットワークが「ホームネットワーク」になっているか確認します。「ホームグループ」以外の場合、「ホームネットワーク」に変更します。

PHPでCMSやブログを構築する場合に、デザインの都合上、文字列をまるめたい場合があります。

文字列をまるめるとは、任意の長さで文字列をカットして、末尾に「…」などを付加することです。
例えば

PHPで文字列をまるめるのに便利な関数「mb_strimwidth」

これを10文字でまるめると、以下のようになります。

PHPで文字列をまる…

PHPで文字をまるめる処理を書くと、以下のようになります。

$str = "PHPで文字列をまるめるのに便利な関数「mb_strimwidth」";
if(mb_strlen($str) > 10){
	echo mb_substr($str, 0, 10) . "…";
}else{
	echo $str;
}

CakePHP 1.3.12でEmailコンポーネントを使ってメールを送ってみます。

コンポーネントを読み込む

Emailコンポーネントを利用するためには、以下のようにしてコントローラで宣言するだけです。

var $components = array(
	'Email',
);

メールテンプレートを用意する

CakePHPではメールテンプレートを、ビューと同じようなしくみで作成することができます。
例えば、テキストメール「sample.ctp」というビューを作成する場合、以下にファイルを用意します。

/app/views/elements/email/text/sample.ctp

ビューの中身は、通常のページを構築する要領です。例えばこのような内容でしょうか。

<?php echo $to ?>さま

メールどうもありがとうございます。

<?php echo $from ?>より

CakePHPで「404 NOT FOUND」や「500 Internal Server Error」など、例外処理で画面を作る方法です。

CakePHPでは、特に何もしなくてもフレームワークの方でメッセージを出してくれます。しかし、開発側で意図的にエラーの種類を分けたり、画面を作成したい場合があります。
フレームワークを無視して独自でPHPで実装するのもありですが、CakePHPにそのしくみが用意されているのを見つけたので、利用してみます。

エラー用のビューを設置する

CakePHPではエラーが発生した際に参照するビューディレクトリがあります。

/app/views/erros/

例えば、404エラーの場合は「error404.ctp」というビューを設置しておけば、404エラーが発生した際に自動的にこのビューが出力されます。

FirefoxやGoogle Chromeでは問題ないのに、Internet Explorerからだと画像をアップロードできないという問題が発生しました。
結果から言うと、原因はMicrosoftの独自仕様である「image/pjpeg」でした。

例えば、フォームで画像をアップロードする際、JPG画像に限定させたいという場合があります。
アップロードされたファイル名の拡張子から判断するのは危険なので、通常ではContent-Typeからファイルタイプを読み取ります。

以下はフォームのソース例です。

<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
</form>

フォームからのリクエストをPHPで受け取り、JPGかどうか判定するのに以下のように処理を実装します。

以前に以下のような記事を書きました。
CakePHPでAuthコンポーネントを使ってみる
この時はCakePHP1.3.9で検証したのですが、ログイン処理がマニュアル通り動作しない問題がありました。

原因は不明です。少しコアな部分を調べましたが、分かりませんでした。
デフォルトの設定が原因なのか、単純にバグだったのか分かりませんが、今回、CakePHP1.3.12で試したところマニュアル通り機能したので、改めて書きます。

ユーザ管理テーブルを用意する

こちらは以前と同じ仕様です。「users」テーブルに「username」と「password」のカラムを持たせます。

CREATE TABLE users (
    id INTEGER(8) auto_increment PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL,
    date_create VARCHAR(19) NOT NULL,
    date_update TIMESTAMP NOT NULL
);

Google Maps APIを利用する際、以前はマップ上にマーカーを立てるのにそのポイントとなる経度、緯度が必要でした。
つまり、住所から直接ポイントを設定することは出来ず、住所などの情報から一度、経度、緯度を調べる必要があったのです。マーカーが増えると、その作業もめんどくさくなりますね。

今回、このようなマーカーを複数立てるマップコンテンツを作ることになり調べていたのですが、Google Maps APIよりテキストの住所から経緯を取得できるAPIが公開されていたので、早速使ってみました。
Google Geocoding API

まずはサービスを使用するにあたり、APIを読み込みます。

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true">

次に以下のようにしてGeocodingのインスタンスを生成します。

var geo = new google.maps.Geocoder();

APIにリクエストを投げる際には関数geocodeを使用します。関数geocodeの第一引数にはリクエストパラメータ、第二引数にはコールバック関数を設定します。
今回は試しにパラメータに東京スカイツリーの住所「東京都墨田区押上1丁目」を設定してみます。

Monthly Archives

Search