いってきました、ラーメン二郎 荻窪店。


日曜の15時過ぎだったので、並ぶこと10数分で席に座れました。


味はやや薄く、カラメにしておけばよかったかな~と後悔しました。

それにつけても美味しかったです。


ぷしゆのWEBクリ道場-ラーメンニンニクなし

写真ブレとるがな・・



そして初めて外人さんが二郎にて食しているのを目撃しました!

わかる、わかるよ~二郎は世界共通なんやね~とほんわかした気持ちになりましたw

Windows Server 2008 IIS7でPHPを動かしている環境で詳細エラーページを表示されなくて困っていました。


設定を探し当てるのに苦戦したので覚え書き。


①IISマネージャを開く

②対象サイト(ディレクトリ)を選択する

③機能ビューのディレクトリの参照をクリックする

④操作の「有効にする」をクリックする


以上

以外と簡単でしたガーン

CakePHPを利用してユーザー認証システムを構築しています。
認証処理にはAuth Componentを利用しています。
このコンポーネントはユーザー登録処理の際パスワードを自動で暗号化してくれたりと非常に便利な機能なのですが、
困った問題がでてきました。

ユーザー情報を新規登録する際に確認画面を表示してから登録処理を行っているのですが、
例のパスワード自動で暗号化が「確認画面を表示したタイミング」と「登録処理のタイミング」の両方で行われてしまい、正しいパスワードが保存できないという現象です。

悩みました・・(いろいろ調べました)

結果、スマートな方法ではないですが「入力フォームのパスワードフィールド名に別名を付ける」やり方で対処しました。

サンプルソース(メールアドレスをユーザーIDとして登録)

[ファイル]
/app/model/user.php
/app/controllers/users_controller.php
/app/views/fakes/add.php
/app/views/fakes/add_confirm.php

[ソースコード]
/app/model/user.php
<?php
class User extends AppModel{
var $name='User';
var $validate = array(
'origin_password' => array(
'required' => array(
'rule'=>VALID_NOT_EMPTY ,
'message' => '必須項目です'
),
'rule1' => array(
'rule'=>array('minLength',6) ,
'message' => 'パスワードは6文字以上です'
)
)
);
}
?>


/app/controllers/users_controller.php
<?php
class UsersController extends AppController {
public $name = 'Users';
public $components=array('Auth');

function beforeFilter(){
/*初期処理*/
$this->Auth->allow('add');
$this->Auth->allow('logout');
$this->Auth->fields=array(
'username'=>'email',
'password'=>'password'
);
}
function add(){

$this->pageTitle="新規ユーザー登録";
if (!empty($this->data)){
/*バリデーションチチェック*/
if($this->data['User']['mode'] == 'confirm' && $this->User->create($this->data) && $this->User->validates()){
/*確認画面を開く*/
$this->render('add_confirm');
}else{
if($this->data['User']['mode'] == '登録する') {
/*別名で保持していたパスワードを暗号化してパスワードフィールドにセット*/
$this->data['User']['password']=$this->Auth->password($this->data['User']['origin_password']);
$this->User->create($this->data);
if($this->User->save($this->data)){
$this->flash('登録が完了しました。','/users');
}
}
}
}
}

}
?>


/app/views/fakes/add.php
<?php
echo $form->create('User');
echo "メールアドレス";
echo $form->input('User.email');
echo "パスワード";
echo $form->password('User.origin_password');
echo $form->hidden('mode',array('value' => 'confirm'));
echo $form->end('確認画面へ');
?>


/app/views/fakes/add_confirm.php
<h4>この内容でよろしいですか?</h4>
<?= $form->create('User', array('action' => 'add', 'type' => 'post')); ?>
<p>メールアドレス:<?= h($form->value('User.email')); ?></p>
<?= $form->hidden('User.email'); ?>
<?= $form->hidden('User.origin_password'); ?>
<?= $form->submit('戻る', array('name' => 'data[User][mode]')); ?>
<?= $form->submit('登録する', array('name' => 'data[User][mode]')); ?>
<?= $form->end(); ?>


以上で正常にパスワードを保存してくれました。

★ポイント
別名で保持していたパスワードを暗号化してパスワードフィールドにセット。
CakePHPを使ったシステムでDB処理を必要としない項目にバリデーションを行う必要がでてきました。
例)よくあるサイトの「友達に教える」ページ。ニックネーム、送信先のEメールを入力してもらい内容でバリデーションを行いたい。
ぷしゆのWEBクリ道場

通常はモデル内でバリデーション処理を行うのですが、対象となるテーブルがない(DBにデータを保存する必要がない)ため「どこで」「どうやって」バリデーションを行うか悩みました。
できればモデルでやった時と一緒の動きでやりたかったので以下の方法を取りました。

