艦これ 諜報員 ver.0.5

SWFファイルから画像を抽出する – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5136

の機能を組み込んで、諜報員の艦娘を秘書艦に合わせます。

image

途中で立ち上げると、うまく切り替わらないので、あからじめ諜報員を立ち上げて置くか、艦これのほうで秘書艦を変えてみてください。このあたりは、のちのち修正しましょう。秘書官を立ち上げたときに、前の艦娘を表示したほうがよさそうだし。

バイナリのほうは 艦これ 諜報員 – Moonmile Solutions Blog からダウンロードしてください。

■Fiddler のフック時に HttpClinet は使えない。

考えてみれば、当たり前なのですが、Fiddler でフックしている中で HttpClient などを呼び出すと、元の Fiddler にフックしてしまうために再入が発生します。FiddlerCore の中身は static のものが多いらしく、なんか url などが途中で消えてしまったうまく動きませんでした。

なので、どうせならば、Task を使って遅延させれば OK。

void UpdateKanmusu(string url , int shipId)
{
    // TODO: WebClient も Fiddler にフックされるので再入を防ぐために非同期にすること。
    // swf をダウンロード
    Task.Factory.StartNew(async() =>
    {
        var cl = new HttpClient();
        var data = await cl.GetByteArrayAsync(new Uri(url));

        // swf から画像を取り出す
        var reader = new SwfReader(data);
        var swf = new SwfCompilationUnit(reader);
        var lst = swf.Tags.FindAll(x =>
            x.TagType == TagType.DefineBitsJPEG3 &&
            ((DefineBitsTag)x).CharacterId == 13);
        var tag = lst[0] as DefineBitsTag;
        Bitmap bmp = tag.ToBitmap();
        // 描画
        UpdateForm(bmp);
    });
}

実は、Fiddler でフック中で重たい処理をすると、ブラウザのほうのレスポンスが悪くなります。なので、処理をしないメッセージであればできるだけ早く解放してやるのがベターです。

そんな訳でサンプルソースは http://sdrv.ms/18ZCDbe から。

カテゴリー: C#, 艦これ | 1件のコメント

Windows 8.1 RTM に Media Center Pack を引き継ぐ

Windows 8 Media Center Pack を2台目に入れるときの注意点 – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5009

ビデオの閲覧とTVの閲覧のためにある、うちの「Media Center Pack」なのですが、無事、Windows 8 から Windows 8.1 RTM に引き継げました、という話です。

前回の Media Center Pack の購入で変なことになってしまった、家庭用PCなのですが、Windows Update をすると OS ごと立ち上がらなくなってしまう状態でした。そのうち、8.1 が出るだろうから、それにアップデートしてから考えよう、ってことで、放置状態だったのですが、本日 8.1 RTM を入れてみました。

■Win 8 から 8.1 にアップグレードすると、一時的に Media Center が使えなくなる

最初、Windows 8 から Windows 8.1 にアップデートした後に、Media Center が使えなくなります。あたかもアンインストールした状態になってしまい、録画一覧フォルダにあるアイコンも「不明アイコン」のままになります。どうやら、「with Media Center」の部分がアップグレードした時に消えてしまうんですよね。

こうなると録画した番組も見れなくなるし、ええー???と思って、元に戻そうかと色々考えた挙句…

■購入済みの Media Center Pack の認証IDを入れる

仕方がないので、購入済みの認証IDを入れ直します。Windows 8 の時に買った Media Center Pack は 8.1 でも有効なのかどうかが不明なのと、いやいや以前の話だと PC 1台に付きひとつという紐づけだそうだから、Windows 8 の時に購入した Media Center Pack は、同じ PC であれば Windows 8.1 でも有効ではないか…ということで。

引っ張り出してきた認証 ID を入れると、最初は「認証に失敗しました」というエラーがでるのですが、結果的には認証できました。

image

無事「Windows 8.1 Pro with Media Center」になっていますし、以前に録画していた映像も見れるようになります。

途中エラーのようなものが出るのは、うちのPCのせいなのか、RTM の不具合なのかわからないのですが、ひとまず。

■ちなみに、8.1 から Media center Pack を買おうとすると…

こんな感じにエラーになります。なので、実質、8.1 RTM から Media Center は購入できません。これは不具合なのか、MS のサーバーがまだ準備をしていないのかは不明です。多分、準備ができていないだけのように思えるけど。

image

カテゴリー: トラブルシューティング | Windows 8.1 RTM に Media Center Pack を引き継ぐ はコメントを受け付けていません

[Win8.1] Windows 8.1インストール時にローカルアカウントを利用する方法

急遽、Windows 8.1 RTM が MSDNで配布されることになったので、早速「仕事として」チェック。同時に Visual Studio 2013 RC も使えるのですが、これは、

  • Windows 8.1 RTM + Visual Studio 2013 RC で、ストアアプリ開発ができる。
  • Windows 8 + Visual Studio 2013 RC で、ストアアプリ開発以外はできる。
  • Windows 8.1 Preview に Visual Studio 2013 RC はインストールできない。

