2019年11月02日

[TypeScript][WebGL][Three.js] Boids (an artificial life program) —shoal simulator written in TypeScript—

Shos.Boids

Boids とは

Boids は、Craig Reynolds 氏によって作られた人工生命のシミュレーションだ。 Boid の名は、「Bird (鳥) oid (もどき)」から来ており、元は鳥の群れの動きを真似ている。

それぞれの個体を次に上げる 3 つの規則にしたがって動かすというだけで、群れのような動きを実現している:

Boids の 3 つの規則
分離 (Separation): 近くの仲間にぶつからない方向に移動
分離 (Separation)
分離 (Separation)
整列 (Alignment): 近くの仲間が平均的に向かっている方に向かう
整列 (Alignment)
整列 (Alignment)
集結 (Cohesion): 近くの仲間の中心方向に移動する
集結 (Cohesion)
集結 (Cohesion)

参考ページ

デモ

TypeScript などで Boids のデモを 3 種類作成してみた。

鳥の群れではなく、魚の群れを意識した。

※ 各画像をクリックするとそれぞれのページへ飛ぶ

2D版: Boids (an artificial life program) —shoal simulator written in TypeScript
Boids (an artificial life program) —shoal simulator written in TypeScript
3D版: Boids (an artificial life program) 3D —shoal simulator written in TypeScript with Three.js—
Boids (an artificial life program) 3D —shoal simulator written in TypeScript with Three.js—
3D 裸眼立体視版: Boids (an artificial life program) 3D (Cross-eyed/Parallel Free-viewing Stereoscopy) —shoal simulator written in TypeScript with Three.js—
Boids (an artificial life program) 3D (Cross-eyed/Parallel Free-viewing Stereoscopy) —shoal simulator written in TypeScript with Three.js—

2D版では2次元ベクトル、3D版では3次元ベクトルで、個体の位置や速度を計算している。

2つの3D版は、Three.js というライブラリーを使って WebGL で動かしている。

参考:

3D 裸眼立体視版は、裸眼立体視 (交差法または平行法) ができる人向けだ。 立体視の方法については、次のページなどが参考になる。

参考:

なお、各版ともパラメーターを色々と変更できるので試してほしい。

これらのデモ ページの実装については、ソースコードを参照してほしい。

ソースコード

ソースコードは、GitHub に上げた:

開発環境/言語/ライブラリー

以下を使って作った:

Visual Studio Code

上記デモは、Visual Studio Code 上で作成した。

Visual Studio Code は、プログラミングに最適な Microsoft 製のテキスト エディターで、Windows 版、macOS 版、Linux 版がある。

HTML や CSS はもちろんのこと、JavaScript や TypeScript、C# などの多種多様なプログラミング言語にも対応している。

Git クライアント、ビルド、シンタックス ハイライト、リファクタリング、インテリセンスなどの機能を持ち、とても使いやすいのでお薦めだ。

どのような機能や言語が使えるかは、Extensions for Visual Studio family of products | Visual Studio Marketplace が参考になる。

参考:

TypeScript

TypeScript は、設定を変えることにより、"ES3"、"ES5"、"ES2015"、"ES2016"、"ES2017"、"ES2018"、"ES2019" にコンパイルすることができる。

デモでは、"ES5" を使っている。

TypeScript のコンパイル オプションは、"tsconfig.json"というファイルで行う。 今回は次のような内容とした。

tsconfig.json


{
  "compilerOptions": {
    /* Basic Options */
    "target": "ES5",        /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
    "module": "commonjs",   /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "sourceMap": true,      /* Generates corresponding '.map' file. */

    /* Strict Type-Checking Options */
    "strict": true,         /* Enable all strict type-checking options. */

    /* Module Resolution Options */
    "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
  }
}

TypeScript は、Visual Studio Code から簡単に JavaScript にコンパイルできる。

Visual Studio Code でのコンパイル
Visual Studio Code でのコンパイル

ちなみに、次のような TypeScript の場合:

class Vector3D {
    x: number;
    y: number;
    z: number;

    get absoluteValue(): number {
        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    }

