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 など、検査する方法が存在します。
・異常ありの場合、そのメモリーモジュールは破棄することになります。