ruby on rails 4.0.0で動かす

今日の目標はCRUDできるとこまで。

ついPerlで書いてましたが、毎回フレームワークに悩むので
いっそのことRuby(on Rails)やってみます。
ちなみにRubyはいっさい知りません。

WEB+DB PRESS vol.73 2013 を参考にやっちゃいます。

# gem install rails --version 4.0.0.beta1 --no-ri --no-rdoc

※さきにrdocしないと”file ‘lib’ not found”って怒られました。
※なんか画像をテキストに変換しようとしてエラーがいっぱいでました。
※–no-ri –no-rdocつけたらさくっと入りました。

$ git clone git://github.com/rails/rails.git
Cloning into 'rails'...
remote: Counting objects: 353918, done.
remote: Compressing objects: 100% (88818/88818), done.
remote: Total 353918 (delta 274741), reused 339425 (delta 261890)
Receiving objects: 100% (353918/353918), 53.71 MiB | 3.71 MiB/s, done.
Resolving deltas: 100% (274741/274741), done.
$ ./rails/railties/bin/rails new bookmanager --dev

ドバーっとひな形ができました。

$ cd bookmanager
$ ls
Gemfile Gemfile.lock README.rdoc Rakefile app bin config config.ru db lib log public test tmp vendor
$ cd bin
$ls
bundle rails rake

さっそく作ってみます。

springのほうがrailsコマンドよりはやいそうなので、springでやっていきます。

# gem install spring
$ which spring
/usr/local/bin/spring

あります。
generateしてみます。

$ spring generate scaffold book title price:integer isbn:string ins_time:datetime
      invoke  active_record
      create    db/migrate/20130303074048_create_books.rb
      create    app/models/book.rb
      invoke    test_unit
      create      test/models/book_test.rb
      create      test/fixtures/books.yml
      invoke  resource_route
       route    resources :books
      invoke  jbuilder_scaffold_controller
      create    app/controllers/books_controller.rb
      invoke    erb
      create      app/views/books
      create      app/views/books/index.html.erb
      create      app/views/books/edit.html.erb
      create      app/views/books/show.html.erb
      create      app/views/books/new.html.erb
      create      app/views/books/_form.html.erb
      invoke    test_unit
      create      test/controllers/books_controller_test.rb
      invoke    helper
      create      app/helpers/books_helper.rb
      invoke      test_unit
      create        test/helpers/books_helper_test.rb
      invoke    jbuilder
       exist      app/views/books
      create      app/views/books/index.json.jbuilder
      create      app/views/books/show.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/books.js.coffee
      invoke    scss
      create      app/assets/stylesheets/books.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

これでアプリのひな形ができました。
※ちなみにひな形を消す場合はdestroyというコマンドがあります。便利です。

$ rails destroy scaffold book

続いて開発用データベース作ってみます。

$ spring rake db:migrate
==  CreateBooks: migrating ====================================================
-- create_table(:books)
   -> 0.0024s
==  CreateBooks: migrated (0.0028s) ===========================================

できたのか?

sqlite> .databases
seq  name             file                                                      
---  ---------------  ----------------------------------------------------------
0    main             /home/apache/bookmanager/book

できてました。

$ spring rake

したらERROR出た。とりあえず放置。

$ rails s
=> Booting WEBrick
=> Rails 4.0.0.beta1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-03-03 16:54:24] INFO  WEBrick 1.3.1
[2013-03-03 16:54:24] INFO  ruby 1.9.3 (2012-04-20) [x86_64-linux]
[2013-03-03 16:54:24] INFO  WEBrick::HTTPServer#start: pid=23633 port=3000

http://fukumura.org:3000/books

にアクセスしたら画面でました。

次に検索機能の実装をします。

まずはformをつくります。
ActiveModel::Modelモジュールをincludeするだけでそれっぽいclassが作れるとのこと。
app/models/search_form.rb

  1 class SearchForm                                                                                                              
  2   include ActiveModel::Model
  3
  4   attr_accessor :q
  5 end

続いてview(books/index.html.erb)にフォーム追加します。

     <%= form_for @search_form, url: books_path,
      html: {method: :get} do |f| %>
      <%= f.search_field :q  %>  
      <%= f.submit '検索' %>                                                                                                      
    <% end %>

次に、controller側(app/controllers/books_controller.rb)を改修します。

  6   def index                                                                                                                    
  7     @search_form = SearchForm.new params[:search_form]
  8     @books = Book.all
  9     if @search_form.q.present?
 10       @books = @books.title @search_form.q
 11     end
 12   end

