Skip to content

Latest commit

 

History

History
781 lines (702 loc) · 29.1 KB

framework_development.org

File metadata and controls

781 lines (702 loc) · 29.1 KB

フレームワーク開発特論(2015)

第1章 この授業について

導入

はじめに

自己紹介

資料の入手

授業の計画

スケジュールの調整

  • 基本的には資料の通り進めるが, 計画の変更はあり得る

休講・補講

  • なし(予定)

学習目的・目標

この授業の目的

  • 再利用可能なコンポーネント開発の概念的理解を行う
  • 基本技術を押さえて,高度なフレームワークを使いこなせるようになる
    • RubyのGemを題材に,実装技術を学ぶ

この授業の目標

  • Rubyで実際にコーデングを行い,コンポーネントを開発できる
  • Git/GitHubを用い,開発の効率の向上・成果物の公開などができる
  • Rubyのテスト技術について学ぶ
  • RubyGemsに公開する方法

授業の方法

この授業で用いる資料

  • この授業で取り上げる資料は,開発コミュニティが公開している Webページを中心に解説する
  • エンジニアは英語の原典を読めなくてはならないので,英語のページ を見ながら解説する

Git/GitHubの活用

  • GitHubのアカウントを作成しておくこと
  • ソースコードを作成する課題は,GitHubにも登録してもらうことがある

仮想化環境の準備

  • Rubyの開発環境
    • enPiTの仮想環境を利用
  • 目標
    • 「Vagrant」を利用できるようにする
  • バージョン
    • VirtualBox 4.3.28
    • Vagrant 1.7.2

インストール方法(Windows)

インストール方法(Mac)

Homebrowのインストール

VBとVagrantのインストール

brew cask install virtualbox
brew cask install vagrant

仮想化環境の設定

内容

  • enPiT用に作成したVagrantのboxファイルを入手して 実行できるようにする
  • Vagrantのバージョンは最新版にしておく
  • Vagrantのインストール後,次のコマンドでインストール可能

コマンド

vagrant init ychubachi/enpit

仮想環境利用時の注意事項

  • 仮想環境は簡単に削除できる
    • 保存したいファイルは必ずクラウド(GitHub)や,

Host側のファイルシステムに残すこと

  • 仮想環境の更新
    • ychubachi/enpit は授業期間中でもバージョンアップする可能性がある
    • この場合も,Guest 側のファイルは消えるので注意
  • ツールのバージョン
    • vagrant,VirtualBox を以前にインストールしたことのある場合,

最新のバージョンに更新しておくこと

演習課題

課題1-1

開発環境の構築

  • 演習用仮想化環境を用意する
  • 資料と動画を参照

作業内容

課題1-2

開発環境の構築

  • enPiT仮想化環境をインストールする

コマンド

vagrant init ychubachi/enpit
vagrant up
vagrant ssh

課題1-3(上級者向け)

仮想環境自体の構築

内容のレビュー

  • Chef等をインストールして Box を作成してみよ
  • 突っ込み所は多いと思われるので,改善点に気がついたら issue にあげよ
  • Pull request も歓迎する

第2章 Ruby自体に関すること

Rubyのバージョン指定

Rubyのバージョン

  • Rubyには様々なバージョンがある
    • 最新の安定版: Ruby 2.2.2
    • 1.8.7,1.9.2はサポート終了
  • 日々激しくバージョンアップされる
  • これら以外にも,Javaや.NET Framework上で動作するものなど多数.

開発時の混乱

  • 開発プロジェクトによって,異なるバージョンのRubyが用いられる
  • 複数の開発プロジェクトに参加する開発者が, 毎回手動でバージョンを変更するのは困難であるし, トラブルの原因となる

Rbenvについて

概要

  • バージョンの異なる複数のRubyを管理するツールであり, 主要なエコシステムの一部
  • プラグインを追加することで,インストールも自動化できる

GitHub

RVMとの比較

動的な言語としてのRuby

RubyのREPL

irbとは

  • irb = Interactive Ruby
    • REPL
  • Rubyのコードが実行できる
    • 構文や動作の確認に便利

起動と終了

  • 起動するには irb
  • 終了するには exit (または Ctrl-d)

Rubyは動的な言語

機能の追加の例

require 'pp'
# pp ENV

機能の置換の例

require 'mathn'
# 10/3

再起動すると?

  • 拡張は初期化される

参考文献

ロードパス

$LOAD_PATH

  • 既存のライブラリや別ファイルを読み込む際, 検索の対象となる PATH

