2017年2月14日火曜日

配布するPackage.zipにコンソールアプリやバッチなどをビルドして組み込む方法について(tfs2017)

やり方は、下記の通り。

0)プロジェクトの出力パスをApp_Dataの配下に設定する。

msbuildで指定する場合は、/p:OutDir=.\..\..\HogeHogeSite\AppData\Batch\FugoConsoleApplication\bin

1)プロジェクトの依存関係の設定

ソリューション>プロパティ>プロジェクトの依存関係をいじる

2)プロジェクトのビルド順序

ソリューション>プロジェクトのビルド順序をいじる

3)最後にApp_Data配下のバッチやサービス群はPackage.zipに格納されないので、BeforeBuild定義でコンテンツ扱いに設定します。

  <Target Name="BeforeBuild">
    <ItemGroup>
      <Content Include="App_Data\Service\BizServiceAsynchronousJob\Bin\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="App_Data\Service\BizServiceScheduleUpdate\Bin\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="App_Data\Batch\BizConsoleApplicationAsynchronousJob\Bin\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="App_Data\Batch\BizConsoleApplicationRealUpdate\Bin\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
      <Content Include="App_Data\Batch\BizConsoleApplicationScheduleUpdate\Bin\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
  </Target>

その他
・Team Foundation Server 2017のUpdateが早く出ないかなぁ

以上

2017年2月4日土曜日

Team Foundation Server2017(tfs2017)を使った継続的インテグレーションの進め(CI)

TFSを使ってConsoleApplication付きのパッケージを配布する際にパラメータを定義(parameters.xml)し、Deploy時に設定する方法。

■parameters.xmlのサンプル

<?xml version="1.0" encoding="utf-8" ?>
<parameters>
  <parameter name="WebService1 Endpoint Address"
    description="Please provide the endpoint address for the Web service that you want to call."
    defaultValue="http://contoso.com/WebService1.asmx" tags="">
  <parameterEntry
    kind="XmlFile"
    scope="obj\\Debug\\Package\\PackageTmp\\Web\.config$"
    match="//setting[@name='WebService1EndPoint']/value/text()" />
  </parameter>

  <parameter name="appSettings_hoge" description="ほげ">
    <parameterEntry
      kind="XmlFile"
      defaultValue="hoge"
      scope="\\Web.config$"
      match="//appSettings/add[@key='hoge']/@value" />
  </parameter>
  <parameter name="appSettings_foo" description="ふー">
    <parameterEntry
      kind="XmlFile"
      defaultValue="foo"
      scope="\\Web.config$"
      match="//appSettings/add[@key='foo']/@value" />
  </parameter>

  <!--動作した-->
    <parameter name="Web.config_appSettings_abeKey" description="デプロイテスト">
      <parameterEntry kind="XmlFile" defaultValue="UseDevelopmentStorage=true" scope="\\Web.config$" match="//appSettings/add[@key='abeKey']/@value" />
    </parameter>

  <!--成功した-->
  <parameter name="ConsoleApp_App.config_ConnectionString" description="デプロイテスト">
    <parameterEntry kind="XmlFile" defaultValue="hogehoge" scope="\\App_Data\\AbeConsoleApplicaition\\AbeConsoleApplication\.exe\.config$"
                    match="/configuration/connectionStrings/add[@name='AbeConsoleApplication.Properties.Settings.ConnectionSetting']/@connectionString" />
    <parameterEntry kind="XmlFile" defaultValue="hogehoge" scope="\\App_Data\\AbeConsoleApplicaition\\AbeConsoleApplication\.exe\.config$"
                    match="/configuration/connectionStrings/add[@name='AbeConsoleApplication.Properties.Settings.ConnectionSetting2']/@connectionString" />
  </parameter>

<!--成功した-->
  <parameter name="ConsoleApp_App.config_AbeSetting" description="デプロイテスト" defaultValue="aaa" tags="">
    <parameterEntry kind="XmlFile" scope="\\App_Data\\AbeConsoleApplicaition\\AbeConsoleApplication\.exe\.config$"
                    match="/configuration/applicationSettings/AbeConsoleApplication.Properties.Settings/setting[@name='AbeSetting']/value/text()" />
  </parameter>
