History of Install CUDA8.0 in Ubuntu16.04-amd64 LTS


http://blog.michinari-nukazawa.com/2017/04/install-cuda80-in-ubuntu1604-amd64-lts.html
の続き。

Web上のCUDA8.0インストール情報、たぶん記憶のママで書いているものが多いのでは。
なのでhistoryを公開します。
無駄なものが滅茶苦茶入っていますし、万が一historyから何か抜けてたら無意味ですが、まあ記憶で書いてる情報よりはマシだと思います。

```
   955  2017-04-20 23:00:17 vim ~/.bashrc
  956  2017-04-20 22:36:19 virtualbox &
  957  2017-04-20 22:38:14 sudo apt-get update && sudo apt-get dist-upgrade -y
  958  2017-04-20 22:47:37 sudo apt install linux-generic
  959  2017-04-20 22:58:06 sudo dpkg -i Downloads/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64.deb
  960  2017-04-20 22:58:36 sudo apt-get update && sudo apt-get dist-upgrade -y
  961  2017-04-20 22:58:54 sudo apt-get install cuda
  962  2017-04-20 23:10:25 cuda-install-samples-8.0.sh cuda
  963  2017-04-20 23:10:28 ls
  964  2017-04-20 23:10:32 cd cuda/
  965  2017-04-20 23:10:38 cd NVIDIA_CUDA-8.0_Samples/
  966  2017-04-20 23:10:51 cat /proc/driver/nvidia/version
  967  2017-04-20 23:11:04 make
  968  2017-04-20 23:18:05 sudo apt-get install freeglut3-dev
  969  2017-04-20 23:18:10 make
  970  2017-04-20 23:19:39 sudo apt-get install mesa-common-dev
  971  2017-04-20 23:20:02 ls bin/
  972  2017-04-20 23:20:03 ls bin/x86_64/
  973  2017-04-20 23:20:05 ls bin/x86_64/linux/
  974  2017-04-20 23:20:06 ls bin/x86_64/linux/release/
  975  2017-04-20 23:20:08 ls bin/x86_64/linux/release/deviceQuery
  976  2017-04-20 23:20:10 bin/x86_64/linux/release/deviceQuery
  977  2017-04-20 23:21:23 find / -name libnvcuvid.*
  978  2017-04-20 23:21:31 ls /usr/local
  979  2017-04-20 23:21:37 ls /usr/local/cuda
  980  2017-04-20 23:21:46 ls /usr/local/cuda/bin/
  981  2017-04-20 23:21:54 env
  982  2017-04-20 23:22:01 env | grep PATH
  983  2017-04-20 23:22:30 ls /usr/local/cuda-8.0/lib64
  984  2017-04-20 23:27:04 make
  985  2017-04-20 23:28:29 ls /usr/local
  986  2017-04-20 23:28:31 ls /usr/lib
  987  2017-04-20 23:28:44 ls /usr/lib/nvidia
  988  2017-04-20 23:28:48 ls /usr/lib/nvidia-375
  989  2017-04-20 23:29:35 vim ~/.bashrc
  990  2017-04-20 23:30:52 source ~/.bashrc
  991  2017-04-20 23:30:55 make
  992  2017-04-20 23:32:00 vim ~/.bashrc
  993  2017-04-20 23:37:07 cd cuda/NVIDIA_CUDA-8.0_Samples/
  994  2017-04-20 23:37:09 make
  995  2017-04-20 23:37:51 vim ~/.bashrc
  996  2017-04-20 23:38:00 source ~/.bashrc
  997  2017-04-20 23:38:02 make
  998  2017-04-21 19:40:40 exit
  999  2017-04-21 21:01:41 gedit .bashrc
 1000  2017-04-21 21:45:50 history | less
 1001  2017-04-21 21:50:58 history > hits.txt


```

なお~/.bashrc追記内容。
```
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}


export LD_LIBRARY_PATH=/usr/lib/nvidia-375:${LD_LIBRARY_PATH}
export LIBRARY_PATH=/usr/lib/nvidia-375:${LIBRARY_PATH}

```
以上です。

Install CUDA8.0 in Ubuntu16.04-amd64 LTS

