privateメソッドのテストについての考え方 #yochiyochirb

よちよち.rbに久しぶりに参加した。

yochiyochirb.doorkeeper.jp

今日の回はjnchitoさんがゲストとして招かれていて、あれこれ質問できるという会だった。 「昔からよちよち.rbに参加してくれてる人も是非」と言ってもらったので参加させてもらった。

jnchitoさんといえば、今でもRSpecのまとめ記事やRubyの新しいバージョンのまとめ記事はよく拝見するし、 自分がある程度RSpec書けるようになったのは、jnchitoさんらが翻訳された「Everyday Rails - RSpecによるRailsテスト入門」に支えられたところもあり、 お話してみたいと思っていた。

それもあって、最近職場で話して他の人の意見も聞いてみたいと思っていたことを、事前にアンケートフォームから質問として投げた。

もちろん「書くべきではない」という意見が支配的であることは知っている。 ただし、原則として書くべきでないという前提の上で、それでも書きたくなるケースなどにどうやって対応するのかというのを聞いてみたかった。

事前に、運営をやってくれていたyuki3738さんが、僕の質問を見て「コード例などあるとうれしい」という言葉をくれた。 確かにそのとおりだなぁと思いつつ、そもそも、よちよち.rbに今メインで来ているプログラミングを始めたばかりの方にとっては、「原則として書くべきでない」といったことを前提にするのも不親切かと思い、それならと説明用のスライドを作った。

今日は、それを使いながら質問をさせてもらった。 (他の質問は、運営の方たちがつくった「質問まとめスライド」で済んでいたので、結果的に「自己顕示欲がすごい質問者」みたいになってしまった)

作ってみて思ったが、特定ドメインにしか通用しないようなコードを避けつつ、自分の意図を反映させる、サンプルコードを書くというのは難しいなと気がついた。 技術書とか書いてる人たちすごいなぁ。

いただいたお答えとしては以下のような感じだった。

加えて「原則書かない方がいいんだから、それを緩和する方針はいずれにせよチームでコンセンサス形成することが大事」ともおっしゃっていたように思う。

一方で、改めて考えると、自分はこういうスタンスだなぁと言語化できた。

このツイートと同様のスタンスの方からリプライいただいたりもした。

もちろん、質問しておいてjnchitoさんからもらった答えを否定したいわけではないし、今日の会でも「自分もpublicにしちゃった」という方はいたので、大事なのはおっしゃるように結局チームでのコンセンサス形成かなって感じもする。

また、懇親会でお聞きした別の興味深かった意見としては「たとえ小さな処理でも、必ずclassに切り出す」というものだ。 その方は、そもそも小さな処理をチェーンしやすくする interactor というgemを勧めていて、小さな処理でも都度classに切り出すことを躊躇していないと言っていた。

github.com

Railsなどに依存しない小さなgemでこういう仕組みを使うのはおもしろいと思った。

改めて、今日の運営のyucao24hoursさん/yuki3738さん、会場提供のSansanさん、そしてjnchitoさん、ありがとうございました。

--2019/3/4 0:43追記--

Twitterでtakeshinoda氏とやりとりしていて、スライドのコードに、今回の主旨と関係ない意図せぬダメダメコードがあったことに気がついた...。 スライド12ページ目こうなっていたところ、

# データ加工といってもこの程度ならclass切り出さなくてもいいのでは?
data
  .group_by(&:first)

  .sort
  .map { |key, values| [values[0], values[1]] }

意図してたのは、こう書くべきだった。

processed_data = data
                    .group_by(&:first)

                    .sort
                    .map { |key, values| [values[0], values[1]] }

13ページ目も同様に、ここは

data = Hoge::DataAggregator.aggregate
process_data(data)
Hoge::S3Sender.send(processed_data)

こうしたかった。

data = Hoge::DataAggregator.aggregate
processed_data = process_data(data)
Hoge::S3Sender.send(processed_data)

