くりにっき

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

MDの使用デッキで振り返る2023年 #遊戯王AC

はじめに

これは 遊戯王 Advent Calendar 2023 の1日目です。

adventar.org

sue445と遊戯王

遊戯王のカードゲームは

  • マスターデュエル(以下:MD)
  • OCG(紙)
  • ラッシュデュエル(紙)
  • ラッシュデュエル(Switch版) *1

をゆるく触っています。

MDはリリース日からプレイしていて、Switchによると1775時間以上プレイしているようです。

最近のランクマッチ(以下:ランクマ)ではダイヤモンド〜マスター帯をさまよってます。

前置き

遊戯王のアニメは初代からずっと見てましたが、カードゲームとしての遊戯王遊戯王デュエルモンスターズ レガシー・オブ・ザ・デュエリスト:リンク・エボリューション (以下:LotD)で本格的に入門しました。

LotDの時からの習慣なのですが、ネット対戦*2する時には日々の勝敗数と勝率を記録しています。

MDでも勝敗数はメモっているのでこの機会に2023年に使ったデッキを晒してみようと思います。

解説

僕がMDでランクマやイベントでの対戦を行う場合、先行後攻ごとにそれぞれ勝敗をメモ帳に「正」の字でメモるようにしています。(「み」と書いてるのは御巫デッキを使っていたため)

勝敗をつける時のオレオレルールとして下記を意識しています。

  • 自分が何もしてないのに勝ってしまった場合(例:相手の先攻ターンでこっちが何も手札誘発とか使ってないのに相手が勝手にサレンダー)はノーカン。(戦績つける時にこの手の意図しない勝ち星があるとノイズになって嫌なので)
  • 通信切断による勝利はその時の流れによって決める
    • こっちの優勢な時に切断が起きた場合には勝利扱い。(相手のサレンダーとみなす)
    • こっちが不利な時に切断が起きた場合には敗北扱い。(普通に考えて自分が有利な時に切断するわけないのでMD側の障害とみなす)

ランクマ1戦ごとにスプレッドシートに記録するのは大変なので、1日の終わりか翌日始めにスプレッドシートにまとめて勝敗数を記録しています。

スプレッドシートにデータが貯まることで集計して活用しやすくなります。

実際にまとめたやつ

2023年分だけを公開しておきます。

https://docs.google.com/spreadsheets/d/1CG6LAA5yHoXB3fCD39FJgekA6VIIbtMXbTDp057gVsM/edit#gid=862180514

2023年総合

圧倒的にヌメロンエヴァイユが多いw

去年の11月くらいから使い始めて今年9月のリミットレギュレーションの改訂 *3No.86 H-C ロンゴミアントが禁止になるまでずっと使っていました。

10ヶ月間で色々調整はしてきたけど一番最後に使ってたのはこれです。

ちなみにヌメロンエヴァイユの前は壊獣カグヤをよく使ってたし、LotD時代に一番使ってたのはサイバー・ドラゴンデッキなので後攻デッキが好きなのだと思います。

ロンゴミ禁止以降は下記で紹介されている蟲惑魔春化精を一番使っていると思います。

note.com

月ごとに振り返り

開催されたイベントとその時に使ったデッキを見ながら振り返ってみます。

一応リリース当初からイベントは全部やっていてフェスでは報酬を完走するところまではやっていますが、デュエルトライアルは記録してないのでここに書いてるイベントは多少漏れがあると思います。

1月

最初に書いたように8月まではランクマはずっとヌメロンエヴァイユを使ってたので、ランクマで使っていたデッキは基本的に省略。

この月のイベントはテーマクロニクル

僕はオルフェゴールでイベント完走

2月

この月のイベントは2つ開催

レジェンドアンソロジーサイバー・ドラゴンデッキを使用

飛翔するGフェス エクシーズフェスティバルはランクマで使ってたヌメロンエヴァイユで完走。

飛翔するGが規制される *4 前に完走したのでデッキに飛翔するGが入っています

3月

スプライトが出た後なのでランクマはスプラツインも使ってたけど、やっぱりヌメロンエヴァイユの方が多かったです。

この月のイベントはデュエリストカップ

僕はスプラツインを使用。

4月

当時の環境を席巻したティアラメンツが登場した月。

僕もランクマでイシズティアラメンツは少し使ってたけどやっぱりヌメロンエヴァイユの方が多かったです。

この月のイベントはアトリビュート4。

