MySQL – データベースのバックアップと復元

データベースのバックアップ

特定のデータベースのバックアップ

バックアップにはコンソールからmysqldumpコマンドを使う。

以下のコマンドでダンプファイルが作成される(dumpファイルパスがファイル名だけならカレントディレクトリーに作成)。

全データベースのバックアップ

データベースの復元

データベースの復元には、コンソールからmysqlコマンドを使う(mysqldumpコマンドではない)。

あらかじめ復元先の空のデータベースを作成しておく。

特定のデータベースへの復元

全データベースの復元

ハマったこと

復元時に「データベースがない」

以下のエラー。

Unknown database ‘DB名’

復元先に空のデータベースがないと復元できないので、作成する必要がある。

復元時に'<‘が使えない (Windows PowerShell)

以下のエラー。

演算子 ‘<‘ は、今後の使用のために予約されています。

WindowsのPowerShellでは'<'は使えないらしい。コマンドプロンプトやLinuxのShellでは問題なし。

復元時に「ASCIIの’\0’があります」(Windows/PowerShell)

以下のエラー。

ERROR: ASCII ‘\0’ appeared in the statement, but this is not allowed unless option –binary-mode is enabled and mysql is run in non-interactive mode. Set –binary-mode to 1 if ASCII ‘\0’ is expected.

WindowsのPowerShellはデフォルトの文字コードがSJISのため、ダンプファイルを作成すると復元側で読み取れない。

 

MySQL – phpMyAdmin

Windows版インストール

ダウンロードと配置

  1. ZIPファイルダウンロード
  2. PHPのhtdocs下にphpmyadminディレクトリー作成し、ファイルをコピー

サーバー起動

  1. ブラウザーでlocalhost:8000/phpmyadmin
    • エラー”mysqli拡張がありません。PHPの設定をチェックしてみてください”
  2. php.iniの;extension=mysqliのコメントを外す
  3. localhost:8000/phpmyadmin/index.php
    • “phpMyAdmin環境補完領域が完全に設定されていないため、いくつかの拡張機能が無効になっています”
  4. phpmyadminデータベースを作成
  5. phpMyAdmin環境補完領域をセットアップのリンクへ
  6. MySQLユーザーにphpmyadminの権限を設定
    • GRANT ALL PRIVILEGES ON `phpmyadmin`.* TO `ユーザー`@`localhost`

Vagrant仮想環境へのインストール

 

MySQL – インストール

 

ダウンロードまで

  1. MySQLサイト、下方のダウンロードで”MySQL Community Serverをクリック
  2. MySQL Installer for Windowsをクリック
  3. Web版ではなく約400MBのファイル版をダウンロード
    • 64bit版でもWindows(x86, 32-bit)
  4. Loginページで”No thanks, just start my download”をクリック
  5. ダウンロードしたmsiファイルを実行

インストーラー実行

  1. Developer DefaultのままNext
  2. いくつかManualインストールが必要なもの
    • VisualStudio
    • Python3.x
    • これらをインストール後、Nextを押す前にExecuteを押して他の項目も自動解決
  3. Product Configuration→Next
  4. Type and Networking
    • TCP/IP
    • PORT: 33060のまま
    • X-Protocol Port: 33060のまま
  5. Authentication Method
    • Use Strong Password Encryption …
  6. Root Password
    • パスワードを入力
  7. Windows Service
    • Configure MySQL Server as a Windows Service→チェックのまま
    • Start the MySQL Server at System Startup→チェックのまま
    • Standard System Account→ラジオボタン選択のまま
  8. Apply Configuration→Execute→Finish
  9. Product Configuration→Next
  10. MySQL Router Configuration→Next
  11. Product Configuration→Next
  12. Connect To Server
    • root/パスワード入力→Check→Connection succeeded
  13. Apply Configuration→Execute→Finish
  14. Product Configuration→Next
  15. Installation Complete
    • Start MySQL Workbench after setup→チェックを外す
    • Start MySQL Shell after setup→チェックを外す
    • Finish

 

Rails – 基本操作

ビューの記述

コントローラー作成時にアクションを指定した場合

ビューは以下のHTMLファイルに準備されているので、その内容をHTMLで記述する。

app/views/controller_name/action_name.html.erb

あとからアクションを追加する場合

以下のファイルを作成し、その内容をHTMLで記述する。

app/views/controller_name/action_name.html.erb

各ビューに共通するビュー