$LOADED_FEATURES

  • 一度 require されたファイルは $LOADED_PEATURES に追加される

演習課題

課題2-1 別なRubyバージョンのインストール

  • rbenv を用いて,異なるバージョンのRubyをインストールする

課題2-2 Rubyのバージョンを切り替える

  • rbenv を用い, ruby のバージョンを切り替える

課題2-3 irbを使ってみよう

  • irb を用い, ruby の様々な構文を試しなさい

課題2-4 標準ライブラリ

  • 次のような標準ライブラリを使用してみなさい
    • yaml
    • set
    • net/http
    • erb

課題2-5 (上級) pryについて

  • irb と似たツールに pry がある
  • これを使用してみて irb との差異を調べなさい

第3章 RubyGemsの概要と周辺のツール群

RubyのGemとは

Rubyによるコンポーネント

  • Rubyには,再利用可能なコンポーネントを 取り扱う仕組みとしてGemがある
  • 資料

基本的なコマンド

  • gem コマンドは,Rubyでコンポーネントを開発したり, 配布をしたりする等の際に利用するコマンド
  • 後に解説する bundler コマンドの基盤
  • 資料

RubyGemsの解説(1)

Ruby Gemsのガイド

RubyGemsの解説(2)

Ruby Gemsのガイド

補足

MiniTest

演習課題

課題3-1

課題3-2

  • gemをダウンロードして中身を見てみる
  • search, fetch, unpack などのコマンドを活用する

課題3-3 RubyGems.orgにアカウントを作成

課題3-4 ガイドを参考にGemを作る

  • ガイドの解説に従い,”hola” Gemを作成しなさい
  • 演習用Gemの名前の付け方
    • hola_(username)
    • 括弧内はRubyGemsのユーザ名に置き換えよ

第4章 プロジェクトで利用するGemの管理

プロジェクトとGem

プロジェクトごとに異なるGemの集合

  • 開発プロジェクトにおいて利用するGemは異なるばかりではなく, Gemのバージョンについても注意が必要である
  • Gemコマンドを直接用いてインストールする方法では, 必要なGemを主導で管理しなくてはならないし, バージョンの異なるGemを用いる場合もある

BundlerでGemを利用する

Bundlerについて

ドキュメントの解説

bundleコマンドのインストール

bundleコマンド

  • gem と違い, bundle コマンドは標準ではインストールされていない.

Gemによるインストール方法

gem install bundler

BundlerによるGemの作成

ひな形の自動生成

ひな形の自動生成

コマンド

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 ls-files について

  • gitにindexされているファイルの一覧
  • 新しいファイルは,ステージング領域にaddされると表示に加わる
  • .gitignore で無視するファイルを設定できる

雛形のbuild

  • *.gemspec のTODOを外す(内容をきちんと書く)
  • rake build でbuildできる

executable の作成と注意

  • bundle gem -b で実行可能なスクリプトの雛形ができる
  • 実行属性を chmod a+x でつける
  • bundle install --binstubs を実行すると,上書きされるので注意
    • 手動で他のディレクトリ( /exe )に作成するほうが良い

Gemfileとgemspecの関係

  • Gemの依存関係のかき分け
    • Gemfile
  • Gemfilegemspec メソッドがあれば, .gemspec 内のGem依存関係を解決する
    • *.gemspec
  • Gemを利用時に必要なGemを追加

Bundlerと$LOAD_PATH

Bundlerと$LOAD_PATH

  • Bundlerはロードパスを適切に設定

ロードパスの設定の確認

  • bundle exec irb

補足資料

補足資料

GitHub への公開鍵登録など

  • github-connect.sh
  • 注意:画面が乱れたら再ログイン

GitHub用CLI

  • 演習用仮想環境には hub コマンドがインストール済み github/hub

Editor

  • VIMにする方法 git config –global core.editor “vim”

演習課題

4-1 Bundlerで簡単なGemを作ってみる

課題

  • 簡単な計算を行うコマンドをGemとして作成しなさい.
  • 外部のGemを利用する場合は, gemspecファイルに依存関係を記述すること

  • 生年月日と今の年月日から年齢を計算する
  • 身長と体重を入力して,BMIを出す
  • その他,各自で考えよ

4-2 作成したGemをGitHubで公開する

課題

  • 作成したGemのソースコードをGitHubに公開しなさい
    • hub create でGitHubのリポジトリを作成
    • git addgit commit でコミット
    • git push -u origin master でGitHubに登録

