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 "』";


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