PHPerKaigi2021に参加しました!

メモな感じですが投稿します!(iwillblogって書いちゃったので…)
はじめてのニコニコ動画使用でした(会員登録はいつのまにかしてた)

景品が豪華すぎて当たった方うらやましいです😭

\スタッフ、スピーカーのみなさま、ありがとうございました🙇‍♂️/

勉強させてもらったセッション一覧

他にも見たかったものやもう一回見たいセッションがいっぱいあるので、アーカイブ待ってます!

 

各セッションのメモ

テスト放送

[初心者向け] 一からフレームワークを作るところを見せる

  • リアルタイムでコードを書いているところが見れて良かった。
  • ディレクトリトラバーサル攻撃に気をつけよう。
  • フレームワーク作りたくなった、作ろう。(iwillframework)

Symfonyラウンドテーブル(よろず相談会)

  • symfony/pantherすごそう。GithubActionで動いたことが謎らしいが、なんで謎なのかさえも私はわかっていない。。。

PHPで学ぶ、セッションの基本と応用

  • Cookieの仕様(RCF6265)ちゃんと読もう

PHP8になった今の時代に、PHPの「エラー」「例外」そして「Error」をおさらいしておこう

  • 例外は独自に定義しよう。(無駄なサードパーティの露呈を防ぐためにも)

@call_user_func(関数ではない)の使いこなしテクと(ルーレッ…

  • このbotを使った遊び方を理解した
  • twitterの検索例「from:call_user_func url:gitee」
  • リポジトリのnamespace抑える為だけにリポジトリ作る人もいるらしい、ドメインみたいな感じ(?)私もしようかな。

そのコード、フレームワークの外でも動きますか?

  • LaravelSymfonyへの移行を見れたのが良かった
  • やっぱり例外は独自に定義しよう。(2回目)
  • LaravelのModelはSymfonyのEntity
  • Symfonyのお作法で404エラーはBadRequestHttpException
  • Vanilla PHPを書こう!
  • Symfony、Laravel、CakePHPどんなPHPフレームワークからも使えるPHPが最高🍺

なるせ先生のPHP学~PHP8新機能スペシャル~ (ちょっとだけ)

  • 移動中スマホからちょっと見れたが動画クオリティが凄かった。
  • しばらくコード書いておらず、初耳学ばかりで勉強になった。
  • ちゃんと全部見たい!!!

今こそ理解するDI(Dependency Injection)

  • そういえばDIってデザインパターンだったことを再認識した。
  • DIは保守性の高いコードを書く事を目的とした方法論
  • DIとDIコンテナは別物、 DIコンテナはDIパターンをサポートするライブラリ
  • DIとerviceLocatorの違いは私自身イマイチ理解できてない。

DNSを制するものはインターネットを制す! DNSの世界

  • DNS苦手意識があるけど、ドメインハイジャックでCoinCheckの事件とか色々あるので逃げずにNSchecker使ってみたいと思いました。
  • 子供Youtubeを8時以降禁止にするための方法はわたしも親になったのでいつか使えそうと感じた。

 

おまけ

ノベルティめっちゃ良かったです、ホットアイマスク最高でした😏

エコバック今日の買い出しにも使いました。

カレーは緊急用にとっておっきます〜

「fn」というワードはPHP7.4から予約語に!(→アロー関数)

 

「fn」というワードはPHP7.4から予約語になったというのを知るに至った経緯として、$ symfony serveでローカルサーバを立てて

$ symfony serve
                                                                                                                        
 [OK] Web server listening                                                                                              
      The Web server is using PHP FPM 7.3.11                                                                            
      https://127.0.0.1:8000                                         


[Web Server ] Jan 18 18:48:55 |INFO   | PHP    listening path="/usr/sbin/php-fpm" php="7.3.11" port=61746                                              

 

ブラウザで表示確認をすると、以下の500エラーがでました😱

(phpenvでいろんなPHPバージョンを使ってます。)

HTTP 500 Internal Server Error
syntax error, unexpected 'fn' (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)
ParseError
in /Users/xxx/my-project/vendor/laminas/laminas-code/src/Generator/ClassGenerator.php (line 480)
470    /**
471     * @param string $implementedInterface
472     * @return bool
473     */
474    public function hasImplementedInterface($implementedInterface)
475    {
476        $interfaceType = TypeGenerator::fromTypeString($implementedInterface);
477
478        return (bool) array_filter(
479            array_map([TypeGenerator::class, 'fromTypeString'], $this->implementedInterfaces),
480            static fn (TypeGenerator $interface): bool => $interfaceType->equals($interface)
481        );
482    }

 

よーく確認してみると、
symfony php --versionphp --versionのバージョンが違う」
ことに気づきました💦

$ symfony php --version
PHP 7.3.11 (cli) (built: Jun  5 2020 23:50:40) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.11, Copyright (c) 1998-2018 Zend Technologies

$ php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

 

そこで、$ symfony serve でもPHP 7.4.9で動くように設定します。

参照:https://symfony.com/doc/current/setup/symfony_server.html#different-php-settings-per-project

$ cd my-project/

$ echo 7.4.9 > .php-version

$ symfony php --version # PHP 7.3.11 -> 7.4.9に変更完了
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans


$ symfony serve # PHP 7.4.9でサーバ立てることに成功

                                                                                                                        
 [OK] Web server listening                                                                                              
      The Web server is using PHP FPM 7.4.9                                                                             
      https://127.0.0.1:8000                                                                                     

[Web Server ] Jan 18 18:50:59 |INFO   | PHP    listening path="/Users/xxx/.phpenv/versions/7.4.9/sbin/php-fpm" php="7.4.9" port=62271

お! PHP7.4.9でサーバ立てるようになったみたいです!
と同時にsyntax error, unexpected 'fn' (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)のエラーもなくなりました🎉

めでたし、めでたし👏

 

syntax error, unexpected ‘fn’ (T_STRING), expecting :: (T_PAAMAYIM_NEKUDOTAYIM)の解明

参照:https://www.php.net/manual/ja/tokens.php

 

Google翻訳先生に訳してもらうと、

構文エラー、予期しない '楽しい'(t_string)、予期する::( t_pamaim_nikoodatim)

おそらく fn = 楽しい って訳してくれてます💦

ググっていくと、「fn」はPHP7.4から予約語になったらしいです!

というかアロー関数(無名関数)が使えるようになり、その予約語としてfnを使います。

(風の噂でアロー関数が使えるようになったというのは知っていたのですが書き方まで知らなかったです😅)

アロー関数は fn (argument_list) => expr という形で記述します。

よって、PHP 7.4まではアロー関数がなかったために以下の該当箇所を、「::」を使うスコープ定義演算子 (::)のことではないですか?と教えてくれたのかもしれません。

static fn (TypeGenerator $interface): bool => $interfaceType->equals($interface)

 

CIのComposerバージョンが2になる(composer self-updateさせてた)せいでテストがコケてた話



今回の目標

CIをphp7.4に対応したい
(Herokuでは既に7.4.7だったので)

 

.circleci/config.ymlのimageをcircleci/php:7.4-node-browsers
にしたところ、composer-plugin-apiに関するエラーが発生しました。

Composer2でcomposer installを実行したのに、composer.lockでcomposer-plugin-apiは1系って書いてあるから互換性ないやないかーみたいなこと言ってる、おそらく。Composer2はcomposer-plugin-api2系使えってこと?

($ composer install -n –prefer-dist以下)

$ php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

$ composer --version
Composer version 2.0.8 2020-12-03 17:20:38

$ composer install -n --prefer-dist
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

Problem 1
- ocramius/package-versions is locked to version 1.4.2 and an update of this package was not requested.
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 2
- symfony/flex is locked to version v1.5.3 and an update of this package was not requested.
- symfony/flex v1.5.3 requires composer-plugin-api ^1.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 3
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
- ocramius/proxy-manager 2.1.1 requires ocramius/package-versions ^1.1.1 -> satisfiable by ocramius/package-versions[1.4.2].
- ocramius/proxy-manager is locked to version 2.1.1 and an update of this package was not requested.

ocramius/package-versions only provides support for Composer 2 in 1.8+, which requires PHP 7.4.
If you can not upgrade PHP you can require composer/package-versions-deprecated to resolve this with PHP 7.0+.

You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2.

 

そもそもCircleCIを導入しようとしてましたが、すでにTravis導入済みだったのでCircleCI導入はやめました。すみません💦(ただエラー内容はだいたい一緒だったと思います。)

当時設定していた.travis.ymlのPHPバージョンが7.1~7.3だったので7.4にしようと思います。

ローカルではcomposer1.8系を使っていたのでエラーはみられませんでしたが、
.travis.yamlではbefore_install: composer self-updateにしてたのでcomposer2系でcomposer installを実行しようとしていました。

エラー内容:

xxx/yyy n.n.n requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.

composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"を追記で↑のエラーは回避できました!!!

参考:https://github.com/composer/composer/issues/8726

 

[おまけ]composer validate追記したらエラーでた

実際にでてたエラーログです。

$ composer validate
./composer.json is valid for simple usage with composer but has
strict errors that make it unable to be published as a package:
See https://getcomposer.org/doc/04-schema.md for details on the schema
name : The property name is required
description : The property description is required
symfony/debug-pack, symfony/maker-bundle, symfony/profiler-pack, symfony/test-pack are required both in require and require-dev, this can lead to unexpected behavior
require.symfony/debug-pack : unbound version constraints (*) should be avoided
require.symfony/orm-pack : unbound version constraints (*) should be avoided
require.symfony/profiler-pack : unbound version constraints (*) should be avoided
require.symfony/serializer-pack : unbound version constraints (*) should be avoided
require.symfony/test-pack : unbound version constraints (*) should be avoided
require.symfony/twig-pack : unbound version constraints (*) should be avoided

 

1) エラー内容:
xxx/yyy are required both in require and require-dev, this can lead to unexpected behavior

