##1: アップデート
# gem自身のアップデート
gem update --system
# bundlerインストール済の場合はアップデート
$ gem update bundler
$ bundler --version
##2: ひな形の作成
今回は、ナイーブベイズ(Naive Bayes)に関するgemを作ります。
ディレクトリを前もって作成する必要はありません。
$ bundle gem jnb_classifier
作成時に何もオプションを指定しなければ、対話形式に以下のことが聞かれます。
・テストは Rspec? Minitest?
・MITライセンスで良いいよね?
・code of conduct に関するファイルを生成する?
最後の質問に関してはこちらを参照して下さい。
Contributor Code of Conduct
以下のファイルが生成されます。
$ 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
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
require 'jnb_classifier/version'
require 'natto'
module bClassifier
# ここにコードを記述します。
end
##5:Bundle
今回は、natto
というgemを使うので、jnb_classifier.gemspec
に追記します。
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
の3つはデフォルトのgemで、開発のために必要なdevelopment_dependency
として、jnb_classifier.gemspec
に定義されています。
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
があるとします。
$ 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ディレクトリ直下で行います。
$ rake build
パーフェクト Ruby より抜粋
ビルドを行うと作業ディレクトリ直下にpkgディレクトリが作成され、その下にgem_name.gemというファイル名でビルドされたgemパッケージのバイナリファイルが作成されます。
$ gem install pkg/jnb_classifier-0.1.0.gem
あとは、ローカル環境ではrequire jnb_classifier
することで自由に使えます。
今回は、buid => install という風に行いましたが以下のコマンドで同様のことを行えます。
$ rake install
以下のようにrubyのファイルで作成することができます。
test.rb
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)
$ ruby test.rb
##8: 修正(ビルド後)
ビルドした後にいろいろ修正したい点が出てきた場合についてです。
今回はクラスの名前NaivBayse
を初めいろいろ修正したい点が出てきたので以下のプロセスで修正しました。
①作業ディレクトリに戻り修正する
②rake install
とても簡単にできますね。
##9: 公開
GitHubと連携して管理するようなので以下のことは前提となります
・GitHubアカウントを持っていること
・magnetohydrodynamical
・GitHub用にSSHキーの設定を行う:GitHubへssh接続する
①rubygems.orgのアカウントを取得
作ったgemをリリースするまで
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)を作成する
$ 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するだけ。
$ bundle exec rake release
おしまい。
##ハマりどころ
自分の場合releaseがうまくいかなくって、だいぶハマった。
結論としてはapache logをパースするgemを作ってrubygems.orgに公開してみたと全く同じ状況におちいってしまった。
$ bundle exec rake releaseが終わらねぇ・・
$ cat ~/.gem/credentials
HTTP Basic: Access denied.
となっていた。上記のcurlコマンドが上手く行かなかったらしい。
手動で以下のように設定(APIキーはこのページ:https://rubygems.org/profile/edit)。
~/.gem/credentials
:rubygems_api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
頑張りどころ
####README.md を書こう
書き方など参照
わかりやすい README 駆動開発
エディタもある便利
Linux Mint 18: マークダウンエディター「Ghostwriter」
##参照
RubyGemはめっちゃ簡単に作れる!