えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

REALFORCEを購入しました。

1ヶ月くらい前(?)にAmazonのセールがあり、この機会に気になるものをいくつか買うなどしていました。

1万円以上購入するとポイント還元率も高くなるようだったので、壊れかけのゲーミングキーボードの替えを購入することにしました。


その時まで使っていたキーボードはロジクールのPROキーボードで、持ち運びに優れたゲーミングキーボードです。購入当初は1万5千円くらいでした。

gaming.logicool.co.jp

ケーブル着脱可能で15インチノートPCくらいの横幅の非常にコンパクトなタイプで非常に使用感が良かったです。LEDはカスタマイズ可能で、気分に応じて光り方を変えられます。

私はLinuxで使う機会が多かったので、あまり強く光らないオレンジに点灯させていました。

ただ、既に購入から3年以上経過していたためか、いくつかキーの接点部分が折れて取れるようになってしまっていました…

気をつければそれほど気になる程でもないですが、不意に取れたりすることもあり、使い勝手が悪化していたので、この機会に買い替えることにしました。


購入基準

購入基準は次のように設定しました。

  • キー配列:US
  • PCとの接続:有線
  • スイッチ:静電容量無接点
  • テンキー:なし
  • 価格:せっかくなのでタイムセール品を

その理由を以下に書きます。


キー配列 JP -> US

キーボード配列はUS配列にしました。プログラミングでよく使うキーへのアクセスが良くなることを期待しての変更です。

ローマ字くらいしかキーを見ずにタイピングができない私にとって英字キーへのシフトコストはそれほど高くないだろうと信じています!


PCとの接続:有線

これは有線一択です。無線は反応が悪いです。

…というもの、初めてPCを自作したときにBluetoothドングルで接続するタイプの無線キーボードを購入したのですが、しばしば接続状況が悪くなり応答が遅れたりすることがありました。

この状況が続いたため、有線を使い続けていたのですが、GPUをローエンドタイプに変更したときに無線キーボードの反応が劇的に改善しました。

当初の無線キーボードの不具合は自作PCに搭載されていたGPUのノイズだと分かり、それ以来はゲーミングGPUが搭載されたPCで無線キーボード・マウスを使わないと決めていました。

あとは、WIndowsや複数のLinuxを入れ替える関係上、設定が面倒ということも挙げられます。


スイッチ:静電容量無接点

以前使っていたのは「コッコッコ…」と軽い音が鳴るスイッチでした。

ただ、それでもかなり音は大きかったと感じたので、静音かつ押しやすい静電容量無接点のキーボードを買おうと考えていました。


テンキー:なし

そんなに数字を打ち込まないのと、そもそも練習をしていないのでテンキーは不要と考えました。



これらを踏まえて絞り込んだところ、REALFORCEになりました。

HHKBは小型ではあるものの、ショートカットが大変というレビューなどを見て見送りました。

FILCOとも悩みましたが、弊CTOのお墨付きもあり、REALFORCEにしました。


REALFORCEのサイトは以下から

www.realforce.co.jp


使用感

REALFORCEが届きました。

サイズ感、重さは前使っていたものと同じくらいです。

ケーブルは着脱不可ですが、横からも引き出せます。


横方向だとマウスが使いにくかったので、結局奥から引き出すようにしました。


キーキャップは専用の治具を使って取り外せます。

付属品にCtrlキーとCapsLockキーの入れ替え用パーツがあったので、取り替えることにしました。

手が小さい私にとってはありがたいオプションです。

入れ替えの際は、「Fn + F11」を押して入れ替えます。

(なお、この入れ替えのせいで他のキーボードの誤爆が激増しました)


US配列なので、スペースキーは広くなり、エンターキーは小さくなっています。

これによってこれまでエンターの上付近を押していた私の誤爆率は激増。数週間は"\"に悩まされています…


意外なゲーミング要素?

LEDが赤・青・緑・白のいずれかから選べます。


