ホーム ブログ ページ 62

resource_controller で RESTful, DRY 実践

0

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

Rails 2.0 からの RESTful 指向により、ほとんどのコントローラは index, show, new, create, edit, update, destroy の基本的なアクションを持ちます。
コントローラはモデルとビューの中継ぎをするためのコードを持ち、ビジネスロジックはモデルに持つという思想を実践すれば、コントローラのコードはほとんど同じコードになります。
このコントローラの状況は、Rails の DRY (Don’t Repeat Yourself)の法則に反することになります。
そこで今回紹介する resource_controller の出番です。

script/generate scaffold post で作成したコントローラは以下のようになります。

class PostsController < ApplicationController
  # GET /posts
  # GET /posts.xml
  def index
    @posts = Post.find(:all)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

  # GET /posts/1
  # GET /posts/1.xml
  def show
    @post = Post.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

  # GET /posts/new
  # GET /posts/new.xml
  def new
    @post = Post.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @post }
    end
  end

  # GET /posts/1/edit
  def edit
    @post = Post.find(params[:id])
  end

  # POST /posts
  # POST /posts.xml
  def create
    @post = Post.new(params[:post])

    respond_to do |format|
      if @post.save
        flash[:notice] = 'Post was successfully created.'
        format.html { redirect_to(@post) }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /posts/1
  # PUT /posts/1.xml
  def update
    @post = Post.find(params[:id])

    respond_to do |format|
      if @post.update_attributes(params[:post])
        flash[:notice] = 'Post was successfully updated.'
        format.html { redirect_to(@post) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /posts/1
  # DELETE /posts/1.xml
  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
    end
  end
end

resource_controller を使えば、上記のコードは次の様になります。

class PostsController < ApplicationController
  resource_controller
end

また、/post/1/comments の様なネストしたコントローラにも対応しています。

class CommentsController < ApplicationController
  resource_controller
  belongs_to :post
end

belongs_to を使えば、/post/1/comments の様な URL で Comments コントローラにアクセスした場合に、自動的に @post インスタンス変数に親オブジェクトを生成してくれたりします。

resource_controller プラグインをインストールするには以下のコマンドを実行します。

script/plugin install git://github.com/giraffesoft/resource_controller.git

こちらのブログでさらに詳細が書かれていますので、興味ある人はご覧下さい。
resource_controller で RESTful, DRY な生活を送りましょう!

Amazon の電子書籍リーダー「Kindle 2」を使ってみた

0

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

こんにちは。

KBMJの佐藤です。

Amazon の電子書籍リーダー「Kindle 2」を触る機会があったので、今回はその感想を書いてみたいと思います。

http://farm4.static.flickr.com/3548/3425035461_98f67338bd.jpg

Amazon Kindle 2 とは

Amazon Kindle 2 は、米 Amazon が販売している電子書籍リーダーです。

Kindle 最大の特徴は、EV-DOを利用した、PCを介する必要のない電子書籍のダウンロード機能。携帯会社との契約は不要というのが素晴らしいです。つまり本を読みたくなっても書店に行かずに購入・読書が可能ということです。まさにユビキタスなサービス。Kindle向けの書籍だけでなく、Wikipediaや新聞、雑誌、ブログなどを購読することも可能なようです。

ハードウェアキーボードも装備されており、書籍の検索やノートの入力などにも使えます。

端末の省電力設計も特徴で、バッテリーが非常に長持ちするようです。無線機能を有効にした状態でも、1回の充電で4,5日は使用可能とのこと。「いつ充電したのか?」などを気にしなくてもよいくらいに電池がもつということで、非常に好感がもてます。

359ドルと、端末の値段が高いのが残念。

画面は6インチ。解像度は600×800ピクセルと、かなりいい感じです。iPhoneにPDFを転送して読むと画面が狭くてかなり悲しいことになるので、電子書籍リーダーとしてはこれくらい広い画面がないと使う気になりません。

2Gバイトのメモリを搭載し、1500タイトル以上の電子ブックを保存できるとのこと。音楽と違って書籍をそんなに保存できてもなあ、とは思いますが、読書の虫にとっては移動中に読む本が無くなるとやることがなくなってしまいますし、かといって複数冊の本を持ち歩くと荷物になりますので、この軽いデバイス1つに集約できるのは嬉しいかも。

Kindleはまだ日本では販売されていないようですが、Kindle本体から電子書籍を直接購入できるなど、ユーザー体験の面で今までの電子書籍リーダーとは一線を画する製品であると思います。

アップルのiPodのように、垂直統合の良さが際だった、ユーザー体験を非常に重視したサービス・製品だと思います。

従来機との比較

従来機に比べてかなり薄くなっています。以下、比較写真。

http://farm4.static.flickr.com/3310/3425035603_031ccbec0f.jpg
http://farm4.static.flickr.com/3570/3425844618_8b1aa257fe.jpg

厚みが0.91センチ。相当薄い。重量は289グラム。前モデルよりも軽くなったようですが、片手で気軽に読書を楽しむにはまだまだ重いという印象。キーボード部分をばっさりと切り捨てて、もっと軽くしてほしいですね。そういった思い切りが欲しいです。

新モデルではページをめくるためのボタンが両サイドに配置されたのですが、これが非常に良いです。デジタルガジェットを使っているとその形状によって使い方が縛られるという面があるかと思うのですが、両サイドにめくるボタンがついたことにより、そこが改善されていると感じます。

iPod touchとの比較

http://farm4.static.flickr.com/3551/3425844316_74898335f2.jpg
http://farm4.static.flickr.com/3559/3425036205_8c857d85a7.jpg

新型kindleとiPod touchとの厚さ比較。新型はかなり薄いです。バッグに入れておいてもまったく気にならないレベル。

現在「Kindle for iPhone」というアプリが利用可能となっていますが、小説などならともかく、技術書などを読むのは画面の大きさの問題もあってかなり厳しいようです。

まとめ

やはり既存の紙媒体のコンテンツであれば、画面の大きなデバイスで楽しみたいものです。というわけで、Kindleには非常に期待しているのですが、デバイスの価格が高かったり日本で買えなかったり非常に残念ですね。日本のメーカーが電子書籍リーダーを作ると様々な事情で非常に高機能かつ高価なデバイスになってしまうので、やはりKindleのように思い切った設計のデバイスを出して欲しいものです。

iPodの大ヒットを見ても分かるように、これからの一般消費者に向けたサービスではアップル的な「垂直統合」が非常に重要だと思います。あのマイクロソフトも音楽配信においては「Plays For Sure」による水平統合がうまくいかず、「Zune」などによる垂直統合へと方針を変えたようです。デバイス製品単体だけではなく、その周囲にあるコンテンツ・ネットサービス・実店舗などを一体化したユーザー体験を提供していく企業こそ、今後のデジタルライフスタイル時代では消費者に受け入れられるのだと思います。そういう意味で、Kindleというデバイスが出てきたことは非常に興味深いと考えます。

Special Thanks : 三浦印刷株式会社 代表取締役社長 三浦久司様、下町めぐり.jp

Google analyticsの「サイトのデータを表示する」機能でページのクリック率をみる

0

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

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

今日はGoogle Analyticsの機能紹介ということで

サイト上のデータ表示」でページごとのリンクのクリック率をみる機能をご紹介したいと思います。

◆サイト上のデータ表示 

まずGoogleAnalyticsにログインして、レポートを表示します。

GoogleAnalyticsレポートサマリー

次に、左ナビの「コンテンツ」をクリックしてください

Google Analyticsコンテンツサマリー

「コンテンツ」の中に、「サイト上のデータ表示」というのがでてきます。

それをクリックしてください。

するとレポート表示しているサイトが表示され、

オーバーレイでリンクのクリック率が表示されます。

GoogleAnalyticsサイト上のデータ表示

 リンクの一つひとつにパーセントとメーターが表示されました。

 これがクリック率になります。

他にもコンバージョン設定をしている場合は、

コンバージョン率や、コンバージョンバリューを表示することができます。

・サイトのどの場所がクリックされているか

・どのコンテンツが人気あるのか

・どのコンテンツからコンバージョンに達しているのか

といったことが視覚的にみることができるので、

サイトのなかの配置などを変更する時に有効なデータになると思います。

注意点としては、

例えばヘッダーとフッターにTOPページへのリンクが有り

リンク先のURLが

htt://www.dorouby.kbmj.com/index.html

とヘッダー、フッターで同じであった場合

「サイト上のデータ表示」の結果で出てくるクリック数は

ヘッダーとフッターのTOPページのリンクの数は同じ数となります。

※あくまでクリック前のページから、URLに対しての通信があった回数(トラッキングコードが読み込まれた回数)を算出しているため、

もしもどうしても、ヘッダーとフッターでクリック数を分けたいという場合は、

http://www.dorouby.kbmj.com/index.html?header

http://www.dorouby.kbmj.com/index.html?footer

のようになんらかのパラメーターをつけることで通信数を分けることができます。

以上、本日は、Google analyticsでページのクリック数・率を表示する方法でした。

■バックナンバー

 google analyticsで使う アクセスログ解析用語 その2

■その他アクセス解析担当の記事 【最新の3記事】

Yahoo! Web Analytics とは? ~レポート機能を解説(日本語)~

アクセス解析で見るユーザビリティ -目的のコンテンツへの道筋を整えよう!-

SEOって何ですか?

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


Google Analyticsスクールでは、セミナーやブログではお伝えしきれない細かな設定方法やアクセス解析手法について、徹底的に解説いたします。
少人数のスクール形式だから、状況やレベルに合わせてインタラクティブに、より詳しく、実用的な活用術を徹底指導いたします!

QRコード【読取】

0

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

こんにちは。みわです。ぽつぽつと、書いていきます。

今回は、「QRコードの読み取り~余白の重要性」についてです。

QRコードを携帯電話の画面に表示させ、それを読み取らせる・・・というサービスってありますよね。 最近増えてきたんじゃないかと思います。

QRコードにはいろいろとお約束があるのですが、読み取りに関するお約束を1つ紹介します。

QRコードは、あの正方形のコードの周りに「余白」があります。

これは、QRコード生成時に指定します (フリーのツールですと、デフォルトで設定されていて変更できない場合があるかもしれませんね) 。

この余白が「最低4px」必要です。 たま~に0pxでも大丈夫なときがありますけど・・・(^^;

4px以上の余白がないと、読み取りできません。

ですから、印刷されているQRコードも周りに若干余白がありますよね。

ということで、「QRコードには余白が必要だ」というお話でした。

rubyでのhttpリクエスト

0

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

Rubyのnet/httpライブラリとuriライブラリを用いてヘッダーカスタマイズ、読み込み時間制限を設定できるhttpリクエスト関数を作成してみたいと思います。

今回作成するもの

rubyでヘッダーカスタマイズ、読み込み時間制限を設定できるhttpリクエスト関数を作成する

今回使用するrubyライブラリ一覧

uri は rubyでURI を表す文字列から URI オブジェクトを生成することができるライブラリ

 net/httpはrubyでHTTP リクエストすることができるライブラリ

rubyライブラリuriの使用例

irb(main):001:0> require ‘uri’

=> true

irb(main):006:0> uri = URI.parse(‘http://doruby.kbmj.com/ruby_on_rails/’)

=> #<uri::http:0xb7f655b0 url:http://doruby.kbmj.com/ruby_on_rails/>

irb(main):007:0> uri.host

=> “doruby.kbmj.com”

irb(main):008:0> uri.path

=> “/ruby_on_rails/”

irb(main):009:0> uri.port

=> 80

作成したrubyのヘッダーカスタマイズ、読み込み時間制限を設定できるhttpリクエスト関数

require ‘uri’

require ‘net/http’

module Net

 class HTTP

  def HTTP.get_with_options(uri,open_timeout=nil,read_timeout=nil,headers=nil,options=nil)

   uri = URI.parse(uri) if uri.respond_to? :to_str

   begin

    start(uri.host,uri.port) do |http|

     http.open_timeout= open_timeout if open_timeout

     http.read_timeout= read_timeout if read_timeout

     path_query = uri.path + (uri.query ? ( ‘?’ + uri.query) : ”)

     res = http.get(uri.path,headers)

     return res

    end

   rescue Exception => e

    puts e

    return false

   end

  end

 end

end

作成関数使用例

http://doruby.kbmj.com/yy_on_railsに5秒で読み込みが完了しなければERRORにしたいとき

res = Net::HTTP.get_with_options(‘http://doruby.kbmj.com/yy_on_rails’,nil,5,{‘Accept-Language’ => ‘jp’})

性能・負荷テストツール「JMeter」 導入編

0

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

はじめまして!

そろそろ2年目エンジニアのDaokaです。

今回は、私が性能・負荷テストを行うときによく使うJMeterというツールを紹介したいと思います。

JMeterとは?

jakartaプロジェクトで作られている、Webアプリ向けの性能・負荷テストツールです。無償でありながら、かなり高性能で複雑なテストシナリオを作成・実行することができます。

また、Javaの実行環境があればどのWindows/Mac/LinuxなどOSを問わず導入することができます。

JMeterでできること

無償で使える性能測定ツールとしてApache Benchというツールもありますが、JMeterはApache Benchより複雑なテストを行うことが可能です。そのほんの一例を挙げてみます。

・ Basic認証が必要なページにアクセスできる

・ スレッドごとに違うcookieを保持することができる。

・ リクエストのレスポンスを取り出して次のページのリクエストに使うことができる。

・ ヘッダーを変えることができる。(User Agentを変えて、モバイル用のページでテストを行う時などに便利)

・ 外部ファイルから値を読み込むことができる。

・ 複数台のマシーンでテストシナリオを共有することができる。

他にもたくさんできることがありますが、ここであげたのは自分が性能テストのシナリオを作成するときによく使う機能です。

これによって、複数のユーザが同時にアクセスする、書き込みなどでトークンが必要になる状況のテストを実行することができます。

JMeterのインストール

Java1.4以上実行環境があれば、インストールはとても簡単に行えます。

公式サイトのダウンロードページから、バイナリのtgzまたはzipファイルをダウンロードし、適当なディレクトリに展開すればインストール完了です。

JMeterの起動

JMeterをインストールしたディレクトリのbinに移動し、以下のコマンドを実行すればJMeterが起動します。

$ ./jmeter

Windowsの場合、jmeter.batをダブルクリックすれば起動します。

起動するとこんな感じにJMeterが立ち上がります。

http://doruby.kbmj.com/daoka_tips/files/jmeter-start.jpg

シンプルなテストシナリオを作ってみる

JMeterがインストールできたら早速テストシナリオを作成しましょう!

JMeterのテストシナリオはテスト計画に要素を追加して作っていきます。

まずは、テスト計画を選択してそこで右クリックしてみましょう。

すると下の画面のように、追加でいろいろなものを追加できるようになります。

http://doruby.kbmj.com/daoka_tips/files/jm01.jpg

まずはテスト計画の下にスレッドグループを追加してください。

スレッドグループはいくつスレッドを立ち上げるか、何秒間ですべてのスレッドを立ち上げるか、何回繰り返すかなどテスト実行の基本部分となります。これによってどのくらいのアクセスをサーバに送るかの制御を行います。*1

スレッドグループを追加、設定したらスレッドグループで右クリックして追加->サンプラー->HTTPリクエストを選択し、追加してください。

このHTTPリクエストサンプラーでHTTPリクエストの送信を行います。これによってWebページのアクセスをモデリングします。

HTTPリクエストサンプラーでは主に以下の項目を設定します。

・ Webサーバ (ホスト名またはIPアドレスを設定)

・ ポート番号 (リクエストを送る先のポートを設定)

・ プロトコール (HTTP、HTTPSなどを記述)

・ メソッド (GET/POSTを選択)

・ パス (アクセスする先のパスを記述)

・ リクエストで送るパラメータ (リクエストするときに送信するパラメータ(フォームやログインID・パスワードなど)がある場合はここに記述)

・ リクエストと一緒に送信されるファイル (ファイルアップロードなどリクエスト送信時に送るファイルがあればここに記述)

今回は下の画面のように、単純に自宅のサーバにリクエストを送るようにしてみました。

(Apacheをインストールした直後のIt Worksが出てくるだけのページですがw)*2

http://doruby.kbmj.com/daoka_tips/files/jm02.jpg

これでもテストを実行することもができますが、レスポンスの状況がどうか確認するためにリスナーを追加します。

リスナーにはいくつか種類がありますが、ここでは「結果をツリーで表示」を追加しましょう。同じくスレッドグループで右クリックし、追加->リスナー->結果をツリーで表示で追加してください。

この結果をツリーで表示は、スレッドごとに送信リクエストの内容、レスポンスの結果、レスポンスの内容が詳細に表示されます。テスト作成段階でよく使用されます。

これでテストシナリオが完成したので、保存して実行しましょう。

実行->開始でテストが実行されます。

すべてのスレッドが、指定した繰り返し回数実行すると自動的に実行終了します。

スレッドの繰り返しを無限にした場合、または何らかの事情で停止したい場合は、実行->停止を押してください。

実行するとリスナーに随時実行結果が表示されます。

結果をツリーで表示の場合は、成功したリクエストには緑色のアイコンが表示されリクエストを選択すると、リクエストごとのレスポンス時間などの詳細なデータを見ることができます。

http://doruby.kbmj.com/daoka_tips/files/jm03.jpg

今回は単純なページアクセスでJMeterのシナリオ作成の基本を紹介しました。今回くらいのテストだとApache Benchのほうが楽に作れますが、次回以降より複雑なシナリオ作成に挑戦していきたいと思います。

*1: スレッド数はあまり多すぎると実行するマシーン、負荷をかけるサーバともに大きな負担となります。また正確な結果を得られない場合もあります。スレッド数を増やすときは最初は小さい数で初め、様子をみて増やすようにしてください。また多くのスレッド数を立てる必要がある場合は、複数のマシーンで行うことも検討してください。

*2: リクエストを送るwebサーバは自分が責任取れるサーバのみにしてください

subversionのリポジトリルートの変更方法

0

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

subversionを置いているサーバーのIPアドレスが変わった事でsubversionのリポジトリルートを変更しなければならなくなりました。

その時に行ったsubversionのリポジトリルートの変更方法を紹介します。

svnのリポジトリルートをリポジトリルートAからリポジトリルートBに変更する方法

※svnリポジトリルートパスは下記を参照

リポジトリルートA http://192.168.1.100/svn/trunk

リポジトリルートB http://192.168.1.101/svn/trunk

svnリポジトリルート変更するにはsvn switch –relocateコマンドを利用すればできます。

svn switch –relocate http://192.168.1.100/svn/trunk http://192.168.1.101/svn/trunk

[Python]遺伝的プログラミングでFizzBuzz

0

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

社内勉強会用に遺伝的プログラミングでFizzBuzzを(作るプログラムを)つくってみました。

勉強会には間に合わなかったのでこちらで公開します。

遺伝的プログラミングの解説と例はこちらの本に載っています。

http://www.amazon.co.jp/%E9%9B%86%E5%90%88%E7%9F%A5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Toby-Segaran/dp/4873113644 (redirection forbidden: http://www.amazon.co.jp/%E9%9B%86%E5%90%88%E7%9F%A5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Toby-Segaran/dp/4873113644 -> https://www.amazon.co.jp/%E9%9B%86%E5%90%88%E7%9F%A5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Toby-Segaran/dp/4873113644/354-1245016-3905348?ie=UTF8&*Version*=1&*entries*=0)

今回作ったスクリプトは上記の本に載っていたものをFizzBuzz用に修正したものです。Pythonで書いてあります。元々のスクリプトの機能は整数の加算、減算、乗算、if、>を組み合わせて目的にあった挙動をするプログラムを組み立てるというものでした。

今回修正した点は

  • 文字列を扱えるよう変数の型の概念を導入した。
  • 結果の出力を画像化した。

の2点です。

ソースコードはこちらから。実行にはPython2.6以降とpyDotが必要です。

genetic_fizzbuzz.py

以下、修正した主な部分の解説です。

class fWrapper:
    def __init__(self,function,child_count,name,params,type):
        self.function = function
        self.child_count = child_count
        self.name = name
        self.params = params
        self.type = type

paramsとtypeを指定して、パラメタ、戻り値の型を指定できるように修正。

def make_random_tree(pc,max_depth=4,fpr=0.5,ppr=0.6,type='object'):
    if random() < fpr and max_depth > 0:
        f = choice(flist[type])
        children = [make_random_tree(pc,max_depth-1,fpr,ppr,type=t) for t in f.params]
        return node(f,children)
    elif random() < ppr and type == 'int':
        return paramNode(randint(0,pc-1))
    elif type == 'object':
        return constNode(choice(['','fizz','buzz','fizzbuzz',randint(0,100)]));
    elif type == 'string':
        return constNode(choice(['','fizz','buzz','fizzbuzz']))
    else:
        return constNode(randint(0,100))

こちらもchildrenを作成するときに戻り値の型を指定するように修正。

mutateとcrossoverも同様の修正をしています。

定数ノードではfizz,buzz,fizzbuzzの文字を発生させる様に修正してます。

本当は文字列もランダムで発生させたかったのですが、進化にかかる時間が増えるので少し手抜きしました。

def write_jpeg(tree):
    stack = [tree]
    g = pydot.Dot()
    root = True
    while len(stack) > 0:
        node = stack.pop()
        parent_node = pydot.Node(node.name+"_"+str(id(node)))
        parent_node.set_label(node.name)
        if root:
            g.add_node(parent_node)
            root = False
        if hasattr(node,"children"):
            for child in node.children:
                stack.append(child)
                child_node = pydot.Node(child.name+"_"+str(id(child)))
                child_node.set_label(child.name)
                g.add_node(child_node)
                g.add_edge(pydot.Edge(parent_node,child_node))
    g.write_jpeg('tree.jpg',prog='dot')

新しく追加したメソッド。

ツリーを受け取って、jpeg画像を出力します。

画像の出力にはgraphvizを使っています。

一世代の個体群の数=100、最大世代交代数=5000で実行した結果が以下の画像です。

図中のif,mod,div,fizz,buzzは関数、p0はパラメータ(fizzbuzzが取る1~100の整数)、それ以外は、定数を表しています。たとえば一番左下のdivから61,11に矢印が伸びている部分はdiv(61,11)=61/11=5を表しています。

図のプログラムを、結果が定数になるような冗長な計算をはぶいてPythonで書くと以下の様になります。

if p0 % 5 > 1:
    if p0 % 3 > 1:
        return ""
    else:
        return "fizz"
else:
    return "buzz"

3、5の公倍数のときの出力ができてないのが残念ですが、おおむねfizzbuzzの動作をしています。個体群数や世代数、突然変異の発生率などを色々変えて試してみましたが、いまのところこれが最善の結果でした。

というわけで、完全な結果が得られなくて残念でしたが、変数型を導入できたので、いろいろ応用ができそうです。また何か作ったらここで公開したいと思います。

ストアドプロシージャを使ってみましょう@MySQL

0

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

こんばんわ。ご無沙汰してます。トマトです。 今回はMySQLでストアドプロシージャを使ってみました。

■ ストアドプロシージャとは?

 一言で表すと複数のSQLを1つの要求だけで実行できる、

 ステキな機能です。

 そんなステキ機能にもメリットデメリットが有ります。

 メリット

・1つの要求だけで複数のSQLを実行できるため、ネットワークに対する負荷を軽減できる

・ 前もってサーバ上で構文解析や機械語に変換するため、処理時間を軽減できる

デメリット 

 ・ データベースごとに記述する構文に規約が有り、互換性が低い

 ・ アプリケーションとのインターフェースが変更になる場合、

   ストアドプロシージャも変更する必要が有り、メンテナンス性が悪くなる

それでは、早速使ってみる事にしましょう。

1. ストアドプロシージャを作ってみる

 とにかく作ってみる事にしましょう。今回使ってみるテーブルはこちら。

 mysql> select * from member_lists;
+------+-------+-------+
| id | name | money |
+------+-------+-------+
| 1 | hoge | 1000 |
| 2 | hoge2 | 2840 |
| 3 | hoge3 | 4789 |
| 5 | hoge5 | 1960 |
| 4 | hoge4 | 6840 |
| 6 | hoge6 | 840 |
| 7 | hoge7 | 784 |
| 8 | hoge8 | 1504 |
| 9 | hoge9 | 777 |
+------+-------+-------+

 まずは単純に

「全レコードを表示させその後 money が 1000 以上のレコードを表示する」

というストアドプロシージャを作ってみましょう。

単純に SQL を書くと

 select * from member_lists; 
select * from member_lists where money>1000;

ここまでは特に問題ないですね。

では、以上の内容のストアドプロシージャを作成し呼び出してみましょう。

 mysql> delimiter //
mysql> create procedure select_money01()
-> begin
-> select * from member_lists;
-> select * from member_lists where money>1000;
-> end
-> //
Query OK, 0 rows affected (0.49 sec)
mysql> delimiter ;

まずはデリミタを変更します。

変更しないとストアドプロシージャを作成中に ‘;’ でSQL 文を中断されてしまいます。

ストアドプロシージャの本体は begin から end までの間に記述をします。

中身は使い慣れているSQL文ですね。

そして無事ストアドプロシージャを作り終わったら

最後にデリミタを元に戻しておきましょう。

では、せっかく作ったのだから呼び出してみないとですよね。

mysql> call select_money01();
+------+-------+-------+
| id | name | money |
+------+-------+-------+
| 1 | hoge | 1000 |
| 2 | hoge2 | 2840 |
| 3 | hoge3 | 4789 |
| 5 | hoge5 | 1960 |
| 4 | hoge4 | 6840 |
| 6 | hoge6 | 840 |
| 7 | hoge7 | 784 |
| 8 | hoge8 | 1504 |
| 9 | hoge9 | 777 |
+------+-------+-------+
9 rows in set (0.00 sec)

+------+-------+-------+
| id | name | money |
+------+-------+-------+
| 2 | hoge2 | 2840 |
| 3 | hoge3 | 4789 |
| 5 | hoge5 | 1960 |
| 4 | hoge4 | 6840 |
| 8 | hoge8 | 1504 |
+------+-------+-------+
5 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

呼び出しをするときには call を使います。

ばっちり動作しますね!

しかし、今のままでは汎用性のないストアドプロシージャになってしまいますよね。

それでは少し手を加えてみましょう。

  mysql> delimiter //
mysql> create procedure select_money02(m int)
-> begin
-> select * from member_lists;
-> select * from member_lists where money>m;
-> end
-> //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

money の値を引数で指定できるようにしてみました。

では早速実行。

 mysql> call select_money02(2000);
# 全レコード表示結果は省略

+------+-------+-------+
| id | name | money |
+------+-------+-------+
| 2 | hoge2 | 2840 |
| 3 | hoge3 | 4789 |
| 4 | hoge4 | 6840 |
+------+-------+-------+
3 rows in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

今回は 2000 で指定してみました。

PHP PEAR::Net_UserAgent_Mobileで携帯端末判別

0

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

こんにちは。cloverです。

PHPで利用する事ができるライブラリ(パッケージ)を提供しているサービスで「PEARライブラリ」というサービスがあります。

そのPEARライブラリの中で、「これ、ちょっといいなぁ」というものを見つけました。

 『Net_UserAgent_Mobile』というPEARライブラリです。

 『Net_UserAgent_Mobile』は、携帯端末の情報(キャリア・機種・識別番号)を取得し、判別することのできるライブラリです。

私の環境はPHP5なのですが、PHP4でも使えるライブラリです。(もちろんPEARがインストールされていないと使えないのですが…)

まずは、インストール

# pear install -f Net_UserAgent_Mobile

※「-f」が必要な理由は、このライブラリがまだbeta版だからです。

※もしかしたら、この時点でWarningが出ることもあります。私の場合は、PEARライブラリのチャネルが古いと言われたので、

 # pear channel-update pear.php.net

を実行しました。(本当は先にやらなきゃいけないらしいですw)

 とりあえず、これでインストール完了!

使い方は、まずライブラリを使いたいとこに

require_once(‘Net/UserAgent/Mobile.php’);

どんなメソッドが使えるかは、ソースを見てもらった方が早いのですが、例えば携帯でのアクセスか、PCからのアクセスかを判断するisMobileを使うとこんな感じで書きます。

// インスタンス作成

$agent = Net_UserAgent_Mobile::isMobile();

$test = ”;

 if($agent){ echo (“モバイルテスト”);

 } else { echo (“PCテスト”);

}

他にも、各キャリアの判別を行うisDoCoMo()、isVodafone()、isEZweb()などもあります。 PEARの公式サイトを見るとまだbetaですが、いろいろ使ってみても面白いかなって思います!

Ruby on Railsでruby-debugを使ってデバッグしよう

0

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

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

今回はruby on railsのデバッグ方法を紹介しようと思います。

以前、aptanaでrailsをデバッグ実行するという記事を書いたのですが、そもそもコンソール上でのデバッグ方法を書いてないなと思ったので書きたいと思います。

いろいろなruby on rails のデバッグ方法はあると思いますが、今回は個人的に便利なデバッグな方法だと思ってる

 ruby-debugというライブラリを利用してのruby on railsのデバッグ方法を説明いたします。

ruby on rails のバージョンによって導入・利用方法が若干違いますので、分けて説明いたします。

まずRails1系の場合を書きます。

debuggerを利用するデバッグ方法


1.gem install ruby-debug

2.development.rbに

 『require ‘ruby-debug’ 

  Debugger.start 

 の2行を記述

3.デバッグしたいソースコードの場所に

  『debugger』、viewの場合は『 <% debugger %> 』

 と記述する。

4.webrickを起動(ruby script/server)して、アプリ実行


5.debuggerと書いたところでアプリが勝手に止まる(一時停止)ので


6.webrickを動かしているコンソールでデバッグ用コマンドをたたく

  • デバッグのコマンド一例
  • l[ist] ソースの表示。
  • var l[ocal] ローカル変数一覧表示。
  • pp 変数名 変数の表示。
  • f[rame] コールスタック表示
  • s[tep] ステップイン実行
  • n[ext] ステップオーバー実行
  • c[ont] 実行再開

コマンドをたたくことにより変数の一覧や実際の値を見れたり、ステップ実行してプログラムの動きを確認することができます。

その他にもデバッグ用コマンドはありますので、以下のサイト(ruby リファレンス)を参考にしてください。

http://www.ruby-lang.org/ja/man/html/debug.html

webrickじゃなくてmongrel使ってるよという人のために

mongrelをそのまま起動しても、デバッグできないので、mongrelを使ったデバッグ方法も記述します。

1.config/debug.rb とか適当なファイルを新しく作る

2.新しく作ったファイルに

  『require ‘ruby-debug’
  Debugger.start

  の2行を記述

3.mongrelを起動させる時に

以下のコマンドでmongrelを起動させると、mongrelでもdebuggerを使ってruby on railsのデバッグができるようになります。

mongrel_rails start -S config/debug.rb

4.debuggerと書いたところでアプリが勝手に止まる(一時停止)ので


5.アプリを動かしているコンソールでデバッグ用コマンドをたたく

この方法が便利なのは、デバッグを動かすスクリプトを別ファイルにしているのでデバッグをうごかしたくないときは、

monbrel_rails start 

で実行すればデバッグをしないので、ruby script/serverで動かす方法よりデバッグする・しないの切り替えが楽です。

(注意:デバッグコードは後でちゃんと消したほうがいいと思う)

Rails2.0以上の場合

rails2系は ruby-debugが正式にサポートされていますので、簡単にデバッグすることができます。

1.gem install ruby-debug 2.デバッグしたいソースコードの場所に

  『debugger』、viewの場合は『 <% debugger %> 』

 と記述する。

3.アプリをデバッグモードで起動(ruby script/server -u)して、アプリ実行

4.debuggerと書いたところでアプリが勝手に止まる(一時停止)ので


5.アプリを動かしているコンソールでデバッグ用コマンドをたたく

rails2系だとデバッグ起動オプションがあるので、rails1系を使うよりかなり楽にデバッグできますね。

ちなみにruby script/server したときにmongrelをいれてたらmongrelで起動します。 

ruby-debugを利用してデバッグ作業を行うと、ruby on railsのデバッグが簡単になると思いますので、ぜひ皆さんも試してみてはいかがでしょうか?

Firefox + Greasemonkey + AutoPagerize でページ閲覧時のストレスを軽減しよう

0

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

みなさま、はじめましてえーきち。。です。

このブログではprogramに特化した話題より

有益なtipsや各種ツールの話題をつらつら書いていこうと思います。

そんな内容ですので

みなさま気楽に目を通していただければと思います。

今日紹介するのは「firefox」+「Greasemonkey」+「AutoPagerize」を使った

ページ閲覧時のストレス軽減tipsです。

googleなど何らかのページを検索+表示した際には

通常、ページ下部まで移動したあと”次へ”や”2ページ目”を押下し遷移する必要がありますが

これを使うとページ下部に、先に読み込んだ次の候補のページ、を表示してくれるものです。

では詳細を

firefox:http://mozilla.jp/firefox/
firefoxはブラウザソフトですね。
カスタマイズが非常に強力なブラウザですが詳しい説明は省きます。

greasemonkey:https://addons.mozilla.org/ja/firefox/addon/748
greasemonkeyはfirefoxのアドオン。
各種javascriptなどと組み合わせてwebページを体裁をととのえたりできます。
 firefoxで上記のURLにアクセス、
 ページ内のインストールボタンを押すと
 インストールの許可を求めてきますので許可(インストール)します。
 その後firefoxの再起動。
greasemonkey"だけ"では特に何ら変化はありません。


AutoPagerize:http://userscripts.org/scripts/show/8551
AutoPagerizeはgreasemonkey用のスクリプトで
今回の紹介した機能を実現するメインのものです。
 上記のURLにアクセス、
 右側のinstallをクリックしてインストールします。

これでgoogleやyahoo、ニコニコ動画などでスクロールボタン一つで
快適にページを閲覧することができます。

AutoPagerizeを見るとわかるように

http://wedata.net/databases/AutoPagerize/items.json

のファイルに書かれたsiteinfoを読み込んでいるのですが

何らかの原因で上記サイトが落ちてるとも限りません。

ですのでミラーサーバを用意してくれる親切な方々もいてますので

そこも登録しておきましょう。

firefox:[ツール]-[Greasemonkey]-[ユーザスクリプトの管理]
AutoPagerizeを"編集"、テキストエディタは任意で、、、

31行目あたりに
var SITEINFO_IMPORT_URLS = [
    'http://wedata.net/databases/AutoPagerize/items.json',
]
とあるのでこれを

var SITEINFO_IMPORT_URLS = [
    'http://wedata.net/databases/AutoPagerize/items.json',
---*ここから
    'http://ss-o.net/databases/AutoPagerize/items.json',
---*ここまで追加
]

もしくは

var SITEINFO_IMPORT_URLS = [
    'http://wedata.net/databases/AutoPagerize/items.json',
---*ここから
    'http://utatane.appjet.net/databases/AutoPagerize/items.json', 
---*ここまで追加
]

としましょう。

さらに、ここに登録されてないがよく見るサイトや

自社関連のサイトも使えるようにしたくなりますし

またすべてのミラーサーバが使えない場合も考え

ローカルに記載する方法が以下となります。

これも先ほどと同じく
firefox:[ツール]-[Greasemonkey]-[ユーザスクリプトの管理]
AutoPagerizeを"編集"、テキストエディタは任意で、、、

※例としてgoogleを登録
var SITEINFO = [
---*ここから
    {
        url:          'http://.*google.+/',
        nextLink:     'id("nav")//td[last()]/a',
        pageElement:  'id("res")/div',
        exampleUrl:   'http://www.google.com/search?q=nsIObserver',
    },
---*ここまで追記
]

以上、長くなりましたが紹介となります。

エンジニアに限らずみなさまに使っていただけるtipsですので

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

アクセス解析で見るユーザビリティ -目的のコンテンツへの道筋を整えよう!-

0

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

こんにちは。アクセス解析チームの大山です。

アクセス解析を行うことで、ユーザの様々行動履歴を追うことができます。

ユーザにはそれぞれの目的があります。

制作側はそれぞれの目的までの道筋を用意していると思いますが、

思惑通りの動きをしてくれるユーザはそういません。

結果、多くのユーザは目的ページにもたどり着かず離脱しているのではないでしょうか。

【?】なぜ制作側が用意した道筋を辿ってくれないの・・・?

【!】道中にユーザビリティへの配慮が足りていないページの存在が考えられます。

【?】そこはどこ・・・?

【!】アクセス解析を使った問題ページ発見方法と改善案をお教えします!

 ※ ユーザの行動履歴を追うことの重要性はコチラ

   「アクセス解析の重要性 時代はAIDMAからAISCEASへ」

目的のコンテンツへの道筋を整えよう!

■問題ページ発見方法

「滞在時間が長いページの離脱率を調べよう!」

①まずはアクセス解析ツールで滞在時間の長いページをピックアップ。

 ※ユーザの目的となるページやコンバージョンの発生するページは

  じっくり見てもらう必要があるので除外。

②ピックアップしたページの離脱率を調べましょう。
③ピックアップしたページを実際に数人で閲覧し目的達成までの
 各ページの時間を計ってみます。
④製作者が必要とした滞在時間とユーザの滞在時間を比較し、
 問題ページを洗い出しましょう。

「滞在時間が長いページ=人気ページ」と思いがちですが、

本当は迷子になって立ち止まっているだけかもしれません。

立ち止まっても、目的への道筋を見つけられるのであれば問題視することはありません。

けれど立ち止まって、元の位置に戻ることもできず帰ってしまうユーザが多いページがあれば、

そこが問題ページです。

■GoogleAnalyticsでの見方

図)「コンテンツ」にある「上位のコンテンツ」をクリック。デフォルトではページビューの多い順に

  並んでいます。ページビューが多く平均ページ滞在時間に注意するべし。

  離脱率も同時に見れます。

図)滞在時間の長いページを確認するには「平均ページの滞在時間」をクリックすると、

  滞在時間でソートされます。

■道筋を整えるための改善案

問題ページである理由と合わせて、改善策を考えてみましょう。

・ユーザが立ち止まる理由

①トップページに戻れない

②今どこにいるのかわからない

③カテゴリ名称が分かり辛い

①トップページに戻れない

トップページはリンク数が多いのが一般的であることから、ほとんどのユーザは

戻れば何とかなると思う傾向があります。

トップページにすら戻ることができないとわかった瞬間、ユーザはどれほどガッカリするでしょうか。

場合によっては離脱の原因にもなりかねません。

すぐにトップページに戻れる手段があることを、どのようなユーザにも分かりやすくする

伝える必要があります。

経験が少ないユーザほど次のような行動特性があるといわれています。

・検索エンジンの表示結果と同様にページの上部に必要な情報があると思っている

・スクロール行為になれていない

また通常は左上から下に向かって移動し、気になるものがあると右方向へ移動することが

多いと言われています。

よく、左上にトップページリンクがありますよね。これは上記理由に当てはまることから

正しい手段であり、また一般化していることから、有効な方法であると考えられます。

トップページに戻れない→左上にトップページリンクを置くべし!

 図)多くのユーザに見られる視線。左上から下に向かって移動し、

  気になるものがあると右方向へ移動する

②今どこにいるのかわからない

今どこにいるのかわからず、とりあえず離脱を考えるユーザも少なくありません。

サイトの階層と現在いるページの位置がすぐにわかる「パンくずリスト」が有効です。

また、パンくずリストは関連商品などに誘導するためのナビゲーションとしても利用できます。

最近の消費者行動に見られる比較検討に大きく貢献できる方法であることが考えられます。

※消費者行動の移り変わりについてはコチラ

  「アクセス解析の重要性 時代はAIDMAからAISCEASへ」

 図)パンくずリストはサイトの階層と現在いるページの位置がすぐにわかる

