electronの右クリックメニューから選択テキストを使う

lina_dictoにて、選択テキストを右クリックメニューでGoogle検索とGoogle翻訳にかける機能を実装しました。



右クリックメニューはcontextmenuで設定できます。

プロセス間通信がんばってねという記述もありますが、必要ありません。

window.getSelection();の戻り値で取れます。
返り値はオブジェクトなのでtoString()を忘れないよう注意。

Google検索のURLは
`'https://www.google.com/search?q=' + keyword.replace(/\s+/, '+');`
といった感じで生成。

Google翻訳のURL生成
```
    static get_google_translate_url(keyword, src_lang, dst_lang)
    {
        // ex. eo to ja, `https://translate.google.co.jp/#eo/ja/bona`
        const link = 'https://translate.google.co.jp'
            + '/#' + src_lang
            + '/' + dst_lang
            + '/' + encodeURIComponent(keyword);
        return link;
    }

```

ブラウザはOpenにURLを渡すとデフォルトブラウザが開きます。
`require('electron').shell.openExternal(link)`



結果、lina_dictoで使っている右クリックメニューのコードは以下。

```
    static init()
    {

        //! context menu (light click menu)
        var menu = new Menu();

        menu.append(new MenuItem({
            label: 'Copy',
            accelerator: 'CmdOrCtrl+C',
            role: 'copy'
        }));
        menu.append(new MenuItem({
            label: 'Paste',
            accelerator: 'CmdOrCtrl+V',
            role: 'paste'
        }));
        menu.append(new MenuItem({
            label: 'goto google search(external browser)',
            click: function(){
                const keyword = window.getSelection().toString();
                if(0 == keyword){
                    alert("text no selected");
                    return;
                }
                const link = 'https://www.google.com/search?q=' + keyword.replace(/\s+/, '+');
                //const src_lang =;
                //const dst_lang = '';
                //const link = ExternalBrowser.get_google_translate_url(
                //        keyword, src_lang, dst_lang);
                ExternalBrowser.open(link);
            }
        }));
        menu.append(new MenuItem({
            label: 'goto google translate(external browser)',
            click: function(){
                const keyword = window.getSelection().toString();
                if(0 == keyword){
                    alert("text no selected");
                    return;
                }
                const isEsp = Esperanto.is_esperanto_string(keyword);
                const src_lang = (isEsp ? Language.get_code_by_google() : 'ja');
                const dst_lang = ((! isEsp) ? Language.get_code_by_google() : 'ja');
                const link = ExternalBrowser.get_google_translate_url(
                        keyword, src_lang, dst_lang);
                ExternalBrowser.open(link);
            }
        }));

        window.addEventListener('contextmenu', function (e) {
            e.preventDefault();
            menu.popup(remote.getCurrentWindow());
        }, false);

        return true;
    }

```

接写リング買いました


マクロレンズ2万円〜に対して、接写リング1000円〜、だったので試しました。(私が買ったのは3000円くらい)





撮影したのは3Dプリンタの出力物。サイズは2cmちょっとです。





比較として、接写リング無しだとこんな感じです。







eletctronでコマンドライン引数を受け取る (とmacosxの注意点)

eletctronでコマンドライン引数を受け取る場合に、macosx固有の注意点として"-psn_0_xxxxxx"のような引数に対処する必要がある。

daisy-sequenceをデバッグしていて発見。



# よく紹介されるelectronでの引数の受け取り方法

electronで引数にファイルを受け取る時、以下の対応が必要となる。

## electronはデバッグとリリースでコマンドライン引数の数が異なる

デバッグではElectron実行ファイルのパスだけでなく、アプリのmainを入れたjsのパスも引数として渡される。
```
let argv = remote.process.argv;

     if(argv[0].endsWith('lectron')){
        argv.shift();
    }