    constructor(x: number = 0, y: number = 0, z: number = 0) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    clone(): Vector3D {
        return new Vector3D(this.x, this.y, this.z);
    }

    plus(another: Vector3D): Vector3D {
        return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
    }

    plusEqual(another: Vector3D): void {
        this.x += another.x;
        this.y += another.y;
        this.z += another.z;
    }

    minus(another: Vector3D): Vector3D {
        return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
    }

    minusEqual(another: Vector3D): void {
        this.x -= another.x;
        this.y -= another.y;
        this.z -= another.z;
    }

    multiply(value: number): Vector3D {
        return new Vector3D(this.x * value, this.y * value, this.z * value);
    }

    innerProduct(another: Vector3D): Vector3D {
        return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
    }

    divideBy(value: number): Vector3D {
        return new Vector3D(this.x / value, this.y / value, this.z / value);
    }

    divideByEqual(value: number): void {
        this.x /= value;
        this.y /= value;
        this.z /= value;
    }

    getDistance(another: Vector3D): number {
        return this.minus(another).absoluteValue;
    }
}

"ES5" でコンパイルしてできた JavaScript はこんな感じ:

"use strict";
var Vector3D = /** @class */ (function () {
    function Vector3D(x, y, z) {
        if (x === void 0) { x = 0; }
        if (y === void 0) { y = 0; }
        if (z === void 0) { z = 0; }
        this.x = x;
        this.y = y;
        this.z = z;
    }
    Object.defineProperty(Vector3D.prototype, "absoluteValue", {
        get: function () {
            return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
        },
        enumerable: true,
        configurable: true
    });
    Vector3D.prototype.clone = function () {
        return new Vector3D(this.x, this.y, this.z);
    };
    Vector3D.prototype.plus = function (another) {
        return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
    };
    Vector3D.prototype.plusEqual = function (another) {
        this.x += another.x;
        this.y += another.y;
        this.z += another.z;
    };
    Vector3D.prototype.minus = function (another) {
        return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
    };
    Vector3D.prototype.minusEqual = function (another) {
        this.x -= another.x;
        this.y -= another.y;
        this.z -= another.z;
    };
    Vector3D.prototype.multiply = function (value) {
        return new Vector3D(this.x * value, this.y * value, this.z * value);
    };
    Vector3D.prototype.innerProduct = function (another) {
        return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
    };
    Vector3D.prototype.divideBy = function (value) {
        return new Vector3D(this.x / value, this.y / value, this.z / value);
    };
    Vector3D.prototype.divideByEqual = function (value) {
        this.x /= value;
        this.y /= value;
        this.z /= value;
    };
    Vector3D.prototype.getDistance = function (another) {
        return this.minus(another).absoluteValue;
    };
    return Vector3D;
}());

class がないので、prototype と function での実装だ。

一方、"ES2019" でコンパイルしてできた JavaScript はこんな感じ:

"use strict";
class Vector3D {
    constructor(x = 0, y = 0, z = 0) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
    get absoluteValue() {
        return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
    }
    clone() {
        return new Vector3D(this.x, this.y, this.z);
    }
    plus(another) {
        return new Vector3D(this.x + another.x, this.y + another.y, this.z + another.z);
    }
    plusEqual(another) {
        this.x += another.x;
        this.y += another.y;
        this.z += another.z;
    }
    minus(another) {
        return new Vector3D(this.x - another.x, this.y - another.y, this.z - another.z);
    }
    minusEqual(another) {
        this.x -= another.x;
        this.y -= another.y;
        this.z -= another.z;
    }
    multiply(value) {
        return new Vector3D(this.x * value, this.y * value, this.z * value);
    }
    innerProduct(another) {
        return new Vector3D(this.x * another.x, this.y * another.y, this.z * another.z);
    }
    divideBy(value) {
        return new Vector3D(this.x / value, this.y / value, this.z / value);
    }
    divideByEqual(value) {
        this.x /= value;
        this.y /= value;
        this.z /= value;
    }
    getDistance(another) {
        return this.minus(another).absoluteValue;
    }
}

