メモ 2025.03

3.1(土)
・『新しいLinuxの教科書』su・sudoの使い分け
・オブジェクトの問題を再チャレンジ

3.2(日)
・『新しいLinuxの教科書』プロセス

3.3(月)
・『新しいLinuxの教科書』プロセス続き
・RGBクラスの実装

3.4(火)
・『新しいLinuxの教科書』ジョブ
・生活リズムをもとに戻すのに苦戦しています。

3.5(水)
・『新しいLinuxの教科書』コマンドの一時停止
・JavaScript ≠ JSON
・for-in ループの使い方に苦戦。キーを取得するため、そのキーを使って値にアクセスする必要があった。
→各個人の情報とその詳細を分けて考える必要があった。
・Promise オブジェクトの全体像
・Promiseオブジェクトが連鎖する理由→非同期処理の順序を保証するため
・thenメソッドに登録されたコールバック関数が実行され、コールバック関数は、Promiseの結果(値)を引数として受け取る。

3.6(木)
・『新しいLinuxの教科書』ジョブの一時停止
・API(Application Programming Interface)
アプリケーションやソフトウェア、ハードウェア間でデータや機能を共有するためのインターフェース。
異なるプログラム同士でデータや機能を共有できるようにするための規約や取り決めで、その規約に従って通信を行なうことで異なるシステム間のコミュニケーションが可能になる。
・正規表現なかなか慣れない。積極的につかっていこう。

3.7(金)
・『新しいLinuxの教科書』フォアグラウンド・バックグラウンド
・非同期処理の細かい流れをようやく理解できた、そしてたくさん誤解していたことにAIと壁打ちして気づいた。
・fetchを呼び出すと、Promiseオブジェクトが即座に返される。
・HTTPリクエストが成功したかどうかは、Promiseが返されるタイミングとは関係ない。
・Promiseの状態が変化すると、対応するコールバック関数が実行される。
→Fulfilled状態の場合:thenのコールバック関数が実行される。
→Rejected状態の場合:catchのコールバック関数が実行される。
・「resolve/rejectが呼ばれること」と「コールバック関数が実行されること」は別
・APIリクエストが成功し、サーバーからレスポンスが返ってくると、fetchのPromiseがFulfilled(解決済み)状態になる。このとき、resolve関数が呼ばれ、レスポンス(Responseオブジェクト)がthenのコールバック関数に渡される。
・fetchのPromiseは、HTTPリクエストが成功したときにResponseオブジェクトをresolveに渡す。
・Responseオブジェクトは、HTTPレスポンスを表すオブジェクトで、以下のようなプロパティやメソッドを持っている。
①ok:レスポンスが成功したかどうか(ステータスコードが200-299の場合にtrue)
②status:ステータスコード(例: 200, 404)
③json():レスポンスボディをJSON形式で解析し、Promiseを返す
・response.json()がPromiseを返す理由は、レスポンスボディの解析が非同期処理であるから。レスポンスボディが大きい場合や、ネットワークの遅延がある場合、解析に時間がかかることがあるため、Promiseを使って非同期に処理を行なう。
→レスポンスボディはストリームなので、非同期で読み取る必要がある

3.8(土)
・『新しいLinuxの教科書』標準入力・標準出力・標準エラー出力
・XSS攻撃は、ユーザーが入力したデータを適切に処理しないサイトに対して行われる。
・クエリ文字列は、サーバーにデータを送信するために使われる。URLの末尾の?
から始まる。
→悪意のあるスクリプトをクエリ文字列に仕込んでおき、ユーザーがそのURLを開いたときにスクリプトを実行させることが、典型的な攻撃手法
・アロー関数の実装で、ループの中でループを使う必要がなかったことがわかった。
問題では、二次元配列が使われており、インデックス0が価格、インデックス1が個数を表している。この二次元配列を使って合計値を求める問題だったが、ループ内にループしていたが、その必要はなかった。
・浮動小数点の取り扱いはあらためて復習が必要。
→NumberオブジェクトのtoFixed()メソッドで解決

