徒然なるままに、日ぐらしP/Cに向ひて――
メインメニュー
ブログカレンダー
2024年 11月
« 10月    
 12
3456789
10111213141516
17181920212223
24252627282930
WordPress カテゴリ一覧
WordPress 検索


富士カメラ5

Kestrel とは、チョウゲンボウのことです。ハトくらいの小さな猛禽類、つまりワシの仲間で、ハヤブサに似ています。
チョウゲンボウにはホバリングという特技があります。よく農地の上空で空中に停止している姿が見られます。小さいけれどカッコイイ、そして最近は都会でも繁殖している頼もしいタカです。
このサイトのURLは、そんなチョウゲンボウから名前を借りました。

2015年5月27日(水曜日)

RoR (ruby 1.8.7) でXLSXを読む

カテゴリー: - flyman @ 23時03分37秒

Ruby on Rails でXLSX形式のExcelシート(OOXML)を読むべく、悪戦苦闘してしまった。
原因は、たぶん、環境が古いからだろう。
Ruby 1.8.7
Rails 3.2.13
という状況なので、最新のGEMはほぼ入らない。

まず試したのが[rubyXL]だ。バージョンは1.1.12を入れた。
これでXLSXファイルを読むと、あら不思議、所々指定外のセルを読み込んでしまう。これがまた、MS Officeのブックはダメで、LibreOfficeだとOKだったりする。正しく読めないファイルをLibreOfficeで保存し直すと読めるのだが。

次に、[spreadsheet]を試してみたが、もともとこれはXLSXには対応していない。XLS(BIFF)のブックは正常に読み込めたので、旧形式だけで良ければこれもアリかも。

で、[roo]を入れた。バージョンは1.10.1だ。これはなかなかよろしい。XLSXでもXLSでも、今のところ正しく読めている。拡張子がちゃんと付いていればファイル形式を自動認識してくれるので同じルーチンでBIFFもOOXMLも読めてしまうのだ。
なお、rooを入れるにあたり、rubyzip 0.9.9もインストールが必要だった。Gemfileに

gem 'rubyzip', '~> 0.9.9'
gem 'roo', '~> 1.10.1'

を追記して、Controllerでは

s = Roo::Spreadsheet.open(work_file)
s.default_sheet = s.sheets[0]  # 最初のシート
s.first_row.upto(s.last_row) do |i|
  # s.cell(i, 1) で Aカラムが読み出せる
end

みたいな感じ。


2014年5月12日(月曜日)

sunspot solr で全文検索。――続き

カテゴリー: - flyman @ 23時15分32秒
フィッシュ・アイは面白い。

Sunspot_solr で全文検索機能を実装する話は前に書いたが、単一のテーブルだけではなく関連するテーブルの中まで検索することも容易に出来る。

例えば、Question には 複数の Reply があったとする。以下のようなModelだ。

class Question < ActiveRecord::Base
 attr_accessible :question
 has_many :replies
end

class Reply < ActiveRecord::Base
 attr_accessible :question_id, :reply
belongs_to :question
end

このとき、次のように検索設定をする。

class Question < ActiveRecord::Base
 attr_accessible :question
 has_many :replies

 searchable do
  text :question
  text :reply do
   replies.map(&:reply)
  end
 end
end

Questionテーブルの"question"カラムだけでなく、
Replyテーブルの"reply"カラムでも全文検索が出来るようになる。
"text :reply do" の :reply は、実際のカラム名である必要は無い。
"replies.map(&:reply)" の方には、実際のカラム名を指定する。

設定が終わったらreindexしておく。
もし、検索実行時に"reply"カラムを検索対象から外したければ、

search = Question.search do
 keywords params[:query],
 :fields => [:question]
end
@questions = search.results

のように、:fields パラメータを指定すれば良い。
:fields を指定しないか、
 :fields => [:question, :reply]
のように両方を指定すれば、両方を対象に検索が実行される。


2014年4月27日(日曜日)

RoRに、全文検索システムsunspotを入れる

カテゴリー: - flyman @ 17時51分36秒
宮ヶ瀬湖にはたくさんの車、バイク、そして警察車両も。
スーパーカーは見かけなかったが、クラシックカー、オールドカー多数。
伊勢原は農協祭り。
伊勢原市太田では、大凧上げ大会。

VMware Player 上の CentOS 6.4 に
Rails 3.2.8
Ruby 1.8.7
という環境で、全文検索システムsunspotの導入を試みた。

導入が簡単、という触れ込みだったが、
Gemfile に

gem ’sunspot_rails’
gem ’sunspot_solr’

