ホーム ブログ ページ 55

rails1.2.6の豆知識

0

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

リダイレクトとreturnについて

初めてrails1.xを使って、下記のfilterにちょっと詰まった。

———————————

before_filter :login_check

before_filter :load_data

def index

:

:

end

def login_check

 if session[:user].blank?

  redirect_to :action=>”index”

  return

 end

end

def load_data

 p “this is test”

end

——————————-

rails2.3の場合、動きは大丈夫ですが、今回は ログインしていない(session[:user] = nil)のに、indexページに遷移できず、 “this is test”が出力されていました。 確認すると、rails1.xの場合、確かに「return false」にしないと、リダイレクトしてくれません。

twitter4rであそぼう

0

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

最近プログラミングとか全然できてないハチネンです。さて、「私はやらない」と思っていた twitter ですが、 気がつけば「なんとなく」使ってしまってます。 少しプログラミングをしたくなったついでに twitter4r を使って遊びたいと思います。 まず、twitter4r をgemからインストールしてください。


% sudo gem install  twitter4r -r
Building native extensions.  This could take a while...
Successfully installed json-1.2.2
Successfully installed twitter4r-0.3.2
2 gems installed
Installing ri documentation for json-1.2.2...
Installing ri documentation for twitter4r-0.3.2...
Installing RDoc documentation for json-1.2.2...
Installing RDoc documentation for twitter4r-0.3.2...

自分のtwitterアカウントのログイン情報、パスワードを書いたYAMLファイルを一つ用意します。


myinfo:
  login: hachinen
  password: mypassword

上記の情報を使ってtwitterを操作してみましょう。感覚だけつかめればいいので、今回はirbから操作します。最初に必要なライブラリを読み込みます。


irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'twitter'
=> true

最初に先ほどのYAMLを使って認証済みのオブジェクトを取得します。


irb(main):008:0> tw = Twitter::Client.from_config('./twit.yml','myinfo')
=> #

このオブジェクトを使ってまずは適当につぶやいてみます。


irb(main):009:0> tw.status(:post, 'おなかへったー(hetter)')
irb(main):011:0> tw.status(:post, 'おなかへったー')

きちんとPostできたでしょうか。ブラウザからも確認してみます。

うまくいったようです次はフォローしているユーザ一覧のスクリーン名を出してみます。


irb(main):012:0> tw.my(:friends).each {|f| puts "スクリーン名 = #{f.screen_name}" }
スクリーン名 = rails
スクリーン名 = slashdotjp
スクリーン名 = DoRuby

簡単ですね。次はタイムラインとかも出してみます。


irb(main):015:0> tw.timeline_for(:me).each {|tl| puts tl }
おなかへったー
おなかへったー(hetter)

ちゃんとでました。他にも http://twitter4r.rubyforge.org/rdoc/ を見てみると色々できるみたいなので、また遊んでみようと思います。

Nagiosでログ監視!

0

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

こんにちは。wryyyです。

ディスク使用率や、Load Average等サーバに関する様々な監視が行える

Nagios

ですが、今回はNagiosでのログ監視について見て行きたいと思います。

まずは NagiosExchangeからcheck_logs.plをダウンロードし、インストールします。

(check_logs.plはperlで実行されるため、要perlです。)

そして、実行権を付けましょう!

これで、ひとまず ログ監視を実行できるようになりました。

さて、実行できたは良いものの

・どのファイルを読むのか

・どのエラーが発生した時に、メールを飛ばすようにするのか

等が設定できていないため、このままでは監視になりません。

ということで、次は「どのファイルを読み」、「どのエラーを拾うか」の設定をしていきます。

まずは、xxx.cfgというログ監視設定ファイルを作成し、/etc/nagios/check_logs/等、適当な場所へ配置します。

以下、設定ファイルの例です。

$seek_file_template='/var/lib/nagios/$log_file.check_log.seek';

# Required log files array
@log_files = (
      {'file_name' => '/var/log/syslog',
        'reg_exp' => '(ERROR|CRIT)',
     # 'lines' => 2,                #optional number of output lines  after match
     #  'new_line_reg_exp' => '^',  #optional new line regex to stop output lines
     #  'seek_file_suffix' => '2'   #optional seek file suffix
},
      {'file_name' => '/var/adm/messages',
       'reg_exp' => '(WARN|ERROR|FATAL)',
},
); 

上記、設定ファイルについて説明していきます。

まず、一番始めにある

$seek_file_template=’/var/tmp/$log_file.check_log.seek’;

これは、seekと呼ばれる、ログファイルを何行目まで読んだかを保存しておくファイルを指定しています。

次に、どのファイルを読むかについてですが、

これは、上部にある’file_name’ =>にて指定ができます。

次に、どのエラーを拾うかについては、

‘reg_exp’ => ‘(ERROR|CRIT)’を見てください。

()内に、拾いたい文言を「|」区切りで記載することにより、

()内に記載されている文言のログを拾う事ができます。

これで、基本的なログ監視の設定は以上です。

ただ、この設定だと拾わなくて良いログまで拾ってしまい、

このエラーは監視しなくて良いだろう!というログまで拾ってしまう可能性があります。

(su に失敗した時のエラーまで拾う必要はあるのか??等)

そこで、拾わなくて良いエラーがある場合は

‘neg_reg_exp’ => ‘()’

と記載することにより、()内に記載されているエラーは拾わないようになります。

以上、簡単ですがNagiosのログ監視設定でした。

監視に不必要なエラーを拾わないようにする設定は情報が少ないため、

参考にしていただけたら幸いです。

rubyでOAuthを使ってみる

0

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

Google, twitter, mixiアプリなどのAPI認可のためのOAuth(オース)という

プロトコルが利用されています。

今回は、マッシュアップなWebサービスを作る上で必要になってくるOAuthの簡単な概念とrubyでの使用例を紹介したいと思います。

 OAuthとは?

デスクトップアプリやwebアプリケーションなどにセキュアなAPI認証の

標準的な手段を提供するオープンプロトコルです。

OAuth利用することによって、ユーザのgoogleアカウント情報(ID,Password)を保持しなくてもgoogleのアドレス帳などを参照するwebサービスを作ることができます。

 OAuthが必要になった背景

OAuthがなかった場合、先程の例のようなgoogleのアドレス帳を参照するサービスを作ろうとした場合、ユーザのgoogleアカウント情報をもとにアクセスすることになります。しかし、googleのアカウントはGmailやgoogleチェックアウトなど様々なサービスに紐づいており、迂闊にこのようなアクセスをすると万一の時のリスクが高くなります。

そもそもこの例では、googleのアドレス帳にさえアクセスできれば十分で、このように限られたリーソスへのアクセスを認証するため、APIへのアクセスを認可する手段が必要となりました。

 OAuthでのAPI認証の流れ

OAuthではトークンのやりとりによって、APIのアクセスの認可を行います。

OAuthではいかの登場人物が登場します。

  • OAuth Service Provider…APIを提供する側(例:twitter, google)
  • OAuth Service Consumer…APIを利用する側(例:twitterクライアント, google API群を利用したサービス)
  • User…ConsumerがProviderが提供するAPIを利用してProviderのサービスにアクセスすることを許可する人(例:twiiterクライアントを使おうとしている人)

それでは、OAuthによるAPIの認証の流れを説明します。

1) ConsumerはProviderにアプリケーションの登録を行い、Consumer KeyとConsumer Secretを取得する。

2) Consumer KeyとConsumer Secretをもとにrequestトークンを取得する

3) 取得したrequestトークンをもとに、ユーザがAPI認可するためのURLを生成する

4) ユーザは生成されたAPI認可のページアクセスし、ConsumerがAPIを利用してProvierにアクセスすること許可(または拒否)する

5) (以下許可されたと仮定)認可されたrequestトークンを元に、access token, access secretを取得する

6) access token, access secrete, consumer keyを元にAPIにアクセスする。

