2012年01月31日

Prototype.jsとjQueryの共存について

最近、私の周りで少しPrototype.jsとjQueryの共存について話題がありました。
ネットを見ると、当然たくさん対応方法があるのですが、私なりにも簡単にする方法を考えました。
とはいえ、このネタ自体、すでに古いものなので、さすがに今更もう情報として必要とする方もいないでしょうが、もしもの参考のために今までの方とは違うアプローチもあるんだなと思っていただければと思い、公開します。

多くのネットにあるアプローチは簡単です。
jQueryにが外部ライブラリと競合しないようにするための機能が提供されています。
具体的には下記のように、jQuery.noConflict();を利用する方法です。
このjQuery.noConflict()自体はjQueryオブジェクトを返却しますので、
下記のように$j等、適当な変数に格納します。これを$の代わりに利用します。

var $j = jQuery.noConflict() (function($) {

// jQueryの$を利用可能
});

もしくはもっとシンプルに、$を利用しないで、jQueryを利用する方法もあるでしょう。
こうすれば、function($)内では$をjQueryオブジェクトとして利用できます。

jQuery(document).ready(function($){

// jQueryの$を利用可能
});

これらの問題は、function($)の中でのみ有効であるという点です。つまり、その外でロードされるjQueryプラグインは書き換えが必要となります。
もしくは、PHP等を使って下記のように本体にインクルードする方法もあります。

var $j = jQuery.noConflict() (function($) {


});

これの弱点は、実行時には必ずPHPが必要で、ちょっとHTMLのレイアウトをローカルで確認するには不向きです。


私の考えるアプローチは2つです。

1. これからはjQuery一本でいく。よって、jQueryは$で、Prototype.jsの$を別名に変換しましょう
2. 動的にjavascriptファイルをロードしてしまおう

1. これからはjQuery一本でいく。よって、jQueryは$で、Prototype.jsの$を別名に変換しましょう
これは既存のPrototype.jsからhtmlから全て、"$("を"$p("に全置換してしまいます。
こうすると、今までのPrototype.jsの$()は全て$p()で利用することになります。
こうすれば競合しませんし、jQueryのプラグインもそのまま利用することができます。

これはPrototype 1.6.1でのprototype.jsファイルを何も考えず、普通に"$("を"$p("に全置換してしまって問題なさそうなことは確認済みです。
あとは、jQueryをまだ使っていないhtmlも同じように置換すれば、($ ()と記述されたりしていない限りは)リプレース可能です。

でも、やっぱり面倒です。

2. 動的にjavascriptファイルをロードしてしまおう

この方法はとても無理やりです。簡単にいえば、scriptタグを利用しないで動的にjavascriptファイルをロードしてしまいます。
先に見てしまうほうが早いでしょう。











jQuery.noConflict()のfunction($)内でloadJs()メソッドを呼び出します。引数にはロードしたいjavascriptファイル名を指定します。
loadJsの中ではjQuery.ajaxでjavascriptファイルをgetします。その時、dataFilterで取得したテキストの前後に以下を追加しています。

* 前 : _$=window.$;window.$=jQuery;
* 後 : ;window.$=_$;

前は、$はPrototype.jsの$ですので_$にバックアップし、$をjQueryオブジェクトにすり替えます。
その後、jQueryプラグインが動作し、終了後、バックアップした_$を$に戻し、Prototype.jsに戻します。先頭に;が付いているのは、最後に付け忘れとかないよう念のためです。

ついでにajaxでgetしてくる際、効くかどうか分かりませんが、一応キャッシュを有効にしています。ちょっと試した限りではよくわかりませんでしたが。。。

こうすると、scriptタグではありませんが、その代わりにloadJs()を利用し、jQueryで記述されたプラグインを、変更なしでロードすることができます。

ちなみにこのサンプルはダウンロードできるように準備して見ました。
サンプルでは、loadJs()関数は外出ししています。何の制約もかけない著作権も訴えませんので自己責任でご自由にご利用ください。
必要なjsファイルは全く入れておりませんが、ダウンロードしてみてみたい方はこちらをクリックして下さいませ。
私はこれでjQuery UIやその他star系、blockUI系のプラグインが正常動作するのを確認しました。

すでにカタがついている問題かと思いますが、調べた限り、私の気に入る回答がなかったので作って見ました。もしかしたらすでにもう、他の方がこの方法に到達しているかもしれませんが。。。
その時はごめんなさい。
posted by Kiruahさん at 01:00| Comment(2) | TrackBack(0) | ノウハウ