③カテゴリ名称が分かり辛い

リンクの存在に気づいてもリンク先の想像が付かず次の行動移せないケースもあります。

単にカテゴリ名だけではで理解しにくいことが理由として挙げられます。

例えば「生活雑貨」であればその下に「キッチン用品」「バス用品」等のサブカテゴリと

説明を沿えたテキストリンクを付けると有効であると考えられます。

また機能別・ブランド別など複数のカテゴリ分類を併用すると目的のものが探しやすくなります。

どうでしょうか。

自身のサイトと当てはまる部分があれば幸いです。

<ひとりごと>

最近、甥が生まれました。

おばちゃんになってしまいました。

でも甥は超スーパーミラクル可愛いので

「おばちゃん」と呼ばれても許します。

■アクセス解析担当者の記事

+—————————————————————————–+

+—————————————————————————–+

Ruby on Railsの部分テンプレートを使ってみよう

0

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

はじめまして、kaoriです。

WEBサイトの主な機能は、登録・編集・削除・表示・検索などが挙げられますが、

今回は登録・編集を例に部分テンプレート機能をオススメしたいと思います。

掲示板を例えに出すと、記事の投稿が登録にあたります。

そして記事の編集。

基本的にこの2つ(登録・編集)に必要な入力内容は一致していて、

