飴屋

開発日記/2011年の日記

2011/11/7

FlashのStage3Dを使おうと思って悩んだメモ。

現象

いつの頃からかなんか思った位置にオブジェクトが配置されない

原因

Context3D.setProgramConstantsFromMatrixでシェーダーとは無関係なMatrix3Dを設定していた。AGALをいじってシェーダーに二つのMatrix3Dを使った座標変換をさせようとしてたけど、やっぱり辞めようってなって、二つ目のMatrix3Dを設定したまま放置されていたらなぜか影響が出てしまっていたらしい。

対策

余計なConstantsの設定を辞めた。

結果

元に戻った。Context3D.setTextureAtで使わないテクスチャを登録しといても怒られるかも。

2011/10/9

FlashDevelopのコード補完がきかないなーと悩んだのでメモ。

現象

  • 自作クラスに関してコード補完がきかない
  • 自作クラスに関してテキスト色が変わらない
  • クラスパスは通っている
  • コンパイルも通る

原因

  • ネットワーク越しのライブラリはひょっとしたらうまくFlashDevelopに認識されないかも

対策

  • 必要なライブラリを含むネットワーク上のフォルダをネットワークドライブに割り当てた

結果

  • 問題は解消されました。万歳

2011/7/20

東日本大震災を受けて、IT業界からも多くの人が支援に立ちあがりました。携帯電話がなかなかつながらない状況で、連絡網を着実に作り上げられていく工程はなかなかお見事でした。twitterやgoogleの特別サービスもかなり大きいインパクトがありました。

でも、なかなか一個人ができることは少ないなと思っていたところ、宮城県石巻市の復興プロジェクト「石巻2.0」の関係者の方からお声をかけていただき少し協力させていただくことになりました。

東日本大震災で大きな被害を受けた宮城県石巻市を単に復興するのではなく、被災以前よりも住みよい街を目指そうというというとても前向きなコンセプトのもと、広告代理店さんや都市再生に関連するヨーロッパの大学の学部と連携を取りながら、石巻市で様々な企画を運営しているようです。廃材を利用して家具を作ったり、フットサルの大会を開いたり、映画を上映したり・・・そのうち復興を行いながら、町の機能性を再検討するような段階もくることでしょうね。石巻市の住民の士気は相当高いようです!

石巻市に限らず、東北地方が再起するためのプロジェクトが多数立ちあがっているようです。日本の将来も捨てたものではなさそうです。

2011/5/13

久しぶりにAndroidアプリを作ろうとeclipseを立ち上げて、新しいプロジェクトをコンパイルしようとしたら、「Error generating final archive: Debug Certificate expired」なる表示が出てきました。このメッセージが古いプロジェクトをコンパイルしようとしても表示されるので、はてさて何の有効期限が切れたんだろうと思って調べたところ、「debug.keystore」というファイルの有効期限が切れているので一度削除すればよいとのことでした。

Windows環境では、「利用ユーザのフォルダ\.android\debug.keystore」が該当のファイルだそうで、削除して再度コンパイルすると再作成されるらしいので、メニューから「Project」→「Clean」を実行しました。

そしたら今度は「R cannot be resolved」というエラーが発生しました。どうもR.javaがクリアされた後に再作成できなくなっている模様。ということはリソースに問題があるのかな、とリソースファイルを開いてみるとグレーの画面に「eclipse is loading the sdk」という文字以外何も表示されません。

なるほど、最新のAndroid SDKをダウンロードしたけど、Eclipse側のプラグインが古いのかなと、プラグインの更新をかけたらビンゴでした。定期的にいじらないといろいろ一度に問題が発生して大変です。

2011/5/1

昨日のFlashとJavaScriptの連携の件が意外と根深かったのでもうちょっと考えてみることにしました。

Flash上でExternalInterfaceを介して、外側の仕組み(JavaScript)などに提供される関数をJavaScriptから呼び出すのが目的です。この関数へのアクセス方法がブラウザによって異なることから分岐処理が必要でした。

これまで以下のような感じでアクセスしていました。

IE6-8
window['flash_no_id'].hogemethod
FF3,Safari,Chrome
document['flash_no_id'].hogemethod

要するにIEだけ特別扱いすればいいようなので、「document.all」の真偽でアクセス方法を分岐していました。

