Antoine.st 2011-03

2011-03-28

Tepco usage

東京電力電力供給状況 API というのがあったので、さくっと 作ってみました。結構簡単に作れるもんなんですね。LimeChat 用の スクリプト を参考にさせてもらってます。

LimeChat スクリプトの方は、そのままじゃ動かなかった ( 要認証のプロクシがいるため ) ので、XMLHttpRequest の代わりに ServerXMLHTTPRequest か何かを使うように修正と。結構さくさく動いていい感じです。


2011-03-12

Earthquake

東京でも震度 5 強。すごい地震でした。震源地に近い東北の方ではさらに。大丈夫でしょうか、心配です...。

JR 東日本が運行を取りやめるなど、すっかり交通マヒ状態でした。晴海から日比谷までバスで 4 時間。東京メトロはだいぶ回復してて、ありがたいことに終夜運転をやってくれるんだとか。なんとか帰り着きましたんですが、最後にマンションのエレベータが止まっているというオチが。10 階以上を階段で登るとさすがに足がプルプルします...。


2011-03-10

Detect Platform Target

.NET のアセンブリが何をターゲットにビルドされているか? ということは、PE の IMAGE_FILE_HEADER 構造体の Machine の値と CLR Header のフラグから判定できます。問題は AnyCPU で、これは、IMAGE_FILE_HEADER.Machine が x86 ( 0x014c ) で、かつ、CLR Header の flags に COMIMAGE_FLAGS_32BITREQUIRED ( 0x00000002 ) が設定されていない場合になります。

ついでに言うと、この flags、つねに COMIMAGE_FLAGS_ILONLY ( 0x00000001 ) が設定されている、とかってのは、この辺の PDF に書いてありました ( 25.3.3.1 Runtime flags )。というわけなんですが、ちゃんとメソッドなりが用意してあるのが .NET Framework のいいところ。

↓のような感じで取得できます。Assembly.ReflectionOnlyLoadFrom() メソッドでなら、x86 環境で IA64 やら x64 のアセンブリも読み込めます。いい感じ。


  Assembly asm;
  Module[] ms;
  PortableExecutableKinds pek;
  ImageFileMachine ifm;
  string buf;

  asm = Assembly.ReflectionOnlyLoadFrom( アセンブリのパス );
  ms = asm.GetModules();

  foreach (Module m in ms) {
        
    pek = new PortableExecutableKinds();
    ifm = new ImageFileMachine();
    buf = "";
    m.GetPEKind(out pek, out ifm);

    switch (ifm) {
      case ImageFileMachine.I386:
        if ((pek & PortableExecutableKinds.Required32Bit) != 0)
          buf = "Target Platform : x86";
        } else {
          buf = "Target Platform : AnyCPU";
        }
        break;
      case ImageFileMachine.AMD64:
        buf = "Target Platform : x64";
        break;
      case ImageFileMachine.IA64:
        buf = "Target Platform : IA64";
        break;
      default:
        buf = "Target Platform : Unknown";
        break;
    }
    MessageBox.Show(buf);
  }


2011-03-06

Version resource

バージョンリソースを書き換えて、ファイルのプロパティで表示される『著作権』部分を変更する、というサンプル。要 Unicode ビルド。おそらく、バージョンリソースだのなんだのが Unicode なので、W 版が必要なんだろう、ってことなんですが、詳しくは調べてません。最近、わざわざマルチバイトでビルドすることもないですしね。

ここでは『LegalCopyright』を指定してますが、他の文字列を指定することで、別の部分を書き換えることも可能です。どんなのがあるのかは、ここ らへんで確認してください。


  struct LANGANDCODEPAGE {
    WORD wLanguage;
    WORD wCodePage;
  } *pLangCodePage;
  
  LPCTSTR pFile = TEXT("C:\\sample.exe");
  DWORD dwHandle;
  DWORD dwSize;
  LPTSTR pTarget;
  UINT uLen;
  LPBYTE pBlock;
  HANDLE hResource;
  TCHAR subBlock[255];

  dwSize = ::GetFileVersionInfoSize(pFile, &dwHandle);
  pBlock = new BYTE[dwSize];
    
  ::GetFileVersionInfo(pFile, 0, dwSize, pBlock);
  ::VerQueryValue(pBlock,
    _T("\\VarFileInfo\\Translation"),
    (LPVOID *)&pLangCodePage,
    &uLen);

  ::wsprintf(subBlock,
    _T("\\StringFileInfo\\%04x%04x\\LegalCopyright"),
    pLangCodePage->wLanguage,
    pLangCodePage->wCodePage);

  ::VerQueryValue(pBlock,
    subBlock,
    (LPVOID *)&pTarget,
    &uLen);
  ::ZeroMemory(pTarget,
    _tcslen(pTarget) * sizeof(TCHAR));
  _tcscpy(pTarget, _T("Copyleft :-)"));
      
  hResource = ::BeginUpdateResource(pFile, FALSE);
  ::UpdateResource(hResource,
    RT_VERSION,
    MAKEINTRESOURCE(VS_VERSION_INFO),
    pLangCodePage->wLanguage,
    pBlock,
    dwSize) ;
  ::EndUpdateResource(hResource, FALSE);

  delete[] pBlock;


2011-03-02

Technical Briefing

なぜか連続で 『テクニカルブリーフィング』 と称するものに行く機会がありました。内容の方は... 微妙な感じで。それよりなにより、わざわざそういう場でやる必要があることなの? って点がかなーり疑問な感じ。おそらく、テキストなり PDF なり、何らかの形でまとめれば 15 分程度で読める内容を、むりくり 1 時間 〜 2 時間のセッションにしてる、としか言えない程度のものでございまして。

わたしも何度かセッションをやる機会がありましたが、『単に読むだけ』 に終わらないように、自分なりに考えて ( おもにデモで ) 楽しめるような内容にしようと心がけてました。もちろん、いろいろな制約があって、『自分がやりたいこと』 ではなくて、『やらなくちゃいけないことをやらされてる』 ってことなんでしょうけどね。

ますます引きこもり度が高くなりそうな今日この頃でした。