自作gemをダウンロード数が多い順に紹介

# 自己紹介
* sue445
* [ドリコム](http://www.drecom.co.jp/) 所属
    * サーバサイドをアプリからインフラまで浅く広く
    * 最近 http://dabimas.jp/ （ダビスタスマホゲームの公式サイト兼事前予約サイト）作りました
        * Ruby 2.3.1 + Rails 5.0.0.1
* 好きなエディタは Vimと [RubyMine](https://www.jetbrains.com/ruby/)
* 好きなプリキュアは [キュアピース](http://dic.pixiv.net/a/%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%94%E3%83%BC%E3%82%B9)

---
# My profile
https://rubygems.org/profiles/sue445

![image](https://qiita-image-store.s3.amazonaws.com/0/8059/7401c13b-3bca-47b4-0eb2-a8ee4633a720.png)

---
* 最近はペース落ちたけど社内外合わせるとだいたい月1個ペースでgemを新しく作ってる :gem:
  * ググって見つからなければとりあえず作ってる
* 今回はrubygems.orgのダウンロード数が多い順に上からいくつか適当に紹介
  * [rspec-parameterized](https://github.com/tomykaira/rspec-parameterized) は他の人が作ったgemなので省略 [^rspec-parameterized]

[^rspec-parameterized]: メンテナなので自分のプロフィールページにも載ってる

---
# rubicure
https://github.com/sue445/rubicure

* プリキュアのRuby実装
* 他言語の実装は [プリキュアの各言語での実装まとめ - Qiita](http://qiita.com/sue445/items/b41a4f5bdca46f1736c3) を参照

---
## よく分かるサンプル
![maho_girls.gif](https://qiita-image-store.s3.amazonaws.com/0/8059/83f909e1-207f-0b97-424a-c41d6e2d2173.gif)

https://github.com/sue445/rubicure/blob/70aad9c325419afb744e625f52ff3d530e90d14d/examples/maho_girls.rb

---
## よく分かる解説
プリキュアのタイトルを出力

```ruby
puts Precure.maho_girls.title
#=> 魔法つかいプリキュア
```

`Cure.xxxx` でインスタンスを取得

```ruby
@mirai = Cure.miracle
puts @mirai.name
#=> 朝日奈みらい
```

キュアップ・ラパパ！で変身 [^transform!]
自分自身が変化する破壊的メソッドなのでRubyの慣習に則ってメソッド名の末尾に `!` がついています

[^transform!]: 全シリーズ共通なのは `transform!` ですが、シリーズ固有の変身名乗り（例：Go!プリンセスプリキュアだと `princess_engage!`）も全てサポートしています

```ruby
@mirai.cure_up_rapapa! :diamond
# キュアップ・ラパパ！　ダイヤ！
# ミラクル・マジカル・ジュエリーレ！
# ふたりの奇跡！キュアミラクル！
# 魔法つかいプリキュア！！
```

変身すると名前が変わります

```ruby
puts @mirai.name
#=> キュアミラクル（ダイヤスタイル）
```

`attack!` で必殺技を出します
敵を攻撃する破壊的メソッドなのでRubyの慣習に則ってメソッド名の末尾に `!` がついています

```ruby
@mirai.attack!
# リンクルステッキ！
# ダイヤ！永遠の輝きを私達の手に！
# フルフルリンクル！
# プリキュア・ダイヤモンド・エターナル！
```

`humanize!` で人間に戻ります
自分自身が変化する破壊的メソッドなので（ｒｙ

```ruby
@mirai.humanize!
puts @mirai.name
#=> 朝日奈みらい
```

魔法つかいプリキュアでは変身の時に使うリンクルストーンの種類によって別の形態に変身することができます

```ruby
@mirai.cure_up_rapapa! :ruby
# キュアップ・ラパパ！　ルビー！
# ミラクル・マジカル・ジュエリーレ！
# ふたりの奇跡！キュアミラクル！
# 魔法つかいプリキュア！！

puts @mirai.name
#=> キュアミラクル（ルビースタイル）

@mirai.attack!
# リンクルステッキ！
# ルビー！紅の情熱よ私達の手に！
# フルフルリンクル！
# プリキュア・ルビー・パッショナーレ！
```

---
# paraduct
https://github.com/sue445/paraduct

* paraduct = parallel（並行） + parameterize（パラメータ表記） + product（掛け算の積）
* JenkinsでTravis CI的なマトリクステストをやりたくて作った、
  * 詳しいこと：[渋谷Ruby会議01でParaductをエクストリームリリースしました #428rk01 - くりにっき](http://sue445.hatenablog.com/entry/2014/11/02/011635) 

---
* 最近は [Yaml Axis Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Yaml+Axis+Plugin) をメインで使ってる。（コアのコードもRubyからGroovyに移植）
  * 詳しいこと：[Jenkinsを使った最高のマトリックステスト（2016年版） - くりにっき](http://sue445.hatenablog.com/entry/2016/02/03/120148)
* Werckerでitamaeプラグインのパラメタライズドテストをやるためにparaductを一瞬使ったが、Workflowが便利なのでそっちに寄せた

![20160811002700.png](https://qiita-image-store.s3.amazonaws.com/0/8059/d0e5a52a-2861-201b-e660-1324dbe87bb9.png)

---
# heart_seed
https://github.com/sue445/heart_seed

* xlsxをyamlに変換して、yamlを `db:seed` するためのgem
* 最新バージョンのDL数が1500くらいなのでそこそこ使われてるっぽい感ある
* 詳しいこと：[heart_seedというマスタデータDB投入用のgemを作りました - くりにっき](http://sue445.hatenablog.com/entry/2014/07/10/115219)

---
# rspec-temp_dir
https://github.com/sue445/rspec-temp_dir

* テストコード中で一時ディレクトリを手軽に作るためのgem
* プロダクトコードでファイルを作ってるような場合に、出力先を `temp_dir` にしていればわざわざ `after(:each)` でファイルを消す必要がなくなって便利
* 詳しいこと：[rspec-temp_dir をリリースしました - くりにっき](http://sue445.hatenablog.com/entry/2014/06/15/003737) 

---
# fluent-plugin-out_chatwork
https://github.com/sue445/fluent-plugin-out_chatwork

* ChatWorkに投稿するためのfluentプラグイン
* 雑にwebhookを受けて雑に通知するのにfluentdとtd-agentが便利だったので、GitLabのwebhookを社内のChatWorkに流すために作った
* 詳しいこと：[fluentd初心者がgitlabとChatWorkを連携してみた - くりにっき](http://sue445.hatenablog.com/entry/2014/06/29/094035)

---
# activerecord-simple_index_name
https://github.com/sue445/activerecord-simple_index_name

* Railsでデフォルトのindex名からテーブル名を抜いて短くするためのgem
* 詳しいこと：[【今月のgem】activerecord-simple_index_name を作った - くりにっき](http://sue445.hatenablog.com/entry/2015/11/29/210843)
* 大元の実装は [ActiveRecordのデフォルトのインデックス名が長いのが気になる - Qiita](http://qiita.com/kamipo/items/6e5a1e238d7cc0611ade) だけど、Rails 5対応で `prepend` 使うようにした

---
## Example
```ruby:db/migration/create_user_stoks.rb
create_table :user_stocks do |t|
  t.integer :user_id,    null: false
  t.integer :article_id, null: false
  t.timestamps null: false
end

add_index :user_stocks, [:user_id, :article_id]
```

* activerecord-simple_index_name無し： `index_user_stocks_on_user_id_and_article_id`（４３文字）
* activerecord-simple_index_name有り： `user_id_and_article_id`（２２文字）

---
# index_shotgun :fire: :gun: :cop:
https://github.com/sue445/index_shotgun

* 不要なインデックスを検出するためのgem
* 名前の由来は [SQLアンチパターン](https://www.oreilly.co.jp/books/9784873115894/)
* pt-duplicate-key-checkerとだいたい一緒だけどactive_recordベースなのでMySQL以外でも使える
  * MySQL, PostgreSQL, SQLite, Oracle対応
* 詳しいこと：[index_shotgunを作った #omotesandorb - Qiita](http://qiita.com/sue445/items/72faa7a352e7c0fc4e07)
* 最近だとビルドスクリプトに組み込んで、不要インデックスがあったらPullRequestの時点でビルドが失敗するようにしてる
* 面白い試みとして、Travis CIとWerckerを両方使ってる
  * Travis CIだとOracleが使えない
  * Oracleのインストールが超絶面倒くさいので、Oracleインストール済のDockerfileをWerckerで使ってる

---

# One more thing
gem開発の知見はだいたいここに全部書いた

* [gemを作る時に気をつけていること - くりにっき](http://sue445.hatenablog.com/entry/2015/05/07/003905)
* [githubでgemを公開する時に使いたいバッジ - くりにっき](http://sue445.hatenablog.com/entry/2014/08/11/123000)
* [gemの複数バージョンカジュアルテスト - くりにっき](http://sue445.hatenablog.com/entry/2015/05/20/212000)
* [社内gemとOSSのgemのメンテについて - くりにっき](http://sue445.hatenablog.com/entry/2015/12/01/000000) 
* [gemspecにRUBY_VERSIONによるif文書くのは意味がないので今すぐやめるべき - くりにっき](http://sue445.hatenablog.com/entry/2016/09/02/121047)