スライドを今から修正して上げ直すのはどうなんだ的な感じがするけど、主旨と関係ないところで混乱させるミスなので修正した。

--2019/3/4 1:11追記--

id:sinsoku さんが自分ならこうするというコードをご自身のブログにあげてくれていた。

sinsoku.hatenablog.com

社内でコーヒー淹れる環境をちょっとだけ良くしたLTをした

同僚から「久しぶりに社内でLT大会をやろう」という話を年末にもらって、上のスライドを使って発表をした。

今日の発表は、「DEMOと称して実際にコーヒーをドリップしながら、スライドはKeynoteiPhoneからRemoteで操作して発表する」ということをやったらおもしろいかなと思ってやってみたのだけれど、今思うとちょっとかっこつけすぎてたかなと思う。
とはいえ、楽しかった。
AWS Iotボタン、気軽で楽しいなぁ。2500円はちょい高いと思うけど。


ちなみに、デブサミで発表の機会をもらった、今まで運営していた社内LT大会はさすがに参加人数/発表人数が少なくなってきて、しばらくお休みしている。
そういえば、そのときの発表資料もこのブログに載せてなかったので、せっかくだから載せておこう。


www.makuake.com

↑これで手に入れたCODE COFFEE、今のところSwift→C→Javaときて、今回のRuby開封した。
CとJavaはおいしかった。

Swiftはこのとおりである。

ちなみに会社でのコーヒー文化についてはnoteにも書いた。

https://days.livesense.co.jp/n/nf27834be8dcc

コーヒーを淹れること自体が好きなので、仕事中のリラックスになっている。

新卒採用イベントで京都に行った

というタイトルで記事を書くつもりだったが、先にこれを書いてしまった。

https://days.livesense.co.jp/n/nef6eb6d712cfdays.livesense.co.jp

社員の日常が伝わるような気楽な/気軽な情報のストックを作りたいという、創業者の"精度高い思いつき"に乗っかり、livesense daysというnote上のマガジンに記事を追加したかたちだ。

桂さんの思いについては、詳しくはこれに書いてある。

https://days.livesense.co.jp/n/n79fde29f398adays.livesense.co.jp

僕は(悪い意味で)変にまじめなところがあり「"daysっぽさ"を重視して、肩肘張らないようにするぞ」という肩肘の張り方をしてしまったような気もする。

ひとまず、noteでのマガジンはあれこれ手探りで手探りでやってみて、ある程度継続できそう/定着できそう/意味ありそうという感覚を持てたら正式な共有をするのだと思う。

さて、京都の話だが、うちの会社では「採用イベントで遠方に行く際は前泊OK」ということになっていて(たぶん)、それを利用して前日の朝から京都に乗り込み、散々観光して写真を撮ったというかたちだ。 採用イベントで学生の方と話すのは楽しいし、本当に自分が学生の頃に持っていなかった優秀さを感じられて刺激を覚えるのだが「25分×10コマの面談を行うのはしんどい」という揺るぎない本音もあり、バランスとるためにも遠方開催の場合は目一杯楽しむことにしている。(とはいえ、同様のプレゼンテーションを繰り返さなくてはいけない、学生の方が大変だろうなという思いはあり、本当に頭が下がる思いがある)

祇園〜八坂や

嵐山を散策した。

予習として、Nasneに録画したっきりになっていたブラタモリの京都回を計6回分見るといったことを行ったので、地形や歴史について思いを馳せたりすることができた。

写真にハマっている

気が向いたので久しぶりにブログを書いてみる。

社会人1年目のときにNikon D7000を買って、それなりに写真が好きで、レンズもいくつか安いものを買い足したりしていたのだけど、とうとう去年くらいからフルサイズが欲しくなってきていた。 当初はNikon D850を考えていたのだけど、ある日家電量販店で「憧れのカメラD850に、憧れの大三元24-70mm」という状態でディスプレイされてるのを見て、意気揚々と持ち上げたらその重さに辟易してしまい、それ以降、今後のカメラステップアップをどうやっていこうものかと考えていた。

