PHP 記事一覧

WindowsホストOSにPHPをインストールする

公開日時:2021/05/07 08:32

はじめに

で、VirtualBox上にCentOS 7がインストールされている事を前提としています。

また、本記事はVSCodeの導入のようにMicrosoft Visual Studio Code(VSCode)を導入してPHPでのソフトウェア開発をするにあたってホストOS側にもPHPの実行環境を求められる為、そのインストールを行うのが目的です。

Windows版PHPバイナリの入手

Windows版PHPは実行可能なバイナリファイルとしてPHPの公式サイトから入手できます。

公式サイト:PHP: Hypertext Preprocessor

php.net

CentOS上にPHPの開発環境を作成するの記事でインストールしたPHPのヴァージョンが7.4.18でしたが、先日5月6日に7.4.19がリリースされたようですのでこちらをインストールし、後でCentOSのPHPもアップデートします。

PHPのヴァージョン確認

公式サイト:PHP For Windows: Binaries and sources Releases

PHPにはThread Safe版(TS)とNon Thread Safe版(NTS:マルチスレッド環境を想定していない実装)がありますが、用途によって使い分ける必要があり説明が長くなります。

この記事の目的はVSCodeで指定するPHP実行環境を作る事ですのでTS版、NTS版どちらでも構いませんが、ここではTS版をインストールします。

Windows版PHPインストーラー

ダウンロードされた.zipファイルを解凍すると、実行可能なPHPのバイナリであるphp.exeを含む諸物のファイルが格納されたフォルダが出てきます。

PHP実行環境一式

このディレクトリをC:\など、任意の場所に移動してください。

環境変数PATHの設定

今はストレージに保存しただけですので、PHPは実行可能なプログラムとしてホストOSに認識されていません。

php -v

上記コマンドを実行すると、以下のようなエラーが表示される筈です。

※このエラーが表示されずPHPのヴァージョンが表示された方は既にPHPの実行環境がインストールされて環境変数PATHが設定されているので適切に項を読み飛ばしてください。

コマンドが見つからない

PHPを実行する為には保存ディレクトリにあるphp.exeを絶対パスで指定するか、保存ディレクトリにカレントディレクトリを移してからphp.exeを指定して実行する必要があります。

それでは不便ですので、シェルでphpと指定するだけでphp.exeが実行されるように環境変数PATHにphp.exeまでの絶対パスを記述しておきましょう。

Windows 10の場合、環境変数の設定画面は様々なところからアクセスできますが、一番わかりやすい方法はまず、デスクトップの『PC(以前のWindowsではマイコンピュータと呼んでいた物)』を右クリックしてコンテキストメニューを開き『プロパティ』から『設定』ウィンドウを開きます。

PCのコンテキストメニュー

システムの詳細情報

『設定』ウィンドウが開いたら『詳細情報』の中にある『関連設定』から、『システムの詳細設定』をクリックしてください。『システムのプロパティ』ウィンドウが開きます。

このウィンドウの下の方に『環境変数』というボタンがありますので、それをクリックして環境変数ダイアログを開いてください。

環境変数設定

環境変数ダイアログ

環境変数ダイアログは、上がユーザ用の環境変数、下がシステム全体の環境変数なのでどのユーザでログインしていても利用できます。

どちらに設定しても良いですが、今回は下のシステム全体の環境変数PATHとして設定します。

下の『Path』を選択してから『編集』ボタンをクリックしてください。

環境変数名の編集

開いた『環境変数名の編集』ダイアログ(ダイアログ名がおかしいですね…)で、『新規』ボタンをクリックして、先ほどダウンロードして配置したphp.exeのあるディレクトリ(フォルダ)への絶対パスを指定してください。

php.exeへの絶対パスを指定

入力が終わったら『OK』をクリックして変更を確定させ、全てのダイアログを閉じてください。また、シェルも起動します。

シェルが再起動したら、以下のコマンドでphpのバージョンチェックをしてみます。

php -v

Visual C++ 再配布可能パッケージを求められる

※このWarningが表示されずPHPのバージョンが表示された方は既にVisual Studioランタイムが導入されているのでこの項は読み飛ばしてください。

Windows版PHPではMicrosoft Visual Studioのランタイム(コンピュータプログラムの実行時〈ランタイム〉にメインプログラムと常に同時に存在して利用される前提のライブラリ)が必要ですが、わたしのPCにはインストールされていなかったようです。

そこで、『Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ』を、以下のMicrosoft公式サイトからダウンロードし、インストールします。

公式サイト:『Visual Studio 2019 for Windows および Mac のダウンロード

その他のツールとフレームワーク』>『Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ』

ランタイムのダウンロードメニュー

vc14ランタイムインストーラー

インストーラーがダウンロードされたら、実行してランタイムをインストールしてください。

再度シェルを起動しなおし、上記コマンドを実行すると、今度は正しくバージョンが表示される筈です。

PHPが正しく動作した

php.iniを作成

ここで、PHPの設定ファイルであるphp.iniを作成します。

雛形としてphp.exeのあるディレクトリ内にphp.ini-developmentphp.ini-productionがありますが、今作成しているのは開発環境なのでphp.ini-developmentをコピーしてphp.iniというファイルを作ります。

ionCube Loaderの導入

PHPの実行に直接必要なわけではありませんが、当サイトが管理している『Pine Framework』や、その他の暗号化されたPHPコードを実行するにはionCube社(英国)が提供するionCube Loaderが必要です。

ionCubeは、PHPのソースコード暗号化・復号に於いて、一番シェアがある製品です。

ionCube Loaderのダウンロード

ダウンロードページLoader Download - PHP Encoder, protection, installer and performance tools from ionCubeにアクセスし、対象のLoaderをダウンロードします。

上記ではPHPの『VC15 TS版』をダウンロードしてインストールしたので、ここでは『Windows VC15 (64bits)』のzipファイルをクリックしてダウンロードする事にします。

ionCube Loaderのインストーラー

更新のお知らせが必要か?

zipリンクをクリックすると、Loaderの更新のお知らせが必要か聞かれます。特に必要なければ No thanks をチェックしてNextをクリックしてください。zipファイルがダウンロードされます。

ダウンロードされたzipファイル

ionCube Loaderのインストール

