エッセンシャルスクラムセミナーに参加

(これを書いているのは10/20です)

VOYAGEさんで開催されたエッセンシャルスクラムセミナーに参加してきた。

今までのポジションとしては、スクラムってかなりかっちりとしたフレームワークだし、あの通りにやるのはかなりしんどいのでかなり距離を置いていたんですよね。

ただ、現職はわりとスクラム押しだし、エッセンシャルスクラムを読んでいるうちに見方がだいぶかわってきたので、そろそろ有識者と話をするといろいろ捗りそうと思ったので、タイミングとしては完璧だった。

エッセンシャルスクラムの一つのポイントは、マネージャについて書かれているという所なので、この辺を角さんや参加者の方と話せたのはよかった。

主に気になっていたのは、POとマネージャと、組織的な役割をどう考えればいいのかというところで、ここは角さんにかなりヒントを貰えたような気がする。

懇親会が終わってからは、たまたま別件でAJITOに来ていた大学の同僚と数年ぶりの再開を果して、いろいろ話をしていたら終電近くなったので帰ったのでした。

会場や懇親会の料理、飲み物を提供いただいた各社さんありがとうございました。

台風からのグループ全体ミーティング

VPNの申請をしてきたから在宅でもよゆーだぜーと思っていたら、イントラでやっておかないといけない手順があったらしく、繋がらないのでインターネットでできることをしていた。

息子も、たまたま幼稚園が代休だったので、家でだらだらしながら、偶に話しかけられるのを生返事しながら仕事をするのはなかなか大変である。

午後から出社して設定をして、帰って確認したらちゃんと繋がったので次からは大丈夫なはず。

夕方からはグループの全体ミーティングがあって、今までにない体験でこれはこれで楽しかった。

公園で息子と走る練習をするつもりだった

運動会の練習を見てきた奥さんから、息子の走りかたがひどすぎるからなんとかしろと言われたので、散歩ついでに練習でもしようかと公園に付いたところで、滑り台に走っていった息子は数歩目で転んで膝を思いっきり擦剥いた。

練習どころではなかったので、とりあえず水であらって絆創膏を買いにいって、涙目すぎたのでおやつを食べたり本屋にいったりして気をまぎらわして一日がおわった。

SUZURIの商品を外部サイトに貼りつける

という機能がリリースされたので、ためしに貼りつけてみたよ。

なるほど、なかなかよくできるのではないでしょうか!みむらさんクロス行きましょうグッズ、あれからさっぱり売れていないので、また一山あててみむらさんとクロスいきたい。

スクラムっぽい人とまんてん

安井さんに渡すものがあったので、ついでに家永さんと社内のスクラムっぽい人をひきつれて「まんてん」に行った。

偶然にもマウリンが誕生日ということだったので、たまたま持っていた熨斗袋に、たまたま持っていたDMMマネーカードを入れてプレゼントした。

そうしたところ、どうやらマウリン氏はかなりのヘビーユーザーらしいことがわかったので、よいプレゼントになったっぽい。

まんてんでは、レバテキとアレを食べさせることができたので満足しているが、なんかを焼いているときに2回ほど火があがってしまった。修行がたりない。

で、最後のオチはこれ。

Nexus 6 でかそうだから小さいやつも出ないかなー。

内定式後の飲み会で一回休み

若い芽を摘むつもりが返り打ちにあったので一回休み。

若い人たちはすごいですね!

新卒研修でGitの話

新卒エンジニア向けの「座学」という枠で、1時間ほどGitについてお話させてもらった。資料はspeackerdeckに。

新卒sは、普段Gitは使っているものの、まだまだ実務で起きた問題を解決できるほどではないようなだった。そこで、自分がGitを理解できたなーと思えたきっかけである「全てはコミットである」を少しでもわかってもらえたらいいかなーと思ってそんな内容になっている。

資料はひたすらコマンドが並べられているだけなんだけど、これを打ってもらいなから結果を確認したり、コミットの繋りをホワイトボードに書いたりしていた。なので、この資料を眺めてもさっぱりかもしれないけど、わかる 人には言いたいことが伝わるんじゃないかと思う。(本当はremoteまで説明したかったんだけど、資料作成と実際の講義時間の問題で割愛している)

ペパボでは1週間に2回ずつこういう時間があって、実は今は2週目なんだけど、それでもコンテンツがどんどんあつまってくるのですごいなーと思っているところ。

WEB+DB Press Vol.82を読んだ

買ってからだいぶ時間がたってしまったけど、ようやく一通り読んだり写経したりが終わった。