ざっくり言うと ・名前 ・メールアドレス ・件名(スレッド名) ・本文 などが挙げられます。

それぞれのビューファイルにそれぞれ入力フォームを記述してもいいのですが、

部分テンプレート機能を使用すると、同じ構成の記述をしなくても済むようになります。

(いくつかの案件をやってきましたが、登録画面と編集画面はHTML上は同一の構成が多いのです)

Railsの「render :partial」を使用し、入力フォームを外出ししてみます。

(やり方は本などでよく紹介されているため、省略させて頂きます。。)

登録画面・編集画面・入力フォームの3ファイルほどが完成すると思います。

実際にやってみると実感するかと思いますが、書く量がかなり減ります。

さらに!!

実際の案件でよくあるのが仕様変更!!!

「セキュリティーの関係上、メールアドレスの項目を無しにして欲しい」

「その代わりに、投稿時間を指定できるようにしたい」

などなど。お客様からの改善希望は堪えません。

 投稿・編集画面それぞれに入力内容を書いていたら、

忙しさのあまり投稿画面には追加したけど編集画面は……なんてことにもなりかねません。

皆様もぜひ、利用してみてください。…

DRBD+Heartbeat+NFS

0

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

こんにちは、たろちゃんです。

今回、DRBDとHeartbeatとNFSを組み合わせた仕組みを作成しました。

