xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

数値セパレーター

C# 6.0 までの数値リテラルでは、桁数がどれだけになっても区切り文字を入れることができませんでした。今回 C# 7 で数値セパレーター (= Digit Separators) という機能が追加され、数値リテラルを自由に桁区切りしてグルーピングできるようになりました。

区切り文字として利用できるものは _ のみ。特に前回紹介した 2 進リテラルと一緒に使うと便利そうです。

var bin  = 0b1100_1010;  //--- 4 ビットずつ
var dec  = 12_345_678;   //--- 通貨などでよくある 3 桁区切り
var hex  = 0x33_ff_cc;   //--- RGB で区切ってみたり

詰まるところ _ は表記上の完全なオマケで、解釈としては _ がないものと同一になります。なので、例えば以下のふたつは同じです。

double real = 1_000.123_4e-3_0;  //--- だいぶ読みづらいけど
double real = 1000.1234e-30;     //--- これと同じ

いくつ入れても OK

ザッと試してみたところ、以下のようにセパレーターをいくつ並べても大丈夫でした。やり過ぎる意味はないですが、だいぶ自由にできそうです。

var bin = 0b1_0__1___0____0_____1;

先頭と末尾に入れるのはダメ

セパレーターの個数には自由度がありますが、入れる場所には制限がありました。数値の先頭と末尾には入れられません。ちゃんと「区切り」なさいということですね。

//--- 先頭はダメ
var bin = 0b___1010;
var dec = ___12_345;
var hex = 0x___1f2d;

//--- 末尾もダメ
var bin = 0b1010_0011___;
var dec = 123_456___m;  //--- decimal などの接尾辞を入れてもダメ
var hex = 0x11_ff___;

2 進リテラル

すでに当たり前のように使っている機能ですが、C# 6.0 までは整数リテラル (整数値を表記する方法) として 10 進数と 16 進数がサポートされています。10 進数はそのまま数字を並べるだけ、16 進数は数値の前に 0x / 0X の接頭辞を付けます。

var dec = 123;   //--- 10 進数
var hex = 0x1F;  //--- 16 進数

C# 7 からはこれらに加えて 2 進数表記 (= Binary literals) も追加されます。接頭辞は 0b / 0B で、Binary の意味ですね。以下のように記述できるようになります。

var bin = 0b1011;  //--- 2 進数

利用できる数値は 0 / 1 のみです。仕様は以下に載っています。

整数リテラルは記法の問題だけなので、コンパイル時にはただの整数値として IL に埋め込まれます。2 進数表記をしたから遅くなるとかいうことは一切ありません。

こんなときに便利

よくある例がビット演算をする場合です。Flags 属性を付けた enum を作ることがあるかと思いますが、これまでは愚直に 10 進数で値を並べるかビットシフトを使って以下のように書いていました。

//--- そのまま 10 進数で値を並べる
[Flags]
enum Fruits
{
    None   = 0,
    Dog    = 1,
    Cat    = 2,
    Bird   = 4,
    Rabbit = 8,
    Other  = 16,
}


//--- シフト演算で何ビット目に 1 を立てているかを明示
[Flags]
enum Fruits
{
    None   = 0,
    Dog    = 1 << 0,  //--- 0 ビット左にシフトしたところに 1 を立てる
    Cat    = 1 << 1,
    Bird   = 1 << 2,
    Rabbit = 1 << 3,
    Other  = 1 << 4,
}

これらをより明確に記述できるようになります。

[Flags]
enum Fruits
{
    None   = 0b00000,
    Dog    = 0b00001,
    Cat    = 0b00010,
    Bird   = 0b00100,
    Rabbit = 0b01000,
    Other  = 0b10000,
}

他にも、ビットマスクをするときなどに重宝しそうです。

Visual Studio 15 Preview で C# 7 を試す

2016/03/30、Microsoft が開催したビッグイベント //build/ 2016 に合わせて Visual Studio 15 Preview が公開されました。

Visual Studio "15" Preview Downloads

今回の //build/ では bash が Windows 上でネイティブで動いたり、Bot Framework が公開されたり、Xamarin が無償提供されたり、より進化した HoloLens を見れたり、Azure Functions が Preview リリースされたりなどなど超盛りだくさんでしたが、やっぱり C# vNext (C# 7) のことを忘れてはいけません。ということで、これからしばらくは C# 6 のときと同様、C# 7 の新機能についてひとつずつ見ていきたいと思います。記事のインデックスはこちらです。

C# 7 の機能を有効化する