Web上にはなぜか、曖昧か不正確な情報ばかり載っています。なので本記事も、不正確な情報をひとつ増やしてもgoogle検索のノイズは大して増えないよなと思って雑に書いています。

なお手順は実機へのインストールです。



ところでCUDA7.5でcuDNNは別途インストールが必要って話だけれどCUDA8.0ではどうなの?
(まだ必要になってないので調べてない)

多くの場合には、本ブログ記事のように、記憶からいい加減に再現しているためだと思います。
とはいえ、他の理由も考えられます。
- 環境ごとにインストール済みアプリケーションがかなり違う。NVIDIAのLinux版プロプライエタリドライバとか、最近のデスクトップでは不要だし入れないほうが運用も楽だと思うのだけれど、何故必要だったのか知らないけれど既に入れてあったり。gcc入ってない環境とか何やってたんだ感があるけれど、きっとRubyOnRailsアプリを書いていたのだろう。
-  逆に不要なものを入れるように手順に指示がある場合も有る。mesaとかxorg-edgeとか、linux-kernel-gnericとか、その他グラフィックライブラリらしきものとか。私の手順では不要だったのだが、もう入っていたというだけ?
- 今はインストール先が実機以外にいろいろある。 それらによって手順が違う。
- 昔の知識のまんま。上記ライブラリは既にいらないし、今のCUDA8.0は、GDI/XWindowを落とさなくても普通にインストールできる。(たぶんパッケージ版の手順では依存関係が自動で解決されている)
- っていうかインストールの検証してないけれど、あなた達らほんとにそれCUDA導入に成功してるの? (わたしは面倒なので雑にしかしてない)
多くの人たちでそれぞれ手順が違うのは、多分そんな理由。
べつ「CUDAもインストールできないお前らにはまだTenserFlowは早すぎる」とか言って初心者を妨害しているわけではないと思う。

CUDAのインストール方法で、一番正確な情報は、(当然もちろんこのブログ記事ではなく)NVIDIAの公式なCUDAインストールガイドです。
CUDA公式のインストーラーのダウンロードページからリンクもあるので手に入れましょう。
https://developer.nvidia.com/cuda-downloads
CUDA_Installation_Guide_Linux.pdf です。
Qiitaの日本語記事とかはいい加減なことしか書いてないように見えるし統一見解が無いので参考にとどめて、書いてある通りに作業するのはやめましょう。
これももう数年前の記憶で今はどうかわからなくて申し訳ないですが、LinuxのNVIDIAドライバはとても繊細な子です。CUDAインストーラはそれに輪をかけて繊細な子です。インストールの順番を間違えると、OSのGUIが上がってこなくなったり、CUDAが動かなかったりして、OSから再インストールする羽目になります。
公式ドキュメントによると、Ubuntu向けのインストール方法が2つあります(.debと.run)。これもインストール方法ブログ記事乱立&混乱の理由かと思いますが、まあNVIDIAの気持ちを察しましょう。
私はdebパッケージ版をインストールしました。インストール手順は上記の公式ドキュメントの通りにしました。
動作確認も公式ドキュメントの通りにしましょう。具体的には付属サンプルをmakeしてdeviceQuery呼び出しです。
なお、ここだけ公式ドキュメントに足りていない箇所があって、幾つかの必要パッケージが足りないのと、LD_LIBRARY_DIR等の環境変数を追加する作業が記載されていません。


環境変数は、公式ドキュメントに記載されている下記のほかに、
```
export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
```
以下を足すと私の環境で上手く行きました。
```
export LD_LIBRARY_PATH=/usr/lib/nvidia-375:${LD_LIBRARY_PATH}
export LIBRARY_PATH=/usr/lib/nvidia-375:${LIBRARY_PATH}

``` 
この設定、Web上では /etc/environment に入れろと書いてあります。開発環境の全ユーザに適用するならそれで正しいです。たぶんこちらのほうが良いのでしょう。
私はユーザごとに設定すべきかと考えて、 ~/.bashrc に設定しています。

```
/usr/bin/ld: cannot find -lnvcuvid
```

-lnvcuvid の不足がこれで解決できます。

あと、glutあたりが足りないと言われます。freeglut3-dev は必要です。
これは apt-get install freeglut3-dev で解決します。

