Grow up

生活とプログラミング

IE11 jQueryで外部のテキストを読み込んで表示する方法

f:id:knkomko:20200913155804p:plain

はじめに

IEに外部のhtmlとtxtを読み込んで表示します。
IEで動作した最新のjqueryのバージョンは1.12.4です。
jQuery 2.0.0 では表示できませんでした。

実行環境

Windows Server 2016
・IE11
・IIS10

jQuery 1.12.4 ダウンロード

jQuery 1.12.4 and 2.2.4 Released | Official jQuery Blog

今回はjsファイルをダウンロードして使用しました。
f:id:knkomko:20200913164346p:plain

読み込んだテキストを表示するHTML

publish.htm

<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>sample</title>
    <script src="jquery-1.12.4.min.js" type="text/javascript"></script>
    <script>
    $(function() {
      $("#txt-text").load("sample.txt");
      $("#html-text").load("sample.html");
    });
    </script>
  </head>
  <body>
    <div id="txt-text"></div>
    <div id="html-text"></div>
  </body>
</html>
外部ファイル

sample.html

<a href="https://knkomko.hatenablog.com/">html</a>

sample.txt

<a href="https://knkomko.hatenablog.com/">txt</a>
表示の確認

f:id:knkomko:20200913162304p:plain

Ubuntu 18.04 LXC SQL Server 定期的な完全バックアップを自動化する方法

f:id:knkomko:20200802235455j:plain

はじめに

無料で利用できる SQL Server Express にはエージェントというジョブを定期的に実行するコンポーネントが無いため、別の方法で行う必要があります。

今回は UNIX系のOSにおいて定期的にジョブを実行する cron を使用してバックアップを作成します。

SQL Server のバックアップを作成する際に Transact SQL を使用するため、事前に
sqlcmd (SQL Server コマンドラインツール) のインストールが必要になります。

UbuntuSQL Server をインストールする場合はこちら。
knkomko.hatenablog.com

Ubuntu に sqlcmd をインストールする場合はこちら。
knkomko.hatenablog.com

実行環境

Ubuntu 18.04 LXC
SQL Server 2019

1. cron プロセスの開始

cron プロセスを開始します。

sudo service cron start

cron プロセスの状態を確認します。

sudo service cron status

プロセスが開始できていると running と表記されます。
f:id:knkomko:20200731212356p:plain:w550

2. SQLファイルの作成

例としてemployee データベースの完全バックアップを作成します。
今回は backup.sql としてSQLファイルを作成します。

vim /home/ubuntu/test/backup.sql

以下のクエリでデータベースからemployee.bakという名前でバックアップファイルを作成します。

/home/ubuntu/test/backup.sql

BACKUP DATABASE [employee] TO  DISK = N'/home/ubuntu/test/employee.bak' WITH NOFORMAT, NOINIT,  NAME = N'employee-Full Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO                                                        
3. SHファイルの作成

SQLファイルを実行するSHファイルを作成します。
今回は backup.sh として作成します。

vim /home/ubuntu/test/backup.sh 

sqlcmd でSQL Serverに接続をした後に手順2で作成したSQLファイルを実行します。
cronでsqlcmdを実行するには絶対パスで指定する必要がありました。

/home/ubuntu/test/backup.sh

Execute backup query.
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Pa$$w0rd -i /home/ubuntu/test/backup.sql

# DB backup file name is "employee_YYYYMMdd_HHmmss.bak".
mv /home/ubuntu/test/employee.bak /home/ubuntu/test/employee_`date "+%Y%m%d_%H%M%S"`.bak

sqlcmd の絶対パスの確認には which コマンドを使用しました。

which sqlcmd

以下の記事が参考になりました。
qiita.com

4. cron 設定ファイルの作成

ひな型となる cron 設定ファイルをコピーして作成します。
今回は crontestというファイル名にしました。
cron 設定ファイルに拡張子はありません。

sudo /etc/crontab /etc/cron.d/crontest

管理者権限で vim を起動して編集を行います。

sudo vim /etc/cron.d/crontest

初期は以下のような内容だと思います。

