『2018 Microsoft MVP Global Summit』に参加してきた (2018/03/04-08)
※ 「『2018 Microsoft MVP Global Summit』に参加してきた | 出発前~ポートランド編 (2018/03/02-04)」の続き。
『2018 MVP Global Summit』に参加してきた。
12回目の参加となる。
マイクロソフト には、MVP (Microsoft Most Valuable Professional) というアワードがあるが、約1年に一度、世界中の MVP が米国ワシントン州レドモンドにあるマイクロソフト本社およびその近くに招待され、大規模な技術カンファレンスが行われる。
今回も、2000名以上の MVP (および Regional Directors) が参加した。
たくさんのセッションでマイクロソフトのプロダクト チームの方々から直に話を聴くことができた。 また、マイクロソフトの方や世界中の MVP と交流を持つことができた。 貴重な機会をいただいて、本当に感謝している。
4. ベルビュー およびレドモンド (ワシントン州シアトル近郊)
ベルビューおよびレドモンド 一日目
ポートランド空港で高橋 明夫さんと偶然合流。一緒にシアトル行きのDeltaに搭乗した。
— Fujio Kojima (@Fujiwo) 2018年3月4日
Just landed at SEA-TAC airport!
— Fujio Kojima (@Fujiwo) 2018年3月4日
シアトル・タコマ国際空港から、ベルビューのホテルへは、2人でタクシーで移動した。
ベルビューで宿泊したホテル「Hyatt Regency Bellevue」
ホテルにチェック イン。 ここは、近年毎年のように来るホテル。
MVP Global Summit のレジストレーション。
ベルビューにあるショッピングモール「ベルビュー スクエア (Bellevue Square)」
Amazon の実店舗「Amazon Books」。
ホテル近くのスーパー マーケット「QFC (Quality Food Centers)」
時差ボケ対策用に、メラトニンを購入。 日本では製造・販売されていない。
夜は、いくつかのパーティーに参加後、バーで友人と飲んだ。
@Fujiwo and I at #MVPSummit2018 pic.twitter.com/w0AJqQllre
— Dave Berry (@crmentropy) 2018年3月5日
ベルビューおよびレドモンド 2日目
マイクロソフト キャンパス (Microsoft Campus)
マイクロソフト本社の広大な敷地内にあるカンファレンス センターなどで、たくさんの本格的な技術セッションが3日間に渡り、英語で行われる。 セッション内容は秘密保持契約の関係で公開できないため、以下は差しさわりのない食事の風景などに限られる。
バッジをもらった。
カフェラテやカプチーノに好きなイメージをプリントできる機械があった。
マイクロソフト ビジター センターに行った。 また、この近くに Microsoft Company Store もあり、マウスなどを購入した。
ランチ タイム。
ベルビューおよびレドモンド 3日目
C# の父にして、Turbo Pascal、Delphi、TypeScript の開発者アンダース・ヘルスバーグ (Anders Hejlsberg) に再会。
夕方の立食パーティー。
パーティーの後、牡蠣を食べにいった。
ベルビューおよびレドモンド 4日目
MVP Global Summit 中の朝食はホテルでとった。
キャンパス内にある Microsoft Treehouse を見に行った。 昨年できたばかりだとか。
ランチ。
ベルビューでは、毎晩様々なパーティに参加した。
関連記事
- MVP Global Summit 2018 に参加してきた。又の名をシアトル食い倒れ日記 | くうと徒然なるままに
- MVP Global Summit 2018に参加してきました | kkamegawa's weblog
- Microsoft MVP Global Summit に参加しました | メモログ
- 今年もシアトルに行ってきた話 | しばやん雑記
- Microsoft MVP Global Summit 2018 に参加してまいりました | スタッフブログ
- Microsoft MVP Global Summit — 2018 | David Pine | Medium
- Attending the Microsoft MVP Global Summit 2018 | Working Hard In IT
- Road to my first MVP Global Summit at Microsoft 2018! See you in Redmond, WA | Esteban Solano G.
- First-Timer at the MVP Global Summit 2018 | dotnetvibes
- Microsoft Global MVP Summit Archives | Thomas Maurer
- MVP Global Summit March 2018 | EXCHANGEITPRO.COM
- It’s Time to Take Off To The #Microsoft MVP Global Summit 2018 #MVP #MVPSummit #MVPbuzz | CHARBEL NEMNOM MVP | Cloud & Datacenter Management
- Bunifu CTO to attend Microsoft’s MVP Global Summit – 2018 | Bunifu Technologies
- Jakub Skałbania at the MVP Global Summit 2018
※ 続きは、「『2018 Microsoft MVP Global Summit』に参加してきた | シアトル~帰国編 (2018/03/08-10)」。
『2018 Microsoft MVP Global Summit』に参加してきた | 出発前~ポートランド編 (2018/03/02-04)
『2018 MVP Global Summit』に参加する前に、オレゴン州ポートランドに行ってきた。
ここは、2016年 MVP Global Summit のときに訪れて以来、2回目の滞在だったが、とても良いところだった。
全米一住みやすい都市としても知られるポートランドは、アメリカ合衆国オレゴン州最大の都市だが、シアトルに比べてこじんまりしている。
次のような特徴がある。
- 緑にあふれた町並み
- 住民がフレンドリー
- 消費税0% (オレゴン州)
- 飲み物 (珈琲、ビール、ワイン) が美味しい
- シアトル同様雨が多い
出国前からポートランド滞在までを記しておきたい。
1. 出発前
米国でネットに接続する方法は、フリーWiFi、海外Wi-Fiレンタル、国際ローミングなど、いくつかの方法があるが、今回は、T-Mobile SIM を日本の Amazon で購入し、iPhone 6s で使用した。 15日間使い放題で3千円台。
日本にいる間に業者にアクティベーションしてもらい、行きの機内で入れ替えた。 特に設定もプロファイルの削除や設定も必要なく、そのまま快適に LTE で接続することができ、とても快適だった。
電話番号や SMS も使え、テザリングも問題なかったのでお薦めだ。
最近帰国してない。再来週あたり帰国してみるとしよう。
— Fujio Kojima (@Fujiwo) 2018年2月21日
来週オレゴン州に行くので、明日英語をマスターすることにした。
— Fujio Kojima (@Fujiwo) 2018年2月22日
The Countdown Is On – Get Ready for the MVP Global Summit! – Microsoft MVP Award Program Bloghttps://t.co/AkxVeAwJSn
— Fujio Kojima (@Fujiwo) 2018年2月28日
来週シアトル近郊でMVP Global Summitというのがあるのか。参加してみようかな。
気分を盛り上げるため前日にポートランド ビール。
2. 渡米
成田空港へ
— Fujio Kojima (@Fujiwo) 2018年3月2日
上空を羽田へ移動中。
— Fujio Kojima (@Fujiwo) 2018年3月2日
羽田から成田へ移動中...
— Fujio Kojima (@Fujiwo) 2018年3月2日
成田空港
出国した。
— Fujio Kojima (@Fujiwo) 2018年3月2日
搭乗した。ポートランド行きデルタ。
— Fujio Kojima (@Fujiwo) 2018年3月2日
3. ポートランド
ポートランド 1日目
ポートランドはTrimet という公共交通機関が発達していて、移動がとても楽。 MAX ライトレール という電車やバスを大人は1日5ドル、2時間半2.5ドルでいくらでも乗ることができる。 Hop Fastpass という Suica のような非接触型ICカードシステムもあるが、利用しなかった。
iPhone の SIM を日本で買ってアクティベーション済みの T-Mobile のやつに入れ替えた。設定を何もいじらずにそのまま高速通信できてる。電話番号も SMS も使えて快適。
— Fujio Kojima (@Fujiwo) 2018年3月2日
まずはポートランド名物のひとつ珈琲を楽しんだ。 定番の Stumptown Coffee Roasters へ。
ウォーターフロントへ。 世界一小さい公園「Mill Ends Park」があった。
市の中心にあるパイオニア・コートハウス・スクウェア。
ポートランドにはフードカート (屋台) がいっぱいある。
Portland Union Station。 AMTRAK の駅。
Powell's Books。 100万冊を超える本があるというとてもユニークな書店。
70以上のクラフト ビール ブルワリーがあるポートランド。 「世界のベストビール都市」第1位にも選ばれている。 6種類を味見できるトレイが人気。
Deschutes Brewery Portland Public House というバーで、12種類試飲した。 下のメニューの1~6の番号が振ってある2つの列。
こちらは、別のバー Fat Head's Portland のトレイ。
こちらは下のメニューの#1~#5。
ポートランドは本当にビールがうまいので、二次会とかで来ると良いと思う。
— Fujio Kojima (@Fujiwo) 2018年3月3日
あと4時間金曜日。
— Fujio Kojima (@Fujiwo) 2018年3月3日
初日にして、ちょっとしたトラブルも発生。
ポートランドで愛用のカメラとレンズ3個が入ったバッグを失くして、今日訪れたあちこちに電話をかけまくった。今見つかって、ほっとしてるところ。
— Fujio Kojima (@Fujiwo) 2018年3月3日
ポートランド 2日目
ポートランド ファーマーズ マーケット
ポートランド名物のひとつにファーマーズ マーケットがあり、週末には地方の季節ごとの新鮮な食材が並ぶ。 最大規模のポートランド州立大学 で開催されているマーケットに行ってきた。
ポートランド美術館
全米最古の美術館のひとつ (1892年創立) で、3万2千点もの所蔵品があるとても大きな美術館。
ストップモーション・アニメーション映画の製作で有名なライカの展示が見事だった。
ブルワリー ツアーにも参加。
ポートランドでは、Dossier というホテルに2泊したが、ここは夕方にハッピータイムで地ビールがサービスされ、他の宿泊客と交流できる。
なんだかここ数日、渡米する知人が多い気がする。
— Fujio Kojima (@Fujiwo) 2018年3月4日
ポートランド 3日目
ポートランドからシアトル (Seattle)へ移動。
※ 続きは、「『2018 Microsoft MVP Global Summit』に参加してきた (2018/03/04-08)」。
「BuriKaigi2018」 (2018年2月3日)を開催しました
富山県氷見市で、毎年恒例の勉強会「BuriKaigi2018」を開催しました。
78名もの方に参加していただきました。 雪が多い季節にも関わらず、今年も遠方からも多くのスピーカーや参加者の方がいらしてくださいました。 本当にありがとうございました。
当日の盛り上がりは Twitter などで見ることができます。
開催概要
「BuriKaigi2018」 | |
---|---|
日時 | 2018/03/02(土) 13:00-18:30 (終了後懇親会) |
会場 | |
主催・共催 | Hokuriku.NET 北陸エンジニアグループ |
スポンサー | Forkwell |
詳細 | BuriKaigi2018 | connpass |
内容
.NET トラック
タイトル | 概要 | スピーカー |
---|---|---|
「Visual Studio 2017 新機能wrap up」 | VS2017が登場しておよそ1年が経過したので、リリース後に追加された新機能をまとめてみましょう。 | 森 博之 氏 @hiroyuki_mori Microsoft MVP for Visual Studio and Development Technologies |
「Introduction to Xamarin.Forms for MacOS - あるいは UWP から Mac App への布石 -」 | 初めてXamarin.Formsを触ってみたのが2014年3月。 UWP、Android、iOSの他にPreviewでMacOSがあるらしい? ので、ちょっと触ってみたのゆるふわセッション。 |
蜜葉 優 氏 @mitsuba_yu Microsoft MVP for Windows Development |
「ItemsStackPanelの気持ちに寄り添ってパフォーマンスを改善」 | UWPのListViewは ItemsStackPanelがよしなに仮想化してくれます。 ところが、場合によってはうまく仮想化してもらえません。 ItemsStackPanelの気持ちの寄り添って、パフォーマンスを改善してみます。 |
@tmyt Microsoft MVP for Windows Development |
「コントロールベンダー視点での Command Line Interface (CLI)」 | ここ数年?の CLIの隆盛?を UIコンポーネントベンターの一員として10年間在籍している中から考えます。 | 池原 大然 氏 @Neri78 |
「デスクトップ アプリがこの先生きのこるには 2018」 | ここ1年間、著名なデスクトップ アプリがWindowsストアに並ぶなど、UWP以外のWindowsアプリ開発を取り巻く環境が変化しました。 2017年を振り返りつつ、デスクトップ アプリ開発の立ち位置について考えてみます。 |
@Grabacr07 Microsoft MVP for Windows Development Microsoft MVP for Visual Studio and Development Technologies |
「Windows Serverの新しい管理ツールの紹介」 | Windows Serverは、Server Coreで提供されます。 Server Coreは、コンパクトで身軽な反面デスクトップエクスペリエンスが提供されないため手軽なサーバー管理が難しくなります。 オンプレミスの環境であれば、RSATなどを利用できますが、クラウド環境では難しい状況あります。 これらの問題を解決する新しいWebベースのサーバー管理ツール (Honolulu プロジェクト) について紹介します。 |
澤田 賢也 氏 @masayasawada Microsoft MVP for Cloud and Datacenter Management |
「見える化、言える化、やりきれる化! Dynamics365 北陸へ拡散」 | 吉島 良平 氏 @navisionaxapta Microsoft MVP for Business Solutions 杉本 和也 氏 @sugimomoto Microsoft MVP for Business Solutions |
|
「C#大好きMVPによるドキドキ ライブ コーディング」 | 石野 光仁 氏 @ailight Microsoft MVP for Visual Studio and Development Technologies 鈴木 孝明 氏 @xin9le Microsoft MVP for Visual Studio and Development Technologies 小島 富治雄 氏 @Fujiwo Microsoft MVP for Visual Studio and Development Technologies 室星 亮太 氏 @ryotamurohoshi Microsoft MVP for Visual Studio and Development Technologies |
|
Java 他トラック
タイトル | 概要 | スピーカー |
---|---|---|
「JavaOne 2017フィードバック - JDKリリースモデル変更とJava EEのEclipse Foundationへの移行」 | 昨年10月初旬に開催されたJavaOne 2017はJava SE 9とJava EE 8が大きなテーマでしたが、開催に合わせて重要な発表が2つありました。 このセッションでは、その2つの発表 - JDKリリースモデル変更とJava EEのEclipse Foundationへの移行、EE4Jプロジェクトの設立について、その内容をご説明します。 今後Javaの活用がどう変わるのかがわかります。 |
伊藤 敬 氏@itakash Oracle |
「モジュール移行の課題と対策」 | Java SE 9で導入されたProject Jigsawにより、JARファイルの扱いの煩雑さから解放されました。 その一方でモジュールを使用していないアプリケーションであっても、モジュール導入の影響によりビルドできなかったり、動作しなかったりする問題があります。 また、モジュールを導入するにしても、現状ではモジュールに対応したライブラリと非モジュールのライブラリを併用しなくてはなりません。 本セッションではモジュールについて説明し、モジュールを使用する際の課題とそれに対する対応についても解説していきます。 |
櫻庭 祐一 氏@skrb |
「Running Kubernetes on Azure(仮)」 | Azure 上で Kubernetes の動かし方 Docker などのコンテナに興味のある方向け。 | 山本 誠樹 (やまもと まさき) 氏 @nnasaki Microsoft MVP for Microsoft Azure |
「日本語入力の落とし穴」 | 日本語を受け取るアプリケーションがおちいりがちな落とし穴について紹介する。 「テキスト入力をハンドリングするアプリケーションを作る人」「日本語入力がうまくできないアプリケーションを修正したい人」「独自の日本語入力を作りたい人」などに役に立つと思う。 |
@mzp |
日本語入力の落とし穴 #burikaigi | みずぴー日記 | ||
「JetBrainsでもっと楽しくコーディング、ワークフロー」 | IDEベンダとして有名なJetBrainsですが、IDEのみならずチームツールもリリースしています。 JetBrainsのIDEはもちろんのこと、10名までは無償で使えるチームツールを組み合わせたワークフローまでご紹介いたします。 |
山本ゆうすけ氏 @yusukey 株式会社サムライズム |
「Excel芸2018」 | Scalaは関数型プログラミングもできる、マルチパラダイムなプログラミング言語です。 本発表では、関数プログラミングによって何ができるようになるかを、SIerにとってなじみが深いであろう話題を交えて紹介します。 |
Excel絶対殺すマン @bleis |
「Asciidocの紹介」 | 文書は気楽に記述でき、バージョン管理しやすいと便利です。 今回はソフトウェア開発者が記述するような文書のために開発されたAsciidocというツールを紹介します。 Javaさえ入っていれば使えるので、Windowsでも気軽に使うことができます。 セッションでは、環境構築から文法、そして便利な周辺ツールなどを紹介します。 Learning Object Asciidocによる文書管理 Groovyによるハック |
@kyon_mm |
LT (ライトニングトーク)
タイトル | スピーカー | |
---|---|---|
スポンサービデオ | Forkwell | |
リモートデスクトップエンジニアの生態2018 | 金子雄一 氏 @oskaneko Microsoft MVP for Enterprise Mobility |
|
Office 365ってな~に? 最新のWindowsでOffice製品を適切に使うために知っていて欲しい3つのこと |
さくしま たかえ 氏 @RamuMystery Microsoft MVP for Windows and Devices for IT Windows Insider MVP |
|
データプラットフォーム最新情報をざっくり | 山本 美穂 氏 @mihochannel 日本マイクロソフト株式会社 |
|
とあるマーケティング部隊とエンジニアとScalaの導入 | @grimrose | |
とあるマーケティング部隊とエンジニアとScalaの導入 | GitHub |
懇親会
翌日のUFOツアー
参加レポート
- BuriKaigi2018が開催されました | 世の中は不思議なことだらけ
- BuriKaigi2018に行ってきた! #BuriKaigi | 僕はここだ!
- BuriKaigi2018 に参加してきました #burikaigi | open build/reports/life/index.html
- BuriKaigi2018 | hikaruworld | Medium
- ぶりかえり2018 | hikaruworld | Medium
- イベント参加報告:BuriKaigi2018 | 株式会社パシフィックビジネスコンサルティング
- Burikaigi 2018に参加してきました。イベントレポート | Morning Girl
- BuriKaigi2018 に参加してきた | 混沌とした備忘録
Playing C♯
※ C# Advent Calendar 2017 の12月23日の記事。
- 前の日の記事: OverrideXml | 浮遊島
- 次の日の記事: Eto.Forms の安定したGUI操作 (GTK対策) | ごった日記
過去の C# Advent Calender の記事:
- 「C# Advent Calender 2012」 12月25日: [C#][Design Pattern][DynamicObject][dynamic] C# による Observer パターンの実装 その6 - DynamicObject を使ってオブザーバーを作る
- 「C# Advent Calendar 2013」 12月12日: [C#][.NET][Roslyn] メタプログラミング入門 - Roslyn による C# ソースコードの解析と変更
- 「C# Advent Calendar 2014」 12月23日: [C#][式木][LINQ] IQueryable な Twitter のタイムライン クラスと LINQ プロバイダー
- 「C# Advent Calendar 2015」 12月19日: [C#] 浮動小数点数型 double と誤差 ~double の内部表現~
- 「C# Advent Calendar 2016」 12月23日: [C#] Tips: interface と partial class で横断的関心事を分離
今回は、C# で C♯ を演奏してみた、と言いたいだけの記事。
C♯
プログラミング言語である C# は、通常 "C#" と表記し "c sharp" と読む。
※ "C" を進化させた "C++" を更に進化させたという意味の "C++++" が由来、というのも有名な話だ。 これは、C# の父である Anders Hejlsberg 氏から直に聞いたので間違いない。
ご存知の方が多いと思うが、"C#" の # は通常「ナンバーサイン」とか「番号記号」とか「井桁」とか呼ばれるもので、英語圏でも "number" とか "pound" とか "hash" などと発音される。 音楽記号である♯とは別の文字だ。
そして、筆者はよく音楽の演奏をするのだが、C♯ と書かれていれば、それは嬰ハ長調、または、嬰ハの音 (ハ長調のド♯) を表していることが多い。
というわけで (謎)、C# で C♯ を演奏してみたい。
C# で C♯ を鳴らす
C# で音階を演奏するため、2つの方法を試してみる。
C# で C♯ を鳴らす (Beep)
一つ目は、System.Console.Beep(int frequency, int duration) を用いる方法だ。 このメソッドは、音の周波数と長さを渡して演奏するようになっている。
C# で 音名 C♯ の音を鳴らす (Beep)
音は1オクターブ上がると周波数が2倍になる。平均率の場合、音階の中の全部の半音は同じだけ音が上がっていく。 1オクターブは半音12個分だから、半音上がるごとに周波数は「2の1/12乗」倍になる計算だ。 全音上がるごとだと「2の1/6乗」倍。
なので、C# で音名 C♯ の四分音符を演奏すると、例えば次のようになる。
using System; static class MusicalScale { public static double A4Frequency { get; set; } = 440.0; // ベースとなる音 A4 (デフォルトは440Hz) // 平均律 (equal temperament) | Wikipedia // https://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E5%BE%8B // 1オクターブ (6音) で周波数が2倍になり、半音ごとに周波数は「2の1/12乗」倍になる public static double EqualTemperamentFrequency(double relativePositionInScale /* ベースとなる音 A4 から何音上か */) => A4Frequency * System.Math.Pow(2.0, relativePositionInScale * 2.0 / 12.0); } // 音符の長さ enum Duration { Whole = 1600 , // 全音符 Half = Whole / 2, // 二分音符 Quarter = Half / 2, // 四分音符 Eighth = Quarter / 2, // 八分音符 Sixteenth = Eighth / 2, // 十六分音符 } class Program { const double relativePositionOfCSharp = -4.0; // C♯(嬰ハ) は A(イ) より4音下 static void Main() { PlayCSharpNote(); Console.ReadKey(); } // 音名 C♯ の音を演奏 (Beep で) static void PlayCSharpNote() => Beep(frequency: MusicalScale.EqualTemperamentFrequency(relativePositionOfCSharp), duration: Duration.Quarter); // 指定された周波数/長さの音を鳴らす static void Beep(double frequency, Duration duration) => Console.Beep(frequency: (int)System.Math.Round(frequency), duration: (int)duration); }
実行すると、C♯ が聞こえてくる。
C# で C♯ の音階を平均率で演奏する (Beep)
この要領で、平均律で C♯ の音階 (嬰ハ長調のドレミファソラシド) を演奏してみよう。
using System; using System.Collections.Generic; static class EnumerableExtentions { public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action) { foreach (var element in @this) action(element); } } static class MusicalScale { public static double A4Frequency { get; set; } = 440.0; // ベースとなる音 A4 (デフォルトは440Hz) // 平均律 (equal temperament) | Wikipedia // https://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E5%BE%8B // 1オクターブ (6音) で周波数が2倍になり、半音ごとに周波数は「2の1/12乗」倍になる public static double EqualTemperamentFrequency(double relativePositionInScale /* ベースとなる音 A4 から何音上か */) => A4Frequency * System.Math.Pow(2.0, relativePositionInScale * 2.0 / 12.0); } // 音符の長さ enum Duration { Whole = 1600 , // 全音符 Half = Whole / 2, // 二分音符 Quarter = Half / 2, // 四分音符 Eighth = Quarter / 2, // 八分音符 Sixteenth = Eighth / 2, // 十六分音符 } class Program { const double relativePositionOfCSharp = -4.0; // C♯(嬰ハ) は A(イ) より4音下 static void Main() { //PlayCSharpNote(); PlayCSharpEqualTemperament(); Console.ReadKey(); } //// 音名 C♯ の音を演奏 (Beep で) //static void PlayCSharpNote() // => Beep(frequency: MusicalScale.EqualTemperamentFrequency(relativePositionOfCSharp), duration: Duration.Quarter); // C♯ の音階を演奏 (平均律を Beep で) static void PlayCSharpEqualTemperament() => new[] { 0.0, 1.0, 2.0, 2.5, 3.5, 4.5, 5.5, 6.0 } // ドレミファソラシドの各音がドから何音離れているか .ForEach(note => Beep(frequency: MusicalScale.EqualTemperamentFrequency(note + relativePositionOfCSharp), duration: Duration.Quarter)); // 指定された周波数/長さの音を鳴らす static void Beep(double frequency, Duration duration) => Console.Beep(frequency: (int)System.Math.Round(frequency), duration: (int)duration); }
C# で C♯ の音階を純正率で演奏する (Beep)
純正率でもやってみよう。
純正率では各音が単純な整数比になるため、和音にしたときに平均律のようにわずかな周波数のずれからくるうなりが生ずることがなく、綺麗にハモれる。
詳細は省略するが、純正率では、ドレミファソラシドの周波数が、それぞれ、1/1、9/8、5/4、4/3、3/2、5/3、15/8、2/1 となる。
これを踏まえて、C# で書いてみる。
using System; using System.Collections.Generic; using System.Linq; static class EnumerableExtentions { public static void ForEach<T>(this IEnumerable<T> @this, Action<T> action) { foreach (var element in @this) action(element); } } static class MusicalScale { public static double A4Frequency { get; set; } = 440.0; // ベースとなる音 A4 (デフォルトは440Hz) // 純正律の場合の各音 (ドレミファソラシド) の相対的な周波数の倍率 readonly static double[] JustIntonationRelativeFrequencyScales = new[] { 1.0 / 1.0, 9.0 / 8.0, 5.0 / 4.0, 4.0 / 3.0, 3.0 / 2.0, 5.0 / 3.0, 15.0 / 8.0, 2.0 / 1.0 }; // 平均律 (equal temperament) | Wikipedia // https://ja.wikipedia.org/wiki/%E5%B9%B3%E5%9D%87%E5%BE%8B // 1オクターブ (6音) で周波数が2倍になり、半音ごとに周波数は「2の1/12乗」倍になる public static double EqualTemperamentFrequency(double relativePositionInScale /* ベースとなる音 A4 から何音上か */) => A4Frequency * System.Math.Pow(2.0, relativePositionInScale * 2.0 / 12.0); // 純正律 (just intonation) - Wikipedia // https://ja.wikipedia.org/wiki/%E7%B4%94%E6%AD%A3%E5%BE%8B public static double JustIntonationFrequency(double keynoteRelativePositionInScale, int noteIndex /* ドレミファソラシドの各音のインデックス (0~7) */) => EqualTemperamentFrequency(keynoteRelativePositionInScale) * JustIntonationRelativeFrequencyScales[noteIndex]; } // 音符の長さ enum Duration { Whole = 1600 , // 全音符 Half = Whole / 2, // 二分音符 Quarter = Half / 2, // 四分音符 Eighth = Quarter / 2, // 八分音符 Sixteenth = Eighth / 2, // 十六分音符 } class Program { const double relativePositionOfCSharp = -4.0; // C♯(嬰ハ) は A(イ) より4音下 static void Main() { //PlayCSharpNote(); //PlayCSharpEqualTemperament(); PlayCSharpJustIntonation(); Console.ReadKey(); } //// 音名 C♯ の音を演奏 (Beep で) //static void PlayCSharpNote() // => Beep(frequency: MusicalScale.EqualTemperamentFrequency(relativePositionOfCSharp), duration: Duration.Quarter); //// C♯ の音階を演奏 (平均律を Beep で) //static void PlayCSharpEqualTemperament() // => new[] { 0.0, 1.0, 2.0, 2.5, 3.5, 4.5, 5.5, 6.0 } // ドレミファソラシドの各音がドから何音離れているか // .ForEach(note => Beep(frequency: MusicalScale.EqualTemperamentFrequency(note + relativePositionOfCSharp), duration: Duration.Quarter)); // C♯ の音階を演奏 (純正率を Beep で) static void PlayCSharpJustIntonation() => Enumerable.Range(start: 0, count: 8) // ドレミファソラシドの各音のインデックス (0~7) .ForEach(noteIndex => Beep(frequency: MusicalScale.JustIntonationFrequency(relativePositionOfCSharp, noteIndex), duration: Duration.Quarter)); // 指定された周波数/長さの音を鳴らす static void Beep(double frequency, Duration duration) => Console.Beep(frequency: (int)System.Math.Round(frequency), duration: (int)duration); }
C# で C♯ を鳴らす (Microsoft.SmallBasic.Library.Sound.PlayMusic)
もう一つ試そう。 Small Basic の機能を使う方法だ。
そのために、まず Visual Studio から NuGet で "SmallBasicLib" をインストールする。
このライブラリーの機能の一つに、MML (Music Macro Language) を演奏するというものがある。 Microsoft.SmallBasic.Library.Sound.PlayMusic というメソッドを使うことでテキストで記述された旋律を演奏できる。
これを使って、平均律で C♯ の音階 (ドレミファソラシド) を演奏してみよう。 詳しい MML の記述方法は、下記ソースコードのコメントを見てほしい。
C# で C♯ の音階を平均律で演奏する (Microsoft.SmallBasic.Library.Sound.PlayMusic)
using Microsoft.SmallBasic.Library; using System; class Program { static void Main() { PlayCSharpMusic(); Console.ReadKey(); } // C♯ の音階を演奏 (平均率を Small Basic Library で) static void PlayCSharpMusic() => // C♯ (嬰ハ長調) | Wikipedia // https://ja.wikipedia.org/wiki/%E5%AC%B0%E3%83%8F%E9%95%B7%E8%AA%BF // シャープ7箇所(F, C, G, D, A, E, B) // C♯ D♯ F F♯ G♯ A♯ C C♯ (嬰ハ 嬰二 ヘ 嬰ヘ 嬰ト 嬰イ ハ 嬰ハ) Sound.PlayMusic(notes: "L4 O4 C+ D+ F F+ G+ A+ > C C+"); // Sound.PlayMusic の notes // // C, D, E, F, G, A, B: 音名 // R : 休符 // C+: Cは音名、音を半音上げる (♯) // C-: Cは音名、音を半音下げる (♭) // Cn: n は音の長さ (1: 全音符、2: 二分音符、2.: 付点二分音符、4: 四分音符、4.: 付点四分音符、…) // Ln: n はデフォルトの音の長さ // On: n はオクターブ (デフォルトは4) // > : 1オクターブ上に // < : 1オクターブ下に }
C# で C♯ の曲を演奏する (Microsoft.SmallBasic.Library.Sound.PlayMusic)
実は C♯、つまり嬰ハ長調の曲というのはそんなに多くないのだが、例えば、バッハ の「平均律クラヴィーア 第1巻 プレリュード 第3番 嬰ハ長調 BWV 848」や「前奏曲とフーガ 第3番 嬰ハ長調 BWV 872」などがそうだ。
例えば下記で聴くことができる (執筆時点)。
試しに、一部だけ C# で書いてみよう。 C♯ の響きを雰囲気だけでも味わっていただければ幸いだ。
using Microsoft.SmallBasic.Library; using System; class Program { static void Main() { PlayBWV848(); //PlayCSharpMusic(); Console.ReadKey(); } // バッハ 平均律クラヴィーア 第1巻 プレリュード 第3番 嬰ハ長調 BWV 848 // 雰囲気だけ static void PlayBWV848() => Sound.PlayMusic("L16 O5 E+ C+ > G+ < C+ E+ C+" + "F+ C+ F+ C+ F+ C+" + "G+ C+ G+ C+ G+ C+" + "A+ C+ A+ C+ A+ C+" + "G+ C+ G+ C+ G+ C+" + "F+ E+ D+ E+ F+ D+" + "E+ D+ C+ D+ E+ C+" + "D+ E+ D+ C+ < B+ A+" + "< B+ G+ D+ G+ B+ G+" + "> C+ < G+ > C+ < G+ > C+ < G+" + "> D+ < G+ > D+ < G+ > D+ < G+" + "> E+ < G+ > E+ < G+ > E+ < G+" + "> D+ < G+ > D+ < G+ > D+ < G+" + "> C+ < B+ A+ B+ > C+ < A+" + "B+ A+ G+ A+ B+ G+" + "A+ B > > F+ E+ D+ E+" + "F+ D+ < A+ > D+ F+ D+" + "G+ D+ G+ D+ G+ D+" + "A+ D+ A+ D+ A+ D+" + "B D+ B D+ B D+" + "A+ D+ A+ D+ A+ D+" + "G+ F+ E+ F+ G+ E+" + "F+ E+ D+ E+ F+ D+" + "E+ F+ E+ D+ C+ < B+"); //// C♯ の音階を演奏 (平均率を Small Basic Library で) //static void PlayCSharpMusic() => // // C♯ (嬰ハ長調) | Wikipedia // // https://ja.wikipedia.org/wiki/%E5%AC%B0%E3%83%8F%E9%95%B7%E8%AA%BF // // シャープ7箇所(F, C, G, D, A, E, B) // // C♯ D♯ F F♯ G♯ A♯ C C♯ (嬰ハ 嬰二 ヘ 嬰ヘ 嬰ト 嬰イ ハ 嬰ハ) // Sound.PlayMusic(notes: "L4 O4 C+ D+ F F+ G+ A+ > C C+"); // Sound.PlayMusic の notes // // C, D, E, F, G, A, B: 音名 // R : 休符 // C+: Cは音名、音を半音上げる (♯) // C-: Cは音名、音を半音下げる (♭) // Cn: n は音の長さ (1: 全音符、2: 二分音符、2.: 付点二分音符、4: 四分音符、4.: 付点四分音符、…) // Ln: n はデフォルトの音の長さ // On: n はオクターブ (デフォルトは4) // > : 1オクターブ上に // < : 1オクターブ下に }
『仙台IT文化祭』に参加してきた (2017/10/28-29)
『仙台IT文化祭 2017』に参加してきた。
※ 『C# 大好き MVP による、C# ドキドキ・ライブコーディング!! (出張編)』で登壇。
『仙台IT文化祭 2017』 | |
---|---|
日時 | 2017/10/28(土) - 29日(日) |
場所 | 東北大学川内南キャンパス (C19) 文科系総合講義棟1F&2F (仙台市青葉区川内27-1) |
[Event] 「仙台IT文化祭」10月28日(土)-29日(日)https://t.co/HRsMc5DYSh
— Fujio Kojima (@Fujiwo) 2017年10月6日
一日目に「.NET学科」で登壇予定。仙台がとても楽しみ。 #sendaiitfes
今週末は仙台に行くことにした。30年ぶりくらい。 #sendaiitfes
— Fujio Kojima (@Fujiwo) 2017年10月23日
さて仙台へ。
— Fujio Kojima (@Fujiwo) 2017年10月27日
なんだか仙台に知人が集まってる気がする。
— Fujio Kojima (@Fujiwo) 2017年10月28日
なぜか青葉城恋唄が流れてない。
— Fujio Kojima (@Fujiwo) 2017年10月28日
#sendaiitfes から帰宅した。思ったより仙台近かった。また行きたい。
— Fujio Kojima (@Fujiwo) 2017年10月30日
仙台IT文化祭 「C# 大好き MVP による C# ドキドキ・ライブコーディング (出張編)」 小島の分https://t.co/G4iOroqb6g
— Fujio Kojima (@Fujiwo) 2017年10月30日
公開してます。後悔してません。 #sendaiitfes #s282035
『仙台IT文化祭 2017 #sendaiitfes』
— fullvirtue (@fullvirtue) 2017年10月29日
皆さまのご協力もあって、二日間累計1,343名もの方々にお越しいただきました!
ご来場いただいた皆さま、ご登壇いただいた皆さま、ご支援いただいたスポンサー企業の皆さま、個… https://t.co/SVsUXJURxZ pic.twitter.com/EG3k7xB6H8
関連記事
資料
- 仙台IT文化祭 「C# 大好き MVP による C# ドキドキ・ライブコーディング (出張編)」 小島の分 | slideshare
- C#ドキドキライブコーディング by @RyotaMurohoshi | Speaker Deck
- MixedReality250から見るHoloLensとImmersiveヘッドセットの連携 | slideshare
- HoloLensとさまざまなデバイス連携ドドンドーン | slideshare
- Java SEの現在、過去 そして未来 | slideshare
ビデオ
- 仙台IT文化祭2017 Dynamicsなセッションの歩き方 Part1 #SendaiITFes #RebirthTohoku | YouTube
- 仙台IT文化祭2017 Dynamics なセッションの歩き方 Part2 #SendaiITFes #RebirthTohoku | YouTube
- 仙台IT文化祭2017 Dynamicsなセッションの歩き方 Part3 ちょまど+かずき編 #SendaiITFes #RebirthTohoku | YouTube
- 仙台IT文化祭2017 Dynamicsなセッションの歩き方 Part4 #SendaiITFes #RebirthTohoku | YouTube
- ハッシュタグ #sendaiitfes | Twitter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <1>Day1 午前 | Togetter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <2>Day1 午後 前半 | Togetter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <3>Day1 午後 後半 | Togetter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <4>Day2 午前 | Togetter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <5>Day2 午後 前半 | Togetter
- 2017/10/28(土)~29(日) 仙台IT文化祭 2017 #sendaiitfes <6>Day2 午後 後半 | Togetter
ブログ
Shos.CsvHelper (CSV を読み書きするためのシンプルなライブラリー)
csv (Comma-Separated Values または Character-Separated Values) を読み書きするためのシンプルなライブラリーを書いてみた。
csv 形式のファイルは Excel などで表示/編集することができ、便利なので、そこそこ必要になる。 csv を読み書きするライブラリーは既に他にあるが、よりシンプルな使い勝手を目指してみた。
このライブラリーを使うと、プレーンなオブジェクトのコレクション (IEnumerable<Something>) を csv 形式で読み書きすることができる。
使い方
使い方の概要
まず、何か IEnumerable<TElement> なものを用意する:
// 何か IEnumerable<TElement> なもの IEnumerable<ToDo> toDoes = new ToDoList();
例えばこんなクラス:
class ToDoList : IEnumerable<ToDo> // サンプル コレクション { 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(); }
これを、次のように書きこめる:
const string csvFileName = "todo.csv"; await toDoes.WriteCsvAsync(csvFileName);
出来上がった csv ファイルは次のようになる:
- 値がカンマや区切り文字、改行(<CR>、<LF>)、ダブルクォーテーションを含んでいる場合は、ダブルクォーテーションで囲まれる
- 値の中のダブルクォーテーションは、ダブルクォーテーション2つに置き換わる
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
読みこみは次のような感じ:
IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFileName);
読み書きするもの
コレクションの要素の "get" と "set" の両方を持つ public なプロパティが csv ファイルに読み書きされる。
書きこみ時
書きこみ時には、型を問わず、"ToString()" メソッドで文字列に変換される。
読みこみ時
読みこみ時には、文字列型はそのまま、enum (列挙型) も文字列の通りの値として読みこまれる。 それ以外の型のときは、"TryParse" か "Parse" を使って文字列を値に変更しようとする。 このいずれもできない型は読みこまれない。
"get" と "set" の両方を持っていて、かつ、次のいずれかの型であるプロパティが読みこまれる。
- 文字列型
- enum
- デフォルト コンストラクターを持ち "TryParse" か "Parse" ができる型 (int などの基本的な数値型や DateTime、"TryParse" か "Parse" を持つユーザー定義型)
その他のルール
- [CsvIgnore()] 属性が付けられたプロパティは、読み書きされない
- [ColumnName("列名")] 属性が付けられたプロパティは、csv ファイルでの列名が指定されたものに変更される
例えば、上記 ToDo クラスはこんな型:
// 要素の型のサンプル // 〇 の付いたプロパティ: 読み書きされる // × の付いたプロパティ: 読み書きされない 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")] で csv ファイルでの列名が "Details" に変更される public DaySpan DaySpan { get; set; } // 〇 "Parse" を持つユーザー定義型 ("TryParse" は持たない) [CsvIgnore()] public string Option { get; set; } = ""; // × [CsvIgnore()] が付けられているので無視される public string Version => "1.0"; // × get しかできないプロパティなので無視される }
上記 ToDo クラスで使われているユーザー定義型は次の通り:
// ユーザー定義の enum の例 enum Priority { High, Middle, Low } // "Parse" を持つユーザー定義型 ("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(); }
ヘッダーの有無
csv の読み書きは、ヘッダー部分 (例えば、上記 csv ファイルの一行目) がない場合でも可能になっている。
ただし、ヘッダー部分がある場合は、列が入れ替わっていてもヘッダー部を照合することで読みこみ可能だが、ヘッダー部分がない場合は、列を入れ替えると読みこむことができない。
ヘッダー部分無しでの書きこみの例:
await toDoes.WriteCsvAsync(csvFilePathName: csvFileName, hasHeader: false);
出来上がった csv ファイル:
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
こうしたヘッダー部分の無い csv ファイルを読みこむときは次のようにする:
IEnumerable<ToDo> newToDoes = await CsvSerializer.ReadCsvAsync<ToDo>(csvFilePathName: csvFileName, hasHeader: false);
その他の指定方法
文字コードは変更可能 (デフォルトは UTF8)。
CsvSerializer.Encoding = Encoding.GetEncoding(0);
区切り文字も変更可能 (デフォルトは ',')。
CsvSerializer.Separator = '\t';
ファイル名の代わりに stream も指定できる。
using (var stream = new FileStream(csvFileName, FileMode.Create)) await collection.WriteCsvAsync(stream);
leaveOpen を指定することで、読み書きの後に stream を開いたままにすることもできる。
using (var stream = new FileStream(csvFileName, FileMode.Create)) await collection.WriteCsvAsync(stream: stream, bufferSize: 1024, leaveOpen:true, hasHeader: true);
非同期メソッド以外に同期メソッドもある。
toDoes.WriteCsv(csvFileName);
NuGet と GitHub
各ライブラリーは NuGet に公開されているので、Visual Studio からインストールできる。
ソースコードは次の場所で公開:
含まれるプロジェクトは次の通り:
Shos.CsvHelper
- Csv ライブラリー
- .NET Standard ライブラリー版
- .NET Standard 1.3 以降でビルドできる
- .NET Network 4.6 以降、または .NET Core 1.1 以降対象
- NuGet パッケージとしてインストールできる: NuGet Gallery | Shos.CsvHelper
Shos.CsvHelper.NetFramework
- Csv ライブラリー
- .NET Framework 版
- .NET Framework 4.5.2 以降でビルドできる
- NuGet パッケージとしてインストールできる: NuGet Gallery | Shos.CsvHelper.NetFramework
Shos.CsvHelperSample.NetCore
- Shos.CsvHelper を利用する .NET Core コンソール アプリケーションのサンプル
Shos.CsvHelperSample.NetFramework
- Shos.CsvHelper.NetFramework を利用する .NET Framework コンソール アプリケーションのサンプル
Microsoft MVP を再受賞しました (My 13th MVP Award from Microsoft)
Microsoft MVP Award を再受賞しました。13年目になります。
- 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)
素晴らしい機会とこの機会によって関われた皆様に感謝です。