2012年2月15日

FlashをHTML5に自動変換


「Google Swiffy」を使うと、SWF形式のファイルをHTML5に自動変換してくれる。
クラウドツールで使う事もできるし、Adobe Flash Professional CS4のExtentionをダウンロードする事もできます。
下記は、実際にSWFファイルをアップしてHTML5に変換されたものと比較表示された画面。

2012年1月14日

SHELL32.dllにおけるWindowsバージョンの違いによる不都合。


先日、僕が公開しているファイル検索ツールFileDiverのユーザから不具合のご連絡頂いた。WindowsXPにおいて下記のようなメッセージが出て起動できないというものである。
「プロシージャーエントリーポイントSHGetKnownFolderPathがダイナミックリンクライブラリ
SHELL32.dllから見つかりませんでした。」
著者のテスト環境は現在、VistaとWindows7でXP以下についてはアプリケーションの互換モード設定を使って確認している。勿論互換モードではそのようなエラーは出ていなかったはずで、再度互換モードで確認しても再現できない。
そこで念の為、XPの入った古いパソコンを引っ張り出して、インストールしてみると・・・確かにエラーが出る。
LocalLow は、Vista以降で導入されたアプリケーションが一時的に蓄積する場所でSHGKownFolderPath()で取得する事が出来る。したがって、アプリケーションの動作しているバージョン番号をチェックして、Vista以上でSHGKownFolderPath()を呼べば良いはずである。XPではSHGKownFolderPath()はコールしていないにも関わらず・・・。
「どういうこと?」
ネットをあさってみると、やはり同じような対処方法しか書いていないが、一部海外のもので同じような現象で困って、XPで動くVista用のshell32.dllを作って取り換えるという荒技などを紹介したサイトがあった。
これはもしかしてと思い次のようなコードを書いて、Vista以降で呼ぶようにしたらXPあっさり動いた。アプリケーションが使用するWindowsの基本DLLにあるメソッドを全てリストアップして、あれば起動時にエントリーポイントをロードしているようである。
したがって、たとえ実際に動作時に1度もコールしていなくても動作環境のDLLになければエラーが発生する。これは全ての同様なアプリケーションで発生する可能性のあるワールドワイドな不都合だ。
Microsoftは、WindowsXPのSHELL32.dllにも、ダミーのSHGKownFolderPathメソッドを作成してWindowsUpdateで配るべきだと思う。
CString getLocalAppDataLow() {
typedef HRESULT ( WINAPI *FPSHGetKnownFolderPath )( const GUID&, DWORD, HANDLE, PWSTR * );
CString strPath;
HRESULT hr;
HMODULE hLib;
hLib = LoadLibrary( _T( “shell32.dll” ) );
if (hLib ) {
FPSHGetKnownFolderPath func = reinterpret_cast<FPSHGetKnownFolderPath>( GetProcAddress( hLib, “SHGetKnownFolderPath” ) );
if ( func ) {
LPWSTR pstr = NULL;
hr = ( *func )( FOLDERID_LocalAppDataLow, 0, NULL, &pstr );
if ( !FAILED( hr )) {
strPath = pstr;
}
}
FreeLibrary( hLib );
}
return strPath;
}

2011年12月27日

世界に恥ずかしい仕組み「SPモード」に思う


NTTドコモから発表があいついているが、内容については
初期の報道が一番詳しい。つまり・・・
>spモードシステムの詳細については執行役員 サービスプラットフォーム部長の澤田寛氏が説明。spモードシステムはユーザーを認証する「ネットワーク認証サーバ」、ユーザー情報を管理する「ユーザー管理サーバ」、端末の接続状態を管理する「セッション管理サーバ」から構成されている。今回、端末からの再接続によってユーザー管理サーバの能力を超える処理が発生し、輻輳、そして通信障害が起きた。この輻輳により、spモードサーバで電話番号とIPアドレスをひも付ける際に不符号(アンマッチ状態)が起き、他のメールアドレスが設定されてしまう不具合につながったという。
光伝送路の全断は人為的ミスによるものだが、「保全作業上のミスが起こらないように、工事関係の人も含めて徹底したいが、仮に起きたとしても、サーバの処理能力が高ければ(今回の不具合は)発生しなかった」(辻村氏)とした。
今回の不具合を受けて、スマートフォンの販売計画(2011年度で850万台)を修正することは考えていないが、「現在は原因や影響の広がりを分析しているので、その上で考えたい」とした。
————-
おかしい・・・どう考えてもシステム的に変だ。輻輳はとうぜん考えておかなければならない通信処理システムの基本設計事項であり、処理能力を大幅に超えた場合もサーバー処理が緩慢になり繋がりにくくなる事はあれ、少なくとも見知らぬところにメールが届くのは言語道断である。
まさしくこれは想定外の津波の高さが来たから仕方がないという東電の言い草とまったく同種の言い逃れであり、技術的にも低レベルのありうべからざる不具合であるばかりか、国のコミュニケーション基盤を支えるエンジニアリングを本業とする会社のとるべき態度ではない。
ではどこがどうシステム設計上悪いのかを考えてみたい。
下の図をみて、はてなこんな事がありうるのだろうかと首をかしげたくなる。ユーザ管理サーバーが輻輳でうまく働かなくなっているのにも関わらずなぜセッション管理サーバーがIDが勝手に処理して進むのか納得がいかなかった。