を追記して bundle install とかすると、
『Gem::InstallError: nokogiri requires Ruby version >= 1.9.2.』
と怒られた。
そこで、gemfileに

Gem ‘nokogiri’, ‘1.5.10′

を追加してバージョン指定したら、
Installing nokogiri (1.5.10)
Installing sunspot (2.1.0)
Installing sunspot_rails (2.1.0)
Installing sunspot_solr (2.1.0)
Your bundle is updated!
となった。

* nokogiri はlibxml2-devel、libxslt-devel を使うので、事前に
yum install libxml2-devel libxslt-devel
してインストールしておく必要がある。

続いて、コマンドラインで
rails generate sunspot_rails:install
として設定ファイルを生成させる。
『create config/sunspot.yml』
と表示されればOKだ。

bundle exec rake sunspot:solr:start
で solr を起動、
『Successfully started Solr …』
が表示される。

bundle exec rake sunspot:solr:reindex
で、検索用インデックスが生成されるのだが、その前に検索対象を決めてやる必要がある。
Model に、

 searchable do
  text :question
 end

などとする。上の例では、"question"カラムのみを対象にしている。
Modelの記述が済んだら、reindexする。これ以降は、インデックスは対象データの書き込み時に自動的に更新される。

Controller は、

 def search
  search = Question.search do
   fulltext params[:query]
   paginate :page => params[:page], :per_page => 10
  end
  @questions = search.results
 end

View から params[:query] で検索文字列を受け取り、Questionモデルを検索し、結果を @questions 変数に入れて View を呼び出せばいい。
paginate の行は、ページネーションをしている。無くても動く。

これだけのことなのに、えらー出まくりで何度インストールし直したことか。

さらに、production 環境で動かすのにもう一苦労してしまった。
solr ディレクトリを見ると、development ディレクトリはあるが production ディレクトリは作られない。そのため config/sunspot.ymlに、

production:
 solr:
  hostname: localhost
  port: 8983
  log_level: WARNING
  path: /solr/production

などとしても動かない。
ここは

production:
 solr:
  hostname: localhost
  port: 8983
  log_level: WARNING
  path: /solr/default

とすれば良い。solr/default ディレクトリは、sunspotインストールの際に作成されているはずだ。


2013年7月27日(土曜日)

Railsで複数ファイルをアップロードする

カテゴリー: - flyman @ 22時19分32秒

HTML5 で実装された『multiple』機能を使って複数選択したファイルを一括アップロードする仕組みを考えてみた。

まずView側だ。

< %= form_tag( {:action => ”cat”}, {:multipart => true} ) do %>
	

    ファイル選択
    < %= file_field_tag ”uploads[]”, :multiple => true  %>
  
	
  < %= submit_tag ”アップロード” %>
< % end %>

こんな感じにする。『:multiple => true』だけで複数ファイルに対応してくれる。uploads[]と、配列で受け取るようにするのがポイントだ。

controller側も作る。
アップロードされたファイルを結合してダウンロードする、というものを作ってみた。

def cat
  outFile = ””
  fileName = ((’a’..’z’).to_a + (’A’..’Z’).to_a + (’0’..’9’).to_a).shuffle[0..23].join
  tmpFile = File.join(Rails.root, ”tmp”, fileName)
  params[:uploads].each do |file|
    outFile = file.original_filename if outFile == ””
    File.open(tmpFile, ”a”) { |f|
      f.write(file.read)
    }
  end
  File.open(tmpFile, ”r”) { |f|
    send_data(f.read, type => ’text/csv’, :filename => outFile + ’.csv’)
  }
  File.delete(tmpFile) if File.exist?(tmpFile)
end

ランダムに生成した名前で tmp ディレクトリに作業ファイルを作り、アップロードしたファイルを順次追加書き込みしていく。
作業ファイルをメモリに読み込んでからダウンロードする。
作業ファイルを削除する。
といった手順だ。
プログラムは冗長できたないが、要は『params[:uploads].each』で個々のファイルが取得できるということ。

とても良いのだが、この仕組みには欠点もある。
それは、IE8、IE9がHTML5に対応出来ていないということ。Firefoxではちゃんと動く。たぶん、IE10は大丈夫だと思う。
クライアントを選ぶが、複数ファイルアップロードに簡単に対応出来る方法ではある。

PENTAX Q + 02レンズ。


2013年7月16日(火曜日)

ruby + Thinreports で PDF 出力

カテゴリー: - flyman @ 22時57分53秒

例えば、ruby + Thinreports を使えば、

