ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

VirtualBox上のCentOSでルートディレクトリを拡張する

主にRubyの開発で使用しているVirtualBox上のCentOSにて
ルートディレクトリの容量が不足しているとの警告が出始めました。

いろいろ調べて実行してみた結果、以下のサイトの記事が参考になったので
リンクを載せておきます。

Linuxのディスク管理の仕組みについて(LVMについて)
VirtualBox環境構築:CentOS - ハードディスク拡張

ディレクトリの拡張方法
VirtualBoxのCentOS環境のディスク容量を増やす [ freespeedo's blog ]

以上です。大変詳しく書いてあるので、特に自分が追記することはないですね(笑)

初めてのAmazon EC2 - 1.ユーザー登録からOSへのログインまで

クラウドのディファクトスタンダードとなっているAmazon EC2
触ってみました。

さすがに情報は沢山あるのですが、それでも躓いたところがあるので
(それから今後もあると思うので・・・)、解決策を書いていきたいと思います。

まず、自分の場合は数ある情報の中から
Amazon Web Services入門 (全17回) - プログラミングならドットインストール
を参考にし、紹介されている手順通りに進めました。

このブログを書いている時点では、スクリーンショットなども紹介されている
通りです。

ですが、以下の点に躓いたので、書いておきます。

1.Amazonユーザー情報の登録時にエラー
氏名・住所・住所番号を入れる画面でエラーが発生しました。
メッセージとしては、入力が間違えているか同意事項にチェックがない、というような
内容だったと思います。

解決策としては、電話番号欄に国を識別するコード(日本であれば+81)を入力すれば
大丈夫です。
こんな感じです。

+81-09011112222

2.TeraTermで「無効なホスト」エラー
Amazon Web Services入門 (全17回) - プログラミングならドットインストールでは違いましたが
自分はWindowsで作業しているので、SSH接続にはTeraTermを用いようとしました。
が、「無効なホスト」というエラーで接続できませんでした。

TeraTermのホスト名に「ssh -i app_name.pem ec2-user@00.000.000.000」を入力すると
起きるようです。

使用インスタンスのパブリックDNSである「ec2-**********.compute-1.amazonaws.com」を
入力すると接続できます。

後はユーザー名に「ec2-user」、パスワードは空で
"RSA/DSA鍵を使う"欄にはダウンロードした.pemファイルのパスを指定します。


以上、Amazon EC2 のユーザー登録からOSログインまでで躓いたところでした。

RailsのModel内でYoutube動画を検索する

タイトル通り、RailsのModel内でYoutube動画を検索してみました。

RubyでYouyube動画を検索する方法はネットで調べれば
直ぐに分かりますが、備忘録として載せておきます。

今回は以下のサイトを参考にしました。(てか、ほとんど真似ている・・・)
RubyプログラムからYouTube Data APIを使って動画検索 : 兀兀 -プログラミング編-

以下、手順です。Railsのプロジェクトは作成済みとします。

1.Gemfileに以下を記述し、bundle install。
gem 'nokogiri'

2.Youtubeから検索するためのVideoモデルと、RSpecのvideo_specを作成する。

3.videoモデルにsearch()メソッドを追加し、上記サイトのサンプルソースを貼り付け、実行すると以下のエラー。
dynamic constant assignment

原因は"URL"が大文字であるため、定数として認識されるため。
"URL"をメソッドの外に出す。

4.ここまででYoutubeから検索はできるが、今回の要件に合わせて次の変更を加えた。
・検索キーワードは引数で渡されるようにする。
・検索したYoutube動画のタイトルと、動画のID?をArticleモデルに入れて返すようにした。

以上です。参考までに作ったソースを載せておきます。

video.rb


require 'nokogiri'
require 'open-uri'

class Video < ActiveRecord::Base
URL = 'http://gdata.youtube.com/feeds/api/videos?vq='

def self.search(keyword)
keywords = URI.encode(keyword)
options = '&orderby=published'

uri = URI(URL + keywords + options)

doc = Nokogiri::XML(uri.read)

articles = []

doc.search('entry').each do |entry|
article = Article.new
article.title = entry.search('title').text
article.youtube_video = entry.xpath('media:group/media:player').first['url'].scan(/\bv=\w*/)[0].delete('v=')
articles.push(article)
end

return articles
end
end

video_spec.rb


require 'spec_helper'

describe Video do
describe "search" do
it "youtubeから検索すること" do
articles = Video.search('Top Gear - BBC')
expect(articles.count).to be > 0
expect(articles[0].title).should_not eq("")
expect(articles[0].youtube_video).should_not eq("")
end
end
end

Ruby on Rails - 入力した改行をそのまま表示する方法

textarea等から複数行の文章を入力した場合、データベースには
(デフォルトでは)改行コード込みでそのまま登録されます。

ですが、この登録された文章をラベルなどで表示した場合
改行コードが無視されてしまいました。

結局、simple_format()を使うことで解決しました。
simple_formatについては、以下のリファレンスを参考にしてください。
simple_format - リファレンス - Railsドキュメント

使い方は、こんな感じです。

simple_format(article.text)
ここではArticleテーブルのtext列の値を表示しています。

以上です。

Ruby on Rails - .jsファイルが二重に読み込まれる

Ruby on Railsにて、Railsサーバを起動してブラウザよりアクセスしてみると
.jsファイルが二重に読みこまれる事象が発生しました。

状況としては
・application.jsには手を加えていない
・デフォルトでコントローラ名.js.coffeeが存在する
JavaScriptを記述するため、コントローラ名.jsファイルを作成した
という状況です。

原因としては、Railsがコントローラ名.js.coffeeファイルを変換して
.jsファイルを作成したため、自分で作成したコントローラ名.jsファイルと
ファイル名が重なっていたためでした。

結局、.js.coffeeは削除することで、解決しました。

以上です。
分かってしまえば簡単ですが、意外と時間を食ったので
メモとして載せておきます。

Canvasに描いた画像をサーバに送信する

Canvas上で描いた絵は、クライアント上(つまりJavaScript)のcanvasオブジェクト
toDataURL()メソッドで画像として取得することができます。

今回は、Canvasに描いた絵を画像として取得し、Ruby on Railsのサーバに送信してみました。

この方法を用いれば、クライアント上でサインを署名し、サーバにて保存するようなアプリを
Webアプリとして実装できることになります。

以下、ソースです。

1.JavaScript

$("#save_button").click(function () {
data = canvas.toDataURL();
$.ajax({
type: 'post',
url: 'pictures/create',
data: {picture : data},
success: function(data){
$("#delete_button").click();
}
});
});
toDataURL()メソッドを使い、Canvas上に描いた絵(サイン)を取得しています。
取得した画像を、ajaxを用いてサーバに送信しています。

2.Railsのコントローラ

def create
data = Base64.decode64(params[:picture])

#この辺りで保存する。

#戻り値は適当。
render :json => nil
end

paramsより画像データを取得し、デコードしています。
デコードするのは、JavaScriptのtoDataURL()メソッドで取得したデータは
Base64エンコードされているためです。
後はコメントに書いたとおり、取得した画像データをサーバ内で保存すればいいと思います。

なお、画面のデザインや、Canvasを使用した絵を描く画面の作成については
[Web] スマートフォンとHTML5のCanvasを用いたお絵描きを実装してみた - YoheiM .NET
が大変参考になるかと思います。

以上です。

VirtualBox ゲストOSのWebサーバに外部から接続する

ゲストOS上で開発しているWebアプリに、スマートフォンなどの外部機器から
接続し、動作確認したいことがあるかと思います。

VirtualBoxを使用している場合
・ネットワークアダプタにブリッジアダプタを使用し、ゲストOSに固有のIPを振る。
 外部機器からはゲストOSに、固有のIPで指定して接続する。

・ネットワークアダプタにNATを使用し、ポートフォワーディングでゲストOSに接続する。
 外部機器からはホストOSのIPを指定して接続し、その接続をゲストOSにフォワードする。
 このため、ネットワーク内のIPアドレスを増やす必要がない。

の2通りありますが、今回は手軽なNATを使用する手順について説明したいと思います。


以下、手順です。
ホストOSはWindows7、ゲストOSはCentOSです。

1.ネットワークアダプタの設定、確認
VirtualBox マネージャー上で仮想マシンを選択し、「設定」ボタンを押下します。
「設定」ダイアログ上の左から「ネットワーク」を押下し、アダプターの割り当てを「NAT」にします。
f:id:UnderSourceCode:20130811210937j:plain

2.ポートフォワーディングの設定
上記画面の「ポートフォワーディング」を押下し、「ポートフォワーディングルール」ダイアログを
表示します。
右上の「+」ボタン(追加ボタン)を押下し、外部機器より接続するポートと、ゲストOS上のサーバの
ポートを設定します。
f:id:UnderSourceCode:20130811211632j:plain

3.Windowsファイアウォールの設定
Windowsファイアウォールの「詳細設定」ボタンを押下し、「受信の規則」-「新しい規則」を
押下します。
f:id:UnderSourceCode:20130811214924j:plain
ウィザードに従い、2.で設定した外部機器より接続するポートへの通信を許可します。
f:id:UnderSourceCode:20130811214233j:plain
f:id:UnderSourceCode:20130811214409j:plain

4.外部機器から接続してみる
スマホなどの外部機器のブラウザから
「ホストOSのIPアドレス:ポートフォワーディングするポート」にアクセスし
接続できることを確認します。

以上で、ネットワーク内のIPアドレスを増やすことなく、ゲストOS内のWebサーバに
外部機器から接続できるかと思います。