ホーム ブログ ページ 46

FreeBDにmuninを入れて負荷監視

0

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

よしだです。

今回はサーバ監視ツール munin を FreeBSD に入れる手順を紹介します。

 やりたいこと

ここでは nginx や MySQL が実行されているウェブサーバを監視することを目的とします。

そのために、これとは別に監視用のマシンを用意して、そこに munin を入れていきます。

 想定環境

  • ◇ munin を入れるサーバマシン
  • ◇ 監視対象となるnginx+MySQLサーバ

(どちらも FreeBSD)

 サーバ側セットアップ

サーバ側には port から sysutils/munin-master をインストールします。

cd /usr/ports/sysutils/munin-master
make install clean

インストールが正常に終了した後、監視対象となるサーバのIPアドレスを設定します。

# vim /usr/local/etc/munin/munin.conf
(※下記のような差分が出るように編集)
# diff /usr/local/etc/munin/munin.conf /usr/local/etc/munin/munin.conf.sample
< [domain.name]
<     address x.x.x.x
<     use_node_name yes

 クライアント側セットアップ

サーバ側には port から sysutils/munin-node をインストールします。

(※sysutils/munin-common というスケルトンもありますが、どうやらこれは munin-master もしくは munin-node のいずれかを入れるときに自動的にインストールされる共通ライブラリらしいです)

cd /usr/ports/sysutils/munin-node
make install clean

監視対象マシンにクライアントマシン自身をエントリします。

# cp /usr/local/etc/munin/munin-node.conf /usr/local/etc/munin/munin-node.conf.org
(※念のため初期設定をバックアップ)
# vim /usr/local/etc/munin/munin-node.conf
(※下記のような差分が出るように編集)
# diff /usr/local//etc/munin/munin-node.conf /usr/local//etc/munin/munin-node.conf.org
51,52c51,52
< #host *
< host 127.0.0.1
---
> host *
> # host 127.0.0.1

次に munin-cron を実行してクライアントの情報を定期的にサーバに送信するようにします。

# sudo -u munin /usr/local/bin/munin-cron

最後に munin のログローテート用に、syslog の設定に追加の記述を行います。

ここで munin-node.log の所有者が munin になるようにしておかないと、深夜 0 時とともに munin-node が落ちることになります。

# vim  /etc/newsyslog.conf
(※下記のような差分が出るように編集)
# diff /etc/newsyslog.conf
- /var/log/munin/munin-node.log                644  7     *    @T00  Z /var/run/munin/munin-node.pid
+ /var/log/munin/munin-node.log   munin:munin             644  7     *    @T00  Z /var/run/munin/munin-node.pid

 プラグインの追加

nginx の監視

手始めに nginx を監視するためのプラグインをクライアント側に導入します。

ln -s /usr/local/share/munin/plugins/nginx_status /usr/local/etc/munin/plugins/
ln -s /usr/local/share/munin/plugins/nginx_request /usr/local/etc/munin/plugins/

作業はこれだけで終わりです。

あとは munin-node を再起動すればプラグインが有効になります。

/usr/local/etc/rc.d/munin-node restart

MySQL の監視

次に MySQL の監視設定を追加します。

perl /usr/local/share/munin/plugins/mysql_ suggest

で、出現したコマンドの中から監視したいものを選択します。

perl /usr/local/share/munin/plugins/mysql_ suggest
bin_relay_log
commands
connections
files_tables
innodb_bpool
innodb_bpool_act
innodb_insert_buf
innodb_io
innodb_io_pend
innodb_log
innodb_rows
innodb_semaphores
innodb_tnx
myisam_indexes
network_traffic
qcache
qcache_mem
replication
select_types
slow
sorts
table_locks
tmp_tables

たとえば network_traffic を有効にしたい場合は下記のようにします。

ln -s /usr/local/share/munin/plugins/mysql_ /usr/local/etc/munin/plugins/mysql_network_traffic

最後に munin-node を再起動してプラグインを有効にします。

/usr/local/etc/rc.d/munin-node restart

 おまけ

おまけ1: MySQL監視がうまくいかない場合

Can't locate DBI.pm in @INC 

というメッセージ我出る場合、

cd /usr/ports/databases/p5-DBI
make install clean

で DBIライブラリ(DB接続用)をインストールします。

その後、下記のようにファイルを編集します。

# vim /usr/local/etc/munin/plugin-conf.d/plugins.conf
(※下記のような差分が出るように編集)
# diff /usr/local/etc/munin/plugin-conf.d/plugins.conf /usr/local/etc/munin/plugin-conf.d/plugins.conf.org

[mysql*]

env.mysqladmin /usr/local/bin/mysqladmin env.mysqlshow /usr/local/bin/mysqlshow +env.mysqlconnection DBI:mysql:mysql +env.mysqluser root

設定変更後は munin-node を再起動します。

/usr/local/etc/rc.d/munin-node restart

おまけ2: BASIC 認証を行う

htpasswd でパスワードファイルを作成後、ウェブサーバに設定を追加します。

(下記は nginx の場合を例にしています)

# htpasswd -c /usr/local/etc/munin/munin-htpasswd ユーザ名
# vim /usr/local/etc/nginx/nginx.conf
(※下記のような記述を追加)
        location /munin {
            root /usr/local/www;
            access_log /var/log/nginx-munin-access.log;
            error_log /var/log/nginx-munin-error.log;
            auth_basic "realm";
            auth_basic_user_file /var/www/munin/.htpasswd;
        }
# /usr/local/etc/rc.d/nginx reload

Webアプリケーション提供に於ける、passwordのあり方

0

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

お久しぶりです。ととろです。半年ほど、留守にしておりました。その間、様々なところで、インシデントが発生し、どこかで私の書いた記事を読まれた方も多いかと思いますが、今後は引き続きこちらで掲載していきますので、今後とも宜しくお願いします。

 不正ログインの大量発生

さて、いずこかの場所で、約12億ユーザーにものぼる数のpasswordが漏えいしました。これを期したかの様に、日本国内の数々の大手サービス会社が狙われ、根こそぎログイン可能なIDとpasswordが盗まれる事態になりました。一部の新聞記事で私がコメントした内容ですが、「今回の事件は、確実にログインできるIDとpasswordリストを売買する闇市場が有る」と考えています。つまり、ユーザーが同じIDとpasswordの組み合わせを、他のサービスで利用している以上、マスターキーとなるべく、確実にログインできる辞書ファイルが作成されつつ有り、それが高値で取引されるブラックマーケットが存在している。その様に考えています。

ユーザーに、どんなにサイト毎にpasswordを変えて下さいとお願いしても、ユーザーは「まさかそんなこと」と、相手にもせずにそのまま同じIDとpasswordの組み合わせを使い続けることでしょう。

 サービス提供会社としては?

先ほど、ユーザーは対岸の火事と考え、同じIDとpasswordの組み合わせを使い続けると書きました。では、サービスを提供する側に立って考えてみましょう。サービスを提供するが解らしてみれば、ユーザーが勝手に他のサービスと同じIDとpasswordを使い回した結果、不正ログインされるわけです。それが、数件ならまだしも、数百件、数千件にも上れば、新聞沙汰になりかねませんし、提供しているサービスが有名であれば、有名であるほど、ユーザーのサービス離れ(サービス解約)に拍車がかかります。サービス提供会社に、落ち度が無いにもかかわらず、ユーザーの勝手な思い込みにより、サービス提供が出来なくなる。こんな理不尽なことはありません。

今まで、どのサービスに於いても、password設定に関する主導権は、ユーザー側にありました。ポリシーとして、記号を入れるや、大文字を含める、数字を含めるなどいくつかの制限を盛り込んだとしても、それはあくまでもpassword設定に対して求める内容であって、passwordそのものを決定づけるのは、ユーザー自身です。これは、不文律で有り、世界の常識でした。しかしながら、昨今の様に立て続けに不正アクセスが続き、そして、不条理にもユーザーの勝手なpassword設定によって、不正アクセスが表沙汰になり、大騒ぎとなってサービス停止や、ユーザー離れにつながる。これでは、サービス提供会社はたまったものではありません。そこで、敢えてこの「passwordはユーザーが設定する物」という不文律を変えてみたいと考えています。

 では、どのようにすればいいのか?

サービス提供者から、passwordをいくつか提示し、そのpasswordの中から、ユーザーに利用するパスワードを決めて貰えば良いのです。このとき、パスワードのみを提供し、ユーザーID(ログインID)は、ユーザーに提供して貰います。データベース的には、ユーザーIDのみを記録し、passwordは記録しません。ユーザーには、先ほど書いた様に、ユーザーIDを提供して頂きますが、そのときの打鍵の情報をsaltとして持ちます。つまり、打鍵の早さによってバイオメトリックス認証もどきを行います。バイオメトリックス認証そのものを行うわけでは無く、あくまでも、saltとして用いるだけであり、他の用途には用いません。そして、ユーザー登録した日時を、秒まで含めて記録します。頭のキレる方はお気づきのことと思いますが、ユーザー認証に用いるIDとそれを入力した時間、それに加え、saltキーを元に幾何学演算を用い、いくつかの候補を画面に表示し、どれを選んだかを、DBに記録します。