こちらは class があるので TypeScript のコードとあまり変わらない。"ES5" とは、まるで別の言語のように見えるのが面白い。

2019年10月16日

[C#][.NET] Shos.CsvHelper (simple library for reading and writing CSV)

CSV Icon

I wrote a simple library for reading and writing CSV (the Values Comma-Separated or Character-Separated Values).

The csv format file is sometimes necessary because it can be displayed / edited with Excel and is simple. There are other libraries that read and write csv already, but I tried to make it simpler.

With this library, you can read and write plain object collections (IEnumerable<Something>) in csv format.

How to use

Overview of how to use

First, prepare something IEnumerable<TElement>:

    An IEnumerable<TElement> something
    IEnumerable<ToDo> toDoes = new ToDoList();

For example this class:

    class ToDoList : IEnumerable<ToDo> // sample collection
    {
        public IEnumerator<ToDo> GetEnumerator()
        {
            yield return new ToDo { Id = 1, Title = "filing tax returns", Deadline = new DateTime(2018, 12, 1) };
            yield return new ToDo { Id = 2, Title = "report of a business trip", Detail = "\"ASAP\"", DaySpan = new DaySpan(3), Priority = Priority.High };
            yield return new ToDo { Id = 3, Title = "expense slips", Detail = "book expenses: \"C# 6.0 and the .NET 4.6 Framework\",\"The C# Programming\"", Priority = Priority.Low, Done = true };
            yield return new ToDo { Id = 4, Title = " wish list ", Detail = " \t (1) \"milk\"\n \t (2) shampoo\n \t (3) tissue ", Priority = Priority.High };
        }

        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
    }

You can write this as:

    const string csvFileName = "todo.csv";
    await toDoes.WriteCsvAsync(csvFileName);

The resulting csv file looks like this:

  • If the value contains commas, delimiters, newlines, or double quotes, these are enclosed in double quotes.
  • Double quotations in the value are replaced by two double quotations.
Id,Title,Deadline,Done,Priority,Details,DaySpan
1,filing tax returns,2018/12/01 0:00:00,False,Middle,,0
2,report of a business trip,2017/07/12 13:13:01,False,High,"""ASAP""",3
3,expense slips,2017/07/12 13:13:01,True,Low,"book expenses: ""C# 6.0 and the .NET 4.6 Framework"",""The C# Programming""",0
4, wish list ,2017/07/12 13:13:01,False,High," 	 (1) ""milk""
 	 (2) shampoo
 	 (3) tissue ",0

Open the created csv file in Excel
Open the created csv file in Excel

You also can read a csv file like this:

    IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFileName);

Things to read and write

Public properties with both "get" and "set" of each element in the collection are read and written to csv files.

When writing:

When writing, it is converted to a string with the "ToString()" method regardless of the type.

When reading:

When reading, the string type is left as is, and enum (enumeration type) is read as the value of the string. For other types, it tries to change the string to a value using "TryParse" or "Parse". Types that cannot do either of these will not be read.

Properties that have both "get" and "set" and are of one of the following types are read:

  • String type
  • enum
  • A type that has a default constructor and can be "TryParse" or "Parse" (Basic numeric types such as int, DateTime, user-defined types with "TryParse" or "Parse")
Other rules
  • Properties with the [CsvIgnore ()] attribute are not read or written.
  • Properties with the [ColumnName("Column name")] attribute will be changed to the one with the specified column name in the csv file.

For example, the above ToDo class is like this:

    // Sample element type
    // Properties marked with ✔ will be read / written
    // Properties marked with ✖ won't be read / written
    class ToDo
    {
        public int      Id       { get; set; }                     // ✔
        public string   Title    { get; set; } = "";               // ✔
        public DateTime Deadline { get; set; } = DateTime.Now;     // ✔
        public bool     Done     { get; set; }                     // ✔
        public Priority Priority { get; set; } = Priority.Middle;  // ✔ ユーザー定義 enum 
        [ColumnName("Details")]
        public string   Detail   { get; set; } = "";               // ✔ [ColumnName ("Details")] changes the column name in the csv file to "Details"
        public DaySpan  DaySpan  { get; set; }                     // ✔ User-defined type with "Parse" (without "TryParse")
        [CsvIgnore()]
        public string   Option   { get; set; } = "";               // ✖ Ignored because [CsvIgnore()] is attached
        public string   Version => "1.0";                          // ✖ Ignored because it is only a get property
    }