→ requireとrequire-devに同じpackageが書いてあるのがダメみたいなのでrequire-devから重複削除しました。

 

2) エラー内容:
name : The property name is required
description : The property description is required

→ composer.jsonにnameとdescriptionが必要とのことなので、追加しました。

 

3) エラー内容:
require.xxx/yyy: unbound version constraints (*) should be avoided

→ xxx/yyy: "*"はやめるべきとのことなのでバージョン指定をしました。

 

すべて(今回は3つ)のエラーを解消させ、

composer updateでcomposer.lockを更新して再度composer validateするvalidになりました〜🙌

$ composer validate
./composer.json is valid

 

メモ

  • 今回対応での差分

https://github.com/kin29/dj-kin29/pull/10/files

 

 

  • 後々考えてみたら、ローカル環境のcomposerバージョンを2にして、composer updateでcomposer.lockを更新してcommitで良かったのかも😅

composer-plugin-api:^2.0に対応してないpackageだったら、composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"追記が必要なのかも。

 



phpenvでPHP7.4系を導入した(configure optionをちょっと深ぼる)

 

実行環境は、macOS Catalina 10.15.7 です。

macOS Big Sur にアップデートしたらどうなるんだろうか….🤔迷ってます

 

(過去記事でphpenvでよく使うコマンドまとめてます。)

phpenvでいろんなPHPバージョンを操る

 

しばらくコードを書いておらず、PHPのバージョンが7.3.7だったので7.4系にバージョンあげますー😅

