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


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


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

[Git Sourth](https://github.com/objcToScript/SqliteTest)

<img width="483" alt="スクリーンショット 2020-04-11 21.51.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/2858ea50-2f24-e65f-e708-72d734c4e126.png">

####開発の流れ

1. DataGridViewとModelのバインディングの実現    [TreeView](https://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/)
- Jestson Nanoへのデプロイの仕方 [MacからRaspberry PiにRealVNCで接続するメモ](https://qiita.com/n0bisuke/items/0ccec7f9ce71ef54ddcc)
- 開発のコツ、デザイナーツールの操作ヒント

####デザインの変更の仕方
MainWindowをクリックするとGUIデザイナーツールが立ち上がります。ツールボックスからパーツをドラッグします。
<img width="954" alt="スクリーンショット 2020-04-12 2.14.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/8a274544-4362-ef9c-8c39-303c1522df28.png">

VBoxの中にFixedを入れた後、Fixedの高さを設定することでボックスの中のレイアウトを調整できます
<img width="768" alt="スクリーンショット 2020-04-18 11.36.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/969429f3-407a-33dd-4933-323bb13d0d2c.png">

#####公式の開発ガイド

[ボタンコントロール](https://www.mono-project.com/docs/gui/gtksharp/widgets/)の解説

[TreeView](https://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/)のコーディングの書き方

####アプリの内容について
Linux上で動くデータを管理するアプリです。一覧 Insert Update Deleteが動作をします。Sqlite3を使っています

####Linuxでの動かし方

[GTKSharp](https://www.mono-project.com/download/stable/#download-lin)をインストールする

gladeをインストールする

```
$ sudo apt-get install glade
```

Linuxに[MonoDevelop](https://www.monodevelop.com/download/#fndtn-download-lin-raspbian)をインストールする

追記 4/14
必ずユーザー設定 ー プロジェクト ー ビルドから
**「xbuildの代わりにMSBuildでビルドする」を無効にすること**

####Microsoft.CSharp.Core.targetsファイルがないエラー

“/home/pi/,cache/MonoDevelop/7.0/MSBuild/1068_1/Microsoft.CSharp.Core.targetsが見つかりませんでした。

と出た場合は

~~ソリューション　ー　参照　ー Microsoft.CSharpを追加や更新~~
~~それでもエラーが出る場合は~~
~~Jetson Nano ー 表示　ー 隠しフォルダを表示する~~
~~MSBuild / 以下複数フォルダがある場合は両方削除する~~
~~再度Microsoft.CSharpを追加~~


追記 4/14
ユーザー設定 ー プロジェクト ー ビルド
エラーが出るので**「xbuildの代わりにMSBuildでビルドする」を無効にする**

<img width="485" alt="スクリーンショット 2020-04-14 11.13.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/644fd7d8-a9e3-46df-df41-58f934762042.png">

https://github.com/mono/mono/issues/14875

>>これは、新しいプロジェクトを開始する前にMonodevelopで行う必要がある設定です。
設定の下で検索し、「xbuildの代わりにMSBuildで作成する」を無効にします

#####Macでは動いたがLinux上で動かなかった時のデバッグの仕方
monodevelopをインストールし立ち上げる

```
$ monodevelop
```

VisualStudioのSINファイルを読み込ませデバッグする
WindowsのVisualStudioSinファイルとMacのVisulStudioファイルは互換性がある

####Jetson Nanoへのデプロイ

1. NetTalkを使いマウントさせる
　sudo apt-get install netatalk
  https://studio.beatnix.co.jp/diary/apple/mac2raspberry-pi/
  https://qiita.com/junkoda/items/d024ee0bf6c50d2f3cc4

2. RealVncを使う

　Jestson NanoにプレインストールされているRealVncを使います。[MacからJestson NanoにRealVncで接続する](https://qiita.com/n0bisuke/items/0ccec7f9ce71ef54ddcc)
　Finderからも接続できますがファイル転送できないため、[RealVncViewr](https://www.realvnc.com/en/connect/download/viewer/)を使って接続します

#####LinuxGUIアプリでのデータバインディングについて
[公式サイト](https://www.mono-project.com/docs/gui/gtksharp/widgets/treeview-tutorial/)にバインディングのやり方が書いてあります

#####バインディング　開発のしやすさ　感想

WindowsFormバインディング > Cococaバインディング >>> Gtkバインディング

|  種類     | 感想                                                             | 
|:-----------------:|:---------------------------------------------------------------|
| WindowsForm | パーツのプロパティウィンドウからクラスプロパティ名を選択　プロパティウィンドウからDBと接続|
| CoCoa　|StoryBoardにでパーツを選択、ArrayControllerなどをセットしDBと接続、パーツのプロパティウィンドウで設定　コーディングも少々 |
| Gtk　| コーディングで実装 |

####Linux上でのファイルの実行の仕方
アイコンファイルをダブルクリックをする
$ mono アプリパス


#####バインディングライブラリ

バインディングをシンプルに生成するライブラリを作りました。

```
void _mkTreeView() {

	Gtk.TreeViewColumnEx artistColumn = new Gtk.TreeViewColumnEx();
	artistColumn._mkCellRendererText();
	artistColumn.Sizing = TreeViewColumnSizing.Fixed;
	artistColumn.FixedWidth = 200;
	artistColumn.Title = "Artist";
	artistColumn.bindingPropertyName = "Artist";

	treeview.AppendColumn(artistColumn);

	artistColumn._mkBinding();

	this.ShowAll();

}
```
[TreeViewColumnEx](https://github.com/objcToScript/SqliteTest/blob/master/treeViewTest2/TreeViewColumnEx.cs)
####ファイルのバンドル化

monoをインストールしなくても実行するやり方があるようです。dllをバンドルして配布できるようです。
.dmg形式にするやり方があるみたいです。
http://wraikny.hatenablog.com/entry/2018/03/29/225021
https://qiita.com/econa77/items/d0e7d3a75d8fd3bb7777

####exeの暗号化
[.NETプログラムの難読化ツールの紹介と使ってみた](https://rabbitfoot.xyz/code-obfuscation/)

以前Babelを買ったことがあり、無難に動作し価格もお手頃でした。

####Sqliteの暗号化
[sqlcipher](https://www.zetetic.net/sqlcipher/)

sqlcipherというソフトがあり、オープンソースから実装すれば無料で利用できます。

[SQLite3 DBをファイルごとパスワード暗号化・復号する](https://qiita.com/v2okimochi/items/e83a04b952b44c907de2)
####感想
GUIを使って簡単にデータアプリを作ることができました
treeViewやバインディングについてはWindowsやCocoaの方が開発しやすい。

GTKでも何か便利な作り方があれば教えてください。

####開発、デザイナーツールの操作のコツ

#####イベントハンドラーメソッド文はClickedを押すと自動生成される
<img width="300" alt="スクリーンショット 2020-04-10 19.13.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/7854ad45-07f2-6956-e601-7286e7770621.png">

#####ドキュメントアウトラインを表示すると便利
<img width="517" alt="スクリーンショット 2020-04-10 19.12.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/4065f6d6-d6f9-0763-6657-7eaa4d3c8140.png">
#####VBoxとHBoxを使ってレイアウトし、中にボタンやTreeViewを配置していく
[公式動画](https://www.youtube.com/watch?v=yQihbDcnmNA)にレイアウトを作成していく解説があります
<img width="501" alt="スクリーンショット 2020-04-10 19.24.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/94511d7a-468a-7371-a762-170f7fb956cf.png">

#####FatViewController対策　partialクラスを使いクラスをカテゴリー分けした
<img width="509" alt="スクリーンショット 2020-04-10 19.15.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/8add45e8-6e10-9860-0d26-fbb2c9c69cd8.png">


#####GTkのサンプルはhotexamplesというサイトでGitに上がっているソースを調べられる
gitから上がっているソースを一覧でてきます
####*c# gtk hotexamples メソッド名など*で検索
<img width="500" alt="スクリーンショット 2020-04-09 21.29.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182324/2178d832-6fc8-a363-9764-68e3da3083b0.png">

このようにGitHubのGTKのソースを閲覧できるサイトを見つけた

#####Sqliteの管理ソフト

有料ではありますが便利なソフトです

[Sqlite管理](https://www.navicat.com/en/products/navicat-for-sqlite)

#####使用を考えている用途
Raspberry Pi上でデータベースアプリとしての利用を考えています。
センサーの取ってきた情報を一覧で表示したり、送信したり、管理アプリを考えています

C#側
データベースアプリ Sqlite3を利用する
Swagger CodegenでAPIクライアントソースの書き出し
Tensorflow(C#のGPU版は速度が速い)
OpenCVのC#版
picameraのC#版
サードパーティへのWebAPI通信ライブラリー Swaggerを併用
IO関連
pythonスクリプトの実行

Python側
pythonが書かれた各種センサーはpythonで書きます
IO関連

センサーもC#で書かれたものがあればC#で書きます


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