2009年03月15日

正規表現で数値を3桁毎のカンマ区切り形式に変換(Ruby編)

正規表現で数値を3桁毎のカンマ区切り形式に変換(Ruby編)

text = "12345678901234567"
puts text.gsub(/(\d)(?=(\d{3})+(?!\d))/, '\1,')

//↓
//12,345,678,901,234,567
//になります。
//参照:
//http://www.ruby-lang.org/ja/man/html/_C0B5B5ACC9BDB8BD.html#a.a5.b5.a5.f3.a5.d7.a5.eb
posted by 台北猫々 at 21:45| Comment(2) | TrackBack(0) | 技術メモ(Ruby)

2008年12月04日

渡された文字列に半角カタカナがあるか?のチェック(Ruby編)


#文字列に半角カタカナが存在するか?
#Rubyの正規表現を使用して、渡された文字列に半角カタカナがあるかチェックします。(UTF-8向け)
#Ruby 正規表現 半角カタカナ UTF8
str = "aaaaアあああああ";
if str =~ /(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])/
puts Kconv.tosjis("文字列に半角カタカナが存在する")
else
puts Kconv.tosjis("文字列に半角カタカナが存在しない")
end
#↓
#"文字列に半角カタカナが存在する"
posted by 台北猫々 at 21:28| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年12月01日

なさそうで、ある?

Rubyって、なんとなくデータ型を意識しないようなイメージですが、実際にはしっかりとあるんですね。こんな感じに、

i = 1 #iには数値型のインスタンスが設定

if i == 1 #「1」は数値型のインスタンスなので、これは同値
  puts "同じです。"
end

i = "1" #iには文字列型のインスタンスが設定

if i != 1 #「1」は数値型のインスタンスなので、これは比較が正しく行われない。
  puts "違います"
end

要は動的データ型定義ということですですが、データ型の違いを吸収してはくれないのですよね。

これって、自分が作っていないメソッドから渡されてきた変数を対象に処理を書く場合に、ちょっと面倒ですよね(例えば変数に値「1」が入っているとして、それが数値型オブジェクトなのか、文字列型オブジェクトなのかは、すぐには分からないですから)。
posted by 台北猫々 at 22:04| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月27日

SAStrutsのf:labelをRuby on Railsに移植しました。

Railsのapplication_helper.rbに追加するヘルパーメソッドです。
Rubyの動的メソッド呼び出しを利用して、ビューの中で「id」 →「名前」の変換を行います。

