ホーム ブログ ページ 60

外部URLを偽装するテスト用ライブラリ「FakeWeb」

0

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

ご無沙汰しています。KBMJのプログラマのx5rです。

最近、私が携わるプロジェクトでは、外部APIを利用したい、一部の機能を外出しにしてサービス間で連携したいという要望が徐々に増えつつあります。

ただし、その外部システム(サービス、API)と連携する機能を実装はするものの、その機能をテストする場合、テストケース毎に毎回外部連携する訳にはいかないので、どうすればいいのかわかりませんでした。

仮に、毎回そのシステムにリクエストを投げてテストするとしても、その外部システムも並行している開発する場合、そのシステムが出来上がるまで待っていなければなりません。

みなさんこういった外部連携のテストをどうやって行っているのか調べていたところ、FakeWebというWebリクエストを偽装するgemライブラリがあることを知りました。

そこで、今回はこのFakeWebというgemライブラリについて紹介したいと思います。

インストール


sudo gem install fakeweb

サンプルプログラムとして、「みんな大好きgithub」ということで、先日Issue Tracker機能が追加され、また先日バージョンアップしたgithub APIを叩くプログラムを書いてみました。

はい、私が試したかっただけです。。。

github APIについて詳しくはDevelop.GitHubを参照してください。

以下は、自分のアカウント名とリポジトリ名を引数として渡すとリポジトリ情報をYAML形式で取得するプログラムになります。

試しに動作するか確認してみましょう。
私のアカウント「mat5uda」にあるリポジトリ「dotfiles」の情報を取得してみましょう


# github_api.rbのディレクトリで
$ irb
irb(main):001:0> require 'github_api'
=> true
irb(main):002:0> GitHubApi.new.repository('mat5uda', 'dotfiles')
=> {"repository"=>{:owner=>"mat5uda", :homepage=>"http://matsuda.wordpress.com/", :name=>"dotfiles", :private=>false, :fork=>false, :forks=>0, :description=>"My configuration files", :url=>"http://github.com/mat5uda/dotfiles", :watchers=>1}}

うまく取得できることが確認できました。

さて、それでは本題のテストを書いてみます。

最近はRSpecを利用するのが流行のようですが、自分の携わっているのはTestUnitなので、これを利用します。

※ github_api.rbとgithub_api_test.rbは同じディレクとにあるとします。

・使い方


FakeWeb.register_uri(:get, "http://github.com/api/v2/yaml/repos/show/foo/hoge", :string => response)

という箇所がrequestを偽装している処理になります。


FakeWeb.register_uri(method, uri, options)

のmethodにHTTPメソッド、uriに偽装するURI、optionsに:stringキーでレスポンスとして期待する値を渡します。

その他のoptions指定や詳しい使い方はFakeWeb API Documentationを参照してください。

では実際にテストする前に、テストで使用するアカウント「foo」にあるリポジトリ「hoge」を実際に確認してみます。


$ irb
irb(main):001:0> require 'github_api'
=> true
irb(main):002:0> GitHubApi.new.repository("foo", "hoge")
=> {"error"=>[{"error"=>"repository not found"}]}

実際には存在しないので、該当なしという結果が返ってきます。

では、テストを実行してみましょう。


$ ruby github_api_test.rb 
Loaded suite github_api_test
Started
.
Finished in 0.001169 seconds.

1 tests, 4 assertions, 0 failures, 0 errors

期待したとおりにテストが通りました。

このように、もし連携先のシステムがまだ(実装中などで)存在しない場合で、そのシステムにHTTPアクセスするような機能のテストでは、スタブとしてFakeWebを利用することで、その機能自体のテストができるようになるので、利用してみてはどうでしょうか?

Ruby On Rails グラフ表示 Gruff

0

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

ども、rickです。

今日は、グラフを簡単に表示できるプラグインの紹介です。

環境

