blender 注意点
blender の注意点
今は整理のため一つの記事に追加していく。 増えたら随時別記事に分けるなどしたい。
回転
- ショートカットキー: r
- オブジェクトモードで回転させると、オブジェクトの軸ごと回転してしまうので注意する。 オブジェクトの軸の表示方法は右下のオブジェクトのプロパティから Viewport Display→Axis のチェックを入れると表示可能になっている。
ミラーオブジェクト
- ミラーモディファイヤは個々のオブジェクトが持つ軸の方向に対して設定される。(グローバルな軸に対して行われるわけではないので注意する) たとえば、うっかりオブジェクトモードで移動させた後、ミラーモディファイヤを追加すると、オブジェクトに軸がついてきているので、意図しないミラーが引き起こされる場合があり注意が必要。
- ミラーモディファイヤは X をクリックすると基本的に選んだ軸の正方向と負校にミラーされる。たとえば、X をクリックして有効にすると X 軸の正方向と負方向にミラーされる。
- クリッピングにチェックをいれると、選んだ軸の原点よりオブジェクトがない方向にはみ出さないようになる。
midl の場所
dll のソースコードを見ていると、*.idl というファイルが出てくる。
これは interface declaration language という種類のファイルで、dll 内で使用される COM オブジェクトのインターフェースを定義しているファイルらしい。
これを midl というコマンドでコンパイル後、bindgen すると、rust で interface が定義できそう。
ということで、midl コマンドはどこにあるの?という話になる。
Visual Studio 20XX からデベロッパー向けコマンドラインを起動すると、勝手にパスが通されるので、おとなしく、Visual Studio を立ち上げて、下記のようにメニューバーからデベロッパー向けコマンドラインを起動すると、その立ち上げたコマンドラインから使うことができた。
tauri を使ってみた
作ったもの
影響管理を確認するための隣接行列編集ツール(https://github.com/mogwai-dev/mogwai-project-manager)
windows用。
使い方
github の release に飛んでもらってテンプレートフォルダとアプリをダウンロード。 アプリを起動すると、フォルダ入力ウィンドウがでるので、テンプレートフォルダを解凍してもらって選択。 フォルダ内の .list ファイルと .table ファイルを読み込んでタブが作られる。 .list ファイルには項目が書いてある。フォーマットは 2 列で id と 概要の csv ライクなフォーマット。 .table ファイルは .list ファイル間の組み合わせで .table のタブに飛んでもらうと設定した .list ファイルの組み合わせがすべて表示される。.list ファイルをクリックすると閉じたり開いたりできる。セル内をダブルクリックすると編集でき、影響がある場合は〇、影響がない場合は - となる。〇 印をクリックするとそれに依存する影響がカラーリングされる
tauri ってなんぞや
OS の Web View (ブラウザみたいに html と javascript を読み込んでくれるウィンドウ) を使用したデスクトップアプリ作成フレームワーク。
内部構造としては html と javascript を使用する Web View 側のソースコードと OS や native な ライブラリや API を使用するためのシステム構造側のソースコードがある。Web View 側とシステム側は IPC で通信をする。
tauri を使用した動機
- 今までのデスクトップアプリでは UI の作成にだいたいフレームワーク固有の言語だったり独自の UI システムを採用しているため、汎用性が悪く、将来性も悪い。
- Web View を使用しているということで Web のフレームワークや UI ライブラリが使いやすく、情報も多いため工数削減が図れ、任意のウェブアプリのフロントエンドの演習として将来性が高い。
感想
個人的にかなりとっつきやすかった。React と Rust は情報が多いので、検索すればすぐ出たり行き詰っても AI に聞けばヒントを教えてくれる。書いててちょっと気になったのはフロントとシステム側で IPC を用いているので、パフォーマンスは出ないんだろうなと思ってる。
Rye で invalid peer certificate が出るので、インストールできない
概要
Rye は python でまともなプロジェクトを作るうえで非常に都合がよさそう。venv や pipenv、poetry などを組み合わせて python のバージョン管理とパッケージのバージョン管理を行うよりずっとスマートなやり方だと思う。
そう思ったので、Rye をインストールしてみた。ところが、インストーラを実行したところで、下記のように invalid peer certificate エラーが出てしまう。
解決方法
前提条件
- Windows 11
- edge
- 先ほどのエラー画面の下記黄色部分にブラウザでアクセスしても弾かれないこと
具体的な処置
① インストーラでインストールに失敗しているので、cmd で rye self uninstall
を行って Rye をアンインストールしておく。
②上記の黄色サイトにアクセスする。パッケージのインストール順序によって違うパッケージのサイトが表示されるが、pypi サイトなので、何でもよい。
③左上の鍵マークをクリック
④接続がセキュリティで保護されていますをクリックし、さらに右上の証明書マークをクリック
⑤証明書ビューアーが出るので、"詳細"タブをクリック。階層式の証明書が表示される。
⑥証明書の階層を pypi.org からたどっていき、最も上のルート証明書を選択し、選択された状態のまま、ウィンドウ右下のエクスポートをクリックして、ルート証明書を crt 形式でダウンロードする。
⑦環境変数にて、SSL_CERT_FILE に ダウンロードした crt ファイルを指定する。
⑧Rye のインストーラを実行(今度はエラーが出ない)
原因
UV という pip の代替ツールが Rye のパッケージインストーラーとして動いている。 UV はデフォの証明書として webpki-roots crate という UV に使われている Rust クレートの証明書を用いることが記載されている。 docs.astral.sh
この証明書が弾かれてしまうと、Rye のインストール時に UV がパッケージインストールに失敗してしまう。 Rye の 0.39.0 では UV の代わりに pip-tool を使用するオプションがあるが、インストール時には必ず UV を使ってしまうようで、インストールの瞬間には使うことはできなかった。
環境変数に SSL_CERT_FILE を指定すると、指定した証明書を使用することができる旨が記載されている。
証明書に関して、指定する証明書はルート証明書である必要がある。ルート証明書じゃないものを使用しても失敗した。ルート証明書までたどり着けなかったので失敗したと推察している。
感想
証明書周りのことを結構わかってなかったので、「食べる!SSL!」を読んで勉強した。インターネット屋、ウェブ屋さんではないので、かなり読みやすかった。いい勉強になった。
RC-S380の分解と考察
動機
Arduino もとい ESP32 で NFC(Near Field Communication) の規格の 1 つである Felica を読み書きしたくて、ウェブ検索をしました。Arduino で Felica を使用するには、Sony の RC-S620/S で読み込むことができるということがわかりました。しかし、RC-S620/S は下記のように在庫もなし、生産終了予定であるという事実を突きつけられました。RC-S620/S に対して、後継の機種が出ていることはわかるのですが、ビジネス用途のため、現在時点(2023/5/13)で一般人には入手できないようです。
そこで、現在、私が持っている IC カードリーダー RC-S380 でなんとか代用できないかということで、分解して調べてみようと考えました。
RC-S380 とは
RC-S380 とは Sony 製の Felica IC カードリーダーです。
USB でパソコンに接続して使うもので、nfcpy で Felica を読み込めたりします。
ところで、ソニーの後継機種一覧を見てみると、下記のように UART か USB のインターフェースしかありません。
ここで考えたのが、「USB がインターフェースになっている製品は UART による通信をマイコンを通して USB に変換しているだけなのではないか」ということです。つまり、RC-S380 のマイコン部分を取り外せば、UART モジュールとして使用できそうだということです。 実際に分解して、様子を見てみます。
分解してみる
外観になります。
裏面はこのようになっていて、赤枠部分のゴムシートを外すと、ネジが 2 本出てきます。
この 2 本のネジ外し、右側の爪部分に注意して蓋を開けると、下記のように開くことができます。
中には基板が 1 枚入っているのみで、接着シートで表面と接着されています。これは力技で剥がすことができますが、剥がす必要はありません。
基板はこのようになっています。
大きい部品としては、左側に USB のコネクタがついており、上下 2 個の IC が載っています。
上の IC に関しては、このようなものです。
これは STM の F103TBU6 というマイコンになります。
下の IC はこのようなものです。
この IC は NXP の OM5570 というもので、ウェブ検索してもデータシートは入手できませんでした。
しかし、似た製品で、OM5579/PN7150ARD というものがヒットしたおかげで、Plug’n Play NFC Controller であるのではないかと考えられました。
考察
余計なことは考えず、UART なのか考察してみます。 まず、基板のパターンをよくみたところ、F103TBU6 の右側の 9 本のピンのうち、上から 3 ~ 6 本目までが下の IC に直説つながっていることが確認できました。
データシートから F103TBU6 の 36 ピンパッケージのピンの機能をみてみると、下記 2 枚の情報を得ました。
PA13 以外は USART の機能と一致しています。UART で通信している可能性が高まりました。 確信はまだできませんが、この線にはパッドが付いているので、この部分にロジアナを当てれば、解析できそうです。 組み込み開発者目線からして、通信波形は見ておきたいので、この部分にパッドが付いているのは頷けます。
残念ながら、ロジアナは持っているのですが、プローブ固定用のスタンドを持っていないので、考察はここまでにしました。
結論
確証はありませんが、RC-S380 は UART 通信している可能性が高いので、解析して、IC を外して線出しすれば、arduino もとい ESP32 でもできそうです。OM5570 のデータシートがないのでわからないのですが、IC の Enable ピンもあるかもしれないので、そういった部分などももう少し見たほうが良さそうです。
後書き
私はここで力尽きますが、この記事を見てより良い情報を生み出してくれればと思います。 それでは、また。
あと、プローブ固定用スタンドが欲しいです。誰か恵んでください
ARC004 A
復習も兼ねて rust で解き直してみる。
fn main() { let n = { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); s.trim_end().parse::<i32>().unwrap() }; let mut xy: [[i32; 2]; 100] = [[0; 2]; 100]; for i in 0..n { let (a, b) = { let mut s = String::new(); std::io::stdin().read_line(&mut s).unwrap(); let mut iter = s.split_whitespace().map(|i| i.parse::<i32>().unwrap()); (iter.next().unwrap(), iter.next().unwrap()) }; xy[i as usize][0] = a; xy[i as usize][1] = b; } let mut max_ans = 0.0_f32; for i in 0..n { for j in 0..n { let distance = ((xy[i as usize][0] as f32 - xy[j as usize][0] as f32).powf(2.0_f32) + (xy[i as usize][1] as f32 - xy[j as usize][1] as f32).powf(2.0_f32)).sqrt(); if max_ans < distance { max_ans = distance; } } } println!("{}", max_ans); }
__builtin_bswap
mgba 読んでたら __builtin_bswap というマクロが出てきた。
これは GCC に含まれるビルトイン関数。
これは、バイトを逆順に呼び出す関数。例えば、データ上のリトルエンディアンの値をビッグエンディアンで読み出したりできる。 正確には、変換するデータの大きさを表す 数字の suffix がつく。
簡単に確認してみる。
#include <stdio.h> int main() { printf("%x\n", __builtin_bswap32(0x12345678)); return 0; }
出力
% ./a.out 78563412
0x12345678 の 32bit のデータが逆順に読み出すことを確認することができた。