3.9(日)
・『新しいLinuxの教科書』リダイレクトによる上書き
・スコープの範囲内かどうかによるズレ

3.10(月)
・『新しいLinuxの教科書』パイプライン
・ファイルに対して読み書きするためのデータの経路を入出力としている。
・コンソール(ソフトウェアが提供する仮想的な環境)は、標準出力の内容を表示するための仮想的なインターフェースで、プログラムからの出力を受け取り、それをユーザーが確認できる形で表示する。具体的には、標準出力を通じて送られてきたデータを、端末画面(ターミナルやブラウザの開発者ツール)に表示する。
・サーバーサイドでの処理
→PHPコードはサーバー上で実行される。
→サーバーはPHPコードを処理し、その結果をHTMLに変換する。
・クライアントへの送信
→サーバーが生成したHTMLがクライアント(ブラウザ)に送信される。
→ブラウザはPHPコードを見ることはなく、純粋なHTMLとして表示する。
・PHPを使うと、ユーザーのリクエストやデータベースの内容に応じて、HTMLを動的に生成できる。
・同一リポジトリ内でのプルリクエスト先を間違えたときの対処法
・[object Promise] の意味:Promise オブジェクトを文字列に変換したときに表示される表現。これは、Promise オブジェクトがまだ解決(resolve)または拒否(reject)されていない状態(Pending)であることを示している。
・then メソッドは、結果が利用可能になった後の処理を指定する。
・JavaScriptのオブジェクトとJSONは似ているが形式も中身も別物。

3.11(火)
・『新しいLinuxの教科書』フィルタ
・Map は Object と似てるが、キーにあらゆるデータ型(オブジェクトも含む)を使える
・CSSセレクタは、HTMLドキュメント内の特定の要素を選択するためのパターン、CSSでスタイルを適用する際や、JavaScriptで querySelector や querySelectorAll を使って要素を取得する際に使用される。
(例)要素セレクタ、属性セレクタ、IDセレクタ、クラスセレクタ など
・イベントの流れ・詳細について
・テンプレートリテラルのベストプラクティスについて知る
①静的なHTMLを挿入する場合
innerHTML を使う。
テンプレートリテラル(``)で複数行のHTMLをシンプルに記述する。
②動的なHTMLを挿入する場合
テンプレートリテラルを変数に格納し、必要に応じて挿入する。
③セキュリティを考慮する場合
innerHTML を避け、textContent や createElement を使う。
・見かけ上、コールバック関数と再帰関数が似ているため、処理の挙動・中身をしっかり確認すること。
・JavaScriptでは、関数が変数に格納されていなくても、関数名を直接コールバックとして渡すことができる。
・変数に格納してから、連結した方が再利用性が高まる。
・value は、入力要素(<input>、<textarea>、<select> など)の現在の値を取得または設定するためのプロパティ。
・ responseがjsonに解析されるということは、data.firstNameやdata.websiteのようなアクセス演算子を使用してプロパティにアクセスできることを意味する。
・JSON形式のデータ(オブジェクト)をJSON.stringifyメソッドで文字列へと変換
・クエリパラメータ:URLの末尾に ? で始まるキーと値のペア

3.12(水)
・『新しいLinuxの教科書』wcコマンド
・自分でHTMLを生成するスクリプトを作成し、実際に.bashrcにパスを保存してみた。実際に作成したことによって、スクリプトファイル・環境設定ファイルの関係性について実感が持てるようになった。
(整理)
・環境変数:システムやプログラムが動作する上で必要な情報を格納する変数。システム全体または特定のユーザーに対して設定できる。子プロセスに引き継がれる。
・環境設定ファイル:環境変数の設定や、プログラムの動作設定を記述したファイル。ターミナル起動時や、プログラム起動時に読み込まれ、環境変数の設定やプログラムの設定が反映される。テキストファイルでユーザーが編集できる。システム全体の設定ファイルとユーザーごとの設定ファイルがある。
・スクリプトファイル:複数のコマンドをまとめて実行するためのファイル。環境変数を参照したり、環境変数を変更したりできる。
○環境設定ファイルに環境変数の設定を記述する
(実際の手順)
① テキストエディタでスクリプトを作成
② スクリプトを~/binディレクトリに保存
※ディレクトリがなかったため、自分でディレクトリを作成
③ ターミナルでスクリプトの実行権限を付与
④ テキストエディタで~/.bashrcファイルを開き、PATHを設定
⑤ source ~/.bashrcコマンドで~/.bashrcファイルの変更を反映させる
⑥ スクリプトを実行し、問題ないことを確認
・export PATH="
・テンプレートリテラル内で関数を呼び出すことができる。変数だけだと思っていた。