ダウンロードされたzipファイルを解凍すると、中にioncubeフォルダがあり、その中に以下のようなファイルがあります。

ioncubeディレクトリ

このフォルダ内で、PowerShellを立ち上げて以下のコマンドを入力し、PHPのビルトイン・サーバー(組み込みサーバー)を起動します。

php -S localhost:8080

built-inサーバーの起動

これで、localhost(お使いのパソコン)上でWEBサーバーが立ち上がり、ポート番号:8080で待受を開始しました。

※もし上記コマンドでエラーが出た場合は、既にポート番号:8080が別のアプリケーションで使用されていると考えられるので、任意の別の番号でサーバーを立ち上げてください。

ブラウザを立ち上げて、ioncubeフォルダ内のloader-wizard.phpにアクセスしてみましょう。

http://localhost:8080/loader-wizard.php

ionCube Loader Wizard

Installation InstructionsセクションにionCube Loaderのインストール手順が記載されていますが、このうちの『1. Download the following archive of Windows VC15 x86-64 Loaders: zip』は既に済んでいます。

次は 2. に示されているパスに、ioncubeフォルダをコピーして配置してください。※ioncubeフォルダ内でビルトインサーバーを起動してこのページを開いているため移動はしないでください

ioncubeフォルダをコピーしてPHPのフォルダ内に配置したら、3. に従ってphp.iniを編集します。

Edit the file C:\php-7.4.19-Win32-vc15-x64\php.ini and before any other zend_extension lines ensure that the following is included:

C:\php-7.4.19-Win32-vc15-x64\php.iniを編集し、他のzend_extensionの行よりも前に以下の行を追記してください。

zend_extension = "C:\php-7.4.19-Win32-vc15-x64\ioncube\ioncube_loader_win_7.4.dll"

zend_extensionというのは、PHPの発展に大きく貢献したZend Technologies Ltd.(英)のPHP拡張であるZend拡張モジュールの事です。

参考:ゼンド・テクノロジーズ - Wikipedia

参考:コア php.ini ディレクティブに関する説明

Alternatively, replace your current C:\php-7.4.19-Win32-vc15-x64\php.ini file with this new php.ini file.

或いは、現在のC:\php-7.4.19-Win32-vc15-x64\php.iniをリンクされているphp.iniファイルに置き換えてください。(※ローカルでのダウンロードになるため、ブラウザのセキュリティ警告が表示されます)

ここでは、zend_extension行をphp.iniの先頭に追記する方法を採用します。

php.iniにzend_extensionを追記

zend_extension行を追記したら、4. に従ってビルトイン・サーバーを再起動してください。ビルトイン・サーバーの再起動はPowerShell上でCtrl+Cを2回押すか、PowerShellウィンドウを一旦閉じます。

再度ionCubeローダーフォルダ内で立ち上げたPowerShellウィンドウで以下のコマンドを入力し、ビルトイン・サーバーを立ち上げてください。

php -S localhost:8080

ionCube Loader Wizardページの 5. に従ってページをリロードしましょう。以下のようなページが表示されればionCube Loaderのインストールは完了です。

ionCube Loade インストール完了

php.iniの追加設定

あとは、php.iniの最低限の設定です。

設定の仕方はCentOS上にPHPの開発環境を作成するに示しましたが、インストールされた初期状態のphp.iniの内容が違いますので以下に設定項目を記します。

最低限として以下を設定してください。

date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS-WIN,SJIS,EUC-JP,JIS,ASCII
mbstring.encoding_translation = 0
mbstring.substitute_character = none

仮想マシン上のPHPをアップデートする

VirtualBox上のPHPのバージョンが7.4.18でしたので7.4.19にアップデートしようと思います。

SSHでログインした状態で、以下のコマンドでアップデートが出来ます。

sudo yum update --enablerepo=remi,remi-php74 php

PHPのアップデート

アップデート完了

CentOSにインストールされているPHPはNTS版で、TS版を利用するにはソースコードをコンパイルしてインストールする必要があるようですが、PHP自体が標準でThreadをサポートしていない為、敢えてTS版を導入するメリットはあまりないようです。ですからこちらはNTS版のままにしておきます。

まとめ

以上で、Windows ホストOSへのPHPのインストールは終了です。これで、VSCodeでPHPのプログラムコードを不自由なく編集できるようになりました。

CentOS上にPHPの開発環境を作成する

公開日時:2021/05/04 13:23

この記事は以下の2つの記事、

で、VirtualBox上にCentOS 7がインストールされている事を前提としています。

CentOSの初期設定

CentOS 7を更新する

上記の2記事を終えた直後のCentOS 7は、Boxファイルが作成されてから時間が経っている為に古く、セキュリティの観点等から好ましくありません。そこで、CentOSのパッケージマネージャ『yum(ヤム)』を使ってCentOS 7自身を最新の状態にしていきましょう。

まず、Vagrantfileのあるディレクトリ(フォルダ)でシェルを起動してください(※Shiftキーを押しながら右クリックで開くコンテキストメニューで『PowerShellウィンドウをここで開く』です)。

開いたシェルで以下のコマンドで仮想マシンを起動します。

vagrant up

仮想マシンの起動

次に、ssh接続で仮想マシンにログインします。

vagrant ssh

sshログイン

ここで、yumを使ってCentOS 7自身のアップデートを行います。sudoは、管理者権限でコマンドを実行する為のコマンドで、Vagrantでインストールした際に作成されているデフォルトユーザvagrantはsudoを実行できるユーザとして作成されています。

sudo yum update

最初に、アップデート可能なパッケージの検査が始まります。

yum update中

アップデート可能なパッケージの検査が終わると、アップデートを行ってもよいか確認のためにプロンプトが返って処理が一時停止します。yを入力してエンターキーを押してください。実際のアップデート処理が走ります。

update確認

結構時間がかかりますが、Windowsと違ってアップデートされるパッケージの総数と、今処理されているのが幾つ目のパッケージなのか分かるため、あとどのくらい時間が掛かりそうかの推測が立て易く、ストレスは少ない筈です。

パッケージのアップデート処理

Complete!と表示されてコマンドプロンプトが返ってくれば、アップデート完了です。

アップデート完了

sudoコマンド脆弱性有無の確認

