きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

VS 2015 の SSDTの接続先設定ダイアログが使いやすくなっていて大変うれしい件

VS2015 の SQL Server Data Tools(SSDT)が細かなところで使い勝手が良くなっていて大変うれしかったので。

SSDTではそのツールの性質上、接続さきのDBを選択する場面が多々出てきます。VS2013までは、Visual StudioSQL Server を使っていればどこまで見たことがある例の接続ダイアログでした。

VS2015でどうなったかというと……。

 

サーバを選択するダイアログが使いやすくなった

以前はドロップダウンからサーバを選択する感じで、LAN上のサーバがリストアップされるだけ、あとは手打ち入力する必要がありました。

しかし今回からはツリービューで選択でき、ネットワークだけではなく自分のPCのローカル(localdbも含む)やAzure上のSQL Databaseも選択できるようになりました。

f:id:kiyokura:20160421124222p:plain

特に私はlocaldbを利用する場合の書き方をよく忘れ、SQL Server オブジェクトエクスプローラーで探してプロパティーからコピペすることが多かったので手間が省けて大変助かります。素敵。

 

履歴でピン止めできるようになった

以前は、過去に利用したことのある接続履歴数個がドロップダウンに表示されていました。数少ない場合ばいいのですが、多くのDBインスタンスにいろいろ接続しているときは、利用したい接続情報がすぐに履歴から追い出されてしまって面倒な思いをしていました。

今回から、よく使う接続はお気に入りとしてピン止めできるようになりました。超素敵。

f:id:kiyokura:20160421124221p:plain

 

 

これからもSSDTには進化を続けていってもらいたいですね!

Visual Studio Code のmarkdownプレビューのスタイルを簡易カスタマイズ

Visual Studio Codeの markdownプレビュー機能をなるべくお手軽にカスタマイズする方法をメモ。 Ver 1.0.0, Windows版で確認した内容になります。

「とりあえず日本語フォントだけでもどうにかしたい」場合には有効かも。

Visual Studio CodeのMarkdownプレビュー機能

Visual Studio CodeはMarkdownをプレビュー表示する機能があります。並べて表示することも可能でその際にはリアルタムでプレビューも表示されて結構便利です。

スタイルはCSSで定義できる

プレビュー表示時のスタイルはCSSで定義されていて、カスタマイズも可能です。 カスタマイズはpreferece で "markdown.styles" に独自のCSS設定することで実現します。これについては以下のオフィシャルドキュメント参照。

code.visualstudio.com

部分的には上書きできないっぽい

ただしこのカスタマイズ、部分的に上書きするという方法が適用できないようです。

body{
  font-family:Meiryo;
}

だけのファイルを"markdown.styles"で指定しても、font-family以外はリセットされてChromiumの素のスタイル?で表示されます。

とはいえ、全体をいい感じになるようにスタイルを一から書くのも面倒ですよね…。

デフォルトのCSSをコピーして一部書き換える

ということで、ここはズルしてしまいます。 デフォルトのスタイルを定義しているCSSは、インストール先に存在します。例えばここ。

C:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\languages\markdown\common\markdown.css

これを適当な場所にコピって来ましょう。例えば自分のユーザーフォルダ(C:\Users\<ユーザー名>)とかでもいいでしょう。

そしてコピーしたファイルを開いて、一部書き換えます。

今回はとりあえず、中華フォントになってしまう点だけに対処してみます。具体的には、bodyとcode要素に対するフォント指定だけ改変します。

※改変するにあたって、cssをアンミニファイしておくと作業が楽かと思います

まずはbodyのフォントにMeiryoを指定

先頭にMeiryoを追加してみました。

body {
  font-family: Meiryo, Segoe WPC,Segoe UI,SFUIText-Light,HelveticaNeue-Light,sans-serif;
  font-size: 14px;
  padding-left: 12px;
  line-height: 22px;
}

codeに幅固定フォントを指定

codeここはコードを表示する際のブロックなので、monospace系のフォントが良いでしょう。私はコーディングにMigu 1Mを使っているのでこれを指定します。 ここで注意なのは、フォントによってはフォント名をシングルクォートで括ってやる必要があることです。

code {
  font-family: 'Migu 1M', Menlo,Monaco,Consolas,Droid Sans Mono,Courier New,monospace;
  font-size: 14px;
  line-height: 19px;
}

markdown.stylesの設定

CSSの書き換えが終わったら、PreferenceからUser Settingsで以下のように指定してあげましょう。

// Place your settings in this file to overwrite the default settings
{
    "markdown.styles": [
    "C:\\Users\\<ユーザー名>\\markdown.css"
    ]
}

これで、「VSCodeの元のスタイル+一部だけ書き換えたスタイル」でmarkdownのプレビューが行えます。 他にも改変したいところがあればちょこちょこ手を入れていけば、自分好みのCSSを作り上げれると思います。

2016年の抱負的な

あけましておめでとうございます。 本年もよろしくお願いします。

