tohokuaikiのチラシの裏

技術的ネタとか。

CORS(シーオーアールエス)を試してみるよ

Laravelでcorsってどうやんの?って聞かれたので「そもそもCORSってなんや?」って言えないので調べる。

CORSの基礎知識


www.youtube.com

zenn.dev

よし、わかった。じゃあ後は実践的に試してみる。

Laravelで試すための下準備

3年ぶりにLaravel触るのですっかり忘れてた。やり直し。

環境

t-ito@DESKTOP-BR8SCJA:~/lesson/laravel$ cat /etc/debian_version
12.5
t-ito@DESKTOP-BR8SCJA:~/lesson/laravel$ cat /etc/issue
Debian GNU/Linux 12 \n \l

t-ito@DESKTOP-BR8SCJA:~/lesson/laravel$ uname -a
Linux DESKTOP-BR8SCJA 5.15.146.1-microsoft-standard-WSL2 #1 SMP Thu Jan 11 04:09:03 UTC 2024 x86_64 GNU/Linux

composer使えるようにして、Laravelインストールしてプロジェクト作成

export EDITOR=emacs
export LANGUAGE=
export LC_ALL=ja_JP.UTF-8
export LANG=ja_JP.UTF-8

PATH=$PATH:$HOME/bin

インストールしてcomposerでcreate-project

localeを設定

apt-get install locales -y
sed -i -E 's/# (ja_JP.UTF-8)/\1/' /etc/locale.gen
locale-gen
apt install emacs php wget unzip php-json php-xml php-dom php-curl php-sqlite3
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
mv composer.phar ~/bin/composer
composer create-project --prefer-dist laravel/laravel SampleProject

で、

$ cd SampleProject
$./artisan serve

http://127.0.0.1:8000/ にアクセスする。

オリジンを変えたいのでポートを変えてもう一個Laravelサーバーを作る。

Laravel Porjectを作成

$ cd SampleProject2
$./artisan serve --port 8001

でポートを8081にしてserve

$ ./artisan serve --port=8081

composerコマンドを打つと Composer could not detect the root package (laravel/laravel) version, とか言われるので、composer.json

{
    "name": "laravel/laravel",
    "version" : "1.0.0",
}

とかversionを適当につけておく。

下準備終わり。

CORSのクライアント側

routes/web.php

<?php
Route::get('/client', function () {
    return view('client');
});

resources/views/client.blade.php

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Laravel</title>
</head>
<body>
CORSのテスト
<script>
$(()=>{
    $.ajax({
        url: 'http://127.0.0.1:8081/api/serve'
    });
});
</script>
</body>
</html>

CORSのサーバー側

$ ./artisan install:apiAPIのルート作る。

routes/api.php

Route::get('/serve', function (Request $request) {
    return [
        'foo' => 'bar'
    ];
});

JSON返すだけのルーティングを追加。

Requestヘッダ

GET /api/serve HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: ja,en-US;q=0.9,en;q=0.8
Cache-Control: no-cache
Connection: keep-alive
Host: 127.0.0.1:8081
Origin: http://127.0.0.1:8080
Pragma: no-cache
Referer: http://127.0.0.1:8080/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
sec-ch-ua: "Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"



Responseヘッダ

HTTP/1.1 200 OK
Host: 127.0.0.1:8081
Date: Fri, 19 Apr 2024 04:19:21 GMT
Connection: close
X-Powered-By: PHP/8.2.7
Cache-Control: no-cache, private
Date: Fri, 19 Apr 2024 04:19:21 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *

レスポンス側に

Access-Control-Allow-Origin: *

が含まれているので、ブラウザはオリジンが違っていてもアクセス情報を渡してくれる。

プリフライトリクエストを試す。

ちなみに、これだと単純リクエストになるので

<script>
$(()=>{
    $.ajax({
      url: 'http://127.0.0.1:8081/api/serve',
      headers: {
          'X-HTTP-Method-Override': 'PUT',
          'Content-Type': 'application/json'
        }
    });
});
</script>

とすると、プリフライトリクエストが飛ぶ。

Developerコンソールで見ると、プリフライトの方が後に作られているのに先にサーバーに送られているのがわかる。

CORSを設定する

config/cors.php を作って編集する。 何も指定しないデフォルト状態だと

Access-Control-Allow-Origin: *

がHTTPヘッダについているので、どのサイトからでもAjaxでデータが取り放題になっている。

config/cors.php

<?php
return [
    'allowed_origins' => [
        ],
    ];

とりあえず、これをするだけでHTTPヘッダから「Access-Control-Allow-Origin」自体が消えてクロスサイトでAjaxは取れなくなる。

改めて許可リストに入れたい場合は config/cors.php

<?php
return [
    'allowed_origins' => [
        'http://127.0.0.1:8080',
        ],
    ];

としておくと、プリフライトに

Access-Control-Allow-Origin:http://127.0.0.1:8080