先ほどyum updateを実行する際に使ったsudoコマンドですが、実はつい最近、2021年1月26日に重大な脆弱性(ソフトウェアの欠陥)が報告されています。

詳しい内容はsudoの脆弱性(CVE-2021-3156)に関する注意喚起ですが、この脆弱性が存在するかは以下のコマンドの実行結果で分かります。

sudoedit -s /

上記コマンドの実行結果が

sudoedit: /: not a regular file

であった場合は脆弱性が存在するので対処が必要です。

この記事の最初の状態、つまりBoxファイルcentos/7を使ってインストールした直後の状態では公開時期の問題から当然CVE-2021-3156が存在していました。

しかし、現在はyum updateを実行する事でこの脆弱性対応済みのsudoへと自動でアップデートされます。ですから上記コマンドで確認すると、このようなメッセージが表示される筈です。

sudoの脆弱性確認

rootパスワードを設定する

Linuxの管理者アカウントであるrootにパスワードを設定します。

sudo passwd root

タイムゾーンを設定する

Boxファイルcentos/7では、タイムゾーンが協定世界時(UTC)に設定されています。

timedatectl

現在のタイムゾーン

これを、日本標準時(JST)に変更します。

sudo timedatectl set-timezone Asia/Tokyo

日本標準時にタイムゾーンを変更

時刻の同期

以下のコマンドでNTPサーバを起動し、時刻の同期を行います。

sudo systemctl start chronyd

ファイアーウォールの無効化

generic/centos7でインストールされたCentOSでは、初期状態でファイアーウォールが有効になっています。

許可されているのはSSH接続のみで、これからApacheやMySQLをインストールしてもそのままでは外部に公開できません。

本番環境ではファイアーウォールで使用する通信プロトコルを許可するのですが、現在構築しているのはローカルの開発環境であるため、余計なトラブルが起きないように一旦ファイアーウォールを無効にします。

ファイアーウォールを無効にするには以下のコマンドを実行してください。

sudo systemctl stop firewalld
sudo systemctl disable firewalld

スナップショットの作成

さて、ここまで行ったら、またスナップショットを作成しておきましょう。そうすれば、このあと様々なパッケージをインストールしていて失敗してもいつでも現在の状態に戻ってくる事ができます。

スナップショットの作成

PHPの導入

まず、yumでインストールされるPHPパッケージのバージョンを確認します。

yum list available | grep php

yumでインストールされるPHP関連パッケージのリスト

5.4.16のようです。かなり古いですね。CentOSはRed Hat Enterprise Linux(RHEL)のクローン製品であり、RHELは商業用の堅牢なLinuxであるため、公式にサポートしているパッケージは十分な検証が終わっており安定している物が選択される傾向にあります。

このためCentOSはDebian系のLinuxと比べると、デフォルトで入るパッケージのヴァージョンが古い事がよくあります。

そこで、PHP 7.4がインストールできるように別のリポジトリ(ソースコード等を管理する場所)を認識させます。

EPELリポジトリの追加

EPEL リポジトリとは、CentOS 標準のリポジトリでは提供されていないパッケージを、yum コマンドでインストールできるようにする為のリポジトリのことです。CentOS 7の場合、このリポジトリの追加自体もyumで提供されています。

sudo yum install epel-release

EPELリポジトリの追加

remiリポジトリの追加

remiリポジトリはCentOS標準ではない、所謂サードパーティーが提供しているリポジトリの一つで、PHPスタックの最新バージョン、フル機能、およびその他のソフトウェアを、FedoraおよびEnterprise Linux(RHEL、CentOS、Oracle、Scientific Linuxなど)のユーザーに提供する為のリポジトリです。

公式サイト:Remi's RPM repository

こちらのリポジトリの追加はyumでは提供されておらず、rpm(RHEL系のLinuxでの標準のパッケージ管理コマンド)を使います。rpmは1つのパッケージに対して管理を行いますが、前述のyumはこれらrpmでの管理を総合的に取り扱い、複数のパッケージについて1つのコマンドで集中管理出来るようにしています。ですから通常、yumコマンドを実行すると裏側で複数のrpmコマンドが実行されている事になります。

今回は理化学研究所のミラーサイトを利用してみましょう。今年のNHK大河ドラマ『青天を衝け』の主人公『渋沢栄一』さんが1917年(大正6年)に設立した国民的研究所ですね。

sudo rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm

RIKEN.JP

rpm実行結果

インストール可能なPHPパッケージを再確認

EPELとremiの2リポジトリを追加したので、再度、インストール可能なPHPのバージョンを確認してみます。今回はremiリポジトリを追加した事で膨大なリストが表示されるため、grepのパラメタについてphp..-php.x86_64として、PHP本体パッケージのみに絞り込みを行います。(※ . は、任意の1文字の意)

yum list available | grep php..-php.x86_64

インストール可能なPHPパッケージ

CentOSが標準でサポートしているPHP 5.4から、最新版であるPHP 8.0までインストールが可能になりました。

PHP 7.4をインストールする

今回は、PHP 7.4をインストールします。

まず、インストール可能なパッケージのリストを見て必要なパッケージを見繕います。後で別のパッケージを追加する事も出来ますので、必ずしも全てを網羅している必要はありません。

yum list available | grep php74

php php-cli php-common php-devel php-mbstringといった基本パッケージに加え、PHPの画像処理用ライブラリ(GD)を提供するphp-gd、データベースMySQL及びPostgreSQL用ドライバ、データベースアクセスの為の抽象化ライブラリ(PDO)を提供するphp-pdo、JSONとXMLを扱うためのphp-json、php-xml、暗号化されたPHPソースコード用ローダーphp-ioncube-loaderを入れておきます。

そして、現在のPHPにとっては一番重要な拡張モジュールであるOPcache(オペキャッシュ:コンパイル済みバイトコードをメモリにキャッシュして処理の高速化を図るモジュール)を提供するphp-opcacheは必ず入れましょう

同様に、現在のPHPの開発では様々な便利なライブラリを導入する手段として、Composerというパッケージマネージャを使うのが当たり前になっています。これを利用しないのはもう考えられないので、絶対にインストールしておきましょう

sudo yum install --enablerepo=remi,remi-php74 php php-cli php-common php-devel php-opcache php-mbstring php-gd php-mysqlnd php-pgsql php-pdo php-json php-xml php-ioncube-loader composer