という違いがあります。8.1 のストアアプリを試したい場合には、Windows 8.1 RTM が必須になるので必然的に MSDN/TeckNet の加入が必須になりますね(正確には、ベンダーへの RTM も含むけど)。 逆に、デスクトップアプリとか、WPFアプリとか、ASP.NET MVC をやりたい場合には、Windows 8 と Visual Studio 2013 RC の組み合わせでも OK な訳です。

■Windows 8 から Windows 8.1 へのアップデート

Windows 8.1 Preview からのアップデートではアプリの引き継ぎはできませんが、Windows 8 からのアップデートではアプリの引き継ぎができます。大抵は使い込んでいるPCだと思うので、「Windows の設定、個人用ファイル、アプリを引き継ぐ」を選択すれば OK です。

image

「何も引き継がない」場合は、どうなるんでしょうね?元のデータ自体は、Windows.old というフォルダにバックアップが取られるので、マイドキュメントの中とか、Program Files の中身は後からファイルを拾うことができます。多分、ディスクの容量があれば、このあたりは問題ないでしょう。マイドキュメント以外は、そのままなので、Dドライブとかにファイルを置いてあれば、そのままで。

■Microsoft アカウントを使わず、ローカルアカウントを使う

会社でActive Directoryを使っていたり、複数のPCをうまく共有したい場合には、インストールの指示に従って「Microsoft アカウント」を作ればいいのですが、個人で使っている場合には「ローカルアカウント」のままにしておきたい場合があります。私の場合、VMWare を使って色々なバージョンを作るのと、共有は SkyDrive ぐらいで十分なので、ローカルアカウント(そのPCだけで有効なアカウント)を使っています。リモートデスクトップでつなげる時が多いので、ユーザー名、パスワードも同じにしてあるというダダ漏れ状態なのですが…まあ、家庭内LANだし。逆に言えば、出先で不意な同期が走らないので安心というのもありますね。

手元のPCをどれでも同じように使いたい場合は、Microsoft アカウントを使う。個別に用途ごとに使いたい場合は、ローカルアカウントを使う、という区別です。

推奨される Microsoft アカウントですが、アップデートの時に利用するように強制的に勧められます。いままでの PC ではローカルアカウント(Windows 7も含めて)で使っていたので、いままでどおりローカルアカウント(ログイン名とパスワード)を使いたい場合、

image

この画面で、一度「Microsoft アカウント」をわざと失敗させます。例えば、ユーザー名を「xxxxx@xxx.com」のような感じで入力し、パスワードを適当に入れます。そうすると、一度 Microsoft アカウントをチェックしようとしますが、当然ならがアカウントがないのでエラーになって戻ってきます。

image

ここで、推奨してないけど、ローカルアカウントを使いますか?のボタン(「既存のアカウントの使用」ボタン)が出てくるのでクリックすると、もともと使っていたローカルアカウントを使うことができます。Windows 8.1 RTM をクリーンインストールした場合は、パスワードの脇に「ローカルアカウントを使いますか?」のようなリンクが出てくるので、これをクリックします。すると、由緒正しいローカルアカウントの登録画面になります(そういえば、デフォルトの Administrator ユーザーはなくなったんですかね?)

ちなみに、インストールしてからローカルアカウントを作成することもできます。チャームの検索で、「アカウントの作成」を設定から検索すれば、コントロールパネルが開きます。

image

PC の最初のアカウントが、Microsoft アカウント(ネットワーク上のアカウント)というのが、ちょっと難点があるかなと。最初のアカウントは必然的に管理者権限(Administrators)になってしまうので、元の Microsoft アカウントが乗っ取られてしまうと、芋づる式に関連する PC のアカウントが乗っ取られてしまいそうな気が。どうなんでしょう?

なので、最初のアカウントはローカルの捨てアカウントにしておいて、Microsoft カウントはちょっと制限のあるアカウントにするのがベターかなと。まあ、会社の場合は、Active Directory を使うので、逆にローカルアカウントは一切作らずに、AD の管理者権限を使って強制的に、ってのがセオリーですが。

カテゴリー: windows 8.1 | 1件のコメント

SWFファイルから画像を抽出する

Flashのswfファイルから画像を抽出する…わけは艦これ諜報員用なのですが、完全に実装する前にメモ程度に残しておきます。いくつか、MFCのライブラリとかJava,PHPのライブラリはあるのですが、やっぱりC#のほうがいいですよね。

neue cc – C#でFlash Liteなswfをバイナリ編集して置換する
http://neue.cc/2013/01/10_393.html
debreuil/Swf2XNA
https://github.com/debreuil/Swf2XNA
SWFバイナリ編集のススメ第三回 (JPEG) | GREE Engineers’ Blog
http://labs.gree.jp/blog/2010/09/782/

github に Swf2XNA というプロジェクトがあります。neue さん言う通り、完全に使うには XNA のライブラリが必要なのですが、そこまで面倒ではなくて SwfFormat プロジェクトだけが必要です。

※一応、但し書きを書いておきますが、画像の著作権は艦これ自体に帰属するので、悪用しないように。

■手っ取り早く画像ファイルを抽出したい

