2011年5月17日火曜日

Ruby 変数と定数とスコープ

puts "###############試験対策ソース###############"

puts "###############変数と定数とスコープ1###############"
x = 1
def ans
x = 4 #xを初期設定していない場合、xを呼び出す場合NameErrorが返されます。
puts x #=>4 xのスコープはメソッド内だけです。
end
ans
puts x #=>1


puts "###############変数と定数とスコープ2###############"

def ans2
x = 100 if false #この場合xへの代入は実行されないが、宣言はされます。
puts x #=>nil
end

ans2

puts "###############変数と定数とスコープ3###############"

def ans3
x = 0 #ブロックの外で初期設定
(0 ... 11).each do |i|
puts x += i #ブロック内でも有効です
end
end

ans3

puts "###############変数と定数とスコープ4###############"
def ans4
o = 0 #初期化を行っていない変数に代入を行うとNameErrarが吐き出されます。
for i in 1..10
o += i
end
puts o
end

ans4
★★★★★★実行結果★★★★★★
###############試験対策メ[ス###############
###############変数と定数とスコープ1###############
4
1
###############変数と定数とスコープ2###############
nil
###############変数と定数とスコープ3###############
0
1
3
6
10
15
21
28
36
45
55
###############変数と定数とスコープ4###############
55

2011年5月16日月曜日

Ruby技術者認定試験対策 その①

puts "##############Ruby真偽#################2
puts "■■■■■■■■真偽ソース■■■■■■■■■"
puts "########  0  #######"
num = 0
if num
    puts "0 は true"
else
    puts "0 は false"
end

puts "########  ''  #######"


str = ''
if str
    puts "空文字列はtrue"
else
    puts "空文字列はfalse"
end

puts "########  nil  #######"

ni = nil

if ni
    puts "nilはtrue"
else
    puts "nilはfalse"
end

puts "########  false  #######"

fal = false

if fal
    puts "falseはtrue"
else
    puts "flaseはfalse"
end

puts "########  true  #######"

tr = true

if tr
    puts "trueはtrue"
else
    puts "trueはfalse"
end

puts "########  null  #######"

nulls = "null"

if nulls
    puts "nullはtrue"
else
    puts "nullはfalse"
end

puts "★★★★★★★ 結果 ★★★★★★★"
########  0  #######
0 は true
########  ''  #######
空文字列はtrue
########  nil  #######
nilはfalse
########  false  #######
flaseはfalse
########  true  #######
trueはtrue
########  null  #######
nullはtrue

///////  まとめ  ////////
Rubyではnilとfalse以外はtrueになります。

最近見たWeb開発で役にたつサイトをまとめた

#############################注目PC##############################
9,800円のAndroidノートが発売CPUはVIA製
http://akiba-pc.watch.impress.co.jp/hotline/20110514/etc_via.html 

#############################注目HTML便利サイト##############################
CSSの知識をもっと深める30+2の小技テクニック集
http://weboook.blog22.fc2.com/blog-entry-260.html



ブラウザのデフォルトのスタイルをCSSでリセットする方法
http://ps60.blog109.fc2.com/blog-entry-31.html



#############################注目統合開発便利サイト##############################
TML/CSS/PHP等のコーディングに、無料のNetBeansが快適過ぎる件
http://stocker.jp/diary/netbeans/


#############################注目SEO対策サイト##############################
WEB屋が使う最高の無料SEOツール40個
http://swat9.com/seo/seo%E3%83%84%E3%83%BC%E3%83%AB40/


#############################注目仮想環境便利サイト##############################
無料の仮想化ソフト「VirtualBox」を使ってWindows上でLinuxなどを動作させる方法
http://9jp.info/archives/9319


#############################注目サーバ管理サイト##############################
ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)http://tanaka.sakura.ad.jp/2011/05/centos-linux-apache-php-perl-mysql-lamp.html

#############################注目Rubyサイト##############################
Ruby入門勉強ルームhttp://www.mapee.jp/ruby/

2011年5月12日木曜日

XHTMLの注意点

##############XHTM1.0宣言文 ###########
<?xml version=”1.0″ encoding=UTF-8″?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<!-- 空間名の指定 -->
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”ja” lang=”ja”>




############## 終了タグ ###########

XHTMLでは終了タグの省略はできません。
ですので
<br /><img src="xxxx" />と記述し、
pタグなどもきちんと閉じましょう。

############## 属性値 ###########

属性値はダブルコーテイションで囲みましょう。
また、属性名と属性値が同じ時、HTMLは省略記述できますが、
XHTMLでは省略できません、

############## 要素名 属性名 ###########
XHTMLでは要素名と属性名は小文字で記述しましょう。




2011年5月11日水曜日

Ruby言語 ファイル

puts "################出入力###################"
puts "引数に1 2 3を渡す"
expression = ARGV.join(' + ')   #joinで文字列の結合
total = ARGV.inject(0){|subtotal, arg|   #inject(0)はsubtotalの初期値で、argに要素を渡します。
    p subtotal
    p arg
    subtotal + arg.to_i
}

puts expression   #=>1 + 2 + 3
puts total    #=>6


puts "################ファイル###################"