のような請求書が簡単に作れる。これは『高度な一覧表』のサンプルとほぼ同様のものだ。

ところが、このレイアウトでページあふれが生じると、

の様になってしまう。これはまずい。
何がまずいかというと、『記』『以上』でくくっているはずの明細の途中に、改ページ毎に『記』が書かれてしまうのだ。『記』は最初だけ、『以上』は最後にだけ表示されなければいけない。
これを避けるために複数レイアウトを組み合わせてみたが、うまく行かなかった。最初のオーバーフロー時に余計なページが挟まってしまうのだ。それを避けるためにトップページのオーバーフローを抑止すると、今度は途中に『以上』が挟まってしまう。
で、泣きそうになりながら作ったのが、

だ。レイアウトは1つにして、2ページ目以降では邪魔な部分の表示を抑止するようにした。

実際の帳票では、

のように空白行を入れてフッター位置を調整するのが普通なので、さらに調整してみた。

ファイル一式をここに置く。

2ページ目以降でヘッダーの出力を抑止しているのは

report.events.on :page_create do |e|
  # Set page-number.
  e.page.list(:default).header.item(:Page).value(”Page: ” + sprintf(”%02d”, e.page.no))
  if e.page.no > 1
    report.page.list(:default).header do |header|
      header.item(:Customer).hide
      header.item(:Fix01).hide
      header.item(:Fix02).hide
    end
  end
end

といったルーチンだ。ページ生成イベントで2ページ目以降の時、非表示にしている。

最終ページで空白行を挿入してフッターの位置合わせをしているのは

maxLine = 37  # オーバーフローする行数
minLine = 34 # フッター表示時の行数
amari = itemNo % maxLine  # 最終ページの行数
if amari > minLine
  (amari - maxLine).upto(minLine - 1) {
    report.page.list(:default) do |list|
      list.add_row do |r|
      end
    end
  }
elsif amari < minLine
  amari.upto(minLine - 1) {
    report.page.list(:default) do |list|
      list.add_row do |r|
      end
    end
  }
end

という、なんだかいい加減なルーチンである。出力した行数を基に計算している。
もっと賢い方法があるのだろうが、flymanはググってもたどり着けなかった。

まだまだ機能不足なThinreportsだが、工夫すれば使えそう。
でも、欲しい機能も一杯 ――

:idea:バンドを増やして欲しい
 ボディ・ヘッダー
 グループ・ヘッダー
 明細ヘッダー
 明細
 明細フッター
 グループ・フッター
 ボディ・フッター
など。
:idea:各種プロパティをダイナミックに変更可能に。例えばバンドの高さとか。

要は、QuickReportsやRaveReports のようなレポート作成ツールの機能に迫って貰いたい。フリーじゃ無理かも知れないが、なるべくフリーのままで。バージョンアップに期待 ;-)

2013年6月4日(火曜日)

トランザクション制御

カテゴリー: - flyman @ 22時14分21秒

Ruby on RailsでのOracle接続、更新系のSQLでの動作。

  conn = DBI.connect(某データベース, ユーザー, パスワード)
  begin
    sth = conn.prepare(”insert into 某テーブル (FIELD1, FIELD2) values(?, ?)”)
    sth.execute(値1, 値2)
    sth.finish
  ensure
    conn.disconnect if conn
  end

OCI8経由でOracleに接続したところ、エラーは出ないもののレコードは書き込まれなかった。
これは、と思って

  conn.commit

を足したところ、うまく書き込まれた。


2013年5月16日(木曜日)

Rails で redirect_to

カテゴリー: - flyman @ 22時31分28秒

よく、

if コンディション
  redirect_to どこか
  return
end

みたいなロジックを書いていた。
1アクションから redirectまたはrenderを複数回呼ぶことは出来ないので、returnしないとエラーになる。

これって実は、

if コンディション
  return redirect_to どこか
end

とか、

return redirect_to どこか if コンディション

とか書けるんだね。

試してはいないが、

return redirect_to(コンディション ? どこか : 別のどこか)

みたいにも書けるらしい。

より英文っぽく書くなら、

redirect_to どこか and return if コンディション

とも書ける。この辺りは好みかな。
renderの場合もほぼ同様だ。

Ruby、なかなか。


2013年5月14日(火曜日)

send_file と send_data

カテゴリー: - flyman @ 23時20分30秒

RailsからThinreportsを使用してPDFファイルを作っている。
テンポラリディレクトリにPDFを生成し、それをダウンロードさせる。

pdfFile = File.join(Rails.root, 'tmp', fileName + '.pdf')
report.generate_file(pdfFile) # PDFファイルの生成
send_file(pdfFile, :filename => 'hoge.pdf')
File.delete(pdfFile)