そんな中、今年の3月頃に、Sonyがミラーレスでフルサイズ一眼を出していて、評判もいいことを知った。 また、今度出るモデル「α7iiiは、これまでの連射性能やバッテリーの持ちや操作系といった、不便な点を解消してきた間違いないモデル」といった評判を聞くにつれ、欲しい気持ちが高まった。

おもむろにツイートしたら想像以上にバズった。

その後、Spreadsheetに資金計画などを書き、晴れて妻の許しもらって、購入に至った。

その後、会社に支援してもらって、

アメリピッツバーグで行われたRailsConf 2018に行く機会があったり

made.livesense.co.jp

仙台で行われたRubyKaigiに行く機会があったり、

と、撮影のチャンスに恵まれた。

当初はキットレンズ(f3.5-5.6 28-70mm)と撒き餌単焦点(f1.8 50mm)を手に入れて「高い買い物をしたのだし、しばらくはレンズを買い足さずに50mmという画角でいろいろな写真を撮り、うまくなろう」と思っていたのだが、人間とは恐ろしいもので、「旅行など再訪することが難しい場所に行くときに、任意の焦点距離をサッと選べないのは不便だし、そういうときに明るいズームレンズがあったほうが良い」というロジックで、キットレンズを売ってTamron A036(f2.8 28-75mm)を購入した。

やはり明るいズームレンズは正義で、会社のブログ用写真を撮る名目で開発合宿にカメラを持っていき、75mmで人が発表している様子を撮影した後に、晴海埠頭に行って広角で夜景を撮るといったこともできた。

そんな感じで、僕がいい感じに写真沼に浸かっていると「俺も浸かってるよ」「俺も浸かりたい」などと言ってくれる仲間たちが現れはじめて、休日に数人で家電量販店に押し寄せて機材を一緒に購入してから街でスナップを撮るなどやっていて、楽しい。

購入してからそろそろ半年になり、撮影枚数はだいたい8000枚くらいになった。 ひとまずSynologyのNASにつっこんだうえで、バックアップとしてjpgとrawをPrime Photosに、観賞用にjpgを圧縮してGoogle photosにアップロードしているが、いい感じに自分の作品(と言えるレベルのものでものないのだが)のみをどこかに置いておきたいなとも考えている。 ひとまず、500px に何枚かupしてみた。 このへん引き続き模索しつつ、たまにブログにも写真など載せたいと思う。

よちよち.rb の開発合宿に行った #yochiyochirb

9/4(金) - 9/6(日)で、よちよち.rbの開発合宿に行った。

行き先

マホロバマインズ三浦さん。 弊社の開発合宿でも過去に使われたらしい。

会議室あり / 温泉あり / 卓球場あり / 雀卓あり / 駅近し / コンビニ近し / 海近し

って感じで、すごくよかった。

よちよちの開発合宿について

詳細はこちら -> Doorkeeper

よちよちで開発合宿をやるのは、去年に引き続き2回目。去年は熱海の山喜旅館さん。ちなみに去年の開発合宿で僕が作ったのはこれ。

highwide.hatenablog.com

合宿では各自が自分の好きなことをやればいいということになっていて、みんな各々のことをやってた。

タイムスケジュール

1日目

時間 やったこと
- 20:10 会社でインターン生と飲んでた
20:30 品川駅集合
21:15 - 22:30 京急線ウィング号でトイレ我慢してた
23:00前 宿到着
23:00 - 2:30くらい ハリガリとか厨二UNOとかニムトとかカードゲーム大会

※ハリガリ

ゲーム ハリガリ フルーツゲーム<AMIGO社 ドイツ>

ゲーム ハリガリ フルーツゲーム<AMIGO社 ドイツ>

