田中ブログ

さいたまに住んでいる男です。仕事はSESでプログラムを書いてることが多いです。聖地巡礼、日々の生活、技術的なことを書いていこうと思います。

サンライズ瀬戸に乗って四国旅(移動編)

今回は休みが取れたので四国に行ってきました。

なぜ四国かというと、四国に行ったことがないこともあるのですが、寝台列車サンライズに乗ってみたいとふと思ったからです。ちょくちょく旅は行ってますが寝台列車はまだ乗ったことがないなあと。

計画

行程は以下で計画。

0日目:サンライズ瀬戸に乗車

1日目:香川・松山散策

2日目:高知・徳島散策

3日目:徳島散策・戻り

四国では電車も使いましたが、高速バス・路線バスもだいぶ利用しました。

 準備

まずサンライズ瀬戸の乗車券ですが、出発日の30日前から発売でみどりの窓口などで購入します。金曜日や連休前は購入が難しいとのことだったのですが、普通の平日の出発なので約1週間前でも購入することができました。(金曜出発も聞きましたが普通にいっぱいでダメでした。)ちなみに、2Fの部屋はすでに一杯だったようで1Fの部屋となりました。

0日目

0日目、サンライズ瀬戸ですが東京駅を22時に出発なので、平日いつも通りに仕事をしました。業務終了後に一旦家に帰り、荷物を持って再び都心に向かいます。夜にのぼりの電車で東京に向かうことはなかなか無いし、これだけでもいつもと違う感じです。

 

念のため発車の1時間前くらいに東京駅に到着し、車内で食べようと考えていた駅弁を購入しようとぶらぶら。崎陽軒シウマイ弁当食べたことが無かったので探したのですがどのお店も売り切れ。遅い時間だと買えないものなのかと少し反省。とりあえず、適当なお店で駅弁を買いサンライズが入線するホームへ向かいました。 

折角なので入線の姿を見ようと思ってたのですがすでに入線済みでした。自分が宿泊する部屋の車両までホームを歩いてましたが、その時に窓から見える車内でもう特別感満載。自分がこれに乗ると思うと非常にワクワクしました。

 

f:id:tanaka653:20190715225107j:plain

f:id:tanaka653:20190715225157j:plain

▼部屋が見える

f:id:tanaka653:20190715225300j:plain

扉があき、いざ自分の部屋へ。いろいろネットで調べてくなかで割と部屋の中が広いのかなと思ってたのですが、初見だとベッドだけのスペースで割と窮屈じゃね?という印象でした。でもすぐに慣れました。荷物を置いて腰を落ち着けると、いよいよ旅が始まるという気分が出てきました。 

▼廊下。わくわく感がある。

f:id:tanaka653:20190715225708j:plain

 ▼室内。全然写真撮ってなかった。。

f:id:tanaka653:20190715225356j:plain

 

そして22時になり出発。都心部ではまだまだホームに人がいる時間帯。この中を四国へ向けて走ってるのはなんとも言えない感じです。そしてしばらくしたら購入した駅弁と持ち込んだお酒とおつまみで飲み食い開始。

 ▼閉店間近で500円だった駅弁

f:id:tanaka653:20190715225511j:plain

そのあとは暇だったので散策。ラウンジがあるみたいだったので行ってみました。車両の中だけあってコンパクトな感じで椅子も8人分くらいでしたが、結構盛り上がってる様子で賑やかな感じでしたね。

 

翌日は朝から行動が始まるので散策後は部屋に戻って寝る体勢へ。この時気づきましたが座ってるときは揺れも少なく静かだなと思ってたのですが、横になると揺れや音が気になりだいぶ印象が違いました。キャンプでも熟睡できないタイプなので今回もしっかりとは眠れなかった。。寝れる人羨ましい。。。

 

熟睡できなかったので早めの起床となったので明るくなってきた外の景色を眺めてました。6:30くらいに岡山駅に到着し、出雲行きの車両との切り離しを行いいざ四国へ。

▼大阪を超えたあたりかな?日が昇ってくる感じ。

f:id:tanaka653:20190715225855j:plain

四国に行ったことがなかったので瀬戸大橋を渡るのも初でしたが、1Fだったからか想像していたよりは景色が見えなかったなあと思いました。半分の時間くらいは、瀬戸内海を無事見ることができましたー

橋を渡り切ったあとはうとうとしながら高松へ。今回の旅の目的は四国を回ることだったので、坂出乗り換えでも良いのですがなんとなく朝のうどんを高松で食べたかったので高松駅まで行きました。

f:id:tanaka653:20190715230036j:plain

高松駅前。かっこいい。

f:id:tanaka653:20190715230306j:plain

高松駅到着後は朝から営業している味庄さんに行き、無事うどん食べられました。

 ▼香川上陸初のうどん

