ホーム ブログ ページ 54

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

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の欄に該当する絵文字がみつかりました。

googleウェブサイトオプティマイザーを使ってみよう

0

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

2009年に公開されてから、画期的なツールと言われながらも、いまだ普及しているとは言えないGoogleの「ウェブサイトオプティマイザー」。
今回は、そのツールの解説をします。
はじめまして。アクセス解析チームのアソウです。
以後よろしくお願いいたします。

近年webサイト最適化の手段として、アクセス解析は欠かせないものとなってきました。
Google Analyticsの台頭でツール導入の敷居は非常に低くなり、いまや個人から大企業まで、多くのwebサイトが、数値を確認しています。

しかし、アクセス解析はあくまでもサイトの現状の確認を行なうものです。
その解析結果をもとに、サイトの改善施策を行なわなければ、本当の意味での効果は表れません。

今回はリニューアルほど大掛かりではないけれど、サイト改善の具体的な方法を解説したいと思います。皆様のお役にたてば幸いです。

■ウェブサイトオプティマイザーを使ってみよう

http://www.google.com/websiteoptimizer/さて、今日は「ウェブサイトオプティマイザー」について解説します。

この「ウェブサイト オプティマイザー」、googleが無料提供している、いわゆるA/Bテストをするためのサービスです。
一個のコンテンツに対し複数のデザイン案を用意しておき、どの案がより効果的かをテストすることができます。

■「A/Bテスト」と「多変量テスト」

テスト方法はふたつ用意されています。
複数のHTMLを用意し、ランダムに表示させる「A/Bテスト」と、一個のHTMLを部分的に変化させる「多変量テスト」です。

今回はより簡単に導入できる「A/Bテスト」の使い方を説明したいと思います。

■1.テストするページを用意する

まず下準備としてテストするページのオリジナルHTMLとテスト用の別バージョンHTMLファイルをそれぞれ用意します。
「A/Bテスト」では、まったく新しくHTMLを用意する必要があるので、テストパターン分のファイルを作成し、webサーバ上にアップしておきましょう。

■2.URLの登録

テストページの準備が整ったら、各ページのURLを登録します。

1.テスト名は任意に分かりやすい名前を入力します。

2.テストするオリジナルページのURLを入力します。

次にオリジナルと比較テストするためのパターンページのURLを入力します。
パターンページは任意に増やすことが可能なため、3パターン4パターンといった複数パターンでのテストも可能です。

3.最後に、コンバージョン用のURLを入力します。
通常コンバージョンページは上記オリジナルページ、テストページから遷移するゴールページのURLとします。

これらURLが実際にインターネット上に公開されているかは、URLを入力すると自動的にチェックしてくれます。問題がないようであれば「続行」をクリックして、進みます。

■3.JavaScript埋め込み

ここからは、実際にHTMLを編集してサーバ上にアップロードする作業です。

今回は自分でトラッキングコードを埋め込んでいきます。

オリジナルページのHTMLファイルには直後に「制御スクリプト」と、直前にそれぞれ「トラッキングスクリプト」を埋め込みます。

パターンページ、コンバージョンページにも、直前にそれぞれのスクリプトを埋め込みます。
パターンを増やせば増やすほど、埋め込むトラッキングスクリプトも増えます。

すべてのスクリプトをファイルに埋め込み、webサーバーにファイルをアップロードした後、検証してエラーがなければ準備は完了です。

■4.テスト開始

確認画面で、オリジナル、パターン1、コンバージョンページの一覧が表示されるので、プレビューなどでパターン表示などに間違いないことを確認したら、「テストを開始」。
これで準備はすべて完了です。

あとは数時間後にレポートが上がってくるのを待つだけです。

■5.レポートを見る

レポートでは「予測コンバージョン率」やオリジナルの掲載成果を上回る可能性など、各指標が見られます。
また、CSV形式などのダウンロードも可能となっています。

■最後に

このウェブサイトオプティマイザーを使いこなし、テストから効果的なレイアウトや文言を導き出して、一気にコンバージョンアップ。なんてことも夢ではないかもしれません。