大まかにこんな流れでAPIの認証が行われます。改めてここで重要なのは「ConsumerにはユーザのProviderのアカウント情報がわたっていないことです」

大まかな流れが理解できたところで、実際にOAuthを使ってみたいと思います。今回は題名の通り ruby を使って twitter でのOAuthを試してみたいと思います。

 準備

あらかじめ、twitterのアプリ登録とoauthライブラリをインストールしておきます。rubyのoauthライブラリはgemでインストールできます。

gem install oauth

また、twitterのアクセスの簡単化のため twitterのライブラリもインストールしておきます

gem install twitter

 実際にやってみる

今回は、OAuthの流れをつかみやすくするためirbで試してみました。

require 'rubygems'
require 'oauth'

CONSUMER_KEY = "your-key"
CONSUMER_SECRET = "your-secret" 

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com")

request_token = consumer.get_request_token 
# twitterに対してrequestトークンを要求

request_token.authorize_url # requrest tokenをもとに認証URLを生成

ここで表示されたURLにアクセスし、このrequest tokenを有効にしてください。

irbは止めずにこのままにしてください。

oauth_verifier = "000000" 
# 許可後した後に表示された数字を入力してください

access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier )
# 有効化されたrequest_tokenをもとにaccess token, access secretを取得

access_token = access_token.token
access_secret = access_token.secret

# access_key, access_secret, consumer_key, consumer_secretをもとにAPIにアクセスする
oauth = Twitter::OAuth.new(CONSUMER_KEY, CONSUMER_SECRET)
oauth.authorize_from_access(access_token, access_secret)
twitter_client = Twitter::Base.new(oauth)

# 投稿してみる
twitter_client.update("hogehoge")

ここで、実際に書き込まれたかtwitterに書き込まれたことを確認しましょう。無事書き込まれていたら、OAuthによるAPI認証成功です。

パスフレーズなしでSCP(秘密鍵の場合)

0

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

パスフレーズなしでSCPをする方法としてはssh-agentを使う方法や、 秘密鍵を使う方法がありますが、今回は後者の秘密鍵を使う方法をご紹介します。

まず転送先のサーバで秘密鍵と公開鍵を作成します。
ここでポイントなのが秘密鍵はパスワードなしで作成するということ。
パスワードなしでも秘密鍵自体を盗まれなければ危険はありません。

(転送先での作業)
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hoge/.ssh/id_rsa):
Created directory ‘/home/hoge/.ssh’.
Enter passphrase (empty for no passphrase): (未入力でEnter)
Enter same passphrase again: (未入力でEnter)
Your identification has been saved in /home/hoge/.ssh/id_rsa.
Your public key has been saved in /home/hoge/.ssh/id_rsa.pub.
The key fingerprint is:
6e:f3:a4:af:aa:84:9f:d3:b2:92:84:69:34:10:21:b9 hoge@scp-to

次に作成した公開鍵(id_rsa.pub)を転送元に設定します。
※安全のため、公開鍵を設定するauthorized_keys2のパーミッションは、所有者に対しては read/write を許可し、他のユーザーには、アクセスを許可しないで下さい。

(転送元での作業)
$ vi ~/.ssh/authorized_keys2
### id_rsa.pubの内容をコピペ ###
ssh-rsa ****************************
$ chmod 600 ~/.ssh/authorized_keys2

これでパスフレーズなしでSCPができるはずです。
試してみます。

(転送元での作業)
$ echo “scp test” > /var/tmp/scp-test.txt
$ scp /var/tmp/scp-test.txt hoge@scp-to:/var/tmp
scp-test.txt 100% ****************************| 9 00:00

できました!

rubyでRSSを取得する

0

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

こんにちは。T氏です。

今日はrubyでRSSを取得する方法をご紹介します。

rubyにはRSSを取得するためのクラスが用意されているため、それを使ったサンプル

を作成しました。

