coreserverのバージョンアップにともない、ruby2.3が正式に採用されています。
それに伴い、rubyのパスが変更になっていました。
過去に作って放置していたソースがエラーをはいていましたので修正です。
#!/virtual/【usernamu】/lib/ruby/bin/ruby
↓
#!/usr/local/rvm/rubies/ruby-2.3.0/bin/ruby
メモです
忘れる前に出力を。web系の情報と、趣味の情報を、ことこと、メモしていきます。 cototoco.net
仕事と勉強
coreserverのバージョンアップにともない、ruby2.3が正式に採用されています。
それに伴い、rubyのパスが変更になっていました。
過去に作って放置していたソースがエラーをはいていましたので修正です。
#!/virtual/【usernamu】/lib/ruby/bin/ruby
↓
#!/usr/local/rvm/rubies/ruby-2.3.0/bin/ruby
メモです
MySQLで自動的な連番を格納するカラム(シリアル)を作りたいとき、AUTO_INCREMENTを対象カラムに設定します。
PostgreSQLでは、設定やオプションではなくserial型としてデータ型が準備されています。
create table sample ( id SERIAL, valeu integer ) ;
create table serial_sample ( id int AUTO_INCREMENT, valeu INT );
以上です。
また、データベースを構築するときはは、フリーソフトの「A5:SQL Mk-2」が便利なのでお勧めです。
ER図やDDLを作るときも欠かせません。
A5M2でのサンプルをおいておきます。 (右クリックで保存してください)
PostgrSQL SERIAL A5M2 – サンプルファイル
MySQL AUTO_INCREMENT A5M2 – サンプルファイル
railsのようなフレームワークを使わずに、ruby単体でform(リクエスト)情報を取得する方法です。
現在のバージョン ruby 2.1 で動作確認を行っております。
cgiクラスを読込んで、cgi.newするだけで使えるので簡単です。
簡単ですが、少し気を付けたい点です。
・postもgetも、同じコードで取得できるので、意図しないgetに注意する。
・checkboxやname名が同じ要素等は、配列として渡されます。params(ハッシュに変換するメソッド)を使用してアクセスすると便利です。
・escapeHTMLメソッドで、エスケープする(XSS:クロスサイトスクリプティング対策)。
もちろん、実際に使用するときは、入力値のバリデーションも行いましょう。
require "cgi" cgi = CGI.new # リテラルの場合 # <input type="text" name="name" /> print cgi['name'] # 配列で渡される値の場合 # <input type="checkbox" name="checkbox" value="box1" /> # <input type="checkbox" name="checkbox" value="box2" /> # 個別にアクセス print cgi.params['checkbox'][0] # each でまとめてアクセス objCgi.params['checkbox'].each do |i| print i,"<br>" end # エスケープ print CGI.escapeHTML(cgi['name'])
railsのようなフレームワークを使わずに、ruby単体でリクエスト情報を取得するサンプルです。
rubyでformを取得する【サンプル】
#!/xxxx/lib/ruby の部分は環境に合わせて変更してください。
#!/xxxx/lib/ruby require "cgi" objCgi = CGI.new # リクエストを、エスケープし, 文字列は文字列化, 数値は数値化 # objCgi : CGIインスタンス # arrkeys : 配列のキー(チェックボックス等) def requestParse(objCgi, *arrkeys) require "cgi" hashResult = Hash.new arrRequestKeys = objCgi.keys arrRequestKeys.each do |key| if (arrkeys.index(key) == nil) then temp = CGI.escapeHTML(objCgi[key].to_s.strip) if ( /^([0-9])+$/ =~ temp ) then temp = temp.to_i end else # 配列の時 arrValue = objCgi.params[key] temp = Array.new arrValue.each do |value| val = CGI.escapeHTML(value.to_s.strip) if ( /^([0-9])+$/ =~ val ) then val = value.to_i end temp << val end end hashResult[key] = temp end return hashResult end # リクエスト(post,get)と、配列のネームを渡します。 arrRequests = requestParse(objCgi, "checkbox", "checkbox2") # チェックボックス判定 def checkflag(array, value) check = "" if (array.class == Array and array.index(value) != nil) then check = "checked" end return check; end print <<"HERE" Content-Type: text/html <!DOCTYPE html> <html lang="ja" xml:lang="ja"> <head> <meta charset="UTF-8"> <title>rubyでformを取得する【サンプル】</title> </head> <body> <form action="#" method="post"> <p>name : val1</p> <input type="text" name="val1" value="#{arrRequests['val1']}" /> <p>name : val2</p> <input type="text" name="val2" value="#{arrRequests['val2']}" /> <p>name : radio</p> <input type="radio" name="radio" value="radio1" #{ "checked" if arrRequests["radio"] == "radio1"} />radio <input type="radio" name="radio" value="radio2" #{ "checked" if arrRequests["radio"] == "radio2"} />radio2 <input type="radio" name="radio" value="radio3" #{ "checked" if arrRequests["radio"] == "radio3"} />radio3<br /> <br /> <p>name : checkbox</p> <input type="checkbox" name="checkbox" value="momo" #{checkflag(arrRequests["checkbox"], 'momo')} />momo <input type="checkbox" name="checkbox" value="hana" #{checkflag(arrRequests["checkbox"], 'hana')} />hana <input type="checkbox" name="checkbox" value="kuri" #{checkflag(arrRequests["checkbox"], 'kuri')} />kuri <input type="checkbox" name="checkbox" value="2929" #{checkflag(arrRequests["checkbox"], 2929)} />2929<br /> <br /> <p>name : checkbox2</p> <input type="checkbox" name="checkbox2" value="1" #{checkflag(arrRequests["checkbox2"], 1)} />1 <input type="checkbox" name="checkbox2" value="2" #{checkflag(arrRequests["checkbox2"], 2)} />2 <input type="checkbox" name="checkbox2" value="3" #{checkflag(arrRequests["checkbox2"], 3)} />3 <input type="checkbox" name="checkbox2" value="4" #{checkflag(arrRequests["checkbox2"], 4)} />4<br /> <br /> <p>name : textbox</p> <textarea name="textbox" rows="10" cols="50">#{arrRequests['textbox']}</textarea> <br /> <input type="submit" name="submit" value="送信" /> </form> HERE print "</body></html>\n"
よく使うMySQLのデータ型を記載しましたが、それ以外の選択肢として「個人的にこの中から選べばいいかな?」と言うデータ型を抜粋しました。
・INT型
バイト : 4
範囲 : -2147483648 ~ 2147483647
: 0 ~ 4294967295
・BIGINT型
バイト : 8
範囲 : -9223372036854775808 ~ 9223372036854775807
: 0 ~ 18446744073709551615
・DECIMAL(デシメル)型
DECIMAL(M,D)
・DECIMAL(20, 10) は、整数部10桁、小数部10桁の合計20桁
・M は最大桁数(精度)。1から65(桁)までの範囲が指定できる。
・D は少数点の桁数。0から30までの範囲がつかえて、D < M でないといけない。
・数値計算が65桁は正確(float型みたいな誤差がない)
・計算コストが高い(遅いらしい)
注) DECIMAL型は、MySQLのバージョンによって違いがあるみたいです(↑は5.1のマニュアルより)。古いバージョンの MySQL では、1から254までの範囲
・CHAR型
固定長
CHAR(M) : Mは255文字まで
・VARCHAR型
可変長
VARCHAR(M) : Mは文字数を指定、最大0から65,535バイトまでを指定できる。utfj8mb4の場合、1文字4byteなので、Mの最大値は16,384(調査していないので、実際値ではないと思います。)
・TEXT型
最大長は 65,535バイト
TEXT型はVARCHAR型でバイト数を指定しなかったものと考えてよいそうです。utfj8mb4の場合、16,384文字ぐらい?
TEXT型で足りないときは、MEDIUMTEXT(16,777,215バイト),LONGTEXT(最長4,294,967,295、または4GBバイト)
・FLOAT型
バイト : 4
範囲 : -3.402823466E+38 ~ -1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466E+38
・DOUBLE型
バイト : 4
範囲 : -1.7976931348623157E+308 から -2.2250738585072014E-308, 0, 2.2250738585072014E-308 から 1.7976931348623157E+308
・DATETIME型
バイト : 8
形式 : ‘0000-00-00 00:00:00’
範囲 :’1000-01-01 00:00:00′ ~ ‘9999-12-31 23:59:59’
・TIMESTAMP型
バイト : 4
形式 : ‘0000-00-00 00:00:00’
範囲 :’1970-01-01 00:00:00′ ~ ‘2038-01-19 03:14:07’
MySQL :: MySQL 5.1 リファレンスマニュアル :: 22.2 DECIMAL データ タイプの変更
MySQL :: MySQL 5.5 Reference Manual :: 11.3.1 The DATE, DATETIME, and TIMESTAMP Types
下記の関数「foo3」について
foo3に、引数を一つ渡した場合、arrの形が知りたかったので、関数定義についてまとめました。
結果は、配列として帰ってきていました。
# 基本 def foo(name) puts name end # 初期値 def foo2(name = "momo") puts name end # 引数の数を不定 def foo3(a, *arr) print [a, arr] end # 引数の数を不定 ver2 def foo4(a, *arr, b) p a, arr, b end foo("hogehoge") # => hogehoge foo2() # => momo foo2("hogehoge") # => hogehoge foo3(1) # => [1, []] foo3(1, 2, 3, 4, 5) # => [1, [2, 3, 4, 5]] # foo4(1) # エラー foo4(1, 2, 3, 4, 5) # => [1, [2, 3, 4], 5]
# 引数にキーワード def foo5(x: 0, y: 0, z: 0) print "x:", x," y:", y," z:", z end # 引数にキーワード(配列) def foo6(x: 0, y: 0, z: 0) p x[1] end # 引数にキーワード(配列) def foo7(x: 0, y: 0, z: 0, **arr) p [x, y, z, arr] end foo5(y: 2, x: 1, z: 3) # => x:1 y:2 z:3 foo5(y: 4) # => x:0 y:4 z:0 foo6(x: [5, 6]) # => 6 foo7(x: 2, v: 3, z: 4, w: 5) # => [2, 0, 4, {:v=>3, :w=>5}]