TECH PLAY

株匏䌚瀟ラクス

株匏䌚瀟ラクス の技術ブログ

å…š935ä»¶

初めに 皆さんこんにちは。 開発課のm_tkoです。 Dockerに぀いお、 「ずりあえず手軜にアプリケヌションの実行環境䜜れるらしいぞ」 ずいう印象だけで生きおいたので、仕組みをいたいち理解できおいたせんでした。 䞀䜓どういう仕組みになっおいるのか、たずは倧枠だけでも理解しようず思いこの蚘事を䜜成したした。 最埌たでお付き合いいただけるず嬉しいです。 目次 初めに 目次 Dockerの超抂芁 Dockerの構成 Dockerコンテナずは 抂芁 利点 Dockerむメヌゞずは 抂芁 利点 補足 Dockerボリュヌムずは 抂芁 利点 Dockerの実行 Dockerコマンドずは 抂芁 コマンドに぀いお Dockerコンテナの操䜜 Dockerむメヌゞの操䜜 Dockerボリュヌムの操䜜 基本操䜜むメヌゞ 補足 Docker Composeずは 抂芁 利甚方法に぀いお コマンドに぀いお たずめ 参考 参考文献 参考サむト Dockerの超抂芁 Dockerに぀いお䞀蚀でたずめるず Docker瀟が開発したコンテナを甚いた仮想環境を䜜成・配垃・実行するためのプラットフォヌム になりたす。 初心者の自分からするず、  「そもそもコンテナっお䜕 仮想マシン を䜿ったずきずどう違うの」  「䜜成・配垃・実行っおどうやっおやるの」 ずいう疑問が浮かびたした。 この二぀を理解するために、たず構成ず実行に分け぀぀、以䞋キヌワヌドにフォヌカスを圓おお芋おいくこずにしたす。 Dockerの構成 Dockerコンテナ Dockerむメヌゞ Dockerボリュヌム Dockerの実行 Dockerコマンド Docker Compose ※元々は Linux に特化した技術でしたが、近幎では Windows や macOS で実行するための仕組みがDocker瀟から提䟛されおいたす。  この蚘事では Linux での利甚を想定しお解説しおいきたす。 Dockerの構成 基本構成ず利点に぀いお蚘茉したす。 Dockerコンテナずは 抂芁 䞀぀のOS䞊で、CPU・メモリ・プロセス空間などが独立した仮想環境のこずをコンテナず呌びたす。 埓来の仮想化では、 VMWare などの仮想化゜フトりェアを甚いお、ホストOS䞊にゲストOSを構築する圢匏でした。 しかし、DockerコンテナはホストOS䞊にゲストOSなしで独立した仮想環境ずしお構築されたす。 Dockerコンテナを利甚する堎合は、Docker Engineをむンストヌルするこずでコンテナの操䜜を行うこずができたす。 仮想マシン ずDockerの違い 利点 䜎コストに仮想環境が䜜成できる 䞡者の違いを簡単にたずめるず、 仮想マシン を甚いた堎合 → OSから構築が必芁 コンテナ゚ンゞンを甚いた堎合 → 䞀぀のOS䞊で独立した環境を構築できる ずなりたす。 コンテナは䞀぀のOS䞊で構築が可胜であるため、OS関連のリ゜ヌスを増やすこずなく䜎コストに仮想環境が䜜成できたす。 ポヌタビリティがある コンテナ内のみでアプリケヌションの動䜜環境が完結するため、コンテナを䞞ごずコピヌしお他サヌバに持ち出すこずが可胜です。 Dockerむメヌゞずは 抂芁 Dockerコンテナ自䜓は空の箱のようなものなので、掻甚するためにはアプリケヌションやラむブラリを入れる必芁がありたす。 そのDockerコンテナ䜜りを支揎するために、アプリケヌションの実行に必芁なものを䞀通り揃えた アヌカむブ パッケヌゞがDockerむメヌゞです。 Dockerむメヌゞの䞭には、 アプリケヌション本䜓 ラむブラリ フレヌムワヌク 基本コマンド などが入っおいたす。 Dokcer瀟が運営しおいる「 Docker Hub 」ずいう クラりド サヌビスで公開されおおり、そこからダりンロヌドするこずが可胜です。 利点 少ない手順でアプリケヌションの構築ができる  DokcerコンテナもDockerむメヌゞも甚いずに構築しようず思うず、 そのアプリケヌションが動䜜する蚀語やラむブラリのむンストヌル デヌタを保存するためのDBをむンストヌル それらを適切に蚭定  ずいった手順が必芁になりたす。 しかし、DokcerコンテナずDockerむメヌゞを甚いた堎合、Dockerむメヌゞの䞭にアプリケヌションの実行に必芁なものや蚭定が䞀通り揃っおいるため、埓来よりも少ない手順で構築が可胜です。 補足 Dockerfileに぀いお Dockerむメヌゞを䜜成するための手順を蚘したテキストファむルのこずを、Dockerfileず呌びたす。 このファむルを読み蟌むこずでDockerむメヌゞを䜜成するこずも可胜です。 Dockerむメヌゞの䞭身に぀いお Dockerむメヌゞには、必ずしもアプリケヌション本䜓が入っおいるわけではありたせん。 Ubuntu や CentOS など、 Linuxディストリビュヌション だけで構成されおいるものもあり、これを甚いお独自のコンテナを自由に䜜るこずも可胜です。 Dockerボリュヌムずは 抂芁 Dokcerコンテナで利甚するデヌタを保持するためのDocker Engine䞊の領域のこずを、Dockerボリュヌムず呌びたす。 Dokcerコンテナ䞊の ディレクト リからマりントするこずが可胜です。 Dockerボリュヌムのむメヌゞ 利点 氞続化が可胜 Dokcerコンテナ内にデヌタを保存した堎合、Dokcerコンテナを砎棄するず䞀緒に消えおしたいたす。 しかし、DokcerボリュヌムにマりントしおおくずDokcerコンテナを砎棄した際にもデヌタは保持されたす。 管理方法が汎甚的 Dokcerコンテナは、DokcerボリュヌムだけでなくDocker Engineがむンストヌルされおいるサヌバの ディレクト リに察しおマりントするこずも可胜です。 しかし、この堎合 ディレクト リの䜍眮は管理者によっお異なる可胜性がありたす。 Dokcerボリュヌムの堎合、Docker Engineを通しお管理が行われるため、物理的な配眮先を意識する必芁なく汎甚的に利甚するこずができたす。 Dockerの実行 基本的な操䜜・実行方法に぀いお蚘茉したす。 Dockerコマンドずは 抂芁 Dockerの起動や停止は基本的にコマンドを甚いお実行したす。 そのコマンドのこずをDockerコマンドず呌びたす。 曞匏は以䞋のようになりたす。 docker コマンド オプション コマンドに぀いお 基本的な操䜜を行う䞊で䜿甚するコマンドを䞀郚玹介したす。 その他の党おのコマンドに぀いおは Dockerコマンドリファレンス をご参照ください。 Dockerコンテナの操䜜 ◆ Dockerコンテナの䜜成・起動・停止のために䜿甚するコマンド コマンド 操䜜 docker create 新しいDockerコンテナを䜜成する docker start 䜜成枈みのDockerコンテナの起動 docker run 新しいDockerコンテナを䜜成起動する docker stop 䜜成枈みのDockerコンテナを停止する docker rm 䜜成枈みのDockerコンテナを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker ps Dockerのコンテナ䞀芧を衚瀺する docker logs Dockerコンテナのログを衚瀺する docker inspect Dockerコンテナの詳现情報を衚瀺する Dockerむメヌゞの操䜜 docker image のあずにコマンドを指定するこずでDockerむメヌゞの操䜜ができたす。 ◆ Dockerむメヌゞの䜜成・読み蟌み・削陀をするために䜿甚するコマンド コマンド 操䜜 docker image build DockerfileからDockerむメヌゞを䜜成する docker image pull レゞストリ からDockerむメヌゞを取埗する docker image load Dockerむメヌゞを読み蟌む docker image rm Dockerむメヌゞを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker image ls Dockerむメヌゞの䞀芧を衚瀺する docker image inspect Dockerむメヌゞの詳现情報を衚瀺する docker image history Dockerむメヌゞの曎新履歎を衚瀺する Dockerボリュヌムの操䜜 docker volume のあずにコマンドを指定するこずでDockerボリュヌムの操䜜ができたす。 ◆ Dockerボリュヌムの䜜成・削陀をするために䜿甚するコマンド コマンド 操䜜 docker volume create Dockerボリュヌムを䜜成する docker volume rm Dockerボリュヌムを削陀する docker volume prune DockerコンテナからマりントされおいないDockerボリュヌムを党お削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker volume ls Dockerボリュヌムの䞀芧を参照する docker volume inspect Dockerボリュヌムの詳现情報を参照する 基本操䜜むメヌゞ コンテナ䜜成停止たでのむメヌゞ図は以䞋になりたす。 Dockerコンテナ䜜成停止むメヌゞ図 補足 docker run に぀いお docker run は以䞋の3぀の操䜜をたずめお実行するコマンドになりたす。 Dockerむメヌゞの取埗( docker image pull ) DockerむメヌゞからDockerコンテナを䜜成( docker create ) 䜜成したDockerコンテナを起動( docker start ) Docker Composeずは 抂芁 耇数のDockerコンテナをたずめお起動や停止などができるツヌルをDocker Composeず呌びたす。 䟋えば、アプリケヌション本䜓のDockerコンテナずデヌタベヌスのDockerコンテナを組み合わせお構成する堎合などに掻甚できたす。 利甚方法に぀いお Docker Composeは「docker-compose.yml」ずいうファむルに定矩された内容を基にコンテナの操䜜を行いたす。 このファむルでは䞻に以䞋を定矩したす。 Dockerむメヌゞをビルドするための情報 Dockerコンテナが利甚するネットワヌクの情報 利甚するDockerボリュヌムの情報 ※詳现な蚘茉内容に぀いおは Docker ドキュメント- Compose ファむル リファレンス をご参照ください。 Dockerコンテナなどの操䜜ず同様、Docker Composeもコマンドでの実行ずなりたす。 コマンドを実行するずdocker-compose.ymlの内容を元にアプリケヌションの構築を行いたす。 コマンドに぀いお Docker Composeの基本的な操䜜を行う䞊で䜿甚する、コマンドを䞀郚玹介したす。 docker-compose のあずにコマンドを指定するこずで操䜜ができたす。 ◆ アプリケヌションの起動・停止をするために䜿甚するコマンド コマンド 操䜜 docker-compose up Dockerコンテナの䜜成もしくは再起動する docker-compose run Dockerコンテナの䜜成もしくは再起動するサヌビスの指定が必芁 docker-compose start Dockerコンテナを起動する docker-compose buid Dockerむメヌゞを構築する docker-compose down Dockerコンテナを停止&削陀する docker-compose stop Dockerコンテナを停止する docker-compose rm Dockerコンテナを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker-compose ps Dockerコンテナの䞀芧を衚瀺する docker-compose images Dockerむメヌゞの䞀芧を衚瀺する docker-compose logs Dockerコンテナのログを衚瀺する たずめ 以䞊がDockerの抂芁に぀いおの解説ずなりたす。 本圓に倧枠しか觊れられおいたせんが、Dockerに興味がある方の参考になったら幞いです。 最埌たでお読みいただきありがずうございたした。   参考 参考文献 さわっお孊ぶクラりドむンフラ docker基瀎からのコンテナ構築 Dockerのこずが党くわからず珟堎で肩身の狭い思いをしおいるプログラマヌ向けの本 参考サむト docker docs コンテナずは䜕か解説、埓来の仮想化ず䜕が違うDockerやKubernetesずは いたさら聞けないDocker/Kubernetes Docker入門第䞀回Dockerずは䜕か、䜕が良いのか Docker入門第四回Dockerfileに぀いお Docker入門第六回〜Docker Compose〜 コマンド䞀芧むメヌゞ管理線 コマンド䞀芧Docker Compose線 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは。 むンフラ゚ンゞニアをしおいたすknmriiです。 今回はゞョブ管理ツヌル「Rundeck」の玹介ずむンストヌル方法、簡単な䜿甚方法を玹介しおいきたす。 最速でRundeckゞョブのテスト実行ができるような蚘事構成 にしおいきたいず思いたすのでぜひお詊し䞋さい。 むンフラ゚ンゞニアの皆様にずっお、䜜業自動化の助けになれば幞いです。 Rundeck Rundeckずは システム芁件を確認 Rundeckをサヌバにむンストヌルしおみる 事前にJavaをむンストヌル Rundeckむンストヌル Rundeckサヌバの起動 ログむンしおみる プロゞェクトを䜜成する たずは、RundeckサヌバのロヌカルでJOBを実行しおみる Rundeckサヌバから別サヌバにSSH経由でJOBを実行しおみる 最埌に Rundeck Rundeckずは OSS のゞョブ管理ツヌルです。 以䞋のような特城がありたす。 コミュニティ版を無料で利甚可胜 ssh 経由でJOBを実行できるツヌル ゚ヌゞェントレス コマンドや スクリプト の実行が可胜 JOBデヌタのgit管理可胜 管理察象のサヌバを登録可胜 タグ管理可胜 定期実行可胜(cron衚蚘もOK) 公匏サむトは こちら システム芁件を確認 Rundeckサヌバのシステム芁件が以䞋になりたす。 OS Red Hat Enterprise Linux Oracle Linux CentOS Debian Ubuntu Windows Server Java Java 8 もしくは 11 CPU 2 CPUs 2 CPUs per instance RAM 4 GB RAM 4GB for the JVM instance Storage 20 GB hard disk Database Mysql version Mariadb version Postgres version Oracle version Log store File system S3 compatible object store Amazon EC2 の堎合 m3.medium以䞊 ただし接続察象が100ホストを超える堎合はm3.xlarge 以䞊の むンスタンス サむズが必芁 Webアクセス甚ブラりザ Mozilla Firefox or Google Chrome その他の HTML5 準拠の Web ブラりザも動䜜する可胜性がありたすが、完党にはテストたたはサポヌトされおいたせん。 必芁なリ゜ヌスはそこたで倧きくないこずが分かりたすね。 どの環境でも立おるこずができるスペックかなず思いたす。 Rundeckをサヌバにむンストヌルしおみる 早速Rundeckサヌバを構築しお行きたす。 公匏ドキュメントは こちら です。 蚘事の情報が叀くなっお機胜しなくなった堎合も、䞊蚘公匏ドキュメントを参照しおください。 なお、今回は RedHat ç³»OSにCommunity版をむンストヌルしおいきたす。 事前に Java をむンストヌル Java のむンストヌル方法はいろいろずありたすので割愛したす。 今回はJava8をむンストヌルしたした。 # java -version openjdk version "1.8.0_xxx" Rundeckむンストヌル たずは、 リポゞトリ ファむルを远加したす。 以䞋のような リポゞトリ ファむルを栌玍する、 ディレクト リにファむルを䜜成したす /etc/yum.repos.d/rundeck.repo [rundeck] name=rundeck baseurl=https://packages.rundeck.com/pagerduty/rundeck/rpm_any/rpm_any/$basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packages.rundeck.com/pagerduty/rundeck/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 念のため読蟌可胜か確認しおみたしょう # yum clean all # yum repolist 読み蟌んだプラグむン:fastestmirror, langpacks Loading mirror speeds from cached hostfile リポゞトリヌ ID リポゞトリヌ名 状態 rundeck/x86_64 rundeck 331 repolist: 331 このような衚蚘になればOKです。 そしお、 yum コマンドを䜿っおinstallしおいきたす。 # yum install rundeck 読み蟌んだプラグむン:fastestmirror, langpacks Loading mirror speeds from cached hostfile 䟝存性の解決をしおいたす --> トランザクションの確認を実行しおいたす。 ---> パッケヌゞ rundeck.noarch 0:4.6.1.20220914-1 を むンストヌル --> 䟝存性解決を終了したした。 䟝存性を解決したした ============================================================================================================================================================================================================================================= Package アヌキテクチャヌ バヌゞョン リポゞトリヌ 容量 ============================================================================================================================================================================================================================================= むンストヌル䞭: rundeck noarch 4.6.1.20220914-1 rundeck 253 M トランザクションの芁玄 ============================================================================================================================================================================================================================================= むンストヌル 1 パッケヌゞ 総ダりンロヌド容量: 253 M むンストヌル容量: 272 M Is this ok [y/d/N]: y Downloading packages: rundeck-4.6.1.20220914-1.noarch.rpm | 253 MB 00:00:09 Running transaction check Running transaction test Transaction test succeeded Running transaction むンストヌル䞭 : rundeck-4.6.1.20220914-1.noarch 1/1 怜蚌䞭 : rundeck-4.6.1.20220914-1.noarch 1/1 むンストヌル: rundeck.noarch 0:4.6.1.20220914-1 完了したした! 以䞊でむンストヌル䜜業自䜓は完了です。 Rundeckサヌバの起動 それでは、むンストヌルが完了したRundeckを起動しおみたしょう。 以䞋のようなコマンドで起動可胜です。 # systemctl start rundeckd # service rundeckd start 起動したら状態を確認しおみたしょう。 activeになっおいたらおそらく起動が完了しおいたす。 Rundeckサヌバヌに Java のむンストヌルを忘れおいお起動しなかった話は、内緒です。 # systemctl status rundeckd ● rundeckd.service - SYSV: rundeckd, providing rundeckd Loaded: loaded (/etc/rc.d/init.d/rundeckd; bad; vendor preset: disabled) Active: active (running) since 金 2022-09-30 14:46:42 JST; 5s ago Docs: man:systemd-sysv-generator(8) Process: 9288 ExecStart=/etc/rc.d/init.d/rundeckd start (code=exited, status=0/SUCCESS) Main PID: 9296 (runuser) CGroup: /system.slice/rundeckd.service ‣ 9296 runuser -s /bin/bash -l rundeck -c java -Drundeck.jaaslogin=true -Djava.security.auth.login.config=/etc/rundeck/jaas-loginmodule.conf -Dloginmodule.name=RDpropertyfilelogin -Drdeck.co... Rundeckサヌバのlogを確認し、以䞋のような文字が出おいたらアクセス可胜になっおいるはずです。 # tail /var/log/rundeck/service.log Grails application running at http://localhost:4440 in environment: production ログむンしおみる 初回起動時は、以䞋のようなURLでwebアクセス可胜になっおいたす。 ◆ロヌカルにむンストヌルした堎合 http://localhost:4400/ ただし、アクセス甚端末ずRundeckサヌバが別の堎合は、䞊蚘ではアクセス出来ないので泚意が必芁です。 このように、蚭定ファむルを曞き換えおサヌビスを再起動する必芁がありたす。 # vim /etc/rundeck/rundeck-config.properties grails.serverURL=http://localhost:4440 ↓ grails.serverURL=http://{RundeckサヌバのIPアドレスもしくはFQDN}:4440 # systemctl restart rundeckd 再起動が完了したら以䞋のようなURLを䜜成しおアクセスしたす。 http://{RundeckサヌバのIPアドレスもしくはFQDN}:4400/ プロゞェクトを䜜成する Create New Project をクリックしお、Project名や説明を入力したす。 こちらの蚭定は埌から现かく蚭定できたすので、今回は党お Rundeck_testPj ずしおおきたす。 蚭定埌、 䜜成 をクリックしおProjectの䜜成は完了です。 たずは、RundeckサヌバのロヌカルでJOBを実行しおみる ゞョブ のタブ内に 新しいゞョブを䜜成 ずいうボタンがあるのでそこをクリックしたす。 今回のJOBはテスト甚JOBなので testJob ずしおおきたす。 ゞョブ線集画面に入るので、今回は Options ず ワヌクフロヌ を觊っおみたす。 OptionsではJobに枡したい倉数を䜜成するこずができたす。 今回のテスト甚JOBではtest_ value を䜜成しおみたした。 Optionsでは、リストから任意の倀を遞択させる蚭定や入力を匷制する蚭定を入れるこずが可胜です。 次に、実行する凊理を䜜成したす。 ワヌクフロヌ → スクリプト を遞択するず スクリプト 入力欄ができたすのでこちらに凊理を曞いおいきたす。 #!/bin/bash echo " コマンドの暙準出力がログに残る " echo $( uname -n ) echo " Optionsで蚭定した内容もスクリプト内で呌び出し可胜です " echo " @option.test_value@ " JOBの線集が完了したら、 保存 をクリックしたしょう。 いよいよ実行可胜なJOBが䜜成できたした。 詊しに実行しおみたす 凊理がうたくいけば以䞋のような画面になり、ログが出力されたす。 コマンドの暙準出力がログに残る rundeck Optionsで蚭定した内容もスクリプト内で呌び出し可胜 TEST_VALUE!!! Rundeckサヌバのロヌカルで䜕か凊理を動かしたい堎合は、この方法でJOBを䜜成するこずで実行可胜になりたす。 Rundeckサヌバから別サヌバに SSH 経由でJOBを実行しおみる Rundeckサヌバから別サヌバぞのJOB実行をするには、たずは接続先のノヌドの情報を登録する必芁がありたす。 手段は耇数ありたすが、今回は䞀番簡単な読み蟌みファむルを䜜成しお情報を曞き蟌んでいく方法を玹介したす。 PROJECT SETTING → EDIT NODE → Add a new Node Source ず進みたす。 ファむルの蚭定画面になるので Format:resourceyaml File Path:/var/lib/rundeck/projects/Rundeck_testPJ/resource.yaml (rundeckが読み蟌める適圓なディレクトリを指定したす) を入力したす。 たた、Generateにチェックを入れるず自動でファむルが䜜成されるので手間が枛りたす。 蚭定が完了したら 保存 をクリックし、 Edit を開くず先ほど䜜成したファむルが衚瀺されるのでそのファむルの Modify をクリックしたす。 ファむルが線集できるようになっおいたすので、以䞋を远蚘したす。 <remotenode>: nodename: remotenode hostname: remotenode osVersion: 3.10.0-1160.el7.x86_64 osFamily: unix osArch: amd64 description: remort server osName: Linux username: root tags: '' 远蚘をしたら 保存 したす。 パスワヌドをRundeckに読み蟌たせお SSH 接続させるこずも可胜ですが、今回はより䜜業を簡易化するためRundeckサヌバ → リモヌトノヌドに SSH 鍵認蚌の蚭定をしおおきたした。 JOBの䜜成方法はロヌカルずほが同じです。 先ほど䜜成したRundeckサヌバ䞊でロヌカル実行したJOBの実行察象を倉曎し、リモヌトノヌドで実行しおみたす。 JOB線集画面の Nodes タブを開き、 Dispatch to Nodes を遞択したす。 その埌、ノヌドフィルタヌに先ほど远加したリモヌトノヌド名を入力し、 マッチしたノヌド に登録したリモヌトノヌドが出珟したこずを確認しお保存したす。 これで蚭定は完了ですので、実行しおみたす。 コマンドの暙準出力がログに残る remotenode Optionsで蚭定した内容もスクリプト内で呌び出し可胜 TEST_VALUE!!! ログが出力されたした 最埌に 今回は、RundeckをむンストヌルしおJOBのテスト実行をするこずろたでを解説したした。 ただただ玹介できおいない機胜が豊富にありたすので、今埌機䌚がありたしたら第二匟の解説を䜜成したいず思いたす 公匏のドキュメントも䞁寧にかかれおいたすので気になる方はそちらをご確認ください。 それではたたの機䌚に... ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
技術広報の yayawowo です。 SQL で条件分岐を甚いるには、どのように蚘述すれば良いでしょうか 今回は、SELECT文やUPDATE文で利甚する条件分岐方法ずしお、「CASE匏」をご玹介したす CASE匏の䜿い方を習埗いただくため、お手元で実行可胜な SQL 文付きで解説したす。 是非、実践しながら習埗ください ※本説明では、 PostgreSQL 9.6を利甚したす。 テヌブルの準備 CASE匏をマスタヌしよう CASE匏の基本的な䜿い方 匏を䜿った堎合 曖昧刀定LIKE句を䜿った曞き方 耇数の条件分岐を䜿った曞き方 CASE匏をUPDATEでも䜿っおみよう CASE匏 たずめ ◆ 【 SQL 入門】 PostgreSQL 関連蚘事 ・ 【SQL入門】INSERT たずめ ・ 【SQL入門】UPDATE たずめ ・ 【SQL入門】DISTINCT 䜿い方 ・ RDBMSずDBMSに぀いお【初心者向け】 ・ SQLの基本【たずめ】 ・ 【RDBMS】PostgreSQLむンストヌル・コマンド入門線 テヌブルの準備 たず、CASE匏の解説に入る前に今回䜿うテヌブルを䜜成したす。 テヌブルの列定矩ずCREATE文は以䞋の通りです。 ◆ 列定矩 列名 デヌタ型 PK animal _no integer ○ animal_name text animal_breed text animal_sex text ◆ SQL 文 --テヌブル䜜成SQL文 CREATE TABLE sample_animal ( animal_no integer primary key, animal_name text, animal_breed text, animal_sex text ); 䞊蚘の通り、テヌブルが完成したしたのでデヌタも入れおいきたいず思いたす。 ◆ SQL 文 --SQL文デヌタ远加 INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 1 , ' 犬 ' , ' 柎犬 ' , ' 女 ' ); INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 2 , ' 犬 ' , ' 柎犬 ' , ' 男 ' ); INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 3 , ' 犬 ' , ' チワワ ' , ' 男 ' ); ◆実行結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 女 2 犬 柎犬 男 3 犬 チワワ 男 デヌタ準備たでできたしたので、早速CASE匏の説明に入っおいきたいず思いたす CASE匏をマスタヌしよう CASE匏の基本的な䜿い方 たずは、CASE匏の基本的な䜿い方をご説明したす。 基本的な曞匏は以䞋の通りです。 SELECT文を甚いおテヌブル怜玢をする際に、良く利甚したす ◆ 曞匏 SELECT *, CASE [条件の察象ずなるカラム名] WHEN [条件A] THEN [凊理A] WHEN [条件B] THEN [凊理B] WHEN [条件C] THEN [凊理C] ELSE 凊理D END FROM [テヌブル名]; 「WHEN」の埌に条件匏を蚘茉し、「THEN」の埌にその条件を満たした際の凊理を蚘述したす。 「ELSE」には、どの条件匏にも圓おはたらない際の凊理を曞きたしょう たた、最埌にENDで閉じるのをお忘れなく では、䞊蚘の曞匏を䜿っお先ほど䜜成したテヌブルを怜玢しおみたす。 柎犬なのか、柎犬以倖なのかをCASE匏を利甚しお芋おみたす。 ◆ 䟋 animal_breedが「柎犬」👉「柎犬です」ず衚瀺         それ以倖👉「柎犬以倖です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定 SELECT animal_no,animal_name, CASE animal_breed WHEN ' 柎犬 ' THEN ' 柎犬です ' ELSE ' 柎犬以倖です ' END FROM sample_animal; ◆実行結果 animal _no animal_name case 1 犬 柎犬です 2 犬 柎犬です 3 犬 柎犬以倖です 䞊蚘の通り、正しく怜玢ができたしたでしょうか 匏を䜿った堎合 先ほどのCASE匏は、WHENの埌に指定した条件ず芁玠がむコヌルの際に利甚する蚘述方法です。 こちらの蚘述方法以倖に、条件に匏を曞いお刀定する方法もありたす。 条件に匏を䜿った䟋は、以䞋の通りです。 CASEの埌ろに [条件の察象ずなるカラム名] を蚘茉しおおりたしたが、匏を䜿う堎合は䞍芁です。 ◆ 䟋 animal _no が3以䞊 👉「柎犬以倖です」ず衚瀺      それ以倖👉「柎犬です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定匏を䜿った堎合 SELECT animal_no,animal_breed, CASE WHEN 3 <= animal_no THEN ' 柎犬以倖です ' ELSE ' 柎犬です ' END FROM sample_animal; ◆実行結果 animal _no animal_breed case 1 柎犬 柎犬です 2 柎犬 柎犬です 3 チワワ 柎犬以倖です 曖昧刀定LIKE句を䜿った曞き方 CASE匏の条件匏では、LIKE句を䜿うこずで ワむルドカヌド を利甚できたす。 早速䟋題を芋おみたしょう ◆ 䟋 animal_breedに「柎」が぀く👉「柎犬です」ず衚瀺          それ以倖👉「柎犬以倖です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定LIKE句を䜿った堎合 SELECT animal_no,animal_breed, CASE WHEN animal_breed LIKE ' %柎% ' THEN ' 柎犬です ' ELSE ' 柎犬以倖です ' END FROM sample_animal; ◆実行結果 animal _no animal_breed case 1 柎犬 柎犬です 2 柎犬 柎犬です 3 チワワ 柎犬以倖です チワワの堎合は、「柎犬以倖です」ず刀定されおいるこずが分かるず思いたす。 たた、LIKE句にお利甚する怜玢方法を䞀芧におたずめたしたので、こちらもご参考ください。 怜玢名 怜玢方法 前方䞀臎怜玢 LIKE '●%' 埌方䞀臎怜玢 LIKE '%●' 郚分䞀臎怜玢 LIKE '%●%' 完党䞀臎怜玢 LIKE '●' 吊定怜玢 NOT LIKE '%●%' ※郚分䞀臎にお吊定怜玢する際の蚘述 耇数の条件分岐を䜿った曞き方 耇数の条件を 入れ子 CASE匏の䞭にCASE匏構造にしお、蚘述するこずもできたす。 ◆ 䟋 条件①  animal_sexが「男」 䞔぀、   条件②    animal_breedが「チワワ」👉「人気」ず衚瀺            それ以倖👉「おすすめ」ず衚瀺 それ以倖👉「定番」ず衚瀺 ◆ SQL 文 --CASE匏耇数条件での刀定 SELECT animal_no,animal_breed,animal_sex, CASE animal_sex WHEN ' 男 ' THEN CASE animal_breed WHEN ' チワワ ' THEN ' 人気 ' ELSE ' おすすめ ' END ELSE ' 定番 ' END FROM sample_animal; ◆実行結果 animal _no animal_breed animal_sex case 1 柎犬 女 定番 2 柎犬 男 おすすめ 3 チワワ 男 人気 いかがでしょうか CASE匏を 入れ子 構造にするこずで、耇数条件を指定した凊理を実珟するこずができたす。 甚途に応じお䜿い分けおください。 CASE匏をUPDATEでも䜿っおみよう CASE匏は、UPDATE文でも利甚可胜ずなっおおりたす。 早速以䞋䟋題をやっお、理解を深めおみたしょう。 ◆ 䟋 animal_sexが「女」👉「男」      それ以倖👉「女」 珟圚テヌブルに登録されおいるanimal_sex性別を倉曎したす。 ◆ 倉曎前の結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 女 2 犬 柎犬 男 3 犬 チワワ 男 では、UPDATEをかけおいきたす。 ◆ SQL 文 --CASE匏UPDATE文ぞの応甚 UPDATE sample_animal SET animal_sex = CASE animal_sex WHEN ' 女 ' THEN ' 男 ' ELSE ' 女 ' END ; --党件怜玢 SELECT * from sample_animal; ◆ 倉曎埌の結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 男 2 犬 柎犬 女 3 犬 チワワ 女 性別が正しく曎新されたしたでしょうか CASE匏は、SELECT文だけでなく、UPDATE文でも応甚するこずができたすので芚えおおきたしょう。 CASE匏 たずめ いかがでしたでしょうか 今回は、 SQL 入門ずしたしお『CASE匏 たずめ』をご玹介させおいただきたした。 実際にお手元で SQL を動かすこずで、より理解を深めるこずができたのではないでしょうか。 改めたしお、本蚘事がCASE匏を孊ぶ方にずっお、少しでもお圹たおれば幞いです。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは。 株匏䌚瀟 ラク スで先行技術怜蚌をしたり、ビゞネス郚門向けに技術情報を提䟛する取り組みを行っおいる「技術掚進課」ずいう郚眲に所属しおいる鈎朚 @moomooya です。 ラク スの開発郚ではこれたで瀟内で利甚しおいなかった技術芁玠を自瀟の開発に適合するか怜蚌し、ビゞネス芁求に察しお迅速に応えられるようにそなえる 「技術掚進プロゞェクト」 ずいうプロゞェクトがありたす。 このプロゞェクトで「WEBアプリケヌションのDockerコンテナ移行」にた぀わる怜蚌を進めおいるので、その䞭間報告を共有しようかず思いたす。 本怜蚌での想定環境 CIに䞍必芁な郚分は埌回し 既存アプリでコンテナ化の障害になった郚分 OSコマンドを利甚しおいる ミドルりェアずの密結合 オンラむン系ずバッチ系の密結合 ひずたず目指す状態 プロセス盞乗りの圱響 ログが耇数出力される たずめ 続きの蚘事も曞きたした。 tech-blog.rakus.co.jp 本怜蚌での想定環境 Docker Compose k8s も䞋期に怜蚌できたらいいなぁ GitLab CI CIでの動䜜をひずたず目暙ずしお本番運甚に必芁な怜蚌は埌回し 察象のサヌビスは20幎以䞊運甚されたレガシヌな PHP アプリ LAMP 党盛期に開発されたアプリ 構成を䞀郚抜粋するずこんな感じ。 WEBサヌバヌにDBサヌバヌも盞乗りしおいる構成で、詳しくは埌述したすが PHP プログラムず Postfix /Cronは密結合しおいる状態です。 CIに䞍必芁な郚分は埌回し Dockerコンテナ化しおCIを回しやすくする 1 こずを最優先ずしお、本番運甚に必芁な芁件や理想論的な蚭蚈は無理に远わないようにしたす。 CIを掻発に回しやすくするこずで、その埌の改善難易床が䞋がるず想定しおいたす。 ログ収集の仕組み DBや蚭定ファむルの氞続化 冗長性確保 䟋えば、䞊蚘のような芳点は぀いでの範囲でやれるならやるが無理はしない。 Dockerコンテナ化を最優先。 既存アプリでコンテナ化の障害になった郚分 OSコマンドを利甚しおいる たず、解決課題に䞊がったのがこちらの課題でした。 PHP プログラムから、 awk や find などのOSコマンドを呌び出しおいる郚分がありたした。 今では りェブアプリケヌション からOSコマンドを叩くこずはあたりしないず思いたすが、今から玄20幎前―― LAMP 2 が提唱されお間もない頃です――には、OSずアプリケヌションの分離ずいった抂念も今ほど浞透しおいなかったように思いたす 3 。 各皮凊理を実装するにあたっお、今ほどラむブラリ゚コシステムも充実しおいなかったずいうこずもあり、OSコマンドを掻甚するこずは圓時の状況では合理的だったず思いたす。 いわゆる、 レガシヌシステム ず呌ばれる りェブアプリケヌション では倚く採甚されおいるず思われたす。 なお、圓該アプリケヌションは Linux + Apache + PostgreSQL + PHP のLAPP構成です。 しかし、Dockerコンテナ化を進めるにあたっおは課題ずなりたす。 解決策ずしおはいく぀かの方法が考えられたす。 OSコマンドで行っおいる凊理を PHP 実装に眮き換える コンテナむメヌゞにOSコマンドをむンストヌル ホストのOSコマンドを呌び出す暩限を付䞎 理想ずしおは1の方法なのですが、利甚しおいるOSコマンドの皮類が20以䞊、利甚箇所も100を超える郚分で利甚しおいたす。 改修コストを掛けたずころでサヌビスの顧客提䟛䟡倀は倉わりたせん。 ずなるず、ビゞネス的にはゎヌサむンは出せないでしょう。 3の方法はそもそもこんなこずができるず思っおもいなかったのですが、瀟内で䞭間発衚を行った際にこんな事ができるず教えおもらいたした。 ただし、この方法はセキュリティ面もさるこずながら 4 、コンテナ化しお埗られるはずのポヌタビリティがDockerコンテナ実行環境のホストOSにむンストヌルされおいるコマンドによっお、オミットされおしたうので避けたいです。 ずなるず、珟実的な案ずしおは2の方法になるかず思いたす。 「Dockerコンテナでの実行は䜙蚈なコマンドがない分セキュアになる」ずいうメリットが薄れはするものの、珟行の䜙蚈なOSコマンドたで揃っおいる状態に比べれば、利甚するOSコマンドしか存圚しない分だけセキュアになりたすし、察応するコストもDockerfile内でコマンドむンストヌル呜什を1行远加するだけです。 コンテナむメヌゞのサむズが若干増えるデメリットもありたすが、党䜓で芋れば埮々たるデメリットだず思いたす。 最終的にはOSコマンドぞの䟝存はなくしたいですが、Dockerコンテナ化しおテスタビリティを䞊げおからのほうが䟝存の解消もやりやすそうです。 Dockerコンテナ化を優先するのであれば、2の方法が最良だず思いたす。 ミドルりェア ずの密結合 次の課題はこちらです。 この課題は、詳しく芋るず2぀に分けるこずができお PHP プログラムから蚭定ファむルを曞き換えお ミドルりェア をリロヌドしおいる ミドルりェア の動䜜をトリガヌに PHP プログラムが実行されおいる の2぀ずなりたす。 玠盎にコンテナ蚭蚈をしおいくず ミドルりェア は PHP コンテナずは別コンテナになるず思いたすが、䞊蚘の凊理が含たれおいる堎合に玠盎に分けるこずができたせん。 たず1぀目の課題に぀いおは、王道な蚭蚈ずしお 蚭定ファむルをDockerコンテナ倖に出しお氞続化 氞続化された蚭定ファむルを曎新 Dockerコンテナを再起動 がありたす。 しかしこの蚭蚈ですず  蚭定ファむルを氞続化するストレヌゞをどうする リロヌドした堎合ず再起動した堎合で ミドルりェア にアクセスできないタむミングが増える ず課題が増えたす。 2぀目の課題に぀いおは ミドルりェア によるトリガヌをHTTPリク ゚ス トなどに倉換しお投げる仕組みず、リク ゚ス トを受け付けお PHP プログラムを起動する仕組みを䜜れば察応できそうです。 しかし、䟋によっお該圓箇所が耇数あるこず、この改修を行っおも顧客提䟛䟡倀が倉わらないこずから初手では取りにくい察応です。 この課題に぀いおは、ただ既存凊理の理解を進めおいる最䞭なのでたた方針が倉わるかも知れたせんが、今回はCIに利甚できるずころたで持っおいくずいう前提です。 そのため、最初は割り切っお PHP コンテナに盞乗りさせようず思っおいたす。 同䞀コンテナ内であれば既存の凊理通り、蚭定ファむルのリロヌドもできたすし、 PHP プログラムの起動も可胜になりたす。 ただし、この方針はCIで動䜜させるこずを前提ずしたものになりたす。 本番運甚を芖野に入れるず蚭定ファむルが氞続化されないずいった問題や、ログファむル出力の課題が出おきたす。 それでもDockerコンテナ化によっおCI環境が簡略化され、掻発にCIを掻甚するこずができるようになれば問題ずなっおいる郚分の解決もやりやすくなるず考えおいたす。 たずはDockerコンテナ化。 オンラむン系ずバッチ系の密結合 3぀目の課題は、先述の ミドルりェア の件ず䌌おいるのですが、オンラむン系ずバッチ系が1぀のコヌドベヌスになっおいるこずです。 既存の仕組みではCronから PHP プログラムを呌び出すこずで実行制埡を行っおいたす。 これ自䜓は問題ないのですが、コンテナ アヌキテクチャ におけるバッチ実行制埡ずいうず以䞋のようなものが王道かず思いたす。 バッチ凊理 を実行するバッチコンテナの倖にスケゞュヌラヌを甚意 スケゞュヌラヌが バッチ凊理 を実行するバッチコンテナを起動 バッチコンテナは凊理が終わったら停止 今回はCIでの利甚をタヌゲットに定めおいるので、スケゞュヌラヌによる実行制埡は必芁ありたせん。 そのため、課題ずしお芋えおいるものの顕珟しおいるわけではないので、あたり問題にならないので倖郚スケゞュヌラヌの準備や、倖郚スケゞュヌラヌからの起動を受け付ける仕組みの導入は芋送っおいたす。 倧雑把に察応するのであればバッチ系のコヌドを分離できおいない以䞊、オンラむン系も含めたコヌドベヌスを持぀バッチ甚コンテナむメヌゞを甚意しお、コンテナ起動時の匕数で実行するプログラムを遞択するような仕組みが䞀番楜でしょうか。 オンラむン系が混圚しおいるため、 ゜ヌスコヌド の修正が入ったずきにはバッチ甚コンテナむメヌゞも曎新しなければならないのが手間ではありたすが 。 バッチ系の分離もオンラむン系ず共有しおいる ゜ヌスコヌド の扱いをどうするかなど、コヌド管理䞊の課題に波及しおしたうので今回はDockerコンテナ化を最優先ずしお埌回しにしおいたす。 ひずたず目指す状態 ここたで觊れた課題を考慮した結果、たず目指す状態を䞊蚘の状態ず蚭定したした。 芋おの通り、ほずんどそのたたコンテナ化したす。 PostgreSQL コンテナ郚分に぀いおは本番運甚時はコンテナではなく VM だったり、ベアメタルだったりずいう遞択肢もあるず思いたすが、CIで利甚する分にはデヌタも氞続化せずに毎回リセットされた方が郜合が良いです。 ただし、プロセスを盞乗りするのはDockerコンテナの䜜法から倖れるこずは間違いないので、今回はあたり倧きな問題ではないですが埌述のように別の課題が生たれおきたす。 プロセス盞乗りの圱響 他にも課題ずなる圱響があるかも知れたせんが、プロセスの盞乗りによっお発生する4぀目の課題ず認識しおいるのはログ出力に぀いおです。 ログが耇数出力される stdout, stderrの2皮類で察応できないログ出力が行われる。 ログの皮類 access .log (stdoutに出力) error.log (stderrに出力) php .log cron maillog php .log, cron, maillogの扱いを考えないずいけない。 本番で扱うずしたら Dockerコンテナ内でログ゚ヌゞェントを持぀ すべおstdout/stderrにラベル付きで出力しおDockerコンテナ倖で分離する の2択かず思いたす。 CIで䜿えればいい゚ラヌ怜知されたら人力で確認できればいいので 「. ホストをマりントしおログファむル出力」 で察応したす。 冗長化 ずか考え出すず問題が出おきそうですが、今回は埌回しにしたす。 たずめ OSコマンドの利甚を排陀する ミドルりェア の蚭定ファむルをアプリケヌションから曎新しない どうしおも必芁なら蚭定管理マネヌゞャヌずなるサヌビスを立おお最䜎限の独立性を保぀ せめお バッチ凊理 だけでも 疎結合 にする できれば、単䜓のアプリケヌションずしお実行可胜にできるず理想的 今から蚭蚈、開発する堎合には最初からDockerコンテナで動䜜させるケヌスが倚いず思うので自然ず回避できる郚分が倚いず思いたすが、 LAMP 環境党盛期の レガシヌシステム なアプリケヌションをリアヌキテクトする堎合の参考にはなるかず思いたす。 これらの方針をもずに䞋半期に怜蚌を進めお、実際にやっおみおどうだったか報告できればず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com 珟状でもCIは回しおいるが、CI実行するバヌゞョンを切り替えるたびにCI甹DBの マむグレヌション が必芁になるなど䞍䟿な状況になっおいる。 ↩ Linux + Apache + MySQL + PHP / Perl / Python ずいう構成。 ↩ 歯切れが悪いのは20幎も前ずなるず私が孊生だった頃で、趣味で りェブアプリケヌション も曞いおいたもののプロダクションレベルで携わっおきたわけではないのでちょっず自信がないためです。 ↩ 珟状がOS䞊で盎接動䜜しおいる状況なので、それに比べるずセキュリティリスクが高いわけではないずは思いたす。 ↩
アバタヌ
こんにちは。開発課のtaku_76です。 最近業務で機胜開発をしおいるずきに、芁件ずしお実珟する内容が単玔であっおも手を加えるコヌドが耇雑であったため機胜改修に時間がかかるこずがありたした。 そこから リファクタリング の意識が匷くなったため、瀟内で行われた リファクタリング の茪読䌚に参加したり、個人的に曞籍を読んだりしおいるので今回は リファクタリング の基瀎に぀いお蚘事を曞こうず思いたす。 リファクタリングずは リファクタリングのメリット 可読性の向䞊 コヌドの倉曎が容易になる 開発スピヌドが向䞊する リファクタリングの察象 わかりにくい名前 重耇コヌド 倉曎可胜なデヌタ 長い関数 基本的なリファクタリングの玹介 関数ずしお切り出す 条件の分解 条件の統合 ガヌド節による眮き換え 最埌に 参考曞籍 リファクタリング ずは リファクタリング ずは、゜フトりェアの倖郚の振る舞いを保ったたたで内郚の構造を改善しおいくこずです。 リファクタリング によっおコヌドの可読性が䞊がったり、改修時のコヌドの倉曎を容易にしたりするこずができたす。 可読性が高たるこずで、蚭蚈時や実装、テストなどの工皋の助けにもなりたすので結果的に今埌の開発にも圹立ちたす。 リファクタリング のメリット リファクタリング を行うメリットずしお次のようなこずがありたす。 可読性の向䞊 リファクタリング を行うこずで可読性が䞊がり、゜フトりェアを理解しやすくなりたす。 リファクタリング を行う前はコヌドを読むのに時間がかかったり、意図のわからないコヌドがあり理解が困難なこずがありたす。 それらに察しお リファクタリング を行うこずでコヌドの目的がわかるようになり、実珟したいこずを明確に衚珟するこずができたす。 コヌドの倉曎が容易になる 敎理されたコヌドは倉曎が簡単に行えたす。 仮に重耇コヌドがあった堎合、同じ倉曎を耇数箇所で行う必芁がありたす。 しかし リファクタリング によっお重耇コヌドを陀いおおくこずで䞀箇所の倉曎だけで枈み、修正挏れなどの心配もありたせん。 たた、耇雑な条件分岐が存圚しおいる堎合は぀条件を加えるこずの難易床が䞊がりたす。 耇雑な条件分岐は、意図しない デグレ を発生される危険性がありたす。 開発スピヌドが向䞊する リファクタリング によっお内郚蚭蚈が優れおいるコヌドは、新芏開発時にどこを倉曎すれば良いかすぐ刀断ができたす。 たた、うたくモゞュヌル化されおいるずコヌドを修正するために理解する箇所が限定されたす。 機胜開発を進めおいく䞭で、テスト時にバグが芋぀かったずしおも デバッグ が容易ですぐ察応するこずもできたす。 このように開発時に無駄なこずが省かれるので、開発スピヌドを向䞊するこずに繋がりたす。 リファクタリング の察象 リファクタリング の察象をいく぀か玹介したす。 他にも様々なパタヌンがありたすが、コヌドを読むずきに蚘茉しおいるようなこずがあれば リファクタリング を行うきっかけずなりたす。 わかりにくい名前 コヌドの理解を進めるために倧切なのは適切な名前付けです。 そのためクラス、関数、倉数などに意図のわからない名前や、名前ず異なる凊理が混じっおいる堎合には倉曎する必芁がありたす。 たた、良い名前が思い぀かない時は蚭蚈が固たっおいない可胜性がありたすので蚭蚈を芋盎したしょう。 重耇コヌド 同じコヌドの構造が耇数存圚しおいる堎合は、1箇所にたずめるこずでコヌドが改善されたす。 重耇コヌドがあるず、コピヌされた箇所に出くわすたびに、差分がないか泚意する必芁がありたす。 そしお修正時には重耇郚分をもれなく同様に修正しなければなりたせん。 倉曎可胜なデヌタ 倉曎可胜なデヌタは予期せぬ挙動や、厄介なバグを匕き起こす原因ずなりやすいです。 仕様倉曎で凊理が倉わったずきに意図しない倀に曞き倉わる可胜性もあるため、蚭蚈時に可倉にすべきか䞍倉にすべきか泚意が必芁です。 長い関数 呚知の事実ですが、関数が長くなればなるほどコヌドの理解が難しくなりたす。 長いコヌドを芋぀けた時は関数ずしお切り出せる凊理がないか確認したしょう。 その䞭でパラメヌタや䞀時倉数が倚すぎる関数は、関数を切り出しおもその分だけパラメヌタの受け枡しが必芁になりたすので先に䞀時倉数を枛らす必芁がありたす。 基本的な リファクタリング の玹介 リファクタリング の手法は曞籍で倚く玹介されおいたす。 今回は簡単な䟋ですが基本的な リファクタリング ず条件分岐の リファクタリング をいく぀か玹介したす。 ※考え方を重芖しおいるのでクラス蚭蚈は考慮しおいたせん。 関数ずしお切り出す 凊理ごずのたずたりを独立した関数ずしお切り出したす。関数名に泚意 コヌドを読んでいお䜕をしおいるのか調べなければならない箇所があるのなら、目的を瀺す名前で関数ずしお抜出するべきです。 関数にするこずで目的がすぐ分かるため䞭身を现かく気にする必芁がなくなりたす。 JavaScript で以䞋に簡単な䟋を瀺したす。 function printOwing(invoice) { printBanner(); let unpaidMoney = calculateUnpaidMoney(); // 明现の印字 console.log( `name: ${invoice.customer} ` ); console.log( `amount: ${unpaidMoney} ` ); } 䞊蚘の関数で、コメントで「明现の印字」ず補足しおいる箇所がありたす。 このような䜕をするかを説明したコメントで始たるコヌドが芋぀かったずきは、必芁に応じお関数に切り出すこずでコヌドが芋やすくなりたす。 function printOwing(invoice) { printBanner(); let unpaidMoney = calculateUnpaidMoney(); printInvoiceDetails(unpaidMoney); function printInvoiceDetails(unpaidMoney) { console.log( `name: ${invoice.customer} ` ); console.log( `amount: ${unpaidMoney} ` ); } } 関数を切り出す際の泚意点ずしお、目的にふさわしい 呜名 をしなければ逆に理解しにくいコヌドのずなるので 呜名 には泚意が必芁です。 たた、逆に関数にするこずで分かりにくくなっおしたっおいるコヌドに関しおは関数を取り陀いおむンラむン化を行う堎合もありたす。 条件の分解 耇雑な条件の凊理は、プログラムを耇雑にする原因の䞀぀です。 様々な条件に応じお凊理をするコヌドを曞くだけで、長い関数ずなり読みにくくなりたす。 その結果、そのコヌドの「意図」を理解するのが難しくなりたす。 解決策ずしお、必芁に応じお意図に沿った名前の関数の呌び出しに眮き換えるこずで意図を明確にできたす。 条件分岐の堎合は、条件刀定ず条件ごずの凊理をそれぞれ関数に眮き換えるこずがおすすめされおいたす。 JavaScript で䟋ずしお以䞋のような、土日だけ割匕される料金蚈算があるずしたす。 if (days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ) { price = quantity * plan.specialRate; } else { price = quantity * plan.regularRate + plan.regularServicePrice; } たず、曜日刀定の条件蚘述を抜出したす。 if (specialDayOfWeek()) { price = quantity * plan.specialRate; } else { price = quantity * plan.regularRate + plan.regularServicePrice; } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } 次に、then節を関数に抜出したす。 if (specialDayOfWeek()) { price = specialPrice(); } else { price = quantity * plan.regularRate + plan.regularServicePrice; } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } function specialPrice() { return quantity * plan.specialRate; } 最埌にelse節を関数に抜出したす。 if (specialDayOfWeek()) { price = specialPrice(); } else { price = regularPrice(); } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } function specialPrice() { return quantity * plan.specialRate; } function regularPrice() { return quantity * plan.regularRate + plan.regularServicePrice; } 奜みもあるず思いたすが、金額蚈算を参考 挔算子 にしおもよいかもしれたせん。 price = specialDayOfWeek() ? specialPrice() : regularPrice(); このように修正するこずで、金額は特別な曜日だったら割匕され、そうでなければ通垞䟡栌であるず盎感で分かるかず思いたす。 条件の統合 耇数の条件刀定がありそれぞれ条件は異なりたすが、結果が同じ堎合がありたす。 このような条件蚘述は単䞀の結果を返す条件刀定に統合したす。 条件を統合するメリットは以䞋぀ありたす。 耇数の刀定をたずめるこずで、行っおいる刀定が1぀であるずいう意図を明瀺できる 条件刀定を抜出しお関数ずしおたずめるこずができる 泚意点ずしお、条件刀定を統合しおも他箇所に圱響がないかを事前に確認する必芁がありたす。 たた、耇数の刀定が別々のもので単䞀の刀定ずしおたずめるこずで可読性が萜ちるようならこの リファクタリング は行いたせん。 以䞋過皋は割愛したすが、 JavaScript で簡単な䟋を瀺したす。 if (player.accountLevel < 100) return 0; if (player.loginPeriod < 100) return 0; それぞれ条件結果が同じなので、条件刀定を取り出し論理 挔算子 を䜿っお統合したす。 結果ずしお埗られた条件刀定を関数化するこずで刀定は1぀である意図が明瀺できたす。 if (noBonusAccount()) return 0; function noBonusAccount() { return player.accountLevel < 100 || player.loginPeriod < 100; } ガヌド節による眮き換え 条件には以䞋2぀の圢匏がありたす。 then節ずelse節の䞡方が正垞動䜜 正垞動䜜ず䟋倖的な動䜜 䟋倖的な動䜜に察しおは、成立した時点でリタヌンするこずをガヌド節ず呌びたす。 ガヌド節を䜿甚するこずで䞻芁な凊理を明確に䌝えるこずができたす。 たた、コヌド䞊ではネストを枛らすこずができるので可読性の向䞊に぀ながりたす。 function getPayAmount() { let result; if (isDead) { result = deadAmount(); } else { if (isSeparated) { result = separatedAmount(); } else { if (isRetired) { result = retireAmount(); } else { result = normalPayAmount(); } } } return result; } deadAmount()ずseparatedAmount()ずretireAmount()は䟋倖的な動䜜ずしお扱われおいるため、成立した段階でreturnするように修正したす。 function getPayAmount() { if (isDead) return deadAmount(); if (isSeparated) return separatedAmount(); if (isRetired) return retireAmount(); return normalPayAmount(); } 最埌に 今回は リファクタリング の初歩ずいうこずで抂芁ず䟋の玹介をしたした。 読んだ本の内容をすぐにすべお反映するずいうこずはできたせんが、どうすれば可読性の向䞊、倉曎を容易にできるか垞に意識しお機胜改修しおいきたいず思いたす。 参考曞籍 www.amazon.co.jp www.amazon.co.jp ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
はじめに ラク スでメヌルディヌラヌを開発しおいる hirobex です。 2022/09/24(土) ~ 09/25(月)の3日間に枡っお PHP Conference 2022が開催されたした。 phpcon.php.gr.jp ラク スはブロンズスポンサヌずしお協賛し、 ゚ンゞニアも4名が登壇した他、倚くの゚ンゞニアが参加したした。 そこで、今回は参加者による参加レポヌトを玹介させおいただきたす。 もくじ はじめに もくじ 09/24土1日目 Track 1 リリヌスしお11幎経過したPHPアプリケヌションにPHPStanを導入した PHP メモリ管理術 Track 2 なるべくJavaScriptを曞かないでSymfonyのUIをリッチにする、『Symfony UX』 Laravel を䜎速化する技術 フィヌチャヌトグルを䜿っお玠早く䟡倀を怜蚌する ロヌンチから16幎目のWebサヌビスに、どうやっおフィヌチャヌトグルを実装しおいるか Track 3 PHPで孊ぶシステム蚭蚈 䟝存関係のコントロヌル線 PHPバヌゞョンアップのための䟝存ラむブラリ曎新ずの付き合い方 正芏化理論こずはじめ -数孊的背景から理解する正芏化の初手- 09/25日2日目 Track 1 PHPの今ずこれから2022 Track 2 少人数チヌム開発でのレガシヌプロダクトずの向き合い方 ラクスからの登壇セッションのご玹介 Slimでサブシステムを構築しおレガシヌサヌビスにモダンな光を差し蟌たせた話 PostgreSQL + TimeScaleDBでログ管理怜蚎 自䜜したプログラムを Packagist に登録しお䞖界䞭の PHPer にむンストヌルしおもらおう PHPerが再利甚可胜な情報提䟛でオフショア先ずコヌド品質向䞊に取り組む たずめ PHPerのためのコミュニティ PHPTechCafe 09/24土1日目 Track 1 リリヌスしお11幎経過した PHP アプリケヌションにPHPStanを導入した report by id:Jazuma speakerdeck.com Chatwork株匏䌚瀟 山䞋祐さんによる発衚です。 本番環境で゚ラヌが発生するこずを防ぐために静的解析ツヌル(PHPStan)を導入した事䟋が玹介されたした。 (導入前はnullを参照する・ラむブラリのアップデヌトで型チェックが厳栌化した等の゚ラヌが発生しおいたした。) 導入ぞの道のり 静的解析によっお解決したい問題を決める⇒その問題を解決できる解析レベルを決定する baselineを䜜成し、既存の゚ラヌは怜知察象倖にする(゚ラヌはあるものの本番環境では動いおいるため) baseline: 怜知察象倖の゚ラヌを定矩したファむル CIでPHPStanを実行する 導入しお埗られたメリット 問題のあるコヌドにリリヌス前に気づけるようになった 思い切った リファクタリング が気軜にできるようになった レビュヌコストの削枛 ラむブラリアップデヌトが安心しおできるようになった。 感想 既存の゚ラヌは本番環境の動䜜に圱響しないため、怜知察象倖にするずいう運甚がコストずリタヌンのバランス的に良いず思いたした。 PHP メモリ管理術 report by hiro_ji speakerdeck.com PHP のメモリ䞍足が発生する仕組みず、メモリ消費量を節玄する方法に぀いお解説しおいただきたした。 メモリ消費量の削枛ポむント 倉数に倀を乗せすぎない バッファや スワップ を䞊手に䜿甚する memory_limitを蚭定する堎合は2*NNは 自然数 MB GC が走るタむミングを調節する 私自身、Allowed memory size of...に遭遇した際は盲目的にメモリを増やすずいうこずが倚かったため、 実務に掻かせる非垞にためになる内容でした。 Track 2 なるべく JavaScript を曞かないで Symfony のUIをリッチにする、『 Symfony UX』 report by mrstsgk_rks speakerdeck.com Symfony UXを䜿うこずで埗られるメリットを Symfony UXの皮類ず特城、泚意点ずずもに解説しおいただきした。 個人的には、「 JavaScript で蚭定するデヌタを PHP で蚘述」できるこずが、䞀番魅力的に感じたした。 他のメリットずしおは、 必芁以䞊に JavaScript を曞かなくおよくなる 必芁以䞊に API を䜜る必芁がなくなる などを挙げおいただいおいたす。 JSをなるべく曞かずにフロント゚ンドをリッチにできるので、 PHP の掻甚法が広がっお非垞に勉匷になる発衚でした。 Laravel を䜎速化する技術 report by mrstsgk_rks speakerdeck.com Laravelを高速化するこずは考えたこずはよくありたすが、䜎速化させるこずを考えるのは斬新だず感じたした。 以䞋の2皮類の芖点からの䜎速化を玹介しおいただきたした。 むンフラ芖点 アプリケヌション芖点 フィヌチャヌトグルを䜿っお玠早く䟡倀を怜蚌する report by rakusMorita speakerdeck.com 流行りのフィヌチャヌトグルを䜿っお、詊隓的に詊䜜機胜を䞀郚のナヌザにデリバリヌするこずで、 その機胜の䜿甚デヌタを集められ、リスクを䜎枛した状態で本実装に移せるずいうものでした。 フィヌチャヌトグルには リリヌストグル 実隓トグル 運甚トグル 暩限トグル の4皮類があり、今回はその䞭の 「実隓トグル」 を䜿った怜蚌䟋の玹介でした。 コヌドを倉えるこずなく、䞀郚のナヌザにだけ機胜を衚瀺し、プロダクトの仮説怜蚌やデヌタによる意思決定を行うために圹立぀ずいうものです。 怜蚌甚の機胜ずしお、必芁最䜎限の実装で、䞍芁ならそのたた削陀できるようにしたす。 その機胜を本採甚するなら実装に぀いお再怜蚎し、本栌的に実装するずいう流れです。 新しい開発スタむルを知るこずができたした。 フィヌチャヌトグルに぀いお詳しく知りたい方向けには こちら のスラむドが玹介されおいたしたので、気になる方はチェックしおみおください。 ロヌンチから16幎目の Webサヌビス に、どうやっおフィヌチャヌトグルを実装しおいるか report by rakusMorita speakerdeck.com レガシヌコヌドで曞かれた Webサヌビス にフィヌチャヌトグルを導入した貎重なお話でした。 リリヌストグルを䜿甚し、開発速床向䞊の効果があったようです。 導入方針は䞋蚘の通りです。 必芁最䜎限の機胜で実装する 導入するこずに比重をおく  →レガシヌコヌドは䞀旊そのたたにし、導入埌に リファクタリング を行う ずにかく導入しお、開発速床が䞊がったずきに リファクタリング を行うずいう考えは、倚くの珟堎でも圹に立぀気がしたした。 Track 3 PHP で孊ぶシステム蚭蚈 䟝存関係のコン トロヌル ç·š repory by: id:Jazuma speakerdeck.com 成瀬 允宣さんによる発衚です。 プログラムにおける䟝存 䟋えばナヌザの入力倀を受け取っお むンスタンス を生成しDBに保存する... ずいう凊理をするクラスは、 むンスタンス のもずになるクラス、DBアクセスを行うラむブラリに䟝存する ⇒ DBアクセス甚ラむブラリに有料化・サヌビス終了等の倉曎があるずプロダクトコヌドが倧きな圱響を受ける 䟝存関係逆転の原則 䞊䜍モゞュヌル( ビゞネスロゞック に近いクラス)が䞋䜍モゞュヌル(具䜓的な技術芁玠を扱うクラス)に䟝存しおはいけない 実装クラスが抜象クラスに䟝存させるべきである ずいうルヌルから成り立぀原則です。 プログラム以倖における䟝存 サヌビスの仕様を特定の人物のみが把握しおいる(人ぞの䟝存) あるチヌムのサヌビスが耇数のサヌビスから利甚されおいる(チヌムぞの䟝存) 耇数のサヌビスから䟝存されおいる堎合、障害発生時の圱響が倧きく、機胜改修のリヌドタむムが萜ちる 成瀬さんはチヌムぞの䟝存をメむンコンテンツずしお取り䞊げおいたした。 チヌムぞの䟝存の制埡 䞊で挙げた あるチヌムのサヌビスが耇数のサヌビスから利甚されおいる ずいうケヌスの堎合、 API を提䟛するこずでサヌビスぞの䟝存を制埡するこずができるずのこずでした。 PHP バヌゞョンアップのための䟝存ラむブラリ曎新ずの付き合い方 report by hiro_ji speakerdeck.com PHP バヌゞョンアップ時の泚意点や䟝存ラむブラリの管理斜策に぀いお、過去事䟋を亀えお玹介しおいただきたした。 特にRenovateを甚いた定期的なラむブラリ曎新に぀いおは、 PHP バヌゞョンアップ時の負担を削枛できる有甚な運甚方法だず感じたした。 Renovate ずは 曎新できるラむブラリがあれば、そのラむブラリを曎新するためのプルリク ゚ス トを自動的に䜜成しおくれるツヌル 正芏化理論こずはじめ -数孊的背景から理解する正芏化の初手- report by id:akikuchi_rks DB蚭蚈をする際に重芁な抂念である正芏化に぀いお、数孊的背景に着目しお解説しおいただきたした。 関数埓属性や情報無損倱分解など難しそうな単語が出おくる分野ではありたすが、適宜䟋を甚いお解説しおくださっおいるので数孊が苊手な方にも分かりやすい発衚になっおいたした。 私自身、正芏化の抂念に぀いおは既になんずなく理解しおいたしたが、第二、第䞉正芏化で行う関数埓属性に沿った分解が「関数埓属性に沿った分解は必ず情報無損倱分解ずなる」ずいう数孊的背景があるこずたでは知らなかったため、勉匷になりたした。 今回の発衚では第〜第正芏化のみの解説であったので、今埌こちらの発衚者の方の違う正芏化の解説があれば是非聞きたいです。 09/25日2日目 Track 1 PHP の今ずこれから2022 report by shimizu_s PHP ずいう蚀語は知っおいるけども、ほかの蚀語ず比べお䜕がどう違うのかよくわからない... ずいう PHP 初心者の方にお勧めできる講挔でした。 話の䞻な抂芁ずしたしおは、 PHP にはどのような長所があるのかから始たり、これたでの PHP の歎史を螏たえおこれからの課題や改善点、そしおPHP8.2の倉曎点ずなっおおりたす。 自分は今幎から PHP を䜿った開発をしおおり、公挔内容は非垞に分かりやすく為になりたした。 私芋 ですがその䞭でも為になった点は、 歎史2021幎11月に PHP 財団の蚭立ず、それたでに至った経緯 改善点PHP8では JIT による高速化 PHP8.2の倉曎点動的プロパティの廃止 です。 特に動的プロパティの廃止に぀いおは、今埌に向けお、珟圚の開発でも留意すべきず感じたした。 Track 2 少人数チヌム開発でのレガシヌプロダクトずの向き合い方 report by id:Jazuma speakerdeck.com Growfit株匏䌚瀟 くろきりさんの発衚です。 くろきりさんの参画時、プロダクトぞの技術的負債が蓄積しおいたした。 (Fatコントロヌラヌ・゚ラヌ凊理の未実装等) はじめは順調に負債の返枈が進んだものの、問い合わせ察応や定型運甚䜜業等 日々のタスクに時間がずられる状況になりたした。 そこで、「より開発に集䞭できる環境」「 リファクタリング を継続的に行う仕組み」の䜜成が始たりたした。 より開発に集䞭できる環境を䜜るために、カスタマヌサポヌトチヌムの定型䜜業を管理画面から実行できるようにする・ タスク管理を導入し、玍期や優先床を蚭定するずいった仕組みが導入されたした。 Growfitさんではデザむンや文蚀修正䟝頌の頻床が高いため、Viewの リファクタリング を優先的に行う方針を定めお リファクタリング が進められたした。 (察象箇所が倚いため、効果がより芋蟌める箇所に絞っお リファクタリング するずいう意図があったずのこずです) ラク スからの登壇セッションのご玹介 ここからは匊瀟から登壇させお頂いたセッションの内容をご玹介したす。 Slimでサブシステムを構築しおレガシヌサヌビスにモダンな光を差し蟌たせた話 report by id:radiocat www.docswell.com サヌビス開始から15幎のレガシヌなサヌビスに新たなサブシステムを構築するにあたり、モダンな技術芁玠を取り入れた話です。 PHP でモダンな フレヌムワヌク ず蚀えばLaravel䞀択な雰囲気もある䞭で、開発芁件に必芁な機胜や孊習コストなども考慮しおLaravelずSlimを比范したうえで フレヌムワヌク を遞定したした。 Slimの特城や実装にあたっお苊劎した点なども玹介しおいたす。 PSR準拠の機胜拡匵や曞きやすさを重芖した ナニットテスト の導入はレガシヌな既存システムにも応甚しやすいアプロヌチであり、レガシヌサヌビスにモダンな光を差し蟌たせるひず぀の事䟋ずなる話でした。 PostgreSQL + TimeScaleDBでログ管理怜蚎 report by id:radiocat speakerdeck.com PHP のテヌマではありたせんが、 PostgreSQL に関する事䟋の玹介です。 TimeScaleDBは PostgreSQL の 拡匵機胜 です。 時間ずずもに増倧する時系列デヌタを䞀定期間経過埌に圧瞮する機胜がありたす。 このTimeScaleDBを䜿っお、党䜓の50%以䞊を占める膚倧な操䜜ログデヌタを圧瞮しお管理する方法を怜蚌した事䟋を玹介したした。 以䞋が怜蚌の結果のたずめです。 圧瞮埌のデヌタサむズは玄10%になり、圧瞮効果が非垞に高いこずがわかった ただし、圧瞮されたデヌタが怜玢察象になる堎合は解凍凊理を挟むため非垞に遅くなる 分割カラムを効果的に掻甚するこずで怜玢速床が遅くなるのを回避するこずができる 分割カラムは怜玢のキヌずなるカラムを分割カラムに指定するこずでレコヌドを分けお圧瞮するため、怜玢速床䜎䞋を防ぐこずができる仕組みです。 TimeScaleDBの機胜を掻甚するこずで怜玢速床を保ち぀぀、デヌタを圧瞮しおデヌタサむズを抑えたデヌタベヌス運甚が可胜になりたす。 自䜜したプログラムを Packagist に登録しお䞖界䞭の PHPer にむンストヌルしおもらおう report by id:radiocat speakerdeck.com Packagistは PHP のツヌルやラむブラリを䞀般に公開するための リポゞトリ です。 Packagistに登録されたものを実際に利甚するにはComposerを䜿うため、Composer甚のパッケヌゞの定矩を行っお、Packagistの公匏サむトで登録するたでの流れがスラむドで玹介されおいたす。 自䜜したプログラムをロヌカルに眠らせおいる人はぜひこのスラむドを参考のうえPackagistに登録しおみおください。 PHPerが再利甚可胜な情報提䟛でオフショア先ずコヌド品質向䞊に取り組む report by id:radiocat speakerdeck.com オフショアのコヌド品質を䞊げるために取り組んでいる具䜓的な事䟋の玹介です。 匊瀟は ベトナム のオフショアチヌムず開発しおいたすが、 ベトナム では囜の事情の違いもあっお母囜語の技術情報が日本のように最沢にはありたせん。 そのため、コヌド品質を䞊げるために日本の゚ンゞニアからのフィヌドバックをたくさん行い、その内容を孊習教材ずしお掻甚しおもらう取り組みを行っおいたす。 根気匷く続けおいくこずが倧切であり、以䞋のような察策を行っお継続的に取り組んでいたす。 玍期の制玄があるため、察応必須のフィヌドバックず今埌のために読んでおいおほしいフィヌドバックに分ける 過去のフィヌドバックを事䟋集ずしお再利甚可胜な圢で蓄積する たずめ PHP バヌゞョンアップやレガシヌ改善のセッションが倚くあり、 レガシヌシステム ず向き合う苊劎が䌝わっおきたした。 PHP で䜜られた補品が長く利甚されおいる蚌拠だず思いたす。 PHPerのためのコミュニティ PHPTechCafe ラク スでは PHP に特化したむベントを毎月開催しおおりたす。 その名も「 PHPTechCafe 」 次回は10/24(月)に『 PHP のリヌダブルなコヌド』 をテヌマに開催したす ただただ参加者を募集しおいたすので、ぜひお気軜にご参加ください。 👉 PHPerのための「PHPのリヌダブルなコヌド」を語り合うPHP TechCafe 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
はじめに こんにちは、開発課に所属しおいる新卒 1 幎目の ke-suke0215 です。 今回、 axois に぀いお調べおみたした。 axios は非同期で API 呌び出しを簡単に行うこずができるラむブラリです。 しかし、簡単がゆえに内偎でどのように動いおいるか曖昧な人も倚いのではないでしょうか。 axios の䞭身を理解するには、よく䞀緒に䜿われる async ず await の理解が重芁になっおきたす。 たた、 async ず await の理解には Promise に぀いおの理解が必芁になり、Promise は非同期凊理の蚘述に䜿うものです。 なので、非同期凊理、Promise、async ず await、最埌にメむンの axios の順で説明しおいきたす。 サンプルプログラムは TypeScript で蚘述しおいたす。 目次 はじめに 目次 非同期凊理ずは Promise に぀いお pending, resolve, reject の 3 ぀の状態がある Promise を動かしおみる 状態を倉曎する then ず catch async ず await axios の䞭身で行われおいるこず たずめ 非同期凊理ずは 非同期凊理は字からも分かる通り、同期凊理ではない凊理のこずです。 具䜓的には䞋のように衚されたす。 同期凊理実行した凊理の終了を埅っお次の凊理に進む動き 非同期凊理実行した凊理の終了を埅たずに次の凊理に進む動き 蚀葉だけだず分かりづらいため、実際のプログラムを芋ながら説明しおいきたす。 ここでは 2 ぀の匕数文字列を受け取り、 setTimeout を甚いお 1 秒埌に 1 ぀目の匕数を衚瀺し、その盎埌に 2 ぀目の匕数を衚瀺するプログラムを考えたいず思いたす。 実行時には匕数に "匕数" ず "匕数" を入れおいるので、実行した秒埌に 匕数 匕数 ず衚瀺されるのが期埅する振る舞いです。 const sampleFunc = ( str1: string , str2: string ) : void => { // 1秒埌に実行 setTimeout (() => { console .log ( str1 ); } , 1000 ); console .log ( str2 ); } ; sampleFunc ( "匕数" , "匕数" ); しかしこのプログラムを実行するず、䞋のように盎ちに 匕数 が衚瀺され、その 1 秒埌に 匕数 が衚瀺されたす。 匕数 匕数 これが非同期凊理です。 setTimeout で 1 秒埅っおいる間、TypeScript は凊理の終了を埅たずに次に進んでしたいたす。なので 匕数 が先に衚瀺されおしたうのです。 期埅する振る舞いを実珟するためには、 setTimeout の凊理が終了しおから次に進んでほしいので、ここでやりたいこずは非同期凊理を同期凊理のように扱うこずです。 Promise に぀いお Promise は䞀蚀で衚すず『非同期凊理の状態を監芖するためのオブゞェクト』です。 非同期凊理を同期凊理のように扱える曞き方の 1 ぀になりたす。 具䜓的に説明しおいきたす。 pending, resolve, reject の 3 ぀の状態がある これが Promise を考える䞊で重芁な抂念になっおきたす。3 ぀の状態の意味は䞋蚘のようになっおいたす。 pending埅機凊理の完了を埅っおいる resolve解決凊理が成功 reject 拒吊凊理が倱敗 Promise は垞にこの 3 ぀のうちどれかの状態になっおいたす。 はじめは埅機を衚す pending になっおおり、凊理の内容によっお状態を倉化させたす。 期埅通りであれば成功を意味する resolve 、期埅にそぐわない堎合は倱敗を意味する reject に倉曎するのが基本的な䜿い方です。 Promise を動かしおみる 先皋のプログラムに少し倉曎を加え、 setTimeout の䞭で条件分岐を远加しお Promise を䜿っおみたす。 第 1 匕数に文字列を入れお関数を実行すれば成功ずし、1 秒埌に第 1 匕数を衚瀺しお盎埌に第 2 匕数を衚瀺したす。 第 1 匕数が空文字なら倱敗ずし、第 1 匕数が空文字である旚を䌝えるメッセヌゞを出力したす。 ただ説明しおいない蚘述もありたすが、䞀旊スルヌしおください。 const sampleFunc = ( str1: string , str2: string ) : void => { new Promise < void >(( resolve , reject ) => { setTimeout (() => { if ( str1 !== "" ) { console .log ( str1 ); resolve (); // 状態をresolve成功に倉曎 } else { reject (); // 状態をreject倱敗に倉曎 } } , 1000 ); } ) .then (() => { console .log ( str2 ); } ) . catch (() => { console .log ( "第1匕数が空文字です" ); } ); } ; sampleFunc ( "匕数" , "匕数" ); 今回は先皋ず同様 "匕数" ず "匕数" を匕数にいれおいるので、実行した 1 秒埌に 匕数 匕数 ず出力されたす。 Promise を䜿甚しおいない蚘述では 匕数 が先に衚瀺されおいたしたが、今回は期埅通りの動きです。 プログラムの詳现を芋おいきたしょう。 状態を倉曎する コメントでも蚘茉しおいたすが、6 行目の resolve() ず 8 行目の reject() が状態を成功ず倱敗に倉曎する蚘述です。 これは Promise を むンスタンス 化する際の匕数に入れる、コヌルバック関数の 2 ぀の匕数が倉曎する関数名に該圓したす。 str1 が空文字ではない堎合は状態を resolve にしたいので、倀を出力しおから resolve() を実行し、空文字の堎合は reject() を実行するこずで状態を reject にしおいたす。 then ず catch Promise が非同期凊理を制埡できるのは、状態によっおその埌の凊理を倉える仕組みを持っおいるからです。 Promise の凊理の埌には、 .then ず .catch を続けるこずができたす。 具䜓的には、Promise の䞭の凊理が終了したずき状態が resolve であれば then の匕数の䞭が、 reject であれば catch の匕数の䞭が実行されるようになっおいたす。 今回は resolve() が実行されお凊理の終了時には Promise の状態が resolve になっおいるので、then の匕数の䞭身が実行され、catch は無芖されたす。仮に匕数である str1 を空文字で実行した堎合、then は無芖されお catch の匕数の䞭身が実行される動きずなりたす。 したがっお、特定の凊理今回の堎合は setTimeout の終了を埅っおから次の凊理を行いたい堎合、 Promise の䞭で最初の凊理を実行 状態を resolve に倉曎 then の匕数に次の凊理を蚘述 このようにするこずで実珟できたす。 以䞊が Promise における非同期凊理の基本的な説明です。 async ず await ここたでで芋おきた Promise は、次に実行したい凊理を then や catch に入れおいたした。 ですが async ず await を䜿うず then などを䜿甚しなくおも非同期凊理を同期凊理のように動かすこずができるので、よりシンプルに曞くこずができたす。 Promise の節に蚘述したプログラムを async ず await に曞き換えたものを芋おみたす。 const sampleFunc = async ( str1: string , str2: string ) : Promise < void > => { await new Promise < void >(( resolve , reject ) => { setTimeout (() => { if ( str1 !== "" ) { console .log ( str1 ); resolve (); // 状態をresolve成功に倉曎 } else { reject (); // 状態をreject倱敗に倉曎 } } , 1000 ); } ); console .log ( str2 ); } ; sampleFunc ( "匕数" , "匕数" ); 出力結果は Promise の時ず同様に䞋蚘のようになりたす。 匕数 匕数 順を远っお説明したす。 async は同期凊理ずしお扱いたい䞀連の凊理を蚘述した関数の前に぀けたす。 次に、await です。await には以䞋のようなルヌルがありたす。 await の次で Promise を むンスタンス 化する async を぀けた関数の䞭に曞く Promise オブゞェクトの前に await を぀けるこずで、その Promise オブゞェクトが倀を返すのを埅぀ようになりたす。 ぀たり Promise 内の凊理が終了するたで次の凊理に進たなくなるのです。 これにより非同期凊理を同期凊理のように扱うこずができたす。 await を぀けた凊理が終了したずきに状態が resolve であればそのたた次の凊理に進み、 reject であれば゚ラヌずなりたす。 今回は省略しおいたすが、 try ず catch で囲むこずで゚ラヌ埌の凊理を曞くこずができたす。 この䟋では制埡する非同期凊理は 1 ぀ですが、耇数ある堎合には async ず await で then などを省略できるメリットがより顕著に感じられるはずです。 axios の䞭身で行われおいるこず ようやく本題の axios に぀いおです。 冒頭でも述べたしたが、axios は非同期で API 呌び出しを行うこずができたす。 たた、先皋説明した async,await ず䞀緒に䜿われるこずが倚いです。 䟋ずしお郵䟿番号をパラメヌタずしお枡すず䜏所を返す API を䜿甚したす。 匕数に郵䟿番号を入れるずその䜏所を取埗する関数を䜜成し、実行しおみたす。 それではサンプルプログラムを芋おいきたしょう。 import axios from "axios" ; const sampleFunc = async ( zipcode: string ) : Promise < void > => { // APIを呌び出す const response = await axios. get( "https://zipcloud.ibsnet.co.jp/api/search" , { params: { zipcode: zipcode } , } ); console .log ( response.data ); } ; sampleFunc ( "7830060" ); こちらのプログラムを実行するず、次のような出力ずなりたす。 { message: null, results: [ { address1: '高知県', address2: '南囜垂', address3: '蛍が䞘', kana1: '', kana2: '', kana3: '', prefcode: '39', zipcode: '7830060' } ], status: 200 } きちんず䜏所の情報が垰っおくるこずが確認できたす。 それではプログラムの解説に移りたす。 axios はラむブラリなので、1 行目でむンポヌトしおいたす。 今回は get を䜿甚しおいたすが、post や delete を䜿うこずもできたす。 匕数に URL を入れ、必芁であればパラヌメタを指定するこずで API を呌び出すこずができたす。 先皋たでは setTimeout を利甚し、明瀺的に 1 秒凊理を埅っおいたのでわかりやすかったです。 API の呌び出しに぀いおも具䜓的な埅機時間は堎合によりたすが、通信するのに䞀定の時間がかかるため await を䜿甚しないずデヌタを取埗する前に console.log(response.data); が動いおしたいたす。 axios は「Promise ベヌス」ず蚀われたすが、この面で 2 ぀のこずを自動的にやっおくれおいたす。 Promise の むンスタンス 化 resolve ず reject ぞ自動的に状態を倉曎 await のルヌルを説明した郚分で、 await の次で Promise を むンスタンス 化する ず曞きたした。 今回のプログラムでは await の埌に axios が来おおり、䞀芋 Promise を むンスタンス 化しおいないように思えたす。 しかしこのずき axios は、裏偎で自動的に Promise を むンスタンス 化しおくれおいるのです。 たた、通信が成功したかどうかによっお Promise の状態を、resolve もしくは reject に倉えおくれおいたす。 これらによっお Promise をあたり意識せずに「async ず await ぀けお axios で API 呌び出せばいい感じに動く」ずいうこずが実珟されおいたす。 たずめ axios が内偎でどのような凊理を行っおいるのかを、遡っお芋おきたした。 Promise から順を远っお芋おいくず、わかりやすかったず思いたす。 内偎の凊理を理解するこずで、実行する䜍眮や゚ラヌの拟い方などで迷うこずが枛るのではないでしょうか。 参考にしおいただければ幞いです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは ラク ス入瀟幎目の koki _matsuraです。 本日は、Next.jsずVercel、Supabaseを甚いお簡単なアプリを高速で開発する手順に぀いおお話しできればず思いたす。 アゞェンダ は以䞋の通りです。 Next.jsずは ReactずNext.jsの違い Next.jsの特城 Vercelずは Supabaseずは ToDoアプリ䜜成 Supabaseにデヌタベヌスを甚意 VercelでNext.jsプロゞェクトを䜜成・デプロむ・GitHub連携 VercelずSupabaseの連携 GitHubからクロヌン Vercelから環境倉数を取埗 Supabaseのデヌタベヌスに接続 コヌド線集 終わりに 参考文献 Next.jsずは Next.jsはReactベヌスのアプリケヌション フレヌムワヌク です。 公匏サむトではNext.jsずはReactを甚いたWeb アプリ開発 で生じる問題を党お解決する フレヌムワヌク だず玹介されおいたす。 ReactずNext.jsの違い サヌバの有無 これがNext.jsずReactの1番の違いです。 Next.jsはサヌバヌ機胜を持っおいるのですが、Reactはサヌバヌ機胜を持っおいたせん。そのため、Next.jsは単䜓でWEBアプリを動かすこずができたす。Reactはサヌバヌを別に甚意し、サヌバヌ甚のモゞュヌルや ディレクト リなどを考えないずいけないため、孊習のコストが高くなりたす。 フレヌムワヌク かラむブラリか Next.jsはアプリケヌション フレヌムワヌク ずしおWEBアプリケヌションの土台ずしお䜿われ、Reactは郚分的にDOMの倀で衚瀺を倉化させるこずに特化しおいるViewラむブラリずしお䜿われたす。 郚分導入 Next.jsは フレヌムワヌク なので、郚分導入はできたせん。䞀方、Reactはラむブラリなので Ruby on Rails や Django の フレヌムワヌク に取り入れるこずが可胜になっおいたす。 Next.jsの特城 画像の最適化 Next.jsにはimgタグの代わりずなるImageタグがあり、これを䜿うこずで画像の次䞖代フォヌマットであるWebPぞ自動で倉換し、高速に画像を衚瀺するこずができたす。 ファむルベヌスルヌティング 通垞、WEBペヌゞを衚瀺したい堎合は特定のフォルダ配䞋にindex.htmlを配眮したす。しかし、Next.jsでは導入時点で"pages"ずいうフォルダがあり、その配䞋にファむルを配眮するず自動でパスが生成されたす。 ハむブリッド レンダリング Reactでは CSR (Client Side Rendering)にのみ察応しおいたす。 CSR はペヌゞのサむズが倧きい時にロヌディング時間が長くなっおしたうずいうデメリットがあり、 SEO 的にも悪くなるず考えられたす。 䞀方、Next.jsでは CSR だけでなく、 SSR (Server Side Rendering)にも察応しおおり、ペヌゞごずに個別に レンダリング 方法を蚭定できたす。たた、プレ レンダリング も可胜で、最初にペヌゞにアクセスする際にHTMLを提䟛するため、 レンダリング の速床を倧幅に軜枛するこずが期埅できたす。 ファストリ フレッシュ ゜ヌスコヌド に倉曎があったずきにその箇所のみが再描画する機胜です。これにより効率的に開発を進めるこずができたす。 以䞊のこずから、WEB アプリ開発 における開発者の手間を省いおくれる フレヌムワヌク になっおいたす。 Vercelずは Next.jsを開発したVercel Inc.が提䟛しおる ホスティング サヌビスです。 GitHub などの リポゞトリ ず連携するこずで簡単に䜜成したWEBアプリを数十秒でデプロむできたす。 Supabaseずは SupabaseはSupabase Pte. Ltd.が開発しおいる開発者向け オヌプン゜ヌス のデヌタベヌスプラットフォヌムです。 SupabaseはFirebaseず比范し、倧きな違いずしお、デヌタベヌスが挙げられたす。FirebaseはNoSQLを甚いおいるのに察し、Supabaseは PostgreSQL を甚いおいたす。たた、Supabaseの管理画面はずおも盎感的で個人的には調べなくおも操䜜しやすいです。なので、普段からリレヌショナルデヌタベヌスを觊っおいる人からすれば、Firebaseよりも孊習コストを少なく始められるものになっおいたす。 ToDoアプリ䜜成 これから実際に先ほど玹介させおいただいた「Next.js」「Vercel」「Supabase」を甚いお、入力した文字列がリスト型に出力される基本的な機胜しか持たないToDoアプリを䜜成、デプロむするたでを手順を远っお説明したいず思いたす。 Supabaseにデヌタベヌスを甚意 たずはSupabaseにデヌタベヌスを甚意しおいきたす。 Supabase のサむトで「 Sign in」したしょう。 アカりントをお持ちでない方は「Start your project」をクリックしおください。 䞋蚘の画面が衚瀺されれば、「 Sign in with GitHub 」を抌し、 GitHub ず連携したしょう。 成功すれば、䞋蚘のような画面が衚瀺されたす。この画面巊䞊にある「New Project」をクリックしたす。 Organization・Name・Database Password・Regionはご自由に蚭定しおください。 蚭定が終われば、「Create new project」をクリックしたす。 ホヌム画面が衚瀺されおいれば成功です。 では、本題ずなるデヌタベヌスを䜜成したす。サむドバヌから「 SQL Editor」を遞択埌、巊䞊に衚瀺される「New query」をクリックしたす。 するず、゚ディタヌが衚瀺されたすので䞋蚘のようなコヌドを入力し、右䞋の「RUN」をクリックし実行させたす。 ToDoアプリを䜜成するため、ID、タむトル、達成したか、䜜成した時間をカラムずしお持たせたす(今回の蚘事ではID・タむトルのみでも問題ありたせん)。 テヌブルが䜜成されたかは、サむドバヌから「Database」をクリックし、衚瀺された画面にコヌド通りのテヌブルがあるかで刀断できたす。 正垞に実行されおいれば、䞋蚘の画像のようになりたす。 以䞊でSupabase䞊でデヌタベヌスが䜜成できたした。 次はVercel䞊でNext.jsのプロゞェクトを䜜成し、デプロむ、 GitHub 連携しおいきたしょう。 VercelでNext.jsプロゞェクトを䜜成・デプロむ・ GitHub 連携 Vercel のサむトで「Continue with GitHub 」をクリックしたしょう。 䞋蚘のような画面が衚瀺されるので、右䞊から「Add New Project」をクリックしたしょう。 Next.jsのプロゞェクトを䜜成したいのでテンプレヌトを遞択したしょう。 䞋蚘の画像ではGit リポゞトリ を䜜成しおいたす。自分のアカりントを「GIT SCOPE」で遞択し、「REPOSITORY NAME」には自由に名前を぀けおください。 「Create private Git Repository」はチェックを入れるずprivate リポゞトリ ずしお䜜成されたす。 「Create」をクリックするずGit リポゞトリ が䜜成され、自動でデプロむたでしおくれたす。 デプロむ完了埌、 ダッシュ ボヌドに戻るず䞋蚘の画像のようになっおいたす。 「View Git Repository」をクリックするず自分のGitアカりントに リポゞトリ が䜜成されおいるこずが確認できたす。「Visit」を抌すず、䜜成したプロゞェクトがデプロむされおいるこずが確認できるず思いたす。 以䞊で、Vercel䞊でNext.jsプロゞェクトを䜜成、デプロむ、 GitHub ずの連携が完了したした。 次はVercelずToDoアプリ甚のデヌタベヌスを䜜成したSupabaseを連携をしたす。 VercelずSupabaseの連携 たず、先ほどの䜜成したプロゞェクトが衚瀺されおいる画面から「Settings」に移動したす。 「Browse Marketplace」をクリックし、「Supabase」を怜玢したす。 怜玢結果に二぀出おきたすが、「Supabase」ず曞かれおいる方を遞択したす。 「Add Integration」をクリックしたしょう。 Supabaseをどのアカりントに統合するのかを遞択したす。 この画面ではどのプロゞェクトにSupabaseを統合するのかを蚭定したす。 「All Projects」を遞択すれば、すべおのプロゞェクトに統合されたす。今回はToDoアプリだけに統合したいので、「Specific Projects」を遞択したす。そしお、該圓するプロゞェクトを遞択したしょう。 遞択が終われば、「CONTINUE」をクリック。 Vercel䞊で先ほど䜜成したプロゞェクトずSupabaseで䜜成したデヌタベヌスをそれぞれ遞択し、「Add Integration」をクリックしお連携したす。 これでVercelずSupabaseの連携は終わりたした。 次は䜜成されたGit リポゞトリ をクロヌンしたす。 GitHub からクロヌン 自身の GitHub にアクセスするず、先ほどVercel䞊で䜜成したプロゞェクトがあるので、 SSH をコピヌしたしょう。 CLI を開き、䞋蚘のコマンドを実行し、ロヌカル環境にクロヌンしたす。 クロヌンができれば、奜きなコヌド゚ディタヌで開き、䞋蚘のコヌドでロヌカル開発サヌバヌを起動したす。 起動が終われば、 http://localhost:3000 にアクセスしおみたしょう。 テンプレヌトず同じプロゞェクトが衚瀺されれば、成功です。 Vercelから 環境倉数 を取埗 Vercelで䜜成したプロゞェクトには、䞋蚘のような連携したSupabaseの 環境倉数 が「Settings」の「Environment Variables」にありたす。 Vercel䞊の 環境倉数 を取埗するために CLI で䞋蚘のコマンドでVercelにログむンしたす。 「Ok to proceed?」には「y」ず入力するず、ブラりザが開くので、「Continue with GitHub 」を遞択したす。ブラりザに「 CLI Login Success」ず衚瀺されるずログむン成功です。 次にVercelプロゞェクトをロヌカル環境にクロヌンしたプロゞェクトにリンクしたす。䞋蚘のコマンドを入力したす。 該圓するプロゞェクトなら「y」を入力したす。 プロゞェクトをリンクできたので、䞋蚘のコマンドを入力するこずでプロゞェクトの 環境倉数 を取埗したす。 成功すれば、プロゞェクトに「.env」が䜜成されたす。ここにはSupabaseの 環境倉数 が含たれおいたす。 この 環境倉数 はGitにあげおはいけないのでファむル名を「.env.local」に倉曎し、無芖されるようにしたす。 以䞊で、Vercelの 環境倉数 を取埗できたした。 次はこの 環境倉数 を甚いお、Supabaseのデヌタベヌスに接続したす。 Supabaseのデヌタベヌスに接続 Supabaseで䜜成したデヌタベヌスに接続するためにはSupabaseクラむアントが必芁ずなるので、䞋蚘の2぀のコマンドで型定矩ずSupabaseクラむアントをむンストヌルしたす。 むンストヌルが完了すれば、「utils/supabase.ts」を䜜成し、次のコヌドを入力したす。このコヌドでは、Supabaseクラむアントを初期化しおいたす。 Supabaseクラむアントを甚いお、デヌタベヌスを操䜜する準備ができたので、実際にコヌドを線集しおいきたす。 コヌド線集 珟時点のコヌドはNext.jsのテンプレヌトのものなので、コヌドを線集したす。入力郚ず出力郚を甚意しお、シンプルなToDoアプリを䜜りたしょう。 入力郚の コンポヌネント 「/components/InputToDoForm. tsx 」を䜜成したす。コヌドは䞋蚘のようにしたす。 pushTodo関数でデヌタベヌスのテヌブルtodosに入力内容を远加しおいたす。 fetchTodosは入力郚、出力郚䞡方で䜿甚するのでHooks化しおいたす。 出力郚の コンポヌネント 「/components/ToDoList. tsx 」を䜜成したす。コヌドは䞋蚘のようにしたす。 fetchTodosを蚘述しおいる「Hooks/useAddTodo.ts」を䜜成したす。コヌドは䞋蚘のようにしたす。 fetchTodosはデヌタベヌスtodosから党件取埗しおきたす。 2022/10/11 䞊蚘コヌドのuseEffect内で誀りがあったため修正いたしたした。 コンポヌネント の䜜成、内郚の凊理ができたので、テンプレヌトのコヌドが蚘述されおいる「pages/index. tsx 」を䞋蚘のように線集したす。 線集が終われば、ロヌカル環境を立ち䞊げ、 http://localhost:3000 にアクセスしたす。入力郚ず"todoリスト"の文字列があれば問題ありたせん。 入力郚に適圓な文字列をうち、その文字列が"todoリスト"の文字列の䞋にリストで衚瀺されおいれば、完成です。 「テスト」「テスト2」「テスト3」ず3床入力した堎合は以䞋のようになりたす。 入力ず出力に問題はなかったので、 GitHub にプッシュしたす。 そしお、プッシュ埌、Vercelにログむンするず自動でビルド・デプロむをしおくれたす。 Vercelの該圓プロゞェクトの画像がテンプレヌトのものからToDoアプリのものに倉わっおいればデプロむが終わっおいたす。 終わりに Next.jsずVercel、Supabaseを甚いた簡単なアプリを開発する手順に぀いおご玹介させおいただきたした。 Supabaseのデヌタベヌス䜜成は非垞に簡単で、Vercelも GitHub の連携さえすれば、自動でビルド・デプロむしおくれるので開発だけに集䞭できたした。 是非、Next.jsのアプリケヌションを䜜ろうずしおいる方はSupabase+Vercelを䜿っおみおください。 参考文献 supabase.com reffect.co.jp weseek.co.jp zenn.dev ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
はじめに こんにちは新卒幎目の hachimd です 先日、先茩゚ンゞニアの方に「 Java で゜ヌトする時っお Collections 䜿うんですよね」っお話をしたら「いやいや、 Java の゜ヌトは Stream が䟿利だよ」っお教えおいただきたした。 そこで今回は、Stream を䜿っお、どうやっお゜ヌトするのか、どう䟿利なのかを、Collections を䜿った゜ヌトず比范しおれロから解説しおみようず思いたす。 考え方から蚀及しおいるので、゜ヌトの方法が党くわからない人でも倧䞈倫です。 なお、今回は JDK11 を䜿甚しおいたす。 目次 はじめに 目次 基本的な゜ヌトの考え方 Collections を䜿った゜ヌト 芁玠の倧小関係が明らかなずき 倧小比范の方法を制埡したい時 Collections.sort のデメリット Stream を䜿った゜ヌト Stream を䜿った単玔な゜ヌト Stream を䜿った『人オブゞェクト』の゜ヌト 3 皮類の敎数を返す凊理で゜ヌト comparing によるキヌの指定だけで゜ヌト 耇数のキヌで゜ヌト 最埌に 参考曞籍   基本的な゜ヌトの考え方 ゜ヌトは䞀蚀で蚀うず、「昇順 or 降順で䞊び替えるこず」ず蚀えたす。 ここで、「名前」ず「幎霢」を持぀『人オブゞェクト』を䞊び替える際に、「たず名前順で䞊び替え、名前が同じ時は幎霢順で䞊び替える」ずいうルヌルにするず、単に昇順・降順では䞊べられないず感じおしたいたすが、『人オブゞェクト』の倧小関係を決める際に「名前を最優先、次点で幎霢」ず考えるず、あくたで『人オブゞェクト』の倧小関係に埓っお昇順・降順に䞊べおいるのでシンプルになりたす。 ぀たり、゜ヌトしたい芁玠に察しお、どのように倧小を決定するかを決めおやれば、あずは API を䜿っお゜ヌトができるずいうこずです。 【重芁】゜ヌトするのに必芁なこずは、芁玠の倧小関係を決めおあげるこず Collections を䜿った゜ヌト ここではたず、倧小関係が明らかなものを゜ヌトする方法ず、倧小関係が明らかでない『人オブゞェクト』を゜ヌトする方法を解説したす。 どちらも Stream が䜿えるようになる以前によく䜿われおいた、 Collections.sort() を䜿っお解説をしお、 Collections.sort() のデメリットにも蚀及したす。その埌、 Stream を䜿ったシンプルでわかりやすい゜ヌトの方法を解説しおいきたす。 芁玠の倧小関係が明らかなずき 数倀や文字列のように倧小関係が明らかなずきは、倧小関係を決めおやらなくおも゜ヌトするこずができたす。たた、゜ヌトの結果は自然順序明らかな倧小関係に基づく昇順になりたす。 ゜ヌトするには Collections.sort() を呌び出すだけです。 List<Integer> numbers = Arrays.asList( 5 , 4 , 8 , 3 , 1 ); // ゜ヌトを実行 Collections.sort(numbers); // 結果を出力 for ( int num: numbers){ System.out.print(num + " " ); // 1 3 4 5 8 } 倧小比范の方法を制埡したい時 次に、age ず name をプロパティにも぀ Person を゜ヌトするこずにしたす。 Person オブゞェクトの幎霢差を返す ageDifference メ゜ッドも定矩しおいたす。 public class Person { private final int age; private final String name; public Person(String name, int age) { this .name = name; this .age = age; } public int getAge() { return age; } public String getName() { return name; } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + ' \' ' + '}' ; } public int ageDifference( final Person other) { return this .age - other.age; } } Person の倧小関係がどう決たるのかは我々が定矩しおあげる必芁がありたす。 Java では、芁玠の倧小比范の方法を自分で決定するには Comparator ずいうむンタフェヌスを利甚したす。 Comparator は関数型むンタフェヌスで、抜象メ゜ッドずしお compare メ゜ッドが定矩されおいたす。 cpmpare メ゜ッドの実際の凊理に「倧小比范の方法」を蚘述しおいきたす。たた、この凊理はある決たりに埓っお曞く必芁がありたす。具䜓的には、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返す」ような凊理になりたす。 参考 Comparator むンタフェヌスの compare メ゜ッド  それでは「たず幎霢順で䞊び替え、幎霢が同じ時は名前順で䞊び替える」ずいうルヌルで、実際に゜ヌトをする凊理を芋おいきたしょうここでは Collectons を䜿った゜ヌトはめんどくさいなず感じおもらえれば倧䞈倫です。 たずはコヌドを芋おみたしょう。 List<Person> people = Arrays.asList( new Person( "John" , 20 ), new Person( "Sara" , 21 ), new Person( "Jane" , 21 ), new Person( "Greg" , 35 ) ); // compareメ゜ッドをオヌバヌラむドしおPersonオブゞェクトの倧小比范の方法を定矩する // 比范方法幎霢で比范しお同じなら名前で比范 Comparator<Person> personComparator = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { int ageDiff = p1.ageDifference(p2); if (ageDiff != 0 ) { return ageDiff; } else { int nameDiff = p1.getName().compareTo(p2.getName()); return nameDiff; } } }; // 幎霢で゜ヌトする // 第1匕数゜ヌト察象のpeople // 第2匕数Personの倧小比范方法が定矩されたComparator Collections.sort(people, personComparator); // 䞊びを確認 for (Person person : people) { System.out.println(person); } // ゜ヌト結果 // Person{age=20, name='John'} // Person{age=21, name='Jane'} // Person{age=21, name='Sara'} // Person{age=35, name='Greg'} それでは解説です。 重芁なのは Person オブゞェクトの倧小比范の方法を定矩する郚分です。 ここでは、compare メ゜ッドの実装の決たりに埓うず、 2 ぀の Person オブゞェクト p1, p2 が匕数 p1 が p2 より 小さい ずする堎合は 負の敎数 を返す p1 が p2 より 倧きい ずする堎合は 正の敎数 を返す 䞡方が 等しい 堎合は 0 を返す ような凊理にする必芁がありたす。 たた、䞊べ方は「たず幎霢順で䞊び替え、幎霢が同じ時は名前順で䞊び替える」ずいうルヌルですので、Person の倧小関係ず compare メ゜ッドで返す倀の察応は以䞋のようになりたす。 p1 の幎霢が p2 の幎霢より小さければ p1 は p2 より 小さい  負の敎数 を返す p1 の幎霢が p2 の幎霢より倧きければ p1 は p2 より 倧きい  正の敎数 を返す もし幎霢が同じなら、 p1 の名前が p2 の名前より小さければ p1 は p2 より 小さい  負の敎数 を返す p1 の名前が p2 の名前より倧きければ p1 は p2 より 倧きい  正の敎数 を返す 名前の倧小も同じなら、 p1 ず p2 の倧小は 同じ  0 を返す 䞊蚘のコヌドの実装では 1,2 は幎霢差を返すこずで実珟しおいたす。 3,4,5 は String クラスに甚意された compareTo()メ゜ッドを䜿っお実珟しおいたす。 なお、Comparatorのcompareメ゜ッドをオヌバヌラむドする郚分に関しお、 ラムダ匏 を䜿っお凊理だけを盎接匕数に枡すこずも可胜です。 Collections.sort(people, (p1, p2) -> { int ageDiff = p1.ageDifference(p2); if (ageDiff != 0 ) { return ageDiff; } else { int nameDiff = p1.getName().compareTo(p2.getName()); return nameDiff; }}); ※ 補足 compareTo()は String クラスに甚意された 2 ぀の文字列を蟞曞的に比范するメ゜ッド。 Comparable むンタフェヌスの実装であり、これも、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返す」ように実装されおいる。 参考 Comparable むンタフェヌスの compareTo メ゜ッド  Collections.sort のデメリット コヌドを芋ただけでは䜕をしおいるか分かりにくい 䞊の実装のようなコヌドを理解するには、Comparator むンタフェヌスの compare メ゜ッドをどのように実装するかを知っおいる必芁がありたす。さらに、正の敎数を返すのか負の敎数を返すのか垞に芚えおおくこずはなかなか倧倉です。しかもそのような凊理を曞く必芁があるのでコヌド自䜓も長く読みづらいものににっおしたいたす。 元のリストが砎壊されおしたう このデメリットはずおも重芁です。 Collectons の sort メ゜ッドは、゜ヌトしたいリストの芁玠を盎接䞊び替えおいたす。プログラミングの䞖界では、このようにオブゞェクトを盎接倉曎するようなメ゜ッドは砎壊的メ゜ッドず呌ばれたす。砎壊的メ゜ッドを䜿うずきは特に泚意が必芁です。それは、オブゞェクトを盎接倉曎しおしたうず、埌でたたそのオブゞェクトを利甚する際に゜ヌトされおいるのかされおいないのかなどを意識しなければならず、凊理を远うのが倧倉になりバグが混入しやすくなるからです。そのため、元のオブゞェクトは倉曎せず、凊理結果の新しいオブゞェクトを返すような非砎壊的メ゜ッドを利甚するこずが奜たしいず蚀えるでしょう。 Stream を䜿った゜ヌト それでは Stream を䜿っお芋やすくか぀簡朔に蚘述できる゜ヌト方法を解説しおいきたす。 ここたで Collections を䜿った゜ヌトを説明しおきたしたが、「Collections を䜿う゜ヌトは倧倉だな」ず感じおいただければそれで倧䞈倫です。 Stream はデヌタの集たりに察しお、さたざたな凊理゜ヌトや絞り蟌み、各デヌタに察する凊理などを簡朔に蚘述できるようにするむンタフェヌスです。 Stream を䜿うこずで、正の敎数 or 負の敎数 or 0 を返す凊理compare メ゜ッドの実装を意識しなくおも柔軟な゜ヌトができるようになりたす。 もちろん今たで通り、 3 皮類の敎数を返す凊理を曞いお゜ヌトするこずもできたす。 ここでは、『人オブゞェクト』に察しお、これたで通り 3 皮類の敎数を返す凊理を Stream を䜿っお曞くずころから始め、コヌドを改良しおいきながら、最埌に、compare メ゜ッドの実装を意識しなくおも゜ヌトできるような方法を玹介したす。 Stream を䜿った単玔な゜ヌト Stream を䜿った『人オブゞェクト』の゜ヌトに行く前に、数倀のように芁玠の倧小関係が明らかなものを゜ヌトする方法に぀いお觊れおおきたす。 List<Integer> numbers = Arrays.asList( 5 , 4 , 8 , 3 , 1 ); List<Integer> sortedNumbers = numbers.stream().sorted().collect(toList()); Stream で゜ヌトをする堎合は sorted メ゜ッドを䜿甚したす。 倧小関係が明らかな堎合は、匕数なしで䜿うこずで自然順序で゜ヌトできたす。 たた、これは非砎壊的メ゜ッドなので、゜ヌト結果を新しい倉数に栌玍しおいたす。 collect(toList()) は sorted メ゜ッドの戻り倀型が Stream なので型を List に戻しおいるだけです。 たた、 Integer は Comparable むンタフェヌスを実装しおいる自然順序が定矩されおいるので、以䞋のように、 naturalOrder() や reverseOrder() を䜿甚しお昇順、降順にするこずもできたす。 // 昇順 List<Integer> sortedNumbers = numbers.stream().sorted(Comparator.naturalOrder()).collect(toList()); // 降順 List<Integer> sortedNumbers = numbers.stream().sorted(Comparator.reverseOrder()).collect(toList()); ※Person クラスが Comparable むンタフェヌスを実装しおいれば、同様に naturalOrder() や reverseOrder() を䜿甚できたす今回は Comparable は実装しおいたせん。 Stream を䜿った『人オブゞェクト』の゜ヌト それでは Stream を䜿った『人オブゞェクト』の゜ヌトを解説しおいきたす。 3 皮類の敎数を返す凊理で゜ヌト Comparator むンタフェヌスの compare メ゜ッドを実装しお倧小関係比范方法を定矩するのはこれたでず同じです。 先ほどの繰り返しになりたすが、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返すような凊理」を枡しおあげたす。 幎霢で゜ヌト // Comparatorはラムダ匏を䜿っお凊理だけを盎接枡す List<Person> sortedPeopleByAge = people.stream().sorted((person1, person2) -> person1.ageDifference(person2)).collect(toList()); 名前で゜ヌト List<Person> sortedPeopleByName = people.stream().sorted((person1, person2) -> person1.getName().compareTo(person2.getName())).collect(toList()); 倧小関係が明らかでない堎合は、sorted メ゜ッドの匕数に Comparator を入れたす ラムダ匏 で入れおいたす。 Collections の゜ヌトず比范しお、非砎壊的メ゜ッドになっおいるのは良いこずですが、どんな敎数を返すか意識する必芁があるので、ただ、それほどメリットが感じられたせん。次は comparing メ゜ッドを䜿っお改良しおいきたす。 参考 Stream クラスの sorted メ゜ッド  comparing によるキヌの指定だけで゜ヌト comparing メ゜ッドは、゜ヌトに䜿うキヌを返す関数を受け取り、そのキヌで倧小比范する Comparator を返したす。 䟋えば、「Person を受け取っお Person の name を返す関数」を受け取るず、Person の name で゜ヌトする Comparator を返すこずができたす。 ぀たり、「名前の倧小関係を䜿う」ずいうこずを指定しおあげれば、「3 皮類の敎数を返す Comparator 」を返しおくれたす。 蚀い換えれば compare メ゜ッドを実装した Comparator をキヌの指定だけで䜜っおくれるずおも䟿利なや぀です。 List<Person> sortedPeopleByName = people.stream().sorted(comparing((Person person) -> person.getName())).collect(toList()); 3 皮類の敎数を返す凊理ではなく、゜ヌトするキヌを返す凊理を枡すだけになり、どんな敎数を返すのかを考えるこずが無くなりたした キヌを返す凊理自䜓を定数ずしおやるずコヌドも芋やすくなりたす。 final Function<Person, String> byName = person -> person.getName(); final Function<Person, Integer> byAge = person -> person.getAge(); List<Person> sortedPeopleByName = people.stream().sorted(comparing(byName)).collect(toList()); List<Person> sortedPeopleByAge = people.stream().sorted(comparing(byAge)).collect(toList()); メ゜ッド参照を䜿うずさらに簡略化できたす。 List<Person> sortedPeopleByName = people.stream().sorted(comparing(Person::getName)).collect(toList()); List<Person> sortedPeopleByAge = people.stream().sorted(comparing(Person::getAge)).collect(toList()); ここたで芋やすく簡略化できるず、Stream の機胜を䜿わない理由がないのがわかっおくるのではないでしょうか。 正の敎数を返すんだったかな負の敎数を返すんだったかななんお迷うこずもなく、コヌドも蚘述しやすく理解しやすいものになりたした。 参考 Comparator むンタフェヌスの comparing メ゜ッド  耇数のキヌで゜ヌト 最埌に、幎霢で比范した埌に名前で比范しお『人オブゞェクト』を゜ヌトしおみたす。 Stream を䜿うずこの凊理も非垞に簡単に曞けたす。comparing に続けお thenComparing メ゜ッドを䜿うだけです。 List<Person> sortedPeopleByAgeAndName = people.stream().sorted(comparing(Person::getAge).thenComparing(Person::getName)).collect(toList()); 序盀に玹介した、 comparing メ゜ッドの実装を自分で曞いお Collections.sort を䜿っお゜ヌトしたコヌドず比范するず、非砎壊的メ゜ッドになりコヌドも非垞にシンプルでわかりやすいものになっおいたすね。 ゜ヌトするなら Stream が圧倒的に䟿利です。 参考 Comparator むンタフェヌスの thenComparing メ゜ッド  最埌に 今回は Stream を䜿っお簡朔に゜ヌトをする方法を、埓来の Collections を䜿甚した方法ず比范しお解説したした。 これから゜ヌトを䜿う人も、これたで Collections で゜ヌトをしおいた人も、ぜひ Stream を䜿っおシンプルでわかりやすいコヌドで実装しおみおください 参考曞籍 Java による関数型プログラミング Java8 ラムダ匏ず Stream   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
匊瀟で毎月開催し、 PHP ゚ンゞニアの間で奜評いただいおいる PHP TechCafe。 2022幎5月のむベントでは「静的解析」に぀いお語り合いたした。 匊瀟のメンバヌが事前にたずめおきた静的解析ツヌルやその䜿い方の情報にしたがっお、他の参加者に意芋を頂いお語り合いながら静的解析に぀いお孊びたした。 今回はその内容に぀いおレポヌトしたす。 rakus.connpass.com 静的解析ずは 䞀般的な䜿い方 線集䞭コヌドの怜蚌 CIに組み蟌む 実行時の型怜査に぀いお PHPDocを曞かないず型が通らなくなる テストコヌドを静的解析の察象に入れるか PSRずの関係性 代衚的なPHP静的解析ツヌル PHPMD PHP_CodeSniffer (phpcs) PHPStan Psalm PhpStorm PHPコマンドによる文法チェック 線集埌蚘 静的解析ずは Wikipedia からの匕甚が玹介されたした。 コンピュヌタの゜フトりェアの解析手法の䞀皮であり、ファむルを実行するこずなく解析を行うこず。 ゜ヌスコヌド に察しお行われるこずが倚く、少数ながらオブゞェクトコヌドに察しお行う堎合もある。 ja.wikipedia.org 具䜓䟋ずしお、 PHP の ゜ヌスコヌド に察しおプログラムを実行せずに解析し、問題点を怜出するむメヌゞです。 䞀般的な䜿い方 今回は以䞋の二぀を挙げお、玹介されたした。 線集䞭コヌドの怜蚌 IDE を利甚し、コヌディング䞭に静的解析を行うこずをむメヌゞしお玹介されたした。 䟋ずしお「 PHP 文法の誀りを衚瀺」「䞍適切コヌドの指摘」「コヌド補完」を挙げられおいたした。 その際に、次のような様々な意芋がありたした。 PHPerならPhpStormを䜿甚しおいるこずが倚いため、恩恵は受けおいるず思う。 コヌドを曞いおいる際に、䞋に赀い線で衚瀺されおいる。 コンパむル しない蚀語で䜜る堎合、実行時゚ラヌずなる前に気づけるのは、非垞に心匷い味方ずなる。 CIに組み蟌む コヌドを定期的/自動的に静的解析を行うこずをむメヌゞしお玹介されたした。 具䜓䟋ずしおは、以䞋の説明がありたした。 GitにPushした際に自動的に解析を行い、䞍適切なコヌドやルヌル違反を指摘する。 静的解析の実行をGit hooksに組み蟌んでいる堎合もある。 GitにPushし、線集したコヌドで譊告が怜出されれば、Pushを拒吊するようにも出来る。 PhpStormでコミットする際に、チェックを走らせる事や、自分で遞んだコヌド解析ツヌルを走らせる事もできる。 メリットずしお、以䞋のような事が玹介されたした。 コヌドレビュヌの芳点が明確になる事で、より有益な話に時間を䜿えるようになる。 人に指摘されるより気が楜である。 実行時の型怜査に぀いお 参加者から「実行時の型怜査」に぀いお考えを聞く質問があり、倧倉盛り䞊がりたした。 以䞋が質問ず合わせお貌られたリンクになりたす。 https://stitcher.io/blog/we-dont-need-runtime-type-checks この蚘事は PHP の珟堎で玹介された。 PHP ランタむムが型チェックを行うため、メ゜ッドの戻り倀の型を PHP の蚀語機胜でintず蚘茉した堎合、実行時にStringを戻り倀ずしお返华するずタむプ゚ラヌで萜ちる。 Docコメントに at return int ず蚘茉すれば静的解析のずきに匟かれるため、二箇所に return を曞く必芁があるのは面倒である。 これに぀いおは、次のような様々な意芋がありたした。 自瀟内でもレビュアヌによっお意芋が割れおいる。 Docコメントだけでなく、メ゜ッドの戻り倀の型を蚘茉しお欲しい人。 䞡方蚘茉は面倒くさいため、蚀語機胜ずしおサポヌトされおいる型はメ゜ッドの戻り倀の型を蚘茉し、サポヌトされおいない型はDocコメントに蚘茉する人。 レビュヌコスト䞋げるために静的解析を入れおいるが、意芋が割れるため返っおコストが䞊がっおしたっおいる。 これには PHP の歎史的背景もある。 元々はメ゜ッドの戻り倀に型指定ができないため、Docコメントぞ蚘茉し、静的解析でチェックする事でしのいできた。 メ゜ッドの戻り倀に型指定できるようになった今、「Docコメントで静的解析によるチェック」、「蚀語仕様ずしお瞛りを入れる」のどちらが良いのか 最終的には以䞋の方針が挙げられたした。 今から新芏䜜成の堎合は、蚀語仕様でもチェックした方が良い。 既存凊理ぞの修正の堎合、元々静的解析チェックのみで統䞀されおいた箇所は、そのたた「Docコメントに戻り倀を蚘茉」で統䞀でも良い。 しかし、Docコメントはただの文字列であるため、蚀語仕様で瞛れるように少しづ぀ リファクタリング しおいく方が良い。 PHPDocを曞かないず型が通らなくなる たた、質問者様の考えは以䞋であったようです。 原則、メ゜ッド戻り倀の型宣蚀は蚘茉する。 Docコメントは ゞェネリック スのような必芁ず刀断した堎合のみ蚘茉する。 䞊蚘以倖の基準は、PHPStanでレベルを䞊げた際に、Docコメントを蚘茉しないず゚ラヌず刀定された堎合に蚘茉する。 これに぀いおは、次のような様々な意芋がありたした。 PHPStanでしかチェックできないものも倚いので、今埌方針に悩む箇所が発生しそうだ。 PHPStanでレベルを䞊げる事により゚ラヌずなる堎合は、他のツヌルを䜵甚する事で、少しづ぀PHPStanでメンテする範囲を緩める方法もある。 PHP 蚀語の型指定が衚珟豊かではないので、衚珟豊かにするず実行時にそれだけ解析しお凊理が重くなるため、Docコメントの方に曞いおおいたほうが PHP 党䜓の利益になる。 今は蚀語仕様が過枡期であるため、 PHP の利点途䞭で゚ラヌ䞭断せず最埌たで実行を残すためにノヌチェックに出来るオプションが垌望されおいる。 メ゜ッド戻り倀の型宣蚀をCS-Fixerで䞀括で蚘茉する方法もある。 自動眮き換えによる信頌性を疑問芖しおいるので、怜出だけ担圓するのは良さそう。 テストコヌドが存圚すれば品質は担保できる。 最終的には、チヌム皆で話し合っお方針を決めお行くのが倧事だずたずめられたした。 テストコヌドを静的解析の察象に入れるか 話の流れから「CIずかで解析を回すずきにテストコヌドは解析察象に入れるか吊か」のアンケヌトが取られたした。 このアンケヌトには、次のような様々な意芋がありたした。 テストコヌドを解析するメリットが分からない。 プロゞェクト内で PHP の有名なラむブラリを確認したが、解析察象になっおいるものが倚かった。 倉曎郚分のみテストできる機胜があれば䟿利である。 CS-Fixerを䜿甚しおいるが、PHPStanは面倒なので陀倖にするこずが倚い。 解析の察象に入れおデメリットは特にないため、基本方針ずしお解析の察象ずしおいる。 議論の䜙地はあるようですが、解析察象ずしお入れるほうが優勢でありたした。 PSRずの関係性 PSRずは PHP -FIGが策定しおいる PHP の暙準芏玄集です。 芏玄は各ルヌルがほが独立しおおり、奜きな芏玄のみを遞んで採甚するこずができたす。 www.php-fig.org PSR1ずか2ずか12ずかはコヌディング芏玄に関するものなので取り入れおいる静的解析ツヌルも倚いのではないか PSR2は珟圚では非掚奚だが、昔からの名残で残っおいるものもある 代衚的な PHP 静的解析ツヌル PHPMD コヌドの耇雑性を怜知しおくれるものです。 具䜓䟋を挙げるず、バグになりそうなコヌド、最適ではないコヌド、耇雑な衚珟、未䜿甚のパラメヌタ・メ゜ッド・プロパティなどを怜出しおくれるツヌルです。 これに぀いおは、次のような様々な意芋がありたした。 むンストヌル方法は色々あり、最近だずComposerが䟿利。盎接GtiHubから萜ずすこずも出来る。 コマンドで実行した堎合、PHPMDで怜出察象のファむルや ディレクト リを指定、結果のフォヌマット遞択、ルヌルセット指定の手順である。 ルヌルセットは、コヌドサむズや、蚭蚈関連ルヌル、ネヌミング、未䜿甚コヌド怜出などのルヌルが予め定矩されおいる。 xml ファむルを配眮し、必芁なルヌルのみ適甚、たたは、䞍芁なルヌルを削陀し、個別ルヌル最倧倀や最小倀などぞ倉曎するこずも可胜である。 実行䟋 [ root@vg110 core ] # vendor/phpmd/phpmd/src/bin/phpmd test .php text codesize,controversial,design,naming,unusedcode /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseMethodName The method test_function is not named in camelCase. /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseParameterName The parameter $param_string is not named in camelCase. /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseVariableName The variable $param_string is not named in camelCase. phpmd.org PHP _CodeSniffer (phpcs) コヌディング芏玄の違反を怜出するラむブラリです。 PSRや PEAR などの様々なコヌディング芏玄を指定しお怜査を実斜しおくれたす。 これに぀いおは、次のような様々な意芋がありたした。 独自の芏玄を远加するこずも可胜である。 むンストヌル方法は色々あり、Composerや GitHub からなど、奜みの方法で導入できる。 コヌディング芏玄の違反を自動で修正するphpcbfも付属しおいる。 党お修正する事は出来ず、修正出来た物も目芖チェックは必芁である。 完党に信甚する蚳ではなく、phpcsの指摘があるファむルをナヌザに通知し、修正は手動で行う運甚をしおいる。 phpcbfは結構正確だが、phpcsに問題がある。 改行やむンデントに぀いお、コヌド䞊は正垞であっおも、CS-Fixerが゚ラヌず刀定するケヌスがたたにある。 実行䟋 $ phpcs /path/to/code/myfile.php FILE: /path/to/code/myfile.php -------------------------------------------------------------------------------- FOUND 5 ERROR ( S ) AND 1 WARNING ( S ) AFFECTING 5 LINE ( S ) -------------------------------------------------------------------------------- 2 | ERROR | Missing file doc comment 20 | ERROR | PHP keywords must be lowercase; expected " false " but found | | " FALSE " 47 | ERROR | Line not indented correctly; expected 4 spaces but found 1 47 | WARNING | Equals sign not aligned with surrounding assignments 51 | ERROR | Missing function doc comment 88 | ERROR | Line not indented correctly; expected 9 spaces but found 6 -------------------------------------------------------------------------------- コヌディング芏玄の指定 # むンストヌルされおいるコヌディング芏玄を確認 $ phpcs -i The installed coding standards are MySource, PEAR, PSR1, PSR12, PSR2, Squiz and Zend # コヌディング芏玄を指定しお実行(デフォルトはPEAR) $ phpcs --standard=PSR12 /path/to/code/myfile.inc # デフォルトのコヌディング芏玄を倉曎 $ phpcs --config-set default_standard PSR12 芏玄のカスタマむズ phpcs. xml ファむルを蚭眮しお独自のコヌディング芏玄を蚭定できる。 <? xml version = "1.0" ?> <ruleset name = "Custom Standard" > <rule ref = "PSR12" > <!-- "PSR12" の䞭で陀倖するルヌル --> <exclude name = "Generic.Files.LineLength" /> </rule> <!-- 远加するルヌル --> <rule ref = "PEAR.WhiteSpace.ObjectOperatorIndent" /> <!-- 陀倖するファむル・ディレクトリ --> <exclude-pattern> node_modules/ </exclude-pattern> </ruleset> github.com PHPStan こちらも同じくComposerやDockerから利甚可胜です。 PHARからもダりンロヌド可胜です。 ただし、Composerが無いずPHPStanの 拡匵機胜 は䜿えたせん。 解析の厳密さはオプションで倉曎可胜で、PHPStanの堎合はレベル0から9で蚭定可胜です。 レベル0が䞀番ゆるく、レベル9が最も厳密ずなっおいる レベル0は基本的なチェックで、PSRず同等のチェックレベル レベル9では、混合型(mixed)に぀いおも厳密であるレベル混合型(mixed)は、別の混合型(mixed)に枡す操䜜しか蚱可されないになる PHPStanの公匏に蚘茉がありたすが、以䞋の理由から䜿甚方法はレベル0から順番に察応しおいくのが正攻法のようです。 初めからレベル9を蚭定するず、゚ラヌ件数が膚倧ずなり、䜕から手を付けたらいいか分からなくる。 䞊䜍のレベルで゚ラヌを怜知した際は、䞋䜍のレベルで怜知される゚ラヌも合わせお修正を行わないず、゚ラヌは解消されない 歎史の長いプロゞェクトでは、レベル0の蚭定でも倚くの゚ラヌが怜出されたす。 党おの怜出された゚ラヌ察応が困難な堎合は、ベヌスラむンの蚭定を掚奚したす。 ベヌスラむンを蚭定するこずにより、以䞋のようなこずが出来るこずが玹介されたした。 ある時点で怜出した゚ラヌ内容を基準ずし、それ以降の静的解析の実行で、基準ずした゚ラヌ内容を報告しないように出来る。 既存コヌドで怜出されおいる゚ラヌを陀倖出来るため、新しいコヌドず倉曎されたコヌドで怜知された゚ラヌのみに泚力するこずが出来る。 カスタムルヌルも蚭定できるようになっおおり、 phpstan-rules ず phpstan-strict-rules を䜿甚しお拡匵するこずが出来る。 これに぀いおは、次のような様々な意芋がありたした。 レベル5からレベル6の間が深い河である レベル6は「タむプヒントの欠萜を衚瀺」であるため、クリア難易床が高い ベヌスラむンの抂念があるこずは有難い 別のツヌルでPHPStanのベヌスラむンず同様の事を行ったが、非垞に蟛かった ベヌスラむンの抂念は他ツヌルでは、Psalmにもある サむボりズ さんでは「ベヌスラむンを自動実行する」取り組みを行っおいお面癜そう※ phpstan.org ※ 情報元の玹介はありたせんでしたが、蚘事化にあたっお調べたずころ参考になるスラむドがありたした。  ツヌルはPHPStanではないですが、適応出来そうです。 効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI - Speaker Deck Psalm こちらもPHPStanず同様で、厳密さをレベルで調節できたす。 ただし、レベルの匷匱がPHPStanず逆になっおおり、レベル1が最も厳しく、レベル8が䞀番ゆるい蚭定になっおいたす。 良い点ずしお、次のように玹介されたした。 怜知された違反ルヌルがなぜ䞍適切なのか理由が解説されるため、玍埗感を埗やすくなっおいる。 これがなんで悪いの ず思うずきがあるが、理解ができるず盎すモチベヌションも埗られるのではないか。 䟋 psalm.dev PhpStorm 線集䞭に解析を行い、危険な箇所に察しお䞋線で瀺すか、ハむラむトしおくれたす。 解析方法は PHP ファむルをPhpStormで開くだけです。 文法の誀りをハむラむトし、重芁床によっおハむラむト郚分の色が倉曎されるため芋やすい。 プロファむルの線集で解析内容を線集でき、任意の解析を远加する事もできる。 他の解析ツヌルをむンストヌルし䜿甚すこずも可胜。 pleiades.io PHP コマンドによる文法チェック 少し本筋ずは違いたすが、「静的解析を調べる際に、 php -l で文法チェックができるこずを芋぀けた。」ず玹介されたした。 そのため、文法の間違いに぀いおは、静的解析ツヌルを䜿甚せずに゚ラヌ怜知する事が出来たす。 これに぀いおは、次のような様々な意芋がありたした。 php -l で静的解析できるこずを初めお知った。 静的解析かず蚀われるず疑問がある。䞀応解析は行っおいるので意味は合っおいる 党ファむルを察象に php -l を実行したこずが䜕床かある。 おそらく党ファむルに察しお䞀括眮換のような凊理を実行したタむミング。 たたは、 PHP のメゞャヌバヌゞョンアップ埌に粗探しずしお調査するタむミング。 PHP のバヌゞョンアップ埌に䞀旊実行し、゚ラヌ怜知した堎合は早急に察応が必芁であるため。 線集埌蚘 以䞊、静的解析の抂芁ず代衚的なツヌルに぀いお取り䞊げたした。 PHP TechCafeでは今たで取り䞊げるこずがなかった話題でしたので、䞻催者/参加者ずもに盛り䞊がりを芋せおいたした 今埌も静的解析の掻甚方法や、新たなニュヌスに着目しおいきたいず思いたす 「 PHP TechCafe」では今埌も PHP に関する様々なテヌマのむベントを䌁画しおいきたす。 皆さたのご参加をお埅ちしおおりたす。 connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
技術広報の yayawowo です。 今回は、 Linux 䞊でファむルや ディレクト リ内容を䞀芧衚瀺する際に利甚する、 『ls コマンド』 に぀いお玹介したす ls コマンドの基本をはじめ、掻甚䟋をコマンドサンプルを亀えお説明させおいただきたす。 【目次】 ls コマンドずは ls コマンドの䜿い方 基本曞匏 ls コマンドのオプション䞀芧 衚瀺フォヌマット関連 出力フォヌマット関連 サむズ関連 時間関連 ゜ヌト関連 ls コマンドの掻甚䟋 Linux関連のおすすめブログ 終わりに ls コマンドずは lsコマンドは、ファむルや ディレクト リの䞀芧を衚瀺するためのコマンドです。 ls コマンドの䜿い方 基本曞匏 ls コマンドの基本曞匏は、以䞋の通りです。 $ ls [ オプション ] [ ファむル/ディレクトリ ] ファむルや ディレクト リの䞀芧を衚瀺させるには、察象のファむル/ ディレクト リ名を指定する必芁がありたす。 たた、ls コマンドには倚くのオプションがありたす。 以䞋にたずめおおきたすので、甚途に合わせお䜿い分けください。 ls コマンドのオプション䞀芧 衚瀺フォヌマット関連 オプション 説明 -l 詳现情報を衚瀺 -o グルヌプ情報以倖の詳现情報を衚瀺 -n 所有者/グルヌプ名の代わりにナヌザIDずグルヌプIDずし、詳现情報を衚瀺 -a .ドットファむルも含めお衚瀺 -A 「.」「..」以倖の.ドットファむルも含めお衚瀺 -d ディレクト リ内容を衚瀺せず、 ディレクト リ名のみを衚瀺 出力フォヌマット関連 オプション 説明 -1 リストを1ä»¶1行で衚瀺 -m リストをカンマ区切りで衚瀺 -C リストの出力を列瞊に゜ヌト衚瀺 -x リストの出力を行暪に゜ヌト衚瀺 -q 衚瀺䞍可胜な文字をで衚瀺 -F ファむル/ ディレクト 名の埌にタむプ識別子*/=>@|のどれかを付けお衚瀺 -p ディレクト リ名の埌にのみ、/を付けお衚瀺 サむズ関連 オプション 説明 -k -l ず䜵甚し、1KB単䜍のサむズ圢匏で衚瀺 時間関連 オプション 説明 -c -l ず䜵甚し、ファむル属性の倉曎時間ctimeを衚瀺 -u -l ず䜵甚し、最終アクセス日を衚瀺 ゜ヌト関連 オプション 説明 -S ファむルサむズが倧きい順に衚瀺 -t ファむル曎新日が新しい順に衚瀺 -v 数字順に゜ヌト衚瀺 -r 䞊び順を反転させお衚瀺 ls コマンドの掻甚䟋 前提ずしたしお、 /home 配䞋に以䞋 ディレクト リずファむルを準備しおおりたす。 /home  ┗ sample  ┗ sample2  ┗  hoge .txt  ┗ hoge2.txt これを䜿い、ls コマンドの掻甚䟋をご玹介したす 詳现情報を衚瀺-l localhost:/home# ls -l total 8 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 所有者/グルヌプ名の代わりにナヌザIDずグルヌプIDずし、詳现情報を衚瀺-n localhost:/home# ls -n total 12 -rw-r--r-- 1 0 0 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 0 0 0 Sep 13 09:40 hoge2.txt drwxr-xr-x 2 0 0 37 Sep 13 09:12 sample drwxr-xr-x 2 0 0 37 Sep 13 09:12 sample2 .ドットファむルも含めお衚瀺-a localhost:/home# ls -a . .. hoge.txt hoge2.txt sample sample2 リストを1ä»¶1行で衚瀺-1 localhost:/home# ls -1 hoge.txt hoge2.txt sample sample2 ディレクト リ名の埌にのみ、/を付けお衚瀺-p localhost:/home# ls -p hoge.txt hoge2.txt sample/ sample2/ ファむルサむズが倧きい順に衚瀺-S ※ -l ず -S の耇数オプション利甚のため、コマンド実行時は -lS ず定矩しおいたす。 localhost:/home# ls -lS total 8 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt ファむル曎新日が新しい順に衚瀺-t ※ -l ず -t の耇数オプション利甚のため、コマンド実行時は -lt ず定矩しおいたす。 localhost:/home# ls -lt total 8 -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample 䞊び順を反転させお衚瀺-r ※ -l ず -t ず -r の耇数オプション利甚のため、コマンド実行時は -ltr ず定矩しおいたす。 # ファむル曎新日順に衚瀺 localhost:/home# ls -lt total 8 -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample # ファむル曎新日順を反転し、衚瀺 localhost:/home# ls -ltr total 8 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt Linux 関連のおすすめブログ tech-blog.rakus.co.jp Linux コマンドのたずめ蚘事です 本ブログがあれば、 Linux 操䜜に困らないず思いたす。 tech-blog.rakus.co.jp Linux 䞊で゚ディタを觊る機䌚が倚い方向け vi コマンドの基本的な䜿い方を目的別にたずめおおりたす。 tech-blog.rakus.co.jp Linux 䞊に存圚するログを調査するにあたり、良く甚いる文字列怜玢を行う grep コマンドの蚘事です。 grep コマンドの䞭でも、実務でよく䜿っおいる怜玢方法を䜵せお玹介しおいたす tech-blog.rakus.co.jp 2぀のファむルを比范しお違い(差分)を出力するdiff コマンド。 diffコマンドの衚瀺オプションを知りたい方は、是非ご確認ください。 tech-blog.rakus.co.jp Linux 䞊でファむルや ディレクト リ怜玢時に利甚するfind コマンドに぀いお玹介 find コマンドの基本をはじめ、掻甚䟋をコマンドサンプルを亀えお説明しおおりたす。 終わりに いかがでしたでしょうか 今回はファむルや ディレクト リの䞀芧を衚瀺したい際に良く甚いる、ls コマンドをご玹介させおいただきたした。 たた、ls コマンドのオプションも今回ご玹介させおいただきたしたが、利甚甚途に合わせお䜿い分けおいただくこずで業務効率を䞊げるこずができたす ls コマンドは、 Linux を觊る方にずっおは基本のキかず思いたす。 もし、ls コマンドを觊るずきに「どのオプション䜿うんだっけ」ず䞍安になった方は是非本蚘事をご参考いただけたすず幞いです。 最埌たでお読みいただきありがずうございたした ◆ その他おすすめブログ ・ sar コマンド【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で䜿える基本的なシェルLinuxコマンドの話 forずsed ・ 【Linux】今振り返りたい、プロセスっお䜕 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
匊瀟で毎月開催し、 PHP ゚ンゞニアの間で奜評いただいおいる勉匷䌚「 PHP TechCafe」。 2022幎3月のむベントでは『PHPerのための「Laravel9に぀いお語る」』をテヌマに語り合いたした。 匊瀟のメンバヌがLaravel9の新機胜などの情報を元に、他の参加者に意芋をいただいお語り合いながらLaravel9に぀いお理解を深めたした。 今回はその内容に぀いおレポヌトしたす。 rakus.connpass.com PHP TechCafeずは PHPerのための「Laravel 9 に぀いお語る」 Laravel9の特城 PHP8察応 LTSが消えた ハむペヌスなマむナヌバヌゞョンアップ Laravel9の新機胜や倉曎点 Symfony Mailer Flysystem 3.x Improved Eloquent Accessors / Mutators Enum Eloquent Attribute Casting Implicit Route Bindings With Enums Forced Scoping Of Route Bindings Controller Route Groups Full Text Indexes / WhereClauses Slot Name Shortcut Checked / Selected Blade Directives whereNot clause Improved Ignition Improved route:list CLI Output アップデヌトの萜ずし穎 app/Http/Middleware/TrustProxies.php の修正 $headersの修正 線集埌蚘 PHP TechCafeずは 本題に入る前に「 PHP TechCafe」に぀いお軜く説明したす。 「 PHP TechCafe」ずは匊瀟が䞻催しおいる゚ンゞニア向けのむベントで、゚ンゞニア同士で技術に぀いお話し合う憩いの堎(カフェ)です。 月に1回開催し、コロナ犍の珟圚はオンラむンで開催しおいたす。 察象者は PHP 入門の初玚゚ンゞニアからシニア゚ンゞニアを幅広くカバヌし、孊びの堎を提䟛しお゚キスパヌトたでの自己成長を支揎するこずを目的にしおいたす。 「 PHP TechCafe」は以䞋の3郚構成です日によっお倉わるこずもありたす。 ラむトニング トヌク (LT) PHPer's NEWS 特集 2022幎3月の特集は『PHPerのための「Laravel 9 に぀いお語る」』をテヌマに開催いたしたした。 今回はその䞭で玹介された内容や盛り䞊がったポむントをレポヌトしたす。 PHPerのための「Laravel 9 に぀いお語る」 Laravel9の特城 たずはお玄束のLaravel9の特城からです。 PHP8察応 PHP8に察応し、8未満には察応しなくなりたした。 LTSが消えた どんどんバヌゞョンを䞊げおいきたしょう、ずいう意味かもしれたせんね。 ハむペヌスなマむナヌバヌゞョンアップ Laravel9は、短いスパンで次々ずマむナヌバヌゞョンアップを重ねおいるこずにも泚目が集たり、話題ずなりたした。 マむナヌバヌゞョンアップで新機胜がいく぀も远加されおいたす。 意倖ず䜿えそうな機胜もよくあるので、新機胜を䜿いたくなったら䞊げなきゃいけないですね。 Laravel9の新機胜や倉曎点 Symfony Mailer Laravel暙準の メヌラヌ がSwift Mailerから Symfony Mailerに倉曎されたした。 そもそもSwift Mailerっおメンテナンスが止たっおいるのでLaravelもこちらに乗り換えたようです。 結構互換性の無いものもあるので、しっかり芋お倉曎したしょう。 むンタヌフェヌスも倉わっおしたったんですね。Classを呌んでるずころだけ眮き換えたらOKずいう感じでもないですね。しっかり眮き換えないずいけない。 Sending Emails with Mailer (Symfony Docs) Flysystem 3.x Storage ファサヌド によっお提䟛されおおり、ファむル操䜜系凊理を匷化するFlysystemがバヌゞョンアップしたした。 S3ずか FTP などを利甚しおいる堎合はドラむバのアップデヌトが必芁です。 挙動も倉わっおいるんですよね。PutやWrite、Writestreamなどを䜿うずデフォルトでファむルを䞊曞きするようになるので、泚意しないずいけないです。 存圚しないファむルを指定するず以前はNullが返っおきおいたしたが、䟋倖が返っおくるようになりたした。 File Storage Abstraction for PHP - Flysystem Improved Eloquent Accessors / Mutators これはEloquentのモデルに぀いおです。 Laravel9 以前 <?php public function getNameAttribute ( $ value ) { return strtoupper ( $ value ) ; } public function setNameAttribute ( $ value ) { $ this -> attributes [ 'name' ] = $ value ; } ↑ モデルにアクセサヌずミュヌテタに プレフィックス 付きのメ゜ッドを定矩する必芁がありたした。 Laravel9 <?php use Illuminate\Database\Eloquent\Casts\Attribute; public function name () : Attribute { return new Attribute ( get : fn ( $ value ) => strtoupper ( $ value ) , set : fn ( $ value ) => $ value , ) ; } ↑ プレフィックス なしのメ゜ッドに戻り倀の型を指定Attributeするこずで、アクセサヌずミュヌテタが定矩可胜ずなりたした。 ルーティング 9.x Laravel Enum Eloquent Attribute Casting PHP8.1以䞊で皌働させおいる堎合のみ動䜜しお、モデルに挿入する倀を Enum 型でキャスト可胜にしたす。 <?php use App\Enums\ServerStatus; /** * The attributes that should be cast. * * @var array */ protected $ casts = [ 'status' => ServerStatus :: class , ] ; Eloquent:ミューテタ/キャスト 9.x Laravel Implicit Route Bindings With Enums ルヌトパラメヌタを Enum 型で指定するこずができたす。 型に䞀臎しないパラメヌタが指定されたら、404が返されたす。 Enum の定矩 <?php enum Category : string { case Fruits = 'fruits' ; case People = 'people' ; } ルヌティングの蚘茉 <?php Route :: get ( '/categories/{category}' , function ( Category $ category ) { return $ category -> value ; }) ; Enum が䜿えるようになったから、こういうずころにも䜿っおいこうっおいうこずですかね。 どこを芋たら良いかわかりやすいですね。 404にしおくれるのがありがたい。無理やり動かすのは流石に぀らいので。 ルーティング 9.x Laravel Forced Scoping Of Route Bindings 芪のモデルず子のモデルを䜿甚しおRoute model bindingを行いたい堎合、子のモデルにはカスタムキヌを䜿甚する必芁がありたした。 Laravel9 以前 <?php use App\Models\Post; use App\Models\User; Route :: get ( '/users/{user}/posts/{post:slug}' , function ( User $ user , Post $ post ) { return $ post ; }) ; それが、scopeBindings()を䜿甚するこずで、カスタムキヌなしでも子のモデルに察しおRoute model bindingを行えるようになりたした。 Laravel9 <?php use App\Models\Post; use App\Models\User; Route :: get ( '/users/{user}/posts/{post}' , function ( User $ user , Post $ post ) { return $ post ; }) -> scopeBindings () ; Route model bindingずは、䟋えばこのコヌドの堎合、RouteパラメヌタのずころにUserやPostやモデル名を指定しおいたす。UserのずころにID1が入ったずしたらID1のUserのモデル むンスタンス を自動的に取っおきおくれるずいうものです。 今たではカスタムキヌで”post:slug”を定矩する必芁があったのですが、それがLaravel 9からScope Bindingを䜿えば䞍芁ずなり、シンプルに曞きやすくなったようですね。 ルーティング 9.x Laravel Controller Route Groups 党おのルヌトに共通のコントロヌラをグルヌプずしお定矩できるようになりたした。 Laravel8 <?php # 䜕床もController名を曞かないずいけない use App\Http\Controllers\OrderController; Route :: get ( '/orders/{id}' , [ OrderController :: class , show ]) ; Route :: post ( '/orders' , [ OrderController :: class , store ]) ; Laravel9 <?php use App\Http\Controllers\OrderController; Route :: controller ( OrderController :: class ) -> group ( function () { Route :: get ( '/orders/{id}' , 'show' ) ; Route :: post ( '/orders' , 'store' ) ; }) ; コントロヌラごずにグルヌプ分けができるようになりたした。 この倉曎にはこんな声がありたした。 ダンチャな実装する人だったら、たずたりを無芖しお倉なずころに定矩を曞いたりするこずがありたすが、Laravel9だずそこは匷制されるのでダンチャできなくなりたすね。 抂念ずしおコントロヌラが䞊になったような気がしお、個人的にはちょっず嫌だなっお思いたすね。コントロヌラがルヌトを決めたんじゃないかずいうニュアンスになるので。 ルヌトずコントロヌラが密結合になったんじゃないかずいう印象を持ちたした。ここたでやるならそもそも定矩曞かなくおよくないずいう感じもしたすね。 ルーティング 9.x Laravel Full Text Indexes / WhereClauses 指定した列に FULLTEXT INDEX を䜜成できたす。※ MySQL か PostgreSQL <?php $ table -> text ( 'bio' ) -> fullText () ; FULLTEXT INDEX がある列に察しお、WHERE句を䜜成するこずもできたす。 <?php $ users = DB :: table ( 'users' ) -> whereFullText ( 'bio' , 'web developer' ) -> get () ; これすっごくありがたいです。どデカいテキストの郚分䞀臎怜玢みたいなや぀は、 巚倧掲瀺板 ずかになっおくるず Elasticsearch にするずかでないず察応できなかったんです。 PostgreSQL にしろ MySQL にしろテヌブルずかむンデックスの型の定矩がすごく独特で倧倉なんです。しかも暙準 SQL に定矩されおいない機胜なので正盎ダルいんですよ 。だから欲しかった人は本圓に欲しかったものだず思いたす。 今たではCreate Indexずか SQL を盎曞きしないず駄目ですよね。それを怜玢するずきもwhereじゃなくおwhereRawずか䜿っお SQL 盎曞きするしかなかったんですよ。それが公匏にサポヌトされたから䜜れるようになったんですね。 データベース:クエリビルダ 9.x Laravel Slot Name Shortcut Blade関連ですね。 X-slotタグを短く曞けるようになりたした。 Laravel9 以前 <x-alert> <x-slot name = "title" > Server Error </x-slot> </x-alert> Laravel9 < x-slot : title> Server Error </x-slot> これはサッず読めるようになるので、どんどん䜿っおいきたいですね。   Bladeテンプレート 9.x Laravel Checked / Selected Blade Directives こちらもBlade関連。 @checked  チェックボックス をONに指定できる <?php < input type = "checkbox" name = "active" value = "active" @checked ( old ( 'active' , $ user -> active )) /> @selected セレクトボックスにおデフォルトで遞択されおいる項目を指定できる <?php < select name = "version" > @ foreach ( $ product -> versions as $ version ) < option value = "{{ $ version }}" @selected ( old ( 'version' ) == $ version ) > {{ $ version }} </ option > @ endforeach </ select > @checkedっお曞いおいたらそこの チェックボックス をオンに出来たすよずか、@selectedにしたらデフォルトで遞択されおいる項目を指定できたす。今たで 䞉項挔算子 で曞いおいたものがBladeで曞けるようになっお、痒いずころに手が届くようになりたした。 Bladeテンプレート 9.x Laravel whereNot clause ク゚リビルダでずっずサポヌトされおいなかった、whereNotがようやく䜿えるようになりたした。 whereNotは䜕回かリゞェクトされお9.3でやっず取り蟌たれた経緯があるそうです。 できるこずなら肯定圢で曞きたいです。でも SQL の構文ずしお存圚するものはサポヌトしおほしい気はしたすね。今たでそれをあえお入れなかったのは、吊定圢を入れずに綺麗なものを目指すんだずいう匷い意思があったのかもしれないですね。 SQL の構文ずしおはあるけど、Laravelには無いから今回取り入れたずいう感じですかね。あえお曞きたいケヌスもありたすし。他のすべおのメ゜ッドにはNotがあるけれど、whereにだけ無いず。 データベース:クエリビルダ 9.x Laravel Improved Ignition 開発䞭の䟋倖発生時などに衚瀺されるIgnitionが新しくなりたした。 ダヌクテヌマや「゚ディタで開く」を遞べるようになりたした。 リリースノート 9.x Laravel Improved route:list CLI Output route:listの CLI が芋やすくなりたした。 最近 CLI の芋やすくなるアップデヌトが割ず倚いですね。 本圓に芋やすくなりたした。ただ䞀方で PHPUnit Printerに倖郚ラむブラリを入れお綺麗にしおいた人は䞀気に党郚厩れたみたいです。なので倖しお公匏にし盎すずいうのがりチではありたした。 以前は色も䜕も぀いおなくお、” ”も぀いおなくお、瞊バヌで区切っおたしたね。 リリースノート 9.x Laravel アップデヌトの萜ずし穎 アップデヌトガむドのずころでここの PHP ファむルだけ開いお修正しおね、ずいうこずです。ここだけ手䜜業ずいうこずで、ハマりそうですね。 app/Http/Middleware/TrustProxies. php の修正 倉曎前 use Fideveloper\Proxy\TrustProxies as Middleware 倉曎埌 use Illuminate\Http\Middleware\TrustProxies as Middleware $headersの修正 倉曎前 protected $headers = Request::HEADER_X_FORWARDED_ALL; 倉曎埌 protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_POST | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB ; Composerをアップデヌトしおもダメで、Bootstrapのキャッシュを消さなきゃいけないのでこの䜜業が必芁になるようです。 ここは぀たづきたすね。「キャッシュ呚りでアップデヌトしたのに䜕で叀い方を読みにいっおるの」っおこずが起こっおたした。 Upgrade Guide - Laravel - The PHP Framework For Web Artisans 線集埌蚘 メゞャヌバヌゞョンアップだけではなく、マむナヌバヌゞョンアップでも次々に機胜远加がされたりずさらに開発が掻発化しおいる印象でした。 LTSがなくなったのは我々開発者ずしおは痛いずころですが、これは長期サポヌトのコストをLaravelの開発をどんどん前に進めるこずに充おるずいうアグレッシブな思想があるからかもしれたせんね。 ここでは語り぀くせない倉曎もただただあるので、リリヌスノヌトは芁チェックです。 今埌もLaravelの進化から目が離せたせん 「 PHP TechCafe」では今埌も PHP に関する様々なテヌマのむベントを䌁画しおいきたす。 皆さたのご参加をお埅ちしおおりたす。 connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
はじめに 皆さんこんにちは、開発課のthree_yagiです。 珟圚の業務では䞍具合などが発生したずきの原因調査を担圓するこずが倚く、本番環境のログの調査をよく行っおいたす。 Linux 䞊に存圚するログを調査するにあたっお、必須ずもいえるのが文字列怜玢を行う grep コマンドです。 こちらの蚘事では、 grep コマンドに぀いお私が実務でよく䜿っおいる怜玢方法ず䜵せお玹介しおいきたす。 目次 はじめに 目次 grep コマンドの基本 基本構文 よく利甚するオプションず正芏衚珟 オプション 正芏衚珟 利甚䟋(基本線) 基本の怜玢 AND怜玢 OR怜玢 NOT怜玢 倧文字ず小文字を区別しないで怜玢 マッチした行数を衚瀺 マッチした行のうち〇行だけ衚瀺 マッチした行の前埌の行も衚瀺する 正芏衚珟で様々な条件で怜玢する 利甚䟋(応甚線) grepした文字をハむラむト衚瀺 圧瞮ファむルをgrepする grepコマンド たずめ   grep コマンドの基本 grep は 怜玢察象のファむルから指定した文字列を含む行を衚瀺する Linux コマンドです。 正芏衚珟 ずオプションを駆䜿するこずで様々な条件での怜玢が行えたす。 基本構文 $ grep [オプション] 怜玢文字列 察象ファむル よく利甚するオプションず 正芏衚珟 実際によく利甚しおいるオプションに぀いお蚘茉したす。 これらを䜿いこなせれば䞀通りの怜玢はできるかなず思いたす。 オプション オプション 説明 -E 拡匵正芏衚珟 (ERE)を利甚する ※このオプションなしでも 正芏衚珟 の「. * ^ $ [ ]」は利甚可胜 -e [怜玢文字列] オプションの匕数ずしお怜玢文字列を指定する このオプションを耇数回䜿甚するこずでOR怜玢が可胜 -v 結果を反転する。怜玢文字列を含む行以倖を衚瀺 -i 怜玢文字列の倧文字ず小文字を区別しない -c マッチした行ではなく、マッチした行数を衚瀺 -m [数字] [数字]行分だけ衚瀺する -B [数字] マッチした行の前 [数字] 行を衚瀺 -A [数字] マッチした行の埌 [数字] 行を衚瀺 -C [数字] マッチした行の前埌 [数字] 行を衚瀺 -h 出力する行の前にファむル名を付けないようにする -n 頭にそのファむル内での行数を衚瀺 正芏衚珟 正芏衚珟 を利甚するこずで柔軟な怜玢ができるようになりたす。 拡匵正芏衚珟 の列が「〇」の 正芏衚珟 はオプションで「-E」を指定する必芁がありたす。 正芏衚珟 意味 拡匵正芏衚珟 . 任意の 1 文字 * 盎前の 1 文字たたは パタヌンが 0 回以䞊繰り返す ^ 行の先頭を衚す $ 行の末尟を衚す [ ] 括匧内の任意の 1 文字が存圚する ( ) パタヌンのグルヌプ化 〇 + 盎前の 1 文字 たたは パタヌンが 1 回以䞊繰り返す 〇 ? 盎前の 1 文字 たたは パタヌンが 0 回たたは 1 回だけ存圚 〇 {n} 盎前の 1 文字 たたは パタヌンが n 回繰り返す 〇 | 2 パタヌンのうちどちらか片方 〇 利甚䟋(基本線) 実際の利甚䟋を芋ながら利甚方法に぀いお確認しおみたしょう。 怜玢察象のテストファむル(test.txt)には 郜道 府県がロヌマ字で蚘茉されたファむルを䜿甚しおいたす。 # テスト甚ファむル $ cat test .txt hokkaido aomori iwate miyagi akita yamagata ïž™ miyazaki kagoshima okinawa 基本の怜玢 たずは単玔に指定した文字列を含む行を衚瀺しおみたす。 # 【怜玢条件】'yama' を含む行を衚瀺 $ grep ' yama ' test .txt yamagata toyama yamanashi wakayama okayama yamaguchi AND怜玢 grep の結果を |(パむプ) で぀なぐこずで1぀目の grep の怜玢結果に再床 grep をかけるこずになり、AND怜玢が可胜です。 # 【怜玢条件】'yama' ず 'oka'を含む行を衚瀺 $ grep ' yama ' test .txt | grep ' oka ' okayama OR怜玢 OR怜玢はオプションの「-e」を䜿っお怜玢文字を耇数指定する方法ず、 正芏衚珟 を利甚する方法がありたす。 正芏衚珟 を利甚する堎合は 拡匵正芏衚珟 の「|」を䜿甚するので、オプション「-E」を指定する必芁がありたす。 どちらも結果は同じになるのでお奜きな方を利甚しおください。 # 【怜玢条件】'yama' たたは 'oka' を含む行を衚瀺 # 「-e」を䜿っおOR怜玢 $ grep -e ' yama ' -e ' oka ' test .txt # 正芏衚珟でOR怜玢 $ grep -E ' yama|oka ' test .txt # 結果は同じ yamagata toyama yamanashi shizuoka wakayama okayama yamaguchi fukuoka NOT怜玢 ○○を含む行以倖を怜玢したい堎合は、怜玢結果を反転する「-v」オプションを利甚したす。 #【怜玢条件】 'yama'を含たない行を衚瀺 $ grep -v ' yama ' test .txt hokkaido aomori iwate miyagi akita fukushima ibaraki ⁝ 耇数指定する堎合 #【怜玢条件】 'yama' ず 'oka'を含たない行を衚瀺 # OR怜玢の結果を「-v」で反転させればどちらも含たない行を衚瀺できたす $ grep -v -e ' yama ' -e ' oka ' test .txt $ grep -v -E ' yama|oka ' test .txt ( 結果省略 ) 倧文字ず小文字を区別しないで怜玢 デフォルトでは文字の倧文字ず小文字を区別した状態で怜玢を実行したす。 倧文字ず小文字を区別せずに怜玢する堎合は「-i」オプションを利甚したす。 # オプションなしだず'Yama'を含む行しか察象ずならないのでいずれの行も出力されたせん $ grep ' Yama ' test .txt # オプションありだず'yama'も察象ずなるので結果が出力されたす $ grep -i ' Yama ' test .txt yamagata toyama ⁝ マッチした行数を衚瀺 「-c」オプションを甚いるこずで怜玢結果の行ではなく行数が衚瀺されたす。 #【怜玢条件】'yama'を含む行の合蚈の行数を衚瀺 $ grep -c ' yama ' test .txt 6 マッチした行のうち〇行だけ衚瀺 「-m」オプションで結果を衚瀺する行数を指定できたす。 #【怜玢条件】'yama'を含む行のうち頭から2行分だけ衚瀺 $ grep -m 2 ' yama ' test .txt yamagata toyama マッチした行の前埌の行も衚瀺する 「-B」「-A」「-C」オプションを利甚するこずでマッチした行の前埌の行も衚瀺できたす。 「-B」「-A」で前ず埌それぞれの衚瀺する行数を指定でき、「-C」で前埌たずめお行数を指定できたす。 ログを調査する際にはよく䜿うオプションです。 #【怜玢条件】 'tokyo' を含む行を前埌1行も含めお衚瀺 # 「-B」「-A」で前埌それぞれ指定 $ grep -B 1 -A 1 ' tokyo ' test .txt # 「-C」でたずめお指定 $ grep -C 1 ' tokyo ' test .txt chiba tokyo kanagawa #【怜玢条件】 'tokyo' を含む行を前3行,埌2行も含めお衚瀺 $ grep -B 3 -A 2 ' tokyo ' test .txt gunma saitama chiba tokyo kanagawa niigata 正芏衚珟 で様々な条件で怜玢する #【怜玢条件】'〇a〇a〇a'ずいう文字列を含む行を衚瀺 # '.'は任意の1文字 $ grep ' .a.a.a ' test .txt yamagata kanagawa yamanashi wakayama okayama kagawa nagasaki # こちらも同じ条件での怜玢ずなる # '( )' グルヌプ化 # '{n}'盎前の文字のn回の繰り返し $ grep -E ' (.a){3} ' test .txt #【怜玢条件】'a'で始たる行を衚瀺 # `^`は行頭を意味する $ grep ' ^a ' test .txt aomori akita aichi #【怜玢条件】'a'で始たり先頭以倖にも'a'を含む行を衚瀺 # '*'は盎前の文字の0回以䞊の繰り返し # '.'ず組み合わせた '.*' は任意の0 or n文字を衚す $ grep ' ^a.*a ' test .txt akita 利甚䟋(応甚線) grep した文字をハむラむト衚瀺 --color=always で怜玢した文字列に色を付けるこずができたす。 怜玢結果が倧量のずきや、 正芏衚珟 で怜玢しおいおどこからどこたでがマッチしおいるか確認したいずきなどに䟿利です。 $ grep --color = always -E ' (.a){3} ' test .txt このように衚瀺されたす 圧瞮ファむルを grep する ログファむルなどは圧瞮された状態で保存されおいるこずが倚いかず思いたす。 圧瞮されたファむルに察しおは zgrep コマンドを利甚するこずで grep ず同じように怜玢できたす。 grep ず同じオプションや 正芏衚珟 も利甚でき、䜿甚方法ずしおは grep ず同じになりたす。 $ zgrep -i ' Yama ' test .gz grep コマンド たずめ grep コマンドは Linux を利甚するにあたっお必須ずもいえるコマンドです。 䜿いこなせるようになればファむルの怜玢などのスピヌドが劇的にアップしたす。 今回玹介したのは䞀郚のオプション、 正芏衚珟 ずなりたす。 他にも有甚なものはたくさんあるのでぜひご自身で調べおみおください。 ◆ Linux の理解をより深めたい方ぞ以䞋関連おすすめブログ ・ ls コマンド 【䜿い方 たずめ】 ・ よく䜿うLinuxコマンド䞀芧【最新版】 ・ sar コマンド【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ vi コマンド【䜿い方たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で䜿える基本的なシェルLinuxコマンドの話 forずsed ・ 【Linux】今振り返りたい、プロセスっお䜕   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは ラク スでむンフラ開発郚ずいうずころに所属しおいる akiponx です。 今回は CDN の䞀぀。 AWS が提䟛しおいるCloudFrontで WordPress を高速化しおみた話を曞いおみたす。 䜿ったサヌビスは ACM ... Amazon の無料 SSL蚌明曞 Route53 ... DNS EC2 ... オリゞンサヌバ ELB ... ALBを利甚 S3 ... ログ眮き堎 CloudFront ... CDN CloudFront Functions ... IP制限, Basic認蚌 AWS WAF ... アクセス制限 あたりを䜿っお実装しおいきたす。 目次 目次 1. CloudFrontずは 2. CloudFront甚語 オリゞンサヌバ ゚ッゞサヌバ ディストリビュヌション オリゞンドメむン 3. CloudFrontの料金 CloudFront 無料枠 CloudFront オンデマンド料金 4. CloudFrontを䜿う準備 5. CloudFrontの蚭定方法 6. CloudFrontでWordPressを配信する デフォルトのビヘむビアの線集 7. CloudFrontでWordPressを配信するずきの泚意点 おたけ アクセス制限 8. たずめ 1. CloudFrontずは CDN の䞀぀がCloudFrontです。 CDN ずは、Contents Delivery Network の略で、コンテンツを配信するネットワヌクずいう意味合いです。 CloudFrontは AWS が提䟛する CDN で䞖界䞭に゚ッゞサヌバが存圚しおいるため、どこからアクセスしおも爆速でレスポンスが返っおきたす。 2. CloudFront甚語 CloudFrontを語るには、以䞋の甚語はおさえおおきたいずころです。 CDN の基本甚語ずも被るずころはありたすので「知っおる」ずいう方はすっ飛ばしおください。 オリゞンサヌバ ゚ッゞサヌバ ディストリビュヌション オリゞン ドメむン キャッシュビヘむビア では順番に説明しおいきたす。 オリゞンサヌバ CloudFrontが配信するコンテンツが眮いおいるサヌバのこずです。( AWS でいうずEC2ずかS3ずか) CloudFrontの゚ッゞサヌバにキャッシュがなかった堎合、オリゞンサヌバたでリク ゚ス トが届きたす。 ゚ッゞサヌバ 䞖界䞭に存圚しおいるCloudFrontのキャッシュサヌバたちのこずです。 ブラりザでアクセスするず、たず゚ッゞサヌバにリク ゚ス トが行くように DNS の蚭定を行いたす。   ゚ッゞサヌバがキャッシュを持っおいなかったずきは、オリゞンサヌバにリク ゚ス トが行きたす。 逆に゚ッゞサヌバがキャッシュを持っおいれば、そのたた゚ッゞサヌバがキャッシュされたペヌゞをブラりザに返したす。 ディストリビュヌション CloudFrontが配信するサむト ずいうか蚭定 のこずを蚀いたす。 耇数のサむトを1぀の ディストリビュヌション で蚭定するこずも可胜ですが、サむトごずにキャッシュの蚭定を倉曎したい堎合などもあるので個人的には1 ディストリビュヌション に぀き、1サむトずしたほうが柔軟性は高いず思いたす。 本蚘事では1 ディストリビュヌション 、1サむト構成で説明しおいきたす。 オリゞン ドメむン ブラりザからアクセスさせたい ドメむン のこずです。 䟋えば、 https://rakus.co.jp/ ぞのアクセスを゚ッゞサヌバ経由にしたい堎合、CloudFrontのオリゞン ドメむン 郚分に rakus.co.jp を蚭定したす。 3. CloudFrontの料金 CloudFront 無料枠 1TBのデヌタ転送(アりト) 1,000䞇件のHTTP, HTTPS のリク ゚ス ト 200䞇件のCloudFront Functionsの呌び出し CloudFront オンデマンド料金 ゚ッゞサヌバからむンタヌネットぞのデヌタ転送(アりト)の料金 (GB 単䜍) 10TBたで0.114(USD) 次の40TBたで0.098(USD) 次の100TBたで0.086(USD) オリゞンサヌバから゚ッゞサヌバぞのデヌタ転送(アりト)の料金 (GB 単䜍) 0.060USD HTTPメ゜ッドリク ゚ス ト料金(1䞇件圓たり) HTTP: 0.0090(USD) HTTPS : 0.0120(USD) CloudFront Functions (100䞇件圓たり) 0.10(USD) 詳しくは 公匏 をご芧ください。 4. CloudFrontを䜿う準備 ドメむン を甚意 ( DNS 登録含む) ACM ( AWS が提䟛しおいる無料の SSL蚌明曞 ) ELB or S3 (コンテンツがおかれおいるオリゞンサヌバ) ※ ACM は 米囜東郚( バヌゞニア 北郚)(us-east-1)リヌゞョン で発行しなければCloudFrontでは䜿えたせん。 ※オリゞンサヌバの構築堎所に東京リヌゞョンを䜿う堎合、東京リヌゞョンで ACM の発行も必芁です。  2か所で蚭定するのめんどくさいですが。 5. CloudFrontの蚭定方法 さお、それではそろそろ実際にCloudFrontの始め方、蚭定方法を芋おいきたしょう。 たずは、CloudFront ディストリビュヌション 䜜成ボタンをクリックしたす。 続いお各項目を入れおいきたす。 オリゞン CloudFrontにオリゞンサヌバを教えおあげる項目です。 オリゞン ドメむン ELBかS3の バケット を指定(今回はELB) マッチビュヌアヌ アクセスできる プロトコル を遞択 䞡方アクセスさせたいずきはマッチビュヌワヌ オリゞンパス 「/」を入れればOK 名前 基本的には䜕でもいいですが、サむト名ずかわかりやすいのにするずいいず思いたす デフォルトのキャッシュビヘむビア CloudFrontのキャッシュを持たせる蚭定を行う項目です。 初期蚭定ではCloudFront経由でアクセスした党リク ゚ス トに察しおキャッシュの蚭定されおしたいたすが、埌で URI 毎にキャッシュの蚭定が可胜です。 オブゞェクトを自動的に圧瞮 Yesにしおおくずよい。転送量が枛っお気持ち節玄になりたす ビュヌ ワヌプロ トコルポリシヌ Redirect HTTP to HTTPS にしおおくのが無難ですかね 蚱可されたHTTPメ゜ッド サむトに合わせお蚭定しおください 静的サむト GET,HEAD 動的サむト GET,HEAD,OPTIONS,PUT,POST,PATCH,DELETE 今回は WordPress なのでこっち キャッシュキヌずオリゞンリク ゚ス ト 基本的に觊らないくおいい 蚭定 ゚ッゞサヌバに぀いおの蚭定を行う項目です。 料金クラス すべおの゚ッゞロケヌションを䜿甚する AWS WAF りェブ ACL アクセス制限やWAFをいれたい堎合はここで蚭定を远加 ※ もちろん AWS 偎でルヌルを䜜る必芁あり 代替 ドメむン アクセスさせたい ドメむン 名を蚘茉(耇数蚘茉OK) CloudFrontを䜿う準備に蚘茉した ドメむン を入力しおもらえればOK 䟋) www.rakus.co.jp, rakus.co.jp など カスタム SSL蚌明曞 ACM で取埗した蚌明曞をプルダりンから遞択 暙準ログ蚘録 必芁な堎合はオンにしお、ログを保存するS3 バケット を蚭定 IPv6 察応しおいなければオフに 以䞊でCloudFrontの初期蚭定は完了です。 最期に「 ディストリビュヌション の䜜成」をクリックしたしょう。 6. CloudFrontで WordPress を配信する さお、 ディストリビュヌション の䜜成が完了したので続いおは WordPress 特有の蚭定を入れおいきたしょう。 オリゞンサヌバに WordPress をむンストヌル ELBの蚭定 今回の投皿では䞊蚘に぀いおは割愛させおもらいたす。 <m(__)m> 「 WordPress むンストヌル」ずいうような蚘事でググっお入れおください <m(__)m> 最䜎限、CloudFrontで WordPress を配信するだけなのであればここたでの蚭定で配信可胜です。(倚分。) が、このたたでは WordPress の管理画面にアクセスできず、 蚘事の曎新 WordPress のアップデヌト プラグむン のむンストヌル などなどが管理画面䞊から行えないため、蟛いです。 そのため、 WordPress 管理画面ぞのアクセスができるようにキャッシュをコン トロヌル しなければいけたせん。 その蚭定を入れおいきたす。 䜜成した ディストリビュヌション を線集するために蚭定画面に遷移したす。 ビヘむビア > ビヘむビアを䜜成 をクリック パスパタヌン パスパタヌンを指定しお、指定したパスにアクセスが来たずきのキャッシュの挙動を蚭定 キャッシュしおはいけないパスパタヌン /wp-admin/* ( WordPress をむンストヌルしたパスに合わせおください。) *. php * preview * オリゞンずオリゞングルヌプ ディストリビュヌション 名が出おくるので䜜成した ディストリビュヌション の名前に合わせおください ビュヌワヌ デフォルトのキャッシュビヘむビアで蚭定した物ず同じ蚭定を入れる キャッシュキヌずオリゞンリク ゚ス ト Legacy chache settings ヘッダヌすべお (キャッシュしないように蚭定) 䞊蚘の蚭定でキャッシュしおはいけないパスパタヌンを䜜成しおください。 - キャッシュしおはいけないパスパタヌン - /wp-admin/* (WordPressをむンストヌルしたパスに合わせおください。) - *.php - \*preview\* デフォルトのビヘむビアの線集 デフォルトのビヘむビアを線集する前にキャッシュポリシヌ、オリゞンリク ゚ス トポリシヌを䜜成したす。 デフォルトのビヘむビアに䜜成したキャッシュポリシヌ、オリゞンリク ゚ス トポリシヌをアタッチするむメヌゞです。 ■ キャッシュポリシヌ たずはキャッシュポリシヌを䜜成したす。 CloudFrontトップ画面 > ポリシヌ > キャッシュ > キャッシュポリシヌを䜜成 名前 わかりやすい名前なら䜕でも。 別の ディストリビュヌション にもアタッチできるので汎甚的なキャッシュポリシヌ名にするのも良き 説明 適圓に説明文を入れる キャッシュキヌの蚭定 ヘッダヌ Host, CloudFront-Forwarded-Proto を入れおください HostALBが振り分けられなくなりたす CloudFront-Forwarded-ProtoEC2が80番しか開けおいない堎合これがないず衚瀺厩れたす 蚭定できたら䜜成をクリックしお、キャッシュポリシヌを䜜成したす。 ■ オリゞンリク ゚ス トポリシヌ 続いお、オリゞンリク ゚ス トポリシヌの䜜成をやっおいきたす。 CloudFrontトップ画面 > ポリシヌ > オリゞンリク ゚ス ト > オリゞンリク ゚ス トポリシヌを䜜成 名前 キャッシュポリシヌず䞀緒 説明 キャッシュポリシヌず䞀緒 オリゞンリク ゚ス トの蚭定 ヘッダヌ キャッシュポリシヌず䞀緒 ク゚リ文字列 * preview * cookie comment_author_* wordpress _test_ cookie wordpress _logged_in_* wp-settings-* 蚭定できたら䜜成をクリックしお、オリゞンリク ゚ス トポリシヌを䜜成したす。 ここたでできたら、デフォルトのビヘむビアを線集しおいきたす。 ■ デフォルトのビヘむビア さお、キャッシュポリシヌずオリゞンリク ゚ス トポリシヌが出来たので、デフォルトのビヘむビアの線集をしおいきたす。 CloudFrontトップ画面 > ディストリビュヌション > 䜜成した ディストリビュヌション > ビヘむビア > デフォルト > 線集 キャッシュキヌずオリゞンリク ゚ス ト キャッシュポリシヌ さっき䜜ったキャッシュポリシヌを遞択 オリゞンリク ゚ス トポリシヌ さっき䜜ったオリゞンリク ゚ス トポリシヌを遞択 線集箇所はここだけです。 倉曎を保存したしょう。 さお蚭定もできたので、CloudFront経由でアクセスしおみたしょう。 できた 7. CloudFrontで WordPress を配信するずきの泚意点 CloudFrontで WordPress を配信するこずができるようになりたした。 私が初めおこの䜜業をやったずきにハマったポむントを、いく぀か蚘茉しおおきたす。 LB配䞋に WordPress をむンストヌルしたずきはwp-config. php に ずある蚘述 が必芁 管理画面にアクセスできなかった  キャッシュの蚭定はご泚意を 蚘事を曎新するたびにCloudFrontのキャッシュをクリアしないずいけない Wodpressに プラグむン があるのでそい぀を䜿うず䟿利 テヌマはなどの曎新は倚分怜知されない  ずいうずころでしょうか。 おたけ アクセス制限 CloudFrontでアクセス制限を掛けたいずきっおありたすよね䟋えば怜蚌機ずか。 接続元がCloudFrontの IPアドレス になっおいた、ELBのIPになっおいたりずサヌバ偎で制限をかけるのが結構めんどくさいです。 そんな時に圹立぀のが AWS WAF, CloudFront Functions です IP制限したいなず思ったら䞋蚘を詊しおみおください<m(__)m> AWS WAF CloudFront Functions たた、CloudFront以倖からのアクセスを遮断したいみたいなこずもあるかず思いたす。 悪い人がhostsファむルなどでサヌバに盎接アクセスできるようにしおくるかもしれたせん。 そんな時は䞀぀の方法ずしお、CloudFrontが付䞎したカスタムヘッダヌをLBが刀定する方法が手っ取り早くお楜だず思いたす。 しかし、最近だずもう少し楜にできる方法もあるみたいです。 お時間あれば調べおみおください。 8. たずめ 長い蚘事を呌んでいただき、ありがずうございたした。 CloudFrontを䜿うず運甚がめんどくさくなるこずもありたすが、サむト自䜓が軜量化でき、 SEO 察策にもなりたす。 以前、 WordPress で䜜った匊瀟オンデマンドサむトはアクセス集䞭が起きるず必ず萜ちおいたしたが、CloudFront経由で配信するようにしおからは(倚分)1床も萜ちおいたせん。 アクセス集䞭で困っおいる すぐ高負荷になっお困っおいる ずいう方は、䞀床CloudFrontや他の CDN の構成を怜蚎しおみおもいいかもしれないです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
技術広報の yayawowo です。 い぀も ラク スの゚ンゞニアブログをお読みいただき、ありがずうございたす 今幎床3回目ずなる ラク スMeetupは、 『 開発速床向䞊のためのリファクタリング術 〜負債をきっちり返枈しよう〜 』 でした テヌマは『技術的負債・生産性向䞊』です。 ロヌンチ5幎〜20幎を迎える3プロダクトを支える、匊瀟のバック゚ンド゚ンゞニアの3名が登壇したした なお、本むベントは以䞋のような方にオススメずなっおおりたす。 ◆ こんな方にオススメ ・ ラク スのプロダクト、組織に興味がある方 ・長期プロダクトの リファクタリング を怜蚎しおいる方 ・UI刷新、オフショア開発に興味がある方 ・ SaaS 開発に携わる゚ンゞニアの話が聞いおみたい方 発衚の玹介 サポヌトチャットサヌビスをロヌンチしおから5幎間で発生した負債ず察策 レガシヌなシステムのリファクタリングに取り組んで孊んだこず 20幎以䞊のレガシヌシステムで始めるリファクタリングの半歩 秋開催おすすめ技術むベント ラクスの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 終わりに 発衚の玹介 それではここから各発衚内容ず資料を共有させおいただきたす むベントの詳现は以䞋をご確認ください。 rakus.connpass.com サポヌトチャットサヌビスをロヌンチしおから5幎間で発生した負債ず察策 登壇酒井 幞教 [所属チャットディヌラヌ開発課担圓プロダクト ChatDealer ] speakerdeck.com 1本目は、チャットディヌラヌ開発課の酒井さんによる発衚です。 システム開発 を行う䞭で、様々な条件によっお技術的負債は生み出されおしたいたす。 サポヌトチャットボットを提䟛するサヌビス『ChatDealer』はロヌンチされおから5幎目であり、 ラク スでは新しめのサヌビスです。 しかし、開発を進める䞭で様々な技術的負債が生じおおりたす。 本発衚では、以䞋ポむントを䞭心にお話させおいただきたした。 『ChatDealer』で技術的負債が生じた経緯 技術的負債の解消に向けた察策 レガシヌなシステムの リファクタリング に取り組んで孊んだこず 登壇ファム ブむテヌ ニャン [所属配配メヌル開発課担圓プロダクト 配配メヌル ] speakerdeck.com 続いお、配配メヌル開発課におブリッゞSEを担圓しおいるニャンさんの発衚です。 レガシヌなシステムでは、叀いコヌドの曞き方、保守性・可読性が悪い曞き方などがよくあるず思いたす。 リファクタリング はこのようなシステムで生産性を向䞊するための䞀぀の手段です。 私は玄15幎皌働しおいるメヌル配信システムのブリッゞ゚ンゞニアずしお、オフショアチヌムず䞀緒に リファクタリング を実斜しおきたした。 リファクタリング の経隓で良かったこずず苊劎したこず、そこから孊んだ リファクタリング する時に泚意するこずをご玹介したした。 なぜ リファクタリング を実斜しないずいけないのか リファクタリング で良かったこずず苊劎したこず リファクタリング する時に泚意するこず 20幎以䞊の レガシヌシステム で始める リファクタリング の半歩 登壇四方 倧茔 [所属メヌルディヌラヌ開発課担圓プロダクト MailDealer ] speakerdeck.com ラストは、メヌルディヌラヌ開発課の四方さんが発衚したした 20幎以䞊サヌビスが続くメヌルディヌラヌ。 そんな瀟内最長老であるサヌビスに突劂蚀い枡されたUI刷新プロゞェクト。 流行りのUIにしたい新しい フレヌムワヌク を䜿う フロンド゚ンドずバック゚ンドは密結合 こんなシステムどうやっおUI刷新するの本圓に安党にリリヌスできるの 私たちがメヌルディヌラヌUI刷新プロゞェクトを通しお埗た、 " レガシヌシステム でもできる"安党な リファクタリング の始め方に぀いおお話したした。 秋開催おすすめ技術むベント ラク スでは、定期的に゚ンゞニア/デザむナヌ向けの技術むベントを開催しおおりたす。 その䞭から9月10月に開催する、技術むベントをご案内いたしたす。 ◆ LT䌚 9/21(æ°Ž)開催 ゚ンゞニアの勉匷法ハックLT- vol.10 9/22(朚)開催 ゚ンゞニアのためのDX 10/12(æ°Ž)開催 コヌドレビュヌ LT䌚 - vol.3 10/19(æ°Ž)開催 プロゞェクトマネゞメント Tips LT䌚 vol.5 10/20(朚)開催 QA Tips LT䌚 - vol.2 10/26(æ°Ž)開催 UI/UXデザむナヌLT䌚 - vol.9 10/27(朚)開催 Reactをもっず語りたい ◆ TechCafe 9/27(火)開催 PHPerのための「PHPカンファレンス2022」を語り合うPHP TechCafe 9/28(æ°Ž)開催 「k8s」を語るCloud Native TechCafe #2ゲストbells17様 ◆ Meetup 10/5(æ°Ž)開催 アヌキテクチャカむれンで課題解決に挑む、゚ンゞニア達 1぀でもご興味があるものがございたしたら、お気軜にご参加ください 採甚むベントも開催䞭こちらも合わせおご確認ください。 ・9/26(月)開催 SREチヌムの仕事玹介カゞュアル説明䌚 ラク スの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 圓瀟では、䞀緒に働く゚ンゞニア/デザむナヌを積極的に募集しおおりたす 珟圚募集しおいる職皮は、以䞋サむトよりご確認ください。 career-recruit.rakus.co.jp 「ただ応募する段階では 」 ずいう方は、是非 カゞュアル面談 もご怜蚎ください 【こんな方におすすめ】 ポゞションが経隓にマッチするか確認したい 働き方/環境・䜓制/事業・プロダクト/文化/制床を詳しく知りたい 応募前に遞考の抂芁を聞きたい人物像、基準など ゚ンゞニア・デザむナヌの人ずなりを知りたい 以䞋申蟌フォヌムずなりたす。 rakus.hubspotpagebuilder.com 「むベントで登壇しおいた●●さんず話しおみたい・・・」 などご芁望がありたしたらその旚をご蚘入の䞊、お申蟌みください お気軜にどうぞ 😊 終わりに 『開発速床向䞊のための リファクタリング 術 〜負債をきっちり返枈しよう〜』はいかがでしたでしょうか ロヌンチ5幎〜20幎を迎える3プロダクトを支える、最前線゚ンゞニアによる技術取り組みを発衚させおいただきたした。 本発衚が SaaS 開発に携わる゚ンゞニア/デザむナヌの皆様にずっお、䞀぀でもご参考になれば幞いです。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは、むンフラ゚ンゞニアのfro-rivです。 業務でよく䜿う機䌚がある私はよくあるdiffコマンドですが、調べおみるず知らなかったオプションがたくさん  ※ diff ${file1} ${file2} の通り、簡単に 䜿えるが故に 今たでちゃんず調べたこずはありたせんでした。 今回は、そんなdiffコマンドの衚瀺オプションを䞭心に玹介できればず思いたすので、よろしければご芧ください。 diffコマンドずは よく䜿うオプション diffコマンドのオプションで倉わる衚瀺圢匏 -uオプションunified圢匏 -cオプションcontext圢匏 -yオプションside by side圢匏 --suppress-common-lines(共通行非衚瀺)ず組み合わせる -W(衚瀺幅指定)ず組み合わせる --colorオプション色衚瀺番倖線 最埌に 参考文献   diffコマンドずは diffコマンドは、 2぀のファむルを比范しお違い(差分)を出力するコマンド です。 たたリダむレクトを䜿えば、コマンド実行結果などの文字列比范も行うこずができたす。 以䞋、䟋 ###ファむル比范(基本) $ diff file1.txt file2.txt 1c1 < test --- > tests ###リダむレクトしたコマンド実行結果(文字列)を比范 $ diff < ( echo ' test ' ) < ( echo ' tests ' ) 1c1 < test --- > tests よく䜿うオプション diffコマンドで よく䜿うオプション のご玹介です。 私は今回調べるたで、patchファむルを䜜るずきに -u を䜿ったりするくらいでしたが、䟿利なオプションがたくさんありたした。 オプション 説明 -c context圢匏で差分を衚瀺 ! (倉曎点)や + (远加), - (削陀)で衚瀺される -u unified圢匏で差分を衚瀺 倉曎点は + , - で衚瀺される -y --side-by-side 暪䞊びで差分を衚瀺 | (倉曎点)や < (削陀), > (远加)で衚瀺される -q --brief 差分があれば、差分がある旚メッセヌゞを出力 ※差分は出ない ※差分がなければ出力もなし -s 差分があれば、差分を出力 無ければ、差分がない旚メッセヌゞを出力 -b 空癜の差分は無芖 -i --ignore-case 倧文字小文字の区別をしない --suppress-common-lines 共通行を衚瀺しない ※-yオプションず䜵甚で効果あり -W --width=${NUM} 衚瀺幅を指定する ※-yオプションず䜵甚で効果あり (デフォルト: 130カラム) --color 色付きで差分衚瀺する ※diffutils3.4以䞊で有効 diffコマンドのオプションで倉わる衚瀺圢匏 よく䜿うdiffコマンドのオプションの違いでどのように衚瀺圢匏が倉わるのか、いく぀か実際にご玹介したいず思いたす。 比范するファむルは䞋のものを䜿甚したす。 test1.txt ファむルに手を加え test2.txt を䜜成したしたので、 それぞれ説明の際は、 test1.txt を 倉曎前 、 test2.txt を 倉曎埌 ずさせおいただきたす。 # cat test1.txt あいうえお かきくけこ さしすせそ たち぀おず なにぬねの はひふぞほ たみむめも やゆよ らりるれろ わをん アむり゚オ # cat test2.txt あいうゑお かきくケこ さしすせそ たち぀おず ららららら なにぬねの はひふぞほ たみむめも やゆよよよ らりるれろ わをん ちなみに、オプションなしでdiffコマンドを䜿っお比范するずこんな出力ずなりたす。 この文量なら䜕ずかなりたすが、差分がもっず増えるず、正盎䜕が䜕だか分かりにくい  # diff test1.txt test2.txt 1 ,2c1, 2 < あいうえお < かきくけこ --- > あいうゑお > かきくケこ 4a5 > ららららら 8c9 < やゆよ --- > やゆよよよ 11d11 < アむり゚オ # -uオプションunified圢匏 たずは、unified圢匏です。 --- の郚分は倉曎前のファむルを、 +++ は倉曎埌のファむルを衚しおおり、 倉曎埌に存圚しない行は - 倉曎埌にのみ存圚する行は + が行頭に぀いおたす。 こちらのオプションは芋やすさで遞ぶずいうよりも、patchを圓おたりするため、䜿うこずが倚い気がしたす。 # diff -u test1.txt test2.txt --- test1.txt 2022-08-22 18:23:54. 717925300 + 0900 +++ test2.txt 2022-08-23 09:18:48. 147925300 + 0900 @@ -1 , 11 + 1 , 11 @@ -あいうえお -かきくけこ +あいうゑお +かきくケこ さしすせそ たち぀おず +ららららら なにぬねの はひふぞほ たみむめも -やゆよ +やゆよよよ らりるれろ わをん -アむり゚オ # -cオプションcontext圢匏 次に、context圢匏です。 *** の郚分は倉曎前のファむルを、 --- は倉曎埌のファむルを衚しおおり、 倉曎のあった行は ! 倉曎埌に存圚しない行は - 倉曎埌にのみ存圚する行は + 行頭に぀いおいたす。 こちらのオプションも、䞀目で芋おわかるずいう感じではありたせんね。 # diff -c test1.txt test2.txt *** test1.txt 2022-08-22 18:23:54. 717925300 + 0900 --- test2.txt 2022-08-23 09:18:48. 147925300 + 0900 *************** *** 1 , 11 **** ! あいうえお ! かきくけこ さしすせそ たち぀おず なにぬねの はひふぞほ たみむめも ! やゆよ らりるれろ わをん - アむり゚オ --- 1 , 11 ---- ! あいうゑお ! かきくケこ さしすせそ たち぀おず + ららららら なにぬねの はひふぞほ たみむめも ! やゆよよよ らりるれろ わをん # -yオプションside by side圢匏 次に、side by side(暪䞊び)圢匏です。 非垞に芋やすい(盎感的にわかりやすい)衚瀺ずなっおおり、すべおの比范で䜿いやすいずたでは蚀いたせんが 私が䞀番頻繁に䜿甚するdiffコマンドのオプションになりたす。(オススメ) 巊偎に倉曎前・右偎に倉曎埌のファむルが衚瀺されおおり、倉曎行があれば真ん䞭に蚘号が぀きたす。 倉曎のあった行は | 倉曎埌に存圚しない行は < 倉曎埌にのみ存圚する行は > が衚瀺されたす。 以䞋の様に、盎感的にわかりやすい衚瀺ずなっおおりたす。 ご芧の端末の幅によっおはコマンド結果がきれいに衚瀺できおいないかもしれたせんが、ご了承ください # diff -y test1.txt test2.txt あいうえお | あいうゑお かきくけこ | かきくケこ さしすせそ さしすせそ たち぀おず たち぀おず > ららららら なにぬねの なにぬねの はひふぞほ はひふぞほ たみむめも たみむめも やゆよ | やゆよよよ らりるれろ らりるれろ わをん わをん アむり゚オ < # -y オプションを知らなかった時は、 diffコマンドが芋づらいのでリモヌトサヌバからわざわざロヌカルPCに比范ファむル持っおきお WinMerge を 䜿っおいたした。 -y オプションにはさらに芋やすくなるオプションもありたすので、以䞋におご玹介させおいただきたす。 --suppress-common-lines(共通行非衚瀺)ず組み合わせる diff -y コマンドに --suppress-common-lines オプションを加えるず、差異のある行のみを衚瀺しおくれたす。 通垞共通行も衚瀺され、それはそれで䟿利なこずもあるのですが、 --suppress-common-lines オプションを䜿うこずで 簡朔に衚瀺させるこずができたす。 # diff -y --suppress-common-lines test1.txt test2.txt あいうえお | あいうゑお かきくけこ | かきくケこ > ららららら やゆよ | やゆよよよ アむり゚オ < # -W(衚瀺幅指定)ず組み合わせる 䟋で䜿っおいるような各行の文字数が少ない堎合、たたは倚い堎合 diff -y だけでは少し芋づらいこずもありたす。 そんな時には -W ${カラム数} (デフォルト130カラム)オプションを぀けるこずで衚瀺幅を倉曎するこずもできたす。 今回比范に䜿甚しおいるファむルは各行の文字数が少ないので、30カラムを指定しおみたす。 # diff -y -W 30 test1.txt test2.txt あいうえお | あいうゑお かきくけこ | かきくケこ さしすせそ さしすせそ たち぀おず たち぀おず > ららららら なにぬねの なにぬねの はひふぞほ はひふぞほ たみむめも たみむめも やゆよ | やゆよよよ らりるれろ らりるれろ わをん わをん アむり゚オ < # これでかなり芋やすくなりたした。 さらに、1぀前に玹介した --suppress-common-lines を組み合わせるず、差異のある行のみをさらに芋やすく衚瀺できたす。 # diff -y -W 30 --suppress-common-lines test1.txt test2.txt あいうえお | あいうゑお かきくけこ | かきくケこ > ららららら やゆよ | やゆよよよ アむり゚オ < # ちなみに、1行圓たりの文字数が倚いず、途䞭で切れおしたうので -W 170 など広めに蚭定すれば芋やすくなりたす。 ご芧の端末の幅によっおはコマンド結果がきれいに衚瀺できおいないかもしれたせんが、ご了承ください ###デフォルトの130だず最埌たで芋れない # diff -y file1.txt file2.txt 1234567891011121314151617181920212222324252627282930313233343 | 1234567891011121314151617181920212222324252627282930313233343 ###幅を170にするずファむルの端の文字たで確認できる # diff -y -W 170 file1.txt file2.txt 123456789101112131415161718192021222232425262728293031323334353637383940 | 123456789101112131415161718192021222232425262728293031323334353637383950 # --colorオプション色衚瀺番倖線 こちらはdiffコマンドのオプション番倖線ずなりたすが、 diffutils のバヌゞョン3.4以降で䜿甚できる色衚瀺オプションになりたす。 CentOS7の公匏 リポゞトリ で提䟛されおいる diffutils は3.3系が最新でしたので䜿えたせんが、CentOS8系からは䜿甚できるかず思いたす。 こんな感じで、diffを色衚瀺できるので芖芚的に芋やすいです。 ※epel リポゞトリ にお、 colordiff ずいうパッケヌゞも配垃されおいるようですので、 --color オプションが䜿えない方は、 むンストヌルしおみおください。 diff --color実行結果 最埌に 今回は、diffコマンドの衚瀺圢匏を芋やすく、ファむル比范を楜にするためのオプションに぀いお玹介したした。 蚘事内にも蚘茉しおおりたすが、diffコマンドに぀いお詳しく調べるたでは、業務でリモヌトサヌバ䞊のファむルを比范するずなるず毎回ロヌカルPC䞊に持っおきお WinMerge を䜿っおおりたした。 特に -y のオプションは WinMerge に䌌た出力ずなり盎感的に倉曎点がわかりやすいずいうこずから、今や -y オプションに頌りきりです。笑 diffコマンドを䜿いこなしお、 “楜” にファむル比范をしたしょう。 ずいうわけで、diffコマンドのオプション玹介でした。 参考文献 DIFF GNU diff utilities - News: diffutils-3.4 released [stable]     ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
特集「 Xdebug の掻甚方法」を語る 匊瀟で毎月開催し、 PHP ゚ンゞニアの間で奜評いただいおいる PHP TechCafe。 2022幎2月のむベントでは 「 Xdebug の掻甚方法」 に぀いお語り合いたした。 匊瀟のメンバヌが事前にたずめおきた Xdebug の基瀎知識や䜿い方の説明資料にしたがっお、他の参加者に意芋を頂いお語り合いながら Xdebug の掻甚方法を孊びたした。 今回はその内容に぀いおレポヌトしたす rakus.connpass.com 特集「Xdebugの掻甚方法」を語る デバッグツヌルに぀いお Xdebugずは 導入方法 公匏のむンストヌル手順 Xdebugの䟿利な機胜 Step Debugging ステップデバッグずは デバッグ方法 PhpStorm 1. 受信デバッグ接続のリッスンを有効にする 2. ブレヌクポむントをセット 3. デバッグセッションの開始 ステップデバッグでできるこず デバッグセッション再開 ステップオヌバ F8 ステップむン F7 ステップアりト (F8) 匷制ステップむン 停止しおいる凊理での調査 フレヌム調査 倉数の調査 / 曎新 匏の評䟡 その他テクニック 停止しおいる行を衚瀺 りォッチリストに倉数を远加 ブレヌクポむントのミュヌトモヌド その他の機胜 1. ゚ラヌレポヌト 詳现 php.ini var_dump()の匷化 2.スタックトレヌスの远加 3.トレヌシング トレヌスずは 4. プロファむリング 機胜の抂芁 䜿い方 5.Code Coverage Analysis 機胜の抂芁 䜿い方 カバレッゞ 線集埌蚘 デバッグ ツヌルに぀いお デバッグ ツヌルずはバグを陀去するずきに䜿甚するツヌルです。 ※ デバッグ (debug) は de(陀去) - bug(䞍具合ずいう意味です。 倚くの デバッグ ツヌルは以䞋の基本性胜を備えおいたす。 ブレむクポむント 実行䞭のプログラムを任意の箇所で䞀時停止する ステップ実行 ゜ヌスコヌド を1ステップず぀実行する 倉数の可芖化・倉曎 実行䞭のプログラムの倉数の倀を確認したり倉曎する 関数・匏の実行 デバッグ 䞭に任意の関数や匏を実行する デバッグ ツヌルがないずバグ修正が倧倉になるケヌスずしお、以䞋が挙げられたした。 倧量に デバッグ ログを仕蟌むこずになる 凊理を通すこずが難しい郚分を デバッグ する時 同時実行など再珟が難しい堎合 デバッグ 甚に入れた凊理が本番に残っおしたっお倧灜害を匕き起こす その他、var_dumpなどで手軜にコヌドの動きを芋たい堎合はそちらを掻甚するなど、 「ツヌルずコヌドの䞡者を柔軟に䜿えるず良い」ずいう意芋もありたした。 Xdebug ずは PHP で デバッグ を行う䞊で䟿利な機胜を提䟛する、 拡匵機胜 です。 PHP においおは、 デバッグ ツヌルの デファクト ツヌルになっおいるものです。 倚機胜で、基本的な デバッグ ツヌルずしおの機胜だけでなく、様々な機胜を持っおいたす。 デバッグ の機胜が䜿われるこずが倚いですが、他にも様々な䟿利機胜があり順に玹介されたした。 導入方法 Xdebug は C蚀語 で実装されおおり、 コンパむル されたファむル .soファむル を組み蟌む php .iniに読み蟌み蚭定を远蚘こずで有効になりたす。 導入手順は公匏のものを䜿甚する方法ず、Dockerを䜿甚する方法の2぀が玹介されたした。 公匏のむンストヌル手順 Linux  公匏リポゞトリ こちらの方法ではメリットずしお最も手軜であるこずが挙げられたしたが、デメリットずしお最新バヌゞョンが入らないこずもあるようでした。 Xdebug の最新バヌゞョンはv3系ですが、Ubuntu20.04ではv2系が入っおしたうため、泚意が必芁です。 PECL(ピクル) ※ PECL : PHP の 拡匵機胜 やラむブラリなどを远加するためのパッケヌゞ管理ツヌル php .iniぞの蚭定も自動で行っおくれるため、 Mac ナヌザヌにずっおは䟿利だずいう玹介がありたした。 ゜ヌスをコンパむル こちらの方法が必芁なケヌスずしおは 特定のバヌゞョンが必芁 ネットワヌク、セキュリティの関係䞊パッケヌゞ管理ツヌルが䜿甚できない ずいったこずが挙げられたした。 たた、「手順が難しいわけではないが、コマンドを怜玢し゜ヌスから コンパむル される堎合に、 実際に䜕が行われおいるかずいうこずを理解しおから行う方がよい のではないか」ずいう意芋もありたした。 Dockerで䜿う 公匏むメヌゞの説明 Dockerfileの䟋 FROM php:8.1-cli RUN pecl install xdebug \ && docker-php-ext-enable xdebug docker-php-ext-enable を蚘述するず、コンテナ䞊の PHP で Xdebug が有効化されたす。 自身のプロゞェクトの状況や環境に合わせお、様々な方法が遞択できる点が非垞に良いず思いたした たた、 デバッグ の際に デバッグ ツヌルを䜿甚するかどうかのアンケヌトの結果、ツヌルを䜿甚しない方が倚数掟だったようです。 その結果を受けお、 Xdebug やdumpを利甚するこずのメリット/デメリットが解説されたした。 Xdebug のデメリットずしおは動䜜が重い点が挙げられ、 php .iniで蚭定を消すなどしお軜量化を図ったずいう経隓が語られおいたした。 dumpのデメリットずしおは、消し忘れが事故に぀ながる点が挙げられ、できるだけログに出力するようにしおいるずいう方法が語られたした。 他にも 新卒で入ったずきに先茩から 「りェブブラりザの画面には出すな事故るから」 っお蚀われたしたね。 「䜕かAAAっお出おきたんだけど」っお。そんな報告聞きたくない冷や汗すごいず思う。 「var_dumpで事足りるじゃん」っお宗教になっおしたいたした。「いやそれはないから目を芚たせ」っお蚀った蚘憶がありたす。 などの䜓隓が語られおいたした。 最埌に Xdebug を簡単に入れられない叀いサヌビスずかだずやむなし Xdebug が䜿える人はどんどん䜿っおいくほうが良い ずいう結論に至りたした。 Xdebug の䟿利な機胜 Step Debugging Xdebug の機胜に぀いお、PhpStormの画面を䜿っお玹介されたした。 ステップ デバッグ ずは 任意の行で凊理を止めながら行う、 デバッグ のこずです。 デバッグ 方法 PhpStorm 1. 受信 デバッグ 接続のリッスンを有効にする 2. ブレヌクポむント をセット 3. デバッグ セッションの開始 察象のペヌゞをリロヌドするず、 ブレヌクポむント で凊理が止たりたす。 ステップ デバッグ でできるこず デバッグ セッション再開 次の ブレヌクポむント ぞ進む 次に通った ブレヌクポむント にお再床凊理が止たる ステップオヌバ F8 次の行ぞ凊理を進める 進める行のメ゜ッドがある堎合、メ゜ッド内の凊理はスキップされる メ゜ッド内に ブレヌクポむント がある堎合は、そこで止たる "匷制ステップオヌバ" を䜿うこずで、スキップもできる ステップむン F7 メ゜ッド内の凊理を調べたい時に利甚 止たっおいる行にあるメ゜ッド内の凊理に入っお先頭凊理で止たる ステップアりト (F8) 調査䞭のメ゜ッド内に問題がないこずがわかった時に利甚 珟圚のメ゜ッドから抜けだしお、呌び出し元の凊理で止たる 匷制ステップむン ステップむンでは サヌドパヌティ のラむブラリなどのメ゜ッドぞ入るこずができない 匷制ステップむンでは、これらのメ゜ッド内の凊理ぞ入るこずができる このあたりの機胜を芋るだけでも、var_dumpで デバッグ するよりも色々なこずができるこずが分かりたす。 ここで玹介された機胜に぀いお、 「基本的にはこのステップアりトぐらいたでは割ずどういう IDE でもありたすかね。」 「匷制ステップむンはPhpStormにナニヌクな機胜ずしお実装されおいたすね。」 「正盎匷制ステップむンはあたり䜿わずに䜕ずかなっおいたので、意図しお䜿い分けたりずかはしおなかったですね。」 ずいった経隓が語られたした。 停止しおいる凊理での調査 よくコヌドを远っおいるず行を芋倱うこずがありたすが、「停止しおいる行を衚瀺」するアむコンを抌すず止たっおいる行に移動しおくれたす。 それらの機胜に぀いお玹介されたした。 フレヌム調査 どこから呌び出された凊理かを確認できたす。 倉数の調査 / 曎新 珟圚の倉数に栌玍された倀の確認 倀の線集も可胜 匏の評䟡 遞択した郚分の匏評䟡 アむコンから任意の匏での評䟡結果確認も可胜 こちらの機胜に぀いおは Xdebug で止めながら、途䞭に適圓な評䟡匏を曞いお倉数の䞭身を芋る必芁がなく、盎接確認できるずいうメリットが玹介されたした。 その他テクニック その他、いく぀か玹介された機胜を挙げおおきたす。 停止しおいる行を衚瀺 デバック時に停止しおいる行を芋倱った時に䜿甚 りォッチリストに倉数を远加 倉数を監芖リストずしお登録可胜 ブレヌクポむント のミュヌトモヌド ONにしお以降の ブレヌクポむント で凊理を止めなくなる Xdebug で最も䜿甚される、ステップ デバッグ に぀いおの玹介は以䞊でした。 その他の機胜 続いお、その他䟿利機胜が5぀玹介されたした。 たずぱラヌレポヌトを向䞊させおくれる機胜の玹介です。 こちらは倧きく分けおvar_dumpの匷化、 スタックトレヌス 远加の2぀がありたす。 1. ゚ラヌレポヌト 詳现 たずは、 php .iniの xdebug .modeをdevelopにする必芁がありたす。 php .ini xdebug.mode=develop var_dump()の匷化 var_dumpの出力を成圢したり、装食するためにHTML゚ラヌを有効にする必芁がありたす。 html_errors=1 補足情報ずしお、 php.ini の html_errors 蚭定が有効のずきしかキレむにならないずいう泚意点が挙げられたした。 公匏リファレンス こちらのサンプルずしおは、arrayに色々な倀を入れおvar_dumpで出力しおいたす。 var_dump()の匷化 サンプルコヌド <?php $ sampleArray = [ 1 , // int 0.1 , // float true , // bool "string" , // string [ "nest1" , [ "nest2" , [ "nest3" ]]] // array ] ; var_dump ( $ sampleArray ) ; こちらの出力結果をブラりザ䞊で衚瀺するず、以䞋の結果になりたす。 developモヌドがOFFのずき developモヌドがONのずき この結果を受けお、developモヌドをONにしたずきのメリットずしお以䞋の点が挙げられたした。 改行などを成圢、intが緑でFloatがオレンゞずいったように色が぀き、芋やすくすっきりする ネストしおいる配列に、぀目以降が省略されお衚瀺される なお、ネストに぀いおは xdebug.var_display_max_depth を蚭定するこずで衚瀺する階局を制埡できたす。 その他、 コマンドラむン 䞊でも色を付ける方法が玹介されたした。 こちらは xdebug.cli_color を蚭定するこずで衚瀺される、var_dump()の結果に色を付けるこずができたす。 参加者からも「var_dumpはプレタグで図った蚘憶がありたすね」ずいうコメントが挙がりたした。 これをきっかけに 「この Xdebug できれいになっおいるのも、 HTMLのプレタグを付けおくれおいる っおいうのがありたすね。HTML化しお共有しおくれおいるず。」 「 Xdebug 入れずにvar_dumpしたらペヌゞの゜ヌスを芋るず改行されおいるのが分かるっお感じになりたすね。ブラりザ䞊だずbrずかあるけど  」 「それでプレタグで囲ったらっおこずですね。」 「printlnなんかも䜿えたすね。その蟺り䜿っおわかりやすくできたす。」 ずいう話題で盛り䞊がりたした。 2. スタックトレヌス の远加 ゚ラヌが起こった際、developモヌドをONにするず綺麗に出力しおくれたす。 developモヌドがOFFのずき developモヌドがONのずき ここでは泚意点ずしお 「 Xdebug ありでvar_dumpに吐き出すず、HTMLありで芋にくくなる」 「var_dumpの結果をログに吐き出すずきは developモヌドをoffにしたほうが良い 」 ずいうこずも玹介されたした。 3.トレヌシング トレヌスずは 関数がどういう経路で出力されおいるかを確認したり、関数の戻り倀を確認するこずで、システムの党䜓像を把握するこずです。 Xdebug を䜿甚するこずで関数呌び出しの履歎を出力できるため、以䞋のメリットが挙げられたした。 関数がどのような経路で呌ばれおいるか、党䜓像を把握できる 匕数、戻り倀も確認できる たた、 xdebug .mode=traceに蚭定するずトレヌシングがオンになるず玹介がありたした。 php .ini(蚭定䟋) xdebug.mode=trace xdebug.trace_format=0 xdebug.output_dir=/tmp/tracing xdebug.start_with_request=no 続いおサンプルコヌドを䜿甚し、実際に出力を確認したした。 サンプルコヌド <?php class SampleClass { public function a () { $ this -> b () ; } private function b () { var_dump ( "tracing" ) ; } } $ sampleClass = new SampleClass () ; xdebug_start_trace () ; $ sampleClass -> a () ; xdebug_stop_trace () ; $ sampleClass -> a () ; 実行結果 trace.1373756769.xtずいうファむルが出力されたした。 Time列が実行時間、Mem列が䜿甚しおいるメモリです。 Function列が呌び出しおいる関数ず堎所を衚しおいたす。 たた、矢印(->)でネストの深さも衚しおいたす。 この結果に぀いお参加者から 「traceの実行時間たで出るのすごいですね。」 ずいうコメントがあり、それをきっかけに 「 ボトルネック を調べられるの䟿利 ですよね。DBのI/Oのアクセスずかなら SQL いじるずかありたすし。」 「遅そうなずころにこういうのを仕蟌んで、 PHP の凊理は遅くないけど内郚実行のDBアクセスに時間かかっおるなあっお 原因の切り分けがしやすそう ですね。」 ずいうメリットが䌚話で挙げられたした。 たた、以䞋の補足情報も玹介されたした。 xdebug.collect_assignments 関数に枡された匕数の倀を出力できる xdebug.collect_return 関数の戻り倀の倀を出力できる xdebug.trace_format で出力フォヌマットを遞択できる 1(コンピュヌタヌ可読圢匏)実行結果 これに぀いおは、 「公匏が分析甚の スクリプト を準備しおくれおいる」 「 GitHub の䞭に茉っおいるんですがこの スクリプト に食わせお実行するず結構分析しおくれたす。 自分で分析甚のプログラムずか組んでアレンゞ するこずも出来るかもしれたせん。」 「人間には読めない圢で出るのかず思っおたした。関数ごずの呌び出しされた回数ずかが出おきたしたね。」 「䞀回デヌタずしお取り蟌んでしたえばこっちのものですからね。」 ずいった䟿利な掻甚方法が玹介されおいたした。 2(HTML)実行結果 この結果に぀いおは、「人にやさしい」ずいう意芋が出おいたした。 その他にも蚭定が倚数あり、「結構いろいろできるんだな」ずいう Xdebug の倚機胜さに感心する声もありたした。 4. プロファむリング 機胜の抂芁 凊理の監芖や蚘録を行う機胜です。 凊理に時間がかかっおいる箇所や、リ゜ヌス消費の激しい箇所を特定するこずができたす。 䜿い方 こちらもiniファむルに蚭定が必芁です。 php .ini 蚭定 profile の蚭定を有効化 xdebug.mode=profile profile の出力先 xdebug.output_dir=/tmp/profiling これらを蚭定し PHP のプログラム実行するず、 xdebug.output_dir で指定した ディレクト リにファむルが出力されたす。 出力されたファむルは人間には分かりにくいので実行結果を可芖化するツヌルが公匏で玹介されおおり、 Webgrind が個人的に䜿いやすいず玹介がありたした。 この機胜の掻甚シヌンずしおは パフォヌマンスが悪い凊理の ボトルネック 特定 意図しない箇所で䟋倖凊理されおしたっお原因特定が困難な時 「実行したけれどどこで萜ちたかわからない」ずきにこれを実行すれば「ここで止たったな」ずいうのがプロファむリングの結果からわかる ずいった玹介がありたした。 たた、参加者から 「PhpStormで開くず定矩した堎所にそのたたコヌドゞャンプ出来るので楜しいです」 ずいうコメントがあり、これに぀いお 凊理が重なっおいるずころを抌したら、該圓のコヌドぞゞャンプ出来るずいうこずです。 䟿利ですね さすがPhpStorm など、PhpStormぞのポゞティブな声が挙がりたした。 他にも泚意事項ずしお、 珟状の php .ini 蚭定の堎合は、すべおのリク ゚ス トが profiling されおしたう 凊理が重い スクリプト を気にせず実行したくっおいるず、プロファむルの実行結果だけでディスク容量をかなり食っおしたうこずになる string xdebug.start_with_request を trigger に蚭定するこずで profiling を開始したいタむミングを指定できるため、䞍甚意に実行されないようにしたほうが良いず思う ずいった点が挙げられたした。 5.Code Coverage Analysis 機胜の抂芁 凊理を通過した箇所を蚘録するこずができたす。 単䜓テスト などで、そのプログラムがどの皋床テストできおいるかを把握できたす。 䜿い方 基本的には PHPUnit ず組み合わせるのが䞀般的です。 PHPUnit のコヌドカバレッゞ も内郚で Xdebug のコヌド カバレッゞ を利甚しおいたす。 php .ini の蚭定はおそらく䞍芁です ゜ヌスコヌド 䞊で カバレッゞ を取埗したい箇所を xdebug_start_code_coverage() ず xdebug_stop_code_coverage() で挟むだけ xdebug_get_code_coverage() を実行するこずで䞊蚘で挟んだ箇所の カバレッゞ を取埗できたす。 ここでは公匏のサンプルコヌドを甚いお話題が進みたした。 Xdebug 公匏サむト functionAずBが存圚し、Bに6ず10を䞎えお結果をもらっおくる PHP ファむルがあるずしたす。 ここにstart_code_coverageを入れおget_code_coverageを実行し、var_dumpに出力させるず実行結果が出おきたす。 サンプル  <?php xdebug_start_code_coverage ( XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE ) ; function a ( $ a ) { return ; echo $ a * 2.5 ; } function b ( $ count ) { if ( $ count > 25 ) { echo "too much \n " ; } for ( $ i = 0 ; $ i < $ count ; $ i ++ ) { a ( $ i + 0.17 ) ; } } b ( 6 ) ; b ( 10 ) ; var_dump ( xdebug_get_code_coverage ()) ; 実行結果 array '/home/httpd/html/test/xdebug/docs/xdebug_get_code_coverage.php' => array (size=11) 5 => int 1 6 => int -2 7 => int -2 10 => int 1 11 => int -1 13 => int 1 14 => int 1 16 => int 1 18 => int 1 19 => int 1 21 => int 1 実行結果がキヌバリュヌの圢で出力されたす。 キヌ 察象ファむルの行数 倀 : カバレッゞ 取埗結果 1: 実行した -1: 実行しおいない -2: デッドコヌドになっおいる たず 5 => int 1 に着目したす。 サンプルコヌドの5行目 return; はreturnが実行できたので「1」ずなっおいたす。 6 => int -2 は盎前の5行目でreturnしおおり、その埌の凊理が絶察に実行されないので「-2」ずなっおいたす。 11行目 if ($count > 25) は$countが25以䞊の時に実行されるコヌドですが、 サンプルコヌドは6,10しか枡しおおらず条件を満たさないため実行されたせん。 そのため「-1」ずなっおいたす。 カバレッゞ 以前 ラク ス゚ンゞニアブログにお、テストコヌドの曞き方をご玹介臎したした。 tech-blog.rakus.co.jp その際に䜿甚したコヌドの カバレッゞ を芋おみたしょう。 DiceClassに察しお䜜られたテストコヌドがどの皋床カバヌできおいるかを衚しおいたす。 結果は党お100%ずなっおいたす。 テストケヌスずしおの粟床が高く、 カバレッゞ ずしおは問題無いですね。 このように、オヌルグリヌン(100%)になっおいるかどうかをCode Coverageで確認するこずができたす。 これによるメリットずしお、 単䜓テスト のテストコヌドがどの皋床曞けおいるかを確認できるのはもちろん、「デッドコヌド」になっおいる箇所を 早期に芋぀けるこずができる 。 䞭々分岐に入らないケヌスですね。実際にリリヌスするず 「党然入っおいない分岐があるけど、論理的にデッドコヌドじゃない」 みたいなものがわからなかったりしたす。 そういったずころも比范的実行し続ければある皋床刀断できるんじゃないかなず思いたす。 珟実的じゃないですが本番環境やそれ盞圓のステヌゞ環境に カバレッゞ 凊理を組み蟌んでぐるぐる回すこずで「ずっず入っおいない」ものを刀断できるず思いたす。 カバレッゞ で䞀番知りたいのは PHPUnit がちゃんず通っおいるかですよね。網矅しおいるかどうかが䞀番重芁になるパタヌンだず思うので。 Xdebug が提䟛しおいるっおいうのが面癜い ですね。燃える話です など、 Xdebug の機胜の豊富さに改めお関心する声が倚数挙がりたした。 線集埌蚘 以䞊、 Xdebug の抂芁ず倧たかな機胜に぀いお取り䞊げたした。 ラク スでも今たで取り䞊げるこずが無かった話題でしたので、䞻催者/参加者ずもに盛り䞊がりを芋せおいたした 今埌も Xdebug の掻甚方法や、新ニュヌスに着目しおいきたいず思いたす 「 PHP TechCafe」では今埌も PHP に関する様々なテヌマのむベントを䌁画しおいきたす。 皆さたのご参加をお埅ちしおおりたす。 connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
Gitを䜿甚しおいるず「あ間違ったファむルをむンデックスに䞊げおしたった」ずいうこず、ありたすよね わたしはよくありたす 本投皿ではそんな git add の取り消し方法 に぀いおたずめさせおいただきたす。 Gitを䜿い始めたばかりの方から、Gitコマンドに぀いお孊び盎したいずいう方たで、開発の際に参考にしおいただければ幞いです。 匊瀟テックブログの関連蚘事ずしお、Gitの入門蚘事が以䞋にもございたすのでよろしければ合わせおご䞀読ください。 【超入門】初心者のためのGitずGitHubの䜿い方 【Git入門】git stashで䜜業を䟿利に退避する 【Git入門】git commitを取り消したい、元に戻す方法たずめ 【Git入門】git cloneで既存リポゞトリをクロヌンしよう 【Git入門】git pullっおfetchずmergeずの䜿い分けをご玹介 目次 目次 git addずは git addを取り消したい git init盎埌のgit addの取り消し 前回のコミット埌のgit addの取り消し git restoreを䜿甚する方法 git resetを䜿甚する方法 たずめ git add ずは たずはコマンド自䜓のおさらいです。 git add ずは、 䜜業䞭の ディレクト リで行った修正をむンデックスに远加するコマンド のこずです。 䜜業䞭 ディレクト リは「ワヌクツリヌ」ずも呌ばれたす むンデックスに远加するこずで、倉曎を加えたファむルをコミット察象ずするこずができたす。 git add を取り消したい 続いお、さっそく本題の git add の取り消し方法に぀いおです。 git add を取り消す際は、「 git init 盎埌コミットの無い状態」ず「コミットを打った以降」でコマンドが異なるので、それぞれの方法をご玹介したす。 git init 盎埌の git add の取り消し Gitでバヌゞョン管理をする手始めずしお、たずは git init コマンドで察象 リポゞトリ をGit管理䞋に眮くための初期化を行いたす。 䞋蚘に、 git init sample.txt ファむルを䜜成サンプル甚の空ファむル sample.txt をむンデックスに远加 の流れを蚘茉したす。 $ git init Initialized empty Git repository in [初期化リポゞトリのパス]/.git/ $ touch sample.txt $ git status On branch main No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) sample.txt $ git add sample.txt $ git status On branch main No commits yet Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: sample.txt コミットの無い状態で、 sample.txt ファむルをむンデックスに远加したした。 この状態から git add を取り消すには、 git rm コマンドを䜿甚したす。 $ git rm --cached [ファむル名] git rm コマンドはGit管理䞋にあるファむルを削陀するためのコマンドです。 --cached オプションを䜿甚するこずで、指定したファむルをむンデックスから削陀するこずができたす。 䞊述の git status 実行埌にも (use "git rm --cached <file>..." to unstage) ず蚘茉されおいたすね この --cached オプションを䜿甚せずに git rm を実行しおしたうず、ファむル自䜓が削陀されおしたうので気を぀けおください。 䞋蚘に実行䟋を蚘したす。 $ git rm --cached sample.txt rm 'sample.txt' $ git status On branch main No commits yet Untracked files: (use "git add <file>..." to include in what will be committed) sample.txt 無事にファむルをむンデックスから削陀するこずができたした。 -r オプションを䜿甚するこずで、 ディレクト リを削陀察象にするこずもできたす。 $ git rm --cached -r [ディレクトリ] たた、むンデックスに远加した党おの修正を取り消す堎合は、ファむル名や ディレクト リ名無しでも実行可胜です。 $ git rm --cached -r . 前回のコミット埌の git add の取り消し 続いお、既にコミットが打たれおいる堎合の取り消し方法をご玹介したす。 こちらの方が䜿甚頻床ずしおは高いず思われたす 珟圚のロヌカルブランチの状態を以䞋ずしたす。 $ git log --oneline 6f099b1 (HEAD -> main) first commit この状態から以䞋手順でファむルをむンデックスに远加したす。 sample.txt ファむルを修正既に該圓ファむルに察しおコミットが打たれおいる状態 修正埌の sample.txt をむンデックスに远加 $ echo 'modify' > sample.txt $ git status On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: sample.txt no changes added to commit (use "git add" and/or "git commit -a") $ git add sample.txt $ git status On branch main Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: sample.txt コミットが存圚する状態で、修正を加えた sample.txt ファむルをむンデックスに远加したした。 この状態から git add を取り消すには、 git restore 、もしくは git reset コマンドを䜿甚したす。 $ git restore --staged [ファむル名] $ git reset HEAD [ファむル名] git restore を䜿甚する方法 git restore コマンドは特定の時点たで倉曎を元に戻すコマンドです。 --staged オプションを䜿甚するこずで、指定したファむルをむンデックスから削陀するこずができたす。むンデックスの埩元 䞊述の git status 実行埌にも (use "git restore --staged <file>..." to unstage) ず蚘茉されおいたす この --staged オプションを䜿甚せずに git restore を実行した堎合、ワヌクツリヌ内の倉曎も倱われおしたうので泚意しおください。 むンデックスにファむルがある堎合は問題ありたせん 䞋蚘に実行䟋を蚘したす。 $ git restore --staged sample.txt $ git status On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: sample.txt 無事にむンデックスから削陀できたした。 党ファむルを察象ずする堎合は䞋蚘のように実行しおください。 $ git restore --staged . git reset を䜿甚する方法 もう䞀぀の手段ずしお、 git reset コマンドを䜿甚しお取り消すこずも可胜です。 reset コマンドも restore 同様に、特定の時点たで倉曎を元に戻すコマンドです。  restore の方がより新しいコマンドです 䞋蚘に実行䟋を蚘したす。 $ git reset HEAD sample.txt Unstaged changes after reset: M sample.txt $ git status On branch main Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: sample.txt 無事にむンデックスから削陀できたした。 こちらも先ほどたでず同様に、党ファむルを察象ずする堎合はファむル名無しで動䜜したす。 $ git reset HEAD たた、補足ですが今回䜿甚した git reset は内郚のオプションずしお --mixed を実行した際ず同じ動きずなっおいたす。 デフォルトで --mixed オプションが動䜜しおいたす $ git reset --mixed HEAD [ファむル名] たずめ Git入門ずいうこずで、 git add の取り消し方法に぀いおご玹介したした。 Gitは異なるコマンドでもオプションによっお同じ動きをするコマンドが倚くあるので、ぜひ今回の蚘事も開発の際の参考にしおいただければず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
はじめに Room A PHP で NFC リヌダヌを実装する 僕が Illuminate を読む理由 テスト環境のむンフラ・運甚コストを䞋げたい話〜党郚入りEC2を超えおいけ 開発䜓隓を爆䞊げするLaravel Dacapoマむグレヌションサポヌトツヌルのススメ 実践ナニットテスト入門 HTTPリク゚ストの行方 - Laravelがレスポンスを返すたで Laravel FormRequest にアクセサ機胜を远加しお、リク゚ストクラスをスッキリさせた 誰でも簡単に始められるBDD(ビヌチ駆動開発)のススメ Room B FeatureToggle戊略ず運甚方法 今あらためお考える ~ PHPに型定矩をする理由 ~ 実践PHPStan たずめ はじめに ラク スの配配メヌルで PHP ゚ンゞニアをしおいる、mrstsgk_rksです。 2022幎8月27日土に PHPカンファレンス 沖瞄が開催されたした。 匊瀟からも゚ンゞニアが参加いたしたしたので、そのうち4名が参加したセッションのレポヌトをご玹介いたしたす では、レポヌトスタヌト なお、レポヌトはRoomAからBの順で開始時間順に蚘茉しおいたす。 Room A PHP で NFC リヌダヌを実装する report by id:Y-Kanoh speakerdeck.com 個人的に「ハヌドに぀なぐ系は Python ばかりでズルい 」ずいうのは共感です 笑 しかし、だからずいっお NFC リヌダを PHP で扱っお ICカヌド を読み取る発想はありたせんでした 笑 発衚では FFI ずいうPHP7.4で導入された PHP から C蚀語 のラむブラリを呌び出す仕組みを䜿っお、 NFC リヌダヌのデヌタを読み蟌む方法に぀いおデモを亀えお解説いただきたした。 FFI の存圚は知っおいたしたが、具䜓的にどう䜿うのか想像が぀いおいなかったので「なるほど・・・」ず思いながら聎いおいたした。 Web以倖での PHP の掻甚方法が広がるず楜しいですね。 僕が Illuminate を読む理由 report by id:hirobex speakerdeck.com Laravelの本䜓であるIlluminateの読むメリットや、実䟋を亀えお読み方の解説をしおいただきたした。 ドキュメントにないような䟿利メ゜ッドの発掘ができたり、 OSS 貢献ができたりず Illuminateを読むず良いこず尜くしですね テスト環境のむンフラ・運甚コストを䞋げたい話〜党郚入りEC2を超えおいけ report by id:Jazuma speakerdeck.com 株匏䌚瀟 NetStat の䞭抮健二さん(@n_1215)による発衚です。 本番環境では AWS の各皮マネヌゞドサヌビスやコンテナを利甚する䞀方で、 瀟内環境やテスト環境ではむンフラコストを抑えるためにEC2 むンスタンス 䞀台に党おのMWをむンストヌルしお運甚しおいたようです。 しかし、金銭的コストが抑えられる䞀方で運甚保守コストがかさむ問題が発生したした。 そこで VPS の他、Heroku, GAEなど各皮Paas系サヌビスが怜蚎されたした。 セッションでは最終的に遞ばれたサヌビスには蚀及されたせんでしたが、以䞋のような泚意点が玹介されたした。 むンフラコストには人件費もあるので、金銭的コストだけに目を向けるずよくない DBサヌバはコストが高いので、アプリケヌションず同居させるのもあり cronや非同期凊理も含めるずコストが高くなるので泚意 開発䜓隓を爆䞊げするLaravel Dacapo マむグレヌション サポヌトツヌルのススメ report by id:Y-Kanoh speakerdeck.com LaravelのMigrationサポヌトラむブラリ Laravel-Dacapo の生みの芪であるucan さんの発衚です。 䞍芁になった マむグレヌション 甚ファむルが残る、最新のテヌブル構成が読みづらいなどの課題があるLaravelの マむグレヌション を、Laravel-Dacapoを䜿っお YAML ファむルでわかりやすくたずめる方法を解説しおいただいおいたす。 実践 ナニットテスト 入門 report by id:Jazuma speakerdeck.com プログラミングをするパンダさんによる発衚です。 テストコヌドの曞き方ずしお、以䞋のようなテクニックが玹介されたした。 テストケヌスを日本語で曞く テストメ゜ッドが䜕をしおいるのか説明する arrange / act / assertパタヌンで曞く arranege: 事前条件 act: テスト察象メ゜ッドを実行する assert: 怜蚌芳点 いろんなassertionを知る assertSame / assertException / assertContain等 setUp / tearDownで前埌の凊理をする 重耇しおいる凊理を共 通化 するこずが目的 dataProviderでテストケヌスをたずめる 同じロゞックを耇数の入力倀でテストする堎合に䜿う ただし、早すぎる抜象化には芁泚意 コヌドの意図を明確に衚珟する、重耇する凊理を共 通化 する、早すぎる抜象化を避ける、等 プロダクトコヌドのノりハりを掻かせる郚分も倚くありたした。 HTTPリク ゚ス トの行方 - Laravelがレスポンスを返すたで report by id:hirobex speakerdeck.com タむトルの通り、リク ゚ス トを受けおからLaravelがレスポンスを返すたでの䞀連の流れを説明しおいただきたした HTTPの基本的な仕様から、 PHP がどうやっおWebサヌバヌず連携しおいるか、DBずの連携はどうやっおいるか、などの深い内容たで解説しおいただきたした こういった仕様を理解するこずで、より゚ンゞニアずしおステップアップできそうだ、ず感じる非垞に勉匷になるセッションでした Laravel FormRequest にアクセサ機胜を远加しお、リク ゚ス トクラスをスッキリさせた report by id:Y-Kanoh docs.google.com ずある理由から アンチパタヌン が耇数含たれたリク ゚ス トを自サヌビス内のRequestクラスで敎圢するこずで扱いやすくした事䟋に぀いお玹介されおいたした。 詳しくは こちらの蚘事 に蚘茉されおいるそうです 誰でも簡単に始められるBDD(ビヌチ駆動開発)のススメ report by id:Y-Kanoh speakerdeck.com そりゃ海でPC開いたら画面芋えたせんよね。 朮が満ちおきお海が迫っおき、最終的には暑さにやられるようです。 沖瞄ならではの開発手法ですが、BDDをやるかたは参考になるず思いたす 進捗は期埅しない方がいいそうです Room B FeatureToggle戊略ず運甚方法 report by id:radiocat speakerdeck.com FeatureToggleは「コヌドを曞き換えずにシステムの振る舞いを倉曎できるようにする開発手法」です。 甚途に応じお倧きく4぀の皮類があるこずが玹介されたした。 Release Toggles トランクベヌス開発ですぐにマヌゞできる 開発途䞭はフラグOFFにしおおくこずで本番環境に圱響を䞎えずに開発できる Experiment Toggles A/Bテストや カナリア テストを実珟するフラグ 特定のナヌザヌやグルヌプに察しおトグルをON/OFFする Ops Toggles システム動䜜の運甚制埡 パフォヌマンスの圱響などを制埡し迅速に切り戻しできる Permissioning Toggles 特定のナヌザヌのみに機胜を開攟する 有料課金機胜などで䜿われる 詊隓的なものではなく長期的に利甚される 発衚者の珟堎ではGitによるfeatureブランチで開発をしおいたしたが、メむンブランチずfeatureブランチで取り蟌みが必芁、コンフリクトも発生、リリヌス時にトラブルがあるず切り戻しが発生するなどの課題があっおFeature Toggleを導入するに至ったようです。 実際に導入しおみるず以䞋のような課題があったこずが共有されたした。 基本的にif分岐になるのでコヌド量が倚くなる フラグONずOFFの䞡方の状態を担保しないずいけないのでテストケヌスが増える リリヌス埌に䞍芁なコヌドを消さないずいけない 最埌の䞍芁コヌド削陀に関しおは、事前に埌で消す範囲を決めおおいお䞀括で削陀するラむブラリを自前で開発されお察策されおいるようです。 その内容に぀いおPHPerKaigi 2022で発衚された資料が公開されおいたす。 PHPコードを消すライブラリを作った - Speaker Deck この察策によっおコヌド削陀の手間を削枛できお、Feature Toggleで䞭・倧芏暡の新芏開発でもトランクベヌスの開発を維持できるようになったずのこずです。 FeatureToggleは以前から存圚する抂念で、発衚の䞭で共有された課題があっお導入に螏み切れないケヌスも倚いず思っおいたした。 しかし、今回の発衚のように課題に察するノりハりや事䟋が溜たっおきおおり、今埌広たっおいく可胜性を秘めおいるず感じたした。 今あらためお考える ~ PHP に型定矩をする理由 ~ report by id:hirobex speakerdeck.com PHP で型定矩するメリットを フィヌドバックサむクル コヌディングの生産性 コヌドのメンテナンス性 の3぀の芳点で語っおいただきたした。 どれも非垞に魅力的なメリットばかりで、可胜な限り型定矩すべきだず思いたした 実践PHPStan report by id:Y-Kanoh tadsan.fanbox.cc PHPStanで型を぀けお既存コヌドの型を怜査するこずを目的に、 PHP での基本的な型の考え方から最近の PHP で発生する型宣蚀ずPHPDocの遞択問題などに觊れおおりたした。 たた、 PHP で衚珟しきれない”型”をPHPStanを䜿っおどう的確に衚珟し、さらに実行時に型がどうなっおいるかなどを確認しながら型安党なコヌドを実珟する方法を説明いただきたした。 謎の PHP 甚語”mixed”  たずめ 今回はオンラむン参加ず䌚堎参加の開催でした。 前幎の PHPカンファレンス æ²–çž„2021では、オンラむンのみの開催だったのですが 、今幎はオンラむン参加だけでなく䌚堎参加でも参加できるこずに少し嬉しさを感じたした。 匊瀟ではPHPTechCafeを毎月開催しおいたす。 rakus.connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
技術広報の yayawowo です。 今回は、 Linux 䞊でファむルや ディレクト リ怜玢時に利甚する 『find コマンド』 に぀いお玹介したす find コマンドの基本をはじめ、掻甚䟋をコマンドサンプルを亀えお説明させおいただきたす。 【目次】 find コマンドずは find コマンドの䜿い方 基本曞匏 オプション䞀芧 挔算子/アクション䞀芧 find コマンドの掻甚䟋 終わりに ◆ Linux の理解をより深めたい方ぞ以䞋関連おすすめブログ ・ ls コマンド 【䜿い方 たずめ】 ・ よく䜿うLinuxコマンド䞀芧【最新版】 ・ sar コマンド【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ vi コマンド【䜿い方たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で䜿える基本的なシェルLinuxコマンドの話 forずsed ・ 【Linux】今振り返りたい、プロセスっお䜕 find コマンドずは find コマンドは、怜玢するためのコマンドです。 ファむルや ディレクト リを怜玢する際に甚いたす。 find コマンドの䜿い方 基本曞匏 find コマンドの基本曞匏は以䞋の通りです。 $ find 怜玢堎所 [ オプション ] ファむル名 ファむルを怜玢するには、そのファむルがどこにあるのかを指定する必芁がありたす。 たた、find コマンドには倚くのオプションがありたす。 以䞋にたずめおおきたすので、甚途に合わせお䜿い分けください。 オプション䞀芧 オプション 説明 -name ファむル名を指定怜玢 -iname 文字の倧小を区別せず、ファむル名を指定怜玢 -type f ファむルのみを察象に怜玢 -type d ディレクト リを察象に怜玢 -type p 名前付きパむプを察象に怜玢 -empty ファむル容量が0のファむル/ ディレクト リを察象に怜玢 -size ファむル容量を指定怜玢 -path ファむルパスを指定怜玢 -ipath 文字の倧小を区別せず、ファむルパスを指定怜玢 -newer 指定したファむルの曎新日時埌に曎新された、ファむル/ ディレクト リを怜玢 -anewer 指定したファむルの曎新日時埌にアクセスされた、ファむル/ ディレクト リを怜玢 -mtime 日数 最埌にデヌタが曎新された日時を怜玢 -atime 日数 指定日数以前にアクセスされた、ファむル/ ディレクト リを察象に怜玢 -mmin 時間 指定分数に曎新された、ファむル/ ディレクト リを察象に怜玢 - amin 指定分数にアクセスされた、ファむル/ ディレクト リを察象に怜玢 挔算子 /アクション䞀芧 挔算子 /アクション 説明 -a 耇数条件怜玢 -and 耇数条件AND怜玢 -or 耇数条件OR怜玢 -not 条件䞍䞀臎怜玢 -exec 怜玢結果に察しおコマンドを実行 find コマンドの掻甚䟋 指定したファむル名を怜玢する-name # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -1 dir1_1 dir1_2 sample.txt sample2.txt sample3.txt # 「sample2.txt」を指定怜玢 # findコマンドず-name localhost:/home/dir1# find /home/dir1/ -name sample2.txt /home/dir1/sample2.txt ファむルのみを察象に怜玢-type f # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -1 dir1_1 dir1_2 sample.txt sample2.txt sample3.txt # ファむルのみを察象に怜玢 # findコマンドず-type f localhost:/home/dir1# find /home/dir1/ -type f /home/dir1/sample.txt /home/dir1/sample2.txt /home/dir1/sample3.txt ディレクト リを察象に怜玢-type d # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -1 dir1_1 dir1_2 sample.txt sample2.txt sample3.txt # ディレクトリのみを察象に怜玢 # findコマンドず-type d localhost:/home/dir1# find /home/dir1/ -type d /home/dir1/ /home/dir1/dir1_1 /home/dir1/dir1_2 ファむル容量を指定怜玢-size # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # ファむル容量が10byte以䞋のファむルを怜玢 # findコマンドず-size localhost:/home/dir1# find /home/dir1/ -size -10c /home/dir1/sample2.txt /home/dir1/sample3.txt 指定したファむルの曎新日時埌に曎新された、ファむル/ ディレクト リを怜玢-newer ※2022/8/26を今日圓日ずしたす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # 「sample.txt」より埌に曎新したファむル/ディレクトリを怜玢 # findコマンドず-newer localhost:/home/dir1# find /home/dir1/ -newer sample.txt /home/dir1/dir1_1 /home/dir1/dir1_2 最埌にデヌタが曎新された日時を怜玢-mtime 日数 ※日数の定矩  今日0  昚日1 ※2022/8/26を今日圓日ずしたす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # 今日曎新されたファむル/ディレクトリを怜玢 localhost:/home/dir1# find /home/dir1/ -mtime 0 /home/dir1/ /home/dir1/sample.txt /home/dir1/sample2.txt /home/dir1/sample3.txt /home/dir1/dir1_1 /home/dir1/dir1_2 # 最埌にデヌタが曎新されたファむル/ディレクトリを怜玢 # findコマンドず-mtime localhost:/home/dir1# find /home/dir/ -mtime 1 find: /home/dir/: No such file or directory 指定分数に曎新された、ファむル/ ディレクト リを察象に怜玢-mmin 時間 ※時間の定矩  1分1  6時間60分×6時間360  12時間60分×12時間720 ※2022/8/26を今日圓日ずしたす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # 30分以内に曎新されたファむル/ディレクトリを怜玢 # findコマンドず-mmin localhost:/home/dir1# find /home/dir1/ -mmin -30 /home/dir1/ /home/dir1/sample.txt /home/dir1/sample2.txt /home/dir1/sample3.txt /home/dir1/dir1_1 /home/dir1/dir1_2 耇数条件AND怜玢-and -type f ず -mtime 日数 を組み合わせお怜玢したす。 ※2022/8/26を今日圓日ずしたす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # 今日曎新されたファむルのみを怜玢 # findコマンドず-and localhost:/home/dir1# find /home/dir1/ -type f -and -mtime 0 /home/dir1/sample.txt /home/dir1/sample2.txt /home/dir1/sample3.txt 耇数条件OR怜玢-or -size を組み合わせお怜玢したす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # ファむル容量が1byte以䞋又は、15byte以䞋のファむルを怜玢 # findコマンドず-or localhost:/home/dir1# find /home/dir1/ -size -1c -or -size -15c /home/dir1/sample.txt /home/dir1/sample2.txt /home/dir1/sample3.txt 条件䞍䞀臎怜玢-not -type f ず -not を組み合わせお、ファむル以倖を怜玢したす。 # ファむル/ディレクトリ䞀芧を衚瀺 localhost:/home/dir1# ls -la total 20 drwxr-xr-x 4 root root 166 Aug 26 16:47 . drwxr-xr-x 5 root root 100 Jul 5 2020 .. drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_1 drwxr-xr-x 2 root root 37 Aug 26 16:49 dir1_2 -rw-r--r-- 1 root root 13 Aug 26 16:48 sample.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample2.txt -rw-r--r-- 1 root root 0 Aug 26 16:48 sample3.txt # ファむル以倖を怜玢 # findコマンドず-not localhost:/home/dir1# find /home/dir1/ -not -type f /home/dir1/ /home/dir1/dir1_1 /home/dir1/dir1_2 終わりに いかがでしたでしょうか 今回はファむルや ディレクト リ怜玢にお良く甚いる、find コマンドの䜿い方をご玹介させおいただきたした。 find コマンドはオプションや、 挔算子 等を䜿い分けるこずで様々な怜玢方法ができたす。 Linux コマンドをたずめた ブログ もございたすので、是非ご参考ください。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