学習記録 2025.08

今月の目標
① 朝5:15 起床を連続10日を必ず達成する。 (8.1~8.10)
② RecursionCSで取り組んだアルゴリズム問題を解き、そのコードを書いたプロセスをREADMEに残し、Githubに毎日アップする。
③ RecursionCS『バックエンドプロジェクト②』までのプロジェクトを3つクリアし、各取り組みと学びをREADME・Qiitaにまとめる。
④ 『スッキリわかるSQL入門 第2版』を毎日1問でも良いから継続して取り組む
⑤ 『プロになるためのWeb技術入門』を読み、基礎を紙に書いて説明できるようにする

8.1(金)
4:20 目覚め
4:30 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「preorderTraversal」使用言語:PHP
- Zenn記事「8月の目標」作成・投稿
- Pythonプログラム「Markdown to HTML Converter」作成
知ったこと
DBMS
- データベースに保存されたデータを検索する際に、「1件ずつ最初から全部見ていく(フルスキャン)」のは時間がかかってしまうため、検索対象の列に「インデックス(索引)」を付けることで、必要なデータをすぐに見つけられるようにする
- インデックスとは、列のデータ1件1件をキーに、対応する行へのポインタをツリー構造などで管理することで、検索やソートを高速化する仕組み
木構造
public void printInOrder(){
this.inOrderwalk(this);
System.out.println("");
}
- この引数
this
はオブジェクト自信を指している = 現在のインスタンスを根ノードとして処理してね、という意味
コミットメッセージ
- 「何を」「なぜ」「どこを」変えたか、明確にすること
学び
-
実装方針:コードを書く前に頭の中で描いている「手順の設計図」
① どういう構造で解くか(再帰?ループ?スタック?)
② 何をどこで処理するか(引数・戻り値・状態の管理)
③ どんな順番で処理が進むか(どこからどこへ) -
異常系の処理を先に行ない、先に処理を抜けることでエラーの早期発見につながる
-
現場で毎日求められる判断
① このタスク、本当にやる意味あるのか?
② この実装方針、なぜそれを選んだのか?
③ なんで今この進め方をしたのか?

8.2(土)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- アルゴリズム「preorderTraversal」使用言語:PHP
- 『プロになるためのWeb技術入門』
- Zenn記事「SQL SELECT後の加工」作成・投稿
- Qiita記事「Markdown to HTML Converter」作成
- Pythonプログラム「Markdown to HTML Converter」作成:完了
知ったこと
DBMS
- SQLの日付についての安全な書き方
--より安全--
WHERE 日付 >= '2024-03-01' AND 日付 < '2024-04-01'
--意図しない結果の可能性あり--
WHERE 日付 BETWEEN '2024-03-01' AND '2024-03-31'
DATETIME型のような秒まである型の場合、'2024-03-31' という日付は 2024-03-31 00:00:00
と解釈されることもあるので注意が必要
学び
- ORDER BY は OFFSET や LIMIT よりも前に書かないといけない
- 2つのSELECT文をUNIONするときは、SELECT文ごとにWHERE条件を書く必要がある。ただし、UNION全体に対してORDER BYする場合は、最後に追加すればよい
- データ検索だけならハッシュテーブルが最も効率的

8.3(日)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「inorderTraversal」使用言語:JavaScript
- Zenn記事「【ポートフォリオ 03】MarkdownファイルをHTMLに変換するCLIツールを作ってみた」作成・投稿
- Qiita記事「【ポートフォリオ 03】MarkdownファイルをHTMLに変換するCLIツールを作ってみた」作成・投稿
知ったこと
SQL
INSERT INTO テーブル名 (カラム1, カラム2, ...)
VALUES (値1, 値2, ...);
- DBMSは、テーブル内の各行を1つずつ順番に処理していくのが処理の原則
学び
- SQLのINSERT文でテーブル名指定の後の書き方が曖昧になっていたことに気づけた
- 引数として渡す時に直接 [] を作ることで、関数の中でその配列に対する操作が可能になる。空配列を変数に格納し、その変数を引数として渡す、というステップでなくてもOKということ

8.4(月)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「inorderTraversal」使用言語:JavaScript
- Zenn記事「【JavaScript】スタックトレース」作成・投稿
知ったこと
デプロイ
- GitHubとラズパイを「SSH接続」で連携するためには、ラズパイ側にSSH鍵を作成し、GitHubに登録する手順が必要
→ 一度設定すれば、パスワード入力なしで安全にgit cloneやgit pullができるようになる
学び
- HTTPリクエストは、TLSの確立後に送信される。HTTPリクエストを送ってからTLSが始まるわけではない
→ まずTLSハンドシェイクで暗号通信を確立してから、その後にHTTPリクエストが送られる - TLSハンドシェイクの中で「共通鍵作り」が行われる

