Jack of all trades

master of none. 多芸は無芸を地で行く、自作自演何でも屋。

Visual Studio Dev Essentialsの特典が解放されました

ようやく来ましたね。月額25$のAzureクレジット(だけじゃないけど)

sadynitro.hatenablog.jp

↑の記事を書いた時には未だComing soon状態だったVisual Studio Dev Essentialsの特典が解放されました。 やはり注目は月額25$のAzureクレジット(サインアップから12ヶ月間)*1ですね。 此度はこの特典を実際に使えるようにサインアップする(Activate)ところまでやってみたいと思います。

Visual Studio Dev EssentialsのHome画面を確認すると新たに解放された特典を確認できます。 Azureの月額クレジットだけでなく、Universal Windows Platform VMMicrosoft R Server Developer Edition、Xamarin University Mobile Trainingなどがいつの間にか利用可能になっています。 *2
f:id:sadynitro:20160205212411p:plain

Azureの月額クレジットのパネルで「Activate」をクリックすると特典のサブスクリプションでサインアップするページに飛びます。
f:id:sadynitro:20160205213236p:plain

ここから先は通常と変わらないAzureのサインアップ画面なので、順番に情報を入力して進めていきます。
まず個人情報を入力。
f:id:sadynitro:20160205213044p:plain

電話 or テキストメッセージでコードを取得し、認証。
f:id:sadynitro:20160205213052p:plain

残念ながら!残念ながら!(大事な事なので2回言いまs)支払情報の入力も通常のサインアップと同様です。 学生の方はDream Sparkを利用したらいいと思うので、個人開発者の方は諦めてカード情報を入力しましょう。
f:id:sadynitro:20160205213057p:plain

カード情報を入力できたら、契約やら何やらに関する声明に同意のチェックを入れて「サインアップ」をクリックします。
f:id:sadynitro:20160205213103p:plain

準備中の画面。
f:id:sadynitro:20160205213111p:plain

準備完了後にサブスクリプションページに移動したところ。「開発者プログラム特典」という名称のサブスクリプションが登録されています。 f:id:sadynitro:20160205213120p:plain

サブスクリプション名をクリックして詳細を開くとちゃんと3000円分のクレジットが付与されていることを確認できました。 f:id:sadynitro:20160205213128p:plain

以上、待望の特典解放についてご紹介しました。無償評価版(1ヶ月)と比べて、ハンズオン形式の勉強会等でも利用しやすいと思います。*3 皆様ゼヒご活用いただければと思います。

*1:MSDN特典と同じく開発、テスト目的で使用する為に提供されています。3000円分なのでやらないとは思いますが本番環境用途では使用されませんように。保証されませんしね。

*2:個人的にはMicrosoft R Serverの検証をしたいところですね。

*3:1ヶ月分だとハンズオンで意識が高まっても、その後に本格的な実験や検証ができないケースが見受けられたので…

Visual Studio Team ServicesのPull Requestに関する最近の追加機能

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

qiita.com

まずはお詫びから…。実際の担当日からかなりの日数経過してしまいました…。 担当日の夜中から体調不良を起こしており、色々検査に回された結果、軽い胆嚢炎の模様です…。*1

とりあえず、何とか書き物をする気力を持ち直してきたので本記事書きあげて投稿致します。

昨年は「Visual Studio OnlineでPull Request駆動開発」という記事でアドベントカレンダーに参加させていただきました。

sadynitro.hatenablog.jp

今年は名称も新たに「Visual Studio Team Services(VSTS)」となった本サービスのPull Request機能に注目して、最近追加された幾つかの機能をピックアップしてご紹介します。 昨年のアドベントカレンダー時点よりさらに便利にPull Request駆動開発ができること請け合いです。*2

1. Home画面のPull Requestウィジェット

最近一新されたHome画面(ダッシュボード)でPull Requestのウィジェットを追加することができます。

