LaravelのFormファサード(laravelcollective/html)でセレクトボックスを実装する

LaravelのFormファサード(laravelcollective/html)でセレクトボックスを実装する方法を解説する。

公式サイト

インストール

$ composer require laravelcollective/html

バージョンを指定してインストールすることもできる。

例:5.8をインストールする場合

$ composer require "laravelcollective/html":"5.8"

Form::select()の使い方

第1引数がselectタグのname属性、第2引数がoptionタグになる。

ソースコード

{{ Form::select(
    'pref', 
    [13=>'東京都',14=>'神奈川県', 26=>'京都府',27=>'大阪府']
) }}

実行結果

<select name="pref">
    <option value="13">東京都</option>
    <option value="14">神奈川県</option>
    <option value="26">京都府</option>
    <option value="27">大阪府</option>
</select>

第3引数は初期値になる。

ソースコード

{{ Form::select(
    'pref', 
    [13=>'東京都',14=>'神奈川県', 26=>'京都府',27=>'大阪府'], 
    26
) }}

実行結果

<select name="pref">
    <option value="13">東京都</option>
    <option value="14">神奈川県</option>
    <option value="26" selected="selected">京都府</option>
    <option value="27">大阪府</option>
</select>

第4引数はselectタグの属性になる。

ソースコード

{{ Form::select(
    'pref', 
    [13=>'東京都',14=>'神奈川県', 26=>'京都府',27=>'大阪府'], 
    null, 
    ['class'=>'form-control']
) }}

実行結果

<select class="form-control" name="pref">
    <option value="13">東京都</option>
    <option value="14">神奈川県</option>
    <option value="26">京都府</option>
    <option value="27">大阪府</option>
</select>

第4引数にplaceholderを指定すると、値のないoptionタグが要素の最初に作成される。

ソースコード

{{ Form::select(
    'pref', 
    [13=>'東京都',14=>'神奈川県', 26=>'京都府',27=>'大阪府'], 
    null, 
    ['class'=>'form-control', 'placeholder'=>'選択してください']
) }}

実行結果

<select class="form-control" name="pref">
<option selected="selected" value="">選択してください</option>
<option value="13">東京都</option>
<option value="14">神奈川県</option>
<option value="26">京都府</option>
<option value="27">大阪府</option>
</select>

第2引数を配列の入れ子にすると、選択肢が階層化される。

ソースコード

{{ Form::select('pref', [
    '関東地方'=>[13=>'東京都',14=>'神奈川県'],
    '近畿地方'=>[26=>'京都府',27=>'大阪府']
]) }}

実行結果

<select name="pref">
    <optgroup label="関東地方">
        <option value="13">東京都</option>
        <option value="14">神奈川県</option>
    </optgroup><optgroup label="近畿地方">
        <option value="26">京都府</option>
        <option value="27">大阪府</option>
    </optgroup>
</select>

Eloquentモデルを使う

pluck()メソッドを使うと、簡単に選択肢を作成できる。

