ホーム ブログ ページ 60

高さの違う2つの要素を縦中央に並べる(垂直方向にセンタリングする)方法

0

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

上の画像のような高さの違う2つの要素を、縦中央に並べる方法をご紹介します。
サンプルでは画像とテキストですが、テキスト同士、画像同士でも 同じことができます。

確認ブラウザ IE6~8、FF2、3

まずはXHTML<div id=”box”>
    <span class=”item_l”><img src=”sample.jpg” width=”171″ height=”173″ alt=”sample” /></span>
    <div class=”item_r”><p>何かに使おうと思って描いたイラストです。<br />ネットワークっぽいイメージ。</p></div>
</div>

次はCSS.item_l {
  display: -moz-inline-box;
  display: inline-block;
  vertical-align: middle;
}

.item_r {
  display: -moz-inline-box;
  display: inline-block;
  vertical-align: middle;
}

/*IE6用ハック*/
* html .item_l,
* html .item_r {
  display: inline;
  zoom: 1;
}

/*IE7用ハック*/
*:first-child+html .item_l,
*:first-child+html .item_r {
  display: inline;
  zoom: 1;
}

p {
  width: 300px;
  line-height: 130%;
  margin-left: 20px;
}

Firefox2対しては「display: -moz-inline-box;」という独自のプロパティで対応。
IE6、7に対しては「display: inline;」に「zoom: 1;」とすることで
inline-block扱いになります。

また、「display:inline-block」内のブロック要素の幅を指定しないと、
その親要素に幅を指定していてもはみ出してしまいます。
サンプルの場合は右側のテキストのP要素に幅を指定しています。

囲う要素が多くて少々見辛いですが、結構使うシーンがあると思いますので
参考にしてみてください。

railsでの環境使い分け production.rb development.rb

0

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

こんにちはtacchiです。

今回はrails開発でよくやる環境の使い分けを書きます。

短い記事ですが、お付き合い下さい。

KBMJで開発を行う場合、production、developmentは次のようなシーンで 利用されます。

本番環境:production

個人の開発環境:development

では、テストサーバとかどうすんの?

とかの疑問が浮かぶと思うんですが、このようにしてます。

本番環境:production

個人の開発環境:development

テストサーバ:stagingでは、staging環境の構築手順を記載します。

まずはプロジェクト生成

rails hogehoge

create

create app/controllers

create app/helpers

create app/models

create app/views/layouts

create config/environments

create config/initializers

create config/locales …

staging作成

以下のようなhogehogeプロジェクトが作成されます

-rw-r–r– 1 tacchi staff 10011 8 4 11:10 README

-rw-r–r– 1 tacchi staff 307 8 4 11:10 Rakefile

drwxr-xr-x 6 tacchi staff 204 8 4 11:10 app

drwxr-xr-x 9 tacchi staff 306 8 4 11:10 config

drwxr-xr-x 2 tacchi staff 68 8 4 11:10 db

drwxr-xr-x 3 tacchi staff 102 8 4 11:10 doc

drwxr-xr-x 3 tacchi staff 102 8 4 11:10 lib

drwxr-xr-x 6 tacchi staff 204 8 4 11:10 log

drwxr-xr-x 11 tacchi staff 374 8 4 11:10 public

drwxr-xr-x 11 tacchi staff 374 8 4 11:10 script

drwxr-xr-x 8 tacchi staff 272 8 4 11:10 test

drwxr-xr-x 6 tacchi staff 204 8 4 11:10 tmp

drwxr-xr-x 3 tacchi staff 102 8 4 11:10 vendor

staging.rbの作成

cp config/environments/production.rb config/environments/staging.rbdatabase.ymlの編集 デフォルトで以下のようなconfig/database.ymlが作成されますので編集します。

# SQLite version 3.x

# gem install sqlite3-ruby (not necessary on OS X Leopard)

development:

  adapter: sqlite3

  database: db/development.sqlite3

  pool: 5

  timeout: 5000

# Warning: The database defined as “test” will be erased and

# re-generated from your development database when you run “rake”.

# Do not set this db to the same as development or production.

test:

  adapter: sqlite3

  database: db/test.sqlite3

  pool: 5

  timeout: 5000

production:

  adapter: sqlite3

  database:

  db/production.sqlite3

  pool: 5

  timeout: 5000

staging追加

staging:

adapter: sqlite3 #この辺りは、postgresql、mysqlなどお好きなように

database: db/production.sqlite3 #ここも同上

pool: 5

timeout: 5000

最後の仕上げ

これで、migrate流せばよいだけですねrake db:migrate RAILS_ENV=staging

補足(script/consoleを実行する場合)

ruby script/console -e staging

補足(passengerを使う場合)

apacheのconfの以下を変更(すでにpassengerの記述がある前提)RailsEnv production   ⇒ RailsEnv staging

findコマンドのmtimeオプションについて

0

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

find コマンドの -mtime オプションを指定することで最後にデータが修正された日時で検索することができます。
日時の指定方法も色々あるのですが、個人的にわかりづらかったので以下のパターンだとどのような結果になるのか、実際に動かしてみることにしました。


試すパターン
find -mtime 日数
find -mtime +日数
find -mtime -日数

結果からいうと、
find -mtime -3 3日(72時間)前〜現在
find -mtime 3  3日(72時間)前〜4日(96時間)前
find -mtime +3 4日(96時間)前〜過去
こうなります。


とりあえず、確認用のファイルを適当に作って試してみます。
touch -t 07140000 0714.txt
touch -t 07130000 0713.txt
touch -t 07120000 0712.txt
touch -t 07110000 0711.txt
touch -t 07100000 0710.txt
こんな感じで空のファイルを5つ作成しました。
ls
0710.txt  0711.txt  0712.txt  0713.txt  0714.txt

touch の -t オプションでタイムスタンプを設定しています。
設定できているか確認してみます。

atime(最後にファイルにアクセスした時刻)
% ls -alu
total 8
drwxr-xr-x  2 sk sk 4096 2009-07-14 11:34 ./
drwxr-xr-x  7 sk sk 4096 2009-07-14 11:29 ../
-rw-r–r–  1 sk sk    0 2009-07-10 00:00 0710.txt
-rw-r–r–  1 sk sk    0 2009-07-11 00:00 0711.txt
-rw-r–r–  1 sk sk    0 2009-07-12 00:00 0712.txt
-rw-r–r–  1 sk sk    0 2009-07-13 00:00 0713.txt
-rw-r–r–  1 sk sk    0 2009-07-14 00:00 0714.txt

mtime(最後にファイルを変更した時刻)
% ls -al
total 8
drwxr-xr-x  2 sk sk 4096 2009-07-14 11:32 ./
drwxr-xr-x  7 sk sk 4096 2009-07-14 11:29 ../
-rw-r–r–  1 sk sk    0 2009-07-10 00:00 0710.txt
-rw-r–r–  1 sk sk    0 2009-07-11 00:00 0711.txt
-rw-r–r–  1 sk sk    0 2009-07-12 00:00 0712.txt
-rw-r–r–  1 sk sk    0 2009-07-13 00:00 0713.txt
-rw-r–r–  1 sk sk    0 2009-07-14 00:00 0714.txt

