Techracho

XAMPPでRailsのProxy

このエントリーをはてなブックマーク Share
2010.05.24    Ruby, ネットワーク, 馬場   タグ: , , —    baba   

Railsで開発する際は、素直にRadRailsのボタンでサーバを起動してしまうのが楽で良いです。
例:http://localhost:3000

しかし、ポート番号ではなく好きな名前でアクセスしたいこともあります。
また、Rails 2.3には、prefix(ドメイン直下以外にアプリを配置)にバグがあるため、それをローカルで試したいこともあるかもしれません。

XAMPPだけで普段はサーバ作業に触れない人には馴染みが薄いかもしれませんが、Apacheなので、たんなるProxyならかんたんです。
例:http://localhost/myapp

<VirtualHost *:80>
	ProxyRequests Off
	<Proxy *>
		Order deny,allow
		Allow from all
	</Proxy>
	ProxyPass /myapp http://localhost:3000
	ProxyPassReverse /myapp http://localhost:3000
</VirtualHost>

なお、肝心のPrefixバグの対策は、システムチームの伊藤がブログを書いていますのでご覧下さい。
http://www.bpsinc.jp/blog/archives/1579

HTTPリクエストを同時処理

このエントリーをはてなブックマーク Share
2010.05.23    PHP, Ruby, 馬場   タグ: , —    baba   

Webサービスにたくさんリクエストを投げるとき、1つ1つレスポンスを待っていると遅いので、同時に処理した方が良いですね。
(そもそも、WebサービスでAPIをたたく回数は最小限にするべきですが)

PHPならcurl_setoptをつかえば良さそうです。
http://php.net/manual/ja/function.curl-multi-add-handle.php

$mh = curl_multi_init();

$ch = array();
foreach ($urls as $index => $url) {
    $ch[$index] = curl_init();

    curl_setopt($ch[$index], CURLOPT_URL, $uri);
    curl_setopt($ch[$index], CURLOPT_HEADER, $header);
    curl_setopt($ch[$index], CURLOPT_RETURNTRANSFER, 1);

    curl_multi_add_handle($mh, $ch[$index]);
}

$running = null;
do {
    curl_multi_exec($mh, $running);
} while($running > 0);

$result = array();
foreach($ch as $curl) {
    $result[] = curl_multi_getcontent($curl);
    curl_multi_remove_handle($mh, $curl);
}

curl_multi_close($mh);

rubyなら、素直にスレッドを使うのが簡単そうです。

require 'uri'
require 'net/http'

threads = []
datas.each do |data|
  threads << Thread.new do
    #dataを使ったHTTP処理
  end
end

threads.each do |th|
  th.join
end

Railsのautoloadの使い方に気をつけよう

このエントリーをはてなブックマーク Share
2010.05.22    Ruby, 馬場   タグ: —    baba   

Railsには便利なautoloadがあるので、たとえば lib/util/test.rb に

module Util
  module Test
    def hoge
      puts 'hello'
    end
  end
end

と書いて、コントローラなどで

def HogeController < ApplicationController
  def index
    Util::Test::hoge
  end
end

とやれば、勝手にロードしてくれます。

しかし、毎回打つのが面倒だからと

def HogeController < ApplicationController
  include Util
  def index
    Test::hoge
  end
end

みたいなことをやろうとしても、うまくいきません。

railsのソースコード内で、以下のような場所にあるdependencies.rbがautoloadを実現しているのですが、

C:\ruby\lib\ruby\gems\1.8\gems\activesupport-2.3.5\lib\active_support\dependencies.rb

これは、const_missingが発生したときに、定数名から該当する.rbファイルを自動的に読むものです。

つまり、include Util とやると、lib/util.rb を探しに行ってしまいます。
utilはフォルダであってファイルではないので、見つからずエラーになります。

毎回 Util::Test::hoge とやるか、

def HogeController < ApplicationController
  include Util::Test
  def index
    hoge
  end
end

のようにやれば済む話なのですが、Test::hogeという呼び方をしたくなりますよね・・・

Testをclassにして、hogeをクラスメソッドにして、手動でloadすれば解決しますが、いまいち美しくないです。

そもそもnamespace的に使おうとするのが間違いなのかもしれませんが・・・
もっと良い方法を考えてみます。

Windows x64でgemsからrails入れるとき

このエントリーをはてなブックマーク Share
2009.06.26    Ruby, Ruby on Rails, Windows, 馬場      baba   

Railsを入れるために、まずはrubyをインストールして、次にgemsを入れるのですが、
OSが64bitなので、rubyもx64(x64_mswin64 が含まれるファイル名のやつ)にしておきました。

そうすると、gem install rails をやったときにエラーが出ました。
zlib.dllもx64にしないとダメみたいです。
ZLIB DLL Home Pageから for AMD64/Intel EM64T のやつをダウンロードして、gemsのフォルダに上書きしたら、無事インストールできました。

