クマのブログ

つまづいたところ、学びを書いていきます

【Hello New Tools!!!】CSS Validator

初めに

業務に入り、いろんなツールに出会ったので、

・用途、出会ったきっかけ

・使ってみての感想

を自分用にアウトプット

CSS Validator

jigsaw.w3.org

きっかけ

・HTML / CSSの研修にて

css validator等を使ってCSSを検証して使うように」

と研修資料に書いてあり、

私「css validatorとは、、、なんぞや、、、」

となったため、ググる

用途

・どうも、ウェブ標準に従って「HTMLやCSSが正しくかけてますよ!」という証明をできるためのモノらしい

やってみた

  1. 試しにローカルにあったCSSファイルを検証

f:id:kuma_kuma0121:20210509084854p:plain

  1. エラーがなく表示

f:id:kuma_kuma0121:20210509084748p:plain

  1. 同時に「W3Sから認められました」的な証明用のロゴHTMLをもらう

一応エラー発生しない時のみ表示される「W3C」のロゴマークを検証したサイトに貼れるようにHTMLデータを入手できる。

所見

しかし、このHTMLロゴ、なんの証明になるんだろう…

主にコーダーとしての転職活動(特にWEB制作への転職)では

CSS Validatorで文法を検証しながら、可読性の高いコードを意識してコードを書きました!

と主張しつつロゴを使用する、とかであれば少しは他の転職活動者と差別化できるのかなあ

以上になります。

SQLSTATE[42S01]: Base table or view already exists: 1050 Table

前提

状況

  • Techpitで学習中、初めてLaradockを使ってDockerをインストール
  • Windowsなので、Docker Toolbox使用
  • Laravel上でMySQLのテーブルを作成する「マイグレーション」を実施する際に、少しつまづいたのでメモ

やりたかったこと

以下コードをLaravel上のdatabase/migrationsフォルダ直下に作ったファイルに記述

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAppTables extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        // テーブル①
        Schema::create('primary_categories', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // テーブル①
        Schema::dropIfExists('prmary_categories');
    }
}

そして、

1. MySQL上でテーブルが正しく作れるか確認すべく

php artisan migrate

を実行し、MySQL上に"primary_categories"という名前のテーブルを作る

2. 次に、作成したテーブルを

php artisan migrate:rollback

ロールバックし問題なく実行できるか確認

3. 1.2.の実行結果を確認したのち、1.を再度実行

困ったこと

2.のロールバック実行後、

root@**********:/var/www# php artisan migrate:rollback
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (0.06 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.01 seconds)
Rolling back: 2014_10_12_000000_create_users_table  // 作成したテーブルをロールバック
Rolled back:  2014_10_12_000000_create_users_table (0.01 seconds)  // 作成したテーブルをロールバック

と表示されたが、MySQLを確認すると

f:id:kuma_kuma0121:20210427222455p:plain

'primary_categories'テーブルが残っていた。(なぜだ。。。)

試しに1. を実行すると

php artisan migrate

を実行したところ、以下エラーが発生。

f:id:kuma_kuma0121:20210427220118p:plain

エラー文:SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'primary_categories' already exists

要約:既に'primary_categories'はあるよ!

「なぜかわからんけどロールバックができていないからか…」

とにかく、エラー対応。

やったこと

なぜロールバックできていないか考える

ロールバックするLaravel上のコードに問題があるか可能性が高いと推測しコードを確認

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        // テーブル①
        Schema::dropIfExists('prmary_categories');
    }

結果:〇

見つけました。"i"が抜けておりました。

正:primary_categories

誤:prmary_categories

  • 実はコレ、「やりたかったこと」の2.実行前に気づいて、修正したところでした。
  • 結論、タイポしていたせいで1.のマイグレでロールバック不可能なテーブルを作成してしまい、2.以降の実行の妨げになった、ということ。

対応策

MySQL上で"primary_categories"テーブルを削除

f:id:kuma_kuma0121:20210427223347p:plain

