初心者向けマストドン改造メモ

分散型SNSであるマストドンを自分で改造したいと思った時に、どうやって環境を作れば良いのか分からなかったので初心者向けのメモを作ってみました。書いている人もあんまり詳しくないので間違いがあったらごめんなさい。また、「各種コマンドはDocker未使用の場合である」こと、「記載は分かりやすさを重視している都合上正確な意味合いから少しずれている場合がある」ことをご理解ください。


# まずGit
[Mastodon Production Guide](https://github.com/tootsuite/documentation/blob/master/Running-Mastodon/Production-guide.md)を読んでインスタンスを立てた場合、マストドンの[公式リポジトリ](https://github.com/tootsuite/mastodon)をCloneして構築しているはずです。なので、改造環境を整える際にもGitを中心として話が進んでいくわけなのですが、マストドンで初めてGitに触れた方もいると思いますので簡単にだけ説明をしておきます。（Gitに関しての入門資料や記事は他のサイトに数多くありますので、詳細はそちらをご参照ください）

Gitを一言で身も蓋もない言い方をすると『便利なバージョン管理システム』で、これから出て来る用語とよく使うコマンドをいくつかご紹介します。

### Git 用語
|#| 用語 | 説明 |
|:-:|:--|:--|
|1|リポジトリ (*repository*)|記録を残しておく倉庫。自分のサーバ上にあるローカルリポジトリとGitHubのようにオンライン上にあるリモートリポジトリの２種類がある。|
|2|ブランチ (*branch*)|枝分かれした作業履歴の記録。分かりやすく言うと平行世界(世界線)的なもの。|
|3|コミット (*commit*)|反映した修正|

### Git コマンド
|#| コマンド | 説明 |
|:-:|:--|:--|
|1|fetch|リモートリポジトリから更新情報を取得|
|2|branch|ブランチの一覧表示やリネームなどの操作|
|3|checkout|ブランチ間の移動（平行世界への移動）|
|4|commit|修正内容をローカルリポジトリへ反映|
|5|merge|変更内容の取り込み（ブランチの統合・世界線の収束）|
|6|pull|リモートリポジトリの内容を取得して今のブランチに反映（fetch + merge）|
|7|push|ローカルリポジトリの内容をリモートリポジトリへ反映|

### お薦め資料
+ [こわくない Git](https://www.slideshare.net/kotas/git-15276118)
+ [【Git】基本コマンド](http://qiita.com/konweb/items/621722f67fdd8f86a017)

# 開発環境のバリエーション
## 1. Gitを使わない方法
Gitのバージョン管理機能を使用せずに、自分自身でバージョンと差分の管理をする方法です。

![Qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/179539/5d874587-f37f-7e16-e367-fe1b76a2063b.png)

マストドンが使用するディレクトリとは別の場所に改造したファイルを保管し、マストドンのインストールやバージョンアップ作業後に差し替えます。一番簡単でわかりやすい方法ですが、git管理されているファイルを改造した場合、次回のバージョンアップ作業時にgitコマンドに怒られることになるので、バージョンアップ前に元の状態に戻す作業が必要になります。また、最新版の修正箇所と自身の改造箇所がコンフリクト（競合）を起こしていないかを毎回チェックして手動でマージしなければならないので、運用が非常に面倒です。

## 2. git stashを使う方法
方法１を少し発展させて差分管理をgitにやらせる方法です。

![Qiita02.png](https://qiita-image-store.s3.amazonaws.com/0/179539/44968d77-b648-ff07-a542-c665697e3568.png)

この方法のポイントは自身で改造した内容を一時的に退避させることで、改造前の状態に戻せるという点です。改造前の状態に戻して生の状態でバージョンアップを行った後、最初に退避させた改造内容を再度反映します。改造内容の退避と反映はgitコマンドを使用して行いますので、最新版の修正箇所と自身の改造箇所がコンフリクト（競合）を起こしていないかはgitコマンドが自動的にチェックしてくれます。

■改造内容の退避

```bash
git stash
```
■改造内容の反映

```bash
git stash apply # 退避させた内容を残しておく場合
git stash pop   # 退避させた内容を削除していい場合
```

本家の修正箇所と自身の改造箇所がコンフリクトを起こしている場合は"git stash apply(pop)"の際にその旨が表示されますので、手動でコンフリクト部分を解消しましょう。

## 3. 改造版ブランチを作成する方法
自分用の改造版ブランチを作成して本家のブランチと分離する方法です。

![Qiita03.png](https://qiita-image-store.s3.amazonaws.com/0/179539/6775457b-8a09-cc83-1b6d-cbf730927d05.png)

方法2までは本家のブランチに自身の改造を付与するイメージでしたが、方法3以降は本家のブランチと分離して自分自身のためのブランチを立ち上げます。

■ブランチの作成と確認

```bash
git branch myMastodonBranch

git branch
* master
  myMastodonBranch

git checkout myMastodonBranch
Switched to branch 'myMastodonBranch'

git branch
  master
* myMastodonBranch
```
新たに作成したブランチに対して改造を加えていくのですが、改造するだけではブランチに反映されません。なので、コミットを実行して改造内容を確定させます。自分しか使わないブランチですので、コミットの単位はお好みで良いと思いますが、ある程度まとまりつつもできるだけ小さな単位でのコミットが好ましいとされています。

■改造内容の反映

```bash
git add <file_name>       # 新規に追加したファイルがある場合にgit管理対象として追加する
git commit -am 'My Kaizo' # 改造内容をメッセージに付与してコミット
```

これで変更内容を確定できたわけですが、分離したブランチには本家で加えられた修正は反映されませんので、自分で取り込む必要があります。

■本家ブランチの修正取り込み（Tag追従）

```bash
git fetch --tags origin
git merge v1.5.x -m "Merge Commit for v1.5.x"
```

本家の修正箇所と自身の改造箇所がコンフリクトを起こしている場合は"git merge"の際にその旨が表示されますので、手動でコンフリクト部分を解消しましょう。


## 4. 自分のGitHubリポジトリと連携する方法（推奨）
方法3ではローカルリポジトリにのみ自分のブランチが存在しましたが、GitHub上のリモートリポジトリにもその内容を反映します。これにより、開発検証サーバで作成したブランチを本番サーバで使うといった運用が可能になります。ただ、本家のリポジトリに反映することは出来ませんので、本家のリポジトリをコピー(fork)して作成した自分用のリポジトリを使います。

![Qiita06.png](https://qiita-image-store.s3.amazonaws.com/0/179539/f662059b-590c-8791-6346-17f1229b380a.png)


■自分用のリポジトリの作成
GitHubのアカウントにログイン（アカウントを持っていない場合は新規登録）し、[公式リポジトリ](https://github.com/tootsuite/mastodon)の右上にある"Fork"ボタンを押下して自分用のリポジトリを作成します。

![スクリーンショット 2017-08-17 13.27.04.png](https://qiita-image-store.s3.amazonaws.com/0/179539/1fcade39-c60e-f875-f6b8-b5789fa1a65c.png)

■自分用のリポジトリを登録
先ほど作成したリポジトリをサーバに登録します。"my_repo"はサーバ上での識別子なので任意の名前で登録して大丈夫です。

```bash
git remote add my_repo https://github.com/xxxxxxx/mastodon.git # HTTPSの場合
```

■リポジトリへブランチを登録
方法3の手順で改造をローカルリポジトリへ登録した後、リモートリポジトリにも反映します。

```bash
git push my_repo myMastodonBranch
```

# 簡単な改造
手軽に始められる改造をいくつかご紹介します。画像の差し替えなどのアセット系の改造は再生成が必要になりますので、その際は下記コマンドを実行してください。

```bash
RAILS_ENV=production bundle exec rails assets:precompile
```

## 画像を変更する
"app/javascript/images"内の画像ファイルを改造ファイルを差し替えることで、Webpackerで生成される画像が差し替えられた画像に切り替わります。

## 表示されるメッセージを変更する
各言語に対応したメッセージは下記のディレクトリ内に格納されていますので、変更したいメッセージが含まれているファイルを探して編集します。

+ "config/locales"内の"*ja.yml"ファイル
+ "app/javascript/mastodon/locales"内の"*ja.json"ファイル

## スタイルシートを変更する
"app/javascript/styles"に各画面に対応した"*.scss"ファイルが格納されていますので、変更したい部分が含まれているファイルを探して編集します。通常のCSS形式ではなく、SCSS形式で記述されている点に注意が必要です。


# 最後に
マストドンが採用しているライセンスはAGPLです。AGPLは商用利用や改造の自由が認められている一方で、改造したソースコードの公開義務などが課せられるライセンスなのでその辺りはご注意ください。