GitHub等を用いて論文のプログラムを公開する手順メモ

ソースコードと用いたデータは論文を書く段階では一緒の場所に置くことが多いが、公開は別々にやった方が良いだろう。


# ソースコード等の配布
GitHubが最もPopularな手法であろう。
まずは[モデルケース](https://github.com/kennethreitz/samplemod)を見てみると良い。

## ディレクトリ構造
自分用メモなので、多少簡略化して書くが[先人の記事](https://qiita.com/Kensuke-Mitsuzawa/items/7717f823df5a30c27077)を参照するとディレクトリ構造は大まかに次のようになるべきだろう。
他の記事も参照して自分にあったものを探してほしい。
http://docs.python-guide.org/en/latest/writing/structure/

```
.
├── LICENSE
├── README.md
├── package
│   ├── __init__.py
│   ├── core.py
│   └── helpers.py
├── setup.py
└── tests
    ├── __init__.py
    ├── test_advanced.py
    └── test_basic.py
```

- 説明用、顔としてのReadme
- LICENSEファイル
- プログラムをモジュール化した本体
- そのテストコード
- インストールのためのsetup.py

## Readmeの書き方

Readmeの書き方には多くの流派があるようだが私は[こちらの方](https://deeeet.com/writing/2014/07/31/readme/)の記事を参考にしている。
学術論文のソースの公開の場合次のようなものを使用する。

```Markdown
Name
====

Overview

## Description

## Requirement

## Install

## Usage

## Demo

## Licence

[MIT](https://github.com/tcnksm/tool/blob/master/LICENCE)

## Reference
[1]User Name, 'Paper Titile' Conference Name pp.xx 20XX

[tcnksm](https://github.com/tcnksm)
```

## LICENSEの選び方

学術論文ならMITまたは2、3条項のBSDで良いだろう。
LICENSEファイルはGoogle検索したら適当な文面がHitするのでそれをCopy。


## setup.pyの書き方

[ここの記述](https://qiita.com/Kensuke-Mitsuzawa/items/7717f823df5a30c27077)がやはりとても為になる。とりあえず自分の使ってみたTemplateを載せておく。


```python3
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from setuptools import setup, find_packages

__author__ = 'ossyaritoori'

setup(
    name='fugafuga',  
    version='1.0',  
    description='Cool Description',  
    author='ossyaritoori', 
    author_email='XXXX@gmail.com',  
    url='https://github.com/XXX/fugafuga', 
    classifiers=[ 
        'Development Status :: 4 - Beta',
        'Intended Audience :: Science/Research',
        'License :: OSI Approved :: BSD License',
        'Natural Language :: English',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3 :: Only',
    ],
    packages=find_packages(), 
    include_package_data=True,  
    keywords=['Image Registration'], 
    license='BSD License', 
    install_requires=[ # 依存関係 
        'opencv-python',
        'opencv-contrib-python',
        'numpy',
        'matplotlib',
    ],
)
```
特に依存関係にきちんと気を使うべきなのと、書きかけのプロジェクトの場合、雑多なファイル群が多くなるだろう。
パッケージの指定では、どうやらsetup.pyのディレクトリの同じ階か一つ下の階から探しているようなので例えば

```
packages=['SourceDirectory'] 
```
とすれば該当するディレクトリのみを検索してくれる。


## 配布用のPackage作成

このあたりはまだまだわからないことが多い。
誰かの例を見ても結構ひとそれぞれだったりして統一的見解を醸成できていない。

もろもろのディレクトリ構造の役割については[英語記事](http://docs.python-guide.org/en/latest/writing/structure/)で詳しいやつが合った。

###  `__init__.py`
配布用のPackageは適当なフォルダに置く。
その際、`__init__.py`を置いたところがパッケージ箇所として認識される。
例えば、以下のようなディレクトリ構成だとすると

```
├── package
│   ├── __init__.py
│   └── yourpackage.py
```

このファイルの中身は最低限こうあるべき…なはず。

```python
from . import yourpackage
```

他の例があるならコメントで教えてください。
このままだとinstallした時にpackage.youpackage.Functionという感じで冗長に呼ばなきゃいけなくなるような…？それって面倒だなぁ。


### ソースコードからインストールさせる
次のような感じでインストールさせられる。

```
 git clone https://github.com/FUGAFUGA/hogehoge
 cd Projects
 python setup.py install
```

### PIP でインストールさせる

pipでの配布方法はいろいろあるがwheelを用いてインストールさせるのが一番簡単そう。
```pip install wheel```
といれてmoduleを入れる。
その後、

```
python setup.py bdist_wheel
```
を実行することでwheelファイルを作成可能だ。

あとはこのwhlファイルを指定してpip installさせても良いし、PYPIというサービスに登録することでOnlineで配布することもできる。

一連の流れは[ここの記事](https://qiita.com/kinpira/items/0a4e7c78fc5dd28bd695)に詳しい。


# データを公開する
GitHubはあくまでソースの管理を行うためのサービスで画像データなどを公開するのには向かない。
偉い人や研究室は自前のサーバーを立ててデータを公開しているかもしれないが、とりあえずは入門としてGoogleDriveやDropboxの同期機能を使おうと思っている。
問題がありそうならまた考えることにする。

# 総括
とりあえず初心者が自分のパッケージを発表する際の流れと手順をそれなりに詳しく書いたつもりです。意見やアドバイスなどあれば歓迎します。