</parameters>

■Web.config
<configuration>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\aspnet-AbeWebApplication-20160414071328.mdf;Initial Catalog=aspnet-AbeWebApplication-20160414071328;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <appSettings>
    <add key="abeKey" value="TestValue"/>
  </appSettings>


■App.config
<configuration>
    <connectionStrings>
        <add name="AbeConsoleApplication.Properties.Settings.ConnectionSetting"
            connectionString="Data Source=localhost;Initial Catalog=abedb;Persist Security Info=True;User ID=sa;Password={password}"
            providerName="System.Data.SqlClient" />
        <add name="AbeConsoleApplication.Properties.Settings.ConnectionSetting2"
            connectionString="Data Source=localhost;Initial Catalog=abedb;Persist Security Info=True;User ID=sa;Password={password}" />
    </connectionStrings>
  <applicationSettings>
        <AbeConsoleApplication.Properties.Settings>
              <setting name="AbeSetting" serializeAs="String">
                    <value>fugofugo</value>
              </setting>
        </AbeConsoleApplication.Properties.Settings>
    </applicationSettings>
</configuration>

■Deploy IIS AppのOverrride Parameters

name="IIS Web Application Name",value="HogeHoge"
name="DefaultConnection-Web.config Connection String",value="data source=serverName;initial catalog=abedb;user id=sa;password={password};MultipleActiveResultSets=True;App=EntityFramework"
name="Web.config_appSettings_abeKey",value="これが出れば成功"
name="ConsoleApp_App.config_ConnectionString",value="$(ConnectionStringOLAP)"
name="ConsoleApp_App.config_AbeSetting",value="これです。"


2017年2月3日金曜日

Team Foundation Server 2017でクライアントにagent(エージェント)をインストール際の成功パタン

Team Foundation Server 2017でクライアントにagent(エージェント)をインストール際の成功パタン
についてのメモです。

■管理者権限でPower Shellにて実行する。

PS C:\> mkdir agent ; cd agent
PS C:\agent> Add-Type -AssemblyName System.IO.Compression.FileSystem ; [System.IO.Compression.ZipFile]::ExtractToDirectory("$HOME\Downloads\vsts-agent-win7-x64-2.105.7.zip", "$PWD")

PS C:\agent> .\config.cmd

>> 接続:

サーバー URL を入力する > http://192.168.11.1:8080/tfs
認証の種類 を入力する (Integrated の場合は、Enter キーを押します) >
サーバーに接続しています ...

>> エージェントを登録する:

エージェント プール を入力する (default の場合は、Enter キーを押します) > TestServerQueue
Agent pool not found: 'TestServerQueue'
プール名が見つかりませんでした。もう一度やり直すか、Ctrl+C を押して終了してください

⇒うっかりしていたftsサーバ(http://192.168.11.1:8080/tfs)にログインし、Agent Queueを作成..

エージェント プール を入力する (default の場合は、Enter キーを押します) > TestServerQueue
エージェント名 を入力する (ServerName の場合は、Enter キーを押します) >
Scanning for tool capabilities.
Connecting to the server.
エージェントが正常に追加されました
Testing agent connection.
作業フォルダー を入力する (_work の場合は、Enter キーを押します) >
2017-02-02 09:33:35Z: 設定が保存されました。
エージェントをサービスとして実行しますか? (はい/いいえ) を入力する (N の場合は、Enter キーを押します) > Y
サービスに使用するユーザー アカウント を入力する (NT AUTHORITY\NETWORK SERVICE の場合は、Enter キーを押します) >
Service vstsagent.192.ServerName successfully installed
Service vstsagent.192.ServerName successfully set recovery option
サービス vstsagent.192.ServerName は正常に構成されました
サービス vstsagent.192.ServerName は正常に開始されました
PS C:\agent>


Microsoft Team Foundation Server 2017でクライアントにajentをインストール際に発生するエラー「VS30063: You are not authorized to access http://{server-name}:8080.」


Microsoft Team Foundation Server 2017のagentのインストールについて


Integrated (Default) Use to connect to a TFS AT configured with Windows Authentication such as NTLM or Kerberos. You won't be prompted for credentials after you choose this method.
統合された(デフォルト)は、NTLMまたはKerberosなどのWindows認証を使用して構成TFS ATに接続するために使用します。この方法を選択すると、資格情報の入力を求められません。

を選択しても

1)VS30063: You are not authorized to access http://192.168.11.1:8080.
2)VS30063: You are not authorized to access http://ServerName:8080.