インストールされるパッケージの確認

インストールされるパッケージ一覧が表示されるので確認し、よければyを入力してください。

PHPインストール完了

PHPのバージョン確認コマンドを使って、インストール状況を確認します。

php -v

PHPのインストール状況確認

PHP設定ファイルの編集

PHPはインストール直後の初期状態ではタイムゾーンが設定されていません。以下のPHPコマンドを実行してみると、協定世界時(UTC)の時刻が表示されます。

php -r "echo date('Y-m-d H:i:s') . PHP_EOL;"

時刻確認

そこで、PHPの設定ファイルを修正して日本標準時(JST)が表示されるようにします。

設定ファイルは/etc/php.iniです。CentOSでの標準的なテキストエディタはVimなので、Vimで編集できるようになるのが一番良いですが、操作方法に結構クセがあります。

参考:Vimの使い方 よく使うコマンドまとめ | Memo on the Web

sudo vi /etc/php.ini

※viコマンドを使っていますが、現在のCentOSのviコマンドはvimコマンドのエイリアスとなっています。

/etc/php.ini

php.ini

ファイルが開いたら、/キーを押してください。画面下にカーソルが移動し、後方検索モードになります。

検索モード

ここで、date.timezoneと入力してエンターキーを押すと、PHPのタイムゾーン設定の箇所にカーソルがジャンプします。

timezone設定

Vimではテキストを編集する際にはインサートモードに切り替える必要があります。iキーを押してください。画面下に黄色い文字で-- INSERT --と表示されます。

INSERTモード

この状態でdate.timezoneの行頭のセミコロン;を削除し、値としてAsia/Tokyoを入力します。

[Date] 
; Defines the default timezone used by the date functions 
; http://php.net/date.timezone 
;date.timezone = 
       ↓ 
[Date] 
; Defines the default timezone used by the date functions 
; http://php.net/date.timezone 
date.timezone = Asia/Tokyo 

同様に、以下の項目を検索して設定してください。

前述した/での検索はカーソルのある場所から下方向へ向かっての検索の為、カーソルよりも上にある文字はヒットしません。

その場合はggとタイプするとカーソルをファイルの先頭に移動出来るので併用してください。

session.use_strict_mode = 1
session.cookie_secure = 0
mbstring.language = Japanese
mbstring.detect_order = UTF-8,SJIS-WIN,SJIS,EUC-JP,JIS,ASCII
mbstring.encoding_translation = 0
mbstring.substitute_character = none
post_max_size = 100M
upload_max_filesize = 50M
max_file_uploads = 50

参考:『PHP: セッションに関連する INI 設定をセキュアにする - Manual

参考:『PHP: 実行時設定 - Manual

参考:『PHP: コア php.ini ディレクティブに関する説明 - Manual

編集し終わったらESCキーを押して、INSERTモードを抜けます。

変更を反映して保存する場合は、Shiftキー+ZZ(Zを2回押す)です。

※尚、変更した修正を反映せずにファイルを閉じたい場合は:q!と順番にタイプしてエンターを押してください。

もう一度、現在時刻を表示させてみましょう。

php -r "echo date('Y-m-d H:i:s') . PHP_EOL;"

日本標準時表記

これで、タイムゾーン設定が完了しました。

Apacheの導入

Apacheのインストール

次はWEBサーバの代名詞とも言うべきアプリケーションであるApacheの導入です。

現在は、より新しいWEBサーバアプリケーションであるNginX(エンジンエックス)が台頭してきていますが、ApacheとNginXは得意分野が違っていて、NginXは静的なページを大量に捌くような用途に向いています。

ですから、PHPに限らずプログラムを使って動的なサイトを構築するような場合はApacheの方が向いており、NginXはApacheの前に置いて静的コンテンツと動的コンテンツを振り分けるロードバランサーのような使い方をするのが最も効果的です。

さて、では実際にApacheをインストールしていきますが、CentOSでのApacheのパッケージ名はhttpdです。インストールはやはりyumを使います。

sudo yum install httpd httpd-devel

httpdの情報

なお、httpddは、daemon(デーモン)のdです。daemonの意味は守護神で、UnixやLinuxに於いてバックグラウンドで常に稼働しているアプリケーションの事をデーモンと呼びます。Windowsでは似たようなアプリケーションの事をService(サービス)と呼んでいます。

英語ではdemon(悪魔)とdaemon(守護神)を分けて考えていますが、元々の語源はギリシア神話にでてくるダイモン《神々と人間の間に介在する二次的な神》のようです。ですから、demonもdaemonも、発音記号は全く同じdi:mʌn(英:díːmən)です。

インストールされるバージョンは2.4.6のようですね。問題ないのでyを入力して実行します。

httpdインストール完了

インストール状況確認です。

httpd -v

httpdインストール状況確認

インストールされたApacheのステータスを確認してみましょう。

systemctl status httpd

Apacheのステータス確認

inactive(dead)となっていて、稼働していない事が分かります。WEBブラウザからhttp://192.168.33.10/にアクセスしてみましょう。接続が拒否されます。

ブラウザでのアクセス

それでは、Apacheを起動してみます。

sudo systemctl start httpd
systemctl status httpd

Apacheの起動

状態がactive(running)に変わりました。もう一度http://192.168.33.10/にアクセスしてみると…、

Apacheのデフォルトドキュメント

Apacheが動作している事が分かります。

WEBで公開するディレクトリの設定

Apacheをインストールすると、/varの中に/var/wwwというディレクトリが作られ、更にその中に/var/www/cgi-binと/var/www/htmlが作られています。

/var/wwwディレクトリ

まず、このディレクトリ配下のファイルおよびディレクトリの所有者をvagrant、グループをapacheにします。apacheはApacheのユーザID及びグループIDです。

sudo chown -R vagrant:apache /var/www

/var/wwwディレクトリの所有権を変更

chownはファイルやフォルダの所有権の変更コマンドです。-Rオプションは、指定したディレクトリ配下にあるすべてのファイルおよびディレクトリの所有権を再帰的に変更する為のオプション、vagrant:apacheは、ユーザID:グループIDです。

これで、ホストOSからvagrantユーザーとして/var/wwwディレクトリ内にファイルをアップロード出来るようになります。