今号はなんといってもfreeeの特集が凄く面白くてよかった。今、仕事でもモノリシックなアプリケーションの分割と、クライアントサイドの刷新みたいなやつのお手伝いをしているので、やなんでいたところや、その解決方法にすごく共感できてよかった。

あとは、Web ComponentsとDBの話もタイムリーでとても楽しんで読むことができたし、Goの特集も写経しながら理解できたのでよいかんじだった。

FF 10-2 をはじめた

発売日に買ってから、10はデア・リヒターに向けてヨウジンボウでキマリの小手が出なくてずっと止まっていたんだけど、10-2については当時もやらなかったし、まったくやっていなかったので初めてみた。

当時はボロクソに言われていたけど、まぁよくできるし、雰囲気の好みだけの問題だなーと思った。

積読もたまってきたので気分転換にたまにやってみるつもり。今年中に終わるといいなー

インターネットが死んで復活した話

土曜日に家に帰ったら急にインターネットが繋らなくなっていて、VDSLのリンクができないっぽいので電話したらマンションの終端装置が壊れてしまっているっぽいかった。

夜だったので工事は日曜になるってことなので、体調も悪いのでほぼ丸一日寝続けていた。

middleman を Ruby2.2.0-preview1 で使う

middleman-livereloadから依存しているeventmachineがmasterじゃないと動かないのでそこだけGemfileを書き換えている。

それ以外は特に問題ないし、ついでに何かのバージョンが上がって、個別の記事に謎のタイトルも出なくなってよかった。

手元はとりあえず 2.2 で生活しているけど今のところ困ることはそんなにないかな。

RubyHiroba 2014 で生活発表しました

RubyHiroba 2014の生活発表会で最近お仕事生活で触っている shopify/active_merchant について発表してきた。

発表の時につかったコードリーディングのメモも Speaker Deck からリンクしたよ。

終わってから@kei_s氏といろいろ話せたのがすごく良かった!

  • ActiveMerchantはやっぱりクレカ前提だからコンビニ決済とかは実運用上つらいところがありそう
  • spree/spree はハマればすごい。
  • 両方ともモデリングはよく出来てるから参考にするべし

設計もそうだし、語彙もすごく勉強になるので、課金システムに携わる人は両方読むといいんじゃないでしょうか。

RubyKaigi 2014 で LT をしました

1番目でめちゃくちゃ緊張したけど、なんとか3つのトピックを紹介できてよかった。

練習しているときは1トピックで5分くらいかかってしまっていて、これはまずいと原稿を整理してなんとかゴールまで辿りつけた感じ。

スライドにあるようなデータの作り方にすると、「それってFixtureでいいんじゃないの?」という意見が出てきてもおかしくないし、当日の午後のセッションでFixtureの話もあったのでねじ込んでみたけどさすがに間に合わなかった。

Fixtureは

  • 早くて
  • yamlやcsvで定義できて
  • validationやcallbackはスキップされる

という特徴があるので、どちらか一方だけを使うというのでなく、適材適所にしましょうという話。

で、見なおしてみるとmoroが数年前に言っていたことばかりだったりしたけど、違う人が同じトピックについて、それぞれの見方で発表するのは価値のある事だと思うのでみんなもっと独自研究の成果を発表するといいと思う。

散髪ログ

前回からちょうど2ヶ月。RubyKaigiなので切った。

PCを家に忘れて一回休み

なんか背中が変だなーという違和感はあったんですよ。

どうしようもないので、余ってるPCを借りて日本語を書いたりしていた。

あと、Homebrewは複数アカウントで使えないということがわかったのは収穫であった。

/usr/local以下のファイルがインストールしたユーザのwrite権限しかないのが問題でなんだけど、とりあえず admin グループの人間は書けてもいい気がしたので、https://blog.strug.de/2012/06/my-homebrew-multi-user-setup/ を参考に、独自のグループではなくて admin グループに write 権限をくっつけて必要なツールとかを入れたのであった。

(Railsで)プロフィール更新みたいなやつの注意点

前職と現職で2アウト案件。

Railsに限らないけど、ログインユーザの情報を変更するときは current_user みたいな変数を変更するんじゃなくて、DBを引き直して更新しましょうって話。

ダメな例

class ProfileController
  def update
    if current_user.update(profile_params)
      redirect_to :root
    else
      render :edit
    end
  end
end

良い例

class ProfileController
  def update
    @user = User.find(current_user)
    if @user.update(profile_params)
      redirect_to :root
    else
      render :edit
    end
  end
end

なんでだめなの?

バリデーションエラーが起きた時に current_user が不正な状態になってしまうから。