これを行う事により、認証に用いられるpasswordは、ユーザーのみが記録しておき、システム側はそのpasswordを記録すらしません。存在するのは、生成アルゴリズムとユーザーが入力したID、それに暗号化したsaltのみである。これなら、アプリケーションに穴があったとしても、passwordは漏えいしませんし、当然、ユーザーからpasswordが漏えいしたとしても、他のユーザーへの影響はもちろんのこと、他のサービスに於いても、影響を受けることがありません。

 まとめ

今回は、ユーザーにも優しく、システム側にも優しい、passwordのあり方について考えてみました。

JavaScriptにて非同期通信を同期通信のように動作させる方法

0

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

rick No28です。
今回は、JSの外部通信にてJSONPを使用し、画面遷移直前に使用する場合、非同期通信通信が途切れてしまう時があるのでその対策となります。

設定

・Webサイト
・外部サーバ
・画面A
・画面B
・jQuery

状況

JavaScript(jQuery)にて外部サイトに通信を行う場合、
クロスサイトスクリプティング対策としてJSONPとしますが、
同期通信は対応しておらず非同期通信しか使用できません。

この場合、Webサイト画面Aより画面Bへ遷移する直前(クリック時)に
非同期通信のJSONPを使用すると、
画面Bへの遷移が早すぎるためか外部サイトへの通信が行われない場合があります。
(遷移する前をブレイクポイントなどで止めると通信が行われます)
そのため、同期通信のような動作をさせる必要があります。

対策

遷移リンクを押した時に発動するため、

まずリンク等をやめるか、遷移イベントをキャンセルします。
例えばの代わりにでname=URLを記載し、
クリックイベントを貼り付けます。
その後の通信にて下記のようajaxを行います。
$.ajax({
url: URL,
dataType: “jsonp”,
data: data,
jsonpCallback: “callback”,
async : true,
complete: function(u) {
return function() {
location.href = u;
};
}(url)
});
工夫した点は1箇所completeの点です。
外部通信が完了した後の処理completeにて遷移処理をJS側で行うことで
同期通信のような動作となります。
これにより、クリック時通信を完了した後に遷移を行うことができ、
クリック時の外部通信処理が途切れなくなりました。

TeedaでAjax

0

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

WEBフレームワークのTeedaで簡単にAjaxを実装する方法を実例とともにご紹介します。

【環境】

Teeda 1.0.13

Seasar 2.4

TeedaにはAjaxを実装するためのプラグイン「Kumu.Ajax」が用意されています。

使用するには以下のライブラリを設定おきます。

・teeda-ajax-1.0.13-xx.jar

・ajax.js

 teeda-ajax-1.0.13-xx.jar 設定

WEB-INF/lib配下にteeda-ajax-1.0.13-xx.jarを含めます。

web.xmlも以下のように設定しておきます。

<servlet>
	<servlet-name>ajaxServlet</servlet-name>
	<servlet-class>org.seasar.teeda.ajax.AjaxServlet</servlet-class>
 	<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
	<servlet-name>ajaxServlet</servlet-name>
	<url-pattern>*.ajax</url-pattern>
</servlet-mapping>

 ajax.js 設定

ajax.jsを任意のディレクトリに配置します(src/main/webapp/js等)

もしajax.jsが無い場合はTeeda本体をダウンロードして取り出して下さい。

http://teeda.seasar.org/ja/

→「ダウンロード」より最新の「Teeda core(JSF実装)/extension(Htmlテンプレート等を含む拡張機能)/ajax(Ajax実現機能)を含む本体」をDL

※解凍後、src/main/resources/org/seaser/teeda/ajax/js内にあります。

HTML側でajax.jsを読み込みます。

<head>
	<script type="text/javaScript" src="../../js/ajax.js" />
</head>

 HTML側(リクエスト処理)

これで準備は完了です。

では、選択した都道府県セレクトボックスに連動して、市区町村セレクトボックスを切り替える処理を実装してみたいと思います。

都道府県のセレクトボックスにonchangeを設定し、javascriptで定義したgetCityメソッドを呼び出します。

< select id="pref" onchange="getCity(this.value);">
	< option value="0">dummy
< /select>

getCityではKumu.Ajax.executeTeedaAjaxを呼び出します。

第1引数:呼び出したいパッケージ + メソッド名を設定

第2引数:アプリ側に渡すパラメータ

第3引数:戻り値の型 ※TEXT以外にもJSONなども使えます

function getCity(prefId){
	Kumu.Ajax.executeTeedaAjax(mypage_updateAccountAction_ajaxCity, [prefId], Kumu.Ajax.RESPONSE_TYPE_TEXT);
}

 アプリ側

アプリ側では以下のように受けるメソッドを定義しておきます。

prefIdがパラメータとして渡ってくるので、その引数を元に市区町村を取得し、TEXT型で返します。

(mypage/updateAccountAction)

public String ajaxCity(String prefId){
	Map<string , string> items = getCityItems(Long.valueOf(prefId));
	String str = items.toString();
	return StringUtils.strip(str, "{}");
}

 HTML側(レスポンス処理)

コールバック関数にはリクエスト時の第1引数と同じ名前を付けておきます。

function mypage_updateAccountAction_ajaxCity(res){
	createCityOptions(res);
}

あとはこれを展開して市区町村セレクトボックスのリストの内容を書き換えればOKです。

function createCityOptions(res){
	var city = document.getElementById("city");
	
	// セレクトボックスを初期化
	removeChildren(city);
	city.options[0] = new Option("選択してください", null);
	
	if (res != "") {
		// カンマで分割し配列に格納
		var resArray = res.split(", ");
		
		for (var i = 0; i < resArray.length; i++) {
			var detailArray = resArray[i].split("=");
			var name = detailArray[0];
			var id = detailArray[1];
			city.options[i+1] = new Option(name, id);
		}
	}
}

function removeChildren(x) {
	if (x.hasChildNodes()) {
		while (x.childNodes.length > 0) {
			x.removeChild(x.firstChild)
		}
	}
}

以上です。わりと簡単にAjaxを実装できるKumu.Ajaxおすすめです!

Googleリーダー→netvibesに乗り換えてみた

0

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


Googleリーダー→netvibesに乗り換えてみた

 Googleリーダー終了

Googleリーダーが7月にサービス提供終了するとの一報が飛び込んできました。

私としては粛々と代替サービスに乗り換えることにいたしました。

 乗換先

netvibesがなんだかよさげという言葉を鵜呑みにしてみました。

 移行手順

エクスポート&インポートのわずかな作業で移行できました。

前準備

netvibesにアカウント登録をしておきます。

facebookアカウントが利用できるほか、

netvibes上でサインアップも可能のようです。

Googleリーダーからフィード情報をエクスポート

Googleリーダーをブラウザで開き歯車マーク→リーダーの設定をクリック

エクスポート/インポート→Download・・・をクリック

別ページに遷移するのでダウンロードをクリック

ダウンロードをクリック

フィード情報のアーカイブファイルのダウンロードがはじまります。

アーカイブファイルを展開すると中にsubscriptions.xmlというファイルがあります。

こちらを使用します。

netvibesにフィード情報をインポート

netvibesにログインし、

上部にある

コンテンツを追加する→フィードを追加する→インポート

でにsubscriptions.xmlをインポートします。

上記のメッセージが出たら成功です。OKをクリック

Googleリーダーで購読していたフィードが登録されました。

リーダーをクリックすると見た目がGoogleリーダーに近づく感じです。

 雑感

まだ使用して1日なので操作感などはコメントできませんが、

たとえばflickrなど画像投稿系の記事チェックは非常にやりやすくなりました。

表示をモザイクに変更します。

こんな感じです。

————–

確認環境

Windows7

Firefox14

【負荷対策】rubyの思わぬ落とし穴、putsについて

0

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

こんにちは。アピリッツの本多です。

久しぶりにruby関連の記事を書きたいと思います。

putsという、rubyの中ではメジャーな部類の関数がありますが、今日はこれに関する話題です。

ruby on rails案件にて、ループ処理系のバッチを実行する際に、進捗状況を確認するためにこんな書き方をしているケースがあると思います。

items.each_with_index do |item, i|
  (何かの処理)
  puts "#{i + 1} / #{items.size}"
end

この場合、展開するデータの件数が多くない場合は良いですが、例えば数十万件のデータを処理する場合などは

putsの処理時間が無視できないレベルになってきます。

例えば、弊社で公開しているエレコマというパッケージでは、住所マスタの取込バッチが実装されています。

ECサイト構築パッケージ「エレコマ」

elecoma/README at master ・ elecoma/elecoma ・ GitHub

================================================================================
* エレコマの住所マスタ更新
================================================================================
エレコマの住所マスタは郵便事業株式会社の郵便番号マスタを利用しています。
登録はコンソールから以下のように行ないます。

$ ruby script/runner -e production Zip.import

郵便番号マスタは以下のサイトにて配布されているものを自動的に取り込みます。
http://www.post.japanpost.jp/zipcode/download.html

住所マスタ更新機能はLhaLibに依存しています。
LhaLibの詳細については以下のサイトをご確認ください。
http://www.artonx.org/collabo/backyard/?LhaLibEn

このバッチですが、上記例と同様ループ処理中にputsで進捗状況を出力しているのですが、

いかんせんデータ数が2013年1月31日時点で123,385+22,087=145,472件と非常に多いです。