mesaも必要らしいです。
sudo apt-get install mesa-common-dev

以上です。



インストール時のbashのhistoryを公開しました。
History of Install CUDA8.0 in Ubuntu16.04-amd64 LTS


Gtk3のキーリストとキーボードショートカットの多重設定

Gtk3のキーリストとキーボードショートカットの多重設定

ベクター・グラフィックス・エディタ Vecterionのコーディング作業中に得た知見です。

1. Gtkのキーリストはソースコードを参照。Webからも見れる。
2. Gtkのキーボードショートカットは別のキーで同じ関数を呼び出す設定ができる。






# 事の発端

Plus(+),Minus(-)KeyはキーボードとTenKeyの両方にあるが、キーコードが異なるためGtk内部では別のキーとして扱っている。
Vecterionではこれらを区別しないで、両方のキーに同じアクセラレータ(GtkのMenu連動キーボード・ショートカット機能)を紐付けたい。


# GTKキーボード定数値一覧

GTK(GDK)のキーボード定数と定数値の一覧は以下
//! key list: https://git.gnome.org/browse/gtk+/plain/gdk/gdkkeysyms.h


## キーボード定数値を検索する方法

アプリケーションでGtkコールバックのkeyvalを取得し、実際に押下して16進数値でデバッグ出力して上記の一覧を検索するとよいです。

```
debug: _cb_key_press()[98]: keyval=0x002b status=0x0005
debug: slot_et_etaion_from_key_action()[270]: no use:43

debug: _cb_key_press()[98]: keyval=0xffab status=0x0000
debug: slot_et_etaion_from_key_action()[270]: no use:65451
```

# 2重のキーボード・ショートカット

TenKeyとキーボードのPlus(+),Minus(-)Keyは内部的には別のキーですが、両方のキーにそれぞれ、同じ関数を呼ぶショートカットを設定してやると、ユーザは両方とも同じキーとして扱えるので混乱しないと思います。

```
1846 ¬
1847 static GtkWidget *_pv_get_menuitem_new_tree_of_view_zoom(GtkAccelGroup *accel_group)¬
1848 {¬
1849 >-------GtkWidget *menuitem_root;¬
1850 >-------GtkWidget *menuitem;¬
1851 >-------GtkWidget *menu;¬
1852 ¬
1853 >-------menuitem_root = gtk_menu_item_new_with_label ("_Zoom");¬
1854 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem_root), TRUE);¬
1855 ¬
1856 >-------menu = gtk_menu_new ();¬
1857 >-------gtk_menu_item_set_submenu (GTK_MENU_ITEM (menuitem_root), menu);¬
1858 ¬
1859 >-------// ** Accel to "/_View/_Zoom/Zoom _In (Ctrl++)"¬
1860 >-------menuitem = gtk_menu_item_new_with_label ("Zoom _In");¬
1861 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem), TRUE);¬
1862 >-------gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);¬
1863 >-------g_signal_connect(menuitem, "activate", G_CALLBACK(_cb_menu_view_zoom_in), NULL);¬
1864 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1865 >------->------->-------GDK_KEY_plus, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);¬
1866 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1867 >------->------->-------GDK_KEY_KP_Add, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE); // in ten key.¬
1868 ¬
1869 >-------// ** Accel to "/_View/_Zoom/Zoom _Out (Ctrl+-)"¬
1870 >-------menuitem = gtk_menu_item_new_with_label ("Zoom _Out");¬
1871 >-------gtk_menu_item_set_use_underline (GTK_MENU_ITEM (menuitem), TRUE);¬
1872 >-------gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);¬
1873 >-------g_signal_connect(menuitem, "activate", G_CALLBACK(_cb_menu_view_zoom_out), NULL);¬
1874 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1875 >------->------->-------GDK_KEY_minus, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE);¬
1876 >-------gtk_widget_add_accelerator (menuitem, "activate", accel_group,¬
1877 >------->------->-------GDK_KEY_KP_Subtract, (GDK_CONTROL_MASK), GTK_ACCEL_VISIBLE); // in ten key.¬
1878 ¬
1879 >-------return menuitem_root;¬
1880 }¬
1881 ¬
```

