Grow up

生活とプログラミング

Setup DB First JetEntityFrameworkProvider in VS2019

f:id:knkomko:20201025011901p:plain

準備① JetEntityFrameworkProvider

GitHubからソースコードをダウンロードします。
f:id:knkomko:20201022004851p:plain

準備② レジストリのバックアップ

今回は VisualStudio のレジストリをエクスポートしました。
必要に応じて他のレジストリもエクスポートしておくと安心です。

regedit を実行。
f:id:knkomko:20201022005849p:plain

VisualStudio を選択。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio
f:id:knkomko:20201022010036p:plain

エクスポートで保存。
f:id:knkomko:20201022010202p:plain

準備③ レジストリキー作成

レジストリエディタからVisualStudioにキーを新規作成します。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\
f:id:knkomko:20201022011432p:plain

自由に名前を付けて良いのですが今回は OMGITWORKS で作成。
f:id:knkomko:20201022011629p:plain

1. Visual Studio を管理者として実行

f:id:knkomko:20201022005712p:plain

GitHubからダウンロードした JetEntityFrameworkProvider を開く。
f:id:knkomko:20201022010426p:plain

2. install.cmd 編集

JetDdexProvider の install.cmd を開く。
f:id:knkomko:20201022010741p:plain

REGROOT のキーをレジストリエディタで作成した OMGITWORKS に変更。
f:id:knkomko:20201022011112p:plain

3. プロジェクトのコンパイル

コンパイルするためにビルドイベントの内容を編集します。
使用しているVisualStudioのバージョンによってパスが変わるため
環境に合わせてパスを変えて、コンパイルできるようにします。

3-1. JetDdexProvider ビルドイベント編集

JetDdexProvider のプロパティからビルドイベントを編集。
f:id:knkomko:20201022013407p:plain

① ビルド前イベントのコマンドライン

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"
"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /u JetEntityFrameworkProvider.dll

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022012952p:plain

② ビルド後イベントのコマンドライン

"$(ProjectDir)Install.cmd" /ranu /codebase "$(TargetDir)$(TargetFileName)"

call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars32.bat"

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /i "$(TargetDir)JetEntityFrameworkProvider.dll" /f

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022013250p:plain

3-3. JetEntityFrameworkProvider ビルドイベント編集

JetEntityFrameworkProvider のプロパティからビルドイベントを編集。
f:id:knkomko:20201022013536p:plain

① ビルド前イベントのコマンドライン

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /u "$(TargetName)"

赤下線はVisualStudioのバージョンごとに変わるので確認して変更します。
f:id:knkomko:20201022013643p:plain

② ビルド後イベントのコマンドライン

"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe" /if "$(TargetPath)"

赤下線はVisualStudioのバージョンごとに変わるのでパスを確認して変更します。
f:id:knkomko:20201022013829p:plain

3-4. JetDdexProvider, JetEntityFrameworkProvider リビルド

JetDdexProvider
f:id:knkomko:20201022014247p:plain

JetEntityFrameworkProvider
f:id:knkomko:20201022014320p:plain

正常終了し、出力にエラーメッセージが無ければ成功です。
f:id:knkomko:20201022014458p:plain

レジストリエディタからDataProviders, DataSourcesが作成されている事を確認します。
コンピューター\HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\OMGITWORKS
f:id:knkomko:20201022022629p:plain

3-5. VisualStudio2019 プライベートハイブ読み込み

レジストリでは、各種の情報がキー、サブキー、値と階層的に管理されている。
ハイブは、ハードウェア設定やソフトウェア設定、セキュリティ設定など、レジストリに保存される情報のうち、特定分野に関する一連の情報を識別するセクションを意味する。

Insider's Computer Dictionary:ハイブ とは? - @IT

プライベートハイブの編集方法については以下の記事が参考になりました。

Fortunately, you can use regedit.exe to load a private hive. You need to select the HKEY_USERS node, and click the File > Load Hive… menu. You select the privateregistry.bin file, give a name to the hive (I entered “VS2017PrivateRegistry”) and now you can see the 15.0_Config key populated as usual (note: use File > Unload Hive when done):

Some implications of the new modular setup of Visual Studio 2017 for VSX developers | Visual Studio Extensibility (VSX)

VisualStudioのレジストリにJetEntityFrameworkProviderを登録するのですが、2017からプライベートハイブに変わってしまいコンパイルだけで登録出来ないため、手作業で行います。

