2019年3月8日金曜日

sqlpackage.exe による localdb への dacpac の展開

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\150>

sqlpackage.exe ^
 /Action:Publish ^
 /SourceFile:C:\Users\USER\Desktop\DEMO.dacpac ^
 /TargetConnectionString:"Data Source=(localdb)\DEMO;Database=master;"

サーバー '(localdb)\DEMO' 上のデータベース 'master' に公開しています。
配置の初期化中 (開始)
配置の初期化中 (完了)
配置計画の解析中 (開始)
*** プロジェクト データベースとターゲット データベースの照合順序設定が異なるため、配置エラーが発生する可能性があります。
配置計画の解析中 (完了)
データベースの更新中 (開始)
更新が完了しました。
データベースの更新中 (完了)
データベースを正常に発行しました。

2018年11月19日月曜日

browserify の ParseError はどこから来るのか

.
.

 ↓ エラーはこちらです。

export var b = {};
^
ParseError: 'import' and 'export' may appear only with 'sourceType: module

↓ 大元の発生源はここですね…

@node_modules\browserify\index.js

Browserify.prototype._syntax = function () {
...
            var err = syntaxError(row.source, row.file || row.id);
            if (err) return this.emit('error', err);

syntax-error から acorn-node に接続するようです。

↓ 停止位置はこちらでした。 

@node_modules\acorn-node\node_modules\acorn\dist\acorn.js

// Parse a single statement.
//
// If expecting a statement and finding a slash operator, parse a
// regular expression literal. This is to handle cases like
// `if (foo) /blah/.exec(foo)`, where looking at the previous token
// does not help.

pp$1.parseStatement = function(context, topLevel, exports) {
...
  case types._import:
    if (!this.options.allowImportExportEverywhere) {
      if (!topLevel)
        { this.raise(this.start, "'import' and 'export' may only appear at the top level"); }
      if (!this.inModule)
        { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); }

総括しますと、

importexport 構文を許可しないことが問題なのではなく、
import → require
export → module.exports
になっていない ES6 (ES2015) 形式の javascript を投入したことが問題なのです…

仮に import と export を許可するように修正した場合、つぎのような export が混じったコードを生成します。

(function () {
    function r(e, n, t) {
        function o(i, f) {
            if (!n[i]) {
                if (!e[i]) {
                    var c = "function" == typeof require && require;
                    if (!f && c)
                        return c(i, !0);
                    if (u)
                        return u(i, !0);
                    var a = new Error("Cannot find module '" + i + "'");
                    throw a.code = "MODULE_NOT_FOUND", a
                }
                var p = n[i] = {
                    exports: {}
                }; e[i][0].call(
                    p.exports,
                    function (r) {
                        var n = e[i][1][r];
                        return o(n || r)
                    }, p, p.exports, r, e, n, t)
            }
            return n[i].exports
        }
        for (var u = "function" == typeof require && require, i = 0; i < t.length; i++)
            o(t[i]);
        return o
    }
    return r
})()({
    1: [function (require, module, exports) {
        var b = require('./b');
    }, { "./b": 2 }], 2: [function (require, module, exports) {
        export var b = {};
    }, {}]
}, {}, [1]);


export があるので、これでは Web ブラウザーでは実行ができませんね…

という訳で、require や module.exports を採用している CommonJS 形式のものを使用しましょう…

ここは無理矢理 babelify で片づけるという手もありますが…
Object.defineProperty() という ES3 (Internet Explorer 8 (Windows XP)) 殺しの言語仕様が出現することになります…

2018年11月15日木曜日

AWS Lambda プロキシ統合 + Node.js 8.10 index.handler

Lambda プロキシ統合での 関数コード例:

exports.handler = async(event) => {
    const addr = require('./addr.json');
    const keywords = event.queryStringParameters.q.replace(/-/, "").trim().split(/\s+/);
 ...
 const response = {
  statusCode: 200,
  body: JSON.stringify(patterns),
 };
 return response;
};

メモ
- response.body は文字列で返します。

Lambda プロキシ統合での event 内容例:

{
  "resource": "/Yubin2",
  "path": "/Yubin2",
  "httpMethod": "GET",
  "headers": null,
  "multiValueHeaders": null,
  "queryStringParameters": {
    "q": "123"
  },
  "multiValueQueryStringParameters": {
    "q": [
      "123"
    ]
  },
  "pathParameters": null,
  "stageVariables": null,
  "requestContext": {
    "path": "/Yubin2",
    "accountId": "ACCOUNT1",
    "resourceId": "ID1",
    "stage": "test-invoke-stage",
    "domainPrefix": "testPrefix",
    "requestId": "ID2",
    "identity": {
      "cognitoIdentityPoolId": null,
      "cognitoIdentityId": null,
      "apiKey": "test-invoke-api-key",
      "cognitoAuthenticationType": null,
      "userArn": "arn:aws:iam::ACCOUNT1:root",
      "apiKeyId": "test-invoke-api-key-id",
      "userAgent": "aws-internal/3 aws-sdk-java/1.11.432 Linux/4.9.124-0.1.ac.198.71.329.metal1.x86_64 OpenJDK_64-Bit_Server_VM/25.181-b13 java/1.8.0_181",
      "accountId": "ACCOUNT1",
      "caller": "ACCOUNT1",
      "sourceIp": "test-invoke-source-ip",
      "accessKey": "ID5",
      "cognitoAuthenticationProvider": null,
      "user": "ACCOUNT1"
    },
    "domainName": "testPrefix.testDomainName",
    "resourcePath": "/Yubin2",
    "httpMethod": "GET",
    "extendedRequestId": "ID3",
    "apiId": "ID4"
  },
  "body": null,
  "isBase64Encoded": false
}

2018年10月23日火曜日

EPPlus xlsx スタイリング まとめ

幅 Width 高さ Height は Excel のそれと同じ。
Width = 半角フォントの文字数
Height = ポイント単位

最初にこれ
totalSheet.Cells.Style.Font.Name = "游ゴシック";
totalSheet.Cells.Style.Font.Size = 11;
スタイルの適用順序: 全体 → 列 or 行ごと → セルごと

通貨、単位なし、小数点四捨五入
totalSheet.Column(5).Style.Numberformat.Format = "#,##0;[Red]-#,##0";


2018年9月29日土曜日

MSBuild の各要素・アイテム・プロパティーの俯瞰と逆引き大辞典

Target は ターゲット
 
Message とか Execタスク
 
AfterTargets="Build" にしておくと、ビルド後に実行してくれます。

<Target Name="BuildEncoder" 
        AfterTargets="Build">
  <Message Importance="Normal" 
           Text="Encoder: %(Encoder.Identity) → $(OutputPath)%(Encoder.OutputTo)" />
  <Exec Command="Encoder.exe %(Encoder.Identity) $(OutputPath)%(Encoder.OutputTo)" />
</Target>

%(Encoder.Identity) の Encoder は ItemGroup の中に定義した Encoder という名の Item
%(Encoder.Identity) の Identity は 既知のアイテム メタデータ
%(Encoder.OutputTo) の OutputTo は自分で定義したメタデータ
 
$(OutputPath) の OutputPath は プロパティー
↑ 環境変数を参照することがあります。
↑ $(…) の … は プロパティ関数 の場合があります: $(VER.Replace('.','_'))

      <ItemGroup>
        <Encoder Include="File.txt">
          <OutputTo>File.bin</OutputTo>
        </Encoder>
      </ItemGroup>




Encoder は Item に変換
方法: ビルドするファイルを選択する

OutputTo はメタデータ


アイテムリスト

@(ABC)
@(ABC, ';')
@(ABC, ', ')
方法: 項目リストをコンマ区切りで表示する


アイテムの種類を変換

@(ItemForMyTool->'&quot;%(FullPath)&quot;', ' ')
メタデータを使用してアイテムの種類を変換する



アイテム用の関数

@(theItem->IndexOf('r'))
項目用の関数



jQuery をつかうと Web ページからのリンク抽出と、変換が楽にできますね…
(この prettier.io は一行 JavaScript をキレイにフォーマットしてくれます!)
 
  • $.map($("main").find("a"), function(a) {
      return $("<a>")
        .attr("target", "_blank")
        .attr("href", a.href)
        .append(
          $("<code>")
            .addClass("word")
            .text(a.innerText)
        )
        .prop("outerHTML");
    }).join("\n");
  • $.map($("table#user-content-tasksTable").find("a"), function(a) {
      return $("<a>")
        .attr("target", "_blank")
        .attr("href", a.href)
        .append(
          $("<code>")
            .addClass("word")
            .text(a.innerText)
        )
        .prop("outerHTML");
    }).join("\n");
  • $.map($("div#divTree").find("a"), function(a) {
      return a.innerText.endsWith(" Class")
        ? $("<a>")
            .attr("target", "_blank")
            .attr("href", a.href)
            .append(
              $("<code>")
                .addClass("word")
                .text(a.innerText)
            )
            .prop("outerHTML")
        : null;
    }).join("\n");


お約束のタグクラウドです。

MSBUILD のタスク
Task 基本クラス TaskExtension 基本クラス ToolTaskExtension 基本クラス AL (アセンブリ リンカー) タスク AspNetCompiler タスク AssignCulture タスク AssignProjectConfiguration タスク AssignTargetPath タスク CallTarget タスク CombinePath タスク ConvertToAbsolutePath タスク Copy タスク CreateCSharpManifestResourceName タスク CreateItem タスク CreateProperty タスク CreateVisualBasicManifestResourceName タスク Csc タスク Delete タスク DownloadFile タスク Error タスク Exec タスク FindAppConfigFile タスク FindInList タスク FindUnderPath タスク FormatUrl タスク FormatVersion タスク GenerateApplicationManifest タスク GenerateBootstrapper タスク GenerateDeploymentManifest タスク GenerateResource タスク GenerateTrustInfo タスク GetAssemblyIdentity タスク GetFrameworkPath タスク GetFrameworkSdkPath タスク GetReferenceAssemblyPaths タスク LC タスク MakeDir タスク Message タスク Move タスク MSBuild タスク ReadLinesFromFile タスク RegisterAssembly タスク RemoveDir タスク RemoveDuplicates タスク RequiresFramework35SP1Assembly タスク GenerateResource タスク GenerateResource task ResolveAssemblyReference タスク ResolveComReference タスク ResolveKeySource タスク ResolveManifestFiles タスク ResolveNativeReference タスク ResolveNonMSBuildProjectOutput タスク SGen タスク SignFile タスク Touch タスク UnregisterAssembly タスク Unzip タスク UpdateManifest タスク Vbc タスク Warning タスク WriteCodeFragment タスク WriteLinesToFile タスク XmlPeek タスク XmlPoke タスク XslTransformation タスク ZipDirectory タスク
MSBuildTasks
Add AppPoolController AppPoolCreate AppPoolDelete AssemblyInfo Attrib Divide EmbedNativeResource FileUpdate FtpUpload FxCop GetSolutionProjects ILMerge Mail Multiple MV NDoc NUnit NUnit3 RegexMatch RegexReplace RegistryRead RegistryWrite Script ServiceController ServiceQuery Sleep SqlExecute Subtract SvnCheckout SvnClient SvnCommit SvnExport SvnInfo SvnUpdate SvnVersion TaskSchema TemplateFile Time Unzip Version VssAdd VssCheckin VssCheckout VssClean VssDiff VssGet VssHistory VssLabel VssUndoCheckout WebDirectoryCreate WebDirectoryDelete WebDownload XmlRead XmlUpdate Xslt Zip
MSBuild.Extension.Pack
BaseAppDomainIsolatedTask Class BaseTask Class Utilities Class BizTalkAdaptor Class BizTalkApplication Class BizTalkAssembly Class BizTalkHost Class BizTalkHostInstance Class BizTalkReceiveHandler Class BizTalkSendHandler Class FxCop Class NUnit Class NUnit3 Class StyleCop Class Email Class Ftp Class MSMQ Class Cab Class DNZip Class Zip Class ActiveDirectory Class ComponentServices Class EnvironmentVariable Class EventLog Class EventSource Class HostsFile Class Network Class PerformanceCounters Class Process Class Registry Class SystemDrive Class WindowsService Class WshShell Class Data Class DataMap Class Organization Class Solution Class Detokenise Class File Class FileVersion Class FindUnder Class Folder Class RoboCopy Class Share Class Assembly Class AssemblyInfo Class AsyncExec Class CommandLine Class ConfigManager Class DateAndTime Class DynamicExecute Class Gac Class GenericTool Class Guid Class ILMerge Class Metadata Class MSBuildHelper Class Parallel Class Path Class Signing Class SmartExec Class TextString Class Thread Class XProduct Class Clone Class SecureFileLogger Class SqlLogger Class XmlFileLogger Class Wmi Class Sound Class Packager Class Maths Class Certificate Class AnalysisServices Class Database Class Server Class AnalysisServices Class Database Class Server Class AnalysisServices Class Database Class Server Class BuildDeploymentManifest Class BuildNumber Class SqlCmd Class SqlExecute Class SqlVersion Class SqlVersionDataClass Class Svn Class DlrTaskFactory Class PowerShellTaskFactory Class TeamBuild Class TeamBuild Class Console Class Dialog Class SourceSafe Class TfsSource Class TfsSourceAdmin Class TfsVersion Class VB6 Class VC6 Class VSDevEnv Class HttpWebRequest Class Iis6AppPool Class Iis6ServiceExtensionFile Class Iis6VirtualDirectory Class Iis6Website Class Iis7Application Class Iis7AppPool Class Iis7Binding Class Iis7Website Class WebClient Class XmlFile Class XmlTask Class

2018年8月22日水曜日

NSPLookupServiceBegin への lpqsRestrictions

SVCID_HOSTNAME
= {0002A800-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYINETSTRING
= {0002A801-0000-0000-C000-000000000046}

SVCID_INET_SERVICEBYNAME
=  {0002A802-0000-0000-C000-000000000046}

SVCID_INET_HOSTADDRBYNAME
= {0002A803-0000-0000-C000-000000000046}

#include <SvcGuid.h>
SET_TCP_SVCID_RR(&guid, 53, 12);
SVCID_DNS_TYPE_PTR
= {00090035-0000-000C-C000-000000000046}

GetAddrInfoW(L"ABC", nullptr, nullptr, &info);

 

gethostbyname("ABC"); 

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x01\x02\x03\x04", 4, AF_INET);

lpqsRestrictions->lpafpProtocols[1] の iAddressFamily = 2, iProtocol = 6

gethostbyaddr("\x1\x2\x3\x4\x5\x6\x7\x8\x9\xa\xb\xc\xd\xe\xf\x10", 16, AF_INET6);

GetNameInfoW IPv4


GetNameInfoW IPv6


gethostname






2018年8月21日火曜日

Windows 名前解決 NET VIEW, Network Providers, Namespace Service Providers

NET VIEW

NetServerEnum を使っているようです。

しかし深部の実装がカーネルモード依存 (非公開の DeviceIoControl コード使用) なので、手の出しようがありません。

Network Providers

ユーザーモードの Network Provider API で実装するプロバイダーです。
この API の守備範囲はとても広いですが… 今回気にしているのは Enumeration Functions だけです。

NPOpenEnum 等を実装することで、WNetOpenEnum での列挙に対応できます。

詰まるところ、ネットワーク一覧に希望のホストを追加できます。


しかしこの先の処理 (UNC パスを作出したり、DOS デバイスを定義したりする処理) にはカーネルモードの関与が必要だと思われます…

Namespace Service Providers

ユーザーモードの Namespace Service Providers を実装する DLL です。Winsock から直接利用されます。

NSPStartup 関数と NSPLookupServiceBegin 等を実装することで、名前解決プロセスに参加できます。

こちらは
「ホストリストの作成」というよりは、
「名前解決(ホスト名 ⇔ IP アドレス)」の意味合いが強いです。

対象の名前空間は NS_DNS ですが…
Bluetooth 関連 (NS_BTH) の情報の方が多い印象を受けました。

アプリからのサービス問い合わせ (WSALookupServiceBegin 呼び出し) に対し、サービス (WSAQUERYSET で定義する情報) の列挙を可能にします。サービス ID の例:
  • SVCID_HOSTNAME
  • SVCID_INET_HOSTADDRBYINETSTRING
  • SVCID_INET_HOSTADDRBYNAME
See also: リクエスト例

勿論 Winsock の GetAddrInfoW 関数でも NSP を使用しますので、NSP を実装することは有用です。

ping.exe でも通用しました。