売上が落ちた原因を絞り、1 枚のレポートにする
注文の CSV 1 枚から、売上が落ちている場所を「全体 → 内訳 → 絞り込み」の順に特定します。pandas の集計だけで、結論・根拠・言えないこと・次の一歩を書いた 1 枚のレポートまで作りきります。
コースは順に読んで覚えるためのもの、プロジェクトはひとつのものを 作りきるためのものです。要件だけ渡して放り出すのではなく、手順と回答例、 つまずきやすいところまで置いてあります。
全 18 件
注文の CSV 1 枚から、売上が落ちている場所を「全体 → 内訳 → 絞り込み」の順に特定します。pandas の集計だけで、結論・根拠・言えないこと・次の一歩を書いた 1 枚のレポートまで作りきります。
3 つのプランを並べた料金表を、スマホの 360px から広い画面まで崩れない形で組みます。@media を 1 つも書かずに、中身の都合で折り返させるのが狙いです。
仕様どおりに動いていない関数を、いきなり直さずに「まず落ちるテストを書く」順で直します。境目の選び方と、直したあと何を残すかを身につけます。
型を書けばコンパイル時は守られますが、外から来た値は型注釈だけでは守れません。unknown から狭める型ガードで、想定外の行を数えながら弾く形を作ります。
古い応答が新しい応答を上書きする、連打で注文が二重に飛ぶ、失敗が黙って消える。エラーにならないまま画面だけがずれる不具合を、順番を記録して止めます。
どこが遅いかの勘はたいてい外れます。時間を出してから直し、直したら答えが変わっていないことを確かめます。効かなかった書き換えを 1 つ見つけるところまでやります。
検索欄に文字を入れるだけで全員分のメールアドレスが出る様子と、ファイル名で公開フォルダの外が見える様子を実際に再現し、そのうえで塞ぎます。
ラベル、エラーの伝え方、焦点の行き先。キーボードだけで最後まで送れる形にすると、目が見える人にとっても入力の速いフォームになります。
空白で割って番号で取ると、行の形が少し変わっただけで壊れます。正規表現で「形」から取り、読めなかった行を数えるところまで作ります。
止まっているタスクを動かす処理が E0502 で通りません。clone() や Rc で逃げず、読む段と書く段を分けて通します。Rc<RefCell<T>> が何を実行時に移すかも確かめます。
他の言語なら動いてしまい数が合わなくなるコードが、なぜ Rust では書けないのか。Send が何を言っているかを読み、通る形に直して 3 つの書き方を実測します。
split_at_mut を自分で書きます。安全な Rust では書けない理由を確かめ、unsafe を 6 行に絞り、なぜ安全と言えるかを文書で残すところまで。
async と書いてあっても await の無い処理はループを独り占めします。心拍が飛ぶ様子を見てから、gather と TaskGroup の違い、キャンセルの扱いまで直します。
tracemalloc で山の高さを出し、2 つの方向で減らします。1 件を小さくする(__slots__)のと、同時に持つ数を減らす(ジェネレータ)の。効くのは後者です。
決まりを __init__ の中だけで守っていると、作ったあとは素通りです。記述子で代入のたびに確かめ、計算で出る値は持たずに出すようにします。
Box<dyn Error> だと「失敗した」としか分かりません。起きうる失敗を enum に書き出し、種類を増やしたときコンパイラが呼ぶ側を止める形にします。thiserror と anyhow の境目まで。
画面より先に、どの値をどこに持つかを決めます。金額は Decimal、在庫はデータベースが守る、カートは ID だけ持って価格は毎回引き直す。N+1 はクエリ本数で見張ります。
在庫 1 個に 2 人が同時に来ると、ふつうに書いたコードは 2 人とも通します。PostgreSQL で再現させてから直し、決済の通知が 2 回来ても 1 回しか処理しない形にします。