ctime(最後にファイルを変更した時刻)
% ls -alc
total 8
drwxr-xr-x  2 sk sk 4096 2009-07-14 11:32 ./
drwxr-xr-x  7 sk sk 4096 2009-07-14 11:29 ../
-rw-r–r–  1 sk sk    0 2009-07-14 11:32 0710.txt
-rw-r–r–  1 sk sk    0 2009-07-14 11:32 0711.txt
-rw-r–r–  1 sk sk    0 2009-07-14 11:32 0712.txt
-rw-r–r–  1 sk sk    0 2009-07-14 11:32 0713.txt
-rw-r–r–  1 sk sk    0 2009-07-14 11:32 0714.txt

大丈夫そうですね。

ではさっそく以下を試してみます。
ちなみに実行したの7月14日のお昼頃です。
find ./ -mtime -3
find ./ -mtime 3
find ./ -mtime +3

結果。
find ./ -mtime -3
./
./0714.txt
./0713.txt
./0712.txt

find ./ -mtime 3
./0711.txt

find ./ -mtime +3
./0710.txt

図にまとめるとこんな感じでしょうか。

ではもうひとつ。
同様の操作をdaystartオプションを付与して試してみます。
find ./ -daystart  -mtime -3
find ./ -daystart  -mtime 3
find ./ -daystart  -mtime +3


結果。

find ./ -daystart  -mtime -3
./
./0714.txt
./0713.txt
./0712.txt

find ./ -daystart  -mtime 3
./0711.txt

find ./ -daystart  -mtime +3
./0710.txt

結果は同じですが、0時を基準にするので、図にするとこのようになります。

 図にするとよりわかりやすいですね。以上になります。

gemをユーザディレクトリにインストール

0

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

新しく書き込みを行います。
今後、記事を書きますので、宜しくお願い致します。
今回は、gemをユーザディレクトリ以下に設置する方法をメモします
rubygemsをダウンロードし、同封されているsetup.rbを

ruby setup.rb --prefix=~/gems

のように、インストールディレクトリを指定しセットアップを開始します。 次に、.bashrcなどにGEM_HOMEとRUBYLIBのPATHを指定すれば準備が整いました。

export GEM_HOME=~/gems
export RUBYLIB=~/gems/lib

これでユーザごとに異なるgemや複数のバージョンを扱えるようになります。

ブラウザのデフォルトスタイルをリセットする

0

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

こんにちは、maiです。今回はコーディングでデザイン用にcssを書き出す前の下準備のお話。

ただhtmlを書いただけでも、見出しは大きかったり、
リストには黒い丸が表示されたり、strongは太字になったりemは斜体になったり、
そのすべてはブラウザがもともと持っているstyleです。

まあ…正直邪魔ですよね。
リストのマークは黒丸じゃなくて画像で作った矢印にしたいし…とか。

そんなとき、いちいち
list-style: none;
なんて書くのはめんどくさいことこの上ない。
1カ所だけならいいんですけどね。

 なので、もう最初からなかったことにしたいstyleはリセットしてしまいましょう。
↓に実際に使ってるリセット用cssを一気に公開です。

/* Universal selector */
* {
margin:0;
padding:0;
position:static;
}

/* Text(Heading) */
h1, h2, h3, h4, h5, h6 {position:static;}

/* Text(Block) */
address, blockquote, div, p, pre {
font-style:normal;
font-weight:normal;
position:static;
}

/* Text(Inline) */
abbr, acronym, br, cite, code, dfn, em, kbd, q, samp, span, var {
position:static;
border:none;
font-style:normal;
font-weight:normal;
}
strong {
position:static;
border:none;
font-style:normal;
font-weight:bold;
}

/* Hypertext */
a {text-decoration: none;}

/* List */
ul, dl, dt, dd {
list-style-type:none;
font-style:normal;
font-weight:normal;
position:static;
}
ol {list-style-type:none;}

/* Image */
img {
border:0;
vertical-align:top;
}

/* Scripting */
noscript, script {
font-style:normal;
font-weight:normal;
position:static;
}

/* Etc. */
hr, table, form, fieldset, del {
font-style:normal;
font-weight:normal;
position:static;
}

ーーーーーーーーーーーーーーーーーーーーーーーーーここまで

これを使うと、見出しも段落もリストもなにもかも、
何一つ変化のないテキストとして表示されるので、
ここに適宜必要なstyleを追加していきます。

リセット用のcssは1つのファイルにまとめておくと、
使い回しがきいて非常に便利になります。

swfmillのインストール(makeのところ)でエラーがでた

0

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

最近Flash Liteを使うことになり、動的なFlash Lite作成のために、swfmillを入れることになりました。

インストールして、いざmake!というところで、エラーがでましたので、
その解決方法をご紹介します。

==============================
インストール環境:Ubuntu 9.04
swfmill:0.2.12
gcc:4.3.3
==============================

  1. swfmillをダウンロードします。
    # wget http://swfmill.org/releases/swfmill-0.2.12.tar.gz
    # tar xzf swfmill-0.2.12.tar.gz
    # cd swfmill-0.2.12
  2. ビルドします。
    # ./configure
  3. makeします。# make
    Making all in src
    make[1]: ディレクトリ `/usr/local/src/swfmill-0.2.12.2/src’ に入ります
    make  all-recursive
    (省略)
    swft_css.cpp: In function ‘void parse_color(std::string, CSSColor*)’:
    swft_css.cpp:25: warning: format ‘%x’ expects type ‘unsigned int*’, but argument 3 has type ‘unsigned char*’
    swft_css.cpp: In function ‘void swft_unit(xmlXPathParserContext*, int)’:
    swft_css.cpp:197: error: ‘strcmp’ was not declared in this scope
    make[3]: *** [libswft_la-swft_css.lo] エラー 1
    make[3]: ディレクトリ `/usr/local/src/swfmill-0.2.12.2/src/swft’ から出ます
    make[2]: *** [all-recursive] エラー 1
    make[2]: ディレクトリ `/usr/local/src/swfmill-0.2.12.2/src’ から出ます
    make[1]: *** [all] エラー 2
    make[1]: ディレクトリ `/usr/local/src/swfmill-0.2.12.2/src’ から出ます
    make: *** [all-recursive] エラー 1

    エラーになってしまいました。残念です。

    調べてみましたところ、gcc 4.2以前とgcc 4.3のバージョンの違いに問題があるようでした。
    yamcha 0.33 が fedora 9 (gcc 4.3) で make できない、そんなとき エラーを出しているファイルに #include <string.h>を追加しないとだめなようです。
    (gccをバージョンダウンさせてもよさそうです。)
    というわけで、swft_css.cppに書き込みます。
     何回か同じエラー(でもエラーを出しているファイルは変わっている)が出ますので、
    エラーを出しているファイルに次々と#include <string.h>を加えてmakeしていきます。
    最終的には通ります。
    これで入りました。
  4. make installします。
    # make install

確認してみます。$ swfmill

swfmill 0.2.12.2
     XML-based SWF (Shockwave Flash) processing tool

入りました。

keepalivedの設定

0

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

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

「keepalived」とはIPVS※を冗長化してるものです。
※IPVSとはロードバランサを中心に、リアルサーバーのクラスタとして
  バーチャルサーバーを構築することで、エンドユーザーからは1つのサーバー
  として見えるようにすることです。1~4はLBサーバで行います。