こういう書き方をしてるってことは、だいたい _form.html.haml はこういう感じになっているはず。

- form_for current_user do |f|
  = f.label :name
  = f.text :name
  ...

これだけ見ると大丈夫そうだけど、問題は ヘッダなどに current_user の情報を表示している ようなケース。

%header
  .name= #{current_user.name} 様

こうなってると、updatecurrent_user#name が不正な状態になってしまうとそれがそのまま画面に出てしまうよね。

dup や clone じゃだめなの?

dup は Shallow Copyなので、大丈夫って自身があるならそれでもいいんじゃないですかね。

よほど速度に影響するというわけじゃなければ find のほうが安全だと思っています。

まとめ

フォームで変更するオブジェクトが、フォーム以外の場所でも表示されている場合、フォームで変更するオブジェクトと表示するオブジェクトは分けておかないと意図していない挙動になるから注意しましょう。

みんなでHerokuをcronとして使う

Heroku Button の勉強を兼ねて、とある業務を自動化して公開した。

kenchan/yuru-char-voter

Jenkinsを高度なcronとして使っているという事例はたくさんあるけど、アプリケーションのポータビリティが劇的に向上した2014年後半では、コードを公開してHeroku Buttonをつけることで他の人も簡単に自動化の恩恵を受けることができる。

細かい設定はできないけど、毎時、毎日何かをしたいというくらいであればscheduler addonで十分だし、他のaddonを使えば自分でサーバ管理してcron回すよりは安定して稼働させることができるだろう。

Addonの設定はapp.jsonではできなさそうなのだけど、こうやったらできるよーとかschedulerの設定を画面以外からやる方法を知ってる人いたら教えて下さい。

RubyKaigiのLTに採択されたのでCFLTの内容を公開します

せっかくなので、提出したタイトルや概要を公開しておきますね。

うまく埋め込まれない方はこちら -> RubyKaigi 2014 CFLT - kenchan

日本Ruby会議2011 CFP虎の巻 を眺めながら、頑張って書いたかいがありました。

8月に所属企業が変わったわけですが、前職と現職で2アウトしているようなポイントが結構あって、そういうのをなるべくオープンして行きたいと思って応募したのでした。(前職でも結構議論したし、現職でも議論しているような事柄)

死霊がんばるぞい。

tmuxの中でopenコマンドが実行できなくなっていた件

もともとは、capybaraの save_and_open_page でブラウザが開かない問題を追っていたら、どうもtmuxの中でopenがエラーになるということに気づいて調べていた。

$ open -a safari hoge.html
LSOpenURLsWithRole() failed for the application /Applications/Safari.app with error -600 for the file /Users/kenchan/hoge.html.

インターネットでは「tmux再起動したら治ったよ」みたいなのんきなコメントが散見されるなかで、他の人は同じ環境で問題なさそうなので、自分の環境をちゃんと見始めていたら、tmuxの亡霊が1つ生き残ってることに気づいた。

killall tmuxで成仏してもらったところ、今度は無事動くようになったのでよかったよかった。

現在時刻を扱うメソッドはデフォルト引数を使いましょうという話

GMOペパボ1ヶ月記念に、おそらく一番最初にコードレビューで伝えたことを書いておこうと思う。

まとめ

現在時刻を扱うようなメソッドには、デフォルト引数で Time.now を使って、外からも時刻を渡せるようにしましょう。

テストのため

2014年の今となっては、テストのために時刻の扱いを気をつけましょうという必要もない気がするけど、CodeIQの和田さんの解説にもあるように、システム全体の時刻をスタブしたりするのは多少のリスクが伴うと思う。

実行中に現在時刻が変わってしまう

問題は 複数の現在時刻を扱うロジックを連続で実行すると現在時刻が変わってしまう ということである。

1つのコード例は以下の通り。

class Article < ActiveRecord::Base
  scope :recents, -> { where('created_at > ?', 1.week.ago) }
end

class HogeController
  def summary
    @articles =  Article.recents.count
    @comments = Comment.recents.count
  end
end

大体の場合は問題無いだろうけど、例えば日またぎの場合や、ビューに「集計日時」みたいなのがあったことを想像してみてほしい。

別のケースとしてはこんなものもある。

class Article
  def recent?
    created_at > 1.week.ago
  end
end
%ul
  - articles.each do |article|
    %li= "#{article.title} #{article.recent?}"

これは、回しているうちに同じ結果を期待する複数のオブジェクト間で結果が変わってしまう可能性がある。

