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

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

RubyMine - Ctrl + L で行選択する

タイトル通りの設定を行う、チョイねたです。
Sublime Text 2 と同じように操作するために設定しました。

以下、手順です。

1.[File]-[Settings]を選択する。
2.[Settings]ダイアログより、[Keymap]-[Editor Actions]-[Select Line at Curet]を右クリック。
3.[Add Keyboard Shortcut]を選択する。
4.[Enter Keyboard Shortcut]ダイアログにて、Ctrl + L を設定する。

以上です。

RubyMineでRSpec + Sporkを動かしデバッグする

タイトル通り、RubyMindeでRSpecをSporkサーバ上で動かし
デバッグする手順についてです。

Sporkサーバ上でRSpecを動かすと、RSpecの起動が早くなります。

以下、手順です。

■下準備
1.RubyMineでRails Applicationを作成する。

2.「Rails Application Settings」で「Skip Test:Unit files」にチェックを入れる。

3.Gemfileに以下を追記し、bundle installする。


gem 'therubyracer'
gem 'execjs'

group :development,:test do
gem 'rspec-rails'
gem 'spork', '1.0.0rc3'
end

4.RSpecをinstallする。
$ rails generate rspec:install

5.Controller、Viewを作成する。
$ rails g controller sample index

6.routes.rbに以下を記入し、index画面をルートページとする。


root 'sample#index'

7.アプリを起動し、ブラウザよりindex画面が表示されることを確認する。

■Sporkサーバの準備
1.[Tools]-[Run Spork DRb Server...]を押下する。

2.[Spork DRb Launch]ダイアログにて、[Choose test framework]は[RSpec]を選択する。
 [Perform bootstrap]に初回はチェックを入れ、[Run]を押下する。
 (初回以外はチェックを入れない)

3.コンソールに[pork is ready and listening on 8989!]と表示され、Sporkサーバーが
 起動していることを確認する。

4.[Run]-[Stop]を押下し、一旦Sporkサーバを停止する。

5. .rspecファイル内に以下を追加し、RSpecの起動オプションとしてSporkサーバを指定する。


--drb

RSpec、Sporkの起動とデバッグ
1.[Run]-[Debug]を押下し、[Debug]ダイアログより[RSpec with Spork DRb server:アプリ名]を押下する。

2.コンソールに[pork is ready and listening on 8989!]と表示され、Sporkサーバーが
 起動していることを確認する。

3.RSpecやController内にブレークポイントを設定する。

