くりにっき

フルスタックキュアエンジニアです

Agile Samurai Basecamp 2015.06 に講師として参加してました #agilesamurai

Agile Samurai Basecamp 2015.06 ふりかえり&TDD - Agile Samurai Base Camp | Doorkeeper

【事例紹介】週刊TDD(社内TDD勉強会)紹介

自分の週刊TDDのリポジトリ

https://github.com/sue445/weekly_tdd

当日の質問

覚えている範囲で

Q. 良いテストコードを書くにはどうしたらいいか?

  • 自分が思うよいテストコードは(JUnitだと)1つのテストメソッドで1つのassertだけしているテストケース
    • 1つのテストメソッドの中でいくつもassertを書いていると1つ直しても次のassertが落ちたりして全体でいくつのテストが落ちているのか分かりづらい
    • テストコードにも「単一責任の原則」を。(1つのテストケースで1つだけ責務を持たせる)
  • 良いテストコードを書くには本を読んだりOSSのテストコードをたくさん読む
    • OSSにPullRequestを送るにはプロダクトコードとセットにテストコードも送る必要があるので、そのプロダクトでどういうテストコードを書いてるか熟読することになる
    • 今まで自分が読んだのだとRubyでは RailsGitLab が一番テストコードが充実してて読んでてためになった

渋谷.rbでLTしてました #shibuyarb

渋谷.rb[:20141015] - Shibuya.rb | Doorkeeper

togetter : 渋谷.rb[:20141015] まとめ #shibuyarb - Togetterまとめ

話したスライド

過去エントリを短めにまとめたスライドです

プリキュアハッカソン2を開催しました #cure_hack

プリキュアハッカソン 2 開催してました

まとめ : http://togetter.com/li/710256

