Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
OSSコントリビュート ハッカソン
Search
kzkn
November 15, 2021
Programming
1.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
OSSコントリビュート ハッカソン
kzkn
November 15, 2021
Other Decks in Programming
See All in Programming
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
290
1B+ /day規模のログを管理する技術
broadleaf
0
130
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
4.9k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
200
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
240
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
370
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
140
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
220
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
210
Performance Engineering for Everyone
elenatanasoiu
0
260
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
800
Featured
See All Featured
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
The Limits of Empathy - UXLibs8
cassininazir
1
400
My Coaching Mixtape
mlcsv
0
170
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
240
We Are The Robots
honzajavorek
0
270
ラッコキーワード サービス紹介資料
rakko
1
3.9M
Designing for Timeless Needs
cassininazir
1
280
Prompt Engineering for Job Search
mfonobong
0
370
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
Tell your own story through comics
letsgokoyo
1
990
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Transcript
OSSコントリビュート ハッカソン kzkn 2021/10/29
ChangeLog URL of rubygem
rubygems の ChangeLog URL
rubygems の ChangeLog URL gemspecに一行書くだけ
未設定のプロジェクトが 多い問題
rubygems の ChangeLog URL を機械的に収集 https://github.com/kzkn/rubygems-changelog-url
rubygems の ChangeLog URL を機械的に収集 https://www.sonicgarden.world/groups/13/entries/1181485
rubygems の ChangeLog URL を機械的に収集 1. rubygems.org の API を叩く
2. changelog_uri が設定されていればそれを使う 3. なければ GitHub からそれっぽいものを探す
rubygems の ChangeLog URL を機械的に収集 ・それっぽいものを探すのがコスト高い(イケさんの pullreq のおかげでだいぶマシにな りました) ・GitHub
Actions にかかる料金が増える ・そもそも rubygems.org から ChangeLog URL を引っ張ってくることができれば不要な 処理 ・設定されていれば Actions にかかる料金が下がり、rubygems.org から変更履歴にア クセスできるようになる => いいことしかない
じゃあ設定すればいいじゃん!
changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を
rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
修正対象 gem の情報を集める
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... rubygems.org の API キーを設定します。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions 今回はローカルに残ってる gem
のキャッシュから探します。 rbenv のディレクトリに移動します。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名に 変換して各gemの情報をrubygems.orgから引っ張ってきます。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名 に変換して各gemの情報をrubygems.orgから引っ張ってきます。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt gemspecを一覧して古いバージョンを除去して changelog_uriを含まないgemspecファイルを一覧してgem名 に変換して各gemの情報をrubygems.orgから引っ張ってきます。
修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E
's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt ファイルパスの8番目の要素(gemspecのファイル名)だけを切り出す
修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E
's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt gemの情報をrubygems.orgからcurlでとってきて、jqで必要な情報を抽出するコマンドを構築する
修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E
's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt “curl hogehoge | jq fugafuga” なコマンドを実行する
修正対象 gem の情報を集める(詳細) cut -d/ -f8 | \ sed -E
's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | \ sh | \ tee gems.txt 結果を gems.txt に出力する
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt $ grep '"changelog_uri":null' gems.txt >missing_changelog_uri_gems.txt 無駄な行を省きます。ローカルのキャッシュ上は changelog_uri がないけど、rubygems.org 上は設定されてい るものがあったので除外。
修正対象 gem の情報を集める $ RUBYGEMS_APIKEY=.... $ cd ~/.rbenv/versions $ find
*/lib/ruby/gems/*/gems/ -maxdepth 2 -name '*.gemspec' | sort -t/ -k7 -r | sort -u -t/ -k8 | sed -E 's/(.*)/grep -q changelog_uri \1 || echo \1/' | sh | cut -d/ -f8 | sed -E 's!([^/]+).gemspec$!curl -s -H "Authorization: '$RUBYGEMS_APIKEY'" https://rubygems.org/api/v1/gems/\1.json | jq -c "{name,project_uri,homepage_uri,source_code_uri,changelog_uri}"!' | sh | tee gems.txt $ grep '"changelog_uri":null' gems.txt >missing_changelog_uri_gems.txt $ sed -e 's/$/,/' -e '1i [' -e '$a null]' missing_changelog_uri_gems.txt >missing_changelog_uri_gems.json 後続処理のために valid な JSON に変換します。
changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を
rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
gem の ChangeLog URL を 探す
gemのChangeLog URLを探す 前掲のjsパッケージで引っ張ってくるので jsコードを書きます。 https://gist.github.com/kzkn/10b466cb0ef9708979cc61058b40c22b
gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js <path/to/missing_changelog_uri_gems.json | tee all.csv
叩きます。GitHub API を叩きまくるので、API KEY を指定してあげます。さもないとすぐに API Limit に達してし まいます。
gemのChangeLog URLを探す $ GITHUB_APIKEY=... node index.js <path/to/missing_changelog_uri_gems.json | tee all.csv
$ wc -l all.csv 592 changelog_uris.csv $ grep -v ',null$' all.csv >missing_changelog_urls.csv $ grep -v ',null$' missing_changelog_urls.csv | wc -l 273 273件のChangeLog URLを探すことができました。
changelog_uri が未設定の gem を探す ・changelog_uri を含まない gem を一覧する ・gem の情報を
rubygems から収集する ・各 gem の ChangeLog URL を探す ・pullreq を投げる
pullreqを投げる
pullreqを投げる ・273個のリポジトリをフォークするのはちょっと。。。 ・リポジトリによって色々決まりがあるので機械的にpullreq投げるのはちょっと。。。 ・スクリプトから gemspec を生成するプロジェクトとか ・非アクティブなプロジェクトもあったりしてちょっと。。。
pullreqを投げる 誰にでも pullreq を投げられるように一覧を作りました!!! https://docs.google.com/spreadsheets/d/1B3nTFNShVPxc07aFH2OA8Y_EI96tO68 RDzZc_s3YxUs/edit?usp=sharing
pullreqを投げる 1. ChangeLog URLにアクセスしてファイルが存在することを確認します(念のため) 2. リポジトリにアクセスします 3. gemspecファイルを開きます 4. 編集します
5. シートのE列、F列から適宜コードをコピーして貼り付けます 6. まわりとテイストを合わせます 7. pullreqを作ります
pullreqを投げる https://github.com/aasm/aasm/pull/759
OSSコントリビュートの心構え ・どんなに些細なことでもよい ・ほどほどにいい加減でもよい(プロジェクトによるけど) ・気合入れまくった pullreq が放置されて虚しい目に ・OSSコントリビュートの出発点としてお役立てください!
One more thing...
opsworks_rubyのpuma 5対応 https://github.com/ajgon/opsworks_ruby/pull/276