Quantcast
Channel: くりにっき
Viewing all 446 articles
Browse latest View live

「Groovy基礎勉強会」と「Nagoya.Testing in Tokyo 3 -アジャイルなテストの見積りと計画づくり」に参加してきました #GroovyBase #NagoyaTesting

$
0
0

Javaって静的型付けでリファクタリングしやすいしいい言語ですよね(オラクルを意識した挨拶)

というわけで2日連続でオラクルに行って来ました。

Groovy基礎勉強会 - connpass

つぶやきまとめ: 2013/03/09(#GroovyBase)Groovy基礎勉強会 - Togetter

  • 結論:基礎分からん
  • Groovyで自分がやりたいことについて方法が聞けただけで満足

Nagoya.Testing in Tokyo 3 -アジャイルなテストの見積りと計画づくり- #NagoyaTesting on Zusaar

つぶやきまとめ: Nagoya.Testing in Tokyo 3 -アジャイルなテストの見積りと計画づくり- #NagoyaTesting - Togetter

  • 結論:テスト分からん
  • 今まで直感でテストコードを書くことが多かったのですが、がっつりとテスト設計できたのはいい経験でした。
    • id:kyon_mmさんの思考の一端がかいま見えた気がしました。

LT

社内LT大会(未定)で資料を作っていたので、両日ともビアバッシュでLTをしてきました。

だいたいこんな感じです。



勉強会ドタキャン問題について

両日ともドタキャンが酷かったです。
半分がキャンセルって東京でもそうそうないんじゃないかなぁと。

詳しくは id:megascusさんのエントリを参照
Nagoya.Testingの裏方中 - 水まんじゅう

僕個人が勉強会主催経験というのがあまりない*1ので偉そうなことは言えないのですが、事前決済の有無に関してざっくり考えてみました。

事前決済を挟むメリット

  • キャンセルがあった場合でも参加費が徴収できる
    • 特にNagoya.Testingのように昼食に弁当が出るケースだと参加費が徴収できないのは痛いかと思います
    • 16〜17人来なかったので大赤だったという話
  • とりあえずポチって後から考えるということが(ある程度)回避できる
    • 人気のある勉強会だと椅子取りゲームになってる感があり
    • 勉強会によっては申し込み順に関わらず抽選というのもあるけどごく少数

事前決済を挟むデメリット

ほとんどのイベントサイトではPAYPALが使われていることが多いのでPAYPAL前提として

  • クレジットカードがないときつい
    • PAYPALはクレジットカード決済しかない
  • PAYPALが落ちると決済できない
    • 勉強会直前にPAYPALが落ちて決済できないってのが何回かあった気がw

事前決済があっても変わらないもの

  • 会場の広さに対して空きが明らかに多いと主催者や登壇者もちょっと嫌な気分になる
  • 来なかった人の分まで無駄な会場設営が発生する
    • 席程度ならいいんですが印刷物とかあった日には・・・
  • 参加費の徴収は事前決済で回避できるとしても、残った食料はどうしようもない
    • 胃袋は有限
    • ビアバッシュ形式なら当日にピザの枚数とか調整できるかもしれないけど、居酒屋でコースで予約してたらアウツ
      • 居酒屋で予約する時はだいたい前日までに人数確定しなきゃいけないし、直前に大量に人数が減ると店の人も困る(来ない客の分の席を確保していたのでその分の機会損失)

*1:あくまでスタッフとしては参加経験あるけど、主催はない


Jenkinsにスローテストのグラフを表示する

$
0
0

RSpecでは --profile オプションをつけることで

$ rspec --profile

Top 10 slowest examples (17.92 seconds, 65.4% of total time):
AndroidMarket use stub content behaves like android_market_base_examples #get_overall_top_selling_new_paid_apps
1.96 seconds ./spec/android_market_spec.rb:121
AndroidMarket use stub content behaves like android_market_base_examples #get_top_selling_paid_apps_in_category
1.94 seconds ./spec/android_market_spec.rb:92
 (略)

のようなスローテストのトップ10(ワースト10)を出すことができるのですが、これをJenkinsでグラフ化できたら便利かなぁと思ってスクリプトを書いてみました。

gist

使い方

1. JenkinsにPlot Pluginを入れる

2. Jenkinsでrspecを動かす時に標準出力をログファイルに出力し、それを前述の plot-rspec-slowest-examples.rb に読ませる。

通常だったら

rspec

ってやるところを

rspec --profile 5 > rspec-console.log
ruby plot-rspec-slowest-examples.rb rspec-console.log > plot-rspec-slowest-examples.csv

のようにします。profileの後の数字は出力する上位件数です。(デフォルトだと上位10件)

出力されたcsv
total,top 1,top 2,top 3,top 4,top 5,
8,1.67,1.59,1.59,1.58,1.58,

3. 上記で出力したcsvをplot pluginで読み込ませる

f:id:sue445:20130317015049p:plain

グラフ化した結果

f:id:sue445:20130315141739p:plain

テスト全体に対して1つだけ突出しているのがあればそこを見直すだけでスローテストを改善できると思います。*1

*1:既出かどうかは知らん

「TDD Boot Camp Tokyo 2013-03」に参加してきました #tddbc

$
0
0

TDD Boot Camp Tokyo 2013-03にTAとして参加してきました。

つぶやきまとめ:2013/03/16 TDD Boot Camp Tokyo 2013-03 #tddbc - Togetter

主催の id:katzchangさん、タダ酒を飲ませてくれた会場を提供してくださったVOYAGE GROUPさんありがとうございました!

ちなみ今回TAらしきことはそれほどやってないです(´・ω・`)
rspecリファクタリング方法を教えたのとプリキュアLTしたくらい)

TDDBCのお題

今回初見のお題(LTSV)だったので家に帰って自分でもやってみました。

sue445/tddbc_tokyo_20130316 · GitHub (ruby 2.0.0 + RSpec)

当日写真に撮ってたお題のスライドを文章に起こしているのでそれだけでも見る価値はあるかと。

あと、無駄にtravis.ciでもビルドを回してますw

Twitter API 1.1でも CI したい

$
0
0

以前LTでしゃべった内容をブログ用に再構成してみます

冒頭に結論

TwitterAPI 1.1対応は廃止されたAPIだけ対応してもダメ

ことの発端

AZusaar!!のテストにて

  • 1テストケースずつ ->GREEN
  • テストスイート一括実行 ->RED

という事象が発生

WHY ?

RateLimitに引っかかってた(;´Д`)

一度に同じAPIを大量に使うと規制される&Jenkinsのビルドも通らないorz

解決策

Groovy基礎勉強会で @さんに教えてもらったBetamaxを使った。

Betamaxって何よ?

テストケース中のhttp通信を全部yamlに記録するライブラリ。groovyで作られているので当然Javaからでも使えます

AZusaar!!でやったこと

pom.xml

betamaxとgroovyを追加

<project><dependencies><dependency><groupId>co.freeside</groupId><artifactId>betamax</artifactId><version>1.1.2</version><scope>test</scope></dependency><dependency><groupId>org.codehaus.groovy</groupId><artifactId>groovy</artifactId><version>2.1.2</version><scope>test</scope></dependency></dependencies></project>

テストケース

publicclass SomeTest{
    @Rulepublic Recorder recorder = new Recorder();

    @Betamax(tape="SomeTest#yourTest", match={MatchRule.uri})
    @Testpublicvoid yourTest() throws Exception {
        // do something
    }
}
  • テストメソッド単位でtapeの名前を一意にした
  • matchはyamlを読み込む時の条件(上記の例ならuriが一致したらそのyamlを読み込む)
  • 初回のテスト実行時にsrc/test/resources/betamax/tapesにyamlが保存されるので2回目以降はそれが参照される(READ_WRITEモード)
    • READ_WRITEモードの他にもWRITE_ONLYモードやREAD_ONLYモードもある
    • yamlをcommitしておけばjenkinsでも同じ結果を返せる

参考リンク

書いていて気になった点

  • テストクラスごとにRecorderやBetamaxをつけるのが冗長
    • テストケース全体の振る舞い (rspecにおけるspec_helper的なもの) を定義できればもっとシンプルになった。。。
    • Groovyでテストを書いていたらRecorderを継承した新しいRecorderを使えばBetamaxアノテーション自体不要になりそう
      • ただしそこまでやろうとするとテストのためのテストが必要になるのでちょっと重い
  • tape名にクラス名とメソッド名を書く方式だとTheoriesのようなパラメタライズテストに対応できない
    • Theoriesを1つだけだったのでそこは割りきってBetamaxを使わないようにした
  • RSpecに慣れすぎてJUnit面倒くさい
  • Javaだけでやるのが面倒くさい部分でGroovyを利用することでさっくり解決できるのは素敵。まさに万能接着剤!

重要なことなのでもう一度

TwitterAPI 1.1対応は廃止されたAPIだけでなくRateLimitも考慮しよう

参考書籍

API 1.1対応マダ-?

Twitter API ポケットリファレンス (POCKET REFERENCE)

Twitter API ポケットリファレンス (POCKET REFERENCE)

Ruleの使い方とか

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

社内でJenkins勉強会を開催しました

$
0
0

他の会社だと1つのJenkinsをみんなで使うという運用(な気がする)ですが、うちの会社の場合だと個人やアプリで好き勝手にJenkinsを乱立させてます。

他の人はどんな風にJenkinsを使ってるのかなーと思って何人かに声をかけて開催してみました。

登壇者は自分を含めて3人。参加者は20人くらい。勉強会初主催にしてはまぁまぁだったと思います。

唯一の心残りは、新卒がたくさん来ると思って資料を張り切ってたのですが新卒研修とかぶってしまったという(´・ω・`)

 

社内で使ったスライド(無修正版)に社外公開用に修正を加えたスライド(モザイク修正版)をslideshareにアップしたのでよければ御覧ください。

 

Railsアプリに特化してるので他の言語の方はどうもスミマセン

一緒に発表した @さんのエントリ

関連エントリ

おすすめ書籍

入門Jenkins―実践「継続的インテグレーション」

入門Jenkins―実践「継続的インテグレーション」

僕がJenkinsを立てようと思った時に丁度発売されたのですんごい助かりました!

Google App Engine上でgroovyスクリプトを動かす「GAErminal」を作りました #gaeja #nanohack

$
0
0

リリカルハッカソンで作っていたものを正式公開しました。

概要

GAE(Google App Engine) + Terminal = GAErminal (読み方:がーみなる)

Google App Engine上でgroovyスクリプトを動かすことができます
https://github.com/sue445/gaerminal

サンプル

f:id:sue445:20130420175006p:plain

利用用途

  • production環境上でモンキースクリプトを動かす
    • コード修正→随時デプロイだと効率が悪い
      • デプロイに数分かかる
      • デプロイすると上がってたインスタンスが全部落ちるので再度spin-upが走る
      • デプロイは1日1000回までしかできない
    • コンソール上で直接スクリプトを実行できると試行しやすい
    • 使い捨てのコードでテストを書くのはさすがにしんどいですよねw
  • Datastoreからのデータ抽出
    • がっつりプログラムを書くほどではないけどadmin consoleのGQLで抽出するにはしんどい場合とか
  • production環境上のデータ不整合を直接修正する

インストール

mavenを使ってるならpom.xml

<dependency><groupId>net.sue445</groupId><artifactId>gaerminal</artifactId><version>0.0.1</version></dependency>

gradleならbuild.gradleに

dependencies {
    compile 'net.sue445:gaerminal:0.0.1'
}

を書くのが手っ取り早いです。

mavenもgradleも使ってなくてjarが個別で欲しい場合は
Maven Central Repositoryからダウンロードしてください(別途groovy.jarも必要)

設定

web.xmlに下記を追記してください

<web-app><filter><filter-name>GaerminalController</filter-name><filter-class>net.sue445.gaerminal.filter.GaerminalController</filter-class><init-param><param-name>pathPrefix</param-name><param-value>/gaerminal/</param-value></init-param></filter><filter-mapping><filter-name>GaerminalController</filter-name><url-pattern>/gaerminal/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping><security-constraint><web-resource-collection><url-pattern>/gaerminal/*</url-pattern></web-resource-collection><auth-constraint><role-name>admin</role-name></auth-constraint></security-constraint></web-app>
  • <security-constraint>で認証をかけないとパスを知ってればアクセスできる状態になるので絶対に忘れないでください!
  • slim3を使ってる場合はFrontControllerよりも前にGaerminalControllerを書いてください
<filter-mapping><filter-name>GaerminalController</filter-name><url-pattern>/gaerminal/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping><filter-mapping><filter-name>FrontController</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>ERROR</dispatcher></filter-mapping>

あとはローカルでサーバを起動して http://localhost:8888/gaerminal/とアクセスして冒頭の画面が出れば成功です。

仕様

  • Grooxyの言語仕様に準じます。(早い話Javaならなんでも動きます)
  • ktrwjrCNMVと違ってwar配下への静的ファイルは不要
  • Google App Engine上で」とあるけど、appengineには依存してないのでJavaのwebアプリ上であればなんでも動くことに今更気づいたw

参考書籍

プログラミングGROOVY

プログラミングGROOVY

ゆとりさんステッカーを作ってみた #yutori_history

$
0
0

はじめに

これは ゆとり Advent Calendarの6日目です

ゆとり( @ )さん転職おめでとうございます!

6日目:ゆとりさんステッカーを作ってみた

ステッカーの詳しい作り方は いろふさんのステッカーを作ってみる #irof_historyを御覧ください

作ったもの

f:id:sue445:20130505001945p:plain
サイズが小さい分irofステッカーよりも省エネです

印刷してみた

http://instagram.com/p/Y48sImg5F5/
何を気が狂ったのか70枚ほど作ってしまったのでゆとり系勉強会に持って行きます

でもやっぱり

irofさんの方がもーっと好きです!
http://instagram.com/p/Y4-Z51g5Hn/
メタリックなirofさんもステキ

RubyMineのシンタックスハイライトがすごかった件について

$
0
0

f:id:sue445:20130525222012p:plain

おわかりいただけたろうか?



分からなかった人のためにもう一度

f:id:sue445:20130525222113p:plain

RubyMineはヒアドキュメントの識別子によってさらにシンタックスハイライトができる模様。
1つのファイル内で複数のシンタックスハイライト適用されるエディタなんて初めて見たよ。。。*1

せっかくなのでいろいろ調べてみました

HTML

f:id:sue445:20130525222424p:plain

JavaScript

f:id:sue445:20130525222515p:plain

JSONもいけました
f:id:sue445:20130525222632p:plain

もちろんRuby

f:id:sue445:20130525222718p:plain

Java, Groovy

f:id:sue445:20130525222756p:plain

無理だった(´・ω・`)

Gist

普通はファイルの拡張子を元にシンタックスハイライトされるので、ヒアドキュメントは普通の文字列として解釈されます。

結論

RubyMineはすごかった

*1:自然すぎて最初全然気づかなかったw


GithubにあるリポジトリをTravis CI連携する手順 #junitbook

$
0
0

『JUnit実践入門』写経・実践会 in 横浜 #7のハンズオン用。

このエントリではJava(Groovy)について書いていますが他言語でもだいたい同じです。

前準備 : MavenかGradleでテストできる状態にあるプログラムをGithubに公開する

1 : Travis CIにアクセスする

https://travis-ci.org/の右上からGithubアカウントでログイン
f:id:sue445:20130527230858p:plain

2 : 自分の名前→Accountsでリポジトリの一覧が出る

f:id:sue445:20130527231038p:plain

3 : スイッチをOFFからONに切り替える

f:id:sue445:20130527231331p:plain

Github側も勝手に連携される
f:id:sue445:20130527231524p:plainf:id:sue445:20130527231527p:plain

Tokenも全部設定されてるSUGEEEEEEEEEE!!!!!!!!!!1111111111

4: リポジトリのルートに設定ファイル( .travis.yml )を置く

f:id:sue445:20130527234302p:plain

Java

language: java
jdk:- openjdk6
  - openjdk7

Groovy

language: groovy
jdk:- openjdk6
  - openjdk7

前処理や後処理などをやりたければ下記を参照

http://about.travis-ci.org/docs/user/build-configuration/

  1. before_install
  2. before_script (複数設定可能)
    • JUnitで言うところのsetUp
    • 設定ファイルをコピーしたりとか
  3. (Travisがcloneしたリポジトリにcdする)
  4. script
    • これがなければTravisが勝手に判断してくれる(例:pom.xmlやbuild.gradleを実行)
  5. after_script (複数設定可能)
  6. after_success / after_failure
  7. after_script
    • JUnitで言うところのtearDown

注意点

  • テスト時にコマンドが複数必要なら &&でつなげるかshellで書く
    • after_script で失敗してもテストは成功扱いになるため (before_scriptも?)
  • JDKが複数指定できるのは便利だが、微妙に重いのでたまにテストがタイムアウトする
    • 1つでもタイムアウトしたらエラーになってアラートメールが飛ぶw

5 : githubにpushするとTravisでテストが動くはず

f:id:sue445:20130527233138p:plain

6 : readmeにバッジを貼る

Status Images
f:id:sue445:20130527233410p:plain

readmeのフォーマットに応じたものをコピペする
f:id:sue445:20130527233505p:plain

7 : ペタリ

f:id:sue445:20130527233712p:plain

Travisのバッジがあることが一種のステータスになってる気がします。(有名どころのライブラリはだいたいこれがついてる)

おまけ : ここがすごいよTravis CI

Pull Requestがあったらそのbranchに対してテストしてくれる
f:id:sue445:20130527233902p:plain

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

JUnit実践入門 ~体系的に学ぶユニットテストの技法 (WEB+DB PRESS plus)

新卒向けLT大会で意識の高いLTをしました

$
0
0

ドリコム社内で「先輩から新卒エンジニアの皆さんへ」という新卒向けLT大会があったので意識の高い発表をしました。

技術的なLTやネタLTはよくやりますが、エンジニアとしての生き方について語ったのはたぶん初めてだと思います。

ちなみに @さん、 @さん、@さんと言った頭のおかしい人達による計7人による発表でした。*1

お前らLTなんだから長々と話すなw

スライド

 

新卒からあった質問

Q. 新卒が読んでおくべき本は?

A. 気になった本全部読んでればいいんじゃないかなw
本を読んだら脚注とかに「~から引用」とかあるのでその辺を辿るとか、Twitterで話題になってるのかたっぱしから読むとか。
 
質問コーナーでは言いそびれたけど、勉強会でよく取り上げられる本は読んどくべき
達人プログラマやクリーンコード辺りは頻出。こういう本がその界隈での共通言語になってる

達人プログラマー―システム開発の職人から名匠への道

達人プログラマー―システム開発の職人から名匠への道

  • 作者:アンドリューハント,デビッドトーマス,Andrew Hunt,David Thomas,村上雅章
  • 出版社/メーカー:ピアソンエデュケーション
  • 発売日: 2000/11
  • メディア:単行本
  • 購入: 42人 クリック: 1,099回
  • この商品を含むブログ (344件) を見る

Clean Code アジャイルソフトウェア達人の技

Clean Code アジャイルソフトウェア達人の技

Q. (sue445は) 1年目に何冊くらい読んだ?

の上2~3段と
くらい。1年目は言うほど読んでないです。
当時は会社の制度で資格取るのが推奨されてたのでそっちの勉強が多かったです(Oracle Master BronzeとSJC-Pは1年目で取ったけど、簿記3級と応用情報は受けたけど落ちた(´・ω・`))

Q. 1冊を全部読み切って次の本にいくのがのがいいか?それとも少しずついろいろ読み進めるのがいいのか?

A. 自分は全部読み切ってから次の本を読むことが多い。読んでる最中に新しい本が出てそっちに流れちゃうけど、そういう時は戻ってきた時に内容を忘れてるのでおすすめしない。
あと写経する時はほんたったおすすめ

EDISON ほんたった黒(ハードケース入り)

EDISON ほんたった黒(ハードケース入り)

 

資料について補足

  • いろいろ語りたいことはありましたが、時間が限られていたので「本を読め」について重点的に話してます
    • 1回のLTにあまり内容を盛り込みすぎると論点がぼやけるのでやりたくない
  • 今期の嫁と本妻について
    • ボーナスで買いました(・∀・)

大事なこと

 

*1:僕はただのプリキュアヲタです

TDDBC福岡にTAとして参加してきました #tddbc

$
0
0

繁忙期は飛行機が高いので帰省ついでに行って来ました。

LTについて

1日目と2日目にそれぞれやってました

1日目:Travis CIについて

ほとんどのチームがGithubで開発してるということで、Githubとの親和性の高いTravis CIの紹介をしてました。

参考:GithubにあるリポジトリをTravis CI連携する手順 #junitbook - くりにっき

2日目:Groovy + Spockについて

Groovyが1チームもいなかったので昼食を食べながらGroovyで課題をやってみました。
https://github.com/sue445/wikiengine-spock

JUnitでもParameterizedやTheoriesを使えばParamerize系のテストはできますが、Spockだと断然見やすいですね

class WikiEngineSpec extends Specification{
    def"format(#line) == #expected"(){
        setup:
        def sut = new WikiEngine()

        expect:
        sut.format(line) == expected

        where:
        line                    | expected
        "_italic_"              | "<i>italic</i>""*bold*"                | "<b>bold</b>""= Heading ="           | "<h1>Heading</h1>""== Subheading =="      | "<h2>Subheading</h2>""=== Level 3 ==="       | "<h3>Level 3</h3>""==== Level 4 ===="     | "<h4>Level 4</h4>""===== Level 5 ====="   | "<h5>Level 5</h5>""====== Level 6 ======" | "<h6>Level 6</h6>""_italic_ and *bold*"   | "<i>italic</i> and <b>bold</b>""other string"          | "other string"
    }
}

https://github.com/sue445/wikiengine-spock/blob/master/src/test/groovy/tddbc/WikiEngineSpec.groovy

あと、GroovyのPowerAssertの結果も見やすいです

Condition not satisfied:

sut.format(line) == expected
|   |      |     |  |
|   |      |     |  <h1>Heading</h1>
|   |      |     false
|   |      |     1 difference (94% similarity)
|   |      |     <h1>Heading( )</h1>
|   |      |     <h1>Heading(-)</h1>
|   |      = Heading =
|   <h1>Heading </h1>
tddbc.WikiEngine@658782a7

	at tddbc.WikiEngineSpec.format(#line) == #expected(WikiEngineSpec.groovy:18)
groovyの特徴

LTではspockとPowerAssertの素晴らしさしか紹介できなかったのでその他のgroovyの特徴を紹介しておきます

  • メソッド名をStringで定義できるため、Javaのメソッド名の制限*1にとらわれることがない
  • セミコロンを省略できる
  • チェック例外は非チェック例外にラップされるため、テストメソッドに throws Exception を書かなくていい
  • switch文に正規表現リテラルを渡せる
String format(String line){
        switch (line){
        case ~/_(.+)_/:
            return line.replaceAll(/_(.+)_/, /<i>$1<\/i>/)
        case ~/\*(.+)\*/:
            return line.replaceAll(/\*(.+)\*/, /<b>$1<\/b>/)
        default:
            return line
        }
    }

https://github.com/sue445/wikiengine-spock/blob/76decd61e8976b61f2e2335dd4cc67707ed03758/src/main/groovy/tddbc/WikiEngine.groovy

  • mapの記述が簡単
  • rubyでお馴染みのeachやinjectが使える
String format(String line){
        def wikiFormats = [
                /_(.+?)_/                 : /<i>$1<\/i>/,
                /\*(.+?)\*/               : /<b>$1<\/b>/,
                /======\s*(.+?)\s*======/ : /<h6>$1<\/h6>/,
                /=====\s*(.+?)\s*=====/   : /<h5>$1<\/h5>/,
                /====\s*(.+?)\s*====/     : /<h4>$1<\/h4>/,
                /===\s*(.+?)\s*===/       : /<h3>$1<\/h3>/,
                /==\s*(.+?)\s*==/         : /<h2>$1<\/h2>/,
                /=\s*(.+?)\s*=/           : /<h1>$1<\/h1>/,
        ]

        wikiFormats.inject(line){ work, entry ->
            work = work.replaceAll(entry.key, entry.value)
            work
        }
    }

https://github.com/sue445/wikiengine-spock/blob/91f960e4f7aafad8ebd854652e900b1b72c47cfc/src/main/groovy/tddbc/WikiEngine.groovy

個人的振り返り

  • TDDBCのKPTで毎回「環境構築に時間がかかった」というProblemが上がっていたのですが、前回のTDDBC東京以降有志で協力して GithubのTDDBC Organizationでスケルトンをいくつか作っていたため、今回はそういうProblemはほとんど上がってなかった *2
    • forkしてcloneしていくつか環境設定用のコマンドを叩けばすぐに課題を始められる状態になるため、TDDと関係ない部分でハマる要素が1つなくなったのでスケルトンを用意してよかったと思います
    • githubのnetwork graphを見るだけでどんなチームがどんなコードを書いたのかひと目で分かるのがいいですね
    • Javaのスケルトンを作ってくれた @さんありがとうございます!
    • スケルトンがなかったPHPやObjective Cに関しては正直スマンカッタ
  • AZusaar!!を知ってる人がいてよかったw
  • 土日遠征する場合は前後に休みをいれるべき(反省)

*1:先頭に数字が使えない、ドットなど一部の文字が使えない

*2:Keepにも「スケルトンがあって便利だった」というのは特に上がってなかったけどw

Ruby 1.9と2.0でArray#shuffleの結果を同じにしたかった

$
0
0

Rubyで使用されている乱数は Mersenne Twisterというもので、同じseedを与えれば同じ乱数を生成してくれます

1.9.3p429 :001> Random.new(445).rand
 => 0.64326146120497292.0.0-p195 :001> Random.new(445).rand
 => 0.6432614612049729

この間1.9系と2.0系に対応したライブラリを書いていたのですが、rubyのメジャーバージョン間でArray#shuffleの結果が変わっていたので戸惑いました

1.9.3p429 :002> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].shuffle(random: Random.new(445))
 => [4, 2, 10, 8, 6, 5, 3, 9, 1, 7]

2.0.0-p195 :002> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].shuffle(random: Random.new(445))
 => [8, 10, 6, 7, 5, 1, 3, 2, 9, 4]

seedが固定されて同じ乱数が返ってきているハズなのに、なぜかshuffleした結果が違うという。。。

調べてみたらruby 2.0で Array#shuffle の実装が変わっているようでした

配列をランダムにシャッフルするという意味では多少結果が違っても問題ないのですが、自分は暗号化のライブラリを書いていた関係でseedを固定してもruby 1.9と2.0で Array#shuffle の結果が変わるというのはちょっと困りました。(1.9で暗号化したものが2.0で復号化できなくなるため)

しょうがないので、rubyのCの実装を見ながらrubyに再実装するというわけの分からないことをしましたw *1

とりあえずこれでRuby 1.9と2.0で同じ結果を返すようになりました。めでたしめでたし

1.9.3p429 :037>  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].my_shuffle(Random.new(445))
 => [8, 10, 6, 7, 5, 1, 3, 2, 9, 4]

2.0.0-p195 :038 >  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].my_shuffle(Random.new(445))
 => [8, 10, 6, 7, 5, 1, 3, 2, 9, 4]

補足

配列をランダムにシャッフルするなら

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10].sort{|a, b| random.rand(-1.0 .. +1.0)}

というのを考えると思いますが、これだと再現性はとれても結果に偏りが出てしまうのでダメです

参考URL: ランダムソート(笑)とは - 西尾泰和のはてなダイアリー

*1:ちなみに同時期にPythonC#のサンプルコードをrubyで書き直すということをやってたのでCは余裕だったw

社内でGit基礎勉強会を開催しました

$
0
0

Gitの基礎*1について詳しく紹介した勉強会がないなぁと思い、試しに社内で開催しました。

勉強会で使った資料

https://github.com/sue445/git-base-study

社内Gitlabからcloneしたのをgithubにpushした時に一部バイナリデータが壊れていますorz

Gitの履歴を履歴管理する

$ mkdir git-base-study
$ cd git-base-study/
$ git init
Initialized empty Git repository in ~/git-base-study/.git/
$ cd .git/
$ git init
Initialized empty Git repository in ~/git-base-study/.git/.git/

Gitの各コマンドが実行された時のローカルリポジトリの変化を説明するのに分かりやすい方法を模索していたら最終的にこれに行き着きました。*2


Gitって便利!

先述のリポジトリでもgitの1コマンドに対して1コミットの粒度でコミットを作っているため、リポジトリの状態変化がgithub上でdiffをとりやすいのではないかと思います。

勉強会の反応

社内で告知した時に「日常的にGitを使ってる人対象。」とは言ってたので中級者以上はきてたと思うのですが、それでもみんなポカーンとしてました。

基礎の恐ろしさの片鱗を伝えられたのは良かったですが、勉強会主催する側としては失格ですね。。。

*1:入門の方ではなく、いわゆる名古屋の人たちが使う方の基礎

*2:これを思いつく前の資料は半分以上はtreeコマンドの実行結果でした

ドリコムに入社して1年経ちました

$
0
0

退職エントリや転職エントリはよく見るけど転職して1年経ちました系はあまり見ないので書いてみます

お仕事

社内ツールとかいろいろ作っています。

ソーシャルゲーム開発だと数10人でチームを組んで開発しているのですが、自分の所属してるチーム(ソーシャルゲームや分析系の基盤)だと細かい案件を1〜2人くらいで回すことが多いです。

自分の場合はマーケティング部関係の雑用お手伝いすることが多いです。アプリを作ることもあればLPをサーバにアップロードしたり、マーケがやりたいことの技術検証とかやってます。

自分の仕事の性質上あまり表に出ることはないのですが、最近だと ファンタジスタドール ゲーム公式サイトの事前登録のシステム全般見ています。

お仕事以外

  • 業務以外でもツール作成
    • Jenkins Gitlab Logo plugin
      • Gitlabで設定されているアイコン*1をJenkins上で表示するためのプラグイン。Custom Job Icon PluginのGitlab版
  • 社内勉強会開催
  • 社内LT大会で発表
    • 四半期ごとくらいでLT大会が開催されて、面白かった発表には「カリスマ」、ためになった発表には「総帥」の称号が授与されます

書いたテスト

入社時に


とか言ってしまったので、1年間でどれくらい書いたか数えてみました。

Jenkinsの Ruby metrics pluginで計測しています。(仕事で書いたアプリだけカウントしてます)

種別 test counts 開発人数 1人あたりのテスト数 Total lines Line of code Total Coverrage (%) Code coverrage (%)
Railsアプリ 265 1 265 1968 729 97.31 92.73
Railsアプリ 92 2 46 575 244 92.17 81.56
gem 168 1 168 1133 291 98.76 95.19
gem 36 2 18 287 148 98.26 96.62
gem 9 1 9 111 49 97.3 93.88
gem 22 1 22 320 149 99.38 98.66
Railsアプリ 140 1 140 1212 532 97.69 94.74
Railsアプリ 166 1 166 1918 819 89.21 74.73
Railsアプリ 353 2 176.5 2051 1000 89.86 79.2
Railsアプリ 345 1 345 3049 1226 93.41 83.61
Railsアプリ 103 1 103 647 290 93.04 84.08
1596 1355.5 12624 5187 平均95.34% 平均89.09%

2人で開発してたものに関してはテストの総数 / 2 して換算していますが、それでも1年間で1000個以上テストを書いていました。

自分のデスク

こんな感じでもみんな生暖かい目で見守ってくれます

http://instagram.com/p/Z9hli4g5NR/

http://instagram.com/p/a-AKCPg5Av/

http://instagram.com/p/YGq3AAA5I-/

*1:弊社のGitlabはBitbucketみたいにリポジトリ単位でアイコンが設定できるようになってます

アニメ実況実践入門


RSpec Performance Turning

$
0
0

社内で開催されたRSpec勉強会テストのパフォーマンスチューニングについて話したので資料を公開してみます。

RSpecの名は冠しているものの他の言語やテスティングフレームワークでも応用できるところがあるかもしれません。

 

8/3追記:はてブコメント返信

テストのテストにはテスト対象を使えばいいんでしょうか。

場合によりますね。

 

基本的にはテストコードとテスト対象のプロダクトコードはペアであるはずなので、テストにバグが混入したとしても対応するテスト対象が変更されていなければテストがなんらかの形でエラーになるので、そこで検知できると思います。

 

テストコードのリファクタリング(共通処理をメソッド抽出など)は、既存のテストが品質を担保してくれてます(グリーンのままであればリファクタリング成功)

 

0からテスト書く場合でテストのテストが必要になるほど複雑なことは極力やらないようにしてます。ちゃんとテストされているサードパーティ製のライブラリを使ったり、最初はシンプルな形で作っておいてそこから少しずつリファクタリングするようなアプローチをとってます。

 

あと@moritzplassnigさんが英語版ないの?って言ってた 
「レベルを上げて物理で殴ればいい」ってどう表現すればいいんだろw

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

$
0
0

リリカルハッカソンに触発されて開催しました

事の発端

リリカルハッカソンの後で勢いが高まってDVD発売されたタイミングでやろうと決心。 社内ワークフロー申請を出す辺りで若干躊躇してましたが、勢いで申請w

作ってたもの

kpt-itを社内に立てたくなって、Forkしてごにょごにょしてました。 ローカル上では動いて社内のOpenStackで環境構築してる最中で終了。

弊社のOpenStackについては下記を参照

OpenStackでつくる開発環境と外道塾 発表資料 | 外道父の匠

反省点

懇親会の食料と飲み物の配分をミスった

  • 飲み物が多すぎて、ピザが少なすぎた
  • ビール24本入りをなぜか12本入りと勘違いして2ケース注文してた(どう考えても懇親会参加者19人でプレモル48本は多すぎた)
  • ピザはサイズを特に考えずに注文してたら、ピザMサイズ6枚だと1人辺り3切れ程度にしかならなかった
  • 有識者曰くピザはLサイズ1枚で2.5人くらいとのこと
  • 事前に@さんに TDDeXchange in Tokyoの時の発注数を聞いて参考にしたのですが、あまり生かせてなかった
  • 今回初のイベント主催*1だったのでその辺のノウハウが足りなかったですorz
  • 次回以降イベントを開催する場合にはもっと改善したいです

空調調節ができなかった

  • 寒すぎたり暑すぎたり
  • 社内を見まわったけど見つからなかったので詳しい人に聞きます

謝辞

慣れないイベント運営を気づいたらサポートしてくれていた id:megascusさん、@さんありがとうございます!

*1:スタッフの一員としてやったことはあるけど、社外向けの勉強会を1人で開催というのは今回が初

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

$
0
0

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=$1echo"$command"eval$command# if error code returned, exit this script with error codeRET=$?if [$RET-ne0];thenexit$RETfi}

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

*2:つらみある

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

2ちゃんねるビューア を途中解約した

$
0
0

忙しい人のためのまとめ

auto@2chv.tora3.net にIDを添えてメールすればいつでも退会できる

忙しくない人のための経緯

数年前に年中書き込み規制を喰らってるプロバイダ*1を引いてしまったため●を使ってたのですが、先日の個人情報流出事件を受けて解約することにしました。

ただ、ヘルプ

解約はどうすればいいの?
 
クレジットカード決済の方は自動更新のご案内が届きましたら、メールにてご連絡ください。
コンビニ・金融機関(ビットキャッシュ)決済は解約には手続きはありません。
契約の有効期限を過ぎれば自動で無効になります。

また、解約には手数料はかかりません。

を読んでも途中解約できるかどうか判断に困ったので、途中退会できるかどうかメールで問い合わせてみました

サポートからのメール

メール送って3日くらいして返信きた

お世話になっております。2ちゃんねるビューアサポートです。

退会手続きが完了いたしました。
解約されてもIDはお申し込み・更新より1年間有効です。
有効期限が切れた後は、自動的に使えなくなります。
 
退会は従来より、いつでもお受けしております。
また途中解約などの手数料はございません。

とのことで、メール送ればいつでも途中解約できるっぽいです

*1:OCN丸の内

パーフェクトRubyを読んで気づいたことをまとめた

$
0
0

渋谷.rbで橋立先生(id:joker1007)からサインをいただいて感想を書いてないことを思い出したので、読んでる時に書きためていたメモをまとめてみます。

Enumerable#each

succが定義されているクラスじゃないと eachできない (Rangeが内部的に succを呼んでいるため)

2.0.0p247 :001> 1.succ
 => 22.0.0p247 :002> "a".succ
 => "b"2.0.0p247 :003> (1.0).succ
NoMethodError: undefined method `succ' for 1.0:Float  from (irb):3  from /Users/sue445/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>'

Enumerable#grepと Enumerable#select

違いがよく分からなかったのだけど、 grepが値を評価して selectがブロックを評価するという認識でおk?

2.0.0p247 :001> %w(Heart Diamond Rosetta Sword Ace).grep(/r/i)
 => ["Heart", "Rosetta", "Sword"]
2.0.0p247 :002> %w(Heart Diamond Rosetta Sword Ace).select{|str| str =~ /r/i }
 => ["Heart", "Rosetta", "Sword"]

Enumerator

外部イテレータを使えば2つ以上の配列を同時に回せる

people = %w(Heart Diamond Rosetta Sword Ace).to_enum
ages   = [14, 14, 14, 14, 10].to_enum

loopdo
  person = people.next
  age    = ages.next
  
  puts "#{person} (#{age})"end#=> Heart (14) Diamond (14) Rosetta (14) Sword (14) Ace (10) を順番に表示

Set

Set#add?Set#delete?の戻り値はbooleanでは ない

追加(削除)できた場合には変化後の集合を返し、追加(削除)できなかった場合にはnilを返す

RubyGems

gemの挙動を調べるためにデバッグコードを仕込んでも gem prinstineで元に戻せる

Bundler

  • bundle gem -b でbin/ を作成
  • bundle gem -t でspec/ を作成。
    • .travis.yml も生成するとかマジか。。。
  • capistranoやsimplecovみたいにアプリ側でrequireしないものはGemfileでrequire: falseしておく
gem "capistrano", require: false

Capistrano

beforeafter以外にもhookがあった http://rubydoc.info/github/capistrano/capistrano/master/Capistrano/Configuration/Callbacks

YARD

RDocも便利なんですが、柔軟性がありすぎてフォーマットがあまり統一されていないのが難点。(自分で書いてても結構ぶれるw) 自分がJavaの人だからというのもありますが、タグをつけるYARDの方が書きやすかったです。

ところでメソッドの戻り値が特定のフォーマットの Hashの場合ってどう書けばいいでしょ?*1

# @return [Hash] 下記のようなHashを返す# @example 戻り値のサンプル#   {#     name1:  value1 # 1つ目の説明#     name2:  value2 # 2つ目の説明#     name3: value3 # 3つ目の説明#   }#

こんなんでいいものなのかどうか。うぅむ。

サイン本

∩( ・ω・)∩

橋立先生からパーフェクトRubyにサインもらった! #shibuyarb

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

*1:Javaだとレスポンス用のクラスを作るのでそのクラスに対してJavaDocを書くためメソッドの方のJavaDocには何も書かなかった

Viewing all 446 articles
Browse latest View live