ubuntu18.04 alphaで日本語入力(ibus-mozc 英字配列キーボード)

ubunu18.04 alphaの試用を始めました。
新しいUbuntu、特にリリース前の試用版を使おうとすると、まず問題になるのは日本語入力です。
LTSリリースでさえ、リリース日の前後に有志の方々(足を向けて寝られない)の力でやっと日本語入力できるようになった、という場合がけっこうあって、ubuntuの日本語入力機能のリリーススケジュールは体感ではリリース日後になる場合もある、という感じです。

それで、今回のubunu18.04 alphaですが、ちょっと驚いたのですが、最初から(設定すれば?)日本語入力できる状態になっています。ちょっと問題はありますが。



結果的に、これまでの経験(?)からfcitx-mozcを使おうとしたせいで、自分から問題に迷い込んでしまった格好です。

なお、あくまでalpha版なので、明日にも状況が変わるかもしれません。参考程度に。

TL;DR

ibus(ibus-mozc)使う。fcitx使わない。 im-configをdefaultのまま変えない。
(いちど変え直して再起動するといいとかの罠は無いと思う。多分。)

# fcitxを使おうとした(失敗)

http://www2.it-ishin.com/archives/2018/02/01/1506.html
では、fcitx-mozcを使ってim-configする方法を紹介している。
これは私の環境とバージョンでは失敗した。

im-configの勧めにしたがって一度はibusをアンインストールしたが、後にインストールしなおして、念の為fcitxの方をアンインストールした。


デフォルトがibusだったので、fcitxを使う場合は、 im-configをいじる必要があった。
自分はim-config、sudoありなしで両方とも設定してしまったが、両方とも戻した。


fcitx-mozcは、日本語入力はできるが、IME切り替えをしても変換処理が止まらず、英字を直接入力することができない。
IMEアイコンが2つ表示されている。IME切り替えキー操作をしてもfcitx-mozcが止まらない問題らしい。

また、fcitx?のアイコンから出てくるメニューは、各項目の内容が、一瞬だけ表示されてすぐ消えてしまうため、まったく設定が操作できなかった。

# 英字キーボード固有の話

 入力切替のショートカットキーの設定は、右上のIMEアイコンからではなく、Gnomeの設定アプリ(Ubuntuの設定)から行う。
場所は「デバイス>キーボード 」。
入力切替ショートカットキー設定

入力切替のショートカットキーがデフォルトでsuper+spaceになっている。
(日本語入力できていないうちに設定を変えてしまったので、動作を確認していない。)
この設定をCtrl+spaceにすると、上の設定も自動で書き換わる。特に悪さはしない模様。

# TIPS

IME設定を変えたら、Ubuntuを再起動する。ログオフではIME設定変更がうまく反映されない模様?

IME切り替えUIの表示が一瞬遅い&切り替えキーを離すと即消えるので、一瞬でやると切り替えUIが表示されない。最初は、『切り替えUIが出たり出なかったりする』ようにしか見えないので、特に日本語入力がうまく行っていないとき、IME切り替えができていないのではと思って、戸惑う。
UI自体はWindows10で感心したやつに近い仕組みで良いと思う。



日本語入力するために、毎回、mozcの入力モードを「ひらがな」にする必要あり。ibus-mozcの入力モードは、再起動すると「直接入力」(英字入力)に戻ってしまう。このこと以外は概ねうまく行っている。
ibus-mozcの入力モード設定

以上です。

ubuntu18.04 alphaにcudaをinstallする

 ubuntu18.04 alphaにcudaをインストールする手順です。

 
16.04でもnvidia公式リポジトリのおかげでかなり楽になっていましたが、18.04ではcuda9.0がubuntuリポジトリに上がっており、ドライバごとaptから導入できます。
最新版 は9.1が出ているっぽいですが。
(というかUbuntu16.04でcudaインストールが大変だった問題の、諸悪の根源はバラバラな方法が検索上位にいくつも上がってくるqiitaのような。昔のように最初から公式ドキュメントを読めばよかった。とはいえ本記事もalphaのこの時点ではうまく行ったという話なので信憑性は似たりよったり...閑話休題。)

# インストール

リポジトリ追加すら必要ありませんでした。
ドライババージョン等は、まだalphaなので、最新版が登場したり取り下げられたりするかもしれませんが。

```
sudo apt install nvidia-driver-390 libcuda1-384 libcufft9.0 nvidia-cuda-toolkit
```