```
ここで'lectron'とendsWithでマッチしているのは、プラットフォームにより'Electron'/'electron'で先頭大文字小文字の2パターンがあるため。

## electronは OSXでは'open-file' イベントを受ける


electronアプリにGUI上からファイルを渡して開く時、(ファイルをドロップして開く等)macosxではwin/linuxのように通常引数では受け取れないため、以下のコールバックで受け取る。

``` : electronベース(nodeプロセス側)でコールバック受け取り
// MacOSX
global.sharedObject = {'osx_open_file': null};
let openFileHandler = function(event, path) {
    event.preventDefault();
    global.sharedObject.osx_open_file = path;
};
app.on('open-file', openFileHandler);

```
```: electronアプリ(レンダラプロセス側)で上で保存した値を受け取り
     if(typeof remote.getGlobal('sharedObject').osx_open_file === 'string'){
        if(null === arg.open_filepath){
            arg.open_filepath = remote.getGlobal('sharedObject').osx_open_file;
        }
    }

```

# macosxのelectronで引数から"-psn_0_xxxxxx"を取り除く

macosxでリリースしたアプリをダウンロードして起動すると、初回起動時に、
"-psn_0_xxxxxx"のような引数を受け取る場合がある。





これを適切に取り除く必要がある。
```
         if(/^-psn_0_[0-9]+$/.test(arg.open_filepath)){
            // macosxでブラウザからダウンロードしたバイナリを初回起動した際に、
            // 渡される場合のあるコマンドライン引数(ex. '-psn_0_2958034')を除外する。
            console.debug("through for macosx:", arg.open_filepath);
            return true;
        }

```

ただし、初回起動時から引数でさらにファイルパスを渡された場合に、うまく行かないかもしれない。(その場合の引数の順序などの動作は確認していない。)

不明な引数について今回の話に近い報告がされているissue
https://github.com/electron/electron/issues/4403

## テスト方法

なお、macosxでテストする際、「ネットワークからダウンロードしたファイル」のフラグをONにする必要がある。
これには実行ファイル(の配布zip)をchrome にドロップすると良い。ドロップしたファイルがダウンロード扱いされる。

mi band4について(元mi band3ユーザとして)

mi band4を買いました。
元はアクティビティトラッカーを着けて使ってみようと、初めてのバンドとしてmi band3を買い、使っていました。ところが去年の年末あたり外出した際に無くしてしまい、しばらくバンド無しで過ごしていました。(純正シリコンバンドから本体がすぽんと抜けてしまったようで、気づいたら無くなっていました。)
こういうときに「あー残念」で済むのが安いバンドの良いところです。

mi band4登場は知っていましたが、今回購入するにあたって、事前調査で自分の用途(歩数と心拍が取れていればいい)では、あまり差がなかったため、今回もmi band3でいいやと思っていました。ですが、もう取扱がほとんど無いようで、差額も500円いかないようだったので、せっかくだからとmi band4にしました。買ったのは日本版(smart と付いている方)ではなくglobal版です。

で、mi band3と比較しての感想ですが。
- 純正バンドが固くなった気がする。最初、はめていて違和感があった。今は多分慣れた。
-  やっぱりカラー画面である必要はなかった。カラーだから困ったりはしないが。
- 音楽再生機能はセットアップ時に自動接続されなかったようなので使っていない。今度暇なときにでも試そうと思ってます。
-  純正アプリは相変わらず。心拍歩数以外もgoogle fit連携して欲しい。
- 画面の明るさ調整って3にあったっけ? 4にはある。
- 3に無かった、座りっぱなし防止タイマみたいな機能が増えた? 素晴らしい。
 睡眠や心拍の測定精度が良くなったのかは正直自分にはわからないので、感想はそれ以外になります。

「座りっぱなし防止」が、事前調査で気づかなかった(多分)mi band4の新機能で、これがPCデスクワークの多い自分にはありがたいし、すごく面白いです。mi band4にしてよかった。

3Dプリンタを買いました(ANYCUBIC PHOTON)

3Dプリンタを使おうと思って、ANYCUBIC PHOTONを買いました。(Sやzeroじゃない安いやつです。)光学式です。
3万円で買えます。3Dプリンタ本体が安く買える、良い時代になりました。



今はBlenderで描いているフィギュアのテスト出力に使っています。あとは、文ッ字フリマで出す製品にも使う予定。


以下、開封写真。




箱に入っている付属品一式です。

手袋とマスク(一応程度)もついています。


下面にファン。




容器内部もクッションが充填されています。



内部クッションの中に印刷土台(宙に浮く方)が埋まっています。

レジンバットです。あらかじめフィルムが貼られていて、そのまま使い始められます。





マスクは後でもっとちゃんとしたものを買いました。


ところで3Dプリンタはレジン毎に性質が異なるためパラメタ(露光時間)の調整が必要で、Photonの先達の方々はテスト出力をいろいろ工夫したりしていたそうなのですが、私が買ったPhotonには、USBの中にサンプルデータ他の諸々と一緒に、露光時間をテストするための特別なテスト出力データが入っていました。

また本体も、先達は外から光が入らないように工夫していたそうなのですが(写真を見ると外板が透明)、今はいちおう不透明な外板がはめられています。



3Dプリンタは1000万とか100万円スタートだったものが、今はPhotonのようにやすければ
3万円台スタートと大変安くなりました。
とはいえ本体だけで始められるわけではなくて、いろいろ 購入する必要があります。主に周辺の消耗品と、レジンです。



eog(eye of gnome)のビルド

Ubuntu 20.20 daily build.




Ubuntu20.20のeogは2020/03/07時点ではversionが3.35.92で、gitリポジトリは3.35.93となっている。


# ソース取得とmesonビルド
```
git clone https://gitlab.gnome.org/GNOME/eog.git
cd eog
sudo apt install meson
meson build/
```

# gio-2.0 依存解決
```
 Found pkg-config: /usr/bin/pkg-config (0.29.1)
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency gio-2.0 found: NO (tried pkgconfig and cmake)