8.5(火)
4:40 目覚め
4:45 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「postorderTraversal」使用言語:PHP
- Zenn記事「SQL 式と関数」作成・投稿
知ったこと
通信
- SSHはTLSとは全く別のプロトコルで、独自に暗号化された通信経路を確立する仕組みを持っている
- SSHは暗号化通信をTLSなしで実現している
- 鍵交換とは、共通鍵を安全に共有するためのプロセスのこと
学び
- 構造体(struct)は、複数のデータ(プロパティ)や処理(メソッド)を1つのまとまりにする仕組み
「構造体」はクラスのようなもので、「データ+(言語によっては)操作の定義」をまとめた再利用可能な設計図
※使っている言語が何かによって、構造体でどこまでできるかは違う - 再帰呼び出し1回分を省くメリットより、条件分岐のコストの方が高くつく場合がある
- 「深さ」と「高さ」の言葉の意味がごちゃごちゃになったため整理
「木の高さ」と「最大ノードの深さ」は 数値としては一致する - SSHもTLSのように暗号化された通信経路を持つが、TLSとは別物であること

8.6(水)
4:30 目覚め
4:35 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「postorderTraversal」使用言語:PHP
- Zenn記事「SSHの仕組み」作成・投稿
知ったこと
PHP
- PHPの配列(Array)は「連想配列」なので、
① キー(インデックス)が明示的に指定されていればそのキーを使う
② キーが指定されていない(数値添字がない)場合は、PHPが自動で連続した数値キー(0,1,2,...)を割り当てる
※明示的にキーがあるかどうかで挙動が変わる。foreachを使った時に②の場合は順番に数字が付与されているように見えるのはこのため。
学び
- 円・ドルの変換には気をつけよう
- SQLで、厳密に「下限以上・上限未満」の設定をしないと、結果の表示が変わってしまうことがあるとわかった
- UPDATE文で、
カラム名 = CASE ~
という書き方ができるということ -
ssh-keygen
はユーザー認証のための鍵ペア(ユーザー鍵)を生成するためのもので、鍵交換(Diffie-Hellmanなど)に使う一時鍵とは別物

8.7(木)
4:35 目覚め
4:45 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript
- Zenn記事「【セキュリティ】デジタル署名とは何かを理解する」作成・投稿
- Qiita記事「【セキュリティ】デジタル署名とは何かを理解する」作成・投稿
整理
SSHを理解して使いこなせるようになるために、理解に必要な要素を整理
- デジタル署名
- ハッシュ関数・ハッシュ値
- 公開鍵認証方式
- 共通鍵
- 暗号化
学び
- SQLにおけるCOALESCE の利点として以下があることがわかった
① NULL チェックと値の代替が一発でできる
② CASE に比べて可読性が高い
③ ELSE が不要(代替処理を行なう)
もともと、IS NULLをつかって条件分岐していたが、取り組んだ問題の性質上、COALESCEに置き換えることができるとわかった - メイン関数を外部公開のインターフェースとし、内部の処理を別の補助関数に任せるのは設計として良い

8.8(金)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript
- Zenn記事「ラズパイとGitHubをSSH連携する手順」作成・投稿
- Qiita記事「ラズパイとGitHubをSSH連携する手順」作成
知ったこと
PHP
- PHPでCookieを取り消すためには、setcookie関数で値を空文字列("")に設定し、Cookieの有効期限を過去の時間に設定することで実現する
学び
- 「なぜ・どうやって・どう変わったか」
- 新たにオブジェクトを生成しているということは新たにメモリを消費したということ
- 「逆間順走査」という言葉はなく、「逆中順走査」の誤りであることを知った
- 技術記事で概念の理解を整理してアウトプットしていたが、読者さんからのコメントで、他人の説明を鵜呑みにせず、技術の実態に触れた方がいいのでは?という貴重なアドバイスをいただいた。実際のアウトプットをまとめた方がより現実に困っている人の助けになると気づくことができた。
→ 直面した課題・実体験ベースで書いた方がいいのかもしれない

