HTTP(S)通信のテストに、OkHttpのMockWebServerを利用する

JavaのHTTPクライアントとして有名なOkHttpですが、関連プロジェクトにMockWebServerという機能があります。

HTTPサーバとしてモックを提供するものになります。手順としては、、

  • モックサーバとして返却するレスポンスのシナリオを書く
  • モックサーバを起動する
  • モックサーバのURLに対して、アプリケーションでアクセスする
  • レスポンスが予期したものであることを検証する

といった形になります。とてもシンプルで使いやすいです。

なお、OkHttpの関連プロジェクトですが、クライアントはOkHttpである必要性はありません。なので、様々なHTTPクライアントからの通信をテストすることができます。

使い方

MockWebServerのサイトのサンプルコードを元に説明します。

まずは、MockWebServerを生成し、モックサーバとして返却するレスポンスを定義します。

  MockWebServer server = new MockWebServer();

  server.enqueue(new MockResponse().setBody("hello, world!"));
  server.enqueue(new MockResponse().setBody("sup, bra?"));
  server.enqueue(new MockResponse().setBody("yo dog"));

モックサーバを起動し、モックサーバのURLを取得します。

  server.start();

  HttpUrl baseUrl = server.url("/v1/chat/");

アプリケーションを実行します。この際に、モックサーバのURLに対してアクセスさせるように指定します。

  Chat chat = new Chat(baseUrl);

  chat.loadMore();
  chat.loadMore();
  chat.loadMore();

モックサーバで受け付けたリクエストを検証します。server.takeRequest()で順番にリクエスト内容を取得できます。

  RecordedRequest request1 = server.takeRequest();
  assertEquals("/v1/chat/messages/", request1.getPath());
  assertNotNull(request1.getHeader("Authorization"));

  RecordedRequest request2 = server.takeRequest();
  assertEquals("/v1/chat/messages/2", request2.getPath());

  RecordedRequest request3 = server.takeRequest();
  assertEquals("/v1/chat/messages/3", request3.getPath());

最後にモックサーバを停止するのをお忘れなく。

server.shutdown();

2018年 洋楽マイベスト10

2018年に聴いていた洋楽で、自分が好きなものを10曲あげてみます。なるべく2018年にリリースされた曲に絞ってます。

  • Girls Like You ft. Cardi B - Maroon 5
  • Eastside - benny blanco, Halsey & Khalid
  • Youngblood - 5 Seconds Of Summer
  • The Middle - Zedd, Maren Morris, Grey
  • Colour ft. Hailee Steinfeld - MNEK
  • 2002 - Anne-Marie
  • 1999 - Charli XCX & Troye Sivan
  • Electricity ft. Diplo & Mark Ronson - Silk City & Dua Lipa
  • Dance To This ft. Ariana Grande - Troye Sivan
  • Personal - HRVY
  • (おまけ) Jenny - RUANN

SpotifyとYouTubeでプレイリストとして公開していますので、とりあえず聴いてみたいというかたはぜひ。

以降は簡単なコメントで各曲を紹介です。

Girls Like You ft. Cardi B - Maroon 5

2018年に洋楽で一番聴いた曲です。マルーン5 大好きですが、その中でも一番好きな曲になりました。アダムの優しい声が、曲にとてもあってます。

PVには、いろいろな女性有名人(女性アーティストも)が出ているので、それを見るのも楽しめます。

別バージョンのPVもあって、こっちはオフショット感があってまた面白いです。

Eastside - benny blanco, Halsey & Khalid

売れっ子音楽プロデューサーのベニー・ブランコが、ホールジー、カリードをボーカルとして向かえてリリースした曲です。心地よい曲で、最初に耳にした時点で、これ好きな曲だ、、というのが一発でわかりました。

Youngblood - 5 Seconds Of Summer

5SOSはデビュー曲のShe Looks So Perfectから好きで、日本での初ライブで見て、さらに好きになったグループです。デビューから時間を重ねるにつれて、どんどん大人になっていっていて、曲も洗練されてきています。Youngbloodは、そんな大人になった5SOSの渾身の1曲だと思います。

The Middle - Zedd, Maren Morris, Grey

ゼッドの曲はどれも良いのですが、そんな中でも1番ではと思う曲です。毎回曲に合わせてボーカルを選んでるんだろうなぁと思いますが、今回の曲もマレン・モリスの声がぴったりあっています。

ベスト10には入れなかったのですが、ゼッドがRemixしたショーン・メンデスの Lost In Japan もとても良い曲です。

