Home > 技術
技術 Archive
space - HTML5 & CSS3 DEMO
- 2010-03-13 (土)
- 技術
画像やFlashはいっさい使わずに何か中心に向かってアニメーションするものを作りたいと思って制作してみました。
今回もjsDeferrd.jsを使用。
cho45's jsdeferred at master - GitHub
中心に向かって行くということで、何かが中心にないと面白くありません。
なので、疑似的な太陽をCSS3で作り、そこにHTML5のcanvasが向かって行くという感じになりました。
サンプルコード - CSS3
実はまだこのgradientというCSSプロパティが良くわかっていなくて、Firefoxで出来るけど、Safariでどうやるのかな〜という部分を検証中です。
-moz-radial-gradientというプロパティを使って太陽を描いているんですが、これをWebkitでどう指定するのかが分からない!
なので、mozとwebkitでは別々の背景にしています。
またbodyタグに-moz-radial-gradientを指定するとなぜかうまく円が描かれなかったです。
divを画面のheight、widthに広げてそこにスタイルを当てるようにして回避しました。
あとHTML5のvideoタグも使って音楽を出しています。
使っている曲は、HoldenのA Break in The Clouds - Main Mixです。(怒られたら使用するのやめますw)
宇宙っぽさが演出できる名曲です。
Firefoxで見ていただくのが一番いいです。
Chrome、Safariの場合は円ではなくグラデーションになってます。
以下からどうぞ。
space - HTML5 & CSS3 DEMO
プログラムコード
・gist: 331165 - GitHubsquareDeferred
- 2010-03-13 (土)
- 技術
なんとなく思い立って、jsDeferred.jsでアニメーションのループがしてみたいってなったので作ってみた。
この手のアニメーションを考えるときは、どちらかというと間違ったコードが面白さを生み出す。
つまり、不意に間違って2回ループしたら面白いや、ストーリーの組み直しなどで型にハマらない動きができたりする。
ここ最近は拙作のaddCommand - jQuery Pluginでアニメーションを書いていたんですが、jsDeferredも便利ですね〜。
処理の割り込みや、setTimeoutで待たせるときに使ったりしてましたが、アニメーションでも十分に使いやすい。
cho45's jsdeferred at master - GitHub
サンプルコード - jsDeferred.js
ストーリーのループは以下のようにfunctionのcalleeを最後のnextで呼ぶようにしてあげてます。
これで疑似無限ループの完成。
あとjQuery1.4以降の機能でeasingをCSSプロパティ毎に指定できるので、それで少し気持ち悪い動きをくわえてみたりしてます。
Firefoxでも頑張って動いてくれますが、ChromeかSafariのほうが軽快に動作します。
以下からどうぞ。
squareDeferred
プログラムコード
・gist: 331150 - GitHubflickrダラ見サイト - flickrer作ってみた
- 2010-03-08 (月)
- 技術
自分がflickrをダラ見することが多いので、それっぽい感じのサイトを自分用に作ってみた。
特に難しいことはしてなくて、
- $.jOpening
- $.flickr
- $.fn.jCurtain
という3つのプラグインを作って制作してます。
あと、miyagawaさんのmiyagawa's jquery-fitimage at master - GitHubを使って拡大画像の調整をしています。
実は単にカーテンのようなスライドを作ってみたくて、何か面白いことできないかな〜と思っていたらflickrでやったらいいかもと思って試しに作ったのがこのサイトになります。
初めのオープニング部分では、左右からラインが伸びてくるのですが、この当たりはFlashを意識して作っています。
今後もうちょい機能増やして、ダラ見しやすくする予定。
autoでスライドしていくとか。
対応ブラウザは以下(試したのが以下w)
- IE7
- Safari4
- Firefox3.6
- Chrome5
もしよかったら使ってみてくださいな。
flickrer - flickrダラ見サイト
@hisasann マウスオーバーで画像を読むまでに間が空くのがもったいないので裏で呼んでおいたほうがいいんじゃないかと。
via: Twitter / edvakf
との意見をいただいたので、拡大画像部分の画像を先読みするように修正しました。
Macに複数MySQLをインストールする方法
MacPortsでインストールする方法MacPortsでMySQLをインストール -- BONNOH FRACTION 13や、pkgでインストールする方法素晴らしき哉、人生!: Mac OS 10.5にMySQLインストールを見てみたんですが、どうもこれらの方法では複数のMySQLを同居させるのがむずかしそうだったので、ソースからコンパイルして入れてみた。
そしてうまく複数のMySQLが動いたので、そのときのメモメモ。。。
ソースをダウンロードする
以下のリンクからtar.gzをダウンロードします。
今回僕はmysql-5.0.33をインストールしましたので、適宜自分のバージョンに置き換えて読んでいただけたらと思います。
MySQL :: Download MySQL Community Server
そして適当なディレクトリに解凍する。
tar zxvf mysql-5.0.33.tar.gz
Macだと基本的にmysql-5.0.33.tar.gzをダブルクリックすれば解凍ソフトが起動するので、ターミナルでなくてもOKだと思います。
今回は/usr/local/srcディレクトリに解凍しました。
そしてディレクトリに潜る。
cd mysql-5.0.33
コンパイルする
まずはconfigureを実行します。
このときのコンパイルオプションは結構重要で、とりあえず以下の感じに落ち着きました。
--with-mysqld-user=hogeのところは、Macにユーザ権限でmysqlをソースから(あと、DBD::mysqlも) - Born Neetを参考にして、今ログインしているユーザーを記述してみました。
--prefix=/usr/local/mysql3306は複数のMySQLを/usr/local/に同居させるので、mysqlの後に僕はport番号をサフィックスとして付与しています。
./configure --with-charset=utf8 --with-mysqld-user=hoge --with-unix-socket-path=/usr/local/mysql3306/var/mysql.sock --prefix=/usr/local/mysql3306 --with-blackhole-storage-engine --with-federated-storage-engine
configureがうまくいけば、あとはmakeで終わり。
make
make install
データベースを初期化する
/usr/local/mysql3306/bin/mysql_install_db --user=hoge
もしここで「unknown option '--skip-federated'」のようなエラーが出てしまう場合は、
以下のファイルの
/etc/my.cnf
この部分をコメントアウトしてください。
#skip-federated
[via]
mysql 5.1のmysql_install_dbがこける - うまい棒blog
初期化が終わるとデータディレクトリのvarが作成されます。
/usr/local/mysql3306/var/
そして今回の重要なポイントですが、MySQLを別ポートで複数起動するので、このmy.cnfが1つだとうまくいきません。
my.cnfにportを指定する箇所があるので、別々のMySQLは別々のmy.cnfを見に行って欲しいわけです。
なので、今回は
cp /etc/my.cnf /usr/local/mysql3306/var
を実行してmy.cnfをデータディレクトリにコピーしました。
これで順番的に自分自身のmy.cnfを見に行くようになります。
また、mysql.sockというMySQLが起動したときに作成されるファイルも別々にしたいので、これもデータディレクトリに作ってねっ!と記述しています。
一般的には/tmp/mysql.sockに作成されるようです。
[client]
default-character-set=utf8
#password = your_password
port = 3306
socket = /usr/local/mysql3306/var/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
default-character-set = utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8
port = 3306
socket = /usr/local/mysql3306/var/mysql.sock
skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
MySQLを起動する
起動コマンドは以下のとおり。
cd /usr/local/mysql3306/bin
./mysqld_safe &
これでバックグラウンドでMySQLが起動します。
ちょっと教えてもらった操作をメモ。
もし以下のように&を付けずに起動した場合、
./mysqld_safe
Ctrl + zで一旦プロセスを落として、
bg
と叩くと
./mysqld_safe &
をしたときと同じ動作になるみたい。
最後に、プロセスが立ち上がっているかを以下で確認する。
ps ax | grep mysql
MySQLを停止する
以下で止まる。
./mysqladmin shutdown --socket=/usr/local/mysql3306/var/mysql.sock
まとめ
これで、もうひとつmysqlを作りたい場合は、「コンパイルする」の部分から--prefixを変えて実行すればよい。
結構手順としては面倒だが、プロジェクトが複数のMySQLを必要としている場合に、この手順が参考になれば幸いです。
■関連リンク
・MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.5 Mac OS X に MySQL をインストールする
・「Can't connect to local MySQL server through socket」エラーについて
・MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.8.3 mysqld_multi(複数の MySQL サーバを管理するプログラム)
・MySQL / Mac OS X
・Macにユーザ権限でmysqlをソースから(あと、DBD::mysqlも) - Born Neet
・MySQL :: MySQL 4.1 リファレンスマニュアル :: 2.4.1 mysql_install_db の実行に関する問題
・1台のサーバに複数のMySQLをインストールしてみた。 | RwJ
・MySQL :: MySQL 5.1 リファレンスマニュアル :: 2.9.2 典型的な configure オプション
・MySQL :: MySQL 4.1 リファレンスマニュアル :: A.4.5 MySQL ソケットファイル /tmp/mysql.sock の保護または変更方法
MacにImageMagickをインストールする方法
いろいろググッた結果、MacPortsからインストールするのが速そう。
ということでまずはMacPortsのインストールから解説します。
すでに入っているかたは、読み飛ばしてください。
MacPortsをインストールする
まずは、Xcode ToolsをMacに付属しているインストールディスクからインストールします。
終わったら、http://svn.macosforge.org/repository/macports/downloads/からバージョンを選んでダウンロードする。
僕のローカルにはすでに、MacPorts-1.7.1が入っていたので、このバージョンでも問題ないと思います。
次に環境変数にパスを追加しときます。
cd
vim .bash_profile
export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
export MANPATH=/opt/local/man:$MANPATH
一応リフレッシュしとく。
source .bash_profile
あとはMacPortsをアップデートしておわり。
$ sudo port -d selfupdate
$ sudo port -d sync
[via]
MacPortsでステキなUNIXツールをインストール - はこべにっき#
ImageMagickをインストールする
ここまで来るとあとは楽チンで、
$ sudo port install ImageMagick
これで終わり!
いろんなものを一緒にインストールするので、だいたい30分くらいはかかるかも。
すでに、MacPortsでインストールされているものを確認するなら、
$ port installed
と叩けば、ゾロゾロと表示されます。
[via]
[を] Mac に ImageMagick を入れた
■関連リンク
・新しいMacbook Proにインストールしたものメモ
・MacPortsのコマンド逆引き一覧 -- ディノオープンラボラトリ
JavaScript変態複雑化文法最速マスター
- 2010-02-03 (水)
- 技術
Java変態文法最速マスター - プログラマーの脳みそをリスペクト。
JavaScript変態文法最速マスター - 葉っぱ日記をリスペクト。
特に技法的なことではないんですが、functionをいろんなところで絡めてわかりにくくするポイントをいくつか紹介。
if文にfunctionを絡めてみる
単純なifなはずなのに、条件式に即時実行のfunctionを絡めることによってよりわかりにくくできます。
さらにクロージャをreturnして()で実行し、より複雑にする技法もとりいれてます。
for文にfunctionを絡めてみる
そもそもfor文の回りにfunctionを絡めてわかりにくくし、for文の条件式にもfunctionを絡めます。
さらにクロージャをreturnして()で実行し、より複雑にする技法もとりいれてます。
「ちなみにここでやっていることは引数の[1, 2, 3]という配列を受け取って、新しい配列にコピーしてreturnしているだけです。」
出力結果
[1, 2, 3]
Objectに上記やり方を絡めてみる
aというプロパティはただaを返せば終わりなはずなのに、わざわざfunctionでネストしてわかりにくくしています。
bというプロパティは上記if文複雑化とfor文複雑化を応用して、解読が困難な状態を実現しています。
出力結果
[1, 2, 3]
複雑化で気を付ける点
iをインクリメントする部分の複雑化で
という部分がありますが、ここで
このように引数で渡してはいけません。
外側のスコープにいるiではなく、このfunctionの関数スコープ内のiをインクリメントすることになるので無限ループになります。
これ以外にもcurry化をうまく使いまくって、複雑にすることができますが、だいたい上記のことが応用できれば特に問題はありません。
※注意 function絡めは節度と必要度合いを見て実装しましょうね!
エラトステネスの篩 - JavaScript版
- 2010-01-29 (金)
- 技術
こんな感じなのかな。。
サンプルコード
出力結果
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
勉強になりました!
JavaScriptライブラリを使っていてIEで余計なリクエストが発生してしまうケース
- 2010-01-27 (水)
- 技術
ここ最近フロントエンドのパフォーマンスチェックでHttpWatchを使っているんですが、これはかなり調子がいい!
特にインストールするとIEとFirefoxに追加され、Firebugのように画面の下のほうに表示されるので違和感なく使えます。
んで、このソフトを使ってサイトのパフォーマンスチェックをしていたら、IEの場合だけ
「ERROR_INTERNET_INVALID_URL」
というRequestの結果が返ってきて、これってなんだろうと調べてみたら、jQuery・prototype.js・YUIを使っている場合に
IEでDomContentLoaded(DCL)判定するときに発生しているようです。
これでだいたい3〜6ミリ秒のオーバヘッドがあるよう。
ほんのちょびっとですがねw
jQueryの場合(ver1.2.1)
bindReady関数の中にIEだったらという分岐があり、その中でsrc=//:なscriptタグをdocument.writeしているのが原因。
このscriptがdocument.writeされたタイミングでsrc属性のURLをGETする際に、よくわからんURLじゃ〜と言っているんでしょうね。
jQueryがこの判定方法を使っているのはおそらく1.2.1以前だと思うので、1.2.6や1.3.X、または1.4を使っている場合は問題ありません。
ちなみに1.4のDCLの判定は以下のようになっています。
onreadystatechangeとonload、あとは今までにもあったdoScrollで判定しているようです。
prototype.jsの場合(1.6)
このprototype.jsを使っている場合が、今回のERROR_INTERNET_INVALID_URLなRequestを送信してしまうパターンになります。
実際のコードは以下のとおり。
上記のコードを実行した場合の挙動が少しへんでした。
まずDOMContentLoadedでjQuery.readyが登録され、その後のSafariの分岐でdocument.readyStateの状態を監視します。
するとdocument.readyStateのif文には約1回くらいしか入らず、その下にあるif文には一切入りませんでした。
順番にしてみました。
- DOMContentLoadedにjQuery.readyを登録
- Safariの場合にdocument.readyStateを監視
- DOMContentLoadedイベント発生でjQuery.isReadyがtrueになる
- document.readyStateを監視しているがjQuery.isReadyがtrueなのでループを抜ける
- だからdocument.stylesheetsのlengthチェックが走らない
う~~~ん・・・
だとするとSafariのDOMContentLoadedのほうがjQueryのDOM構築待ちより速いということでしょうか。
速い故にまだ構築し終わってない?w
まさかね!
まとめ
かなりイレギュラーなパターンだと思いますが、Safariでこういう現象があったのは確かです。
なのでwindow.onloadを待つか、documentのDOMContentLoadedを待つかはテストしながら判断したほうがよいかもしれません。
Firefox3.0やIE7、IE6では特に問題がなかったです。
SafariのDOM構築って少しくせがあるので、そこが悩みどころですね。
レンダリング超速いですが・・・
JavaScriptで単体テストをするならQUnitはいかが?
- 2008-09-17 (水)
- 技術
「JavaScriptのテストってわざわざXUnit系を使ってまでする必要はない!」
みたいな意見は多々あるのですが、ライブラリなどを作っているときには非常に便利だったりします。
ちょこっとした修正がどの程度影響があるか分からないときに、テスト用のコードをしっかり書いてあればそれを実行するだけですんでしまいますからね。
そんで最近になって
JavaScript--単体テスト環境の選択肢 - builder by ZDNet Japan
という記事を見てて、「あれ?Qunitがないぞ!」と思ったので簡単に使い方を書いてみたいと思います。
上記リンクの記事ではJsUnitやRhinoUnitのことが書かれていますが、これらはJavaありきというかANTありきなので、ちょろっとテストコードを書くというスタンスにはなかなか難しいと感じています。
ただJsUnitは全ブラウザを登録しておけば、いっきにクロスブラウザのテストを実行してくれるので便利といえば便利なんですけどね。
その点QUnitはjQuery用のテスティングフレームワークなので、コード量も少なく簡単にテストコードを書いていけます。
(少しだけjQueryに関する知識が必要になってきちゃうのはご愛嬌)
jQueryを使ったテスティングフレームワークですが、別に自作のライブラリのテストももちろんできますので、開発で使っているライブラリをテストすることができます。
使えるメソッドいろいろ
QUnit - jQuery JavaScript LibraryのAPI documentationのところに使い方が書かれていますので、ここではよく使いそうなメソッドだけを説明したいと思います。
test( name, test )
nameにはテスト名、testには実行したいテストコードを匿名関数で記述します。
module( name )
nameにはテストしたい単位を渡します。これはテストをしているときの目印になります。
たとえばレイヤーを操作するテストをしたい場合に
としておくと、テスト結果画面で
「レイヤー表示テスト module: レイヤーの枠を表示する (0, 1, 1)」
みたいにmoduleの手前にプレフィックスが表示されます。
ok( state, message )
stateにはfalseとtrueを指定できます。
falseの場合にはNG、trueの場合にはOKとなります。
これは帰ってきた値がtrueかfalseか、または通過したかしないかなどの判定に使えそうです。
messageは表示したい文字列を渡します。
equals( actual, expected, message )
これはよく使うやつですね。
actualとexpectedの値が同じ場合にOKとなります。
messageは表示したい文字列を渡します。
すぐに使いそうなのをご紹介しましたが、もっと詳しく知りたい場合にはjQueryのテスティングフレームワークQUnit (でぃべろっぱーず・さいど)をごらんください。
「提供されているメソッド」に詳しく書かれています。
QUnitのダウンロード
QUnit - jQuery JavaScript LibraryのUsing QUnitのところにjsとcssのリンクがあるのでここからダウンロードできます。
ダウンロードするのが面倒というかたは次の「QUnitを使ってみる」に進んでください。
QUnitを使ってみる
以下がQUnit用のHTMLになります。
ここにテスト結果がどんどん表示される感じです。
もしQUnitをダウンロードされた方はtestsuite.cssとtestrunner.jsのパスを変更してください。
今回はテスト用のコードを「qunit.js」に、テスト対象のコードは「hogehoge.js」として話を進めていきます。
テストしたいコードは以下になります。
文字列を返してきているので、これはequalsでチェックできそうです。
なので、qunit.jsには
と記述してテストを実行してみました。
実行結果は以下の画面になります。
failedが0になっているので、バグはなさそうですね。
おそらく大体がこういったテストで十分だと思うのですが、もしHTMLエレメントを使ったテストの場合には少し工夫が必要です。
どっかのdivタグのinnerHTMLを書き換えたテスト、id指定で取得したエレメントのwidthのテストなどはどうしてもHTMLを必要とします。
次はHTMLエレメントに対してテストをする場合を解説してみたいと思います。
HTMLエレメントに対するQUnitテストコードを書いてみる
今回はHTMLエレメントを透過させるメソッドをテストコードを書いてみました。
初めに必要になるファイルを解説します。
- qunit.js - テストコードが記載されているファイル
- hogehoge.js - テスト対象のコードが記載されているファイル
- opacity.html - 透過のテストをするときに使うHTML
透過に関するテストって自動でできるの?と考える方がいらっしゃるかもしれませんが、これが以外とできるんですw
先ほど使ったQUnitテスト結果HTMLは、あくまでもテスト結果を表示するものなのでこれとは別にHTML(opacity.html)を用意します。
まずは透過させるコードです。
これのテストコードは以下になります。
ここからがちょっと新しいテストコードになります。
テストコードの中でtestwinというメソッドを呼んでいます。これは新しくウィンドウをPopupさせ、そのHTMLの描画が完成した瞬間にテストコードを実行してくれるすぐれものです。
つまりopacity.htmlを新しいウィンドウで開いてDOMの構築が完了したら透過のテストコードを実行してくれる感じです。
これはjQueryのoffset.jsの中を参考にしています。
続いてopacity.htmlの中身。
ここではjQueryのファイルとテスト対象のhogehoge.jsを読み込んでいます。
そしてscriptタグで「$(function(){});」を実行しています。
先ほどのテストコードでPopupした画面のDOM構築を待つと解説しましたが、これはつまりjQueryのjQuery.isReadyがtrueになるのを監視しているのです。
jQuery.isReadyはreadyというメソッドが呼ばれて初めて監視がスタートされるので、ここで$(function(){});を実行しているのです。
ちょいややこしいですねw
これでテストするためのコードがそろいましたので、実行してみたいと思います。
おお~Opacityのテストが実行されました。
$w("#opacity").setOpacity(0.2).getOpacity()で返ってきた結果が0.2なのでちゃんと透過機能がはたらいたようです。
まとめ
HTMLエレメントのテストで別のHTMLファイルを作らないといけないのはちょっと不便かもしれませんが、1回作ってしまえば後は何度でもテストが可能ですので、いつかきっとプログラマーを助けてくれると思います。
QUnitはJavaやANTなどが不要なため、完全に独立したテスティングフレームワークとして使えるので
「JSでテストコード書きたいけど敷居が高いな~」
という人にはもってこいなのではないでしょうか?
良く分からないこと
IE7.0でウィンドウを開いてテストするときに、まれにうまくいかないことがあります。
F5とかで再度テストをすれば大丈夫ですが、そうゆうときもあるようです。
Safari3.1やFirefox3では特に問題なかったです。
でもなぜIEだけ・・・
■関連リンク
・Getting Started With jQuery QUnit for Client-Side Javascript Testing - Chad Myers' Blog
・jQueryのテスティングフレームワークQUnit (でぃべろっぱーず・さいど)
onunloadイベントが拾えないパターン
- 2008-09-16 (火)
- 技術
onunload時に何か処理を実行して、その処理がとっても大切な場合は以下のパターンのときに
注意する必要があるかもしれないというメモ。
リンクを押して他の画面に遷移した場合
- Firefox3.0
- OK
- IE6.0
- OK
- IE7.0
- OK
- Safari3.1
- OK
- Opera9.5
- OK
F5を押した場合
- Firefox3.0
- OK
- IE6.0
- OK
- IE7.0
- OK
- Safari3.1
- OK
- Opera9.5
- NG
ブラウザを閉じた場合
- Firefox3.0
- OK
- IE6.0
- OK
- IE7.0
- OK
- Safari3.1
- NG
- Opera9.5
- NG
JavaScriptからOpacity(透過)を設定する方法
- 2008-09-12 (金)
- 技術
JavaScriptでアニメーションさせようとしたとき、意外と使うのがこの透過。
じょじょに透過させていくとか、見栄えもかっこよくボクは良く使います。
でも既存ライブラリを使った場合、Netscapeに対応していない場合が多いです。
jQueryやPrototype.jsはそもそも対応ブラウザにNetscapeが含まれていないので当然といえば当然ですね。
それでもNetscape対応させたい場合のメソッドを作ってみました。
すんごい短いコードですw
一応ライブラリごとのOpcityの設定について書いておきます。
jQueryからOpacity
PrototypeからOpacity
自作メソッドからOpacity
3パターンのOpacity設定を使って、どのブラウザでも透過ができるようになっています。
JavaScriptやCSS、Railsなど使えそうなチートシートいろいろ
- 2008-09-10 (水)
- 技術
Cheat Sheets - Added Bytesで開発に役立ちそうなチートシートが公開されています。
PDFで落とすことができますが、PNGもあるのがありがたい。
チートシートもみやすく前にPrototype.jsのチートシート(ver1.5、1.6)で紹介したものを合わせてどこかに貼っておけばきっと開発を助けてくれるはず。
JavaScript Cheat Sheet

