- 投稿日:2019-09-29T22:25:33+09:00
Laravel5.8->6.0 へのバージョンアップ時につまずいた点
laravel/framework 6.0 にバージョンアップする際につまづいた点で、下記のコマンドを実行した際に下記のエラーとなりました。
composer update laravel/framework --with-dependenciescomposer update laravel/framework --with-dependencies Loading composer repositories with package information Updating dependencies (including require-dev) Your requirements could not be resolved to an installable set of packages. Problem 1 - Conclusion: remove fideloper/proxy 4.1.0 - Conclusion: don't install fideloper/proxy 4.1.0 - Conclusion: don't install laravel/framework v6.0.4 - Conclusion: don't install laravel/framework v6.0.3 - Conclusion: don't install laravel/framework v6.0.2 - Conclusion: don't install laravel/framework v6.0.1 - Installation request for fideloper/proxy (locked at 4.1.0, required as ^4.0) -> satisfiable by fideloper/proxy[4.1.0]. - Conclusion: don't install laravel/framework v6.0.0 - fideloper/proxy 4.1.0 requires illuminate/contracts ~5.0 -> satisfiable by laravel/framework[v5.8.17], illuminate/contracts[5.0.x-dev, 5.1.x-dev, 5.2.x-dev, 5.3.x-dev, 5.4.x-dev, 5.5.x-dev, 5.6.x-dev, 5.7.17, 5.7.18, 5.7.19, 5.7.x-dev, 5.8.x-dev, v5.0.0, v5.0.33, v5.1.1, v5.1.13, v5.1.16, v5.1.20, v5.1.22, v5.1.25, v5.1.28, v5.1.30, v5.1.31, v5.1.41, v5.1.8, v5.2.0, v5.2.19, v5.2.21, v5.2.24, v5.2.25, v5.2.26, v5.2.27, v5.2.28, v5.2.31, v5.2.32, v5.2.37, v5.2.43, v5.2.45, v5.2.6, v5.2.7, v5.3.0, v5.3.16, v5.3.23, v5.3.4, v5.4.0, v5.4.13, v5.4.17, v5.4.19, v5.4.27, v5.4.36, v5.4.9, v5.5.0, v5.5.16, v5.5.17, v5.5.2, v5.5.28, v5.5.33, v5.5.34, v5.5.35, v5.5.36, v5.5.37, v5.5.39, v5.5.40, v5.5.41, v5.5.43, v5.5.44, v5.6.0, v5.6.1, v5.6.10, v5.6.11, v5.6.12, v5.6.13, v5.6.14, v5.6.15, v5.6.16, v5.6.17, v5.6.19, v5.6.2, v5.6.20, v5.6.21, v5.6.22, v5.6.23, v5.6.24, v5.6.25, v5.6.26, v5.6.27, v5.6.28, v5.6.29, v5.6.3, v5.6.30, v5.6.31, v5.6.32, v5.6.33, v5.6.34, v5.6.35, v5.6.36, v5.6.37, v5.6.38, v5.6.39, v5.6.4, v5.6.5, v5.6.6, v5.6.7, v5.6.8, v5.6.9, v5.7.0, v5.7.1, v5.7.10, v5.7.11, v5.7.15, v5.7.2, v5.7.20, v5.7.21, v5.7.22, v5.7.23, v5.7.26, v5.7.27, v5.7.28, v5.7.3, v5.7.4, v5.7.5, v5.7.6, v5.7.7, v5.7.8, v5.7.9, v5.8.0, v5.8.11, v5.8.12, v5.8.14, v5.8.15, v5.8.17, v5.8.18, v5.8.19, v5.8.2, v5.8.20, v5.8.22, v5.8.24, v5.8.27, v5.8.28, v5.8.29, v5.8.3, v5.8.30, v5.8.31, v5.8.32, v5.8.33, v5.8.34, v5.8.35, v5.8.4, v5.8.8, v5.8.9]. - Can only install one of: laravel/framework[6.x-dev, v5.8.17]. - don't install illuminate/contracts 5.6.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.10|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.12|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.14|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.29|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.38|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.39|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.5|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.6.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.18|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.7.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.10|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.5|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.7.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.8.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.11|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.12|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.14|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.15|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.18|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.29|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.3|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.8.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.0.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.1.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.2.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.3.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.4.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts 5.5.x-dev|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.0.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.0.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.1|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.20|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.22|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.30|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.41|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.1.8|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.21|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.24|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.25|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.26|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.31|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.32|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.43|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.45|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.6|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.2.7|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.23|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.3.4|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.13|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.19|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.27|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.4.9|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.0|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.16|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.17|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.2|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.28|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.33|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.34|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.35|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.36|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.37|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.39|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.40|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.41|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.43|don't install laravel/framework 6.x-dev - don't install illuminate/contracts v5.5.44|don't install laravel/framework 6.x-dev - Installation request for laravel/framework ^6.0 -> satisfiable by laravel/framework[6.x-dev, v6.0.0, v6.0.1, v6.0.2, v6.0.3, v6.0.4].その後の対応としては、 fideloper proxy 4.1.0 をcomposer.json から削除したり、laravel/frameworkをcomposer.jsonから削除したりしましたが同じエラーとなりました。(laravel/frameworkのエラー)
解決法
下記の操作で正常にlaravel6.0のインストールができました。
- 1.laravel/framework と、fideloper/proxy4.1.0 を composer.json から削除
- 2.composer update を実行Laravel5.8 -> 6.0での変更点での修正した部分
ユニットテストで落ちていた部分に関して下記の変更を行いました。
1. Langファサードのtrans メソッドが廃止
https://readouble.com/laravel/6.0/ja/upgrade.html#trans-and-trans-choice
→getメソッドに変更し対応しました。2. helper関数str_○○が廃止
https://qiita.com/sasakure-kei@github/items/adc64bed00e7c66996e2
テストではstr_random 関数が無くて落ちていました。
→Illuminate\Support\Str::randomメソッドに変更し対応しました。以上です。
- 投稿日:2019-09-29T21:33:48+09:00
CakePHP3 アソシエーションの設定済みテーブル/ドット記法/contain済みデータを表示させるまで(19/9/29)
■今回、画像投稿型の...
...あるテーマに沿ったサイトを
ポートフォリオとして制作中に確認できた、
今後に活かせる(未来の自分をハマらせない)ちょっとした内容ですが、
しっかり記録を残しておこうと思います。■不明だったこと■
公式ドキュメントを参照にcontain、belongs to、hasmanyに
ついて学び、Model(テーブル)と、controllerに記述はしたものの、
「では、ctpファイル(表示させる部分)にはどのように記述すればいいの?」
ということがわからない状況が続いていました。■解消できたこと■
特定のキーワード(Icesテーブル内の特定フィールド)を元に
「検索」された「記事」に「他ユーザが投稿した、投稿済みコメント」
を表示させ、さらに「投稿済みコメントの投稿ユーザ」の「ニックネーム」
を表示させ、さらにその「ニックネーム」をクリックすると、
そのユーザーの詳細情報に画面遷移させることができるようになりました。■テーブル■
Users(ユーザ情報が入る:ここにニックネーム有り)
Ices(ブログ記事が入る)
Comments(ブログ記事に対して他ユーザがコメント時のデータが入る)■環境■
AWS Cloud9:無料枠
MySQL:ver5.7.26
CakePHP:ver3.8.2
PHP:ver7.2.19■結果■
ctpファイル内に下記のように記述することで、
上記の「解消できたこと」につながりました。/src/Template/Ices/ranking.ctp<?php foreach ($ices as $ice): ?> // // 一部省略 // // <h3>ここからコメント</h3> <?php if ($ice->comments): ?> <p><?= h($ice->comments[0]->comment) ?></p> //↓このpタグ内がポイント// <p>BY<?= $this->Html ->link( h($ice->comments[0]->user->nickname), ['controller' => 'Users', 'action' => 'view', $ice->comments[0]->user['id']]) ?></p> //↑このpタグ内がポイント// <?php else: ?> <p>コメントはまだありません。</p> <?php endif ?> <?php endforeach; ?>▽関係アリと思われる部分と解消方法▽
/src/Model/Table/CommentsTable.phpの、
foreignKeyがあったことで、Commentsテーブルに
紐づくUsersテーブルの情報が引っ張ってこれなかったようです。
そのモデル内の修正と、ctpファイルへの記述を変更し、
解決に至りました。/src/Model/Table/UsersTable.phpparent::initialize($config); // // 一部省略 // // $this->hasMany('Comments',[ 'foreignKey' => 'user_id' ]); $this->hasMany('Ices', [ 'foreignKey' => 'user_id' ]); $this->hasMany('Comments', [ 'foreignKey' => 'user_id' ]);/src/Model/Table/IcesTable.phppublic function initialize(array $config) { // // 一部省略 // // $this->belongsTo('Users', [ 'foreignKey' => 'user_id', 'joinType' => 'INNER' ]); $this->hasMany('Comments', [ 'foreignKey' => 'ice_id' ]); }/src/Model/Table/CommentsTable.phppublic function initialize(array $config) { // // 一部省略 // // $this->belongsTo('Ices', [ 'foreignKey' => 'ice_id', 'joinType' => 'INNER' ]); $this->belongsTo('Users', [ //'foreignKey' => 'id', //↑これがあったから、ひっぱってこれなかった 'joinType' => 'INNER' ]); }/src/Controller/IcesController.phppublic function search() { $ices = $this->Ices->find('all'); $manufacturer = isset($this->request->query['manufacturer']) ? $this->request->query['manufacturer'] : null; $keyword = isset($this->request->query['keyword']) ? $this->request->query['keyword'] : null; if($manufacturer){ $where = ['Ices.manufacturer' => $manufacturer]; if ($keyword) { $where['OR']['Ices.ice_fraver LIKE'] = "%$keyword%"; $where['OR']['Ices.simple_comment LIKE'] = "%$keyword%"; } $ices = $this->Ices->find(); $ices->where($where) //↓ここがポイント!! ->contain(['Comments.Users','Users']) //"Comments.Users"の意味は... //Icesテーブルに紐づく、 //Commentsテーブルの情報と、 //Commentsテーブルに紐づく、Usersテーブルの情報。 //という意味で、 //"Users"の部分は、 //Icesテーブルに紐づく、 //Userテーブルの情報を含む... //という意味になる。 ->all(); $this->set('manufacturer', $manufacturer); $this->set('keyword', $keyword); $this->set('ices', $this->paginate($ices)); $this->render('ranking'); } }▽参考マニュアル(CakePHP公式ドキュメント)
https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html
https://book.cakephp.org/3.0/ja/orm/associations.html■最後に自分へ一言
debugをした結果、そこに取得希望のフィールドが表示されていなければ、
必ず取得の方法から見直すこと。
そうすれば、あとは表示方法を模索するだけ。
- 投稿日:2019-09-29T19:39:16+09:00
VirtualBox上のCentOS7にdockerでpostgresql+PHP+Apache環境を構築
はじめに
かなり期間が空いてしましましたが、
ローカル環境にVirtualBoxを使用して開発環境を構築する作業の3回目です。
前々回はDBサーバ、
前回はWEBサーバを構築しました。
今回は、DBサーバ+WEBサーバ+PHPアプリの環境を構築します。
イメージとしては、DBの値を取得して、WEBサーバ上にPHPで表示します。作業環境
- MacOS X Yosemite 10.10.5
1.Docker Compose
今回は「Docker Compose」を使用して、複数のサーバを一度に操作する手順でまとめます。
インストール手順は、公式サイトの手順を参考に実施してください。2.ディレクトリ構成
今回は以下の構成で各ファイルを用意しました。
docker-php-postgres ┣ docker-compose.yml // Docker Composeの設定ファイル(3.参照) ┣ docker-file ┃ ┣ db ┃ ┃ ┣ Dockerfile // DBサーバ用のDockerfile(4.参照) ┃ ┃ ┣ docker-entrypoint-initdb.d ┃ ┃ ┣ 01_createdb.sql // DB作成用SQL ┃ ┣ web ┃ ┣ Dockerfile // WEBサーバ用のDockerfile(6.参照) ┃ ┣ php.ini // PHP設定ファイル(7.参照) ┣ volumes ┣ web ┣ html ┣ index.php // PHPファイル(8.参照)3. docker-compose.yml
version: '3' services: web: build: ./docker-file/web/ ports: - 8080:80 volumes: - ./volumes/web/html/:/var/www/html:z // :zを忘れないように。 depends_on: - db db: build: ./docker-file/db/ ports: - 5432:5432 environment: - POSTGRES_USER=testuser - POSTGRES_PASSWORD=password4. DBサーバ用Dockerfile
FROM postgres:9.3 RUN apt-get update RUN apt-get install -y vim less COPY ./docker-entrypoint-initdb.d/01_createdb.sql /docker-entrypoint-initdb.d/ EXPOSE 54325. DB作成用SQL
DB作成用SQLとテーブル作成SQLファイルをdocker-entrypoint-initdb.d配下に作成します。
今回は「01_createdb.sql」という名称で
testdbというDB、test_tableというテーブルを作成します。
test_tableテーブルには、idカラムとkeywordカラムを用意して、
適当な値を設定しておきます。6. WEBサーバ用Dockerfile
# Apache モジュールが同梱された PHP コンテナイメージ FROM php:apache RUN apt-get update RUN apt-get install -y vim less # Postgres関連のPHPエクステンションをインストール RUN set -ex apk --no-cache add postgresql-dev libpq-dev RUN apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql pgsql mbstring # PHPの設定ファイルをコピー COPY ./php.ini /usr/local/etc/php/7. PHP設定ファイル
[Core] display_errors = On error_reporting = E_ALL error_log = /var/log/apache2/error.log log_errors = On [Date] date.timezone = 'Asia/Tokyo' [mbstring] mbstring.language = Japanese mbstring.internal_encoding = auto mbstring.http_input = auto mbstring.http_output = auto mbsting.encoding_translation = Off mbstring.detect_order = auto8. PHPファイル
DBのテーブル内容を取得して、出力する単純なPHPファイルです。
$conn = "host=docker-php-postgres_db_1 port=5432 dbname=testdb user=testuser password=password"; $link = pg_connect($conn); if (!$link) { exit('接続失敗です。'.pg_last_error()); } pg_set_client_encoding("sjis"); $result = pg_query('SELECT id, keyword FROM test_table'); if (!$result) { exit('クエリーが失敗しました。'.pg_last_error()); } for ($i = 0 ; $i < pg_num_rows($result) ; $i++){ $rows = pg_fetch_array($result, NULL, PGSQL_ASSOC); print('id='.$rows['id']); print(',keyword='.$rows['keyword'].'<br>'); } $close_flag = pg_close($link); if (!$close_flag){ print('切断に失敗しました。<br>'); } ?> </body> </html>9. コンテナ起動
3.〜8. のファイルが準備でき次第、以下のコマンドを実行します。
このコマンドはビルドまで行ってくれます。$ docker-compose up -dビルドのみ行いたい場合は、以下のコマンドを実行します。
$ docker-compose buildコマンドを実行した後、コンテナが起動したかどうかを以下のコマンドで確認します。
$ docker-compose ps root@localhost docker-php-postgres]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f078f9167ad6 docker-php-postgres_web "docker-php-entryp..." 41 seconds ago Up 36 seconds 0.0.0.0:8080->80/tcp docker-php-postgres_web_1 c51a280c6d44 docker-php-postgres_db "docker-entrypoint..." 45 seconds ago Up 41 seconds 0.0.0.0:5432->5432/tcp docker-php-postgres_db_1起動ができたら、ブラウザから起動したWEBサーバのindex.phpにアクセスしてみます。
アクセスして、テーブルの内容が表示されていたら、完了です。http://【VirtualBox IPアドレス】:8080/index.php
10. コンテナの停止
コンテナの停止は以下のコマンドを実行します。
$ docker-compose stop
これでDBサーバ+WEBサーバ+PHPアプリの環境を構築できました。
今回の学習したものをベースに、
dockerを使用した様々な環境構築を実施していきたいと思っています。参考URL
https://www.key-p.com/blog/staff/archives/106755
https://docs.docker.com/compose/install/
https://qiita.com/uhooi/items/fb14d99d3323bd2eee9d
https://mizominton.hatenablog.jp/entry/docker-cakephp1.3
https://qiita.com/nagi244/items/e5de6fc062fdcc5004e9
- 投稿日:2019-09-29T17:54:26+09:00
Laravel5.8でブックマークアプリを作るチュートリアル(動画版)
Laravel5.8でブックマークアプリを作るチュートリアルを動画(Youtube)で作成しました。
いろいろ安定していない感ありますが、よろしかったらぜひ!第1回 インストール&初期設定編
Laravelのインストールから初期設定までを行なっています。
第2回 アプリケーションのデモ
なぜか2回目のアプリの動作デモです。
最終的にはちょっと変わってしまいましたが。第3回 Router編
アプリケーションの入り口であるルーターについて。
第4回 データベース編
マイグレーションでデータベースを構築して、シーダーでダミーデータを入れるところまで。
第5回 データベースのデータを表示しよう
登録したダミーデータからデータを取得して一覧ページを作成します。
第6回 詳細ページの作成
データベースからID検索でレコードを取得して、詳細ページを作成します。
詳細ページ用のルーティングやモデルバイディングの解説もしてます。第7回 レコード追加機能の作成
データベースにレコードを新規登録する機能を作成します。
第8回 レコード更新機能の作成
レコードの更新機能の作成と、ビューファイルを共通ファイルにしてインクルードする方法。
第9回 レコードの削除とフラッシュメッセージ
レコードの削除機能とフラッシュメッセージを作成します。
第10回 入力フォームのチェック機能(バリデーション)
入力フォームのチェック(バリデーション)機能を作成します。
第11回 ユーザー登録・認証機能の作成
ユーザー認証・登録機能を作成します。主にビューファイルの編集です。
第12回 タグCRUD(作成・読み込み・更新・削除)機能の作成
今までのおさらいも兼ねて、タグのCRUD機能の作成します。
第13回 データベースのリレーション設定(ブックマークとタグの関連付け)
今までのおさらいも兼ねて、タグCRUD機能の作成します。
第14回 リレーション(タグ)の表示とデバッグツールについて
設定したリレーション(タグ)の表示とデバッグツール(Clockwork)を使用して、クエリの確認を行います。
ソースコードはこちら
https://github.com/k-ishiwata/BookmarkApp
- 投稿日:2019-09-29T16:44:57+09:00
XAMPPでPHPの環境構築をする方法!
どうも。Hiroyukiです!
本日は、初心に帰って環境構築のお話をします。初心って言ってもプログラミング歴はまだまだ浅いボクなのですが(^^;)
ぜひ見て下さい!プログラミング初学者に、立ちはだかる壁
「うしっ!! PHPでプログラミングをやるぞ!!!!」
となった時に初心者に立ちはだかる壁、
それが開発環境構築・・・。「環境構築っすか? 手間だし、挫折しがちだし、苦手っす・・・」
と思う方もいらっしゃると思いますが、
この記事を見てサクッと終わらせちゃいましょう〜!XAMPPのダウンロード
まず、下記のサイトから、各OS向けのXAMPP-VMをダウンロードして下さい。
XAMPP
https://www.apachefriends.org/jp/index.html
ここでは、(ボクのPCがMacなのもあって)
「Mac OS」 向けの導入方法をご説明していきます。Windowsユーザ向けの導入方法は、下記のサイトに詳しいので、こちらをご覧下さい!
XAMPPによるPHPのインストール(Windowsメイン)
https://www.sejuku.net/blog/29289
さて、ダウンロードが完了したら、ダウンロードファイルを展開して
XAMPPをアプリケーションフォルダへ移動させまーすこれで、インストールが無事完了。
XAMPPの使い方
コントロールパネルの
Generalタブから、XAMPPを起動させます。
「Start」ボタンを押すと、右上の赤丸が、緑色に変わると思います。
次に、
Servicesタブで、Apacheが立ち上がっているかどうかを確認します。
しばらく待てば自動で起動するはずですが、万一スタートされていないようでしたら
「Start」ボタンを押して起動して下さい!
次に、
Volumesタブに移ります。
「Mout」ボタンを押すことで、仮想マシンのディレクトリを操作可能です。
「Mout」ボタン ⇨ 「Explore」ボタン の順で押しませう〜
「Explore」ボタンを押しますと、XAMPPのディレクトリが開かれます!
下記を見ていただいたら分かるのですが、
lamppの「htdocs」がXAMPPのドキュメントルートとなりまして
開発する際は、この「htdocs」の中に開発ファイルを置いていく形です。
PHPファイルを表示させてみよう!!
では、試しに
立ち上がったサーバ上にファイルを置いて、表示させてみましょ〜早速ですが、下記のように適当なファイル(sample.php)を作り、
中身に「Hello World!」とでも書きます。
そして、
sample.phpを、「htdocs」直下に置きます。
先ほどの
XAMPPの Generalタブに戻り
「Go to Application」ボタンを押して下さい!
すると、XAMPPのダッシュボードが表示されるのですが
URLの最後の部分に注目!!
URL [192.168.●●.●/dashboard/]
となっていると思いますが、
最後の部分を、下記の通り、先ほどの表示させたいファイル名に変えて下さい。
URL [192.168.●●.●/sample.php/]
このように変更すると、、、
表示完了〜!
めでたしめでたしーーー!!
無事ローカルで開発環境が構築されたのが分かると思います^^
ここまで説明してきて何ですが
MacではMAMPを利用して環境構築する方が多い様です。また、そのやり方も含めて、
こういう基礎的な環境構築方法などを取り上げてご説明できればと思います。
では、Hiroyukiでした〜!
- 投稿日:2019-09-29T16:03:22+09:00
Google App EngineでWordPressを構築する
公式ページのアップデート版(非公式)です。
App Engine フレキシブル環境での WordPress のホスティング作業手順
- GCPプロジェクト作成
- Cloud SQLインスタンス作成と設定
- WordPressプロジェクトの設定
- App Engine環境へのデプロイ
1. GCPプロジェクト作成
- GCPプロジェクトの課金が有効になっているか確認
- 必要なAPIが有効になっているか確認
- Cloud SDKをインストール
- サービスアカウントを作成
- PHPとComposerをインストール
- Cloud SQLプロキシをダウンロード
- MySQLクライアントをインストール
2. Cloud SQLインスタンス作成と設定
- Cloud SQLインスタンスを作成する
gcloud sql instances create [インスタンス名] \ --activation-policy=ALWAYS \ --tier=db-n1-standard-1 --region=asia-northeast1
- Cloud SQLプロキシを実行
./cloud_sql_proxy \ -dir /tmp/cloudsql \ -instances=[プロジェクトID]:asia-northeast1:[インスタンス名]=tcp:3306 \ -credential_file=[サービスアカウントのJSONファイル]以下のエラーが発生した場合は、ポート番号を変更してください。
listen tcp 127.0.0.1:3306: bind: address already in use
- 新しいデータベースとユーザを作成
mysql -h 127.0.0.1 -u root --password=[パスワード] mysql> create database [データベース名]; mysql> create user '[ユーザ名]'@'%' identified by '[パスワード]'; mysql> grant all on [データベース名].* to '[ユーザ名]'@'%'; mysql> exit3. WordPressプロジェクトの設定
- Githubからリポジトリをクローン
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
- サンプルディレクトリに移動(今回はフレキシブル環境の例です)
cd php-docs-samples/appengine/flexible/wordpress
- 依存関係をインストール
composer install
- ヘルパースクリプトを実行
php wordpress.php setup -n \ --dir [WordPressのプロジェクト名] \ --db_instance=[インスタンス名] \ --db_name=[データベース名] \ --db_user=[ユーザ名] \ --project_id=[プロジェクトID] \ --db_password=[パスワード] \ --db_region=asia-northeast1ヘルパースクリプトがwordpress/wp-config.phpに以下の内容を書き込みます。
if ($onGae) { / Production environment */ define('DB_HOST', ':/cloudsql/[プロジェクトID]:asia-northeast1:[インスタンス名]'); / The name of the database for WordPress / define('DB_NAME', '[データベース名]'); / MySQL database username */ define('DB_USER', '[ユーザ名]'); / MySQL database password / define('DB_PASSWORD', '[パスワード]'); } else { / Local environment */ define('DB_HOST', '127.0.0.1'); / The name of the database for WordPress / define('DB_NAME', '[データベース名]'); / MySQL database username */ define('DB_USER', '[ユーザ名]'); / MySQL database password / define('DB_PASSWORD', '[パスワード]'); }App Engine環境へのデプロイ
- WordPressプロジェクトへ移動
cd wordpress-project
- デプロイを実行
gcloud app deploy -q \ --promote --stop-previous-version app.yaml cron.yaml
- サイトにアクセスして、表示を確認
gcloud app browseTips
GAE上のファイル、ディレクトリ権限を変更したい場合
- app.yamlファイルで、skip_lockdown_document_rootをtrueにする
runtime_config: document_root: wordpress skip_lockdown_document_root: true管理画面の言語を日本語に変更したい場合
- 日本語版WordPressをダウンロード
- languageディレクトリ配下を全て日本語版に置き換える
- 投稿日:2019-09-29T16:03:22+09:00
Google App Engine(GAE)でWordPressを構築する
公式ページのアップデート版(非公式)です。
App Engine フレキシブル環境での WordPress のホスティング作業手順
- GCPプロジェクト作成
- Cloud SQLインスタンス作成と設定
- WordPressプロジェクトの設定
- App Engine環境へのデプロイ
1. GCPプロジェクト作成
- GCPプロジェクトの課金が有効になっているか確認
- 必要なAPIが有効になっているか確認
- Cloud SDKをインストール
- サービスアカウントを作成
- PHPとComposerをインストール
- Cloud SQLプロキシをダウンロード
- MySQLクライアントをインストール
2. Cloud SQLインスタンス作成と設定
- Cloud SQLインスタンスを作成する
gcloud sql instances create [インスタンス名] \ --activation-policy=ALWAYS \ --tier=db-n1-standard-1 --region=asia-northeast1
- Cloud SQLプロキシを実行
./cloud_sql_proxy \ -dir /tmp/cloudsql \ -instances=[プロジェクトID]:asia-northeast1:[インスタンス名]=tcp:3306 \ -credential_file=[サービスアカウントのJSONファイル]以下のエラーが発生した場合は、ポート番号を変更してください。
listen tcp 127.0.0.1:3306: bind: address already in use
- 新しいデータベースとユーザを作成
mysql -h 127.0.0.1 -u root --password=[パスワード] mysql> create database [データベース名]; mysql> create user '[ユーザ名]'@'%' identified by '[パスワード]'; mysql> grant all on [データベース名].* to '[ユーザ名]'@'%'; mysql> exit3. WordPressプロジェクトの設定
- Githubからリポジトリをクローン
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
- サンプルディレクトリに移動(今回はフレキシブル環境の例です)
cd php-docs-samples/appengine/flexible/wordpress
- 依存関係をインストール
composer install
- ヘルパースクリプトを実行
php wordpress.php setup -n \ --dir [WordPressのプロジェクト名] \ --db_instance=[インスタンス名] \ --db_name=[データベース名] \ --db_user=[ユーザ名] \ --project_id=[プロジェクトID] \ --db_password=[パスワード] \ --db_region=asia-northeast1ヘルパースクリプトがwordpress/wp-config.phpに以下の内容を書き込みます。
if ($onGae) { / Production environment */ define('DB_HOST', ':/cloudsql/[プロジェクトID]:asia-northeast1:[インスタンス名]'); / The name of the database for WordPress / define('DB_NAME', '[データベース名]'); / MySQL database username */ define('DB_USER', '[ユーザ名]'); / MySQL database password / define('DB_PASSWORD', '[パスワード]'); } else { / Local environment */ define('DB_HOST', '127.0.0.1'); / The name of the database for WordPress / define('DB_NAME', '[データベース名]'); / MySQL database username */ define('DB_USER', '[ユーザ名]'); / MySQL database password / define('DB_PASSWORD', '[パスワード]'); }App Engine環境へのデプロイ
- WordPressプロジェクトへ移動
cd wordpress-project
- デプロイを実行
gcloud app deploy -q \ --promote --stop-previous-version app.yaml cron.yaml
- サイトにアクセスして、表示を確認
gcloud app browseTips
GAE上のファイル、ディレクトリ権限を変更したい場合
- app.yamlファイルで、skip_lockdown_document_rootをtrueにする
runtime_config: document_root: wordpress skip_lockdown_document_root: true管理画面の言語を日本語に変更したい場合
- 日本語版WordPressをダウンロード
- languageディレクトリ配下を全て日本語版に置き換える
- 投稿日:2019-09-29T12:32:13+09:00
自分の務めてる会社の1次入社試験(過去問)
自分の務めてる会社の入社試験(過去問)です。
これぐらいのことは出来てもらわないと困るという事で出題したのですが
どうもこの問題難しいのか?
ここまで漕ぎ着けて採用された人はひとりしかいない。大手の会社にはこんなの簡単だよという人は
たくさんいると思いますが、自分の務めてる会社は
どちらかと言えば零細企業です。
こういう問題出しても中々、解けない人が多くて
採用まで至らないのが現状です。※今は募集していません。
■問題
郵便番号入力すると検索結果を表示するようにせよ。
また下記の条件を満たしていることとする。
1.サジェスト機能がある。
2.PHP言語を使用。
3.非同期処理。※基本的な事を知ってれば、たぶん数時間もしないで完成かと思います。
単なるこれだけでも、中々出来る人が来ない。
これが零細企業地方の現状です。次、誰が採用問題作るだろうか?...orz
- 投稿日:2019-09-29T12:08:42+09:00
SlackBotに挑戦(2) - Request Varification
SlackBotをまじめに学ぶ(2回目)
はじめに
前回、Heroku上にウェブアプリケーションを構築し、Slackワークスペースからスラッシュコマンドを受け取るところまでやりました。インターネット上にSlackからのリクエストを受け付ける先を公開したわけですが、送信元がSlackに限られるわけではなく、悪意があれば誰でもリクエストを送ることができるので、怖いですね。
ということで、公開したAPIへのリクエストが、自分が作ったSlack Appから送られたものかを検証する方法を実装しておきます。ここに英語で書いてあることを、PHPとLaravelでやっているだけです。
https://api.slack.com/docs/verifying-requests-from-slack今回使う環境
- Heroku
- PHP 7.3
- Laravel 6.0.3
- Clear DB
- Windows
- PHP 7.2.11
- Laravel 6.0.3
- Maria DB Ver 15.1
前回どおり、基本的にはWindowsでの作業です。
やってみよう
検証方法は2つあります。1つ目は推奨されていないのでさらっと行きます
1. Verification Token
この方法は推奨されていません。
何もしないより良いかなと思いますが、in comming monthで完全になくなると言っているので危ないかもしれません。Verification token deprecation
We'll continue allowing apps to use verification tokens for now. However, we will retire them completely in coming months. We strongly recommend switching to request signing as soon as possible.Basic InformationにあるVerification Tokenの値をメモします。
スラッシュコマンドのパラメータの一つとして、
Verification Token
の値がそのまま渡されます。
自分で作ったアプリケーションは、Basic Informationに表示されているTokenの値と、リクエストで渡ってきたTokenの値が一致するかを調べるだけです。一致するときは、正しいSlackのサーバーからきたと見なすことになります。Verification Tokenの値を秘密にしておく必要があります。
2. Signing Secret
こちらが新しく推奨されている
Signing Secret
という方法です。検証手順は以下のとおりです。
Signing Secret
をBasic Informationから調べる- リクエストヘッダーの
X-Slack-Request-Timestamp
を取得する- リクエストボディを無加工で取得する
- Slackが決めたルールで文字列を結合する
Signing Secret
と4で作った文字列から、sha256のハッシュ値をとる- リクエストヘッダーの
X-Slack-Signature
で渡ってきた値と比較する- 一致するときは正しいリクエストとみなす
これをLaravelで実装していきます。
Controller
まずは、新しいContoroller(VerificationController.php)を作り、verifyメソッドとして実装します。
app/VerificationController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Log; class VerificationController extends Controller { public function verify(Request $request){ $timestamp = $request->header('x-slack-request-timestamp'); $signature = $request->header('x-slack-signature'); $requestBody = $request->getContent(); $secret = config('app.slack.signing_secret'); $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody; $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret); $debug = ['Timestamp'=>$timestamp, 'Body'=>$requestBody, 'Sig'=>$sigBasestring, 'Secret'=>substr_replace($secret,'*',5), 'Hash'=>$hash, 'Signature'=>$signature,]; return response()->json($debug); } }特に解説は不要ですね。
取得した値と計算した結果をreturnするだけのものです。route設定
作ったメソッドを
/api/verify-test
でアクセスできるように登録します。エンドポイントは、https://slalack-bot.herokuapp.com/api/verify-test になります。routes/api.phpRoute::any('/verify-test', 'VerificationController@verify');config/.env設定
.envにSigning Secretの値を登録する。
HerokuのConfigにセットするのを忘れずに。.envSLACK_SIGNING_SECRET=70cad**********Laravelのconfig経由で、Signing Secretが取れるように登録します。
config/app.php/* |-------------------------------------------------------------------------- | Class Aliases |-------------------------------------------------------------------------- | | This array of class aliases will be registered when this application | is started. However, feel free to register as many as you wish as | the aliases are "lazy" loaded so they don't hinder performance. | */ 'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, //省略 ], //ここ追加 'slack' => ['signing_secret'=>env('SLACK_SIGNING_SECRET')], ];Herokuにデプロイすると、以下のURLでアクセスできるようなります。
https://slalack-bot.herokuapp.com/api/verify-testスラッシュコマンド登録
Slackから/verify-testで呼び出すコマンドを登録します。RequestURLは https://slalack-bot.herokuapp.com/api/verify-test に設定します。
動作確認
slackのメッセージボックスから/verify-testを呼びます。追加のメッセージは何でも構いません。
だらだらとJSONがかえってきていますが、大事なのは最後の2つだけです。Hashが自分で計算して作った値、SignatureがSlackから送られてきた値です。両者が一致しているので実装方法に誤りはなさそうです。
一致しているので、このリクエストはSlackから送られてきた正規なリクエストとみなして良いということです。"Hash":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521" "Signature":"v0=098ea4338850dc6004b89d24f2a2d06ac12f6f138121df9ad0a74bec8db32521"LaravelのMiddleware化する
各コントローラのメソッドでverifyメソッドと同じことをするのは面倒なので、Laravelのmiddlewareに実装して自動適用するように変えてみます。
Middlewareクラスの生成
artisanコマンドでひな型を作ります。
php artisan make:middleware SlackRequestVerification Middleware created successfully.検証ロジックを実装
作られたひな形の
handle
メソッドに検証ロジックを実装します。VerificationControllerに書いた処理をそのまま持ってくるだけです。App\Http\Middleware\SlackRequestVerification<?php namespace App\Http\Middleware; use Closure; use Log; class SlackRequestVerification { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $timestamp = $request->header('x-slack-request-timestamp'); $signature = $request->header('x-slack-signature'); $requestBody = $request->getContent(); $secret = config('app.slack.signing_secret'); $sigBasestring = 'v0:' . $timestamp . ':' . $requestBody; $hash = 'v0=' . hash_hmac('sha256', $sigBasestring, $secret); $debug = ['Timestamp'=>$timestamp, 'Body'=>$requestBody, 'Sig'=>$sigBasestring, 'Secret'=>substr_replace($secret,'*',5), 'Hash'=>$hash, 'Signature'=>$signature,]; \Log::debug($debug); //不一致なら500で終わり if( $hash !== $signature ){ return response()->json([ 'ok'=>false, 'error' => 'signature error', ], '500'); } //念のため、verificationをした証拠を入れておく $verified = [ 'slack_signing_verification'=>true, 'slack_use_secret'=>substr_replace($secret,'*',5), 'slack_verify_hash'=>$hash, ]; $request->merge($verified); //次の処理へ return $next($request); } }Middlewareの登録
HttpのKernelに登録します。今回はSlackからのリクエストはすべて
/api/*
で受けるので、apiのmiddlewareグループに登録しました。app/Http/Kernel.php/** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, ], 'api' => [ //ここに追加 \App\Http\Middleware\SlackRequestVerification::class, 'throttle:60,1', 'bindings', ], ];ここまでの変更をHerokuにデプロイします。
動作確認
正常動作
無事、middlewareを経由して処理されて、Verificationが正常に終わり、Controllerに処理が伝わりました。middlewareでrequestに追加した3つの値も確認できました。
エラー
ブラウザでGETのリクエストを送ってみると、エラーメッセージが受け取れます。
https://slalack-bot.herokuapp.com/api/debug{"ok":false,"error":"signature error"}まとめ
Slack Signing VerificationをLaravelアプリに実装しました。Slackのサーバーから正しく届いたメッセージであることを確認する方法を入れたので、安心感が増しました。
参考資料
- 投稿日:2019-09-29T11:58:48+09:00
CentOS 7にPHP 7.2をインストール(IUS Community Project)
はじめに
IUS Community Projectを利用してCentOS7にPHP7.2をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUSサポート
本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2020-11-30がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。LOG
インストール
# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) # yum install -y https://centos7.iuscommunity.org/ius-release.rpm ... 略 # yum install -y mod_php72u php72u-cli which ... 略各種確認
# which php /usr/bin/php # php -v PHP 7.2.22 (cli) (built: Aug 30 2019 15:12:58) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies # yum info mod_php72u Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * epel: nrt.edge.kernel.org * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Installed Packages Name : mod_php72u Arch : x86_64 Version : 7.2.22 Release : 1.el7.ius Size : 10 M Repo : installed From repo : ius Summary : PHP module for the Apache HTTP Server URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA Description : The mod_php72u package contains the module which adds support for the PHP : language to Apache HTTP Server. # yum info php72u-cli Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * epel: ftp.riken.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Installed Packages Name : php72u-cli Arch : x86_64 Version : 7.2.22 Release : 1.el7.ius Size : 15 M Repo : installed From repo : ius Summary : Command-line interface for PHP URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL Description : The php-cli package contains the command-line interface : executing PHP scripts, /usr/bin/php, and the CGI interface.
- 投稿日:2019-09-29T11:02:01+09:00
Laravel Statsを使ったソースコードの分析
2019年9月1日にv2.0がリリースされました?
v2.0になってからこのパッケージの存在を知ったので、写経用に作成していたLaravelプロジェクトの更新を兼ねてインストールしてみました。
インストール条件
v2.0を使用する場合は次の条件を満たしている必要があります。
- PHP 7.2以上
- Laravel v5.8以上もしくはLumen v5.8以上
Lumenでも使用可能とのことですが、今回はLaravelでの使用方法を記述します。
インストール
次のコマンドを実行することでインストールできます。
$ composer require "wnx/laravel-stats" --devサービスプロバイダーの設定は自動で行われますが、手動で行う場合は
config/app.php
に次のコードを追加できます。'providers' => [ // ... \Wnx\LaravelStats\StatsServiceProvider::class, ]別途コンフィグファイルを作成する場合は以下のコマンドを実行することで作成されます。
$ php artisan vendor:publish --provider="Wnx\LaravelStats\StatsServiceProvider"実行が完了すると以下のようなファイルが
config/stats.php
として作成されます。(以下のコードはコメントを書き換えています。)<?php return [ /* * 出力対象のパス */ 'paths' => [ base_path('app'), base_path('database'), base_path('tests'), ], /* * 出力対象外とするファイル・ディレクトリ */ 'exclude' => [ base_path('tests/bootstrap.php'), // base_path('app/helpers.php'), // base_path('app/Services'), ], /* * 独自で出力対象を増やす場合はここに追加する。後述。 */ 'custom_component_classifier' => [ // \App\Classifiers\CustomerExportClassifier::class ], /* * 対象外とするルール。 * デフォルトではvendorディレクトリ以下とコアクラスが対象外となっている。 * * 以下の2ファイルがデフォルトで用意されている。 * - \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class * - \Wnx\LaravelStats\RejectionStrategies\RejectInternalClasses::class * * 上記ファイルのルール以外にしたい場合は、`Wnx\LaravelStats\Contracts\RejectionStrategy`を実装したクラスを別途作成する必要がある。 */ 'rejection_strategy' => \Wnx\LaravelStats\RejectionStrategies\RejectVendorClasses::class, /* * 対象外とする名前空間。 * `Str::startsWith()`で対象外かを判別している。 * * `Illuminate`を指定することでIlluminate全体を対象外に出来る。 * また`Illuminate\Support`のように一部を対象外にすることも可能。 */ 'ignored_namespaces' => [ 'Wnx\LaravelStats', 'Illuminate', 'Symfony', ], ];使い方
artisan
コマンドで実行することができます。$ php artisan stats
以下の画像のような出力結果になります。
オプション
オプション 説明 --json json形式で出力 --components[=COMPONENTS] 出力対象を指定して出力 -h, --help ヘルプの表示 -q, --quiet 結果を出力しない -V, --version バージョンの表示 --ansi ANSIで出力 --no-ansi ANSIで出力しない -n, --no-interaction 対話形式にしない --env[=ENV] 実行環境を指定して出力 -v, -vv, -vvv, --verbose 出力メッセージを詳細にする。
-v, -vv, -vvv
を実行してみましたが、私が実行した環境では出力結果が変わりませんでした?
-v, -vv, -vvv
については下記がヘルプに記載されています。Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
出力の分類方法
Laravel Statsでは以下の条件で分類しています。
分類 条件 Controller ルーティングに登録されている。 php artisan route:list
に表示されるコントローラModel Illuminate\Database\Eloquent\Model
が継承されているクラスCommand Illuminate\Console\Command
が継承されているクラスRule Illuminate\Contracts\Validation\Rule
が継承されているクラスPolicy AuthServiceProvider
に登録されているポリシーMiddleware App\Http\Kernel
に登録されているミドルウェアEvent Illuminate\Foundation\Events\Dispatchable
トレイトを使用しているクラスEvent Listener EventServiceProvider
に登録されているクラスIlluminate\Mail\Mailable
が継承されているクラスNotification Illuminate\Notifications\Notification
が継承されているクラスNova Action Laravel\Nova\Actions\Action
が継承されているクラスNova Filter Laravel\Nova\Filters\Filter
が継承されているクラスNova Lens Laravel\Nova\Lenses\Lens
が継承されているクラスNova Resource Laravel\Nova\Resource
が継承されているクラスJob Illuminate\Foundation\Bus\Dispatchable
トレイトを使用しているクラスMigration Illuminate\Database\Migrations\Migration
が継承されているクラスRequest Illuminate\Foundation\Http\FormRequest
が継承されているクラスResource Illuminate\Http\Resources\Json\Resource
,Illuminate\Http\Resources\Json\JsonResource
またはIlluminate\Http\Resources\Json\ResourceCollection
が継承されているクラスSeeder Illuminate\Database\Seeder
が継承されているクラスServiceProvider Illuminate\Support\ServiceProvider
が継承されているクラスDusk Tests Laravel\Dusk\TestCase
が継承されているクラスBrowserKit Test Laravel\BrowserKitTesting\TestCase
が継承されているクラスPHPUnit Test PHPUnit\Framework\TestCase
が継承されているクラス出力分類の追加
プロジェクト毎に作成しているファイルを分析対象にする場合は、
Wnx\LaravelStats\Contracts\Classifier
を実装したクラスを作成することで分析対象とすることができます。例として
app/Classifiers/RepositoryClassifier.php
を作成すると以下のようなファイルになります。<?php namespace App\Classifiers; use Wnx\LaravelStats\ReflectionClass; use Wnx\LaravelStats\Contracts\Classifier; class RepositoryClassifier implements Classifier { /** * 出力時の分類名 * この場合はRepositoriesで表示される */ public function name(): string { return 'Repositories'; } /** * 出力対象とする条件 */ public function satisfies(ReflectionClass $class): bool { return $class->isSubclassOf(\App\Repositories\BaseRepository::class); } /** * Code LLoCに行数を含めるか */ public function countsTowardsApplicationCode(): bool { return true; } /** * Test LLoCに行数を含めるか */ public function countsTowardsTests(): bool { return true; } }作成したファイルを
config/stats.php
のcustom_component_classifier
に追加することで出力対象が追加されます。<?php ... 'custom_component_classifier' => [ \App\Classifiers\RepositoryClassifier::class ], ...あとがき
このパッケージをインストールすることでファイルごとの行数やメソッド数、クラス数を分析することでどこが複雑になっているかを手軽に調べることができるようになると思います。
Laravel StatsとPHP Insightsを併せて利用することでよりプロジェクトのコード分析が捗ると思うので一度使用してみてはいかがでしょうか。
参考
- stefanzweifel/laravel-stats
- Release v2.0.0 · stefanzweifel/laravel-stats
- 追加機能やv1からのアップデート手順について書かれています
- Laravel Stats 2.0 is Here - Laravel News
- 投稿日:2019-09-29T02:13:43+09:00
【CakePHP 2.x】 テーブルにカラムを追加しても反映されない
経緯
先日、CakePHPで構成されるWebアプリケーションに新たにデータ項目が追加されることになりました。そこでデータベースのテーブルにカラムを新規に追加しました。しかしコントローラーでモデルを参照しても、追加したカラムのデータを一向に読み取ることができず、ソースコードを何度も見返しても原因がわかりませんでした。
キャッシュファイルが原因
CakePHPのキャッシングによって、次回以降の重いクエリなどのリソースの読み込みにかかる時間を短縮できます。公式のドキュメントによると、Cacheクラスを使用することでキャッシュを利用することができ、以下にある組み込みキャッシュエンジンを使用できるそうです。
- FileCache
- ApcCache
- Wincache
- XcacheEngine
- emcacheEngine
- MemcachedEngine
2.3以降ではFileCacheがデフォルトのキャッシュエンジンに設定されており、特定のディレクトリにキャッシュファイルが生成されます。今回のケースでは、app/tmp/cache/modelsに該当のモデルのキャッシュファイルが存在しました。テーブルにカラムを追加した後も、キャッシュファイル内の古い情報を参照し続けたことが原因になります。
ちなみにキャッシュの設定はapp/Config/core.phpで行うことができます。
core.phpCache::config('default', array( 'engine' => 'File', 'duration' => 3600, 'path' => CACHE, 'prefix' => 'cake_' ));参考
公式ドキュメント:キャッシュ
https://book.cakephp.org/2.0/ja/core-libraries/caching.html
- 投稿日:2019-09-29T01:07:14+09:00
Google Authenticator のブラウザ版を作ってみた
はじめに
多要素認証(MFA)に使われる Google Authenticator や Microsoft Authenticator は、モバイル端末で使えるソフトウェアトークンだ。
ソフトウェアトークンとはワンタイムパスワード(使い捨てパスワード)を表示するアプリのことで、2段階認証アプリとも呼ばれる。
今回たまたま、2段階認証アプリのブラウザ動作版をサクっと作る機会があったので、その実装方法を解説する。例えば・・・従業員アカウントの秘密鍵(QRコードのotpauth URIにあるsecret)を情報システム部門で管理し、秘密鍵からワンタイムパスワードを表示する社内イントラのサイトを作れば、社内からしかログインできないシステムを容易に構築できるという寸法だ。
ワンタイムパスワードの計算方法
GoogleやMicrosoftの2段階認証アプリでは、次のワンタイムパスワード(以下OTPと略す)に対応している。
- HMAC-based One-Time Password (HOTP) RFC http://tools.ietf.org/html/rfc4226
- Time-based One-Time Password (TOTP) RFC http://tools.ietf.org/html/rfc6238
TOTPの計算方法(アルゴリズム)はRFCで公開されているから仕様書を読めば誰でも実装できる。RFC6238では
Java
の実装例も載っているので、Java
が読めれば他のプログラミング言語に移植するのも容易だろう。
TOTPは一定時間ごとに変化するHOTP(RFC4226)であり、ハッシュアルゴリズムにHMAC-SHA-1
を使っているからRFC2404の実装でもある。TOTPの仕組みはシンプルで、【サーバとクライアントで共有する秘密鍵】と【現在時刻(UNIX Time)をtime step(デフォルト30秒)で除したカウンター値】をSHA1でハッシュし、クライアントとサーバで一致するか確認しているだけだ。
ということで、秘密鍵から6桁のOTPを求めるコードを
PHP
で書くと、次のようになる。PHPfunction secret2otp($secret) { // 秘密鍵はBase32文字列で来るのでデコード $n = $bs = 0; $seed = ''; for ($i = 0; $i < strlen($secret); $i++) { $n <<= 5; $n += stripos('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', $secret[$i]); $bs = ($bs + 5) % 8; @$seed .= $bs < 5 ? chr(($n & (255 << $bs)) >> $bs) : null; } // UNIX Timeをtime stepで除したカウンタ値と鍵を合わせ、SHA1でハッシュ $hash = hash_hmac('sha1', str_pad(pack('N', intval(time() / 30)), 8, "\x00", STR_PAD_LEFT), $seed, false); // 下6桁を返す return sprintf('%06u', (hexdec(substr($hash, hexdec($hash[39]) * 2, 8)) & 0x7fffffff) % 1000000); }
PHP
にはBase32をデコードする関数は無いので、160ビット(32文字)の秘密鍵を最初にデコードする処理があるぶん長くなっているが、実処理がシンプルなのはお分かりいただけると思う。ブラウザで動かすのなら
JavaScript
で書く方法もあるが、秘密鍵をクライアント側に渡さないで済む方法を思いつかなかったので、サーバ側で処理することにした。実装方法
では、ブラウザで動かすための実装について具体的に解説していこう。
デモを用意したので、まずは見てもらいたい。もちろん設定された秘密鍵は適当である。
http://demo.mindwood.jp/WebAuthenticator.php?uid=example
IDから秘密鍵を求める
アカウントに相当するIDはGETパラメータで受け取ることにした。つまり、ID(デモでは "example")はURLに含まれる。
秘密鍵をハードコーディングしているが、実際には、CSVファイルやRDB、LDAP等のディレクトリサービスから秘密鍵を取得するのが現実的だろう。PHP$uid=$_GET['uid']; if($uid=='example') $sec='MINDWOOD2QIITA3SECRETKEY4DEMO567'; // 秘密鍵(もちろん架空) if($uid=='xxxxxxx') $sec='AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; if(is_null($sec)) { header('HTTP/1.1 404 Not Found'); exit; } $title="$uid のワンタイムパスワード"; // タイトルを設定未知のIDなら
404 Not Found
をブラウザに返す。なお、Apacheの
mod_rewrite
モジュールが許可された環境なら、パラメータ指定の動的なURLを、静的なURLにマッピングできる。動的URL(パラメータ渡し)http://example.com/WebAuthenticator.php?uid=example静的URL(ディレクトリ渡し)http://example.com/WebAuthenticator/example参考までに
mod_rewrite
のApache定義例を示す。htaccess
やAlias
を使っているため環境に応じて修正を要する。/var/www/html/auth/.htaccessRewriteEngine on RewriteBase /WebAuthenticator RewriteRule ^([0-9A-Za-z]+)$ WebAuthenticator.php?uid=$1/etc/httpd/conf.d/auth.confAlias /WebAuthenticator /var/www/html/auth/ <Directory "/var/www/html/auth"> Options -Indexes AllowOverride All Require all granted </Directory>HTMLコード
HTMLも至ってシンプルである。PHPタグで、冒頭の関数からOTPを算出し表示しているだけだ。
HTML<body> <h1><?php echo $title; ?></h1> <div id="code"> <span> <?php echo secret2otp($sec); ?><!-- OTPを表示 --> </span> </div> </body>以上で完成としても良いのだが、少し味気ないので、jQueryで肉付けする。
残り時間を表示させてみよう
OTPは30秒ごとに更新される。つまり使用期限がある。
30秒経つとOTPは変わってしまうため、ソフトウェアトークン同様、残り時間を画面に表示してみる。
ここでは、進捗度を表すサークルバー(プログレスサークル)のjQuery実装、jquery-circle-progressで飾る。まず、プログレスサークルの表示エリアをDIVタグで確保する。
HTML<div id="circle"> <strong></strong> </div>
setInterval
で1秒ごとに残り時間を更新する。JavaScriptsetInterval(function() { var now = new Date(); var left = 30 - (now.getSeconds() % 30); // 秒を30で割った余りを残り時間とする $('#code span').css('color', left < 6 ? 'red':'green'); // 残り5秒以下なら赤くする $('#circle strong').show(); $('#circle strong').fadeOut(900); // 文字をふわっと表示させるアニメーション効果 $('#circle strong').text(left); $('#circle').circleProgress({ // ここの書き方は公式ドキュメントを参照 startAngle: -1.55, reverse: true, value: left / 30, animationStartValue: (1 + left) / 30, size: 100, thickness: 16, fill: { gradient: ['#0681c4', '#07c6c1'] } }); if (left == 30) { location.reload(); } }, 1000);NTPで時刻同期している前提だが、もしWebサーバとクライアントの間でタイムラグがあるなら次のように調整すると良い。
JavaScriptnow.setSeconds(now.getSeconds() - 3); // 3秒ずらすなお、プログレスサークルを使って、サーバ側の進捗をリアルタイムに表示させる方法については、別記事に拙稿を書いているので興味のある人は参照して欲しい。
プログレスサークルをLaravelの非同期処理でリアルタイムに表示OTPをコピペできるようにしよう
クリップボードにOTPをコピーできると便利なので、コピーボタンを置いておこう。
HTML<div id="copy"> <button>COPY</button> </div>コピーボタンがクリックされたときの挙動を書く。
document.execCommand('copy')
で現在選択されている文字をコピーできる。
コピーされたときにダイアログで通知するのはウザいのでCSSで軽くアニメーションするだけに留めている。JavaScript$('#copy').on('click', function() { var clipboard = $('<textarea></textarea>'); clipboard.addClass('clipboard'); clipboard.html($('#code span').html().trim()); $(this).append(clipboard); clipboard.select(); // 選択させる document.execCommand('copy'); // 現在選択している部分をコピー clipboard.remove(); // イベント発火をユーザーに分かり易くするためアニメーション効果を入れる $('#code').addClass('animated rubberBand').one('animationend', function () { $('#code').removeClass('animated rubberBand'); }); });完成版
完成したソースコードはGistに置いた。
https://gist.github.com/mindwood2/5ad399b33a03c0cc47c1e7ef57194cd9
- 投稿日:2019-09-29T00:22:32+09:00
CentOS 7にPHP 7.1をインストール(IUS Community Project)
はじめに
IUS Community Projectを利用してCentOS7にPHP7.1をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUSサポート
本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。LOG
インストール
# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) # yum install -y https://centos7.iuscommunity.org/ius-release.rpm ... 略 # yum install -y mod_php71u php71u-cli which ... 略各種確認
# which php /usr/bin/php # php -v PHP 7.1.32 (cli) (built: Aug 30 2019 15:31:43) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies # yum info mod_php71u Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * epel: ftp.riken.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Installed Packages Name : mod_php71u Arch : x86_64 Version : 7.1.32 Release : 1.el7.ius Size : 9.2 M Repo : installed From repo : ius Summary : PHP module for the Apache HTTP Server URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA Description : The mod_php package contains the module which adds support for the PHP language : to Apache HTTP Server. # yum info php71u-cli Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * epel: nrt.edge.kernel.org * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp Installed Packages Name : php71u-cli Arch : x86_64 Version : 7.1.32 Release : 1.el7.ius Size : 14 M Repo : installed From repo : ius Summary : Command-line interface for PHP URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL Description : The php-cli package contains the command-line interface : executing PHP scripts, /usr/bin/php, and the CGI interface.
- 投稿日:2019-09-29T00:21:01+09:00
CentOS 6にPHP 7.1をインストール(IUS Community Project)
はじめに
IUS Community Projectを利用してCentOS6にPHP7.1をインストール
親記事:PHP EOLと各種インストール方法
参考:Usage - IUSサポート
本手法で導入した場合、PHP: Supported Versions/PHP: Unsupported Branchesより、2019-12-01がEOLになると思われる。
それ以降に報告された脆弱性への対応は実施されない可能性がある。LOG
インストール
# cat /etc/redhat-release CentOS release 6.10 (Final) # yum install -y https://centos6.iuscommunity.org/ius-release.rpm ... 略 # yum install -y mod_php71u php71u-cli ... 略各種確認
# which php /usr/bin/php # php -v PHP 7.1.32 (cli) (built: Aug 30 2019 15:13:15) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies # yum info mod_php71u Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.tsukuba.wide.ad.jp * epel: nrt.edge.kernel.org * extras: ftp.tsukuba.wide.ad.jp * updates: ftp.tsukuba.wide.ad.jp Installed Packages Name : mod_php71u Arch : x86_64 Version : 7.1.32 Release : 1.el6.ius Size : 9.1 M Repo : installed From repo : ius Summary : PHP module for the Apache HTTP Server URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA Description : The mod_php package contains the module which adds support for the PHP language : to Apache HTTP Server. # yum info php71u-cli Loaded plugins: fastestmirror, ovl Loading mirror speeds from cached hostfile * base: ftp.tsukuba.wide.ad.jp * epel: nrt.edge.kernel.org * extras: ftp.tsukuba.wide.ad.jp * updates: ftp.tsukuba.wide.ad.jp Installed Packages Name : php71u-cli Arch : x86_64 Version : 7.1.32 Release : 1.el6.ius Size : 12 M Repo : installed From repo : ius Summary : Command-line interface for PHP URL : http://www.php.net/ License : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA and PostgreSQL Description : The php-cli package contains the command-line interface : executing PHP scripts, /usr/bin/php, and the CGI interface.