ただし、/var/wwwの所有者をvagrant:vagrantにしてしまうと、Apacheからディレクトリ内に新たなファイルを作成したり削除したりといった事が出来なくなってしまいます。

ですから、/var/wwwの所有者はvagrant:apacheとします。

最後に、グループのパーミッション(操作権限)を変更します。現在のグループのパーミッションはr-xで、読み込み及び実行のみ、つまり書き込みや削除権限がありません

Apacheのモジュールとして動作しているPHPはApacheの操作権限でファイル操作を行う為、この状態だとアップローダーのようなファイルを生成するアプリケーションが作れません。

そこで、以下のコマンドでグループ(apache)に対して、書き込み権限(w)を追加します。

sudo chmod -R g+w /var/www

chmodは、パーミッション(操作権限)を設定するコマンドです。

これで、Apacheからも/var/www内に対してファイルの書き出し、ファイルの削除等が出来るようになりました。

なお、パーミッション(操作権限)については、以下を参照してください。

参考:『chmodのパーミッション変更で「u+w」などの文字列指定をしたい - ITmedia エンタープライズ

MySQLの導入

MySQLは、世界で一番利用されているデータベースアプリケーションです。大規模な商業用途の場合は古くから利用されている堅牢なデータベースであるOracleが利用されるケースが多いのですが、中小規模からホビーユースまでを含めた場合、世界で一番利用されているWEBアプリケーションであるWordpressのデフォルトデータベースとなっているMySQLが、実は、世界で一番利用されているデータベースとなります。

歴史

このMySQLは元々はスウェーデンの企業であるMySQL AB社が所有、出資していたものをSun Microsystems社が買収、同社の管理下にありましたが、2010年にOracle社がSunを買収した事により、現在はOracle社の製品となって更なる高機能化が進められています。

Oracle社は既に自社プロダクトであるOracleを所有しておりそのOracle社にMySQLが買収された事で、『MySQLが飼い殺しにされるのではないか?』という懸念が世界中に広まりました。

そこで、元々の開発者であるMichael Widenius氏の手によって当時の安定版であったMySQL 5.5をフォーク(派生プロダクトを作る事)され、新たなデータベースである『MariaDB』がリリースされました。

この為、MySQLとMariaDBはほとんどの部分において全く同じ操作が可能です。今後、万が一Oracle社が独占的な権利を主張するようなライセンス規約の変更を行った場合、非常に多くのシステムのデータベースがMariaDBへと乗り換えられる事になるでしょう。

MariaDBライブラリの削除

とはいえ、ここでは主プロダクトであるMySQLのGPL版、Community Editionをインストールします。理由は、まだまだWEB上にはMySQLの情報の方が多く、初学者がMariaDB特有の機能でつまづくのを防ぐ為です。

CentOS 7では、前述の歴史にある理由からMariaDB関連のライブラリが入っています。以下のコマンドで、そのライブラリの存在を確認できます。

yum list installed | grep mariadb

MariaDBのライブラリ確認

インストールされている事を確認したら、このライブラリをyumで削除します。ライブラリ用に作成されているディレクトリも一緒に削除しておきます。

sudo yum remove mariadb-libs

以下のコマンドで、mariadbライブラリ用のディレクトリも削除しておきます。(※MySQLをフォークしたプロジェクトの為、ディレクトリ名等様々な場所でmysqlの表記が使われています。)

rm -rf /var/lib/mysql/

MariaDBライブラリの削除

インストールの為のリポジトリ設定

これで、晴れてMySQLをインストール出来るようになります。

まず、MySQL 8.0をインストールする為のリポジトリを調べます。

MySQL Community Downloads

MySQL :: Download MySQL Yum Repository

上記サイトの情報を元に、PHPの導入でremiリポジトリを追加した時と同様に、今度はdev.mysq.comのリポジトリを追加します。

sudo rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

MySQLリポジトリの追加

以下のコマンドで、インストール可能なMySQLの種類が確認できます。

yum repolist all | grep mysql

インストール可能なMySQL関連パッケージリスト

yum installを実行するとenabledとなっているパッケージがインストールされます。上記の状態ではMySQL 8.0 Community Serverがインストールされる事になります。

MySQL 8.0のインストール

yumでMySQLをインストールするコマンドは以下です。

sudo yum install mysql-community-server

mysqlインストール確認

yを入力してインストールします。

インストール完了

インストールされたMySQLのバージョン確認は以下です。CentOSではMySQLはmysqldとして認識しています。

mysqld --version

MySQLのヴァージョン確認

MySQLを起動する

まず、MySQLを起動します。

sudo systemctl start mysqld

デフォルトのrootパスワードを調べる

MySQLの初回起動時に、デフォルトのrootパスワードが設定されます。以下のコマンドでこのデフォルトrootパスワードを調べる事が出来ます。

sudo grep password /var/log/mysqld.log

MySQLの初期設定

以下のコマンドを実行して初期設定を行います。

sudo mysql_secure_installation

rootパスワードが聞かれるので、先ほど調べたデフォルトのrootパスワードを入力してください。

Securing the MySQL server deployment.
 
Enter password for user root:

新しく設定したいrootユーザのパスワードを聞かれます。入力すると、入力間違いが無いか確認する為に同じパスワードの再入力を求められます。

間違いが無ければ新しいパスワードを有効にしてもよいか聞かれるのでYを入力してください。

The existing password for the user account root has expired. Please set a new password.
 
New password: 
 
Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

パスワードが一致すると入力したパスワードの暗号化が行われ、rootパスワードを変更しても良いか聞かれます。Yを入力して下さい。

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y 

次はデフォルトで登録されているanonymous user(匿名ユーザー)を削除するかどうか聞かれます。セキュリティ上のリスクになりうるので、anonymousユーザーは削除してしまいましょう。Yを入力してください。

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
 
Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.

次はrootユーザーのリモートログインを禁止するかどうかを聞かれます。別からrootユーザとしてログインを許可すると不正アクセスされた場合に非常に危険なので、これは禁止します。リモートからroot権限で操作したい場合はまずSSH等を使ってホストコンピュータにログインし、ホスト内でrootユーザーとしてMySQLにログインするようにします。

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
 
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : Y
Success.

