htmlタグのlang属性の値は”ja”と”jp”のどちらが正しいか

問題

Webページのソースを見ると、<html lang="ja">と書かれているページと<html lang="jp">と書かれているページがあります。”ja”と”jp”のどちらが正しいのでしょうか。

答え

<html lang="ja">が正しいです。

lang属性の値には、ISO 639-1言語コードを使用する必要があります。”ja”は、日本語を指すISO 639-1言語コードです。
これは、Webページや文書が使用している主要な言語を指定する際に用いられます。

一方で、”jp”はISO 3166-1国コードであり、日本を表しますが、これは国名を指すコードであり言語コードではありません。そのため、lang属性の値としては不適切です。

言語設定には、言語を正確に指定するためにISO 639-1言語コードを使用し、”ja”を用いるのが適切です。
これにより、ブラウザや検索エンジンはページの内容が日本語であることを理解し、適切な言語設定や検索結果の表示を行うことができます。

まとめ

WebページやHTML文書で言語を指定する際には、ISO 639-1言語コードを使用することが重要です。
日本語のコンテンツでは<html lang="ja">を使用し、”jp”は使用しないようにしましょう。

参考情報

M1 MacでDockerのMySQLが起動しない問題とその解決法

背景

Apple Silicon (M1) チップを搭載したMac環境下でDockerを使用してMySQLサービスを立ち上げようとすると、起動失敗の事象が報告されています。

詳細なログ分析 (docker compose logs) を行うと、以下のエラーが出力されていることが確認されます。

qemu: uncaught target signal 11 (Segmentation fault) - core dumped

このエラーは、QEMUエミュレータがApple Silicon上でのx86_64アーキテクチャのバイナリエミュレーション中にセグメンテーションフォールトを引き起こしていることを示しています。

これは、ARMアーキテクチャネイティブのプロセスがx86_64の命令セットを直接解釈しようとした際に発生する典型的な問題です。

解決策

この問題を解決するための手順は、Docker Desktopの設定を介してRosetta 2エミュレーションレイヤーを活用することです。

具体的には、以下のステップに従ってください:

  1. Docker Desktopアプリケーションを開き、設定にアクセスします。
    これは、アプリケーションウィンドウの右上隅にある歯車アイコンをクリックすることで行えます。
  2. 「General」タブに進み、Use Rosetta for x86/amd64 emulation on Apple Siliconオプションを探し、このオプションを有効化します。
    これにより、Dockerが内部的にRosetta 2を使用してx86_64アーキテクチャ用のバイナリをARMアーキテクチャ上で透過的にエミュレートすることが可能になります。
  3. 設定を適用後、Docker Desktopを再起動して変更を有効にします。

この手順により、M1チップ搭載Mac上でのMySQLの起動問題を回避し、Dockerコンテナ内でのサービスの安定稼働を確保できるようになります。

MySQLでViewが存在しないときだけ作成するには

問題

Viewが存在しないときだけ、Viewを作成するようなSQLを書きたいときがあります。

しかし、MySQLではCREATE VIEW IF NOT EXISTSの構文は直接サポートされていません。

解決策

CREATE VIEW IF NOT EXISTSの代わりにCREATE OR REPLACE VIEWを使用します。

この方法は、指定された名前のViewがすでに存在する場合はそれを置き換え、存在しない場合は新しく作成します。

CREATE OR REPLACE VIEW test.v AS SELECT * FROM t;

このステートメントは次のように動作します:

  • test.vという名前のViewがすでに存在する場合:
    • そのビューを削除し、新しい定義でViewを再作成します。
  • test.vという名前のViewが存在しない場合:
    • 新しいViewを作成します。

この方法の利点は、Viewが既に存在するかどうかに関わらず、常にViewが最新の定義になることを保証できる点です。

ただし、大規模なデータセットや複雑なクエリを含むビューでは、パフォーマンスに影響を与える可能性があります。
アプリケーション側でビューの存在確認を行い、必要に応じてCREATE VIEWやALTER VIEWを実行するという方法もあります。

ユニットテストでGuzzleを使うときにモックを使う方法

Guzzleは、外部のAPIとの通信によく使われます。しかし、ユニットテストの際には外部のAPIと実際に通信を行いたくない場合が多いです。

このような状況でモックを利用して、Guzzleを使ったコードのテストを行う方法を紹介します。

モックを使ったテストコードの例

以下のPHPコードは、Guzzleを使用してHTTPリクエストをモックする方法を示しています。

use GuzzleHttp\Client;
use GuzzleHttp\Handler\MockHandler;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Psr7\Response;

// 期待されるJSONレスポンスボディを定義
$json = [
    'data' => [
        'id' => 1,
        'name' => 'test',
    ]
];
// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);
// モックを含むハンドラースタックを作成し、クライアントに渡す
$client = new Client(['handler' => HandlerStack::create($mock)]);

// モックを使ってHTTPリクエストを行う
$response = $client->get('http://example.com');

// ステータスコードを検証
$this->assertEquals(200, $response->getStatusCode());
// レスポンスボディが期待するJSONデータであることを検証
$body = json_decode((string) $response->getBody(), true);
$this->assertEquals($json, $body);

解説

GuzzleHttp\Clientのカスタマイズ

GuzzleHttp\Clientのコンストラクタにoptions引数を渡すことで、カスタムハンドラーを設定できます。

この例では、モック用のハンドラーを設定しています。

// モックを含むハンドラースタックを作成し、クライアントに渡す
$client = new Client(['handler' => HandlerStack::create($mock)]);

モックの作成

GuzzleHttp\Handler\MockHandlerを使ってHTTPレスポンスをモックします。

このクラスのインスタンスを作成し、コンストラクタにGuzzleHttp\Psr7\Responseオブジェクトの配列を渡します。

// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);

レスポンスの構築

GuzzleHttp\Psr7\Responseクラスのインスタンスは、HTTPレスポンスを模倣します。

コンストラクタには、ステータスコード、ヘッダー、ボディを順番に渡します。

// 期待されるJSONレスポンスボディを定義
$json = [
    'data' => [
        'id' => 1,
        'name' => 'test',
    ]
];
// モックレスポンスを作成
$mock = new MockHandler([new Response(200, [], json_encode($json))]);

これで、Guzzleを使用したユニットテストでモックを利用する方法の解説は終わりです。

モックを活用することで、実際に外部のAPIと通信することなく、コードのテストを行うことができます。