インターネットのスケッチ

Done is better than perfect.

VimでRustを書くための設定

VimでRustを書くための設定をする。
とりあえずプラグインいれるだけ。

概要

以下のプラグインを入れる。

github.com

github.com

プラグインマネージャーはVundleを使う。

github.com

手順

1.Vundleをインストールする

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

.vimrc のトップに以下を追記

" Vundleの設定
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" 導入したいプラグインを以下に列挙
" Plugin '[Github Author]/[Github repo]' の形式で記入
" Git差分を左に表示
Plugin 'airblade/vim-gitgutter'

call vundle#end()
filetype plugin indent on

2.vim-racerにはRacerが必要なので、Racerを先にインストールする

github.com

$ rustup toolchain add nightly
$ cargo +nightly install racer

racer 2.1からnightlyのrustが必要とのこと。 nightlyは最新の開発版。 ちなみに今日時点のnightly最新バージョンは1.31.0で、rust安定バージョンは1.29.1だった。

3.rust.vimvim-racerのインストールコードを .vimrc に追記する

Plugin 'rust-lang/rust.vim'
Plugin 'racer-rust/vim-racer'

4.vimプラグインのインストール

  • vim を開いた状態で
:PluginInstall

または

  • ターミナル上で
$ vim +PluginInstall +qall

5.vim-racerの設定を .vimrc に追記

" vim-racerの設定
set hidden
let g:racer_cmd = '~/.cargo/bin/racer'
let g:racer_experimental_completer = 1

以上

参考

Rust入門 for Vimmer

Vim におけるプラグイン管理についてまとめてみた

rustup で Rust コンパイラーを簡単インストール

プラグインのREADMEドキュメント

APIを作るための勉強中

RailsでWebアプリ作るのが先月公開までいけたので、次はAPIの勉強をしている。

とりあえず今は『Real World HTTP』を読んでる。

実装例がGoで書かれてるけど、サーバーの立て方とログの見方をここにメモしておく。

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
)

func handler(w http.ResponseWriter, r *http.Request) {
    dump, err := httputil.DumpRequest(r, true)
    if err != nil {
        http.Error(w, fmt.Sprint(err), http.StatusInternalServerError)
        return
    }
    fmt.Println(string(dump))
    fmt.Fprintf(w, "<html><body>hello</body></html>\n")
}

func main() {
    var httpServer http.Server
    http.HandleFunc("/", handler)
    log.Println("start http listening :18888")
    httpServer.Addr = ":18888"
    log.Println(httpServer.ListenAndServe())
}

上のコードをserver.goというファイルに保存して、ターミナルで go run server.go を実行するとサーバーが立ち上がる。 あとはターミナルの別タブで各goファイルを go run して実行していけば、server.goを立ち上げた方の画面にログが出力されていく。

$ go run server.go
2018/08/15 16:06:15 start http listening :18888
POST / HTTP/1.1
Host: localhost:18888
Accept-Encoding: gzip
Content-Length: 12
Content-Type: text/palin
User-Agent: Go-http-client/1.1

...

画像アップローダー設置で参考にしたリンクまとめ

環境

  • Rails 5.2
  • CarrierWave 1.2.2
  • MiniMagick 4.8.0

本番環境への設定はまだ。開発環境のみ。

全般

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Rails5とCarrierWaveを使って画像アップロード機能を作る - write ahead log

[Rails5] Carrierwave + S3 + CloudFrontで画像アップロードを実装する方法

CarrierWave

Rails CarrierWaveのファイル名を変更する方法 – KeruuWeb

CarrierWaveのファイル名変換(original_filename)の挙動 - 備忘録。

Carrierwaveで画像をリサイズする - 49hack

MiniMagick

RubyでImageMagick使うにはMiniMagickの方がよい - 動かざることバグの如し
→これ「tiff対応のimagemagickでないとダメらしい」のエラー出るかと思ったけど、普通にimagemagickをDockerfileに追加するだけで大丈夫だった。Dockerだからか?

Docker

Docker for MacでRails5, MySQLとVue.jsの開発環境を作る | mn-memo

GitHub

GitHub - carrierwaveuploader/carrierwave: Classier solution for file uploads for Rails, Sinatra and other Ruby web frameworks

GitHub - minimagick/minimagick: mini replacement for RMagick

その他

Ruby の private と protected 。歴史と使い分け

HerokuにRailsアプリの検証環境を立てる

開発中他の人に動作を確認してもらいたいときや、スマホ実機確認をするとき用に、Herokuに検証環境を作りました。

ちなみにステージング兼本番環境にはAWSを使う予定です。

環境

Herokuのアカウント新規登録

こちらから。 jp.heroku.com

Heroku CLIのインストール&SSHキーの登録

ターミナルなどでherokuコマンドを使えるようにCLIをインストールします。私はhomebrewで入れました。 devcenter.heroku.com

インストールできたらHerokuにログインして、SSHキーを登録します。

SSHキーの作成

$ ssh-keygen -t rsa -b 4096 -C "Herokuで使うメールアドレス"

