高専ロボコンに制御班として参加していました。プログラミング全般が好きで、主に低レイヤ系(CPU, OS, コンパイラ等)に興味があります。最近は Web 系もやってます。
C/C++ で型の相互変換を実装する際に、相互インクルードを防ぐ方法
シリアライザを作った際のメモです。 シリアライザとは、構造体等のオブジェクトをバイト列に変換する機能です。通信関係のライブラリを作る際に必要になったため自作しました。 実装する際には、環境の違いによって変換後のバイト列の順序やサイズが異なる可能性があるためなかなか大変です。オブジェクトをバイト列に変換した際、CPU のエンディアンや ABI、コンパイラの仕様によって、データの配置やパディングの有無が変わることがあります。そのためこれらを完全に理解し、環境差を吸収する実装をしないといけないです:D 実装時に気をつける環境の違いによる影響: エンディアンが異なる点 浮動小数点型のサイズが異なる点 構造体のパディングサイズが異なる点 実装したこと: メンバ変数を列挙する黒魔術(パディングによるサイズの違いの対策) シリアライズ後のサイズをコンパイル時に算出する エンディアン変換 浮動小数点型のサイズが異なる問題の対策 エンディアン オブジェクトをメモリに配置する際のバイト列の並び順のことです。主にビッグエンディアンとリトルエンディアンの 2 種類があります。 ビッグエンディアンは上位バイトから下位バイトに向かって配置されます。インターネッツの世界はこれです。イメージ: mem[offset + 0] = obj[0] mem[offset + 1] = obj[1] mem[offset + 2] = obj[2] リトルエンディアンは下位バイトから上位バイトに向かって配置されます。最初に知った時は驚きました。一般的に普及している CPU はリトルエンディアンです。イメージ:
Lチカを極める
GitHub Actions と Google Test を使って、Arduino のライブラリにテストを追加する方法を紹介します。
ライブラリ開発者の精神を保つ方法を紹介します。
通常、Arduino のライブラリは、サブディレクトリにあるヘッダーファイルや、拡張子無しファイルをインクルードすることができません。これを実現する裏技を紹介します。
Bambu Lab P1S という 3D プリンターを導入し、現在まで約 4 ヶ月程度使用しました。神プリンターだったので紹介します。
Hugo Blox がサポートしているマークダウン拡張の一覧
CloudFlare Pages で Hugo のビルド設定を行った際のメモ。 Pages Settings へ移動 ビルドコマンド・出力ディレクトリの登録 hugo --gc --minify && npx pagefind --source 'public' public バージョン指定 CloudFlare にデフォルトでインストールされている Hugo ではビルドエラーになった。バージョン番号を環境変数として登録することでバージョン変更ができるとのことだったので、次のような環境変数を登録した。
Arduino 系の関数やライブラリの多くに、コールバック関数からメンバにアクセスできないという問題があります。その原因と解決策について説明します。
Web サイトを開設しました。本サイトの運用に使っているサービスを紹介します。
行先頭に行番号をつける Web アプリです。
Arduino 向けの C++ ライブラリです。ロボコンでよく使うアクチュエータのドライバ、通信機能を関数、クラスとして提供しています。
WebSocket を通じて PC やスマホから調光可能なモニターライトです。
三次元電気力線シミュレータです。電荷の移動、パラメーターの変更ができ、リアルタイムにシミュレーションを行えます。
球面上に一様に分布された点の可視化アプリケーションです。GSS アルゴリズムを用いています。
ロボットに搭載されている紙飛行機の発射機構の操縦アプリです。キーボードでロボットを動かして遊べます。 2022 年度全国高専ロボコン 四国地区大会、全国大会で使用しました。
自動対戦可能なオセロです。Arduino を用いて初めて作ったプロジェクト。