f:id:sadynitro:20151219000530p:plain

設定の画面でブランチやアサインの向き先を選択できます。

f:id:sadynitro:20151219002651p:plain

設定した内容に従ってアクティブなPull Requestが一覧で表示されます。

f:id:sadynitro:20151219000602p:plain

2. Pull Request一覧画面の追加機能

Pull Request一覧画面を開くと、最上段に直近の変更があったブランチ名と「Create Pull Request」ボタンが表示されます。

f:id:sadynitro:20151219000611p:plain

このボタンをクリックすると、直近の変更があったブランチをデフォルトブランチ(規定ではmaster)にマージする設定が入った Pull Request作成画面に飛ぶことができます。

f:id:sadynitro:20151219000615p:plain

また、Pull Request一覧画面の情報量が増え、かなり見やすくなりました。

Pull Requestのステータス表示や対象のソースブランチとターゲットブランチの表示、レビュアーをアイコン表示(レビュアーの付けた評価もアイコンで表示!)さらにPull Requestにつけられたコメントの数など、この一画面で大体の状況を把握できるようになりました。

f:id:sadynitro:20151219004529p:plain

3. Pull Request詳細画面の追加機能

Pull Requestの詳細画面で、右のサイドバー領域にコミットにリンクされたワークアイテム(タスクなど)が一覧表示されるようになりました。

f:id:sadynitro:20151219000830p:plain

4. Visual Studio 2015 Update1のチームエクスプローラ

おまけとして、最近リリースされたVisual Studio 2015のUpdate 1で追加されたPull Request関連の機能をご紹介します。

「プル要求」という何とも微妙な日本語訳のメニューが新たに追加され、ここからPull Requestを作成することができるようになりました。

f:id:sadynitro:20151219000842p:plain

「新しいプル要求」をクリックするとPull Request作成画面が開くので、ソースブランチとターゲットブランチを選択、Pull Requestのタイトルと内容を入力してPull Requestを作成します。 「ブラウザーで開く」にチェックを入れておくと、作成したPull RequestをVSTSの画面で開きます。*3

f:id:sadynitro:20151219000846p:plain

また「プル要求」の画面では、アクティブなPull Requestを一覧で表示してくれます。

f:id:sadynitro:20151219000856p:plain

まとめ

以上、VSTSのPull Requestに関する最近の追加機能についてご紹介しました。Marketplaceからインストール可能なExtentionも登場し、これからさらに便利になるであろうVSTSを是非お試しいただければと思います。

(そして、改めてお詫びを…穴をあけてしまって申し訳ない…。)

*1:担当日当日に急に上腹部が痛み出して、夜中に救急送りになり、痛み止めで凌いでいたもののどうにも良くならないので再度外来受診したら胆嚢炎の診断…。年の瀬に何たるアンラッキー…。

*2:そうでもなかったらすみません…。

*3:あれ?レビュアーの設定は…?ブラウザーで開いた後に設定するしかない…?

Azure Machine Learning できるとこまでやってみよう Vol.4

↓同シリーズの過去記事

Azure Machine Learning できるとこまでやってみよう Vol.1 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.1.5 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.2 - Jack of all trades
Azure Machine Learning できるとこまでやってみよう Vol.3 - Jack of all trades

本エントリーはMicrosoft Azure Advent Calendar 2015の13日目です。

qiita.com

Vol.3からかなり期間が空いてしまい既に忘却の彼方ですが、Vol.4ではテキスト解析的なことをやってみます。

実現したいこと

適当なテキスト(ベタなところでTwitter上のツイートとか)にポジティブorネガティブのラベルを付加したデータを学習させて、入力したテキストに対してネガティブorポジティブを返すというフィルタ的なものを作成したいと思います。

実装

1. データの準備