5~は実サーバで行います。

1 ipvsadmのインストール
実際の操作はこのipvsadmを利用することになります。
#yum install ipvsadm

2 keepalivedのインストール
RPMを使用するので適当に用意してください。
#rpm -ivh keepalived-1.1.13-6.i386.rpm

3 設定ファイルの変更
#vi /etc/keepalived/keepalived.conf

以下の場合

VIP 10.0.0.100
ソースIP 10.0.0.101
ソースIP 10.0.0.102

############################################################
virtual_server 10.0.0.100 80 {
  delay_loop  3
  lvs_sched   rr
  lvs_method  DR
  protocol    TCP
  real_server  10.0.0.101 80 {
    TCP_CHECK {
      connect_timeout 30
    }
  }
  real_server  10.0.0.102 80 {
    TCP_CHECK {
      connect_timeout 30
    }
  }
}
vrrp_instance vip_test {
  state BACKUP
  interface eth0
  virtual_router_id 1
  priority 100
  virtual_ipaddress {
    10.0.0.100 dev eth0
  }
}
############################################################

4 keepalivedの起動
#/etc/init.d/keepalived start
 VIPが応答することを確認します。
#ping 10.0.0.100

実IPが10.0.0.101と10.0.0.102サーバで以下のループバックの設定を行います。

5 ループバックの設定

############################################################
DEVICE=lo:0
IPADDR=10.0.0.100
NETMASK=255.255.255.255
NETWORK=10.0.0.0
BROADCAST=10.0.0.255
ONBOOT=yes
############################################################

#ifup lo:0

6 ARPへの対応
#vi /etc/sysctl.conf

############################################################
##最終行に以下を追加
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
############################################################

#sysctl -p

以上で終了です。

Apacheの負荷状況をモニタリングするツール「apachetop」

0

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

TOPコマンドのようにapacheログからモニタリングできる「apachetop」
このツールのCentOS5.3へのインストールを実施してみます。

インストール方法はいくつかありますが、rpmでインストールしてみました。
(「yum install apachetop」もあります)

# wget http://centos.karan.org/el4/extras/stable/i386/RPMS/apachetop-0.12.5-2.el4.kb.i386.rpm
# rpm -ivh –nodeps apachetop-0.12.5-2.el4.kb.i386.rpm

これでインストールは終わりです。
利用方法は下記のようなので、実行してみます。

書式:apachetop -f アクセスログのファイル名

# apachetop -f /usr/local/apache2/logs/access_log
apachetop: error while loading shared libraries: libreadline.so.4: cannot open s
hared object file: No such file or directory

エラーになりました。
エラー解消のため、シンボリックリンクを張ります。
(エラーにならなければこの設定は飛ばしてください)

# cd /usr/lib
# ln -s libreadline.so.5.1 libreadline.so.4

再び実行
すると、下記が立ち上がりました。

last hit: 05:33:53         atop runtime:  0 days, 00:01:00             05:33:54
All:          346 reqs (   6.1/sec)        152.7K ( 2742.5B/sec)     451.8B/req
2xx:       9 ( 2.6%) 3xx:     337 (97.4%) 4xx:     0 ( 0.0%) 5xx:     0 ( 0.0%)
R ( 30s):     105 reqs (   3.5/sec)         35.1K ( 1197.9B/sec)     342.2B/req
2xx:       6 ( 5.7%) 3xx:      99 (94.3%) 4xx:     0 ( 0.0%) 5xx:     0 ( 0.0%)

 REQS REQ/S    KB KB/S URL
   11  0.61   7.2  0.4*/projects/activity/test
   10  0.33   0.0  0.0 /stylesheets/application.css
   10  0.33   0.0  0.0 /javascripts/dragdrop.js
   10  0.33   0.0  0.0 /javascripts/effects.js
   10  0.33   0.0  0.0 /javascripts/prototype.js
   10  0.33   0.0  0.0 /stylesheets/jstoolbar.css
   10  0.33   0.0  0.0 /javascripts/application.js
   10  0.33   0.0  0.0 /javascripts/controls.js
    6  0.33   0.0  0.0 /images/feed.png
    5  0.28   0.0  0.0 /images/attachment.png
    3  0.14   0.0  0.0 *
    2  0.10   5.7  0.3 /projects/show/test
    2  0.10   0.0  0.0 /images/time.png
    2  0.07   0.0  0.0 /images/22×22/projects.png
    2  0.07   0.0  0.0 /
    1  1.00  22.2 22.2 /projects/test/issues
    1  1.00   0.0  0.0 /images/true.png

リクエストされたURL等が参照できます。
デフォルトの設定ですと、直近の30秒のものがモニタリングされ、5秒置きに再描画します。
実行時のオプション指定で、モニタリング時間、描画時間等の調整が可能です。
例.直近60秒のログをモニタリングし、10秒置きに再描画

apachetop -f /usr/local/apache2/logs/access_log -T 60 -d 10

apachetop実行時に指定できるコマンドは下記の通りです。
※ターミナル上で”apachetop -h”を入力すれば参照できます。

# apachetop -h
ApacheTop v0.12.5 – Usage:
File options:
  -f logfile  open logfile (assumed common/combined) [/var/log/httpd/access_log]
              (repeat option for more than one source)

URL/host/referrer munging options:
  -q          keep query strings [no]
  -l          lowercase all URLs [no]
  -s num      keep num path segments of URL [all]
  -p          preserve protocol at front of referrers [no]
  -r          resolve hostnames/IPs into each other [no]

Stats options:
  Supply up to one of the following two. default: [-T 30]
  -H hits     remember stats for this many hits
  -T secs     remember stats for this many seconds

  -d secs     refresh delay in seconds [5]

  -h          this help

Compile Options: -HAVE_KQUEUE -HAVE_FAM -ENABLE_PCRE
Polling Method: stat

また、apachetop実行中に使用できるコマンドは下記の通りです。
※apachetop実行中に”h”を入力すれば、参照できます。

ApacheTop version 0.12.5, Copyright (c) 2003-2004, Chris Elsworth

ONE-TOUCH COMMANDS
d          : switch item display between urls/referrers/hosts
n          : switch numbers display between hits & bytes or return codes
h or ?     : this help window
p          : (un)pause display (freeze updates)
q          : quit ApacheTop
up/down    : move marker asterisk up/down
right/left : enter/exit detailed subdisplay mode

SUBMENUS:
s:  SORT BY: [the appropriate menu will appear for your display]
        r) requests  R) reqs/sec  b) bytes  B) bytes/sec
        2) 2xx   3) 3xx   4) 4xx   5) 5xx

t:  TOGGLE SUBDISPLAYS ON/OFF:
        u) urls  r) referrers  h) hosts

f:  MANIPULATE FILTERS:
        a) add/edit menu c) clear all  s) show active (not done yet)
        a:  ADD FILTER SUBMENU
                u) to urls  r) to referrers  h) to hosts

モニタリングを終了したい場合は”Ctrl + c”で抜けてください。


どのURLに対してアクセスが多い等、リアルタイムに確認したい場合に使えそうですね。

apacheでアクセス制限をしてみよう その2

