読者です 読者をやめる 読者になる 読者になる

都内で働くSEの技術的なひとりごと

都内でサラリーマンやってます。マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。よろしくお願いします♪

Microsoft Flow とそのスマフォアプリを試してみる

 週末はいい天気になりました。昨日は一日運動会でグッタリ、今日は朝から子供の習い事の送迎係です(笑)。お迎えまで少し時間があるので、待ち時間に Microsoft Flow を試してみました。
flow.microsoft.com

 どのようなものか把握していないので、早速お試ししてみました。Microsoft Flow のスマフォアプリでボタンをクリックすると、その時間をエクセルに記録し、スマフォアプリに通知するといった動作をします。
flow.microsoft.com

 早速試してみましょう。

  • テンプレートを選択し、続行をクリックします。
    f:id:koogucc11:20170521105034p:plain
  • エクセルでテーブルを作成します。ここでは、OperatingTime というテーブル名を付けています。
    f:id:koogucc11:20170521112927p:plain
  • OneDrive にアップロードします。場所は適当でかまいません。
    f:id:koogucc11:20170521105415p:plain
  • OneDrive にアップロードしたエクセルファイルとそのテーブル名を指定します。
    f:id:koogucc11:20170521105555p:plain
  • テーブルに対して、型を指定します。
    f:id:koogucc11:20170521105915p:plain
  • 通知の設定を行い、完了をクリックします。
    f:id:koogucc11:20170521111145p:plain
  • スマフォアプリで、『稼働時間を追跡する』をクリックします。f:id:koogucc11:20170521110316p:plain
  • 2,3秒で処理の完了が通知されます。
    f:id:koogucc11:20170521110430p:plain
  • エクセルに記録されたかを Excel Online で参照します。きちんと記録されていますね。
    f:id:koogucc11:20170521111203p:plain

 そろそろ、お迎えの時間です。いいサービスですね。様々な WebAPI など結びつけることで、面白いサービスが構築できそうですね。構築するのに大した時間もかかりませんし、お手軽です。まさにクラウドといったサービスの一つですね! ( このようなサービスが欲しいんですよね。レガシーがどうとか、どうでもいいのです。パブリッククラウドで競争するなら、このようなサービスを追加しないと無理なので。(独り言) ) さて、お迎えに行ってきます!

Microsoft Flow のドキュメントはこちらです。

そろそろキャンプシーズン。新たなアイテムを買おう。ワゴンの種類多いなぁ。迷うわ。

コールマン アウトドアワゴン 2000021989

コールマン アウトドアワゴン 2000021989

Microsoft Azure のスマフォアプリを使ってみる

 Microsoft Azure への接続には、通常ポータルを使用しますが、仮想サーバを電車に乗っているときに起動するには操作が少し大変です。
f:id:koogucc11:20170520184847p:plain

 そこで電車の中でも難なく Azure の操作をすることができるのが、Microsoft Azure アプリです。
play.google.com
f:id:koogucc11:20170520184138p:plain

 マイクロソフトアカウントでログインします。
f:id:koogucc11:20170520185225p:plain

 パスワードを入力します。
f:id:koogucc11:20170520185327p:plain

 二要素認証でアカウントを保護してますよね?
f:id:koogucc11:20170520185442p:plain

 アカウント、サブスクリプションの情報が参照できます。 
f:id:koogucc11:20170520191335p:plain

 すべてのリソースが表示されます。え?これ使いにくいわ...
f:id:koogucc11:20170520185825p:plain

 カテゴリ別に参照できます。そりゃ当然か。
f:id:koogucc11:20170520191518p:plain

 通知情報も参照できます。
f:id:koogucc11:20170520191757p:plain

 Cloud Shell!! これは使ってみたい!
f:id:koogucc11:20170520191917p:plain

 仮想マシンを起動してみましょう。仮想マシンを選択し、Start をクリックします。
f:id:koogucc11:20170520192115p:plain

 起動できました。Connect をクリックすることで仮想マシンに接続することができます。
f:id:koogucc11:20170520192322p:plain

 Remote Desktop もインストールしておきましょう。
f:id:koogucc11:20170520192441p:plain

 確認画面が表示されます。
f:id:koogucc11:20170520192707p:plain
 
 User Name と Password を入力し、Connect をクリックしましょう。