まずはVisualStudioのレジストリ(プライベートハイブ)を確認。
~\AppData\Local\Microsoft\VisualStudio\
f:id:knkomko:20201022015345p:plain

プライベートハイブのフォルダ名 16.0 はVisualStudioのバージョンです。
利用している開発環境のバージョンと一致するフォルダを探してください。
f:id:knkomko:20201022015514p:plain

プライベートハイブを編集する前に起動しているVisualStudioを全て終了します。
起動していると以下の警告メッセージが表示されて編集ができません。
f:id:knkomko:20201024214059p:plain

レジストリエディタにて HKEY_USER を選択。
f:id:knkomko:20201022021236p:plain

レジストリエディタのハイブの読み込みから privateregistry.bin を指定。
f:id:knkomko:20201022021429p:plain

キー名を付ける必要があるので分かりやすい名前を付けます。
f:id:knkomko:20201024220140p:plain

これによりVisualStudioのプライベートハイブが編集できるようになります。
f:id:knkomko:20201024220257p:plain

3-6. レジストリ DataProviders, DataSources エクスポート

DataProviders, DataSoures それぞれエクスポートします。
f:id:knkomko:20201024214647p:plain

ドキュメントフォルダにregというフォルダを作成してエクスポートしました。
f:id:knkomko:20201024214745p:plain

3-7. レジストリ DataProviders, DataSources 編集

エクスポートした DataProviders, DataSources を編集します。
間違えても良いように _new としてコピーしたものを編集します。
f:id:knkomko:20201024215153p:plain

regファイルを右クリックして、今回はメモ帳で編集しました。
f:id:knkomko:20201024220910p:plain

OMGITWORKSのパスを全て、プライベートハイブのパスに変更します。
・変更前
f:id:knkomko:20201024221110p:plain
・変更後
f:id:knkomko:20201024221421p:plain

3-8. レジストリ DataProviders, DataSources インポート

パスをプライベートハイブに変更した DataProviders, DataSources をレジストリエディタでインポートします。DataProviders, DataSourcesがある_Config が付くレジストリキーにインポートします。
f:id:knkomko:20201024222001p:plain

DataProviders を選択します。
f:id:knkomko:20201024225329p:plain

インポートから先ほど編集した DataProviders_new.reg を開きます。
f:id:knkomko:20201024225415p:plain

完了するとDataProvidersにJetDDEXProviderが追加されます。
f:id:knkomko:20201024225659p:plain

DataProviders と同様に DataSources もインポートします。

3-9. VisualStudio2019 プライベートハイブアンロード

読み込んでいたプライベートハイブを選択します。
f:id:knkomko:20201024223203p:plain

アンロードを左クリック。
f:id:knkomko:20201024223311p:plain

警告メッセージが表示されます。
f:id:knkomko:20201024223338p:plain

はいボタンを押してレジストリキーのアンロードを実行します。
f:id:knkomko:20201024223358p:plain

4. machine.config に JetEntityFrameworkProvider 追加

machine.config をデスクトップにコピーして編集をします。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config
f:id:knkomko:20201024223906p:plain

DbProviderFactories に JetEntityFrameworkProvider を追加します。
f:id:knkomko:20201024224319p:plain

元の場所にmachine.configを上書きをします。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config

DB First 確認

Accessでデータベースを作成します。
f:id:knkomko:20201024232924p:plain

NuGet から JetEntityFrameworkProvider をインストールします。
f:id:knkomko:20201024230343p:plain

ADO.NET Entity Data Model からDbContextの名称を入力して追加します。
f:id:knkomko:20201024233348p:plain

データベースから Code First を選択して次へ。
f:id:knkomko:20201024224654p:plain

新しい接続を左クリックします。
f:id:knkomko:20201024233433p:plain

データソースを変更します。
f:id:knkomko:20201024233531p:plain

<その他>からJet DDEX provider for JetEntityFrameworkProviderを選択します。
f:id:knkomko:20201024233649p:plain

DataSource と Provider を入力します。
f:id:knkomko:20201024233846p:plain

接続文字列が作成されます。
f:id:knkomko:20201024234031p:plain

モデルを作成するテーブルを選択します。
f:id:knkomko:20201024234106p:plain

Employee、SampleContext が作成できました。
f:id:knkomko:20201024234231p:plain

GitHub の利用

f:id:knkomko:20200921202135p:plain

はじめに