2日目

時間 やったこと
6:30 奇跡的に目が覚めた
7:30くらい 朝食バイキングでとろろご飯食べた
9:00 - 12:00 設計についてあれこれ相談させてもらった
12:00 - 13:00 昼食 (牛丼)
13:00 - 13:30 卓球 (海に行ってる人もいた)
13:30 - 18:00 コード書いてた
18:00 - 19:00 夕食 (お重に入ったあれこれ)
19:00 - 21:30 話したり、お風呂入ったり
21:30 - 23:00 とみーさんとペアプロでテスト書く
23:00 - 3:00 厨二UNOとかニムトとかカードゲーム大会

※厨二UNO (僕らが勝手にそう呼んでいる)

Gods' Gambit~神々の一手~

Gods' Gambit~神々の一手~

3日目

時間 やったこと
8:00 絶望的な起床
9:00 - 10:30 テスト書き上げる
10:30 - 12:00 各自成果発表して撤収
12:30 駅近くでマグロ丼
13:00前 帰りの京急線乗り込んだ

僕がやったこと

最近とみーさん(@ta1kt0me)と shibaph というWebアプリを遊びで作っていて、そのコードを書いた。

shibaphは、僕がGitHubのcontributions graphが好きなので、それ使ってタスク管理とかできたらおもしろいかなというアイデアで始まったもの。Rails4で書いてる。

4月に転職してコードを書ける仕事に就けた喜びを噛みしめる一方で、仕事ってコード書くだけじゃないなって改めて思ったり、今の自分が価値発揮できるところがコード書くだけじゃなかったり、って感じだったので、合宿では「コード書くことに集中しよう」ってなんとなく決めてた。 きっと仲いい人たちとみんなで合宿すると楽しくなったり、雑談も弾むだろうなと思いつつ、僕はあんまりマルチタスクの遂行が上手でないことを自覚しているので、「一つのことをうまくやる」精神で臨んだ。

あとは、同僚が、プロコンの大会やハッカソンで2-3日ぶっ通しですごいコードをすごい量書いてすごい結果を収めているのを、すごいなぁと思っていたので、集中できる空間で集中してコード書くと、今の自分がどの程度できるのか確かめたかった。

結果

f:id:highwide:20150911004119p:plain

f:id:highwide:20150911003911p:plain

「上ででかいこと書いたわりに、めっちゃカードゲームしてんじゃんww」ってのはさておき、個人的には集中してコードが書けたと思ってるし、その一方で今の自分に書けるのはまだまだこんなもんかぁと思い知らされた気持ちもある。

難しかったこと

元々は、グラフをViewが描画しやすいように「ARモデルをValueとしたHashの、Array」っていう構造をControllerのprivateメソッドで作っていたのだが、呼び出すところでいちいちその構造を意識しなくてはいけないのがダルくて、呼び出され方をメソッド化した中間ClassをControllerで作ってViewに引き渡すようにした。 その際の中間ClassってRailsのディレクトリのどこに配置すべき?とか結構悩んだ。(結局Modelに置いた)

あと、「趣味プロジェクトなんだし使ったことない技術を使おう」と採用したminitestの書き方を調べるのにも時間がかかった。 (RSpecが書けるとは言っていない)

とはいえ

コード書くのも、みんなと話したり遊んだりするのも、楽しかった!

ありがとうございましたーー!!!

YAPC::Asia行ってきた

行ってきました。 初カンファレンス。とても楽しかった。 以下、観たやつとか。

8/21(木) 前夜祭

行けるかなって思ってたら行けなかった

8/22(金) 1日目

ビッグサイトの長いエスカレーター素敵だった。