僕は蟲惑魔で完走。

5月

ランクマではヌメロンエヴァイユの合間にウォークライやインスペクト・ボーダーも使用。

この月のイベントはYu-Gi-Oh! World Championship 2023。

ランクマで使ってたヌメロンエヴァイユを使ってたと思います。

6月

ランクマだと一瞬烙印ビーステッドを使ってたようだけど一番多かったのはやっぱりヌメロンエヴァイユ

この月のイベントは盛りだくさん

レジェンドアンソロジーは表サイバー流で完走。

アニメGXが好きなのでついつい自分の中のヘルカイザーが目を覚ます。

シンクロ(しない)フェスティバルはウォークライで完走。

7月

紙で使ってた蟲惑魔ストラクがこの月にMDに実装されて狂喜乱舞した記憶。

ランクマはヌメロンエヴァイユと蟲惑魔春化精が半々くらい。

この月のイベントは群雄割拠フェスティバル。

僕はラビュリンスで完走。

8月

クシャトリラが実装されたのでクシャイシズティアラメンツを使ってたことが多かった気がします。

ロンゴミアントの禁止が発表されてからはヌメロンエヴァイユで最後の追い込みをして、ギリギリマスター帯に到達してました。

この月のイベントは闇vs光フェスティバル

闇はラビュリンス、光はエルドリッチを使ってました。(後者はスクショ失念)

9月

御巫が実装された月。

天底の使徒 が制限復帰したので天底ラビュリンスを一番使ってた気がします。

この月のイベントは2つ。

群雄割拠フェスティバルはモンスターをほとんど入れないバーンデッキで完走。(群雄割拠とは...)

フュージョン×エクシーズフェスティバルはサイバー・ドラゴンで完走。

10月

この月は忙しくてあんまりランクマやってないな...

この月のイベントはデュエリストカップ

イベントでは蟲惑魔春化精を使ってた模様。(スクショ失念)

11月

ランクマでは蟲惑魔春化精を使用。

この月のイベントはリチュアルフェスティバル。

壊獣御巫で完走。

 

この記事を書いてるのが11月なのでここまで。

FAQ

Q. なんで勝敗数をつけてるの?

なんとなくやり始めたら惰性でずっと続いてしまった。

2日目

それはどうかなと言えるデュエル哲学【EXW】 さんのエントリです。

note.com

*1: https://www.konami.com/yugioh/rushduel_game_gorush/

*2: LotDにはMDでいうところのランクマッチというのは存在せず(おそらく)ランダムでマッチング

*3: https://twitter.com/YuGiOh_MD_INFO/status/1693495758056743295

*4: https://twitter.com/YuGiOh_MD_INFO/status/1628255686269472768

プリキュアボットを支える技術

これは プリキュア Advent Calendar 2018 の16日目です。

adventar.org

はじめに

今日はキュアピースの中の人の金元寿子さんのお誕生日です。おめでとうございます!!!!

嫁集合写真

キュアスタ!とは

Mastodonプリキュアインスタンスです precure.ml

キュアスタ!ではサーバに負荷をかけない程度であればボットの作成は容認されています。*1

いくつかボットを作ってるのでその紹介です

プリキュアこのあとすぐボット

プリキュアが始まる直前にトゥートするボットです。

https://precure.ml/@precure_onair_bot

f:id:sue445:20181130202050p:plain

元ネタ

最初作った時は開始10分前だけの通知でしたが、1日1回まとめて通知できた方が便利そうだったので0時にその日に放送される番組をまとめて通知するようにもしました。便利

f:id:sue445:20181130202141p:plain

今まで作った中ではこれが一番のお気に入りです

使っている技術

プリキュア誕生日ボット

プリキュアの誕生日の日にトゥートするボットです

f:id:sue445:20181130202239p:plain

https://precure.ml/@precure_birthday_bot

使っている技術

プリキュア つながるぱずるん」非公式

キュアぱず公式アカウント のツイートをきゅあったーに流すボットです。

f:id:sue445:20181130202644p:plain

https://precure.ml/@precure_app

使ってる技術

拙作の twittodon で流しています

詳しいこと

sue445.hatenablog.com

僕に「サザエさん」の話させたら長くなりますよ?

これは 僕に「○○」の話させたら長くなりますよ Advent Calendar 2016 - Adventar の25日目です。

www.adventar.org

僕に「サザエさん」の話させたら長くなりますよ?

サザエさんとは?

