ホーム ブログ ページ 68

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にお会いしたときにもらったお題です。ご協力ありがとうございました!

最近人気な記事