用途としては、艦これでダウンロードしている *.swf ファイルから画像を抜き出したいだけです。画像の取り出し自体は HugFlash – 窓の杜ライブラリ  というツールがあるので、特に問題はありません。艦これ諜報員の榛名の画像は、これを使って取り出したものですが。が、どうせならば実行時に画像を取り出したいですよね。そうすると、秘書艦を変えたときに、同期して諜報員の画像も変えることがでいそうです。

さて、先の記事を読むと Flash の中身は Tag に分かれています。この中で画像に関係するところの

  • TagType.DefineBits
  • TagType.DefineBitsJPEG2
  • TagType.DefineBitsJPEG3

の3つを取り出せばよさそうです。実は、TagType.DefineBits のときの JPEGTables+DefineBits の組み合わせは真面目にやらないといけないのですが、幸いにして(?)、艦これで扱っている swf は JPEGTables の長さが 0 のために、そのまま DefineBits 内のバイナリデータが使えます。これでいいのかどうかは不明なのですが、まあ、用途に足りるので。

private void button1_Click(object sender, EventArgs e)
{
    var reader = new SwfReader(File.ReadAllBytes(@"d:work14.swf"));
    var swf = new SwfCompilationUnit(reader);
    var lst = swf.Tags.FindAll(x =>
        x.TagType == TagType.DefineBits ||
        x.TagType == TagType.DefineBitsJPEG3 ||
        x.TagType == TagType.DefineBitsJPEG2);
    int i = 1;
    foreach (var it in lst)
    {
        var tag = it as DefineBitsTag;
        var path = string.Format(@"d:work14-{0}.png",tag.CharacterId);
        Bitmap bmp = tag.ToBitmap();
        if (bmp != null)
        {
            bmp.Save(path, ImageFormat.Png);
        }
        i++;
    }
}

File.ReadAllBytes メソッドで byte[] として取り出しデータを SwfReader を喰わせた後、SwfCompilationUnit クラスでパースします。そのあと、Tags コレクションの中身を覗けばOKです。
DefineBitsTag クラスの ToBitmap メソッドは自作の拡張メソッドです。

public static class DefineBitsTagExtention
{
    public static Bitmap ToBitmap(this DefineBitsTag tag)
    {
        Bitmap png = null;
        if (tag.TagType == TagType.DefineBitsJPEG2 ||
            tag.TagType == TagType.DefineBitsJPEG3)
        {
            if (tag.HasAlphaData == false)
            {
                var mem = new MemoryStream(tag.JpegData);
                png = new Bitmap(mem);
                //mem.Close();
            }
            else
            {
                var mem = new MemoryStream(tag.JpegData);
                Bitmap bmp = new Bitmap(mem);
                png = new Bitmap(bmp.Width, bmp.Height);
                Graphics g = Graphics.FromImage(png);
                g.DrawImage(bmp, 0, 0);
                var alpha = SwfReader.Decompress(tag.CompressedAlphaData,
					(uint)(bmp.Width * bmp.Height));
                int j = 0;
                for (int y = 0; y < bmp.Height; y++)
                {
                    for (int x = 0; x < bmp.Width; x++)
                    {
                        int a = alpha[j];
                        var c = bmp.GetPixel(x, y);
                        var col = Color.FromArgb(a, c);
                        png.SetPixel(x, y, col);
                        j++;
                    }
                }
            }
        }
        else if (tag.TagType == TagType.DefineBits)
        {
            int size = tag.JpegData.Count() + 4;
            byte[] buf = new byte[size];

            for (int i = 0; i < tag.JpegData.Count(); i++)
            {
                buf[i + 2] = tag.JpegData[i];
            }
            buf[0] = 0xFF;
            buf[1] = 0xD8;
            buf[2+tag.JpegData.Count()] = 0xFF;
            buf[2+tag.JpegData.Count()+1] = 0xD9;
            var mem = new MemoryStream(buf);
            png = new Bitmap(mem);
            // mem.Close();
        }
        return png;
    }
}

DefineBitsJPEG2 と DefineBitsJPEG3 の場合は、画像ファイルそのもの(jpeg,png,gif)が JpegData 配列に入っているので、Bitmap に落とせます。アルファチャンネルがある場合は、HasAlphaData をチェックして透過データを追加してやります。いちいち GetPixel/SetPixel とやるとスピードが遅いので、適当に unsafe してバイナリを直接扱うとかすると良いでしょう。実際 SwfFormat の中ではそういうコードがあります。

JPEGTables + DefineBits の組み合わせのときは、本当はきちんとやらないと駄目なのですが、そもそもが JPEGTables のサイズが 0 なので、ここでは決め打ちで書いています。前後に SOI と EOI を追加してやれば JPENG として読み込みます。

こんな風に全ての画像ファイルを抽出できます…と思ったのですが、HugFlash の出力と見比べると、ひとつだけファイルが足りないんですよね。どうやら、TagType.DefineBitsLossless か TagType.DefineBitsLossless2 に入っている画像データを忘れていた模様。これはちょっと後で。

■秘書艦の切り替えメモ