$ php --version
PHP 7.3.7 (cli) (built: Oct  6 2020 15:27:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans

$ phpenv versionsに7.4系が入ってなかったので、

$ phpenv update

からの

$ phpenv install 7.4.9

を実行したら、

-----------------------------------------
configure: error: Please reinstall the BZip2 distribution
-----------------------------------------

といわれたので、
bzip2をreinstallしてパスも通しましたが解決しませんでした。

ググって以下でinstallしてみました。

$ PHP_RPATHS="/usr/local/opt/bzip2/lib" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=/usr/local/opt/bzip2" phpenv install 7.4.9

そしたら、

-----------------------------------------
configure: error: Please specify the install prefix of iconv with --with-iconv=<DIR>
-----------------------------------------

って言われました。どんどん芋釣で問題出てくる、phpenvあるある。
念のため、iconvもreinstallとパスを通して、以下コマンドで再チャレンジ!

 

!!!解決コマンド!!!!

$ PHP_RPATHS="$(brew --prefix bzip2)" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"  phpenv install 7.4.9

PHP_RPATHSの指定はなくても良かったかもです🙇‍♂️

\ 🎉7.4系installできたー!🎉 /

[Success]: Built 7.4.9 successfully.
$ phpenv versions
  system
  5.6.1
  7.0.31
  7.1.3
  7.1.30
  7.2.20
  7.3.0
  7.3.7
* 7.4.9 (set by /Users/xxxx/xxxx/.ruby-version)

 

そもそもconfigure optionってなに?

解決できたコマンドは以下ですが、分解して各々の環境変数が何しているか見ていきます。

$ PHP_RPATHS="$(brew --prefix bzip2)" PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"  phpenv install 7.4.9

・PHP_RPATHS

PHP_RPATHS="$(brew --prefix bzip2)" 

そもそもRPATHってなに!?

https://stackoverrun.com/ja/q/2196869 より

-rpath=dir
Add a directory to the runtime library search path. ….

訳)実行中ライブラリの検索パスにディレクトリを追加します。

\ runtime path=rpathってこと?  runtimer? /

 