win64アプリケーションクロスビルドでアイコン・プロパティ・リソースを付ける

Gtk3/Cで書いたベクターグラフィック・エディタのvecterionを、Ubuntu16.04ホストでwin64ターゲットにクロスビルド中。でアイコン・プロパティ・リソースを付けた作業のメモです。


以下のようなコードで実現できます。

# .rcほか、リソースファイルを用意する 

実際に必要なのは```IDI_ICON ICON ~```行だけです。
そのICONこれも実は文字列"ICON"とファイルパス以外は大した意味はないとか、他にもオプションが付けられるとかあるようです。
Win32アプリケーションプログラミングをマスターしたいわけではないので.rcファイルの記述はスルー。
.icoファイルですが、GIMPでいい加減に縮小するだけならいい加減に作れます。PNG透過の正方形画像を、512px, 64px,32px,16pxの順にレイヤ複製->レイヤ縮小を繰り返して、最後に.icoで保存しようとすると、アイコン形式画像を保存するウィザードが出てきてGIMPが良いようにしてくれます。
(64pxは48pxのほうがいいかもしれないけれどしていません。512pxもMacOSX対応にしては中途半端。)


Ubuntu16.04環境ではnautilusもeogもこの.icoを正しく描画できませんでしたが、Windowsではとしてはきちんとアプリケーションアイコンとして表示されたので問題ありません。

```
diff --git a/deploy/win/vecterion.rc b/deploy/win/vecterion.rc
new file mode 100644
index 0000000..ed229c3
--- /dev/null
+++ b/deploy/win/vecterion.rc
@@ -0,0 +1,24 @@
+#include <windows.h>
+
+//ICON
+IDI_ICON1 ICON DISCARDABLE "deploy/win/vecterion_icon.ico"
+
+1 VERSIONINFO
+FILEVERSION     0,0,0,1
+PRODUCTVERSION  0,0,0,1
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080904E4"
+        BEGIN
+            VALUE "InternalName",        "vecterion_vge"
+            VALUE "OriginalFilename",     "vecterion_vge.exe"
+            VALUE "ProductName",        "vecterion_vge"
+            VALUE "ProductVersion",        "0.0.0.1"
+            VALUE "FileVersion",        "0.0.0.1"
+            VALUE "CompanyName",        "project daisy bell"
+            VALUE "LegalCopyright",        "Michinari.Nukazawa"
+            VALUE "FileDescription", "Vecterion, the true vector graphics editor for linux (and other)."
+        END
+    END
+END
diff --git a/deploy/win/vecterion_icon.ico b/deploy/win/vecterion_icon.ico
new file mode 100644
index 0000000..bf8ade4
Binary files /dev/null and b/deploy/win/vecterion_icon.ico differ
diff --git a/deploy/win/vecterion_icon.xcf b/deploy/win/vecterion_icon.xcf
new file mode 100644
index 0000000..7ba9088
Binary files /dev/null and b/deploy/win/vecterion_icon.xcf differ

```

# Windowsリソースのオブジェクト作成します。

クロスビルドはbashスクリプトにしています。

ここでリソース(.rc テキストのソース)をwindresでオブジェクトに変換します。
Makefileに入れるより楽そうで、やってみると、ビルド時間にほぼ影響がなかったので。
```
+# make resource(icon and other)
+TARGET_ARCH_WIN_RESOURCE=${OBJECT_DIR}/vecterion.res
+x86_64-w64-mingw32-windres ${ROOT_DIR}/deploy/win/vecterion.rc -O coff -o ${TARGET_ARCH_WIN_RESOURCE}
+


 # build app source
 CFLAGS_APPEND=-Wno-missing-include-dirs

 [ -d ${GTK3LIBRARY_DIR}/lib/pkgconfig ]
 export PKG_CONFIG_PATH=${GTK3LIBRARY_DIR}/lib/pkgconfig
-make TARGET_ARCH=win CC=x86_64-w64-mingw32-gcc CFLAGS_APPEND=${CFLAGS_APPEND} INCLUDE_APPEND="-mwindows"
+make TARGET_ARCH=win CC=x86_64-w64-mingw32-gcc CFLAGS_APPEND=${CFLAGS_APPEND} INCLUDE_APPEND="-mwindows" TARGET_ARCH_WIN_RESOURCE=${TARGET_ARCH_WIN_RESOURCE}

```



