月別アーカイブ: 2014年5月

ruby

Ruby 配列の操作

配列の操作

ドットインストールのRuby入門をみて、
Rubyの配列操作が新鮮だったので、覚える自信がないのでメモ

配列

array = [3, 4, 7]
p array[1] # => 4
array[1] = 10
p array # => [3, 10, 7]
p array[0..2] # => [3, 10, 7] 0 ~ 2 まで (*1
p array[0...2] # => [3, 10] 0 ~ 2 未満 (*1
p array[-1] # => 7 最後の要素
p array[1, 2] # => [10, 7] 1番目の要素から、2個分とってくる

配列操作

array2 = [6, 3, 8, 10]
array2[0...2] = [7, 1] # 0~2未満を書き換える
p array2 # => [7, 1, 8, 10]
array2[1, 0] = [14, 26, 22] # 一番目の要素から、0番目の要素に、追加する
p array2 # => [7, 14, 26, 22, 1, 8, 10]
array2[0, 2] = [] # 0~2個までを空にする
p array2 # => [26, 22, 1, 8, 10]

配列メソッド

p array2.size # => 5 サイズ
p array2.sort # => [1, 8, 10, 22, 26] 小さい順に出力
p array2.sort.reverse # => [26, 22, 10, 8, 1] 小さい順を逆順に出力
p array2 # => [26, 22, 1, 8, 10] 元の配列は変わっていない
p array2.push(100) # => [26, 22, 1, 8, 10, 100] 末尾に追加
array2 << 101 << 201 # 末尾に追加のショートカット
p array2 # => [26, 22, 1, 8, 10, 100, 101, 201]

配列メソッドについては、もう少し詳しく次回まとめます

配列の演算

Rubyは配列どうしの演算(演算というより集合)ができます。

arr1 = [1, 2, 4]
arr2 = [2, 4, 6]

# 共通部分(and演算)
p arr1 & arr2 # => [2, 4]
# 和集合(or演算)
p arr1 | arr2 # => [1, 2, 4, 6]
# 差
p arr1 - arr2 # => [1]
# 和
p arr1 + arr2 # => [1, 2, 4, 2, 4, 6]

配列を変数に分割

関数の戻り値で配列を返す時などに便利です。phpでのlist関数みたいな感じです。

def data_back
    return data = [ "apple", 100 ]
end
name, price = data_back
p name # => "apple"
p price # => 100

*1)『..』と『…』は『範囲オブジェクト』というオブジェクトを作る記号です
こんな使い方もできます。日本語はヤバイです。

# to_a : 配列に変換する
arrTemp = (1..10).to_a
p arrTemp # => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
arrTemp = ("a".."g").to_a
p arrTemp # => ["a", "b", "c", "d", "e", "f", "g"]
arrTemp = ("え".."く").to_a
p arrTemp # => ["え", "ぉ", "お", "か", "が", "き", "ぎ", "く"]

Rubyで二Ruby入門 (全23回) – プログラミングならドットインストール

ruby

Ruby 配列の初期化と多重配列

環境もそろってきたので、記述のメモなど残していきます。

配列に関すること

宣言

arr = Array.new()
arr = Array.new # 等価
arr = [] # 等価
p arr # []

初期化

hoge_0 = [1,2,3]
p hoge_0 # => [1, 2, 3]
hoge_1 = [[1,2,3],[4,5,6]]
p hoge_1 # => [[1, 2, 3], [4, 5, 6]]

rubyなら出来そうで出来ない初期化、以前のversionではOK?

hoge_2[] = "hoge" # => エラー
hoge_3[0] = "hoge" # => エラー

new での初期化

arr = Array.new()
p arr # => []

arr = Array.new(3)
p arr # => [nil,nil,nil]

arr = Array.new(3, 1)
p arr # => [1,1,1]
arr[1] = 2
p arr # => [1, 2, 1]

ランダム値の初期化を考える