クラスは [RUBY_HOME]/rss/**.rb に色々と用意されています。

※rubyは1.8.7 を使っています。

# sample.rb
class Sample
  require 'rss'
  require 'uri'

  attr_accessor :title, :description, :link, :published_at

  def initialize
    @title = nil
    @description = nil
    @link = nil
    @published_at = nil
  end

  def self.get_rss(rss_url)
begin
      ary = []
      unless rss_url.nil?
        rss_results = ""
        url = URI.parse(rss_url).normalize
        open(url) do |http|
          response = http.read
          rss_results = RSS::Parser.parse(response, false)
          rss_results.items.each do |item|
            obj = self.new
            obj.title = item.title
            obj.description = item.description
            obj.link = item.link
            obj.published_at = item.date
            ary << obj
          end
        end
      end
      return ary
    rescue => e
      raise e
    end
  end

end

さて、実際に使ってみましょう。

ここではDoRuby!記事のRSSを取得しています。

$ irb -Ku
irb(main):001:0> require 'pp'
irb(main):002:0> require 'sample'
irb(main):003:0> rss = Sample.get_rss('http://doruby.kbmj.com/t_article/20091118/Rake_/feed')
irb(main):004:0> pp rss
[#   "こんにちは。T氏です。今日は自作のRakeタスクを追加する方法をご紹介します。 ",
  @link="http://doruby.kbmj.com/t_article/20091118/Rake_",
  @published_at=Wed Nov 18 10:00:00 +0900 2009,
  @title="Rakeタスクを追加する">,
 #  @description=
   "こんにちは。T氏です。 最近は、ようやくRailsの開発にも慣れてきました。慣れてくると、
Rails以外のフレームワークも使ってみたいな、なんて思ったりします。 そこで、以前から
気になっていたMerbのインストールから起動までをご紹介したいと思います。 \n",
  @link="http://doruby.kbmj.com/t_article/20090915/Merb_1",
  @published_at=Tue Sep 15 19:00:00 +0900 2009,
  @title="Merbを使ってみる">,
 #  @description=
   "こんにちは。T氏です。\n\n今日はRailsのエラー画面(public/404.htmlや500.html)への遷移は
どうやってされているかをご紹介します。",
  @link="http://doruby.kbmj.com/t_article/20090604/Rails_",
  @published_at=Thu Jun 04 19:47:37 +0900 2009,
  @title="Railsのエラー画面への処理を読む">,
 #  @description=
   "はじめまして!KBMJでエンジニアをやっているT氏です。初投稿の今回は、rakeコマンド
についてご紹介したいと思います。*rakeとは・・・ビルドツール(AntやMake等)のruby##の事    ",
  @link="http://doruby.kbmj.com/t_article/20090317/_rake_1",
  @published_at=Tue Mar 17 18:10:00 +0900 2009,
  @title=
   "Ruby on Railsでrakeコマンドを使って様々なタスクを実行しよう">]
irb(main):005:0> exit

無事に取得出来ましたね。

皆さんも試してみてはいかがでしょうか。

スマイリーメール

0

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

こんにちは。KBMJiの佐藤です。

今回はKBMJiで開発・販売しているiPhone向けのデコメアプリ「スマイリーメール」について紹介します。

スマイリーメール

http://farm5.static.flickr.com/4059/4349758775_654b4d722b_o.png
http://farm3.static.flickr.com/2614/4349758845_0984a8335e_o.png

スマイリーメールは、iPhone用のデコメアプリです。

スマイリーメールを使えば、iPhoneでデコメが使えるようになります。

アプリをインストールしたら、メールアドレスの設定を行います。

http://farm3.static.flickr.com/2724/4350505138_63621f151f_o.png

@i.softbank.jp で終わるメールアドレスからメールを送信する場合は、ここで「はい」ボタンをタップします。

http://farm3.static.flickr.com/2708/4350505192_9c3b114530_o.png

「SMTPサーバの設定」画面が表示されますので、ユーザ名とパスワードを入力します。

先ほどの「@i.softbank.jpで終わるメールアドレスから送信しますか?」とに対して「いいえ」ボタンをタップすると、

http://farm3.static.flickr.com/2801/4349759017_367afef946_o.png

「使用したいメールアドレスのSMTPサーバの情報が分かりますか?」と聞かれます。ここで「はい」ボタンをタップすると、

http://farm5.static.flickr.com/4002/4350505314_36cd1c4895_o.png

「SMTPサーバの設定」画面が表示されますので、メールアドレス・ホスト名・ユーザ名・パスワード・SSLを使用・サーバポートの入力を行い、「完了」ボタンをタップします。

先ほどの「使用したいメールアドレスのSMTPサーバの情報が分かりますか?」に対して「いいえ」ボタンをタップすると、

「メール送信」ボタンと「メールアドレス入力」ボタンが表示されます。

http://farm3.static.flickr.com/2487/4349759111_2f8e510429_o.png

ここで「メール送信」ボタンをタップすると、

空メールを送信することによってメールアドレスを登録することができます。

「メールアドレス入力」ボタンをタップすると、メールアドレスを手入力することによって登録することができます。

http://farm5.static.flickr.com/4025/4350505414_09e516707d_o.png

SMTP以外の方法でメールアドレスを登録すると、登録したアドレスに登録確認メールが届きますので、そのメール内に記載されている登録URLをタップして、本登録を行います。

http://farm3.static.flickr.com/2770/4349759227_9d5d73cdab_o.png

この画面がでれば登録完了!!

さっそくアプリを起動してください。

http://farm3.static.flickr.com/2704/4350505514_ef0e73d1d6_o.png

では、新規作成を選んで

http://farm5.static.flickr.com/4064/4350505566_c9cc8203f4_o.png

宛先をアドレス帳から選ぶ場合は[+]ボタンをタップ。

さていよいよ本文の編集です。本文の部分をタップすると

http://farm5.static.flickr.com/4041/4350505624_c5433edc0b_o.png

左から「文字の色変更」「文字の大きさ変更」「線を引く」「左・中・右寄せ」「アイコン・バナー画像選択」「背景色変更」「往復・スクロール」のアイコンが並んでいます。

アイコン・バナーは今後どんどん増やす予定なので、お楽しみに。

http://farm5.static.flickr.com/4009/4350505656_18af27eb85_o.png
http://farm5.static.flickr.com/4063/4349759405_1baea0499a_o.png
http://farm5.static.flickr.com/4020/4349759471_360f20b774_o.png
http://farm5.static.flickr.com/4039/4350505800_2ac830c731_o.png

さて色とりどりのメールができたら送ってみましょう。

http://farm5.static.flickr.com/4066/4349759569_0b9c0bc775_o.png
http://farm5.static.flickr.com/4008/4349759617_483266181b_o.png

ここで注意!相手に迷惑メールなどのフィルタで届かないことを防ぐ為に例えばあなたが@i.softbank.jpのアドレスを使っていたら相手に必ずドメイン指定受信の設定をしてもらってくださいね。

そうしないと届かないことがあります。サーバーを介してデコメを送っているので迷惑メールと間違えられる恐れがあるのです。。。

http://farm3.static.flickr.com/2449/4349759659_f936bc5fe4_o.png

署名などははじめからテンプレートにしてもよいかもですね。

http://farm5.static.flickr.com/4013/4350506016_9ae0da33f6_o.png

本文を編集中にテンプレートとして保存を押せばテンプレートとして保存できます。

署名はテンプレートにすることをオススメします!

http://farm5.static.flickr.com/4046/4350506062_8ba68d97ee_o.png

ここまで読んでくれた人に、裏技をこっそり教えます。

設定の項目に「日本国内モード」なるものがありますが、基本的に日本国内の方はオンにして欲しいのですが、オフにすると裏技が使えます。

送り先がiPhoneなどのスマートフォンかパソコンへのメールに限られますが【文字の大きさが12段階、画像の大きさも12段階に変更可能】にまずなります。

あとさらにiPhoneとパソコンに送る場合はフォントも4種類変えられます。

このあたりの機能は日本のデコメの仕様にはないので普通の日本の携帯には送れません。

http://farm3.static.flickr.com/2680/4350506152_51f03d0772_o.png
http://farm3.static.flickr.com/2794/4350506196_e7f906c3e1_o.png

どうですか?表現力が一段と増したと思いませんか?

友達に送って驚かせましょう!

http://farm3.static.flickr.com/2791/4349759967_3309ca4cfc_o.png
http://farm3.static.flickr.com/2487/4350506280_a8993008aa_o.png

まだまだいろいろと不明点や不満点があるかと思います。

質問や改善要望を support@kbmji.comまで、お気軽にお送りください。よろしくお願いします!

mod_jkを使ってtomcatとapacheの連携

0

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

tomcat-connector(mod_jk)を使用してみる
mod_jkとはTomcatとApache間の通信を処理するモジュールです。
色々設定方法はあるのですが今回は最も簡単な設定を行いapacehとtomcatの連携をしたいと思います。

環境は centos5.3 apacheはyumからインストールしました。

1: tomcatの起動

# cd /usr/local/src
# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-5/v5.5.28/bin/apache-tomcat-5.5.28.tar.gz
# cd 任意の場所
# gunzip -c apache-tomcat-5.5.28.tar.gz | tar xvf –
# chown 起動ユーザ apache-tomcat-5.5.28
起動ユーザ% cd apache-tomcat-5.5.2/tomcat/bin
起動ユーザ% ./startup.sh

確認
http://localhost:8080/ tomcatの画面が表示されることを確認する


2:mod_jkのインストール


# cd /usr/local/src/
# wget http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.28/tomcat-connectors-1.2.28-src.tar.gz
# gunzip -c tomcat-connectors-1.2.28-src.tar.gz |tar xvf –
# cd tomcat-connectors-1.2.28-src/native/
# ./configure –with-apxs=/usr/sbin/apxs
# make
# make install

すると下記のライブラリがインストールされます
/etc/httpd/modules/mod_jk.so


3:apacheの設定を行う

# cd /etc/httpd/conf
# vi httpd.conf

 LoadModule jk_module modules/mod_jk.so ライブラリを読み込む設定を追加

(同じようにライブラリを読み込みこんでいる設定があるので同じ場所に追加)

mod_jkの設定ファイルを読み込むための設定を追加(一番したなどでよい)

 Include /etc/httpd/conf/jk.conf 


# touch jk.conf
# vi jk.conf

 JkWorkersFile /etc/httpd/conf/workers.properties
 JkLogFile     /etc/httpd/logs/mod_jk.log   
 JkLogLevel    info
 JkShmFile     /var/run/apache2/jk-runtime-status
 JkMount /* jk


# touch workers.properties
# vi workers.properties

worker.list=jk
worker.jk.type=ajp13
worker.jk.host=localhost
worker.jk.port=8009
worker.jk.socket_timeout=5
worker.jk.connect_timeout=1000
worker.jk.prepost_timeout=1000

設定の説明
typeはapacheとtomcatの通信間のプロトコルを指します
portはtomcatの待ち受けportです 8009はtomcatのデフォルトの設定です

4:apache2の再起動と確認

# /etc/init.d/httpd restart

確認
http://localhost で上記tomcat起動で確認した

画面が表示されればOK

Grails(2)サンプルWEBアプリ作成~起動まで

0

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

次にサンプルWEBアプリを作成してみます。
(1)grails create-app test
 ※実行したディレクトリ内にtestディレクトリが作成されます。

(2)testディレクトリに移動します。

(3)grails run-app
 実行後、「Server running. Browse to http://localhost:8080/test」というのが表示されます。

(4)http://localhost:8080/test にブラウザからアクセスして下さい。
 ⇒Welcome to Grailsという画面が表示されれば成功です。
 ※「ctrl+C」で終了できます。

次回に続く・・・・。

Linuxの基本 ~コマンド編1~

0

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

こんにちは。エンジニア初心者のlietoです。

Linuxの基本的なコマンドの使い方についてまとめていきたいと思います。

今回は、「viコマンド」についてです。

viコマンド

 Linuxでテキストファイルを加工・編集するためのコマンドです。

【viの起動】

vi ファイル名

【文字の入力】

起動直後のviは、vi専用のコマンドを受け付けるコマンドモードという状態になっています。

文字入力を行うには、文字を入力するためのコマンドを使用します。

●文字入力の基本コマンド

 ・「i」:カーソルがある位置の左側から文字入力

 ・「a」:カーソルがある位置の右側から文字入力

●カーソルを移動しながら文字入力モードに移行する

 ・「I」:カーソルがある行の先頭から文字入力

 ・「A」:カーソルがある行の末尾から文字入力

●空行の挿入を行って文字入力モードに移行する

 ・「o」:カーソルがある行の次の行に空行を挿入し、その行の先頭から文字入力

 ・「O」:カーソルがある行に空行を挿入し、その行の先頭から文字入力

【カーソルの移動】

 ・「h」「←」:左へ移動

 ・「j」「↓」:下へ移動

 ・「k」「↑」:上へ移動

 ・「l」「→」:右へ移動

【ファイルの保存とviの終了】

●データの保存

 ・「:」「w」:上書き保存

 ・「:」「w」ファイル名:ファイル名をつけて保存

●viの終了

 ・「:」「q」:終了

 ・「:」「q」「!」:強制的に終了

 ・「:」「w」「q」または「Z」「Z」:保存して終了

【カット・コピー・ペースト】

●カット

 ・「x」:一文字カット

 ・「d」「d」:一行カット

●コピー

 ・「y」「y」:一行コピー

●ペースト

 ・「p」:カーソル位置のあとにペースト

 ・「P」:カーソル位置にペースト

【取り消しと繰り返し】

●取り消し

 ・「u」:直前の操作を取り消す(直前の状態に戻る)

●繰り返し

 ・「.」:直前の操作を繰り返す

【文字列の検索】

 ・「/」検索パターン:カーソル位置からファイルの末尾に向かって検索

 ・「?」検索パターン:カーソル位置からファイルの先頭に向かって検索

 ・「n」:次の検索結果へ進む

 ・「N」:前の検索結果へ進む

【文字列の置換】

 : 置換対象の行範囲 s/ 検索パターン / 置換文字列 / [オプション]

●置換対象の行範囲

 置換をする行は、「m行目からn行目」という範囲で指定しいます。

 実際には、「m,n」の形で記述します。

 例えば、「9行目から20行目」の場合、「9,20」となります。

 また、以下のような表現も利用できます。

 ・「.」:カーソルが存在する行

 ・「$」:最終行

 ・「%」:すべての行

●検索パターン

 基本正規表現を利用して検索できます。

●置換文字列

 置換したい文字列を記述します。

●オプション

 ・「c」:置換操作を実行する前に確認する

 ・「i」:大文字と小文字を区別しない

 ・「q」:一行の中に検索パターンにマッチする文字列が複数存在した場合、そのすべてに置換を適用

これで、viコマンドの基本は終了です。 

テキストファイルを自由に加工・編集できるようになりましたか?

それでは、また次回に。。

vim で アンドゥ、リドゥを含めたアンドゥ、リドゥ

0

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

アンドゥは「元に戻す」、リドゥは「やり直し」のことですが、vimにもその機能は用意されています。 ・アンドゥ … u ・リドゥ  … Ctrl + r ですが、アンドゥやリドゥを繰り返している時に、うっかり履歴を消してしまう事が有ります。 こんな感じですね。1) 適当にタイプして… test1 test2 2) アンドゥして… test1 3) また適当にタイプすると… test1 test3 test2の履歴が消えてしまいました。 アンドゥしてもリドゥしても出てきません。 そこで、そんなときには、g- 、 g+ を使いましょう! アンドゥ、リドゥの履歴を含めたアンドゥやリドゥができますよ。

Rubyとメモリリーク

0

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

ある日、mongrelプロセスのメモリ使用量を何となく見ていたところ、
同じ処理をしている他のサーバのものと明らかに違う数値を出していた。
これってもしかして、メモリリークってやつ?

言葉はよく聞くけど、自分自身があまりこれに悩まされた事がなかったため、
今回、ちゃんと正面から向き合う事にした。このメモリリークってやつに。

1. メモリリークとは?

今更だけど、要は使用可能なメモリ容量がどんどん減っていくこと。
アプリケーションが処理のために使ったメモリは、使い終わったら解放される
のが普通だけど、これが何らかの理由で解放されずに残ってしまう事を言う。
借りたものを返さない・・・・どこの世界にも不適な輩はいるらしい。

勘違いしがちなのは、メモリをいっぱい使うのとは直接関係ないという事。
一時的にメモリを大量消費する処理があったとしても、終わった後に解放
されるなら、それはメモリリークじゃない。
むしろ、メモリリークはもっと地味なものらしく、同じ処理が何千回も実行
されて初めて「なんか怪しくね?」って話になる事もざらだとか。

2. GC = Garbage Collecter

さて、メモリリークについて調べてたら、こんな単語に行き着いた。
GC。処理が終わった後、使われなくなったメモリを自動的に回収し、
メモリリークを起きにくくする機能。そういえば、昔読んだRubyの
入門書にも、そんな事書いてあった気がするなあ。

そんなのがあるんだったら、Rubyに関してはメモリリークを気にする
必要はないじゃん、と思ったんだけど、本当にそうなのか?
試しに「ruby」「メモリリーク」で検索かけてみる。
なんだよ、結構出てくるじゃん。

いろいろ調べてわかった事は、このGC。決して完璧なわけじゃない。
例えばメモリ上に、まだ使ってるのか使ってないのかわからないオブジェクト
があった場合、強気に解放してしまうGCと、弱気に様子を見るGCの二種類が
あって、Rubyの場合は後者を使用しているとの事。
だから、本当は参照されてないのに、いつまでも解放されず、結果的に
メモリリークになってしまう事があるのだと。

あと話は変わるけど、RubyのライブラリにはC言語で書かれているものが
あって、扱うオブジェクトの中にRubyのオブジェクトじゃないものがある
ために、それらがGCの対象にならず、メモリーリークの要因になる可能性
もあるんだとか。

ただ、こういうのはすぐに報告されて、バージョンアップで修正されてる
みたいだから、バージョンに気を付けて使っていれば問題ないんじゃないか
と思う。

3. で、結局、冒頭の話はメモリリークだったのか?

わからん。
とりあえずmongrelを再起動したら(当たり前だけど)元に戻ったので、
しばらく様子見かなあ。
メモリリークの原因を追及するのと、定期的にmongrelを再起動するの
だったら、後者の方が楽だしなあ。
まあ、あとは常駐プロセスじゃないpassengerとか、近頃噂のunicornとやらを
試してみるのも手か。

最後に。Rubyのメモリリーク検出ツールなるものを見つけました。
英語マニュアルしかなかったので、自分はわかった風なところまでしか
行きませんでしたが、良かったらチャレンジしてみてください。

<Ruby用メモリリーク検出ツール「Bleak_house」>【動作環境】
 UNIX系OS
 Ruby1.8.7

【インストール】
 $ gem install bleak_house

【セットアップ】
 config/environment.rbに以下の1行を追加。
  require ‘bleak_house’ if ENV[‘BLEAK_HOUSE’]

【使い方】
 1. アプリケーションサーバを起動
  $ RAILS_ENV=production BLEAK_HOUSE=1 ruby-bleak-house ./script/server
 2. 200〜300リクエストを投げたところで、サーバを停止(Ctrl-C)。
 3. /tmp以下にダンプファイルが出来ているので、その内容を解析。
  $ bleak /tmp/bleak.20349.000.dump

【参考URL】
 http://blog.evanweaver.com/files/doc/fauna/bleak_house/files/README.html

Ruby on Rails でモデルを階層化する(サブディレクトリにモデルを入れる)方法

0

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

通常、モデルのファイルはmodelsディレクトリの直下にファイルを作成しますが、管理の都合など何らかの理由でモデルをサブディレクトリに入れたいことがあると思います。

例:models/sample/category.rb

module Sample
  class Category < ActiveRecord::Base
    set_table_name “sample_categories”
  end
end

モデルを階層化する(サブディレクトリにモデルを入れる)方法として、environment.rbでconfig.load_paths にサブディレクトリのモデルを追加する方法が色々なブログで紹介されています。

http://errtheblog.com/posts/3-organize-your-modelshttp://toolmantim.com/articles/keeping_models_in_subdirectorieshttp://www.kevinmonk.co.uk/?p=38

config.load_paths += Dir[“#{RAILS_ROOT}/app/models/**/**”]

