blog.ikekou.jp

console.logのブラウザ別動作検証

Chromeで確認しながらJS開発してたらconsole.logの出力ではまったので検証とメモ。

目的

console.logを実装している各ブラウザにおける、console.logの動作の違いを検証・理解する。

方法

以下は検証した方法。

環境

検証ブラウザは
Chrome 16.0.912.75
Firefox 9.0.1
Safari 5.1.2
である。

コード

検証コード。

console.log('#test1 start ----------');
var arr=[];
for(var i=0; i<3; i++){
	console.log('i = '+i.toString());
	arr.push(i);
	console.log('arr = '+arr.toString());
	console.log(arr);
}

console.log('#test2 start ----------');
var arr2=[];
for(var j=0; j<3; j++){
	alert('');
	console.log('j = '+j.toString());
	arr2.push(j);
	console.log('arr2 = '+arr2.toString());
	console.log(arr2);
}

仮説

このコンソール出力は感覚的にはこうなりそう。

#test1 start ----------
i = 0
arr = 0
[0]
i = 1
arr = 0,1
[0, 1]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

でもならない。

結果

以下ブラウザの結果。

Firefox

#test1 start ----------
i = 0
arr = 0
[0]
i = 1
arr = 0,1
[0, 1]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

Safari

#test1 start ----------
i = 0
arr = 0
[0, 1, 2]
i = 1
arr = 0,1
[0, 1, 2]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0, 1, 2]
j = 1
arr2 = 0,1
[0, 1, 2]
j = 2
arr2 = 0,1,2
[0, 1, 2]

Chrome

#test1 start ----------
i = 0
arr = 0
[0, 1, 2]
i = 1
arr = 0,1
[0, 1, 2]
i = 2
arr = 0,1,2
[0, 1, 2]
#test2 start ----------
j = 0
arr2 = 0
[0]
j = 1
arr2 = 0,1
[0, 1]
j = 2
arr2 = 0,1,2
[0, 1, 2]

なんということでしょう。結果が全部違う。

ポイントをあげると

Firefox

・Firefoxの結果は一番感覚的にしっくりくる。
・ただしObjectを文字列として出力してるから中身は辿れない

Safari

・Objectの出力が、あとから更新されている
・そのためfor文で出力したArrayの内容が、全ての箇所で最後の状態になっている
・Objectの中身のObjectの中身も見れる
・でもやっぱり違和感がある
・バグだ!といいたいが仕様なのかもしれない(フォーラム漁ってない)

Chrome

・Objectの出力が、あとから更新されている
・そのためfor文で出力したArrayの内容が、全ての箇所で最後の状態になっている
・Objectの中身のObjectの中身も見れる
・というところまではSafariと一緒である
・ただ、console.logの合間にalertを挟むとFirefoxっぽく 結果が変わる

考察

参照を出力した場合の話は、Chromeに関してはChromiumのフォーラムを見ると
Javascript console.log does not log object instantly
にこの報告があがっていて、2011/8/1のものなんでしばらくこの状態だったみたい。全然気づかなかった。
また書き込みによるとどうやらバージョン13以降この仕様らしい。

確かに中身が見れる仕様だと、console.logのたびにディープコピーしまくらないといけないから難しいのかな?
そういう意味では、参照の出力が後から書き変わってしまうのは感覚的には違和感があるが仕様かもしれないし、あとSafariもそうなのでしかたないのかもしれない。

だが、上記仕様をやむをえないとするとしても、Chromeだけがalert挟むと結果が変わるのは、バグだろうと言いたい。

感想

フォーラムにあるように、自分でtoString()すればいいし、ブラウザごとのこの違いをあらかじめ知っていれば問題はそんなにないと思うが、僕は今まで知らなかったので何時間か悩みました。
あー。

と、ふと卒論を思い出して仮説検証型論文ぽく(見出しだけだけどw)した。

Categories : Development
Comments : 0

FacebookのWallに固定の画像をポストする

