ホーム ブログ ページ 54

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

0

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

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

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

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

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

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

#!/bin/sh

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

cd [RAILS_ROOT]

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

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

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

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

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

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

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

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

  end
end

ターミナル上で

$ ruby script/runner -e production ModelClass.method

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

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

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

daemon についてはこちら

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

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

使うのは、 gem daemons です

http://daemons.rubyforge.org/

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

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

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

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

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

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

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

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

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

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

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

$ ruby script/daemon stop

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

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

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

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

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

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

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

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

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

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

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

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

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

※追記

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

[RAILS_ROOT]/lib/daemons/rails.rb

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

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

[RAILS_ROOT]/lib/daemons/daemons1.rb

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

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

daemon_run("ModelClass.method", type)

参考文献

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

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

Redmineはnginx+Passengerで

0

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

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

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

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

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

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

sudo port install ImageMagick
gem install rmagick

 2 Passengerをインストール

gem install passenger

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

passenger-config --root

 3 nginxのインストール

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

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

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

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

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

sudo port install nginx +gzip_static +passenger +ssl

 4 nginxの設定

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

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

sudo vim nginx.conf

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

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

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

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

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

 5 nginxの自動起動設定

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

sudo port load nginx

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

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

0

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

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

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

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

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

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

このように編集します

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

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

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

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

memcachedを使ってみる

0

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

どうもメガネです。

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

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

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

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

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

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

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

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

以上で準備完了。

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

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

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

class UsersController < ApplicationController

  def index
    @users = User.find_all
  end

end

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

Ruby on Rails SOAP

0

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

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

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

環境

ruby1.8.6
rails1.2.6

データの送受信

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

受信データ

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

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

0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

GOOD RAILS!!

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

0

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

こんにちは、sasimiです。

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

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

そこで、RVMです。

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

環境はCentOS5.4です。

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

■ RVMのインストール

■ Rubyのインストール

■ gemsetの作成

■ Rails3、Rails2のインストール

 RVMのインストール

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

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

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

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

[tomonori@localhost]~% rvm notes

Notes for Linux ( CentOS release 5.5 (Final) )

    *  curl is required.

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

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

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

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

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

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

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

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

ここまでの詳細は

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

を参照してください。

 Rubyのインストール

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

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

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

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

 gemsetの作成

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

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

[tomonori@localhost]~% rvm gemset list

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

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

[tomonori@localhost]~% rvm gemset create rails3

info: Gemset 'rails3' created.

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

[tomonori@localhost]~% rvm gemset create rails2

info: Gemset 'rails2' created.

 Rails3、Rails2のインストール

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

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

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

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

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

[tomonori@localhost]~% rvm gemset use rails2

info: Now using gemset 'rails2'

[tomonori@localhost]~% gem install rails

では、確認します。

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

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

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

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

*** LOCAL GEMS ***

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

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

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

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

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

*** LOCAL GEMS ***

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

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

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

最後に

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

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

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

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

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

0

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

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

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

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

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

 solarisコンテナ(zone)

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

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

既存コンテナ一覧を表示

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

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

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

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

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

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

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

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

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

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

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

0

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

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

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

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

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

 solarisコンテナ(zone)

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

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

既存コンテナ一覧を表示

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

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

#zlogin <ゾーン名>

ゾーンの起動

# zoneadm -z <ゾーン名> boot

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

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

ソーンの停止(強制)

# zoneadm -z <ゾーン名> halt

 ZFS

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

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

#zfs snapshot testpool/home/test1@today

一覧を確認

#zfs list

ロールバック

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

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

0

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

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

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

とやっていたのですが、

rake db:migrate:reset

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

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

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

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

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

rake db:drop:all

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

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

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

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

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

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

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

0

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


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

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

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

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

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

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

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

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

0

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


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

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

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

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

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

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

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

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

0

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

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

以下、ソース再掲↓

KCODE = 'u'

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

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

ポイントは

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

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

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

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

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

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

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

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

0

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

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

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

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

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

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

環境

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

prawntoのインストール

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

prawnのインストール

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

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

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

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

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

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

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

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

end

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

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

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

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

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

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

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


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


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

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

簡単に例をあげます

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

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

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

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

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

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

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

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

http://cracklabs.com/prawnto

acts_as_rateableを使ってみた

0

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

こんにちわ

abennuです

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

インストール

インストールは

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

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

script/generate migration add_ratings

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

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