しかし上記方法で問題が出る場合もあり、さらに簡単な方法で実現できますのでご紹介します。

サブディレクトリ内のモデルをコントローラ内で利用する際に、::Sample::Category (Sample::Category ではない!) という風に呼び出すことで config.load_paths の追加等をせずに利用することができます。
Sample::Categoryで呼び出した場合に問題が出る場合がありますので、::Sample::Categoryと先頭に「::」を付けて呼び出すことで問題が直る場合がありますのでお試しください。

Webroar を Macports の Ruby で動かすでござる

0

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

エレコマの開発を担当しているたろちゃんです。

Webroarは以前Daoka氏が紹介をしていたが、Macportsで導入したRubyの上で動作しませんでした。また、SSLのサポートも通らなかったため、両方が動くように調整をしてみました。

今回はSSL環境を構築したいため、gnutlsを導入します。

$ sudo port install gnutls

webroarの導入自体は以下のコマンドで行ないました。

$ sudo gem install webroar

ユーザガイドに沿ってインストールを行なうと以下のようにエラーとなりました。

wisp:~ btm$ sudo webroar install --ssl-support
Checking for the dependencies ...
Checking for ruby........found   at /opt/local/bin/ruby.
Checking for libruby.1.8.7.dylib........found  at /opt/local/lib.
Checking for openssl-ruby........found.
Checking for zlib-ruby........found.
Checking for ruby_headers........found   at /opt/local/lib/ruby/1.8/i686-darwin10/ruby.h.
Checking for rubygems........found.
Checking for /usr/bin/gcc-4.2........found   at /usr/bin/gcc-4.2.
Checking for make........found   at /usr/bin/make.
Checking for starling........found   at /opt/local/bin/starling.
Checking for Xcode.app........found   at /Developer/Applications/Xcode.app.
Checking for any previous installation of WebROaR ... found.

