- 投稿日:2020-09-21T23:12:31+09:00
Rails 6 + MySQLの環境構築をDocker composeで作る
Dockerの公式サイトにはRailsアプリケーション用のDocker composeチュートリアルがあるが、少し情報が古くRails 6ではうまく動かなかったので、Rails 6で動かすための方法を載せておく。基本は公式チュートリアルの手順に従っているため、Rails 6用に変更したところを中心に補足を入れている。
DBはPostgresではなくMySQLを使う方法を載せておく。
プロジェクトディレクトリの準備
mkdir myrailsapp cd myrailsapp設定ファイルの準備
DockerfileFROM ruby:2.5 ## nodejsとyarnはwebpackをインストールする際に必要 # yarnパッケージ管理ツールをインストール RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y yarn RUN apt-get update -qq && apt-get install -y nodejs yarn RUN mkdir /myapp WORKDIR /myapp COPY Gemfile /myapp/Gemfile COPY Gemfile.lock /myapp/Gemfile.lock RUN bundle install COPY . /myapp # Add a script to be executed every time the container starts. COPY entrypoint.sh /usr/bin/ RUN chmod +x /usr/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] EXPOSE 3000 # Start the main process. CMD ["rails", "server", "-b", "0.0.0.0"]Rails 6ではWebpackerの実行のためにyarnが必要になるのでDockerfileにyarnのインストールの手順を加える。
ruby:2.5
のイメージで普通にapt-get yarn
でインストールすると0.32+git
という変なバージョンがインストールされてしまい後にエラーになるので、yarn公式サイトの指示にしたがってレポジトリを追加した後でapt-get install yarn
する。参考: https://qiita.com/shunichi_com/items/4dca141d8b9342c51a04
postgresは使用しないため除外。
Gemfilesource 'https://rubygems.org' gem 'rails', '~>6'GemfileでRails 6系を指定。このGemfileはRailsプロジェクト作成後にRailsプロジェクトの内容で上書きされることになる。
touch Gemfile.lock
entrypoint.sh#!/bin/bash set -e # Remove a potentially pre-existing server.pid for Rails. rm -f /myapp/tmp/pids/server.pid # Then exec the container's main process (what's set as CMD in the Dockerfile). exec "$@"この辺りは公式のサンプルのままなので説明省略。
docker-compose.ymlversion: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: root ports: - "3306:3306" volumes: - ./tmp/db:/var/lib/mysql web: build: . command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" volumes: - .:/myapp ports: - "3000:3000" depends_on: - dbMySQLを使う形に設定を変更。
Railsプロジェクトの作成
docker-compose run web rails new . --force --no-deps --database=mysql
--database=mysql
でDB設定をMySQLにした状態でプロジェクト作成。docker-compose buildDB接続設定
database.ymldevelopment: <<: *default database: myapp_development host: db username: root password: password # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: myapp_test host: db username: root password: password
development
とtest
がdocker-composeで起動したMySQLイメージdb
を使うように設定を記述。DB作成
docker-compose run web rails db:createWebpackerの導入
docker-compose run web rails webpacker:installRails 6からSprocketsに代わりWebpackerが使われるようになったためこのステップが必要に。
イメージの起動
docker-compose upScaffold
docker-compose run web rails g scaffold article title:string body:text published_at:timestamp docker-compose run web rails db:migratedocker-composeを使って開発をする場合は、scaffold含めgenerate系のコマンド、マイグレーションも
docker-compose run web
で実行する。docker-compose up
- 投稿日:2020-09-21T22:46:14+09:00
Linux上でPython3でMySQLへアクセスするためのyumコマンド
- 投稿日:2020-09-21T22:15:09+09:00
初学者チームがWebサービス開発を始めて4週間で出来たことと出来なかったこと
2週間前にアップした「初学者チームがWebサービス開発を始めて最初の2週間でやったことを振り返り、そして次を考える」という記事から、また2週間経ったので、どこまで進捗したのかまとめたいと思います。
「初心者だけど何かモノを作ってみたい!」という方の参考になれば幸いです。
目標達成度
2週間前掲げていた目標と、実際できたことを整理します。
こちらが2週間前の記事では言っていたこと。というわけで、次なる目標ですが、深い意味は特になく、なんとなくまた2週間先(9/21月曜)にチェックポイントを置きたいと思います。
目標は、9/21Monまでに人にURLをばら撒けるレベルのサイトにしたい!です。
具体的には、下記8点の要件を満たしたいです。その8点と結果がこちら。
2週間前掲げた目標 達成度 10点満点 コメント Heroku上でアプリが機能する 8 2週間前はHerokuにデプロイしたてでエラーもしばしば。今は表示は安定、基本動作も問題なし。 ページ内のリンクなど、ページがきちんと遷移する 5 まだ作れてないページがあったり、戻るボタン、キャンセルボタンなどが欠けています。 シンプルだが見るに耐えうるデザインであり全ページに統一感がある 3 フロントチームは頑張って作ってくれたのですが、サーバーサイドがそこまで手が回りませんでした。 投稿が新着順で表示でき、1ページの投稿は10件まで、それ以上は別ページとする 9 今ではペジネーションという専門用語も覚えました!でもデザイン配置のカスタマイズができてないので-1。 投稿がキーワード検索できる 0 全く手をつけてませんでした涙 アカウント登録した人がログイン、ログアウト、投稿、削除、編集できる 9 Laravelデフォルトのユーザ認証機能も利用しつつ、自分らのデザインを当て込むこともできてきました。 ゲストでも投稿できる 10 できました。 Contactページから問い合わせすると運営にメールが届く 5 今日滑り込みでメールを受信するまでの基礎機能の実装はできました。 総合得点 49/80 達成度61% 60点ならまずまずではないでしょうか!ただ、残念ながらまだ胸を張ってURLを配れるようなレベルはなりませんでした。
そして、ストレッチで掲げていた目標は綺麗に一切手を付けられませんでした(笑)↓
ストレッチ目標 達成度 10点満点 コメント アカウントがアイコン画像を設定できる 0 投稿に画像を1枚添付できる 0 ミュージシャンごとの投稿を集約したページが生成できる 0 ライブハウスごとの投稿を集約したページが生成できる 0 いいね!ができる 0 利用規約のページがある 0 管理人が不適切な投稿を削除できる 0 総合得点 0/70 達成度0% その他にこの2週間でできたこと箇条書き↓
- DBの再設計
- 全ページのHTML/CSS作成完了、ブラッシュアップ(コードの視認性、Font Awesome使用)
- ログイン認証
- HerokuのアドオンDB(ClearDB MySQL)を設定
- MySQLの文字コード設定で日本語の文字化け解消
- MySQLのタイムゾーン変更
- 投稿にタグを付ける初期機能実装
感想3つ
(そういうのいいよって方は飛ばしてください)
初心者なのにモノを作ってみた感想
人それぞれ勉強方法はあるのかもしれませんが、基礎から教科書をやっていくという勉強方法よりも、実際にモノを作るというこの方法が僕には一番合っていると感じています。めっちゃくちゃ夢中になっています。ただし!1ページめくれば、次の手順を教えてくれるテキスト学習と違って、1歩進むごとに、何をしたらいいのかわからない、どう調べればいいかもわからない、手をつけたらエラーになるの繰り返しです。
上手くいかない時は、焦るし、焦って変なコマンド打ってしまったり、イライラしたり、精神的に安定しないこともありました。一般人は「プログラミングは超絶簡単」「1ヶ月でできるようになる」という有名人の言葉を鵜呑みにしない方がいいです。でも何かちょっと対策を講じてエラー文章が変わり、それで推理が進んで、原因を突き止めて、前に進んだ時の喜びと快感は尋常じゃなかったりします。
仲間という存在の貴重さ
まこなり社長さんが「プログラミング学習には仲間を作った方がいい」と仰っているのを聞いたことがありますが、僕も同意です。あれは単なるテックキャンプへ誘導する文言ではないと思います(笑)僕の理由は「行き詰まった時、話せる相手がいるのは超助かるから」です。相談する相手も初学者なので、答えがもらえるとは限らないのですが、一緒に調べてくれたり、解決のヒントを与えてくれたりします。自分の思考がクリアになって、話してるうちに閃くということも経験しました。そして何より精神的に落ち着けます。こういうことで悩んでるんだよねーというと、「わかるーー!」と言ってもらえるだけでなんか落ち着けるんですよね。女子の気持ちが少しわかりました(笑)
ただし、初心者のチーム開発はハッキリ言って楽ではありません。でもその大変さを差し引いてもプラスになっていると思います。
あと先輩やメンターの存在も結構大きいです。それらが揃ってるYouTube万屋エンジニアチャンネル超おすすめっす!
開発初期にはプログラミング以外の時間が結構かかる
最初の3週間はアプリの企画、設計を考えたり、開発環境を整えたりで手一杯で、コードを書く状態に至りませんでした。(フロントチームはその間HTML/CSSでサイトの見た目を作ってくれていました)ようやく4週間めくらいからプログラムを書けるようになってきて、やっぱりコーディングの方が楽しいなと思いました。
今後の開発
次の目標
期限:10/5月曜18:00
下記10点の実装を目指します。
- 継承レイアウトで構築し、サイト全体にデザインの統一感がある
- 投稿の文章が長い場合、全文表示/一部表示の切り替えができる
- ドロップダウンメニュー
- 投稿の際、チップスの効いたタグ付けができる
- 投稿に付いたタグをクリックするとそのタグの投稿一覧を表示できる
- 登録ユーザーの投稿一覧が表示できる
- 検索機能
- いいね機能の実装
- Contactから運営側にメールが届き、問い合わせ内容がわかる
- ユーザーがプロフ画像を設定できる
開発体制の変更
今まではフロントには一旦別環境でHTML/CSS作りに集中してもらっていたのですが、開発が進んできてそれでは大変になってきそうなので、フロントチームもLaravelを入れてもらってバックエンドと同じ環境下でフロントのブラッシュアップをしてもらうつもりです。
- 投稿日:2020-09-21T17:56:49+09:00
MAMPでmysqlパスワード無しにする方法
mysqlにログインし、パスワードを変更します。
mysql -u root -p # mysqlにログイン SET PASSWORD = password('新しいパスワード'); # '新しいパスワード'を設定この状態では、phpMyAdminからログインできないため、config.inc.phpにそのための設定を追加します。
mdfind "config.inc.php" | grep "bin/phpMyAdmin/config.inc.php" | xargs code # config.inc.phpの場所を検索して開くconfig.inc.phpを'password'で検索すると次のような設定項目が見つかると思います。
パスワード無しを許可する行を追記してください。$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)? $cfg['Servers'][$i]['user'] = 'root'; // MySQL user $cfg['Servers'][$i]['password'] = ''; // MySQL password (only needed $cfg['Servers'][$i]['AllowNoPassword'] = true; // パスワード無しを許可これで設定は完了です。MAMP → OpenWebSitePage → Tools → phpMyAdminで、
データベースにアクセスできます。
- 投稿日:2020-09-21T13:48:10+09:00
Heroku(Laravel)で自作アプリをHerokuにデプロイしようとしたらマイグレーションエラーが起きたので、ClearDB(MySQL5.5)からJawsDB(MySQL8.0)に変更した時の備忘録
開発環境
PHP7.3
Laravel5.8
MySQL8.0
Heroku使用時のDBアドオン:ClearDB MySQL5.5やろうとしたこと
下記をheroku run php artisan migrate
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Query\Expression; use Illuminate\Support\Facades\Schema; class CreateChatRoomsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('chat_rooms', function (Blueprint $table) { $table->id(); $table->text('user_info_json')->default(new Expression('(JSON_ARRAY())')); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('chat_rooms'); } }エラーが出現。
エラーの内容
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(JSON_ARRAY()), `created_at` timestamp null, `updated_at` timestamp null) defaul' at line 1 (SQL: create table `chat_rooms` (`id` bigint unsigned not null auto_increment primary key, `user_info_json` text not null default ( JSON_ARRAY()), `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(JSON_ARRAY()), `created_at` timestamp null, `updated_at` timestamp null) defaul' at line 1推測
$table->text('user_info_json')->default(new Expression('(JSON_ARRAY())'));の部分がSQLのバージョンに対応していないらしい。
ローカル(MySQL8.0)ではエラーは起こらなかったため、本番環境のSQLをバージョンアップすれば通るかも?
ClearDBからJawsDBにアドオンを変更しよう
ClearDB・・・MySQL5.5、5.6、5.7対応
JawsDB・・・5.7及び8.0対応
とのことであったため、ローカル環境(MySQL8.0)と合わせるべくJawsDBにアドオンを変更することに。JawsDBアドオン取得
heroku addons:create jawsdb:[プラン名] -a [アプリ名] --version=8.0--version=8.0のようにすることで、バージョンを8.0指定でインストール。
ClearDBの環境変数を削除
JawsDBをインストールしただけの状態なので、まだClearDB使用時の環境変数が登録されている。
DB_DATABASE: [ClearDBのDATABASE] DB_HOST: [ClearDBのHOST] DB_PASSWORD: [ClearDBのPASSWORD] DB_USERNAME: [ClearDBのUSERNAME]これらを全て一旦削除
heroku config:unset DB_DATABASE heroku config:unset DB_HOST heroku config:unset DB_PASSWORD heroku config:unset DB_USERNAMEその後
heroku configすると、ClearDBの環境変数が消えている。
JawsDBの接続情報を確認
heroku config |grep JAWSDB_URL JAWSDB_URL: mysql://[DB_USERNAME]:[DB_PASSWORD]@[DB_HOST]/[DB_DATABASE]もしくはHerokuのマイページからJawsDBアドオンに遷移して確認。
JawsDBの環境変数登録
heroku config:set DB_DATABASE=[DB_DATABASE] heroku config:set DB_HOST=[DB_HOST] heroku config:set DB_PASSWORD=[DB_PASSWORD] heroku config:set DB_USERNAME=[DB_USERNAME]再度マイグレーション
heroku run php artisan migrate通った!
- 投稿日:2020-09-21T12:17:44+09:00
MYSQL ランダムデータ生成
- 投稿日:2020-09-21T09:39:15+09:00
SQL(MySQL)入門! INSERT, UPDATE, DELETE, TRUNCATE 編
環境
Windows 10
MySQL : version(5.7.28)
使用アプリ
コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)
INSERT
指定したカラムのデータを登録する
INSERT INTO TABLE1 -- テーブル名 ( COLUMN1 -- カラム1 , COLUMN2 -- カラム2 , COLUMN3 -- カラム3 ) VALUES ( VALUE1 -- カラム1に挿入する値 , VALUE2 -- カラム2に挿入する値 , VALUE3 -- カラム3に挿入する値 )カラム名を省略して書けるが、カラムの並び順通りにすべての値を力しないとエラーとなる
INSERT INTO TABLE1 -- テーブル名 VALUES( VALUE1 -- カラム1に挿入する値 , VALUE2 -- カラム2に挿入する値 , VALUE3 -- カラム3に挿入する値 )UPDATE
レコードを更新する(
,
で繋ぐことで複数入力も可能)UPDATE TABLE1 -- テーブル名 SET COLUMN2 = VALUE -- カラム2に新たに値を挿入 WHERE COLUMN1 = VALUE 更新したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定DELETE
レコードの削除
DELETE FROM TABLE1 -- テーブル名 WHERE COLUMN = VALUE -- 削除したいデータを特定するため、主キーやユニークキーなどが設定されたカラム名と値を指定TRUNCATE
テーブル内の全データ削除(強制的にデータが消えるので使用する際には注意が必要です)
TRUNCATE テーブル名一旦テーブルを削除して、またテーブルを作成
TRUNCATE TABLE テーブル名
終わりに
フューチャー株式会社が作成するSQLコーディング規約(Oracle)に則った形で書いています。
- 投稿日:2020-09-21T01:59:53+09:00
Access denied for user 'root'@'localhost' (using password: YES)のエラー
状況
Ruby on Rails 6.0.3.2
EC2へのデプロイ作業中のエラー
MySQLへのログインはできるので正しいパスワードは把握できている。DBの作成時にエラーが出る
本番環境で以下のコマンドでDB作成を試みる。
rails db:create RAILS_ENV=productionしかし以下のようなエラーが発生。
rails aborted! Mysql2::Error::ConnectionError: Access denied for user 'root'@'localhost' (using password: YES) /var/www/<アプリ名>/bin/rails:9:in `<top (required)>' /var/www/<アプリ名>/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => db:create (See full trace by running task with --trace)何が問題なのか
MySQLへ接続時のパスワードが間違っている。
Access denied for user 'root'@'localhost' (using password: YES)上記の文の意味はパスワードは入力されているがパスワードが間違っているという意味である。
解決方法
環境変数の設定が間違っている可能性がある。
特にenvironmentファイルに記入した環境変数とパスワードを囲むシングルクォートが全角だとエラーになる。(シングルクォートを含んだパスワードと見なされるため)
環境変数とパスワードを表示するコマンドを入力した時、パスワードと環境変数がシングルクォートで囲まれているかどうかで確認できる(半角だとシングルクォートが出ない)。まとめ
タイトルのようなエラー文が表示された時はパスワードが間違っているので要確認。