2021年4月27日火曜日

炊飯器はおどり炊きを買ってみた

 象印の1万円しないくらいのIHでもなんでもなさそうな炊飯器を使っていて、そろそろ買い換えてみるかということでPanasonicの炊飯器を買ってみた。20年以上前っぽいので元はとれすぎていたり。

去年のモデルの中で安め、ということでWおどり炊きを排除、小容量、大容量はお得ではなさそうなので除外。おどり炊きからIHぐらいまでということにしてSR-MPA100、SR-MPB100、SR-STS100、SR-HX100、SR-HB100、SR-FD100などが候補に出てきた。その中でおどり炊きに対応しているのがSR-HX100以上。可変圧力はカタログ上うまさのランクが高くなかったので除外。ということで、スチームのありなしでSR-STS100とSR-HX100に絞り、Amazonで値段がやすかったので大火力おどり炊きのSR-HX100を購入。SR-HB100は大火力おどり炊きがないだけの差。

結果、うまいのでよかったんじゃないかな。スチームも圧力もないので洗いやすい、メニューもやや多めという利点あり。基本はメニューの違い、次にかためとかやわらかめをどれくらい炊き分けられるかという違いで選べばいいのかなと思う。

どれくらい自動になっているのかとカタログを見た結果、水量、米の量は普通、無洗米で変えなくていいとか、炊く前後の浸けたり蒸らしたりまで時間に入れて微熱で甘みを引き出したりしてくれるだとか、タイマー予約がデジタルだとか、20数年の差というより値段の差? 逆に今までどおりにしてしまうと失敗しそうかもしれない。

次はパンか?

2020年12月4日金曜日

JDK8と11の非互換

 仕事などでは古いJava環境を使っている場合もあり、そんななか、JDK11で8互換でビルドしてJDK8で動かないものがあったのでメモ

 NoSuchMethodError が

java.lang.NoSuchMethodError: java.nio.ByteBuffer.xxxx
と発生。
BufferとByteBufferは実装が変わっているようで、実装されている部分が何かで互換性がなくなっているっぽい。 
コードは互換になるがライブラリまでは見てくれないというJDKの罠はよくある。今回もそんなもののひとつか。
 詳細はこっちかな
 https://stackoverflow.com/questions/61267495/exception-in-thread-main-java-lang-nosuchmethoderror-java-nio-bytebuffer-flip

2020年10月14日水曜日

Oculus Quest 2をつついてみた

 Oculus Quest 2、日本で店頭販売されるということでヨドバシのポイントを活用して予約。昨日の昼頃届いたので軽く設定をして夜使ってみた。

まずfacebookのアカウントが必要なので、ない場合は若干苦労することになるのかもしれず、いろいろニュースにもなっているが略。

アカウントがあればQuest 2購入前でもゲーム、アプリは購入できるので、無料のものをいくつか購入?しておいてもいい。 アカウントがbanされると困るので有料アプリはあとがいいのか。

Rift用のGoogle Earth、Quest用のBeatSaber Demo、YouTube VR、Firefox Realityなど。

でQuest 2の開封。ゴーグル、右左コントローラ、メガネ用スペーサ、あとはUSB電源とケーブルが入っているかもしれない。説明書などは見なかった。 

サイズ感などはOculus Goからあまり変わらない印象。トラッキング用カメラがついているのと電源ボタンなどの位置が違うのと。

コントローラはボタンが多い。フィードバック(振動)的なのもついている。

瞳孔間距離の調整は3段階かな、Oculus Goで問題なければ2の状態で使って問題なさそうだ。1や3でも大きく違いが出るわけでもない。 

頭から外すときにメガネが引っ張られて外れてしまう。Oculus Goより横幅が狭いのかもしれない。密着間は上がるかもしれないが要注意。

電源を入れてWi-Fiに繋ぐ、Wi-Fi接続は失敗することが多いので難関。繋がればアップデートがされて再起動後、スマートフォンアプリと連携になる。