DRBDとHeartbeatの構築自体については、tacchiさんのDRBDのインストール及びHeartBeatの設定を参照してください。

なお、今回作成した環境はXenの準仮想化環境上の CentOS 5.2 64bit です。そのため、前述のDRBDの記事とはインストール方法が異なり、yumを使ってCentOSのレポジトリからDRBDの導入をしました。

# yum install kmod-drbd82-xen.x86_64
# yum install drbd82.x86_64

DRBDのバージョンは8.2.6ですが、設定については8.0系とほとんど変更はございません。

では、構築作業を見ていきましょう。

今回構築するサーバは以下のような構成になっているとします。

IPアドレスホスト名用途
192.168.99.1testserver1DRBD, Heartbeat, nfsサーバ
192.168.99.2testserver2DRBD, Heartbeat, nfsサーバ
192.168.99.3testserver_virtualHeartbeatが管理する仮想IP
192.168.99.4testclientnfsでマウントするクライアント

まず、DRBDとHeartbeatの構築をしておきます。こちらは省略します。

続いて、Heartbeatの /etc/ha.d/haresoureces の設定を行ないます。

# vim /etc/ha.d/haresources
testserver1 drbddisk::drbd0 Filesystem::/dev/drbd0::/var/drbd::ext3 IPaddr::192.168.99.3/24/eth0