JavaScript Cheat Sheet - Cheat Sheets - Added Bytes
CSS Cheat Sheet
JavaScriptライブラリ毎のSelectorAPIの速度一覧
- 2008-09-09 (火)
- 技術
普段はPrototype.jsとjQueryを使ってJavaScriptを書いているのですが、そこまで複雑なCSS SelectorAPIは使ったことがないのでこうゆう一覧、というか実際に実行して確認できるのはありがたい。

検証してくれるJavaScriptライブラリは以下のとおり。
- DOMAssistant2.7.2
- jQuery1.2.6
- Prototype1.6.0.2
- Mootools1.2
- ExtJS Core2.2
- Dojo1.1.1
- YUI2.5.2
MacのSafari3.1で試してみたのですが、DOMAssistantというライブラリがおそるべき速さで実行できています。
もっとも遅かったのはYUIですが、Prototypeもそれに負けずに遅い感じでした。
jQueryはさすがですが、Extに負けているのがビックリ。
いろんなブラウザで試せばこれで一通りのベンチマークになりますね。
とはいっても複雑なCSS SelectorAPI書くより、idふるなり適当なclassを割り当てたほうが良さそうですねw
addEventListenerとattachEventでは実行される順番が違う
- 2008-09-08 (月)
- 技術
たとえばPrototype.jsを使っている場合、
こんな感じでイベントを登録することができる。
また同じオブジェクト(window)に対して同じイベント(load)を指定した場合は、追加として登録される。
なので上書きはされない。
こうゆう場合にIEとIE以外では挙動が違うので一応メモを残しておきます。
IEのattachEventの実行順序
一番最後に追加されたイベントから一番最初に追加されたイベントにさかのぼるように実行される。
なので上記のコードでは2→1
IE以外ののaddEventListenerの実行順序
一番最初に追加したイベントから一番最後に追加されたイベントを実行される。
なので上記のコードでは1→2
まとめ
初めPrototype.jsが何かしているのかと思ったのですが、とくにそれっぽい箇所がなく以下のように自作した関数でも再現したため、こうゆう挙動は一般的なんでしょうね。
一番最初に登録したイベントから実行されるのを望む場合はIEとIE以外で挙動が違うのでハマる危険性がありますね。
追記:
IEのイベント実行順序は不定? - inamenaiの日記でさらに実験をしていただきました。
attachEventは単純に逆順になるわけではなくランダムだそうですw
でも何度か実行しても同じ順序になるようなので、何か法則でもあるんでしょうか・・・
CSSファイル内に他のCSSファイルをインクルードする方法
- 2008-09-04 (木)
- 技術
ひとつのCSSファイルを共通部分をあの画面とこの画面とかで共通で仕様したいがlinkタグを追加したくないとかに便利。
読み込むCSSは1つのファイルなのに、CSSファイルの中から別のCSSファイルをインクルードしてくれるので、2個のCSSファイルを読み込んでくれる。
index.html style.css include.css
あんまり使う機会はなさそうですねw
DOM Events - DOMAttrModifiedを使ってみる
- 2008-09-02 (火)
- 技術
イベントを登録されたオブジェクトの属性が変更された場合にfireされるイベント。
Document Object Model Events
あるHTMLオブジェクトの属性を監視するときに便利かもしれませんね。
setIntervalで監視しているのをこういったイベントに置き換えることによって、簡略化もできるし。
でもFirefox限定・・・
DOMとJavaScriptについて
- 2008-09-02 (火)
- 技術
「DOM(Document Object Model)とは、HTML文書およびXML文書のためのAPIである。」
というのがDOMの説明に多いのだが、一体何がDOMで何がDOMではないのかを判断するのがちょっぴり難しい。
JavaScriptをコーディングしていて、「あ~この部分はDOMだな」とか「う~ん、ここはDOMではなくJavaScriptだな」とかを明確に判断する必要はないんだけれど、分かればもっと楽しくなるんじゃないかな。
なのでDOMで遊ぶ際に必要な知識なんかを以下にまとめてみました。
既知の情報も多々ありますが、個人的なメモなのでご了承ください。
DOMとは?
HTML(XML)のようなタグ構造を持つ文書に対して、あたかもオブジェクトのようにアクセスするためのAPIです。 HTMLはタグという文書構造になっているので、例えば「」のようにidにhogeという文字を持つdivタグにアクセスしたいとしたとき、その方法を提供してくれるのがDOMの機能です。 document.getElementById - MDC文書の構造なのにJavaScriptからオブジェクトのようにアクセスできるのはとっても大切で、表示している文字列を書き換えたり背景色を変更したり、アニメーションさせたりといろんなことができてとっても楽しいのです。
そういった便利な関数やプロパティはオブジェクトとして提供されDOMインターフェースというものを通じてボクらはアクセスすることができます。
たとえば以下のようにtableタグを作るためにdocumentオブジェクトが持つcreateElementメソッドを使ったとしましょう。
この場合var宣言で定義されたobjには何が入っているのでしょうか?
JavaScriptでいうところのオブジェクトなのには変わりないのですが、new Object()とした場合と今回のようにcreateElementした場合ではオブジェクトの中身が全然違います。
「HTMLTableElementというDOMインターフェースを実装したtableオブジェクト」というのがobjに入っているオブジェクトの正体ですね。
(なんだか長ったらしいですが・・・w)
createElementでtableオブジェクトを作った場合にはinsertRowというメソッドを持ちますが、new Object()ではそのようなメソッドは持っていません。
これはHTMLTableElementインターフェースを実装しているかそうでないかの違いです。
HTMLTableElement (Common DOM API)
DOMって他の言語でも使えるの?
DOMの機能はPerl・Java・ActiveX・Pythonなどで提供されているようです。
確かにXMLを読み込むような処理の場合にDOMが使えれば簡単にアクセスできますもんね。
PythonのDOMを使った例
# Python DOM example
import xml.dom.minidom as m
doc = m.parse("C:\\Projects\\Py\\chap1.xml");
doc.nodeName # DOM property of document object;
p_list = doc.getElementsByTagName("para");
via: 導入編 - MDC
JavaのDOMを使った例
初めにXMLの読み込み処理がありますが、それ以降はほとんどJavaScriptで使ったものと同じですね。
このようにDOMは他の言語でも提供されているありがた~いオブジェクトなわけです。
これもDOMというものを中立に考えて機能を実装してくれているからなのでしょう。
何がDOMで何がJavaScript?
ここが本題といったところでしょうか。
どこがDOM?みたいに疑問を持つことは普段のコーディングにあんまり影響はしませんが、たとえばwindow.alert()ってDOMなの?そうじゃないの?みたいに少し突っ込んでみると興味が沸いてくると思います。
alert()は引数の文字列が入ったダイアログをポップアップする DOM のメソッドです。
via: The DOM and JavaScript - MDC
とmozillaで解説されているので、これは間違いなくDOMの機能でしょう!
では以下でDOMの場所を特定して解説してみたいと思います。
なおThe DOM and JavaScript - MDCのDOM と JavaScript - 何が何をしているのか?を参考にしています。というかほぼ一緒!
サンプルコードたったこれだけです!w
これだけあれば十分です。
var obj =
ここはobjというJavaScriptの変数を作成しています。
document.getElementsByTagName("div");
Documentインターフェースを実装しているdocumentオブジェクトのgetElementsByTagNameメソッドを使ってHTMLページの順番でdivタグを取得しています。
ここで取得されるオブジェクトはNodeListインターフェースを実装している配列になります。
なのでlengthというプロパティを持ってはいますが、これはJavaScriptの配列のlengthとは違います。
NodeListインターフェースが提供しているlengthとJavaScriptが提供している配列という違いですね。
alert(
DOMの機能を使ってダイアログを表示します。
(今までにこのメソッドを何度使ったことか・・・最近はconsole.logになりつつありますが)
obj.item(0).id);
ここはちょっぴり複雑ですね。
まずobjにはNodeListインターフェースを実装した配列が入っています、そしてその一つ一つにはHTMLDivElementインターフェースを実装したオブジェクトが入っています。
NodeListインターフェースにはitemというメソッドがあり、引数に数値を指定することでdivオブジェクトを取得することができます。
そして取得したdivオブジェクトが持つidというプロパティにアクセスしていますね。
idというプロパティはElementインターフェースが提供しているプロパティです。
ということはHTMLDivElementインターフェースとElementインターフェースを実装しているということになります。
(2個も実装しているなんてなんて贅沢なっ!)
基本的なclassName、id、innerHTML、styleなどは確かにどのHTMLオブジェクトでもアクセスできるので一元的にElementインターフェースで実装しているんですね。
ほほぅ。
element - MDC
たった2行のJavaScriptを見てみましたが、こんなにもいろんな実装がされているなんて!といった感じでしょうか。
先のコードでDOMじゃない部分といえば、変数宣言のvar obj部分と;セミコロンくらいです。
それ以外が全部DOMで提供された機能だったというわけです。
DOM様様ですねw
まとめ
なんとなくDOMについてまとめておきたかったので今回の記事を書きましたが、結構ボリューム感がありました。
とはいってもmozillaのサイトに行けば、JavaScriptの仕様はたいてい記載されていますし、今は詳しく書かれた本もたくさん発売されています。
勉強するにはもってこいな時代ですね。
6年くらい前はまだAjaxもそんなに普及されていなくて、そもそもAjaxという言葉はなかったからずうっと「非同期」なんて呼んでいたりしました。
その当時はwindow.alertはDOMの機能だってことは、どこにも書いてなくて先輩とかに聞いて回ったのを覚えています。
なんかものが落ちるjQuery Plugin - JDropper作りましたで作ったオモロ~なプラグインもDOMの機能なしには語れないのです。
DOMを学びやすいJavaScript解説本
オライリー・ジャパン
売り上げランキング: 7060
やっぱりサイ本はかかせないです。
この本は重要なところを太字とかにあんまりしてくれていないので文章を読む感じで学習するのが得意な人に向いているんじゃないでしょうか。
オライリージャパン
売り上げランキング: 4564
この本最近買ったのですが、アツいですw
イラストばんばん使いまくりで、クロスワードとかも途中にあって、学習というより遊びながらな印象があります。
インプレスジャパン
売り上げランキング: 125084
かゆいところまで突っ込んで解説されているので、かなりな良本です。
雑誌感覚なので、気軽に読めるのもいいですね。
■関連リンク
・W3C Document Object Model
・Gecko DOM Reference - MDC
・org.w3c.dom (Java 2 Platform SE 5.0)
Arrayをforinするより普通にfor文で回すほうが速い
- 2008-09-01 (月)
- 技術
Arrayのlengthはいったん変数に格納してからループしたほうが速いに引き続きベンチマーク。
そういえば配列をforinで回したことがあんまりなかったので、普通のfor文とどっちが速いのかな~という疑問が沸いたので試してみた。
Arrayのlengthはいったん変数に格納してからループしたほうが速い
- 2008-08-29 (金)
- 技術
既出な内容ではあるが、一応メモとして残しとく。
配列を走査するときに、配列のlengthを一旦変数に格納したほうが速いんじゃないかという話。
実際試してみた。
コードは以下の感じでどのブラウザでも実行できるようにしました。
配列のlengthを退避せずに実行した場合
- Firefox3.0
- 12ms
- IE6.0
- 63ms
- IE7.0
- 63ms
- Safari3.1
- 31ms
- Opera9.5
- 32ms
配列のlengthを退避して実行した場合
- Firefox3.0
- 7ms
- IE6.0
- 16ms
- IE7.0
- 31ms
- Safari3.1
- 16ms
- Opera9.5
- 16ms
おお~、全然違うみたい。
とはいっても9万回以上ループした場合の結果なので、実際の開発でこれぐらいの差がでるかどうかは微妙ですが、塵も積もれば何たらってやつで意識しておけば処理の重いJavaScriptでもちょっとしたメリットはあるかもしれません。
■関連リンク
・JavaScriptの配列をも~っと深く理解する:lengthの不思議な動作 - builder by ZDNet Japan
・配列を for で回すときは length を何度も参照すると遅い - gan2 の Ruby 勉強日記
Webサイトの高速化 - styleはheadタグ内に書くと描画が速い
- 2008-08-27 (水)
- 技術
Webサイトの高速化 ルール5 CSSは上に! (Yahoo! developer netoworkより翻訳) | パフォーマンスチューニングblog | インターオフィスより
スタイルシートの読み込みは普通headタグ内で行いますが、ときとして後からHTMLに追記したスタイルがHTMLの下のほうにある場合があります。
(本当はちゃんと別ファイルとして作成しなきゃいけないのですが、直接書かれている場合があったり・・・)
こういったことをしてしまうと、画面の描画に影響を受けるということを以下の記事で知りました。
IEなどはスタイルが読み込み終わるのをじ~と待っていて、Firefoxは待たずにどんどん描画してしまうので、display:noneな要素も一瞬見えてしまうなどの問題があったりするみたいです。
スタイルシートを下のほうに配置すると、IEも含めて多くのブラウザにとって、徐々にページを表示することができなくなります。ブラウザは、スタイルが変更されてページ要素を再描画しないといけなくなるのを避けるために、ページを読み込み終わるまで描画をブロックします。そのため、ユーザは真っ白なページを見続けることになります。Firefoxは描画をブロックしません。そのためスタイルシートをロードし終わった時にページ要素を再描画する場合があります。その結果、the flash of unstyled content problem(スタイル適用前のコンテンツが一瞬見えてしまうこと)といった問題が発生する場合があります。
via: Webサイトの高速化 ルール5 CSSは上に! (Yahoo! developer netoworkより翻訳) | パフォーマンスチューニングblog | インターオフィス
ユーザビリティとして真っ白な画面が何秒か表示されているのは具合が悪いもんです。
たとえば昔、巨大なTableタグでHTMLを囲っているときがありました。
今みたいにdivタグでfloatされるのが流行る前ですね。
Tableタグはその中身がダウンロードし終わらないと描画が開始されないので、ブログとかのテンプレでこの方法を使っているとユーザーは5秒以上何もない画面を見たりしてました。
それとAjax関連で通信をしているあいだ、グルグル回るアニメーションgifとかで「今検索してますよ~」を通知して待っているあいだもユーザーを不安にさせないなんて方法も今となっては主流ですね。
ちょっとした工夫で描画が変わってくるのはなかなか実感がないですが、意識しているだけで全然違うんでしょう!
いやはや勉強になります。
キングボンビーがサイトを侵略する?jQuery Plugin - kingbonbi.js作りました
- 2008-08-23 (土)
- 技術
更新履歴
2008/08/23
- いろいろ調整しながらなので、動かなかったりご迷惑をお掛けいたします。とりあえず落ち着きました。
- ブログパーツ用のコードを変更しました。JSファイルの読み込みではなくアンカータグにしました。

