JMeterを試してみた

簡単に使える負荷テスト用のツールを探してたところJMeterが手軽で十分な機能が使えそうだったので試してみました。 JMeterこちらからダウンロードできます。macの場合はダウンロード後解凍しsh bin/jmeterを実行することでJMeterが起動します。

スレッドグループの作成

スレッドグループはテストを実行するシナリオの単位のようなのもで、スレッドグループ内で指定したリクエストを順番に飛ばしたりできます。右側に表示されているテスト計画名のところを右クリックしAdd -> Threads(Users) -> Thread Groupでスレッドグループを追加できます。スレッドグループではスレッド数(同時実行ユーザ数)、ループ回数または実行時間などの設定ができます。

リクエストの結果を確認できるようにする

ちゃんとリクエストが飛んでいるのか確認するためにはview results treeを追加します。テスト計画名を右クリックしAdd -> Listener -> view results treeと選択することで追加できます。

Summary Reportを確認できるようにする

Summary Reportでは飛ばしたリクエスト数や平均どれくらい時間がかかったか、もっとも時間がかかったものを確認することができます。テスト計画名を右クリックしAdd -> Listener -> Summary Reportsと選択することで追加できます。

cookieを扱えるようにする

テスト計画名を右クリックしAdd -> Config Element -> HTTP Cookie Managerと選択することでcookieをリクエストに含めるようになります。リクエストに含めるcookieの内容を固定で決める場合はUser Defined Cookiesで指定します。

リクエストヘッダにcookieの内容を含める

csrfとかでcookieの内容をリクエストヘッダに含ませたい場合、JMeterの設定ファイルを修正しcookieを変数に保存して利用できるようにします。対象の設定ファイルはjmeter.propertiesで以下の設定を追加します。

CookieManager.save.cookies=true

この設定を入れた場合、JMeter内で${COOKIE_クッキー名}のようにしてcookieの値を参照できるようになります。

リクエストヘッダを設定する場合Add -> Config Element -> HTTP Header Managerを選択します。例えばspring bootでcsrf対策を有効にしている場合、cookieで受け取ったXSRF-TOKENX-XSRF-TOKENとしてリクエストヘッダに含めるのですがその場合nameにX-XSRF-TOKENvalue${COOKIE_XSRF-TOKEN}を指定します。

リクエストを追加する

スレッドグループのところで右クリックし、Add -> Sampler -> HTTP Requestを選択することでリクエストを追加できます。リクエストパラメータの内容はSend Parametersで指定し、JSONを送信する場合Content-Typeにapplication/jsonを指定しvaluejsonの内容を指定します。jsonのリクエストでない場合、Content-Typeにtext/plainを指定しname,valueを指定します。

リクエスト毎にリクエストヘッダで指定するContent-Typeを変える必要が出てくるので、その場合リクエストの下にリクエストヘッダを追加しそのリクエストにのみ有効になるようにします。JSONのレスポンスを返す場合はContent-Typeapplication/jsonを指定します。確認したところJMeterではデフォルトでContentType: text/plain;charset=UTF-8となっているのでjsonのレスポンスを返すときにデフォルトではエラーになります。

レスポンス後にすぐにリクエストを飛ばすのではなく待たせる場合は、Add -> Timer -> Constant Timerを追加します。

特定のリクエストのみ繰り返す場合Add -> Logic Controller -> Loop ControllerでLoop Controllerを追加します。

シナリオテストでログインするユーザを分けたい場合はユーザパラメータを追加する。スレッドグループ名を右クリックしAdd -> Pre Processors -> User Parametersで追加できる。あとはAdd Userを実行して変数を設定するとリクエストで利用できる、例えばlogin_idというユーザパラメータを追加したら${login_id}で参照できるようになる。User Parametersで追加したユーザよりもスレッドの方が多い場合その分ユーザが重複して使用されます。

プラグイン開発でクリーンアーキテクチャになるよう意識したこと

最近Chrome, Firefoxでのプラグイン開発を行ったので、その時気をつけたことなどまとめてみたいと思います。通常のWEB開発とはまた違った経験ができたので面白かったと思う。

疎結合高凝集を意識した