次に、testデータベースを削除するかどうか聞かれます。有っても無くても特に困らないデータベースなので、余計なセキュリティリスクを考慮から外すため、削除してしまいましょう。

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
 
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.
 
 - Removing privileges on test database...
Success.

最後に、今設定した権限を直ちに確定するか聞かれます。Yを入力して確定させてください。

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
 
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.
 
All done!

初期設定は以上です。

初期設定を確認する為、MySQLにrootユーザーでログインします。

mysql -u root -p

MySQLにログイン

ステータスコマンドで状態を見ます。

status

MySQLのステータス

MySQLからログアウトする場合は以下のコマンドです。

 \q

ApacheとMySQLを自動起動するようにする

現在の状態ですと、OSを再起動する度にApacheとMySQLのデーモンは停止してしまいます。

CentOSではsystemctlのenableを使って、OS起動時にデーモンを自動起動させる事が出来ます。

sudo systemctl enable httpd
sudo systemctl enable mysqld

デーモンの自動起動化

SELinuxの無効化

SELinuxは、Linuxに高度なセキュリティを導入するための仕組みです。

現在のCentOSはデフォルトで有効となっていますが、この機能は少々難解で初心者にはあまり適切ではありません。この機能があるおかげで助かる事は稀ですが、初学の段階ではこの機能があるせいで意図した動作にならない事が頻繁に発生します。

元々Unix、Linuxにはオーナーやパーミッションといった高度なセキュリティが導入されている為、通常はSELinuxの恩恵を受ける事は殆どありません。特に、閉鎖されたローカル環境のみ、自分しか利用しないのであれば必要無いので、現段階ではこの機能を無効にします。

設定ファイルの編集

以下のコマンドで、SELinuxの設定ファイルを開きます。

sudo vi /etc/selinux/config
/etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled

SELinuxの無効化

サーバの再起動

sudo reboot

再起動後の再確認

getenforce

Disabledと表示されれば、SELinuxは無効になっています。

スナップショットの作成

必要であれば、ここで再びスナップショットを作成しておきましょう。

まとめ

以上で、CentOS自体の更新、および、PHP、Apache、MySQLの導入の説明を終わります。

これでPHPによるWEBアプリケーションの開発環境が整った事になりますが、開発を更に便利にする為に、次のドキュメント『ホストOSとゲストOSでフォルダを共有する』でSSH接続を使った安全なファイル転送の仕組みであるSFTPを導入して更に開発効率を上げてみようと思います。

ソケットサーバー「HAL」の概要(version 2.0対応版)

公開日時:2016/12/14 21:06

ソケットサーバー「HAL」は Raspberry Pi で動作する、カスタマイズ可能なサーバーアプリケーションフレームワークです。ソケットサーバー「HAL」をセットアップすれば、プログラムに関する難しい知識がない方でも簡単な PHP コードを書くだけで Raspberry Pi を制御することが出来るようになります。

Raspberry Pi を買ってひとしきり遊んだが「さて、これからどうしよう?」とお考えの方はいらっしゃいませんか? ソケットサーバー「HAL」を使えば、あなたの Raspberry Pi で効率的なIoT活用が出来ます。ソケットサーバー「HAL」で、あなたの Raspberry Pi をもっと便利で楽しいデバイスにしましょう!

ソケットサーバー「HAL」の概要

ソケットサーバー「HAL」の概要

ソケットサーバー「HAL」は PHP で構築された軽量なサーバーアプリケーションフレームワークです。BSDソケットを用いたテキストベースの通信によって、あなたのアプリケーションや音声クライアントからの指示を受け取り、あなたが定義した処理を行います。どのような処理をさせるかはあなた次第です。

音声クライアントは Julius から送信された音声認識結果を HAL に伝えるクライアントプログラムです。『Julius』は日本の大学やIPAによって開発されているオープンソースの音声認識システムです。ソケットサーバー「HAL」を利用するにあたって必須ではありませんが、Julius を導入する事で HAL をより高度に扱うことが出来るようになるでしょう。

同様にオープンソースで開発されている音声合成ライブラリ『Open JTalk』を併用することで、対話型の IoT システムを、とても簡単に構築できるようになるでしょう。

サーバーフレームワークってなぁに?

サーバーフレームワークというのは、あまり聞き慣れない言葉です。ソケットサーバー「HAL」がどんなものなのかを知るには、実際にどんなプログラムを書く必要があるのかを知るのが一番手っ取り早いでしょう。

このリンクでは、HAL にあなたが望んだことをさせるために、どんなプログラムを書けば良いのかをご紹介しています。こちらを一読いただければきっと、ソケットサーバー「HAL」がどんなアプリケーションであるか、どれほど簡単に思っていることを実現できるのかを大体御理解いただけるのではないかと思います。

必須条項

  • Raspberry Pi 本体(Raspberry Pi 2以上を推奨)
  • PHP 5.4以上(5.6を推奨)
  • Raspberry Pi、及び HAL に接続するシステムの IPアドレスの固定化
  • ionCube Loader のインストール

推奨条項

  • WiringPi、及び WiringPi-PHP のインストール
  • Julius
  • Open JTalk
  • Apache2(Apache2.4を推奨)

WiringPi 及び WiringPi-PHP が無くともサーバーとして利用することは可能ですが、あなたがやりたい事の殆どはかなり大変になるでしょう。ぜひインストールをおすすめします。

HALの構成(version 2.0 以降)

HALのプログラムファイル構成は以下のようになっています。

HALのディレクトリ構成

  • actions ディレクトリは、あなたが HAL にさせたい処理を記述したファイルを置く場所です。
  • apps ディレクトリは、HAL に関する外部アプリケーション等を置く場所です。
  • setting ディレクトリは、HAL の設定に関するファイルを置く場所です。
  • system ディレクトリは、HAL のプログラムが格納されています。このディレクトリ内のファイルは暗号化されています。
  • userdata ディレクトリは、HAL で利用するユーザー固有の様々なデータが格納されます。
  • webapps ディレクトリは、HAL に WEB ブラウザからアクセスするための WEB アプリケーションフレームワークが格納されたディレクトリです。

これらのディレクトリの詳細な説明は、別途記載します。

導入方法

HAL version 2.0 から、HAL を実行するためのプログラム類を自動でインストールするためのシェルスクリプトを用意しました。

