ホーム ブログ ページ 69

Scaffoldはどこからくるの? 後編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。
KBMJのエンジニアの高瀬です。

大分間が空いてしまいましたが、前回の続きを書く事にします。
前回は、http://doruby.kbmj.com/zenpou_on_rails/20071227/Scaffold___

前回はscaffoldを作って以下の様なファイルが出来ました。
     create  app/views/members
      create  app/views/members/index.html.erb
      create  app/views/members/show.html.erb
      create  app/views/members/new.html.erb
      create  app/views/members/edit.html.erb
      create  app/views/layouts/members.html.erb
      create  public/stylesheets/scaffold.css
      create    app/models/member.rb
      create    test/unit/member_test.rb
      create    test/fixtures/members.yml
      create    db/migrate
      create    db/migrate/001_create_members.rb
      create  app/controllers/members_controller.rb
      create  test/functional/members_controller_test.rb
      create  app/helpers/members_helper.rb

こちら、どこから来るのかを調べて行こうと思います。

結論を先に述べると、以下のパスにテンプレートが存在します。
{railsのインストール先}/lib/rails_generator/generators/components/scaffold/
これがどのような仕組みになっているかを追いかけて行きます。

前回、scaffoldは以下のコマンドによって生成されました。

      ruby script/generate scaffold Member name:string discription:text birthday:datetime
rubyの構文はruby –helpによって出してみたところ
    Usage: ruby [switches] [–] [programfile] [arguments]

      -0[octal]       specify record separator (\0, if no argument)
      -a              autosplit mode with -n or -p (splits $_ into $F)
      -c              check syntax only
      -Cdirectory     cd to directory, before executing your script
      -d              set debugging flags (set $DEBUG to true)
      -e ‘command’    one line of script. Several -e’s allowed. Omit [programfile]
      -Fpattern       split() pattern for autosplit (-a)
      -i[extension]   edit ARGV files in place (make backup if extension supplied)
      -Idirectory     specify $LOAD_PATH directory (may be used more than once)
      -Kkcode         specifies KANJI (Japanese) code-set
      -l              enable line ending processing
      -n              assume ‘while gets(); … end’ loop around your script
      -p              assume loop like -n but print line also like sed
      -rlibrary       require the library, before executing your script
      -s              enable some switch parsing for switches after script name
      -S              look for the script using PATH environment variable
      -T[level]       turn on tainting checks
      -v              print version number, then turn on verbose mode
      -w              turn warnings on for your script
      -W[level]       set warning level; 0=silence, 1=medium, 2=verbose (default)
      -x[directory]   strip off text before #!ruby line and perhaps cd to directory
      –copyright     print the copyright
      –version       print the version