そしてデータ量が多いということは、イコールループ処理中のputsの影響も大きいという事ですね。

実際に動かして検証

私の環境(スペックは公開出来かねます。すみません)で実行してみます。

3回実行してみて、時間は

379.116285

389.899668

384.368132

⇒平均384.46秒(6分24.46秒)

でした。

結構長いですね。

ではputsをコメントアウトしてみましょう。

エレコマの郵便番号マスタのputsは2箇所あるので、両方をコメントアウトします。

コメントアウトしたら、再度同じバッチを実行します。

先ほどと同様に3回実行し、時間は

320.188456

315.7741

320.52054

⇒平均318.83秒(5分18.83秒)

でした。

1分以上の短縮です。かなり効果が出ましたね。

しかし、進捗状況が分からないと正常に動いているか不安ですね。

では間を取って、「1000処理毎にputsする」ようにしてみましょう。

実行時間は

298.578724

314.859872

323.760253

⇒平均312.40秒(5分12.40秒)

でした。

逆に若干puts無しより速い結果が出ましたが、まぁ…誤差の範囲という事で。

まとめ

ループ処理中の画面出力はほどほどに控えましょう。

実はこれらはrubyに限った話では無いですが、画面出力系の処理は意外に「重い」です。

そのため、今回のようなループ処理等、必ずしもputsが無いと困るわけではない場合に、思い切って処理を削る事で

パフォーマンスが改善する場合があります。

ちなみに後日談ですが、上記内容を社内のエレコマチームに報告し、2013/2/22現在は負荷改善対応がなされています。

JMeter で EC サイトを負荷テストする方法

0

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


よしだです。

今回は JMeter を使った負荷テストの方法について、EC(通販)サイトを例に紹介していきたいと思います。

 概要

負荷テストとは何でしょうか?

単純にアクセス数を増やすだけではアタックにしかならないし、結果的にサーバの性能を計測しているに過ぎない結果となりかねません。ここでいう負荷テストは、実際の運用時のアクセス状況を想定し、これをシュミレートした適切な負荷をかけることをさします。

EC サイトの場合、ひとつの商品ページにアクセスが集中することはあまりありません。多くのユーザは、1. サイトのどこか(大半はトップページ)から入場し、2. 商品を検索し、3. 目的の商品ページにたどりつき、4. カートに入れて、5. 購入処理を行います(6. 必要であれば会員登録も行うでしょう)。それぞれのアクションの間隔は 3~10 秒くらいで、同じようなアクティブユーザが他に何人もいるのが一般的です。

正確な負荷テストを行いたいなら、このような状況を再現する必要があります。ここまで複雑な処理を手動テストするなんて考えたくありません。

そこで、これを自動化してくれるツール JMeter の登場というわけです。

 想定するシナリオ

アクセスされうるページ

先ほどあげた通り、EC サイトであればユーザは下記のページにそれぞれアクセスする可能性があります。

  1. トップページ
  2. 商品検索
  3. 商品詳細
  4. カート
  5. 購入ページ
  6. 新規会員登録

想定するデータ

負荷状況は、アクセス状況のほかに、サービスが持つ情報量にも左右することがあります。

ここでは下記のデータをサービスが所有するものとして話を進めていきます。

(この値は、およそ中規模程度の EC サイトが所有するデータ量になります)

  • 商品数: 5,000
  • 会員数: 5,000
  • 受注数: 5,000

一般的に、

  • 商品数が多ければ商品検索・商品ページの読み込みに
  • 会員数が多ければログイン処理・会員登録処理に、
  • 受注数が多ければカートに入れる処理、受注処理に

それぞれ時間がかかりがちになります。

EC サイトではアクティブユーザの大半が商品検索を行うことになるので、実際には商品まわりを重点的にテストすべきです。また、ここではわかりやすくするために数値を固定していますが、本来は商品数・会員数・受注数・アクティブユーザ数の値をそれぞれ変更した場合のテストも行い比較すべきです。

それではこのシナリオを JMeter に設定していきましょう!

 JMeter 導入手順

改めて説明するものでもないので割愛します。

こちらでダオカさんが紹介しているので、ぜひ参考にしてみてください。

http://doruby.kbmj.com/daoka_tips/20090328/JMeter___

 用語解説

JMeter の用語を、今回のシナリオで必要になる要素に当てはめると下記のようになります。

  • ○ スレッドグループ … 1ユーザの行動シナリオおよび設定
    • ◇ スレッド数 … アクティブユーザ数
    • ◇ Ramp-Up期間 … スレッドが開始する間隔(ユーザ数の立ち上がり緩急度)
    • ◇ ループ回数 … シナリオを繰り返す回数
  • ○ ガウス乱数タイマ … 1ユーザのアクセス間隔(平均 n 秒でページ遷移)
    • ex.) 100アクティブユーザ * (1アクセス/5秒) = 20アクセス/秒
  • ○ リクエスト … 各ページへのアクセス
  • ○ コントローラ … 各ページへの遷移条件や順序を管理

 シナリオ作成

スレッドグループ

今回の負荷テストでは用意したシナリオに、さらに次の条件をつけて設定しました。

  • アクティブユーザ数: 会員数の 1%
  • アクティブユーザのページ遷移間隔: 平均 5 秒

これに基づき下記のような設定を行って行きます

スレッド数: 50 (アクティブユーザ 50 人の想定)
Ramp-up期間(秒): 10 (ページアクセスを開始をばらけさせるため)
ループ回数: 5 (適度に繰り返して、より正確なデータを入手するため)

HTTP リクエスト初期値設定

「サーバ名または IP」にはテストしたいウェブページのアドレスを入力します。

これで以降登場する「HTTP リクエスト」のデフォルト値をいちいち変更する必要がなくなります。

HTTP クッキーマネージャ

クッキーを有効にするために、「HTTP クッキーマネージャ」をスレッドグループに追加します。

ガウス乱数タイマ

「アクティブユーザのページ遷移間隔: 平均 5 秒」を実現するためにタイマを設定します。

偏差: 2000
遅延時間オフセット定義: 5000

コントローラ&HTTP リクエスト

先に作成したシナリオに従って、下記のような構成・設定を行いました。

  1. ログインが必要でかつ未ログインである場合
    1. ログイン画面に遷移
    2. ログイン処理
  2. 次のうちどれかのページにランダムアクセス
    1. トップページ
    2. 商品検索
    3. 商品詳細
  3. 4/5の確立で商品詳細へのアクセスを続ける
  4. 直前に商品詳細にアクセスしていた場合
    1. カートに入れる
    2. 1/10の確立で注文処理

実際の画面では以下のような構成になっています。

 シナリオを実行する

シナリオを設定し終えたら、あとは実行するだけです!

ここでスレッドグループに「結果を表で表示」をコントローラに加えておくと、アクセスログがばんばん表示されるようになります。この結果を Excel に貼り付けて保存するもよし、グラフとして保存するもよしで、割といろいろなことができます。

 終わりに

触り始めは覚えるのが大変な JMeter ですが、一度慣れてしまえばいろいろなことができるので楽しめると思います。ここではそのごく一部しか紹介できませんでしたが、ぜひ試してみていただければと思います。

 参考文献

解答例 - 実習課題1 - 8.負荷テスト計画の立て方 | TECHSCORE(テックスコア)
http://www.techscore.com/tech/Java/ApacheJakarta/JMeter/answer/8-1/

JMeter の実践的な使用例として参考になります。

負荷テストあれこれ-JMeterの使い方-|A Day In The Boy's Life
http://ameblo.jp/itboy/entry-10039380165.html

コントローラの説明がていねいでわかりやすいです。

コントローラ(IFコントローラ) - JMeterガイド - livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/susatadahiro/d/%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CAIF%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%E9%A1%CB

わかりやすい IF コントローラの説明があります。

ガルーンの負荷テストをjmeterでやってみる|千代田区で働いていた元課長の退職日記
http://ameblo.jp/ys6872/entry-10355379947.html

よくわかるスレッドの解説が掲載されています。

TestLinkのインストールとお奨めチューニング

0

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

TestLinkはテスト管理システムの1つです。
以前から気になっていたけど、やっと導入したので、その時のインストール手順とお奨めチューニングを記載します。
Excel管理の課題からは解放されたけど、TestLinkもかゆい所に手が届かないので、上手く付き合っていく必要はあります。
その辺は別の機会に記載します。

●TestLinkダウンロード

$ cd /usr/local/src
$ sudo wget http://sourceforge.net/projects/testlink/files/TestLink%201.9/TestLink%201.9.4/testlink-1.9.4.tar.gz/download
$ sudo wget http://mattari.sumomo.ne.jp/wp/wp-content/uploads/2011/08/TestLink1-9-3-ja_JP.zip

●TestLinkインストール

$ cd /usr/local/src
$ sudo tar zxvf testlink-1.9.4.tar.gz
$ sudo mv testlink-ga-testlink-code testlink-1.9.4

$ sudo unzip TestLink1-9-3-ja_JP.zip
$ sudo mv testlink-1.9.4/locale/ja_JP testlink-1.9.4/locale/ja_JP,201211
$ sudo mv ja_JP testlink-1.9.4/locale/

$ sudo chown -R apache:wheel testlink-1.9.4
$ sudo mv testlink-1.9.4 /var/www/html/
$ ln -s /var/www/html/testlink-1.9.4 /var/www/html/testlink

