VagrantでRails環境を構築

VagrantRails環境を構築した時のメモ。

$ vagrant ssh
$ sudo yum update
$ sudo yum -y install git
$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
$ rbenv install --list
$ sudo yum install gcc make openssl-devel libffi-devel readline-devel
$ rbenv install 2.3.0
$ rbenv global 2.3.0
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]
$ sudo yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ sudo yum install mysql mysql-devel mysql-server mysql-utilities
$ sudo chkconfig mysqld on
$ sudo service mysqld start
$ sudo yum -y install ImageMagick ImageMagick-devel
$ gem install bundler -N
$ sudo yum install libxml2-devel libxslt-devel
$ gem install nokogiri -v '{version}' -- --use-system-libraries=true --with-xml2-include=/usr/include/libxml2/
$ curl --silent --location https://rpm.nodesource.com/setup | bash -
$ yum -y install nodejs
$ sudo yum -y install epel-release
$ sudo yum -y install redis

参考

Oculus Goでスクリーンショット・録画を撮る方法

撮影方法

ホーム画面 > シェア > 録画を選択

確認方法

撮影した写真・映像は「ギャラリー」で確認可能

取り出し方法

調べるといくつか方法があるようですがAndroid File Transferの利用が簡単でした。 https://www.android.com/filetransfer/

参考

Oculus GoとUnityの開発環境構築

UnityでビルドしたアプリをOculus Goで実行するまでのメモ。

やったこと

  1. Oculus Goを購入 https://www.oculus.com/go/
  2. Unityをインストール https://store.unity.com/ja
  3. Oculus Developer Dashboardで団体を作成 https://dashboard.oculus.com/
  4. Oculus Go端末を開発者モードに変更
  5. Java Development Kitをインストール https://docs.unity3d.com/Manual/android-sdksetup.html
  6. UnityのAndroid開発環境を整備

    • File > Build Settings > Platform. AndroidPlayerをインストールしてUnityを再起動
    • File > Build Settings > Platform. Player Settingsを選択して表示
    • XR SettingsのVirtual Reality Supportedにチェック
    • Virtual Reality SDKsにOculusを指定
    • Other > Settings. IdentificationのMinimum API Levelを「Android 7.1」に変更
    • Other > Settings. Package Nameを任意の名前に変更
    • File > Build & Run. ビルドを実行
  7. Oculus Goで実機確認

参考

Active Storageを使って画像をアップロード

ローカル環境でActive Storageを使用して画像をアップロードする機能を実装した時のメモ。

事前準備

imagemagickが入っていなかったのでインストール

$ brew install imagemagick

Active Storageの環境構築

$ bin/rails active_storage:install
$ bin/rails db:migrate RAILS_ENV=development

画像をアップロード

class User < ApplicationRecord
  has_one_attached :avatar
end
class UsersController < ApplicationController
  def update
    @user.update(user_params)
  end
  
  private
    def user_params
      params.fetch(:user, {}).permit(:name, :avatar)
    end
end
= form_for @user do |f|
  = f.label :avatar
  = f.file_field :avatar
  = f.submit

画像を表示

gem 'mini_magick'
<%= image_tag user.avatar.variant(resize: "100x100") %>

参考

bundle updateでPermission deniedが出た時の対応

bundle updateでPermission deniedが出た時の対応メモ

エラー内容

$ bundle update
Fetching nokogiri 1.8.3 (was 1.8.2)
Installing nokogiri 1.8.3 (was 1.8.2) with native extensions
Errno::EACCES: Permission denied @ dir_s_mkdir - /Users/{username}/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-16/2.4.0-static/nokogiri-1.8.3
An error occurred while installing nokogiri (1.8.3), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.8.3'` succeeds before bundling.

原因

過去にsudoをつけてgemをinstallしていたため書き込み権限がなかった

本当ならば、次のディレクトリ「/Users/(ユーザ名)/.rbenv/versions」配下にあるものは全てユーザーアカウントの権限になるべきなのですが、そのディレクトリの中のある幾つかのファイルに書き込む権限がないというのが問題でした。

参考:Rails cが実行不可能、Permission denied @ rb_sysopen – /Users/…の対応策

対応

ディレクトリの所有者をユーザー権限に変更

$ sudo chown -R {username}:staff /Users/{username}/.rbenv

参考

フリーランスエンジニア4年目の2017年振り返り

遅ればせながらフリーランスエンジニアとして4年目の2017年の振り返りです。

個人開発

個人開発で多産多死を行っている状態でした。利益を出したいためにアフィリエイトを中心に置いたサービスの開発を行っていたのですが、SEOアフィリエイト周りのことに注力する時間が多くなり開発へのモチベーションが下がってしまう難しい状況でした。一方で、アフィリエイターの方々は職人的な気質の人が多く文化としても近いため、姿勢や取り組み方など勉強になりました。どこに軸を置くにせよ、2017年は結果を残せなかったことが大きな反省点でした。年末にpeingを開発したせせりさんの存在を知り、そのスタンスが個人開発者として目標とする姿に近かったため、2018年に何かしら活かしたいと思いました。

