[{"content":"今年買ってよかったもの もう1年が経ってしまった\u0026hellip;\n技術的な記事も出したかったのですが，まずは恒例にしていきたいこの記事ってことで．\nTopre Realforce R3S テンキーありUS配列モデル ｱｰｰｰｲｯ！！！！ pic.twitter.com/mV91zo7bUq\n\u0026mdash; Hirobon (@hirobon1690) November 1, 2025 Realforce R3S\nついに沼に入ってしまいました．ともあれ打ち心地が最高．もともとメンブレンが好きだったので，静電容量無接点は高級メンブレンって感じの打ち心地で最高！！良いキーボードは早く買ったほうが1日あたりの単価が下がる（==実質無料）ってことで．\nクリア軸静音スイッチとホットスワップ化ソケット ヨドバシで試し打ちをしていたところ，iKBCのクリア軸 という軸の打ち心地が非常によかった．静音スコスコで弱めのタクタイル感がある感じ．静電容量軸の家心地にも近い．しかし，上記のモデルはヨドバシ限定モデルな上にJIS配列しかラインナップがない．そこでスイッチだけAliexpressで取り寄せて，3年ほど前に買った赤軸メカニカル の軸を交換することにした．\nところが私が持っていた赤軸はホットスワップ対応ではない！調べてみると あとから力技でキーボードをホットスワップ化する方法があるらしい．幸いはんだ付けには慣れていたため，アリエクで取り寄せてやってみることとした．\nこれを\nこうして\nこう！ pic.twitter.com/QJZNXGVyyG\n\u0026mdash; Hirobon (@hirobon1690) November 24, 2025 使ったホットスワップ化ソケットとスイッチは以下である．\nerror calling resources.GetRemote: Get \u0026#34;https://www.aliexpress.us/item/3256809074590728.html?gatewayAdapt=jpn2usa4itemAdapt\u0026amp;_randl_shipto=US\u0026#34;: stopped after 10 redirects error calling resources.GetRemote: Get \u0026#34;https://www.aliexpress.us/item/3256808633267860.html?gatewayAdapt=jpn2usa4itemAdapt\u0026amp;_randl_shipto=US\u0026#34;: stopped after 10 redirects 購入当時は送料・クーポン込みで7,000円程度．\nこれを機にEngineerのハンダ吸い取り器 も購入．\n結局1万円程度+半日がかかった．安めのキーボードなら買えてしまう金額である． 打鍵感がかなり上がったので非常に満足．\nエレコム 大型マウスパッド エレコム デスクマット 大型マウスパッド 900mm×430mm\nhttps://www.amazon.co.jp/dp/B0DSHSTH31\nマウスパッドなんてでかけりゃでかいほどいいですからね！！！！！\nこれらによって出来上がった最高のデスクが研究室にあるのだが，写真を撮り忘れて実家に戻ってきてしまったので割愛．\nダイソー 詰め替えパックホルダー 純正品 だと6倍以上するのでお買い得だった．機能面には問題なかったので，あとは耐久性（だいぶ脆そう）\nオムロン 上腕式血圧計 オムロン 上腕式血圧計 HCR-7004\nhttps://www.amazon.co.jp/dp/B0DB2HSLFY\n春の健康診断で高血圧で再検査になってしまったので，攻略するために購入．研究室に置いて毎日測ってます．居室メンバーにも大人気(?)です．\n買っても買わなくてもよかったもの CH9120 Network Serial Port to Ethernet Module error calling resources.GetRemote: Get \u0026#34;https://www.aliexpress.us/item/3256801238194352.html?gatewayAdapt=jpn2usa4itemAdapt\u0026amp;_randl_shipto=US\u0026#34;: stopped after 10 redirects\nUART通信をイーサネットに載せて送受信できるICと周辺回路が一体化したモジュール．アリエクで買った直後に秋月でもブレークアウトボードの取り扱いが開始 されたことを知ったが，LANポートがついている分こちらの方が使いやすい．\nただ，ボーレートが自由に選択できないという弱点がある．\n引用：https://www.wch-ic.com/downloads/CH9121DS1_PDF.html\n今回はキャチロボ用にFeetechのシリアルサーボをイーサネット経由で動かそうとしていたが，Feetechのボーレートは以下から選択するしかないようになっている．\n引用：https://www.feetechrc.com/Data/feetechrc/upload/file/20201127/start%20%20tutorial201015.pdf\nこれは115200以上のボーレートが9600の倍数になっていないFeetechさんサイドの仕様が意味不明なのだが，これだと115200で動かすしかなく，応答性に遅延を感じるレベルだったのであえなく採用を諦めた．\n買わなくてよかったもの AnkerのMagSafe充電器とダイソーのMagSafeリング Anker Zolo Wireless Charger\nhttps://www.amazon.co.jp/dp/B0DW2SYD5H\n当初はiPhoneのStandby Mode的な運用を目論んで購入したが，わざわざ爆熱になって，それでいて遅い充電などなんの需要もないことにやってみて気がついた．ほんとに使ってないのでメルカリに放出しようかな．\n以上！ いまは60%キーボードを血眼になって探しています．みなさんよいお年を～\n","date":"2025-12-31T20:45:00+09:00","image":"http://blog.hirobon1690.com/post/best-buy-2025/thumb_hu0366d3f564a3e8335de2a39643471354_9362863_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/best-buy-2025/","title":"2025 今年買ってよかったもの \u0026 買わなくてもよかったもの"},{"content":"1回書いてみたかった\n順不同です\n今年買ってよかったもの Amazonベーシック デュアルモニターアーム (最大32インチ) https://www.amazon.co.jp/dp/B0CQTPZNV8\n購入時価格 ¥2,973\n研究室用に買いました．特にぐらつくことなく最高．3000円未満で名の知れているメーカー（中身は中華OEMだろうけど）が買えるのはデカい．\nモニターアームは正義なので全員買いましょう．\nQuntis デスクライト USBライト モニターライト 52cm バーライト https://www.amazon.co.jp/dp/B08T6H2W93\n購入時価格 ¥4,457\n同じく研究室用．蛍光灯のスタンドに慣れていると少し暗いかな．まぁ必要十分です．値段もBenQとかに比べたら安いし．でも自宅で使おうとは思わないかも．\nパーツキャビネット 樹脂製 引出小×60個タイプ https://www.monotaro.com/p/1878/4545/\n購入時価格 ¥3,051\n電子工作系の部品は全てSeriaのShikiriケースに入れていたのですが，数が多くなりすぎたのとShikiriケースの耐久性が低いことがわかったので導入．ラベルを付けて管理しており，部品を取り出すときのストレスが圧倒的に減った．\nモノタロウオレンジは気に食わないので，適当なラッカースプレーで黒にしました．もう1個増やすか検討中．\nYouTube Premium https://www.youtube.com/premium\n月額 ¥780（学割）\n今年ようやく入りました．主には飛ばせない広告が増えてきたことと，あまりにも下品な広告にうんざりしたため．あとこんな話もあったので．思う壺のような気もするが．私は作業時にiPadで動画を流しておくことが多いのだが，その場合ブラウザより公式クライアントのほうが圧倒的にストレスフリーで操作できる．課金することでPicture in Pictureも使えるし，YouTube Musicもおまけでついてくるしこの値段ならかなりよき．\n買わなくてよかったもの Inateck キーボードケース iPad Air 11インチ 2024/第5世代/第4世代 10.9インチ（2022/2020） https://www.amazon.co.jp/dp/B0C65MB4M9\n購入時価格 ¥4,983\n結局iPadにキーボードなんて要らないんですよ！！！！！！！！！！！\niPadのキーボードを買って「要らねえなぁ」ってなるのは2回目．学べ．\nソリッド・ステート・リレー(SSR)キット 25A(20A)タイプ https://akizukidenshi.com/catalog/g/g100203/\n購入時価格 忘れた\n3Dプリンタをオンオフするスイッチを自作しようとしていたが，AC100をいじるのはやっぱり怖いので結局既製品を使っている．\n以上！ 思い出したら追記するかもしれません\n皆さまよいお年を～～～\n","date":"2024-12-27T01:34:00+09:00","image":"http://blog.hirobon1690.com/post/best-buy-2024/5_hucf5f95bfbaa00228b89ed90518ccd60a_1425728_120x120_fill_q75_box_smart1.jpg","permalink":"http://blog.hirobon1690.com/post/best-buy-2024/","title":"2024 今年買ってよかったもの \u0026 買わなくてもよかったもの"},{"content":"Mac miniを買った M4 Mac miniが満を持して登場したので購入した．\nすいません、思いついちゃったので… pic.twitter.com/K8cqqGKYz7\n\u0026mdash; Hirobon (@hirobon1690) November 12, 2024 電源内蔵で12 cm四方，それでいてパフォーマンスがそのへんのx86より良い．最低スペックでもメモリ16GBで，学割 $ 499！1 SSDは256GBしかないが，デスクトップである以上いくらでも外付けできるので一切問題にはならない．これは買うしかない．\n今まで自宅でVPNサーバ・NASとして活躍していた2014のMac miniを1年足らずで売り飛ばして導入することとなった．\nCPU性能 AArch64 性能評価にはGeekbench 6を用いた．\nAArch64でのパフォーマンス，特にシングルコア性能は流石の一言である．マルチコア性能を同ランクのCPUと比較すると12〜13世代のデスクトップ用i7くらいか．\nhttps://browser.geekbench.com/v6/cpu/8801610\nVMWareでWindowsの仮想環境を構築して回した場合もこのとおり．同世代のi7→i5にランクダウンするイメージ．\nx86エミュレーション ARMでのパフォーマンスに比較して，Rosetta 2を使ったx86エミュレーションの結果は少し期待外れなものであった．スコア基準だから一概には言えないが，性能は半分またはそれ未満まで落ちる．事前情報では8割のスペック！とか聞いていたのだが，流石に夢を見すぎか．\nちなみにWindowsでのエミュレーションでも同様程度の下がり方をする．\nグラフにするとこんな感じ．\nグラフィック性能 ここはそんなに期待していなかったので省略．グラフィックが必要なら大人しくグラボを積むしかない．\nまとめ ぶっちゃけ趣味開発ならARMで事足りるため，充分すぎる環境が手に入ったといえる．裏でファイルサーバを回していても余裕がある．x86に依存する作業とPCゲームに関しては引き続き愛機Zephyrusくんに頑張ってもらうことにする．\nちなみに Geekbenchをx86エミュレーションで回すのに手こずったのでメモ．\nMac GeekbenchをRosettaで開く設定にしても，パフォーマンスの計測自体はARMで行われてしまう．\nFinderのアプリケーションフォルダでGeekbenchを副ボタンでクリックし，パッケージの内容を表示をクリックする．\nContents/Resources/と辿るとx86用の実行ファイルgeekbench_x86_64が現れるので，ダブルクリックして直接実行する．\nアクティビティモニタを見ると種類: Intelで実行されていることが確認できる．\nWindows ARM環境で普通にインストールするとAArch64のバイナリしか展開されない．\nインストーラのexeファイルを7-Zipで展開する．\n展開フォルダを開くとx86用の実行ファイルgeekbench_x86_64.exeが現れるので，ダブルクリックして直接実行する．\nタスクマネージャを見るとx64モードで実行されていることが確認できる．\n日本円では¥79,800. 円安…\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2024-11-16T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/mac-mini/thumb_huf50166584744eef8305837da945c2b91_156641_120x120_fill_q75_box_smart1.jpeg","permalink":"http://blog.hirobon1690.com/post/mac-mini/","title":"見せてもらおうか，M4チップの実力とやらを"},{"content":"ツールをつくった Windows 10の時代からシステムフォントのYu Gothic UIが嫌いすぎて，既存フォントのプロパティを編集してYu Gothic UIという名前の偽装フォントをインストールして置き換えたり，レジストリをいじり倒すなどしてフォント変更を行っていた．\nしかし，これらの手順はあまりにも煩雑であるほか，以前更新していたブログの該当記事に未だにコンスタントにアクセスがあることから需要があるものと判断し，ツールをつくることにした．\n以下が作成したツールである．\nSystem Font Changer for Windows 10/11\nhttps://github.com/hirobon1690/System-Font-Changer-for-Windows10-11\n使い方の動画 作成中\n技術話 FontForgeのPython APIを大いに活用している．Windowsはフォント名とPostscript名が同じフォントを同一とみなす仕様があるようで，これを利用している．\n本来システムフォントは削除できないのだが，以下の記事にあるようにフォントの所有権を変更することによって実現している．\nfailed to fetch remote resource: Forbidden 【Windows10】システムフォント（游ゴシック）を別フォントに変更する\nhttps://qiita.com/ikikuchi/items/7a941ac45b6e97a14058\n既存ツールとしてAdvanced System Font ChangerやMeiryo UIも大っきらい!!などが挙げられるが，これらのツールはレジストリ変更のみで反映される部分のみのフォントを変更している（ものと私は認識している）．私のツールはシステムフォントそのものを置き換えるため， ほぼすべての範囲にフォントが反映される点に優位性がある．しかしながら，これにはリスクも伴い，既存ツールと比較し表示上の不具合やOSの不具合が発生する可能性が高い．また，元の状態に戻すのが煩雑である．\n","date":"2024-03-19T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/windows-system-font/001_hu4bb8be5375b0a3366a95dbf17419a615_319485_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/windows-system-font/","title":"WindowsからYu Gothic UIを駆逐する"},{"content":"About KlipperのAPIであるMoonrakerには電源管理機能があるが，\n対応するスマートプラグの種類が少ない サーボなどでスイッチを動かそうとした場合，PWMを出力するオプションがない 任意のGCodeを指定してgcode_shell_commandでシェルスクリプトを起動することができるが，これはプリンタ側のマイコンとの通信が確立している必要があるため 電源ON時に使うことができない という欠点がある．自分は今までサーボで電源をON/OFFしており，その後TP-Link P105というスマートプラグに乗り換えたという経緯があり，今回はこれを解決した方法を説明する．\n3Dプリンタ用のスマートプラグ(物理)\nつくりました pic.twitter.com/n3RfNQwTx8\n\u0026mdash; Hirobon (@hirobon1690) October 22, 2022 TP-Link P105 - Amazon\nhttps://www.amazon.co.jp/dp/B08G1G1DVT\nやりたいこと Moonrakerには電源管理でHTTPリクエストを飛ばす機能があり，Pythonでそれを受けるローカルサーバを立てることで任意の処理を実行可能にする．このやり方では別途Homebridgeのインスタンスを立てる必要などもないためシンプルかつ軽量に実装できる．\nここではTPLink P105を例として説明するが，他の方法を取る場合でも流れは同じである（適宜コードを読み替えてほしい）\n※任意のと言ったがPython経由で操作できるスマートプラグである必要がある\nPythonでサーバ部分を書く 適当なディレクトリにpythonコードを作成する．\n1 2 3 mkdir ~/src cd ~/src touch power.py 内容を\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 from http.server import BaseHTTPRequestHandler, HTTPServer import asyncio import os from tapo import ApiClient IP = \u0026#34;TapoのIP\u0026#34; USER = \u0026#34;Tapoのユーザ名\u0026#34; PASS = \u0026#34;Tapoのパスワード\u0026#34; class Tapo: def __init__(self, ip_address, username, password): self.ip_address = ip_address self.username = username self.password = password async def conncet(self): self.client = ApiClient(self.username, self.password) self.device = await self.client.p105(self.ip_address) async def on(self): await self.device.on() async def off(self): await self.device.off() async def status(self): device_info = await self.device.get_device_info() if device_info.to_dict()[\u0026#39;device_on\u0026#39;]: return \u0026#39;on\u0026#39; else: return \u0026#39;off\u0026#39; tapo = Tapo(IP, USER, PASS) class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header(\u0026#39;Content-type\u0026#39;, \u0026#39;text/plain\u0026#39;) self.end_headers() asyncio.run(tapo.conncet()) message = \u0026#39;\u0026#39; # 別のスマートプラグを使う場合やPWMを使う場合はここから下を適宜書き換える if self.path == \u0026#39;/on\u0026#39;: asyncio.run(tapo.on()) message = \u0026#34;on\\n\u0026#34; elif self.path == \u0026#39;/off\u0026#39;: asyncio.run(tapo.off()) message = \u0026#34;off\\n\u0026#34; elif self.path == \u0026#39;/status\u0026#39;: message = asyncio.run(tapo.status()) self.wfile.write(message.encode()) def run(server_class=HTTPServer, handler_class=SimpleHTTPRequestHandler, port=8000): server_address = (\u0026#39;\u0026#39;, port) httpd = server_class(server_address, handler_class) print(f\u0026#34;Server running on port {port}\u0026#34;) httpd.serve_forever() if __name__ == \u0026#34;__main__\u0026#34;: run() 依存関係（今回はこのライブラリを使う）をインストールして\n1 sudo pip install tapo 実行する\n1 2 sudo cdmod +x ~/src/power.py sudo python ~/src/power.py 出力が\n1 Server running on port 8000 となれば実行はできている．\n1 2 3 4 5 sudo apt install curl curl http://localhost:8000/on curl http://localhost:8000/status curl http://localhost:8000/off curl http://localhost:8000/status を1行ずつ実行し，うまく実行されればスクリプトの作成は成功である．\nOS起動時に自動実行されるようにする 起動用シェルスクリプトの作成 1 2 touch ~/src/power.sh nano ~/src/power.sh 内容を\n1 2 #!/usr/bin/env bash python ~/src/power.py として保存．\n1 2 chmod +x ~/src/power.sh ~/src/power.sh 実行して起動するかを確認する．\nServiceを作成 1 2 sudo touch /etc/systemd/system/power/service sudo nano /etc/systemd/system/power/service として内容を\n1 2 3 4 5 6 7 8 [Unit] Description=power [Service] ExecStart=/home/[username]/src/power.sh [Install] WantedBy=default.target とする．usernameは各自の環境で置き換えてほ欲しい．\n1 systemctl status power.service として\n1 2 3 ○ manager.service - power Loaded: loaded (/etc/systemd/system/power.service; disabled; vendor preset: enabled) Active: inactive (dead) となればよい．\n1 sudo systemctl enable power.service として\n1 sudo reboot その後\n1 systemctl status power.service として\n1 2 3 ● power.service - power Loaded: loaded (/etc/systemd/system/power.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2024-01-24 09:19:02 UTC; 47s ago といった出力が得られれば成功である．\nここで試しに\n1 2 3 4 curl http://localhost:8000/on curl http://localhost:8000/status curl http://localhost:8000/off curl http://localhost:8000/status を実行して動作を確認する．\nMoonrakerの設定 ブラウザでMainsailの画面を開き，moonraker.confに以下の内容を追記する．\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 [power Plug] type: http on_url: http://localhost:8000/on off_url: http://localhost:8000/off status_url: http://localhost:8000/status response_template: {http_request.last_response().text} bound_services: klipper on_when_job_queued: True [file_manager] queue_gcode_uploads: True [job_queue] load_on_startup: True Save and Restartして，右上の電源ボタンから電源をオンオフできれば完了．\nスライサーからアップロードすると電源が自動的に入り印刷が開始されるようになる．\n参考文献 Pythonのプログラムをマシンの起動時に毎回実行させる方法 Tp-Link [Tapo P105]をKlipper/Mainsailで制御し印刷完了時に電源を落とす方法 ","date":"2024-01-24T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/mainsail-tplink/001_hu1b81ac19835b8092c106845ff271fc95_30863_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/mainsail-tplink/","title":"Moonrakerの電源管理で任意のスマートプラグを使う(Tplink P105)"},{"content":"About React Native\nhttps://reactnative.dev/\nReact Nativeについて調べていたら，チュートリアルでExpoというフレームワークを用いていた．これを使ってWindows1 (WSL)でAndroidのAPKをビルドしようとしたところ非常に手こずったのでメモしておく．\n参考 eas build --local メモ - Zenn\nhttps://zenn.dev/tadaedo/scraps/6f989f2a104f76\n前提 以下がインストール済みとする:\nWSL (Ubuntu) nodejs, npmなど eas-cli 手順 WSL特有のPATHの無効化 WSLにはWindowsのPATHをUbuntu側にコピーする機能(!?)がデフォルトでオンになっている(!?)．混乱の元なのでこれを無効化する．\n/etc/wsl.confに\n1 2 [interop] appendWindowsPath = false を追記する．(ファイルが存在しない場合は作成する)\nAndroid Studioのインストール Android Studio\nhttps://developer.android.com/studio\n公式サイトからAndroid Studioをダウンロードし，.tar.gzを展開．フォルダごと/opt/に移動する．\n1 2 3 cd ~/Downloads tar -zxvf android-studio-2022.3.1.21-linux.tar.gz sudo mv android-studio /opt/ 起動スクリプトを走らせる．\n1 /opt/android-studio/bin/studio.sh 画面の指示に従って起動画面が出るまで進む．\nNDKとCMakeのインストール More Actions \u0026gt; SDK Managerを開く．\nSDK ToolsタブのNDKとCMakeにチェックを入れてApplyをクリック．\nインストールが完了したらAndroid Studioを閉じて環境変数を設定する．~/.bashrcに\n1 export ANDROID_HOME=/home/username/Android/Sdk を追記する（usernameは自分のもの）．\nビルド プロジェクトのeas.jsonで\n1 2 3 4 5 6 7 8 9 \u0026#34;build\u0026#34;: { ... \u0026#34;preview\u0026#34;: { \u0026#34;distribution\u0026#34;: \u0026#34;internal\u0026#34;, \u0026#34;android\u0026#34;: { \u0026#34;buildType\u0026#34;: \u0026#34;apk\u0026#34; } }, }, のようにbuildTypeを指定する．\nあとはプロジェクトのディレクトリで\n1 eas build --platform android --profile preview --local とするとビルドが通って.apkが生成されると思います．\nネイティブWindowsでAndroidのビルドは2023年1月時点では対応していない\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2024-01-05T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/eas-wsl/001_hu8f79635972b55704a75bfb17859fdb5e_48920_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/eas-wsl/","title":"Expo×WSLでAndroidアプリをローカルビルドするのに手こずった記録"},{"content":"About こういうことをしたので，やったことをメモしておく．\nデモURL\n部内Wikiに投稿した内容のほぼまんまである．大目に見てください\nなにがしたいのか 思想として，\nROS側に指令値を送信できること ROS側の状態をreactiveに可視化できること iPadの特性をできるだけ活かしたUI設計にすること UIのフロント部分を簡潔かつ簡単に記述できること の4点があった．ROSを組み込む場合におけるGUIの開発では，\nLinuxネイティブ1 GTK3 マルチプラットフォーム（PC） Qt Pythonを用いた様々（tkinter, simpleGUI, niceGUI, etc) マルチプラットフォーム（PC, モバイル） Web（Electron含む） Unity モバイルプラットフォーム2 Kotlin (Android) Java (Android) Swift (iOS) Objective-C (iOS) 3 が定石であろう．今回はiPadで操作できるという条件があったのと，メンテナンス性及び学習コストの観点からWebを選択した．\nPros \u0026amp; Cons Webの何がいいか 開発がしやすい ベースがHTMLなのでデザイン系はほんとうにどうにでもなる フレームワークと合わせることでバックエンドのことは気にしなくてもよくなる 「GUIの開発あるある」の面倒事が一切ない 謎のGUIエディタでゴニョゴニョするとか イベント駆動めんどくせーとか ビルドおっもとか そういうのがゼロ ホットリロードがラク 後述 驚異のマルチプラットフォーム性 ブラウザさえあればどんなデバイスでも動く 罠はあるが Google Pixel Watchでもうごきましたよ() テンションが上がる 思ったUIを思ったとおりにつくれる(小並感) 笑った？でも大事よこういうの 何がだめか ROS側の起動などがやや面倒くさい ROSbridge Serverなどを起動しなければならない 接続に失敗した場合サーバの再起動など煩雑な手間が必要となる 接続の信頼性がネイティブUIよりも低い ネイティブでUIを構築した場合にはない処理が行われたときの信頼性が大幅に劣る ブラウザ上でのリロード 回線が切断されてからの再接続 簡単な処理ならPythonで組んだほうがラク という説もある．俺はTkinter特有の書き方があまり得意ではないので人によると思う 使用技術の選定 というワケで，賛否両論はあると思うがGUIをWebで構築することに踏み切った．今回使用した技術が以下の通り．\nROS関連 rosbridge_suite roslibjs Web関連 React Vite mui やりたいことは以下のような感じである．\nROS側 Robot Web Tools様が偉大なる仕事をしてくださっているおかげで我々がすることはrosbridge_serverを起動することだけである．したがって\n1 2 sudo apt install -y ros-humble-rosbridge-suite ros2 launch rosbridge_server rosbridge_websocket_launch.xml 以上である．\nWeb側の実装 ここから実装していくわけだが，備忘録兼チュートリアル記事ということなので簡単に「topicをpubするボタン」と「subした値をreactiveに表示する部分」の2つに絞って書き方の雛形的なものをここに残しておく．\n依存関係のインストール まずは依存環境をインストールする．以下のスクリプトで最速で最新安定版のnodejsをインストールできる．\n1 2 3 4 5 6 sudo apt update sudo apt install -y nodejs npm sudo npm -g install n sudo n stable sudo apt purge nodejs npm sudo apt autoremove viteでプロジェクトをつくる．ROSと深く関連付けて管理する場合は適当にROSのパッケージを作成しその中などでやるといいと思う．\n1 npm create vite@latest とすると色々聞かれるので，プロジェクト名を入力し，その後Reactを選択:\n1 2 3 4 5 6 7 8 9 10 ? Select a framework: » - Use arrow-keys. Return to submit. Vanilla Vue \u0026gt; React Preact Lit Svelte Solid Qwik Others TypeScriptを選択:\n1 2 3 4 5 ? Select a variant: » - Use arrow-keys. Return to submit. \u0026gt; TypeScript TypeScript + SWC JavaScript JavaScript + SWC するとよい．\n1 2 cd プロジェクト名 npm i で依存関係がインストールされる．\nその後はUIフレームワークのmuiをインストールするために\n1 npm install @mui/material @emotion/react @emotion/styled とする．\n1 npm run dev して表示されたlocal IPをブラウザで開き，正常に画面が表示されることを確認できたらApp.tsxの内容を\n1 2 3 4 5 6 7 8 9 10 11 import { useState } from \u0026#39;react\u0026#39; import \u0026#39;./App.css\u0026#39; function App() { return ( \u0026lt;\u0026gt; \u0026lt;/\u0026gt; ) } export default App ここまで減らしてよい．\n前提知識 Reactの諸々はここでは省く．よさげな日本語のチュートリアルを見つけたので各自参照されたい．\nROSオブジェクトの生成 上の方で\n1 2 3 4 5 import ROSLIB from \u0026#34;roslib\u0026#34;; const ros = new ROSLIB.Ros({ url: \u0026#34;ws://[ROSを走らせるPCのローカルIP]:9090\u0026#34;, }); としてrosインスタンスを生成しておく．\nTopicのPub 基本的には\n1 2 3 4 5 const Topicのインスタンス名 = new ROSLIB.Topic({ ros: ros, name: \u0026#34;/Topic名\u0026#34;, messageType: \u0026#34;Topicの型\u0026#34;, }); としてTopicをインスタンス化する．例えば\n1 2 3 4 5 const msg = new ROSLIB.Topic({ ros: ros, name: \u0026#34;/msg\u0026#34;, messageType: \u0026#34;std_msgs/String\u0026#34;, }); といった形である．これを\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function App() { const [message, setMessage] = useState(\u0026#34;\u0026#34;); const handleClick = () =\u0026gt; { const msg = new ROSLIB.Message({ data: \u0026#34;hello, world\u0026#34;, }); topic.publish(msg); setMessage(\u0026#34;sent\u0026#34;); }; return ( \u0026lt;\u0026gt; \u0026lt;button onClick={handleClick}\u0026gt;PUBLISH\u0026lt;/button\u0026gt; {msg} \u0026lt;/\u0026gt; ) } とすると押すとPubするボタンの完成である．簡単でしょ？\nTopicのSub ROSのsubという仕組みとReactのreactive componentの相性は最高である．以下のように書くと\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 function App() { const [msg, setMsg] = useState(0); useEffect(() =\u0026gt; { const listener = new ROSLIB.Topic({ ros: ros, name: \u0026#34;/topic名\u0026#34;, messageType: \u0026#34;topicの型\u0026#34;, }); listener.subscribe((message: any) =\u0026gt; { setMsg(messsage.data[0]); }); }, []); return ( \u0026lt;\u0026gt; {msg} \u0026lt;/\u0026gt; ) } 指定したtopicをsubすると表示に反映されるようになる．\nExercise topicをpubするボタンとそのtopicをsubするボタンをつくり，pubしたtopicの内容が反映されることを確認せよ．pubする内容をフォームなどを用いてreactiveに変化させるとなおよい．\n解答例 略 おまけ - iOS Safari向けのもろもろ 画面全体のスクロール禁止 どこから持ってきたか忘れてしまったが，ScrollLock.tsxを作成して\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import React, { useEffect, useCallback } from \u0026#34;react\u0026#34;; const ScrollLock= React.memo(() =\u0026gt; { useEffect(() =\u0026gt; { document.addEventListener(\u0026#34;touchmove\u0026#34;, scrollNo, { passive: false }); return () =\u0026gt; { document.removeEventListener(\u0026#34;touchmove\u0026#34;, scrollNo); }; }, []); const scrollNo = useCallback((e: { preventDefault: () =\u0026gt; void; }) =\u0026gt; { e.preventDefault(); }, []); return \u0026lt;\u0026gt;\u0026lt;/\u0026gt;; }); export default ScrollLock; とし，任意の箇所で\n1 \u0026lt;ScrollLock /\u0026gt; を挿入するとその場所でのスクロールが禁止される．\nフルスクリーンPWA化4 src/index.htmlの\u0026lt;head\u0026gt;\u0026lt;/head\u0026gt;内に\n1 2 3 4 \u0026lt;meta name=\u0026#34;apple-mobile-web-app-capable\u0026#34; content=\u0026#34;yes\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;apple-mobile-web-app-status-bar-style\u0026#34; content=\u0026#34;black-translucent\u0026#34;\u0026gt; \u0026lt;meta name=\u0026#34;apple-mobile-web-app-title\u0026#34; content=\u0026#34;アプリ名\u0026#34;\u0026gt; \u0026lt;link rel=\u0026#34;apple-touch-icon\u0026#34; href=\u0026#34;/icon.png\u0026#34;\u0026gt; \u0026lt;!--アイコン画像を指定--\u0026gt; としてやるとiPadのSafariで「ホーム画面に追加」したときの動作をアプリのようにすることができる．\nここからは？ muiには様々なコンポーネントがあるため様々なWeb的表現を駆使したUIをROSにつなぐことが可能である． Robot Web Toolsは他にも様々なWeb用ROSライブラリを提供しているため，UI上に3Dモデルを表示することなども可能である． 安定性は保証できないが\u0026hellip; いかがでしたか？ (略)\n参考文献 rosbridge_suiteとReactでROS 2 Webアプリを作る\n本記事は↑すばらしいこの記事↑の下位互換なのではないかという説がある ネイティブであるかどうかはそのディストリビューションのDesktop environmentに依存する．多くのUbuntuユーザはデフォルトであるGNOMEを用いていることからこのような表記を行っており，例えばKDEを用いているユーザにとってのネイティブツールキットはQtである．\u0026#160;\u0026#x21a9;\u0026#xfe0e;\nこれらのプラットフォームにおいてはROSをネイティブサポートしていないため，必然的にWebインタフェースのフロントエンドとして振る舞わせることになる．\u0026#160;\u0026#x21a9;\u0026#xfe0e;\niOS向けのアプリをビルドするにはmacOSを搭載したマシンが必要である．\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n厳密にはPWAではないが，便宜上このような書き方をしている．\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2024-01-03T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/ros-gui/image_hub227ca672b1b939ab98a875ba666efae_1003551_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/ros-gui/","title":"ROS x GUIの備忘録"},{"content":"はじめに UNIX系のOSでは比較的簡単にX11の転送ができるのだが，Windowsだと少々手順が必要になったので備忘録としてまとめておく．\nWindows TerminalとVSCodeそれぞれで設定する必要がある．\nX11のインストール VcXsrvをインストールする．\nVcXsrv Windows X Server\nhttps://sourceforge.net/projects/vcxsrv/\nXLaunchを起動し，X Serverを裏で走らせておく． Windows Terminalの設定 PowerShellを開いて環境変数を設定する． 1 $env:DISPLAY=\u0026#34;127.0.0.1:0.0\u0026#34; 接続時に -Y オプションを付ける．\n例 1 ssh userName@hostName -Y 追記 cannot open displayとなるときは\n1 sudo apt install -y xauth するとよい．\nVSCodeの設定 対象のホストに1度SSH接続しておき，configファイルを作成しておく．\nF1を押してsshなどで検索し「Remote:SSH SSH 構成ファイルを開く\u0026hellip;」を選択する\nX11フォワーディングを使用したいホストを，以下のように編集する．\n1 2 3 4 5 Host hostname HostName hostname User usename ForwardX11 yes ForwardX11Trusted yes 結果 sshのターミナルでxeyesを実行した結果が以下．\n","date":"2023-04-10T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/windows-x11/002_hu5cb33b7f78c141967c7801145cacc367_5952_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/windows-x11/","title":"WindowsでX11 Port Fowarding"},{"content":"3DCG系のプロジェクトを進めており，モーションを購入した．\nモーションキャプチャで収録したデータが，FBX形式で入っている．\n特になんの知識もなかったので，適当にポンっとやればMMDモデルで動かせると思っていたが，現実は甘くなかった．\nLive Animationというツールを使う方法や，AutoRigProを使ってBlenderでリターゲットする方法などがあることが判明したが，どれも自分の思うようにいかなかった．\n丸3日費やして方法を見つけたので，メモしておく．\n0. 流れ FBX → BVH をBlenderで行う\nBVHの座標軸をBlenderで修正する\nBVH → VMD を有志ツール(後述)で行う\n1. FBX→BVH まずはBlenderにFBXを読み込む．が，標準の読み込み機能ではなぜかボーンの向きがひっちゃかめっちゃかになってしまう．\n埒が明かないので，有料アドオンを購入した．こちらでは正常に読み込める．\nfailed to fetch remote resource: Forbidden\nBlenderくん，頼むよ\u0026hellip;\n読み込めたら，ファイル\u0026gt;エクスポート\u0026gt;bvhから書き出す．\n2. BVHの座標軸の修正 Blenderは上がZの右手系なのに対し，MMDは上がYの右手系であるため，データを回転する必要がある．\nファイル\u0026gt;インポート \u0026gt;bvhのウィンドウの右側のトランスフォームの欄を以下のように変更する．\n読み込んだら，FBXのときと同様の手順で再度BVHにエクスポートする．\n3. BVH→VMD ゆきときプロジェクト様のBVH to VMD Converterを使わせていただく．\n【無料】BVH to VMD Converter\nhttps://booth.pm/ja/items/3242387\nこのツールには以下の3つの機能がある:\n1. ボーン名の変換 対照表に従い，BVHのボーン名をMMDのボーン名に変換する\n2. 角度補正 (未検証，ミリしらで書いてる)BVHはTポーズからの相対角度，VMDはAポーズからの相対角度でモーションを記録しているっぽい．オフセットを設定することでこの角度差を補正できる．\n3. VMDへの変換 上の2つの変換を施した上で，VMDに変換してくれる\nまさに神ツール．ありがとうございます．\nボーンマップに今回のボーン名がないため，手動で追記する．追記したAutoBoneMap.csvをここに置いておくので，自己責任で使ってください．\nConvertをクリックすると変換される．\n4. MMDで読み込む 出力したvmdファイルをMMDで読み込むと，モーションが反映されると思う．もし向きや角度がおかしかったら，2の座標軸を見直したり，3のcsvのオフセット値を変えてみたりすると良いだろう．また，足のIKをオフにする必要があるので注意．\n","date":"2023-02-11T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/fbx-to-vmd/003_hua0e384c1ad5ba1cb031c865dd68ba404_236667_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/fbx-to-vmd/","title":"【備忘録】FBXモーションをBVHに変換してMMDに持っていく"},{"content":"解像度が高いパソコンを使用しているとき，通常WindowsはOSレベルで画面をスケーリングして拡大表示している．EAGLEではここ周りの処理に不具合が残っており，普通に起動するだけではおかしな表示になってしまう．\n解決策 EAGLEは9系からQtというUIフレームワークを使用するようになった．Qtのスケール設定をこちらから明示してあげることで正しい大きさで表示されるようになる．\n1. EAGLE側の設定 Options \u0026gt; User Interface \u0026gt; Display \u0026gt; Enable... の2つのチェックを外す．\n2. バッチファイルを作成 以下の内容でバッチファイルを作成する．\n1 2 3 4 @echo off cd [EAGLEのディレクトリ] set QT_SCALE_FACTOR=1.5 START \u0026#34;\u0026#34; eagle.exe ※1 [EAGLEのディレクトリ]にはeagle.exeがインストールされているフォルダを選択する．\nデフォルトではC:\\EAGLE 9.6.2\n※2 \u0026ldquo;1.5\u0026rdquo; の部分はお使いのスケーリング係数に合わせる．これはWindowsの設定アプリのディスプレイの項目から確認できる．(100%が1)\nこのバッチファイルをeagle.batとして保存してEAGLEのディレクトリに移動する．\n3. ショートカットに登録 スタートメニューにあるEAGLEの項目を右クリックして「ファイルの場所を開く」を押す． EAGLEを右クリックして「プロパティ」を開く． 「リンク先」の ...\\eagle.exe を ...\\eagle.bat に変更する． 「実行時の大きさ」を「最小化」にする． 「アイコンの変更」を押してEAGLEのディレクトリに移動したあと，eagle.ico を選択する． これで，スタートメニューから起動すると正しい大きさで起動できると思います．\nAmazon.co.jp: DiyStudio 5pc 5A dc-dc降圧ブーストコンバータ調整可能レギュレータXL4015 4-38Vから1.25-36V出力調整可能降圧ボードモジュール調整電源変換ボード降圧ボード高効率低リップル電源アダプタ基板降 圧回路基板 【ヒートシンク付き】 : 産業・研究開発用品\nhttps://www.amazon.co.jp/dp/B09YRXYSFK\n","date":"2023-02-11T00:00:00+09:00","image":"http://blog.hirobon1690.com/post/fix-eagle-scaling/fig0_hu77afae94a5c4fb9e0eaf755494d804f3_399339_120x120_fill_box_smart1_3.png","permalink":"http://blog.hirobon1690.com/post/fix-eagle-scaling/","title":"Autodesk EAGLE 9系でスケーリングの問題を解消する(Windows)"},{"content":"ブログをはじめようはじめようと思って3年が経過しました．\n今年こそは，と思ってひとまず環境を整えました．\n続くか本当に不明ですが何卒よろしくお願いします．\n製作記的な記事と備忘録がメインとなる予定です．（ほんまに？）\nGitHub\nhttps://github.com/hirobon1690\n","date":"2023-01-04T00:00:00+09:00","permalink":"http://blog.hirobon1690.com/post/hello-world/","title":"Hello, world!"},{"content":"","date":"0001-01-01T00:00:00Z","permalink":"http://blog.hirobon1690.com/post/test/","title":""}]