ところがIE9では「document.all」が真(true)を返却してきたので、正しくないアクセス方法に分岐していることに気がつきました。そこで昨晩、小手先の対応を行ったら、他のブラウザで問題が発生したので、もうちょっと考えることにしました。

<object id="flash_no_id" name="flash_no_id"><embed name="flash_no_id" /></object>

こんな構造でembedタグにid属性は重複してつけないようにしていたため、Firefoxのバージョン4でも「document['flash_no_id']」にアクセスできなくなって困りました。結局、IEはjQueryの$.support.noCloneEventの真偽で判断して、FF4だけ別途分岐をさせるという格好悪いスクリプトができあがりです。タグの構造から書き変えないときれいコードにならなそうですが、embedタグがHTML5で正規に採用されそうですので、どうタグ付けするのが将来的によいのか判断できません。

もうFlashとか使わないでcanvasタグ使ってねっていう流れもありますが、Flashにしかできないことがいくつもあるのでなかなかそういうわけにもいきません。iPadにFlashPlayerが載ることはまだまだないのかなぁ。

2011/4/30

PukiWikiと他のシステムを連携させようと思い立ちました。そこでとりあえず、PukiWikiの記事タイトルの一覧を取得してみることにしました。PukiWiki内には記事タイトル抽出用の関数が lib/file.phpに用意されていました。

function get_existpages($dir = DATA_DIR, $ext = '.txt')
{
$aryret = array();

$pattern = '((?:[0-9A-F]{2})+)';
if ($ext != '') $ext = preg_quote($ext, '/');
$pattern = '/^' . $pattern . $ext . '$/';

$dp = @opendir($dir) or
die_message($dir . ' is not found or not readable.');
$matches = array();
while ($file = readdir($dp))
if (preg_match($pattern, $file, $matches))
$aryret[$file] = decode($matches[1]);
closedir($dp);

return $aryret;
}

なるほど記事保存用のディレクトリの中のファイル名をデコードするだけでよいのか。perlで書きなおすのも簡単そうです。

もうひとつ。

var player = document.all ? window["flash"] : document["flash"];
player.func();

JavaScriptからFlashの関数を呼び出すときにブラウザごとに処理を分岐させていた部分があったのですが、InternetExplorer 9ではdocument["flash"]の方に関数の定義があるようで、この分岐処理だと正しく関数が呼ばれませんでした。

var player = (document.all && window["flash"].func) ? window["flash"] : document["flash"];
player.func();

とりあえず、関数の登録有無もチェックするようにしてみましたが、もっとスマートにかける方法がありそうですね。

2011/3/22

お仕事でWPFを利用する機会があったのですが、しばらく利用していなかったためいろいろ忘れていて再勉強することになりました。そして改めてXAMLによる定義型の優位性や、データバインディングによる対話性の向上を認識しました。データバインディングは放っておいても勝手に値の同期がとれるものだと思い込んでいたのですが、コードでデータを更新したときはちゃんと通知してあげないといけないんですね。そのためのインターフェイスを初めて使いました。思い返せば、前に勉強した時はやりたいことを実現する方法しか勉強してませんでしたね。

WEB系の仕事が多いので、今後WPFに触れる機会がどのくらいあるのかわかりません。Silverlightのお仕事よりもFlashのお仕事の方が多いですね。確かWPFはブラウザ上での3Dのシェーディング目当てで勉強を始めたのですが、FlashもそろそろMolehillというプロジェクトの成果がお披露目されて、GPUを使った3D描画ができるようになりそうです。Silverlightの利点はそうなるとビデオのコピープロテクト技術あたりが差別化要因となるのでしょうか?なかなか策定されないHTML5の存在もあり、技術者の方もテクノロジーの選択に苦悩のときです。

今回の作業でXAMLの要素の名前に"Name"とつけたら

'***.MainWindow.Name' は継承されたメンバ 'System.Windows.FrameworkElement.Name' を非表示にします。非表示にする場合は、new キーワードを使用してください。

と変な警告が出て悩みました。XAMLの名前空間のこともちゃんと勉強しないと、適当な命名ができません。そういえば「x:」っていうプリフィックスのことも何か前と違うような気がしました。まぁ、古いことは忘れることにします。