●DBとユーザ追加

$ mysql -u root -p mysql
—- ここから —-
CREATE DATABASE testlink DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON testlink.* TO testlink@localhost IDENTIFIED BY ‘********’;
FLUSH PRIVILEGES;
\q
—- ここまで —-
※「Query OK」と表示されればOK

●TestLink設定変更(お奨めチューニング)

$ cd /var/www/html/testlink
$ cp -a custom_config.inc.php.example custom_config.inc.php
$ vi custom_config.inc.php
—- ここから —-
//### START 2012/11 ###
$tlCfg->default_language = ‘ja_JP’;
$tlCfg->log_path = TL_ABS_PATH . ‘logs/’;
$g_repositoryPath = TL_ABS_PATH . ‘upload_area/’;
$g_smtp_host = ‘localhost’;
$g_tl_admin_email = ‘admin@mydomain.com’;
$g_from_email = ‘testlink@mydomain.com’;
$g_return_path_email = ‘admin@mydomain.com’;
$g_tree_type=’JTREE’;
$tlCfg->treemenu_type = ‘EXTJS’;
$tlCfg->sessionInactivityTimeout = 86400;
$tlCfg->user_self_signup = FALSE;
$tlCfg->charts_font_path = “/usr/share/fonts/ipa-pgothic/ipagp.ttf”;
$tlCfg->document_generator->company_name = ‘株式会社**** 御中’;
$tlCfg->document_generator->company_copyright = ‘Copyright© ‘ . date(‘Y’) . ‘ 株式会社****’;
$tlCfg->document_generator->confidential_msg = ‘****事業部’;
$tlCfg->document_generator->company_logo = ‘company_logo.gif’;
$tlCfg->document_generator->company_logo_height = ’43’;
//### END ###
—- ここまで —-

$ cd /var/www/html/testlink/gui/themes/default/images
$ wget -c http://mydomain.com/images/logo.gif -O company_logo.gif
$ chmod 664 company_logo.gif

$ cd /var/www/html/testlink/locale/ja_JP
$ sudo cp -a strings.txt strings.txt,201211
$ sudo vi strings.txt
—- ここから —-
//### START 2012/11 ###
//$TLS_scope = “適用範囲”;
$TLS_scope = “概要”;
//### END ###
—- ここまで —-

●TestLink設定

http://mydomain.com/testlink/
[New installation]
Acceptance of License
■I agree to the terms set out in this license.
[Continue]
Verification of System and configuration requirements
[Continue]
Definition of DB access
Database name:testlink
Database admin login:testlink
Database admin password:********
TestLink DB login:testlink
TestLink DB password:********
[Process TestLink Setup!]
Installation was successful!
※「Failed! – Could not create user: ********!」と表示されるけどOK
[Testlink]
ログインしてください …
ログイン名:admin
パスワード:admin
[ログイン]
[My Settings]
Email:admin@mydomain.com
Locale:English(wide/UK) ->Japanese
[Save]
旧パスワード:admin
新パスワード:********
新パスワード(確認):********
[パスワード変更]

$ rm -fr /var/www/html/testlink/install

Teedaのsessionscopeについて

0

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

最新、Seasar2 + Teedaのプロジェクトを作成しているので、
Teedaのsessionscopeについてメモします。

Teedaには、スコープにはいくつかありまして、
そのうち、サブアプリケーションスコープ(@SubapplicationScope)がドキュメントの書いた通り、
同じ サブアプリケーション のページを表示している間維持されるスコープです。
サブアプリケーションスコープは, 初期表示 や リダイレクト表示 で 他の サブアプリケーション から遷移した際に開始されます。
初期表示 や リダイレクト表示 で他のサブアプリケーションのページが要求されると破棄されて, 新しいサブアプリケーションスコープが開始されます.

サブアプリケーションの入力画面が非常に多い時、とても便利なものです。
ただし、
——-
初期表示 や リダイレクト表示 で他のサブアプリケーションのページが要求されると破棄されて, 新しいサブアプリケーションスコープが開始されます.
——-
ということで、一連の操作の途中に万が一、同じブラウザで、別サブアプリケーションへアクセスすると、
一連の操作は続けられなくなってしまう可能性が十分ありますので、ご注意ください。

例えば、
Aというサブアプリケーションには
入力画面1~5、確認画面、完了画面からなります。
入力画面が多いので、全ての項目をhiddenで渡すと、しんどいので、
———–
@SubapplicationScope
public TestDto test;
———–
を定義して、入力画面の入力項目を格納しました。

偶然、入力画面2が開いている中、別のサブアプリケーションBの画面を見たくて、
同じブラウザで、Bの画面へアクセスしました。
そうすると、また、Aの入力画面2に戻って、次へボタンを押すと、testがNULLになって、
NullPoint例外が投げられました。
なぜでしょうかと考えると、@SubapplicationScopeの仕様にぴったりでした。

ある機能操作中、別機能の画面を見るのは少ないケースですが、ないわけではない。
@SubapplicationScopeを使用するとき、ご注意ください。

↑のケースにはどうしても操作を続けたいという希望があるので、
セッションを使うようにしました。

TestDtoを「@Component(instance = InstanceType.SESSION)」で定義して、
Page側で、セッションとして使うとき、
———-
    @Binding(bindingType = BindingType.MUST)
    protected TestDto testDto;
———-
のように定義すれば、testDtoはセッション級のものとして、使えます。
(※自動バインディングのルールとしてクラス名がTestDtoである場合、変数名はtestDtoにしないと、自動バインディングしてくれないのでご注意)

セッションから、removeは

最後の完了ページが表示されるとき、

    @RemoveSession(name={“testDto”})
    public Class prerender() {
        return null;
    }

すれば良いです。

Kindle Fire HD を Android 端末に変身させるハック!

0

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

よしだです。

最近になって Kindle Fire HD を手に入れたので、これをさらに便利に使う為の手順をまとめたいと思います。

 概要

Kindle Fire HD は Amazon 初の電子書籍向けタブレット端末です。

ベースは Android なのですが、アプリは Amazon が提供するストアで公開されているものしか利用することができません。

つまり、通常の Android 端末なら利用できる Dropbox や Dolphin ブラウザなどの便利なアプリが、使えない状態となっています(2012/1/9現在)。

そこで Kindle Fire HD に Android アプリを入れられるようにハックしていきます。

いわゆる root 奪取などの複雑な手順はいっさい必要ありません。

 準備

  • Kindle Fire HD のみ

(Kindle Fire でもいけると思いますが未確認です)

 手順

では、早速ハックしていきます。

1. アプリケーションのインストールを許可

まず野良の Android アプリをインストールできるように、設定を変更します。

Kindle Fire HD の画面上部から下に向かってスワイプするとメニューが降りてくるので、ここから「設定」> 「端末」>「アプリケーションのインストールを許可」を「オン」にします(画像1, 2)。

  • 画像1
  • 画像2

2. Android アプリをインストールするためのアプリ導入

apk ファイルから Android アプリをインストールできるアプリであればなんでも良いですが、ここでは利便性の高い ES File Manager を選択します。

「ホーム画面」>「アプリ」>「検索」から「ES File Manager」と検索して、トップに表示されたアプリをインストールします(画像3, 4)。

  • 画像3
  • 画像4

3. Android アプリが一覧できるストアアプリをダウンロード

「ホーム画面」>「ウェブ」から URL 直接入力で「http://www.1mobile.com/app/market」にアクセスします(画像5)。

開いたページの「Download」ボタンを押して、ストアアプリの apk ファイルをダウンロードします(画像6)。

  • 画像5
  • 画像6

4. ダウンロードしたストアアプリ導入

「ホーム画面」>「アプリ」>「端末」から、2. でインストールした「ES File Manager」を起動します。

「/mnt/sdcard/Downalod」に 3. でダウンロードした apk ファイルがあるので、これを選択してインストールします(画像7, 8)。

  • 画像7
  • 画像8

5. ストアアプリ起動

「ホーム画面」>「アプリ」>「端末」から、4. でインストールした「1mobile market」を起動します。

すると通常の Android 端末でみるようなストア画面が表示されます(画像9)。

  • 画像9

6. 好きなアプリをインストール!

あとはもう自由です。

欲しいアプリを検索してインストールしていく流れになります。

 おわりに

Kindle Fire HD は値段がお手頃なので、この手法と合わせることで安価な Android タブレットを入手できることになります。

ただし、公式にサポートされた方法ではないので、あくまで自己責任になります。

また「アプリケーションのインストールを許可」オプションは、セキュリティ面で危険が伴いますので注意してください。

Rails3 メールテンプレートにURL作成の注意点

0

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

メール本文中のURLはエスケープされて、「&」は「& amp;」になってしまう注意点

 URLを作成

メール中でURLを作成するため、url_forを使用します。

 URLにパラメータを追加

url_for(:action => ‘some_action’, :custom1 => ‘some_value’, :custom2 => ‘some_value’, :escape => false)

:escape => falseを指定しないと、urlがエスケープされます。

「&」は「& amp;」になってしまいます。

●注意点:

Rails3から、<%= … %>で出力される値が暗黙的にエスケープ処理されるように変更になりました。

ですので、メールテンプレートの中で、下記のように書いても、メールを表示するとき、エスケープされて、「&」は「& amp;」になってしまいます。

