20201019のMySQLに関する記事は5件です。

yps並走備忘録 Task6 既存コードからアプリケーションを作成する(To Do List)

いよいよ本格的にWebアプリケーションを作成します。
今回の開発ではWebアプリの定番CRUD操作も入ってきますし、Laravelのミドルウェアも使います。

また開発でも機能単位での開発になるのでこのタスクからは本格的にgit-flowを使うことが推奨されています。

参考:git-flow図解

git-flowはWeb開発の現場では当たり前に使われているそうなので、この機会に慣れておきたいですね!

注意事項

2020年/20/19日現在Laravel 8のリリースにより最新版のLaravelを導入した場合本記事やリンク先の参考記事の通りの実装だと動かなくなる可能性があるのでLaravelのプロジェクト作成時には以下のコマンドで7.25.0で作成することをおススメします。
cd /var/www/html //まずはアプリを公開するnginxの公開ディレクトリに移動
composer create-project --prefer-dist laravel/laravel myapp2 "7.25.0" //Laravelを7.25.0バージョンで構築します

まずは認証系を作っていきましょう

下記参考記事をなぞりながら認証機能を導入していきます

参考:Laravel 6.x laravel/uiを利用してbootstrap 4を適用する

cd myapp2
composer require laravel/ui "2.*" //フロント側のログインのテンプレートを一発で導入できるLaravel/uiを入れます
npm install 
php artisan ui bootstrap --auth
npm install cross-env
npm install
npm run dev

npm run devでエラーが出た場合は下記コマンドで対応
rm ./package-lock.json
rm -rf ./node_modules/
npm install

補足: npm run devは導入したjsやcss等のライブラリやフレームワークをビルドするコマンド、上記の場合で言うとimportしたbootstrap関連のscss,jsファイルなどをまとめていい感じにpublicに配置してくれます。
なお、ビルドには多少時間かかるので面倒な場合は一先ずbladeとかに書きなぐっておいて、後ほどSassやjsファイルに突っ込んでビルドするのもいいかもしれないです。

参考:
dotenvとcross-envで環境変数を設定して開発環境の処理を切り替える
npm run devに関して:Readouble

ここまでやったら一先ず新しく構築したアプリへ公開ディレクトリを移しておきましょう

sudo vi /etc/nginx/conf.d/default.conf

/var/www/html/yps/public;
      ↓
/var/www/html/myapp2/public;

※3か所くらいあります

WebサーバーとPHP-FPMを再起動
sudo systemctl restart nginx && sudo systemctl restart php-fpm
キャッシュクリア
php artisan cache:clear &&php artisan config:clear && php artisan route:clear &&php artisan view:clear
composer clear-cache && composer dump-autoload --optimize
※上記のコマンドは割と使うので.bashrc等でエイリアスに指定しておくのがおススメ

オーナーとディレクトリ権限変更
sudo chown -R centos:nginx /var/www/
sudo chmod -R 777 storage/ bootstrap/cache/
※このコマンドも新しいファイルやディレクトリ作ったり、ファイルを移動したりすると稀に使うのでエイリアス登録推奨

ここまでやると画面右上にLOGIN REGISTERという認証用のリンクが出ているはずです。



いざ!アプリ構築!
いよいよ、アプリを構築していきます。
とはいえ、いきなりだと何から手を付けていいか分からないと思うので、最初はハンズオンで…

php artisan make:model Task -m //-mオプションでマイグレーションファイルも同時に作成します

参考:Readouble:マイグレーション
(ザックリ言うとDBとやり取りするのを任せるファイル、このファイルを通じてLaravelではSQLのデータ型やカラムの構造などを含めたデータベース操作を行います)

アプリで使うデータベースを作成
mysql -u root -p
create database myapp2db;
exit

作成したDBをLaravelと連携させます
vi .env

//下記を編集
DB_DATABASE=myapp2db                                                                                
DB_USERNAME=root
DB_PASSWORD="パスワード"

設定が終わったら実際に接続します
php artisan migrate
//念のためテーブルがちゃんと作られているか確認
mysql -u root -p -D myapp2db
show tables;

※tasksテーブルが作成されています
+--------------------+
| Tables_in_myapp2db |
+--------------------+
| failed_jobs        |
| migrations         |
| password_resets    |
| tasks              |
| users              |
+--------------------+