購入から1ヶ月経ち、US配列にも慣れてきました。

数ヶ月前に購入したM1 MacもUS配列にしたいなーー…

AI線画抽出を試す(Informative Drawings)

GitHubでフォローしているアカウントからの通知欄で、Informative Drawingsというソフトウェアを知りました。

↓ informative-drawingsのサンプルプログラム(ONNX)

github.com

↓ informative-drawingsのリポジトリ

github.com

informative-drawingsは、入力画像から線画を抽出することが可能なプログラムです。

よく線画抽出で使用されるCanny法は主にSobelフィルタなどの複数の数式を組み合わせて抽出しますが、informative-drawingsでは、学習データをもとにパラメータを決定してきます。

学習を行うことで、Canny法では除去しきれない線やその切れ目を綺麗に出力できるようになるというメリットがあります。

それを踏まえても、Canny法は性能がよく軽量です


Informative-Drawings-ONNX-Sampleは元々PyTorchで動くinformative-drawingsをONNXへ変換したものです。

ONNXはディープニューラルネットワークの相互変換フォーマットであり、TensorFlowやPyTorch、TensorRT (NVIDIA)などの異なる形式に柔軟に対応します。

ONNXそれ自体もonnxruntimeで動作します。


かなりすごい

ウェブカメラで人の線画化を行うデモは結構あるので、とりあえずアニメ風ライブ映像でも流して検証してみました。

自然由来の映像に比べると不自然な点はあれど、エッジ検出には向いているタイプだと思います。

検出させたところ、かなり綺麗に動画が線画化されていました。


かなり綺麗に線画が取れており、メモ帳でパラパラ漫画を作ったと言われても疑わないクオリティです。

余計な線がない&網目もちゃんと取れているのも高評価ポイントです。

これなら塗り絵も自動生成できちゃいますね。


実行速度

AIなので、そこそこ重いです。

ONNRuntime(OpenVINOなし、CUDAあり)において実行速度は次の通りです。


壁紙にするしかない!

実は、以前に単眼画像の深度推定を用いて壁紙を作成したことがあります。

線画抽出から近い位置の物体を深度でフィルタするものです。

ar-ray.hatenablog.com

github.com


このプログラムでは、Canny法と複数の線画強調アルゴリズムを用いて壁紙用線画を作成していますが、この線画抽出をAIパワーでなんとかしてみました。


完全に同じ線画の太さなどを再現することはできていませんが、右下の石畳が消えていました。

他には、細かいノイズがAI側では無かったりシワがくっきりと反映されているなどの違いがあります。

Google Colabで試すことができます。

AI側は学習が可能なのでまだまだ性能向上の余地はありますが、実行速度を考えるとCanny法が強すぎるでしょう。

報告:UbuntuにおけるNVIDIA Driver 520.61.05の不具合

報告内容

NVIDIA Driver 520.61.05 ではHDMI接続において致命的なエラーが発生します。



つい最近、Ubuntu22に対するアップデートがあり、結構更新されていたみたいです。

このアップデートにはNVIDIA Driver 520.61.05も含まれていたようです。


シャットダウン時にインストールの確認があり、インストールするようにすると、終了間際にWindowsに似ているような似ていないような更新画面がずっと続いており、その日は作業が終わっていたのでそのまま帰ることにしました。


しかし、翌日コンピュータを立ち上げたところ、最初のブート画面は表示されるもののいつまで経っても画面がつくことがありませんでした…!

よくNVIDIAドライバの不調になったら押す「Ctrl + F2」キーなども効かずに途方にくれかけていました。


DisplayPortをプライマリにすると解決

GPUが不調なときは、ケーブルの接続先を変えることをよく行います。ケーブルにも原因があると考えられるからです。

もともとHDMIで接続されていたものをDisplayPortに変更したところ、先程の不調が嘘のように治りました。


↓以下の画面は更新後のNVIDIA-SMI

DisplayPortをプライマリとして起動後は2枚目のディスプレイによるHDMIも認識可能になっています。