<%= url_for(:action => ‘/some_action’/, :custom1 => ‘/some_value’/, :custom2 => ‘/some_value’/, :escape => false) %>

●対策:

html_safeを使用

<%= url_for(:action => ‘/some_action’/, :custom1 => ‘/some_value’/, :custom2 => ‘/some_value’/, :escape => false).html_safe %>

or

rawを使用

<%= raw(url_for(:action => ‘/some_action’/, :custom1 => ‘/some_value’/, :custom2 => ‘/some_value’/, :escape => false)) %>

 :formatを指定する場合

url_for :controller=>’posts’, :action=>’index’, :format=>:xml

結果:

http://www.example.com/posts.xml

url_forの詳しい使用について、下記を参照のこと

ドキュメント:

http://apidock.com/rails/ActionMailer/Base

http://apidock.com/rails/ActionController/Base/url_for

【GoogleAnalytics】eコマース機能「収益」と「商品の収益」

0

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

GoogleAnalyticsのeコマース機能にある
『収益』 と 『商品の収益』 の定義、知っていますか?今回は、書いてあるようで書いてない、細かい定義を説明します。

※2012.12 撮影

■ Google Analytics の『収益』とは

上図の『収益』の説明を見てください。下記のように表記されています。

————————————————–
e コマース トランザクションの合計収益(税金と配送料を含む)です。
————————————————–

この表記のままで考えると
————————————————–
『収益』 = 「total(合計金額)」 + 「shipping(送料)」 + 「tax(税)」
————————————————–

だと思いますよね?

だが、しかし….
実際は異なるという情報をGoogleさんから回答頂きました。
正しくはこうです。
————————————————–
『収益』 = 「total(合計金額)」
※ _addTrans 内に存在する total の数値が採用される
————————————————–
みなさん、ご注意ください。

■Google Analytics の『商品の収益』とは

こちらはご想像通りかと思います。
————————————————–
『商品の収益』 = 「unit price(商品単価)」 × 「quantity(購入数量)」
※ _addItem 内に存在する unit price, quantity を掛けあわせた数値の合計
————————————————–

■「unit price(商品単価)」 × 「quantity(購入数量)」 = 「total(合計金額)」?

当然、Googleに渡す値によって異なるとは思いますが
————————————————–
「unit price(商品単価)」 × 「quantity(購入数量)」 = 「total(合計金額)」
————————————————–
になる会社さんが多いかもしれません。

ただし、以下のような場合は 
————————————————–
「unit price(商品単価)」 × 「quantity(購入数量)」 > 「total(合計金額)」 
————————————————–
という状況が成り立ちます。
————————————————–
例: 1,000円のT-Shirtを3枚購入。
  しかし500円の割引が適用され会計金額(total)は2,500円だった。
————————————————–
この場合の計測結果は以下の通り。

『商品の収益』 ¥3,000
『収益』¥2,500
※考え方
————————————————–
『商品の収益』 ¥3,000 = 「unit price(商品単価)」¥1,000 × 「quantity(購入数量)」3
『収益』¥2,500 =「total(合計金額)」¥2,500
————————————————–

※上記例のeコマーストラッキングデータ
————————————————–
_gaq.push([‘_addTrans’,
‘5555’, // order ID – required(注文ID)
‘Womens Apparel’, // affiliation or store name(ショップ名)
‘2500’, // total – required(合計金額)
‘125’, // tax(税)
‘315’, // shipping(送料)
‘渋谷区’, // city(市名)
‘東京都’, // state or province(都道府県)
‘日本’ // country(国名)
]);
_gaq.push([‘_addItem’,
‘5555’, // order ID – required(注文ID)
‘DD33’, // SKU/code – required(商品ID)
‘T-Shirt’, // product name(商品名)
‘Olive Medium’, // category or variation(カテゴリー)
‘1000’, // unit price – required(商品単価)
‘3’ // quantity – required(購入数量)
]);
_gaq.push([‘_trackTrans’]);
————————————————–

以上、何かのお役に立てれば幸いです。

[PR]アピリッツのGoogleアナリティクスサポートサービス

■Google アナリティクス セミナー・トレーニング

アピリッツでは、 Googleアナリティクスセミナー(無料・有料含む)を過去200回以上の開催をしております。ツールのことは勿論、事業内容であるシステム開発、デザイン制作、各ASPツールのサービス展開より得られた「売上向上・受注獲得のための現場のノウハウ」を重視し、皆様のビジネス上での成功をお手伝いできるようセミナーを展開しております。
– 入門編
– 分析手法編
– 設定編

■Google アナリティクス コンサルティング

Googleアナリティクスの導入・解析・運用・ナレッジ化をサポートします。
– コンサルティング
– レポーティング
– 導入・カスタマイズ

■リスティング広告出稿代行

[Google Partner] 当社は AdWords 認定資格に合格しています。

超簡単!!なTestLinkの使い方

0

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

今回はテスト管理ツール「TestLink」の使い方をスライド形式で紹介します。

■ 概要

「TestLink」はテスト管理ツールと呼ばれるもののひとつで、テスト項目を作って、それをテストして…という手順を一元管理する為のパッケージとなっています。

しかしこの TestLink。テスト管理ツールといえば!というくらい普及しているにもかかわらず、最新バージョンの日本語ドキュメントがなかったり、本体の翻訳も中途半端だったりと、少しとっつきにくい印象があります。

そこではじめての方にもわかるように、「できるだけわかりやすく」を意識して、スライドを作成しました。 少しでも参考にしていただければ幸いです。

■ 本編(スライド)

■ 参考文献

[小ネタ] トップレベルの定数(クラス/モジュール)の取得

0

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

ネストしたクラスなどの内部からトップレベルの定数を呼び出す小ネタ

 クラスが呼び出せない!

Rubyでは「ModuleA::ModuleB::ClassC」のようにモジュールやクラスの中に子クラスを作って名前空間をわけることができるようになっています。

module A
  module B
    class C
      def self.test
        return B
      end
    end
  end
end

class B
end

上記コードではモジュールBとクラスBで名前が被っていますが、スコープが異なるので問題ありません。

ここでA::B::C.testを実行すると

モジュールA::B

が返ってきます。

クラスA::B::C内部からトップレベルにあるクラスBを呼び出したい場合はどうすればよいでしょうか。

 解決策

return B

としていた箇所を

return ::B

のように演算子”::”をつけて呼び出すだけです。

設計をちゃんとしろよ、という声も聞こえてきそうですが

依存ライブラリなどの都合で名前を変えることができないということは、よくあります。

とはいえ同じ名前のモジュール・クラスなどの定数が散在しているのは

混乱の元となります。

開発する箇所ではまず、

汎用的すぎず(重複しにくく)可読性の高い命名を心がけたいものです。

————–

動作環境

CentOS 6.3

ruby 1.9.3p194

ホストベース認証

0

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

rick No27です。
ssh接続等のパスワードを省略するもので、接続先に接続者と公開鍵とユーザを登録しておくことで可能となります。

設定方法

【接続元サーバ】
ホスト名:a-host
ユーザ名:aserver
【接続先サーバ】
ホスト名:b-host
ユーザ名:bserver

設定方法

a-hostの処理

$ su –
# ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -C ” -N ”
# scp /etc/ssh/ssh_host_rsa_key.pub b-hostのIP:/tmp/
sshdでないので注意
# vi /etc/ssh/ssh_config
—————————————
EnableSSHKeysign yes
HostbasedAuthentication yes
—————————————

b-hostの処理

$ su –
a-hostから送られてきた公開鍵をssh_known_hostsに書き込む
a-hostの後に半角の空白を開けていることに注意
# ( echo -n ‘a-host ‘ ; cat /tmp/ssh_host_rsa_key.pub ) >> /etc/ssh/ssh_known_hosts
# vi /etc/ssh/shosts.equiv
—————————————
a-host aserver
—————————————
# vi /etc/ssh/sshd_config
—————————————
HostbasedAuthentication yes
—————————————
# service sshd restart

接続

a-host

$ ssh bserver@b-host

Windows環境でnetbeansを使用して、Ruby&Rails開発を行う。

0

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

自分がRuby&Rails開発の初心者です。

VisualStudioとEclipseでの開発が慣れた僕にっとて、vimエディターの開発はすごく不便です。いろいろ試して、netbeansを使用しています。

 前言

自分がRuby&Rails開発の初心者です。

VisualStudioとEclipseでの開発が慣れた僕にっとて、vimエディターの開発はすごく不便です。

vimのRailsプラグインを入れても、やりづらい感じです。

開発効率が良くないです。

いろいろ試して、下記の開発環境にしました。

実行環境:CentOS

開発環境:Windows

開発ツール:netbeans WinSCP

Windows環境で、netbeansでコーディングして、WinSCPを利用して、CentOSサーバにファイルを送ります。

僕と似たような方がいれば、参照できると思って、この記事を作成しました。

 vimエディタの不便

vimエディタでは、下記の行動はできないです。

・関数の宣言へ行く

・ファイルの比較

・関数を使用している箇所

・プロジェクト範囲の文字列検索/置換

・プロジェクト範囲のファイル検索

・インデント

・コミットする前に、修正箇所確認

etc

 NetBeans導入