あとは下記参考リンクのコードを模写しながらタスク管理アプリを実装します。
なお、本タスクのクリア要件は

  • ユーザー登録後に送信されたメールで認証したユーザーのみログイン可能
  • ログイン後にタスク一覧画面に変遷
  • タスク一覧及び個別画面はログインしていないと見られない
  • ログアウト機能の実装

だそうです。

参考:
サンプルソース(GitHub)
※サンプルソースに一部修正が必要な個所があります↓
クリア要件:画面の変遷

補足

gmailによる認証はセキュリティの関係でハマりやすいのと、別アカウントを取る手間もあるのでおススメは下記ブログで紹介されているmailtrapというWebサービス。メール関係の実装のテストなんかに気軽に使えて便利です。

参考:2020-09-05 yps学習記録その6

簡単にできてしまった方は追加機能開発をしてみるのがおススメです。(結構沼れます)
- タスクのソート機能
- 期限を過ぎたタスクの色変更
- メールでの期限通知
- 検索機能
- ユーザーにタスクを紐づけ
- その他モロモロ

参考:Laravel-Todoアプリに一週間機能追加チャレンジ

私は
- ソート機能(ライブラリ使用)
- 表示色変更
- ユーザーに紐づけ(自分の物しか見られない)
上記に加えて下記参考リンクのカレンダー機能をガッチャンコしてみました(これがかなりの沼だった…)

参考:Laravelの教科書:カレンダーアプリを作ろう

具体的には上記参考リンクの臨時休業の設定に当たる部分を流用して簡易的なシフトの入力(日勤、夜勤、休み)を入力できるようにしました。
もう少し発展させて管理者画面から操作できるようにしてあげればシフト管理アプリとしても使えそうですね…今後の課題として作り込みをゆっくりやっていきたいと思います。

Task6は結構カスタマイズのしがいもあると思うので、是非色々自分好みのカスタマイズを行ってみましょう!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MySqlの動作しているモードを調べるSQL

SELECT @@global.sql_mode;

MySql5.6から5.7に変更してONLY_FULL_GROUP_BYにぶつかったらまずMySqlのモードを確認しよう(自分への戒め)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【0からAWSに挑戦】EC2とVPCを使ってRailsアプリをAWSにデプロイする part3

EC2とVPCを使ってRailsアプリをAWSにデプロイする part3

↓↓↓↓関連記事はこちら↓↓↓↓
EC2とVPCを使ってRailsアプリをAWSにデプロイする part1
EC2とVPCを使ってRailsアプリをAWSにデプロイする part2
EC2とVPCを使ってRailsアプリをAWSにデプロイする part3
AmazonRDSとELBを導入する
ROUTE53を使ってドメイン設定 && ACMによるSSL化

環境

・Ruby on Rails 6.0
・Ruby 2.6.6
・dbはmysqlを使用
・アプリケーションサーバはpumaを使用
・webサーバーはnginxを使用

手順

前回は④までいきました。なので今回は⑤からやります
 ①VPCを作成
 ②VPC内にサブネットを作成
 ③インターネットゲートウェイ・セキュリティグループ・ルートテーブルの設定
 ④EC2を作成
 ⑤EC2にrails環境を構築、gitからアプリをpullする

⑤EC2にrails環境を構築、gitからアプリをpullする

ⅰ. Railsに必要なものをインストール

sshでEC2サーバーにターミナルでアクセスできたので、そこにRails環境を整えます。PCに環境構築した時と同様のことをするだけです。ただ正直プログラミングを初めてばっかりの頃は、参考書やカリキュラムの言うがままに環境構築していたため、あまりRailsの環境の構築方法を理解していません。なので今回はいい機会なので、EC2と少し関係ないですが改めてRailsの環境構築について深ぼって学んでいきたいと思います。

まずRailsを動かすために必要なものをインストールします。インストールするべきものは下記に分類できます。
※今回はgitから既存のアプリをpullして動かします。

種類 今回の例
設定関連   yum, git etc
ruby関連 rbenv, ruby 2.6.6
javascript関連 yarn, node.js
サーバー関連 nginx,(puma)
データベース関連 mysql

では上から順にみていきましょう。

設定関連

ここは主にlinux関連の機能やパッケージをインストールします。この設定関連はOSによって違うので注意してください(Macで環境構築したことある方はhomebrewを使って設定します)。ここは正直覚えるよりも、毎回ググって必要なものを都度インストールする形で問題ないと思います。
今回はlinuxなので、linux上に必要なパッケージをインストールします。下記がコマンドです。

