OnsenとRuby

Ruby初心者。というかプログラム初心者の日記。 

Railsをデプロイするならsqaleがオススメだよ。

Railsでデプロイと言えば、Herokuですが、ロリポでお馴染み、ペパボさんのPaaS「Sqale」も良いですよ。

特にRubyPHPの初心者で「フレームワークもローカルでは動かせるよ~、次のステップとして実際にデプロイにチャレンジしたいなー。」っていう初心者の方々にはぴったりです。


初心者にオススメの理由
・なんか雰囲気が優しい感じがする。
あのツイッターバードをデザインしたSimon Oxleyさんがキャラクターを担当されてるようです。なんかほのぼのしちゃう絵ですよね。

・デプロイの方法が詳しく記載してある。
雰囲気が優しいだけじゃないですよ。Sqaleのサポートページではデプロイの仕方が詳しく記載してあります。
ウェブページをごちゃごちゃと調べなくていいなんて素敵ですよね。

・カスタマーサポートが出前より早い。
質問があればカスタマサポートにメールをできます。
その回答が早いんです。出前より早いです。
まさに自分専用のヘルプデスクを持った感じ。

以上、初心者さんがSqaleを好きになってくれそうな点を列挙してみました。

ただ、Herokuと違い月額料金940円が必要となります。
フリーミアムではないのですが、ある程度のユーザー数が増えても、このカスタマサポートを維持できるのであれば、大した金額ではなのかと思いますよ。


月額 940円で使えるクラウドホスティング
Sqale
http://sqale.jp/

Ruby on Rails 入門のための知識 2(メソッドと引数)

メソッドに対して渡せる引数について復習してみる。

まずは基本的な形で引数1つ。

def foo(a)
 puts a
end
foo("今日は大晦日") #=>今日は大晦日

特に問題なしですね。


fooメソッドの中身は今回は重要ではないため単純です。
Geekな皆様には楽しくない例題になるかもしれません。


引数は1つだけでなく2つでも渡せます。またデフォルト値を設定することもできます。

def foo(a, b=1)
  a + b
end
 foo(1) # => 2
 foo(2,3) # => 5
 foo(1,2,3) # => argument Error

引数を任意の個数で設定したい場合はメソッド引数の1つに*を入れましょう。
可変長引数(rest引数)と呼びます。

def foo (a, *rest)
  rest.each do |i|
    puts a + i
  end
end

foo(1,2) # =>3
foo(1,2,3) # => 3  4

fooメソッドが簡単な内容のためこれも問題ないと思います。

最後にハッシュを引数として渡す場合ですが、そもそもハッシュを引数として渡す理由を考えてみます。


すぐに思いつくものの1つに、
「引数が多くなればなるほどその順番を覚えるのが困難になる」
という問題がありますよね。


それを解決するためにハッシュを渡してあげます。
(他の言語では名前付き引数という呼び方でメソッド呼び出し構文があるようです。)

コードで例を示します。

def foo (args)
	a = args[:a] || 0 
	b = args[:b] || 0
	c = args[:c] || 0
	return a + b + c
end

 foo({:a => 1 , :b => 2, :c => 3})  # => 6
 foo({:b => 1 , :a=> 2, :c => 3})   #Hashのため順序は問わない
 foo({:a => 1}) # => 1


#ハッシュは通常{}内に記述するルールですがハッシュが
#メソッドの最後の引数ならば{}は省略できます。
 foo(:a =>1, :b =>1) # => 2

#もちろんfoo()のかっこも省略可能です。
 foo :a => 1, :b =>1 

#Ruby1.9で使える構文もやってみましょう。
 foo a:1 , b:1 

少しわかりにくいのが論理演算の部分ですね。

a = args[:a] || 0 

Rubyではまず、左側から評価されfalseかnilの場合に初めて右側が評価されます。
つまり引数が与えられない場合はnilなので初期値として0が代入されるわけです。



ハッシュが渡せるならブロックも渡せるんじゃないの?と考えた方は勘がいいですね。
「Rubyのyiledが難しい」をご覧ください。

これをどんどん進めていくとprocやらメタプログラミングやらに到達するようですが、このブログの対象外項目ですし(自分がわからないだけですが)とりあえずは、メソッドの項目はここまでにして私の学習後、改めて続きを投稿したいと思います。

Ruby on Rails 入門のための知識 1(シンボルとハッシュ)

Ruby on Railsの勉強に突入しました。

RoRはMVCモデルが分かってても実際の書かれているコードがいまいちよくわかんない状態になりがちです。特にハッシュとシンボルは理解していないとRoRのコードの意味が理解できないじゃないでしょうか。

ということでRoRを勉強するにあたって事前に知っておいた方がよい知識をまとめておきます。



今回は「シンボルとハッシュ」についてです。



Ruby初心者の愛読書「たのしいRuby 第3版」p41についてシンボルの説明があります。

シンボル(Symbol)というのは、文字列に似たオブジェクトで、Rubyがメソッドなどの名前の識別に使うラベルをオブジェクトにしたものです。
シンボルと同様のことはたいてい文字列でもできます。ハッシュのキーのように単純に「同じかどうか」を比較するような場合は、文字列よりも効率がよいことが多いので、シンボルもよく使われます。