AndroidのOculusアプリは以前から使っていた場合に接続できるVRゴーグルの一覧が更新されないという不具合らしいものに遭遇。キャッシュをクリアすれば改善されるようだが再インストールでもログインするだけで設定が回復するのでおすすめは再インストールか。

Oculus Link的なUSB-C to CケーブルでPCと繋いでみたところ、PC側の設定は完了したがOculus Quest 2側はスマートフォンでないと設定できないので要注意。

その後何度かケーブルをつけたり外したりしてみたが認識されなくなったりはしなかった。Oculus Linkも改善されているということかな。

Androidアプリの方は連携用番号も入れずにリンクできたので、ホーム画面が立ち上がるのを眺める。Goより細かいメニューがさくさく動くのがよい。

立って使うのと座って使うのが選べるので、 安全エリアの設定方法が少し違う。

Oculus Linkとの切り換えも簡単なので、Oculus Link用にケーブルは用意しておいた方がいい。 PC側でOculusアプリが起動している必要があるくらいで、Streamやその他いろいろのVRアプリも使える状態になる。定番といわれているものから少し外れてGoogle Earth、Minecraft などを体験してみるのもおすすめか。

画質はみっちりという感じなのか、Questは使っていなかったがGoと比べて似たような解像度なのでそこまで差があるわけでもないが、なんとなく滑らかではあるように思う。

BeatSaberはOculusQuest用のDemo版を座ったままやってみようと思ったが、座り込むと低すぎて無理だった。座るにも椅子が必要なのかどうか。

Google Earth はミニチュアを上から眺める感じだったり、Minecraft (PC統合版VR)は巨大に見えるブロックの木を刈ってみたり、Quest 2のコントローラはボタンも多いのでやや迷う。

映像系はOculus Goだとメニューが選びにくかったり、途中で停止したりといろいろ限界に近かったが、Oculus Quest 2では操作も再生も問題なくVR180やVR360のYouTube VRなどを使うことができた。動画はOculus Goでいいか、というわけでもなくなった。 

Quest 2ではアプリの入手先はいろいろあって、Oculus公式ストアのRift系、Quest系アプリが使える他、SteamなどでもRift系VRアプリが豊富に販売されている。何か変わったものに遭遇できればいいなと思いながらいろいろ試してみた半日。

2020年10月8日木曜日

Oculus Quest 2のススメ

 Oculus Quest 2が発表され、予約もされているのでおすすめ点を。

Oculus QuestはVRヘッドセットです。360度の立体映像の中に入ることができ、3D映像も見ることができます。

比較対象

テレビと比べると、視野が全体に広がり。

3Dテレビと比べると、枠がないぶん没入度は上です。

3Dヘッドセットと比べると、頭を動かしても映像は顔の前に張りつかず動かせます。

VR機器ではCardboardなどスマホの3Dと比べると、コントローラがある分操作感が上がり、装着も簡単。

Oculus Goと比べると、両手操作ができる分自由度が高くなり、歩くこともでき、PCと繋ぐことも可能。Snapdragonは高性能。

Oculus Rift、PSVRと比べてPC、PSなしでも使える。解像度が高い。

6DoF対応なので移動も可能。センサー設置も不要。

カメラ6DoF、ハンドトラッキング、PC接続のできるVRなので手軽方向に振り切っている形です。 

Oculus Go、Oculus Riftの系統も廃止、統合する方向のようなので価格も今まで以上に手頃。

アプリはOculus Rift、Oculus Quest両方のものがほぼそのまま使える形です。Oculus Goとは互換性がないが同じアプリ、ゲームは多いので有料のものは買い直す必要があるかもしれません。

あと足りないのは全身フルトラッキング系、PC連携のフル映像ぐらいだと思います。

とりあえず必要なのはOculus Quest 2、使える空間、Wi-Fiネット環境ぐらいかな。

Facebook アカウントとスマートフォン(またはPC?)の設定アプリが必要なので、AndroidまたはiPhoneが必要。たぶん。