ec2
$ sudo yum -y update &&sudo yum  -y install git \
    make gcc-c++ patch \
    libyaml-devel libffi-devel libicu-devel \
    zlib-devel readline-devel libxml2-devel libxslt-devel \ 
    ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl

少し長いですが説明します。

  • 「sudo」は一時的にルート権限で実行するという意味です
  • 「-y」はyesの意味です。インストールの際「yes or no」の質問と聞かれますが、それを自動でyesと答えます。
  • 「yum」はLinuxのパッケージ管理ツールです。ルビー勉強している方なら、linuxOS界のbundlerと思ってください。
  • 「git」はご存知の通りバージョン管理ツールです
  • 「yum」コマンドのあとupdate,installと続きます。updateによってyumのパッケージを最新版にしてから、インストールするという流れです。updateを先にしないと古いバージョンのパッケージがインストールされる可能性があります。
  • 「make gcc-c++ patch」ここはコンパイラの設定です。コンパイラとはプログラミング言語を機械の言語に翻訳することです。ここでは「gcc-c++」というコンパイラパッケージについて、「patch」コマンドで基から備わっているコンパイラパッケージとの差分をとり、新しいファイルを生成するという意味です。
  • 「libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel」 は共通点が多いです。「lib-」は基本的にライブラリを差します。「devel」は開発するためのファイルの意味です。例えば「libyaml-devel」では開発に必要なyamlファイルに関するライブラリのインストール、 「libffi-devel」は外部関数インターフェースという開発に必要なライブラリをインストールします。他の説明は割愛しますが、基本的にOS付近・すなわち機械に近いところで働く必要機能をインストールしています。
  • 「ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl」も基本的には開発に必要なライブラリをインストールしています。「ImageMagic」関連は画像形式に関するライブラリ、「openssl」はc言語で書かれた基本的な暗号等に関するライブラリ、curlはデータ転送に関するライブラリです。

もしかしたら覚える必要も、深く理解する必要もないものかもしれませんが、1つ1つ見ていくと面白いですね。裏ではC言語が活躍してることが多いのも1つ発見です。

ruby関連

rbenvとruby(任意のバージョン)をインストールします。rbenvはrubyのバージョンを簡単に切り替えたり、管理できたりするツールです。早速インストールしましょう。下記コマンドを上から順にインストールします。

ec2
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv rehash 
$ rbenv install -v 2.6.6
$ rbenv global 2.6.6
$ rbenv rehash

こちらも少し長いですが説明します。

  • 1行目の「git clone ~」でrbenvをインストールします
  • 2行目は、パスを通しています。パスを通すとは、簡単に言うといつどこからでもコマンドが実行できるようにメモしておくことです。「echo」コマンドは環境変数を出力,「export」は環境変数の設定、「PATH=HOME/.rbenv/bin:$PATH」は新たに,「.rbenv」を加えたパスを定義しています。つまり2行目は「bash_profileというシェルに、新たにrbenvを定義したパスを設定するという意味です」
  • 3行目もパスに関する記述です。「eval」は文字列を実行するコマンドです、「rbenv init」はshimsとautocompletionの有効化です。もっと砕けていうとバージョンの切り替えや管理のために必要なコマンドです。つまり3行目は「rbenv init(バージョンの管理・切り替え)のために必要なファイルを有効化し、パスに反映させる」といった意味です。
  • 4行目の「source .bash_profile」で2~3行目の変更を反映させます。
  • 5行目は「ruby-build」をインストールしています。「ruby-build」とは異なるrubyのバージョンをインストールするためのプラグインです。これをインストールすることで「rbenv install」コマンドが実行できます。
  • 6行目の「rbenv rehash」をすることによって、「/.rbenv/shims/」以下で各ファイルが実行できるようになります。 さきほど「shims」は先程でましたね。とバージョンの切り替えを管理してくれるファイルです。つまり「rbenv rehash」によって、いままで設定したファイルのバージョンの簡単に管理できるように設定しています。
  • 7行目はrubyの2.6.6をrbenvを使ってインストールしています。
  • 8行目はシステム全体に「rubyのこのバージョンを使うよ」というのを伝えています
  • 最後は「rbenv rehash」です。6行目と同じです。

以上でRubyのインストール関連は終わりです。もしアプリをこれから作る場合だとここから、「bundler」や「gem rails6.0」をインストールする必要があります。