当初はこれでも動いていたのだが、全く同じロジックで別のアプリを作ったら、そっちは"ファイルがないよ"エラーになった。
原因は、PDFのダウンロード前にファイルが削除されてしまうためらしい。
なぜ最初のアプリがちゃんと動くのかは不明だ。殆ど同じ作りなんだけど。
で、作ったファイルをメモリ上に展開してからダウンロードさせるようにした。

pdfFile = File.join(Rails.root, 'tmp', fileName + '.pdf')
report.generate_file(pdfFile) # PDFファイルの生成
send_data(File.read(pdfFile), :filename => 'hoge.pdf')
File.delete(pdfFile)

これでうまくいった。


2013年4月19日(金曜日)

Phusion PassengerとOCI8

カテゴリー: - flyman @ 22時55分33秒

まだ4月なのに五月病(?)のflymanです。体調ボロボロです。

さて引き続きRuby on RailsでOracle DBとAS400のDB2にアクセスするプログラムを書いているが、開発環境ではうまく動くのに本番(のトライアル)環境で動いてくれなかった。本番はApache+Phusion Passengerなのだが、どうやらこの環境でruby-oci8が動かないようだ。
原因は予想通り、環境変数の設定不足だった。すでにinit.d内のhttpdスクリプトでLD_LIBRARY_PATHとNLS_LANGは設定していたのだが、TNS_ADMINも設定が必要だったようだ。念のためORACLE_HOMEも設定しておいた。
# service httpd restart
で、無事に動き出した。

で。
環境変数のセットをinit.d/httpdスクリプトに書くのは止めて、apacheのSetEnvディレクティブを使うことにした。
/etc/httpd/conf.d/passenger.confに、

SetEnv ORACLE_HOME /opt/Oracle
SetEnv LD_LIBRARY_PATH /opt/Oracle
SetEnv TNS_ADMIN /opt/Oracle
SetEnv NLS_LANG JAPANESE_JAPAN.UTF8

を記述した。すっきり。


2013年3月15日(金曜日)

Ruby、DBI、OCI8、ODBC、Oracle …… さっぱり

カテゴリー: - flyman @ 22時30分17秒

2月5日のエントリーで、ruby で Oracle接続するテストスクリプトを書いた。
あれはちゃんと動いた。ところが、

require “rubygems”
require “dbi”

begin
 conn = DBI.connect("DBI:ODBC:MyOracle”,"ユーザー名”,"パスワード")
 rows = conn.select_all("select * from MyDB")
 rows.each do |row|
  処理
 end
ensure
 conn.disconnect if conn
end

これは動かない。select_all が機能しないのだ。

 rows = conn.execute("select * from MyDB")
 rows.each do |row|
  処理
 end
 rows.finish

これは大丈夫。
よく分からない。
select_one、execute は動作するが、select_all は動作しない。でも、flymanは select_all が使いたい!
結局、
 conn = DBI.connect("DBI:ODBC:MyOracle”,"ユーザー名”,"パスワード")

 conn = DBI.connect("DBI:OCI8:MyOracle”,"ユーザー名”,"パスワード")
にすることで、select_all が使えるようになった。
結果オーライということで、これ以上の深入りはやめにした。どうせ理解できないだろうし。


2013年3月6日(水曜日)

ajaxで、フォーカスを失ったときに処理をさせる

カテゴリー: - flyman @ 21時23分53秒

さらに、test01プロジェクトを書き換える。

app/views/welcome/index.html.erb はそのまま使う。
<%= text_field_tag :field1, :id => “field1″ %><BR/>
<%= text_field_tag :field2, :id => “field2″ %><BR/>
<div id="hint”></div>

app/assets/javascripts/application.js の内容を書き換える。

$(document).ready(function(){
 $("#field1″).blur(function(){
  if($(this).val().length>0){
   $.ajax({
    url: ‘/welcome/ajaxSample’,
    type: ‘POST’,
    datatype: ’script’,
    timeout: 1000,
    data: $(this),
    error: function(){alert(’Server Error on ajax’)},
   });
  };
 });
});

“blur” は、フォーカスを失ったとき、つまり field1 からカーソルが外へ出たときに実行される。

app/controllers/welcome_controller.rb に、"ajaxSample"アクションを追加する。

class WelcomeController < ApplicationController
 略
 def ajaxSample
  @value = Time.now
 end
end

新たに、app/views/welcome/ajaxSample.js.erb を作る。内容は以前のindex.js.erbとほぼ一緒だ。
$('#hint').html("<%= @value %>")