i = 0
File.open("opentext.txt"){|text|  #openでファイルを開きます
    puts "読み込み開始します"
    contents = text.read
    print contents + "\n"
    puts "読み込み終了します"
}


puts "################ファイル###################"

File.open("opentext.txt",'a'){|text|
    puts "書き込み開始します"
    text.puts Time.now
    puts "書き込み終了します"
}

puts "################ファイル###################"

File.open("opentext2.txt",File::WRONLY|File::CREAT){|text|
    puts "書き込み開始します"
    text.puts Time.now
    puts "書き込み終了します"
}


puts "################ファイル###################"
File.open("opentext2.txt"){|text|
    puts "読み込み開始します"
    text.each_line do |line|   #一行ずつ読み込み ブロックに行の内容を渡す。
        p text.lineno    #現在の行番号
        if(line == "\n")
            puts "\\nです"
        end
        p line#.chomp    #現在の行を表示chompは改行を削除します
    end
    puts "読み込み終了します"
}


puts "################ファイル###################"
File.open("opentext2.txt",'r+b'){|text|
    print "#{text.pos}"    #ファイルポインタの現在の位置を整数で返します
    print text.gets
    print "#{text.pos}"
    puts bytes = text.read(3)
    print "#{text.pos}:\n"
    text.pos -= 3
    print "#{text.pos}:\n"
    text.write bytes
    print "#{text.pos}"
    text.pos = 0
    print text.gets    #1行取得
    print "#{text.pos}:"
    text.seek(-3,File::SEEK_END)#最後の行へ移動し3バイト戻る
    print "#{text.pos}"
    puts text.getc     #1バイト読み込み
    print "#{text.pos}"
    p text.getc
    print "#{text.pos}"
    #readcharは読み取るバイトが存在しないとき例外を発生することを除き同じ動き
    puts text.readchar #読み取り行がない場合例外
}


puts "################ファイル###################"

p $stdin
p $stdout
p $stderr
$stderr.printf("%X\n",0xcafe)


puts "################ファイル###################"
File.open("opentext2.txt",'w'){|text|
    p text
    $stdout = text    #標準出力先をコマンドラインから指定ファイルに変更
    p $stdout
    puts "Welcome to Glubbdubdrib"
    p text
    p STDOUT
    $stdout = STDOUT  #標準出力をもとにもどす
    p $stdout
}

puts "################ファイルIO###################"

require 'stringio'#stringioの読み込み、StringIOを使うため
buffer = String.new#StringIOで使うStringオブジェクト bufferとはデータの蓄積先

sio = StringIO.new(buffer)#StringIOに渡す
p $stdout
$stderr = $stdout = sio#出力先を変更
puts "untuh"
warn "outed"
$stdout = STDOUT
puts buffer
puts sio
$stderr = STDOUT

Ruby 単語説明

名前の検索とは?
 オブジェクトにメッセージが渡された時の振る舞い、狭いスコープ範囲から広い範囲へと探していく。

*特異メソッドとは


*メソッドのオーバーロード? Rubyはオーバーロードはありません


*メタプログラミングとは?


*特異クラスとは?


*ダックタイピングとは? オブジェクトが同じように振舞うなら区別する必要はないと考える意味

Ruby言語 オブジェクトとクラス

puts "##########アクセス########1"      

class Yapoo

    def public_method; end
   
    private
    def internal_use
        puts "成功"
     end
   
    public
    def public_api
        return internal_use
    end
end
    yapoo = Yapoo.new
    yapoo.public_api
    #yapoo.internal_use
   
   
puts "##########特異メソッド 特異クラス########"
     
message = "Hello"
def message.build_greeting(target)  #特異メソッド オブジェクト専用のメソッド
    #return "#{self}, #{target}."

end

p message.build_greeting("world")
p message2 = "Hello"
#p message2.build_greeting("world")  #エラーが出ます。メソッドはありません「undefined method....」と


puts "##########クラスメソッドとメタクラス########"

class Duration1
    def initialize(since,till)
        puts "kita"
        puts since
        puts till
        @since = since
        @till = till
    end
    #attr_accessor :since, :till
    class << self  #特異クラスを定義Duration1
        p self #デバック
        def week_from(from)#クラスメソッド
            puts "kita2"
            return self.new(from, from+7*24*60*60)#一週間の秒数
        end
    end
end

#Duration1.new(Time.now,Time.now)
p  Duration1.week_from(Time.now)




Ruby言語 クラス定義

puts "##########クラスメソッドの定義########1"      

class Duration
    def display; puts self end    #インスタンスメソッド
end

duration = Duration.new    #インスタンスの生成
duration.display      #=>#<Duration:0x2855850>

puts "##########クラスメソッドの定義########2"

class Duration1
    def Duration1.print(x); p x end    #クラスメソッド
end

Duration1.print 2     #=>2


puts "##########クラスメソッドの定義########3"

class Duration3
    p self
   
    def self.print(x); #selfはクラス自身を指す
    p x
    p self
    end    #クラスメソッド
    def self.test(x ); p x += x end    #クラスメソッド
end

Duration3.print 2   #=>1
Duration3.test 2   #=>1
Duration3.test 2   #=>1