3.13(木)
・『新しいLinuxの教科書』sortコマンド・uniqコマンド
・初めてスニペット機能を使ってみた。スニペット機能を使い、BootstrapのCDNリンクをテンプレートとして設定したことで、毎回コピペする手間を省くことができた。
・スニペット:あらかじめ定義したコードの断片(テンプレート) のこと
・wifiの接続切れ修復に約2時間半を費やすことになってしまった。新しい機器を明日購入することにした。
・wifiの接続切断が頻発していることをきっかけに、ネットワーク周りの基礎を一通りさらった。
・画像によるイメージ化が理解にとても役立つと実感。
・Bootstrapによる編集が苦手で、それゆえにDOM操作の部分がスムーズにいかないため、一旦Bootstrapをさらっと復習することにした。
・現代のWebアプリケーションでは、alert の代わりにモーダルウィンドウやトースト通知を使用することが推奨されているということを知った。
・onclick 属性内のJavaScriptコードは、セミコロン (;) で区切られた処理が順番に実行される。セミコロンは、JavaScriptにおいてステートメント(文)の終わりを示す記号。

3.14(金)
・『新しいLinuxの教科書』Uniqコマンド続き
・Wi-fiルーターをTP-Link AX80に変更したら通信の安定性が驚くほど変わり感動した。
・パーセントエンコーディング:URL内で使用できない文字をデータとして安全に送信するための仕組み
・エスケープ処理の基本原理は、Webブラウザにコードとして解釈させたくない文字を、コードとして解釈されない別の文字列に置き換えること
・エスケープ処理を行なう理由がいまいち理解できていなかったが、ついに理解できた。エスケープされた文字列は、HTMLタグとしては解釈されないため、スクリプトを組み込んでも文字列として解釈されるだけになる。
・要素と要素のオブジェクトの違い
要素は、HTML コードにおける要素そのものであり、静的なもの
要素のオブジェクトは、その要素を JavaScript から操作するための動的な表現
だからこそ、DOMによって操作できるのは、要素のオブジェクトになる。
・HTMLオブジェクトのプロパティは、静的な値だけでなく、メソッドのように動的な振る舞いもする
→メソッドのような振る舞いをするものがあるという点は、JavaScript における DOM 操作の重要な特徴らしい。一般的に、プロパティはオブジェクトの静的な属性(値)を表し、メソッドはオブジェクトの動的な振る舞い(機能)を表すが、DOM API においては、この境界が曖昧になることがある。

3.15(土)
・『新しいLinuxの教科書』cut・trコマンド
・JavaScriptのイベント。。。流れがいまいち理解できない。
・ネットワークセキュリティの一部にの基本を学習。暗号化、VPN、ファイアウォール、SSL。

3.16(日)
・『新しいLinuxの教科書』tailコマンド
・パイプを使用している場合、ファイルの内容を直接変更しているのではなく、データの流れを操作している。
・ログは履歴を管理するためのもの:履歴の記録・監査・トラブルシューティング・セキュリティ・パフォーマンス分析などに使用される。
・PHP内にHTMLやJavaScriptのコードを記述する場合とHTML内にPHPのコードを記述する場合の違い、および役割の違い
PHPはHTMLやJavaScriptを生成する役割を担い、HTMLは生成された情報に基づいてブラウザに表示される役割を担っている。
・ブラウザはJavaScriptの文法を考慮せず、scriptタグで囲まれた部分をJavaScript実行エンジンに渡すことを知った。
・関数に引数としてオブジェクトを渡すと、関数はそのオブジェクトへの参照を受け取る。これは、関数の内部でオブジェクトに加えられた変更が、関数の外部にも反映されることを意味する。
→副作用を防ぐには、新たにオブジェクトを作成する