rails 2.2.2
ImageMagick 5.1-3
RMagick 2.9.1

Install

$gem install gruff

設定

configer/enviroment.rb

require ‘gruff’

app/controllers/??.rb

def xxx
@gruff = Gruff::Pie.new 500
@gruff.title = ‘test’

@gruff.data(‘Good’, 80)
@gruff.data(‘Bad’, 20) @gruff.write(‘votes.png’)
#send_data(@gruff.to_blob, :type => ‘image/png’, :disposition => ‘inline’)
end

表示

app/controller/xxx.html.erb

<%= tag(“image”, :src => url_for(:action => ‘xxx’, :controller => ‘???’)) %>
or
<img src=”<%= url_for :controller=>’???’, :action=>’xxx’ %>>>

こんなかんじで、一応表示できます。
はっきりってまだ大して調べていないのでもちょっと調べたらまた書きたいと思います。

以上〜

関連コンテンツのサイトを作る場合のドメインの使い分けについて

0

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

関連コンテンツのサイトを作る場合のドメインの使い分けについて

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

前回、複数ドメインのサイトを計測する方法をご紹介しました。
今回は、そもそも関連サイト間でのドメインの使い分けに
どのような効果があるのかご紹介しようと思います。

関連したコンテンツのサイトを作る場合には、下記3つの方法があります。

  1. 同ドメイン名
  2. 別ドメイン名
  3. サブドメイン名
関連コンテンツのサイトを作る場合のドメインの使い分けについて

以下、①~③のメリット(○)、デメリット(×)になります。

  1. 同ドメイン名
  2. 別ドメイン名
  3. サブドメイン名

上記のように、現状あるサイトのドメインを分ける、統一することにSEO効果を見出すことは難しいのかもしれません。

  1. 1ドメインにつきサイトテーマの統一性
  2. テキストボリュームの最適化
  3. ユーザが迷わない構造(ユーザビリティ)

上記の基本的な点をクリアできるのであればドメインを分け、クリアできないのであれば同ドメインでの運営が望ましいのではないかと思います。

※私の知る情報や推察を含めた情報なので間違いがあるかもしれません。予めご了承下さい。

■バックナンバー・‥‥━━★

■アクセス解析関連記事・‥‥━━★

テーブルをcssで立体的にアレンジする

0

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

テーマ:【テーブルをcssで立体的にアレンジする】

使用:【XHTML/CSS  photoshop 透過png】

それでは早速やってみます。 >

使用するhtmlはこちら。<table>
<caption><span></span>テーブルのデザインアレンジ</caption>
<tr>
<th></th>
<th>セレス</th>
<th>パラス</th>
<th>ジュノー</th>
<th>ベスタ</th>
</tr>
<tr>
<td class=”row”>火星</td>
<td>opposition</td>
<td>square</td>
<td>trian</td>
<td>trian</td>
</tr>(ーーーー以下くりかえし)
</table>

これによく使うcssをはめ込んでみます。

caption {
    padding: 2px 0 2px 8px;
    margin-bottom: 5px;
    border-left: 5px solid #d94800;
    text-align: left;
    font-weight: bold;
}

table {
    width: 506px;
    border-collapse: collapse;
    font-family: Georgia, “Verdana”, “MS Pゴシック”, sans-serif;
    color: #333333;
}
th {
    width: 100px;
    padding: 0.5em;
    border: 1px solid #cccccc;
    background: #739999;
    color: #ffffcc;
}
td.row {
    width: 100px;
    padding: 0.8em 0.5em;
    border: 1px solid #cccccc;
    background: #e2e2e2;
    font-weight: bold;
    color: #333333;
}
td {
    width: 100px;
    padding: 0.8em 0.5em;
    border: 1px solid #cccccc;
    text-align: center;
    font-weight: bold;
    color: #d94800;
}

この状態でブラウザを見ると、

普通ですね。 

では、少し工夫を加えたcssにしてみます。

