ホーム ブログ ページ 65

Railsのlayoutファイルについて

0

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

どうも。

新人のバッチです。

本日はRailsのlayoutファイルについて簡単に説明します。

RailsでlayoutとはHTMLでいうフレームみたいなもので、

同じデザインをいくつものファイルで共有する際に用います。

layoutファイルはviewフォルダ内のlayoutsフォルダに置きます。

使用するにはcontrollerの最初に、使用するlayoutファイルを記述します。

 layout ‘hoge’

また、一つのファイルのみに適用する場合は、

 layout ‘hoge’ :only => :アクション名

適用しないファイルを定める場合は、

 layout ‘hoge’ :except => :アクション名

で設定できます。

設定ができたらlayoutファイル内の、

 <%= yield %>

と書かれている部分に各アクションの内容が挿入されます。

linux locateコマンドについて

0

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

今日はlocateコマンドについて

簡単に説明します。 

ファイルを検索したいけど findじゃ時間がかかるし、

重たいって時に locateコマンドが役に立ちます。

locateコマンドでは

ファイル名やディレクトリ名から、

あらかじめ作成してあるデータベースから パスを高速検索することができます。

$ locate ファイル名(ディレクトリ名等)

で一瞬でパスが検索できます。

しかし、もしファイルを検索して

warning: locate: warning: database /var/lib/slocate/slocate.db’ is more than 8 days old

等とwarningがでてしまったら、

それはDBの更新が8日以上してないってことなのです。

その場合、DBの更新が必要です。

DBの更新のコマンドは

$updatedb

で対応できます。

たくさんファイルとかディレクトリとかじゃんじゃん探しちゃってください。

Rubyの例外処理

0

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

どーもメガネです。7回目です。今回はRubyの例外処理について説明します。
例外とはプログラムの実行中にエラーが発生すると例外が発生します。例外が発生するとプログラムの実行は中断し例外を探します。
要するに、何か問題が発生した場合に“エラー”ではなく、“エラーみたいですよ”と報告し、その報告を受け取って何かしらの処置をするのが「例外処理」です。で、ここでいう“報告”が「例外」で、“報告する行為”を“「例外」を投げる”といいます。

簡単に書くと

1,例外処理を使わない処理  
if a() == false  
    エラー処理        
end               
if b() == false   
    エラー処理
end
if c() == false
    エラー処理
end

2,例外処理を使った処理
begin
    a()
    b()
    c()
rescue
    エラー処理
end

これで例外処理が便利だということが分かったと思います。

ではさっそく書き方を説明します。

begin
    例外が起こる可能性のある処理
rescue
    例外が起こった場合の処理
end

またrescueのあとに変数名を指定することで例外オブジェクトを得ることができます。

begin
    例外が起こる可能性のある処理
rescue => 例外オブジェクトが代入される変数
    例外が起こった場合の処理
end

ほかの言語を知っている方であればtry~catchと使い方は変わりません。
以上です。

Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション

0

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

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

Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション 佐藤伸吾(KBMJ)

今回はRubyCocoaとMac OS XのフレームワークであるCore Animationを使って、お手軽にアニメーションを作成してみましょう。

問題

RubyCocoaは、Mac OS XのCocoaオブジェクトをRubyスクリプトからRubyオブジェクトとして扱うための、Ruby用ライブラリとフレームワークです。RubyCocoaを用いれば、RubyでCocoaアプリケーションを記述することができるのです。

 Core AnimationはMax OS Xのフレームワークで、その利点は手軽さにあります。普通にアニメーションプログラミングを行おうとすると、時間軸管理、非同期な描画スレッド、パフォーマンスの向上など、考慮すべき点があまりにも多すぎます。

 しかし、Core Animationを用いれば、面倒な部分はOSに任せて、自分の実現したいことに集中できるのです。

 今回はRubyCocoaとMac OS XのフレームワークであるCore Animationを使って、お手軽にアニメーションを作成してみましょう。

回答例

 AppController.rbを作成し、以下のように記述します。

require ‘osx/cocoa’
OSX.require_framework ‘QuartzCore’

class AppController < OSX::NSObject
ib_outlet :window
ib_outlet :view
ib_action :pressPosition
ib_action :pressRotation
ib_action :pressSepia
ib_action :pressBloom
ib_action :pressHole
ib_action :pressZoom
ib_action :pressHalftone

def awakeFromNib
bitmapImage = OSX::NSBitmapImageRep.imageRepWithContentsOfFile_(‘/Users/ssato/Pictures/ruby.png’)
image = bitmapImage.CGImage()

layer = OSX::CALayer.layer()
layer.contents = image
layer.frame = OSX::CGRectMake(0,0,995/4,996/4)

black=OSX::CGColorCreateGenericRGB(0,0, 0,1.0)
backgroundLayer=OSX::CALayer.layer()
backgroundLayer.backgroundColor=black

backgroundLayer.addSublayer_(layer)

