kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

日報(2014/10/31)

12:00 - 14:00

14:00 - 15:00

  • KVMが導入できるか調べる
    • x86でしか対応できないので、ひとまず見送る

16:00 - 18:00

  • サービスに画像アップロード用のgemと機能を追加
    • ついでに記事を書く

18:00 - 23:30

  • ローカルでNginxのインストールと設定
  • unicorn.rbの記述を修正
  • vagrantによる開発環境の構築しようかと検討

感想&課題

  • アウトプットは、常に意識しておきたい(コードの書く、記事を書く,つぶやくなど)
  • 書籍がたりない。DNSの設定とNginxの設定が、ネットで調べるだけだと体系的に頭に入れられないので辛い。
  • 借りた本も読み進めたいなぁ。

Nginxの設定

こんにちは。kikeda1104です。 前回の記事で、Nginxのディレクティブの一覧を作りました。それを参考にしながら公開する目的で、 Nginxの設定を進めていきたいと思います。

システムの前提

Nginx

server {
    listen 80 default deferred;
    client_max_body_size 4G;
    server_name example.com;
    keepalive_timeout 5;

    upstream app_server {
      server unix:/tmp/unicorn.sock fail_timeout=0;
    }

    location / {
      root /myapp/public;
    }

   error_page  404              /404.html;
   location = /404.html {
       root   /usr/share/nginx/html;
   }
}

参考:
unicorn/nginx.conf at master · defunkt/unicorn · GitHub

https://github.com/defunkt/unicorn/blob/master/examples/nginx.conf

nginx

以上。

rmagickのインストール(Cent OS 6.5)

こんにちは。kikeda1104です。 rmagickのインストールで、必要なライブラリが足りずにコンパイルエラーになっていたので、 調べて対応しました。

環境

  • Cent OS(6.5)

必要なlibのインストール

$ yum -y install libjpeg-devel libpng-devel
$ yum -y install ImageMagick ImageMagick-devel

rmagickのインストール

$ gem install rmagick

以上です。

Capybara-webkitの導入(Cent OS 6.5)

こんにちは。kikeda1104です。 スクレイピングで、JSがrenderするDOMを触る必要があったので、CapybaraとCapybara-webkitをインストールしました。

環境

  • Cent OS 6.5

まず、インストールする上でqtが必要になるので、これをインストールします。

Qtのダウンロード&インストール

最新版は、現在(2014/10/30)5.3系ですが、Capybara-webkitWikiを確認すると4.8を使っています。

$ cd ~/Downloads
$ wget http://download.qt-project.org/official_releases/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.tar.gz 
$ tar xzvf qt-everywhere-opensource-src-4.8.6.tar.gz
$ cd qt-everywhere-opensource-src-4.8.6
$ ./configure
$ gmake
$ sudo gmake install
$ sudo ln -s /usr/local/Trolltech/Qt-4.8.6/bin/qmake /usr/bin/qmake

capybara-webkitをインストール

$ gem install capybara-webkit
Fetching: capybara-webkit-1.3.1.gem (100%)
Building native extensions.  This could take a while...
Successfully installed capybara-webkit-1.3.1
Parsing documentation for capybara-webkit-1.3.1
Installing ri documentation for capybara-webkit-1.3.1
Done installing documentation for capybara-webkit after 0 seconds
1 gem installed

参考

https://github.com/thoughtbot/capybara-webkit/wiki/Installing-Qt-and-compiling-capybara-webkit

ActiveRecordを利用する(Ruby)

kikeda1104です。 スクレピングした内容をDBに保存する際になどに、ActiveRecordを利用することで簡易に操作することができるので、利用してみました。

ActiveRecord

Railsの標準の添付されており、MVCのM(odel)の概念を実現しているライブラリです。

ActiveRecordのインストール

$ gem install activerecord

コード

require 'active_record'
# 接続先の環境設定の情報を定義する。
ActiveRecord::Base.establish_connection(
  adapter: "mysql2",
  host:       "localhost",
  username: "root",
  password: "hoge",
  database: "hoge"
)

# テーブルを名を指定する
class Company < ActiveRecord::Base
  self.table_name = "companies"
end

Company.all

