rksoftware

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

JXUG 初心者向けXamarinハンズオン にメンターとして参加してきました

先日開催された JXUG 初心者向けXamarinハンズオン にメンターとして参加してきました。

当日は大きな問題もなくそつなく進行しました。環境周りは iOS の方々で多少てこずったようでしたが、そつなく整ったようです。
参加者に対して十分な人数のメンターがいたことも良かったかもしれません。

今回も素晴らしいイベントでした。主催、スタッフ、メンターそして参加者の皆様ありがとうございました。

■ Face API

進行が良かったので、ハンズオンテキストでは宿題となっている部分まで進めることができました。
ハンズオンはその会ごとに(一番影響があるのは人数、特にメンター1人当たりの参加者の数)進行速度が変わるので、宿題を用意しておいて早く進んだ時には宿題までやってしまうのは良いですね!
今後取り入れてみたいです。

結果の一例

// パラメータ設定
const string subscriptionKey = "<SubscriptionKey>;
const string faceEndpoint = "https://westcentralus.api.cognitive.microsoft.com";
FaceAttributeType[] faceAttributes =
    { FaceAttributeType.Age, FaceAttributeType.Gender, FaceAttributeType.Emotion };

// FaceClient の準備
FaceClient faceClient = new FaceClient(
        new ApiKeyServiceClientCredentials(subscriptionKey),
        new System.Net.Http.DelegatingHandler[] { });
faceClient.Endpoint = faceEndpoint;

// API 呼び出し, 結果取得
IList<DetectedFace> faceList =
    await faceClient.Face.DetectWithUrlAsync(
        speaker.Avatar, true, false, faceAttributes);

// 結果から一件目を取り出し表示値を作成, 結果がなければ代替テキスト
var face = faceList.Select(f => f.FaceAttributes)
                   .Select(f => new { f.Age, f.Gender, Happiness = f.Emotion?.Happiness * 100d })
                   .FirstOrDefault();
string age = face?.Age.ToString() ?? "none";
string gender = face?.Gender.ToString() ?? "none";
string happiness = face?.Happiness.ToString() ?? "none";

// Alert 表示
await DisplayAlert("face", $"Age:{age}, Gender:{gender}, Happiness:{happiness}", "OK");

サンプルコードをもとに当日皆で書いたコードをもとにしています。

■ Xamarin 学習のサポート

JXUG イベントでも他のイベントでも Xamarin 学習をサポートは継続して活動して行くつもりです。
是非 connpass 等チェックしてみてください。

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

■ C# もくもく会

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

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20181116200119j:plain

■ 今週の成果発表

今週も成果を出された方の多い会でした。

  • InteliJ をアップデートして Kotlin で Hello world しました
  • Alexa スキルでつかうダイナモDBを準備しました
  • 研究のためのキーワードを教わったので調べました
  • ゲームのシーンを一つ作りあげました

ちなみに本会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/11/22 に開催予定です。

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

クエリ内の "" について (PostgreSQL を .NET Standard から扱う)(2)

以前に PostgreSQL を .NET Standard から扱う記事を書きました。

その際、Select クエリの中でテーブル名を "" で囲んでいました。こうしないと大文字が混ざるテーブル名の場合に

ERROR: 42P01: relation "public.テーブル名" does not exist

とエラーになって実行できませんでした。小文字で構成されたテーブル名の場合は "" は不要です。例えばテーブル名が SampleTable では "" が必要ですが、sample_table であれば不要です。

ASP.NET MVC にコントローラーを追加する(Razorページ) (2)

以前に ASP.NET MVC に別アセンブリでコントローラーを追加する(Razorページ)記事を書きました。

概要としては

  • ASP.NET MVC プロジェクトにルート設定があり
  • そのルート設定に合ったコントローラークラスを別アセンブリ上に作成
  • 実行環境にアセンブリを配置
  • 実行環境の Views フォルダの適切な位置に .cshtml を配置

■ .cshtml を配置するディレクトリを変えたい

ASP.NET MVC プロジェクトに手を入れずに、Controller クラス + .cshtml を追加するので、可能であれば .cshtml を配置するフォルダをトップレベルのフォルダから分けたい。そう考えました。実現には Controller の名前から cshtml が自動で読まれるパスとは異なるパスをどこかで設定する必要があります。そのための View メソッドのオーバーロードが Controller クラスにあります。

using System.Web.Mvc;

namespace WebApplication2.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View("../../Views2/Home3/About");
        }
    }
}

これで、~/View2/Home3/ 配下の About.cshtml が使われます。

Web.config を配置

ただし、ただフォルダを作って .cshtml を置いただけでは動作しませんでした。
~/Views/Web.config ファイルを ~/Views2/ へコピーしました。これがないと実行時に

CS0103: The name 'ViewBag' does not exist in the current context

といったエラーになります。

ASP.NET MVC にコントローラーを追加する(Razorページ)

以前に ASP.NET MVC に別アセンブリでコントローラーを追加する記事を書きました。

概要としては

  • ASP.NET MVC プロジェクトにルート設定があり
  • そのルート設定に合ったコントローラークラスを別アセンブリ上に作成
  • 実行環境にアセンブリを配置

というものでした。
今回は、その追加するコントローラーで View に Razore ページを使ってみます。

■ コントローラークラス

using System.Web.Mvc;

namespace WebApplication2.Controllers
{
    public class Home2Controller : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }
    }
}

.cshtml