The user-defined types used in the above ToDo class are as follows:

    // User-defined enum example
    enum Priority { High, Middle, Low }

    // Example of a user-defined type with "Parse" (without "TryParse")
    struct DaySpan
    {
        public int Value { get; private set; }

        public DaySpan(int value) => Value = value;
        public static DaySpan Parse(string text) => new DaySpan(int.Parse(text));
        public override string ToString() => Value.ToString();
    }

With or without header

csv can be read and written even if it has no header part (eg the first line of the csv file above).

However, if there is a header part, it can be read by collating the header part even if the column is switched, but if there is no header part, it cannot be read if the column is switched.

Example of writing without a header:

    await toDoes.WriteCsvAsync(csvFilePathName: csvFileName, hasHeader: false);

Csv file created:

1,filing tax returns,2018/12/01 0:00:00,False,Middle,,0
2,report of a business trip,2017/07/06 18:08:13,False,High,"""ASAP""",3
3,expense slips,2017/07/06 18:08:13,True,Low,"book expenses: ""C# 6.0 and the .NET 4.6 Framework"",""The C# Programming""",0
4, wish list ,2017/07/12 13:13:01,False,High," 	 (1) ""milk""
 	 (2) shampoo
 	 (3) tissue ",0

Open the created csv file in Excel
Open the created csv file in Excel

To read a csv file without a header:

    IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFilePathName: csvFileName, hasHeader: false);    

Other specification methods

The character code can be changed (default is UTF8).

    CsvSerializer.Encoding = Encoding.GetEncoding(0);

The delimiter can also be changed (default is ',').

    CsvSerializer.Separator = '\t';

You can also use stream instead of file name.

    using (var stream = new FileStream(csvFileName, FileMode.Create))
        await collection.WriteCsvAsync(stream);

You can leave the stream open after reading or writing by specifying leaveOpen.

    using (var stream = new FileStream(csvFileName, FileMode.Create))
        await collection.WriteCsvAsync(stream: stream, bufferSize: 1024, leaveOpen:true, hasHeader: true);

In addition to asynchronous methods, there are also synchronous methods.

    toDoes.WriteCsv(csvFileName);

NuGet and GitHub

These libraries are open to NuGet and can be installed from Visual Studio.

Source code is available at:

The projects included are:

Shos.CsvHelper

  • CSV library
  • .NET Standard Library version
  • You can build a.NET Standard 1.3 and later
  • .NET Network 4.6 or higher, or.NET Core 1.1 or later for
  • NuGet packages that can be installed: NuGet Gallery | Shos.CsvHelper

Shos.CsvHelper.NetFramework

Shos.CsvHelperSample.NetCore

  • .NET Core Console applications that use the Shos.CsvHelper sample

Shos.CsvHelperSample.NetFramework

  • Using Shos.CsvHelper.NetFramework.NET Framework console application sample

2019年09月24日

最新の C#/.NET を使用するには (2019/09/25版)

※ 「.NET Core 3.0 正式版リリース」の続き。

先日 .NET Core 3.0 が正式にリリースされ、C# 8.0 が使えるようになった。
一方で、.NET Framework の最新版は 4.8 だ (2019/09/25 現在)。

現時点での、最新版の .NET を使用する方法をまとめてみよう。

.NET Framework 4.8 を使うには

下記からインストール。
※ Developer pack と Language pack の両方

.NET Core 3 で開発するには

Visual Studio Installer で Visual Studio 2019 Ver.16.3 以上にバージョンアップ

Blazor WebAssembly (クライアントサイド Blazor: プレビュー版) を試すには

最新版の Visual Studio に Blazor テンプレートのインストールが必要
次を参照