ただし、もう一度HDMIのみで起動すると問題が再現してしまい、他のディスプレイからも表示できなくなってしまいます。


520.61.05へのアップデートは推奨しない

フォーラムの方でも不具合報告が上がっており、SSH経由からX11フォワーディングが効かないなどの報告が上がっています。libnvinfer.so.7などの重要なライブラリに不具合があるため、アップデートは行わないようにしましょう。

forums.developer.nvidia.com

↓類似した現象?

github.com

NVIDIAドライバの更新は行わないようにしましょう。(特にaptでNVIDIA Driverを取得した人は注意!)

記事上で煽ってたらアクロバティックなC++ (もはやbash) を提出された話

昨日の記事の続きです。↓

ar-ray.hatenablog.com


簡単に説明すると、コマンドラインからも実行可能&コンパイル可能なプログラムを公開したら、「shebangつけろ」というクソコメントが飛んできたのでプログラムの解説&煽る記事です。


すると、これを読んだ(つよつよ)学生プログラマがまさかのアクロバティックなスクリプトを提出してきました!


なんと、shebangが埋め込まれている!!!


プログラム

#!/bin/bash
#if NULL

THISFILE=`basename $0`
NAME=`basename $0 .cpp`

FILE=$(echo "#if NULL"; echo "#!/bin/bash"; tail -n +3 $THISFILE)
printf '%s\n' "$FILE" > $THISFILE
g++ -o $NAME $THISFILE
FILE=$(echo "#!/bin/bash"; echo "#if NULL"; tail -n +3 $THISFILE)
printf '%s\n' "$FILE" > $THISFILE
./$NAME
rm $NAME

exit
#endif

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    return 0;
}

このスクリプトコンパイル不可能です。しかし、実行権限を付与した上で実行すると、bashで実行されます。

簡単な動作手順を示します。

  1. #!/bin/bash : bashで実行されます。
  2. #if NULL : 実はあまり意味がないが、C++からのコンパイル除外。bashではコメント扱い。
  3. THISFILE='basename $0' : ファイル名を取得
  4. NAME='basename $0 .cpp' : .cppを除いたファイル名を取得
  5. FILE=$(echo "#if NULL"; echo "#!/bin/bash"; tail -n +3 $THISFILE) : トリック(後述)
  6. printf '%s\n' "$FILE" > $THISFILE 先ほどのトリックの結果を用いてファイルを上書き
  7. g++ -o $NAME $THISFILE : コンパイル
  8. FILE=$(echo "#!/bin/bash"; echo "#if NULL"; tail -n +3 $THISFILE) : 5のトリックの逆
  9. printf '%s\n' "$FILE" > $THISFILE : 6の逆
  10. ./$NAME : 7のバイナリの実行
  11. rm $NAME : ファイルの削除
  12. exit : スクリプトの終了


次に5と8のトリックについて説明します。


トリック:シェル的文字列の入れ替え

5では、C++プログラムのコンパイルが通るように#if NULL#!/bin/bash を入れ替えます。