各ビューのファイルはbodyタグの中だけを書くが、HTML全体の枠組みやHEAD要素など各ビューに共通の内容は以下のファイルに書かれている。

app/views/layouts/application.html.erb

SCSS

コントローラーごとに以下のSCSSファイルでスタイル指定する。

app/assets/stylesheets/controller_name.scss

stylesheetsディレクトリー下のSCSSファイルは全てのビューに適用される。

フォーム送信

HTML

HTMLのformタグの代わりにヘルパーメソッドが使える。

<%= form_tag("送信先URL") do %>
<% end %>

送信先URLは"/controller_name/action_name"のような形で指定する。form_tagメソッドはデータをPOST形式で送る。

routes.rb

また、POSTに対して指定したメソッドが起動するようにroutes.rbでルーティングを設定する。

post '/controller_name/action_name', to:'controller_name#action_name'

controller_name_controller

コントローラーのファイルでで定義されているコントローラークラスにアクションメソッドを追加する。

この段階でもsubmitボタンを押すとコンソールでデータが渡されているのが確認できる。

 

PHP – array_map

概要

array_map()関数は、引数で指定した配列の各要素にコールバック関数を適用した配列を返す。

コールバックの指定方法として、文字列で関数名を渡す方法と、Ver5.3.0以降ではラムダ関数を引き渡す方法がある。

コールバックを文字列で渡す方法

以下の処理では、array_map()の第1引数に文字列でコールバックの関数名を渡している。

コールバックをラムダ関数で渡す方法

以下の処理では、ラムダ式で無名関数を変数にバインドし、array_map()の第1引数にその変数を渡している。結果は上と同じ。

無名関数を直接渡す方法

以下の処理では、無名関数を変数にバインドせず、array_map()の第1引数に直接書いている。

 

PHP – ランダム文字列の生成


str_shuffleによる方法~文字重複なし

概要

この方法の場合、

  • ランダム文字列中の文字は全て異なる
  • ランダム文字列の最大長は36文字

数字とアルファベットで36文字を使う場合、文字列長に対するパターン数は以下の通り(36!/(36-n)!)。

  • 5文字→45,239,040通り(約45百万通り、107のオーダー)
  • 10文字→922,393,263,052,800通り(約900兆通り、1014のオーダー)
  • 16文字→152,901,072,685,905,223,680,000(約1500垓通り、1023のオーダー)

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. str_shuffle()関数により、文字ソースの文字をシャッフルした文字列を得る($shuffled_chars)。
  3. substr()関数により、シャッフルされた文字列の先頭から必要な文字数分を切り出す($random_string)

1行で書いた場合

確率

16文字のケースで考えると、1つのパターンが発生する確率はおおよそ1÷1.5×1023 = 6.54×10-23

仮に1秒間に100万個のパターンが生成されるとすると、同じパターンの再帰年数は1/6.54×10-23÷106÷60÷60÷24÷365.25≒4.8×109年、約50億年になる。

str_shuffleによる方法~文字重複あり

概要

この方法の場合、

  • ランダム文字列中に同じ文字が出現し得る
  • ランダム文字列の長さは任意

数字とアルファベットで36文字を使う場合、文字列長に対するパターン数は以下の通り。

  • 5文字→60,466,176通り(約6千万通り、107のオーダー)
  • 10文字→3,656,158,440,062,976通り(約3600兆通り、1015のオーダー)
  • 16文字→7,958,661,109,946,400,884,391,936(約8𥝱通り、1024のオーダー)

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. 文字ソースの文字列をランダム文字列の文字数分だけ繰り返した文字列を得る($chars)。
  3. その文字列をシャッフルする($random_chars)。
  4. シャッフルされた文字列の先頭から、ランダム文字列の文字数分だけ切出す($random_string)。

1行で書いた場合

確率

16文字のケースで考えると、1つのパターンが発生する確率はおおよそ1÷8×1024 = 1.25×10-25

仮に1秒間に100万個のパターンが生成されるとすると、同じパターンの再帰年数は1/1.25×10-25÷106÷60÷60÷24÷365.25≒2.5×1011年、約2500億年になる。

array_mapによる方法~文字重複あり

概要

この方法による結果は、str_shuffleによる方法と等価。

丁寧に書いた場合

コード

