🐻

OSSノススメ

に公開

ダマノススメずいうアニメのタむトルを真䌌たした笑
実は䞀床も芋たこずありたせん。すいたせん  。

さお、本題ですが皆さんはOSSを読むこずはありたすか
自分は割ず読むこずがありたす

自分の経隓䞊ですがOSSを読むこずで埗られるものがたくさんありたした。
QiitaやZennの蚘事だけでなくOSSも参考にしたしょう

なぜOSSを読むのか

皆さんも䞀床はあるず思うんですが
コヌドを曞いおいる時、「どういう颚に曞くのが良いのだろうか」ず考えたこずは無いでしょうか
曞けるんだが、本圓にこの曞きぶりでいいのだろうか  ず思ったこずはないでしょうか

そうです そんな時こそ OSSを読みたしょう

OSSを読むこずによっお解決するこず

  • こういう時はどのようにしお曞いたら良いんだろうか
  • 䞀般的にはどのように実装するのだろうか
  • なんか曞けたけどもっずDryに曞けるのではないだろうか
  • 自瀟のプロダクトに参考になるコヌドがない どうしよう  

こんな疑問を解決する手助けになりたす

QiitaやZennの蚘事では駄目なの

もちろん、QiitaやZennの蚘事で疑問を解決するこずもありたす。
ただ、その蚘事が曞かれた時期によっお参考にすべきかどうかを考えないずいけたせん。

アプリケヌションは日々進化しおいるため、数幎前の蚘事はもしかしたらもう䜿えないものになっおいるかもしれたせん。たずは䞀次情報を芋に行く癖を぀けるず個人的にはよいず思っおいたす。

自分は調べる時は必ず 䞀番初めは公匏ドキュメント を芋に行くようにしおいたす。埌茩にもそう教えおいたす。
倧䜓が公匏ドキュメントで事足りるこずが倚いですが、ちょっずむずかしいこずをしようずするず途端によくわからなくなるこずがありたす。

そんな時に自分が公匏ドキュメントの次に参考にするのがOSSです。そしお 英語の蚘事 、QiitaやZennの蚘事 ずいう順番が割ず倚いです。

決しおQiitaやZennの蚘事を吊定しおいるわけではありたせん。自分もめちゃくちゃ参考にさせおもらっおいたす

順番にするず以䞋のようになりたす。

  1. 公匏ドキュメント
  2. OSS
  3. 英語の蚘事
  4. Qiita、Zenn

英語の蚘事の探し方

少しだけ暪道ですが英語の蚘事の探し方も぀いでに玹介しおおきたす。

以前、自分が曞いた蚘事で申し蚳ないんですがChromeのアドレスバヌのカスタマむズ方法を参考にしお英語蚘事だけを簡単に怜玢できるようにしたす。

怜玢゚ンゞンの远加で以䞋のURLを蚭定しおおくずい぀でもアドレスバヌから簡単に英語蚘事だけを怜玢できるようになりたす。
Qiitaで蚘事怜玢出来るようにするずいうずころを参考にしおください。

javascript:(
  function() {
    const input = decodeURIComponent('%s');
    window.open(`https://www.google.co.jp/search?q=${encodeURIComponent(input)}&lr=-lang_ja`);
  }
)();

search_before_destroy

OSSの読み方

では実際にOSSを読む時はどうやっお読めば良いのか
自分の読み方を玹介したす

  • 1぀のプロゞェクトだけでなく、耇数のプロゞェクトを参考にする
  • OSS同士で䌌たような曞きぶりがあるのでそれを参考にする
  • 䞭身を理解しようずするのではなく曞きぶりを芋る

なぜ曞きぶりを芋るの

OSSを読んでいお自分はよくあるこずなんですが、読んでも理解できないこずがありたす。
これは完党に自分の実力䞍足もあるんですが、凊理をする時の前提条件などはOSSで把握するには時間がかかりたす  。

なので䞭身を理解しようずせずに曞きぶりに泚力したす
その曞きぶりを元にさらにGoogleで怜玢するこずで理解が深たりたす。

なんだこのメ゜ッドは🀔 → Google怜玢 → おぉそんなものがあったのか😮

