2022/03/27

[RN] 自作証明書をクライアントで使いたい

Android で、aarで組み込んだライブラリの方で HTTPS サーバが起動していて、アプリはその HTTPS サーバに接続してリクエストするような作りになっているとしよう。
その HTTPS サーバは公開しないけど、なんかあったら嫌なので自分で作った証明書を使っている。
さて、そこにどうやってアクセスすると良いのだろうか?

 

最初は「JavaScript self signed」などで検索していたのだが、よく出てくるのが「reject unauthorizedオプションを無効にする」というやつだった。
どう見ても、認証を無視する設定だと思う。開発中はまだよいかもしれんが、今回はしょっちゅう証明書を作り直すわけでもないから認証する方で実装しておきたい。

ようやく出てきたのがこちら。

javascript - nodejs - error self signed certificate in certificate chain - Stack Overflow
https://stackoverflow.com/questions/45088006/nodejs-error-self-signed-certificate-in-certificate-chain

'ca' などというオプションがあるのね。
しかしこれ、 require で 'https' とかやってるし、React Native では使えない気がする。


そう、今回は React Native でやりたいのだ。
React Native は Node.js ではないので同じことができるとは限らない。

Networking · React Native
https://reactnative.dev/docs/network

fetch() は聞いたことがある。
Mozzila の MDN 参照と言うことは node-fetch ではなく標準な fetch() なのだろう。
ということはファイルシステムなんかは使えないと思う。

[Android]How to fetch() from https server with self-signed certificate · Issue #6995 · facebook/react-native
https://github.com/facebook/react-native/issues/6995

うーーーん・・・・・・・・・。

これは Native 側に実装して呼び出すようにした方が簡単だし確実そうだなぁ。

2022/03/23

Lambda関数?

いろいろと耳を塞いで生きてきたと思う。
運が良ければスルーできるのだが、そうならない場合も多い。

Lambda関数はどうだろう?
まだわからないのだが、調べるに越したことはない気がしている。


まずはこちらから。

アロー関数 - TypeScript Deep Dive 日本語版
https://typescript-jp.gitbook.io/deep-dive/future-javascript/arrow-functions

アロー関数の説明で、「または」ということで Lambda関数という呼び名を紹介している。
アロー関数は私もしばしば使う。 function でも => でもどっちでもよいときはどうしたもんだか、と悩みはするものの、アロー関数じゃないとダメなところもたまにあるので、そんなに忌避しているわけではない。

this がどうのこうのは JavaScript の話だと思う。

となると、アロー関数が Lambda 関数とも呼ばれるような要素と言ったら「function と打つのが長い」しか当てはまらないと思うのだよ。

しかし、 Kotlin なんかは fun だし、Golang(に Lambda関数があるかは知らんが) は func だ。これを長いというのはちょっと無理があるだろう。
となると、変数に代入するような書き方ができるとかか?

 

検索すると AWS のも出てくるが、そちらで調べていくと今の知識だと間違えそうなのでやめておく。
あとは Excel と Python が出てきた。
よし、Python で見よう。

Pythonのlambdaって分かりやすい - Qiita
https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df

最初に「無名関数」と説明してある。
あれ、無名関数って別の呼び方をされてなかったっけ?
無名クラスか。 Java だったような気がするが、入れ子でクラスを書くときにそういうのが出てきたような。

hiro99ma blog: [android]Java8への思いやりを形に
https://blog.hirokuma.work/2015/11/androidjava8.html

Android Studio が私が書いたコードを勝手に省略しようとするから腹が立ったという話だ。
このときもあんまりわからずに終わっているが、結局は見栄えだとか手軽とか、そこら辺が魅力ということなのだろうか。


もっと一般的な何かがあるはずだ。

language agnostic - What is a lambda (function)? - Stack Overflow
https://stackoverflow.com/questions/16501/what-is-a-lambda-function

一気に難しそうな話になってしまった・・・。
少なくとも、私の力で読み解くのは難しそうだ。

無名関数 - Wikipedia
https://ja.wikipedia.org/wiki/%E7%84%A1%E5%90%8D%E9%96%A2%E6%95%B0