UdemyのGit講座で覚えきれなかった内容を復習します。
knkomko.hatenablog.com

1.リモートリポジトリを追加
git remote add [リモート名]

GitHub上で新規作成したリモートリポジトリをbakの名称で登録する
f:id:knkomko:20200921202957p:plain

リモートの情報を確認するとbakの名称でリポジトリの登録が確認できる
f:id:knkomko:20200921203111p:plain

2. リモートリポジトリの情報を取得
git fetch [リモート名]

リモートリポジトリの更新された内容を取得する
f:id:knkomko:20200921203719p:plain

リモートリポジトリから取得した情報がローカルリポジトリに保存される
remotes/ : リモートリポジトリから取得した情報が保存される場所
f:id:knkomko:20200921203805p:plain

ワークツリーにローカルリポジトリの内容を反映する
f:id:knkomko:20200921204238p:plain

3. リモートリポジトリの削除
git remote rm [リモート名]

現在のリモートリポジトリを確認する
f:id:knkomko:20200921205118p:plain

リモートリポジトリを削除する
f:id:knkomko:20200921205254p:plain

リモートリポジトリが削除されていることを確認する
f:id:knkomko:20200921205331p:plain

4. リモートリポジトリに更新内容を保存する
git push [リモート名] [ブランチ名]

ローカルリポジトリの更新内容をリモートリポジトリに保存する
f:id:knkomko:20200921210729p:plain

5. ブランチの新規作成
git branch [ブランチ名]

既存のブランチを確認する
f:id:knkomko:20200921205649p:plain

ブランチを新規作成する
f:id:knkomko:20200921205739p:plain

作成したブランチを確認する
f:id:knkomko:20200921205818p:plain

6. ブランチを切り替える
git checkout [既存ブランチ名]

masterからfutureブランチに切り替える
f:id:knkomko:20200921210046p:plain

現在HEADが指し示すブランチを確認する
f:id:knkomko:20200921210156p:plain

7. 変更履歴をマージする
git merge [ブランチ名]

①Fast Foward
現在のブランチより新しいブランチを参照する (親ブランチは1つ)

リモートリポジトリにてindex.htmlを変更した内容をワークツリーに取り込む
pull : fetch と merge を順番に実行する
f:id:knkomko:20200921211826p:plain

リモートリポジトリにて変更した最新のブランチが参照されている
f:id:knkomko:20200921212214p:plain

②Auto Merge
複数のブランチから新しいブランチを作成して参照する (親ブランチは2つ)

fuatureブランチにてindex.htmlを変更した内容をmasterに取り込む
f:id:knkomko:20200921212718p:plain

fuatureブランチの変更がmasterブランチに取り込まれている
f:id:knkomko:20200921212816p:plain

8. コンフリクトを解決する

複数のブランチが同じファイルの同じ行に変更を行うとコンフリクトが発生する
f:id:knkomko:20200921214313p:plain

コンフリクトが発生したファイルを確認する
f:id:knkomko:20200921214355p:plain

コンフリクトが発生している行を確認する
f:id:knkomko:20200921214617p:plain
f:id:knkomko:20200921214527p:plain

コンフリクトが発生した行を編集してファイルを保存する
f:id:knkomko:20200921214900p:plain

コンフリクトを解消したファイルをコミットする
f:id:knkomko:20200921215825p:plain

コンフリクトを解消したことをメッセージに記載する
f:id:knkomko:20200921215601p:plain

コミットが成功していることを確認する
f:id:knkomko:20200921215955p:plain

9. コンフリクトを防ぐ

・複数人で同じファイルを変更しない
・pullやmergeする前にcommitしておく
・pullするブランチに移動してからpullする

10. GitHub Flow を使用した開発手順

必ずプルリクエストによるレビューを行ってコードの品質を担保する
開発フローをシンプルにすることで開発に参加しやすくなる
masterがリリースしているコードとなる事で機能単位の切り戻しがしやすくなる
f:id:knkomko:20200921220741p:plain
【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう:こっそり始めるGit/GitHub超入門(終) - @IT

講座の感想

まずはGitHub Flowを小規模な開発で導入したいと思いました。
コンフリクトの解消方法やコンフリクトを防ぐ運用ルールをチームで共有する為に今回の講座にあるGitの仕組みを理解して説明できる必要があるので、まずは個人で利用して、理解を深めていきたいと思います。

Git 基本コマンド

f:id:knkomko:20200921085614p:plain

はじめに