NetBeans IDE 7.2はhttp://netbeans.org/から無料で入手できます。

Windows, Mac OS X, Linux, Solarisなどにインストール可能です。

JDKまたはJRE(バージョン6以上)が必要です。

http://www.oracle.com/technetwork/java/javase/downloads/index.htmlから入手(無料)してインストールしてください。

NetBeansではRuby on Railsの開発しかしない方は、ダウンロードバンドルから「すべて」を選んで、

インストール時にコンポーネントを「ベースIDE」だけに限定することをお勧めいたします。

 Ruby on Rails プラグインのインストール

  1. メニューから[ツール]→[プラグイン]を選択
  2. [設定]タブを選択
  3. [追加]ボタンをクリック
  4. [名前]に「Community Ruby」、[URL]に

 https://blogs.oracle.com/geertjan/resource/nb-72-community-ruby.xml と入力

  1. [OK]ボタンをクリック
  2. [使用可能なプラグイン]タブを選択
  3. [更新の確認]ボタンをクリック
  4. [検索]ボックスに「ruby」と入力
  5. [Ruby and Rails]にチェックを入れる
  6. [インストール]ボタンをクリック
  7. [次へ]ボタンをクリック
  8. [すべてのライセンス契約条件に同意する]をチェック
  9. [インストール]ボタンをクリック
  10. 「次のプラグインは署名されていますが信頼されていません」という警告が出たら[続行]ボタンをクリック
  11. [完了]ボタンをクリック

ここでNetBeansが再起動されます。

 NetBeansのメリット

いろいろな機能がありますが、ここで自分がよく使う機能を紹介します。

●自動補完機能

「.」を入力して、メソッドリストが表示されます。

●「使用情報を検索」

メソッド、クラス、変数、定数などを選択して、右クリックして、「使用情報を検索」を選択すれば、

使用している箇所が表示されます。

●ナビゲータ

ファイル内に定義したメソッド、定数、変数一覧が表示されます。

クリックすると、すぐ飛びます。

●フォーマット Alt+Shit+F

右クリック、フォーマット、インデント一括修正できます。

●名前変更(Ctrl+R)

一括変更できます。

●編集メニュー

検索

置換

プロジェクト内検索

プロジェクト内置換

●宣言へ移動

●GitとSubversion

差分とか確認しやすい。

GUIで修正箇所を比較してから、コミットできるため、ミスが生じしにくいです。

●同時に複数ファイルを開くことができます。

●GUIでファイル比較

 WinSCP

導入と利用方法は簡単なので、省略します。

ダウンロードURL:

http://sourceforge.jp/projects/sfnet_winscp/downloads/WinSCP/5.1.2/winscp512setup.exe/

VirtualBoxのゲストマシン(CentOS)の時刻ずれ問題の対策

0

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

Ruby&Rails開発のために、VirtualBoxのゲストマシン(CentOS)を使用しています。

毎日、ゲストOSをシャットダウンせずに、「仮想マシンの状態を保存」を利用しています。

仮想マシンの状態を保存の機能が便利ですが、時刻ずれが生じしてしまいます。

Ruby&Rails開発のために、VirtualBoxのゲストマシン(CentOS)を使用しています。

毎日、ゲストOSをシャットダウンせずに、「仮想マシンの状態を保存」を利用しています。

仮想マシンの状態を保存の機能が便利ですが、時刻ずれが生じしてしまいます。

ログの不整合など問題があります。

毎日、dateコマンドで、時刻を直していますが、面倒です。

下記設定を実施すると、起動時に、自動的に時刻が正しく設定されます。

# vi /etc/ntp/step-tickers

下記のntpdサーバを追加する。

ntp.nict.jp

ntp.jst.mfeed.ad.jp

NTPサーバ停止

# /etc/rc.d/init.d/ntpd stop

NTPサーバ起動

# /etc/rc.d/init.d/ntpd start

一緒に始めようSencha Touch 2.0 入門編: 第2回 Sencha Touchで作れるUI

0

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

お久しぶりです。だーますです。

前回の投稿から5ヶ月程空いてしまいましたが、今回はSencha Touch 2.0で作ることができるUIについてざっくり解説させていただこうと思います。

 基本の書き方

前回と同じように、Sencha Touchのフォルダ(sencha-touch-2.0.1.1)が入った適当なフォルダを作ります。

※本稿執筆時点での最新版は2.1ですがそちらでもOKです

そこに、以下のようなファイルを置きます。

index.html

<!DOCTYPE html>
<html>
    <head>
        
        <title>Sencha Touch App</title>
        <link rel="stylesheet" type="text/css" href="sencha-touch-2.0.1.1/resources/css/sencha-touch.css" />
        <script type="text/javascript" src="sencha-touch-2.0.1.1/sencha-touch-all-debug.js"></script>
        <script type="text/javascript" src="app.js"></script>
    </head>
    <body></body>
</html>

app.js

Ext.application({
    viewport: {
        autoMaximize: true
    },
    launch: function() {
        Ext.Viewport.add({
            xtype: 'container',
            defaults: {
                margin: 5
            },
            items: [{
                // ここにUIを記述
            }]
        });
    }
});

要するに、sencha-touch.cssとsencha-touch-all-debug.jsが読み込まれ、その上でapp.jsの内容を実行できればOKです。

ここより先のソースコードは、Ext.Viewport.addの中身だけ記述させていただきます。

なお、”autoMaximize: true”はスマートフォンで閲覧した際にナビゲーションバーを隠す記述、

“defaults”内の”margin: 5″は子コンポーネントすべてにデフォルトで5pxのマージンを設定する記述です。

 Sencha Touch 2.0 のUI (一例)

コンテナー (container)

様々なUIを配置するための、基本となるコンポーネントです。

Ext.Viewport.add({
    xtype: 'container',
    html: 'Hello,World!'
});

入れ子構造もできます。”layout”で区切る方向を指定できます。

Ext.Viewport.add({
    xtype: 'container',
    defaults: {
        margin: 5,
    },
    items: [{
        xtype: 'container',
        layout: 'vbox',
        items: [{
            xtype: 'container',
            html: 'コンテナ1'
        }, {
            xtype: 'container',
            layout: 'hbox',
            items: [{
                xtype: 'container',
                html: 'コンテナ2'
            }, {
                xtype: 'container',
                html: 'コンテナ3'
            }]
        }]
    }]
});

ラベル (label)

ラベルです。文字を表示することに特化したコンポーネントです。

Ext.Viewport.add({
    xtype: 'container',
    defaults: {
        margin: 5
    },
    items: [{
        xtype: 'label',
        html: 'Hello,World!'
    }, {
        xtype: 'label',
        html: 'This is Sencha Touch 2.0'
    }]
});

ボタン (button)

ボタンです。”ui”を変えることで色や形状が変えられます。

Ext.Viewport.add({
    xtype: 'container',
    defaults: {
        margin: 5
    },
    items: [{
        xtype: 'button',
        text: 'button'
    }, {
        xtype: 'button',
        ui: 'action',
        text: 'ui:action'
    }, {
        xtype: 'button',
        ui: 'decline',
        text: 'ui:decline'
    }, {
        xtype: 'button',
        ui: 'confirm',
        text: 'ui:confirm'
    }, {
        xtype: 'button',
        ui: 'forward',
        text: 'ui:forward'
    }, {
        xtype: 'button',
        ui: 'back',
        text: 'ui:back'
    }, {
        xtype: 'button',
        ui: 'round',
        text: 'ui:round'
    }, {
        xtype: 'button',
        ui: 'small',
        text: 'ui:small'
    }]
});

テキストボックス (textfield)

テキストボックスです。”placeHolder”でプレースホルダを設定できます。

Ext.Viewport.add({
    xtype: 'container',
    defaults: {
        margin: 5
    },
    items: [{
        xtype: 'textfield'
    }, {
        xtype: 'textfield',
        placeHolder: 'this is textfield'
    }]
});

イメージ (img)

画像を表示するためのコンポーネントです。高さ・幅を、表示する画像に合わせて設定しておく必要があります。

Ext.Viewport.add({
    xtype: 'container',
    defaults: {
        margin: 5
    },
    items: [{
        xtype: 'img',
        src: 'icon.png',
        width: 57,
        height: 57
    }]
});

マップ (map)

Googleマップを表示できます。

Ext.Viewport.add({
    xtype: 'map',
    layout: 'fit'
});
http://doruby.kbmj.com/darmasu/files/002061.PNG

使うにはindex.htmlでGoogleマップのAPIを読み込んでおく必要があります。

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>

ツールバー (toolbar)

ツールバーです。”docked”によって画面の上や下に配置できます。

“ui”で色を変えられる他、ツールバー内にボタンやテキストボックスを設定することもできます。

Ext.Viewport.add({
    xtype: 'container',
    html: 'コンテナ',
    items: [{
        xtype: 'toolbar',
        docked: 'top',
        title: 'toolbar',
        items: [{
            xtype: 'button',
            ui: 'back',
            text: 'back'
        }]
    }, {
        xtype: 'toolbar',
        docked: 'bottom',
        ui: 'light',
        title: 'ui:light',
        items: [{
            xtype: 'button',
            text: 'button'
        }]
    }, {
        xtype: 'toolbar',
        docked: 'top',
        ui: 'neutral',
        items: [{
            xtype: 'textfield',
            placeHolder: 'textfield inside toolbar'
        }]
    }]
});