@view.setLayer_(backgroundLayer)
@view.setWantsLayer_(true)
end
def pressPosition(sender)
animation = OSX::CABasicAnimation.animationWithKeyPath_(‘position’)
animation.duration = 1.0

layer = @view.layer.sublayers.objectAtIndex_(0)
position = layer.position
animation.fromValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
position.x += 256;
position.y += 160;
animation.toValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))
animation.autoreverses = true
animation.repeatCount = 4
layer.addAnimation_forKey_(animation, ‘positionAnimation’)
end
def pressRotation(sender)
animation = OSX::CABasicAnimation.animationWithKeyPath_(‘transform’)
animation.duration = 0.5
animation.autoreverses = true
animation.repeatCount = 4
transform = OSX::CATransform3DIdentity
animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)
transform = OSX::CATransform3DMakeRotation(Math::PI, 0, 1.0, 0)
transform.m34 = 1.0 / -420.0
animation.toValue = OSX::NSValue.valueWithCATransform3D(transform)
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.addAnimation_forKey_(animation, ‘transformAnimation’)
end
def pressSepia(sender)
filter = OSX::CIFilter.filterWithName_(‘CISepiaTone’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.name = ‘sepiaFilter’
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressBloom(sender)
filter2 = OSX::CIFilter.filterWithName_(‘CIBloom’)
filter2.setDefaults
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(0.0), ‘inputIntensity’)
filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(5.0), ‘inputRadius’)
filter2.setName_(‘bloomFilter’)

layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter2))

pluseAnimation = OSX::CABasicAnimation.animation
pluseAnimation.keyPath = ‘filters.bloomFilter.inputIntensity’
pluseAnimation.fromValue = OSX::NSNumber.numberWithFloat_(0.0)
pluseAnimation.toValue = OSX::NSNumber.numberWithFloat_(1.5*2)
pluseAnimation.duration = 1.0
pluseAnimation.repeatCount = 4
pluseAnimation.autoreverses = true
layer.addAnimation_forKey_(pluseAnimation, ‘bloom’)
end
def pressHole(sender)
filter = OSX::CIFilter.filterWithName_(‘CIHoleDistortion’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressZoom(sender)
filter = OSX::CIFilter.filterWithName_(‘CIZoomBlur’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
def pressHalftone(sender)
filter = OSX::CIFilter.filterWithName_(‘CICMYKHalftone’)
filter.setDefaults()
layer = @view.layer.sublayers.objectAtIndex_(0)
layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))
end
end

Interface Builderで画像1のようにコンポーネントを配置します。

画像1

画像1

NSObjectを追加して、ClassにAppcontrollerを指定します(画像2)。

画像2

画像2

OutletsとActionsのConnectionを画像3のように設定します。

画像3

画像3

実行結果

Positionボタンを押すと、画像が斜めに移動します(画像4)。

画像4

画像4

Rotationボタンを押すと画像が回転し、Sepiaをクリックすると画像がセピア色になります(画像5)。

画像5

画像5

同様に、Bloomは画像が光り輝き(画像6)、Holeは画像に穴が空きます(画像7)。Zoomボタンはズームエフェクト(画像8)で、Halftoneはハーフトーンフィルタです(画像9)。

画像6

画像6

画像7

画像7

画像9

画像8

画像9

画像9

解説

共通部分

Core Animationを使用するためにフレームワークを設定します。

OSX.require_framework ‘QuartzCore’

AppControllerからviewにアクセスするためのアウトレットを宣言します。

ib_outlet :view

ib_action :pressPosition
ib_action :pressRotation
ib_action :pressSepia
ib_action :pressBloom
ib_action :pressHole
ib_action :pressZoom
ib_action :pressHalftone

pressPosition部分

アクションを宣言し、ボタンが押された時の処理として登録できるようにします。

layerオブジェクトを作成します。Core Animationではレイヤーを基本単位としてアニメーションを実行します。

layer = OSX::CALayer.layer()

backgroundLayerの下にlayerをぶら下げます。

backgroundLayer=OSX::CALayer.layer()
backgroundLayer.addSublayer_(layer)

viewの描画内容としてbackgroundLayerを設定する。

@view.setLayer_(backgroundLayer)
@view.setWantsLayer_(true)

アニメーション化するレイヤプロパティのキーパスを指定して、CABasicAnimationのインスタンスを作成します。

animation = OSX::CABasicAnimation.animationWithKeyPath_(‘position’)

再生時間を1秒に設定します。

animation.duration = 1.0

アニメーションの開始位置を指定します。

animation.fromValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))

アニメーションの終了位置を指定します。

position.x += 256;
position.y += 160;
animation.toValue = OSX::NSValue.valueWithPoint_(OSX::NSPointFromCGPoint(position))

繰り返しアニメーションされるように設定します。

animation.autoreverses = true
animation.repeatCount = 4

layerにアニメーションを設定します。

layer.addAnimation_forKey_(animation, ‘positionAnimation’)