3.17(月)
・『新しいLinuxの教科書』diff コマンド
・.(ドット)がファイル名の先頭にあると、隠しファイルになる。そのため、 ls -a コマンドによって存在を確認する。
・.org:テキストファイルでありながら、構造化された情報(アウトライン構造や表組み、リンクなど)を記述できる
・ファイル拡張子:ファイルの種類を識別するためのもの
・ネットワークの基礎とソケットについて学習。
・if 文の代わりに連想配列をつかったレンダリングの実装
・イベントの理解が少し前進した感覚。

3.18(火)
・『新しいLinuxの教科書』diff コマンド unfied オプション
・set と shopt コマンドの違いをもう一度整理した。
・クラウドの基本・概要を整理。
・そもそもPHPプログラムがどのように動作し、ローカル環境では何がどう動作しているのかがわかった。
・仮想化の仕組みと概要を理解できた。
・JavaScriptエンジンの動きを図解で再度確認。
・JavaScriptエンジンの動作
HTMLの解析
・ブラウザは、HTML文書を解析し、DOM(Document Object Model)ツリーを構築する。
・この際、<script>タグを検出すると、JavaScriptエンジンにスクリプトの実行を指示する。
スクリプトの実行
JavaScriptエンジンは、<script>タグで囲まれたコードをJavaScriptとして解釈し、実行する。
※ただし、<script>タグがエスケープ処理されると、ブラウザはそれを単なる文字列として扱い、DOMツリーにテキストノードとして追加する。JavaScriptエンジンは、DOMツリーを解析する際に、エスケープされた<script>タグを検出しても、それをスクリプトとして認識しない。その結果、エスケープされたスクリプトは実行されない。
だからこそ、エスケープ処理がXSS対策として有効な手段になる。
・JavaScriptエンジン、イベントハンドラ、Web API、イベントキュー、コールスタック、レンダリングエンジンの関係を説明できるようになった。
・明日でイベントは理解できそう。あとはイベントリスナーの挙動とEventTargetオブジェクトのことがわかればもっと進めそう。

3.19(水)
学習したこと
・『新しいLinuxの教科書』grep コマンド・正規表現概要
・『安全なWebアプリケーションの作り方』SQLインジェクションによる情報漏洩の手法
・SQLインジェクションの概要
・SQLについての概要
・SQLクエリの動的生成の流れ
・JavaScript・PHP・Javaのプログラムが実行されるまでの流れ
・ブラウザレンダリングの細かい挙動について
・Bootstrap FontAwesomeを使った練習
・イベントがコールスタックで実行されるまでの流れ
・イベントリスナー・イベントハンドラ
知ったこと
・小規模な場合、テキストファイルをデータベースのように使用することもある。
・SQLクエリはアプリケーションプログラムによって動的に生成され、それを元にデータベースにアクセスしていること。
・クライアントからリクエストする際に、SQLクエリを生成時においてデータベース中身を確認したり操作できるように悪意のあるSQLクエリを作るのが、SQLインジェクションであるということ。
学び
・前回取り組んだアルゴリズムにおいて、エッジケースを考慮していなかったことに気づくことができたこと。
・イベントリスナーの仕組みを理解するためには、ブラウザの仕組み・JavaScriptエンジンの仕組み・イベント・Event Target・スタック・キュー・Web API・オブジェクトの各要素を理解し、それらを組み合わせて初めて理解できるとわかったこと。
・全体像の中で今どの処理を理解しようとしているのかを理解しながら取り組むと、今調べている、やっていることの解像度がものすごく上がったと感じたこと。

