Grow up

生活とプログラミング

ClickOnce URLDownloadToCacheFile failed with HRESULT '-2146697211' の解決方法

はじめに

ClickOnceインストーラを実行した時に発生するエラーの解決方法です。

f:id:knkomko:20200504002035p:plain:w350

原因

「.application」ファイルが見つからない為エラーになっていました。
発行の際にフォルダの場所やURLの指定が間違っていると考えられます。
f:id:knkomko:20200504002955p:plain:w450

解決方法

確認する場所は2つあります。

1. 発行フォルダー、インストールフォルダーのURLの見直し
発行するプロジェクトのプロパティを開きます。
f:id:knkomko:20200504003907p:plain:w350

「発行フォルダーの場所」「インストールフォルダーのURL」を見直します。
私の場合はWebサーバを介してインストールを行う為URLを指定しています。
f:id:knkomko:20200504003959p:plain:w450

2. 発行フォルダーとapplicationファイルの見直し
「発行フォルダーの場所」に「.application」ファイルがある事を確認します。
f:id:knkomko:20200504003313p:plain:w450

AWS Backup EC2 復元時にパブリックIPを付加する方法

f:id:knkomko:20200430163149p:plain

はじめに

AWS Backup から EC2 を復元したらパブリックIPが付加されていなかったので
復元時にパブリックIPを付加する方法を書き残します。

f:id:knkomko:20200430154443p:plain:w450

原因

復元したEC2のサブネットにてパブリックIPの付加が無効になっていました。
f:id:knkomko:20200430161028p:plain:w450

パブリックIPの付加を有効にする方法

1. 復元するEC2で使用するサブネットを選択します。
f:id:knkomko:20200430160627p:plain:w450

2. アクションから[自動割り当てIP設定の変更]を左クリックします。
f:id:knkomko:20200430155626p:plain:w250

3. 「IPv4の自動割り当て」にチェックを入れて保存します。
f:id:knkomko:20200430160223p:plain:w450

4. AWS Backup から EC2 を復元します。
 復元するとEC2にパブリックIPが付加されています。
f:id:knkomko:20200430160320p:plain:w450

SQL Server クラスター化インデックスの動作と実行プランについて

はじめに

SQL Server の検索速度を上げる方法にインデックスの利用があります。
今回は「クラスター化インデックス」についてまとめます。
学習に使用した資料は公式HPのSQL Server 2012 自習書シリーズになります。
SQL Server 2012 | マイクロソフト クラウド プラットフォーム

データベースは自習書シリーズに付属しているサンプルを使用しています。
詳細は以下の記事を参考にして下さい。
knkomko.hatenablog.com

クラスター化インデックスとは

ヒープ領域を使用せずに実データを物理的に並び替えたインデックスです。
インデックスを使用したSQLは最も検索が速い Clustered Index Seek または Clustered Index Scan の動作です。
f:id:knkomko:20200411235632p:plain:w450
引用 : インデックスの基礎とメンテナンス

クラスター化インデックスとの違い

クラスター化インデックスの検索は Indes Seek 後 RID Lookup が動作します。
クラスター化インデックスではヒープ領域を使用せずに実データを使用する事で RID Lookup が無くなる為、非クラスター化インデックスよりも検索が速いです。

クラスター化インデックスとは

ヒープ領域に保存されている実データへのポインタを持つインデックスです。
そのためインデックスを使用したSQLは以下のように動作します。
①インデックスを検索する Index Seek の動作
②検索したインデックスのポインタを辿って実データを読む RID Lookup の動作

f:id:knkomko:20200405192048p:plain:w450
引用 : インデックスの基礎とメンテナンス
knkomko.hatenablog.com

クラスター化インデックスの注意点

1. 実データをインデックス内に格納するのでテーブル内で1つしか作成できない。

2. インデックス作成時に、実データの並び替えを行うため
 非クラスター化インデックスを作成するよりも作成時間がかかる。

3. インデックス作成時に、実データ(ヒープ)を並び替えた結果を格納するための
 作業領域としてテーブルサイズの約 1.5 倍の空き容量が必要になる。

4. インデックス作成時に、トランザクションログへの変更履歴も記録されるため
 その分の空き容量も必要になる。

実行プランの動作

実行プランの動作については以下のスライドが参考になりました。
④Clusted Index Scan、⑤Clusted Index Seek はクラスター化インデックスを使用した場合にだけ動作します。
f:id:knkomko:20200405220702p:plain:w350
引用 : https://www.slideshare.net/ssuser89be8d/index-tuning-129457451/12

インデックスを使用しない場合の実行プラン

最も遅い「Table Scan」を行っています。
f:id:knkomko:20200405222037p:plain:w350

クラスター化インデックスを使用した場合の実行プラン

インデックスを姓列に作成します。
f:id:knkomko:20200412001241p:plain:w350

