2011年3月24日木曜日

日本橋

先週大阪日本橋に行ってきました。もう20年ぶりぐらいでどこに何があるか全く分からなくて、家族もいるしで共立電子だけ見てきました。あと、ポポンデッタにも子供の付き合いでいきました。ポポンデッタは鉄道模型のあれです

日本橋は、昔と全然違うというか秋葉もそうだけど、アニメとかのほうがメインな感じですね。秋葉よりもオタク度が高くなっている気がします。
ただ、その日は雨だったからかもしれないけど、秋葉みたいにメイド姿の人はいませんでした。


2011年3月4日金曜日

分離ストレージについてこう察

というか想像っです

WP7開発端末で分離ストレージのデータが壊れる問題について引き続き悩んでます

作っているアプリはやっぱりというかGoogleReadeerのクライアントでuGreaderのWP7版です。
分散ストレージはフォルダ情報や未読情報の他、ロード済みの記事を格納しています。

WP7ではアプリケーションの実行中に他のアプリに切り替わるとき等にApplication_Deactivatedイベントが発生して一旦稼働中のアプリは終了します。このイベント内で処理中のデータを復旧に備えて分離ストレージ上に書き出しておきます。

もとのアプリに戻ってくるときにApplication_Activatedイベントが発生するので、ここでさっき書き出したデータをロードして前の状態に戻します。


ファイルの読み書きはアプリ起動時と上記のイベント内のみで行っていますが、テスト用にボタンを押したときに書き込み、読み出し処理を行うようにしてみました。
何度か試してみましたがボタンを押したときはファイル読み書きは正常に終了します

また、いったんファイルが壊れると、その後のファイル読み書きはすべて失敗します。ストレージを一旦Removeしない限り正常動作しなくなります


つまり

  1. Application_Deactivatedイベントのストレージ書き出し中にファイルを破壊している
  2. 破壊はファイルだけでなく分離ストレージそのものを破壊してしまう。(分離ストレージの管理テーブルが壊れている?)。その後のファイル書き込みが全て失敗してしまう
想像では、

タスクの切り替え処理の時間内にファイルの書き込みが終了しないで、ファイルアクセス中にタスクが強制終了されて、ストレージの管理テーブルの不整合が起きている

と思ってます

そもそも、Application_Deactivatedイベント内での処理時間が制限されていたような?
WP7の仕様上、記事データのような大きいファイルは書き出せないのか、開発機だから書き出せないのか?わかりませんが、なるべく書き出すファイルは小さくしておくのが無難なのかもしれないです


2011年2月28日月曜日

WP7プログラム 分離ストレージ

WP7用のアプリのプログラムをしている方と話す機会があったので、分離ストレージに問題が起きていないか聞いてみたところ、特に問題は無いとの事でした。「開発用端末の問題があるかも」みたいな話をしていました。そこは全く考えていなかったので、WP7海外端末が急に欲しくなってしまいました。日本発売まで我慢しようと思っていたのですが...

僕のところで起きている問題というのは
下記のようなコードを実行するプログラムをしばらく使うと、データ読み出しでxmlの解析に失敗する例外が発生してしまいます。



分離ストレージに保存する
try
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        using (var stream = new IsolatedStorageFileStream("folder.xml", FileMode.OpenOrCreate, store))
        {
           
            var sirializer = new DataContractSerializer(typeof(FolderList));
            sirializer.WriteObject(stream, this);
        }
        store.Dispose();
    }

}
catch (Exception e)
{
    System.Diagnostics.Debug.WriteLine(e.Message);
    MessageBox.Show(e.Message);
}

分離ストレージから読み出す
try
{
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    {
        if (store.FileExists("folder.xml"))
        {
            System.Diagnostics.Debug.WriteLine(store.AvailableFreeSpace);
            using (var stream = new IsolatedStorageFileStream("folder.xml", FileMode.OpenOrCreate, store))
            {
                var sirializer = new DataContractSerializer(typeof(FolderList));
                return (FolderList)sirializer.ReadObject(stream);
            }
        }
    }
}
catch (Exception e)
{
    System.Diagnostics.Debug.WriteLine(e.Message);
    MessageBox.Show(e.Message);
}

分離ストレージはアプリ外からは読み出せなく実際に何がエラーの原因かわからないので、アプリ上でシリアライズオブジェクトとしてでは無く、xmlファイルとして読んでみるとファイルの内容が他のファイルと混ざった状態で読み出されている事が判りました。



分離ストレージの扱いに慣れてないというか、疑問がいろいろと出てきます
ファイルサイズの制限とか
頻繁にアクセスをしてもパフォーマンスに影響がないか?
とか

分離ストレージもハードウェア的にはフラッシュベースのストレージだと思うので、アクセス回数を減らすようにプログラムを作るべきなのか?
例えば、プログラムの起動時と終了時だけアクセスするようにプログラムするべきか、データの変更が有るたびにファイルに書き出してメモリの使用量を抑えるように作るべきなのか?

最近知ったのですが、ssd等のフラッシュメディアではライト回数だけでなく、リード回数もパフォーマンスに影響を与えるそうです。同じ領域を繰り返しリードするだけで、その部分のデータ保護機構が働いてデータの再配置が起こります

だとすると、必要な時だけファイルからデータを読んで、いらなくなったら直ぐに捨てるような使い方より、一度読み込んだデータは捨てずにRAM上に残しておいた方が良いのかな?と

2011年2月18日金曜日

uGReader 1.65

ver1.64のコメントをもらったので、受信エラーの対策をしました



サイト別の長いURLの記事読み込みに失敗する問題の修正をした
ボタンの配置を変更した


2011年2月13日日曜日

2011年1月22日土曜日

ideosその後

先週新品交換してくれたIDEOS、また故障しないか心配でしたが、一週間使った感じでは大丈夫そうです。電池はemobaileのsimを挿した状態で1時間に5~7%バッテリが減少してます。
朝晩の通勤中に30分づつ程度テザリングを使用してぎりぎり一日(15時間くらい)もつかな?って感じです。

今日はsoftbankのsimで3g通信をoffにして持ち歩いてみましたが、16時間でバッテリ残量が80%でした。通信on/offでここまで違ってくると言うことは、3g通信をonにすると何も操作していなくても、知らぬ間に通信をしているってことなのかな?

追記
昨日と今日で満充電後、40時間ぐらい経過しましたが、バッテリ残量は65%でした。1時間1%程度の消費です。その間無線LANでメールチェックを数回、音楽再生を1時間ぐらい使いました。

新品交換前の故障品ではAirPlaneモードでも1時間10%の消費だったのは、ハードウェアの故障のせいだったようです。

とにかく3Gデータ通信をoffにするだけでかなりバッテリが持つようになりました。
テザリングOffの時には3Gもoffにするとよいと思います

2011年1月20日木曜日

uGReader ver1.63 公開しました

.Net compact frame work 3.5に変更した
twitter 投稿機能を追加した
問題点:フィード取得に失敗することがある

サイト別の表示に対応するためにCompact Framework3.5に変更しました。
サイト別ページの読み込み中にフィード取得に失敗することがあるようです。
その場合、リロードするか一旦フォルダリスト画面に戻ると読み込まれると思います

共有メニューから直ぐに共有しないようにしました。(押し間違えて共有公開しないように)
記事タイトルとリンクをtwitterに投稿できるようにしました。(タッチインターフェイスのみ)

twitterの認証はXAuthを使用しています。アプリ内でidとパスワードの保存はしませんが、認証キーは保管します。
認証取り消しは Twitterホームページの設定->コネクション ページからuGReaderの許可を取り消せます