javascript関連

ここはRails6.0になって大きく変わった場所ですので気をつけましょう。下記のコマンドを打ちます。

ec2
$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
$ sudo yum -y install nodejs
$ sudo yum -y install wget
$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
$ sudo yum -y install yarn
  • 1行目でnode.jsのデータをシェルに転送しています。「-sL」はオプションで、進捗状況を非表示にする・リダイレクトを有効化するという意味です。
  • 2行目で、1行目で送られたデータをインストールしています
  • 3行目は「yum」で「wget」をインストールしています。「wget」はURLからファイルを指定してダウンロードするコマンドです。※設定関連の際にまとめてダウンロードしたほうが良かったかもしれません
  • 4行目はwgetを使って指定URLのyarnを取得しています。
  • 5行目は4行目で取得したデータをインストールしています。

少しjavascript関連の知識を整理すると,nodejsはサーバーサイドで動くjavascriptで、yarnがnodejsのパッケージマネージャです。(※nodejsのパッケージマネージャにはnpmもあります)。また今回はgitから既存のアプリをpullするので実行していませんが、rails6.0ではwebpackerもインストールする必要があります。webpackerはモジュールパンドラーといって、javascriptや画像ファイルをまとめてくれるものです。

サーバー関連

今回はwebサーバーは「nginx」、アプリケーションサーバは「puma」を使います。「puma」はrails標準装備ですのでインストールは不要です。「puma」ではなく「unicorn」を使う場合は、別途インストールが必要です。では下記コマンドを入力します。

ec2
sudo yum install nginx
  • 1行だけです。こちらでnginxのインストールは完了です。

サーバー周りはインストールは簡単ですが、後ほどやる設定周りが大変なのです。

データベース関連

今回はmysqlを使用します。下記コマンドを入力してください。

ec2
$ sudo yum install http://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
$ sudo yum install mysql-community-server
$ sudo yum install mysql-devel
  • 1行目でmysqlのファイルをインストールしています。「mysql80」の箇所でバージョンを指定しています。
  • 2行目でmysqlのサーバに関する設定をインストールしています
  • 3行目はmysqlサーバを操作するための設定のインストールです

いずれか1つでもかけると、DB設定時にエラーが起こるので気をつけましょう。自分はDB関係のエラーで死ぬほど悩まされました。

以上ですべてのインストールが完了しました。

ⅱ. gitから既存アプリをpullする

githubとEC2を連携するために、EC2で鍵を発行し、それをgithubで登録する必要があります。なので下記コマンドを入力します

EC2
$ ssh-keygen -t rsa -b 4096
$ cat ~/.ssh/id_rsa.pub
  • 1行目で鍵を発行します。「-t rsa」はどんなキーペアを作成するか(今回はrsaを使います)、「-b 4049」は鍵の長さをビット数で表記しています。
  • 2行目で先程作成した鍵ファイルを表示しています。「cat」はファイルの中身を簡単にみれるコマンドです。

では作成した鍵をgithubに登録しましょう。以下のURLから、先程の鍵を登録します。名前をつけてコピペするだけです。
github-sshキー登録
以下のようにコマンドをうち、successfullyがでたら成功です。

EC2
$ ssh -T git@github.com
You've successfully authenticated, but GitHub does not provide shell access.

あとは「git clone」するだけです。ただホームディレクトリ上にrailsファイルを置くと少し不都合があるので、新しいディレクトリをつくります。場所は「/var/www/自分のアプリケーション名」にします。なので「www」上で「git clone」しましょう。
※ちなみにvarフォルダとはlinux上で元から用意されているフォルダです。一時的なログなどをいれるフォルダですが、tmpフォルダと異なりデータは残り続けます。

EC2
/var/www/
$ git clone http ・・・

以上でgitから既存のアプリをプルすることに成功しました。

ⅲ. ファイルの設定

やっと最後です。データベースやweb・アプリケーションサーバが動くようにファイルを編集しましょう。ここはインストール内容やバージョンによって異なり、エラーがでやすいので注意が必要です。

データベース関連の設定

まずmysqlの設定をします

EC2
$ sudo service mysqld restart
$ sudo cat /var/log/mysqld.log | grep password
$ mysql -u root -p
(mysql内)
mysql > ALTER USER root@localhost IDENTIFIED BY '{自分の設定したいパスワード}';
  • mysqlにはデフォルトでパスワードがかかっていることが多いので、デフォルトのpasswordを確認します
  • 先程のパスワードを使って、ルートユーザーでログインします(2行目入力語にパスワードを聞かれる)
  • デフォルトのパスワードを変更します

