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
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
3.5k
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
820
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
170
5分で問診!Composer セキュリティ健康診断
codmoninc
0
860
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
12
18k
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
3.9k
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
170
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
150
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
660
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
210
霧の中の代数的エフェクト
funnyycat
1
460
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
200
Featured
See All Featured
Design in an AI World
tapps
1
270
ラッコキーワード サービス紹介資料
rakko
1
4.2M
The World Runs on Bad Software
bkeepers
PRO
72
12k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
240
Designing Powerful Visuals for Engaging Learning
tmiket
1
470
The Curse of the Amulet
leimatthew05
2
13k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.5k
Rails Girls Zürich Keynote
gr2m
96
14k
30 Presentation Tips
portentint
PRO
1
360
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
350
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