Ruby on Rails 5.2.1 上でdevise 4.5.0を利用する

目的

Ruby on Railsでよく使われている認証周りのgemライブラリーであるdeviseをつかってログイン機能を用いる。 deviseの標準ではemailに基づいてユーザを区別しているが、usernameでユーザを区別できるようにする。

環境

% lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.1 LTS
Release:	18.04
Codename:	bionic

% ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

% gem -v
2.7.7

% rails -v
Rails 5.2.1

新しいプロジェクトの生成

% rails new prac_devise --skip-bundle
% cd prac_devise
% cp -p Gemfile Gemfile.org
% vi Gemfile

Gemfileの中身を以下のように変更する。

% diff Gemfile.org Gemfile
17c17
< # gem 'mini_racer', platforms: :ruby
---
>  gem 'mini_racer', platforms: :ruby
62c62
< gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
---
> #gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
63a64
> gem 'devise'

bundleを実行する。

% bundle install --path vendor/bundle

ダミーモデルの作成

今回はHomeコントローラーを作成し、indexにアクセスする際にはログインなし、showにアクセスする場合はログインありに設定する。このためにHomeコントローラーを作成する。

% rails g controller Home index show

このアプリケーションのトップページをHome#indexとする。

% vi config/routes.rb 

中身に以下を加える。

root to: "home#index"

Deviseのインストール

このアプリケーションでdeviseが使えるように設定する。

% rails g devise:install

今回はUserモデルを認証対象のモデルとする。

% rails g devise User

devise用のviewを app/views/devise 以下にコピーする。

% rails g devise:views
% ls app/views/devise/
confirmations/	passwords/	sessions/  unlocks/
mailer/		registrations/	shared/

メールに記述するURLの設定

config/environments/development.rb に以下を加える。

# mailer setting
 config.action_mailer.default_url_options = {host: 'localhost', port: 3000}

エラーメッセージを表示できるようにする。

app/views/layouts/application.html.erbに以下を加える。

〜省略〜
  <body>
    <p class="notice"><%= notice %></p> #この行を追加
    <p class="alert"><%= alert %></p>        #この行を追加
    <%= yield %>
  </body>
〜省略〜

User#showへのアクセスをログインした場合のみにする

app/controllers/home_controller.rb にフィルターをかける。

class HomeController < ApplicationController

  before_action :authenticate_user!, only: :show #この行を追加

  def index
  end
〜省略〜

試してみる

% rails db:migrate
% rails s
(終了させるときは Ctrl + c)

識別キーをusernameに変更する

まず、usersテーブルにusernameを追加する。

% rails g migration add_username_to_users username:string

db/migrate/xxxxxxxxx_add_username_to_users.rb を編集し、usernameをインデックスとして使えるように以下を追加する。

class AddUsernameToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :username, :string
    add_index :users, :username, unique: true #この行を追加
  end
end

上記の変更を反映させる。

% rails db:migrate

識別キーをusernameに変更する。 config/initializers/devise.rbに以下の行を加える。

〜 省略 〜
  # You can also supply a hash where the value is a boolean determining whether
  # or not authentication should be aborted when the value is not present.
  # config.authentication_keys = [:email]
  config.authentication_keys = [:username] #この行を追加
〜 省略 〜

ログイン(sign in)、ユーザ登録(sign up)、情報変更のページでusernameを入力できるように変更する。

ログインページ(app/views/devise/sessions/new.html.erb)の編集。

変更前
    <%= f.label :email %><br />
     <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
変更後
     <%= f.label :username %><br />
     <%= f.email_field :username, autofocus: true %>

ユーザ登録ページ(app/views/devise/registrations/new.html.erb) の編集。

変更前
     <%= f.label :email %><br />
     <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
変更後
     <%= f.label :username %><br />
     <%= f.text_field :username, autofocus: true %>

情報変更のページ(app/views/devise/registrations/edit.html.erb)の編集。

変更前
     <%= f.label :email %><br />
     <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
変更後
     <%= f.label :username %><br />
     <%= f.text_field :username, autofocus: true %>

usernameにvalidateを設定およびemailを利用しないことを設定する。

app/models/user.rb について以下を追加する。

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

# この行以下を追加する

# usernameの制約
  validates :username,
            uniqueness: {case_sensitive: :false},
            length: {minimum: 4, maximum: 20},
            format: {with: /\A[a-z0-9]+\z/, message: "ユーザ名は半角英数字です"}

# emailを識別キーとして使わない場合の処理
  def email_required?
    false
  end

  def email_changed?
    false
  end
  
  def will_save_changed_to_email?
    false
  end
 
# 追加ここまで
end

strong_parameterの設定

Ruby on Rails4よりStrong Parameterという仕組みが導入されている。これの設定が必要。 app/controllers/application_controller.rb に以下を加える。

  # deviceのコントローラーのときに、下記のメソッドを呼ぶ
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
  
 # usernameを追加する 参考:https://github.com/plataformatec/devise#strong-parameters
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit :sign_up, keys: [:usrname]
    devise_parameter_sanitizer.permit :account_update, keys: [:username]
  end

