2012年12月15日土曜日

Mail.MSMessageStore 解析資料

Mail.MSMessageStore の仕様を独自に解析してみました。

解析資料

データベースには ESE (Extensible Storage Engine) が採用されています。ISAM 形式です。
Outlook Express のデータベースのような 2GB 境界で壊れやすい仕様・実装ではなく、かなり信頼性の高いコンポーネントです。

ESE データベースを閲覧・編集する良い塩梅のソフトがなかなか見つからなくて、作りました。eseViewer です。


Mail.MSMessageStore テーブル一覧:
  • DirtyQueue
  • Folders
  • Junk
  • Messages
  • Offline
  • SearchFolder
  • ServerOperation
  • Streams
  • Uidl
  • UserDataTable

Foldersの中身例:

Messagesの中身例:

2012年12月5日水曜日

Apache OpenOfficeビルド: libxsltでlibxml/xmlversion.hが見つからない

Apache OpenOffice 3.4.1のビルド中に遭遇したエラーです。

=============
Building module libxslt
=============

Entering /home/KU/8/aoo-3.4.1/main/libxslt


Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl.exe /nologo /D "WIN32" /D "_WINDOWS" /D "_MBCS" /W3 /MD /D "_REENTRANT" /I.. /I..\libxslt /I.\include /D_CRT_SECURE_NO_DEPRECATE /D_CRT_NONSTDC_NO_DEPRECATE /D "NDEBUG" /O2 /Foint.xslt.msvc\ /c ..\libxslt\attributes.c ..\libxslt\documents.c ..\libxslt\extensions.c ..\libxslt\extra.c ..\libxslt\functions.c ..\libxslt\imports.c ..\libxslt\keys.c ..\libxslt\namespaces.c ..\libxslt\numbers.c ..\libxslt\pattern.c ..\libxslt\preproc.c ..\libxslt\security.c ..\libxslt\templates.c ..\libxslt\transform.c ..\libxslt\variables.c ..\libxslt\xslt.c ..\libxslt\xsltlocale.c ..\libxslt\xsltutils.c ..\libxslt\attrvt.c
attributes.c
..\libxslt\win32config.h(92) : fatal error C1083: include ファイルを開けません。'libxml/xmlversion.h': No such file or directory
documents.c
..\libxslt\win32config.h(92) : fatal error C1083: include ファイルを開けません。'libxml/xmlversion.h': No such file or directory
extensions.c
..\libxslt\win32config.h(92) : fatal error C1083: include ファイルを開けません。'libxml/xmlversion.h': No such file or directory

簡単な直し方がわからなかったので、libxslt\makefile.mkを編集しました。

CONFIGURE_DIR=win32
CONFIGURE_ACTION=cscript configure.js
#CONFIGURE_FLAGS=iconv=no sax1=yes
CONFIGURE_FLAGS=include=../../../../../../libxml2/wntmsci12.pro/inc lib=../../../../../../libxml2/wntmsci12.pro/lib

一番下のCONFIGURE_FLAGSを足しました。

更に、libxslt\wntmsci12.pro\misc\build\so_configured_so_libxsltを削除して、configure.jsを再実行できるようにします。

これでビルドしたら成功しました。

美しくない解決法ですが、取り敢えず直りました。しかし、きれいな直し方がわからないのが残念です。

Apache OpenOffice: embedservでatls.libを取り込みしない件

Apache OpenOfficeのビルドで、
ATL_LIBやATL_INCLUDEを正しく設定しているにも関わりませず、
次の様なビルドエラーになる場合が有ります。

Making:    emser.dll
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.

/MAP /OPT:NOREF -safeseh -nxcompat -dynamicbase -NODEFAULTLIB -RELEASE -DEBUG -INCREMENTAL:NO /SUBSYSTEM:CONSOLE /DLL -out:../wntmsci12.pro/bin/emser.dll -map:../wntmsci12.pro/misc/emser.map -def:../wntmsci12.pro/misc/emser.def -implib:../wntmsci12.pro/lib/emserimp.lib ../wntmsci12.pro/slo/emser_version.obj ../wntmsci12.pro/slo/register.obj ../wntmsci12.pro/slo/servprov.obj ../wntmsci12.pro/slo/docholder.obj ../wntmsci12.pro/slo/ed_ipersiststr.obj ../wntmsci12.pro/slo/ed_idataobj.obj ../wntmsci12.pro/slo/ed_ioleobject.obj ../wntmsci12.pro/slo/ed_iinplace.obj ../wntmsci12.pro/slo/iipaobj.obj ../wntmsci12.pro/slo/guid.obj ../wntmsci12.pro/slo/esdll.obj ../wntmsci12.pro/slo/intercept.obj ../wntmsci12.pro/slo/syswinwrapper.obj ../wntmsci12.pro/slo/tracker.obj isal.lib icppu.lib icppuhelper.lib ole32.lib gdi32.lib uuid.lib oleaut32.lib msvcrt.lib uwinapi.lib kernel32.lib user32.lib oldnames.lib stlport_vc71.lib ../wntmsci12.pro/misc/emser.res
   ライブラリ ../wntmsci12.pro/lib/emserimp.lib とオブジェクト ../wntmsci12.pro/lib/emserimp.exp を作成中
