rubyの文字列連結ではまった

rubyで文字列を連結するとき、"+="と"<<"(concat)で追加する方法がある。
"+="で連結するより"<<"(concat)で連結するほうが速度が早いという記述を見つけたので使用していたところ、はまった。

"+="のパターン

ABC = "FOO"
text = ABC
text += "BAR"

# 出力はもちろんFOO
puts ABC


"<<"のパターン

ABC = "FOO"
text = ABC
text << "BAR"

# 出力はFOOBAR
puts ABC

"<<"を使うと参照元も変えられちゃうみたい。

rubyでAS/400接続

DBI(データベースインターフェース)とDBD(データベースドライバ)を利用してODBC接続する。
DBIとDBDについては以下参照。
http://www.jiubao.org/ruby-dbi/ruby-dbi.html

1. ODBCデータソースの作成

iSeries Access ODBC Driverでシステムデータソースを作成
その際にSQLデフォルトライブラリに使いたいライブラリを記述

2. DBIとDBDのgemインストール
gem install dbi
gem install dbd-odbc

3. 接続してみる

require 'odbc'
require 'dbi'

conn = DBI.connect('DBI:ODBC:ODBC接続名', 'AS400ユーザ名', 
'AS400パスワード')
stmt = conn.prepare('実行したいSQL')
stmt.execute

ざっくりこんな感じ。詳細は冒頭のリンク参照。

UbuntuServer12にnode.jsをインストール

UbuntuServer12をインストールしたての状態からnode.jsをインストールするメモ。

1.aptitudeインストール

sudo apt-get install aptitude

2.ビルドに必要なライブラリインストール

sudo aptitude install gcc
sudo aptitude install g++
sudo aptitude install make

3.node.jsの取得

wget http://nodejs.org/dist/v0.10.22/node-v0.10.22.tar.gz

4.node.jsビルド/インストール

make

./configure
make
sudo make install

以下コマンドでインストールを確認。

node -v

5.npmをインストール

sudo curl -k https://npmjs.org/install.sh | sudo sh

以下コマンドでインストールを確認。

npm -v

ASPで「型が一致しません」

Dim amount
amount = 0


'中略 xにはDBから取得した数値
add(x)

Sub add(x)
  amount = amount + x
End Sub

■原因
こんなようなことを仕様としたら「型が一致しません」というエラーがでた。
ASP(VBScript)ではadNumericの計算で上記のエラーが起こるらしい。

■対策
CInt()なりCDbl()なりで変換してから計算する。

Dim amount
amount = 0


'中略 xにはDBから取得した数値
add(x)

Sub add(x)
  amount = CInt(amount) + CInt(x)
End Sub


参考: Microsoftサポート
http://support.microsoft.com/kb/195180/ja

正規表現 POSIX文字クラス

PHPで半角英数字とハイフン、アンダーバー等の半角記号をOKとする様なチェックを作った。
正規表現ちょー苦手なので、何処かからコピってきて

preg_match("/[a-zA-Z0-9!-/:-@\[-`{-~]+$/", $value);

とやってたんだけど、見辛いしあってるかどうかよく分かんない。

その後、Google先生の元で泳いでたらPOSIX文字クラスというものを発見。
POSIX(Portable Operating System Interface)は移植性を高めた共通API規格のことらしい。
上記の正規表現POSIX文字クラスで表すと、

preg_match("/^[[:alnum:][:punct:]]+$/", $value)

半角英数字の[a-zA-Z0-9]は[:alnum:]で表現、
半角記号は[:punct:]で表現される。
最初に書いた表現よりよっぽど見やすいし分かりやすい。
POSIX文字クラスには他にもいろいろあるみたい。

POSIX文字クラスについては以下のリンクを参考にさせていただきました。
http://www.y2sunlight.com/water/webman/php1/1J.3.html

RubyでExcel操作(spreadsheet)

Excelを読み取り内容をDBに格納するプログラムを書くのに
Javaのpoiで行こうかと思ったけれど、poiは数値フィールドをdoubleとして取得するため、
「23」という値が23.0となってしまう。
今回のデータでは「23.0」と「23」を明確に分けて取得する必要があるためpoiは却下。
Rubyのspreadsheetというgemを使ってみたらびっくりするぐらい簡単に取得できたのでメモ。

require 'rubygems'
require 'spreadsheet'

xls = Spreadsheet.open('excel.xls', 'rb')
sheet = xls.worksheet(0)

puts sheet[0, 0]

こんだけ。
まず、spreadsheetのgemをインストール

gem install 'spreadsheet'

Spreadsheet.openでエクセルを取得し、
xls.worksheet(0)で0番目のシートを取得。

sheet[0, 0]で0行0列を取得。
いとも簡単に「23」が取得できた。

で、OKかと思いきや今度はExcel内の関数評価に問題有り。
sheet[0, 0]でcellに関数が入っている場合はSpreadsheet:formulaが取得できるので、
formulaのメソッドvalueを叩けば良い。

sheet[0, 0].value

ただし、評価の仕方が問題で、cellに「=ROUNDUP(100/3, 3)」という関数が入っていた場合、
Excel上では「33.333」になるのに対して、spreadsheetで取得できた値は「33.333999999999996」。
コレでは使いものにならない....

次はPHPのPHPExcelを試そう。