・フェイク(DB,テーブルの実体がない)のモデルを作成してそこでバリデーションを行う

「fake」という名前の機能で入力~バリデーション~確認までのソースコードを書きます。

[ファイル]
/app/controllers/fakes_controller.php
/app/model/fake.php
/app/views/fakes/send.php
/app/views/fakes/send_confirm.php

[ソースコード]
/app/controllers/fakes_controller.php
<?php
class FakesController extends AppController {
var $name = 'Fakes';

function send(){
if (!empty($this->data)){
/*バリデーション処理*/
if($this->data['Fake']['mode'] == '確認画面へ' && $this->Fake->create($this->data) && $this->Fake->validates()){
/*確認画面を開く*/
$this->render('send_confirm');
}
}
}
}
?>


/app/model/fake.php
※チェック内容:email,nicknameが入力されているか?emailがメールアドレス形式か?
<?php
class Fake extends AppModel{
var $useTable=false;
var $validate = array(
'nickname' => array(
'required' => array(
'rule'=>VALID_NOT_EMPTY ,
'message' => '必須項目です'
),
),
'email' => array(
'rule1' => array(
'rule' => array('email'),
'message'=>'メールアドレスが正しくありません'
),
'required' => array(
'rule'=>VALID_NOT_EMPTY ,
'message' => '必須項目です'
),
)

);
}
?>


/app/views/fakes/send.php
<p>このサイトを友達に教える</p>
<?= $form->create('fakes',array('type'=>'post','action'=>'./send')); ?>
<?= $form->input('Fake.nickname',array('label'=>'nickname')); ?>
<?= $form->input('Fake.email',array('label'=>'email')); ?>
<?= $form->submit('確認画面へ', array('name' => 'data[Fake][mode]')); ?>
<?= $form->end(); ?>


/app/views/fakes/send_confirm.php
<p>この内容でよろしいですか?</p>
<?= $form->create('fakes', array('type' => 'post','action' => './send')); ?>
<p>ニックネーム:<?= h($form->value('Fake.nickname')); ?></p>
<p>メールアドレス:<?= h($form->value('Fake.email')); ?></p>
<?= $form->hidden('Fake.nickname'); ?>
<?= $form->hidden('Fake.email'); ?>
<?= $form->submit('戻る', array('name' => 'data[Fake][mode]')); ?>
<?= $form->submit('登録する', array('name' => 'data[Fake][mode]')); ?>
<?= $form->end(); ?>


以上で正常にバリデーションしてくれました。

★ポイント
モデル内で「var $useTable=false;」と書いてモデルのテーブル指定を無効にする。

I'm just gonna upload my blog in English today.

I'll write about a few of my favorite things.



・day off
definitely I love it. but I'm not a late riser. I go out to anywhere except rainy days.

・movie theaters
these could bring an amazed time shared with people. that's why I like these.

・interesting persons
I'm talking about a person who has creativity,motivation,independency and open mindness.
and I wanna be like that.

・ramen
I can't live without it.
especially I love Jiro's ramen.



I just wanna live freely. I don't need boring jobs('ε')




さくらインターネットのサーバーでサイトを運営してるんですが、サーバーからサイトユーザー向け送ったメールがyahoo,hotmailなどで迷惑メールフォルダに入ってしまう事態が発生してしまいました。


ぷしゆのWEBクリ道場

送信ドメイン認証でSPFレコードには対応させているんですがどうやら意味ない様子・・
しょうがないからDomainkeys設定するか!
と思って一応さくらインターネットに問い合わせてみた。

以下がその回答。(2009/7/7時点)



 大変恐縮ではございますが、「さくらのレンタルサーバ」はDomainkeysに
 対応しておりません。

 ご希望に添えず誠に申し訳ございませんが、ご了承いただきますよう、お
 願い申し上げます。



だって・・レンタルサーバー換えるしかないんすかね~('з')ムーン

Windows Server2008 IIS 7.0 PHP5 utf-8の環境で
jQuery File Treeを使用してフォルダの階層表示を実現したい!

ニコニコjQuery File Tree - sample


ということで本家サイトからファイルをダウンロードして実装したがフォルダが開かない・・

どうもフォルダ名が日本語なのが原因らしく jqueryFileTree.php を以下のように書き換えた。

jqueryFileTree.php

<?php
//
// jQuery File Tree PHP Connector
//
// Version 1.01
//
// Cory S.N. LaViska
// A Beautiful Site (http://abeautifulsite.net/)
// 24 March 2008
//
// History:
//
// 1.01 - updated to work with foreign characters in directory/file names (12 April 2008)
// 1.00 - released (24 March 2008)
//
// Output a list of files for jQuery File Tree
//

$root = "";