Oculus Rift用PCアプリが使えるOculus Linkには6コア以上CPU、GeForce RTX 2070ぐらいの強いPCがあると快適なのかもしれない。

Oculus Linkケーブルは純正が細くて無難だが、Ankerなども推奨されている。ただし太かったり、短かったり、中華メーカーなどの規格外の長さのものは接触が悪かったりする。おすすめはUSB Type-C to USB-Type-C の3.xケーブル。理由はType-A to Type-Cでは電源供給が足りないから。USB PDではなくUSB BC系の電源供給だと思うが、長時間Oculus Linkを使う予定ならType-Aはやめておきたいところ。安いケーブルなら駄目元でためしてみるのもありかもしれない。 

アプリは、ゲーム以外で動画だけでなく、どれくらいおもしろいものが出てくるか、といったところはOculus次第なのかどうか。

2020年6月8日月曜日

Java API for JSON Processing,JSONBと比較してみた

ABNFパーサを作ったおまけでてきとーにRFCだけ見てなんとなく作ったJSON実装(SoftLibJSON)がどれくらいJava標準(Java API for JSON Processing と JSONB)に近いのかなと思い、比較してみた。
結果、一応元のRFCがあるのでほぼそっくりではあるのだけど、微妙に違うのでそのあたりの解説と、今後どうするのかとか。
 Java API for JSON Processing
SoftLibJSON
 
TEXTぱーす  
どこか
JSON.parse()             
 JSON TEXT化 JSONValue.toString()
 
 Object→JSON JSONValue.valueOf()
 
 JSON→Object JSONValue.map()
 
 値JsonValueJSONValue
     
 NULLJsonValue.NULL
JSONNULL 
 trueJsonValue.TRUE
JSONBoolean
 
 falseJsonValue.FALSEJSONBoolean 
 数値JsonNumber
JSONNumber 
 配列JsonArray
JSONArray
 
 構造体JsonObject
JSONObject
 
こうしてみると、JsonValue からの継承関係はだいたいおなじ。JsonArrayはList,JsonObjectはMapを継承するのに対して、SoftLibJSONではJSON Pointerに対応するための機能も埋め込んだため、JSONArrayとJSONObjectではJSONCollectionとしてまとめたものを継承しているのが違い。
値の取り出し方はJava APIの方が型変換の呪縛でいろいろごっちゃりしているのに対し、SoftLibJSONではvalue()やmap() で取り出すのみでお手軽。
JSONへの変換、JSONからのパースは、Java APIでは別になっているが、SoftLibJSONではいろいろと融合している。JSONValue.valueOf() でなんでも済まそうとしている。
具体的に変換できそうなものは
  • List,配列 と JSONArrayの相互変換
  • class,Map と JSONObjectの相互変換
というものをReflectionを駆使して実装した結果、JSONB的なことは、ざっくり実装してしまっているが、オブジェクトの生成はコンストラクタの方に追従してみた方がいいのか? と思いJSONArrayからコンストラクタの変換にも挑戦中。
今後どういう変換機能をつけていけばいいだろか。

https://github.com/okomeki/SoftLibJSON
https://github.com/okomeki/SoftLibABNF

2020年4月18日土曜日

HMACと暗号の実装

ハッシュを作ったので次はHMACなど作ってみた。
HMACはハッシュを使ってパスワード認証的なものもつけているので改変されていないかなどで有利なのかどうなのか。JavaではMacという分類のあれこれ。
ハッシュごとのハッシュ長は取得できてもブロック長やら何やらを取得するのがJavaの標準APIにはなさそうなので自作ハッシュではそのあたりも拡張しておく。
HMACに適当なハッシュを載せられるので、MD2とか対応してなさそうなのをあわせてみてもいいし、SHA-3ではべつのアルゴリズムKMACを使うようだけどもHMACでも問題なく対応しているし、仕様にもあるはず。 JDKにはまだHMAC-SHA3とかなかったかも。
HMAC-MD5とか、HMAC-SHA-256とかいろいろできるので広がる。
ただ、暗号という位置づけなのか、何もしないとHMACなどMac系のアルゴリズムはJavaに登録できない感じだったので、署名などつけないといけないのかもしれず、暗号だけのライブラリには分けてみたけど署名を試すのはまた次回。
登録しなくても、自作すればどうにでも使えるので動作は問題ない。
他にもMac系のものがあるようなので、KMacとか作ってみる予定は未定。SHA-3と別の資料なのでまた読むのが大変。

