rksoftware

Visual Studio とか C# とかが好きです

Remoted iOS Simulator を使えるエディションについて

先日、Visual Studio の Preview 版で Remoted iOS Simulator が使えた話を書きました。 そして気になる点として、Professional 版で使えるのかという点を挙げていました。我々は貧乏なので。
これまで、概ね Enterprise > Community > Professional という関係があったりしたため、実際に見てみるまで安心できません。

その Preview 版だったバージョンがさっそくリリースされて話題です。

引用

Beginning in Visual Studio 2017 version 15.5, the Remoted iOS Simulator is now available in all Visual Studio Editions, including the free Community Edition.

大事なことなので、もう一度書きます。

all Visual Studio Editions

実際に、アップデートしてみると、Professional でも Remote Simulator to Windows のチェックボックスがあったことを報告します。
プロフェッショナルにも人権が与えられた感じです。

補足

※メモリは 16 GB を搭載しています。

Xamarin.Android のハンズオンテキストを作成しました

Xamarin.Android のハンズオンテキストを作成しました。

■ ハンズオンの概要

Android のサンプルアプリを Xamarin.Android に書き換えることで Xamarin.Android を体験します。

■ このハンズオンで体験できること

・簡単な作りのアプリであれば、Android (Java) のソースコードをほとんど変更せず Xamarin.Android へ書き換えられます。
・書き換えを体験するとこで「API の薄いラッパー」「アプリ開発経験者は経験が活かせる」ことが理解できると思います。
・書き換えを体験することで Xamarin への敷居を下げることを目的にしています。Xamarin でのベストプラクティスをご提案するものではありません。

■ 注意点

Android の公式サンプルアプリ「MediaRecorder」を Xamarin に書き換えますが、このサンプルアプリ、なかなかの大作となっています。
3 クラスファイル合計でおよそ 1,000 行というサンプル離れした力作です。
単純に物量が多く根気が必要になるかもしれません。また、テキストを入力するよりマウス操作の方が重要になります。
タッチパッドの達人でなければマウスを用意した方が捗るかもしれません。

NEXT STEP

このハンズオンは Android の API が Xamarin でどうなっているのかを体験できるものです。
あくまでも Android に焦点を当てているので、Xamarin の真の力であるクロスプラットフォーム開発は体験できません。
クロスプラットフォームを体験するために次のハンズオンもやってみるのがお勧めです。

また、iOS については、次のハンズオンがお勧めです。

イベントに参加しよう

上記の各ハンズオンは定期的に JXUG 主催のイベントが開催されています。
エキスパートによる解説や、メンターによるサポートが受けられ、ほぼ確実に最後まで完成させることができます。

受講したいハンズオンが開催されないか、定期的に確認をしてみてください。
また、ハンズオン以外にも定期的にイベントが開催されるので、是非チェックしてみてください。

Visual Studio for Mac で Android エミュレーターが起動しない場合

Visual Studio for Mac で Android Emulator が起動しない場合があります。
今回は、次のような log が表示されていました。

実行に失敗しました

または

Failed to create vm ffffffff
Failed to create HAX VM
No accelerator found.
failed to initialize HAX: Invalid argument
Hax is enabled

今回取った対策

メニューの ツール > SDK マネージャー > SDK の場所 > Androidツール タブ > Android SDK Tools をバージョン 25.2.5 から 26.1.1 へ変更。

エミュレーター周りは色々とあるので、他の事象もあると思いますが、とりあえず今回はこれでデバッグできるようになりました。

秋葉原 C# もくもく会 #18 勉強会を開催しました。

■ C# もくもく会

 C# もくもく会 #18 を開催しました。

 C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
 もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。

 敷居は、勉強会史上最高レベルに低いので、興味があったら覗いてみてください。

■ 次回予定

 来月は 12月07日(木)に開催の予定です。

 .NET に関心のある方、是非遊びに来てください。

Visual Studio (Win) の Community で Remoted iOS Simulator for Windows が使えるらしいので試してみた

Visual Studio (Win) の Community で Remoted iOS Simulator for Windows が使えるらしいので試してみました。
※使えるとどこで見た忘れてしまいました。すみません。

