colaboratoryノートブックをGitHub上で扱うために、初期設定するcolaboratoryノートブック作った

# はじめに

みなさま、colaboratory使ってますか？

無償で中々のスペックの環境が利用できるので非常に便利ですが、そこで作成したノートブックは、Google Driveに保存され、管理や共有には若干手間がかかります。
一方で、GitHubに保存したノートブックは、colaboratoryで開くこともできますし、他のファイルとまとめて管理したり共有したりするのに便利です。

ただ、colaboratoryで作成したノートブックをGitHubに保存した後は、自動保存されたGoogleDrive上のノートブックを削除しないといけないし、それを回避するために先にGitHubレポジトリにファイルを作るのも結構面倒・・・。
そういう訳で、ズボラに使いまわせるよう、GitHubにレポジトリとノートブックを作成するノートブックを作ってみました。

# 手順

今回作成したノートブックは[こちら](https://github.com/calderarie/ColaboratoryInitialSetting/blob/master/colaboratory_initial_setting.ipynb)で置いています。

事前準備は以下の通りです。慣れていれば10分程度、そうでなくても20分くらいで済みます。

- GitHubのアクセストークンを取得する
 - 参考： [GitHub「Personal access tokens」の設定方法](https://qiita.com/kz800/items/497ec70bff3e555dacd0)
- Google Driveの任意の環境に前述のノートブックを保存する
 - アクセストークンを使うので、非公開設定にしておくこと
- ノートブックのアクセストークンを自分のもので書き換えておく

ここまで設定すれば、次からは、必要な時に以下の手順を行うだけです。

1. Google Driveでノートブックを開く
2. ノートブック内で作成するレポジトリ名やノートブック名を指定する 
3. ノートブックを実行する
4. リンクが生成されるので、ノートブックを開く

一度作成したノートブックの変更は、colaboratoryのツールバー上で「ファイル」「GitHubにコピーを保存」から反映できます。

# ノートブックの詳細
## 設定

使用するライブラリをインストールし、レポジトリやファイル名を設定。
アクセストークンは各自取得したものに置き換えます。

```python:設定
!pip install -q PyGitHub

from github import Github, GithubException
import nbformat

access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

repository_name = 'TestRepository' 
ipynb_file_name = 'test.ipynb'
```

## レポジトリ作成

指定したレポジトリが存在しない場合作成します。

```python:レポジトリ作成
github = Github(access_token)
user = github.get_user()

try:
  user.create_repo(repository_name)
except GithubException:
  print(f'{repository_name} already exists on this account.')
```

## ノートブックデータ作成

作成するノートブックをここで定義します。通常のプログラムのセルは勿論、マークダウンセルも定義できる。
自分がよく使う設定があればここを書き換える。

```python:ノートブックデータ作成
nb = nbformat.v4.new_notebook()

title = '# setting'
code = """
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
"""

nb["cells"] = [
    nbformat.v4.new_markdown_cell(title),
    nbformat.v4.new_code_cell(code)
]
```

## レポジトリでノートブック作成

前段で定義したノートブックをレポジトリ上に作成します。
同名のファイルがあるときは怒られるので、エラーを出すようにしています。

```python:レポジトリにノートブック作成
repo = user.get_repo(repository_name)

try:
  repo.get_contents(ipynb_file_name)
  raise(Exception(f'{ipynb_file_name} already exists in {repository_name}.'))
except GithubException as e:
  repo.create_file(ipynb_file_name, f'create {ipynb_file_name}', nbformat.writes(nb))
```

## 作成ファイルのリンク出力

GitHubに作成したファイルは、以下の規則のリンクでアクセスできます。

```python:
print(f'github: https://github.com/{user.login}/{repository_name}/blob/master/{ipynb_file_name}')
print(f'colab:  https://colab.research.google.com/github/{user.login}/{repository_name}/blob/master/{ipynb_file_name}')
```

# 参考
 - [GitHub「Personal access tokens」の設定方法](https://qiita.com/kz800/items/497ec70bff3e555dacd0)
 - [GitHub API v3 でリポジトリを作成して、ファイルをコミットする]( https://qiita.com/ngs/items/34e51186a485c705ffdb)
 - [PyGithub — PyGithub 1.43.5 documentation](https://pygithub.readthedocs.io/en/latest/index.html)
 - [PythonでJupyterノートブック「.ipynb」を生成する
](https://qiita.com/pashango2/items/589522868a27ccdfdc55)
 - [The Jupyter Notebook Format — nbformat 4.5 documentation](https://nbformat.readthedocs.io/en/latest/index.html)
 - [GitHub 上の Jupyter Notebook 形式のファイルに Google Colaboratory で開くリンクを作成](https://qiita.com/peaceiris/items/4761b200eae6c7fb0e66)
 - [Open in Colab](https://chrome.google.com/webstore/detail/open-in-colab/iogfkhleblhcpcekbiedikdehleodpjo)