最後に、app/config/routes.rb に、
match "welcome/ajaxSample"
を追加しておく。

「:id => “field1″」な text_field_tag からフォーカスが別のフィールドやボタンに移ると、application.jsの「url: ‘/welcome/ajaxSample’」で指定されたアクションが実行され、ajaxSample.js.erbテンプレートにより、「<div id="hint”></div>」の値が書き換えられる。

実行するアクション(例では welcome_controllerのajaxSample)にロジックを書けば、入力値のチェックができる。これこそflymanがやりたかった事なのだ。
例えば、取引先コードを入れたら、取引先マスタを検索して取引先名称を表示する、とか。処理に時間が掛かるときは、timeoutの値を大きくすると良い。
前回のmouseoverなど、他のファンクションと組み合わせても良いだろう。


2013年3月5日(火曜日)

Rails3 でajax、マウスの動きを検知する

カテゴリー: - flyman @ 22時08分12秒
お茶の水駅
東京駅

前回は ”:remote => true” を付けるだけでajaxなアプリになったよ、って話だった。
でも、やりたいことはソレじゃない。
ということで、前回のtest01プロジェクトを書き換える。

app/views/welcome/index.html.erb の内容を消去し、以下に入れ替える。

<%= text_field_tag :field1, :id => “field1″ %><BR/>
<%= text_field_tag :field2, :id => “field2″ %><BR/>
<div id="hint”></div>

入力項目2個と、ajaxで書き換えるエリア “hint” を指定している。

app/assets/javascripts/application.js に以下を追記する。

$(document).ready(function(){
 $("#field1″).mouseover(function(){
  $(’#hint’).html("Field1のバルーンヘルプ")
 });
 $("#field1″).mouseout(function(){
  $(’#hint’).html("")
 });
 $("#field2″).mouseover(function(){
  $(’#hint’).html("Field2のバルーンヘルプ")
 });
 $("#field2″).mouseout(function(){
  $(’#hint’).html("")
 });
});

“field1″ の mouseover 時に、"hint” エリアに文言を表示
“field1″ の mouseout 時に、"hint” エリアを消す
“field2″ の mouseover 時に、"hint” エリアに文言を表示
“field2″ の mouseout 時に、"hint” エリアを消す
という処理をしている。これで、view側の text_field_tag にマウスが乗ったかどうかを監視してくれる。

app/views/welcome/index.js.erb は不要だ。welcome/index アクションの中身も不要。

$(document).ready は、view画面表示が完了してからjavascriptを有効にするおまじないらしい。Javascriptをhtml内に書いているときには意味があるが、今回はファイルを分離しているので不要かも知れない。

入力欄にマウスを乗せると、ヒントが表示される。Windowsアプリでよくやる、バルーンヘルプ的な。

でも、本当にやりたいのはコレでもないんだよなぁ。
やっぱり、ajaxもjavascriptもさ?っぱり分からない。Rails3.2 + jQuery とかの解説書、ないかなぁ。


2013年3月2日(土曜日)

一日中、目がかゆい、鼻が詰まる

カテゴリー: - flyman @ 18時29分42秒

雨上がりの朝、久しぶりにウォーキングに出た。
が、予想に反して花粉は飛んでいたようで、目鼻が酷いことに。

すでにツバメが来ているようだ。
==============================================

ちょっとajaxの検討をしている。Ruby on Railsのソフトで、画面全体の更新なしで一部だけ書き換えたいのだが……

単純なajaxは次のようにして実現できる。

まず、railsのプロジェクトを作る。
# rails new test01 -O
テストプロジェクトなので、"-O"を付けてActiveRecordは利用しない設定にしている。

gemfileに、次のようにjsランタイムを追加する。
gem ‘therubyracer’
追加したら、cd test01のあと、
# bundle install
しておく。

コントローラーを生成する。
# rails generate controller welcome index

config/routes.rbの
# root :to => ‘welcome#index’
行頭の"#"を取ってアンコメントする
さらに、public/index.html を削除しておく。

app/views/welcome/index.html.erb の内容をすべて消去し、以下を記入する。