オブジェクトエクスプローラーから作成したインデックスが確認できます。
f:id:knkomko:20200412001846p:plain:w250

同じSQLを実行すると最も高速な検索「Culusted Index Seek」を行っています。
f:id:knkomko:20200412002413p:plain:w350

クラスター化インデックスを使用した場合の実行プラン

検索に「Index Seek」「RID Lookup」を使用している事が分かります。
f:id:knkomko:20200405222727p:plain:w350

検索結果に該当するデータが大量にある場合の実行プラン

クラスター化インデックスではインデックスが使用されませんでした。

LIKE文では295件のデータが該当し最も遅い「Table Scan」が行われました。
インデックスを使用していてもインデックスを利用しない検索が行われています。
f:id:knkomko:20200405230312p:plain:w350
knkomko.hatenablog.com

クラスター化インデックスを使った場合は最も速い検索「Clusted Index Seek」が使用されます。
f:id:knkomko:20200412005851p:plain:w350

インデックスを作成していない列を使用した場合の実行プラン

クラスター化インデックスではインデックスを使用しない場合には最も遅い検索「Table Scan」が行われます。
f:id:knkomko:20200412011144p:plain:w350

クラスター化インデックスではインデックスを使用しない場合には「Clustered Index Scan」が行われます。
f:id:knkomko:20200412011247p:plain:w350

クラスター化インデックスは実データを物理的に並び替えてインデックスとして使用するので「テーブル=クラスター化インデックス」となり、テーブルスキャンの概念がなくなるため「Cluesred Index Scan」の動作となります。

SQL Server 非クラスター化インデックスの動作と実行プランについて

はじめに

SQL Server の検索速度を上げる方法にインデックスの利用があります。
今回は「非クラスター化インデックス」についてまとめます。
学習に使用した資料は公式HPのSQL Server 2012 自習書シリーズになります。
SQL Server 2012 | マイクロソフト クラウド プラットフォーム

データベースは自習書シリーズに付属しているサンプルを使用しています。
詳細は以下の記事を参考にして下さい。
knkomko.hatenablog.com

クラスター化インデックスとは

ヒープ領域に保存されている実データへのポインタを持つインデックスです。
そのためインデックスを使用したSQLは以下のように動作します。
①インデックスを検索する Index Seek の動作
②検索したインデックスのポインタを辿って実データを読む RID Lookup の動作

f:id:knkomko:20200405192048p:plain:w450
引用 : インデックスの基礎とメンテナンス

実行プランの動作

実行プランの動作については以下のスライドが参考になりました。
④Clusted Index Scan、⑤Clusted Index Seek はクラスター化インデックスを使用した場合に行う為、非クラスター化インデックスでは使用されません。
f:id:knkomko:20200405220702p:plain:w350
引用 : https://www.slideshare.net/ssuser89be8d/index-tuning-129457451/12

インデックスを使用しない場合の実行プラン

最も遅い「Table Scan」を行っています。
f:id:knkomko:20200405222037p:plain:w350

インデックスを使用した場合の実行プラン

インデックスを姓列に作成します。
f:id:knkomko:20200405222416p:plain:w350

オブジェクトエクスプローラーから作成したインデックスが確認できます。
f:id:knkomko:20200405222512p:plain:w250

先ほどと同じSQLを実行すると高速な検索「Index Seek」を行っています。
f:id:knkomko:20200405222727p:plain:w350

インデックスを作成しても効果の無い列

1. WHERE句の検索条件にほとんど使用されない列
 インデックスを作成した列のデータを更新した際にインデックスのツリー構造も更新されるためパフォーマンスが低下する場合があります。

2. 検索条件に該当するデータが大量にある場合
 該当するデータが大量にあると RID Lookupによるデータの取得が、最も遅い「Table Scan」より効率が悪くなる場合があります。

検索結果に該当するデータが大量にある場合の実行プラン

LIKE文では295件のデータが該当し最も遅い「Table Scan」が行われました。
インデックスを使用していてもインデックスを利用しない検索が行われています。
f:id:knkomko:20200405230312p:plain:w350

"Aoki"で検索していた時は高速な検索「Index Seek」が行われていました。
f:id:knkomko:20200405222727p:plain:w350

インデックスが役立たない例

1. LIKE 演算子を利用する際に、先頭に % を指定している場合
 遅い検索「Index Scan」が行われています。
f:id:knkomko:20200405231538p:plain:w350

2. 演算子の左辺へ「関数」や「計算式」を記述している場合
 遅い検索「Index Scan」が行われています。
f:id:knkomko:20200405234844p:plain:w350

3. 列へ設定してある照合順序とは、異なる照合順序を指定している場合
 設定は「Japan_CI_AS」(大文字と小文字を区別しない)となっています。