(※02/28時点のalphaで下記cuda導入コマンド実行後に後からnvidiaドライバを導入しようとしたらUbuntuが壊れました。report中。)
```
sudo apt install libcuda1-384 libcufft9.0 nvidia-cuda-toolkit
```

libcufft9.0はなんとなく入れただけです。今回は動作確認していません。
nvidia-cuda-toolkitはnvccが入っています。ビルドに必要です。
この時点で、libcufft9.0のバージョンを信じるならば9.0? って感じでした。

とりあえず単純なソースをビルドして実行するだけならば、ドライバライブラリへシンボリックリンクを手作業で貼り直したり、.bashrcにパスを設定したりする必要はありません。ubuntu16.04の頃を思うと、感動的に楽です。

# 確認

まずはコマンドで、次にビルドおよびバイナリの動作によりcuda環境の動作を確認。

## コマンド

```
$ nvidia-smi
Mon Feb 26 00:32:06 2018      
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 105...  Off  | 00000000:27:00.0  On |                  N/A |
| 45%   33C    P5   ERR! /  75W |    964MiB /  4035MiB |      2%      Default |
+-------------------------------+----------------------+----------------------+
                                                                              
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1522      G   /usr/lib/xorg/Xorg                            57MiB |
|    0      1569      G   /usr/bin/gnome-shell                          47MiB |
|    0      1938      G   /usr/lib/xorg/Xorg                           534MiB |
|    0      2086      G   /usr/bin/gnome-shell                         321MiB |
+-----------------------------------------------------------------------------+

$nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176

$ which nvcc
/usr/bin/nvcc

$ ldconfig -p | grep cuda
    libicudata.so.60 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libicudata.so.60
    libcudart.so.9.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcudart.so.9.0
    libcudart.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcudart.so
    libcuda.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so.1
    libcuda.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libcuda.so

```

## サンプルソース・アプリ動作

https://gist.github.com/dpiponi/1502434
で確認しました。ダウンロードしてビルドして実行したところ、動いているようです。
```
$ nvcc example.cu && ./a.out
```
以上です。



checkboxがdisableのときcssでlabelテキストの色を変更する

cssでcheckboxがdisableのときlabelテキストの色を変更したかったのですが、日本語で一発これという設定がなかったので探してみました。
checkboxが無効であるときは、ラベル文字列を含めて、チェックボックス全体が無効を示す色になっていたほうが、ユーザにとってわかりやすく使いやすいと思います。
他にCSSで装飾するかどうかは、その後でいいかと。

いまelectronで書いている、UML sequence diagramエディタで使っています。

html checkbox 赤がDisable 青がEnable





まずHTML側で、対応するcheckboxの書き方をする必要があります。
===
                    <label for='editor__message-spec'>
                        <input id='editor__message-spec' type="checkbox"/>
                        <span>Spec</span>
                    </label>

===
続いてCSS。
===
 input[type="checkbox"][disabled] + span{
    color: #707070;
}

===

以下、いくつかの理由とTIPS。
(ここで、ラベル文字列とlabel elementはそれぞれ別のものです。)

ラベル文字列をspanで囲っているのは、inputの次の要素をCSS selectorの"+"(プラス)記法で指定することで、ラベル文字列のcolorを設定するためです。

全体をlabelで囲います。
labelで囲んでfor attributeでIDを使ってinput checkboxと紐付けすることで、ラベル文字列をクリックしてもcheckboxが操作できるようになり、ユーザにとって押しやすいcheckboxになるのこと。

ちなみに試したのですが、 下記HTMLのような
`<input id='editor__message-spec' type="checkbox">Spec</>`
という書き方で、input elementで囲ったテキストの色を変えるCSSを見つけることはできませんでした。



以上です。


electronでnpm installしたsvg.jsを使用する

 electronでsvg.jsを使用する場合、公式サイトからsvg.jsファイルを直接落としてきてもよいのですが、バージョンを管理したい都合もあり、幸いにもnpmで提供されているので、npmから導入して使用することにします。



electronとsvg.jsをインストールします。
`npm install electron`
`npm install svg.js`

起動する状態のelectronアプリケーションを作ってから、下記のような内容を追記します。

``` : ./js/index.js
'use strict';

var SVG = require('svg.js');

window.onload = function(e){
    var draw = SVG('drawing').size(300, 300)
    var rect = draw.rect(100, 100).attr({ fill: '#f06' })
}

```

``` : index.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>daisy sequence - UML sequence diagram editor -</title>

        <script type="text/javascript" src="./js/index.js"></script>
    </head>
    <body>
        hello!
        <div id="drawing"></div>
    </body>
</html>

```