その後、再度マイグレーションロールバックを実行し、どちらも正常に処理できることを確認

備考

  • 原因はタイポですが、解決までのアプローチが非常に早くなったことを実感
  • 学習したてはエラーが発生した瞬間、エラー文を読むが理解できずGoogleにすべて頼っていたエラー対応。
  • 今回は「ロールバックができない」という事象から、Googleを頼る前に異常の箇所を推測し、解決することができたことは非常に大きい。

【Docker Toolbox】IPアドレスが確認できない!

前提

  • Windows 10 Home

  • Docker Toolbox使用

状況

  • Techpitで学習中、初めてLaradockを使ってDockerをインストール
  • Docker内でのLaravel環境構築の際に、Docker Quickstart Terminalを使っていたところ、少し困ったのでメモ
  • DockerToolboxを使ってLaravelのインストールまで完了

やりたかったこと

  • 以下MySQLのログイン画面を表示すべく、

http://[IPアドレス]

へアクセスしたかった

  • そのために
docker-machine ls

を実行し、以下のような画面を表示し、[IPアドレス]を把握したかった

困ったこと

上記の

$ docker-machine ls

実行後、以下画面のようにIPアドレスが表示されない

f:id:kuma_kuma0121:20210426213852p:plain

やったこと①

Dockerが起動していることを確認

dockerが正常に起動しているか確認すべく

$ docker ps

でDockerが正常に起動しているか確認

結果:×

以下の通り、MySQLやnginxが問題なく起動している。 f:id:kuma_kuma0121:20210426215237p:plain

やったこと②

出力結果の読み直し

再度出力された内容を読み直してみたところ、STATEが"Timeout"となっているのを確認

結果:〇

再度

docker-machine ls

を実行したところ、以下のようにIPアドレスを確認することに成功 f:id:kuma_kuma0121:20210426214934p:plain

結論:ただのタイムアウト。。。

無事、MySQLのログイン画面をブラウザに表示させることに成功

備考

  • 今回はエラー文が出てきたわけではないが、エラーのみではなく、こちらのアクションに対するPCからのリアクションはしっかり確認せねば…と反省。

Docker Quickstart Terminalにて「ファイルを開く」とは??

前提

  • Windows 10 Home

  • Docker Toolbox使用

状況

  • Techpitで学習中、初めてLaradockを使ってDockerをインストール
  • Docker内でのLaravel環境構築の際に、Docker Quickstart Terminalを使っていたところ、少し困ったのでメモ

困ったこと

教材の説明文「docker-compose.ymlを開いてください」という対応方法

やったこと①

WindowsLinuxの"vi"に対応するものはあるか調べた

  • 過去にLinuxコマンド"vi"を使って、ファイル内容を編集した経験を思い出した
  • Windowsコマンド一覧からターミナル上で「ファイル編集」のコマンドはあるか調べた

結果:×

  • コマンドはデフォルトで備えていない。但し、別のツールをインストールすれば使用可能
  • 別のツールをインストールして対応する選択肢もあったがここで私は

「他のツールをインストールしたことによって教材を進める上で障害が発生するのは避けたい」

「他にも解決の糸口があるはずだ」

と思い、一旦保留

やったこと②

ダメもとでLinuxコマンドを使ってみた

「Dockerなら使っている端末がWindowsでもLinuxコマンド使えるのでは?」

Linuxコマンド使えたら、viでファイル編集できるじゃん!」

「でも、端末Windowsだしできるわけないよな」

と思いつつ、現在のファイルやフォルダを確認できるLinuxコマンド"ls"を試しにたたいてみると、、、

f:id:kuma_kuma0121:20210425093553p:plain

カレントディレクトリにあるファイルとフォルダが見事表示(マジか)

結果:〇

ということで、

vim docker-compose.yml

をたたくとvim画面に移動し、ファイルの編集ができました。