キーの保存先はユーザーディレクトリの .ssh/id_heroku_rsa など パスフレーズも入力

Herokuにログインしてキー登録

$ heroku login

Enter your Heroku credentials:
Email: メールアドレス
Password: *************
Logged in as メールアドレス

$ heroku keys:add ~/.ssh/id_heroku_rsa.pub

heroku keys:add で引数を指定しなければデフォルトで ~/.ssh/id_rsa.pub か ~/.ssh/id_dsa.pub を探しに行くらしい。

アプリをHerokuにデプロイ

準備

アプリのディレクトリをどこかにまるごとコピーして以下のファイルを削除するか、ディレクト外に移動。

  • Dockerfile
  • docker-compose.yml
  • .git
  • .gitignore
  • .env

私はDockerで開発していてそのままHerokuに上げてもいいんですが、Dockerなしでデプロイする方法も知っておきたいので、今回はDocker関連のファイルは除去して上げました。

そしたらHerokuへのデプロイはgitを経由して行うので、 git init をしてもう一度gitの管理対象にします。

$ cd コピーしたアプリのディレクトリ
$ git init
$ git add .
$ git commit -m "feat: Initial commit"

デプロイ

コピーしたアプリのディレクトリにいる状態で、herokuコマンドでデプロイします。

// Herokuにアプリを作成する
$ heroku create アプリの名前

// デプロイ
$ git push heroku master

MySQLの設定

// MySQLを利用するためClearDBアドオンを入れる
$ heroku addons:create cleardb:ignite

Creating cleardb:ignite on ⬢ アプリ名... free
Created cleardb-cylindrical-85040 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation

// 設定確認
$ heroku config

=== アプリ名 Config Vars
CLEARDB_DATABASE_URL:     mysql://b2a3d6180457c6:be3c12f5@us-cdbr-iron-east-04.cleardb.net/heroku_b44817e2b39c626?reconnect=true
LANG:                     en_US.UTF-8
RACK_ENV:                 production
RAILS_ENV:                production
RAILS_LOG_TO_STDOUT:      enabled
RAILS_SERVE_STATIC_FILES: enabled
SECRET_KEY_BASE: ***

// RailsのGemの mysql2 に合わせてDBURLを追加 or 変更する。
$ heroku config:set DATABASE_URL=mysql2://b2a3d6180457c6:be3c12f5@us-cdbr-iron-east-04.cleardb.net/heroku_b44817e2b39c626?reconnect=true

Setting DATABASE_URL and restarting ⬢ アプリ名... done, v9
DATABASE_URL: mysql2://b2a3d6180457c6:be3c12f5@us-cdbr-iron-east-04.cleardb.net/heroku_b44817e2b39c626?reconnect=true

// 設定確認
$ heroku config

=== アプリ名 Config Vars
CLEARDB_DATABASE_URL:     mysql://b2a3d6180457c6:be3c12f5@us-cdbr-iron-east-04.cleardb.net/heroku_b44817e2b39c626?reconnect=true
DATABASE_URL:             mysql2://b2a3d6180457c6:be3c12f5@us-cdbr-iron-east-04.cleardb.net/heroku_b44817e2b39c626?reconnect=true
〜省略〜

ちなみにDATABASE_URLをセットするところで、「zsh: no matches found: DATABASE_URL=mysql2: 省略」というエラーが私は出ました。zshのエラーのようなので.zshrcに以下を追記したら通りました。

$ setopt nonomatch

// 変更を反映
$ source ~/.zshrc

shirusu-ni-tarazu.hatenablog.jp

環境変数の設定

環境変数はHerokuのサイトからか、コマンドで設定できます。
サイトからは アプリのダッシュボード>Settings>Config Vars
コマンドは以下

// heroku config:add 変数名="値" の形式
$ heroku config:add DB_NAME="DB名"
$ heroku config:add DB_USERNAME="DBユーザー名"
$ heroku config:add DB_PASSWORD="パスワード"

ここには書きませんが、ついでにベーシック認証の変数なども設定しました。

テーブルの作成

あとはマイグレーションをしてテーブルを作成するだけです。

$ heroku run rails db:migrate

作成できたらアクセスできるか確認します。
下のコマンドのWeb URLがアプリのURLです。ちゃんとアクセスできたらOKです。

// アプリの情報を見る
$ heroku apps:info
=== アプリ名
Addons:         cleardb:ignite
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/アプリ名.git
Owner:          メールアドレス
Region:         us
Repo Size:      16 MB
Slug Size:      64 MB
Stack:          heroku-16
Web URL:        https://アプリ名.herokuapp.com/

まとめ

あとは機能の実装ができたら git add してHerokuにプッシュしていけば検証環境でサイトの動作をチェックできます。デプロイツールいれたい。


参考

ステージング環境とは?開発環境、検証環境との違いと役割 | WWWクリエイターズ

お前らのSSH Keysの作り方は間違っている - Qiita

Managing Your SSH Keys | Heroku Dev Center

Rails5 x MySQL を Herokuにデプロイする手順 | tackeyy.com