設定情報のYAMLへの切り出すこともできますが、ひとまずこれで動きますね。 以上です。

参考

ActiveRecordを単体で使うには | tsuchikazu blog

capybara-webkitのインストール

こんにちは。kikeda1104です。

nokogiriと利用して、スクレイピングをしようと思いましたが、jsによるrenderが発生しているサイトだったので、gem capybaraとcapybara-webkitのインストールをします。インストール最中につまづきがあったので、備忘録として書いています。

前提

capybaraのインストール

$ gem install capybara

capybara-webkitのインストール

$ gem install  capybara-webkit

f:id:kikeda1104:20141026161353p:plain

上記のエラーメッセージが出力されますので、Qtというアプリケーション・ユーザインタフェース (UI) フレームワークをインストールすることで、改善されます。

Qtのインストール

$ brew insatll qt

capybara-webkitの再インストール

$ gem install capybara-webkit

参考

MacにCapybara-webkitをインストール - 僕の車輪の再発明

Qt - Wikipedia

以上です。

nokogiriのインストール

こんにちは。睡眠のリズムを崩しているkikeda1104です。 とはいえ、眠い眠いと思いながら作業することがないので快適に作業を進められてます。

環境

nokogiriのインストール

事前準備

$ brew update
$ brew upgrade
$ brew install libxml2 libxslt libiconv
$ brew link --force libxml2
$ brew link --force libxslt 

brewのupgrade中に「Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.」というエラーメッセージが出力されたら、xcodeを立ち上げて、ライセンスを承諾しておく。

nokogiriのインストール

$ gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"

以上です。

参考

Agreeing to the Xcode/iOS license... のエラーがでた時の対処法 - Qiita

OSX - Mac OS X Mavericksで”gem i nokogiri”失敗の解決方法 - Qiita

gem omniauth(-twitter)

最近kindleかpadが欲しいkikeda1104です。書籍が重いです。 今回は、deviseで認証機能を開発していましたが、やや多機能すぎたので、これをomniauthのgemに切り替えました。twitterのアカウントを利用したかったのでomniauth-twitterもGemfileに入れています。

gem omniauthの導入

Gemfileにgemを追加

$ cd rails_app
$ vim Gemfile
# Gemfile
...
gem 'omniauth'
gem 'omniauth-twitter'

bundle

$ bundle install

Twitter Application Managementにappを登録

Twitter Developersにアカウントを作成していただいてから、 Twitter Application Managementにアクセスします。

f:id:kikeda1104:20141023231230p:plain

「Create App new」ボタンを押します。

Applicationの情報を入力

f:id:kikeda1104:20141023231403p:plain

Name、description、WebSite、Callback URLを入力します。

こんな感じですね。

f:id:kikeda1104:20141023231535p:plain

Twitter Application ManagementでApplicationの作成が終わると、「Key and Access Token」というタブがあるので、クリックして「Consumer Key (API Key)」と「Consumer Secret (API Secret)」をコピーしておく。 (開いておいてください)

config/initializeに追加

$ vim config/initialize/omniauth.rb
Rails.application.config.middleware.use OmniAuth::Builder do                                                                                 
  provider :twitter, "api_key", "access_token" # ここに先ほどコピーしたもしくは開いておいたKeyとAccess Tokenを入力します。                                                                                                
end 

コーディング

helperを追加

application_controller.rb

  helper_method :logged_in?

  private 

  def logged_in?                                                                                                      
    !!session[:user_id]                                                                                                                      
  end

viewにコードを追加

application.html.hamlかheaderとなるhtmlに記述します。

...
%li                                                                                                                                          
  - if logged_in?                                                                                                                            
    = link_to 'ログアウト', logout_path                                                                                                      
  - else                                                                                                                                     
    = link_to 'twitterログイン', '/auth/twitter'

controller追加

sessions_controller.rbを作成します。

$ rails g controller sessions
$ vi app/controller/sessions_controller.rb
class SessionsController < ApplicationController                                                                                             
  def create                                                                                                                                 
    user = User.create_from_auth_hash(request.env['omniauth.auth'])                                                                          
    session[:user_id] = user.id                                                                                                              
    redirect_to root_path, notice: 'ログインしました'                                                                                        
  end                                                                                                                                        
                                                                                                                                             
  def destroy                                                                                                                                
    reset_session                                                                                                                            
    redirect_to root_path, notice: 'ログアウトしました'                                                                                      
  end                                                                                                                                        