f:id:koogucc11:20170520192822p:plain

 接続できました。
f:id:koogucc11:20170520193030p:plain

 デバイス別に最適化されたツールが整備されているのは素晴らしいですね。

土曜日の夜に仕事するのやだなぁと思って、気晴らしついてでに MSSQL Tiger Team の SQL Server 2017 Showplan enhancements を確認してみた

 SQL Server 2017 で実行プランの機能追加がありました。
blogs.msdn.microsoft.com

 早速、SQL Server 2017 で下記のクエリを実行してみましょう。

SELECT
    soh.*,
    sod.*
FROM
    Sales.SalesOrderHeader soh
    INNER JOIN
        Sales.SalesOrderDetail sod
    ON  sod.SalesOrderID = soh.SalesOrderID
WHERE
    CustomerID = 29565

f:id:koogucc11:20170513222920p:plain

 プリパティからオプティマイザが使用している統計の情報が参照できるようになっています。
f:id:koogucc11:20170513223300p:plain

<optimizerstatsusage>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderHeader]" statistics="[PK_SalesOrderHeader_SalesOrderID]" modificationcount="0" samplingpercent="100" la14-07-17t16:11:30.67="La14-07-17T16:11:30.67">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderDetail]" statistics="[_WA_Sys_00000002_44CA3770]" modificationcount="0" samplingpercent="68.2155" lastu05-13t20:28:34.77="LastU05-13T20:28:34.77">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderHeader]" statistics="[IX_SalesOrderHeader_CustomerID]" modificationcount="0" samplingpercent="100" last-07-17t16:11:32.41="Last-07-17T16:11:32.41">
    </statisticsinfo>
    <statisticsinfo database="[AdventureWorks]" schema="[Sales]" table="[SalesOrderDetail]" statistics="[PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID]" modificationcount="0" sampl67.8454="Sampl67.8454">
    </statisticsinfo>
</optimizerstatsusage>

 クエリが予想したパフォーマンスが出ていない、インデックスを使用していないときに統計情報の最終更新時間が古すぎるとか、サンプリングが低すぎるなどが起因していることはよくあることです。実行プランに使用統計の情報が出るだけでも、パフォーマン調査の効率が上がりそうですね。それ以外にも、CPU Time や WaitStats の情報も出力されます。
f:id:koogucc11:20170513224157p:plain

<waitstats>
    <wait waittype="PAGEIOLATCH_SH" waittimems="9" waitcount="26">
    </wait>
</waitstats>
<querytimestats cputime="2" elapsedtime="11">
</querytimestats>

 これは非常に助かる、いい機能追加ですね。

なんとなく、タバスコ全種類買ってみたくなった。

Resumable Online Index Rebuild is in public preview for SQL Server 2017 CTP 2.0 をお試してみた

 何か目に違和感 ( 痛いわけではない ) を感じてしまい、朝早く起きたので....記事書きます(笑)。

 CTP2.0 ( SQL Server 2017 ) で Resumable Online Index Rebuild という大規模データベースを運用する上で非常に便利な機能が搭載されました。
blogs.technet.microsoft.com

 Resumable Online Index Rebuild は下記のシナリオで使われることを想定しています。

 索引の再構築が失敗した後で、索引の再作成操作を再開することができます。これにより、大きな表のインデックスをリビルドするときに時間を削減することが可能ですね。

  • Resume an index rebuild operation after an index rebuild failure, such as after a database failover or after running out of disk space. There is no need to restart the operation from the beginning. This can save a significant amount of time when rebuilding indexes for large tables.

 進行中のインデックスリビルドを一時停止し、後で再開できます。リソースを大きく使用するバッチなどと競合しないように一時停止および再開ができますね。

  • Pause an ongoing index rebuild operation and resume it later. For example, you may need to temporarily free up system resources to execute a high priority task or you may have a single maintenance window that is too short to complete the operation for a large index. Instead of aborting the index rebuild process, you can pause the index rebuild operation and resume it later without losing prior progress.

 大量のログスペースを使用することなく、大規模なインデックスを再構築し、他のメンテナンス作業をブロックするロングトランザクションを使用します ( これいいのかな? )。これにより、ログの繰り越し、長時間実行されるインデックスリビルドでエラーを回避可能です。※うーん、このあたりはもっと調査する必要がありそうだなぁ。英語力がないだけなのか....

  • Rebuild large indexes without using a lot of log space and have a long-running transaction that blocks other maintenance activities. This helps log truncation and avoid out-of-log errors that are possible for long-running index rebuild operations.

 それでは、実際に試してみましょう。SQL Server 2017 向けの ALTER INDEX (Transact-SQL) | Microsoft Docs 構文を参照してみます。見慣れないオプションが増えてますね。