任意のテキストに対して、その内容がネガティブかポジティブかを判定できるように学習させたいので、テキスト列(text)と評価列(value)を持ったCSVファイルを作成しました。
テキスト列についてはとりあえず評価しやすそうな文章をTwitterから拾ってきて、それらに手動で評価列をnegativeかpositiveで付加しています。
今回使用するモジュールの特性上(というかテキスト解析の場合ほぼそうなのですが)テキスト列には元の文章を分かち書きしたものが入っています。*1ちなみに分かち書きにはMeCabを使用しています。

f:id:sadynitro:20151212230225p:plain

準備したCSVファイルをこれまでの記事でやったのと同様、MLStudio上にアップロードしてDatasetとして保存します。

f:id:sadynitro:20151212230242p:plain

f:id:sadynitro:20151213113926p:plain

2. データの読み込み

まずは新しいExperimentを作成します。

f:id:sadynitro:20151212230312p:plain

Experimentの編集画面で「Saved Datasets」→「My Datasets」の中から、アップロードしたDatasetを選択、配置します。

f:id:sadynitro:20151213114005p:plain

f:id:sadynitro:20151212230328p:plain

3. Feature Hashing

Azure MLで使用可能な分類、予測等の学習アルゴリズムは基本的に説明変数として数値しか扱うことができません。 このままでは分かち書きしたテキストを説明変数、ネガポジの判定を目的変数にして学習させてもテキストが変な数値に置き換わって意味のない学習になるか 最悪エラーで学習が実行できないか、まぁそんなことになってしまいます。

そこでまずFeature Hashingというモジュールを使用して、分かち書きしたテキストをハッシュ化(ベクトル化)します。

Feature Hashingとは…については、先人たちのお知恵をWebの世界で探索していただければと思うのですが、ザックリいうと、その文書がどういった特徴で構成されているかを0 or 1の行列で表現するように変換する手法です。 例えば、テキストxに対してv[hoge]=0であればテキストxはhogeという特徴が含まれていない、逆にv[hoge]=1であれば含まれている、といった表現になります。

Feature Hashing - Wikipedia

Feature HashingモジュールはText Analyticsの中にあるので、これを選択・配置します。

f:id:sadynitro:20151213114048p:plain

f:id:sadynitro:20151212230353p:plain

適用する列はもちろんtextにします。

f:id:sadynitro:20151212230422p:plain

Feature Hashingのプロパティには対象列の選択以外に「Hashing bitsize」と「N-grams」を設定します。 Hashing bitsizeはハッシュ化後のベクトルの長さを設定します。N-gramsは平たく言うと文書中の文字をいくつまでまとめて判断するかという数値を設定します。 「私は田中一郎です」という文章を対象とした場合、N=2で設定すると

  • 私は
  • は田
  • 田中
  • 中一
  • 一郎
  • 郎で
  • です

という感じで文書を解析していきます。

全文検索 - Wikipedia

とりあえず今回は以下のような設定で実行してみます。本来はこのハッシュ化が学習に大きく影響するのでもっと真面目にチューニングすべきところかと思います。

f:id:sadynitro:20151212230449p:plain

ハッシュ化されてしまえば、textは不要なので、「Project Columns」モジュールで得られたハッシュ(ベクトル)とネガポジ判定(value)の列だけを選択します。

f:id:sadynitro:20151212230547p:plain

ハッシュ化して列を取捨選択した後のデータセットの中身を見てみるとこんな感じです。0ばかり並んでますが、ベクトルの後ろの方にはちゃんと幾つかの1が入ってます。

f:id:sadynitro:20151212230528p:plain

4. 学習モデルの構築

これで学習データの準備が整ったので、あとは毎度おなじみ「Split Data」でデータを学習用と評価用に分割して学習アルゴリズムと評価のモジュールを接続していくだけです。

f:id:sadynitro:20151212230609p:plain

今回は0.8で設定(全データ中80%を学習データ、20%を評価用データに振り分ける)

f:id:sadynitro:20151212230615p:plain

