To eliminate this warning, please install libyaml and reinstall your ruby.

rake db:migrateを叩いた所
以下のようなメッセージが出たのでメモ

# rake db:migrate
It seems your ruby installation is missing psych (for YAML output). To eliminate this warning, please install libyaml and reinstall your ruby.


libyamlが入っていないから、入れたまえというメッセージ。

# yum -y install libyaml-devel

libyamlを反映するためにrubyコンパイルし直すのだが、
libyaml.soがどこにインストールされたか確認し、パスを指定する。

# whereis libyaml
libyaml: /usr/lib64/libyaml.so

/usr/lib64/libyaml.soにあることが判明。

# cd /usr/local/src/ruby-1.9.3-p545
# ./configure --with-opt-dir=/usr/lib64 --disable-install-doc
# make
# make install

再びrake db:migrateを実行。

# rake db:migrate
# 

何もメッセージがでなくなった。OK.

フェアな世界

私は事業会社のいちディレクターに過ぎませんが、
常々、世の中はフェアじゃないなと感じています。

営業さん、エンジニアさん、デザイナーさん、パートナーさん、そしてお客さん、色々な立場の人たちと共に事業を作っています。

お金を払っているお客さんは立場上強く、色々わがまま言う方もいますし、こちらもお金を払う立場となれば、ある程度強く言うことはできてしまいます。

雇用形態も固定と変動とありますが、固定のほうが、立場上どうしても指揮系統では上位になります。

職歴や経歴によって、任せられる仕事の幅だって変わってきます。
今から変えよう、変わろう、と思っても、既存の枠組の中では、フェアに競うことは、かなり難しいわけですよね。


その点、ソフトウェアエンジニアの世界は本当にフェアだなって思うのです。
パソコンひとつあれば仕事が出来ます。スキルだって身につけられます。

これまでどんな人生を歩んできたとしても、今からリスタートできるわけです。


こんな誰にでもオープンで、差別のない、素晴らしい世界での自己実現
最高にクールだと思うわけです。

と、この記事を読んで改めて感じました。
http://naze.chibicode.com/why-blog/

pluckって便利!

テーブルの中から、特定のカラムの値のみを抽出したいと思って試行錯誤していたら、友人からpluckなるメソッドを教えていただきました。

はじめ、

hoge = Hoges.find(:all, :select => :hoge_id, :limit =>5, :conditions => { :fuga_id => params[:id] })

出力結果
[#<Hoges fuga_id: 13>, #<Hoges fuga_id: 14>]

みたいに取り出そうと思っていたのが、なんと

hoge = Hoges.limit(5).pluck(:fuga_id)

出力結果
[13,14]

と、大変シンプルに!

今後重宝しそう。(∩´∀`)∩ワーイ

deviseのcurrent_userで呼び出せるデフォルトの項目

まんまインストールした際には、
テーブルは以下のカラムで構成される。

id
email
encrypted_password
reset_password_token
reset_password_sent_at
remember_created_at
sign_in_count
current_sign_in_at
last_sign_in_at
current_sign_in_ip
last_sign_in_ip
confirmation_token
confirmed_at
confirmation_sent_at
unconfirmed_email
created_at
updated_at
name
uid
provider
access_token

controllerで呼び出す場合は、

def hoge
  if user_signed_in?
    @hoge = current_user.id
  end
end

で呼び出せる。

facebookのGraphAPIを使ってアイコンを取得する

この情報は、2014/3/25の情報です。

※仕様はしょっちゅう変わる模様なので、
 公式リファレンスを見た方が確実!


やり方は非常にシンプルで、

https://graph.facebook.com/'id'/picture

これだけで取得できる。
idの代わりに、usernameでも良い模様。

ちなみに、デフォルトのアイコンは非常に小さい。
場合によっては、サイズを加工したいときがあるはず。
いちいちサーバ上で画像加工処理して・・・は
非現実的&著作権の問題に引っかかる可能性がある?ため、
もっとシンプルな方法がある。

https://graph.facebook.com/'id'/picture?width=300&height=300

こうすることで、所得時に画像サイズを指定して取り出すことが出来る。

べんり!

link_toヘルパーを利用してviewからcontrollerに値を渡す

postとかcookieとか他にも方法はあるようですが、
今回はクエリとしてURLにパラメータくっつけて渡します。

|環境
CentOS6.4
Rails 3.2.13
ruby 1.9.3
MariaDB 5.5.32


|view側

<%= link_to("リンク名", :action => "hoge", :para => @para.id) %>

第一引数はリンク名、第二引数はアクション名、第三引数にコントローラに送るパラメータを指定。


|controller側

def hoge
  logger.debug (params[:para]) 
end

params[:para] にview側の@para.idが格納されてます。

ちなみにURLはこんなかんじ。
/hoge?para='@para.idの値'


調べてないけど、button_toとか同様のアクションメソッドでもいけるんじゃないかしら。

Javascriptで取得した変数をRails経由でDBに格納する

やってみれば全然大した作業ではなかったんですけど、
他にあんまりドキュメントが無かったので迷い子がいるんじゃないかと思いログを残しておきます。

|環境
CentOS6.4
Rails 3.2.13
ruby 1.9.3
MariaDB 5.5.32


|やりたいこと
Google Maps V3を用いて取得したデータをrails経由でDBに格納。
フォームのpost経由で格納します。


|実装内容
まずはAPI側ですが、こちらは日本語リファレンスがかなり充実してるので
以下あたりを参考にどうぞ

https://developers.google.com/maps/documentation/javascript/tutorial?hl=ja
http://www.ajaxtower.jp/googlemaps/
http://dotinstall.com/lessons/basic_google_maps

自分が実装したコードはこちら
<script type="text/javascript">

<!--

var map;

function initialize(){

var latlng = new google.maps.LatLng(35.658704, 139.745408);

var opts = {

zoom: 15,

center: latlng,

mapTypeId: google.maps.MapTypeId.ROADMAP

};

map = new google.maps.Map(document.getElementById("map_canvas"), opts);

//現在位置取得

if (navigator.geolocation) {

navigator.geolocation.getCurrentPosition(function(position) {

map.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));

}, function() {

alert('エラーです。現在地を取得できません');

}

);

} else {

alert('この端末はサポート外です。');

}

//第2引数にドラッグを指定。クリックも可能。

google.maps.event.addListener(map, 'drag', dispLatLng);

}

//中心の座標を取得

function dispLatLng(){

var latlng = map.getCenter();

//画面上に出力

var str = "[CENTER]=[" + latlng.lat() + "," + latlng.lng() + "]<br />";

document.getElementById("latlng").innerHTML = str;

document.getElementById('フォームに渡す変数').value = latlng.lat();

document.getElementById('フォームに渡す変数').value = latlng.lng();

}

//オンロード処理。ここはもっと良い方法があるかも

window.onload = initialize;



// -->

</script>



次に、フォームの設定。

railsを使うので、任意のviewに以下を追記

view/_form.html.erb

<div id="map_canvas" style="width:500px; height:300px"></div>

<p id="latlng" style="font-size:10px;"></p>

<%= f.hidden_field :lat, :value => :lat %>

<%= f.hidden_field :lng, :value => :lng %>



レンダリング後はこんな感じになります。

<div id="map_canvas" style="width:500px; height:300px"></div>

<p id="latlng" style="font-size:10px;"></p>

<input id="テーブル名_lat" name="テーブル名[lat]" type="hidden" value="lat" />

<input id="テーブル名_lng" name="テーブル名[lng]" type="hidden" value="lng" />

ここで、JS側の'フォームに渡す変数'を、inputのidと同一にすればOKです。