/etc/cron.d/crontest

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.                                                                                                                                                                                                                                                   

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin                                                                                                                                                                                                         

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

今回は毎週、日曜日の午前0時にSHファイルを実行するようにします。
またSHファイルを実行した際の標準出力、標準エラー出力の内容をbackup.logとして作成しています。

00 00   * * MON   root   /home/ubuntu/test/backup.sh >> /home/ubuntu/test/backup.log 2>&1

定期実行の一文を追記した状態が以下の内容になります。

/etc/cron.d/crontest

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.                                                                                                                                                                                                                                                   

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin                                                                                                                                                                                                         

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )


00 00   * * MON   root   /home/ubuntu/test/backup.sh >> /home/ubuntu/test/backup.log 2>&1

時刻や日付の設定は以下の記事が参考になりました。
nigimitama.hatenablog.jp

ここでは m h dom mon dow user command の書式に注意が必要です。
以下の書式に従わないと cron がエラーとなり実行されませんでした。

[m] \s [h] \t [dom] \s [dom] \s [mon] \s [dow] \t [user] \t [command]

制御文字 \s は半角空白、\t はタブを表しています。

5. 確認

設定時刻にSQLファイル実行時のログとデータベースのバックアップファイルが作られています。
f:id:knkomko:20200802232254p:plain:w550

ログファイルに標準出力の内容が記載されていることも確認できました。
f:id:knkomko:20200802232647p:plain:w550

Android LinearLayout ウィジェットを画面中央に配置する

f:id:knkomko:20200726151440p:plain

はじめに

Google が「Android」を学べる無償コースを提供しているという記事を読んだので取り組んでみました。
japan.zdnet.com

以下のコースでウィジェットの位置を指定する箇所があるのですが、指定に対して位置がどのように変化しているのか分からなかったので調べてみました。

Android Kotlin の基礎 : 基本的なAndroidプロジェクトの構造
codelabs.developers.google.com

目標の配置

目標としてはTextViewとButtonを中央に縦並びで配置します。
f:id:knkomko:20200726092119p:plain:w250

初期の配置

width と height を指定したLinearLayoutを使用すると、左上にテキストとボタンが横並びとなっていました。
f:id:knkomko:20200725211021p:plain:w250

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/roll_label" />

</LinearLayout>
1. ウィジェットを上下に並べる

LinearLayout の orientation を指定して子要素の並びを変更します。
orientation には vertical と horizon が指定できます。
orientationを指定しない場合の規定値は horizon となるため、初期の位置ではウィジェットが左右に配置されていたようです。
f:id:knkomko:20200725214302p:plain
LinearLayout  |  Android Developers

orientation に vertical を指定してウィジェットを上下に並べます。

android:orientation="vertical"

f:id:knkomko:20200725213243p:plain:w250

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/roll_label" />

</LinearLayout>
2. ウィジェットを左右中央に配置する

TextViewとButtonのlayout_gravityは位置を指定する14種類の値がありました。

f:id:knkomko:20200726150930p:plain:w450

LinnerLayout の layout_gravity と同じようですが、TextView や Button の layout_gravity の値について説明するドキュメントは見つけることができませんでした。

layout_gravity に center_horizontal を指定して左右中央に配置します。

android:layout_gravity="center_horizontal"

f:id:knkomko:20200726093833p:plain:w250

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Hello World!" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/roll_label" />

</LinearLayout>
3. ウィジェットを上下中央に配置する

LinearLayout の layout_gravity を使って子要素の位置を指定します。
layout_gravity には位置を指定する14種類の値があります。
規定値は Gravity.Top となっているようです。
f:id:knkomko:20200726140002p:plain
LinearLayout.LayoutParams  |  Android Developers

layout_gravity に center_vertical を指定して上下中央に配置します。

android:layout_gravity="center_vertical"

f:id:knkomko:20200726140647p:plain:w250

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_gravity="center_vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Hello World!" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="@string/roll_label" />

</LinearLayout>

Ubuntu 18.04 LXC に SQL Server をインストールする方法

f:id:knkomko:20200614224057j:plain

はじめに