学習アルゴリズムとして「Two-Class Bayes point machine」を選択しました。2種類の分類フィルターといえばベイジアン…的な思い込みで選択しています。 これも本来はきちんと適用ケースに応じてアルゴリズムを選択、チューニングすべきところかと思います。

f:id:sadynitro:20151212230642p:plain

Labelにはもちろんvalueを選択。

f:id:sadynitro:20151212230711p:plain

「Two-Class Bayes point machine」モジュールのプロパティはこんな感じ。Iteration回数を変えるだけでも学習の結果が少し変わってくると思います。

f:id:sadynitro:20151212230716p:plain

5. 学習の実行

最後に評価のための「Score Model」モジュールを接続して、さらに評価結果を見やすくするために「Project Columns」モジュールで必要な列のみ取り出すようにします。

f:id:sadynitro:20151212230741p:plain

f:id:sadynitro:20151212230753p:plain

ここまで設定できたら、下のメニューにある「RUN」をクリックして学習を実行します。

f:id:sadynitro:20151213114146p:plain

6. 評価

学習の実行が完了したら、一番下に接続した「Project Column」モジュールの下○をクリックして、開いたメニューから「Visualize」を選択します。

f:id:sadynitro:20151213114157p:plain

「value」が実際の判定、「Scored Labels」が学習済みモデルが出力した判定です。

…精度が低い…正解率およそ70%…。

要は二択なので、適当に出力しても正解率は50%程度になるはず、と考えるともう少し精度が欲しいですね。

f:id:sadynitro:20151212230821p:plain

7. 改善のアイデア

学習の精度を上げるアイデアは幾つかあります。

ここまでに何度か言い訳のように「もう少し真面目に~」「もう少しきちんと~」と書いていた部分があるかと思いますが、そのあたりを改善するだけである程度効果があると考えています。 以下に改善すべきポイントを箇条書きします。

  • 学習データをクリーニングする。今回もできるだけネガティブ、ポジティブの感情がわかりやすいテキストをチョイスしているが、できるだけ特徴量が抽出しやすいデータを準備する。
  • 学習データの量を増やす。今回はたったの100件強のデータしか用意できなかった。本来テキストから特徴量を抽出してフィルタを作成しようと思うとデータが圧倒的に足りていない。*2
  • Azure ML上における「Feature Hashing」モジュールの特性をもう少しちゃんと理解してチューニングする。与えるテキストのエンコードやパラメータの設定によって学習に影響があると考えられる。
  • 学習アルゴリズムのパラメータを適切に設定する。これに関しては実際に実行してみながら、実験ベースでチューニングするしかないと思います。
  • 学習アルゴリズムとしてより適切なものを探す。各アルゴリズムに対して一般的に言われている「○○に強い」などの特徴を参考に、これも基本的には実験ベースで確認するしかないと思います。

まとめ

本記事では、Azure ML上でテキスト解析を行い、ネガポジ判定をする学習フィルタを構築する方法を説明しました。

因みに、学習の精度を上げるアイデアについても幾つか記述しましたが、それらを全部施したからといって思わしい精度まで向上する保証はありません。 さらにいうと、ここでの評価で精度が高かったからといって、全ての文書に対して同様の精度が得られるとも限りません。 さすがに厳密な精度を求められるシステムにおいては、綿密なチューニングともう少し複雑なモデルの構築が求められるでしょう。

しかしながら、上述のような簡単な操作で、お手軽にテキスト分類をしてくれる学習フィルタを構築できると考えると、やはりAzure ML恐るべしと言わざるを得ません。

ということで以上です。明日のMicrosoft Azure Advent Calendar 2015 14日目はtksarahさんです。よろしくどうぞ。

*1:なぜ分かち書きが必要かというと、日本語のように全ての単語が区切られることなくベタで書かれていて読み手がよしなに判断する言語というのは、まず形態素解析して分割(分かち書き)する必要があるわけです。逆に英語をはじめとするラテン言語等は全ての単語が必ずスペースによって区切られているため、この手間をかけることなくテキストの解析手法を適用することができます。

