お手軽Linux(Ubuntu) GUI アプリ開発　初級　前編

##お手軽Linux(Ubuntu) GUIアプリ開発　初級　前編


2021/4月追記
Rider .net5 でのGUI開発に移行しています
[UbuntuとRiderとC# GUIアプリの開発](https://qiita.com/tana_/items/1628c104acb6c937534e)


1. Sqlite3の利用
- Dapperの導入  [Dapperについてまとめてみた](https://sweets-junkie.hatenablog.com/entry/2014/03/07/010004)
- Dapper Extensionの導入 [Dapperの拡張ライブラリ 比較検討](https://www.nuits.jp/entry/dapper-extension-libaries)
- Swaggerを使う Stoplight Studioなどを使う　 [本当に使ってよかったOpenAPI (Swagger) ツール](https://future-architect.github.io/articles/20191008/)
- C#からPythonを実行する   [C#からPythonスクリプトを呼び出す](https://qiita.com/kaysquare1231/items/dfe6064f82c1c23971c6)
- DataGridViewとModelのバインディングの実現  [URL treeView](https://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/)
- Jetson Nanoへのデプロイの仕方

開発はMac上のVisualSudioMacで行います

前編は５まで

[Sample File](https://github.com/objcToScript/SqliteTest/)

#####プロジェクトはGtk#を選択する

[GTK#について](https://github.com/GtkSharp/GtkSharp)

<img width="520" alt="スクリーンショット 2020-04-09 19.34.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/179655bf-5e70-8099-a598-ad42f70de3ac.png">

##### Nugetからパッケージをダウンロードする
<img width="376" alt="スクリーンショット 2020-04-09 19.36.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/32b2acd7-2250-82f1-9eca-cecfb488cca3.png">

######ダウンロードするパッケージ

[Dapperの拡張ライブラリ 比較検討](https://www.nuits.jp/entry/dapper-extension-libaries)

Dapper
DapperExtensions
Mono.Data.Sqliteをダウンロードします。Gtk2#の場合はSystem.Data.Sqliteは読み込めません。

<img width="510" alt="スクリーンショット 2020-04-09 19.10.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/93c04d1b-0ef9-ff8e-f3fc-07660816d5eb.png">

####Dapperを使ったQuery

[Dapper Tutorial](https://dapper-tutorial.net/ja/home)

Queryの結果を自動でモデルに入れることができます。またInsert時Update時に引数代わりにModelを使えます。

```csharp
        static public void _dapperTest() {

            Mono.Data.Sqlite.SqliteConnection connection = new Mono.Data.Sqlite.SqliteConnection();
 
            connection.ConnectionString = @"Data Source=パス/test.sqlite";
            connection.Open();

            var query = "select * from testTable;";

            var result = connection.Query<testTable>(query);
            foreach(var p in result) {
                Console.WriteLine("ID:" + p.test_id + " 名称:" + p.name);
            }

            connection.Close();
        }
```

####DapperExtensionを使ったInsertUpdate処理

ModelからInsert文やUpdate文を自動生成し、処理できます

[DapperExtensionについて](https://github.com/tmsmith/Dapper-Extensions)


書き出されるSql文の形式を変更します

```csharp
DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();
```

```csharp
        static public void _dapperExtensionTest() {

            //Sql文を　[testTable].[test_id]から　[test_id]に変更する
            DapperExtensions.DapperExtensions.SqlDialect = new DapperExtensions.Sql.SqliteDialect();

            Mono.Data.Sqlite.SqliteConnection connection = new Mono.Data.Sqlite.SqliteConnection();

            connection.ConnectionString = @"Data Source=パス/test.sqlite";
            connection.Open();

            //DapperExtensionを使った処理
            testTable testTable1 = new testTable();
            testTable1.name = "aaaaaa111";
            connection.Insert<testTable>(testTable1);

            var query = "select * from testTable;";
            var result = connection.QueryFirst<testTable>(query);

            //DapperExtensionを使った処理
            result.name += "qqqq111";
            connection.Update<testTable>(result);

            connection.Close();

        }
```
testTableモデル

1. モデルにはGetter Setterを**必ず書くこと**

```
 public　class testTable {

	public int test_id { get; set; }

	public string name { get; set; }
 }
```

####Swaggerを自動生成にさせる

Stoplight Studioを使います。APIURLとパラメータを登録していき、Swaggerを自動生成します。

[本当に使ってよかったOpenAPI (Swagger) ツール](https://future-architect.github.io/articles/20191008)

<img width="800" alt="スクリーンショット 2020-04-07 21.53.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/fc698f36-d82c-e310-9a62-db04598fe56a.png">

####Swagger CodegenでAPIクライアント、スタブサーバ、HTML定義書を自動生成する
Swagger Codegenをインストールし、APIクライアントとモデルファイルを指定した言語で書き出します。
テンプレートをカスタマイズしておくと便利です。

[OpenAPI GeneratorでRESTful APIの定義書から色々自動生成する](https://ky-yk-d.hatenablog.com/entry/2019/01/13/234108)
[Swagger Codegen](https://swagger.io/tools/swagger-codegen/)
[Swagger Codegen Git](https://github.com/swagger-api/swagger-codegen)

```
swagger-codegen generate -i http://petstore.swagger.io/v2/swagger.json -l 言語を指定する(csharp) -o 出力ディレクトリ 
```

[swagger 初めて触ってみた](https://qiita.com/TsuyoshiUshio@github/items/50f8b7fe75663e63c968)

####Azureの中で無料製品一覧
[Azure Functions Free](https://azure.microsoft.com/ja-jp/free/)


####開発にあたってのポイント

1. Gtk2#はMono.Data.Sqliteを使う。Dapperと併用できた
2. gtkのサンプルを探すのに苦労した。**C# gtk hotexamples 調べたいメソッド名**で調べるとgitに上がっているサンプルを一覧できるサイトが見つけることができた。
3. モデルにはgetter setterを必ず書くこと

[DataMapping](https://github.com/tmsmith/Dapper-Extensions/tree/master/DapperExtensions.Test/Data)

<img width="506" alt="スクリーンショット 2020-04-09 13.42.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/cd84f602-4e93-7ad1-5991-f2ddf1376ad8.png">

[お手軽Linux(Ubunch) GUIアプリ開発　初級　後編](https://qiita.com/tana_/items/8f6d563fd43289983fa3)
[お手軽Linux(Ubunch) Guiアプリ開発　入門](https://qiita.com/tana_/items/a5e72aa30053a54e931f)
[お手軽Linux(Ubunch) GUIアプリ開発　パーツサンプル集] (https://qiita.com/tana_/items/3114b715586a5f83cd8c)