チケット先行予約のお知らせ

やるぞと思っていた長渕剛のLIVEですが

正式に決まったみたいです。

“’09 TSUYOSHI NAGABUCHIコンサート・ツアー”やるので

ファンクラブに入ると会員特典でチケット先行予約のお知らせが

http://www.nagabuchi.or.jp/new/index.html

にて宣伝されました。

よかったです。

楽しみです。

音量設定について

Windows サイドバーガジェット, Adobe AIR,
Google デスクトップ ガジェット, Yahoo!ウィジェットでは
音の再生が行えるのですがその時の音量についてです。

Windows サイドバーガジェットは
音量設定できません。
音量はPCの音量に設定されます。

Adobe AIRは0~1までの値を設定します。

Google デスクトップ ガジェットは
-10000~0まで値で結構幅広いです。

Yahoo!ウィジェットは0~16までの値を設定します。

では音量として0~100までの値を設定したとき
(volumeがその値をします)
具体的には下記のように行います。
Google デスクトップ ガジェットでは
あまりにも音量値の幅が広いので
アークタンジェントを用いて音量値を算出しています。
 Adobe AIR:
   var sound      = new air.Sound(new air.URLRequest(‘foo.mp3’));
   var soundTrans = new air.SoundTransform(volume / 100, 0); // 0 -1
   this.airSoundChannel = sound.play(0, 0, soundTrans);

 Google デスクトップ ガジェット:
   this.googleAudioClip = framework.audio.open(‘foo.mp3’);
   var volume_ = -10000;
   if (this.volume > 0) {
    volume_ = (Math.atan(Math.PI * this.volume / (2 * 100)) -1) * 2000;
   }
   this.googleAudioClip.volume = volume_; // -10000 – 0
   this.googleAudioClip.play();

 Yahoo!ウィジェット:
   system.volume = (16 * volume) / 100; // 0 – 16
   play(‘foo.mp3’, true);

ガジェットのバージョンアップについて

今まで作ってきたガジェットを
機能追加などでバージョンアップするときですが
既存の設定をOpera ウィジェット、
Mac OS X Dashboard ウィジェット、Adobe AIR、
Yahoo!ウィジェットでは
覚えていてくれます。

Windows サイドバーガジェット、iGoogle ガジェット
Google デスクトップ ガジェットは
覚えていてくれません。
なので設定変更したときには
もう一度設定しなおさないといけないのです。

でも設定項目を追加したときには
覚えていてくれると都合が悪かったりします。
json形式にしてごっそり設定情報を
読み書きをしていると
追加した項目がなくてエラーが出たります。
なのでバージョンをみて
バージョンが新しくなったら既存情報は
読込みしないようにした方が安全ですね。

IE7でのbase要素

IE7ではbase要素はhead内部に書かないといけない。
無視されてしまいます。
iGoogle ガジェットでJavaScriptとかのファイルパスを
わざわざ絶対パスで書くのは長ったらしくなるから
base要素を使って回避しようとしたのに
またIEのおかげで苦労しそうです。

今年は各ブラウザのバージョンアップの予定が多いけれども
IEだけJavaScriptエンジンはそのままだし。

ウェブページ用 Google ガジェットって

iGoogle ガジェットと同じなんだけれども
ブログパーツとしてページに張り付けられる
ウェブページ用 Google ガジェットってのがあります。
紛らわしいです。

作り方一緒なのに紹介ページは別で
しかもウェブページ用 Google ガジェットの紹介ページ
 http://www.google.co.jp/ig/directory?synd=open
への登録方法も判りません。

なんでこんなに紛らわしいことをしたんでしょう?

Canvasについて

HTMLのVersion5では検討されていて
すでにFirefox、Safari、Operaでは
導入されているCanvasについてです。
もちろんGoogle Chromeでも対応していて
未対応なのはIEのみです。
いつも道理なことです。

画像の回転を行いかかったので
Canvasをつかうとしたのですが便利です。
Canvasはアニメーションなどを
比較に敵に実現できる手段なので
これを駆使すればアニメーションは勿論
ゲームなども出来てしまうでしょう。
もちろん重たくなりますが。

ちょっと前まではSMILEやSilverlightのXAMLを評価していて
頑張ってほしいと思っていましたが
Canvasでいいでしょう。
パフォーマンスの問題は最近活発なJavaScriptエンジンが
問題を解決してくれると思います。

それでIE対応として”excanvas”なるものを導入してみました。
IEだとCanvasの機能が使えるようになります。
描画が汚くなっているけれども。
まぁそこは許容範囲といておきましょう。

画像の作り方について

ガジェット、ウィジェットを作成する際には
どうしても画像ファイルを作らないと
見栄えが良くなりません。
でもAdobe PhotoshopとかIllustratorとかは高いし
使いこなせません。
GIMPはフリーだけれどもやっぱり使いこなせません。
結局はセンスがないとかっこいいのが作れないのです。