備考

  • 尚、Linuxコマンド"ls"と似た役割を持つ、Windowsのコマンド"dir"も問題なく使えたので、 「Docker Quickstart Terminalではどっちも使えるんだなあ!!!」 と知った。
  • 但し、Windowsのコマンド"type"及び"more"は以下のように返ってきたので、全てが使えるわけではないらしい。

↓ textの場合

Owner@********** ******* ~/Documents/melpit-workspace/laradock (melpit)
$ type docker-compose.yml
bash: type: docker-compose.yml: not found

↓ moreの場合

Owner@********** ******* ~/Documents/melpit-workspace/laradock (melpit)
$ more docker-compose.yml   
bash: more: command not found

php artisan migrateで作成したカラム数が足りない

前提

  • Windows

  • Laravel : 6.0

  • MySQL : 5.7

  • 実務で使用予定のLaravelをTechpitで学習中につまずいた

  • 使用エディタ:cloud9

状況

MySQLのカラムを8個生成したかったので、

↓ database/migration/(timestamp)_create_reviews_table.php

・
・
・
    public function up()
    {
        Schema::create('reviews', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->bigInteger('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade');
            $table->string('title');
            $table->longText('body');
            $table->string('image')->nullable(); 
            $table->tinyInteger('status')->default(1)->comment('0=下書き, 1=アクティブ, 2=削除済み');
            $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));
            $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
        });
    }
・
・
・

をLaravelで記述し、

php artisan migrate

をターミナルで実行。

↓実行結果

(ユーザー名):~/environment/books $ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Migrating: 2021_04_13_124816_create_reviews_table
Migrated:  2021_04_13_124816_create_reviews_table (0.04 seconds)

とエラーが出ずに処理されたので、生成されたカラムを確認すべくMySQLへログイン。

(ユーザー名):~/environment/books $ mysql -uroot -p******
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

カラムを作ったデータベースを読み込み、データベースを確認した。

mysql> use books;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> SHOW FULL COLUMNS FROM reviews;

困ったこと

mysql> SHOW FULL COLUMNS FROM reviews;

の結果、予想した出力結果と実際の結果が異なった

↓予想した出力結果(狙い値)

f:id:kuma_kuma0121:20210414213613p:plain

+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
| Field      | Type                | Collation          | Null | Key | Default           | Extra                       | Privileges                      | Comment                                        |
+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
| id         | bigint(20) unsigned | NULL               | NO   | PRI | NULL              | auto_increment              | select,insert,update,references |                                                |
| user_id    | bigint(20) unsigned | NULL               | NO   | MUL | NULL              |                             | select,insert,update,references |                                                |
| title      | varchar(255)        | utf8mb4_unicode_ci | NO   |     | NULL              |                             | select,insert,update,references |                                                |
| body       | longtext            | utf8mb4_unicode_ci | NO   |     | NULL              |                             | select,insert,update,references |                                                |
| image      | varchar(255)        | utf8mb4_unicode_ci | YES  |     | NULL              |                             | select,insert,update,references |                                                |
| status     | tinyint(4)          | NULL               | NO   |     | 1                 |                             | select,insert,update,references | 0=下書き, 1=アクティブ, 2=削除済み             |
| updated_at | timestamp           | NULL               | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | select,insert,update,references |                                                |
| created_at | timestamp           | NULL               | NO   |     | CURRENT_TIMESTAMP |                             | select,insert,update,references |                                                |
+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
**8 rows** in set (0.00 sec)

8個のカラム

↓実際の出力結果

f:id:kuma_kuma0121:20210414213419p:plain

+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
| Field      | Type                | Collation          | Null | Key | Default           | Extra                       | Privileges                      | Comment                                        |
+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
| id         | bigint(20) unsigned | NULL               | NO   | PRI | NULL              | auto_increment              | select,insert,update,references |                                                |
| updated_at | timestamp           | NULL               | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | select,insert,update,references |                                                |
| created_at | timestamp           | NULL               | NO   |     | CURRENT_TIMESTAMP |                             | select,insert,update,references |                                                |
+------------+---------------------+--------------------+------+-----+-------------------+-----------------------------+---------------------------------+------------------------------------------------+
**3 rows** in set (0.00 sec)