となっています。
今回の場合、      “script/generate”[

がprogramfileで      “scaffold Member name:string discription:text birthday:datetime”
がargumentsになります。


というわけで、プログラムファイルの内容を見て見ましょう。
script/generateの中身はこんな内容になっています。      #!/usr/bin/env ruby
      require File.dirname(__FILE__) + ‘/../config/boot’
      require ‘commands/generate’


require は、ライブラリの呼び出しを行います。
ここで、      require File.dirname(__FILE__) + ‘/../config/boot’


は、プロジェクトのrailsの呼び出しを行っているRailsの基本的な所ですので、      require ‘commands/generate’


を見てみる事にします。
{Railsのインストール先}/lib/commands/generate.rb
を参照しましょう。      require “#{RAILS_ROOT}/config/environment”
      require ‘rails_generator’
      require ‘rails_generator/scripts/generate’

      ARGV.shift if [‘–help’, ‘-h’].include?(ARGV[0])
      Rails::Generator::Scripts::Generate.new.run(ARGV)


Railsのenvironment(環境の設定等)を呼び出し、rails_generatorとrails_generator/scripts/generateを呼び出して、
います。

ちょっと文章がソースばかりになるので、省略しますが、      require ‘rails_generator’


のrails_generator.rbにて、      require ‘rails_generator/base’
      require ‘rails_generator/lookup’
      require ‘rails_generator/commands’
      require ‘rails_generator/simple_logger’


など、generatorのファイルを呼び出しています。
そして、lookupによって下記のフォルダにあるファイルをgeneratorのコマンドに取り込んでいます。      #{::RAILS_ROOT}/lib/generators
      #{::RAILS_ROOT}/vendor/generators
      #{::RAILS_ROOT}/vendor/plugins/*/**/generators
      #{::RAILS_ROOT}/vendor/plugins/*/**/rails_generators
      #{Dir.user_home}/.rails/generators
      #{File.dirname(__FILE__)}/generators/components


そして実行段階。/lib/commands/generate.rbの中で実行されていたrunコマンドを見てみます。      Rails::Generator::Scripts::Generate.new.run(ARGV)


クラス名Rails::Generator::Scripts::Generateなのでrails_generator/scripts/generate.rbを見に行きます。
/lib/commands/generate.rbで3行目でrequireされてましたね。
見てみると      require File.dirname(__FILE__) + ‘/../scripts’

      module Rails::Generator::Scripts
        class Generate < Base
          mandatory_options :command => :create
        end
      end

というコードになっています。
run呼び出してるのにrunがない……。
Rails::Generator::Scriptsを拡張してるみたいです。
いったりきたりで大変ですね。

というわけでrails_generator/scripts.rbにいきます。        def run(args = [], runtime_options = {})
          begin
            parse!(args.dup, runtime_options)
          rescue OptionParser::InvalidOption => e
            # Don’t cry, script. Generators want what you think is invalid.
          end

          # Generator name is the only required option.
          unless options[:generator]
            usage if args.empty?
            options[:generator] ||= args.shift
          end

          # Look up generator instance and invoke command on it.
          Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
        rescue => e
          puts e
          puts ”  #{e.backtrace.join(“\n  “)}\n” if options[:backtrace]
          raise SystemExit
        end
長いのでrunのコードだけ採用しています。
Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
にてジェネレータを見つけ、lookupでロードしたgenaratorの manifestを呼び出しています。
ここに関するコマンドはlib/rails_generator/commands.rbなどに定義されているのでそこから掘っていってください。

というわけで、送った”scaffold Member name:string discription:text birthday:datetime”の最初のscaffoldの指定により、
scaffoldを呼び出します。

ということで、lookupの中のソースコード一覧の中で、scaffoldのソースコードが存在するのは
{railsのインストール先}/lib/rails_generator/generators/components/scaffold/
でしたので、scafolldはここから来ている事がわかりました。

今回、
Rails::Generator::Base.instance(options[:generator], args, options).command(options[:command]).invoke!
を検索している際、ヒットした
http://d.hatena.ne.jp/elm200/20070718/1184736852を途中から参考にさせていただきました。

というか、既にこちらのエントリがあったという事で、今回のエントリは二番煎じだったかな……と思いましたが、

とりあえず後悔公開CHUです。

aptanaのインストールと使い方について

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは、KBMJの中平@railsエンジニアです。

本日は、私がrailsの開発で使用している「aptana」について紹介いたします。

aptanaとはeclipseベースで作られたIDEの一つです。また、eclipseのプラグインとして、aptanaを使用することも可能になっています。
aptanaは複数の言語での開発が可能で、ruby on rails の開発はもちろんphpなどの開発も可能です。
また、web編集に優れており、CSSやjavascriptの作成もしやすいという特徴があります。

参考に
http://ja.wikipedia.org/wiki/Aptana

今回は、このaptanaインストール使い方日本語化などについて書きたいと思います。■Aptana Stadioをインストールする。

  1. aptanaを動かすには、javaが必要なので、jreもインストールしておく。
  2. 続いてAptana Stadioをダウンロードしておき、インストール。
  3. 起動してみて問題なければOKです。

このままでも使えますが、日本語化したい場合は
eclipseの日本語化プラグインを使います。(aptanaはeclipseをベースに作られているため使用可能)
Pleiadeをダウンロードします。
Pleiadesをインストール(read meを参考にしてください)後、aptanaを再起動し、日本語化されていれば成功です。

■radrailsのプラグインインストール
aptanaインストールしただけでは、まだrailsの開発はできませんので、
radrailsというrails開発用のプラグインをインストールします。

  1. aptanaのヘルプ→ソフトウェア更新→検索およびインストールを選択
  2. インストールする新規フィーチャーを選択し、radrailsにチェックをいれて、次へを押してインストールを行います。


■aptanaでrailsやmongrel_railsを使うための設定

aptanaのツールバーから「ウィンドウ→設定」画面が開いたら「railsの項目」を選択し、使用するrails、rake、mongrel_railsのパスを設定します。

その他の項目は個人の環境や好みで調整してください。ここでは省略します。

mongrelはあらかじめインストールが必要です。

■railsプロジェクトの作成方法

aptanaのツールバーから「ファイル→新規作成→railsプロジェクト」を選んで作成します。
コマンドの rails hogehoge と一緒です。

■aptanaの使い方

ここからは個人の好みもありますが、
WEBrick(mongrel)の起動や、rake、ジェネレートの実行など、aptana上での使い方を説明します。

まず、aptanaのツールバーの「ウィンドウ→ビューの表示」から サーバー、rake タスク、ジェネレーターをそれぞれ選択
すると、それぞれの操作用のウィンドウ枠が下のほうに表示されます。
・サーバー(webrick,mongrelの起動)

 サーバーのウィンドウで右クリックし、プロジェクトと、サーバーのタイプを選び作成します。
 サーバーを起動するときは、緑色の矢印ボタンを押せばOKです。


・rake

 特に設定無し、実行したいrake を選ぶか 入力ボックスにコマンドを直接書いて実行してもOKです。


・ジェネレーター

作成したいものを選択ボックスから選んで入力ボックスに名前を書いて実行。

ちなみに、作成したのも削除するのもここで出来ます。


・そのほかにも、gem installや自動テストもaptanaで行うことが可能です。
・DBのテーブルも見ることが出来ますが、重いので余りお勧めできません。

・他にも色々な使い方ができますが、紹介し切れませんので、また後日面白い機能があれば紹介したいと思います。

また、aptanaは総合開発環境になっていて、ruby(rails)のほかにもphpやAir、iphoneの開発もプラグインを入れることで可能です。

私の周りでは、vimを使って開発している人が多いのですが、eclipseなどのIDEが慣れているという人はaptanaをインストールしてみてはいかがでしょうか?

追記

aptanaでrailsをデバッグする方法はこちらです。

ローカルメールサーバーでRailsでのメール受信のテストを便利に

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 メールを受信して処理する機能がある場合、いちいちテストサーバーにコードをアップしてとか面倒くさくないですか?

 Rails限定ですが、今回は、メール受信の処理をローカルで実行できるようになる方法をご紹介します。

 ActionMailServer – テストとか

 ローカルでテストするためのメールサーバーはこちらを使用します。設定・起動方法は上記ページに書いてありますのでご参照下さい。

 自分がよくわからなかったのは、Outlook ExpressやThunderbirdなどからローカルのメールサーバーにメールを送るのはどうしたらよいかということでした。

 結局は、ローカル受信テスト用のアカウントを新たに作成して、そのアカウントの送信(SMTP)サーバーのサーバー名にlocalhost、ポート番号に起動時に設定したもの(上記サイトだと10025)にすればいいだけでした。

 ユーザー名とパスワードの設定の部分は、指定しないにします。

Thunderbirdで送信サーバーを設定する場合

 ※Thunderbirdでは、アカウントの設定と送信サーバーの設定が別の項目として分かれているので注意が必要です。

 あとは、この作成したアカウントでメール作成を行い、送信すればオッケーです。上記サイトの例だと宛先を@example.comで終わるアドレスにしないと受信されません。どんなアドレスでも受信してほしい場合は、server.filter_rcpt の部分をコメントしておけばいいと思います。

Let’s enjoy testing!

railroadを用いたER図作成

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

KBMJでRuby on Rails を使ったweb開発に携わっているワイYといいます。

今回は、railroadを用いてRailsアプリのER図を作成してみたいと思います。

実行環境

OS Windows XP

Rails-1.2.5

postgres-8.2.5

graphviz-2.16.1 (railroadで出力したファイルを表示、変換するのに使用します)

etc

実行手順

gemを使ってrailroadをインストールします。gem install railroad

・ER図を生成したいrailsアプリのルートに移動します。

・下記のコマンドを実行すると、モデルのER図(models.dot)が作成されます。railroad -o models.dot -M
補足:-MとするとモデルのER図が生成され、-Cに変更するとコントローラーのER図が生成できます。-oで出力先を指定する事もできます。

・出力された.dotファイルはGraphvizを使う事で、表示させたり、jpgやpngなどに変換する事ができます。

・実際にできた画像は下図のようになります。

railroad

RailsでAmazon APIを利用する

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。
KBMJのプログラマのx5rです。

今回はRailsからAmazonAPIを利用してみようと思います。

環境

Railsの環境が既に構築されているものとします。
ちなみに私の環境は

Mac : IntelMac
OS : Mac OS X 10.5.1 Leopard$ script/about
About your application’s environment
Ruby version              1.8.6 (i686-darwin8.10.3)
RubyGems version          1.0.1
Rails version             2.0.2
Active Record version     2.0.2
Action Pack version       2.0.2
Active Resource version   2.0.2
Action Mailer version     2.0.2
Active Support version    2.0.2
Application root          /Users/username/dev/doruby
Environment               development
Database adapter          mysql

となっています。

それではAmazonAPIを使ってみます。

Amazon Web Serviceアカウントの取得

Amazon Web Serviceを利用するためには、ショッピング用とは別のアカウントが必要になりますので、持っていない場合はAmazon Web Serviceから取得します。

Amazon::Ecsをインストール

Amazon Web Serviceを利用するためのgemsライブラリ

Amazon::Ecs

をインストールします。$sudo gem install amazon-ecs

Railsプロジェクトを作成

$rails amazon
$cd amazon

API keyの設定

config/environment.rbで上記でインストールしたAmazon::Ecsを読み込み、そして上記で取得したAmazon Web Serviceを利用するためのAPI keyを設定します。

・・・
#一番下に記述
require ‘amazon/ecs’
Amazon::Ecs.debug = true
Amazon::Ecs.options = {
  :aWS_access_key_id => “XXXXXXXXXXXXXXXXXXXX”,
  :associate_tag => “xxxxxx-22”,
  :country => :jp
}

Modelの作成


Amazon Web Serviceから取得したデータを設定するモデルを作成します。

ここでは特にDBにはアクセスしないので、ActiveRecordを継承しないモデルを作成します。$ less app/models/item.rb
class Item
  attr_accessor :asin, :title, :image, :url
  def initialize(asin, title = nil, url = nil, image = nil)
    @asin = asin
    @title = title
    @url = url
    @image = image
  end
end

Controllerの作成

Amazon Web Serviceにアクセスするコントローラーを作成します。

今回はAmazonの音楽カテゴリから検索するようにします。
$script/generate controller amazon
$ less app/controllers/amazon_controller.rb
class AmazonController < ApplicationController
  def index
    if request.get?
    else
      @keyword = params[:keyword]
      res = Amazon::Ecs.item_search(@keyword, {
        :search_index => ‘Music’,
        :response_group => ‘Medium’,
        :sort => ‘salesrank’
      })
      @items = []
      res.items.each do |item|
        @items << Item.new(
          item.get(‘asin’),
          item.get(‘itemattributes/title’),
          item.get(‘detailpageurl’),
          item.get_hash(‘smallimage’)
        )
      end
    end
  end
end

Viewの作成

  • layoutを作成

$ less app/views/layouts/application.rhtml
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml” lang=”ja” xml:lang=”ja”>
<head>
<meta http-equiv=”Content-Language” content=”ja” />
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<meta http-equiv=”Content-Style-Type” content=”text/css” />
<meta http-equiv=”Content-Script-Type” content=”text/javascript” />
<meta http-equiv=”imagetoolbar” content=”no” />
<title>Amazon Web Service</title>
<%#= stylesheet_link_tag “screen”, :media => “all” %>
</head>
<body>
  <%= @content_for_layout %>
</body>
</html>

  • 検索/結果ページを作成

$ less app/views/amazon/index.rhtml
<p>Amazonからデータを取得</p>
<%- form_tag :controller => ‘amazon’, :action => ‘index’ do -%>
  <%= text_field_tag “keyword”, @keyword %><%= submit_tag “アマゾンで検索” %>
<%- end -%>

<%- if @items && @items.size > 0 -%>
<p>検索結果</p>
<table>
  <%- @items.each do |item| -%>
  <tr>
    <td><%= link_to(image_tag(item.image[:url], :size => “#{item.image[:width]}x#{item.image[:height]}”, :alt => item.title), item.url, :target => ‘_blank’) %></td>
    <td><%= item.asin %></td>
    <td><%= item.title %></td>
  </tr>
  <%- end -%>
</table>
<%- end -%> 

Webrickを起動 

$ script/server  

http://localhost:3000/amazonにアクセスすると検索ボックスが表示されますので、検索したいアーティス名を入力し、「アマゾンで検索」ボタンを押下すれば、Amazonから検索された商品が表示されます。

amazon_ecs

RubyGems って単語よく出てきますよね?

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんばんは

KBMJ@O2です。

Ruby でシステム開発する場合、よくRubyGemsという言葉が

出てきますが、今回は、RubyGemsとはなにかを、ちょっぴり用語集に

追加しようと思います。

 RubyGems とは?

Ruby のライブラリパッケージ管理システムです。

これを用いることにより、さまざまな Ruby 用ライブラリを簡単にインストール

することができるようになります。

また、すでにインストールされているライブラリのバージョンアップも行うことが

できます。

実際に使い方は、Do Ruby(ドゥールビー)内で、紹介していますので参考

にしてみるて下さい。…

Ruby on Rails ってなになに?

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

おはようございます。

KBMJ@O2です。

第一弾は、「Rubyとは」を書いてみましたが、実際のシステム開発ではフレームワークを使ってシステム開発を行うのですが、そのフレームワークが・・・

Ruby on Railsとは

第一弾で説明したRubyを使ったWebアプリケーション開発用フレームワークです。


Ruby On Rails は、短時間で高機能なWebアプリケーションを構築することができます。
Ruby自体の特徴であるシンプルな文法なので、書きやすくて、比較的簡単に作成できデータベースの設定も含めた、サービスを実際に動作させるまでの手続き、設定がスムーズに素早く、簡単にできることが最大の特長です。

また、MVCアーキテクチャに基づいて構築されているので、開発しやすくなっています。

ちょー入門、Webサーバ構築で知ってて損をしない用語(1)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。

KBMJ@O2です。

今回は、Webシステムを作成するにあたり、Linuxで構築する場合の

サーバ周りの用語を紹介してみます。  

SSH とは

 暗号や認証の技術を利用して、安全にリモートコンピュータと通信する

ためのプログラムです。

 これがあることにより、Webサーバの場所に行き直接操作する必要が

なくなるので便利です。 

Xen とは

  Xen(ゼン)とはコンピュータの仮想化技術を実現するオープンソース

ソフトウェアのことです。

 これがあれば、1台のサーバ上に複数のOSを入れて動かせるので

複数のプロジェクトで複数のテスト環境を構築する時などは役に立ちます。  

Apache とは

 世界中でもっとも多く使われているWebサーバソフトウェアです。

HTTP(ハイパーテキストトランスファープロトコル)を、クライアントに出力

するためのHTTPDのデーモン(*)の一種です。

*:UNIXOSにおいて、メモリに常駐して様々なサービスを提供する

ソフトウェアの事です。

gemコマンドの紹介

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

皆さんはじめまして。

RubyGems の紹介をします。

一般的に Ruby 用ライブラリは RubyGems を採用していて、サイトで検索しても

RubyGems によるインストール方法しか掲載されていないケースが多くあります。

今回は、日常的なパッケージ管理の方法を中心に、基本的な使い方をご紹介します。
なお、RubyGems でパッケージを利用する際の使い方で、パッケージ作成などは
続編?でご紹介できればと思っておりますので、ご了承くださいませ。。。

RubyGemsのインストール
http://rubyforge.org/frs/?group_id=126

下記URLからRuby(ruby185-24.exe)をインストールをすることでRubyGemsも含まれています。
http://rubyforge.org/frs/?group_id=167 からWindows 用インストーラでインストール
※全てデフォルト設定でインストールしました。

インストールが完了したら、コマンドプロンプトを起動して、
下記のコマンド類を実際に試してみましょう。

◆バージョン確認# gem env
 RubyGems Environment:
   – VERSION: 0.9.2 (0.9.2)
   – INSTALLATION DIRECTORY: c:/ruby/lib/ruby/gems/1.8
   – GEM PATH:
      – c:/ruby/lib/ruby/gems/1.8
   – REMOTE SOURCES:
      – http://gems.rubyforge.org/

 # gem -v
 0.9.2

◆パッケージのインストール# gem install パッケージ名

c:/ruby/lib/ruby/gems/1.8/gems 配下にパッケージのフォルダが配置されます。


◆パッケージのバージョン検索# gem search -r パッケージ名

◆パッケージのアップデート# gem update パッケージ名

◆パッケージのインストールリスト# gem list パッケージ名

◆パッケージの消去(最新バージョンは残る)# gem cleanup パッケージ名

◆パッケージのアンインストール# gem uninstall パッケージ名

◆コマンドのヘルプ# gem help コマンド名

以上、最後までお付き合い頂きありがとうございした。

コマンドは他にもたくさんあるので、実際に自分の環境を使用して是非試してみてください。

HTMLエスケープ

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんばんは。

kbmjのプログラマーのmimiです。

rubyのプログラムを書く上での基本的な注意をすべき点を書いてみたいと思います。

 今回は、hメソッド「<%=h … %>」についてです。

rubyのプログラムを読み始めた当初に見た時に、何か分からず「h」では検索しづらかったことを思い出しまして、まずはこれについて触れようと思います。

 hメソッド「<%=h … %>」とは、

<%= … %>を使って画面表示を行う際に利用する、HTMLエスケープのことです。

特に、どのような値が表示されるのかが分からない場合には必ず利用してください。

下記のとおりにエスケープ処理をします。

「 & 」    ⇒ &amp;


「 ” 」   ⇒ &quot;


「 < 」     ⇒ &lt;


「 > 」    ⇒ &gt;

hは、「html_escape 」と略さず書いてもOKですが、

面倒ですよね。

次回も、初歩的な注意点などについて

触れていきたいと思います。

RadiantCMSのインストール(1)

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして。
KBMJでSIを担当している花吹雪です。

RadiantCMSは、Ruby on Railsをベースにして開発されたCMSアプリケーションです。
え?CMSって何かって?ハハハ。実は僕にもよくわかっていないんだ。
じゃあ、まずはそこから説明してみようか。

難しく言うと、コンテンツマネージメントシステム(CMS:Content Management System)の略。
簡単に言うと、ページのデザインとかコンテンツの管理を、ソフトウェア
自動的に行えるようにしたものです。 いわゆる「ブログ」がまさにそうだよね。
あと「Wiki」というのも聞いたことがあるかな。
ああいった、特にデザインやデータベースの知識がなくても、ブラウザ上から簡単に
レイアウトやデータの蓄積ができるものを言うんだね。

で、このCMSを、Ruby on Railsベースで開発したものがRadiantCMSってわけ。
とりあえずインストールしてみて、あとは使ってから考えてみようか。

開発環境

OS:CentOS5
Rubyバージョン:1.8.6
RubyGemsバージョン:0.9.4

今回は上記の環境で作業を行いました。Ruby等のインストール方法は
ここでは触れません。他の誰かが書いてくれてると信じたい。

インストール

インストールRuby Gems を使います。これは簡単だね。$ gem install radiant

新しいプロジェクトの作成

インストールが出来たら新しいプロジェクトを作成します。$ radiant –database [database adapter] [path]

[database adapter] には、「mysql」「postgres」「sqlite3」のいずれかを設定します。
自分の環境で使うデータベースに合わせてね。
[path] には、プロジェクトを作成する場所のパスを指定します。

例えば、使用するデータベースMySQLで、「/home/radiant_project」以下に
新しいRadiantプロジェクトを作る場合はこんな感じ。$ radiant –database mysql /home/radiant_project

データベースの設定

新しいプロジェクトを作成したら、今度はデータベースの設定を行います。
以下の設定ファイルに、自分の環境に合わせて設定を行ってください。$ vi /home/radiant_project/config/database.yml


development:
   adapter: mysql
   database: radiant_project
   username: root
   password:rootpass
   host: localhost
   encoding: utf8


test:
   adapter: mysql
   database: radiant_project_test
   username: testname
   password: testpass
   host: localhost
   encoding: utf8


production:
   adapter: mysql
   database: radiant_project
   username: root
   password: rootpass
   host: localhost
   encoding: utf8

ん?なんで同じような設定が3箇所もあるの?と思った方。
いや、おっしゃる通りです。

ここからは受け売りなんだけど、どうもRailsアプリケーションには「environments」と
呼ばれる概念があるらしく、「testing」「development」「production」の3つの設定に
分かれてるんだって。
で、「test」環境は、unitテストやfunctionalテストの際に利用。
「development」環境は、Radiant開発者が利用。
「production」環境は、通常のRadiantの利用に最適化されている環境だそうです。
だから、設定ファイルもそれらの環境ごとに分かれてるとの事。


あと、わかってるとは思うけど、上で設定しているデータベースとかユーザとかは、
あらかじめ用意しておいてね。

今回はここまで

あとはデータベースを初期化して、Radiantを実行すれば終わりなんだけど、
結構長くなっちゃったので続きは次回に。
それに、どうせなら日本語化してみたいとか思わない?
それも含めて、次回、詳しく説明します。
お楽しみに!

RubyでActiveRecordを使わないでDBに接続する方法

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして。

KBMJでエンジニアをしているTrinityTです。

さて、通常RubyOnRails環境でDBアクセスする場合、ActiveRecordを使用します。Rails開発ではもちろん僕も恩恵にあやかっていたのですが、バッチ処理の実装中、Ruby単体でDBアクセスしたほうが良いのでは?というケースがでてきました。

そこでコレを機会にActiveRecordを使わないでアクセスする方法を調べてみました。

ここではMySQLPostgreSQLで試してみることにします。

検証した環境

OS:WindowXP SP2

Ruby:1.8.6(インストール済)

RubyGems:0.9.5(インストール済)

MySQL編

(1)DBコネクタインストール

手っ取り早くRubyGemを使ってインストールします。

C:\>$gems install mysql

(2)ソース上で「require ‘mysql’」を記述してモジュール読み込み

 $KCODE=”UTF8″
 require ‘mysql’

 # 接続

 my = Mysql::new(“localhost”,”hoge”,”hoge”,”hoge”)
 # 文字セットをUTF-8に設定

 my.query(“set character set utf8”)

 res1 = my.query(“select * from huga”)
 my.close

※API説明

Mysql::new(“host”, “user”, “passwd”, “db”)

host:ホスト名

user:ユーザ

passwd:パスワード

db:DB名

PostgresSQL編

(1)DBコネクタインストール

C:\>$gems install postgres

(2)ソース上で「require ‘postgres’」を記述してモジュール読み込み

 $KCODE=”UTF8″
 require ‘postgres’

 # インスタンス生成

 pos = PGconn.connect(“localhost”, 5432, “”, “”, “hoge”,”hoge”,”hoge”)
 res1 = pos.exec(“select * from huga”)
 pos.close

※API説明

PGconn.connect(pghost, pgport, pgoptions, pgtty, dbname, login, passwd)
pghost : サーバのホスト名(文字列)
pgport : サーバがlistenしているポート番号(整数)
pgoptions : backendを起動する際のオプション(文字列)
pgtty : backendがデバッグメッセージを表示するtty(文字列)
dbname : 接続するデータベース名(文字列)
login : ユーザ名(文字列)
passwd : パスワード(文字列)

どちらのDBにも思いのほか簡単にアクセスできました。

WebアプリをRailsで作る分にはほぼ使う機会は無いと思いますが、機会があれば活用してみてください。

Railsのキャッシュ機能を用いて動的ページを静的ページにする方法を紹介

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

TOPページにランダムに表示させたいコンテンツがある場合、アクセス毎にページの一部が変わるような場合は動的にページを作成することになりますが、

そんなに目まぐるしく変わらなくても良い、例えば10分に1回の頻度で内容が変わるくらいで十分で、それ以上に一番アクセスが多い(であろう)TOPページの負荷を軽減したい…そんな時に使うのが、今回紹介するページキャッシュ機能と定期的にファイルを削除するバッチプログラムを組み合わせた
静的ページ書き出し機能です。
 

ページキャッシュ機能
例えばTOPページを表示するコントローラがmainでアクションがindexの場合、

(RAILS_ROOT)/config/routes.rb内に

 map.connect ‘/’, :controller => “main”, :action=> “index”
 map.connect ‘/index.html’, :controller => “main”, :action=> “index”

と記述することで

http://(ドメイン名)/

へアクセスした際に http://(ドメイン名)/main/ のコンテンツを表示するようになります。
その際TOPページを表示しているコントローラー((RAILS_ROOT)/main_controller.rb)の中身は

class MainController < ApplicationController

  def index
    (ここにTOPページ内で実行するプログラムを書きます)
  end
 
end

こんな感じになります。

このままですと、アクセス毎にHTMLが作成・表示しているのですが、
ここに1行、以下のコードを追加します。

caches_page :index

class MainController < ApplicationController

  caches_page :index

  def index
    (ここにTOPページ内で実行するプログラムを書きます)
  end
 
end

これにより、同コントローラ内の指定したアクション(この場合indexです)にアクセスした際に
その時作成したHTMLをサーバー内に保存し、それ以降のアクセスに対しては保存したHTMLを表示するようになります。
HTMLファイルの保存場所はpublic配下に
public/コントローラ名/アクション名.html
アクションがindexの場合は


public/コントローラ名.html


という名前で保存されます。
今回はコントローラ名がmain、アクション名がindexですので


public/main.html


になります。

これにより、初回アクセス時にHTMLファイルを生成・表示・保存を行い、2回目以降は作成したファイルを表示するようになりました。
ですが、このままではせっかく動的に作成したコンテンツが何度アクセスしても見た目が変わらなくなってしまいます。
ですので、このページキャッシュ機能を定期的に削除するバッチ処理を設定します。


ファイル削除バッチ
上のページキャッシュはRuby on Railsの機能ですが、こちらはlinuxの機能を使います。
crontabを編集して自動でファイルを削除するコマンドを登録します。
crontab -e #crontabを編集
編集画面にて以下のコードを追加

0-59/10 * * * * rm /(RAILS_ROOT)/public/main.html

Railsのプログラムを/opt/rails/test/に作成している場合は0-59/10 * * * * rm /opt/rails/test/public/main.html
になります。

これで、毎時10分にキャッシュを削除してくれます。


この2つを組み合わせることで、10分毎に中身が変わるコンテンツの出来上がりです。
主な作業はcaches_page の追加と crontab の登録の2点です。
とてもカンタンに出来ますので、是非お試しください。


GOOD RAILS!!

RMagickの使い方

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして、kbmjでruby on railsの開発をしている中平です。

今回私は、RMagickというrubyで画像処理を行うライブラリの使い方を説明いたします。


まず、RMagickについて。

RMagickとはその名のとおり、ImageMagickをrubyで扱えるようにしたものです。

 ですのでRMagickを使う場合は、

ruby本体,ImageMagick,RMagickの3つが必要です。

 

今回はインストール方法は省きまして、インストール後の使い方とか機能について紹介します。

 ImageMagickでできることはたいていRMagickでも出来ますので、rubyだと簡単にできることを知っていただければと・・・・

 
■rmagickの使い方

説明するよりも実際に試したほうがわかりやすいと思いますので、
rubyとrmagickを使って画像処理をするサンプルコードを記載します。

これを適当に保存して、画像を一枚用意していただき、実行すると

画像処理され保存されていきますので、試してみてください。 

サンプルだと、画像名はhogehoge.jpgを使っています。 

————————————-

require “RMagick” #RMagickを使えるように
#hogehoge.jpg画像を別名で保存
img = Magick::ImageList.new(“hogehoge.jpg”)
img.write(“orig.jpg”)

#画像を反転し保存
img = Magick::ImageList.new(“orig.jpg”)
img_flop= img.flop #左右反転
img_flip= img.flip #上下反転
img_flop.write(“flop.jpg”)
img_flip.write(“flip.jpg”)

#2枚の画像をくっつける
#同じサイズの画像じゃないとおかしなことに・・・・
img_append = Magick::ImageList.new(“orig.jpg”,”flop.jpg”)
img_append = img_append.append(false) #trueだと上下、falseだと左右にくっつける
img_append.write(“append.jpg”)

#画像に文字を挿入
img_string = Magick::ImageList.new(“orig.jpg”)

md = Magick::Draw.new

md.annotate(img_string, 0, 0, 0, 0, “hogehoge”) do

 md.gravity = Magick::NorthGravity #表示位置
#NorthWestGravity ( 左上 )
#NorthGravity ( 上 )
#NorthEastGravity ( 右上 )
#WestGravity ( 左 )
#CenterGravity ( 真中 )
#EastGravity ( 右 )
#SouthWestGravity ( 左下 )
#SouthGravity ( 下 )
#SouthEastGravity ( 右下 )

 md.pointsize = 30 #フォントサイズ

 md.fill = “blue” #文字色

 md.stroke = “yellow” #文字の縁取り色

end

img_string.write(“string.jpg”)

#波紋
img = Magick::ImageList.new(“orig.jpg”)
img_string=img_string.wave(amplitude=10.0, wavelength=100.0)
img_string.write(“wave.jpg”)

#画像をぼかす
img = Magick::ImageList.new(“orig.jpg”)

motion_blur=img.blur_image(radius=10.0, sigma=10.0)

motion_blur.write(“blur.jpg”)

#画像の回転
img = Magick::ImageList.new(“orig.jpg”)

#右に90度回転
rotate=img.rotate(90)
#左回りの場合は-90
#rotate=img.rotate(-90)
rotate.write(“rotate.jpg”)

#画像をねじる?
img = Magick::ImageList.new(“orig.jpg”)
swirl=img.swirl(360)
swirl.write(‘swirl.jpg’)


#画像をねじる(gif動画)
img = Magick::ImageList.new(“orig.jpg”)

animation = Magick::ImageList.new
animation << img.first.copy
30.step(360,45) { |degrees| animation << img.swirl(degrees) }

animation.delay = 20
animation.iterations = 10000

animation.write(‘swirl.gif’)

——


他にもいろいろ画像処理機能があり、紹介しきれないのですが、また

面白い画像処理機能があったら紹介しようと思います。

DRBDのインストール

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちはtacchiです。

DRBD

DRBDとはDistributed Replicated Block Deviceの略で、本家WEBサイトは http://www.drbd.org/です。

ブロックデバイス全体をネットワーク経由でミラーリングしています。
要は、昔はrsyncとcronを利用してミラーリングしていたものを、DRBDでできちゃうよということです。

Ruby案件で必要だったのでDRBDとHeartBeatを利用させてもらいました。
なかなか苦戦しましたが、先駆者がのこしてくれているありがたい情報を元に設定を行っていきました。
参考にさせていただいたのは、以下のサイトです。

Webサーバが2台あり、テストサーバから本番サーバへのデプロイを同時に反映させること、差異のないアプリケーションを稼働させるという意図から、DRBDを利用。
テストサーバとWebサーバをDRBDで結ぶという案もありましたが、実際に稼働しているアプリケーションを容易に変更できないようにという意図から、テストサーバとWebサーバ間はrsyncで結び、デプロイシェルを作成し、それを叩けば本番に反映できるようにしました。
(やり方は、沢山考えられますが、今回はこれで行きました。)


じゃぁ実際の設定を以下に示します。


■まず、DRBDのインストールから(Web01とWeb02にインストール)wget http://oss.linbit.com/drbd/8.0/drbd-8.0.5.tar.gz
tar zxvf drbd-8.0.5.tar.gz
cd drbd-8.0.5
make rpm
cd dist/RPMS/x86_64
rpm -ivh drbd-8.0.5-3.x86_64.rpm drbd-km-2.6.18_8.1.8.el5-8.0.5-3.x86_64.rpm
drbd-debuginfo-8.0.5-3.x86_64.rpm


■設定ファイルをいじりましょう。(/etc/drbd.conf)
※もちろんWeb01とWeb02に設定resource r0 {

protocol C;

startup {
degr-wfc-timeout 120; # 2 minutes.
}

disk {
on-io-error detach;
}

syncer {
rate 100M;
}

on hogeweb01 {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.2.79:7789;
flexible-meta-disk internal;
}

on hogeweb02 {
device /dev/drbd0;
disk /dev/sda3;
address 192.168.2.222:7789;
meta-disk internal;
}


■iptablesを利用しているならiptablesの設定も必要!
tcpの7789ポートを利用しますので、アクセス許可を行います。
※もちろんWeb01とWeb02に設定/sbin/iptables -I INPUT -p tcp -m tcp –dport 7789 –syn -j ACCEPT
/etc/rc.d/init.d/iptables save
service iptables restart


■サービスの起動をしてみましょう 
※Web01とWeb02で起動。service drbd start


■使ってみましょう
 Web01 以下を実行cat /proc/drbd
上記コマンドをたたくと以下が表示される。今は両方セカンダリですよーって表示。
cs:Connected st:Secondary/Secondary


■じゃぁWeb01をプライマリに変更しましょう。(Web01で実行)drbdsetup /dev/drbd0 primary
cat /proc/drbd
以下の表示に変わったはず。
cs:Connected st:Primary/Secondary


■じゃぁマウントしてみましょう。(Web01で実行)mount /dev/drbd0 /mnt/drbd0


■ファイルを作っておいてみる(Web01で実行)touch /mnt/drbd0/test


■マウント解除して、Web02の方でmountできるようにsecondaryにする。(Web02で実行)umount /dev/drbd0
drbdsetup /dev/drbd0 secondarydrbdsetup /dev/drbd0 primary
(primaryにする。)
mount /dev/drbd0 /mnt/drbd0
ls /mnt/drbd0


こちらにもtestができてればOK

これで設定完了です。

Scaffoldはどこからくるの? 前編

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

こんにちは。
KBMJのエンジニアの高瀬です。

今回、ruby on railsに関する技術コラムを書くと言う事で、
scaffoldでプログラムを作ってみて、またそのプログラムは

どの様にして作られているか解説します。

Scaffoldってそもそも何?
最近のアプリケーション(特にWeb)は、アプリケーションのデータを

DB上で管理する事が多くなっていますが、

そういったDB上のテーブルを操作するプログラムを作りたい場合に、

基本的なテンプレートを提供してくれるのがscaffoldです。

scaffoldを使うと、簡単なアプリケーションがそれこそ10分で

出来上がるので、かなり重宝します。

 実際にScaffoldで作ってみる。
まず、Scaffoldを使ってアプリケーションを作ってみます。

最初に、railsでscaffold_testプロジェクトを作ってみましょう。

コマンドプロンプト上で、

rails scaffold_test
と入力してみてください。(>は入力しなくて良いです。)

大量に[ create ~~]と出てきたと思います。

今後は、このプロジェクト上で作業を行うので、

cd scaffold_test


で、カレントディレクトリを移動しておいてください。

 

次に、scaffold_testプロジェクト内でscaffoldを作ってみます。

扱うテーブルを決める必要がありますので、とりあえずメンバー管理として、

Memberモデルをつくり、名前(name)と説明(discription)と誕生日(birthday)だけ管理しましょう。

 ruby script/generate scaffold Member name:string discription:text birthday:datetime

これで、scaffoldの土台は出来ました。

ですが、肝心のdbがないので、 DBを作成します。

rails 2.0から、db:createが出来たので、そのコマンドを使います。rake db:create

(ここでは、DBの作成方法のエラーが出た場合や、1.x系の話は割愛します)

DBが出来たら、scaffoldで作成されたmigrationファイルからテーブルを作成します。

rake db:migrate

これでテーブルが出来たのでサーバーを立ち上げて、

プログラムにアクセスしてみましょう。

ruby script/server

を実行し、 下記のURLにアクセスしてください。

http://localhost:3000/members

「Listing members」と表示されるページにアクセスできると思います。

これで、New memberと表示されているリンクをクリックすると

メンバーが登録できます。

これだけで簡単なメンバー管理システムの出来上がりです。

scaffoldのソースを見てみる。


途中で実行した

ruby script/generate scaffold Member name:string discription:text birthday:datetime

で、管理する項目や、項目の属性を指定しているのですが、

今のプロジェクトのソースを見てみましょう。

scaffold_test フォルダの下にある、

app/controllers/members_controller.rbを何かのテキストエディタで

開いてみてください。

自分が書いた覚えのないプログラムが存在していると思います。

実は、ruby script/generateコマンドを実行した時、

      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/members
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      create  app/views/members/index.html.erb
      create  app/views/members/show.html.erb
      create  app/views/members/new.html.erb
      create  app/views/members/edit.html.erb
      create  app/views/layouts/members.html.erb
      create  public/stylesheets/scaffold.css
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/member.rb
      create    test/unit/member_test.rb
      create    test/fixtures/members.yml
      create    db/migrate
      create    db/migrate/001_create_members.rb
      create  app/controllers/members_controller.rb
      create  test/functional/members_controller_test.rb
      create  app/helpers/members_helper.rb
       route  map.resources :members
 と、大量にメッセージが出たと思いますが、ここで、createと出ている行は、railsが自動で

ソースコードを作ってくれています。      create  app/views/members
      create  app/views/members/index.html.erb
      create  app/views/members/show.html.erb
      create  app/views/members/new.html.erb
      create  app/views/members/edit.html.erb
      create  app/views/layouts/members.html.erb
      create  public/stylesheets/scaffold.css
      create    app/models/member.rb
      create    test/unit/member_test.rb
      create    test/fixtures/members.yml
      create    db/migrate
      create    db/migrate/001_create_members.rb
      create  app/controllers/members_controller.rb
      create  test/functional/members_controller_test.rb
      create  app/helpers/members_helper.rb

 というわけで、次回はこのコードがどの様にして作られているか、解説して行きたいと思います。

Ruby on Rails インストール for Windows

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

はじめまして、KBMJのmimiです。

まずは初回ということで、 Windowsで行うRuby on Railsのインストール手順を書いてみたいと思います。



◆環境

OS:WindowsXP 2002

◆Rubyインストール

「One-Click Installer – Window」が簡単です。

http://rubyforge.org/frs/?group_id=167

    Railsインストール時に必要なRubyGemsも同時にインストールできます。
    最新のもの(Final Release)をインストールしてください。


◆Railsインストール

「スタート」⇒「プログラム」⇒「Ruby」⇒「RubyGems」⇒「RubyGems Package Manager」を起動
  →コマンドプロンプトが開くので、下記を入力します。

   c:\ruby>gem install rails

◆データベースのインストール

PostgreSQLの場合

http://www.postgresql.jp/PostgreSQL

からダウンロード後に、下記を入力します。
    c:\ruby>gem install postgres-pr

MySQLの場合

http://dev.mysql.com/downloads/

からダウンロード後に、下記を入力します。
    c:\ruby>gem install mysql

◆Rails動作確認テスト
・project/testディレクトリの中に、実行可能なアプリケーションを作成 します。


   c:\project>rails test
・Webサーバを立ち上げます。
    c:\project>ruby test\script\server

・ブラウザで確認
    http://localhost:3000
    「Welcome aboard」というタイトルの画面が表示されれば成功です。

Rubyでどう書く?特別編:Matzからのお題

0

この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。

Rubyでどう書く?特別編:Matzからのお題 高倉利明(KBMJ)

まつもとゆきひろ氏と食事をした時に頂いたお題にKBMJの高倉利明氏が答える。テーマは「Rubyでメモリカード上の写真を指定フォルダに振り分ける」だ。

問題

第6回のテーマは「Rubyでメモリカード上の写真を指定フォルダに振り分ける」です。

デジカメで撮りためたデータをPCにバックアップする際、大量の撮影データの振り分けが面倒です。

そこで今回はRubyスクリプトを使用してファイルを自動的に振り分けてみることにしました。

仕様

格納元フォルダ以下から画像データを抽出し、格納先フォルダに日付「yymmdd」ごとに振り分ける画像データかどうかは拡張子「jpg, JPG, jpeg, JPEG」で判定日付はEXIFの「MetadataDate」の日付を利用

回答例

require ‘parsedate’
require ‘fileutils’
require ‘find’
require ‘rubygems’
require ‘extexif’

# フォルダ指定
src = “/mnt/card/DCIM/100NECDT/”
dst = “/var/image/”

# ファイルリスト作成
list = []
Find.find(File.expand_path(src)) { |path|
  if /.*(jpg|JPG|jpeg|JPG)\z/ =~ path
    list << path
  end
}

# 振り分け
list.sort.each { |path|
  image = ExtExif.new(path)
  foldername = image[“MetadataDate”][0,10].split(/:/).join
  folderpath = dst + foldername
  Dir.mkdir(folderpath) unless File.exist?(folderpath)
  FileUtils.cp(path, folderpath)
}

解説

本処理は以下の流れで行っています。

  1. 対象フォルダ内から再帰的にファイルを検索してパスのリストを作成
  2. 各ファイルのEXIFデータから日付取得
  3. 日付のフォルダを作成
  4. 日付フォルダにファイルコピー

 今回はEXIFフォーマット取得のためにExtEXIFライブラリを使用しました。

最後に

今回は簡略化のため以下の処理を省いてあります。

  • 画像ファイルのバイナリファイル形式確認
  • EXIFから取り出した日付フォーマット確認

 実用に利するためには、このような点に注意すると良いと思います。

 なお、今回のお題はbuilder編集部の昼食会で、Matzにお会いしたときにもらったお題です。ご協力ありがとうございました!

最近人気な記事