ALTER INDEX { index_name | ALL } ON <object>  
{  
      REBUILD {  
            [ PARTITION = ALL ] [ WITH ( <rebuild_index_option> [ ,...n ] ) ]   
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> ) [ ,...n ] ]  
      }  
    | DISABLE  
    | REORGANIZE  [ PARTITION = partition_number ] [ WITH ( <reorganize_option>  ) ]  
    | SET ( <set_index_option> [ ,...n ] )   
    | RESUME [WITH (<resumable_index_options>,[…n])]
    | PAUSE
    | ABORT
}  
[ ; ]  

<object> ::=   
{  
    [ database_name. [ schema_name ] . | schema_name. ]   
    table_or_view_name  
}  

<rebuild_index_option > ::=  
{  
      PAD_INDEX = { ON | OFF }  
    | FILLFACTOR = fillfactor   
    | SORT_IN_TEMPDB = { ON | OFF }  
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | STATISTICS_INCREMENTAL = { ON | OFF }  
    | ONLINE = {   
          ON [ ( <low_priority_lock_wait> ) ]   
        | OFF } 
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | COMPRESSION_DELAY = {0 | delay [Minutes]}  
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE }   
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]  
}  

<single_partition_rebuild_index_option> ::=  
{  
      SORT_IN_TEMPDB = { ON | OFF }  
    | MAXDOP = max_degree_of_parallelism  
    | RESUMABLE = { ON | OFF } 
    | MAX_DURATION = <time> [MINUTES}     
    | DATA_COMPRESSION = { NONE | ROW | PAGE | COLUMNSTORE | COLUMNSTORE_ARCHIVE} }  
    | ONLINE = { ON [ ( <low_priority_lock_wait> ) ] | OFF }  
}  

<reorganize_option>::=  
{  
       LOB_COMPACTION = { ON | OFF }  
    |  COMPRESS_ALL_ROW_GROUPS =  { ON | OFF}  
}  

<set_index_option>::=  
{  
      ALLOW_ROW_LOCKS = { ON | OFF }  
    | ALLOW_PAGE_LOCKS = { ON | OFF }  
    | IGNORE_DUP_KEY = { ON | OFF }  
    | STATISTICS_NORECOMPUTE = { ON | OFF }  
    | COMPRESSION_DELAY= {0 | delay [Minutes]}  
}  

<resumable_index_option> ::=
 { 
    MAXDOP = max_degree_of_parallelism
    | MAX_DURATION =<time> [MINUTES]
    | <low_priority_lock_wait>  
 }

<low_priority_lock_wait>::=  
{  
    WAIT_AT_LOW_PRIORITY ( MAX_DURATION = <time> [ MINUTES ] ,   
                          ABORT_AFTER_WAIT = { NONE | SELF | BLOCKERS } )  
}  
Copy
Code
-- Syntax for SQL Data Warehouse and Parallel Data Warehouse  

ALTER INDEX { index_name | ALL }  
    ON   [ schema_name. ] table_name  
{  
      REBUILD {  
            [ PARTITION = ALL [ WITH ( <rebuild_index_option> ) ] ] 
          | [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> )] ] 
      }  
    | DISABLE  
    | REORGANIZE [ PARTITION = partition_number ]  
}  
[;]  

<rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
        [ ON PARTITIONS ( {<partition_number> [ TO <partition_number>] } [ , ...n ] ) ]   
}

<single_partition_rebuild_index_option > ::=   
{  
    DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }  
}

 それでは、インデックスリビルド中に一度処理を停止し、再開するまでの動作を確認してみましょう。下記のクエリは、インデックスリビルドが実行中であれば、停止するといったものです。Resumable Online Index Rebuild の状態を確認するには、sys.index_resumable_operations (Transact-SQL) | Microsoft Docsを使用します。