Colour ft. Hailee Steinfeld - MNEK

MNEKのことはまったく知らず、ヘイリー・スタインフェルドそろそろまた日本こないかなーなんて調べていて、たまたま耳にした曲です。心地よいリズムから始まり、後半に向けてアップビートな感じになっていく、、とても癖になる曲で、何度も繰り返し聞くことになりました。

2002 - Anne-Marie

エド・シーランと一緒に書き上げたというアン・マリーのこの曲ですが、エド・シーランのギターで一緒に歌っている下記がさらにお勧めです。ほんと仲がよさそう。

二人とも4月に来日してライブやるので、競演したりしないかな、、と思ってます。(一週間違いだから厳しいかな)

1999 - Charli XCX & Troye Sivan

チャーリーXCXとトロイ・シヴァンがコラボしたこの曲は、ポップで、ちょっとノスタルジックな感じもする曲に仕上がってます。

PVではタイトルにもなった1990年代のオマージュがたくさんあって、1990年代が青春!?だった自分には、とても面白かったです。(なんのオマージュだかわかるものばかり!!)

Electricity ft. Diplo & Mark Ronson - Silk City & Dua Lipa

ディプロとマーク・ロンソンによるユニットのシルクシティが、デュア・リパをボーカルに迎えたこの曲は、とてもかっこいい曲になっています。デュア・リパの声含めかっこいい。

2018年はデュア・リパの曲を良く聞いていて、IDGAF や One Kiss も良かったのですが、その中でも一番良かったこの曲をあげています。

Dance To This ft. Ariana Grande - Troye Sivan

トロイ・シヴァンがアリアナ・グランデとコラボした、キャッチーで、ちょっとアンニュイな感じなこの曲で、初めてトロイ・シヴァンを知りました。お気に入りのアーティストになりました。

Personal - HRVY

Spotifyでお勧めされて、ポップなこの曲にすっかりはまってしまいました。今まであげた曲が好きな人ならば、はまること間違いないと思います。

おまけ: Jenny - RUANN

洋楽じゃないのですが、、RUANNのJennyは、洋楽好きならば、ぜったいにはまる1曲だと思います。ストリーミング配信されていない曲で、SCRAMBLE 14 というCDでのみ収録されている曲です。

洋楽カバーでも、いろんなアレンジを魅せてくれていて、個人的には下記のエド・シーランのShape of Youのカバーが大好きです。洋楽好きにお勧めできるアーティストです!

CSVを読み込んでRedmineのチケットを新規作成、更新するツール(redmine-issue-loader)を作りました

もともとカスタムフィールドの更新しかできないツールとしていましたが、年末年始で改修して、対象とするフィールドを増やして、新規作成+更新ができるツールに変更しました。名前もredmine-issue-updaterからredmine-issue-loaderに変更しています。

Redmineのチケットのインポートには、既にいくつか方法があります。

それらと比べて、本ツールのメリットとなる部分は下記だと考えています。

  • コマンドラインで実行できるので、周期実行として組み込みやすい。たとえば他のシステムとの連携で、決められたタイミングでCSVでエクスポートし、本ツールで取り込むといった利用が可能。
  • 設定ファイルにマッピング情報を記載するので、一度設定ファイルを書いてしまえば、その設定ファイルを使って、何度も同じ条件で実行可能。(RedmineのCSVインポートだと、画面上で項目のマッピングを選ぶ必要あり)
  • カスタムフィールドをキーとしてチケットを更新できるので、他のシステムのIDをカスタムフィールドとして入れておき、それをキーとして更新することができる。(取り込み側のチケットIDを知らなくても更新できる)

詳しい利用方法などは、下記をご参照ください。

RUANN - X★mas Eve2 Live 2018 (2018年12月23日@新宿ReNY)

8月のライブに続いての参戦です。

今回は小4の次女と一緒に行きました。位置としては2段目の先頭から見たので、どうにかRUANNちゃんの顔は見えるといった感じでした。中途半端に前のほうだと、背が低いとまったく見えないと思うので、整理番号200番くらいとしてはベストポジションだったのかなと思います。

f:id:onozaty:20190102224421j:plain

「X★mas Eve2 Live」ということで、クリスマスにちなんだ歌で始まり、いつもどおりの歌声(力強い歌声が大好きです)とアコギ、ダンスを披露してくれました。洋楽のカバーも、毎回違う曲を入れてくるので、今回は何かなーってのがとても楽しみです。(Loving youすごく良かった)

(以降の写真は、MIMI.RUNNDY(@MRunndy)さんが撮影した写真を許可をもらって利用させていただいています。すばらしい写真をありがとうございます!)