def self.down
  drop_table :ratings
end 

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

class User < ActiveRecord::Base
  acts_as_rateable
end

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

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

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

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

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

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

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

User.find_by_name("hoge").rating

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

以上です。

CakePHPでRailsのように環境設定に応じて必要なパラメータを変更する方法

0

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

TrinityTです!!

最近CakePHPの仕事をしています。

Railsライクな構成のため比較的容易に開発を進められたのですが、残念なことに「環境名に応じて設定値を切り替える」方法がありませんでした。

今回はこれを解決する方法について説明します。

 前提

Railsでの環境設定方法

・「ルートディレクトリ/config/environment.rb」に全環境共通の設定を記述

・「ルートディレクトリ/config/environments/環境名.rb」に各環境ごとの設定を記述

CakePHPでの環境設定方法

・「ルートディレクトリ/config/bootstrap.php」に環境設定を記述

→環境ごとの設定という概念が無い!デプロイのたびに逐次変更する必要があるので非常に面倒。

目標

ローカル開発環境(develpment)、テストサーバ環境(integration)、本番サーバ環境(production)でシームレスに環境設定を切り替えられるようにする!

 説明

方針

・環境名はApacheに独自定義。

・「ルートディレクトリ/config/bootstrap.php」に全環境共通の設定を記述

・「ルートディレクトリ/config/bootstraps/環境名.php」に各環境ごとの設定を記述

 手順

1. Apacheに独自環境名設定

Railsでは起動時に環境変数を指定しますが、CakePHPではこの概念が無いためApacheの設定ファイル(httpd.conf等)にSetEnvで独自パラメータを設定します。

ここでは「CAKE_ENV_MODE」という変数を定義することにしました。

ローカル開発環境(development)

※後述する振り分けでは「本番orテストサーバorそれ以外」という条件にするため、設定しなくても問題無いです。

  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "development" 
...
テストサーバ(integration)
  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "integration" 
...
本番サーバ(production)
  DocumentRoot /var/www/html
...  
  SetEnv CAKE_ENV_MODE "production" 
...

2. 各環境ごとの設定ファイルを作成

「ルートディレクトリ/config/bootstraps/環境名.php」のファイルを作成します。

この例では「LOG_PATH」の設定を行っています。

ローカル開発環境(config/bootstraps/development.php)
<?php
Configure::write("LOG_PATH", "/var/log/development/cake.log");
?>
テストサーバ(config/bootstraps/integration.php)
<?php
Configure::write("LOG_PATH", "/var/log/integration/cake.log");
?>
本番サーバ(config/bootstraps/production.php)
<?php
Configure::write("LOG_PATH", "/var/log/production/cake.log");
?>

3. 設定ファイル読み込み

作成した各環境毎の設定ファイルを読み込む処理をconfig/bootstrap.phpに設定します。

...
// Apacheで設定した環境名を読み込む
$env = empty($_SERVER['CAKE_ENV_MODE']) ? '' : $_SERVER['CAKE_ENV_MODE'];

// 環境名に応じて設定ファイルを読み込む
switch ($env) {
 case 'production':
   require_once('bootstraps' . DS . 'production.php');
   break;
 case 'integration':
   require_once('bootstraps' . DS . 'integration.php');
   break;
 default:
   require_once('bootstraps' . DS . 'development.php');
}

これにより各環境で「LOG_PATH」変数を意識せずに設定が切り替えることができるようになりました。

 おわりに

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

PHPの場合「レンタルサーバで運用しているのでApacheの設定はいじれない!」などの制約が考えられるため、

他の方法を行う必要があるかもしれません。

参考になれば幸いです。

S2Chronosでバッチ処理

0

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

こんにちは。wryyyです。

本日は、S2ChronosというSeasar2(Javaのフレームワーク)のプロジェクトをご紹介いたします。

ではまずS2Chronosとは何か!概要をご紹介いたします。

【概要】

S2Chronosは、Seasar2に対応したJavaオブジェクトスケジューリングフレームワーク。

日時に関連するビジネスロジックを、S2上でタスククラスとして登録し、スケジューリングすることが可能になる。

つまり、S2Chronosを使うことによって、アプリ上でバッチを動かすことができ、

バッチファイルを別途用意して、cronに登録して。。。という作業が必要なくなるのです!!

それでは、実際にS2Chronosの設定を行い、動作するようにしてみましょう。