8.9(土)
4:45 目覚め
4:50 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript
- Zenn記事「【ポートフォリオ 03】Raspberry Piにデプロイして動作確認をした結果」投稿
- Qiita記事「【ポートフォリオ 03】Raspberry Piにデプロイして動作確認をした結果」作成・投稿
知ったこと
SQL
- GROUP BY 句を使用しない集計では、検索結果の全件を1つのグループとして扱う
実験
- 作業ブランチでのコミット・プッシュを行ない、そこで終了しても、プルリクエスト承認後にその文の活動履歴は反映されるのかどうか
これまで
作業の途中でも、他のメンバーが使うかもしれないという前提で、作業ブランチにマージしていた
今回
作業ブランチの状態を作業ブランチに正式にマージできる状態になってからマージしても、活動履歴に影響があるかどうかを確認
学び
- 「意図を正確に伝えられる」ようにするためのコミットメッセージ・プルリクエストの添削は今後も継続(実務に必要なレビューコミュニケーションも並行して練習)
- アルゴリズムにおいて、条件を正しく設定できるかが鍵で、その条件設定に課題があるとわかった
- 早期リターンを意識すること(余計な処理をしない)
- "AI-friendly” エンジニアになり、かつドメイン知識を持つこと
- 前提が共有されていないことを前提にする意識

8.10(日)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript
- Zenn記事「【JavaScript】'MODULE_NOT_FOUND' の意味と解決法」投稿
知ったこと
SQL
- GROUP BY 句を使用しない集計では、検索結果の全件を1つのグループとして扱う
学び
- SQLで集計の前にWHERE句で早めに絞り込めるものは絞り込むことで、集計前に処理行数を減らすことができ、パフォーマンスを向上させることができる
- 「なぜ必要だったのか」を具体的に書いたほうがレビュー時にわかりやすい
- 二段階のキーと値のペア構造になっている場合、どのやって値にアクセスするかには注意が必要
# 外側のオブジェクト
キー: "case1", "case2", "case3", …
値: { input: [...], output: [...] } のようなオブジェクト
# 内側のオブジェクト
キー: "input", "output"
値: 配列(例: [0, -10, 5, null, ...])
- JSON形式について簡単に書きながら触れたことで、アクセス方法がわかった