*2:様々な種類の文書に対してある程度の精度(汎用性)が欲しいという場合は特にデータの質と量が重要かと思います

Windows Phone8.1アプリでSQLiteを扱う

本エントリはWindows Phone / Windows 10 Mobile Advent Calendar 2015の10日目です。

www.adventar.org

今年のハイライトは何と言ってもMADOSMAの発売による国内Windows Phone端末の復活と、それを皮切りに始まったWindows 10 Mobile端末の開発発表ラッシュですね。 既に発売された端末も幾つかありますし、来年は本格的にWindows 10 Mobileが盛り上がる予感が高まってきました。

かく言う私も国内Windows Phone 8.1端末発売記念におでさん(@od_10z)主催で開催された「おでコン」なるアプリコンテストに memotchというアプリで参加させていただきました。詳細は以下の記事を参照。

Windows Phoneアプリ作りました - Jack of all trades
おでコンで入賞しました - Jack of all trades

このmemotchではActionを選択するタイルやタスクメモのデータ保存にSQLiteを使用しています。
ローカルに気軽に保存とはいえテキストで保存するのも味気ないので、何かしらDBに保存することを考えていたのですが、 残念ながらSQL Server Compactがオワコンの様なのでSQLiteを選択しました。 幸い.NETかつWindows Phone 8.1でSQLiteを扱う拡張機能やライブラリが一揃いしていたので、安心して利用することができました。 ということで、実際に使用した拡張機能やライブラリの紹介と簡単な使用方法についてまとめてみます。

1. SQLite for Windows Phone 8.1

何はなくとも、まずはこれを入れる必要があります。Windows Phone 8.1でSQLiteを扱うためのコンポーネント一式が含まれています。

visualstudiogallery.msdn.microsoft.com

Visual Studio拡張機能として用意されているので、Visual Studio上で「ツール」→「拡張機能と更新プログラム」を開いて オンライン検索するとすぐに見つかります。そのままサクッとインストール。

f:id:sadynitro:20151206233111p:plain

インストール後はプロジェクトの「参照の追加」から「拡張」の中にある「SQLite for Windows Phone 8.1」を選択して追加します。

f:id:sadynitro:20151206233247p:plain

1点注意なのですが、参照に追加した「SQLite for Windows Phone 8.1」に三角の警告マークが付いている場合があります。 SQLite for Windows Phone 8.1はビルドターゲットが「Any CPU」では使用できないため、デバッグ、リリース環境に応じて「x86」もしくは「ARM」を選択してください。
エミュレータの場合はPC上で動作するので大抵「x86」、実機の場合は「ARM」を選択することになると思います。

f:id:sadynitro:20151206233732p:plain

2. sqlite-net

.NETで扱えるSQLiteのORMです。こちらは必須ではありませんが、個人的には必須と言っておきたいライブラリです。

github.com

NuGetパッケージが用意されているのでこちらもVisual Studio上でサクッと導入できます。

f:id:sadynitro:20151206233848p:plain

sqlite-netをインストールすると以下のファイルがプロジェクトに追加されます。

f:id:sadynitro:20151206233936p:plain

3. 処理の実装

sqlite-netによるSQLiteデータベースの操作については、基本的にGitHubを参照していただければ問題ないかと思いますが、一応プロジェクトに組み込んだ場合の例を記載しておきます。

フレームワークなしはさすがに厳しいので、ここではPrismを使用します。(memotchもPrismを使用しています)

Windows Phone 8.1でPrismを扱う場合のあれこれはかずき先生(@okazuki)の記事を参考にすると良いかと思います。というかその一択かも。

blog.okazuki.jp

