이젠 담배와 작별을 고하세요. Smoke Free Project


아일랜드에서 지내는 동안, 친구를 도와 금연 서비스를 만들었습니다.

금연을 시작하기 전부터 준비사항을 알려주고,

담배를 끊고 하루하루가 지날 때마다 어려움을 어떻게 극복하면 좋은지 안내가 잘 되어있습니다.

같이 금연을 하는 사람들과 정보를 나누기도 좋지요.

아직 한국어 버젼은 없지만,

다국어 서비스를 생각하고 만들었기에, 번역만 되면 언제든지 한국어로도 서비스가 가능합니다.

혹시 금연에도 관심이 있다면 한 번 들러보시고,

한국어로 번역하고 싶은 마음이 드시면, 서비스를 꾸려가는 세바스찬에게 이메일을 보내세요.:D

Smoke Free Project(SmokeFreeProject.org)




by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

Ruby Gems Cheat Sheet


GEM 설정

gem environment
set GEM_PATH = D:\dev\ruby192\lib\ruby\gems\1.9.1\gems
gem update --system
gem uninstall gemname
bundle update
(vendor 폴더에 bundle 설치하기)
bundle install --path vendor/bundle


devise

Controller filters and helpers

Devise will create some helpers to use inside your controllers and views. To set up a controller with user authentication, just add this before_filter:
before_filter :authenticate_user!
To verify if a user is signed in, use the following helper:
user_signed_in?
For the current signed-in user, this helper is available:
current_user
You can access the session for this scope:
user_session
Callbacks
    after_set_user
    after_authentication
    before_failure
    before_logout
    Warden::Manager.after_authentication do |user,auth,opts|
        user.last_login = Time.now
    end
   

generator

devise g view with haml
rails g devise_views -t=haml

OmniAuth

Add :password => Devise.friendly_token[0,20] when creating a new user from facebook omniauth.

Passwords Encrypt manually


Assuming you have a mysql database with a "users" table and a "password" column And an ActiveRecord model class called "user" that is hooked up to devise
Create an ActiveRecord model class in your app app/models/old_user.rb
OldUser < ActiveRecord::Base
  set_table :users
  establish_connection :database => "old_database", :user => "old user", :adapter => "mysql"
end
then create a rake task: app/lib/tasks/migrate_users.rake
task :migrate_users => :environment do
  OldUser.find_each do |old_user|
    u = User.new(:email => old_user.email, :password => old_user.password, :password_confirmation => old_user.password);
    #if your using confirmation
    u.skip_confirmation!
    u.save!
  end