puts "リファクタリングとはプログラムの機能を変更しない修正の事"


puts "##########インスタンス化########4"

class Duration4
    def initialize(since,till)  #javaで言うコンストラクター的なもの
        @since = since
        @until = till
    end
    attr_accessor :since, :until    #指定したインスタンス変数に、seter/getterメソッドを組み込む
end

duration4 = Duration4.new(Time.now, Time.now + 3600)
p duration4.until
p duration4.since
p duration4.since = Time.now + 4600

puts "##########インスタンス化########5"

class Duration5
    def initialize (since,till)
        @since = since
       @till = till
 end

 def since=(value); @since = value end


 def till=(value);@till = value end

 def since
     return @since
 end

 def till
     return @till
 end

end


duration5 = Duration5.new(Time.now,Time.now + 3600)
p duration5.since
p duration5.till
p duration5.since = Time.now + 3600
p duration5.since


puts "##########クラス定義の追加########6"

class String
    def caesar; tr 'a-zA-Z', 'n-za-mN-ZA-M' end
end

puts "Learning Ruby".caesar

puts "##########クラス定義の追加########7"


class Fixnum
    alias original_addition + #元の定義を別のメソッドで退避、(別名で定義)
    def +(rhs) #再定義
        original_addition(rhs).succ #succは次の整数を返す
    end
end

p 1+ 1 #=>3
p 5 + 2  #=>8


puts "##########クラス定義の追加########8"

class Duration8
    def initialize (since,till)
        @since = since
       @till = till
 end
attr_accessor :since, :till  #アクセサメソッド
    def display(target=$>)
        super #Objyectクラスのdisplayをよびだす オーバーライドする
        target.write "(#{self.since}-#{self.till})" #displayの引数に渡す
    end
end


duration8 = Duration8.new(Time.now,Time.now + 3600)
duration8.display

puts "#########インスタンス変数########"

class Duration9
    def initialize (since,till)
        @since = since
       @till = till
 end
    def print_since;p @since end
end

duration9 = Duration9.new(Time.now-7,Time.now)
duration10 = Duration9.new(Time.now+7,Time.now + 14)
duration9.print_since
duration10.print_since


puts "#########クラス変数########"

class Foo
    @@class_variable = "foo"
    def ttt
        p @@class_variable
    end
end

class Bar < Foo
    p @@class_variable
    @@class_variable = "bar"
    def print
        p @@class_variable
    end
end

#foo = Foo.new
#foo.ttt
#bar = Bar.new
#bar.print

2011年5月6日金曜日

Ruby メソッドとは

puts "##########メソッド########1"     


str = "abcd<efgh>ijkl mnop"

esca_str = str.gsub(/&/, '&amp;').gsub(/</, '&lt;').gsub(/>/, '&gt;').gsub(/ /, '&ensp;')

puts esca_str

puts "##########レシーバの省略########1"

class Laputa
    def hover
        puts "vibrateを呼び出します。"
        vibrate
        puts "vibrateをselfで呼び出します。"
        p self
        self.vibrate
      
        puts "名前の衝突開始"
        vibrate = 1  #名前の衝突
        p vibrate
      
        puts "selfを使い自分自身のメソッドの呼び出し"
        self.vibrate #selfを使い自分自身のメソッドの呼び出し
    end
  
    def vibrate
        p self
        puts "vibrateが呼ばれた"
        #何かの処理
    end
end

def vibrate
    puts "Laputa外の関数"
end

takalamakhan = Laputa.new #コンストラクタの呼び出し。インスタンスの生成。
taka1 = takalamakhan.hover

takalamakhan2 = Laputa.new
takalamakhan2.hover
p takalamakhan.equal? takalamakhan2   #オブジェクトが同じものか?
vibrate   #Laputa外の関数を呼び出し

puts "########## 関数的 メソッド ########1"

def functional_method(a, b)
    return [a, b, a+b]
end
p functional_method(1, 2) #=>[1, 2, 3]



puts "########## 引数展開 ########1"

def some_method(a, b)  #仮引数
    p [a, b]
end

params = [1, 2]
x, y = params    #多重代入の場合は暗黙変換される
some_method(x, y)     #=>[1, 2]
#some_method(params) #配列から実引数リストへの自動的な展開は行われない。

puts "########## メソッドの定義 ########1"
puts "メソッド定義がdefを使う"

def sum(x, y)
    puts x + y
end

def diff x, y #括弧を省略スタイル
    puts x - y
end

def prod(x, y) puts x * y end #1行にマトメルスタイル
def quo x, y ; puts x / y end #括弧省略の1行マトメスタイル セミコロンは引数渡しの終わり

sum(1, 2)     #=>3
diff(1, 2)    #=>-1
prod(1, 2)    #=>2
quo(1, 2)     #=>0


puts "########## メソッドの定義 return ########"

def fact(n)
    return 1 if n == 0
    product = 1
    (1 .. n).each do |i|
        product *= i
        puts product
    end
    return product  #returnは必須ではありません。returnがない場合はメソッド末尾に到達すると最後の式が戻り値になります。
end

puts fact(10)   #=>3628800