まず、$(echo "#if NULL"; echo "#!/bin/bash"; までの文で2行目を入力します。

次に、tail -n +3 $THISFILEで該当ファイルの3行目から末尾までを出力します。(=2行目までを除去)

そして、6行目の printf でコード整形してファイルに出力します。(これが無いと\nが出力されません)

コンパイルが終わったら、8, 9のトリックで元に戻します。


これを動画にするとこうなります。


まさにアクロバティック!!!

もはやC++じゃなくてBashファイルですが…


煽っていましたが…

煽りに対するこの回答は本質を突いているかどうかは怪しいところですが、こんな華麗かつ無駄なプログラムを提示されると馬鹿馬鹿しさを超えて美しさすら感じてしまいます。


アウトプットにツッコミを入れる際は流石にこのレベルほどではなくとも「おお!?」と思わせるアウトプットで返していきたいですね。


補足

tail -n +3 $THISFILE-n は不要みたいです。

さすがにshebangを2行目に書こうなんて人いないよね??(煽り

夕食を食べてる途中に思いついたC++bash実行アルゴリズム

「絶対コンパイルされない記述の中にインストール用スクリプト入れたら1つのファイルで完結するんじゃね??」

↑これを実装してTwitterに載せたところ、結構伸びました。


一方で、「shebangつけたほうがいい」などの意味不明なコメントも見られ、非常に頭にきたので本来は記事化する予定はなかったですが、記事にします。


再現コード

私が実行に使用したコードはこちらになります。(example.cpp)

#if NULL
THISFILE=`basename $0`
NAME=`basename $0 .cpp`

g++ -o $NAME $THISFILE
./$NAME
rm $NAME

exit
#endif

#include <stdio.h>

int main()
{
    printf("hello world\n");
}

このプログラムは非常にシンプルなHelloWorldのプログラムであり、普通は以下のように実行します。

g++ example.cpp -o example
./example

これをbashで解釈される性質を利用(悪用)して「実行可能な」C++ファイルを作成したわけです。

利用したのは#if NULL(0でも可)によるコンパイラからの除外です。


#if ~ #endif は条件付きコンパイルで、(マクロ含む)コンパイル不要な条件式の結果が真である場合にコンパイル対象に入れることができます。

そもそも定義されているかどうかによって分岐する #ifdef #ifndefなどもあり、プラットフォームやOSなどに応じて使い分けます。


このプログラムはbashで実行した際に次のように遷移していきます。

  1. #if NULL : コメントとして無視されます(C++では #endif まで無視されます。)
  2. THISFILE='basename $0' : 自分のファイル名 example.cpp を取得します(バッククォートを'に変えています)
  3. NAME=basename $0 .cpp` : .cppを取り除きます
  4. g++ -o $NAME $THISFILE : コンパイルします。 -o オプションで後ろに $NAMEexampleに置換)というバイナリを生成します。
  5. ./$NAME バイナリ ./$NAME を実行します。
  6. rm $NAME バイナリ $NAME を削除します。
  7. exit bashファイルとしての処理が終了します。
  8. #endif : 以降、C++ファイルが続きます。


この記法は # を無視するスクリプト言語の仕様と #if ~ #end によるコンパイル除外が可能なCの仕様を組み合わせてあたかもコンパイルなしで ./a.out ができる マジック のような

「懐かしい」と「面白い」を狙った投稿でした。


しかし、一部のプログラマセンスを疑うようなコメントがきて非常に腹が立ったので、ここで煽ろうと思います。

どんな投稿なのかはぜひ、上の伸びたツイートの引用RTをご覧ください。


指摘するならここだぞポイント

なぜ 「shebang を付けろ」がプログラマセンスを疑うような投稿であるかを以下に示します。

  1. C/C++の構造上、shebangが使えない
  2. .cpp の拡張子でbash実行ができるようなファイルは拡張子の意味がない。(←ネタであることが理解できていない、読解力不足)
  3. どうしてもbashで実行したいなら bash example.cpp でいいじゃん。shebangよりも明示的じゃない。


1は 1行目に #if NULL と競合するのでどう考えても無理です(C/C++側がコンパイルするため)。仮にできるなら教えてほしい。弟子にしてください。

2、3は言うまでもないでしょう。読みやすくするなら言語を混ぜていいわけがないですよね???

以上より、指摘するなら

「なにが実行可能なC++だよwwwww結局内部でbash動かしてコンパイルしてるだけじゃん」

です。shebangつけろコメントをした人は反省しなさい。


補足:shebangは2行目に書くと意味ない

macで実験しました。

maczshのターミナルですが、少なくとも私の環境では自動的にbashで実行されるようです。

↓これなら大丈夫


本当に変に伸びたツイートには必ずと言っていいほどクソリプがつくので相手にするのが面倒です。

…自戒の念も込めて。