C# 8.0 で開発するには

プロジェクト ファイル (*.csproj など) に <LangVersion>8.0</LangVersion> を記述
(null 許容参照型も有効にするには <Nullable>enable</Nullable> も記述)

例.

  <?xml version="1.0" encoding="utf-8"?>
  <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      ...
      <PropertyGroup>
        ...
        <LangVersion>8.0</LangVersion>
        <Nullable>enable</Nullable>
        ...
    
 

※ .NET Core 3.0 アプリケーションのデフォルトの C# のバージョンは 8.0

参考資料

.NET Core 3.0 正式版リリース

.NET Core 3.0 正式版リリース

昨日 (2019/09/23)、.NET Core 3.0 正式版がリリースされた。

現在これに関連して、.NET Conf 2019 というオンライン カンファレンスが開催されている。
一部は、YouTube で見ることができる。

.NET Core 3.0

Microsoft 製の新たな .NET である .NET Core だが、.NET Core 3.0 では、Windows デスクトップ アプリケーション (Windows Forms と WPF) がサポートされた。

.NET Core 3.0 のためのソフトウェアの開発には、現在 Visual Studio 2019 の最新版である Ver.16.3.0 が必要だ。
Visual Studio Installer からアップデートできる。

但し、現在 .NET Core の Windows Forms のデザイナーには未対応であるようだ。

(なお .NET Core は、最初の .NET である .NET Framework に比べて様々な最適化がなされているため、より高パフォーマンスとなっている)

.NET Core の Roadmap

  • 2019/11 .NET Core 3.1 (LTS : Long Term Support 版)
  • 2020/11 .NET 5

.NET 5 は、.NET Core 3 の次期バージョンだ。

現在 3つある Microsoft の .NET (.NET Framework, .NET Core, Xamarin) が 1 つに統合される予定。
これ以降、.NET Framework は保守のみとなり、新機能は追加されなくなる。

.NET Core 上の C++/CLI

C++/CLI は .NET Core 3.1 でサポートされる予定だ。

Blazor

新たな ASP.NET (.NET での Web アプリケーション プラットフォーム) のフレームワークである Blazor だが、サーバーサイドの Blazor は、既に .NET Core 3.0 でサポートされている。

サーバーサイドの Blazor は、C# と Razor 構文でコーディングでき、クライアント サイドとの同期はフレームワークによって行われる (内部的には JavaScript を用いて SignalR で通信) という技術だ。

クライアント サイド Blazor (Blazor WebAssembly) は、WebAssembly で .NET が動作し、C# のアプリケーションがクライアント サイドの Web ブラウザ上で動作するというユニークなものだが、こちらは、現在まだ Preview 版。
2020年5月のリリースが予定されている。

C#

C#8.0 がリリースされた。
null 許容参照型や非同期ストリームなどがサポートされる。
非同期ストリームでは、非同期型の IEnumerable である IAsyncEnumerable が使われる。

関連記事

2019年07月02日

Microsoft MVP を再受賞しました (My 15th MVP Award from Microsoft)

MVP_Logo_Horizontal_Preferred_Cyan300_CMYK_72ppi.png

Microsoft MVP Award を再受賞しました。15年目になります。

My MVP Profile

  • Microsoft MVP for Development Tools - Visual C# (Jul. 2005 - Dec. 2014)
  • Microsoft MVP for .NET (Jan. 2015 - Oct. 2015)
  • Microsoft MVP for Visual Studio and Development Technologies (Nov. 2015 - Jun. 2018)
  • Microsoft MVP for Developer Technologies (Jul. 2018 - Jun. 2020)

いい歳の大人をこうして褒めてくれるマイクロソフトに感謝です。

Microsoft MVP となって、多くの素敵なITエンジニアの皆様との交流の機会が増えました。 皆様いつもありがとうございます。

2019年06月11日

[Event] de:code 2019 で C# ドキドキ・ライブコーディング対決をやってきました

MW51 | C# ドキドキ・ライブコーディング対決 @ de:code