ラムダ式・・・関数型言語・・・うぅ、頭が・・・。

 

しかし、JavaScript ってこんな書き方ができるんだ、と思っていた部分の一つが Lambda関数 / Lambda式 / 関数オブジェクト / 無名関数 と呼ばれるものの概念などを言語に落とし込んだ結果なのだろう。

なので、あまり難しく考えず、JavaScript のアロー関数など、と覚えておくことにしよう。どうせ正解はないのだ。

2022/03/21

[win10] AutoHotKeyで複数ウィンドウを対象にする

ショートカットキーのアサインを自分の好きに設定したいことがある。
カスタマイズできるアプリであればよいのだが、できないアプリの方が多いだろう。

私は Windows10 を主に使っているので AutoHotkey を使っている。

AutoHotkey
https://www.autohotkey.com/

AutoHotkey の前は窓使いの憂鬱を使っていたと思うが、Windows7 くらいで開発が終わってしまったので乗り換えたような気がする。


AutoHotkey はいろいろできるのだが、私はキーアサインの変更でしか使っていない。

Hotkeys - Definition & Usage | AutoHotkey
https://www.autohotkey.com/docs/Hotkeys.htm

CapsLock を Ctrl として使っているのだが、それは AutoHotkey ではなくレジストリで変更するタイプにしている。
Ctrlキーとの組み合わせも登録できるならよかったのだが、さすがにできない。

「Change Key」非常駐型でフリーのキー配置変更ソフト - 窓の杜
https://forest.watch.impress.co.jp/library/software/changekey/

Ctrl2cap - Windows Sysinternals | Microsoft Docs
https://docs.microsoft.com/ja-jp/sysinternals/downloads/ctrl2cap

キーの入替は AutoHotkey でもできるのだが、レジストリで変更しているのでアプリがなくても有効だし、なにより「強い」感じがする。

Remapping Keys (Keyboard, Mouse and Joystick) | AutoHotkey
https://www.autohotkey.com/docs/misc/Remap.htm#registry

 

 

AutoHotkey でも PowerToys でもだったが、 Ctrlキーを押すタイプのアサインをしていると、そのアサインを長押しすると Ctrlが抜けて文字がそのまま打ち込まれてしまうことがある。

たとえば Ctrl + n にカーソル移動を割り当てていた場合、 Ctrl + n を長押ししているとときどき「n」がそのまま打ち込まれてしまうのだ。

カーソル移動のキーは長押しすることが多いのだが、テキストエディタでこれが発生すると非常に困る。 Android Studio のように自動保存するタイプだと気付かずに保存されてしまうこともあるし。
レジストリでの変更が「強い」と思うのはこういうのがないところだろう。

 

AutoHotkey のことを調べたが解決しなさそうなので、ソースコードの編集をするアプリ以外は AutoHotkey を通すようにしてみようと考えた。
まあ AutoHotkey がどうやって処理しているのかは知らないのだけど、スルー条件に一致したら何もせずにアプリにキーが通知されるのではないだろうか。そうならば、テキストエディタならキーアサインの変更はだいたいできるので、面倒ではあるがアプリ側で対応すればよいと思う。

そんなわけで、私がよく使っている EmEditor, Visual Studio Code, Android Studio 以外を処理するように書いてみた。

#InstallKeybdHook

SendMode Input

#If !WinActive("ahk_exe emeditor.exe") and !WinActive("ahk_exe studio64.exe") and !WinActive("ahk_exe Code.exe")
    ^f::Send,{right}
    ^b::Send,{left}
    ^n::Send,{down}
    ^p::Send,{up}
    ^h::Send,{backspace}
#If

sc029::Send,{Esc}
^+f::Send,^{f}
^+b::Send,^{b}

 

最初、普通の if 文で書いていたのだがうまく動かずに悩んでしまった。 Hotkey の方は #If 文を使うのだった。

Ctrl+F をカーソル移動に割り当てると、検索をどのキーに割り当てるのかで悩むので、私は Ctrl+Shift+F にしている。
新規作成は Explorer の方でやるから Ctrl+N は使ってよいし、印刷もしないから Ctrl+P もよい。
Ctrl+B は何かというと、Excel でフォントを Bold にするときだろう。