f:id:tanaka653:20190715230157j:plain

サンライズに乗って思いましたが、旅をしているという特別感があるのもいいですが、朝から観光を始められるはいいなと思いました。

個人的にサンライズの部屋選びで注意したいと思ったこと

以下を満たした部屋がいいなあと思いました。

・海側の部屋を希望する。景色を楽しむなら個人的に海を見たいので。

・2Fの部屋を希望する。瀬戸大橋からの景色が変わりそうなので。

 

続く

ファミリーキャンプ場いりせキャンプ

5月下旬に群馬県にあるファミリーキャンプ場いりせに行ってきました。車で舘林、太田、桐生とひたすら122号線を進んでいきました。桐生の後半部分から自然豊かな道にあなり、道の駅もちらほら点在していました。ちょっとした野菜なんかはこの辺で買ってもいいのかなと。また、途中にはダム湖の草木湖があり景色を楽しめます。あと、近場にはパワースポットの滝や足尾銅山があります。

▼草木湖。なかなか大きい。

f:id:tanaka653:20190609124625j:plain

山の道はそこまで長くなく、あっというまにキャンプ場へ到着。ゲートは開いていたのでそのまま受付前へ行き受付を。オートサイトは1区画で5,500円でした。受付を済ませサイトの説明を受けます。

このキャンプ場には桜が植えてあるそうで4月だと花見キャンプができたり、夏はダムの水が放流されるので近場で川遊びできたりするらしいです。今回は5月下旬に来ましたが、前述のいずれにも該当してないせいかだいぶ空いてました。。

水場やトイレは普通にいい感じでした。

▼管理棟・トイレの建物。シャワーやコインランドリーもありました。

f:id:tanaka653:20190609172955j:plain

そんでどの辺の区画を利用するかちょっと会話して適当に車を止め設営開始。

いざ作業を開始すると思った以上に虫が多い。いままでは基本寒い時期にキャンプするのが多かったので虫を意識してませんでしたが、個人的には気になるレベル。

 

 設営後は辺りを散策。

バンガロー方向に行くと池があったり、電車が通る橋があったりしてこの辺が良さげな景色ですね。放流後だと川もより綺麗になるかもしれません。

 ▼池には魚がいたり、写真の奥の方にはおたまじゃくしがいました。

f:id:tanaka653:20190609173421j:plain

▼水路とバンガロー。

f:id:tanaka653:20190609173803j:plain

テントサイトの奥の方に行くと、運動場があります。普通に遊べそうな広さですが、あまり使われてそうな形式なしでした、、、

▼運動場の先の方から見えた川

f:id:tanaka653:20190609173854j:plain

更に奥に行くと普通に家がある道に出たので散策はこの辺で。

足尾銅山が関係していた道。この先は民家でした。

f:id:tanaka653:20190609173617j:plain

散策後は、だらだろとご飯を食べ就寝です。

起床後は景色がよかった場所で珈琲で一服。管理棟のところに自販機があったので、そこで買ったコーヒーという手抜きですが。笑

f:id:tanaka653:20190609174214j:plain

 とこんな感じでした。5月下旬だったので空いてたのは良かったですが、話を聞いてみてだとお花見と時や、ダムの放流後に川遊びとかできるシーズンに来た方がよかったなあという印象でした。

 

以上。

親知らずを抜歯しました

今回は10連休中に親知らずを抜いてきました。

ネットを見ると抜いた後すぐに仕事してたりというブログを見たりしたのですが、自分の性格的に仕事に支障をきたす気がしたのでこのタイミングで抜きました。抜き終わった後に考えると、令和に切り替わるタイミングでっていうのはもったいなかった気もしましたが。笑

抜歯した病院

自分は左下の親知らずが横向き・表面は見えているような状態で生えており、普通にいつも通院している町の歯医者さんで抜歯しました。やばい感じの親知らずだと大きな病院に行って抜歯したりというのもあるとのこと。(大変そう)

当日

お昼過ぎに予約を入れており、数日はまともにご飯食べにくくなりそうな予感がしたのでお昼ごはんは食べたいものをがっつり食べました。あとは食料の買い出し(ゼリーやスープなど)もしておきました。

そしていざ歯医者へ。受付もいつも通りで、部屋も大き目ではありますが以前治療で使ったことのある部屋での抜歯でした。そして一言二言会話して抜歯の作業に入りました。個人的に親知らずの抜歯はビッグイベントだったのですが、特にいろいろ話があるわけでもないんですねえ。

麻酔をがっつりして特に何も感じなくなったのですが、歯を削ったり(割ってる?)、引っこ抜こうとしたり、口の中を切開されていたり(最後に縫われていたので。)といろいろしてもらっていた模様。明確な抜けた感覚は無いうちに、縫合が始まりいつの間にか抜歯は終わっていました。時間ははかってませんでしたが20分もしないで終わった感じでした。