svg.jsは、`var SVG = require('svg.js');`でロードできます。
注意する点として、onloadの前にsvg.js機能を呼びだそうとすると、
`Uncaught TypeError: Cannot read property 'nodeName' of null`
というエラーに見舞われます。

OD4K-32B1 4Kディスプレイを購入

 というわけでNTT-Xで4Kディスプレイを購入したので開封写真等。

縦に引っ張るのは難しかったので、横に倒して取り出した。



脚をとめるためのネジと簡易なドライバがついてきている

NTT-Xサイトの商品画像の通り、脚が細い

裏側の操作ボタン。ゲーム用のスティックのように操作する

ACアダプタとHDHIケーブル
ちなみに付属のHDMIケーブルは使わずに、以前購入した
DisplayPort2.0で繋いだけれど、付属のHDMIケーブルは表記を信じるならHDMI1.3or1.4なので、多分4K60Hz出るのだと思う。


ところでディスプレイの設定機能がKEIANの4Kディスプレイと同じに見えるのだけれど、単に同じファームなのか、あるいはKEIANのOEMか何かなのだろうか。

スピーカーはおまけ程度とレビューされていましたが、実際に昔のラジオ演出みたいに聞こえるので、三菱ディスプレイと比べると明らかに違いました。


英単語訳ブラウザ拡張を公開(WebExtension)

ブラウザ上で英語の単語の上にマウスオーバーすると、日本語翻訳をホバー表示(ツールチップ表示)するブラウザ拡張、lina_dicto_english for webextensionを公開しました。

 


以前から公開している、エスペラント語翻訳のブラウザ拡張lina_dicto for webextensionの辞書を置き換えて作成しました。ブログ記事も書いてあります。「エスペラント翻訳ブラウザ拡張を公開(WebExtension)

ソースコードはGitHubにてBSD Clause-2にて公開しています。 
今の所FireFox対応Chromium(Chrome)仮対応で、Chromiumは正式対応予定です。

以下、作成の際のちょっとした知見など。

## データサイズ制限

辞書データをJSONで持っているのですが、辞書サイズがエスペラント語辞書データ(3MB)に比べて英語辞書データ(9MB)が3倍程度大きいため、アドオン配布システムのaddons.mozilla.org(以下AMO)から公開するWebExtensionの、4MB制限にひっかかってしまいました。
(エラーメッセージによると、4MB以上のJSONをファイルをパースしていると引っかかる模様。AMOのWebExtensionはモバイルブラウザ対応もありますし、この制約があるのは妥当だと思います。)
 今回は、extensionが今のところ1ワードの単語しか検索しないため、2ワード以上の熟語等を辞書データから取り除くことで軽量化を行いました。今後2ワード対応するつもりですが、それでも辞書は4MBを超えないと思うので、とりあえずはこれでOKとしました。

## 名称によるURL長制限

AMOでextension個別ページに付けられるURLには最大長があるようです。
lina_dicto_english for webextensionでは、
https://addons.mozilla.org/ja/firefox/addon/lina_dicto_english_for_webexte/ 
と途中で切れる結果になってしまいました。 
また、デフォルトではextension名の空白は"-"に置き換えられます。
こんなに長く、アンダーバー等を用いた名前を付けることはあまりないと思いますが、一応、名前付けの際の参考に。

以上です。

electron-packagerのエラー解決

electron製のエスペラント日本語辞書アプリlina_dictoについて、パッケージ作成時のエラーを解決した際のメモ。



electron-packagerで下記エラーが出て、 node_modules再インストール等でも治らなかったので対処。

#  npm-check-updates によると思われるエラー
 
```

MN@daisy-bell:lina_dicto/$ npm install electron-packager --save-dev
npm ERR! path /home/HOME/lina_dicto/lina_dicto/node_modules/npm-check-updates/node_modules/npm/node_modules/dezalgo
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, rename '/home/HOME/lina_dicto/lina_dicto/node_modules/npm-check-updates/node_modules/npm/node_modules/dezalgo' -> '/home/HOME/lina_dicto/lina_dicto/node_modules/npm-check-updates/node_modules/npm/node_modules/.dezalgo.DELETE'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/HOME/.npm/_logs/2017-12-21T12_10_15_965Z-debug.log


```

npm-check-updatesが競合か何かで悪さをしていた模様。
下記の通り依存パッケージから消して、node_modulesとpackage-lock.jsonを削除してから再インストールで解決。

