星田オステオパシー

プログラミング学習日記 2022/07/18〜

2022/08/11 
話題1 Cametanさんの日本語ソート記事を拝見する
 そういうことかー!String=<>?も思い当たりそうなものなのになぁ・・結局ですね、一回ちゃんとドキュメントを通読せえよ!という事だなぁ・・餓狼伝読んでる場合やあらへんで(^_^;)


 という訳でCametanさんが書いてくださったソート関数を使ったバージョンを打ち込みまして・・


 出力をローマ字にしたりして遊んだり。うーん、面白い。むっ!と思ったのはsort関数の手続き部分になってるLambda。こんな使い方が・・

 Racketのドキュメントだけど読んでみると、引数xyなのはこのルールがあるからかな?高階関数の手続きとして使われた場合は持ってくるリストが後ろに無いのもなるほどか・・もっと読んでもっと書かないといかんな〜(いつもの結論)。


 直訳版ムズッ! ちょっとこちらは明日以降にじっくりやります。関数名にデータ名を適当につけてしまった上に、途中で動作テストめいた実験をやったりしたので自分で書いたのが翌日に追えないという(^_^;)

話題2 クリプトゾンビ
 
 中嶋聡さんが紹介されてたクリプトゾンビ、イーサリアムのシステム上で動くプログラムの学習チュートリアルらしいんだけど普通にプログラミングの学習に役立つという話なので・・ブックマークしておきました。

話題3 Racket8.6
 Cametanさんの記事でリリースを知る。String=<>?の件でも思い知ったけど、ざっと目を通すだけでもR7rsとかRacketガイド、Racketリファレンスに目を通しておこうと思いました。
 えっ!人類史上最強のプログラミング言語だったのか!(・.・;) やる気湧いてきた!うーんこの浮気者


2022/08/09 プログラミングの基礎を進める
 まあ当然のように動かないのでw 手を入れる(^_^;)


 あ、そうか・・bに束縛するのに初期値が空リストじゃなぁ・・

 一応出力されたが・・?全然あいうえお順になってないが?



 というかReverseになってるだけやんw



 とりあえず並び替えが終わったはずのリストから先頭を抜き出してみるが・・「めいじじんぐうまえ」って事は並び替え失敗してるな〜


 どういう並びになってるのか知りたいので出力しようと思ったがエラー。ここでかなり悩んだ末に・・

 koreの中身を見てみると・・この空リストが問題だったか!

 flattenをかまして・・よっしゃ!ま、並び替えは全然機能してないんですけどね。というかですね、ソートのアルゴリズムを全然考えずにそのまま打っただけなので・・これはイチから自分で書いたほうが良いな。


 ↑とりあえず今日はここまで。弄り回したのでLetでekimei0の初期化をするとか名前付きLet使うとかは明日以降に(^_^;)
 並べ替えアルゴリズムが全然機能してないので、もう、リストを使ってイチから作る!

 今日の気づき
 carを使うとpairである必要が出るので、list-refで取り出すと良いのでは
 初期値としてlistを使うと邪魔な()が出るけどFlattenで解決出来そう
    


2022/08/08 プログラミングの基礎を進める
 レコードから名前部分を一気に処理する書き方を確認して・・・

 次の演習はレコードのリストをフィールド「ひらがな」の基準でソートするというもの。ひらがなの並びで・・?うーん、文字をASCIIコードかなにかに変換して?比較するとか?と思ったんだけど答えを見たらそのまま>=<で比較してる。いや〜Schemeじゃ見たこと無いし無理じゃないかな?

 これはいけるが・・・

 ですよねぇ




 どうやらコレが使えそう




 問題は文字列には対応してないということで・・String-refで先頭の文字を抜き出せば・・行けるけど、よよぎこうえん と よよぎうえはら とかだと別の駅でも隣り合ってしまって次の「重複を解消する」ってのがうまく出来ない予感。更に場合分けをしないといけないだろうなぁ・・とは思いつつ、ま、とりあえず続けます(^o^)
 追記:あ、違うわ。重複は完全一致だからそれは容易い、、ってことで純粋にソートの問題か


 一応、ベタ移植という感じで打ってデータを通さずに実行してみてエラーが出ないようにした時点で宿直のお時間となりました。あ、リストが空になった時の「ekimei」はekimei0の間違い、コレAccですよね?関数名とデータ名で混乱する〜

 日本語まじりの文字列リテラルの抽象度を1つ上げて比較できるような関数があれば一発解決なんだけど?と言うかOcamlの比較って標準装備なのか・・ってことはSchemeにもSRFIでありそうだなぁ・・明日はこの捜索をしてみよう。