2年前に購入していたUdemyのGit講座を始めました。
www.udemy.com

記事作成時点でプライベートリポジトリが無料で使えるといった変更もありますがGitの仕組みやコマンドの使い方は変わらないと思うので前向きに取り組みます。
jp.techcrunch.com

1. ローカルリポジトリの新規作成
git init

実行すると空のローカルリポジトリが作成される
f:id:knkomko:20200921005639p:plain

ローカルリポジトリには.git ディレクトリ(隠しフォルダ)が作成される
f:id:knkomko:20200921005949p:plain

.git ディレクトリにローカルリポジトリのデータが保存されている
・objects … リポジトリの本体 (ツリーファイル、コミットファイル)
・config … Gitの設定ファイル (インデックスファイル)
f:id:knkomko:20200921010120p:plain

2. Gitリポジトリのコピーを作成
git clone [Git リポジトリ URL]

http://github.com/atom/atom.com のコピーを作成する
f:id:knkomko:20200921011207p:plain

atomのワークツリー、.gitディレクトリが作成されている
f:id:knkomko:20200921011929p:plain

3. ワークツリーの変更をステージに追加
git add .

index.html ファイルを作成して、その変更をステージに追加する
f:id:knkomko:20200921012530p:plain

4. ステージの変更を記録する
git commit

コマンドを実行する
f:id:knkomko:20200921013648p:plain

git のエディタが起動したらコミットメッセージを入力して保存する
f:id:knkomko:20200921013743p:plain

ステージのインデックス情報がリポジトリのツリーに記録される
f:id:knkomko:20200921013850p:plain

5. 変更状況を確認する
git status

ワークツリーにコミットすべき変更がない状況を確認する
f:id:knkomko:20200921071946p:plain

index.html を変更してステージに追記すべき情報が有る状況を確認する
f:id:knkomko:20200921072143p:plain

git add を実行して、コミットすべき情報が有る状況を確認する
f:id:knkomko:20200921072419p:plain

git commit を実行して、コミットすべき変更がない状況を確認する
f:id:knkomko:20200921072515p:plain

6. ワークツリーとステージ間の変更状況を確認する
git diff

index.html の変更した内容を確認する
f:id:knkomko:20200921073019p:plain

ステージに追記後、ワークツリーとステージの間に差が無い事を確認する
f:id:knkomko:20200921073329p:plain

7. ステージとリポジトリ間の変更状況を確認する
git diff --staged

ステージに追加した後の変更状況を確認する
f:id:knkomko:20200921073620p:plain

リポジトリに追記後、ステージとリポジトリの間に差が無い事を確認する
f:id:knkomko:20200921073711p:plain

8. ファイルの変更履歴を確認する
# 全ての変更履歴を表示
git log

f:id:knkomko:20200921074713p:plain

#変更履歴の要点を一行で表示
git log --oneline

f:id:knkomko:20200921074829p:plain

# ファイルの変更差分を表示
git log -p [ファイル名]

f:id:knkomko:20200921075100p:plain

# 表示するコミット数を制限
git log -n [コミット数]

f:id:knkomko:20200921075239p:plain

9. ファイルの削除を記録する
# ワークツリーとリポジトリのファイルを削除
git rm [ファイル名]

ファイルの削除を実行する
f:id:knkomko:20200921080430p:plain

ステージにファイルの削除を実行した、という変更状況が記録されている
f:id:knkomko:20200921080621p:plain

# ワークツリーにファイルは残してリポジトリのファイルを削除
git rm --cashed [ファイル名]

ファイルの削除を実行する
f:id:knkomko:20200921081823p:plain

ステージに削除を実行したことが記録され、リポジトリにファイルが無いため
ワークツリーに残ったindex.htmlがリポジトリに存在しないと表示されている
Chages to committed : コミットされていないステージの変更
Untracked files : リポジトリに存在しないワークツリーのファイル
f:id:knkomko:20200921082705p:plain

10. ファイルの移動を記録する
git mv [旧ファイル名] [新ファイル名]

ファイル名の変更を実行する
f:id:knkomko:20200921083424p:plain

ステージにファイル名の変更を実行した、という変更状況が記録されている
f:id:knkomko:20200921083541p:plain

講座の感想

Gitの仕組みとコマンドを図で説明してもらえるのでわかりやすかったです。
ワークツリー、ステージ、リポジトリの役割を理解する事が重要だと感じました。

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から接続を行う事ができました。