Please enter your choice from the options below:
 1. Import configuration, logs and admin panel data from the previous installation - WebROaR-0.2.6.
 2. No import required, install WebROaR-0.2.6 afresh.
> 1
Importing configuration, logs and admin panel data from the previous WebROaR-0.2.6 install ... done.
Creating directory structure ... done.
Compiling C source files ... failed.
Compilation error. Please refer 'install.log' for details.

install.logは /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/install.log に置かれます。それを見ると gnutls.h が見つからないというメッセージが出ていました。これは単純に -I/opt/local/include と -L/opt/local/lib をコンパイル時に渡せば良いという事ですが、実は gnutls に依存している webroar-head だけではなく、webroar-worker も -L/opt/local/lib を渡さなければならない事が後々判明しました。これは、ライブラリのパスを渡さないと MacOSX に付属している Ruby のライブラリを参照してしまうからです。

$ otool -L /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker 
/opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6/bin/webroar-worker:
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 227.0.0)
	/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/libruby.1.dylib (compatibility version 1.8.0, current version 1.8.7)

このため、両方のリンク時に必ず -L/opt/local/lib を指定するようにしなくてはなりません。

今回はwebroar 0.2.6 を対象に次のようなパッチを用意しました。

--- lib/command_runner.rb.orig	2010-01-19 17:37:20.000000000 +0900
+++ lib/command_runner.rb	2010-01-19 17:36:53.000000000 +0900
@@ -56,6 +56,7 @@
   Options:
     -s, --ssl-support      Install the server with SSL support
     -d, --debug-build      Compile the server as a debug build to output extremely verbose logs 
+    -m, --macports         Compile the server with MacPorts Ruby
 
   Summary:
     Install the server
@@ -175,6 +176,10 @@
       options[:report_dir] = dir
     end
 
+    opts.on( '-m', '--macports', 'Compile with MacPorts Ruby') do
+      options[:macports] = true
+    end
+
   end
 
   begin
--- lib/installer.rb.orig	2010-01-19 17:38:03.000000000 +0900
+++ lib/installer.rb	2010-01-19 18:11:26.000000000 +0900
@@ -165,7 +165,11 @@
       ssl = true
       str = "ssl=yes "
     end
-    
+   
+    if options[:macports]
+      str += "macports=yes "
+    end
+
     if CheckUser.new.check == 0
       
 #      if File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-head")) && File.exist?(File.join(WEBROAR_BIN_DIR,"webroar-worker"))
--- tasks/compile.rake.orig	2010-01-19 11:54:46.000000000 +0900
+++ tasks/compile.rake	2010-01-19 17:43:29.000000000 +0900
@@ -66,6 +66,9 @@
     puts "Adding HAVE_GNUTLS flag."
     $flags << '-DHAVE_GNUTLS'
   end
+  if ENV['macports'].eql?("yes")
+    puts "Building for MacPorts Ruby build."
+  end
   $flags = $flags.join(" ")
   $webroar_config_called=true
 end
@@ -128,12 +131,18 @@
 TEST_OBJ_DIR = File.join(OBJ_DIR, 'test').freeze
 LOG_FILES = File.join('','var','log','webroar').freeze
 TMP_FILES = File.join('','tmp').freeze
+MACPORTS_HEADER_DIR = File.join('', 'opt', 'local', 'include').freeze
+MACPORTS_LIB_DIR = File.join('', 'opt', 'local', 'lib').freeze
 
 ## Create necessory directories
 #create_directories([OBJ_DIR, WORKER_OBJ_DIR, YAML_OBJ_DIR, TEST_OBJ_DIR, TMP_FILES, LOG_FILES])
 
 include_dir = ["#{LIBEV_DIR}","#{EBB_DIR}","#{HEAD_DIR}","#{YAML_DIR}","#{HELPER_DIR}","#{UNIT_TEST_DIR}", "#{WORKER_DIR}"]
 
+if ENV['macports'].eql?("yes")
+  include_dir << "#{MACPORTS_HEADER_DIR}"
+end
+
 include_dir.each do |dir|
   $inc_flags << " -I#{dir} "
 end