2011年12月24日

Android/Java Mediaplayer と SoundPool


本日先ほど学校の合宿から帰ってきました。
ちょっとAndroidの話だけどJavaもかぶるので、Java Advent Calendar 2011のネタにします。26日約束だったのにネットが使えなかったので27日になってしまいました!(Oh!my god.)どうもすいません。
学生の卒業研究でAndroidでドラム作成の相談をされた時の事を少しお話。
通常、音楽はMdiaPlayerクラスを扱うのですが、例えば10個のドラムを画面に配置して、クリックされたときにその位置に対応するドラムの音をならせばよい。
つまりこんな感じ。。。
public class drumSound extends Activity {
private MediaPlayer mp[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
context = this.getApplicationContext();
//–
for (10個分のドラムサウンドファイルをクリエイトする) {
mp[i] = MediaPlayer.create(this, R.raw.music01);
mp[i].prepare();
・・・・・
}
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のドラム位置だったら) {
try{
mp[i].start();
}catch( Exception e ){
Log.d(“Err”, “err mpPlay : ” +path );
}
}else if (2つ目の・・・・
ただし、メモリにゴミを残さない様にdestoryメソッドをオーバーライドしておかないといけない。
最初のコードの例だと、多重再生ができなく1回目の再生終了後にしか次のドラムの音が鳴らない。
したがって、ここはSoundPoolクラスを使って下記のように多重再生できるようにする。
public class drumSound extends Activity {
private SoundPool sdPool;
private int sdIds[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
context = this.getApplicationContext();
sdPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
for (int i=0; i<10; i++) {
sdIds[i] = sdPool.load(context, soundResouces[i], 1);
}
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のドラム位置だったら) {
sdPool.play( sdIds[0], 1.0F, 1.0F, 0, 0, 1.0F);
でも、よーく考えたら違う位置のドラムは良いが同じドラムなら前に鳴らしていた音はほぼ消されないとハウリングのような音の具合になるので、sdPool.play()の直前に下記を追加して一度ストップさせてから再生すると良い。
sdPool.stop(sdIds[0]);
ドラムの場合は、短い再生音なので良いがデフォルトで再生時数秒のリソースが限界のようだ、もっと長い音を多重で再生するには先のMediaPlayerのインスタンスをスレッドを使って明示的に再生することになる。
例えば、ある程度の長さのメロディーを割り当てた鍵盤楽器があってそれを制御するには次のようなコードになるはず。
private Thread thread[10];
………….
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のミュージック鍵盤位置だったら) {
if (thread[0]) {
mp[0].stop();
}
thread[0] = new Thread(newRunnable(H
public void run(){
mp[0].play();
while (mp[0].isPlaying()) {
sleep(50); //50ms毎にチェック。
}
}
thread.start();

2011年12月7日

Metro style app のプロジェクト

とうとうMetro style app のプロジェクトが動きだしましたね。ここからMetro style app development関連の情報をダウンロードしてFirst Apps Contestに応募できます。
Metro style appについての日本語説明は、後のリンクにありますが、要はPadやSmartPhoneを意識したタッチインタフェースを備えまた、インターネットへも連携するアプリケーションが同じ開発環境で作ることが出来るという訳です。
尚、XAMLはWPF(Windows Presentation Foundation)≒Silverlightを作成する為のフォーマットです。

2011年11月27日

Flashの終焉


11/9とうとうAdobeは、Flashを捨てHTML5に注力することを決めましたね。
如何にデザイナーの心を取り込むかに掛かっていたのですが、オープンフォーマットのHTML5には敵わなかったわけです。早々に方針転換したAdobeはさすがともいえますが、彼らにとってタイミングを逸すると屋台骨がぐらつく事になりかねません。
MSのSilverlightしかり、ライバルを蹴散らしてHTML5が次世代のグラフィック仕様となったわけで、混乱することなくオープンな統一フォーマットは、ディストリビュータやユーザにとってたいへん良いことだと思います。

旭川SOHO協議会創立10周年記念


先日金曜日、特別講演会&ビジネスマッチング交流会に参加してきました。
場所は、旭川産業創造プラザ 。2次会は、3・6街でした。
三鷹SOHO倶楽部からも代表者の斉藤さんがこられて盛況でした。
10年程前全国SOHO組織がいっぱいできましたが、今も活動が続いているのはごく珍しいそうです。
10年も続くなんてすごいですね。そして皆さんパワフル!です。