caption {
    position: relative;
    padding: 5px 0 5px 45px;
    background: url(../img/caption.png) no-repeat left top;

  /* 背景に双葉の形をした画像を指定 */    
    text-align: left;
    font-size: 18px;
    font-weight: bold;
    color: #333333;
}
caption span { /* テキストに透過pngを使ってグラデーションをつける */

    background: url(../img/touka.png) repeat-x left top;
    position: absolute;
    display: block;
    width: 100%;
    height: 30px;
}
table {
    width: 506px;
    border: 3px solid #e2e2e2;
    border-collapse: separate;
    border-spacing: 0; /* ボーダー同士の隙間をなくす */
    font-family: Georgia, “Verdana”, “MS Pゴシック”, sans-serif;
    background: url(../img/table.png) repeat-x left top;

  /* 背景にグラデーションの画像をひいてテーブル全体に変化をつける */

  color: #333333;
}
th {
    width: 100px;
    padding: 0.5em;
    border: 1px solid;
    border-color: #a3cccc #558080 #558080 #a3cccc;

    /* borderの4辺の色指定をそれぞれ違う色にし立体的にみせる */

  background: #ffcccc url(../img/th.png) repeat-x left top;

  /* 背景に画像をひく */

    color: #ffffcc;
}
td.row {
    width: 100px;
    padding: 0.8em 0.5em;
    border: 1px solid;
    border-color: #e2e2e2 #b3b3b3 #b3b3b3 #e2e2e2;
    background: #ffcccc url(../img/td.png) repeat-x left top;
    font-weight: bold;
    color: #333333;
}
td {
    width: 100px;
    padding: 0.8em 0.5em;
    border: 1px solid;
    border-color: #e2e2e2 #bfbfbf #bfbfbf #e2e2e2;
    text-align: center;
    font-weight: bold;
    color: #d94800;
}

これをブラウザで見ると、

 立体的になりました。

 こんな風に簡単に、cssを使って単調なテーブルを美しくみせることができます。

 少しでもユーザーにとって心地の良い見た目に近づけられればいいかなーと思います。

 以上、【テーブルをcssで立体的にアレンジする】でした。

Ruby On Rails 国際標準化機能 I18n その2

0

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

ども。5日目rickです。

では早速、昨日紹介したRuby On Rails 国際標準化機能 I18n その1の続きのその2の紹介です。

今回の環境説明

前回と同じ

Install

$sudo gem so -a http://gems.github.com
$sudo gem i amatsuda-i18n_generators

設定

$ ./script/generate i18n ja
  debug updating environment.rb …
  debug fetching ja.yml from rails-i18n repository…
  exists config/locales
  update config/environment.rb
  create config/locales/ja.yml
  debug 0 models found.
  debug 0 translation keys found in views.
  info No translation keys found. Skipped generating translation_ja.yml file.

するだけ。
あとは自動で日本語になる。
カラムが日本語になってないとかおかしいときは

config/locals/ja.yml
config/locals/translation_ja.yml

に追加してください。
今回の場合、下記の方法で書いた場合表示が変更されません。(自分だけ?)

<% @member.errors.each do |error, i| %>
<%= error + i %>
<% end %>

なので下記のような方法で書いてください。

<% @member.errors.each do |error, i| %>
<%= I18n.t(error) + i %>
<% end %>

以上、便利なI18nでした〜。

Ruby On Rails 国際標準化機能 I18n その1

0

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

ども、4日目のrickです。

今回は、Rails2.2以降から標準装備されている国際標準化機能(単語を置き換える機能とでもいうのかな?)について説明します。
なんでその1なのかは、最後を読んでみてね。
ちなみにi18nというのはinternationalizationの頭と後ろのiとn、文字数が18文字というところから来てるらしい。

環境

rails2.2以上

設定

config/environment.rb

# 最下行に追加
I18n.default_locale = “ja”