2012年01月30日

VersioningMdb 0.1.5の公開

VersioningMdbのバージョンアップは久しぶりです。

今まではテーブル定義とリレーション定義をインポート・エクスポートすることが出来ず、取り扱えるデータが非常に不完全でした。

VersioningMdb ver 0.1.5では上記のインポート・エクスポートも行えるようになり、一時的にリレーションを保存したり、保存した情報から元に戻すこともできるようになりました。

後は、まだ未実装ですがリレーションを削除するなど、直接バージョン管理ツールにコミットできるようにするのが目標となっております。
この機能のリリースが遅くなってしまい、申し訳ございません。

リスト表示の速度が遅いため、コントロールの変更も必要ですが、そこも修正をもう少しお待ちいただければと思います。

詳細のページはこちらからです。ライセンスにご注意くださいませ。
posted by Kiruahさん at 22:52| Comment(0) | TrackBack(0) | アナウンス

2012年01月07日

iPod touchのアーティストが不明になる

実は2011年の年末に白のiPod touchを購入してしまいました。
本体がだいぶ安くなりましたので、少し迷いましたが買ってしまった感じです。
買ったおかげで、平日はちょっとしたことだけをネットで調べるのに、いちいちPCを起動していたので、だいぶ負担が楽になりました。
これだけ安くなったということは、もうすぐ新しいiPod touchが出るのかもしれませんが、外で音楽を聞くのをメインにするために購入したので、新しいのが出ても追随はしないと思います。
ですがネットを見るには不便なので、iPadの新しいのが出たらそちらは購入したいなぁとか、少しだけ考えています。

さて、過去に自分のCDからMP3へ変換したファイルをiPod touchに入れようとすると、どうしても坂本真綾さんのアーティスト名が不明になってしまい、困ってしまいました。
(絶対にCDでは聞かない!MP3ならCDを落としたりしないから!と心に誓っております。。。)

原因は何だろうと探ってみておりました。
1. そもそもMP3のID3タグが変な形式で保存されている?(そんなはずは。。。v2.3はダメとか。。でも、UVERworldは大丈夫だ。)
2. 実はタグを見ていないで別の情報を参照しているとか?
3. 実は坂本真綾という漢字が難しいとか?エンコーディングがSJISではダメとか。。。

1については、UVERworldが見えているので大丈夫でしょうと考えておりましたが、一応ID3タグのバージョンを変えたり、削除した状態で入れたり、その後、追加してみたり、色々な形態のファイルを用意して見ましたが、UVERworldはOKで、坂本真綾の曲はダメでした。。。
2については、UVERworldのファイルを色々と編集したりファイル名を変えたりしましたが、タグ情報を参照しているのは確実でした。
3がやっぱり怪しいので、まずは坂本真綾のアーティスト名を"a"とか適当に入れて見ました。アルファベットの場合はOKでした。。。"a坂本真綾"とすると、これもOK。漢字がNGだとかエンコーディングの問題かと思いましたが、"a坂本真綾"が出たことで、「どこかに半角文字が含まれていないと出ない」に落ち着きました。。。

試しに"坂本 真綾"は正しく表示されました。。。
必ず半角スペースを入れられればOKですが、間に入れられないアーティストはどうしたらいいのでしょうか。。。
昔のiOSとかは大丈夫だったりしたとか、実はiTunesから買ったファイルはOKとか、MP3以外の形式にすればOKなのでしょうか。。。

また色々と試してみて、より良い解決策が見つかったらブログに書いてみようと思います。
続きを読む
posted by Kiruahさん at 13:30| Comment(0) | TrackBack(0) | 日記

2012年01月02日

元旦から1日遅れてしまいましたが、新年明けましておめでとうございます。

2012年が始まりました。今年はどんな年になるかはわかりませんが、
奥様共々幸せに過ごしたいと考えております。

奥様、今年もよろしくお願いいたします。

今年は2011/12/31の深夜から出かけて、日枝神社や新井薬師さんに
はしご初詣しました。おかげさまで、元日は眠かったですが。。。
そして気づけば1/2。。。昨日は昼間、何をしていたのだろうか。。。

では皆様にも幸ある一年でありますように。
さぁ、プログラミングをがんばろうっと。
posted by Kiruahさん at 07:34| Comment(0) | TrackBack(0) | 日記