@{
    ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>
<h3>@ViewBag.Message</h3>

<p>Use this area to provide additional information.</p>

■ Razor ページの配置場所

追加するコントローラークラスのある別アセンブリ内に Razor ページを置いてビルドしてもうまくいきません。
追加するコントローラークラスが ASP.NET MVC プロジェクト内にあったとした場合に、Razor ページがあるべき場所に配置されていないと読まれません。

例えば

Home2Controller クラスを追加する場合、ASP.NET MVC プロジェクト内の Views/Home2/ フォルダ内に配置します。

ひとまずこれで、Razor ページを使うコントローラーを ASP.NET MVC プロジェクトに手を加えずに追加することができました。

PostgreSQL を .NET Standard から扱う

PostgreSQL からデータを Select する .NET Standard 2.0 ライブラリを作ってみます。
作ったライブラリは mac 上の .NET Core コンソールアプリから呼び出して動作確認してみました。

■ 実行結果

コンソールアプリなので、ターミナルにデータが表示されるだけの寂しい実行結果です。
f:id:rksoftware:20181111175641j:plain

■ コード

まずはコードです。

using System;
using System.Data;

namespace pgNetStandard
{
    public class Class1
    {
        public void Test(){
            var dt = new DataTable();
            using (var pgConnection = new Npgsql.NpgsqlConnection(
                "Server=サーバーアドレス;Port=ポート;Database=データベース名;User Id=ユーザーID;Password=パスワード;"))
            using (var pgCommand = pgConnection.CreateCommand())
            {
                pgConnection.Open();
                pgCommand.CommandText = "SELECT * FROM スキーマ.\"サンプルテーブル名\"";
                dt.Load(pgCommand.ExecuteReader());
            }
            foreach(DataRow row in dt.Rows)
                Console.WriteLine($"{row[0]}, {row[1]}");
        }
    }
}

呼び出す .NET Core コンソールアプリ側です。

namespace pg
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            new pgNetStandard.Class1().Test();
        }
    }
}

■ 参照アセンブリ

.NET Standard ライブラリプロジェクトには Npgsql.dll アセンブリを追加しています。
Npgsql は次のサイトからダウンロードできます。
http://pgfoundry.org/projects/npgsql

■ 環境の準備

順番が前後しますが以降が環境の準備手順です。

■ PostgreSQL のインストール

まずは、「日本PostgreSQLユーザ会」のサイト ( https://www.postgresql.jp/ ) からスタートです。

ようやくここでインストーラをダウンロードできます。
postgresql-11.1-1-osx.dmg がダウンロードされるのでダブルクリックします。
postgresql-11.1-1-osx.app が出て3来るのでダブルクリックします。
ウィザード形式のインストーラが起動するのでポチポチ設定して行きます。

  • 「Installation Directory」→デフォルト
  • 「Select Components」→デフォルト
  • 「Data Directory」→デフォルト
  • 「Password」→適当に入力
  • 「Port」→デフォルト
  • 「Advanced Options」「Local」→[Default locale]

■ 参照アセンブリのインストール

まずは、「日本PostgreSQLユーザ会」のサイト ( https://www.postgresql.jp/ ) からスタートです。

ようやくここでライブラリをダウンロードできます。
Npgsql-2.2.3-net45.zip がダウンロードされるので解凍します。中に Npgsql.dll があるのでこれを参照します。

他に Npgsql.EntityFramework.dll もあるので EntityFramework を使用するときに使えるのだろうと思います。

■ 管理ツールのインストール

まずは、「日本PostgreSQLユーザ会」のサイト ( https://www.postgresql.jp/ ) からスタートです。

ようやくここでインストーラをダウンロードできます。
pgadmin4-3.5.dmg がダウンロードされるのでダブルクリックします。
pgAdmin 4.app が出て3来るのでダブルクリックします。
ウィザード形式のインストーラが起動するのでポチポチ設定して行きます。

特別な設定するもののなく完了します。
インストール後自動で起動しますが、Launchpad に pgAdmin 4 が生まれるのでこれで起動できます。

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

■ C# もくもく会

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

C# もくもく会 は東京の秋葉原で毎週木曜日に開催している .NET 系の勉強会です。
もくもく自習を基本とし、分からないことを教えあったり情報共有したりしている会です。 定期開催していますので、お時間のある時に遊びに来ていただければと思います。
ちょっと詰まった時、ネット上で聞くのははずかしいなぁ、という課題のできた時などにも思い出していただけると嬉しいです。
f:id:rksoftware:20181111145925j:plain

■ 今週の成果発表

今週は成果を出された方の多い会でした。

  • C# ダイナモDBにテーブルを作りました
  • C# のコードの高速化を検討しました
  • AzureDevOps テストが走ってないので調査をしました

ちなみに本会ですが、実は公序良俗に反しなければどのような技術を扱っても大丈夫です。そもそも C# エンジニアが C# だけしか使わないというわけではありませんし。

■初心者歓迎

このもくもく会には、入門者の方も多くご参加いただいています。 突然 C# やらなければならなくなって途方に暮れている方、何となく C# をやってきたけど改めて見直してみたい方なども大歓迎です。
入門セミナー代わりでのご参加も歓迎です。プログラミング入門者の方も是非遊びに来てください。

特に C# で課題をお持ちでなくても是非遊びに来てください。

■ 目指す勉強会スタイル

世界一敷居の低い勉強会を目指しています。

何か聞きたいことがある場合は、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

何か共有したい情報を見つけた場合も、聞く相手を決めずに独り言のようにつぶやくと誰かが拾ってくれる

そんなスタイルでやっています。

■ 次回予定

次回は 2018/11/15 に開催予定です。

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