macOSをMojaveにしたら問題が
問題
いままで普通にできてたことがMojaveに変えてからできなくなってしまいました。
1. brew install
でエラーになる
私の環境だとこんなん出ました。
多分すでに入れてるものとか、入れようとしてるものによって違うけど。
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun Error: An exception occurred within a child process: CompilerSelectionError: python@2 cannot be built with any available compilers. Install GNU's GCC brew install gcc
2. bundle install
でエラーになる
これ以外にもいろいろでます。(長すぎるので)
これも環境によって違いそう。
An error occurred while installing sqlite3 (1.3.13), and Bundler cannot continue. Make sure that `gem install sqlite3 -v '1.3.13' --source 'https://rubygems.org/'` succeeds before bundling.
解決策
以下をコマンドラインで実行
$ xcode-select --install $ sudo open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
参考
Rails: macOSをMojaveにアップグレード後`bundle install`がエラーになった場合の対応方法 macOS Mojaveにアップデートして色々壊れる件 (homebrew, gem, nokogiri, gcloud) - Qiita
チュートリアルでテスト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:
でもインデックスが無く、ロールバックできないとエラーになりました。
これはこの問題が発生する前に私がインデックスを作るときエラーになった原因がわからず以下の作業をしたことが原因だと思います。
- [timestamp]_add_index_to_users_email.rbを空にしてマイグレーション(rails db:migrate)。
- その後ロールバック(rails db:rollback)。
- [timestamp]_add_index_to_users_email.rbにインデックスを記載してマイグレーション(rails db:migrate)。
このことからテストDBもロールバックしたいときは別途で明示的にロールバックしないといけないのかと思っています。
解消方法
ここからは以下の手順で問題を解消しました。
- [timestamp]_add_index_to_users_email.rbを空にしてテストDBをロールバック(rails db:rollback RAILS_ENV=test)。
- [timestamp]_add_index_to_users_email.rbにインデックスを記載してマイグレーション(rails db:migrate RAILS_ENV=test)。
- Usersテーブル内にusers.ymlのデータが入っており2.がエラーとなるのでそのデータを削除(sqlite3でdelete from users;)。
- 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をHttpsでGithubから取得するというものになります。
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
Linux:Ubuntu 18.04
今回はISOを使ってインストール。
あまり特殊なことをしてないので内容は省略。
キーボードの「英数」、「かな」の設定
インストールしたままではキーボードの「英数」、「かな」が動かなかったので設定。
基本的にはこのサイトを参考にしましたが、若干バージョンが違うため差があったところをメモ。
1.設定から「地域と言語」タブを開くと入力ソースが存在します。
2.**「+」を押すて「日本語」、「日本語(Mozc)」を選択。
3.上部のバーの入力ソースのアイコンから、「入力モード(A)」、「プロパティ」で「Mozcプロパティ」が開けます。
あとは「キー設定の選択」から一緒な感じで設定できます。
キーボードの「" 」が別の文字になっちゃうのを対策
特定の文字がキーボード通りに動かなかったたのでこちらも設定しました。
このサイトを参考に以下のコマンドを実施します。
その後「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のページを見ていただければと思います。
感想
使い勝手としてはいろいろ問題はあると思いますが、コンセプトどおりにはできたかなというところです。
作成を通して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 ACCESSのCurlコマンドを実行します。
$ 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
参考
Thorでgets使うとエラー
事象
Thorを使ってgets
で入力を受け取ろうとするとエラーがでました。
Errno::ENOENT: No such file or directory @ rb_sysopen
解決
Thorが原因かは最初わからなかったけど、ググったらこのサイトにたどり着いたので解決しました。
サイトの通りgets
のところを以下に置き換えたら解決しました。
STDIN.gets.chomp
またハマりそうなので、メモ!