$_POST['dir'] = urldecode(urldecode($_POST['dir']));

if( file_exists($root . $_POST['dir']) ) {
$files = scandir($root . $_POST['dir']);
natcasesort($files);
if( count($files) > 2 ) { /* The 2 accounts for . and .. */
echo "<ul class='jqueryFileTree' style='display: none;'>";
// All dirs
foreach( $files as $file ) {
if( file_exists($root . $_POST['dir'] . $file) && $file != '.' && $file != '..' && is_dir($root . $_POST['dir'] . $file) ) {
echo "<li class='directory collapsed'><a href='#' rel='" . urlencode($_POST['dir'] . $file) . "/'>" . mb_convert_encoding($file,"UTF-8","auto") . "</a></li>";
}
}
// All files
foreach( $files as $file ) {
if( file_exists($root . $_POST['dir'] . $file) && $file != '.' && $file != '..' && $file != 'Thumbs.db' && !is_dir($root . $_POST['dir'] . $file) ) {
$ext = preg_replace('/^.*\./', '', $file);
echo "<li class='file ext_$ext'><a href='#' rel='" . urlencode($_POST['dir'] . $file) . "'>" . mb_convert_encoding($file,"UTF-8","auto") . "</a></li>";
}
}
echo "</ul>";
}
}

?>


そしたらうまく動いたよやっほい!!ニコニコ

開発者向けのYahoo!オークション APIを利用して開発した
簡易版ヤフオク検索サイトをリリースしました。

人目を気にせずに使えるように全体的に地味な色味(モノトーンベース)とシンプルな構成でオークション商品が検索できるようになっています。
サイト名は地味なYAHOO!オークション 略して「じみオク.COM」にしましたw

(かなり安易な名前の付け方ですが・・)



ぷしゆのWEBクリ道場


特徴としては
・地味でシンプルな検索画面。
・詳細画像についてはカラー・白黒の指定(IEのみ)、画像サイズの指定が可能。
・気になる商品は検討リストに追加してまとめてオークション情報をメール送信。

極力オークションをやっていることが周囲にわからないようにデザインされています。


じみオク.COM
http://www.jimioku.com

調べてみるとyahooやgoogleは送信ドメイン認証でスパムかどうかの判断をしているとのこと。

例)YAHOO!メールで受信したメールのヘッダー
Received-SPF: none (www***.sakura.ne.jp: domain of *****@www***.sakura.ne.jp does not designate permitted sender hosts)
noneは送信ドメイン認証に失敗している状態らしい。このせいで迷惑メールフォルダに入ってしまう。

ドメインのネームサーバーにSPFレコードの設定をしておけば解決できそうなので以下の設定をしてみた。
※ドメイン管理会社が「お名前.COM」の場合。

・お名前.COMの「ドメイン Navi」にログインする。

・ドメイン設定-ネームサーバーの変更から対象ドメインのネームサーバーを以下の2つに変更。
01.dnsv.jp
02.dnsv.jp

・ドメイン設定-DNS設定から対象ドメインのDNS設定(レコード設定)を以下で設定。
[DNS設定情報]
/*ドメインアクセス時のIP設定*/
ホスト名:****.com(対象ドメインwwwなし)
タイプ:A
値:***.***.***.***(アプリサーバーIP)
状態:有効

ホスト名:www.****.com
タイプ:A
値:219.94.163.194

/*SPFレコード用の背手地*/
ホスト名:****.com(対象ドメインwwwなし)
タイプ:MX
値:****.com(メールサーバー)

ホスト名:****.com(対象ドメインwwwなし)
タイプ:TXT
値:v=spf1 +ip4:***.***.***.*** -all(アプリサーバーIP)

以上設定が終わってメール送信テストしてみた。が、また迷惑メールフォルダに入ってしまった・・

今度はphpの送信プログラムを以下のように書いてみた。※赤字部分を追加

$parameter ="-f ".$mail->getFrom();
$header = "From:".$mail->getFrom()."\n";
$header .= "Reply-To: ".$mail->getReply_to."\n";
$header .= "Content-Type:text/plain;charset=ISO-2022-JP\nX-Mailer: PHP/".phpversion();
mb_send_mail($mail->getTo(),$mail->getSbj(),$mail->getBody(),$header,$parameter);

再度メール送信テスト。今度は通常の受信フォルダに入った(゜〇゜)ワーオ

Received-SPF: pass (www***.sakura.ne.jp: domain of info@****.com designates ***.***.***.*** as permitted sender) receiver=www***.sakura.ne.jp; client-ip=***.***.***.***; envelope-from=info@****.com;
passになっているのでめでたく成功。

※SPFレコードの確認
nslookup -q=txt example.com

そして気づいたら一日が終了してました´д`