싸미~*

Rails) Graph Library(Module)

.Tip

Rails에서 Graph표현을 어떻게 해야 할까 고민중에,

한국 루비 사용자 포럼에서 다음의 모듈들을 확인 할 수 있었다.


1. Gruff

     http://geoffreygrosenbach.com/projects/show/5

image

   1) 선행 작업 (RMagick 필요)

         설치시에는 상관 없으나, Gruff을 통하여 위 그림처럼 표현을 하려면,

         RMagick을 필요로 한다.

For Ubuntu )

$> apt-get install imagemagick
$> apt-get install libmagick9-dev
$> gem install rmagick

    2) 문제 발생

         다음 로그처럼, ImageMagick Version 문제가 생김

/usr/bin/ruby1.8 extconf.rb install rmagick -include-dependencies
checking for Ruby version >= 1.8.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.3.0... no
Can't install RMagick 2.0.0. You must have ImageMagick 6.3.0 or later.

          해결) gem update 말고, 수동 설치함

          - ImageMagick 최신 버젼받기 [여기 링크]

          - Install 하기 [여기 링크]


           참고) 버전확인을 해보자

root:# convert -version
Version: ImageMagick 6.3.7 01/22/08 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2008 ImageMagick Studio LLC


    3) Gruff Install 방법 (다음 중 택일)

$> gem install gruff

$> ./script/plugin install http://topfunky.net/svn/plugins/gruff


    4) 테스트

임의의 Method에서 다음처럼 넣어보자

출처 : http://nubyonrails.com/pages/gruff

def Test

  g = Gruff::Line.new
  g.title = "My Graph"

  g.data("Apples", [1, 2, 3, 4, 4, 3])
  g.data("Oranges", [4, 8, 7, 9, 8, 9])
  g.data("Watermelon", [2, 3, 1, 5, 6, 8])
  g.data("Peaches", [9, 9, 10, 8, 7, 9])

  g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}

  g.write('my_fruity_graph.png')

end

          rails/ 폴더 아래에 "my_frity_graph.png"생김

image


2. Sparklines

   이는 Gruff보다는 기능이 조금 빠진다.

<%= spark_tag [12, 22, 34, 42, 33], 
:type => 'smooth',
:height => 15 %>

image


이외 Flexbilrails 라고 있다고 하는데 이는 일단 배제..;;

신고

Rails) flash 사용법

.Tip

flash 는 Rails Application에서의 Action과 Action간에 정보를 공유하기 위해 만들어진 기능이다.

HTTP Protocol은, 기본적으로 상태가 유지되지 않는 프로토콜인데,

만약 특정 액션에서 에러가 발생하여, Browser가 다른 액션으로 Redirect되는 경우,

이전 액션에서 발생한 Error Message를 확인할 수 있는 방법 이 없게 된다.

(여기서 Flash 는, Flash MX 등에서 사용하는 Flash가 아니다)

 

Flash기능은, 이런 경우에 이전 Action에서, 다음 액션으로 정보를 넘겨주는 것을 가능하게 한다.

(이상 '웹 개발 2.0 루비온 레이슬' -황대산 지음 에서 발췌)

그러면, 사용법을 알아보자.

app/controller/user_controller.rb
class UsesController < ApplicationController
    def list
        @users = User.find(:all)
        @note = flash[:note]
    end
    ..
    def create
        @user = User.new(params[:user])
        if @user.save
            flash[:note] = "새로운 사용자가 추가되었습니다"
            redirect_to(:action => 'list')
        end
end

create라는 액션메소드에서,

사용자를 추가하여, DB에 저장한후, list라는 액션메소드로 건너간다.

이때 'flash' 에 메세지를 저장하고,

이를 list 액션메소드에서 활용하는 것을 볼 수 있다.

View 에서 다음처럼 쓸수 있을 것이다.


    ...
    
        <% if @flash[:note] -%>
            <%= @flash[:note] %>
        <% end %>
     ..

신고