pressRotation部分

単位行列を取得します。

transform = OSX::CATransform3DIdentity

アニメーション開始時の変換行列を設定します。

animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)
animation.fromValue = OSX::NSValue.valueWithCATransform3D(transform)

回転行列を取得します。

transform = OSX::CATransform3DMakeRotation(Math::PI, 0, 1.0, 0)

 pressSepia部分

セピア調フィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CISepiaTone’)

フィルタの入力値をデフォルト値に初期化する。

filter.setDefaults()

layerにfilterを設定する。

layer.setFilters_(OSX::NSArray.arrayWithObject_(filter))

pressBloom部分

Bloomフィルタを作成する。このフィルタはエッジをソフト化し、輝きを画像に適用します。

filter2 = OSX::CIFilter.filterWithName_(‘CIBloom’)

フィルタ出力とオリジナル画像の線形のブレンドを指定するスカラー値であるinputIntensityを0.0に設定する。

filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(0.0), ‘inputIntensity’)

フィルタ処理の対象となる領域の半径を指定する値であるinputRadiusを5.0に設定する。

filter2.setValue_forKey_(OSX::NSNumber.numberWithFloat_(5.0), ‘inputRadius’)

フィルタに名前を設定する。この名前は後でアニメーション設定する時に必要となる。

filter2.setName_(‘bloomFilter’)

アニメーション化する属性を指定する。

pluseAnimation.keyPath = ‘filters.bloomFilter.inputIntensity’

inputIntensityの開始値と終了値を指定する。

pluseAnimation.fromValue = OSX::NSNumber.numberWithFloat_(0.0)
pluseAnimation.toValue = OSX::NSNumber.numberWithFloat_(1.5*2)

pressHole部分

穴歪みフィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CIHoleDistortion’)

pressZoom部分

カメラをズームしたようなエフェクトをシミュレートするズームブラーを作成する。

filter = OSX::CIFilter.filterWithName_(‘CIZoomBlur’)

pressHalftone部分

ハーフトーン表現を行うフィルタを作成する。

filter = OSX::CIFilter.filterWithName_(‘CICMYKHalftone’)

最後に

駆け足で説明しましたが、いかがだったでしょうか?RubyCocoaを使うと、RubyからMac OS Xのリッチなフレームワークを使うことができます。

もっと良い方法があれば、コメントやbuilderブログなどで是非教えていただきたいと思います。

ntpをインストールする

0

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

こんにちはmugiです。

今回はCentOS5.2にntpをインストールします。 

ntpのインストール 

# yum -y install ntp

ntpの設定

# vi /etc/ntp.conf

ファイル内に「server *.*.*.*.*」のような記述があるかと思いますので、そこに同期させたいntpサーバを記述します。保存して閉じます。

時刻合わせ(ntpdは同期をとるサーバとあまりにも時刻がずれていると同期がとれないことがあるため) 

# ntpdate server *.*.*.*.*

起動

# /etc/init.d/ntpd start 

自動起動をONにする

# chkconfig ntpd on

サーバが起動したとき自動でntpdが起動するようになります。

同期がとれているか確認 

# ntpq -p

     remote           refid      st t when poll reach   delay   offset  jitter

==============================================================================

* server *.*.*.*.* .GPS.            *    *   *  ***    *.***  -*****.  **.***

 LOCAL(0)        .LOCL.          ** l   **   **  ***    *.***    *.***   *.***

同期したいサーバの頭に*がついていればOKです。

(表示されるまで設定して10分くらいかかるようです)

Rak(grepの検索結果を見やすくする方法)

0

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

ターミナルを用いている時は、検索にgrepをよく使うと思います。

その中で、私はgrepでは検索結果が見づらいと感じた事があります。

そんな時に見つけたのが、今回紹介するgrepの検索結果を見やすくする便利なRubyプラグイン(Rak)です。

RubyGemからRakプラグインをインストールするgem install rak

 これだけでRakを私用する事ができます。

使用例rak 検索文字列

結果は以下(rak def の場合)のようになります。 

rak の便利な使い方

rubyファイルのみ検索 

rak 検索文字列 –ruby

rubyファイル以外の検索

rak 検索文字列 –noruby

2つ以上のキーワード検索はパイプラインを用いれば良い

rak 検索文字列 | rak 検索文字列 

 ヘルプ

rak -h

ruby on railsのActionControllerにモジュールでbefore_filterを実装する方法

0

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

railsのコントローラーにmoduleをinlcudeする時、

moduleにbefore_filterを書いても、AplicationControllerを

継承していないのでエラーが出ます。

moduleで共通化してるわけですから、before_filterもmodule側で

済ませちゃいたいですよね。

 というわけでやり方です。

コントローラと違って、モジュールはActionControllerを継承してないことが

原因でエラーが出ているので、コントローラー側で定義してしまえばエラーが

出ません。

じゃあ、インクルード後に、インクルードしたコントローラ自身に定義する様

