ホーム ブログ ページ 52

モバイルアクセス解析から検索シェアを見る

0

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

今回は、モバイルアクセス解析から検索エンジンのシェアを見ていきます。
PCサイトに比べ、解析もSEOも難しいモバイルサイトの実情を探ります。

どうもです。アクセス解析チーム アソウリュウタロウです。

最近はモバイル解析の担当案件が増えていて、仕事中ずっとケータイをいじくり回していることもしばしば。滅多に使わなかった自分のケータイは、いまや過酷な使用環境ゆえに充電器と繋がりっぱなしです。

モバイルアクセス解析の現状

いまのところ、モバイルアクセス解析は難題です。

現状では無料アクセス解析ツールではまともな解析は難しいでしょう。
Google Analyticsは、2010年2月に公式ブログでモバイル対応をアナウンスされましたが、実際のところ未だにまともな数字は取れそうにありません。
無料ツールでは「うごくひと2」「myRTmobile」など、いくつか数値が見られるツールも出てきてますが、PCサイトに比べればまだまだ発展途上な分野かと思います。

さて、そんなモバイル解析環境ですが、解析だけでなくSEOなども対策がしづらいことでも有名です。PCサイトほど評価項目が多くなく、各施策に対する効果や危険性があまり明確化されていないのです。

そもそも大前提として、ユーザーがキャリア公式を使っているのか、YahooやGoogleといったモバイル版検索エンジンを使っているのかすら定かではないので、対策が取りづらいといったことも言えます。

というわけでちょっと調べてみました。

任意の期間における検索エンジンユーザーのエンジン別比率

強いのはキャリア公式

弊社のお客様のいくつかのモバイルサイトから数値を抽出し、平均値にまとめています。

i-mode(docomo)はリファラー情報が取れない機種が多いため、あくまでも参考値にしかなりませんが、EZweb、SoftBankでは公式メニュー検索エンジンが非常に強くなっているのが分かります。

特にSoftBankのYahoo率は非常に高く、通常の検索だけでなく画像検索なども含めて、98%の使用率となっています。

ある機関によるアンケート結果では、公式メニューの検索の使用率は約40%といった結果が出ていましたが、その数値ともだいぶ乖離があります。

コンテンツやターゲット層など、サイトによっても大きく結果が変わってくる可能性はありますが、この数値を見る限り、キャリア公式メニューの使用率は高く、それだけ公式サイト優勢の現状は揺るがないと言えそうです。

■AppiritsのGoogle アナリティクスセミナー

AppiritsのGoogle アナリティクスセミナーは、初期設定から機能解説、仕組の理解までさまざまな内容を用意しています。
ご興味のある方は是非弊社セミナーにご参加ください。

Google アナリティクス セミナー インターフェイス編
Google アナリティクスのレポート画面が把握できていない方向けの講座。
レポート画面の解説や既存機能の活用法、マルチチャネルなどの新レポートのインターフェイスを解説します。

Google アナリティクス セミナー 分析手法編
インターフェイスは把握しているが、数値の意味や考え方がよく分からないという方向けの講座です。 アクセス解析を用いた課題抽出やサイト改善の考え方を解説します。

Google アナリティクス セミナー 徹底設定編
現状のGoogle アナリティクスで取得可能な数値に物足りない方向けの講座。
外部サイトへの誘導やソーシャルボタン連携、eコマース機能などのカスタマイズ方法をレクチャーします。

エラーページ(404.html)をGoogleAnalyticsで計測する方法

0

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

アクセス解析チーム中林です。

こんにちは。

今日はHTTPステータスコード404のエラーページを

GoogleAnalyticsで取得する方法のご紹介をします。

最近はGoogleAnalyticsの非同期タグが

推奨されるようになって、サイトをみていても

よく見かけてくるようになってきました。

でもまだ、非同期タグに移行できなかったりする方も

多くいるかと思いますので

今日は、404エラーページをGoogleAnalyticsでトラッキングする方法を

埋め込んでいるタグの形式に合わせてご紹介しますね。

まず非同期のトラッキングコードから・・・

■ga.js(非同期タグ)

<script type="text/javascript">var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
_gaq.push(['_trackPageview', '/404.html?page=' + document.location.pathname + document.location.search + '&from=' + document.referrer]);
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();</script>

次にちょっと前の同期しているトラッキングコード

■ga.js(非同期タグではないタグ)

<script type="text/javascript">
var gaJsHost = [1]"https:" == document.location.protocol) ? " https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + " google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E";
</script>
<script>
try{
var pageTracker = _gat._getTracker("UA-xxxxx-x");
pageTracker._trackPageview("/404.html?page=" + document.location.pathname + document.location.search + "&from=" + document.referrer);
} catch(err) {}
</script>

最後に旧トラッキングコードです。

■urchin.jsの場合

<script type="text/javascript" src="http://www.google-analytics.com/urchin.js">
</script>
<script type="text/javascript">
_uacct = "xxxxx-x";
urchinTracker("/404.html?page=" + _udl.pathname + _udl.search);
</script>

404エラーページのトラッキングコードに設置してみてください。

しばらくするとデータが溜まりますので、

「コンテンツ > 上位のコンテンツ」の検索ボックスで

「page\=\/404」と入力すると、

どこからやってきたのか?

(検索エンジンなら)どうゆうキーワードで来たのか?

なんてことがわかるようになります。

↓こんな感じです。

ぜひ試してみてください。

ではでは、失礼しましたー。

KBMJ GoogleAnalyticsのスクールも開催中です!

Google Analyticsスクールでは、セミナーやブログではお伝えしきれない細かな設定方法やアクセス解析手法について、徹底的に解説いたします。

少人数のスクール形式だから、状況やレベルに合わせてインタラクティブに、より詳しく、実用的な活用術を徹底指導いたします!

KBMJ GoogleAnalyticsのスクールも開催中です!

Google Analyticsスクールでは、セミナーやブログではお伝えしきれない細かな設定方法やアクセス解析手法について、徹底的に解説いたします。

少人数のスクール形式だから、状況やレベルに合わせてインタラクティブに、より詳しく、実用的な活用術を徹底指導いたします!

References

References
1 "https:" == document.location.protocol) ? " https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + " google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"

git-svnによる実プロジェクトでのチーム開発 (2)

0

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

こんにちは、SHIMADAです。

今回は、git-svnを使って上流のSVNリポジトリと同期をとりながら開発を進めていく方法について紹介します。

 前提

前回のエントリと同様にSVNリポジトリのクローンがローカルに作られている状態から説明します。

 上流との同期

SVN側にコミットされた他のメンバーのコードをローカルに取り寄せるコマンドを二つ紹介します。

git-svn-fetch

はじめに、リポジトリ全体の同期を取るコマンドです。

$ git svn fetch

これは、trunkとすべてのブランチにコミットされた変更をローカルに取り込みます。

取り込まれる先は、 .git/ 以下にあるローカルのリポジトリです。

$ git branch -a

で表示される、 remotes/svn/ 以下のブランチが最新の状態にアップデートされます。

git-svn-rebase

次に、現在チェックアウトしているブランチとワーキングファイルを同期するコマンドです。

$ git svn rebase

このコマンドを実行するには条件があり、ローカルでの変更がすべてコミットされた状態でなければなりません。

前回のおさらいになりますが、下記のような操作になります。

$ git add app/models/user.rb
$ git commit -m "svnとgit-svnのテスト"

もしコミットしない状態でgit-svn-rebaseを実行しようとすると、