```

MN@daisy-bell:lina_dicto/$ git diff
diff --git a/lina_dicto/package.json b/lina_dicto/package.json
index 200d447..387b961 100644
--- a/lina_dicto/package.json
+++ b/lina_dicto/package.json
@@ -22,13 +22,12 @@
     "babel-register": "^6.26.0",
     "electron": "^1.8.1",
     "electron-installer-debian": "^0.7.1",
-    "electron-packager": "10.1.0",
+    "electron-packager": "^10.1.0",
     "intelli-espower-loader": "^1.0.1",
     "mocha": "^4.0.1",
     "power-assert": "^1.4.4"
   },
   "dependencies": {
-    "npm": "^5.6.0",
-    "npm-check-updates": "^2.13.0"
+    "npm": "^5.6.0"
   }
 }

```









# ignore設定によると思われるエラー




下記のようなエラーが出た。

```
npm ERR! path /tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/object-assign
```


```
MN@daisy-bell:lina_dicto/$ bash ./installer_darwin.sh
~/lina_dicto/lina_dicto ~/lina_dicto
Packaging app for platform darwin x64 using electron v1.8.1
/home/HOME/lina_dicto/lina_dicto/build_darwin.js:19
                throw new Error(err);
                ^

Error: Error: Command failed: npm prune --production
npm ERR! path /tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/object-assign
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, rename '/tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/object-assign' -> '/tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/npmlog/node_modules/gauge/node_modules/.object-assign.DELETE'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/HOME/.npm/_logs/2017-12-21T12_29_30_221Z-debug.log

    at done (/home/HOME/lina_dicto/lina_dicto/build_darwin.js:19:11)
    at Immediate._onImmediate (/home/HOME/lina_dicto/lina_dicto/node_modules/nodeify/index.js:19:9)
    at runCallback (timers.js:789:20)
    at tryOnImmediate (timers.js:751:5)
    at processImmediate [as _immediateCallback] (timers.js:722:5)
error:./installer_darwin.sh(41) "node build_darwin.js" ""

```

設定のignoreから、objectを除くと解決した。

また、下記のようなエラーも出たので、さらにignoreを書き換えて解決した。

```
MN@daisy-bell:lina_dicto/$ bash ./installer_darwin.sh
~/lina_dicto/lina_dicto ~/lina_dicto
Packaging app for platform darwin x64 using electron v1.8.1
/home/HOME/lina_dicto/lina_dicto/build_darwin.js:19
                throw new Error(err);
                ^

Error: Error: Command failed: npm prune --production
npm ERR! path /tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/create-error-class/node_modules/capture-stack-trace
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall rename
npm ERR! enoent ENOENT: no such file or directory, rename '/tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/create-error-class/node_modules/capture-stack-trace' -> '/tmp/electron-packager/darwin-x64/lina_dicto-darwin-x64/Electron.app/Contents/Resources/app/node_modules/npm/node_modules/update-notifier/node_modules/latest-version/node_modules/package-json/node_modules/got/node_modules/create-error-class/node_modules/.capture-stack-trace.DELETE'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/HOME/.npm/_logs/2017-12-21T12_41_05_486Z-debug.log

    at done (/home/HOME/lina_dicto/lina_dicto/build_darwin.js:19:11)
    at Immediate._onImmediate (/home/HOME/lina_dicto/lina_dicto/node_modules/nodeify/index.js:19:9)
    at runCallback (timers.js:789:20)
    at tryOnImmediate (timers.js:751:5)
    at processImmediate [as _immediateCallback] (timers.js:722:5)
error:./installer_darwin.sh(41) "node build_darwin.js" ""

```

最終的に、package設定のファイルを以下のとおりに変更して解決した。
```
 diff --git a/lina_dicto/build_default.js b/lina_dicto/build_default.js
index 86dc120..4a7a678 100644
--- a/lina_dicto/build_default.js
+++ b/lina_dicto/build_default.js
@@ -20,7 +20,7 @@ module.exports =
        ignore: "node_modules/(electron-packager|electron-prebuilt|\\.bin)"
                + "|node_modules/(babel.*|intelli-espower-loader|power-assert.*|mocha)"
                + "|.*\\.txt"
-               + "|work|object|test"
+               + "|work/.*|test/.*"
                + "|data/.*\\.(zip|sh)"
                + "|release\\.js",
        'version-string': {

```

objectを除いておきたかったのだけれど、大きな実害はないのでとりあえずOK。

以上。

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

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