0

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

こんにちは。タジです。

今回は前回の続きで、apacheのもう一つのアクセス制限である、IP制限について解説したいと思います。
IP制限とはその名の通り、アクセス元のIPを指定し、該当するIP以外からの接続は403エラー(権限がありませんというエラー)を返すようにする設定です。

では実際に設定してみましょう。

やり方は、apacheの設定ファイル内の、ディレクトリやロケーションのディレクティブ内に、以下のように記述します。

Order deny,allow

Deny from all

#localhost

Allow from 127.0.0.1

#gateway

Allow from 192.168.1.1

上記はアクセスがあった際、サーバ内で自身を参照した時と特定のゲートからのみ接続を許可するという設定です。

Allowを追加することで、客先や監視会社など、IPを追加することが可能です。 この書き方は、.htaccessに書いた場合でも同じになります。

今回はここまでです。

それではまた次回。

不要なCSSを洗い出せるRuby製のツール

0

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

 こんにちは。

 KBMJでRuby on Rails を使ったweb開発に携わっているyoppiといいます。

 今回はRuby製の不要なCSSを洗い出せるツールをRailsのプロジェクトで使う場合の説明をさせていただこうと思います。

 Ruby製の不要なCSSを洗い出せるツールは、css-redundancy-checkerというものです。

 ツールといっても1つのrubyファイルなだけで、セットアップといってもSubversionのリポジトリからチェックアウトするだけです。サイトにも書いてありますが、hpricotが必要なので入っていなければ、インストール(gemで入れるのが簡単です)する必要があります。

 Railsプロジェクトのscripts/css-redundancy-checkerというところにチェックアウトしたとすると、Railsプロジェクトのルートディレクトに移動して、以下のような感じで実行できます。(下記の例は、public/stylesheets/common.cssで不要な項目をチェックしたい場合です)。ちなみに、ローカル環境の場合は、script/server等でサーバーを起動しておく必要があります。

 ruby script/css-redundancy-checker/css-redundancy-checker.rb public/stylesheets/common.css check_urls.txt

【実行結果例】

Parsing all html files within check_urls.txt for selectors in public/stylesheets/common.css...
-------------
Parsing http://localhost:3000/
Parsing http://localhost:3000/users
Parsing http://localhost:3000/users/show/1
・・・-------------
The following selectors are NOT used in of the html files in check_urls.txt
-------------
#main.sub・・・

 check_urls.txtには、チェックしたいページのURLを1行ごとに書いてあります。(ちなみにファイル名は、.txtで終わっていれば何でも大丈夫です)

【記述例】

http://localhost:3000/ http://localhost:3000/usershttp://localhost:3000/users/show/1・・・

 チェックしたいCSSが複数ある場合は、そのファイル分だけ、実行していくことになります。

 このツールだとローカル環境でもチェックできるがいいですね。Rails開発ならRubyも入っているので便利です。

 CSSファイルにに不要な項目が増えてきていると感じ始めたら、是非使ってみて下さい!

監視ツール Nagios

0

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

他のメンバーがすでに「munin」や「cacti」について
記事を投稿していますので、私は「nagios」について書いてみたいと思います。

■nagiosとは?
ネットワーク・サーバ監視のためのアプリケーションソフト。
オープンソースで開発をされ、自由に使用できる。

また各種プラグインも豊富であり
機器の生死確認以外にも、機器のリソース(memory使用量やHDD使用量など)についても
監視ができるなかなかの優れものです。

□入手先
Nagiosの公式HP
http://www.nagios.org/

他にも「yum」や「apt」でインストールが出来るようです。
今まで、centOSやdebianの環境で動くnagiosサーバを見たことありますが
ソースからコンパイルした場合とパッケージ管理からインストールした時の違いや
バージョンによるデフォルトに用意されているコンフィグファイルの違いなど
それぞれ違いがありますので、複数台用意する際は注意が必要です。



■インストールについて
 OS        =    CentOS 5.3 (selinuxは今回停止をしています)

 nagiosの種類    =    nagios-3.0.6 (執筆時の最新安定版)
 

□必要なモジュールやソフトを確認

<参照>
http://nagios.sourceforge.net/docs/3_0/about.html#requirements
1. A web server (preferrably Apache)
2. Thomas Boutell’s gd library version 1.6.3 or higher (required by the statusmap and trends CGIs)


「1」のwebサーバについては当たり前というところでしょう。
その他に「gd」を必要とするようですのでインストールされいなければ
インストールをしておきます。

例)
# yum -y install httpd gd gd-devel

また、この他にもソースをコンパイルする際にCのコンパイラが必要となりますので
「gcc」あたりもインストールされていなければ、インストールをしておきます。

例)
# yum -y install gcc glibc glibc-common


□インストールを開始
・nagiosユーザの追加、パスワードの設定

useradd -m nagios
passwd nagios


・nagiosの制御に関係するグループを追加、ユーザーの追加を行う

groupadd nagcmd
usermod -a -G nagcmd nagios
usermod -a -G nagcmd apache(webサーバの実行ユーザ!)


・ソフトとプラグインをダウンロードしてくる
cd /usr/local/src/
wget  http://osdn.dl.sourceforge.net/sourceforge/nagios/nagios-3.0.6.tar.gz
wget http://osdn.dl.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.11.tar.gz


・nagiosのコンパイル・インストール
tar zxvf nagios-3.0.6.tar.gz
cd nagios-3.9.6
./configure –with-command-group=nagcmd
make all
make install
make install-init        (起動スクリプトのインストール)
make install-config        (コンフィグファイルのインストール)
make install-commandmode    (各種コマンドのインストール)
make install-webconf        (webサーバ向けのコンフィグをインストール)


・ベーシック認証用のパスワードファイルを作成
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
(パスワードを聞かれるので入力をする。)


■プラグインのインストール
監視の際に使うコマンドが定義されたプログラムファイルをインストールします。

・ソフトとプラグインをダウンロードしてくる
cd /usr/local/src/
wget http://osdn.dl.sourceforge.net/sourceforge/nagiosplug/nagios-plugins-1.4.11.tar.gz


・プラグインのコンパイル・インストール
tar zxvf nagios-plugins-1.4.11.tar.gz
cd nagios-plugins-1.4.11
./configure –with-nagios-user=nagios –with-nagios-group=nagios
make
make install


これだけ。
あとは「/usr/local/nagios/libexec/」に「check-***」がという実行ファイルが大量にあれば成功。


■nagiosの起動
・ウェブサーバを再起動をする(省略)

・コンフィグファイルの構文にミスがないか、確認を行う
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

errorやwarningが「0」であればOK。
もしもおかしい場所があれば教えてくれるので、大変便利なコマンドです!

・nagiosの起動
/etc/init.d/nagios start


http://??.????.??/nagios/
アクセスして確認してみましょう!


———————–

基本的なnagiosのインストールは以上です。
このほか、nagiosのコマンドにPATHを通したり
「chkconfig」コマンドを使用、naigosの自動起動の設定など
行った方が良いでしょう。

また、今回はselinuxは停止した環境で構築を行いましたが
selinuxを使用されている場合

chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin/
chcon -R -t httpd_sys_content_t /usr/local/nagios/share/