C#もバージョンを重ねて、言語としての機能が充実してきているようですね。WindowsPhoneが流行ったら、コア部分以外の実装に使うことになるんでしょうか。

帳票関連の実装でDataGridがすごい役に立ったので助かりました。私の空白の期間に増えたコンポーネントらしいです。WPFの進化もおいかけていた方がよかったのかなぁ?

東北と関東を襲った大地震と津波、それに関連した一連の震災を受けて、生活が一変してしまった方もたくさんいらっしゃると思います。私や私の家族は無事でしたが、私の住む町の被害は小さくはありませんでした。計画停電でIT職としては業務に支障もでてきております。防ぐべくもない自然災害ですが、せめて事後のことだけでもしっかりやっていこうと思います。そんな中でtwitterの活躍や有志によるITを使った被災者支援など、新しい時代が感じられることがしばしばありました。日本の未来の姿はけっして暗くないと思います。

2011/2/28

jQueryで画像のスライダーを作っていたときのメモです。

要素がhideメソッドなどで隠されている時、positionメソッドで要素の座標を調べたら(0,0)が返ってきました。visibilityがhiddenになっているのと、displayがnoneになっているのでは意味が違うのでしょうねとは思いながらも、ちょっと不便です。とりあえず、hideメソッドで消す前に座標をjQuery.dataメソッドで保持しておくことにしました。

さらにdisplayがhiddenの画像のサイズがwidth:0xheight:0で返ってきたのでonloadイベントで画像を取得する際に困りました。showメソッドで表示した直後にloadイベントを再度呼び出してみましたがちょっとタイミングが遅くてフォローが大変でした。

2011/2/2

HTMLコーディング作業中、IMGタグのwidth、height属性をつけるのを簡便化するスクリプトを制作して使用していたのですが、PhotoshopをCS3からCS5にアップグレードしたあたりを境にうまく縦横サイズを取得できなくなってしまいました。確認するとGIFやPNGファイルは問題ないのですが、JPEGファイルのときだけうまくいかないようでした。他のプログラムがこれらのJPEGファイルを正しく扱っているところをみるとJPEGファイルが壊れているわけではないようです。

不便なので調査に乗り出したら、やはりスクリプト側の問題でした。JPEGファイルの中身は複数のセグメントに分かれていて、SOFというセグメントに画像の縦横サイズが書いてあるのですが、これまでずっと\xFFC0というSOFセグメントの目印(マーカー)を探していました。CS3の頃はこれで特に問題ありませんでしたが、どうもJPEGにはSOFセグメントの種類が16個あるのだそうです。それぞれのマーカには\xFFC0-\xFFCFが割り当てられているので、どれかを探してやるように修正を加えたところ、これまで通り縦横サイズが取得できるようになりました。

SOFセグメントが変更されたということは、圧縮方式とかが変わってるのでしょうか?詳しいことはわかりませんが、きっと何かこれまでよりきれいなJPEGになってるんじゃないかと推測されます。

2011/1/29

もうすぐ日付が変わって、サッカーアジアカップ決勝戦です。テレビをつけながら、mixiのイイネ!ボタンとfacebookのLikeボタンをくっつける作業をしていました。

Likeボタンをつけるにあたって一部のページがうまくLikeできなかったので以下にメモ。
GETメソッドでパラメータを付加するページでは先頭のパラメータ以降はクエリーがカットされる模様です。

http://example.com/wiki/?cmd=read&page=SamplePage

こんなPukiWikiのURLに「Like」をしようとしたら、お勧めのURLは、

http://example.com/wiki/?cmd=read

となるので、PukiWikiでは不正なWikiNameへのリンクのページとなってしまいました。
そういえば、Googleの検索ロボットにも同様のルールがあったように思います。

http://example.com/wiki/?SamplePage

PukiWikiの場合はこんな風にもURLを指定できるので問題ないですが、サイトによってはLikeできないページができてしまうのかもしれません。

2011/1/3

あけましておめでとうございます。
今年の目標をまだ決めかねていますが、「大量出力」というのが有力です。
質的な向上よりも「量」を上位に置いてみようかなという試みです。
Twitterなどはそのプラットフォームとして最適な気がします。ブログやSNS、このWikiなども適材適所で使ってみましょう。そしたら何か新しい形態がみえてくるかもしれませんね。

開発日記