それではレース開始といこう。2019年10月19日5R開始の頃には天気は晴れてきた。これは幸先がいいかもしれないと思ったが結果はそうではなかった。相変わらず複勝しか当たらない。単勝で来るのは一番人気ばかりだ。人気以外のものが来てもそれを外すという有様。重馬場だが以外と場は荒れていない。10R頃からは雨が降ってきた。メインレースのパドック周回では大雨になっていた。その中で元気がいい馬とイマイチの馬がいる。2019年10月19日はい。人気が来てしまいました。レース開始の頃には雨は小康状態になるなんて想定外だった。あの調子で雨が降っていたらどうなっていただろうか。最後の12Rも波乱は起きなかった。単勝:0勝8負け複勝:1勝7負けワイド:1勝1負け馬連:0勝1負3連複:0勝2負け残金:2550円(回収率:32%)8レース中一番人気以外が来たのは3回だけ。その三回をすべて取りこぼしたのでこうなる。思ったよりも場が荒れなかった。今回も残念ながら敗者めしである。この残金ではロクに飲めないな。いうことでBSイレブンで紹介されていたラーメン屋に行くことにした。京阪本線で出町柳まで行き叡山電鉄で一乗寺駅まで行くとそこには極鶏というラーメン屋がある(もっともこの界隈はラーメン屋ばかりなのだが)。いつもは行列が出来ているそうだが今日は大雨が降っていたこともありすんなりと店内に入れた。鶏の鶏だくあとご飯も頼んだ。ご飯はおかわりできる。腹ペコだったので先にご飯だけ食べた。評判とおりレンゲを立てられるほど濃厚なスープである。スープは飲むというよりも食べるといったところだろうか。残ったスープにご飯をぶっこんで食べるのが至福である。ラーメンを食べにくるだけでここまで来るのは微妙に思ったが来たかいはあったというものだ。ご飯と合わせて950円。今度は勝利めしの締めとして訪れたい。泊まることになったカプセルホテルだがなかなかよいところだった。サウナが3つもあって楽しめる。おもしろかったのは雑魚寝している客の様だったのだが。朝起きて朝風呂に入ってから休憩スペースを覗いたらアザラシのような群れが出来ていた笑った。大阪から京都はすぐ近くなので別に京都にこだわる必要もないのかもしれない。馬場は昨日の雨で重だ。昨日はあんなに雨が降ったのに回復が早い。今日はあんまり荒れないかもしれない。それではレーススタートだ。2019年10月20日うむむ。今日も冴えないまま午前を終えてしまった。4Rは勝ち越しはしたが複勝で賭けた総額を下回っているので実質負けだし。10倍以上に賭けるという方針はまずいのかもしれない。人気はともかくも二番・三番人気は無視はできないかも。後半戦入る前に昼食だ。今日は晴れで菊花賞もあるためか人が多い。座れるベンチなどどこにもなかった。たこ焼きを買ったが座るところを探しているうちにパドック周回時間になってしまったので二階からパドックの様子を見ながらたこ焼きを食べた。昼食代をちょっとだけケチったのは菊花賞をより多くの賭金で望みたいからだ(きちんと当てていればそんな心配もないのだが)。2019年10月20日......複勝全滅が二回もある。昨日よりは一番人気は来ていないがその分三番人気がよく来ている。10倍未満なので買えていない。それでもまあなんとか菊花賞につぎ込む分は確保できた。G1のような大舞台では乗り換えをしていない馬が勝つべきだと勝手に思っているのでそれを軸に賭けた(とはいえパドック推奨馬も見逃せない)。やけくそ気味に賭けた最終レースも見事に惨敗した。いえ直前乗り換えをしていない馬が二頭入ったので結果は満足している。当てれば言うことなかったけど。あと驚いたのはメロディーレーン。340kgという体に55kgという重量はさぞ重いだろうと思っていたが5着に入った。推定上がりは一番と来ている。これは推し馬にしたい。残金:3530円(回収率:29%)昨日の時点で一番人気はやはり無視できないと3連複買っているのだがちっとも当たらない。あと一頭がいつもこない。いうわけで今回も敗者めしとなった。淀駅周辺の店で飲みたかったが残金ではそれも難しそうなので京都駅へと向かった。いくつか立ち飲み屋があるのを調査済だ(ある意味負け戦を考慮していたとも言えるが......。そんなんだから駄目?)。目星を付けた店はいずれも入ることは出来ず途方にくれていたら中華の店が目に入った。生ビールセットが980円とある。中光園という店に入った。生ビールと棒々鶏に中華風冷奴に餃子。あと一品として皮豆腐の和え物(拌豆腐皮)。セットは某中華チェーン店のようなジャストサイズのようなものかと思っていたが以外と量があった。皮豆腐の和え物も美味い(ビールを飲みきってしまっていたのが残念だ)。単品こそ少々高めだがセットの料金は安い感じがする。接客がやや中国クオリティなことに目をつぶればなかなかよい店かもしれない。連日に渡る惨敗ぷりに京都が嫌いになりそうだったがこの店で持ち直せた。java今年は競馬ネタばっかりだったのでたまには技術的なネタでも書いてみることにする。お仕事でSpringBoot2.2の移行検証をやったので忘備録的に残しておく。追加検証はじめにお仕事でSpringBoot1.5系を使っていたがSpringBoot1.5は2019年8月にEOLを迎えた。そのためバージョンアップをそろそろ検討しなければならない。現在のSpringBootの最新バージョンは2.1.9だ。これに変えればいいのかというと一つ問題がある。Frameworkは5.1系なのだが2019年12月にはEOLとなってしまう。EOL対応をしてもまたすぐEOLを迎えてしまうのは微妙なのでまだPRE版だがSpringBoot2.2を試すことにした。※現在はすでに正式版のSpringBoot2.2が出ています。前提お仕事プロジェクトのざっくりした構成は以下のようになる。基本的にLinuxサーバ上で稼働。apiサーバの一部のみWindows上で稼働。3.8.x(3.8.4)上記構成でSpringBoot2.2.0.RC1を試してみた。ちなみにJavaはVMをOpenJDKに変えて検証した。検証まとめはじめに検証結果を先に書いておく。検証手順および理由は後で書く。SpringBoot1.5系からSpringBoot2系へのマイグレーション情報があるためまずはそれを読む。https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.0-Migration-Guidepom修正pom.xmlの依存関係の修正をおこなう。現行プロジェクトでは親プロジェクトの下にそれぞれモジュール毎の子プロジェクトが存在する。STSでSpringBootプロジェクトを作成するとデフォルトの親プロジェクトはSpringBootとなるがこの依存は外している。代わりに親プロジェクトに依存関係としてplatform-bomを追加して利用していた。これはEOLを迎えているため代わりの定義が必要になる。<dependencymanagement><dependencies><dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-dependencies</artifactid><version>2.2.0.RC1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencymanagement>またSpringBoot2.2はまだmavenのセントラルレポジトリには登録されていないのでレポジトリ指定も必要。projectを実施する。Automatically(Buildメニュー)は一時的に無効にしておいたほうがいい。一気にビルドが走るため非常に時間がかかる(というかSTSが死んだ)。一つ一つ子プロジェクト毎にビルドすること。このときコンパイルエラーが山程出るので修正することにする。ソース修正まずはコンパイルエラーレベルの修正をする。パッケージの変更SpringBootServletInitializer,ErrorController,ErrorAttribute,LocalServerPortsなどが変わっている。このあたりはSTSでCtrl+Shit+Oで一発。引数の変更RestTemplateBuilderのsetConnectTimeoutやsetReadTimeout。引数がintからDurationに変わっている。時刻関連の扱いは基本的にDurationになったっぽい。.setConnectTimeout(Duration.ofMillis(profile.getConnectTimeout_msecs()))ErrorAttributes.getError。引数がServletRequestAttributesからWebRequestに変わっている。コンパイルの警告修正@NotEmptyと@NotBlankが非推奨になった。正確にはorg.hibernate.validator.constraintsパッケージのものが非推奨となった。標準のjavax.validation.constraintsに変更。これに伴いmessage.propertiesにエラーメッセージ(日本語)を追加。javax.validation.constraints.NotBlank.message=必須項目です。org.springframework.http.MediaType.APPLICATION_JSON_UTF8が非推奨となった。これによりapplication/json;charset=UTF-8というContent-Typeは非推奨となった。APPLICATION_JSONに置き換えた。設定ファイルの設定名が変わっているため変更。Editorで開かないと警告はでない。management.endpoints.web.path-mapping.health上記のものはエディタ上でエラー表示と共に何に変えればいいか出力されるのでそれに従えばよい。security.basic.enabledsecurity.enable-csrfmanagement.security.enabledこれらはWebSecurityConfigurerで定義するようになった。プロパティによる有効・無効の切り替えは不可能になった。環境毎に変えたければ独自のプロパティを作成してWebSecurityConfigurerで設定する感じになる。お仕事のプロジェクトではデフォルト設定(BASIC認証は無効でCSRFチェックは有効)で問題ないためプロパティを削除するのみ。management.endpoints.web.base-pathの設定を追加。healthチェックなどはデフォルトだと/actuator/healthなどとtopが変わる。既存踏襲とするために設定を追加した。事前準備としてpowermockのバージョンを2.0.2に変更した。SpringBoot2系ではMockito1.xからMockito2.0に変わったため。以下は単体試験実施時に発生したエラーをもとに修正した内容になる。振る舞いが変わっているorg.springframework.http.HttpStatus.toString()の応答結果がStatusコード(数値文字列)からコード+名称に変わった。Thymeleafのjson変換方法が変わっているお仕事プロジェクトではWebサーバにおいてJSへデータを渡すためにThymeleafにてjavaオブジェクトをjsonに変換して書き出しているがその書き出し内容が変わっていた。stringへ変わった。"ONE"・stringの括りが'から"へ変更。応答結果の検証(assert)が文字化けのためエラーとなるMediaTypeがapplication/jsonとなったことに伴い、応答結果の検証で日本語部分が文字化けてエラーとなってしまう。具体的にはMockMvcを使った以下の検証が文字化ける。mvc.perform(post("/hoge")~略~.with(csrf())).andExpect(status().isOk()).andExpect(content().string(containsString("\"message\":\"エラーなんだけど?\"")))今まではContext-Typeがapplication/json;charset=UTF-8となっていたため問題なかったがcharsetがなくなったことにより単体試験実施端末のデフォルト文字コードでエンコードされるようになり不一致となった(Windows上で実施)。これはjsonとして明示的に比較すればきちんとUTF-8でエンコードされるようになる。.andExpect(jsonPath("$.message").value("エラーなんだけど?"))また、比較項目が多数あるため直接jsonとして比較していたものも同様のエラーが出ていた。JsonUtilでリストをjson化この場合は、byteとして直接変換すればよい。JsonUtil.convert(expectedList).getBytes(StandardCharsets.UTF_8);~略~.andExpect(content().bytes(expectedContent))エラーの応答結果が文字化ける応答結果がエラーの場合(HttpStatusが400系か500系)の応答結果をjsonからJavaオブジェクトに変換すると日本語が文字化けている。これはお仕事プロジェクト固有の問題。プロジェクトではエラー応答の場合、HttpStatusCodeExceptionからresponseBodyを受け取り(jsonの想定)それをjavaオブジェクトに変換している。このresponseBodyはgetResponseBodyAsStringで受け取っているがこの処理はbyteをDEFAULT_CHARSETでString化している。このDEFAULT_CHARSETは実行している環境で変わる。実行している環境はWindowsであるためUTF-8ではエンコードされず文字化けた。対応としてはgetResponseBodyAsByteArrayで応答結果をbyte[]で受け取りそれをUTF_8でエンコードするように処理を変更した。webRequest)のreqのMethodはエラーが発生した元のmethodだったが、変更後はreqのMethodはDispatch後のメソッド(GET)になった。この影響もプロジェクト固有の問題。Methodを取得するためにreqから取得していたがこれがNGとなった(DELETE非サポートの確認でログ上にはDELETEと出力されるはずがGETとログ出力されている)。HttpRequestMethodNotSupportedExceptionからMethodを受け取るように処理を変更した。Server上)で起動しなかった。tomcatv9.0でも駄目。SpringBootアプリケーションとして起動するとなぜか起動した。起動しない場合は以下のエラーが出る。エラー箇所は常にParameterMappingではなくResultMapになるときもあった。configurationtomcatのVMオプションに-Dspring.jndi.ignore=trueを付けることで起動するようになった。ちなみにspring.propertiesに左記プロパティを追加してもいけるらしい。application.ymlでは駄目なので注意すること。上記プロパティを指定しないと何故かmyBatisのプロパティ読み込みが失敗してしまう。SpringBootアプリケーションならば問題なく起動するのだが。以下は参考にしたURL。デグレった?apiサーバ(その他)が起動しないjetty上で起動しなかった。Server)では起動した。jettyの場合は以下のエラーが出る。..略どうも依存ライブラリ中にjava9対応のものがあると9.4.9より前のjettyだとエラーとなってしまうらしい。SpringBootというよりはjettyの問題であるようだ。jettyを9.4.9にすることで起動した。ちなみにjettyのコンソールログを出力するにはにはstart.iniに--module=console-captureを追記するとよい。参考にしたURLは以下。Overflowもう一つの解決方法としては依存しているライブラリのバージョン(classmateとlog4j-api)をさげてビルドすることだ(classmateは1.4,log4j-apiは2.8.2)。一応起動はするが素直にjettyのバージョンを上げたほうがよさげではある。追加検証SpringBoot2.2.1が正式にリリースとなったので改めて検証した。tomcat起動不能の件は解消していることを確認した(VMオプションの指定がなくても大丈夫)。jettyの件はjettyの問題であるためやはり駄目だった。東京(3)競馬めし10月は元々京都にいくつもりだった。遠征する日によりにもよって台風が押し寄せて来てしまった。進路的には京都は大丈夫そうなので土曜日はとりあえず京都にたどり着けばいいぐらいに考えていたら新幹線が終日運休となってしまった。仕方がないから中山競馬場から参戦しようかと思ったら関東の場外馬券売り場はすべて営業中止となってしまった。TVで観戦するしかなかった。G1の本命は見事に外れたので命拾いしたとも言えるけど。三連休は家でゴロゴロ過ごすしかないのか。月曜日は無事開催するのか。翌日は仕事なのだけど消化不良のままだし行くしかない。いうわけで図らずも三回目の東京遠征となった。台風は13日には過ぎ去ってしたがいろいろと爪痕を残していた。住んでいる近くには川はないので特に被害はなかったがTVをつけたら各地がえらいことになっている。そんな中競馬に行くのは業が深いだろうかとちょっとだけ思ったが電車に乗って(江戸川の土手もまた水浸しになっていてちょっとビビった)競馬場に近づく頃にはすっかり頭からそんなことは消えていた。いつものように神社にお参りを済ましたあと、今回は馬霊塔にもお参りしてから競馬場へと入った。台風が去ったあとはよく晴れていたのだが今日は朝から雨が降っている。馬場状態はダートが重で芝が良。荒れるレートとなるのだろうか。思ったよりもレースは荒れていない。上位人気馬ばかりが来ると賭け方的にちょっと分が悪い。3Rはちょっと波乱だったが取り逃がしてしまった。候補としては上がっていたのだが。いいところがないまま昼食となった。梅屋の肉南そば最近の昼食はなんだかちょっとおざなり感がなくもない。元々の昼食予算は500円しかなく(今回のそばも50円オーバだったりする)、もう少し豪華にしたければ勝つしかないのだ。今の有様では昼食ではなく夕食の心配をしなければいけなくなるかもしれない。......気を取り直していこう。2019年10月14日5Rは単勝こそ取り逃がしたが15番人気だった馬の複勝が取れたのでかなりついた。悲惨な夕食とはならずに済みそうだ。後ろ向きに考えたことで運が逃げていったのか冴えない結果ばかりが続く。7Rは頭数が少ないので複勝を買わなかったのだが複勝が2位までとなるのは7頭以下のときらしい。このままパッとしないまま終えてしまうのだろうか。単勝だけだが事前に予想して本命にしていた馬だけあってとっても嬉しい。最初はほぼビリだったのでこりゃ駄目かと思っていたが最後に一気に抜き去っていってしびれた。