このような感じで、設定をしておく必要があるかと思われます。

QRコード【大きさを決める】

0

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

みわです。
本日もQRコードについて書こうと思います。
「QRコードの大きさについて!」QRコードは、白と黒のポチポチでできています(笑
このぽちぽちの数と大きさが、QRコード全体のサイズを決めます。
ポチポチは、「セル」っていいます。

1)数で大きくする
単純ですが、縦横に使うセルの数を増やせば、QRコードそのもののサイズは大きくなります。
→「バージョンを大きくする」といいます。

2)ポチポチの大きさを変える
1辺あたり10個のセルであっても、セルそのもののサイズが大きくなれば、QRコードの大きさも大きくなります。
「拡大コピー」をイメージしていただけるとわかりやすいかと思います。
→「エレメントサイズを大きくする」といいます。

「QRコードが読み取れない(><」とき、基本的には2)の方法で拡大します。
理屈は単純です。
「新聞の字が細かくて読みにくいんだけど、拡大コピーを取ったら読みやすくなった!」ってことです。

そうはいっても、サイトのデザイン上「ここまでが限界」ってラインもあるでしょう。
その時は、1)の方法と併用して拡大します。

QRのサイズは、以下の方法で求めることが可能です。
セルのサイズ(エレメントサイズとも)×1辺あたりのセルの数
ただし、セルサイズはmmのため、出てくる値もmmになります。
htmlやcssではピクセルという単位を使ってますから、mm⇔ピクセルの単位変換が必要になります。
でもまぁ、目安という意味ではmmでも十分かと・・・。

前回の「余白を取る」ことと併せて、お使いください。
これでQRコードはばっちり読み取れるようになるはず!
ケータイサイトへの誘導などで、QRコードは便利に利用されることが増えてきました。
せっかく作ったなら、しっかり読みとってもらわないと誘導もできませんから、読み取ってもらえるようにしたいですね!

次回は、「QRコードが持てる情報と大きさについて」を説明しようと思います(たぶん)。

簡単、携帯flash待受時計をつくる

0

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

【テーマ: 簡単、携帯flash待ち受け時計をつくる】

【使用するモノ: flashLite1.1 photoshop】

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

(1)サイズ240px×400pxの新規flashファイルを作成します。

(2)適当に用意した背景を、ステージに読み込みます。

(3)ダイナミックテキストで、テキスト領域を3つ用意します。

   それぞれに以下の3つの変数名をあてます。

flash待ち受け時計制作

(4)Actionscript用のレイヤーを追加し、フレームを2つ用意します。

携帯待ち受けflashのActionscriptレイヤー

(5)フレーム1に下記のスクリプトを記入して時間を読みとってもらいます。

hour=fscommand2 (“GetTimeHours”) ;
minute=fscommand2 (“GetTimeMinutes”) ;
second = fscommand2(“GetTimeSeconds”);
if (minute<10) {
            minute=”0″ add minute
 }
if (second<10) {
            second=”0″ add second
 }

(6)フレーム2に、フレーム1を繰り返すように書きます。

gotoAndPlay (1);

(7)flashlite1.1で書き出して、完成です。

以上、「簡単、携帯flash待ち受け時計をつくる」でした。

とっても簡単なので、flashliteの初歩の初歩を学ぶのに良いのではと思われます。

ruby on railsでCAPTCHA(画像認証)を実装する。 simple_captcha編

0

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

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

今回はruby on railsでCAPTCHA(画像認証)を利用する方法です。
 * CAPTCHA(画像認証)とはgoogleやyahooなど会員登録をするときに表示される、ぐにゃぐにゃした文字の画像です。

CAPTCHAを実装するのはjavascriptとかrubyのプラグインも色々ありますが、

今回は ruby on railsプラグインのsimple_captchaを使用してみます。

 simple_captchaの特徴

  •    画像スタイルを選べる(ランダムも可能)
  •     認証する文字はアルファベットか数字かを選べる
  •   3レベルの画像の複雑さ(文字のぐにゃぐにゃ度合い)
  •     画像と文字はDB管理
  •     古い画像(一定時間認証されなかった画像)は自動的に削除

simple_captchaは、こちらのサイトで公開されています。
http://expressica.com/simple_captcha/

今回はsimple_captchaの使い方と、画像認証を行う時に物足りない部分をカスタマイズした方法も書こうと思います。

ます、インストールから
サイトを見ると使い方の手順が書いてあるのでその通りに実行します。
 

1.simple_captchaプラグインのインストール

ruby script/plugin install svn://rubyforge.org/var/svn/expressica/plugins/simple_captcha    
 もしくは直接ダウンロード
http://expressica.com/wp-content/plugins/wp-downloadMonitor/download.php?id=1

2.simple_captchaのセットアップ
 rails2系以上     
   rake simple_captcha:setup     
 

 rails1系
  rake simple_captcha:setup_old  
 
 続けて1系2系ともに
  rake db:migrate  

3.config/routes.rbの編集
    ActionController::Routing::Routes.draw do |map|  
     map.simple_captcha ‘/simple_captcha/:action’, :controller => ‘simple_captcha’  
    end    

4.app/controllers/application.rbの編集
   ApplicationController < ActionController::Base
    include SimpleCaptcha::ControllerHelpers
   end

つづいて、CAPTCHAを表示させたいアプリケーション側の編集です。
simple_captchaは、画像認証のチェックをcontrollerで行う方法とmodelで行う方法がございます。

まずcontroller側で認証させる場合

1. viewの編集
 画像認証をさせたいページに
   <%= show_simple_captcha %>  
 を追加
2. controllerの編集
 validateする個所に
if simple_captcha_valid?
 画像認証OKの処理を書く
else
 画像認証NGの処理を書く
end 
と書きます。



つぎにmodel側で認証する方法です。
  決まったテーブルを登録または更新する時に画像認証を行う事がほとんどですのでmodelに認証を持たせたほうが私は実装が楽だと思います。

たとえばuserモデル(会員登録など)で画像認証させる場合

1.viewの編集
<%= show_simple_captcha(:object=>”user”) %>
オプションの一例
:label => “画像の中の文字を入力してください”
captchaの説明文の変更
:image_style=>’simply_red’
画像の種類を決められます。
オプションを付けた例 
 <%= show_simple_captcha( :label => “画像の中の文字を入力してください。”,:image_style=>’simply_red’,:object=>”user”) %>

2. modelの編集
  class User < ActiveRecord::Basse  
    apply_simple_captcha :message => ” 画像に表示された文字を再入力してください。”, :add_to_base => true
  end  

オプションの
 messageとadd_to_baseはなくても使えます。
 これを付けると、デフォルトのエラーメッセージではなくmessageで指定した文字がエラーメッセージとして表示できます。

3. controllerの編集
 @user.valid? と書く部分を
 @user.valid_with_captcha?
 に
@user.save と書く部分を
@user.save_with_captcha
にします。

with_captcha?を付けることで画像認証が行われます。

これの便利な部分は他のところで
@user.saveとしたら、画像認証を行わないので
画像認証をするところと、しないところの切り分けが楽です。



これでrailsを起動しページ表示すると画像認証(CAPTCHA)が表示されます。


simple_captchのデフォルトじゃ物足りないのでカスタマイズしたこと