暗号

作る予定ではなかったかもしれないけど、ハッシュをいろいろ作ってみた勢いで暗号にも手を出してしまった。
詳細ではなくどんなのがあるかくらいのメモでいいかな?

ブロック暗号、ストリーム暗号


暗号の基本、大まかにはブロック単位の暗号と、バイト単位でデータと(疑似)乱数をXORで暗号を作るストリーム暗号とがある。他のもあるが、大量のデータを暗号化するにはこのふたつかな。よく使われるのはブロック暗号なのかどうか。ブロック暗号も組み合わせ方によってはストリーム暗号として使うこともできる。逆にストリーム暗号の長さを固定してブロック暗号として使えるのか、というと使える、がビット反転では弱くないのか謎。暗号強度に差が出る場合があるのでそれぞれのアルゴリズムで判断した方がいいかもしれない。
ブロック暗号もストリーム暗号もJavaのストリームとして使えるようにしておくと便利なのかもしれないので基本の部分は共通の設計にしておこう。
ストリーム暗号ではXORするだけなので、最後は必要な長さで切り取って終わらせられるのだけど、ブロック暗号ではデータの長さとブロックの長さとで端数が出てしまうので、PKCS#5などのPaddingの埋め方もいろいろあるよというところぐらいまで。
PKCS#5のPaddingでは、最後に長さの数値を繰り返し埋め込んで、複合化したときにその長さを読んで切り捨てる、という方式がPKCS5Paddingとかいう簡単な方式。

DSAは実装も暗号?


暗号はDSAからいってみよう、と思ったら大変。バイト単位で計算するんではなくてビット単位で並び替えてみたり、それなりに難しい箇所がたくさん。
DSAはもう廃止されているアルゴリズムなので、いろいろ参考にできるものが少なくて大変。まずテストパターンが見つからないので合っているのかどうかがわからない。 内部状態は紙の資料をコピーしたようなのが1つ見つかったので試してみることはできたけども。
というわけでDSAは、要所要所でどれが合ってるのか探るのに苦労した。
乱数表は、わかりやすく展開できるのにいつまであの形なんだろかという疑問もあり。コードを書きにくいのは、何の得にもならないと思うのだけど。そういう点が何カ所かあった気がする。暗号の練習には最適かどうか謎。

暗号モード

で、とりあえず動いたところでブロック暗号には暗号アルゴリズムとは別にモードというものもあったりなかったり。ECBとかCBCとか。単純に暗号コードを潜らせただけでは1つのブロックを暗号にはできてもつづくブロックを同じように暗号化していればバレてしまう。難しい暗号になるわけではないのでなるべく均一に解読されやすそうにならないように、いろいろと前後混ぜていく処理など。
それもHMACのように暗号とは別に作っておくことで、どの暗号とも組み合わせが効くので便利。ECBというのは何もしないモードかな。暗号自体にもNULL暗号という何もしない暗号があるので間違って使わないようTLSなどでは無効化してあったりなかったり。
暗号モードによってはブロック暗号をストリーム暗号にすることもできる。これはまた便利な場面も出てくるかも。
CBC,ECB,CFB,OFB,CTR,PCBCぐらいのものを作ってみた気がする。

ブロック暗号とストリーム暗号、のモード


ブロック暗号を使ってストリーム暗号の乱数を作っているのがCFBとかOFBとかのモード。これでブロック暗号でもバイト単位での暗号が可能。ビット単位で反転させる攻撃には弱そうだけども。CFB,OFBをとりあえずストリームモードにも対応してみた。CTRも対応できそうか。
ストリーム暗号専用の暗号はまだ実装してみていないのでまたあとで。KDDIの KCipher2作ってみようかと思う。