テレビ放送45年以上で老若男女誰でも知ってる圧倒的国民的アニメです。

www.fujitv.co.jp

サザエ実況採点ポイント

採点ポイントを細かく解説します

ちなみに毎週この採点表で採点して、ツイートしています。

採点表 | SuperSazaeTime History #sst_history

エイケン

サザエさんの制作会社です。エイケンが製作すると◯がつきます。

www.eiken-anime.jp

開幕雪室

サザエさんは30分間で3本の話で構成されていますが、「開幕雪室」はその1番目が脚本家の雪室俊一先生が担当する回だと◯がつきます。

テクマクマヤコン―ぼくのアニメ青春録

テクマクマヤコン―ぼくのアニメ青春録

城山先生生存確認

雪室先生と並んでサザエさん二大脚本家の1人、城山昇先生の脚本が登場するA〜Cパートのどこかで出ると◯がつきます。

レア脚本家

雪室先生と城山先生以外の脚本は出ると◯がつきます。

ハイエナ行為

「ハイエナ」ことノリスケがハイエナ行為(磯野家などからたかる)を行うと◯がつきます

shirts-custom.com

BACK COME ON

波平が「バッカモーン!(BACK COME ON)」と怒鳴ると◯がつきます

SAYOU

波平が「左様(SAYOU)」と言うと◯がつきます。

創価

波平が「そうか(創価)」と言うと◯がつきます。

ちなみに「BACK COME ON」「SAYOU」「創価」は波平の三大名言です。

花沢異常性欲

「カツオの嫁」こと花沢さんがカツオに対して異常な性欲を発揮すると◯がつきます。無限性欲とも呼ばれます

タラヲ氏ね

文字通り

サイコパス堀川

タラヲがウザいのは元からですが、近年頭角を現してきた堀川くん。そのサイコパスっぷりが発揮されると◯がつきます

news.merumo.ne.jp

otapol.jp

レアBGM

普段聴かないBGMが流れると◯がつきますが、よく聴くレアBGMもあります。

熱いカツオDIS

いたずら小僧として世間で認知されているカツオも最近は割とそんなこともなく良識派だと思います。

そんな中偏見だけででカツオがぬれぎぬを着せられたりDISられたりすると◯がつきます。

タラヲメイン

タラヲメインの話が1本でもあると◯がつきます。

じゃんけん

番組最後の予告でサザエさんが出した手です。

脚本家で振り返る2016年サザエさん

今年はサザエさんを実況しながらパートごとの脚本家の名前を全部スプレッドシートにメモしていました。

2016年版サザエ脚本家リスト - Google スプレッドシート

ここからいろいろ検証してみたいと思います。

開幕雪室率

開幕雪室率は98%。

今年全51週あったうち、3/27の1時間スペシャルを除いて全て雪室先生が先発脚本でした!

城山先生生存率

城山先生が全く出てこなかったのは計11回なので、今年の城山先生生存率は80%でした

レア脚本家は本当にレアなのか?

今年の各脚本家の回数を数えたら下記のようになりました

f:id:sue445:20161225190922p:plain

雪室先生と城山先生が圧倒的すぎて、他の脚本家が出るのはレアだということが証明されましたと思います

ネタ提供で雑に振り返る2016年

その週に個人的に話題になってたものを提供にしています

1月

2月

3月

4月

5月

5/29は別件で実況していなかったのでツイートは無し

6月

7月

8月

9月

10月

10/23は日本シリーズ第2戦でサザエさんの放送はありませんでした

11月

12月

予告

来年のサザエさんは2017/1/8(日)からです

rubicureのこれまでとこれから

これは プリキュア Advent Calendar 2016 - Adventar の16日目です。

www.adventar.org

12/16はキュアピースの中の人の金元寿子さんのお誕生日です。おめでとうございます!!!!

今回はこれまでのrubicureとこれからのrubicureについて書くポエムです

rubicureとは

プリキュアRuby実装です

github.com

最新情報は先日Qiitaに書いたのでこちらを御覧ください。

qiita.com

これまでのrubicure

リリースノート

この辺

https://github.com/sue445/rubicure/blob/master/CHANGELOG.md

rubicureのバージョニングポリシー

僕のgemはだいたいセマンティックバージョニングに則っています

セマンティック バージョニング 2.0.0 - Semantic Versioning

ただ、rubicureの場合若干変えていて、同一シリーズ内の場合は必ず +0.0.1し、シリーズが変わる時に +0.1するようにしています。