Remoted iOS Simulator for Windows は、Windows 上の操作だけで iOS シミュレーター でのアプリのデバッグを行える夢の機能です。
これまで、Visual Studio の Enterprise が必要だったので、貧乏な私は指をくわえて見ていることしかできませんでした。

Visual Studio 2017 15.5 Preview 4
Visual Studio 2017 15.5 Preview 4 が必要らしいのでインストールします。
今の Visual Studio は同一メジャーバージョン/エディションでも複数インストールできるのではかどりますね。

■ 環境の準備

Visual Studio for Mac の準備
Windows 上の操作だけでデバッグを行えると書きましたが、操作しなくてよいだけで Mac は必要です。
また、Visual Studio の Preview 版に合わせて Visual Studio for Mac もベータチャンネルにしておく必要があります。

Mac 本体の設定
Visual Studio と Visual Studio for Mac を接続することになりますが、それには Mac 本体の設定も必要です。
リモートログインを可能にしておく必要があります。
システム環境設定 > 共有 の [リモートログイン] を オン

Visual Studio の設定
インストール直後、デフォルトで ON になっていると思いますが、本機能を使う設定は Visual Studio 上の次の場所にあります。
ツール > iOS > iOS シミュレーターの表示

■ 実行結果


Windows 上で iOS のシミュレーターが動いてい(ように見え)ます。
※実際には実行自体は Mac 上で行われているそうです。

補足
Visual Studio の メニュー > iOS > iOS シミュレーターの表示 がありますが、これを選んでも、Mac 上でシミュレーターが立ち上がるだけです。
デバッグ実行すれば Windows 上に iOS シミュレーターの Window が開くので、とりあえずデバッグ実行してください。

■ 実行手順

実行の手順は、Enterprise 版で素晴らしい記事を書いて下さっている方がいます。
こちらを大いに参考にさせていただきました。手順は変わらないので参照してください。

まとめ

Enterprise 版のみの夢の機能がついに Community にやってきました!
後は、Professional 版で使えるかどうかですね。我々は貧乏なので。

注意点

・Mac は必要です。何度も言われていることですが、Mac は必要です。本機能も Mac がなければ使えません。それが現実です。
・iOS 機器の実機は必要です。何度も言われていることですが、iOS 機器の実機は必要です。シミュレーターと実機は違います。シミュレーターでは動かない機能もあります。実際の開発は実機によるデバッグなしには行えません。それが現実です。

Visual Studio (Win) で C# 7.2 が使えるらしいので試してみた (その他の機能)

Visual Studio (Win) で C# 7.2 が使えるらしいので試して見ました。

Visual Studio 2017 15.5 Preview 4 が必要らしいのでインストールします。
今の Visual Studio は同一メジャーバージョン/エディションでも複数インストールできるのではかどりますね。

前回は、リリースノートに載っている機能を試してみました。

今回は、それ以外の機能を試してみます。

参考

今回のメニュー

・Allow digit separator after 0b or 0x
・conditional ref operator
・ref extension methods on structs

■ C# 7.2 の設定

プロジェクトを新規に作成したらいつもの手順で、C# 7.2 を使えるように設定します。
プロジェクト > ××のプロパティ > ビルド > (右下の方の)[詳細設定]ボタン > 全般の[言語バージョン] を **C# 7.2** に設定 これで、C# 7.2 が使えるはずです。

■ Allow digit separator after 0b or 0x

// C# 7.1 で書ける
readonly int A = 0x1_2345;
readonly int B = 0b1_0101;

// C# 7.2 でないとエラー
readonly int CS72A = 0x_1_2345;
readonly int CS72B = 0b_1_0101;

0x0b の直後に _ を書けるようになった

■ conditional ref operator