wikipediaさん(https://en.wikipedia.org/wiki/Rpath)にも同じようなことが書いてある👀

configure optionにも--disable-rpathというオプションがあって、以下のような記述がされていたので、なんか解釈あってそう。

–disable-rpath

実行時にライブラリの検索パスを追加できないようにします。

 

 

・PHP_BUILD_CONFIGURE_OPTS

PHP_BUILD_CONFIGURE_OPTS="--with-bz2=$(brew --prefix bzip2) --with-iconv=$(brew --prefix libiconv)"

そのままですが、ビルド時のconfigure optionを指定できるみたいです。

--with-bz2 …bzip2を有効にし、bzip2の場所を指定をします。

--with-iconv …iconvの場所を指定できます。

 

 

参考:

https://qiita.com/kunit/items/c30147f99a48ebb159d5

https://qiita.com/hnw/items/c227d58528c147de15dd

https://www.ritolab.com/entry/211#aj_5_5

 

まとめ

PHP書いてるけど、こういうmake系は全然わかりません😭まだまだです💦

rpath=replace pathなのかと思ってた。

 

Symfony installerを削除して、Symfony CLI(symfonyコマンド)を入れて使ってみる!

 

お久しぶりです☺️

Symfonyを使っているにもかかわらず、symfonyコマンド使ってないなー
と今更感じたので、この記事を書きます。

 

はじめに

私の場合、Symfony2,3で使っていたSymfony installerを削除する必要がありました。
symfonyというコマンド名でバッテングしてるので、Symfony4からdepricatedになったSymfony installerを削除→Symfony CLIをインストールという手順をしました。
(※ composerを使えば良い話なんですが、symfonyコマンド使ってみたかったので)

Symfony installerが入っている状態

$ symfony

Symfony Installer (1.5.11)
==========================

This is the official installer to start new projects based on the
Symfony full-stack framework.
...

 

ここで、symfony new でプロジェクトを作成しようとすると、
Symfony InstallerはSymfony4から互換性(compatible)なくなったよーって言われました。
また、Symfony4から代わりにcomposer create-project symfony/skeleton [my_project_name]を使ってねーって言ってます。

$ symfony new my_project
PHP Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in phar:///usr/local/bin/symfony/vendor/guzzlehttp/ringphp/src/Client/CurlFactory.php on line 363
PHP Stack trace:

...

[RuntimeException]
The Symfony Installer is not compatible with Symfony 4.x or newer versions.
Run this other command to install Symfony using Composer instead:
composer create-project symfony/skeleton my_project

一瞬、Symfony4からsymfonyコマンドなくなった?って思いましたが、Symfony4.4のBestPracticeでしっかり使っているので、少し混乱しました😅
参考:

 

SymfonyInstallerを削除して、SymfonyCLIをinstallする。

あまり良くない消し方な気がしますが、以下の方法でSymfonyInstallerを消しました。

$ ls -al ~/.symfony
total 0
drwxr-xr-x 3 watashi staff 96 4 4 20:51 .
drwxr-xr-x+ 118 watashi staff 3776 4 20 18:45 ..
drwxr-xr-x 3 watashi staff 96 4 21 09:23 bin
$ ls -al /usr/local/bin/symfony
-rwxr-xr-x 1 watashi staff 246243 7 4 2019 /usr/local/bin/symfony
$ rm -rf ~/.symfony
$ rm -rf /usr/local/bin/symfony
$ symfony -V
-bash: /usr/local/bin/symfony: No such file or directory

そして、SymfonyCLIをインストールします🚀

$ curl -sS https://get.symfony.com/cli/installer | bash
Symfony CLI installer

Environment check
[*] cURL is installed
[*] Gzip is installed
[*] Git is installed
[*] You architecture (amd64) is supported

Download
Finding the latest version (platform: "darwin_amd64")...
Downloading version 4.14.1 (https://github.com/symfony/cli/releases/download/v4.14.1/symfony_darwin_amd64.gz)...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 636 100 636 0 0 1311 0 --:--:-- --:--:-- --:--:-- 1311
100 7909k 100 7909k 0 0 878k 0 0:00:09 0:00:09 --:--:-- 1443k
Uncompress binary...
Making the binary executable...
Installing the binary into your home directory...
The binary was saved to: /Users/watashi/.symfony/bin/symfony

The Symfony CLI v4.14.1 was installed successfully!

Use it as a local file:
/Users/watashi/.symfony/bin/symfony

Or add the following line to your shell configuration file:
export PATH="$HOME/.symfony/bin:$PATH"

Or install it globally on your system:
mv /Users/watashi/.symfony/bin/symfony /usr/local/bin/symfony

Then start a new shell and run 'symfony'

$ mv /Users/watashi/.symfony/bin/symfony /usr/local/bin/symfony

うぉー!Symfony CLIが入りましたー!!! 🎉

$ symfony
Symfony CLI version v4.14.1 (c) 2017-2020 Symfony SAS
Symfony CLI helps developers manage projects, from local code to remote infrastructure

These are common commands used in various situations:

Work on a project locally

new Create a new Symfony project
serve Run a local web server
server:stop Stop the local web server
security:check Check security issues in project dependencies
composer Runs Composer without memory limit
console Runs the Symfony Console (bin/console) for current project
php, pecl, pear, php-fpm, php-cgi, php-config, phpdbg, phpize Runs the named binary using the configured PHP version

Manage a project on Cloud

login Log in with your SymfonyConnect account
init Initialize a new project using templates
link Link current git repository to a SymfonyCloud project
projects List active projects
envs List environments
env:create Create an environment
tunnel:open Open SSH tunnels to the app's services
ssh Open an SSH connection to the app container
deploy Deploy an environment
domains List domains
vars List variables
user:add Add a user to the project

Show all commands with symfony help,
Get help for a specific command with symfony help COMMAND.

 

Symfony CLIを使ってみる

プロジェクトを作成してみます。
今回は、webアプリケーションを作ってみます。
composer create-project symfony/website-skeleton [project_name]git initをしていることがわかります。

$ symfony new symfony_command_test_web_app --full
* Creating a new Symfony project with Composer
  (running /usr/local/bin/composer create-project symfony/website-skeleton /Users/watashi/symfony_command_test_web_app)

* Setting up the project under Git version control
  (running git init /Users/watashi/symfony_command_test_web_app)


 [OK] Your project is now ready in /Users/watashi/symfony_command_test_web_app


 

symfony server:startを使ってローカルサーバを立てて、ブラウザを確認してみると…いい感じにSymfony5.0.8のwelcomeページが表示されましたー!🍺

$ symfony server:start

 [WARNING] run "symfony server:ca:install" first if you want to run the web server with TLS support, or use
 "--no-tls" to avoid this warning


Apr 29 11:13:01 |DEBUG| PHP    Reloading PHP versions
Apr 29 11:13:01 |DEBUG| PHP    Using PHP version 7.3.11 (from default version in $PATH)
Apr 29 11:13:01 |INFO | PHP    listening path="/usr/sbin/php-fpm" php="7.3.11" port=55287
Apr 29 11:13:01 |DEBUG| PHP    started
Apr 29 11:13:01 |INFO | PHP    'user' directive is ignored when FPM is not running as root
Apr 29 11:13:01 |INFO | PHP    'group' directive is ignored when FPM is not running as root
Apr 29 11:13:01 |INFO | PHP    fpm is running, pid 3483
Apr 29 11:13:01 |INFO | PHP    ready to handle connections

 [OK] Web server listening
      The Web server is using PHP FPM 7.3.11

      http://127.0.0.1:8000

 

symfony server:ca:installをしたら、TLSで確認できるらしいので、入れてみる🔐
を「https://」になったー!ブラウザもちゃんとみれる👀

$  symfony server:start
Apr 29 11:29:01 |DEBUG| PHP    Reloading PHP versions
Apr 29 11:29:02 |DEBUG| PHP    Using PHP version 7.3.11 (from default version in $PATH)
Apr 29 11:29:02 |INFO | PHP    listening path="/usr/sbin/php-fpm" php="7.3.11" port=55368
Apr 29 11:29:02 |DEBUG| PHP    started
Apr 29 11:29:02 |INFO | PHP    'user' directive is ignored when FPM is not running as root
Apr 29 11:29:02 |INFO | PHP    'group' directive is ignored when FPM is not running as root
Apr 29 11:29:02 |INFO | PHP    fpm is running, pid 12395
Apr 29 11:29:02 |INFO | PHP    ready to handle connections

 [OK] Web server listening
      The Web server is using PHP FPM 7.3.11

      https://127.0.0.1:8000

 

さいごに

今までは、composerでプロジェクトを作って、php -S 127.0.0.1:8880 -t public/でブラウザ確認をしていたので、symfonyコマンドの方が短いので使って楽したほうがいいなーと思いました。

 

SpotifyAPIを使いプレイリストを簡単に作成してくれるツールDJ-Kin29リニューアルしました!

以前に作成した、アーティスト名を入力するだけでいい感じのSpotifyプレイリストを作成してくれるツールDJ-Kin29を改良しました!

是非、使ってみてください!!!
https://dj-kin29.herokuapp.com/

今回の改良にあたって、認可フローを見直しました。
前回の記事でまとめたので、よかったら参考にしてください。
SpotifyWebAPIの認可フローをまとめてみた

Githubも公開しまーす。
コントリビュート待ってます🍺
https://github.com/kin29/dj-kin29

Before

  • プレーンなPHP
  • Spotify認可のタイミングがフォームを入力後というおかしなタイミング
入力フォーム (index.php)
↓
↓ 作成 (旧:action先=create.php)
↓
(spotifyの認可画面)
redirect_uri: https://dj-kin29.herokuapp.com/create.php
→ 拒否されたら、 https://{redirect_uri}?error=access_denied
↓
↓ 許可されたら、
↓
プレイリスト作成成功
プレイリスト作成完了画面 (complete.php)
or
プレイリスト作成失敗
プレイリスト作成失敗画面 (failed.php)
↓
↓ more create / retry
↓
入力フォーム (index.php)に戻る

After

  • Symfony4を使用
  • Spotify認可のタイミングを、フォーム入力前にした。
1. / (クエリパラメータにcode=xxxを含まない)
- 「Authorization to Spotify」ボタンで、Spotifyとの連携(認可)をスタートする。(リンク先:/auth_spotify)
※ボタン押さずとも連携スタートさせたかったけど、spotify側の認可URLにリダイレクトさせてたらTwitterカードPreviewでエラーになったので、やめました😓

2. /auth_spotify
- Spotifyの認可がスタートする
  - 認可を許可したことがある場合:リダイレクトURL (/code=xxx)に遷移する。
  - 許可していない場合:Spotifyログイン画面 or 認可しますか画面に遷移する。
    - 認可の許可をした場合:/code=xxxにリダイレクトする。
    - 認可を拒否した場合:/error=xxx(エラーページ)にリダイレクトする。(→Re-Tryボタンで再チャレンジ可能)

3. /code=xxx
- フォーム画面。post先は、/create。

4. /create
- SpotifyWebAPIを使って、プレイリストを作成する。
  - 作成成功した場合;完了画面
  - 作成失敗した場合;失敗画面(→Re-Tryボタンで再チャレンジ可能)
- 「More create」ボタンでさらにプレイリスト作成可能(2に戻る)

さいごに

  • Tweetボタン設置しました^^
  • GAを充実させたくて、GTMと格闘しました。
  • 引き続きherokuを使っているので、初動に時間がかかります、、、🙇‍♂️
  • アーティスト名検索では、該当するアーティストの一番上だけを取得し、それに紐付く曲を取得するので、アーティスト名が被っていると期待したプレイリストができないことがあります、、、🙇‍♂️
    (日本のガールズバンドHumpBackのつもりで入力したところ、まだサブサクは解禁してないようで、違うバンドの曲が入っていました。)

 

SpotifyWebAPIの認可フローをまとめてみた

以前、
SpotifyAPIでクイックプレイリスト作成ツールを作ってみた

で簡単にSpotifyWebAPIの使い方を紹介しましたが、今回リニューアルに向けてSpotifyWebAPIの認可フローをまとめてみました!!!
(ちょい長めなので、飽きないように絵文字多めでうざいかもしれませんw)

公式ドキュメント:https://developer.spotify.com/documentation/general/guides/authorization-guide/
のほとんど和訳みたいな感じですが…😅

Spotify APIを使うフローは3つあります。

  • Authorization Code
    リフレッシュ可能なユーザ認可。エンドユーザ情報にアクセスするAPIエンドポイント(プレイリスト作成も可能)もアクセスできる。
  • Implicit Grant Flow
    一時的なユーザ認可。JavaScriptを使いエンドユーザブラウザで実行される。サーバ側のコードを使用しないアプリ向け、refresh_tokenの提供なし。
  • Client Credentials Flow
    リフレッシュ可能なアプリ認可。サーバ間認証で、エンドユーザ情報にアクセスにしないAPIエンドポイントのみにアクセスできる。

今回はPHPを使う想定で、
Authorization Codeについての詳細を紹介します!!!

Spotify Web APIでつかうURLは2つあります。

  • https://accounts.spotify.com
    Spotifyアカウント(ユーザ認可)へのAPI用👦
  • https://api.spotify.com/
    それ以外(アーティスト・プレイリスト・トラックなど)のSpotifyサービスへのAPI用🎧

ざっくりとした流れは、以下stepになります。

1.認可リクエスト🙇‍♂️

GET https://accounts.spotify.com/authorize

<クエリパラメータ>

クエリパラメータ
client_id SpotifyのDeveloperにあるやつ(必須)
response_type "code"をセットする。(必須)
redirect_uri SpotifyのDeveloperより設定したRedirect URIsと同じものにする(必須)
status ランダム文字列をセットをすると、リクエストとレスポンスが妥当かの確認できて、クロスサイトリクエストフォージェリなどの攻撃に対する保護ができる。[RFC-6749](推奨)
scope デフォルトはSpotifyデスクトップやweb、モバイルプレーヤで通常表示される情報のみアクセスを許可する設定になる。
詳細は、Authorization Scopes
show_dialog [default:false] falseの場合、一度承認すると自動でredirect_uriにリダイレクトする。trueの場合、既に承認していてもredirect_uriにリダイレクトされず、再度認証を

具体例

GET https://accounts.spotify.com/authorize?client_id=5fe01282e44241328a84e7c5cc169165&response_type=code&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback&scope=user-read-private%20user-read-email&state=34fFs29kd09

をすると、

  1. クエリパラメータ指定のscopeについて、エンドユーザに認可していいか尋ねる
    • エンドユーザがログインしていない場合:ログインを求める
    • エンドユーザがログイン済の場合:スコープについてのデータアクセスへの許可/拒否かを聞く
  2. エンドユーザはredirect_uriにリダイレクトされる
    • エンドユーザが認可を許可した場合🙆‍♂️:
      codeとstate(リクエストで指定してた時のみ)がクエリパラメータとして返ってくる。
    • code:access_tokenと交換できる認証コード
      例)https://example.com/callback?code=NApCCg..BkWtQ&state=profile%2Factivity

    • エンドユーザが認可を拒否した場合🙅‍♂️:
      errorとstate(リクエストで指定してた時のみ)
    • error:認可失敗の理由
      例)https://example.com/callback?error=access_denied&state=STATE