[Ubuntu] HOWTO: Build a Ruby (Rails) Environment

.Tip

# 다음 명령들을 수행한다.

apt-get install ruby
apt-get install rubygems
gem update --system
gem update
apt-get install ruby1.8-dev
apt-get install libzlib-ruby
apt-get install libyaml-ruby
apt-get install libdrb-ruby
apt-get install liberb-ruby
apt-get install rdoc
apt-get install zlib1g-dev
apt-get install libopenssl-ruby

# Mongrel 설치

gem install daemons gem_plugin mongrel mongrel_cluster --include-dependencies

..dependency을 확인하여 각각 설치할 것인지 물어본다.


#필수

  • apt-get install ruby rubygems irb ri rdoc ruby1.8-dev build-essential
  • gem install rails --include-dependencies
  • export PATH=$PATH:/var/lib/gems/1.8/bin
(참고 특정 버전으로 Install 하기 위해서는 다음처럼 하면 된다.
 $> gem install -v=1.2.3 rails )

#옵션

  • apt-get install libmysql-ruby mysql-server
    (mysql이 설치되어있다면, mysql-server는 패스)
  • apt-get install libopenssl-ruby
    (SSL Support)
  • apt-get install imagemagick
    dgpk -l | grep magick

    apt-get install libmagick9-dev
    gem install rmagick

    (ImageMagick Support)

#참고

  • Ubuntu 7.04 (Fiesty) 경우, 다음 버전 필수

    Rails >= 1.2.1 , Ruby >= 1.8.2 , Ruby 1.8 >= 1.8.5, Rubygmes >= 0.9.0
신고

Rails] gem install error

.Tip

Gem 설치 후, 다음의 문제가 발생하였다.

------------

uninitialized constant Gem::GemRunner (NameError)

------------

다음 중 택일

Fix 0.

       기존의 Gem 삭제 후, 상위 Gem 버전을 수동으로 설치한다.

 

Fix 1.

       /usr/bin/gem 파일내 다음처럼 수정한다.

        require 'rubygems'
        require 'rubygems/gem_runner'
        
신고

[Ruby] XML Builder 와 REXML

.Tech

Ruby(Rails)을 통해서, XML Parsing과 Build시 다음 두개의 Class(Or Module)을 사용한다.

1. Builder

Ruby Class중에 "Builder"을 통해서, XML 을 만들어 낼 수가 있다.
(참고 = XML.com의 "Createing XML with Ruby and Builder")

2. REXML

XML Parser중 작고, 빠른편이다.
(참고 = Germane Software의 XML소개)

사용법은 위 두개 참고 사이트를 보면 된다.

여기서 언급할 것은, Builder을 통해서 XML을 생성 할 때,

주로 String으로 XML을 담아왔었다.

 

다음은 이를 파일로 담아오는 방법이다.

require 'builder'

file = File.new("result.xml", "w")
$stdout = file

xml = Builder::XmlMarkup.new(:target => $stdout)
...
신고

[Ruby] 유니코드 확장

.Tip

Ruby의 문자열은 Byte열로 구현되어있어서, 루비 문자열 객체의 메소드는 기본적으로 바이트 단위로 처리한다.

한국어와 같은 Multi-byte 문자를 처리할때 예상치 못한 결과가 발생할 수 있다.

 

"디자인"과 같은 한글 문자열은 3글자로 구성되어있지만, 바이트 단위로는 9 바이트를 차지한다.

따라서, 바이트 기반 메소드인 "length"을 사용하면, 3 대신에 9를 리턴한다.

 

이때 chars라는 Proxy메소드를 사용하여, 유니코드 기반의 메소드를 지원하고 있다.

 

다음은 그 예이다.

>> puts "디자인"
디자인

>> "디자인".length
==> 9

>> "디자인".chars.length
==> 3
신고

[Ruby] Iconv 사용법

.Tip

다음은 ruby에서 iconv을 사용하는 방법이다.

# module 선언
require 'iconv'

...

