構造体リテラル更新記法におけるString型(@Rust)

構造体のインスタンス作成時に、すでに作成済みのインスタンを使用するということですが、以下の例でdivの型をString型とするとコンパイルが通りません。

何故なら、divをString型にするとemp2で..emp1でdivを使用した瞬間に所有権がemp1からemp2に移動してしまうためです。数値はプリミティブ型なのでそのようなことは起きないのですが。

#[derive(Debug)]
struct Employee<'lt> {
    name: String,
    age: u8,
    grade: u8,
    div: &'lt str,
}

fn main() {
    let div: &str = "sales";
    let emp1 = Employee{name: String::from("John"), age: 30, grade: 3, div: div};
    let emp2: Employee = Employee{name: String::from("Bill"), age: 25, ..emp1};
    println!("{:?}, {:?}", emp1, emp2);
}

つまり構造体でフィールドとして参照を持つ場合、参照フィールドには必ずライフタイムが必要ということです。

以下のようにstatic宣言にしてプログラム実行中のライフサイクルにしても良いですが、永続的なライフタイムを持つすなわちメモリをずっと占有してしまいます。

struct Employee {
    name: String,
    age: u8,
    grade: u8,
    div: &'static str,
}

Rustでは所有権にまつわる規則がどこかで必ず現れてきます。

 

admin

 

 

電源オンオフスケジュール用のGUIがある時点から無くなってる(MacBook)

昔の設定がMacOSのアップデートで設定が引き継がれていただけですが、以前はGUIでリブート設定していたものが、今はコマンドラインで設定するように変わっていた。ずっと変えてなかったから気づいていなかったけど。

pmsetコマンドで現在の設定を見てみると、

@MacBook-Pro ~ % pmset -g sched
Repeating power events:
restart at 5:00AM every day

こんな感じになっているから、最後の行のパラメータをpmsetコマンドで打ち込めばいいんだろう。使い方は、

% man pmset

で見れます。

 

admin

 

 

 

マイクラEEでmaze

maze(迷路)の作成アルゴリズムには色々ありますが、一番単純なアルゴリズムが棒倒し法です。棒倒し法のアルゴリズムは他で参照していただくとして、それをマイクラEE(教育エディション)で実装してみます。bedrock版でもプラグイン使うとMakecodeと連携できるようですが、マイクラEEではデフォルトでcode builder(中身はMakecodeと同じに見えます)が使えますからエージェントに迷路を作成させてみます。

いきなりですが、作成した画像は、

こんな感じです。

動画版は、

code builderのソースは以下のリンクから、

https://minecraft.makecode.com/88632-58071-51947-80905

① 初期化処理(『最初だけ』)で周りの囲いと一つおきに棒(以下ブロック)の配置をするための配列(リスト)を作成、リストを二つ作るのはブロックの重複置きチェックのために倒したブロックの配置を記憶しておくためです

② チャットコマンド”maze”を入力したときに、最初に枠と棒倒しの基準になるブロックを置き、次に迷路作成のための”make_wall”を呼び出しています

③ make_wall中では最初のブロックと二番目以下のブロックでは倒せる方向の可能性が違うので、引数で処理を分けて実際の棒倒し処理(“random_block”)を呼び出します。

④ random_block中では乱数で倒す方向を決めて、もし倒す方向に既にブロックが存在していれば、他の倒し先を乱数で決定して倒しますが、この処理も最初のブロック列と二番目以下のブロック列では処理が異なるのでロジックを分けて記述必要です

簡単に書くとこのような処理を行なっていますが、code builderのブロック言語でそこそこ長いコードを記述すると、コードの見通しが良くないので、実際のロジックの検証はPythonあるいはJavaScriptに展開されてコードで行うのが現実的。あとデバッグ機能のようなものも存在しないのでそこが不便なのと、変数のスコープがいまいちすっきりしないので、関数へはsize(正方形のサイズ)以外は引数渡しにしてローカル変数のごとく使っています。

これ以上に複雑なmazeロジックの記述はおそらく大変、

 

admin

 

ホバークラフト(浮上力向上させた)

発泡丼では空気室の面積が不足で、浮上力が思ったように出ないから、電池電圧が低下すると浮き上がらない。

対策は設置面積を増やすことですが、あまり大きすぎると重量制約も出てくるだろうから、ホームセンターで発泡板を上質紙で挟んだ軽量のボードを買ってきて組み込み。

組み上げるとこんな感じ、

スカート用の素材に使えそうなもの(テープ付き養生シート)があったので、それを貼り付けます。ただしスカートが開かないように左右を紐で抑えるため両面テープで貼り付け。x/y方向でそれぞれ3本づつ使いました。

動かしてみているところ、

マイムービー – SD 480p

 

回転モーメントが発生しているようで、自然にUFOのごとく自転しています。おそらくモーターの回転数がアンバランスではないかと思われますが。

ようやくスタートポイントといったところですね、

P.S. 2024/2/2

回転の原因はモーターの回転数変えてみて、回転数が支配的ではなくて、傾いて取り付けられていることによる横方向の力がおそらく原因。したがって取り付け角度のコントロールが必要ですが、構造作り替え必要です。横方向の力が働くので、回転すると同時に移動も発生していると思われます。

 

admin