8.11(月)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript
- Zenn記事「【SQL】集計とグループ化 まとめ」投稿
知ったこと
アルゴリズム
- 階層走査(Level Order Traversal)のロジックでは、葉ノードの子である null をキューに追加することが一般的。これにより、木構造の「空白」を表現し、結果を正しく整形することができる。
-
queue.length > 0
とqueue[0] !== undefined
の違いについて。queue.length > 0
の方が意図が明確とされる。
// 目的は同じ「キューが空でないことをチェックする」
// 配列のインデックス0に要素が存在する限り
while(queue[0] !== undefined){ ...
// 配列の要素数が0より大きい限り
while(queue.length > 0){ ...
- 二分木において最深層を特定するには、階層走査のロジックを使うのが最も自然で効率的とされている
階層走査では、木を層ごとに探索していくため、各層のノードをグループとして扱うことができるという性質を利用する。
→ ループでは、階層ごとに処理を行なうように設計する必要がある
JavaScript
- イテラブルと非イテラブル
JavaScriptには、for...ofループで反復処理できる「イテラブル」なデータ型と、そうでない「非イテラブル」なデータ型がある。
- イテラブル
Array(配列)、String(文字列)、Mapなど。これらのデータ型は、Symbol.iteratorという特殊なプロパティを持っており、for...ofループはそれを使って要素を順番に取り出す。 - 非イテラブル
通常のObject。キーと値のペアを保持するオブジェクトは、デフォルトではSymbol.iteratorプロパティを持っていない。そのため、for...ofループはオブジェクトをどう反復処理すればいいか分からず、エラーになります。
- Object.values() メソッドは、オブジェクトの値が配列であるかどうかにかかわらず、その値を配列として返す
- JavaScript が提供するライブラリを使うと、ブラウザに何を、どこで、どのようにデータをレンダリングするかを指示することができる
学び
- 条件を正しくかける必要があると実感。だけど、自力で惜しいところまでできるようにはなってきた。

8.12(火)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「reverseInorderTraversal」使用言語:JavaScript・「maximumDepth」使用言語:PHP
- Zenn記事「【JavaScript】getElementById("") の結果に子ノードもコンソールに表示された理由をまとめてみた」投稿
知ったこと
アルゴリズム
- BFSの最深層のノードの合計値を求めるとき、再帰によって関数を呼び出しキューを更新する方法とループ内で合計値をリセットしながら最後の深さの列の合計値を求める方法があるとわかった
JavaScript
- JavaScript が提供するライブラリを使うと、ブラウザに何を、どこで、どのようにデータをレンダリングするかを指示することができる
- console.log()でオブジェクトや配列を渡すと、参照が渡ることに注意する
- JavaScriptで言う「状態管理」の基本的な考え方は、オブジェクトのプロパティを使って、アプリケーションのデータを保持・変更すること
- ブラウザは
<script>
タグを見つけると、HTMLの解析を一時停止して、JavaScriptコードを読み込んで実行する。このJavaScriptは、getElementById()などを使ってDOMツリーを操作し、内容を動的に変更する。
→ JavaScriptによってDOMツリーの中身が更新された状態でレンダリングツリーが作られる - JavaScriptでDOMを操作する場合、その操作対象となるHTML要素がDOMツリーに存在している必要がある
学び
- $queue[0] は、PHPの配列の最初の要素にアクセスしているだけで、その要素を配列から削除・取り出しはしていない。あくまでその要素を見ているだけ。
→ 配列から取り出すには、デキュー操作などが必要ということ -
return url || "no image";
のように、該当URLがあるときとないときを1行でキレイにまとめて表現できること

8.13(水)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「maximumDepth」使用言語:PHP
- Zenn記事「【JavaScript】参照型と値型の違いをclassListプロパティで体感する」投稿
知ったこと
アルゴリズム
- Null合体演算子 (??)は、その左辺がNULLである場合にのみ、右辺の値を返す
$value = $hashmap[$num] ?? 0;
JavaScript
- 画像のGETリクエストは、src属性が設定された直後に送信される
※これは、HTMLの読み込み状況や、要素が画面に表示されているかどうかに依存しない
学び
- Null合体演算子 (??) は意識して使っていかないと忘れてしまうと実感した
- 木構造における辺の数を求めるロジックの筋道がすぐには見えなかった。時間の関係上明日に持ち越し

8.14(木)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「maximumDepth」使用言語:PHP
- Zenn記事「【初心者向け】console.log()とは」投稿
知ったこと
SQL
- サブクエリで返す列と更新対象列の順序・数が一致していれば、VALUES は不要
学び
- SQLで合計を求める時はわざわざ条件に「出金額 > 0」とつける必要はない
→ 冗長な処理になる - 昨日の応用で、列名を固定値で新たに作ることができる

8.15(金)
4:45 目覚め
4:50 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「maximumDepth」使用言語:PHP
- Zenn記事「【SQL】SELECT文のFROM句に副問い合わせを記述すると」投稿
知ったこと
SQL
- データの重複をなくし、効率的な管理を目指す正規化の原則を理解すること。パフォーマンスを重視する場面では、あえてデータを重複させる非正規化も検討する。両者のバランスを考えられるようになることが大切ということ。
- UNIONは検索結果に対して結合、JOINはテーブルそのものを結合
JavaScript
- 連想配列は、「特定のキーに対応する値を高速に取得したい」という場面で、if-else if文よりもはるかに効率的で、読みやすく、保守しやすいコードになる
※if-else if文の場合、入力値とそれぞれの条件を順次比較していくため、条件の数が多いほど処理コストが増える
※連想配列の場合、キーを使って、対応する値を直接取得するため、その分処理が速い - 子要素を先に作成してから親要素に追加する方が、より多くの開発者にとって読みやすく、メンテナンスしやすいと考えられていること
CSS
- Flexboxのプロパティは、それらが設定された要素(Flexコンテナ)の直下の子要素(Flexアイテム)にのみ影響を与える。孫要素には影響しない。
学び
- 常にトレードオフの意識を持つこと
→ その構造を採用するときには、何と比較して、どんなメリット・デメリットがあることを確認した上で採用したのかを長期的に鍛えていく必要があるとわかった - テーブル設計力を鍛えるには、データの構造化と整合性を常に意識すること
- 単にデータを格納するだけでなく、そのデータを使って何を実現したいのかを考えること
→ どのテーブルにどういう情報として格納すれば、後で分析しやすいかを常に自問自答することが重要 - 再帰処理と参照の関係が混在していることが理解できない原因だとわかった
→ 再帰は終わっても参照は維持している - CSSに弱点を感じるため、練習が必要

8.16(土)
4:35 目覚め
4:45 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「maximumDepth」使用言語:PHP
- Zenn記事「【初心者向け】後置インクリメントのタイミングを誤解していた話」投稿
知ったこと
オブジェクト指向
- 状態:オブジェクトが持つデータ
- プリミティブ型は、固定サイズ
- プリミティブ型は参照ではなく値のコピーで渡されるため、関数にプリミティブ型を引数として渡すと、値のコピーが使用されるため、もとのデータに影響はない。
※引数にオブジェクトを渡す場合は、関数内の変更が関数外部に影響を与えることになる - 関数の処理によって元のオブジェクトに影響を与えたくない場合はコピーを作成する
学び
- オブジェクトは参照型であることを忘れないこと
- データは可変性?不変性?を常に意識すること
- CSSは苦手かもしれないということ

8.17(日)
4:25 目覚め
4:30 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「maximumDepth」使用言語:PHP
- Zenn記事「【JavaScript】DOMTokenListについて初心者メモ」投稿
知ったこと
SQL
- 結合とは、テーブルを丸ごと繋ぐことではなく、結合条件が満たされた行を1つ1つ繋ぐこと
学び
- 結合は、テーブルをそのまま繋げることだと勘違いしていた
- アルゴリズムにおいて、最初から最後まですべて同じ値かどうかを調べるために、最初と最後だけ比較する方法もあるということ

8.18(月)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「countNodes」使用言語:JavaScript
- Zenn記事「【SQL】複数テーブルの結合 まとめ」投稿
知ったこと
VS Code
-
Control + バッククォート
: ターミナルの開け閉め
学び
- レビューの書き方がとても勉強になった記事
https://qiita.com/K3n_to_n17/items/f4653c09723c5db44ffb
実際の現場ではこういう書き方をする方がいて、それはどう改善できるかがとてもわかりやすかったです - 「休む勇気」も大事ということを知った。先に進めていく気持ちが強すぎるらしい。長期的には、効果的に休憩を取らないと定着しなくて、かえって生産性が下がるとのこと
- 「なぜそうなるか」を自分の言葉で説明できる状態にすること
- HTMLとCSSを記述する際に「構造→装飾」を意識して取り組むこと
- 最初に大枠を捉え、全体像を意識しながら、細部をコーディングしていこう。これまでは、いきなり、上からコーディングしようとすることが多いことが、途中で記述に詰まってしまう原因だと感じたため
- 「これ、他の方が読んでも1回で理解できるかな?」という視点を持つこと

8.19(火)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「countNodes」使用言語:JavaScript
- Zenn記事「【初心者向け】クラスと連想配列で迷いながら学んだJavaScript」投稿
知ったこと
HTML
- HTMLの解析中に
<script>
タグを見つけると、ブラウザのHTMLパーサーは一時停止する。この一時停止中に、JavaScriptエンジンがJavaScriptコードを解析し、実行する。この実行によってDOM操作が行われ、DOMツリーが書き換えられる。
JavaScript
- クラスの中に連想配列を定義して、インスタンスごとに持たせることができる
- innerHTMLは、特定のHTML要素の内部にあるHTMLコードを、文字列として取得または設定するためのプロパティ
→ テンプレートリテラルを使って記述した場合は、それは文字列であるため、innerHTMLを使うことになる - テンプレートリテラルを使用した場合の可読性を考慮した記述方法
- オブジェクトリテラルの書き方において、コロンの後にスペースを入れるのが一般的で可読性が高い。コロンの前にはスペースは入れない方がいい
学び
- 開発者はプロパティは基本的にインスタンスごとに持たせる、という考え方に基づいてコードを書く傾向があるということ
- これまでクラスの中にはプロパティ・コンストラクタ関数・メソッドしか記述しか書いたことがなかったため、クラス内に連想配列を定義できるということが新たな表現の選択肢となった

8.20(水)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「countNodes」使用言語:JavaScript
- Zenn記事「【初心者向け】ESモジュールはサーバー経由でアクセスする」投稿
- 「Emotion Onomatopoeia Dictionary」Bootstrapで全体像の作成
知ったこと
一般
- 短絡評価(short-circuit evaluation): 左側の条件が false の場合、右側は評価しないというルール
- 性能よりも読みやすさ・保守性の方が優先される
SQL
- 同じ名前の列を選択する場合、それぞれに異なるエイリアスを付けることで、結果セットの列名を分かりやすくできる。また、エイリアスがない場合、データベースによってはエラーになる。
- JOINの挙動
(1) 左のテーブルの行を1つ取る
(2) 右のテーブルのすべての行と、ON 句で比較
(3) 条件に合えば「行を組み合わせて」仮想テーブルにする
この「比較に使う列」がキー - JOIN条件に使う列のことを「キー」という
※主キーや外部キーであることが多いが、必須ではない - JOINの仕組みは「左の行 × 右の行の組み合わせ」+「キー比較」→ 一致すれば結合
HTML
- a タグの href に # から始まる文字列を指定すると、ページ内リンク(アンカーリンク)として機能する
JavaScript
- 配列 ([]) や文字列 ("") はイテラブルだが、通常のオブジェクト ({}) はイテラブルではない
→for...of
はイテラブル専用のループなので、オブジェクトには使えない - 配列を返すために使用できるmap
// 改善前
getOnomatopoeiaWords(){
let onomatopoeiaWordsList = [];
for(let i = 0; i < this.onomatopoeia.length; i++){
currentOnomatopoeia = this.onomatopoeia[i];
onomatopoeiaWordsList.push(new Word(currentOnomatopoeia, dictionary[currentOnomatopoeia], pictureDictionary[currentOnomatopoeia]));
}
return onomatopoeiaWordsList;
}
// 改善後
getOnomatopoeiaWords() {
return this.onomatopoeia.map(word =>
new Word(word, dictionary[word], pictureDictionary[word])
);
}
学び
- SQLを使って、自己結合と内部結合を使った問題より、「なぜこう書くのか?」という疑問は、SQLを書くときに「最終的な目的を明確にすること」と、「テーブル同士の関係を頭の中で整理すること」で解消できるということがわかった。ただし、まだまだ鍛錬は必要ということも事実。
- 考えられるケースは何通りあるかをある程度検証してからコーディングすること
- 処理の粒度がを小さくするように努めること
- 「何をする関数か」が一目でわかるようにすること

8.21(木)
4:50 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「countNodes」使用言語:JavaScript・「allElementsSorted」使用言語:PHP
- Zenn記事「【JavaScript】ESモジュールについて初心者メモ」投稿
- 「Emotion Onomatopoeia Dictionary」JavaScriptで書き換え
学び
- 意図が分かりやすいコードを常に心がけること
- プルリクエストのコメントで、テストケースの説明が簡略化すぎるので、どういう観点でテストしたかを書くといいと学んだ
- ローカルサーバを立てているにもかかわらず、JavaScriptで書いたコードがブラウザに表示できなかったのは、import したファイルのファイル拡張子がなかったことが原因だとわかった。いくら調べても思うような結果になりそうな記事がなく、スペルチェックをしていたことで発見できた。
- エラーを自力で発見できたのはナイスだった。この調子で、スピードを上げていきたい。

8.22(金)
4:25 目覚め
4:40 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- Zenn記事「【SQL】トランザクションについてわかったことを簡単にまとめてみた」投稿
- 「Emotion Onomatopoeia Dictionary」を行ったことのある国のおすすめスポット集にカスタマイズ
知ったこと
SQL
- ロックについて、共有ロック・占有ロック・デッドロックなど
VS Code
- macOS:
Shift + Option + F
でインデントを自動的に調整
JavaScript
- HTMLの動的な生成には、テンプレートリテラルを使って全体を一度に組み立てる方法がより一般的で、可読性も高くなる
学び
- トランザクションの制御について、一回では理解し切れる量ではないため、分割して理解していく
- 再帰ケースから考えて、ベースケースを考えるという手順。これまでベースケースから考えていた
- 少しだけ問題を分解する力がついたかも?と思う瞬間があった。昔は初めて出会った問題に対して、どーしよ?と闇雲に調べていたが、今は何がわかれば解決できそうか、を考えてから動けるようになったのは小さな進歩かもしれないと感じた。
- 属性の識別が容易になるように、HTMLの属性が長くなるときは改行すること
- テンプレートリテラルとループを同共存させるかの方法を知り勉強になった
- ふりかえり投稿したときに目標宣言の投稿を忘れていたことに気づいた。気をつけよ

8.23(土)
4:55 目覚め
5:05 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- Zenn記事「【Git】初心者向け ローカルリポジトリ作成後にリモートリポジトリを紐づける方法」投稿
- 「Emotion Onomatopoeia Dictionary」を行ったことのある国のおすすめスポット集にカスタマイズ
知ったこと
JavaScript
- HTMLの動的な生成には、テンプレートリテラルを使って全体を一度に組み立てる方法がより一般的で、可読性も高くなる
- JavaScriptのDOM操作において、なるべく完成形に近いHTML文字列を組み立ててから、一度だけDOMに挿入するというアプローチは、非常に重要で一般的な手法。パフォーマンスを向上させるためのベストプラクティス
学び
- 開発に夢中で、この学習ログへの入力が疎かになってしまった気がする

8.24(日) 鶴岡市で息抜き
4:10 目覚め
4:25 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- Zenn記事「【JavaScript】CommonJSについて初心者メモ」投稿
- 行ったことのある国のおすすめスポット集の作成
学び
- 全体の流れを考えてから手を動かすことが習慣になってきたように感じた。この調子で進めていこう
- ただし、考えすぎて進まないという状況にならないよう、ある程度時間制限を設けて取り組もう

8.25(月) 鶴岡・米沢市で息抜き
4:25 目覚め
4:35 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- 行ったことのある国のおすすめスポット集の作成
学び
- どんなに疲れていても進めることをやめなかった

8.26(火)
4:55 目覚め
5:00 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』デッドロック
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- 行ったことのある国のおすすめスポット集作成
知ったこと
Git
- ブランチ名が長くなることよりも、その可読性(一目で何のためのブランチか分かること)の方がはるかに重要ということ
- もしプロジェクト名を省略すると、どのプロジェクトのブランチなのかが不明瞭になり、誤って違うブランチを操作してしまうリスクが高まってしまう。ブランチ名にプロジェクト名を含めることで、このような混乱を防ぎ、長期的に見ると開発をスムーズに進めることができる。
commit
- プレフィックスが fix とつける場合は、バグの修正の時につける方が好ましい
学び
- Gitのブランチ運用戦略が重要であることを体感した。途中から、こうしておけばよかったと思うところがあったため、次回からは、最初に運用戦略を考えてから小さく形にしていくことを実践していきたい。
- プロジェクト間でブランチ名が重複することを防ぐ目的で、プロジェクト名をブランチ名に含めるのは賢明な判断になるということ

8.27(水)
4:25 目覚め
4:35 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』デッドロック
- 『プロになるためのWeb技術入門』
- アルゴリズム「allElementsSorted」使用言語:PHP
- Zenn記事「【Git】VS Codeでサブフォルダを開くとGitブランチが表示されなくなる理由と、その確認方法」作成・投稿
- 行ったことのある国のおすすめスポット集作成
- Qiita記事「【ポートフォリオ 04】JavaScriptで海外旅行スポットサイト風ページを作成 ~DOM操作とクラス設計を実践」作成・投稿
知ったこと
Git
- VS Codeにブランチ名が表示されないのは、Gitはルートディレクトリにのみ .git フォルダを持っており、この .git があるルートディレクトリでのみブランチ名を表示する仕様になっているため
DBMS
- トランザクション分離レベルを指定することで、DBMSはデータの安全性(整合性)をどのくらい確保し、パフォーマンスをどのくらい犠牲にするかのバランスを取るための判断基準を持つようになる
- トランザクション分離レベルは、複数のトランザクションが同時に実行される際に、お互いの処理結果がどの程度見えてしまうか(分離度)を定義するもの
学び
- 全てにおいてこれが正しい、というものはなく、最適解はどれかを選択する必要があるとわかった
- そのためには、トレードオフの意識・観点を今から持つ必要があるとわかった
- トレードオフの観点を養うために、なぜその選択をしたか言語化することを習慣づけていこう。コーディング中や設計後には、「なぜこの方法を選んだのか」「この選択のメリットとデメリットは何か」を自分で説明してみるようにする
- 開発におけるすべての選択は、何を得て、何を失うかのバランスを取る行為
- 目的を明確化することが、トレードオフの選択を的確に補助する。目的を明確にすることで、迷ったときの判断軸が定まるということかなと。

8.28(木)
4:30 目覚め
4:40 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「minDepth」使用言語:JavaScript ※時間内に仮説の方向性が見えず
- Zenn記事「【ポートフォリオ 04】JavaScriptで海外旅行スポットサイト風ページを作成 ~DOM操作とクラス設計を実践」投稿
- 『バックエンドプロジェクト②』パイプまで学習
知ったこと
DBMS
- デッドロック解消のためにDBMSが強制的に失敗(ロールバック)させたトランザクションは、明示的に再実行の指示を出さない限り、自動的に処理が再開することはない
→ デッドロックの可能性を考慮して、アプリケーションにはリトライ処理(再実行のロジック)を実装することが推奨される
Linux
- ログは システムやアプリケーションで発生したイベントの記録。「誰が」「いつ」「何を」「どのようにしたか」を、時系列で残す足跡。
- Zombieプロセスが溜まるとサーバリソースを圧迫するので注意
オブジェクト指向
- コードを読む際に「このクラスはどんな役割を持っているか?」「他のクラスとどんな関係にあるか?」という視点を持つことで、単なる構文の理解を超え、その設計意図を読み解く力が養われるらしい
Java
- Collections (複数形): ユーティリティクラス「道具箱」
- Collection (単数形): ListやSetなどのすべてのコレクションが実装する最上位のインターフェース
- Collectionsクラスは、Collectionインターフェースを実装するオブジェクト(例:ArrayList)に対して操作を行なうための「道具箱」のような存在
学び
- 「リクエストがどのように処理され、データがどう流れ、どのようなプロセスを経てレスポンスが返されるか」を常に意識すること
- ものごとの仕組みを理解する楽しさと、それを使ってお手伝いすることがこの上なく面白いと感じている
- BST は検索、挿入、削除の操作を効率よく行なうことができる反面、効率性はそのツリーの形状に大きく依存している
- 新しいオブジェクトに触れる際には、なぜその構造にしているのかを考えながら読むようにしていこう
→ 各クラスの役割や目的が見えるようにしていく
役割: そのクラスが何をするためのものか
責任: その役割を果たすために、具体的にどんな処理や情報を持つべきか

8.29(金)
4:25 目覚め
4:30 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「minDepth」使用言語:JavaScript
- Zenn記事「【ポートフォリオ 04 検証】ラズパイから動的HTMLを取得して動作検証するまで」投稿
- 『バックエンドプロジェクト②』ソケットまで学習
知ったこと
OS
- 各プロセスは独立したユーザー空間を持ち、カーネル空間はすべてのプロセスで共有されている
- 共有することで、OSのコードは物理メモリに1つだけ存在すればよくなり、メモリを節約できる
- カーネルにシステムコールを通じてファイルをOSが開くと、そのファイルにプロセスが間接的にアクセスできるようにファイルディスクリプタ(FD)をプロセスに渡す
Git
- ハッシュ値が重要なのは、Git がコミットに名前をつけ、その間の変更を追跡するためにハッシュ値を使うから
- ハッシュを使うことで、Git はプロジェクトの異なるバージョン間を効率的に行き来し、時間の経過とともに変更点を追跡することができる
オブジェクト指向
- コードを読む際に「このクラスはどんな役割を持っているか?」「他のクラスとどんな関係にあるか?」という視点を持つことで、単なる構文の理解を超え、その設計意図を読み解く力が養われるらしい
学び
- 「このコードはなぜCPUを食うのか?」→ アルゴリズムや計算量の観点で判断できる

8.30(土)
4:05 目覚め
4:20 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「minDepth」使用言語:JavaScript
- Zenn記事「【Git入門】git config と git push の仕組みをわかりやすく解説」投稿
- 『バックエンドプロジェクト②』local chat messenger (1) まで学習
知ったこと
OS
- バックエンドエンジニアは、OSが提供するシステムコールやファイルシステム、プロセス管理、ネットワークスタックといったインターフェースや機能について深く理解する必要がある
- CPU、メモリ、ディスクI/O、ネットワークといったサーバーのリソースがどのように管理されているかを理解することで、パフォーマンスの高いアプリケーションを開発できる
- ファイルシステムの構造やアクセス権限、パーミッション、各種コマンドを理解することは、データの永続化やセキュリティを確保する上で不可欠
- OSがどのようにネットワークパケットを処理し、ソケット通信を行なうかを理解することで、ネットワーク関連のトラブルを解決し、通信効率を高めることができる
PHP
- PHPが元々Webページの生成に特化した言語として発展し、リクエストが完了するとプロセスを終了させるステートレスな設計思想に基づいている
学び
- LinuxカーネルやOSカーネル一般の深い理解そのものではなく、OSカーネルが提供する機能をどう利用するか、またその仕組みを理解することが重要
- サーバーのリソースを効率的に利用するために何をどう活用するかにすぎない
- Linuxの理解の重要性は、カーネルそのものの理解ではなく、カーネルが提供する様々な機能をアプリケーションがどのように利用し、その機能がどのように動作するかの全体像を把握することにある
- これまでプロセスは内部に仮想メモリを持っていると勘違いしていた。プロセス内部では仮想アドレスがあるのであって、仮想メモリはプロセス外部でOSカーネルが他のプロセスの分も含めて一括管理していることがわかった

8.31(日)
4:40 目覚め
4:55 起床
学習したこと
- 『スッキリわかるSQL入門 第2版』
- 『プロになるためのWeb技術入門』
- アルゴリズム「minDepth」使用言語:JavaScript
- Zenn記事「2025.08 行動目標のふりかえり」投稿
- 『バックエンドプロジェクト②』名前付きパイプについて
知ったこと
一般
- コンピュータは、ディスク上からデータをメモリ上に読み込んで処理し、処理結果を再びディスク上に書き込む、という動作を繰り返す(メモリとストレージの行き来)
- フォワードでは、ユーザー側のブラウザのURLは変わらない
- リダイレクトでは、ユーザー側のブラウザのURLは変わる
学び
- 相手に求められる前に必要な情報を自分から提供する
- 名前付きパイプは同一マシン上で異なるプロセス間でデータを送受信できるようにするための仕組み(仮想ファイル)

今月のふりかえり
以下の記事にまとめました。
よろしければご参照ください。