こんな訳で、リアルタイムに画像抽出ができそうです。ちなみに SwfFormat を使うと「画像改変」もできるので、Faddler と組み合わせれば、あんな画像やこんな画像ですり替えることは可能ですね。ただし、Faddler 自体がプロキシなので差し替えは可能だし、しかし、304 でローカルキャッシュから持ってきている問題もあるので簡単には差し替えできないという要因もありますが。

ひとまず、13番と15番決め打ちで画像を取り出して、諜報員の画像を切りかえることは可能そうです。

カテゴリー: 開発, C# | SWFファイルから画像を抽出する はコメントを受け付けていません

艦娘所有一覧をExcel VBAから作ろう(開発が完了しました編)

艦娘所有一覧をExcel VBAから作ろう(開発開始!!編) – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5112

の続きです。

艦娘所有一覧
http://dunkel.halfmoon.jp/kancolle/index.html

image

艦娘所有一覧に、諜報員でCSVファイルを吐き出した後、Excel VBA で投稿をします。直接投稿すればいいのですが…まあ、Excel VBAで試したかったというところで。

■諜報員でパース

艦これ諜報員が動いている状態で「図鑑表示」から、艦船図鑑の1,2,3をクリックします。このときのレスポンス(/api_get_member/book2)を調べて、所有している艦船を収集します。たぶん、他でもできそうな気もするんですが…ひとまずこれで。

image

諜報員を右クリックして「オプション」を選択した後に「艦娘所有一覧」でOKを押すと、CSVをデスクトップに出力します。ファイルは面倒なので決め打ち。

image

こんな感じで図鑑番号が取れます。

public List<Ship> ParseBook2( string json )
{
    var reader = JsonReaderWriterFactory.CreateJsonReader(
        Encoding.UTF8.GetBytes(json),
        XmlDictionaryReaderQuotas.Max);
    var el = XElement.Load(reader);
    var doc = ExDocument.Load(el);

    var lst = doc * &quot;api_id&quot; != &quot;-1&quot;;
    var res = new List<Ship>();
    foreach (var it in lst)
    {
        var pa = it.Parent;
        var ship = new Ship() {
            id = pa / &quot;api_id&quot;,
            index_no = pa / &quot;api_index_no&quot;,
            ship_id = pa / &quot;api_table_id&quot;,
            name = pa / &quot;api_name&quot;
        };
        res.Add(ship);
    }
    return res;
}

JSONをパースしているところの抜粋はこんな感じで。JsonReaderWriterFactory から XElement を使って ExDocument を作るという流れです。ExDoc は、なんとなくイイ感じに XML が扱える自作ライブラリです。XPath でもいいのですが、試行錯誤がやりやすいかなと。

■艦娘所有一覧に投稿する。

このCSVファイルを同梱してある「艦娘所有一覧へ投稿.xlsm」に貼り付けて投稿します。所有一覧のページは、マウスでぽちぽちクリックするのですが、これならば一発で投稿完了…つーか、ぽちぽちクリックしている方が楽しくていい感じがするのですが、まあ、このあたりはプログラマの性ということで。

Private Const url = &quot;http://dunkel.halfmoon.jp/kancolle/index.html&quot;
Public Sub 艦娘所有一覧を投稿()
    Dim ie As New InternetExplorer
    ie.navigate url
    ie.Visible = True
    ' 完了待ち
    While ie.Busy = True Or ie.readyState < READYSTATE_COMPLETE
        DoEvents
    Wend
    ' optionタグを取得
    Dim doc As HTMLDocument
    Set doc = ie.document
    Dim coll As IHTMLElementCollection
    Set coll = doc.getElementsByTagName(&quot;option&quot;)
    Dim dic As New Dictionary
    Dim el As IHTMLOptionElement
    For Each el In coll
        dic.Add 0 + el.Value, el
    Next

    ' 図鑑のcellとマッチングさせる
    Dim i
    For i = 2 To 1000
        Dim 図鑑番号
        図鑑番号 = Sheet1.Cells(i, 2)
        If 図鑑番号 = &quot;&quot; Then Exit For
        If dic.Exists(図鑑番号) Then
            Set el = dic(図鑑番号)
            el.Selected = True
        End If
    Next
    ' サブミット
    doc.forms(0).submit
End Sub

Excel VBA の全文はこんな感じです。さっくりと短い感じになっています。これは、yuki(siro) さん のソースがきれい≒操作しやすい、ってのもありますね。option タグが並んで、jQuery で操作しているので、そのあたりを拾い集めればOKです。艦これ諜報員じゃなくても、使えるように別ツールにしてあるので、適当に活用して頂ければと。

■サンプルコード

サンプルコードはこちら http://sdrv.ms/19xmMD0

そのうち、データベース艦これ! にも対応したい。でも、これって母数が不明(失敗は投稿しないだろうから)なので、相対的に特定の艦娘がでやすい、という見方が正しいかも。

カテゴリー: C#, 艦これ | 艦娘所有一覧をExcel VBAから作ろう(開発が完了しました編) はコメントを受け付けていません

艦娘所有一覧をExcel VBAから作ろう(開発開始!!編)