<%= link_to “更新”, {:action => “index"}, :remote => true %>
<div id="value”></div>

1行目は、"更新"ボタン。リンク先URLは"index"、つまり再表示になる。
:remote => true だけで、ajax (jQuery)対応になる。
2行目は、ajaxデータ表示用エリアのマークだ。

あらたに、app/views/welcome/index.js.erb を作り、以下を記入する。
$(’#value’).html(”<%= @value %>")

app/controllers/welcome_controller.rb の中で @value に値をセットすれば、それが表示されるようになる。
こんな感じだ。
def index
@value = Time.now
end

リンクをクリックするとページの書き換えなしに日時が書き換わるはずだ。
――でも、勿論やりたいことはこんな事じゃない。先は長い。


2013年2月4日(月曜日)

オラクルは嫌いだ

カテゴリー: - flyman @ 20時51分37秒

そのオラクルサーバーに、CentOS上のRuby on Railsからアクセスする仕組みを検討中だ。
先週からテスト接続環境を用意して色々試していたのだが、ようやく接続まで漕ぎ着けた。まだデータへのアクセス環境がないので、コネクションの確認だけだが、長い道のりだった。
ますますオラクルが嫌いになった。

最近のお気に入りカップラーメンがこの三種。どれもセブン・アンド・アイのもの。
以前から龍上海とすみれはお気に入りだったが、最近、とみ田が加わった。
時々マイナーチェンジされる。最近の変更で麺が太くなり、コシが強くなった。
――細麺なら、同じシリーズの一風堂も美味しい。山頭火も悪くない。でも、写真の三種がインパクト強めで好きだ。

2012年12月11日(火曜日)

railsの起動に、Phusion Passengerを使う

カテゴリー: - flyman @ 22時34分28秒

Railsの開発にはAptanaStudioを使っている。動作テストはWEBRickで行っているが、mongrelを走らせようとしたところ、エラーで起動できなかった。
で、色々ググってみたがよく分からなかったので、本番環境用にはapache+passengerを使うことにした。

以下、passengerのインストールとセットアップの覚え書きだ。
なお、環境は
CentOS 6.3
ruby 1.8.7
rails 3.2.8
gem 1.8.24
Apache/2.2.15
といった感じだ。

まず、passengerのインストーラーを入れる

# gem install passenger --no-rdoc --no-ri

続いてApacheモジュールを入れる

# passenger-install-apache2-module

これは対話型のインストーラで、不足モジュールについてはインストール方法が表示されるので、指示に従う。
例えば、こんなメッセージが表示される

Welcome to the Phusion Passenger Apache 2 module installer, v3.0.18.
	
This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.
	
Here's what you can expect from the installation process:
	
 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.
	
Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.
	
Press Enter to continue, or Ctrl-C to abort.
	
--------------------------------------------
	
Checking for required software...
	
 * GNU C++ compiler... found at /usr/bin/g++
 * Curl development headers with SSL support... not found
 * OpenSSL development headers... found
 * Zlib development headers... found
 * Ruby development headers... found
 * OpenSSL support for Ruby... found
 * RubyGems... found
 * Rake... found at /usr/bin/rake
 * rack... found
 * Apache 2... found at /usr/sbin/httpd
 * Apache 2 development headers... not found
 * Apache Portable Runtime (APR) development headers... not found
 * Apache Portable Runtime Utility (APU) development headers... not found
	
Some required software is not installed.
But don't worry, this installer will tell you how to install them.
	
Press Enter to continue, or Ctrl-C to abort.
	
--------------------------------------------
	
Installation instructions for required software
	
 * To install Curl development headers with SSL support:
   Please run yum install curl-devel as root.
	
 * To install Apache 2 development headers:
   Please run yum install httpd-devel as root.
	
 * To install Apache Portable Runtime (APR) development headers:
   Please run yum install apr-devel as root.
	
 * To install Apache Portable Runtime Utility (APU) development headers:
   Please run yum install apr-util-devel as root.
	
If the aforementioned instructions didn’t solve your problem, then please take
a look at the Users Guide:
	
  /usr/lib/ruby/gems/1.8/gems/passenger-3.0.18/doc/Users guide Apache.html
#

足りないものの入れ方が表示されるので、それに従って不足モジュールをインストールする。ちなみに、apr-devel と apr-util-devel は、httpd-devel と一緒に入ったので、単独でのインストールはしなかった。
すべて入れたら、再度

# passenger-install-apache2-module

を実行する。

The Apache 2 module was successfully installed.
	
Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.18/ext/apache2/mod_passenger.so
   PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.18
   PassengerRuby /usr/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!
	
Press ENTER to continue.

『successfully installed』と表示され、無事インストールできた。
指示通り、設定ファイルに追記するが、/etc/httpd/conf.d/passenger.conf を作り、そこに追記するとすっきりする。

さらに、

Apache configuration file and set its DocumentRoot to /somewhere/public:

   <virtualhost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to ‘public’!
      DocumentRoot /somewhere/public
      <directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </directory>
   </virtualhost>

And that’s it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:
	
  /usr/lib/ruby/gems/1.8/gems/passenger-3.0.18/doc/Users guide Apache.html
	
Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl)  :-)
https://www.phusionpassenger.com
	
Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
#