タイトルバー (titlebar)

toolbarの仲間ですが、役割が若干違います。

子コンポーネントの配置を”align”で変えられるのが大きな違いでしょうか。

Ext.Viewport.add({
    xtype: 'container',
    items: [{
        xtype: 'titlebar',
        title: 'TitleBar',
        items: [{
            xtype: 'button',
            align: 'left',
            text: 'left button'
        },{
            xtype: 'button',
            align: 'right',
            text: 'right button'
        }]
    }]
});

タブバー (tab)

タブによってページを切り替えるコンポーネントです。

画面上に配置する他、iOSでお馴染みの画面下タブもつくれます。

上に配置する場合
Ext.Viewport.add({
    xtype: 'tabpanel',
    items: [{
        xtype: 'container',
        title: 'tab 1',
        html: 'コンテナ1'
    }, {
        xtype: 'container',
        title: 'tab 2',
        html: 'コンテナ2'
    }]
});
下に配置する場合
Ext.Viewport.add({
    xtype: 'tabpanel',
    tabBarPosition: 'bottom',
    items: [{
        xtype: 'container',
        title: 'tab 1',
        iconCls: 'home',
        html: 'コンテナ1'
    }, {
        xtype: 'container',
        title: 'tab 2',
        iconCls: 'user',
        html: 'コンテナ2'
    }]
});

カルーセル (carousel)

フリックでページ切り替えを行うコンポーネントです。

Ext.Viewport.add({
    xtype: 'carousel',
    items: [{
        xtype: 'container',
        html: 'page 1',
        style: {
            // わかりやすいように各ページに色を付けてます
            'background-color': '#FFFFFF'
        }
    }, {
        xtype: 'container',
        html: 'page 2',
        style: {
            'background-color': '#AAAAAA'
        }
    }]
});

画面だけでは動きがわかりづらいので写真も用意しました。

フォーム (form)

色々な入力形式が使えるフォームです。以下は一例です。

Ext.Viewport.add({
    xtype: 'formpanel',
    items: [{
        xtype: 'fieldset',
        title: 'Form',
        items: [{
            xtype: 'textfield',
            label: 'text'
        }, {
            xtype: 'spinnerfield',
            label: 'spinner'
        }, {
            xtype: 'selectfield',
            label: 'select',
            options: [
                {text: 'option 1'},
                {text: 'option 2'},
                {text: 'option 3'}
            ]
        }, {
            xtype: 'datepickerfield',
            label: 'date'
        }, {
            xtype: 'sliderfield',
            label: 'slider'
        }, {
            xtype: 'togglefield',
            label: 'toggle'
        }]
    }]
});
selectfieldを呼び出した画面
datepickerfieldを呼び出した画面

リストビュー (list)

様々なデータを表示できるリストです。

Ext.Viewport.add({
    xtype: 'list',
    data: [
        {text: 'エインヘリアル'},
        {text: '黄金航路'},
        {text: '式姫草子'},
        {text: '星海'},
        {text: 'リトルデビルズダイアリー'}
    ]
});

この画像では、「式姫草子」をタップして選択状態にしました。

store, proxy, readerと組み合わせればAjaxやJSONPリクエストで取得したものを動的に表示できたりしますが、

それについてはいつかまた説明します。

 他にも魅力的なUIがいっぱい

Sencha Touch 2.0には他にも、前回取り上げたナビゲーションビューや、

ポップアップダイアログ、アクションシート、モーダルなどといった

魅力的なUIが揃っています。

そのすべてをここに記述するのは難しいので、

もっと知りたいという方は、是非ドキュメントKitchen Sink(サンプル集)をチェックしてみてください。(WebKitブラウザで見てください)

 次回予告

次回は、今回一緒に説明させていただく予定だったコンポーネントをクラス定義する方法も含め、

Sencha Touchのクラスシステムについて触れようと思います。

近日中に更新します。

Amazon EC2のインスタンスに固定のIPアドレス(Elastic IP)を持たせる

0

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

こんにちは。アピリッツの本多です。

間が開きましたが、引き続きAWSの記事です。

今回はAmazon EC2のインスタンスをに固定IPアドレス(Elastic IP。以下EIP)を設定する方法を紹介します。

1.AWS Management Console Homeにログイン

前回紹介したので省略します。

2.EC2 Management Consoleに移動

こちらも前回と同様

3.EIP一覧に移動

赤枠のリンクをクリック

4.EIPを新規発行

赤枠のボタンをクリック

確認画面が出るので、「EC2」を選択している事を確認して「Yes,Allocate」をクリック

成功するとEIP一覧にIPアドレスが追加されます。

この状態のままではEC2インスタンスと紐付けられていないので、さらに設定が必要です。

5.EIPをEC2インスタンスに関連付ける

発行したEIPにカーソルを合わせて右クリック⇒「Associate」をクリック

関連付ける対象のインスタンスを選択して「Yes,Associate」をクリック

成功すると、上記のようにEIP一覧にてインスタンスと関連付けられた事が分かるようになります。

また、インスタンス一覧から詳細を確認すると、画像の赤枠部分がこれまでのpublic DNSからEIPに変化している事がわかります。

あとは、EIPでインスタンスにSSHログイン出来る事等を確認すればOKです。

あとがき

今回は比較的簡単な設定のため、手順も少ないです。

public DNSのままではインスタンス再起動等の拍子に変化する場合があるとの事なので、実際に利用する際はEIPを発行しておいた方が便利だと思います。

エレコマの導入手順@FreeBSD

0

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


よしだです。

2週連続の投稿となる今回は、前回予告した通り FreeBSD へのエレコマの導入手順を紹介したいと思います。

0. Ports Collection + Ruby on Rails のインストール

今回はこの部分の説明を割愛します。

前回の記事『FreeBSD に任意バージョンの Ruby on Rails を導入する』が参考になると思います。

1. ImageMagick のインストール

まずは エレコマの商品画像処理に使われている ImageMagick を導入していきます。

今回はインストール前の設定で SVG ライブラリをインストールしないようにオプションから外しています。

これは SVG ライブラリインストールの際に GTK および X Window System が必要になって、不要な時間・ディスク容量を費やすのを避けるためです。

# cd /usr/ports/graphics/ImageMagick
# make config-recursive
(ここで ImageMagick の SVG オプションを解除)
# make install clean

2. PostgreSQL のインストール

今回 DB にはエレコマで公式サポートしている PostgreSQL を利用することにします。

サポートはされていませんが、MySQL での導入も可能です。

# cd /usr/ports/databases/postgresql83-server
# make install clean
# echo 'postgresql_enable="YES"' >> /etc/rc.conf
(次回ブート時に自動起動)
# /usr/local/etc/rc.d/postgresql initdb
(DB設定などがない状態なので、このコマンドで初期化)
# /usr/local/etc/rc.d/postgresql start
(サービス開始)

3. git のインストール

エレコマの最新ソースコードは GitHub から入手可能です。

ここではダウンロードに必要なバージョン管理ツール git をインストールしておきます。

# cd /usr/ports/devel/git
# make config-recursive
# make install clean

4. 必要な Gem のインストール

エレコマに必要となる Gem をインストールします。

一部古いバージョンの Gem も含まれますが、互換性を考え、README に合わせてインストールするのが無難でしょう。

# gem install rmagick -v 2.12.2
# gem install postgres
# gem install gettext -v 2.1.0
# gem install gruff -v 0.3.6
# fetch http://www.artonx.org/data/lhalib/lhalib-0.8.1.gem
# gem install lhalib-0.8.1.gem
# gem install webmock -v 1.3.4
# gem install thoughtbot-factory_girl -v 1.2.2 --source http://gems.github.com
# gem install json
# gem install daemons

5. 一般ユーザに切り替え

ここでエレコマを実際に動かすことになる一般ユーザに切り替えます。

今回は ec というユーザを作成し、このユーザの権限の元でエレコマを実行させます。

# pw useradd ec -m
# passwd ec
(パスワードは適当に elecoma を設定)
# su - ec

6. エレコマのダウンロード

一般ユーザに切り替えたところで、早速エレコマ本体をダウンロードします。

% git clone git://github.com/elecoma/elecoma.git
% cd elecoma

7. DB 設定をFreeBSD 向けに変更

次にデータベースの設定を FreeBSD に合わせて変更していきます。

エレコマの設定は CentOS に最適化されているので、PostgreSQL のデフォルトのユーザ名など、細かいところに相違があるようです。

% id postgres
id: postgres: no such user
(CentOS 版 PostgreSQL のデフォルトユーザ名 postgres が存在しない?!)
% id pgsql
uid=70(pgsql) gid=70(pgsql) groups=70(pgsql)
(FreeBSD では pgsql という名前で登録されています)

早速この点に修正を加えます。

% cp config/database.example.yml config/database.yml
% vim config/database.yml
(「portgres」となっている部分を「pgsql」に変更)
% diff config/database.yml config/database.example.yml
3c3
<   username: pgsql
---
>   username: postgres

8. 各種プラグインのインストール

エレコマに必要となるプラグインをインストールします。

これも Gem と同様に、一部古いプラグインが含まれますが、ここでは動作の安全性を優先します。

