飴屋

開発日記/2010年の日記

2010/9/27

MovableType OpenSourceの5.03を使っていたら、FirefoxでJavaScriptのエラーが発生しました。原因はまだ不明ですが、「mt-static/js/mt_core_compact.js」の284行目でappという何かのインスタンスがis not defined状態とのことです。

元々あった問題なのか、はたまた自分でいけないところをいじってしまったのが原因なのか、はたして。

2010/9/6

FlashDevelopを使っていて、つまったのでメモ。
ActionScript3のお話です。

SWFファイル中のシンボルを読み出そうと思い、以下のようなスクリプトを書きました。

[Embed(source = hoge.swf', symbol = Hoge)]
private var Hoge:Class;
private var hoge:MovieClip;

hoge.swfを制作する際にライブラリの中にHogeというMovieClipを継承したクラスをリンケージしています。

hoge = new Hoge();

で、Hogeのインスタンスを新しく作成する段になって・・・

[Fault] exception, information=TypeError: Error #1034:
強制型変換に失敗しました。aaa::bbb_Hoge@ccc を flash.display.MovieClip に変換できません。

というメッセージが登場しました。いつもこんな感じで書いてた気がしますが、何か作法を間違えたんでしょうか?ググッてもよく理由がわかりませんでした。
理由がわからず、解決策もわからなかったので、hoge.swfじゃなくてhoge.swcを出力して、それをAdd To Libraryしました。

が、コンパイル失敗。Embedのあたりを消し忘れて、クラス定義が重複してました。消したら、とりあえずOK!

さて、原因が不明なのが怖いです。

2010/7/26

たまにハマってしまうjQueryを使ったAjaxの解放のメモ。よくひっかかる割に、何度も調べ直している気がする・・・。

jQueryのloadメソッドを使うと動的にWEBページAを読み込んで、WEBページBの中に出力できますが、出力内容が文字化けすることがあります。jQueryがページの文字コードを正しく認識していないのが原因なので、何らかの方法でそれを通知してあげるとよいそうです。でも、jQueryの中身をあまりいじりたくないので、WEBページAの置いてあるディレクトリに.htaccessを置いて、その中に明示的に文字コードを指定する方法をよく使います。

AddType "text/html; charset=Shift_JIS" html

Shift_JISのサイトの管理の案件はまだまだ多いです。

2010/7/13

Androidアプリ開発準備中に起こった問題と解法のメモ
AndroidのSDKをアップデート中に「a folder failed to be renamed or moved」というメッセージが出て、アップデートが未了のまま終わってしまいました。エラーダイアログにはAntiVirusソフトの影響が濃厚とありましたが、AntiVirusソフトの動作していない環境でも発生しました。ちなみにAndroid2.1の2番目のリリース版を更新中に発生しました。

海外のサイトを眺めていると同様の現象が多数報告されており、いくつか解決策が提示されていました。そのうち以下の方法で、解決しました。

  1. Android SDK and AVD Managerが起動していたら止める。うちはeclipseから呼び出していたので、それを停止しました。
  2. androidSDKの入っているフォルダ中、「tools」フォルダを同じ階層にコピーして、「tools-copy」とでも名前をつける。
  3. 「tools-copy」のフォルダの方の「android.bat」ファイルからAndroid SDK and AVD Managerを起動する
  4. 所定の操作でSDKをアップデートする(成功した!)
  5. 「Android SDK and AVD Manager」を閉じて、「tools-copy」のフォルダを削除する

きっとtoolsフォルダ内の必要なファイルがOSによってロックされたか何かで、インストールが正常に行えなかったのでしょうね。自分を守るために、自分を更新できないジレンマ・・・みたいな。

2010/6/28

PostPetのキャラクターを使ったtwitterクライアントをペットワークスさんが開発中らしい。

http://postpetnow.jp/

ポストペットの生みの親の八谷さんのつぶやきなども見ていると面白いです。

http://twitter.com/hachiya

今回はおやつの作成ソフトが入り込む余地が・・・あるかな?

2010/4/28

http://mixi.jp/view_appli.pl?id=11085

開発中だったmixiアプリ、「つぶやき型生物 ツブタン」がカテゴリ登録され、無事に公開となりました。ご協力いただいた方々、大変ありがとうございました。土日を含めて申請から5日程度での公開となりました。仕事早いですね、mixiさん。

とにかく連休に間に合ったので、いろんな人に触れてもらいやすいかもしれません。どんな反応がいただけるかとても楽しみです。

2010/4/14

jQueryのバージョン1.4.2で起こったトラブルについてメモ。
htmlメソッドでページの要素書き換えを行う際に、cleanDataメソッドで一度要素の中身が消去されます。そこでは、メモリリーク防止のためにjQuery.cacheオブジェクトを参照しながら、要素のイベントを消しこむ処理が含まれています。しかし、一部の要素はjQuery.cacheにキャッシュされていなかったらしく、イベントの消しこみの段階でエラーが発生してしまいました。

・・・さぁ、どうしましょう。

追記

jQuery.cacheされていないというのは誤解でした。
contenteditableな要素の中で新たに追加された要素に同じ識別子が付与されているために、cleanDataで順番にcacheを消していく行程中、同じ識別子を持つ二番目以降の要素がcacheを消去できなくてエラーが出ていた模様です。同じものは二回消せない・・・当たり前。

この問題は、ユニークな識別子がつくことを前提にjQueryが動いているために起こっているので、ユニークな識別子を保障してあげることで解決できる・・・ということでしょうか。

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);

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

開発日記