と表示されるので、自分の環境に合わせて記述する。

# service httpd restart

とかしてapacheを再起動し、VirtualhostのURLにアクセスすれば、railsアプリが起動する。

railsアプリのディレクトリ所有者はroot以外にしておくことが必要。
それから、flymanの環境では、productionでは動かず、Virtualhost に『RailsEnv development
』とか書いて development環境で動かした。これについては、調査する予定だ。


2010年8月4日(水曜日)

グループウェアと戯れる

カテゴリー: - flyman @ 23時02分33秒

以前、La!cooda WIZというPHPベースのグループウェアを試したことがあった。なかなか面白いソフトだったが、その時は採用には至らなかった。

で、またまたグループウェアである。
今度はeNote for Communityという、Ruby on Railsベースのアプリを入れてみた。
ちょっと古めのデスクトップPCにCentOS5.5を入れ、後はeNoteのinstall_guide.txtの通りにソフトを入れていく。各ソフトのバージョンも指示通りのものを入れた。
”>rake db:create”
で、
FATAL : IDENT authentication failed for user “postgres”
というエラーが出たが、これはLinuxのユーザーとPostgreSQLのユーザーが違うため、IDENT認証に失敗したということらしい。
今回は/var/lib/pgsql/data/pg_hba.confの、
local  all  all  ident sameuser

local  all  all  trust
にして、ローカルからPostgreSQLへの接続は許可するようにした。
これでちゃんとeNoteが起動するようになった。

内容の確認はこれからだ。

他にも気になるフリーのグループウェアは色々あるので、暫く遊べそうだ。
『アイポ』(JAVA)
『Group Session』(JAVA)
『Thetis』(RoR)
など、有償のサポートやカスタマイズが出来るものもあり、使えるかも。

などと書いている合間に、ちょっとさわってみた。
で、いきなり次のような不満やバグ(?)が。

☆ マニュアルがない
☆ 初期ユーザー、パスワードが不明(デモと同じ、admin、passwordだった)
★ 組織マスタの第2レベルに部署を登録したが、登録画面に表示されない。従って、変更・削除が出来ない
☆ [マスタ一覧へ戻る]ボタンの位置が、マスターによってまちまち
☆ ユーザーの一括登録がない?
☆ ユーザーのLDAP認証がない?

さらに、一度登録したユーザーを削除したら Syntax error で落ちた。

ActiveRecord::StatementInvalid in Master/userController#index

PGError: ERROR: syntax error at or near “)” at character 268
: SELECT DISTINCT m_menus.* FROM “m_menus” INNER JOIN m_menu_auths ON m_menu_auths.menu_id = m_menus.id WHERE (m_menus.delf = 0 AND m_menu_auths.delf = 0 AND m_menus.public_flg = 0 AND m_menus.parent_menu_id = 0 AND m_menus.menu_kbn = 0 AND (m_menu_auths.org_cd IN () OR m_menu_auths.org_cd = ‘0′ OR m_menu_auths.user_cd = E’89006′)) ORDER BY sort_no ASC

営業日報など営業支援ツールが統合されていて面白そうなんだけど、まだちょっと、使えないなぁ
:-x


2010年4月15日(木曜日)

ruby dbi で i5 のストアド

カテゴリー: - flyman @ 21時59分14秒

結局、ruby dbiではストアドが返すパラメータ値をそのまま受け取ることは出来ないようだ。

CLPで書いたストアドプロシージャに値を渡す場合は、次のような感じで行ける。

例えば、データエリアに値をセットするCLプログラム『MYLIB.MYCLP』を作る

PGM PARM(&DATA)
DCL VAR(&DATA) TYPE(*CHAR) LEN(10)
CHGDTAARA DTAARA(MYDTAARA) VALUE(&DATA)
ENDPGM

これを呼び出すストアドプロシージャを作る
STRSQLして、

>CREATE PROCEDURE MYLIB/MYPROC(IN DATA CHAR (10))
LANGUAGE CL NOT DETERMINISTIC NO SQL
EXTERNAL NAME MYLIB/MYCLP PARAMETER STYLE GENERAL

Ruby on Rails側は、

application.rb controllerあたりで、
require ‘dbi’
しておき、