上記の設定だけでも基本よいのですが、場合によってはroot@localhostを作り直したり,mysqlの8.0バージョンを使っている方は認証方法の変更が必要です。前者のroot@localhostを作り直しに関しては、たまにですがこのあと本番環境でアクセス拒否される場合があります。その場合はroot@localhostを作り直すか、新しいユーザーを作るなどをして対応します。後者のmysqlの8.0バージョンの場合は、本番環境アクセス時に認証エラーがでるかと思いますので、rootユーザー(もしくは使用中のユーザー)の認証方式を変更してください。参考記事を書きに添付します。
【参考】mysqlユーザーrootとしてログインできません
【参考】MySQL8.0.17の認証プラグインを変更する

次にconfig/database.yamlを以下のように設定します

config/database.yml
production:
  <<: *default
  database: webapp_production
  username: root
  password:

本番環境なので「production」以下に書きましょう。以上でDBは終わりですが、DBはエラー起きやすいので気をつけてください。ログも確認しましょう。

サーバ関連の設定

nginxとpumaの設定です。こちら以前dockerで開発環境構築した際に結構触れたので今回は簡単に説明します(前回のdockerの記事)。
では始めます。新規にファイル作成する必要がある場合もあるので気をつけてください。まず下記のファイルを作成し、編集しましょう。大部分はフォーマットがネットに転がっています。ただIPアドレスやアプリ名は自分用に変える必要があります。

/etc/nginx/conf.d/{自分のアプリ名}.conf
# log directory
error_log  /var/www/rails/webapp/log/nginx.error.log;
access_log /var/www/rails/webapp/log/nginx.access.log;
# max body size
client_max_body_size 2G;
upstream app_server {
  # for UNIX domain socket setups
  server unix:/var/www/rails/webapp/tmp/sockets/puma.sock fail_timeout=0;
}
server {
  listen 80;
  server_name ElasticIP;
  # nginx so increasing this is generally safe...
  keepalive_timeout 5;
  # path for static files
  root /var/www/rails/webapp/public;
  # page cache loading
  try_files $uri/index.html $uri.html $uri @app;
  location @app {
    # HTTP headers
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }
  # Rails error pages
  error_page 500 502 503 504 /500.html;
  location = /500.html {
    root /var/www/rails/webapp/public;
  }
}

また編集後に権限の変更も必要です

EC2
(/var/libに移動)
$ sudo chmod -R 775 nginx
(上記完了後にnginxを稼働させます)
$ sudo service nginx start

ちなみにserviceコマンドはサイトによってsystemctlになっている場合がありますが、現状どちらかで動けば気にしなくよいです。
【参考】
Linuxのコマンド実行で使うserviceとsystemctlの違いとは何か?

続いてpumaの設定です。こちらもネットにあるテンプレで基本大丈夫です。ただ「 port ENV.fetch("PORT") { 3000 }」の記述がある場合は削除するように気をつけましょう。

config/puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
environment "RAILS_ENV"
plugin :tmp_restart

app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"

stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true

以上で設定完了です。下記コマンドを実行しましょう

EC2
$ sudo service mysqld start
$ rake db:create RAILS_ENV=production
$ rake db:migrate RAILS_ENV=production
$ rails assets:precompile RAILS_ENV=production 
$ RAILS_ENV=production rails s
  • 1行目でデーモン環境でmysqlを動かします
  • 2行目と3行目でデータベースを本番環境で作成・反映しています。
  • 4行目はファイルのプリコンパイルです。本番環境で画像,cssを正しく動かすのに必要です
  • 5行目でpumaを起動しています

これでElasticIPにアクセスすればアプリケーションがみれるはずです。もしこれで映らなければpuma.socketファイルを削除、各ファイルの権限を確認してみてください。だいたいこれで解決できるはずです。

まとめ

自分は細かいところまで気になって調べたくなっちゃう体質なので、徹底的に調べました。もちろんまだわからないことがたくさんありますが、今回でだいぶ力ついた気がします。記事の長さはクリストファー・ノーランばりの大作になってしまいましたが、、、、
またAmaxonRDSを使ったり、本番環境でDockerを運用してみたり、その他AWS機能も実装頑張ってみたいと思います。