2016年の抱負というか目標

今まであまりこういうのを書いてこなかったのですが、去年は子供も生まれたり転職して環境も変わったり(転職自体は2014年の秋だけど)で色々消化不良で終わってしまったことが多かったので、改めて目に見える形で書いておこうかなと思います。

本業方面じゃなくてプライベートな方面での目標

  • Python 3.5の学習
    • ちょっとした処理をPython 3.5で書く癖をつけるようにしてみる試み
    • PowerShellは仕事で使ってるのであえてプライベートではPythonを使うようにしてみる
  • Webサービスをなんか作って公開する
    • テクノロジーは未定(仕事で当面使いそうにないテクノロジで作りたい)
  • Scratchの機能を一通り学習
    • 将来的に子供向けのプログラミング講座的なものにつなげたい
  • 英語
    • 2015年は英語をさぼりまくったので…
    • 発音トレーニングを頑張る
    • TOEICを受験(目標は高く700点)

…すでに盛りすぎ感がありますがぼちぼちやってきたいと思います。

MSBuildのコマンドラインでプロパティとして接続文字列的な文字列を渡す

MSBuildコマンドラインから実行する際、/p:スイッチにより任意のプロパティに値を設定することができます。 https://msdn.microsoft.com/ja-jp/library/ms164311.aspx

これを利用して、接続文字列的な文字列を渡そうと思い少し試行錯誤したのでメモ。

プロパティに渡したい文字列の例としてはこんな感じ:

Data Source=(localdb)\ProjectsV12;Initial Catalog=MyDataBase;Integrated Security=True;Connect Timeout=30;Encrypt=False;

空白やらイコールやら円マークやら入ってるのでそのまま渡して大丈夫か不安になりますね。 安心してください、大丈夫じゃありません。

 

cmd編

コマンドプロンプト(cmd)から実行する場合は特に悩むことはないと思います。接続文字列全体を"(ダブルクォート)でクォートしてやれば良いですね。

C:\ > msbuild /t:myTask /p:myProerty="Data Source=(localdb)\ProjectsV12;Initial Catalog=MyDataBase;Integrated Security=True;Connect Timeout=30;Encrypt=False;"

 

PowerShell

こちらは悩みましたが(PowerShell力が足りない)、以下でうまくいきました

  • 接続文字列を"(ダブルクォート)でくくる
  • さらにその外側を'(シングルクォート)でくくる
  • 半角スペースを%20に置換する
PS > msbuild /t:myTask /p:myProerty='"Data%20Source=(localdb)\ProjectsV12;Initial%20Catalog=MyDataBase;Integrated%20Security=True;Connect%20Timeout=30;Encrypt=False;"'

参考:

stackoverflow.com

How to escape space in property in msbuild while executing thorugh cmd prompt

SSDTのあまり知られてない(かもしれない)機能『データ比較』ツールは便利

本エントリはVisual Studio / Visual Studio Code Advent Calendar 2015 14日目のエントリです

 

SQL Server Data Tools に含まれる「データ比較」ツール

SQL Server Data Tools(SSDT)に含まれる機能の一つに、『データ比較』ツール というものがあります。

SQL Server Data Tools自体がどんなものかは、ググっていただくか、以前中国地方DB勉強会でお話しさせていただいた際のこちらの資料を参照いただければと思います

docs.com

 

今回はこの『データ比較』ツール についてざっくりと紹介してみようと思います。

 

「データ比較」ツール とは

その名のとおり、複数のデータベーススキーマにある同一のテーブルのデータ同士を比較し、

  • 差分の検出
  • 差分をグラフィカルに表示
  • 差分を解消する更新を行うクリプトの生成
  • 差分を解消する更新の即時実行

等をシームレスに行うことができます

スクリーンショットとともに、少し例をお見せしたいと思います

 

データの準備

今回はSQL Server LocalDB上に、UserとBookの二つのテーブルを持ったデータベースを二つ用意します なお、Userのデータはなんちゃって個人情報で適当に生成したもので、BookのデータはAmazonのランキングから適当に引っ張ってきたものです

 

デーベースその1:SampleDb01_Develop

Userテーブル:

f:id:kiyokura:20151215002349p:plain

Bookテーブル:

f:id:kiyokura:20151215002408p:plain

 

デーベースその1:SampleDb01_Staging

Userテーブル:

f:id:kiyokura:20151215002425p:plain

Bookテーブル:

f:id:kiyokura:20151215002439p:plain

 

行数もカラム数も少ないのでかろうじて目diffできないこともない…ですが、まあやりたくないですよね

 

データ比較ツールの起動

データ比較ツールの起動方法はいくつかあるのですが、今回はSQL Server エクスプローラのDBを選択しコンテキストメニューから起動してみます。

f:id:kiyokura:20151215002503p:plain

 

データベースとオプションの選択