1. Jarのダウンロード、ビルドパスに追加

http://s2chronos.sandbox.seasar.org/ja/download.html

上記、URLより

・s2chronos-core-1.0.0.jar

・s2chronos-extension-1.0.0.jar

をダウンロードし、プロジェクトのビルドパスに追加。

2. S2Chronos用ファイルの作成と設定変更

・chronosCustomizer.diconファイルを src/main/resources に作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
        "http://www.seasar.org/dtd/components24.dtd">
<components>
        <component name="schedulerConfiguration" class="org.seasar.chronos.core.SchedulerConfiguration">
                <property name="daemon">true</property>   
                // スケジューラをデーモンスレッドで起動します.
                <property name="autoFinish">false</property> 
                // <- 実行するタスクがない場合自動的にスケジューラを終了させるかどうかのフラグ。
                         trueの場合自動的に終了します.
                <property name="autoFinishTimeLimit">5000L</property>
                // <- 実行するタスクがなくなってからどれぐらいでスケジューラを終了させるかの時間(msec).
                <property name="taskScanIntervalTime">2000L</property>
               // <- タスクを監視する時間間隔(msec).
                <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property> 
               // スケジューラのスレッドプールタイプを指定します.
        </component>
</components> 

・creator.diconに下記を追加します。

<component class="”org.seasar.chronos.core.creator.TaskCreator”/">
<component class="”org.seasar.chronos.core.creator.TriggerCreator”/">

・customizer.diconに下記を追加します。

<component name="taskSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
                <initmethod name="addInterceptorName">
                        <arg>"aop.traceInterceptor"</arg>
                </initmethod>
                <property name="pointcut">"do.*, initialize, destroy"</property>
        </component>
        <component name="taskCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
        <initmethod name="addCustomizer">
                        <arg>taskSupportAspectCustomizer</arg>
        </initmethod>
        </component>
        <component name="triggerSupportAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer">
                <initmethod name="addInterceptorName">
                        <arg>"aop.traceInterceptor"</arg>
                </initmethod>
                <property name="pointcut">".*"</property>
        </component>
        <component name="triggerCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
                <initmethod name="addCustomizer">
                        <arg>triggerSupportAspectCustomizer</arg>
                </initmethod>
        </component>

・src/main/webapp/WEB-INF/ にあるweb.xmlに下記を追加します。

<servlet>
        <servlet-name>chronosServlet</servlet-name>
        <servlet-class>org.seasar.chronos.extension.servlet.S2ChronosServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
</servlet>

3. パッケージの作成

プロジェクトの src/main/java にタスクパッケージを作成

例:hoge.task(.taskで終わるような名前にする。)

4. タスククラスの作成

上記のタスクパッケージにタスククラスを作成する。(HogeTask.java等、Taskで終わるような名前にする。)

packager hoge.task;

import org.seasar.chronos.core.annotation.task.Task;
import org.seasar.chronos.core.annotation.trigger.NonDelayTrigger;

@Task
@CronTrigger(expression = "0 44 17 * * ?")
public class HogeTask {

    // タスク処理
    public void doExecute() {
        System.out.println(“test”);
    }
}

・@Task:タスクスケジューラとして、登録する。

・@CronTrigger(expression = “0 44 17 * * ?”):17時44分00秒にdoExecute()メソッドを実行する。

5. 起動、動作確認

上記プロジェクトをtomcatコンテキストに定義して、tomcat起動

CronTriggerアノテーションで指定した時間に、コンソール上に「test」の文字が出るか確認。

※補足

s2chronosをHOTdeployで実行すると、毎秒クラスの再ロードが行われ、ログが大変なことになる。

本番反映時には、COOLdeployにする。

COOLdeployにするためには、chronosCustomizer.diconを以下のように修正する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>
    <component name="schedulerConfiguration" class="org.seasar.chronos.core.SchedulerConfiguration">
        <property name="hotdeployDisable">true</property> ←ここを追加
        <property name="daemon">true</property>
        <property name="autoFinish">true</property>
        <property name="autoFinishTimeLimit">5000L</property>
        <property name="taskScanIntervalTime">2000L</property>
        <property name="threadPoolType">@org.seasar.chronos.core.ThreadPoolType@CACHED</property>
    </component>
</components> 

(googleで調べるドキュメントとかには<property name=”hotdeployDisabled”>とかになっているので注意!!)

以上、簡単ですがS2Chronosの説明となります。