あと、検索処理も処理を追加します。

  1 class Book < ActiveRecord::Base
  2   scope :title, ->(q) {where 'title like ?', "%#{q}%" }                                                                        
  3 end

できました。

次は、検索処理をAjax化してみます。
下記を追加。(content_tag_for便利ですね。PerlとかPHPで出会ったことない気がするけど Text::Xslateだったらありそう。)

    <%= content_tag_for :tr, @books do |book|  %>

続いて、view(app/views/books/index.html.erb)の修正。

     <%= form_for @search_form, url: books_path(format: :json),
      remote: true, html: {method: :get} do |f| %>
      <%= f.search_field :q  %>  
      <%= f.submit '検索' %>
    <% end %>

最後にcofeescriptの修正。

  4 $ ->
  5   $('#new_search_form').on 'ajax:success', (e, books) ->
  6     $('tr.book').hide()                                                                                                        
  7     ids = (books.map (b) -> "#book_#{b.id}").join(',')
  8     $(ids).show()

book.jsとして展開されるんですね。coffeescript知らなすぎでした。

ここまででいったん終了。

お疲れさまでした。

Balloons.IOを動かしてみた

Balloons.IOというリアルタイムチャットのコードがgithubに落ちてたので動かしてみようとおもいます。
まずはBalloons.IOはnode.jsとredisが必要なのでそのセットアップをします。

■node.js
node.jsのインストール方法

■redis
redisはセットアップしたことないのでやってみます。

KVSです。すべてのデータをメモリに載せるので爆速が期待できるKVSとのこと。
サイバーエージェントの技術ブログでもパフォーマンスのエントリーありました。

Redis is an open source, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.

日本語でまとまってるページがありましたのでそこを参考にして進めてみます。

http://redis.shibu.jp/quickstart.html#quick-start

■安定板はtar.gz

$ wget http://redis.googlecode.com/files/redis-2.0.4.tar.gz
$ tar xvf redis-2.0.4.tar.gz
$ cd redis-2.0.4
$ make && make install

■redis起動(とりあえずdefaultで起動)

$ ./redis-server ./redis.conf
[13040] 08 Sep 18:18:50 # Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'
[13040] 08 Sep 18:18:50 * Server started, Redis version 2.0.4
[13040] 08 Sep 18:18:50 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[13040] 08 Sep 18:18:50 * The server is now ready to accept connections on port 6379

confのpath指定しないとwarningでますね。あと、/etc/sysctl.confの変数もメモリにのせるので変えないとだめっぽいです。とりあえず動かしてみたいだけなので無視。
vm.over_commit_memory=2にすると
実メモリ以上の容量確保とかできるようになるので注意が必要です。

# /etc/sysctl.conf
vm.overcommit_memory=1

■Balloons.IO設定

$ git clone https://github.com/gravityonmars/Balloons.IO.git
$ cd Balloons.IO
$ npm install

PassportJS使って認証処理をよろしくやってくれるっぽい。

・config.jsonを設定

$ cat config.json
{
  "auth": {
    "twitter": {
      "consumerkey" : "yourConsumerKey",
      "consumersecret" : "yourSecretKey",
      "callback" : "http://fukumura.org:6789/auth/twitter/callback"
    },
    "facebook": {
      "clientid" : "yourClientId"",
      "clientsecret" : "yourClientSecret",
      "callback" : "http://fukumura.org:6789/auth/facebook/callback"
    }
  },
  "theme": {
    "name" : "default"
  },
  "session" : {
    "secret" : "fE3wairSARewajiwofS213"
  },
  "app": {
    "port": 6789
  }
}

■Balloons起動

$ node balloons
   info  - socket.io started
Balloons.io started on port 6789
Deletion of sockets reference for each user >>  Done!
Deletion of online users from rooms >>  Done!
Deletion of socket.io stored sockets data >>  Done!

http://fukumura.org:6789

とかで動くようになったけど例のごとく6789は落としました。

こんな感じです。

お疲れさまでした。

mysql5.5でutf8使うときの注意

まぁ既知ですけど

default-character-set=utf8

ではなくて

character-set-server=utf8

を使わないと起動に失敗します。というお話。

sakuraVPS2.0Gを契約

sakuraVPSは東日本大震災の計画停電がきっかけでお世話になっていますが
最近価格が改訂されたので
sakuraVPSメモリ1.5Gコース1980円
sakuraVPSメモリ512kコース980円
を解約して
sakuraVPS2.0Gを契約しますた。
sakuraVPS2.0Gで1480円
一応CloudCore2.0Gも契約してるのでとりあえず余裕すぎるでしょう。