処理の流れ

  1. ランダム文字列に使う文字ソースの文字列を準備しておく。
    • const RANDOM_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
  2. ランダム文字列のための配列を準備する($source_array)。文字列長分の長さの配列を確保すればよいので、ここではarray_fill()を使っている。
    • [0, 0, 0, ..., 0]
  3. 文字ソース文字列からランダムに1つの文字を返すコールバック関数を定義する($random_char)。
  4. ランダム文字を要素とする配列を得る($random_chars)。最初に準備した$source_arrayの各要素にコールバックをマッピングしている。
    • ['a', '9', 'i', ..., 's']
  5. ランダム文字配列をimplode()関数で文字列に変換する($random_string)。
    • 'a9i...s'

1行で書いた場合

先のコードを1行で書くとこうなる。

1行が長くなりすぎるので複数行にすると以下のようになる。

確率

この方法による確率は、str_shuffleによる方法と同じ。

 

Tips – headerの固定

概要

body内にheader要素を置き、全体をスクロールしたときにheaderのみ固定されて動かないようにしたいとき。

CSSで以下を設定する。

  • position: fixed
  • top: 0
  • box-sizing: border-box
  • width: 100%

HTML

CSS

body要素

  • margin: 0を指定する

header要素

  • position: fixed指定でheader要素を固定する
    • header要素の幅がコンテンツの文字の長さまで短くなってしまう
  • width: 100%指定でheaderの親要素bodyの幅まで広げる
    • ただしCSSのボックスモデルではwidthheightはコンテンツの幅と高さなので、右端がはみ出てしまう
  • box-sizing: border-box指定でheaderのボーダーがbodyの幅に合うようにする
  • top: 0指定で

メインコンテンツ

  • margin-topを指定して、メインコンテンツの先頭がheaderとラップしないようにする

 

MySQL – ユーザーの作成・権限設定

ユーザー一覧の確認

ユーザー一覧のカラムの確認

SELECT COLUMNS FROM mysql.user;

ユーザー一覧の表示

SELECT  user, host FROM mysql.user;

ユーザーの作成

CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';

権限の設定

権限の確認

SHOW GRANTS FOR 'user'@'localhost';

権限付与

GRANT permission ON database . table TO 'user'@'localhost';

permission

ALL / ALL PRIVILEGES
指定したデータベースまたは全体へのフルアクセス
CREATE
新しいテーブル・データベースの作成
DROP
テーブル・データベースを削除
DELETE
テーブルからの行の削除
INSERT
テーブルへの行の挿
SELECT
SELECTコマンドによるデータの読み取り
UPDATE
テーブルの行の更新
GRANT OPTION
他のユーザーの権限の設定

PHP – foreachでの参照渡しとunset

概要

  • foreachは値渡しなので、要素の変更が反映されない
  • 要素を参照渡しにすると変更ができる
  • ただしループ終了直後にunsetが必要

雛形としては以下のようになる。

PHP-Manual: foreach

警告

foreach ループを終えた後でも、 $value は配列の最後の要素を参照したままとなります。 unset() でその参照を解除しておくようにしましょう。 さもないと、次のような目に遭うことになるでしょう。

・・・・・

foreachでは要素の変更ができない

以下のように、foreachで配列の要素などを変更しようとしても、値渡しのため変更が反映されない。

参照渡しで変更ができる

以下のように要素を参照で渡すと(要素の変数の前にに'&'を付けると)変更ができるようになる。

注意点

以下のように、その後に再びforeachで内容を参照すると、最後の要素が繰り返し呼ばれてしまう。

unsetによる参照のクリア

参照でforeachを実行した後にunset()でその参照変数をクリアすることで、その後のループは正常に回る。

補足

参照でforeachを回した後、unset()せずに通常のforeachを実行すると、その後にunset()しても最後の要素が指された状態が残ってしまうようだ。

 

PHP/HTML – 同一フォームの複数送信ボタン

概要

1つのフォームに複数のsubmitボタンを配置して、ボタンごとの処理を分ける方法

  • $_POST変数で押されたボタンのname属性をキーとする連想配列が定義され、他のボタンは定義されない。
  • isset($_POST[処理するボタンのname属性値])がtrueの場合にボタンに対応する処理を書く。

確認コード

コード概要

  • 1つのFORMに3つのsubmitボタンを配置
  • 押されたボタンのname属性をキーとする連想配列が定義され、押されなかったボタンの連想配列は定義されない
  • 同じFORM内に配置されたINPUT要素は常に$_POSTに定義される
  • クリア用のボタンはGETを送信

処理結果

開始直後:ボタンのみ表示される。

送信1ボタンを押したとき:

送信2ボタンを押したとき:

クリアボタンを押したとき:表示はクリアされる