書いてあげましょう。

module NantokaModule
def self.included(base)
base.class_eval{
before_filter :filter_name
}
end
end
self.includedというメソッドは、moduleをincludeした時に呼び出されるメソッドです。
で、baseは、呼び出した側のクラスが入ってきますので、そちらに対して、class_evalを
実行します。
そうすると、クラスにbefore_filter~~が宣言されることになります。 

ruby on railsのActionControllerにモジュールでbefore_filterを実装する方法

0

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

railsのコントローラーにmoduleをinlcudeする時、

moduleにbefore_filterを書いても、AplicationControllerを

継承していないのでエラーが出ます。

moduleで共通化してるわけですから、before_filterもmodule側で

済ませちゃいたいですよね。

 というわけでやり方です。

コントローラと違って、モジュールはActionControllerを継承してないことが

原因でエラーが出ているので、コントローラー側で定義してしまえばエラーが

出ません。

じゃあ、インクルード後に、インクルードしたコントローラ自身に定義する様

書いてあげましょう。

module NantokaModule
def self.included(base)
base.class_eval{
before_filter :filter_name
}
end
end
self.includedというメソッドは、moduleをincludeした時に呼び出されるメソッドです。
で、baseは、呼び出した側のクラスが入ってきますので、そちらに対して、class_evalを
実行します。
そうすると、クラスにbefore_filter~~が宣言されることになります。 

カーネルの再構築

0

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

以前、誰かが「Linux2.6系の脆弱性でroot権限奪ってみた」
という記事を書いていましたが、最近CentOSをインストール
したところ、見事にこの脆弱性に引っかかったので、カーネル
を再構築するハメになりました。

というわけで、以下、カーネルの再構築について簡単に
手順を記したいと思います。

作業環境

OS:CentOS5
現行カーネルバージョン:2.6.18-8.el5

カーネルの再構築

1.以下のサイトからカーネルの最新ソースファイルを取得# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.tar.bz2

2.root権限で/usr/srcへ移動。# su –
# cd /usr/src

3.1のファイルを展開し、シンボリックリンクを作成# tar jxvf linux-2.6.26.tar.bz2
# ln -s linux-2.6.26 linux
# ln -s linux-2.6.26 linux-2.6

4.configファイルをコピー# cp /usr/src/kernels/2.6.18-8.e15-x86_64/.config /usr/src/linux/.config

5.configファイルを更新する# cd linux
# make oldconfig

※ ここから先は対話形式で進む。デフォルト設定でよければ[Enter]で先へ進もう。
y = カーネルに静的に組み込まれる。
m = カーネルモジュールとして組み込まれる。(使用時のみ動作する)
n = 設定を無効化。
? = ヘルプを参照。

6.余計なファイルの削除# make clean

7.Kernel を構築します# make bzImage

8.モジュールのコンパイル# make modules

9.モジュールのインストール# make modules_install

10.全体のインストール# make install

11.動作確認
サーバ起動時に、方向キー上下でKernelを選択することが出来るので、
最新カーネルを選択し、問題がないかを確認する。
(失敗の場合は各種デバイスが認識されなかったりする)

ブートローダの設定

デフォルトで最新カーネルで起動するように設定。# vi /etc/grub.conf

「title CentOS (******)」がカーネルの情報で、
上から順に0,1…となる。
最新のカーネルは0(一番上)になっているので、
defaultの設定を0に変更すれば、最新バージョンで
起動する。default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.26)
          root (hd0,0)
          kernel /vmlinuz-2.6.26 ro root=LABEL=/
          initrd /initrd-2.6.26.img
title CentOS (2.6.18-8.el5)
          root (hd0,0)
          kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/
          initrd /initrd-2.6.18-8.el5.img

postfixのaliasでメールを転送してみよう。

0

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

こんにちは。タジです。

今回はpostfixのaliasについてです。

エイリアスとは別名という意味で、登録しておくことによりファイルなどの実体を別の名前で参照することができます。
つまり、二つの別のアドレスを同じように扱うことができるわけですね。

主な使い方は転送の設定やメールボックスの共有などが一般的です。

 ここではpostfixのpostmasterのメールを自分の元に転送する場合を例にエイリアスの設定を紹介します。


まず、/etc/aliasesを編集してrootのaliasとして受信したいユーザを登録します。

以下のように追記しましょう。

root:       Taji


登録するのはユーザアカウントだけでなくメールアドレスでも可能です。

root:        Taji@kbmj.com


アカウントの複数登録も可能で、簡易なメーリングリストのようにも使うことができます。「,」を使って並べたアカウント名を区切ります。

root:        m-list

m-list:         red,brue,green,black(アカウント名)


エイリアスを変更した場合、その情報をデータベースに反映させなければなりません。
これはpostfixが設定を高速に読み込むために、直接読まずにデータベースから直接読もうとするためです。

作業は簡単で、以下のコマンドを入力するだけです。

newaliases