DECLARE @state INT
SET @state = 0

-- ステータスが 0 の間はループする。
WHILE (@state = 0) 
BEGIN
    -- 処理中のリビルド処理が存在したら、リビルド処理を PAUSE する。
    IF (SELECT Count(state) FROM sys.index_resumable_operations WHERE state = 0) > 0
    BEGIN
        -- 0.5 秒待機する。(すぐ PAUSE してしまうと、sys.index_resumable_operations 結果を見ても処理が進んでいる感を見ることができないため。)
        WAITFOR DELAY '00:00:00.500'
		-- インデックスリビルド処理を PAUSE する。
        ALTER INDEX PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
        ON  Sales.SalesOrderDetail PAUSE;
		-- ステータスを 1 にし、ループを終了させる。
        SET @state = 1
    END
END

f:id:koogucc11:20170428074257p:plain

 次に、下記の DDL 文を SQL Server Management Studio で実行しましょう。実行後すぐに DDL の処理が停止されます。

ALTER INDEX PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
ON  Sales.SalesOrderDetail REBUILD WITH(
        ONLINE = ON, MAXDOP = 1, RESUMABLE = ON, MAX_DURATION = 5
);

f:id:koogucc11:20170428074540p:plain

※RESUMABLE は REBUILD 処理を再開可能にするかのオプションです。ON の場合は、ONLINE = ON が必須となります。,  MAX_DURATION は REBUILD 処理を最大何分間実行するかを指定します。0 分より大きく、1 週間以下( 7 x 24 x 60 = 10080 分 )とする必要があります。上記の DDL 文の場合は、最大で リビルド処理を 5 分間実行し、完了しない場合は自動的に途中の状態で待機します。

 インデックスリビルド処理がどのような状態か確認します。下記のクエリを SQL Server Management Studio で実行しましょう。

SELECT  
    * 
FROM 
    sys.index_resumable_operations 

 先ほど実行した ALTER 文がサスペンドされているのが判断できます。
f:id:koogucc11:20170428074751p:plain

f:id:koogucc11:20170428074801p:plain

 再度、下記のクエリを実行させます。

DECLARE @state INT
SET @state = 0

-- ステータスが 0 の間はループする。
WHILE (@state = 0) 
BEGIN
    -- 処理中のリビルド処理が存在したら、リビルド処理を PAUSE する。
    IF (SELECT Count(state) FROM sys.index_resumable_operations WHERE state = 0) > 0
    BEGIN
        -- 0.5 秒待機する。(すぐ PAUSE してしまうと、sys.index_resumable_operations 結果を見ても処理が進んでいる感を見ることができないため。)
        WAITFOR DELAY '00:00:00.500'
		-- インデックスリビルド処理を PAUSE する。
        ALTER INDEX PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
        ON  Sales.SalesOrderDetail PAUSE;
		-- ステータスを 1 にし、ループを終了させる。
        SET @state = 1
    END
END

f:id:koogucc11:20170428074917p:plain

 リビルド処理を再開させる場合は、下記のクエリを SQL Server Management Studio で実行します。

ALTER INDEX [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] 
ON [Sales].[SalesOrderDetail] RESUME WITH(MAXDOP = 4);

f:id:koogucc11:20170428075027p:plain

 上記の DDL 文の処理が中断されたら、下記のクエリを実行してみましょう。リビルドが停止され、MAXDOP が 1 → 4 に変更されたのことが判断できます。RESUME 時にもオプションが変更できることがわかりますね。

SELECT  
    * 
FROM 
    sys.index_resumable_operations 

f:id:koogucc11:20170428075124p:plain

 最後に下記のクエリを実行することで、リビルド処理を完了させることができます。

ALTER INDEX [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] 
ON [Sales].[SalesOrderDetail] RESUME;

f:id:koogucc11:20170428075221p:plain

 下記のクエリを SQL Server Management Studio で実行してみましょう。sys.index_resumable_operations に処理中のレコードも存在しないことが判断できますね。

SELECT  
    * 
FROM 
    sys.index_resumable_operations 