puts "一行で記述した場合 メソッドの最後の式が戻り"
def fact2(n); (1 .. n).inject(1){|fe,i|fe*i} end  #fe,iはfeにiを代入している
puts fact2(10)   #=>3628800


puts "########## メソッドの定義 多値の返却 ########"

def some_method(a)
    return a, 1, 2 ,3
end
 a , b , *c = *some_method(0)
p a
p b
p c


puts "########## メソッドの定義 引数展開 ########"

def some_method(a , b , c)
    return a , b  , *c
end


array = [3 , 4 , 5]
te = some_method(1 , 2 , array)
p te


puts "########## メソッドの定義 デフォルト値 ########"

def some_method(a, b, c = 3)
    p a, b, c
end
some_method(1,2,4)  #デフォルト値を変更
some_method(1,2)    #デフォルト値がある仮引数は省略可能

puts "########## メソッドの定義 デフォルト値の評価コンテキスト ########"

def print_time(time = Time.now)
    return time
end

(0 .. 3).each do |i|
    p print_time
    sleep 0.1
end

puts "########## メソッドの定義 可変長引数 ########"


def some_method2(a, b, *c) #残りは配列で渡し
     return a, b, *c #cは展開渡し
end
some = some_method2(1,2,3,4,5,6,7,8,9,0)
p some  #=>[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]


puts "########## メソッドの定義 ブロックつきメソッド ########"


verse = "点士気喪 字時字時字時\nTESR TETTTTT\n"

count = 0 #

verse.each_line do |line|
    print line
  
    count += 1 #=>点士気喪 字時字時字時 改行されてTESR TETTTT
    p count
end

p count


puts "########## メソッドの定義 クローじゃ ########"


def some_method
    3.times {p self}  #=>main
end

some_method

puts "########## メソッドの定義 クローじゃ ########"

def create_count
    count = 1
    return Proc.new do
        count += 1
        p count
    end
end

counter = create_count #メソッドの呼び出し
p counter.class        #Procクラスの表示
counter.call  #=>2
counter.call  #=>3


counter2 = create_count
p counter2.class  
counter2.call  #=>2
counter2.call  #=>3


puts "########## メソッドの定義 クローじゃ ########"
count = 0
[[1,2],[3,4]].each do |num , nums|
    p [num , nums]
    p count += 1
end

#p [num , nums]     #ブロック変数へはブロックローカル変数外部よりできません


puts "########## メソッドの定義 ブロックつきメソッドの定義 ########"

def foo_bar_baz
 yield "foao"
 yield "barsss"
 yield "bazsss"
end

g = 0
foo_bar_baz do |item|
    p g+=1
    puts item
end


puts "########## メソッドの定義 イテレータの中のyield ########"


def foos_bars_bars2
    %w[foos bars1 bars2].each do |items|
        yield items
    end
end
g = 0
foos_bars_bars2 do |items|
    p g+=1
    puts items
end
puts "########## メソッドの定義 Enumeratorとyield ########"


def foos_bars_bars3
    p block_given? #trueかfalseを返す
    return enum_for(:foo_bar_baz3) unless block_given?  #メソッドにブロックが渡されたかで動きを変える
    %w[foo bar baz].each do |item|
        yield item
    end
end


p foos_bars_bars3   #ブロック無し

foos_bars_bars3 do |item|            #ブロックあり
     p item
end

puts "########## メソッドの定義 Enumeratorとyield ########"
def my_map
    [yield(1),yield(2),yield(3)]
end
p my_map {|i| i+1}

my_map do |i|
     p i+1
end

2011年4月28日木曜日

Ruby 文字列②

puts "##########6 文字列=バイト列#########"

str =  "あいう"

p str.length   #=> 6

p str[0], str[1], str[2]

p $KCODE # = "SJIS"   #グローバル変数に文字コード指定

regexp = /(.)/s   #オプションでSJISの正規表現 カンマは1文字として認識
str = "\202\240"
regexp =~str
    p $1
   
regexp = /(.)/n   #オプションでNONEの正規表現 カンマは1バイトとして認識
regexp =~str
    p $1


str = "あいうえお"
str.scan(/./s) do |c|    #文字コードSJIS指定で任意の一文字ずつスキャンする
    puts c                 #=>あ い  う え お
end


puts "##########6 メッソド#########"
$ffff
def describe(name)
    puts "This is a #{name}."  #=>This is a Google.
    name = name.dup                         #オブジェクトのコピーの参照値
   
    name[3] = ?p
    $ffff = name                            #オブジェクトの参照
    puts "This is a #{name}."  #=>This is a Goople.
end
CATTLE = "Google"

describe(CATTLE)                        #メソッドに引数渡し
p CATTLE                                        #=>Google
p $ffff

puts "##########6 スコープ ローカル変数#########"

def next_of(origin)        #メッソド定義
    value = origin + 1
    p value
end

def prev_of(origin)        #メッソド定義
    value = origin - 1
    p value
end

next_of(2)   #メソッドの呼び出し
next_of(2)
prev_of(2)

#p value      #value変数は呼び出せない NameError

#p undefined_variable #value変数は呼び出せない NameError


puts "##########6 スコープ クラス#########"
class Duration
    attribute_names = %w[ days hours minutes seconds]#文字列要素を配列
    p attribute_names
    attribute_names.each do |name|
        attr_accessor name
    end