日本語以外もあるかもなので取った値によってみるページを替える

# app/controllers/application.rb

before_filter :set_locale
def set_locale
I18n.locale = params[:locale]
end

日本語用のページ作成

$cp config/locales/en.yml config/locaes/ja.yml

言葉入力

ja:
genre: ジャンル
models:
book_mark: Booker
attributes:
book_mark:
url: URL
link_name: Booker名

※空白や段落に気をつける

View画面

<%= I18n.t :genre %>

これでジャンルが表示される。

Error文

#config/locales/ja.yml

ja:
site_title: サイトタイトル
activerecord:
errors:
template:
header: “{{model}}でエラーが発生しました。”
body: 以下のエラー内容を確認してください。
messages:
blank: が空白です。
models:
entry: エントリー
attributes:
entry:
title: タイトル
body: 本文

こんな感じにするとデフォルトのエラー表示の英語のところも日本語になる。

以上が、I18nの説明です。
さてなぜその1なのか?という答えは、もちろん次回その2があるからです。
その内容は、はっきり言ってそっちを先に教えろよって感じかもしれませんが、
今回のは、勉強がてら見てもらえると嬉しいです。
もちろん次回のも見てほしいですけどね。

んでわぁまた。

Google Analyticsで同じURLのページの遷移のデータを取得する方法

0

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

Google Analtyicsで同じURLの遷移のデータを取得する方法

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

Google Analyticsを使用していてコンバージョン測定をする際に

目標到達プロセスを設定する際にページのステップのURLが同じとなっていて

プロセスを取得することができないなんてことがまれにあります。

今日はそういったURLが同じページ遷移が有った場合に

Google Analyticsでデータを取得する方法です。

ページの遷移が全て同じURLで有る場合

たとえば、CGIページとか、

レンタルカートの買い物かごから購入までのステップに同じURLがあったりして、

Google Analyticsでデータが正しく取得できないなんてことが有ったりします。

同じURLのページ遷移

 このような場合、GoogleAnalyticsのデフォルトのままでは

同じURLでの遷移回数が増える度に、PV数が増加してしまうことになり、

正しい数値が取れなくなってしまうし、

コンバージョンにおける目標到達プロセスを設定する場合に非常に困ります。

このような場合にGoogleAnalyticsでは仮想的にURLをページに持たせて、

データを取得することができます。

Google Analyticsで仮想的にURLを持たせてデータを取得する方法

GoogleAnalyticsで仮想的にURLを持たせる場合には

onload関数を使って仮想的にURLを呼び出しす必要があります。

先ほどの全て同じURLのページの箇所を下記のように仮想的にURLとして持たせてみます。

買い物かご ⇒/kago.html

入力画面  ⇒/edit.html

入力確認  ⇒/confirm.html

違うURLのページステップ

わかりやすく今回は、タグにOnLoadイベントを埋め込んでみます。

買い物かごページの場合

 onLoad=”pageTracker._trackPageview(‘/kago.html’);”>

入力画面ページの場合

 onLoad=”pageTracker._trackPageview(‘/edit.html’);”>

入力確認ページの

 onLoad=”pageTracker._trackPageview(‘/confirm.html’);”>

それぞれページの中に埋めこんであげることで、

仮想的にページのURLを指定することができます。一点注意する点として、

_trackPageviewの関数を使用して仮想URLを持たせる場合は、

GoogleAnalyticsのトラッキングコードは、

ソースコード上_trackPageviewの関数より上に持ってこなければいけないので注意してください。

以上、Google Analtyicsで同じURLの遷移のデータを取得する方法でした。

◇バックナンバー

Google analyticsでPDFファイルをカウントする方法

◇その他アクセス解析関連記事

・Google Analyticsで複数ドメインのサイトを計測する方法

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

・SEOって何ですか

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

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

Ruby On Rails エラーの英文を日本語に変換するプラグイン Ruby-GetText-Package

0

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

