Code Journey

30代未経験からプログラミング挑戦中(追うものは追われる者に勝る)

【merge済】プログラミング初心者がOSS活動に挑戦してIssue→PRまでやってみた

はじめに

前提

まず前提として、この記事を書いているのは未経験からプログラミングに挑戦中の者になります。学習はフィヨルドブートキャンプに参加しながら取り組んでいて、現役のエンジニアの方からレビューをもらいながら進めています。

現在の学習状況は以下を随時更新しているので興味ある方はご覧ください。

hirano-vm4.hatenablog.com

何が伝えたいかというと、まだ学習中の身である私が、OSS活動に参加し、GitHubでIssue・PRをOSSの開発者に送る経験をしたということです。

OSS活動というと「技術力と経験に長けた方々がひしめく異世界の活動」で私のような学習中のレベルの人間は参加するべきはないというイメージを持っていました。

しかし、そんなことはなくOSS活動は誰でも参加できる活動」であることを体験を通して感じることができました。

この体験をアウトプットすることで、OSS活動に興味があっても、まだ自信のない学習中の方やビギナーの方の背中を押せる内容になれば良いなという思いを込めて発信したいと思います。

OSS活動とは

オープンソースソフトウェア(Open Source Software)は、頭文字を取ってOSSと略されます。作成者がソースコードを無償で公開していて、利用や改変、再配布が自由に許可されているソフトウェアのことを言います。

またOSS活動とは、オープンソースソフトウェアの開発と維持管理に取り組む活動です。

OSS活動には、新しいオープンソースソフトウェアの開発、既存の製品のメンテナンス、関連するドキュメンテーションの更新など、さまざまな取り組みが含まれます。


OSSは、誰でも自由に改良し、再配布できるという特徴があるため、ユーザーの中から誰かがソースコードのバグを見つけ、改善して修正するというサイクルが世界中で行われています。

この活動により、ソフトウェアの安定性が向上し、低コストで高品質な開発が実現できるというメリットがあるそうです。


私が現在学んでいるプログラミング言語の1つであるRubyも、ブログなどがつくれる有名なWordPressOSSです。

我々が使うものは多くのOSSの上に成り立っていると言っても過言ではありません。

イベントの背景・参加の動機

参加しているフィヨルドブートキャンプオンラインプログラミングスクールのフィヨルドブートキャンプとOSS Gateのコラボレーション企画開催!!というイベントがあり、これは参加するしかない!

と思い立って申込開始と同時に申し込みしました😄

OSS Gateさんは、OSS開発に参加する「入り口」を提供する取り組みをしている団体です。

OSS開発に未参加の人を参加する人へ、少し参加したことがある人を継続的に参加する人へ。そうやってOSS開発に参加する人を継続的に増やしていく。それが「OSS Gate」の目的です。


また私は元々ブロックチェーンの技術にも興味があり、学習のアウトプットも兼ねてブロックチェーンのノードを作って運用をしています。

ブロックチェーンは、運営がいなくても成り立つ非中央集権的な仕組みとなっています。なので開発などはOSSとなっていて、まさにOSS活動に支えられているのでこの活動に興味がありました。

イベントの概要

ワークショップやセッションの内容

当日は以下のようなスケジュールで行われました。

興味深いトピックと学びのポイント

このイベントに参加してみて1番頭に残ったのは「それぞれができることを、できる範囲で貢献する」という言葉です。

冒頭でもお伝えしたように、私はOSS活動というと「技術力と経験に長けた方々がひしめく異世界の活動」で私のような学習中のレベルの人間は参加することができない、というイメージを持っていました。同じような印象を持っている方もきっと多いのではないでしょうか?

しかし、さまざまなレベルの人がいて・状況や環境(時間的制約など)もさまざまです。「各々ができる範囲で貢献する」という言葉を聞いて私の中で一気にハードルが下がりました。

またプログラミングのレベルがビギナーであれば、ビギナーにしか気付けないこともあります。

OSS活動の流れ

1.まずはWorklogを作成

OSS Gate Workshopで用意されているWork logを作成。このワークショップでは作業の記録や気付きなどを細かく投稿しながら進め、適宜アドバイスをもらいながら進めていきます。

リンクから飛んでいただけると雰囲気を掴んでもらえると思います。

2.OSSの選定

まずは今回貢献するOSSを選定します。自分の使っている身の回りのものもOSSである可能性があります。ブラウザやエディターの拡張機能や、Rubyのgemなどももちろん対象です。

私はRuby on Railsの言及機能(モデルの自己結合&多対多のアソシエーション)実装のプラクティスの歓迎要件になっていた、「文字列にURLが含まれていたら自動でハイパーリンクになる」という機能を実装するために使ったrails_autolinkを選定しました。

3.ライセンスの確認

選定したらOSSであるかのライセンスを確認します。公式サイトやGitHubを確認します。私が選定したgemのライセンスはGitHub上で確認しました。

今回私の選んだOSSMIT Licenseということがわかりました。MIT LicenseOpen Source Initiative で検索しでてくればOSSということになります。

Licenseの中にも以下の条件に従う限り、無償で提供されます。本ソフトウェアおよび関連する文書ファイル(以下、「ソフトウェア」と呼びます)のコピーを取得した任意の個人に、ソフトウェアを制限なく扱い、使用、複製、変更、統合、公開、配布、サブライセンス許諾、販売する権利を含むがこれに限定されない権利を付与します。…(省略)という旨の表記が確認がとれました。

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:(一部抜粋)

4.ユーザーとしてOSSを利用して気付きを得る

まずはユーザーとしてOSSを利用します。その中で何か改善できることはないか、問題がないかを確認していきます。

