<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>設計 &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/%E8%A8%AD%E8%A8%88/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Thu, 04 Jan 2024 20:28:28 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>設計 &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ステートフルとステートレスについてざっくり理解しよう！</title>
		<link>https://otonan-syusyoku.work/archives/1569</link>
					<comments>https://otonan-syusyoku.work/archives/1569#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 04 Jan 2024 07:56:42 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[絶対に必要なIT基礎知識]]></category>
		<category><![CDATA[脱3流プログラマー]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1569</guid>

					<description><![CDATA[みなさん、こんにちは！ 今日はちょっとマニアックな話、ステートフルとステートレスについてお話ししたいと思います。 これ、聞いたことあるけどよくわからないって人、多いんじゃないかな？ でも大丈夫、ここでしっかり理解していき [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>みなさん、こんにちは！</p>
<p>今日はちょっとマニアックな話、ステートフルとステートレスについてお話ししたいと思います。<br />
これ、聞いたことあるけどよくわからないって人、多いんじゃないかな？<br />
でも大丈夫、ここでしっかり理解していきましょう！</p>
<h2>ステートフルって何？</h2>
<p>まずはステートフルについて。</p>
<p>ステートフルっていうのは、端的に言うと<strong>「過去の情報を覚えている状態」</strong>のこと。<br />
システムが過去にどんな処理をしたかを記憶していて、それをもとに次の動作を決めるんです。</p>
<p>例えば、Webサイトにログインする時を考えてみてください。<br />
<strong>一度ログインすると、そのサイトは「あ、この人はもう認証済みだな」と覚えてくれてますよね。</strong><br />
これがステートフルな動作。ユーザーの状態を保持して、その情報に基づいて何らかの処理をするわけです。</p>
<h3>具体例</h3>
<ol>
<li><strong>Webセッション管理</strong>：<br />
ユーザーがWebサイトにログインしたとき、サーバーはそのユーザーのセッション情報（例えば、認証情報、プロファイル設定など）を保持します。この情報は、ユーザーがサイトをナビゲートする間、持続し、適切なコンテンツやオプションを提供するために使用されます。</li>
<li><strong>データベーストランザクション</strong>：<br />
データベースは、過去のクエリやトランザクションの履歴を追跡し、それに基づいてデータの整合性を保持します。たとえば、銀行の取引記録は、口座の残高を正確に保つために重要です。</li>
</ol>
<h2>じゃあステートレスって？</h2>
<p>一方で、ステートレスはその逆。</p>
<p>つまり、<strong>「過去の情報を覚えていない状態」</strong>を指します。<br />
こっちは、過去の情報に左右されずに、その都度独立して処理を行います。</p>
<p>たとえば、HTTPプロトコル。<br />
これ、実はステートレスなんですよ。<br />
ウェブサーバーは、同じユーザーからのリクエストでも、それぞれを完全に別々のものとして扱うんですね。<strong>だから毎回、ページをリロードするたびに「誰この人？」ってなるわけです。</strong></p>
<h3>具体例</h3>
<ol>
<li><strong>HTTPプロトコル</strong>：<br />
HTTPはステートレスプロトコルです。ウェブサーバーは、同一のクライアントからの複数のリクエストを関連づけません。各リクエストは独立しており、サーバーはそれぞれのリクエストを新規のものとして処理します。</li>
<li><strong>RESTful API</strong>：<br />
RESTアーキテクチャはステートレスであり、各APIリクエストは他のリクエストから独立しています。例えば、REST APIを通じてリソースを取得するリクエストは、以前のリクエストやその結果とは無関係に処理されます。</li>
</ol>
<h2>ステートフルとステートレス、使い分けは？</h2>
<p>これら二つ、どちらが良いとか悪いとかではなくて、用途によって使い分けるのが大事。</p>
<p>ステートフルは、ユーザーに合わせたカスタマイズや複雑な処理が必要な場合に向いています。<br />
一方、ステートレスはシンプルさとスケーラビリティが求められる場合、例えば大規模なWebサービスとかにぴったり。</p>
<p>要は、状況に応じて臨機応変に使い分けることが大切。<br />
システム設計する時は、この二つの特性をよく理解して、最適なアーキテクチャを選んでいきましょう！</p>
<h2>まとめ</h2>
<p>いかがでしたか？<br />
ステートフルとステートレス、ちょっと難しいけど、この話を押さえておけば、システムの動きを理解するのに役立つはず。</p>
<p>ぜひこの知識を活用して、もっとITの世界を楽しんでいってくださいね！それでは、また次回！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1569/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【セキュリティ】ufw と waf について</title>
		<link>https://otonan-syusyoku.work/archives/1422</link>
					<comments>https://otonan-syusyoku.work/archives/1422#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 09 Oct 2023 04:04:41 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1422</guid>

					<description><![CDATA[サーバー構築を任されたとき、ufwとwaf の違いがいまいちピンとこなかったので、ちょっと勉強してみました。 両者の違いをわからないままノリで進めていくと大恥かくので先に学んでおく事をおすすめします。 UFW（Uncom [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>サーバー構築を任されたとき、ufwとwaf の違いがいまいちピンとこなかったので、ちょっと勉強してみました。</p>
<p>両者の違いをわからないままノリで進めていくと大恥かくので先に学んでおく事をおすすめします。</p>
<h2>UFW（Uncomplicated Firewall）とは</h2>
<p>UFWは、<span class="sc_marker blue"><strong>Linuxベースのシステムでファイアウォールを設定するためのツール</strong></span>です。</p>
<p>UFWは、iptablesと呼ばれるより高度なファイアウォール設定を簡略化したもので、コマンドラインを通じて簡単に設定できます。</p>
<p>主な特徴は以下です</p>
<ul>
<li>ポートベースのファイアウォール設定をサポート
<ul>
<li>特定のポートへのアクセスを制御</li>
<li>IPアドレス、サブネット、アプリケーションなどの設定が可能。</li>
</ul>
</li>
<li>シンプルな構文
<ul>
<li>ufwは非常に簡単な構文を持っており、コマンドラインで簡単に設定できる</li>
<li>ufwはシステム全体のファイアウォールとして機能する。</li>
<li>ネットワークトラフィックを制御するために使用される。</li>
<li>特にWebアプリケーションのセキュリティには直接関係なし。</li>
</ul>
</li>
</ul>
<h3>使用例</h3>
<p>サーバーに対してセキュリティに関わる制限を設ける。</p>
<pre class="line-numbers"><code class="language-other">#HTTPS の port 開放 
sudo ufw allow 443

#MySQL の port 開放 
sudo ufw allow 3306

#sshの port 閉鎖 
sudo ufw deny 22</code></pre>
<p>&nbsp;</p>
<p>ufw にてポートの開閉を明示的に指示ができる。</p>
<div class="sc_frame_wrap inline red">
<div class="sc_frame_title"><span class="sc_frame_icon"><i class="fa fa-check-square-o" aria-hidden="true"><span>fa-check-square-o</span></i></span>ssh のポート開閉設定には注意</div>
<div class="sc_frame">
<p>ufw にて ssh のポートを閉じた場合、<span class="sc_marker blue"><strong>当たり前ですが ssh を用いてサーバーに接続することができなくなります</strong></span>。</p>
<p>当時の私の権限では、コントロールパネルから操作する権限を与えられていないアカウントで作業を行っていたため、構築作業が何もできない状況に陥りました。</p>
<p>サーバー管理者に申請を出す時間がないくらい案件を掛け持ちしていたため、サーバーを削除して最初から構築するという事態に陥りました。</p>
<p>ssh 周りの設定は注意しながら進めましょう。笑</p>
</div>
</div>
<h2>WAF（Web Application Firewall）とは</h2>
<p>WAFは、<span class="sc_marker blue"><strong>Webアプリケーションのセキュリティを強化するためのセキュリティツール</strong></span>です。</p>
<p>WAFは、Webトラフィックに対する特定のセキュリティルールを適用し、Webアプリケーション攻撃（例：SQLインジェクション、クロスサイトスクリプティングなど）から保護します。</p>
<p>主な特徴は以下です</p>
<ul>
<li>Webアプリケーションに対するトラフィックフィルタリング
<ul>
<li>WAFは、HTTPおよびHTTPSトラフィックを対象として、不正なリクエストや攻撃を検出し、遮断します。</li>
<li>パターンマッチング：WAFは特定の攻撃パターンや脆弱性に対する署名またはルールを使用して攻撃を検出します。</li>
<li>ロギングと監視：WAFは攻撃試行をログに記録し、セキュリティエンジニアがそれを監視および対応できるようにします。</li>
</ul>
</li>
</ul>
<p>WAFはWebサーバーとWebアプリケーションの間に配置され、攻撃をブロックしてWebアプリケーションを保護します。</p>
<h3>WAFは販売されている</h3>
<p>今回の勉強をするまでは、WAFの防御する内容が SQLインジェクションや XSS などであったため、自分で記述するプログラムにて防御するものだと思っていました。（自分で書くべきプログラムの総称と思っていた…</p>
<p>内容を深掘っていくとWAFはかなりの数が外反されており、運用を楽にするためにたくさんの企業が導入しているということがわかりました。</p>
<p>独自のルールを付加させる事のできるAWS WAF はその内勉強しないといけないなぁという印象です…</p>
<h2>用途の異なるセキュリティツール</h2>
<p>UFW（Uncomplicated Firewall）とWAF（Web Application Firewall）は、異なるセキュリティ関連のツールであり、異なる用途と機能を持っています。</p>
<p>簡単にまとめると以下のとおりですー。</p>
<ul>
<li>UFWはシステムのファイアウォール設定を簡単に行うためのツール</li>
<li>WAFはWebアプリケーションのセキュリティを向上させるための特化したセキュリティツール</li>
</ul>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1422/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クリーンアキテクチャ】SOLID原則の依存性反転の原則を学ぶ</title>
		<link>https://otonan-syusyoku.work/archives/1360</link>
					<comments>https://otonan-syusyoku.work/archives/1360#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Mon, 05 Jun 2023 15:19:41 +0000</pubDate>
				<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[目指せ上流]]></category>
		<category><![CDATA[実務]]></category>
		<category><![CDATA[脱3流プログラマー]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1360</guid>

					<description><![CDATA[SOLID原則を学んでいます 「Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]」という雑誌に出会ったので、SOLID原則を学習中です。これを機に3流プログラマーに慣れたらいいなぁと。 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>SOLID原則を学んでいます</h2>
<p>「<a href="//af.moshimo.com/af/c/click?a_id=2019667&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0C4K9X2XV" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]</a>」という雑誌に出会ったので、SOLID原則を学習中です。これを機に3流プログラマーに慣れたらいいなぁと。</p>
<p>前回の学習内容はこちら</p>
<p>[getpost id=&#8221;1332&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
<h2>まずはInterfaceから</h2>
<p>PHPにおけるInterface（インターフェース）は、クラスが実装するべきメソッドのシグネチャ（メソッド名、引数、戻り値の型）を定義するための機能です。</p>
<p>Interfaceは抽象的なクラスであり、実際の実装を持ちません。<br />
(じゃあいらんやん&#8230;って思っちゃいますよね)</p>
<p>&nbsp;</p>
<p>なぜ必要なのかというと、<br />
<strong>クラスはInterfaceを実装することで、そのInterfaceで定義されたメソッドを必ず実装しなければならないからです。</strong></p>
<p>例えば、ユーザーにメッセージを送信する場面を考えて下さい。</p>
<p>どの様なメッセンジャーを使うにしても必ず「<strong>メッセージを生成する機能</strong>」と「<strong>メッセージを送信する機能</strong>」の2つが必要になるはずです。</p>
<p>ここではメールで送信する場合(メールクラス)とLineで送信する場合(Lineクラス)を想定してみます。</p>
<p>interfaceを以下のように定義することで、実装したクラスは<strong>interfaceの内容を必ず実装しなければいけません。</strong></p>
<pre class="line-numbers"><code class="language-php">interface Message {
    public function createMesseage();
    public function sendMessage();
}</code></pre>
<p>上記の様に定義することで、メールクラスとLineクラスは必ず同じメソッドがある事が担保されます。(<strong>クラスは同じ振る舞いを持つことが保証されます</strong>)</p>
<p>仮にSlackでメッセージを送信したい場合、Slackクラスに同じメソッドを実装するだけで済むため拡張性が高くなりますよね。あら、わかりやすい。笑<br />
(既存のクラス(メールクラス、Lineクラス)に影響なく実装できる)</p>
<pre class="line-numbers"><code class="language-php">class Mail implements Message {
    public function createMessage() {
        //処理    
    }

    public function sendMessage() {
        //処理   
    }
}

class Line implements Message {
    public function createMessage() {
        //処理    
    }

    public function sendMessage() {
        //処理   
    }
}

interface Message {
    public function createMessage() {}
    public function sendMessage() {}
}</code></pre>
<h2>いよいよ依存性反転の原則</h2>
<p>一旦、呼び出し元の観点を持ってみましょう。</p>
<p>interfaceを実装することで、呼び出し元のコードはinterfaceに対して依存し、具体的な実装クラスに対して依存しないためコードの結合が低くなります(疎結合。。。)</p>
<p><img decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-300x150.png" alt="依存性反転の原則" width="300" height="150" class="aligncenter wp-image-1363 size-medium" srcset="https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元-768x384.png 768w, https://otonan-syusyoku.work/wp-content/uploads/2023/06/呼び出し元.png 1000w" sizes="(max-width: 300px) 100vw, 300px" /></p>
<p>先程のコードで考えると呼び出し元はメールクラスを呼び出しているつもりでもinterfaceを経由しているのが実態です。</p>
<p>Interfaceを使用することで、クラス間の依存関係を抽象化し、実装にではなくインターフェースに依存するようにすることができます。</p>
<ul>
<li>呼び出し元の見ているところがinterfaceになる</li>
<li>interfaceは定義する場所</li>
<li>interfaceを継承したクラスは必ず同じメソッドある</li>
<li>結果、呼び出し元と実装クラスはinterfaceに依存している</li>
</ul>
<p>これにより、依存性反転原則が達成されます。</p>
<p>&nbsp;</p>
<p>ちゃんちゃん。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1360/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【クリーンアキテクチャ】SOLID原則の単一責任の原則を学ぶ</title>
		<link>https://otonan-syusyoku.work/archives/1332</link>
					<comments>https://otonan-syusyoku.work/archives/1332#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Sun, 28 May 2023 13:51:08 +0000</pubDate>
				<category><![CDATA[生涯独学]]></category>
		<category><![CDATA[目指せ上流]]></category>
		<category><![CDATA[設計]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1332</guid>

					<description><![CDATA[先輩から雑誌を渡された これから設計に関する知識も増やしていきたいな〜と思っていた矢先、「Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]」という書籍に出会いました。中々嬉しいタイミン [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>先輩から雑誌を渡された</h2>
<p>これから設計に関する知識も増やしていきたいな〜と思っていた矢先、「<a href="//af.moshimo.com/af/c/click?a_id=2019667&amp;p_id=170&amp;pc_id=185&amp;pl_id=4062&amp;url=https%3A%2F%2Fwww.amazon.co.jp%2Fdp%2FB0C4K9X2XV" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">Software Design (ソフトウェアデザイン) 2023年6月号 [雑誌]</a>」という書籍に出会いました。中々嬉しいタイミングですね！笑</p>
<p>いわゆるクリーンアーキテクチャに関する内容が紹介されている雑誌になります。</p>
<p>&nbsp;</p>
<p>今回はシリーズ形式で各記事に分けて書いていこうと思います〜！</p>
<p>&nbsp;</p>
<h2>SOLID原則を簡単に</h2>
<ol>
<li>単一責任の原則 (Single Responsibility Principle, SRP)</li>
<li>オープン/クローズドの原則 (Open/Closed Principle, OCP)</li>
<li>リスコフの置換原則 (Liskov Substitution Principle, LSP)</li>
<li>インターフェース分離の原則 (Interface Segregation Principle, ISP)</li>
<li>依存性逆転の原則 (Dependency Inversion Principle, DIP)</li>
</ol>
<h2>単一責任の原則</h2>
<p>SRP : Single Responsibility Principle</p>
<p>一言で表すとクラスは単一の責務を持つべきということらしいです。</p>
<p>もっと噛み砕くと1つのクラスが1つの目的や責務にのみ集中するべきことを指します.</p>
<pre class="line-numbers"><code class="language-php">//良くない設計
&lt;?php
class DB {
	private $host;
	private $dbName;
	private $userName;
	private $password;
	
	public function __construct($name, $email) {
		$this-&gt;host = env('host');
		$this-&gt;dbName = env('dbName');
		$this-&gt;userName = env('userName');
		$this-&gt;password = env('password');
		
		try {
			$database_handler = new PDO('mysql:host=' . $this-&gt;host . ':3306;dbname=' . $this-&gt;dbName . ';charset=utf8mb4', $this-&gt;userName, $this-&gt;password);
		} 
    	catch (PDOException $e) {   
        	echo $e-&gt;getMessage() . "\n";
        	exit;
    	}  
	}
	
	public static function selectUser() {
		$PDO = $db = new self();
		
		//取得処理	
	}
	
	public static function editAdmin() {
		$PDO = $db = new self();
		
		//編集処理	
	}
}
?&gt;</code></pre>
<p>&nbsp;</p>
<p>上記のコードではDBクラスを定義しているのですが、ユーザーの取得処理と管理者の編集処理を記述しています。</p>
<p>理想とするクラス設計では、ユーザーのクラス/管理者のクラスという形で分けるべきですよね。↓</p>
<p>DB接続クラス</p>
<pre class="line-numbers"><code class="language-php">class DB {
	private $host;
	private $dbName;
	private $userName;
	private $password;
	
	public function __construct($name, $email) {
		$this-&gt;host = env('host');
		$this-&gt;dbName = env('dbName');
		$this-&gt;userName = env('userName');
		$this-&gt;password = env('password');
		
		try {
			$database_handler = new PDO('mysql:host=' . $this-&gt;host . ':3306;dbname=' . $this-&gt;dbName . ';charset=utf8mb4', $this-&gt;userName, $this-&gt;password);
		} 
    	catch (PDOException $e) {   
        	echo $e-&gt;getMessage() . "\n";
        	exit;
    	}  
	}
}</code></pre>
<p>ユーザクラス（管理者も同様に）</p>
<pre class="line-numbers"><code class="language-php">class User {
	public static function selectUser() {
		$PDO = $db = new self();
		
		//取得処理	
	}

	//他のユーザーに関する処理を記述していく
}</code></pre>
<p>良くないコード例として出したソースは以前の現場で書いていた手法なんですよね。笑<br />
DBクラスの内容が1000以上になっていたので、拡張性や保守性がかなり良くない事が単一責任の原則を学んで理解できたので良しとしましょう。</p>
<p>ちなみに前の現場で書いていた内容はいつか爆発することは目に見えているのですが、爆破する前に逃げ出すことが出来ました。笑</p>
<p>[getpost id=&#8221;1204&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1332/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