ども、3日連続(休日はなしね)投稿中rickです。

今回は、Validateの英文を日本語にするプラグインの解説です。

これは、rails2.1以前まで使用可能です。
gettext2.0.0は、rails2.3.2対応してるらしいですが、バグあるらしいです。

gettext1.9.3はrails1.2.6に対応してないので、gettext1.90.0を入れるのがいいと思います。

今回の環境説明

Ruby 1.8.6
Rails 1.2.6
gettext 1.90.0
MySql 6.0.9-alpha

install

$gem install gettext –version=1.90.0

事前準備

htmlのヘッダーに

<meta http-equiv=”content-type” content=”text/html;charset=UTF-8″ />
database.ymlに

encoding: utf8

config/enviroments.rbに

$KCODE = ‘u’
require ‘jcode’

はやっておきましょう。
日本語表示・入力だよ〜っていう宣言です。

設定

config/enviroments.rbに

require ‘gettext/rails’

を加えます。
app/controllers/application.rbに

class ApplicationController < ActionController::Base
 init_gettext “test”
 省略
end

を加えます。
全ての場所で設定ファイルを読込めるようにしてるだけですね。
“test”の部分は後から出てくるpoファイルの名前なので何でもいいです。
次に、app上のRakefileに、

desc “Update pot/po files.”
task :updatepo do
require ‘gettext_rails/tools’
GetText.update_pofiles(“test”, #テキストドメイン名(init_gettextで使用した名前)
Dir.glob(“{app,config,components,lib}/**/*.{rb,erb,rjs}”), #ターゲットとなるファイル
“test 1.0.0” #アプリケーションのバージョン
)
end

desc “Create mo-files”
task :makemo do
require ‘gettext_rails/tools’
GetText.create_mofiles
end

を加えます。
そして

$rake updatepo
$make po/ja
cp po/test.pot po/ja/test.po

します。
次にtest.poの編集

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR , YEAR.
#
#, fuzzy
msgid “”
msgstr “”
“Project-Id-Version: test 1.0.0\n”
“POT-Creation-Date: 2009-04-17 09:27+0900\n”
“PO-Revision-Date: 2009-04-17 09:27+0900\n”
“Last-Translator: FULL NAME \n”
“Language-Team: LANGUAGE \n”
“MIME-Version: 1.0\n”
“Content-Type: text/plain; charset=UTF-8\n”
“Content-Transfer-Encoding: 8bit\n”
“Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n”

もともとこんなんが入っていますので、一番下に

#: app/models/test.rb
msgit “Test|title”
msgstr “タイトル”

というように入力します。
そして

$rake makemo

を実行すると

local/ja/LC_MESSAGES/test.mo

というファイルが作成されます。

実行

あとは起動してエラーを出すだけです。
私の場合ここで
~/Ruby/Gems/1.8/gems/gettext-1.90.0/lib/gettext/iconv.rb

if __FILE__ == $0
puts Iconv.iconv(“EUC-JP”, “UTF-8”, “ほげ”).join
begin
puts Iconv.iconv(“EUC-JP”, “EUC-JP”, “ほげ”).join
rescue Iconv::Failure
puts $!
puts $!.class
end
end

とかがsyntax errorを起こしていたんですが、特に必要なさそうだったのでコメントアウトしときました。
__FILE__は”~/Ruby/Gems/1.8/gems/gettext-1.90.0/lib/gettext/iconv.rb”で、
$0は、”script/server”なんですがねぇ。。
なんで通るんでしょうかねぇ。

最後は、自分じゃよくわらからないですが、
以上がRuby-GetText-Packageの解説でした〜。

でわまた。

Ruby On Rails ログインのプラグイン restful_authentication

0

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

こんにちわ〜。

2日続けてのプラグイン紹介で、今回はログインのプラグインの紹介です。
前はacts_as_authenticationというプラグインがよく使われてたらいいんですが、
サポートが打ち切られたらしくrails2.0系からは、restful_authenticationを代わりに使ってほしいそうです。