f:id:knkomko:20200405234940p:plain:w350

 「Japan_CS_AS」を指定すると遅い検索「Index Scan」が行われています。
f:id:knkomko:20200405234901p:plain:w350

SQL Server 自習書 インデックス基礎とメンテナンス sampleDB の作成方法

f:id:knkomko:20200406000335p:plain

はじめに

SQL Server 2012 インデックスの基礎とメンテナンスに付属する
サンプルデータベース sampleDB の作成方法です。
ダウンロードURLが分からず、探すのに時間がかかったのでまとめます。

1. サンプルスクリプトのダウンロード

以下の公式HPから「サンプルスクリプト」を左クリックしてダウンロード
SQL Server 2012 | マイクロソフト クラウド プラットフォーム

f:id:knkomko:20200405184201p:plain:w350

2. EXEファイルの実行

ダウンロードしたサンプルスクリプトをダブルクリックして実行すると
「SQL11_SelfLearning15_index」のフォルダが作られます。
f:id:knkomko:20200405182108p:plain:w450

3. sampleDBを作成するクエリの実行

フォルダ内の「sampleDB.sql」をManagement Studioから実行します。
f:id:knkomko:20200405182453p:plain:w450

4. sampleDBの確認

オブジェクトエクスプローラーを更新すると「sampleDB」が確認できます。
f:id:knkomko:20200405183046p:plain:w150

SQL Server 実行プランの表示方法

f:id:knkomko:20200329202051p:plain:w500

はじめに

SQLのパフォーマンスを向上させる必要が出てきました。
そこで必要となる実行プランを表示する方法をまとめます。
実行プランは「図」と「テーブル」の形式で表示できます。
またadmin以外のアカウントが使用するためには権限が必要です。

実行プランを表示するツール

SQL Server Management Studioを使用します。
f:id:knkomko:20200329202924p:plain:w350

図の形式で表示

ツールバーの赤枠で囲った部分を左クリックします。
これで次からSQLを実行した時の実行計画を保存します。
f:id:knkomko:20200329201558p:plain:w350

SQLを実行すると「実行プラン」タブに図の形式で表示されます。
f:id:knkomko:20200329202051p:plain:w350

図にマウスカーソルを重ねると実行プランの詳細が確認できます。
f:id:knkomko:20200329202516p:plain:w350

テーブルの形式で表示

表示を有効にするには以下のコマンドを実行します。

SET STATISTICS PROFILE ON

f:id:knkomko:20200329203735p:plain:w350

以降SQL実行すると「結果」タブにテーブルの形式で表示されます。
f:id:knkomko:20200329203625p:plain:w350

最後に表示を無効にします。

SET STATISTICS PROFILE ON

f:id:knkomko:20200329204150p:plain:w350

アカウントに必要な権限

接続アカウントがadminでない場合は接続の権限が必要です。
今回は「Makoto」のアカウントに接続の権限を与えます。

管理ツールを使用します。
f:id:knkomko:20200329202924p:plain:w350

セキュリティ→ログイン→アカウント名を右クリックで「プロパティ」を開く。
f:id:knkomko:20200329210037p:plain:w350

「ユーザーマッピング」を左クリックします。
f:id:knkomko:20200329210142p:plain:w350

実行プランを確認するデータベースの「マップ」をチェックします。
f:id:knkomko:20200329210659p:plain:w350

「既定のスキーマ」の[...]を左クリックします。
f:id:knkomko:20200329210902p:plain:w350

[追加]を左クリックします。
f:id:knkomko:20200329210809p:plain:w350

接続権限となる「dbo」を入力して[OK]を左クリックします。
f:id:knkomko:20200329211049p:plain:w350

[OK]を左クリックします。
f:id:knkomko:20200329211025p:plain:w350

データベースに必要な権限

接続アカウントがadminでない場合は「選択」「実行プラン」の権限が必要です。
今回は「Makoto」のアカウントに「選択」「実行プラン」の権限を与えます。

データベース→使用するデータベース名を右クリックで「プロパティ」を開く。
f:id:knkomko:20200329211459p:plain:w350

「権限」を左クリックし、権限を与えるアカウントを選択します。
f:id:knkomko:20200329212301p:plain:w350

「選択」の「許可」にチェックします。
f:id:knkomko:20200329211922p:plain:w350

「プラン表示」の「許可」にチェックします。
f:id:knkomko:20200329211727p:plain:w350

[OK]ボタンを左クリックします。
f:id:knkomko:20200329212347p:plain:w350

ClickOnceを使ったアプリケーションのインストール方法

はじめに

アプリケーションのインストールとバージョンアップを簡単に行える ClickOnce を使ってみました。
今回は Web を介してインストールする方法についてまとめます。

開発環境

Windows 10 Home
VisualStudio 2015 Community
IIS10

1. サンプルアプリの作成