Merry Christmas (Larry Wall) ※敬称略

  • Perl5とPerl6の関係は「ホビットの冒険」と「ロードオブザリング」の関係に近い。
  • 言語を作ることは物語を紡ぐことに似ているってなんか素敵だなと。
  • 中学生のときに観たロードオブザリングのことなんとなく覚えててすごく助かった。
  • 同時通訳すげーって思った。
    • 日常の言葉と、技術的用語と、トールキンの作品のことを正しく訳をわけるのほんとすごい。
  • Perl6、リリースできそう、よくわかんないけどなんかすごそう。
    • Perl6でのフィボナッチの書き方、ちょっと意味わかんなくておもしろかった。

Effective ES6 (teppeis)

  • とってもわかりやすくて、勉強になった。
  • あーーー、ES6のことちゃんと知らなきゃな―って思いながら放置してたので、「スライドで説明してもらう」っていう受動的なスタイル取れるの大変ありがたかった。
  • ES6素敵感やばいので、今のJavaScriptあんまり勉強したくないなとすら思ってしまった。
  • この前、「え、素のjsにArray#each的なのないの!?」ってテンパったので、早くES6触りたい。
  • 「バベっていこうぜ」って印象的だった。

TBD (matz)

togetter.com

  • Perl書けないし、参加前の時点で一番のお目当てのセッションだった。
  • To Be Determined かと思いきや違った。-> Toward Brain-aware Design
  • Rubyの一番反省している点は、Perlの影響」めっちゃ笑った。
  • 一方で、質疑で「Rubyの99.8%はイケてる」的なこと言ってたのなんかいいなぁって思った。
  • 「今日はRubyの話は封印」 -> 「封印を解く」めっちゃ笑った。
  • たぶんこのYAPCで一番笑った。
  • ハードウェアの進化による言語の変遷とてもおもしろい。関数型が注目集めてるのもマルチコアとかでの並列化とか背景にあるし、いろいろ考えたい。
  • Streemの考え方、やっとわかってきた。おもしろい。
  • もっとシェルの考え方身につける必要あるなと思った。

Conway's Law of Distributed Work (Casey West)

  • リモートワークの話。
  • CAP定理を組織にあてはめるっておもしろかった。
  • 「全員がオフィス通えるロケーションにいる」って中でリモートやる価値あるかどうかとか気になった。
  • 「リモートやりたいならまずは一週間とにかく試してみろ」的なの、やってみたい。

Podcasting, Media for Web Engineer, and CPAN (yusukebe)

  • Podcastのテクニカルな話ガッツリ!って感じだった
  • 意外と始めるコスト低いんだなとわかった
  • エンジニアのYoutuber的な感ある。始めるのは簡単だけど、人集めるのと、継続するの大変そう。

LT

  • PHPの闇の話印象に残ってる
  • うちのSlackにいる小野寺小咲さんと会話したいなと思った。
  • 株式会社ネコトーストラボさん覚えた。

タイムテーブルの事情とか、満員だったりで聞き逃したので、あとで読むシリーズ

こうやってまとめると、結局見たいのだらけだった感じだ。


疲れたし、長くなったので、2日目はまた別途書きます。

すっごい小さなところからOSSにコントリビュートした

以前、職場の人が、あるjsライブラリのGitHubリポジトリ

「nodeだけじゃなくて、bowerでもinstallできるようにしてくれよー」(英語)っていうissueをカジュアルに立てていて、

「気負わずにOSSにissue立てたりする姿勢尊敬しますー!」と言ったら、

Rubyのコミュニティとか参加してたら結構そういう人いるんじゃないですか?」と言われた。

「初心者向けのコミュニティ(よちよち.rb)ということもあって、やっぱりハードル高く感じちゃいますね。今Railsにコントリビュートしてるのは僕が知ってる限りだと2人です(※)」 と答えると、

「いや、Railsへのコントリビュートはレッドオーシャンなんで、もっと別のOSSをターゲットにしたほうがいいですよw」と言われたことがすごく心に残っていた。

