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.2k
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
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
540
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
1.3k
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.1k
Oxcを導入して開発体験が向上した話
yug1224
4
290
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.1k
dRuby over BLE
makicamel
2
320
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
100
タクシーアプリ『GO』の バックエンド開発のおける AI利活用と若者のすべて
pyama86
3
1.9k
Lessons from Spec-Driven Development
simas
PRO
0
140
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.4k
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Claude Code のすすめ
schroneko
67
230k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
How to make the Groovebox
asonas
2
2.2k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
440
How to Think Like a Performance Engineer
csswizardry
28
2.6k
How to train your dragon (web standard)
notwaldorf
97
6.7k
Tell your own story through comics
letsgokoyo
1
950
The Curse of the Amulet
leimatthew05
1
13k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
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