- 資料はGitHubからダウンロードできる ychubachi/framework_development
- 随時更新するので watch しておくとよい
- 基本的には資料の通り進めるが, 計画の変更はあり得る
- なし(予定)
- 再利用可能なコンポーネント開発の概念的理解を行う
- 基本技術を押さえて,高度なフレームワークを使いこなせるようになる
- RubyのGemを題材に,実装技術を学ぶ
- Rubyで実際にコーデングを行い,コンポーネントを開発できる
- Git/GitHubを用い,開発の効率の向上・成果物の公開などができる
- Rubyのテスト技術について学ぶ
- RubyGemsに公開する方法
- この授業で取り上げる資料は,開発コミュニティが公開している Webページを中心に解説する
- エンジニアは英語の原典を読めなくてはならないので,英語のページ を見ながら解説する
- GitHubのアカウントを作成しておくこと
- ソースコードを作成する課題は,GitHubにも登録してもらうことがある
- Rubyの開発環境
- enPiTの仮想環境を利用
- 目標
- 「Vagrant」を利用できるようにする
- バージョン
- VirtualBox 4.3.28
- Vagrant 1.7.2
brew cask install virtualbox
brew cask install vagrant
- enPiT用に作成したVagrantのboxファイルを入手して 実行できるようにする
- Vagrantのバージョンは最新版にしておく
- Vagrantのインストール後,次のコマンドでインストール可能
vagrant init ychubachi/enpit
- 仮想環境は簡単に削除できる
- 保存したいファイルは必ずクラウド(GitHub)や,
Host側のファイルシステムに残すこと
- 仮想環境の更新
- ychubachi/enpit は授業期間中でもバージョンアップする可能性がある
- この場合も,Guest 側のファイルは消えるので注意
- ツールのバージョン
- vagrant,VirtualBox を以前にインストールしたことのある場合,
最新のバージョンに更新しておくこと
- 演習用仮想化環境を用意する
- 資料と動画を参照
- VirtualBox と Vagrantをインストールする
- enPiT仮想化環境をインストールする
vagrant init ychubachi/enpit
vagrant up
vagrant ssh
- enPiT 用の Vagarnt の Box 自体を作成するスクリプト等は 次のリポジトリにある
- Chef等をインストールして Box を作成してみよ
- 突っ込み所は多いと思われるので,改善点に気がついたら issue にあげよ
- Pull request も歓迎する
- Rubyには様々なバージョンがある
- 最新の安定版: Ruby 2.2.2
- 1.8.7,1.9.2はサポート終了
- 日々激しくバージョンアップされる
- これら以外にも,Javaや.NET Framework上で動作するものなど多数.
- 開発プロジェクトによって,異なるバージョンのRubyが用いられる
- 複数の開発プロジェクトに参加する開発者が, 毎回手動でバージョンを変更するのは困難であるし, トラブルの原因となる
- バージョンの異なる複数のRubyを管理するツールであり, 主要なエコシステムの一部
- プラグインを追加することで,インストールも自動化できる
- irb = Interactive Ruby
- REPL
- Rubyのコードが実行できる
- 構文や動作の確認に便利
- 起動するには irb
- 終了するには exit (または Ctrl-d)
require 'pp'
# pp ENV
require 'mathn'
# 10/3
- 拡張は初期化される
- 既存のライブラリや別ファイルを読み込む際,
検索の対象となる
PATH
- 一度 require されたファイルは $LOADED_PEATURES に追加される
rbenv
を用いて,異なるバージョンのRubyをインストールする
rbenv
を用い,ruby
のバージョンを切り替える
irb
を用い,ruby
の様々な構文を試しなさい
- 次のような標準ライブラリを使用してみなさい
- yaml
- set
- net/http
- erb
irb
と似たツールにpry
がある- これを使用してみて
irb
との差異を調べなさい
- Rubyには,再利用可能なコンポーネントを 取り扱う仕組みとしてGemがある
- 資料
gem
コマンドは,Rubyでコンポーネントを開発したり, 配布をしたりする等の際に利用するコマンド- 後に解説する
bundler
コマンドの基盤 - 資料
- What is a gem? - RubyGems Guides
- Make your own gem - RubyGems Guides
- Gems with Extensions - RubyGems Guides
- C言語拡張(省略)
- Name your gem - RubyGems Guides
- Publishing your gem - RubyGems Guides
- Security - RubyGems Guides
- セキュリティ(省略)
- Patterns - RubyGems Guides
- 下記のガイドに記されたサンプルを実行し,
gem
コマンドの基本的な使い方を学ぶ - RubyGems Basics - RubyGems Guides
- gemをダウンロードして中身を見てみる
search
,fetch
,unpack
などのコマンドを活用する
- RubyGems.orgにアカウントを作成しなさい
- RubyGems.org | your community gem host
- 「sign up」リンクから作成する
- ガイドの解説に従い,”hola” Gemを作成しなさい
- 演習用Gemの名前の付け方
- hola_(username)
- 括弧内はRubyGemsのユーザ名に置き換えよ
- 開発プロジェクトにおいて利用するGemは異なるばかりではなく, Gemのバージョンについても注意が必要である
- Gemコマンドを直接用いてインストールする方法では, 必要なGemを主導で管理しなくてはならないし, バージョンの異なるGemを用いる場合もある
gem
と違い,bundle
コマンドは標準ではインストールされていない.
gem install bundler
bundle gem my_gem_name
.
├── .git
<snip>
├── .gitignore
├── Gemfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── lib
│ ├── my_gem_name
│ │ └── version.rb
│ └── my_gem_name.rb
└── my_gem_name.gemspec
- gitにindexされているファイルの一覧
- 新しいファイルは,ステージング領域にaddされると表示に加わる
.gitignore
で無視するファイルを設定できる
*.gemspec
のTODOを外す(内容をきちんと書く)rake build
でbuildできる
bundle gem -b
で実行可能なスクリプトの雛形ができる- 実行属性を
chmod a+x
でつける bundle install --binstubs
を実行すると,上書きされるので注意- 手動で他のディレクトリ(
/exe
)に作成するほうが良い
- 手動で他のディレクトリ(
- Gemの依存関係のかき分け
- Gemfile
Gemfile
にgemspec
メソッドがあれば,.gemspec
内のGem依存関係を解決する- *.gemspec
- Gemを利用時に必要なGemを追加
- Bundlerはロードパスを適切に設定
- bundle exec irb
- github-connect.sh
- 注意:画面が乱れたら再ログイン
- 演習用仮想環境には hub コマンドがインストール済み github/hub
- VIMにする方法 git config –global core.editor “vim”
- 簡単な計算を行うコマンドをGemとして作成しなさい.
- 外部のGemを利用する場合は, gemspecファイルに依存関係を記述すること
- 生年月日と今の年月日から年齢を計算する
- 身長と体重を入力して,BMIを出す
- その他,各自で考えよ
- 作成したGemのソースコードをGitHubに公開しなさい
hub create
でGitHubのリポジトリを作成git add
,git commit
でコミットgit push -u origin master
でGitHubに登録
- GitHubのURLをLMSに提出する
- 作成したGemをRubyOrgに登録する
- Gemの名前には,aiitのアカウント名を先頭につけること
- a14???xx_name
- RubyOrgのURL
- jimweirich/rake
- Rake Part 1: Files and Rules | Virtuous Code
- Nilquebe Blog: Rake Part 1: Files and Rules 翻訳
task :hello do
puts 'do task hello!'
end
desc 'say hello'
task :hello do
puts 'do task hello!'
end
rake -T
require "bundler/gem_tasks"
- 実際のタスクは
bundler/gem_tasks
内にある - なお, コードの在処は
gem which bundler
で確認できる
- Minitest
- Rubyに標準のテストツール
- Module: MiniTest (Ruby 2.0.0)
- RSpec
- 広く普及しているテストツール
- 「振る舞い駆動」
- RSpec.info: home
- Cucumber
- Turnip
bundle gem gem_minitest --test=minitest
require "bundler/gem_tasks"
require "rake/testtask"
Rake::TestTask.new(:test) do |t|
t.libs << "test"
end
task :default => :test
test
|-- minitest_helper.rb
`-- test_gem_minitest.rb
minitest_helper.rb
- テストを実行する際に必ず読み込まれる
test_gem_minitest.rb
- テストを書く場所
- Assertionとは?
- テストの演習をするためのGemを作成しなさい
bundle gem minitest_practice --test=minitest
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- メソッド名
odd?
- 内容
- 整数を入力として受け取り,値が奇数ならば真を返す
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- メソッド名
check_number?
- 内容
- 引数が0以外ではじまる4桁の数字であり,なおかつ,値が偶数ならば 真を返す
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- メソッド名
enough_length?
- 内容
- 文字列を受け取り,その長さが3文字以上,8文字以下であれば 真を返す
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- メソッド名
divide
- 内容
- 引数として割る数と割られる数を取り,割り算をした結果を返す. ただし,0で割り算をしたら例外を発生する
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- メソッド名
fizz_buzz
- 内容
- 引数に数値を1つとる.3の倍数の時は”Fizz”を返す. 5の倍数の時は”Buzz”を返す.3と5の公倍数のときは”FizzBuzz”を返す.
- 次の仕様に沿ったテストを作成しなさい
- テストができたら,コードを書きなさい
- 標準出力に「Hello」と表示するプログラムのテストと実装を行いなさい
Guard
とは,ファイルの更新を監視して,更新があれば指定されたタスクを 実行する仕組み- 詳細
- Guardにはプラグイン機能がある
- MiniTest用のプラグイン
- Gemfileに追加し,bundle installが必要
- Guard用の設定を行ったコード
- GitHubと連携し,新たなコミットがGitHubにPushされたら 自動でテスト(など)を行う機能
- CI (continuous integration)
- 継続的統合などと呼ばれる
- https://travis-ci.org/
- サンプルを実行する例
- 設定は
.travis.yml
に書く
- 設定ファイル
.travis.yml
はbundle gem
コマンドを実行した段階で
生成されている
- GitHubのフックを設定する
- GitHubでプロジェクトのリポジトリを開く
- Settings -> Webhooks & Services
- Add Services ボタンから Travis CI を選択
travis
コマンドをインストールtravis enable
コマンドで連携開始
- Guardを利用して,テストを自動化しなさい
- GitHubとTravis CIを連携させ,継続的統合を行いなさい
- Web サイト
- 主な機能
- ソースコード共有(Git)
- Issue
- Pull requests
- Wiki
- コード解析
- Git-flow
- GitHub が登場する以前、 Git-flow が提唱された
- A successful Git branching model » nvie.com
- GitHub flow
- GitHub により、よりシンプルで強力なワークフローが可能に
- GitHub Flow – Scott Chacon
- GitHub Flow (Japanese translation)
- この演習では GitHub flow を学ぶ
- マージのコンフリクト
- GitHub に提出した Pull requests が自動的にマージできないこと
- 基本的な対処法
- コンフリクトは、コードの同じ箇所を複数の人が別々に編集すると発生
- 初心者は、演習の最初の方では「他人と同じファイルを編集しない」こと
にして、操作になれる
- 上達したら積極的にコンフリクトを起こしてみて、その解決方法を学ぶ
- Pull requests でコンフリクトが発生し、自動的にマージできない状態に
なったら、 その PR を送った人がコンフリクトを自分で解消する
- git create コマンドを利用する方法
- GitHub 上で作成する方法
- Web ブラウザで GitHub のURLにアクセス
- ページに表示されている 「SSH clone URL」 を探す
git clone <SSH clone URL>
git checkout -b some_new_feature
git add .
git commit -m '(作業内容)'
git push -u origin some_new_feature
git checkout master
git pull
- 隣同士でペアを組む
- レポジトリを作成する(どちらか一方)
bundle gem
でひな形を作る(初心者は Gem でなくても良い)
- レポジトリの Collaborators に登録する
- レポジトリに対して、次のことを行う
- Pull requests を利用してみる
- Issue を利用してみる
- Wiki を利用してみる
- Pull request & merge の作業を各自5回以上行う
- ディスカッションやコードレビューもやってみる
- Issue を5個以上登録する
- Pull request による Issue の close なども試す
- Wiki でページを作成する
- ページを5つ程度作成して、リンクも貼る
- 以上が終わったペアはグループでの演習に進む
- 講師に申告すること
- ペアを2つ組み合わせて4人グループを作成する
- 課題1が終わったペアから順番にグループ編成
- 作りたい Gem について相談する
- テーマはなんでも良い
- Web API を利用したコマンドラインツールなど
- ある程度の役割分担も決めておく
- テーマはなんでも良い
- レポジトリを作成する(代表者1名)
- Gem を作成する
- 今まで学んだ知識を活用して Gem を開発する
- グルーブメンバー全員である程度のコーディングを行う
- GitHub Flow を実践する
- Travis CI によるテストの自動化
- RubyGems.org へのディプロイ
- その他、GitHub の各種機能の活用
- Travis CIのステータスイメージをREADME.mdに埋め込むことができる
- new_feature ブランチで作業中であり、最新の更新は commit 済
git checkout master # master をチェックアウト
git pull origin master # 手元の master を最新版にする
git checkout new_feature # 作業中のブランチに戻る
git merge master # この後、コンフリクトを修正する
git push origin new_feature # 作業中のブランチを再度、push
- Ruby そのもののバージョン管理
- 言語のインストールも自動化
- 開発で必要なタスクの自動化
Rakefile
に設定を書く
- Rubyのコンポーネント開発
- RubyGemsによる公開
- Gemのダウンロードやロードパスの設定
- Gemを開発するための機能もある
- 単体テストのフレームワーク
- RSpec等他のフレームワークも存在
- テストの自動化
- プラグインにより,他にも多くのタスクが自動化できる
- 様々な開発環境で利用できるCI環境
- GitHubと連携する
- Rubyの場合,Rakeのディフォルトのタスク(
rake test
)が実行される
- GitHub の各種機能
- ペア/グループによる開発演習
- GitHubのURL(RubyGems.orgのURLは不要)
- Gemの演習で作成したリポジトリ
- ペア演習で作成したリポジトリ
- グループ演習で作成したリポジトリ
- レポート
- タイトル「この授業で学んだこと」(800字程度)
- 自己評価
- 5段階評価でいくつくらいか(2以上合格)
- 別途掲示板にて連絡