星田オステオパシー

プログラミング学習日記 2024/04/12〜

2024/06/22 Rust、淡々と続けてます

 現在、「if letで簡潔な制御フロー」のテスト前まで進めてます。ま〜途中をいちいち画像貼ってもね・・
 とりあえずメソッド記法と関連関数については「なるほど!」って感じ。メソッドについてはPythonよりも分かりやすくて良いなぁ!もしかしたらPythonで軽く触れてたからそう思ったのかも知れんけど。
 ::の謎も解けた。なんだ、構造体(だけではないが)内部で作ったSelfをターゲットにしない関数の事だったのか。いや〜・・やっぱり最初は公式ドキュメントからやるべきでしたな。

 ちなみに、バイト先にChromebook CP100を持ち込んでやってます。既に更新期限が切れてる機種なんですけど、Rust Playgroundはちゃんと動くし、バッテリーはアホみたいに長寿命、画面タップでスクロールにジャンプも出来てテストするときには座ってキーボードで打ち込め、終わればすぐに寝転んで読める・・・と、Rustの学習者はメルカリでボロChromebookを買え!って感じ。

 Rust Playground、Dynalist。この2つが動けば今は満足だ〜


2024/06/18 Rust、数当て問題の白紙テスト2回目&ドキュメントの続き
 昨夜のテストから12時間後に白紙テスト
 こんな感じ。思ったよりも書けた気がするので、怖いもの見たさで実行してみる。いくつかエラーがあって、指示に従った書換を行いエラーは一箇所「readline」の部分だけになったけど、ここはどうにもならず

io::stdin()            
    .read_line(&mut guess)            
    .expect("Failed to read line");
 あ~・・stdin().read_lineか~・・けど、決定的なミスはここだけ?だったっぽいので見込みが出てきたかな。やっぱり映像記憶的な覚え方じゃなくて、理解した後で記憶・・ってのが効果的なんかな

 その後、公式ドキュメントを4.2の所有権「参照」までミニ白紙テストをしながら読み進める


 途中、WRTNのGpt4では結構トンチンカンな返答が多いのに対して、Claude3でのコード解説が正確な気がしたのでClaude先生に質問
 タブーかな?と思ったけど答えが返ってきた。なるほど~・・ただ、自分の名前をClaaudeと間違ってるせいで信頼性が下がってるのだが


 ナイスな概念、ループラベルを知る。

 訳者さんがノリノリ

 うーん、説明を読む限り配列よりもベクタを使いたいな(リスト的なので)。ま~そんなスピードを求めるようなものを作れるようになる頃にはCPUのスピードが100倍くらいになってそうだし(^_^;)

 なるほど・・型指定の手間がいる分(?)、その他の入力は限りなく節約してる感じだなぁ

 ああ、シャドウイングってLetを使った束縛でのみ起きるのか。メソッドなどでの上書きをする時にはMutにしておかないとイカンわけね。全然わかってなかった

 その後はループ制御各種をその場で白紙テストしつつ読み進めて終わり。うーん、そろそろ知識的にはBrainF☆ckが書けそうだけど・・まあ、最後まで細かい白紙テストしつつ読み進めるか~



2024/06/17 Rust、数当て問題の白紙テスト1回目
 インターバル3日でやってみる。ちなみに当日(3日前)はテストせずに一度だけ写経してます。
 うーん、書いてみると分からないところだらけ(^_^;)
 ここは何かあったよな〜ってところは??にしてます

 では正解を・・(ChromebookC100Pは更新期限を過ぎているので拡張機能のダークモードが使えずに画面が白いです。まあ、対比しやすいか・・)

 まず冒頭のライブラリ
use rand::Rng; 
use std::cmp::Odering; 
use std::io;
 か〜・・まあ惜しいかな

 次に乱数発生
rand::thread_rng().gen_range(1..101)
 これは文句なしに全然だめだな。まあ、丸覚えするしか無いが・・

 で、以下は全部Loopの中か〜・・
 Read_lindeでの入力、思い出せないなぁ〜と思ったら全く想像もつかない形式だった・・ってくらいに覚えてなかったわw