提出

  • GitHubのURLをLMSに提出する

4-3 GemをRubyOrgに登録する

課題

  • 作成したGemをRubyOrgに登録する
  • Gemの名前には,aiitのアカウント名を先頭につけること
    • a14???xx_name

提出

  • RubyOrgのURL

第5章 Rakeによるタスクの実行

Rakeの文書

ドキュメント

簡単なRakefileの例

タスクの定義

Rakefile

task :hello do
  puts 'do task hello!'
end

説明を追加した例

Rakefile

desc 'say hello'
task :hello do
  puts 'do task hello!'
end

タスクの一覧

コマンド

rake -T

Bundlerが自動生成するgem

Rakefile

require "bundler/gem_tasks"

タスクの定義

  • 実際のタスクは bundler/gem_tasks 内にある
  • なお, コードの在処は gem which bundler で確認できる

第6章 Rubyによる単体テスト

Rubyによるテスト技法

各種のテスト技法(1)

各種のテスト技法(2)

テストを含むGemの生成

bundle gemのオプション

minitestを使う場合

bundle gem gem_minitest --test=minitest

minitest用のRakefile

Rakefile

require "bundler/gem_tasks"
require "rake/testtask"

Rake::TestTask.new(:test) do |t|
  t.libs << "test"
end

task :default => :test

test/の中身

ファイル