基本の使えるオプションなどは
vendor/plugins/simple_captcha/README
を見てください。
ベースの画像や画像の複雑さの設定方法が書かれています。

以下は自分がカスタマイズさせた方法を書きます。

問題1
simple_captchaのデフォルトだと入力したアルファベットの大文字小文字を区別しない

対応 vendor/plugins/simple_captcha/lib/simple_captcha_active_record.rb
の49行目あたりの
–          if captcha && captcha.upcase.delete(” “) == simple_captcha_value(captcha_key)

+          if captcha && captcha.delete(” “) == simple_captcha_value(captcha_key)
とし upcaseをとってしまう。

問題2
ランダムの文字数や英数字を混ぜたものを使いたい
vendor/plugins/simple_captcha/lib/simple_captcha_action_view.rb

def generate_simple_captcha_data(code)
で文字を生成しているので好きに書き換えてしまう

たとえばこうすると大文字小文字アルファベット+数字 のランダム6文字
 a = (‘a’..’z’).to_a + (‘A’..’Z’).to_a + (‘0’..’9′).to_a
 value= Array.new(6){a[rand(a.size)]}.join

*日本語はさすがに文字化けでした・・・

問題3
6文字以上の文字が使いたい
vendor/plugins/simple_captcha/assets/migrate/create_simple_captcha_data.rb
のマイグレートファイルでlimit=>6に指定されているので
無理に6文字以上にするとDB側ではじかれますので、
ここの数字を変えるか、マイグレーションファイルを追加して好きな文字数にするとよいです。

6文字以下はsimple_captcha_dataテーブルの変更はいりません。

以上です。

まとめ

simple_captchaを使えば 画像認証(CAPTCHA)が簡単に素早く実装ができます。
 10分もあれば導入が可能ですのでお試しください。
それと、プラグインのソースがきれいに書かれていますのでカスタマイズがしやすいと思います。

注意
*画像認証(CAPTCHA)は最近は破られる可能性があるという事ですので、スパムの対策に過信はしないほうがよいと思います
 次回は、画像認証以外の方法でスパムロボット対策方法を書けたらいいかなと思います。

apacheでアクセス制限をしてみよう その1

0

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

こんにちは。タジです。

今回は、apacheでのアクセス制限についてです。

ページにアクセスした際、IDとPassを聞かれることがあると思います。

いわゆるBasic認証というものです。


Basic認証は、ディレクトリ(<Directory /usr/local/apache/htdocs>)や、ロケーション(< Location /admin>)などのディレクティブで使います。

この設定は.htaccessというファイルに記述することもありますが、apacheの設定ファイル(httpd.conf)に書くこともできます。

書き方は比較的簡単です。

まず、認証に使うIDとPassを作ります。
作成には、apacheに付属しているhtpasswdコマンドを使用します。

htpasswd -c <ファイルを置く場所> <ID>

上記コマンドを使用すると、直後にパスワードの作成を求められます。
入力したパスワードは、ファイルを置く場所として指定された場所に、保持されるようになります。
htpasswdコマンドの-cというオプションは、ファイルを新規作成するためのオプションで、ユーザを追加する場合は付けないようにしてください。
(-cをつけると再度ファイルが新規作成されてしまいます。)

Basic認証では、IDとPassは特定のファイルに保存されるため、ファイルを置く場所と、使用するIDをコマンドの引数として渡す必要があります。
置く場所はどこでも構いませんが、外部から見えない方が望ましいです。

次に、apacheの設定ファイル内に、以下のように書きます。

<Location /admin>
AuthName "enter id and pass"
AuthType Basic
AuthUserFile /usr/local/apache2/conf/.htpasswd
Require valid-user
</Location>

AuthName:該当のページにアクセスした際に出てくる文言を設定します。
AuthType:認証のタイプを選択します。Basic認証以外にも、ダイジェスト認証などがあります。
AuthUserFile:パスワードを設定したファイルをフルパスで指定します。
Require:対象となるユーザを設定します。基本的にはvalid-userにしておけば、全てのユーザでパスが聞かれるようになります。

また、ディレクトリのディテクティブとロケーションのディテクティブの両方を使ったり、Requireでユーザを個別指定することで、初めにアクセスした際にIDとPassを聞かれ、さらに内部で特定のページにアクセスした際にIDとPassを聞かれるような構造にすることもできます。

例えば、require userA useB userCというディレクティブ1と、require userAというディレクティブ2があったとすると、はじめにディレクティブ1にアクセスした時に皆IDとPassの入力を求められ、userAとしてアクセスした人以外はディレクティブ2にアクセスした際に再度ディレクティブ2に設定されたIDとPassを入力する必要が出てきます。

今回はここまでです。

それではまた次回。

Railsのエラー画面への処理を読む

0

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

こんにちは。T氏です。 今日はRailsのエラー画面(public/404.htmlや500.html)への遷移はどうやってされているかをご紹介します。

エラー画面への制御は、actionpackrescue.rbで行っています。
*今回はactionpack-2.1.2である事前提に話を進めます。

 
では、処理が行われている実際のコードを抜き出して見てみましょう。
 

まず、Exceptionが発生するとrescue.rbのrescue_actionが呼び出されます。
ここではlocalhostか判定をして表示するviewの振り分けをしています。

      def rescue_action(exception)
        # logへの出力
        log_error(exception) if logger
        erase_results if performed?

        # Let the exception alter the response if it wants.
        # For example, MethodNotAllowed sets the Allow header.
        if exception.respond_to?(:handle_response!)
          exception.handle_response!(response)
        end

        # ここで判定をして、表示するエラー画面を切り分けている
        if consider_all_requests_local || local_request?
          # localhostだとこちら
          rescue_action_locally(exception)
        else
          # public以下の[status_code].htmlが呼ばれる
          rescue_action_in_public(exception)
        end
      end

 

次にlocalhostの場合に呼び出されるrescue_action_locallyを見てみましょう。
開発中によく見かけるエラー画面を出力しています。

      def rescue_action_locally(exception)
        add_variables_to_assigns
        # インスタンスに対してエラー文言やファイル名等をセットしている
        @template.instance_variable_set(“@exception”, exception)
        @template.instance_variable_set(“@rescues_path”, File.dirname(rescues_path(“stub”)))
        @template.send!(:assign_variables_from_controller)

        @template.instance_variable_set(“@contents”, @template.render_file(template_path_for_local_rescue(exception), false))

        # content_typeの指定
        response.content_type = Mime::HTML
        # rescues_pathではrescue.rbがあるディレクトリの下にあるlayout.erbを呼び出している
        render_for_file(rescues_path(“layout”), response_code_for_rescue(exception))
      end

 

最後に、rescue_action_in_publicメソッドを見てみましょう。
ここではファイル指定( [RAILS_ROOT]/public/[STATUS_CODE].html )をしています。

      def rescue_action_in_public(exception) #:doc:
        render_optional_error_file response_code_for_rescue(exception)
      end

      def render_optional_error_file(status_code)
        status = interpret_status(status_code)
        # pathとファイル名を指定している
        path = “#{Rails.public_path}/#{status[0,3]}.html”
        if File.exist?(path)
          # renderするファイルとステータスコードを指定
          render :file => path, :status => status
        else
          head status
        end
      end

 

