2008年12月25日木曜日

Googleみたいに?

PHPのサイトのロゴがクリスマスバージョン...!

2008年12月24日水曜日

RailsとMerbが統合するらしい

Railsよりお薦め!Rubyのフレームワーク Merb (Mongrel + Erb) をインストール」の記事がなぜか突然人気だなと思ったら、RailsとMerbが統合!するらしい。

DHHがMerbをコアにしてRails3を作るらしいけど、Merbのファサードを絞ったシンプルさが、DHH的な知らないと分からない隠れ規約に飲み込まれないかちょっと心配。

でもMerbもこのままマイナーなままよりはメジャーになった方が、Railsともどもお互い幸せなのかもね。

ついでにWeb Flavorも関係ないけどブレイクしないかな!

あ、Rails2のアプリはまた置き去りにされるのか...。

2008年12月22日月曜日

MySQLの timestampの自動更新ができない場合の修復方法

例えばcreated_atにはINSERT文でvalueにシステム時刻をセットし、updated_atは自動更新させることを想定している場合。

下記のように、間違えてtimestamp型の列を複数定義すると、2つ目以降のtimestampは初期値がオールゼロになり、自動更新もされない。

DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

間違いに気づいて、Query Browserからテーブル定義を変更(created_atをdatetimeにして、updated_atのdefaultにCURRENT_TIMESTAMPをセット)しても、自動更新はされない。
なぜなら、Query Browserからテーブル定義を変更してtimestampにした場合、下記のようにON UPDATEの定義が無いから。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Query Browserは、外部KEY以外のトリガーを作成できない。
なのでSQL文(DDL TDL)で列の定義を修正する。

ALTER TABLE members MODIFY updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP


修正できた。
DROP TABLE IF EXISTS `test`.`members`;
CREATE TABLE `test`.`members` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

参考:MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.1.2 ALTER TABLE 構文

MySQLで Database (Schema)を作成するDDL

よく忘れるのでメモメモ。
文字コードがデフォルトでよい場合は指定不要。

CREATE DATABASE データベース名 CHARACTER SET utf8;

2008年12月6日土曜日

mysql_conncet()で hostを localshotとする場合と127.0.0.1とする場合の違い

PHPのmysql関数の話。PDOを使えば関係ないかも。

mysql_connect()でhostにlocalhostを指定すると接続エラーになり、127.0.0.1を指定すると接続できること(環境)がある。

原因:
mysql_conncet()では、localhostの場合unixソケットを使い、127.0.0.1の場合はTCP/IP接続を使うため、らしい。
(Windowsの場合は実行ファイルの呼び出し???)
参考:codeなにがし::mysql_connect()のホスト名にlocalhostを指定するとソケット接続になる


こちらも参考:MAMP環境CakePHP1.2のbakeでSQL接続エラー - ElectronicBrain is eating BreakFast

PHPで SJIS-winを使う

メモ。

PHPで UTF-8←→SJIS の変換を行う場合の注意 : 地方で活動するweb制作者の日々を綴るblog

[php] mb_convert_encoding と UTF-8 の誤変換問題 ( しゃいん☆のブログ| 名古屋市 Webシステム開発 サーバ構築 ネットワーク構築 株式会社コネクティボ )

ke-tai.org > Blog Archive > PHPで絵文字を壊さずに文字コードや全角半角変換を行う方法

mobile、SJIS SJIS-win mb_convert_encodingとhtmlspecialchars - 。

Y's Blog | PHPでUTF-8からSJIS-winへの変換ではまる


sjisは使わずにSJIS-win使えば問題無い?

Googleの Sitemapにフィードを登録する場合の注意点






Google ウェブマスター ツールではSitemapとしてフィードを登録することができるが、いくつか注意点が。


1. 登録できるフィードはRSS2.0かAtom1.0のみ
 参考:
  雑記帳?一応Weblog - Atom 1.0キボン
  サイトマップの作成 - ウェブマスター向けヘルプ センター


2. Atom1.0を登録する場合、各エントリーにpublished(作成日)要素が必要
 publishedが無いとエラーになる。
 Atom1.0の仕様としてはupdatedは必須だが、publishedは必須ではないのだが。
 参考:
  Error in parsing sitemap for Atom Feed - Invalid XML tag - Sitemap Protocol | Google グループ
  RFC 4287 The Atom Syndication Format 日本語訳 - futomi's CGI Cafe (Atom1.0仕様書の和訳)

(2008/1/7 追記)
いつの間にか、Atom1.0でエントリーにpublishedが無くてもエラーにならなくなっていた。

RewriteCondで条件によって別のRewriteBaseを使う

できないみたい。

CakePHPで試してみたらできるようだ。

<IfModule mod_rewrite.c>
 RewriteEngine On

 RewriteCond %{REQUEST_FILENAME} !-d
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteRule ^(.*)$ index.php?url=$1 [QSA]

 RewriteCond %{REQUEST_URI} ^/foo
 RewriteBase /foo

 RewriteCond %{REQUEST_URI} ^/bar
 RewriteBase /bar
</IfModule>

CakePHPではWebのルート直下以外にCakeのホームディレクトリを作ろうとするとRewriteBaseの設定が必要になる。
上記の方法を使えば複数のディレクトリのように見せることができそう。



参考:mod_rewrite - Apache HTTP Server (和訳無し)


PHPのmb_send_mail()でのSMTPエラー(550 5.7.1)の解消方法

PHPのmb_send_mail()からIISの簡易SMTPサーバを使ってメールを送信しようとしたとき、下記のエラーが発生。

PHP Warning: mb_send_mail() [<a href='function.mb-send-mail'>function.mb-send-mail</a>]: SMTP server response: 550 5.7.1 Unable to relay for ...

原因はSMTPサーバがデフォルト設定で、中継を許可していなかったため。
中継を許可するIPアドレスに127.0.0.1を加えたらメールが送信できるようになった。

ブログ アーカイブ

tags