試してみる

% rails db:migrate
% rails s
(終了させるときは Ctrl + c)

半径5mの観察からみる最近のオープンキャンパス

タイトルに予防線はりまくりですが。

@nasastarさんのツイート読んで、「大学にずっといるから、今の大学の状況は私にとって当たり前だけど、卒業した人たちからすると全然違っているんだよなぁ」とあらためて思ったので、ここ5~6年間で顕著になったオープンキャンパスの現状(ただし、私の本務校&所属学部)をメモする。

5~6年前の印象

  • 高校3年生が参加している
  • 友達同士での参加が多い
  • 親の参加は片親(父親か母親)。ただし、数は多くない(全体の4分の1以下)。
  • 学食に興味津々(午前中だと学食混まないうちに行きたいのか、模擬講義をエスケープする子も多かった)

最近の印象

  • 高校1~3年生が参加している。どちらかというと以前に比べて3年生は少ない(参加高校生の半分ぐらい)
    • 高校が夏休みの宿題としてオープンキャンパスへの参加を課している(2~3校ぐらい)。この結果、@nasastarさんのツイートような事態が生じている。私の本務校ではハンコ対応窓口を別途用意するようになった(それだけ多い)。
    • 2~3年生のときにオープンキャンパスに参加済みだからか、高校3年生の参加は少なくなっている(他校に行っている可能性もある)
  • 友達同士での参加は引き続き多い。
  • 家族での参加も多くなった。両親や兄弟姉妹での参加も多い。この結果、オープンキャンパスへの参加人数が1.X倍~3倍ぐらい増えた。
    • 親だけの参加もちらほらみられる(もしかしたら、子供は別の学科・学部の方に参加しているのかもしれない)
    • 高校1~2年生&親で参加というケースも結構ある。このため、これまで定番の「入試制度について教えてほしい」に加えて、「これからどうやって勉強していったらよいのか」「どの学部・学科に入ったらよいのか」という相談も結構受けるようになった。
  • 学食はひきつづき大人気。

実施側の変化

  • 私が勤務し始めたころにくらべ、大学がオープンキャンパスに費やす人的・時間的・金銭的コストは上がっている。つまり、より親切に、ていねいに、わかりやすくなった。
    • 教職員の投入量増えた
    • 学生アルバイトも増えた
    • 企画(キャンパスツアー、展示)および配布物(大学、学部、学科パンフレット、大学を宣伝するパンフレットなど)も増えた
    • 大学と最寄りの駅を行き来するバスも増便してもらっている
  • 上記の結果、8月は忙しい
  • 親の参加が多くなった点については結構対応している(就職率や卒業後の進路のアピールもあり)
  • 高校1~2年生の参加が多いという点にはまだ対応できていない気がする

今年度困ったこと

  • Q:「私、高校1年生なんですけど平成32年度(next49注:まあ、そんなときは来ないのですが)のセンター入試ってどうなっているんでしょう?」
  • A:「どうなるんでしょうねぇ。私も大学教員なんですがわからないんですよ。今年の11月のプレテストやってみないと…」

リンク:お決まりの方法では解決しない「VMware Authorization Service」

まさにここにあるとおりのエラーに直面した。解決法を共有していただけるのは本当にありがたい。TBS熊崎アナウンサー式に言ういうと「ただただ、感謝」。

yvernis.blog.fc2.com

ちなみに一番最初の「コンピュータの管理」にたどり着く方法は

  1. デスクトップ左下のWindows 10のアイコンを右クリックする。
  2. 「コンピュータの管理」を選択する。

Ubuntu 16.04LTSから18.04LTSへのアップグレード

まずは16.04LTSのバージョンを最新にしてから、update-manager-coreをインストールする。その後、LTS用アップグレードを実行する。

% sudo apt update -y
% sudo apt upgrade -y
% sudo apt dist-upgrade -y
% sudo apt autoremove
% sudo apt install update-manager-core
% sudo do-release-upgrade -d

16.04LTSのデフォルトのpythonは2.7だが、python3もインストールした。この際に update-alternativeで/usr/bin/pythonを管理していた。この結果、以下のようなエラーがでた。

インストールされたPythonが破損しています。シンボリックリンク'/usr/bin/python'を修正してください。

対応にはこちらを参照した。upgrade - How to fix "python installation is corrupted"? - Ask Ubuntu

% sudo ln -sf /usr/bin/python2.7 /usr/bin/python

再び、アップグレードを実行する。

% sudo do-release-upgrade -d

1時間ぐらいで無事アップグレード成功。ただし、tex-commonがうまくアップグレードできなかった。

tex-commonのトラブル

fmtutilがうまく実行できていない様子。