艦娘所有一覧
http://dunkel.halfmoon.jp/kancolle/index.html

image

というのができたそうなので、Excel VBAから(!!!)投稿させてみます。単にちまちま選択するのが面倒なのと…「Excel VBAへのいざない」を書いた後なので、その余力からです。

■Fiddlerで図鑑表示(books)を取得

艦これで「図鑑表示」をすると、/api_get_member/book2 の JSON を取得します。この中に図鑑で表示されている艦娘が取得できます。ええと、図鑑表示の場合、轟沈した艦娘も入っているので、「艦娘所有」ってことにはならないのですが(こっちのは別のAPIがあるので)、多分、図鑑のほうですよね、多分。

{
“api_id”:102,
“api_index_no”:4,
“api_state”:[1,1,0,0,0],
“api_table_id”:87,
“api_name”:”日向”,
“api_yomi”:”ひゅうが”,
“api_stype”:9,
“api_ctype”:2,
“api_cnum”:2,
“api_taik”:74,
“api_souk”:70,
“api_kaih”:22,
“api_houg”:74,
“api_raig”:0,
“api_tyku”:28,
“api_tais”:0,
“api_leng”:3,
“api_sinfo”:”伊勢型戦艦2番艦、日向。<br>ああ、そうだ、あの伊勢と一緒に航空戦艦になったんだ。<br>もともとは、私の砲塔の事故もあるんだけどな。<br>呉で朽ち果てる迄、戦うつもりだ。”
},

色々詳細なデータは取れるのですが、艦娘所有一覧に欲しいのは、上の4つです。

  • api_id : まだ所有したことがない場合は –1 になります。
  • api_index_no : 図鑑の番号です。多分、艦娘所有一覧の順番に一致します。
  • api_table_id : 艦娘の番号です。サーバーのmp3とかswfに使います。
  • api_name : 艦娘の名前ですね。

薀蓄の apai_sinfo の部分は秘密なので、この4つを CSV に出力して Excel 形式に読みませれば OK ですね。

■艦娘所有一覧のソース

さらっとソースを見て Excel VBA からの方針を立てます。

image

普通に submit しているだけなので簡単そうです。option タグの value を設定して、submit すれば ok です。これぐらいであれば、Excel VBA + InternetExplorer オブジェクトを使わなくても十分なのですが、まあ「Excel VBAのいざない」の余力ということで。

続きは割り込みの後で。

カテゴリー: 艦これ | 艦娘所有一覧をExcel VBAから作ろう(開発開始!!編) はコメントを受け付けていません

艦これ 秘書官改め諜報員 ver0.3

艦これ 諜報員 – Moonmile Solutions Blog
http://www.moonmile.net/blog/tools/kchisyo

上記にバイナリ版があります。サンプルソースはこちら。http://sdrv.ms/1fJ0q2X

終了方法を右クリックメニューで付けただけなので、基本は ver0.2と変わっていません。

■ship2 の解析

艦隊における艦娘の ID は、api_get_member/ship2 で以下のように取れる。