Facebookのウォールにあらかじめ決まった、サーバー上に置いてある画像をポストするコード。
なにげに作るににちょっと手間取ったのでメモ。
(ググっても、フォームからユーザーが画像をアップするのばっかり出てきた)
できてしまうと一切なんということもないのだけれど・・・。

//Facebook PHP SDK
require_once 'facebook/facebook.php';

$appId='Your App Id';
$appSecret='Your App Secret';

$fb = new Facebook(array(
	'appId'  => $appId,
	'secret' => $appSecret
));

$user=$fb->getUser();

//OAuthは必要
if(!$user){
	$loginUrl=$fb->getLoginUrl(array(scope => 'publish_stream'));
	header('Location: '.$loginUrl);
}

$image='http://example.com/example.png';

$res=$fb->api(
	'/me/feed',
	'post',
	array(
		'message'=>'This is test message.',
		'picture'=>$image
	)
);

var_dump($res);

/me/feedの、message,picture以外のパラメータについては下記参照。
http://developers.facebook.com/docs/reference/api/user/#posts

Categories : Development
Comments : 0

jQuery.proxy()でAS3.0ライクにイベントハンドラまわりを書く

個人的に
どーやるんだろ、っておもってたことができたので、jQuery.proxy()のメモ。
説明が面倒だからコードで。

例えば最も単純に書くとこうなるとする

var message = 'hello.';
$('#button').click(function()
{
	alert(message);
});

クラスにするとこうなる

var message='hello.';
var ExampleButtonController = function(element)
{
	element.click(function()
	{
		alert(message);
	});
}
new ExampleButtonController($('#button'));

messageをコンストラクタで渡そう

var ExampleButtonController = function(element,message)
{
	element.click(function()
	{
		alert(message);
	});
}
new ExampleButtonController($('#button'),'hello.');

でまあここまではいいけど、click()の引数の無名関数が再利用できないとかいけてないからクラスメソッドにしたい。(カプセル化は今は忘れる)

var ExampleButtonController = function(element,message)
{
	element.click(this.onClick);
}
ExampleButtonController.prototype={
	onClick:function()
	{
		alert(message);
	}
};
new ExampleButtonController($('#button'),'hello.');

となるけど、onClickで参照してるmessageはスコープ外。ダメ。インスタンス変数にしよう。じゃあ

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click(this.onClick);
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

でいいじゃないか、とみせかけてこれもダメ。
onClickのスコープのthisはAS3と違ってインスタンスじゃない。イベントのターゲット。AS2はこんなだったよね。
そこでjQuery.proxy()の登場で

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click($.proxy(this.onClick,this));
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

と書くと、onClickのthisがインスタンスになる。jQuery.proxyをはさんで、thisを事前に指定する。
じゃあ今までthisで取得してたイベントのターゲットはどうすんのって言うとまあもちろんインスタンス変数に持っておいてもいいんだけどこれもASと一緒で(というかW3Cの仕様らしい)

var ExampleButtonController = function(element,message)
{
	this.message=message;
	element.click($.proxy(this.onClick,this));
}
ExampleButtonController.prototype={
	onClick:function(event)
	{
		//これが、通常jQuery使ってる場合のthisにあたる
		alert(event.currentTarget);
		alert(this.message);
	}
};
new ExampleButtonController($('#button'),'hello.');

event.currentTargetでとれます。
event.targetとかもあります。まあASといっしょですね。

ということで、jQuery.proxy()を使うと、イベントハンドラを無名関数じゃなくできるので慣れた書き方っぽくできますよと。いうかんじでした。

でもJSでのオブジェクト指向はまだまだ勉強不足。
継承とかも結局どれがいーのかかたまってないし。
むずかしー

Categories : Development
Comments : 0

Facebook Friendlist Manager

Facebook Friendlist Manager 2

Facebookでフレンドリスト(発言の公開範囲を設定するグループ)を細かく設定するのに公式のUIはあまり向いてないです。一人一人設定していかないといけない。
Google+のはそこらへんやりやすくていいなーと思ったので、作りました。

