boot2dockerのIPがVPNのネットワークとかぶってしまった

家に帰ってVPNを繋いでboot2dockerでコンテナを作ろうとしたら、以下のような感じでエラーになってしまっていました。

$ docker build .
Sending build context to Docker daemon
FATA[0032] Post https://192.168.59.103:2376/v1.16/build?rm=1&t=: dial tcp 192.168.59.103:2376: i/o timeout

VPNを繋いだときだけ問題がおきるのと、IPアドレス帯を見てみたところこれはかぶっちゃってるかなーと思い traceroute 192.168.59.103 してみるとビンゴ。VPNのネットワークに吸い込まれていました。

boot2dockerのIPを変える方法は、boot2docker/boot2docker-cli の configration にあるように boot2docker config の結果をファイルに落としてから変更すればよさそうな雰囲気。

実際やってみると、ネットワークの設定は変更してVMの再起動では当然ダメで、VirtualBoxのホストオンリーネットワークを消してから boot2docker delete > boot2docker init として作り直す必要がありました。(自分でホストオンリーネットワークを変更してもいけると思いますが)

IPの設定回りを以下のようにざっくりと変更したところ、VPNを繋いでいても問題なく動くようになりました。めでたしめでたし。

...
HostIP = "172.16.59.3"
DHCPIP = "172.16.59.99"
NetMask = [255, 255, 255, 0]
LowerIP = "172.16.59.103"
UpperIP = "172.16.59.254"
...

SCRUM MASTER’S NIGHT! VOL.7 に参加してきました

午前中は有給をとって息子の発表会を見て、夜はスクラムマスターじゃないけどこれに参加してきました。

テーマ選びでは Regional Scrum Gathering Tokyo 2015: Schedule の 「Scrum or not?」 というパネルディスカッションのテーマを決めるというやつにしました。

ファシリテータは川口さんで、出てきた意見の分類の仕方と流れの作り方はさすがだなーいう感じでした。

肝心のパネルのテーマは(この通りになるかどうかはおいておいて)、各社大規模にスクラムを導入しているけど、最初の導入過程から、レイトマジョリティへの対応、プロセスの効果や評価の方法、そして今後の事へと、特に前半はかなり興味深い内容になりそうでしたので、みなさん Regional Scrum Gathering Tokyo に行きましょう!

結構早めに終わったので、他のテーブルを眺めたり、一緒にいった @kurotaky のお悩み相談テーブルにjoinしたりしてわいわいやっていました。

懇親会ではsushi的なものもあり、DeNA様ありがとうございました!

幼稚園の発表会を見てきました

息子の幼稚園で発表会があるとのことだったので、今月付与されたばかりの有給を利用して参加してきました。

ダンスや歌、劇など30分ちょっとくらい見てました。

最後に先生も言っていたけど、1年前は入園式で静かに座っていることもできなかった子供達が、これだけできるようになるのは本当に集団生活と先生様々というかんじ。

あと1年、元気に過ごしてくれるといいな。

(運動会ほどは動きがないので写真もそれなりに撮れたような気がします)

ハンドメイドマーケット minne でバーンといくぞ!!1

会社の決算説明会でいろいろと発表になったようです。

GMOペパボ、異例の「利益ゼロ」予想 ハンドメイド市場「minne」拡大へ積極投資 - ITmedia ニュース

諸事情でスーツを持っていないために会場には行けなかったのですが、 USTのチャンネル を見ながらTwitterを見たりしていました。

こういう体験は初めてだったので、個人的にはとてもよい経験ができたと思っています。

というわけで、今年は ハンドメイドマーケット | minne(ミンネ) でバーンといくので、ビッグウェーブにのっかりたい人、その裏でしっかり売上利益をあげいかないといけないサービスを支えたいエンジニア、両方とも絶賛募集中なのでぜひご応募ください!

みんなで恵方巻を食べた

オフィスに大量の恵方巻がデプロイされていたのでみんなで食べました。

家に帰ってからは、申し訳程度に息子と豆まきをしたのでした。

幼稚園では鬼役の先生とかがいたのかなーと聞いてみたら「鬼の面が置いてあって、終わったら持っていかれた」という証言をしていた。なるほど。

入門docker - ローカルでビルドしたバイナリが入らないように注意しよう

本日の私の生産性を著しく低下させた件について共有させていただきます。

とあるフロントエンドアプリケーションを動作させるためのDockerコンテナを作っていたのですが、Dockerfileをこんな感じにしていたんです。

FROM dockerfile/nodejs-bower-grunt

...

ADD package.json /app/
RUN npm install

