- 投稿日:2019-08-30T22:01:50+09:00
パーフェクトPHP 7章 8章 フレームワーク
内容
パーフェクトPHP7章8章で扱うフレームワークがどのようなフレームワークなのかざっくりした説明と学習した際の感想などを書いてます。
技術的なことは特に記載されていません。
あらかじめご了承の上、記事をお読みになってください。また、フレームワークの内部 と オブジェクト指向 を理解することを目的とされている方は
beginner001 (@beginner001) さんの『パーフェクトPHP』をデバッグしました を参照されてください。記事の構成
- MVCのそれぞれの役割
- 7章 フレームワークの構成
- 各クラスと他ファイルの役割
- 各クラスの関係と処理の流れ
- 8章 ミニブログアプリケーション
- 学習中の戸惑いなど
- 理解するために
- あとがき
- 脚注
MVCのそれぞれの役割1
モデル
アプリケーションのビジネスロジックを担うのがモデルです。Webアプリケーションでは主に、データベースへアクセスしてデータの取得や変更を行う機能をモデルに記述します。
ビュー
出力を担うのがビューです。Webアプリケーションでは主にHTMLを出力しますので。ビューはHTMLの組み立てや情報の出力を行います。
コントローラ
ユーザのリクエストを制御し、モデルから情報を取得してビューに橋渡しするのがコントローラです。
7章 フレームワークの構成
パーフェクトPHPの7章のフレームワークは以下のように構成されます。
application/ controllers/ core/ Application.php ClassLoader.php Controller.php DbManager.php DbRepository.php HttpNotFoundException.php Request.php Response.php Router.php Session.php UnauthorizedActionException.php View.php models/ views/ web/ .htaccess index.php bootstrap.php※フレームワークのコードについては技術評論社Webサイトを参照してください。
ライセンス
The MIT License
Copyright (c) 2010 Katsuhiro Ogawa
https://github.com/kenjis/perfect-php-mini-blog/blob/master/LICENSE各クラスと他ファイルの役割2
Application.php
アプリケーション全体を表すクラスです。RequestクラスやSessionクラスの初期化、コントローラの実行などアプリケーションの全体の流れを管理します。
ClassLoader.php
オートロードに関する処理をまとめたクラスです。
Controller.php
モデルやビューの制御を行うコントローラです。今回はこのControllerクラスの中にアクションと呼ばれるメソッドを定義していきます。
DbManager.php
データベースへの接続情報や次に説明するDbRepositoryを管理するクラスです。
DbRepository.php
実際にデータベースへのアクセスを伴う処理を管理するクラスです。実施にはデータベース上のテーブルごとにDbRepositoryクラスの子クラスを作成します。今回のフレームワークではモデルに相当します。
HttpNotFoundException.php
ページが存在しないことを表す例外クラスです。
Request.php
ユーザのリクエストを表すクラスです。ユーザがリクエストした際のGETやPOSTパラメータ、URLなどの情報を管理します。
Response.php
リクエストに対するレスポンスです。最終的にユーザへ返すレスポンスの情報を管理します。
Router.php
ユーザがアクセスしてきたURLをRequestクラスから受け取り、どのコントローラを呼び出すかを決定します。これにより物理的なディレクトリ構造に縛られないURLの制御を可能にします。
Session.php
セッションを管理するクラスです。
UnauthorizedActionException.php
例外を用いたログイン画面への遷移のための例外クラスです。
bootstrap.php
オートロードを設定するためのファイル。
.htaccess
Apacheの設定を変更するためのファイル。
index.php
フロントコントローラにあたるファイル。
各クラスの関係と処理の流れ
それぞれのクラスの関係については以下の図 3で表されます。
これらのクラスを使用したフレームワークをもとに8章ではミニブログアプリケーションを作成します。以下は先ほどの画像にApplicationクラスでの処理の流れを記載したものです。
処理を追っていたときに迷子になることがあったので目印の変わりに処理の流れを記載してます。
(※表現を変えている箇所がいくつかあるので注意。例『$this->request』を『Request』と表記)実際の処理の流れは以下の通りです。
まずはRequestクラスでリクエストを受け取りRouterでコントローラ名やアクション名などを取得します。
取得した値をもとにApplicationクラスのrunAction()メソッドでAccountControllerやStatusControllerといった使用するコントローラの決定とインスタンス化を行います(8章のミニブログアプリケーションで出てきます)。
次にControllerクラスのrun()メソッドで実行するメソッドの決定を行います。
実行したメソッド内でSessionクラスやDbManagerクラス(+DbRepositoryクラス)、Viewクラスとのやりとりが行われ見た目を構成していきます。
最後にResponseクラスのsend()メソッドにより出力されます。
以上が一連の処理の流れです。8章 ミニブログアプリケーション
構成は以下の通り。
mini-blog.localhost/ controllers/ AccountController.php StatusController.php core/ Application.php ClassLoader.php Controller.php DbManager.php DbRepository.php HttpNotFoundException.php Request.php Response.php Router.php Session.php UnauthorizedActionException.php View.php models/ FollowingRepository.php StatusRepository.php UserRepository.php views/ account/ index.php inputs.php signin.php signup.php status/ index.php show.php status.php user.php errors.php layout.php web/ css/ style.css .htaccess index_dev.php index.php bootstrap.php MiniBlogApplication.phpcontrollersディレクトリ、modelsディレクトリ、viewディレクトリ、webディレクトリやルート直下にクラスファイルが増えてます。
controllersディレクトリのクラスはControllerクラスを継承、modelsディレクトリはDbRepositoryクラスを継承、MiniBlogApplicationクラスはApplicationクラスを継承し、viewsのaccountディレクトリやそのファイルたちはControllerやメソッドに対応し、共通のレイアウトについてはlayout.phpとerrors.phpとして分けられています。
コードを見たい方は技術評論社Webサイトを参照してください。学習中の戸惑いなど
- クラスやメソッドについて知識がほとんどないため、写経中は理解に努めてもぼんやりとしか意味がわからなかった。 (「引数とメソッド内の処理の関係などについてわかっていなかったこと」と「メソッドが他のメソッドとどう関連しているのかが全くわからず宙に浮いた処理の塊に見えたこと」が原因。今思うと不思議。)
- 今までは比較的単純なコードを写経して実行すればすぐに実行結果が見れていたのに対し、なかなか実行に移せない写経に少し飽きる。
- 様々な内部関数などが出てきて面食らう。(40近くありました。全ての関数に比べるとわずかですが初見ではこんなにいろんな関数などがあるんだと驚いてました。)
- ->や::に慣れない。
- ところで$thisとselfの違いって...
- 実際に動いたけど、どんな処理の流れなんだ。
- RouterクラスのcompileRoutes()メソッドとresolve()メソッドの正規表現に関する処理がよくわからない。(var_dump()で値が見られずに「なんで?」となってました。)
- Controllerクラスのrender()メソッドとViewクラスのrender()メソッドちょっとややこしいッ。
こんな感じで色々と戸惑ったりなかなか理解できなかったり「向いてないかもなぁ」と嘆きつつ学習してました。
理解するために
ひたすら処理の途中途中で値を出力しては処理を止めて記録する持久戦で理解に努め、以下のGIFにあるようにスプレッドシートに記録してました。(var_dump();exit()をかなり多用しました)
縦にカラフルな線があるのは処理の途中で他のメソッドの処理に移ったり戻ったりすることによってどこの処理をしているのかわからなくなるため階層と色を分けて表現することでどのクラスで処理しているのか少しわかりやすくなるかなと考えた結果です。
右側の薄い緑や紫の塗りつぶしは取得した配列の値などを記録している箇所です。
これらを出力される画面毎に記録していました。時間はかかりますし要領を得ていないと自覚していましたが、おかげでコードに対する苦手意識は軽減されましたし、当初に比べるとコードを読めるようになり処理の流れもわかるようになったので結果オーライだと思っています。
あとがき
ここまで読んでくださった方ありがとうございます。
冒頭にもあるように大したことは書いていないので技術目的の方ごめんなさい。
あとはパーフェクトPHPを選んだ理由などを少し書いています。
グダグタですのでご注意ください。パーフェクトPHPを選んだ理由
パーフェクトPHPについては初版が2010年12月10日なので、記事を書いている現在ですでに約9年弱前のものになります。実際パーフェクトPHPの内容は古いという評価も見かけることはあります。
それでも私はパーフェクトPHPでフレームワークについて学ぼうと思いました。理由は2つあります。
1つは古いという評価があるにも関わらず現在に到るまで出版され書店でも取り扱われ続けているということです。つまり現在でも十分に通用する基礎が記載されていると判断したためです。
2つめの理由は「Laravelなどのフレームワークが便利」ということを実感したかったからです。おそらく初めからLaravelなどのフレームワークを利用して勉強を始めると「みんな便利っていうけど一体何が便利なの?」とズレた基準が自身の中に生まれたり、自身の性格上、他にも残念な思い違いをしてしまうだろうと考えたためです。
まだLaravelをちゃんと学んでいないので実際に扱った際にどのように感じるかはわかりません。
できれば「え...めちゃくちゃ便利やん。初めから使えばよかった。」と感じることができたらと願っています。beginner001 (@beginner001) さん がおすすめする理由(追記 2019.9.1)
この学習用フレームワークで、「フレームワーク」と「オブジェクト指向」の 考え方 が分かります。
PHP の書き方や使い方は、後からでも対応できます。(PHP 7.x.x)この 考え方 について書かれたサイトや本が、いまだに在りません。
これが、パーフェクトPHP が支持される理由だと思います。(7章、8章、サンプルコード のみ)
他の本は、断片的な情報が列挙されたものばかりです。7章8章を終えて
この章を通して学んだことを今後に活かすことができたらと願うと同時に活かすことができるよう努めようと思います。
これからプログラミングを学び始め方へ
これからプログラミングを学び始める方、学び始めたばかりの方はいきなりパーフェクトPHPを手に取らない方が良いと思います。
それよりも入門書であったり(シンプルなコードでお買い物機能実装できるものとか)、Progateのようなサービスを利用して慣れてきてから自分で何かしらのサービスを作るときや、もっと詳しいことを知りたいと思ったときに手に取ると良いかと思います。以上です。
最後までお付き合いありがとうございました。
デバッグについて(追記2019.9.1)
beginner001 (@beginner001) さんよりアドバイスをいただきました。
IDE デバッグ機能
どんなツールも初めは大変ですが、すぐに慣れます。
特に、初心者の方 には効果が大きいです。
(パソコンの初心者ではなく、PHPの初心者です)初心者の方 こそ、パーフェクトPHP (7章 8章) を選ぶべきです。
初心者が IDE デバッグ機能 を使う学習方法 は、実証済 です。ツール
差分ツール WinMerge
例 サンプルコードと写経したコードの比較
検索ツール Devas
Devas 以外にも同様なツールはたくさんあります
一部の IDE にも同じ機能があります
例 サンプルコード全体を検索します (文字列 「PDO」 の検索など)
※ Windows のツールです (Mac にも同様なツールはあります)
Mac純正のファイル差分確認ツール「FileMerge」が使いやすい脚注
(出典: 小川雄大、柄沢聡太郎、橋口誠、「パーフェクトPHP」「第7章 フレームワークによる効率的な開発」『7.2.2 MVCモデル』2018年第8刷発行、200ページ) ↩
(出典: 小川雄大、柄沢聡太郎、橋口誠、「パーフェクトPHP」「第7章 フレームワークによる効率的な開発」『7.2.3 フレームワークの構造』200ページ、201ページ、『7.2.7 ClassLoaderクラス』204ページ、『7.2.8 bootstrap.php』206ページ、『7.2.9 フロントコントローラと.htacess』207、208ページ、『7.2.22 例外の活用』239ページ、『7.2.31 ログイン状態の制御』257ページ) ↩
(出典: 小川雄大、柄沢聡太郎、橋口誠、「パーフェクトPHP」「第7章 フレームワークによる効率的な開発」『7.2.4 フレームワークの処理の流れ』2018年第8刷発行、202ページ) ↩
- 投稿日:2019-08-30T18:02:29+09:00
MySQLでマルチバイト含む文字列カラム検索(like,with ngram,mroonga)
う゛ぁーじょん
CentOS7
MySQL 8.0.17
Mroonga 9.05
MeCab 0.996やりたいこと
そこそこ件数が膨らむ算段のテーブルのVARCHAR(128)カラムに対し、曖昧な検索をかける。
その際、欲しい結果としては部分一致(LIKE '%検索ワード%')。とりあえず
CREATE TABLE test ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(128) NOT NULL UNIQUE, PRIMARY KEY (id), FULLTEXT KEY ftk_test_name (name) COMMENT 'tokenizer "TokenMecab"' ) ENGINE=mroonga DEFAULT CHARSET=utf8mb4;このテーブルにa-zまでの英小文字のみで構成される、5文字のstringを100万件放り込む。
没案
FULLTEXT KEY ftk_test_name (name) WITH PARSER NGRAM'mysql 5.7からデフォルトで全文検索できるようになってると聞いたので試したが、
検索結果が大きくなるようなクエリだと何故かempty setが返る。調べたところ、https://dev.mysql.com/doc/refman/5.7/en/fulltext-natural-language.html
結果セットがテーブル全体の50%を超えたらあかんでみたいなこと書いてある。
IN BOOLEAN MODE
つけても結果に変化はなかったので、結果セットが小さくなるように頑張れよって意味か…?何にせよ、使いづらそうなのでmroonga導入。
like結果
SELECT COUNT(*) FROM test where name LIKE '%abc%'; +----------+ | count(*) | +----------+ | 207 | +----------+ 1 row in set (1.32 sec)やはりlikeだとちょい遅い。最初から件数がデカくなると分かっているテーブルに対して持ち出したくない。
MATCH AGAINST結果
SELECT COUNT(*) FROM test WHERE MATCH(name) AGAINST('abc'); +----------+ | count(*) | +----------+ | 67 | +----------+ 1 row in set (0.11 sec) SELECT COUNT(*) FROM test WHERE MATCH(name) AGAINST('abc' in boolean mode); +----------+ | count(*) | +----------+ | 67 | +----------+ 1 row in set (0.00 sec)速いのはいいけど、これ前方一致検索結果だよ。 LIKE 'abc%' になっちまってる。
いや、困った。mroongaのドキュメント見る限り、特に何もせずとも普通は最初から部分一致検索に思うんだけど…
知ってる方いたらそっと教えてください追記
FULLTEXT KEY ftk_test_name (name) COMMENT 'tokenizer "TokenBigramSplitSymbolAlphaDigit"'にしたらあっさり解決しました。アホすぎ。
※今回のデータ要件はマルチバイト・英数字全部入る可能性があるのでDigitにしてます
- 投稿日:2019-08-30T16:53:32+09:00
Docker を CentOS 7.6 (1810) にインストールして簡単に WordPress を起動する
最近Dockerを使うようになってきたので、DockerコンテナでサクッとWordPressを立ち上げる方法を試してみました。
今回はDocker-CE(無料のコミュニティエディション)を使用してWordPressをインストールする方法を紹介します。ホストOSバージョンとカーネルバージョン
今回したホストOSはCentOS 7.6 (1810)となります。
[root@cent76 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)Dockerに必要なパッケージをインストール
必須パッケージを先にインストールします。
[root@cent76 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 Loaded plugins: fastestmirror, langpacks Determining fastest mirrors * base: ftp-srv2.kddilabs.jp * extras: ftp-srv2.kddilabs.jp * updates: ftp-srv2.kddilabs.jp (省略) =============================================================================================================== Package Arch Version Repository Size =============================================================================================================== Updating: lvm2 x86_64 7:2.02.180-10.el7_6.8 updates 1.3 M Updating for dependencies: device-mapper x86_64 7:1.02.149-10.el7_6.8 updates 293 k device-mapper-event x86_64 7:1.02.149-10.el7_6.8 updates 189 k device-mapper-event-libs x86_64 7:1.02.149-10.el7_6.8 updates 188 k device-mapper-libs x86_64 7:1.02.149-10.el7_6.8 updates 321 k lvm2-libs x86_64 7:2.02.180-10.el7_6.8 updates 1.1 M Transaction Summary =============================================================================================================== Upgrade 1 Package (+5 Dependent packages) (省略) Complete!安定版Dockerリポジトリを追加
Dockerをインストールするために、Dockerリポジトリを追加します。
[root@cent76 ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo Loaded plugins: fastestmirror, langpacks adding repo from: https://download.docker.com/linux/centos/docker-ce.repo grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo repo saved to /etc/yum.repos.d/docker-ce.repoDocker-CEインストール
Docker-CEとその他必要なパッケージをインストールします。
[root@cent76 ~]# yum install -y docker-ce docker-ce-cli containerd.io Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile * base: ftp-srv2.kddilabs.jp * extras: ftp-srv2.kddilabs.jp * updates: mirror.navercorp.com (省略) =============================================================================================================== Package Arch Version Repository Size =============================================================================================================== Installing: containerd.io x86_64 1.2.6-3.3.el7 docker-ce-stable 26 M docker-ce x86_64 3:19.03.1-3.el7 docker-ce-stable 24 M docker-ce-cli x86_64 1:19.03.1-3.el7 docker-ce-stable 39 M Installing for dependencies: audit-libs-python x86_64 2.8.4-4.el7 base 76 k checkpolicy x86_64 2.5-8.el7 base 295 k container-selinux noarch 2:2.107-1.el7_6 extras 39 k libcgroup x86_64 0.41-20.el7 base 66 k libsemanage-python x86_64 2.5-14.el7 base 113 k policycoreutils-python x86_64 2.5-29.el7_6.1 updates 456 k python-IPy noarch 0.75-6.el7 base 32 k setools-libs x86_64 3.3.8-4.el7 base 620 k Updating for dependencies: policycoreutils x86_64 2.5-29.el7_6.1 updates 916 k Transaction Summary =============================================================================================================== Install 3 Packages (+8 Dependent packages) Upgrade ( 1 Dependent package) (省略) Complete!Dockerバージョン確認
今回インストールしたバージョンは「19.03.1」となります。
[root@cent76 ~]# docker version Client: Docker Engine - Community Version: 19.03.1 API version: 1.40 Go version: go1.12.5 Git commit: 74b1e89 Built: Thu Jul 25 21:21:07 2019 OS/Arch: linux/amd64 Experimental: false Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?Docker 起動
systemctl コマンドでDockerを起動します。
[root@cent76 ~]# systemctl start dockerWordPress の docker image を取得
WordPress の Docker image を Docker Hub から取得します。
[root@cent76 ~]# docker pull wordpress Using default tag: latest latest: Pulling from library/wordpress f5d23c7fed46: Pull complete 4f36b8588ea0: Pull complete 6f4f95ddefa8: Pull complete 187af28c9b1d: Pull complete 3c4135e0a3e9: Pull complete 764143bdfc93: Pull complete 3a141d427998: Pull complete 10a514d45c55: Pull complete 38caab815709: Pull complete 7be2532c1013: Pull complete 4af1c0fea247: Pull complete 88c32579f6b6: Pull complete 4435d7ad1fed: Pull complete eb012b532a23: Pull complete b45b6b08a0f1: Pull complete 57a069704459: Pull complete c7266b68617f: Pull complete 637472e69ed3: Pull complete 748eaacd7f1d: Pull complete 0d7f34f2c87d: Pull complete Digest: sha256:fdecb6fc92b04d88419544722ac1679158c12eb8f519b83b0480a6375e823dec Status: Downloaded newer image for wordpress:latest docker.io/library/wordpress:latestWordPress に必要な MySQL の docker image を取得
今回はMySQL5.7をWordpress用のDBとし、こちらも Docker Hub から取得します。
[root@cent76 ~]# docker pull mysql:5.7 5.7: Pulling from library/mysql 0a4690c5d889: Pull complete 98aa2fc6cbeb: Pull complete 0777e6eb0e6f: Pull complete 2464189c041c: Pull complete b45df9dc827d: Pull complete b42b00086160: Pull complete bb93567627c7: Pull complete 419b68a254a1: Pull complete 8c4bc5b87c07: Pull complete 59234e88c262: Pull complete 2406ac6e266f: Pull complete Digest: sha256:540488d8f0e04c1077d17934d1c1511fe417e2221dff508ce4621f5efe6131db Status: Downloaded newer image for mysql:5.7 docker.io/library/mysql:5.7取得済みイメージ一覧表示
取得したイメージを確認します。取得した wordpress と mysql が存在していればOKです。
[root@cent76 ~]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE wordpress latest 02126202b6ea 32 hours ago 502MB mysql 5.7 f6509bac4980 2 weeks ago 373MBコンテナを生成して起動
取得したイメージを使用して、WordPressとMySQLのコンテナを生成・起動します。
[root@cent76 ~]# docker container run --name wp-mysql -e MYSQL_ROOT_PASSWORD=hoge -d mysql:5.7 a954a2f27251e30ca861583c722d277152e714708dfcfe2576c143f964d33037 [root@cent76 ~]# docker container run --name samplewp -d -p 80:80 --link wp-mysql:mysql wordpress 427c5e2ed465802d8ac709f834cdafb43baaa2d900b4b9f76d6b97354f0c6f04実行中コンテナ一覧の確認
起動したコンテナ2つが実行状態であることを確認します。
[root@cent76 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 427c5e2ed465 wordpress "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:80->80/tcp samplewp a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 16 minutes ago Up 16 minutes 3306/tcp, 33060/tcp wp-mysql※ここで2つのコンテナが起動されていなかったら「docker logs samplewp」「docker logs wp-mysql」コマンドでdockerログを確認します。
WordPressに接続
ブラウザから「http://<ホストのIP>」でアクセスします。
必要な情報を入力し、「WordPress をインストール」ボタンを押下します。
これでWordPressを色々操作できるようになります。WordPressコンテナ内で作業する
WordPressのコンテナに接続します。ソースの修正等はこれで行います。
[root@cent76 ~]# docker container exec -it samplewp /bin/bash root@427c5e2ed465:/var/www/html# ls -l total 200 -rw-r--r--. 1 www-data www-data 420 Nov 30 2017 index.php -rw-r--r--. 1 www-data www-data 19935 Jan 1 2019 license.txt -rw-r--r--. 1 www-data www-data 7447 Apr 8 22:59 readme.html -rw-r--r--. 1 www-data www-data 6919 Jan 12 2019 wp-activate.php drwxr-xr-x. 9 www-data www-data 4096 Jun 18 17:50 wp-admin -rw-r--r--. 1 www-data www-data 369 Nov 30 2017 wp-blog-header.php -rw-r--r--. 1 www-data www-data 2283 Jan 21 2019 wp-comments-post.php -rw-r--r--. 1 www-data www-data 2808 Aug 7 06:55 wp-config-sample.php -rw-r--r--. 1 www-data www-data 3172 Aug 7 06:55 wp-config.php drwxr-xr-x. 6 www-data www-data 84 Aug 7 07:17 wp-content -rw-r--r--. 1 www-data www-data 3847 Jan 9 2019 wp-cron.php drwxr-xr-x. 20 www-data www-data 8192 Jun 18 17:50 wp-includes -rw-r--r--. 1 www-data www-data 2502 Jan 16 2019 wp-links-opml.php -rw-r--r--. 1 www-data www-data 3306 Nov 30 2017 wp-load.php -rw-r--r--. 1 www-data www-data 39551 Jun 10 13:34 wp-login.php -rw-r--r--. 1 www-data www-data 8403 Nov 30 2017 wp-mail.php -rw-r--r--. 1 www-data www-data 18962 Mar 28 19:04 wp-settings.php -rw-r--r--. 1 www-data www-data 31085 Jan 16 2019 wp-signup.php -rw-r--r--. 1 www-data www-data 4764 Nov 30 2017 wp-trackback.php -rw-r--r--. 1 www-data www-data 3068 Aug 17 2018 xmlrpc.phpWordPress用のMySQLに接続してみる
あまり中身を気にする必要はないかもしれませんが、もちろんコンテナ内のMySQLにも接続できます。
[root@cent76 ~]# docker container exec -it wp-mysql /bin/bash root@a954a2f27251:/# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 21 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select @@version; +-----------+ | @@version | +-----------+ | 5.7.27 | +-----------+ 1 row in set (0.00 sec)Dockerコンテナの停止
コンテナ停止前に起動状態を確認します。
[root@cent76 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:80->80/tcp samplewp a954a2f27251 mysql:5.7 "docker-entrypoint.s…" About an hour ago Up About an hour 3306/tcp, 33060/tcp wp-mysqlコンテナが起動しているので停止します。
[root@cent76 ~]# docker container stop samplewp samplewp [root@cent76 ~]# docker container stop wp-mysql wp-mysql [root@cent76 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES実行中コンテナがなくなりました。
Dockerコンテナの起動
コンテナを起動します。
[root@cent76 ~]# docker container start wp-mysql wp-mysql [root@cent76 ~]# docker container start samplewp samplewp [root@cent76 ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 427c5e2ed465 wordpress "docker-entrypoint.s…" About an hour ago Up 11 seconds 0.0.0.0:80->80/tcp samplewp a954a2f27251 mysql:5.7 "docker-entrypoint.s…" 2 hours ago Up 20 seconds 3306/tcp, 33060/tcp wp-mysqlコンテナが起動しました。
さいごに
Docker を利用すれば、使い捨てのWordPressがサクッとできるので、私はソース変更やプラグインの検証等に使用しています。
※今回の記事は、自身のサイトから転載しています。
https://dekiruengineer.com/engineer/wordpress-for-docker/
- 投稿日:2019-08-30T14:57:41+09:00
[MySQL] データコンバージョン作業でCOMMITする前に更新前後のdiffを確認する方法(INTO OUTFILEが使えない場合)
はじめに
先日、DBのデータコンバージョンをした。
データコンバージョンの手順を考えているときに色々と調べた。
初めて知ったこともあったので自分の作業メモとして残しておく。データコンバージョンの元々の計画
イメージした作業の流れ
1. トランザクション開始
2. データ変更前のデータをファイルに出力する
3. データ変更
4. データ変更後のデータをファイルに出力する
5. diffを確認する
6. diffを確認した結果問題なければコミット、問題があればrollback
SELECT
文にINTO OUTPUTFILE
を付ければファイル出力できることは元々知っていたので、2と4はできそう。
5のdiffを確認する作業はCtrl
+z
で一時的にMySQLから抜けてdiff
コマンドを叩こうかな?MySQLからLinuxのコマンドを実行できるみたい
MySQLからOSのシステムシェルを実行できる1
system
というものがあるらしい。
Ctrl
+z
で一時的にMySQLから抜けるのはやめて、それを使ってLinuxのdiffコマンドを叩くことにした。
system
の使い方の例systemの使用例mysql> system diff /tmp/{xxx,yyy}.log
INTO OUTPUTFILE
でエラーが出力されるMySQLのuserに2
FILE
権限がなくSELECT xxx FROM xxx INTO OUTFILE '/path/before.tsv'
を実行したときに下記のエラーが発生。
ERROR 1045 (28000): Access denied for user 'xxx'@'xxx%' (using password: YES)
うちの場合、
FILE
権限を付与してもらうにはDBAに依頼する必要があった。
今後もこの権限が必要な作業が発生するか分からなかったので、FILE
権限を付与してもらうことはやめて代わりに別の方法を模索することにした。
- トランザクション開始
- データ変更前のデータをファイルに出力する [再考]
- データ変更
- データ変更後のデータをファイルに出力する [再考]
- diffを確認する
- diffを確認した結果問題なければコミット、問題があればrollback
FILE
権限がなくてもtee
を使えばSQLの結果を出力できそう結局、やりたいことはトランザクション中に
1. 更新前の内容をファイルに出力
2. 更新後の内容をファイルに出力
3. 出力されたファイルのdiffを確認
SELECT xxx FROM xxx INTO OUTFILE '/path/after.tsv'
以外にファイルに出力させる方法を探していたところ、
3tee
を使えば似たようなことができそうだと判明。以下は
tee
を使う場合の作業手順。MySQLトランザクション開始 mysql> BEGIN; データ変更前のデータをファイルに出力する mysql> tee /tmp/before.log mysql> source before.sql; mysql> notee データ変更 mysql> souce update.sql データ変更後のデータをファイルに出力する mysql> tee /tmp/after.log mysql> source after.sql; mysql> notee diffを確認する mysql> system ls -l /tmp/{before,after}.log mysql> system diff /tmp/{before,after}.log | grep -v 'mysql>' diffを確認した結果問題なければコミット mysql> COMMIT; mysql> EXIT;
tee
のやり方だとどうしてもSQLの結果と関係ないところのdiffが出てしまうが、目視確認できる範囲なのでそこは目をつぶる。。。
mysql Client Commands [https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html] ↩
Privileges Provided by MySQL [https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html] ↩
mysql Client Commands [https://dev.mysql.com/doc/refman/5.7/en/mysql-commands.html] ↩
- 投稿日:2019-08-30T14:28:59+09:00
MySQL8.0.x に Sequel Pro で接続する
問題
Sequel Pro 1.1.2 バージョンでは MySQL8.0 に接続できません。
- Homebrewからインストール
brew cask install sequel-pro
- 公式サイトからインストール
通常のインストール方法だと正式版のSequel Pro 1.1.2がインストールされます。
メニュー > Sequel Pro > SequelPro について からバージョン確認
解決法
- Homebrewからインストール
brew cask uninstall sequel-pro
brew cask install homebrew/cask-versions/sequel-pro-nightly
- 公式サイトからテストビルド版をインストール
- https://sequelpro.com/test-builds
- 1.1.2と共存させたい場合はこちらがいいかも。
メニュー > Sequel Pro > Abount SequelPro からバージョン確認
Sequel Pro 1.2 から MySQL 8.0 サポートされる!
2017/2/22 に Need MySQL 8.0 support #2699 こちらのイシューが立ってすでに2年が経過しました...。
執筆時点(2019/8/30) での Sequel Pro 1.2 のプロジェクトを見ると 検討中: 3件、 必須: 9件、進行中: 1件 のイシューが残ってます。
まだしばらくかかりそうですね...。
- 投稿日:2019-08-30T11:24:32+09:00
MySQL(5.7以降)のパスワードポリシーが厳しいので変更する。Your password does not satisfy the current policy requirementsの対処法
概要
タイトルの通り
ポリシーに準拠していないパスワードは設定できない
mysql> ALTER USER 'root'@'localhost' identified BY 'password' -> ; ERROR 1819 (HY000): Your password does not satisfy the current policy requirementsMySQLのパスワードポリシー
レベル 長さ 文字種類 単語一致 LOW 8文字以上 MIDEUM 8文字以上 アルファベット大文字、アルファベット小文字、数字、記号の4種を含める HIGH 8文字以上 アルファベット大文字、アルファベット小文字、数字、記号の4種を含める 4文字以上の部分文字列が辞書ファイル内の単語と一致してはならない 手順
1.デフォルトのパスワードポリシーの設定を確認する
mysql> SHOW VARIABLES LIKE 'validate_password%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | MEDIUM | | validate_password.special_char_count | 1 | +--------------------------------------+--------+ 7 rows in set (0.03 sec)2.パスワードポリシーをLOWに変更する
mysql> set global validate_password.policy=LOW;3.変更後のパスワードポリシーの設定を確認する
mysql> SHOW VARIABLES LIKE 'validate_password%'; +--------------------------------------+-------+ | Variable_name | Value | +--------------------------------------+-------+ | validate_password.check_user_name | ON | | validate_password.dictionary_file | | | validate_password.length | 8 | | validate_password.mixed_case_count | 1 | | validate_password.number_count | 1 | | validate_password.policy | LOW | | validate_password.special_char_count | 1 | +--------------------------------------+-------+ 7 rows in set (0.00 sec)これで完了
環境
Mac OS: Mojave Version10.14.6
MySQL: Version8.0.17
MySQLはHomebrewでinstallした。
- 投稿日:2019-08-30T10:49:13+09:00
【Mac OS】MySQLでrootユーザーのパスワード忘れてしまった際に初期化・再設定する方法
環境
Mac OS: Mojave Version10.14.6
MySQL: Version8.0.17
MySQLはHomebrewでinstallした。手順
1.MySQLサーバープロセスを停止する(起動していなかったら不要)
# mysql.server stop2.MySQLサーバープロセスをセーフモードで起動するその際プラグインをロードしない
(パスワードなしでのログインが可能になる)# /usr/local/bin/mysqld_safe --skip-grant-tables3.MySQLへrootユーザーでログインする
※「2.」を行ったためパスワードの入力が不要# mysql -u root4.パスワードを空で設定する
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';5.MySQLをログアウトする
mysql> exit6.MySQLサーバープロセスを再起動する
# mysql.server restart7.MySQLへrootユーザーでログインする
パスワードは先程設定した空なので何も入力せずエンターを押下する
# mysql -u root -p Enter password:8.rootユーザーのパスワードを変更する
※ 'password'の部分にMySQLのパスワードポリシーに準拠した任意のパスワードを入力するmysql> ALTER USER 'root'@'localhost' identified BY 'password';
- 投稿日:2019-08-30T10:49:13+09:00
MySQLでrootユーザーのパスワード忘れてしまった際に初期化・再設定する方法【Mac OS】
環境
Mac OS: Mojave Version10.14.6
MySQL: Version8.0.17
MySQLはHomebrewでinstallした。手順
1.MySQLサーバープロセスを停止する(起動していなかったら不要)
# mysql.server stop2.MySQLサーバープロセスをセーフモードで起動するその際プラグインをロードしない
(パスワードなしでのログインが可能になる)# /usr/local/bin/mysqld_safe --skip-grant-tables3.MySQLへrootユーザーでログインする
※「2.」を行ったためパスワードの入力が不要# mysql -u root4.パスワードを空で設定する
mysql> UPDATE mysql.user SET authentication_string=null WHERE User='root';5.MySQLをログアウトする
mysql> exit6.MySQLサーバープロセスを再起動する
# mysql.server restart7.MySQLへrootユーザーでログインする
パスワードは先程設定した空なので何も入力せずエンターを押下する
# mysql -u root -p Enter password:8.rootユーザーのパスワードを変更する
※ 'password'の部分にMySQLのパスワードポリシーに準拠した任意のパスワードを入力するmysql> ALTER USER 'root'@'localhost' identified BY 'password';
- 投稿日:2019-08-30T08:29:19+09:00
Spring Boot + Spring JDBC で MySQL に接続するための設定
概要
- Spring Boot + Spring JDBC (JdbcTemplate など) で MySQL に接続するための設定方法をまとめる
pom.xml
JDBC ドライバである MySQL Connector/J を利用するため、Maven の設定ファイル pom.xml の dependencies に以下を追加する。
pom.xml<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.17</version> <scope>runtime</scope> </dependency>また、 Spring JDBC を導入するため以下も追加する。
pom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>application.properties
Spring Boot の設定ファイル application.properties に以下のような設定が必要。
application.propertiesspring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.username=java spring.datasource.password=cafebabe spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.initialization-mode=always spring.datasource.schema=classpath:database/schema.sql spring.datasource.data=classpath:database/data.sql spring.datasource.sql-script-encoding=utf-8spring.datasource.url
MySQL の接続 URL。
MySQL :: MySQL Connector/J 8.0 Developer Guide :: 6.2 Connection URL Syntax
protocol//[hosts][/database][?properties]
spring.datasource.username
MySQL にアクセスするためのユーザー名。
spring.datasource.password
MySQL にアクセスするユーザーのパスワード。
spring.datasource.driver-class-name
JDBC ドライバのクラス名 com.mysql.cj.jdbc.Driver を指定する。
MySQL :: MySQL Connector/J 8.0 Developer Guide :: 6.1 Driver/Datasource Class Name
The name of the class that implements java.sql.Driver in MySQL Connector/J is com.mysql.cj.jdbc.Driver.
spring.datasource.initialization-mode
Database schema initialization mode. SQL 文を書いたスクリプトを実行する場合は always を指定する。
Spring Boot Reference Guide 2.1.7.RELEASE - Appendix A. Common application properties
spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts.
spring.datasource.schema
Spring Boot 起動時に実行したい SQL 文を記述したファイルのパスを指定する。
DDL (Data Definition Language: データ定義言語) テーブル作成などの実行用。application.propertiesspring.datasource.schema=classpath:database/schema.sql“How-to” Guides - 10. Database Initialization
Spring Boot can automatically create the schema (DDL scripts) of your DataSource and initialize it (DML scripts). It loads SQL from the standard root classpath locations: schema.sql and data.sql, respectively. In addition, Spring Boot processes the schema-\${platform}.sql and data-\${platform}.sql files (if present), where platform is the value of spring.datasource.platform. This allows you to switch to database-specific scripts if necessary. For example, you might choose to set it to the vendor name of the database (hsqldb, h2, oracle, mysql, postgresql, and so on).
spring.datasource.data
Spring Boot 起動時に実行したい SQL 文を記述したファイルのパスを指定する。
DML (Data Manipulation Language: データ操作言語) レコード追加などの実行用。application.propertiesspring.datasource.data=classpath:database/data.sqlspring.datasource.sql-script-encoding
SQL 文を書いたファイルの文字エンコーディングを指定する。
application.properties の資料
Spring Boot Reference Guide 2.1.7.RELEASE - Appendix A. Common application properties
application.properties# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.continue-on-error=false # Whether to stop if an error occurs while initializing the database. spring.datasource.data= # Data (DML) script resource references. spring.datasource.data-username= # Username of the database to execute DML scripts (if different). spring.datasource.data-password= # Password of the database to execute DML scripts (if different). spring.datasource.dbcp2.*= # Commons DBCP2 specific settings spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default. spring.datasource.generate-unique-name=false # Whether to generate a random datasource name. spring.datasource.hikari.*= # Hikari specific settings spring.datasource.initialization-mode=embedded # Initialize the datasource with available DDL and DML scripts. spring.datasource.jmx-enabled=false # Whether to enable JMX support (if provided by the underlying pool). spring.datasource.jndi-name= # JNDI location of the datasource. Class, url, username & password are ignored when set. spring.datasource.name= # Name of the datasource. Default to "testdb" when using an embedded database. spring.datasource.password= # Login password of the database. spring.datasource.platform=all # Platform to use in the DDL or DML scripts (such as schema-${platform}.sql or data-${platform}.sql). spring.datasource.schema= # Schema (DDL) script resource references. spring.datasource.schema-username= # Username of the database to execute DDL scripts (if different). spring.datasource.schema-password= # Password of the database to execute DDL scripts (if different). spring.datasource.separator=; # Statement separator in SQL initialization scripts. spring.datasource.sql-script-encoding= # SQL scripts encoding. spring.datasource.tomcat.*= # Tomcat datasource specific settings spring.datasource.type= # Fully qualified name of the connection pool implementation to use. By default, it is auto-detected from the classpath. spring.datasource.url= # JDBC URL of the database. spring.datasource.username= # Login username of the database. spring.datasource.xa.data-source-class-name= # XA datasource fully qualified name. spring.datasource.xa.properties= # Properties to pass to the XA data source.参考資料
- Spring Boot Features - 10. Working with SQL Databases
- “How-to” Guides - 10. Database Initialization
- Spring Boot Reference Guide 2.1.7.RELEASE - Appendix A. Common application properties
- Spring Boot Reference Documentation - Appendices - Appendix A: Common application properties
- MySQL :: Download Connector/J
- MySQL :: MySQL Connector/J 8.0 Developer Guide :: 6 Connector/J Reference
- Spring Boot で Spring JDBC を使う - Qiita