こちらの設定で DRBD の復帰と、 /dev/drbd0 を /var/drbd へのマウント、仮想IPの割りあてが行なえます。もちろん、testserver1とtestserver2で /var/drbd を作成しておく必要があります。

# mkdir /var/drbd

この段階で一度 heartbeat のテストをします。testserver1でheartbeatを停止してtestserver2で/var/drbdがマウントされるのを確認し、testserver1でheartbeatを再起動してtestserver1で/var/drbdがマウントされるのを確認すれば良いかと思います。

さて、肝心のnfsmountをするための設定を行います。

まずはnfs関係のサービスなどを停止します。testserver1とtestserver2の両方で行います。

# /etc/init.d/nfs stop
# /etc/init.d/nfslock stop
# /etc/init.d/rpcidmapd stop
# umount sunrpc

次にtestserver1でnfsのサービスが使用するファイルの移動と元の場所へのシンボリックリンクの作成を行います。

# mkdir -p /var/drbd/nfs/var/lib
# mv /var/lib/nfs /var/drbd/nfs/var/lib/
# ln -s /var/drbd/nfs/var/lib/nfs /var/lib/nfs

次にtestserver2で不必要になるファイルの移動とtestserver1と同様にシンボリックリンクの作成を行います。

# mv /var/lib/nfs /var/lib/_nfs
# ln -s /var/drbd/nfs/var/lib/nfs /var/lib/nfs