あとは止血のためガーゼを噛んで、注意事項の説明を受けたりして歯医者での作業は終了。処方箋をもらったので抗生剤や痛み止めを受け取り帰宅。

抜いた後

抜いた日は、お風呂NG、お酒NGなどいろいろ注意事項があったので、晩御飯を食べる以外は基本安静にしていました。辺に動いて再度出血してもあれですしね。

ちなみに晩御飯は事前に買っておいたゼリー。カロリー補給のためinゼリーとかを買ったのですがああいう形状で吸って食べるのはだめみたいですね。明らかに抜歯したところにも負荷がかかっちゃってました。結局器に移し替えてスプーンで食べました。

ちなみに右側の歯は普通に使えるので固形物は食べれたとは思うのですが、ドライソケットにびびっていたので負担のないものを食べるようにしていました。

ちなみに抜歯の2日後には普通に固形物を食べてました。

出血について

いろいろネットで調べるとそこまで出血は続かないのかなと思ったのですが、抜歯の2日後にも唾を吐いたときに血がまじることが続いていたので、再度ガーゼを噛んで止血しました。この後は日中は特に出血が気になることはなくなりました。

ただ、朝起きて口をすすいだときは3日後あたりでも血が混じってる感じでした。後はもうちょい後日でもお酒を飲んだ翌日は血が混じってるなーという感じ。

痛みや傷の感じ

痛みですが抜歯のときもそうですが、抜いた後もそこまで痛くありませんでした。痛みで眠れないとかも全然なかったです。

口の中はさすがに切開しただけあり、数日たっても違和感がありますがこれは抜糸するまでは消えないのだろうか。様子見ですね。

 

以上

nginxのerror_pageとluaでerror_page内でステータスの変更・処理を行う

error_pageを指定しているはずなのに、期待したページが表示されなかったことがあったのでメモ。
やりたいことは以下です。
①404エラー時にステータスコードを502エラーとしてカスタムしたエラーページ(50x.html)を返す
②error_pageの中では条件によっては200を返す

環境としては、openrestyを利用してnginxとluaを使う感じです。

まずは①を試します。
通常は、error_pageの箇所に=502を記述し、リダイレクト先を/50x.htmlとすれば済みますが、最終的にlocationの中でいろいろやりたいので以下のように書いて試しました。

↓nginx.confの抜粋

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        error_page 404 /404.html;
        location = /404.html {
            return 502;
        }

この場合、curlでリクエストを投げるとopenrestyとバージョンが表示されたデフォルトっぽい自動で生成されたエラーページが表示されました。
(error_pageを書いてない場合、以下のフォーマットのページがデフォルトで表示されるのかな?)
curlとレスポンス

curl http://localhost:80/abc  -w '%{http_code}\n' -s
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.13.6.2</center>
</body>
</html>
404

ログを見ても/404.htmlにもアクセスしておらず、return 502でステータスコードが変わるわけでもなくダメダメの模様。(ちなみにreturn 502を消すと/404.htmlまではアクセスされた)

↓ログ

2019/05/03 15:27:55 [error] 141#141: *18 open() "/usr/local/openresty/nginx/html/abc" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /abc HTTP/1.1", host: "localhost"

これが動かなかった理由ですが、まずrecursive_error_pagesをONとしていなかったのが原因。
recursive_error_pagesはデフォルトでOFFになっており、error_page内で再度エラーとしてもハンドリングされないみたい。

以下のようにrecursive_error_pagesをONにしてやり、上位の404で処理するlocation内で、再度error_page404の記述をしてやれば動きました。
(下記の例のlocationはまったぐ意味がないが再帰的なerror_pageが動くということを示すためのもの。)

↓修正版

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # ここに定義が必要
        recursive_error_pages   on;

        error_page 404  /404.html;
        location = /404.html {
            error_page 404 =502 /50x.html;
        }

結果カスタムしたエラーページが返ってきてレスポンスコードも書き換わっている。

curlとレスポンス

 curl http://localhost:80/abc  -w '%{http_code}\n' -s
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, OpenResty.</em></p>
</body>
</html>
502

これに加えてluaも利用したうえで記事の先頭の方で書いた①と②を実現する処理を書いてみる。
luaのコードを加えたnginx.conf

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # これをONにすることでluaでexit(502)とした際も上記のerror_pageで処理される
        recursive_error_pages   on;

        error_page 404 @myError;

        location @myError {
            content_by_lua_block {
               if ngx.var.arg_flg == "1" then
                   ngx.status = 200;
                   -- execだけではstatusは書き換わらない
                   ngx.exec("/");
               else
                  return ngx.exit(502);
               end
            }
            # 404に対してerror_pageを書きたいときはここに記述
            #error_page 404 /50x.html;
        }