2.refresh_tokenとaccess_tokenをリクエストする🔑

認可コード(code=xxxx)を受け取った後、認可コードとaccess_tokenを交換するためにリクエストする

POST https://accounts.spotify.com/api/token

<リクエストボディパラメータ>
OAuth 2.0で定義されたapplication/x-www-form-urlencodedでエンコードされたパラメータを含ませる必要がある。

リクエストボディパラメータ
grant_type "authorization_code"をセットする(必須)
code 1で取得したcodeをセットする(必須)
redirect_uri 妥当性の検証に使用されるだけで、リダイレクトはしない。1でリクエストしたredirect_uriと一致する必要がある(必須)
client_idとclient_secret もしくはヘッダーパラメータにAuthorization: Basic <?php base64_encode(client_id:client_secret)>を含める(必須)

<レスポンスデータ>

レスポンスデータ
access_token 今後のSpotifyWebAPIサービスを利用するためのaccess_token
token_type "Bearer"
scope access_tokenに付与されたscope、スペース区切りのリスト文字列
expires_in access_tokenの有効な期間(秒単位)
refresh_token access_tokenが期限切れになった時、新しいaccess_tokenを得るために必要となるっぽい

3. access_tokenを使って、SpotifyWebAPIへアクセスする🎧

2で受け取ったaccess_tokenを使用(ヘッダーにセット)し、リファレンスに沿ってリクエストをするとで、ユーザに代わってSpotifyWebAPIにリクエスト/レスポンス(JSON)を受け取ることができる。

例)
curl -H "Authorization: Bearer {access_token}" https://api.spotify.com/v1/me

Web API Reference
https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-current-user-follows

4.access_tokenをリフレッシュする方法✨

access_tokenは、しばらくすると意図的に期限切れになります。
その後、認可コードとの交換で最初に取得したrefresh_tokenを使用して新しいaccess_tokenをもらう。

