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アウトしているようなポイントが結構あって、そういうのをなるべくオープンして行きたいと思って応募したのでした。(前職でも結構議論したし、現職でも議論しているような事柄)

死霊がんばるぞい。

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

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

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で成仏してもらったところ、今度は無事動くようになったのでよかったよかった。

「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があればいいんだけど、どれも今ひとつな感じで悩ましい。

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

永和システムマネジメントを卒業してGMOペパボにjoinしました

永和システムマネジメントには、新卒で入社してから7年と4ヶ月お世話になりました。

永和のこと

学生時代に、キングファイルに綴じられたクラス名が連番になっている詳細設計書からプログラムを作成するバイトで精神を削られ、「まともなソフトウェア開発がしたい!」と会社を探している中で永和を見つけ、運良く入社できたことはとても幸運でした。

入社してからはお客様、プロジェクト、チームメンバーにも恵まれ、もう二度とやりたくないと思うような仕事は1つもなかったように思います。もちろん、全てが納得できる仕事ではありませんでしたが、個々のプロジェクトという単位でみると、何かしらの楽しみや自身が成長できたという実感があります。

どこの馬の骨かわからない学生を雇い、ここまで成長させてもらったこと、大変感謝しています。みなさんありがとうございました。

なんで辞めんの?

受託開発オワコン〜なんていうつもりは全くなくて、前述の通り、永和はこれからも真摯にソフトウェア開発と向き合っていくでしょうし、そこに何らネガティブな感情はありません。

1つは、私はたまたまBtoCサービスの開発のお手伝いが多く、その中でもっとサービスの開発と運営に深くコミットしたい、という気持ちが強くなったということ。もう1つは、お客様(とそのサービス)、自社、コミュニティに対する力のかけ方のバランスが崩れてきていると感じ始めてきた、というのが言語化できる理由でしょうか。

あとは、いい年だし転職の経験くらいしてみたいというのもちょっとだけありました。

GMOペパボのこと

技術基盤チームのメンバーと一緒やってみたいというのはもちろんありましたが、社長がGithubを使いこなしていたり、人事の人がスクラムについて書いていたりと、技術職以外の人も技術について明るく、そして大切にしているというのが外から見ていても伝わってくるというが決め手でした。

また、今の自分の能力で貢献できること(アジャイルな開発とRuby)と、新しく学べることのバランスも良さそうとも感じました。

で、なにすんの?

配属は技術基盤チームというところで、世の中を「もっとおもしろくできる」ようにがんばっていこうと思ますので、今後ともよろしくお願いします。

何かしら応援したいという方のために一応おいておきますね。

Wishlist

鎌倉旅行2日目

二日目は、まずは息子のお目当ての新江ノ島水族館へ。

到着してすぐイルカのショーの時間だったみたいで急いでいったら一番前の端っこが運よく空いてたのでだいぶ楽しめたっぽい。

思ったより食いついていたのはウミガメと、ちょっと前だったら怖がって触らなかったナマコとかヒトデとかだった。いろいろなことに興味がでてきたようでなにより。

ゆっくり見てたらいい時間になったので、砂浜でちょっとおやつをつまんで、鎌倉から津田沼まで一気に帰ってきてしまった。

実は今回、奥さんが一番(?)行きたがっていたっぽい「くずきり みのわ」が定休日で行けなかったので、また機会があったら今度は水着も持ってきてもいいかな。

久々の家族旅行を満喫できたので明日からもがんばろう。

7月にあったこと

ここ2週間くらいでいろいろあったのでまとめて書いておこう。

7/18 福井出張

3年に1回ほど社員全員が集まるイベントがあって、それで福井まで行ってきた。 入社した当時の上司の取締役とゆっくり話せたり、久しぶりの同期に挨拶したりとよい感じであった。

夜は例年通りひどい感じでそれも大変よかった。

あとは、福井の駅前はポータルがたくさんあってしかも高レベルの人があまりないようだったので大変はかどった。

7/20 お祭り

市内の保育園、幼稚園の子供が参加するパレードがあったので同伴を。

息子は終始真剣に(?)サンバを踊っていたので楽しめたのかと心配だったけど、後から聞いたら楽しかったらしい。

7/25~26 みむらさんとクロスにいった

みむらさんクロス行きましょうグッズの売り上げがそれなりなものになったのでみむらさんとクロスにいった。

他にもいろいろあったのだけど、最後は磯丸支社で4人でただひたすら始発をまっておわった。

鎌倉旅行1日目

一泊二日くらいでどこかに旅行に行くかーという話をしたら、近場でかつ奥さんと息子の両方の行きたいところがありそうな鎌倉に行くことになった。

お昼くらいに鎌倉について、まずはイワタコーヒーでパンケーキ。おいしゅうございました。

その後は鎌倉駅周辺をぶらぶらしてから大仏方面にいってからホテル(鎌倉パークホテル)へ。

大仏周辺は観光客優勢なので、ポータルの守りも弱くて大変捗った。ただ、それ以外の地域は青の守りがかなり堅いので緑の人はレベル7くらいじゃないと相手にならない雰囲気。

水着を持ってこなかったので由比ガ浜で足だけ海に入って、奥さんの遠征もかねて藤沢までいってShonan Pastaというお店で晩御飯を食べて終了であった。

ガンプラ作った

誕生日プレゼントでもらったガンプラを作った。

息子に見られながら、素組み+ガンダムマーカーで墨入れだけしたかんじ。

以下、わかったこと。

100均のニッパーはゴミ

本当に使いものにならない。結局細いライナーも全部カッターで仕上げた。

墨入れペンはなんだかんだいって全種類あったほうがいい

筆ペンのグレーと普通のやつの茶色だけ買ってみたんだけど、せめて普通のタイプの黒とグレーはあったほうがよさそう。

白以外のパーツにヤスリをかけてはいけない

そもそもガンプラも久し振りだし素組みも久し振りなので忘れていた。たまたま関節のグレーのパーツで気付いたので大事にはならずに済んだ。

エアブラシほしい

よろしくおねがいします。

散髪ログ

前回からは二ヶ月ちょっとくらい。

なぜか息子が美容院を気にいってしまい、今日はお前じゃないんだよと言ったら泣きそうになっていたが、奥さんにあずけていってきた。

「Gentoo Linux インストール 後 座談会」を中止します

台風接近のため、今週土曜日に開催予定だった Gentoo Linux インストール 後 座談会 を中止することにしました。

ある所の調査では「Gentooの9割はインストールに使われている」という調査結果がでているとかでていないとか言われていますが、Gentooを使い続けている一番の魅力はportageだという人も少なくないと思います。

ただ、慣れれば使いやすいものの、最初は「ブロックされた!」「ビルドエラー!」「コンフリクト!」とか結構解決するのが大変な問題があったり、いざ自分でebuild書いてみようと思ったけどどうしたらいいかわからない、みたいな感じで私自身も困ったので(そして今も困っている)、このあたりの使い続けるための情報をみんなで共有できたらなーと思っていました。

(あと、毎月のGentoo勉強会になんだかんだ都合があわなくて行きたいけど行けてないというのもあり…)

というわけで、ちょっと寝かせるにはもったいない企画だなーと思っているので、まずは社内でこっそりやることにしました。

また機会があればちゃんと開催したいと思います!