Androidのブラウザ

Androidのブラウザ(mobile safari  4.0)が他のブラウザと違って思い通りに動かない。

1)  canvasの描画でfillStyleに指定した内容が正確に表現できない場合ある(薄くぼやけた感じになってしまう)

  fillStyleで透明度も指定してglobalAlphaも設定するとおかしくなるようだ。

2)  ページの読込みが完了しない

  何故かページの読込みが完了しない。ずっとアドレス表示エリアの下に表示しているプログレスバーが消えない。どうもsocket.io.jsでソケット通信をしているのが原因らしい。

  とりあえず、それをやめれば完了するが、それでもしばらく時間がかかる。

Android上でもChromeなら問題なく動く。ブラウザはまだまだ発展途上なのか?それとも使用しているスマホの問題か・・・?

 

 

Chromeが定期的にリセットされる

何故か最近Chromeがお昼を過ぎたころに定期的にリセットされてしまう。

Chromeのバージョンは最新(28.0.1500.95)になっているし、Chromeのバージョンアップに伴う再起動でもなさそうだ。

時間記録するといつも13:40ごろである。

イベントビューアーを調べてもその時間にそれらしきイベントは記録されていない(「Application Experience サービスは 実行中 状態に移行しました。」というイベントが丁度その時刻に記録されているが、他の時間でも発生しているので関係ないと考えられる)。

更にタスクスケジューラを調べると「DealPly」と「DealPlyUpdate」いうのが丁度その時間に実行するように登録されているのを発見!

DealPlyとは何か調べるとどうもブラウザのアドオンでポップアップ広告を表示するサービスらしい。

Chromeの拡張機能を調べるといつの間にかインストールされている。

どうもフリーソフトをインストールした時に紛れ込んだらしい。

とりあえずこの拡張機能は削除する。

その後タスクスケジューラを開くとまだ「DealPly」と「DealPlyUpdate」が残っている。

コントロール パネル項目の「プログラムと機能」を開くと「DealPly」が存在している。ただし、インストール日はChromeのリセットの現象に気づいた時よりも随分前である。

とりあえず削除してみる。

しかし、スクスケジューラからは削除されていない。

仕方ないので手動で「無効」に設定してみる。

Chromeの再起動の原因はこれなのか明日確認!

 → 本日(8/8)無事再起動せずに13:40を経過する。

しかし何故DealPlyのせいで再起動するんだろう? Chrome にとってはかなり迷惑な話だけど、前は発生していなかったからこのバージョンに対して相性が悪いのだろうか。DealPly自体がかなり悪いソフトなのか・・・?

JQueryでtouch系のイベントをbindする時の注意

JQueryでtouch系イベント(touchstart、touchmove、touchendなど)をbindする際に以下のように引数を指定した形で定義すると思うが、ここで渡ってくる引数からはマウスの座標等は取得できないらしい(モバイル用があるからそちらを使用しろということかも知れないが)。

 

$( '#hoge' ).bind("touchmove", function(e) {
var x = e.changedTouches[0].pageX;      //  e に changedTouches は定義されていないので座標が取得できない
});
 

ここで取得するには window.event (グローバル変数)から取得する。

 

JQueryではなくコントロールの addEventListener でイベントハンドラを設定した場合は、その引数から取得可能。

var ctrl = document.getElementById('title');
ctrl.addEventListener('touchmove', function(e) {
var x = e.changedTouches[0].pageX;      // 正常に取得できる
});
 
※ 使用したJQueryのバージョンは 1.7.1
 
 

NTP(W32Timeサービス)

WindowsのW32Timeサービスを設定する機会があったのでそのメモ。

  • GUI([日付と時刻]-[インターネット時刻]タブ、設定変更ボタンクリックで表示される[インターネット時刻設定])で設定できるサーバとの同期間隔は1週間ごとらしい。
  • 同期間隔はレジストリ「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time
      \TimeProviders\NtpClient」の SpecialPollInterval キーで指定可能(秒単位)
  • w32tm コマンドにより独自にNTPサーバを指定可能。

w32tmコマンド

登録

C:\windows>w32tm /config /manualpeerlist:192.168.101.50,0×9 /syncfromflags:manual
 
※ ここで登録したサーバをGUIの[インターネット時刻設定]のサーバーの一覧には登録されないようである。
 

時刻同期状態表示(/query /status)