とゆうわけで解説の始まり始まり〜。。。。

restful_authenticationのインストール

$ruby script/plugin http://svn.techno-weenie.net/projects/plugins/restful_authentication –force

acts_as_state_machineのインストール

$./script/plugin install http://elitists.textdriven.com/svn/plugins
このプラグインは、会員の状態管理などを行ってくれる。

コントローラーなど作成

$ ./script/generate authenticated user sessions –include-activation –stateful

設定

config/rootes.rb
# 次の4行を書く。1行目はactivate(本会員)にするために必要、

map.activate ‘/activate/:activation_code’, :controller => ‘users’, :action => ‘activate’, :activation_code => nil
map.signup ‘/signup’, :controller => ‘users’, :action => ‘new’
map.login ‘/login’, :controller => ‘sessions’, :action => ‘new’
map.logout ‘/logout’, :controller => ‘sessions’, :action => ‘destroy’
controllers/sessions_controller.rb

# Be sure to include AuthenticationSystem in Application Controller instead
include AuthenticatedSystem

この2行を削除してcontrollers/application_controller.rbにコピーする。

localhost:3000/signupなどで仮会員を作成その後rootへ戻るのでどこかで本会員へするためuser/activateへ飛ばさなくてはならない、
飛ばすときに仮登録したuserのactivation_codeを持たせてあげないと反応しない、これではじめてloginが可能となる。

acts_as_state_machine

作成されたusers_controllerの中に今の説明中に説明していないsuspend,unsuspend,destroy,purgeメソッドが存在する。
これは、acts_as_state_machineの機能で、model/user.rbの20行以降で定義されている。

acts_as_state_machine :initial => :pending
state :passive
state :pending, :enter => :make_activation_code
state :active, :enter => :do_activate
state :suspended
state :deleted, :enter => :do_delete

これは、初期状態のときstate :pendingへ移行して:enter => :make_activation_codeから

def make_activation_code
self.deleted_at = nil
self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
end

こいつを呼び出している、これは、仮登録状態のためのキーを発行している このキーを受け取ってactivateへ行くと本登録をしてくれる。それと同時に、仮登録のキーを

def do_activate
@activated = true
self.activated_at = Time.now.utc
self.deleted_at = self.activation_code = nil
end

これで削除している。
suspend,unsuspendは、状態変化ぐらいかな?
あ、状態変化は、userテーブルのsateカラムが変化してます。
destroyは、状態変化とdeletd_atカラムに現在時間を入れています。
purgeは、物理削除です。ちなみにpurgeは追放とかいう意味です。

これがrestful_authenticationの一通りの流れです。仮登録のときメール飛ばして返ってきたのを本登録にするとかもいろいろできるらしいです。(今回は、そこまでやってません)

というわけで終しまいです。

Google Analyticsで複数ドメインのサイトを計測する方法

0

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

Google Analyticsで複数ドメインのサイトを計測する方法

こんにちは。アクセス解析チームの大山です。
春を楽しむ間もなく、夏を予感させる暖かい日が続いていますね。

今日は、2つのドメインを持つサイトをGoogle Analyticsに設定する方法についてご説明します

Google Analyticsで2つのドメイン構成のサイトデータを取得しよう

通常、ドメイン数が1つの場合は、Google Analyticsより発行されたトラッキングコードをコピーし、
トラッキングする各ページの タグの直前に貼り付ければ完了します。

2つのドメインを持つサイトをトラッキングするには、
通常のトラッキングコードの貼り付け作業に2つのポイントが加わります。

  1. 全てのトラッキングコードに下記の命令を追加します。
    1. トラッキングcookiesのドメイン特定
    2. 2ドメイン間のリンクを有効化
  2. 2つのドメイン間のリンク全てのリンクに_link関数を加えます。

