こちらでは初心者向けのPHPプログラマを対象にPHPのコーディング規約(PSR)と自動整形についてお話したいと思います。
自動整形ツール
php-cs-fixerとphp_codesnifferの挙動を一緒に見ていきたいと思います。
■アジェンダ
・そもそもコーディング規約はなぜ必要なのか
・PHPにおけるコーディング規約
・自動整形
・php-cs-fixerとphp_codesnifferの違いについて
少しでも皆さんの手助けになればと思います。
※サンプルはLaravelを使用したものになります
Discord Channel: #track1-sp-gmo
シングルページアプリケーション(SPA)において、セッションIDやトークンの格納場所はCookieあるいはlocalStorageのいずれが良いのかなど、セキュリティ上の課題がネット上で議論されていますが、残念ながら間違った前提に基づくものが多いようです。このトークでは、SPAのセキュリティを構成する基礎技術を説明した後、著名なフレームワークな状況とエンジニアの技術理解の現状を踏まえ、SPAセキュリティの現実的な方法について説明します。
Discord Channel: #track1-8-spa-security
近年、PHP コミュニティでも DDD が大きく脚光を浴びるようになりました。その考え方に触れることで設計手法や実装パターンに興味を持つようになった人も多いでしょう。
DDD に限らず、多くの書籍では様々なパターンが紹介されています。
こうしたパターンは有用なのですが、特に設計パターンにおいては性質上、抽象的な内容となり、それ自体は理解できても自分が日頃おこなっているアプリケーション開発ではどのように適用すれば良いかがイメージできないことがあります。
本セッションでは、あるドメインを題材にして、モデリングから設計、そして最終的に PHP で実装するという一連の流れをご紹介することで、ドメインを中心に開発するイメージを持っていただければと考えています。
実際は、ドメインをモデリングして PHP コードに落とし込むという行為は誰もが日常的に行っているものです。
その手法や視点が異なるだけとも言えるので、こうしたやり方もあるのだなという気軽な気持ちでご参加ください。
Discord Channel: #track1-3-domain-modeling
近年、PHPの機能強化により型宣言だけで安全に書ける範囲が広まっています。
その一方でPHPStanやPsalmといった静的解析ツールはPHPでは表現できない強力な型を提供することでコード品質向上の価値を高めることが可能です。PhpStormはPHPプログラマに静的型の恩恵をもたらした一方、先述のツールと比べサポートする型について見劣りする点がありました。
ところが最近リリースされた待望の新バージョンである2021.2はこれまで静的解析ツールの専売特許だった型のいくつかがサポートされるようになり、型検査だけでなく入力補完などの恩恵を受けられるようになりました。そこで追加された型のひとつがジェネリクス(総称型)です。
本発表では、PHPの型についての基礎知識(今日からできる安心型付け入門)があることを前提として、PHPにジェネリクスは入るのか?の内容を軸に、PHPの型宣言では現時点で賄えない部分、特に配列の型およびジェネリクスの概念、class-string型の概念、そしてジェネリクスを実際に活用するためのテクニックを説明します。
Discord Channel: #track2-4-php-type
目標は、「クエリーレビューで怪しげなSQLを先回りして直す」!
Discord Channel: #track1-4-mysql-index
ORM が高性能になり、SQL (クエリ) を意識の外に置くことも増えてきました
おかげでより開発効率も向上し、スピーディ・高品質なコードが書ける率も上がっています
しかし…アラートは突然やってきます
落ちるページ表示速度、上がる DB サーバー の Load Average
そして大量のスロークエリ
もちろん原因はこれだけではありませんが、僕らの日常では、1つのスロークエリが DB サーバーを停止させることも少なくありません
SQL は書き方次第で簡単に障害に繋がります
また、障害発生時、プログラムがどんな SQL を実行しているのか
実装した SQL は速いのか、遅いのか
それがわからないと、障害解析で困る場面も多いです
障害などの緊急事態を回避する以前に、品質の観点でエンジニアには日常的に以下が求められると考えています。
本セッションは、実例をベースに上記を説明しつつ「現場で使えるスロークエリの倒し方」を持ち帰っていただき、クエリ (SQL) チューニングへの敷居を低くすることが目的です
SQL 見よう!
障害の完全な予測は難しいです
だからこそ打てる手は多く持ち、できれば早めに打っておきたい
その手の1つとして、実際に行っているスロークエリの見方・倒し方・予防方法をお話しします
SQL はチューニングすることで品質の向上が可能です
PHPer であっても、SQL を日頃からチューニングしていきましょう!
開発当初は快適に動いていても、スロークエリは突然やってきます
では見える化はどうしたら良いのか、を
の 2 パターンで解説します
スロークエリが見つかった場合に実行する主な内容を、項目別に解説します
普段の実装時・レビュー時にも実行することでパフォーマンス劣化の予防もできます
要求仕様、設計から立ち帰り、そもそもこれ必要なんだっけ?を徹底的に疑ってみることも重要です
では何を追求すれば良いのか?を実例をもとにお話します
まずいスロークエリを見つけ、解決していくまでの流れを、2つの事例から解説します
普段から予防のために実践していることをお話します
Discord Channel: #track2-2-mysql-tune
普段我々が使っているコンピュータシステムというのは、階層的なシステムです。
物理法則から電気回路が作られ、ハードウェアが作られ、ハードウェアの上で動くファームウェアや OS があって、更にその上で動くアプリケーションがあって、アプリケーションの中でも C 言語で書かれた PHP 処理系、更にその上で動く PHP で書かれたスクリプト、というように、何重もの階層化がされています。
土台になるものから高く階層を積み上げていく、というイメージで、階層の上のほうにある技術を高レイヤー、下のほうにある技術を低レイヤーと呼んだりします。
PHP のスクリプトというのは比較的高レイヤーに属するプログラムなわけですが、PHP コードがコンピュータ上で実際にはどう振る舞っているのか、どういう仕組みでできているのか、というのは、当然より低レイヤーの技術で成り立っています。
今回のセッションでは、そんな PHP より低レイヤーの世界へ FFI を通じて PHP スクリプトからアクセスし、PHP 自身から階層をぶち抜いてスクリプトの動作を下の方から覗き見てみるという、少しひねくれたことをやるツール、php-profiler についてお話します。
雑に言うと、PHP スクリプトによって ELF/DWARF と procfs と ZendEngine の内部構造体をパースしつつ、FFI で外部プロセスのメモリやレジスタ内容を読み取り、gdb などのデバッガと同じようなやり方で、スクリプトの動作を処理系の内部動作レベルから盗み見るお話です。
ある瞬間に PHP プロセスが PHP コードの何行目を実行しているのか、どんな処理系内部のバイトコードを実行しているのか、そしてそのために処理系や拡張モジュールの C 言語コードのどの部分の何行目が実行されているのかを、観察対象の PHP スクリプトへ全く手を入れないままに読み取ります。
In this presentation, we will show how to use Elasticsearch with PHP. We will give a short introduction to Elasticsearch showing how PHP developers can benefit from its usage. We will present how to connect to Elasticsearch, how to index data, how to search and aggregate information. We will also present some advanced features, such as fuzzy search, highlighting and the recent schema on read available from Elasticsearch 7.12.
Discord Channel: #track4-9-elasticsearch-php
Joind.in: https://joind.in/event/php-conference-japan-2021/programming-elasticsearch-with-php
Are you still using Apache/Nginx and a bunch of virtual hosts to create your own shared hosting server? Stop tinkering with configs on your server because this talk is just for you. In this talk I’ll share how I manage my sites with EasyEngine. EE is a docker setup that uses Nginx, php-fpm, and Redis to spin up sites in a blazing fast and repeatable way. I’ll go over how I use EasyEngine with Google Cloud Compute, Terraform, and Namecheap to create a server, point a domain, and create a site in just a handful of steps. This has allowed me to be able to migrate sites in a super fast way to new operating systems and keeping security patches in tip top shape. I’ll go over how to use LetsEncrypt which is built right into EasyEngine for free SSL certificates and how you can backup/migrate sites quickly. After this talk, you will be ready for lift off with EasyEngine!
PHPを始めたばかりの初心者の方は1つのファイルにすべての処理を書き込むところからスタートすると思います(フラットなPHP)
一方で、プロダクトは一度作って終わりではなく必ず改修が必要になります。フラットなPHPで開発するとぶち当たる改修の難しさを軽減し、より良いプロダクトを作るためにオブジェクト指向という考え方があります。
「オブジェクト指向」という言葉を聞いたことはあっても「なんとなく難しそう…」と二の足を踏んでいる人も多いでしょう。この機会に入門してみませんか?
概念の説明だけでなく、実際にフラットなPHPに書かれている処理をオブジェクト指向を使ってクラスに分けて書くやり方を、実際にコードを書きながら解説します。
※私自身オブジェクト指向について学問的に学んだことがあるわけではありません。日々PHPで開発するのに必要な概念のみ話す予定ですが、学問的には間違った内容が含まれる可能性が少しあります。
オブジェクト指向プログラミングがどういったもので、どういうときに役に立つのかについて解説します。
多くの初学者はプログラミングを始めて手続き型の記述に慣れた頃、オブジェクト指向プログラミングに出会います。
クラスやオブジェクトといった用語を学び、オブジェクト指向プログラミングの機能を実際に記述して体感します。
そして、混乱に陥ります。
なぜなら、オブジェクト指向プログラミングを活用することで何が嬉しいのか、機能を体験しただけでは理解できないからです。
道具を使いこなすには、それがなんであるかを学ぶと同時に、その目的を知らねばなりません。
目的を知らずに道具を扱えば、よく切れる包丁で紙を切るといったおかしな事態が起きてしまいます。
本トークでは、オブジェクト指向プログラミングがどういったもので何ができるかを解説するのと同時に、どうしてそれが必要なのかについてを解説します。
※本トークがカバーする範囲はクラスによるカプセル化とサブタイプポリモーフィズムまでです
■トーク対象
Discord Channel: #track1-2-oop
ソフトウェアはその生涯において、さまざまな要求を突き付けられます。
要求に応え続けるために必要なことは、コードをシンプルに保つことです。
ソフトウェアアーキテクチャは抽象化と問題の分割によって複雑性を減らし、コードをシンプルに保つことに貢献します。
ソフトウェアが中長期的に利用されることを前提とするのであれば、ソフトウェアアーキテクチャの理念やそれ自体を採用することは検討すべき事柄です。
しかしながら、ここにひとつの問題があります。
それはソフトウェアアーキテクチャが単一でないことです。
日夜進歩しつづけるソフトウェア開発の世界では、多くのソフトウェアアーキテクチャが生まれつづけています。
それらの中から、チームやソフトウェアの目的やライフサイクルに最適なものを選定するのは容易なことではありません。
そこで本トークでは「ソフトウェアアーキテクチャの選定」をテーマに、ソフトウェアアーキテクチャの特徴や実装例を紹介しながら、どういった観点で選定をしているかについてお話します。
本トークで取り上げる主なソフトウェアアーキテクチャは次のとおりです。
レイヤードアーキテクチャ
ヘキサゴナルアーキテクチャ
オニオンアーキテクチャ
クリーンアーキテクチャ
ADOP
※サンプルコードは Laravel を予定しています。
※本トークは JJUG CCC 2021 Spring で発表した内容を PHP にカスタマイズしたものになります
■トーク対象
Input-Output (otherwise known as I/O) is commonplace in daily programming but is quite arduous. PHP, though robust, offers sequential, blocking I/O solutions that require one to await completion of one task before starting another. Blocking I/O is somewhat inefficient, especially in modern applications that are computationally intensive in nature. Enter ReactPHP, a PHP-userland affable suite of technologies - complete with an event loop, a NodeJS-akin server, and Promises.
ReactPHP offers the advantages of non-blocking I/O - present in runtimes like Node.JS - to the PHP developers who use it. It provides, via the Reactor pattern, a means of efficiently running I/O operations in an event-driven domain.
My talk titled Asynchronous Programming in PHP with ReactPHP is an attempt to distill asynchronous non-blocking I/O concepts for a PHP audience. The first part is an introduction to non-blocking I/O and describes the advantages of adopting event-driven approaches. The second part is a description of streams, promises, and the event loop. Lastly, the third and fourth parts - the respective focus points being usage and application of ReactPHP - conclude the session.
Discord Channel: #php4-8-php-async
Joind.in: https://joind.in/event/php-conference-japan-2021/asynchronous-programming-in-php
PHP 8.1 brings Enums, one of the most requested features in PHP.
Enumerations allow creating strict and type-safe structures for fixed values. An Enum structure can hold a number of values that can also be backed with integer or string values.
In this comprehensive session, we will discover what Enums are, why they are useful, how to apply them on PHP applications.
Audience
This session is for those who are familiar with modern PHP practices such as Object Oriented Programming, principles such as Liskov Substitution principle; familiarity with such concepts can help a lot.
What you will learn
Ayesh Karunaratne is the author of PHP.Watch (https://php.watch), where he provides in-depth articles and documents on PHP and latest changes to the language.
Discord Channel: #php4-6-php81-enum
Joind.in: https://joind.in/event/php-conference-japan-2021/php-81-enums
In recent years, more and more PHP developers are interested in asynchronous frameworks, like Swoole. However, Swoole brings to PHP not just asynchronous programming; there are a few mind-blowing features in Swoole that many developers are not yet aware of. In this talk, I will discuss how to use Swoole to build an application server to serve web requests, to handle cron jobs, and to process job queues without relying on any third-party applications or software.
Discord Channel: #track4-5-swoole
Joind.in: https://joind.in/event/php-conference-japan-2021/build-an-all-in-one-application-server-using-swoole
Laravel 公式から非同期処理 HTTP サーバーとして動作する Laravel Octane は PHP8 から使用可能です。Laravel Octane は Laravel を開発しているテイラー自らが開発に乗り出しているものです。
Laravel Octane は非同期処理の話を賑わせている RoadRunner や Swoole に対応した HTTP サーバーで、重たい処理などを非同期に処理をしたいニーズにも満たしています。私自身は Laravel Octane とは別に laravel-swoole と呼ばれる HTTP サーバーを 1 年ほど試してきて、プロダクションで扱う際のノウハウをいくつか得てきました。そこで、Laravel Octane を使うメリット、Apache や Nginx と何が違うのか、使う上での注意点、laravel-swoole を使ってきて得られたノウハウを交えてお話できればと思います。
マイクロサービスアーキテクチャ化を着手する開発組織も多いと思いますが、
最大の難関でもある分散トラザクションへの対応、みなさんはどう解決していますか?
読み込みに対するアプローチはたくさんありますが、
分散トランザクションを制御する為にPHPだけで解決しようとする場合は、
非常に難易度の高いチャレンジとなります。
分散トランザクションを制御するには並行システムと分散システムを表現する高いレベルの抽象化が必要となり、
その難しさは一般的なWebアプリケーション開発と異なる問題解決方法が必要となります。
アクターモデルはこれらの分散システムを解決するアプローチの一つとして取り入れることができます。
今回はアクターモデルフレームワークの一つでもあるProto.ActorとGoを取り上げて
分散トランザクションを解決するためのアクターモデルの知識と基本、少しのSaga実例を踏まえて解説します。
*本セッションはPHPではなくGo言語がメインとなり、
いくつかの難しい概念を扱いますので、
初学者の方にはお勧めしません。
みなさん!帳票印刷してますか!
令和になっても相変わらず紙の書類の需要は大きく、Webアプリ開発においても帳票印刷機能は多くの案件で要求されますよね。
しかし、これがとにかく面倒くさい。
・複雑なレイアウトの帳票をHTML/CSSでデザインするのが地獄
・かといって超微細Excel方眼紙でデザインするのはもっと地獄
・しかもPDFに変換するときに微妙に見た目が崩れてどうにもできない
帳票印刷機能を実装したことのある方には強く共感していただけるのではないかと思います。
そんな面倒で難しい帳票印刷ですが、この度、ついに最強の方法を編み出しました🙌✨
・ピクセル単位で細かく帳票をデザインできる(しかも簡単に)
・帳票デザインの保守性が高い(修正が容易)
・印刷時に見た目が一切崩れない
という条件を満たせる唯一(当社調べ)の帳票印刷メソッドです👍
この至高の方法の具体的な実践手順について時間の許す限り詳しく解説します!
有償の帳票エンジンはなかなか高額で導入できる案件が限られていると思いますので、自力で実装する場合のプラクティスの1つとしてぜひ参考にしていただければと思います✨
新しいサービスを始めるにあたって、機能やアイデアを検証する『プロトタイピング』。みなさんは、どのようにしてプロトタイプを開発しているでしょうか?この度、はじめてプロトタイピングの開発に携わらさせてもらう機会をいただき、さまざまな学びや気づきがありました。
今回は協働開発した、たなかひさてるさんと共に、携わったプロトタイプ開発の体験をベースとして、クリーンアーキテクチャを考慮して実践した手順や考えをお話しいたします。
以下の内容をお話しする予定です。
Discord Channel: #track1-5-cleanarchitecture