この部分は、ほぼ README のコピペになるので、リンク切れ等があるばあいは適宜修正して利用してください。

% ruby script/plugin install git://github.com/realityforge/rails-active-form.git
% ruby script/plugin install git://github.com/rails/acts_as_list.git
% ruby script/plugin install git://github.com/technoweenie/acts_as_paranoid.git
% ruby script/plugin install git://github.com/rails/acts_as_tree.git
% ruby script/plugin install http://topfunky.net/svn/plugins/ar_fixtures/
% ruby script/plugin install git://github.com/jpmobile/jpmobile.git -r 'tag 0.0.8'
% ruby script/plugin install http://taslam-plugins.googlecode.com/svn/trunk/jpmobile_emoticon_filter/
% cd vendor/plugins
% git clone git://github.com/tmtysk/mbmail.git mbmail
% cd mbmail
% git checkout 654ce3ec2dfa10ac3b05cd9354eb84456d206a6d
% rm -fr lib/jpmobile
% rm -fr .git
% cd ../../..
% ruby script/plugin install git://github.com/jamesgolick/resource_controller.git
% ruby script/plugin install git://github.com/mislav/will_paginate.git -r 'tag 2.3.6'
% cd vendor/plugins/
% git clone  git://github.com/mislav/will_paginate.git
% cd will_paginate/
% git checkout origin/2-3-stable
% cd ../../..
% ruby script/plugin install git://github.com/kakutani/yaml_waml.git
% ruby script/plugin install git://github.com/rails/ssl_requirement.git
% ruby script/plugin install git://github.com/DianthuDia/double_submit_protection.git
% ruby script/plugin install git://github.com/champierre/image_submit_tag_ext.git
% ruby script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 'tag 1.2.9'
% ruby script/plugin install git://github.com/dchelimsky/rspec.git -r 'tag 1.2.9'

9. DBを作成する……しかし……

ここまできたら、次は DB の作成! となるのですが、どうやらうまく実行できないケースがあるようです。

今回インストールを試した環境では、下記のようなエラーが発生し、DB の作成が失敗してしまいました。

% rake db:create
WARNING: 'require 'rake/rdoctask'' is deprecated.  Please use 'require 'rdoc/task' (in RDoc 2.4.2+)' instead.
    at /usr/local/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rdoctask.rb
rake aborted!
no such file to load -- iconv

エラーによれば iconv というライブラリが不足しているようなので、これをインストールします。

ここで注意点は、iconv そのものではなく、Ruby 向けの ruby-iconv をインストールしなければならないことです。

% exit
# cd /usr/ports/converters/ruby-iconv
# make install
# su - ec

無事にインストールが終われば、ec ユーザに戻り、もう一度 DB 作成に挑戦します。

10. あらためて DB 作成を作成する

必要なライブラリを揃えたところで、もう一度 DB の作成を実行します。

今度はうまくいき、DBの作成に成功します(※1)。

% rake db:create

11. DB を初期化する

データベースにテーブルを作成します。

また、管理画面へのアクセスに必要な管理者情報も、この段階でデータベースに登録しておきます。

% rake db:migrate
% rake db:fixtures:load FIXTURES=admin_users

12. エレコマを起動する!

最後に Rails の簡易サーバを利用して、エレコマを立ち上げます。

% ruby script/server

http://<エレコマをインストールしたマシンのIPアドレス>:3000/ にアクセスすると、エレコマのトップページが確認できます!

 最後に

今回は史上初となる(?)エレコマの FreeBSD への導入とその手順を紹介しました。

エレコマに関する設定や細かいインストール手順をかなり端折って説明しているので、詳しい説明については下記の関連記事を参照していただければ幸いです。

  1. ECサイト構築パッケージ「エレコマ」のインストール手順@Ubuntu 10.10
  2. ECサイト構築パッケージ「エレコマ」の初期設定@Ubuntu 10.10

 備考

※1 DB 作成時に発生する WARNING への対処

手順 10. の段階で DB の作成には成功しますが、下記のような WARNING が出力されてしまいます。

% rake db:create
WARNING: 'require 'rake/rdoctask'' is deprecated.  Please use 'require 'rdoc/task' (in RDoc 2.4.2+)' instead.
    at /usr/local/lib/ruby/gems/1.8/gems/rake-0.9.2.2/lib/rake/rdoctask.rb
WARNING: Global access to Rake DSL methods is deprecated.  Please include
    ...  Rake::DSL into classes and modules which use the Rake DSL methods.
WARNING: DSL method Spec::Rake::SpecTask#task called at /home/ec/elecoma/lib/tasks/rspec.rake:15:in `initialize'
(以下略)

どうやらこれは rake 0.9 と Rails 2 の相性が悪いことに起因するもののようです。

そういうわけで rake をダウングレードしてみます。

% rake --version
rake, version 0.9.2.2
(このバージョンと Rails の相性が悪いらしい)
% exit
# gem uninstall rake
(本当に消しても良いか、と聞かれるので Y[Enter] で続行)
# gem install rake -v=0.8.7
# su - ec
% rake db:create

ダウングレード後にDB 作成を実行すると、今度は WARNING が出力されず、無事に DB が作成できます。

FreeBSD に任意バージョンの Ruby on Rails を導入する

0

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

よしだです。

今回は FreeBSD に任意バージョンの Ruby + Ruby on Rails を導入する方法を紹介します。

 概要

FreeBSD ではソフトウェアのインストールに Ports Collection というシステムを利用します。

このシステムを利用して Ruby + Ruby on Rails をインストールすると、デフォルトでは Ruby 1.8 と Rails 3.2 が入ります(FreeBSD 8.3 の場合)。ところが、Ruby や Ruby on Rails はバージョンによってかなり挙動が違ってきます。特定のバージョンをインストールしたいというシーンは少なからずあると思います。

そこで今回は、FreeBSD の Ports Collection を利用して、簡単に任意バージョンの Ruby + Ruby on Rails を導入する方法を紹介します。

 導入手順

0. Ports Collection をインストールする

FreeBSD インストール直後で Ports Collection の導入が済んでいない場合は、root ユーザで下記のコマンドでインストールします。

# portsnap fetch
# portsnap extract

これで /usr/ports 以下に、各ソフトウェアのインストールに必要なファイルがまとめられたディレクトリ(このまとまりをスケルトンといいます)がカテゴリ分けされた状態で配備されます。

1. 任意バージョンの Ruby をインストールするための準備

Ports Collection からは Ruby 1.8 か Ruby 1.9 を導入することができます。

Ruby に依存するソフトウェを導入する際に、デフォルトでは Ruby 1.8 がインストールされます。

ここで Ruby 1.9 をインストールしたい場合は、/etc/make.conf に Ruby 1.9 を利用することを明示することで実現できます。

# echo 'RUBY_DEFAULT_VER=1.9' >> /etc/make.conf

どちらのバージョンを導入するにしても、Ruby 自体のインストールを明示的に行う必要はなく、Ruby が必要になったときに Ports Collection が自動で導入してくれます。便利ですね。

2. RubyGems をインストールする

まずは Ruby on Rails に必要不可欠であるプラグインシステム、RubyGems をインストールします。

RubyGems はさまざまなプラグインの管理を行う一方で、Ruby on Rails のインストールまで行えるという優れものです。FreeBSD には、この RubyGems を最小限構成で導入するための port スケルトンが用意されています。

今回はこれを利用することで導入にかかる時間の短縮を図ります。

# cd /usr/ports/www/rubygem-rails-app-installer
# make config-recursive
(インストール時の設定を、依存ソフトウェア分もあわせて先に済ませてしまう)
# make install clean
(ここで Ruby とその他の必要なソフトウェアがインストールされる)

ここでのポイントは、インストール前に「make config-recursive」というコマンドを実行することです。

このコマンドはソフトウェアに必要な設定を、依存するソフトウェアの分も含めて、あらかじめ行うことができます。こうすることで、ソフトウェアごとに設定ダイアログが出現し、インストール作業が中断されるのを防ぐことができます。

3. 任意バージョンの RubyGems をインストールする

(この手順は、必要がなければ飛ばしてもかまいません)

RubyGems にもバージョンがあり、環境によっては特定バージョンの導入が必要なケースもあります。

FreeBSD 上には、バージョンごとの RubyGems の port スケルトンは存在しません。

そこで下記のように、RubyGems 自身の機能を利用してアップグレードもしくはダウングレードさせます。

# rehash
(先ほど gem コマンドが入ったばかりなので、csh の場合、PATH の再読み込みが必要)
# gem install rubygems-update -v=<インストールしたいバージョンの番号>
# rehash
(先ほどのコマンドで update_rubygems コマンドが入ったばかりなので、同上)
# update_rubygems

4. 任意バージョンの Ruby on Rails をインストールする

ここまでの手順で Ruby on Rails を導入するための準備は整いました。

Ruby on Rails は RubyGems を利用することで、簡単に導入することができます。

# gem install -v=<インストールしたいバージョンの番号> rails

とっても簡単ですね。

 おわりに

今回は FreeBSD 8.3 での利用を例に、任意バージョンの Ruby + Ruby on Rails を導入する方法を紹介しました。

次回はこの手順を利用して、Ruby on Rails 2.3 という少し古いシステムが必要になる『エレコマ』を、FreeBSD に導入する方法を紹介したいと思います。

最近人気な記事