esdll.obj : error LNK2019: 未解決の外部シンボル "class ATL::CAtlComModule ATL::_AtlComModule" (?_AtlComModule@ATL@@3VCAtlComModule@1@A) が関数 "public: long __thiscall ATL::CComModule::Init(struct ATL::_ATL_OBJMAP_ENTRY30 *,struct HINSTANCE__ *,struct _GUID const *)" (?Init@CComModule@ATL@@QAEJPAU_ATL_OBJMAP_ENTRY30@2@PAUHINSTANCE__@@PBU_GUID@@@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル "unsigned int (__stdcall* ATL::g_pfnGetThreadACP)(void)" (?g_pfnGetThreadACP@ATL@@3P6GIXZA) が関数 "unsigned int __stdcall ATL::_AtlGetConversionACP(void)" (?_AtlGetConversionACP@ATL@@YGIXZ) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegDeleteKeyA@8 が関数 "public: long __thiscall ATL::CRegKey::DeleteSubKey(char const *)" (?DeleteSubKey@CRegKey@ATL@@QAEJPBD@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegDeleteValueA@8 が関数 "public: long __thiscall ATL::CRegKey::DeleteValue(char const *)" (?DeleteValue@CRegKey@ATL@@QAEJPBD@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegCloseKey@4 が関数 "public: long __thiscall ATL::CRegKey::Close(void)" (?Close@CRegKey@ATL@@QAEJXZ) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegCreateKeyExA@36 が関数 "public: long __thiscall ATL::CRegKey::Create(struct HKEY__ *,char const *,char *,unsigned long,unsigned long,struct _SECURITY_ATTRIBUTES *,unsigned long *)" (?Create@CRegKey@ATL@@QAEJPAUHKEY__@@PBDPADKKPAU_SECURITY_ATTRIBUTES@@PAK@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegOpenKeyExA@20 が関数 "public: long __thiscall ATL::CRegKey::Open(struct HKEY__ *,char const *,unsigned long)" (?Open@CRegKey@ATL@@QAEJPAUHKEY__@@PBDK@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegSetValueExA@24 が関数 "public: long __thiscall ATL::CRegKey::SetDWORDValue(char const *,unsigned long)" (?SetDWORDValue@CRegKey@ATL@@QAEJPBDK@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegQueryInfoKeyA@48 が関数 "protected: int __thiscall ATL::CRegParser::HasSubKeys(struct HKEY__ *)" (?HasSubKeys@CRegParser@ATL@@IAEHPAUHKEY__@@@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル __imp__RegEnumKeyExA@32 が関数 "public: long __thiscall ATL::CRegKey::RecurseDeleteKey(char const *)" (?RecurseDeleteKey@CRegKey@ATL@@QAEJPBD@Z) で参照されました。
esdll.obj : error LNK2019: 未解決の外部シンボル "class ATL::CAtlBaseModule ATL::_AtlBaseModule" (?_AtlBaseModule@ATL@@3VCAtlBaseModule@1@A) が関数 "public: long __stdcall ATL::CAtlModule::UpdateRegistryFromResourceS(char const *,int,struct ATL::_ATL_REGMAP_ENTRY *)" (?UpdateRegistryFromResourceS@CAtlModule@ATL@@QAGJPBDHPAU_ATL_REGMAP_ENTRY@2@@Z) で参照されました。
../wntmsci12.pro/bin/emser.dll : fatal error LNK1120: 外部参照 11 が未解決です。
dmake:  Error code 96, while making '../wntmsci12.pro/bin/emser.dll'

1 module(s):
        embedserv
need(s) to be rebuilt

WINDOWS_VISTA_PSDKを定義し、適当な値を設定しましょう。

winenv.set.shファイルの中程に行を追加します。

WINDOWS_VISTA_PSDK=aaa

export WINDOWS_VISTA_PSDK=aaa

winenv.set.shの中に入れてもunsetされることが分かりました。都度、環境変数を作りましょう。

さて、atls.libを含まない事がビルドエラーの原因と考えられます。

embedserv\util\makefile.mkを確認しますと、WINDOWS_VISTA_PSDKの内容有無で判断するようになっています。

.IF "$(WINDOWS_VISTA_PSDK)"!=""
SHL1STDLIBS+=\
  $(ADVAPI32LIB) \
  $(ATL_LIB)$/atls.lib
.ENDIF # "$(WINDOWS_VISTA_PSDK)"!=""

C:/cygwinc:/cygwinの件

Apache OpenOffice/LibreOfficeのビルドエラーで、
C:/Cygwinc:/cygwinの文言が出現する場合が有ります。

[ build RES ]
awk: fatal: can't open source file `C:/cygwinc:/cygwin/home/KU/8/aoo-3.4.1/main/solenv/gbuild/processdeps.awk' for reading (No such file or directory)
C:/cygwin/home/KU/8/aoo-3.4.1/main/solenv/gbuild/WinResTarget.mk:59: recipe for target `/home/KU/8/aoo-3.4.1/main/solver/341/wntmsci11.pro/workdir/WinResTarget/comphelper/default.res' failed
make: *** [/home/KU/8/aoo-3.4.1/main/solver/341/wntmsci11.pro/workdir/WinResTarget/comphelper/default.res] Error 2
dmake:  Error code 2, while making 'all'

LINK : fatal error LNK1181: 入力ファイル 'isal.lib' を開けません。

Apache OpenOfficeの場合、winenv.set.shを編集します。
LibreOfficeの場合、Env.Host.shを編集します。

C:/cygwinc:/cygwinに置き換えます。最初のCを小文字のcにします。

C:\\cygwinc:\\cygwinに置き換えます。これも同様です。

書き換えた後、sourceを再実行する事をお忘れなく!

source winenv.Set.sh

これだけでビルドがすっきり通るようになると思います。

2012年11月26日月曜日

IThumbnailProvider+IInitializeWithStream+Windows 8

IThumbnailProvider+IInitializeWithStream+Windows 8で、IStream::Statを実施しても、ファイル名が取得できなくなっています。Windows 7では取得できたのに… 急遽IInitializeWithItemを実装しまして、psi->GetDisplayName(SIGDN_FILESYSPATH, &pszName)で、ファイルパスを取得し、IInitializeWithFile::Initializeに接続し、何とか凌ぎました。

2012年11月14日水曜日

ERROR [HYC00] UTF-8 conversion isn't implemented before 7.1

PostgreSQL 7.0.4 (Linux)から、 PostgreSQL 8.2.22 (Windows)に、移行する依頼を受けています。 pg_dumpを使うと、文字化けが起こります。 Npgsqlを使うと、Connection.Openで、固まります。 Odbcを使うと、"ERROR [HYC00] UTF-8 conversion isn't implemented before 7.1"が発生します。 対策を探しています。

2012年9月20日木曜日

Copy2Glacier仕様 (SlowGlacier)

Copy2Glacierとは、Amazon Glacierに「ゆっくりと」ファイルをアップロードするプログラムです。

入手につきましては、準備中です。

開発の動機としまして:
  • ノートパソコンのディスクイメージを複数持っていて、保管したい。安全に! 長期で!
  • 30GB/日制限が有り、全速力でアップロードすると制限に触れて問題が発生します。
さて、これよりCopy2Glacierの使い方・どのように動作するのか・作りこみをざっくりと紹介していきます。

使い方

C:\GLACIER>Copy2Glacier.exe
Copy2Glacier /ia1 <access key>
Copy2Glacier /ia2 <secret key>
Copy2Glacier /partsize <part size. default: 4194304>
Copy2Glacier /region <region system name. default: us-east-1>
Copy2Glacier /prep <up info file> <file> <vault name>
Copy2Glacier /up <up info file> <max parts count to upload>

prepの使い方


元のファイルを読み取って、アップ情報ファイルを作成します。

C:\GLACIER>Copy2Glacier.exe /prep PC2 2010-04-09-13-img-pc2-recovery.7z 2010-04-09-13-img-pc2-recovery.7z
ハッシュ計算するので、少し時間が掛かります。

作成したアップ情報ファイルは、大体次のようなります。ANSIエンコード(CR LF)で保存します。日本語WindowsであればCP932。*n?xであれば、EUC/UTF8等、環境による。最初はUnicodeと書いていたのですが、途中で書き直してややこしい事に。(^^;

#!Copy2Glacier
C:\GLACIER\2010-04-09-13-img-pc2-recovery.7z
:archivesize 9033470095
:partsize 4194304
:vaultname 2010-04-09-13-img-pc2-recovery.7z
+ 0 4194304 8e08b908dbe67e8c20a8859407d656df7b73d3989217c8943c0c654c618cfabe
+ 4194304 4194304 d4f270466bc4c79dd4393d12aa06aea4a087d2ea9aad2ca099c3ac85c67bd9d9
+ 8388608 4194304 0c36970933853ce5844cf94c2dd7d5cbc2c7c40c6180f6ac7637cb0aef915874
...
+ 9026142208 4194304 52dc52bf516d11fd649e6d334eb1cd9cfc884cedf207ead58e6b77f9fd3d0887
+ 9030336512 3133583 d2aedbaf9a03f34227384aa18c4a072b2d975a19ac3856da938e411aaaf88a5a
$ 8a0e3deb40a6caa8da0755c5c945ce9e4e3af57c27fd65e236c11c7f4f425176
1行目は、ファイル形式用のマジック
2行目は、元のファイルのフルパス。
3行目(:archivesize)は、ファイルのバイト数(Int64)
4行目(:partsize)は、断片の大きさ・バイト数
5行目(:vaultname)は、保管庫の名前
コロンで始まる行は、KeyとValueをペアにした設定値です。
プラスで始まる行は、UploadMultipartPartRequestに使用する情報です。(断片の開始オフセット バイト数 ハッシュ値)で構成されます。
ダラーで始まる行は、ツリーハッシュを示します。

いずれもAmazon Glacierにアップロードする際に必要となる情報です。

up


次に、アップロードのコマンドです。4MBの断片を10個上げる指示をしています。これをジョブ化しておけば、ゆっくりアップロードを実現できます:

C:\GLACIER>Copy2Glacier.exe /up PC2 10
アップロードが進みますと、アップ情報ファイルに追記していきます。

:location /XXXXXXXXXXXX/vaults/2010-04-09-13-img-pc2-recovery.7z
:uplocation /XXXXXXXXXXXX/vaults/2010-04-09-13-img-pc2-recovery.7z/multipart-uploads/XXXX-XXXXXXXXXXXXXXXGFF8yd18rTKveS8BbF5IH8MbBKm8Ff-XXXXXXXXXX_XXXXXXXXXXXXXXXXXXXXXX3l0J7T2s
:uploadid XXXX-XXXXXXXXXXXXXXXXXX8yd18rTKveS8BbF5IH8MbBKm8Ff-XXXXXXXXXt_eXXXXXXXXXXXXXXXXBA3XXXXXX7T2s
- 0 4194304 8e08b908dbe67e8c20a8859407d656df7b73d3989217c8943c0c654c618cfabe
- 4194304 4194304 d4f270466bc4c79dd4393d12aa06aea4a087d2ea9aad2ca099c3ac85c67bd9d9
- 8388608 4194304 0c36970933853ce5844cf94c2dd7d5cbc2c7c40c6180f6ac7637cb0aef915874
- 12582912 4194304 87a129960848bc6e279721d191484d13127466e7a05faab3d347ff80198b83ee
- 16777216 4194304 34bf57c6b63e49ec30aec18b02d03326250fbaf5b5abf74a460816c9ef4362ca
身の安全が為、一部を伏字にしています。

:locationは、CreateVaultRequestの結果、返ってきますLocationの内容を格納します。
:uplocationは、InitiateMultipartUploadの結果、返ってきますLocationを格納、
:uploadidは、同UploadIdを格納します。

3つのうち、必要なのはuploadidだけで、他は無くてもアップロードを完遂できます。

ハイフンで始まる行は、UploadMultipartPartが済んでいますよ、という情報です。プラスの時と同じく(断片の開始オフセット バイト数 ハッシュ値)で構成されます。

こうしておけば、二度目・三度目の実行で、どこから続きをやれば良いか、容易にわかります。

また、多重実行できないように、ファイルを排他オープンにします。「ゆっくり」アップロードする都合上、2個以上のプロセスで実行する必要がないので。

さて、アップロードが最後まで完了しますと、archiveidを発行します。

:archiveid XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXQNqcmFB3ta-XXXXXXXXXXXXXXXK9Td9_XXXXXXXXIGsbGggMs6Qtsr_XXXXXXXXXXZEU-XXXXXXXXXXXXXXXXXXXXXXXXXXXpU7-XXXX

こうしておけば、アップロードが完了した後に、もう一度上げなおす、という問題を防ぐことができます。

このarchiveidは大変重要で、後でダウンロードしたり、削除する時に必要です。

紛失しても取得はできるのですが、何時間も掛かってしまう、という情報がネットに散見されます。

こういう感じで、ディスクイメージを保管しようと頑張っています。

後日談有りましたら、情報発信して行こうと思います。