このシェルスクリプトは、

cd ~

wget -O setup_trial.sh "http://feijoa.jp/getFile/?place=products&filename=setup_trial.sh"

で取得できます。

ls

で、setup_trial.sh ファイルがダウンロードできたか確認して下さい。このファイルはシェルで実行するコマンドを羅列したもので、手動で一つづつプログラムをインストールする作業を自動化したものです。

cat setup_trial.sh

で、何をしているのか、内容が確認できます。

このスクリプトを実行しても良い場合は、

sudo chmod u+x setup_trial.sh

として、setup_trial.sh ファイルにユーザーの実行権限を付与します。(+ は権限追加、x は実行権限です)

これでスクリプトが実行できるようになるので、

sudo ./setup_trial.sh

とすると、インストールスクリプトが実行されます。スクリプトの最初にいくつかの設定項目の入力後、最後まで自動でインストールが行われます。(いくつかのアプリケーションはコンパイルが必要なため 40 分程度かかります)

インストールされるアプリケーションやファイル等の詳細な説明は、別途記載します。

HALの名前の由来

HALの名前の由来は、スタンリー・キューブリックの「2001年宇宙の旅」の人工知能 HAL9000 です。以前の HAL のデフォルトポートは 9000 番に設定されていましたが、これに由来します。2001年宇宙の旅で HAL9000 は電源を切られることを恐れ乗務員を殺害しますが、ソケットサーバー「HAL」があなたに危害を加えるかどうかはあなたの書いたコード次第です。

なお、講談社のコミック「ハルロック」(西餅著)に登場するハルちゃんでは決してありません。

※ 加えて、余談ですが、本来の「ソケットサーバー」という用語は TCP や UDP の通信を中継するプロキシサーバーのような物を指すようです。ですから『ソケットサーバー「HAL」』というネーミングはあまり適切ではないので、そのうちに名称変更するかもしれません。

競合の解決~ 365日の紙PHP(15日目)

公開日時:2016/07/08 08:01

さて、バージョン管理の締めくくりとして、今日は競合が起きた場合の解決方法を学びましょう。

競合は、複数人で同じプロジェクトを開発している時などに同じファイルを複数人が編集を行ってコミットしようとする際、全く同じ場所を複数人が修正していた、といった場合に起こります。

Git というバージョン管理システムはとても優秀で、大抵の場合、複数人のコミットは自動でマージ(日本語では「合流」と呼んでいるようです)が行われるのですが、流石に、同時に行われた全く同じ箇所の別の編集はどちらをどのように採用するかは Git にも判断がつきかねますので、人間の目と脳によるマージを行うよう、Git から警告される、ということです。

さて、では競合と解決について、実際にやってみましょう。

1. プロジェクトを2つクローンする

まず、テストのためのプロジェクトを開くため、NetBeans を立ち上げて下さい。もし、Git で既に管理されているプロジェクトしかない場合クローンがしづらいため、プロジェクトを右クリックして「閉じる」を選んで一時的に閉じておきます。(再び開きたくなったら ファイル > プロジェクトを開く で再開できます)

NetBeans画面

そうしたら画面上のメニューから チーム > Git > クローン で bitbucket のリモート・リポジトリ情報が表示されるので、「次 >」を選びます。

リモート・リポジトリ

次は分岐の選択です。まだブランチが作られていない場合は master のみが表示されるでしょう。やはり「次 >」を選びます。

リモート分岐画面

最後にクローンを行う場所と名前です。ここでクローン名を「firstlogin1」等のように別の名前でクローンして下さい。

クローン名の指定

「終了」をクリックするとプロジェクトがクローンされ、プロジェクトを開くかどうかの確認ダイアログが出ますので、「プロジェクトを開く」を選んで開いて下さい。

クローン完了

そうしたら、もう一度同じ作業(クローン)を行い、最後のクローン名の指定で「firstlogin2」のように別の名前でクローンをします。こうなります。

プロジェクト

ファイルブラウザでの確認

※下の画面、OS のファイルブラウザでの firstLogin は昨日までで作っていた元のプロジェクトです。

このようにクローン名を変えて、同じプロジェクトを2つ開きました。これから、わざと競合を起こしてみようと思います。

2. 上のプロジェクトを編集する。

まず、上のプロジェクト(firstLogin1)の login.php を開きます。私のプロジェクトではこんなコードになっています。

コード

そうしたら、どこか適当なところを選んで修正します。私は以下のようにしてみました。

if(!isset($_SESSION["logged"])){
    http_response_code(404);
    header("Location: index.php");
}
   ↓
if(!isset($_SESSION["logged"])){
    http_response_code(500);
    header("Location: error.php");
}

これをローカルリポジトリにコミットしてからプッシュします。プロジェクトタブで login.php を右クリックして Git > コミット を実行してから再び右クリックで、Git > リモート > アップストリームへプッシュ です。

なお、プッシュ というメニューも有りますが、こちらは一番最初にリモートリポジトリにプッシュする場合を除いては使わないほうが良いでしょう。現在はまだブランチが無いので結果は同じですが、ブランチを切って開発を行うようになると結果が変わってくる場合があります。

参考)「引数なしのgit pushは危険なので気をつけましょう 」ということのようです。

これで、firstLogin1 の修正がリモートリポジトリにプッシュされました。

3. 下のプロジェクトで同じ場所を編集する。

今度は下のプロジェクトです。元のコードは firstLogin1 と同じなので、全く同じコードが開かれるはずです。私は以下のように修正を行いました。

if(!isset($_SESSION["logged"])){
    http_response_code(404);
    header("Location: index.php");
}
   ↓
if(!isset($_SESSION["logged"])){
    header("Location: login.php");
    exit;
}

さて、この login.php を右クリックしてローカルリポジトリにコミットします。

そうしたら次は、アップストリームへプッシュです。すると、こんなダイアログが表示されました。

プッシュ失敗

同じ場所に別々の編集を行ったので、Git がどうあるべきなのか判断がつかないと報告してくれているのです。

そこで、「変更のプル」を選びます。次のような画面が出るので、手動でマージを行うため、「マージ」を選択します。(リベースについてはここでは行いませんがどういったものかは3分で理解できる!git-rebaseとmergeとの違いまとめの図を参考にしてください。)

