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] も含めますので、その分は短くなります。