田中ブログ

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

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

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データがまとめて渡すことができずエラーとりました。

以上です。

日光だいや川公園オートキャンプ場で冬キャンプ

今回は日光のだいや川公園キャンプ場に行ってきました。冬キャンプです。

ホームページのリーフレットを見ると冬季は事前に予約してくださいとあったので予約してから行きました。

 

リーフレット

https://www.park-tochigi.com/daiyagawa/wp/wp-content/uploads/2018/08/%E3%82%AA%E3%83%BC%E3%83%88%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97%E5%A0%B4%E3%83%AA%E3%83%BC%E3%83%95%E3%83%AC%E3%83%83%E3%83%882018-3.pdf

 

日光は日光東照宮などの社寺が有名ですが、そこの手前にキャンプ場があります。

キャンプ場はだいや川公園の一部で、外から見た感じでもかなり整備されていそうな感じでした。いざ敷地に入っているとキャンプのエリアに入るところにゲートがあり、今ままで見たことが無いような感じでした。

 ▼サービスセンター。手前の駐車場に駐車して受付。

f:id:tanaka653:20190209113303j:plain

 

サービスセンターで受付を行うとICカードが渡されるので、それでゲートが開けられます。サービスセンターには売店(お菓子、ガス、薪など売ってた。)、シャワー、ランドリー、トイレがあり充実している感じでした。

今回は、予約した時に当日の受付時にサイトを決めさせてくださいと話をしたので、利用可能なサイトから人がまわりにあまりいなそうな場所をチョイスしました。

なお、冬季はサービスセンター付近のサイトのみ、トイレ・炊事場もサービスセンターのもののみ利用可能でした。ちなみに冬季は通常の料金より安く、1サイト2,700円で利用できるのでお得です。

 

サイトを決めたらサイトへ移動。時期のせいなのかもしれませんが、リーフレットのマップとキャンプ場内の印象は結構違いましたね。マップ的にはかなり広そうで中央を流れる川も控え目な感じでした。冬で緑が無いというのもありましたが、それはそれでよい雰囲気でした。

 ▼葉が落ち、雪も少し残っていて冬って感じです。

f:id:tanaka653:20190209113750j:plain

▼場内の川は思ったより細い。

f:id:tanaka653:20190209113852j:plain

今回は電源つきのサイトだったので設営のときには家電の準備なども行いました。電源を差す穴は、家で使ってるようなコンセント向けのは1つだけでした。2つはついているのかなと思ったので少し意外でしたね。

 ▼サイトはこんな雰囲気

f:id:tanaka653:20190209114136j:plain

▼電源はこんな感じ。後ろにあるのはトイレ。使用禁止でしたが綺麗そう。

f:id:tanaka653:20190209114221j:plain

設営を終えたら散歩へ。だいや川公園の一部なので、サイトからちょっと歩くだけで公園をぶらぶらできます。公園内は結構整備されており、池も綺麗で最高でした。

ちなみに、キャンプ場側の公園の道路を挟んだ向かい側に、直売所などがあるのでそこに行ってみるのも良いと思います。

 ▼トレーラーハウスもあります。

f:id:tanaka653:20190209114330j:plain

▼池もありすごく綺麗な景色

f:id:tanaka653:20190209114430j:plain

f:id:tanaka653:20190209114556j:plain

散歩から戻ったら、焚火の火おこしをして飲み食いして就寝。寒いとバーナーとかライターとか火が付きにくくなるんですね。。

f:id:tanaka653:20190209114617j:plain

朝も散歩してご飯食べて撤収。

 ▼朝日がのぼってきました。フリーサイトのエリアにて。

f:id:tanaka653:20190209114746j:plain

▼朝の場内散歩

f:id:tanaka653:20190209114824j:plain

今回のキャンプ場はかなり整備されており綺麗な場所でした。綺麗な場所だけあってキャンプシーズンはかなり混雑しそうな雰囲気だなあと。

冬にまた来たいですね!