RubyGemsの作り方

##1: アップデート

```bash
# gem自身のアップデート
gem update --system
# bundlerインストール済の場合はアップデート
$ gem update bundler
$ bundler --version
```

##2: ひな形の作成

今回は、ナイーブベイズ(Naive Bayes)に関するgemを作ります。
ディレクトリを前もって作成する必要はありません。

```bash
$ bundle gem  jnb_classifier
```
作成時に何もオプションを指定しなければ、対話形式に以下のことが聞かれます。
・テストは　Rspec? 　Minitest?
・MITライセンスで良いいよね？
・code of conduct に関するファイルを生成する？

最後の質問に関してはこちらを参照して下さい。
[Contributor Code of Conduct](https://qiita.com/nstoym/items/ca711287117074a810aa)

以下のファイルが生成されます。

```bundle
$ cd /nb_classifier
$ ls
CODE_OF_CONDUCT.md  Gemfile  LICENSE.txt  README.md  Rakefile  bin  lib  jnb_classifier.gemspec  spec
```

##3: gem_name.gemspec の修正

このファイルの中に"TODO"というワードが含まれているとbundleできない仕組みなので、少なくとも以下の点は書き直す。

`jnb_classifier.gemspec `

```ruby
spec.summary       = %q{jnb_classifier helps you classify samples by Naive Bayes.}
spec.description   = %q{I will write this section when I finish creating this gem}
spec.homepage      = "https://github.com/your_github_acoount/"
```

##4: 実際のコードを記述する

`vim lib/jnb_classifier.rb `

```ruby
require 'jnb_classifier/version'
require 'natto'

module bClassifier
  # ここにコードを記述します。
end
```


##5:Bundle

今回は、`natto`というgemを使うので、`jnb_classifier.gemspec`に追記します。

```ruby
spec.add_runtime_dependency `natto`
```

そして、bundle

```
$ bundle install --path .bundle
```

※`--path .bundle`というオプションを指定することで、gemパッケージのインストールの影響をこのディレクトリにとどめています。

※.gemspecにrubyの内部モジュールを指定すると失敗するので注意（open-uriとか）

以下のような表示がされます。

```
Using rake 10.5.0
Using bundler 1.16.0
Using diff-lcs 1.3
Using nb_classifier 0.1.0 from source at `.`
```

・`rake`、`bundler`、`diff-lcs`の３つはデフォルトのgemで、開発のために必要な`development_dependency`として、`jnb_classifier.gemspec`に定義されています。

```ruby
  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec", "~> 3.0"
```

## 6:使ってみる

nb_classifierディレクトリ下に、`occult.txt`、`cosplay.txt`があるとします。

```bash
$ bundle exec irb
$ require 'jnb_classifier'
$ doc_occult =  JnbClassifier::Document.new('occult','occult.txt')     # 単語頻度の数え上げ（hash）
$ doc_cosplay =  JnbClassifier::Document.new('cosplay','cosplay.txt')  
$ jnb = JnbClassifier::Classifier.new
$ jnb.learn(doc_occult)     # 学習①
$ jnb.learn(doc_cosplay)    # 学習②
$ jnb.classify({"ヤクザ"=>1, "人"=>1,"彼女"=>1})              # 分類（結果）
```

期待通りの動作を確認できたので、gemをビルドして公開します。


## 7:ビルド

jnb_classifierディレクトリ直下で行います。

```bash
$ rake build
```

パーフェクト Ruby より抜粋
>ビルドを行うと作業ディレクトリ直下にpkgディレクトリが作成され、その下にgem_name.gemというファイル名でビルドされたgemパッケージのバイナリファイルが作成されます。

```bash
$  gem install pkg/jnb_classifier-0.1.0.gem 
```

あとは、ローカル環境では`require jnb_classifier` することで自由に使えます。

今回は、buid => install という風に行いましたが以下のコマンドで同様のことを行えます。

```bash
$ rake install
```

以下のようにrubyのファイルで作成することができます。

`test.rb`

```ruby
require 'jnb_classifier'

file_cosplay = "cosplay.txt"
doc_cosplay = JnbClassifier::Document.new("cosplay", file_cosplay)

file_occult = "occult.txt"
doc_occult = JnbClassifier::Document.new("occult", file_occult)

# 学習
yahoo_cat = JnbClassifier::Classifier.new
yahoo_cat.learn(doc_cosplay)
yahoo_cat.learn(doc_occult)
yahoo_cat.learn(doc_occult)
# 分類
test_hash = {"彼女"=>1, "コスプレ"=>1, "伝説"=>1}
puts  yahoo_cat.classify(test_hash)
```

```bash
$ ruby test.rb
```

##8: 修正（ビルド後）
ビルドした後にいろいろ修正したい点が出てきた場合についてです。
今回はクラスの名前`NaivBayse`を初めいろいろ修正したい点が出てきたので以下のプロセスで修正しました。

①作業ディレクトリに戻り修正する
②rake install

とても簡単にできますね。


##9: 公開

GitHubと連携して管理するようなので以下のことは前提となります
・GitHubアカウントを持っていること
・magnetohydrodynamical
・GitHub用にSSHキーの設定を行う：[GitHubへssh接続する](https://qiita.com/chamao/items/14f884042fbe03158a16)


①rubygems.orgのアカウントを取得
[作ったgemをリリースするまで](https://qiita.com/kyohei8/items/b292f727e213ed7db9d7)
1.「sign up」からアカウントを作成
2. アカウント作成後、Edit profile(https://rubygems.org/profile/edit) に移動
3. APIアクセス用の鍵を作成（以下のコマンドが用意されている）

コマンド

```
curl -u your_name https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
```

②GitHub上のリモートリポジトリの設定（たぶん必要）
現在の作業用でじレクトリをリモートリポジトリに反映させます
[Githubに新規リポジトリ(Repository)を作成する](https://qiita.com/bakainubau/items/4613dda50a5fa302d212)

```bash
$ git init
$ git add
$ git commit -m "my first commit"
$ git remote add origin https://github.com/xxxx/sample-repository.git
$ git push origin master
```

③リリース
あとは、releaseするだけ。

```bash
$ bundle exec rake release
```

おしまい。

##ハマりどころ
自分の場合releaseがうまくいかなくって、だいぶハマった。
結論としては[apache logをパースするgemを作ってrubygems.orgに公開してみた](https://qiita.com/takady/items/a4858c09b56e2b185814)と全く同じ状況におちいってしまった。

>$ bundle exec rake releaseが終わらねぇ・・

```bash
$ cat ~/.gem/credentials
HTTP Basic: Access denied.
```

となっていた。上記のcurlコマンドが上手く行かなかったらしい。
手動で以下のように設定(APIキーはこのページ：https://rubygems.org/profile/edit)。

`~/.gem/credentials`   

```
:rubygems_api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

## 頑張りどころ
####README.md を書こう
書き方など参照
[わかりやすい README 駆動開発](https://qiita.com/b4b4r07/items/c80d53db9a0fd59086ec#_reference-b44ebe2d406688f9bd3b)

エディタもある便利
[Linux Mint 18: マークダウンエディター「Ghostwriter」](http://baker-street.jugem.jp/?eid=342)






##参照
[RubyGemはめっちゃ簡単に作れる！　](http://morizyun.github.io/blog/ruby-gem-easy-publish-library-rails/)