@@ -244,6 +253,10 @@
   $libs += $LIBS + ' ' + Config::expand($LIBRUBYARG_SHARED,CONFIG)
   #$libs += ' '+CONFIG["LIBRUBYARG"]  
   $libs += ' -lpthread '
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-worker')
   object_files=FileList[File.join(WORKER_OBJ_DIR,'*.o'), helper_obj.keys, File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
@@ -263,6 +276,10 @@
     puts "Compiling with gnutls library."
     $libs += ' -lgnutls '
   end
+  if ENV['macports'].eql?("yes")
+    puts "Compiling with MacPorts Ruby."
+    $libs += " -L#{MACPORTS_LIB_DIR} "
+  end
   out_file=File.join(BIN_DIR,'webroar-head')
   object_files=FileList[File.join(OBJ_DIR,'*.o'),File.join(YAML_OBJ_DIR,'*.o')]
   # -rdynamic option to get function name in stacktrace
--- tasks/gem.rake.orig	2010-01-19 17:54:13.000000000 +0900
+++ tasks/gem.rake	2010-01-19 17:54:39.000000000 +0900
@@ -118,7 +118,11 @@
   if ENV['debug_build'] == 'yes'
     opt_str += "-d "
   end 
-  
+ 
+  if ENV['macports'] == 'yes'
+    opt_str += "-m "
+  end
+
   sh "webroar install #{opt_str}" 
 end
 

パッチの内容は webroar install にオプション -m もしくは –macports を追加してMacPorts用にビルドをしたい場合はオプションを付けるようにするというものです。

これをwebroar_0.2.6_macports_patch.diffとして適当なディレクトリに用意します。

では、パッチを当ててビルドをしてみましょう。

$ cd /opt/local/lib/ruby/gems/1.8/gems/webroar-0.2.6
$ sudo patch -p 0 < ~/develop/ruby/webroar_0.2.6_macports_patch.diff
$ sudo webroar install -s -m

正常に動作するでしょうか?Admin Panelにログインができたら、後は指示に従って導入を進める事ができます。

なお、筆者のケースで、rack-1.1.0が入ってしまい上手く動作させる事ができない事がありました。これはrails-2.3.5がrack-1.0.1に依存(正確にはrailsが依存してるライブラリが依存)しているためです。しかし、このようなケースだとログに一部出力されずに分かりづらい事があります。そういう時はwebroarをdebugオプションつきでインストールをして、/var/log/webroar 以下のファイルを確認するようにしましょう。

HTML5入門

0

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

※この記事は 2010.01.18 時点のものです。現在の内容とは異なる内容が含まれている場合がございますので、ご注意ください。

こんにちは。エンジニアの はる です。

今回は巷で話題の「HTML5」について、

 ・HTML5とは?
・HTML5って何が変わるの?
・HTML5っていつから気にしなきゃいけないの?

という視点から、まずはHTML5をざっくりと知っていただくための入門的な内容を書いてみたいと思います。



・HTML5とは?

W3Cより2008年1月22日にドラフト(草案)が発表されたHTMLの最新バージョン。※2010年9月頃に正式版勧告予定。
HTML4と比べ、WEBアプリケーション向けの機能が大幅に強化されており、また、HTML4.01で非推奨とされていた要素の一部(font要素やcenter要素等)が廃止されてる予定です。
主な追加機能としては、

■新しい要素や属性の追加
(1)入力フォームの強化
(2)canvas要素
(3)文書構造を示す要素の追加(header要素、nav要素 等)
(4)その他(menu要素、command要素 等)


■新しいAPI
(1)簡易データベース(Web Storage)
(2)マルチスレッド(Web Workers)
(3)双方向通信(Web Sockets)
(4)その他(アプリケーションキャッシュ、ドラッグ&ドロップ等)


上記が主要な追加機能となります。その他にも多くの機能追加があるのですが、今回は割愛させていただきます。
それでは、次項にて具体的な各機能の内容をご紹介します。

———————————————————–

・HTML5って何が変わるの?


■新しい要素や属性の追加


(1)入力フォームの強化

□type属性に指定できる型が増える
HTML5からは、input要素のtype属性に指定できる型が増えます。
search、datetime、date、month、number、range、tel、email 等…計23種類になる見込みです。
例えば、「date」型では、date型の入力フォームをクリックするとカレンダーが表示され、そのカレンダーから日付を選択するインターフェイス(※Operaで確認できます。)がブラウザで実装され、
、「range」型では、スライダーコントロールが表示され、感覚でスライダーを動かして入力するインターフェイス(※Safariで確認できます。)がブラウザで実装されます。

例)

HTML5入門
HTML5入門
HTML5入門
HTML5入門

このように今までAjaxやFlashで実装されていたUIがHTMLの標準機能として実装可能になり、type属性の指定型が増えたことで入力項目の型をソースレベルで明確化することができます。

range型を携帯で入力する場合は左右ボタンは使えないし、どうするんだろう・・・といった不安はあるものの、優れたUIをエンドユーザーが利用できる機会が多くなるのは嬉しいですね。



□フォームの値を検証する属性が追加
これまでJavascriptで実装されてきたフォームの値の検証もHTMLの標準機能として、ある程度行えるようになります。
具体的には、必須項目のチェックと正規表現によるフォーマットチェックとなり、submitボタンを押した際にチェックが行われます。
不正値が発見された場合には不正値が入力されている項目が赤く表示され、メッセージが表示されます。(※Operaで確認できます。)

例)
必須項目のチェック(required属性)

フォーマットチェック※正規表現で指定(pattern属性)


(2)canvas要素
canvas要素は、HTML(+CSS3)で自由にグラフィックの描画(2D,3D)、写真合成、アニメーションの作成等を可能にする要素です。
canvas要素については、説明するよりも実際に見てみたほうが分かりやすいかと思いますので、いくつか参考になるサイトをご紹介します。


□Canvas参考サイト

  • ・canvas要素 + css3アニメーション

http://www.agustinfernandez.com.ar/proyectos/canvas/

  • ・canvas要素 + audio要素

http://9elements.com/io/projects/html5/canvas/

  • ・canvas要素 + jQuery

http://www.filamentgroup.com/lab/jquery_visualize_plugin_accessible_charts_graphs_from_tables_html5_canvas/


HTML5+CSS3+javascriptでゲーム等も作成可能とされていますが、現状では、3D、アニメーション、テクスチャのレンダリングが重く感じてしまいます。
canvas要素を利用することにより、AjaxやFlash、Silverlightで実装されていたリッチコンテンツをHTML5でより容易に実装可能になります。
Flash Developerとしては、Flashとの機能的な違いや両者の棲み分けがどうなされるのかという点が気になるところではありますが、リッチコンテンツ制作の間口が広がることでインターネットコンテンツの幅も広がるといいなと思います。

(3)文書構造を示す要素の追加(header要素、nav要素 等)
header要素、footer要素、nav要素、article要素等…HTMLの文書構造を明確に示すための要素が追加されます。
文書構造が明確になることにより、検索エンジンのインデックス化処理(検索ページの索引作り)が容易になります。
※現時点では、検索エンジンのインデックス化処理が容易になるというだけであって、HTML5にすることで直接的なSEO効果があるわけではないようです。

(4)その他(menu要素、command要素 等)
その他にも、menu要素、command要素、progress要素、meter要素等々…ここでは紹介しきれない程の新要素や、HTML4の時には用途が変わって実装されている要素があります。
興味のある型は是非調べてみてください。



■新しいAPI


(1)簡易データベース(Web Storage)

クライアント端末内にデータを保存するためのAPIが提供されます。簡易データベースの種類には「キー/バリュー」形式のものとデータベース形式(※Safariの場合SQLiteを使用しているようです。)(※Safariの場合、バックエンドではSQLiteを使用しているようです。)のものの2種類があります。

  • Storage

キー/バリュー形式で保存
ドメイン毎の保存(永続可能)、ウィンドウ毎の保存(ウィンドウを閉じるまで)が可能

  • データベース

SQLを用いて保存(※トランザクション必須)
非同期APIと同期APIでのアクセスが可能(永続可能)


簡易データベースを活用することで、今まで逐一サーバーと通信をして保存していたデータを必要な時のみ適宜通信をして保存したり、オフラインで編集したものをオンライン時にサーバー側に保存する等、様々な使い道がありそうです。

□参考サイト(※Safari、Chromeでご覧ください)

  • WEB Storage + オフライン作業(manifest)

http://webkit.org/demos/calendar/Calendar.html


(2)マルチスレッド(Web Workers)
バックグラウンドで動作するjavascriptスレッドのことで、これまでは計算処理を行うjavascriptがあった場合に、その処理が完了するまでUI側の操作が一時的に行えない状態になる等の影響がありましたが、
Web Workersを使用することで、例えば計算処理をワーカに渡し、UI側は計算処理中でも操作可能にするといったことも可能となります。
また、Web Wokersは、複数立ち上げることが可能(マルチスレッド)であり、postMessageを使用することで、Worker間、Workerと表示側のjavascript間等で処理結果の受け渡しや協調が可能です。
ただし、Web WorkersはDOMにアクセスできないので、注意が必要です。

(3)双方向通信(Web Sockets)
サーバーサイドプロセスとの双方向通信を可能にするAPIであり、HTTPを使用せずに効率的な双方向通信が可能となります。
HTTPヘッダやCookie情報が含まれない通信のため、トラフィックを軽減できます。

