ホーム ブログ ページ 65

splitで文字列を分割してみよう。

0

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

こんにちは。タジです。

今回は正規表現を使って文字列を分割するメソッド、splitの使い方です。

splitはString型のメソッドで、文字列を正規表現にマッチングする部分ごとに分割して、配列に格納して返します。 

 正規表現とは指定した文字列と合う部分を検索したり抜き出したりするのに使われる表現です。

実際は以下のような感じで使います。

 p “a,b,c,d,e”.split(/,/)

出力結果

条件の正規表現は「/」 で囲います。 

さらに、第2引数には回数を指定できます。

p “a,b,c,d,e”.split(/,/ , 2)

出力結果

=> [“a” , “b”,”c,d,e”]

 私はCSVファイルをDBに格納するのに使いました。

splitはこの他にも使い方があるそうなので、色々勉強していきたいと思います。

では、また次回。 

ウォームスタンバイの復旧手順

0

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

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

前回紹介した設定ではdb1で障害が発生した場合db2でリカバリが行われることが確認できましたが、
このままだとdb2にも障害が起きるかもしれません。そこで今度はdb1を待機系としてウォームスタンバイを復旧する設定をします。

今回は前回の設定が終わっていることを前提で行います。

さきほどまで主系だったdb1のデータベースインスタンスはもう不要なので削除します。

$ rm -rf db1

archive1の中も削除したいですがシンボリックリンクが残っている可能性があるので残しておいてください。

$ psql -p5433 -c “select pg_start_backuo(‘backuo2’) template1
pg_start_backup
——————
  0/9000020
  (1 row)

$ cp -Rp db2 db1
$ psql -p5433 -c “select pg_stot_backuo() template1
pg_stop_backup
——————
  0/A00000000
  (1 row)

次に設定ファイルを編集します。
db1/recovery.confとdb1/postgresql.confの設定を行います。
以下のように変更してください。

db1/recovery.conf
 restore_command = ‘pg_standby -l -t /tmp/trigger /tmp/archive2 %f %p %r’

db1/postgresql.conf
 archive_command = ‘cp %p /tmp/archive1/%f’
 #port = 5433

また前回のように完全バックアップのディレクトリの中からpostmaster.pidとpg_xlogの中身を削除します。