他にも動的にスケジュールの時間を決められたりするので、また何か発見しだい投稿したいと思います。

つかおう SKK

0

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

たのしいインプットメソッド、SKK をくわずぎらいのひとにもおすすめしたいです。

google 日本語入力や baidu type などあたらしい日本語入力システムが少し話題になったりして、色々試してみたかたもいるかと思いますが、そのついでに SKK も試してみてはいかがでしょうか。是非、試してみましょう。

 SKK とは何ですか?

あえて語るまでもなく、インプットメソッド(以下 IM)の一種です。詳しいことは、Wikipedia (SKK – Wikipedia)などの解説に譲ります。

おおざっぱな特徴と比較

  • SKK:
    • ユーザに依頼された部分を漢字変換する。漢字変換する部分はユーザが指定する
  • MS-IME やことえりなどの IM:
    • ユーザの入力文字列を文章の構成要素にわける。必要なら漢字の変換を行なう。ただし、IM の仕事が複雑で、ユーザの意図する単語の区切りにならない場合がある

さらにおおざっぱな特徴と比較

文章を構成要素に区切る作業を、

  • 常に自分でやるか(SKK)
  • 誤変換があったとき直すか(その他 IM)

という、ユーザの負担のタイミングと頻度が違います。

小刻みに変換の合図を送ってリズム良く入力していくか、変換を丸投げしてときどき誤変換に対応していくか、くらいの違いなので最終的にどちらを選ぶかは好みの問題ですが、SKK は慣れればテンポ良く入力していけるはずなので、比較的ストレスなく日々を過ごせるのではないかと思います。

 てっとりばやく体験してみる

こういうものは実際手をうごかしてみるのが良いと先人も言っているので、手をうごかしてみます。

Emacs で SKK のチュートリアルが用意されているので、これで試してみるのがオススメです。

準備

Debian や Ubuntu では SKK 導入のためのパッケージが用意されているのでそれを利用します(一番楽な方法)。その他の環境では「Emacs ddskk」とったキーワードで検索してみてください。

sudo aptitude install apel ddskk skkdic

それぞれ、以下のものをインストールしています。

  • apel: Emacs で使われるライブラリ
  • ddskk: Emacs で使われる SKK ライブラリ
  • skkdic: SKK で利用される辞書ライブラリ

aptitude でインストールした Emacs 等であれば、ライブラリパス等の設定の必要もなく、起動して即利用できます。

試す

emacs を起動します。そしてチュートリアルを開始します。チュートリアルは M-x skk-tutorial で開始します。

あとは言われるままにチュートリアルを進めるだけです。

 導入する

SKK は Emacs だけで利用できる IM ではありません。skkime(Windows)、aquaSKK(OSX)、uim-skk(Linux など)といった様々な OS の IM で利用できます。Vim でも skk.vim というプラグインが利用できます(skk.vim : Japanese SKK。また、Vim での SKK については eskk.vim というプラグインの開発もはじまっています)。それぞれの利用したい場所での SKK を探して日常的に利用してみましょう!

 付録:よくある問題など

  • 小指が疲弊します
    • 慣れると意外と気にならないです。別解として、sticky-shift という、小指にやさしい仕組みが世の中にはあります。sticky shift で検索してみてください。
  • Terminal.app で “▽” がきれいに表示されない
    • iTerm を使う、次のバージョンに期待するなどの対策があります。
  • 他の入力方式で入力できなくなる
    • 他の入力方式で入力するケースことがあまりなくなるはずなので、おそらく問題ないです。

みなさんが SKK を利用してたのしい生活を送られることを願ってやみません。

Pythonで画像のコピー

0

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

はい。ぼくです。

さて、iPhoneのネタたくさんあるのですが。。今日はおやすみ。

たまたま、今日iPhoneアプリの開発検証で画像が数百枚も必要になったので、1枚のサンプル画像をコピーしまくろうということで、Pythonで数行のスクリプトで処理したのでそちらを記事に。

 Pythonの画像処理ライブラリのPIL(Python Imaging Library)で処理しました。
こちらが、自分のPCに入っていなかったため下記にてインストール( Mac限定ですみません。)

$ sudo port install py26-pil

インストールできちゃえば、後はコードちょりちょり書くだけ

# vim:fileencoding=utf-8 :

from PIL import Image
from PIL import ImageFont, ImageDraw