3個のカラム

※補足 'id':Laravelインストール時の初期カラム 'update_at', 'created_at':追加したカラム

やったこと①

教材を進める上でヌケ・モレがあったか?

仮説

「手順を飛ばした」「タイポ」等により、自分の見落としによるものがあったか再度確認

対策

特にタイポはよくあるので(↓こんな感じで…)、教材のLaravelのコードをそのままコピペしたり(あまり好まないが)、何回も教材を見返した。

結果:×

特にヌケ・モレはなく、正しく記述していたので解決に至らず。

やったこと②

キャッシュ等が残っていたりしたか

仮説

キャッシュが残っていた、もしくはconfigが残っていた等が原因か、と推測

対策

php artisan cache:clear
php artisan config:clear

を実行し、更にサーバーを起動し、

php artisan serve --host=$IP --port=$PORT

すぐに切断した後

php artisan migrate

実行

結果:×

php artisan migrateの出力結果は

No migrations table
※確かこの英語…

となり、依然この状態↓

f:id:kuma_kuma0121:20210414213419p:plain

やったこと③

一度データベースをきれいにしてみよう

仮説

「中途半端な3個のカラムがあるからダメなのでは?」と推測

対策

MySQLにも反映されているデータベースを一度きれいにするために

php artisan migrate:rollback --step=1

を繰り返し行い、データベースを一旦リセット。

php artisan migrate:status

の結果が下記の通り、"Ran"の部分が全て"N"にしたら

+------+----------------------------------------+
| Ran? | Migration                              |
+------+----------------------------------------+
| N   | (timestamp)_create_***_*** |
| N    | (timestamp)_create_***        |
| N   | (timestamp)_***         |
| N    | (timestamp)_***        |
+------+----------------------------------------+

その状態で再度マイグレーション実行。

php artisan migrate

↓実行結果 f:id:kuma_kuma0121:20210414214654p:plain

いい感じに通ったかも?

結果:〇

MySQLへログインし、データベースを確認をすると…

f:id:kuma_kuma0121:20210414214827p:plain

狙い値通り、データベースのカラムが生成されている。

備考

・そもそもなぜカラムを生成するLaravelのコードは間違っていなかったのに、結果として3つしかカラムが生成されなかったのか がわかっていない ・なぜrollbackで解決したのか が不明点であるため、わかれば幸い。

あと、rollbackではなく、

php artisan fresh(refresh)

でもいけたのでは?と思ったり。

#1054 - 列 ' ' は 'where clause' にはありません。(Unknown column ‘ ’ in ‘where clause’)

前提

  • Windows

  • Laravel : 6.0

  • MySQL : 5.7

  • 実務で使用予定のLaravelをUdemyで学習中につまずく

状況

以下テーブルとカラムがある中で、SQLで'your_name'カラムに「加藤」という文字が入ったデータを取り出す処理をしたいため

SQL

SELECT * FROM `contact_forms` WHERE `your_name` LIKE `%加藤%`

を実行

↓テーブルとカラム f:id:kuma_kuma0121:20210411211157j:plain

狙い:'your_name'に「加藤」を含むデータのみ取得

困ったこと

上記SQLの結果、以下エラーが発生 f:id:kuma_kuma0121:20210411211333p:plain

#1054 - 列 '%加藤%' は 'where clause' にはありません。

やったこと①

まずはエラー文を理解する

対策

そもそも「列 '%加藤%' は」とあるが、'%加藤%' は値であり、列(カラム)ではない。

ということから、'%加藤%'が列である、というSQL文を書いてしまっていることに気づく

やったこと②

クオーテーションの使い方を注視

今回のエラーコード#1054が発生した際に気を付けるべきことは、以下によると「クオーテーションの使い方」が一つの原因であることが判明

