文字セットと照合順序

文字セットを指定するとデフォルトで照合順序も設定されている。

 

例えばutf8には、utf8_general_ciという照合順序とデフォルトでは設定される。

 

そもそも照合順序とは、データを照合する時の基準ルールみたいなものだ。

データの値を大文字小文字区別するかどうか

バイナリ比較するかどうか

など。

 

_ci 大文字小文字区別しない

_cs 大文字小文字区別する

_bin バイナリ比較する

 

という感じ。

デフォルトは_ciが多い印象。

大文字小文字区別、バイナリ比較をしない、ゆるい設定がデフォルトなことが多いようだ。

 

もし、その点が必要そうな場合は厳密に設定が必要かもしれない。

メモリ領域について 〜スタック領域とヒープ領域の違い〜

プログラミングの初期学習では、普段あまり意識することのないメモリ管理(スタック領域やヒープ領域)

知識としてなんとなくは知っているが、どのようにデータが管理されているのか?どのような違いがあるのか?などを意識してプログラミングできるほうが良いと思い、調べてみました。

 

メモリとは

メモリとは、PCが作業する時に使うデスク。

図書館のようにデスクがたくさんあるイメージ。

 

メモリ領域の確保について

プログラムがメモリを使う場合、必要な分だけ領域を確保する必要があります。

 

メモリの一部を一時的に自分専用に場所取りしておくことを、メモリ領域の確保といいます。

一方で、自分専用に一時的に確保したメモリ領域を誰でも使えるように戻しておくことを、メモリ領域の解放と言います。

 

下記を読めば図で分かりやすくイメージできます。花見の場所取りに例えてあり、イメージしやすいです。

https://wa3.i-3-i.info/word18932.html

 

メモリ領域の範囲

一般的にメモリ領域はプログラムごとに、OSによって確保されます。

 

プログラム管理用領域【OS管理】

静的変数領域【OS管理】

ヒープ・スタック領域【プログラムで使用可】

 

ヒープもスタックも英語では積み重ね・堆積という同義です。

 

下記で図で分かりやすく説明してくれてます。

https://proglife.net/heap-stack/

 

スタックとヒープの違い

スタック領域

スタック領域に積まれる変数は、OSにより自動的に確保・解放をしてくれます。

通常の変数を定義する時はこのスタック領域が確保されてます。

 

ただしスタック領域だと、使用したい想定領域を予め確保する必要があるため、メモリを柔軟に活用したい時には不便なことがあります。

そのような場合に、ヒープ領域が活用できます。

 

ヒープ領域

ヒープ領域は上の説明でもあったように、臨時的な役割のメモリ領域です。

アプリケーションごとに、必要な場合に使用されます。

確保するサイズは可変的で、ファイルの読み込みなど実行してみないとサイズが分からないような時にヒープが使用されます。

 

ヒープの使用は必要最低限に抑えるべき

基本的にメモリ確保のうえでは、予め使用する容量や順序が決まっているスタック領域を優先的に使用したほうがよいです。

ヒープ領域に頼りすぎると、メモリリーク(メモリの枯渇)が生じ、ソフトウェア内でクラッシュする危険性などがあります。

 

スタック領域のように予め確保される容量が決まっていない分柔軟に対応できますが、注意が必要です。

 

まとめ

基本はOSで自動的に確保・解放してくれるスタック領域の使用を優先すべき。

必要な場合に、プログラム内でメモリ領域の確保・解放の管理が必要なヒープ領域を活用する。

ただし、メモリリークが起きないように注意が必要。

php artisan migrateエラーになった時の解決メモ【Homestead/Laravel】

やろうとしたこと

HomesteadでLaravel開発環境を構築する際、MySQLに接続してマイグレーションする

 

問題

マイグレーションファイルを作成し、artisan migrateしたら以下のエラーになる

vagrant@homestead:~/code/myapp$ php artisan migrate

SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: NO) (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')

 

対応したこと

.envファイルをHomestead用に修正

【修正後】

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

【修正前】

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

 

成功しました

vagrant@homestead:~/code/myapp$ php artisan migrate

   INFO  Preparing database.  

  Creating migration table ............................................................................................................... 23ms DONE

   INFO  Running migrations.  

  2019_12_14_000001_create_personal_access_tokens_table .................................................................................. 85ms DONE
  2022_10_18_105932_create_posts_table ................................................................................................... 19ms DONE

 

前は最初からHomestead用の設定だったようですが、

2022年10月現在、自分の場合は違いました。