毎年恒例の BuriKaigi などで4人でやっている C# ライブ コーディングセッションを Microsoft の de:code 2019 でやってきました。

いつもお世話になっているマイクロソフトの井上章 (@chack411) さんのお誘いで実現したものです。 おかげさまでとても素敵な体験になりました。 もちろん、毎回楽しい企画をしてくださる石野 (@AILight) さん、一緒に解答者として登壇した鈴木 (@xin9le) さん、室星 (@RyotaMurohoshi) さん、にも感謝です。

今回は、Blazor を使用したプログラミングがお題で、次の2つをやりました:

  1. C# ライブ コーディング: その場で出たお題「C# で令和表示」を C#/Blazor で
  2. 七並べプログラム対決: 予め用意した「七並べのAI」を当日マージして対戦

「七並べ」対決の私の作戦は次の通りです:

99名の皆様が聴きにきてくださり、大変に盛り上がってくださいました。 本当にありがとうございました!

「MW51 | C# ドキドキ・ライブコーディング対決 @ de:code」 関連記事

当日の盛り上がりの様子の一部は、以下のリンクで読むことができます。

de:code 2019 関連記事

de:code 2019 の動画や資料などはこちらから。 (ただし、我々のセッションのものはありません)

NSAT

アンケート結果の NSAT (Net Satisfaction) がとても良かったので、メモ。

NSAT
講師198
コンテンツ193
全体195

参考: NSAT の求め方
  • Positive の比率 (パーセンテージ) = P
    • 4段階評価、5段階評価の場合: 1番上の評価をした人の比率
    • 10段階評価の場合: 1番上と上から2番目の評価の比率の合計
  • Negative の比率 (パーセンテージ) = N
    • 4段階評価の場合: 下2つの合計
    • 5段階評価の場合: 下3つの合計
    • 10段階評価の場合: 下4つの合計
  • NSAT = P - N + 100 (200点満点、平均100点)

2019年05月07日

Microsoft Build 2019 リンク集 (2019/05/07)

全般

一日目

全般

Azure

Office 365

.NET

ML

Visual Studio

Windows Terminal

Windows の Linux

その他

2019年04月15日

[Event] C# ドキドキ・ライブコーディング対決 @ de:code

MW51 | C# ドキドキ・ライブコーディング対決 @ de:code

毎年恒例の BuriKaigi などで4人でやっている C# ライブ コーディングセッションを Microsoft の de:code 2019 でやります。

2019年04月02日

[Event] 「Global AI Nights in FUKUI」を開催しました

Global AI Nights in FUKUI

[Event] 「Global AI Nights in FUKUI」 (2019年4月2日) を開催しますの続き。

Global AI Nights とは

世界の47会場で、Global AI Nights が開催されています。

日本では、下記3会場で開催されました。

福井会場にも AI に関心の深い参加者が集まり、おおいに盛り上がりました。

キーノート「Global AI Night Keynote April 2019」 (英語)

当日の様子

View this post on Instagram

#GlobalAINight #fukui 会場の福井県産業情報センター。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui スタッフ用のパーカーとTシャツ。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui 始まり。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui 機械学習基礎編。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui ニューラル ネットワークとは。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui 終了。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

#GlobalAINight #fukui Q&A.

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

資料

2019年03月23日

[Event] 『2019 Microsoft MVP Global Summit』に参加してきた | 出発前~ポートランド編 (2019/03/15-17)

2019 MVP Global Summit』に参加する前に、オレゴン州ポートランド(Portland, Oregon)に行ってきた。

ポートランドには 2016年 MVP Global Summit のときから毎年訪れていて、今回で3回目。とても素敵な街だ。

アメリカ合衆国オレゴン州(Oregon)最大の都市で、全米一住みやすい都市と言われている。 シアトルに比べると都市部がこじんまりしている。

次のような特徴がある。

  • 緑にあふれた町並み
  • 住民がフレンドリー
  • 消費税0% (オレゴン州)
  • 飲み物 (珈琲、ビール、ワイン) が美味しい
  • オーガニック フードで有名

出国前からポートランド滞在までを記しておきたい。