MySQLでよく見かけるエラーの発生原因と対策方法 | サービス | プロエンジニア

実際、エラーを吐いたSQL文ではテーブルもカラムもデータ(値)も全て``(バッククオーテーション)で囲っていた。

そこで、MySQLでの' '(シングルクオーテーション)と `` (バッククオーテーション)の使い分けを以下記事で確認したところ、以下のように使い分けるらしい。

・バッククオートはテーブル名やフィールド名

・シングルクオートは値や文字列

MYSQL バッククオートについて - Qiita

対策

%加藤%(バッククオーテーション)を'%加藤%'(シングルクオーテーション)に変更

結果

無事「加藤」を含むデータのみが取得できた

補足

本エラーについてツイートしたところ、「MySQLでは``(バッククオーテーション)使う必要ない」との指摘があった。

確かにテーブルもカラムも全て' '(シングルクオーテーション)で囲っても問題なく処理が実行された。

f:id:kuma_kuma0121:20210411213733j:plain

備考

何気なく使っていた' '(シングルクオーテーション)と``(バッククオーテーション)の意味を理解することができた。

The POST method is not supported for this route. Supported methods: GET, HEAD.

前提

  • Windows

  • Laravel : 6.0

  • MySQL : 5.7

  • 実務で使用予定のLaravelをUdemyで学習中につまずいた

状況

RESTfulなリソースコントローラにより、CRUD機能を実装していた時。 具体的には"store"メソッドを実装しようとしていた

困ったこと

  • コントローラ、ルーティング、ビューのファイルを各々以下のように記述し、dd($your_name)で値が取得できているか確認

↓コントローラ

<?php
・
・
・
    public function store(StoreContactForm $request)
    {
        $contact = new ContactForm;

        $contact->your_name = $request->input('your_name');
        $contact->title = $request->input('title');
        $contact->email = $request->input('email');
        $contact->url = $request->input('url');
        $contact->gender = $request->input('gender');
        $contact->age = $request->input('age');
        $contact->contact = $request->input('contact');

        dd($your_name);
    }
・
・
・
?>

↓ルーティング

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::get('tests/test', 'TestController@index');

Route::group(['prefix'=> 'contact', 'middleware'=>'auth'], function(){
    Route::get('index', 'ContactFormController@index')->name('contact.index');
    Route::get('create', 'ContactFormController@create')->name('contact.create');
    Route::get('store', 'ContactFormController@store')->name('contact.store');  //上記createのルーティングをコピー・修正して作成

?>

↓ビュー

 <form method="POST" action="{{route('contact.store')}}">
  @csrf
  氏名
  <input type="text" name="your_name">
 <br>
   件名
  <input type="text" name="title">
 ・
 ・
  <input class="btn btn-info" type="submit" value="登録する">
  </form>
  • 表示結果は以下の通りのエラー f:id:kuma_kuma0121:20210409212522p:plain The POST method is not supported for this route. Supported methods: GET, HEAD.

なんのこっちゃわからず、調べる

やったこと

教材と比較してコードの記述に相違ないか?

仮説

教材の中で何か見落とした結果、このエラーが発生しているのではないか?

対策

以下Laravel日本語ドキュメントの表について言及している点を見返した。 f:id:kuma_kuma0121:20210409213439p:plain

readouble.com

これによるとstoreメソッドに対応する動詞はpostであることが分かったためここを修正

↓ルーティング(修正版)

<?php

Route::get('/', function () {
    return view('welcome');
});

Route::get('tests/test', 'TestController@index');

Route::group(['prefix'=> 'contact', 'middleware'=>'auth'], function(){
    Route::get('index', 'ContactFormController@index')->name('contact.index');
    Route::get('create', 'ContactFormController@create')->name('contact.create');
    Route::post('store', 'ContactFormController@store')->name('contact.store');  // getをpostに修正

?>

結果

無事dd($your_name)の結果が表示 

備考

学習教材からとはいえ、一次情報からエラー解決の糸口を引っ張ることができたのはよかった