3.20(木)
学習したこと
・『新しいLinuxの教科書』正規表現概要
・Vimで置換を使ってファイルの指定箇所をコメントアウト
・『安全なWebアプリケーションの作り方』SQLインジェクションを使った認証回避
・アルゴリズム「文字数のカウント」(リスト)JavaScriptで回答
・CSS Flexboxを使った演習2問(飛行機の表示位置をサンプルに合わせる)
・Bootstrapを使ってプロフィールカードをハンズオンで作成
・電卓の機能をaddEventListenerメソッドを使って実装
知ったこと
・Vimでコメントアウトする方法(置換コマンドをつかった方法)
・HTMLからPHPへ入力値が渡される流れと仕組み($_POST)
・Bootstrapでrowクラスはflexbox
の設定を持っているのに、わざわざrow d-flex
と記述する理由を知った。
→ Bootstrap 5 では、row クラスだけでは Flexbox の機能が十分に有効にならない場合があるため、d-flex クラスを併用することが推奨されている。
・イベントには、①標準イベント と ②カスタムイベント がある。①はブラウザやDOMによって事前に登録されている。②は開発者が独自にイベントを定義できる。
→ 'click'のような文字列を自分でカスタマイズすることができる。
・dispatchEvent() メソッドを呼び出すした後の流れ
→ 指定されたイベントタイプのイベントオブジェクトが作成され、対象の要素に送信される。
→ ブラウザは、このイベントオブジェクトを受け取り、対象の要素に登録されているイベントリスナーを検索する。
→ 該当するイベントタイプのイベントリスナーが見つかれば、そのイベントリスナーが実行される。
学び
・Vimの置換コマンドでは、適切にメタ文字をエスケープしないと意図した動作にはならないこと。
・オブジェクトのプロパティやメソッドにアクセスして操作するという、オブジェクトの基本を抑えたからこそ理解できているということ。オブジェクトの学びが生きていることを実感。
思い
・苦手意識のあるCSSを演習と自作のコードを使って少しずつ克服していきたい。

3.21(金)
学習したこと
・『新しいLinuxの教科書』正規表現概要
・『安全なWebアプリケーションの作り方』SQLインジェクションを使った
・アルゴリズム「文字数のカウント」(リスト)PHPで回答
・CSS Flexboxを使った演習1問(飛行機の表示位置をサンプルに合わせる)~direction:column~
・Bootstrapを使って、プロフィールカードを何も見ず再作成
・ローカルサーバーの立ち上げ
・fetch関数でjsonファイルを読み込む
知ったこと
・paddingプロパティは、パーセント値を使用すると、paddingのサイズを親要素の幅に対する割合となること。算定基準が親要素の幅となる。
・jsonファイルを作成し、共通情報である画像の情報(CDN経由で取得する画像)を同一ディレクトリ内で共有する方法
・jsonファイルをfetchメソッドで読む込むためのローカルサーバーの立ち上げ方
→ Live Server(VS Codeの拡張機能)をインストールした
学び
・初めてjsonファイルを使った実装をしたことで、再利用性を考慮することができた。
・DOMにおいては、ブラウザがオブジェクトをつくる。

3.22(土)
学習したこと
・『新しいLinuxの教科書』拡張正規表現・繰り返し
・『安全なWebアプリケーションの作り方』文字列リテラル・数値リテラル
・アルゴリズム「n以降のカウント」(リスト)JavaScriptで回答
・CSS Flexboxを使った演習1問(飛行機の表示位置をサンプルに合わせる)~2列目の飛行機のみ隙間を空ける~
・Bootstrapを使って、ログインフォームをハンズオンで作成
・querySelectorAllメソッド・innerHTMLプロパティを使い、ボタンで長さ調節可能な長方形の作成
知ったこと
・Bootstrapにおいて、row と col を単独で使用することができる。ただし、container や container-fluid の中で使うことを前提に設計されているため、単独で使用する場合は意図しない挙動になってしまう可能性があること。
・要素.innerHTML
で要素の中身を取得することができる。(例)element.innerHTML
・innerHTML
:HTML要素の開始タグと終了タグの間の内容を表すプロパティ。
→ 書き込みの時に学んだつもりになっていた。このプロパティを使って要素の中身を取得できる点を見落としていた。
学び
・CSSでコンテナ内で飛行機の画像がflexboxを使ってjustify-contentl: space-between;を適用したにもかかわらず変化がなかったのは、widthを親要素と同じにしていなかったからであるとわかったこと。(%
を使い親要素との関係を示す)
・スペルに気をつけること。ロジック自体に問題ないと思っていたところ、単なるスペルミスによる不具合だった。