PHPプログラマのためのRubyチュートリアル #1 環境構築

このエントリーをはてなブックマーク Share
2009.03.06    Ruby   タグ: —    tomotaka   

こんにちは、伊藤です。

PHPプログラマのためのRubyチュートリアルというネタで、書いていこうと思います。
記事の目的は社内のRubyに詳しくないが、PHPはバリバリな人たちをRubyに引き込むことです。

インストール

主にWindows, Mac OS X, Linuxの3つの環境について。
とりあえず安定版の1.8.6を入れる想定で書いています。

  • Windows
    お手軽なのはRuby One-Click Installer for Windowsです。
    rubygemsや、主要な便利ライブラリなどもまとめて入れてくれる便利パッケージです。
    ただ、1.8.7がリリースされてしばらく経つのに追従していないため、今後メンテナンスされるかどうか心配です。
    公式のmswin32のパッケージを使ってインストールする場合、
    ダウンロードしてきて、C:\ruby\などに配置して環境変数を通すだけです。簡単ですね。
  • Mac OS X
    実はMac OS Xには標準でrubyがインストールされています。ターミナルを開いてruby -vなどと打ってみるとバージョンがわかります。
  • Linux
    現在Linuxで大きなシェアを占めていると思われるFedora CoreやCentOSなどでは

    $ sudo yum install ruby
    

    として、パッケージマネージャyumを使って簡単にインストールすることができます。
    Debian GNU Linuxや、Ubuntu Linuxなどdpkg(apt-get, aptitude)を使うディストリビューションでも、
    同様に以下のようにしてインストールできます。

    $ sudo aptitude install ruby
    または
    $ sudo apt-get install ruby
    

各環境のコマンドラインでruby -vとすると以下のようにインストールされたrubyのバージョンを確認できます。

tomotaka@mist:~$ ruby -v
ruby 1.8.6 (2007-06-07 patchlevel 36) [x86_64-linux]

コンパイルされたアーキテクチャなんかもわかりますね。

FreeBSDなんかの環境は、僕はあまり使ったことがないのでよくわかりませんが、
portsなどを使って簡単に入れられたりするのでしょうか?
ソースからインストールするのも簡単だと思います。

rubyインタプリタにプログラムを実行させるには単純にruby [ファイル名]とすればOKです。
HelloWorldプログラムを作って動かしてみた例↓

tomotaka@mist:~$ cat test.rb
puts "Hello, world!"

tomotaka@mist:~$ ruby test.rb
Hello, world!

shellのシェバング行と実行権限を使えばファイル自体をコマンドとして叩くスタイルで起動することもできます。

tomotaka@mist:~$ which ruby
/usr/bin/ruby
tomotaka@mist:~$ cat test2.rb
#!/usr/bin/ruby
puts "Hello, world!!"

tomotaka@mist:~$ chmod +x ./test2.rb
tomotaka@mist:~$ ./test2.rb
Hello, world!!

irb(Interactive Ruby)

irbは対話的なrubyコードの実行環境です。
1行ずつ、命令を実行していくことができます。
rubyではclassやmodule, メソッド(関数)の定義も実行文なので、クラス定義やモジュール定義の細かい挙動のチェックなどもお手軽に使えます。
linuxのパッケージマネージャではrubyパッケージとruby-irbなどとして分離されている可能性があるので、
ぜひirbのパッケージを探してインストールしてあげてください。

irbの実行イメージ↓

tomotaka@mist:~$ irb
irb(main):001:0> a = 10
=> 10
irb(main):002:0> b = 20
=> 20
irb(main):003:0> a * 3 + b * 5
=> 130
irb(main):004:0> def echo3(str)
irb(main):005:1>   3.times do
irb(main):006:2*     puts str
irb(main):007:2>   end
irb(main):008:1> end
=> nil
irb(main):009:0> echo3("learning ruby!")
learning ruby!
learning ruby!
learning ruby!
=> 3

irbについて詳しくはirbのマニュアルを参照してみてください。

次回は基礎的な文法(if, while, メソッド定義, クラス定義)を説明したいと思います。

Ruby on Railsでコントローラでヘルパーメソッドを呼ぶ

このエントリーをはてなブックマーク Share
2009.03.03    Ruby, Ruby on Rails, Web, フレームワーク, 伊藤   タグ: , —    tomotaka   
# app/controllers/application.rb
ApplicationController < ActionController::Base
  class HelperImpl
    include ::Singleton
    include ::ApplicationHelper
  end

  protected

  def helper
    return HelperImpl.instance
  end
end

これでコントローラからApplicationHelperに定義されてるメソッドをhelperメソッド経由で呼べる。

« 新しい投稿

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.