ADD bower.json /app/
RUN bower install --allow-root

ADD . /app/

...

ちょっとこみいった事情があったのでonbuildではないのですが、手元の環境でbuildしたイメージを実行しようとしても grunt imagemin:dist でエラーになってしまう。しかし、リモート(具体的には mookjp/pool の中)だとその部分は動いている。(その先が動かなかったのでデバッグしたかった)

エラーメッセージでググっても npm cache clean しろとか、apt-get で入れてる optipng を消せとか言うので docker run -i -t {imagename} /bin/bash していろいろやっていたら、./node_moduels 内にある optipng の実行ファイルが壊れており、ADD . /app/node_modules がローカルのものに上書かれていることにようやく気付いたのでした…

手元で node_modules を消してbuildしたら無事動くものができあがったのでした。つらい。

みなさんもローカルで docker build するときはバイナリが入らないように注意しましょう…

2015/01に読み終えた本

正月に、2015年1月に読んだ本をブクログでふりかえる - delirious thoughts を真似て書いてみようと思っていたのを月末に思いだしたのでした。

今月は3冊…意識の低さよー。

アジャイルソフトウェア要求を結構読み込んでいたというのあるけど、もうちょい時間を作りたいですね。

shucreamの本棚 (shucream) - ブクログ

AEP読書会 第十六章「ベロシティの見積もり」

第十六章「ベロシティの見積もり」 - AEP読書会 | Doorkeeper

2015年1回目でした。今回はGMOグループからも何人か来ていて、これも藤村さんのリクルーティング活動のおかげか!? と、私もがんばろうと思いを新たにしました。

今回のテーマの「ベロシティ」ですが、私自身あまりうまく使えないなーと悩んでいたところ、ディスカッションの中でいいヒントを貰えました。

ベロシティ上げて欲しい人、安定させたいチーム

PO(やマネージャ)としては当然できることが多くなるほうがいいので「ベロシティを上げるにはどうしたらいいか」という話になります。

一方で、開発チームとしては中期の見通しを立てるために「ベロシティを安定させたい」と思っています。

ここに歪みがあって、こじれてしまうと見せ掛けのベロシティ(完了条件をごまかしたり、過剰見積をしてベロシティが上がったように見せる)にチームが走ってしまったら元も子もないので、今までは「ベロシティは安定させるもの」というスタンスをとってきました。

ベロシティはチームの限界近くまで上がって安定する

ディスカッションの中では、ベロシティは無限に上がり続けることはないが、チームの限界近くまで上げて安定させるべき、という話がでてきました。

そう聞くと当然のことなんですが、回りの状況や、私自身が開発チームに近い場所にいるせいもあって「今だって一生懸命やってるよ」という気持ちが強かったんですよね。

でも、開発チームが工夫や調整、仕組みの改善を精一杯やってるか?って言われると、過去のプロジェクトを見ても胸をはって言えるプロジェクトってあんまりないし、そういう面では甘えもあったのかな、って。

スクラムマスターの役割

Scrumの根っこ というスライドに「責任から逃さないのがSM」という言葉があって、こういう表現の仕方は考えたことなかったな、とハッとしたのでした。

「ベロシティを上げろ」という人には「安定させるものなんです」、開発チームには「どうやったらもっと早く進めるか」という二枚舌でいくのがいいんだなという自身が得られたので、今回もよい読書会でした。

デザイン作業の見積りと計画

夕方からプロジェクトの残作業棚卸しをしていて、@shikakunが見積りを計画に悩んでいたので、相対見積りやタイムボックスの考え方について話していました。

最初は私達プログラマがどうやっているかを説明していたのですが、話していくうちに「これ職種関係ないじゃん」ということに気付いて、それなりにいい話になったような気がします。

  • 明確なゴールがあるものや完了条件が明確、イメージしやすいものは相対見積りで考える
  • スパイクや調査タスクなど、完了条件が曖昧だったり、作業量を見積るの困難なものはタイムボックスで考える
    • タイムボックスの半分くらいで相談するタイミングを入れておく

長期的なプランニングを考えるときは、それらをえいやっと足して計画をたてればいいし、イテレーションプランニングでは相対見積りを時間見積りにざっと変換して、タイムボックスのタスクと合わせて計画していけばよいです。

計画は最初に立てて終わりではなく、現実に合わせて変えていける、計画し続けることが非常に大切です。その為には、がちっと引かれたガントチャートよりは、相対見積りと絶対値の見積りをうまく組合せた「直近の計画は詳細に、長期計画はざっくりと」というアプローチがとれる、いわゆるAEPスタイルがすごくいいなーと思っています。

