Reinvent Yourself

技術メモや日々思っていることなど

Herokuのmigrate時のエラー(Gem::LoadError: Specified 'postgresql')を解決

はじめに

Heroku上でmigrateを実行した際にエラーになったので備忘録としてメモしておく。

環境

ruby 2.4.3p205
Rails 5.1.4
Mac OS X 10.13.3

エラー内容

migrate時にエラー

postgresqlがアダプタに指定されているのにgemがロードできないのでGemfileに「gem 'pg'」を追加せよとのこと。gem 'pg'は入れてあったので疑問に思ったが、その後のメッセージにて、バージョンに言及されていた。バージョンが1.0.0になっているが、~> 0.18に落とす必要がある。

% heroku run rake db:migrate 
Running rake db:migrate on ⬢ xxxxxx-xxxxxx-xxxxx... up, run.4943 (Free)
rake aborted!
Gem::LoadError: Specified 'postgresql' for database adapter, but the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).

(省略)

Caused by:
Gem::LoadError: can't activate pg (~> 0.18), already activated pg-1.0.0. Make sure all dependencies are added to Gemfile.

pg gemのバージョンを指定

gem 'pg'

gem 'pg', '~> 0.18'

へ変更

bundle installを実行

ひとまずローカル環境でbundle installし、pg gemのバージョンが1.0.0から0.21.0へ変更されたことを確認した。

% bundle install
(省略)
Fetching pg 0.21.0 (was 1.0.0)
(省略)

コミットしてHerokuへアップロード

% git add . 
% git commit -m "Changed pg gem version"                                                                                            [21:48:05]
% git push heroku master

migrate再実行

再度herokuにてmigrateを実行し、無事に処理が完了したことを確認した。

% heroku run rake db:migrate                                                                                                        [21:49:05]
Running rake db:migrate on ⬢ xxxxxx-xxxxxx-xxxxx... up, run.3942 (Free)

(省略)

   (1.2ms)  COMMIT
   (0.6ms)  SELECT pg_advisory_unlock(2211240757154865870)

RubyMineでRspec実行時のエラー(Gem::GemNotFoundException)を解決

はじめに

RubyMine上でRspecを実行するとエラーになったので備忘録としてメモしておく。

環境

RubyMine 2017.3.2
Ruby 2.4.3
Rails 5.1.4

エラー内容

RubyMineのRunからrspecを実行すると以下のエラーが発生した。

Testing started at 17:41 ...
/Users/xxxxx/.rbenv/versions/2.4.3/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/bin/spring rails spec
/Users/xxxxx/.rbenv/versions/2.4.3/lib/ruby/2.4.0/rubygems.rb:271:in `find_spec_for_exe': can't find gem spring (>= 0.a) (Gem::GemNotFoundException)
    from /Users/xxxxx/.rbenv/versions/2.4.3/lib/ruby/2.4.0/rubygems.rb:299:in `activate_bin_path'
    from /Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/bin/spring:23:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

Process finished with exit code 1

なお、ターミナルから

% bundle exec rspec

を実行するとエラーは出ない。 ログにはspring gemを見つけることができないというエラーが出ている。Gemfileにはspringが書かれている。

解決方法

RubyMineのメニュー〜Run〜Edit Configurations..を選択する。 f:id:sprink:20180128180820p:plain

specのBundlerタブを選択し、「Run the script in context of the bundle (bundle exec)」にチェックを付ける。 f:id:sprink:20180128180223p:plain

設定後

正常に終了した。

Testing started at 17:58 ...
/Users/xxxxx/.rbenv/shims/bundle exec ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) 
/Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/bin/spring rails spec
/Users/xxxxx/.rbenv/versions/2.4.3/bin/ruby -I/Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/gems/rspec-core-
3.7.1/lib:/Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/gems/rspec-support-3.7.0/lib /Users/xxxxx/sample_app/vendor/bundle/ruby/2.4.0/gems/rspec-core-3.7.1/exe/rspec --pattern spec/\*\*\{,/\*/\*\*\}/\*_spec.rb
No examples found.

