食べられません

プログラミングとか漫画とか生活とか

Migrationの気付き

仕事ではMySQLしか使ってないので気づいてなかったけど、
Postgresqlではカラムを位置指定して追加することは出来ないようだ。。。

あと、調べてもあんまり出てこなかったので書いておくけど
Rails4.2時点ではオプションもちゃんと書いてやることでremove_columnもchange内に書ける
(いつから出来たのかは調べてない)

def change
  remove_column :users, :nickname, :string
end

これでrollback時にはちゃんとadd_columnされる。

【個人的まとめ】タスク管理ツールNight

参加してきました

皆さん色々なタスク管理ツール(自作マクロ含む)を変遷しておられました。

続きを読む

Rails4.2.0のadd_foreign_keyについて

Rails 4.2使い始めてschema.rbをgit管理している場合、
add_foreign_keyadd_indexな感覚で使うと差分が発生してしまいそうなのでメモしておく。

add_index

add_index :suppliers, :nameとしてやるとIndex名はデフォルトでindex_suppliers_on_nameとなる。
それは https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L588 にある通り。
対象のカラムが特別多くなければ:nameオプションを使うこともないだろう。

add_foreign_key

add_foreign_key :articles, :authorsとしてやると外部キー名は意外な事に
fk_rails_fa2b6bcbc5(ランダム)となってしまう。
実装は https://github.com/rails/rails/blob/4-2-stable/activerecord/lib/active_record/connection_adapters/abstract/schema_statements.rb#L983 の通り。

というわけで、外部キーを作成するときは意識して:nameオプションを使っておかないと
毎回別名で作成されてschema.rbが犯されちゃうよー、というお話。

devise group

Railsでよく使う認証のgem。知らない人いないのでは。

今回ちょっと面倒な感じのログイン仕様でdeviseの中ずっと調べてたんだけど 3.3.0で追加されたらしい機能使ったのでメモ。

複数のモデル(Roleではなく)でログイン出来る作りのとき [:user, :staff, :admin]の3モデルあったとしたら

before_action :authenticate_user!
before_action :authenticate_staff!
before_action :authenticate_admin!

みたいな感じでそれぞれ書いてたと思うんだけど、それを

devise_group :blogger, contains: [:user, :staff, :admin]
before_action :authenticate_blogger!

って書けちゃう。楽ちん。 ログインしてるデータを取得するときも、いつものdeviseの感じで current_bloggerってやれば取得出来る。

こんな仕様にならない様に作ったほうが良いと思うんだけどねぇ…

odoo使ってみて

構築完了して使ってみましたが、正直辛い。

全体的に動作が重い、UIが非常に分かりづらい。

機能自体はとても多機能で使いこなせば便利なのかもしれないが、
少なくとも現時点でそこまで求めてない。

なにより使いづらさと重さから使い続けられる気がしない。

というわけで

を試してみてます。
所感はそのうち。

GithubからOdooをUbuntu14.04に導入してみる

Odoo(旧称OpenERP)はベルギーのOpenERP S.A.社により開発とりまとめが行われている、世界で大人気のオープンソースの業務アプリケーションスイートです。

Open Source ERP and CRM | Odoo

何か知らんがプロジェクト管理が急にやって来たので、前から使ってみようと思ってたコレを導入してみる。

環境はUbuntu Server 14.04LTSでOdooはGithubから

Ubuntuを最新の状態に

sudo apt-get update
sudo apt-get upgrade -y

PostgreSQLのインストール

sudo apt-get install postgresql -y
sudo su - postgres -c "createuser -s odoo" 2> /dev/null || true

必要なパッケージのインストール

# tool packages
sudo apt-get install wget subversion git bzr bzrtools python-pip -y