# EUC-KR을 UTF-8로 변환하기 위한 선언
conv = Iconv.new('UTF-8', 'EUC-KR')

#Convert 'document'
converted = conv.iconv(document)

 

Tip1. Document내 확장 완성형 문자가 존재하는 경우, 에러발생

(참조 : superkdk in the NET)

위 참조에서 설명한 대로,

"//IGNORE"옵션을 붙이면, 처리하지 못하는 문자열을 무시하도록 할 수 있다고 한다.

# EUC-KR을 UTF-8로 변환하기 위한 선언
conv = Iconv.new('UTF-8//IGNORE', 'EUC-KR')

 

Tip2. Ruby에서 Ruby-Feedparser의 사용시 인코딩 문제

(참조 : superkdk in the NET)

"textconverters.rb" 에서 "toUTF8"을 수정

자세한 것은 참조사이트 참고

신고

RubyOnRails - Logger 기능

.Tech

Rails App에는 3가지 구동 모드가 있다.  [Development/ Production/ Test]

Mongrel 웹서를 이용하는 경우, 다음 처럼 구동모드를 선택할 수가 있다.

mongrel_rails start -e development -d -p <포트번호>

mongrel_rails start -e production -d -p <포트번호>

mongrel_rails start -e test -d -p <포트번호>


이 구동모드에 따라 각각 log파일이 따로 존재한다.

<rails_app_path>/log/development.log

<rails_app_path>/log/productiont.log

<rails_app_path>/log/test.log

 

Rails에서 제공되는 logging 이외 다른 log을 기록하고 싶다면 다음처럼 꾸리면 된다.

 

## Log 선언

표준 or 파일 입출력 모두 가능함

logger = Logger.new(/입출력/)

logger = Logger.new(STDOUT)

logger = Logger.new("hi.log")

 

## Log 레벨 지정

log 레벨은 다음과 같다

[DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN]

logger.level = Logger::INFO 
ogger.level = Logger::DEBUG

 

## Log 사용

logger.level "LOG Message" or
logger.level ("LOG Message")
logger.info("Application starting")
Level을 최소 Info로 지정해야 파일에 log가 남는다.
logger.FATAL("Application terminating")
level을 최소 Fatal로 지정해야 파일에 log가 남는다.
  

다음은 내가 사용하고 있는 예제이다.


## <username>.log 로 logging을 하되,
     log 파일의 크기 제한은 100k임
     단. 100k 파일을 최대 10개까지 생성할수 있되,
      10을 기준으로 반복/갱신 된다.

logger = Logger.new("./log/#{username}.log", 10, 100*1024)

## log level은 "DEBUG"로, 모든 로그을 뽑아내고자 한다.
  (개발모드라서)
   양산(?) 버전에서는 FATAL등으로 처리하면 편할듯

logger.level = Logger::DEBUG

## log을 남길 메세지를 정한다. 
   __LINE__ : 
   현재 파일의 line number을 나타냄. (파일이름은 __FILE__)

logger.info "#{__LINE__}  : user login time = #{login_time}"

logger.fatal "#{__LINE__} : No user id!!!!!!!"

신고

[Rails] Ordered Hash

.Tech/Linux

* ruby에서 hash을 쓰다보면,

   Hash table에 입력순서대로 값이 들어가질 않는다.

  이 Ordered hash을 사용하게 되면, 입력 순서대로 값이 입력된다.


Ordered Hash을 위해서, 몇가지 Gem을 설치하였다.

GoodLibs                   - 현재 사용중인 것 (2006.05 이후로 업데이트 이루어지지 않음)

Facets - Dictionary    - 좀더 유명한 Gems, 하지만 "Sort" method을 지원하지 못한다.


Sort method 을 지원하기 위하여, GoodLibs을 다시 설치하였는데,

"File is not to unload" 라는 에러 발생한다.


Gem 설치하고, Ruby Path가 잡혀있는데도 이런 상황.


혹시나 해서, GoodLibs 설치된 폴더에서