C:\windows>w32tm /query /status /verbose
閏インジケーター: 0 (警告なし)
階層: 3 (二次参照 – (S)NTP で同期)
精度: -6 (ティックごとに 15.625ms)
ルート遅延: 0.0312500s
ルート分散: 0.3881154s
参照 ID: 0xC0A88027 (ソース IP:  192.168.101.50)
最終正常同期時刻: 2013/07/30 11:05:25
ソース: 192.168.101.50,0×9
ポーリング間隔: 10 (1024s)
 
フェーズ オフセット: -1.3301137s
クロック レート: 0.0155994s
State Machine: 2 (同期)
タイム ソース フラグ: 0 (なし)
サーバーのロール: 0 (なし)
最終同期エラー: 0 (コマンドは正しく完了しました。)
最終正常同期時刻からの時間: 18.4992994s
 
 

同期状態表示(/query /peers)

C:\windows>w32tm /query /peers /verbose
ピア数: 1
 
ピア: 192.168.101.50,0×9
状態: アクティブ
残り時間: 349.5461008s
モード: 3 (クライアント)
階層: 2 (二次参照 – (S)NTP で同期)
ピアポーリング間隔: 10 (1024s)
ホストポーリング間隔: 10 (1024s)
最終正常同期時刻: 2013/07/30 11:05:24
最終同期エラー: 0×00000000 (成功)
最終同期エラー メッセージ ID: 0×00000000 (成功)
認証方法メッセージ ID: 0x0000005A (NoAuth )
解決試行回数: 0
有効データ カウンター: 5
到達の可能性: 63
 
※ 登録したサーバーの数分表示されるようである。
※ 登録時に状態が「保留中」になっている場合があったが、次の同期スケジュールで「アクティブ」になった。状態の意味するところが不明である。
 
 

同期実行(/resync)

C:\windows>w32tm /resync
 
w32tmでピアを登録しても、GUIの表示のサーバーは変わらない。
同期の実行結果ではw32tmで登録したピアが表示されている。
 
 

Android StudioをインストールしたらADTでエミュレータが起動できなくなった

ADT を使用していたが、友人から Android Studio ってのがあると聞いて、試しにインストールしてみた。

インストール後、Android Studio で ADT で作成したプロジェクトをインポートして、デバック等もできるなと確認できたのだが・・・。

ADT に戻ってエミュレータを起動すると、仮想デバイス(AVD)が最後まで立ち上がらない。AVD自体は表示されるが、「ANDROID」のロゴが出たままで一向にデバイスが使える状態にならない。

調べていくと Android Studio と ADT では使用しているSDKが異なってる。そして、AVDを管理していると思われる以下のファイル内の kernel.path や disk.ramdisk.path などでSDK内( sdk/system-images 配下) のファイルを参照している。

[ユーザ]\.android\avd\xxx.avd\hardware-qemu.ini

その辺の関連付けが Android Studio の方に変更されてしまったのが原因なのかと考えられる。

とりあえず、ADT の設定を Android Studio に合わせてみる ( ADT の設定のAndroidの「SDK ロケーション」を Android Studio で使用しているものと同じにする。その間にモジュールの更新等モロモロ行う)。

結果的にAVDは正常に立ち上がるようにはなったのだが、何故かAVDマネージャーが表示されなくなってしまった([ウィンドウ]-[Andoroid 仮想デバイス・マネジャー]から表示できない)。何故だろう?

 

JQuery.ajaxでコンテンツタイプ ‘x-www-form-urlencoded’ のエンコード

canvasのデータをtoDataURLで取得し、ajaxでサーバに送信する処理を作成したみた。

するとアップロードしたデータが表示できない。

prototype.jpajaxを使用した場合はアップロードしたデータは正常に表示できる。

調べてみるとJQueryで送信した場合、ajaxに設定したデータに含まれるプラス(’+’)が、半角スペース(' ')に変換されている。

JQuery.ajaxprocessDataの設定にせいかと思い、falseを設定してみるが変わらない。

ネットで調べるとコンテンツタイプが ’x-www-form-urlencoded’ の場合は、半角スペースをはプラスに変換して送信することになっているらしい(RFC1866 Section-8.2.1)。

しかし何故かJQueryではの変換がされているような・・・???

この辺の知識がなくいろいろ調べてみるがよくわからずデバッガで追っていくと、prototype.js の場合、XMLHttpRequestで送信するデータのプラス('+')、半角スペース(' ')、スラッシュ('/') がそれぞれURLエンコード(?)されて、%2b%20%2Fになっている。