arr = Array.new(3, rand(1..9))
p arr # => [x,x,x] 要素が同じ値に(上記l.8参照)なってしまうので、ブロックを用いる

arr = Array.new(3){ rand(1..9) }
p arr # => [x,y,z] 要素3こが1~9のランダムな値

多次元配列の宣言の前に注意点!
このように書いてしまうとおかしなことになる

arr = Array.new(3,Array.new(3))
arr[1][1] = 2
p arr # => [[nil, 2, nil], [nil, 2, nil], [nil, 2, nil]]

上は、a[1][1]の要素を変更したのに、その他の配列(object)も変更されています。
参考 Rubyで二次元配列の初期化 – simanmanのブログ

オブジェクトのIDを確認すると、同じ値となっています。

p arr.map(&:object_id) # => [17525590, 17525590, 17525590]

多次元配列はブロックを使用して宣言する。
ランダム値の初期化の時と同様に、ここでもブロックを使います。

arr = Array.new(3){ Array.new(3) }
arr = Array.new(3).map{ Array.new(3) } # 同意 mapメソッドは、要素の数だけ繰り返しブロックを実行
p arr # => [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
arr[1][1] = 2
p arr # => [[nil, nil, nil], [nil, 2, nil], [nil, nil, nil]]

上のように宣言することで、arr[1][1]の値のみ変更されます。
また、オブジェクトIDを確認すると、それぞれのオブジェクトとなっています。

p arr.map(&:object_id) # => [17918240, 17918230, 17918220]

多次元配列を初期化する
ランダム値の初期化の時と同様に、ここでもブロックを使います。

arr = Array.new(3){ Array.new(3, 1) }
p arr # => [[1, 1, 1], [1, 1, 1], [1, 1, 1]]

arr = Array.new(3){ |i| Array.new(3){ |j| i+j } }
p arr # => [[0, 1, 2], [1, 2, 3], [2, 3, 4]]

Rubyで二次元配列の初期化 – simanmanのブログ

ruby

windows版 Rubyのインストール

Rubyをwindowsにインストールする手順です。
Rubyはサーバーがなくても、ローカル(windows)環境で簡単にRubyの環境ができます。サーバーで動かしたい場合はこちらの記事をご参考まで。

RubyのソースコードはRubyのサイトからダウンロードできますが、そのままではコンパイルしないとインストールできません。なので、有志の方がWindows用にコンパイルされたものを、使わせてもらいます。

Rubyダウンロードページの下のほうにあるリンクから、ActiveScriptRubyを選びます。

ActiveScriptRubyサイトには、安定板Rubyのインストーラがありますのでダウンロードします。最新版は、上のほうにあります。現時点での最新版は、『Ruby-2.1.1.msi』となっていました。(Rubyサイトには、2.1.2版のソースコードが安定板として公開されていますが、ActiveScriptRubyサイトでは、まだ2.1.2版ではないようです。)

ダウンロードした、『Ruby-2.1.1.msi』を実行します。

win_rb_inst01

win_rb_inst02

インストール先を聞かれます。わかりやすいように、画像のようにしました。インストール先はあとで必要になるので、メモしておきます。あとはデフォルトのままインストールを完了させます。

インストールが完了すると、windowsの環境設定の、PATHの設定を行います。

システムのプロパティを開きます。
windows7 : [コンピューターのプロパティ] → [システムの詳細設定] → [システムの詳細設定]

win_rb_inst03

[環境変数]を選択します。

win_rb_inst04

赤丸で囲んだほうの、[新規]、をクリックします。間違わないように上の[新規]です。下の新規で進めると環境変数が崩れるので注意!です。

win_rb_inst05

変数名:path
変数値:C:\Ruby-2.1.1\bin
変数値は[インストール先\bin]です。今回は[C:\Ruby-2.1.1]にインストールしました。

PCを再起動します。 コマンド プロンプトンを開き、確認します。

win_rb_inst06

 

ruby -v
irb
a = 3
b = 8
c = a * b + 6
print c