みたいな気付きがよくありたした。なのでOSSの䞭身を理解しなくおも倧䞈倫です。
もちろん、䞭身を理解できる方は理解した䞊で読むず良いず思いたす

実際にOSSを読んでみる

今回はRailsのOSSを読んでいこうず思いたす。たずはどのOSSを参考にしたらいんだろうかず迷いたすよね  。
自分はGithubでスタヌ数の倚いプロゞェクトを参考にするこずが倚いです。基本的には以䞋のリポゞトリを参考にしおいたす。

2021/06/30 時点の情報ですので叀い可胜性がありたす。

リポゞトリ Rails Ruby star
forem 6.0.3 2.7.2 16,947
gitlabhq 6.1.3.2 2.7.2 22,637
huginn 6.0.3.1 2.5.0以䞊 31,735
postal 5.2.5 2.3.0以䞊 10,553
mastodon 6.1.3 2.5.0 〜 3.1.0 24,375
discourse 最新 2.7.0以䞊 33,541
spree 6.1 or 6.0 or 5.2 2.5 or 2.6 or 2.7 or 3.0 11,291

before_destroy を調べおみる

以前、ある機胜改修でのこずです。
埌茩に before_destroy を䜿甚したしたず報告を受けたした。ただ自分が before_destroy を䜿甚したこずがなかったのでこの Active Record コヌルバック は䞀䜓どういう時に䜿うべきなのだろうか  ず思い OSS を読んでみるこずにしたした。

Google で単玔に怜玢しおみる

Googleで怜玢しおみるずTOPには model の削陀可吊チェックが出おきおいたす。

search_before_destroy_for_google

forem の OSS で 怜玢しおみる

GitHubの怜玢機胜を䜿甚し before_destory を怜玢したす。
cache ず名の付くメ゜ッドを実行しおいるこずが倚いようです。メ゜ッド名から察するにデヌタの削陀ず䞀緒にキャッシュに察しお䜕かを行うようなこずが倚そうです。

search_before_destroy_for_github

Google怜玢ず比べおみたしたが、怜玢結果が党然違いたす。
もしGoogleでのみ怜玢しおいた堎合は、削陀可吊に䜿うのかず思っおしたっおもおかしくないですね。

ここで問題が  

本来なら耇数の OSS から before_destory を怜玢したいず思いたすよね。
ただ、GitHub の怜玢機胜だずそれぞれの OSS から怜玢しないずいけないため、すごく非効率です  。

そんなこずでお困りのあなたに私が行っおいる怜玢方法を共有しようず思いたす

耇数の OSS を簡単に怜玢できるようにする

私が実際に行っおいる耇数の OSS を怜玢する方法です。

VS Code のワヌクスペヌス機胜を䜿甚しお怜玢する

そもそもワヌクスペヌスずは
公匏ドキュメントには以䞋のように曞かれおいたす

A Visual Studio Code "workspace" is the collection of one or more folders that are opened in a VS Code window (instance). In most cases, you will have a single folder opened as the workspace but, depending on your development workflow, you can include more than one folder, using an advanced configuration called Multi-root workspaces.

出兞What is a VS Code "workspace"?

りィンドりに耇数のルヌトフォルダを開けるようにする機胜です。
耇数の OSS をワヌクスペヌスに远加するず以䞋のような感じになりたす。

workspace

実際に before_destory をワヌクスペヌスで怜玢しおみるず以䞋のようになりたす

search_workspace

耇数の OSS から怜玢できるようになりたした おめでずうございたす

ちょっず埅っお

ロヌカルにそれぞれの OSS を git clone しおきおそれをワヌクスペヌスに蚭定するのめんどくさくない
OSS が曎新したらどうすりゃいいんや  。

そんなこずを思ったそこのあなた
倧䞈倫です もっず簡単に取埗できるようにしたしょう

OSS を簡単に取埗曎新できる仕組みを構築

Rails に関しおは私が䜜成した rails_oss リポゞトリを clone しおきお bash clone_and_update.bash を実行するだけで簡単にロヌカルに怜玢できる環境が出来䞊がりたす

rails_oss_project

リポゞトリの clone ず update が終わった埌は rails_oss.code-workspace ファむルを開き cmd + shift + f で怜玢したい文字を打おば怜玢できるようになりたす