なんかものが落ちるjQuery Plugin - JDropper作りましたに引き続きオモロ〜なJavaScriptを作ってみました。
なんでキングボンビーを採用したのかよく分からないのですが、お風呂の中でなんか面白いことJavaScriptで出来ないかな〜と考えていたらキングボンビーに行きつきましたw
しかも名付けて「kingbonbi.js」!!
そのままです。
ブログパーツかBookmarkletとして公開いたします。
また今回もソースコードは公開いたしますので、何かの参考になれば幸いです。
続きからご覧ください。
jDropper.jsのブログパーツとBookmarklet
- 2008-08-23 (土)
- 技術
更新履歴
2008/08/23
- ブログパーツ用のコードを変更しました。JSファイルの読み込みではなくアンカータグにしました。
この前リリースしたなんかものが落ちるjQuery Plugin - JDropperのブログパーツとBookmarkletを用意してみました。
単になんかものが落ちるだけのjQuery Pluginですが、いろんなブログ上で実行してみると背景の配色が各々のブログで違うのでなんか面白かったですw
ブログパーツ用のコード
<a href="javascript:(function(){var%20s=document.createElement('scr'+'ipt');s.charset='UTF-8';s.language='javascr'+'ipt';s.type='text/javascr'+'ipt';var%20d=new%20Date;s.src='http://lab.hisasann.com/jdropper/js/bookmarklet.js?u='+escape(document.location.href)+'&d='+d.getMilliseconds();document.body.appendChild(s)})();"><img src='http://lab.hisasann.com/jdropper/img/jdropper2.png' style='border: 0px ;'/></a>
Bookmarklet用のリンク
以下のリンクをブラウザのお気に入りにドラッグしてください
jDropper
ご利用にあたって
本PluginはjQueryを使っておりますので、ブログパーツやBookmarkletを使った場合に画面の挙動がおかしいなどの現象がある場合にはご利用にならないようお願いいたします。
jQueryのheight()やwidth()はOpera9.5に対応していない気がする
- 2008-08-22 (金)
- 技術
jQueryは1.2からheightメソッドやwidthメソッドでdocumentやwindowのサイズを取得することができるが、Opera9.5対応がされてないような気がしたのでメモメモ。
heightメソッドやwidthメソッドは本当に便利で以下のようにエレメントの幅や高さを簡単に取得することができる。
これはこれで重宝するメソッドではあるのですが、どうもOpera9.5でwindow(表示されている領域)の幅や高さを取得したときに思ったとおりにならなかった。
で、実際jQueryを見に行ってみた。
jQuery 1342行目
No~~~~~!
Operaの場合(jQuery.browser.opera)にdocument.body[ "client" + name ]で取得している。
このdocument.body[ "client" + name ]はおそらくOpera9.5未満のバージョンで有効なんじゃないかな?
今手元にその環境がないので確かめられないのだが、以下のとおり9.5からは
document.documentElement.clientWidthやdocument.documentElement.clientHeightを使うべきだと思う。
Opera 9
標準
document.body.clientWidth
document.body.clientHeight
互換
document.body.clientWidth
document.body.clientHeight
Opera 9.5
標準
document.documentElement.clientWidth
document.documentElement.clientHeight
互換
document.body.clientWidth
document.body.clientHeight
via: ブラウザの表示領域のサイズを取得する方法。 - Enjoy*Study
ということでOperaでうまく取得できないので、自作!
jQueryのメソッドをさらにラップする形にしてみました。
これでいけるっしょ!
でもこれだと今度9.5にしか対応していないから、バージョンごとに分けないといけないのか。
面倒だな〜w
次のjQueryのバージョンで直るのかな?
Safariでは画像のloadが終わっていないとwidth、heightがうまく取得できない
- 2008-08-22 (金)
- 技術
IE6.0、IE7.0、Opera9.5、Firefox3.0ではちゃんと画像の幅や高さが表示されるのに、
Safariでは画像のwidth属性やheight属性をキチっと指定しないと「0」になってしまう。
今回はjQueryを使ってサンプルを紹介していきます。
たとえば以下の場合
そんなに普段画像の幅や高さを取得したりすることは少ないかもしれないが、
意外とハマるので気をつけたい。
そしてこれを回避するためには以下のように画像のonloadを待つ必要がある。
これでSafariでようやく画像の幅、高さが取得できるが、毎回onloadイベントをbindさせるのも面倒だし、
バインドできないシチュエーションなんかもあるかもしれない。
なので単純にimgタグの中にwidth属性とheight属性を必ず書くようにする。
これでSafariの場合でも問題なく幅、高さを取得できます。
実際のデザインのときはだいたいimgタグのwidth属性とheight属性は書いているけど、
書き忘れ時にこの現象に遭遇するでしょう。
こうゆうのって意外とハマりますよね。
なんかものが落ちるjQuery Plugin - JDropper作りました
- 2008-08-21 (木)
- 技術
更新履歴
2008/08/21
- easingの種類を増やしました
- id:pyangoroさんの指摘で名前を変更しましたw
- id:ぁゃιくない(*~Д~)さんのさんまの名探偵的なゲームだと面白いという意見によりちょいゲーム化
- duration(速度)をパラメータとして渡せるようにしました
画像やHTML要素が雨のように降り注いだら面白いな〜と思ってこのjDropperを制作しました。
特にこれを使って何かが出来るわけではないですが、ブログパーツの一種として使っていただけたら幸いです。
続きからご覧ください。
Mac OS X 10.5にMT4をインストールしてみた
- 2008-08-20 (水)
- 技術
Perlの勉強としてPlaggerをおすすめされている方は多いと思いますが、せっかく普段MTを使っているのでローカルにMT4をインストールしてみました。
MT4をダウンロードする
以下のサイトからダウンロードし、解凍しときます。
Six Apart - Movable Type のライセンスと購入について
httpd.confの編集
Mac OS Xには「/Users/[ユーザ名]/Sites/」ディレクトリにhtmlファイルを置くと自動的にhttpでアクセスできるようになります。
まずはWeb共有で公開するためのフォルダでCGIが動くように設定します。
このディレクトリにある自分の名前のconfファイルを編集します。(httpd.confファイルではありません)
編集にあたって事前にコピーしてバックアップしておくことをオススメします。
[ユーザー名].confを開いて、
を以下のように編集します。
これでCGIが動く環境が整いました。
Web共有を有効にする
システム環境設定の「共有」を開きます。
そして以下のように「Web共有」にチェックを入れれば完了です。
MT4をサイトディレクトリに配置する
解凍したMT4フォルダをFinderからサイトディレクトリに配置しました。
あとは「http://localhost/~[ユーザー名]/mt4/」にアクセスすればMT4のindex.htmlが読み込まれます。
やった〜〜!
■関連リンク
Mac OS X 10.5 ( Leopard ) でCGIを使用する - sbs_tsの日記
の記事を大変参考にさせていただきました。
買った本
- 2008-08-17 (日)
- 技術
オライリージャパン
売り上げランキング: 1352
いっけん筋肉増強をさせられるんじゃないかと思っちゃうジャケットですが、JavaScriptをイラスト付きで解説しているということで購入。
4200円だからすり切れるまで読みますw
Firefoxプラグインで入力補完が使えるCSSエディタ
- 2008-08-15 (金)
- 技術