JQueryの場合は実際どうなっているのかよくわからないが、sendを実行する時点までにデータが変換されている様子はない(そこまで追い切れないのですが…)。

基本的に外側でそのエンコードをするべきなのかと思ってajaxに設定する前に変換すると正常にデータがアップロードされた。

果たしてこれでいいのだろうか?

 

Bezitter-簡易ベジャ曲線編集サービス

Bezitterはベジェ曲線で簡単な図形をデザインするサービスです(サービスと呼ぶほどのものでもないのですが・・・)。
落書き感覚で弄ってもらえると良いかと思います。
理想としては粘土細工のようなイメージで形を作って行けるものになればとも考えています。
今のところは本当に単純な機能しかありません。
出来れば今後いろいろ機能を増やしていく予定です。
 

現時点でBezitterには以下の機能があります。

  • デザイン機能
    -端点(アンカーポイント)、制御点のマウス操作によるベジェ曲線編集
    -塗りつぶしまたは線による図形の描画
    -描画色・背景色指定
    -影の指定
  • デザインの保存・読出し(現状保存できるデータは1つです)
  • 作成したデザインをPNGファイルとして保存可能
  • 作成したデザインをTwitterへツイート

 

また、BezitterHTML5canvasを使用して作成しています。未対応のブラウザでは残念ながら動作しません。
現状以下のブラウザでは動作することを確認しています。

  • Chrome 19.0.1084.56 (※一部の正常に動作しない機能があります。HELP参照)
  • Firefox 12.0
  • IE9

 

Chrome-canvasのlineWidthを1に設定した場合の影表示異常

ChromecanvaslineWidth1に設定した時に何故か影の描画がおかしいくなる。
一直線の場合、影が表示されないし、それ以外では影が線にならずに面で塗りつぶされる。
lineWidth1より大きい値を設定した場合は正常に表示される。
FirefoxとIE9では正常である。
以下の図1,2の左2つはlineWidth1に設定し、右はlineWidth2に設定した場合である。
Chromeのバージョンは19.0.1084.56。
 
図1. Chromeの場合
 
図2. Firefoxの場合

 

Canvas描画ツールで以下のコードを実行すると上記の結果を見ることができる。

context.beginPath();
context.strokeStyle='rgba(255,0,0,1)';
context.shadowColor='rgba(0,0,0,1)';
context.lineWidth=1;
context.shadowBlur=3;
context.shadowOffsetX=5;
context.shadowOffsetY=5;
context.moveTo(50,50);
context.lineTo(50,100);
context.stroke();

context.beginPath();
context.moveTo(100,50);
context.lineTo(100,100);
context.lineTo(150,100);
context.lineTo(150,50);
context.closePath();
context.stroke();

context.lineWidth=2;
context.beginPath();
context.moveTo(200,50);
context.lineTo(200,100);
context.lineTo(250,100);
context.lineTo(250,50);
context.closePath();
context.stroke();

Chrome-imgタグにcanvasのtoDataURLのデータを設定した場合の不具合

ChromeimgタグにcanvasからtoDataURLで取得したデータを設定した場合に、表示された画像が保存できない(画像上でマウスの右クリックによるコンテキストメニューで「名前を付けて画像を保存」を選択)。

通常は保存しようとすると「名前を付けて保存」のダイアログが表示されるが、このダイアログが表示されない。以前は保存できていたし、imgタグに普通に画像のURLが設定されている場合は保存できる。

また、FirefoxIE9も正常に動作する。

バージョンアップでのバグなのだろうか?

Chromeのバージョンは19.0.1084.56。

 

アナログ時計(FT-003)

魚の形をした秒針のHTML5のcanvasで作成した時計。

別Windowでopen 極小(200,200) 小(346,346) 中(480, 480) 大(852, 852)

特徴

  • 24時間計と12時間計を内蔵
  • 時報機能
  • アラーム機能(3個)
  • タイマー機能
  • 天気予報表示(24時間計の3時間ごとの位置に表示されます)

使い方

キー操作により各機能を設定できます。

  • 「S」キー : 設定ダイアログ(時報有無、天気予報表示有無)を表示する
  • 「T」キー : タイマー起動
  • 「C」キー : タイマーキャンセル
  • 「F」キー : 天気予報表示(5秒間)
  • 「1」~「3」キー :アラーム設定

   ※ IMEがONになっていると機能しないので注意!

その他

  • Chrome(18.0.1025.152)、Firefox (11.0) で動作確認。IE8では動作不可。
  • バグはいろいろあるかもしれません!