1. 出発前

米国でネットに接続する方法は、フリーWiFi、海外Wi-Fiレンタル、国際ローミングなど、いくつかの方法があるが、今回は、MOST SIMT-Mobile 版 を日本の Amazon で購入し、iPhone 6s で使用した。 12日間使い放題で3千円台だった。

日本にいる間に業者にアクティベーションしてもらい、行きの機内で入れ替えた。 SIMカードを取り出すためのピンも付属していた。

特に設定もプロファイルの削除や設定も必要なく、そのまま快適に LTE で接続することができ、とても快適だった。 電話番号や SMS も使え、テザリングも問題なかったのでお薦めだ。

MOST SIM
MOST SIM

PC は、Surface Go を渡米前日にセットアップし、持って行った。 小さくて軽くてとても快適だった。

View this post on Instagram

おや? 何か届いたようだ。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

セットアップ完了。 明日の渡米に間に合った。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

2. 渡米

出発。

View this post on Instagram

ポートランドへ向け出発。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

1週間日本を離れるので。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

今回は Delta。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

3. ポートランド

ポートランド 1日目
View this post on Instagram

ポートランドに到着。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

ポートランドは TrimetPortland Streetcar などの公共交通機関がとても便利で、縦横無尽に走った路面電車やバスなどが一日5ドルで乗り放題になっている (2時間なら2.5ドル)。 今回は、日本の Suica などにあたる hop カードを利用した。

ホテルにチェックインした後、「日本国外にある中でも最も美しく本格的な日本庭園」と言われている Portland Japanese Garden へ行った。

Dossier Hotel
Dossier Hotel
View this post on Instagram

ポートランドの徽軫灯籠 (ことじとうろう)。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

その後は、市内を見て回ったり、スーパーで飲食物を買ったり、夕食に行ったりした。

POWELL'S BOOKS
POWELL'S BOOKS
ポートランド名物のフードカート
ポートランド名物のフードカート

世界のベストビール都市第1位に輝いたポートランドの市内には70以上のブルワリーがあって、その数も世界一だ。

DESCHUTES BREWERY
DESCHUTES BREWERY
DESCHUTES BREWERY
DESCHUTES BREWERY
Rogue Pearl Public House
DESCHUTES BREWERY
View this post on Instagram

クラフトビール王国ポートランドの地ビール。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

ポートランド 2日目

翌朝、毎週土曜日に開催される ポートランド州立大学(Portland State University)Formers Market へ。 市内あちこちで開かれる Formers Market だが、ここのが一番大規模だ。 様々な地元のオーガニック フードなどが楽しめる。

Formers Market
Formers Market
View this post on Instagram

Portland Farmers Market.

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

View this post on Instagram

Portland State University.

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

次に Pioneer Place へ。 ここには、Microsoft StoreApple Store もある。

View this post on Instagram

Microsoft Store.

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

市内を散策。

View this post on Instagram

晴天。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

夕方は、ブルワリーとディスティラリーの見学ツアーに参加。 自分以外はカナダ人4人だった。

View this post on Instagram

WESTWARD WHISKEY の試飲。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

その後は、次の日から一緒に 2019 MVP Global Summit に参加する MVP の杉本さんと一緒に食事をした。

Rock Bottom
Rock Bottom
View this post on Instagram

杉本和也さんと Rock Bottom Brewery で合流。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

ポートランド 3日目

シアトル(Seattle)行きに乗るべくポートランド国際空港(PDX)へ移動。

View this post on Instagram

さてシアトルへ。

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

空港でも DESCHUTES BREWERY のビールを楽しむことができる。

View this post on Instagram

DESCHUTES BREWERY.

Fujio Kojimaさん(@fujiwo)がシェアした投稿 -

※ 続きは、「『2019 Microsoft MVP Global Summit』に参加してきた (2019/03/17-21)」

執筆・講演のご依頼は 執筆・講演のご依頼 まで

2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

アーカイブ

にほんブログ村

にほんブログ村 IT技術ブログへ
Powered by
Movable Type 3.35