io::stdin().readline(&mut guess).expect("fail ...");
 入力と例外処理って1ステで出来るのか・・空文字列を予め作っておいて、それを参照して標準入力、チェインさせて例外処理でこちらはPrintln!が不要と。

let guess: u32 = match guess.trin().parse() {
    Ok(num) => num,
    Err(_) => continue,
};
 ここはもうどうしもようない。guessへの束縛で全部片付けるとは・・特にContinueで脱出?するのは改めて見ると衝撃的(便利そうだけど)。
 Matchのあとに比べるものが無いってことは{の後のOk(num)のnumが数値型を表してて条件になってるのか・・つまりi32とかの上位概念って事か?ところが返り値が=> numとなってるってことはguess.trim().parse()の値が束縛されてる変数って事だよなぁ?
 しょうがないClaude先生におすがりするか・・

 あ、Parse()で返ってくる時点でu32になるのか・・
 


 で、Numは条件ではなくてやっぱり変数か。Matchした具体的な数値をNumとして返すってことはParse()が値をU32であることを要請していると。で、うまいことParse出来た場合はOkで、その値をNumに束縛するわけだな。

match guess.cmp(&secret_number) {
    Ordering:: less => ...
    Ordering::Greater => ...
    Ordering::Equal => ... { println! ... ; break; }
 これね!なるほどなるほど・・Matchのパターンが分かってきたかな。Matchの次に式?が来て、その返り値を{}のブロック内で場合分けして返すと・・
 ただ、;と,が混在してるのが謎だなぁ・・Claude先生!

 むっ!

 ははぁ・・それぞれが値を返す場合は,を使うってことか!

 なるほど!今日はエラい勉強になった気がする。やっぱりちゃんと1つずつ理解していかないとイカンな!と思いました。



2024/06/14 Rust、結局公式ドキュメントに行き着く
 Cametanさんから「早いうちにMapとかFor_eachに慣れておこう」というコメントをいただいたのでリンク先を拝見。むむ・・英語は平易なので良いのだけど例文が高度すぎて参考にならんw(Basic usageとか書いてあるのが更に絶望的)。

 ということで日本語版ではあるが公式ドキュメントを読み始める。と言ってもさすがに2章の「数当てゲーム」からだけど。で、これが実に良かった・・{}や()に関する説明も全部入れながら、いきなりIo入出力とかMatch・例外処理・Loop・・と「これが知りたかった」が連発、こっちに乗り換えることにした。ライフゲームは基本を知ってからで良かろうと。

 このメソッドチェイン部分で改行するスタイルは気に入った


 なるほど!こういうルールが決まってるんだったら喜んで受け入れよう

 数当てゲームは非常に良かったので白紙テストで書けるようになるまで、忘却曲線に沿った繰り返しで丸暗記しようと思います。

 Cametanさんから排他的論理和についての注釈コメントを頂きました。
 あ、ビットの桁ごとにやるってことだったのかw なんという推理力の無さ、まるで学習まんがのキャラの如しw ありがとうございます!



2024/06/13 Rust、電卓
 乱数の次は電卓を作ってみようというお題・・おいおい、いよいよ来たよ面白そうなのが!
 電卓ということはついにインタラクティブな構造のプログラムが来るのか?

 が、期待はちょっと裏切られたメイン関数にあらかじめ数式を打ち込んでおくタイプか~・・まあ、良いけど。

 前から逆ポーランド記法ってどういう意味があるのかと思ってたけど、なるほどスタックと相性が良いと言う話で納得、確かに!これは為になった
 文法的にはMatchとエラー処理の部分だけが新規要素なので、それを理解して白紙テストの備えますか~



2024/06/12 Rust、シーザー暗号白紙テストと乱数
 昨夜復習して12時間後に白紙テスト。うーん・・こんな感じだったかなぁ・・pushが2箇所あった気がするので、そこんところ間違ってる気がする。


 あ~・・まずは
 ch.is_lowercase() { ch.to_ascii_uppercase() か~・・言い訳すると同じ変数に別の値を束縛するのに抵抗があったんだと思われる
 基準となるアルファベットAをaに束縛する場所が違う。けど、そもそもこんな下のレベルで束縛する意味ある?関数の頭で良さそうな気がするが!
 let enc - (((ch as i16) - a + shigt + 26) % 26 + a) as u8は良いんだけど、そのまま;でつなぐことが出来るのか・・昔の言い方でいうとP6のBASICで言うところのマルチステートメントってヤツか?けど}で終わらせてしまってるのは言い訳不能だけど。とにかく{}の中で;によって逐次実行の連続が可能ということか・・
 次は成功させるぜ!

 続いてようやく第三回の乱数生成アルゴリズム。なんと2000年代に入ってから開発されたという・・最新やん!



 まず色々と分からないのでWRTN先生に聞く。引数を関数内で破壊的に使うので&mutと。
 <<でビットシフト、^=で排他的論理和ね・・なんだそれw?

 は~ん・・値が違う場合だけ束縛するってことか。結局同じなんだから構わず束縛したらエエのでは?と思うのだが。それとも真偽値が入るのか?そんなことも無いだろうしなぁ・・

 ビットシフトの数が素数だったのが気になって質問。別に意味は無かったのか・・

 最後の*seedにRetunが無かったので、Cametanさんから聞いてはいたけど一応実験。Returnのあったシーザー暗号のRotateの最後、Returnを取ってもちゃんと動きました。統一してくれ~


 Forの範囲設定で今回は=が無かったので質問。そういうことか

 後は時間の取得に関するメソッドがあるんだけど・・なんか日本語では検索してもロクな情報が出てこなかったし、欲しいとも思わないので今回は良いや。アルゴリズムの仕組みだけ理解したら次の回に行こう



2024/06/11 Rust、一週間寝かせて白紙テスト
 お前はまたプログラミング学習をサボって・・・
 い、いや違うんです。シックスサマナの読書とか図書館でリクエストした本が来たり、手持ちHDDの整理を猛烈にしたくなったりメルカリに不用品を出品したり・・とずっと懸念の事柄があってですね!それらを片付けないと、落ち着いて取り組めないなと。

 ところで最近ハマっているクーロン黒沢さんですが、現在WEB連載中の「マイコン少年残酷物語」の第二回を読んで思いました。





 「結局、プログラミングって記憶力の問題なのでは?」

 と。将棋とかと一緒で定石みたいなものをイメージ記憶みたいなもので脳内に蓄積し、それをうまいこと探し出してきて必要に応じて書き換えて打ち込む。右脳のイメージ記憶力が活性化していれば可能なのでは・・
 しかし同時に思いました

 「結局、記憶力って動機づけの問題なのでは?」

 と。上のスーパーハード君も他に何も逃げこめる場所がリアルにないが故の集中力が発揮された・・っぽいですもんね。栄養状態も良くないだろうし、親から遺伝的なギフトも受け取ってるとは思えないし。

 ぬるま湯状態の僕ですけど、せめて気がかりな事を先に片付けてしまうのは有効なのではないか。そう言えば小学校の時に読んだ「はるみのゲームライブラリー」でもJKゲームプログラム投稿者のはるみさんが「はるみの場合は、家に帰ったらまず手を洗ってお部屋の片付けをしちゃいます。それからマイコン君に向かうようにしてます」というような事を書かれていたし!ちなみに「はるみ=JK設定」は当時のベーマガ読者のお約束なので、死ぬまで乗っかっていくつもりです。

 一週間寝かせて白紙テストをしてみた結果


 うーん・・こ、こんな感じじゃなかったか?とひねり出したけど・・コメントに書いてるけど1つの関数で暗号化と復号化の場合分けをどうしていたかが思い出せない。確かIFは1つしか無かったような気がするんだよなぁ・・メソッドの使い方もはっきりしないしなぁ。

 では続いて解答です

 うーんw 
 型宣言で:、束縛内でif(これはうっすら覚えてたんだけど・・と言い訳)、asの存在、Pushメソッドの書き方、26文字でループさせるアルゴリズム、イテレータ処理の.chars()、復号化はそうか暗号化した数値をマイナスすれば・・そりゃそうか。

 と、この悲惨な結果を踏まえた上で写経をしてみます。多分いきなり写経するよりもテストして愕然としたあとに写経すると良いのではないかな〜



2024/06/04 Rust、まだシーザー暗号
 とっとと次に行こうかと思ったんだけど(イメージ記憶しようと)じっくりと見てみたところメイン関数に妙なものを発見「&text」ってなんだ?試しに外してみたところエラー発生。

 ちょっと話が逸れるけど、このエラー表示に感動。めちゃくちゃ詳しい!(そう言えば前にCametanさんが言及されていた)
 ここまで詳しく分かるんだったら自動で修正出来るんじゃないか?という気もするが・・・(^_^;)

 話は戻ってClaude先生に質問してみる

 あ、噂の所有権関連か〜。解説を読んだ限りでは深く考えずに&つければ勝手に参照渡しにしてくれるっぽいので、そのまま覚えてもいいのだが・・


 そこを敢えて使わないようにするとどうなるのか?と質問。なるほどStr型じゃなくてString型にした上でCloneメソッドを使って新規のインスタンスを作ることで所有権問題を回避するということか〜。
 実はこのあと、更にCloneも使わずにやったら?と言う質問もしたんだけど、ま、非推奨ってことだし大変そうなのでスルー。


 こちらがClone使用版。


 そして今回もCametanさんから昨日分へのアドバイスがm(_ _)m
 ワハハ!いや、8、16、64・・ってなんでそんなに細かく分けるんだよw。最大で良いだろ!と思ってました。そこまで絞り込んだプログラムにも対応出来るってことなんですね〜。そりゃ自動運転とかだと命取りになるかも知れませんしね



 はい!前回の分と合わせて書けるようにしときます
 

2024/06/03 Rust、シーザー暗号
 Zorinに標準装備のGeditにコードをコピー。拡張子をRsにするとしっかりと対応した色分けをしてくるんですね。しかし見づらいのばっかりだったのでネットでクリムゾンとか言うテーマを見つけて入れてみる。また余計なことをして時間を無駄にしてしまった・・
 とりあえず今回はシーザー暗号なんですが・・これは白紙勉強法での再現はちゃんと理解しないと無理やわ


 例によって分からない部分をWRTNに聞きながら読みすすめる。引数は名称のあとに:で型を指定するんだな、と。i16って?なるほど


 謎の→だったけど、なるほど関数全体の返り値の型を指定すると・・慣れたら面倒でもなくなるのかなぁ


 ふーん、Stringで型を指定してnew()って言うメソッドで作ると。Mutも分かるけど::って?


 いくつか役割があったけど3番めのコレだな。標準ライブラリにアクセスするときに必要と。標準ではない場合には.って事か


 文字列をキャラクターの集まりとして処理すると、これはPythonでおなじみなんでOK

 今回のメインであるアルゴリズム部分。もともとどうやってアルファベットに対応する部分だけに限定するのかな?と思ってたけど・・な、なるほど〜!26で割っての余りならXYZとかの端っこをABCにループさせることが出来る!これはスマート過ぎる方法。応用効きそうなので覚えておこう!


 String型の変数に順次Charを追加していくと。これは便利だな〜!その後変数EncをChar型にして・・ってのでAs Char(入力の関係で冒頭大文字になるのはご勘弁を・・今更ですが)ってのがいきなり自然言語っぽいので戸惑ったけど、分かりやすいと言えば分かりやすいか〜



 折角LinuxにRustを入れたんだけど、WEB版だとChromebookでも使えるのでコッチをメインで使うかな・・やっぱりコンパイル面倒だし。見た目も使い勝手も文句はないけど、ライフゲームみたいなループで延々と動かすようなものにも使えるのか?ちょっと楽しみ。
 第二回でいきなり行数が増えたけど、白紙テストで合格できるように意識しよう。

 
 そして今シリーズでもCametanさんからアドバイスをいただいてますm(_ _)m




 なぬーっ!?さすがの僕もCで終わりに;をつけるのは知ってたので、同じだと思ってました。思わぬところに罠が。しかしクロステックの記事、文中に「眺めてRustに親しみつつメジャーなアルゴリズムにも触れよう」的なことが書かれているので文句言う筋合いは無いのだけど、本当に文法の解説が無いのがなぁ。WRTNとかClaudeが無いとこのチャレンジはやってられないところだったな。そのGPT系でもCametanさんが教えてくれたような転ばぬ先の「注意事項」みたいなのは教えてくれないわけだし。ありがとうございます!



2024/06/02 宿直Bなので学習しません
 日曜日と水曜日は宿直B、5時半起きで厨房仕事があるので夜は寝ないときつい。よって頭を使う作業は出来ないのだ。厨房が始まるまでは逆に日曜日と水曜日が学習向きだったんだけどなぁ

 それでも何もしないのは許されないので、ちょっと復習をしてみようと。そこで思い出したのが「白紙勉強法(だったかな?)」。理解していれば白紙に向かってすべてを書き出すことが出来るというもの・・だったような?要するに、ヒントも何もなしで書きだしてみろと。で、書き出せないところが理解できてないところだと。なるほどね、一理ある。というか、その通りだ。

 ということで思い出して書いてみる。昨日読んでる時には別に覚えようと思ってないので、これは確かに理解力が試される。

 {}とインデントをちょっと意識しながら書いてみた。原文より個人的には読みやすい

 では続いて正解を見てみよう!
 ワハハ!いやまあ、思ったよりは合ってたな。
 まずMain部分、なるほどFnって何だよw。そして()をつけてからの{か〜
 ForとLetはネタにしただけに覚えていた。
 Println!は;してから}か〜
 Elifじゃなくて以降は全部Elseで良いんだね、合理的。
 Println!の変数挿入は"{}", nか〜

 ちょっと面白そうなので、白紙学習法続けよう。

 あと、低スペネットブックにRustが入らないのでWEB版を使おう!って話。残念ながらPuppy推奨のブラウザPalemoonでは動きませんでした!Firefoxとか入れたら普通に重いので低スペはブログ専用にするしかねぇなぁ


2024/06/01 Rust環境を入れて・・
 WEB上で実行することも出来るらしいんだけど、折角なので例の記事でバックナンバーを遡って宿直先のLinuxマシンに入れてみる。


 記事に書かれている通りのエラーが出たのでgccを入れると・・


 おお~・・生まれて初めてコンパイラでのプログラム実行したわ~


 これが元のコードなんですけど・・第一回はFizzBuzzって事でジロジロ。
 Forの書き方が独特だな~ 「..」って。そして
 Let。ブーリンを束縛してるのは推理出来るけど・・超合理的って言うんですかね?クセあるなぁ
 Println!は普通にFormatみたいに要素を入れられるみたいで便利そう

 しかし書き方がちょっと・・なんで行頭に}を持ってくるのか?構造がすごく分かりにくい気がするんだよなぁ・・


 試しに{}だけでも普通に包んでみる。これでもちゃんとコンパイルと実行は出来たのでケツの}}も(どうせエディタで対応してる{が発光するので)まとめたるべきやったな。別にインデントも関係なさそうなので自前で書くときにはRacket準拠の見た目になるように書いたろ。
 ということで、とりあえずクロステックのバックナンバーを一日一個やっていくって事で。

 ちなみに例の低スペネットブックにも入れたろ!と挑戦したんですが・・初回にパーソナルスペースを増やしておかなかったのが原因なのか、容量不足で展開不可能。うーん、こっちはWEB版で。


2024/05/30 再始動

 言い訳は色々とあるんですけど、ようやく生活が落ち着いてきて「いっちょやるか!」という気分になってきました。
 宿直50連勤はいくら楽な仕事でも気が休まらんしKindleUnlimitedもあるし、胆石はシクシクからの悶絶週間(下手したら死んでる可能背も無かったわけではない)・・・と結構しんどかったので、なんか「その気」になれなかった、の、だーっ!!ま、そういう時もある。
 ちなみに宿直連続問題は施設長が全く動いてくれないので、個人的な知り合いを紹介して、結果週1で休みが取れるようになった(ただし稼ぎが月に5万円減る)。そして最近やたらと細かいチェックを入れてくるようになったマンション清掃のバイトもムカついたので6月一杯で辞めると言い放ってやった。これにてかなり楽になる(こっちは月に2万円稼ぎが減るが)。

 じゃあPrologの続きか?と言うと・・「Prologの体験は一応したし・・Prologに向いてるものが作りたくなったら、やるってことで・・エヘヘ」ってことにしとこーと。



 とりあえずは以前見かけてブックマークしておいた
 この記事を追っかけてRUSTでの実際のコードと、ライフゲームの仕組みを体験してみようかなと。放置してて勝手に何かが起きていく・・ってのが好きなんで・・。結局「アルゴリズム」の問題になってくるとは思うんだけど、全然他人の書いたコード読んでないしな〜ってのもありますし。


2024/05/07 みんなKindleUnlimitedのせい

 前回の日記でProlog面白くなってきた!とか書いておきながら全然やってないじゃないか!と。あなた、そう思ってますね?
 そ~なんです!やってないんです!
 これはみんなKindleUnlimited2ヶ月間無料体験が悪いんです。今までプログラミング学習やってた時間、ずっと本を読んでます。

 最初は、高校数学やり直しの本で「公理の証明」を徹底的にやるのがあって「これはプログラミングに非常に関係がある」と思って読んでたのですが、そのままズルズルと他の本にも・・・

 とりあえずプログラミング関連で言うと「マイコン刑事(デカ)」を読みました。こういう時こそPrologだな!とか


 謎のSHARPマシン推しとか


 アスキーコードの日常生活での活用法とか


 日本の半導体産業の(当時の)現状とか


 オッサン大歓喜のデータレコーダーネタとか

 勉強になりました



2024/04/16 prolog、面白くなってきた!
 ここ数日、手は動かさずに↓の「Prologへの入門」を普通に読んでます。
 そしてコレが面白い!失礼かもですけどWEBなんかで読んでたProlog入門ってなんつーか他の言語で出来る手続きをPrologで再現する感じなんですよね(今から思うと)。
 よって「なんでワザワザ難解な方法でやんの?」って想いが心のどこかにあったと思うんですけど・・この本はProlog独自の機能を活かした実用的なプログラムの雛形を紹介してくれてて「こーゆーの出来そうだな?」というワクワク感が湧いてくる感じなんス!
 もうすぐ一周目読み終わりそうなので、その後は手を動かしながらちゃんと練習問題もやって行こうと。気に入ったので(中古で)買ってしまおうかなぁ〜。

 やっぱちゃんとした人が書いた本で勉強せんとイカンなと思いました


2024/04/13 prolog、読書するか
 ネットでの勉強も良いけど、もしかして書籍で読んだら理解が出来るかも?
 などと考えて図書館でリクエストしていたのが到着、読み始めました。
 著者(外国人)はもともとLISPに人生をかけてたがprologスゲーッとなって「どっちもやれ!」派になったとか。これはモッテコイの著者さんでは?

 今夜は宿直先にパソコン持ってくるの忘れて途方にくれてます。


2024/04/12 Prolog、うーん・・

 というわけで末尾再帰を使った書き方の続き。一番下のが模範解答。Maxlist2は自作で末尾再帰形式で書くパターンに沿ったもの、条件分岐がちょっと洗練されてないけど一応動く。
 問題はMaxlist1で、直感的にはコレでも動くのでは?と色々とやったけど駄目だった。一夜明けて考えてみると、Maxlist1でのAは実行時に不確定(というか求めたい値)の自由変数であるために引数?としては利用できないということなのだろうか。


 続いてMinilistもやってみる。これも条件分岐は冗長だけど一応動くようには書けてます


 FizzBazz問題と一緒で全く手が出ず!明日はコレを読解して行こう
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「プログラミング」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事