{
    var a = 10;
    var b = 20;
    ref var c = ref (true ? ref a : ref b);
    a = 11;
    b = 21;
    Console.WriteLine($"a:{a} b:{b} c:{c}");    // a: 11 b: 21 c: 11 と出力される
}
{
    var a = 10;
    var b = 20;
    ref var c = ref (false ? ref a : ref b);
    a = 12;
    b = 22;
    Console.WriteLine($"a:{a} b:{b} c:{c}");    // a: 12 b: 22 c: 22 と出力される
}
{
    var a = 10;
    var b = 20;
    (true ? ref a : ref b) = 13;
    Console.WriteLine($"a:{a} b:{b}");    // a: 13 b: 20 と出力される
}
{
    var a = 10;
    var b = 20;
    (false ? ref a : ref b) = 24;
    Console.WriteLine($"a:{a} b:{b}");    // a: 10 b: 24 と出力される
}

Console.ReadKey();

・三項演算子で参照(ref)を返せるようになった
・参照が返るので、上記例の 3、4 つ目の様に結果に対して値を代入できる
見た目気持ち悪いけれど、とても便利そうですね

ちなみにこの機能、 C# 7.0 以上なら 7.2 でなくても使えます。 ※Visual Studio 2017 15.5 Preview 4 である必要はあります。

■ ref extension methods on structs

// 構造体
struct SA
{
    public int PA;
    public int PB;
}

// 拡張メソッド
static class SAExtensions
{
    public static int GetPA(in this SA sa)
    {
        //return sa.PA = 11; ← sa は読み取り専用のためエラー
        return sa.PA;
    }
    public static int GetPB(ref this SA sa) => sa.PB = 22; // sa は参照なので値を変更できる
    // public static int GetPB(in this SA sa) => sa.PB;  ← in と ref だけが異なる overload は定義できない
}

class Program
{
    static void Main(string[] args)
    {
        var sa = new SA { PA = 10, PB = 20 };
        Console.WriteLine(sa.GetPA());  // 10 が出力される
        Console.WriteLine(sa.GetPB());  // 22 が出力される
        Console.WriteLine(sa.PB);       // 22 が出力される

        Console.ReadKey();
    }
}

・拡張メソッドの this 引数を参照にできる
※ここで出てきた in キーワードについては前回を参照してください。

7.2 の機能

とりあえず、7.2 の機能は確かに確認できそうです。
ただ、C# 7.2 の機能はパフォーマンスを向上できる機能が多くなっています。
そこまでパフォーマンスを意識しなくていい世界で生きているので意識しないと使いこなすのが難しそうです。頑張って覚えないといけないですね。

Visual Studio (Win) で C# 7.2 が使えるらしいので試してみた

Visual Studio (Win) で C# 7.2 が使えるらしいので試して見ました。

Visual Studio 2017 15.5 Preview 4 が必要らしいのでインストールします。
今の Visual Studio は同一メジャーバージョン/エディションでも複数インストールできるのではかどりますね。

■ C# 7.2 の設定

プロジェクトを新規に作成したらいつもの手順で、C# 7.2 を使えるように設定します。
プロジェクト > ××のプロパティ > ビルド > (右下の方の)[詳細設定]ボタン > 全般の[言語バージョン] を C# 7.2 に設定 これで、C# 7.2 が使えるはずです。
とりあえず今回は上記のリリースノートに書かれている機能を試してみました。

■ Span を試す

Span を使うには、NuGet で System.Memory を追加します。NuGet で探す際に [プレリリースを含める]チェック を ON にしないと出てこないので注意してください。

var ary = Enumerable.Range(1, 10).ToArray();
var span = new Span<int>(ary, 2, 3);
var readonlySpan = (ReadOnlySpan<int>)span;
for (int i = 0; i < readonlySpan.Length; i++)
    Console.WriteLine(readonlySpan[i]);
// 3
// 4
// 5 と出力される
span[0] = 11;
Console.WriteLine(readonlySpan[0]); // 11 と出力される
// readonlySpan[0] = 21; ← これはエラー
ary[2] = 31;
Console.WriteLine(readonlySpan[0]); // 31 と出力される

Console.ReadKey();

・Span は配列(など)の一部の範囲を切り出して値の参照を持てる
・Sapn を new する際に引数で「2 番目の要素から長さ 3」と指定していますが、for で回した際に確かに「2 番目の要素から 3 つ」が出力された
・最初に作った ary という配列の要素を変更した際に、Span の値も変更されているので確かに参照を持っている
・Span だけでなく ReadOnlySpan という読み取り専用の型も存在する