https://github.com/sue445/rubicure/blob/master/CHANGELOG.md

今まで割と曖昧なバージョニングをしていましたが、魔法つかいプリキュアで上記のバージョニングを思いついたので魔法つかいプリキュアは 0.4.x 系を保ち続けています

moongiftにとりあげられた

www.moongift.jp

正月に帰省先でファッ!?となった記憶があります。

周辺ツールとかができた

Rubyをインストールして gem install すればすぐに使えるというお手軽さから(推測)、周辺ツールがいろいろできています

github.com

igreque : Info -> ユナイトプリキュア!このあとVim! #cure_advent

これからのrubicure

rubicure v1.0.0

映画プリキュアがオールスターズからドリームスターズになるということは記憶に新しいと思います

www.precure-dreamstars.com

nlab.itmedia.co.jp

これを機にrubicureも1.0.0を考えています

今考えているのは主に

  • ドリームスターズ対応
  • 古いRuby(2.0系, 2.1系)の非サポート化
    • Travis CIでビルドしない(古いRubyでもインストールはできるけど動作は保証しない)だけにするか、required_ruby_versionを変更して古いRubyではインストールすらできなくするかまでは考えてない
    • 雑にやるなら前者でもいいと思うけど、2.1系でうまく動かないってってissueがきて対応するのも面倒なので個人的には後者でいい気もしている。(もうすぐ出るRuby 2.4から数えたら3世代以上前なので切り捨ててもバチは当たらないだろう)
  • deprecatedメソッドの削除

辺りです。

個人的にはactuvesupportも外したいところなのですが厳しそうな予感はしてる。。。

区切り的に次回作の「キラキラ☆プリキュアアラモード」でv1.0.0にしようと考えています

www.toei-anim.co.jp

最後に

これからもrubicureをよろしくお願いします m( )m

rubicureでプリキュアの誕生日を手軽に調べる #cure_advent

はじめに

これは「プリキュア Advent Calendar 2015」の16日目です

www.adventar.org

15日目

16日目:rubicureでプリキュアの誕生日を手軽に調べる

12/16はキュアピースの中の人の金元寿子さんのお誕生日です。おめでとうございます!!!!

嫁の集合写真

声優さんに誕生日があるのと同様、プリキュアにも誕生日はあります。

昨日はキュアスカーレットこと紅城トワ様の誕生日でした

f:id:sue445:20151215234055p:plain

ただし設定は一部のプリキュアにしか存在しません。

rubicure v0.3.0で誕生日を取得できるようになったので使い方を紹介します

github.com

基本的な使い方

have_birthday?, has_birthday?

誕生日が存在するかどうか取得できます

Cure.peace.have_birthday?
#=> false

Cure.twinkle.have_birthday?
#=> true

has_birthday?have_birthday? のaliasなのでどっち使ってもいいです

birthday

誕生日が存在するプリキュアには birthday メソッドが実装されていて誕生日が取得できます

Cure.twinkle.birthday
#=> "9/12"

birthday?

Date.today
#=> Wed, 16 Dec 2015
Cure.twinkle.birthday?
#=> false

Cure.twinkle.birthday?(Date.parse("2015-9-12"))
#=> true

引数に渡した日付*1が誕生日かどうか取得できます

ちなみに昨日(12/15)はキュアスカーレットの誕生日でした

誕生日の貴重な実行結果です。ご査収ください *2 f:id:sue445:20151215233052p:plain

応用的な使い方

誕生日が存在するプリキュアを一括取得するためのサンプルコードです

Precure.all_stars.select(&:have_birthday?).map(&:human_name)
#=> ["美墨なぎさ", "雪城ほのか", "九条ひかり", "日向咲", "美翔舞", "相田マナ", "菱川六花", "四葉ありす", "剣崎真琴", "春野はるか", "海藤みなみ", "天ノ川きらら", "紅城トワ"]

pp Precure.all_stars.select(&:have_birthday?).map{ |girl| [girl.human_name, girl.birthday] }
[["美墨なぎさ", "10/10"],
 ["雪城ほのか", "4/4"],
 ["九条ひかり", "9/9"],
 ["日向咲", "8/7"],
 ["美翔舞", "11/20"],
 ["相田マナ", "8/4"],
 ["菱川六花", "9/17"],
 ["四葉ありす", "5/28"],
 ["剣崎真琴", "11/4"],
 ["春野はるか", "4/10"],
 ["海藤みなみ", "7/20"],
 ["天ノ川きらら", "9/12"],
 ["紅城トワ", "12/15"]]