end

#p attribute_names   #=>NameError

puts "##########インクリメント演算子#########"

0.upto(9){|i| puts i}

p ""
$i = 1
str ="Glubbubdrib"
str.each_byte do |byte|
    printf "%x\n" ,byte
    p $i+=1
end

puts "##########多重代入 #########"

a,b = 1,2,3,4,5
p a
p b
p ""
a,b,c = 1,2
p a
p b
p c

puts "#########6 多重代入 配列展開 #########"

a, *b = 1,2,3,4,5
p a,b
p b.length

p ""

array = [1,2,3]
a,b,c = *array
p a,b,c

puts "#######6 論理演算し #####"

if a == 1 and b == 3
        puts "ok"
    else
        puts "NG"
end


if a == 1 || b == 3
        puts "ok"
    else
        puts "NG"
end


p ""

def method_with_side_effect
    puts "副作用が発生しました"
    return 1
end

#メッソドはよばれない
p true || method_with_side_effect
#メソッドがよばれる
p false || method_with_side_effect

#メッソドはよばれない
p true && method_with_side_effect
#メソッドがよばれる
p false && method_with_side_effect


puts "########初期化イディオム############"

def generate_default_value
    p 'default value genarated'
    return 'default value'
end

def som_method(param = nil)   #paramの仮引数がnil・false・無なら
    param ||= generate_default_value  #param = param || generate_default_valueなら
    #.....paramを使って何するか?
end
p "nil"
som_method(nil)
p "false"
som_method(false)
p "true"
som_method(true)
p "0"
som_method(0)
p ""
som_method()

puts "########範囲演算子############"

for i in 0...10
    puts i
end

puts "########三項・条件演算子############"
a = nil
p a,b,c   #=>nil,2,3

var = a ? b : c  #aが真tureの時bに、偽falseならcになります
p var

var = if a then b else c end   #aが真tureの時bに、偽falseならcになります
p var

puts "########制御式############"

color = "ff"
thouht = if color == "green" then
p    "danger"
else
p    "undefined"
end

p thouht

p ""

puts "########奇数偶数############"

0.upto(21){|i|
    t = i % 2
    if t == 0 then
        puts "#{i} は奇数です。余りは #{t}"
    else
        puts "#{i} は偶数です。余りは #{t}"
    end
}

puts "########6~12歳小学生############"

0.upto(133333333333399999){|i|
   
    if i  < 6  then
        puts "#{i}才は幼児です"
    elsif i < 13
        puts "#{i}才は小学生です"
    elsif i < 16
        puts "#{i}才は中学生です"
    elsif i < 19
        puts "#{i}才は高校生です"
    elsif i > 19
        puts "#{i}才は大人です"
    end
}

2011年4月27日水曜日

Ruby 文字列 正規表現

正規表現とは?
文字列はい対してパターン照合を行うミニ言語。

■| パイプメタキャラクターはいずれかの

■メタキャラクタの説明
*^は文字列の先頭や改行文字の直後にマッチ
/^abc/........abcdofでマッチ

*$は終わりが
/^abc$/........abcdofでマッチしない

*[abc]..............abcではaかbかcの一文字にマッチ

*[a-z]..............abcでは小文字のアルファベトにマッチ

*\w.....................[a-zA-Z_0-9]

*\s.....................空白文字列



*\S.....................空白文字列以外の任意の一文字

*\d........................は[0-9] 数字にマッチ

*\D........................は[0-9] 数字以外の任意の一文字にマッチ

*\z.......................文字列の末尾にマッチする

*\Z................\zは改行文字に感知するが\Zはしない

*\G................は前回マッチした直後に位置にマッチ、しかし、最初のマッチが実行される前に\Aにマッチする

**.......................直前のパターンの0回以上の繰り返し

*+.................直前のパターンの1回以上の繰り返し

*{m}...............繰り返し回数

*{m,n}.......................m回からn回の繰り返しのマッチ

*{m,}..........................m回以上の繰り返しにマッチ

*{m,}?..............m回以上のできるだけ短い繰り返し

*?..............直前のパターンの0回か1回の繰り返し、\d{3}-?\{4}で郵便番号などで使う

*\1や\2...................前にキャプチャした部分と同じ文字列にマッチ


