Prog-me.

Rails中心、機械学習も、インフラもセキュリティも

rbenv version ~~ is not installed となったとき

rbenv: version `2.1.0' is not installed

が出た時の対処法

rbenv install 2.1.0 

でOK!

ちな、このあと

rake aborted!

cannot load such file -- bundler/setup

っていうエラー出たんだけど、

 

stackoverflow.com

を参考にして、なんとかなった

gem install bundler

 

 

 

機械学習とかでPythonを取りあえず使いたい!って人のためのチートシート

 

リスト

sales = [33,24,67,34]
print len(sales) #4
print sales[2] #67

存在チェック

print 24 in sales #true

print range(10) #=>0から1の配列を返す
print range(3,10,2) #=>3から始まる、2とばしの10以下の配列

並べ替え

sales.reverse #=>単に要素の順番を逆にする
sales.sort #=>小さい順に並ぶ
大きい順に並べるには sales.sort.reverse

文字列をリストに split

d = "2013/12/15"
print d.split("/") #=> ["2913","12","13"]

リストを文字列に join

a = ["a","b","c"]
print "-".join(a) #=> a-b-c 

タプル(変更できない) ()

a = (2,5,8)
リストと同じようにlenとかメソッド使える
print len(a) #3
print a * 3 #(2,5,8,2,5,8,2,5,8)

セット(集合型,重複を許さない) ([])

a = set([1,2,3,4,1])
print a #=> [1,2,3,4] 1が無視される、重複なので

集合の計算ができる

a = set([3,4,5])
和集合を出してみよう
print a | b #=> [1,2,3,4,5]

辞書型データ {}

keyとvalueがセットになったもの
sales = {"shiho": 100, "yamada":50}
print sales["shiho"]

中身を変えるには

sales["shiho"] = 900

keyが存在するか

"shiho" in sales #true

キーの一覧

sales.keys()

valueの一覧

sales.values()

キーもvalueも

sales.items()

条件分岐

if

score = 70
  if score > 60 : 
  print "OK"

繰り返し

for

sales = [23,45,266]
sum = 0

for sale in sales:
  print sale 
  sum += sale
else:
  print sum

elseというのは、ループが終わった時の処理を指す!

for i in range(10) で0から10までやってくれる
  if i == 3:
     continue(3をスルー) /  break(3でブレイク, 0,1,2だけ)

辞書型のデータで繰り返し

sales = {"shiho": 100, "yamada":50}
for key, value in sales.iteritems(): 
  print "key: %s value: %d" % (key,value)

while

n = 0
  while n < 10:
    n += 1
    print n
  else:
    print "end"
    

関数を使ってみる

def hello(name)
  print "hello %s" % name
#実行
hello("yoko")
      

リストのそれぞれの要素に関数の処理をやらせる map

def double(x)
  return x * x #二乗させる関数

map(double, [2,5,8])  #map(関数, リスト)
  

無名関数 lamda

print map(lamda x: x*x, [2,5,8])
 #=> [4,25,64]

オブジェクト (変数と関数をまとめたもの)

クラス:オブジェクトの設計図
インスタンス:クラスを実体化したもの

 class User(object): 
   def __init__(self, name)
     self.name = name
     
   def greet(self): 
     print "my name is %s" % self.name
     
 shiho = User("shiho")
 print shiho.name
 print shiho.greet()

スライスを使った文字列, リストの取得 :

インデックス

  • 文字列オブジェクト[開始インデックス: 終了インデックス]
0   1   2   3   4   5
 | A | B | C | D | E |
#文字

str = "ABCDE"
slice = str[1:3] #"BC"

slice = str[1:-1] #"BCD"

#終了インデックスを省略すると、自動的に最後の文字の次のインデックスが指定されたことになる
slice = str[1:] #BCDE

# 参考 http://www.pythonweb.jp/tutorial/string/index11.html

 

Ubuntu 14.04をThinkpad T500 に入れた時のメモ。

linuxをUSBで入れようと思い、biosでsecure boot の設定をdisableにしようとしたら、T500にはそもそもその選択肢がありませんでした。

なので、usbではなく外付けCDから起動。すんなりできました。

 

Polymorphicなモデル&それに対応したネストしたフォームを作る!

そもそもpolymorphicとはなにか。

例えばユーザーと商品がそれぞれ画像を持つときの、画像モデル。いちいちユーザ画像モデルと商品画像モデルを作るのは二度手間な気がする...。

そんなときPolymorphicにすると、ユーザモデルと商品モデルそれぞれに画像モデルを従属(belongs_toの関係)させることができる。

画像モデルはユーザの子でもあり、商品の子でもある。つまり、@user.imagesも@product.imageもできてしまうのだ。

-----------------------------

class User < ActiveRecord::Base

  has_many :images, :as=> :imageable #imageableという名前で親モデル(User)を抽象化している。

 

class Product < ActiveRecord::Base 

  has_one :image, :as => :imageable #imageableという名前で親モデル(Product)を抽象化している。

 

class Image < AcriveRecord::Base

  belongs_to :imageable, :polymorphic => :true #抽象化された親モデル(imageable)に従属している。

 

-----------------------------

 

さてしかしこれだけだと、Images データベースに値が入って、ProductなのかUserなのかわからないということが起こりうる。

なので、imagesDBに

imageable_type #=> ProductかUserかを判別するため。今回は"Product"か"User"の文字列を入れる

imageable_id #=> productかuserのIDを入れる。

という2つのカラムを足す。

 

これでモデルの関係を示す記述が完成した。

次はこのモデル関係に対応して、商品のDBと画像のDB両方に一気にレコードを入れるフォームを作る。

ネストしたフォーム(この場合は商品フォームの中に画像フォーム)を作る場合は、accepts_nested_attributes_forをモデルに追加する。

 

------------------------------------

class Product < ActiveRecord::Base

  has_one :image, :as => :imageable  

  accepts_nested_attributes_for :image

end

-------------------------------------

 

これで何ができるかというと、viewで

-------------------------------------

<%= form_for @product do |p| %>

  <%=p. text_field :name %>

 ・・・

  <%=p.fields_for :image, @product.image || Image.new do |i| %> #=>ネストした画像フォーム

    <% if @product.image.present? %>

      <%= image_tag @product.image.image.url %>

    <% end %>

    <br/>

    <%= i.label :image %>

    <%= i.file_field :image %>

    <%= i.hidden_field :imageable_type, value: "Product" %>

    <%= i.hidden_field :imageable_id, value: @product.id %>

  <% end %>

・・・

-------------------------------------

パラメータはどうなるのかというと、

iamge_attributes の中に imageとか、imageable_typeとかが詰まっている形になるので、

-------------------------------------

params.require(:product).permit(:name,....., :image_attributes => [:image, :imageable_type, :imageable_id, ...])

-------------------------------------

でとれる。

 

 

ruby のinitializeについて

initializeという特別なメソッドを定義すると、newメソッドインスタンスを生成するときに、同時にこのメソッドが呼ばれます。

 

Rubyオブジェクト指向については、

がおすすめです!