Precure.all_stars.select(&:have_birthday?).map(&:human_name).count
#=> 13

参考文献

プリキュアの誕生日はこちらのデータを参考にしています

dic.nicovideo.jp

rubicureには各種便利な機能が揃っているので是非皆さんもお使いください

17日目

*1:引数がない場合はDate.today

*2: nil をつけてるのは出力が多すぎてコンソールが流れるため

GoがGoでGo!プリンセスプリキュアを作った #gocon #cure_advent

はじめに

これは「プリキュア Advent Calendar 2015」の7日目です

www.adventar.org

6日目

@ さんの ゆいちゃんという特異点的な存在についての考察 でした

xn--z8j2b8f.jp

7日目:GoがGoでGo!プリンセスプリキュアを作った

昨日開催された「Go Conference 2015 Winter」でLTをしたのでその発表資料になります。ご査収ください

eventdots.jp

togetter.com

スライド板

GoがGoでGo!プリンセスプリキュアを作った #gocon #cure_advent

エントリ版(内容はスライドと全く同じです)

GoがGoでGo!プリンセスプリキュアを作った

Go Sueyoshi a.k.a sue445

2015/12/06 Go Conference 2015 Winter

(兼 プリキュアAdventCalendar 7日目)


自己紹介

f:id:sue445:20151205023026p:plain

  • Go Sueyoshi a.k.a @sue445
    • golang歴 3ヶ月
    • Go歴 33年 (33歳)
    • 「Goのエンジニア」ではなく「エンジニアのGo」です(世間一般的にはRubyist
    • 【警告】Twitterは上級者向けのアカウントなので決してフォローしないでください!
  • Railsの会社でサーバサイド全般を浅く広く見守るお仕事
    • インフラ、アプリ、ライブラリ、社内ツールetc
  • 会社ではプリキュアおじさんと呼ばれています

【今期の嫁】キュアトゥインクル

f:id:sue445:20151205023218p:plain


【本妻】キュアピース

f:id:sue445:20151205023236p:plain


Agenda


「Go!プリンセスプリキュア」とは

日曜朝8:30からテレビ朝日系で放映しているアニメ


GoPrecureとは

「Go!プリンセスプリキュア」のgolang実装です

f:id:sue445:20151206234323p:plain

https://github.com/sue445/goprecure


使い方


go getしてimport

go get github.com/sue445/goprecure
import github.com/sue445/goprecure

プリキュアインスタンスを作成

// キュアフローラ
flora := goprecure.NewCureFlora()

// キュアマーメイド
mermaid := goprecure.NewCureMermaid()

// キュアトゥインクル
twinkle := goprecure.NewCureTwinkle()

// キュアスカーレット
scarlett := goprecure.NewCureScarlett()

Name で名前を取得

flora := goprecure.NewCureFlora()

flora.Name()
// 春野はるか

Transform で変身

flora.Name()
// 春野はるか

flora.Transform()

flora.Name()
// キュアフローラ

実際にはこんな感じ

f:id:sue445:20151205023306g:plain


GoPrecureではフォームチェンジを忠実に再現

f:id:sue445:20151205023321g:plain


プリキュアに対応するドレスアップキー

// キュアフローラ
g.DressupKeys = []DressupKey{Flora, Rose, Lily, Sakura, Royal}

// キュアマーメイド
g.DressupKeys = []DressupKey{Mermaid, Ice, Bobble, Sango, Royal}

// キュアトゥインクル
g.DressupKeys = []DressupKey{Twinkle, Luna, ShootingStar, Ginga, Royal}

// キュアスカーレット
g.DressupKeys = []DressupKey{Scarlett, Hanabi, Phoenix, Sun, Royal}

苦労したこと

  • GoPrecureに適したREPLがない
    • 4〜5種類くらい使って総合的に gore が一番よかったが、直前までの入力を全部実行しているので標準出力に出力するメソッドとの相性が悪い

f:id:sue445:20151205023335p:plain


f:id:sue445:20151205023348p:plain

Transform の後に Exchange すると Exchange の標準出力だけ出してほしいのに直前の Transform のも一緒に出るので邪魔


golangのREPLがまだGoPrecureに追いついていない感があるw


プリキュアの他言語での実装の紹介


rubicureとGoPrecureの設計思想の違い


rubicureの設計思想

  • Rubyの柔軟性を利用してメタプロを大活用
    • クラスにメソッドはほとんど定義せずに method_missing でymlに飛ばすとか
  • transform!(変身) や attack!(必殺技) など破壊的メソッドには ! をつけるRubyの慣習に則った
  • 基本的にプリキュア全員対応するため特定のシリーズに特化させない汎用的な設計
  • rubicureのおかげでRubyの勉強になった

GoPrecureの設計思想

  • 静的型付けを意識した設計
    • DresupKey という型を const で定義することにより Exchange に未知のドレスアップキーが引数がわたらないようにした(コンパイルエラーになる)
  • Go!プリンセスプリキュアだけに特化させることでドレスアップキーとモードチェンジを関連付けた実装が実現した
  • GoPrecureのおかげでgolangの勉強になった

まとめ

新しい言語を勉強する時は自分の好きなものを実装すると良い。

補足

プリキュアRuby実装

こちらを御覧ください

sue445.hatenablog.com

Go!プリンセスプリキュアは(今のところ)43話連続神回

なのでみんなBD買うといいと思います

8日目

id:hyaknihyak さんの プリキュア放送中に今誰が活躍してるかわかるやつ作ろうとした です

100-200.hatenablog.com

社内gemとOSSのgemのメンテについて

これは 【その1】ドリコムAdventCalendar の1日目です *1

自己紹介

1日目:社内gemとOSSのgemのメンテについて

そういうポエムです

言葉の定義

  • gem : Rubyのライブラリ
  • 社内gem : 社内など特定の環境でしか公開されていないgem
  • OSSのgem : RubyGems.org など、OSSとして公開されていて誰でも自由にインストールできるgem

適当な説明ですが世の中のgemはだいたいこの2種類に分類されると思います。異論あると思いますが以降この2つの言葉を使います

OSSのgemのメンテで意識していること

他の人にリポジトリを見てもらい、その人が容易にPRを送れるように「おもてなしの心」を意識しています

どんなに小さいgemでも自動テストは必ず書く

  • 自分以外の人が修正した時に既存機能を壊していないことを手軽に確認するためです
    • テストのないリポジトリにPullRequest送るのは勇気が入るけど、rspecでもtest-unitでもいいので基本的なロジックに対してテストがあると安心感があります
  • リポジトリのトップにCIのバッジを貼ってテストが落ちてないことをアピールできればベストですね╭( ・ㅂ・)و ̑̑

f:id:sue445:20151125213819p:plain

バージョンごとにtagはpushする

読んでもらうREADMEを意識する

  • READMEはリポジトリの顔なので、そこにどんな機能があるかが一目で分からないと本当に素晴らしいgemであっても誰にも使ってもらえないです
  • サンプルコードやスクリーンショットなどがあると文章を読まなくても直感で分かるようになるのでベターですね

CHANGELOG(更新履歴)を書く

CHANGELOGがないとどのバージョンでどんな機能が入ったのか分からないのでgemの利用者は迂闊にアップデートできないので合った方がいいです

サンプル

https://github.com/sue445/rubicure/blob/master/CHANGELOG.md

粒度

  • 基本的には1行 1 PullRequestくらいの粒度がベスト
    • 逆に言うと1つのPullRequestに複数の変更が入ると変更が追いづらくなります
    • 「PullRequestにも単一責任の原則」 (1つのPullRequestには1つの変更だけを入れる)を適用することを意識しています
  • 各バージョンごとに前のバージョンとのcompareリンクを「full changelog」で書いていればバージョン間の差分がコミット単位で分かるので分かりやすいです

カテゴリ分け

量が少なければ羅列していてもいいのですが、量が多くなるとどれが重要な変更なのか分かりづらいので下記のようなカテゴリを使ってます

  • Breaking change:下位互換をぶっ壊す変更
  • Bugfix: バグ修正
  • Enhancements: 機能追加

この書き方は RSpecのCHANGELOG を参考にしています。gemの利用者にとって重要な変更(Breaking change)は上に書いて目立たせるようにしています

細かいRefactoring系を書くかどうかは好みが分かれるところなのでどっちでもいいかなぁw

CHANGELOGの半自動生成

gemのバージョンアップの度に毎回上記に当てはめてCHANGELOGを書くのは大変なので、普段からPullRequestやMergeRequestのタイトルをそのままリリースノートに書けるような形式*4にすることを心がけておくことで、いざリリースの時には GitHub Changelog Generatorgitlab_awesome_release などでCHANGELOGのテンプレだけを自動生成し細かい文言修正やカテゴリ分けだけ手動で済むようになります

参考になるリポジトリ

たまに bundle update おじさんをすることがあってアプリで使ってるgemのCHANGELOGを全部読んでたことがありますが、その中で一番参考になったのは Ruby on Rails, RSpec 辺りでした

gemを作ったら必ず宣伝する

  • githubrubygemsに公開しただけで満足すると自分以外誰も使わないのでブログや勉強会でどんどん宣伝した方がいいです。
    • Twitterだけだと流れるので1回流すだけでは宣伝効果は弱いと感じてます。

社内gemのホスティングについて

  • 弊社だと geminabox を立ててそこにgemをホスティングしています
  • drecom_gem という社内gemを自分の社内gemに入れることで、rake drecom:release コマンドでgeminaboxにgemのリリースを行ったり、 間違って https://rubygems.org/ へ社内gemをリリースできないように rake release コマンドを実行できなくしています
  • 詳しくは RubyKaigi2014で発表した - mitaku.log を御覧ください
  • 今見たら社内gemが157個あった。すげえ。。。

社内gemのメンテで意識していること

だいたい上とかぶるので違う部分だけ書きます

サポートするRubyRailsのバージョンなどは社内アプリ優先

当然ですね

  • サポートが切れているRubyRailsのバージョンであってもそれらを社内で使ってるのであれば社内gemでも基本的にサポートする
  • acts_as_mysql_partitionという社内gem*5は2015年6月当時 (Ruby 1.9系, 2,0系, 2.1系, 2.2系) x (Rails 3.2系, 4.0系, 4.1系, 4.2系) の16パターンのビルドをしていたのですが、Ruby 2.2系とRails 3.2系を組み合わせるとビルドがこける問題がありました。*6 この組み合わせだけビルドを除外するでもよかったのですが、せっかくなのでRuby1.9系とRails 3.2系のサポートをきるためにこのgemを使ってるアプリを全部洗い出し、プロダクションでは使ってないことを確認したのでサポートをきりました
  • ちなみに社内には Gemicom というGemnasium の社内クローンがあったのでどのアプリでgemを使ってるのか特定が容易に進みました

gemを作ったら社内gemとOSSのどっちにすべきか?

自分の場合下記を考えて社内と社外(OSS)のどっちに公開するかを考えています

OSSのgemのメリット

  • OSSにした方が周辺のエコシステムを享受しやすい
  • 社内gemにしたら仕事じゃない趣味のアプリでは使えないけど、最初からOSSにしておくと仕事と趣味の両方で同じgemを使えて便利かと
    • 社内gemを勝手に社外で使うとインシデントだけど、既に社外で公開しているgemを社内のアプリで使う分には大抵の場合問題ないはず
    • 「高級レストランのあの味をご家庭でも!」感w

社内gemのメリット

社内コンテキストに特化させることによるメリットが多いです

  • OSSにしていろんなパターンを考慮して汎用化するとその分仕組が複雑になりますが、社内gemだと社内の利用用途に限定させることで仕組をシンプルにすることができます
  • 外からのマサカリが飛んでこない *7
    • とはいえ外のマサカリを全く受けない温室育ちだと外に出られないので適度に外のマサカリを受けることは大事だと思いますw

OSSのgem -> 社内gem or 社内gem -> OSSのgem

途中で公開形態を変えることもできますが、後者だと会社のメールアドレスやパスワードなどの機密情報をgit filter-branch などで完全に書き換える必要があり面倒なので、個人的には可能なら最初からOSSにしてた方が楽なんじゃないかなーと思います

12/1 21:50 追記

Twitterのやり取りを追記

2日目

*1:今年は参加希望者が多かったのでその1とその2の2枠構成です

*2:主にAPI周り

*3:毎週日曜夕方に宗教上の理由で30分間で200ツイート以上TLが流れるのでw

*4:「NameError出ていたのを修正」のような利用者にはどうでもいい内部実装に関するタイトルではなく、「○○の時にエラーになっていたのを修正」「○○のような機能を実装」など

*5:いい感じにMySQLパーティションを作成するgem

*6:たぶんこんな組み合わせ本家でもサポートしてないだろうなぁ・・・w

*7:個人的には社内のマサカリの方がこわ(ry