3.23(日)
学習したこと
・『新しいLinuxの教科書』拡張正規表現・繰り返し
・『安全なWebアプリケーションの作り方』SQLインジェクション対策(プレースホルダによるSQL文組み立て)
・アルゴリズム「n以降のカウント」(リスト)PHPで回答
・CSS 演習1問(navigationバーの作成)
・mouseoverイベントの実装(パスワードの表示・非表示の切り替え/パスワードロック)
知ったこと
・flex-direction: column;
が設定されている親要素内で、子要素にdisplay: flex;
を適用すると、その子要素は横並びになること。
→ display: flex;
が設定された要素が新しいフレックスコンテナを作成し、そのデフォルトのflex-directionがrow(横並び)であるため。
学び
・flexコンテナ内の子要素はデフォルトで横並びになること。この前提が抜けていて思うような表示にできなかった。
・パスワードの表示非表示はJavaScriptによって実装されていることを、演習問題の実装を通じて知ったこと。
・要素の属性を動的に変更するときに、三項演算子を使って属性の値を決めていたこと。

3.24(月)
学習したこと
・『新しいLinuxの教科書』sed コマンド概要・非対話型エディタ
・『安全なWebアプリケーションの作り方』SQLインジェクション対策(静的プレースホルダ)
・アルゴリズム「Cardクラス」(オブジェクトのリスト)JavaScriptで回答
・Zenn記事まとめ
・CSS 演習1問(footerの作成・アイコンの配置)
・スライドショーの実装
・OOPの全体像
知ったこと
・デフォルトでは padding プロパティは指定されていないため、コンテンツ領域と境域領域は隣合わせになる。
・list-styleプロパティで黒い点「・」のようなものを編集できる(CSS)
・JavaScript repeatメソッド:文字列を指定した回数繰り返し
・querySelectorAll メソッドに渡される文字列リテラルに複数あるときは、CSSセレクタとして機能すること。この場合、複数のクラスやIDがスペースで区切られているのは、階層的な要素の選択を意味する。
学び
・エラーメッセージを出力させないために /dev/null
を使用したこと
・classList.add()でクラスを追加するときは、クラス名ごとに""で囲むこと。複数ある場合は、カンマで続けること。
・アニメーションはJavaScript単体で実装するわけではないとわかったこと。CSSでanimation, keyframesなどをつかって原型を作り、それをDOM操作で実装していくことで動的なページができるとわかった。