0 examples, 0 failures, 0 passed

Finished in 0.001093 seconds

Process finished with exit code 0
Empty test suite.

解析

実行されるコマンドを比較(上:設定変更前、下:設定変更後)

/Users/xxxxx/.rbenv/versions/2.4.3/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) 
/Users/xxxxx/.rbenv/shims/bundle exec ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) 

下はRubyMineで設定した通り、bundle execでRubyを実行している。bundle execで実行することで、bundle installでインストールされたgemを参照する。

2018年のテーマ

はじめに

2018年のテーマを整理した。 なお、2017年の実績に対する2018年の目標は前回のエントリーに記載した。

sprink.hatenablog.com

2018年テーマ

目先の成果と将来の成果を結びつける

ドラッカーの著書「マネジメント」の「マネージャの仕事」の節に、マネージャの役割として

「そのあらゆる決定と行動において、ただちに必要とされているものと遠い将来に必要とされているものを調和させていくことである。いずれを犠牲にしても組織は危険にさらせれる。」

と書かれている。これは、組織におけるマネージャの仕事だけではなく、自己学習やキャリア戦略などにも応用できる。 すぐに必要なことにフォーカスしすぎて未来を犠牲にしてはいけない。本では、犠牲を主語に書かれているが、自分はタイトルに書いた通り、目先の成果が将来の成果に繋がるような行動を取っていこうと考えている。つまり、現在と未来両方をスコープとし、その中で成果を最大化する行動を取るということ。例えば、今は技術力が高いエンジニアになりたいが、将来は英語もできてかつ技術力も高いエンジニアになりたいという目標があったとする。この時に「英語は技術に自信が持てるようになってから勉強する。」だったり「技術はほどほどにして将来のために英語をしっかり学習する。」のではなく、「英語学習ができるサービスを開発して、ドックフードを行い、英語力も技術力も両方上げていく。」というような、アクションになる。

改善ではなく別のアプローチで解決する

映画「スティーブ・ジョブズ」で、ジョブズ

「他社製品を見たら改善を考えるより、別のアプローチを考えろ」

と言うシーンがある。世の中、すごいなと思う人がたくさんいる。その人と同じことをしたり改善したりするのではなく、自分がすごいなと思う「その先にあること(その人が出している成果)」や、自分が向かっていることに対する「ゴール」を明確にして、そこに向かって別のアプローチで成果を出せないか思考する。 いずれにしても、目的や目標など向かうものが明確になっていないと、別のアプローチの取りようもないので、まずはゴールを明確にすることが必要。すでに存在するものに対して、一部分を改善して、それより良くなりましたというのではなく、別のアプローチで、かつ自分の強みを活かしてそれを解決していく。

雑にアウトプットする

これは、Podcastの「しがないラジオ」で一番収穫があった考え方。

雑にアウトプット

完璧なものを目指してアウトプットしないよりも、雑でも良いからアプトプットしていくほうが良いということだ。別に目新しいことではなく多方面でこのような話は出てくるけど、パーソナリティの二人の具体的な取り組みを聞いて、やっぱりそうだよなぁと腹落ちした感があった。2017年11月から多少ブログエントリーが増えたのもこれがきっかけだ。雑なままだと価値が低いままになってしまうので、「まずはやってみる」というのと「どんどん改善してく」ということを両輪でやっていきたい。 ということで、ブログのエントリーは週1でアウトプットしていくというのを2018年の目標とする。

広告を非表示にする

2017年のふりかえり

はじめに

2017年をふりかえり、2018年はどうしていくか整理していく。 ちなみに2017年は、健康面で運動(ランニング、筋トレ等)、技術面(主にプログラミング)、英語の3つに対して目標を立てた。

ふりかえり

詳細は下記に書いたが、総括すると当初立てた目標に対して概ね達成しつつも目標自体をブラッシュアップしていけた(目標を当初立てたままとせずに、目標自体改善していった)。結果として、技術面、英語学習共にブレイクスルーポイントを超えた感触を得た。学習とは本当に小さなことの積み重ねなんだと改めて感じた。今後もコツコツと積み重ねしていく。また、目標は立てっぱなしにせず、適宜見直しして目的に向かってブラッシュアップしていく重要性も感じたのでこちらも2018年も継続していく。

