kei615ykhm’s programming learning blog

プログラミングを0から学んでいる学生の備忘録

【振り返り】学習の方向性を修正した話

やらかしました!!!!

Web開発者を目指し、1年ほどで現場で働けるようになるような知識と技量を身に着けるために始めたカリキュラムの1か月目

テーマ「Webの仕組みを知る」を学び始めて約2週間経過…

ふと、行動を振り返るとテーマから、かなり逸脱した学習をしていることに気づきました。

気づいたきっかけは、技術的な用語を掘り下げすぎていたことに気づいたからです。

用語を深く深く掘り下げていく中で、

・自分が何の用語を掘り下げていたのか
・掘り下げて得たこの情報は知りたかったことだったのか
・そもそもこれを知ったあと、次は何を学ぶべきなのか

といった具合に、着地点を完全に見失っていました。

いわゆる「分からないことが分からない」というやつです。

原因は「ChatGPTに頼り過ぎた」ことでした。
AIはどこまでも深く深く掘り下げる手助けをしてくれますが、
当たり前ですがこちらの問いに対する答えを返してくれるだけで、

情報の前後関係と背景」までは教えてくれません。

自分が得た情報の根拠や裏付けを怠っていたわけです。
進んだ結果がコレです。(トホホ

つまり、情報と情報の関連性、ひいてはそもそもの全体像が見えていないことが今回の躓きに繋がったということでした・・・。

ここで気づいてよかった・・・。

1か月目のテーマを完遂させる予定日まではあと2週間もありません。
正直間に合う気がしません!!

でも、この気づきはすごく大事なことだったと思います。
頑張っていきましょう・・・。

----------------------------------

【余談】

自分の行動を定期的に見直してみるという考え方ができたのはこちらの記事を一番最初に読んでいたからでした。

note.com

 

私は記事内でいうところの

④行動先行型寄りの、②思考行動併用型タイプらしいです。
なので、「直線的に頑張ってみる人」という部分を真似しています。

まぁ、一番最速で理想なのは、

行動量が伴い思考も出来る人

なんですけどね。

【学びの記録】Projectに適したSQLを選ぶ時の基本的な考え方 - ORM前提思考

 

ORM(O/Rマッピングで、”生クエリを書かずに各言語からデータベース操作する”ということを前提として考えた時に大事になってくる視点は、

 

「Projectに適したSQLをどのように選ぶか」というテーマで学んだことを書いていきます。

なお、各SQLがどのような特徴なのかは調べればすぐにわかることなので、この記事では「Projectの要件や目的に合ったものを選ぶ際の基礎知識」という視点で進めます。

 

 

視点①:パフォーマンス

データ量、トランザクション処理の能力、処理速度、キャッシュのメカニズム等、全体のバランスを考えて検討する必要がある。

一例として、データの種類(関係データか、非関係データか)を挙げてみる。

 

関係データベース(RDBMS

構造化データ:予め定義されたスキーマに基づいて構造化されたデータを扱い、整合性と正確性が保証され、複雑なクエリや結合操作に適している。

 

トランザクションの整合性:ACID(原子性、一貫性、隔離性、持続性)特徴を強くサポートしていて、金融システムや予約システムのような厳密なデータの整合性を求められる場合に適している。

 

ただし、垂直スケーリング(サーバーの性能向上)には適しているが、水平スケーリング(サーバー数を増やすこと)には技術的に課題が残る。

 

非関係データベース(NoSQL)

非構造化:柔軟なスキーマを持ち、JSON、キーバリュー、グラフなど様々な形式をサポートし、データの多様性や変化に柔軟に対応できるため、Webアプリケーションや大きなデータの処理に適している。

 

スケーラビリティ:水平スケーリング(サーバー数を増やすこと)を前提に設計されていて、データ量が増えても効率的に処理が出来る。

また分散システムに最適化されていて、高い可用性とフォールトトレランスを実現する。

*フォールトトレランス=異常が発生しても予備に切り替えて正常化を図ること

 

一貫性のトレードオフ:分散システムは一貫性、可用性、分割耐性のうち2つしか同時に保証できないとされる(CAP定理)。

そのため、NoSQLでは一貫性を犠牲にして、可用性と分割耐性を優先されやすい(BASE特性)。

 

視点②:技術スタックとの互換性

Projectで使用している言語やフレームワークとの互換性があるかどうかを確認する。

この記事ではTypeScriptとLaravelの例で説明する。

 

例:TypeScript(Prisma ORM)

多くのSQLデータべースをサポートし、特にPostgreSQLMySQLSQLiteなどと相性が良い。スキーマ駆動のアプローチを採用し、Prismaスキーマ言語を通じてデータモデルを定義する。このツールは。型安全なデータベースアクセスを提供し、効率的なクエリ生成と実行が出来る。

 

他、TypeORM,Sequelize,Knes.js,Drizzle等

 

例:Laravel(Eloquent ORM)

フレームワーク機能の中核を担うEloquentは、統合が簡単なMySQL、固有の機能をサポートしているPostgreSQLSQLiteSQLserverとの連携が整っている。

理由は、統合のしやすさ、直観性、コードの一貫性と可読性、データベース間の移行の容易さなど、様々な観点から見て非常に相性が良いため。

*これらORMの深堀りは別記事にて

 

視点③:セキュリティ機能

SQLデータベースの特有機能や特徴を抑える。

例えばPostgreSQLは、アクセス制限や通信データの強制暗号化、操作の詳細な記録と監査に対応しているなど、データ保護とセキュリティ監査に強い特徴がある。

*個人情報漏洩は信用問題に関わる。絶対に起こしてはいけない。

 

視点④:コスト/スケーラビリティ

結論から言うと、「イニシャルコスト/ランニングコスト」と「将来的な拡張を考慮する」のはWeb開発におけるデータベースサーバー選びで最もネックな課題になる。

 

例えば、商用はライセンスが高く、オープンソースエンタープライズサポートが必要な場合は費用が掛かる。

物理ストレージか、AWSのような従量課金制のクラウドか、

管理する側の人件費などのスケーリングする場合を考慮した上での判断が求められる。

 

まとめ

データベース設計は、

「アプリケーションがどれくらいのデータ量になるか」

「容量が増えた場合はどう移行するか」

等をしっかりと見積もった上で、

「日々の運用コストはどれくらいかかるか」

「将来的に拡張する場合はどれくらいの費用が掛かるか」

などの”お金に関わる問題”がかなりネックな部分になる。

 

実務未経験の学習では、AWSやSupabaseの無料枠を使えばいいと軽視されがちだが

実際の開発と運用においては年単位で相当額が消費されることもザラにあるという。

 

甘く見てはいけなかった。

【学びの記録】Linuxディストリビューション

Linuxの基礎知識すらないままUbuntuを使っていた

Keiです。

 

改めてUbuntuを含めて、Linuxディストリビューションの基礎知識を学んでいきます。

 

Linuxディストリビューションとは

Linuxカーネルを基盤として様々なソフトウェアを組み合わせたオペレーティングシステムのことで、種類によって用途、ユーザー層、設計哲学が異なっている。

それらは特有ソフトウェアパッケージの選択、管理システム、ユーザーインターフェース、アップデートの仕組みによって区別される。

パッケージ管理システム

ディストリビューションには、それぞれ独自のパッケージ管理システムがあり、アプリケーションのインストール、更新、削除を行える。

例えば、Debian系は’apt’、Red Hat系では’yum’や’dnf’、Arch Linuxでは’pacman’を使用する。

 

主な構成要素

Linuxカーネル:システムの核心部で、ソフトウェアとハードウェア間の通信を担当。

 

システムライブラリ:ソフトウェアがシステムのリソースを効率的に使用できるようにしたプログラムコード

 

ユーザーインターフェースグラフィカルユーザーインターフェースGUI)とコマンドラインInterface(CLI)の二種類がある。

 

アプリケーションソフトウェア:ユーザーがタスクを実行するためのプログラム群

 

選び方のポイント

用途から選ぶ:デスクトップ使用orサーバー運用or開発、など

 

サポート体制から選ぶ:コミュニティサポートや商業サポートの有無

 

パッケージ管理システムの使い勝手:apt yum pacmanなど

 

Ubuntuの主な特徴(興味があるため)

GUIで操作可能:インストールプロセスが簡単で操作が直感的

 

無料:デスクトップ版、サーバー版どちらも無償ダウンロードが可能

 

定期的なリリース:6か月ごとに新しいバージョンをリリースする。

2年に1回のLTS版(長期サポートバージョン)は5年間のセキュリティアップデートとメンテナンスを行う。

 

セキュリティとプライバシー:定期的なセキュリティパッチをリリースしてシステムを保護し、ユーザーのプライバシーを重視する。(データ収集は最小限)

 

仮想環境化(Windows視点)

同じPCにふたつのOSを搭載することはできないため、原則的にどちらかのOSを停止させる必要がある。

しかし、Windows上にWSL(Windows Sub System)を用いて仮想化することによって、Windowsを起動させたままでもUbuntuを使用することが可能になる。

 

ただし、仮想化はリソースを使うため、パフォーマンスは落ちる。

 

 

【学びの記録】メリットとデメリットから知るLinux

Keiです。

 

プログラム開発で幅広く使われているOSのLinuxのメリットとデメリットについて、まとめていきます。

 

メリットとデメリット

前提知識:LinuxGNU/Linux)はWindowsMacに搭載されたOS(Operation System)で、使用用途に合わせて選べる様々なディストリビューションが存在する。

 

メリット:

オープンソース:コードを自由にカスタマイズできるため、汎用性が高い。

そのため、セキュリティの強化やパフォーマンスの向上などの様々な改良が可能。

 

②コスト:多くのディストリビューションは無料で使用することができ、WindowsMacのようにライセンス費用が掛からない。

 

③セキュリティ:オープンソースだからこそ、様々なエンジニアがシステムの脆弱性をカバーするパッチをリリースしてくれるため、安全性が高い。

また、デフォルトでユーザー権限を分離したり、強力なファイアーウォールを使用可能な点も挙げられる。

 

④安定性と信頼性:長時間の運用でも性能が低下することが少ないため、Webサーバーなどの連続稼働が求められるものにとっては理想的な環境といえる。

 

⑤サポートと多様なツール:開発者向けのツールが豊富で、広範囲のディストリビューションとコミュニティのサポートがある。

 

CUIであること:コーディングを行うエンジニアにとって、コマンドを入力するだけで様々な操作が可能なCUIは高効率である。

 

デメリット:

①互換性の問題:特定のソフトウェアやハードウェアがサポートされていない場合がある。また、異なる開発環境を一か所にまとめてしまうことで予期せぬエラーが発生してしまうなどの報告も多数あるという。

 

CUIであること:コーディングを行わない技術者にとっては、コマンドを入力しなければいけない操作が難しいと感じられてしまう。

但し、Ubuntuと呼ばれるディストリビューションGUI(画面操作可能)も可能にしているため、比較的扱いやすくはなっている。

 

Web開発における用途

サーバー運用:長時間の稼働に対する安定性とセキュリティの高さから、Webサーバーやデータベースサーバーとして採用されている。

 

開発環境:DockerやVagrantなどの仮想化技術との関連性が高い点も挙げられる。

 

まとめ

LinuxはOperation System(OS)のひとつで、Web開発においては安定性やセキュリティの高さからWebサーバーやデータベースとして採用されている。

 

また、モダンな開発技術には欠かせない仮想化技術との関連性が高い。

【学びの記録】PHPの概要

Keiです。

 

PHPについて学んだことを言語化していきます。

 

 

サーバーサイドプログラミング言語

PHP(Hypertext Preprocessor)はサーバー側で実行されるスクリプト言語で、

HTMLコードの中にPHPコードを埋め込むことが出来る。

また、データベースとの連携もしやすい。

 

シンプルに書くことが出来るため、扱いやすい言語ともいわれている。

 

主な特徴

サーバーサイド言語:サーバー側で実行され、その結果だけがクライアント側(ブラウザ)に送信される。

 

データベースサポート:MySQLPostgreSQLといった、多くのデータベースとの連携が可能

 

ユーザー認証と管理:ユーザーのログイン機能やセッション管理を行える。

これによりユーザー毎に異なるアクセス権限を設定したり、情報を安全に保持できる。

 

メール送信機能:Webフォームからの入力を受け取り、メールを送信する機能をサポートする。これにより、お問い合わせフォームや申し込みなどWebサイトから直接メール送信できるようにできる。

 

ファイル操作:サーバー上のファイルを作成、読み取り、更新、削除することが出来る。これにより、Webアプリケーション内でユーザーがアップロードした画像やドキュメントなどのデータを管理できる。

 

APIの統合:外部APIとの連携をする際に使用できる。例えば、SNSAmazon Payのような決済システム、GoogleMapなどのAPIと連携して、これらサービスをひとつのWebアプリケーションに統合することが出来る。

 

HTMLと統合するメリット

動的なコンテンツ生成:PHPを使ってデータベースから情報を取得し、その情報を元にHTMLページを動的に生成することが可能。

例えば、ユーザーによって異なる情報を表示するログインシステムはこれに該当する。

 

フォームデータの処理:ユーザーが入力したデータを取得し、それを処理する為のスクリプトPHPで書くことが一般的になっている。

例えば、お問い合わせフォームのデータを受け取り、それをメールで送信するなどの処理はこれに該当する。

 

ユーザーインタラクションの強化:サーバーサイドで処理を行うことによって、セキュリティを高めつつ、ユーザーのアクションに応じて迅速な返答を行うことが出来るようになる。

 

要するに、静的なHTML文書に動的な要素を追加することが出来るため、より対話的な体験を提供できるようになる。

 

言語の欠点

一貫性がない:関数の命名規則やパラメータの順序に一貫性がなく、これが学習を難しくしている原因になっている。

 

エラー処理:初期のPHPはエラーが適切に捕捉されず、デバックが難しい状況が発生していた。現代のバージョンでは改善はされているものの、エラー処理の方式には過去のなごりが見られている。

 

セキュリティ:人気ゆえに多くのセキュリティの脆弱性が指摘されている。初期のプログラマーが危険性の高いコードを書いてしまうことがあるため、問題を起こしてしまう可能性があるとか。

 

パフォーマンス:PHPはインターフリタ型の言語であるため、コンパイル言語に比べると実行速度が遅くなることがある。その為、大規模なアプリケーションを開発する場合はこの問題が顕著になる場合がある。

 

大規模アプリケーションに不適切:シンプルなアプリケーションや中小規模のプロジェクトには適しているが、大規模で複雑なシステムを構築する場合は、コードの維持と管理が難しくなってしまう。これはPHPが元々持っている構造の緩さや厳密さに欠けるために起こる問題だとか。

 

このように様々な欠点があるにもかかわらず、昨今の開発現場では非常に高い使用率を誇っている言語でもある。

その理由は、これら欠点を補うことが出来るフレームワークの登場のおかげといえるだろう。

 

まとめ

PHPはサーバーサイドで機能するスクリプト言語であり、フロントエンド言語であるHTMLの中にコードを記載することで動的なページを作ることが可能になる。

 

サーバー側で機能する言語ということもあり、データベースとの連携がしやすい。

 

シンプルな記述法であるため、現代でも多くのエンジニアが使用しているプログラミング言語だが、欠点も多くある。

 

それらを解決するためのフレームワーク技術を合わせて扱うことが前提になりつつあるが、どの欠点を補うものなのかを理解した上で適切な技術選定を行うことが重要。

【学びの記録】データベース/SQL技術の概要

Keiです。

 

データベース/SQLについて学んだことを言語化していきます。

 

 

データベースとは?

Webサイト上で扱う、個人情報や商品情報、画像や映像といった様々なデータを保存しておく倉庫。

 

そのデータを扱うための技術がSQLという言語。

テーブルと呼ばれる書庫の棚のようなものの中に、関連するデータをまとめて格納するイメージ。

SQLとは?

Structured Query Language(構造化問い合わせ言語)といい、データベース上にあるデータを取得、更新、削除する際に用いられる。

 

サーバーサイド言語と組み合わせて、実際のサービスでデータを扱う仕組みを作れる。

 

データベースの種類

①リレーショナルデータベース(RDBMS):

例:MySQLPostgreSQLSQLite

データは表(テーブル)に格納されて、行(レコード)と列(フィールド)で構成

SQL(Structured Query Language)を使用してデータを操作する

 

②NoSQLデーターベース:

例:MongoDB、Cassandra、Redis

データベース構造が定義されていないためデータ構造が柔軟(スキーマ

ドキュメント、キーバリュー、グラフなどの形式でデータを格納する

 

データベースを使う理由

データの整合性:エラーや矛盾を防ぐことができる

セキュリティ:データへのアクセスを制御することで、不正アクセスから保護できる

スケーラビリティ:データ量が増えても管理が効率的に行える

 

リレーショナルデータベースの種類と違い

MySQL

メリット:シェア率が高いため、サポートや情報が充実している。

読み取り操作が高速で大規模なWebサイトやアプリケーションに適している。

レプリケーションやシャーディング(コピー作成や負荷分散)機能が充実している。

 

デメリット: InnoDBストレージエンジンはACID準拠ですが、古いMyISAMエンジンはそうではない。(要するに使いどころが限られている?)

PostgreSQLに比べると複雑なトランザクション(銀行口座のような引き出して残高を減らす)を管理する機能に限りがある。

 

要するに:たくさんの人が使っているから困ったときに助けを呼びやすいけど、PostgreSQLに比べると機能は少ないかな。

 

PostgreSQL

メリット:SQL準拠であり、地理空間データの処理、複雑なクエリ、カスタムタイプなどの高度な機能をサポートできる(?)

機能を拡張するための拡張機能が豊富にある。

ACID準拠で、堅牢なトランザクションのサポートが出来る。

 

デメリット:高性能だが、システムリソースを多く消費する傾向がある。

高度な機能設定と管理をするにはより高度な専門知識が必要。

 

要するに:MySQLよりも複雑で便利なことが出来るしデータを守る力も強いけど、コストパフォーマンスが低いよ。

 

SQLite

メリット:非常に軽量でセットアップや管理が非常に簡単。また、サーバーレスで動作しアプリケーションに組み込むことが出来る。

データベース全体が単一のファイルに保存されているため、簡単に移動やコピーが可能。

 

デメリット:多数のユーザーが同時アクセスするような環境には向いてない。

高負荷で大規模なデータを扱うことはできない。

 

要するに:とてもシンプルで軽いから個人使用する分には便利だけど、たくさんの人に使ってもらいたいって場合には不向きだね。

 

まとめ

データベースは、個人情報や商品などの様々なデータを保存しておくための箱

SQLは、データベースの中に保存されているデータを管理するための言語

 

データベースの種類に関しては、ここで挙げた例は一部でしかないが、それぞれのプロジェクトの要件や技術者の技量など様々な観点から適切なものを選択する必要がある

【学びの記録】Webの仕組みを抑えるための知識 - HTTP/HTTPS編

Keiです。

 

今回は、HTTP/HTTPS編の言語化をやっていきます。

ちなみにかなりざっくり書いてますので間違いや抜け情報があるのは許してください。

*細かいところまで全部網羅するのは、今は無理でした。

 

 

HTTP通信

HTTP(HyperText Transfer Protocol)はWebクライアントであるブラウザ(Google等)とWebサーバー間で行われるデータのやり取りルールのこと。

ハイパーテキストを転送するためのプロトコルである。

 

リクエストとレスポンス

Webクライアントは、HTTPというルールに従ってWebサーバーにデータをリクエストする。

Webサーバーは、Webクライアントへリクエストされたデータ(HTMLファイルや画像など)をレスポンスする。

HTTPHeaderとデータ本体(ボディ)のふたつに情報が分かれていて、これらはリクエストとレスポンスどちらでも行われている。

 

HTTPヘッダー

リクエストのヘッダー:

Webブラウザ側でサポートするタイプのデータ、データの圧縮方法、ブラウザの種類など、Webサーバーに送るためのデータが格納

 

レスポンスのヘッダー:

サーバーの種類、返信するデータのタイプ、データの圧縮方法などのデータが格納

 

ボディ

リクエストのボディ:

Webサーバーに送るためのデータが格納

Webページ上の入力欄にテキスト情報がある場合はその情報をWebサーバーに送る

 

レスポンスのボディ:

HTMLや画像ファイル、動画ファイルなどのデータを格納

 

メソッド

クライアントが行いたい処理をサーバーに伝える

GET:URIのヘッダーデータとボディーデータを取得する

POST:URIにリソースを追加する

PUT:URIの内容を作成、更新する

DELETE:URIの内容を削除する

HEAD:URIのヘッダーデータを取得する

OPTIONS:URIに対して利用できるメソッド一覧を取得する

 

URIUniform Resource Identifier)とは、インターネット上のデータやサービス、機器などの所在情報を識別する書き方(ルール)の総称

URLはこのURIで定められたルールで書かれたり使われたりしている

 

 

HTTPSという暗号化プロトコル

HTTP over SSL/TLSの略称で、HTTP通信をより安全に行うためのプロトコル

 

SSL/TLS

SSL:Secure Sockets Layer

TLS:Transport Layer Security

これらは暗号化通信やサイト運営元の確認ができる

 

例えば、ドメイン認証SSLという低コストなセキュリティ強化システムや、企業実在認証SSLという個人情報に関わるものを暗号化して公式サイトのセキュリティを強化できる

 

まとめ:HTTPとHTTPSの違い

HTTPは、送信される情報が暗号化されておらず、第三者による盗聴や攻撃を受ける危険があるもの

HTTPSは、送信される情報が暗号化されているため、安全