これでtestserver1からtestserver2に切り変わってもnfsのサービスを動かせるようになりました。

次にtestserver1でnfsmountする領域を作成します。

# mkdir /var/drbd/nfs/userdata

次にtestserver1とtestserver2の両方で、 /etc/exports を編集します。

# vim /etc/exports
/var/drbd/nfs/userdata  testclient(rw,sync)

次に、testserver1とtestserver2でOS起動時にnfsのサービスが起動しないように設定します。

# chkconfig nfs off
# chkconfig nfslock off
# chkconfig rpcgssd off
# chkconfig rpcidmapd off

以上でnfsの基本設定は終わりです。次に、heartbeatがnfsのサービスを起動、停止を行なうためのスクリプトを作成します。こちらはtestserver1とtestserver2の両方に設置します。

# vim /etc/ha.d/resource.d/nfsmount
#!/bin/bash
#
# nfsmount
#
PATH=/bin:/usr/bin:/sbin:/usr/sbin
export PATH

start() {
        mount -t rpc_pipefs sunrpc /var/lib/nfs/rpc_pipefs
        service rpcidmapd start
        service nfslock start
        service nfs start
        exit 0
}

stop() {
        service nfs stop
        service nfslock stop
        service rpcidmapd stop
        umount sunrpc
        STATUS=`LANG=C service nfs status|grep "running"`
        if [ -n "${STATUS}" ];
        then
                killall -HUP nfsd
        fi
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        *)
                echo $"Usage: $0 {start|stop}"
                exit 1