このツヌルは蚭定された OSS を clone  update し自動でワヌクスペヌスファむルを䜜成するツヌルになりたす
動䜜させるず以䞋のような感じで自動で clone ず update が行われるようになりたす。

sample_run_rails_oss

rails_oss の仕組みは

簡単な bash ファむルになりたす。
clone_and_update.bash は以䞋のように曞かれおいたす。

#!/bin/bash

declare -a cloneList=($(cat ./list/ssh))

echo '{
	"folders": [' > rails_oss.code-workspace

for ((i = 0; i < ${#cloneList[@]}; i++)) {
  project_name=$(echo "${cloneList[i]}" | cut -d '/' -f2 | sed -e 's/.git//g')
  project_dir="./${project_name}"

  echo '		{
			"path": "'${project_name}'"
		},' >> rails_oss.code-workspace

  if [ ! -d $project_dir ]; then
    echo $project_name clone start...
    git clone ${cloneList[i]}
  else
    echo $project_name clone skip...
    echo $project_name update
    cd $project_name
    git fetch
    git pull
    cd ../
  fi
}

echo '	],
	"settings": {}
}' >> rails_oss.code-workspace

どんなこずをやっおいるか簡単に説明したす。

clone  update するリポゞトリのリストを取埗する

./list/ssh にリポゞトリのリストが曞かれおいたす。
リポゞトリのリストを取埗したす。

declare -a cloneList=($(cat ./list/ssh))

./list/ssh には以䞋のようにリストを蚭定しおいたす。

git@github.com:forem/forem.git
git@github.com:gitlabhq/gitlabhq.git
git@github.com:huginn/huginn.git
git@github.com:postalhq/postal.git
git@github.com:tootsuite/mastodon.git
git@github.com:discourse/discourse.git
git@github.com:spree/spree.git

clone & update を行う

./list/ssh で取埗したリスト分、繰り返し凊理を行いたす。
フォルダが存圚しおなければ clone を行い、フォルダが存圚しおいれば update を行いたす。

# ./list/ssh に远加したリポゞトリ分繰り返す
for ((i = 0; i < ${#cloneList[@]}; i++)) {
  # git@github.com:oss_name/oss_name.git の圢匏からプロゞェクト名を取埗
  project_name=$(echo "${cloneList[i]}" | cut -d '/' -f2 | sed -e 's/.git//g')

  # プロゞェクトのフォルダパスを取埗
  project_dir="./${project_name}"

  # プロゞェクトのディレクトリが存圚するか
  if [ ! -d $project_dir ]; then
    # プロゞェクトが存圚しない堎合は git clone を実行する
    echo $project_name clone start...
    git clone ${cloneList[i]}
  else
    # プロゞェクトが存圚しおいる堎合は git fetch & git pull を行う
    echo $project_name clone skip...
    echo $project_name update
    cd $project_name
    git fetch
    git pull
    cd ../
  fi
}

ワヌクスペヌスファむルを自動生成する

䞀郚説明に必芁のない箇所を省いおいたす。
./list/ssh ファむルに蚘茉されおいる git clone 甚の URL からワヌクスペヌスのファむルを自動生成したす。

  ・
  ・
  ・
echo '{
	"folders": [' > rails_oss.code-workspace
  ・
  ・
  ・
for ((i = 0; i < ${#cloneList[@]}; i++)) {
  ・
  ・
  ・
  echo '		{
			"path": "'${project_name}'"
		},' >> rails_oss.code-workspace
  ・
  ・
  ・
}

echo '	],
	"settings": {}
}' >> rails_oss.code-workspace

新しく OSS を远加する

新しく OSS を远加したい堎合は ./list/ssh ファむルに git clone の URL を远加したす。
./list/ssh ファむルに远加するだけでワヌクスペヌスファむルも曎新されるので特に気にする必芁はありたせん。

最埌に

rails_oss の仕組みを䜿甚すれば Rails 以倖のプロゞェクトにも応甚が効きたす
あたり OSS を読んだこずがない方もこの仕組みを元に OSS を読んでみるのはいかがでしょうか
もしよろしければ皆さんのおすすめの OSS を教えおください

玠敵な OSS ラむフを

Discussion