参考

  • 「Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版 著 大澤文孝,玉川憲,片山暁雄,今井雄太」 
    →おすすめの本です。AWSだけでなくネットワーク知識についても触れているので、初学者にとっては神技術書です。

  • (下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで
    →こちらもわかりやすくてよかったです。AWSの内容は「Amazon Web Services 基礎からのネットワーク&サーバー構築」とほとんど同じです。なのでこちらだけでAWSやってみるのもありかと思います。ただネットワーク知識が浅い人やインフラ初心者は最初に「Amazon Web Services 基礎からのネットワーク&サーバー構築」にやってネットワーク知識補充しながらやらないと苦労すると思います

※本記事は上記2つを参考にさせていただきながら実装しています。
なので実装に関しては類似箇所も多いかと思いますが、WEBサーバーの種類・DBのバージョンなどの構成などはもちろん自分なりにアレンジしています。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

未経験からPHP+MySQLではじめてwebアプリの作成をしてみました。。

記事の概要

2020年3月からプログラミング学習を開始し、初めてwebアプリを作成したので、その記録となります。
用語の使い方やコーディングなど認識違いございましたら、ご指摘していただけると幸いです。

アプリ概要

学習の記録、記録した学習内容の閲覧やデータの集計を行える学習管理アプリ
スクリーンショット 2020-10-07 14.06.56.png
アプリurl : https://studydiaryportfolio.herokuapp.com/TopPage.php
Git hub : https://github.com/mu7kata/yuki_Portfolio

▼制作期間

・29日 85h

【内訳】
要件定義、WF作成:8h
コーディング:53h
デプロイ :23.5h 

▼制作環境

 【言語】
  HTML、CSS(レスポンジブ未対応)、PHP 7.3.9、JavaScript、jQuery2.2.2
 【DBMS】
  MySQL 5.7.26
 【フレームワーク】
  なし
 【開発環境】
  MacOS Catalina 10.15.5
 【バージョン管理】
  Git 2.24.3
 【本番環境】
  Heroku
↓Herokuでのデプロイまでの流れはこちらにまとめました。
https://qiita.com/kata_kata_1997/items/973fc1f31795ebf6fcfa

アプリを作成する目的

▼PHPを学習していく中で下記項目についての理解を深めるため

・関数の定義〜呼び出し
・GET送信とPOST送信
・セッション
・条件分岐(if文)と繰り返し処理(foreach文)などの基本構文
・SQL文
・DB接続(try~catchを用い、成功しているかどうか判断)
・DBデータの編集、画面への出力

なぜ学習管理アプリか

プログラミング学習をしていくなかで、学習状況の把握をすることで、モチベーションにつながると思ったから。
自分自身も実際に、学習した履歴をエクセルなどで管理していたが、より簡単に学習の管理ができないかと感じたから

主な機能

・ログイン機能
・学習内容の保存機能
・学習内容の表示機能
・学習内容の編集機能
・メモ機能

機能詳細

▼ログイン機能

・ユーザー情報の取得
→PDOクラスを用いてDBへ接続。
スクリーンショット 2020-10-14 0.49.10.png

▼学習内容の保存機能

・学習時間、カテゴリ、内容を保存することができる。カテゴリは編集が可能。
→入力に必要なSQL文のカラム名に、プレースホルダーを代入する形で学習内容の保存、取得する関数を作成。その後SQL文のプレースホルダーに値をバインドし、クエリを実行する。
スクリーンショット 2020-10-07 14.08.15.png

▼学習内容の表示機能

・学習内容の取得して表示。日付、カテゴリでの検索が可能。画面中央には指定した学習期間の合計学習時間を算出し表示している。
→クエリの実行結果を格納したオブジェクトを条件分岐(if文)や繰り返し処理(foreach文)などの基本構文をもちていてHTML上に表示。
スクリーンショット 2020-10-14 0.53.47.png

▼学習内容の編集機能

・学習内容の編集ボタンから、編集ページへ遷移。日付、時間、カテゴリ、内容を編集することができる。
→作成した学習内容取得関数内の引数に入力フォームに入力された出力条件を代入する形で出力、更新を実行。
スクリーンショット 2020-10-14 0.54.56.png

▼メモ機能
・その日の目標や、やることリストなどに使用することができる。
→セッションを使用し、入力の保持を実行
スクリーンショット 2020-10-14 0.55.50.png

工夫した点

■学習内容入力ページ内にその日保存した学習内容を表示。入力する際、内容が以前保存したものと同じだった場合にコピペして登録することができる。

■トップページに月毎の学習時間の合計を表示。詳細ボタンをクリックすると、自動でその月の学習内容を検索し詳細を表示できるように実装

■月単位での1日あたりの学習時間の平均を表示することで進捗度の可視化を実施。

スクリーンショット 2020-10-14 0.56.42.png

■カテゴリを自分で作成し、使用することができる。
↓カテゴリ編集画面
スクリーンショット 2020-10-14 0.57.50.png

■各ボタンにはテキストだけでなく、アイコンを使うことによってボタンを押した時に何が起こるのかを視覚的に伝え、より使いやすいデザインを意識。
↓各ボタンにアイコンを使用。
スクリーンショット 2020-10-14 0.58.15.png

苦労したこと

■Gitを使用したバージョン管理。
→初めてGitを使用しての開発となったが、リベースとマージの違いを理解できておらず、作成した内容がマージされるまでに苦戦した。(マージした思ったら書いたコードがまっさらになって焦りました。。)

■エラー対応
エラー内容をログで読み取り、エラー箇所の修正。分からなければグーグル検索、Qiita内で質問しての対処となりました。

【苦戦したエラー】
▼学習内容検索機能の実装
・検索フォームに入力した値はあっているはずなのにが一致せずデータを取得することができなかった。
→型が一致していなかったことが原因。検索対象の日付をint型に設定したところ改善

▼Herokuにデプロイ時のエラー処理
・ERROR 1044 (42000)
→ClearDB では既定以外に新しいデータベースを作ることはできないのに、作成する指示がエクスポートファイルに描かれていたことが原因。対象コードを削除して対応。

・404 not found(404エラー)
→ファイル名の大文字、小文字が混同してしまっていたことが原因。対象コードを修正して対応

課題

・レスポンシブ対応

・削除機能の追加

・計画的な設計
→簡単なワイヤフレーム、DB設計書を作成したものの、あまり活用せず、場当たり的な設計になり、時間がかかってしまった。ER図やクラス図などもしっかり作成して望みたい。

↓作成したワイヤフレーム

スクリーンショット 2020-10-12 22.42.09.png

↓テーブル設計

スクリーンショット 2020-10-12 22.41.23.png

・きれいなコード
コードのリファクタリングを行い、効率的なコードにしていきたい。

学んだこと

・Gitの使い方(add.~pushまで、ブランチをきっての作業)
・解決できないエラーに遭遇した場合の質問のコツ(エラーにまでの過程、試してみたことも付け加えるなど。)
・自分のアイデアが形になる楽しさ
・アウトプットの重要性。

最後に

学んだことを実践してみることで、あまり理解できていない部分に気付くことができ、理解が深まりました。この開発を経てアウトプット前提にインプットすることがやはり重要だと感じたので、これを意識して今後は学びを深めていこうと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】ユニットテストのファイルを生成した時 にDatabase [mysql] not configured. が出た時の対処法

エラー状況

Laravelのユニットテストを実行するためにターミナルからテストファイルを生成しようとした時にエラーが出てしまい、生成ができずに行き詰まる。

以下のコマンドでテストファイルの生成を実行しようとする。

$ php artisan make:test SampleTest

But!!

Database [mysql] not configured. と表示され、生成ができない状態。
ファイル名

原因

vender/laravel/framework/src/illminate/Database/DatabaseManager.php
の該当lineを覗いてみるが、問題なさそう。というかよくわからない。

ここでさっきCirclCIを設定した時にconfig/database.phpを変更した事を思い出したので
そのファイルを確認したみると、一番下にこの記述をしている。

database.php
    'connections' => [
        'circle_test' => [
            'driver' => 'mysql',
            'host' => '127.0.0.1',
            'port' => '3306',
            'database' => 'circle_test',
            'username' => 'ubuntu',
            'password' => '',
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
    ]

CircleCI用に設定したコードですが、また新しく'connections'作って記述してました、、、
一旦このコードを全て消して、再度ターミナルからテストファイルを生成したら
普通にうまくいきました!!

総括

今回は単純な記述ミスによるエラーでした。
ただ同じエラーが発生した場合はconfig/database.php内の記述を疑ってみてください。
ググっても答えが出てこなかったので、参考になればと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む