画面のように表示されれば、成功です。

ruby -v

バージョンを表示するコマンドです。

irb

コマンドは、コンソール上でrubyを入力実行できるコマンドです。

Ruby ダウンロード

ruby

rubyで、IO.popenで、`split’: invalid byte sequence in US-ASCII (ArgumentError) のエラー

Ruby で、split’: invalid byte sequence in US-ASCII エラー

コンソールで実行していたら問題はなかったコードを、ブラウザからアクセスしたら、split’: invalid byte sequence in US-ASCII (ArgumentError) とのエラー。

エラー行に、IO.popen があり、US-ASCIIとか、ArgumentErrorとか書いてあるので文字コードが怪しいとは思いましたが、なかなかどのタイミングでエラーなのか分からない・・・

とりあえず解決したのでメモ

io = IO.popen(string, "r")
# 文字コードの指定 ↓
io = IO.popen(string, "r:utf-8")

module function Kernel.#open

title_admin

Rubyをブラウザアクセスで実行【coreserver】

Rubyが入っている場所を調べる

ブラウザからアクセスする場合、ファイルにサーバに保存されているRubyのPATHを記述する必要があるので、まずPATHを調べます。
こちらのページよくある質問 | CORESERVERにも載っていますが、シェルを繋いでコマンドでも調べられます。

$ which ruby
/usr/local/bin/ruby
$ ruby -v
ruby 1.8.5 (2006-12-04 patchlevel 2) [i686-linux]

のような感じでしらべます。

#!/usr/local/bin/ruby
print "Hello"

を拡張子「.cgi」で保存します。 ブラウザでアクセスすると、エラーまたはソースがそのまま表示されます。

#!/usr/local/bin/ruby
print "Content-Type: text/html\n\n"
print "Hello"

httpのヘッダが必要みたいです。 あと、.cgi だと、ローカルで作ったファイルをいちいち .rb から変更しないといけないので、.htaccessで.rbでも動くように設定します。(ここからがとてもハマりました。)

AddHandler cgi-script .rb
AddType "text/html; charset=UTF-8" .rb
DirectoryIndex index.html index.rb index.cgi

結果的にhtaccessの設定はこれでよかったのですが、何度してもエラーになりました。。。

CGIWrap Error: Script Execution Failed

↑こんなのが表示されます。 ググるとCGIは改行コードが CR+LF だとエラーになるとか、そこで改行コードを LF に変更するとうまくいきました。 .cgi のときは CR+LF でエラーにならなかったので、時間がかかりました。。。」

#!/usr/local/bin/ruby

print <<HERE
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
<head>
    <meta charset="UTF-8">
    <title>現在時刻表示</title>
</head>

<body>
<p>
    現在時刻表示 <br />
    #{Time.now.strftime("%H 時 %M 分 %S 秒")} です。
</p>
</body>
</html>
HERE

追加したRuby(2.1.1)で実行する

初めからインストールされているRuby以外で実行する時も、手順は同じです。

coreserverのRubyをバージョンアップする方法[2.1.1] のように追加した場合です。

環境PATHに設定した、rubyのパスを調べます。PATHの設定が反映されている場合は、デフォルトのPATH以外のものが表示されるはずです。

which ruby
/virtual/【user_name】/lib/ruby/bin/ruby
ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [i686-linux]

あとは、パスを変更して実行します。

#!/usr/local/bin/ruby
↓
#!/virtual/【user_name】/lib/ruby/bin/ruby

サンプルです。

#!/virtual/【user_name】/lib/ruby/bin/ruby

print <<HERE
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
<head>
<meta charset="UTF-8">
<title>別途インストールしたruby2.1.1を実行するサンプル </title>
</head>
<body>
<pre>
HERE

print "バージョン : ",RUBY_VERSION, "<br />"

fib = [1, 1]
(0..10).each {|i|
  fib << fib[i] + fib[i+1]
}
p fib

puts "</pre></body>"
puts "</html>"