以上がRailsのエラー画面への制御でした。

ボックスガチャの実装をしよう(ソーシャルゲームにおけるサーバーサイド) 5

0

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

このキャラクターにこれだけの価値があったのだろうか……? いや、ある、無ければ困る! だって、だって、だって、これだけのお金を掛けたんだもん! 高級なYAKINIKU以上の価値があるんだもん! もん! もん……。タン塩……。焼けて少し丸まった歯ごたえ豊かなタン塩にレモンをキュッと絞って……。

前回までのあらすじ

前回

 ボックスガチャのサーバーサイドのコードの実装が完了しました。
 残るは、テストコードの作成、マスタのインポート処理、クライアントとの繋ぎこみくらいです。

テストコードの実装をしよう

さーばーえんじにあ「仕様書からだと

・ボックスガチャは通常ガチャと同様、1連と10連で引ける
・ボックスガチャで引けるものは通常ガチャと同等
・10連を選択した時にボックスの中身が9個以下だった場合、消費される対象はその中身分のみとなり、全てを自動で排出する
・リセットする度に上限までボックスの中身は変わる
・リセットは自由に可能。そのステージのボックスガチャを1回も引かなくともリセットが出来る

 こんな感じのことが書かれていて、これに対応したテストコードと、
 まあ、後は普通のガチャと同じように、消費する物がそもそも足りなかった場合とかにエラーが起こることを書いておけばいいか。
 後、今回はGachaBoxContentManagerっていうボックスガチャの状態を一括管理するクラス作ったからそこの点でもテストコード作っておくか」

さーばーえんじにあ「必要なテストは

・ボックスガチャを1回引いた時、そして10回引いた時に
 ・ボックスの中身が正常に引かれている事
 ・ユーザーのキャラクターが増えている事
 ・ユーザーの消費対象物が減っている事
 ・ログが記録される事
・ボックスの中身が9個以下だった場合に10回引くを選択した場合に
 ・中身が空になり、ユーザーの消費対象もその分だけ減っている事
・リセットに対して
 ・正常にリセットが出来て
 ・次のステージのボックスがフルの状態である事
 ・リセットは指定回数より多くやろうとしたらエラー
......

 よし! 必要なテスト項目は20個オーバー!
 そしてそのテストをする為には

・ダミーキャラクターマスタ複数作って
 ・それに付随するキャラクターのパラメータマスタとか作って
・ダミーガチャマスタ作って
 ・ダミーボックスガチャ中身マスタ作って
・ダミーユーザー作る為に
 ・ユーザーランクマスタとかそういうのも必要で
・それ作ってからダミーユーザー作って
 ・ダミーユーザーに消費対象のブツを十分に渡した上で
・プロセスのコンストラクタを呼び出してプロセスを実行! 
 ・実行された事に対して想定される結果を書く!

 …………つ、疲れる。
 でも、書いとかないと、リファクタリングとか気軽に出来ない……。
 頑張ろう……」

マスタインポートの処理を書こう

ぷらんな「仮マスタ出来たよ」
さーばーえんじにあ「了解ですー。こっちもテストコード作成がキリ良いところなので、そっち先に対応しますー。
で、不正なマスタデータが入らないようにする為には、どういう事を制限を掛けておけば良いかなってのは……、

・通常ガチャ指定のガチャマスタは、ボックスガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、ガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、リセット制限回数が1以上を指定していなくてはいけない
・ボックスガチャ内容マスタにガチャコード単位で排出キャラクターに重複があってはならない
・ボックスガチャ内容マスタの排出キャラクター量は1以上でなければいけない
・ボックスガチャ内容マスタの内容のステージ数は、ボックスガチャ指定のガチャマスタのリセット制限回数と一致していなければならない

 ……えーっと、ざっと洗いだすとこの位かな……。他にプランナー目線とかからで抜けている事無いかな」
ぷらんな「あ、単純な事抜けてるね」
さーばーえんじにあ「えっ」
ぷらんな「ボックスガチャの排出キャラクターがマスタに実存するかの確認してないじゃん」
さーばーえんじにあ「あっ」

1時間後

さーばーえんじにあ「条件満たした上で仮マスタ入りましたー」
ぷらんな「やったぜ」


小ネタ:

・通常ガチャ指定のガチャマスタは、ボックスガチャ内容マスタに子データを持っていてはならない
・ボックスガチャ指定のガチャマスタは、ガチャ内容マスタに子データを持っていてはならない

こういう二つの条件は整理してみたりすると一つの条件に纏められます。

ガチャマスタ |内容が存在しているマスタ|正常か異常
通常ガチャ  |通常ガチャ       |正常
通常ガチャ  |ボックスガチャ     |異常
ボックスガチャ|通常ガチャ       |異常
ボックスガチャ|ボックスガチャ     |正常

即ち、

・ガチャマスタと対応する、内容が存在しているマスタが通常とボックスにどちらか片方のみにあり、そして一致している

と同等になります。
後、排他的論理和とかを使ったりしても簡潔に纏められる場合があります。
上記で使うならば、

・(ガチャマスタが通常である xor 内容が存在しているマスタが通常である)ならば異常である

となります。
まあ、簡潔に纏められても分かりづらい場合は、分かりやすさを優先して多少冗長になってもそちらの方が良いです(そもそも排他的論理和自体が分かりづらいかもしれない)。

RailsでOracle~ データベース初期化タスクをつくろう!編

0

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

TrinityTです。

今回はRails&Oracleに関する第二弾として、DBの初期化を行う独自タスクについて説明します。

普段の開発では、ダミーデータの削除やユニットテスト前の初期化など、テーブル構成を初期化したい場合にdb:migrate:resetタスクを活用して行っています。

しかし、OracleはMySQLやPostgresqlとテーブル管理の単位、ユーザなどの概念が異なるため、データベースの削除を行おうとするdb:migrate:resetタスクはエラーとなってしまいます。

本問題を解決するためのOracle用独自タスクを作ってみました。

以下の内容でファイルを${RAILS_ROOT}/lib/tasks に作成してください。

db_ora.rake

namespace :db_ora do
  namespace :migrate do
    desc "Reset Database (For Oracle)"
    task "reset" => ["truncate", "db:migrate"]

    desc "truncate all objects (For Oracle)"
    task "truncate" do
      # テーブル削除
      user_tables = UserTable.find(:all)
      user_tables.each do |table|
        ActiveRecord::Base.connection.execute("DROP TABLE #{table.table_name}")
      end
      # ビュー削除
      user_views = UserView.find(:all)
      user_views.each do |view|
        ActiveRecord::Base.connection.execute("DROP View #{view.view_name}")
      end
      # シーケンス削除
      user_sequences = UserSequence.find(:all)
      user_sequences.each do |sequence|
        ActiveRecord::Base.connection.execute("DROP SEQUENCE #{sequence.sequence_name}")
      end
    end

    # ユーザが持つテーブル一覧取得用Model
    class UserTable < ActiveRecord::Base
    end
    # ユーザが持つシーケンス一覧取得用Model
    class UserSequence < ActiveRecord::Base
    end
    # ユーザが持つビュー一覧取得用Model
    class UserView < ActiveRecord::Base
    end

    end
  end
