CakePHP2のブログチュートリアルにおける開発環境構築とデプロイ

# 目次
[はじめに](#はじめに)
[検索手段](#検索手段)
[反省](#反省)
[zipダウンロード](#zipダウンロード)
[開発環境構築](#開発環境構築)
[versionエラー](#versionエラー)
[再ダウンロード](#再ダウンロード)
[filezillaエラー](#filezillaエラー)
[開発](#開発)
[sql](#sql)

# はじめに
`CakePHP`2.xの開発環境を構築し、ブログアプリを開発し、デプロイする機会があったので、その過程でつまづいた箇所、そしてそれをどう突破したかをまとめています。
（バージョン2は古いのでセキュリティなどの観点から非推奨ではある）

実際にコードを書く部分は割愛し、開発環境とデプロイの部分を記載しています。
（コードを書く部分は環境の違いなどは関係なく、特筆すべきことはないと考えたので）

公式サイト

https://book.cakephp.org/2/ja/tutorials-and-examples/blog/blog.html

（ちなみに、[`CakePHP`](https://cakephp.org/jp)とは[`PHP`](https://www.php.net/manual/ja/intro-whatis.php)の[フレームワーク](https://wa3.i-3-i.info/word12470.html)のうちの1つです）

# 検索手段
まずはわからないことをどのように調べるべきか考えました。私は今までコードを書いているとき生成AIに助けてもらったことが多かったので、今回は主に生成AIの`Gemini`と、たまに
`GPT-3.5`を使用することにしました。
（後に後悔することになります）

## 理由
### 各生成AIを選んだ理由
- `Gemini`(旧`Bard`)

返答が丁寧。抜け漏れがないボリュームのある文章を生成してくれるように感じる。

- `GPT-3.5`
コードのみの質問に関しては、`Gemini`や`Copilot`より精度が高いように感じる。（金銭的な理由で有料版の`GPT-4`は契約していない）

### Webではなく生成AIを選んだ理由
- 自分が今どういう状況で、どういうアウトプットが欲しいのか、という細かな指定ができる
    - それにより、当然回答の精度も向上
    - Webだと意図に合わないサイトを見てしまうことも多々あり、時間効率が悪い
    - 自分が今書いた変なコードも、そのままコピペで修正点を聞く、ということが可能
    <br>
- 「記憶」の存在により、以前の回答を踏まえてさらなる質問に繋げられる
    <br>
- 質問とそれに対する回答が何回もなされていく訳だが、Webだとそれらは1つ1つが完全に断絶されているし、質問の柔軟性もない。しかし生成AIだとすべての質問と回答のセットを接続できるし、質問の柔軟性がある
    <br>
- 生成AIだとソースが不明でブラックボックス化しているというデメリットもあるが、ソースの信頼性を確保したい場合のみWebでも二重で検索すれば良いだろうと判断

# 反省
ということでほとんど生成AIのみに頼って進めていると、エラーがいくつもでてきて、それを突破できない、という状況が続きました。

そこで、単純にWeb検索でエラーコードをコピペしたりキーワードを入れたりした結果、一気にエラー解決がはかどりました。

生成AI(Gemini)に頼りっきりはダメですね。良い経験をしました。
間違った情報（今はエラーになる、古いバージョンでしか使えないコマンドなど）を平気で送ってきます。[ハルシネーション](https://www.nri.com/jp/knowledge/glossary/lst/ha/hallucination)ですね。そしてそれに対して「〇〇というエラーが出ました」と伝えても有効な解決策を送ってくることはありませんでした。

かなり柔軟な質問をするときのみに生成AIを使っていくことにします。ということで基本はWeb検索をする方向性にシフトします。

# zipダウンロード
では、さっそく`CakePHP`2のzipフォルダをダウンロードしていきます。
「cakephp github」などと検索すれば出てくる、以下ページに進みます。
https://github.com/cakephp/cakephp

私が参考にしていた[dotinstallの講義](https://dotinstall.com/lessons/basic_cakephp)ではversion2.2.0を使っているようだったので、2.2.0を探します。
赤枠のversionが書かれている箇所をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/27c47bd6-30d2-380e-1a59-e91d10b30c92.png)
↓
`Tags`タブをクリックし、ダウンロードしたいversionのセクションをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/dd8f60e8-a0b4-55f6-9f16-210a6270d8af.png)
↓
すると、そのversionのフォルダ・ファイル一覧が表示された画面になるので、赤枠の`Code`セクションをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/1bcca902-6dc6-5d92-900d-b98d95b1bbad.png)
↓
`Download ZIP`をクリックします。すると、自動的にzipフォルダがダウンロードされます。ダウンロードされたzipフォルダは、そのままでは使えないので解凍しておきましょう。これで`CakePHP`のダウンロードは終了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/f695aaaf-19fa-ed9e-eb70-5f5a2781eff2.png)

# 開発環境構築
### エディター
[VSCode](https://code.visualstudio.com)を使用。

### 開発環境
本番環境で開発。

今回はローカル環境ではなくいきなり本番環境で開発を進めました。理由としては、完成したブログアプリのurlを送って人に見てもらう必要があったため、どちらにせよデプロイが必須だったからです。
また、開発自体は1日で終わってしまうような量しかないため、わざわざローカルで試してから本番環境にデプロイするのではなく、最初から本番環境で開発してしまった方が設定などいろいろと楽だと思ったからです。

...というのもありますが最大の原因は、PHPファイルの中身をただの文字列ではなくスクリプトとして実行させてうまくブラウザに表示させるというローカル環境構築ができなかったからです。

`XAMPP`、`AMPP`、`Docker`などの知識が必要になりそうで、自分なりに調べながら丸3日くらいいろいろやってみたのですが一旦ギブアップすることにしました。これは後に勉強したいと思っています。

### サーバ
[さくらのレンタルサーバ](https://rs.sakura.ad.jp/?utm_source=yahoo&utm_medium=cpc&utm_term=%E3%81%95%E3%81%8F%E3%82%89%20%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%20%E3%82%B5%E3%83%BC%E3%83%90&utm_content=%7bKeyword%3a%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%7d%E3%81%AA%E3%82%89&utm_campaign=Search_%E3%83%96%E3%83%A9%E3%83%B3%E3%83%89&yclid=YSS.1001078480.EAIaIQobChMIpb6Z1fDhhQMVVFwPAh1MjQDdEAAYASAAEgJm3vD_BwE)のライトプランを使用。

最初の2週間はお試し期間のため無料でサーバを使用することができます。
レンタルサーバのプランはライト、スタンダード、ビジネス、ビジネスプロの4つです。ライトプランだけデータベースを使用することができません。今回はブログ投稿者や投稿文のデータを保持するということでデータベースを使用したいので、ライトプランではなくスタンダードプランをお試し契約することにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/7d716083-7cdb-8291-f5a5-2c0cbe99de7c.png)


### データベース
`MySQL`を使用。

さくらのレンタルサーバから`phpMyAdmin`で簡単に`MySQL`操作が行えます。

### FTPツール
[FileZilla Client](https://filezilla-project.org/download.php)を使用。

これにより、VSCodeでコードを書きながらその変更をブラウザに簡単に反映させることができます。

これを使わないとさくらレンタルサーバのファイルマネージャーで0から自分でフォルダを作ったりファイルをアップロードしたりする必要があって非常に面倒なので、FTPツールは使うべきだと思います。

# versionエラー
`CakePHP`の2.2.0のzipフォルダをダウンロードした訳ですが、これをさくらレンタルサーバでブラウザ表示してみると、画面には
> Fatal error: Cannot use 'Object' as class name as it is reserved in /home/dotcake/www/blog/lib/Cake/Core/Object.php on line 26

という文言が出ます。どうやらダウンロードしたCakePHPのコードが古いことによりエラーが出ているようです。CakePHP2系の最新versionをダウンロードする必要がありそうです。

# 再ダウンロード
ということで`CakePHP`2系の最新バージョンを探しに行くと、2.10.24が最新のようなので、こちらをダウンロードして使うことにします。

# filezillaエラー
そして、まだやらなければいけないことがあって...

FileZillaで自分の登録してあるさくらレンタルサーバのサーバに接続しようとすると、以下のエラーになりました。
> 状態: "ECONNREFUSED - サーバーによって接続が拒否されました" への接続の試行が失敗しました。
エラー: サーバーに接続できません

これはユーザー名やパスワード、ポート番号など、たくさんある入力事項のうちのどれかが間違っているようですが、どれなのか見当もつきません。ここは苦戦しました。
（さくらレンタルサーバのファイルマネージャーで`CakePHP`のフォルダを自分で0から作り上げていけばFTPツールを使う必要はないのですが、あまりに非効率ですし、単純作業が6時間くらい続くので避けたいと思い、なんとしてもこのエラーを解決したいと奮闘しました）

### エラー解決
エラーコードをコピペしていろいろと調べているうちに、下記サイトを見つけました。
https://hth.guide/ja/fix-econnrefused-connection-refused-by-server-filezilla/
本家(英語版):  https://hth.guide/fix-econnrefused-connection-refused-by-server-filezilla/

ここの「方法1」の箇所に書いてあるようにポート番号を22にしてみましたが、それでもエラーのままでした。
> エラー:	SFTP サーバーに対して FTP 接続を確立できません、適切なプロトコルを選択してください。
エラー:	致命的なエラー: サーバーに接続できません

そこで、今度は21にしてみたところ、ついに接続することができました。

### なぜ21なのか
理由としては、今回使用しているのは、さくらサーバ(＝インターネット)そのものではなくそこに繋げるFileZilla(＝FTP)なので、「インターネット」の80番ではなく「FTP」の21番を使う必要があるから、だと理解しました。

また、activeモード(データ転送用の線をサーバからクライアントに投げるやり方)の20番ではなく、今回はその逆を行う、なのでpassiveモードにすべき、なので21番、という流れですね。理解できました。

下記サイトを参考にさせていただきました。
https://wa3.i-3-i.info/word19675.html

### サーバにアップロード
サーバと接続できたので、自分のPC(ローカル)にある`CakePHP`のフォルダ・ファイル一式をサーバ上にアップロードします。そしてさくらサーバの自分のurlに入ってみると、無事画面に`CakePHP`のwelcomeページが表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/0740aaf2-38c7-3b91-0f87-4a58fbaa2648.png)

# 開発
これでようやく、コードを書いていく開発のフェーズに移ることができます。あとはチュートリアルの通りファイルに上書きする形でコードを書いていきます。この部分は省略します。
なお、ファイルに変更を加えたら、FileZillaを使ってそのファイルだけサーバにアップロードすることで、ローカルの変更をサーバに同期し、ブラウザで簡単に結果を確認することができます。

# sql
データベース・テーブル作成などに関しては、`phpMyAdmin`の`SQL`タブから`SQL`文を実行することで行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620106/3f4eea4e-6017-8496-2a72-d763c1adbe8b.png)