end
Modify as necessary (make sure you're saving any app-specific user attributes)
Then$ rake migrate_users
   
Good news and bad news.
Good news:
The following works to create your user's password manually.
 pepper = nil
 cost = 10
 encrypted_password = ::BCrypt::Password.create("#{password}#{pepper}", :cost => cost).to_s
You can find your pepper and cost in your devise initializer. This method was confirmed using Devise's "valid_password?" method.
Bad news:
The entire reason I was trying to avoid "User.new(password: password).encrypted_password" was because of speed. It's terribly slow. With all my other pieces of my import task, I've intentionally avoided this.
But as it turns out, the major cost here is not instantiating a User object -- but BCrypt itself. There is very little noticeable speed boost when using BCrypt directly because it's intentionally designed to be slow.
My final answer: suck it up, run the rake script, go find a beverage.

mailer locale configuration

-ActionMailer::Base.default_url_options[:locale] = I18n.locale


Simple_form

<%= simple_form_for(@user, :builder => CustomBuilder) do |f| %>
  <%= f.input :name %>
<% end %>


Client side validations

Client side validations Registering own form builder
https://github.com/bcardarella/client_side_validations/wiki/Registering-your-own-custom-form-builder


Client MVC

Spine

Important is only that the public directory of the application is specified
as domainroot in Confixx. If the domain is called Passenger will start automatically.."
rails g spine:model Card text is_private order user_id card_type
rails g spine:controller Cards
rails g spine:scaffold card text is_private order user_id card_type
rails g spine:model Organization title description url image admins members followers
rails g spine:controller Organizations
rails g spine:scaffold organization title description url image admins members followers
var card = App.Card.create({ 
  is_private: true,
  order: 0,
  card_type: 'Reason',
  text: 'Spine & Rails, sitting in a tree!'
});
straightforward way to do that without extending Spine Model's
to allow for instances to be added in memory without syncing
Ajax.disable -> saveStuff()
Model.refresh()
extends
Contact.extend(Spine.Model.Ajax);
Contact.extend({
url: '/users/'
});
'/': ->
    if AuthenticatedUser
         @controller = new OtherController
         @replace @controller.render()
    else
         @controller = new LoginController
         @replace @controller.render()
http://spinejs.com/docs/controller_patterns         
         


Compass

compass init rails D:/dev/workspace/baksisi
compass init rails -r html5-boilerplate -u html5-boilerplate --syntax sass --force
css와 javascript를 asset 폴더로 옮겨준다. rails.js는 제외 (jquery_ujs와 동일하다)


Geo_location

https://github.com/chrisyour/geo_location
http://www.maxmind.com/app/geolitecountry


Mongoid id 변경하기

http://blog.joshdzielak.com/blog/2011/12/24/tame-the-mongoid-id-field-in-your-rails-and-backbone-js-app/
http://lostechies.com/derickbailey/2011/06/17/making-mongoid-play-nice-with-backbone-js/


Mongoid Follow unfollow

class User
  include Mongoid::Document
  field :name, type: String
  has_and_belongs_to_many :following, class_name: 'User', inverse_of: :followers, autosave: true
  has_and_belongs_to_many :followers, class_name: 'User', inverse_of: :following
  def follow!(user)
    if self.id != user.id && !self.following.include?(user)
      self.following << user
    end
  end
  def unfollow!(user)
    !self.following.include?(user)
    self.following.delete(user)
  end    
end
relation_ids instead? that is self.member_count = self.member_ids.size
self.challenged.where(_id: event.id).destroy_all
def unchallenge!(announce)
  self.announcements.destroy_all( conditions: { _id: announce.id })
  self.save!
end
Finally I successfully deleted the relation using self.challenged_ids.delete(event.id)
validates_inclusion_of :foo, in: [['foo'], ['bar']]


Mongoid polymorphic behaviour

When a child embedded document can belong to more than one type of parent document, you can tell Mongoid to support this by adding the as option to the definition on the parents, and the polymorphic option on the child.
class Doctor
  include Mongoid::Document
  embeds_one :name, as: :namable
end
class Nurse
  include Mongoid::Document
  embeds_one :name, as: :namable
end
class Name
  include Mongoid::Document
  embedded_in :namable, polymorphic: true
end


TEST

Cucumber

rails g cucumber:install ?capybara ?rspec
  ruby script/rails generate cucumber:feature user email:string password:string confirm_password:string name:string nickname:string gender:integer location_name:string location:integer email_is_priavate:boolean name_is_private:boolean danted:boolean description:string
  ruby script/rails generate scaffold post title:string body:text published:boolean
  rake db:migrate
  rake cucumber


Cucumber Errors Handling

If SystemStackError: stack level too deep 
Then add gem "rspec", ">= 2.6.0.rc2", :group => [:development, :test] to Gemfile


Cucumber & Capybara Ajax

sleep second
page.driver.browser.execute_script %Q{ $('.ui-menu-item a:contains("#{link_text}")').trigger("mouseenter").click(); }
Clicking any element with Cucumber and Capybara
class Capybara::XPath
  class << self
    def element(locator)
      append("//*[normalize-space(text())=#{s(locator)}]")
    end
  end
end
When 'I click "$locator"' do |locator|
  msg = "No element found with the content of '#{locator}'"
  locate(:xpath, Capybara::XPath.element(locator), msg).click
end
The step looks for any element with the given text. Here it is in use:
Scenario: Creating an item
  Given I am signed in as "brandon@example.com"
   When I click "Add to your list"
    And I fill in "Description" with "blog about clicking any element"
    And I press enter
   Then I should see "The item was added to your list"
    And I should see "blog about clicking any element"
   


Cucumber Capybara

selenium chrome driver
https://github.com/jnicklas/capybara
http://code.google.com/p/chromium/downloads/list
http://code.google.com/p/selenium/wiki/ChromeDriver#Overriding_the_Chrome_binary_location
Capybara.register_driver :selenium_with_firebug do |app|
  Capybara::Driver::Selenium
  profile = Selenium::WebDriver::Firefox::Profile.new
  profile.add_extension(File.expand_path("features/support/firebug-1.6.0-fx.xpi"))
  Capybara::Driver::Selenium.new(app, { :browser => :firefox, :profile => profile })
end
Before("@selenium_with_firebug") do
  Capybara.current_driver = :selenium_with_firebug
end


I18n

I18n-js initialize

layout/application.html.haml
- html_tag :class => 'no-js', :lang => "#{I18n.locale}"
applcation.js
I18n.default_locale = "en"
I18n.locale = $($("html")[0]).prop("lang")
I18n.fallbacks = true


Media - Flickraw

    flickr.upload_photo(params[:photo].tempfile.path)


Gem Trouble shooting

Q. `require': no such file to load -- thin (LoadError)
A. => Add gem 'thin' to Gemfile


Rails Performance

  • Curb for Http (libcurl)
  • Yajl, the fastest JSON library.
  • excon #=> faster http
  • Nokogiri, the fastest XML library.
  • Snappy, super fast compression tool by google.
  • fast_xs
  • Memcache. (libmemcached)
  • use Ree Garbage Collector

Fastest Server

  • Unicorn
  • Thin

Profiling Tools

  • NewRelic - Monitoring Tool (Commercial)
  • Ganglia - Monitoring Tool (OpenSource)
  • Cloudflare - Performance & Security
  • rack-perftools

Rack-bug

1. Install rack-bug (branch rails3) as plugin
cd vendor/plugins
git clone -b rails3 https://github.com/brynary/rack-bug.git
If you want to you it as gem then add following line into Gemfile
gem 'rack-bug', :git => 'https://github.com/brynary/rack-bug.git', :branch => 'rails3'
2. Replace the code from file actionview_extension.rb
which is avilable in vendor/plugins/rack-bug/lib/rack/bug/panels/templates_panel/ as specified in bug of rack_bug repository
if defined?(ActionView) && defined?(ActionView::Template)
ActionView::Template.class_eval do
def render_with_rack_bug(*args, &block)
Rack::Bug::TemplatesPanel.record(virtual_path) do
render_without_rack_bug(*args, &block)
end
end
alias_method_chain :render, :rack_bug
end
end
If you are using gem override the specified file in some way
3. Add following lines into your config.ru
require 'rack/bug'
use Rack::Bug, :secret_key => "someverylongandveryhardtoguesspreferablyrandomstring"
run myapp
4. Start your server and access the URL http://your_app/__rack_bug__/bookmarklet.html
and enter the password.
http://blog.railsupgrade.com/2011/04/configure-rack-bug-for-rails-3.html


출처



by


Tags : , , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

Ruby on Rails Cheat Sheet


rails 데이터 타입

:string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean

Rails Mimetype   

"./."                      => :all
"text/plain"               => :text
"text/html"                => :html
"application/xhtml+xml"    => :html
"text/javascript"          => :js
"application/javascript"   => :js
"application/x-javascript" => :js
"text/calendar"            => :ics  
"text/csv"                 => :csv  
"application/xml"          => :xml
"text/xml"                 => :xml
"application/x-xml"        => :xml
"text/yaml"                => :yaml
"application/x-yaml"       => :yaml
"application/rss+xml"      => :rss  
"application/atom+xml"     => :atom 
"application/json"         => :json
"text/x-json"              => :json

bundle asset precompile

bundle exec rake assets:precompile RAILS_ENV="production"
rake assets:clean< add below code if you want development environment with out precompile config.serve.static.assets = false application.rb use Bundler.require(:default, :assets, Rails.env) instead of Bundler.require(*Rails.groups(:assets => %w(development test)))

compile assets locally

Put below into development.rb
config.assets.prefix = "/temp-assets"
Also put below into application.rb
config.assets.initialize.on.precompile = false

rails logger

Rails.logger.info "My info message"
Rails.logger.debug "My debugging message"
Rails.logger.warn "My warning message"

Environment Log level

config.log_level = :debug, :info, :warn, :error, and :fatal

Validation text length CR filter

before.validation :replace.cr
  protected
  def replace.cr
    if self.description.changed?
      self.description.gsub!(/\r\n?/, "\n")
    end
  end

validation locale


// config/locales/en.yml
en:
  activerecord:
    attributes:
      user:
        email: "E-mail address"
    errors:
      models:
        user:
          attributes:
            email:
              blank: "is required"
If you are using mongoid, replace activerecord: with mongoid:

Validate associated

The answer to this turned out to be rather simple. On the parent model, you simply explicitly declare that you want the associated children validated.
parent.rb
validates_associated :children

Validate if persisted? or new_record?

validates.uniqueness.of :nickname, :message => I18n.t("user.already.taken"), :if => :new.record?
validates.uniqueness.of :nickname, :message => I18n.t("user.already_taken"), :unless => :persisted?

Session Store in rails 3

Use the database for sessions instead of the cookie-based default, which shouldn't be used to store highly confidential information
Create the session table with
rake db:sessions:create
Run the migration
rake db:migrate
Make sure you also tell rails to use ActiveRecord to manage your sessions too.
Rails 3
config/initializers/session.store.rb:
Rails.application.config.session.store :active.record.store

DB Migrate Production

rake db:migrate RAILS_ENV="production"

get rails environment

Rails.env
env["SERVER_NAME"]

rails template

rake print --silent RECIPES=jquery,haml,rspec,cucumber,guard,mongoid,action.mailer,devise,add.user,home.page,home.page.users,seed.database,users.page,css.setup,application.layout,html5,navigation,cleanup,ban.spiders,extras,git,compass,omniauth,omniauth.email,backbone > ~/Desktop/backbone.template.txt
Could you please run it again using the "-T -O -J" flags? As in
rails new template_test -m https://github.com/fortuity/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O -J
http://blog.dominicsayers.com/2011/08/16/howto-use-a-rails-template-from-github-on-windows/

thin start

D:\dev\ruby192\bin\ruby.exe -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) D:/dev/workspace/baksisi/script/rails server thin -b 127.0.0.1 -p 3002 -e development
ruby ./script/rails server thin -b smoke-free-online.de -p 3000 -e development -d
thin start

Middle Man

"server" was called incorrectly. Call as "middleman server [-p 4567] [-e development]".
"middleman server [-p 4567] [-e development]" instead of "middleman server -p 4567 -e development

DB migration

Rails g migration change.data.type.for.table_column

I18n

locale join

config/application.rb
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '.*', '..{rb,yml}')]

locale path

routes.rb
  match '/:locale' => "home#index"
  root :to => "home#index"
  scope "/:locale" do   
    controller :models do
      something
    end
    resources :models, :only => :show
ApplicationController
  def default.url.options(options = {})
    options.merge!({:locale => I18n.locale})
  end   

Localize

I18n.l Time.now, :format => :short,  :locale => :"ko"

Pluralization

ko:
  pears:
    zero: ko.zero
    one: ko.one
    few: ko.few
    other: ko.other

generate rake tasks

rails g task namespace task1 task2
rake -T | grep namespace

세션 저장

config.session.store :cookie.store, :key => '.baksisi.session', :domain => :all
environment.rb 메일러에 레이아웃을 지정하고 싶다면.
DeviseMailer.layout "OMG"

show routes

rake routes

SASS

config/application.rb:
config.generators.stylesheet_engine = :sass
sass-convert style.sass style.scss

Trouble Shootings

uninitialized constant

file name confirm (if file name capital, it can be occurred.)

guard-livereload error

gem install eventmachine --pre 

open-uri.rb file in C:/Ruby1.9.2/lib/ruby/1.9.1/ (of course your path might be different).

http.verify.mode = options[:ssl.verify.mode] || OpenSSL::SSL::VERIFY.NONE

[ERROR] V8 is no longer usable

ulimit -v unlimited  

CSV Data Handling

http://www.ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV.html

get action information at view

    params[:action]

HAML

rails helper using haml
 
def section(name)
haml.tag(:div, :class => 'section') do
  haml.tag(:h2, name)
  haml.tag(:p, :class => 'section.content') do
    yield
  end
end
end
      
def content.box
  haml.tag :div, :class => "holder" do
    haml.tag :div, :class => "top"
    haml.tag :div, :class => "content" do
      yield
    haml.tag :div, :class => "bottom"
  end
end
and in haml
%html
  %head
  %body
    Maybee some content here.
    - content.box do
      Content that goes in the content_box like news or stuff      
     
fields_for with index
<% @questions.each.with.index do |question,index| %>
    <% f.fields.for :questions, question do |fq| %> 
        # here you have both the 'question' object and the current 'index'
    <% end %>
<% end %>
It’s also possible to specify the instance to be used:
<%= form.for @person do |person.form| %>
...
<% @person.projects.each do |project| %>
  <% if project.active? %>
    <%= person.form.fields.for :projects, project do |project.fields| %>
      Name: <%= project.fields.text_field :name %>
    <% end %>
  <% end %>
<% end %>
<% end %>     

Rails Response

namespace "api" do
  resources :regions, :defaults => { :format => 'xml' }
end
Then you should be able to have the following work for your controller methods:
class Api::RegionsController < ApplicationController
  respond.to :xml, :json
  def index
    respond.with(@regions = Region.all)
  end
end
rescue.from  ActionController::MissingFile do |e|
  # User's browser probably wont display this
  # Content-Type is application/x-shockwave-flash
  render :file => File.join(Rails.public.path, '404.html'), :status => 404
end

show details or stream video

def show
  @media = Media.find params[:id]
  respond.to do |format|
    format.html
    format.flv { send.file @media.path, :disposition => 'inline' }
  end
end
render :file => File.join(Rails.public.path, '404.html'), :status => 404, :content.type => 'text/html'

render with variable

render :partial => "my/conejo", :locals => {:my.val => something}
render "my/liebre", :my.val => something

scope

default_scope order('id DESC')
Model.reorder('')
Model.unscoped

render an other action in the controller, in js.

  render 'result', :id => @item.id, :format => :js
 

layout xhr? 

  class ApplicationController < ActionController::Base
  layout proc{|c| c.request.xhr? ? false : "application" }
  end
  layout :layout.xhr?
  def layout.xhr?
    request.xhr? ? false : 'application'
  end
 

AJAX Performance stale? and touch


 def show
    @list_item = @list.list_items.find( params[ :id ] )
    if stale?( :etag => @list_item, :last_modified => @list_item.updated_at.utc, :public => true )
      respond_with( @list_item )
    end
  end
  Also instead of the update_list method being called from after_save/destroy you can pass :touch => true to the belongs_to association which will do the same

AJAX Handler - ?xhr

respond_with( @something, :layout => !request.xhr? )
or
respond_to do |wants|
  wants.html do
    if request.xhr?
      render :partial => "items"
    else
      render
    end
  end
end

Asset

exist

YourApp::Application.assets.find_asset("#{asset}.file").nil?

### pathname

<YourAppName>::Application.assets.find_asset('Rails.png').pathname

absolute asset_path in view using helper

"#{request.protocol}#{request.host.with.port}#{asset.path('person/gravatar.default.png')}"
"#{request.scheme}://#{request.host.with.port}#{request.script_name}"

Mailer

config

environment/production.rb
  config.action.mailer.default.url.options = {:host => 'localhost:3000',:locale =>I18n.locale}
  config.action.mailer.smtp.settings = {
    :address              => "server.addr",
    :port                 => 587,
    :domain               => "sever.domain",
    :user.name            => "user.name",
    :password             => "user.password",
    :authentication       => "plain",
    :enable.starttls.auto => true
  } 
  config.action.mailer.delivery.method = :smtp
  config.action.mailer.perform.deliveries = true
  config.action.mailer.raise.delivery.errors = false
  config.action.mailer.default :charset => "utf-8"

inline attachement

in mailer

attachments.inline['blank'] = {
    :data => File.read("#{Rails.root.to.s + '/app/assets/images/blank.png'}"),
    :mime.type => "image/png",
    :encoding => "base64"
}

in view

if @offer.image.nil?
  = image.tag( attachments['blank'].url, :id => 'attachement.image', :width => "400", :height => "400")
 

validates in I18n

%{attribute} - field name
%{model} - model name 
%{count} - count


rescue log

begin
  ...some code...
rescue Exception => e
  logger.error e.message
 

Ruby

Iterate

a.each.with.index do |item, index|
  puts item, b[index]
end
array.each.slice(3) do |elements|
  fire.the_event
end

Timezone

in client (js):
function set.time.zone.offset() {
    var current.time = new Date();
    $.cookie('time.zone', current.time.getTimezoneOffset());
}
in Application Controller:
before.filter :set.timezone
def set.timezone 
 min = request.cookies["time.zone"].to_i
 Time.zone = ActiveSupport::TimeZone[-min.minutes]
end

DateTime format

  %a - The abbreviated weekday name (Sun)
&nbsp; %A - The&nbsp; full&nbsp; weekday&nbsp; name (Sunday)
  %b - The abbreviated month name (Jan)
&nbsp; %B - The&nbsp; full&nbsp; month&nbsp; name (January)
  %c - The preferred local date and time representation
  %d - Day of the month (01..31)
  %H - Hour of the day, 24-hour clock (00..23)
  %I - Hour of the day, 12-hour clock (01..12)
  %j - Day of the year (001..366)
  %m - Month of the year (01..12)
  %M - Minute of the hour (00..59)
  %p - Meridian indicator (AM&nbsp; or&nbsp;PM)
  %S - Second of the minute (00..60)
  %U - Week  number  of the current year,
          starting with the first Sunday as the first
          day of the first week (00..53)
  %W - Week  number  of the current year,
          starting with the first Monday as the first
          day of the first week (00..53)
  %w - Day of the week (Sunday is 0, 0..6)
  %x - Preferred representation for the date alone, no time
  %X - Preferred representation for the time alone, no date
  %y - Year without a century (00..99)
  %Y - Year with century
  %Z - Time zone name
  %% - Literal ``%'' character
   t = Time.now
   t.strftime("Printed on %m/%d/%Y")   #=> "Printed on 04/09/2003"
   t.strftime("at %I:%M%p")            #=> "at 08:56AM"
  
   datetime seconds, hours, days, weeks, months, and years
  
    Add below lines to one of your initializer files, e.g., config/environment.rb:
    DateTime::DATE.FORMATS[:short]="short %Y-%m-%d %H:%M:%S"
    Time::DATE.FORMATS[:short] = "short %Y-%m-%d %H:%M:%S"
    Date::DATE.FORMATS[:short] = "short %Y-%m-%d"
    modify view:
    <%= item.create_date.to_s(:short) %>
distance_of_time_in_words(from_time, to_time = 0, include_seconds = false, options = {})
today = DateTime.now
=> #<DateTime: 441799066630193/180000000,-301/1440,2299161>
birthday = Date.new(2008, 4, 10)
=> #<Date: 4909133/2,0,2299161>
days_to_go = birthday - today
time_until = birthday - today
=> Rational(22903369807, 180000000)
time_until.to_i             # get the number of days until my birthday
=> 127
hours,minutes,seconds,frac = Date.day_fraction.to_time(time_until)
[3053, 46, 57, Rational(1057, 180000000)]
- mm  = (now-la    st_cigarette).divmod(Rational(1, 1440))[0]
- past.days = mm / 1440
- past.hours = (mm % 1440) / 60
- past_minutes = mm % 60

timezone

def set_api_time_zone
  utc_offset = current.user.session && current.user.session.user ? current.user.session.user.time.zone.offset.to.i.minutes : 0
  user.timezone = ActiveSupport::TimeZone[utc.offset]
  Time.zone = user.timezone if user.timezone
  Time.zone.today
  Time.now.to.date
    # => Thu, 19 May 2011
  Time.now.in.time.zone('Melbourne').to_date
    # => Fri, 20 May 2011
end

Range step

range.step(2) {|x| puts x}


benchmark

require 'benchmark'
n = 1000000
def answer1 current.subdomain
  case current.subdomain
  when 'www', 'blog', 'foo', 'bar'
  else nil
  end
end
def answer2 current.subdomain
  nil unless  ["www", "blog", "foo", "bar"].include?(current.subdomain)
end
Benchmark.bmbm do |b|
  b.report('answer1'){n.times{answer1('bar')}}
  b.report('answer2'){n.times{answer2('bar')}}
end
Rehearsal -------------------------------------------
answer1   0.290000   0.000000   0.290000 (  0.286367)
answer2   1.170000   0.000000   1.170000 (  1.175492)
---------------------------------- total: 1.460000sec
              user     system      total        real
answer1   0.290000   0.000000   0.290000 (  0.282610)
answer2   1.180000   0.000000   1.180000 (  1.186130)
Benchmark.bmbm do |b|
  b.report('answer1'){n.times{answer1('hello')}}
  b.report('answer2'){n.times{answer2('hello')}}
end
Rehearsal -------------------------------------------
answer1   0.250000   0.000000   0.250000 (  0.252618)
answer2   1.100000   0.000000   1.100000 (  1.091571)
---------------------------------- total: 1.350000sec
              user     system      total        real
answer1   0.250000   0.000000   0.250000 (  0.251833)
answer2   1.090000   0.000000   1.090000 (  1.090418)


출처




by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

괜찮은 루비온 레일즈 개발 도구, 루비마인을 소개 합니다.

저에겐 이클립스가 가장 익숙한 IDE입니다.
그런데 요즘은 자바보단 RoR개발에 흥미가 있어서,
루비온레일즈용 IDE를 찾아보았어요.
이클립스에서도 루비온 레일즈용 플러그인인 aptana를 제공하긴 하지만,
다른 계열의 도구를 한번 써보고 싶었어요.

루비 마인 (RubyMine)

루비마인은 IntelliJ IDEA 계열의 IDE입니다.
얼마간 쓰다 보니, 금방 이클립스보다 더 친숙해졌어요.:D
UI가 직관적이라 따로 메뉴얼을 보지 않아도 금방 익숙해집니다.
물론 이클립스 같은 다른 IDE에 익숙한 경우에 말이죠. ^^;
다른 IDE에서 넘어오는 사용자를 위해, 친절하게 키셋도 제공해요.
이클립스의 키셋을 설정했더니, 단축키도 익숙하고 편하네요!
RoR개발만 한다면 한번 고려해 볼만한 IDE입니다.
저의 루비마인 RoR 개발 환경을 소개할게요.

우선 전 랩탑과 넷북사이의 어중간한 사양에서 루비마인을 돌려요.
그래서 무엇보다 성능 최적화가 중요하죠.
검색을 통해 약간의 최적화 팁을 찾았어요.
루비 마인은 프로젝트 내의 모든 파일을 인덱싱 합니다.
로그파일 처럼 큰 파일을 프로젝트 내에 포함시킨다면, 인덱싱을 하는데 많은 시간을 잡아먹죠.
그러니 이런 로그파일은 프로젝트 파일에서 제외시키는 편이 성능에 도움이 되요.

64비트 자바를 사용하신다면,
RubyMine\bin\rubymine.exe.vmoptions 파일에서 힙 메모리 옵션을 변경해 주세요.

-Xms800m
-Xmx1200m
-XX:MaxPermSize=1000m
-ea

저는 위 설정에서 Xmx가 너무 크다고 오류메시지가 나와서 아래처럼 설정을 했습니다.


-Xms800m
-Xmx964m
-XX:MaxPermSize=512m
-ea

Jquery 코드 어시스트 적용하기

Settings » JavaScript Libraries 로가서 Jquery 라이브러리를 추가해줍니다.
그리고 Usage Scope에서 추가한 Jquery에 체크를 하면 Jquery 코드 어시스트를 사용할 수 있어요.

Blueforest 색상 세트 적용하기

루비 마인에서 기본 색상 세트를 제공하지만, 저는 Blueforest 색상 세트를 약간 수정하여 사용합니다.
아주 만족스럽네요.:D

TODO List 사용하기

Setting에서 Todo페이지를 엽니다.
TODO 패턴을 정의합니다.
Ctrl+Slash 키나 Ctrl+Divide로 주석을 만들고 todo를 입력합니다.

예제
#todo 해야할 일 목록 작성하기

루비 마인 (RubyMine)

저는 crisis, hold, todo를 정의하여 사용 하고 있습니다.
루비마인에서 자동으로 트랙킹을 해 주기 때문에,
추후에 기능을 추가할 부분에 써 놓으면 편리해요.

맥이 아니라 Textmate도 없고,
괜찮은 루비온레일즈용 개발 도구를 찾고 계시다면 루비마인 한번 고려해 보세요.:D

참고 자료

Ruby on Rails IDE :: JetBrains RubyMine

Using TODO Lists

Set/Increase Memory Available in Rubymine

A couple of tips for RubyMine performance optimization

BlueForest Color Scheme



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

레일즈 3.1 가이드를 HTML로 내려 받아, 오프라인에서 보는 방법입니다.

레일즈 3.1 가이드 내려 받기

한국처럼 인터넷 환경이 잘 갖추어진 곳에선 굳이 레일즈 가이드를 다운 받을 필요가 없어요.
하지만 레일즈 가이드가 딱 필요한 순간에 서버가 점검중이던가,
갑작스런 인터넷 회선의 문제가 생겼을 때 유용합니다.
또 인터넷이 아주 느린 환경이나,
저처럼 인터넷을 정량제로 쓰신다면, 내려 받은 레일즈 가이드가 상당히 쓸만해요.
레일즈 사이트에 갔더니 가이드 내려 받기를 따로 지원하지 않는군요.
‘레일즈 3.1 가이드는 어디서 다운 받나요?’
검색엔진을 통해 방법을 찾았습니다.
아래의 방법을 따라 레일즈 가이드를 내려 받으세요.

레일즈 3.1 가이드 내려 받기

  1. 우선 Git를 설치합니다.
  2. git clone git://github.com/rails/rails.git 으로 rails.git를 복제합니다.
  3. gem install RedCloth --no-rdoc 으로 RedCloth Gem을 설치합니다.
  4. Ruby_Root(루비가 설치된 루트)\lib\ruby\gems\1.9.1\gems\RedCloth-4.2.8\lib 디렉토리로 갑니다.
  5. mkdir 1.91.9 폴더를 만듭니다.
  6. copy redcloth_scan.so 1.9 명령어를 실행해 redcloth_scan.so를 1.9 폴더로 복사합니다.
  7. cd rails 명령어로 rails 디렉토리로 갑니다.
  8. git checkout origin/3-1-stable -b 3-1-stable 명령어로 레일즈 3.1 버전을 체크아웃합니다.
  9. cd railties/guides 명령어로 가이드 디렉토리로 갑니다.
  10. ruby rails_guides.rb 를 실행합니다.
  11. 그럼 output 폴더가 생성되는데, 이 폴더가 레일즈 3.1 가이드 오프라인 버전입니다.

내려 받은 가이드로 오프라인에서도 편하게 루비온 레일즈 개발 하세요.:D

참고 자료

How to install redcloth on windows

Rails 3 guides ruby on rails in pdf


by 月風



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

맥에서 rvm(Ruby Version Manager)를 이용한 ruby on rails 개발 환경 구축 방법입니다.

맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기

ROR-'맥 OS X에 rvm을 이용해 ruby on rails 개발 환경 구축하기'

맥 OS X에서 루비 설치하기

우선 터미널에서 아래의 커멘드를 이용해 RVM(Ruby Version Manager)을 설치합니다.

$ bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer

다음은 아래 명령어를 순서대로 실행하여 루비를 최신 버전인 1.9.2로 업데이트 합니다.

  1. rvm update
  2. rvm reload
  3. rvm install 1.9.2
  4. rvm use 1.9.2 --default

/Users/username/.profile 에 다음을 추가합니다.
[[ -s "/Users/username/.rvm/scripts/rvm" ]] && source "/Users/username/.rvm/scripts/rvm"
PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MANPATH=/opt/local/share/man:$MANPATH
export PATH="/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH"
rvm use 1.9.2 --default

자 ruby -v로  확인해 볼까요?

ruby 1.9.2p290

루비 1.9.2 버전이 제대로 설치되었습니다.




맥 OS X에서 mysql2 gem 설치하기

우선 아래의 커맨드로 homebrew를 설치합니다.

/usr/bin/ruby -e "$(curl -fsSL https://raw.github.com/gist/323731)"

brew를 통해 mysql을 설치합니다.

brew install mysql

그리고 mysql2 gem을 설치하면 끝!

gem install mysql2




맥 OS X에서 MAMP 의 mysql.sock 기본 경로 바꾸기

MAMP의 기본 소켓 경로는 다음과 같습니다.
/Applications/MAMP/tmp/mysql/mysql.sock
이 경로가 한 곳에서 관리되지 않으므로 여러 파일을 수정해야 합니다.

/usr/local/mysql/support-files/my-small.cnfApplications/MAMP/conf/my.cnf로 복사합니다.
socket = /Applications/MAMP/tmp/mysql/mysql.sock
/Applications/MAMP/bin/php/php..*/conf/php.ini
mysql.defaultsocket=/Applications/MAMP/tmp/mysql/mysql.sock
/Applications/MAMP/bin/mamp/index.php
/Applications/MAMP/bin/mamp/English/index.php
@mysql
connect('/Applications/MAMP/tmp/mysql/mysql.sock')
/Applications/MAMP/bin/quickCheckMysqlUpgrade.sh
/Applications/MAMP/bin/checkMysql.sh
/Applications/MAMP/bin/startMysql.sh
/Applications/MAMP/bin/stopMysql.sh
socket=/Applications/MAMP/tmp/mysql/mysql.sock

socket부분을 원하는 경로로 변경합니다.
/Applications/MAMP/tmp/mysql/mysql.sock  => /tmp/mysql.sock

파일 내용을 모두 바꾸기 귀찮다면, 아래 스크립트 파일을 만들어서 사용하세요.
MySQL 서버가 켜졌을 때 실행하면 됩니다.
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
by 月風



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

레일즈 3.1에서 헬퍼를 이용한 액티브 레코드 라벨 번역하는 방법입니다.

레일즈 3.1에서 액티브 레코드 라벨 번역하기

ror-'레일즈 3.1에서 액티브 레코드 라벨 번역하기'

루비 온 레일즈 국제화(i18n) 가이드의 액티브 레코드 모델 번역 부분을 보면,
다음과 같은 방식으로 액티브 레코드 번역을 할 수 있다고 합니다.

en.yml

en:
  activerecord:
    models:
      user: Dude
    attributes:
      user:
        login: "Handle"
      # will translate User attribute "login" as "Handle"

User.humanattributename("login") 를 사용하면 Handle이 출력된다고 설명되어 있군요.

f.label :login 을 이용해 값을 출력하면?

Login

이라고 출력되네요.

그렇다면 label이 자동으로 번역되도록 하려면 어떻게 해야 할까요?

en.yml에 다음과 같이 추가해주면 아주 잘 동작합니다.

en:
   helpers:
    label:   
      user:
        name: "Handle"

label 헬퍼에 라벨값을 넣어 주는거에요.

이제 아래 코드를 레일즈 뷰에 입력해 보죠.

<% formfor @users do |f| %>
  <%= f.label :name %>
  <%= f.text
field :name %>
  <%= f.submit %>
<% end %>

Handle

이 출력됩니다.

레일즈 3.1에서 다국어 어플리케이션 개발 편하게 하세요.:D
by 月風



by


Tags : , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

windows 7 x64환경의 ruby 1.9.2에 mysql2 gem 설치하는 방법입니다.

windows 7환경의 ruby 1.9.2에 mysql2 gem 설치하기

ROR-'windows 7 x64환경의 ruby 1.9.2에 mysql2 gem 설치하기'

gem을 설치하는 방법은 간단합니다.

gem install mysql2

하지만 안타깝게도 저의 64비트 윈도우 환경에서는 mysql2 gem이 제대로 설치 되지 않는군요.

열심히 구글링 끝에 겨우 설치에 성공했습니다.

혹시 저와 같은 환경에서 머리카락을 뜯고 계신 분께는 이 글이 도움이 될 거에요.

Devkit 설치하기

  1. devkit을 내려 받습니다.
  2. devkit의 압축을 풉니다.
  3. cmd를 실행합니다.
  4. devkit 폴더로 갑니다.
  5. ruby dk.rb init를 실행합니다.
  6. 생성된 devkit의 config.yml 파일의 루비 경로를 수정해 줍니다.
  7. (선택사항) ruby dk.rb review 를 실행하여 경로가 올바른지 확인합니다.
  8. ruby dk.rb install을 실행합니다.

자 이제 ruby 1.9.2에서 mysql2 gem을 설치하기 위한 준비과정을 마쳤습니다.
본격적으로 설치를 해보죠.

mysql2 gem 설치 하기

  1. libmysql.dll 32비트를 내려받습니다.
  2. ruby192\bin 폴더에 내려받은 libmysql.dll을 복사합니다.
  3. mysql/lib 폴더에 내려받은 libmysql.dll를 복사합니다.(원본은 백업해 두세요.)
  4. subst X: "C:\mysql5.5.x" 로 mysql 폴더를 가상 드라이브로 설정해 줍니다.
  5. gem install mysql2 --platform=ruby -- --with-mysql-dir=X: --with-mysql-lib=X:\lib 로 gem을 설치합니다.
  6. subst X: /D 명령어로 가상 드라이버를 해제합니다.

드디어 길었던 windows 7 x64환경의 ruby 1.9.2에 mysql2 gem 설치하기 과정이 끝났습니다.

32비트 환경에서는 libmysql.dll파일을 내려받을 필요가 없어요.:D

참고 자료

Installing mysql2 gem on ruby 192

Development-Kit
by 月風



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.

Aptana Studio 3를 이용하여 Ruby 1.92+Rails 3.1 이클립스 개발 환경을 구축 할 수 있습니다.

이클립스를 켜 본지가 언제인지..
정말 한참만이군요.
Ruby 1.8.7과 Rails 2.3.5에서 만들던 어플리케이션이 하나 있습니다.
손 놓은지가 오래되어, 새로운 환경에서 개발을 하려니 익숙하지가 않네요.^^;
by 月風

Ruby 1.92 + Rails 3.1 이클립스 개발 환경 구축하기

'Ruby 1.92 + Rails 3.1 이클립스 개발 환경 구축하기'

  1. Ruby192 바이너리를  설치하고, 패스(Path)를 잡는다.
  2. 이클립스를 구동한다.
  3. Help -> Install New Software 로 들어간다.
  4. http://download.aptana.com/studio3/plugin/install를 추가한다.
  5. Aptana Studio 3에 체크를 하고 인스톨을 한다.
  6. 이클립스를 재부팅 한다.
  7. 새 Rails 프로젝트를 생성한다.
  8. Terminal로 들어간다.
  9. rails new test 를 입력하여 test application을 만든다.
  10. cd test를 입력하여 test 폴더로 간다.
  11. rails generate scaffold Vote name:string age:int voted:boolean 을 입력하여 Scaffold를 생성한다.
  12. rake db:migrate 로 데이타 베이스를 Migration한다.
  13. script/rails server 로 서버를 구동 시킨다.
  14. 어플리케이션을 테스트 해 본다.

이클립스용 RoR 개발도구 Aptana Studio3에 관한 정보는 아래 링크에서 보실 수 있습니다.
이클립스용 RoR 개발도구 Aptana Studio3

 



by


Tags : , , , , , ,

  • 재미있게 읽으셨나요?
    방랑자의 이야기.
    월풍도원에선 기부를 받습니다.