速度が出ない?

データをファイルなどから読んで、ハッシュや暗号にブロックサイズ単位で投げつける処理をまとめて作っていたのだけど、なかなか処理速度が上がらなかった。出力先のOutputStreamにもブロックサイズでしか出力していなかったからで、ある程度まとめてから吐き出す処理に変えると速くなった。ハッシュのときは出力先がなかったのでいろいろと改良しておいた。
モードによって連続して暗号化できるわけでもないので暗号を単純にまとめて速度アップもやりにくい。いろいろと難しい。

ストリームに暗号をはさめばよい

という考えでFilterOutputStreamっぽいものを書いたら速度が出なかったので、次はwriteした単位でまとめてから次に渡すようにしてみる。
パディングに引っかかりそうなデータを残して暗号化にかけ、送り出す、というのを暗号、復号、InputStream、OutputStreamの組み合わせで作ってみるといろいろ楽になる。
JavaのCipherにラップして放り込んでみたら復号側の処理単位が途中データを出してくれなくてあれでだめだった。暗号と復号をひっくり返すModeっぽいのも作っておくと楽しい?

AESは数学なあれ

AESは難しい。まず資料だけ見て書けるものではなかった。ガロア体とか有限体とかいうのが謎だったので調べまわり、ようやく動くものができた。行列の計算ぐらいは基礎だけどもAESでは桁が繰り上がらないとかガロア体特有でいろいろ難解。
動くようになれば最適化しがいのあるガロア体でもあり。
2ビットや4ビットの数と掛け合わされているので減らせる計算もある。
説明どおりに作れば鍵長128bit,192bit,256bitには対応できる。鍵は初期時に全パターン生成しておく。それは簡単。byte単位でもintサイズでもいいが、最初はバイト単位で作ってみたり。
次にsboxの生成方法を調べてみたがこれはほとんど正解なし。書籍でもお茶を濁したようなものばかり。正解らしきものは見つけたので使わせてもらう。
AESの中の処理はガロア体で掛け算、ガロア体で変換、シフト、鍵で混ぜの4種類くらい。

AES(バイト単位で暗号化するよう書いてみた)でJDKのAESと速度比較してみたら、完敗だったのでintで処理するように書き直して互角ぐらいの速度まで持ってきた。
KCipher2ではMixColumnsがテーブル化されてしまっていたのでAESでも真似てみるとたぶん最速の状態になった。

KCipher-2

九州大学とKDDI研究所とが作ったというストリーム暗号、AESと部分的に似ているが微妙に異なる処理なので、合っているのかいないのがも微妙にわかりずらいので難航。いつできるかな…。元の資料よりRFC 7008見た方がいいのかも?

2020年4月17日金曜日

Logicool UnifyingレシーバとUSB3電波干渉

Logicoolのワイヤレスマウスやキーボードは、USBのUnifyingとかいうコンパクトワイヤレスアダプタでPCと繋がっていい感じなのだが、USB3.xとは相性が悪く、隣の端子に(M.2型の)SSDを繋いだところ、ログイン後キーボードマウスが動かなくなってしまう現象に遭遇してしまった。
対処方法は、USB端子を離すこと、Bluetoothを使うこと。
最近のキーボード、マウスはBluetooth LEにも対応しているのでBluetoothにしてみるのがひとつの解決策。
Bluetoothにするとマザーボードの設定ができなくなったりするので可能ならUSB3とUnifyingのレシーバを離して繋ぐのがいいのかも。


炊飯器はおどり炊きを買ってみた

 象印の1万円しないくらいのIHでもなんでもなさそうな炊飯器を使っていて、そろそろ買い換えてみるかということでPanasonicの炊飯器を買ってみた。20年以上前っぽいので元はとれすぎていたり。 去年のモデルの中で安め、ということでWおどり炊きを排除、小容量、大容量はお得ではなさ...