2016年12月29日木曜日

DLGINIT とは

 今さら COM とか古の技術を掘り起こすのも大変な話です…

/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//

IDD_TOACROPDF2 DLGINIT
BEGIN
    IDC_PDF1, 0x376, 16, 0
0x0000, 0x0000, 0x0c00, 0x0000, 0x20f8, 0x0000, 0x19f1, 0x0000,
    0
END

構造:

WORD nIDC;
WORD nMsg;
DWORD dwLen;
BYTE data[dwLen];

// nMsg:
//  ATL_WM_OCC_LOADFROMSTREAM = 0x0376,
//  ATL_WM_OCC_LOADFROMSTORAGE = 0x0377,
//  ATL_WM_OCC_INITNEW = 0x0378,
//  ATL_WM_OCC_LOADFROMSTREAM_EX = 0x037A,
//  ATL_WM_OCC_LOADFROMSTORAGE_EX = 0x037B,
//  ATL_DISPID_DATASOURCE = 0x80010001,
//  ATL_DISPID_DATAFIELD = 0x80010002,

出典 (atlwin.h) より:

    // Find the initialization data (Stream) for the control specified by the ID
    // If found, return the pointer into the data and the length of the data
    static DWORD FindCreateData(DWORD dwID, BYTE* pInitData, BYTE** pData)
    {
        while (pInitData)
        {
            // Read the DLGINIT header
            WORD nIDC = *((UNALIGNED WORD*)pInitData);
            pInitData += sizeof(WORD);
            BYTE* pTemp = pInitData;
            WORD nMsg = *((UNALIGNED WORD*)pInitData);
            pInitData += sizeof(WORD);
            DWORD dwLen = *((UNALIGNED DWORD*)pInitData);
            pInitData += sizeof(DWORD);

LOADFROMSTREAM が嫌で INITNEW にしたい場合は、つぎのようにしたら良いようです。

/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//

IDD_TOACROPDF2 DLGINIT
BEGIN
    IDC_PDF1, 0x378, 0, 0,
    0
END

2016年12月23日金曜日

Nancy UrlReservations.CreateAutomatically: SYSTEM not in Everyone

Nancy で UrlReservations.CreateAutomatically = true を使いますと、URL を http.sys に予約させることができます。

    予約済み URL            : http://+:11411/
        ユーザー: \Everyone
            リッスン: Yes
            委任: No
            SDDL: D:(A;;GX;;;WD)

デバッグ環境では大変便利なのですが、ここに落とし穴が…

サービスはだいたい SYSTEM アカウントで動きます。

http://stackoverflow.com/a/24976524
Your service is running (most likely) under the LocalSystem (SYSTEM) account. This account is not in the Everyone security principal.
SYSTEM は Everyone に含まれないそうです。そこで、サービスを動かす前に予約済み URL を削除しないといけません。

netsh http delete urlacl url=http://+:11411/

2016年12月16日金曜日

LocalDB に RESTORE をかます

LocalDB を管理するコマンドライン

sqllocaldb.exe

C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\120\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\SqlLocalDB.exe

sqllocaldb info
sqllocaldb start MSSQLLocalDB
sqllocaldb info MSSQLLocalDB

sqlcmd.exe -S np:\\.\pipe\LOCALDB#xxxxxxxx\tsql\query

select name from sys.databases
go

sp_detach_db [C:\Proj\...\xxx]

RESTORE DATABASE [xxx]
FROM DISK = 'C:\Proj\...\xxx.bak'
WITH MOVE 'xxx_Data' TO 'C:\Proj\...\xxx.mdf',
MOVE 'xxx_Log' TO 'C:\Proj\...\xxx.ldf'
GO 




2016年12月9日金曜日

Nancy の Json の Bind で、別名を使用したい

例えば、次のような場合です。

using Nancy;
using Nancy.ModelBinding;

public class WWW : NancyModule {
 public WWW()
  : base() {
  Post["/new"] = p => {
   var Result = New((MyModel)this.Bind());
   
   return Response.AsJson(new {
    Result = "OK",
   });
  }
 }
}

public class MyModel {
 public String 注文・見積NO = null;
}

いままで(Visual Studio 2012)はビルドが通るので気にしていませんでした。
ところが、最近のコンパイラ(Visual Studio 2015)では「・」が許されません
なんでもコンパイラを 1 から作り直したとか。

Nancy の JSON は優秀ですが、別名指定には対応していないことが判明。OTL

nuget Nancy.Serialization.NetJSON のお陰様で、何とか次のように対応できました。これは nuget でインストールするだけで有効化されました。

public class MyModel {
 [NetJSONProperty("注文・見積NO")]
 public String 注文見積NO = null;
}


2016年12月7日水曜日

ASP.NET で、Request Routing

aspx ではなく、ashx を使いたかった。

Global.asax を追加。SimpleRoute クラスを定義。そして、IHttpHandler の ashx クラスを Callback の中で new します。

    public class Global : System.Web.HttpApplication {

        protected void Application_Start(object sender, EventArgs e) {
            RegisterRoutes(RouteTable.Routes);
        }

        class SimpleRouter : IRouteHandler {
            public Func<RequestContext, IHttpHandler> Callback;

            public IHttpHandler GetHttpHandler(RequestContext requestContext) {
                return Callback(requestContext);
            }
        }

        public static void RegisterRoutes(RouteCollection routes) {
            routes.Add(new Route("newToken", new SimpleRouter { Callback = (e) => { return new newToken(); } }));
            routes.Add(new Route("uploadPicture", new SimpleRouter { Callback = (e) => { return new uploadPicture(); } }));
            routes.Add(new Route("uploadText", new SimpleRouter { Callback = (e) => { return new uploadText(); } }));
        }

2016年12月5日月曜日

原因の検討:PHP Fatal error: Maximum execution time of 30 seconds exceeded

PHP Fatal error: Maximum execution time of 30 seconds exceeded

ボトルネック三原則的な
👉 CPU
・スクリプト処理が重い、CPU の能力が不足 → もっとよい CPU を

👉 ディスク
・ファイルアクセスが重い、I/O 負荷が高い → ストレージの能力向上を

👉 メモリ
・メモリ不足により、ページング操作が発生、ディスクに負荷が移動 → メモリの増設を

👉 ネットワーク ・・・ 帯域不足

↑は正常な場合の指標です
↓は異常系

フィルター不具合によるファイルアクセスの大幅遅延 ・・・ フィルターは、Windows NT 内部の I/O 操作(ファイルの読み書きなど)を監視したり、変更したりできる仕組みです。

・Windows の安定動作は、フィルターの信頼性が確保されていることが前提です。
・MpFilter のように、ウィルス検査をするフィルターは問題を起こしやすいです。
・ウィルス対策エンジンや定義ファイルに問題(不具合や相性問題)が生じると、フィルターの信頼性が下がる原因になります。
・しかし、原因がそこにあることが分かりにくい。
・見える化が必要。
・たとえば、ファイルを 100 個、同時に開いて、書き込んで、閉じる操作が瞬時に終わるかどうかなど。

☞ メモリ異常 ・・・ コンピューターは計算をし続けることで動作します。

・計算結果は必要に応じて、メモリに一時記憶します。
・メモリ異常は、書き込んだときの数字(例:123)と、読み込んだときの数字(例:124) が異なる現象です。
・そのような数字を採用してしまうと、その後の計算結果は信頼できないものになります→ソフトウェア不具合の原因
・Windows メモリ診断、MEMTEST86 など、検査する方法が存在します。
・異常ありの場合、そのメモリーモジュールは破棄することになります。

2016年11月30日水曜日

C# ESENT 講座 Esent.Interop.dll 使用

インデックスを選択

Api.JetSetCurrentIndex(sesid, tableid, "indexName");

これでインデックス順にソートされます。Api.TryMoveFirst と Api.TryMoveNext で反復します。

インデックスで 1 レコードを検索

Api.JetSetCurrentIndex(ses.JetSesid, Streams.JetTableid, "Id");
Api.MakeKey(ses.JetSesid, Streams.JetTableid, Id, MakeKeyGrbit.NewKey);
Api.TrySeek(ses.JetSesid, Streams.JetTableid, SeekGrbit.SeekEQ)

これでいけるはずです。SeekGrbit.SeekGE などの場合は、値も比較すると良いかも。

UInt32 RealId = Api.RetrieveColumnAsUInt32(ses.JetSesid, Streams.JetTableid, C.Streams_Id) ?? 0U;
if (RealId == Id) { ... }

絶対レコード位置を取得

byte[] tmpMark = new byte[1024];
int cbMark = tmpMark.Length;
Api.JetGetBookmark(sesid, tableid, tmpMark, tmpMark.Length, out cbMark);

絶対レコード位置へ移動

Api.JetGotoBookmark(sesid, tableid, vr.mark, vr.mark.Length);

Note: EsentNoCurrentRecordException を食らう場合があります。

レコードを更新

Api.JetPrepareUpdate(ses.JetSesid, Folders.JetTableid, JET_prep.Replace);
Api.SetColumn(ses.JetSesid, Folders.JetTableid, C.FLDCOL_PARENT, FLDCOL_IDto);
Api.JetUpdate(ses.JetSesid, Folders.JetTableid);

2016年10月24日月曜日

CMD.exe バッチファイルの実行で「入力行が長すぎます。」

長すぎるとダメみたいです。

コマンド プロンプト (Cmd.exe) へ 8192 文字以上の引数を渡した場合に発生する現象
https://support.microsoft.com/ja-jp/kb/2823587

Windows 8.1 で、確認。

環境変数の展開を含めると、8192 文字。

環境変数の展開を含めなければ、32767 文字。

argv[0] も含めますので、その分は短くなります。

2016年9月29日木曜日

ディスク 1 (PDO 名: \Device\00000033) の論理ブロック アドレス 0x7d367d0 で IO 操作が再試行されました。

プチフリーズしてしまう…

イベントビューアを見ると、次のようなシステム イベントが残っています。

デバイス \Device\RaidPort0 にリセットが発行されました。

ディスク 1 (PDO 名: \Device\00000033) の論理ブロック アドレス 0x7d367d0 で IO 操作が再試行されました。

ーーー
結局私の場合、[電源オプション]、[PCI Express]→[リンク状態の電源管理]→[設定]=オフ にしたら、でなくなりました。


参考:
Freezes with storahci error 129 in Event Protocol
http://www.tomshardware.com/answers/id-2318245/freezes-storahci-error-129-event-protocol.html

ーーー
あと、AHCI Link Power Management - HIPM/DIPM を HIPM→Active に変更しました。


この設定を表示する方法は、こちら:

Storahci, ID 129, Reset to device, \Device\RaidPort0, was issued - fix for Windows 10 Technical Preview
http://www.nxhut.com/2015/01/storahci-id-129-reset-to-device.html#!/2015/01/storahci-id-129-reset-to-device.html

ーーー
あと、こちらも試しました。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\Parameters\Deviceにあるサブキー「NoLPM」の値を確認
デバイスマネージャーを確認してSSDの名前を値に追加し、その後に*をつける


storahciの件、直りました
http://mru.txt-nifty.com/blog/2016/08/storahci-26f3.html

ーーー
まとめますと… Windows か TS256GSSD370S か M/B か、どの部分かわかりませんが、
「送った DiskRead 要求が(恐らく省電力関係の)不具合により、ときどき忘れられてしまい、30 秒間応答が帰ってこないのでエラーと判断、再試行した。」

そんな感じがしました。これ、書き込み操作でこんなことが起こると大惨事ですよね。しっかりしてほしいものです。

ーーー
ためしたが、今回あてはまなかったこと…

Crystal Disk Info で、SMART 情報をチェック:正常でした。


Transcend SSD Scope でチェック:正常のようです


Intel(R) 7 Series/C216 Chipset Family SATA AHCI Controller - 1E02」から「標準 SATA AHCI コントローラー」に変更:効果なし


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci\StartOverride を 3 から 0 に変更する
→ StartOverride が見つからなかったので、試していません。

Windows 8/8.1で時々躓くような、カクカクとした重い操作が気になるようになったら確認してみること
http://dorodorodoroid.hatenablog.com/entry/2015/01/29/000622

ーーー

2016年9月12日月曜日

IShellExtInit::Initialize の IDataObject につきまして

IShellExtInit::Initialize の IDataObject で、EnumFormatEtc したら?

ショートカット 2 個を右クリック

-16155 Shell IDList Array   DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP             DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName             DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16152 FileContents         DVASPECT_CONTENT -1 TYMED_ISTREAM
-16377 FileNameW            DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16150 FileGroupDescriptorW DVASPECT_CONTENT -1 TYMED_HGLOBAL

PDF ファイル 1 個を右クリック

-16155 Shell IDList Array                     DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15488 DataObjectAttributes                   DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15490 DataObjectAttributesRequiringElevation DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16152 FileContents                           DVASPECT_CONTENT -1 TYMED_ISTREAM
-16377 FileNameW                              DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16150 FileGroupDescriptorW                   DVASPECT_CONTENT -1 TYMED_HGLOBAL


フォルダ 1 個を右クリック

-16155 Shell IDList Array                     DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15488 DataObjectAttributes                   DVASPECT_CONTENT -1 TYMED_HGLOBAL
-15490 DataObjectAttributesRequiringElevation DVASPECT_CONTENT -1 TYMED_HGLOBAL
    15 CF_HDROP                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16378 FileName                               DVASPECT_CONTENT -1 TYMED_HGLOBAL
-16377 FileNameW                              DVASPECT_CONTENT -1 TYMED_HGLOBAL






2016年8月12日金曜日

JavaScript for Acrobat で、Adobe Acrobat Reader DC を拡張

そういうことができるらしいです。

このような JavaScript を %AppData%\Adobe\Acrobat\Privileged\DC\JavaScripts\Hello.js とかに保存して、Adobe Acrobat Reader DC を起動し、PDF を開くと…

function helloWorld()
{ 
     //Say Hello World
     app.alert("Hello World with this " + this);
}

app.addToolButton({
       cName: "helloWorldBtn", // A name for your button
       cExec: "helloWorld()", //Function to Call
       cLabel: "Hello World", //The Text on the Button
       cTooltext: "Say Hello World" //The Help Text
}); 


何やら右下にアドオンツールというものが追加されます。

試しにクリックすると、あら素敵! アドオンツールに、Hello World が!

クリックすると、

メッセージが表示されます。

これでもう簡単なプラグインは JavaScript でも書くことができるし、Reader でも使えるし、いいことずくめですか?

2016年7月16日土曜日

OneNote one ファイル形式

ファイル形式の仕様書:

[MS-ONE]: OneNote File Format
https://msdn.microsoft.com/en-us/library/dd924743(v=office.12).aspx

[MS-ONESTORE]: OneNote Revision Store File Format
https://msdn.microsoft.com/en-us/library/dd951288(v=office.12).aspx

ファイル形式について:
  • 完全にバイナリ。容易に可読できる形式には直りません。
  • 概念が複雑。階層が深いし、内部参照も多い。


XML に変換すると、多少分かり易くなるかもしれません。サンプル

仕様書と、サンプルの one ファイルと、解析結果の XML ファイルを見れば、解析作業を助けると思います。

読み込むだけであれば、まだ楽です。

よく現れる構造体 ExtendedGUID につきまして。
ExtendedGUID = GUID + int32 です。
例: Root Extended GUID: MUST be "{{ 4A3717F8- 1C14-49E7-9526-81D942DE1741 },  1}".
GUID はそのままですが、int32 の意味は利用場所によって異なります。要は ID なので、(名前空間 + 整理番号) のような使われ方が基本です。もっと砕けば(一意なフォルダ番号 + ファイル番号) のような感じです
  • CompactID。出来上がりは ExtendedGUID ですが、中身は int8 + int24 です。
    • 2 つ目の int24 で、GlobalIdTable 中の GUID を 1 つ指定、
    • 1 つ目の int8 で、ExtendedGUID の int32 を埋めます。
  • ObjectID。CompactID の配列。他の FileNode を参照。FileNode の oid と一致する物を参照します。FileNode は兄弟とは限りません。後記するリビジョン管理の為、親戚(親の子)の場合も有ります。
  • ContextID。CompactID の配列
  • ObjectSpaceID。CompactID の配列

one ファイルは、多数のチャンク(オフセット+バイト数)が散りばめられた、
ファイルシステムのような構造を呈しております。

ファイルやフォルダーのような階層構造の概念があり、FileNode を使って表します。
FileNode の形式には 3 種類有り、
  • None。可変データ fnd が有ります。
  • Node。子 FileNode を持っています。可変データ fnd も有ります。
  • Data。ファイル中のチャンクへの参照(ObjectSpaceObjectPropSet 等)が有ります。可変データ fnd も有ります。
FileNodeID を見て、FileNode の構造(fnd の中身、チャンクの中身)を指定します。
FileDataStoreObjectReferenceFND であれば、チャンクの中身は、添付ファイル+αの情報です。


ObjectDeclaration2RefCountFND 等には、oid と jcid が有ります。oid と jcid が付いている FileNode は、有用なデータを含みます。oid は、CompactID。ObjectID 中の CompactID として、他の FileNode から参照されます。
jcid は、FileNode の抽象的な意味です。jcidRichTextOENode とか、jcidOutlineElementNode とか、jcidOutlineNode とか、jcidPageNode とか。

リビジョン管理が有ります。
「ページのバージョンを表示」で、古いバージョンを参照できたりします。
新しいリビジョンは、前のリビジョンにちょっと変更を加えた程度のものと考えてください。古い FileNode を置き換える為に、同じ oid を指定します。
RevisionManifestStart6FND または RevisionManifestStart7FND で始まります。
rid と ridDependent を持っていて、親子関係を形成します。ridDependent が無くなるか、ridDependent が空になるまで遡ります。
Start と End の間に ObjectGroupListReferenceFND が有り、この FileNode の中に、起点となる jcidPageManifestNode (ObjectDeclaration2RefCountFND) が出て参ります。最初のリビジョンにだけ出現し、後の方のリビジョンには通常出て来ません。


jcidPageSeriesNode を収めています RevisionManifestListReferenceFND の中も ObjectGroupListReferenceFND が使われていますので、リビジョン管理の必要が有ります。

2016年7月1日金曜日

AX88772 → BUFFALO LUA3-U2-ATX?

MacBook Airに挿すだけ簡単ネットワーク接続。Windowsパソコンでも簡単
10/100M USB2.0用 LANアダプター
LUA3-U2-ATX

2016年6月28日火曜日

InvalidConstraintException

System.Data.InvalidConstraintException ForeignKeyConstraint FK_xxx_yyy によって制約が実行され、xxx に子行が存在するため、テーブル yyy を消去できません。

new yyyTableAdapter().Fill(dataSet1.yyy);

リレーションが、

親テーブル yyy
└子テーブル xxx

「制約が有効」な状態です。

内部的には、親テーブル yyy の内容を消して(Clear)、フィル(Fill)しようとしている。

子テーブル xxx にデータが存在する場合、親が Clear によって消えてしまう。ここで制約違反が発生。

回避方法:
  • yyyTableAdapter の ClearBeforeFill を False にしてから、Fill を実行。
  • dataSet1.EnforceConstraint = False にしてから、Fill する。すると、制約違反は検知されなくなるので、自由にテーブルを構築できる。
ClearBeforeFill について・・・他の人がレコードを削除する場合が有るので、それを反映する方法として一旦全部消去する方法が有効。

2016年6月14日火曜日

UltraVNC ZRLE 等の選択

UltraVNC Connection Options にて、Format and Encoding の選択がたくさんあるので、主観的に調査してみました。色数は、256 Colors で。測定内容は、コンソールアプリで 20 文字程度を縦に流し続ける程度の物です。


ZRLE  10kbps
Tight 13kbps
Zlib(+xor) 12kbps
ZlibHex 200kbps
Hextile 200kbps
RRE 測定不能。早々にフリーズ
CoRRE 測定不能。上昇し続ける
Ultra  測定不能。上昇し続ける
ZYWRLE 10kbps
u2 FullColors 測定不能。上昇し続ける
XZ   10kbps
XZYW 10kbps



数値が小さいほど良いです。

10kbps → 約 1,250 bytes/sec





2016年5月13日金曜日

Microsoft.Win32.TaskScheduler マイテンプレ

Microsoft.Win32.TaskScheduler.dll Task Scheduler Managed Wrapper の自分用テンプレートです:

private void bREG_Click(object sender, EventArgs e) {
    TaskDefinition td = TaskService.Instance.NewTask();
    td.Actions.Add(
        Path.Combine(Application.StartupPath, "xxx.exe"),
        " \"" + tbH.Text + "." + tbD.Text + "\" \"" + tbP.Text + "\" "
        );
    int mins = Convert.ToInt32(this.mins.Value);
    DailyTrigger t = new DailyTrigger(1);
    t.StartBoundary = new DateTime(DateTime.Now.Year, 1, 1);
    t.Repetition.Duration = TimeSpan.FromDays(1);
    t.Repetition.Interval = TimeSpan.FromMinutes(mins);
    td.Triggers.Add(t);
    td.Principal.UserId = (Environment.OSVersion.Version < new Version(5, 3)) ? "SYSTEM" : "LOCAL SERVICE";
    //td.Settings.RunOnlyIfLoggedOn = false;
    TaskService.Instance.RootFolder.RegisterTaskDefinition("xxx", td);
    MessageBox.Show(this, "設定しました。"
        , Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
}


2016年5月11日水曜日

KB3133977 をインストールすると起動しなくなる?

DELL PowerEdge T100 の、
Windows Server 2008 R2 (BitLocker 有効) で、
KB3133977 をインストールすると、
起動しなくなりました。
BSOD & 再起動の連続です。

打つ手なし

参考: https://support.microsoft.com/ja-jp/kb/3133977

「文書番号:3133977 - 最終更新日: 05/10/2016 21:22:00 - リビジョン: 5.1」 とか書いてあります。

BSOD 写真:


BIOS 設定に入り、TPM を完全にオフにしたら、起動できました。





GAE/p + boto3 で、ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

難しい・・・

GAE/p + boto3 で、ImportError: cannot import name RAND_egd

  File "C:\Python27\lib\email\utils.py", line 28, in <module>

    import socket

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line 841, in load_module

    return self.import_stub_module(fullname)

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line 853, in import_stub_module

    __import__(fullname, {}, {})

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\dist27\socket.py", line 73, in <module>

    from _ssl import RAND_add, RAND_egd, RAND_status, SSL_ERROR_ZERO_RETURN, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_SYSCALL, SSL_ERROR_SSL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE

ImportError: cannot import name RAND_egd


C:\Program Files (x86)\Google\google_appengine\google\appengine\dist27\socket.py

RAND_egd を消して対応しました。
    from _ssl import RAND_add, RAND_status, SSL_ERROR_ZERO_RETURN, SSL_ERROR_WANT_READ, SSL_ERROR_WANT_WRITE, SSL_ERROR_WANT_X509_LOOKUP, SSL_ERROR_SYSCALL, SSL_ERROR_SSL, SSL_ERROR_WANT_CONNECT, SSL_ERROR_EOF, SSL_ERROR_INVALID_ERROR_CODE

GAE/p + boto3 で、ImportError: No module named _winreg

  File "C:\Proj\appspot\get---ip\botocore\session.py", line 470, in user_agent

    platform.system(),

  File "C:\Python27\lib\platform.py", line 1263, in system

    return uname()[0]

  File "C:\Python27\lib\platform.py", line 1159, in uname

    release,version,csd,ptype = win32_ver()

  File "C:\Python27\lib\platform.py", line 632, in win32_ver

    from _winreg import OpenKeyEx, QueryValueEx, CloseKey, HKEY_LOCAL_MACHINE

  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py", line 963, in load_module

    raise ImportError('No module named %s' % fullname)

ImportError: No module named _winreg


C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\devappserver2\python\sandbox.py

_WHITE_LIST_C_MODULES に必要なモジュール名を追加します。例:
_WHITE_LIST_C_MODULES = [
    'array',
    '_ast',
    'binascii',

    ...

    'zlib',
    '_winreg',
    '_ssl',
    '_ctypes',
]

Stop → Run で、アプリを再起動します。

2016年4月25日月曜日

magic block mismatch の件


magic block mismatch を引き起こす理由:
  • 9.4 用の物を 9.5 で使おうとした等。「Server is version %d.%d, library is version %d.%d.」
  • 9.5 の場合、include の内容が x64 用と x86 用とで微妙に異なる。。。「Server has FLOAT8PASSBYVAL = %s, library has %s.」


error LNK2001: 外部シンボル "CurrentMemoryContext" は未解決です。

 "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\link.exe" /libpath:"C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\lib\amd64;C:\Program Files (x86)\Windows Kits\8.0\lib\win8\um\x64" libmecab-sdk64/libmecab.lib PGfiles/9.5/lib_x64/postgres.lib /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /LTCG /MACHINE:x64 /DLL /RELEASE obj\9.5\x64\textsearch_ja.obj obj\9.5\x64\encoding_eucjp.obj obj\9.5\x64\encoding_utf8.obj /DEF:textsearch_ja.def /OUT:bin\9.5\x64\textsearch_ja.dll
Microsoft (R) Incremental Linker Version 11.00.61030.0
Copyright (C) Microsoft Corporation.  All rights reserved.

   ライブラリ bin\9.5\x64\textsearch_ja.lib とオブジェクト bin\9.5\x64\textsearch_ja.exp を作成中
textsearch_ja.obj : error LNK2001: 外部シンボル "CurrentMemoryContext" は未解決です。
bin\9.5\x64\textsearch_ja.dll : fatal error LNK1120: 1 件の未解決の外部参照


foo.def を作成↓
LIBRARY postgres.exe
EXPORTS CurrentMemoryContext


lib を使って、インポートライブラリを作成↓
lib /out:x64\foo.lib /def:foo.def /machine:x64
lib /out:x86\foo.lib /def:foo.def /machine:ix86

作ったインポートライブリを使って、リンクします。

参考:http://openlab.ring.gr.jp/tsuneo/soft/tar32_1/tar32_1/SDK/DLL2LIB.TXT

2016年4月14日木曜日

USB 外付け HDD に Boot next device を仕込む

☆彡 syslinux 6.0.3 等を入手して展開

https://www.kernel.org/pub/linux/utils/boot/syslinux/6.xx/syslinux-6.03.zip

ソースコードだけと思われがちですが、バイナリも含んでいます。

☆彡 syslinux をインストール

bios\win32\syslinux.exe を使用

仕込み例:
syslinux.exe -miaf -d /boot/ Z:

ルートディレクトリがごちゃごちゃすると、誤って消されそうです。ここでは、boot フォルダに仕込みます。

☆彡 /boot/syslinux.cfg を仕込む

内容例:
DEFAULT main

LABEL main
MENU LABEL Boot next device
TEXT HELP
 Boot next device in the boot sequence.
ENDTEXT
COM32 /boot/syslinux/whichsys.c32
APPEND -sys- /boot/syslinux/chain.c32 hd1 swap -iso- /boot/syslinux/localboot.c32 -1

☆彡 必要なファイルを仕込む

chain.c32
libcom32.c32
libgpl.c32
libutil.c32
localboot.c32
menu.c32
whichsys.c32

在り処:

bios\com32\chain\chain.c32
bios\com32\lib\libcom32.c32
bios\com32\gpllib\libgpl.c32
bios\com32\libutil\libutil.c32
bios\com32\samples\localboot.c32
bios\com32\menu\menu.c32
bios\com32\modules\whichsys.c32

☆彡 動作チェックを

hp Proliant で USB 外付け HDD をつなげると、Windows が起動しなくなる!

もうこの界隈では有名な話かもしれません。

hp のサーバーは、USB 外付け HDD から優先的に起動するよう初期設定しているようです。

バックアップ用に 1TB 程の USB 外付け HDD を接続している方は要注意!

BIOS の設定変更で対応するようですが、もう納品済みで、実機は 100km 以上先に在ります!

そういう場合は… USB 外付け HDD に Boot next device を仕込む を参考にどうぞ!

DELL PowerEdge T110 II 解体の巻


 ↓SAS。SATA でした。電源とデータで、コネクタが一体型
↓SATA。左のデータ用と、右の電源用とで、コネクタが別々

2016年3月25日金曜日

ClickOnce を配布先(社内/検証用・納品先/実環境)で判別するには

ApplicationDeployment.CurrentDeployment.UpdateLocation しか見る所がないようです?

IsNetworkDeployed = True
ActivationUri =
DataDirectory = C:\Users\ku_000\AppData\Local\Apps\2.0\Data\8L6E4H3N.KPW\TV6BTE6H.0Z7\wind..tion_e4e92360855617ca_0001.0000_1c2f8407d29494ea\Data
UpdateLocation = file://dd36/WindowsFormsApplication20/WindowsFormsApplication20.application

2016年2月12日金曜日

2016年2月8日月曜日

「このファイルはウィルスに感染しています」 at Google drive

Google Drive に一般公開でプログラムをアップロードする、という形でお世話なっている方も多いはず。。。


し、しかし、ここにきてこの仕打ち!

「このファイルはウィルスに感染しています」
「感染したファイルをダウンロードできるのはオーナーだけです。」


どうも、NSIS のプラグイン NSISDL が良くないっぽいです。 後、有効なデジタル署名が付いていない点も然りか。。。

そこで、オーナーになって、ダウンロードを試みました:


このファイルはウィルスに感染しています

Setup_WLMMailRulesMover_0_5_0_0.exe(568k)はパソコンに損害を与える可能性があります。このファイルのダウンロードは、リスクを理解している場合にのみ行ってください。
ウィルスに感染したファイルをダウンロード


『ウィルスに感染しています』と言葉厳しく断言しています。偽陽性だったらどうするんだー

今朝、Windows 8.1 の Windows Defender でも引っ掛かりました。気を取り直して、スクショを撮ろうか、と思っていたら、出なくなりました。

どのような判定を受けるのか、改めてチェックしました:


「Avast    Win32:Malware-gen」
「SUPERAntiSpyware    Trojan.Agent/Gen-Zbot」

これをアップロード公開した当初は Ok だったんです。

昨日までダウンロード Ok であっても、今日になったらアウト、という事はこれからも起こりそうです。

2016年1月26日火曜日

SQL サーバー mdf ファイルを確実に更新させる

バックアップ前に、mdf ファイルを確実に更新するには、SQL サーバーを再起動するしかないと思っていました。

DBCC DROPCLEANBUFFERS; が使える事が分かりました。

"C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -E -S SERVER,PORT -Q "DBCC DROPCLEANBUFFERS;"