データ比較のダイアログが表示されます。前述の方法で起動すると、すでにソースデータベースは選択されているので、比較対象のデータベースを「ターゲットデータベース」側に選択します。 ドロップダウンに出てこない場合は「新しい接続」ボタンからダイアログを起動して設定します。なお、ソースデータベースとターゲットデータベースは、真ん中にある矢印のボタンで簡単に入れ替えることができます。

データ比較のオプションは、検出する比較する差分を選択します。不要なものは除外しておくほうがたぶん早くなるので、検出したい差分が明確な場合は(例えば「追加になったデータだけ検出したい」など)必要なもののみに絞るとよさそうです。

f:id:kiyokura:20151215002529p:plain

 

オブジェクトの選択

次に、比較するオブジェクトを選択します。それぞれのスキーマから検出された比較可能なテーブルとビューが一覧されますので、実際に比較をしたいオブジェクトを選択します。

f:id:kiyokura:20151215002550p:plain

 

比較結果の確認

しばらくすると(データの量などで時間は変わります)、結果ビューが表示されます。

今回の場合は以下のようになっています

  • Book → ターゲット内にのみにある行を検出
  • User → 同一キーだがデータが異なる行、ソース内のみにある行、ターゲット内のみにある行を検出

f:id:kiyokura:20151215002604p:plain

ここで、グリッドのそれぞれのセルを選択すると、詳細が下側のペインに表示されます。 例えば Userテーブルの「異なるレコード」 をクリックすると、こんな感じで交互にカラムを並べて差分のカラムを太文字で表示してくれます。これだと違いが分かりやすいですね。

f:id:kiyokura:20151215002702p:plain

それぞれ一方にしかない行の場合はそのまま差分の行が表示されます。

f:id:kiyokura:20151215002737p:plain

 

更新の実行またはスクリプトの生成

結果ビューのグリッドで最終的に「更新」にチェックが入ったものに対して、ターゲット側を更新するためのスクリプトを生成したり、そのまま更新を実行したりできます。

例えば先ほど結果を全チェックした状態で「スクリプトの生成」を実行すると、以下のようなSQLが生成されます。

/*
このスクリプトは 2015/12/15 の 0:08 に Visual Studio によって作成されました。
このスクリプトを (localdb)\v11.0.SampleDb01_Staging (XXX\xxxxx ) で実行すると、(localdb)\v11.0.SampleDb01_Develop (XXX\xxxxx) と同じにできます。
このスクリプトは次の順にアクションを実行します:
1. 外部キー制約を無効にします。
2. DELETE コマンドを実行します。
3. UPDATE コマンドを実行します。
4. INSERT コマンドを実行します。
5. 外部キー制約を再び有効にします。
このスクリプトを実行する前に、ターゲット データベースをバックアップしてください。
*/
SET NUMERIC_ROUNDABORT OFF
GO
SET XACT_ABORT , ANSI_PADDING , ANSI_WARNINGS , CONCAT_NULL_YIELDS_NULL , ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
/*テキストまたはイメージの更新に使用されるポインターです。これは不要である可能性がありますが、念のためここで宣言されています*/
DECLARE @pv binary (16)
BEGIN TRANSACTION
DELETE FROM [dbo].[User] WHERE [Id]= 10
DELETE FROM [dbo].[User] WHERE [Id]= 11
DELETE FROM [dbo].[Book] WHERE [Id]= 4
UPDATE [dbo]. [User] SET [Birthday] ='20150514' WHERE [Id]= 1
UPDATE [dbo]. [User] SET [Birthday] ='20151116' WHERE [Id]= 5
UPDATE [dbo]. [User] SET [Name] =N'黒川 佑' WHERE [Id]= 7
INSERT INTO [dbo].[User] ([Id], [Name] , [Birthday], [Email]) VALUES ( 2, N'奈良 希', '20150920', N'                nara_nozomi@example.com' )
INSERT INTO [dbo].[User] ([Id], [Name] , [Birthday], [Email]) VALUES ( 3, N'          岡田 光臣' , '20150928' , N'                okada_mitsuomi@example.com' )
INSERT INTO [dbo].[User] ([Id], [Name] , [Birthday], [Email]) VALUES ( 4, N'相武 美智子', '20150326', N'                aibu_michiko@example.com' )
COMMIT TRANSACTION

もしくは「ターゲットの更新」ボタンをクリックして実行することで、上記スクリプトを生成後即実行します。

 

まとめ

いかがでしょうか? 開発環境やステージング環境など同一のスキーマ構造のデータベース間でデータの差分を確認したり調整を行うことはちょくちょくあるのではないかと思います。そういった際には非常に便利なツールです。 またSSDTが持つ別の機能「スキーマ比較」と合わせて利用すると、複数の環境を管理する際にずいぶん楽ができるようになるのではなと思います。

このSSDTに関する機能、正直日本語での情報が多いとは言えません。 気になった方はぜひ触ってみて、blogなどで情報を発信してもらえると私がとても喜びますのでぜひよろしくお願いします。