2022/03/12

文字で図を描く

まとめ

  • GraphViz はすごい
  • ASCIIFlow もよいよね

 


おはなし

何を言っているんだか、というタイトルになってしまったが、開発ドキュメントのことだ。

私は比較的図を描くのが好きな方だと思う。
図にできないようであれば言葉でも説明できないだろう、と思っているのだろう。

かなりの場合で Excel を使っている。
Windows10 の「新規作成>Excel」でよく使う Excelテンプレートのファイルを作るように変更するくらいには使っている。
いまだに、Excel より使い勝手のよいツールを見つけられていないのだ。

計算もできる、図も描ける。
編集できるのが印刷単位ではないので広く使えるし、なんなら表だって作ることができる。
画像も貼り付けられるし、それでいてファイルサイズはあまり大きくならない。
OpenOffice 系のツールも、Word や Excel の代替としてはよいと思うのだが、図が描きにくいのだ。そういう意味では Web版の Excel は私に合わないかもしれない。

思い返すと、Excel より前に開発でよく使っていたのは Visio だった。
Visio といっても、Microsoft に買収される前だ。
これはよいね、と思って使っていたら Microsoft に買収されて、これはもっとよくなるかと思ったら・・・・、いかんいかん、昔のことは忘れよう。

ともかく、アプリの好き嫌いは個人でけっこう差があるし、マシンスペックによって受ける印象が全然違うこともあるしで、私の目線で話すことは全然客観的ではない、とだけ言わせてもらおう。

 

話を戻して。

履歴管理と画像ファイルの相性はそれほど良くない。
ファイルが変更されたことは分かるが、どの部分が変更されたかがわかりづらいためだ。

図を描くテキストファイルがあるなら、それを履歴管理すれば良いという考え方もある。
筆頭に上がるのは GraphViz だろうか。
なんなのだろうね、このツールは。

私が初めて GraphViz に関わったのは Doxygen だろうか。 Doxygen には class図みたいなものや C言語の include グラフのようなものを出力する機能があるのだ。
call グラフや caller グラフも出力するし、なんだこれは、と衝撃を受けた記憶がある。

PlantUML もそうだ。
あれも PlantUML の書式でファイルを作っていけばシーケンス図やクラス図などが出力できるのだが、最終的には GraphViz を使っているのではなかったか。
なんなんだ、あれは!

 

GraphVizギャラリーがあった。

https://graphviz.org/gallery/

なんかもう、グラフってなんだろう?と思ってしまうくらいにいろいろな出力があるな。
ともかく、文字列で描画を指示できるのであれば、履歴管理しても多少は差分がわかりやすいだろう。


GraphViz はよいとしよう。
それ以外にないだろうか?
つまり、書式では指示しづらいような図だ。

+--------+
|        |
| hiro99 +---+
|        |   |   +------+
+--------+   +--->      |
                 |  ma  |
                 |      |
                  +--+---+
  +--------+         ^
  |        |         |
  | kuma99 +---------+
  |        |
  +--------+

このような図で十分な場合、私は asciiflow legacy を使っている。
"Legacy" が付かない方もあるのだが、うまく使えなかったので legacy の方にしている。

これはいわゆるアスキーアートのような形で図を描いている。
表示が固定幅フォントなどでできるなら、まあそこそこ履歴管理しても相性は悪くないのではないかな。

[js] Uint8Array はオブジェクト

まとめ

  • React Native → Android へ Uint8Array を渡したいとしても、base64 でエンコードするのが無難そう

 


おはなし

前の記事で ArrayList<Byte> を ByteArray に変換する話をした。
しかし、その前の条件が間違えていた。
React Native から Uint8Array を Android に渡したのだが、Uint8Array はオブジェクトであって配列ではないということだ。

Error: Exception in HostFunction: Malformed calls from JS: field sizes are different.

こんな例外が発生したのだ。