# 元となる画像名
original_image_name = “original.png”
# コピー後の画像名フォーマット
copied_image_name = “copied_%03d.png”

# 画像の読み込み
im = Image.open(original_image_name)

# 500 枚作成
for i in range(500):
    # コピー
    copy_im = im.copy()
    draw = ImageDraw.Draw(copy_im)
    # 画像の左上あたりに画像の番号を記載
    draw.text((10, 100), “No. %03d” % i)
    copy_im.save(copied_image_name % i, quality=100)

できあがりの画像はこちら。(copied_001.png)

無駄コードもありそうですが、ものの数分で500枚の画像が作成できた。さて、検証しなきゃ。。。

Railsでrepcachedを使ってみる

0

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

Railsでセッションの保存先として、memcacheを使用する場合があります。 しかし、memcachedが落ちてしまった場合、サイトにログインできないトラブルが起きてしまうなどの懸念があります。 そこでepcachedを使用してみたいと思います。

 Repcachedとは?

  • memcachedにレプリケーション機能を追加
  • 非同期のレプリケーション
  • マルチマスタのレプリケーションをサポート(バージョン2.0より)

詳細、repcachedのインストール手順は公式サイトを参照してください。

http://lab.klab.org/wiki/Repcached

 Railsで使えるようにする

Railsのアプリケーションでrepcachedを使用するためには、memcachedクライアントのインストールとアプリケーション側の設定が必要です。

memcachedクライアントの導入

repachedの大本はmemcachedなのでmemcachedクライアントがそのまま使えます。

gem install memcached-client
gem install system-timer

railsでの設定

ここではセッションの保存先として使用する場合と、

フラグメントキャッシュで使用する場合を例示したいと思います。

※この例では、192.168.1.10と192.168.1.11でrepcachedが立ち上がっており、

この2台でレプリケーションしているとします。(ポートはいずれも11211番を使用)

セッションの保存の場合
ActionController::Base.session = {
  :memcache_server => ['192.168.1.10:11211', '192.168.1.11:11211'],
  :expire_after => 86400,
  :namespace => "app-session-#{ENV['RAILS_ENV']}"
}

ActionController::Base.session_store = :mem_cache_store

フラグメントキャッシュの保存の場合

ActionController::Base.cache_store = [
  :mem_cache_store,
  ['192.168.1.10:11211','192.168.1.11:11211'],
  {
    :namespace => "app-flagment-#{ENV['RAILS_ENV']}"
  }
]

※フラグメントキャッシュの保存にrepcachce(memcache)を使用する場合は、

expire_fragmentの引数に正規表現を取ることができなくなってしまいます。

セッションの場合も、フラグメントキャッシュの設定の場合も、基本的には通常のmemcachedとほぼ同じです。

ポイントはmemcacheのサーバの指定に、レプリケーションしているmemcachedを双方指定することです。

これによって、セッションやフラグメントキャッシュは一旦指定したmemcachedのいずれかに配置されますが、

レプリケーションによって最終的には双方のmemcachedに配置されます。

仮に片方のrepcachedが落ちた場合でも、レプリケーションされているためほとんどのセッションやキャッシュは

失われずにすみます。(※非同期のレプリケーションのため、生成されたばかりにセッションやキャッシュは失われる可能性があります)

落ちた場合も、repcahcedの再起動時にレプリケーション先を指定することによって、

内容の同期が行われ、再びレプリケーションを行うことができます。

DBに格納された絵文字を特定する

0

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

サイト上で絵文字が文字化けしてしまい、DBでSELECTしても意味不明なマークが表示されているだけ・・・。
そんな時のための絵文字特定方法をご紹介します。※かなり力技ですが・・・
今回特定する画像はDocomoの「冷や汗」絵文字。
DBはPostgreSQL、文字コードはUTF-8で作成しています。
まずpsqlで該当のレコードををみてみましょう。

hoge=# select body from entries where id=1;
body
——
 (1 row)

うーんこれではわかりませんね・・・。
そこで、一度該当のレコードがあるテーブルをpg_dumpで出力してみます。

$ pg_dump hoge -t entries > entries.sql
このファイルをlessで出力します。

$ less entries.sql
<U+E722>

これは何か意味のありそうなコードです。(Unicode)
次に以下のサイトで先程の文字列を検索します。

絵文字変換表

上記サイトでUnicodeの欄に該当する絵文字がみつかりました。

最近人気な記事