Facebook FriendList Manager

[2011.12.07追記] Ctrl押しながらクリックで複数選択がMacではできてWinではできない模様。jQueryUIつかっただけなんで原因ちょっとよくわかってないのでわかったら修正します。一番便利なポイントなのに。。。

Functions

機能は
・フレンドリストの作成
・フレンドリストの削除
・ユーザーのフレンドリストへの追加
・ユーザーのフレンドリスト除外
です。
フレンド自体を削除したりとかはないです。

Usage

使い方は

Facebook Friendlist Manager 1

とりあえずJOINしてOAuthして

Facebook Friendlist Manager 3

左から順に、表示するフレンドリストを選択して、表示されたフレンドから処理対象フレンドを選択、次に処理対象のフレンドリストを選択して、最後に追加or除外を押す。
対象フレンドと対象フレンドリストは複数選択可。jQueryUIのお陰でドラッグでも選択できます。あとCtrl押しながらで複数選択できます。(一番やりたかったのは結局これ)
だから10人選んで、それをリストAとリストBに追加とか、その逆とか、できます。

Facebook Friendlist Manager 4

あとは左から三番目の処理対象フレンドリストの下に、フレンドリストの追加ボタンと、選択中のフレンドリストの削除ボタンあり。
フレンドリストの削除だけは間違って消しちゃうと悲しいので、確認ダイアログあり。気をつけて!

英語の成績は学生時代惨憺たるものだったので英語は多分おかしいけど、なんとなく伝わればまあいいです。

Notes

注意事項。
僕はフレンドが120人くらいしかいないので普通に使えてますけど、フレンドがめっちゃ多い人が使ったら多分止まります。何人くらいからやばいか不明。
リストからのフレンドの追加・除外処理は600件くらいまとめて(120人を5つのリストに追加)やっても大丈夫でしたけど、何件くらいからやばいか不明。
ブラウザチェックはMacのFirefox,Chrome,Safariの最新しかしてないです。IE?なにそれ。
止まったらリロードしてね。

一応免責。
このアプリを使って生じたいかなる損害も、その責任は負えませんのでご了承の上でご使用ください。

これでみなさんも今日から快適な陰口ライフを!

Facebook FriendList Manager

あ、キャプチャとるにあたって、嫁に内緒でFacebookやってたりしなさそうな、載せて大丈夫そうな方を選びましたが、問題あったらこっそり連絡ください。すぐ修正します。

Categories : Development
Comments : 0

CakePHP Tips

cakephp

CakePHPに関するメモ。

Read more ?

Categories : Development
Comments : 0

Mac Tips

IMG_4273
Creative Commons License photo credit: CLF

Mac OSX で mkpasswd が使えなくても pwgen がある | Sun Limited Mt.

Categories : Development
Comments : 0

HTML/CSS Tips

Nerdy books
Creative Commons License photo credit: cyrildoussin

[CSS]スクリプト無しで、高さがバラバラの画像を隙間無く配置するスタイルシートのテクニック | コリス

Categories : Development
Comments : 0

Twitter Tips

Twitter Bird Sketch
Creative Commons License photo credit: shawncampbell

Exploring the Twitter API | Twitter Developers

Categories : Development
Comments : 0

JavaScript Tips

JSConf.eu 2011, Berlin
Creative Commons License photo credit: autonome

わかった気になるJS開発手法
第4回 JavaScriptでオブジェクト指向プログラミング - @IT
JavaScript OOP におけるクラス定義方法 – IT戦記
JavaScriptがプロトタイプベースのオブジェクト指向言語ってどういうこと? – builder
jqueryのhoverで設定されたメソッドを解除する方法。|プログラマのマジメなブログ
jQuery公式のテンプレートplugin 「jQuery Templates」-JavaScript Library Archive
InfoQ: jQueryへのテンプレートの導入
jQueryでテンプレートエンジン – Architect Life
jQuery テンプレート – ヒント & トリック -
jQuery用の便利なテンプレートエンジンjTemplates/ – サイブリッジラボ
incsearch.js – インクリメンタルサーチライブラリ