test
|-- minitest_helper.rb
`-- test_gem_minitest.rb

内容

minitest_helper.rb
テストを実行する際に必ず読み込まれる
test_gem_minitest.rb
テストを書く場所

minitestの書き方

minitestのドキュメント

ドキュメント

Assertion

演習課題

6-1 Gemの作成

課題

  • テストの演習をするためのGemを作成しなさい

コマンド

bundle gem minitest_practice --test=minitest

サンプルコード

6-2 メソッドの作成(1)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

メソッド名
odd?
内容
整数を入力として受け取り,値が奇数ならば真を返す

6-3 メソッドの作成(2)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

メソッド名
check_number?
内容
引数が0以外ではじまる4桁の数字であり,なおかつ,値が偶数ならば 真を返す

6-4 メソッドの作成(3)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

メソッド名
enough_length?
内容
文字列を受け取り,その長さが3文字以上,8文字以下であれば 真を返す

6-5 メソッドの作成(4)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

メソッド名
divide
内容
引数として割る数と割られる数を取り,割り算をした結果を返す. ただし,0で割り算をしたら例外を発生する

6-6 メソッドの作成(5)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

メソッド名
fizz_buzz
内容
引数に数値を1つとる.3の倍数の時は”Fizz”を返す. 5の倍数の時は”Buzz”を返す.3と5の公倍数のときは”FizzBuzz”を返す.

6-7 メソッドの作成(6)

課題

  • 次の仕様に沿ったテストを作成しなさい
  • テストができたら,コードを書きなさい

仕様

  • 標準出力に「Hello」と表示するプログラムのテストと実装を行いなさい

参考

サンプル

第7章 テスト自動化と統合テスト

Guardによる方法

Guardとは?

  • Guard とは,ファイルの更新を監視して,更新があれば指定されたタスクを 実行する仕組み
  • 詳細

MiniTestの自動化

  • Guardにはプラグイン機能がある
  • MiniTest用のプラグイン
  • Gemfileに追加し,bundle installが必要

サンプル

Travis CIによる方法

Travis CIとは?

  • GitHubと連携し,新たなコミットがGitHubにPushされたら 自動でテスト(など)を行う機能
  • CI (continuous integration)
    • 継続的統合などと呼ばれる

Travis CIについて

GitHubと連携する方法

  • 設定ファイル
    • .travis.ymlbundle gem コマンドを実行した段階で

生成されている

  • GitHubのフックを設定する
    1. GitHubでプロジェクトのリポジトリを開く
    2. Settings -> Webhooks & Services
    3. Add Services ボタンから Travis CI を選択

コマンドで行う場合

  • travis コマンドをインストール
  • travis enable コマンドで連携開始

演習課題

7-1 Guard

課題

  • Guardを利用して,テストを自動化しなさい

7-2 Travis CI

課題

  • GitHubとTravis CIを連携させ,継続的統合を行いなさい

第8章 GitHubを用いた開発演習

GitHubとは

GitHubについて

  • Web サイト
  • 主な機能
    • ソースコード共有(Git)
    • Issue
    • Pull requests
    • Wiki
    • コード解析

GitHub Flow

GitHub flow におけるコンフリクトについて

  • マージのコンフリクト
    • GitHub に提出した Pull requests が自動的にマージできないこと
  • 基本的な対処法
    • コンフリクトは、コードの同じ箇所を複数の人が別々に編集すると発生
    • 初心者は、演習の最初の方では「他人と同じファイルを編集しない」こと

にして、操作になれる

  • 上達したら積極的にコンフリクトを起こしてみて、その解決方法を学ぶ
  • Pull requests でコンフリクトが発生し、自動的にマージできない状態に

なったら、 その PR を送った人がコンフリクトを自分で解消する

リポジトリの作成とclone

リポジトリの作成方法

  • git create コマンドを利用する方法
  • GitHub 上で作成する方法

リポジトリのclone

  • Web ブラウザで GitHub のURLにアクセス
  • ページに表示されている 「SSH clone URL」 を探す

端末上でgit clone コマンドを実行する

git clone <SSH clone URL>

基本的な git コマンド

新しくブランチを作成してチェックアウトする

git checkout -b some_new_feature

ブランチをGitHubにpushする

git add .
git commit -m '(作業内容)'
git push -u origin some_new_feature

master を最新版にする

git checkout master
git pull

ペアで行う GitHub

ペアで GitHub を使ってみよう

  1. 隣同士でペアを組む
  2. レポジトリを作成する(どちらか一方)
    • bundle gem でひな形を作る(初心者は Gem でなくても良い)
  3. レポジトリの Collaborators に登録する
  4. レポジトリに対して、次のことを行う
    • Pull requests を利用してみる
    • Issue を利用してみる
    • Wiki を利用してみる

課題1

  1. Pull request & merge の作業を各自5回以上行う
    • ディスカッションやコードレビューもやってみる
  2. Issue を5個以上登録する
    • Pull request による Issue の close なども試す
  3. Wiki でページを作成する
    • ページを5つ程度作成して、リンクも貼る
  4. 以上が終わったペアはグループでの演習に進む
    • 講師に申告すること

グループで行う GitHub

グループで GitHub

  1. ペアを2つ組み合わせて4人グループを作成する
    • 課題1が終わったペアから順番にグループ編成
  2. 作りたい Gem について相談する
    • テーマはなんでも良い
      • Web API を利用したコマンドラインツールなど
    • ある程度の役割分担も決めておく
  3. レポジトリを作成する(代表者1名)
    • Gem を作成する
  4. 今まで学んだ知識を活用して Gem を開発する

課題(2)

  1. グルーブメンバー全員である程度のコーディングを行う
  2. GitHub Flow を実践する
  3. Travis CI によるテストの自動化
  4. RubyGems.org へのディプロイ
  5. その他、GitHub の各種機能の活用

補足資料

Travis CI ステータスイメージ

Travis CIのテスト結果を分かりやすく共有したい

GitHubでのコンフリクトの解消方法

前提

  • 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

第9章 まとめ

この授業で取り上げたこと

Rubyのエコシステム(1)

rbenv

  • Ruby そのもののバージョン管理
  • 言語のインストールも自動化

rake

  • 開発で必要なタスクの自動化
  • Rakefile に設定を書く

Rubyのエコシステム(2)

Gem

  • Rubyのコンポーネント開発
  • RubyGemsによる公開

bundler

  • Gemのダウンロードやロードパスの設定
  • Gemを開発するための機能もある

Rubyのエコシステム(3)

MiniTest

  • 単体テストのフレームワーク
  • RSpec等他のフレームワークも存在

Guard

  • テストの自動化
  • プラグインにより,他にも多くのタスクが自動化できる

継続的統合

Travis CI

  • 様々な開発環境で利用できるCI環境
  • GitHubと連携する
  • Rubyの場合,Rakeのディフォルトのタスク( rake test )が実行される

GitHub

GitHub

  • GitHub の各種機能
  • ペア/グループによる開発演習

課題の提出方法

課題提出について

提出内容

  1. GitHubのURL(RubyGems.orgのURLは不要)
    • Gemの演習で作成したリポジトリ
    • ペア演習で作成したリポジトリ
    • グループ演習で作成したリポジトリ
  2. レポート
    • タイトル「この授業で学んだこと」(800字程度)
  3. 自己評価
    • 5段階評価でいくつくらいか(2以上合格)

提出先と期限

  • 別途掲示板にて連絡