たぶん number[] を渡せばうまくいくのだろうが、やりたいことはそうではない。
おそらく Uint8Array も Kotlin の ByteArray と同じように効率が良いオブジェクトなのだと思う。
それを for とかでぐるぐる回して number[] に入れて渡すなんてことはしたくないのだ。

 

そんなわけで Uint8Array を眺めている。

Uint8Array
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array

まず、 Uint8Array.toString() で文字列にして String.toByteArray() で戻してみた。
・・・ダメ。
toString() は中のデータを無理やり文字列として扱う、ではなく、中のデータを 1バイトずつコンマ区切りで出力する、というものだった。

toLocaleString() がたぶんそういうことをしてくれそうなのだけど、locale の指定をするということは何かしらの変換をバイト単位とかで行うということだと思う。
それだったら・・・それだったら base64 にしてやりとりするのが一番無難じゃないか!

base64 なら無理やりな変換ではなくバイナリ向きだし、文字列になるし、何も問題はない。
問題なのは、せっかくプリミティブ向けに型を作ってあるのに申し訳ないという気持ちだけだ。

 

というわけで、こうなりましたとさ。

JavaScript側 : base64String = Buffer.from(Uint8ArrayData).toString('base64')
Android側 : Base64.decode(base64String, Base64.DEFAULT)

[kotlin] Windowsでコンパイル

最近、話が長くなっていかん。
なので、先にまとめた内容を書いて、あとにだらだらと書き綴ろう。

 

まとめ

  • kotlinc を初回実行するときには結構な量のダウンロードが行われる
  • Kotlin の Array<E> は配列、ArrayList<E> は List<E> の仲間
  • ArrayList の初期値ありは arrayListOf() で作ればよい
  • ArrayList<Byte> を ByteArray に変換するには .toByteArray() を使えばよさそうだ

 


おはなし

 

Android で Kotlin の勉強しつつやっているのだが、勉強のために Android アプリを作るのはめんどくさい。
PC 上で動かせるようにしよう。

Kotlin command-line compiler | Kotlin
https://kotlinlang.org/docs/command-line.html

GitHub から一式をダウンロード(今の最新は 1.6.10) して、zip を展開。
あんまりファイルが大きくなくて良かった。

Hello World の ktファイルを作ってコンパイル。

>bin\kotlinc.bat test.kt

うわー、ダウンロードが始まった・・・。
しかも結構かかる・・・。

最終的に、 %USERPROFILE%.konan に 1GB くらいダウンロードされた。
JavaScript に対する TypeScript みたいな関係だと思っていたけど、Windowsネイティブなコードを吐くようにしているからだろうか?

まあいい。
深くは考えまい。

なお、コンパイルすると program.exe という実行ファイルができた。


初回だし、次回やるかも分からんので、気になっていることを調べて終わろう。
やりたいのは、Array<Byte> でもらったデータを ByteArray に変換したい、だ。

それぞれ違いはなんじゃ?と調べてみたのだが、

  • ArrayList<Byte> は Javaでいうところの Byte[]
  • ByteArray は Javaでいうところの byte[]

らしい。

java - Difference between ByteArray and Array<Byte> in kotlin - Stack Overflow
https://stackoverflow.com/questions/9457942/difference-between-bytearray-and-arraybyte-in-kotlin

もしかしたら ArrayList<Byte> かもしれんが、ともかくオブジェクトかプリミティブ型かの違いが大きいということだろう。
Kotlin は「[]」みたいな配列の作り方ではなく「Array<T>」のような形でしか書けないので、T がプリミティブ型だと効率が悪いだろうってことで ByteArray 型が別に用意されているんだと思う。

 

変換したい背景をもう少し話すと、React Native 側のデータが Uint8Array 型で、それを Android 側で処理することになった。
React Native と Android の型は異なるので、この型はこうなるというマッピングがある。

Argument Types
https://reactnative.dev/docs/native-modules-android#argument-types

JavaScript の Uint8Array は Array だろうから、Java だと ReadableArray というものになる。
ReadableArray は React Native で提供される型でこうなっている。

react-native/ReadableArray.java at main · facebook/react-native
https://github.com/facebook/react-native/blob/main/ReactAndroid/src/main/java/com/facebook/react/bridge/ReadableArray.java