Categories : Development
Comments : 0

Linux/Unix Tips

UNIX: Live Free or Die
Creative Commons License photo credit: Sebastian Bergmann

findコマンドの使い方 – 好奇心の赴くままに
"Trumps by the roadside" – ちょっとだけカッコよく find(1) を使う

Categories : Development
Comments : 0

Apache Tips

mod_rewriteの確認 – Contao Open Source CMS Research
mod_rewrite が動いているかどうか簡単に調べる方法 | Bowz::Notebook
mod_rewriteの考え方。 – こせきの技術日記
livedoor Techブログ : mod_rewrite を利用したリバースプロキシ環境の作り方

Categories : Development
Comments : 0

MySQL Tips

MySQL の MyISAM について質問です。 今まで、主に PostgreSQL .. – 人力検索はてな
[ThinkIT] 第2回:MyISAMとInnoDB (1/3)
Ikeda->Weblog() » MySQL Workbench が便利です
MySQL トランザクション – とみぞーノート
№1821 PHP 5.2+ is requiredと表示される人へ – Web Patio – CentOSで自宅サーバー構築
MySQL4.1/9.MySQLの実験/1.システム変数の参照と変更 – Ground-SunLight
テーブル毎のAUTO_INCREMENT値を確認する – 私的ログ(別館)
SQL緊急救命室:第1回 サブクエリ・パラノイア~副問い合わせ乱用による性能劣化を治療せよ!|gihyo.jp … 技術評論社
MySQLのVARCHARサイズについて – Togetter
MySQL Workbench 5.1.16 メニュー日本語化ファイル – sakaikの日々雑感~(T)編
漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!!
RDBでテーブルの作り方が良くわからなくなってきたので、いったんまとめてみた – kanonjiの日記
MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.11 InnoDB パフォーマンス チューニング ヒント

Categories : Development
Comments : 0

PHP Tips

PHP5でディレクトリ内のファイル一覧取得する方法。

$dirName='hoge';
$fileArrayAsc=scandir($dirName,1);
var_dump($fileArrayAsc);

諸々

[PHP]MySQLを利用した画像の保存と出力 | WEBプログラム覚書
[PHP]知っていると便利な、カテゴリ別のPHPのライブラリ集 | コリス
TwitterやFacebookへのログイン機能をこれ1個で実装できるPHPライブラリ「HybridAuth」:phpspot開発日誌

Categories : Development
Comments : 0

Facebook App Tips

Facebookアプリ開発のメモ。

Read more ?

Categories : Development
Comments : 0

Chrome Extention Tips

Chrome Extentionに関するメモ。

Read more ?

Categories : Development
Comments : 0

WordPress Tips

WordPressに関するメモ。

Read more ?

Categories : Development
Comments : 0

Eclipse tips

Eclipse
Creative Commons License photo credit: Nasser ☮

Eclipseに関するメモ。

Read more ?

Categories : Development
Comments : 0

mixiページアプリのホワイトボードを使ってみました

mixi is silent...

mixiページに設置できるビルトインアプリの「ホワイトボード」を使ってみました。

Read more ?

Categories : Development
Comments : 0

ロリポップでfile_get_contentsができない

[Added on 2011.03.22] 気のせいでした :-p

flashからクロスドメイン環境にあるファイルをgetするときに、まるっと返すだけのphpを置いてたのですが、気づいたら動いてなかったのでメモ。
前は動いてた気がするのだけど。まあ気のせいかもしれない。php.iniの設定画面がありました。知らなかった・・・

Read more ?

Categories : Development
Comments : 0

Hello @font-face

@font-faceの記事を読んで、woffというフォント形式と新しい書き方を見たのでやってみる。

こんなかんじになってたら成功。

Read more ?

Categories : Development
Comments : 0
Olders 
Copyright © kouseiikeda All Rights Reserved. Powered by WordPress 3.2.1.