“api_data_deck”:
[
{
“api_member_id”:41898,
“api_id”:1,
“api_name”:”第1艦隊”,
“api_name_id”:””,
“api_mission”:[0,0,0,0],
“api_flagship”:”0″,
“api_ship”:[83,71,226,278,250,252]
},

この api_ship のところが、艦娘のユニークIDですね。艦娘は同じ艦種を複数持てるので、これを同じ ship2 の中で探していくと、「83」というのが、ship_id の「221」ということが分かります。これが「榛名改」です。

{
“api_id”:83,
“api_sortno”:311,
“api_ship_id”:211,
“api_lv”:47,
“api_exp”:111978,
“api_nowhp”:75,
“api_maxhp”:75,
“api_leng”:3,
“api_slot”:[246,108,247,248,-1],
“api_onslot”:[3,3,3,3,0],
“api_kyouka”:[14,0,32,19],
“api_backs”:5,
“api_fuel”:90,
“api_bull”:120,
“api_slotnum”:4,
“api_ndock_time”:0,
“api_ndock_item”:[0,0],
“api_srate”:3,
“api_cond”:84,
“api_karyoku”:[129,94],
“api_raisou”:[0,0],
“api_taiku”:[75,79],
“api_soukou”:[86,89],
“api_kaihi”:[51,69],
“api_taisen”:[0,0],
“api_sakuteki”:[31,49],
“api_lucky”:[20,69],
“api_locked”:1
},

ship_id がどの艦種を示しているかというと、これは起動時に読み込まれる api_get_master/ship の中に書いてあります。このファイルは結構でかい(400Kぐらいある)ので、いちいち検索するよりは、まあ、ship_id はそうそう変わらないので(アップデートの時は変わるんでしょうが)、これを保持しておいて、艦娘の画像を出したりできますね。色々なパラメータがあるので、これを取り出して戦況を有利に勧めることはできそうですが…まあ、だいたいはブラウザで見えるので、これ自体はあまり意味ないかも。回避能力とか運とかを見比べるぐらいですかね。

カテゴリー: 艦これ | 艦これ 秘書官改め諜報員 ver0.3 はコメントを受け付けていません

情報の濃度勾配と非不変性の話

https://twitter.com/PaxilAddict/status/375349331076710401

本当は昨日の夜にざっくりと説明しようと思ったのですが、忘れてたので昼に30分ほど。

経済の仕組みとして商社/物流の場合には「濃度勾配」=「安く仕入れて高く売る」のが基本なので、そのあたりの言及は別として(彼のほうが詳しいだろうし)、具体的に「情報」の話に絞ります。

で、議論を始める前に「情報とはなんぞや?」というのを定義しないといけないのだけど、情報工学的に言えば「とある現象が整理された状態」を情報とみなしています。この「整理された状態」ってのが曲者で、観察者の主観が入っています。なので、現象そのものは「情報」とはみなさないのですよ。昨今のビックデータみたいなのは「現象そのもの」ではないか?と思われるでしょうが、とある現象から生データを保存している状態で「整理した状態」であるし、またデータベースの作りの状態で「整理された状態」であり、厳密に言えば現象そのものではありません。なので、「現象そのもの」を扱うのは非常に難しいのではありますが…実は、現象そのもの自体を観察することはできないので、このあたりは不要な議論だったりします。

ええ、みなさんご存じの通りッ!!!、量子力学の範疇では位置とエネルギー(運動量)は同時に特定できません。マクロ的な視点で言えば、その位置にありその運動ありという2視点で特定できるように見えますが、実はミクロ視点の誤差においては確実ではありません。まあ、そこまで数値を突き詰めることがないので「誤差」だったりするのですが、それこそが、不確定性の部分と確率の部分になるのですよ。なので、微小な範囲で不確定であるものが、全体においてどのように影響するか。それは「誤差」以上に影響するのか?という問題があって、一見、目に見える物理法則は量子力学を含んでいないように見えますが、頭の中で考える電磁的なパイプ(名を失念)に電気が流れるとき(電子が伝播するとき)には、量子力学的な不確定さが発揮されます。これゆえに、この微小な電子信号で左右される思考自体も、不確定さの範疇になります。つまり、Aの現象を同じ条件下で受け取ったとしても、反応は、AかもしれずBかもしれず、ということです。ひとつの電子量で判断を行う場合には、量子力的な揺らぎを大きく含みますが、大抵の場合はそれなりに大きな電子量が使われるので、アナログ的にどちらかの確率が高くになります。このあたりファインマンの光の直線性に関する考察を読むとわかるのですが、因果関係が逆転しているように見えてきます。未来があって過去が決定する、というような感じですね。

話が大幅にずれてきていますが、元に戻すと「現象そのもの」は「情報」としてイコールにならない、という前提があります。あるいは、情報を「現象そのもの」として捉えようとしても、それは無理、ということですね。もう少し数学的に言えば、1+2=3の場合、「1+2」と「3」は数値的にはイコールですが、復元するときの情報量が違います。これは情報の圧縮とか不可逆性とかにも関係しますが、現象自体はそのまま未来に残すことはできないので、「1+2」のなかの「+」という演算子を、結果が「3」であることに集約させてしまいます。これはこれで便利なのですが、時として「+」が必要な時がありますよね。一体、何と何を足したら「3」になったのか?ということが問われるシーンがあります。これらのシーンに対しては未来に位置しているにも関わらず、過去に対して「+」を要求するという時間の逆行があります。時間の流れが不変(実は、ファインマンによって、逆行することが証明されているけど…というか、逆行の再定義というところか)と考えるならば、「3」という結果からは「1+2」という原因の部分は類推できません。しかし、物事は「3」で十分だし、もともと類推できないのだから、「1+2」という原因自体が不要、ということです。そんな訳で、時間が進むに従って、原因は次々と捨てられていき、新しい原因が次々と作られているということになります。

さて、この時間の逆行や原因が捨てられる、という視点は、ひとりの観察者の視点ですね。なので、複数の観察者が同じ現象を観察したときには、それぞれの視点により「情報」を蓄積します。同じ現象(と思われるもの。これが同じであるとは証明できない)に対して、同じ情報を得られる場合は、同じ現象から類推している、という結論が得られます。演繹法ですね。ですが、ここで気を付けたいのは、AとBという二人の観察者が、同じ現象を見て「情報」を得たとしても、それぞれの情報はの違いは「それぞれの情報を突き合わせたとき」にしか違いがわかりません。これは、情報を比較するという情報自体が、情報を比較という現象そのものとは違うという意味です。通常、情報自体は光の速度で伝播しますが(光の速度以上にならないのは、物理的な影響の最速が光だから、というためです…が、量子力学的に時間の逆行と不確定性を含めると、光よりも早く伝播する可能性はあります)、これをAとBが持つ「情報」自体が、物理的に離れていれば同時には無関係になる、影響しえないという「光の円錐」あるいは「情報/影響の円錐」になります。この円錐同士が重なるときだけ、それぞれの情報は交差します。逆に言えば、それ以外のところでは、全く影響しないし、他の情報を得ること自体が無意味である、という結論になります。

情報の円錐が重ならなければ情報として有効でない、ということと、数々の過去の原因が捨てられてつ新しい原因が作られ、それの切り取りが「情報」である、ということを合わせると、情報自体が「非不変」であることがわかります。また、円錐の重なりが観察者それぞれ(情報の受給者それぞれ)に与えられるので、何かの情報を得る人と何かの情報を得ない人が存在し、そこには濃度勾配があることがわかります。まあ、証明しなくても「情弱」という言われ方もするし、英語が読めなければ英語論文から情報を得る機会はすくなくなるだろうし、逆に言えば日本語ができなければ日本の情報を得る機会は少ないってことです。

で、先のビックデータのように情報は必ず「媒体」に依存します。データベースのテーブル構造もそうだし、記憶領域の制約もあります。第一にモデルを作ったときに、情報を整理するときに重要な要素が欠損しているかもしれません。もちろん、欠損していないようにテーブルは作る訳ですが、欠損するテーブルを敢えて作ることもできますよね。つまりは、未来は完全に予知できないのです。仮に欠損してしまったデータを「事象そのもの」として判断をし、なんらかの基準で「情報」を取り出したときに、それらの「情報」は本来の事実を表しているかどうか?の判断は難しいところです。多少の欠損ならば、確率的に大まかな予想があたっているかもしれませんが、微小領域では間違っているかもしれません。複雑系の畳み込み理論ってことです。畳み込まれたものは元に戻せませんし、逆に微小な範囲が大きな次の現象に影響を与えることがあります。これは先の脳内の量子力学的な性質と同じです。

こうなると「情報」の曖昧さ、正確性が問題になるのですが、大域においては問題は少ないのです。大抵の動きはニュートンの物理法則で事足りるように、人の動きと考えの大域においては似たようなものです。それを行動原理と言ったり行動経済学と言ったりします。大抵の場合「情報」を何等かの判断のものとにするために必要とされているので、「正しい情報」と「膨大な情報」を人は欲します…が、先に言った通り、情報の正確性というのは判断がつかないものです。これを回避するひとつの手段としては、観察者を複数持ち、複数の観察者から得られる情報を総合して、自らの情報として捉えることです。できれば、それぞれの情報供給元は、おのおの情報の円錐の外にある人がよいでしょう。これらの複数の情報から、ひとつの確率の高いもの次に確率の高いものをピックアップします。そのあたりは「非効率」なので、人はひとつの情報元を自分の情報として据え置きます。これは、生物手学的に「効率的」な方法なので、命にかかわらないこと(あるいは、趣味なのでどーでもいいようなこと)はそれはそれでいいのですが、まあ、お金や生命に関わることは、別視点を用意したほうがいいですよね。それを「情報収集のためのアンテナ」と呼ぶこともあるのですが、先に示した通り情報の円錐内にあるものだけを集めてもダメです、ってことです。

逆に言えば、情報源を少なめにする(厳選する)と、情報を整理する側(=自分の頭)に余裕ができるので生活が楽になります。いやいや、ジャーナリストという情報の海を泳ぐ方もいらっしゃるので、職業的には不可能な場合もあるのでアレですが、私の場合 TV を観なくなってからかなり情報の流入は制限されて、他の余裕ができています。とはいえ、

ドコモからのお知らせ : 本日の一部報道について | お知らせ | NTTドコモ

image

えええ?それってどういうこと?いやいや、私、ドコモユーザーでもないし、どーでもいいのですが、他の方の反応が気になるところです。

カテゴリー: 雑談 | 情報の濃度勾配と非不変性の話 はコメントを受け付けていません

UpdateLayeredWindowを使って縁取りも鮮やかに(祥鳳撃沈編)

艦これ秘書官 ver.0.1 – Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5077

の縁取りは、フォームに TransparencyKey を設定する方法で縁取りがあまりきれいではありません。これは、元画像にアルファチャンネル(透明度)が設定しているためでそこのところにフォームの色が重なっているので…ってな感じです。this.TransparencyKey = this.BackColor と設定すればお手軽に透過ができるのですが、今となってはいまいち綺麗ではないかなと。Region を使っても似たことができるのですが、不定形の場合大変なのと Region 自体の数が多いとスタックオーバーフローで落ちる、という欠陥があります。このあたりの話はまた別の記事にでも。

■レイヤーウィンドウを使って縁取りをきれいにする

UpdateLayeredWindow 関数
http://msdn.microsoft.com/ja-jp/library/cc364847.aspx

のあたりを読んでも、さっぱりわからないので先達のサンプルを探します。

半通過ウィンドウの作り方講座
http://www.inasoft.org/wpt/ulw.html
[VB, C#] レイヤード ウィンドウを使用する
http://youryella.wankuma.com/Library/Extensions/Form/LayeredWindow.aspx

のソースを丸ごと持ってきてコピーして使っています。便利なレイヤーウィンドウのライブラリを作るのは大変なのですが、ひとまず、

  • 秘書艦の縁取りができればOK
  • 定期的に書き換える遠征と入渠の残り時間が表示できればOK

ということにしておきます。こんな感じに、榛名の切り取りと遠征/入渠の残り時間がうまく切り取れています。ソースを見るとわかるのですが、文字のところを含めて1秒間に1回 bitmap を書き換えるという荒業をしているので、パフォーマンス的にどうかなというわけなのですが…「ええ、榛名なら大丈夫でしょう」…というか、1コマ/秒ならば動画よりも少ないので大丈夫でしょう。

image

■Windows 8 のトーストを付ける

ついでに Windows 8 の場合はトースト≒通知機能を付けてみました。トースト自体は Windows 8 の機能ですが、それを利用するには WinRT API を使わないと駄目、というジレンマがあります。が、Outlook 2013 でも実装されているので普通に許容範囲ですね。

デスクトップアプリからWinRT APIを使用する – 酢ろぐ!
http://ch3cooh.hatenablog.jp/entry/20121204/1354596483
Windows Sending toast notifications from desktop apps sample in C#, C++ for Visual Studio 2012
http://code.msdn.microsoft.com/windowsdesktop/Sending-toast-notifications-71e230a2
Windows® API Code Pack for Microsoft® .NET Framework – Home
http://archive.msdn.microsoft.com/WindowsAPICodePack

から Toast の処理を丸ごと持ってきています。ややこしい AppUserModelId の設定もサンプルの中に入っているので、それも持ってきてあります。まあ、デスクトップアプリからスタート画面にピン止めをするので、スタート画面のアイコンが変なのですが(KcHisyo8のアイコン)…まあ、これは後で直しましょう。Windows 7 以前は、トーストの機能はないので、別プロジェクトにしてあります。

image

■サンプルコード

KcHisyo-v0.2-src.zip 艦これ秘書官 ver.0.2
http://sdrv.ms/1aaZDXK

からソースがダウンロードできます。バイナリのほうは、バージョン番号と終了方法を付けたら再びアップということで。いまのところ、終了方法はタスクバーから「閉じる」を選択しないとだめなので…ちょっとアレですね。

■祥鳳撃沈

そんな訳で、長らく愛用しておりました祥鳳さんが沖ノ島海域で撃沈です orz あまりレベル上げに専念していないので、ちと敷波さんといい気を付けないと。しかもクリアできていないし。

imageimage

プロジェクトでも、ひとり弱いと割りを喰うわけで、他が戦艦だとちょっと装甲の弱い祥鳳では無理ですね。TOC のレバレッジの考え方とか、構造力学の応力集中の考え方とか(切込みを丸くして応力を分散する方法とか)そういう物理原則が入ってくる(あるいはそんな感じがする)のが、面白いところです。このあたり、1チーム6艦船しかないという制限のなかで、どのような配艦をすれば良いのか?とか考えたりすると更に楽しめるかも。まあ、ゲームとしてはある程度レベル上げをしないとうまくいかないのですが「新人をどのように育てるのか?」っていう感じで。

# ううう、祥鳳は、数隻持っていたけど先日、まとめてた(祥鳳自身に近代改装した)ので1隻しかないのが仇に。というか、そういうシビアさ≒縛りもまた宜しということで。

カテゴリー: C#, WinRT, 艦これ | UpdateLayeredWindowを使って縁取りも鮮やかに(祥鳳撃沈編) はコメントを受け付けていません

艦これ秘書官 ver.0.1

艦これ 司令部室
http://nozomi.arege.jp/KanHQ/

に触発されて、遠征と入渠の残り時間だけ表示するツールを作ってみました。こんな風にデスクトップに貼りつきます…つーか、画像の縁取りがいい加減(プログラムがいい加減)なのは、サンプルということで。

20130904_03

ソースは http://sdrv.ms/15UAUWW からダウンロードしてください。Visual Studio 2012 でビルドしているので、そのあたりは適当に。バイナリは、もうちょっと整理してからにしましょう。

中身で何をやっているかというと、

  • FiddlerCoreを使ってIEのプロキシをフックする。
  • 遠征(deck_port)と入渠(ndock)のアドレスの時だけレスポンスをチェックして、JSONをパース
  • 定期的に遠征と入渠の時間を書き換え

ています。

JSONでパースするところは、JsonReaderWriterFactory.CreateJsonReader を使って XElemen に直した後に、自前の ExDoc を使って検索しています。ExDoc は遅延実行していないのですが…まあ、この程度ならばいいか、って感じでいい加減な作りです。ちょっと、仕事に使う予定なのでデバッグと必要なメソッドを調査も兼ねてってことで。ソースの解説は後ほど。

■今後の予定…は未定

  • 遠征や入渠が終わった後に、Win8 の通知がでるといいかな。
  • 秘書官の画像を「秘書艦」にあわせる、とか。
  • ひとまず、秘書官の透過をもうちょっときれいにしないと。
  • 「何か。」みたいに喋ったほうがいい?

本家のゲームは 艦隊これくしょん~艦これ~ DMM.com×角川ゲームスが贈る新鋭の大型戦略コンテンツ – オンラインゲーム – DMM.com

カテゴリー: 開発, EXDoc, 艦これ | 艦これ秘書官 ver.0.1 はコメントを受け付けていません