「そうなったときにリファクタリングすればいい」というのはそうなんだけど、大抵の場合はこういう使われ方をするので最初からデフォルト引数を使うようにしておいたほうがいいんじゃないかというのが実感としてある。

メソッド名はもっとよいものがある気がするけど、私がざっと書くなら最初からこんな感じ。

class Article < ActiveRecord::Base
  scope :recents, ->(now = Time.now) { where('created_at > ?', 1.week.ago(now)) }

  def recent?(now = Time.now)
    created_at > 1.week.ago(now)
  end
end

「AEP読書会 第十四章「イテレーション計画づくり」ふたたび」に参加します

たまたま上の方の階でAEP読書会 第十四章「イテレーション計画づくり」ふたたび っていうのをやるらしいので参加することにした。

一昨日くらいからちょうど読み直していて、AEP熱が再燃しているところなのでちょうどよかったし、15章のまとめを作る人がまだ決まってないとのことなのでやらせてもらうことにした。

定員はまだ余裕があるようだし、Yoursは大分快適なので興味のある方はぜひご参加ください。

新卒エンジニア向け勉強会に参加した

新卒エンジニアの教育カリキュラムの一つの「座学」というのに参加してきた。

いわゆる永和の「ありがたい話」みたいな感じで、先輩社員から1時間あるテーマについて話を聞いたり、実際に手を動かしたりする時間。

週に1、2回行われているんだけど、今日はネットワークのレイヤー2,3あたりの話ということで、そのあたりはさっぱりな感じなので聞きに行ってみたけど、新卒エンジニア向けとは思えない濃い内容で大変勉強になったのでした。

この辺りの話は、ホスティングをやっている企業だからこそ身近に感じれるので、そういう方向に進むかどうかはおいておいて、新しく来た人がちゃんと勉強できるというのはすばらしいですね。

ランチ英語勉強会

ペパボでは、木曜のお昼に英語の勉強会が開催されているので参加している。

テーマは時事問題みたいな非技術的なトピックで、1人1文ずつ読んでそれから訳すというスタイルなんだけど、文法を正しく解釈できているかを重視していてとても勉強になる。

ぱっと読んで訳せない文は、主語、動詞、修飾の関係を英単語のまま「て」「に」「を」「は」をつけて読んでみるという感じ。

英語弱者には辛い文も、あんちぽ先生を始めとする英語強者の皆様の解説がによって間違ったまま進んでしまうことがないので助かっております。

21日は、最近話題のALS バケツチャレンジの起源の話だった。

Who started the Ice Bucket Challenge? ALS Association's viral fundraiser has NY roots

ALSってなんなのーというあたりが単語がだいぶ難しいけど、まずは文法を理解してから、各単語を見ていくと確かに理解し易いなーという感じ。

Rails 4 で TimeWithZone#as_json がmsecを出してしまう問題

Rails3からRails4へのアップグレード業で、TimeWithZoneがmsecを持つようになったためにas_jsonでmsecが出力されてテストがたくさん落ちる事案が発生した。

今回はJSON APIのテストで時刻をすべて正規表現でチェックしていたのでほぼ全滅という有り様であった。

最初はモンキーパッチしてみてとりあえずテストが通ることを確認したんだけど、よく考えたらそれも変だよなーといろいろ見ていたらActiveSuppot::JSON::Encoding.time_precisionというのを見つけた。

config/initializers/json_encoding.rbみたいなところに

ActiveSuppot::JSON::Encoding.time_precision = 0

と書いて終わり。よかったよかった。

仕事のマシンがMacになった

所々の事情により、Macを普通にhomebrewで使い続けている。(3日目)

最初はGentoo Prefixを入れようとしたんだけど、ちょいとビルドで失敗したので、まずはhomebrewで仕事ができるようにしようという感じ。

さしあたり困っているのがCommandとCtrlで、特にターミナルでどっちがどっち?みたいなになってしまうのをなんとかしたい。

ただ、原因はキーボードの配列にもあって、私はKinesisの親指部分のキー配列をだいたい左右対称になるように配置にしているだよね。 で、一番押しやすいキーをCtrlに割り当ていたんだけど、そこをCommandにしないとあまりに大変なのでCommandにすると、今度はターミナルの時に「あっあっ」となってしまう…

Karabiner を入れてターミナルの中だけCommandとCtrlをひっくり返して何とか慣れようと試みているんだけど、Macの人はみんなこんな大変な使い分けをしていたのかと関心している。

あとはタイル型WMがあればいいんだけど、どれも今ひとつな感じで悩ましい。

郷に入れば郷に従えということで、しばらくはこんな感じで生活して見ようと思っているのであった。