åãã« çããããã«ã¡ã¯ã éçºèª²ã®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