◎Google Analyticsで複数ドメインのサイトを計測のポイント◎
2の_link関数を有効にするには、2よりも上に1を配置する必要があります。
</head>タグの直前の配置することで有効となります。
※</head>タグ直前の配置は_link関数を持つトラッキングコードのみ有効です。

複数のドメイン構成のサイトを登録する際に注意するポイント

複数のドメイン用のトラッキングコードを埋め込んでいない場合でも
(通常のトラッキングコードを複数のドメインを持つサイトに埋め込んだ場合でも)
そのサイトの数値はGoogle Analyticsに記録されます。
しかし、取得された数値は異常値であり、少なくとも下記の項目に影響があると考えられます。

  1. セッション
  2. 一人当たりのPV数
  3. 直帰率
  4. 参照元

Google Analytics上で数値がトラッキングされているからといって安心はせきません。
上記の項目が異常値である理由と確認方法をご説明しましょう。

  1. セッションが2重に取得される
  2. 一人当たりのPV数が少ない
  3. 直帰率が高い
  4. 参照元に同プロファイルのサイトがトラッキングされる

あなたのサイトには思い当たる部分はありませんでしたか?
上記のような間違ったデータで施策を打たないように、まずは正しい設定を心がけましょう。

以上、Google Analyticsで2つのドメインを正しく取得する方法でした。

■バックナンバー・‥‥━━★

■アクセス解析関連記事・‥‥━━★

vimの配色の設定をしてみる

0

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

最近vimを使っています。
とりあえず見た目を格好良くしたかったので、配色を変えてみることにしました

環境:ubuntu 8.10
vimエディタ GVim 7.1.314

ちなみに現在の配色はこんな感じ。すごくデフォルトです。

今回はすでに用意されているカラースキーマを利用することにします。
カラースキーマの場所
~/vimfiles/colors

ホームディレクトリにvimfilesディレクトリがない場合は作成します。
mkdir vimfiles
mkdir vimfiles/colors

ウェブで配布されているものもしくは、/usr/share/vim/vim71/colorsにあるカラースキーマを
~/vimfiles/colors内にコピーします。

今回は、巷で人気のzenburnを設定します。

cd ~/vimfiles/colors/
wget http://slinky.imukuppi.org/zenburn/zenburn.vim

ファイルを配置したらvimの設定ファイルを開きます。
gvim ~/.vimrc

設定ファイルの一番下に以下を追加します。
colorscheme zenburn
色が変わりました。簡単です。

カラースキーマを変更するといろいろ変わります。

でもこれだけでは味気ないので、
今度ちょっと手を加えてみようと思います。

Ruby On Rails 論理削除のプラグインacts_as_paranoid

0

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

こんにちわ〜。
今回はacts_as_paranoidというRailsのプラグインについてお話します。

以前x5rさんがRuby on Railsでacts_as_paranoidを使い倒すという記事を書いてまして、それをみて今回大体おこなったので基本はこちらを見ていただければ大体わかると思います。
私の記事では、その記事を見てできなかったところや、こんな動作してるなどを少しメモ程度に書いてあります。

まず、今回のrailsのversionは、1.2.6です。

とりあえずinstall前までは、x5rさんの記事と同じです。
installのコマンドをたたいてもinstallされなかったので、

ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_paranoid –force
でinstallする事ができました。
このプラグインを使う事で、find文を行うときに常に

SELECT ・・・ FROM ・・・ WHERE
deleted_at IS NOT NULL OR deleted_at > time.now ・・・
とうように条件がついてくるようになります。
この条件を外すために、:with_deletedオプションが有る訳ですね。

次は、ページネートの拡張です。
これは、自分が間違えただけだったのですが、pagination_extend.rbの内容をx5rさんの記事を参考に書いて作動させたところ
・かえってくる値が配列じゃない
・取得する情報が1つしかない
なんていう状態になりました。
これは、本当に初歩的なミスで、