(4)その他(アプリケーションキャッシュ、ドラッグ&ドロップ等)

その他にも、アプリケーションキャッシュ(manifest)、ドラッグ&ドロップ機能等の新しいAPIがあります。興味のある型は是非調べてみてください。

 ———————————————————–

・HTML5っていつから気にしなきゃいけないの?

HTML5がどんなに話題になってもエンドユーザーが満足に利用できる環境がなくては普及はしません。
つまり、利用者側がいつから満足に使用できるかが開発者側の対応が必要になるタイミングでもあるわけですが、これはHTML5に対応したブラウザのシェアによるかと思います。
各ブラウザの対応状況は、下記サイトで確認することができます。


上記サイトで各ブラウザの対応状況をみてみると、webkitベースのブラウザ(Safari、Chrome)はかなりの対応率ですが、IEの対応状況が芳しくありません。今後の対応予定もしばらくは期待できなそうですね。
Operaは現在はまだまだといった結果ではありますが、本格的にHTML5対応を宣言しているので今後に期待です。
正直なところ、PCのブラウザが未だIEが高いシェアを保っているため、しばらくは普及が見込めなそうです。
ただし、ブラウザの入れ替わりが比較的早い携帯電話では昨今のスマートフォンブームと相まって、PC版よりも早く標準になる可能性はあるのではないでしょうか。

今回ご紹介したHTML5についての記事は、HTML5の中のほんの一部の内容です。興味のある方は是非調べてみてはいかがでしょうか。

□その他の参考にさせていただいたサイト

  • 5分で把握するHTML5 – Google Developer Dayセッションリポート

http://journal.mycom.co.jp/articles/2009/06/15/gdd1/index.html

  • 詳解! HTML 5と関連APIの最新動向 – 新タグ&API編

http://journal.mycom.co.jp/special/2009/html5-1/index.html

  • 詳解! HTML 5と関連APIの最新動向 – Webアプリ開発編

http://journal.mycom.co.jp/special/2009/html5-2/index.html

  • HTML5リファレンス

http://www.html5.jp/

tritonnのインストール方法と動作確認

0

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

メガネです。
今日はtritonnのインストールと動作確認の方法を説明します。

tritonnとはmysqlで日本語の全文検索を行えるようにしたものです。
参照:http://qwik.jp/tritonn/about.html

さっそくインストール方法です。

64ビット版のCentOSにインストールしてみます。

今回はrpmを使用します。
各rpmのファイルをダウンロード
wget http://sourceforge.jp/projects/tritonn/downloads/44614/mecab-0.98-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/senna-1.1.4-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm/
wget http://sourceforge.jp/projects/tritonn/downloads/44614/MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm/

rpmでインストール
rpm -ihv mecab-0.98-tritonn.1.0.12a.x86_64.rpm
rpm -ihv mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm
rpm -ihv senna-1.1.4-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm
rpm -ihv MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm


次は動作確認方法ですが、mysqlのコンソールを開いて
テストデータベースで検証します。

> use test
> CREATE TABLE t1 (c1 TEXT, FULLTEXT INDEX ft USING NGRAM (c1)) ENGINE = MyISAM DEFAULT CHARSET utf8;
> SHOW SENNA STATUS\G
> INSERT INTO t1 VALUES (“千葉”);
> INSERT INTO t1 VALUES (“東京都”);
> SELECT * FROM t1 WHERE MATCH(c1) AGAINST(“東京”); #これを実行して東京都がとれれば成功。

次回は、RAILSで使ってみます。以上

Ruby On Rails xmlからハッシュ ハッシュからxml変換

0

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

ども、rick No.16です
今回は、Railsでxmlをハッシュにする方法とハッシュをxmlにする方法を紹介します。

環境

Rails1.2.6
Ruby1.8.6

ハッシュ化

記述する場所はmodelでもcontrollerでもいいです。

include REXML
require “rexml/document”

xml = “body” //xmlのサンプルデータ
rexml = REXML::Document.new(xml) //DOMツリー(木構造)の作成
hash = Hash.from_xml(rexml.elements[‘/xml’].to_s) //ハッシュ化

xml化

hash.to_xml //上記で作成したハッシュをxml化