もちろんプロジェクトの性質や状況はありますが、普通の人が普通にソフトウェア開発をするのであれば、「計画通りに進めること」よりも、プロジェクトを通した学習によって起こる「変化を受け入れること」ができる計画やプロセスを採用したほうが、メンバーのモチベーションの面でもメリットが大きいと主観ですが感じています。

こんな話を10分くらいしていたんですが、そういえばうまく見積りと計画ができたのか聞いていなかった…

Request Spec で HTTP HEADER を勝手につける gem を作った

kenchan/rspec-default_https_header です。

APIサーバの Request Spec を書こうと思ったときに、毎回 OAuth のトークン設定したり、 CONTENT_TYPE: 'application/json' とか付けるのは人間のやることではないので、もうちょっと簡単にできるようにしました。

最初は r7kamura/rspec-request_describer がいいかなと思ったんですが、ちょっと枠組みがエクストリームな感じなので、最初から導入したりえいやっと書きかえるならよかったんですが、もうちょっとゆるめのやつが欲しかったのです。

  • Q. テストがないようですが?
  • A. すみません…テスト書いたらリリースしてWeb日記書こうと思ったんですが、うっかり社内のプロダクトに入れてしまったので書いちゃいました。

わりと便利だと思うのでよかったらお使いください。

mookjp/pool を Ubuntu 14.04 上で動かす

話題の mookjp/pool をなんとか使いたいと思って、社内の仮想環境上で動かしてみました。

ペパボの社内用サーバは mizzy/maglica というツールを使って管理されてるんですが、まだCoreOSは実績がなかった気がするので、dockerが一番まともに動くであろう Ubuntu 14.04 上でチャレンジしたところ無事動いたのでした。

だいたいは、READMEにあるamazon linux用の手順でよくて、

  • dockerとgitをapt-getで入れる
  • dockerの実行ファイルをREADMEの手順通りに最新版にする
  • scripts/init_host_server を実行する

というだけでとりあえず動きました。(2015/01/20現在)

社内ではCIにDroneを使っているプロジェクトがいくつかあるので、まずはその辺から使えるようにしていこうかと。

prevs.io - Your environment, just one click のエンタープライズ用がでるのはまだまだ先だろうから、社内でカジュアルに使える環境があると便利なんじゃないかと思っています。

Dockerの周辺技術はぜんぜんキャッチアップできていなかったので、ちょうどいい機会だからいろいろ勉強しよう。

福岡出張の記録

ペパボではエンジニアの評価面談を技術基盤チームでやっているので福岡まで行ってきました。

1日目

ちょうどお昼に到着する飛行機だったので、まずはまぐろ料理紀文 (まぐろりょうりきぶん) - 天神/魚介料理・海鮮料理 [食べログ] というところで黒鉄火丼なるものを頂いた。

海苔の下はネギトロ的なやつなんだけど、めっちゃ山葵がきいてたけど美味しかった!あと、血合を煮たやつが無限に食べれて、これもめっちゃ旨かった。

夜は各自という感じだったので、行ってみたかった一人モツ鍋のお店 元祖博多麺もつ屋 - 天神南/もつ鍋 [食べログ] に。

最初から麺が入っていることもあって、焼酎1杯とこれでお腹いっぱいでした。カウンター8席だけなんだけど、味が2種類あるので2人できて分けてる人もいて、それもよさそうだなーと思ったのでした。

2日目

お昼は 天ぷらのひらお 天神店 - 天神/天ぷら [食べログ]

写真忘れたけど、説明する必要はないですよね。おいしかった。

夜は本気の鮨ということでかなり警戒していたんだけど、予約できなくて別のところに。

あんちぽさんの「面白いところと普通のところどっちがいい?」に満場一致で面白い方となったところ、 河太郎 中洲本店 (かわたろう) - 中洲川端/魚介料理・海鮮料理 [食べログ] だった。

呼子のイカ、初めて食べたけどこれはやばい。

3日目

お昼は 博多ごまさば屋 - 赤坂/居酒屋 [食べログ]

福岡のランチのおいしいところはなにかが無限に食べれるところが多くて、ここでは南蛮漬みたいなのが食べ放題でこれも旨かった。

夜は福岡メンバーと 海鮮食堂 すいか - 赤坂/居酒屋 [食べログ] というところでわいわいと。このお店、ぐるなび - 海鮮食堂 すいか(大名/魚料理) の写真がめっちゃ残念なかんじなんだけど、ふつうに美味しかった。いわしの梅揚げおすすめ。