プロジェクト全体はGitHubを参照していただくとして、ここでは肝のModelとViewModelを抜粋して軽く説明しておきます。
モデルでは接続オブジェクトを作って、メソッドを呼ぶだけでテーブル作成や削除、レコードの挿入やクエリの実行ができることを確認しています。

// ListItemModel.cs
using SQLite;
using System.Collections.Generic;

namespace WindowsPhoneSampleApp.Models
{
  class ListItemModel
  {
    // SQLite接続オブジェクト
    private SQLiteConnection _db;

    // テーブルのスキーマ定義
    public class Items
    {
      [PrimaryKey, AutoIncrement]
      public int Id { get; set; }
      public string UserName { get; set; }
      public string Info { get; set; }
    }

    public ListItemModel()
    {
      var dbPath = Windows.Storage.ApplicationData.Current.LocalFolder.Path;
      // DBファイルのパスをセット
      _db = new SQLiteConnection(dbPath + "/WPSampleApp");
      // Itemsテーブルを削除
      _db.DropTable<Items>();
      // Itemsテーブルを作成
      _db.CreateTable<Items>();

      // ダミーデータをセットする
      SetItems("hoge hoge", "Administrator");
      SetItems("huga huga", "Developer");
    }

    public void SetItems(string userName, string info)
    {
      // ユーザー名と情報を渡してItemsテーブルに挿入
      var ret = _db.Insert(new Items() { UserName = userName, Info = info });
    }
    
    public IEnumerable<Items> GetItems()
    {
      // クエリ文を実行
      return _db.Query<Items>("select * from Items order by Id;");
    }
  }
}

ViewModelではModelのメソッドを呼ぶことでデータを取得し、画面表示用のオブジェクトに詰め込んでいます。

// ListItemViewModel.cs
using System.Collections.Generic;
using WindowsPhoneSampleApp.Models;

namespace WindowsPhoneSampleApp.ViewModels
{
  class ListItemViewModel
  {
    private ListItemModel _listItemModel;

    public class Item
    {
      public int Id { get; set; }
      public string UserName { get; set; }
      public string Info { get; set; }
    }

    public IList<Item> ListItems { get; set; }

    // コンストラクタ
    public ListItemViewModel(ListItemModel listItemModel)
    {
      _listItemModel = listItemModel;

      ListItems = new List<Item>();
      var data = _listItemModel.GetItems();
      foreach (var d in data)
      {
        var temp = new Item();
        temp.Id = d.Id;
        temp.UserName = d.UserName;
        temp.Info = d.Info;
        ListItems.Add(temp);
      }
    }
  }
}

デバッグ実行するとこんな感じで表示されます。作成したItemsテーブルに挿入したダミーデータを取得して画面にバインドしています。

f:id:sadynitro:20151208211743p:plain

このように非常に簡単にSQLiteのDBを操作できます。

プロジェクト全体はこちらを参照。

sadynitro/SQLiteForWP · GitHub

(おまけ)UWPアプリでは?

ここまで読み進めて「で、UWPアプリの場合は?」と思っている方もいらっしゃるのではないでしょうか(それぐらい興味を持っていただいていると幸い)
実際にSQLiteを使用するUWPアプリを作成できているわけではないのですが、大体のアタリは付けています。

SQLite for Windows Phone 8.1」の代わりに「SQLite for Universal App Platform」なるものを、sqlite-netの代わりにSQLite.Net-PCLなるものが使えるようです。

SQLite for Universal App Platform
visualstudiogallery.msdn.microsoft.com

SQLite.Net-PCL
www.nuget.org

できれば近いうちにこれらを使用したUWPアプリサンプルもご紹介できればと思います。

まとめ

以上、私が実際にWindows Phone 8.1アプリを開発した際に利用した、SQLite関連の拡張機能やライブラリの紹介とその使用方法についてのまとめでした。 今後UWPアプリ開発が主流になると、OneDriveやAzureのストレージやSQL Databaseを利用してデスクトップアプリとモバイルアプリでデータ連携したりする仕組みが 大多数を占めてくるかもしれませんが、ローカルで軽量に設定情報を持たせたり、データを保持しておきたい場合はSQLiteを利用するのも一興かと。