が入るのでデータの取得ができる。 別のオリジンからも許可したい場合は配列に加えるとよい。その場合合致した1つのオリジンのみがAccess-Control-Allow-Originヘッダに記載される。ちなみに、ポートだけはワイルドカードが効くみたい。 config/cors.php

<?php
return [
    'allowed_origins' => [
        'http://127.0.0.1:*',
        ],
    ];

あとのオプションとかは、

qiita.com

Prototype.jsとGoogleマップAPIがバッティングしていよいよPrototype.jsも終焉

16年前に納品したお客様から連絡でGoogleマップが表示されませんと…

Chromeのコンソール開いたら

This site overrides Array.from() with an implementation that doesn't support iterables, which could cause Google Maps JavaScript API v3 to not work correctly. ってエラーが出てた。

何もしてない(笑)ので、なんだろう?と探ったら、多分GoogleマップAPIがバージョンアップしてる。

これ見て、バージョン指定してみた。現時点で3.54なので バージョニング  |  Maps JavaScript API  |  Google for Developers

<script type="text/javascript" charset="utf-8" src="https://maps.googleapis.com/maps/api/js?key=GMAP_API_KEY&sensor=false&v=3.53"></script>

って、Versionを3.53にして対応。

でも、過去1年分(4バージョン)しか保持しないってGoogleは言ってるから、このシステムも後1年だな…

16年よくもったよ…

Chromeの右クリックで「画像をGoogleで検索」がGoogle Lensに行ってしまうのが嫌なので直した件

Chromeで表示している画像の上で右クリックすると、こんなのが出てくる。

ChromeGoogle画像検索

でも、ある時からこれがGoogle画像検索サイトではなくGoogle Lensが右ペインに表示されて検索するようになった。

とても不便。

何故か直ってしまうので、また見つけるだろう…

「いらっ」とした時の伝え方

anond.hatelabo.jp

読んで、

ヘラヘラしながらすいませんと言った態度を見て普通に死ねと思った。(実際は軽くいいよ気にしないで〜と流した。でももっと大袈裟にそんな!!謝らなくていいのに!!むしろこっちが謝らせちゃってごめんね??!!とか言うべきだったんだなと今思う)

ってあったので、自分だったらどう伝えるかな?って思って。

基本的には、まず相手を持ち上げる。褒めると言い換えてもいい。そうしておいて、次の言葉が「入る」ように態勢を整える。

たとえば、イスが高くなってれば、「○○さん、さすが足長いね!さっき自分のイスに座ったら、私、足つかなくて!!」とか。 その後に、「あ、だけど、高くしっぱなしだと私が悲しくなっちゃうから、戻しておいてくれるとうれしいな」と主題を伝える。

褒めるの難しい

むつかしいよね。イスがちゃんと机にしまってれば「私、イス出しっぱなしじゃなかった?引いてくれてありがとう」でもいいし。

この次に主題となるイスの話をしたいので、イス周りの話で褒めるといい。なければないで、「机、きれいに使ってくれてありがとう」とか、「私、机で食べると食べこぼししちゃうんだよねー。食べるのきれいね」とかもう半ば無理矢理でも、認識違いとかでもかまわない。

とにかく、相手に「話をききやすい」と思わせる姿勢を取らせたいから、嫌な言葉を使わないようにする。そんだけ。でも、難しいよね。自分も20代の頃だと無理だったかもしれない。

Debianを10(buster)から11(bullseye)にしようとしてなんか言われた件

この辺りを読みつつ、「簡単だなぁ」とやってみたところ、ハマった点が1つ。 www.debian.org

/etc/apt/sources.list を書き換え

busterになっているのをbullseyeにする

deb http://ftp.jp.debian.org/debian buster main
deb-src http://ftp.jp.debian.org/debian buster main

deb http://security.debian.org/debian-security buster/updates main
deb-src http://security.debian.org/debian-security buster/updates main

deb http://ftp.jp.debian.org/debian bullseye main
deb-src http://ftp.jp.debian.org/debian bullseye main

deb http://security.debian.org/debian-security bullseye/updates main
deb-src http://security.debian.org/debian-security bullseye/updates main

って感じ。

で、エラー発生

このまま、# apt updateすると

E: リポジトリ http://security.debian.org/debian-security bullseye-updates Release には Release ファイルがありません。 って言われる。

んー、と思って色々調べたらbullseye-security とbullseye-updatesで分かれているみたい。

deb http://ftp.jp.debian.org/debian bullseye main contrib non-free
deb-src http://ftp.jp.debian.org/debian bullseye main contrib non-free

deb http://security.debian.org/debian-security bullseye-security main contrib non-free
deb-src http://security.debian.org/debian-security bullseye-security main contrib non-free

deb http://ftp.jp.debian.org/debian bullseye-updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian bullseye-updates main contrib non-free

ってやると上手くいった。その後、apt update → apt upgrade → apt full-upgrade → apt dist-upgrade と。

MySQLが入ってなかった。

MariaDBを入れておく。

apt install -y mariadb-server

PHPからつながらないので、なんだろう?と思ったらMySQLモジュールが入ってない…

# apt install php7.4-mysql

Apache再起動。