POST https://accounts.spotify.com/api/token

<リクエストボディパラメータ>
OAuth 2.0で定義されたapplication/x-www-form-urlencodedでエンコードされた、リクエストボディパラメータを含ませる。

  • grant_type:refresh_tokenをセットする(必須)
  • refresh_token:認可コード交換の時に返されたrefresh_tokenをセットする

<へッダーパラメータ>

  • Authorization:Authorization: Basic <?php base64_encode(client_id:client_secret)>(必須)

まとめ

改めて日本語でまとめてみると、ユーザ情報にもアクセスするのでセキュリティ面で考えることもできました。

  • statusをセットした方が、安全そう
  • client_secretなどの他人にバレてはやばそうな情報を使ったリクエストを送る時はOAuth 2.0で定義されたapplication/x-www-form-urlencodedでエンコードしてる
  •  
     
     

PHPerKaigi2020前夜祭だけ行ってきたよー!

お久しぶりです!PHPerKaigi2020前夜祭だけ行ってきましたー!
(1日目は月曜平日なので、チキってしまいました。)
名古屋-東京って新幹線ですぐなのに、片道一万もするのどうにかならないですかねえ😌

間違えてペチコンの流れで京急蒲田にむかっておりました。品川で気づかされました。

さて、入場してもらえたもの(勝手にピックアップ)

  • トートバッグ(ジーパン生地かわいい)
  • 名札
  • トレンディングカード(プロフィール登録ミスっててアイコンがない…)
  • GameWithさんのモバイルバッテリー(これはありがたいです🙇‍♂️)
  • デジタルサーカスさんの熱伝導式のアイススプーン(ほんとにカチカチのアイス食べやすかったです)
  • GMOさんのチョコ

参加したセッション

Deep module in PHP

前提:いいコード=複雑じゃないコード
=内容を理解するのが簡単で、変更するのが大変ではない とする

どうやって複雑で名はないコードを書くか?
→ Deep module

Deep module とは?
- モジュール設計の考え方
- 様々な角度から複雑さを減らす方法 例)技術的負債、抽象化、エラー

モジュールとは?
→インターフェイスと実装をもつあらゆるレベルにおけるコードの塊

インターフェイスとは?
→他のモジュールがそのモジュールを呼び出すために知る必要があるもの

理想のモジュール
→多くの機能を提供しながら、インターフェイスはシンプルなもの

Deep module ⇔ shallow  module

- moduleが深くなることを目指す
  - 抽象化することを意識する
    重要ではない実装の詳細を隠すことで、インターフェイスをシンプルにできるかつ多機能の両立ができる
  - 可能な限り、一般的なケースに最適化された設計を行う

deep moduleの具体例🙆‍♂️
- CakePHPのsaveメソッド …詳細を知らなくてもデータを保存できる
  - エンティティ渡すだけでよい →シンプルなインターファイス
  - インサートかアップデートかどちらかをよしなにしてくれる →多機能(cakePHPでは、save時にcreated/modifiedをするか自動で決めるのは一般的な機能)
  ↑ある種の決めつけで、インターフェイスをシンプルにしている
  - データベースの種類を意識する必要がない →抽象化

shallow moduleの具体例より🙅‍♂️
小さなモジュールだけど、インターフェイス(メソッド名)に実装詳細がダダ漏れしている。
エンティティ操作をするサブクラスだが、直接エンティティから操作したほうが早い。
→ インターフェイスのコストが、機能の利益を上回っている

しかし、小さい(モジュール)はいいことなのでは?
例) Sandy metzルール(クラス内コードは100行以内、メソッドは5行以下) ←Ruby

↓

小さいことはNot Shallow!
- モジュールが小さいと持っている情報量が少なく、多機能ではないから
→何でもかんでもメソッド化するのは良くない

- 1つのメソッド内に大量のコードが書かれると読みづらい
→ 実装が膨れたら、適宜メソッドに分割する


まとめ

Deep moduleとは、、、
インターフェイスがシンプルで、多機能なモジュール
このモジュールはDeepか?という問いにを立てながらコードを書くと良いコードになるかも

マルチパラダイムモデリング

- オブジェクトの歴史

  - 構造化プログラミング     
  - モジュラープログラミング
   ↓
  - データ抽象
    ↓ データ抽象を実現する手段の一つとして提唱されたのが、抽象データ型
  - 抽象データ型
   ↓ さらに、抽象データ型の具体的実装としてクラスに多くの機能を導入
  - クラス 🌟モジュール化の手法のひとつ!
  
  - ここまでのまとめ: クラスベースのオブジェクト指向におけるソフトウェア構築は、抽象データ型の構造化された集合としてシステムを構築すること

- マルチパラダイム・モデリング
  - 関数を他のデータ型同様に扱うことによって、モジュール間の依存関係を適切にできる可能性がある。(関数がファーストクラスオブジェクトである)🤔
  - 抽象データ型は、データ構造を隠蔽するため、データモデルの理解は必要不可欠🤔

- 計算モデル
  - チューリングマシーンとは?...チューリングさんが提唱した

>「計算可能性」に関する議論のために提示した抽象機械である。

調べたけど[宇宙一わかりやすい](https://www.yukisako.xyz/entry/turing-machine)でもわからなかった、、

  - (帰納的関数、よくわかってない...)

- 計算モデルとしてのデータモデル

  - データモデルを用いることで計算を行いやすくなるという意味で計算モデルとみなすことができる
  
    例)リレーショナルモデル → リレーショナル演算
  
  - ただし、チューリング完全であるとは限らない🤔
  
  - リレーショナルモデルとERモデル
  
    - リレーショナルモデル ...述語理論、なんらかの命題を満たす事実の集合を捉えるデータモデル。関係演算によるデータ操作が可能になる。
    
    - ERモデルはリレーショナルモデルではない?
      - リレーショナルモデル 計算携帯持つ
      - ERモデル それ自体は計算携帯をもたない。複数のデータモデルの包括的なビュー。

私のレベルではちょっと難しいお話でした...勉強します...

Inside SWOOLE:非同期処理はどのようにして動くのか

