メモ的な何か

技術的な私のメモになる予定です。

チュートリアルでテストDBまわりで詰まった

「6.2.5 一意性を検証する」で詰まった

簡単にやっていることを説明するとアプリケーションにユーザモデルを定義し、そのユーザモデルの要素であるメールアドレスを一意にするという流れの部分です。
その中で以下の部分で本来redにならないといけないところがgreenになってしまいました。

この時点では、テストDB用のサンプルデータが含まれているfixtures内で一意性の制限が保たれていないため、テストは red になります

チュートリアルの通りでusers.ymlは変更していないのでこの結果はおかしいです。

調査

DBに一意のインデックスが設定されてないのが原因かと思い、確認してみました。

$ sqlite3 db/development.sqlite3
sqlite> select * from sqlite_master where type='index' and name='index_users_on_email';
    type = index
    name = index_users_on_email
tbl_name = users
rootpage = 8
     sql = CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email")

development.sqlite3はちゃんと設定されてます。
しかしながらテストのときはtest.sqlite3が使われるっぽいのでこちらも確認してみました。

$ sqlite3 db/test.sqlite3
sqlite> select * from sqlite_master where type='index' and name='index_users_on_email';
sqlite>

なぜかこちらは設定されてません。
そこでとりあえずテストDBへのマイグレーションロールバックします。

$ rails db:rollback RAILS_ENV=test
= 20180818045941 AddIndexToUsersEmail: reverting =============================
-- remove_index(:users, {:column=>:email})
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

でもインデックスが無く、ロールバックできないとエラーになりました。
これはこの問題が発生する前に私がインデックスを作るときエラーになった原因がわからず以下の作業をしたことが原因だと思います。

  1. [timestamp]_add_index_to_users_email.rbを空にしてマイグレーションrails db:migrate)。
  2. その後ロールバックrails db:rollback)。
  3. [timestamp]_add_index_to_users_email.rbにインデックスを記載してマイグレーションrails db:migrate)。

このことからテストDBもロールバックしたいときは別途で明示的にロールバックしないといけないのかと思っています。

解消方法

ここからは以下の手順で問題を解消しました。

  1. [timestamp]_add_index_to_users_email.rbを空にしてテストDBをロールバックrails db:rollback RAILS_ENV=test)。
  2. [timestamp]_add_index_to_users_email.rbにインデックスを記載してマイグレーションrails db:migrate RAILS_ENV=test)。
  3. Usersテーブル内にusers.ymlのデータが入っており2.がエラーとなるのでそのデータを削除(sqlite3でdelete from users;)。
  4. 2.を再度実施

この手順で想定通りtestがredになり、チュートリアルを先に進められるようになりました。

Ruby on Railsをはじめてみました

Rails環境の構築

Railsのgemをグローバルで入れるのは避けたかったので、ここを参考に以下の方法でRails環境を構築しました。
rbenvとかbundlerとかは設定済みの前提です。

railsを入れるためのディレクト

$ mkdir rails_sample
$ cd rails_sample

Gemfileを作成

$ bundle init
$ echo 'gem "rails", "5.2,0"' >> Gemfile

Railsは現在の最新を指定して入れてみました。
ちなみに自動生成されたGemfileの中にgit_sourceというのがあるのですが、githubオプションをつけたgemをHttpsGithubから取得するというものになります。

Railsのインストール

$ bundle install --path vendor/bundle

Railsプロジェクトの作成

$ bundle exec rails new blog --skip-bundle

このあとRailsをはじめようをやるのでblogというなでRailsプロジェクトを作成しています。
--skip-bundleをつけないとgemがグローバルで入っちゃいます。

$ rm -f Gemfile
$ rm -f Gemfile.lock
$ rm -rf vendor
$ rm -rf .bundle

ローカルに入れるために使ったファイルを削除します。

$ cd blog
$ bundle install --path vendor/bundle

最後に先程--skip-bundleでスキップしたbundle installをプロジェクト内を指定して実施します。

$ echo '/vendor/bundle' >> .gitignore