end

route追加

ルーティングを追加します。

get '/auth/:provider/callback' => 'sessions#create'                                                                                          
get '/logout' => 'sessions#destroy', as: :logout

参考書籍:

以上です。

route.rb(namespace, member) (Rails 4.x)

Railsは、DSLが豊富ですので、覚えるのは大変ですね。 routesで使われるDSLの一部を紹介したいと思います。

routes.rb

URLから実行するControllerのactionとのひも付けを表すファイルです。

namespace

informationコントローラのroutingを書く際に、information/welcomeなど名前空間を利用したい場合に利用します。 コントローラ名を利用していますが、もちろんそんなことをせずに、URLを設計できます。

namespace :information do
  get 'welcome'
end

# => information_welcome GET    /information/welcome(.:format)           information#welcome

member

memberは、information/:idのように使われます。サンプルコードを書くと。

resources :information do
  member do
    get 'welcome'
  end
end

# => welcome_information GET    /information/:id/welcome(.:format)       information#welcome

上記のように書きますね。

Rails tutorial、Rails Guideは目を通しておいて、tutorialのアプリを作ってみることをお勧めします。

参考
Rails Routing from the Outside In — Ruby on Rails Guides

以上です。

module, class(Ruby)

こんにちは。kikeda1104です。 ファイル別にコードを切り出して、必要なモジュールやクラスでひとまとめに呼び出すのは、 割とgithubなどで公開されているコードでは一般的だと思います。

自分の頭の整理もかねて、moduleとclassの知識の整理とやりたいこと書いていきたいと思います。

Rubyにおけるmoduleとclass

Moduleとは

モジュール (Module)とは、工学などにおける設計上の概念で、システムを構成する要素となるもの。いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと。

Classとは

クラス(class)は、クラスベースのオブジェクト指向においてオブジェクトの設計図にあたるもの。抽象データ型の一つ。

ModuleとClassの違い

モジュールとクラス モジュールとクラスの違いは以下の通りである。 クラスにはインスタンスとしてオブジェクトを生成する機能がある。 クラスは他のクラスの動作やデータを継承することができる。 ポリモーフィズムにより、クラスのインスタンス間の関係は実行時に変化するが、モジュール間の関係は静的である。 モジュールとクラスの類似点は以下の通りである。 どちらも実装の詳細を外部から隠蔽する。 どちらも階層(モジュール階層とクラス階層)を形成することができる。

Rubyだと、モジュール階層が同じであれば、ファイルとして切り出して、呼び出した際にも 同一のmoduleとして見てくれます。

ソースファイルを分けたい

やりたいことは、ソースファイルを分けたいんですよね。 ファイル内で、ソース分けることでも、見やすくなりますが、ファイルを分けることで、ファイル名でも判別できますから、尚良い(・∀・)

# file01.rb
module Hoge
  def fuga
    puts "fuga"
  end
end

# file02.rb
module Hoge
  class Connection
  end
end

# file03.rb
require 'hoge/file01.rb'
require 'hoge/file02.rb'

module Hoge
end

上記みたいに記述することで、module名をname spaceとして利用することができますね。

ファイルを切り分けたいスクリプト(Gem)

Railsアプリのlibにあった機能を、gem化することにしたのが理由で開発しています。

ディレクトリの構成

f:id:kikeda1104:20141021182725p:plain

結果

実は、gemのファイルの切り出しがなかなか考えられずにいましたが、できると早いもので。 Connection.new.getみたいに使いたかったので、これをリクエストは,request.rbファイルにまとめていましたが、 class Connectionにまとめる形にして呼び出していますね。

参考

kikeda1104/recruit_api · GitHub

書きながら調べていく事で問題が解決できたので、うまくまとめられました。 gemはまだ、開発中なので、Rubygemsに公開もしていないですが、後日、多分すると思います。

※ファイルの切り出しとか、コードの書き方で、意見があれば教えていただけると助かります。