# リソースのオブジェクトをリンクします。

Windowsクロスビルド以外ではリソースのオブジェクトのパスを空文字にします。```
diff --git a/Makefile b/Makefile
index 4f859f1..0aa22f9 100644
--- a/Makefile
+++ b/Makefile
@@ -71,6 +71,7 @@ $(APP_FILE) : $(OBJECTS)
     $(CC) \
         $^ \
         $(OBJECT_DIR)/version.c \
+        $(TARGET_ARCH_WIN_RESOURCE) \
         $(CFLAGS) \
         $(INCLUDE) \
         -o $(APP_FILE)


```



gtk3アプリケーションのクロスビルド(Windowsターゲット、Linuxホスト)した際のメモ

開発中のGtk3/Cによるベクターグラフィック・エディタであるvecterionの、Windowsx64ターゲット、Linuxホストでクロスビルド作業中。
とりあえず動作するところまでは行きました。



その時のトライアンドエラーというか問題と解決のざっとしたメモです。


Windowsターゲットビルドはvecterionにとってあくまでおまけなのだけれど、Linuxターゲットで開発していてコード中に甘かった箇所がいくつかあり(ex. フォーマット文字列中のsize_tの変換指定を%zuにしていなかったなど)、ついでに修正することができた。


原因を追い切ってはいません。Windows版の優先度はその程度です。

#### 解決方法をメモし忘れたエラー error: unknown type name ‘uid_t’


詳細を忘れてしまった。
確かMinGW64のWindowsターゲットクロスビルドであるにも関わらず、pkg-configがLinuxのライブラリをリンクして、起こっていたような気がする。
http://stackoverflow.com/questions/32282270/c99-error-unknown-type-name-pid-t


```
In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
                 from /usr/include/glib-2.0/glib/gtypes.h:32,
                 from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /usr/include/gtk-3.0/gdk/gdkconfig.h:13,
                 from /usr/include/gtk-3.0/gdk/gdk.h:30,
                 from /usr/include/gtk-3.0/gtk/gtk.h:30,
                 from ./include/et_pointing_manager.h:4,
                 from source/et_pointing_manager.c:1:
/usr/include/glib-2.0/glib/gtypes.h: In function ‘_GLIB_CHECKED_ADD_U64’:
/usr/include/glib-2.0/glib/gmacros.h:232:53: error: size of array ‘_GStaticAssertCompileTimeAssertion_0’ is negative
 #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                                     ^
/usr/include/glib-2.0/glib/gmacros.h:229:47: note: in definition of macro ‘G_PASTE_ARGS’
 #define G_PASTE_ARGS(identifier1,identifier2) identifier1 ## identifier2
                                               ^
/usr/include/glib-2.0/glib/gmacros.h:232:44: note: in expansion of macro ‘G_PASTE’
 #define G_STATIC_ASSERT(expr) typedef char G_PASTE (_GStaticAssertCompileTimeAssertion_, __COUNTER__)[(expr) ? 1 : -1] G_GNUC_UNUSED
                                            ^
/usr/include/glib-2.0/glib/gtypes.h:422:3: note: in expansion of macro ‘G_STATIC_ASSERT’
   G_STATIC_ASSERT(sizeof (unsigned long long) == sizeof (guint64));
   ^
In file included from /usr/include/glib-2.0/gio/gio.h:46:0,
                 from /usr/include/gtk-3.0/gdk/gdkapplaunchcontext.h:28,
                 from /usr/include/gtk-3.0/gdk/gdk.h:32,
                 from /usr/include/gtk-3.0/gtk/gtk.h:30,
                 from ./include/et_pointing_manager.h:4,
                 from source/et_pointing_manager.c:1:
/usr/include/glib-2.0/gio/gcredentials.h: At top level:
/usr/include/glib-2.0/gio/gcredentials.h:75:1: error: unknown type name ‘uid_t’
 uid_t            g_credentials_get_unix_user      (GCredentials    *credentials,
 ^
/usr/include/glib-2.0/gio/gcredentials.h:79:52: error: unknown type name ‘uid_t’
                                                    uid_t           uid,
                                                    ^
Makefile:60: ターゲット 'object/win/et_pointing_manager.o' のレシピで失敗しました


```