$ rm db1/postmaster.pid
$ rm db1/pg_xlog/*
rm: db1/pg_xlog/archive_status: is a directory
$ rm db1/pg_xlog/archive_status/*

$ pg_ctl -D /tmp/db1 start


以上で設定は終了です。

RDBMSでトランザクション処理をしてみよう。

0

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

 こんにちは。タジです。

 今回は postgresqlやMySQLなどのRDBMSでのトランザクション処理についてです。

 重要なデータの入ったデータベースでUPDATEやDELETEを実行し、もし間違えてしまったら。想像するだけでも恐ろしいです。

 そんな時、トランザクション処理をしておけば、万が一失敗しても元の状態に戻すことができます。

 トランザクション処理では、実際にSQLを発行する前にBEGIN;で処理を開始します。

 その後、UPDATEやINSERT、DELETEなど実際の作業を行い、問題なく作業が終了した場合はCOMMIT;で処理を終了し、データベースに作業を反映させます。

 間違ったSQL文を発行してしまったり、必要な部分を消してしまった時などはROLLBACK;でBEGIN;の時点にデータベースを復旧することができます。

 データベースを触るときは是非やってみてください。

では、また次回。 

nfkで文字コードを変換してみよう。

0

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

こんにちは。タジです。

 今回は、nkfライブラリで文字コードを変換する方法です。

nkfライブラリはnkfコマンドと同じ機能を持っており、rubyに標準で添付されているライブラリです。JIS、EUC-JP、Shift-JIS、UTF-8をかなり簡単に変換できます。

 使い方も簡単です。

 以下はShift-JISで書かれたテキストである「data.txt」を、UTF-8に変換する場合です。

 require ‘nkf’

 File.open(data.txt) do | f |
   text = NKF.nkf(  “-Sw” , f )

     p text 

 end 

 簡単に解説します。

 まずライブラリを読み込む時のお約束であるrequireでnkfライブラリを読み込みます。

 続いて変換したいtextファイルである「data.txt」を読み込みます。

あとは変換した内容を表示するだけですね。

  肝心のNKFライブラリを使っている部分は、()内の引数に変換前の文字コードと変換後の文字コードを指定しています。 

 -jがJIS、-eがEUC-JP、-sがSHIFT-JIS、-wがUTF-8を表しており、変換前が大文字、変換後が小文字という形で指定します。

 今回はSHIFT-JISからUTF-8なので、引数が「-Sw」ということになります。

なお、変換前の文字コードが分からない場合は、変換後の文字コードだけを指定しても、変換前の文字コードを予想して変換してくれます。

今回は以上になります。

それではまた次回。 

bondingでNICを冗長化しよう。

0

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

こんにちは。タジです。

  今回は、サーバ周りの技術でNICを冗長化するbondingについてです。

LANケーブルを2本挿し、bondingを行えば、仮に片方が使えなくなってもネットワークを止めることなく動き続けます。 

では早速やってみましょう。

まずbondingモジュールを読み込むための設定ファイルを作成します。
CentOS 5.1の場合は/etc/modprobe.dディレクトリの下にbondingという名のファイルを作成します。

OSによって、/etc/modprobe.confに書き込んだり、modprobeの代わりにmodule.confに書き込んだりする必要があります。

#  vim /etc/modprobe.d/bonding

alias bond0 bonding
option bond0 miimon=100 mode=1 primary=eth0


OSの種類やバージョンにより、/etc/modules.conf内や/etc/modprobe.conf内に設定する場合もあります。

ネットワーク設定

次にネットワーク設定を行います。
ネットワーク設定は/etc/sysconfig/network-scriptsディレクトリ配下のifcfg-××××ファイルを編集します。
××××内には以下の名前を入れてください。

bond0

bond0は従来使用していたデバイスの設定ファイル(通常はifcfg-eth0)のデバイス名をbond0にするだけです。

DEVICE=bond0
BOOTPROTO=static
IPADDR=xxx.xxx.xxx.xxx

NETMASK=255.255.255.xxx

ONBOOT=yes

eth0,eth1

eth0はbond0の配下という形になるのでMASTERを指定する必要があります。
eth1はデバイス名をeth1にするだけなので割愛します。

DEVICE=eth0 (eth1)
BOOTPROTO=static
ONBOOT=yes
MASTER=bond0
SLAVE=yes
 

ここまで設定したら、ネットワークを再起動してみましょう。

どこか問題ない場所にPINGを送りながら、2本挿したケーブルの片方を抜いてみてください。

そのまま止まることなくPINGを送り続けていたら成功です。

それではまた次回。 

apacheでhttpsからhttpsへのリダイレクト方法

0

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

こんにちは新人のカツオです。


今日は以前行った作業で、うまくいかなくてテンパった

apacheでのSSL接続からSSL接続へのリダイレクトについてご紹介したいと思います。

僕が行った作業はサイトのドメインを変更するというけっこう珍しい?作業でした。

ちょうどSSLの更新もあり、同時にドメインの変更。

そのときの作業項目に

「旧ドメインから新ドメインのURLにリダイレクトする。」

というものがあったんですね。

テスト環境(SSLは取得していない)では

apacheのhttpd.confファイルの設定で

virtualhostの設定項目に 

Redirect / https://xxxxxxxxxxxx.com/

の様に記述していました。

http接続→httpsの場合それで問題はありませんでした。

しかし

本番実施日になっていざ対応してみると

全然リダイレクトされない。。。。

どうやら、https接続でのリダイレクトはできないようです。

ということで別対応

ということで

redirect

ではなく

rewriteするという対応でことなきを得ました。

<VirtualHost 192.168.000.000:443 >
   RewriteEngine On
   RewriteCond %{HTTP_HOST} xxxxxxx.co.jp
   RewriteRule ^/(.*)$ https://yyyyyyyy.com/$1 [R=301,L]
</VirtualHost> 

 てゆう具合に書きました。

※xxxxxxx.co.jpが旧ドメインで、https://yyyyyyyy.com/が新ドメインです。

https→httpsのリダイレクトの場合は注意しましょう。

PostgreSQL8.3でウォームスタンバイの設定

0

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

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

今回はPostgreSQLでのウォームスタンバイの設定を行います。

PostgreSQL8.3からウォームスタンバイの設定が簡単になったので紹介します。

今回は1台のマシンで2つのデータベースインスタンスを作成して環境を作って行きます。

$はPostgreSQLのスーパーユーザで実行してください。

 

まずpg_standbyをインストールします。

 

$ cd /usr/local/src/postgresql-8.3.0/contrib/pg_standby

$ make

$ make install

 

次に/tmpディレクトリにdb1(マスターDB)とdb2(バックアップDB)というインスタンスを作成します。db2はdb1のコピーを使うのでここでは作成しません。

 

$ cd /tmp

$ initdb –n-locale db1

 

次にアーカイブログを格納するためのディレクトリを作成します。

 

$ mkdir archive1

$ mkdir archive2

 

そしてdb1/postgresql.confに以下の3行を追加します。

 

$vi /tmp/db1/postgresql.conf

 

archive_mode = on

archive_command = ‘cp %p /tmp/archive1/%f’

archive_timeout = 10

 

ここではarchive_commandとしてcpをしていますが異なるマシンでウォームスタンバイを構成する場合scpやmountを使ってバックアップDBから参照場所にアーカイブログを出力する必要があります。

 

主系の起動

 

$ pg_ctl start -D /tmp/db1

 

主系の完全バックアップを作成

 

$ psql -c “select pg_start_backup(‘backup’)” template1

$ cp -pR db1 db2

$ psql -c “select pg_stop_backup()” template1

 

 バックアップDBのpostgresql.confの設定

 $ vi /tmp/db2/postgresql.conf

 

archive_mode = on

archive_command = ‘cp %p /tmp/archive2/%f’

archive_timeout = 10

port = 5433

 

db2の中からpostmaster.pidとpg_xlogの中を消す。

$ rm db2/postmaster.pid

$ rm db2/pg_xlog/*

rm: db2/pg_xlog/archive_status: is a directory

$ rm  db2/pg_xlog/archive_status/*

 

バックアップDBのrecovery.confを設定

 

restore_command = ‘pg_standby -l -t /tmp/trigger /tmp/archive1 %f %p %r’

 

バックアップDBの起動

 

$ pg_ctl start -D /tmp/db2

$ psql -p5433

psql: FATAL: the database system is stating up

という表示されるはずです。

 

リカバリーの実行

 
db1で実行
$ createdb testdb

$ psql testdb

testdb=# create table test(t timestamp);
CREATE TBALE
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# insert into test(now());
INSERT 0 1
testdb=# select * from test;
 
DB2で以下のようにアーカイブログがリストアされたメッセージが表示されます。
LOG: restored log file “0000000 10000000000000000C” from archive
LOG: restored log file “0000000 10000000000000000D” from archive
LOG: restored log file “0000000 10000000000000000E” from archive
LOG: restored log file “0000000 10000000000000000F” from archive
 
$ pg_ctl -D db1 stop
$ cd /tmp
$ touch trigger # 今回は手動でファイルを作成しましたがdb1を常に監視しているシェルスクリプトを作成してdb1の反応がなくなった瞬間にtriggerを作成すれば自動で切り替えることができます。

DB2が起動するはずです。これでリカバリは完了しているはずです。最後にきちんと同期がとれていることを確認します。

DB2で実行

$ psql -p 5433 testdb
testdb=# select * from test;
DB1で表示された結果と同じであれば成功です。

以上です。

Net/HTTPで圧縮ファイルをダウンロードしよう。

0

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

はじめまして。

KBMJエンジニアのタジと申します。

ここでは仕事の中で出会った様々な問題をメモしていこうと思っています。 

今回はRubyのライブラリであるNet/HTTPで、lzhファイルをDLする方法です。

Net/HTTPはその名の通りHTTPを扱うためのライブラリで、非常に多くの機能を持っています。

今回はその中でも一番簡単なWebページにアクセスして 内容を持ってくる機能を使いましょう。

では実際に作ってみます。

 require ‘net/http’

 Net::HTTP.version_1_2

     File.open([ファイル名],”wb”) do |f|
       Net::HTTP.start([ドメイン名], 80){|http|
       f.print http.get([対象のファイルまでパス]).body
     }
     end

簡単に解説します。

まず頭にライブラリを読み込んだ後、バージョンを指定しています。

次にファイルを開いて保存したい名前のファイル名でファイルを開きます。

ファイルオープンの際に、書き込みモードとして”wb”を指定します。

この時、書き込みモードを指定するのにバイナリとして記述するという”b”を忘れないでください。

圧縮ファイルはバイナリファイルに分類されます。

次にNet::HTTP.startで接続を開始します。

引数として、対象のドメイン名とポート番号を指定します。

最後に取ってくるHTTPドキュメントのパスを指定して、中身を先ほど開いたファイルに書き込んでおしまいです。

ドメイン名とパスは少しややこしいですが、ドメインはURLの前半部のサーバ名を、パスはその中のファイルの位置を表しています。

例えるなら、「http://doruby.kbmj.com/beginner」というURLなら「http://」までが使用プロトコル、「doruby.kbmj.com」までがドメイン名、「beginner」がパスとなります。 

解説は以上です。

もっとスマートなやり方もありそうなので、色々勉強していきたいと思います。

それではまた次回。

capistranoでmongrel,apache,rsync

0

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

こんにちはtacchiです。
以前TrinityTさんが書いてたcapistranoのすすめのつづきです。
更新されないので勝手に書いちゃいます。

以下の動作をさせたかったので、taskを自分で作ってみようと言う事になりました。
・特定のサーバのmongrelの起動、停止、再起動をさせたい
・特定サーバのapacheの起動、停止、再起動をさせたい
・rsyncでファイルを転送させたい

これがmongrelの起動、停止、再起動です。

  namespace :mongrel do
    desc ‘app01,app02 mongrelのrestart’
    task :restart, :roles => [:app1, :app2] do
     run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster restart;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive == 0 ]; then
             echo ‘error mongrel restart’;
             exit 1;
          fi;
          echo ‘success mongrel restart!’;
          exit 0;”
    end

    desc ‘app01,app02 mongrelのstart’
    task :start, :roles => [:app1, :app2] do
      run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster start;
          sleep 3;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive == 0 ]; then
             echo ‘error mongrel start’;
             exit 1;
          fi;
          echo ‘success mongrel start!’;
          exit 0;”
    end

    desc ‘app01,app02 mongrelのstop’
    task :stop, :roles => [:app1, :app2] do
      run “source /home/hoge/.bash_profile;
          /etc/init.d/mongrel_cluster stop;
          sleep 3;
          isAlive=`ps -ef | grep ‘ruby’ | grep -v grep | wc -l`;
          if [ $isAlive != 0 ]; then
             echo ‘error mongrel stop’;
             exit 1;
          fi;
          echo ‘success mongrel stop!’;
          exit 0;”
    end
  end

これがapacheの起動、停止、再起動です。

  namespace :apache do
    task :start, :roles => [:web1,:web2] do
      sudo “/usr/local/apache2/bin/apachectl start;”
      run “ps -ef |grep http”
    end

    task :stop, :roles => [:web1, :web2] do
      sudo “/usr/local/apache2/bin/apachectl stop;”
      run “ps -ef |grep http”
    end

   task :restart, :roles => [:web1, :web2] do
      sudo “/usr/local/apache2/bin/apachectl restart;”
      run “ps -ef |grep http”
    end
  end

これがrsyncです

set(:parts_file) do
  Capistrano::CLI.ui.ask ‘enter parts file: ‘
end

set(:parts_insert_server) do
  Capistrano::CLI.ui.ask ‘enter remote server ip: ‘
end

set :deploy_to, “/path/to/project”

     desc ‘部分的なファイルを転送できます。プロジェクト以下のファイルを指定して下さい。’
  namespace :rsync do
     task :parts, :roles => :local do
       run “/usr/local/bin/rsync -avz –delete -e ssh #{deploy_to}/#{parts_file} #{parts_insert_server}:#{deploy_to}/#{parts_file}”
     end
  end

てかインデントの為に、nbsp入れないといけないのなんとかならないすかね。。。

今週のRuby on Rails最新情報

0

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

以下の投稿は、 Riding Railsの記事を筆者が独断で翻訳したものです。

誤訳の指摘や、コメント歓迎します。http://weblog.rubyonrails.com/2008/7/11/this-week-in-rails-july-11-2008 

第3回目のRailsコミュニティからの週刊レポートです。この2週間ほどはかなり忙しく、投稿が遅れたことを謝罪します。2週間内の最も興味深い出来事やニュースを紹介します。

Jamis Buck氏からのメンテナンスリリースの発表からはじめます。Capistrano 2.4.3 と Net::SSH 2.0.3 が2週間前にリリースされました。利用者はアップグレードを検討してください。

Rails2.1はリリースされてからしばらく経ちますが、まだ情報を得ていない場合は、こちら のリンクからたくさんの有益な情報へのリンクがあります。

SSL更新時のエラー 改行コードの注意点 for mac

0

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

どもKBMJ新人のカツオです。

今日はSSL更新の際のサーバー証明書をapacheにインストールしたのですが、

apacheの再起動かけてもエラーでサイトが表示されなくなってしまった時がありました。

今日はSSL更新などで

SSL証明書のインストールで注意すべき改行コードについてご紹介です。

というわけで、僕はSSL更新のために



SSL発行のために、CSRを作成し、SSL証明書発行会社に送りました。

そしSSL証明書(サーバーID)を取得しました。

そして、コピペして、apache配下にCSRとともにサーバーIDを置いて

apache再起動しました。

しかし、なぜかエラーの表示とともにサイトが見れなくなっている!!
 

焦った、新人カツオ焦りました。

焦りながらも原因の調査をしていると、わかりました。


どうやら改行コードがおかしいらしい。。。

改行コードには

・LF

・CR

・CR-LF 

というものがあるそうです。

僕の環境はmacなのですが、 

どうやら、サーバーIDをコピペして貼付けたときに

改行コードがmacの改行コードがCRって形式になってたみたいです。

unix環境で見ると

改行が全部

^M 

になっており、それが原因で、サーバーIDを読み取れなかったみたいです。。。

いやはや、そのときはエディタでLF形式の改行コードしなおしたサーバーIDのファイルつくってapacheにあげ直しましたよ。

その結果、無事サイトのSSL更新できました。

後で調べたらCRの改行コードをLFに変える方法というのもあるらしいですけど

それままたの機会に! 

いやはや本当、目に見えないことが原因というのは怖いですな。

今日は以上で、またあいましょう。

Rubyでどう書く?:RubyでWord文書を作成する

0

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

KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。

Rubyでどう書く?:RubyでWord文書を作成する 三浦義太郎(KBMJ)

RubyでPDFが作成できるなら、Wordだってできちゃうだろう――そんな試みです。

問題

第5回目のテーマは第2回「RubyでPDF履歴書を作成する」の変奏です。

第2回はRubyでPDF文書を作成するというお題でしたが、Microsoft Word文書を作成したいということも多いと思います。

というわけで、今回はRubyでWord文書を作成してみたいと思います。

回答例

require 'rdoc/template'
template = TemplatePage.new IO.read('name.xml')
File.open("result.xml", 'wb') do |f|
template.write_html_on(f, {'name' => $*[0]})
end

簡単すぎですね。

解説

今回のミソは、Word 2003から使えるようになったXML文書を使用しているところです。

元の文書は「name.xml」で、これはWord(筆者の環境では2007)で作成したものです。そのため、レイアウトはWordで行うことが可能です。

あとは文字を置き換えたい部分を「%name%」としてあげて、XML文書形式で保存します。

Wordで文書の元が作れるのが大きなメリットですね。

プログラムの実行は

ruby [作成したプログラム] [%name%に置き換えたい文字列] 

で、プログラムと同じフォルダにresult.xmlというファイルが作成されます。

開いてみると「%name%」が置き換えたい文字列になっているはずです。

最後に――

WordのXML文書は、無償で提供されている2003以降のWordビューワを導入することで閲覧できるので、対応したバージョンのWordを持っていなくても大丈夫です。

この機会に社内文書の作成などにRubyを導入してみてはどうでしょうか(まあ、Rubyじゃないとできないというわけじゃないですが……)。

mysqlでレコードの中身を一括置換する方法

0

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

おひさしぶりです。

新人のカツオです。

今日からKBMJでは新卒の研修も一段落し、

エンジニアは私服出勤なのです。

というのはさておき、

今日はmysqlでレコードの項目を一括置換する方法をご紹介したいと思います。

というわけでmysqlでテーブルの中身を一括置換するコマンドです。

UPDATE テーブル SET カラム=REPLACE (カラム,"置換させたい文字列","置換したい文字列");

簡単なSQLですねー。

これでばっちり置換できます。

本日はこれでおしまいです。

ではでは。 また

Edge Railsの最新情報

0

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

以下の投稿は、 Riding Railsの記事を筆者が独断で翻訳したものです。

誤訳の指摘や、コメント歓迎します。

http://weblog.rubyonrails.org/2008/7/6/living-on-the-edge-3

最近はあまりedge Railsに注目すべきことがありませんので、 Railsのコミットログを見ていただいて、指摘していないバグやマイナーチェンジを確認してください。ActionPackの書き直しやマルチスレッ ディングが少し進行中であり、ActiveModelでも少し作業をしています。ただ、まだなにも具体的ではありません。

script/serverにThinをサポートします

script/serverはThinの有無をチェックして利用します。Thinをプロダクションサーバで利用している場合は非常に便利です。developing時にも役にたちます。動作させるにはconfig.gem に ’thin’を追加する必要があります。

このパッチはfluxinの方から提供されました。

複数のテーブル上の状況がhashで指定することができます

Pratik氏は小さなとても便利な変更をActiveRecordにコミットしました。特定の状況を融合されたテーブルのhashに指定することができます。例で示したほうがわかりやすいと思います。

Anime.all(
:joins => :character,
:conditions => {
:active => true,
:characters => { :gender => 'female' }
}
)

 ActiveRecordクエリは全ての”active”なアニメの中の”female”なキャラクターを探すことができます。

同じappでDBを使い分ける

0

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

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

今回は、railsで同じappの中で、違うDBを使う方法を説明します。

例えば、アドレスをhttp://192.168.0.2/test1と打った時とhttp://192.168.0.2/test2と打った時にデータの内容が違うということです。

どうやってやるかというとmongrelのポート番号で分けます。

まず、database.ymlの設定を行います。

test1:

adapter: postgresql

database: test1

username: postgres

password: PostgreSQLのパスワードを入力する。

encoding: utf-8       

test2:

adapter: postgresql

database: test2

username: postgres

password: PostgreSQLのパスワードを入力する。

encoding: utf-8

次にMigrateします。

$ rake db:migrate RAILS_ENV=test1

$ rake db:migrate RAILS_ENV=test2

mongrel_clusterの設定をします。

mongrel_cluster1.yml,mongrel_cluster2.ymlを作成する。

# vi mongrel_cluster1.yml
 
 user: ユーザ名
 group: グループ名
 cwd: アプリケーションの絶対パス
 port: 3000
 environment: test1
 servers: 3
 
 
# vi mongrel_cluster2.yml
 
 user: ユーザ名
 group: グループ名
 cwd: アプリケーションの絶対パス
 port: 3003
 environment: test2
 servers: 3

ディレクトリを作る。

# mkdir /etc/mongrel_cluster

作ったディレクトリにmongrel_cluster1.yml, mongrel_cluster2.ymlを移動させる。

# cp mongrel_cluster1.yml /etc/mongrel_cluster/
# cp mongrel_cluster2.yml /etc/mongrel_cluster/

自動起動用スクリプトを/etc/init.d以下にコピー

 # cp /usr/local/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/
resources/mongrel_cluster /etc/init.d/mongrel_cluster
 # vi /etc/init.d/mongrel_cluster

を編集する。

#PID_DIR=/var/run/mongrel_cluster      #コメントアウト
#USER=mongrel                          #コメントアウト

自動起動に登録する。

# chkconfig --add mongrel_cluster
# chkconfig mongrel_cluster on

つぎにhttpd.confの設定をします。

# vi /usr/local/apache2/conf/httpd.conf

ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
  Order Deny,Allow
  Allow from all
</Proxy>
RewriteEngine On
#RewriteRule ^/test1(.*)$ balancer://cluster1%{REQUEST_URI} [P,QSA,L]
#RewriteRule ^/test2(.*)$ balancer://cluster2%{REQUEST_URI} [P,QSA,L]
RewriteRule ^/test1(.*)$ balancer://cluster1%{$1} [P,QSA,L]
RewriteRule ^/test2(.*)$ balancer://cluster2%{$1} [P,QSA,L]
 
<Proxy balancer://cluster1>
 BalancerMember http://192.168.0.2:3000 loadfactor=10
 BalancerMember http://192.168.0.2:3001 loadfactor=10
 BalancerMember http://192.168.0.2:3002 loadfactor=10
</Proxy>
 
<Proxy balancer://cluster2>
 BalancerMember http://192.168.0.2:3003 loadfactor=10
 BalancerMember http://192.168.0.2:3004 loadfactor=10
 BalancerMember http://192.168.0.2:3005 loadfactor=10
</Proxy>

以上で設定は終わりです。

ブラウザでhttp://192.168.0.2/test1とhttp://192.168.0.2/test2と打って正常にアクセスできれば完了です。

Rubyでどう書く?:重複したRSSをまとめる

0

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

KBMJがZDnetで連載している記事を紹介します。コメントなどありましたらそちらでお願いします。

Rubyでどう書く?:重複したRSSをまとめる 高瀬裕一(KBMJ)

「ネットの話題を追いかけるために、はてブのホッテントリやlivedoor クリップの人気ページをRSSで取得しています。でも、重複していることも多いんです。助けてください」(32才 男性・家事手伝い)――よろしい、ならばRubyで書こう。 

第4回目のテーマは「重複したRSSをまとめる」と題しまして、Rubyで複数のRSSから重複したエントリを除去する問題を出します。

問題

 最近、はてなブックマークやlivedoor クリップなど、ユーザーが外部のサイトを集めて、その結果を出力するサービスが増えてきました。

 ただ、一部のサイトを見ているだけで話題を追うことができるので便利なのですが、同じURLが複数のRSSにあり「もうこれは見たのに……」という事も多いですよね。

 そこで今回は、複数のRSSを一つのRSSとして出力するプログラムを問題にします。

仕様

  • RSSのURLは、コマンドラインから引数として1個以上与えられる。
  • 結合した結果のRSSのタイトルおよび説明は、各引数のタイトルをつなげたものとする。
  • 結合した結果のRSSのURLは第一引数のURLとする。
  • フィードのリンク先が同一のものを同じフィードとして扱う。
  • 出力順は第一引数のものを順に出力し、その後第二引数、第三引数のものを順に出力する(同じフィードとして扱うものは除外する)。
  • 重複したものは前の引数の内容を出力する。
  • 出力先は標準出力とする。
  • 出力するRSSのバージョンは2.0

回答例

 1 require 'rss'
  2
  3 rss_feeds = rss_urls = []
  4 title=""
  5
  6 ARGV.each do | rss_url |
  7   open(rss_url) do | http |
  8     response = http.read
  9     rss_results = RSS::Parser.parse(response, false)
 10    
 11     if rss_results && rss_results.channel && rss_results.channel.title
 12       title += " と " if title.size > 0
 13       title += rss_results.channel.title
 14     end
 15    
 16     rss_results.items.each do | item |
 17       unless rss_urls.include? item.link
 18         rss_urls << item.link
 19         rss_feeds << item
 20       end
 21     end
 22   end
 23 end
 24
 25 rss = RSS::Maker.make("2.0") do | writer |
 26   writer.channel.title = title || ""
 27   writer.channel.link = rss_urls[0] || ""
 28   writer.channel.description = title || ""
 29   rss_feeds.each do | feed |
 30     feed.setup_maker(writer)
 31   end
 32 end
 33
 34 puts rss.to_s

 試しに、livedoor クリップ 人気ページと、はてなブックマーク 人気エントリーを取得してみましょう。

ruby rss.rb http://clip.livedoor.com/rss/hot http://b.hatena.ne.jp/hotentry?mode=rss

 本記事を執筆時点では、実行結果は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>livedoor クリップ - 人気ページ と はてなブックマーク 最近の人気エントリー</title>
    <link>http://clip.livedoor.com/rss/hot</link>
    <description>livedoor クリップ - 人気ページ と はてなブックマーク 最近の人気エントリー</description>
08-06-23 22:52 $ ruby "test.rb" "http://clip.livedoor.com/rss/hot" "http://b.hatena.ne.jp/hotentry?mode=rss" | head -20
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>livedoor クリップ - 人気ページ と はてなブックマーク 最近の人気エントリー</title>
    <link>http://clip.livedoor.com/rss/hot</link>
    <description>livedoor クリップ - 人気ページ と はてなブックマーク 最近の人気エントリー</description>
    <item>
      <title>Engineer25 すべてを楽しむ若きスーパーエンジニア達 第4回 cho45氏- ウェブキャリア</title>
      <link>http://www.web-career.com/contents/engineer25/4.html</link>
      <description></description>
      <dc:subject>interview</dc:subject>
      <dc:subject>ruby</dc:subject>
      <dc:subject>javascript</dc:subject>
      <dc:subject>program</dc:subject>
    </item>
    <item>
   ...中略...
    </item>
  </channel>
</rss>

解説

 本サンプルプログラムは、大きく3段階の処理になっています。

 第1段階(6行目から9行目)では、渡された引数を元に各ページにアクセスし、RSSを解析しています。

 第2段階(11行目から20行目)では、rss_feeds内にRSSを分解したフィードの内容を登録しています。

 今回は第一引数の出力内容を優先するので、順番を管理しやすいArrayに登録しました。そして、重複チェック用に、rss_urlsというArrayを作って、登録時にそこにurlを入れ、urlが既に登録されていないかチェックをしています。

 第3段階目(25行目から34行目)では、全RSSの取得を完了した後で、makeでRSSを再生成して出力しています。

最後に――

 今回のお題は主に自分が必要と感じるものを作ってみました。

 パーサが標準のライブラリにあるので特に手間無く作れましたが、もうちょっと実用度を上げようとすると、サーバが落ちている場合や、引数が間違えている場合などの例外処理を組み込むのも良いと思います。

 こんな風に作ってみたよという方が居られましたら、コメントやbuilderブログなどで教えていただきたいと思います。

TABLEに直接データを入れる便利な方法

0

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

どうもメガネです。3回目の投稿です。

今回は、データベースに直接データを入れる方法を紹介します。これを使えば、同じようなデータを何件も入れる時に役に立ちます。

create table test(id primary key , name text);

上のようなテーブルの構造の場合でかつidを指定しない場合現在の最大値に+1増えるような設定の場合

まず.sqlファイルを作ります。

$vi  test.sql

ファイルの中に

insert into test(name) values(‘fujishiro’);

Vim かviの場合コマンドモードでyy と押して 10000000000 + p と押せば百億のデータを入れられます。

ここからはRDBMSごとに違います。

PostgreSQLの場合

そのファイルがあるディレクトリでpsqlでログインします。

=#\i test.sql

以上です。

MySQLの場合

そのファイルがあるディレクトリ

$mysql –u root –p < test.sql

以上です。

これを使えば簡単にDBのパフォーマンスを下げられるのでテストの時便利です。

社内SNSをiPhoneで快適に見るためのCSSを書いてみた

0

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

KBMJの佐藤です。 ついにiPhoneが日本国内で発売されますね。

時間がない人のための、「WWDC 2008 基調講演」が5分でわかるハイライト

アップル – iPhone

昨日はジョブズの講演に関する情報を リアルタイムで最初から最後までネットでチェックしていました。

興奮さめやらず、今日は昼食をデスクでとりながら、 社内SNS(SNS構築パッケージ「SNSエンジン」にて構築)を iPhoneのSafariに最適化する実験を行なってみました。

実験機材として使用したのはiPod touchです。

iPhoneのSafariはPCサイトも表示できるけど…

iPhoneのSafariはPCサイトも表示できるのですが、 iPhoneの画面はPCに比べて小さいこともあり、 そのまま快適に閲覧できるとは限りません。 PCのブラウザで表示した内容がそのまま縮小されて表示されるようなイメージになります。

iPhoneでは指先でリンクをクリックする必要がありますので 操作もしづらくなります。

いくつかの解決策があるのですが、 今回はiPhoneのSafari向けにCSSを作成することにしました。

iPhone向けのCSSを書く

HTMLからiPhone向けのCSSを参照するには、以下のようにします。<meta name=”viewport” content=”width=device-width, user-scalable=no” />

user-scalableをnoに設定すると、2本指による拡大・縮小などができなくなります。 ここは考え方にもよるのですが、拡大・縮小の操作を無効化することによって、 上下にスクロールするだけで閲覧可能な、 見やすいiPhone向けサイトを作成することができます。
<link media=”only screen and (max-device-width:480px)”
    href=”small-device.css” type=”text/css” rel=”stylesheet”>
<link media=”screen and (min-device-width:481px)”
    href=”not-small-device.css” type=”text/css” rel=”stylesheet”>

などとすることによって、PC向けとiPhone向けでCSSを切り替えられるようです。

iPhoneらしいデザインのCSSを書く

今回はiPhoneらしいデザインのCSSを記述しました。 iPhoneの設定画面などのデザインと合わせることによって、 統一感のあるサイトを作成できます。

画像の表示

基本はiPhoneの画面幅に合わせた解像度で表示すると良いでしょう。 Safari上で画像ファイルのURLを指定して表示した場合は 2本指による拡大縮小ができます。 コンパクトデジカメなどで撮影した高解像度の画像も表示できるようです。

iPhoneに最適化したサイトのメリット

iPhoneの売りであるタッチ操作によって、非常に快適にサイトを閲覧することができるようになります。

サイト表示にかかる時間は回線状態によって変化?

iPhone 3GではHSDPAなどによる高速なデータ通信が可能になると思われますが、 無線LANにて接続した場合に比べて通信速度は遅くなることが予想されます。 よって、iPhone向けのサイトでユーザービリティを追求すると CSSによる表示切り替えだけではなく、 場合によってはHTMLや画像の情報量削減が必要かもしれません。

Safari上にて回線接続状態を取得してHTMLなどの情報量をコントロールできれば良いのですが、 この辺の細かい仕様については更なる調査が必要です。

さいごに

いかがでしたでしょうか?

今日は各地のソフトバンクショップでiPhoneの予約が殺到したと聞きます。 私もiPhone 3G 16GBを2台ほど予約確保しました。

日本国内の携帯市場でiPhoneがどれだけのシェアを押さえられるのかはまだまだ未知数ですが、 iPhoneで見やすいサイトというのは今後確実にニーズが出てくるかと思います。

次回はもう少し踏み込んだ内容で、iPhoneに関する技術記事を書きたいと思います。

RSSの購読をお忘れなく!!

個人ブログ : 拡張現実ライフ

dmgファイルの作り方

0

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

初めまして、もじら組組長ことたろちゃんです。はてなではid:smellmanで通っております。もっともメインのハンドルネームはbtmだったりするのですが、最近smellmanの方が有名だったりしてちょっとへこみ気味です。

さて、今回はMacOSXでよく使われているdmgファイルの作り方について説明をしたいと思います。

まず、dmgファイルを作成する手順を簡単にまとめてみましょう。

  1. 空のdmgファイルを作成し、マウントする
  2. マウント先にファイルをコピーする
  3. マウントを解除する
  4. dmgファイルを配布用DMGファイルに変換する。

まずは空のdmgファイルを用意するのですが、その前に必要なディスク容量を計測しておきましょう。ディスク容量を計測する手っ取り早い方法は du -sk を使う方法です。このコマンドではキロバイト単位でファイルが利用している容量がわかります。$ du -sk /Applications/My\ App.app
42464    /Applications/My App.app

今回は42464kbで大体42MB必要だという事がわかります。実際空のディスクを作る際には少し多めにディスク容量を設定します。今回は50MBを取りましょう。

空のdmgファイルを作成するには以下のコマンドを入力します。$ hdiutil create -size 50m -type UDIF -fs HFS+ -volname “My App” -layout NONE myapptest.dmg
…………………………………………………………………….
created: /Users/tmatsuzawa/tmp/disk/myapptest.dmg

これで空のdmgファイルが作成されたので、マウントをしましょう。マウントを行うには hdid コマンドを利用します。$ hdid myapptest.dmg
/dev/disk1                                                 /Volumes/My App

これで/dev/disk1に/Volumes/My App というボリュームがマウントされた事になります。もちろんFinderからも閲覧可能です。

あとはマウント先にファイルをコピーをするのですが、Finderごしに行うと.DS_storeファイルが生成されてしまうので、 ditto コマンドを使ってコピーをしましょう。また、リソースフォークを含めるように -rsrcFork オプションを追加します。$ ditto -rsrcFork /Applications/My\ App.app /Volumes/My\ App/My\ App.app

次にhdiutil eject コマンドでマウントを解除します。$ hdiutil eject disk1
“disk1” unmounted.
“disk1” ejected.

最後に配布用のdmgファイルに変換します。変換には hdiutil convert を利用します。 -format オプションで生成するイメージの形式を指名します。 UDZO では zlibを使って圧縮されたリードオンリーなディスクイメージとなります。$ hdiutil convert -format UDZO -o myapp.dmg myapptest.dmg
イメージ作成エンジンを準備中…
ディスク全体 (Apple_HFS : 0) を読み込み中…
…………………………………………………………………….
  (CRC32 $4482ED93:ディスク全体 (Apple_HFS : 0))
リソースを追加中…
…………………………………………………………………….
経過時間: 2.096s
ファイルサイズ:18126020 バイト、チェックサム:CRC32 $555590C7
処理されたセクタ数:102400、87361 圧縮されました
速度:20.3M バイト/秒
節約率:65.4%
created: /Users/tmatsuzawa/tmp/disk/myapp.dmg

ファイルが作成できたら myapp.dmg を試しにマウントしてみましょう。$ open myapp.dmg

中身が正常に表示されていていれば成功です。あとはこのファイルを自由に配布する事ができます。

will_paginageを使ってみた

0

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

rails2.0に移行したらpaginateがつかえなくなりました。

なので、代わりとなるwill_paginateというプラグインを使ってみます。

まずプラグインのインストールから
プロジェクトフォルダ内で、

# script/plugin install svn://errtheblog.com/svn/plugins/will_paginate
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/helper.rb
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/console
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/database.yml
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/boot.rb
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/lib
A    /home/sakuma/workspace/test/vendor/plugins/will_paginate/test/lib/activerecord_test_connector.rb



— Mislav
すごい勢いで、いろいろ入いりました。

controllerを修正します。
paginateしたいアクションに
以下を追加(#は以前のpaginate)
# @pages, @items = paginate(:items, :per_page => 3)
@items = Item.paginate(:page=>params[:page], :per_page=>3)

※ “:page”は表示したいのページのパラメーターです。
  現在表示されているページパラメーターはparams[:page]で取ってこれます。

書き方的には
Model名.paginate(:page=>params[:page], 以下前と同様)

て感じでしょうか。

viewも修正します。
表示方法は、以前と同様、
<% for item in @items %>
  <%=h item.name %> <%=h item.body %><br />
<% end %>
でいけます。
ページを表示させるリンクには
<%= will_paginate(@items) %>

を付けます。

こんな感じにpaginateできました。画面が小さくて見づらいですが。。。

案外簡単。

google先生によると、
Item.paginate_by_user_idとか
@items.page_count(総ページ数の取得)とかもできる模様。
いろいろ試せます。
 

PHP携帯電話の機種情報取得

0

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

こんばんは、O2です。

PHPにて機種情報を取得する方法に関して記述します。

以下のように書いてある参考サイトがあり、そのまま使用していましたが!!
$mobObj = Net_UserAgent_Mobile::singleton();
$serialNumber = “”;
switch( true )
{
  case ($mobObj->isDoCoMo()):
  case ($mobObj->isVodafone()):
    if( method_exists( $mobObj, “getSerialNumber” ) )
      $serialNumber = $mobObj->getSerialNumber();
    break;
  case ($mobObj->isEZweb()): // ezwebかどうか
    if( isset( $_SERVER[‘HTTP_X_UP_SUBNO’] ) )
      $serialNumber = $_SERVER[‘HTTP_X_UP_SUBNO’];
    break;
  default:
    break;
}


どうも、ドコモ端末の場合!!
FOMAとFOMA以外の端末では取得方法が判明$mobObj = Net_UserAgent_Mobile::singleton();
$serialNumber = “”;
switch( true )
{
  case ($mobObj->isDoCoMo()):
  if( $mobObj->isFOMA() ){
    if( method_exists( $mobObj, “getCardId” ) ){
      $serialNumber = $mobObj->getCardId();
    }
  }else{
    if( method_exists( $mobObj, “getSerialNumber” ) ){
      $serialNumber = $mobObj->getSerialNumber();
    }
  }
  break;
  case ($mobObj->isVodafone()):
    if( method_exists( $mobObj, “getSerialNumber” ) )
      $serialNumber = $mobObj->getSerialNumber();
    break;
  case ($mobObj->isEZweb()): // ezwebかどうか
    if( isset( $_SERVER[‘HTTP_X_UP_SUBNO’] ) )
      $serialNumber = $_SERVER[‘HTTP_X_UP_SUBNO’];
    break;
  default:
    break;
}

最近人気な記事