「なるほど、コントリビュート○貞を捧げるのはRails以外が良さそうだな」とそれ以降思っていて、期せずしてそのチャンスが今月2回もあったっていう話。

※よちよちでRailsのコントリビュートしてるのは僕の知ってる限りだと @yuki3738 さんと @5t111111 さん。
@yuki3738 さんがコントリビュートした経緯はこちらに -> 新米エンジニアがRailsにコントリビュートした話 - スパイスな人生

つくって学ぶプログラミング言語

300近いはてブ数を集める、達人出版会から出ている「つくって学ぶプログラミング言語 RubyによるScheme処理系の実装」という本、実は前職の先輩が著者なので、わかんないことがあったら直接聞ける的安心感もあって、仲間内で読書会をやっていた。

たまたま、読書会中に @katorie さんが「本のとおりに書いていると動かないかも」という箇所を発見し、「PR出しましたよー」って僕から直接伝えられるメリットもあるなと思い、自分が本のGitHubリポジトリにPRを出す流れとなった。

とは言ってもコード的には、カンマを1つ消すだけなので1バイトの修正でしかない。

github.com

さらに言えば、リポジトリの管理者は知り合いなのであって、「初めて他人が管理するリポジトリにPR投げる」って意味では心理的ハードは最大限に低いはずなのだけれど、やっぱりPR送る瞬間はそれなりに緊張感があったw

そんな緊張とは裏腹にあっさりマージしていただいて、晴れて「つくって学ぶプログラミング言語 RubyによるScheme処理系の実装」のコントリビューター(と言っていいのだろうか??)になることができた。
少なくともGitHubのContributions Graphには載った。

f:id:highwide:20150729022204p:plain

autodoc

仕事でRuby 1.9系のAPIをいい加減2.x系にしたいねって話があって、それにあたってドキュメンテーションを改めてきちんと行った上で、Ver. up後の動きを確認したいねってことになった。

そこで、 r7kamura/autodoc が使えるかもって話になったものの、 autodocを bundle install したあとにテストが必ずErrorになる事態に陥った。

当然最初はgemを疑う前に、自分たちのAPを疑ったものの、どう見てもautodoc内のラムダあたりでsyntax error吐いてるしなぁと思い至る。

そこで試しに、vendor/bundle配下のautodoc gemを直接、 arrow記法が使われてたlambdaのsyntaxを -> から lambda に変えてみると動いた!

むむ、これは本格的にgemのラムダ周りが怪しいのかもしれないと思って、ググってたらとうとうこんな情報を見つけた。

ruby-journal.com

えええ〜、Ruby 1.9系と2.0系だと、 -> と引数の ( のあいだにスペースあると動かないの...マジで!?
と思いながらも、スペース消すだけだしなと思って、「プルリクチャンス」だと思うことにした。

ここも、r7kamuraさん、日本人だし、(あちらは僕のこと知らないけど)僕はRebuild.fmでrubotyとか作ってる人だって知ってるし...って感じで多少心理的ハードルは低かったように思う。

というわけで、7/27に出したPRを早々に7/28マージしていただいて、ご丁寧に CHANGELOG.mdthx @highwide とまで書いていただいた。(嬉しかった)

github.com

ただし、こちらもスペース消すだけなので、1バイトの修正w

そんなわけで

結果的に、7月はOSS2つに、計2バイトのコントリビュートができたw
ただし、単純なコントリビュートが常に善かというとそういうわけではなくて、OSSのメンテナさん的に「逆に対応がめんどい」みたいなこともあるらしいと聞いてはいる。
でも、そのへんの話はケースバイケースだったり、メンテナさんの考え方次第的なところもあるとは思う。
というわけで、個人的にはこんな感じで経験積んで、ときにはリジェクトされたりしながらも、使っているOSSにカジュアルな貢献ができるようになればいいとは思っている。

蛇足

autodocに出したPRがマージされた7/28が自分の誕生日で、ちょっといい誕生日になったなと思った。