プリキュアオールスターズNewStageシリーズが完結したということでDX1からNS3まで計6本連続見ました。さすがに10時~21時はきつい(ノ∀`)

僕がやったこと

rubicure を0.0.7 -> 0.1.0に大幅アップデートしました https://github.com/sue445/rubicure/blob/master/CHANGELOG.md#v010

大きいところでは attack! メソッドの実装。

yayoi = Cure.peace

yayoi.name
#=> "黄瀬やよい"

yayoi.attack!
#=> RuntimeError: require transform


# 変身する
yayoi.transform!

# 1st transform
yayoi.name
#=> "キュアピース"

yayoi.attack!

プリキュア!ピースサンダー!!
  • rubyの慣習に従い*1破壊的メソッドなのでメソッド名の末尾に ! をつけています
  • 人間状態で attack! するとエラーになります

参加登録時のアンケートの集計結果

便利サイト

Party

人数入力するだけで必要なピザやビールの量と金額を出してくれるサイト。

撮った写真

かわいい #cure_hack

プリキュアハッカソン会場開いたシャル #cure_hack

仲間が増えた!

#cure_hack

プリキュアハッカソン

#cure_hack

ゆきのぶさんより響奏の差し入れを頂きました! #cure_hack

【追記】収支報告

ざっくりとですがこんな感じ。

内容 収入 支出
ピザLサイズ x 5 17175円
雑費      1190円
懇親会参加費 18000円*2
合計 18000円 18365円
  • アルコール類*3やソフトドリンクは会社で余ってたのを利用
  • 雑費 = ゴミ袋 x 10、紙コップ x 30、ウェットティッシュ、ソフトドリンク x 1
    • ゴミ袋は5枚でよかったかもしれない。。。

最終的に1人1000円で収支±1000以内でトントンでおさまりました。

パイン♥パッション

ドミノ・ピザで注文する時はパインとパッションのハーフ&ハーフがお勧めです(プリキュアクラスタ的に)

*1:物理的

*2:1000円 x 18人

*3:ビール・酎ハイ計20本

ドリコムのフライングゲットガチャの舞台裏 #ksgstudy

f:id:sue445:20140711005806p:plain

こんにちは、フルボッコヒーローズフラゲガチャの中の人です(でした)

一応メインエンジニアでした。(ぼっち)

本日 関西ソーシャルゲーム勉強会・2014夏 に登壇させてもらいました。

関西ソーシャルゲーム勉強会・2014夏 #ksgstudy - Togetterまとめ

その時に自分が関わっていたフライングガチャについて話したので資料を公開します。

最近他社さんでも弊社のフラゲガチャをパクったシステムをどんどん作っているようなので、もしよければ参考にしてみてください。(ここまで完全にRedisに極振りしてると逆に真似しようと思っても出来ないと思うけどw)

スライド

資料に書き忘れたこと

  • 資料内の表記ぶれてますが「リセマラガチャ=(フルボッコヒーローズの)フライングゲットガチャ」です
  • 「適当にインスタンスたてて適当にミドルウェア入れて適当に環境構築」できるまでにもたぶん1年くらいかかってます
  • 施策やRailsなどのバージョンは割と新しいですが、サーバサイドは割と枯れた技術しか使ってないと思います(弊社比)
    • さすがにここまで極端にredisに振り切ってはないと思うけどw
  • フラゲガチャ第一人者として他社さんの実装は興味深いです(主にTwitter認証周り)
  • ヒストリレコードをfluentdで送るだけだと管理画面から自由に見れなくて不便ですが、CSからのデータ抽出依頼は10件くらいしかなかったので期間短ければ運用でカバーできる件数
    • CSから自分のところにくるまでにふるいがかけられてるので実際はもっと件数多そうですが

【追記】ust録画

僕の発表は前半の14:40くらいからです

渋谷.rb でrubicureについて話した #cure_advent #shibuyarb

これは プリキュア Advent Calendar 2013 の19日目です

18日目

@さんの プリキュアに愛を伝えたくて #cure_advent : どっくりぽんかんじま でした

TLでプリキュアショー行ってる人は何人かいるけど、僕もそろそろ行くべきか。。。

19日目 : 渋谷.rb でrubicureについて話した

渋谷.rb[:20131218] で話した資料です。

内容は 16日目 の内容を社内LT大会にアレンジしつつ、さらに渋谷.rb用に加筆修正してます。

slideshare

謝辞

前回の Rubyでプリキュアを作った #cure_advent では初のはてブ100over取らさせて頂きました。ありがとうございます!

余談ですが、はてブ100overでも社内LT大会では優勝とは程遠かったです。。。

20日目

@ さんのこの雪城ほのかさんがかわいい - hyaknihyakの日記です

TDD Boot Camp 横浜 3rd に参加してました #TDDBC

TAとして手伝いに行ったはずがGroovyの人数が足りなくて急遽 id:yamap_55 さんとペアプロをすることになりました。

当日のリポジトリ

https://github.com/sue445/tddbc_yokohama_20131005

ペアプロの流れ

  1. gradleのバージョンが古すぎて gradle idea できなかったのでダウンロード
  2. 題1にとりかかる
  3. 途中までやったところで題2で作ったメソッドを元に題1をやった方がいいと判断し題1を後回しに
  4. 題2が終わって題1に戻る
  5. 題3をすすめる
  6. 題3が終わったところで残り10分だったので ネタで Travis CIと連携させてみることに
  7. 手順は GithubにあるリポジトリをTravis CI連携する手順 #junitbook - くりにっき を参照
  8. 「Github Travis」でググれば2番目に出てくるw f:id:sue445:20131006224543p:plain
  9. githubにpushした後にtravis側でテストが実行されるのに若干時間かかったものの、丁度10分で設定完了

IntelliJ IDEAで日本語テストメソッド名にするとテストが見つからない時の対処法 (Mac Mountain Lion以降)

PC再起動も必要とは思わなかったw

今回初めて知ったGroovyの豆知識

任意のクラスからbooleanへの暗黙的なキャスト

    static boolean isValid(String version) {
        try {
            parse(version)
        }catch(e) {
            false
        }
    }

    static JdkVersion parse(String version) {

Groovyだとreturnが省略できるのはもちろんだけど、 parse の戻り値は JdkVersion だがisValid の戻り値がbooleanなので勝手に

    return parse(version) != null

みたいなことをやってくれてるらしい

正規表現のキャプチャが楽

    static JdkVersion parse(String version) {
        def m = version =~ /^JDK([0-9]+)u([0-9]+)$/
        if(!m) {
            throw new IllegalArgumentException()
        }
        String strFamilyNumber = m[0][1]
        String strUpdateNumber = m[0][2]

rubyperl$1, $2 にはまだ負けるけど、素のJavaでやるのに比べたらすごい簡単

ちなみに似たようなことをJavaでやろうとするとこうなる https://github.com/sue445/kulib/blob/master/src/main/java/net/sue445/kulib/util/RegexUtil.java

as

        jdkVersion.familyNumber = strFamilyNumber as int

familyNumberintstrFamilyNumberString なのですが、Integer.parseInt しなくていいらしい

懇親会のLT

まとめ

Groovy素晴らしい

最後に

id:yamap_55 さんのおかげでGroovyについて初めて知ることが多かったです。ありがとうございます!

参考書籍

プログラミングGROOVY

プログラミングGROOVY

Rails Engineを単体でテストしてみる

Rails勉強会@東京 第86回 - Rails勉強会@東京 | Doorkeeper でしゃべった内容です

はじめに結論

子アプリが親アプリに依存しすぎているとテストするのはつらい

Jenkins用のスクリプト

元々は社内リポジトリに置いてたやつですが、需要がありそうだったのでマスキングして公開してみます 使いたい場合は適宜修正してください

スクリプトでやってること

  • Jenkins用のdatabase.ymlをコピー
  • 普通のアプリだと config/database.yml ですが、Rails engineのテストだと spec/dummy/config/database.yml が使われます
  • Rails Engineからは rake db:migrate はできないので子アプリ内に親アプリをcloneしてます
    • 構成
my_engine
└ tmp/
 └ parent_app
  • 親アプリでmigrationが更新されてることを考慮して rake db:migrate:reset
  • rake db:migrate:reset だと今度はEngineのmigrateが適用されなかったので*1、再度 rake db:migrate を実行
  • Engineアプリにcdしてようやく rspec を実行
    • 子アプリから親アプリのmodelを参照してる場合は適宜 spec/dummy/ にコピー*2

補足

Jenkinsのジョブ実行にシェルファイルを使えるのですが、シェルの中でエラーが起きてもそのままスクリプトが続行されてしまい、テストが失敗してもJenkins上は正常終了してしまうため*3、下記のようなラッパ経由でコマンドを実行してます

run()
{
  command=$1
  echo "$command"
 
  eval $command
 
  # if error code returned, exit this script with error code
  RET=$?
  if [ $RET -ne 0 ]; then
    exit $RET
  fi
}

*1:うちのアプリだけか?

*2:つらみある

*3:Jenkinsはシェルの終了ステータスを監視してる?