$ git svn rebase                                                                                                                                                       
app/models/user.rb: needs update
update-index --refresh: command returned error: 1

という感じでエラーになりますので、間違えてローカルでの作業内容が消えてしまうということはありません。

 超便利なgit-log

git-svn-rebaseが成功すると、リモートでの変更がマージされた状態となり、ワーキングツリーも更新されます。

どのような変更が加わったかを見るには、

commit 0a5c6053915709f0872655099236c3ecbb28dadc
Author: shimada <shimada @bc2c4182-fb10-4788-ac18-b0505eda9c62>
Date:   Wed Jul 21 18:51:51 2010

    svnとgit-svnのテスト
    
    git-svn-id: https://example.com/svn/repos/myproj/branches/new_feature@123 bc2c4182-fb10-4788-ac18-b0505eda9c62

というコマンドでログを見ることができます。

git-svn経由で取得されたコミットには git-svn-id: というSVNのリビジョンを表す一行が表示されます。

また、SVNの場合は svn log -v というオプションで、リビジョンごとに変更されたファイルのリストが表示されましたが、gitの場合はさらに強力で、git log -p というオプションをつけるとコミットごとの変更内容をunified-diffの形で見ることができます。

commit 0a5c6053915709f0872655099236c3ecbb28dadc
Author: shimada <shimada @bc2c4182-fb10-4788-ac18-b0505eda9c62>
Date:   Wed Jul 21 18:51:51 2010

    svnとgit-svnのテスト
    
    git-svn-id: https://example.com/svn/repos/myproj/branches/new_feature@123 bc2c4182-fb10-4788-ac18-b0505eda9c62

diff --git a/app/models/user.rb b/app/models/user.rb
index df685f1..77efc53 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -4,7 +4,7 @@ class User < ActiveRecord::Base
 
   def test
-    "this is test"
+    "this is test for svn and git-svn"
   end
 

これを使うと、コミットログを流し見するだけで、他のメンバーがどんな変更を行ったか概略を掴むことができます。

 コンフリクトとその解消

git-svn-rebaseの途中でローカルのコミットとのコンフリクトが検出されると、

$ git svn rebase
        M       app/models/user.rb
r123 = 6c10697b941ac5537d12b94a206a89fa540fc062 (svn/new_feature)
First, rewinding head to replay your work on top of it...
Applying: svnとgit-svnのテスト
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/models/user.rb
CONFLICT (content): Merge conflict in app/models/user.rb
Failed to merge in the changes.
Patch failed at 0001 svnとgit-svnのテスト

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

rebase refs/remotes/svn/new_feature: command returned error: 1

というメッセージが表示されてrebaseの動作が一時停止されます。

コンフリクトを起こしたファイルを確認してみます。

$ git st
app/models/user.rb: needs merge
# Not currently on any branch.
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/models/user.rb
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .gitignore
#       config/database.yml
#       log/
no changes added to commit (use "git add" and/or "git commit -a")

「unmerged:」と表示されているファイルがコンフリクトしたファイルです。

なお、コンフリクトマーカーはSVNとほぼ同じ形式で、

<<<<<<< HEAD
    "this is test"
=======
    "this is test for git-svn"
>>>>>>> svnとgit-svnのテスト

となっています。上半分がSVNのHEADの状態、下半分がローカルの状態です。

ローカル側のマーカーの後ろにはコミットメッセージが表示されています。

編集して、コンフリクトを解消したら、

$ git add ファイル名

で解消したことをGitに伝えた後、

$ git rebase --continue

でrebaseが再開されます。(このコマンドは上の方で引用したコンフリクト時のメッセージに出てきます。)

 上流へのコミット

SVNリポジトリの変更を取り込んだあと、コードに問題がなければローカルの変更をSVNリポジトリにコミットします。

$ git svn dcommit
Committing to https://example.com/svn/repos/myproj/branches/new_feature ...
        M       app/models/user.rb
Committed r124
        M       app/models/user.rb
r124 = 0a5c6053915709f0872655099236c3ecbb28dadc (svn/new_feature)
No changes between current HEAD and refs/remotes/svn/new_feature
Resetting to the latest refs/remotes/svn/new_feature
app/models/user.rb: locally modified
        M       app/models/user.rb
Committed r125
        M       app/models/user.rb
r125 = 5b080870f969045ab0787170fc06001908c7b0bb (svn/new_feature)
No changes between current HEAD and refs/remotes/svn/new_feature
Resetting to the latest refs/remotes/svn/new_feature

こんな感じで、ローカルでのコミットがひとつずつSVNのチェンジセットとして送信され、リビジョン番号が振られていきます。コミットメッセージもGitに登録されているものがそのまま送られます。

git-svn-rebaseを忘れて、あるいは他のメンバーのコミットを気づかずににgit-svn-dcommitを行ってしまった場合、Gitがリモートの更新を検出し、事前に git-svn-rebase を実行してくれるので、ローカルの古い状態でSVNリポジトリを上書きしてしまうということは起こりません。

しかし、Gitはテキストベースでのマージとコンフリクト検出以上のことはできないので、コードが正常に動作する状態でコミットされたという保証がありません。

マージされた変更の内容を確認して、問題があればメンバーに連絡して、リポジトリへのアクセスを一時控えてもらうなどの措置が必要です。

 まとめ

git-svnを使った開発のサイクルは、

  1. コードを書く
  2. 細かい作業の区切りごとにgit-commitでバージョン管理する
  3. 大きな区切り(機能をひとつ実装した!など)でSVNにコミットする
    1. git-svn-rebaseでローカルブランチを最新のものに更新する
    2. コンフリクトがあれば解消する
    3. git-svn-dcommitでコミットする
    4. はじめに戻る

という感じになります。

コードが不安定な状態でも、ローカルへのコミットでチームに迷惑をかけずにバージョン管理ができるgit-svnはかなり便利です。

みなさんも是非トライしてみて下さい。

日本語のRailsプロジェクトを中国語化する

0

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

Railsプロジェクトは基本的にUTF8のcharsetで、多言語を対応していますが、 Railsのプロジェクトを中国語化にするにはアプリ上にもいくつか変更必要がある箇所があります。

ここで基本的な箇所をリストにします。

1.charset
一般的にRails日本語のプロジェクトのcharsetはUTF-8ですので、そのままで結構です。
中国語のGB2312に変更したい場合、viewsファイル(html.erb、rhtml)のヘッダmetaの

charset指定の「charset=UTF-8」

「charset=GB2312」
に変更

2.validateチェック
・日本語に特有なvalidateチェックはカタカタのチェックです。
カタカナチェックをすべて外しか、英数字のチェックに変更する必要があります。
・郵便番号桁数
日本に郵便番号が7桁ですので、中国の6桁に変える必要があります。

3.エラーメッセージ
エラーメッセージは下記のディレクトリにあります。
config\locales
ja.yml→エラーメッセージ
activerecord:
    errors:

translation_ja.yml→エラー項目名

この2ファイルをzh.yml,translation_zh.ymlに変更するか、
あるいはこのディレクトリにzh.yml,translation_zh.ymlを追加するか。
どちらでも構いません。

renameする場合、ja.ymlの最初に「ja:」という定義がありますので、
それを「zh:」に変更すればOK。

4.環境設定ファイル
config\environment.rbファイルにタイムゾーンとロケールの指定を変更
config.active_record.default_timezone = ‘Tokyo’


config.i18n.default_locale = ‘ja’

config.i18n.default_locale = ‘zh’