"ruby ordered_hash.rb" 을 했더니 되더라...ㄷㄷㄷㄷ

(참고 . ordered_hash 위치

  Path : ./ruby/lib/ruby/gems/1.8/gems/GoodLibs-1.2006.05.23/lib)


참고로 Ordered Hash을 지원하는 다른것도 소개함

Ruby/RBTree


p.s] xml을 다루는 경우, builder 모듈을 많이 사용하는데,

"gem install builder"하면 설치 가능하다.


신고

[Ubuntu] Mongrel 사용

.Tech/Linux


# 가정 : Rails 설치

 

# Mongrel 설치

gem install gem-plugin mongrel mongrel_cluster --include-dependencies

Select which gem to install for your platform (i486-linux)
 1. mongrel 1.0.1 (mswin32)
 2. mongrel 1.0.1 (ruby)
 3. mongrel 1.0 (mswin32)
 4. mongrel 1.0 (ruby)
 5. Skip this gem
 6. Cancel installation
> 2
Select which gem to install for your platform (i486-linux)
 1. fastthread 1.0 (ruby)
 2. fastthread 1.0 (mswin32)
 3. fastthread 0.6.4.1 (mswin32)
 4. fastthread 0.6.4.1 (ruby)
 5. Skip this gem
 6. Cancel installation

> 1

# Test (rails app만들고, mongrel 서버 시작하기)

$ mkdir ~/rals;  cd ~/rails;

$ rails www  (www rails app만들기)

$ mongrel_rails cluster::configure-p 8001 -a 127.0.0.1 -N 3

$ mongrel_rails cluster::start

 

>> http://127.0.0.1:8001 로 접속시, Rails "welcome" 화면을 볼수 있을 것이다.

 

# Apache 2.2

1. 다음 모듈들 필요

  $ a2enmod rewirte

  $ a2enmod proxy

  $ a2enmod proxy_balancer

  > Apache 재시작

 

2. apache2.conf 에 httpd.conf 추가
  "Include /home/xxx/conf/httpd.conf"

3. 위 httpd.conf에는 다음 내용 추가

NameVirtualHost *:80
<VirtualHost *:80>
  ServerName xxx-server.org
  Include /home/xxx/conf/www.conf
</VirtualHost>
<VirtualHost *:80>
  ServerName www.xxx-server.org
  Include /home/xxx/conf/www.conf
</VirtualHost>


4. 다음은, 다른 Config 파일 link-out 시키는 법

DocumentRoot /home/rcrowley/rails/www/public
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ balancer://www_mongrel%{REQUEST_URI} [P,QSA,L]
<Proxy balancer://www_mongrel>
  BalancerMember http://127.0.0.1:8001
  BalancerMember http://127.0.0.1:8002
  BalancerMember http://127.0.0.1:8003
</Proxy>

5. "/etc/init.d/mongre" 을 다음처럼 수정하면 편함

#! /bin/sh
do_start()
{
  echo "Starting Mongrel..."
  mongrel_rails cluster::start -C ~rcrowley/rails/www/config/mongrel_cluster.yml
}
do_stop()
{
  echo "Stopping Mongrel..."
  mongrel_rails cluster::stop -C ~rcrowley/rails/www/config/mongrel_cluster.yml
}
case "$1" in
  start)
    do_start
    ;;
  stop)
    do_stop
    ;;
  restart|force-reload)
    do_stop
    do_start
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
    exit 3
    ;;
esac

5. Mongre 시작

  $ update-rc.d mongrel defaults

6. Mongrel - Cluster 로 시작

   1) 방법 1

        각 rails application 디렉토리 이동 후,

         $ mongrel_rails start -e development -d -p 8080 //8080포트로 시작

         $ mongrel_rails start -e development -d -p 8090 //8090포트로 시작

   2) 방법 2

         $ mongrel_rails cluster::configure -e development -p 8080 -N 3 -c /<rails_app_path>

         $ mongrel_rails cluster::configure -e development -p 8090 -N 3 -c /<rails_app_path>

신고