「FaceBook いいねボタン」、meta タグ、OGP

FaceBookの「いいねボタン」で少しハマったのでメモ。

Like Button
http://developers.facebook.com/docs/reference/plugins/like

設置のしかたについては略。

このボタンに設定したURLと、実際にFaceBook上に表示されるURLが違う、という問題が発生。


どうも、 hrefプロパティで指定したURLがそのまま使われるのではなく、
そのURLに対して一度、クローラーが情報を収集しに来るようです。


[**/Jan/2011:**:**:** +0900] "GET /siteurl HTTP/1.1" 200 44836 "-" "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"

(クローラーアクセスログ)

その後、クローラが サイトのtitle、meta、description、OGP、等の情報を収集し、FaceBook内のDBに登録した後に「いいね」ボタンが押された数を集計しているようです。

(そんなわけで、APIに登録してないページタイトル等が、FaceBookのタイムライン上に表示される)



今回、問題を起こしたのは link タグ。

ここの指定にミスがあったために、ボタンを設置したURLとFaceBook上に表示されるURLが変わってしまったようでした。



○link rel="canonical" についての詳細は

link rel="canonical"によるURL正規化タグ——SEOにとって非常に重要な進歩(前編)
http://web-tan.forum.impressrd.jp/e/2009/03/05/5112


○OGPについての詳細は

フェイスブックミクシィ、グリーで使われている OGP (Open Graph Protocol) とは何か
http://d.hatena.ne.jp/amachang/20110117/1295233078




ちなみに、link を修正してもFaceBook上のキャッシュデータが更新されるまで2日ほどかかりました。

作業ログ Google App Engineに登録するまで。

トップにアクセス
http://code.google.com/intl/ja/appengine/


ログインして、右上のスタートガイドから「App Engine アカウントを登録します。」をクリック。

何故か携帯電話のメアドを聞かれるので入力して「send」

すぐ、携帯のメアドに認証番号が送られてくるので入力。

なんかいろいろ登録して終了。

最初なんで、下手に変更しないでエンター。


スナップショットは後で張る。
てか、簡単だったな… ログの意味あんま無いや。

Cake、複数のレコードをまとめて保存する。

CakePHP 1.3

テーブルの複数のレコードをまとめて保存する方法メモ。


まず普通にテーブルのモデルを作って。

<?php
class Mytable extends AppModel
{
	var $useTable	= 'mytable';
	
	var $alias		= "Mytable";
	
	var $primaryKey = "id";
	
       // その他、諸々の設定
}


別のモデルに hasMany で持たせる。

<?php
class EntryMyTable extends AppModel
{
	var $useTable = false;
	
	var $hasMany = array(
		'Mytable'	=> array(
			'className'		=> 'Mytable',
			'foreignKey'	=> false,
			'conditions'	=> ......,
		)
	);
}


Viewはこんな。

<?php echo $form->create(false, array('action' => '/saveurl/') ); ?>
	<?php for ( $i = 0; $i < 10; $i++ ){ ?>
		<?php echo $form->input("Mytable.$i.id", array("type" => "hidden","value" => h($i) ));?>
		<?php echo $form->input("Mytable.$i.col1", array("type" => "text"); ?>
	<?php } ?>
	<?php echo $form->end(array("label" => "submit")); ?>

でコントローラから

<?php
 $this->EntryMyTable->saveAll($this->data);

と、saveAll() メソッドで保存できた。

わーい。

VMWare Toolsの罠にまんまと引っかかった件について。

メモします。
VMWare Tools「共有」設定。
メインのマシンと、仮想マシンでファイルを共有する機能なのです。
変にネットワークとかを計有しないし、設定も簡単だし便利。

だったんですが。

どうもこの共有設定でマウントされる /mnt/hgfs という領域。


# df -hT
Filesystem Type サイズ 使用 残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
ext3 18G 3.5G 13G 22% /
/dev/sda1 ext3 99M 25M 70M 26% /boot
tmpfs tmpfs 506M 0 506M 0% /dev/shm
.host:/ vmhgfs 466G 48G 418G 11% /mnt/hgfs

vmhgfsとかいう独自のファイルシステムを使っていて、
このファイルシステム大文字と小文字を区別しない

詳しく書くと大文字と小文字を区別しない、と言う事です。


VMだから、本番とほとんど同じ環境のハズ! と調子乗ってたら大変な事になりました。

まぁそんだけなんだけど。

Cakeのシーケンス図も書いてやる。

Cakeを玩ぶ前に、ソースコードを読みながら書いてみた。
フレームワークの最低限の設計とかは理解しときたいな。と。
魔改造のお供。

Cake1.3。

まずコントローラ。

View周りは別画像で。


気になるとこメモ。

1. モデルがFly Weightパターンで生成されてる(っぽい)。
ClassRegistryは図で略してます。
2. 手元の書籍と Viewヘルパーのメソッドの実行順序が微妙に違う。
3. Viewクラスのインスタンスがギリギリまで生成されない。


間違ってたらごめんなさい。

PHPから携帯3キャリア対応のメールを送信。

メールを送信したら、SoftBankだけ文字化けです。

ググったら「SoftBankにはUTF-8で送信」といった情報もありましたが、全キャリア対応もなんとかなりました。

(だって送信先ドメイン確認してメールの内容変えるって、どう考えてもおかしいし)

ここでくどくど説明しようとも思いましたが。
↓のサイト様以上に補足する事もないので割愛。


参考にさせて頂きましたURL
http://hain.jp/index.php/tech-j/2007/02/13/PHPの文字化け

多謝。

Docomo、端末IDを常に取得する。

ページ内の全てのリンクに guid=ON のパラメータを設定する。

http://www.aiwake.co.jp/modules/bulletin/index.php?page=article&storyid=2
ここの方のコードを少しアレンジ...

url_rewriter.tags の値の form の要素だけ上書きするようにしています。


下書きなので、テストはまだ。

<?php
// User Agent から判定 (省略)
//if('is docomo'){
	parse_str(str_replace(',','&',ini_get("url_rewriter.tags")), $tags);
	
	$tags['form'] = "action";
	
	ini_set("url_rewriter.tags", http_build_query($tags,null,','));
	
	output_add_rewrite_var('guid', 'ON');
//}


なぜこんな面倒なことをしたかというと url_rewriter.tags のデフォルトが

<?php
echo ini_get("url_rewriter.tags");
# a=href,area=href,frame=src,input=src,form=fakeentry

と、

「form=fakeentry」

こいつの意味が謎。

しかも「form=fakeentry,form=action」のように、同じタグを二度書くと動かないっぽいから。


しかたなく、既存の設定を引き継いで、必要な部分上書き。としたわけです。はい。