UbuntuSQLServerをインストールする機会があったので、
公式ドキュメントのコマンドを実行する中で発生した問題を解決していきます。
docs.microsoft.com

SQL Serverコマンドラインツールは以下の記事を参考にしてください。
今回と同じ Ubuntu 18.04 LXC にインストールを行った内容になります。
knkomko.hatenablog.com

SQL Server について

SQL Server 2016 からLinuxに対応しています。
SQL Server on Linux のインストール ガイド - SQL Server | Microsoft Docs
f:id:knkomko:20200705030706p:plain

メモリ2GBが必要とありますが、Expressエディションを選択した場合は
1インスタンスが1410MBまでしか使用できない制限があります。
Editions and supported features of SQL Server 2019 - SQL Server | Microsoft Docs
f:id:knkomko:20200705030720p:plain

1. パブリック リポジトリの GPG キーをインポート
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

上記コマンドを実行するとwgetコマンドとgnupgが必要だとエラーになりました。
f:id:knkomko:20200705013912p:plain

まずwgetコマンドをインストールすると権限が無いと拒否されたので
f:id:knkomko:20200705015213p:plain

管理者権限で実行すると何事も無くインストールができました。
f:id:knkomko:20200705015502p:plain

次はgnupgコマンドをインストールします。
こちらも管理者権限が必要になるので、管理者権限で実行をします。
f:id:knkomko:20200705015835p:plain

目的のGPGキーのインポートするコマンドを実行すると無事成功しました。
f:id:knkomko:20200705020221p:plain

2. Microsoft Ubuntu リポジトリを登録
sudo add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/18.04/mssql-server-2019.list)"

上記コマンドを実行するとコマンドが無いとエラーになりました。
f:id:knkomko:20200705020611p:plain

新たにパッケージをインストールする必要があるようです。
f:id:knkomko:20200705021043p:plain
Ubuntu Linuxで、add-apt-repositoryしようとして「コマンドがない」って言われたら - CLOVER🍀

まずは software-properties-common のパッケージをインストールしてから
f:id:knkomko:20200705021622p:plain

再びコマンドを実行すると、リポジトリの登録ができました。
f:id:knkomko:20200705022018p:plain

3. 次のコマンドを実行して SQL Server をインストール
sudo apt-get update
sudo apt-get install -y mssql-server

まずは apt-get update コマンドを実行します。
f:id:knkomko:20200705022517p:plain

次に SQL Server のインストールコマンドを実行します。
f:id:knkomko:20200705022917p:plain

4. パッケージのインストールが完了したら、mssql-conf setup を実行し、プロンプトに従って SA パスワードを設定し、エディションを選択
sudo /opt/mssql/bin/mssql-conf setup

コマンドを実行するとエディションの一覧が表示されました。
f:id:knkomko:20200705023202p:plain

今回はExpressを使用するので 3 を入力してEnterを押します。
f:id:knkomko:20200705023525p:plain

ライセンスに同意するので Yes を入力します。
f:id:knkomko:20200705023627p:plain

最後に管理者アカウントのパスワードを設定します。
f:id:knkomko:20200705023755p:plain

設定が終わるとSQL Serverが自動で起動しました。
f:id:knkomko:20200705024056p:plain

5. 構成が完了したら、サービスが実行されていることを確認します。
systemctl status mssql-server --no-pager

コマンドを実行すると running と表記があり、起動している事を確認できました。
f:id:knkomko:20200705024537p:plain

6. リモート接続を計画している場合は、必要に応じてファイアウォールSQL ServerTCP ポート (既定値は 1433) も開きます。

TCPポート1433を開くとManagement Studioから接続を行う事ができました。

Ubuntu 18.04 LXC SQL Server コマンドラインツールをインストールする方法

f:id:knkomko:20200614224057j:plain

はじめに

UbuntuSQLServerコマンドラインツールをインストールする機会があったので、
公式ドキュメントのコマンドを実行する中で発生した問題を解決していきます。
docs.microsoft.com

1. パブリック リポジトリの GPG キーをインポート
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

上記コマンドを実行するとcurlコマンドとgnupgが必要だとエラーになりました。
f:id:knkomko:20200614193014p:plain