折角なのでLabelにバージョン情報を表示するアプリを作ります。
f:id:knkomko:20200223155654p:plain:w350

今回はWindowsフォームアプリケーションを使用します。
f:id:knkomko:20200223155044p:plain:w350

プロジェクト名は「ClickOnceSample」としました。
f:id:knkomko:20200223155258p:plain:w350

デザインは Label をひとつ追加します。
f:id:knkomko:20200223155929p:plain:w350

以下のようにバージョン情報を取得して表示するようにします。

using System;
using System.Windows.Forms;

namespace ClickOnceSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //自分自身のAssemblyを取得
            System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
            //バージョンの表示
            label1.Text = asm.GetName().Version.ToString();
        }
    }
}
2. フォルダの作成

アプリケーションの発行先となるフォルダを作成します。
今回は C:\deploy\clickoncesample\ としました。
f:id:knkomko:20200223160354p:plain:w350

3. IISのインストールと設定

ClickOnceの機能をWebを介して使用するためWebサーバを使用します。
IISを既に使用している場合はこの手順を飛ばしても問題ありません。

コントロールパネルの「プログラムと機能」を左クリックします。
f:id:knkomko:20200223191904p:plain:w350

Windowsの機能の有効化または無効化」を左クリックします。
f:id:knkomko:20200223192532p:plain:w350

「インターネットインフォメーションサービス」にチェックを入れます。
その他の機能も以下のようにチェックを入れて[OK]ボタンを左クリックします。
f:id:knkomko:20200223193318p:plain:w350

再起動を行います。

再起動後、コントロールパネルの管理ツールを開きます。
f:id:knkomko:20200223193946p:plain:w350

「インターネットインフォメーション(IIS)マネージャー」を開きます。
「サイト」を右クリックして[Webサイトの追加...]を左クリックします。
f:id:knkomko:20200223200257p:plain:w350

「サイト名」「物理パス」「ポート」を指定して[OK]を左クリックします。
f:id:knkomko:20200223201027p:plain:w350

「ClickOnceSample」が作成されます。
f:id:knkomko:20200223205056p:plain:w350

4. アプリケーションの発行

VisualStudioに戻ってプロジェクト名を右クリックします。
表示されたメニューの中から「発行(b)...」を左クリック。
f:id:knkomko:20200223160513p:plain:w350

発行先を設定するため先ほど作成したフォルダを指定します。
f:id:knkomko:20200223160839p:plain:w350

インストール方法は今回「Webサイトから(W)」を選択します。
URLを指定するので[参照(B)...]を左クリックします。
f:id:knkomko:20200223164226p:plain:w350

IIS Express」の「WebSite1」を選択して[開く]を左クリックします。
f:id:knkomko:20200223164442p:plain:w350

※ちなみに以下のような表示の場合はIISが有効になっていません。
 この状態だとWebサーバを介してClickOnceの機能を使うことが出来ないため
 IISのインストールと設定が正しく行えているのか確認する必要があります。
f:id:knkomko:20200223210449p:plain:w350

URLを指定したら[次へ(N) >]を左クリックします。
f:id:knkomko:20200223160911p:plain:w350

今回はオフラインでも使用できるように上のラジオボタンを選択します。
[次へ(N) >]を左クリックします。
f:id:knkomko:20200223210308p:plain:w350

設定内容が表示されるため内容を確認して[完了(F)]を左クリックします。
f:id:knkomko:20200223211237p:plain:w350

発行が完了すると自動的にブラウザが起動します。
f:id:knkomko:20200223212017p:plain:w350

発行が成功した場合の出力欄は以下のようになります。
f:id:knkomko:20200223211422p:plain:w350

IISで設定が行われていないと以下のような警告が表示されます。

警告: 発行されたアプリケーションは http://[コンピュータ名]:[ポート番号]/publish.htm で表示できません。

f:id:knkomko:20200223211508p:plain:w350

5. アプリケーションのインストール

[インストール]ボタンを左クリックすると操作について聞かれます。
今回は[実行]を左クリックします。
f:id:knkomko:20200223214047p:plain:w350

.Net Framework のライセンスに[同意する]を左クリックします。
f:id:knkomko:20200223214016p:plain:w350

セットアップが開始します。
f:id:knkomko:20200223214347p:plain:w350

アプリケーションの検証が行われます。
f:id:knkomko:20200223214426p:plain:w350

最後に[インストール]を左クリックするとインストールできます。
f:id:knkomko:20200223214533p:plain:w350

インストールに成功するとアプリケーションが起動します。
f:id:knkomko:20200223214925p:plain:w350

6. アプリケーションのアンインストール

コントロールパネルからアンインストールする事が出来ます。
f:id:knkomko:20200223214829p:plain:w350

まとめ

ClickOnceを使うことで簡単にアプリケーションを配布できました。
今後はバージョンアップの方法や証明書についてもまとめていきます。