この中で一番 ByteArray に近そうなのはこれだろう。

ArrayList<Object> toArrayList();

・・・と思ったのだが、ArrayList<Object> なので ArrayList<Byte> ではない。
これは as で変換できてほしい(願望)。

そして ArrayList<Byte> を ByteArray に変換したい、というところなのだ。
いや、それは正確ではないな。実際にやりたいのはファイル保存なのだ。 ByteArrayInputStream というクラスがあったので ByteArray に変換したいだけであって、InputStream になるなら ByteArray である必要はないし、ファイルに保存できるなら InputStream である必要もない。

ノウハウがないときは近道が分からないから困りますな。


Kotlin の ArrayList には toByteArray() というメソッドがある。
これでいいのかな?

toByteArray - Kotlin Programming Language
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/to-byte-array.html

 

では、まず ArrayList を作ろう。
・・・書き方が分からん。
Kotlin は ArrayList<T> しかないと思っていたのだが、 Array<T> もあるのか。

Arrays
https://kotlinlang.org/docs/basic-types.html#arrays

Array なら arrayOf() で初期値が作れそうなのだが、 ArrayList は?
そもそも、 Array と ArrayList の違いは何なのか??

 

ArrayList はこんな感じなので、MutableList の仲間。

class ArrayList<E> : MutableList<E>, RandomAccess

class ArrayList<E> : MutableList<E>, RandomAccess, AbstractMutableList<E>

List を Array っぽく使えるようにしただけで、あまり Array と関係はないのだろう。
なので初期化も ArrayList のコンストラクタを使えばよかろう。

 

ArrayList のコンストラクタは 2つ。
空の ArrayList を作るか Collection<E> で初期値を持つか。
Collection に arrayListOf() という関数があるそうだ。

arrayListOf - Kotlin Programming Language
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/array-list-of.html

いやー、これは ArrayList の方にもリンクを貼っておいてほしいよ。わからんよ、探したよ。
全体的に~Of() という関数は ~型 の new関数みたいに作ってあるように見える。

 

01: fun main() {
02:     // val va: ArrayList<Byte> = arrayListOf(1, 2, 3, 253, 254, 255)
03:     val va: ArrayList<Byte> = arrayListOf(1, 2, 3, -3, -2, -1)
04:     val v8: ByteArray = va.toByteArray()
05:     for (v in v8) {
06:         println(v)
07:     }
08: }

>.\program
1
2
3
-3
-2
-1

Java と同じく Byte 型は int8 の範囲なので 128~255 はダメだった。
まあ、問題はそれだけだ。

[win10]音量のデフォルト値は100

最近、ワイヤレスのヘッドセットを購入した。
Windows10 で Bluetooth 接続して音を鳴らすと、音量が 100 になっていて非常にビックリした。

まあ、下げれば良いだけなのだが、デフォルト値が 100% というところが困ったものだと思う。
そしてデバイスごとに値を覚えているので、いまの音量と同じになるつもりでデバイスを切り替えると 100 だった、ということがある。

例えば、これは今の私の PC の状況だ。

image

ワイヤレスのヘッドセットをつないだので一番上の「ヘッドホン」が選択されている。
これがさっきは音量 100 だったので、今は 27 に変更している。

さて、ここで zoom や Google Meet を始めたいとしましょう。
ここでは Meet で話を進める。
今回はマイクも使いたいから、Meet の設定画面でマイクのデバイスを設定しよう。
スピーカーとマイクが別のデバイスだと警告が出るので、じゃあスピーカーも同じものを選びましょう。

image

警告が消えた。

image

で、ここでスピーカーのテストをすると大音量になってビックリする、というわけだ。
Windows の方でハンズフリーの方の音量を確認するとこうなっていた。

image

そう、別デバイスとして判断されるので、ヘッドホンのほうで設定した音量とは別になっており、デフォルト値の 100 が使われているのだ。

 

このデフォルト値を変更できれば良いのだけど、探しても見つからんかった。

なので今できるのは、新しいデバイスをつないだらとにかく全部の音量を見直す、ということくらいだ。