※SAStrutsのf:label(http://sastruts.seasar.org/featureReference.html#JSP)をRailsに移植しました。

実際の使用例はこちらでどうぞ→「Ruby on Railsあれこれ:複数従業員情報の一括削除(http://code.nanigac.com/source/wiki/view_title/641/%E8%A4%87%E6%95%B0%E5%BE%93%E6%A5%AD%E5%93%A1%E6%83%85%E5%A0%B1%E3%81%AE%E4%B8%80%E6%8B%AC%E5%89%8A%E9%99%A4)」

posted by 台北猫々 at 22:06| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月25日

Rails2.1.2(actionpack-2.1.2)のバグ?

submit_tagのオプションでダブルクリック防止のための":disable_with"がありますが、このオプションを付けた時に出力されるJavascriptがIE(6と7で確認)でエラーになってしまいます。(ただしFireFox3では大丈夫)

実際に出力されるスクリプトは↓なのですが、


<input name="commit" onclick="
if (window.hiddenCommit) {
window.hiddenCommit.setAttribute('value', this.value);
}
else {
hiddenCommit = this.cloneNode(false);
hiddenCommit.setAttribute('type', 'hidden');
this.form.appendChild(hiddenCommit);
}
this.setAttribute('originalValue', this.value);
this.disabled = true;
this.value='検索処理中...';
result = (this.form.onsubmit ? (this.form.onsubmit() ? this.form.submit() : false) : this.form.submit());
if (result == false) {
this.value = this.getAttribute('originalValue');
this.disabled = false;
}
return result;"
type="submit" value="検索" />

この中で、

hiddenCommit.setAttribute('type', 'hidden');

がエラーになります。

で、W3CのDOM Level1仕様
http://www.w3.org/TR/REC-DOM-Level-1/level-one-html.html#ID-798055546
の「Interface HTMLInputElement」を見ると、type属性はreadonlyなんですよね。

ということはFireFox3で動作しているのがたまたまで、本来のDOM仕様的には動作しない方(IEのエラー)が正しいということでしょうか?

":disable_with"オプション付与時の処理は、
actionpack-2.0.2 → actionpack-2.1.1 → actionpack-2.1.2
で、改造されてきているようですが、この問題の処理が組み込まれたのはactionpack-2.1.2からでした。

#該当ファイルは、
#actionpack-2.x.x\lib\action_view\helpers\form_tag_helper.rb

ともあれ、IEでの動作確認を全くしないで組み込んでいるとしか思えないですね。「がっくし」しちゃいます・・・
posted by 台北猫々 at 21:48| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月23日

Ruby on Railsのチュートリアル〜チェックボックス

コードなにがしの「Ruby on Railsあれこれ」にも投稿していますが、こちらにも。


目次


●概要
●サンプルのポイント
●サンプルの使い方
●ファイル構成
●ビュー(画面)
●コントローラー

内容


概要


チェックボックスを扱うアプリケーションです。

入力画面(index.html.erb)
tutorial_ajax_1.jpg

結果画面(index.html.erb)
tutorial_ajax_2.jpg

サンプルのポイント


・チェックボックスのデフォルト状態(チェックON/OFF)の操作

サンプルの使い方


サンプルはあらかじめ用意していないので、以降の項目を参照にして、自分で作成しなければいけません。作成後に、ブラウザからhttp://127.0.0.1:3000/check_boxにアクセスしましょう(ポート番号"3000"は適宜、環境に応じて読み替えて下さい)。

ファイル構成


本項で作成するファイル
ファイル名種類
index.html.erbビュー
check_box_controller.rbコントローラー


ビュー(画面)


入力画面、兼、結果画面を作成しましょう。
"ror-tutorial\app\views\check_box\index.html.erb"ファイルを以下の内容で作成します。

<html>
<head>
<title>Tutorial: Checkbox index</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<%= stylesheet_link_tag 'ror' %>
</head>
<body>
<h2>Tutorial: Checkbox index</h2>

<% form_tag :action => 'submit' do %>
<%= check_box_tag 'check1', "1", @check1 %>check1
<%= check_box_tag 'check2', "1", @check2 %>check2<br />

<%= submit_tag "サブミット" %>
<% end %>
</body>
</html>


コントローラー


"ror-tutorial\app\controllers\check_box_controller.rb"ファイルを以下の内容で作成します。

class CheckBoxController < ApplicationController

#入力画面表示
def index
@check2 = true
render :action => 'index.html.erb'
end

#結果画面表示
def submit
@check1 = false
@check2 = false
render :action => 'index.html.erb'
end

end


posted by 台北猫々 at 17:14| Comment(3) | TrackBack(0) | 技術メモ(Ruby)

2008年11月22日

Ruby on Railsのチュートリアル〜Ajax

コードなにがしの「Ruby on Railsあれこれ」にも投稿していますが、こちらにも。


目次


●事前準備
●概要
●サンプルのポイント
●サンプルの使い方
●ファイル構成
●ビュー(画面)
●コントローラー

内容


事前準備


JQueryの準備


"ror-tutorial\public\javascripts"フォルダにJQueryサイトからJQueryファイルをダウンロードして"jquery.js"にリネームしてコピーします。

概要


Ajaxを行うアプリケーションです。

入力画面(index.html.erb)

tutorial_ajax_1.jpg


結果画面(index.html.erb)

tutorial_ajax_2.jpg

サンプルのポイント


・JQueryを使用してAjaxします。

サンプルの使い方


サンプルはあらかじめ用意していないので、以降の項目を参照にして、自分で作成しなければいけません。作成後に、ブラウザからhttp://127.0.0.1:3000/ajaxにアクセスしましょう(ポート番号"3000"は適宜、環境に応じて読み替えて下さい)。

ファイル構成


本項で作成するファイル

ファイル名種類
index.html.erbビュー
ajax_controller.rbコントローラー


ビュー(画面)


入力画面、兼、結果画面を作成しましょう。
"ror-tutorial\app\views\ajax\index.html.erb"ファイルを以下の内容で作成します。

<html>

<head>
<title>Tutorial: Ajax</title>
<%= stylesheet_link_tag 'ror' %>
<%= javascript_include_tag "jquery" %>
</head>
<body>


<h2>Tutorial: Ajax</h2>
<span id="message"></span><br />
<input type="button" value="hello" onclick="$('#message').load('/ajax/hello');"/>

</body>
</html>


コントローラー


"ror-tutorial\app\controllers\ajax_controller.rb"ファイルを以下の内容で作成します。

class AjaxController < ApplicationController

#初期画面表示
def index
render :action => 'index.html.erb'
end

#Ajaxで文字列データを返す
def hello
render :text => "こんにちは"

end

end


posted by 台北猫々 at 09:43| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月20日

Ruby on Railsのチュートリアル〜足し算

コードなにがしの「Ruby on Railsあれこれ」にも投稿していますが、こちらにも。


目次


●事前準備
●概要
●サンプルのポイント
●サンプルの使い方
●ファイル構成
●ビュー(画面)
●モデル(ActiveForm)
●コントローラー

内容


事前準備


プラグインの準備


Ruby on Railsのチュートリアルの前準備」を参考にして、Eclipseプロジェクトを作成して下さい。

色々なプラグインの「4 アクティブフォーム(ActiveForm)」をインストールして下さい(既にされていれば、再インストール必要はありません)。

概要


足し算を行うアプリケーションです。

入力画面(index.html.erb)
tutorial_add_1.jpg

結果画面(index.html.erb)
tutorial_add_2.jpg

サンプルのポイント


・データベース(ActiveRecord)を使用しない場合に、ActionFormを使用してバリデーションを行います。

サンプルの使い方


サンプルはあらかじめ用意していないので、以降の項目を参照にして、自分で作成しなければいけません。作成後に、ブラウザからhttp://127.0.0.1:3000/addにアクセスしましょう(ポート番号"3000"は適宜、環境に応じて読み替えて下さい)。

ファイル構成


本項で作成するファイル
ファイル名種類
index.html.erbビュー
add.rbモデル
add_controller.rbコントローラー


ビュー(画面)


入力画面、兼、結果画面を作成しましょう。
"ror-tutorial\app\views\add\index.html.erb"ファイルを以下の内容で作成します。

<html>
<head>
<title>Tutorial: Add</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<%= stylesheet_link_tag 'ror' %>
</head>
<body>
<h2>Tutorial: Add</h2>

<%# バリデーションエラーがある場合はメッセージが表示されます%>
<%= error_messages_for 'add' %>

<%# /add/calculateにサブミットします%>
<% form_tag :action => 'calculate' do %>
<%# addオブジェクトのarg1プロパティに対応します%>
<%= text_field(:add, :arg1) %> +
<%= text_field(:add, :arg2) %>
=<%=h @result %><br />

<%= submit_tag "サブミット" %>
<% end %>
</body>
</html>


モデル(ActiveForm)


ActiveFormを継承したモデルを作成します。リクエストパラメータのバリデーションに使用します。

"ror-tutorial\app\models\add.rb"ファイルを以下の内容で作成します。

class Add < ActiveForm
attr_accessor :arg1, :arg2
validates_presence_of :arg1, :arg2, :message => "を入力して下さい"
end

コントローラー


"ror-tutorial\app\controllers\add_controller.rb"ファイルを以下の内容で作成します。

class AddController < ApplicationController

#入力画面表示
def index
render :action => 'index.html.erb'
end

#結果画面表示
def calculate
#リクエストデータをモデル(ActiveForm)にコピーします。
@add = Add.new(params[:add])

#入力値が正常の場合は、計算を行う。
@result = @add.arg1.to_i + @add.arg2.to_i if @add.valid?
render :action => 'index.html.erb'
end

end


posted by 台北猫々 at 00:07| Comment(1) | TrackBack(0) | 技術メモ(Ruby)

2008年11月13日

粛々と

コードなにがしに投稿している「Ruby on Railsあれこれ」に、「Ruby on Railsのチュートリアル集」を粛々と追記しています。

「Ruby on RailsによるWebアプリケーションスーパーサンプル 」を投稿していて、Railsの基本をもっと押さえておかないといかんなぁと思いまして、SAStrutsのチュートリアルをRailsに移植するのが良い教材になるかなと思いまして、進めています。

今現在は、
1. Ruby on Railsのチュートリアルの前準備
2. 足し算
3. Ajax
4. チェックボックス
5. ダウンロード
6. 繰り返し
7. ボタンを使った繰り返し
8. 選択リスト
まで投稿していますよ〜

posted by 台北猫々 at 21:35| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月06日

Railsで複数情報一括登録時のバリデーションってこうやるの?

昨日書いた「Railsで複数情報一括登録時のバリデーションってどうやるの?」は、なんとかできました。

コードなにがしの「Ruby on Railsあれこれ」の「複数情報一括登録フォームのバリデーション」にアップしました。

あんまりスマートには出来ませんでしたが、今の私ではこんなものかも(Rails力がまだまだなので)。

(2008.12.02)もっと良いやり方がわかったので、コードになにがしの「複数従業員情報の一括更新」にアップしました。
posted by 台北猫々 at 21:10| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年11月05日

Railsで複数情報一括登録時のバリデーションってどうやるの?

こんな↓感じにしたいのです。
20081105.jpg

複数の情報を入力して、一括してデータベースに登録できるようにして、入力値エラーがある場合は、該当するテキストボックスがハイライト表示するような。

まあ、業務システムのマスタメンテナンス系の画面にありがちな仕様です。

とりあえずGoogle海に潜ってみたのですが、情報が少ない、というより無いに等しい。。。分かったことは標準機能ではできないようだということ。う〜ん、Strutsなら標準機能で簡単にできるのですが。(2008.12.02)

しかし、話題の多さの割りにRailsは情報が少ないですねぇ。

(2008.12.02)嘘です。できますね。やり方がわかったので、コードになにがしの「複数従業員情報の一括更新」にアップしました。
posted by 台北猫々 at 22:35| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年10月22日

渡された文字列に非半角数字があるか?のチェック(Ruby編)


#渡された文字列に非半角数字があるか?
#Rubyの正規表現を使用して、渡された文字列に非半角数字があるかチェックします。
#Ruby 正規表現 非半角数字
str = "0123456789a";
if str =~ /[^0-9]/
puts Kconv.tosjis("文字列に半角数字でない文字が存在する")
else
puts Kconv.tosjis("文字列に半角数字でない文字が存在しない")
end
#↓
#"文字列に半角英字でない文字が存在する"

posted by 台北猫々 at 19:06| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年10月20日

渡された文字列に非半角英字があるか?のチェック(Ruby編)


#渡された文字列に非半角英字があるか?
#Rubyの正規表現を使用して、渡された文字列に非半角英字があるかチェックします。(UTF-8向け)
#Ruby 正規表現 非半角英字 UTF8
str = "abcdefghijklmnopqrstuvwxyz";
if str =~ /[^A-Za-z]/
puts Kconv.tosjis("文字列に半角英字でない文字が存在する")
else
puts Kconv.tosjis("文字列に半角英字でない文字が存在しない")
end
#↓
#"文字列に半角英字でない文字が存在しない"
posted by 台北猫々 at 18:29| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年08月30日

渡された文字列に非ASCII文字があるか?(Ruby編)


#渡された文字列に非ASCII文字があるか?
#Rubyの正規表現を使用して、渡された文字列に非ASCII文字があるかチェックします。(UTF-8向け)
#Ruby 正規表現 非ASCII文字 UTF8
str = " abcdefghijklmnopqrstuvwxyz!#$&'()[]@";
if str =~ /[^\x20-\x7E]/
puts Kconv.tosjis("文字列にASCII文字でない文字が存在する")
else
puts Kconv.tosjis("文字列にASCII文字でない文字が存在しない")
end
#↓
#"文字列にASCII文字でない文字が存在しない"

posted by 台北猫々 at 22:31| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年08月11日

正規表現で、文字列は全て全角文字か?のチェック(Ruby編)


#全て全角文字か?
#Rubyの正規表現で、渡された文字列が全て全角文字かチェックします。(UTF-8向け)
#Ruby 正規表現 全角文字 UTF8
str = "ABCDEFXYZあいうえおカキクケコ@!+*_"
if str !~ /(?:\xEF\xBD[\xA1-\xBF]|\xEF\xBE[\x80-\x9F])|[\x20-\x7E]/
puts Kconv.tosjis("すべてが全角である")
else
puts Kconv.tosjis("すべてが全角ではない")
end
#↓
#"すべて全角である"

posted by 台北猫々 at 22:06| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年07月19日

Rubyで1970/1/1からの経過日数を求める

(y, m, d) = "2008/7/11".split(/\//)

target_sec = Time.mktime(y, m, d).to_i

oneday_sec = 24 * 60 * 60

pass_days = (target_sec / oneday_sec).ceil

p pass_days
posted by 台北猫々 at 23:50| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年06月15日

Rubyで階層のあるディレクトリを走査する

色々な手段が用意されています♪


方法1〜自力編〜


# dir : サーチするディレクトリ
# depth : 階層の深さ(tabインテンドの表示数)
def my_walk(dir, depth)
Dir.foreach(dir){|name|
if name != '.' and name != '..' then

path = File.join(dir,name)

case File.ftype(path)
when "file"
puts "\t" * depth + path
when "directory"
puts "\t" * depth + path + "/"
my_walk(path, depth+1)
end
end
}
end

my_walk("C:\\usr\\local\\share", 0)


方法2〜ライブラリ編〜

require 'find'
Find.find() do |f|
puts "#{f}"
end


方法3〜正規表現ワイルドカード編〜

Dir.glob("C:/usr/local/share/**/") { |name|
puts name
}



posted by 台北猫々 at 21:24| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年06月12日

正規表現で、文字列は全て半角英数字か?のチェック(Ruby編)


#全て半角英数字か?
#Rubyの正規表現で、渡された文字列が全て半角英数字かチェックします。(UTF-8向け)
#Ruby 正規表現 半角英数字 UTF8
str = "abcdefghijklmnopqrstuvwxyz0123456789";
if str =~ /^[0-9A-Za-z]+$/
puts Kconv.tosjis("すべてが半角英数字である")
else
puts Kconv.tosjis("すべてが半角英数字ではない")
end
#↓
#"すべて半角英数字である"


posted by 台北猫々 at 20:55| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年06月10日

Rubyで外部プログラムを実行し、結果を取得する


IO.popen('ls -l', 'r+') { |io|
io.read.each { |line|
puts line
}
}

posted by 台北猫々 at 20:33| Comment(0) | TrackBack(0) | 技術メモ(Ruby)

2008年06月02日

正規表現で、文字列は全て全角ASCIIか?のチェック(Ruby編)


#全て全角ASCIIか?
#Rubyの正規表現で、渡された文字列が全て全角ASCIIかチェックします。(UTF-8向け)
#Ruby 正規表現 全角ASCII UTF8
str = "ABCDEFGHIJK1234567890!#$"
if str =~ /^(?:\xEF\xBC[\x81-\xBF]|\xEF\xBD[\x80-\xA0])+$/
puts Kconv.tosjis("すべてが全角ASCIIである")
else
puts Kconv.tosjis("すべてが全角ASCIIではない")
end
#↓
#"すべて全角ASCIIである"

posted by 台北猫々 at 21:28| Comment(0) | TrackBack(0) | 技術メモ(Ruby)