ちょろっとCSSを書きたい人向けなFirefoxプラグインです。
入力補完機能があるので、「あのプロパティどうゆうスペルだっけかな?」というときに重宝しそうです。
MacのTextMateを使っている人にはまったくもって必要のないプラグインですが、それでもちょろっとCSSには向いていますね。
以下のサイトの「Click here to download and install DiavoloTest 0.6.」というリンクからダウンロードしました。
Event.observeでセットするfunction内のthisについて
- 2008-08-14 (木)
- 技術
例えば以下のようにセットすることは多々あると思うのですが、
注意したいのは「this.id」としている部分。
ここのthisはもちろん"hoge"オブジェクトになっててほしいところなんですが、IEではwindowオブジェクトになってしまいます。
以下のサンプルではalert(this.id)でhogeが表示されてほしいところですが、windowIdが表示されます。
が~~ん!
これはPrototype.jsの中でattachEventを使ってイベントを登録しているのが原因かな~なんて思っています。
まぁIEでイベント登録するときはattachEvent使うしかないのですが・・・
ためしにEvent.observeの部分を自分で書いてみたのですが、やっぱりattachEventの部分が「windowId」になる。
さらっと使っていますが、「Event.element(e).id」を使って自分自身のオブジェクトを取得できるようです。
一応これで解決かと思いきや、まだダメなパターンがありそうです。
クリックされたエレメントの上位エレメントにイベントが登録されている場合
クリックされるアンカータグのひとつ上のエレメントにIDがふられて、そのエレメントにイベントが登録されているパターン。
この場合だとまずIEでthis.idはwindowオブジェクトだし、Event.element(e).idで取れてくるのはアンカータグのIDだし・・・
んもうっ。
結局のところ
なんか嫌だけど、こうなの?w
すんごい初歩的なところで悩んでいますが、jQuery使っているとこのあたりが非常にもどかしい。
というかもっといい方法がありそうだw
JavaScriptでアニメーション(animate)するときに気をつけたいこと
- 2008-08-12 (火)
- 技術
サンプルコードを書いていないんだけど、ちょっと基本的かつ意外とハマる問題かな~と思ったのでメモメモ。
とは言っても2点だけw
スライドするdivタグの中にはoverflow:autoなdivタグは入れないほうがいいかも
このシチュエーションは意外あると思う。
divタグ(div1)の中に複数のdivタグ(div2)が入っていて、外側のdiv1をアニメーションでスライドさせてdiv2の部分を切り替えるシチューエーションの場合、div2がoverflowをautoになっているとFirefoxでチラチラする。
他のブラウザではこのチラチラ現象は起きないんだけど、どうしてもFirefoxで起きてしまう。
(IE6.0、IE7.0、Safari3.1、Opera9.5ではチラチラしない)
解決策
これを防ぐにはoverflowをhiddenとかにしてautoじゃない状態にする。
ちなみにjQueryでは、animate関数(3026行目の中でこのチェックをしているがアニメーションするdivタグの中にいるdivタグには適用されないので自分でhiddenにする必要がある。
アニメーションする前にhiddenにして、アニメーションが終わったらautoに戻す感じね。
スライドするときにmarginをマイナスとかにしてスライドするとIE6で重くなる場合がある
jFlowというスライド用のjQueryプラグインではmarginLeftやmarginT