conn = DBI.connect(’DBI:ODBC:MYDSN’,'MYACCOUNT’,'MYPASSWORD’)
data = ‘1234567890′
sth = conn.prepare("CALL MYLIB.MYPROC(?)")
sth.bind_param(1, data)
sth.execute
sth.finish
conn.disconnect if conn

これで行ける。ストアドは、RPGでも、その他の言語でも書ける。

さてしかし、ストアドから値を受け取るのは、perl dbiのようには行かない。ruby dbiで値を受け取るには、SELECTなど値を返すSQLの結果データセットの形にしなければならないらしい。

取り敢えずは、返したい値をデータベースに書き込むようなストアドを書き、それを走らせた後でそのデータベースから値を取り出すようにすれば、まあやりたいことは叶う。
もう少し賢いやり方もありそうだし、そもそもdbiにこだわらなくても出来るのかもしれないが、まずはdbiを使っても、かなり高度なプログラムが書けそうなめどは立ったかな、と。

伊勢原では、梨畑の白い花が咲き誇っている。


2010年4月14日(水曜日)

ストアドが呼べないっ!

カテゴリー: - flyman @ 23時18分49秒

Ruby on Rails から、i5(AS400)上のDB2にアクセスするアプリを幾つか書いた。どれも小振りなもので、DB接続には ActiveRecordの代わりにDBI+DBD+ODBCを使っている。

さて、少し大がかりなアプリを書こうとすると、ストアドプロシージャーが有効になってくる。
特にi5では、データをDBではなくデータエリアという特殊な場所に保管したりして、Select文では取り出せなかったりする。そんな時にはi5ネイティブな言語でプログラムを書くと、それがストアドプロシージャーとして使えるので便利。
――なのだが、Ruby DBI でのストアドの使い方が判らない。ストアドへ値を渡すのは出来るのだが、値を受け取る方がサッパリ、判らない。誰か助けてくれないかなぁ(クグッてみたものの、解決せず)。

今朝は運河のポンツーン(浮き艀)の間に、カルガモが。


2010年4月9日(金曜日)

RadRailsのインストール (続き)

カテゴリー: - flyman @ 22時57分01秒

ODBCドライバ経由でDB2/400に接続するためのおまじない。

* DBIを入れる
>gem install dbi

* DBD-ODBCを入れる
>gem install dbd-odbc

* ODBC Bridgeを入れる
ここから i386-msvcrt-ruby-odbc.zip を落としてくる。
odbc.so、odbc_utf8.so を …\lib\ruby\site_ruby\1.8\i386-msvcrt ディレクトリにコピーする。

* Ruby/MySQLを入れる (おまけ)
ここのDOWNLOADから ruby-mysql-2.9.2-beta.tar.gz を落としてきて、
>ruby setup.rb

RadRailsのrubyインタープリタをJRubyからインストールしたrubyに変更した。
まあ今日は、こんなところかな。


RadRailsのインストール

カテゴリー: - flyman @ 11時10分41秒

またまたWindowsXPにRadRailsをインストールした。今回はruby1.8.7とRadRails2.0.4である。
で、どうやったか、忘れないうちに書いておこう。

* ruby を入れる
ここから、ActiveRuby.msi を落としてきて、インストールする。artonさん、ありがとう。

* PATHを通す
[コントロールパネル]の[システム]の[詳細設定]の[環境変数]の[Path]の最後に、[c:\Program Files\ruby-1.8\bin]とかを追加する。
Pathを有効にするために、PCを再起動。

>ruby -v
して、
ruby 1.8.7 (2010-01-10 patchlevel 249) [i386-mswin32]
とか表示されればOK。

* gemをアップデート
>gem update –system

* Ruby on Railsをインストール
>gem install rails

* ついでにmongrelも入れる
>gem install mongrel

* RadRailsをインストール
ここから、RadRails 2.0をダウンロード、インストールする。

* RadRailsを日本語化する
いつもお世話になっているPleiadesを頂いてくる。今回はEclipse 3.5 Galileoの、Standard All in One (JRE なし) Platform版だ。
実際のファイルは pleiades-e3.5-platform_20100226.zip だった。
これを解凍する。
eclipse¥dropinsディレクトリの中身をすべて、RadRailsをインストールしたディレクトリのdropinsへコピーする。
AptanaRadRails.iniの最後に、次の一行を書き加える。
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

ここまでやったけど、まだ動作確認はしてないんだよねぇ。まあ、ぼちぼちやるか。


54 queries. 0.075 sec.
Powered by WordPress Module based on WordPress ME & WordPress

ヘッドライン
nikkansports
IT Pro
レスポンス
テーマ選択

(4 テーマ)