Visual Studio 15 Preview をインストールしただけでは C# 7 は有効化されておらず、C# 6 までの機能しか利用できません。有効化する場合は条件付きコンパイルシンボルに __DEMO____DEMO_EXPERIMENTAL__ を追加してください。

条件付きコンパイルシンボル

準備ができたら、例えば以下のようなコードのコンパイルを通して実行できるようになります。

using static System.Console;

namespace TryCSharpVNext
{
    class Program
    {
        static void Main()
        {
            string LocalFunctions(int x)
            {
                let a = 10;
                return (x * x * a).ToString();
            }

            var result = LocalFunctions(0b1010);
            WriteLine(result);
        }
    }
}

Enjoy, C# 7!!

Docs.com がソースコード表示に対応しました

もはやタイトルの通りなのですが、Docs.com がソースコードにも対応しました。複数の言語に対応していて、ブログへの埋め込みもサポートしています。

ソースコードサポート

サンプル

具体的には調べていないですが、結構多くの言語に対応しているようです。とりあえず C# のソースコードを置いてみました。PowerShell (.ps1) には対応していないようですが近々対応されるみたいです。

エンジニアが所有する多くのブログサイト (Qiita など含む) は Markdown でカジュアルにコードを書いてしまうので埋め込み機能はあまり活躍しないかもですが、Markdown に対応していないサイトなどで綺麗なシンタックスハイライト表示で見せたいケースなどでは便利かもしれません。

ちなみに、開発用途ではないのでアップロード後の編集などはできません。変更したい場合は再アップロードが必要ですし、インテリセンスなんて当然効きません。あくまでアップロードベースの公開用です。

フィードバック

まだリリースされたばかり & すべて対応されるかは分かりませんが、現在フィードバックされている項目は以下の通りです。

  • 行番号の表示に対応してほしい
  • 特定の行をハイライトする機能がほしい (GitHub の ?L=12 みたいなヤツ)
  • Shift-JIS で文字化けする (UTF8 なら OK)
  • PowerShell (.ps1) に対応してほしい
  • 埋め込み時に高さ調整されたテンプレートのパターンがほしい (行数が少ないコードの貼付が楽そう)
  • 白背景にしたい
  • フォントを Consolas など選びたい

Azure Function で Slash Commands 作ってみた

//build/ 2016 の Day 2 キーノートで Azure Function という機能が発表されました。Amazon Web Services を使っている方には Azure 版の Lambda と言えば分かりやすいでしょうか。コードをそのまま登録しておけば Web API が実装できてしまうという、超絶カジュアルでお手軽なサービスです。デプロイ要らず!マジ最高!

発表されたばかりの機能ですが、早速これを使って Slack の Slash Commands を作ってみました。

できた報告

Function App を作成する

まず、Azure Portal を開きます。[Marketplace] - [Web + Mobile] に [Function App] が追加されているので、ナビゲーションに従って作成します。

Create Function App

作成した Function App を開くと以下のような画面が出てきます。App Service として作成されるあたり、Web Apps とかの上で動いてる気がします。もしかしたら Kudu とかで確認できたりするかも?(未確認

Display Function App

Function を作成する

続いて [+ New Function] から [General WebHook - C#] を選択し、テキトーに名前を付けて作成します。

New Function

すると、開発/実行するための画面が出てきます。どうやら C# の場合は C# Interactive でおなじみの csx で動かすようです。

開発環境

今回は簡単に現在時刻を表示するだけの Slash Commands を作ります。以下のコードを打ち込みます。

using System;
using System.Net;

public static object Run(HttpRequestMessage req, TraceWriter log)
{
    return req.CreateResponse(HttpStatusCode.OK, new
    {
        text = DateTime.Now.ToString(),
        response_type = "in_channel",
    });
}

WebHook Type の設定

Function App のインテグレーション設定として HTTP リクエストの [WebHook type] を 'Not a webhook' に設定します。この設定が間違っていたようで、Slack との接続が上手くいかなくてしばらく悩みました。

WebHook type の設定

Slash Commands の設定

作成した Azure Function を Slack から呼び出すため、Slash Commands の設定を行います。Slash Commands アプリケーションを Slack にインストールしていない方はしておいてください。そこのやり方は割愛します。[Function Url] をコピーして、以下のように設定します。

Function Url

Slash Commands 設定

実行してみる

Slack のチャット画面で '/now' と入れると、Azure Function が応答してくれます。何ともお手軽ですね!

実行結果

先日作った Cloud Translator も Azure Function でできてしまいそうw

参考動画

まだ見ていませんが、Channel 9 に Aure Function を使った WebHook サービスや API の作り方チュートリアルの動画がありました。見ておくと良いかも!