飴屋

2010年1月〜3月の日記

2010/3/14

jQuery UIのsortableを使うことにしたのですが、入れ子のリスト要素を扱う時に不思議な挙動が起こったので、その現象に対応したメモです。

<ul id="list">
<li>list1</li>
<li>list2
<ul>
<li>list2-1</li>
<li>list2-2</li>
<li>list2-3</li>
</ul>
</li>
<li>list3</li>
<li>list4</li>
</ul>

こんな2階層の入れ子をしたリストに

$('#list').sortable();

こんな指定をするだけで要素の入れ替えが可能になるので便利なjQuery UIですが、list1〜4(トップレベルのリスト要素)のドラッグは問題なく行われるものの、list2-1〜3(セカンドレベルのリスト要素)のドラッグを行おうとすると、親要素のlist2もsortableな状態になっているため、トップレベルのソートとセカンドレベルのソートが同時に行われようとして画面がめちゃめちゃになります。

sortableのAPIリファレンスをパラパラ覗いても解決策が見つからなかったので、自分で解決することになりました。Googleで調べると、解決するようなプラグインが存在するような話があったのですが、道具を使うための道具を使うための道具を手に取るようなのでなんとなく気分がのりません。もっとシンプルに考えられそうな気がしたので、とりあえず入れ子のリスト要素のmousedownイベントの伝播を止めてみました。

$('#list ul').mousedown(function(event){
event.stopPropagation();
});

li要素で伝播をとめるとsortableじゃなくなってしまうので、ul要素を指定しました。すると何だかちゃんと動いてくれました。IE8で動いたので後で他のブラウザでの挙動を確認してみます。

追記

最新のブラウザ群とIE6,IE7あたりで問題なく動いたのでこれでよしとします。

2010/3/5

Google AppEngine for Pythonにて、ローカルでテストしたスクリプトをdeployする際に、いつの頃からか「SSLモジュールがありません」的な警告が発せられるようになりました。通信経路の間に入られて自分のアプリが改ざんされる可能性については皆無なように思いましたが、毎回警告されるのも気持ちがいいものではないので、重い腰を上げて対策することにしました。

http://pypi.python.org/pypi/ssl

とりあえず警告の指示に従って上記のページからSSLモジュールのソースコードをダウンロードし、setup.pyを実行してインストールを試みました。しかし、「PythonはVisual Studion 2003でコンパイルされています。compatibleなバイナリを生成しようと思ったけど、PCにVS2003が見つからないよ」といったようなメッセージが表示されるだけでした。VS2003って・・・。

検索してこのメッセージに対抗しようとしたところ、Pythonのフォルダの中の「Lib\distutils\msvccompiler.py」の中の記述が古すぎるのが問題ということのようでした。日本語でもVS2005に対応する方法を書いてくれていたサイトがあったので、同様の変更でVS2008やVS2010でもきっとコンパイルできることでしょう。

でも、世界にはきっとバイナリを配布してくれている人もいるんじゃないかと思っていたら、Google Groupsでこんなスレッドを発見しました。

http://groups.google.com/group/google-appengine-python/browse_thread/thread/a905f1fff436d6b6/21cd6998ea879d2e

投稿の中でSSLモジュールのバイナリにリンクが張ってありますね。バイナリっていうかインストーラーですね。

2010/1/25

JavaScriptでデータをやりとりするとき、

var hoge = [
'hoge',
'hoga',
'hogu',
];

なんてやりたくなりますが、IE7、IE6で

expected identifier, string or number

なんてエラーで怒られました。FirefoxとIE8では許容されてしまう記述だったので、ついつい配列の終わりにもカンマをつけちゃってましたが、古いブラウザを考慮しなくてはならないケースだと大問題ですね。テンプレート処理でJSファイルを吐きだすときに、カンマで終われると楽だというだけの話なんですけどね。とりあえず、

var hoge = [
'hoge',
'hoga',
'hogu',
''];

こんなのでお茶を濁して、配列の処理部分で空文字を避けるという場当たり的なソリューションで問題を回避してみましたが、もっといい方法を考えてみたいです。JavaScriptの市民権が確立してきたので、古いブラウザのスクリプトエンジンのことをもっと知っておかないとならないようです。

後、今年(2010年)の日記の日付に「2009」と書いていたのを修正しました。恥ずかしい・・・。

先日のLocalConnectionが重複して、コネクションが確立できなかった件については、コネクションを張るためだけのコネクションを用意することで問題を回避しました。コネクション名が重複しないようにFlash起動時の日時をコネクションの名前に付与したかったのですが、Flashその1からFlashその2を開いている場合、Flashその2に日時データを送信する方法が不明だったので、日時データ送信用のLocalConnectionを用意して、それ自体は用が済んだら即刻閉じてしまうというやり方なので、ややこしいことこの上なし。Flash内部にSWFファイルを読み込む際に、内部のSWFファイルに引数を渡すような仕組みがあったら知りたいです。

2010/1/17

IE8で起こった現象です。FF、Safari、Chromeでは発生せず。
原因は特定できていませんが、以下のように推測して調査中。

  1. LocalConnectionを使ったFlashを表示する。
  2. jQueryでFlash部分をremove
  3. 再度、同じFlashを同じ場所に開く
  4. Flashの処理が途中で落ちる
  5. 最初のFlashのLocalConnectionが残っていて、新しいFlashでLocalConnectionを張ろうとしても張れないのが原因ではなかろうか?

さてどうしよう。

2010/1/8

MovableTypeのバージョンを5から5.01にアップグレードしてくださいとSixApartからメールが来たので、何事かと思って早速アップデートしました。なんでも権限を愉悦して管理画面にアクセスできることがあるとかなんとかで、その対応のためのセキュリティアップデートだったそうです。

でも、個人的には更新PING送信先から「wide character in syswrite」的なエラーメッセージが返ってこなくなってくれたのが一番うれしいです。自分で対策しようか悩んでたところでした。perlのutf8フラグあたりで何か変化があったのかなと思ってますが、現象が消えたので自分で調べる気力がなくなりました。

2010/1/2

新年明けましておめでとうございます。今年は昨年よりもよい年にしていきたいですね。

さて、心機一転、自分の管理するサイトのMovableTypeをバージョン4系からバージョン5へとアップグレードしてみようかなと思いたち、実行してみたところ、概ねうまくいきました。データベースのアップグレードはMT自身が行ってくれるので楽ですね。MT5からサイト管理の機能が加わり、ルートにindex.htmlを吐きだそうとするのでそれを消し、管理画面のテンプレートを少し自分好みにいじったら、はいできあがりです。

と思いきや、自作プラグインの挙動がちょっとおかしくなっている模様。プラグインの内容は簡単に言ってしまえば記事の本文中で一部のWiki記法を使えるようにするというものなのですが、WikiNameからリンクを作成する処理がMT5にアップグレードしてからおかしくなりました。

原因はperlのutf8絡みのものでした。フィルタプラグインに渡される記事の本文の文字列が、MT4まではutf8フラグが立っていなかったので、以下のような簡単なURLエンコードの処理で問題なかったのですが、MT5ではフラグが立っているのが問題のようです。

$wikiname =~ s/([^\w])/'%'.unpack('H2',$1)/eg;

utf8フラグが立っている場合、正規表現の\wの意味が変わりますし、H2というフォーマット指定だと先頭1バイト分しかunpackされませんでした。

utf8::encode($wikiname);

手前に上記のような記述を追加したら、問題を解消できました。

開発日記

Last-Modified