情報収集

2017年はヨーロッパを一周しました。アジアは日本も含めてビルがひしめき合い中心地は「都市」というイメージですが、ヨーロッパはロンドン以外ほとんどそういった印象を持ちませんでした。街中はゆったりしたスケール感覚で、都心エリアでも建物は低層が中心でした。ヨーロッパの人がアジアに対してサイバーパンク的なイメージを持つ理由も何となく分かりました。しかし、UberEats的な配達員の人を街中で見かける回数はヨーロッパのほうが多く、伝統的な街の雰囲気の中で先端サービスのチャレンジが受け入れられているような印象でした。ベルリンのsoundcloud社など有名サービスのオフィスも(外側から)見てまわりました。

業務委託

長くお付き合いをさせていただいた企業様との契約が終わり、新しい企業様との契約を結びました。今回はリモートワークの割合を増やしました。朝の満員電車から解放され、通勤時間も節約できるため、個人的にはリモートワークのほうが合っています。実際にやってみた感想としては、リモートワークは個人の努力だけでなくリモートワークを受け入れる会社側の土壌も必要だと思いました。今回お世話になっている企業様ではリモートワークを推奨していて、特に開発チームのトップの方が率先して文化や仕組みをつくっているため、リモートで非常に働きやすい環境が用意されていました。リモートで働く側としては、この文化を壊さないため・発展させるために、リモートで働く上での信頼関係をつくることを意識的に取り組みました(レスの速度を上げる・開発の過程を残すなど)。このあたりは勉強中のため2018年の課題の1つです。

仕事場

北向きの部屋で作業していると煮詰まった時に滅入ってしまうため、南向きの物件に移りました。古いですが、とていもいい物件で気に入っています。ただ古い物件なりの課題(寒い・コンセントの数少ない等)があるので徐々に解決できればと。

2018年に向けて

新しいことへのチャレンジや新しい分野の勉強をはじめたい一方で、現在仕事で使っているRuby/RoRの基礎をしっかり固めたい気持ちもあります。今年は6:4ぐらいの割合で基礎固めを多めにしたいなと思っています。この記事を書いている時点で年が明けて1ヶ月経ちそうですが、現在は「プロを目指す人のためのRuby入門」をすすめています。読み終えたらRailsチュートリアルにうつる予定です。

Rails+Capistrano環境でデプロイ

Rails+Capistranoでデプロイした時のメモ

Gitで管理

tsyknsr.hatenablog.com

Capistrano

GitHub - capistrano/capistrano: Remote multi-server automation tool

動作確認用に最小限の設定です。設定等はお好みで適宜変更してください。(記事に関係ない部分は一部省略している箇所もあります)

  • Gemfile
group :development do
  gem 'capistrano', '~> 3.10'
  gem 'capistrano-rails'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano3-unicorn'
end
$ bundle install
$ bundle exec cap install
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
  • config/deploy/production.rb
set :branch, 'master'
server '192.0.2.0', user: 'username', roles: %w{web app db}

role :app, %w{username@192.0.2.0}
role :web, %w{username@192.0.2.0}
role :db,  %w{username@192.0.2.0}

# ポートフォワーディングを利用する場合
set :ssh_options, {
  keys: %w(~/.ssh/id_rsa),
  forward_agent: true,
  auth_methods: %w(publickey)
}
  • Capfile
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano/rails'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano3/unicorn'
require 'capistrano/sitemap_generator'
require 'whenever/capistrano'

require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
  • config/deploy.rb
# config valid only for current version of Capistrano
lock "3.8.0"

set :application, "my_app_name"
set :repo_url, "git@example.com:me/my_repo.git"
set :deploy_to, "/var/www/nginx/example.com"

set :pty, true

set :linked_files, "config/database.yml", "config/secrets.yml"
set :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/system"

# rbenv
set :rbenv_type, :user
set :rbenv_ruby, '2.5.0'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
set :rbenv_map_bins, %w{rake gem bundle ruby rails}
set :rbenv_roles, :all

# unicorn
set :unicorn_pid, "#{shared_path}/tmp/pids/unicorn.pid"
set :unicorn_config_path, "config/unicorn.rb"

# whenever
set :whenever_identifier, ->{ "#{fetch(:application)}_#{fetch(:stage)}" }

before 'deploy:publishing', 'db:seed_fu'
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end
after 'deploy:restart', 'deploy:sitemap:create'
app_path = "/var/www/nginx/example.com"
working_directory "#{app_path}/current"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"

listen "#{app_path}/shared/tmp/sockets/unicorn.sock"

stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"

worker_processes 3

timeout 15

preload_app true

before_exec do |server|
  Dotenv.overload
  ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end

before_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      Process.kill("QUIT", File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end
end

after_fork do |server, worker|
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
  end
end

動作確認

$ bundle exec cap production deploy:check

参考リンク