end

コレで以下のコマンドをRAILS_ROOTで行うと、DB初期化とmigrationが行われます。

$ rake db_ora:migrate:reset

db_ora:migrate:resetタスクは作成した独自タスク(truncate)と、db:migrateタスクを組み合わせて行っています。

本タスクの流れは以下の通りです。

(1)truncateタスクを実行

(2)Oracleのシステムテーブル「user_tables」に格納されているテーブル名一覧を取得

(3)テーブルに対してDROP文を実行

(4)同様の処理をシーケンス、ビューに対して実行

(5)db:migrateタスクを実行し、dbの再構築を行う

このタスクを使うことでOracleでもdb:migrate:resetコマンドを擬似的に実行することが可能となります。

こんな感じで独自のオレオレrakeタスクを作ることは簡単なので、皆さんも是非作ってみてはいかがでしょうか!

Google Analyticsで特定のディレクトリのデータを取得する方法

0

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

Google Analyticsで特定のディレクトリのデータを取得する方法

アクセス解析チーム中林です。 サイトを運営していると一つのドメインで企業サイト、ECサイトを運営していることもあるかと思います。 そういった場合にGoogle Analyticsではプロファイルにフィルタを設定することで、特定のディレクトリのアクセスだけのデータを取得することが可能です。本日紹介するのは、 『特定のディレクトリ(サブディレクトリ)のアクセスだけを計測したい』 といった場合に、GoogleAnalyticsで特定のディレクトリのデータだけを取得するための設定方法を紹介します。  

特定ディレクトリのデータ取得にはフィルタを使用

  特定のディレクトリを計測するためには、プロファイルの編集によってプロファイルにフィルターをかける必要があります。 

Google Analyticsで特定ディレクトリのデータ取得の流れ

今回の例では、 http:www.kbmj.com/service/ というURLが有った場合に「service」ディレクトリのデータだけを取得してみます。  ①Google Analyticsにログインしてプロファイルの「編集」

GoogleAnalytifcsプロファイルの編集

  ②プロファイルに適用したフィルタから「+フィルタを追加」を選択 

GoogleAnalyticsプロファイルのフィルタ追加

   ③「プロファイルに新しいフィルタを追加」にチェックを入れます。Google Analyticsに新しいプロファイルを追加する

GoogleAnalytics特定アドレス除外のためのフィルタ追加

④フィルタ名は任意のものを入力  ※仮にフィルタ名前は「serviceディレクトリ」と設定します。 フィルタの種類は「サブディレクトリへのトラフィックのみを含める」 

GoogleAnalyticsの指定ディレクトリを計測

   サブディレクトリには取得したい特定のディレクトリを入力してください  ※今回は「^/service/」を入力 
 ■ポイント■
 「^」を先頭に入力することがポイントです。「^」を入力しないと、 http://www.kbmj.com/service/ のディレクトリだけでなく http://www.kbmj.com/hogehoge/service/ というディレクトリが有った場合に上記のアクセスについてもデータを取得してしまいます。  

GoogleAnalyticsのフィルタで特定のディレクトリのデータ取得設定

 これで「変更を保存」すれば、指定したディレクトリへのアクセスのみGoogle Analyticsのデータで取得することができます。 

IPアドレスを除外をする前に

 今回の作業をする場合、Google Analyticsのプロファイルから特定のディレクトリのみデータを取得するフィルタをかけた場合特定のディレクトリ以外のアクセスについては、フィルタを設定したプロファイルからは2度と取得することができません。  マスターとなるプロファイルは残しつつ、プロファイルは別途作成して、今回紹介したようなサブディレクトリを取得するフィルタをかけることが無難ですね。  今週は以上となります。

■アクセス解析関連記事■

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

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

*SEOのために知ってておいて損はないタグ知識?

Rails2にバージョンアップしたらcreated_atが世界標準時刻になってました

0

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

Rails2.3にバージョンアップし、ふとDB内のレコードの作成時刻を見てみたところ、実際の作成時と9時間のずれがありました。
UTCが適応されているみたいでした。

UTCのままですと分かりずらかったりもしますので、日本時間に合わせてみます。

ググってみたところ、config/enviroment.rb内を以下のように修正してみてとありました。
ちなみにDBはpostgresです。
修正前:config.time_zone = ‘UTC’
修正後:config.time_zone = ‘Tokyo’
結果:(現在時刻:14:34)>> Entry.create({:title=>’test’, :body=>’hello world’})
=> #<Entry id: 7, body: “hello world”, title: “test”, created_at: “2009-06-02 05:34:55”, updated_at: “2009-06-02 05:34:55”>
>> Entry.find(7).created_at
=> Tue, 02 Jun 2009 14:34:55 JST +09:00

登録したときにUTCなのが気になります。DBをのぞいてみたところ、UTCで保存されていました。test_dev=# select id, title, created_at from entries where id=7;
 id | title |         created_at         
—-+——-+—————————-
  7 | test  | 2009-06-02 05:34:55.273476

ググってみたところ、↓のも追加してねとありました。config.active_record.default_timezone = ‘Tokyo’
修正後結果:(現在時刻:14:38)>> Entry.create({:title=>’test’, :body=>’hello world’})
=> #<Entry id: 8, body: “hello world”, title: “test”, created_at: “2009-06-02 14:38:34”, updated_at: “2009-06-02 14:38:34”>
DB内:test_dev=# select id, title, created_at from entries where id=8;
 id | title |        created_at         
—-+——-+—————————
  8 | test  | 2009-06-02 14:38:34.34017

上手くいきました。 ばんざーい。
取り出してみました。>> Entry.find(8).created_at
=> Tue, 02 Jun 2009 23:38:34 JST +09:00

…だめでした。 日本時間+9時間されました。
config.time_zone = ‘Tokyo’ をコメントアウトしてみます。#config.time_zone = ‘Tokyo’
>> Entry.find(8).created_at
=> Tue, 02 Jun 2009 14:38:34 +0000

これでよさげです。
しかしこれだとRails1.0時代と設定が変わっていないような…。
もっと良い方法があるかもしれません。

rubyで外部コマンド実行

0

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

rubyからOSのコマンドやシェルなどの、外部コマンドを

実行する方法としていくつかあるようですので簡単にご紹介します。

バッククォートを使う

#!/usr/bin/ruby

result = `ls -lh`

単純な実行ならコレ。

system

#!/usr/bin/ruby

result = system(“ls -lh”)

print result

結果に真偽値が返ってきます。

exec

#!/usr/bin/ruby

begin

exec(“ls -lh”)

rescue

puts “error”

end

Kernelモジュール内。rescueでrubyの例外を拾えるのが特徴。

open

#!/usr/bin/ruby

result = open(“| ls -lh”)

print result.class # => IO

while !result.eof

print result.gets

end

result.close

ファイルのIOを行うときにopenを使いますが

引数のコマンドの前に「|」パイプを付けると、外部コマンドの実行が可能になります。

実行される外部コマンドの処理を非同期実行や子プロセスにするかなど、

の考慮が必要になりますので、要件に応じて使いわけると良いでしょう。

その他、open3やpopenを使うなど方法もあります。

環境:ruby 1.8.6

最近人気な記事