mysqlを使ったRailsアプリをHerokuにデプロイする流れ - Qiita

HerokuでMySQLを使おうとして詰まったところ - Qiita

Heroku データベースの管理(ClearDB アドオンによる MySQL の利用) - 君の瞳はまるでルビー - Ruby 関連まとめサイト

Herokuで本番環境の環境変数(config vars)を.envファイルで設定する - dackdive's blog

初めてのプライベート開発 その2

ローカル開発環境を作っていきます。

基本的には以前自分であげたこちらの記事に沿って、Dockerで立てます。

khanamoto.hatenablog.com

技術スタック

現時点での最新バージョンを使います。

MySQL 8.0は正式版が数日前にリリースされたばかりですが、出たばかりの技術に触れることに慣れるいい機会なので8.0を使ってみようと思います(開発中にどうしても行き詰まった場合や深刻な脆弱性が出てきたら5.7にするかもしれません…)。

Amazon RDSで使えるバージョンに合わせてMySQL 5.7にします。

それと本番ではサーバーにnginxを使うつもりですが、開発環境ではしばらくpumaを使っていく予定です。

Railsアプリ&DB新規作成

以下のファイルを作って、

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
└── .env

$ docker-compose run web rails new . --force --database=mysql
$ docker-compose build
$ docker-compose run web rake db:create
を順に実行します。ファイルの中身など詳細は前掲の記事参照。

注意点はGemfileでrailsのバージョンを5.2にすること。

source 'https://rubygems.org'
gem 'rails', '~> 5.2'

もし古いバージョンで作成してバージョンアップしたいときは、コンテナとイメージを両方削除してからもう一度rails newしてください。
ちなみに-sオプションで既存ファイルをスキップするとGemfileもスキップされるので注意。

テーブル作成

新規にテーブルを作成するので、rails generate modelコマンドでモデルとマイグレーションファイルをあわせて生成します。すでに存在するテーブルの変更の場合はmigrationコマンドを使います。

モデルクラス新規作成

docker-compose run web rails generate model tag tag_name:string
docker-compose run web rails generate model film user:references title:string staff:string comment:text favorite_scene:text watch_day:date cinema:string film_image:binary
docker-compose run web rails generate model film_tag film:references tag:references
docker-compose run web rails generate model user user_name:string profile_name:string email:string password:string profile:text user_image:binary
docker-compose run web rails generate model comment film:references user:references body:text
docker-compose run web rails generate model like film:references user:references
docker-compose run web rails generate model contact user:references body:text
docker-compose run web rails generate model follow user:references follow:references

マイグレーションファイル編集

NOT NULLやユニークなど列制約をつけます。
ユニーク制約はエラーが出たときの発生箇所を特定しやすくするために、アプリケーション側(モデル)とDB側(マイグレーション)の両方で設定しました。

マイグレーション実行

マイグレーションファイルを実行し、テーブルを作成します。

$ docker-compose run web rails db:migrate

アソシエーション(関連付け)設定

あとから開発で変更するかもしれませんが、テーブル設計にもとづいてアソシエーションをモデルに書いておきます。

フロントエンド整備

SlimとBootstrapをgemに追加します。jquery-railsはbootstrapのために必要です。

gem 'slim-rails'
gem 'bootstrap'
gem 'jquery-rails'

そしてerbファイルはslimファイルに変更し、中身もslim記法に書き換えます。

さらにapp/assets/javascripts/application.jsに以下を追加

//= require jquery3
//= require popper
//= require bootstrap-sprockets

application.cssをapplication.scssに変更し、以下を追加。

@import "bootstrap"

まとめ

開発環境の準備ができたのでここから開発に入っていきます。
まずは会員登録とログインから実装していきます。ここがしっかりできればあとはフォロー以外はそんなに難しくないかなと思います。

フォローはたぶん一番の山場になりそう。

余談

MySQL 8.0を使った場合のmysql 認証エラー。一応将来のためのログとしてここに残しておきます。

$ docker-compose run web rake db:create
Starting films-app_db_1 ... done
#<Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>"root", "host"=>"db", "database"=>"films_development"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'films_development'
#<Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory>
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"root", "password"=>"root", "host"=>"db", "database"=>"films_test"}, {:charset=>"utf8"}
(If you set the charset manually, make sure you have a matching collation)
Created database 'films_test'

参考

MySQL 8.0正式版がリリース。性能が最大で2倍、JSONデータや地理情報などサポート。ロールによるユーザー権限の管理も可能に - Publickey

Docker で MySQL 8.0.4 を使う - Qiita

MySQL :: MySQL 8.0 Reference Manual :: 6.5.1.3 Caching SHA-2 Pluggable Authentication

Ruby on Rails 5.2正式版発表。Active Storageによるクラウドストレージ対応、Redisでのキャッシュ対応など - Publickey

マイグレーションファイル編集

Ruby - RailsでUserIDに一意制約を設けたい(121938)|teratail

Rails 複数のカラムに 一意制約 (ユニーク)を設ける - yamarkz's blog

Active Record バリデーション | Rails ガイド