が発生する場合は、agentをインストールするクライアントから、Internet Explorerで、tfsサーバにログインすることで統合認証が通過できます。

start http://192.168.11.1:8080/tfs
と起動して、user, passwordを入力する。

Windows Server 2008R2/2012R2にサインオン直後に発生するDTAExecutionHost.exeのエラーについて


対策
「Agents for Visual Studio 2015 Update 3」をインストールしたら解消しました。

インストーラー
ja_agents_for_visual_studio_2015_update_3_x86_x64_9631228.exe


エラーメッセージ
ハンドルされていない例外: System.AggregateException: 1 つ以上のエラーが発生しました。 ---> System.Net.Http.HttpRequestException: An error occurred while sendin the request. ---> System.Net.WebException: リモート サーバーに接続できません。
---> System.Net.Sockets.SocketException: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 192.168.103.111:8080
  場所 System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
  場所 System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Soket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state IAsyncResult asyncResult, Exception& exception)
  --- 内部例外スタック トレースの終わり ---
  場所 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
  場所 System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
  --- 内部例外スタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task

  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.Common.VssHttpMessageHandler.<SendAsync>__0.MoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task
  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__aMoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task

  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__21.MoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task

  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<GetResourceLoctionAsync>d__24.MoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task

  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<CreateRequestMssageAsync>d__1c.MoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task

  場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNtification(Task task)
  場所 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__1.MoveNext()
  --- 内部例外スタック トレースの終わり ---
  場所 Microsoft.VisualStudio.TestService.AgentExecutionHost.ExecutionHost.UnreisterFromServer()
  場所 Microsoft.VisualStudio.TestService.AgentExecutionHost.ExecutionHost.ExectionTaskStateModelCompleted()
  場所 Microsoft.VisualStudio.TestService.AgentExecutionHost.ExecutionTaskStateodel.<ListenerCommandReceived>d__13.MoveNext()
-- 直前に例外がスローされた場所からのスタック トレースの終わり ---
  場所 System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b_6_1(Object state)
  場所 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object sate)
  場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionontext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
  場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback callback, Object state, Boolean preserveSyncCtx)
  場所 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWrkItem.ExecuteWorkItem()
  場所 System.Threading.ThreadPoolWorkQueue.Dispatch()
  場所 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()



2017年1月21日土曜日

SCuptureのWindows10対応についてGetWindowRect((IntPtr)hwnd, ref rect)に余白が出来る問題

Win+Cでアクティブウィンドウを画面キャプチャするする変な余白が入るようになりました。

事例:


どうも、GetForegroundWindow()で取得したウィンドウに対して

//Windows 7までのコード
RECT rect = new RECT();
int ret = User.GetWindowRect((IntPtr)hwnd, ref rect);

と位置とサイズの情報の取得が不適切のようです。



を参考にWindows 8/8.1/10で動作するように対応をかけました。

全体のソースは、


2016年12月24日土曜日

Google Driveからダウンロードしたzipファイルの日本語が文字化することの対応について


lhaplusだと↓のように文字化けする。

これはGoogleが日本語に対応していないため、7zipを使用するうまく解凍します。

ちなみに、自作のパスワード自動解析、設定に対応しているszipだとうまく解凍が出来なかった、途中で落ちるようです。原因、調査と対応が必要となる。