このコマンドでデータベースを初期化して設定を反映します。
ここまで設定したら一度postfixをリスタートします。

/etc/init.d/postfix restart

これでaliasの設定は終了です。簡単ですね。

 では転送の設定もしてしまいましょう。

エイリアスでpostfixのメールを転送したい場合、ユーザごとに転送の設定をする必要があります。


方法は簡単で、homeの直下(cdとだけ打てばホームに移動する)に.forwardを作成します。

su – Taji

cd

vim .forward


.forwardの中身は転送先のアドレスを書くだけです。

Taji@kbmj.com


転送元にメールを残しておきたい場合は¥[アカウント名]という記述を追加します。
Tajiというアカウントに残しておくなら・・・

¥[Taji] Taji@kbmj.com

と書きます。

これで転送の設定も終了です。

root宛てのメールが自分のメールボックスに届いていたら成功です。

それではまた次回。 

splitで文字列を分割してみよう。

0

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

こんにちは。タジです。

今回は正規表現を使って文字列を分割するメソッド、splitの使い方です。

splitはString型のメソッドで、文字列を正規表現にマッチングする部分ごとに分割して、配列に格納して返します。 

 正規表現とは指定した文字列と合う部分を検索したり抜き出したりするのに使われる表現です。

実際は以下のような感じで使います。

 p “a,b,c,d,e”.split(/,/)

出力結果

条件の正規表現は「/」 で囲います。 

さらに、第2引数には回数を指定できます。

p “a,b,c,d,e”.split(/,/ , 2)

出力結果

=> [“a” , “b”,”c,d,e”]

 私はCSVファイルをDBに格納するのに使いました。

splitはこの他にも使い方があるそうなので、色々勉強していきたいと思います。

では、また次回。 

ウォームスタンバイの復旧手順

0

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

どうもメガネです。6回目です。

前回紹介した設定ではdb1で障害が発生した場合db2でリカバリが行われることが確認できましたが、
このままだとdb2にも障害が起きるかもしれません。そこで今度はdb1を待機系としてウォームスタンバイを復旧する設定をします。

今回は前回の設定が終わっていることを前提で行います。

さきほどまで主系だったdb1のデータベースインスタンスはもう不要なので削除します。

$ rm -rf db1

archive1の中も削除したいですがシンボリックリンクが残っている可能性があるので残しておいてください。

$ psql -p5433 -c “select pg_start_backuo(‘backuo2’) template1
pg_start_backup
——————
  0/9000020
  (1 row)

$ cp -Rp db2 db1
$ psql -p5433 -c “select pg_stot_backuo() template1
pg_stop_backup
——————
  0/A00000000
  (1 row)

次に設定ファイルを編集します。
db1/recovery.confとdb1/postgresql.confの設定を行います。
以下のように変更してください。

db1/recovery.conf
 restore_command = ‘pg_standby -l -t /tmp/trigger /tmp/archive2 %f %p %r’

db1/postgresql.conf
 archive_command = ‘cp %p /tmp/archive1/%f’
 #port = 5433

また前回のように完全バックアップのディレクトリの中からpostmaster.pidとpg_xlogの中身を削除します。