3.25(火)
学習したこと
・『新しいLinuxの教科書』sed コマンドの基本・d / pコマンド
・『安全なWebアプリケーションの作り方』SQLインジェクション対策(動的プレースホルダ・LIKE述語とワイルドカード文字)
・アルゴリズム「Cardクラス」(オブジェクトのリスト)PHPで回答
・Zenn記事まとめ
・プログラムが動作する仕組み(コンパイル・インタープリタ)
・CSS 演習1問(footerの再作成)
・OOP(クラスの設計)
知ったこと
・Webアプリケーションは自分で書いたコードと、必要なライブラリの組み合わせで構成されていること。
・パッケージ化:クラスを整理/グループ化するための仕組み。
・パッケージ宣言:このクラスの所属グループを明示する役割。
・パッケージ宣言とディレクトリ構造は完全に一致している必要がある。
学び
・ソフトウエア開発では,「車輪の再発明」をしない,つまり,既存のコンポーネントがあれば,それを積極的に利用することがベスト・プラクティス(https://xtech.nikkei.com/it/article/lecture/20070205/260697/?P=2)
・Javaのファイル内に複数のMainファイルを使用するためにパッケージ化で解決したこと。

3.26(水)
学習したこと
・『新しいLinuxの教科書』行の置換 sコマンド
・『安全なWebアプリケーションの作り方』SQLインジェクション対策(プレースホルダを用いた表現)
・アルゴリズム「Bookクラス」(オブジェクトのリスト)JavaScriptで回答
・Zenn記事まとめ
・OOP(クラスの設計)
知ったこと
Linux
・sedのデフォルト動作について、-nオプションを付けない限り、全行が必ず1回出力される仕組みになっていること。
Java
・クラスのフィールド(メンバ変数)は自動的に初期化されること。これにより、コンストラクタで明示的に初期化しなくても初期値が設定される。
・コンストラクタをオーバーロードにより複数作成することができる。これにより、必要な情報だけを渡してオブジェクトを作成することができる。
全般
・src/ ディレクトリはソースコードを格納するための標準的なフォルダ。多くのプログラミングプロジェクトで採用されている構造で、「本番環境のコード」と「テストコード」を明確に分離する役割があるということ。
学び
・src/ ディレクトリの構造をGitHubを見て知り、その構造を真似てJavaの練習用ディレクトリを作成したことでイメージができたこと。具体的にはmainファイルとtestファイルをプロジェクトごとに分け、コンパイル後の.classファイルをbin/ で管理した(Javaはオブジェクト指向の練習に使用中)。

3.27(木)
学習したこと
・『新しいLinuxの教科書』sedでの拡張正規表現・後方参照
・『安全なWebアプリケーションの作り方』SQLインジェクションの保険的対策
・アルゴリズム「Bookクラス」(オブジェクトのリスト)PHPで回答
・Zenn記事まとめ
・OOP(Personクラスの実装)
知ったこと
Linux
・後方参照で後ろから指定した箇所をカスタマイズできること。
PHP
・PHPの文字列リテラル内で$
が変数展開として扱われるのを防ぐため、Book::\$author
のように \
(バックスラッシュ)でエスケープする必要があること。
課題
・クラスパスの理解。明日はこの点を理解した上でコンパイルすることから始める。

3.28(金)
学習したこと
・『新しいLinuxの教科書』sed コマンド(アドレス指定・区切り文字の変更)
・『安全なWebアプリケーションの作り方』プレースホルダが使えない場合の対策
・アルゴリズム「2の倍数の配列」(リスト)JavaScriptで回答
・Zenn記事まとめ
・OOP(オブジェクトのスコープ)
知ったこと
Linux
・Ubuntuターミナルでgnome-screenshotを使ってスクリーンショットを撮る方法(-a:範囲選択・-f:保存先選択)
・区切り文字にスラッシュ以外の文字が使えるということ
Java
・プログラム動作の流れについて
ソースコード→コンパイル→バイトコード生成→JITコンパイル→ネイティブコード生成
・JVMはバイトコードの実行をしていること
・ネイティブコードはCPUが直接実行できること
・コンパイル済みのファイルの削除方法(rm -rf bin/*)
※bin/ はコンパイル済みファイルを管理するためのディレクトリとして使用中
・不要になったコンパイル済みファイルは削除することが推奨されていること
→ ソースコードに修正を加えた場合、再コンパイルが必要
・依存クラスとは、コンパイル済みの.classファイル(バイトコード)のこと。ソースコード内のクラスと勘違いしていた。
・Javaは 「パッケージ名 = ディレクトリ構造」 を厳格に要求していること。 package walletでグループ化すること。package宣言は、ソースコードのグループ化だけでなく、バイトコード(.classファイル)の配置構造にも直接関係していた。また、パッケージ宣言で使用している文字のディレクトリを事前に作成する必要はなく、コンパイルによって自動的に指定したディレクトリに配置される。
・Javaのソースコードファイル名は、原則として内部で定義されている公開クラス名と完全に一致させる必要があること(コーディング規約に基づく)。
・その他、パッケージ名は全て小文字、ディレクトリ名はパッケージ構造を反映し全て小文字が公式の推奨であること。
一般
・Big-O記法は最悪ケースを基準にすることが多いこと。
感想
・最近、少しずつではあるものの、Vimの基本操作が少し早くなった気がする。特に繰り返し記述する行をヤンク&プットすること、指定した箇所で文字を正規表現を使って置換することに慣れ始めたような感覚がある。
・Javaコードの動作の流れから今何をしているのか、なぜコンパイルがうまくいかないのか、エラーを通じて勉強になった。特にクラスパスとパッケージ、コンパイルの順番がわかったことでその後はスムーズだった。
学び
・クラスパスの指定漏れによるコンパイルエラーの解決法を知ったこと。依存クラスがある場合、必ず-cpでパスを指定すること。
・前日理解できていなかった「クラスパスに追加する」の意味を理解してコンパイルできるようになったこと。Javaがクラスファイルを探す場所を指定することを意味する。
・コンパイルは順番も大事であるということ。
課題
・計算量を意識してアルゴリズム問題にあたること
→ 計算量を記述する(AIで自分の計算量の認識が合っているか確かめる)

3.29(土)
学習したこと
・『新しいLinuxの教科書』awk コマンド
・『安全なWebアプリケーションの作り方』CSRF
・アルゴリズム「2の倍数の配列」(リスト)PHPで回答
・Zenn記事まとめ
・OOP(クラス変数・クラスメソッド)
知ったこと
Linux
・awkコマンドのスクリプトは、パターンとアクションの組み合わせであること
Java
・ JVMはエントリーポイントとしてmainメソッドを探す仕組みになっているが、mainメソッドが属するクラスはMainである必要はないこと
HTML
・HTMLファイルにPHPのコードが記述されている意味について
→HTMLは静的なページであるため、動的な機能を追加するためにPHPが記述されている。
※.html ファイルではPHPは動作しないため、HTML内にPHPを書く場合は、ファイル名を index.php のようにする必要がある。
オブジェクト指向
・メンバ変数にstatic
キーワードがある場合は、クラス変数であるということ
※静的インスタンス変数と勘違いしていた。
一般
・サーバーはファイルの拡張子に基づいて、そのファイルをどのように処理するかを決定していること
→サーバーは通常、.php 拡張子のファイルだけ(今回の学習のケース)をPHPとして解釈する。
感想
・Javaプログラムは安全性をある程度担保できる反面、テストコードを実行して確かめるときに、都度コンパイルするのが大変だと感じた。都度手動コンパイル意外にも自動化する方法があるようなので、試していきたい。
学び
・コマンド一つで大事なデータが消えてしまうため、気をつけること
コマンドを誤ってコンパイル済みのファイルを保存するbinディレクトリを削除してしまった。Gitの管理下に置いていたことによって、復元することができた。
・バージョン管理をすることで、万が一のときに過去の状態に戻ることができると実感したこと。

3.30(日)
学習したこと
・『新しいLinuxの教科書』awk コマンド
・『安全なWebアプリケーションの作り方』CSRFとXSSの違い
・アルゴリズム「素数の配列」(リスト)JavaScriptで回答
・Zenn・Qiita記事まとめ
・OOP(カプセル化・抽象化)
知ったこと
Java
・コンパイラの要件として、Javaではパッケージ宣言がファイルの最初の有効行でなければならないこと。
・ パッケージ宣言とインポート文の記述順について、可読性の観点から、
パッケージ → インポート → クラスの順が望ましいこと。
抽象度が高いものから詳細へと並べることがポイントだった。
オブジェクト指向
・privateで宣言されたプロパティ(フィールド)は、同じクラス内のメソッドを通じて変更可能であること。
・privateの目的は「自分のクラスの事情は自分だけで管理する」こと
・privateメソッドへのアクセスできるかどうかは「クラス内に書かれたコードかどうか」だけで決まり、インスタンスの有無は一切関係ないということ
→ インスタンスと関係があるのだと思っていた。
一般
・入力値の検証は忘れてはいけないこと。引数のチェックを関数内で最初に行なうことで被害を最小限に抑えることができる。
感想
・記事にまとめるのに一苦労。何をどの順番で解説するのがわかりやすいのか、組み立てに時間を要した。