meson.build:108:0: ERROR: Dependency "gio-2.0" not found, tried pkgconfig and cmake
```

これを解決するのは `libgio-cil libgio2.0-cil-devlibgio3.0-cil libgio3.0-cil-dev ` ではない。
`sudo apt install libglib2.0-dev`
で解決。

```
MN@daisy-bell:eog/$ meson build/
~
Found pkg-config: /usr/bin/pkg-config (0.29.1)
Run-time dependency gio-2.0 found: YES 2.64.0
Run-time dependency gio-unix-2.0 found: YES 2.64.0
Found CMake: /usr/bin/cmake (3.16.3)
~
```

```
Found pkg-config: /usr/bin/pkg-config (0.29.1)
Run-time dependency gio-2.0 found: YES 2.64.0
Run-time dependency gio-unix-2.0 found: YES 2.64.0
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency gnome-desktop-3.0 found: NO (tried pkgconfig and cmake)
```
`sudo apt install libgnome-desktop-3-dev`

```
Run-time dependency gnome-desktop-3.0 found: YES 3.35.91
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency libpeas-gtk-1.0 found: NO (tried pkgconfig and cmake)
```



`sudo apt install libpeas-dev`


```
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency libexif found: NO (tried pkgconfig and cmake)

meson.build:144:2: ERROR: Assert failed: libexif support requested but library not found. Please use -Dlibexif=false
```
`sudo apt install libexif-dev`

```
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency lcms2 found: NO (tried pkgconfig and cmake)
```
`sudo apt install liblcms2-dev`

```
Has header "zlib.h" : YES
Checking for function "inflate" : NO
Library z found: YES
Checking for function "inflate" with dependency -lz: YES
Checking for function "crc32" with dependency -lz: YES
Run-time dependency libexif found: YES 0.6.21
Has header "libexif/exif-data.h" with dependency libexif: YES
Run-time dependency lcms2 found: YES 2.9
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency exempi-2.0 found: NO (tried pkgconfig and cmake)