明日のWindows Phone / Windows 10 Mobile Advent Calendar 2015 11日目は@_15cmさんです。よろしくどうぞ。

Visual Studio Team Servicesのダッシュボードをカスタマイズする

Visual Studio Team Services(VSTS)*1では、最近の更新により、ダッシュボードの内容が大きく変更になっています。

f:id:sadynitro:20151124230925p:plain

さらにこのダッシュボード、幾分かカスタマイズすることが可能となっており、用意されたタイルの中から好きなものを選択して、自由に配置できます。

ダッシュボードのカスタマイズ方法について、以下で説明していきます。

1. ダッシュボードの追加

新たにダッシュボードを追加するには、上部のタブバー的なものの右にある「+」をクリックします。入力フォームが開いたらダッシュボードのタイトルを入力してEnterキーでダッシュボードが追加されます。

f:id:sadynitro:20151124231048p:plain

f:id:sadynitro:20151124231057p:plain

また、画面右上の歯車アイコン(グレーの方)をクリックすると、ダッシュボードの編集画面が開きます。ここでもダッシュボードの追加ができる他、タイトルの編集、ダッシュボードの削除もできます。

f:id:sadynitro:20151125124325p:plain

f:id:sadynitro:20151124231208p:plain

2. パネルの追加と設定

画面左下にある緑色の「+」をクリックするとパネル追加の画面が開きます。
パネル追加の画面で追加したいパネルを選択して右下の「Add」をクリックするとパネルが追加されます(複数選択可)

f:id:sadynitro:20151124231120p:plain

f:id:sadynitro:20151124231126p:plain

タイルの右上にある「…」をクリックするとタイルのメニューが開きます。メニューは概ねタイルの削除のみですが、 タイルの種類によっては、「Configure」でタイルの設定ができます。

f:id:sadynitro:20151124231133p:plain

コードタイルでは、対象のリポジトリやブランチを選択することで、タイルに直近の変更が表示されるようになります。

f:id:sadynitro:20151124231138p:plain

Markdownタイルではこんな感じ。タイルのサイズを選択して、後はMarkdown記法で記述するだけです。

f:id:sadynitro:20151124231150p:plain

タイルの設定画面で「Save」をクリックするとダッシュボードに変更が反映されます。

f:id:sadynitro:20151124231158p:plain

3. パネルの配置変更

配置したパネルはドラッグアンドドロップで好きなように配置を変更することができます。

f:id:sadynitro:20151124231108p:plain

4. 活用アイデアの一例

一つのダッシュボードをMarkdownのパネルで埋め尽くして、Wikiページの様な使い方をすることもできます。1パネルに詰め込める内容に制限があるため上手くカテゴライズして配置しないといけませんが、ようやく共有したい情報やナレッジの蓄積ができそうな機能が追加されたのは喜ばしい限りです。*2

f:id:sadynitro:20151124231214p:plain

まとめ

今回はVisual Studio Team Servicesのダッシュボードのカスタマイズについて簡単に説明しました。
今年の怒涛のアップデートにより、以下の様な機能が出揃ってきました。

  • HOME (ダッシュボード)
  • ROOMS (チャット・通知)
  • WORK (タスク管理)
  • CODE (コード管理)
  • TEST/LOAD TEST (テストツール)
  • BUILD (CI)
  • RELEASE (CD)

ここまで来ると、1カ所でチーム開発に欲しい機能が全て揃う日も近いかもしれません。

*1:Visual Studio Online。早くこの注釈を入れなくても良さそうなくらいに浸透してほしい。

*2:WelcomeページもMarkdown記法で記述できますが、あくまでWelcomeぺーじなので…