そこでMicrosoft Officeを使っています。
Powerpoint 2007を使っているのですが
欲しい図形を作成してから
右クリックの”画として保存”とすると
PNGフォーマットで画像ファイルが出来上がります。

当分はこれで用が足りそうです。

Silverlight2.0でManaged JScriptでのキーイベントについて

今回はManaged JScriptでのキーイベントについてです。
何のキーが押下されたのかの判定がちょっとややこしいです。

基本的なキーを判別するのであれば
イベントオブジェクトのeventArgs.Keyと
キー配列の一覧をもつKeyクラスで用が立つのですが
Keyクラスでは足りないこともよくあります。
やっぱりそこはキーコードを見て判断するしかないようです。

また、シフトが押下されているかの判断は
KeyboardクラスとModifierKeysクラスを使って判断します。
何故かイベントオブジェクトからでは判断できません。
紛らわしいです。

下記のように記述します。
fooのbarオブジェクトに対してキーが押下されたら
doKeyDownメソッドを呼び出しています。
 Import(“System.Windows.Input.Key”)
 Import(“System.Windows.Input.Keyboard”)
 Import(“System.Windows.Input.ModifierKeys”)

 foo.bar.KeyDown += doKeyDown;

 function doKeyDown(sender, eventArgs){
  // Altが押されている
  if((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt){
   return;
  }

  // コントロールが押されている
  if((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control){
   return;
  }

  // シフトが押されている
  if((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift){
   return;
  }

  if(eventArgs.Key == Key.Enter){
   // エンターが押下
   
  } else {
   // キーコードで判断
   switch(eventArgs.PlatformKeyCode){
    case 191:
     // “/”が押下
     break;

    default:
     break;
   }

  } // if(eventArgs.Key == Key.Enter)
 }

Silverlight2.0でManaged JScriptからの設定ファイルへの読み書込み

Silverlight2.0でManaged JScriptから
設定ファイルへの読み書込みを行う際には
IsolatedStorageSettingsクラスを使って行います。

なお、Windows サイドバーガジェットを作ろうとしたときには
ちょっと注意点があります。
Silverlightでのパラメータでの”source”のxapファイルごとに
設定ファイルが作られます。
なので同じxapファイル名のものがあるときには
せっかく設定した値が他のガジェットでいじられてしまう可能性があります。
やっぱり”x-gadget:///”のせいでしょう。

また、Windows サイドバーガジェットだと大丈夫なのですが
それ以外では設定ファイルへの書込みの
時間が何故かかかってしまいます。
なのでここではタイマー処理をして濁しています。

まずは設定ファイルの読込みです。
“foo”のキーでの値を読込んで”bar”に設定しています。
 Import(“System.IO.IsolatedStorage.IsolatedStorageSettings”)
 var bar = null;

 var appSetting = IsolatedStorageSettings.ApplicationSettings;
 if(appSetting.Contains(“foo”)){
  bar = appSetting[“foo”];
 }

次に設定ファイルへの書込みです。
barの値を”foo”をキーとして設定ファイルへ書込みを行っています。
 Import(“System.IO.IsolatedStorage.IsolatedStorageSettings”)
 Import(“System.TimeSpan”)
 Import(“System.Windows.Threading.DispatcherTimer”)
 var timer = null;
 var bar   = null;

 var appSetting = IsolatedStorageSettings.ApplicationSettings;
 if(appSetting.Contains(“foo”)){
  appSetting[“foo”] = new String(bar).toString();

 } else {
  appSetting.Add(“foo”, new String(bar).toString());
 }

 // 時間がかかるのでタイマー処理を行う
 if(timer == null){
  timer = new DispatcherTimer();
  timer.Interval = TimeSpan.FromMilliseconds(1);
  timer.Tick     += function(){
   var appSetting = IsolatedStorageSettings.ApplicationSettings;
   appSetting.Save();

   timer.Stop();
  }
 }
 timer.Start();

Silverlight2.0でManaged JScriptからのタイマー処理について

JavaScriptではsetTimeout、setIntervalが使えたのですが
Managed JScriptでは使えません。
そこでDispatcherTimerを使って処理を行います。

下記のような形です。
100msecが過ぎたらfooを呼び出しています。
fooでは1回呼ばれれば充分なのでタイマーをストップされています。
 Import(“System.TimeSpan”)
 Import(“System.Windows.Threading.DispatcherTimer”)
 var timer = null;

 if(timer == null){
  timer = new DispatcherTimer();
  timer.Interval = TimeSpan.FromMilliseconds(100);
  timer.Tick     += foo;
 }
 timer.Start();

 function foo(){
  if(timer != null){
   timer.Stop();
  }
 }