ちなみにこれ、System.Memory さえ参照すれば、C# のバージョンは関係ないみたいですね。C# 3 に変更しても動作します。

蛇足ですが、Span にある DangerousCreate ってメソッドの名前、惹かれるものがありますよね?

■ readonly struct を試す

readonly struct SA
{
    public readonly int PA;
    // public int PB; ← これはエラー
    public SA(int a)
    {
        PA = a;
    }
    // public void Set(SA a) { this = a; } ← これはエラー
}

struct SB
{
    public readonly int PA;
    public int PB; // ← readonly でなければ OK
    public SB(int a, int b)
    {
        PA = a;
        PB = b;
    }
    public void Set(SB a) { this = a; } // ← readonly でなければ OK
}

・readonly struct は readonly なメンバーしか持てない
・保持する値が変更されない(値が変更可能になる定義が禁止される)

■ in parameters / ref readonly returns を試す

struct SB
{
    public int PA;
    public void Set(int a) => this.PA = a;
}

static ref readonly SB MyMethod(in SB a)
{
    // a.PA = 11; ← 読み取り専用になるため値を変更できない
    // a = new SB(); ←読み取り専用になるため値を変更できない
    Console.WriteLine(a.PA); // 10 と出力される
    a.Set(12);               // ←エラーにはならないが、読み取り専用になるため値を変更できない
    Console.WriteLine(a.PA); // 10 と出力される
    return ref a;
}
static void Main(string[] args)

{
    var sb1 = new SB { PA=10 };
    ref readonly var sb2 = ref MyMethod(sb1);
    Console.WriteLine(sb1.PA); // 10 と出力される
    Console.WriteLine(sb2.PA); // 10 と出力される
    sb1.Set(13);
    Console.WriteLine(sb1.PA); // 13 と出力される
    Console.WriteLine(sb2.PA); // 13 と出力される
    // sb2.PA = 14; //  ←読み取り専用になるため値を変更できない
    sb2.Set(14);    //  ←エラーにはならないが、読み取り専用になるため値を変更できない
    Console.WriteLine(sb1.PA); // 13 と出力される
    Console.WriteLine(sb2.PA); // 13 と出力される
    Console.ReadKey();
}

これはちょっとルールが多くて複雑です。
とりあえずやりたいこととしては
・構造体を参照で渡してパフォーマンスを上げたいが、メソッド内/ return 先で書き換えられたくない場合に使う
・構造体を参照で渡しつつ、読み取り専用に制限できる

■ private protected を試す

次の二つの名前空間は別アセンブリにあるとします。

namespace ClassLibrary1
{
    public class Class1
    {
        private protected void MyMethod() {; }
    }

    public class Class3 : Class1
    {
        void MyMethod2() { base.MyMethod(); } // ← 同一アセンブリ内の派生クラスは OK
    }
}
namespace AnotherAssemblyClass
{
    class AnotherAssemblyClass : ClassLibrary1.Class1
    {
        void MyMethod3()
        {
            // base.MyMethod(); ← これはエラー
        }
    }
}

・同一アセンブリ内でのみアクセスできる

■ Non-trailing named arguments を試す

static void MyMethod(int a, int b, int c, int d)
{
    ;
}

static void Main(string[] args)
{
    MyMethod(1, 2, c:3, 4);         // ← c の位置が順番とあっているので OK
    MyMethod(1, 2, d: 3, c:4);      // ← 名前付きが後方に集まっているので OK
    // MyMethod(1, c: 2, b: 3, 4);  // ← c、b の位置が順番とあっていないので NG
    MyMethod(d:1, c:2, b: 3, a:4);  // ← 全て名前付きなので OK
    // MyMethod(1, c: 2, b: 3, a: 4); // ← a の位置は既に値が書かれている (1) ので NG
}

・位置が順番とあっていれば、末尾でなくても引数に名前を付けられる

その他の 7.2 の機能

とりあえず、リリースノートに書かれている機能は確かに確認できそうです。
その他のリリースノートに書かれていない機能は、また後日試してみます。