# python packages
sudo apt-get install python-dateutil python-feedparser python-ldap python-libxslt1 python-lxml python-mako python-openid python-psycopg2 python-pybabel python-pychart python-pydot python-pyparsing python-reportlab python-simplejson python-tz python-vatnumber python-vobject python-webdav python-werkzeug python-xlwt python-yaml python-zsi python-docutils python-psutil python-mock python-unittest2 python-jinja2 python-pypdf python-decorator python-requests python-passlib python-pil -y

# python libraries
sudo pip install gdata

odooユーザーの作成とログフォルダの作成

sudo adduser --system --quiet --shell=/bin/bash --home=/var/odoo --group odoo
sudo mkdir /var/log/odoo
sudo chown odoo:odoo /var/log/odoo

Odooのインストール

sudo git clone --branch 8.0 https://www.github.com/odoo/odoo /var/odoo/odoo-server/
# make custom module directory
sudo su odoo -c "mkdir -p /var/odoo/custom/addons"
# setting permissions
sudo chown -R odoo:odoo /var/odoo/*
# create config file
sudo cp /var/odoo/odoo-server/debian/openerp-server.conf /etc/odoo-server.conf
sudo chown odoo:odoo /etc/odoo-server.conf
sudo chmod 640 /etc/odoo-server.conf
# edit config file
sudo sed -i s/"db_user = .*"/"db_user = odoo"/g /etc/odoo-server.conf
sudo sed -i s/"; admin_passwd.*"/"admin_passwd = xxxxxxxxxxxxxxx"/g /etc/odoo-server.conf
sudo sed -i "s|addons_path = .*|addons_path = /var/odoo/odoo-server/addons,/var/odoo/custom/addons|g" /etc/odoo-server.conf
sudo su root -c "echo 'logfile = /var/log/odoo/odoo-server.log' >> /etc/odoo-server.conf"
# create startup file
sudo vim /var/odoo/odoo-server/start.sh

#!/bin/sh
sudo -u odoo /var/odoo/odoo-server/openerp-server --config=/etc/odoo-server.conf

sudo chmod 755 /var/odoo/odoo-server/start.sh

起動スクリプト作成

sudo wget https://gist.githubusercontent.com/NaturalHokke/1575bb515c6583b39e3f/raw/c2d28feec5906176fb7e52070e640523cb3199de/odoo-server -O /etc/init.d/odoo-server
sudo chmod 755 /etc/init.d/odoo-server
sudo chown root: /etc/init.d/odoo-server

スクリプトでの起動確認

sudo /etc/init.d/odoo-server start sudo tail -f /var/log/odoo/odoo-server.log でPort: 8069で起動している事を確認。
ブラウザでアクセスしてちゃんと画面出ればOK

sudo /etc/init.d/odoo-server stop

自動起動設定

sudo update-rc.d odoo-server defaults

ここまででOdooの設定は完了したので、あとはPort80で使えるようにNginx入れて終了です。

Nginxインストール

sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx
sudo /etc/init.d/nginx start

これでPort: 80でアクセスしてNginxのGreetingsページが出ればOK。

Nginx設定

upstream odoo {
  server 127.0.0.1:8069;
}

server {
  listen    80  default_server;
  listen    [::]:80 default_server;
  server_name   odoo.dev.green-bell.jp;

  access_log    /var/log/nginx/odoo.access.log;
  error_log /var/log/nginx/odoo.error.log;

  proxy_buffers 16 64k;
  proxy_buffer_size 128k;
  keepalive_timeout   60;

  location / {
    proxy_pass  http://odoo;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
    proxy_redirect off;

    proxy_set_header    Host            $host;
    proxy_set_header    X-Real-IP       $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

リンクしてreloadしてOK(疲れた

Rails事始め

新しくプロジェクト作る時に毎回見直しをする。

前提

  • 開発環境はMac
  • Rubyのインストールにはrbenvを使用する
  • gemは全てプロジェクト以下に入れたい(システムgemには入れたくない)
  • DBはMySQLを使う
  • Turbolinksは使わない
  • テストはRspec
  • 環境依存な値は環境変数を使っていく(direnv使用)
  • その時その時で有用なgemを使いたいので、Templateは使用しない

プロジェクト作成

$ mkdir project_name
$ cd project_name
$ rbenv local 2.2.0
# rails 4.2のインストール準備
$ bundle init
$ sed -i '' -e '1d' -e 's/# //g' Gemfile
$ bundle install --path vendor/bundle --without staging production --jobs 4
# -T = test-unit skip
# -B = bundle install skip
# -f = force overwrite files
$ bundle exec rails new . -TBf -d mysql --skip-turbolinks
$ bundle install
$ curl -o .gitignore https://raw.githubusercontent.com/github/gitignore/master/Rails.gitignore
$ git init
$ git remote add origin your:repository
$ git add -A
$ git commit -m 'rails setup'

ここまでで一旦Commitしておく。Railsの(ほぼ)デフォルトの状態。

初期設定

Gemfile設定

source 'https://rubygems.org'

# rubyのバージョン指定とrailsだけ最初に指定
# 他のgemはASCII順に並べておく
ruby '2.2.0'
gem 'rails', '4.2.0'

gem 'airbrake'                          # HerokuにErrbit立ててるので入れる
gem 'bootstrap-sass'               # 大体Bootstrapで作る
gem 'bootstrap-sass-extras'
gem 'coffee-rails', '~> 4.1.0'
gem 'jbuilder', '~> 2.0'
gem 'jquery-rails'
gem 'kaminari'                          # ページ送りは大体入れる
gem 'mysql2'
gem 'newrelic_rpm'                  # 便利
gem 'sass-rails', '~> 5.0'
gem 'slim-rails'                         # テンプレートエンジンはSlimがお好き
gem 'uglifier', '>= 1.3.0'

group :development, :test do
  gem 'pry-byebug'
  gem 'pry-rails'
  gem 'pry-rescue'
  gem 'rspec-rails'
  gem 'spring'
  gem 'web-console', '~> 2.0'
end

group :test do
  gem 'database_rewinder'
  gem 'faker'
  gem 'factory_girl_rails'
end

$ bundle

spring(環境変数)設定

$ bundle exec spring binstub --all
$ echo 'export PATH=$PWD/bin:$PATH' > .envrc
$ echo 'export DATABASE_PASSWORD=xxxxx' >> .envrc
$ direnv allow

database.yml設定

default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: project_name_development

test:
  <<: *default
  database: project_name_test

production:
  url: <%= ENV['DATABASE_URL'] %>

application.rb設定

require File.expand_path('../boot', __FILE__)

require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "sprockets/railtie"

Bundler.require(*Rails.groups)

module ProjectName
  class Application < Rails::Application
    config.time_zone = 'Tokyo'

    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :ja

    config.generators do |g|
      g.assets false
      g.helper false
      g.template_engine :slim
      g.fixture_replacement: :factory_girl, dir: 'spec/factories'
      g.test_framework :rspec,
        view_specs: false,
        routing_specs: false,
        helper_specs: false,
        integration_tool: false
    end

    config.active_record.raise_in_transactional_callbacks = true
  end
end

Airbrake(Errbit)設定

$ touch config/initializers/airbrake.rb

Airbrake.configure do |config|
  config.api_key = "#{ENV["ERRBIT_API_KEY"]}"
  config.host = 'hostname'
  config.port = 80
  config.secure = config.port == 443
end

rspec設定

$ rails generate rspec:install
$ bundle binstubs rspec-core
$ cat spec/rails_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_spec_type_from_file_location!

  config.include FactoryGirl::Syntax::Methods
  config.before :all do
    FactoryGirl.reload
  end

  config.before :suite do
    DatabaseRewinder.clean_all
  end

  config.after :each do
    DatabaseRewinder.clean
  end
end

大体こんな感じだろうか