f:id:koogucc11:20170428075354p:plain

 インデックスリビルドの中断→再開時にオプションの変更→再度中断→再開までの動作が理解できたかと思います。今まで難しかった巨大なインデックスのリビルド運用も、Resumable Online Index の機能 ( RESUME,PAUSE および sys.index_resumable_operations ) をうまく使用することで運用も無理なく行うこと ( 朝になってもリビルドが終わってないとか... ) ができそうですね。個人的には Resumable Statistics Update みたいな機能もほしいです...

 アデノウィルスによる結膜炎はほぼ完治したようです。このような病気にならないように免疫力をあげないといけないですね。免疫力アップには...

 などがいいようです。もういい歳だし、考えないとなぁ。

Microsoft To-Do を使ってみた

 先週木曜日に発症したわけですが、右目は徐々に回復してきました。
ryuchan.hatenablog.com

 しかし、左目はまだまだ使いもになりません。どんなものなのか日本眼科学会のアデノウイルス結膜炎院内感染対策ガイドラインを参照しました。
日本眼科学会:アデノウイルス結膜炎院内感染対策ガイドライン

 たしかに、軽く考えてました。すいません。それ以外に病棟で感染患者が出た場合などの記載がありますが、その場合病院にとって危機的な状況になるんですね。勉強不足でした!

 アデノウイルスはよく知られた病原体であり、アデノウイルス結膜炎はありふれた疾患であるため軽視されがちであり、院内感染が発生して初めてことの重大さに気付いているのが現状である。

 さて、最近 Microsoft To-Do というツールがリリースされました。
f:id:koogucc11:20170422180518p:plain

 使用するにはマイクロソフトアカウントが必要です。
f:id:koogucc11:20170422180923p:plain

 マイクロソフトアカウントの ID を入力するとパスワードが求められます。
f:id:koogucc11:20170422181108p:plain

 2段階認証を設定していれば、承認が Microsoft Authenticator から要求されます。(もちろんマイクロソフトアカウントは2段階認証で保護してますよね?)
f:id:koogucc11:20170422181217p:plain
 
 Microsoft To-Do の初期画面が表示されます。
f:id:koogucc11:20170422181453p:plain
 
 To-Do のカテゴリなども設定できます。
f:id:koogucc11:20170422181812p:plain

 設定したカテゴリの画面です。
f:id:koogucc11:20170422181848p:plain

 背景画像も設定できます。お、シアトルのスペースニードルと Mt.Rainer ですね。
f:id:koogucc11:20170422182013p:plain

 それでは、早速 To-Do を設定します。プライベートのカテゴリを作成します。
f:id:koogucc11:20170422182235p:plain

 通院の To-Do を追加します。
f:id:koogucc11:20170422182247p:plain

 通院のアイテムをクリックします。
f:id:koogucc11:20170422182303p:plain

 日付を設定します。
f:id:koogucc11:20170422182317p:plain

 通知する日付および時間を設定します。
f:id:koogucc11:20170422182336p:plain

 通知する日付を設定します。
f:id:koogucc11:20170422182351p:plain

 通知する時間を設定します。
f:id:koogucc11:20170422182400p:plain

 これで設定が完了しました。
f:id:koogucc11:20170422182411p:plain

 まだまだ完治までには時間がかかりそうです。本日も通院しましたが、結膜炎に加えて偽膜が発生しており、それに伴い角膜炎まで併発していました(泣)。診察で一番嫌なのが偽膜除去です。偽膜を剥がすため、綿棒のようなもので眼球の表面をゴリゴリします。激痛すぎて叫びそうになります(´;ω;`)。結膜炎に罹って、あらためて目は大切しないといけないと強く思ったのでした。

 はやり目にはこの二つの市販薬がいいらしい。

【第2類医薬品】ロート抗菌目薬EX 10mL

【第2類医薬品】ロート抗菌目薬EX 10mL

【第2類医薬品】サンテ抗菌新目薬 12mL

【第2類医薬品】サンテ抗菌新目薬 12mL

 この辺の目薬を買ってみよう。

【第2類医薬品】サンテ ボーティエ 12mL

【第2類医薬品】サンテ ボーティエ 12mL

【第2類医薬品】サンテPC 12mL

【第2類医薬品】サンテPC 12mL

【第2類医薬品】サンテメディカル10 12mL

【第2類医薬品】サンテメディカル10 12mL