PHPのサイトのロゴがクリスマスバージョン...!
2008年12月25日木曜日
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
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 構文
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を加えたらメールが送信できるようになった。
2008年11月25日火曜日
CakePHP Tipsその2
CakePHP初心者のための Tips (CakePHP 1.2)の続き。
- パンくずリスト(トピックパス)
- グローバル関数(CakePHPの標準function)
- ページング(Pager / Paginator)
- Paginatorの使い方。CakePHP1.2 - CPA-LABテクニカル
- CakePHP 1.2からはPaginatorが内蔵(×内臓)になった。
- 現在のページからの相対パスによりURLを取得
- ModelでのValidate
- 予期せずセッションが消えることを防ぐ設定
- CakePHPでセッションが消える原因は・・・・。 YARETOKO「ヤレトコ」メインブログ
- CakePHPの Security.levelとセッション - あぁ そうだった
- デフォルトではリファラまでチェックしてるので注意。
- Vendorのファイルをimport
2008年11月24日月曜日
2008年11月14日金曜日
PHPでサーバサイドでデータをPOSTする色々な方法
とても簡単にPHPからPOSTリクエストを送信する方法 [PHP, Tips] - Programming Magicがまとまっていて分かりやすい。
関連記事:floatingdays: PHPを使ってサーバサイドでXMLをPOST
2008/11/28 追記
POSTするときのContent-typeをオプションのheader(http header)として指定しないとNoticeが出る。その場合は"application/x-www-form-urlencoded"が適用される。
また、Content-typeに"text/html"などを指定すると受け側でエラーを起こすことがあるので注意。Railsとか。
PHPで簡単にURLのGETパラメータを作成する方法
標準関数のhttp_build_query()を使うと、URLのGETパラメータ(クエリーストリング)を簡単に作れる。
PHP5かららしい。
例
$query = array('foo' => 'ABC', 'bar' => 123, 'baz' => 'あああ');結果
echo http_build_query($query);
foo=ABC&bar=123&baz=%82%A0%82%A0%82%A0
URLエンコードもしてくれるのが便利。
HTMLエスケープもしたいなら、第3引数を'&'にする。(パフォーマンスを気にしないなら、URLをまるごとhtmlSpecialChars()した方が楽だが。)
例
echo http_build_query(array('foo' => 'ABC', 'bar' => 123), '', '&');結果
foo=ABC&bar=123
参考:PHP: http_build_query - Manual
携帯サイト向けクローラのUser Agent一覧
手元の専用ログから、モバイルサイト向けの検索エンジン等のクローラ(Bot)のUser Agentを洗い出し。2008年6月~11月頃のもの。
Google(AdSense絡みも含む。ただしNokiaは集計していない)
- DoCoMo/1.0/N505i/c20/TB/W20H10 (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
- DoCoMo/2.0 N905i(c100;TB;W24H16) (compatible; Googlebot-Mobile/2.1; +http://www.google.com/bot.html)
- DoCoMo/2.0 SH905i(c100;TB;W24H16) (compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
- KDDI-CA34 UP.Browser/6.2.0.10.2.2 (GUI) MMP/2.0 (compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
- 機種はW42CA(参考:KDDI au: そのほかの技術情報 > ユーザーエージェント)
- SoftBank/1.0/911SH/SHJ001 Browser/NetFront/3.3 Profile/MIDP-2.0
Configuration/CLDC-1.1 (compatible; Mediapartners-Google/2.1;
+http://www.google.com/bot.html)
Yahoo!
- DoCoMo/2.0 SH902i (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
- DoCoMo/2.0 N905i (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
- KDDI-CA23 UP.Browser/6.2.0.5 (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
- 機種はA5401CA II(参考:KDDI au: そのほかの技術情報 > ユーザーエージェント)
- KDDI-CA33 UP.Browser/6.2.0.10.4 (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
- 機種はW41CA(参考:KDDI au: そのほかの技術情報 > ユーザーエージェント)
- Vodafone/1.0/V705SH (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
- J-PHONE/2.0/J-SH03 (compatible; Y!J-SRD/1.0; http://help.yahoo.co.jp/help/jp/search/indexing/indexing-27.html)
goo
- DoCoMo/2.0 P900i(c100;TB;W24H11)(compatible; ichiro/mobile goo; +http://help.goo.ne.jp/door/crawler.html)
- DoCoMo/2.0 N905i(c100;TB;W24H16)(compatible; mobile goo; +http://emu.mobile.goo.ne.jp/)
livedoor
- DoCoMo/2.0 SH905i(c100;TB;W24H16) (compatible;* livedoor-Yill/1.0; *+http://helpguide.livedoor.com/help/search/qa/grp627)
はてな
- DoCoMo/2.0 D903i(c100;TB;W28H20) (compatible; Hatena-Mobile-Gateway/1.2; +http://mgw.hatena.ne.jp/help)
DeNA
- DoCoMo/2.0 N902iS(c100;TB;W24H12)(compatible; moba-crawler; http://crawler.dena.jp/)
雑感:
- docomoのみを偽装しているとこが多い
- auはCASIO製が人気、それ以外はN905iとSHARP製が人気。なぜ?
- docomoは902と905が多い
- Yahoo!はJ-Phoneまでフォローしている一方、SoftBankがまだ無い?親子断絶?
- Googlebot-Mobileはdocomoしか無い?
- あれ?F☆Routeが来てない...
参考:
Google Japan Blog: Google モバイル検索についてのウェブマスター向け情報
Utilz: 携帯クローラ
モバイル検索サイト クローラー一覧 - sin-news.com
携帯サイトオーナーズClub 携帯クローラ user-agent 一覧
携帯検索エンジンのクローラーのメモ ([黒]黒豚備忘録)
User Agentリスト - Mozilla Firefox まとめサイト
Windows XP SPSP3にしたらスケジュールしたタスクが実行されなくなった
Windows UpdateでXP SP2からSP3にアップデートしたら、タスクスケジューラに登録していたタスクが全て実行されなくなった。
タスクのプロパティを開いて、パスワードを再入力したら実行可能になった。
SP3へのアップデートに一度失敗したことと関係があるのか?
tags: password, schedule, windows, windows-update 0 コメント
2008年11月8日土曜日
PHP5のマジックメソッド
第2回設計勉強会に参加しました | Shin x blogを読んで初めてautoloadを知った。
ついでにマジックメソッドについてまとめてみる。
classのマジックメソッド
- __construct(), __destruct()
- classのコンストラクタとデストラクタ
- 参考:PHP: コンストラクタとデストラクタ - Manual
- __call(), __callStatic()
- classに未定義まはたアクセス不可(private等)の関数を呼ばれた場合に実行される
- インスタンス関数の場合__call、クラス関数の場合__callStaticが呼ばれる
- __callStaticはPHP5.3以降
- 参考:PHP: オーバーロード - Manual
- __get()
- classに未定義まはたアクセス不可の変数を取得しようとされた場合に実行される
- 参考:PHP: オーバーロード - Manual
- __set()
- classに未定義まはたアクセス不可の変数に値をセットされた場合に実行される
- 参考:PHP: オーバーロード - Manual
- __isset()
- classに未定義まはたアクセス不可の変数にisset()された場合に実行される
- PHP5.1以降
- 参考:PHP: オーバーロード - Manual
- __unset()
- classに未定義まはたアクセス不可の変数をunset()された場合に実行される
- PHP5.1以降
- 参考:PHP: オーバーロード - Manual
- __sleep()
- classのインスタンスがserialize()された場合に実行される
- 参考:PHP: マジックメソッド - Manual
- __wakeup()
- classのインスタンスがunserialize()された場合に実行される
- 参考:PHP: マジックメソッド - Manual
- __toString()
- classのインスタンスが文字列化された場合(ただし、PHP5.2より前では直接echoまたはprintされた場合のみ)に呼ばれる
- 参考:PHP: マジックメソッド - Manual
- __set_state()
- classのインスタンスがvar_export()された場合に実行されるようだが、よく分からない...
- これだけはstaticに宣言するようだ
- PHP5.1以降
- 参考:PHP: マジックメソッド - Manual、PHP 5.1から使えるマジックメソッド「__set_state()」メソッド - PHPプロ!ニュース
- __clone()
- classのインスタンスのクローンを作成された場合に呼ばれる
- PHP5.1以降
- 参考:PHP: オブジェクトのクローン作成 - Manual
グローバル関数なマジックメソッド
- __autoload()
- 未定義のclassが参照された場合に呼ばれる
- この関数の中でクラス名等に紐付いたファイルをインクルードさせれば、classを使う時にいちいちrequire/includeしなくてよくなる
- newでのインスタンス生成や静的メソッドの呼び出しの他、extendsや型宣言などによるclassの参照でも呼ばれる
- 参考:PHP: オブジェクトのオートローディング - Manual
今まで__construct, __destruct, __call, __get, __setくらいしか知らなかった。
__constructは別にすると、この中では__autoloadが特に便利。
また、__call, __get, __setはコーディングミス防止に役立つので生産性向上に寄与する。「重いので使うな」的なことが書かれていることが多いので、それなりに負荷のあるサイトでは使わないほうがよいのかも。(1ページ表示するのに__setを1000回使うサイトとか!)
参考:PHP: マジックメソッド - Manual
tags: class, magic-method, oo, php 0 コメント
CakePHP 1.2のFormHelperのradio()で余分なhiddenを出力しない方法
CakePHP1.2のFormHelperでラジオボタンを出力すると、ラジオボタンの前に隠し項目が出力されることがある。
例
<input type="hidden" name="data[Foo][bar]" id="FooBar_" value="" />
<input type="radio" name="data[Foo][bar]" id="FooBarBaz" value="Baz" />
<label for="FooBarBaz">Baz</label>
このhiddenを出力させたくない場合、$form->radio()の第3引数の配列で、'value'に何か値をセットして渡す。
echo $form->radio('Foo.bar', array('Baz' => 'Baz'), array('value' => 'none'));そうすると、
<input type="radio" name="data[Foo][bar]" id="FooBarBaz" value="Baz" />
<label for="FooBarBaz">Baz</label>
ラジオボタンの値に一致するvalueを渡すとそれが初期選択状態になるので、選択状態にしたくない場合は上記の例のように一致しない適当なvalueを渡す。
参考:API for CakePHP : The PHP Rapid Development Framework :: version 1.2.x.x
無料の携帯サイト向けアクセス解析サービス4つの比較
- 携帯サイト向けは「うごくひと」
- 画像埋め込み+オプションでPHP等のスクリプト埋め込み
- 良い点
- グラフを多用した大雑把なUIで見やすい
- 機種の発売時期のグラフがある
- 都道府県別のアクセス度合いが見られる。役には立たないが。(沖縄はいつも赤い)
- スクリプト埋め込みを使うことにより、時系列に沿って検索キーワード(KDDIとSoftBankのみ)が見られる
- 悪い点
- スクリプト埋め込みを使えば、やろうと思えばリファラからリンク元の情報を取れるはずだが、それが無い
- 表示ページや検索キーワードや機種の集計が無い
i2i無料『アクセス解析』携帯対応・訪問ルート分析の足あと機能
- 画像埋め込みタイプ
- 良い点
- アクセスしてきた機種の細かい統計が見られる。表示できる文字数とか、iモードブラウザのバージョンとか。
- 悪い点
- 画像埋め込みなので、リファラが無いと引っ張れれない情報(リンク元と検索キーワード)が取れない
トップページ|myRTモバイル
- 画像埋め込みタイプ
- なぜかSoftBankしか集計されない...
- 良い点
- 対応している画像タイプの集計が見られる。でもSoftBankだけ...
- 悪い点
- SoftBankしか集計されない...
- 画像埋め込みなので、リファラが無いと引っ張れれない情報(リンク元と検索キーワード)が取れない。しかもSoftBankしか集計されない...
- 管理画面が重い。しかもSoftBankしか集計されない...
Google Analytics
- 携帯サイトをGoogle Analyticsでアクセス解析する方法を参照
- Google Analyticsの利用規約的にはOKなのかな?
CakePHPの標準機能でパンくずリスト(トピックパス)を生成する方法
CakePHPでパンくずリストを表示するサンプル YARETOKO「ヤレトコ」メインブログ
標準で使えるのが便利。
$html->addCrumb()の第2引数(URL)を省略すると、リンクでないただのテキストとして表示されるようだ。
なのでelementにするならURLを省略できるようにすると便利。
<?php
foreach ($crumbs as $crumb) {
$crumb = am(array('url' => null, 'options' => null), $crumb);
$html->addCrumb($crumb['title'], $crumb['url'], $crumb['options']);
}
echo '<div class="crumbs">';
echo $html->getCrumbs(' > ', 'トップ');
echo "</div>\n";
参考:API for CakePHP : The PHP Rapid Development Framework :: version 1.2.x.x
tags: bread-crumb, cakephp, helper, php, topic-path 0 コメント
PHPで簡単にタグクラウドを生成するPEAR::HTML_TagCloudを試してみた
PEAR :: Manual :: HTML_TagCloud
これは簡単。とても簡単。便利。
タグを追加してbuildするだけ => PEAR :: Manual :: 導入
デフォルトだとタグの色がグレー等になるようなので、サイトに合わせて色を変えた方が良さそう。
普通のリンクの色(デフォルト 青、visited 紫、active 赤)にしたい場合はこんな感じ。
CSS
div.tagcloud a{PHP
/* 下線は消した方がタグクラウドっぽい */
text-decoration: none;
}
<?php
$tags = array(.....); //ここにタグと件数が入っているとする
require_once('HTML/TagCloud.php');
$cloud = new HTML_TagCloud();
foreach ($tags as $tag => $count) {
//経過時間をセットしない場合の例
$cloud->addElement($tag, '/tag/' . urlencode($tag), $count);
}
echo $cloud->buildHTML(); //HTMLのみ出力する
携帯サイトをGoogle Analyticsでアクセス解析する方法
(2009/12/28追記:Google Analyticsで公式に携帯サイトをアクセス解析できるようになった → Google Analyticsで携帯からのアクセスを解析する方法 (公式Beta版))
Google Analyticsの利用規約上、問題ないのだろうか?
大元?:Linklove » Google Analytics without javascript!
HTTP Headerをいじった改良版:モバイルサイトで Google Analytics
(Webページのタイトルも送信する方法はコメント欄の下の方に書いてある。)
さらに微調整して関数化した改良版:モバイル(携帯サイト)でアクセス解析にGoogle Analyticsを使う方法 - Knowledge Database IT
(ただしSmarty用なので、Smartyを使わない場合は$var_refererには普通にリファラをセットする。)
Google Analyticsのコードには「UA-xxxxxx-x」形式でコードをセットする。
「ドメイン」にスキームは付ける?
求む体験談!
2008年10月30日木曜日
PHPのスクレイピングツールSnoopyにOSコマンドインジェクションの脆弱性
JVN#20502807: Snoopy における OS コマンドインジェクションの脆弱性
脆弱性を解消したバージョン1.2.4がリリースされている。
ver.1.2.3
$safer_URI = strtr( $URI, "\"", " " ); // strip quotes from the URI to avoid shell access↓
exec($this->curl_path." -D \"$headerfile\"".$cmdline_params." \"".$safer_URI."\"",$results,$return);
ver.1.2.4
exec($this->curl_path." -k -D \"$headerfile\"".$cmdline_params." \"".escapeshellcmd($URI)."\"",$results,$return);
影響があるのは、ユーザーが任意のURIを入力できる場合で、httpsスキームで始まり不正な文字を含むURIを入力された場合。(ダブルクォートのみは1.2.3でもエスケープされる。)
httpスキームの場合はこの関数(_httpsrequest())を通らないので影響無し。(httpの場合はcURLを使わずにsocketを開いてガリガリ書いている。)
ところでescapeshellcmd()でエスケープしているが、escapeshellarg()じゃなくていいんだろうか?
また、スクレイピングライブラリのhtmlSQLはSnoopyを内部的に使っているが、htmlSQLはhttpスキームのみを受け付けているので影響無し。(改造していない限りは。)
PCで携帯向けのWeb開発をするためのメモ
とりあえずメモ書き。整理できると良い。
モバイル検索結果をPCで見る
- Googleモバイル検索
- Googleモバイル検索
- 携帯でも同じURL(www.google.co.jp/m OR google.jp/m)で使える
- URL例: http://www.google.co.jp/m?q=[URLエンコードした検索文字列]
- URLエンコーディングはたぶんUTF-8で
- Yahoo!モバイル
- Yahoo!モバイル検索の結果をキャリア別に表示
- 検索結果から、そのまま携帯ブラウザのシミュレータでの閲覧ができる
シミュレーター(× シュミレーター)
- Firefoxのアドオン
- http headerをいじったりできる
- 表示幅を携帯電話機種に合わせたサイズにできる
- ウノウラボ Unoh Labs: Ext JSをUIに使って携帯サイトのシミュレータを作ってみた
- PHPでサーバサイドで処理する
- Request/Responseの詳細などが見やすそう
- インストールが少し面倒そう
- CodeRepos::Share – Trac
- Rubyでサーバサイドで処理する
- Yahoo!モバイル
- 検索結果から、そのまま携帯ブラウザのシミュレータでの閲覧ができる
- 外部に公開していないWebページは見られない
- Yahoo!の検索エンジンが携帯サイトとしてインデックスしていないページも見られない
PCサイトを携帯用に変換するサービス
- Google Wireless Transcoder
- PCからも見られる
- 画像有無を選択できる
- 画像あり: http://www.google.co.jp/gwt/n?u=[URLエンコードしたhttpから始まるURL]
- 画像無し: http://www.google.co.jp/gwt/n?u=[URLエンコードしたhttpから始まるURL]&_gwt_noimg=1
- URLエンコーディングはたぶんUTF-8で
- 携帯用のページが指定されている場合はそのページにリダイレクトされる
(参考:携帯電話での表示用にウェブ ページが調整される仕組みを教えてください。 - ウェブマスター向けヘルプ センター)
その他
- 無料アクセス解析 with 位置情報 「なかのひと」
- 携帯用の「うごくひと」が便利
- アクセスしてきた端末のキャリアのシェアや画面サイズの統計などが分かる
- 表示ページやリンク元などの統計は無い
- floatingdays : 携帯電話関連の日本製Apacheモジュール
- MobilePictogramConverter 絵文字変換ライブラリ
- PHP高機能日本語メール送信ライブラリ・文字化けフリー - Qdmail - PHP::Mail Library , Quick and Detailed for Multibyte
- (2008/1/12 追記)今見ているWebページのURLをQRコードで表示する - GreaseMonkey版 QR This! [ゼロと無限の間に:Sandbox]
- PCで見ているページを携帯で見たい時に一番手軽に見られる
参考資料
- 携帯サイトのDOCTYPEについてもう一度考えてみる。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-
- ケータイサイトを作る時にやっていること。 - ぎじゅっやさん
- 世界四季報: [3キャリア対応携帯サイト]XHTMLテンプレート
- 参考になるリンクが多く、Updateされている
Scala調査メモ
Javaから離れて久しいが、最近Scalaが気になる。
- Scalaとは
- Scalaを使ったWebフレームワーク
- Lift
- Scala関連では一番メジャー
- セットアップにMavenが必要
- Jettyと相性が良いらしい
- 参考
- Web Flavor
- とてもシンプルで良さそう
- Tomcat上で動く(Jettyでも動く?)
- 「XMLリテラルで気軽に(X)HTML/XML出力」が面白い
- Blog:航海日誌
感想:
- 文法が面白い。ループとか。
- XMLを練り込めるのが面白い。
- 特にレンタルサーバの場合など、PHPほど気軽に使えなさそう。
- Apacheのモジュールで動けば気軽に使えるのだが...
2008年10月25日土曜日
Goolge Docsから Bloggerへの投稿でエントリーのタイトルが登録可能になった
中途半端な感じだったGoolge DocsからBloggerへの投稿がだいぶ改善された。
1. Docsで付けたタイトルがそのままエントリーのタイトルとして登録されるようになった。(今までは登録後にわざわざタイトルをコピーして更新していた。)
2. 改行等が反映されない不具合が解消された(気がする)。(今まではDocsからの登録後、Docs側で1回再登録していた。)
その代わり、なぜか本文の先頭に10行くらいの空行が入るようになった。
なぜ?
tags: blogger, google-docs 0 コメント
携帯電話関連の日本製Apacheモジュール
携帯サイトの場合、キャリア・機種によって絵文字の出力、表示可能データ量、画面の大きさなどが異なる為、キャリア・機種判別、絵文字の出し分け等、携帯サイト向けの知識が不可欠です。参考:
mod_ktaiを使用すると、それらの処理を簡単に行なうことが可能です。
ke-tai.org > Blog Archive > ゆめみのmod_ktaiがとうとうリリース、しかも無償利用が可能
オープンソース研究室: mod_ktaiを試してみました
mod_chxj
国内の主要携帯(3キャリア)向けコンテンツ変換ミドルウェアをApache2.x用のモジュールとして作成します。参考:ke-tai.org > Blog Archive > 携帯向け自動変換用Apacheモジュール「mod_chxj」が0.10系にバージョンアップ
CHTMLや通常のHTMLで作成したコンテンツを出力時にUserAgentを見てそれぞれの端末用に変換します(画像はJPG、GIF、PNGからJPG、GIF、PNG、BMPへ)。
QRコード生成機能付。
mod_cidr_lookup
mod_cidr_lookupは、アクセスしてきたクライアントのIPアドレスが、起動時に読み込んでおいたCIDRブロック群のいずれかにマッチするかどうかを判別するためのモジュールです。参考:DSAS開発者の部屋:ケータイやクローラの判別などに使えるmod_cidr_lookupを公開しました
Googleによる自然言語解析検索の実例に関する考察
動的URLへの検索エンジンの対応 『GoogleとYahooの違い』 : 実例 : リアルSEOで、検索されたキーワードの実例として「東京上野駅近く女性一人でも気軽も入れる店」って...。
もう少し精度が高まれば、PowersetのやりたいことはGoogleが実現しそうな勢いだ。
関係ないが、TechCrounchでもそうだが、サイト内にある検索機能より、Google検索の方が対象が広く、かつ表記の揺れに強くて使いやすい。
Googleモバイル検索に携帯サイトとして表示される方法
結果として、下記のようなサイトでGoogleモバイル検索に携帯サイトとしてインデックスされた。
ただし、これが最良の方法とは思えない。これ以外の方法もたくさんあるだろう。
文字コード
Shift_JISでOK。
マークアップ(HTML)
DOCTYPE無しのCHTMLでOK。
XHTMLは試してないが、DOCTYPEは気を付けた方が良さそう。
(GoogleはXHTML Basicを推奨しているが、他のフォーマットでも問題無し?
参考:携帯サイトのDOCTYPEについてもう一度考えてみる。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-)
MIME-Type
CHTMLなら text/htmlでOK。
XHTMLは試してないが、application/xhtml+xmlらしい。
URL振り分け
無し。PCと携帯で同じURLで、表示内容は別にしている。
ただしNokiaは対応(携帯向け表示)している場合も対応していない(PC向け表示)場合もあり。(両方ともインデックスされた。)
本来はPCと携帯は別のURLにすべき?
IP制限(携帯用IPのみ閲覧を許す)
していない。
半角カタカナ
英数字とカタカナはほとんど半角に変換して表示している。
絵文字
使っていない。
ページのファイルサイズ
携帯向けに小さくしてくる。
Sitemap
Googleにモバイルサイトマップを登録した場合も、登録しない場合(ただしPC用サイトマップは登録済み)も、両方インデックスされた。
Googleモバイル検索にインデックスされているかどうかは、携帯版Google検索で"site:example.com"で検索すれば分かる。
Yahoo!モバイル検索はYahoo!モバイルで同様に調べられる。
Yahoo!モバイル検索ではau向けは問題ないが、docomoとSoftBank向けで、インデックスされていたりされていなかったり...。
参考(今後改善するための参考として):
携帯サイトのDOCTYPEについてもう一度考えてみる。 携帯ホームページを作ろう! -ちょっと詳しいモバイルサイトの作り方-
モバイル検索エンジンのインデックス対策 - 携帯SEO・ケータイ検索エンジン最適化 - ププアブログ
Googleモバイル(googlebot-mobile)にインデックスさせる - 携帯検索エンジンSEO - ププアブログ
2008年10月13日月曜日
郵便番号検索APIのまとめ
無償のもののみピックアップ。
住所からの検索ができるものが意外に少ない。
- 郵便番号検索API
- リンクウェア
- レスポンスはXML or CSV
- 5桁の郵便番号での検索もできるらしい
- グルーブテクノロジー株式会社 - Web サービス:郵便番号検索API
- 要クレジット表示
- レスポンスはXML or JSON or PHP(シリアライズド?)
- JSONPに対応
- 前方一致で検索
- 住所からの検索も可能
- クジラ 郵便番号 API
- レスポンスはXML
- 全国郵便番号一覧 | 郵便専門ネットのWEBサービスAPI
- プロトコルはXML-RPC
- 郵便番号から緯度経度を取得できるらしい
- APIでご提供する郵便番号検索
- レスポンスは住所の文字列
- キクミミ研究棟 / 郵便番号検索 API for FileMaker
- 実験中らしいので、データの更新は少なそうだ
- 郵便番号検索 CSV XML Webサービス API :: ライムネット(株)
- 商用利用の場合は別途契約が必要
- レスポンスはCSV or XML
(2011/07/21 追記)
今ならGoogle日本語入力のAPI(Google CGI API for Japanese Input)を使うという手もある。
参考:floatingdays: Web form用入力ヘルパー JavaScriptライブラリいろいろ
サンプル:GAddress Finder 動作サンプル - ゼロと無限の間に
tags: api, postal, web-service, zip 0 コメント
2008年10月3日金曜日
Windows用のフリーのバックアップツール × 3
個人的には、BunBackupが見た目が分かりやすくて使いやすい。
- BunBackup
- シンプルで分かりやすいGUI
- パソコンに詳しくなくても使えそう
- ミラーリングも可能(デフォルトでは非表示メニューになっている)
- コマンドラインからの実行も可能 (参考:BunBackup FAQ)
"BunBackupへのパスBunBackup" /AUTO:"BunBackup設定ファイル(*.lbk)へのパス"
- FastCopy
- 「Windows系最速(?)のファイルコピー&削除ツール」
- 一般の人には最初は少し分かり辛いかも
- 右クリック時に表示されるメニューからFastCopyを呼び出せるのが便利そう
- 常駐させて同期させるなら便利そう
- コマンドラインオプションは豊富
- Fire File Copy
- 「ファイルのコピーや移動を「高速に、しかもガリガリという音を立てずに行おう」という、ちょっと珍しい(?)ツール」
- 大容量のファイルコピーに向いている?
- コマンドラインオプションは一番多そう(参考:コマンドラインオプション)
Flickr services (Flickr API)で写真検索
写真検索のマニュアルはFlickr Services: Flickr API: flickr.photos.search。
必須のパラメータは api_key。
キーワード的なものでの検索のパラメータは text。
sortは、
- デフォルトは date-posted-desc
- ただし radial geo query の場合は指定したポイントからの ascending distance
- 指定可能な値
- date-posted-asc
- date-posted-desc
- date-taken-asc
- date-taken-desc
- interestingness-desc = 人気の高い順
- interestingness-asc
licenseで指定する値は、Flickr Services: Flickr API: flickr.photos.licenses.getInfoのExample Response欄を参照。
PHPなら、Serialized PHP Response Formatでの取得が一番手軽そう。
CakePHP初心者のための Tips (CakePHP 1.2)
自分用のメモ。
本家のマニュアル:The Cookbook :: 1.2 Collection :: マニュアル
URLでパラメータを受取る
AppControllerの記述例
<?php
class AppController extends Controller {
public $components = array('foo');
}
AppControllerは、CAKE_HOME/app/app_controller.php に置く。
DBを使わない場合の設定
方法1. Controllerに「public $uses = null;」を書く (参考:CakePHP データベースを使わないアプリケーション | Shin x blog)
方法2. Modelに「public $useTable = false;」を書く (参考:CakePHP Modelに関する6つの誤解 | Shin x blog)
全ModelでDBを使わないなら、Super Class(Super Model?)のAppModelで「public $useTable = false;」すればOK。 (参考:CakePHP データベースを使わないアプリケーション | Shin x blog)
- (2008/11/25追記)こちらも参考に:CakePHP without database access. Webservices only - CakePHP | Google グループ
Controllerでのset()を一度で済ます
ControllerからViewにデータを渡す方法
Controllerでは「$this->set('foo', 'value');」する。すると、Viewでは「echo $foo;」で"value"が出力される。
参考:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発 :: コントローラー :: コントローラのメソッド :: ビューとの連携 :: set
set()したデータは、Controller->data['foo'] に入っている
Pagesコントローラについて
レイアウト用のファイル
レイアウト用のファイルは、CAKE_HOME/app/views/layoutsディレクトリに置く (参考:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発 :: ビュー :: レイアウト)
デフォルトで使うレイアウトのファイル名は「default.ctp」
レイアウトファイルが無い場合、CAKE_HOME/cake/libs/views/layouts/default.ctpが使われる
レイアウトについての説明:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発 :: ビュー :: レイアウト
エレメント
Viewの共通部品はエレメントという
エレメントはCAKE_HOME/app/views/elementsディレクトリに、拡張子「.ctp」を付けて配置する
エレメント名を指定して出力すればOK。拡張子は付けなくてよい
echo $this->element('foo');
参考:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発 :: ビュー :: エレメント
FormHelperの使い方
FormHelperはCakePHP 1.2から登場した
参考:The Cookbook :: 1.2 Collection :: The Manual :: Core Helpers :: Form
特定のページでしか使わないCSSやJavaScript
layoutでこれらを出力する場所に「echo $scripts_for_layout;」する。
HTML部分を書いた後でもCSS等を指定できるのは便利。
CSSとJavaScriptを別の場所に出力はできなそう。
//link to webroot/css/foo.css
$this->addScript($html->css('foo'));
//include webroot/js/bar.js
$this->addScript($javascript->link('bar'));
//write Code Block of JavaScript
$this->addScript($javascript->codeBlock("alert('Hello! CakePHP.');"));
翻訳(GetTextの使い方)
2008年9月20日土曜日
CakePHP 1.2で WebService APIを利用する
Webで公開されているAPIからデータを取得したりデータを送信するBehaviorがBakeryで公開されている。
Webservice Behavior (Articles) | The Bakery, Everything CakePHP
HTTP GET、HTTP POST、XMLRPCが使えるようだ。
GETしたいだけならオーバースペックかも。
POSTもcURLを使わずに、PHPでPOSTリクエストを送信する - PHPプロ!ニュースの方がシンプルでいいかも?
参考:CakePHP1.2のBehaviorを使う - 院生エンジニアのにっき
2008年9月19日金曜日
RSS/Atomフィードを生成したりSitemapを作成するPHPライブラリ
P2_Feeder2
(Google独自の)携帯向けサイトマップであるモバイル・サイトマップに対応してるけど、まだBeta版。
Updateが止まっていてAtom1.0に対応していないFeedCreatorの代わりになるか?
2008年9月16日火曜日
CakePHP 1.2 のFormHelperで日付選択リストを作る
$form->datetime()を使うと、年月日(または年月日+時間)を選ぶselect要素が簡単に作れる。
echo $form->datetime('cal', 'MDY', 'NONE'); // => Septemper-1-2008
//第3引数をNONE以外すると、時間の選択リストも表示される。(デフォルトは"12")
echo $form->datetime('cal', 'MDY', 24);
オプションとしてarray('monthNames' => false)を渡すと、月の表示が数字になる
echo $form->datetime('cal', 'YMD', 'NONE', null, array('monthNames' => false)); // => 2008-01-1
「日」がゼロ埋めなしなのに「月」だけゼロ埋めされているのが嫌な場合は、あらかじめ$form->month or $form->dayにデータをセットしておく。(参考:CakePHP FormHelper#datetime()で年月日表示を変える | Shin x blog)
array_combineを使ったのはoption要素のvalue属性を表示値と同じにするため。
$form->options['month'] = array_combine(range(1, 12), range(1, 12));
echo $form->datetime('cal', 'YMD', 'NONE'); // => 2008-1-1
デフォルトでは年が現在から前後20年ずつ、大きい順に表示されて煩わしい。
今年と来年を小さい順に表示するにはこんな感じ。
$years = range(date('Y'), date('Y') + 1);
$form->options['year'] = array_combine($years, $years);
echo $form->datetime('cal', 'YMD', 'NONE');
Flashでページをめくるライブラリで逆方向にめくる方法
Flashでページをめくるライブラリで、日本の縦書きの本のようにページを左から右へめくるようにする方法。
Page Flip by PiXELWiTの場合
- Actionsレイヤー フレーム2の「gotoAndPlay(4)」を変更し、最初に表示したいページのフレームに行くようにする
(全部で8ページの場合は「gotoAndPlay(13)」) - シンボルBound PagesのActionsレイヤー フレーム1の冒頭にある変数dir, flipPage, curPageの初期値を変更する
- dirは-1にする
- flipPageは表示しているページとその裏のページを足して2で割った値にする
(全部で8ページの場合は7.5) - curPageは表示しているページとその右側のページを足して2で割った値にする
(全部で8ページの場合は8.5)
Free PageFlip 2.25 by Iparigrafikaの場合
- Actionsレイヤー フレーム5の50行目あたりでセットしている変数「directlink」の値を最初に表示したいページ番号にする
または、
directlinkに関する記述(51~53行目)を削除してしまい、直接変数「page」にページ番号をセットしてもOK - 要は、初期処理で変数「page」にセットされたページを最初に表示するようになっているようだ
tags: actionscript, flash, ui 7 コメント
2008年9月15日月曜日
検索エンジンによる自分のサイトのインデックス状況やSitemapを管理するまとめ
Google:Google ウェブマスター ツール - マイレポート
- サイトマップはモバイル・動画・ニュースなどいろいろ受け付けている
- iGoogleガジェットもここから取得できる
日本のYahoo!:サイトエクスプローラー(サイト管理者向けツール) - Yahoo!検索
- モバイル向けのフィード・サイトマップは受け付けていない
世界のYahoo!:Yahoo! Site Explorer
- モバイル向けのフィード・サイトマップも登録可能(xhtml or wml)
- Yahoo! JapanではなくYahoo.comのアカウントが必要
CakePHP 1.2 で多国語対応(GetText)調査メモ
PHPでは _() または gettext() でgettextできるが、CakePHPではそれをラップして __() でgettextできる。
//PHPの例CakePHPではCakeコンソールからi18nできて便利そう。
echo _('We love PHP');
//CakePHPの例
__('You love CakePHP'); //第2引数でtrueを指定すればechoせずに戻り値を返すこともできる
CakePHPでのgettextについては、CakePHP 1.2 の多言語対応メモ - miau's blog?が、参考サイトへのリンクも多く、よくまとまっていて参考になる。
あとはひっかかりそうなところについてのメモ。
複数形
英語など単数と複数でメッセージが変わる場合、__n() を使う。
//例詳しくは、1.2系の多言語対応メモ(2) - Writing Some Codeを参照。
__n('cat', 'cats', $catCount);
echo __n('mouse', 'mice', $mouseCount, true); //第4引数は戻り値を返すかどうか
Rubyよりも使いやすいと思う。
(2008/09/17 追記)
__n()の第3引数は、シンプルな変数でないと機能しないようだ。sprintfとかの関係だろうか?
//NG(追記終わり)
__n('cat', 'cats', $cat['count']);
//OK
$count = $cat['count'];
__n('cat', 'cats', $count);
言語によってメッセージ内のパラメータの順番が違う場合
翻訳メッセージの複数個所に穴埋めで項目名などを入れる場合で、言語によって順番が違う場合の対応方法。
1.2系の多言語対応メモ(3) - Writing Some Codeの後半を参照。
avast! 4 Home Editionの便利な使い方
「ご家庭 での 非営利使用 にのみ無料」なavast! 4 Home Editionを使うためのメモ。
本家:
無料アンチウイルス - avast! 4 Home Edition ダウンロード
スクリーンセーバー起動時にバックグラウンドでウィルスチェックを行う方法:
avast! 4 Home Edition - Online soft
定期的にウィルスチェックを行う方法:
- 下記内容を書いたバッチファイルを、Windowsの「タスク」で定期的に実行する
(ashQucik.exeへのパスは環境に合わせて変更する。下記は「C:Program FilesAlwil Software」ディレクトリにバッチファイルを置く場合。)@echo off
rem メモリ内をチェックする場合
Avast4ashQuick "*MEMORY"
rem チェックしたいドライブを全て指定する
Avast4ashQuick "C:" "D:" - 途中でウィルス等が見つかると止まっちゃうかも
- 参考:おじいちゃんのメモ - おじいちゃんのメモ-特殊な検査方法
tags: anti-virus, avast, free, windows 0 コメント
2008年9月6日土曜日
CakePHP1.2の layoutで使える Helperのまとめ
head要素内に記述する要素など、layoutに書く要素のうちHelperで作成できるもののまとめ。
- ドキュメント宣言 (参考:HtmlHelper::docType)
//引数なしの場合はXHTML1.0 Strict
echo $html->docType(); - Content-Typeのmetaタグ (参考:HtmlHelper::charset)※2008/09/13 誤り修正
//デフォルトはPHPのdefault_charset???
echo $html->charset(); - CSS (参考:HtmlHelper::css)
複数ある場合は配列で渡せる。//webroot/css/foo.cssを読み込む場合
echo $html->css('foo');
//webroot/css/foo.cssとwebroot/css/bar.cssの2つを読み込む場合
echo $html->css(array('foo', 'bar')); - JavaScript (参考:JavascriptHelper::link)
これも配列で渡せる。//webroot/js/foo.jsを読み込む場合
echo $javascript->link('foo');
//webroot/js/foo.jsとwebroot/js/bar.jsの2つを読み込む場合
echo $javascript->link(array('foo', 'bar'));
JavascriptHelperを使う場合、ControllerでこのHelperを有効にしておく。(「s」が小文字なので注意!)var $helpers = array('Html', 'Javascript');
- その他、$html->meta('xxx')で作成できるもの (参考:HtmlHelper::meta)
- RSS ('rss')
- Atomフィード ('atom')
- favicon ('icon')
- デフォルトはwebroot/favicon.ico
- metaタグのkeyword('keyword')
- metaタグのdescription ('description')
YUI Girdsを使うならこんな感じになる。
<<?php ?>?xml version="1.0" encoding="<?php echo ini_get('default_charset'); ?>" ?>
<?php echo $html->docType(); ?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<?php echo $html->charset(); ?>
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title><?php echo $title_for_layout; ?></title>
<?php
echo $html->meta('icon', '/favicon.ico'); //サイト全体で共通のfaviconを使う場合
echo $html->css(array('foo', 'bar'));
echo $javascript->link(array('foo', 'bar'));
echo $scripts_for_layout;
?>
</head>
<body>
<div id="doc2" class="yui-t7">
<div id="hd">
ここにヘッダーを書く
</div><!-- #hd -->
<div id="bd"><div class="yui-g"><?php echo $content_for_layout; ?></div></div>
<div id="ft">
ここにフッターを書く
</div><!-- #ft -->
</div><!-- #doc/[2-4]?/ -->
</body>
</html>
少しくらいCSSやJavaScriptを書くだけなら、わざわざHelperを使わずに直接書いた方がいいかも。
JavaScriptは</body>の直前に書きたいが、これでは無理か...?
CakePHPで特殊な用途に使われるテーブルのフィールド名
- id:通常は、Railsと同様に一意になるAuto IncrementなIntegerにする。
ただし、CHAR(36)として作ると自動的に32バイトの「データベースを超えたレベルで」ユニークな文字列が登録される。 - title:Lists等で自動的に使われる文字列になるらしい。
- name:titleと同じ扱い。titleとnameが両方ある場合はtitleが優先される。
- created:登録日時。created_atでないので注意
- modified:更新日時。Railsと同様、timestamp型ではなくdatetime型にする
- updated:modifiedと同じ扱い。こっちの方がしっくりくるのに
CakePHP 1.2で bakeするメモ
CakePHP1.2では、bakeはこんな感じで実行できる。
cake bake
cakeコマンドはCAKE_HOME/cake/consoleディレクトリにあるが、
cake -app /path/to/app bake
bakeでのModelの作成はDBのテーブルを元にするので、DBにテーブルが1つも無いと怒られる。
テーブルを作ってからbakeすること。
Welcome to CakePHP v1.2.0.7296 RC2 Console
---------------------------------------------------------------
App : app
Path: CAKE_HOME/app
---------------------------------------------------------------
Interactive Bake Shell
---------------------------------------------------------------
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[Q]uit
What would you like to Bake? (D/M/V/C/P/Q)
> M
---------------------------------------------------------------
Bake Model
Path: CAKE_HOME/app/models/
---------------------------------------------------------------
Error: Your database does not have any tables.
bakeでModelを作るとオプションでvalidationも付けられる。
が、maxLengthなど値を指定するルールをbakeでどうやって指定するかわからない。
CakePHP1.2インストールメモ
CakePHPアプリケーションへのアクセスを http://example.com/cake とする場合のインストール手順のメモ。
(参考:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発)
- ダウンロード
- CakePHPのサイトからアーカイブをダウンロード
- アーカイブを適当な場所(以下CAKE_HOMEと呼ぶ)に解凍
- Apacheの設定
- mod_rewriteは使えるようにしておく
- Alias設定で、CAKE_HOME/app/webrootにアクセスできるようにする
Alias /cake CAKE_HOME/app/webroot
- Directoryごとの設定で、CAKE_HOME/app/webrootへのアクセスを許可する。
AllowOverrideも変更して.htaccessが使えるようにする。(CakePHPのマニュアルではAllにするようなことが書かれているが、mod_rewriteの設定だけならFileInfoで良さそう)<Directory CAKE_HOME/app/webroot>
Order allow,deny
Allow from all
AllowOverride FileInfo
</Directory> - 今回のようにアプリケーションのルートURLをサブディレクトリにする場合、そのままでは404 Bad Requestになってしまうので注意。
CAKE_HOME/app/webrootにある.htaccessにRewriteBaseを追加すればOK。(参考:siwa32.com » CakePHPをはじめる6 サブディレクトリ運用まとめ)<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /cake
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule> - 動作確認
- http://example.com/cake/ にアクセスして、CakePHPが動作することを確認
- DB接続の設定(参考:The Cookbook :: 1.2 Collection :: マニュアル :: CakePHPによる開発 :: 環境設定 :: データベースの設定)
(※これはbakeを使っても設定できる) - CAKE_PHP/app/configにあるdatabase.php.defaultをコピーしてdatabase.phpというファイルを作る
- database.phpを編集
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'USER_NAME', //DBユーザー名
'password' => 'PASSWORD', //DBのパスワード
'database' => 'cake', //DB名
'encoding' => 'utf8', //MySQLで日本語を扱うため
); - 編集してから http://example.com/cake/ にアクセスすると、DB関連のメッセージのメッセージがGREENになる
楽天アフィリエイトのPC用 URLと 携帯用URLとの違い
楽天アフィリエイトのPC用URLと携帯用URLの関連性について。公式な資料が無いので推測を元に調査してみる。
楽天Webサービスでの説明を見ると、PC用と携帯用のアフィリエイトURLは別になっている。
http://hb.afl.rakuten.co.jp/hgc/[アフィリエイトID]/?pc=[商品URL(PC)]ちなみに、楽天Webサービスで商品URLを取得する場合にはRequestのパラメータとしてPC用か携帯用かどちらかを指定するため、両方の商品URLを1度に取得することはできない。
もしくは、
http://hb.afl.rakuten.co.jp/hgc/[アフィリエイトID]/?m=[商品URL(モバイル)]
楽天のアフィリエイト作成ツールでは、PC・携帯共通URLを作成できる。
例(分かりやすいようにURLデコード&改行してある)
http://hb.afl.rakuten.co.jp/hgc/[アフィリエイトID]/?
pc=http://www.rakuten.co.jp/verjus/827100/665544/705842/#845704
&m=http://m.rakuten.co.jp/verjus/i/845704/
これを見るとPC用URLから携帯用URLを作成できそうだが、楽天の商品URLには下記の2種類のタイプがある。
A. http://item.rakuten.co.jp/monoshop/dul_ch06_k282/Aが昔ながらのURL?
B. http://www.rakuten.co.jp/t-plaza/710008/716540/#727421
Bは携帯からも見られる商品用のURL?
いくつかデータを見てみると、Bの場合は色違いなどで複数の商品から選べるアイテムのようだ。この例の場合、"710008" "716540"の2種類。4種類くらいのアイテムもあり、その場合スラッシュ区切りで4つのコードが並ぶ。おそらく最後のシャープ付のIDで内部的には制御してるようだ。
さらに調べると、携帯版の楽天とPC向けの楽天では商品数がかなり違う。PCの方が数倍多い。
しかも、携帯版の楽天はドメインがwww.rakuten.co.jpのアイテムのみが対象になってる(ような気がする)。(数えるほどしか調べてないのでたまたまそういうデータを見ただけかもしれないが。)
よく見たらwwwで始まりPCでしかヒットしない商品は全て品切れだった。たくさんのデータで検証したわけではないが、このサブドメインの違いで携帯からのアクセスが可能か判断できそう。
結論(ただし推測)
サブドメインがwwwの商品のみ、携帯版楽天からアクセスできる。その場合、下記のアフィリエイトURLによりPC・携帯で共通のアフィリエイトリンクになる。
(見やすくするために改行したが実際には改行しない。また、パラメータのURL部分はURLエンコードすること)
http://hb.afl.rakuten.co.jp/hgc/[アフィリエイトID]/?モバイル用の"i"の部分とかは怪しいかも。
pc=http://www.rakuten.co.jp/[ショップID]/.../.../.../#[商品ID的なもの]
&m=http://m.rakuten.co.jp/[ショップID]/i/[商品ID的なもの]/
2008年9月3日水曜日
Google Chrome
Google Chrome触ってみた。速い速い。昔のOperaを思い出す。それ以上に速い。
JavaScriptコンソールやHTML解析っぽいのもデフォルトで付いてる。
アプリケーションショートカットもなかなか面白い。htaみたい。社内向けシステムとかで余計な上部メニューを消したい場合なんかにもいいかも。
これでExtensionとは言わないまでもGreaseMonkey(CreamMoneky?)くらいあれば乗り換えるかも...。せめてGoogle Customize相当のものがあればなあ。
tags: chrome, google, web-browser 0 コメント
2008年9月1日月曜日
Google Reader Filterで日本語のキーワードを扱う方法
Google Readerで指定したキーワードを含む記事をグレイアウトしたりハイライトしたりするGreaseMonkeyの「Google Reader Filter」。(そのまんまな名前だ。)
日本語が 使えないという指摘があるが、実際には使える。
ただし、キーワードの前後が半角スペースか先頭か末尾でないとヒットしない。
これは日本語に限った話ではないが、単語単位で半角スペースが入る英語では問題が無いため、日本語の問題に見えたのだろう。
具体的なコードの該当箇所は下記のとおり。
_getRegExp:function (items) {JavaScriptと正規表現が読める人には察しが付くだろうが、キーワードをorで繋いで、前に「先頭or半角スペース」、後ろに「末尾or半角スペース」という条件でマッチさせている。
return new RegExp("(^| )("+items.join("|")+")($| )","i");
}
なので、日本語をキーワードに使うには、キーワード欄に
.*あああ.* (「あああ」を含むタイトルをマッチ)というように書けばOK。
いいい.* (「いいい」で始まるタイトルをマッチ)
.*ううう (「ううう」で終わるタイトルをマッチ)
キーワードは正規表現として使われるので、他の正規表現を埋め込んじゃってもOK。
逆に正規表現で特別な意味を持つ記号はエスケープしないと正しく動かない。
上記のような書き方が面倒な人は、GreaseMonkeyのファイルを開いて該当箇所を下記のように変更すれば「.*」の記述が不要になる。
キーワードの使い方によっては幅広くヒットしすぎて使い辛そうだが。
_getRegExp:function (items) {
return new RegExp("("+items.join("|")+")","i");
}
tags: feed, filter, firefox, google, greasemonkey, javascript, reader, regexp 0 コメント
2008年8月28日木曜日
MySQLをオンラインでバックアップ
MySQL5.0以降の話。(MySQL 4.1 リファレンスマニュアルには記述が無いが、MySQL 5.0 Reference Manualには記述があるので。)
InnoDBではテーブルのロック("--lock-all-tables" 省略形は-x)をせずにmysqldumpでオンラインバックアップができるらしい。
参考:MySQL AB :: MySQL 5.1 リファレンスマニュアル :: 7.12 mysqldump — データベースバックアッププログラム(ページの一番下の方)
使用例
mysqldump -u USER_NAME -pPASSOWRD -A --single-transaction > /path/to/backup/dir/mysqldump.sql
"-p"とパスワードの間にはスペースを入れない。
"-A"は"--all-databases"の省略形。
"--single-transaction"は
--single-transaction
このオプションはサーバからデータをダンプする前にBEGIN SQLステートメントを発行します。InnoDBといったトランザクションテーブルに対してのみ便利です。なぜなら、アプリケーションをブロックせずに、BEGINが発行された当時のデータベースの状態をダンプするからです。
このオプションを使用しているときは、一定の状態でダンプされるのはInnoDBテーブルのみだということを留意してください。例えば、このオプションを使用中にダンプされたMyISAMやMEMORYテーブルは状態が変化する可能性があります。
mysqldumpの出力はSQL。データベース・テーブル等のCREATE文やデータのINSERT文等が書いてある。
そのままSQLを実行すればリストアできる(はず)。
mysqldumpを使ったバックアップ・リストアは、データ量が多い場合には時間がかかるらしいので注意。
2008年8月15日金曜日
PHPで出力する文字列をまとめて変換する
ob_start()を使うと、出力する文字列をまとめてfunctionに渡すことができる。
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
この関数は出力のバッファリングをオンにします。出力のバッファリングを有効にすると、(ヘッダ以外の) スクリプトからの出力は実際には行われず、代わりに内部バッファに保存されます。
$output_callbackにはコールバックするfunction名を文字列として指定する。
ob_end_flush()等をしなければ、バッファにたまった文字列はPHPスクリプトの終了時にコールバックのfunctionに渡される。
なので、出力全体を変換したい場合は明示的にob_end_flush()する必要はない。
コールバックのfunctionにはバッファにたまった文字列が渡される。
コールバックのfunctionが戻り値として文字列を返すと、その文字列が出力される。
//例なので、mb_output_handlerのように、文字列としてデータを受け取り戻り値も文字列の標準関数だと使いやすい。
ob_start('zenkaku2hankaku');
function zenkaku2hankaku($str) {
return mb_convert_kana($str, 'ask');
}
また、ob_start()は重ねて実行できる。
出力バッファはスタッカブルであり、このため、他の ob_start() がアクティブの間に ob_start() をコールすることが可能です。この場合、ob_end_flush() を適切な回数コールするようにしてください。複数の出力コールバック関数がアクティブの場合、ネストした順番で逐次連続的に出力がフィルタ処理されます。
2回以上ob_start()を実行した場合、ob_start()を実行した順と逆の順番にコールバックのfunctionが呼ばれる。
<?php
ob_start('test2');
ob_start('test1');
echo '1st';
function test1($s) {
return str_replace('1st', '2nd', $s);
}
function test2($s) {
return str_replace('2nd', '3rd', $s);
}
// => "3rd"が出力される
YUI Grid.css用の XHTML 1.0 テンプレート
YUI: CSS Grid Builderで作ったHTMLの冒頭部分をXHTML 1.0 Strictにしたもの。
横幅は950pxでカラム分割無し、文字コードはUTF-8の場合。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>TITLE</title>
<!-- Keywordsはもう要らないと思う
<meta name="Keywords" content="FOO,BAR" />
-->
<meta name="Description" content="DESCRIPTION" />
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
<link rel="stylesheet" type="text/css" href="some.css" />
<!-- フィードの記述は種類による -->
<link rel="alternate" type="application/rss+xml" title="FEED TITLE" href="http://www.example.com/feed.xml" />
<!-- スタイルシートは別ファイル化を推奨 -->
<style type="text/css"> /* ... */ </style> </head>
<body>
<!-- ここのidとclassは横幅等で変わる。YUI Grid Builderで調べるのが楽。 -->
<div id="doc2" class="yui-t7">
<div id="hd">
HEADER
</div><!-- #hd -->
<div id="bd">
<div class="yui-g">
MAIN
</div><!-- .yui-g -->
</div><!-- #bd -->
<div id="ft">
FOOTER
</div><!-- #ft -->
</div><!-- #doc/[2-4]?/ -->
<!-- charsetはhtml本体と同じなら不要 -->
<script type="text/javascript" src="some.js" charset="UTF-8"></script>
<!-- JavaScriptも別ファイル化を推奨 -->
<script type="text/javascript">
//<![CDATA[
...
//]>
</script>
</body>
</html>
2008/12/22 変更:JavaScriptのHTMLコメント化をCDATAに変更
htmlでボタンに表示する文字列を途中で改行する方法
htmlフォームのボタン系input要素はvalue属性の値をボタン上に表示するが、その表示する文字列を途中で改行する方法。 下記のように改行したい箇所に、改行コードの実体参照である「 」を入れる。
<input type="button" value="この後で 改行してね" />Windows版Safariでは、改行はするがボタンの高さが1行分なので半分見えなくなってしまった...。 もしかするとWindows以外では表示が崩れる?(改行コードも違うし。) 素直にbutton要素とか使った方がいいかも。
<button>この条件で<br />絞り込む</button>ただしbutton要素だと、submitボタンとかresetボタンを作るには
参考:
改行コード(HTML, Java, URL & エスケープシーケンス)
GAC なぜなにGAC->HTML
tags: button, html, javascript, safri 2 コメント
ホテル予約サイトの地図機能の比較
主に日本国内のホテル予約について。
- るるぶトラベル
- トップページのメイン部分にJavaScriptの日本地図。そこから詳細な地図にドリルダウンしていく
- スクロール地図を選ぶと、真ん中にMapionの地図がある構成になる
- 左側に絞込み条件、真ん中に地図、右側に地図範囲内のホテル一覧
- Mapionの地図上のピンをクリックすると、地図の下に簡単なホテル情報を表示する
- UIとしてよくできている
- 楽天トラベル
- 地図は独自の地図のドリルダウン
- フォートラベル
- 地図は独自地図のドリルダウン
- 日本旅行
- 国内宿泊予約では、ページ上部に地図・カレンダー・条件などの絞込みがあり、下側にホテル一覧がある
- 地図は独自のJavaScript
- 地図で地区を選ぶとリロードされ、メイン部分に範囲内のホテル一覧が表示される
- まっぷるnet
- 地図は独自のドリルダウン
- まっぷる 宿泊地図はAjaxな地図をメインにした機能
- 宿ぷらざ
- 地図は独自地図のドリルダウン
- yoyaQ.com
- 価格.com系
- 地図はGoogle Maps(都道府県の絞込みまではFlash)
- J-reserve
- 外国人向けの日本のホテルの予約サイト
- 地図は独自のドリルダウン(全国/地方の2段階)
- 東京ビジネスホテル予約.biz
- 地図とホテル一覧をAjaxで表示
- 地図はGoogle Maps
- 予約まではできない
2008年8月14日木曜日
Delicious Bookmarksからデータが消えて PCがフリーズする問題の解決方法(追記:解決した!)
FirefoxのアドオンにDelicious Bookmarksというものがある。ショートカットからDeliciousへのPOSTができたりBookmarkをツールバーに表示したりと非常に便利なのだが、バージョンが2.0.95に上がったら壊れてしまった。(ローカルデータが認識できなくなりSyncを繰り返す。CPU負荷も高く、PCが固まる。)
しばらくこのアドオンを無効にしていたが、先ほどこの問題の解決策を見つけた。
It seems that 2.0.95 causes some trouble, but after I delete delicious.rdf file in my firefox profile directory, it seems works well. This is suggested at the forum in yahoo group described above. Worth to try, I guess, if you in trouble.Firefoxのプロファイルにあるファイル「delicious.rdf」を削除したら直るとのこと。
試しにやってみたら、確かに直った気がする。しばらく様子を見てみよう。(※追記あり!)
しかしXolaさんも書いているとおり、"And of course we still need a fix release."
Fixした時に今回の解決策(delicious.rdfを2.0.95に合った形にした)のせいでまたインストールし直しとかにならなければよいが。
追記:しばらくしてFirefoxを再起動したら、またSyncし始めちゃったよー
追追記(2008/08/21):
Delicious Bookmarks のレビュー :: Firefox Add-onsの"Work-around for 2.0.95 problems"をやったら解決した。
1) Log out of delicious.
2) Uninstall delicious addon 2.0.95.
3) Quit firefox
4a) Delete this file for XP: C:\Documents and Settings\\Application Data\Mozilla\Firefox\Profiles\.default\delicious.rdf
or
4b) Delete this file for vista: C:\Users\\AppData\Roaming\Mozilla\Firefox\Profiles\.default\delicious.rdf
5) Restart firefox and install delicious addon version 2.0.64
2.0.64は2つ前のバージョン。1つ前までは試してみたが、2つ前まで戻さなくちゃいけないとは。
今のところこれで以前のように動いている。
Deliciousからの新バージョンについての反応がまだ無いところを見ると、よほど深刻な問題なのか?!
追追追記(2008/08/22): 1つのPCでは解決したが、1つのPCではフリーズっぽくなる...HELP!
tags: bookmarks, del.icio.us, extensions, firefox, trouble, version-up 0 コメント
2008年8月12日火曜日
2008年8月1日金曜日
del.icio.usが delicious.comに変わってた
普段、Firefoxのアドオン使ってるからdel.icio.usのサイトが変わってるのに気づかなかった。もうdel.icio.usではなく、deliciousなんだね。
機能的にはソートとかがちょっと増えたぐらい。レスポンスは早くなった気がしないでもない。
一番変わったのは見た目。とても見やすくなった。今まであまりにもテキスト表現に頼ってたのが良く分かる。やっぱり色とか線とかの表現力は大きい。
tags: del.icio.us 0 コメント
2008年7月30日水曜日
2008年7月28日月曜日
Amazon Webサービスのパラメータ
一番よく使う商品の検索(ItemSearch Operation)の主なパラメータについてのメモ。
大元のリファレンスはAmazon Web Services: Amazon E-Commerce Service。
フレームになっていてリンクし辛いので、説明ページへのリンクはフレーム内の個別ページへのリンクにした。
- Operation
- リクエストの種類。(必須項目)
- 固定で「ItemSearch」
- SearchIndex
- 商品の種類を決める。(必須項目)
- 説明ページ:Search Index Values
- 「Blended」にすればほとんどの商品が対象になる。(参考:ItemSearch Operation)
- Keywords
- 任意のキーワード
- タイトルや著者など多くのデータを対象に探してくれるので、アバウトな検索に便利。
- ItemPage
- 検索結果ページ数。ItemSearchでは1回のリクエストで最大10個のデータを返す。11個目以降が欲しければページ数を指定する。
- 何も指定しなければ1ページ目が返される。つまりトップ10.
- Sort
- 並び順
- 説明ページ:Sort Values for JP
- SearchIndexがBlendedの場合は指定できない(エラーになる)
- リリース順で取得したい場合に、DVD・CDと本ではパラメータが違うので注意
- ResponseGroup
- 取得データ内容
- 説明ページ:Response Groups
- 「Small,Images」あたりを基本に、必要に応じてTracksとかCustomerReviewsとかを追加すればたいてい間に合う
WWW SQL Designerの Save ・ Loadをスマートに改良
WWW SQL Designerの改良第2弾。(第1弾はWWW SQL Designerのインストール&設定。)
WWW SQL Designer(以下WSDと略す)でServer側にデータを保存する場合の操作を楽にする。
ちなみにWWW SQL Designerの現在の最新版は2.1.1。2.0.1からそれほど変更はなさそう。
初期表示時のデータのロード
これは改良ではなくもともと本体が持つ機能。
ドキュメントには書いてないが、WSDでは下記のようにURLに保存時の名前を付けてアクセスすると、保存されているデータを初期表示できる。
http://localhost/wsd/?keyword=foo
保存時の名前のセット
保存する時に名前を訊かれるが、デフォルトが空なのでいちいち入力するのが面倒。上記のようにURLにkeywordがある場合、それをデフォルトで表示すると便利。
js/wwwsqldesigner.jsの1197行目を下記のように変更する。
var name = prompt(_("serversaveprompt"),"");
↓
var name = prompt(_("serversaveprompt"), location.href.split("=")[1]);
ロード時のURLのリセット
上記の保存時の名前のセットする改良を生かすには、ロード時にはロードする名前に合わせてURL中のkeywordが変わるようにしたい。
js/wwwsqldesigner.jsの1208行目(「SQL.IO.prototype.serverload = function(e, keyword)」の直下)に下記を追加する。
if (!keyword) {
var name = prompt(_("serverloadprompt"),"");
if (name) {
location.href = "?keyword=" + encodeURIComponent(name);
}
return;
}
これでロード時にそのkeywordのURLに遷移するようになる。
tags: db, javascript, web 0 コメント
レンタルサーバーでメール受信時にプログラム起動する方法
さくら
- maildropというメール配信プログラムを使っているため、.forwardによるメール処理設定は使えない
- maildropでは、メールアカウントごとにmailfilterを設定すればプログラムの起動など好きな処理が可能
- catch all(※1)は無いので、virtualなアカウントで受信してプログラムを起動することはできない
- Gmailのようにメールアカウントの後ろに"+"を付けてメールアカウントを擬似的に増やすことはできないようだ
- 1つのメールアドレスで複数の処理やデータを振り分けるには、下記の方法が考えられる
- サブドメインで振り分ける(@の左側が同じなら、異なるサブドメインでも同一アカウントとして扱われるらしい)
- 件名にKEYを入れてそれで判断する(参考:mailto:について)
- メールの自動返信だけならmailfilterでmailbotを使えばできる
XREA
- 受信時にプログラムを起動することはできない
- 代替案として、cronによりfetchする方法がある
- catch all(※1)あり
- 自動返信機能もあり
X Server
- 受信時にプログラムにメールを渡せる(メールの振り分け機能)
- パイプする条件を柔軟に設定できる(例:宛先の部分一致、件名の完全一致、2つ目・3つ目の条件の指定)のが便利そう
- 参考:エックスサーバー 低価格で最高クラスのレンタルサーバー マニュアル
- catch all(※1)は無い
- メールの自動返信は無いようだ
- 直接mailfilterを編集しなければいけない?
結論
特定のサブドメインに来るメールをプログラム側で宛先メールアドレスごとに処理をしたい場合、X Serverを使うのが良さそう。(試したわけでは無い。要確認。mailfilterを編集しなければいけない?件が気になる)
(例)123.shop@sub.example.com(123の所は任意の数字)に来たら、メールの振り分けで「宛先が.shop@sub.example.comのメールは/var/php/reply.phpに渡す」という設定をしておく
※1:「catch all」とは、存在しないメールアカウントへのメールを特定のメールアドレスに転送する機能のこと
CentOSで vsFTPdに 匿名(anonymous)でアクセス
自分しかアクセスしない(できない)FTPサーバ(vsFTPd on CentOS)にanomnymousでファイルを転送できるようにしたい。
(vsFTPdやファイアウォール等の他の設定は既にしてある。)
- vsFTPdで使うディレクトリの所有者設定(グループは関係ないかも)
mkdir /var/ftp/my
chown ftp:ftp /var/ftp/my - vsFTPdの設定ファイルを編集する
vi /etc/vsftpd/vsftpd.conf
- anonymousについての設定をする
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=YES - vsFTPdを再起動
/etc/init.d/vsftpd restart
Windowsのコマンドプロンプトから接続してみる
- 接続(-Aはanonymousにするオプション)
C:>ftp -A 192.168.1.xxx
Connected to 192.168.1.xxx.
220 (vsFTPd 2.0.5)
331 Please specify the password.
230 Login successful.
Anonymous login succeeded for xxx@xxx - 最初いる場所は「/var/ftp」なので、所有者をftpにしたディレクトリに移動
ftp> cd my
250 Directory successfully changed. - ファイルを転送
ftp> put c:test.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 File receive OK.
ftp: 24 bytes sent in 0.00Seconds 24000.00Kbytes/sec. - これで/var/ftp/my/test.txtに転送された。このファイルのアクセス権限を見てみる
-rw------- 1 ftp ftp
- vsftpd.confのlocal_umaskは"022"にしてあるが、これはanonymousには適用されないようだ
参考:
floatingdays: Linuxコマンド備忘録
How to build Internet Server with Linux: ftpのセキュリティ
ファイルのパーミッション、アクセス権限について (Unix Linux)
XMailからバッチファイルを起動する方法
XMailで、カスタムドメイン処理かコマンドエイリアスを使ってWindows上のバッチファイルを実行する方法。
基本的に使い方はコマンド実行機能 - xmailserver.jpに書いてあるが、一部このままでは動かないのでメモ。
バッチファイルを使う例
(パラメータ間のスペースは実際にはタブで書く)
"external" "1" "0" "C:test1.bat" ""
"external" "1" "0" "C:test2.bat" ""
ポイント
- externalコマンドのパラメータが3つだと動かないので、空でも4つ目のパラメータを渡す必要がある
- 優先度(上記例では1)を0にすると環境によっては(?)実行されないことがあるので1にした方が良さそう
- メールのファイルを渡す場合、タイムアウト秒数(上記例では0)を余裕を持った数字(300とか)にする。そうしないと外部プログラムを実行する前に、XMailがファイルを削除してしまう可能性がある(参考:コマンド実行機能 - xmailserver.jp)
- バッチファイル実行時のディレクトリは下記になる。間違えてバッチファイルからの相対パスを書かないように注意
C:WINDOWSsystem32
- コマンドは複数行並べて書くことができる(参考:コマンド実行機能 - xmailserver.jp)
- コマンド実行機能 - xmailserver.jpにはコマンドとしてWindowsのコマンドやバッチファイルを指定できると書いてあるが、実際にはできないようだ。(あるいはやり方が特殊なのか?)
"コマンド" には XMail の内部コマンド、OS の内部コマンドや外部コマンド、シェルスクリプト(UNIX)やバッチファイル(Windows)、標準入出力に対応した任意のプログラムなどを指定できます。
2008年7月21日月曜日
Amazonアソシエイト用のURL
3分LifeHacking:Amazonの長いURLを短縮表示する - ITmedia Biz.IDによると、下記のように短くできるらしい。
アフィリエイトの場合でも「構わない」と書いてある。
http://amazon.jp/dp/[asin]
しかし、hxxk.jp - Amazon の http://www.amazon.co.jp/dp/ASIN No. 形式ではアソシエイト ID が使えない !?によると、上記ではアソシエイトが有効にならないとのこと。
アソシエイトが有効になる短い形は下記らしい。
http://amazon.jp/o/ASIN/[asin]/[affid-22]/ref=nosim
上記のURLの最後の「ref=nosim」(noismじゃない!)は、商品の詳細ページに直接遷移させるために付けてある。
これにより以前はアソシエイトによる収入が増える可能性が高くなっていたが、現在は収益への直接の影響はないようだ。(参考:Amazonアソシエイトの紹介料率システム変更にともなう戦略の変化 [絵文録ことのは]2007/01/28)
(2011/5/26 追記)
「http://amazon.jp/dp/[asin]」形式のURLの場合は「http://amazon.jp/dp/[asin]?tag=[affid-22]」というようにクエリーストリングとしてトラッキングID(アフィリエイトID)を付ければ有効みたい。(文字数は「http://amazon.jp/o/ASIN/[asin]/[affid-22]」形式と同じ。)
また、「http://amazon.jp/o/ASIN/[asin]/[affid-22]」形式の場合の「ASIN」は小文字でもいいみたい。
Amazon公式のリンクの動作確認ツールで確認すると便利。
それから、今はref=nosimを付けても付けなくても同じページになるようだ。
くまくまーさんのサイトを見やすくするuserContent.css
Rails関連の参考記事が充実している「ヽ( ・∀・)ノくまくまー(ノk|*‘-‘)<ノリマツ!愛だよ、愛!)」。
良いサイトなのだが、記事によっては記事部分の横幅が広すぎて横スクロールしないと読めないのが読み辛い。
FirefoxのuserContent.cssで何とかしよう。
@-moz-document url-prefix("http://wota.jp/ac/") {
div.day {
max-width: 950px;
}
}
見やすくなった。
PHPで fgets()する時の改行コード
Macの場合、php.iniで「auto_detect_line_endings = on」を指定すれば、改行コードを意識しなくて良いらしい。
auto_detect_line_endingsはデフォルトではコメントアウトされている。
注意: マッキントッシュコンピュータ上で作成されたファイルを読み込む際に、 PHP が行末を認識できないという問題が発生した場合、 実行時の設定オプションauto_detect_line_endings を有効にする必要が生じるかもしれません。from PHP: fgets - Manual
php.iniにはこう書かれている。
; If your scripts have to deal with files from Macintosh systems,(ここでいう「Mac」とは、OS Xになる前のバージョン9までの古いMacを指すと思われる。参考:改行コード - Wikipedia)
; or you are running on a Mac and need to deal with files from
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
これは逆に言うと、Macが関わらないLinux・Windowsだけの環境なら、auto_detect_line_endingsの設定も含めてfgets()での改行コードについて特に意識しなくてよいということだ。
試しにWindows上のPHPで改行コードが「CR+LF」の場合と「LF」の場合でfgets()結果に違いがあるか実験してみたところ、違いは無かった。
(auto_detect_line_endingsはコメントアウトのまま。)
しかし、改行コードが「CR」の場合、全て1行目として扱われてしまった...。
テストに使ったコードは下記の通り。
<?php
$fp = @fopen('test.php', 'r');
$i = 1;
if ($fp) {
while (!feof($fp)) {
echo "$i : " . fgets($fp);
$i++;
}
fclose($fp);
}
あと、fgets()で取得した文字列の最後には改行コードが付いているので注意。不要な場合はrtrim()で取り除ける。
ブログ アーカイブ
-
▼
2008
(151)
-
►
11月
(12)
- CakePHP Tipsその2
- Googleカレンダーでスクロールホイールを使って月を移動
- PHPでサーバサイドでデータをPOSTする色々な方法
- PHPで簡単にURLのGETパラメータを作成する方法
- 携帯サイト向けクローラのUser Agent一覧
- Windows XP SPSP3にしたらスケジュールしたタスクが実行されなくなった
- PHP5のマジックメソッド
- CakePHP 1.2のFormHelperのradio()で余分なhiddenを出力しない方法
- 無料の携帯サイト向けアクセス解析サービス4つの比較
- CakePHPの標準機能でパンくずリスト(トピックパス)を生成する方法
- PHPで簡単にタグクラウドを生成するPEAR::HTML_TagCloudを試してみた
- 携帯サイトをGoogle Analyticsでアクセス解析する方法
-
►
10月
(11)
- PHPのスクレイピングツールSnoopyにOSコマンドインジェクションの脆弱性
- PCで携帯向けのWeb開発をするためのメモ
- Scala調査メモ
- Goolge Docsから Bloggerへの投稿でエントリーのタイトルが登録可能になった
- 携帯電話関連の日本製Apacheモジュール
- Googleによる自然言語解析検索の実例に関する考察
- Googleモバイル検索に携帯サイトとして表示される方法
- 郵便番号検索APIのまとめ
- Windows用のフリーのバックアップツール × 3
- Flickr services (Flickr API)で写真検索
- CakePHP初心者のための Tips (CakePHP 1.2)
-
►
9月
(14)
- CakePHP 1.2で WebService APIを利用する
- RSS/Atomフィードを生成したりSitemapを作成するPHPライブラリ
- CakePHP 1.2 のFormHelperで日付選択リストを作る
- Flashでページをめくるライブラリで逆方向にめくる方法
- 検索エンジンによる自分のサイトのインデックス状況やSitemapを管理するまとめ
- CakePHP 1.2 で多国語対応(GetText)調査メモ
- avast! 4 Home Editionの便利な使い方
- CakePHP1.2の layoutで使える Helperのまとめ
- CakePHPで特殊な用途に使われるテーブルのフィールド名
- CakePHP 1.2で bakeするメモ
- CakePHP1.2インストールメモ
- 楽天アフィリエイトのPC用 URLと 携帯用URLとの違い
- Google Chrome
- Google Reader Filterで日本語のキーワードを扱う方法
-
►
11月
(12)
tags
- php (176)
- javascript (82)
- apache (54)
- windows (53)
- google (47)
- mysql (41)
- linux (39)
- security (39)
- css (38)
- network (37)
- api (36)
- web (35)
- ruby (34)
- install (31)
- mobile (31)
- firefox (30)
- html (27)
- ie (27)
- config (26)
- postgres (26)
- image (25)
- library (25)
- search (25)
- mail (23)
- db (22)
- feed (22)
- rails (22)
- amazon (19)
- cakephp (19)
- map (19)
- tool (19)
- url (19)
- video (19)
- service (18)
- ec2 (17)
- encoding (17)
- error (17)
- jquery (17)
- server (17)
- flash (16)
- hatena (16)
- setting (16)
- chrome (15)
- blogger (14)
- java (14)
- android (13)
- yahoo (13)
- yui (13)
- del.icio.us (12)
- extensions (12)
- http (12)
- sql (12)
- aws (11)
- compare (11)
- framework (11)
- microsoft (10)
- centos (9)
- date (9)
- free (9)
- google-maps (9)
- php5.3 (9)
- rss (9)
- safari (9)
- yum (9)
- https (8)
- office (8)
- python (8)
- smart-phone (8)
- trouble (8)
- version-up (8)
- web-browser (8)
- adsense (7)
- calendar (7)
- cdn (7)
- jquery-ui (7)
- rakuten (7)
- twitter (7)
- android-apps (6)
- backup (6)
- command (6)
- gmail (6)
- google-app-engine (6)
- pear (6)
- reference (6)
- test (6)
- tuning (6)
- ui (6)
- validation (6)
- xmail (6)
- xml (6)
- zip (6)
- amazon-linux (5)
- atom (5)
- excel (5)
- gem (5)
- ip-adress (5)
- opera (5)
- systemdesign (5)
- titanium (5)
- array (4)
- bookmarklet (4)
- bootstrap (4)
- cache (4)
- color (4)
- cron (4)
- crypt (4)
- customize-google (4)
- feedcreator (4)
- flickr (4)
- font (4)
- form (4)
- function (4)
- gettext (4)
- google-analytics (4)
- google-code (4)
- greasemonkey (4)
- helper (4)
- html5 (4)
- iphone (4)
- jquery-mobile (4)
- laravel (4)
- mac (4)
- password (4)
- perl (4)
- regexp (4)
- rspec (4)
- sbm (4)
- sitemaps (4)
- subversion (4)
- template (4)
- tls (4)
- trac (4)
- utf-8 (4)
- version (4)
- web-service (4)
- active-record (3)
- analytics (3)
- au (3)
- cloud (3)
- date-picker (3)
- dns (3)
- docomo (3)
- domain (3)
- firewall (3)
- ftp (3)
- git (3)
- google-calendar (3)
- google-docs (3)
- hardware (3)
- hatena-bookmark (3)
- hosting (3)
- i18n (3)
- ie8 (3)
- itamae (3)
- json (3)
- log (3)
- openssl (3)
- pdo (3)
- photo (3)
- png (3)
- post (3)
- postgis (3)
- price (3)
- prototype.js (3)
- s3 (3)
- selinux (3)
- seo (3)
- shift-jis (3)
- smarty (3)
- ssh (3)
- ssl (3)
- strage (3)
- string (3)
- tab (3)
- tortoise-git (3)
- url-shortener (3)
- user-agent (3)
- windows-update (3)
- xhtml (3)
- zend-framework (3)
- about-config (2)
- active-resource (2)
- aide (2)
- android-studio (2)
- anti-virus (2)
- auth (2)
- bing (2)
- bitly (2)
- blog (2)
- books (2)
- bootstrap-cdn (2)
- bot (2)
- browser (2)
- bug (2)
- capture (2)
- cdnjs (2)
- centos7 (2)
- cert (2)
- certbot (2)
- class (2)
- convert (2)
- cookie (2)
- csv (2)
- datetime (2)
- debug (2)
- django (2)
- dojo (2)
- download (2)
- dropbox (2)
- ebs (2)
- eclipse (2)
- editor (2)
- feedly (2)
- google-reader (2)
- google-search (2)
- grids (2)
- hash (2)
- highslide (2)
- ipad (2)
- japanese (2)
- jpeg (2)
- language (2)
- lets-encrypt (2)
- link (2)
- mcrypt (2)
- memory (2)
- mod-security (2)
- moible (2)
- mouse (2)
- music (2)
- node-js (2)
- oauth (2)
- paas (2)
- pdf (2)
- permission (2)
- pocket (2)
- rds (2)
- referer (2)
- rest (2)
- rewrite (2)
- rfc (2)
- sample (2)
- scraping (2)
- session (2)
- simplexml (2)
- sjis (2)
- smtp (2)
- snoopy (2)
- softbank (2)
- tag-cloud (2)
- task (2)
- tips (2)
- todo (2)
- tomcat (2)
- travel (2)
- update (2)
- upload (2)
- v8 (2)
- v8cgi (2)
- vmware (2)
- vue-js (2)
- webBrowser (2)
- wordpress (2)
- youtube (2)
- ab (1)
- actionscript (1)
- addon (1)
- adminer (1)
- aes (1)
- affiliate (1)
- ajax (1)
- analyze (1)
- android-market (1)
- apple (1)
- aurora (1)
- avast (1)
- bake (1)
- behavior (1)
- blowfish (1)
- bookmarks (1)
- bootswatch (1)
- bread-crumb (1)
- button (1)
- c (1)
- cakphp (1)
- camel-case (1)
- casio (1)
- chalice (1)
- circle-ci (1)
- clam-av (1)
- cloudformation (1)
- cloudfrare (1)
- cloudn (1)
- cloudwatch (1)
- cman (1)
- codec (1)
- codeigniter (1)
- counter (1)
- crawler (1)
- cucumber (1)
- dao (1)
- database (1)
- datastore (1)
- delete (1)
- dena (1)
- deploy (1)
- deprecated (1)
- design (1)
- django2 (1)
- dokuwiki (1)
- dump (1)
- ecoder (1)
- emacs (1)
- encrypt (1)
- english (1)
- erd (1)
- ethna (1)
- exception (1)
- f-route (1)
- file (1)
- filter (1)
- firebug (1)
- float (1)
- flv (1)
- font-awesome (1)
- font-family (1)
- fontawesome (1)
- format (1)
- formula (1)
- fulephp (1)
- gd (1)
- gdmail (1)
- gears (1)
- geo (1)
- geo-coding (1)
- geolocation-api (1)
- get (1)
- gis (1)
- github (1)
- go-lang (1)
- golang (1)
- goo (1)
- google-apps (1)
- google-checkout (1)
- google-labs (1)
- google-libraries-api (1)
- google-play (1)
- google-plus (1)
- google-trends (1)
- gpl (1)
- gps (1)
- gradle (1)
- grep (1)
- grid.css (1)
- grids.css (1)
- group-ware (1)
- hmac (1)
- hotel (1)
- html-escape (1)
- htmlsql (1)
- http-status (1)
- httpd (1)
- iaas (1)
- ids (1)
- ie6 (1)
- iftt (1)
- igoogle (1)
- iis (1)
- import (1)
- include (1)
- index (1)
- infra (1)
- innodb (1)
- insert (1)
- integer (1)
- ios (1)
- ipad-mini (1)
- ipod (1)
- itunes (1)
- j-phone (1)
- japan (1)
- jetty (1)
- jmeter (1)
- jruby (1)
- jsdelivr (1)
- kohana (1)
- labs (1)
- lambda (1)
- lamp (1)
- layout (1)
- lift (1)
- livedoor (1)
- load-balance (1)
- locale (1)
- logo (1)
- logwatch (1)
- lsync (1)
- magic-method (1)
- maintenance (1)
- math (1)
- maven (1)
- mbstring (1)
- md5 (1)
- menu (1)
- merb (1)
- migration (1)
- mime-type (1)
- minify (1)
- mock (1)
- mod-pagespeed (1)
- mod_cache (1)
- modernizr (1)
- module (1)
- monit (1)
- mootools (1)
- myisam (1)
- myrt-mobile (1)
- mysqldump (1)
- nec (1)
- neta (1)
- nginx (1)
- normalize (1)
- null (1)
- objective-c (1)
- on2 (1)
- onload (1)
- oo (1)
- openid (1)
- or-mapper (1)
- passenger (1)
- pc (1)
- pecl (1)
- photoshop (1)
- phpexcel (1)
- phpmailer (1)
- pipes (1)
- plugin (1)
- podcast (1)
- poderosa (1)
- port (1)
- postal (1)
- postfix (1)
- powerset (1)
- print (1)
- pure (1)
- python3 (1)
- qdmail (1)
- qr-code (1)
- query-string (1)
- quota (1)
- radio (1)
- rating (1)
- rbenv (1)
- reader (1)
- realtime-search (1)
- redhat (1)
- redmine (1)
- remi (1)
- replace (1)
- replication (1)
- request (1)
- require (1)
- reserve (1)
- reset (1)
- restore (1)
- return (1)
- reverse-proxy (1)
- rgb (1)
- rijndael (1)
- rkhunter (1)
- robots.txt (1)
- rootkit (1)
- round (1)
- rpm (1)
- rpmforge (1)
- rt (1)
- saas (1)
- safri (1)
- samba (1)
- scala (1)
- schedule (1)
- screen-shot (1)
- script.aculo.us (1)
- search-wiki (1)
- seasar (1)
- serverless (1)
- sever-side (1)
- sha-2 (1)
- sha-256 (1)
- sha-512 (1)
- share (1)
- shell (1)
- shopping (1)
- simpletest (1)
- simulator (1)
- sinatra (1)
- skype (1)
- sns (1)
- sort (1)
- sqlite (1)
- struts (1)
- sum (1)
- symantec (1)
- symfony (1)
- table (1)
- tag (1)
- tiips (1)
- timezone (1)
- title (1)
- toolbar (1)
- topic-path (1)
- tripwire (1)
- twango (1)
- uninstall (1)
- unit-test (1)
- url-encode (1)
- user-script (1)
- vacuum (1)
- virtual (1)
- voderfone (1)
- web-flavor (1)
- web-fonts (1)
- webdav (1)
- widjet (1)
- willcom (1)
- windows-10 (1)
- windows-7 (1)
- word (1)
- xen (1)
- xinetd (1)
- xmlrpc (1)
- xpath (1)
- xss (1)
- yaml (1)
- yii (1)
- zend (1)