esac

exit 0

ここで注意する点は、停止時(stop)にnfsのサービスが終了していない場合はnfsdをkillする必要がある点です。この処理が無いと、nfsdが終了しなかった際にheartbeatが正常に動作せず、予期せぬトラブルを招く恐れがあります。(実際には、heartbeatがOSの再起動プロセスを走らせてしまい、サーバがシャットダウンもできないという状態になった事があります)

最後に先程作成したnfsmountスクリプトに実行権限を与えて、 /etc/ha.d/haresources を修正します。

# chmod 755 /etc/ha.d/resource.d/nfsmount
# vim /etc/ha.d/haresources
testserver1 drbddisk::drbd0 Filesystem::/dev/drbd0::/var/drbd::ext3 IPaddr::192.168.99.3/24/eth0 nfsmount

以上で設定は完了です。heartbeatの停止、起動をしてみてnfsがちゃんと切り替わる事、nfsmountが継続される事を確認しましょう。

# mount -t nfs testserver_virtual:/var/drbd/nfs/userdata /mnt/nfstest

問題がなければ、testclientのfstabに通常のnfsと同様に追加をしてあげれば良いです。

Flash(ActionScript)でLoadVars.sendAndLoadを使ってRuby on Railsと連携しよう

0

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

ご無沙汰しております。エンジニアの はる です。

前回は「Ruby on RailsとFlash(ActionScript)のXML連携」について、記事を掲載させていただきましたが、今回は、Ruby on RailsとFlash(ActionScript)の”LoadVars.sendAndLoadメソッド”を使用した連携について書いてみたいと思います。

Rails側とFlash側の作業は、

	[Rails]テキスト形式の結果を返す。
[Flash]loadVars.sendAndLoadメソッドを使用して、データの送信・受信を行う。

	

となります。

[Flash(ActionScript)]

#onClick時、Railsアプリに「test=1」「test=2」「test=3」を送信。

#Rails側で処理を行った後、result_lvでレスポンスを受け取ります。

	on(release){
  var send_lv = new LoadVars();
  var result_lv = new LoadVars();
  send_lv.sendAndLoad('http://localhost/test/reply?test1=1&test2=2&test3=3',result_lv,"POST");
  result_lv.onLoad = function(success:Boolean) {
    if (success) {
      trace("success");
      _root.test1.text=result_lv.test1;
      _root.test2.text=result_lv.test2;
      _root.test3.text=result_lv.test3;
    } else {
	  trace("error");
    }
  }
}

	

[Rails]

#パラメータを受け取り、処理を行った後、レスポンスを返します。

	def reply
  array = ["one","two","three"]
  response.headers["Content-Type"] = 'text/plain; charset=UTF-8'
  render :text => "&test1=#{array[params[:test1].to_i]}&test2=#{array[params[:test2].to_i]}&test3=#{array[params[:test3].to_i]}"
end

#viewで返り値を管理したい場合は、以下のように記述します。
def reply2
  @array = ["one","two","three"]
  response.headers["Content-Type"] = 'text/plain; charset=UTF-8'
  render(:text => render_to_string(:partial => 'reply').strip)
end

	

#_reply.rhtml

	&test1=<%=@array[params[:test1].to_i]%>&test2=<%=@array[params[:test2].to_i]%>&test3=<%=@array[params[:test3].to_i]%>

	

#結果

	_root.test1.text => "one"
_root.test1.text => "two"
_root.test1.text => "three"

	

以上のように、LoadVars.sendAndLoadメソッドを使用することで、前回ご紹介したXML連携よりもだいぶスマートに連携することができます。

大量のデータを読込む場合は、XML連携のほうが便利ですが、解析データ送信したり、クライアントで処理するには重い計算を一度サーバーで行ってからレスポンスだけを返す場合等に有効かと思います。

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

0

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

はじめまして!KBMJでエンジニアをやっているT氏です。

初投稿の今回は、rakeコマンドについてご紹介したいと思います。

*rakeとは・・・ビルドツール(AntやMake等)のruby版の事

まず初めに、rakeのバージョンを調べてみましょう。

rake –version

ちなみに私は0.8.3でした。

次にrakeにどのようなオプションがあるか見てみましょう

rake –task (rake -TでもOK)

恐らく大量のオプション一覧が出てくるかと思います。。。

その中から、便利なコマンドをつまんでご紹介します。

rake db:…

rake db:migrate

→migrateを実行して最新のバージョンになります(一番使う事が多いかと思います)

rake db:migrate:up VERSION=xxx

rake db:migrate:down VERSION=xxx

→バージョンを指定してmigrateを実行します

rake db:rollback

→1つ前のバージョンに戻してくれます。結構便利です。

rake db:version

→現在のバージョンを確認できます

rake test:…

rake test

→ 全てのテストを実行します

rake test:functionals

rake test:integration

rake test:units

→units,functional,integrationそれぞれのテストを実行します

*実行前にtest/にテストコードを書く必要があります

rake rails:…

rake rails:freeze:gems

→使用するrailsのバージョンを固定してくれます

*gemのrailsを vender/plugin コピー(unpack)しているようです

rake rails:unfreeze

→固定したrailsのバージョンを解除します

* vender/plugin のrailsを削除するようです

その他

rake routes

→routes.rbで定義したルートを表示します

rake stats

→対象アプリケーションの統計情報(MVCやメソッド、テストの数)を表示します

rake _x.x.x_ db…

→_x.x.x_にrakeのバージョンを入れる事で、指定したバージョンでrakeを実行できます。

rake –help

→rakeのヘルプを表示します

以上です。

他にも紹介しきれなかったものが数多くありますが、皆さんも是非ご活用下さい。

最後までご覧頂き、ありがとうございました!

RubyのStringクラスのインスタンスメソッドについて

0

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

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