- swooleとは?
  - PHPで非同期処理を実現できる機能拡張
  - 2012年~
  - Transfonさんによって
  - 中国の開発者が猛烈

- 非同期処理
  - 並行/並列
  - コルーチン?

- C++でできている

- swooleまだまだ開発環境レベルでしか使用できてない、本番で使ってる例は少なそう。(会場内で使ってるのは、uzullaさんと郡山さんくらいだった)

BEAR.Sundayのマニュアルにもswooleが追加されていたので気になってました。

感想

  • トレンディングカードもっと交換したかった😭(切実)
  • フェスみたいに一日券が欲しい。
    例)前夜祭のみとか、1日目のみなど
  • 地方枠でちょい安なチケットが欲しい。(現在地証明が難しそうだけど)
  • もっと勉強しよ…

とはいっても、とても楽しかったです!実行委員のみなさんありがとうございました🙇‍♂️
来年も楽しみにしています!!!

Symfony4をHerokuにデプロイしてみる

 

Symfony Advent Calendar 2019の14日目です。(間に合わすつもりでしたが、過ぎてしまいました…)

 

ほとんど、Herokuのドキュメント通りですが、 Apache設定に関して忘れがちなので同じ経験をしている方の助けになればと思います!

Githubにコミットしてるので、参考にどうぞ!
kin29/symfony4-heroku

 

使うもの

– Symfony4.4
– Heroku (Apacheを想定)

 

確認事項

Symfony4.4はPHP7.1.3以上が必要です。

$ php -v  //ローカルのPHPのバージョンを確認
PHP 7.1.30 (cli) (built: Jul 4 2019 21:55:42) ( NTS )

 

※ 今のHerokuのデフォルトPHPバージョンは7.3.12でした!

-----> PHP app detected
-----> Bootstrapping...
-----> Installing platform packages...
       - php (7.3.12)
       - apache (2.4.41)
       - nginx (1.16.1)

 

手順

1.composer経由でプロジェクトの作成

$ composer create-project symfony/website-skeleton symfony4-heroku/

ビルドインサーバーを立ててローカルで確認してみる。

$ cd symfony4-heroku/
$ php -S 127.0.0.1:8888 -t public/

welcomeページ見れましたー!

 

2.Herokuにデプロイしてみる

Githubにpushして、masterをdeployしてみます。

なんかエラーになって、deployできない。