ひとまずGitHubのREADME通りに進めていきます。そこでREADMEの指示通りに動かしてもエラーになる、意図した挙動にならない等がでてくればIssueの候補になります。

5.気付きをIssueやPRという形で貢献する

貢献できそうな内容があればそれをまとめてIssueを作って投稿します。

エラーになるまでに行った手順、またエラーであればそれぞれの実行環境によって挙動が変わる可能性もあるので、エラーになった自分自身の実行環境についてもしっかり具体的に伝えます。

意外と「具体的」というのが難しく、「無意識に前提だと思い込んでいると、つい伝えない情報がでてしまうので注意しましょう」と講義の中でもアドバイスがありました。相手にエスパーさせなくてもエラーの再現ができるよう情報を過不足なく伝えることが大切とのことでした(OSのバージョンetc)。


貢献の方法は状況についての報告をするIssueでも良いですし、改善できる内容であればPRを出してみても良いとのことでした。

今回はOSS Gateということでまず日本語でIssueの内容を書いてそれをレビューしてもらい、ブラッシュアップしてから英語に翻訳してコントリビュートしました。

初めてのOSSコントリビューション

Issueの報告とPR

今回私が選んだrails_autolinkに特にエラーは見受けられなかったので、READMEの改善提案をしました。

現状のREADMEは以下のように使用例としてコードと実行結果のみが書かれています。

require 'rails_autolink'

auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
#     say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :urls)
# => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
#     or e-mail david@loudthinking.com"

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :email_addresses)
# => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

auto_link("Go to http://www.rubyonrails.org <script>Malicious code!</script>")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> "

auto_link("Go to http://www.rubyonrails.org <script>alert('Script!')</script>", :sanitize => false)
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> <script>alert('Script!')</script>"

post_body = "Welcome to my new blog at http://www.myblog.com/.  Please e-mail me at me@email.com."
auto_link(post_body, :html => { :target => '_blank' }) do |text|
  truncate(text, :length => 15)
end
# => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.

もちろん、「読めばいいじゃん!」と言われればその通りですが何ができるのかを理解するのに少し時間がかかります。また一つずつが別の例なのか、手順なのかパッとみて判断できない状況のように感じました。

とくに私のようなビギナーであっても、瞬時にこのgemの魅力・実現できることが理解できるREADMEだと助かるな〜と感じたのでREADMEの改善提案することにしました。

私が作った改善提案は以下のようになりました。

基本的な使い方

require 'rails_autolink'

auto_link("Go to http://www.rubyonrails.org and say hello to david@loudthinking.com")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> and
#     say hello to <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

URLのみをリンクに変換する

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :urls)
# => "Visit <a href=\"http://www.loudthinking.com/\">http://www.loudthinking.com/</a>
#     or e-mail david@loudthinking.com"

メールアドレスのみをリンクに変換する

auto_link("Visit http://www.loudthinking.com/ or e-mail david@loudthinking.com", :link => :email_addresses)
# => "Visit http://www.loudthinking.com/ or e-mail <a href=\"mailto:david@loudthinking.com\">david@loudthinking.com</a>"

HTMLタグをサニタイズせずにリンクを生成する

## デフォルトではHTMLタグをサニタイズして、悪意のあるコードから保護
auto_link("Go to http://www.rubyonrails.org <script>Malicious code!</script>")
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> "

## :sanitize => falseをオプションにつけることでサニタイズさせない
auto_link("Go to http://www.rubyonrails.org <script>alert('Script!')</script>", :sanitize => false)
# => "Go to <a href=\"http://www.rubyonrails.org\">http://www.rubyonrails.org</a> <script>alert('Script!')</script>"

リンクのカスタマイズとテキストの短縮

post_body = "Welcome to my new blog at http://www.myblog.com/.  Please e-mail me at me@email.com."
auto_link(post_body, :html => { :target => '_blank' }) do |text|
  truncate(text, :length => 15)
end
# => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>.

このように簡単に1文を添えるだけで何ができるgem なのか瞬時に判断して必要な部分だけ確認することができます。

これもビギナーだからこそ感じる(楽したいだけ?😅)部分でもあるのかな〜なんて感じました。

これを英語に翻訳してIssueとしました。またサポーターの方から、今回はREADMEの修正で差分がでるほうが確認しやすいのでPRという形で出してみては?とアドバイスをもらいPRとしても提出してみました!

mergeされるかどうか見守っていきたいと思います(ドキドキ)。

今回の成果と貢献

提出したIssue

github.com

提出したPR

github.com

2023/10/19追記 無事mergeされました

無事mergeされました!READMEが少し見やすくなりました😊貢献できたことが嬉しいですね〜! 本当に良い経験になりました!

Merge pull request #86 from hirano-vm4/update_README · tenderlove/rails_autolink@2bcb324

感想とまとめ

今回、貴重な機会をいただいたフィヨルドブートキャンプOSS Gateの皆様に感謝です!本当にありがとうございました。

そして、挑戦した自分を少しだけ褒めたいと思います。何事も一歩踏み出してやってみることが大切だと思うので、できる範囲でこれからも挑戦していきたいと思います!


今回の参加を通じて伝えたいメッセージは、OSS活動は誰でも参加できる活動である」ということです。

OSS活動は「各自ができる範囲で貢献する活動」です。私自身、まだ学習途中で現状はビギナーレベルです。

しかし、ビギナーであるからこそ感じること・気づきを共有することで、プロフェッショナルの方々はより専門的な分野に集中できます。

このように、いろんな人が協力し合って成り立つのがOSS活動で、そしてこれが魅力なのかもしれません。

異なるバックグラウンドやスキルを持つ人々が協力し、成り立つ世界って素晴らしいと感じると同時に、恩恵を多大に享受していることに気付かされた1日でした。

参考文献とリソース