```
 58 export PKG_CONFIG_PATH=${GTK3LIBRARY_DIR}/lib/pkgconfig¬
 59 make TARGET_ARCH=win CC=x86_64-w64-mingw32-gcc CFLAGS_APPEND=${CFLAGS_APPEND} INCLUDE_APPEND="-m    windows"¬


```



#### pkg-configで生成したビルドオプションの[-Werror=missing-include-dirs]


一時的にチェックフラグを解除して回避
最終的にビルドスクリプトを変更し、pkg-config(*.pc設定ファイル)が正しいパスを指すよう修正して解決

```
cc1: error: /srv/win32builder/fixed_3104/build/win64/include/freetype2: そのようなファイルやディレクトリはありません [-Werror=missing-include-dirs]
cc1: error: /srv/win32builder/fixed_3104/build/win64/include/libxml2: そのようなファイルやディレクトリはありません [-Werror=missing-include-dirs]
cc1: error: /srv/win32builder/fixed_3104/build/win64/include/freetype2: そのようなファイルやディレクトリはありません [-Werror=missing-include-dirs]
cc1: all warnings being treated as errors
Makefile:60: ターゲット 'object/win/et_pointing_manager.o' のレシピで失敗しました


```

``` packaging_win64.sh
 42 >-------pushd ${GTK3LIBRARY_DIR}¬
 43 ¬
 44 >-------unzip ${CACHE_DIR}/gtk+-bundle_3.10.4-20131202_win64.zip > /dev/null¬
 45 >-------find -name '*.pc' | while read pc; do sed -e "s@^prefix=.*@prefix=$PWD@" -i "$pc"; done¬
 46 >-------find -name '*.pc' | while read pc; do sed -e "s@/srv/win32builder/fixed_3104/build/win64    @$PWD@g" -i "$pc"; done¬
 47 >-------sed -e "s@Z:/srv/win32builder/fixed_3104/build/win32/@@g" -i "lib/gdk-pixbuf-2.0/2.10.0/    loaders.cache"¬
 48 ¬
 49 >-------popd¬


```




#### mingwがswitch defaultに置いたassert(false)を解釈してくれない

「到達しないソース行」の検出あたりが、linuxのgccとMinGWで違うようで(バージョンの違いかもしれない)、リターンエラーのメッセージが出る。
assert()のラッパを、新規作成したabort()のラッパ関数に置き換えて解決。

```
source/pv_type.c: In function ‘pv_rect_get_edge_point’:
source/pv_type.c:202:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^
cc1: all warnings being treated as errors

```

```
195 >------->-------case PvRectEdgeKind_DownLeft:¬
196 >------->------->-------return (PvPoint){rect.x, (rect.y + rect.h)};¬
197 >------->-------case PvRectEdgeKind_DownRight:¬
198 >------->------->-------return (PvPoint){(rect.x + rect.w), (rect.y + rect.h)};¬
199 >------->-------default:¬
200 >------->------->-------pv_assertf(false, "%d", edgeKind);¬
201 >-------}¬
202 }¬

```
```
200 >------->------->-------pv_abortf("%d", edgeKind);¬
```


#### size_t型のリテラル間違い

size_tを"%lu"のままにしてしまうミス。
修正後、正しい指定の"%zu"を受け付けない。
一時的には、出力を潰して対処した。
最終的に、`-posix` 追加で"%zu"が使えるようになり解決。

```
-               pv_debug("len:%lu '%s'", strlen(src), src);
+               pv_debug("len: '%s'", /*strlen(src),*/ src);

```




#### sscanfの非C11標準(posix標準)リテラルの使用

sscanf()にて、リテラル記述に"%m"が存在しないとされて使えない。
-D_GNU_SOURCE=1 は効果なし。
gcc(MinGW)のバージョンが原因でもないように見えた。
最終的に、`-posix` 追加で解決。


