Vagrant – 仮想環境構築 – CentOS7

概要

Windows10にVagrant + VirtualBoxでCentOS7の仮想環境を構築したときの記録。

Vagrant/VirtualBoxの導入

Vagrantのインストール

VirtualBoxのサイトのダウンロードページからインストールファイルをダウンロード。

  • Windows/64bitを選択してDownload
  • vagrant_2.2.14_x86_64.msi(232MB)

ダウンロードしたmsiファイルを実行

  1.  Welcome to ….→Next
  2. End-User Lisence Agreement→accept & Next
  3. C:\HashiCorp\Vagrant→Next
  4. Ready to install Vagrant→Install
  5. Completed …→Finish
  6. You must restart your system …→Yes/No
  7. Restart

コンソールを起動し、インストールされたVagrantのバージョンを確認。

VirtualBoxのインストール

VirtualBoxのサイトからパッケージをダウンロード。

  1. VirtualBox 6.1.18 platform packages
  2. Windows hosts
  3. VirtualBox-6.1.18-142142-Win.exe

インストール

  1. Welcome to …→Next
  2. Custom Setup
    • インストール先はC:\Progrm Files\Oracle\VirtualBox
  3. ショートカット作成選択
  4. Warning Network Interfaces→Yes
  5. Ready to Install→Install
  6. … installation is complete→Finish

VisuaruBoxを起動してバージョン確認。

  • バージョン 6.1.18 r142142 (Qt5.6.2)

拡張版のインストール

本体ダウンロードのリンクの下に拡張版のダウンロードがある。説明書きに”Support for USB 2.0 and USB 3.0 devices, …”とあって、USBを有効が有効になる。

  1. VirtualBox 6.1.18 Oracle VM VirtualBox Extension Pack→download
  2. VirtualBox起動
    1. ファイル→環境設定→機能拡張
    2. 右方のアイコン→ファイル選択→インストール

この段階ででSSD 147/237GB freeでインストール前と容量が変わっていない。

Boxの導入

Vagrant導入当初BoxとしてVagrant CloudのCentos/7を選んだが、共有フォルダ-設定がうまくいかなかったのでbento/Centos-7.7に変更した。

Boxのインストール

仮想環境のBoxをインストール。Vagrant Cloudで提供されているbento/CentosOS-7.7を選んだ。

  • Vagrantからのインストールの場合は以下のコマンド。
    • >vagrant box add bento/centos-7.7
    • ダウンロードに10分程度かかる
  • 他のサイトからの場合、名前を指定してインストールする場合は以下のコマンド。
    • >vagrant box add name url/local_file

インストールされたBoxの存在確認(前にインストールしたCentos/7のBoxも残っている)。

Boxファイルの格納場所

Windows

  • ユーザーフォルダー\.vagrant.d\boxes

仮想環境のVagrant設定

ドライブ直下にVagrantディレクトリー、その下にCentOS7のディレクトリーを作成し、そこに移動。

移動後のディレクトリー内で初期設定。この操作によってディレクトリー内にvagrantfileが作成されて、仮想環境が利用可能になる。

この時点でSSD 140/237GB free。

仮想環境の利用

仮想環境の起動

vagrant upコマンドで仮想環境を起動。

仮想環境へのログイン

現バージョンでは、Windowsでもvagrant sshで接続できる。

バージョンを確認。

実行中の仮想環境の確認

仮想マシンを立ち上げたコンソールとは別のコンソールを立ち上げ、vagrant statusで確認。

仮想環境からのログアウト

CentOSのexitコマンドでログアウト。

仮想環境の停止

Windowsプロンプトでvagran haltコマンドを実行して停止。

仮想環境停止の確認

停止後のWindows環境でvagrant statusを実行すると仮想環境の停止を確認できる。

ロケール/タイムゾーンの設定

ロケール/タイムゾーンの確認

現在のロケール、タイムゾーンはdatelocalelocalectlコマンドで確認できる。インストール直後はUSになっている。

ロケールの設定

ロケールの設定はlocalectlをsuで実行。

sudo localectl set-locale LANG=ja_JP.UTF-8

設定の反映には再接続が必要。

タイムゾーンの設定

現在のタイムゾーンはtimedatectlコマンドで確認できる。

とりあえずWarningは置いておく。

設定可能なタイムゾーンの一覧は以下のとおり。

timedatectl list-timezones

タイムゾーンの設定はtimdatectlをsuで実行。

sudo timedatectl set-timezone [タイムゾーン名]

 

Ruby – ファイル操作 – CSV

ライブラリーの読み込み

ライブラリーのcsvを読み込む。

require "csv"

CSVファイルの書き込み

ファイルのオープン

モードを指定してファイルを開き、CSVオブジェクトを取得(モードはファイル操作を参照)。

csv = CSV.open("ファイル名", "モード")

行単位の書き込み

カラム数を要素数とする配列でputs()メソッドを使う。

csv.puts([col1, col2, ... ])

'<<'演算子でもよい。

csv << ([col1, col2, ... ]

ファイルのクローズ

csv.close

CSVファイルの読み込み

ファイルのオープン/クローズは不要で、read()メソッドで直接一括読み出し。

array = csv.read

結果は2次元配列で、行数がレコード数、列数がカラム数。

 

Ruby – 日付と時刻

現在時刻

現在時刻はTimeクラスのnowメソッドで取得。

Time.now

フォーマッティング

Timeクラスのstrftime()メソッドで日付・時刻を書式整形した文字列が得られる。

time.strftime("書式文字列")

典型的な書式の例

time.strftime("%Y/%m/%d %H:%M:%S")

 

正規表現 – 雛形

一般

文字列の先頭と末尾の位置指定には^$ではなく\A\zと用いる。

参考:【PHP】マルチバイト(全角スペース等)対応のtrim処理

  • 半角英数記号
  • n文字以上m文字以下
    • \A(文字){n,m}\z
  • patternを含む
    • (?=.*pattern).*
  • patternを含まない
    • (?!.*pattern).*
  • pattern1を含みpattern2を含まない
    • (?=.*pattern)(?!.*pattern).*

雛形

英数字

  • 英文字のみ
    • [a-zA-Z]
  • 英数字
    • [0-9a-zA-Z]
  • \wはアンダースコアを含むので注意
    • [0-9a-zA-Z_]

正の整数

  • /\A[1-9][0-9]*\z/
    • 01や+1は通らない
  • /\A\+?[0-9]*[1-9][0-9]*\z/
    • +001を通す
  • /\A\+?0*[1-9]+(,?[0-9]+)*\z/
    • 先頭に+を許可、その後0の連続を許可、桁内任意位置のカンマを許可

スペース

  • 先頭/末尾の連続するスペース(半角・全角とも)。エスケープ解釈のためダブルクォート
    • "/\A[\x20\xE3\x80\x80]+|[\x20\xE3\x80\x80]+\z/u"

メールアドレス

  • ローカル部は英数字、_、+、-でドットは間に1つずつ、ドメインは英数字、-でドットは間に1つずつ
    • \A([\w+-]+.?[\w+-]+)+@([\w-]+.?[\w-]+)+\z

コメント

  • /*…*/→/\*[\s\S]*?\*/
    • 複数行にわたる場合も可

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による方法と同じ。