忘れないうちにgit管理から除外。
この辺は後々追加もあると思います。

Railsの起動

$ bundle exec rails server

Railsをはじめよう

Railsをはじめようをとりあえずやってみました。
rails ~bundle exec railsと読み替えて実施できます。
次はRuby on Railsチュートリアルかな。

MacでのUbuntu環境構築

なぜ構築したか

ConnpassToCalendarの動作確認環境としてクリーンな環境がほしかったためです。
LinuxでポピュラーなUbuntuを選択し、Rubyのインストールまでを実施しました。

環境

仮想デスクトップ:Parallels Desktop Lite
LinuxUbuntu 18.04
今回はISOを使ってインストール。
あまり特殊なことをしてないので内容は省略。

キーボードの「英数」、「かな」の設定

インストールしたままではキーボードの「英数」、「かな」が動かなかったので設定。
基本的にはこのサイトを参考にしましたが、若干バージョンが違うため差があったところをメモ。

1.設定から「地域と言語」タブを開くと入力ソースが存在します。
f:id:rui_phone:20180731230126p:plain

2.**「+」を押すて「日本語」、「日本語(Mozc)」を選択。
f:id:rui_phone:20180731230156p:plainf:id:rui_phone:20180731230158p:plain

3.上部のバーの入力ソースのアイコンから、「入力モード(A)」、「プロパティ」で「Mozcプロパティ」が開けます。
あとは「キー設定の選択」から一緒な感じで設定できます。
f:id:rui_phone:20180731230332p:plainf:id:rui_phone:20180731230755p:plain

キーボードの「" 」が別の文字になっちゃうのを対策

特定の文字がキーボード通りに動かなかったたのでこちらも設定しました。
このサイトを参考に以下のコマンドを実施します。
その後「MacBook/MacBook Pro (Intl)」、「日本語」、「日本語」、「キーボード配置のデフォルト」、「コンポーズキーなし」、「いいえ」を選択していきます。

$ sudo dpkg-reconfigure keyboard-configuration

rbenvのインストール

このサイトを参考に以下でrbenvをインストールしました。

apt-get更新

$ sudo apt-get update  # => パッケージリストの更新
$ sudo apt-get upgrade # => インストールされてるパッケージの更新

rbenvのインストール

$ sudo apt-get install git build-essential libssl-dev 
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

~/.profileに追記

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(rbenv init -)"' >> ~/.profile
$ source ~/.profile

Rubyのインストール

以下を実行するとエラーになりました。

$ rbenv install 2.5.1

このサイトを参考に以下のコマンドを実行したら解決しました。
余計なものが入ってそうなのはわかってますが今回はテスト用なのでここの調査は飛ばします。 こっちの内容だけでも大丈夫な気がしてます。
次回クリーンインストールするとき試します。

$ sudo apt-get install build-essential bison libreadline6-dev curl git-core zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev autoconf libncurses5-dev

インストールが成功したあとはバージョン2.5.1を実行するRubyとして選択。

$ rbenv global 2.5.1

ConnpassToCalendarリリースしました

リリース報告

Rubyで作成したCLIアプリケーションConnpassToCalendarをリリースしました。
詳しくはGithubのページを見ていただければと思います。

github.com

感想

使い勝手としてはいろいろ問題はあると思いますが、コンセプトどおりにはできたかなというところです。
作成を通してrubygems.orgへの公開とか基本的なgemの作り方とかを覚えられたのはすごい良かったです。

rubygem.orgにgemを公開する手順

はじめに

アプリをrubygems.orgに公開するための手順を確認しました。
この手順で作成したアプリを公開します。

gemの作成

以前の記事にも記載しましたが、以下の方法でgemの雛形が作成できます。
この方法で作成して置けば、gemを公開する準備は整っています。

$ bundle gem test

githubに登録

rubygems.orgに公開するにはそのgemが公開されているGitリポジトリになければなりません。
基本はGitHubでいいと思います。
アカウント作成とSSH認証については今回は省略します。