meson.build:161:2: ERROR: Dependency "exempi-2.0" not found, tried pkgconfig and cmake
```
`sudo apt install libexempi-dev`

```
Has header "zlib.h" : YES
Checking for function "inflate" : NO
Library z found: YES
Checking for function "inflate" with dependency -lz: YES
Checking for function "crc32" with dependency -lz: YES
Run-time dependency libexif found: YES 0.6.21
Has header "libexif/exif-data.h" with dependency libexif: YES
Run-time dependency lcms2 found: YES 2.9
Run-time dependency exempi-2.0 found: YES 2.5.1
Found CMake: /usr/bin/cmake (3.16.3)
Run-time dependency libjpeg found: NO (tried pkgconfig and cmake)
Checking for function "jpeg_destroy_decompress" with dependency not-found: NO

meson.build:169:2: ERROR: Assert failed: libjpeg support requested but library not found. Please use -Dlibjpeg=false (some programs using GTK+ may not work properly) ```
`sudo apt install libjpeg-dev`

あと
`sudo apt install librsvg2-dev`


```
Has header "zlib.h" : YES
Checking for function "inflate" : NO
Library z found: YES
Checking for function "inflate" with dependency -lz: YES
Checking for function "crc32" with dependency -lz: YES
Run-time dependency libexif found: YES 0.6.21
Has header "libexif/exif-data.h" with dependency libexif: YES
Run-time dependency lcms2 found: YES 2.9
Run-time dependency exempi-2.0 found: YES 2.5.1
Run-time dependency libjpeg found: YES 2.0.3
Checking for function "jpeg_destroy_decompress" with dependency libjpeg: YES
Has header "jpeglib.h" with dependency libjpeg: YES
Checking for function "jpeg_simple_progression" with dependency libjpeg: YES
Checking if "libjpeg version is 8 or greater" with dependency libjpeg compiles: YES
Run-time dependency gobject-introspection-1.0 found: YES 1.63.2
Run-time dependency librsvg-2.0 found: YES 2.46.4
Run-time dependency gdk-3.0 found: YES 3.24.13
Run-time dependency x11 found: YES 1.6.9
Configuring org.gnome.eog.desktop.in using configuration
WARNING: Gettext not found, all translation targets will be ignored.
Configuring org.gnome.eog.gschema.xml using configuration
Found pkg-config: /usr/bin/pkg-config (0.29.1)
Compiler for C supports link arguments -Wl,--version-script,/home/nuka/eog/src/symbol.map: YES
Program msgfmt found: NO

plugins/meson.build:1:0: ERROR: Program(s) ['msgfmt'] not found or not executable
```
`sudo apt install gettext`


```
Message: Configure summary:

  Source code location .......:  /home/nuka/eog
  Compiler ...................:  gcc
  Extra Compiler Warnings ....:  -Werror=format=2 -Werror=implicit-function-declaration -Werror=init-self -Werror=missing-include-dirs -Werror=missing-prototypes -Werror=pointer-arith -Werror=return-type -Wnested-externs -Wstrict-prototypes
  EXIF support ...............:  true
  XMP support ................:  true
  JPEG support ...............:  true
  Colour management support ..:  true
  GObject Introspection.......:  true

Build targets in project: 25

Found ninja-1.10.0 at /usr/bin/ninja
```
以上meson成功。


# 無視
```
Has header "zlib.h" : YES
Checking for function "inflate" : NO
Library z found: YES
```
は無視して良い模様。


# ビルド
```
cd build
ninja
```
`[70/70] Generating Eog-3.0.typelib with a custom command.`

# 実行
以下のパスに実行ファイルが生成されている。
`build/$ ./src/eog`





electronの右クリックメニューから選択テキストを使う

lina_dictoにて、選択テキストを右クリックメニューでGoogle検索とGoogle翻訳にかける機能を実装しました。 右クリックメニューはcontextmenuで設定できます。 https://www.electronjs.org/docs/api/menu#render-...