たのしいRuby」全ページでシンボルの説明はこれだけです。
これだけでは初心者には全くわからないですね。でも大丈夫。私が代わりに調べました。


まずは文字列ハッシュからみてみましょう。

capital = {"france" => "Paris", "japan" => "Tokyo", "uk" => "London" }

次はシンボル

capital = {:france =>"Paris", :japan => "Tokyo", :uk => "London"}

シンボルで書いたほうがスッキリ。
ですが「文字列よりも効率がよい」の意味が解明されていないですね。


ここでなぜ「効率がよい」のかというとシンボルは参照型だからです。つまりオブジェクトが生成された後は常にそのアドレスを参照します。

ハッシュの値にシンボルを使うと、比較のために渡されたシンボルも同じアドレスを参照しているためstr文字列よりもRubyインタープリタの処理が断然速いわけです。

ゆえに、「たのしいRuby」が教えてくれたように、Hashキーのような文字列としてよりも、識別子としての文字列の場合はシンボルを使ったほうがいいということになりそうです。

(識別子というのは、例として、上記のハッシュで値は、Tokyoは絶対にTokyoじゃないと駄目ですね。TokやTokyでは駄目です。Tokyoは地名であって識別子ではないからです。ただしキーの場合はjapanでもいいしjpnでもいいしjpでもそれがプログラマに日本を意味しているのが識別できればいいわけです。)



今までの内容をRubyコードで検証してみましょう。

Rubyでオブジェクトの等値性を比べるときに便利なのが、euqal?とeql?メソッドです。
equal?はオブジェクトが同一オブジェクトを参照しているのか調べます。
eql?はobjectクラスではequal?と同義語として定義されていますが、再定義される場合は型が同じで値も等しいかを調べるように再定義される場合が多いです。

お持ちの方は、「たのしいRuby」 p68のコラムをご覧下さい。

「==」は比較する値同士のクラスが違っていても適当に変換して比較を行いますが、eql?メソッドは変換せずに比較を行っています。
ハッシュ内部のキーと与えられたキーとの比較など、多少厳密に比較を行う必要がある場合には、eql?メソッドが使われます。

コードを見てみましょう。

x ="paris"
y ="paris"
p x.equal?(y) # => false
p x.eql?(y)  # => true

x =:paris
y =:paris
p x.equal?(y) # => true
p x.eql?(y)   # => true 

eql?が共にtrueなので文字列でもシンボルでもハッシュのキーとしては妥当ですね。
ただ、同じシンボルならeql?とequal?での同一性が保障されるわけです。
※Numericをキーにする場合は1eql?(1.0)はfalseですので注意してください。

シンボルのほうが同一性あるし、スッキリしてて、実行も速い。
だったらハッシュにはシンボルでいいじゃんということです。


長い文章で疲れたと思います。が!
最後に大切なことをもう1つだけお教えします



ハッシュリテラルについてです。
ハッシュの表記方法ですがRoRでよく使われるのは、

capital = { :france =>"Paris", :japan => "Tokyo", :uk => "London" }

ではなくて。下の書き方です。

capital = { france: "Paris", japan: "Tokyo" , uk: "London" }

キーにシンボルを使う場合はコロンをハッシュキーの最後につけると矢印を省略して書けますというRuby1.9の表記方法です。


この表記法には慣れておいたほうがよいです。
応用例を示してこの投稿は終わりにしたいと思います。

params = {}
params[:user] ={ name: "Onsen Ruby", email: "onsenruby@onsen.com" } 
p params 
# => {:user=>{:name=>"Onsen Ruby", :email=>"onsenruby@onsen.com"}}
p params[:user][:email]  
# => "onsenruby@onsen.com"

Rubyのyieldが難しい。

手続き型オブジェクトがいまいちわからなかったので下記のサイトを見て
ようやく入口に立つことができた感じ。

Ruby の yield って結局なんなの?
http://d.hatena.ne.jp/yoshidaa/20090511/1241967137


Procは{}を引数としてメソッドに渡すことができるからやはりイテレーターと相性がよいわけです。
それで自作のイテレーターを作ってみたいと思う。
まずは単純な例として。

def foo
 yield
 yield
 yield
end

これでyieldを3回呼び出すメソッドを作成できました。

yiled(ブロック)に引数を渡すにはyiled文の後ろに続けて書くことができます。

def foo(a,b,c)
 i = 0
 while(i < a)
    yield i + b + c
    i += 1
 end
end

foo(3,1,2){|x| puts x} 

実行結果
=>3,4,5

SONY 米国TVシェア2%台

今日はプログラムと無関係の話題を・・・。
ダイアモンドモンドオンラインの記事がYAHOOにリンクされていたため『SONY米国TVシェア2%台の衝撃』という確かに衝撃的な記事が目に飛び込んできた。

「いつ撤退しても、おかしくないと思っている」

ある現地の家電メーカー幹部は、今年秋口の米国内の実売台数のデータに目をやりながら、そう明かした。