ランニング 目標:50km/月、達成率:100%

8月までランニングは1回/週ペースだったが、9月から本格的に初めてみた(目標も月ごとの走行距離に変更した)。具体的にはランニングの雑誌を購入し、知識をつけてランニングシューズ、ウェアなどを購入した(今までは、もともと持っていたジャージとスニーカーだった)。 ランニングは、「Nike+RunClub」というiPhoneアプリで管理している。月間の走行距離も表示され、他にも便利な機能があるので重宝している。 今後は目標値を上げていきたいが最低限50km/月ペースは守っていく。

月別ランニング距離(km)
f:id:sprink:20180102151947p:plain

筋トレ、ストレッチ 目標:毎日、達成率:94%

筋トレは以前から行っていたので、2017年も継続して行った。9月からのランニングの本格化に合わせて、ストレッチと体幹トレーニングも行うようにした。体調を優先して筋トレを行っていない日も多く、達成率は94%にとどまった。体調を無視して筋トレするのもどうかと思うので、2018年は2017年よりも体調を整えるようにしたい。

緑:筋トレ日、青:やらなかった日 f:id:sprink:20180102173946p:plain

技術学習 1コミット/日、達成率:100%

RubyRailsを中心に、学習した内容をコミットし、GitHubへ上げた。こちらは2016年9月から毎日継続して行えており、2018年も継続していく。 また、学習以外にもプログラミングする機会がかなり増えたので、2018年はもっともっと高みを目指していく。

f:id:sprink:20180102172128p:plain

英語学習 目標:毎日、達成率:99%

英単語は、2016年から継続してiPhoneアプリの「mikan」を続けている。また、8月ぐらいから英文の理解も進めるために「Duolingo」も始めた。そのせいもあってか、英語の技術情報を見てもある程度内容がわかるようになった。さらに最近はAmazon PrimeVideoで「FRIENDS」の字幕版を見始めた(Prime会員なら無料)。部分部分で会話の内容がわかり、話も面白くてもっと英語を理解したいという欲が出てきて、英語学習のモチベーションが一気に上がった。Listeningスキルも上げていきたいので2018年は学習内容を改善していく。

緑:英語学習日、青:やらなかった日 f:id:sprink:20180102173445p:plain

その他成果

OSS貢献

一つ前のブログでも書いたが、はじめてOSSに(ほんのちょっとだけ)貢献した。ブログにその手順などを書いたことにより、単にプルリクするよりも貢献できたかなと思っている。 sprink.hatenablog.com

ブログビュー数

上の記事と関係するが、ブログにOSS貢献の手順を書いてみた。初めてPV数が100を超えた(おそらくwillnetさんにスターをつけて頂いた&ツイートして頂いたおかげ)。今後も有用な記事になるよう発信していきたい。 f:id:sprink:20180102181212p:plain

Podcastsを聞く

数年前から「Rebuild.fm」を聴き始めていて、2017年も継続して聞いていた。国内外の技術トレンドやエンジニア、学習について得るものが大きく、また聞いていて楽しいのでランニングや通勤中のお供になっている。2017年はさらに「しがないラジオ」を聴き始めた。主に国内のトレンドや、若手のエンジニアの学習に関する情報を得ることができて、有用に感じている。こちらも継続して聞いていく。

2018年について

上記にそれぞれのふりかえりと共に今後について書いたが、2018年に向けてどのような取り組みをしていくかは別エントリーに整理する。 2017年は、とにかく小さなことをコツコツやり、最初は感じられなかった成果を徐々に感じ始め、年末近くにはブレイクスルーがあったのが自分にとって大きい収穫だった。

広告を非表示にする

Ruby on RailsガイドにPull Requestを送ってみた

はじめに

