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ボタンを押したとき:

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

 

PHP – 雛形 – 複数の例外のチェーン

概要

複数のエラーを補足していって、まとめて表示するなどの処理をしたい場合がある。たとえばユーザーIDとパスワードの妥当性をチェックし、それぞれのエラーを全て表示したいような場合。

このようなケースで例外を使うと、例外が発生した場合や意図的にスローした場合、その時点で例外処理に移行するので、複数のエラーを扱い難い。

Exception::getPrevious()

Exceptionクラスのコンストラクターは、3つの引数をとることができる。

public __construct (string $message = "", int $code = 0, Throwable $previous = null )

3つ目の引数はThrowableで、この引数にExceptionオブジェクトを指定すると、新たに生成されたオブジェクトの前に発生したExceptionオブジェクトがスタックに保持される。

$new_ex = new Exception('this exception', 0, $previous_ex)

最終的に得られたExceptionオブジェクトのスタック上にそれ以前のExceptionオブジェクトがある場合、getPrevious()メソッドで直前のオブジェクトが得られる。直前のExceptionオブジェクトがない場合はgetPrevious()の戻り値はnullとなる。

基本形

これらのことを利用して、複数の例外を途中で抜け出さずに蓄積する方法は以下のようになる。

  • 2行目の初期化は、1番目・・・n番目のどこが最初の例外をスローするかが確定していないため必須。
  • 17~19行目、適切な位置で例外をスローしないと反映されないが、例外が発生していない場合はスローしない

実行例

以下は実行例。1つ目と3つ目の条件式がfalseなので例外が積み重ねられ、2つ目はtrueなのでそのまま表示、そのあとに積まれた例外が表示される。

関数化・配列への格納

Exceptionオブジェクトの積み込みと、例外発生時のみの例外スロー、スタックされた例外に対する操作を関数化しておくと、再利用しやすく可読性も上がる。

18行目で配列の順序を反転し、スタックに積まれた順番(LIFO)からFIFOのリスト順にしている。

これらの関数を使って先と同じ処理をするコード

関数での例外発生のトレース

最初の関数で発生した例外への過程をスタックに残すには、以下のように関数内で前の例外を登録してスローする。