flg=1とした場合
curlとレスポンス

 curl "http://localhost:80/abc?flg=1"  -w '%{http_code}\n' -s
<!DOCTYPE html>
<html>
<head>
<title>Welcome to OpenResty!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to OpenResty!</h1>
<p>If you see this page, the OpenResty web platform is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="https://openresty.org/">openresty.org</a>.<br/>
Commercial support is available at
<a href="https://openresty.com/">openresty.com</a>.</p>

<p><em>Thank you for flying OpenResty.</em></p>
</body>
</html>
200

flg=2とした場合
curlとレスポンス

 curl "http://localhost:80/abc?flg=2"  -w '%{http_code}\n' -s
<!DOCTYPE html>
<html>
<head>
<title>Error</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>An error occurred.</h1>
<p>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</p>
<p>If you are the system administrator of this resource then you should check
the <a href="http://nginx.org/r/error_log">error log</a> for details.</p>
<p><em>Faithfully yours, OpenResty.</em></p>
</body>
</html>
404

意図したとおり、luaを利用してのerror_page内で条件によるステータスの変更、error_pageでも自動生成されるエラーページでなく、用意したエラーページが表示されることが確認できました!キモはrecursive_error_pages をONにすることでした。
また、error_pageをlocation内に再定義することで再帰的にerror_pageの処理もできるみたいですね。

以上

Mockitoでインターフェースをモック化する

技術ネタ。
タイトルの通りMockito(PowerMockito)でインターフェースをモック化しようとしたときにハマったのでメモ。

以下のインターフェース、クラスを作成しているとします。
・インターフェース:Sample
 ⇒メソッドとしてdoSomething()を定義
・実装クラス:SampleImpl
 ⇒メソッドとしてdoSomething()を実装

そして実装は以下のようになっているとする。

Sample instance = new SampleImpl();
instance.doSomething()

上記をMockito(PowerMockito)でモック化します。
以下で期待したように動きました。

// newするときと同じ感じでmock側は実装クラス
Sample mock = Mockito.mock(SampleImpl.class);
Mockito.doAnswer(~)when(mock).doSomething();
// モックはキャストする
PowerMockito.whenNew(SampleImpl.class).withAnyArgments().thenReturn((SampleImpl)mock);

// あとは、instance.doSomething()をコールしてる処理を実行

以上

2019年確定申告のメモ(ふるさと納税)

来年に確定申告をするときに忘れないようにメモ。

書類作成

ネット経由で作成。ふるさと納税したので納税情報を入力して印刷。押印する箇所があるので忘れなようにする。

添付書類は、通知カード+運転免許証と源泉徴収票。後は各自治体から受け取った寄付金受領証。

提出

アナログ思考があるので自分で提出へ。自分が住む大宮エリアはさいたまスーパーアリーナで受付とのことなのでスーパーアリーナへ。作成済みを提出、作成するといった感じで列が形成されていたので作成済を提出の列へ並びます。今年は休日の10:30ころに行ったのですが列が長く、提出完了まで40~50分かかりました。

ただ、入り口部分に作成済の書類を入れる箱が置いてあるのでそこに入れてもいいんだろうなと思いました。

列に並ぶメリットというと、書類をチェックしてもらう(検算はなし)、控えに押印してもらえるというところでしょうか。

※控えに押印してもらうなら、控えを忘れないようにする。

また、列に並んでいるときに張り紙でマイナンバーカードを提示してくださいとありましたが、特に提示せずに終了しました。なので記載内容に不備がないのであれば、持っていくのは作成した書類だけでOKということでしょう。

来年へ向けてのメモ

・並ぶ時間が結構長く、正直無駄なので平日に行きたい。

・並んで提出するなら、控えを持ってくのを忘れないこと。

・検算してもらう必要はなさそう。

以上

redisで大容量データ、大量データをコマンドで登録する

技術ネタを。
redisで1MB程度のデータをコマンドで登録しようとしたときに手こずったのでメモ。

結論からいうと以下のようなコマンドで登録できました。

redis-cli -h サーバ -x set キー名 < ファイル(jsonなど)

キモは-xオプションでした。

ちなみに上記のような大きなデータを登録する方法調べていたときに、パイプラインを使ったり、--pipeオプションを使ったりする方法がヒットしたのですが、そちらは大量データを登録する方法でした。
※大量データというのは、ファイルに1行ずつsetコマンドを書いた行が大量にあるみたいな感じです。
ちなみに、以下みたいなコマンドです。

cat ファイル名 | redis-clie -h サーバ set キー名

最初は、上記で1MBのデータが登録できると思ったのですが、パイプラインでデータを渡すときにはバッファサイズが決まっているようで(自分が試した環境では4096バイト)1MBデータがまとめて渡すことができずエラーとりました。

以上です。