*(?#)...........................コメント

*i...................大文字小文字を区別しない/abc/iと記述すると大小どちらでもマッチ

*m.................複数行文字モード。「.」が改行文字にもマッチ

*x..............#kから改行までコメントとし無視する

■ソース
p "##########分解#############"
p "a,bb,ccc,            dddd"
p "a,bb,ccc, dddd".split(/,\s?/)
★結果
p "##########分解#############"
"a,bb,ccc,            dddd"
["a", "bb", "ccc", "dddd"]
puts "##########その他#############"
p "string".reverse
p "\n\rstring".strip
p "string".length

puts "##########イテレータ#############"
story.each_byte do |byte|
    p byte
end

p ""
story.each_line do |line|
    p line
end


puts "##########フォーマット#############"
p sprintf("%04d",3)
p sprintf("%08.4f", Math::PI*10)
p sprintf("hex=%X, oct=%o", 10,11)


puts "##########シンボル#############"
p symbol1 = :ruby
p symbol2 = :ruby
p symbol1 == symbol2
p symbol1.equal? symbol2

*シンボルは文字列より高速処理ができます。

Ruby 文字列

■ソース

str = String.new

str << 72 << 101 << 108 << 108 << 111

p str 

★結果
#"Hello"
文字コードとは  コンピューター内部での文字の番号

puts "Hello"
puts "日本語"
puts 'single quoted'

puts '改行
を含む文字列'

puts "改行\n\tを含む文字列"

★結果
Hello
日本語
single quoted
改行
を含む文字列
改行
        を含む文字列
p "##########第4章 式展開#########"

p a = 4

p "a  = #{a}"
p "a ** 5 = #{a ** 5}"

p "#{Time.now}"
★結果
4
"a  = 4"
"a ** 5 = 1024"
"Wed Apr 27 12:27:15 +0900 2011"
p "##########第4章 バッククオート文字列#########"

p `date /t`
★結果
"2011/04/27 \n"
p "##########第4章 パーセント記法#########"


t = %w!tt tt gg!
p t
★結果
["tt", "tt", "gg"]
p "##########第4章 ヒアドキュメント#########"
a = 100

puts <<EOS
    line1 #{a}\t
    line2
EOS

puts <<'EOS'
    line1 #{a}\t
    line2
EOS
★結果
       line1 100
       line2
       line1 #{a}\t
       line2
p "##########第4章 文字と文字リテラル#########"

p ?1
p ?a
p ?\t
p ?\x5c
p ?\C-d
★結果
49
97
9
92
4
■文字リテラル
”か’のダブル・シングルトーテイションでくくられた文字を文字列リテラルと解釈します。
”か’を使うのは好みに問題です。

■バックスラッシュ記法
バックスラッシュ¥につずけて特定の記法を書くと通常記述が難しい文字も表現できます。
また、シングルコーテイションではバックスラッシュ記法は原則解釈されません。

■バッククォート文字列

■Rubyにお客様以上の感情を持つ人を == Rubyistと言います。

■CGIとはWebサーバ上で動作するプログラムと仕組み



2011年4月26日火曜日

Ruby例外エラーの仕組み

Ruby例外エラーの仕組み
エラーを発生させる仕組みから、「例外」というエラーが返される。
エラー例外に対応可能な仕組です。

■1ソース
p "############Ruby例外エラーの仕組み##############"

user_mapping = {"kayo" => nil}
p user_mapping.key? "kayo"
p user_mapping.key? "tetus"
p user_mapping.fetch("kayo")
p user_mapping.fetch("tetus")

■結果1
true
false
nil
******.rb:30:in `fetch': key not found (IndexError)
        ******.rb:30


■ソース2ハッシュの比較
p "############Rubyハッシュの比較##############"

hash1 = { "a" => 1, "b" => 2 }
hash2 = { "a" => 1, "b" => 2 }
p hash1 == hash2
p hash1 == {  "b" => 2,"a" => 1}
p hash1 == { "a" => 9, "b" => 2 }
p hash1 == { "z" => 1, "b" => 2 }
p hash1 == { "a" => 1, "b" => 2 ,"c" => 3}

■結果 ハッシュの比較の場合、キーと値が等しいとき同士です。順序は関係ありません。
true
true
false
false
false

****解説*****

すべてのハッシュはHashクラスのインスタンスです。sizeやkeyなどのメソッドいろいろとあります。

Ruby 数値比較





■ソース

p 1 == 1
p 1 == 1.0
p 1 != 1
p 1 < 1
p 1 <= 1
p 1 > 1
p 2 >= 1


★結果
true
true
false
false
true
false
true


■ソース宇宙演算子
p 1 <=> 2
p 1 <=> 1
p 3 <=> 2


★結果
-1
0
1
*説明 左辺が右辺より小さければ負の数、大きければ正の数、等しい場合はゼロとなります。

■宇宙演算子が使われているメソッド
p [8,3,5,2,1,3,4,9,1,].sort

★結果
[1, 1, 2, 3, 3, 4, 5, 8, 9]

■数学関数
p Math.acos(1)
p Math.log(3)
p Math.sqrt(3)

p Math::E
p Math::PI

include Math

p acos(1)
p log(3)
p sqrt(3)

p E
p PI


RUby言語 数値

*Rubyは多倍長整数をサポートをし、桁あふれを心配することはありません。
*メソッドのオーバードができます。メソッドのバリエーションが作れます。

■数値リテラル
整数・浮動小数点があります。
1や0.01など

■リテラルの先頭記号
0x は 16進数
0d は 10進数
0o は 8進数
0b は 2進数

■整数オブジェクト
整数オブジェクトはintegerではなくFixnumやBignumクラスのインスタンスになります。

*ソース
p num = 0b1111.class
p num = 0b1111111111111111.class

*結果
Fixnum
Bignum


■その他演算子
p "############Ruby数値演算子##############"
p 10 + 2   #加算
p 5.25 -7   #減算
p 2*2    #乗算
p 2**5   #べき乗


p "############除算##########"
p 7/2
p 7%2
p 7.0/2
p 7.0/0
#p 7/0 #ゼロ除算例外

p -a = -3.0  #符号操作
p +a = -3.0

■型と自動変換
Rubyはデータ型が自動変換されることはほとんどありません。

p 5 + "2".to_i など明示的に型変換しないかぎり、


p 2/0.5 などの時は整数が不動小数点に変換され計算されます。


p printf("%20f", 99999999999999999999999999 + 0.0) などの時は100000000000000004764729344.000000nilとなり整数の表現可能範囲をこえた場合は精度が失われます。

また、

p 3.to_f / 2
p 3.0.to_i / 2で明示的に型変換もできます。

Ruby ドキュメントをコマンドラインよりインストール

http://doc.ruby-lang.org/ja/1.8.7/library/_builtin.html
にRubyのドキュメントがあります。

また、コマンドラインから
gem install rdoc rdoc-data

rdoc-data --install

gem rdoc --all overwrite

gem install refe

で英語と日本語のドキュメントがインストールできます。

使用方法は英語ではコマンドラインより
ri Array

ri Array#each

 日本語では

refe Array

refe Array#each

で使用できます。

2011年4月25日月曜日

Ruby学習1 変数と配列の挙動

 変数とはデータの入れ物。

■ソース
test = "yahoo"             #文字列オブジェクト(参照値)
p container = [test,test] #出力 containerが参照しているのはtest
test[2] = 'p'                  #文字列オブジェクト(参照値)の配列の置き換え
p container                  #出力

■結果
["yahoo", "yahoo"]
["yapoo", "yapoo"]

■感想
phpやjavaをやってきたがRubyもいろいろとルールがあるものです。


■ソース

a = 1
p a
b = "str"
p b
c = [a,b,3.class(),"test"] #配列にはオブジェクトの参照値が入っている
p c
d = [a,c,[1,2,3,]]
p d

■結果
1
"str"
[1, "str", Fixnum, "test"]
[1, [1, "str", Fixnum, "test"], [1, 2, 3]]


■ソース
a = 1
p a
b = "str"
p b
c = [a,b,3.class(),"test"]
p c
d = [a,c,[1,2,3,]]
p d

p c[0]

p d[2]

p c[2    ]

p c[-3]

p c.length #配列の長さ

p c[0,4]  #Cの0から4のオブジェクトを参照

p c[0..3]
p c[0...3] #端末を含まない
p c[-3..-2] #負の記号を使った参照

■結果

1
"str"
[1, "str", Fixnum, "test"]
[1, [1, "str", Fixnum, "test"], [1, 2, 3]]
1
[1, 2, 3]
Fixnum
"str"
4
[1, "str", Fixnum, "test"]
[1, "str", Fixnum, "test"]
[1, "str", Fixnum]
["str", Fixnum]

■ソース
a = [1,2]  #配列に代入
p a
a[0] = 3
p a
a[4] = "4"
p a
a[0,3] = 'a','b','c'
p a
a[0,3] = 'a','b','c','d'
p a
a[1..2] = 1,2
p a
a[0,2] = "?"
p a
a[0..2] = "A"
p a
a[-1] ="z"
p a

a = ["1","2"]  #配列に代入
p a
a[0] = 3
p a
a = ["1","2"]  #配列に代入
p a
a[-1] = "3"

■結果
[1, 2]
[3, 2]
[3, 2, nil, nil, "4"]
["a", "b", "c", nil, "4"]
["a", "b", "c", "d", nil, "4"]
["a", 1, 2, "d", nil, "4"]
["?", 2, "d", nil, "4"]
["A", nil, "4"]
["A", nil, "z"]
["1", "2"]
[3, "2"]
["1", "2"]


■ソース
array  = ["a","b","c"]
p array.length
p array.size
p array *= 2
p array.include? "c"
p array.sort
p array.uniq #重複要素を削除した配列を生成

p array
p array.uniq! #元の配列自体の重複要素を削除し更新

p array

■ソース
array = ["a","b","c"]
array.each do |item|
    p item
end


array = ["a","b","c"]
array.each_with_index do |item,index|
    p [item,index]
    p array[index]
end



■結果
"a"
"b"
"c"
["a", 0]
"a"
["b", 1]
"b"
["c", 2]
"c"

■結果
3
3
["a", "b", "c", "a", "b", "c"]
true
["a", "a", "b", "b", "c", "c"]
["a", "b", "c"]
["a", "b", "c", "a", "b", "c"]
["a", "b", "c"]
["a", "b", "c"]


■ソース
acids = ["Adenin","Thymine","Guanine","Cytosine"]
signs = acids.map{|acid|acid[0,1]} #acid[0,1]の部分は文字列のインデックス範囲をあらわします

p signs

■結果
["A", "T", "G", "C"]

■ソース
acids = ["Adenin","Thymine","Guanine","Cytosine"]
signs = acids.map{|acid|acid.downcase}

p signs


acids = ["Adenin","Thymine","Guanine","Cytosine"]
signs = acids.map(&:downcase) #downcaseの省略記述

p signs       
■結果
["adenin", "thymine", "guanine", "cytosine"]
["adenin", "thymine", "guanine", "cytosine"]

■ソース 文字列を数値に直しソート
array = ["73","2","5","1999","53"]
p array
p array.sort #普通のソート
p array.sort{|x,y| x.to_i <=> y.to_i} #数値に変換して逆普通のソート

■結果
["73", "2", "5", "1999", "53"]
["1999", "2", "5", "53", "73"]
["2", "5", "53", "73", "1999"]

■ソース 連想配列
month_to_ordinal = {
    "Jan" => 1, "Fed" => 2, "Mar" => 3, "Arp" => 4, "May" => 5, "Jun" => 6, "Jul" => 7,
    "Aug" => 8, "Sep" => 9, "Oct" => 10, "Nov" => 11, "Dec" => 12,  
}

p    month_to_ordinal["Aug"]
p    month_to_ordinal["Jun"]   
p    month_to_ordinal["Oct"]

■結果
8
6
10

2011年4月11日月曜日

phpで正規表現作業まとめ

今回ereg_replace()でDeprecated: Function ereg_replace() is deprecatedの
 のエラーが多発、調べてみるとphp5.3 以降regex 拡張モジュールは非推奨となります的
なエラーでした。

 解決策としてpreg_replace()を使用し解決しましたので、その時の作業内容をまとめます。

① aタグの削除
$削除パターン  = "/((<a.*>)(.*)(<\/a>))/";
preg_replace($削除パターン,"","$text")
となります。「/」はパターンの最初と最後に「/」がきます。
「\/a」の\はエスケープ文字です。

②日付の抽出
$抽出パターン = "((?:[0-9]{4})(?:[\/]?)(?:[0-9]{0,2})(?:[\/]?)(?:[0-9]{0,2}))"; 
preg_match_all($抽出パターン,"$text","$抽出された文字列");
「?:」はモシはればです。もう少しすっきり書く事ができるんですが今回はここまで、


2011年4月2日土曜日

PHPでDao.Dto.Beansを簡単に書いてみた

<?php

//Bean
class HumanBeans
{
    private $name;
    private $age;
   
    public function setName($name){
        $this->name = $name;
    }
   
    public function setAge($age){
        $this->age = $age;
    }
   
    public function getName(){
        return $this->name;
    }
   
    public function getAge(){
        return $this->age;
    }
}

//Dto
class HumDto
{
    private $dtolist;
    private $ageTotal;
    private $ageAverage;
    public function HumDto(){
    }
   
    //リストをsetしサイズを返す
    public function listSet($dtolist){
        $this->dtolist = $dtolist;
        return count($this->dtolist);
    }
   
    //Ageの合計
    public function ageTotal(){
        for($i = 0 ; $i < count($this->dtolist) ; $i++){
            $this->ageTotal += $this->dtolist[$i]->getAge();
        }
        return $this->ageTotal;
    }
   
    //Ageの平均を返す
    public function ageAverage(){
        $this->ageAverage = $this->ageTotal/count($this->dtolist);
        return $this->ageAverage;
    }

}

//Dao
class HumDao
{
  //今回は$humをDBのデータと見立てて使います 
     public $hum = array(
         0 => array('name' => 'ito' , 'age' => 9,),
         1 => array('name' => 'suzuki' , 'age' => 21,),
        2 => array('name' => 'tanaka' , 'age' => 33,)
     );


    public function HumDao(){
        $humlist = array();
        //print_r ($this->hum);//配列データ
        $humdto = new HumDto();//Dto
        echo "<br>";
        for($i = 0 ;$i < count($this->hum) ; $i++){
            $bean = new HumanBeans();
            $bean->setName($this->hum[$i][name]);
            $bean->setAge($this->hum[$i][age]);
            $this->humlist[] = $bean ;
        }
       
        echo $humdto->listSet($this->humlist)."データサイズ<br>";//Dtosetデータサイズ
        echo $humdto->ageTotal()."Ageの合計<br>";//Ageの合計
        echo $humdto->ageAverage()."Ageの平均<br>";//Ageの平均
       
        //var_dump($this->humlist);
        for($i = 0 ; $i < count($this->humlist) ; $i++){
            echo "名前:".$this->humlist[$i]->getName()." ";
               echo "年齢:".$this->humlist[$i]->getAge()." ";
            echo "<br>";
        }
    }
}

new HumDao();





2011年4月1日金曜日

phpでインターフェイス



<?php
interface Car
{
    public function run();
    public function stop();
}


//
class Mira implements Car
{
    public function Mira(){
        echo "Mira";
    }

    public function run()
    {
        echo "はしる";
    }
    public function stop()
    {
        echo "とまる";
    }
   
    public function tab(){
        echo "ターボ";
    }
}


class F1 extends Mira
{

    public function F1(){
        echo "F1";
    }
   
    public function run(){
        echo "はやくはしる";
    }
       
}



echo "Miraを動かします「";
$mira = new Mira();
$mira->run();
$mira->tab();
$mira->stop();
echo "』";

echo "Miraを継承「*ここでは車的に言うと    改造」したF1を動かします「";
$f1 = new F1();
$f1->run();
$f1->tab();
$f1->stop();
echo "』";


/***********結果**********/