webサイトに変更を加えるということは、作業工数がかかり、しかも逆効果になる可能性もあるなど、何かとリスクが付きまといます。
オプティマイザーは、そのリスク回避を“テスト”というカタチで可視化し、より有効な施策を見つけ出す手助けとなります。

「リニューアルしたいけど、やっぱり不安…」そんな方にオススメのツールです。

■AppiritsのGoogle アナリティクスセミナー

AppiritsのGoogle アナリティクスセミナーは、初期設定から機能解説、仕組の理解までさまざまな内容を用意しています。
ご興味のある方は是非弊社セミナーにご参加ください。

Google アナリティクス セミナー インターフェイス編
Google アナリティクスのレポート画面が把握できていない方向けの講座。
レポート画面の解説や既存機能の活用法、マルチチャネルなどの新レポートのインターフェイスを解説します。

Google アナリティクス セミナー 分析手法編
インターフェイスは把握しているが、数値の意味や考え方がよく分からないという方向けの講座です。 アクセス解析を用いた課題抽出やサイト改善の考え方を解説します。

Google アナリティクス セミナー 徹底設定編
現状のGoogle アナリティクスで取得可能な数値に物足りない方向けの講座。
外部サイトへの誘導やソーシャルボタン連携、eコマース機能などのカスタマイズ方法をレクチャーします。

KBMJ、ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表

0

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


宣伝です!!

ECサイト構築パッケージ「エレコマ」に 多店舗対応機能を付け加えた「エレコマ 2.0」を発表しました。

 ◆概要

エレコマロゴECサイトを構築する際に必要となるのがECパッケージです。しかし、世の中にはECパッケージは多く存在していて、何を選べば良いかが分かりません。昨年の2009年12月に公開した「エレコマ」は、日本初Ruby on Railsを利用したECサイト構築パッケージで、MITライセンスにて提供しているのでパッケージ費用が不要です。公開して5カ月が経ち、1000件近いダウンロードがありますが、今回ECモールサイトやブランドを複数お持ちの方でも利用できるよう多店舗対応機能を含んだ「エレコマ2.0」を2010年 5月10日に発表いたしました。

従来、複数ブランドをお持ち方がECサイトを構築する場合、ブランド毎のECサイトを複数立ち上げるか、多大なコストを支払ってカスタマイズするかの2パターンでした。「エレコマ2.0」は、ECサイトの中に複数の店舗を登録できるよう多店舗対応機能を含んでいます。