以下のブログを読んでRailsガイドでOSS貢献してみたいなという気持ちがあったのと、ちょうどRailsガイドの誤記に気づいたのでプルリクを送ってみた。せっかくなので手順を残しておく。

blog.willnet.in

手順(2017/12/23現在)

手順の確認

下記ページの「フィードバックについて」および「Railsガイドの生成方法」を確認する。

GitHub - yasslab/railsguides.jp: Ruby on Rails Guides in Japanese (Railsガイド)

f:id:sprink:20171223174938p:plain 私が確認した内容は上記キャプチャの通りです。(今後変更があるかもしれませんので、作業前は最新のページを確認ください)

リポジトリをフォークする

f:id:sprink:20171223170855p:plain

フォークしたリポジトリをローカル環境にクローンする

f:id:sprink:20171223170958p:plain

$ git clone (githubからコピーしたパス)
クローンしたディレクリへ移動
$ cd railsguides.jp

ローカルリポジトリにブランチを追加してそのブランチへ移動(例:fix-typoブランチ)

$ git branch fix-typo
$ git checkout fix-typo

Ruby -vでRuby環境を確認

リポジトリには.ruby-versionファイルがある。ローカル環境に該当するバージョンがなければrbenv等でインストールする。

ファイルを修正する(/guides/source/ja 内の Markdown ファイルを編集する)

ローカルで修正結果を確認する

$ bundle install
$ bundle exec rake assets:precompile
$ bundle exec jekyll server

ブラウザでlocalhost:4000を指定し変更結果を確認する(問題があれば修正)。

問題なければ自分のアカウントのリモートリポジトリへPushする。

$ git add (修正したファイル)
$ git commit -m "(修正コメント:「Fix typo」など)"
$ git push

Pull Requestをする

「New pull request」をクリック

f:id:sprink:20171223175558p:plain

自分のリモートリポジトリ「(自分のアカウント名)/railsguides.jp」の「fix-typo」ブランチから「yasslab/railsguides.jp」の「master」へPull Requestする。

(キャプチャを撮り忘れてしまったのですが、下記情報を参考にプルリクしました)
【GitHub】Pull Requestの手順 - Qiita

実際のPull Request

github.com

感想

ほんのわずかではあるけど、初めてOSS貢献した。プルリクは自己学習で操作などはわかっていたし、普段Gitlabを使っていて概念はわかっているけど、実際にやってみると動作確認環境の構築でハマったり、どのブランチへプルリクを送れば良いか(過去のtypo修正のプルリクの調べるとjapaneseブランチへプルリクしてるようで、masterで良いか少し迷った)など、簡単にはいかなかった。本投稿も完全に細かく手順を記載しているわけではないけど、これからやってみようと思っている方への参考になればうれしい。

GitHubGistで.vimrcを管理する

はじめに

複数vim環境があるので、.vimrcをどこかで管理しようと思った。 githubリポジトリで管理しようと思ったが、.vimrcだけであればコピペで良いのとGistをためしに 使ってみたいということもありGistで管理したみた。

実際に登録したもの

gist.github.com

登録方法

GitHubサイトからアカウントアイコンのプルダウンから「Your Gists」を選択

f:id:sprink:20171218194430p:plain

内容を登録

シンプルな画面なので、説明不要かと思うが一応説明する。

①タイトル
②ファイル名(拡張子を含む)
③内容
④登録ボタン

f:id:sprink:20171218194745p:plain

Cloud9でRails+React環境構築(3.Material-UIを動かしてみる)

はじめに

前回の続き sprink.hatenablog.com

引き続きこちらの記事を参考にさせて頂きました。 codezine.jp

手順

Yarnパッケージの追加

package.jsonrails root直下)に以下を追加

(省略)
    "webpack-merge": "^4.1.0",
    "material-ui": "^0.18.0",
    "react-tap-event-plugin": "^2.0.1"
  },
(省略)

以下のコマンドを流す。

$ bin/yarn install

エラーが出る。

Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install

あれ?最初の手順で入れたはず、、yarnのバージョンを確認してみる。

$ yarn -v
bash: yarn: command not found

なさそう。