```
source/pv_io.c: In function ‘_new_css_str_maps_from_str’:
source/pv_io.c:450:24: error: unknown conversion type character ‘m’ in format [-Werror=format=]
   if(2 != sscanf(head, " %m[^:;] : %m[^;]", &skey, &svalue)){
                        ^
source/pv_io.c:450:24: error: unknown conversion type character ‘m’ in format [-Werror=format=]


```

http://linuxjm.osdn.jp/html/LDP_man-pages/man3/scanf.3.html


http://stackoverflow.com/questions/11926883/scanf-dynamic-allocation
`I don't see anything about m flag in my copy of C11 (which is, admittedly, a draft).`


http://grokbase.com/t/postgresql/pgsql-hackers/114vq5qrhn/unknown-conversion-m
`Hmm. The error disappears if I use -D__USE_MINGW_ANSI_STDIO=1 or -posix`


#### libxml2の引数型の間違い

関数の引数の型が合わないビルドエラー。
Web上のドキュメントではconst付きで記載されているが、実際にヘッダのソースコードを当たってみると、constなしになっている。
constを外して解決。

```
source/pv_io.c:450:24: error: too many arguments for format [-Werror=format-extra-args]
source/pv_io.c: In function ‘_overwrite_conf_read_svg_from_xmlnode’:
source/pv_io.c:534:32: error: passing argument 1 of ‘xmlGetProp’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
  xmlChar *xc_fill = xmlGetProp(xmlnode, BAD_CAST "fill");


```

http://xmlsoft.org/html/libxml-tree.html#xmlGetProp

#### libgtk3 for windowsの古いバージョンの未実装関数

gtk3-3.10.4がこの関数を未実装であるためエラー。
同名のラッパ関数を定義、またはターゲットにより関数呼び出しを取り除くマクロを定義して解決。

```
source/et_canvas_collection.c: In function ‘et_canvas_collection_delete_canvases_from_doc_id’:
source/et_canvas_collection.c:250:3: error: implicit declaration of function ‘gtk_notebook_detach_tab’ [-Werror=implicit-function-declaration]
   gtk_notebook_detach_tab(GTK_NOTEBOOK(self->widget_tab), canvas_frame);

```

https://mail.xfce.org/pipermail/xfce4-commits/2016-June/071144.html

```
source/et_layer_view.c:148:2: error: implicit declaration of function ‘gtk_text_view_set_monospace’ [-Werror=implicit-function-declaration]
  gtk_text_view_set_monospace (GTK_TEXT_VIEW(self->text), TRUE);


```

#### libgtkのsvgのローダ

svgが開かない
以前も見ていた不具合。
相対パスへの書き換えとライブラリの追加パッケージングで解決。

```
sed -e "s@Z:/srv/win32builder/fixed_3104/build/win32/@@g" -i "lib/gdk-pixbuf-2.0/2.10.0/loaders.cache"

${GTK3LIBRARY_DIR}/lib/gdk-pixbuf-2.0/2.10.0/loaders/libpixbufloader-svg.dll
${GTK3LIBRARY_DIR}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache

```


#### Windows環境でのマウスポインタ変更

windowへのポインタを取ろうとして、Windows環境で取れないため、マウスカーソル周りの処理でエラー。
マウスカーソル周りをWindowsターゲットのビルドで無効にして一時的に解決。


 
その後、あらためて確認したらビルドが通りました。ヘッダなどが必要だったのかもしれない。

```
(vecterion_vge.exe:4292): Gdk-CRITICAL **: gdk_screen_get_root_window: assertion 'GDK_IS_SCREEN screen)' failed

(vecterion_vge.exe:4292): Gdk-CRITICAL **: gdk_window_new: assertion 'GDK_IS_WINDOW (parent)' failed

(vecterion_vge.exe:4292): Gdk-WARNING **: gdk_input_wintab_init: gdk_window_new failed

```



#### libgtkで一部のダイアログを出すのに必要なファイルの追加

Save操作時にエラーダイアログ。
パッケージにschemasファイルを追加して解決。

```
GLib-GIO-ERROR**: No GSettings schemas are installed on the system
```

```
 76 mkdir -p ${PACKAGE_DIR}/share/glib-2.0/¬
 77 cp -r ${GTK3LIBRARY_DIR}/share/glib-2.0/schemas ${PACKAGE_DIR}/share/glib-2.0/¬

```