def paginator_and_collection_for_with_deleted(collection_id, options) #:nodoc:
klass = options[:class_name].constantize
page = params[options[:parameter]]
count = count_collection_for_pagination_with_deleted(klass, options)
paginator = Paginator.new(self, count, options[:per_page], page)
collection = find_collection_for_pagination_with_deleted(klass, options, paginator)
return paginator, collection
end

return paginator, collection
を書き忘れていただけでした。。。値返さないじゃんっていう。。。。

少し思った問題点としては、
・ページ読込み時に関係ない所でもinitファイルが読込まれるので、全体的に動作が遅くなる。
・多対多のMapテーブルでは、動作しないので物理削除のまま。
といったところがあげられる。
他にも結構バグが多いといもいわれているので、大きくなったプロジェクトを後から・・・というならしょうがないかもしれませんが、最初からこのプラグインを使って論理削除を行うということは、あまりしたくはないですね。

・・・installの事しか書いてないじゃん。。。
まぁ、今回は以上でっす。

Google analyticsでPDFファイルをカウントする方法

0

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

Google AnalyticsでPDFファイルのカウントをする方法

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

今日はgoogle analyticsでトラッキングコードが埋め込めない

PDFファイルなどのダウンロード数をカウントする方法についてご説明します。

Google Analyticsでアクセス数をカウントする場合

サイトのページ内にGoogle Analyticsのトラッキングコードを埋め込まなければいけません。

しかし、PDFなどファイルについては、トラッキングコードを埋め込むことが出来ないため

Google Analyticsでダウンロード数を取得するためには、

デフォルトの設定では取得できないため、ひとつ工夫が必要になります。

それではKBMJのサイトを例に説明します。

下記はKBMJのプレスリリースです。

PDFファイルダウンロード

リンクの部分については、Google Analyticsのタグを埋め込めば

もちろんセッション数やPV数を取得することはできるのですが

上記の赤枠箇所のPDFについては通常のままでは

Google Analyticsでデータを取得することはできません。

何回ダウンロードされたかをGoogleAnalytics上で取得するためには、

リンクそのものに修正が必要です。

現状のPDFファイルへのリンクは下記のものです。

 <a href="./../index/community.pdf" target="_blank">PDF 45 KBa>
 カウントを取得するためには、下記のようにリンクに色がついている部分を追加します。
■トラッキングタグにurchin.jsを使用している場合
 <a href="./../index/community.pdf" target="_blank" onclick="javascript:urchinTracker('/download/community');" >PDF 45 KBa> 
■トラッキングタグにga.jsを使用している場合
  <a href="./../index/community.pdf" target="_blank" onclick="javascript:pageTracker._trackPageview('/download/community');">PDF 45 KBa>
※赤字の部分は任意の文字列を記述してください(URLを仮想的に持たせます。) 
 【注意点】
このように_trackPageview関数を使用する場合、
トラッキングコード内に含まれる 下記の関数を_trackPageview関数よりも
ソースコードで上に記述しなければいけません。
var pageTracker = _gat._getTracker("UA-xxxxxx-x");  
pageTracker._initData();  
はやい話が今回の例でいうと、PDFダウンロードのリンクよりも
上にトラッキングコードを貼り付けなければいけないわけです。
データが反映されたあとGoogleAnalytics上で「上位のコンテンツ」から先ほど記述した
PDFダウンロードのリンクの_trackPageviewに設定した任意の文字列を検索すれば
数値が取得されていると思います。
以上GoogleAnalyticsでPDFファイルのダウンロード数をカウントする方法でした。 
 ■バックナンバー
 GoogleAnalyticsの「サイト上のデータを表示する」機能でクリック率をみる

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

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

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

SEOって何ですか?

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

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

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の動作をしています。個体群数や世代数、突然変異の発生率などを色々変えて試してみましたが、いまのところこれが最善の結果でした。

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

最近人気な記事