全体的な機能の凝集度を上げれる様にするため、細かいレベルでの機能に分割した。例えばDOMにイベントハンドラを登録するだけの機能や定期的にイベントを発火するだけの機能、それからPostメッセージでやり取りするためのPortを管理したり、タブを管理するための機能などドメインに限らず細かく適切に責務を与える様にして凝集度が上がる様に気をつけた。
ただ最初から凝集度が高くなる様に実装したというよりかは、ある程度動きに問題が無さそうで機能として独立させても良い気がした段階でリファクタリングをする様に心がけていた気がする。この辺りは一発で完全に作るというよりかは段階を踏んで改善していくことができたと思う。

結合度について、凝集度を高くしていくことで機能毎での独立性をあげることができていたと思う。基本的にコンポーネント内で管理する変数はコンポーネント内でのみ利用する場合はメソッド経由で参照ではなく値を返す様にしていた。とは言ってもいろんなところで扱う変数,stateも出てくるが、これについては更新を許可、参照のみ許可などをレイヤー毎に分けることで想定外の依存が存在しない様にし結合のレベルをコントロールできる様に気をつけた。

疎結合高凝集の実現方として、レイヤ間では低結合になる様にしレイヤ内では高凝集となる様レイヤを意識するのが良さそうに思った。またこの時処理フローの流れを一方向になる様にすることで全体の流れが大分把握しやすくなる様に感じた。

疎結合高凝集を意識して作ったメリットとして変更に強いシステムになったと思う。例えばPostメッセージで送る対象がhostが同一のタブからタブの開いた元と、開いた先のタブに対してのみPostメッセージを送る修正をしたのだが細かい修正で対応することができた。

最近Clean Architecture 達人に学ぶソフトウェアの構造と設計を読んでみたけどSOLID原則とかも結局は疎結合高凝集の方法な気がした。

サーバサイドのAPI開発などでデータの登録、更新、削除等が必要な場合はドメインモデルをよく考える必要があると思うけど、今回のプラグイン開発ではAPIの結果をどう表示するかとかリクエストを投げたりするくらいでドメインモデルについてはそこまで考えなくても問題なく実装できた。

AtCoder ABC Q110の問題DをHaskellで解いてみました

AtCoder ABC Q110の問題DHaskellで解いてみました

問題

正整数 N,M が与えられます。

a1×a2×…×aN=M となる正整数からなる長さ N の数列 a が何通りあるかを 10^9+7 で割った余りを求めてください。

ただし、数列 a' と a'' が異なるとは、ある i が存在して ai'≠ai'' であることをいいます。

制約
入力はすべて整数である
1≤N≤10^5
1≤M≤10^9
続きを読む

javascriptでdomの正確な位置を取得したい

javascriptでdomの位置を取得するための関数を作成してみました。domの位置として画面上の左上の位置を基準とした座標とdocument上の左上の位置を基準(スクロールを含めたもの)とした座標があると思いますが、その両方を求めれるようにしたいと思います。

続きを読む

IndexedDBを試してみる

IndexedDBを試してみる

ブラウザ上のデータを保存したい場合FileSystemAPIがありますが、これは非推奨のようなので代わりに使えそうなのを探していたところIndexedDBが良さそうなので試して見たいと思います。

IndexedDBの使い方はmozillaのサイトを見たらわかると思います。

続きを読む

ECMAScript2015のProxyを使ってobjectの値の変更を検出する

ECMAScript2015でobjectの値の変更を検出して関数を実行する場合、以前であればObject.prototype.watchの機能があったのですが現在では非推奨および廃止とのことなのでECMAScript2015から導入されたProxyの機能を使って値の変更を検出したいと思います。

MDNのサンプルでは以下のようにProxyに対して監視対象のobjectの初期値とイベントハンドラを渡していて、帰ってきたobjectの値を参照しようとした時にイベントハンドラのget関数が実行されていることが確認できます。

続きを読む

ロジスティック回帰を実装してみる

ロジスティック回帰

2クラス分類のロジスティック回帰をPythonで実装して見たいと思います。

C1, C2の2クラス分類についてクラスC1の事後確率は以下のように表せられます。

続きを読む