http://stackoverflow.com/questions/28953925/glib-gio-error-no-gsettings-schemas-are-installed-on-the-system




Debian(.deb)パッケージを生成

リポジトリに上げておきました。
https://github.com/MichinariNukazawa/debian_package_c_application_automate_example

公式の「 Chapter 4. Simple Example」を、bashスクリプトで自動化したものです。



以下、エラーメッセージとその対処など、リポジトリに上がっていない情報をいくつか。


## DEBEMAILなどを指定していないと吐くエラー

debmakeなどのDebianパッケージ関連コマンドは、製作者情報を環境変数から読むので、セットしておく必要がある。
(コマンド毎に引数指定しても行けるはずと思いますが、コマンド毎に引数指定を調べるのが面倒だったので、そちらは試していない。)

```
$ debmake
I: set parameters
Traceback (most recent call last):
  File "/usr/bin/debmake", line 28, in <module>
      debmake.main()
        File "/usr/lib/python3/dist-packages/debmake/__init__.py", line 104, in main
        para = debmake.para.para(para)
          File "/usr/lib/python3/dist-packages/debmake/para.py", line 44, in para
              debmail = os.getlogin() + '@localhost'
          FileNotFoundError: [Errno 2] No such file or directory


```
忘れずに環境変数に製作者情報をセットしておく。

```
export DEBEMAIL="michinari.nukazawa@gmail.com"
export DEBFULLNAME="Michinari.Nukazawa"

```


## 秘密鍵のエラー

```
W: debhello: binary-without-manpage usr/bin/hello
Finished running lintian.
Now signing changes and any dsc files...
 signfile debhello_0.0-1.dsc Michinari.Nukazawa <michinari.nukazawa@gmail.com>
 gpg: "Michinari.Nukazawa <michinari.nukazawa@gmail.com>"をスキップします: 秘密鍵が利用できません
 gpg: /tmp/debsign.Fwk1I2Pw/debhello_0.0-1.dsc: clearsign failed: 秘密鍵が利用できません
 debsign: gpg error occurred!  Aborting....
 debuild: fatal error at line 1295:
 running debsign failed
 error:packaging_deb.sh(53) "debuild" ""

```
などと出るが、とりあえずパッケージは出来ている。

サインはDebianLinuxの公式な開発者として配布するときに付けるもので、個人使用のパッケージでは不要とのこと。
.debファイルを直接ダウンロード配布するときもとりあえず無くてもインストールできる模様。
```
debuild -us -uc
```
とする。
(manpageに、このオプションは`dpkg-buildpackage`と共通、みたいなことが書いてある。)






## 動作確認


```
dpkg -i debhello_0.0-1_amd64.deb
hello
sudo dpkg -r debhello

```

以上です。

cross_gtk3_for_win64_in_ubuntu

特に書くことはないですが、リポジトリに上げておきました。

gtk3アプリケーションを、Linux(Ubuntu)上でクロスビルドして、ターゲットのWindows(64bit)のバイナリを生成します。
また、gtk3アプリケーションが動作するよう、gtk3のライブラリを含めてzipにパッケージします。
https://github.com/MichinariNukazawa/cross_gtk3_for_win64_in_ubuntu


詳しい手順はリポジトリを参照してください。

TIPS:
* gtk3のWindowsアプリケーションは -mwidows を指定しないとコマンドラインが立ち上がってきます。
* mingwは、今(Ubuntu16.04)は、 mingw-w64 になっています。
* 日本語ファイルを含める場合は、日本語エンコーディングでzipしなければなりません。
(今回は必要ないのでしていません。)
* 公式のコンパイル済みgtk3ライブラリを使っていますが、いかんせんバージョンが古いのもあってか、ターミナルを見るとけっこうエラーメッセージを吐いています。それでも動くから、今回はそのまま。
 

ComfyUIでXYZ-PlotするワークフローのサンプルとTips(ComfyUI-XYZ-Stitch)

 ComfyUIでAutomatic1111的なXY-Plotをしたいのだが、ComfyUIデフォルト機能には用意されていない。     カスタムノードが必要となるのだが、Webには古いとか何故か動かないとかなXY-Plotパッケージの使ってみた系記事か、githubに上げられた...