米国はいまだ年間約4000万台のテレビ需要がある巨大マーケットだ。しかしこの秋、赤字覚悟の価格競争を続ける体力がなくなったソニーは実売台数ベースでシェアが2%台に急減。一時は1%台となった。トップシェアの韓国サムスン電子の、実に10分の1以下の台数しか売れていないというのだ。

http://newsbiz.yahoo.co.jp/detail?a=20121213-00029311-diamond-nb

NewsにはFacebookの投稿欄が設けられていて、その発言の中にもTVというSONYの代名詞だった製品の凋落ぶりを嘆くコメント多い。

私の意見としてはむしろこのTV凋落は歓迎だ。
というのは、サムスンやTCL等の新興国企業に加えアメリカのVIZIOのようなベンチャー企業の参入で価格競争が必至である市場にいつまでもしがみつく必要はないだろうと考えるから。

競争の激しい分野での売り切り型ビジネスから日本企業は早く撤退すべきだ。
元SONY CEO出井が書いた本を読み漁っていた時期があるが彼の考えていたビジネスは、「再生機器を抑えそのコンテンツを抑える」というものだった。
SONYの撮影機器で撮影された映画をSONYピクチャーズが配信しそれをSONYの再生機器で見る。といえば分かりやすい。


このビジョンは素晴らしかったと思うのだが、ipodiphoneが出てきた頃からこの戦略をソフトウェアに置き換えた世界をappleが実現してしまった。如何せんSONYはその企業の成り立ち上、ハードウェア技術志向(のエンジニア達が幅を利かせている)の会社なのでソフトウェアを開発できるだけのリソースがなくソフトの世界ではその存在感が無くなってしまった。

少し話がそれるが、出井、ストリンガー体制をSONYの、「ものづくり文化」を壊し業績を凋落させた戦犯だと批判する人達がいるがそれは間違っていると私は思う。ハード(ものづくり)を作っても売れないからだ。ハードウェアから脱却しソフトウェア主体の会社を作れなかったという観点からみれば彼らは失敗したのだろう。ただそれは、CEOとして日本企業の持つ文化を打ち破り新しい組織を作るべきだったということであって、ハードウェア文化を捨てようとしたことではない。


SONYは今でもハードウェア主体の会社だろうから、TV販売は売り切り型のビジネスしかできないだろう。
SCE出身の平井氏がCEOになったことから見るに、PlayStationを核としたソフトウェア世界での成功をまだ捨て切れていないようなのだが、そんな幻想は捨ててCMOS等新興国が持ってないハードウェア技術を核とした分野にリソースを注ぎ込んだほうがいいだろう。
といいつつも、病院で内視鏡検査をする時にそこにSONYロゴがあれば多少の寂しさは感じるかもしれないが。

Active Recordを使ってsqlite3操作。

Ruby/DBIを使ってSqlite3接続を勉強中。
dbh.do()でデータベースに接続してCRUD操作をやるとなるとSQL文の発行が多くなってしまう。
そこでRailsでも使われているActiveRecordをO/RマッパとしてCRUDしてみる。


まずは参考にしたサイトをご紹介しておきます。
=> http://ofps.oreilly.com/titles/9780596521424/activerecord_id347149.html
Rails 3 in a Nutshell

require "rubygems"
require "active_record"

ActiveRecord::Base.establish_connection(
:adapter =>'sqlite3',
:database =>'test01.db'
)
class Drink < ActiveRecord::Base
end

drink = Drink.new
drink.id = 1
drink.name = "CocaCola"
drink.volume = 30
drink.save()


sqlite3はユーザーやpassという概念がないので:adapterと:databaseのみを指定。
今回はsqlite3であらかじめdrinks(Railsの規約で複数形)のテーブルを作っておきました。


Active Record モデルがActiveRecord::Base1を継承しています。
Drinkクラスは何も記述がありませんが、既に様々な機能が使えます。入力された項目のチェック等別の追加機能が必要な場合にここに付け加える必要があります。(上記で参考にしたオライリーのサイトではマクロ機能と呼ばれていました。)


drink.saveの時点でsqlのテーブルにデータが書き込みされます。
CRUDのCはこれで完了です。

DBから読み込みする場合には

class Drink < ActiveRecord::Base
	def to_s
	  return "ProductID@#{id} Name:#{name} Volume:#{volume}ml"
	end
end

Drinkクラスでto_sをオーバーライド。

Drink.find(:all).each do |i|
	puts i.to_s
end

実行すると無事に結果が返ってきます。

ProductID@1 Name:CocaCola Volume:30
ProductID@2 Name:DEKAVITA Volume:20
ProductID@3 Name:SuperDRY Volume:25
ProductID@4 Name:Boss Volume:300ml

CRUDで残ったURの場合ですが、参考にしたサイトが13年春発売の宣伝ページのような物なので詳しく掲載されていませんでした。
既存のデータベースをを呼び出して更新と削除をしなさいと書いてあるのでfinderでレコードを引張ってきてチェインでアクセサメソッドを呼び出すということだと思います。