必要とされたcurlコマンドをインストールすると再びエラーが発生。
f:id:knkomko:20200614203847p:plain

どうやらインストールを実行する前にパッケージリストの更新が必要のようです。
f:id:knkomko:20200614205421p:plain
Cannot install packages inside docker Ubuntu image - Stack Overflow

そこでパッケージリストの更新を行ってから
f:id:knkomko:20200614210510p:plain

再びcurlコマンドのインストールを行うと、今度は問題無く実行できました。
f:id:knkomko:20200614210810p:plain

続いてgnupgをインストールする方法を調べるとDockerfileの例を見つけたので
f:id:knkomko:20200614211605p:plain
e:gnupg、gnupg2、gnupg1はインストールされていないようですが、この操作にはそのうちの1つが必要です

必要なコマンドだけを実行すると権限が無いと拒否されて実行できませんでした。
f:id:knkomko:20200614212322p:plain

こちらは管理者権限でコマンドを実行することによりインストールに無事成功。
f:id:knkomko:20200614212837p:plain

本命のGPGキーをインポートするコマンドを実行すると問題無く実行できました。
f:id:knkomko:20200614213204p:plain

2. Microsoft Ubuntu リポジトリを登録
curl https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list

続いて上記のコマンドを実行します。
f:id:knkomko:20200614213818p:plain

3. ソース一覧を更新し、unixODBC 開発者パッケージを使用してインストール コマンドを実行
sudo apt-get update

続いて上記コマンドを実行します。
f:id:knkomko:20200614214223p:plain

sudo apt-get install mssql-tools 

続いて上記コマンドを実行して今回は最新版のツールをインストールします。
f:id:knkomko:20200614214810p:plain

4. 省略可能:bash シェルで PATH 環境変数に /opt/mssql-tools/bin/ を追加します。

・ログインセッション用

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile

・対話型/非ログイン セッション用

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

sqlcmdコマンドが使用できるようにパスを通します。
f:id:knkomko:20200614215821p:plain

5. 確認
sqlcmd -?

上記コマンドを実行してsqlcmdが使用できることを確認します。
f:id:knkomko:20200614221120p:plain

SQL Server の接続とSQLの実行も問題なく行えました。
f:id:knkomko:20200614221502p:plain

Entity Framework 6 例外の発生原因の調べ方

f:id:knkomko:20200523024544p:plain

はじめに

EFを使用してデータベースへInsertを行う際に例外が発生したのですが
原因がすぐに分からなかったので、EFの例外オブジェクトについてまとめます。

例外の発生原因の調べ方

「詳細を表示」のリンクを左クリックして例外オブジェクトの詳細を表示します。
f:id:knkomko:20200523015927p:plain:w450

$Exception → EntityValidationErrors → ValidationErrors → [0] ~ [x]
上記オブジェクトの ValidationErrors に例外の原因の数だけ要素が作成されます。
f:id:knkomko:20200523020134p:plain:w450

ValidationErrors の2つのプロパティから発生原因を知る事ができます。
① ErrorMessage … エラーの説明
② PropertyName … エラーとなったオブジェクトのフィールド名
f:id:knkomko:20200523022726p:plain:w450

Visual Studio 2019 Installer Project で .NET Framework オフライン インストーラ を実行する方法

f:id:knkomko:20200517011735p:plain

開発環境

・Windows10 バージョン 1909
Visual Studio 2019 Community

はじめに

今回は Installer Project から オフラインインストーラを実行してみます。

規定値の場合 .NET Framework はインターネットを介してダウンロードするため、オフラインの場合はオフラインインストーラを実行する必要がありました。

Installer Project の作成方法については以下の記事をご確認ください。
knkomko.hatenablog.com

1. Installer Project 設定の変更

Installer Project を右クリックします。
f:id:knkomko:20200517013552p:plain:w350

表示されたメニューから「プロパティ」を左クリックします。r
f:id:knkomko:20200517013715p:plain:w350

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

「アプリケーションと同じ場所から必須コンポーネントをダウンロードする」のラジオボタンを左クリックします。
この時、使用する .NET Framework にチェックが入っている事を確認して下さい。
[OK]ボタンを左クリックします。
f:id:knkomko:20200517014027p:plain:w350

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

