Giter VIP home page Giter VIP logo

rubytraining's Introduction

RubyTrainig

Document Index

スライド資料 Index

内容 ページ markdown
トップページ slides/# introduction.md
この研修の目標 slides/#1 -
研修でやること slides/#2 -
開発環境の確認 slides/#4 preparation.md
Rubyの基礎 slides/#5 lets-ruby.md
gem/bundler slides/#6 about-gem-and-bundler.md
RspecとTDD slides/#7 testing-with-rspec.md
Rackの基礎 slides/#9 about-rack.md
ActiveRecordの基礎 slides/#10 about-activerecord.md

※ markdown ドキュメントは reveal.js で表示するためのものなので、可読性はあまり良くありません。

Badges

Build Status Code Climate

※ これらのサービスを利用したい場合は、fork 後に各サービスでリポジトリを sync/add して badge を更新してください。

rubytraining's People

Contributors

deeeki avatar junsumida avatar luckypool avatar rnakano avatar yuki-takeichi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rubytraining's Issues

NameError: uninitialized constant ActiveRecord::Tasks::DatabaseTasks::Rails

NameError: uninitialized constant ActiveRecord::Tasks::DatabaseTasks::Rails
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.1.0/lib/active_record/tasks/database_tasks.rb:54:in `db_dir'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-activerecord-1.7.0/lib/sinatra/activerecord/rake.rb:112:in `db_dir'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-activerecord-1.7.0/lib/sinatra/activerecord/rake.rb:67:in `dump_schema'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-activerecord-1.7.0/lib/sinatra/activerecord/tasks.rake:58:in `block (3 levels) in <top (required)>'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-activerecord-1.7.0/lib/sinatra/activerecord/tasks.rake:34:in `block (2 levels) in <top (required)>'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `eval'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => db:schema:dump
(See full trace by running task with --trace)
rake aborted!
Command failed with status (1): [rake db:migrate...]
/Users/jun.sumida/github/mosscow/Rakefile:13:in `block in <top (required)>'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `eval'
/Users/jun.sumida/.rvm/gems/ruby-2.1.0/bin/ruby_executable_hooks:15:in `<main>'

sinatra-activerecordのバグっぽい。

NOTEだよ

やること

  • サーバーサイドはAPIのみ
  • DRYじゃないコピペコードをコントローラーに
  • CRUD ほしい
  • クライアントサイドもつくる、というか用意しておく。(TODOアプリ的な) backbone.js
  • gem にするのは rack ミドルウェア
    • 4xx/5xx のエラーハンドラー的なもの
    • JSONの snake_case / camelCase の変換
  • DBは sqlite でOKかな

コミュニケーション手段を決める

gitter が良さそう

他の研修でも使うなら、プロジェクトネームみたいな名前のOrganizationを作って、
そのチャンネルにみんなjoinしてもらうのが良さそう

  • ↑を他の講師の人に聞いて問題ないか確認する
  • 問題あればPlan B(ChatWork)でやる

mark all as complete時のバグ

5個程度以上のtodoに対して、mark all as completeをやるとsqliteにロックがかかって、500になります。

D, [2014-04-10T11:39:27.145103 #69308] DEBUG -- :    (0.0ms)  begin transaction
E, [2014-04-10T11:39:27.145163 #69308] ERROR -- : ArgumentError: prepare called on a closed database: rollback transaction
ActiveRecord::StatementInvalid - ArgumentError: prepare called on a closed database: rollback transaction:
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `initialize'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `new'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:91:in `prepare'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:134:in `execute'
    /Users/jD, [2014-04-10T11:39:27.150677 #69308] DEBUG -- :    (5.4ms)  commit transaction
127.0.0.1 - - [10/Apr/2014 11:39:27] "PUT /api/todos/55 HTTP/1.1" 200 55 0.0480
D, [2014-04-10T11:39:27.151999 #69308] DEBUG -- :    (0.1ms)  commit transaction
127.0.0.1 - - [10/Apr/2014 11:39:27] "PUT /api/todos/54 HTTP/1.1" 200 51 0.0262
un.sumida/.rvm/gems/ruby-2.1.0/gems/sqlite3-1.3.9/lib/sqlite3/database.rb:526:in `rollback'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/sqlite3_adapter.rb:375:in `block in rollback_db_transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract_adapter.rb:442:in `block in log'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activesupport-4.0.4/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract_adapter.rb:437:in `log'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/sqlite3_adapter.rb:375:in `rollback_db_transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/transaction.rb:175:in `perform_rollback'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/transaction.rb:114:in `rollback'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:251:in `rollback_transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:229:in `rescue in within_new_transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:226:in `within_new_transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/connection_adapters/abstract/database_statements.rb:213:in `transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/transactions.rb:209:in `transaction'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/transactions.rb:327:in `with_transaction_returning_status'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.4/lib/active_record/transactions.rb:275:in `save!'
    /Users/jun.sumida/github/mosscow/app/app.rb:83:in `block in <class:Mosscow>'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1593:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1593:in `block in compile!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:957:in `[]'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:957:in `block (3 levels) in route!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:976:in `route_eval'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:957:in `block (2 levels) in route!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:997:in `block in process_route'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:995:in `catch'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:995:in `process_route'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:955:in `block in route!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:954:in `each'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:954:in `route!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1067:in `block in dispatch!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `block in invoke'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `catch'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `invoke'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1064:in `dispatch!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:889:in `block in call!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `block in invoke'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `catch'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1049:in `invoke'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:889:in `call!'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:877:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/xss_header.rb:18:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/path_traversal.rb:16:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/json_csrf.rb:18:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/base.rb:50:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/base.rb:50:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-protection-1.5.2/lib/rack/protection/frame_options.rb:31:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/nulllogger.rb:9:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/head.rb:11:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/show_exceptions.rb:21:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:180:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:2004:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1469:in `block in call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1778:in `synchronize'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1469:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/bundler/gems/rack-camel_snake-e43ca4bb6d2d/lib/rack/camel_snake.rb:12:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/bundler/gems/rack-server_errors-04e677890e3f/lib/rack/server_errors.rb:8:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/lint.rb:49:in `_call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/lint.rb:37:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/showexceptions.rb:24:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/commonlogger.rb:33:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:217:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/chunked.rb:43:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/content_length.rb:14:in `call'
    /Users/jun.sumida/.rvm/gems/ruby-2.1.0/gems/rack-1.5.2/lib/rack/handler/webrick.rb:60:in `service'
    /Users/jun.sumida/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/webrick/httpserver.rb:138:in `service'
    /Users/jun.sumida/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/webrick/httpserver.rb:94:in `run'
    /Users/jun.sumida/.rvm/rubies/ruby-2.1.0/lib/ruby/2.1.0/webrick/server.rb:295:in `block in start_thread'
127.0.0.1 - - [10/Apr/2014 11:39:27] "PUT /api/todos/56 HTTP/1.1" 500 200506 0.1000

snake_case, CamelCaseに関して

ToDoリストのModelがうまい具合に短いプロパティ名で来てるので、なんとかして、CamelCase, SnakeCaseに変更/を追加したいです。

      return {
        title: "empty todo...",
        order: Todos.nextOrder(),
        done: false
      };

実習前の基礎的な講義資料

  • 開発環境の確認とか
  • Ruby
    • 2 系になった時の仕様とか?
  • Rack
    • Sinatra
  • ActiveRecord
  • RSpec
    • 3系のbeta との違いについて

  • 開発環境の確認
  • Rubyの復習(チュートリアルやったりしてたら分かるよね?的な)
  • TDDとRSpecの話( describe / it / expectation / matchers )+ ( pending / xit )
  • Rackの話 (概要 / 最小の app → 超絶シンプル middleware )
  • gem / bundler
  • ActiveRecord(概要)

問題文の修正

ヒントを見ないと、問題の意図がわからないところがあるので、それが無いようにする。

実習内容と提出内容、追加課題を説明する資料

  • 実習内容と提出内容
    • これはコードを実際につくってみてだんだん決めてく
    • 指定の結合テストをパスするアプリを作ればOK?
    • コード内容はなんとなく見るくらい?
    • 早く終る人は機能追加してもらう(ユーザー認証など)やり方は自由。
  • gem化の手ほどき
    • rackのミドルウェアを作ってgemにしてもらう際、基本的なhow toはテキスト(.md)にまとめてておき、参照してもらう
  • 追加課題
    もう既にヤバイ怖い人でもご満足頂ける課題をなんか用意する

Rack::CamelSnakeを作ってもらう問題

全部のフローをやってもらうと量的にかなり重いと思うので、一旦可能性のあるものを全て問題出して、後から考えます。

  • to_camel, to_snake, formatterをメソッドとして作って、テストを書いてもらう
    • この辺のメソッドは最初から入れておこうかと思ってます。
    • #71 ではとりあえず汚く入れておきました。
    • to_camel, to_snakeだけ残して、formatterは外しました。
  • jsonで返す出力を全て、application/jsonかつキャメルケースで返すようにする
  • http requestのbodyのキーをスネークケースに変換する。
  • middlewareとして、上の処理を全て切り出す
  • 切り出したmiddlewareをgem化し、自分のリポジトリに上げてもらう。

研修の日までに終わらせる事務仕事

リストアップしてみる

  • #7 で残りの資料をやっつける(あとちょっと)
  • gh-pages ブランチのスライドを master にもmergeする
    • しなくてもいいけど、なんか master とかけ離れてるのアレなので
    • squash とかでまとめてmergeしちゃうのが良いかな
  • README.md を 概要と目次っぽくする
    • 研修のスライドへのリンク
    • プロジェクト自体のドキュメントへのリンク
  • RubyTraining という名前で mixi-inc に transfer する
  • スライド内容の微修正
    • ex.) ActiveRecordの解説がチュートリアルじゃないので、「コードで解説」的なニュアンスにする

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.