また、細かなバージョンアップ情報は、「エレコマ」紹介サイト(http://ec.kbmj.com/)にも掲載されますし、技術者ブログ「DoRuby」(http://doruby.kbmj.com)でも掲載させて頂いております。Twitterのハッシュタグ(#elecoma)でも情報公開中です。

※Twitterは、Twitter, Inc.の登録商標です

◆追加されたまたは変更された機能

ユーザ側

・ 商品情報に店舗名を付加

・ 店舗ごとの商品一覧表示

・ 請求の分離及び画面遷移の変更

・ 店舗ごとの情報ページの追加

管理側画面(マスターショップ)

・ 販売元編集の画面を追加

・ 管理ユーザに販売元を紐づけ

管理側画面(販売元)

・ 商品管理

・ 受注集計

・ 顧客情報

・ 受注管理

・ 在庫管理

・ 返品処理

・ 基本情報(販売元編集、メンバー管理、発送設定)のみ閲覧、変更可能。

管理側制御

・ 基本的に管理しているショップの情報以外編集不可

・ カテゴリはマスターショップで管理する

◆ECサイト構築には

ECサイトを構築する際には、まず開発ベンダーの選定が重要です。エレコマは、Ruby on Railsが利用できる開発ベンダーであれば、カスタマイズは可能です。KBMJもその開発ベンダーの中の一つでECサイトの構築やSNSパッケージ(コミュニティーサイト構築パッケージ)を合わせたソーシャルコマースの構築まで承ります。

◆多店舗対応機能とは

ECサイトの中に複数の店舗を登録でき、管理画面から各店舗が受注、商品、顧客などの情報を管理する機能です。

◆関連URL

MITライセンスのECパッケージ『エレコマ』 http://ec.kbmj.com

SEO外部対策への見直しが始まった今こそ、『SEO内部対策サービス』http://seo.kbmj.com/

構築前後のサイトの評価、課題点の洗い出しに『アクセス解析コンサルティングサービス』 http://ga.kbmj.com/

販売戦略に合わせた検索結果の最適化が行える『Advantage Search』  http://search.kbmj.com/

◆本件に関するお問合せ

株式会社ケイビーエムジェイ ITコンサルティング部

青木・鈴木

〒150-0021 東京都渋谷区恵比寿西2-20-3 代官山CAビル1F

TEL:03-6696-1207 FAX:03-6696-1245 Email:info@kbmj.com

rails の action_cache (アクションキャッシュ)を使う、その二。

0

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

M.T. です。だいぶ開いてしまいましたが、
rails の action_cache について、続きを書きます。
前回のエントリはこちら

action_cache の仕組み

前回のエントリでは rails 組み込みのキャッシュ機能についてざっと書きました。
今回は、その中から action_cache に的を絞って書いてみます。

実際に、コードを例にして見てみましょう。

# コードはこんな感じ
SampleController < ApplicationController
  caches_action :index

  def index
    @sample = Sample.find(:all)
  end
end

サンプルモデルから全件を取得して表示するだけのコントローラです。
action_cache の宣言は、cache_action :メソッド名で、指定されたメソッドが対象となります。
引数にメソッド名を指定しない場合、クラス内の全 public メソッドが対象となります。

おさらいすると、action_cache は around_filter として実装されているため、
上記のコードは、以下のような挙動になります。

キャッシュがなかった場合

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合

  1. キャッシュの存在チェック
  2. キャッシュを表示

注目したいのは、キャッシュがあった場合の処理です。
action_cache では、キャッシュがあった場合、キャッシュを生成するためのafter フィルタを実行しません。
もっと言うと、action_cache の before フィルタより順番が後になっている、
そのとき設定されているすべてのフィルタの実行を行いません。

以下のようなコードがあるとします。

# コードはこんな感じ
# jpmobile はインストール済みで使えるようになっていると仮定
SampleController < ApplicationController
  caches_action :index
  before_filter :mobile_required

  def index
    @sample = Sample.find(:all)
  end

  private
  def mobile_required
    unless request.mobile?
      raise "pc access"
    end
  end
end

携帯からのアクセスでなかった場合、例外が発生するコード…のように見えますが、 実際には以下のような挙動になります。

キャッシュがなかった場合、携帯からアクセス

  1. キャッシュの存在チェック
  2. index アクションを実行
  3. キャッシュの生成

キャッシュがあった場合、PCからアクセス

  1. キャッシュの存在チェック
  2. キャッシュを表示

上記のように、先に携帯でキャッシュができていた場合、action_cache の before より 後に設定されている before_filter で呼ばれる mobile_required メソッドは実行されません。

before_filter :mobile_required
caches_action :index

上記のように、順番が逆になっていれば、先に mobile_required メソッドが実行され、
キャッシュがあろうとなかろうと、PC ではアクセスができなくなります。

jpmobile を利用して携帯に対応している場合かつ action_cache を使う場合、
jpmobile も around_filter で様々な処理を行っているため、このあたりの順番が
重要になってきます。

実際に組み合わせて使う方法は、また次回ということで…
だらだらと長いエントリーですが、よかったらお付き合いくださいー。

スタイルシートの小ネタ〜idとclassの合わせ技で指定する〜

0

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

スタイルシートを適用するのにidやclassを使いますよね。今回はその使い方の中から、たまに役立つ小ネタを紹介します。スタイルシートでidやclassを指定するとき、

#hogehoge

.hogehoge

という書き方をするのはご存知の通りで、

#hogehoge .hoge

という書き方(子孫セレクタ)も普段からよく使います。

さらに実際サイトを作っているとidとclassが同じdivに指定されることもよくあります。

こんなカンジ。

ここまではよく見るコードなんですが、さらにAjaxが絡んでくるとややこしくなってきます。

例えば

・タブメニューの背景をそれぞれidで指定している

・タブを切り替えたらリロードなしでメニューの背景もいれかわる

よくある動きです。

こんなときは#hogehogeでかつ.hoge_onの時、または.hoge_offの時という指定をします。

#hogehoge.hoge_on { background-color: #ff0000; }

#hogehoge.hoge_off { background-color: #0000ff; }

子孫セレクタに良く似てますが、idとclassの間にスペースはありません。

この書き方だと

この時は背景が赤

この時は背景が青

とclassが切り替わるだけで背景を出し分ける事ができます。

実際このくらいは子孫セレクタを使えば何とかなることが多いんですが、

Ajaxのライブラリを使ったり、プログラムでアレコレしていると

子孫セレクタだけではなんともならないことがあるので、

そんなときにはこの書き方(ちょっと調べたんですが呼び名が特に見つかりませんでした…)で対処できます。

手書きで検索できるシンプルな筆順辞典「常用漢字筆順辞典」

0

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


皆さん漢字は得意ですか?
今回紹介するアプリは、常用漢字筆順事典。350円です。

最近はパソコンやケータイの普及で、漢字が苦手な人が増えてきていると言われていますね。
筆者もご多分に漏れず漢字がとても苦手です。
ミーティング中ホワイトボードに書き込もうとして手が止まってしまうこともしばしば……
ということで、シンプルな筆順辞典アプリをご紹介します。


起動するとすぐに手書き検索用のキャンパスが開きます。シンプルですね。
調べたい漢字を手書きで入力します。


候補リストが現れるので目的の漢字を選択。


なぞって筆順を確認することができます。


あーこれ 「ふな」って読むのか。ふななー。

手書き認識の精度はかなり高く、一部記憶が曖昧な漢字であっても
適当に書いてみると候補リストに出てきたりします。


「挨拶」って、何回書いても覚えられないよね。

その他、普通に画数や読み、漢字そのもので検索することも可能。

現時点では用例は少なめ、筆順データが無い漢字も割とある
というところが少々イマイチですが
頻繁にデータ追加バージョンアップが行われているようなので
これはその内解消されるかもしれません。
ちなみに、筆順データが無い漢字については筆順の確認は出来ませんが
読みや部首名を調べることは可能です。
また熟語で検索することはできません。

全体としてシンプルな使い勝手にこだわりを感じました。
350 円という価格も辞書系アプリとしてはかなり安価なので
シンプルな漢字辞書を探している方にはオススメです。

常用漢字筆順辞典


えっ「必」ってその点から書くの!?

QRコードをベクター化する方法

0

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

QRコードを作ったはいいものの、印刷物に載せるには解像度が足りない!
そんな時にQRコードをベクター化して、サイズの大きい印刷物にも使用できるようにする方法をご紹介します。

用意するもの
・ベクター化したいQRコード
・Photoshop
・Illustrator

QRコードの画像は、QRコード作成のできるサイトがいくつもありますので、
それらを利用するなどして用意してください。

それでは早速作ってみましょう。
まずは用意したQRコードをPhotoshopで開きます。
今回はこのQRコードをベクター化します。
QRコード

「選択範囲」→「色域指定」で黒い部分のみ選択されるように調整します。
黒い部分のみ選択できましたら、パスウィンドウの下の方にある
「選択範囲から作業用パスを作成」(下図の部分)をAltキーを押しながらクリックします。
選択範囲をパスに変換

許容値を入力するウィンドウが出てきますので、「0.5」と入力してOKを押します。
すると、下図のように見事選択範囲がそのままパスになります!
パスになりました
後はこれをパス選択ツールで全て選択して、Illustratorへコピペして色をつければ完成です。

ちなみに許容値は0.5~10の値で入力することができ、
数値が小さいほど詳細に、数値が大きいほどアバウトにパスへと変換することができます。
これは他の用途にも応用できますので、是非覚えておいてください。

ちなみに・・・
意外と知られていなかったりしますが、「QRコード」という単語を使用した際は
「QRコードは(株)デンソーウェーブの登録商標です」という登録商標文を記載しなければなりません。
掲載したくないorスペースがない場合は「二次元バーコード」、「二次元コード」などの言い換えを使用しましょう。

QRコードは(株)デンソーウェーブの登録商標です

Dockを多段ランチャーにする

0

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

こんにちは、たろちゃんです。Mac OSXではなかなか良い多段ランチャーに出合ったことがありません。なので、いっその事Dockを多段ランチャーにしてみました。

みなさんはMac OSXでランチャーは何を使っているでしょうか?僕は普段はQuick Silverを使っています。このランチャーはキーボードのみでさくっとアプリケーションを開いたりタスクを実行したりできるため、非常に便利です。

しかしながら、Quick Silverでも欠点があります。それはアプリケーション名を覚えていないと使いづらいという点です。アプリケーションの名称を駆使するため、どうしてもこういう状況になってしまいます。

僕自身はWindowsを使っている場合はキーボードタイプのランチャーの他に、CLaunchというソフトを併用しています。このソフトはいわゆるボタン型のランチャーで、アプリケーションをカテゴリごとに分けられるので非常に便利です。

そこで、この手のソフトを探してみたのですが、そもそもDockがあるので需要がないのか、ほとんど見つかりません。見つかったとしてもSnow Leopard対応されていないもののようなので、あまり使いたくはありません。なので、Dockに一工夫をしてボタン型のランチャーっぽいものを作ってみました。

まず初めにアプリケーションのエイリアスを格納するためのフォルダを作成します。今回は以下のようにフォルダを作成しました。

  • $HOME/ショートカット/ユーティリティ
  • $HOME/ショートカット/ネットワーク
  • $HOME/ショートカット/画像系

そして、アプリケーションフォルダにあるアプリケーションをFinderで選択してメニューから「エイリアスを作成」もしくはCommand + Lを選択してエイリアスを作成します。

作成したエイリアスは先程作成したフォルダの中にコピーをして、ファイル名で「 のエイリアス」を削除します。

あとは、これはおまけになりますが、フォルダのアイコンを変更しておきます。まずは変更先のアイコンをアプリケーションのプレビューを使って表示をして、Command + Aで選択した上で Command + C でコピーをします。そして、Finderでフォルダを選択して、メニューから「情報を見る」もしくは Command + I を選択して情報のWindowを表示し、左上のアイコンを選択した状態で Command + V を押して画像を貼りつけます(図1参照)。アイコンの変更方法の詳しいやり方はAppleのドキュメントを参考にしてください。なお、フリーのアイコンはdeviantArtなどで探すと良いでしょう。

これで準備が完了しました。あとはフォルダごとDockのTime Machineの箇所から下の方へドラッグをします。するとフォルダがDockに登録されます。

しかしながら、これだけだとフォルダのアイコンではなく、中身のアイコンが表示されてしまいます。そこでDockのフォルダを選択して右クリックを押し、表示形式でフォルダを選択します(図2)。

これで作業は完了です。どのようになったのか見てみましょう。

まず、Dockが下にあるパターンです。下の図の場合は内容の表示形式でファンを選んだ時の表示です。さっとアイコンが並ぶので結構かっこよいと思います。

次はDockを左に置いたパターンです。この場合は内容の表示形式でファンが選べません。下の図は内容の表示形式がグリッドを選んだ時の表示です。

このように簡単な作業でランチャーを作成する事ができました。標準的なしくみを使っているので、メジャーバージョンが上がっても同じテクニックが使えると思います。

git-svnによる実プロジェクトでのチーム開発

0

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

こんにちは、SHIMADAです。Gitネタはたろちゃんに先を越されてしまいましたが、自分の環境でも、実際のプロジェクトでGitを実用的に使える状況になってきたので、そのへんについて書こうと思います。

 前提

前提条件として、

1. プロジェクトのためのsvnリポジトリがサーバーに用意されていること

2. リポジトリが

PROJECT_NAME/
 `- trunk/
 `- branches/
 `- tags/

というSubversionの標準的なディレクトリ構成となっていること

3. ローカルに最新のgitがインストールされていること

が条件となります。

前者が揃っていないという人は、まずSubversionを導入できるように社内での推進をがんばってください。

申請書とUSBメモリがないとコミットできないんだよ……、という人は、残念ながらあきらめてください。

(あれはネタだと信じていますが……)

後者が揃っていない人は、がんばってググってインストールして下さい。

 下ごしらえ

さて、条件が揃ったところで、下ごしらえです。

まずローカルで、gitの設定をしましょう。

$ git config --global user.name "your name"
$ git config --global user.email account@example.com
$ git config --global color.ui auto
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch

git config だと カレントワーキングツリーの .git/config に書き込まれます。

  • global オプションをつけると、 ~/.gitconfig に書き込まれます。

このへんは適宜使い分けてください。

あと、 ~/.gitconfig をエディタで開いて直接編集してもいいと思います。

 リポジトリのClone

次に、プロジェクトのリポジトリからローカルのgitリポジトリにcloneしてきます。

git svn clone -s --prefix svn/ [svnリポジトリのURL] [作成したいGitリポジトリのPATH]

svnリポジトリのURLは、/trunk をつけないプロジェクトのルートまでを書くのが注意点です。

git svn の -s オプションが、自動的に trunk と branch を見分けて git のリポジトリにとりこんでくれます。

名前がないと説明に不便なので、リポジトリの名前を仮に決めておきたいと思います。プロジェクトのリポジトリURLhttps://example.com/svn/repos/myproj/ローカルのリポジトリPATH/home/me/src/myproj-git/

この場合、上記のコマンドはこうなります。

$ git svn clone -s --prefix svn/ https://example.com/svn/repos/myproj/ ~/src/myproj-git

これで、 myproj のgitリポジトリが myproj-git/ に作成されました。

内容を見てみましょう。

$ cd ~/src/myproj-git
$ find .
$ git br -a
$ git svn info

find すると、ローカルのファイルシステムになにがあるか一覧できます。

うまくいっていれば、チェックアウトされたワークツリーと、.git/ 以下のローカルリポジトリが見えるはずです。

git br -a は、リポジトリに含まれるブランチを一覧できます。

git clone に –prefix svn/ をつけたので、リモートブランチは remotes/svn/hogehoge という風に見えているはずです。

git svn info で、カレントのローカルブランチがsvn上のどのブランチに対応しているかが分かります。

clone直後はローカルブランチはmasterのはずです。これが、svn/trunkに対応していない場合は、masterを作り直してみてください。

手順は、

  1. リモートのtrunkに対応したブランチを仮の名前で作成してそこに移動する
  2. 現在のmasterブランチを削除
  3. 仮の名前をmasterにリネーム

です。具体的なコマンドは、下記のようになります。

$ git co -b master2 remotes/svn/trunk
$ git br -D master
$ git br -m master2 master
$ git co master

(この項目の情報源はこちら

全部ローカルでの作業なので、上流のsvnリポジトリには一切影響が出ません。

うまくいかなくても怖がらずに、何度でも繰り返して試せるので安心してやってみてください。

 作業用ブランチの作成

さて、これでプロジェクトのsvnリポジトリの完全なクローンが、手元にgitリポジトリとして作成されました。

もし、自分の割り当てられているタスクにsvnのブランチが割り当てられているなら、まずそちらに移動しましょう。

仮にブランチ名が ver02 だったとすると、手順はこうなります。

$ git co -b ver02 remotes/svn/ver02

このコマンドでやったことは、

https://example.com/svn/repos/myproj/branches/ver02 にあるブランチを元にしたローカルブランチ ver02 を作成してワーキングツリーにチェックアウト

です。

git svn dcommit は、デフォルトの動作としてローカルブランチと同じ名前のリモートブランチにコミットしに行きます。

ブランチ名 ver02 を合わせるのは、自分の分かりやすさと同時にgit-svnのためでもあります。

 開発環境の準備

つぎにやることは開発開発の整備です。

まず、必要なgemやライブラリをそろえた後、チェックアウトしたワークツリーで開発ができる状態になるまでコードや設定ファイルを修正することになるでしょう。

Railsならdatabase.ymlやenvironment.rbの修正などです。

いろいろ環境を設定して、script/serverが動くようになったら、ワークツリーがどうなっているか確認してみましょう。

$ git st

いろいろ表示が出てきたと思います。

既存の変更したファイルは

# Changed but not updated:

というセクションに、新しく作成したファイルは

# Untracked files:

というセクションに表示されます。

 開発

開発をはじめましょう。

新しいコードを書き始める前に、まずブランチをきってそちらに移ります。

$ git co -b new_feature

すると、

M  ファイル名

というなにか見慣れた表示が出てくると思います。

これは、git st で

# Changed but not updated:

に表示されていたファイルです。

ワーキングツリー上では変更されているけど、リポジトリにはまだ反映されていないという状態です。

そのまま開発を続けて、一段落ついたらコミットします。

まず git st してみましょう。

# Changed but not updated:
# Untracked files:

両方のセクションに、自分がコードを書いたファイルが表示されています。

まず、Untracked files: の中にある、コミットすべきファイルをgitに教えてあげましょう。

$ git add ファイル名

次に、

$ git diff

として、自分の作業を思い返しながら変更点を見返していきます。

ここで思わぬ見落としや、作業の抜け、ミススペルなどを見つけることができます。

この「作業の振り返り」はなかなかあなどれないものがありますので、忘れずにやっておきましょう。

間違いを見つけたらすぐに diff を抜けてエディタを起動し、直してまた git diff に戻ります。

出てきたファイルごとに、これで大丈夫という状態になったら、

$ git add ファイル名

します。addされたファイルは、

# Changes to be committed:

というセクションに表示されます。また、addすると次から git diff には現れません。

git diff して確認 → OKならgit addというサイクルでひとつづつ片付けていくのがおすすめです。

あと、environment.rb など、リポジトリに変更をコミットしたくないファイルもありますね。

これは、git addをしないで

# Changed but not updated:

に置いたままの状態にします。

ここが、svnなどの普通のバージョン管理システムと違うgitの大きなメリットのひとつです。

すべての必要なファイルを git add したら、ローカルの new_feature ブランチにコミットしましょう。

$ git ci -m 'コミットメッセージ'

ここで記入するコミットメッセージは、特別なことをしない限りsvnのりビジョンログにそのまま送信されますから、

開発チームのルールに沿ったメッセージを書くようにしてください。

 作業ブランチからのマージと上流へのコミット

new_featureの作業が一通り終わってうまく動いているようなら、ver02ブランチに作業内容をフィードバックしましょう。

$ git co ver02
$ git merge new_feature

マージが終わったら、ver02 に new_feature で行った作業が反映されているはずです。

テストも通って、チームのコミット基準に達しているようなら、リモートのsvnリポジトリにコミットしましょう。

まず、

# Changed but not updated:

にあるファイルをワーキングツリーから片付けないといけません。

$ git stash

これで、stashと呼ばれるリポジトリ内の格納場所に、これらのファイルの変更が保存されました。

もう一度 git st してみると、ワーキングツリーがきれいになっていることが分かります。

さっきの消えてしまった変更はどこに行ったのか?

$ git stash list

これで表示される場所にあります。元に戻したい場合は、

$ git stash pop

でいつでも戻りますから安心です。

では改めて、コミット作業に戻りましょう。

$ git stash
$ git svn fetch
$ git svn rebase

まず、fetch/rebaseでリモートリポジトリの最新の状態を持ってきます。

ここでコンフリクトなどが起きていたらリポートされますので、 >>>>> ====== <<<<< のようないつものマーカーをみつけて衝突を解消してください。

衝突したファイルは、git上では unmerged な状態になっていますので、解消したら git add して、解消したことをgitに教えてやります。

衝突がすべて解決したら、あらためてコミットします。

$ git svn dcommit

これでうまくいけば、svnリポジトリに今回の作業 new_feature が反映されているはずです。

trac/redmineやほかのsvnクライアントツールなどで、無事反映されているか確認してみて下さい。

うまくいったようなら、また開発に戻るために、さきほどstashに片付けた変更を手元に戻しておきましょう。

$ git stash pop

もし、dcommit しようとしてエラーメッセージが出てしまっても大丈夫です。

作業内容はすべて git の new_feature ブランチに残っていますし、リモートのsvnリポジトリには迷惑がかかっていません。

深呼吸して落ち着いて、エラーメッセージを読んで、ググって、試して…体で git を覚えて行って下さい。

have a nice git hacking!

rufus-scheduler という、ちょっとかわいそうな子

0

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

Webアプリとは、ユーザのリクエストに対してレスポンスを返す

アプリケーションですが、時にユーザのリクエストに関係なく

処理を行いたいシチュエーションが存在します。

そのような場合、通常「バッチ」と呼ばれるコマンドライン上で

動くアプリを作成します。

私は現在、Webアプリの開発にRailsを使っていますが、

Railsでは、下記のようにモデルとメソッドを指定すれば

特にバッチ用の各種インターフェイスを作成せずとも

Webアプリの設定をDRYに使い回して簡単にバッチを作成することができます。

ruby script/runner -e production ‘ModelClass.method(params)’

script/console コマンドと併せて大変重宝しています。

で、上記のようなバッチを「運用者のコマンドライン上での操作」という

人力を介さず、任意のタイミングで実行したいとき、*nix系OSの場合は

一般的にcronがよく使われます。

02 4 * * * rails_batch.sh

さて、ここで本題。

rufus-scheduler という gem  があります。

http://rufus.rubyforge.org/rufus-scheduler/

このgemは、Railsアプリにおいて以下の機能が行えるようになります。

あるモデルのメソッドに対して

・定期実行が可能(○秒/□分間隔)

・cronとしての予約処理が可能

詳しくは上のリンクを見てください。英語が苦手な方でも

Rails & cron がお分かりの方にはすぐに内容がつかめると思います。

さて、この rufus scheduler、従来の cron と比較してどのようなメリット/デメリットがあるでしょうか。

・記述が簡単

 ・Railsにおけるバッチ処理は基本的にモデルで完結するので、このような記法だとscript/runner よりもより簡潔に書ける

・処理が楽

 ・script/runner だと、いちいち、重たいRailsのプロセスを立ち上げるが、rufus-schedulerだと、rufus-schedulerが

 記述されたアプリ(プロセス)と同じpidで走るので立ち上げが軽い

・記述が柔軟

 毎秒/分ごとの処理の記述が、cronやwhile do hoge; sleep SLEEP_TIME; end よりも

 構造的に奇麗に記述できる。

と書くと、なかなか良い子のように思えるのですが、このrufus-scheduler、がっつり欠点もあります。

・つられて落ちる

 起動しているwebアプリが落ちるとき、webとは関係なく走ってほしいバッチ処理が走らなくなる。

・サブプロセスとして動く

 passengerなら問題になりませんが、mongrelで複数のプロセスを走らせているとき、それぞれのプロセスでschedulerが走り

 収集がつかなくなる。

といった具合に、長所が「あったらいいなぁ」というものに対して、欠点が「ゆるさない。絶対にだ」というものなので

どうしても、rufus-schedulerには出番がないわけです。

結構いいアプリだと思うのですがね。

不憫なやつです。

とりあえず自分がこれならいけるかも、と思うものは一つあります。

・クローラ

 あるバッチをバックグラウンドジョブで走らせる。そのバックグラウンドジョブで走らせているアプリの中で

 rufus-schedulerを使った処理を記述し、そのプロセスをkillするまで半永久的に

 ほぼ同じ動作を繰り返す。

例えば、クローラとか、WebAPIを叩く処理(例えばtwitterの最新の状態を反映するblogパーツ)

とかは、この処理を使うとぐっと記述しやすくなるのでしょうか。

以前はよく見かけたのですが、日本語の情報もさっぱり見つかりません。

誰かこの子の活躍の場、思いついた方、共有していただけますとありがたいです。

最近人気な記事