4.[Project]ウィンドウより実行したいRSpecファイルを右クリックし、[Debug 'Run spec・・・]を押下し
 RSpecを起動する。

5.ブレークポイントにて処理が止まることを確認する。

シェル内でsudoしてコマンドを実行する

sudoしてコマンドを実行する処理を、シェルにて行ったので
ちょい記事ですが備忘録として残しておきます。

ubuntuで実行したので、$ sudo su を行い
ヒアドキュメントを使っています。


#!/bin/bash

sudo su << COMMAND

cd 対象のディレクトリ
以下、実行したいコマンドを記入

COMMAND

以上です。

UbuntuでAngularJSを動かしてみる

以前に少し触っただけのAngularJSについて、もっと知ろうと思い
AngularJSのチュートリアルをやってみました。
AngularJS

今回はUbuntu上でやってみたので、AngularJSを動かすまでの
手順を以下にメモっておきます。

■動作環境
Ubuntu 13.10
・AngularJS 1.2.12

■手順
基本的にはAngularJSの通りですが
メッセージやエラーが出たので、以下の点を変えて行いました。

1.Node.jsのインストール
Node.jsが必要とのメッセージが出たため、以下のコマンドでインストールしました。

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update

2.npmのインストール
npmのインストール時にUNKNOWN, symlink ・・・というエラー発生しました。
結局、以下のコマンドでインストールしました。

npm install --no-bin-links

3.Chromeのインストール
AngularJSのテストを実行すると、以下のエラーが発生しました。
RROR [launcher]: Cannot start Chrome
Can not find the binary google-chrome
Please set env variable CHROME_BIN

テストで使用するKarmaは、Chromeが必要なようです。
なのでChromeをインストールしましたが、こちらはブラウザでChromeを検索し
以降はGUIでインストールしたので手順は省略します。

以上です。

Ruby on Rails - Zipファイルを読み込む。Jsonを解析する。

先の記事と同様、タイトル通りのサンプルを作ってみました。
こちらもモジュールとしていたので、備忘録として載せておきます。

とはいっても、Zipファイルの読み込みは
ほぼ下記サイトを参考にさせて頂きました。
http://blawat2015.no-ip.com/~mieki256/diary/201312292.html

Gemfile

gem 'rubyzip' 

モジュール


require 'zip'
require 'json'
require 'kconv'

module ZipData
def self.read(file_path)
content = get_file_content(file_path)
json = JSON.parser.new(content)
return json.parse()
end

private
def self.get_file_content(file_path)
bindata = {}
Zip::File.open(file_path) do |zipfile|
zipfile.each do |f|
name = f.name
size = f.size
next if name =~ /\/$/ # ディレクトリは除外
bindata[name] = zipfile.read(f.name)
end
end

content = bindata[File.basename(file_path, '.zip') + '.json']
return content.toutf8()
end
end

gemはrubyzip 1.1.0を使いました。
バージョンにより、使用できるメソッドが異なっていたため
Gemfileでバージョンを指定してインストールする必要があるかもです。

ziprubyというgemもありますが、こちらはRuby2.0では使えないようです。

get_file_content()でzipファイルの中身を読み込んでいます。
読み込んだ中身を、toutf8()でutf-8形式に変換しないと
後続のjson.parse()が上手く行かないようです。

read()では、zipファイルの中身のjsonjson.parse()でhashに変換して
返却しています。

ファイルの内容はhashになってしまえば、あとはhashオブジェクトの操作で
自由自在に扱うことができます。

Ruby on Rails - AWS S3からファイルを取得する

タイトル通り、AWSのS3からファイルを取得するサンプルプログラムを書いて見ました。

S3からファイルを取得する箇所をモジュールとして実装したので
そのモジュールを備忘録として載せておきます。

使用したgemは、aws-s3 です。
(aws-sdkAWSへの接続方法が違うので、注意してください。)

Gemfile

gem 'aws-s3', :require => 'aws/s3'

モジュール

require 'rubygems'
require 'aws/s3'

module Aws
include AWS::S3

BUCKET_NAME = 'your bucket name'

def self.get_files_list
connect

files = Array.new
bucket = Bucket.find(BUCKET_NAME)
bucket.objects.each do |obj|
files.push(obj.key) if obj.key.index('.')
# zipの場合は、if File.extname(obj.key) == '.zip'
end

return files
end

def self.get_file(file_path)
connect
downloaded = 'download/' + File.basename(file_path)
File.open(downloaded, 'wb') do |file|
S3Object.stream(file_path, BUCKET_NAME) do |chunk|
file.write chunk
end
end
return downloaded
end

private
def self.connect
Base.establish_connection!(
:access_key_id => 'your access_key_id',
:secret_access_key => 'your secret_access_key'
)
DEFAULT_HOST.replace('s3-ap-northeast-1.amazonaws.com')
end
end

get_files_list()では、指定したバケット内のファイルパスを配列として返しています。

get_file()では、引数で取得したファイルをS3よりダウンロードし
'download'フォルダに取得しています。

connect()は、メソッド名どおり、S3に接続するメソッドです。
注意点としては、バケットが東京リージョンにある場合
DEFAULT_HOST.replace・・・で明示的に東京リージョンを指定しないと
以下のエラーとあります。

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

以上です。

参考サイト
http://www.biboureq.com/mains/53
http://d.hatena.ne.jp/dkfj/20121009/1349738999
http://aws.amazon.com/articles/8621639827664165
http://qiita.com/labocho/items/45d79fc16c78bc95e1d8

「パーフェクトRuby」を読み返してみて

去年末から今年に掛けての正月休み中、「パーフェクトRuby」を読みました。
その後、Rubyでサンプルプログラムを作成していたところ
Rubyについて確認したいことが出てきたため、「パーフェクトRuby」を読み返しました。

以下、自分が確認したことについて、備忘録として残しておきます。

■モジュール

・モジュールからインスタンスを作ることはできない
 →モジュールを名前空間として使う場合、特異メソッド(self.で始まる)として定義する。

・モジュール内で定義したメソッドを、クラスのインスタンスメソッドとして取り込める
 →インスタンスメソッドとして取り込む場合、通常のメソッド(self.をつけない)として定義する。

・includeとextend
モジュール内で定義したメソッドを
includeはインスタンスメソッドとして取り込み
extendは特異メソッド(self.で始まる)として取り込む。

※参考サイト
http://pgnote.net/?p=107

■Procオブジェクト

・Proc.newとlambdaで作ったメソッドの違い
return時の挙動や、引数の数が一致しないとエラーとなる点など
lambdaの方が、通常のメソッドに近い動きをする。

・lambdaのシンタックスシュガーを用いた記述例

add = -> (x, y) {
x + y
}

del = -> (x, y) {
x - y
}

dev = -> {
6 / 2
}

x = 5
y = 2

p add.call(x, y)
p del.(x, y) #callなしでも可
p dev.call

小ネタですが、以上です。