<?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>プログラミング教室 M&amp;Co.</title>
	<atom:link href="/feed/" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>実際に手を動かしながらWEBサービスを作ってみよう。</description>
	<lastBuildDate>Mon, 03 Feb 2025 00:37:15 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.1</generator>
	<item>
		<title>Dockerの基礎知識その2</title>
		<link>/2025/02/03/193/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Sun, 02 Feb 2025 15:04:04 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">/?p=193</guid>

					<description><![CDATA[<p>前回から少し時間が空いてしまいました。ちょっと仕事が忙しくなってしまって。 記事を書くのは慣れないので、日課のようにはまだ書けそうもないです。 それでも続けていきたいと思います。 今回は、下記のことを書いてみます。 Do...</p>
<p>投稿 <a href="/2025/02/03/193/">Dockerの基礎知識その2</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>前回から少し時間が空いてしまいました。ちょっと仕事が忙しくなってしまって。</p>



<p>記事を書くのは慣れないので、日課のようにはまだ書けそうもないです。</p>



<p>それでも続けていきたいと思います。</p>



<p></p>



<p>今回は、下記のことを書いてみます。</p>



<ul class="wp-block-list">
<li>Dockerビルド</li>



<li>Dockerfile</li>
</ul>



<h2 class="wp-block-heading">Dockerのビルド</h2>



<p>Dockerを起動するということは、Dockerコンテナを起動するということです。</p>



<p>Dockerコンテナを起動するためには、Dockerイメージが必要です。</p>



<p>Dockerのビルドは、Dockerイメージを作成するということです。</p>



<p>Dockerビルドをすることで、自分のオリジナルのイメージを作成することができます。</p>



<p>まずは、どんなイメージを作成するのかを考えてみましょう。</p>



<p></p>



<h2 class="wp-block-heading">どんなDockerイメージを作成するか</h2>



<p>このブログでは、Laravelを使ってWEBサービスを作成するという目標があります。<br>Laravelを動作させるためのDockerイメージを作成することを考えてみます。</p>



<p>必要なパッケージは、最低限下記のものが必要になると思います。</p>



<ul class="wp-block-list">
<li>WEBサーバー</li>



<li>PHP</li>
</ul>



<p>他にもDBやcomposerが動作できる環境が必要になっていきますが、まずは上記の２つが動作するDockerイメージを作成します。</p>



<h2 class="wp-block-heading">ベースとなるイメージを選ぶ</h2>



<p>Dockerイメージを作成するためには、親となるベースイメージを選択する必要があります。</p>



<p>さまざまな親イメージがありますが、今回は<strong>debian</strong>を使ってみたいと思います。</p>



<p>もっとシンプルにscratchというイメージも試してみたかったんですが、本当に最低限のイメージになっていて、この記事が完成するのに一ヶ月かかりそうだと思ったのでやめました。</p>



<p>このdebianイメージを元に、必要なパッケージをインストールして、自分のイメージを作成していくことになります。</p>



<h2 class="wp-block-heading">Dockerfile</h2>



<p>ベースとなるイメージを決めたら、Dockerfileを作成しましょう。</p>



<p>このファイルにパッケージをインストールする命令を書いてDockerイメージを作っていきます。</p>



<p>Dockerfile</p>



<pre class="wp-block-code"><code>FROM <strong>debian</strong></code></pre>



<p>まずは、これだけ書いて見てください。</p>



<p></p>



<p>書いたら、このコマンドを実行してビルドしてみましょう。</p>



<pre class="wp-block-code"><code>% docker build -t my-php .
&#91;+] Building 5.0s (5/5) FINISHED                                                                                                                                          docker:desktop-linux
 =&gt; &#91;internal] load build definition from Dockerfile                                                                                                                                      0.0s
 =&gt; =&gt; transferring dockerfile: 86B                                                                                                                                                       0.0s
 =&gt; &#91;internal] load metadata for docker.io/library/debian:latest                                                                                                                          2.1s
 =&gt; &#91;internal] load .dockerignore                                                                                                                                                         0.0s
 =&gt; =&gt; transferring context: 2B                                                                                                                                                           0.0s
 =&gt; &#91;1/1] FROM docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62                                                                    1.4s
 =&gt; =&gt; resolve docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62                                                                    0.0s
 =&gt; =&gt; sha256:e474a4a4cbbfe5b308416796d99b79605bbfad6cb32ab1d94d61dc0585a907ea 48.31MB / 48.31MB                                                                                          1.4s
 =&gt; exporting to image                                                                                                                                                                    2.8s
 =&gt; =&gt; exporting layers                                                                                                                                                                   0.0s
 =&gt; =&gt; exporting manifest sha256:b4c8611ed6d94e697662202313b519bfb0a386085cf2ea3449d286d531f721f3                                                                                         0.0s
 =&gt; =&gt; exporting config sha256:a00c941adf5d95d7bdd66e523e9f58ed1fcbf1d60f34900a16832a119bf81494                                                                                           0.0s
 =&gt; =&gt; exporting attestation manifest sha256:a8329860e70afec148f6b07354d434f74663e23d10bb82d311dc6096dbec89d3                                                                             0.0s
 =&gt; =&gt; exporting manifest list sha256:cec0b336726ac08dc98c90eb76fefe472b6e1681d406c3c7d0adcf6c09d8e043                                                                                    0.0s
 =&gt; =&gt; naming to docker.io/library/my-php:latest                                                                                                                                          0.0s
 =&gt; =&gt; unpacking to docker.io/library/my-php:latest                                                                                                                                       2.7s

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview </code></pre>



<p>こんな感じでビルドが実行されます。</p>



<p>ビルドが完了したら、イメージを確認しましょう。</p>



<pre class="wp-block-code"><code> % docker images
my-php                                                                                 latest           cec0b336726a   2 weeks ago     203MB</code></pre>



<p>先ほど-tのオプションで指定したタグの<strong>my-php</strong>でイメージができていることが確認できます。</p>



<p>Dockerイメージが出来たので、Dockerコンテナを起動してみましょうか。</p>



<pre class="wp-block-code"><code>% docker run -it --rm my-php /bin/bash   
root@95b3a599a57b:/# </code></pre>



<p>これで、Dockerコンテナが起動して、bashでのログインができました。</p>



<p>bashは、Dockerコンテナの中で起動しているOSを操作するために使用する「ターミナル」です。</p>



<p>ターミナルの扱いにも慣れていきましょう。これは、また別の記事で説明します。</p>



<h2 class="wp-block-heading">WEBサーバー Apacheのインストール</h2>



<p>これでコンテナの中でいろんなことができる状態になったので、まずはWEBサーバーであるApacheをインストールします。</p>



<p>まずは、コンテナの内部のパッケージを最新の状態にします。</p>



<pre class="wp-block-code"><code>root@95b3a599a57b:/# apt update
Get:1 http://deb.debian.org/debian bookworm InRelease &#91;151 kB]
Get:2 http://deb.debian.org/debian bookworm-updates InRelease &#91;55.4 kB]
Get:3 http://deb.debian.org/debian-security bookworm-security InRelease &#91;48.0 kB]
Get:4 http://deb.debian.org/debian bookworm/main arm64 Packages &#91;8693 kB]
Get:5 http://deb.debian.org/debian bookworm-updates/main arm64 Packages &#91;13.3 kB]
Get:6 http://deb.debian.org/debian-security bookworm-security/main arm64 Packages &#91;239 kB]
Fetched 9199 kB in 1s (6975 kB/s)                         
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.</code></pre>



<p>Apacheのインストールには、aptコマンドを使用します。debianでは、パッケージの操作をするために、aptを使用します。</p>



<p>OSによってパッケージの操作方法が異なる場合があります。</p>



<p>apacheをインストールするために、<strong>パッケージ名</strong>が必要です。パッケージ名を探してみます。</p>



<pre class="wp-block-code"><code>root@95b3a599a57b:/# apt search apache
Sorting... Done
Full Text Search... Done
ant-contrib/stable 1.0~b3+svn177-12 all
  collection of tasks, types and other tools for Apache Ant

apache2/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server

apache2-bin/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server (modules and other binary files)

apache2-data/stable,stable-security 2.4.62-1~deb12u2 all
  Apache HTTP Server (common files)

apache2-dev/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server (development headers)

apache2-doc/stable,stable-security 2.4.62-1~deb12u2 all
  Apache HTTP Server (on-site documentation)

apache2-ssl-dev/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server (mod_ssl development headers)

apache2-suexec-custom/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server configurable suexec program for mod_suexec

apache2-suexec-pristine/stable,stable-security 2.4.62-1~deb12u2 arm64</code></pre>



<p>&#8230;</p>



<p>&#8230;</p>



<p>何だか色々出てきますね。この中のどれかがapacheのパッケージです。</p>



<p>おそらくこれがapache本体です。</p>



<pre class="wp-block-code"><code>apache2/stable,stable-security 2.4.62-1~deb12u2 arm64
  Apache HTTP Server
</code></pre>



<p>早速インストールしてみましょう。インストールはこちらのコマンドを実行します。</p>



<pre class="wp-block-code"><code>root@95b3a599a57b:/# apt-get install -y apache2/stable</code></pre>



<p>&#8230;</p>



<p>&#8230;<br>Processing triggers for libc-bin (2.36-9+deb12u9) …<br>Processing triggers for ca-certificates (20230311) …<br>Updating certificates in /etc/ssl/certs…<br>0 added, 0 removed; done.<br>Running hooks in /etc/ca-certificates/update.d…<br>done.</p>



<p>の表示があれば、インストール成功しています。</p>



<p></p>



<p>次は、PHPのインストールをします。これもパッケージ名が必要なので、同じく検索してみます。</p>



<pre class="wp-block-code"><code>php8.2/stable,stable-security 8.2.26-1~deb12u1 all
  server-side, HTML-embedded scripting language (metapackage)
</code></pre>



<p>PHPもたくさんのパッケージが検索結果に表示されますが、必要なのはこれです。</p>



<pre class="wp-block-code"><code>root@95b3a599a57b:/# apt-get install -y php8.2/stable
invoke-rc.d: policy-rc.d denied execution of restart.
Setting up php8.2 (8.2.26-1~deb12u1) ...
Processing triggers for libc-bin (2.36-9+deb12u9) ...
Processing triggers for php8.2-cli (8.2.26-1~deb12u1) ...
Processing triggers for libapache2-mod-php8.2 (8.2.26-1~deb12u1) ...</code></pre>



<p>これもインストール成功です。</p>



<p>ここまでの操作をまとめます。実行したのは下記の３つのコマンドです。</p>



<pre class="wp-block-code"><code>root@95b3a599a57b:/# apt update
root@95b3a599a57b:/# apt-get install -y apache2/stable
root@95b3a599a57b:/# apt-get install -y php8.2/stable</code></pre>



<p>実際に実行したコマンドをDockerfileに記述します。</p>



<p>現在のDockerfileがこちらです。</p>



<pre class="wp-block-code"><code>FROM debian

RUN apt update
RUN apt-get install -y apache2/stable
RUN apt-get install -y php8.2/stable
</code></pre>



<p>さて、これでapacheからPHPを動作させることができるのか試してみます。</p>



<p>Ctrl + Dでコンテナを抜けてホスト(使用しているPC)に戻ります。</p>



<p>ビルドします。</p>



<pre class="wp-block-code"><code>% docker build -t my-php .
&#91;+] Building 1.8s (5/5) FINISHED                                                                                                                                          docker:desktop-linux
 =&gt; &#91;internal] load build definition from Dockerfile                                                                                                                                      0.0s
 =&gt; =&gt; transferring dockerfile: 86B                                                                                                                                                       0.0s
 =&gt; &#91;internal] load metadata for docker.io/library/debian:latest                                                                                                                          1.7s
 =&gt; &#91;internal] load .dockerignore                                                                                                                                                         0.0s
 =&gt; =&gt; transferring context: 2B                                                                                                                                                           0.0s
 =&gt; CACHED &#91;1/1] FROM docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62                                                             0.0s
 =&gt; =&gt; resolve docker.io/library/debian:latest@sha256:321341744acb788e251ebd374aecc1a42d60ce65da7bd4ee9207ff6be6686a62                                                                    0.0s
 =&gt; exporting to image                                                                                                                                                                    0.0s
 =&gt; =&gt; exporting layers                                                                                                                                                                   0.0s
 =&gt; =&gt; exporting manifest sha256:b4c8611ed6d94e697662202313b519bfb0a386085cf2ea3449d286d531f721f3                                                                                         0.0s
 =&gt; =&gt; exporting config sha256:a00c941adf5d95d7bdd66e523e9f58ed1fcbf1d60f34900a16832a119bf81494                                                                                           0.0s
 =&gt; =&gt; exporting attestation manifest sha256:c4e51099e1faa236e703b4703e19b99fea288cf87cec7aa8025666cef6e6e929                                                                             0.0s
 =&gt; =&gt; exporting manifest list sha256:f9a6c7ab5611772c7a80cf65a03f591c3697af57fe14b9c127b17eea8878d583                                                                                    0.0s
 =&gt; =&gt; naming to docker.io/library/my-php:latest                                                                                                                                          0.0s
 =&gt; =&gt; unpacking to docker.io/library/my-php:latest                                                                                                                                       0.0s

What's next:
    View a summary of image vulnerabilities and recommendations → docker scout quickview </code></pre>



<p> それでは起動させてみましょう。</p>



<pre class="wp-block-code"><code>% docker run my-php</code></pre>



<p>どうですか？起動しましたか？<br>実はこのままだと起動はしますが、すぐに終了します。Dockerコンテナで何を実行するのかを指定していないことが原因です。</p>



<p>Dockerfileを修正して、Apacheを起動させます。</p>



<pre class="wp-block-code"><code>FROM debian

RUN apt update
RUN apt-get install -y apache2/stable
RUN apt-get install -y php8.2/stable

ENTRYPOINT &#91;"/usr/local/bin/apachectl", "-DFOREGROUND"]</code></pre>



<pre class="wp-block-code"><code>ビルドします。
% docker build -t my-php .

実行します。
% docker run -p 8080:80 my-php
</code></pre>



<p>別のターミナルを使って起動しているか確認します。</p>



<pre class="wp-block-code"><code>% docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED              STATUS              PORTS                                      NAMES
fa33de421d21   my-php             "/usr/sbin/apachectl…"   About a minute ago   Up About a minute   0.0.0.0:8080-&gt;80/tcp                       elated_raman
</code></pre>



<p>起動はしているようです。</p>



<p>ブラウザからアクセスしてみます。</p>



<p><a href=":8080/">:8080/</a></p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="682" height="1024" src="/wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-682x1024.png" alt="" class="wp-image-197" srcset="/wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-682x1024.png 682w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-200x300.png 200w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-768x1152.png 768w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-300x450.png 300w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17-850x1275.png 850w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.52.17.png 867w" sizes="(max-width: 682px) 100vw, 682px" /></figure>



<p>apacheのデフォルトのhtmlが表示されました。</p>



<p>次は、phpが動かせるのか確認したいと思います。<br>PHPのファイルをコンテナ内に転送してみます。</p>



<p>転送するphpファイルは、この内容にしました。test.phpとして保存しています。</p>



<pre class="wp-block-code"><code>&lt;?php
phpinfo();
?&gt;
</code></pre>



<p>コンテナ内へのファイルの転送は、docker cpを使います。<br>まずは、コンテナのIDが必要です。先ほどのdocker psの内容から「fa33de421d21」がコンテナIDだということが分かります。</p>



<pre class="wp-block-code"><code>CONTAINER ID   IMAGE              COMMAND                  CREATED              STATUS              PORTS                                      NAMES
fa33de421d21   my-php             "/usr/sbin/apachectl…"   About a minute ago   Up About a minute   0.0.0.0:8080-&gt;80/tcp                       elated_raman</code></pre>



<p>それでは、コピーします。</p>



<pre class="wp-block-code"><code>% docker cp test.php fa33de421d21:/var/www/public_html
Successfully copied 2.05kB to fa33de421d21:/var/www/public_html
</code></pre>



<p>成功したようです。</p>



<p>それでは、ブラウザからアクセスしてみます。</p>



<p>:8080/test.php</p>



<figure class="wp-block-image size-large"><img decoding="async" width="959" height="1024" src="/wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-959x1024.png" alt="" class="wp-image-198" srcset="/wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-959x1024.png 959w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-281x300.png 281w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-768x820.png 768w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-300x320.png 300w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13-850x907.png 850w, /wp-content/uploads/2025/02/スクリーンショット-2025-02-02-23.58.13.png 1215w" sizes="(max-width: 959px) 100vw, 959px" /></figure>



<p>おぉ！動きました！</p>



<p>まさかこんな簡単に表示されるとは思わなかったので、驚きました。</p>



<p>ということで、PHPがApache上で動作するDockerイメージを作成することができました。</p>



<p>しばらくDockerの内容が続くと思います。</p>



<p></p>



<h2 class="wp-block-heading">まとめ</h2>



<p>今回は、Dockerビルドを実際に行ってPHPが動作するWEBサーバーのDockerイメージを作成しました。</p>



<p>何も設定ファイルを変更するなど、細かい操作はしてないですよね。</p>



<p>Dockerを使用すると、こんなに簡単に、短時間でサーバーを構築することができてしまいます。</p>



<p>コンテナの起動も非常に早いですよね。</p>



<p>まずは、一つDockerコンテナを起動させることができました。</p>



<p>実際のWEBアプリケーションでは、他にも必要なものがあります。</p>



<p>そうDBですね。これもDockerを使ってDBサーバーを起動させることができます。</p>



<p>次回は、DBサーバーのDockerコンテナを起動させます。</p>



<p>お楽しみに。</p>
<p>投稿 <a href="/2025/02/03/193/">Dockerの基礎知識その2</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dockerの基礎知識その1</title>
		<link>/2025/01/19/105/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Sun, 19 Jan 2025 10:09:54 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">:9000/?p=105</guid>

					<description><![CDATA[<p>Dockerをご存知ですか？私のシステム開発では使わない日は無いくらい、必須の開発ツールです。 一言でいうと、PCの中に小さな仮想PCを作ることが出来るようになります。 仮想PCは、さまざまなOS、PHPだったら様々なバ...</p>
<p>投稿 <a href="/2025/01/19/105/">Dockerの基礎知識その1</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>Dockerをご存知ですか？私のシステム開発では使わない日は無いくらい、必須の開発ツールです。</p>



<p>一言でいうと、PCの中に小さな仮想PCを作ることが出来るようになります。</p>



<p>仮想PCは、さまざまなOS、PHPだったら様々なバージョンがあらかじめインストールされた状態で用意されています。</p>



<p>起動も数秒で完了し、すぐに使用することができます。</p>



<p>私は開発環境の構築にも使用していますし、複数のDockerを組み合わせて本番環境を構築することもあります。</p>



<p>Dockerでまず覚えて欲しいのは、コンテナとイメージの２つです。この２つが基本です。</p>



<p>この記事では、Dockerの基礎知識、Dockerの使い方、Dockerのメリット・デメリットについて記載します。</p>



<h2 class="wp-block-heading">DockerのインストールとHello World!</h2>



<p>Dockerは小さな仮想PCです。Dockerを使用するには、「<a href="https://docs.docker.com/desktop/">Docker Desktop</a>」をインストールしましょう。</p>



<p>Docker Desktopをインストール出来たら、早速起動してみましょう。</p>



<pre class="wp-block-code"><code>% docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https:&#47;&#47;hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/</code></pre>



<p>%から始まる行が実行するコマンドです。ターミナルや、コマンドプロンプトから実行します。</p>



<p>このコマンドは、<strong>hello-world</strong>の<strong>Dockerイメージ</strong>をダウンロードして、<strong>起動</strong>する。という動きをします。</p>



<p>hello-worldのDockerイメージは、起動するとメッセージを表示するという処理が設定されたDockerイメージです。</p>



<p>Dockerがオフィシャルのイメージとして用意しています。</p>



<p>上記の表示が出来たら成功です。</p>



<h2 class="wp-block-heading">Dockerイメージ</h2>



<p>Dockerを起動するためには、イメージが必要になります。先ほどは、hello-worldのイメージをダウンロードして使用しました。</p>



<p>ダウンロードしたイメージを見てみましょう。</p>



<pre class="wp-block-code"><code>% docker images
REPOSITORY                                                                                       TAG       IMAGE ID       CREATED         SIZE
hello-world                                                                                      latest    ee301c921b8a   20 months ago   9.14kB</code></pre>



<p>はい、イメージがダウンロードされていますね。サイズも9.14kbと非常にコンパクトです。</p>



<p>Dockerイメージを使って起動させるためには、Dockerイメージを元にコンテナを作成する必要があります。</p>



<p>次は、Dockerコンテナを見てみましょう</p>



<h2 class="wp-block-heading">Dockerコンテナ</h2>



<p>Dockerコンテナは、Dockerイメージを元に作られます。Dockerを起動するということは、Dockerコンテナを起動させるという意味になります。</p>



<p>Dockerコンテナも作成/実行すると、次回の起動では、同じコンテナが起動します。</p>



<p>作成されたコンテナを見てみましょう。</p>



<pre class="wp-block-code"><code>% docker ps -a
CONTAINER ID   IMAGE                                                                                         COMMAND                   CREATED          STATUS                      PORTS                                      NAMES
fe1ca6a3c2b6   hello-world                                                                                   "/hello"                  14 minutes ago   Exited (0) 14 minutes ago                                              vigilant_brahmagupta</code></pre>



<p>存在してますね。docker run イメージ名を実行すると、新しくDockerコンテナが作成されます。</p>



<p>次は、Dockerコンテナを起動させてみましょう。</p>



<pre class="wp-block-code"><code>% % docker container  start -a vigilant_brahmagupta

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https:&#47;&#47;hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
pta</code></pre>



<p>さっきと同じ表示が出てきました。vigilant_brahmaguptaがDockerコンテナ名です。</p>



<p>今回は、Dockerコンテナからの起動を行ったため、Dockerイメージのダウンロードが発生しませんでした。これも大事なことです。毎回ダウンロードが行われるのでは、遅くて使い物になりませんよね。</p>



<p>-aオプションを使用しているのは、標準出力を確認するためです。-aオプションを使わないで実行するとどうなるのかも確認しておくと良いです。</p>



<h2 class="wp-block-heading">Dockerのメリット</h2>



<p>Dockerを使用するメリットは、たくさんありますが、特に思いつくことを紹介します。</p>



<ul class="wp-block-list">
<li>Dockerコンテナ内に必要なものがインストールされるため、ホストPCに不要なライブラリなどをインストールする必要がない。ホストPCとは完全に独立した環境を用意することができます。</li>



<li>システム開発を行っていると、PCに複数の開発環境が作成されていることが多くあると思います。この環境をDockerコンテナに閉じ込めることで、複数の環境があったとしても、それぞれが依存することなく綺麗に開発環境を構築することができます。</li>



<li>本番環境でも、Dockerコンテナをベースとして構築することで、本番環境とかなり近い環境で開発を進めて行くことができます。</li>



<li>考えると他にもたくさんありそうです。Dockerを使用し、扱いに慣れておくことを強くおすすめします。</li>
</ul>



<h2 class="wp-block-heading">Dockerのデメリット</h2>



<p>Dockerを使用するデメリットは、、、ほとんど無いんですが、強いてあげるとすれば学習コストが必要になることです。</p>



<p>これまでは、開発環境が必要になると専用のPCを用意して、OSをインストールしてDBをインストールしてなど、結構な労力が必要でした。</p>



<p>Dockerを使う場合でも、OSの知識が必要になったりすることはもちろんあります。</p>



<p>そのための学習コストはどうしても必要になってきます。</p>



<h2 class="wp-block-heading">Dockerの次のステップ</h2>



<p>Dockerは面白く、奥が深いです。伝えたいことが他にもあります。</p>



<p>これは別の記事にします。次のステップでは、下記のことをとりあげたいと思います。</p>



<ul class="wp-block-list">
<li>Dockerビルド</li>



<li>Dockerfile</li>



<li>Docker Compose</li>



<li>Docker Volume</li>
</ul>



<h2 class="wp-block-heading">まとめ</h2>



<p>Dockerは今後も必ず使っていく技術になります。Dockerよりも別の、ものができてくる可能性もありますが、仮想化の技術がなくなることはありません。<br>今のうちにDockerの仕組みを理解し、今の開発スタイルに慣れておきましょう。</p>



<p>それでは、次の記事をお楽しみに。</p>



<p></p>
<p>投稿 <a href="/2025/01/19/105/">Dockerの基礎知識その1</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPのオブジェクトclone</title>
		<link>/2025/01/18/39/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Sat, 18 Jan 2025 14:33:43 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=39</guid>

					<description><![CDATA[<p>PHPには、クローン(clone)という仕組みがあります。この仕組みを使うとインスタンスのコピーを作成することができます。 この記事を理解すると、PHPのcloneの使い方、cloneの仕組み、cloneの使い所が分かり...</p>
<p>投稿 <a href="/2025/01/18/39/">PHPのオブジェクトclone</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>PHPには、クローン(clone)という仕組みがあります。この仕組みを使うとインスタンスのコピーを作成することができます。</p>



<p>この記事を理解すると、PHPのcloneの使い方、cloneの仕組み、cloneの使い所が分かります。</p>



<h3 class="wp-block-heading">cloneの使い方</h3>



<p>早速cloneの使い方を見てましょう。</p>



<pre class="wp-block-code"><code>&lt;?php

$now = new DateTime();

$tomorrow = clone $now;
$tomorrow->modify("+1 day");

echo $now->format("Y-m-d") . "\n";
echo $tomorrow->format("Y-m-d") . "\n";

?>
</code></pre>



<p>実行すると、この結果となりました<br>2025-01-18<br>2025-01-19</p>



<p>$nowが1/18<br>$tomorrowが1/19として意図した通りにcloneが作成されました。</p>



<p>PHPのcloneは、ディープコピーを作成するということになります。</p>



<h3 class="wp-block-heading">cloneの仕組み</h3>



<p>次は、cloneの仕組みを理解するために、cloneを使わない場合の失敗例を見てみます。</p>



<pre class="wp-block-code"><code>&lt;?php

$now = new DateTime();

$tomorrow = $now;
$tomorrow->modify("+1 day");

echo $now->format("Y-m-d") . "\n";
echo $tomorrow->format("Y-m-d") . "\n";

?>
</code></pre>



<p>実行すると、この結果となりました<br>2025-01-19<br>2025-01-19</p>



<p>modifyを使って1日後を$tomorrowに設定していますが、$nowの変数まで1日後になっています。</p>



<p>インスタンスの代入は、cloneを使わない場合、元になるインスタンスへの参照となってしまうということが分かりました。<br>単純に代入では、インスタンスのコピーは作成されない。</p>



<p>この動きをシャローコピーと呼び、コピーがコピー元のオブジェクトを参照します。</p>



<p>インスタンスをコピーして、別のインスタンスを作成したい場合は、cloneを使って別のインスタンスを作らないといけないですね。</p>



<h3 class="wp-block-heading">まとめ</h3>



<p>いかがでしょうか？cloneの仕組み、使い方、使いどころが理解できましたか？</p>



<p>今回のサンプルのソースのように、日付のcloneを作成したいケースはあるかもしれないですね。</p>



<pre class="wp-block-code"><code>&lt;?php

$now = new DateTime();

$tomorrow = $now;
$tomorrow->modify("+1 month");

if ($now &lt;= $date &amp;&amp; $date &lt; $tomorrow) {
  echo "date変数は、今日から一ヶ月以内の日付です";
}

?></code></pre>



<p>こんな使い方ができますね。</p>



<p>個人的には、ほとんど使ったことがありません。いつかcloneを使っているソースを読むことがあるかもしれないので、PHPにはそんな仕組みがあったなと思い出してください。</p>



<p></p>
<p>投稿 <a href="/2025/01/18/39/">PHPのオブジェクトclone</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPの関数の作り方、使い方</title>
		<link>/2025/01/16/33/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Thu, 16 Jan 2025 13:24:31 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=33</guid>

					<description><![CDATA[<p>PHPの関数は、複数の処理を一つにまとめたソースのブロックです。 関数を使用することで、ソースの再利用性が向上することや、可読性が高くなるなど、プログラムをより効率的に構築していくことができます。 関数の概念は、PHP以...</p>
<p>投稿 <a href="/2025/01/16/33/">PHPの関数の作り方、使い方</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>PHPの関数は、複数の処理を一つにまとめたソースのブロックです。</p>



<p>関数を使用することで、ソースの再利用性が向上することや、可読性が高くなるなど、プログラムをより効率的に構築していくことができます。</p>



<p>関数の概念は、PHP以外の他のプログラミング言語でも必ず存在する、プログラミングの基本とも言えるものです。</p>



<p>この記事を理解し、プログラミングの基本を身につけていきましょう。</p>



<h3 class="wp-block-heading">組み込み関数</h3>



<p>PHPには多くの組み込み関数があり、文字列の操作や、配列の操作、日付、ファイル、セッション管理など、さまざまな処理を実行することができるようになっています。</p>



<p>このブログでもよく使う組み込み関数をいくつか紹介します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>echo</td><td>指定の値を標準出力に書き出します</td></tr><tr><td>strlen</td><td>文字列の長さを取得します</td></tr><tr><td>date</td><td>現在の日付と時刻を文字列で取得します</td></tr><tr><td>file_get_contents</td><td>ファイルの内容を文字列として読み込みます</td></tr><tr><td>implode</td><td>配列を結合して文字列を作ります</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">ユーザー定義関数と引数</h3>



<p>プログラマーは、組み込み関数を組み合わせて、独自の関数を作ることができます。</p>



<p>この関数をユーザー定義関数と呼びます。</p>



<p>ユーザー定義関数にも、組み込み関数と同様に、<span style="text-decoration: underline;">引数</span>、<span style="text-decoration: underline;">戻り値</span>、<span style="text-decoration: underline;">初期値</span>の設定があります。</p>



<p>ユーザー定義関数は、このように作成します。</p>



<pre class="wp-block-code"><code>&lt;?php

function hello($name = "PHP") {
  echo "Hello! " . $name . "\n";
}

// 引数なしで呼び出す
hello();

// 引数ありで呼び出す
hello("M&amp;Co.");

?></code></pre>



<p>このPHPを動かすとこのように表示されます。</p>



<p><em>引数なしの場合</em></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Hello! PHP</p>
</blockquote>



<p><em>引数ありの場合</em></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Hello! M&amp;Co.</p>



<p>引数が無しの場合は、初期値の「PHP」が$nameの変数に設定されるため、「Hello! PHP」と表示されます。</p>



<p>引数を指定する場合は、$nameの変数には、引数で指定する「M&amp;Co.」が設定されます。</p>
</blockquote>



<h3 class="wp-block-heading">複数の引数</h3>



<pre class="wp-block-code"><code>引数は、一つだけではなく、幾つでも複数指定することができます。

&lt;?php

function sum_function($a, $b, $c, $d, $e) {
  return $a + $b + $c + $d + $e;
}

$sum = sum_function(1, 2, 3, 4, 5);
echo $sum;

?></code></pre>



<p>このPHPを実行すると、引数が全て足し算されて、「15」が結果として表示されます。</p>



<p>これは５つの引数を使えるようにしましたが、必要に応じてもっと増やすことも可能です。</p>



<p>ユーザー定義関数の作成者が自由に引数が使えるように、作成することができますが、あまりにも多い引数は、せっかくの可読性を高くするためのユーザー定義関数も、使いづらいものとなってしまいます。</p>



<p>なるべく、コンパクトで処理の分かりやすい関数を作っていくことをお勧めします。</p>



<h3 class="wp-block-heading">戻り値</h3>



<p>次は、戻り値について確認してみましょう。</p>



<pre class="wp-block-code"><code>&lt;?php

function hello($name = "PHP") {
  echo "Hello! " . $name . "\n";

  return strlen($name);
}

// 引数なしで呼び出す
$len = hello();
echo $len . "\n";

// 引数ありで呼び出す
$len = hello("M&amp;Co.");
echo $len . "\n";

?></code></pre>



<p>ユーザー定義関数にreturnを記述すると、関数内の処理が終了し、関数を呼び出した処理に返ってきます。</p>



<p>returnは「処理を返す」などと言われることがあります。処理を返すタイミングで何かの値を同時に返すことができます。</p>



<p>関数を実行した結果を返し、処理が成功したのか、失敗したのかを判断するなど、ユーザー(ユーザー定義関数の作成者)が自由に関数を作成することができます。</p>



<p>上記のサンプルでは、引数の$nameの文字列の長さを返すようにしています。</p>



<p></p>



<h3 class="wp-block-heading">匿名関数</h3>



<p>PHPには、名前を持たない匿名関数を作ることもできます。使い方によっては、コードをきれいに書けたり、さらに可読性の高いコードにしていくことも可能です。</p>



<p>匿名関数は、変数に関数を代入して使用することができます。</p>



<pre class="wp-block-code"><code>&lt;?php

$sum = function($a, $b) {
  return $a + $b;
}

$sub = function($a, $b) {
  return $a - $b;
}

$res = $sum(1, 2);
echo $res . "\n";

$res = $sub(1, 2);
echo $res . "\n";

?></code></pre>



<p>あまりいいサンプルではないですが、匿名関数の使い方が見えると思います。</p>



<p>実行した結果は、この通りです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>3<br>-1</p>
</blockquote>



<h3 class="wp-block-heading">まとめ</h3>



<p>プログラミングをする上で、ユーザー定義関数も大事なことです。</p>



<p>ユーザー定義関数をうまく作れることが、良いプログラマーの一つの条件だと思います。</p>



<p>ユーザー定義関数は、関数名を見るだけで、どんな処理を行う関数なのかが分かるように作るのが上達のコツです。</p>



<p>練習だと思って、いろんな関数を作って実行して、プログラミングの経験をしてください。</p>



<p>ある程度のプログラムが出来たら、同じ処理をするプログラムとして、作り直すのも良い勉強になります。</p>



<p></p>



<p></p>
<p>投稿 <a href="/2025/01/16/33/">PHPの関数の作り方、使い方</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CORS(Cross-Origin Resource Sharing)</title>
		<link>/2025/01/16/68/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Wed, 15 Jan 2025 15:23:06 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=68</guid>

					<description><![CDATA[<p>CORSは、Webブラウザが異なるサーバー間でリソースを安全に共有できるようにするセキュリティ機能です。 通常、同一オリジンポリシー(Same-Origin-Policy)が適用され、異なるサーバー(ドメイン)からのリク...</p>
<p>投稿 <a href="/2025/01/16/68/">CORS(Cross-Origin Resource Sharing)</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>CORSは、Webブラウザが異なるサーバー間でリソースを安全に共有できるようにするセキュリティ機能です。</p>



<p>通常、同一オリジンポリシー(Same-Origin-Policy)が適用され、異なるサーバー(ドメイン)からのリクエストはブロックされます。CORSを使用することで、異なるサーバー間からのリクエストを許可することができます。</p>



<p>この記事ではCORSについて学んでいきます。</p>



<p>Webアプリケーションを構築していくとCORSについての理解が必要になってきます。</p>



<p>CORSを理解していないと、解決できない問題にぶつかることも少なくないです。</p>



<p>ここでしっかりCORSを理解し、Webアプリケーションの開発をしていきましょう。</p>



<p></p>



<h3 class="wp-block-heading">同一オリジンポリシーとは</h3>



<p>同一オリジンポリシーは、Webブラウザがセキュリティのために使用するポリシーです。</p>



<p>一般的なブラウザでは、このポリシーが実装されており、異なるオリジンへのリクエストを制限します。</p>



<p>オリジンは、下記の要素から決まります。一つでも異なる場合は、異なるオリジンとしてブラウザは動作します。</p>



<ul class="wp-block-list">
<li>スキーム(http、httpsなど)</li>



<li>ドメイン</li>



<li>ポート番号</li>
</ul>



<h3 class="wp-block-heading">CORSの仕組み</h3>



<p>CORSは、サーバーが特定のヘッダーを使用して、どのオリジンからのリクエストを受け付けるかを判断します。</p>



<p><strong>主なCORSヘッダー</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Access-Control-Allow-Origin</td><td>リクエストを許可するオリジンを指定します</td></tr><tr><td>Access-Control-Allow-Methods</td><td>許可するHTTPメソッドを指定します</td></tr><tr><td>Access-Control-Allow-Headers</td><td>許可するカスタムヘッダーを指定します</td></tr><tr><td>Access-Control-Allow-Credentials</td><td>認証情報の送信を許可するかを指定します</td></tr><tr><td>Access-Control-Max-Age</td><td>プリフライトリクエストの結果をキャッシュする時間を指定します</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">プリフライトリクエスト</h3>



<p>プリフライトリクエストは、CORSのリクエストの一つです。<br>サーバーがCORSプロトコルを理解していて準備がされていることを、OPTIONSのメソッドと下記のヘッダーを使用してチェックします。</p>



<ul class="wp-block-list">
<li>Access-Control-Request-Method</li>



<li>Access-Control-Request-Headers</li>



<li>Origin</li>



<li></li>
</ul>



<p>プリフライトリクエストはブラウザが自動的に行います。</p>



<p>このリクエストをして、実際のリクエストを送信することができるかどうかを確認します。</p>



<h3 class="wp-block-heading">CORSの利点と注意点</h3>



<p><strong>利点</strong></p>



<ul class="wp-block-list">
<li>適切に設定することで、許可されていないオリジンからの不正なリクエストを防ぐことができる</li>



<li>特定のオリジンやメソッド、ヘッダーを許可することで必要なリソースへ安全にアクセスさせることができる</li>
</ul>



<p><strong>注意点</strong></p>



<ul class="wp-block-list">
<li>Access-Control-Allow-Originに＊(ワイルドカード)の使用することはやめましょう。特定のオリジンのみ許可すること</li>



<li>CORSエラーはブラウザのConsoleやNetworkに表示されますが、詳細な原因までは表示されません。そのため、原因を特定することが難しいことが多いです</li>
</ul>



<h3 class="wp-block-heading">まとめ</h3>



<p>CORSは異なるサーバー間でのリクエストを制限し、Webアプリケーションのセキュリティと柔軟性を高める重要な仕組みです。</p>



<p>適切に設定し、不正なアクセスを防ぎ安全なWebアプリケーションを開発していくように心がけましょう。</p>
<p>投稿 <a href="/2025/01/16/68/">CORS(Cross-Origin Resource Sharing)</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>HTTPについて</title>
		<link>/2025/01/15/70/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Wed, 15 Jan 2025 14:25:54 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=70</guid>

					<description><![CDATA[<p>HTTPとは、Hypertext Transfer Protocolと言って、インターネット上のデータにアクセスするための決められたルールのことです。 私たちが何気なく使っているChromeやEdgeも、HTTPを使って...</p>
<p>投稿 <a href="/2025/01/15/70/">HTTPについて</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>HTTPとは、Hypertext Transfer Protocolと言って、インターネット上のデータにアクセスするための決められたルールのことです。</p>



<p>私たちが何気なく使っているChromeやEdgeも、HTTPを使ってインターネットにアクセスするという動きをしています。</p>



<p>ここでは、HTTPとは何か、どのように使うのか。 WEB系のプログラミングでは必須の知識となる、HTTPを理解していきましょう。</p>



<h3 class="wp-block-heading">HTTPの基本</h3>



<p>ブラウザに「https://www.google.co.jp/」のURLを入力すると、google.co.jpのWEBサーバーにHTTP接続し、URLにあったデータを取得します。（リクエスト)</p>



<p>ブラウザからURLを入力すると、基本的にはhtmlがレスポンスとしてダウンロードされて画面に表示されます。(レスポンス)</p>



<p>HTTPの基本は、URLを使ってリクエストをすると、何らかのレスポンスが返ってくるというシンプルなものです。</p>



<h3 class="wp-block-heading">WEBアプリケーションで使うために意識すること</h3>



<p>HTTPリクエストを行うと、先にはWEBサーバーがいます。WEBサーバーは、nginxや、apacheが使われていることが多いです。</p>



<p>WEBサーバーがリクエストを受け取ると、受け取った内容によって、どんな処理をしてクライアントにレスポンスするのかを決定します。</p>



<p>リクエストの内容はいくつか覚えていただきたいことがあります。</p>



<p>大きく下記の５つの要素によって、PHPアプリケーションは振る舞いを変えます。</p>



<h3 class="wp-block-heading">リクエストメソッド</h3>



<p>GET HEAD POST PUT DELETE OPTIONS PATCHの7種類があります。他にもありますが、他のメソッドは使ったことがないです。ほとんど使うこともないと思います。</p>



<p> 興味がある方は、こちらを参照ください。 <a href="https://developer.mozilla.org/ja/docs/Web/HTTP/Methods">https://developer.mozilla.org/ja/docs/Web/HTTP/Methods</a></p>



<h3 class="wp-block-heading">リクエストヘッダー</h3>



<p>リクエストヘッダーは、HTTPリクエストの一部です。＊と良く書かれているのを見かけます。 クライアントからWEBサーバーにリクエストする際に、リクエストの内容を補助する情報がリクエストヘッダーには指定します。</p>



<p>Content-Typeや、Content-Lengthなどさまざまなヘッダーがあります。</p>



<p>リクエストボディに合わせたリクエストヘッダーを設定します。</p>



<h3 class="wp-block-heading">リクエストボディ</h3>



<p>リクエストボディは、クライアントからサーバーに送信されるデータ本体です。</p>



<p>リクエストボディには、このようなデータが含まれます。</p>



<ul class="wp-block-list">
<li>フォームデータ</li>



<li>JSONやXMLなどの構造化されたデータ</li>



<li>ファイルデータ(バイナリ)</li>
</ul>



<h3 class="wp-block-heading">クエリパラメータ</h3>



<p>クエリパラメータは、必要なリソースを識別したり、リソースのフィルタリングや、ソートなどの操作をするために使用されることが多いです。</p>



<p>リソースというのは、サーバー内容にある情報全てを指します。DBに保存されたレコードや、htmlやcssなどの実ファイルもリソースです。</p>



<p><em>クエリパラメータの使い方</em></p>



<pre class="wp-block-code"><code>https:&#47;&#47;m-and.co/files/?page=1&amp;sort=asc
</code></pre>



<h3 class="wp-block-heading">パスパラメータ</h3>



<p>パスパラメーターは、リソースを特定するために使用します。RESTFul APIやWebアプリケーションでは、リソースをパスパラメーターで指定し、リクエストメソッドの種類によって、どのようにリソースを操作するのかを決定します。</p>



<p>パスパラメータは、URLの一部として使用されます。それに対してクエリパラメータは、URLの末尾に?を付与して使用します。</p>



<p><em>パスパラメータの使い方</em></p>



<pre class="wp-block-code"><code>https:&#47;&#47;m-and.co/files/1/asc
</code></pre>



<h3 class="wp-block-heading">まとめ</h3>



<p>Webアプリケーションを構築するためには、HTTPの理解が必ず必要です。これは、PHPでも、PythonやRubyでも同じです。</p>



<p>この記事では、HTTPの基本的なことを紹介しました。まずは、この記事の内容を理解してWebアプリケーションの開発をしていきましょう。</p>



<p></p>
<p>投稿 <a href="/2025/01/15/70/">HTTPについて</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPの配列変数の扱い方</title>
		<link>/2025/01/13/35/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Mon, 13 Jan 2025 14:34:33 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=35</guid>

					<description><![CDATA[<p>配列は変数の一種です。通常の変数と違い、配列の場合は連続したデータを一つの変数として扱うことができるようになります。 配列は他のプログラミング言語でも存在し、プログラミングをする上で必須となる知識の一つです。 この記事で...</p>
<p>投稿 <a href="/2025/01/13/35/">PHPの配列変数の扱い方</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>配列は変数の一種です。通常の変数と違い、配列の場合は連続したデータを一つの変数として扱うことができるようになります。</p>



<p>配列は他のプログラミング言語でも存在し、プログラミングをする上で必須となる知識の一つです。</p>



<p>この記事では、PHPの配列について説明していきます。</p>



<p>この記事を理解することで、配列とはどんな変数なのか、どのように扱うのかを理解することができます。</p>



<h2 class="wp-block-heading">配列とは</h2>



<p>配列とは、0から順番にインデックスされた連続したデータの集まりです。</p>



<p>このように初期化して使用します。</p>



<pre class="wp-block-code"><code>&lt;?php

$signal = array("黄", "赤", "青");

?></code></pre>



<p>信号は、黄、赤、青の順番で変わっていきます。このように配列で表現すると分かりやすいです。<br>＊信号ってsignalで正しいのかな。</p>



<p>配列の定義の仕方は上記の通りです。</p>



<p>信号の配列の黄を表示させてみましょう。</p>



<pre class="wp-block-code"><code>&lt;?php

$signal = array("黄", "赤", "青");
echo $signal&#91;0];

?>
このように0のインデックスを指定すると一番最初の要素にアクセスすることができます。

少し動かしてみます。</code></pre>



<pre class="wp-block-code"><code>&lt;?php

$signal = array("黄", "赤", "青");
for ($i = 0; $i &lt; count($signal); $i++) {
  echo $signal&#91;$i];
  sleep(1);
}
?>
このプログラムを動かすと、黄、赤、青の順に1秒感覚で表示されます。
echoの後にあるsleep関数は、1秒間処理を停止させるという動きをする関数です。
関数についても別の記事で説明します。

forループにより、$iの変数が0から2までインクリメントされます。
このプログラムをループを使わずに書くと、このようになります。</code></pre>



<pre class="wp-block-code"><code>&lt;?php

$signal = array("黄", "赤", "青");

echo $signal&#91;0];
sleep(1);

echo $signal&#91;1];
sleep(1);

echo $signal&#91;2];
sleep(1);

?></code></pre>



<p></p>



<h3 class="wp-block-heading">配列の別の初期化の仕方</h3>



<p>配列の初期化の仕方には、別の方法もあります。紹介しておきます。</p>



<pre class="wp-block-code"><code>&lt;?php

// 配列の&#91;]を使って短縮構文でも使用することができます。
// こっちの方が今らしい気がします。
// どちらでも同じです。
$signal = &#91;"黄", "赤", "青"];

$signal = array("黄", "赤", "青");

?></code></pre>



<h3 class="wp-block-heading">配列の扱い</h3>



<p>配列は、初期化した後に要素を追加、変更、削除、検索、ソートすることができます。</p>



<p>この操作が出来ることにより、大量に読み込んだデータから検索したり、必要なデータだけ取り出したり、配列のメモリ上で高速にデータ処理をすることができます。</p>



<p>それでは、追加、変更、削除、検索、ソートのやり方を見てみます。</p>



<h3 class="wp-block-heading">配列のデータ操作</h3>



<p>まずは、要素の追加をしてみます。ちょっと信号だと合わないですね。</p>



<p>そうだ。こうしましょう。焼き鳥屋さんに行って注文をしていく様子。</p>



<pre class="wp-block-code"><code>&lt;?php

// まずは、入店して２つの注文
$orders = &#91;"お通し", "ビール"];

// 次に焼き鳥の注文を追加します
array_push($orders, "ねぎま");
// 短縮構文を使って注文を追加します
$orders&#91;] = "ビール";</code></pre>



<p>?></p>



<p>これで$ordersの配列には、「お通し、ビール、ねぎま、ビール」の４つの注文が入っています。</p>



<p></p>



<p>次は、配列を変更してみましょう。</p>



<pre class="wp-block-code"><code>&lt;?php

// まずは、入店して２つの注文
$orders = &#91;"お通し", "ビール"];

// 次に焼き鳥の注文を追加します
array_push($orders, "ねぎま");
// 短縮構文を使って注文を追加します
$orders&#91;] = "ビール";

$orders&#91;3] = "ハイボール";

?></code></pre>



<p>$orders[3]をハイボールに変更しました。これは最後に注文したビールをハイボールに変更しました。</p>



<p>3というのは、配列の４番目という意味になります。</p>



<p>配列は、0のインデックスから始まるからです。2番目を変更する場合は、$orders[1]として1を使用します。</p>



<p>次は配列から要素を削除します。3番目の「ねぎま」の注文をキャンセルしてみます。</p>



<pre class="wp-block-code"><code>&lt;?php

// まずは、入店して２つの注文
$orders = &#91;"お通し", "ビール"];

// 次に焼き鳥の注文を追加します
array_push($orders, "ねぎま");
// 短縮構文を使って注文を追加します
$orders&#91;] = "ビール";

$orders&#91;3] = "ハイボール";

array_splice($orders, 2, 1);

?></code></pre>



<p>配列から要素を削除するには、array_spliceを使用するのがシンプルで分かりやすいです。</p>



<p>このarray_splice関数は、このように使います。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>第一引数</td><td>要素を削除したい配列変数</td></tr><tr><td>第二引数</td><td>削除する要素のインデックス</td></tr><tr><td>第三引数</td><td>何個の要素を削除するか</td></tr></tbody></table></figure>



<p>上記のサンプルだと、$orders配列の<strong>2</strong>のインデックスから<strong>1</strong>個の要素を削除する。という意味になります。</p>



<p>次は、配列から要素を検索する方法を見ていきます。</p>



<pre class="wp-block-code"><code>&lt;?php

// まずは、入店して２つの注文
$orders = &#91;"お通し", "ビール"];

// 次に焼き鳥の注文を追加します
array_push($orders, "ねぎま");
// 短縮構文を使って注文を追加します
$orders&#91;] = "ビール";

$orders&#91;3] = "ハイボール";

array_splice($orders, 2, 1);

$index = array_search("ビール", $orders, true);
echo $orders&#91;$index];

?></code></pre>



<p>このサンプルを実行すると、ビールが表示されます。$orders[$index]には、ビールが値として入っています。</p>



<p>array_search関数は、配列からビールの文字列を検索して、見つかったインデックスを取得することができるということです。</p>



<p>最後にソートをしてみます。ソートは、少し難しいかもしれないです。<br>ソートされたのが分かりやすいようにサンプルを変更して書いてみます。</p>



<pre class="wp-block-code"><code>&lt;?php

// バラバラの数字を配列に初期化します
$numbers = &#91;10, 8, 6, 4, 5, 7, 20];

sort($numbers);

foreach ($numbers as $n) {
  echo $n . "\n";
}

?></code></pre>



<p>PHPにはソート用の関数が複数用意されています。今回は、一番簡単なsort関数を使ってみました。</p>



<p>これを実行すると、数値が小さい順に表示されます。</p>



<p>他の関数の使い方は、また別の記事で紹介します。</p>



<p>興味のある方は、PHPマニュアルを見てみてください。</p>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://www.php.net/manual/ja/array.sorting.php
</div></figure>



<h3 class="wp-block-heading">まとめ</h3>



<p>配列について基本的な操作を紹介しました。配列は他のプログラミング言語でも存在します。</p>



<p>大体どんなプログラミング言語でも、追加、変更、削除、検索、ソートくらいの操作は行うことができます。配列の基本を理解しておくと、他の言語を扱う場合でも、少し勉強するだけで、使用することができるはずです。</p>



<p>この配列は、実務でも必ず使用します。この記事をしっかり読み込み理解し、配列の扱い方を学びましょう。</p>



<p></p>
<p>投稿 <a href="/2025/01/13/35/">PHPの配列変数の扱い方</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPで使用できる演算子について</title>
		<link>/2025/01/13/31/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Mon, 13 Jan 2025 03:24:13 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=31</guid>

					<description><![CDATA[<p>演算子とは、PHPだけではなく他のプログラミング言語でも必ず存在するものです。 何かの値に対して演算子を使用すると別の値を結果として返すものです。 足し算引き算などの基本的な四則演算や、値の比較を行う比較演算など様々な演...</p>
<p>投稿 <a href="/2025/01/13/31/">PHPで使用できる演算子について</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>演算子とは、PHPだけではなく他のプログラミング言語でも必ず存在するものです。</p>



<p>何かの値に対して演算子を使用すると別の値を結果として返すものです。</p>



<p>足し算引き算などの基本的な四則演算や、値の比較を行う比較演算など様々な演算子があります。</p>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>この記事を読むと、プログラミングをするためには必ず使用する「演算子」にはどんなものがあるか。<br>どのように使用するのかを理解することができます。</p>
</blockquote>



<p></p>



<h3 class="wp-block-heading">算術演算子</h3>



<p>算術演算子は、小学校や中学校で学ぶような基本的な演算をするために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>+$a</td><td>変数を数値に変換する</td></tr><tr><td>-$a</td><td>変数を負の数値に変換する</td></tr><tr><td>+</td><td>足し算をします(加算)</td></tr><tr><td>&#8211;</td><td>引き算をします(減算)</td></tr><tr><td>*</td><td>掛け算をします(乗算)</td></tr><tr><td>/</td><td>割り算をします(除算)</td></tr><tr><td>%</td><td>余りを計算します(余剰)</td></tr><tr><td>**</td><td>乗算をします(累乗)</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">代入演算子</h3>



<p>代入演算子は、変数に、値を代入するために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>=</td><td>変数に値を代入します</td></tr><tr><td>+=</td><td>変数に加算した値を代入します</td></tr><tr><td>-=</td><td>変数に減算した値を代入します</td></tr><tr><td>*=</td><td>変数に乗算した値を代入します</td></tr><tr><td>/=</td><td>変数に除算した値を代入します</td></tr><tr><td>%=</td><td>変数に剰余した値を代入します</td></tr><tr><td>**=</td><td>変数に累乗した値を代入します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">ビット代入演算子</h3>



<p>ビット代入演算子は、代入演算子の一つです。ビット演算した結果を変数に代入するために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&amp;=</td><td>変数にAND演算をした結果を代入します</td></tr><tr><td>|=</td><td>変数にOR演算をした結果を代入します</td></tr><tr><td>^=</td><td>変数にNOT演算をした結果を代入します</td></tr><tr><td>&lt;&lt;=</td><td>変数に左シフトをした結果を代入します</td></tr><tr><td>>>=</td><td>変数に右シフトをした結果を代入します</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">配列演算子</h3>



<p>配列演算子は、配列に対して演算するために使用します。<br><s>とPHPマニュアルには書かれていますが、</s></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>+</td><td>配列を結合するために使用します</td></tr><tr><td>==</td><td>配列を比較し、キー/値のペアが等しい場合はtrueの結果を返します</td></tr><tr><td>===</td><td>配列を比較し、キー/値/並び順のペア、並び順/データ型が等しい場合はtrueの結果を返します</td></tr><tr><td>!=</td><td>配列を比較し、等しくない場合はtrueの結果を返します</td></tr><tr><td>&lt;></td><td>配列を比較し、等しくない場合はtrueの結果を返します</td></tr><tr><td>!==</td><td>配列を比較し、等しくない場合はtrueの結果を返します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">ビット演算子</h3>



<p>ビット演算子は、数値のビットの評価や操作を行うために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&amp;</td><td>AND演算をするために使用します</td></tr><tr><td>^</td><td>XOR演算をするために使用します</td></tr><tr><td>|</td><td>OR演算をするために使用します</td></tr><tr><td>&lt;&lt;</td><td>左シフト演算をするために使用します</td></tr><tr><td>>></td><td>右シフト演算をするために使用します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">比較演算子</h3>



<p>比較演算子は、２つの値を比較するために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>==</td><td>型の変換をした値を比較し、等しい場合にtrueを返します</td></tr><tr><td>===</td><td>値と型が等しい場合にtrueを返します</td></tr><tr><td>!=</td><td>型の変換をした値を比較し、等しくない場合にtrueを返します</td></tr><tr><td>!==</td><td>値と型が等しくない場合にtrueを返します</td></tr><tr><td>&lt;></td><td>値と型が等しくない場合にtrueを返します</td></tr><tr><td>&lt;</td><td>$aと$bより少ない場合にtrueを返します</td></tr><tr><td>&lt;=</td><td>$aと$bより少ないか等しい場合にtrueを返します</td></tr><tr><td>></td><td>$aと$bより多い場合にtrueを返します</td></tr><tr><td>>=</td><td>$aと$bより多いか等しい場合にtrueを返します</td></tr><tr><td>&lt;=></td><td>$aが$bより小さい場合は、0より小さい整数。<br>$aが$bと等しい場合は、0。<br>$aが$bより大きい場合は、0より大きい整数。</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">実行演算子</h3>



<p>実行演算子は、特殊な演算子です。PHPの処理内でシェルスクリプトを実行し、実行した結果を変数に代入するために使用します。</p>



<p>この演算子は、使い方によっては、危険な処理となることもあるため、環境によっては使用できない設定がされていることがあります。</p>



<p>動作しない場合は、php.iniのdisable_functionsの設定を確認しましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&#8220;(バッククォート)</td><td>シェルスクリプトを実行した結果を変数に代入します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">エラー制御演算子</h3>



<p>エラー制御演算子は、PHPの式で発生したエラーを無視したい場合に使用します。</p>



<p>エラーが起こることが正常な場合もあります。使用する場合は、理解して使用するように気をつけましょう。思わぬバグとなることがあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>@</td><td>エラーを無視する場合に使用します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">加算子 / 減算子</h3>



<p>加算子と減算子は、値をインクリメント(１を加算する)・デクリメント(1を減算する)するために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>++$a</td><td>$aを加算した結果を返します</td></tr><tr><td>$a++</td><td>$aを返してから加算します</td></tr><tr><td>&#8211;$a</td><td>$aを減算した結果を返します</td></tr><tr><td>$a&#8211;</td><td>$aを返してから減算します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">論理演算子</h3>



<p>論理演算子は、２つの値を比較する論理演算をするために使用します。</p>



<p>プログミングをする上で非常に大事な演算になります。ここで、どんなものが存在するのかを確認し、実際に使用して試して必ず身につけていきましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&amp;&amp;</td><td>AND演算をした結果を返します</td></tr><tr><td>||</td><td>OR演算をした結果を返します</td></tr><tr><td>!</td><td>NOT演算をした結果を返します</td></tr><tr><td>and</td><td>AND演算をした結果を返します</td></tr><tr><td>xor</td><td>XOR演算子をした結果を返します</td></tr><tr><td>or</td><td>OR演算子をした結果を返します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">文字列演算子</h3>



<p>文字列演算子は、文字列の結合をするために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>.</td><td>２つの文字列を結合した結果を返します</td></tr><tr><td>.=</td><td>２つの文字列を結合した結果を変数に代入します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">型演算子</h3>



<p>型演算子は、オブジェクト化されたインスタンスが、指定されたクラスを元にオブジェクト化されているのかを判定するために使用します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>instanceof</td><td>インスタンス変数が、指定されたクラスを元にインスタンス化されている場合はtrueを返します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">三項演算子</h3>



<p>三項演算子は、if文と同等の制御をさせることができます。<br>初期値を設定するためにのみ使用することをおすすめします。</p>



<p>それ以外の用途で使いたい場合は、if文の使用を検討しましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>?:</td><td>最初の式がtrueとなる場合は、2番目の式を実行し、falseとなる場合は、3番目の式を実行します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">Null合体演算子</h3>



<p>Null合体演算子は、論理演算子の一種です。</p>



<p>三項演算子の?:に似ていると思います。これも初期値を設定するためにのみ使用しましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>??</td><td>最初の式がnullかundefinedの場合に、2番目の式を実行します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">クローン演算子</h3>



<p>クローン演算子は、オブジェクトのコピーを生成するために使用します。</p>



<p>詳しくは、別の記事に書きます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>clone new</td><td>詳しくはこちら</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">yield / yield from演算子(ジェネレーター)</h3>



<p>yieldは特殊な演算子？演算子ではないですね。yieldはジェネレーター関数から使用されます。</p>



<p>詳しくは、別の記事に書きます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>yield</td><td>詳しくはこちら</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">print演算子</h3>



<p>PHPのprint演算子は、特殊な演算子です。<br>標準出力に値を書き込むことができます。デバッグに使用することもあります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>print</td><td>標準出力に値を書き込むために使用します</td></tr></tbody></table></figure>



<p></p>



<h3 class="wp-block-heading">まとめ</h3>



<p>さまざまな演算子を紹介しました。実は、PHPには他にも多くの演算子が存在します。</p>



<p>ここでは、よく使われる基本的な演算子をまとめました。</p>



<p>全てよく使われるものです。それぞれ実際に使用して、どのような動きをするのかを理解しておきましょう。</p>



<p>最初は、どれを使うのかが分からないと思いますが、「何をしたいのか」を理解することができるようになると、「どれを使うのか」分かるようになってくるはずです。</p>



<p>分からなくても、少し思い出して情報を探すことができるようになってほしいと思います。</p>



<p>完全に暗記する必要はないです。難しく考えず、諦めずに繰り返し手を動かして、身につけていきましょう。</p>



<p></p>
<p>投稿 <a href="/2025/01/13/31/">PHPで使用できる演算子について</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cookie(クッキー)</title>
		<link>/2025/01/12/29/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Sun, 12 Jan 2025 04:37:43 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=29</guid>

					<description><![CDATA[<p>PHPにはHTTP Cookieを扱う仕組みがあり、クライアントが使用するブラウザに、文字列のデータを保存しておくことができます。 セッションと比較されることがありますが、大きく違うのはデータを保存する場所です。 セッシ...</p>
<p>投稿 <a href="/2025/01/12/29/">Cookie(クッキー)</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>PHPにはHTTP Cookieを扱う仕組みがあり、クライアントが使用するブラウザに、文字列のデータを保存しておくことができます。</p>



<p>セッションと比較されることがありますが、大きく違うのはデータを保存する場所です。</p>



<p>セッションは、サーバー内に保存されるのに対してCookieの場合は、クライアントのブラウザに保存されます。</p>



<h2 class="wp-block-heading">Cookieとセッションの違い</h2>



<p>Cookieはサーバー内ではなく、ブラウザに保存されます。保存された情報は、ブラウザからリクエストをするたびに、HTTPヘッダーに設定されて、自動的にサーバーに送信する動きをします。</p>



<p>ChromeブラウザなどのDeveloper ToolからNetworkを見ると、実際にCookieが設定されていることを見て確認することができます。</p>



<p>セッションと大きく違うのは、保存する場所です。セッションのデータはサーバー内に保存されているため、Developer Toolを使用しても見えません。</p>



<h3 class="wp-block-heading">Cookieの使いどころ</h3>



<p>Cookieはブラウザに保存され、リクエストをするとHTTPヘッダーに自動的に設定され、Developer Toolを使用すると見えてしまいます。</p>



<p>このことから、Cookieを使用する場合は、機密性が高い情報をCookieに使用することは適していません。</p>



<p>また、Cookieには、利用可能なデータ量に制限があり、4KBほどしか使用することはできません。</p>



<h3 class="wp-block-heading">使いどころまとめ</h3>



<p>それでは、Cookieは何に使用するのが適してるかということですが。</p>



<p>SESSIONよりも細かい設定をCookieデータごとに扱うことができます。</p>



<p>Cookieでは、下記の設定を行うことができます。</p>



<ul class="wp-block-list">
<li>有効期限</li>



<li>パス</li>



<li>ドメイン</li>



<li>セキュア</li>



<li>HttpOnly</li>
</ul>



<h2 class="wp-block-heading">Cookieの保存</h2>



<p>実際の使い方を見てみましょう。設定の内容についても少し説明します。</p>



<pre class="wp-block-code"><code>&lt;?php

setcookie(
  "SongTitle",
  "飾りじゃないのよ涙は",
  time() + 3600,
  "/",
  "llvl.handson",
  true,
  true,
  );
</code></pre>



<p>PHPでは、setcookie関数を使ってCookieの保存をすることができます。</p>



<p>第一引数(クッキーの名前)</p>



<p>SongTitleをクッキー名として保存します。後からSongTitleのクッキー名でデータの取得をすることができます。</p>



<p>第二引数(クッキーの値)</p>



<p>Cookieに保存するデータを文字列で指定します。オブジェクトを保存したい場合は、json_encodeを使うことができますが、大きい文字列は使えないので大きいデータを扱う場合はサイズに注意しましょう。</p>



<p>第三引数(有効期限)</p>



<p>クッキーの有効期限を指定することができます。指定方法は、UNIXタイムスタンプの形式で指定することになっています。</p>



<p>time関数で1970/1/1からの経過秒数を取得し、今から「いつまで」を有効期限にするかを指定しましょう。</p>



<p>上記のサンプルでは、実行した時間から3600秒後を有効期限としています。</p>



<p>第四引数(パス)</p>



<p>クッキーを有効にしたいパスを指定します。例えば、「<a href="https://llvl.handson/available%E3%80%8D%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%80%8Chttps://llvl.handson/unavailable%E3%80%8D%E3%81%8B%E3%82%89SongTitle%E3%81%AE%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC%E3%82%92%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E6%84%8F%E8%AD%98%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E6%A7%8B%E6%88%90%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E6%80%9D%E3%81%84%E5%87%BA%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82">https://llvl.handson/available」を指定した場合は、「https://llvl.handson/unavailable」からSongTitleのクッキーを参照することができなくなります。セキュリティを意識する必要がある構成の場合は、思い出してください。</a></p>



<p>第五引数(ドメイン)</p>



<p>クッキーを有効にしたいドメインを指定します。上記のサンプルでは、「<a href="https://llvl.handson/">https://llvl.handson/</a>」からのみ使用することができる設定となります。</p>



<p>Cookieを使用する場合は、この設定は必ず行いましょう。設定しない場合は、自分のPHPアプリケーションで設定したCookieが、他のサイトに漏洩することになります。</p>



<p>可能であれば、第四引数とセットで使用することをお勧めします。</p>



<p>第六引数(HTTPSのみにするかどうか)</p>



<p>ブラウザからPHPアプリケーションにアクセスするには、httpかhttpsでのアクセスをすることになります。第六引数は、Cookieの使用をhttpsのみに限定する場合はtrueを設定します。</p>



<p>trueに設定するものだと思えば良いです。気にせずtrueを使用しましょう。</p>



<p>第七引数(ブラウザからのアクセスのみにするかどうか)</p>



<p>PHPアプリケーションは、基本的にはブラウザからのアクセスを使用することが多いですが、JavaScriptのリクエストから使用されることもあります。</p>



<p>これをブラウザからのみのアクセスとして、JavaScriptからのアクセスは許可しない場合にtrueを設定します。</p>



<p>この設定については、作成するアプリケーションによって適切な内容が異なるため、どんなアプリケーションにするのかに合わせて設定を変更しましょう。</p>



<h2 class="wp-block-heading">Cookieの読み出し</h2>



<p>setcookieで保存したCookieは下記の方法で読み出すことができます。</p>



<pre class="wp-block-code"><code>&lt;?php

echo $_COOKIE&#91;"SongTitle"];

?&gt;
</code></pre>



<p>PHPではCookieの読み出しは、$_COOKIEのスーパーグローバル変数を使って読み出します。</p>



<p>・・・イマイチですよね。セッションもスーパーグローバル変数から読み出しますが、私はここは、PHPのいけてないところだと思います。</p>



<p>setcookieで保存したら、getcookieで読み出したと思ってしまうんですよね。</p>



<p>でも、安心してください。Laravel(ララベル）を使うとスーパーグローバル変数を使うことなんて無くなります。</p>



<ul class="wp-block-list">
<li>この記事は基礎知識として必要な知識となるため、仕方なく書いています。</li>
</ul>



<p>早くLaravelに進めたいです。</p>



<p>でも、Laravelを理解していくために基礎知識はあった方が良いので、いけてないとしても、理解だけはしておきましょう。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>Cookieはセッションと似ている一面がありますが、Cookieの場合はデータの保存場所がクライアントが使用するブラウザになるということを理解して使用するようにしましょう。</p>



<p>シンプルで小さく、機密性が低いデータを扱う場合のみCookieを使用することを検討しましょう。</p>



<p></p>
<p>投稿 <a href="/2025/01/12/29/">Cookie(クッキー)</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPのセッション</title>
		<link>/2025/01/10/27/</link>
		
		<dc:creator><![CDATA[kondo]]></dc:creator>
		<pubDate>Fri, 10 Jan 2025 01:13:04 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">:9000/?p=27</guid>

					<description><![CDATA[<p>TOC（目次） PHPにはセッションという仕組みがあり、ユーザーのデータを一時的に保存しておくことができます。 ユーザーがChromeやEdgeなどのブラウザからPHPアプリケーションにアクセスすると、セッションIDとい...</p>
<p>投稿 <a href="/2025/01/10/27/">PHPのセッション</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<h3 class="wp-block-heading">TOC（目次）</h3>



<ol class="wp-block-list">
<li>セッションの概要</li>



<li>セッションデータ保存の処理の流れ</li>



<li>セッションデータ取得の処理の流れ</li>



<li>セッションの有効期限</li>



<li>セッションデータの保存場所</li>



<li>セッションデータをRedisに保存する</li>



<li>まとめ</li>
</ol>



<p>PHPにはセッションという仕組みがあり、ユーザーのデータを一時的に保存しておくことができます。</p>



<p>ユーザーがChromeやEdgeなどのブラウザからPHPアプリケーションにアクセスすると、セッションIDというユーザーに一意なIDが割り振られます。割り振られたセッションIDは、セッションクッキーに保存されます。このセッションIDとデータを紐付けることで、ユーザーのデータを一時的に保存することができるのです。</p>



<p>セッションに保存したデータは、デフォルトではサーバー内にファイルとして保存されます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">セッションデータ保存の処理の流れ</h3>



<ol class="wp-block-list">
<li><strong>セッションの開始</strong>: <code>session_start</code>を呼び出します。セッションを開始すると、以下の処理が自動的に行われます。</li>



<li><strong>セッションクッキーからセッションIDを取得</strong>。</li>



<li><strong>セッションIDの作成</strong>: セッションIDの取得ができなかった場合、セッションIDの作成を行います（初回のアクセス時はセッションIDを作成します）。</li>



<li><strong>データの保存</strong>: スーパーグローバル変数<code>$_SESSION</code>にデータを保存します。</li>



<li><strong>セッションの終了</strong>: <code>session_write_close</code>を呼び出してセッションを終了させます。</li>
</ol>



<pre class="wp-block-code"><code><code>&lt;?php
session_start();
$_SESSION&#91;"your_name"] = "ららべる子";
session_write_close();
?>
</code></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">セッションデータ取得の処理の流れ</h3>



<ol class="wp-block-list">
<li><strong>セッションの開始</strong>: <code>session_start</code>を呼び出します。セッションを開始すると、以下の処理が自動的に行われます。</li>



<li><strong>セッションクッキーからセッションIDを取得</strong>。</li>



<li><strong>セッションIDの作成</strong>: セッションIDの取得ができなかった場合、セッションIDの作成を行います（初回のアクセス時はセッションIDを作成します）。</li>



<li><strong>データの取得</strong>: スーパーグローバル変数<code>$_SESSION</code>からデータを取得します。</li>



<li><strong>セッションの終了</strong>: <code>session_write_close</code>を呼び出してセッションを終了させます。</li>
</ol>



<pre class="wp-block-code"><code><code>&lt;?php
session_start();
if (isset($_SESSION&#91;"your_name"])) {
  echo $_SESSION&#91;"your_name"];
}
session_write_close();
?>
</code></code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">セッションの有効期限</h3>



<p>セッションには有効期限を設定することができます。<code>session_start</code>を呼び出す際に<code>cookie_lifetime</code>を指定すると、有効期限を設定できます。</p>



<p>以下は有効期限を360秒に設定する例です。</p>



<pre class="wp-block-code"><code><code>&lt;?php
session_start(&#91;
    'cookie_lifetime' => 360,
]);
?>
</code></code></pre>



<p>何も指定しない場合は、<code>php.ini</code>の<code>session.cookie_lifetime</code>に設定されている値が有効期限となります。デフォルトでは0が設定されており、ブラウザを閉じるまで有効という設定です。一度ログインしてもそのうち勝手にログアウトされる現象は、この有効期限が原因です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">セッションデータの保存場所</h3>



<p>セッションデータはデフォルトでサーバー内にファイルとして保存されます。その保存場所は<code>session.save_path</code>に設定されています。この設定は<code>php.ini</code>にあります。</p>



<p><code>cookie_lifetime</code>と同様に、セッション開始時に変更することも可能です。</p>



<pre class="wp-block-code"><code>
<code>&lt;?php
session_start(&#91;
    'save_path' => '/home/admin/sessions/',
]);
?>
</code></code></pre>



<p></p>



<p>デフォルトではファイルに保存されますが、DBやRedisに保存する方法も一般的です。実務ではRedisに保存することが多いです。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">セッションデータをRedisに保存する</h3>



<p>PHPからRedisにセッションデータを保存するには、PhpRedisを使用することが一般的です。</p>



<ol class="wp-block-list">
<li><strong>PhpRedisのインストール</strong>: まずはPhpRedisをインストールします。インストール手順は別の記事で説明します。</li>



<li><strong>設定の変更</strong>:
<ul class="wp-block-list">
<li><code>session.save_handler = redis</code></li>



<li><code>session.save_path = "tcp://localhost:6379"</code></li>
</ul>
</li>
</ol>



<p>次にRedisデーモンを起動させます。Dockerを使用する方法が推奨されます。</p>



<pre class="wp-block-preformatted">bashコードをコピーする<code>$ docker run --name some-redis -d redis
</code></pre>



<p>これでセッションデータはRedisに保存されるようになります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">まとめ</h3>



<p>PHPのセッションはシンプルなデータを一時的に保存するのに適しています。シンプルなショッピングカートやログイン状態を保存するのに便利です。サーバー内にシンプルなデータを一時的に保存しておきたい場合は、セッションを使用しましょう。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p></p>
<p>投稿 <a href="/2025/01/10/27/">PHPのセッション</a> は <a href="/">プログラミング教室 M&amp;Co.</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