...
     Script cache:clear returned with error code 255
       !!  Symfony\Component\ErrorHandler\Error\ClassNotFoundError {#29
       !!    #message: """
       !!      Attempted to load class "WebProfilerBundle" from namespace "Symfony\Bundle\WebProfilerBundle".\n
       !!      Did you forget a "use" statement for another namespace?
       !!      """
       !!    #code: 0
       !!    #file: "./src/Kernel.php"
       !!    #line: 23
       !!    trace: {
       !!      ./src/Kernel.php:23 {
       !!        App\Kernel->registerBundles(): iterable
       !!        › if ($envs[$this->environment] ?? $envs['all'] ?? false) {
       !!        ›     yield new $class();
       !!        › }
       !!      }
       !!      ./vendor/symfony/http-kernel/Kernel.php:449 { …}
       !!      ./vendor/symfony/http-kernel/Kernel.php:133 { …}
       !!      ./vendor/symfony/framework-bundle/Console/Application.php:169 { …}
       !!      ./vendor/symfony/framework-bundle/Console/Application.php:75 { …}
       !!      ./vendor/symfony/console/Application.php:148 { …}
       !!      ./bin/console:42 { …}
       !!    }
       !!  }
       !!  2019-12-14T12:26:54+00:00 [critical] Uncaught Error: Class 'Symfony\Bundle\WebProfilerBundle\WebProfilerBundle' not found
       !!  
       Script @auto-scripts was called via post-install-cmd
 !     WARNING: There was a class not found error in your code
 !     ERROR: Dependency installation failed!
 !     
 !     The 'composer install' process failed with an error. The cause
 !     may be the download or installation of packages, or a pre- or
 !     post-install hook (e.g. a 'post-install-cmd' item in 'scripts')
 !     in your 'composer.json'.
 !     
 !     Typical error cases are out-of-date or missing parts of code,
 !     timeouts when making external connections, or memory limits.
 !     
 !     Check the above error output closely to determine the cause of
 !     the problem, ensure the code you're pushing is functioning
 !     properly, and that all local changes are committed correctly.
 !     
 !     For more information on builds for PHP on Heroku, refer to
 !     https://devcenter.heroku.com/articles/php-support
 !     
 !     REMINDER: the following warnings were emitted during the build;
 !     check the details above, as they may be related to this error:
 !     - There was a class not found error in your code
 !     Push rejected, failed to compile PHP app.
 !     Push failed

 

herokuのdeployではcomposer require-devのほうは、インストールしてくれないそうなので、symfony/profiler-packがないよーって言っています。

横着ですが、
require-devのパッケージを、requireの方にも入れます。

       !!  Symfony\Component\ErrorHandler\Error\ClassNotFoundError {#29
       !!    #message: """
       !!      Attempted to load class "WebProfilerBundle" from namespace "Symfony\Bundle\WebProfilerBundle".\n
       !!      Did you forget a "use" statement for another namespace?
       !!      """

 

こっちも、composer.jsonのscript部分の消しちゃって逃げます💦

-    "scripts": {
-        "auto-scripts": {
-            "cache:clear": "symfony-cmd",
-            "assets:install %PUBLIC_DIR%": "symfony-cmd"
-        },
-        "post-install-cmd": [
-            "@auto-scripts"
-        ],
-        "post-update-cmd": [
-            "@auto-scripts"
-        ]
-    },

で、どうにかHerokuにデプロイできるようになりました😎

 

3.env=prodにする

heroku config:set APP_ENV=prod --app [herokuのapp名]

4.Apacheの設定 ←ここ大事💡

以下コマンドでProcfileを作成します。

$ echo 'web: heroku-php-apache2 public/' > Procfile

さらに、composer require apache-packを実行し、質問にはyesで答えます。
そうすると、.htaccessが追加されます。

git pushしてherokuにdelpoyされたら、ブラウザで確認してみます。
env=prodでは、welcomeページはないので404になります。

 

5.コントローラー作成

下記コマンドで、コントローラを作成することができます。

$ php bin/console make:controller HogeController

 created: src/Controller/HogeController.php
 created: templates/hoge/index.html.twig

           
  Success! 
           

 Next: Open your new controller class and add some pages!

deploy後にheroku bashで、routerを一応確認してみます。良さそう😏

~ $  bin/console debug:router
 ------ -------- -------- ------ -------
  Name   Method   Scheme   Host   Path
 ------ -------- -------- ------ -------
  hoge   ANY      ANY      ANY    /hoge
 ------ -------- -------- ------ -------

6.ブラウザチェック

作成した/hogeにアクセスしてみると、、、見れたー!!!!!🎉

つまづきポイント

deployできたはずなのに、herokuでsymfonyコマンド使ってみると、 最初のエラーが再び….
Attempted to load class “WebProfilerBundle” from namespace “Symfony\Bundle\WebProfilerBundle”.\n
Did you forget a “use” statement for another namespace?
heroku run bashして、サーバに入ってrm -rf vendor/からのcomposer installでどうにかsymfonyコマンドは動作するようになりました。

 

参考

https://devcenter.heroku.com/articles/deploying-symfony4
https://github.com/heroku/heroku-buildpack-php/issues/278#

 



PHPカンファレンス2019に行ってきましたレポート

さっそくですが、先日PHPカンファレンス2019に参加してきたので、超簡単にダイジェストをお送りします。

今年のPHPカンファレンスは、どこの地方も参加できてなかったので、久々のカンファレンスで高まりました!!!

今年も、会場は大田区産業プラザ PiOでした。毎年同じ場所だと東京の土地勘がないわたしにはとてもありがたいです!

毎回思いますが、人多いですね!

セッション「PHPの今とこれから2019

PHP8.0

  • 2021.9くらいにでる予定らしい
  • JIT(Just-in-time)
  • multiple(union) typeの型指定をint|stringって書けるようになる

今までは、PHPDocのアノテーションでいい感じにしてた。

class Hoge
{
  /**
   * @param int|string
   */
  public function foo($value): void
  {
    var_dump($value);
  }
}

$hoge = new Hoge;
$hoge->foo(1);           //int(1)
$hoge->foo('one');  //string(3)

PHP8から、こうやってかけるようになるらしい

class Hoge
{
  public function foo(int|string $value): void
  {
    var_dump($value);
  }
}

PHP7.4

 

参考:https://www.amitmerchant.com/union-types-php/
参考:https://qiita.com/rana_kualu/items/ba312d2789bd228f887a
参考:https://kinsta.com/jp/blog/php-7-4/

セッション「コミュニティアップデート powered by GMOインターネット

PHPの地方コミュニティのいろいろを聞けました。

  • 勉強会やイベントでの自己紹介って結構大事らしい
  • 山陰ぺちぱーずという、地元に割と近いコミュニティがあるのを知った

 

セッション「思想と理想の果てに — クリーンアーキテクチャのWEBフレームワークを作ろう」

https://nrslib.com/phpcon-2019-proposal/

  • ヘキサゴナルアーキテクチャ(初耳)
  • スキャフォールディング機能(初耳)

 

セッション「PHPUnit: Past, Present and Future 」

PHPUnitの生みの親、セバスチャンさんの登壇でした!
全部英語です。こういう時に毎回英語頑張っておけばよかったと思います😂

心から言いたいことは「PHPUnitを作ってくれて、ありがとうございます🙏」

セッション「脆弱性から学ぶ Webセキュリティ Part2」

https://speakerdeck.com/hypermkt/study-web-security-from-vulnerability2

  • 脆弱性の怪しい匂いに気付こう
  • 根本的解決>保険的対策
  • ディレクトリトラバーサル対策
    • ファイルパスで判定してるやつとかは怪しい臭い
  • OSコマンドインジェクションの対策
    • シェル呼び出し機能関数を使わない
    • escape shell art
  • セッション管理の不備
    • 攻撃例
      • セッションハイジャック
      • セッションIDの固定化
    • 対策法
      • XXS対策
      • セッションIDを推測困難なものにする
      • セッションIDはクッキーのみで保持する
      • php.iniの確認(デフォルトで🙆‍♂️)
        • session.use_trans_sid = 0 [URLにセッションIDを保持しない]
        • session.use_only_cookies = 1
        • session.use_cookies = 1
      • 認証が成功したら新しいセッションを開始する

 

セッション「REST 6+4の制約」

https://speakerdeck.com/koriym/rest-6-plus-4falsezhi-yue

  • RESTにとって、URIは重要ではない
  • v1とか、バージョニングは含めたらrestではない
  • REST =Hypermedia API
  • クライアントはサーバーが何の言語かしらなくていい
  • キャッシュ スケールのため、🙅‍♀️パフォーマンス
  • RFC7234に対応:Kevinrob/guzzle-cache-middleware

質問の時に、おっしゃられてた「技術に対しての背景を理解しよう」というのが、印象的でした。

自分が使っている言語やフレームワークを作ってくれた人って、相当尊敬してるのに名前知らないなーって痛感したので、もっと歴史とか人物とか関係性とかってスルーしてたので、興味持とうって思いました。(偉人紹介ブログ描こうかな😎)

 

入手品

入手品一覧

  • elePHPant(買ってもらった😆)
  • 電子メモパット(アンケート答えてもらった)
  • メルカリノート、SIMケース、ステッカー(無条件のもらった)
  • スマホスタンド(ちょー便利)、チョコ
  • 粗品タオル
  •  食べログの人になれるやつ(ガチャはずれたけどくれた😆)

 


(新幹線で読むように買ったけど、疲れて10ページくらいしか読めんかった・・・。通勤の肥やしにしよう。)

郡山さんのセッションを聞く前に、この本で予習しておけばもっと理解できたなあって思いました😭

 

 

いろんな方のセッションが聞けたのと、お話もできたのでいい機会でしたー!

次はPHPerKaigi2020

これからももっと勉強して、いいコードかけるようになりたいという気持ちになりました^^

 

\スタッフの皆さん、ありがとうございました🙇‍♂️/