% sudo fmtutil
Can't locate mktexlsr.pl in @INC (@INC contains: /usr/local/texlive/2012/tlpkg /usr/local/texlive/2012/texmf-dist/scripts/texlive /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at /usr/bin/fmtutil line 23.
BEGIN failed--compilation aborted at /usr/bin/fmtutil line 25.

このパスのうち  /usr/local/texlive/2012/ は昔、手動でインストールしたtexlive-2012の名残。ここいらへんがおかしい気が。

/usr/local/bin以下に /usr/local/texlive/2012/以下にあるコマンドへのシンボリックリンクが大量にあった。このせいで、標準の/usr/bin/以下にあるTeX系コマンドと/usr/local/bin以下にあるTex系コマンドが入り混じってエラーがでていた様子。そこで、/usr/local/bin以下のシンボリックリンクを消す。まず、シンボリックリンクをリンク切れにする。

% sudo mv /usr/local/texlive /usr/local/texlive-old

続いて リンク切れのシンボリックリンク一括削除方法で紹介されているコマンドを実行し、リンク切れのシンボリックリンクを削除する。

% cd /usr/local/bin
% find . -xtype l |  sudo xargs rm

無事、tex-commonがインストールできた。

GCCがバージョン7になったことによるトラブル

以下のエントリーにあるようなトラブルが発生し、g++でコンパイルができない状況が発生した。

これの回避方法は、インクルードファイルの読み込みパスを自分で定義している場合はそれを全部削除すること。私はシェルの設定ファイルにインクルードファイルの読み込みパスの設定を行っていたのでそれを削除した。

PostgreSQL 9.Xから10への移行

PostgreSQLを16.04で使っていた場合、PostgreSQL 10へ手動で対応する必要がある。
www.paulox.net

Passenger

アップデート時に /etc/apt/sources.list.d/passenger.list がコメントアウトされているのでコメントインする必要がある。

メモ:「カメラを止めるな!」の原案・原作問題

録音して聞いているTBSラジオのアフター6ジャンクションで紹介されていた「カメラを止めるな!」をお盆休みに見てきた。十数年ぶりの映画館での映画鑑賞。感想は「よく出来ているなぁ」というもの。
www.tbsradio.jp

で、この「カメラを止めるな!」についてパクリ問題が生じているとのこと。

headlines.yahoo.co.jp

note.mu

〜前略〜

ツイッターでもFBでも、「みんな見てね!」と思わずシェアしてました。
映画も素直に面白かった。

でも実際に見てみるとクレジットにはPEACEの名前、GHOSTの名前はありませんでした。

〜 中略 〜

その際に、配給拡大のタイミングで、今日クレジットは決めなくてはならない。といわれ、最終的に向こうから妥協案として「原案」だったらどうですか、という話になり、“ひとまず”クレジットには原案として劇団名、作品名を入れてもらいました。
そして、その後原作かどうかは判断しましょう。
という話になりました。
だから今、映画のエンドロールには

原案:劇団PEACE「GHOST IN THE BOX!」(作:A 演出:和田亮一)

special thanks で和田亮一と入っています。
〜後略〜

「GHOST IN THE BOX!」ってどっかで聴いたなと思ったら同じくアフター6ジャンクションに上田監督がでたときのこの映画の経緯で語っていたやつ。
www.tbsradio.jp

だいたい同じ内容の経緯説明

上田監督:5年前に、劇団PEACE(2014年解散)の「GHOST IN THE BOX!」という舞台を観まして、物語の構造がすごく面白いなと思ったんです。この舞台を原案にして映画化したいと思い、最初はその舞台の脚本家や出演者の方と一緒に企画を進めていたんですがなかなか前に進まず一旦企画は頓挫。2年ほど前にとあるコンペに出すのをきっかけにまたこの企画を引っ張り出して、基本的な構造以外は登場人物も展開も丸ごと変えて、新たな作品としてプロットを固めていきました。その企画コンペには落ちたんですが、ちょうどその直後にこの「シネマプロジェクト」のお話をいただいたんです。「シネマプロジェクト」というのは新人の監督と俳優がワークショップを経て一本の映画を作るという企画です。

爆ヒット中の映画『カメラを止めるな!』上田慎一郎監督インタビュー「映画が観た人の現実を前向きに動かしている。これほど嬉しいことはありません」 | ガジェット通信 GetNewsより)

こんなに話題になると思っていなかったので権利処理が甘かったのかなぁと予想。同じくアフター6ジャンクションに柳下さんがでたときに語っていたエピソードで「カメラを止めるな!」は映倫の審査を公開後にとっているという話がでていた(たぶん、映倫の審査を受けるお金がなかった&単館上映だから不要だったと予想)(参考:映倫審査リスト:映倫番号 121655
www.tbsradio.jp

上田監督もオマージュ元を明言しているので穏当にこの問題が着地するのを願っている。

最初は絶賛していたじゃないかという指摘

togetter.com

追記:公式のアナウンス

kametome.net

アフター6ジャンクションでの反応

miyearnzzlabo.com

「GHOST IN THE BOX!」の感想サイト

stage.corich.jp