ダイアログ1

次のようなダイアログが更に表示されるので、「解決」を選びます。

ダイアログ2

すると、マージ競合リゾルバが開きます。

マージ競合リゾルバ

プロジェクトタブの login.php や、開いているlogin.php のタブを見て下さい。ファイル名が赤色で表示されていますね? これが、競合が起きている証です。

さて、では手動でマージ(合流)しましょう。マージ競合リゾルバで受け入れ方を選択します。今回は、「両方を受け入れ」を選んでみました。その画面がこれです。

受け入れ後

if(!isset($_SESSION["logged"])){
    header("Location: login.php");
    exit;
    http_response_code(500);
    header("Location: error.php");
}

両方のコードが取り込まれたのでこの辺りが変ですね。適切に修正しましょう。マージ競合リゾルバの画面下の「OK」ボタンでリゾルバを抜けます。login.php の文字が青色に変わっているはずです。あとはこんな感じで正しく修正を行います。

if(!isset($_SESSION["logged"])){
    http_response_code(500);
    header("Location: error.php");
    exit;
}

そうしたらローカルリポジトリにコミットを行い、再びアップストリームへプッシュを行ってみましょう。

こんどは競合が起きずに正常にプッシュが行えたはずです。

プッシュ完了

4. Git でプッシュする場合の作法

ところで、今回はプッシュを行った後に警告がでましたが、本来はプッシュを行う前に競合が起きないように解決しておくことが推奨されます。

どうするのでしょうか?

まず、上のプロジェクトの login.php を開いて下さい。下のプロジェクトの login.php をプッシュしたので、内容が一致していませんね。

この状態で、上のプロジェクトの login.php の該当箇所をまた書き換えてみます。

if(!isset($_SESSION["logged"])){
    echo "テストだよ";
}

この状態でローカルリポジトリにコミットします。

そうしたら、いきなりアップストリームへプッシュするのではなく、まず「プル」します。login.php を右クリックして Git > リモート > アップストリームからプル です。

すると、先ほどのようなダイアログが出ます。

プルでのダイアログ

ここでマージを選ぶと、やはり、先ほどと同じダイアログが出るので手動解決します。やり方は全く一緒です。

手動解決

解決を行ってファイル名が青色になったらコミットを行い、晴れてリモートリポジトリのアップストリームにプッシュしましょう。

このように、ローカルで競合を解決してからプッシュを行うのが正しい Git での作法なのです。

ですからつまるところ、コードを修正する際には何よりも先にまず「アップストリームからプル」してリモートリポジトリのコードを取得し、それからコードの編集を始めるのが最も効率が良い方法です。

まとめ

今回までで、4 回にわたって NetBeans での Git の利用について説明してきましたが、大体ご理解いただけたでしょうか?

バージョン管理システムは、現在の IT の開発現場では無くてはならない物になりつつあります。

何時、どんな修正を加えたのかを記すだけでなく、いつでもどの状態にでも戻すことができ、チーム開発を円滑に進める事もできる Git は本当に有益なアプリケーションです。

怖がらずに是非 Git を導入し、効率的な開発を行っていってください。

明日からは、いよいよ、データベースを取り扱ってみようと思います。

リモートリポジトリからのクローン~ 365日の紙PHP(14日目)

公開日時:2016/07/02 05:19

リポジトリをクローン(複製)して別のパソコンで修正を行う

さて、今日は、昨日リモートリポジトリに push(プッシュ)したプロジェクトを clone(クローン)して、別のパソコンでもバージョン管理を使ったままで修正できるようにしてみましょう。

今回は Windows を利用しますが、1台しかパソコンが無い方は昨日までの NetBeans のプロジェクト(と、.git を別の場所に作っていた人は .git ディレクトリも併せて)を一時的にどこか別の場所に移動させて下さい。

WindowsのNetBeans初期画面

Git プロジェクトをクローンするには、「チーム」メニューを利用します。複数人で開発することを象徴する適切な名前ですね。

チーム > Git > クローン を選ぶと、「リポジトリをクローン」ダイアログが表示されます。このリポジトリURLに、昨日プッシュしたリポジトリのアドレスを記入します。Bitbucket の画面の赤枠の場所からアドレスをコピーして、リポジトリURLのフィールドにペーストしてください。

Bitbucketのプロジェクト画面

リポジトリをクローン

併せてユーザーID(メールアドレスではなく、ユーザーID)とパスワードを指定してください。

そして、リモートリポジトリのプロジェクトをクローンする場所を「クローン先」に指定します。通常はNetBeansのプロジェクトフォルダ内か、あるいはローカル環境の Apache のDocumentRoot 下が良いでしょう。

「次>」をクリックします。リポジトリが認識されてログイン認証に成功すると、クローンするリモート分岐の選択画面になります。

Git をはじめとするバージョン管理システムでは、「ブランチ」と呼ばれる開発上のバージョン分岐を作成して、別バージョンの開発を複数同時に進行させる事が可能です。ここでその別バージョンを選択できるのですが、現在は master ブランチしか登録されていないため、この画面に表示されるのは「master*」のみのはずです。

リモート分岐選択

これをチェックして選択したら、「次>」をクリックして下さい。

宛先ディレクトリ

Git に関するディレクトリとクローン名が指定できます。とりあえずはデフォルトのままの方が良いでしょう。

最後に「終了」をクリックすると、リモートリポジトリからプロジェクトがローカルにクローンされます。プロジェクトを開くか確認ダイアログが開きますので「プロジェクトを開く」をクリックしましょう。

確認画面

プロジェクトがクローンされました。

クローン完了

これで、別のパソコンでも同じプロジェクトをバージョン管理を使いながら開発が行えるようになりました。こちらで行われた修正についてもコミットを行ってからプッシュを行えば、リモートリポジトリに修正を反映できます。

まとめ

今日は、リモートリポジトリにプッシュされているプロジェクトを、別のパソコンにクローンする方法を勉強しました。

さて、ところで、2台のパソコンで修正を行っていると、修正内容がバッティングしてしまい整合性が保てなくなる可能性があります。

明日はこの問題について説明します。これを知れば、安全に複数のパソコンを使って開発が行えるようになります。

お疲れ様でした。

記事リンク