今回は、とても便利なので、RubyのStringクラスのインスタンスメソッドについて説明します。文字列の長さを調べるメソッド

 test = “abcdefg”

 test.size => 7

連結した文字列を返すメソッド

  test = “abcdefg”

 test + “hij” => “abcdefghij”

  p test => “abcdefg”

自分自身へ文字列を追加するメソッド 

 test = “abcdefg”

  test << “hij” => “abcdefghij”

  p test =>  “abcdefghij”

与えられた正規表現にマッチするかどうかを返すメソッド

  test = “abcdefg”

   test =~ /ab/ => 0

   test =~ /zx/ => nil

 指定された区切りによって分割して配列に返すメソッド

   test = “abc|efg|hij”

    test.split “|” => [“abc”, “efg”, “hij”]

 小文字化した文字列を返すメソッド

   test = “ABC”

     test.downcase => “abc”

 大文字化した文字列を返すメソッド

   test = “abc”

     test.upcase => “ABC”

 指定された文字列置換を一度だけするメソッド

     test = “abcxefgxhij”

     test.sub “x”,”X” => “abcXefgxhij”

 指定された文字列置換するメソッド

     test = “abcxefgxhij”

     test.gsub “x”,”X” => “abcXefgXhij”

以上

PowerPointで作るボタン 2/2

0

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

PowerPointで作るweb2.0風ボタンの続きです。

その1はこちら

それでは、ここに文字を乗せましょう。
挿入メニューよりテキストボックス(横書き)を選択。
作成した図形をクリックして文字を入れます。 入力した文字を全選択すると、
文字設定が出てくるので 好きなフォント、色、サイズにしましょう。
例では白に設定しました。

文字に効果をつけて読みやすくします。
文字が選択された状態で、メニューの書式よりワードオートスタイルの
文字の効果より 光彩を選択します。(例ではアクセント1.5ptを選択)

目的の色がサンプルにない場合は、その他の光彩の色で色を指定します。
これでボタンが完成しました。

 図形を選択した状態で右クリックし、図として保存をクリック。
pngファイルとして書き出します。 これで終わりといきたいのですが、最後の調整です。


スタートメニューよりOffice→Officeツール→PictureManagerを起動します。
左側の「画像へのショートカット」より、保存先を選択します。
無い場合は一番上の画像のショートカットの追加をクリックし、追加します。
真ん中のリストから、先ほど保存した画像をダブルクリック。 編集画面になります。
実は画像の上部に謎の余白がついてしまうので、それを取ります。
右側のメニューから画像の編集を選択。トリミングをクリックします。
画像の周りに枠が出るので、上部の─を下にドラッグして、 ぴったりサイズに囲います。

右メニューのOKをクリックすると、トリミングされます。

次に画像サイズの調整をします。
上部メニューより、画像の編集をクリック。 右側に出たメニューより、サイズ変更を選びます。
縦横比を維持したまま縮小したいので、拡大または縮小率にチェックを入れ、
パーセンテージを指定します。下部に表示される新しいサイズを見ながら 調整して下さい。

適当なサイズになったらOKを押して、名前をつけて保存したら完成です。
(jpgやgifでも保存できるのですが、すごく汚くなるのでおすすめしません。
リサイズと他形式への書き出しは他のフリーソフトの方がいいかも知れません)


以上、長くなりましたが、いかがでしたでしょうか?
ちょっとしたボタン1つで、全体のクオリティーアップに貢献できると思います。
是非試してみて下さい。

PowerPointで作るボタン 1/2

0

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

はじめまして、デザイナー(多分)のみゃです。
Dorubyのデザイン担当しておきながら、記事の投稿は初めてです。
ここではエンジニアの方向けのデザインについて書きたいと思います。

こんなボタンが作れます。

※画像が多いので数回に分けます。

私が普段使っているのはPhotoshopなのですが、
社内のPCならとりあえず入っていそうなPowerPointで ボタン素材を作る方法を解説していきます。
ここで使うPowerPointのバージョンは2007です。
以前のバージョンには無い機能があったり、画面などが違うかも知れません。 ご了承下さいませ。

PowerPointを起動し、ファイルを新規作成したら、 メニューのホームからレイアウトをクリック。
「白紙」のテーマを選択。 メニューから挿入→図形より 角丸四角形を選択し、
作りたいサイズくらいの四角形を描きます。

(本当はサイズ指定して作ることができればいいのですが…)
角丸四角形が描けたら、角の丸みの調整をします。
黄色い◆を左右に動かすと、角の丸みが変化します。
(角の丸が大きいほど子供っぽく優しい印象になります)

角丸の調整ができたら、図形の上で右クリック。図形の書式設定を選択します。

左メニューの線の色を選択し、濃い目のグレーに設定します。
(同系の濃い色か濃いグレーが無難ですが、好きな色に設定して下さい)
次に塗りつぶしを選択し、リストよりグラデーションを選択。
グラデーションの分岐点にそれぞれ色を指定します。

リスト内の分岐点1~3に以下の指定します。

【分岐点1】分岐点-0%、色-薄い色 例:R237.G242.B249
【分岐点2】分岐点-50%、色-分岐点1の色より少し濃い色 例:R142.G180.B227
【分岐点3】分岐点-54%、色-分岐点2の色よりはっきりわかる濃い色 例:R85.G142.B213

最後に分岐点の追加をクリックし、分岐点4に以下の指定をします。

【分岐点4】分岐点-100%、色-分岐点3の色より少し明るく、鮮やかな色 例:R82.G184.B216

これでキモとなるグラデーションの完成です。
文字だと色の表現が伝わりにくいですが、分岐点1~2で明るい色のグラデーション、
分岐点3~4で暗い色から鮮やかな色へのグラデーションになっていて、
分岐点2と3の色の差がはっきりしているのがポイントです。

 その2へ続く→ 

Ruby on Railsプロジェクトのversion変更方法

0

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

初めまして。新人のrickです。
今回は、railsのプロジェクトを作ってからversionupしたくなったときの方法を紹介します。
今回は、[rails 1.2.3]から[rails.1.2.6]へ変更します。
まずは、
gem list rails
でinstallされているversionを確認します。
もちろん入っていなかったら
gem install rails –version=1.2.6
とかでinstallしてください。

次に、projectのversionの確認です。
プロジェクト内で
ruby script/about
とうってみてください。
About your application’s environment
Ruby version 1.8.6 (universal-darwin9.0)
RubyGems version 1.0.1
Rails version 1.2.3
Active Record version 1.15.3
Action Pack version 1.13.3
Action Web Service version 1.2.3
Action Mailer version 1.3.3
Active Support version 1.4.2
Application root /Users/enomoto/etc/123
Environment development
Database adapter sqlite3
こんな感じでrailsなどのversionがわかります。

次に、[config/enviroment.rb]の10行目のRAILS_GEM_VERSION = ‘1.2.3’をRAILS_GEM_VERSION = ‘1.2.6’へ変更します。

つづいて
rake rails:update:configs
をたたくだけで終了です。

もういちど
ruby script/about
をたたいてみてください。
Ruby version 1.8.6 (universal-darwin9.0)
RubyGems version 1.0.1
Rails version 1.2.6
Active Record version 1.15.6
Action Pack version 1.13.6
Action Web Service version 1.2.6
Action Mailer version 1.3.6
Active Support version 1.4.4
Application root /Users/enomoto/etc/123
Environment development
Database adapter sqlite3

こんな感じにかわっているはずです。

以上、プロジェクトのversion変更でした〜。
ちなみに、1.0系から2.0系はやめておいた方がいいですよ。
でわでわ。

最近人気な記事