作成された雛形はすでにgit管理されているのでそのまま扱えるのですが、プロジェクトの作成上で公開したくないファイルについては.gitignoreを更新して対応する必要があります。

$ cd test
$ git add -A
$ git commit -m "コメントは入れようね!"
$ git remote add origin git@gitub.com:<githubアカウント名>/<作成したプロジェクト名>.git
$ git push -u origin master

rubygems.orgのアカウント登録

rubygemsのサインアップでアカウント登録します。

rubygems APIアクセス鍵の登録

アカウント登録が完了したらプロフィール編集ページAPI ACCESSCurlコマンドを実行します。

$ curl -u <rubygemsアカウント名> https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
Enter host password for user <rubygemsアカウント名>:<rubygemsのパスワードを入力>

gemの作成

以下のコマンドでプロジェクトからgemの作成ができます。
この項目は特にgemの公開とは関係ないですが、公開せずにgemを使ったりできます。

$ cd test
$ bundle exec rake build # => pkg/以下に作成されます。

gemの中身はgitで管理されているものになりますが、一応以下のコマンドでgemを展開できます。

$ gem unpack <gem名>

gemspecの修正

前の記事に書いたTODOの修正等はもちろんだが、 rubygemsに公開する場合は以下をコメントアウトしないと公開できません。

  if spec.respond_to?(:metadata)
    spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
  else
    raise "RubyGems 2.0 or newer is required to protect against " \
      "public gem pushes."
  end

rubygemsへの公開

上記の各項目(gemの作成以外)が完了していれば以下のコマンドでrubygemsに公開できます。

$ cd test
$ bundle exec rake release

しかしgit add前のコミットしていない内容が存在するとエラーとなることがあるので、気をつける必要があります。 その場合はコミットまで完了するか、大丈夫であればgit checkoutで元に戻す等で対応できます。

Version更新

余談だが、version.rbの以下の数値を修正することで公開するバージョンを明示的にできます。

  module ConnpassToCalendar
    VERSION = "0.1.0"
  end

参考

gem を作って rubygems へ登録/公開する手順

rake releaseでコミットを先にしろと怒られた時の対応

Gemを作ってRubygemsに公開する手順 - コンユウメモ

Thorでgets使うとエラー

事象

Thorを使ってgetsで入力を受け取ろうとするとエラーがでました。

Errno::ENOENT: No such file or directory @ rb_sysopen

解決

Thorが原因かは最初わからなかったけど、ググったらこのサイトにたどり着いたので解決しました。
サイトの通りgetsのところを以下に置き換えたら解決しました。

STDIN.gets.chomp

またハマりそうなので、メモ!

RubyでConnpassのAPIを叩く

はじめに

RubyCLIアプリを作成し始めました。
ConnpassのイベントをGoogleカレンダーに登録する感じのを作ろうと思います。
便利なものになるかはわかりません。(そもそもCLIアプリな時点で)
完成形は置いといてまずはHttpsでConnpassのAPIを叩くところを作りました。

API呼び出し

APIの仕様に沿って作成しました。
すごいAPIがシンプルなので難しいところはないのですが、APIの呼び出しがHTTPSになると以外に情報がなかったので呼び出し部分を抜粋で載せておきます。
特に外部ライブラリ使わなくても標準のnet/httpでも十分って感じでした。

def self.get(params)
  begin
    validation params # パラメータのバリデーションチェック呼び出し
    params = URI.encode_www_form params
    uri = URI.parse("https://connpass.com/api/v1/event/?#{params}")
    response = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) { |http|
      request = Net::HTTP::Get.new uri
      http.request request
    }
    JSON.parse response.body
  rescue ArgumentError => e
    e.message
  rescue IOError => e
    e.message
  rescue Timeout::Error => e
    e.message
  rescue JSON::ParserError => e
    e.message
  rescue => e
    e.message
  end
end

パラメータのバリデーションチェックも簡単にですが実装しています。
引っかかった場合はArgumentErrorを返す感じです。
エラー処理部分は今はエラーメッセージを返す感じにしてますが、そのままエラーを呼び出しもとに投げる形に変えるかも。