その後は、二次会で近くのバーで3時くらいまで。おつかれさまでした…

4日目

お昼はpinkoさんとちんさつさんと スリランカ料理レストラン 不思議香菜ツナパハ&東方遊酒菜ヌワラエリヤ でカレー。

なにやらめっちゃ辛いということだったんですが、まぁせっかくだからと普通の辛さ(?)のやつを。たしかにかなり辛いけど、ココナッツカレーひさしぶりだったのでおいしかったです!

まとめ

御飯のことしか書いてませんが、面談では初めましての人もたくさんいて、いろいろなお話を聞けてよかったです。

掃除&片付け

領収書とか保証書とかなんかいろいろ入っている押入れの中を全部出して一掃しました。

5、6年前に買った家電の保証書とか、賃貸契約書とか、数年前から放置されている常備薬とかいろいろでてきたのであった。

無いと思っていた精密ドライバーとか、ガムテープとか、コロコロの替えとか、だいぶ有益なものも発掘できたのでよかったよかった。

奥さんの実家にご挨拶行って一回休み

一回休みでした。

レジェンド花金

給料日の金曜日で社長のケンタロさんの誕生日会ということでレジェンド花金でした。

相変わらずエンジニアの人たちと最近どうっすかとか、評価面談どうでしたか、みたいな話をしていたような。

若者分を補給できたのでよかったかな。

評価面談

ペパボでは半期毎に評価面談があるので、上長であるあんちぽさんと30分ちょっとおしゃべりをしました。

評価制度そのものは ペパボのエンジニア評価制度をパワーアップした ー deirious thoughts から変わっていないので、3つのポイントについて半年どうでしたか?という感じで進んでいきました。

技術基盤チームという特定のサービスに依存しないチームに所属しているので、実際に売上をあげている各事業と、そのユーザにどういう影響を与えられたのかが説明しにくいという話をしたら、「技術基盤チームにいるってことはそのロジックをちゃんと説明できないといけないよ」というコメントをいただいて、おっしゃる通りがんばりますという気持ちになりました。

あとは、去年やれなかったこととか、今思えばこうしたらよかったとか、今年はこういうのがんばりたいとか、そういう話をして終わり。

またすぐ2015年上期の目標をたてないといけないのだけど、これやったらすごいという目標をやりきれるようにがんばろう。

pplogのGemfileを眺めて気になったやつ

pplogのGemfile - pblog が公開されていたので眺めながら、気になったやつを調べてみました。

garb

Google Analytics API の Ruby クライアント。管理画面とかで使ってるんですかね。

数値だけもってきて他のメトリクスと合わせて表示できると便利そうなのであとで試してみよう。

inuicon-rails

なんだこれ?と思ったらWeb Font!!!

便利だ。

dekiru

便利なヘルパーの集合。dekiru/controller_additions.rb at master · mataki/dekiru が便利そうでした。

uuidtools

大体の場合は singleton method SecureRandom.uuid でよいと思うのですが、なにかの事情で使わないといけなくなったときのために覚えておきます。

brakeman

本日のスターしてたわー大賞。お仕事のアプリにも使ってみよう。

おわりに

ちょっと古いけど IdobataのGemfile もどうぞ。(更新されたりしないかな?)

難しい問題を簡単に解くということ

を大切にしている。

現実世界の問題をシステムを作って解決するということは、その問題はコストをかけて解決する価値のある難しい問題であるということだろう。

しかしながら、難しい問題をそのまま難しい方法で解決するのであれば、日本語が理解できてプログラムさえ書ければ誰でもできるのである。

「難しい問題を簡単に解く」というのは、単にライブラリを使うというだけではない。

難しい問題というのは、大抵の場合一様に難しさが広がっているわけではなく、多数の簡単な問題とごく一部分の難しい問題の集合となっている。

この一部分の難しい問題を見極めるのが重要である。その問題を難しい問題としているポイントさえわかればあとはどうとでもなる。

技術力で捻じ伏せることもできるだろうし、交渉によってその問題をなかったことにすることだってできるかもしれない。(馬鹿正直に作るだけが仕事ではない)

「こんなコードでよかったのか」と思わせたら勝ちだと思う。

ということを、消費税や代引手数料の計算ロジックのレビューをしながら思ったのであった。ポエム終わり。

仕事初め

新年1日目のお仕事はRails 4.2へのアップグレードの準備でした。

一箇所アプリケーションのロジックがうまく動かないところがあったけど、それ以外は概ね目処がついた感じ。

ついでに、active_model_serializer被害者の会を結成しそうになったりしたのだった。