2. 不足ファイルの確認

Installer Project を右クリックして「リビルド」を左クリックします。
f:id:knkomko:20200517014729p:plain:w350

ビルドエラーの場合は内容を確認します。
.NET Framework のファイルが不足しているという内容が表示されると思います。
f:id:knkomko:20200517014826p:plain

今回は"DotNetFX472\NDP472-KB4054530-x86-x64-AllOS-ENU.exe"が必要です。
.NET Framework のバージョンによって名称が変わるので注意してください。

ERROR: [必須コンポーネント] ダイアログ ボックスで [アプリケーションと同じ場所から必須コンポーネントをダウンロードする] を有効にするには、項目 'Microsoft .NET Framework 4.7.2 (x86 および x64)' のファイル 'DotNetFX472\NDP472-KB4054530-x86-x64-AllOS-ENU.exe' をローカル コンピューターにダウンロードする必要があります。詳細については、http://go.microsoft.com/fwlink/?LinkId=616018 を参照してください。

3. 不足ファイルの配置

以下のサイトから不足している .NET Framework をダウンロードします。
dotnet.microsoft.com

今回は .NET Framework 4.7.2 を使用します。
f:id:knkomko:20200517015641p:plain:w450

Offline installer と Language packs のファイルをダウンロードします。
今回は日本語の Language packs を使用します。
f:id:knkomko:20200517020146p:plain:w450

2つのファイルをダウンロードしました。
・Offline installer : NDP472-KB4054530-x86-x64-AllOS-ENU.exe
・Language packs : ndp472-kb4054530-x86-x64-allos-jpn.exe
f:id:knkomko:20200517021044p:plain:w450

以下のフォルダを開きます。
C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages\
f:id:knkomko:20200517021423p:plain:w450

フォルダ名とバージョンの対応は以下の通りです。
f:id:knkomko:20200517022301p:plain:w350

今回は 4.7.2 を使用する為 DotNetFX472 を開きます。
f:id:knkomko:20200517022433p:plain:w450

DotNetFX472 に Offline installer のファイルをコピーします。
Offline installer : NDP472-KB4054530-x86-x64-AllOS-ENU.exe
f:id:knkomko:20200517022556p:plain:w450

DotNetFX472 フォルダ内の ja フォルダを開きます。
f:id:knkomko:20200517022847p:plain:w450

ja フォルダに Language packs のファイルをコピーします。
Language packs : ndp472-kb4054530-x86-x64-allos-jpn.exe
f:id:knkomko:20200517023000p:plain:w450

4. インストーラの作成

Installer Project を右クリックして「リビルド」を左クリックします。
f:id:knkomko:20200517014729p:plain:w350

.NET Framework ファイル不足が原因だったエラーが解消されたと思います。
f:id:knkomko:20200517023342p:plain:w450

インストーラを確認すると DotNetFX472 のフォルダが作成されています。
f:id:knkomko:20200517023608p:plain:w450

DotNetFX472 のフォルダにはインストーラファイルが入っています。
f:id:knkomko:20200517023755p:plain:w450

5. インストーラの実行

オフラインでインストールを行います。
f:id:knkomko:20200517030402p:plain:w450

.NET Framework のインストールを行います。
f:id:knkomko:20200517030442p:plain:w450

無事 .NET Framework のオフラインインストーラが実行されました。
f:id:knkomko:20200517030541p:plain:w450

.NET Framework のインストールが完了すると次はアプリのインストールです。
f:id:knkomko:20200517030623p:plain:w450

アプリのインストールが完了して実行できることが確認できました。
f:id:knkomko:20200517030743p:plain:w450

注意点

発行 と Installer Project の必須コンポーネントの画面が同じなので間違えないようにして下さい。

・発行 の場合
f:id:knkomko:20200517031118p:plain:w450

f:id:knkomko:20200517031141p:plain:w450

・Installer Project の場合
f:id:knkomko:20200517031324p:plain:w450

f:id:knkomko:20200517031341p:plain:w450