$ npm i -g yarn
/home/ubuntu/.nvm/versions/node/v6.11.2/bin/yarn -> /home/ubuntu/.nvm/versions/node/v6.11.2/lib/node_modules/yarn/bin/yarn.js
/home/ubuntu/.nvm/versions/node/v6.11.2/bin/yarnpkg -> /home/ubuntu/.nvm/versions/node/v6.11.2/lib/node_modules/yarn/bin/yarn.js
/home/ubuntu/.nvm/versions/node/v6.11.2/lib
└── yarn@1.3.2 

入った。 念のためバージョンを確認。

$ yarn -v
1.3.2

気を取り直してもう一回実行する。

$ bin/yarn install

success Saved lockfile.
Done in 22.78s.

成功した。

ビューファイルを修正

app/views/pages/index.html.erb

<h1>Rails5.1サンプルアプリケーション</h1>
<p>ReactベースのMaterial-UI(カード)を使う</p>

カードコンポーネントを呼び出すReactのコードを記述

まずjsxファイルを作る。

$ touch app/javascript/packs/expandable_example.jsx

以下を実装する。
app/javascript/packs/expandable_example.jsx

import React from 'react'
import ReactDOM from 'react-dom'
import PropTypes from 'prop-types'
import {Card, CardActions, CardHeader, CardText} from 'material-ui/Card'
import FlatButton from 'material-ui/FlatButton'
import baseTheme from 'material-ui/styles/baseThemes/lightBaseTheme'
import getMuiTheme from 'material-ui/styles/getMuiTheme'
import injectTapEventPlugin from 'react-tap-event-plugin'
injectTapEventPlugin()

class CardExampleExpandable extends React.Component {
  constructor(props) {
    super(props)
  }

  getChildContext() {
    return { muiTheme: getMuiTheme(baseTheme) }
  }

  render() {
    return (
      // カードコンポーネントのDOM
      <Card>
        // ヘッダー
        <CardHeader
          title="Rails 5.1サンプルアプリ開発"
          subtitle="Rails 5.1を体感する為のサンプルアプリケーションを開発する。"
          actAsExpander={true}
          showExpandableButton={true}
        />
        <CardActions>
          <FlatButton label="完了" />
          <FlatButton label="中止" />
        </CardActions>
        <CardText expandable={true}>
          ・Rails 5.1より採用されたyarn,webpackを用いる<br/>
          ・Reactを採用しReactベースのMaterial-UIを入れてみる
        </CardText>
      </Card>
    )
  }
}

CardExampleExpandable.childContextTypes = {
  muiTheme: PropTypes.object.isRequired
}

document.addEventListener('DOMContentLoaded', () => {
  ReactDOM.render(
    <CardExampleExpandable />,
    document.body.appendChild(document.createElement('div')),
  )
})

起動確認

$ bin/rails s -b $IP -p $PORT

コンパルでエラーが出る。

[Webpacker] Compiling…
[Webpacker] Compilation failed:
(省略)
ERROR in ./node_modules/react-tap-event-plugin/src/TapEventPlugin.js
Module not found: Error: Can't resolve 'react-dom/lib/EventConstants' in '/home/ubuntu/workspace/react_sample/node_modules/react-tap-event-plugin/src'
 @ ./node_modules/react-tap-event-plugin/src/TapEventPlugin.js 22:21-60
 @ ./node_modules/react-tap-event-plugin/src/injectTapEventPlugin.js
 @ ./app/javascript/packs/expandable_example.jsx

画面は表示された。と思ったら、古い画面。 f:id:sprink:20171114213043p:plain

呼び出すjsxの変更

app/javascript/packs/application.jsを変えないといけない。

//require('./hello_react.jsx')
require('./expandable_example.jsx')

コンパルエラーを解決

ググったら以下のissuesを発見
Not compatible with react 16 · Issue #109 · zilverline/react-tap-event-plugin · GitHub

react-tap-event-pluginを以下のバージョンに変更

"react-tap-event-plugin": "^3.0.0"

完成

f:id:sprink:20171116212232p:plain