見出し画像

YAMLのいじり方(1)

 過去、XMLをいじったことはあるけど、YAMLは初見です。
 Gemini Code Assist(GCA)を先生役として、YAMLの学習を進めたいと考えています。具体的には、繁体字(台湾華語)の単語帳をイメージした基本的なYAMLデータを用意し、その改善を想定したシナリオに沿って、GCAに質問やコード作成の依頼を繰り返すことで、速やかに実践的なノウハウを身につけることを目指しています。
 GCAの回答は「詳しすぎる」ので、以下に貼るのは部分抜粋もしくは、解答内容をあらためて通常のGeminiに投げて要約してもらったものとします。 

学習の教材: 「単語カード」形式のデータ(test.yml )

vocabularies:
  - word: "獨居"
    pinyin: "dú jū"
    japanese: "一人暮らし"
  - word: "長輩"
    pinyin: "zhǎng bèi"
    japanese: "年長者"
  - word: "聚餐"
    pinyin: "jù cān"
    japanese: "会食"
  - word: "圍爐"
    pinyin: "wéi lú"
    japanese: "囲炉裏を囲む"

単語データの取り出し方

質問

・単語カードをめくるイメージでの、データの取り出し方について
・XMLのDOMのelementNode.nextSibling に相当するやり方はあるか?

GCA回答要約

YAMLデータ処理におけるXMLのnextSibling相当操作について

YAMLデータ処理では、XMLのelementNode.nextSiblingに相当する直接的な操作は通常提供されない。これは、YAMLがリストや辞書を基本とするデータ構造であり、「兄弟要素」という概念が形式上存在しないためである。

一方、XMLはツリー構造であり、要素間の親子・兄弟関係を表現するnextSiblingのようなメソッドが存在する。

PythonでYAMLデータを処理する場合、読み込んだデータをリストや辞書として扱い、インデックスやキーでアクセスするのが一般的である。

YAMLで「単語カードをめくる」ような操作を実現するには、以下の2つの方法がある。
インデックス指定:
リストのインデックスを順番に増やしてアクセスすることで、カードをめくるような操作が可能。
インデックスを管理する変数を使用するのが一般的。
リストの走査(反復処理):
forループなどでリストを順番に処理することで、カードをめくるような操作が可能。
全単語を読み込む場合に適している。
これらの方法により、YAMLデータでも「単語カードをめくる」ような順次アクセスを実現できる。

GCA回答要約

自分の方針

「1(インデックス指定)」でやることにする。

覚えた単語にチェックを入れたい

質問

・覚えた単語と覚えていない単語を区別して見分ける方法

GCA回答要約

YAMLデータへ「覚えた」情報付与方法。2つの方法が存在。

方法1:新キー追加

各単語カード(辞書)へ新キー(例:learned)追加。値で「覚えた」か管理。
learned: trueで「覚えた」、falseで「未」。
または、learned: trueで「覚えた」、キー無で「未」も可。

方法2:新リスト分離

「覚えた」単語と「未」単語を別リストへ格納。例:learned_vocabularies、unlearned_vocabularies。覚えたらリスト移動。

どちらの方法が適切か

方法1:単語カード情報一括保持、「覚えた」管理。扱いが単純。表示・操作ロジック変更少。単語カード増加時、見通し良。

方法2:「覚えた」「未」単語を明確区別、リスト整理重視に適。ただし、単語カード操作ロジック二種必要。

提示test.yml構造に方法1が適合。コード実装も単純。方法1を推奨。

GCA回答要約

自分の方針

推奨通り、「方法1(新キー追加)」でやることにする。

日時を記録しておきたい

質問

・いつ覚えたかの記録を残す方法
・(覚えた中で)覚えた日時が古いものから表示する
・sqlite3などDBを使うべきか?YAMLでいけるか?

GCA回答要約

1. 「いつ覚えたか」の記録 (learned_date キーの追加)
learned_dateキーを追加し、覚えた日時を文字列形式(例: "2024-03-15 10:00:00")で記録する。
mark_as_learned関数に日時取得と更新処理を追加(datetime.datetime.now()を使用)。
学習日時を記録することで、学習履歴の管理や効率的な学習が可能になる。

2. 「覚えた単語リスト」のソート表示
YAMLファイルを読み込み、learned: trueの単語を抽出。
learned_dateの古い順に抽出した単語リストをソート(sorted()関数とlambda式を使用)。
ソート結果をループ処理で出力。

3. データベースの選定 (YAML vs. SQLite3)
YAML:

メリット: シンプル、可読性、学習コスト低、小規模データ向き。
デメリット: 大規模データに不向き、複雑な検索・ソートが苦手、同時アクセスに弱い。
SQLite3:
メリット: 大規模データ向き、高速検索、複雑な検索・ソート、同時アクセスに強い。
デメリット: 学習コスト高、設定が必要、小規模データにはオーバースペック。
現時点での結論:
データ量が少ないため、YAMLで十分。
将来的なデータ増加や複雑な機能追加を考慮し、必要に応じてSQLite3を検討する。
複数の箇所を更新する場合、データ整合性に注意してコーディングが必要。

GCA回答要約

自分の方針

推奨通り、SQLite3ではなく、YAMLベースでやることにする。

その後

 単語データを使った学習の流れのシナリオを与え、必要な関数を定義するように要求。さらにはオブジェクト指向を導入してクラスを使ったコードに書き換えるよう指示しました。
 続きは、整理してまた、こちらにメモしたいと思います。


いいなと思ったら応援しよう!