ちなみに
to_xmlは日本語対応していませんので、
変数.to_xml.gsub(/&#(?:(\d*?)|(?:[xX]([0-9a-fA-F]{4})));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack(‘U’) }
日本語使う場合これで日本語してください。

このメソッドは簡単に変換できますが、複雑な変換はあまりできません。
以上。

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

0

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

M.T.です。前開の書き込みから2ヶ月以上経ってしまいました。
ノウハウはできるだけ落としておきたいなーと思いながら、なかなか書く時間が作れません。

さて、今回は rails のキャッシュ、特に action_cache について書いてみます。

rails で提供されるキャッシング

rails にはデフォルトで 3 つのキャッシュ方法が提供されています。
ウェブ上で情報が多く、ゆえによく使われていそうな順に並べるとこんな感じでしょうか
(といっても、あくまでも実感で数値検証ないです)。

  • ページキャッシュ
  • フラグメントキャッシュ
  • アクションキャッシュ

キャッシュ方法に応じた向き不向き

3 つも実装が用意されているということは、当然それぞれ得意な処理、不得意な処理があります。
ざっくりと言ってしまうと、こんな感じです。

ページをただ単にキャッシングして表示したいならページキャッシュ。
アクセスに応じた処理(○○さんこんにちは! みたいな)が必要ならフラグメントキャッシュ。
ページをただ単に表示したいだけだけど、フィルタは使いたいならアクションキャッシュ

速度効率で言うと、ページキャッシュが圧倒的によく、残りのふたつは処理に応じて異なるので、
アクセスが多いことが想定されているようであれば、早い段階でキャッシュ処理を考えた方が吉、です。

フィルタを使いたい状況とは?

さて、アクションキャッシュはフィルタが使いたい場合と書きましたが、では具体的にどのような状況が想定できるでしょうか。

最も利用される可能性が高いのは、携帯のキャリアに応じたキャッシュを作りたい場合、でしょう。
携帯を使う場合、rails では jpmobile を使うことが圧倒的に多いと思いますが、これはフィルタを利用しています。

例えばページキャッシュを使うと、最初に見られた端末のものでキャッシュされてしまうため、絵文字等正しく表示されない、文字化けが発生してしまうなどの問題が起きます。

キャリア別にページキャッシュをした場合でも、jpmobile のフィルタによる恩恵を受けられないため、パラメータの中に日本語等が入っていた場合、正常に動作しない可能性があります(すいません、未検証です)。

もしページ内にアクセスに応じた処理が入っている場合は、フラグメントキャッシュを使った方がよいと思いますが、その場合も、アクション内でデータを取得するときにキャリアに応じた処理を入れる必要があり、恐らく rails のライブラリをオーバーライドしないと難しいでしょう(すいません、こちらも未検証です、情報お持ちの方、ぜひぜひブクマコメントなどお寄せください)。

そんなときに使えるのがアクションキャッシュです。これは、あるコントローラ内のアクションで宣言すると、around_filter として適用され、before_filter でキャッシュ生存チェックを行い、もしキャッシュがあればアクションの処理を返さずにそのままキャッシュを表示、キャッシュがなければアクションを実行した後 after_filter でキャッシュを生成します。

と、ここまで書きましたが長くなってきたので、実際にどのような処理が行われているのか、キャリアごとにキャッシュするにはどうしたらよいのか、また次回書きたいと思います。今度こそもっと早く書くぞっ!

IE6でのwebページ印刷時に幅指定をするCSS

0

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

通常、IE6で649px以上のwebページを印刷する場合、途中で切れて印刷されてしまいます。(Firefoxは賢いので切れずにちゃんと印刷してくれます)

webサイトを作ったはいいが「うまく印刷できない」と言われた時、印刷用の『CSSを用意すればいい』なんて話はよく聞きますが、印刷の為だけにCSSを書き換えるのは手間がかかります。

そこで、今回はIE6で簡単にwebページを縮小して印刷してくれるCSSを紹介します。

CSS
@media print {
body {
zoom: 80%;
}
}

上記記述をCSSに追加するだけです。

あとは印刷時にどれくらい縮小させるかを%で指定して下さい。

※zoomタグはIE規格なのでFirefoxには適応されません。

IEのwindow.onloadでthickboxが動作しない場合の対処方法

0

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

こんにちは abennu です。

今回の内容は題名の通り
IEのwindow.onloadでthickboxが動作しない場合の対処方法を書きます。

はじめにthickboxについて簡単に説明します。
thickboxは主に画像等を格好良く表示したりする
Ajaxライブラリの1つです。

もしも画像を格好良く表示したくなってきたら
thickboxのtb_show()などを使うとちょっとリッチな雰囲気を出せます。
tb_showの簡単な使い方の例は

 < input type=”button” onClick=”tb_show(”, ‘hoge.jpg’);”>

こんな感じでしょうか。
これを実行すると
ブラウザの画面が暗くなり、新しいウィンドウが生成されます。
(新しいウィンドウにはhoge.jpgが表示されます。ここにはhtml等も表示できます。)
以上がthickboxの簡単な説明でした。

では本題の対処方法について書いてゆきます。
こんな便利なthickboxなのですが
IEのwindow.onloadでtb_showを以下のように呼び出しても、画面が暗くなるだけで新しいウィンドウはでてきません。
(firefox, chromeでは正常に動作しました。)

window.onload = function(){tb_show(”, ‘hoge.jpg’)};

この場合はwindow.onloadの代わりにjQueryのsetTimeoutを使って..

jQuery(function(){
setTimeout(function(){ tb_show(”, ‘hoge.jpg’) }, 500);
});

このようにすれば動きます。

こんな感じでしょうか。
以上が対処方法です。

ドキュメント管理から始める分散バージョン管理システムの導入

0

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

こんにちは、shimadaです。

オープンソースの世界では着々と普及が進んでいる分散バージョン管理システム(DVCS)ですが、 商用開発の現場では、スケジュールの制約や実績、メンバーの習熟度の問題から、 実際のプロジェクトにはなかなか導入できないのが実情ではないでしょうか。

バージョン管理システムは、個人でちょこちょこいじってもノウハウは蓄積できません。なぜなら、チーム開発でしか起こらないコンフリクトやマージといった作業が、個人作業では発生しないからです。

僕らのチームでも、興味はあっても採用のきっかけがないという状況でした。

そこで、まずはDVCSをチームで使ってみるための入り口として、仕様書やスケジュールなどのドキュメントをDVCSで管理してみようというのが今回の試みです。

業務用のドキュメントはソースコードの他に、仕様書、設計書、スケジュールなどいろいろあります。 これは社内ではファイルサーバで共有・管理されています。

これらの管理にDVCSを導入するためのポイントは、

  • 通常業務で使うこと
  • 使う余裕のある人から段階的に導入できること
  • 使っていない人が不自由を感じないこと
  • バージョン管理システムの基本的なメリットを生かせること
  • DVCSの基本的な概念や操作を体で覚えられるようになること

といった点です。これらをクリアできるような方法を考えなければいけません。

ひとくちにDVCSといっても、今ではいろいろなソフトウェアがリリースされています。 僕のイチ押しはGitなのですが、試してみたところ日本語のファイル名がエスケープされてしまって実用になりませんでした。 そこでいろいろ実験した結果、日本語ファイル名でもそこそこ実用になりそうなMercurialを使うことにしました。

まずプロジェクトで使っているファイルサーバのディレクトリをマウントしたあと、Mercurialのリポジトリにするためのコマンドを実行します。


% hg init

これで、ディレクトリの下の .hg/ 以下にリポジトリが作成されます。


% cat >.hgignore
syntax: glob
._*
.DS_Store
^D

Macでファイルサーバにファイルを作ると、メタ情報を格納するための隠しファイルを作成するようです。 Windowsから見るとディレクトリがかなりごちゃごちゃした感じになってしまいます。 そこで、.hgignoreというファイルを作ってMercurialからは無視するように設定します。 Macの作るメタ情報は、’.DS_Store’ と ‘._元ファイル名’ の2種類で、これらをはじくように設定します。


% hg addremove

Mercurialでは、作業ディレクトリを自動でスキャンして、新しいファイルをadd, なくなっているファイルをremoveしてくれる便利な「addremove」というコマンドが備わっています。

Subversionでは、ファイルを作成したり削除したりした場合、コマンドラインからひとつずつ add/remove する必要がありました。こういう作業をコマンド一発でやってくれるのは地味に便利です。


% hg commit -m 'initial commit'

最後にコミットすればプロジェクト用のディレクトリにあるファイル一式をリポジトリに登録完了です。

つぎにローカルで作業するためのクローンを作成します。


% hg clone 《ファイルサーバのディレクトリ》 《ローカルのディレクトリ》

マウントしたファイルサーバをリポジトリとして使うと、サーバーを建てなくても ローカルと同じ手軽さで clone/push/pull を行えるので便利です。

あとは、ローカルのディレクトリでファイルを作ったり更新したりして、 作業が一区切りしたときに


% hg commit -m 'コミットメッセージ'
% hg push

この二つのコマンドでファイルサーバ側に作業したチェンジセットを送信します。

ただし、まだ Mercurial を導入していないメンバーはファイルサーバのファイルを直接編集したりしていますので、pushする前に必ずファイルサーバのディレクトリに cd して


% hg status

を実行してファイルが更新されていないか確認します。

特にワープロや表計算ソフトのドキュメントは、開いたままだと一時ファイルやロックファイルが作られるので、 そのままの状態でコミットしてしまうと面倒なことになります。 チーム内で声を掛け合って、ファイルを開いている人はいませんか、と確認したりしています。


% hg addremove
% hg commit

これでまずファイルサーバ側で更新されたファイルをリポジトリにコミットします。 そのあとローカル側のpushを実行します。そのあと、ファイルサーバの作業ディレクトリをリポジトリに同期します。


% hg update

これで、自分の更新した内容がファイルサーバに反映されたことになります。

最初、自分ひとりだけが Mercurial を使い始めたときは、ローカルでコミットしてサーバでアップデートして、とかなりまだるっこしい作業を続けていました。

でも、ある時メンバーのひとりが、重要なスケジュール表のファイルを間違って削除してしまったのです。 ここで、バージョン管理の強みが生かされました。


% hg update

これだけで、消えてしまったファイルが復活しました。やっておいてよかった、としみじみ思った瞬間です。 また、他のメンバーにドキュメントをバージョン管理するメリットを印象づけるよい機会となりました。

今、僕のプロジェクトチームでは、コアメンバーは皆ドキュメントの更新にMercurialを使っています。「いま仕様書の変更をコミットしました」 「じゃあpullして確認します」

今はこんな感じで作業が進んでいます。 一人一人のローカル環境に、リポジトリのミラーが作られるという分散バージョン管理の基本も、使っているうちに飲み込めてきています。

「あれ、headが二つできてしまった」
「コミットする前にpullしておかないとそうなるんだよね」
「とりあえずマージしておけば大丈夫だよ」

そろそろプロジェクトでは、システムの実装に作業がシフトしつつあります。 ドキュメント管理には大活躍のMercurialですが、ソースコード管理は実績とノウハウの豊富なSubversionを使う方針です。

でも。

メンバーの間では、

「git svnっていいらしいね」
「GitとMercurialってどのくらい違うのかな」
「ああ、Gitにはステージングっていう概念があって……」
「ほほう、それは便利そうだ!」

などと、話が弾んでいます。社内のプロジェクトでGit/Subversionの併用事例が増えていくのは時間の問題じゃないかな、と個人的には思っています。

最近人気な記事