5.メール
メールあたりは変える箇所が何か所があります。

・設定ファイルに定義がある場合、GB2312かUTF8に変更してください。
config\environments\production.rb
日本語プロジェクトのメールのエンコードは
ActionMailer::Base.default_charset = ‘iso-2022-jp’

・一般的にメール送信処理はapp/models/notifier.rbが行います。
GetText.locale = ‘ja’
@@charset=’iso-2022-jp’

@mail.subject = NKF.nkf(‘-j’, @mail.subject)
@mail.body = NKF.nkf(‘-j’, @mail.body)

上記の分を中国語に向いているようにしてください。
NKF.nkfのオプションには中国語のエンコードがないようですので、UTF8に変更するか、
NKF.nkfをやめるかをお勧めします。


6.DB
DBもcharsetの話ですね。サイトはGB2312の場合、DBも対応のcharsetに変更してください。


まとめ、Railsのプロジェクトを中国語化にするには基本的にcharset+validateの変更。
charsetはUTF8のままでしたら、もっと簡単です。

キャリアごとのクローラ-

0

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

先日、自分が見ているサイトのあるページのアクセス数を見てたら、極端にアクセス数が増えてるページがあって、「何だろう…」と思ってちょっと調べてみたら、

「i-robotなんちゃら」っていうアクセスが10000近く。。。これは何だろうと調べてみたら、「モバイルのクローラ-」だそうで、、、

各キャリアごとにどんなクローラ-があるのか、ちょっと眺めてみると

■DoCoMo
・i-robot
トップページ(ドコモに申請した際に着地用に設定したページ)からクローラ-が行けるページならどこまでも見に行くみたいで、さらに日によって気まぐれなのかアクセス数が2ケタの日もあれば、その100倍になったりするときもあります。。。

■au
・KDDI-Googlebot-Mobile
いろいろ調べてみると公式サイトのみ見に来るらしい。でも、アクセスはトップページのみっぽいし、だいたい決まった時間に訪問しに来ます。

■SoftBank
・Y!J-SRD/1.0
・Y!J-MBS/1.0
こちらもアクセスは1日1回くらいで、だいたい決まった時間に来てくれてるみたいです。J-SRDはたまにトップ以外も見てるけど何か違いがありそう…

他にもGooglebot-Mobile(Googleモバイル。結構頻繁に遊びに来る)とか、SoftBankMobileSearch(Yahooケータイ)等のクローラがあるようです。しかし、他にも見慣れないクローラがアクセスしに来ていたりします。

アクセス数を自前で集計するような機能を作ってる際は、このクローラ分も考えて作らないとかなりの誤差が出るのかと改めて痛感しました。。。

FlashLite Tips – フォーカスを任意の順番で制御する

0

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


こんにちは。エンジニアの はる です。
今回はFlashLiteのTipsとして、FlashLiteでフォーカスを任意の順番で制御する方法についてご紹介したいと思います。(※サンプルファイル有り)

まずは、FlashLiteにおけるボタンのフォーカス仕様についてご説明します。

FlashLiteにおけるボタンのフォーカス仕様

図のようにステージにボタンが配置されている場合、
・下キーを数回押した場合:「1→2→3→4→5→1→2→…」
・上キーを数回押した場合:「5→4→3→2→1→5→4→…」
上記のように、”左から右、上から下”という順序でフォーカスが制御され、表示範囲外にあるボタン6は無視されます。

また、FlashLite1.1は、
・ボタンオブジェクトにインスタンス名を設定できない
・on(keyPress “”) や on(keyPress “”) 等で上下キーのイベントを取得することができない
といった仕様になっています。

こういった仕様・制限を考慮すると、
・上記のボタン制御順に縛られずにフォーカスを与えたい場合(※日本地図上の都道府県を選択するUIにしたい、等…)
・Flash内で画面スクロールを実装する等、表示範囲外のボタンを制御したい場合
・条件によって、ボタンの数や位置が変動する場合
上記のようなUIを実装する場合に一手間の工夫が必要となり、そこで、”擬似ボタン”を使用する方法がよく用いられています。

擬似ボタンとは?

擬似ボタンとは、ムービークリップにrollOver、rollOut時の表示パターンを設定することで擬似的にボタンのように見せる方法です。

それでは、擬似ボタンの実装方法について下記で具体的に解説していきます。

STEP 1:隠しボタン(※ボタンオブジェクト)の作成

(1) _rootのタイムラインの1フレーム目に下記のフレームアクション記述します。

stop();

//fromBtn、toBtnの初期化
/:fromBtn = 0; //選択されていた隠しボタンの番号
/:toBtn     = 0; //新たに選択した隠しボタンの番号

(2) _rootタイムライン上にボタンオブジェクトを3つ作成します。 

(3) 各ボタンオブジェクトのアクションに下記を記述します。(※ボタン毎にtoBtnに設定するIDを変更してください。)

on(rollOver){
  /:fromBtn = /:toBtn;
  /:toBtn = 1; //ボタン毎にIDを設定する
  call("rollOver");
}

ここでは、1, 2, 3 というIDをそれぞれのtoBtnの値として設定することとします。

(4) _rootタイムラインにラベル名を”rollOver”に設定したキーフレームを用意します。 

(5) rollOverラベルのフレームアクションに下記を記述します。