AMSは0.9でインタフェースをがらっと変えたんだけど、0.10では0.8ベースの昔のインタフェースに戻すよ宣言がされていて、今のmasterは非常に微妙な状況になっているのであった。まだ導入前なら0.8系を、0.9にしてしまっていたらがんばれという感じ。

0.8系なら4.2でもたぶんいい具合に動くので大丈夫じゃないですかね。

Railsを読むぞ #2

今日は core_ext/array/* の残り。

active_support/core_ext/array/extract_options.rb

引数の最後のHashを抜き出すいつものやつですね。 Hash#extractable_options? も一緒に定義していて、Hashのサブクラスでextractされないようなものを作れるようになってるそうな。なるほどー。

active_support/core_ext/array/groups.rb

in_groups_ofin_groups 似てるけどだいぶ違う。 in_groups のほうがロジックは大分難しいんですね。

active_support/core_ext/array/prepend_and_append.rb

aliasを定義してるだけ。

active_support/core_ext/array/wrap.rb

おなじみ Array.wrap 。いつもお世話になっています。

to_ary に反応してもnilが変えってくることを考慮して、

elsif object.respond_to?(:to_ary)
  object.to_ary || [object]

となっているのはなるほど感ありますね。

ウル4買いました

去年の10月くらいにFF11の課金をこっそりと停止して以来、ポチポチゲーしかしてなかったので(FF11もポチポチゲーだけど…)、さすがにゲーム能力の低下がひどいのでがんばることにしました。

SS4AEのディスクは持っていたのですが、微妙な傷があって起動しなくなっていたのでフル盤を買うことに。BDは傷が付きにくいけどちょっと付いちゃうとすぐ読み込めなくなるので、今後は円盤を買うのは止めようと思ったのでした。(特に小さい子供にいると…)

当然ながら結構余裕のある目押しも安定しないのでしばらく訓練します。

Railsを読むぞ #1

Rails、たまに眺めるけどちゃんと読んだことなかったのと、結構知らない便利メソッドが発見できたりするのでちょっとずつ読むことにしました。できれば記録をつけながら続けていきたいなという意思表明を兼ねて。

まずは入りとしては active_support/core_ext が実用的だし楽なので、このあたりから始めます。

active_support/core_ext/array/access.rb

いきなり知らなかった Array#from Array#to からスタート。何番目から最後までとか、最初から何番目まで、みたいなのをとりたいことってあるかなぁ? Rails本体では使われないみたい。

Array#second とか Array#forty_two とか。 生命、宇宙、そして万物についての究極の疑問の答えだ!

active_support/core_ext/array/conversions.rb

to_sentenceは便利だ!いつもヘルパーを作ってしまっていた気がする。

i18nにも対応しているけど、i18nがロードされてるかどうかを if defined?(I18n) で判定している。なるほど。

Array#to_formatted_sto_s にエイリアスされていて、これが。to_s(:db) を処理しているけど :db 以外は無いんだね。

to_xmlは…まぁたぶん使うことはないと思うからいいかな…blockを渡せるのは知らなかったけど、どう使うんだろ…

自宅へ帰還

実家から自宅に戻ってきました。

正月は体調を崩して寝たきり状態だったので、仕事初めまでに体を整えようかな。

インターネット最高!

読書ログ「検索エンジン自作入門」

RubyKaigiで買ってから鞄の中で眠っていたのを、正月休みを利用してようやく読み終えました。

きちんと読み初めるまでは少しずつ検索エンジンを作っていく本かと思っていたのですが、実際はある程度動く状態にあるソースコードを解説しながら検索エンジンの仕組みを説明する本でした。

期待していたものとはちょっと違ったものの、

  • 最初に検索エンジンの理論と語彙の説明がある
  • Groongaなどで実際に工夫しているポイントの紹介がある
  • ソースコードはCの読み書きができなくてもなんとか読めるくらい平易に書かれている

という感じで、期待通りではなかったものの非常に楽しめました。

また、パフォーマンスチューニングや、今後の改善ポイントまで、非常に実践的な内容なのもよかったです。

検索エンジンの仕組みがまったくわからない人も、なんとなくわかっているけど実装までは…、という人まで幅広く楽しめるのでお勧めです。

あけましておめでとうございます

今年も宜しくお願いいたします。

31日に体調を崩してしまい、気付いたら年を越していました…去年は年末に夫婦で体調を崩したり、どこか痛めたりという感じだったので、今年は健康に過せるといいなぁ。

お仕事的にも、なにか一発やりたいですね。がんばります。

実家の回線は極細なので千葉に帰るまではこのくらいで。