$prefectures = Prefectures::query()
    ->orderBy('code)
    ->pluck('name', 'code');
return view('index')->with(['prefectures'=>$prefectures]);
{{ Form::select('pref', $prefectures) }}

SQLAlchemyを使ってMySQLに接続する

環境

$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
$ python3 --version
Python 3.6.8

インストールする

$ pip install SQLAlchemy
$ pip install mysql-connector-python

確認する。

$ python3
Python 3.6.8 (default, Nov 16 2020, 16:55:22) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlalchemy
>>> sqlalchemy.__version__ 
'1.3.23'

使ってみる

#!python3
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String

USER='...'
PASSWORD='...'
HOST='...'
DATABASE='...'

# MySQL Connector/Pythonを使うためmysqlconnectorを指定する
engine=create_engine(f'mysql+mysqlconnector://{USER}:{PASSWORD}@{HOST}/{DATABASE}')

# テーブルを定義する
Base=declarative_base()
class Animal(Base):
    __tablename__='animals'
    __table_args__=({"mysql_charset": "utf8mb4"})
    id=Column(Integer, primary_key=True, autoincrement=True)
    name=Column(String(30), nullable=False)

# テーブルを作成する
Base.metadata.create_all(engine)

# セッションを作成する
Session=sessionmaker(engine)
session=Session()

# データを追加する
cat=Animal(name='cat')
dog=Animal(name='dog')
session.add(cat)
session.add(dog)
session.commit()

# データを更新する
cat=session.query(Animal).get(1)
cat.name='pengin'
session.commit()

# データを取得する
animals=session.query(Animal).all()
for animal in animals:
    print('id=',animal.id,'name=',animal.name)

Python3からMySQLに接続する

MySQL Connector/Pythonの使い方を紹介する。

環境

$ cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
$ python3 --version
Python 3.6.8

利用可能なMySQL Connector/Pythonoのバージョン

公式サイトのMySQL :: MySQL Connector/Python Developer Guide :: 3 Connector/Python Versionsを参照。

現行バージョンのMySQL Connector/Python 8.0は次のバージョンに対応している。

  • MySQL Server Versions
    • 8.0
    • 5.7
    • 5.6
    • 5.5
  • Python Versions
    • 3.9
    • 3.8
    • 3.7
    • 3.6
    • (2.7 and 3.5 before 8.0.24)

MySQL Connector/Pythonをインストールする

MySQL Connector/Python

pip install mysql-connector-python

MySQLに接続する

connect()コンストラクターは、MySQLサーバーへの接続を作成し、MySQLConnectionオブジェクトを返す。

import mysql.connector

USER='scott'
PASSWORD='password'
HOST='localhost'
DATABASE='employees'

cnx = mysql.connector.connect(
    user=USER,
    password=PASSWORD,
    host=HOST,
    database=DATABASE
)
cnx.close()

接続エラーを処理には、mysql.connector.Error例外をキャッチする。

import mysql.connector

USER='scott'
PASSWORD='password'
HOST='localhost'
DATABASE='employees'

try:
    cnx = mysql.connector.connect(
        user=USER,
        password=PASSWORD,
        host=HOST,
        database=DATABASE
    )
except mysql.connector.Error as err:
    print(err)
else:
    cnx.close()

テーブルを作成する

cursor()メソッドを使用して、カーソルオブジェクトを作成し、
カーソルオブジェクトのexecute()メソッドを使用してCREATE TABLE文を実行し、テーブルを作成する。

import mysql.connector

USER='scott'
PASSWORD='password'
HOST='localhost'
DATABASE='employees'

def create_table(cursor):
    SQL = (
        'CREATE TABLE IF NOT EXISTS animals ('
        '  id MEDIUMINT NOT NULL AUTO_INCREMENT,'
        '  name CHAR(30) NOT NULL,'
        '  PRIMARY KEY (id)'
        ');'
    )
    cursor.execute(SQL)

try:
    cnx = mysql.connector.connect(
        user=USER,
        password=PASSWORD,
        host=HOST,
        database=DATABASE,
    )
    cursor = cnx.cursor()
    create_table(cursor)
except mysql.connector.Error as err:
    print(err)
else:
    cnx.close()

データを追加する

カーソルオブジェクトのexecute()メソッドを使用してデータを登録し、
commit()メソッドを使用してコミットする。

失敗したときはrollback()メソッドを使用してロールバックする。

import mysql.connector

USER='scott'
PASSWORD='password'
HOST='localhost'
DATABASE='employees'

def create_table(cursor):
    SQL = (
        'CREATE TABLE IF NOT EXISTS animals ('
        '  id MEDIUMINT NOT NULL AUTO_INCREMENT,'
        '  name CHAR(30) NOT NULL,'
        '  PRIMARY KEY (id)'
        ');'
    )
    cursor.execute(SQL)

def insert(cursor):
    cursor.execute('INSERT INTO animals (name) VALUES (%s)', ('cat',))
    cursor.execute('INSERT INTO animals (name) VALUES (%(name)s)', {'name':'dog'})

try:
    cnx = mysql.connector.connect(
        user=USER,
        password=PASSWORD,
        host=HOST,
        database=DATABASE,
    )
    cursor = cnx.cursor()
    create_table(cursor)
    insert(cursor)
    cnx.commit()
    cursor.close()
except mysql.connector.Error as err:
    print(err)
else:
    cnx.close()

データを取得する

カーソルオブジェクトのexecute()メソッドを使用してSELECT文を実行する。

カーソルオブジェクトをイテレータとして使用し、結果セットの各行を取得する。

import mysql.connector

USER='scott'
PASSWORD='password'
HOST='localhost'
DATABASE='employees'

def select(cursor):
    cursor.execute('SELECT id,name FROM animals LIMIT %s', (3,))
    for (id, name) in cursor:
        print("id:{} name:{}".format(id, name))

try:
    cnx = mysql.connector.connect(
        user=USER,
        password=PASSWORD,
        host=HOST,
        database=DATABASE,
    )
    cursor = cnx.cursor()
    select(cursor)
    cursor.close()
except mysql.connector.Error as err:
    print(err)
else:
    cnx.close()

JMeterのインストールから負荷テストまでの備忘録

■テスト計画にスレッドグループとHTTPプロキシサーバーを追加する

「HTTPプロキシサーバー」の「対象となるコントローラ」を「テスト計画>スレッドグループ」に設定する

テスト計画
└スレットグループ
 └記録コントローラ
└HTTPプロキシサーバー

■プラグインをインストールする

  • Installing Pluginsのページからplugins-manager.jarをダウンロードし、JMeterのlib/extディレクトリーにコピーする。
  • JMeterを起動し、メニューの「オプション」→「Plugins Manager」を選択する。
  • 「Available Plugins」の「jpgc – Standard Set」をチェックし、「Apply Changes and Restart JMeter」ボタンを押す。

■不要な通信を記録しないように、記録するリクエストの条件を登録する

  • 「HTTPプロキシサーバー」を選択して、「Requests Filtering」タブを選択する。
  • 「挿入するパターン」の「追加」ボタンを押す。
  • テストするドメイン名を入力する。(.test.example.com.)
  • 「除外するパターン」の「追加」ボタンを押す。
  • 除外するパターンを入力する。

■Macのプロキシを設定する

  • 「Macのシステム環境設定」→「ネットワーク」→「Wi-Fi」→「詳細」→「プロキシ」を選択する
  • 「構成するプロトコルを選択」の「Webプロキシ(HTTP)」をチェックし、「Webプロキシサーバ」を「localhost」:「8888」に設定する。
  • 「構成するプロトコルを選択」の「保護されたWebプロキシ(HTTPS)」をチェックし、「Webプロキシサーバ」を「localhost」:「8888」に設定する。
  • 「OK」→「適用」をクリックする。

■記録を開始する

  • 「HTTPプロキシサーバー」の「開始」ボタンをクリックする。「停止」ボタンを押すまでの間の通信内容が記録される。
  • Webブラウザでテストするサイトにアクセスして、操作する。
  • 「停止」ボタンを押して、記録を修正する。
  • 通信内容が「テスト計画」→「スレットグループ」→「記録コントローラ」に追加されているので、不要なリクエストを削除する。

■リクエストの結果を検証する

  • HTTPリクエストを右クリックし、「追加」→「アサーション」→「アサーション」を選択する。
  • 追加したアサーションの「テストするレスポンスフィールド」の「応答コード」をチェックし、「テストパターン」に「200」または「302」を入力する。

■CSRF対応

CSRFトークンの取得

  • CSRFのトークンを返すHTTPリクエストを右クリックし、「追加」→「後処理」→「CSS Selector Extractor」を選択する。
  • 「参照名」に変数名「csrf_token」を入力する。
  • 「CSS Selector expression」に「input[name=_token]」を入力する。
  • 「Attribute」に「value」を入力する。

CSRFトークンの送信

  • CSRFトークンを送信するHTTPリクエストを選択する。
  • 「Parameters」タブを選択する。
  • 「リクエストで送るパラメータ」の値のセルに「${csrf_token}」を入力する。

HTTPクッキーマネージャの追加

  • 「記録コントローラ」を右クリックし、「追加」→「設定エレメント」→「HTTPクッキーマネージャ」を選択する。
  • 「繰り返しごとにクッキーを破棄しますか?」をチェックする。

■JSONの値を使用する

JSONから値の取得

  • JSONを返すHTTPリクエストを右クリックし、「追加」→「後処理」→「JSON Extractor」を選択する。
  • 「Names of created variables」に変数名を入力する。
  • 「JSON Path expressions」にJSONのパスを入力する。

JSONの値の送信

  • JSONの値を送信するHTTPリクエストを選択する。
  • 「Parameters」タブを選択する。
  • 「リクエストで送るパラメータ」の値のセルに「${変数名}」を入力する。

■カウンタを使用する

  • 「記録コントローラ」を右クリックし、「追加」→「設定エレメント」→「カウンタ」を選択する。
  • 「Number format」に「000」を入力すると、カウンタは「001」〜「999」となる。
  • 「参照名」に変数名を入力する。カウンタの値は「${変数名}」で取得できる。

■スレッドグループを設定する

  • 「Delay Thread creation untill needed」をチェックする。

スレッドの設定

  • 「スレッド数」…1回のループで実行するスレッドの数
  • 「Ramp-Up期間(秒)」…1回のループにかける時間
  • 「ループ回数」…繰り返す回数

「スレッド数」を5、「Ramp-Up期間(秒)」を10、「ループ回数」を1と設定した場合、
2秒ごとに1スレッドを作成してリクエストを送信する。

■テスト対象のサーバーを切り替える

HTTPリクエスト初期設定の追加

  • 「スレッドグループ」を右クリックし、「追加」→「設定エレメント」→「HTTPリクエスト初期設定」を選択する。
  • HTTPリクエストの項目が空欄のとき、HTTPリクエスト初期設定の値が使用される。

HTTPリクエスト初期設定の切り替え

  • 複数のHTTPリクエスト初期設定を作成して、HTTPリクエスト初期設定の有効・無効を切り替え、テスト対象のサーバーを切り替える。

■コマンドラインモードで実行する

jmeter -n -t my_test.jmx -l log.jtl

コマンドラインのオプション(公式)

  • -n
    JMeterをCLIモードで実行する
  • -t
    引数 テスト計画を含むJMXファイルの名前
  • -l
    引数 サンプル結果をログに記録するJTLファイルの名前
  • -j
    引数 JMeter実行ログファイルの名前
  • -r
    JMeterプロパティ「remote_hosts」で指定されたサーバーでテストを実行する
  • -R
    引数 リモートサーバーのリスト
    指定したリモートサーバーでテストを実行する
  • -g
    引数 CSVファイルへのパス
    レポートダッシュボードのみを生成する
  • -o
    負荷テスト後にレポートダッシュボードを生成する出力フォルダー。
    フォルダは存在していないか、空であること。
  • -H
    引数 プロキシサーバーのホスト名またはIPアドレス
  • -P
    引数 プロキシサーバーのポート
jmeter -n -t my_test.jmx -l log.jtl

■コマンドラインモードの実行結果を表示する

  • 「スレットグループ」を右クリックし、「追加」→「リスナー」→「結果を表で表示」を選択する。
  • 「全てのデータをファイルに出力」の「参照」ボタンを押し、出力したログファイルを開く