// fromBtn=0 は、初期表示時のフォーカスがどのボタンにも無い状態を示しています。
/*** 下キー判定 ***/
if [1]/:fromBtn==0 && /:toBtn==1)||
    (/:fromBtn==3 && /:toBtn==1)||
    (/:fromBtn==2 && /:toBtn==3)||
    (/:fromBtn==1 && /:toBtn==2{
    /:status = "down";
}
/*** 上キー判定 ***/
if [2]/:fromBtn==0 && /:toBtn==3)||
    (/:fromBtn==1 && /:toBtn==3)||
    (/:fromBtn==2 && /:toBtn==1)||
    (/:fromBtn==3 && /:toBtn==2{
    /:status = "up";
}

/*** 下キーが押された場合の処理 ***/
if(/:status eq "down"){
  trace("hoge");
}
/*** 上キーが押された場合の処理 ***/
if(/:status eq "up"){
  trace("fuga");
}

これで上キー・下キーが押された際のイベントを取得し、それに応じた処理を実行することができるようになります。

STEP 2:擬似ボタン(※ムービークリップ)の作成

擬似ボタンとなるムービークリップの実装方法は様々ありますが、参考までに私が以前に行った方法をご紹介します。

(1) _rootタイムライン上に表示上ボタンとして見せたいムービークリップを作成します。

 ・1フレーム目にフォーカスが当たっていない際の表示を設置します。
 ・2フレーム目にフォーカスが当たった際の表示を設置します。
 ・フレームアクションは1フレーム目、2フレーム目ともに「stop();」のみです。

 ■1フレーム目:フォーカスが当たっていない場合の表示

 ■2フレーム目:フォーカスが当たっている場合の表示

(2) それぞれのムービークリップに”フォーカスを当てたい順”にインスタンス名を命名します。
今回は、ムービークリップの表記通り、”mc◯”という形式でインスタンス名をそれぞれ命名することとします。

(3) _rootのタイムライン1フレーム目のフレームアクションに「focusNoの初期化」を追記します。

stop();
//fromBtn、toBtn、focusNoの初期化
/:fromBtn = 0; //選択されていた隠しボタンの番号
/:toBtn     = 0; //新たに選択した隠しボタンの番号

/:focusNo = 0; //現在フォーカスが当たっている擬似ボタンの番号

(4) _rootタイムラインにラベル名を”focus”に設定したキーフレームを用意します。 

(5) focusラベルのフレームアクションに下記を記述します。

buttonSize = 5; //ボタン数を設定
oldFocusNo   = /:focusNo; //選択されていた擬似ボタンの番号
newFocusNo   = /:focusNo; //新たに選択した擬似ボタンの番号

if(/:status eq "up"){
  //最上位の擬似ボタンから最下位の擬似ボタンにフォーカスを移す
  if (oldFocusNo <= 1){
    newFocusNo = buttonSize;
  }else{
    newFocusNo = oldFocusNo - 1;
  }
}else if(/:status eq "down"){
  //最下位の擬似ボタンから最上位の擬似ボタンにフォーカスを移す
  if (oldFocusNo >= buttonSize){
    newFocusNo = 1;
  }else{
    newFocusNo = oldFocusNo + 1;
  }
}

/:focusNo = newFocusNo;

//選択されていた疑似ボタンのフォーカスをはずす
tellTarget("mc" add oldFocusNo){
  gotoAndStop(1);
}
//新たに選択した疑似ボタンにフォーカスを与える
tellTarget("mc" add newFocusNo){
  gotoAndStop(2);
}

(6) rollOverラベルのフレームアクションからfocusをcallするように修正します。

/*** 下キーが押された場合の処理 ***/
if(/:status eq "down"){
  call("focus");
}
/*** 上キーが押された場合の処理 ***/
if(/:status eq "up"){
  call("focus");
}

これで表示上は擬似ボタンがrollOver、rollOutをしているように見えるようになり、任意の順番でフォーカスを与えることができるようになります。

STEP 3:拡張について

今回ご紹介するのはここまでとなりますが、上述の仕組みをベースに
・on(press)時の制御
・擬似ボタンを動的に表示/非表示
・Flash内でのスクロール処理・ポップアップ処理
等々…の拡張を行うことができます。興味のある方は是非是非チャレンジしてみてください。

サンプル

・Flash8形式:focus_sample_fl8.fla をダウンロードする

・FlashCS3形式:focus_sample_cs3.fla をダウンロードする

・FlashCS4形式:focus_sample_cs4.fla をダウンロードする

References

References
1 /:fromBtn==0 && /:toBtn==1)|| (/:fromBtn==3 && /:toBtn==1)|| (/:fromBtn==2 && /:toBtn==3)|| (/:fromBtn==1 && /:toBtn==2
2 /:fromBtn==0 && /:toBtn==3)|| (/:fromBtn==1 && /:toBtn==3)|| (/:fromBtn==2 && /:toBtn==1)|| (/:fromBtn==3 && /:toBtn==2

rails の model メソッドを簡単に daemon 化する方法

0

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

Rails で普段開発される方は、 ruby script/console や ruby script/runner は非常に重宝されていると思います。

これらのコマンドは、Web アプリを作成するために作った model  のメソッドを、簡単に batch や コマンドラインのインタラクティブアプリに変更することが出来、cron 化やデバッグに大変重宝します。

今回、その script/[hoge] に、新たなスクリプトを1つ追加しましたのでご紹介いたします。

今開発中のアプリで、あるバッチを数秒単位で実行する必要がでてきました。

バッチを定期実行するとき、例えば下記のようなシェルファイルを作成し、

#!/bin/sh

RUBY="/usr/local/bin/ruby"
DATE=`date +"%Y%m%d"`

cd [RAILS_ROOT]

$RUBY script/runner -e production "ModelClass.method" >> /var/tmp/model_method.${DATE}.log 2>&1 &

そのファイルを cron に登録して実行することがよくあることかと思います。

ですが cron の最小実行単位は「分」のため、秒の間隔でのアクセスは上記の

script/runner を使った方法では行えません。

通常、秒単位での実行を行いたい場合、下記のような「sleep」を用いた処理を書くのが良く行われます。

例えばこのような Rails の model ファイルを作成し、

class ModelClass <  ActiveRecord::Base
  SLEEP = 5
  class << self
    def method
      loop do
        time = Time.now.strftime("%H:%M %S")
        self.core time
        sleep SLEEP
      end
    end

    def core(time)
      open("#{RAILS_ROOT}/log/test_log.txt", "a") do |f|
        f.write(time + "\n")
      end
    end

  end
end

ターミナル上で

$ ruby script/runner -e production ModelClass.method

を実行すると、log/test_log.txt に 5秒毎に現在の時刻が書き込まれる処理が実行されます。

問題は、この処理を永続化したい場合です。

その場合、上記の処理を daemon 化する必要があります。

daemon についてはこちら

http://markun.cs.shinshu-u.ac.jp/learn/linux/h_06.html

Rubyではスクリプトを簡単にdaemon化する処理が既に用意されているのですが(http://homepage1.nifty.com/~tetsu/ruby/tool/daemon.html)、ActiveRecord の支援を受けたいと考えた自分は、「より Rails らしい」 daemon プロセスの作成法を考えてみました。

使うのは、 gem daemons です

http://daemons.rubyforge.org/

mongrel が依存している gem なので、Rails を使う多くの方々は知らず知らずのうちにインストールしていることと思われます。

そして下記の内容のファイルを作成し、[RAILS_ROOT]/script/daemon という名前で保存します。

require File.dirname(__FILE__) + '/../config/boot'
require 'rubygems'
require 'daemons'

Daemons.run(
  "#{RAILS_ROOT}/script/runner",
  :app_name => "rails_daemon",
  :dir_mode => :script,
  :dir => "../log",
  :multiple   => true,
  :keep_pid_files => false
)

オプションの意味については、詳しくは下の参考文献を参照くださいませ。

そして、ターミナル上で、実行したい処理を下記のように実行します。

$ ruby script/daemon start -- -e production ModelClass.method

(「–」だけ忘れないで下さい)

すると、ModelClass.method の中身が、「rails_daemon」というプロセス名で、daemonとして実行されます。

$ ps ax | grep rails_daemon
 1685   ??  S      0:01.90 rails_daemon                                          
 1690 s002  R+     0:00.00 grep rails_daemon

終了するときは下記になります。

$ ruby script/daemon stop

今のオプションでは、daemon はオプションを変えて複数プロセス作成できますが、上のコマンドでその全てが終了します。

上記のファイルを作成することにより、Rails の model のメソッドを、その内部を一切変更することなく、Rails 使いの方々が慣れ親しんだ文法で、daemon プロセス化することが可能になりました。

こちらの daemon は多重起動ができる設定にしているため、渡すメソッドによって、様々な処理をそれぞれ daemon プロセス化することができます。また、ARGV をうまく指定することにより、daemon プロセス名もより分かりやすいものに変えることもできるでしょう。

もっとシンプルに指定が出来る daemon を作成したい場合、例えば、

require File.dirname(__FILE__) + '/../../config/boot'
require 'rubygems'
require 'daemons'

def daemon_run(running_command, mode = "run", rails_env = "production", daemon_name = nil)
  if daemon_name.nil?
    daemon_name = running_command
  end
  argv = [mode, "--", "-e", rails_env, running_command]
  Daemons.run(
    "#{RAILS_ROOT}/script/runner",
    :ARGV => argv,
    :app_name => daemon_name,
    :dir_mode => :script,
    :dir => "../log",
    :multiple   => true,
    :keep_pid_files => false
  )
end

という内容のファイルを [RAILS_ROOT]/lib/daemons/base.rb という名前で保存し、

require File.dirname(__FILE__) + '/../../config/boot'
require "#{RAILS_ROOT}/lib/daemons/base.rb"

daemon_run("ModelClass.method", "start")

という内容のファイルを [RAILS_ROOT]/lib/daemons/daemon1.rb

という名前で保存したら、

$ ruby [RAILS_ROOT]/lib/daemons/daemon1.rb

で、daemon プロセスを作成できます。(プロセスを止めるときは、 kill する必要がありますが)

※追記

daemon の、run / start / stop が可能なようにしました。

[RAILS_ROOT]/lib/daemons/rails.rb

require File.dirname(__FILE__) + '/../../config/boot'
require 'rubygems'
require 'daemons'

def daemon_run(running_command, mode = "run", rails_env = "production", daemon_name = nil, prefix = "Prefix::")
  if daemon_name.nil?
    daemon_name = running_command
  end
  argv = [mode, "--", "-e", rails_env, running_command]
  Daemons.run(
    "#{RAILS_ROOT}/script/runner",
    :ARGV => argv,
    :app_name => prefix.to_s + daemon_name.to_s,
    :dir_mode => :script,
    :dir => "../log",
    :multiple   => true,
    :keep_pid_files => false
  )
end

[RAILS_ROOT]/lib/daemons/daemons1.rb

require File.dirname(__FILE__) + '/../../config/boot'
require "#{RAILS_ROOT}/lib/daemons/base.rb"

type = "start"
if ARGV[0] && ["start", "stop", "run"].index(ARGV[0])
  type = ARGV[0]
end

daemon_run("ModelClass.method", type)

参考文献

http://labs.unoh.net/2007/10/daemons.html

http://daemons.rubyforge.org/classes/Daemons.html#M000004

Redmineはnginx+Passengerで

0

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

私はRedmineを自分のMacに入れてますが、ちょっとお試しって気分なだけなのにApacheが動作しちゃうのは少し大袈裟な気がしていました。

なので軽量といわれる nginx(エンジンエックス) でもっと手軽に動作させられないかな…と試した際のメモを書いときます。

とはいえ、先にやっている人がいて、こことかに書いてある事が殆どです。

MacPortsやRubyの環境はまず整えておいてください。今回MacPortsは使いますので。また、Redmine自体は${HOME}/redmine 配下にインストールしておくものとし、データベースはSqlite3を使用します。

 1 ImageMagick及びRMagickのインストール

sudo port install ImageMagick
gem install rmagick

 2 Passengerをインストール

gem install passenger

Passengerのインストール先を確認します。ここで出てくるパスは後ほど必要になります。

passenger-config --root

 3 nginxのインストール

普通にnginxをインストールしたいところですが、これだとPassengerを組み込む際にうまくいかないので先にnginxのPortfileを編集します。

cd /opt/local/var/macports/sources/rsync.macports.org/release/ports/www/nginx
sudo vim Portfile

ファイルの末尾へ行き、以下の行を追加しましょう

variant passenger description {Adds passenger support} {
    configure.args-append   --add-module=${手順2で確認したパス}/ext/nginx
}

この状態でnginxのインストールを行います。

sudo port install nginx +gzip_static +passenger +ssl

 4 nginxの設定

cd /opt/local/etc/nginx
sudo cp mime.types.example mime.types
sudo cp nginx.conf.example nginx.conf

次にnginx.confを編集します。

sudo vim nginx.conf

変更した点は以下の通りです。

    gzip  on; # デフォルトでコメントアウトされているので外す

次に82行目あたりに以下のような記述を加えます。

 81     passenger_root ${手順2で出力されたパス};
 82     passenger_ruby /Users/yourname/.rvm/rubies/ruby-1.8.7-p249/bin/ruby;
 83     passenger_max_pool_size 8;
 84     passenger_max_instances_per_app 1;
 85     passenger_pool_idle_time 3600;
 86     
 87     server {
 88         listen 80;
 89         client_max_body_size 250M;
 90         server_name redmine.local;
 91         root /Users/yourname/redmine/public;
 92         passenger_enabled on;
 93         rails_env production;
 94     }

※ここでは redmine.local というホスト名を127.0.0.1として/etc/hostsに定義しているものとします。

 5 nginxの自動起動設定

MacPorts1.9からは以下のような簡略記法が取り込まれたようです。楽ですね。

sudo port load nginx

これで、 http://redmine.local というホスト名にブラウザからアクセスするとRedmineの画面が確認できるかと思います。

Windows7ユーザにおすすめするキャプチャのやり方

0

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

仕事で使うパソコンが新しくなりまして、Windows7になりました。
Windows7では色々なところが新しくなっているようです。
よくわかりませんが、1つ大変便利なソフトが標準でインストール
されているので紹介します。

なにか資料などを作るとき、画面のキャプチャが必要なタイミングが
よくあると思いますが、Windowsではキャプチャをとるステップは面倒な
ものでした。「Print Screenしてペイントに貼り付けて保存」面倒です。

Winshotなどのキャプチャソフトを使っていた人もいるかもしれませんが、
WIndows7ユーザの方には「Snipping Tool」がおすすめです。

Windows7に標準でついてくるこのソフトはこのような機能があります。
1.キャプチャ(範囲を矩形選択)
2.キャプチャ画像に直接メモ書き(絵とか文字とか描けます)
3.編集したキャプチャ画像を保存/メール送信/クリップボードへコピー

このようにキャプチャします。

このように編集します

シンプルですが、表示領域をキャプチャして、ここがどうだといった説明を
する時、役立ちツールです。

あとちなみに、領域を選択した時点で画像がクリップボードに格納されるので
直接パワーポイントなどに貼り付け可能です。

Windows7使っている方に是非おすすめなキャプチャソフトSnipping Toolは
スタートメニューのアクセサリの中から起動できます。
あと、デスクトップのキャプチャやタイマー撮影などはできないので、
CapureXPといソフトを併用しています。

あと、Macユーザの方はSkitchというソフトが同じような感じです(多機能)

memcachedを使ってみる

0

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

どうもメガネです。

今日は、memcachedをrailsで使用したいと思います。memcachedとは
http://gihyo.jp/dev/feature/01/memcached/0001

今回はcache_fuというpluginsを使用します。

1.memcachedのインストール&起動
# yum install memcached
# /etc/init.d/memcached start

2.memcache-clientのインストール
# gem install memcache-client

3.cache_fuのプラグインの設置
cache_fuのダウンロード後、解凍してvendor/plugins以下に設置
http://github.com/defunkt/cache_fu

4.config/memcached.ymlを作成
内容は以下の通り(適当に変えてください。)

defaults:
  ttl: 1800
  readonly: false
  urlencode: false
  c_threshold: 10000
  compression: true
  debug: false
  namespace: sns-decop
  session_servers: false
  memory: 64
  benchmarking: true
  raise_errors: false
  fast_hash: false
  fastest_hash: false

development:
  sessions: true
  fragments: false
  servers: localhost:11211

以上で準備完了。

今回は、Userモデルがあることを仮定して、ユーザ一覧をmemcacheに格納したいと思います。

Userモデルの修正
class User < ActiveRecord::Base
  #10分データ保持する
  acts_as_cached :ttl => 10.minutes

  def self.find_all
    # get_cache(“find_all”)にデータがなければ、findしてget_cacheに追加する
    users = self.get_cache(“find_all”) do
      users = User.find :all
    end
  end
end

class UsersController < ApplicationController

  def index
    @users = User.find_all
  end

end

上のような感じでデータが取得できます。
便利なのでぜひ使用してみてください。

Ruby on Rails SOAP

0

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

ども、rick No.18です。
今回はSOAPについて書きます。

SOAPとは、データのやり取りをするためのもので、XMLに基づいています。

環境

ruby1.8.6
rails1.2.6

データの送受信

require “soap/wsdlDriver”
driver = “SOAP::WSDLDriverFactory.new(URL).create_rpc_driver”
# URLはWSDLファイル格納場所
# WSDLファイルによってフォーマットを決定する。(xml)
request = {“time” => “20100602100000”}
送信するデータはハッシュに入れて送信
@resopnse = driver.method(request)
これで送信ができる。
返信データは@responseに格納されている。(主に@response.body)
driver.methodのmethodはWSDLに記述されているメソッドだが、driver.singleton_methodsなどで、どのメソッドが使用可能か閲覧できる。

受信データ

自分が受信者となる場合、railsのSOAPを使用すると
SOAP::Mapping::Object:0x155556e53f10 {url}method名1=SOAP::Mapping::Object:0x155556e53217 {url}method名1-1=内容]
上記のような形式でデータが受信されます。
データの取り出し方は、
@res = @response[method名1]
=< SOAP::Mapping::Object:0x155556e53217 {url}method名1-1=内容
@res.method名1-1
=> 内容
このように取り出す事が可能です。 @resは複数になる場合、さらに配列となって格納されています。
また@responseで使用できるメソッド名もsingleton_methodsで確認可能です。

ActsAsReadonlyableで負荷分散 - DBの問い合わせ処理(SELECT文)のみをslave用のDBに振り分ける方法の紹介

0

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

こんにちは。KBMJの本多です。

今回はActsAsReadonlyableを用いて、DBへのアクセスの負荷分散を行う方法を紹介します。実際にWEBサービスを運用する場合、WEBサーバー及びDBサーバーが複数台稼働している事があると思います。

今回のケースは以下のサーバー構成という前提で話を進めさせていただきます。

・WEBサーバー(Ruby on Rails)x2台
・DBサーバー(MySQL)x2台

DBサーバーはMySQLの一方向レプリケーションを採用しているため、Master(以下DB1)とSlave(以下DB2)という構成です。
基本的にRailsは1つのDBに対してのみアクセスを行うため、処理の流れは以下のようになります。

WEBx2 <= (SQL) => DB1 <= (レプリケーション) => DB2

この構成で、とある「処理の重いデータ抽出処理」を行う機能を追加した際に、
WEBサーバーやDB1に負荷がかかったため、「この重い処理に関してのみ、DB2へSQLを投げる事は出来ないか?」
と言う要望を受けて、今回のプラグインを使用しました。

1、ActsAsReadonlyableのインストール
railsのrootディレクトリで以下を実行します
ruby script/plugin install svn://rubyforge.org/var/svn/acts-as-with-ro/trunk/vendor/plugins/acts_as_readonlyable

2、ActsAsReadonlyableで接続するDBの設定
config/database.ymlにて以下のようにDB2の情報を追加
production:
  database: rails_project_production
  host:(DB1のIPアドレス)
  (略)
  slave:
    database: rails_project_production
    host: :(DB2のIPアドレス)
    (略)

3、slave接続用のModel作成
今回は限定的な処理のみslaveに接続させるため、専用のmodelを作成する事にしました。
元となるmodelが
item.rb(テーブル名、items)
となっている物に対して、以下のslave用modelを作成しました。

slave_item.rb
class SlaveItem < ActiveRecord::Base
  set_table_name “items”
  acts_as_readonlyable [“slave”]
end

4、重い処理のSQLを3で作成したmodelを使って実行
Item.find_by_sql(重い処理)  ↓
SlaveItem.find_by_sql(重い処理)

以上で修正作業は完了です。
これにより、重いSQLに関してのみDB2へ問い合わせが行われ、
DB1の負荷を軽減する事ができるようになります。

また、誤ってSlaveItem経由でアップデート処理等をかけてしまった場合は
DB1へアクセスされるため、もしもの時の予防にもなります。

もちろん、重いSQLの改善も非常に大事ですが、ある程度限界が見えている場合は、
今回のような視点を変えた対処法を取ってみるのはどうでしょうか?

GOOD RAILS!!

RVMでRailsのバージョンを管理する

0

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

こんにちは、sasimiです。

今回は、RubyのバージョンもRailsのバージョンも管理するのに便利なRVMを楽しみたいと思います。

Rails3とRails2.3.8をインストールし、管理するにはどうすればいいのでしょうか。

そこで、RVMです。

ハチネンさんのエントリー RVMで複数のRubyを管理 を読んで、Rails3をインストールしてみました。

環境はCentOS5.4です。

今回、以下のことをやっています。

■ RVMのインストール

■ Rubyのインストール

■ gemsetの作成

■ Rails3、Rails2のインストール

 RVMのインストール

[tomonori@localhost]~% cd
# RVMのダウンロード
# gitをインストールしている方
[tomonori@localhost]~% wget -O rvm-install \
[tomonori@localhost]~% http://rvm.beginrescueend.com/releases/rvm-install-head
# gitをインストールしていない方
[tomonori@localhost]~% wget -O rvm-install \
[tomonori@localhost]~% http://rvm.beginrescueend.com/releases/rvm-install-latest

# ダウンロードしたファイルの実行
[tomonori@localhost]~% sh rvm-install

#rvm
[tomonori@localhost]~% source "$HOME/.rvm/scripts/rvm"

rvmのパスが通ったことを確認します

[tomonori@localhost]~% rvm notes

Notes for Linux ( CentOS release 5.5 (Final) )

    *  curl is required.

    *  patch is required (for ree, some ruby head's).

    *  If you wish to install rbx and/or any MRI head (eg. 1.9.2-head) then you must install and use rvm 1.8.7 first.

    *  For MRI/ree (if you wish to use it) you will need:
       $ yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel
       $ yum install -y iconv-devel # NOTE: For centos 5.4 final iconv-devel might not be available :(
    *  For JRuby (if you wish to use it) you will need:
       $ yum install -y java

RVMのインストールはここまで。

今回、CentOS5.4にインストールしました。

ここで表示されている通り、readlineとzlibをインストールしました。

RVMがログインする度に起動するように.zshrc(bashの方は.bashrc)に追加します。

# .zshrcにrvmを読み込むように追加
[tomonori@localhost]~% echo 'if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then "' >> ~/.zshrc
[tomonori@localhost]~% echo '  source "$HOME/.rvm/scripts/rvm" ; ' >> ~/.zshrc
[tomonori@localhost]~% echo 'fi'  >> ~/.zshrc

ここまでの詳細は

http://rvm.beginrescueend.com/rvm/install/

を参照してください。

 Rubyのインストール

さて、rubyをインストールします。

% rvm install 1.8.7 -C "--enable-shared, --with-readline-dir=/usr/local"
% rvm install 1.9.2 -C "--enable-shared, --with-readline-dir=/usr/local"

[tomonori@localhost ~]% ruby -v      
ruby 1.9.2dev (2010-05-31 revision 28117) [x86_64-linux]

RVMによって複数のRubyを管理するのはハチネンさんのエントリー RVMで複数のRubyを管理 を読んでください。

 gemsetの作成

ここからはgemsetを利用して、Railsのバージョンを切り替えたいと思います。

現在のgemsetのリストを確認します

[tomonori@localhost]~% rvm gemset list

info: gemsets : for ruby-1.9.2-preview3 (found in /home/tomonori/.rvm/gems/)
global

新しくgemsetを作成します。ここではrails3という名前のgemsetを作成します。

[tomonori@localhost]~% rvm gemset create rails3

info: Gemset 'rails3' created.

同様に、rails2という名前のgemsetを作成します。

[tomonori@localhost]~% rvm gemset create rails2

info: Gemset 'rails2' created.

 Rails3、Rails2のインストール

では、rails3というgemsetを使って、gemのインストールをします。

このgemsetにRails3をインストールします。

[tomonori@localhost]~% rvm gemset use rails3
info: Now using gemset 'rails3'

[tomonori@localhost ~]% gem install tzinfo builder memcache-client rack \
[tomonori@localhost ~]% rack-test rack-mount erubis mail text-format thor \
[tomonori@localhost ~]% bundler i18n
[tomonori@localhost]~% gem install rails --pre 

同様に、gemset rails2にRailsの最新版である2.3.8をインストールします。

[tomonori@localhost]~% rvm gemset use rails2

info: Now using gemset 'rails2'

[tomonori@localhost]~% gem install rails

では、確認します。

ruby-1.9.2-preview3とgemset rails3の組み合わせで正しくインストールされているかを確認します。

おなじみのgem listで見てみると、

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails3

info: Using ruby 1.9.2 preview3 with gemset rails3
[tomonori@localhost]~% gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.0.beta4)
actionpack (3.0.0.beta4)
activemodel (3.0.0.beta4)
activerecord (3.0.0.beta4)
activeresource (3.0.0.beta4)
activesupport (3.0.0.beta4, 2.3.8)
arel (0.4.0)
builder (2.1.2)
bundler (0.9.26)
erubis (2.6.5)
i18n (0.4.1)
mail (2.2.4)
memcache-client (1.8.3)
mime-types (1.16)
polyglot (0.3.1)
rack (1.2.0, 1.1.0)
rack-mount (0.6.4)
rack-test (0.5.4)
rails (3.0.0.beta4)
railties (3.0.0.beta4)
rake (0.8.7)
rdoc (2.5.8)
text-format (1.0.0)
text-hyphen (1.0.0)
thor (0.13.6)
treetop (1.4.8)
tzinfo (0.3.22)

正しくインストールされているようです。

同様に、gemset rails2ではどうでしょうか?

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails2

info: Using ruby 1.9.2 preview3 with gemset rails2
[tomonori@localhost]~% gem list

*** LOCAL GEMS ***

actionmailer (2.3.8)
actionpack (2.3.8)
activerecord (2.3.8)
activeresource (2.3.8)
activesupport (2.3.8)
rack (1.1.0)
rails (2.3.8)
rake (0.8.7)
rdoc (2.5.8)

インストールされていることが確認できましたね。

しかも、gemsetを切り替えることで、Railsのバージョンの管理ができました。いや、まあ、gemを管理してるだけやん、っていわないで。。。

最後に

[tomonori@localhost]~% rvm use ruby-1.9.2-preview3@rails3 --default

これで、次回からログイン時にもこのruby-1.9.2-preview3とgemset rails3のときのものが使われますよ。

gemsetの名前はなんでもいいので、プロジェクト毎に工夫することができます。

どうです?積極的にRVMを利用したいと思いませんか?

忘れないうちにsolarisコンテナ&zfsのコマンド

0

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

忘れないうちにと言うことで前に少し勉強した

solarisコンテナ(zone)&zfsのコマンドを記載します。

コンテナの作成などについては書いておりませんが

構成など確認をする場合必須と思われものを記載しておきます。

 solarisコンテナ(zone)

zoneの管理コマンドを以下を基本としています

コマンド詳細
zonecfgzoneの構成を作成、変更する
zoneadmzoneの管理コマンド
zlogingobal-zoneから各zoneへログイン

既存コンテナ一覧を表示

  • v ゾーン名,ID名などコンテナの詳細を表示
#zoneadm list -vc

グローバルゾーンからログインする(rootで行う)

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

ゾーンの停止(global zoneからrootで実行)

# zlogin <ゾーン名> shutdown -i0 -g0 

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

スナップショットの作成する

(snapshotはマウントポイント/バックアップ名)

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

#zfs rollback -r testpool/home/test1@today

忘れないうちにsolarisコンテナ&zfsのコマンド

0

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

忘れないうちにと言うことで前に少し勉強した

solarisコンテナ(zone)&zfsのコマンドを記載します。

コンテナの作成などについては書いておりませんが

構成など確認をする場合必須と思われものを記載しておきます。

 solarisコンテナ(zone)

zoneの管理コマンドを以下を基本としています

コマンド詳細
zonecfgzoneの構成を作成、変更する
zoneadmzoneの管理コマンド
zlogingobal-zoneから各zoneへログイン

既存コンテナ一覧を表示

  • v ゾーン名,ID名などコンテナの詳細を表示
#zoneadm list -vc

グローバルゾーンからログインする(rootで行う)

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

ゾーンの停止(global zoneからrootで実行)

# zlogin <ゾーン名> shutdown -i0 -g0 

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

スナップショットの作成する

(snapshotはマウントポイント/バックアップ名)

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

#zfs rollback -r testpool/home/test1@today

データベースを一発でリセットする方法

0

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

開発途中にデータベースを空の状態にしたい時のコマンドをご紹介します。最近Rails2系を触れて知ったのですが、Rails1系だとデータベースをリセットする際に

rake db:drop
rake db:create
rake db:migrate

とやっていたのですが、

rake db:migrate:reset

とやると上の3つのコマンドと同じ事をやってくれるので楽です。
ちなみにrakeタスク一覧はrake -Tで見れます。

せっかくなんでいくつかrakeコマンドを紹介します。

rake db:create RAILS_ENV=production
ymlに定義してあるデータベースを作る(上記の場合production)

rake db:create:all
ymlに定義してあるデータベースを全部作る

rake db:drop RAILS_ENV=production
ymlに定義してあるデータベースを消す(上記の場合production)

rake db:drop:all

ymlに定義してあるデータベースを全部消す

rake db:version
現在のマイグレーションのバージョン表示

rake db:charset
データベースの文字コードを教えてくれる

また、DoRuby!でrakeの記事があったので紹介しておきます。

Ruby on Railsでrakeコマンドを使って様々なタスクを実行しよう

皆さんも活用してみて下さい。

VirtualBoxにCentOS入れようとしたら「ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。」というエラーがでた

0

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


VirtualBoxにCentOS5.3設定をしようとしたところ、OSインストールの最後のところで以下のエラーが出ました。エラー内容ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。ファイルが不明であるか、パッケージまたはメディアが破損している可能性があります。インストールソースを検証してください。

ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。

インストールCDを変更してみてもやっぱり同じエラーがでます。
あと少しなのに残念です。

ググってみてもよく分からなかったのですが、よくよく見てみたところ、
VirtualBox内でCentOS5.4を起動中でした。

CentOS5.4を終了させて、再インストールを試します。。

インストールできています

先程まで出ていたエラーが出なくなり、先に進めるようになりました。

VirtualBoxにCentOS入れようとしたら「ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。」というエラーがでた

0

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


VirtualBoxにCentOS5.3設定をしようとしたところ、OSインストールの最後のところで以下のエラーが出ました。エラー内容ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。ファイルが不明であるか、パッケージまたはメディアが破損している可能性があります。インストールソースを検証してください。

ファイル wvdial-1.54.0-5.2.2.1.x86_64.rpmを開けません。

インストールCDを変更してみてもやっぱり同じエラーがでます。
あと少しなのに残念です。

ググってみてもよく分からなかったのですが、よくよく見てみたところ、
VirtualBox内でCentOS5.4を起動中でした。

CentOS5.4を終了させて、再インストールを試します。。

インストールできています

先程まで出ていたエラーが出なくなり、先に進めるようになりました。

【Ruby】半角/全角バリデータ~解説編【Rails】

0

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

前回投稿した半角/全角バリデータの正規表現の中身を解説します。前回は、rubyで使える半角/全角バリデータを紹介しました。
あのソースは突貫工事的に書いたものなので、実は自分でも仕組みを理解しないままでした。
ですが、「それじゃあいかん!」ってことで、1つずつ調べてみました。

以下、ソース再掲↓

KCODE = 'u'

  def self.hankaku?(str)
    return nil if str.nil?
    # 半角のみOKなので、全角が混ざっているとfalseが返る
    unless str.to_s =~ /^[ -~。-゚]*$/
      return false
    end
  return true
  end

  def self.zenkaku?(str)
    return nil if str.nil?
    # 全角のみOKなので、半角が混ざっているとfalseが返る
    unless str.to_s =~/^[^ -~。-゚]*$/
      return false
    end
    return true
  end

ポイントは

    # 半角のみOKなので、全角が混ざっているとfalseが返る
    unless str.to_s =~ /^[ -~。-゚]*$/
    # 全角のみOKなので、半角が混ざっているとfalseが返る
    unless str.to_s =~/^[^ -~。-゚]*$/

この2か所です。
正規表現を使っているだけですが、この正規表現がややこしい。
半角文字用の正規表現を1つずつ分解すると・・・

  unless str.to_s =~ /先頭文字[ -~。-゚]0個以上の連続 終端文字/

となります。
つまり、[ -~。-゚]という文字の繰り返しってことです。
・・・で、これ[ -~。-゚]をさらに分解すると

  " "から~まで & 。から゚まで

ようは、半角のスペースからチルダまで+句点から半濁点までってことです。
[0-9A-Z]と同じ感じで書いてあると思えば、そう難しくはないかと。
文字コードの並び順の関係で、この書き方でカタカナなどを含むすべての半角文字を指定することが可能です。
全角文字は、これを否定してやればOK。

これで、何をどういう感じで指定しているかがわかりました!
スッキリ☆

ruby on railsでPDFファイルを出力する。 prawnto Plugin編

0

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

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

今回は、ruby on railsでPDFファイル出力ができる  prawnto というプラグインついて書きます。

rubyおよびrailsでPDFファイルを出力するプラグインは色々ありますが、

今回は、railsのプラグインとして使用できること、日本語を使用できること、コントローラー・ビューに記述するだけで簡単にPDF出力ができるプラグインということで、 prawntoというpluginを紹介しようと思います。

(ほかのライブラリだと、サーバーにライブラリを入れておかないといけないものや、一旦PDFファイルを事前にファイル出力しておかなければならないものが多く面倒な気がしました)

環境

OS : Windows Vista
Ruby : 1.8.7
ruby on rails : 2.3 (prawntoは公式ページでは2.1or2.2と書かれていましたが、2.3でも動きました)

prawntoのインストール

ruby script/plugin install git://github.com/thorny-sun/prawnto.git

prawnのインストール

prawnto はprawnというPDF出力ライブラリを利用しているため必要
gem installprawn

日本語用フォントのダウンロード

ダウンロードして解凍後、ttfファイルをアクセス可能な場所に置く
http://ossipedia.ipa.go.jp/ipafont/

私はpublicの直下に置きましたが、libでもvender配下でもいいと思います。

コントローラーのメソッドに以下のコードを記述

def show       
    prawnto :prawn => {
              :page_layout => :portrait, # 縦 :landscape,# 横
              :page_size => ‘A4’,

              :left_margin => 36,
              :right_margin => 36,
              :top_margin => 36,
              :bottom_margin => 36

    }
@pigs = “#{RAILS_ROOT}/public/images/aaa.jpg” #画像ファイル

end

ビューファイルに以下のコードを記述

ファイル名は show. pdf.prawnという風につけます。

pdf.font “#{RAILS_ROOT}/public/ipag.ttf”
pdf.text “日本語のテストです。”
pdf.text “サイズ36”, :size => 36
pdf.font “Times-Roman”
pdf.text “abcdefghijklmnopqrstuvwxyz”

pdf.text “http://doruby.kbmj.com”

pdf.bounding_box([400,313], :width=>50, :height=>50) do
  pdf.line_width = 2
  pdf.stroke_rectangle [0,50], 50, 50
  pdf.stroke_line 0,0,50,50
  pdf.stroke_line 0,50,50,0
  pdf.font ‘Helvetica-Bold’, :size => 12
  pdf.text “\nSTAMP\nHERE”, :align=>:center
end

pdf.image @pigs, :at => [50,450], :fit => [200,200]

実際にruby on railsでPDF出力する


コントローラー名/show/hoge.pdf


というようにアクション名の後ろに拡張子をPDFにしたファイル名をつけてブラウザでアクセスするとデータがPDF形式で出力されます。

この、prawntoではオプションが用意されており、色々な形のPDFファイルを出力することが可能です。

簡単に例をあげます

 :prawn PDFの表示形式などの設定{}に複数設定可能

 >> 上の例だと:page_layout => :portrait, # 縦 pagee_size => ‘A4’,

      とあるのはA4縦で出力 あとは余白などの設定しています。

:inline=>false : falseにすることでPDFをダウンロードさせる。デフォルトはtrueになっており、ブラウザでPDFが表示されます。

また公式ページにデモが用意されておりPDFのサンプルを見ることができますので、是非参考にしてください。

http://cracklabs.com/prawnto/demosこのprawntoというプラグインを利用すると比較的簡単にPDFを出力できると思います。

日本語や画像も使え、罫線も引けるようですので、ある程度のことはできそうな感じです。

ruby on rails でPDF出力することがあればprawntoを利用してみてはいかがでしょうか?prawnto 公式ページ

http://cracklabs.com/prawnto

acts_as_rateableを使ってみた

0

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

こんにちわ

abennuです

今回はRailsでレーティング機能を実現できるプラグイン acts_as_rateableを使ってみたのでインストール~使用方法なんかを書きたいと思います

インストール

インストールは

script/plugin install svn://rubyforge.org/var/svn/rateableplugin/trunk

これでOKです。次にmigrationファイルを作ります。

script/generate migration add_ratings

これでできたmigrationファイルに以下のように記述します。

create_table :ratings do |t|
  t.column :rating, :integer   
  t.column :rateable_id :integer, :null => false
  t.column :rateable_type, :string, :null => false
end

def self.down
  drop_table :ratings
end 

こんな感じであとはレーティング機能を使用したいモデル(ここではUserモデル)に

class User < ActiveRecord::Base
  acts_as_rateable
end

こんな感じにacts_as_rateableを追加すれば準備完了です。

実際に使うときはこんな感じに使います。

ユーザの新規作成時にレートをつける

User.new(:name => "hoge", :rating => 1).save

既存のユーザにレートをつける

User.find_by_name("hoge").rate(2)

ユーザのレートを取得する

User.find_by_name("hoge").rating

という感じに簡単にレーティング機能が実現できます。

以上です。

最近人気な記事