English conversation with 140-character limit is hard for Japanese
This post is an English translation of http://garbagetown.hatenablog.com/entries/2016/01/08 . *1
Background
While I was watching Building Microservices with Spring Boot LiveLessons (Video Training), I noticed that I can see the usage examples by executing curl start.spring.io
without parameters.
I didn't know how to display the usage examples, although I knew that I can create an application using curl with parameters such as curl start.spring.io -d style=web
.
I had tweeted about that because I thought it was very useful, then Stephane Nicoll(@snicoll) gave me a mention.
@garbagetown where do you want us to display that?
— Stéphane Nicoll (@snicoll) January 7, 2016
I couldn't express what I wanted to say in 140 chars because I'm not good at English, so I told him that I'll write that in this blog post.
What I wanted to say was...
I think it's better if how to use curl was on Spring Boot Reference Guide where Spring Boot beginners refer at first.
Having said that, however, I think it's not a big problem because I think most of users use Spring Initializr UI or STS rather than using curl to generate Spring Boot applications.
I'm sorry that I might have Stephane confused.
P.S.
- Spring Boot makes Java fun again. Thanks!
- I love Belgian beer, so I want to visit Belgium some day.
- I need to study English :-(
Edit on 12 Jan, 2016
Spring Boot Reference Guide has been improved. Thanks Stéphane!
@snicoll Thanks for the improvement! I think that's fine :-)
— でくのぼうは静かに暮らしたい (@garbagetown) January 12, 2016
日本人に 140 文字の英会話は難しい
英語版を http://garbagetown.hatenablog.com/entries/2016/01/10 に書きました。 *1
経緯
Building Microservices with Spring Boot LiveLessons (Video Training) を観ていたら、パラメータを付けずに curl start.spring.io
と実行すると使い方が表示されることを知った。
curl start.spring.io -d style=web
のように、パラメータを付けてアプリケーションを作成できることは知っていたけど、使い方が表示できることは知らなかった。
これは便利だなと思ってツイートしたら、 Stéphane Nicoll(@snicoll) が mention をくれた。
@garbagetown where do you want us to display that?
— Stéphane Nicoll (@snicoll) January 7, 2016
"usage の表示方法をどこかに書いておいた方がいい?" という内容だと思うんだけど、自分の英語が下手くそで話が噛み合わなかったので、"140 文字じゃ伝えられないのでブログに書く" と待ってもらうことにした。
言いたかったこと
- Spring Initializr の Web UI や STS でも Spring Boot アプリケーションを作成できるので、ユーザの多くはこれらを使うと思う
- curl を使うユーザは少ないので、ドキュメントに書いていなくても大きな問題ではない
- curl を使ってアプリケーションを作成できることは素晴らしいので、Spring Boot を始めるユーザが最初に目を通す Spring Boot Reference Guide に書いてあると、より良いとも思う
二点目と三点目で逆のことを言ったのが良くなかった。混乱させて申し訳ない。
追伸
2016/01/12 追記
Spring Boot Reference Guide を改善してもらいました。ありがとう Stéphane!
@snicoll Thanks for the improvement! I think that's fine :-)
— でくのぼうは静かに暮らしたい (@garbagetown) 2016, 1月 12
Docker と Redis と Spring
TL; DR
- 職場のウインドーズでも spring-boot したい
- spring-security したい
- spring-session したい
- ウインドーズに redis を入れる気はないので docker で入れる
- docker-machine 便利
Docker Toolbox
下記 URL を参考に Docker Toolbox をインストールする。インストーラをダウンロードしてデフォルトのまま Enter を連打すればいい。
Docker
公式ドキュメントのメンテナンスが追い付いていないようで、書いてある通りにやってもうまくいかない、と言うかそもそも書いてある通りに実行できないので、勘と経験と度胸で進める。
まずは docker ホストを作る。ウインドーズはネイティブで docker ホストを実行できないので、Docker Toolbox に含まれる VirtualBox 上に docker ホストを立てる。この作業を簡単にしてくれるのが docker-machine
コマンドで、例えば dev
という名前の docker ホストは次のようにして作る。
c:\TEMP>docker-machine create --driver virtualbox dev Running pre-create checks... (dev) Default Boot2Docker ISO is out-of-date, downloading the latest release... (dev) Latest release for github.com/boot2docker/boot2docker is v1.9.1 (dev) Downloading C:\Users\yu-umezawa\.docker\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2doc ker/releases/download/v1.9.1/boot2docker.iso... (dev) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100% Creating machine... (dev) Copying C:\Users\yu-umezawa\.docker\machine\cache\boot2docker.iso to C:\Users\yu-umezawa\.docker\machine\machines\ dev\boot2docker.iso... (dev) Creating VirtualBox VM... (dev) Creating SSH key... (dev) Starting VM... Waiting for machine to be running, this may take a few minutes... Machine is running, waiting for SSH to be available... Detecting operating system of created instance... Detecting the provisioner... Provisioning with boot2docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect Docker to this machine, run: docker-machine env dev
docker-machine ls
で docker ホストを一覧できる。
c:\TEMP>docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS dev - virtualbox Running tcp://192.168.99.100:2376 v1.9.1
作成した docker ホストに対して docker
コマンドを実行するために、docker
コマンドが参照する環境変数に docker ホストの情報を設定する。docker-machine env
コマンドで設定すべき環境変数を確認できるので、出力された通りに設定する。
c:\TEMP>docker-machine env --shell cmd dev SET DOCKER_TLS_VERIFY=1 SET DOCKER_HOST=tcp://192.168.99.100:2376 SET DOCKER_CERT_PATH=C:\Users\yu-umezawa\.docker\machine\machines\dev SET DOCKER_MACHINE_NAME=dev REM Run this command to configure your shell: REM FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd dev') DO %i c:\TEMP>SET DOCKER_TLS_VERIFY=1 c:\TEMP>SET DOCKER_HOST=tcp://192.168.99.100:2376 c:\TEMP>SET DOCKER_CERT_PATH=C:\Users\yu-umezawa\.docker\machine\machines\dev c:\TEMP>SET DOCKER_MACHINE_NAME=dev
お約束の Hello World が正常に実行できることを確認する。
c:\TEMP>docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world b901d36b6f2f: Pull complete 0a6ba66e537a: Pull complete Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/
Redis
docker の準備が整ったので、docker ホスト上で redis を実行するコンテナを起動する。指定しているオプションの詳細は下記の通り。
--name
でコンテナに任意の名前を付ける-d
でデーモンとして起動する-p
で docker ホストの 6379 番ポートに対するアクセスを redis コンテナの同じく 6379 番ポートにフォワードする
c:\TEMP>docker run --name redis -d -p 6379:6379 redis Unable to find image 'redis:latest' locally latest: Pulling from library/redis 9ee13ca3b908: Pull complete 23cb15b0fcec: Pull complete 52a374d9c478: Pull complete (snip) Digest: sha256:7dfb86a89af97d915fbde39a91c87a0bf55d76f9fc979b89bfa05a5671f851c2 Status: Downloaded newer image for redis:latest 4101734092f09f3057433e02fdef26306c6ab501d602be2b7efc793f0ec48815
docker ps
で docker コンテナを一覧できる。
c:\TEMP>docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4101734092f0 redis "/entrypoint.sh redis" 6 seconds ago Up 5 seconds 0.0.0.0:6379->6379/tcp redis
Spring
web, security, session, redis を追加した Spring Boot アプリケーションを作る。急にコマンドプロンプトではなく cygwin で作業しているが気にしない。
$ mkdir test && cd $_ $ curl https://start.spring.io/starter.tgz -d style=web -d style=security -d style=session -d style=redis -d name=test | tar -zxvf - % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 49996 100 49936 100 60 38051 45 0:00:01 0:00:01 --:--:-- 42318 mvnw .mvn/ .mvn/wrapper/ src/ src/main/ src/main/java/ src/main/java/com/ src/main/java/com/example/ src/main/resources/ src/main/resources/static/ src/main/resources/templates/ src/test/ src/test/java/ src/test/java/com/ src/test/java/com/example/ .mvn/wrapper/maven-wrapper.jar .mvn/wrapper/maven-wrapper.properties mvnw.cmd pom.xml src/main/java/com/example/TestApplication.java src/main/resources/application.properties src/test/java/com/example/TestApplicationTests.java
TestApplication
にいろいろ追加してセッション情報を Redis で管理する Web アプリケーションにする。
package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController @EnableRedisHttpSession public class TestApplication extends WebSecurityConfigurerAdapter { @RequestMapping("/") public String index() { return "Hello, Spring Boot!"; } @Override protected void configure(HttpSecurity http) throws Exception { http.httpBasic().and().authorizeRequests().anyRequest().authenticated(); } public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } }
application.properties
にデフォルトパスワードと docker ホストのアドレスを設定する。
security.user.password=password spring.redis.host=192.168.99.100
アプリケーションが正常に起動することを確認する。Redis に繋がらないと起動時点で例外が発生してコケる。何度もコケた。
$ mvn spring-boot:run [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building test 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ (snip) [INFO] --- spring-boot-maven-plugin:1.3.1.RELEASE:run (default-cli) @ demo --- . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.1.RELEASE) (snip) 2016-01-05 15:58:15.195 INFO 7440 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http) 2016-01-05 15:58:15.201 INFO 7440 --- [ main] com.example.TestApplication : Started TestApplication in 2.838 seconds (JVM running for 5.199)
localhost:8080 にアクセスすると spring-security の機能で Basic 認証ダイアログが表示されるので、ユーザ名に user
を、パスワードに application.properties に指定した password
を入力する。
これでセッション情報が Redis に書き込まれるので、docker exec
コマンドで redis コンテナに入って確認する。また急にコマンドプロンプトで作業しているが気にしない。
c:\TEMP>docker exec -it redis bash root@4101734092f0:/data# redis-cli 127.0.0.1:6379> keys * 1) "spring:session:expirations:1451979000000" 2) "spring:session:sessions:25c0619f-1dbf-422e-bd8e-85c9650f1073" 3) "spring:session:sessions:e27ff8dc-a3cf-4bc6-9093-b506600cc3bb"
セッション情報が二つあるのは、未認証状態で favicon を取得した時のものと、認証後にアクセスした時のものっぽい。ひとまずここまででやりたいことは大体できた。
2016/01/20 修正。セッション情報が二つあるのは、セッション偽装対策のために認証前後で JSESSIONID が変わるためだった。
おまけ
flushdb で redis 上のデータを削除することができる。
127.0.0.1:6379> flushdb OK 127.0.0.1:6379> keys * (empty list or set)
MNP 備忘録
TL;DR
- softbank から au に MNP した
- 月々の携帯電話料金が約 5,800 円から、一年目は約 1,800 円、二年目は約 2,800 円になった
- iPhone 4S から iPhone 6S に機種変更した
- 持つべきものは情強友人 a.k.a. MNP 乞食
動機
未来を生きるために Hulu か Netflix を契約したいけど家庭内稟議を通すために費用を捻出する必要があるので携帯電話料金を節約したいとツイートしたところ、こういう話が大好物の友人たちからざくざく情報が集まり MNP を検討することに。
携帯電話料金をもう少し安くしてNetflixかHulu契約したい
— でくのぼうは静かに暮らしたい (@garbagetown) 2015, 10月 25
計画
自分が softbank で妻が docomo で自宅の回線は B フレッツに Nifty という体たらくだったので、
と方針を定めて twitter で #MNP #au #一括0円
などと検索していたら良さそうな情報を発見。この手のツイートはすぐに消えるので画像添付。
特典と条件の意味がよく分からなかったので電凸確認したところ
- キャッシュバックの内訳は以下のとおり。
- かえる割スーパーは以下から選択可能。自分は前者を選択
- 1,000 円 x 12 ヶ月 x 2 台を月々の支払いから減額
- au wallet に 12,000 円ずつチャージ
- au オプションは以下すべて 30 日間無料、月を跨げば解約可能
- au スマートパス、うたパス、ブックパス、ビデオパス、アニメパス、ディズニーパス
- KKBOX
ということで、有料オプションの解約さえ忘れなければ問題なさそう。au ひかりも併せて確認すると
- モバワンから 10,000 円キャッシュバック
- プロバイダを Biglobe にすると Biglobe から 11,000 円キャッシュバック
- B フレッツ、Nifty の解約違約金も Biglobe が最大 10,000 円まで負担
とのことで、こちらも悪くない条件。全体的にキャッシュバック額はそこそこだけど iPhone 6S 64GB が魅力的なので決断。
実行
以下、必要なものを準備して店頭で手続きする。
- 妻の同意
- 月々の支払いが減り、娘の習い事の費用に回せる点などを情熱を持って説明
- 身分証明書
- クレジットカード
- 振込口座情報
- MNP 予約番号
- 情弱なので電話で取得したら一時間くらいつながらなかった。情強はネットで取得するらしい
- 下取り端末
なお、委任状は不可で契約者本人が来店しなければならない。印鑑と現金は一応準備したけど必要なかった。実際の手続きは店側が au ひかりの一括請求手続きにちょっと手間取ったこともあって全体で三時間くらい掛かった。
評価
今回のような動機で MNP してみて分かったこと、感じたこと。
- 情報が多過ぎてつらい
- 情強の友人たちから助言をもらえてラッキーだった
- 条件のいい情報が早めに見つかってラッキーだった
- 準備不足
- 自分も妻も解約月ではなかったので違約金が発生した
- 端末下取りが条件のため急いでバックアップしなければならなかった
- キャリア変更
- 機種変更
以前に iPhone 欲しさに docomo から softbank にMNP したときは選択肢がなかったので気楽だったけど、今回はずいぶん事情が違った。
改善
二年後に MNP バブルが続いているかは不明だけど、以下を改善したい。
- 定期的に情報収集する
- キャッシュバック額などの相場感を持つ
- MNVO も検討できるよう各種サービスを把握する
- 定期的にバックアップする
- キャリア、端末に依存せずにインターネットサービスを活用する
- 違約金など不要な費用を抑える
- Google カレンダーに解約月アラートを毎年くり返しで登録した
まとめ
Twitter/Facebook/LINE でコミュニケーションを取り、各社から iPhone が発売されている現在において、キャリアにこだわる理由はないので積極的に MNP した方がいいとは思うけど、決して健全とは言えない経済に加担しているイメージがあって個人的には人生が虚しいので、MNP 乞食などしなくても携帯電話利用料を安く抑えられる世界になってほしいと思いました。
あと友人宅で体験してみたところ Hulu/Netflix より Apple Music のほうが自分の人生に必要だったので、節約した費用で Apple Music を契約します。
TED日本語 - ジェニフェアー・シニア: 幸福は親には高すぎるハードル | デジタルキャスト
すばらしい。
育児に対する漠然とした不安や、時には頭を抱えたくなるほどの煩わしさ、そしてそれを補って余りある幸福感の正体と、なにを目的として育児に取り組むべきかを情熱的に説いてくれています。
すべてのエンジニアが伴侶と子宝に恵まれ、仕事と育児と趣味の狭間でもがき苦しみますように。
TED日本語 - クリス・ハドフィールド: 宇宙で目が見えなくなり学んだ事は | デジタルキャスト
おもしろかった。
Netflix 社が障害に備えるために人工的に障害を起こし続ける話を思い出しました。
東京リカーランド北千住東口店がヤバい
久しぶりに寄ったらとんでもないことになっていたのでご紹介。
とは言えちょっとググったらすぐに有用な情報が見つかったので、まずはこれらを読んでもらうとして。
- [日本と世界のビールレポート by びあトモ | 東京リカーランド] びあトモ for another pint of BEER
- 東京リカーランド北千住店~東TOKIOのクラフトビールの聖地は、やっぱりヤヴァかった! | フリーライター黒崎正刀の、飲んだくれ手記
- 東京リカーランド(北千住) ~東東京のクラフトビールの聖地、再訪 | フリーライター黒崎正刀の、飲んだくれ手記
当日のツイート
連投したらフォロワーが五人くらい減った当日のツイート。
まずはシングルホップシリーズで有名な ミッケラー の変わり種。左下の方にはコピ・ルアックというネコのうんこから取るコーヒー豆を使ったインペリアルスタウトとか置いてありました。なに言ってるか分からないですよね。書いているこっちもよく分かりません。
ミッケラーのこの辺見たことない pic.twitter.com/iuofq720U1
— でくのぼう.do (@garbagetown) 2015, 5月 9
見たことも聞いたこともないローグ・ブードゥードーナッツ・ベーコン・メイプル・エール。「この夏はこれで乾杯しよう!世界のユニークすぎるビール5選 | RETRIP」 によると甘じょっぱいらしい。
ベーコン・メイプル・エールってなに… pic.twitter.com/iDEZIrGHPI
— でくのぼう.do (@garbagetown) 2015, 5月 9
たんごさん がうまいと言っていたアメリカのレフトハンド醸造所のミルクスタウト。ミルクスタウトというスタイルそのものを知らなかった。
たんごさんが言ってたレフトハンドのミルクスタウトもあった。ナイトロとか言う上位版っぽいのもある pic.twitter.com/S4N0srnG86
— でくのぼう.do (@garbagetown) 2015, 5月 9
入手困難という噂のデリリウムの 25 周年記念限定瓶。となりのデリリウムレッドはいわゆるレッドビールではなくて、トレメンスにチェリーを漬け込んだフルーツビール。ものすごくおいしいのでおすすめ。
激レアと言われているらしいデリリウムの25周年もレッドも余裕で置いてある pic.twitter.com/5qJszbHCp8
— でくのぼう.do (@garbagetown) 2015, 5月 9
よこなさん が飲んでいた PUNK IPA をはじめ、ここ数年で急激に知名度を上げたスコットランドの ブリュードッグ もずらり。
よこなさんが飲んでたPUNK IPAはじめブリュードッグも勢揃い pic.twitter.com/poiDjTK8ZJ
— でくのぼう.do (@garbagetown) 2015, 5月 9
こざけさん が大好きなパウエルクワックのギフトセットもある。こざけさんは高いと言っていたけど、あのグラスがそもそも 3,000 円くらいする ので、小瓶四本付いてきてこの値段はむしろ良心的。
こざけることもできる pic.twitter.com/8PPHWdxzT1
— でくのぼう.do (@garbagetown) 2015, 5月 9
買った
たんごさんおすすめのミルクスタウト。楽しみ。
デリリウムレッドは見掛けるたびに買ってしまう。自宅に帰ってみたらもう一本あった。
ブリュードッグとミッケラーのコラボ作品。IBU 130 とのことなのでめっちゃ苦そう。
ジャケ買い。スト II 世代として買わずにいられなかった。IPA らしい。
箕面ヴァイツェン。なんか海外の色モノばかり買っちゃった感があったので。
その他補足
自分が北千住に移り住んだ 2006 年には東京リカーランドは東口店と西口店があって、当時は両店ともつまらない街の酒屋だった。西口店の急な階段を登った二階に「びあマ」、三階に「ワイマ」ができたのが 2011 年くらいだったと思う。
その頃から輸入ビールの品揃えはなかなか良かったけど、場所のせいか急な階段のせいか、お客さんはあまり多くなくて、店員さんがいつも魔女の宅急便にみたいに暇そうにカウンターに座っていたのをよく覚えている。
その後しばらくして西口店が閉鎖することになり、在庫一掃セールがあって一気に 10 本くらい買った。そのとき「これだけの品揃えの店がなくなるのは惜しい」と言ったら、「東口店に移設するからそっちに来てくれ」と言われてほっとしたわけだけど、まさかここまで本気の店になるとは思っていなかった。
交通の便がいいとか大学の誘致に成功したとか、そういう理由で北千住に不動産を買ったんだけど、東京リカーランドは完全に嬉しい誤算だった。これからも積極的にお金を落としていきたい。