そして観客に楽しんでもらおうと、新しいこととしてDTMを使ったり(The Chainsmokers の Don't Let Me Down をアレンジ)、エレキ(いつもはアコギのLOVE & HOPEで)もみせてくれました。

アンコールでは、会場のみんなでREADY TO GOを歌って、とても盛り上がりました。ライブで盛り上がる定番の曲になりそうです。

自分が楽しかったのは当然ですが、スタンディングだし大丈夫かな、、と思っていた小4の娘もライブを楽しんでくれていました。手渡しでオリジナルCDを受け取ったときには、とても恥ずかしそうにRUANNちゃんに話しかけていて、その後すごく喜んでました。心に残るライブになったのではと思います。ありがとうございました。

RUANNちゃんのことを知ったのが、次女がアコギでテイラースイフトのWe Are Never Ever Getting Back Togetherを弾くってことで、参考動画をYouTubeで探していたときに下記の動画を見つけたのがきっかけだったので、いつか一緒にライブ行きたいと思っていて、今回それが叶いました。

RUANN (大山琉杏)「We Are Never Ever Getting Back Together (Taylor Swift)」2016/04/24 鶴見緑地公園

一番行きたがっていた三女(まだ幼稚園児のため、今回は参加できず)も、来年は小学校あがるのでもしかしたら次は娘2人連れての参戦になるかもしれません。(6歳児にスタンディングは無理だと思うのですが、本人は行く気まんまん...)

メジャーデビューして作曲や作詞に有名な加わって、曲の雰囲気が変わってきたのではと思います(There's No Ending、READY TO GOの2曲)。アーティスト本人も、聴いてくれる人を楽しませようと、いろいろなことにチャレンジしながら幅を広げているので、今後どんな曲を聞かせてくれるのか、どんなライブを魅せてくれるのか、とても楽しみです。

セットリスト

  1. サンタが街にやってくる
  2. Whishy Christmas
  3. Perfect life
  4. I AM STANDING
  5. Pinky World
  6. LOVE & HOPE
  7. TETOTE
  8. GET THE GLORY
  9. Don't Let Me Down (The Chainsmokers)
  10. There’s nothing holdin’ me back (Shawn Mendes)
  11. Loving you (Minnie Riperton)
  12. I’m just walking without you
  13. There’s No Ending
  14. (アンコール) READY TO GO
  15. (アンコール) The beautiful girl is about u

CSVを読み込んでRedmineのカスタムフィールドを更新するツール(redmine-issue-updater)を作りました

(この記事は Redmine Advent Calendar 2018 - Adventar の16日目の記事です。)

Redmineのチケットを更新するツールです。CSVファイルを読み込んで、チケットを更新します。現在更新対象としているのは、カスタムフィールドのみとなります。

チケットIDだけでなく、カスタムフィールドをキーとして更新できます。というか、これがやれるツールが無かったので、今回作りました。(チケットIDをキーとするものばかりなので)

利用方法

Java(JDK8以上)がインストールされた環境で、下記コマンドでアプリケーションをビルドします。

gradlew shadowJar

build/libs/redmine-issue-updater-all.jarというファイルが出来上がります。

下記のコマンドで、アプリケーションを実行します。

java -jar build/libs/redmine-issue-updater-1.0.0-all.jar config.json issues.csv

第1引数が設定ファイル、第2引数が更新する情報が書かれたCSVファイルとなります。

実行すると、下記のように更新されたチケットの情報が出力されます。

Processing start...
#1 is updated.
#2 is updated.
#3 is updated.
Processing is completed. 3 issues were updated.

以下は設定ファイルの例です。

{
  "readmineUrl": "http://localhost",
  "apyKey": "20d0779f947c3c9a7248332a078ff458644ed73d",
  "csvEncoding": "UTF-8",
  "fields": [
    {
      "headerName": "#",
      "type": "ISSUE_ID",
      "primaryKey": true
    },
    {
      "headerName": "Field1",
      "type": "CUSTOM_FIELD",
      "customFieldId": 1,
      "primaryKey": false
    },
    {
      "headerName": "Field2",
      "type": "CUSTOM_FIELD",
      "customFieldId": 2,
      "primaryKey": false
    }
  ]
}

各項目の内容は下記の通りです。

  • readmineUrl : Redmineの接続先URL。
  • apyKey : RedmineのAPIアクセスキー。
  • csvEncoding : CSVファイルのエンコーディング。
  • fields : CSVの各フィールド情報。CSV内の全てのフィールドを記載する必要は無く、利用するものだけ書いてあれば良い。
    • headerName : CSV内のヘッダ名。
    • type : 種別。(ISSUE_ID または CUSTOM_FIELD)
    • customFieldId : カスタムフィールドのID。種別がCUSTOM_FIELDの場合に設定します。
    • primaryKey : プライマリーキーか。trueとなっているフィールドの情報を使って、更新対象のチケットを検索。

カスタムフィールドのIDは、管理者画面のカスタムフィールドの設定画面で、対象のカスタムフィールドを選択した際のURLで確認できます。 以下のような場合、カスタムフィールドのIDは1となります。

または、チケット作成、編集画面でカスタムフィールドの入力欄に振られたIDでも確認できます。以下のような場合、カスタムフィールドのIDは2となります。

<input type="text" name="issue[custom_field_values][2]" id="issue_custom_field_values_2" value="A" class="string_cf">

以下はCSVファイルの例です。

#,Subject,Field1,Field2,Field3
1,xxxx,A,a,C
2,yyyy,B,b,B
3,zzzz,C,c,A

設定ファイルとCSVファイルのサンプルは、sampleフォルダ配下にあります。

注意事項

  • Redmine の REST API を利用しますので、REST APIが有効になっている必要があります。
  • カスタムフィールドをキーとする場合、対象のカスタムフィールドの設定として「フィルタとして使用」がONとなっている必要があります。

Redmine: View customize plugin の v2.0.0 をリリースしました

View customize plugin の v2.0.0 をリリースしました。Redmine 4.0(Rails5)への対応版となります。

v2.0.0からインストール時にbundle installが必要となります。注意ください。

今回のバージョンから対応するRedmineが3.1.x以上となります。3.0.x以下の方は、v1.2.2をご利用ください。

Redmineにおけるチケットの単位について

(この記事は Redmine Advent Calendar 2018 - Adventar の7日目の記事です。)

Redmineを運用していると「チケットをどういう単位で切るか」というところに悩む人も多いのではと思います。

何が適しているかは、Redmineの使い方や、そのプロジェクトのフローなどによって異なってくるので、これが正解だ!というものは無いのですが、目安の一つとして「同時に複数人が担当者になってしまわないようにチケットを分ける」といった方法があります。

同時に複数人が担当になってしまうようなチケットの切り方だと、

  • そのチケットを誰が担当しているのかが曖昧になり、結果、放置されてしまう
  • 複数の人の作業状況を加味しなければならないので、ステータスや進捗が設定しづらくなる

といったことがおこり、結果的にチケットから状況がわかりずらくなります。

これを避けるためにも、同時に複数人が担当者とならないような形でチケットを切っていくと良いと思います。

例1:一つのチケットを同時に複数人で担当するような場合

例として、クライアントサイドとサーバサイドを別々の担当者で製造する場合を考えて見ます。

この場合、1機能ということでクライアントとサーバまとめて1チケットにしてしまうと、1チケットを同時に複数人が担当することとなり、先ほど述べたような問題がおこりかねません。

こういったときには、クライアントとサーバで別々のチケットとするのが良いでしょう。また、それぞれのチケットが一つの機能であることをわかりやすくするため、親子チケットにするとわかりやすいと思います。

  • 機能
    • 製造: サーバサイド
    • 製造: クライアントサイト

Redmineの親子チケットは、使い方さえ間違えなければ、とても強力な仕組みだと思います。

例2:一つのチケットがステータスによって別々の担当者となる場合

作業とレビューを1つのチケットで行う場合、ステータスによって担当者が切り替わっていくと思いますが、同時に複数人が担当になるわけではないので、こういった場合は1チケットで十分です。

あくまで、同時に複数人が担当者になる(=同時に作業をする)場合のみ、別チケットにすれば十分となります。

ただ、担当者の切り替え忘れには注意が必要です。View customizeを使えば、ステータスに応じて担当者を自動設定することも可能なので、それでカバーするのも良いと思います。(View customizeでの設定方法は、また別の記事で)

終わりに

この考えに基づくようになってから、チケットの構成で悩むことは少なくなりました。チケットの構成に悩む方のヒントになればと思います。

なお、途中でチケットの構成変えたくなったら、そこで変えればよいので、最初にきっちり決めなくても良いと思っています。最初からうまくいくかどうかなんて、いくら時間かけて考えてもわかりません。まずは試してみて、やりづらいと思ったら、変えていくといったことをお勧めします。(自分のチームでも何度も変えていきました)