$ rm db1/postmaster.pid
$ rm db1/pg_xlog/*
rm: db1/pg_xlog/archive_status: is a directory
$ rm db1/pg_xlog/archive_status/*

$ pg_ctl -D /tmp/db1 start


以上で設定は終了です。

RDBMSでトランザクション処理をしてみよう。

0

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

 こんにちは。タジです。

 今回は postgresqlやMySQLなどのRDBMSでのトランザクション処理についてです。

 重要なデータの入ったデータベースでUPDATEやDELETEを実行し、もし間違えてしまったら。想像するだけでも恐ろしいです。

 そんな時、トランザクション処理をしておけば、万が一失敗しても元の状態に戻すことができます。

 トランザクション処理では、実際にSQLを発行する前にBEGIN;で処理を開始します。

 その後、UPDATEやINSERT、DELETEなど実際の作業を行い、問題なく作業が終了した場合はCOMMIT;で処理を終了し、データベースに作業を反映させます。

 間違ったSQL文を発行してしまったり、必要な部分を消してしまった時などはROLLBACK;でBEGIN;の時点にデータベースを復旧することができます。

 データベースを触るときは是非やってみてください。

では、また次回。 

nfkで文字コードを変換してみよう。

0

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

こんにちは。タジです。

 今回は、nkfライブラリで文字コードを変換する方法です。

nkfライブラリはnkfコマンドと同じ機能を持っており、rubyに標準で添付されているライブラリです。JIS、EUC-JP、Shift-JIS、UTF-8をかなり簡単に変換できます。

 使い方も簡単です。

 以下はShift-JISで書かれたテキストである「data.txt」を、UTF-8に変換する場合です。

 require ‘nkf’

 File.open(data.txt) do | f |
   text = NKF.nkf(  “-Sw” , f )

     p text 

 end 

 簡単に解説します。

 まずライブラリを読み込む時のお約束であるrequireでnkfライブラリを読み込みます。

 続いて変換したいtextファイルである「data.txt」を読み込みます。

あとは変換した内容を表示するだけですね。

  肝心のNKFライブラリを使っている部分は、()内の引数に変換前の文字コードと変換後の文字コードを指定しています。 

 -jがJIS、-eがEUC-JP、-sがSHIFT-JIS、-wがUTF-8を表しており、変換前が大文字、変換後が小文字という形で指定します。

 今回はSHIFT-JISからUTF-8なので、引数が「-Sw」ということになります。

なお、変換前の文字コードが分からない場合は、変換後の文字コードだけを指定しても、変換前の文字コードを予想して変換してくれます。

今回は以上になります。

それではまた次回。 

bondingでNICを冗長化しよう。

0

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

こんにちは。タジです。

  今回は、サーバ周りの技術でNICを冗長化するbondingについてです。

LANケーブルを2本挿し、bondingを行えば、仮に片方が使えなくなってもネットワークを止めることなく動き続けます。 

では早速やってみましょう。

まずbondingモジュールを読み込むための設定ファイルを作成します。
CentOS 5.1の場合は/etc/modprobe.dディレクトリの下にbondingという名のファイルを作成します。

OSによって、/etc/modprobe.confに書き込んだり、modprobeの代わりにmodule.confに書き込んだりする必要があります。

#  vim /etc/modprobe.d/bonding

alias bond0 bonding
option bond0 miimon=100 mode=1 primary=eth0


OSの種類やバージョンにより、/etc/modules.conf内や/etc/modprobe.conf内に設定する場合もあります。

ネットワーク設定

次にネットワーク設定を行います。
ネットワーク設定は/etc/sysconfig/network-scriptsディレクトリ配下のifcfg-××××ファイルを編集します。
××××内には以下の名前を入れてください。

bond0

bond0は従来使用していたデバイスの設定ファイル(通常はifcfg-eth0)のデバイス名をbond0にするだけです。

DEVICE=bond0
BOOTPROTO=static
IPADDR=xxx.xxx.xxx.xxx

NETMASK=255.255.255.xxx

ONBOOT=yes

eth0,eth1

eth0はbond0の配下という形になるのでMASTERを指定する必要があります。
eth1はデバイス名をeth1にするだけなので割愛します。

DEVICE=eth0 (eth1)
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
 

ここまで設定したら、ネットワークを再起動してみましょう。

どこか問題ない場所にPINGを送りながら、2本挿したケーブルの片方を抜いてみてください。

そのまま止まることなくPINGを送り続けていたら成功です。

それではまた次回。 

apacheでhttpsからhttpsへのリダイレクト方法

0

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

こんにちは新人のカツオです。


今日は以前行った作業で、うまくいかなくてテンパった

apacheでのSSL接続からSSL接続へのリダイレクトについてご紹介したいと思います。

僕が行った作業はサイトのドメインを変更するというけっこう珍しい?作業でした。

ちょうどSSLの更新もあり、同時にドメインの変更。

そのときの作業項目に

「旧ドメインから新ドメインのURLにリダイレクトする。」

というものがあったんですね。

テスト環境(SSLは取得していない)では

apacheのhttpd.confファイルの設定で

virtualhostの設定項目に 

Redirect / https://xxxxxxxxxxxx.com/

の様に記述していました。

http接続→httpsの場合それで問題はありませんでした。

しかし

本番実施日になっていざ対応してみると

全然リダイレクトされない。。。。

どうやら、https接続でのリダイレクトはできないようです。

ということで別対応

ということで

redirect

ではなく

rewriteするという対応でことなきを得ました。

<VirtualHost 192.168.000.000:443 >
   RewriteEngine On
   RewriteCond %{HTTP_HOST} xxxxxxx.co.jp
   RewriteRule ^/(.*)$ https://yyyyyyyy.com/$1 [R=301,L]
</VirtualHost> 

 てゆう具合に書きました。

※xxxxxxx.co.jpが旧ドメインで、https://yyyyyyyy.com/が新ドメインです。

https→httpsのリダイレクトの場合は注意しましょう。

PostgreSQL8.3でウォームスタンバイの設定

0

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

どうもメガネです。5回目です。

今回はPostgreSQLでのウォームスタンバイの設定を行います。

PostgreSQL8.3からウォームスタンバイの設定が簡単になったので紹介します。

今回は1台のマシンで2つのデータベースインスタンスを作成して環境を作って行きます。

$はPostgreSQLのスーパーユーザで実行してください。

 

まずpg_standbyをインストールします。

 

$ cd /usr/local/src/postgresql-8.3.0/contrib/pg_standby

$ make

$ make install

 

次に/tmpディレクトリにdb1(マスターDB)とdb2(バックアップDB)というインスタンスを作成します。db2はdb1のコピーを使うのでここでは作成しません。

 

$ cd /tmp

$ initdb –n-locale db1

 

次にアーカイブログを格納するためのディレクトリを作成します。

 

$ mkdir archive1

$ mkdir archive2

 

そしてdb1/postgresql.confに以下の3行を追加します。

 

$vi /tmp/db1/postgresql.conf

 

archive_mode = on

archive_command = ‘cp %p /tmp/archive1/%f’

archive_timeout = 10

 

ここではarchive_commandとしてcpをしていますが異なるマシンでウォームスタンバイを構成する場合scpやmountを使ってバックアップDBから参照場所にアーカイブログを出力する必要があります。

 

主系の起動

 

$ pg_ctl start -D /tmp/db1

 

主系の完全バックアップを作成

 

$ psql -c “select pg_start_backup(‘backup’)” template1

$ cp -pR db1 db2

$ psql -c “select pg_stop_backup()” template1

 

 バックアップDBのpostgresql.confの設定

 $ vi /tmp/db2/postgresql.conf

 

archive_mode = on

archive_command = ‘cp %p /tmp/archive2/%f’

archive_timeout = 10

port = 5433

 

db2の中からpostmaster.pidとpg_xlogの中を消す。

$ rm db2/postmaster.pid

$ rm db2/pg_xlog/*

rm: db2/pg_xlog/archive_status: is a directory

$ rm  db2/pg_xlog/archive_status/*

 

バックアップDBのrecovery.confを設定

 

restore_command = ‘pg_standby -l -t /tmp/trigger /tmp/archive1 %f %p %r’

 

バックアップDBの起動

 

$ pg_ctl start -D /tmp/db2

$ psql -p5433

psql: FATAL: the database system is stating up

という表示されるはずです。

 

リカバリーの実行

 
db1で実行
$ createdb testdb

$ psql testdb

testdb=# create table test(t timestamp);
CREATE TBALE
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# select * from test;
 
DB2で以下のようにアーカイブログがリストアされたメッセージが表示されます。
LOG: restored log file “0000000 10000000000000000C” from archive
LOG: restored log file “0000000 10000000000000000D” from archive
LOG: restored log file “0000000 10000000000000000E” from archive
LOG: restored log file “0000000 10000000000000000F” from archive
 
$ pg_ctl -D db1 stop
$ cd /tmp
$ touch trigger # 今回は手動でファイルを作成しましたがdb1を常に監視しているシェルスクリプトを作成してdb1の反応がなくなった瞬間にtriggerを作成すれば自動で切り替えることができます。

DB2が起動するはずです。これでリカバリは完了しているはずです。最後にきちんと同期がとれていることを確認します。

DB2で実行

$ psql -p 5433 testdb
testdb=# select * from test;
DB1で表示された結果と同じであれば成功です。

以上です。

Net/HTTPで圧縮ファイルをダウンロードしよう。

0

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

はじめまして。

KBMJエンジニアのタジと申します。

ここでは仕事の中で出会った様々な問題をメモしていこうと思っています。 

今回はRubyのライブラリであるNet/HTTPで、lzhファイルをDLする方法です。

Net/HTTPはその名の通りHTTPを扱うためのライブラリで、非常に多くの機能を持っています。

今回はその中でも一番簡単なWebページにアクセスして 内容を持ってくる機能を使いましょう。

では実際に作ってみます。

 require ‘net/http’

 Net::HTTP.version_1_2

     File.open([ファイル名],”wb”) do |f|
       Net::HTTP.start([ドメイン名], 80){|http|
       f.print http.get([対象のファイルまでパス]).body
     }
     end

簡単に解説します。

まず頭にライブラリを読み込んだ後、バージョンを指定しています。

次にファイルを開いて保存したい名前のファイル名でファイルを開きます。

ファイルオープンの際に、書き込みモードとして”wb”を指定します。

この時、書き込みモードを指定するのにバイナリとして記述するという”b”を忘れないでください。

圧縮ファイルはバイナリファイルに分類されます。

次にNet::HTTP.startで接続を開始します。

引数として、対象のドメイン名とポート番号を指定します。

最後に取ってくるHTTPドキュメントのパスを指定して、中身を先ほど開いたファイルに書き込んでおしまいです。

ドメイン名とパスは少しややこしいですが、ドメインはURLの前半部のサーバ名を、パスはその中のファイルの位置を表しています。

例えるなら、「http://doruby.kbmj.com/beginner」というURLなら「http://」までが使用プロトコル、「doruby.kbmj.com」までがドメイン名、「beginner」がパスとなります。 

解説は以上です。

もっとスマートなやり方もありそうなので、色々勉強していきたいと思います。

それではまた次回。

capistranoでmongrel,apache,rsync

0

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

こんにちはtacchiです。
以前TrinityTさんが書いてたcapistranoのすすめのつづきです。
更新されないので勝手に書いちゃいます。

以下の動作をさせたかったので、taskを自分で作ってみようと言う事になりました。
・特定のサーバのmongrelの起動、停止、再起動をさせたい
・特定サーバのapacheの起動、停止、再起動をさせたい
・rsyncでファイルを転送させたい

これがmongrelの起動、停止、再起動です。

  namespace :mongrel do
    desc ‘app01,app02 mongrelのrestart’
    task :restart, :roles => [:app1, :app2] do
     run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster restart;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive == 0 ]; then
             echo ‘error mongrel restart’;
             exit 1;
          fi;
          echo ‘success mongrel restart!’;
          exit 0;”
    end

    desc ‘app01,app02 mongrelのstart’
    task :start, :roles => [:app1, :app2] do
      run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster start;
          sleep 3;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive == 0 ]; then
             echo ‘error mongrel start’;
             exit 1;
          fi;
          echo ‘success mongrel start!’;
          exit 0;”
    end

    desc ‘app01,app02 mongrelのstop’
    task :stop, :roles => [:app1, :app2] do
      run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster stop;
          sleep 3;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive != 0 ]; then
             echo ‘error mongrel stop’;
             exit 1;
          fi;
          echo ‘success mongrel stop!’;
          exit 0;”
    end
  end

これがapacheの起動、停止、再起動です。

  namespace :apache do
    task :start, :roles => [:web1,:web2] do
      sudo “/usr/local/apache2/bin/apachectl start;”
      run “ps -ef |grep http”
    end

    task :stop, :roles => [:web1, :web2] do
      sudo “/usr/local/apache2/bin/apachectl stop;”
      run “ps -ef |grep http”
    end

   task :restart, :roles => [:web1, :web2] do
      sudo “/usr/local/apache2/bin/apachectl restart;”
      run “ps -ef |grep http”
    end
  end

これがrsyncです

set(:parts_file) do
  Capistrano::CLI.ui.ask ‘enter parts file: ‘
end

set(:parts_insert_server) do
  Capistrano::CLI.ui.ask ‘enter remote server ip: ‘
end

set :deploy_to, “/path/to/project”

     desc ‘部分的なファイルを転送できます。プロジェクト以下のファイルを指定して下さい。’
  namespace :rsync do
     task :parts, :roles => :local do
       run “/usr/local/bin/rsync -avz –delete -e ssh #{deploy_to}/#{parts_file} #{parts_insert_server}:#{deploy_to}/#{parts_file}”
     end
  end

てかインデントの為に、nbsp入れないといけないのなんとかならないすかね。。。

今週のRuby on Rails最新情報

0

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

以下の投稿は、 Riding Railsの記事を筆者が独断で翻訳したものです。

誤訳の指摘や、コメント歓迎します。http://weblog.rubyonrails.com/2008/7/11/this-week-in-rails-july-11-2008 

第3回目のRailsコミュニティからの週刊レポートです。この2週間ほどはかなり忙しく、投稿が遅れたことを謝罪します。2週間内の最も興味深い出来事やニュースを紹介します。

Jamis Buck氏からのメンテナンスリリースの発表からはじめます。Capistrano 2.4.3 と Net::SSH 2.0.3 が2週間前にリリースされました。利用者はアップグレードを検討してください。

Rails2.1はリリースされてからしばらく経ちますが、まだ情報を得ていない場合は、こちら のリンクからたくさんの有益な情報へのリンクがあります。

SSL更新時のエラー 改行コードの注意点 for mac

0

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

どもKBMJ新人のカツオです。

今日はSSL更新の際のサーバー証明書をapacheにインストールしたのですが、

apacheの再起動かけてもエラーでサイトが表示されなくなってしまった時がありました。

今日はSSL更新などで

SSL証明書のインストールで注意すべき改行コードについてご紹介です。

というわけで、僕はSSL更新のために



SSL発行のために、CSRを作成し、SSL証明書発行会社に送りました。

そしSSL証明書(サーバーID)を取得しました。

そして、コピペして、apache配下にCSRとともにサーバーIDを置いて

apache再起動しました。

しかし、なぜかエラーの表示とともにサイトが見れなくなっている!!
 

焦った、新人カツオ焦りました。

焦りながらも原因の調査をしていると、わかりました。


どうやら改行コードがおかしいらしい。。。

改行コードには

・LF

・CR

・CR-LF 

というものがあるそうです。

僕の環境はmacなのですが、 

どうやら、サーバーIDをコピペして貼付けたときに

改行コードがmacの改行コードがCRって形式になってたみたいです。

unix環境で見ると

改行が全部

^M 

になっており、それが原因で、サーバーIDを読み取れなかったみたいです。。。

いやはや、そのときはエディタでLF形式の改行コードしなおしたサーバーIDのファイルつくってapacheにあげ直しましたよ。

その結果、無事サイトのSSL更新できました。

後で調べたらCRの改行コードをLFに変える方法というのもあるらしいですけど

それままたの機会に! 

いやはや本当、目に見えないことが原因というのは怖いですな。

今日は以上で、またあいましょう。

最近人気な記事