2022/08/05
話題1 日経クロステックの記事でRacketが紹介されている!

 あこがれの言語だったのか!出会えてラッキーです(^o^) リンクはこちら
 オススメ環境としてRacketの導入が紹介されてます。いや、確かにRacket良いですよね〜 


話題2 プログラミングの基礎の続き
 駅名のコンバート問題でCametanさんから色々とアドバイスをいただく。

 こちら、参考にさせていただいて打ち直したものだけど・・うお!?タイプを定義して既存のリストの要素に埋め込むことが出来るのか(実際には埋め込んだものを新たに返してるのだが)!これは凄く便利なんじゃないでしょうか・・
 ちょっと型が気になったのでチェックして・・と。ん?ペア?リスト?

 あ、そういうことか・・こういうのを取りこぼして理解できなくなる予感。

 で、いよいよプログラミングの基礎を続ける。駅リストから駅名、最短距離(無限大だというが・・とりあえず#fで)、最短経路(空リスト)を保存するためのレコードを作る演習。

 リストで#tなどを要素にする書き方をチェックしておいて


 こんな感じで。実にタイムリーにCametanさんの書いてくださったmapとLambdaの書き方をパクったんですけどね!実はこのままリストで済ませようかと思ってたんですけど、どうせだったら(またしても)タイムリーなことにCametanさんの書いてくださったリストにRecord属性を付与する例のアレを適用してみるか・・と

 おお、スッキリ!なるほど〜・・とりあえずリストにしてしまってmapとLmabdaで処理するって良いですねぇ!と言うか・・Cametanさんのヒントが的確すぎるのだが!?

 つづく

2022/08/04 「子供の科学」という雑誌を知る
 図書館で発見、子供のための科学雑誌・・中を見てみると・・

 プログラミングのページがちゃんとあるんですよね・・しかも雑誌者からラズパイを使ったキット型パソコンを出してる模様。良いなぁ・・何冊か借りて読んで見る。

 うお!スクラッチメインのプログラミング学習ページなんだけどちゃんとコード打ちの言語への移植の回がある。やりますねぇ・・

 あと、僕も気になってる「写経でプログラミングはうまくなるか?」というトピックスの回も。例のぷよぷよプログラミングがサンプルに。気になる結論は「有効という人もいれば意味がないという人もいる」という玉虫色決着。なかなか意見が別れてるんですねぇ・・

 そして、なんとこの「ジブン専用パソコン」のコーナーはアカウントを作れば過去全部バックナンバーが読めるという!もちろん登録しました。まあ、甥っ子がプログラミングに興味を持ってスクラッチを教えないといけなくなったときのためにね。


2022/08/03 
話題1 Cametanさんの記事を拝見する
 おお・・最初からあるのか・・老人はボケ防止に、子供は脳の発達のために、脳トレとかやってないでRacketで遊ぶべきなのでは?


 www




 久々のビッグバンだしちゃんと追っていこう!ということでネットリと読み進む。言うまでもないけど、完璧に忘れてるのであった・・特にGUI版はなんだかんだ取り組んでないので忘れたというのもおこがましいが・・夏休みの工作では活用したいと思います。


 ところで「代数学」ってなんなの?という恐ろしい疑問が湧いたのでWIKI。めちゃ大事じゃないですか!(^_^;)



 という訳で行列とかについてもWIKIでジロジロ眺めてたんですけど・・こんなの読んで理解できるようなら苦労は無いわけで(^_^;) 例によってもっと分かりやすく解説してるページで「幼稚園からの代数学」とか「サルでも分かる集合」とか言うサイトを(あれば)探してじっくりやるかなぁ・・

 こんなの書かれてたし・・

話題2 プログラミングの基礎 Ocaml->Scheme データコンバート問題
 テキストエディタ「置換」機能を使って整形、Schemeで文字列のリストとして使えるようになりました。所要時間5分程度・・ツールって大事だな!
 ただ、何故か途中でレコードの順番が入れ替わってる部分が何箇所があった。Ocamlのレコードだとフィールド名で指定するので「リストとは違うぜ」ってのを思い知らせるためだったりして?まあ、Lispはリスト処理が得意だからリストがエエ的な話を聞いた記憶があるしリストで!実際のところデータを作るのにいちいちフィールド名を入れて・・とか面倒そう・・まあ、そのテンプレートを出力する関数を作れば良いわけだろうけど・・
 という訳でこっちも並行してやっていきましょう、と。SchemeはChromeBookを使って出先で出来ますからね。Pythonの高校数学も途中だけど、進めたら行列とか集合とか微分積分が出てくるだろうから、そっちを進めてからCametanさんの記事を読み直してBig-Bangするって手もあるなぁ。とにかく僕の数学力の無さは常人の予想を遥かに下回ってますから!

 

2022/08/02 正規表現・Ocamlでの変換に挑戦したが・・
 ダメ元でString-deleteに食い下がったが・・エラー表示を見ると#["]と出ているのでちゃんとダブルクォートが認識されても駄目だってので諦めがつく



 正規表現、これを使ったら行けるんじゃないかな?と試したが・・やっぱり””の入れ子に対応できなくて諦める。Ocamlしかねぇか〜


 出先なのでIdeoneを使ったんだけどエラー無く動いても標準出力に結果がでなくてイライラ。と言うか、結局Ocamlをちゃんと使ってないので関数の実行もよく分かってないんですよね・・プログラミングの基礎だと今のところ説明が対話モードだし・・
 ただまあ、パターンマッチで関数を書いてレコードのリストに対してmapかけて出力されたものをコピーしてSchemeの環境に貼る・・って事で多分出来るから良いか(^_^;) 
 出来たものとしてテキストエディタで整形してSchemeで続きをやろう。OcamlはLinuxPCにちゃんと環境を作ってやりなおすってことで!



2022/08/01 文字列変換で行き詰まる

 プログラミングの基礎の練習問題をこなすためのデータを得るために変換プログラムを書くか・・と思い立ったわけだが
 うーん、文字列として””でくくるわけだけど引用内も文字列なので””があるせいで・・



 中の””が無ければなぁ・・



 ただ、連続した特定の文字を消すのがちょっとstring-deleteでは出来ないっぽい?


 こういう感じで文字列リテラルで指定できれば話が早いのだが・・


 まあ、そもそも”(ダブルクォート)を対象として指定できずに困っている。String-deleteの説明のこの部分!これが,っぽいので同じように”を表す何かがあると思うんだけど・・シングルクォートで囲んだり色々とやってみたけどアカンかった・・

 解決策としては・・
追記0,正規表現やってみるか!
1,Ocamlからはアクセスが(構造体として)アクセス出来るはずなので、そっちでScheme向けに使える形で出力する
2,もう面倒なのでテキストエディタの変換で処理してしまう

 ま、折角なのでOcamlから出力するのをやってみますか・・明日ね!




2022/07/30
話題1 数学関連

 あ、よく指数関数的って言うけど・・厳密には指数関数ってネイピア数のx乗だけを言うんですね。教養として覚えておこう


 またオイラーの公式が出てきたのでちょっと検索。なんか美しいのは分かったから、何か役に立つのかな?と。とりあえず縁が無さそうだw

 Qiitaにてやっぱりネイピア数って?というテーマの記事があってジロジロ拝見。Youtubeとかいろんな学習ページが紹介されてるのでブックマークしておいてまた見るか・・

 そして微分とかにつながってくる・・ということで・・寄り道が酷すぎるw。興味は尽きないけど、まずはPythonで高校数学を最後まで終わらせるのと、プログラミングの基礎。その後SICPに戻ってこよう、と。

話題2 プログラミングの基礎
 今までのRacketとかSchemeだとまず自然数の再帰からって感じだったのだけど、プログラミングの基礎だと具体的なリストに対して再帰をやった後でようやく自然数に対する再帰が登場。階乗とかそういうの。抽象度を段々と上げていくって事なんでしょうね・・まあ、これは散々やってるからエエか・・書き方もいつものアレだし。
 という訳で飛ばして次のダイクストラアルゴリズム・・練習問題をやるためには路線図のデータを操作しないといけないのだけど、打ち込むのは果てしなく面倒なのでサポートページからいただく・・としてもSchemeで使える形に整形しないといけない。テキストエディタの置換で簡単にできそうだけど、折角なのでコンバートする関数を作ってみるか・・明日以降だけど。




2022/07/29 
話題1 SICPに取り掛かろうと思ったが・・
 SICP(新翻訳版のJSICP)はずっとキンドルに入れっぱなしなので早速2−4へ。抽象データの多重表現!タイトルからして難しそう。で、サンプルとして考える対象が「複素数」。虚数iを使うのは知ってるが、例によって詳しくはさっぱりなので

 「アタリマエ」さんを見る。「複素数平面」ってのはよく聞くけど虚数部iは例えると(実部の増減を東北座標の動きだとすると)南北の座標を表すものなのだという。座標を表すのに(x y)とかってしなくても1つの式で表せるのが便利だと、確かに!プログラミングの場合を考えると取り扱いがメチャクチャ楽になりそう(使えるのかまだ知らんけどね)



 座標にiを掛けると(確かに)グラフ上で90度左回転するな・・今回関係があるか知らんけどプログラミングだと画像の回転とかに使ったりするのかな?基本、そんだけの解説だった。
「あわせて読みたい」の項目に「オイラーの公式」の解説があったので「じゃあ読んでみるよ」ということで目を通す。

 ふうむ・・・ま、良いか(^_^;)!と一旦時間切れ。


話題2 Cametanさんの記事を拝見する
 盛りだくさんだったんでまた明日以降で読み込むとして対数の便利さについての部分だけ

 なるほど!! 計算尺は見たこと無いけど、精度をちょっと犠牲にして大まかに巨大な数を扱うことが出来るようになるという事か。ありがとうございます〜




2022/07/28
話題1 Pythonで学ぶ高校数学だったかの続き

三角関数の話題が出てくる。出たよ・・この頃には既に数学を諦めてましたんで・・やっときゃ良かった!まあ、必要に迫られるまで手をつけないのがプログラマーということらしいので、必要に迫られそうな気がするので手をつけますか





 ラジアン。大昔にBasicの本で見た記憶があるなぁ・・ふうむ・・計算の都合上便利な(事がある?)ので使う進法の違いみたいなものか?

 あ、sinってそういう事か!なるほど・・パッと思いつくのはゲームの当たり判定とかに必要なのかな?



 となると当然X軸についてとなりますわな。


 でtanってのは傾きか・・うーん・・実際に必要になりそうなシチュエーションは・・?うーん・・坂道の移動で加速が必要かどうかの判定とか?応用先を考えたりすると身に付きやすいかもなぁ・・他人事じゃなくなるんで。



続きまして対数とか。ネットで分かりやすそうな「アタリマエ」さんってのを見つけて読ませていただく。フッ・・高校の時「4点」とか言う漫画みたいな点数を取った僕に理解させることが出来るかな?

 次にlogってのがよく出てくるんで対数ってのを検索してみる。対数グラフとかよく聞くけど・・。

 ふーむ・・公式3がややこしいかな。log x log x log であって3 x logじゃないんすね。で?


 ??なんか普通に2^5を展開した32が=って当たり前のような気がするけど?
 log(10)32は10をx乗したら32になるxを求めてるんだよね?Schemeでやってみる?

 お、そういうことみたいだな! でw?




 ほぉ〜・・・って、これコンピューターあったら別にいらなくない?計算をしやすくするだけ?しかも元になる表ありきの話だし


 と、思ってたら最後にオオッ!?って活用法が。計算はコンピューターにやらせて楽できるけど、こういうアルゴリズム的な流れを考えるのがポイントって事か?という訳で今日は数学のお勉強とSchemeの計算で出す方法だけで終わってしまった(夜、宿直先にACアダプタを持っていくのを忘れたので)。

話題2 Cametanさんの記事を拝見 m(_ _)m ありがたや!
 おお・・久々のSICP!SchemeだしPaiza ioで動かしまくれるので、ついに再挑戦する時が来たか!明日読んでみます!

 まあ軽くデータ駆動型について検索してみるか・・と。同じように疑問に思ってる人がいてコードの実例で出ている回答があったのでジロジロ。


 ふーむ・・データの中に実行させるコードをぶっ込んでるって事か・・(多分)。全然抵抗は無いな・・特定の機能も果たす関数っぽいのと一緒に統一した書式でデータにして整理して保存してるんで、呼び出し部分も見通しが良くなるってことかな?と、間違ってても一応推理をしてから読むと良いらしいので・・

 ええっ!?ちょっと体温上がりました(^o^) そ、そうだったのか・・「魔法言語 リリカル☆Lisp」からの壮大な伏線が回収されようとしてる!?
 真面目にやろうっと!



2022/07/27
話題1 SchemeとRacketの違いは色々あるでしょうが・・
 例のLambdaを使ったクラスっぽいアレ、Shemeだとどうなるのかな?とやってみたけど、引数の初期値を与えておくってのが出来なかったっぽい?それやめたら動いたかな、と。

話題2
 Basic Computer Games、リンク先にWEB上のエミュレータ−で遊べる仕組みがありました。そのうちやってみるかな・・



2022/07/26
話題1 CametanさんのLambdaを使ったクラスを理解するコードをRacketで打ち込んで動かしてみる

 まずとりあえずどういう動きをするのか確認。
 おお!messageの引数によってコマンドが変化する。これは・・・無茶苦茶応用が利きそうだな!以前Scheme入門かなにかのところで同じような口座管理のコードがあったけど今回のほうがすごく分かりやすい(気がする)

 改めて本体をチェック。引数の初期値、なるほど。
 そしてcaseとlambda、なるほど〜(・。・; この関数を記録しておけば、テキストベースのゲーム的な動作って解決する予感があるな・・。
 敢えてRacketで・・と書かれてるということはSchemeでは微妙に違うということか・・・明日はひとつSchemeで動かせるようにしてみよう。ありがとうございます!


話題2 例のLambdaでくるんで未評価の式を関数化して実行する話での()

いやいや、当然カッコとコッカの数の帳尻は合ってないとなんない。
ちと紛らわしい書き方だったかな・・・。


 ですよねぇ(^_^;) ちょっと数えれば意味分かるだろ!って感じなんですが・・。普通のときでもLambdaを使った関数の定義って
(define kansuumei (lambda (x y)...
 感じで関数名が丸出しになってるからそのままだと
< kansuumei
 ってやってるのと同じになるということなのかな? まあLambdaでくるんでるときには()って覚えておきます、と。
 


2022/07/21 
話題1 Cametanさんのお手本を元に学習

 今回は特に重要は内容だったので念入りに読ませていただくのでした



 そ、そうだったのか・・とりあえず引数に取ってれば後でいくらでもLoop出来るわwとかテキトーに考えてました




 `を使うんだろうなぁ・・とは思ってたんですがここでLambdaが。Lambda、すごいヤツだなぁ。忘れないようにコメントに打ちましたけど、これを機会にちゃんと理解しておかないといけないな!
 ちょうどQuoraで河合さんの深いコメントも拝見したところだったし・・。そして今が必要な時!かも。



 えっ! ()の数が関数内で合わなくても大丈夫なのか・・Racketだとリアルタイムでエラー表示が出るけどどうなるんだろう・・明日実験してみよう。しかしLambdaはミステリアスだなぁ


話題2 調べ物の途中で寄り道してなんか楽しそうなのを発見する

Quoraで「テスト駆動開発」に関係する記事を発見、読む
→その流れで擬似コードを使ってコードを書いてゆく「疑似コードプログラミングプロセス(Pseudocode Programming Process: PPP)」を知る
 →リンク先のCoding horrorってサイトを見る。適当に記事を漁ってたらCametanさんの記事で見た覚えのある本の画像が出てくる
  →本の内容を現代の各種言語で再現するというプロジェクトを発見

 という流れ。残念ながらLisp系とはOcamlは無し。Rustとかあってグッ!とくる。そのうちに・・・こういうの助かるかなぁ。



2022/07/18 プログラミングの基礎の続き

 Cametanさんのお手本をじっくり読む(じゃないと分からないので(^_^;)
 あ、そうだった・・「分解」だ。「バラす」とも言う。そうだったそうだった、そしてcase先で再度組み立てるんだった・・直接中の数値をいじろうとしてたから破壊的発想しか出てこなかったんだな〜

 もう一つ、beginについても間違ってた。というか、複文というのを間違ってた。beginでくくられた2つの文を並列的にイメージしていたのだった。そうかそうか・・最終的に後の方のkekkaだけが返るから、その前で変更してれば全部の後でloop回す必要が無いんすねぇ!

 Cametanさん情報でmatchの重要性がちょっと分かったのでちゃんと復習。あ、また間違って理解してた。matchの後の条件分岐が見た目微妙にifと似ていたから?引っ張られてたのか・・。分かってみれば・・便利じゃない!

 という訳で「もういいや」と思ってたmergeについてもmatchでちゃんとやろうと・・そしてここから例によって迷走開始と
 大体の形は間違ってないと思うんだけど・・エラー

 これも駄目。と言うかですね、match後のifがそもそも使って良いものかどうかが謎。


 様々な組み合わせでやってみたんだけど駄目でした・・。問題は3点(多ッw)。
 matchの後の分解する対象、Ocamlみたいに一気に複数を取れるのか?
 matchの後ってifは許されるのか、書き方ってOcaml的で良いのか?
 matchの後、再構成する時に束縛したxとかyに混ぜてlstをそのまま使ってたりするように見受けられるけどルールがあるのか・・もしかしてmatchの後のリストに入ってる場合は(上の例では)lst2は(y . ys)になり、それ以外で関数の引数になってるのはlstとするのか? あ、でもそうなると
 (match (lst1 lst2)... としてしまうと、(xs . '()) lst1) もおかしいか・・

 という訳で謎を残して今日はここまでです



  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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