ã¯ããã« çæ§ãã¯ãããŸããŠãFindyã§ãããã¯ãéçºéš/SREãšããŠãžã§ã€ã³ããŸããå®éïŒ @adachin0817 ïŒãšç³ããŸããä»å¹Žã®6æã«å
¥ç€Ÿããã¡ããã©3ã¶æãçµã¡ãŸãããæ¬æ¥ã¯ãSREããŒã ã®ç«ã¡äžãã«é¢ãã0ãã1ã®ããã»ã¹ãšã仿ã®åãçµã¿ã«ã€ããŠã玹ä»ãããŠããã ããããšæããŸãã SREããŒã çºè¶³ 2023幎ãŸã§ã¯ãããã¯ãšã³ãããŒã ãã€ã³ãã©ãæ
åœããŠããŸããããããããµãŒãã¹ã®æ¡å€§ã«äŒŽããããã¯ãšã³ãããŒã ã®ãªãœãŒã¹ãäžè¶³ããSREçãªæ¹åãååã«è¡ããªãç¶æ³ãç¶ããŠããŸãããããã§ãæšå¹ŽããSREã®å€§ç¢ãšããŒã ãªãŒããŒã®äžåžïŒ @gessy0129 ïŒããžã§ã€ã³ããçŸåšã¯3åäœå¶ã§æŽ»åããŠãããŸãã SREããŒã ã®äœçœ®ã¥ããšããã·ã§ã³ SREããŒã ã¯æšªæçãªSRE掻åãããŠãããããããæšªæSREããšæããŠããŸããäžæ¹ã§ãåãããã¯ãã«ãããŠSREçãªåœ¹å²ãæ
ã£ãŠããã¡ã³ããŒã¯ãEmbedded SREããšåŒã°ããåŒãç¶ãæ¹å掻åãæ
åœããŠããŸãã SREããŒã ã¯çŸåšãããŒã ãäœãäžããŠããæ®µéã«ããããŸã ãŸã ããããšãå€ãæ®ãããŠããŸããããããèæ¯ãèžãŸããSREããŒã ã®çæããã³äžæã«ãããããã·ã§ã³ãèšå®ããŸããã çæããã·ã§ã³ ããã¡ã€ã³ãã£ã®äºæ¥æé·ãæ¯ããããã®ãSREçµç¹ã®ããæ¹ã®ç¢ºç«ã äžæããã·ã§ã³ ã瀟å¡å
šå¡ãäºæ¥æé·ã«éäžã§ããããªä»çµã¿ãæ§ç¯ããæäŸããã SREã®ååšæçŸ© SREã¯éãäœãããã«ååšãã ãªã¹ã¯ãåãå
¥ãã管çãã SLOãèšæž¬ãã ãã€ã«ã®åæž ã¢ãã¿ãªã³ã°ãã èªååãã ä»ãããã¯ãã®æ¯æŽ SREããŒã ã®æ¥åã®é²ãæ¹ ã¢ãžã£ã€ã«éçºææ³ãæ¡çšããŠãããåã¡ã³ããŒã«ã¯ããããIssueïŒã¿ã¹ã¯ïŒãå²ãåœãŠãããŸããäžé±éã€ãã¬ãŒã·ã§ã³ã§ç®¡çããIssueã®ã¯ããŒãºãç®æããŠããŸããæ¯æãGitHubã®Projectsã䜿çšããŠã«ã³ãã³ããŒãã確èªãã仿¥ã®ã¿ã¹ã¯ãå°ã£ãŠããããšãå
±æããéè«ãããŠããŸãããŸããæ¯é±éææ¥ã«ã¯ããŒã å
šäœã§æ¯ãè¿ããè¡ããFindy Team+ãæŽ»çšããªããå
容ãKibelaã«èšé²ããå
šå¡ãé²èЧã§ããããã«ããŠããŸããããã«ãéé±ã§Embedded SREããŒã ãšã®ãè¶äŒã宿œããŠãããåãçµã¿ããããšãå
±æããå ŽãèšããŠããŸãã ã«ã³ãã³/ã¹ããŒã¿ã¹ ã¹ããŒã¿ã¹ å
容 To Do Issueãäœæããç¶æ
ãæªçæ Parent In Progress 芪åé¢ä¿ã®ããIssueã®èŠª In Progress é²è¡äžã®Issue Done 察å¿ãå®äºããIssue ã§ã¯ã仿SREããŒã ã®åãçµã¿ã«ã€ããŠã玹ä»ããŠãããããšæããŸãã 仿ã®åãçµã¿ã«ã€ã㊠å
šç°å¢ã®Terraform importå ãããŸã§å
šãŠã®ç°å¢ãTerraformã§å®å
šã«ã³ãŒã管çãããŠããªãç¶æ
ã§ããããçŸåšã¯å
šãªãœãŒã¹ãã³ãŒãåããããšã§äžå
管çãå®çŸããç°å¢éã§ã®èšå®ã®æŽåæ§ãä¿ãããããã«ãªããŸããããŸãã¯æ¢åã®èšå®ãæ£åžããããªãœãŒã¹ãã€ã³ããŒãããããšã§ãä»åŸã®å€æŽãæ¡åŒµããã容æã«ãªã£ãŠããŸããããã«ãTerraform CloudãæŽ»çšããªãããä»åŸã¯moduleåãé²ããŠãå¹ççã§ã¹ã±ãŒã©ãã«ãªã€ã³ãã©ç®¡çãç®æããŠããŸãã Findy Toolsã®ã€ã³ãã©æ¹å ç§ãå
¥ç€ŸããŠããFindy Toolsã®ã€ã³ãã©æ¹åãšããŠãããã€ã察å¿ããŠãããŸããããŸãã¯ãRDSã®SSL/TLSèšŒææžæŽæ°ãšAuroraã®ãã€ããŒããŒãžã§ã³ã¢ãããéçºç°å¢ããæ¬çªç°å¢ãŸã§3æ¥ã§å®æœããŸãããæ¬¡ã«ç£èŠãšãªãã¶ãŒãããªãã£ã®åŒ·åã§ã¯ãå
ã
ã¯ã€ã³ãã©ãªãœãŒã¹ãã¢ãã¿ãªã³ã°ããŠããããSentryã®ãšã©ãŒãã©ããã³ã°ãšAPMã®ã¿ã§ãããããã§Datadogã§ã®ã€ã³ãã©ãªãœãŒã¹(ECSãå€åœ¢ç£èŠãCloudFrontãRDSãã€ãã³ããã°ãWAF)ãAPMãªã©ã察象ã«ãã¢ã©ãŒããTerraformã§ç®¡çããããã·ã¥ããŒããæåã§éçšããããã«ãªããŸãããæ®æ®µèŠããŠããªãã£ãéšåããªãã¶ãŒãããªãã£ã®åäžã«ãã£ãŠå¯èŠåãããŠãããŸããã ãŸããSLI/SLOã®çå®ãé²ããããŒãžè¡šç€ºé床ããªã¯ãšã¹ãæåçã®ç®æšãèšå®ãããšã©ãŒããžã§ãããšããŒã³ã¬ãŒãã®ç®¡çãé²ããŠãããŸãããSLOã®æ¯ãè¿ãã¯éé±ã§å®æœããŠãããã¢ã©ãŒããçºçããéã«ãéçºã¡ã³ããŒãšæ¹åæ¡ã話ãåããããšã¯éåžžã«éèŠã ãšæããŠããŸãã æåŸã«ãRails serverãNode.jsãMySQL8ã®éçºç°å¢ã®æ§ç¯ãæ¹åããJustfileãæŽ»çšããŠèªååãé²ããŸãããJustã¯Makefileãšæ¯èŒãããšãã·ã³ãã«ã§çŽæçãªæ§æã§ãã·ã§ã«ã¹ã¯ãªããã«äŒŒãŠããŸãããŸããäŸåé¢ä¿ã®ç®¡çãç°¡åãªãããåŠç¿ã³ã¹ããäœãã§ããããã«ãããéçºã¡ã³ããŒã¯ã¹ããŒãã£ãŒã«æ§ç¯ã§ããããã«ãªããŸããã以äžããã³ããšã³ãã®Justfileã«ãªããŸãã Frontend Justfile # Justfile for setting up development environment # Install Homebrew and essential packages install_homebrew: @echo "Installing Homebrew if not already installed..." @if ! command -v brew >/dev/null 2>&1; then \ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"; \ else \ echo "Homebrew is already installed."; \ fi install_essential_packages: @echo "Installing essential packages..." brew install coreutils curl git # Configure Git configure_git: @echo "Configuring Git..." git config core.ignorecase false # Install asdf and Node.js install_asdf: @echo "Installing asdf if not already installed..." @if ! command -v asdf >/dev/null 2>&1; then \ brew install asdf; \ echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc; \ else \ echo "asdf is already installed."; \ fi install_nodejs: @echo "Installing Node.js..." @if ! asdf plugin list | grep -q 'nodejs'; then \ asdf plugin add nodejs; \ else \ echo "Node.js plugin is already added."; \ fi asdf install nodejs asdf reshim nodejs # Install mkcert and create certificates install_mkcert: @echo "Installing mkcert if not already installed..." @if ! command -v mkcert >/dev/null 2>&1; then \ brew install mkcert; \ mkcert -install; \ else \ echo "mkcert is already installed."; \ fi create_certificates: @echo "Creating local certificates..." mkcert -cert-file localhost.pem -key-file localhost-key.pem localhost 0.0.0.0 hoge-web # Install npm packages install_npm_packages: @echo "Installing npm packages..." npm ci # Run all tasks all: install_homebrew install_essential_packages configure_git install_asdf install_nodejs install_mkcert create_certificates install_npm_packages ãããã®æ¹åã«ã€ããŠã¯ã7æã®åŒç€ŸDevRelã€ãã³ãã§LTãè¡ããŸããã®ã§ããŸã ã芧ã«ãªã£ãŠããªãæ¹ã¯ãã²ã¹ã©ã€ããã確èªãã ããã findy.connpass.com speakerdeck.com AWSã»ãã¥ãªãã£åšãåäž AWSã»ãã¥ãªãã£ã®åŒ·åçãšããŠãSecurity Hubã®å®è£
ãæ€èšããŸããããäºæ³ä»¥äžã®å°å
¥å·¥æ°ãšæ¢åããã·ã¥ããŒãæ©èœã®çŸç¶ãèæ
®ããçµæãæã
ã®èŠä»¶ã«ããé©ããå¥ã®ã¢ãããŒããæš¡çŽ¢ããããšã«ããŸãããè€æ°ã®SaaSã»ãã¥ãªãã£ãµãŒãã¹ãæ€èšããæçµçã«Shisho Cloudãéžå®ããŸãããShisho Cloudã¯äœ¿ãããããšã³ã¹ãé¢ã§çŸåšã®ãã¡ã€ã³ãã£ç€Ÿã®èª²é¡ã«ãããããŠãããçŸåšã¯AWSã»ãã¥ãªãã£ããªã·ãŒã¬ã€ãã©ã€ã³ãäœæããEmbedded SREããŒã ãšååããŠå¯Ÿå¿ãé²ããŠããŸãã ãFindy Team+ããªãã¶ãŒãããªãã£åšã匷å Findy Toolsã§å¹ã£ããªãã¶ãŒãããªãã£ãSLOã®çµéšã掻ãããFindy Team+ã®SREæ¯æŽãè¡ããŸãããå
ã
èšå®ãããŠããDatadogã®ã¢ã©ãŒãã¯Terraformã§ç®¡çãããŠããªãã£ãããããŸãæ£åžããããå
šãŠãTerraformã§importåããŸããããããå€ãªã©ã¯æ¬¡ã®ããã«ç°å¢å€æ°ã§ç®¡çãããã³ãã¬ãŒãåããããšã§ä»ã®ãããžã§ã¯ãã«ãé©çšå¯èœã«ããŸãããSLOã®çå®ã«ã¯ãŸã æ¹åã®äœå°ããããŸãããä»åŸã¯ããã·ã§ã³ã¯ãªãã£ã«ã«ãªé åã«ãåãçµãã§ãããéçºã¡ã³ããŒãšæ¯ãè¿ãã宿œããŠããäºå®ã§ãã rds.alert.tf resource "datadog_monitor" "rds_cpu_alert" { name = "[${var.service_name}]rds_cpu_alert" type = "metric alert" query = "avg(last_5m):avg:aws.rds.cpuutilization{rds:${var.service_name}-${var.environment}} by {dbinstanceidentifier} > ${var.rds_cpu_critical_threshold}" escalation_message = "RDS CPU usage for ${var.service_name}_${var.environment} instance has exceeded ${var.rds_cpu_critical_threshold}%" notify_no_data = false notify_audit = false timeout_h = 1 include_tags = true monitor_thresholds { critical = var.rds_cpu_critical_threshold } message = <<-EOT @${var.slack_channel} EOT tags = local.combined_tags } 仿ãŸã ãããããŠããªãã¿ã¹ã¯ DevSecOpsã®æšé²ã«åããã»ãã¥ãªãã£åºç€ã®ãããªãæŽå AWSã³ã¹ãæé©å éçºã¡ã³ããŒçç£æ§ã®åäž éçºç°å¢ å®å
šDockeråãšJustfileå ECS Armå Stgè€æ°ç°å¢ èªåå ãããã€é«éå åŸåã§ã¯ãAWSã³ã¹ãæé©åãéçºã¡ã³ããŒã®çç£æ§åäžã®ããã«ããããªãå¹çåãšãããããã远æ±ããã€ã³ãã©ç®¡çãéçºããã»ã¹ã®æ¹åãé²ããŠããŸãã ãŸãšã SREããŒã ã®çºè¶³ãšä»æã®åãçµã¿ã«ã€ããŠãç°¡åã«ã玹ä»ãããŠããã ããŸãããããŒã ã®ç«ã¡äžãããã€ã³ãã©ã®æ¹åãã»ãã¥ãªãã£å¯ŸçãŸã§ãå€å²ã«ããã課é¡ã«åãçµãã§ããŸãããããŸã ããã¹ãããšããããããããŸãã(Issueã100å以äžãããŸã) ä»åŸãåŒãç¶ããSREããŒã ãšããŠãµãŒãã¹ã®ä¿¡é Œæ§åäžã«åªããŠããã®ãšåæã«SREã«èå³ã®ããæ¹ã¯ããã²äžç·ã«åããŸãããïŒã«ãžã¥ã¢ã«é¢è«ãåŸ
ã¡ããŠãããŸãð herp.careers findy-code.io findy-code.io
ããã«ã¡ã¯ããšã³ãžãã¢ã®äœè€( @t0m0h1r0x )ã§ãã ä»åã¯ãåŒç€Ÿã§çŸåšé²ããŠãã Emotion ãã CSS Modules ãžã®ç§»è¡ã«ã€ããŠç޹ä»ããŸãã ç§»è¡ã®èæ¯ãæ€èšãã代æ¿ã©ã€ãã©ãªããããŠæçµçãªæ±ºå®ã«ã€ããŠè©±ããŠãããŸãã ç§»è¡ã®æ€èšçç± ä»£æ¿ã©ã€ãã©ãªã®æ€èš Panda CSS Pigment CSS CSS Modulesãžã®ç§»è¡ ä»åŸã®å±æ ãŸãšã ç§»è¡ã®æ€èšçç± åŒç€Ÿã§ã¯çŸåšãCSS-in-JSã©ã€ãã©ãªãšããŠEmotionã䜿çšããŠããŸãããã¥ã¢ãªCSSèšæ³ã奜ãã¡ã³ããŒãå€ãã®ã§ãEmotionã®Tagged Template Literalèšæ³ãããŒã æåãšã®çžæ§ãè¯ãããããŸã§æŽ»çšããŠããŸããã äžæ¹ã§ãããã³ããšã³ãéçºãã¬ãŒã ã¯ãŒã¯ã« Next.js ãæ¡çšããŠããããã¡ãã§ã¯App Routerãžã®ç§»è¡ãé²ããŠããŸãã App Routerã®ã¡ãªããã¯ãã¯ãReact Server ComponentsïŒRSCïŒã®æŽ»çšã ãšæããŸããRSCã¯ãŠãŒã¶ãŒäœéšãšéçºè
äœéšã®åäžã«ã€ãªããéèŠãªæ©èœã§ããã2024幎9æçŸåšããã®ä»æ§äžEmotionã§RSCãã¹ã¿ã€ãªã³ã°ã§ããŸããã ãã®ãããªèæ¯ãããRSCã«å¯Ÿå¿ã§ããæ°ããªCSSã©ã€ãã©ãªã®æ€èšãå§ããŸããã 代æ¿ã©ã€ãã©ãªã®æ€èš 代æ¿ã©ã€ãã©ãªã®éžå®ã«ããã£ãŠã¯ãããã©ãŒãã³ã¹ãAPIã®äœ¿ãåæãšãã£ãèŠçŽ ã倧åã§ãããããŒã ãšã®çžæ§ãéèŠãªèŠä»¶ãšããŸãããç¹ã«ãTagged Template LiteralããµããŒãããŠããŠãEmotionãšã®æžãå¿å°ã«äºææ§ãããããšããã€ã³ããšããŸããã Panda CSS Panda CSS 㯠Chakra UI ã®ããŒã ãéçºããŠããŸããCSSã®èšæ³ãšããŠObject LiteralãTagged Template Literalãéžæã§ããŸãããåŸè
ã«ã¯æ©èœå¶éãããããã§ãã 詳现ã«ã€ããŠã¯ å
¬åŒããã¥ã¡ã³ã ãåç
§ããŠãã ããã Pigment CSS Pigment CSS 㯠Material UI ã®ããŒã ãéçºããŠããŸãã ãã¡ããèŠä»¶ãšåèŽããããªã®ã§ãããéçºåææ®µéã®ãããããã¯ã·ã§ã³å©çšã«ã¯æ€èšãå¿
èŠã§ãã ã¡ãªã¿ã«Pigment CSSã¯ãæè¿ãªãªãŒã¹ãããMaterial UI v6ã«ãexperimentalãªopt-inãšããŠçµã¿èŸŒãŸããŸããããããªãéçºãæåŸ
ã§ãããã§ãã CSS Modulesãžã®ç§»è¡ äžèšã®æ€èšãèžãŸããåŒç€Ÿã§ã¯äžæçã«ä¿¡é Œãšå®çžŸãããCSS Modulesãžã®ç§»è¡ã決å®ããŸããããã®çç±ã¯æ¬¡ã®éãã§ãã ãããã¯ããšããŒã ã®èŠä»¶ã«åèŽ ä»ã©ã€ãã©ãªãžã®å°æ¥çãªç§»è¡ãæ¯èŒç容æ äžæ¹ã§CSS Modulesã®æ¡çšã«ããã£ãŠã¯ãç¹ã«æ¬¡ã®ç¹ã«çæããŠããŸãã TypeScriptã«ããåå®çŸ© åçã¹ã¿ã€ãªã³ã°ã®å®è£
仿§ãã¡ã³ããã³ã¹ã¢ãŒã åå®çŸ©ã«ã¯ Happy CSS Modules ã䜿çšããŠãèªåçæããããšã§å¯Ÿå¿ããŠããŸãã åçã¹ã¿ã€ãªã³ã°ã«ã€ããŠã¯ãã³ãŒãäžã«propsããŒã¹ã®ã¹ã¿ã€ãªã³ã°å®è£
ãå€ããªãã£ãããšããã³ã³ããŒãã³ãã®ã«ãŒã«ãæŽåããŠããããšã§äžèŠãªcomponent targetingãäºãæžãããŠãããããçŸæç¹ã§ã¯å€§ããªæ¯éã¯åºãŠããŸããã 仿§ã«ã€ããŠã¯ã¡ã³ããã³ã¹ã¢ãŒãã§ãããã®ã®ãé·ãããã®ç¶æ
ãç¶ããŠããªããä»ã®æå€§ããªåé¡ã¯èµ·ããŠããªãããå®å®ããŠããã®ã§ã¯ãªãããšæã£ãŠããŸãã åè: Future of CSS Modules · Issue #187 · css-modules/css-modules · GitHub Interoperability across tools and support plain JS modules imports · Issue #1050 · webpack-contrib/css-loader · GitHub ä»åŸã®å±æ CSSãåãå·»ãç°å¢ã¯æ¥ã
é²åããŠããŸããäŸãã°ãReact v19ããã¯<style>ã®ãã€ã¹ãã£ã³ã°ããµããŒããããäºå®ã§ããããããæŽ»ããã RESTYLE ãšããã©ã€ãã©ãªãç»å ŽããŠããŸãã ãã®ãããªç¶æ³ãèžãŸããåœé¢ã¯CSS Modulesãžã®ç§»è¡ãé²ãã€ã€ãæ°ããªã©ã€ãã©ãªã®ç»å Žã«ã泚ç®ããŠãããããšæããŸãã ãŸãšã EmotionããCSS Modulesãžã®ç§»è¡ã¯ãåŒç€Ÿã®ããã³ããšã³ãéçºç°å¢ã倧ããå€ããéèŠãªåãçµã¿ã§ããã RSCãšã®äºææ§ãšãã課é¡ã¯ãããŸããããæ«å®çãªè§£æ±ºçãèŠã€ãã€ã€ãããè¯ãéžæè¢ã暡玢ãç¶ããŠãããããšæããŸãã åŒç€Ÿã§ã¯äžç·ã«åããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯æ¯éãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ã¯ããã« Findyã§ããŒã¿ãšã³ãžãã¢ãšããŠåããŠããéïŒ hiracky16 ïŒã§ãã ãã®èšäºã§ã¯Google Cloudã®è£œåã§ããCloud DLPãäžå¿ã«åŒç€Ÿã§åãçµãã§ããããŒã¿ãã¹ãã³ã°ã«ã€ããŠç޹ä»ããŸãã åŒç€Ÿã¯FindyãFindy Freelanceãªã©äººæã«é¢ããäºæ¥ãåãæ±ã£ãŠããããå人ããŒã¿ãããéãŸããããç°å¢ã«ãããŸãã ãã¡ã€ã³ãã£ã®çµç¹ãæ¥ã
æ¡å€§ããµãŒãã¹æ¡åŒµããŠããäžã§ãå©çšè
ã®å®å
šæ§ãæ
ä¿ããããŒã¿ã«ããããªã¹ã¯ãäœãããããã®ããŒã¿åºç€ã¥ãããæ±ããããŠããŸããã ããŒã¿åºç€ã«ã¯äºæ¥éšã®ããŒã¿ãéçŽããŠãããããå©çšè
ã«ãã¹ãŠãå
¬éããŠããŸããšéçšã誀ããæãã¬äºæ
ã«ã€ãªããå¯èœæ§ãäžãããŸãã ãã ãé²èЧã§ããªããšå°ãæ¥åããããããŒã¿ã®é²èŠ§æš©éãçµããããŠããªã¹ã¯ããããŸãã ä»åã¯ãå人ããŒã¿ãªã©ã®ã»ã³ã·ãã£ããªããŒã¿ãèªåã§æ€åºã»ãã¹ãã³ã°ãè¡ããæ¥åã«å¿
èŠãªå Žåã«ã®ã¿é²èЧã§ããç¶æ
ã«ããåãçµã¿ã«ã€ããŠã玹ä»ããŸãã æš©éåšãã®åºæ¬èšèš ãã¹ãã³ã°ã®åã«æš©éåšãã®åºæ¬èšèšã説æããŸãã ããŒã¿ã»ããã«ã¯ã¬ã€ã€ãŒãèšããŠãããããããæ¬¡ã®ããã«ãªã£ãŠããŸãã source ... ããŒããŒã¿ãå
¥ã£ãŠããããŒãã« staging ... ããŒããŒã¿ãBigQueryçšã«å å·¥ããããŒãã« intermediate ... CTEãªã©ã®ããŒãã« mart ... å©çšçšéããšã«çšæããããŒãã« ãŸãã¯ããŒã¿åºç€ãå©çšããã«ãããçšéããšã«ããŒã«ãå®çŸ©ããããšèããŸããã çšé以å€ã®ããšãã§ããŠããŸããšèª€æäœã«ãã£ãŠããŒã¿ãæžãæããããæ¶ããŠããŸã£ããããããããããããã§ãã ããŒã¿ã®çšéã¯å€§ãã3ã€ã«åããããšãã§ããç¹å®ã®ããŒã¿ã宿çã«èŠãããšãBigQueryã³ã³ãœãŒã«ãDataformã§èªåã®ã»ããããŒã¿ãäœãããšãå€éšããŒã«ã«ããŒã¿ã飿ºããããšã«ãªããŸãã ãããã®å©çšçšéããšã«æš©éãä»äžããããã®ããŒã«ãäœããŸããã ãŸã1ãŠãŒã¶ãŒããšã«ããŒã«ãä»äžããã®ã¯å€§å€ãªã®ã§ãGoogleã°ã«ãŒããçšæããããããä»äžããŠããŸãã ããããããšã§ã°ã«ãŒããžã®è¿œå ã»åé€ã«ããããŒã«ã®ç®¡çãæ¯èŒçç°¡åãªæäœã§å¯èœã«ãªããŸãã æŽã«ããŒã¿ããŒãã«çžåœããããŒã¿ã»ããã¯çšéããšã«äœãGoogleã°ã«ãŒãã®ã¡ãŒã«ã¢ãã¬ã¹ãããŒã¿ã»ããã®IAMã¡ã³ããŒãšããŠè¿œå ããŠãããŸãã ããŒã« ã§ããããš Google Cloudãããžã§ã¯ãäžã®IAMããŒã« 察å¿ããGoogleã°ã«ãŒã 管çè
å
šãŠã®ããŒã¿ã»ããã«å¯ŸããŠç·šé ãããžã§ã¯ãã¬ãã«ã®ãªãŒã㌠- ç·šéè
source以å€ã®ããŒã¿ã»ãããžã®ç·šéããŸãDataformãªã©ã®åšèŸºãµãŒãã¹ã®å©çš ãããžã§ã¯ãã¬ãã«ã®ãBigQueryãŠãŒã¶ãŒããšãBigQueryããŒã¿ç·šéè
ã editor ïŒåããŒã¿ã»ããã®ïŒé²èЧè
ç¹å®ã® mart_ ã§å§ãŸãããŒã¿ã»ããã®é²èЧ ãããžã§ã¯ãã¬ãã«ã®ãBigQueryãŠãŒã¶ãŒããšããŒã¿ã»ããã¬ãã«ã®ãBigQueryããŒã¿é²èЧè
ã mart_sales, mart_external_system äžèšã®ããã«ããŒã¿ã»ããããšã«IAMããŒã«ãä»äžããããã®Terraform Moduleãå
¬éããŠããã®ã§ããã£ããã䜿ããã ããã registry.terraform.io ããªã·ãŒã¿ã°ã«ããåçãã¹ãã³ã° åºæ¬çã«å人ããŒã¿ã¯sourceããstagingãžã®äŒæ¬æã«ã»ã³ã·ãã£ããªããŒã¿ãçããŠããŸãã ãŸãäžèšã®éãæš©éãçµããŠããã®ã§äžèŠåé¡ãªãããã«èŠããŸããã mart ããŒã¿ã»ããã®äžã«ã¯æ¥åã·ã¹ãã ã«äœ¿ããã®ãããå人ããŒã¿ãå«ãŸããŸãã ãããã£ãããŒã¿ãã°ã«ãŒãã«å±ããå
šå¡ãé²èЧã§ããç¶æ
ãšããã®ã¯æãŸãããããŸããã ãã®ãããªå Žåã«ã¯ãã«ã©ã ã¬ãã«ã§ããªã·ãŒã¿ã°ãä»äžããèš±å¯ããããŠãŒã¶ãŒã«ã¯éåžžã®ããŒã¿ããèš±å¯ãããŠããªããŠãŒã¶ãŒã«ã¯ãã¹ãã³ã°ãããããŒã¿ã衚瀺ãããŠããŸãã ã¿ã°ã®ä»äžã¯Dataformã®configã§è¡ã£ãŠããŸãã æ¬¡ã®ããã«æžããšããŒãã«ãäœãããéã«ã¿ã°ãä»äžããŠãããŸãã config { type: "table", "schema": "stg_hoge", "description": "ãŠãŒã¶ãŒããŒãã«", "columns": { "id": "ãŠãŒã¶ãŒã®ID", "email": { description: "ã¡ãŒã«ã¢ãã¬ã¹", bigqueryPolicyTags: ["projects/project-hoge/locations/asia-northeast1/taxonomies/fuga/policyTags/piyo"] }, "tel": { description: "é»è©±çªå·", bigqueryPolicyTags: ["projects/project-hoge/locations/asia-northeast1/taxonomies/fuga/policyTags/piyo"] } }, } ... ãã¹ãã³ã°ã®ã«ãŒã«ããããããªãã®ããããŸãã ãªãä»åã¯è©ŠããŠããŸããããBigQuery UDFãã«ãŒã«ã«è¿œå ã§ããŸãã cloud.google.com åçãã¹ãã³ã°ã®æ¹æ³ã¯ããããŸããã ãã ãå人ããŒã¿ã«å¯ŸããŠææ§ãªçè§£ã®ãŸãŸéçšããŠããŸããšä»äžå¿ãããä»äžããããŠæ
å ±éãèœã¡ãŠããŸããããããããŸãã ããã§åœ¹ç«ã€ã®ãCloud DLPã§ãã Cloud DLPã«ããå人ããŒã¿æ€åº Cloud DLPïŒData Loss PreventionïŒã¯ãæ©å¯æ§ã®é«ãããŒã¿ãæ€åºãåé¡ãä¿è·ããããã«èšèšãããGoogle Cloudã®ãµãŒãã¹ã§ãã Cloud DLPã«ã¯BigQueryã®ããŒã¿ãã¹ãã£ã³ããŠå人ããŒã¿ã«è©²åœããããŒãã«ãã«ã©ã ãæ€åºããŠãããæ©èœãåãã£ãŠããŸãã ãã®æ€åºã宿çã«å®è¡ããããšã«ããããªã·ãŒã¿ã°ãä»äžããåè£ãšãªãã«ã©ã ãç¹å®ã§ããŸãã ããŒãã«ã¯ãµã³ãã«ã§ãããæ€æ»ãããšããŒã¿ãªã¹ã¯ãäžçšåºŠãé«ã®ã«ã©ã ã«å人ããŒã¿ãå«ãŸããŠããããªããšãäžç®ã§ãããããã«ãªããŸãã 以äžã¯å
¬åŒããã¥ã¡ã³ãã«èŒã£ãŠããã€ã¡ãŒãžã«ãªããŸãã cloud.google.com DLP APIãçšããŠããã¹ãå
ã®æ
å ±ããã¹ãã³ã° ããªã·ãŒã¿ã°ã䜿ã£ããã¹ãã³ã°ã¯å€å
šäœããã¹ã¯ããŠããŸããŸããããã³ã°ããã¹ãã®å Žåäžéšã ããã¹ã¯ããããšãã£ãããŒãºãååšããŸãã äŸãã°ãååã¬ãã¥ãŒã®ããã¹ãããŒã¿ãããžãã¬å€å®ãããå Žåãããã¹ãå
šãŠããã¹ã¯ããŠããŸããšããžãã¬å€å®ã«äœ¿ãæ
å ±ãèœã¡ãŠããŸããŸãã DLP APIã䜿ããšããã¹ãäžã®å人æ
å ±ããã¹ã¯ã§ããŸãã DLP APIã«ãããã¹ã¯ã®æé ã¯ãå人ããŒã¿ã®æ€åºããšãããŒã¿ã®å¿ååãã®2ã¹ãããããããŸãã ãå人ããŒã¿ã®æ€åºãã§ã¯äºåã«çšæãããæ€åºåšïŒINFO TYPEïŒãäœ¿ãæ€åºã§ããŸãã INFO TYPEã¯ç¹å®ãããæ
å ±ãäŸãã°ååãé»è©±çªå·ãäœæãªã©æ
å ±ã®çš®é¡ããšã«éããŸãã INFO TYPEã¯GCSã«çœ®ããèŸæžããèªäœã§ããåºæåè©ã«ã察å¿ã§ããŸãã äžèšãäºåã«çšæãããINFO TYPEã®ãªãã¡ã¬ã³ã¹ã§ãã cloud.google.com ãããŒã¿ã®å¿ååãã¯æ€åºããINFO TYPEããšã«ã©ã®ããã«æ
å ±ããã¹ã¯ããããå®çŸ©ããŸãã DLP APIã«ã¯Python Clientãããã®ã§ãããCloud Runã«ãããã€ããŠBigQueryãããªã¢ãŒã颿°ã§åŒã³åºããããã«ããŠããŸãã declare text string; set text = """ ç§ã¯å±±ç°å€ªéã§ãã æ¬æ¥ã¯ãããããé¡ãããŸãã å±±ç° 090-0000-0000 tensyoku.taro@gmail.com """; select text, `function_dataset.dlp_api`(text) as masked_text; ãŸãšã Cloud DLPã®æ©èœã䜿ãããšã§ãã¹ãã³ã°ããè¡ããŸãšããŠã¿ãŸããã ããŒã¿å©æŽ»çšãå¢ããããšã¯åã°ããããšã§ãããåžžã«ããŒã¿ã®æ±ããæ°ã«ããªããããŒã¿æœåºãåæããã®ã«ãéçããããŸãã ãããããããŒã¿ãšã³ãžãã¢ãšããŠå®å
šã«æææ±ºå®ããµããŒãããããŒã¿åºç€ãäœã£ãŠãããããšæã£ãŠããŸãã åŒç€Ÿã§ã¯ããŒã¿åºç€ãå
±ã«è²ãŠãŠããã¡ã³ããŒãåéããŠããŸããå°ãã§ãèå³ãæ¹§ããæ¹ã¯ã«ãžã¥ã¢ã«é¢è«ãåŸ
ã¡ããŠãããŸãð herp.careers herp.careers
Findyã§ãšã³ãžãã¢ãããŠããæ æ²¢ïŒ@nipe0324ïŒã§ãã ä»åã¯ãFindyã®åç©äŒç»ã§ããã ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2024äžéçºè¡š ãã®è£åŽãå
¬éããŸããè£åŽãç¥ãããã£ã³ããŒã³ãããæ¥œããã§ãããããå¬ããã§ãã ãã£ã³ããŒã³æéäžã«Xã§ã·ã§ã¢åŸã«ãã©ãŒã ããå¿åããããšã§ãAnkerå
é»åšïŒFindyãªãªãžãã«ãã¶ã€ã³å
¥ãïŒããæœéžã§åœããããïŒïŒ ãã²ãç³ã蟌ã¿ãã ããã ððð ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2024äžéçºè¡šã詊ããŠã¿ã ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒãšã¯ ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®è£åŽ è£åŽâ ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®ã©ã³ãã³ã°è¡šç€º è£åŽâ¡ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®OGP衚瀺 ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã楜ããã§ãã ãã ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒãšã¯ ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒãšã¯ãFindyã®åç©äŒç»ã®1ã€ã§ãã 1幎éã®GitHubã®ã³ã³ããªãã¥ãŒã·ã§ã³æ°ãFindyãŠãŒã¶ãŒå
ã§ã®ã©ã³ãã³ã°ãèŠãªããéçºææãæ¯ãè¿ãæééå®ã®ã€ãã³ãã§ãã ã³ã³ããªãã¥ãŒã·ã§ã³æ°ãèŠãããšã§ãèªåãæ¥ã
ã©ã®ãããGitHubã§éçºããŠããããç¥ãããšãã§ããŸãã ã³ã³ããªãã¥ãŒã·ã§ã³æ°ãã©ã³ãã³ã°ãèŠãã«ã¯Findyäžã§èªåã®GitHubã¢ã«ãŠã³ãã飿ºããŠããå¿
èŠããããŸãããããŸã GitHubã飿ºããŠãªãæ¹ã¯ ãã¡ã ãã飿ºããŠã¿ãŠãã ããã éå»5åã»ã©éå¬ããŠãããå€ãã®æ¹ã«æ¥œããã§é ããŸããã éå»ã®ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ å®éã«Xã®ã·ã§ã¢ã§ã¯æ¬¡ã®ãããªå£°ããããéçºã®æ¯ãè¿ããšããŠæ¥œããã§é ããããã§ãã ããšããããã°ã£ã ãyshrsmzããã®2023å¹Žã®æ¯ãè¿ãã 2023幎ã«GitHubã§4,341ã³ã³ããªãã¥ãŒãããæéã®æå€§ã¯462(4æ)ãäžæ¥ãããã®å¹³åã¯13/æ¥ã§ããã ããªããä»å¹Žã®GitHubã§ã®æŽ»åããã§ãã¯ãããïŒ https://t.co/4saXCthnEV #ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2023 — ããŒã(CodingFeline) (@_yshrsmz) 2023幎12æ20æ¥ èã¯ãããããªãã£ãã®ãæãã ãmogmetããã®2023å¹Žã®æ¯ãè¿ãã 2023幎ã«GitHubã§4,715ã³ã³ããªãã¥ãŒãããæéã®æå€§ã¯663(2æ)ãäžæ¥ãããã®å¹³åã¯13/æ¥ã§ããã ããªããä»å¹Žã®GitHubã§ã®æŽ»åããã§ãã¯ãããïŒ https://t.co/MzvBGuMw8k #ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2023 — ãããã£ãšâïžITã€ãããŒã¿ãŒ (@mogmet) 2023幎12æ21æ¥ ä»åã¯ã ã ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2024äžéçºè¡š ã ãšããããšã§ã2024幎ã®1æãã6æã®ã³ã³ããªãã¥ãŒã·ã§ã³æ°ãšã©ã³ãã³ã°ãæ¯ãè¿ãããšãã§ããŸãã ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®è£åŽ ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®äž»èŠãªæ©èœã«ã€ããŠ2ã€ç޹ä»ããŸãã è£åŽâ ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®ã©ã³ãã³ã°è¡šç€º è£åŽâ¡ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®OGP衚瀺 è£åŽâ ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®ã©ã³ãã³ã°è¡šç€º ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã§ã¯ãFindyãŠãŒã¶ãŒå
ã§ãæéå
ã®ã³ã³ããªãã¥ãŒã·ã§ã³æ°ã®ã©ã³ãã³ã°ãã衚瀺ããŠããŸããïŒã©ã³ãã³ã°ã®æ°åã¯äžäœã®æ¹ã®ã¿è¡šç€ºïŒ ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®ã©ã³ãã³ã°è¡šç€ºïŒâ»ããŒã¿ã¯ãµã³ãã«ã§ãïŒ å®è£
ã«ããããSQLã§ã©ã³ãã³ã°è¡šç€ºãå®çŸãããšãã¯ãšãªãè€éã«ãªãããã©ãŒãã³ã¹ãåºãã«ãããšããåé¡ããããŸããã ãã®ãããRedisã® ZREVRANK ãæ¡çšããŸããã ZREVRANKã¯ãœãŒãæžã¿ã»ããã®ã¹ã³ã¢ãé«ããã®ããäœããã®ã«äžŠã¹ãŠããŒã¿ãååŸå¯èœã§ã次ã®ãããªåœ¢ã§ã·ã³ãã«ã«ã©ã³ãã³ã°è¡šç€ºãå®è£
ã§ããŸãã # ã©ã³ãã³ã°ã®ååŸåŠçã€ã¡ãŒãž def contribution_ranking # zrevrankã䜿ã£ãŠã©ã³ãã³ã°ãååŸ ranking = redis.zrevrank(store_key, user.id) return nil if ranking.nil? # zrevrank ã¯0å§ãŸãã§é äœãè¿ãã®ã§ã1ãè¶³ããŠ1äœããã®é äœã«ãã ranking + 1 end ãã®ããã«ãRedisã®æ©èœãããŸãå©çšããããšã§ãã·ã³ãã«ãªå®è£
ã§ãã©ã³ãã³ã°ã®å€ãé«éã«ååŸããŠããŸãã è£åŽâ¡ïŒã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã®OGP衚瀺 ãŸããã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã§ã¯ãXã§ã·ã§ã¢ããŠããã£ããšãã«OGPç»åã衚瀺ããŠããŸãã Xã®ãã¹ãæã®OGP衚瀺ïŒâ»ããŒã¿ã¯ãµã³ãã«ã§ãïŒ Xã®ãã¹ãäžã§OGPç»åãåçã«çæããæµãã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã Xäžã§OGPç»åãåçã«çæããã·ãŒã±ã³ã¹å³ XããFrontendïŒNext.jsïŒããªã¯ãšã¹ããåããŠãNext.jsã®ãµãŒããŒãµã€ãã¬ã³ããªã³ã°ïŒSSRïŒã®æ©èœã䜿ã£ãŠOGPç»åã®URLãè¿ã OGPç»åã®çæã¯ãå
補ã®OGPç»åçæãµãŒãã¹ãå©çšããŠãAPIã®åçããŒã¿ãã€ãã£ãŠãŠãŒã¶ãŒã«å¿ããOGPç»åãçæããŠãã ã¡ãªã¿ã«ãå
補ã®OGPç»åçæãµãŒãã¹ã¯ãFindyå
ã§OGPç»åãçæãããã€ã¯ããµãŒãã¹ãçšæããŠããã仿©èœã®ã¹ãã«åå·®å€ããã¿ãããªã©ã®OGPç»åãçæããããã«ã䜿ãããŠããç¹åŸŽçãªãµãŒãã¹ã§ãã ãŸããä»åŸã®æè¡çãªåãçµã¿ãšããŠNext.jsã®App RouterãæŽ»çšããããšã§ãOGPç»åã®çæãNext.jsäžã§å®çŸã§ããªãããææ¡ããŠããŸãð€ ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒã楜ããã§ãã ãã çŸåšããã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2024äžéçºè¡šããæééå®ã§éå¬ãããŠããŸãã ãã²ã2024幎äžåæã®ã³ã³ããªãã¥ãŒã·ã§ã³æ°ãæ¯ãè¿ã£ãŠã2024幎åŸåã®ã¢ãããŒã·ã§ã³ã«ã€ãªããŠãããããšå¬ããã§ãã ãã£ã³ããŒã³æéäžã«Xã§ã·ã§ã¢åŸã«ãã©ãŒã ããå¿åããããšã§ãAnkerå
é»åšïŒFindyãªãªãžãã«ãã¶ã€ã³å
¥ãïŒããæœéžã§åœãããããããŸããïŒ ððð ã³ã³ããªãã¥ãŒã·ã§ã³ã»ãªãã»ã¶ã»ã€ã€ãŒ2024äžéçºè¡šã詊ããŠã¿ã
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã åŒç€Ÿã§ã¯é éå°ãã«ãªã¢ãŒãã§åããŠããã¡ã³ããŒã倿°ãããåã¯åæµ·éããåã¯çŠå²¡ãŸã§ãå
šåœåå°ã«ç¹åšããŠããŸãã æ¬ç€Ÿã¯æ±äº¬ã«ãã£ãŠé¢æ±åšäœã®ãšã³ãžãã¢ã倿°ãããé éå°ãã«ãªã¢ãŒãã®äººæ°ã®æ¯çã§èšããšåã
ãããã§ããããã å®ãèšããšãåŒç€Ÿã®ãã«ã¿ã€ã å€åã§ã®ãšã³ãžãã¢ã®é éå°ãã«ãªã¢ãŒãå€åã®ç¬¬äžå·ã¯ç§ãªã®ã§ãã 2020幎7æã«JOINããŠããïŒå¹Žä»¥äžããã£ãšçŠå²¡ããé éå°ãã«ãªã¢ãŒãã§åããŠããŸããã第äžå·ã®ç§ãçµæãåºãããšã§ãåºç€Ÿã»ãã«ãªã¢ãŒãé¢ä¿ãªãææãåºãããããšæã£ãŠãããããã«ãåœåã¯æ¬åœã«é 匵ããŸããïœ çµæãšããŠåŒç€Ÿã§ã¯ãããã€ã¹ãã«ãªãšã³ãžãã¢ã§ããã°ãã«ãªã¢ãŒãã§ãåé¡ãªãããšããèªèã«ãªããé éå°ãã«ãªã¢ãŒãã§åããšã³ãžãã¢ãå¢ããŠãããŸããã ããã§ä»åã¯ãç§ããã«ãªã¢ãŒãå€åãããäžã§å¿ãããŠããããšãå
¬éããããšæããŸãã ããã§ã¯èŠãŠãããŸãããïŒ å¿ãããŠãããšãªã¹ã ãšããããèªåã®timesã«ãªããæžã ããããªãããšãäžæããã£ãããšã¯å
šåã§ã¢ããŒã«ãã ã¡ã³ã·ã§ã³ã«ã¯æåªå
ã§åå¿ãã ããã¹ããšé話ã®äœ¿ãåã ãšã¯ããåºç€Ÿã倧äºã ããïŒ ãŸãšã å¿ãããŠãããšãªã¹ã ãšããããèªåã®timesã«ãªããæžã åŒç€Ÿã§ã¯ãšã³ãžãã¢ãäžå¿ã«Slackã§èªåèªèº«ã®timesãã£ã³ãã«ãæã€ããã«ããŠããŸãã timesãã£ã³ãã«ã¯äžè¬çã«äœ¿ãããŠããéçšæ¹æ³ã§ããããéå§ããŸãããçµäºããŸããã ãã®æžã蟌ã¿ã«ãªã£ãŠããŸã£ãŠãã人ã¯ããŸãããïŒ ãã®timesãã£ã³ãã«ã®äœ¿ãæ¹ãšããã®ãéèŠã§ã ãšããããèªåã®timesã«ãªããæžã ãšããããšãå¿ãããŠããŸãã ã€ã¶ããå
容ã¯äœã§ãããã§ããç¡èšããã¯æ°äžåãã·ã§ãã ãã«ãªã¢ãŒãå€åã ãšåºç€Ÿã¡ã³ããŒã®é¡ããä»ã®ãã«ãªã¢ãŒãã¡ã³ããŒå士ã®é¡ãèŠããªãã®ã§ããäºãã«ååšæãåºãããšãéèŠã§ãã ãã®ãããèªåèªèº«ã«å²ãåœãŠãããtimesãã£ã³ãã«ã§å¥œããªããã«ã€ã¶ããããšãããã«ãªã¢ãŒãå€åã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã®1ã€ã®åœ¢ã ãšæã£ãŠããŸãã äœæ¥ãã°çã«èªåã®äœæ¥ãtimesã«èšé²ããããšããªã¹ã¹ã¡ã§ããäœæ¥éäžã«è©°ãŸã£ãæãªã©ã«ãtimesãèŠãŠãããä»ã®ã¡ã³ããŒãå©ãèãåºããŠãããããšããããŸãã timesãç¡èšãªã®ã¯ãã¡ãŒãã¿ã€ã ããããªãããšãäžæããã£ãããšã¯å
šåã§ã¢ããŒã«ãã èªåãäœã«å°ã£ãŠãã®ããäœã«èŠããã§ããã®ãã¯ãèªåããçºä¿¡ããŸãã å
ã»ã©ç޹ä»ããèªåã®timesãã£ã³ãã«ã«æžããŠãããã§ãããããããçŽæ¥ã¡ã³ã·ã§ã³ããŠèª°ãã«å©ããæ±ããã®ãããã§ãããã äœæ¥ã«è©°ãŸã£ãŠïŒäººã§ãã£ãšæ©ãã§çµæçã«1æ¥æœ°ããŸãããã¯ãªãã£ã¹åºç€Ÿã§ãããã§ããããã«ãªã¢ãŒãå€åã«ãããŠã¯ç¹ã«ä¿¡é Œã倧ãã倱ã£ãŠããŸããŸãã ããããªãããšã ããããªããŠã解決ããããšãäžæããã£ãããšã¯ç¹ã«å
šåã§ã¢ããŒã«ããŸãã å¬ããããšã¯åœ¢ã«æ®ã£ãã»ããããã®ã§ãtimesã«ã¬ã³ã¬ã³æžã蟌ã¿ãŸãã åšãã®ã¿ããªãå
šåã§ç¥çŠããŸãããã ããããªãããšãäžæããã£ãããšãšãã£ããããªäœæ¥ã®é²æã«é¢ããçºä¿¡ã¯éœåºŠè¡ãããã«ããŠããŸãã ã¡ã³ã·ã§ã³ã«ã¯æåªå
ã§åå¿ãã äœãããã®äœæ¥ãããŠããŠããèªåãžã®ã¡ã³ã·ã§ã³ãåªå
ããŠãã§ãã¯ããŸãã ä»ã®äœæ¥ã«éäžããããªãããããšã§ç¢ºèªãããæšãçžæã«äŒãããããªã¢ã¯ã·ã§ã³ã¢ã€ã³ã³ãä»ããŸãã ãã¡ã³ã·ã§ã³éã£ãã®ã«åå¿ãäœããªãããšããããšã¯ãçžæããããããç¡èŠãããŠããã®ããå¿ãããŠèŠããŠãªããã®ããåãããŸããã ãŸãã¯ãããªãã®ã¡ã³ã·ã§ã³ãèŠãŠãŸããããšããããšãäŒããŸãã ããã¹ããšé話ã®äœ¿ãåã ããã¹ããé話ã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ãé©åã«äœ¿ãåããããšãå¿ãããŠããŸãã ããã¹ãã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã ãã§ã¯ã©ããããã§å¿
ãéçãããŸãããããã¹ãã«ãåœ¢ã«æ®ããéåæã§ã³ãã¥ãã±ãŒã·ã§ã³ã§ãããšãã£ãã¡ãªããããããŸãã ããã¯èª°ãçžæã§ããèªåãã©ãã»ã©ããã¹ãã³ãã¥ãã±ãŒã·ã§ã³ãäžæããšæã£ãŠãŠããå¿
ãéçããããŸãã ããããäŒãã£ãŠãªããªãšå¯ããããèªèãäžèŽããŠããªããšæãããããã«ãZoomã§ç¹ãã§é話ãããŸãã ãã®éãè°äºé²çãªãã®ãæžããŠå¯Ÿé¢ã§è©±ããå
容ã®ãµããªãè°äºé²ãšããŠåœ¢ã«æ®ããŸãããã®è°äºé²ãåŸã§çžæã«éããèªèãåã£ãŠããã©ããã確èªããŸãã è°äºé²ã¯å¿
èŠãããã°ä»ã¡ã³ããŒãèŠããå Žæã«ãå
±æããŸããããããããšã§äœã®è©±ãããŠããã®ããäœã§å°ã£ãŠããã®ããä»ã®ã¡ã³ããŒãææ¡ã§ããããã«ãªããŸãã ãŸããããã¹ãã¯åŸã
ãŸã§åœ¢ã«æ®ãã®ã§ãçžæãžã®æè¬ãç§°è³ã¯ããã¹ãããªã¢ã¯ã·ã§ã³ã§éããŸãã éã«æèãå£é ã§äŒããã»ãããã話ããã¬ãã£ããªè©±ã¯å¯Ÿé¢ã§ãããã«ãZoomã䜿ããŸããèªåãèšåãããŠããã®ãä»ã®äººã«èŠãããããåŸã
ãŸã§åœ¢ã«æ®ãã®ã¯è¯ãæ°åã§ã¯ãªãã§ãã ããšèªåã®å Žåã¯ãäžå®æã«èªåã®timesãã£ã³ãã«ã®ããã«ãéããŠéè«ãããããè¶äŒããéããŠããŸãã ãªãã話ããããéè«ããããçžè«ãããããšããããªã©ãåæ©ã¯äœã§ãOKã§ãããšã³ãžãã¢ä»¥å€ã®è·çš®ã®åãåå ããŠãããããšããããŸãã ãšã¯ããåºç€Ÿã倧äºã ããïŒ ãããŸã§ãã«ãªã¢ãŒãå€åã§ã®è©±ãæžããŠããŸãããããã¯ãåºç€ŸããŠã®å¯Ÿé¢ã³ãã¥ãã±ãŒã·ã§ã³ã«åããã®ã¯ãããŸããã é éå°ãã«ãªã¢ãŒãã§å€åããŠãããšããŠãã1å¹Žã«æ°åã¯åºç€ŸããŠå¯Ÿé¢ã³ãã¥ãã±ãŒã·ã§ã³ãåãããã«ããŠããŸãã èªåã®å Žåã¯4ã¶æã«1åçšåºŠãè²»çšã¯äŒç€Ÿæã¡ã§1é±éçšåºŠåºç€ŸããŠããŸãã ãã®æéã¯èªåã®äœæ¥ãããåºç€Ÿã¡ã³ããŒãšã®å¯Ÿé¢ã³ãã¥ãã±ãŒã·ã§ã³ãéèŠããŠããŸãã ãã®æéã§ã®å¯Ÿé¢ã³ãã¥ãã±ãŒã·ã§ã³ã«ãããåž°å®
åŸã®ãäºãã®ã³ãã¥ãã±ãŒã·ã§ã³ã®ããŒãã«ãäžãããçµæçã«ææçéãã¹ã ãŒãºã«ãªããŸãã ãŸãšã ãããã§ããã§ããããïŒ ä»åã®èšäºãããã«ãªã¢ãŒãå€åã§ã®æ©ã¿äºã«å°ãã§ã圹ã«ç«ãŠãã°å¹žãã§ãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã 2024幎ã®2ææ«ã«åŒç€Ÿããã¯ããã°ãéèšããŠããå幎ãéããããšããŠããŸãã ä»å¹Žã¯äžåæã ãã§31åã®èšäºãæçš¿ããŠãããããã¯ããã°ãéèšããŠãã6æãã£ã±ããŸã§ã§é±ã«1~2èšäºã®ããŒã¹ã§æçš¿ã§ããŠããŸãã ãŸãç·PVæ°ã¯10äžPVãã¯ãŠãæ°ã¯1200ãè¶
ããå€ãã®æ¹ã«èªãã§ããã ããŠããããã§ãããã€ãããããšãããããŸãïŒ ã€ãã³ãã§ãäŒãããæ¹ããåŒç€Ÿã«å¿åããŠããã ã颿¥ã§ãäŒãããæ¹ããããããã¯ããã°èªãã§ãŸãïŒããšèšã£ãŠããã ããããšãå¢ããŠããŠãããæ¹ããŠæè¡åºå ±ã®éèŠæ§ãæããŠããŸãã ããã§ä»åã¯ã2024幎äžåæã®åŒç€Ÿããã¯ããã°ã®æ¯ãè¿ããšç§°ããŸããŠã2024幎äžåæã®äººæ°èšäºéã玹ä»ããŸãã ããã§ã¯èŠãŠãããŸãããïŒ 2024幎äžåæã®äººæ°èšäº ããšã³ãžãã¢ã®æ¥åžžããšã³ãžãã¢éã®èªæ
¢ã®äœæ¥ç°å¢ã倧å
¬éã·ãªãŒãº éçºçç£æ§ææšãåäžãããããã«ãã£ãŠã¯ãããªãã¢ã³ããã¿ãŒã³ éçºçç£æ§ãäžããããã«éçºãããåã«èããŠããããš Findyã®çééçºãæ¯ãããã¯ãã㯠Findyã®çééçºãæ¯ãããã·ã¹ãã ãå®ããã¹ãã³ãŒããã®å®äŸ3éž Wallaby.jsã䜿ã£ãŠããã³ããšã³ãéçºã®ãã¹ããå¹çåããã ãã¡ã€ã³ãã£ã«ãšã³ãžãã¢ãšããŠå
¥ç€ŸããŠãããªãšæã£ãããš3éž ãŸãšã 2024幎äžåæã®äººæ°èšäº ããšã³ãžãã¢ã®æ¥åžžããšã³ãžãã¢éã®èªæ
¢ã®äœæ¥ç°å¢ã倧å
¬éã·ãªãŒãº tech.findy.co.jp åŒç€Ÿããã¯ããã°ã®æåã®ã¿ãŒãã³ã°ãã€ã³ããšãªã£ãèšäºã§ãããããããã®ã·ãªãŒãºãåºãŠããªãã£ãããç·PVæ°ã10äžãè¶
ããããšã¯ãªãã£ãã§ãããã 2ææ«ã«ããã¯ããã°ãéèšããŠãã1ã¶æçšåºŠãçµã£ãé ã«Part1ãå
¬éãããæ³å®ä»¥äžã®åé¿ããã£ããããPart2ãPart3ãšç¶ããŠã·ãªãŒãºåããã人æ°ã·ãªãŒãºã®1ã€ã§ãã ããšããšããã¯ããã°ãéèšããçç±ã®1ã€ã«ããšã³ãžãã¢æ¡çšã匷åããããšããçãããããŸããã æ¡çšã匷åããäžã§æè¡çãªçºä¿¡ã¯éèŠã§ããããããšåããããæåã®çºä¿¡ãéèŠã ãšèããŠããããŸãã¯ã©ããªãšã³ãžãã¢éãåããŠããã®ããç¥ã£ãŠããããããšããæããããã®ã·ãªãŒãºãäŒç»ããŸããã ãããããŸã§å€ãã®æ¹ã«èªãã§ããã ããäžåæã®PVæ°ã®3å²ã¯ãã®ã·ãªãŒãºãå ããŠããŸãã å
容ãšããŸããŠã¯ãåŒç€Ÿãšã³ãžãã¢ãã¡ã®èªå®
ã§ã®äœæ¥ç°å¢ãåçä»ãã§ç޹ä»ããŠãããã¬ãžã§ãããããŒããŒãããã¹ã¯åšãã®ã¢ã€ãã ãªã©ã玹ä»ãããŠããŸãã ã¡ãªã¿ã«èšäºã®ã¿ã€ãã«ã§ãããã¿ã€ãã«ãèããã®ã«è¡ãè©°ãŸã£ãç§ãChatGPTã«ã¿ã€ãã«æ¡ãããã€ãçæããŠãããããã®äžããéžãã ãã®ã§ãïœ ãããçæAIã£ãŠäŸ¿å©ã§ããïŒ éçºçç£æ§ææšãåäžãããããã«ãã£ãŠã¯ãããªãã¢ã³ããã¿ãŒã³ tech.findy.co.jp èšäºåäœã®PVæ°ãšããŠã¯äžåæ1äœã®èšäºã§ãã éçºçç£æ§ãåäžããããã«ãã£ãã»ããããããšã¯å€ãã®èšäºãçºä¿¡ããŠããŸããããã¡ãã¯ãã®éã§ã¢ã³ããã¿ãŒã³ã玹ä»ããŠããŸãã äžèŠãããããªã®åœããåããããšæããããããŸãããããã®åœããåããã¡ããšæèšããããšã«äŸ¡å€ããããšæããŸãã ãã£ãŠã¯ãããªãããšãçç±ä»ãã§ãã¡ããšèª¬æã§ãããããããæ£ããæ¹æ³ãçè§£ãå®è¡ã§ããã®ã§ãã éçºçç£æ§ã«èå³é¢å¿ãããæ¹ã«ã¯æ¯éäžèªããŠããã ãããèšäºãšãªã£ãŠããŸãã éçºçç£æ§ãäžããããã«éçºãããåã«èããŠããããš tech.findy.co.jp èšäºåäœã®ã¯ãŠãæ°ãšããŠã¯äžåæ1äœã®èšäºã§ãã ãã¡ããéçºçç£æ§ã«é¢ããèšäºã§ãå®éã«ã³ãŒããæžãåã«ããã¹ãããšãæºåããããšãèããããšã玹ä»ããŠããŸãã ããã«éããã·ã³ãã«ã«ãå¹çãããªãªãŒã¹ããŠãŠãŒã¶ãŒã«äŸ¡å€æäŸããããããšããèŠç¹ã§æžãããŠãããéçºã«ãããŠéèŠãªãã€ã³ãããŸãšããããŠããŸãã Findyã®çééçºãæ¯ãããã¯ãã㯠tech.findy.co.jp åŒç€Ÿã¯éçºçç£æ§ããšãããéçºã¹ããŒãã«ã¯éåžžã«æã£ãŠããŸãã ãã®éçºã¹ããŒããç¶ç¶ããæŽã«éãããããã«åŒç€Ÿã§å®è·µããŠãããã¯ããã¯ãããã€ã玹ä»ããŠããã®ããã®èšäºã§ãã ã¿ã¹ã¯ã®åè§£ã®ä»æ¹ãPull requestã®ç²åºŠããã¹ãã³ãŒãã®èãæ¹ãªã©ãã·ã³ãã«ã«ãŸãšããŠããèšäºãšãªã£ãŠããŸãã éçºçç£æ§ã®åäžã«çæããããã©äœããçæãããããã®ãããããªãããšããæ¹ã«ã¯æ¯éèªãã§ããã ãããèšäºã§ãã Findyã®çééçºãæ¯ãããã·ã¹ãã ãå®ããã¹ãã³ãŒããã®å®äŸ3éž tech.findy.co.jp å
ã»ã©ç޹ä»ãããFindyã®çééçºãæ¯ãããã¯ããã¯ãã®èšäºã§ç޹ä»ãããã¹ãã³ãŒãã«é¢ããå
å®¹ãæŽã«æãäžããèšäºãšãªã£ãŠããŸãã å®éã®ãã¹ãã³ãŒãã亀ããŠãå
·äœçã«ã©ã®ãããªãã¹ãã³ãŒãã§ã·ã¹ãã ãå®ãã®ãã説æããŠããŸãã å®éã«èªãã§ã¿ããšãæãèœã¡ãŠããèŠç¹ãªã©ãããããšæããŸãã®ã§ããžã¥ãã¢ãšã³ãžãã¢ã®æ¹ã«ãã·ãã¢ãšã³ãžãã¢ã®æ¹ã«ãæ¯é1床èªãã§ããã ãããèšäºã§ãã Wallaby.jsã䜿ã£ãŠããã³ããšã³ãéçºã®ãã¹ããå¹çåããã tech.findy.co.jp Wallaby.jsã¯ããã³ããšã³ãéçºã«ãããŠéåžžã«äŸ¿å©ãªããŒã«ã§ãã 倿°ã®IDEã«å¯Ÿå¿ããŠãããã»ãŒãªã¢ã«ã¿ã€ã ã«ä¿®æ£å
容ãåæ ãã€ã€ãã¹ãã³ãŒãã®å®è¡çµæã衚瀺ããŠããŸãã ãã®èšäºã§ã¯ãWallaby.jsã®äœ¿ãæ¹ãèšå®æ¹æ³ãå®éã«ã©ã®ããã«æŽ»çšããŠãããã玹ä»ããŠããŸãã ããã³ããšã³ãã®ãã¹ãã³ãŒããæžãã®ãèŠæã ã£ããããã¹ãã³ãŒãããã£ãšå¹ççã«æžãããïŒãšæã£ãŠãæ¹ã«ãªã¹ã¹ã¡ã®èšäºã§ãã ãã¡ã€ã³ãã£ã«ãšã³ãžãã¢ãšããŠå
¥ç€ŸããŠãããªãšæã£ãããš3éž tech.findy.co.jp å®éã«åŒç€Ÿã«JOINããŠããããšã³ãžãã¢ããå
¥ç€ŸããŠ1ã¶æçšåºŠçµã£ãŠããæããããšããŸãšããèšäºã§ãã JOINçŽåŸã®ãšã³ãžãã¢ãåŒç€Ÿã®éçºç°å¢ãã©ã®ããã«æããŠããã®ããã©ã®ãããªç¹ãè¯ãã£ãã®ããªã©ãé·å¹ŽåŒç€Ÿã«åšç±ããŠããèªåããã¯æ°ã¥ããªãèŠç¹ããããŸããã åŒç€Ÿã«èå³ãæã£ãŠãããŠããæ¹ã«ã¯æ¯éèªãã§ããã ãããèšäºãšãªã£ãŠãŸãã ãŸãšã ãããã§ããã§ããããïŒ ããã§ã¯ç޹ä»ããããªãã£ãèšäºã倿°ãããŸãã®ã§ãããããæ¯éèªãã§ã¿ãŠãã ããã å
šäœçã«èŠãŠãéçºçç£æ§ãããã³ããšã³ãé¢é£ã®èšäºã«å¯ŸããŠã®åé¿ã倧ããã£ãããã«æããŸãã äžåæãåŒãç¶ãããããã®ãã¬ã³ãã远ãã€ã€ãæè¡çãªææŠãç¶ãã瀟å
ã®æåãé°å²æ°ãªã©ãå«ããŠããã¯ããã°ãéããŠçºä¿¡ã§ããã°ãšæããŸãã ä»åŸãšãåŒç€Ÿããã¯ããã°ããããããé¡ãããŸãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ãã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§ããã³ããšã³ãã®ãªãŒããããŠãããŸã æ°çŠ( @puku0x )ã§ãã ãã®èšäºã§ã¯ããã¡ã€ã³ãã£ã§å°å
¥ããŠããã¢ãã¬ã管çããŒã«ã Nx ãã«ã€ããŠç޹ä»ããŸãã ã¢ãã¬ããšã¯ Nxãšã¯ Nxã¯ãŒã¯ã¹ããŒã¹ã®äœæ Nxã®æ©èœ ã³ãŒãçæ å€æŽæ€ç¥ äŸåé¢ä¿ã®ç®¡ç ãã£ãã·ã¥æ©æ§ èªåãã€ã°ã¬ãŒã·ã§ã³ ãŸãšã ã¢ãã¬ããšã¯ ã¢ãã¬ãã¯å
šãŠã®ã³ãŒãããŒã¹ãåäžã®ãªããžããªã§ç®¡çããææ³ã§ãã monorepo.tools ã³ãŒãã®å
±éåãå¯èŠåãããŒã«ã»ã©ã€ãã©ãªã®æšæºåãäžè²«æ§ã®ããCI/CDãã€ãã©ã€ã³ãæ§ç¯ã§ãããšãã£ãã¡ãªããããããŸãããŸãããã€ã¯ããµãŒãã¹ãšçžæ§ãè¯ããšãèšãããŠããŸãã circleci.com ãã¡ã€ã³ãã£ã§ã¯äž»ã«ããã³ããšã³ãç³»ã®ãªããžããªãã¢ãã¬ããšããŠéçšããŠããŸãã ã¢ããªã±ãŒã·ã§ã³ãšããã«é¢é£ãããã£ãŒãã£ãŒãUIã©ã€ãã©ãªãã²ãšã€ã«ãŸãšãŸã£ãŠãããããè€æ°ã®ãªããžããªãç§»åããããšãªãã³ãŒããåç
§ã§ããŸãã Nxãšã¯ Nx ã¯ã¢ãã¬ã管çãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãããã¹ãã®å®è¡ãã³ãŒãçæãªã©ã®æ©èœãåããçµ±åçãªããŒã«ã§ãã nx.dev ã¢ãã¬ã管çããŒã«ã¯ä»ã«ã Lerna ã Turborepo ãªã©ããããŸããã¢ããªã±ãŒã·ã§ã³éçºã«ãããŠæçšãªæ©èœãå€ãããããšããã³ãã¥ããã£ã掻çºã§ç¶ç¶çãªã¡ã³ããã³ã¹ãèŠèŸŒããããšãåè·ã§å°å
¥å®çžŸããã£ãããšãªã©ãNxãéžãã çç±ã§ãã åŸè¿°ããã倿޿€ç¥ããããã£ãã·ã¥æ©æ§ããšãã£ãæ©èœã¯ãPull Requestã®ç²åºŠã现ãããããã¡ã€ã³ãã£ã®éçºã¹ã¿ã€ã«ãšé«ãèŠªåæ§ããããå°å
¥åœåããç§éã®éçºãæ¯ããé ŒãããããŒã«ãšãªã£ãŠããŸãã 倧æäŒæ¥ã§ãæ¡çšäºäŸãå¢ããŠãããNxã¯ã¢ãã¬ã管çããŒã«ãšããŠæåãªéžæè¢ãšãããã§ãããã https://npmtrends.com/lerna-vs-nx-vs-turbo ïŒå人çã«æšããŠããOSSããããŸã§æåã«ãªã£ãããšã«ã¯ææ
šæ·±ããã®ããããŸããïŒïŒ Nxã¯ãŒã¯ã¹ããŒã¹ã®äœæ create-nx-workspace ãå®è¡ãããšã¯ãŒã¯ã¹ããŒã¹ãäœæã§ããŸãã Reactãã¯ãããã¡ãžã£ãŒãªãã¬ãŒã ã¯ãŒã¯çšã®ããªã»ãããããããããã«éçºãå§ããããŸãã npx create-nx-workspace@latest <ã¯ãŒã¯ã¹ããŒã¹å> --preset=react-monorepo --appName=<ã¢ããªã±ãŒã·ã§ã³å> --bundler=webpack --e2eTestRunner=playwright --style=scss --nxCloud=skip 詳现ã¯å
¬åŒã®ãã¥ãŒããªã¢ã«ããã²ã芧ãã ããã nx.dev Nxã®æ©èœ ã³ãŒãçæ nx generate ã³ãã³ãã§ãããžã§ã¯ãïŒã¢ããªã±ãŒã·ã§ã³ãã©ã€ãã©ãªïŒãäœæã§ããŸãã npx nx generate @nx/react:application --name=<ã¢ããªã±ãŒã·ã§ã³å> --directory=<ãã£ã¬ã¯ããª> --routing=false --e2eTestRunner=playwright --projectNameAndRootFormat=as-provided npx nx generate @nx/react:library --name=<ã©ã€ãã©ãªå> --directory=<ãã£ã¬ã¯ããª> --bundler=rollup --unitTestRunner=jest --projectNameAndRootFormat=as-provided nx generate ã§å®è¡ã§ããGeneratorã¯èªåã§äœãããšãã§ããŸãã nx.dev ãã¡ã€ã³ãã£ã§ã¯ãã£ãŒãã£ãŒçšã®ãã¡ã€ã«äžåŒãçæããGeneratorãäœã£ãŠéçºãå¹çåããŠããããŒã ããããŸãããŸãå¥ã®æ©äŒã«ç޹ä»ã§ããã°ãšæããŸãã 倿޿€ç¥ Nxã¯ãããžã§ã¯ãéã®äŸåé¢ä¿ãèªåçã«ç®åºããæ©èœãåããŠããŸãã npx nx affected --graph ãå®è¡ãããšæ¬¡ã®ããã«äŸåé¢ä¿ãå¯èŠåã§ããŸãã npx nx affected --target=build ã®ããã«æå®ãããšã倿Žã®ãã£ããããžã§ã¯ããšããã«äŸåããä»ã®ãããžã§ã¯ããå
šãŠãã«ãããŠãããŸãã nx affected ã¯å€æŽãããã³ãŒãã«é¢ãããããžã§ã¯ãã®ã¿å®è¡ãã å人çãªããããã¯ãnpm-scriptsãCIäžã§å®è¡ããã³ãã³ãã nx affected ããŒã¹ã«ããããšã§ãã "scripts": { "build": "nx affected --target=build", "test": "nx affected --target=test", "lint": "nx affected --target=lint", ... }, å¿
èŠãªã¿ã¹ã¯ã®ã¿å®è¡ãããããã¹ããŒãã£ãŒã«éçºã§ããŸãã äŸåé¢ä¿ã®ç®¡ç Nxãæã€ãããžã§ã¯ãéã®äŸåé¢ä¿ã¯Lintã«ãŒã«ã«ãå¿çšãããŸãã ãã¡ã€ã³ãã£ã§ã¯ã @nx/enforce-module-boundaries ã«ãŒã«ãé©çšããæå³ããªãäŸåé¢ä¿ã®é転ãèµ·ãããªãããã«å¶åŸ¡ããŠããŸãã nx.dev å
·äœçã«ã¯ãåãããžã§ã¯ãã«æ¬¡ã®ãããªã¿ã°ãèšå®ãã { " name ": " utils ", " sourceRoot ": " libs/utils/src ", " projectType ": " library ", " tags ": [ " scope:shared ", " type:util " ] , ... } - apps/ - app1 (scope:app1) - app2 (scope:app2) - libs/ - app1/ - feature-dashboard (scope:app1, type:feature) - ui (scope:app1, type:ui) - app2/ - feature-user (scope:app2, type:feature) - ui (scope:app2, type:ui) - utils (scope:shared, type:util) .eslintrc.json ã«å¯Ÿå¿ããã«ãŒã«ãèšå®ããŠããŸãã " @nx/enforce-module-boundaries ": [ " error ", { " allow ": [] , " depConstraints ": [ { " sourceTag ": " scope:shared ", " onlyDependOnLibsWithTags ": [ " scope:shared " ] } , { " sourceTag ": " scope:app1 ", " onlyDependOnLibsWithTags ": [ " scope:shared ", " scope:app1 " ] } , { " sourceTag ": " scope:app2 ", " onlyDependOnLibsWithTags ": [ " scope:shared ", " scope:app2 " ] } , { " sourceTag ": " type:feature ", " onlyDependOnLibsWithTags ": [ " type:ui ", " type:util " ] } , { " sourceTag ": " type:ui ", " onlyDependOnLibsWithTags ": [ " type:ui ", " type:util " ] } , { " sourceTag ": " type:util ", " onlyDependOnLibsWithTags ": [ " type:util " ] } ] } ] èšå®ããã«ãŒã«ãå³ã«ãããšãã®ããã«ãªããŸãã scope ããããžã§ã¯ãéã®äŸåé¢ä¿ã type ãå
éšã®ã¬ã€ã€ãŒã®äŸåé¢ä¿ã衚ããŸãã @nx/enforce-module-boundaries ã«ãŒã«ãèšå®ããããããžã§ã¯ãã§ã¯äŸåããŠã¯ãããªãã¢ãžã¥ãŒã«ã«å¯ŸããŠãšã©ãŒã衚瀺ãããŸãã å€§èŠæš¡ãªã³ãŒãããŒã¹ã®ç®¡çã«ãããŠã¯ãã¢ãžã¥ãŒã«å士ã®äŸåé¢ä¿ã®å¶åŸ¡ãéåžžã«éèŠã§ããããããã£ããããããšããã«æãå±ããæ©èœãæã£ãŠããããšãNxã®é
åã§ããããŸãã ãã£ãã·ã¥æ©æ§ Nxã¯äžåºŠå®è¡ãããã³ãã³ãã®ãã£ãã·ã¥ãä¿æããŠãããåãã³ãã³ããå®è¡ãããå Žåã«ãã£ãã·ã¥ããçµæãåçŸããæ©èœãæã£ãŠããŸãã nx.dev ãŸããé¢é£ãµãŒãã¹ã§ããã Nx Cloud ãã®ãªã¢ãŒããã£ãã·ã¥æ©èœãæå¹ã«ãããšå€§å¹
ãªCIé«éåãå¯èœã§ãã å®éã«ãã¡ã€ã³ãã£ã§ã¯ããã£ãã·ã¥ã®æŽ»çšã§æ¯æ1,000æé以äžã®CIæéãåæžã§ããŸããã èªåãã€ã°ã¬ãŒã·ã§ã³ Nxã«ã¯ Codemod ã Angular CLI ã® ng update ãšäŒŒãã³ãã³ããåãã£ãŠããŸãã nx.dev npx nx migrate latest npx nx migrate --run-migrations nx migrate ãå®è¡ãããšãNxæ¬äœãšåçš®ãã©ã°ã€ã³ã react ã eslint ã typescript ãªã©ã®äŸåã©ã€ãã©ãªã»ããŒã«ããŸãšããŠæŽæ°ãããŸãã ããŒãžã§ã³ã¢ããã«äŒŽããã€ã°ã¬ãŒã·ã§ã³ã¯æåã§å¯Ÿå¿ãããšå€§å€ã§ãããNxã§ã¯èªååãããŠããŸããã¡ã³ããã³ã¹ã®æéãçãããšåæã«å±äººåãæããããããéå®ããŠããŸãã ãŸãšã ãã®èšäºã§ã¯ãNxã®æŠèŠãšåºæ¬çãªæ©èœã«ã€ããŠç޹ä»ããŸããã Nxã¯åãªãã¢ãã¬ã管çããŒã«ã«çãŸããããéçºè
äœéšã®æ¹åãããéçºçç£æ§ã®åäžããšãã£ãããã³ã·ã£ã«ãç§ããŠããŸãã âšâšâš Nxã¯ãããïŒ âšâšâš Nxã¯ãããããããããäŒãããããšã¯ä»¥äžã§ãã ããè©³çŽ°ãªæŽ»çšæ³ãNx Cloudã®é«åºŠãªæ©èœã«ã€ããŠã¯ãä»åŸã®èšäºã§åãäžããäºå®ã§ãã®ã§ãæåŸ
ãã ããã ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã çªç¶ã§ããçããã¯ãéçºãããããã§æ¬ ãããªãããŒã«ãOSSã¯ãããŸããïŒ ããŒããŒããããŠã¹ããã€ã¯ãšãã£ãç©ççãªããŒã«ã¯æºãèŠãã°ããããŸãããä»ã®ãšã³ãžãã¢ãã©ããã£ãããŒã«ã䜿ã£ãŠå¹çåããŠãããã¯ããã®äººã®ç»é¢ãèŠãªããšããããŸããã ãã®ãããä»ã®ãšã³ãžãã¢ãã©ããã£ãããŒã«ã䜿ã£ãŠå¹çåããŠããã®ããå®ã¯æå€ãšç¥ããªããšããããšãå€ãã®ã§ã¯ãªãã§ããããïŒ ããã§ä»å㯠æšãããŒã«çŽ¹ä» ãšé¡ããŠãåŒç€Ÿãšã³ãžãã¢éãæ¥ã
ã®éçºæ¥åã§æçšããŠããããŒã«ãOSSã玹ä»ããŠãããŸãã ããã§ã¯èŠãŠãããŸãããïŒ æšãããŒã«çŽ¹ä» æžç° git-cz git-cz-for-api-developer æ°çŠ Nx vscode-spell-checker 森 Rectangle Hammerspoon Vimium ãŸãšã æšãããŒã«çŽ¹ä» æžç° git-cz ãŸã玹ä»ãããã®ãgit-czãšããããŒã«ã§ãã github.com ãã®ããŒã«ã¯npmã®ããã±ãŒãžã§ãã¹ãããã«æ²¿ã£ãŠéžæãå
¥åãè¡ãããšã§ã³ãããã¡ãã»ãŒãžã®ãã©ãŒããããçµ±äžããããšãå¯èœã«ãªããŸãã ããã±ãŒãžãã€ã³ã¹ããŒã«ããŠã³ãã³ããå®è¡ãããšãcliã§æ¬¡ã®ãããªåºåã衚瀺ãããŸãã hoge@fuga Piyo % npx git-cz cz-cli@4.3.0, @commitlint/cz-commitlint@19.2.0 ? Select the type of change that you're committing: (Use arrow keys) ⯠feat: A new feature fix: A bug fix docs: Documentation only changes style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc) refactor: A code change that neither fixes a bug nor adds a feature perf: A code change that improves performance test: Adding missing tests or correcting existing tests ããã§ã³ãããã®çš®é¡ãéžæããŸãã æ©èœè¿œå ããã°fixãããã¥ã¡ã³ãä¿®æ£ãªã©ã®éžæè¢ãéžã³ããã®åŸã«ã³ãããã¡ãã»ãŒãžãå
¥åãããšãèªåçã«ã³ãããã¡ãã»ãŒãžãäœæãããŸãã éžæè¢ã ãã§ã¯ãªããã³ãããã¡ãã»ãŒãžã®å
容ãå
¥åããã¹ãããããããå
šéšã®ã¹ããããéããšèªåçã«ã³ãããã¡ãã»ãŒãžãäœæããã³ããããå®è¡ããŸãã hoge@fuga Piyo % npx git-cz cz-cli@4.3.0, @commitlint/cz-commitlint@19.2.0 ? Select the type of change that you're committing: docs ? What is the scope of this change? (See README for more details; e.g. project name): piyo ? Write a short, imperative tense description of the change: (max 188 chars) (13) update readme ? Provide a longer description of the change (press enter to skip): ? Are there any breaking changes?: No ? Does this change affect any open issues?: No â Preparing lint-staged... â Running tasks for staged files... â Applying modifications from tasks... â Cleaning up temporary files... [test-git-cz aaaaaaa] docs(piyo): update readme 1 file changed, 1 insertion(+), 1 deletion(-) åŒç€Ÿã§ã¯åãªããžããªã«å°å
¥ããŠãããã³ãããæã«å®è¡ããããšã§ã³ãããã¡ãã»ãŒãžã®ãã©ãŒãããã®çµ±äžãè¡ã£ãŠããŸãã ãã©ãŒããããçµ±äžãããŠããããããªãªãŒã¹æã®ãªãªãŒã¹ããŒããèªåçæãããããªãªãŒã¹å
容ã®åé¡ãèªåã§è¡ã£ããããããšã容æã«ãªããŸãã git-cz-for-api-developer git-czãForkããŠãAPIéçºè
åãã«ã«ã¹ã¿ãã€ãºãããã®ããããŸãã github.com ãã£ã¡ã®ããŒã«ãå©çšããŠã³ãããã¡ãã»ãŒãžãäœæããããšã§ãSemanticVersionã«å¯Ÿå¿ããã³ãããã¡ãã»ãŒãžãäœæã§ããŸãã hoge@fuga Piyo % npx git-cz-api ? Select the release type of change that you're committing: patch: patch update ? Select the type of change that you're committing: âïž docs: Documentation only changes ? Write a short, imperative mood description of the change: [-------------------------------------------------------------] 49 chars left patch-docs: update readme ? Provide a longer description of the change: fix hoge fuga ? List any breaking changes BREAKING CHANGE: ? Issues this commit closes: [git-cz-test aaaaaaaaa] patch-docs: âïž update readme 1 file changed, 1 insertion(+), 1 deletion(-) hoge@fuga Piyo % git log commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (HEAD -> git-cz-test) Author: test <example@gmail.com> Date: Wed Jun 26 17:27:10 2024 +0900 patch-docs: âïž update readme fix hoge fuga åŒç€Ÿã§ã¯APIãæäŸããŠãããªããžããªã§å°å
¥ããŠããŸãã ã³ãããã¡ãã»ãŒãžã®ãã©ãŒããããçµ±äžãããŠãããããSemanticVersionã«å¯Ÿå¿ãããªãªãŒã¹ããŒããèªåã§äœæããmajor updateãããå Žåã«äžç®ã§ãããããã«ä»çµã¿åããŠããŸãã èå³ãããæ¹ã¯æ¯é詊ããŠã¿ãŠãã ããã æ°çŠ ããã³ããšã³ãTech Leadã®æ°çŠ( @puku0x )ã§ãã奜ããªããŒã«ãçºè¡šããŸãã Nx äžçªã¯äœãšèšã£ãŠããNxãã§ãã瀟å
ã®ããã³ããšã³ãç³»ã®ãªããžããªã®ã»ãŒå
šãŠã«å°å
¥ããŸãããNxã®ã³ã¢æ©èœèªäœã¯ãã¬ãŒã ã¯ãŒã¯éäŸåã§ãããããããã¯ãšã³ãç³»ã®ãªããžããªã«å°å
¥ãããæ¥ãããé ããªãã§ãããã github.com å
ã
ã¯åè·ã§CRAã«ä»£ããããŒã«ãæ¢ããŠããããšããã£ããã§è§Šããããã«ãªããŸãããä»ã§ã¯CIé«éåã«æ¬ ãããªãååšãšãªã£ãŠããŸããNxã¯ãããã äœè«ã§ãããNxã§äœæãããããžã§ã¯ãã«ã¯ãVS Codeæ¡åŒµãšããŠãvscode-jest-runnerããæšå¥šãããŠããŸãã github.com ãã¡ã€ã«åäœã§ãã¹ããå®è¡ã§ããã®ã§ãWallaby.jsãšåããããéå®ããŠããŸãã Wallaby.jsãã©ã®ããã«æŽ»çšããŠãããæ°ã«ãªã£ãæ¹ã¯ãã¡ãã®èšäºãã芧ãã ããã tech.findy.co.jp vscode-spell-checker VS Codeæ¡åŒµã«ã€ããŠã¯ä»ã«ããvscode-spell-checkerãããªã¹ã¹ã¡ã§ããã¿ã€ãã®æ€åºã«äžåœ¹è²·ã£ãŠãããŸãã github.com èšå®ã倿Žããã°ãããããè±åèªã®ä»ã«ãæè¡çšèªãåºæåè©ãªã©ããã§ãã¯ã§ããŸããäŒæ¥åããµãŒãã¹åãç»é²ããŠããã°æ©ã段éã§ãã¹ã«æ°ä»ãããã䟿å©ã§ãã { " version ": " 0.2 ", " language ": " en ", " ignorePaths ": [] , " dictionaries ": [ " en_US ", " project-words ", " softwareTerms ", " misc ", " companies ", " typescript ", " node ", " html ", " css ", " bash ", " npm ", " powershell " ] , " dictionaryDefinitions ": [ { " name ": " project-words ", " path ": " ./.cspell-project-words.txt ", " description ": " Project Words Dictionary ", " addWords ": true } ] } çŽè¿ã®PRã§ã®ã¿ã€ãã«å¿åœããã®ããæ¹ã¯ãã²å°å
¥ããŸãããã æ£® 2024幎6æã«å
¥ç€ŸããŸããæ£® @jiskanulo ã§ãã ã§ããã ãããŒããŒãããæãé¢ããã«äœæ¥ãç¶ããããšãã芳ç¹ã§ç§ãå©çšããŠããããŒã«ãã玹ä»ããŸãã Rectangle Rectangle ã¯ãŠã£ã³ããŠã®ç§»åããªãµã€ãºãããŒããŒãã·ã§ãŒãã«ããããã©ãã°ç§»åã§è¡ãããšãã§ããMacOSçšã®ã¢ããªã±ãŒã·ã§ã³ã§ãã æäœããŠãããŠã£ã³ããŠãã¢ãã¿ãŒå·Šååãå³ååã«ãªãµã€ãºãããæå€§åæå°åããããè€æ°ãã£ã¹ãã¬ã€ãæ¥ç¶ããŠããå Žåã«å¥ãã£ã¹ãã¬ã€ãžéãããšããããšãã§ããŸãã ç§ã®å Žåã¯æ¬¡ã®ããã«ã·ã§ãŒãã«ãããèšå®ããŠããŸãã ã·ã§ãŒãã«ãã ãµããŸã Ctrl + Shift + Alt + h ãŠã£ã³ããŠãã¢ãã¿ãŒå·Šååã«ãªãµã€ãº Ctrl + Shift + Alt + l ãŠã£ã³ããŠãã¢ãã¿ãŒå³ååã«ãªãµã€ãº Ctrl + Shift + Alt + j ãŠã£ã³ããŠãã¢ãã¿ãŒäžå€®ååã«ãªãµã€ãº Ctrl + Shift + Alt + s ãŠã£ã³ããŠãã¢ãã¿ãŒäžå€®ã«é
眮 Ctrl + Shift + Alt + k ãŠã£ã³ããŠãæå€§å Ctrl + Shift + Alt + â ãŠã£ã³ããŠãã¢ãã¿ãŒå·Šäžã«ãªãµã€ãº Ctrl + Shift + Alt + â ãŠã£ã³ããŠãã¢ãã¿ãŒå³äžã«ãªãµã€ãº Ctrl + Shift + Alt + â ãŠã£ã³ããŠãã¢ãã¿ãŒå·Šäžã«ãªãµã€ãº Ctrl + Shift + Alt + â ãŠã£ã³ããŠãã¢ãã¿ãŒå³äžã«ãªãµã€ãº Ctrl + Shift + Alt + n ãŠã£ã³ããŠã次ã®ãã£ã¹ãã¬ã€ã«ç§»åãã Ctrl + Shift + Alt + p ãŠã£ã³ããŠãåã®ãã£ã¹ãã¬ã€ã«ç§»åãã Hammerspoon Hammerspoon ã¯ããŒã«æäœãèªååããããã®MacOSçšã®ã¢ããªã±ãŒã·ã§ã³ã§ãã ããŒããŒãã·ã§ãŒãã«ããã®çµã¿åããã§ã¢ããªã±ãŒã·ã§ã³ãæäœãalertã®å®è¡ãªã©ãLuaãèšèŒããŠå®çŸ©ã§ããŸãã 䞻㫠ã¿ãŒããã« Alacritty ãšã¡ã¢ããŒã«ã® Obsidian ãèµ·åãæå°åãæå€§åããã·ã§ãŒãã«ãããç»é²ããŠããŸãã Gitã®æäœãã³ãã³ãå®è¡ããããšãã«Alacrittyãç»é¢æå€§åãã³ãã³ããå®è¡çµãããæå°åãã¡ã¢ãæ®ããŠããããããšãããã°Obsidianãèµ·åããŠã¡ã¢ãèšè¿°ãå
ã®äœæ¥ã«æ»ãããšããããã«äœ¿ã£ãŠããŸãã ã·ã§ãŒãã«ãã ãµããŸã Ctrl + Command + 6 Alacrittyãå
šç»é¢ã«è¡šç€ºãããäžåºŠæŒãããšã§æå°å Ctrl + Command + 7 Obsidianãå
šç»é¢ã«è¡šç€ºãããäžåºŠæŒãããšã§æå°å Vimium æåŸã« Vimium ã§ããããã¯ååã®éãã«Viã®ããŒãã€ã³ãã®ããã«ããŒããŒãã ãã§ãã©ãŠã¶ãæäœããGoogle Chromeæ¡åŒµæ©èœã§ãã ããŒãžäžã®ãªã³ã¯èŠçŽ ã衚瀺ããŠããŒå
¥åã§éãããã©ãŠã¶å±¥æŽã®æ»ãé²ããååŸã®ã¿ãã«è¡šç€ºãåãæ¿ãããããã¯ããŒã¯ãæ€çŽ¢ããŠã¿ããéããªã©ã®æäœãè¡ããŸãã ãã©ãŠã¶å±¥æŽã®æäœã¯æšæºã®ã·ã§ãŒãã«ããã§ãå¯èœãªã®ã§ãããVimiumã®èšå®ã§å³æã ãã§ç¡çãªãæäœãè¡ããããã«ããŠããã®ã§ã€ã³ã¿ãŒãããé²èЧãå¿«é©ã«ãªããŸãã ãšãã«ãªã³ã¯èŠçŽ ã®è¡šç€ºæ©èœã¯ããŠã¹ã«ãŒãœã«ã现ããæäœããã«ãªã³ã¯èŠçŽ ãéãããšãã§ããã®ã§éå®ããŠããŸãã ã·ã§ãŒãã«ãã ãµããŸã f ãªã³ã¯èŠçŽ ã®äžèЧã衚瀺ãããã«è¡šç€ºãããããŒãæŒããŠãªã³ã¯å
ã«é·ç§» Shift + f ãªã³ã¯èŠçŽ ã®äžèЧã衚瀺ãããã«è¡šç€ºãããããŒãæŒããŠãªã³ã¯å
ãå¥ã¿ãã§éã Shift + h ãã©ãŠã¶å±¥æŽãæ»ã Shift + l åã®ã¿ãã衚瀺ãã Shift + j 次ã®ã¿ãã衚瀺ãã Shift + k ãã©ãŠã¶å±¥æŽãé²ã ãŸãšã ãããã§ããã§ããããïŒ çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ã Findy Freelance ã®éçºãããŠããäžåªã§ãïŒ ãã®èšäºã¯ èªæ
¢ã®äœæ¥ç°å¢ã倧å
¬éã·ãªãŒãº ã® Part 5 ã«ãªããŸãã ä»åã¯ããããäœãå Žæãæ®æ®µæ
åœãããããã¯ããç°ãªã 3 åã®ãšã³ãžãã¢ã®äœæ¥ç°å¢ã玹ä»ããŸãïŒ äœæ¥ç°å¢ã倧å
¬é äžåª ãŸãã¯åå€å±ãããã«ãªã¢ãŒãã¯ãŒã¯ãããŠããäžåªã®äœæ¥ç°å¢ã§ãã ãã¹ã¯å
šäœã¯ãã®ããã«ãªã£ãŠããŸãã ãã¹ã¯ã¯ FlexiSpot EF1 ã䜿ã£ãŠããŸãã ãã¿ã³ 1 ã€ã§ãããããèšå®ããŠãããé«ãã«èªåã§æéããŠãããã®ã§ãæ°è»œã«ç«ã¡åº§ããç¹°ãè¿ãããšãã§ããŸãã ãã£ã¹ãã¬ã€ã¯ LG 35WN75C-B ã䜿ã£ãŠããŸãã ã·ã³ãã«ã«ç»é¢ãåºããŠäœæ¥ããããç¹ãšãã¹ã¯ã®ãµã€ãºã«ã¡ããã©ããåãŸã£ãŠããç¹ãæ°ã«å
¥ã£ãŠããŸãã æºã®äžãå·ŠåŽã«ã¯ãã¢ããŒãã¿ã€ããŒãš Amazon Echo Show ããããŸãã ãã®ãã¢ããŒãã¿ã€ããŒã¯æ¯ããšã«ãŠã³ãããŠã³ãéå§ãããŠã90 床åããšæ¢ãŸããŸãã ç¹ã«éäžããŠäœæ¥ãããã¿ã€ãã³ã°ã§äœ¿ããŸãããã®èšäºããã®ã¿ã€ããŒã䜿ã£ãŠæžããŠããŸãã Echo Show ã¯äž»ã«ãšã¢ã³ã³ãæäœããããã©ãžãªãããããããã®ã«äœ¿ã£ãŠããŸãã ãã¢ã¬ã¯ãµããšã¢ã³ã³ã®æž©åºŠ 25 床ã«ããŠããªã©ãšèšããšãã®éãã«èšå®ããŠãããã®ã§ããªã¢ã³ã³ã䜿ããã«æžãã®ã䟿å©ã§ãã ã©ãžãªã¯ radiko ã§ RaNi Music⪠ããããããŠããŸãã 鳿¥œã ãããã£ãšãããŠãããã®ããæ°ã«å
¥ããã€ã³ãã§ãã ãã¹ã¯ã®å³åŽã«ã¯ Anker 737 MagGo Charger ããããŸãã æ¯æ¥ iPhoneãAirPodsãApple Watch ã䜿ã£ãŠããã®ã§ãããããããã¹ãŠãå
é»ã§ããŸããã¯ã€ã€ã¬ã¹ã£ãŠäŸ¿å©ã§ããã ããŒããŒã㯠Keyball61 ãã¡ã€ã³ã§äœ¿ã£ãŠããŸãã èŠãç®ã®éãããã©ãã¯ããŒã«ä»ãã®åå²ããŒããŒãã§ãããŒã ããžã·ã§ã³ããå
šãæãåãããã«ããŠã¹æäœãã§ããããããšãŠãæ°ã«å
¥ã£ãŠããŸãã äžåºŠããã«æ
£ãããšãæ®éã®ããŒããŒãã«æ»ããªããšããæèŠããããŸãã æ
£ããŠããªãã¯ãã ä»ãã«èŠåŽããªããçµã¿ç«ãŠãã®ã§æçãæ¹§ããŠããŸãã ããŒã¹ã€ãã㯠Kailh Box Silent Pink ã䜿ã£ãŠããŸããæŒäžå§çŽ 35g ã§é©åºŠã«è»œããé鳿§ãé«ãã®ã§æ°ã«å
¥ã£ãŠããŸãã ãŸãæè¿ã torabo-tsuki(M) ãšããç¡ç·æ¥ç¶ã®ããŠã¹ããŒã«ä»ãåå²ããŒããŒããçµã¿ç«ãŠãŸããã ãŸã ãä»äºã§äœ¿ããã»ã©ããŒé
çœ®ãšæäœã«æ
£ããŠããªãã®ã§ããã©ã€ããŒãã§ç·Žç¿ããŠããæäžã§ãã 以äžãäžåªã®äœæ¥ç°å¢ç޹ä»ã§ããïŒ å¶æ Findy Team+ ã®ããã¯ãšã³ãéçºãæ
åœããŠããå¶æã§ãïŒ çŸåšã¯åºç€Ÿãšãªã¢ãŒãã¯ãŒã¯ã®ãã€ããªããã§å€åããŠãããäœæ¥ç°å¢ã¯ãã®ããã«ãªã£ãŠããŸãã Macbook ãããŒã PC ã¹ã¿ã³ãã«çœ®ããã¢ãã¿ 2 æãé
眮ããŠããŸãã ããããçšéãšããŠã¯ãMac ã Slack çšã暪眮ãã¢ãã¿ããšãã£ã¿çšã瞊眮ãã¢ãã¿ããã©ãŠãžã³ã°çšãšãã£ãæãã§ãã Mac ã¯ããŒã PC ã¹ã¿ã³ãã®äžã«ããããåºæ¬çã«äœçœ®ã¯åºå®ããŠããŸããã2 æã®ã¢ãã¿ã¯ããããã¢ãã¿ãŒã¢ãŒã ã§çžŠæšªã®åããäœçœ®ãªã©ã¯èªç±ã«åããã圢ã«ãªã£ãŠããŸãã äœçœ®ã®èª¿ç¯ãã¡ã€ã³ã®çšéã§ãããã¹ã¿ã³ããäžèŠã«ãªã£ãŠäžã®ã¹ããŒã¹ã空ãã®ã§ã¢ãã¿ãŒã¢ãŒã ã¯éå®ããŠããŸãã ããŠã¹ã¯ç¡ç·ã®ãã®ãå
黿¬¡ç¬¬ã§äº€æããªãã䜿ã£ãŠããŸãã å·Šã¯å®ãã§è²·ã£ãéé³ã®ããŠã¹ã§ãå°ããã¯ãªãã¯é³ãéããªã®ã§ãªãã£ã¹ãžæã¡èŸŒãã®ã«é©ããŠããŸãã å³ã¯ããžã¯ãŒã«ã® G Pro X Superlight ã§ããã®åã®éã軜ããŠæã¡ãããã§ãã ãŸããæ®æ®µ PC ã§ã²ãŒã ãããŠããããã倧ãããªããŠã¹ãããã䜿çšããŠããŸãã ããŒããŒã㯠HHKB Professional Type-S ã®ç¡å»å°ã¢ãã«ã䜿çšããŠããŸãã 7~8 幎䜿ã£ãŠããŠè²ãå°ã
æ±ãã®ã¯ã容赊ãã ããã 奥ã«èŠããã®ã¯ Realforce GX1 ã§ããã¹ã¯ããã PC çšéã§ãã éé»å®¹éç¡æ¥ç¹åŒã®æéµæãæ°ã«å
¥ã£ãŠããããã£ãš Realforce ã HHKB ãã¡ã€ã³ã§ãã ããšã¯å¥¥ã«ãã©ããšæ ã£ãŠããŸããããæ°Žãå
¥ããã ãã§äœ¿ããé¶åšã®å 湿åšã眮ããŠããŸãã å æ¹¿å¹æãšããŠã¯éåžžã®å 湿åšã«ã¯åã³ãŸãããã黿ºäžèŠã§æ°Žãå
¥ãæ¿ããã ãã§ããã®ãšãèŠãç®ãããããã®ã§æ°ã«å
¥ã£ãŠããŸãã 以äžãå¶æã®äœæ¥ç°å¢ã§ããïŒ æŸæ¬ Findy ã®ããã³ããšã³ãéçºãæ
åœããŠããæŸæ¬( @bennkyougirai )ã§ããæ®æ®µã¯çŠå²¡ãããªã¢ãŒãã¯ãŒã¯ãããŠããŸãããŸãç§ã®äœæ¥ç°å¢ã®å
šäœåã¯ãããªæãã§ãã ãã¹ã¯ã¯é»åæéåŒã§ã FlexiSpot ã®ãã¬ãŒã ã䜿ã£ãŠããŸãã ãã£ã¹ãã¬ã€ã¯ DELL ã® 4k ã¢ãã¿ã䜿ã£ãŠããŸããèªåã«ãšã£ãŠã¯å°ãåºãããã®ã§ã次åã¯ããå°ãå°ãããã®ãéžã³ããã§ãã ã¢ãã¿ãŒã«ã¯ã¢ãã¿ãŒã©ã€ã( Quntis ãã¹ã¯ã©ã€ã ã¢ãã¿ãŒã©ã€ã ããŒã©ã€ã )ãåãä»ããŠããŸããã³ã³ãã¯ãã§å Žæãåããªããããã§ããŠæãããååã§ããäŸ¡æ Œããæé ãªã®ãè¯ãã§ãã ããŒããŒã㯠Ultimate Hacking Keyboard ã®åå²ããŒããŒãã䜿ã£ãŠããŸããå·Šå³ã®ããŒããŒãã«ã¯ãªãã·ã§ã³ããŒããè£
çã§ããŠãå·Šã«ã¯ããŠã¹ã¯ãªãã¯ãã¿ã³ãå³ã«ã¯ãã©ãã¯ãããã远å ããŠããŸããããŒããŒãã®èšå®ã®èªç±åºŠãé«ããŠãã«ã¹ã¿ãã€ãºããããã®ãç¹åŸŽã§ãã ããŠã¹ã¯ MX Ergo ãš Apple Magic Trackpad ã䜿ã£ãŠããŸããã¡ã€ã³ã¯ MX Ergo ã䜿ã£ãŠããŠãApple Magic Trackpad ã¯ããŠã¹ãžã§ã¹ãã£ãŒã Miro ã®ãããªã¹ã¯ããŒã«æäœãå¿
èŠãªã¢ããªã§äœ¿çšããŠããŸãã æ¥åã§ã®é話ã«ã¯ã OpenComm ã䜿ã£ãŠããŸããé·æé䜿çšããŠãç²ãã¥ããçžæã«å±ãé³è³ªãè¯ãã®ã§æ°ã«å
¥ã£ãŠããŸããç§ã®äœ¿çšããŠããã®ã¯ 1 ã€å€ãåã§ãããææ°ã®ãã®ãè¯ããã®ãåºãŠããã®ã§èå³ãããæ¹ã¯æ¯éãã§ãã¯ããŠã¿ãŠãã ããã ãŸãšã ããŒããŒããªã©ãããããåæ§çã§ãã ãããæããããŸããïŒ å人çã«ã¯æŸæ¬ãããšå¶æããã®ããŒããŒããèŠãŠãããã¯ã©ã€ãä»ãã®ããŒããŒãã«ããã³ãæããŸããã ãŸããããŒã PC ãã¹ã¿ã³ãã«çœ®ããŠäœ¿ãã¹ã¿ã€ã«ã詊ããŠã¿ãããšæããŸããã ããã°ãèªãã§ãã ãã£ãŠããçããã®äœæ¥ç°å¢æ§ç¯ã®åèã«ãªãã°å¹žãã§ãïŒ çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ïŒãã¡ã€ã³ã㣠CTOã®äœè€( @ma3tk )ã§ãã 衚é¡ã®éããçŽ1幎åã»ã©ã®æéããããŠããšã³ãžãã¢çµç¹ã匷ããã éçºçç£æ§ã®æç§æž ïœäºäŸããåŠã¶ãçç£æ§åäžãžã®åãçµã¿æ¹ïœã(以éãéçºçç£æ§ã®æç§æž)ãšããæ¬ãå·çããŸããã æ¬æ¥(2024幎7æ11æ¥)çºå£²ãšãªããŸããã®ã§ãæ¹ããŠãéçºçç£æ§ãã«å¯ŸããæãããäŒãããããæ¬ã®å
容ã®äžéšãã玹ä»ããããšæããŸãã ãéçºçç£æ§ã®æç§æžãã®ãçŽ¹ä» ãšã³ãžãã¢çµç¹ã匷ããã éçºçç£æ§ã®æç§æž æ¬ã®æŠèŠã¯æ¬¡ã®ãšããã§ãã é
ç® è©³çŽ° ã¿ã€ãã« ãšã³ãžãã¢çµç¹ã匷ããã éçºçç£æ§ã®æç§æž ïœäºäŸããåŠã¶ãçç£æ§åäžãžã®åãçµã¿æ¹ïœ èè
äœè€ å°é«ãFindy Inc. çºè¡ æè¡è©è«ç€Ÿ å®äŸ¡ 2,860åïŒçšèŸŒïŒ çºå£²æ¥ 2024幎7æ11æ¥ ISBN 978-4297142490 賌å
¥ Amazon / 楜倩ããã¯ã¹ å
šåœæžåºããã®ä»ãªã³ã©ã€ã³æžåº é»åç Gihyo Digital Publishing / Amazon / 楜倩ããã¯ã¹ å
šåœæžåºã«ãŠãè²·ãæ±ãããã ããŸãã®ã§ãæ¯éãã§ãã¯ããŠã¿ãŠãã ããã ãããããªãæ¬ãå·çããããšããã®ã å
ã蟿ããšã2019幎æ«é ãã Findy Team+ (åœæã¯Findy Teams)ãšãããµãŒãã¹ãåãéçºãå§ããæã«é¡ããŸãã ããšã³ãžãã¢çµç¹ã§å°ã£ãŠããããšã£ãŠãªãã§ããïŒã ãã®åãããããã20ã30瀟ã®CTOãVPoEãéçºéšé·ãEMã®çæ§ãšã話ããŠããŸããã ãšã³ãžãã¢çµç¹èª²é¡ãæ·±å ããããŠããã ãäžã§ãããããçµç¹ãäœã£ãŠãããããšããæããåãåããŸãããå°åé«éœ¢åãéçºå
補åã®åããåããšã³ãžãã¢æ¡çšãé£ãããªãäžã§ãåšç±ããŠããã¡ã³ããŒã®æè¡åãåäžããçµç¹ã®éçºçç£æ§ãåäžãããããšã«èå³é¢å¿ãããã ããŸããã ãäœãã©ããããçµç¹ãè¯ããªãã®ããããããªãã ãçç£æ§ãäžããå¿
èŠãããããåæã«å°ã£ãŠããã ã䌺ãããäžã§ãéçºçç£æ§ã®åäžã«çŽçµããæã¡æã§è¿·ãããšãå€ããšåŠã³ãŸããããã¡ã€ã³ãã£ã§ãéçºçç£æ§ã®åäžãã©ãå®çŸããããFindy Team+ã®ãµãŒãã¹å©çšè
ã®æ©ã¿ã解決ãããæäŒãããããŠããã ãããäžã§ã©ãäŸ¡å€æäŸãã§ããããæš¡çŽ¢ãç¶ããŠããŸããã ãéçºçç£æ§ãã®çè§£ãé£ããããã«æããŠããŸã ãµãŒãã¹ãéããäŸ¡å€æäŸãç¶ããäžã§èªåèªèº«ãæããããšã¯ããéçºçç£æ§ãšããèšèã¯å€çŸ©èªã§ãã©ãå®çŸ©ãããšããã®ãããããªãããšããããšã§ããã éçºçç£æ§ã«ã€ããŠãã£ãšèª¿ã¹ç¶ããŠãããšãFour KeysãSPACEãšãã£ãæŠå¿µãåºãŠããŠæ··ä¹±ãããããæ°å€åããŠæ¬åœã«ãšã³ãžãã¢ã«ãšã£ãŠå¬ããã®ãïŒããšãããããªçåãèªåèªèº«ã§ãèããããã«ãªããŸãããä»ãšãªã£ãŠã¯çè§£ãé²ã¿ãŸããããååŠã®ã¿ã€ãã³ã°ã§ã¯æŽçã«æéãèŠããŸãããåãããã«é£ããæããŠããŸãæ¹ããã£ãšããã£ããããšæããŸãã éçºçç£æ§ã«ã€ããŠã©ããã§åŠãã ããšãããæ¹ã¯å€ãã¯ãªãã¯ãã§ãã1幎ã»ã©åãããšã³ãžãã¢ã®æ¹ãå§ãããããã¯ãéçºã«é¢ããæ§ã
ãªæ¹ã»çµå¶è
ã®æ¹ã«éçºçç£æ§ã«é¢ããç¥èŠãå
±æããããã«ã¯æ¬ãæžãããšã§ãéçºçç£æ§ã«å¯ŸããŠã®çè§£ãåäžãããããšãå®çŸã§ãããã§ãããšæãç«ã¡ãŸããã ä»åã®æ¬ã§ã¯ããéçºçç£æ§ããšããèšèã®é£ãããå°ãã§ãçŽè§£ããã©ããªçµç¹ã§ãåãçµã¿ãããå
¥éæžãšããŠåºçããã«è³ããŸããã ãéçºçç£æ§ãäžããããã«å€§äºãªããšããå€ãã®äººã«ç¥ã£ãŠããããã Findy Team+ã®ãµãŒãã¹ããªãªãŒã¹ããäžã§ããç£èŠãããã®ã§ã¯ãªããïŒããæ°å€ãå¯èŠåãããªã¹ã¯ãããã®ã§ã¯ãªããïŒããšãããæèŠãç¹ã«å€ãã§ãã æ¬æžã«ãã£ãŠéçºçç£æ§ãåäžãããããã®èªèãçµ±äžããèª€è§£ãæžãããããšæã£ãŠãããŸããæ¬æžã®äžã«ããç£èŠããã®ã§ã¯ãªããèªèãæããããšããå
容ãèšè¿°ããŠããŸãã çµç¹ã®å®éåã«ãã©ãŒã«ã¹ãåœãããã¡ã§ãããéçºçç£æ§ãäžããŠé¡§å®¢ã«äŸ¡å€ãå€ãæäŸããããšãããã£ãšèšãã°å£²äžãKPIåäžãžã€ãªãããããªéçºã«éäžã§ããããšã倧äºã ãšæã£ãŠããŸãããã®ãããå®éåãã®ãã®ãããå®éåããŠéå»ãšæ¯èŒããããšã§ãã©ãã«èª²é¡ããããããïŒããç¥ãããã®éããã¹ã®ãããªãã®ããšæã£ãŠããŸãã éçºçç£æ§ææšãåäžãããããã«ãã£ãŠã¯ãããªãã¢ã³ããã¿ãŒã³ - Findy Tech Blog ã®èšäºã«ãæžããŠããããã«ãæ°å€ã«åœ±é¿ããªãããã«ããã¯ãããããšã§ã¯ãªããçŸåšã®ãããã¯ãéçºã«ãããŠã©ããããã«ããã¯ãã®ç®æãã€ããå®éçã«ããããšã§ä»è
ãšã®èªèãæããããšãæ¬è³ªã ãšæã£ãŠããŸãã æ°å€ã ãã远ã£ãŠããŸããšç£èŠã«ã€ãªãã£ãŠããŸããããŸããããæ°å€ã«çŸãã«ããã瀟å
ã®ã¡ã³ããŒã®ç©æ¥µçãªãã«ããããç©æ¥µçãªããŒãã£ã³ã°ã®ãã¡ã·ãªããŒã·ã§ã³ããªã©ã誰ããããªããªã£ãŠããŸããŸããããã§ã¯æ¬æ«è»¢åã§ããâŠïŒ ãããã£ã誀解ã誀çšããããããæ¬æžã«ãã£ãŠãããå°ãã§ãæžãããããšèããŠããŸãããããŠããããŸã§ä»¥äžã«äºæ¥è²¢ç®ã«ã€ãªããéçºãã§ããäžã®äžã§æº¢ããŠã»ãããšèããŠããŸãã æ¬æžã®ç¹åŸŽïŒå
¥éããå®è·µãŸã§ç¶²çŸ
ããŠããæç§æžã§ããããš æ¹ããŠãæ¬æžã®ç¹åŸŽãšããŠã¯å€§ãã3ã€ãããŸãã 1. äœç³»çã«æŽçãããéçºçç£æ§ã®ç¥èãåŠã¹ã åè¿°ããããã«Findy Team+ã®éçºãéããŠããããã¯ããªãŒããŒãšããŠãéçºçç£æ§ãã«ã€ããŠè²ã
調ã¹ãŠããŸããããããããéçºçç£æ§ãã«ã€ããŠäœç³»çã«ãŸãšãŸã£ãŠãããã®ãããŸããªãã£ããããæ¹ããŠèªåã®ç解床åäžãå
ŒããŠãŸãšããªãããŸããã 2. å®è·µãžã®ç¬¬äžæ©ãšããŠãå§ããããã«ãã©ãŒã«ã¹ãã æµ·å€ã®èš³æžãªã©ã¯ã¢ã«ãããã¯ã«ç ç©¶ãéããããŠãããéåžžã«è¯è³ªãªæ¬ããããŸããç¹ã«ã LeanãšDevOpsã®ç§åŠ ã¯ãéçºçç£æ§ãã«ã€ããŠåŠã¶ããã§æ¯éèªãã§ã»ããäžåã§ããäžæ¹ã§ã©ãå§ãããšããã®ãã«ã€ããŠèªåã¯ãã£ãšæ
å ±ãæ¬²ããã£ãããšãããããéçºçç£æ§ã®æç§æžãã¯åã£ä»ããããã倧äºã«ããå
·äœçã«ã©ããããšããã®ããç§èªèº«ã®å®äœéšãäŒæ¥äºäŸã亀ããªãããªãã¹ãèªã¿ãããèšèé£ãã§èšèŒããŠããŸããæ¯éã©ã¡ããèªãã§ããã ããšãéçºçç£æ§ãã«å¯Ÿããçè§£ãæ·±ãŸããšæããŸãã 3. æåãžã®ãã³ããšããŠäºäŸã5瀟éããŸãšãã ãŸãããã¡ã€ã³ãã£ç€Ÿãå«ã5瀟ã®äºäŸãéããŸããã BuySell Technologies瀟ïŒçç£æ§ã®é«ããIRè³æã«æ²èŒãã瀟å
å€ã§ã®è©äŸ¡ãé«ããããšã§ããšã³ãžãã¢æ¡çšã«ã奜圱é¿ãäžããåè£è
ããã®é¢å¿ãåŒããã話 ãã¯ã«ã瀟ïŒéçºçç£æ§ãåäžãããããã®åºç€ãäœã£ãããšã§ãiOSã¢ãŒããã¯ãã£ã®æ¹ä¿®ãããžã§ã¯ããæåããã倿Žè¡æ°ã®åæžããµã€ã¯ã«ã¿ã€ã ã®ççž®ãå®çŸããã話 ã¯ã©ã¹ã¡ãœãã瀟ïŒéçºçç£æ§ãåäžãããããã®äºç®ç²åŸãæœçå®è¡ãããããšã§ããšã³ãžãã¢çµç¹å
šäœã®ã¢ãããŒã·ã§ã³ãåäžãããšã³ãžãã¢ãªã³ã°ã®å¹çåãšå質åäžãå®çŸããã話 ã¯ã³ãã£ãªã¢ç€ŸïŒSPACEãã¬ãŒã ã¯ãŒã¯ã®å®çŸãæ¯æ¥ã®ãªãªãŒã¹äœå¶ãžã®ç§»è¡ãé²ããã話 ãã¡ã€ã³ãã£ç€ŸïŒCIæéã®ççž®ããã¹ãã³ãŒãã®æ¡å
ã«ãããµãŒãã¹ã®å®å®æ§ãšéçºãããŒã®æ¹åã®è©± å
·äœçã«ã©ãé²ãããšã©ããªå¹æããããã«ã€ããŠãèªããäžåã«ä»äžããŠãããŸãïŒ ãŸããå·çã«ãååããã ããå瀟ã®ãæ
åœè
æ§ã«ãå¿ããæè¬ç³ãäžããŸãã éçºçç£æ§ã®åäžãšãããã æ¬èšäºã§ã¯éçºçç£æ§ã®æç§æžã®äžéšãã玹ä»ãããŠããã ããŸããã éçºçç£æ§ãåäžããããšã§ãå人ã®åžå ŽäŸ¡å€ãäžããããããçµç¹ã®KPI/売äžããããããã®ã«ãªãã ãã§ã¯ãªããçµç¹ãã®ãã®ã®é°å²æ°ããããªãããšã«ãã€ãªãã£ãŠããã¯ãã§ãããããŸã§ãæ°å€ã¯å¥åº·ææšãšããŠæ±ããªããã課é¡ãèŠã€ãåºã解決ã«åããŠé²ããããšã倧äºã ãšæã£ãŠããŸãã ãã¡ã€ã³ãã£ã¯ãææŠãããšã³ãžãã¢ã®ãã©ãããã©ãŒã ãã€ããããšããããžã§ã³ã®å
ãæ§ã
ãªãšã³ãžãã¢ã®çããŸããšã³ãžãã¢çµç¹ã«ãããŠããååãã«ææŠã§ããç°å¢ãäžç·ã«äœããããšæã£ãŠããŸãã æ¹ããŠãä»åã®æ¬ãå·çããã«ããããååããã ããæ¹ã»ç·šéã®çæ§ãããããšãããããŸããããéçºçç£æ§ã®æç§æžããçæ§ã®ææŠã«åœ¹ç«ãŠããããå¬ããã§ããæ¯éèå³ãæã£ãŠããã ããããæå
ã«ãšã£ãŠããã ãããšå¹žãã§ãã 賌å
¥ã¯ä»¥äžããã©ããïŒ Amazon 楜倩ããã¯ã¹ å
šåœæžåºããã®ä»ãªã³ã©ã€ã³æžåº ãŸãããããã£ãã€ãã³ãããããŸãã®ã§ããã£ãããåå ã©ãããïŒ d-plus.connpass.com
ããã«ã¡ã¯ããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§ããã³ããšã³ãã®ãªãŒããããŠãããŸã æ°çŠ( @puku0x )ã§ãã ãã®èšäºã§ã¯ã IT/Webãšã³ãžãã¢ã®è»¢è·ã»æ±äººãµã€ã Findy ã®ã¡ãã»ãŒãžç»é¢ã®æ¹åã«ã€ããŠã玹ä»ããŸãã ã¡ãã»ãŒãžç»é¢ã®èª²é¡ ã¡ãã»ãŒãžç»é¢ã®æ¹å Apollo Clientãã£ãã·ã¥ã®å©çš èªã¿èŸŒã¿ç»é¢ã®æ¡ä»¶ä¿®æ£ ããŒãžèšèšã®æé©å ãŸãšã ã¡ãã»ãŒãžç»é¢ã®èª²é¡ Findyã®ã¡ãã»ãŒãžç»é¢ã¯æ°å¹Žåã«ãã¶ã€ã³ãå·æ°ããŸããã çŸåšã§ã¯ã3çš®é¡ã®ã¡ãã»ãŒãžã衚瀺ããããã«ãªã£ãŠããŸãã éåžžã®ãããã³ã°ã®ã¡ãã»ãŒãž ãã¬ãã¢ã ã¹ã«ãŠãã®ã¡ãã»ãŒãž Findyããã®ã¡ãã»ãŒãž æ©èœæ¡å
ãããäžæ¹ã§ãèªã¿èŸŒã¿ãå€ãããç»é¢é·ç§»ããµã¯ãµã¯åãããã«ããŠæ¬²ããããšã®å£°ãããã ãæ©äŒãå¢ããŠãããŸããã å®éã«è§Šã£ãŠã¿ããšç¢ºãã«èªã¿èŸŒã¿ç»é¢ãé »ç¹ã«è¡šç€ºãããç»é¢é·ç§»ã«æéãããã£ãŠããããšãããããŸããã ã¡ãã»ãŒãžç»é¢ã®æ¹å Apollo Clientãã£ãã·ã¥ã®å©çš æåã«åãçµãã ã®ã¯ãã£ãã·ã¥ã®å©çšã§ãã Findyã®ããã³ããšã³ãã«ã¯æ¢ã«Apollo Clientãçµã¿èŸŒãŸããŠããã®ã§ãããŒã¿ååŸã®éã« fetchPolicy: 'cache-and-network' ãæå®ããŠäœæé床ã®åäžãçããŸããã www.apollographql.com ãã®æ¹ä¿®ã«ãããããŒãžåæ¿æã®èªã¿èŸŒã¿æéïŒããŒã«ã«ç°å¢ïŒã¯çŽ1,200msâçŽ900msãšé«éåãããŸããã èªã¿èŸŒã¿ç»é¢ã®æ¡ä»¶ä¿®æ£ åœæã®å®è£
ã§ã¯ããã£ãã·ã¥ã®æç¡ã«é¢ä¿ãªãèªã¿èŸŒã¿ç»é¢ã衚瀺ããããã«ãªã£ãŠããŸããã æ°ããå®è£
ã§ã¯ãèªã¿èŸŒã¿äžãã€ãã£ãã·ã¥ãç¡ãå Žåã®ã¿ã«ä¿®æ£ããŠããŸãã const { data , loading } = useQuery(..., { fetchPolicy : 'cache-and-network' } ); < Loading isLoading = { loading && !data } /> ãã®æ¹ä¿®ã§ã¯ãããŒãžåæ¿æã®èªã¿èŸŒã¿æéãžã®çŽæ¥çãªåœ±é¿ã¯ãããŸããããäœææéã¯æå€§ã§300msïŒèªã¿èŸŒã¿ç»é¢ã®ã¢ãã¡ãŒã·ã§ã³ã®åçæéïŒã»ã©åæžãããŠãããšæãããŸãã ããŒãžèšèšã®æé©å åœæã®å®è£
ã§ã¯ãåè¿°ãã3çš®é¡ã®ããŒãžãåå¥ã®ãã¡ã€ã«ã§å®è£
ããå
éšã«ã¡ãã»ãŒãžã®äžèЧãšè©³çްã³ã³ããŒãã³ããæã€ãšããæ§æã§ããã ãã®ãããããŒãžé·ç§»ã®åºŠã«äžèЧãšè©³çްã³ã³ããŒãã³ãã®äž¡æ¹ãåæç»ãããäœæé床ã«èª²é¡ãæ®ããŠããŸããã 解決ã«ã¯ããŒãžèšèšã®èŠçŽããå¿
èŠã§ããã Layouts ã¯Findyã®ããã³ããšã³ãããŸã App Routerã«ç§»è¡ã§ããŠããªãããå©çšã§ããã getLayoutãã¿ãŒã³ ãç»é¢å
šäœã®åæç»ãé²ãããšãé£ããããèŠéããšãªããŸããã æè©°ãŸãããšæãããŸããããä»ã®ããŒãžã§æ¡çšãããCatch-all Segmentsã®å®è£
ãåèã«ãOptional Catch-all Segmentsã䜿ã£ãå®è£
ãä»åã®èŠä»¶ã«åèŽããããšãããã£ãããæ¡çšããããšã«ããŸããã nextjs.org æ°ããå®è£
ã§ã¯ã [[...keys]]/index.page.tsx ã«3çš®é¡ã®ããŒãžå®è£
ãéçŽãããããŒãžé·ç§»ã®éã¯ã¡ãã»ãŒãžè©³çްã³ã³ããŒãã³ãã®ã¿ãå·®ã代ããããã«ãªã£ãŠããŸãã ãã®æ¹ä¿®ã«ãããã¡ãã»ãŒãžäžèЧã®äžèŠãªèªã¿èŸŒã¿ãåæžããããããããŒãžåæ¿æã®èªã¿èŸŒã¿æéïŒããŒã«ã«ç°å¢ïŒã¯ã¡ãã»ãŒãžè©³çްã®ãã£ãã·ã¥ãç¡ãå Žåã§ãçŽ500msããã£ãã·ã¥ãããå Žåã¯èªã¿èŸŒã¿æéãã»ãšãã©æããããªãã»ã©å€§å¹
ã«é«éåãããŸããã ãŸãšã ãã£ãã·ã¥ã®æŽ»çšãããŒãžèšèšã®èŠçŽãã«ãããã¡ãã»ãŒãžç»é¢ã®ããã©ãŒãã³ã¹ãåäžãããããšã«æåããŸããã æ¹åã§ããŠå¬ããäžæ¹ãOptional Catch-all Segmentsèªäœã¯Pages Routerã®åºæ¬çãªæ©èœã§ãããã®ã§ããã調ã¹ãŠããå®è£
ããŠããã°...ããšåçããç¹ããããŸãã ããã¥ã¡ã³ãã¯ã¡ãããšèªã¿ãŸãããïŒèªæïŒð ã¡ãã»ãŒãžç»é¢ä»¥å€ã«ã€ããŠãããã©ãŒãã³ã¹æ¹åãé²ããŠåããŸãã®ã§ãä»åŸããããããé¡ãããŸãã ä»åã¯æ¡çšãèŠéããŸããããApp Routerç§»è¡ãReact 19ã®æ°æ©èœã掻çšããŠæŽã«å¿«é©ã«åäœããããã³ããšã³ããå®çŸã§ããã°ãšèããŠãããŸãã ãèå³ã®ããæ¹ã»ææŠããŠã¿ããæ¹ã¯ãã²âã®ãªã³ã¯ãããå¿åãã ãããç§éãšäžç·ã«Findyãããè¯ããµãŒãã¹ã«ããŸãããïŒ ãã¡ã€ã³ãã£ã¯ç©æ¥µçã«ãšã³ãžãã¢ãæ¡çšããŠããŸããCI/CD ãå§ããFour Keysãéçºçç£æ§ãæè¡ãã¬ã³ãã転è·åžå Žãªã©èå³ã®ããæ¹ã¯ããæ°è»œã«ã«ãžã¥ã¢ã«é¢è«ãåããŠã¿ãŠãã ããã ãã¡ã€ã³ãã£ã®æ¡çšæ
å ±ã¯ãã¡ã â herp.careers
ããã«ã¡ã¯ã 2024/05ãããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã«ããŒã¿ãšã³ãžãã¢ãšããŠå
¥ç€Ÿããç°é ( tagasyksk )ã§ããæ¬èšäºã§ã¯ãããŒã¿å€æãµãŒãã¹ã§ããDataformã«ã€ããŠãã®æŽ»çšæ¹æ³ãå°å
¥åŸã®å¹æã«ã€ããŠã玹ä»ããŸãã åŒç€Ÿã§ã¯ãçŸå𿬡ã®ãããªæ§æã§ããŒã¿åºç€ãæ§æããŠãããBigQueryå
ã§ã®ããŒã¿å€æã«Dataformãå©çšããŠããŸãã ãã®æ§æãèžãŸããŠã芧ããã ããã°å¹žãã§ããããã§ã¯èŠãŠãããŸãããïŒ Dataformã«ã€ã㊠å°å
¥ã®èæ¯ ããŒã¿åºç€ã«å¿
èŠãªæ©èœãæã£ãŠãããç°¡åã«éçšãå§ããããããš ã¯ãšãªäœæã®ããŒãã«ãéåžžã«äœãããš å°å
¥åŸã®å¹æ Findyã§ã®Dataforméçš å°å
¥ããŠã®èª²é¡ æ¹åç¹ ä»åŸã®å±æ ããŒã¿ã®å質åäž ããŒã¿ã¢ããªã³ã° çµããã« Dataformã«ã€ã㊠ãµãŒãã¹ã®èª¬æã«ã€ããŠã¯ã å
¬åŒããã¥ã¡ã³ã ãåŒçšããŸãã Dataform ã¯ãããŒã¿ ã¢ããªã¹ãã BigQuery ã§ããŒã¿å€æãè¡ãè€é㪠SQL ã¯ãŒã¯ãããŒãéçºããã¹ããããŒãžã§ã³ç®¡çãã¹ã±ãžã¥ãŒã«èšå®ããããã®ãµãŒãã¹ã§ãã äŸãã°ã BigQueryã§ã¹ã±ãžã¥ãŒã«å®è¡ããŠããSQLãGit管çããã äŸåé¢ä¿ã®ããSQLãé çªã«å®è¡ããŠã»ãã ã¯ãšãªã®å®è¡çµæãæå³ããæåãè¡ããã©ããããã¹ãããã ãšãããããªã¿ã€ãã³ã°ã§æŽ»çšã§ããŸãã å°å
¥ã®èæ¯ Dataformå°å
¥åã®èª²é¡ç¹ãšããŠãSpreadsheetãGASããå©çšãããŠããã¯ãšãªã管çã§ããŠããŸããã§ããããã®çµæãå©çšè
ãæ³å®ããŠããããŒã¿ãšå®éã«ã¯ãšãªã§ååŸããŠããããŒã¿ãç°ãªã£ãŠããããæ£ãããªãããŒãã«ãåç
§ããŠããã±ãŒã¹ãçºçããŠããŸããã ãã®ãããªèæ¯ã®ããšã次ã®ã¡ãªãããèžãŸããŠDataformãå°å
¥ããŸããã ããŒã¿åºç€ã«å¿
èŠãªæ©èœãæã£ãŠãããç°¡åã«éçšãå§ããããããš Dataformã¯ç¡æã§ãããªãããæ¬¡ã®ãããªããŒã¿åºç€ã«å¿
èŠãªæ©èœãæã£ãŠããŸãã äŸåé¢ä¿ãå®çŸ©ããŠDAGãæ§æã§ãã ç¹å®ã®ã¿ã°ãä»äžãããããŒãã«ã§ã¯ãŒã¯ãããŒãæ§æã§ãã ããŒã¿ãªããŒãžãå¯èŠåã§ãã Gitãšé£æºããŠã¯ãšãªç®¡çãã§ãã Google Cloudã®IAMã§ã«ã©ã åäœã§ã®æš©éå¶åŸ¡ãã§ãã Google Cloudã®ãããŒãžããµãŒãã¹ãªã®ã§ãäœèšãªã¡ã³ããã³ã¹ãããå¿
èŠããããŸããã ã¯ãšãªäœæã®ããŒãã«ãéåžžã«äœãããš ãœãããŠã§ã¢éçºã®çµéšããªãã¢ããªã¹ããBizãµã€ãã«ãšã£ãŠãããŒã¿åºç€ãžã®åŠç¿ã³ã¹ããäœãããšã¯éåžžã«éèŠã§ãã Dataformã§ã¯.sqlxãšããSQLãæ¡åŒµãããã¡ã€ã«åœ¢åŒã§ã¯ãšãªãéçºããŸãã config { type: "table", "schema": "stg_hoge", "tags": [ "stg_hoge" ], "description": "ãŠãŒã¶ãŒ", "columns": { "id": "", "user_name": "ãŠãŒã¶ãŒå", "created_at": "äœææ¥", "updated_at": "æŽæ°æ¥", }, "assertions": { "nonNull": [ "id", "user_name", "created_at" ], "uniqueKey": [ "id" ] } } SELECT id, user_name, created_at, updated_at FROM ${ref("lake_hoge", "users")} sqlxã¯æ®éã®SQLãšdescriptionãassertionãå«ãç°¡åãªconfigã§äœæå¯èœãªã®ã§ãåŠç¿ã³ã¹ããéåžžã«äœãã§ãã Gitãçšããã¯ãšãªç®¡çã«é¢ããŠããDataformåŽãããã¯ãšã³ãã§è¡ã£ãŠãããŸãããã©ãŠã¶å
ã§ã¯ãšãªéçºããPRäœæãŸã§ãå®çµãããããGitã®ã³ãã³ããèŠããå¿
èŠããããŸããã å°å
¥åŸã®å¹æ Dataformå°å
¥ã«ãã£ãŠãBizãµã€ããäœæããã¯ãšãªãã¢ããªã¹ãã»ããŒã¿ãšã³ãžãã¢ãé©åã«ã¬ãã¥ãŒã§ããããã«ãªããŸããã martå±€ã®ã¢ãã«ã®æ°ãDataformå°å
¥åŸçŽ4åãšãªããéçºã掻çºã«ãªã£ãŠããããšãåãããŸãã ãŸãã瀟å
ã¡ã³ããŒã«Dataformã®å©ç¹ã«ã€ããŠèããŠã¿ããšãããæ¬¡ã®ãããªå£°ãèããŸããã 1ã¢ãã«ããã1ãã¡ã€ã«ã®äœæã§æžãã®ã§ãéçºã®è² æ
ãæžã£ã å®è¡ãã°ãDataformã³ã³ãœãŒã«äžã§ç¢ºèªã§ããã®ã§ãBigQueryãšå®è¡ãã°ã®æšªæã楜ã«ãªã£ã Findyã§ã®Dataforméçš ããããã¯DataformãéçšããŠããäžã§ã©ã®ãããªèª²é¡ãçããã©ã®ããã«è§£æ±ºããŠãããã詳ããæžããŠãããŸãã å°å
¥ããŠã®èª²é¡ Dataformå°å
¥åœåã¯ã次ã®ãããªãããŒã§ã¯ãšãªãéçºããŠããŸããã ããŒã¿åºç€ãéçšããŠããäžã§ã次ã®èª²é¡ãçããŸããã Productionç°å¢ã«ããããŒãã«ã«å¯ŸããŠã¯ãŒã¯ã¹ããŒã¹ããã¢ãã«ãå®è¡ã§ããŠããŸã Dataformã®ã³ã³ãœãŒã«ç»é¢äžããããŸã ã¬ãã¥ãŒããŠããªãã¢ãã«ãå®è¡ã§ããŠããŸãã®ã¯ãæå³ããªãã¹ããŒãã®å€æãããŒã¿å€æã®ãããã£ã³ã°ãèµ·ããŠããŸããŸããããŒã¿ãšã³ãžãã¢åŽãšããŠãæãŸããç¶æ
ã§ã¯ãããŸããã§ããã æ°ããã¯ãŒã¯ãããŒçšã®ã¿ã°ã®è¿œå å¿ããé »çºãã Dataformã§ã¯sqlxå
ã«èšè¿°ããã¿ã°ãæå®ããŠã¯ãŒã¯ãããŒãæ§æããŸããã¯ãŒã¯ãããŒã®ç®¡çã¯Terraformã§è¡ã£ãŠãããããDataformåŽã®PRããã¯ã¿ã°ã远å ãããŠãããåããããããŒã¿æŽæ°æã«ã¿ã°ã®è¿œå å¿ããçºèŠããããšããããŸããã ããŒãã«å€æŽæã圱é¿ç¯å²ãäžéæã§ã¬ãã¥ãŒãã¥ãã ã¯ãšãªãä¿®æ£ããéãä¿®æ£ããããŒãã«ãã©ã®ããŒãã«ããåç
§ãããŠãããã確èªã§ããŠããŸããã§ãããèšç®ããžãã¯ã®å€æŽãã©ã®ããŒãã«ã«äŒæããã®ãåããããã¬ãã¥ãŒãäžååãªãŸãŸããŒãžãããŠããŸãããšããããŸããã æ¹åç¹ ã¯ãšãªéçºãããŒã次ã®ããã«å€æŽããŸããã ç·æ¥å¯Ÿå¿ä»¥å€ã®éçºã¯å
šãŠdevelopç°å¢ã§è¡ãªãããã«åãæ±ºãããªãªãŒã¹äœæ¥ãå°å
¥ããŸããããŸããCIãã€ãã©ã€ã³ã®äžã§æ¬¡ã®ãããªé
ç®ãèªåã§ãã§ãã¯ããäºæ
ã鲿¢ããŠããŸãã 倿Žãããsqlxãã¡ã€ã«ãæ€åºããã¯ãšãªãšAssertionãDevelopç°å¢ã§èªåå®è¡ 倿Žã¢ãã«ã«äŸåããŠããããŒãã«ãæ€åºããPRäžã«è¡šç€º dataform compile ã§ååŸããŠããjsonãããŒã¹ãã倿Žãã¡ã€ã«ã®ããŒãã«ãæ€çŽ¢ããããšã§æ€åºããŠããŸãã - name: Detect Referenced Table run: | DIFF_FILES=$(echo "${{ steps.get_change_files.outputs.diff_files }}") echo "referenced_tables<<EOF" >> $GITHUB_OUTPUT for file in $DIFF_FILES; do dataset=$(jq -r ".tables[] | select(.fileName == \"$file\") | .canonicalTarget.schema" definition.json) table=$(jq -r ".tables[] | select(.fileName == \"$file\") | .canonicalTarget.name" definition.json) referenced_tables=$(cat definition.json | jq -r ".tables[] | select(.dependencyTargets[]?.schema? == \"$dataset\" and .dependencyTargets[]?.name? == \"$table\") | .canonicalTarget | .schema+\".\"+.name" | awk '!a[$0]++') echo "**$file**" >> $GITHUB_OUTPUT echo "$referenced_tables" >> $GITHUB_OUTPUT done echo "EOF" >> $GITHUB_OUTPUT éçºã«å©çšããã¯ãŒã¯ã¹ããŒã¹ãèªåã§åé€ãã Dataform CLIã®dry-runã§Productionã®äŸåããŒãã«ã«åé¡ãç¡ããç¢ºèª 1 ã¯ãŒã¯ãããŒã§ä»äžãããŠããã¿ã°ãšsqlxãã¡ã€ã«äžã§ä»äžãããŠããã¿ã°ãæ¯èŒããã¯ãŒã¯ãããŒã«ç¡ãã¿ã°ããªãªãŒã¹PRã§è¡šç€º ã¯ãŒã¯ãããŒæ§æã§å©çšãããŠããã¿ã°ã¯ãGoogle CloudåŽããæäŸãããŠããAPIã§ååŸã§ããŸãã cloud.google.com APIã§ååŸããã¿ã°ãšsqlxã«ä»äžãããŠããã¿ã°ãçªåããã¯ãŒã¯ãããŒã«è¿œå ãå¿ããã¿ã°ãç¡ãã確èªããŠããŸãã远å å¿ããèŠã€ãã£ãå Žåã¯ãTerraformã§ç®¡çããŠãããªãªãŒã¹æ§æã«æ°ããã¿ã°ã远å ããŠå¯Ÿå¿ããŠããŸãã 以äžã®ãããªæ¹å掻åã®çµæãããŒã¿ã®æŽæ°æŒãããšã©ãŒãæžããŸãããã¢ã©ãŒã察å¿ãæžã£ãããšã§ãããŒã¿ãšã³ãžãã¢ãä»ã®æ¥åã«æéãå²ããããã«ãªããŸããã ãªãªãŒã¹å°å
¥ååŸã§ã¢ã©ãŒãæ°ãéèšããŠã¿ãã®ã§ãããå°å
¥å1ã¶æã®ã¯ãŒã¯ãããŒã§çãããšã©ãŒã¯54ä»¶ãªã®ã«å¯ŸãããªãªãŒã¹å°å
¥åŸ1ã¶æã§ã¯25ä»¶ãšåå以äžã«ãªã£ãŠããŸããã ä»åŸã®å±æ ããŒã¿ã®å質åäž ã¯ãšãªã®ã¬ãã¥ãŒäœå¶ãæŽããããšãã§ããŸããããã¯ãšãªãããŒã¿ã®å質ã«ã¯ãŸã 課é¡ãæ®ããŠããŸãã GASãã¹ãã¬ããã·ãŒãå
ã§çºè¡ãããŠããã¯ãšãªãDataformã®ç®¡çäžã«çœ®ãããšã¯ã§ããŸããããDRYã®ååã«åããŠããããå¯èªæ§ã«èª²é¡ã®ããã¯ãšãªããŸã ååšããŠããŸãã ããŒã¿å質ã«ã€ããŠã¯ãç°åžžãªããŒã¿ãæ€ç¥ããŠã¢ã©ãŒããåºãä»çµã¿ãæŽããå¿
èŠããããŸããDataformã§ã¯assertionãtestãšãã£ã圢åŒã§ãã¹ããæžãããšãã§ããŸãããçŸç¶ã¯ããã©ã«ãã§ãµããŒããããŠããassertion(nullãã§ãã¯ãuniqueKeyãªã©)ãçµã¿èŸŒãã§ããçšåºŠã§ãã ããããã瀟å¡ãå¢ããŠããããšãäºæ³ãããäžã§ãããŒã¿å質ãã©ããã£ãŠç¶æã»åäžããŠãããã¯ãããããæš¡çŽ¢ããŠããããã§ãã ããŒã¿ã¢ããªã³ã° ããŒã¿å©çšè
ãã¹ã ãŒãºã«åæãé²ããŠããããã«ãããŒã¿ã¢ããªã³ã°ã¯å¿
èŠäžå¯æ¬ ã§ããããããåŒç€Ÿã§ã¯ã¢ããªã³ã°ã«ç²Ÿéãã人æãããªãã®ãçŸç¶ã§ãã 5æããããŒã¿ãšã³ãžãã¢ãšã¢ããªã¹ãã§å®æçã«éãŸã£ãŠããŒã¿ã¢ããªã³ã°ã®å匷äŒãè¡ããããŒã å
ã®ãã¬ããžãæããªããå°ããã€ã¯ãšãªã®èŠçŽããé²ããŠããŸãã â»äžç·ã«ããŒã¿ã¢ããªã³ã°ãããŠããããæ¹ãããŸããããæ¯éã«ãžã¥ã¢ã«é¢è«ã«ãå¿åãã ããïŒããŒã¿ã¢ããªã³ã°ãäžç·ã«ãã£ãŠãããŸãããïŒ çµããã« ãããã§ããã§ããããïŒä»åã¯åŒç€Ÿã§ã®Dataformã®æŽ»çšã«ã€ããŠæžããŸããã åŒç€Ÿã§ã¯ããŒã¿åºç€ãå
±ã«è²ãŠãŠããã¡ã³ããŒãåéããŠããŸããå°ãã§ãèå³ãæ¹§ããæ¹ã¯ã«ãžã¥ã¢ã«é¢è«ãåŸ
ã¡ããŠãããŸãïŒ herp.careers herp.careers Dataform CLIãver3.0æªæºã ãšdry-runã§æ€èšŒã§ããã®ã¯Dataformå
ã§ã®äŸåé¢ä¿ãããŒãã«ã®æç¡ã®ã¿ã§ã declaration ã§å®£èšããããŒã¿ãœãŒã¹ãBigQueryäžã«ååšããªãå Žåãªã©ã§ãšã©ãŒãèµ·ããŸããã( æè¿ã®ãªãªãŒã¹ ã§åºæ¥ãããã«ãªã£ãã¿ããã§ãããDataform CLIã®ver3.0以äžã¯breaking changeãå€ãã®ã§ãŸã 詊ããŠããŸãã...)çŸç¶ã¯ãããŒã¿ãœãŒã¹ãåç
§ãããããªã¯ãšãªã¯ãªãªãŒã¹æã«ç®èŠãã§ãã¯ããããšã§ã«ããŒããŠããŸãã ↩
ããã«ã¡ã¯ïŒ ãã¡ã€ã³ãã£ã® @Taka-bow ã§ãã ãŸããªããéçºçç£æ§Conference 2024ããéå¬ãããŸãã2æ¥ç®ã®ããŒããŒãã¹ããŒã«ãŒã§ããNicole Forsgrenå士ã¯ãæšå¹Žã¯ãããªè¶ãã®ãç»å£ã§ããããä»åã¯æ¥æ¥ããŠãã ããäºå®ã§ãã æšå¹Žã¯ãSPACEïŒçç£æ§ãã¬ãŒã ã¯ãŒã¯ãã®ç ç©¶ã«ã€ããŠã玹ä»ããã ããŸããããä»åã¯ã©ã®ãããªã話ã䌺ããã®ã§ããããïŒ ãè¬æŒã®ã¿ã€ãã«ã¯ Mastering Developer Experience: A Roadmap to Success ïŒããããããŒãšã¯ã¹ããªãšã³ã¹ã極ããïŒæåãžã®ããŒããããïŒ ãšã®ããšã倧倿¥œãã¿ã§ãã dev-productivity-con.findy-code.io å士ã¯ãæžç± "Accelerate" *1 ã®çé èè
ãšããŠãåºãç¥ãããŠããŸãããæè¿ã¯ããããããŒãšã¯ã¹ããªãšã³ã¹ïŒ DevEx : Dev eloper Ex perienceïŒç ç©¶ã®ç¬¬äžäººè
ãšããŠã泚ç®ãããŠããŸãã ããã§ãããããããããããŒãšã¯ã¹ããªãšã³ã¹ãšã¯äœãïŒå士ãã®è«æãåŒçšããªããçŽè§£ããããšæããŸãã ããããããŒãšã¯ã¹ããªãšã³ã¹ã®ç§åŠçãªç ç©¶ Nicole Forsgren å士ããããããããŒãšã¯ã¹ããªãšã³ã¹ïŒä»¥éãDevExïŒã«é¢ããŠçºè¡šããè«æã¯ããã€ããããŸãããä»åã¯æè¿ã®2ã€ã®è«æã«ãã©ãŒã«ã¹ããŸãã 1ã€ç®ã¯ãæšå¹Ž5æ Association for Computing MachineryïŒACMïŒã§çºè¡šããã "DevEx: What Actually Drives Productivity: The developer-centric approach to measuring and improving productivity" ãDevEx: äœãå®éã«çç£æ§ãåäžãããã®ãïŒ çç£æ§ã枬å®ãæ¹åããããã®éçºè
äžå¿ã®ã¢ãããŒãã 2ã€ç®ã¯ãä»å¹Ž1æã«çºè¡šããã "DevEx in Action: A study of its tangible impacts" ãå®è·µç DevExïŒãã®å
·äœçãªåœ±é¿ã«é¢ããç ç©¶ã ã©ã¡ãã®è«æããDevEx ã®ã質ãããéçºçç£æ§ã«å€§ãªåœ±é¿ãäžããŠãããšãã仮説ããç§åŠçã«èšŒæããããšè©Šã¿ãŠããŸãã ããããããŒãšã¯ã¹ããªãšã³ã¹ã®3次å
DevEx ãšã¯ããœãããŠã§ã¢ãšã³ãžãã¢ïŒããã§æãéçºè
ïŒãæ¥ã
çµéšããŠããæ¥åãèšãæããã°ããšã³ãžãã¢ã®æ¥åäœéšãç°å¢ããã®ãã®ãæããŠããŸãã ãããŠã圱é¿ãäžããèŠå ããDevExã®3次å
ããã¬ãŒã ã¯ãŒã¯ãšåŒã³ãŸãã åç
§: Noda, A., Storey, M. A., Forsgren, N., & Greiler, M. (2023). DevEx: What Actually Drives Productivity: The developer-centric approach to measuring and improving productivity. ACM Queue, Vol.21, No.2, p.35-53. ããããã Feedback Loops (ãã£ãŒãããã¯ã«ãŒã) Cognitive Load (èªç¥è² è·) Flow State (ãããŒç¶æ
) ãšèšããŸãããããæèããããšã§ DevExã®æ¹åã¹ããããããå
·äœçã«ã§ããŸãã Feedback Loops (ãã£ãŒãããã¯ã«ãŒã) ãã£ãŒãããã¯ã«ãŒãã¯ããã¹ã©ã®ãããªèªåé転ã®èªåè»ãã€ã¡ãŒãžãããšåãããããã§ãããã èªåé転è»ã¯ãåæ¹ãå·Šå³ã®é害ç©ãè»éè·é¢ãªã©ã倿ããããã«ãã»ã³ãµãŒãã«ã¡ã©ããåŸãããæ
å ±ãé«éã§åŠçãããã£ãŒãããã¯ã«ãŒããå¿
èŠã§ãããã®åŠçãé
ããšãé害ç©ã«ã¶ã€ãã£ãŠããŸãå¯èœæ§ããããŸãããã Ian Maddox, CC BY-SA 4.0, via Wikimedia Commons ãœãããŠã§ã¢éçºçµç¹ã¯ãããªããªãŒã®é
å»¶ãæžãããŠã¢ãŠãã«ã ã®æµããæé©åããããšããŠããŸããé
å»¶ãæžãããšã§ããã£ãŒãããã¯ãšåŠç¿ãè¿
éã«è¡ãããéãããªè»éä¿®æ£ãå¯èœãšãªããŸãã ç ç©¶ã«ããã°ãé »ç¹ãªãããã€ãšãªãŒãã¿ã€ã ã®ççž®ãããã©ãŒãã³ã¹åäžã«ç¹ãããšãããŠããŸããè¿
éãªãã£ãŒãããã¯ã«ãŒãã¯ãéçºè
ãé害ãªãäœæ¥ãé²ããã®ã«åœ¹ç«ã¡ãéã«é
ããã£ãŒãããã¯ã«ãŒãã¯äžæãé
å»¶ãåŒãèµ·ãããéçºè
ã®ãã©ã¹ãã¬ãŒã·ã§ã³ãå¢ããŸãã ãã£ãŒãããã¯ã«ãŒããé«éã«ããããã®æ¹åæ¡ãšããŠã次ã®ç¹ãæããããŸãã éçºããŒã«ã®é«éå ïŒãã«ãããã¹ãã®æéãççž®ã 人ã®åŒãç¶ãããã»ã¹ã®æ¹å ïŒã³ãŒãã¬ãã¥ãŒãæ¿èªã®è¿
éåã çµç¹æ§é ã®æé©å ïŒããŒã éã®çžäºäœçšãåçåããé
å»¶ãæžããã ãããã®æ¹åã«ããããœãããŠã§ã¢éçºã®å¹çãšçç£æ§ãåäžãããããšãã§ããŸãã Cognitive Load (èªç¥è² è·) 2011å¹Žã«æ§Twitterã§è©±é¡ã«ãªã£ãæ¡å
æ¿ããããŸããã ãã®æ¡å
æ¿ããã¡ã åç
§ïŒ https://note.openvista.jp/2011/redesigning-shinjuku-building-sign, CC BY-SA 4.0 ããŠããã€ã¬ã«è¡ãã«ã¯ã©ã¡ãã«é²ãã°è¯ãã®ã§ãããïŒåïŒå³ïŒå·ŠïŒãšæ··ä¹±ãã人ã倧å¢ããããã§ãã ïŒæ£è§£ã¯å·ŠïŒ å°ãªããšããã»ãšãã©ã®äººãã±ã£ãšèŠãŠåãããªãç¶æ
ã¯ãèªç¥è² è·ãé«ãããšèšããã§ããããã äœè«ã§ããããã®æ¡å
æ¿ã¯ãã®åŸèªç¥ç§åŠã®åéã§ç ç©¶ãããçºè¡šãããŸããã 2016幎床 æ¥æ¬èªç¥ç§åŠäŒ 第33å倧äŒãç¢å°ãçšãããçµã¿åããããæ¹åãµã€ã³ãã®ããããããïŒ æ§é ïŒã¢ã€ã³ã³ïŒå 霢ã®å¹æãïŒ ç ç©¶ãªã³ã¯ ãœãããŠã§ã¢éçºã¯è€éã§ãããããŒã«ãæè¡ãå¢ããããšã§éçºè
ã®èªç¥è² è·ãå¢å ããŠããŸããèªç¥è² è·ãšã¯ãã¿ã¹ã¯ãå®è¡ããããã«å¿
èŠãªç²Ÿç¥çãªåŠçéãæããŸãã é£ããã¿ã¹ã¯ãæ°ãããã¬ãŒã ã¯ãŒã¯ã®çè§£ã«åãçµãå Žåããã®è² è·ã¯ç¹ã«é«ãŸããŸãããŸããæ
å ±ã®æç€ºæ¹æ³ã粟ç¥çãªåŠçãå¿
èŠãªå Žåãè² è·ã¯å¢å ããŸãã é«ãèªç¥è² è·ã¯ãéçºè
ã顧客ã«äŸ¡å€ãæäŸãã劚ããšãªããŸããäžååãªããã¥ã¡ã³ããè€éãªã·ã¹ãã ã«ãããéçºè
ã¯ã¿ã¹ã¯å®äºã«å€ãã®æéãšåŽåãè²»ããããšã«ãªããŸãã èªç¥è² è·ã軜æžããã«ã¯ãæ¬¡ã®æ¹åæ¡ãæããããŸãã äžèŠãªéå®³ã®æé€ ïŒéçºããã»ã¹ããäžå¿
èŠãªé害ãåãé€ãã æŽçãããã³ãŒããšããã¥ã¡ã³ã ïŒçè§£ããããã·ã¹ãã ãæ§ç¯ããã³ã³ããã¹ããã¿ã¹ã¯ã®åãæ¿ããæžããã å°ä»»ã®DevExããã³ãã©ãããã©ãŒã ããŒã ïŒäœ¿ããããã»ã«ããµãŒãã¹ããŒã«ãæäŸããéçºãšãªãªãŒã¹æé ãåçåããã ããã«ãããéçºè
ã®èªç¥è² è·ã軜æžããå¹ççã«äŸ¡å€ãæäŸã§ããç°å¢ãæŽããããšãã§ããŸãã Flow State (ãããŒç¶æ
) åŒéã«ãããåºæ¬çãªå°æ³ã®8ã€ã®åäœãå°æ³å
«ç¯ïŒããã»ãã¯ã£ãã€ïŒãšèšããŸãã è¶³èžã¿ïŒããã¶ã¿ïŒ èŽé ãïŒã©ãã¥ããïŒ åŒæ§ãïŒãããŸãïŒ æèµ·ãïŒãã¡ãããïŒ åŒåãïŒã²ãããïŒ äŒïŒããïŒ é¢ãïŒã¯ãªãïŒ æ®å¿ïŒããããïŒ ãã®äžã§ãã6çªç®ã®ãäŒãã¯ãä»ãå
·äœçãªåäœã«ãé¢ããããããã ããå°ãéããŸãã ç°¡å解説ïŒå°æ³å
«ç¯ ã«ãããšã åŒåãã宿ããç¢ãæŸã€æ©äŒãåŸ
ã€ã®ããäŒãã§ããäž¹ç°ã«åãå
¥ããèªç¶ãªåŒåžãå¿ãããŸããè©ãšèã®é«ãã«æ³šæããŸããããäœå
šäœã®ãã©ã³ã¹ãéå¿ã«æ°ãé
ããçããã£ãããšèŠã€ããŸãã å®éã®åäœã¯5ç§ã»ã©ããŒãããå¿
èŠãããããã§ãããããããŸãã«ãããŒç¶æ
ã ãšæããŸããåšå²ã®é³ãèãäºãªã©ã®é念ãããã°ãäŒããšã¯ãªãããç¢ã¯çãå€ããŠããŸãã§ãããã Pierre-Yves Beaudouin / Wikimedia Commons éçºè
ã¯ããããŒã«å
¥ãããããŸãŒã³ã«å
¥ãããšãã£ã衚çŸã䜿ããŸãã ããã¯ã掻åäžã«éäžåãšæŽ»åãæã¡ãå®å
šã«æ²¡é ãããããŒç¶æ
ãæããŸãããã®ç¶æ
ãé »ç¹ã«çµéšããããšã¯ãçç£æ§ã®åäžãã€ãããŒã·ã§ã³ã®ä¿é²ãåŸæ¥å¡ã®æé·ã«ç¹ãããŸããç ç©¶ã«ããã°ãä»äºã楜ããéçºè
ã¯ããé«ãããã©ãŒãã³ã¹ãçºæ®ãã質ã®é«ã補åãçã¿åºããŸãã ãããŒç¶æ
ã劚ããäž»èŠãªèŠå ã¯ãäžæãé
å»¶ã§ãããã®ä»ã«ããèªåŸæ§ã®æ¬ åŠãç®æšã®äžæç¢ºãããããŠåºæ¿çã§ãªãã¿ã¹ã¯ã圱é¿ããŸãã ãããŒç¶æ
ãäœããããããããã«ã¯ äžæã®æå°å ïŒäŒè°ããŸãšããŠè¡ããèšç»å€ã®äœæ¥ãé¿ããæ¯æŽäŸé ŒããŸãšããŠåŠçããã èªåŸæ§ã®ç¢ºä¿ ïŒéçºè
ã«èªåŸæ§ãäžããå
宿ã®ããææŠçãªã¿ã¹ã¯ãæäŸããã ç©æ¥µçãªããŒã æåã®æ§ç¯ ïŒãªãŒããŒã¯ãããŒç¶æ
ãéèŠããèªåŸæ§ãšãã£ã¬ã³ãžã®æ©äŒãæäŸããç°å¢ãäœãã ããã«ãããéçºè
ããããŒç¶æ
ã«å
¥ãããããªããçç£æ§ãšè£œåã®è³ªãåäžãããããšãã§ããŸãã DevExã®æž¬å® ãDevExã®3次å
ãã¯ã枬å®å¯èœãªé åãç¹å®ããããã®ãã¬ãŒã ã¯ãŒã¯ãæäŸããŸããéçºè
ã®èªèãã¯ãŒã¯ãããŒãæããã ãã§ãªããå
šäœçãªKPIïŒäž»èŠæ¥çžŸææšïŒãã忥µæææšããå«ããããšãéèŠã§ãã衚1ã§ã¯ãå
æ¬çãªKPIææšãš3ã€ã®æ¬¡å
ã«æ²¿ã£ãå
·äœçãªèªèããã³ã¯ãŒã¯ãããŒæž¬å®ã®äŸã瀺ããŠããŸãã 衚1 ãã£ãŒãããã¯ã«ãŒã èªç¥è² è· ãããŒç¶æ
èªè (人éã®æ
åºŠãšæèŠ) - èªåãã¹ãã®é床ãšåºåã«å¯Ÿããæºè¶³åºŠ - ã³ãŒãããŒã¹ã®è€éãã®èªè - éäžããŠäžæãé¿ããèœåã®èªè - ããŒã«ã«å€æŽãæ€èšŒããã®ã«ãããæéã«å¯Ÿããæºè¶³åºŠ - æ¬çªã·ã¹ãã ã®ãããã°ã®å®¹æã - ã¿ã¹ã¯ããããžã§ã¯ãç®æšã®æç¢ºãã«å¯Ÿããæºè¶³åºŠ - æ¬çªã«å€æŽããããã€ããã®ã«ãããæéã«å¯Ÿããæºè¶³åºŠ - ããã¥ã¡ã³ãçè§£ã®å®¹æã - ãªã³ã³ãŒã«ã®éã®äžææ§ã®èªè ã¯ãŒã¯ãã㌠(ã·ã¹ãã ãšããã»ã¹ã®è¡å) - CIçµæãçæããã®ã«ãããæé - æè¡ç質åã«å¯ŸããåçãåŸãã®ã«ãããæé - äŒè°ãäžæãªãã§ãããã¯ããæéã®æ° - ã³ãŒãã¬ãã¥ãŒã®ã¿ãŒã³ã¢ã©ãŠã³ãã¿ã€ã - 倿Žããããã€ããããã«å¿
èŠãªæåã¹ããã - èšç»å€ã®ã¿ã¹ã¯ããªã¯ãšã¹ãã®é »åºŠ - ãããã€ãªãŒãã¿ã€ã ïŒå€æŽãæ¬çªã«ãªãªãŒã¹ãããŸã§ã®æéïŒ - ããã¥ã¡ã³ãã®æ¹åé »åºŠ - ããŒã ã®æ³šæãå¿
èŠãšããã€ã³ã·ãã³ãã®é »åºŠ KPI (忥µæææš) - ãœãããŠã§ã¢æäŸã®å
šäœçãªå®¹æãã®èªè - åŸæ¥å¡ã®ãšã³ã²ãŒãžã¡ã³ããæºè¶³åºŠ - èªèãããçç£æ§ ææ°ã®èª¿æ»çµæ DX瀟ã«ããDevExã®æšªæç調æ»ãè¡ãããŸããããã®èª¿æ»ã¯ãDX瀟ã®é¡§å®¢ã®äžããç 究調æ»ã«ååãã219人ããã®åçãåºã«ããŠããŸããã¢ã³ã±ãŒãã«åçãã人ã®ãã¡ã170人ïŒ77.6ïŒ
ïŒããã¯ãããžãŒãäž»ãªäºæ¥ãšããäŒæ¥ã®ç€Ÿå¡ã§ããã200人ïŒ91.3ïŒ
ïŒãåŸæ¥å¡æ°500人以äžã®äŒæ¥ïŒäžå
ãŸãã¯å€§äŒæ¥ã®ãããå€ïŒã«å€åããŠããŸããã 以äžã«ã調æ»ã»åæçµæã®éèŠãªãã€ã³ãã瀺ããŸãã ãããŒç¶æ
æ·±ãäœæ¥ã«æéãå²ãéçºè
ã¯ãçç£æ§ã50ïŒ
åäžããã éäžæéã確ä¿ããäžæãæå°éã«æããããšãéèŠã é
åçãªä»äºãããŠããéçºè
ã¯ãçç£æ§ã30ïŒ
åäžããã ã¿ã¹ã¯é
åãåèããçãå°œãçå矀ãé²ãããšãå¿
èŠã èªç¥çè² è· ã³ãŒãã®ç解床ãé«ãéçºè
ã¯ãçç£æ§ã42ïŒ
åäžããã ã³ãŒããæç¢ºã§ã·ã³ãã«ã«ããååã«ææžåããããšãéèŠã çŽæçã§äœ¿ããããããŒã«ãããã»ã¹ã¯ã驿°æ§ã50ïŒ
åäžãããã ãã£ãŒãããã¯ã«ãŒã ã³ãŒãã¬ãã¥ãŒã®ã¿ãŒã³ã¢ã©ãŠã³ãã¿ã€ã ãæ©ããšã驿°æ§ïŒinnovativeïŒã20ïŒ
åäžããã ç·å¯ãªãã£ãŒãããã¯ã«ãŒãã¯ãæè¡çè² åµã50ïŒ
æžå°ãããã 質åã«è¿
éã«åçããããšããæè¡çè² åµãæžããéµãšãªãã DevEx æ¹åã®ããã«ã¯ã©ããã£ãŠçµç¹ã«æè³ãããã ç ç©¶ã®çµæãDevExã®æ¹åã¯å人ãããŒã ããããŠçµç¹ã«ãšã£ãŠãã©ã¹ã®çµæãçã¿åºããšãã蚌æ ãæããã«ãªããŸããããããããã®ããŒã¿ãèŠãã ãã§ã¯ãçµç¹ãæ¹åã«åããŠèµãåããšã¯éããŸããã ããã§ãããŒã¿ããªãã³ãã€ç¶ç¶çãªæ¹åãå§ããããã®5ã€ã®ã¹ããããææ¡ãããŠããŸãã çŸåšã®éçºè
äœéšã®ããŒã¿åé éçºè
ã®äœéšãææ¡ããããã«ããŒã¿ãåéãããããã«ã¯ãã¢ã³ã±ãŒããå°çšããŒã«ã䜿çšããŠçŸåšã®èª²é¡ãæ¹åç¹ãæããã«ããããšãå«ãŸããã ããŒã¿ã«åºã¥ããŠç®æšèšå® åéããããŒã¿ãå
ã«ãæ¹åãã¹ããã€ã³ããç¹å®ããç®æšãèšå®ãããããžãã¹ã®åªå
äºé
ãšãç
§ããåãããã ããŒã ã®æåããµããŒã èšå®ããç®æšãéæããããã«ãããŒã ã«å¿
èŠãªæ¯æŽãæäŸãããç®æšãå
±æãã鲿ã宿çã«ç¢ºèªããã 鲿ãå
±æããæè³ãè©äŸ¡ éçºè
ãé¢ä¿è
ã«é²æãå ±åããæè³ã®å¹æãè©äŸ¡ãããåŠãã ããšãé©ããç¹ãå
±æããæ¹åçã調æŽããã ããã»ã¹ãç¹°ãè¿ã åã³ããŒã¿ãåéããããã»ã¹ãèŠçŽããŠæ¹åããã3ïœ6ã¶æããšã«ãã®ãµã€ã¯ã«ãç¹°ãè¿ãã ããããããŒãšã¯ã¹ããªãšã³ã¹ïŒDevExïŒæ¹åã®éèŠæ§ æ¥æ¬ã§ã¯ãããããããŒãšã¯ã¹ããªãšã³ã¹ïŒDevExïŒã®æ¹åã«é¢ããç ç©¶ã¯ãŸã ãŸã ããããã ãšèšãããŠããŸãããããããããããä»åŸã®ITæ¥çã®ç«¶äºåã倧ããå·Šå³ããéèŠãªèŠçŽ ãšãªãã§ãããã æ¥æ¬CTOåäŒãæ¯å¹Žå®æœããŠãããéçºè
äœéšãã©ã³ãåãã®èª¿æ»ã¯ããã§ã«äžéšã®äŒæ¥ã«ãšã£ãŠéèŠãªææšãšãªã£ãŠããŸãããä»åŸã¯ããã«å®éã®DevExã«åºã¥ãããšããã³ã¹ããŒã¿ã掻çšããããšãæ±ããããŸãã äŸãã°ãã¢ã¡ãªã«ããšãŒãããã®ITäŒæ¥ã§ã¯ãDevExã®æ¹åãäŒæ¥æåã®äžç°ãšããŠæµžéããŠãããåªç§ãªäººæã®ç¢ºä¿ã瀟å¡ã®æºè¶³åºŠåäžã«çŽçµããŠããŸãã è«æ "DevEx: What Actually Drives Productivity" ã«ã¯å®éã®eBayãšãã¡ã€ã¶ãŒã®å®äŸãèŒã£ãŠããŸã ããã«ãããäŒæ¥ã®ã€ãããŒã·ã§ã³èœåãåžå Žã§ã®ç«¶äºåãåçã«åäžããŠããŸãã æ¥æ¬ã®ITäŒæ¥ããã®æœ®æµã«ä¹ãé
ããããšãªããDevExã®éèŠæ§ãèªèããç©æ¥µçã«æ¹åã«åãçµãå¿
èŠããããŸãã å
·äœçãªåãçµã¿ãšããŠã¯ãéçºããŒã«ãããã»ã¹ã®æ¹åãç¶ç¶çãªãã£ãŒãããã¯ã«ãŒãã®ç¢ºç«ããšã³ãžãã¢ã®æè²ãšã¹ãã«ã¢ããã®æ¯æŽãªã©ãæããããŸãããããã®æœçãéããŠãéçºè
ãã¹ãã¬ã¹ãªãå¹ççã«ä»äºãé²ããããç°å¢ãæŽããããšãã§ããŸãããŸããããŒã¿ã«åºã¥ããè©äŸ¡ãšæ¹åãç¹°ãè¿ãããšã§ãããå
·äœçã§å¹æçãªDevExã®åäžãæåŸ
ã§ããŸãã ãŸãããŒã ã»ããããžãŒã®ã€ããŒããªã³ã°ããŒã ãšããŠDevExããŒã ãç«ã¡äžããŠããããããããŸããã å®éã®DevExããŒã¿ã調æ»ãããããã«ãªãã°ãæ¥æ¬ã®ãšã³ãžãã¢ã®DevExãžã®æè³ãèŠçŽããããããããŸããã DevExã®ç¶ç¶çæ¹åãµã€ã¯ã«ãåããçµæãšããŠãäŒæ¥å
šäœã®çç£æ§ãåµé æ§ãé«ãŸããã²ããŠã¯æ¥æ¬ã®ITæ¥çå
šäœã®ç«¶äºåã匷åãããã¯ãã§ãã çµå¶è
ããããžã£ãŒã®çæ§ãçå
ããŠDevExæ¹åã«åãçµã¿ã次äžä»£ã®ITç£æ¥ããªãŒãããäŒæ¥ãšããŠã®å°äœã確ç«ãããã£ã³ã¹ã ãšç§ã¯æããŸãã *1 : Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations"ïŒéŠé¡ãLeanãšDevOpsã®ç§åŠïŒ»Accelerate ãã¯ãããžãŒã®æŠç¥ç掻çšãçµç¹å€é©ãå éãããïŒ
ããã«ã¡ã¯ïŒãã¡ã€ã³ãã£ã§Findy Team+éçºããŒã ã®EMãããŠãã æµç° ã§ãã æšä»ãéçºçç£æ§ãé«ããããã®åãçµã¿ãè¡ã£ãŠããçµç¹ãå¢ããŠããŠãããšæããŠããŸãã éçºçç£æ§ãåäžãããããã«ã¯ããŸãã¯å®éçã«å¯èŠåããããšãéèŠã§ãã å¯èŠåããããšã§çŸç¶ãææ¡ããŠãéçºçµç¹ã®äŒžã³ãããçºèŠãããã課é¡ãæããã«ããæ¹åæŽ»åã«åãçµã¿ããããªããŸãã äžæ¹ãå®éçãªææšã«çŠç¹ãåœãŠãããŠããŸãæ¬è³ªçã§ã¯ãªã察å¿ãããŠããŸããææšã¯åäžãããã®ã®å®éã®çç£æ§ã¯åäžããŠããªãã£ããããããæªåããŠããŸãããšããããŸãã ãã®èšäºã§ã¯ãéçºçç£æ§ææšãåäžãããããã«ãã£ãŠã¯ãããªãã¢ã³ããã¿ãŒã³ã«ã€ããŠç޹ä»ããŸãã ãããã€é »åºŠãåäžãããããã«ããããã€ããã»ã¹ã¯å€æŽããã«å®æœåæ°ãå¢ããã ãããã€é »åºŠã¯ DORA ãæå±ããDevOpsã®4ã€ã®ææš(Four Keys)ã®1ã€ã§ãããéçºçç£æ§ã®é«ãéçºçµç¹ã¯ãã®æ°å€ãé«ããšãããŠããŸãã ãã®ãããéçºçç£æ§ãåäžãããããšèãããšãã«æåã«åãçµãããšãå€ãææšã§ãã ãããã€é »åºŠã¯ãã åäžãããã ãã§ããã°ç°¡åã«åäžãããããšãã§ããŸãã çŸç¶ã®ãããã€ããã»ã¹ã®ãŸãŸå®æœåæ°ãå¢ããã°è¯ãã®ã§ãã ãããã€ããåæ°ãå¢ããã ãã§ãããã€é »åºŠãåäžããŠéçºçç£æ§ãåäžããããšããããŸãããã»ãšãã©ã®å Žåã¯ãããã€é »åºŠã ããåäžããã ãã§éçºçç£æ§ã¯åäžããŸããã é«ããããã€é »åºŠã¯ãCI/CDãèªååãããŠããããå°ããªãããåäœã§ã³ãŒãããŒã¹ã«å€æŽãå
¥ããããšãã§ããŠãããããã¹ãèªååã«ãã倿Žã®ãªã¹ã¯ãäœæžãããŠãããªã©ãæ§ã
ãªãã©ã¯ãã£ã¹ãå®è·µã§ããŠããçµæãšããŠåŸããããã®ã§ãã ãããã®åæãæºãããªããŸãŸãããã€é »åºŠãåäžãããããšã¯ã倿Žé害çãäžãã£ãŠé害察å¿ããæéãå¢å ãããããããã€ãããããšèªäœã®æéã§éçºããæéãæžã£ãŠããŸããªã©éçºçç£æ§ãæªåãããå¯èœæ§ããããŸãã ç¡çãããããã€é »åºŠã ããå¢ããã®ã§ã¯ãªããåè¿°ãããã©ã¯ãã£ã¹ãå®è·µãããšããšã§ãç¡çãªããããã€é »åºŠãåäžãããŠãããŸãããã ãªãŒãã¿ã€ã ãççž®ããããã«ãå
šãŠå®è£
ãçµãã£ãŠããã³ããããã éçºçç£æ§ãå¯èŠåããéããªãŒãã¿ã€ã ãææšãšããŠèšå®ããããšã¯æå¹ã§ãã ãªãããªãŒãã¿ã€ã ã«ã¯æ§ã
ãªå®çŸ©ããããŸãããä»åã¯Git/GitHubãæŽ»çšããã³ãããããŠããã¡ã€ã³ãã©ã³ãã«ããŒãžããããŸã§ã®æéããªãŒãã¿ã€ã ãšå®çŸ©ããŸãã äžèšã®ãªãŒãã¿ã€ã ã®å®çŸ©ã«ã¯æ¬ ç¹ããããŸããGitã®ä»çµã¿äžãã©ã³ããåã£ãæéãèšé²ãããªããããéçºã«çæããŠãããã¡ãŒã¹ãã³ããããŸã§ã®æéãå
¥ã£ãŠããŸããã ãããéæã«ãšã£ãŠããªãŒãã¿ã€ã ãççž®ããããã«å
šãŠå®è£
ãçµãã£ãŠããã³ããããããšããã¢ã³ããã¿ãŒã³ãçãŸããŸãã ãã ããã®ãããªããšãããŠãæ°å€ã ããççž®ãããã ãã§éçºã«äœ¿ã£ãŠããæéã¯å€ãããŸããã ããã©ããããã³ããããé©åãªç²åºŠã§è¡ããªãããšã§ãã³ããããã°ãèŠã¥ãããªã£ãããå°ãåã®ç¶æ
ã«æ»ãããããããšãå°é£ã«ãªããŸãã æ¬æ¥ããããããšã¯æ£ããææšãååŸããŠäŒžã³ãããèŠã€ããŠæ¬è³ªçãªæ¹åã«ç¹ããããšã§ãã ãã®ãããªæ°å€ããã¯ã¯ããã ç¡æå³ãªã ãã§ã¯ãªããã³ãŒã管çã®å±¥æŽã掻çšãã¥ãããªã£ãããæ£ããæ°å€ãå¯èŠåããŠãããæ°ã¥ããã¯ãã ã£ã課é¡ãèŠéããŠããŸãå¯èœæ§ããããããããŸãããã ãªãŒãã¿ã€ã ãççž®ããããã«ãå¿
èŠä»¥äžã«çްãããã«ãªã¯ãšã¹ããäœæãã ãªãŒãã¿ã€ã ãçããããã©ã¯ãã£ã¹ãšããŠã1ã€1ã€ã®å€æŽãå°ããããããšããããŸãã 1ã€1ã€ã®å€æŽãå°ããããšã§ãå®è£
ã®æéãçããªãã圱é¿ç¯å²ãå°ãããããã¹ãã容æã«ãªãããªãŒãã¿ã€ã ãåäžããŸãã 倿Žãµã€ãºãå°ããããšãå¯èŠåããããã«ã¯ããã«ãªã¯ãšã¹ãæ°ãææšãšããããšãããããã§ãã 倿Žãµã€ãºãå°ããâãããããã«ãªã¯ãšã¹ããããŒãžã§ããâãã«ãªã¯ãšã¹ãæ°ãå¢å ããšããããžãã¯ã§ãã ãã ããã«ãªã¯ãšã¹ãæ°ãææšãšããå Žåãå¿
èŠä»¥äžã«çްãããã«ãªã¯ãšã¹ããäœæããã¢ã³ããã¿ãŒã³ãçãŸããŸãã äŸãã°äžæ¬å€æã§ã§ããæ©æ¢°çãªä¿®æ£ã§ããã°ããããè€æ°ãã¡ã€ã«ã«æž¡ã£ãŠãããšããŠã1ãã«ãªã¯ãšã¹ãã«ãŸãšããã¹ãã§ãã ããããã¡ã€ã«ããšã«ãã«ãªã¯ãšã¹ããåå²ããå Žåããã«ãªã¯ãšã¹ãæ°ã¯å¢å ããŸãããåå²ã®æéãã¬ãã¥ã¢ãŒã®è² è·ãå¢å ããããšã§éçºçç£æ§ã¯æªåããŸãã ãã«ãªã¯ãšã¹ãæ°ã¯ãããŸã§é©åãªç²åºŠã«åå²ã§ããŠããããšã確èªããããã®ææšãªã®ã§ãæ°ã ããè¿œãæ±ããªãããã«ããŸãããã ãã«ãªã¯ãšã¹ãã®ç²åºŠã«ã€ããŠã¯å¥ã®èšäºã§è©³ãã玹ä»ããŠããŸãã®ã§ããã²ã芧ãã ããã tech.findy.co.jp ã¬ãã¥ãŒããã»ã¹ã«æéããããã®ã§ãã³ãŒãã¬ãã¥ãŒãçç¥ããŠããŒãžãã ãªãŒãã¿ã€ã ã«çç®ããéãã³ãŒãã¬ãã¥ãŒã«æéãããã£ãŠããããšã課é¡ãšããŠæµ®ãã³äžããããšããããŸãã ãã®èª²é¡ãæ£æ»æ³ã§è§£æ±ºããå Žåãã³ãŒãã¬ãã¥ãŒã«æéãããã£ãŠããçç±ãåæããŠã課é¡ãè§£æ¶ããå¿
èŠããããŸãã 以äžã«ãããã課é¡ãšè§£æ±ºäŸãæããŸã ã¬ãã¥ã¢ãŒãç¹å®ã®äººç©ã«éäžããŠããã®ã§ã¬ãã¥ã¢ãŒãå¢ãããŠåæ£ãã ãã«ãªã¯ãšã¹ãã®ãµã€ãºã倧ããããšã§ã¬ãã¥ãŒã«æéããããã®ã§ããã«ãªã¯ãšã¹ãã®ãµã€ãºãå°ãããã ã€ã³ãã³ããæžãæ¹ã®ææãå€ãã®ã§ããªã³ã¿ãŒããã©ãŒããã¿ãå°å
¥ããŠæ©æ¢°çã«æ€ç¥ã§ããææã¯èªååãã ææãå€ããªãããåãã«æéãããã£ãŠããã®ã§ããã¢ãã/ã¢ããããå°å
¥ãã äžæ¹ã§ã¬ãã¥ãŒã«ããã£ãŠããæéãæãç°¡åã«åæžããæ¹æ³ã¯ã³ãŒãã¬ãã¥ãŒãçç¥ããããšã§ãã ãã ããã³ãŒãã¬ãã¥ãŒãçç¥ããããšã¯ãå§ãã§ããŸããã ã³ãŒãã¬ãã¥ãŒãããããšã§ãã°ã®çºèŠãã³ãŒãå質ã®åäžã«ã€ãªãã£ãããã³ãŒãã®å
容ãå®è£
è
ãšã¬ãã¥ã¢ãŒã§å
±æããããšã§ã³ãŒãã®å±äººåã軜æžã§ããããã¬ãã¥ã¢ãŒã®ç®ãéãããšã§ç¬¬äžè
ãèªã¿ãããã³ãŒãã«ãªãä¿å®æ§ãåäžããŸãã ã³ãŒãã¬ãã¥ãŒã¯ãšãŠãææçŸ©ãªæŽ»åãªã®ã§ãçç¥ããã«æ ¹æ¬è§£æ±ºããããšã§ææçŸ©ã«ã¬ãã¥ãŒãã€ã€ãªãŒãã¿ã€ã ãåäžãããŸãããã ãã«ãªã¯ãšã¹ãã®ãµã€ãºãå°ããããããã«ãã¹ãã³ãŒããå¥ã®ãã«ãªã¯ãšã¹ãã«ãã æå³ã®ããæå°åäœã§ãã«ãªã¯ãšã¹ããäœæããŠãå°ããåäœã§ãµã¯ãµã¯ããŒãžããŠããããšã¯éçºçç£æ§ãåäžãããããã®æå¹ãªãã©ã¯ãã£ã¹ã§ãã ãã«ãªã¯ãšã¹ããå°ããããéããã¹ãã³ãŒããå¥ã®ãã«ãªã¯ãšã¹ãã«åããããªãããšããããŸãã 1ã€ç®ã®ãã«ãªã¯ãšã¹ãã§ãã¹ãã³ãŒããªãã®ã³ãŒãã®ã¿å®è£
ããŠã2ã€ç®ã®ãã«ãªã¯ãšã¹ãã§ãã®ãã¹ãã³ãŒããæžããšããæ¹æ³ã§ãã ãã®æ¹æ³ã¯ãã«ãªã¯ãšã¹ãã®ãµã€ãºãå°ããã§ããŸãããäžæçãšã¯ãããã¹ãã³ãŒãã§å®ãããŠããªãã³ãŒããã¡ã€ã³ãã©ã³ãã«æ··å
¥ããããšã«ãªããŸãã ãã¹ãã§å®ãããŠããªãã³ãŒãã¯äœãããã®å€æŽã§äžå
·åãæ··å
¥ããŠãæ°ã¥ãããšãã§ããªããããå質äœäžã«ã€ãªãããŸãã ãŸããããã«ãã¹ãã³ãŒãã远å ãããã°è¯ãã§ãããå¥ã«ããããšã§ãã¹ãã³ãŒãã®å®è£
ãå¿ããŠããŸãå¯èœæ§ãé«ãŸããŸãã ã³ãŒããšå¯Ÿå¿ãããã¹ãã³ãŒãã¯1ã€ã®ãã«ãªã¯ãšã¹ãã«å«ãããã¹ãã³ãŒãã§å®ãããŠããªãã³ãŒããã¡ã€ã³ãã©ã³ãã«æ··å
¥ããªãããã«ããŸãããã 倿Žé害çãäžããããã«ããããã€é »åºŠãäžãã 倿Žé害çã¯DORAãæå±ããDevOpsã®4ã€ã®ææš(Four Keys)ã®1ã€ã§ããããããã€ãèµ·å ãšããæ¬çªé害ã®çºç確çãæããŠããŸãã ãŸããéçºçç£æ§ã«é¢ä¿ãªãã倿Žé害çã¯é¢ä¿è
å
šå¡ãäœãä¿ã¡ãããšé¡ã£ãŠããã®ã§ã¯ãªãã§ããããã æ¬çªé害ãçºçããæå€§ã®åå ã¯ãããã€ã§äžå
·åãæ··å
¥ãããŠããŸãããšã§ãã ãã®ããããããã€ããããšã«æ
éã«ãªãããããã€é »åºŠãäœäžããŠããŸãããšããããŸãã ãããã倿Žé害çãäžããããã«ãããã€é »åºŠãäžããããšã¯ã¢ã³ããã¿ãŒã³ã§ãã ãããã€é »åºŠãäžããŠã1åã®ãããã€ã«å«ãŸãã倿Žéãå¢ããããšã§æ¬¡ã®åé¡ãçºçããŸãã 倿Žå
容ãè€éã«ãªããçžäºäœçšãäºæãã¬çµæãçºçããå¯èœæ§ãé«ããªããæ¬çªé害ãçºçãããªã¹ã¯ãé«ãŸã ãã¹ãç¯å²ãåºããªãããããã¹ãæŒããçºçããå¯èœæ§ãé«ããªããæ¬çªé害ãçºçãããªã¹ã¯ãé«ãŸã é害ãçºçããéãåå ç¹å®ã«æéãããããå¹³å修埩æéãå¢å ãã 圱é¿ç¯å²ã倧ãããªããããé害ã®åœ±é¿ç¯å²ãåºããªãå¯èœæ§ãé«ãŸã 倿Žé害çãäžããããã®ãã©ã¯ãã£ã¹ã¯ããããã€1åãããã®å€æŽéãå°ããããããšã§ãã 倿Žéãå°ããããšã§ã倿Žç¯å²ãæ£ç¢ºã«ææ¡ã§ããã®ã§ããã¹ãã容æã«ãªã£ãŠãã¹ãã®ãªãŒãã¿ã€ã ãççž®ã§ãããããã¹ã粟床ãåäžããããšã§å質ãåäžããŸãã ãŸããé »ç¹ã«ãããã€ããããã«ã¯èªåãã¹ããå
å®ãããããšãéèŠã§ããèªåãã¹ããå
å®ããŠããããšã§æ¢åæ©èœãå£ããŠããªãããšãèªåçã«ç¢ºèªã§ãããããªãŒãã¿ã€ã ã®åäžãå質ã®åäžã«ã€ãªãããŸãã ãããã€ãéåºŠã«æããããããã€ãããã®å€æŽéãå°ããããããèªåãã¹ããå
å®ããããªã©éçºçç£æ§ãåäžããããã©ã¯ãã£ã¹ãåãå
¥ããããšã§å€æŽé害çãäžããŸãããã 倿Žé害çãäžããããã«ãhotfixã§ã®å¯Ÿå¿ãåºãæãã¿ãã 倿Žé害çãå¯èŠåããããã«ãhotfixã®æ°ããç®åºããããšããããŸãã åè¿°ããéãã倿Žé害çã¯èª°ããäœãä¿ã¡ããææšã§ãã ãã®ãããæ¬æ¥ã¯hotfixã§å³å¯Ÿå¿ããæ¹ããã¹ãã ãšããã£ãŠããå Žåã§ããéåžžãããŒã§å¯Ÿå¿ããŠããŸãããšããããŸãã hotfixã䜿ããªãããšã§ã倿Žé害ã«ã«ãŠã³ããããªãã®ã§çµæãšããŠå€æŽé害çã¯äžãããããããŸããã ãã ããhotfixã䜿ããªãã£ããããšãã£ãŠçºçããé害ããªããªãããã§ã¯ãããŸããã ãŸããæ¬æ¥ã¯å€æŽé害çã«èšäžãããã¹ããã®ãèšäžããªãããšã§ãæ¯ãè¿ããªã©ã§èª²é¡ã«æ°ã¥ãã¥ãããªããèªåãã¡ã®æé·æ©äŒã劚ããå¯èœæ§ããããŸãã éçºçç£æ§ã®å¯èŠåãèªåãã¡ã®æé·æ©äŒã«ç¹ããããã«ããæ°å€ãè¯ãããããšã°ããã«æ³šç®ããã®ã§ã¯ãªããæ£ããåãããã«å¿ãããŸãããã ãŸãšã ãããŸã§ã§ç޹ä»ããã¢ã³ããã¿ãŒã³ã¯éçºçç£æ§ã®æ°å€ãé«ããããã®çµç¹ã®èœåã«æ³šç®ããã«ãæ°å€ãåäžãããããšã ããç®æšã«èšå®ããŠããŸã£ãããã«çºçããŠãããã®ãå€ãã§ãã ãã®ããšã¯ãã°ããããŒãã®æ³åããšããŠåºãç¥ãããŠããŸãã 以äžãChatGPTã«ãã説æã§ãã ã°ããããŒãã®æ³åïŒGoodhartâs LawïŒã¯ãçµæžåŠè
ãã£ãŒã«ãºã»ã°ããããŒããæå±ããæŠå¿µã§ããç¹å®ã®çµ±èšçææšãæ¿çç®æšãšããŠäœ¿ããããšããã®ææšã¯ãã¯ãä¿¡é Œã§ãããã®ã§ã¯ãªããªãããšããæ³åã§ãã ã€ãŸããããææšãç®æšãšãªããšã人ã
ã¯ãã®ææšãéæããããã®è¡åãåãå§ãããããææšèªäœã®æ¬æ¥ã®æå³ãæçšæ§ã倱ããããšããããšã§ãã å®éçãªç®æšãèšå®ããããšã¯éçºçç£æ§ã®çŸåšå°ãææ¡ããããã«ã¯æå¹ã§ãããç®æšãéæããããã«æ¬æ¥åããŠããã¹ãèœåãçè§£ããã«æ°å€ã ããè¿œãæ±ããªãããã«ããŸãããã ãªããéçºçç£æ§ã®é«ãçµç¹ãç®æãããã«åããã¹ãèœåã¯ãGoogle Cloudã® DevOpsã®èœå ããšãŠãåèã«ãªããŸãã ãŸããDORA Core Modelã«ãéçºçµç¹ã®ã±ã€ãããªãã£ãšéçºçç£æ§ææšãšã®é¢ä¿ã瀺ãããŠããŸãã®ã§ããã²åèã«ããŠã¿ãŠãã ããã åºå
ž: DORAâs Research Program 6æ28æ¥ïŒéïŒã»29æ¥ïŒåïŒã«ãLeanãšDevOpsã®ç§åŠãã®èè
ã§ããNicole Forsgrenã®æ¥æ¥ããã¹ã©å
±å嵿¥è
å
CTOã®ç»å£ãªã©ãåœå
å€ã®éçºçç£æ§ã«é¢ããææ°ã®ç¥èŠãéãŸãConferenceãéå¬ããŸãã éçºçç£æ§ã«é¢ããä»ã®äŒæ¥ã®åãçµã¿ãæµ·å€ã®äºäŸã«èå³ãããæ¹ã¯ããã²ãç³ã蟌ã¿ãã ããïŒ dev-productivity-con.findy-code.io
ããã«ã¡ã¯ã Findyã§MLãšã³ãžãã¢ãããŠããyusukeshimpo( @WebY76755963 )ã§ãã ä»åã¯LLM EmbeddingãæŽ»çšããèªåå¿çBotãéçº&å°å
¥ãã瀟å
ã®åãåããæ¥åãå¹çåããããšãã§ããã®ã§ããã®åãçµã¿ã玹ä»ããŸãã Botãéçºããããšã«ãªã£ãèæ¯ åŒç€Ÿã§ã¯Slackã䜿çšããèªç€ŸãµãŒãã¹ã«é¢ãã瀟å
質åã«åçãããã£ã³ãã«ãéçšããŠããŸãã äž»ã«ããžãã¹ãµã€ãããã®æè¡çãªçåã«ãšã³ãžãã¢ãçããä»çµã¿ã§ãã 質åã¯ãã³ãã¬ãŒãã䜿ã£ãŠéä¿¡ããããšã³ãžãã¢ãåçããŸããããã®ã¯ãŒã¯ãããŒã«ã¯æ¬¡ã®ãããªåé¡ãçºçããŠããŸãã åã質åãç°ãªã人ããå±ããŠããŸã 質åã®åºŠã«ãšã³ãžãã¢ã®å·¥æ°ãçºçããŠããŸã åæã§70件以äžã®è³ªåãçºçãã1ä»¶ã«ã€ã1~1.5æéãããããšããããŸãã å€ãã®è³ªåã¯ç€Ÿå
ããã¥ã¡ã³ãã§è§£æ±ºå¯èœã§ãããæ€çŽ¢ããã¥ããå©çšãããŠããŸããã 質åã«é¢é£ããããã¥ã¡ã³ããæž¡ãããšã§ããšã³ãžãã¢ã«è³ªåããåã«èªå·±è§£æ±ºãä¿ãããšãã§ããŸãã ãããBotå°å
¥ã®èæ¯ã§ãã Botå°å
¥ã®ããã®ã¢ãããŒã Botã®èŠä»¶ã«ã€ã㊠Botãå°å
¥ããçç±ã¯ã質å察å¿ã§ãšã³ãžãã¢ã®åŽåãæžããããšã§ãã ããããKibelaïŒç€Ÿå
ã®æ
å ±å
±æããŒã«ïŒã®QïŒAéãSlackã®åãåããå±¥æŽãªã©ã®ç€Ÿå
ããã¥ã¡ã³ãã¯å
šãŠæ§é åãããŠããããæ€çŽ¢æ§ã«ä¹ãããšãã課é¡ããããŸãã ãŸããBotãå
šãŠã解決ããã®ã¯é£ããããã«ã·ããŒã·ã§ã³ïŒAIãå®éã«ã¯ååšããªãæ
å ±ãçæããçŸè±¡ïŒã®åé¡ããããŸãã ããããèžãŸããã¯ã€ãã¯ã«å®è£
ã§ããèŠä»¶ãèããŸãã ããã§Botã®æ©èœãšããŠã¯ã 質åã®å
容ã«é¢é£ããããªç€Ÿå
ããã¥ã¡ã³ããžã®ãªã³ã¯ãéã äžèšã§è§£æ±ºã§ãããã質åè
ã«ãã£ãŒãããã¯ããŠããã 解決ã§ããªãå Žåã¯ãããããŠãšã³ãžãã¢ãžè³ªåãæãã ãšãããã®ã«ããŸããã Botã®æ§æ äžèšã®èŠä»¶ãèžãŸããŠãBotã®ä»çµã¿ã¯æ¬¡ã®ããã«ããŸããã â ããŒã¿ã®ååŸ â¡ ããŒã¿ã®æ§é å ⢠é¡äŒŒåºŠèšç®ãšBotã®åç ⣠質åè
ããã®ãã£ãŒããã㯠以äžã«ãååŠçã«ã€ããŠç°¡åã«èª¬æããŸãã â ããŒã¿ã®ååŸ æåã«ããŒã¿ã®ååŸãKibelaãšSlackããAPIã䜿ã£ãŠè¡ããŸãã éå»ãã質åãšåã質åã«åçã§ããããšã瀟å
ã®åºæ¬çãªããã¥ã¡ã³ãã§è§£æ±ºããããšãèããŠãKibelaãšSlackãã£ã³ãã«ã®ã¡ãã»ãŒãžå±¥æŽãBotã§äœ¿çšããããŒã¿ã«ããŸããã â¡ããŒã¿ã®æ§é å ä»åã®éçºã§æãéèŠãªããšã®äžã€ã«ãããã¹ãããŒã¿ã®æ§é ååŠçããããŸãã ãã©ãŒããããç°ãªãããŸãã¯æŽåãããŠããªãããã¹ããæ±ããããå°éãªäœæ¥ã§å¯Ÿå¿ããŸããã 以äžã«ãéæ§é ã®ç€Ÿå
ããã¥ã¡ã³ããæ§é åããããã»ã¹ãå³ç€ºããŠããŸãã ãã®ããã»ã¹ãçµãŠãæçµçã«KibelaãšSlackããæ¬¡ã®æ
å ±ãæã£ãæ§é åããŒã¿ãäœæããŸãã ããã¥ã¡ã³ãã¿ã€ã(Kibela or Slack) ããã¹ã ããã¥ã¡ã³ãã®URL ããã¹ãã®Embedding(質åãšã®é¡äŒŒåºŠèšç®çš) ãã®ããã«æ§é åããããšã§ã質åå
容ã«åãããé¢é£ããã¥ã¡ã³ããæ€çŽ¢ããããšãã§ããããã«ãªããŸãã ããã¹ãããŒã¿åŠçåŸãã³ãµã€ã³é¡äŒŒåºŠèšç®ã®ããã«OpenAIã®text-embeddingã䜿çšããŸããã äœæããæ§é åããŒã¿ã¯Botå
ã§ä¿æããŸãã â¢é¡äŒŒåºŠèšç®ãšBotã®åç 質åè
ããã®ã€ã³ãããã§ãã質åæãEmbeddingãããã®ãšãæ§é åããŒã¿å
ã®EmbeddingããŒã¿ãšã®ã³ãµã€ã³é¡äŒŒåºŠãèšç®ããé¡äŒŒããããã¥ã¡ã³ãã®ãªã³ã¯ãæž¡ããããã«ããŸãã Botã®è¿ä¿¡å
容ãšããŠã質åãšé¡äŒŒåºŠã®é«ãããã¥ã¡ã³ãã®URLãæ¡çšããŸãã â£è³ªåè
ããã®ãã£ãŒããã㯠æåŸã«ã質åè
ãæ³å®ããŠããåçããBotãå¿çã§ããŠãããã©ãã確èªããããã»ã¹ãèšããŸããã ããã§ã¯ãæãã§ããå¿çãåŸããããã©ããããã£ãŒãããã¯ããŠãããããã£ãŒãããã¯å¥ã«ãã®åŸã®ãããŒãåããŠããŸãã ãã£ãŒãããã¯åŸã®ãããŒã«ã€ããŠã¯ãã®åŸã®å·¥å€«ããç¹ã®ãšããã§ã詳现ã説æããŸãã Botå°å
¥æã®å·¥å€« Botã®å°å
¥ã®éã«å·¥å€«ããç¹ã以äž2ç¹ããã®ã§ãããã«ã€ããŠã玹ä»ããããŠãã ããã ã¯ãŒã¯ãããŒã®å€æŽ ããŒã¿ã®æºå ã¯ãŒã¯ãããŒã®å€æŽïŒãã£ãŒãããã¯ããã»ã¹ã®è¿œå ïŒ ãã«ã·ããŒã·ã§ã³åé¡ã«å¯Ÿå¿ããçºãBotã¯ããã¹ãã§è¿çããã®ã§ã¯ãªãé¡äŒŒåºŠã®ãªã³ã¯ãè¿ä¿¡ããããã«ããŠããŸãã ããã«ããã質åè
ããªã³ã¯å
ã®ããã¥ã¡ã³ããåèã«èªå·±è§£æ±ºãä¿ãããã«ããŸããã ããããBotãææ¡ããããã¥ã¡ã³ãã§è§£æ±ºããããªãå Žåããã£ãçºãæ¢åã®ã¯ãŒã¯ãããŒãã èªå·±è§£æ±ºã§ããªãã£ãå Žåã« ããšã³ãžãã¢ãžè³ªåãšããŠåãä»ããããããã工倫ããŸããã äžèšå·¥å€«ãåãå
¥ãã倿ŽåŸã®ã¯ãŒã¯ãããŒã以äžå³ã®ããã«å€æŽããŸããã ãã®ããã«ã質åè
ãBotã®å¿çã§èªå·±è§£æ±ºã§ãããããã§ãã¯ãã解決ã§ããªãå Žåã«ããããããéžæãããšãšã³ãžãã¢ãžè³ªåãé£ã¶ä»çµã¿ãšããŠããŸãã Slack APIã«ãããã£ãŒãããã¯ã®äœææ¹æ³ åçã圹ã«ç«ã£ããã©ããã®ãã£ãŒãããã¯ãäœæããéã«ãSlack APIã«ãã以äžå®è£
ã®èŠé ã§ã質åè
ã«æè»œã«åçããŠãããããã¿ã³ãçšæããäºãã§ããŸããã @ app.action ( "feedback_yes" ) def handle_feedback_yes (ack, body, say): ack() thread_ts = body[ "message" ][ "ts" ] say( "ããªãã¯ãã¯ãããæŒããŸãã \n ãã£ãŒãããã¯ãããããšãããããŸãïŒä»ã«ãåãåãããããå Žåã¯ãã©ãŒã ãããé¡ãããããŸãã" , thread_ts=thread_ts) @ app.action ( "feedback_no" ) def handle_feedback_no (ack, body, say): ack() thread_ts = body[ "message" ][ "ts" ] user_group_id = "hoge" # Slackã°ã«ãŒãIDïŒã¡ã³ã·ã§ã³å
ïŒ say(f "ããªãã¯ããããããæŒããŸãã \n <!subteam^{user_group_id}> \n äžèšã®ãåãåãããæ¥ãŠããã®ã§ã察å¿ãé¡ãããããŸãïŒ" , thread_ts=thread_ts) ãã®ããã«ããã£ãŒãããã¯ã¹ããããç°¡æã«çµã¿èŸŒãäºãã§ãããããã§ãBotã§ã©ã®ãããèªå·±è§£æ±ºãä¿ãäºãã§ãããã©ãããåŸè¿°ã®ããã«å¯èŠåã§ããŸããã å°å
¥æç¹ã§çµã¿èŸŒãã§ãããäºã§ãè©äŸ¡çšããã»ã¹ã®è¿œå å®è£
ãå¥ã§å®è£
ããçã®æéãçãäºãã§ããŸããã ããŒã¿ã®æºå å
è¿°ã®éããä»åã®ä»çµã¿ã«ããBotãå®è£
ããã«ããããå¿ç粟床ãé«ããã«ã¯æ§ã
ãªåœ¢åŒã§ä¿åãããŠããããã¹ãããŒã¿ã® ã¯ãªãŒãã³ã°ãå å·¥ ã¯éèŠãªãã€ã³ãã®1ã€ã§ããã ãããŸã§ãBotãæ§ç¯ã瀟å
ããã¥ã¡ã³ããæ€çŽ¢ãããããªçšéã§åç
§ããäºãæ³å®ããŠããªãã£ãçºã«ãä»åã®çšéã«åãããŠããŒã¿ãäžå¯§ã«å å·¥ããäºã§ãå¿ç粟床ãé«ããäºãã§ããŸããã ä»å玹ä»ããä»çµã¿ã§èªåå¿çBotã®ããŒã¿ãšããŠå¿çšããäºãæ€èšããå Žåã¯ãããã¥ã¡ã³ããæ§é åãããããæŽçãããŠããããæèãããŠãããšå®è£
ã³ã¹ããåæžã§ããããã«ãªããšæããŸããã äŸãã°ãKibelaã®ãããªèªç±èšè¿°ã®ããã¹ãã§ããã°ããã³ãã¬ãŒããçšæããçããŠåœ¢åŒãçµ±äžãããšååŠçãæ¥œã«ãªããŸãã 瀟å
ããã¥ã¡ã³ãã®æŽåã«ã¯æéããããããæ¬é ãããã¡ã§ããããã®ãããªçšéã«å©çšã§ããããšããããã°ã瀟å
ããã¥ã¡ã³ãã®æŽåã«æéãå²ãããããªãããã«æããŸãããã Botå°å
¥ã®çµæ 瀟å
ã®åãåãããªãã¬ãŒã·ã§ã³ãæ¹åã§ãã å®éã«Botãå°å
¥ããŠã¿ãŠå·¥æ°ã®åæžãã§ããã®ããéèšããŠã¿ãŸããã å°å
¥åŸ2ã¶æã§ããåãåãã察å¿ã«ãããæèŠæéã 1/3æžå° ããäºã«è²¢ç®ããŠããäºãããããŸããã ãªãã¬ãŒã·ã§ã³ã®æ¹åã«ãªã£ããã€ã³ã ãã®ããã«å¹çåã§ãããã€ã³ãã¯ã åãåãã察å¿ã®ã¯ãŒã¯ãããŒãæ¹åã§ãã ããšã§ãã ä»ãŸã§ã¯ã©ããªè³ªåã§ãåãåãããšããŠéä¿¡ããŠãããã®ããBotã«ããèªå·±è§£æ±ºãä¿ãããã»ã¹ãçµã¿èŸŒãã ã¯ãŒã¯ãããŒã«ã§ããäºã§ã æ¬æ¥ã§ããã°èªå·±è§£æ±ºããäºãã§ãã質åãçãåºãäºãã§ããããã«ãªã£ããã ã ãšæ¯ãè¿ã£ãŠããŸãã BotãåçŽã«å°å
¥ããã ãã§ãªããä»åã®è©äŸ¡ããã»ã¹ã®ããã«ãã©ããªèª²é¡ã«å¯ŸããŠã©ã®ããã«Botãçµã¿èŸŒã¿å¹ççãªä»çµã¿ãäœããããæèããããšã倧åã§ãã Botã®ç²ŸåºŠã¯ä»åŸç€Ÿå
ããã¥ã¡ã³ããå
å®ãããããšã§æ¹åãããŠãããŸããã質åãžã®å¯Ÿå¿æéåæžã¯å®çŸã§ããã®ã§å°å
¥ããç²æã¯ãããŸããã Botã§ç€Ÿå
åãã®åãåãã察å¿ã®å¹çåãããããšããæ¹ã¯ãã²åèã«ããŠããã ããã°ãšæããŸãïŒ æåŸã« 以äžã瀟å
ãåãåããã®èªååBotã®éçºã«ã€ããŠã§ããã åèã«ããŠããã ããã°å¹žãã§ãã ãŸããåŒç€Ÿã§ã¯æ©æ¢°åŠç¿ãšã³ãžãã¢ã»ããŒã¿ãšã³ãžãã¢ãªã©äžç·ã«åããŠãããã¡ã³ããŒãåéããŠãããŸãã èå³ãããæ¹ã¯âãããå¿åããŠããŠããã ããã°ãšæããŸãã herp.careers
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã åŒç€Ÿã§ã¯æ¬çªç°å¢ãžã®ãããã€ã1æ¥ã«è€æ°åå®è¡ããŠããŸãããæ¬çªç°å¢ã§ã®äžå
·åã®çºççã¯äœãã§ãã æ¬¡ã®ç»åã¯åŒç€Ÿã®ãããããã¯ãã®çŽè¿1幎ã®Four Keysã®æ°å€ã§ãã å¹³åã§1æ¥2.3åã®æ¬çªãããã€ãè¡ã£ãŠããŸããã倿Žé害çã¯0.4%çšåºŠãç¶æããŠããŸããåçŽèšç®ã§ããã1幎ã§é害ã2ä»¶çšåºŠã®æ°Žæºã§ãã ãŸããå¹³å修埩æéã¯0.3hãšãªã£ãŠãããé害ãçºçããŠã20å以å
ã«ã¯åŸ©æ§ã§ããŠããããšãããããŸãã ãã®æ°å€ãç¶æã§ããŠããçç±ã®1ã€ã«ãã¹ãã³ãŒãã®å質ããããšèããŠããŸãã ã·ã¹ãã ã§çºçããäžå
·åãèªåãã¹ããæ€ç¥ããããšã§æ¬çªç°å¢ãžã®äžå
·åã®æ··å
¥ãäºåã«é²ãããšãã§ããä»®ã«äžå
·åãçºçãããšããŠãä¿®æ£å
容ãä»ã®ç®æã«åœ±é¿ãåºãªãããšããã¹ãã³ãŒããä¿èšŒããŠãããããè¿
éã«ä¿®æ£ã§ããããã§ãã åŒç€Ÿã§ã¯ãã¹ãã«ãã¬ããžãããããã¹ãã§äœãå®ãã®ãïŒãšãã芳ç¹ãéèŠããŠããŸãããã®äžã§ãã¹ãã«ãã¬ããžã®90ïŒ
è¶
ãã¯çããããšã§ã¯ãããŸããã ããããå®éã«ã¯ã«ãã¬ããžãæèããããšã¯ãªããã·ã¹ãã ãå®ããã¹ããæèããçµæãåæã«ã«ãã¬ããžãäžãã£ãŠããã ããªã®ã§ãã æã
ãšããŠã¯ãå
šãŠã®ãã¹ãã³ãŒããéããããšãããããã³ã±ãã¹ãæã«ã³ã±ããã¹ãã³ãŒããã®æ¹ãéèŠã ãšå®çŸ©ããŠããŸãã ãã®èšäºã§ã¯ãåŒç€Ÿã§å®è·µããŠããããã¹ããéãããã®ãã¹ãã³ãŒããã§ã¯ãªãããã·ã¹ãã ãå®ããã¹ãã³ãŒããã®æžãæ¹ãããã€ã玹ä»ããŠãããŸãã ããã§ã¯èŠãŠãããŸãããïŒ å®äŸçŽ¹ä» é¢æ°ã®å®è¡ç¶æ
ã®ãã§ã㯠åºå察象å€ã®ãã§ã㯠ãã§ãã¯ããå€ã®å³å¯å ãŸãšã å®äŸçŽ¹ä» é¢æ°ã®å®è¡ç¶æ
ã®ãã§ã㯠ç¹å®ã®åŠçãå®è¡ããããšã«ãçµæã«å¿ããŠã³ãŒã«ããã¯é¢æ°ãå®è¡ãããããªã±ãŒã¹ã¯å°ãªããããŸããã ã³ã³ããŒãã³ãã«é¢æ°ãæž¡ãããã¿ã³ãã¯ãªãã¯ããæã«ãã®é¢æ°ãå®è¡ãããããªã±ãŒã¹ãããã§ãããã ãã®ãããªã±ãŒã¹ã®å Žåã颿°ãç¹å®ã®åŠçã§å®è¡ããéã«ããã®é¢æ°ãé©åã«æ±ãããŠããã®ããå®ããã¹ãã±ãŒã¹ãå¿
èŠã«ãªããŸãã äŸãã°æ£åžžç³»ã®æ¬¡ã®ãããªãã¹ãã³ãŒãããããšããŸãã const mockOnSuccessCallback = jest.fn(); const mockOnErrorCallback = jest.fn(); const { result } = renderHook(() => useHoge( { onSuccessCallback : mockOnSuccessCallback, onErrorCallback : mockOnErrorCallback } )); act(() => { result. current .handleSubmit(); } ); expect (mockOnSuccessCallback).toHaveBeenCalledWith( 'test' ); hooksã®é¢æ°ãå®è¡ããæåæã«åŒæ°ã§æž¡ããã³ãŒã«ããã¯é¢æ°ããã©ã¡ãŒã¿ä»ãã§å®è¡ãããããšã確èªããŠããŸãã äžèŠäœã®å€å²ããªããã¹ãã³ãŒãã§ããããã®ãã¹ãã³ãŒãã«ã¯æ¬¡ã®èŠç¹ãæããŠãããã·ã¹ãã ãå®ããã¹ããšããŠã¯äžååã§ãã æåæã®é¢æ°ãè€æ°åå®è¡ããããšããŠãéã£ãŠããŸã ãšã©ãŒæã®ã³ãŒã«ããã¯é¢æ°ãå®è¡ããããšããŠãéã£ãŠããŸã ãããã£ãã±ãŒã¹ã§ã¯ãåŒç€Ÿã§ã¯æ¬¡ã®ãããªãã¹ãã³ãŒããæšå¥šãããŸãã const mockOnSuccessCallback = jest.fn(); const mockOnErrorCallback = jest.fn(); const { result } = renderHook(() => useHoge( { onSuccessCallback : mockOnSuccessCallback, onErrorCallback : mockOnErrorCallback } )); act(() => { result. current .handleSubmit(); } ); expect (mockOnSuccessCallback).toHaveBeenCalledTimes( 1 ); expect (mockOnSuccessCallback).toHaveBeenCalledWith( 'test' ); expect (mockOnErrorCallback).not.toHaveBeenCalled(); ãã®ãã¹ãã³ãŒãã«ããããæåæã«1åã ãã³ãŒã«ããã¯é¢æ°ããã©ã¡ãŒã¿ä»ãã§å®è¡ããããšã©ãŒã®ã³ãŒã«ããã¯é¢æ°ãå®è¡ãããªããããšãå®ãããšãã§ããŸãã ãã®2ã€ã®ãã¹ãã³ãŒãã®ã«ãã¬ããžã¯å€ãããŸããããã·ã¹ãã ãå®ãããšãã§ããå
容ã倿Žåãããå¢ããŠãããã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèããããå³å¯ã«å®ãããšãã§ããããã«ãªããŸããã åºå察象å€ã®ãã§ã㯠ç¹å®ã®æ
å ±ã®ã¿ãè¿ãåŠçãããå Žåããã®æ
å ±ãæ£ããååŸã§ããããšã確èªãããã¹ãã±ãŒã¹ãå¿
èŠã«ãªããŸãã ç¹å®ã®ãŠãŒã¶ãŒæ
å ±ãååŸãããã®ãŠãŒã¶ãŒã«çŽä»ãåçš®æ
å ±ãååŸããåŠçã¯ããããã±ãŒã¹ã§ãã ãã®ãããªã±ãŒã¹ã®å Žåãç¹å®ã®æ
å ±ã®ã¿ãååŸã§ããããšãå®ããã¹ãã±ãŒã¹ãå¿
èŠã«ãªããŸãã äŸãã°æ¬¡ã®ãããªãã¹ãã³ãŒãããããšããŸãã RSpec .describe User do describe ' .skills ' do let!( :user ) { create( :user ) } let!( :user_skills ) { create_list( :user_skill , 3 , user :) } it ' returns user skills ' do expect(user.skills).to eq(user_skills) end end end ç¹å®ã®ãŠãŒã¶ãŒããŒã¿ã«çŽä»ãã¹ãã«ããŒã¿ãååŸããããšã確èªããŠããŸãã äžèŠäœã®å€å²ããªããã¹ãã³ãŒãã§ããããã®ãã¹ãã³ãŒãã«ã¯æ¬¡ã®èŠç¹ãæããŠãããå®ããã¹ããšããŠã¯äžååã§ãã ä»ã®ãŠãŒã¶ãŒã®ã¹ãã«ããŒã¿ãæ··åšããŠããŸãå¯èœæ§ãåŠå®ã§ããŠããªã 察象ã®ãŠãŒã¶ãŒãã¹ãã«ããŒã¿ãæã£ãŠããªãå Žåã®æåã確èªã§ããŠããªã ç¹ã«ä»ã®ãŠãŒã¶ãŒã®ã¹ãã«ããŒã¿ãæ··åšããŠããŸãã±ãŒã¹ãçºçããŠããŸã£ãå Žåãææªã®å Žåã€ã³ã·ãã³ãã«ããªããããŸããã ãããã£ãã±ãŒã¹ã§ã¯ãåŒç€Ÿã§ã¯æ¬¡ã®ãããªãã¹ãã³ãŒããæšå¥šãããŸãã RSpec .describe User do describe ' .skills ' do let!( :user ) { create( :user ) } before do # NOTE : ä»ãŠãŒã¶ãŒã®ã¬ã³ãŒãã察象å€ã«ãªãããšãå®ã create_list( :user_skill , 3 , user : create( :user )) end context ' when user has skill ' do let!( :user_skills ) { create_list( :user_skill , 3 , user :) } it ' returns user skills ' do expect(user.skills).to eq(user_skills) end end context ' when user not has skill ' do it ' returns empty array ' do expect(user.skills).to eq([]) end end end end ãã®ãã¹ãã³ãŒãã«ããããä»ã®ãŠãŒã¶ãŒã®ã¹ãã«ããŒã¿ãæ··åšããŠããŸãå¯èœæ§ãåŠå®ãããã察象ã®ãŠãŒã¶ãŒãã¹ãã«ããŒã¿ãæã£ãŠããªãå Žåã§ãæ£åžžã«åŠçãå®è¡ã§ãããããšãå®ãããšãã§ããããã«ãªããŸããã 察象ã®ã¬ã³ãŒãããã§ãã¯ããããšã ãã§ã¯ãªãã察象å€ã®ã¬ã³ãŒããæ¬åœã«å¯Ÿè±¡å€ã«ãªã£ãŠããã®ãã©ãããã¬ã³ãŒããååšããªãã£ãå Žåã«ãšã©ãŒãèµ·ããªããã©ãããŸã§ç¢ºèªããããšã§ãã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèããããå³å¯ã«å®ãããšãã§ããããã«ãªããŸããã ãã§ãã¯ããå€ã®å³å¯å ç¹å®ã®å€ãè¿ã颿°ãããå Žåãå®è¡æã«æåŸ
ããå€ãè¿ã£ãŠããããšã確èªãããã¹ãã±ãŒã¹ãå¿
èŠã«ãªããŸãã äŸãã°æ¬¡ã®ãããªãã¹ãã³ãŒãããããšããŸãã RSpec .describe User do describe ' .has_multi_skills ' do let!( :user ) { create( :user ) } before do # NOTE : ä»ãŠãŒã¶ãŒã®ã¬ã³ãŒãã察象å€ã«ãªãããšãå®ã create_list( :user_skill , 3 , user : create( :user )) end context ' when user has multi skills ' do before { create_list( :user_skill , 3 , user :) } it ' returns true ' do expect(user.has_multi_skills).to be_truthy end end context ' when user has skill ' do before { create( :user_skill , user :) } it ' returns false ' do expect(user.has_multi_skills).to be_falsy end end context ' when user not has skill ' do it ' returns false ' do expect(user.has_multi_skills).to be_falsy end end end end 察象ã®ãŠãŒã¶ãŒãè€æ°ã®ã¹ãã«ããŒã¿ãæã£ãŠããå Žåã«trueãããã以å€ã®å Žåã«ã¯falseãè¿ã£ãŠããããšã確èªããŠããŸãã ãããšèŠã§ç¹ã«åé¡ã¯ç¡ãããã§ããã be_truthy be_falsy ã®ä»æ§ã«ã¯æ³šæãå¿
èŠã§ãã it { expect( true ).to be_truthy } # passes it { expect( " hoge " ).to be_truthy } # passes it { expect( nil ).to be_truthy } # fails it { expect( false ).to be_truthy } # fails it { expect( false ).to be_falsy } # passes it { expect( nil ).to be_falsy } # passes it { expect( " hoge " ).to be_falsy} # fails it { expect( true ).to be_falsy } # fails be_truthy be_falsy ã¯booleanã®å€ä»¥å€ã§ãå®è¡çµæãå€ãããŸãã ãã®ãããäŸãã°é¢æ°ãè¿ãå€ãbooleanã§ã¯ãªãæååã«ãªã£ãŠããŸã£ãå Žåã«ãã¹ããéã£ãŠããŸãå¯èœæ§ããããŸãã äœãããã®å€ãå
¥ã£ãŠããããšã確èªãããã¹ãã±ãŒã¹ã§ããã°åé¡ãããŸããããä»åã®ã±ãŒã¹ã§ã¯booleanã®å€ãå³å¯ã«ãã§ãã¯ããããšãèŠæ±ãããŸãã ãããã£ãã±ãŒã¹ã§ã¯ãåŒç€Ÿã§ã¯æ¬¡ã®ãããªãã¹ãã³ãŒããæšå¥šãããŸãã RSpec .describe User do describe ' .has_multi_skills ' do let!( :user ) { create( :user ) } before do # NOTE : ä»ãŠãŒã¶ãŒã®ã¬ã³ãŒãã察象å€ã«ãªãããšãå®ã create_list( :user_skill , 3 , user : create( :user )) end context ' when user has multi skills ' do before { create_list( :user_skill , 3 , user :) } it ' returns true ' do expect(user.has_multi_skills).to be true end end context ' when user has skill ' do before { create( :user_skill , user :) } it ' returns false ' do expect(user.has_multi_skills).to be false end end context ' when user not has skill ' do it ' returns false ' do expect(user.has_multi_skills).to be false end end end end ãã®ãã¹ãã³ãŒãã«ããã颿°ãè¿ãå€ãbooleanã®å€ã§å³å¯ã«ãã§ãã¯ããããšãå¯èœã«ãªãã颿°ã®å®è£
ãå£ããŠããŸã£ãå Žåã«ãã¹ããã³ã±ãŠæããŠãããããã«ãªããŸãã ãã¹ãã©ã€ãã©ãªã®ãããã£ãŒã¯äŸ¿å©ã§å€çšããã¡ã§ããããããã®ä»æ§ãçè§£ãé©åã«å©çšããããšãéèŠã§ãã ãŸãšã ãããã§ããã§ããããïŒ ãã¹ãã³ãŒãã¯å
šãŠéããšå®å¿ããŸãããæ¬è³ªã¯ããã§ã¯ãªãã³ã±ãã¹ãæã«ã³ã±ãŠããããã¹ãã³ãŒããæžãããšãéèŠã§ãã ä»åæããäŸã¯ã»ãã®äžäŸã§ããåŒç€Ÿã§ã¯ãã®æ§ã«ã·ã¹ãã ãå®ããã¹ããéèŠããŠãããæ¢åã³ãŒããžã®ä¿®æ£ãè¡ã£ããšããŠãã»ãšãã©ã®ã±ãŒã¹ããã¹ãã³ãŒãã§ã«ããŒããããšãåºæ¥ãŠããŸãããã®ããå®å¿ããŠæ©èœè¿œå ããªãã¡ã¯ã¿ãªã³ã°ãªã©ãè¡ãããšãã§ããŸãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ããã¡ã€ã³ãã£ã®ENDïŒ @aiandrox ïŒã§ãïŒ 2024幎4æ30æ¥ããããã¡ã€ã³ãã£ã¯æ°ãªãã£ã¹ã«ç§»è»¢ããŸããã findy.co.jp æ°ãªãã£ã¹ã®ããããããïŒ å€§åŽé§
ããçŽçµåŸæ©5åïŒéšã«æ¿¡ããã«åºç€Ÿã§ããïŒ åãªãã£ã¹ã®2.3åã®åºãïŒ ãªãã©ã€ã³ã€ãã³ããéå¬ã§ããã€ãã³ãã¹ããŒã¹ãå¢ããŸããïŒ ãã®èšäºã§ã¯ããããªæ°ãªãã£ã¹ã«ã€ããŠããšã³ãžãã¢ç®ç·ã§ç޹ä»ããŸãïŒ2024幎5ææç¹ïŒã å·å宀ã«ã€ã㊠ãœãã¡åžã»ãã€ããŒãã« ãã³ããªãŒ ã€ãã³ãã¹ããŒã¹ã«ã€ã㊠瀟å
ã€ãã³ãã®æ§å ãªãã©ã€ã³ã€ãã³ãã®æ§å ãããã« å·å宀ã«ã€ã㊠å·å宀ã¯åãªãã£ã¹ãšåãããã«ã·ã³ãã«ãªäœãã§ãã1ããã¢ã§ã倧äœåŸæ©5åããã°1åšã§ãããããã®åºãã§ãã æå€§500åžå
¥ãåºãã§ãããçŸåšã¯åºç€Ÿã¡ã³ããŒã200人çšåºŠãªã®ã§ç©ºåžãå€ãã§ããæ¯æã¬ã³ã¬ã³æ°ããæ¹ã«ãžã§ã€ã³ããŠããã ããŠããã®ã§ãä»åŸã©ãã©ãåãŸã£ãŠããæ³å®ã§ãïŒ ãã®èŸºãã¯ãŸã 空åžã§ã ãšã³ãžãã¢ã®å³¶ã¯Cãšãªã¢ã®ãµã³ããŠãã®ãããã«äœçœ®ããŠããŸãããµã€ã³ã®ååã¯ã¯ã©ãŠããµãŒãã¹ã®ãªãŒãžã§ã³ã«ãªã£ãŠããã®ã§ããªããšãªã身è¿ãªæãã ãŸããåã®ãªãã£ã¹ã®ãšãããããã§ãããããšã³ãžãã¢ã®åžã«ã¯4Kã¢ãã¿ãŒãšãšã«ãŽãã¥ãŒãã³ãå®åãªã®ã§ãéçºç°å¢ãâã ããã«ãæ°ãªãã£ã¹ã§ã¯å
šåžã«æç·LANãçšæãããããã«ãªã£ãã®ã§ãåç·é床ãUPããŸãããæå€§1GBãããåºãŸãã ãœãã¡åžã»ãã€ããŒãã« æ°ããå
¥ç€Ÿããã¡ã³ããŒã¯ããŒã ã¡ã³ããŒãš1on1ããããªã³ããŒãã£ã³ã°ãããã®ã§ããããã®ãšãã«ã¯ãœãã¡åžã䜿ãããšãå€ãã§ãããã€ã¯ã¢ãŠãã®ã©ã³ãã®ãšãã«ã倧掻èºã§ãã ãŸãããªãã©ã€ã³ã§èšèšã®çžè«ãªã©ããããšãã«ã¯ãã€ããŒãã«ãã¹ã¿ã³ãã£ã³ã°ãã¹ã¯ã䜿ãããšãå€ãã§ãããã®åžã¯äºçŽããããªãã®ã§ãã¡ãã£ãšããçžè«ããã£ãã°ããã«è©±ããããšãã«åœ¹ã«ç«ã¡ãŸãã Flexispotã®é»åæéãªã®ã§ãé«ãããããã調æŽã§ããŠäœ¿ããããã§ãïŒ ãã³ããªãŒ ãã¡ã€ã³ãã£ã®ããªã¥ãŒã®1ã€ã«ãã¹ããŒããããããŸãããã®ããã«ãã1人ãããã®çç£æ§ãé«ããããã«æ¥åçšã®é»åã¬ã³ãžããããŸãããåŒåœãé£ã¹ããšããä»ã®äººãåŸ
ã€ããšããããŸããïŒèªåã¯æ®æ®µå€é£ããŠããããããŸã䜿ã£ãŠããŸãããâŠâŠïŒã ãªããšæå€§1900Wã®é»åã¬ã³ãž ã€ãã³ãã¹ããŒã¹ã«ã€ã㊠æå€§ã®ç®çãããïŒ ä»ãŸã§ãã¡ã€ã³ãã£ã§ã¯æ°å€ãã®ãªãã©ã€ã³ã€ãã³ããããŠããŸããããã€ãã³ãã¹ããŒã¹ãåããå¿
èŠããããŸãããæ°ãªãã£ã¹ã§ã¯ã€ãã³ãã¹ããŒã¹ãæ°èšãããã®ã§ãåºç€Ÿæã«ã¯ã€ãã³ãã«ãµãã£ãšéã³ã«è¡ãããšãã§ããŸãã ãšãŠãåºãïŒ ãã¡ãã¯æå€§100åå容ã§ããããã«ãªã£ãŠããŸãã ãŸããã€ãã³ãã¹ããŒã¹ã«ã¯ããšã³ãžãã¢å¿ãããããããããŒã¯ããããããããŸãã å
¥å£ããã¯sshã§å
¥ããŸã ã¡ã€ã³ã¹ã¯ãªãŒã³ã¯æ®æ®µã¯ãããªæããããèŠããšâŠâŠïŒ ãã¡ãã®æã®åããåŽã¯å·å宀ãšãªã£ãŠããŸã ä»ã«ãããšã³ãžãã¢å¿ã®ãããããããµã€ã³ãããããããã®ã§ããã²ã€ãã³ãã¹ããŒã¹ã«éã³ã«æ¥ãŠã確èªãã ããïŒ ç€Ÿå
ã€ãã³ãã®æ§å ã€ãã³ãã¹ããŒã¹ã¯äºçŽããŠããã°èªç±ã«äœ¿ããŸãã ç§ã¯ç€Ÿå
ã®ããŒãã²ãŒã äŒã«ããåå ããŠããã®ã§ãããåã®ãªãã£ã¹ã§ã¯å¢ããŠããå·åããŒãã«ã«å§è¿«ãããŠæŽ»åäŒæ¢ããŠããŸãããæ°ãªãã£ã¹ã§ã€ãã³ãã¹ããŒã¹ãã§ããã®ã§ããæŒã«ç€Ÿå
ã®ã¡ã³ããŒã§ããã²äŒããããŸããã ã³ãããŒãã« ããã ã®5人 ãŸãã瀟å
éå®ã®ç§»è»¢ã€ãã³ãã®æ§åã¯ä»¥äžããèŠãããšãã§ããŸãïŒ note.com ããã ãéãŸããšãããã«å§å·»ã§ã ãªãã©ã€ã³ã€ãã³ãã®æ§å 5æ28æ¥ã«éå¬ããããªãã©ã€ã³ã€ãã³ãã After RubyKaigi 2024ãã¡ããã¢ãZOZOãFindyã ãã®æ§åã§ãã é
ä¿¡ããŒã¹ãããã®ã§ããªã³ã©ã€ã³/ãªãã©ã€ã³ã®ãã€ããªããéå¬ãå¯èœã§ãïŒãã®ãšãã®ã€ãã³ãããã€ããªããéå¬ã§ããã é
ä¿¡ããŒã¹ã®æ©æ ãªã³ã©ã€ã³ã®é
ä¿¡ç»é¢ ä»åŸãã瀟å
ã»ç€Ÿå€åããããããªã³ãã¥ãã±ãŒã·ã§ã³ã®ã§ããã¹ããŒã¹ãšããŠäœ¿ã£ãŠãããŸãð ãããã« æ°ãªãã£ã¹ç§»è»¢åŸãããã¡ã€ã³ãã£ã¯ã©ãã©ãã¡ã³ããŒãå¢ãããŠãããªãæé·ããç¶ããŸãïŒ çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ããèå³ãããæ¹ã¯ãã¡ãããã©ããïŒ herp.careers
ããã«ã¡ã¯ã ä»å¹Žã®4æãã Findy Tools ã®éçºãããŠããæã§ã! ãã®èšäºã¯ èªæ
¢ã®äœæ¥ç°å¢ã倧å
¬éã·ãªãŒãº ã®ç¬¬4匟ã«ãªããŸãã ä»åã¯3åã®ãšã³ãžãã¢ã®äœæ¥ç°å¢ã玹ä»ããŸãïŒ äœæ¥ç°å¢ã倧å
¬é æ ç§ã¯ãªãã£ã¹ãžã®åºç€Ÿãšåšå®
ã®ãã€ããªããã§å€åããŠãããèªå®
ã«ãå¿«é©ãªäœæ¥ç°å¢ãåããŠããŸãã ãã¹ã¯åšãã®å
šäœåã¯ãã®ããã«ãªã£ãŠãããã·ã³ãã«ã§æ©èœæ§ãéèŠããæ§æã«ããŠããŸãã ãã€ã³ãã¯æéãã¹ã¯ãš34ã€ã³ãã®ãŠã«ãã©ã¯ã€ãã¢ãã¿ãŒã§ãã æéãã¹ã¯ã¯ FlexiSpotã®EF1 ã䜿ã£ãŠããŸãã1æ¥äžåº§ã£ãŠãããšäœãåãã®ãšãç²ããæã«æ°å転æã§ç«ã¡äœæ¥ãã§ããŠå¿
èŠäžå¯æ¬ ãªãã®ã«ãªã£ãŠããŸãã ãã£ã¹ãã¬ã€ã¯ LGã®34WN780-B ã䜿ã£ãŠããŸããæšªã«åºãããšã§ã³ãŒãããŠã£ã³ããŠã3ã€ããã䞊ã¹ãããšãåºæ¥ãŠäœæ¥ãæããŸãããŸãããã£ã¹ãã¬ã€ã¢ãŒã ãä»å±ããŠããè§åºŠãäœçœ®ã調æŽããããã§ãã ããã«ã14åã®Macbook ProãããŒãPCã¹ã¿ã³ãã«èŒããããšã§ãã£ã¹ãã¬ã€ã®é«ããæããããŠãWebã«ã¡ã©ã®äœçœ®ãã¡ããã©è¯ããªãã®ãæ°ã«å
¥ã£ãŠãŸãã ä»ã«ã¯ã¡ã¢ãçŽãã€ãã£ãŠæèæŽçããããã®ããŒããšãã³ãiPadãKindle Paperwhiteãç§çšã®Macbook Airãæšªã«çœ®ããŠãããŸãã å
¥åæ©åšã¯ã¡ãªããªãã€ãããšãæ°å転æã®ããç§çšãšç€Ÿçšã§åããŠãããäžæ®µã®ãå人å©çšãäžæ®µã瀟çšã§ãã ç§çšã¯ Keychron K1 ã®ã¿ã¯ã¿ã€ã«ã¹ã€ãããš Logicoolã®ãã©ãã¯ããŒã«ERGO M575 ã䜿ã£ãŠããŸããæ¥åã§ãFigmaã§å³ãæžããšããªã©ã¯ãããŸã«ãã©ãã¯ããŒã«ã䜿ãããšããããŸãã 瀟çšã¯ LOFREE Flow84 ãšãããªãã¢ã¹ã€ããã®ããŒããŒããšAppleã®Magic Trackpadã䜿ã£ãŠããŸããå
ã
ãKeychron K1ãšããããŒããŒãã ãã䜿ã£ãŠããŸãããããªãã¢ã¹ã€ããã®ããŒããŒãã詊ããŠã¿ããFlow 84ãä»å¹Žã«ãªã£ãŠãã賌å
¥ããŸãããæéµæãã¹ã ãŒãºã§ã¿ã€ãé³ãå¿å°ããæ°ã«å
¥ã£ãŠããŸãã æéãã¹ã¯ãåãéãã±ãŒãã«ã«äœè£ãæãããŠããå¿
èŠãããã®ã§ã倩æ¿ã«ã±ãŒãã«ãã¬ãŒãèšçœ®ããåããã±ãŒãã«ãæå°éã«ããŠããŸãããŸãã黿ºã¿ãããUSB-Cã®ãããã³ã°ã¹ããŒã·ã§ã³ãèšçœ®ããããã«ã±ãŒãã«é¡ãéçŽããããšã§ããã¹ã¯äžã®ã±ãŒãã«ãã»ãšãã©èŠããªããªãã¹ãããªããŸãã 以äžãæã®äœæ¥ç°å¢ã§ããã é Findyã§ããŒã¿ãšã³ãžãã¢ãã£ãŠãéã§ãã åããã€ããªããã§åããŠããããæäœéãã¹ã¯åšãã¯æŽããŠããŸãã ãã¹ã¯ã¯ FlexiSpot ãªãã§ãããæåã§åãã¿ã€ãã®ãã®ã§ãã åãäœæ¥ãã¡ãã£ãšããéåã«ãªãã®ã§æ°ã«å
¥ã£ãŠããŸãã æ€
å㯠COFO Chair Premium ã䜿ã£ãŠããŸãã ãã£ã¹ãã¬ã€ã¯2æãå·Šå³ããã¢ãŒã ã§æã¡äžããŠäœ¿ã£ãŠããŸãã 1æã¯æ°åã®é ãã䜿ã£ãŠãããã®ãªã®ã§æ°ãããããã4Kãã£ã¹ãã¬ã€ãè²·ãããã«å®¶åºå
çšè°äžã§ãã ãã¹ã¯äžã¯ãããªæãã ããŒããŒãã¯è¶è»žã® MISTEL BAROCCO MD770 ã§ãããŠã¹ã¯ Logicool ERGO M575S ã¯ã€ã€ã¬ã¹ãã©ãã¯ããŒã« ã䜿ã£ãŠããŸãã ãã€ããªãããªã®ã§åºç€Ÿããéããªãã¹ãåãç°å¢ã§åãããããŒããŒããšããŠã¹ã¯åããã®ãäŒç€Ÿã«ã眮ããŠãŸãã åã¯Real Forceã奜ãã ã£ãã®ã§ãããæŽäœã®å
çã«é²ããããŠ2,3幎åããåé¢ããŒããŒãã䜿ãããã«ããŠããŸãã ãŸã WAVLINK ã®ãããã³ã°ã¹ããŒã·ã§ã³ã䜿ã£ãŠãã黿ºãåšèŸºæ©åšãžã®æ¥ç¶ããã1ã€ã«ãŸãšããŠããŸãã ä»äºã§ã¯MacBook Pro 14ã€ã³ãã䜿ã£ãŠãŠã¯ã©ã ã·ã§ã«ã§çœ®ããŠãŸãã å·Šäžã«ã¯Fine-dayïŒFindyã®å
šç€Ÿç·äŒïŒã§é ããPCæãã®äžã«ã€ã€ãã³ããã©ãŽã³ããŒã«ïŒäžæçïŒã眮ããŠããŸãã ãã€ãä»ã®6ã€ãèŠã€ãã£ããšãã®ããã«å€§åã«ä¿ç®¡ããŠããŸãã ãã¹ã¯äžã¯ãã©ã€ããŒãã§äœ¿ã£ãŠãããã¹ã¯ãããPCã眮ããŠããŸãã GPUïŒRTX 4090ïŒç©ãã§ãã®ã§ããŒã¿ã³ã³ãã«åå ãããããŒã«ã«LLMãåããããããŠéãã§ãŸãã ãŸãåŒãåºããã³ãŒããåçŽããããã®ãã¬ãŒãããã¯ãšããããã³ãæããããã®ããã¯ãçšæããŠç©ãåçŽã§ããããã«ããŠããŸãã ãã€ã¯ã«ã¯ FIFNE K670 ã䜿ã£ãŠããŸãã å人ã§ããããã£ã¹ããã£ãŠããã®ã§åæ¯ãå
¥ããªãããã«é¢šé²ã¯ã¹ãã³ãžãšãããã¬ãŒãã®2éã§ãã£ãŠããŸãã ã¢ãŒã ã«ãã£ãŠæã¡äžããããšã§ã¿ã€ãã³ã°ããéã®æ¯åããã€ã¯ã«äŒããã¥ããããŠããŸãã 以äžãéã®ãã¹ã¯ç޹ä»ã§ããïŒ å€ç° åã®ãäºäººã®èšäºãèŠãŠæéãã¹ã¯ã欲ãããªã£ãå€ç°ã§ãã Findy Team+ ã§ãããã¯ãéçºãæ
åœããŠããŸãã èªåãåºç€Ÿãšåšå®
ã®ãã€ããªããã§åããŠããŸãããäžææãªã¢ãŒãäžå¿ã ã£ãææã«æ€éæ¿ãã«ãã¢ãæ£ãããã以æ¥äœæ¥ç°å¢ã§ã¯ãå¥åº·ãã«æ°ãé£ã£ãŠããŸãã ãããªäœæ¥ç°å¢ããã£ã𿬡ã®ãããªãããã§ãã ã¢ãã¿ã«é¢ããŠã¯ä»¥åã¯å€§ããã®ãã¹ã¯ã«ããªãã«ãã£ã¹ãã¬ã€ã§é
眮ãããŠãããã§ãããã«ãã¢ã«ãªã£ãŠããã¯éŠã®å¯ååãããŸãå¢ãããããªãã®ã§ãããŒãPCã®äžéšã«ã¢ãã¿ãé
眮ããŠããã«äœµããŠãã¹ã¯ãçŽ90cmã»ã©ã®ã³ã³ãã¯ããªç©ã«ããŸããã ããŒããŒã㯠BAROCCO MD600 Alpha BT RGB ãšããåå²ããŒããŒãã䜿çšããŠããŸãã åå²ããŒããŒãã䜿ããŸã§ã¯æŽäœã«è¡ããšãè©ã®çèã¬ãã¬ãã«åºãŸã£ãŠãŸãã...ããšèšããããããã«è©ãåãåºãŸã£ãŠããŸããããåå²ããŒããŒãã䜿ãããã«ãªã£ãŠããè©åšãã¯å€§åã©ã¯ã«ãªã£ãŠããŸããã çŸç¶ã®åå²ããŒããŒãã§ãå
åã«æºè¶³ãªã®ã§ããã瀟å
ã®ãšã³ãžãã¢ã®äžã«ã¯åå²ããŒããŒãã«ããŠå³åŽããŒããŒãã®ç«¯ã«ãã©ãã¯ããŒã«ãé
眮ããèªäœããŒããŒããšããäœã£ãŠããã¡ã³ããŒãå±
ããããŠãã€ãçæ³ã®èªäœããŒããŒããäœã£ãŠã¿ãããšæ§ãã仿¥ãã®ããã§ãã ã«ãŒãœã«ç§»åã«ã¯ Magic Trackpad ã䜿çšããŠããŸãã ãã©ãã¯ãããã®é
çœ®å Žæã¯æåãåãŸãã®è¯ãããåå²ããŒããŒãã§æãã§çœ®ããŠããŸããããã©ãããŠããã©ãã¯ããããè§Šãè
ã®è©ãå
å·»ãã«ãªããã¡ã§ããã ãªã®ã§çŸåšã¯åå²ããŒããŒãã®å€åŽã«é
眮ããŠããŸãã äœæ¥ç°å¢ãªã®ãïŒãšè³ªåããããåçã«å°ããŸãããäœæ¥æã¯åžžã«ççšããŠãããšããããšã§ã¢ã¯ãã£ããã£ãã©ãã«ãŒã® vÃvosmart 5 ã玹ä»ããŸãã ã¢ã¯ãã£ããã£ãŒãã©ãã«ãŒãªã®ã§çšéãšããŠã¯è²ã
ããã®ã§ãããäœæ¥ãããäžã§äžçªãããããã®ãMoveã¢ã©ãŒããšããäžå®æé身äœãåãããŠããªããšã¢ã©ãŒãéç¥ãããŠãããæ©èœã§ãã ãã®ã¢ã©ãŒãéç¥ãæ¥ããç«ã¡äžãã£ãŠã¡ãã£ãšãŠã©ãŒãã³ã°ãããããã¹ãã¬ããããããããŠèº«äœãã»ãããŠããŸãã ã¹ãã¬ããã®é㯠ãã³ãã«ãã¥ãŒã ãªã©ã䜿ã£ãŠèžã倧ããéããããªã¹ãã¬ããããããšéŠãè©åšãã®åãã軜æžãããŸãã ãŸã座åžã«ã¯ BackJoyã®ãµããŒãã¯ãã·ã§ã³ ãå¿
ãæ·ããŠäœæ¥ããŠããŸãããããããããªããã§ã¯é·æéäœæ¥ããåŸã®è
°åãã®ç²åŽæã倧åéã£ãŠããŸãã 以äžãäœæ¥ç°å¢ç޹ä»ãšããå¥åº·ã°ããºç޹ä»ã¿ããã§ããããå€ç°ã®äœæ¥ç°å¢ã§ããïŒ ãŸãšã ãããã§ããã§ããããïŒ åå²ããŒããŒããæéãã¹ã¯ãã¹ãã¬ããã°ããºãªã©èº«äœã®å¥åº·ã«æ°ãé£ã£ãç°å¢ãå€ãã£ãã§ããïŒ ãã¯ããšã³ãžãã¢ã¯1æ¥ã®å€§åããã¹ã¯ã§ä»äºãããã®ã§ãäœæ¥ç°å¢ã®å€§åããå宿ããŸããã äœãåèã«ãªããã®ãããã°å¹žãã§ãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ããã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§æ©æ¢°åŠç¿ãšã³ãžãã¢ãããŠããŸãsasanoshouta( @Edyyyyon )ã§ãããã®èšäºã¯ããã¡ã€ã³ãã£ã§ã€ã³ã·ãã³ããçºçããéã«è¡ãªã£ãŠãã ãã¹ãã¢ãŒãã ã®éçšãšãã®æ§åã«ã€ããŠãå
æ¥çºçããã€ã³ã·ãã³ããå
ã«ç޹ä»ãããèšäºãšãªã£ãŠããŸãã ä»åçºçããã€ã³ã·ãã³ãã«ã€ã㊠ãŸããä»åçºçããã€ã³ã·ãã³ãã«ã€ããŠè»œã玹ä»ããããŠããã ããŸããäžèšã§è¡šçŸãããšã ãµãŒãã¹ã®æ©èœã®1ã€ãäžæçã«åæ¢ ãããŠããŸããŸããã ãã¹ãã¢ãŒãã ã®æ§å åŒç€Ÿã§ã¯ã€ã³ã·ãã³ããçºçããéã« ãã¹ãã¢ãŒãã ã宿œããŠåçºé²æ¢ã«åªããŠãããŸãã ãã¹ãã¢ãŒãã ãšã¯ïŒ ãããããã¹ãã¢ãŒãã ãšã¯ãªãã ïŒãšèšãæ¹ããããããããããŸããã®ã§ãç°¡åã«ã玹ä»ããããŸãã ãã¹ãã¢ãŒãã ã¯ãã€ã³ã·ãã³ããšãã®ã€ã³ãã¯ãããã®ç·©åãè§£æ¶ã®ããã«è¡ãããã¢ã¯ã·ã§ã³ãæ ¹æ¬åå ïŒçŸ€ïŒãã€ã³ã·ãã³ãã®åçºãé¿ããããã®ãã©ããŒã¢ããã®ã¢ã¯ã·ã§ã³ãèšé²ããããã«æžããããã®ã§ãã *1 äžè¬çã«ãã¹ãã¢ãŒãã ã宿œããã«ã¯äžå®ã®åºæºããããåºæºãè¶
ããé害ãèµ·ãããšãã«å®æœãããã®ã§ãã ãããåŒç€Ÿã§ã¯ãŸã ãã¹ãã¢ãŒãã ã«å¯Ÿããç¥èŠãæŽå²ãæµ
ããæåãšããŠæ ¹ä»ãããããã«ãçŸåšã¯ç·Žç¿ãå
ŒããŠå°ããé害ã§ããã¹ãã¢ãŒãã ã宿œããããã«ããŠããŸãã ãã¹ãã¢ãŒãã ã®æµã ä»åã®ã€ã³ã·ãã³ããäŸã«ããã¹ãã¢ãŒãã ã®æµããèŠã圢ã§å®æœã®æ§åãã玹ä»ããŸããåŒç€Ÿã®å Žåã®ãã¹ãã¢ãŒãã ã¯ã以äžã®é åºã§å®æœãããŸãã åœäºè
ãäºåã«é害ãŸã§ã®ã¢ã¯ã·ã§ã³ãæ¯ãè¿ã ããŒãã£ã³ã°ã§éãŸãã¢ã¯ã·ã§ã³ã«ã€ããŠã®ãã£ãŒãããã¯ã宿œãã ãã¯ã¹ãã¢ã¯ã·ã§ã³æ±ºå®ãšãŠã©ãã 1. åœäºè
ãäºåã«é害ãŸã§ã®ã¢ã¯ã·ã§ã³ãæ¯ãè¿ã ãã®æé ã«ã€ããŠç¹çããäºã¯ãããŸããããåŒç€Ÿã®å Žåã¯Google docsã«ãŠã€ã³ã·ãã³ãããšã«ç®¡çãããŠããã®ã§ã以äžç»åã®ããã«äž»å¬è
ããdocsã®æ¡å
ãæ¥ãã¿ã€ãã³ã°ã§èŠããŠããäºãæ°é®®ãªãã¡ã«æç³»åã§ã®åºæ¥äºã®è©³çްãèšèŒããŠããŸãã ãã¹ãã¢ãŒãã 宿œåã®é£çµ¡ 2. ããŒãã£ã³ã°ã§éãŸãã¢ã¯ã·ã§ã³ã«ã€ããŠã®ãã£ãŒãããã¯ã宿œãã 以äžç»åã®ãããªåœ¢ã§ãäºåã«åœäºè
ãæžãèšããæç³»åã§ã®ã€ãã³ããæ¯ãè¿ããªãããåã€ãã³ãã«é¢é£ããã¢ã¯ã·ã§ã³ã®äžã§è¯ãã£ãç¹ãšæ¹åç¹ã«ã€ããŠåå è
ã§è©±ãåããŸãã ãã¹ãã¢ãŒãã 宿œæã®é°å²æ°äŸ å°ãã ãã€ã³ã·ãã³ãã®äºã«ã€ããŠè§ŠããŸããããæ©èœãå©çšäžå¯ã«ãªã£ãŠããäºãçºèŠããŠãã埩æ§ãŸã§ãã¹ã ãŒãºã«è¡ããããšèšãæ¯ãè¿ãããããŸãããåœæ¥ã¯ãŽãŒã«ãã³ãŠã£ãŒã¯ã®çéææãšèšãäºããããæ¬æ¥ã®ããã¯ãšã³ãæ
åœè
ãäžåšã®éã«èµ·ããåºæ¥äºã§ããããŸãããããããæ¥é ãããµãŒãã¹äžã§æäŸããŠããæ©èœã®IaCåãã³ãã³ãé²ããŠããäºã§æ
åœè
äžåšã®äžã§ãã¹ã ãŒãºãªåŸ©æ§å¯Ÿå¿ãè¡ããŸããã 3. ãã¯ã¹ãã¢ã¯ã·ã§ã³æ±ºå®ãšãŠã©ãã 2 ã§è¡ãªã£ãã€ãã³ãã»ã¢ã¯ã·ã§ã³ã«å¯Ÿããæ¯ãè¿ããããšã«ããã¯ã¹ãã¢ã¯ã·ã§ã³ã決å®ããŸãã 以äžã¯ä»åã®ã€ã³ã·ãã³ãã«ããããã¯ã¹ãã¢ã¯ã·ã§ã³ã«ããªããŸããä»åèµ·ããäºã¯ãæ©èœéçºè
ãéçºã«å¿
èŠãªãµãŒãã¹ãšãã®æš©éãããã¯ãšã³ãéçšè
ãš ååãªææçéãããããªãã£ãäºã§èµ·ããã€ã³ã·ãã³ã ã ãšæããŠããŸãããã¥ãŒãã³ãšã©ãŒãèµ·ãããŠããŸã£ãéçºè
ç®ç·ã®ãã¯ã¹ãã¢ã¯ã·ã§ã³ãä»åã¯ä»¥äžã®ããã«å®ããŸããã éçºã«çæããåã«ç®¡çè
åŽãšååã«ææçéãå³ãããããŒãå¶å®ããéçšãã ãããŒã®äžã§å®ããé
ç® éçºãããèŠä»¶ã«ã€ããŠéçšè
ã«äºåå
±æãã éçºã®çºã«å¿
èŠæäœéã®é©åãªæš©éãèŠæ±ãã äžèšãããŒããã¹ãã¢ãŒãã 宿œåŸ3æ¥ä»¥å
ã«äœæããæ¬¡å鱿¬¡ã®å
šäœç¢ºèªäŒã§æ¡å
ã ãŸããéçšè
ç®ç·ã§ãéçºæã«ã ä»èªåãã©ã¡ãã®ç°å¢ãéããŠããã®ãç®èŠã§åããã¥ããã®ã§ã¯ ããšã®æèŠããããã ã©ã®ç°å¢ã«ããã®ãåãããããããçºã®èŠèŠæ
å ±ãå°å
¥ ãããäºã§åæ§ã®ãã¥ãŒãã³ãšã©ãŒãé²ãä»çµã¿ãå°å
¥ããäºã«ãªããŸããã ãã¹ãã¢ãŒãã åŸã®ãã¯ã¹ãã¢ã¯ã·ã§ã³ãäœæã¯ãããã®ã®ã圢骞åãããã®ãäžã«ã¯å°ãªãããååšãããšæããŸãã ãªã®ã§ãåŒç€Ÿã§ã¯ãã¯ã¹ãã¢ã¯ã·ã§ã³ãè°è«ããéã«æèãããã€ã³ããšããŠã å
·äœæ§ãæãããŠæç¢ºãªã¢ã¯ã·ã§ã³ã«ããããš ããã宿çã«ãŠã©ããããŠé²ãã ã®ãé²ãã§ãªãã®ãã確èªãç¶ããŠæŸçœ®ããªãããš ã®2ç¹ãåžžã«æèããŠãã¹ãã¢ãŒãã ã宿œããããã«ããŠããŸãã äœè«ã§ãããåŒç€Ÿã§ã¯å
šãšã³ãžãã¢ãçŽè¿ã®åãçµã¿ãæã¡åãã§å®æçã«å
±æããå
šäœäŒã®ãããªãã®ãèšããŠããŸãã ãã®å
šäœäŒã®å Žã§ãã¹ãã¢ãŒãã ã®å
容ãšåŸãããç¥èŠãå
ã¿é ããå
±æãããšã³ãžãã¢çµç¹å
šäœã®å
±æç¥èŠãšããããšãæåãšããŠããŸãã ãã¯ã¹ãã¢ã¯ã·ã§ã³ã«ã¯ã€ã³ã·ãã³ããåããŠã©ããªå¯Ÿçãæã€ãïŒãèããäºã«çŠç¹ãéäžããã¡ã ãšæããŸããããåœäºè
ã§ãªããšã³ãžãã¢ãå«ãçµç¹å
šäœã«å¯ŸããŠå
±æããããšããäºãåçºé²æ¢çã®äžã€ãšããŠæ©èœããŠããäºã宿ããŠããŸãã ãã¹ãã¢ãŒãã 宿œæã«æ°ãã€ããŠããäº äžèšåŒç€Ÿã§ã®ãã¹ãã¢ãŒãã ã®æ§åãå®éã®ã€ã³ã·ãã³ããäŸã«ç޹ä»ããŸãããæåŸã«ã宿œã®éã«æ°ãã€ããŠããäºã«ã€ããŠå
±æããŸãã ç¯äººæ¢ããæ¹å€ãããªã ãã¹ãã¢ãŒãã ã§æãéèŠèŠããŠããé
ç®ã§ãã ãã¹ãã¢ãŒãã ã®ç®çã¯åŠã³ã«ãããç¯äººæ¢ããæ¹å€ãè¡ããšãããæãåœäºè
ãçå®ãèªããªããªãããã®èåŸã«ããæ¬åœã®åå ã«æ°ã¥ãããšãã§ããªããªãçºã§ãã æ¹å€ã§ã¯ãªãã æ ¹æ¬åå ã®è¿œæ±ãšåæã«åŸ¹ãã äºãå¿ãããããã«ããŠããŸãã éå®³ã®æ ¹æ¬åå ãåæããçè§£ãã åå ã®åæãäžååã ãšã誀ã£ãåçºé²æ¢çã«ãªããçµæãšããŠåãé害ãåçºããããšã«ç¹ãããããŸããã 客芳çãªèŠç¹ã§ã åå ãã·ã¹ãã ãããã»ã¹ã«ããããšãæèããŠåæããã ããã«ããŠããŸãã 人ã§ã¯ãªããä»çµã¿ã§è§£æ±ºãã åçºé²æ¢çãé 匵ããæ°ãã€ããã ãã ãšãåçºé²æ¢ã人ã«äŸåããããšã«ãªããŸããã人ã¯ãã¹ãããçãç©ã§ãã ã·ã¹ãã ãããã»ã¹ãä¿®æ£ããŠã 人ããã¹ããŠã被害ãæå°éã«ããæ¢ãã ããã«åªããããã«ããŠããŸãã åé¡ç¹ã ãã§ãªããè¯ãã£ãç¹ãææãç§°è³ãã ç¯äººæ¢ããæ¹å€ã¯ãæ³åºŠã§ãããè¯ãã£ãç¹ãããã°äœåã§ãç§°è³ããäºã倧åã«ããŠããŸãã ãããã« æ¹ããŸããŠããäžäŸ¿ããããããŸãããŠãŒã¶ãŒã®çæ§ã«æ·±ããè©«ã³ããããšãšãã«ãåçºé²æ¢ã«åªããŠãŸãããŸãã ä»åã®ãã¹ãã¢ãŒãã ãéããŠãéçºãé²ããäžã§è¶³ããŠããªãã£ã芳ç¹ã»éå°ã ã£ãç¹ãæµ®ã圫ãã«ããäºãã§ããããšã¯éåžžã«å人ãšããŠåŠã³ã«ãªããŸããã ãã®åŠã³ã掻ãããŠãããè¯ããµãŒãã¹åµãã«è²¢ç®ã§ããããå人ã»çµç¹ãšããŠç²Ÿé²ããŠãŸãããŸãã *1 : â» SRE ãµã€ããªã©ã€ã¢ããªãã£ãšã³ãžãã¢ãªã³ã° âGoogleã®ä¿¡é Œæ§ãæ¯ãããšã³ãžãã¢ãªã³ã°ããŒã ããæç²
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã æ©éã§ãããããã¯åŒç€Ÿã®ãšããããŒã ã®1ã¶æã®ãµã€ã¯ã«ã¿ã€ã ã§ãã æåã®ã³ãããããããŒãžããããŸã§å¹³å3.6æéçšåºŠãšãéçºã«çæããããã®æ¥ã®ãã¡ã«ãªãªãŒã¹ãããã®ãããã©ã«ããšãªã£ãŠããŸãã ä»åã¯ãã®éçºã¹ããŒããç¶ç¶ããæŽã«éãããããã«åŒç€Ÿã§å®è·µããŠãããã¯ããã¯ã玹ä»ããŠãããŸãã ããã§ã¯èŠãŠãããŸãããïŒ ã¿ã¹ã¯åè§£ Pull requestã®ç²åºŠ ãã¹ã CI/CD é«éå èªåå éç¥ ãŸãšã ã¿ã¹ã¯åè§£ éçºã¿ã¹ã¯ãã¢ãµã€ã³ãããæããŸãæåã« ã¿ã¹ã¯åè§£ ãããŸãã ã¿ã¹ã¯åè§£ãããããšã«ããã¡ãªãããšããŠã¯ã å·¥æ°èŠç©ããã®ç²ŸåºŠãäžãã å¯Ÿå¿æ¹éã®èªèãä»ã¡ã³ããŒãšåããããããªã å¯Ÿå¿æŒãã«æ°ã¥ãããããªããææ»ãã®çºçãå°ãªããªã Pull requestã®ç²åºŠãé©åã«ä¿ã€ããšãã§ãã ä»ã¡ã³ããŒãžã®åŒãç¶ãããããããªã ãªã©ãæããããŸãã åè§£ããã¿ã¹ã¯æ¯ã«Pull requestãäœæããããšã§ãPull requestãå°ããäœãç¶ããããšãå¯èœã«ãªããŸãã ããŒã¯ããŠã³èšæ³ã®ãã§ãã¯ããã¯ã¹ã䜿ã£ãŠIssueã«ã¿ã¹ã¯ãªã¹ããæŽãåºããŸãã çµãã£ãã¿ã¹ã¯ããé ã«ãã§ãã¯ããã¯ã¹ã«ãã§ãã¯ãå
¥ããã¿ã¹ã¯ç®¡çãããŸãã è¯ãã¿ã¹ã¯ãªã¹ããäœæããããã®ã³ãã¯ã æåããå®ç§ãªã¿ã¹ã¯ãªã¹ããäœãããšããªã ããšã§ãã ãŸãæåã«å€§æ ã®ã¿ã¹ã¯ãèããããããåè§£ããŠããããã«æèããŠã¿ã¹ã¯ãªã¹ããäœæãããšãçµæçã«è©³çްãªã¿ã¹ã¯ãªã¹ãã宿ããŠããŸãã 宿ããã¿ã¹ã¯ãªã¹ããå
ã«Pull requestãäœæããŠãããšãçµæçã«é©åãªç²åºŠã§Pull requestãäœæã§ããããã«ãªãã¯ãã§ãã äŸãã°ãäœãããã®ããŒã¿ã®äžèЧãè¿ãREST APIã远å ããå Žåãæ¬¡ã®ãããªã¿ã¹ã¯ã«åè§£ã§ããŸãã - [ ] APIã®ä»®å®è£
ãè¡ã - [ ] APIã®ãšã³ããã€ã³ããæ±ºãã - [ ] APIã®responseã®åœ¢ã決ãã - [ ] ã¢ãã¯ããŒã¿ãè¿ã - [ ] ããŒã¿ããŒã¹ããããŒã¿ãååŸããŠè¿ã - [ ] æ€çŽ¢æ¡ä»¶ã«å¯Ÿå¿ãã - [ ] id - [ ] nameã®éšåäžèŽ - [ ] ãœãŒãã«å¯Ÿå¿ãã å°ããã³ãã³ããšä¿®æ£ãäžä¹ãããŠãããæçµçã«å®æåœ¢ã«è¿ã¥ããŠãããããªåè§£ã®ä»æ¹ãè¯ãã§ãããã 倧ããªæ©èœã®å®è£
æ
åœã«ãªã£ãéã«ãäžåºŠã«å
šãŠã®æ©èœãå®è£
ããã®ã§ã¯ãªãã å°ããæ©èœè¿œå ãäœåãç¹°ãè¿ããŠçµæçã«å€§ããªæ©èœã宿ããã ãããªã€ã¡ãŒãžãæã€ãšè¯ãã§ãã ãŸãã¿ã¹ã¯åè§£ãããŠäœæããã¿ã¹ã¯ãªã¹ããä»ã®ã¡ã³ããŒã«ã¬ãã¥ãŒããŠããããŸããããã§èªèãåãããããšã§ãéçºã®é²è¡ãã¹ã ãŒãºã«ãªããŸãã åè§£ããã¿ã¹ã¯ã«æ²¿ã£ãŠéçºãé²ããŠãããšããã®ã¿ã¹ã¯ãæŽã«åè§£ããã»ããè¯ãããšã«æ°ã¥ãããšããããŸãã ãã®éã¯ã©ãã©ãåè§£ããŠãããŸããçµæçã«åè§£ãããã¿ã¹ã¯ãã®ãã®ãç¥èŠãšãªããä»åŸã®éçºã®åèã«ãªãããã§ãã Pull requestã®ç²åºŠ Pull requestãå°ããããããšã§éçºçç£æ§ãæ¹åããããšã¯æ¢ã«ç¥ãããŠããäºå®ã§ãããå°ããããŠãåé¡ãåºãŸãã ãããã©ãããã®ãïŒãšãã話ã«ãªããã¡ã§ãããããã¯Pull requestã® ãµã€ãº ãæ°ã«ããããŠã㊠ç²åºŠ ãèããŠããªãããã«èµ·ããåé¡ã§ãã Pull requestã å°ããããã®ã§ã¯ãªããç²åºŠãèãã ããšããå°ããPull requestãäœãç¶ããããã®ç§èš£ã§ãã ã§ã¯é©åãªç²åºŠãšã¯ã©ããã£ããã®ãªã®ã§ããããïŒããã¯ã äžã€ã®ããšã ãã«æ³šåããŠãã Pull requestã§ãã å
·äœçã«å¹Ÿã€ãã®äŸãæããŸãããã äŸãã°ãã颿°åã倿Žããã®ã§ããããå©çšããŠã1äžè¡ãäžæ¬çœ®æããPull requestãããããšããŸãã ããã¯é©åãªç²åºŠã ãšèšããŸãã倿Žè¡æ°ã¯1äžè¡ã§ãµã€ãºã¯å€§ãããããããŸãããããç¹å®ã®é¢æ°åãäžæ¬çœ®æããããšãã1ã€ã®ããšããããŠããªããããç²åºŠãšããŠã¯é©åã§ãã Pull requestã®æŠèŠæ¬ã«äžæçœ®æããæšãæžããŠãããCIéãã°å³mergeã§OKã§ãã â»åŸè¿°ããããã«èªååãã¹ããå
å®ããŠãããå®ãããã¹ãã«ãªã£ãŠããåæã§ã ã§ã¯ãç»é¢ã®éçºäžã«å¥ã®ç»é¢ã®ãªãã¡ã¯ã¿ãå
¥ãã倿Žè¡æ°ã¯20è¡çšåºŠã ã£ãPull requestãã¯ã©ãã§ããããïŒ ããã¯é©åãªç²åºŠãšã¯èšããŸããã倿Žè¡æ°ã¯20è¡ã§ãµã€ãºã¯å°ãããããããŸãããããç»é¢ã®éçºããšãå¥ã®ç»é¢ã®ãªãã¡ã¯ã¿ããšããïŒã€ã®äºãåæã«ããŠãããããç²åºŠãšããŠã¯äžé©åã§ãã ä»®ã«ç»é¢ã®éçºã®éšåã§äžå
·åãçºçãrevertãå¿
èŠã«ãªã£ãå Žåãç»é¢ã®éçºéšåã ãã§ã¯ãªãå¥ã®ç»é¢ã®ãªãã¡ã¯ã¿ã®éšåãåæã«revertãããŠããŸããŸãã é©åãªç²åºŠãèããäžã§ã Pull requestã®ååšæçŸ©ãå€å²ã«æž¡ã£ãŠããªããã©ããïŒ ãšããããšãèãããšè¯ãã§ãã ç²åºŠã倧ãããããšåºãŠããåé¡ã¯è²ã
ãšãããŸããã ã¬ãã¥ãŒã«æéãæãããã¬ãã¥ã¯ãŒç®ç·ã§èãããšã¬ãã¥ãŒã«å¯ŸããŠç²Ÿç¥çã«è² è·ãããã ã©ããã©ãã¬ãã¥ãŒãããè¯ãã®ãåããã¥ãããããã¬ãã¥ãŒã®è³ªãäžãããçµæçã«äžå
·åã®çºççãé«ããªã Pull requestäžã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ãå¿
èŠä»¥äžã«å¢ããŠããŸã äžå
·åçºçæã®åœ±é¿ç¯å²ãåºããªããåå ã®ç¹å®ã«æéãããã etc ãªã©ãæããããŸãã Pull requestã倧ããããããšèªäœã®åå ã¯çµç¹ã«ãã£ãŠç°ãªããŸããã Pull requestã®ç²åºŠã倧ããããããšã¯ãã·ã¹ãã éçºã«ãããŠäœã®ã¡ãªãããçã¿åºããªã ã®ã§ãã é©åãªç²åºŠãç¶æãç¶ããããšã«ãããPull requestã®ã¬ãã¥ãŒã«å¯Ÿããè² æ
ãæžãããã¬ãã¥ãŒèªäœã®è³ªãäžããããšã«å ããã¬ãã¥ãŒã®åªå
床ãäžããããšã«ç¹ãããçµæçã«éçºã¹ããŒããšå質ã®äž¡æ¹ãæ
ä¿ã§ããŸãã ãã¹ã å®è£
ã³ãŒãã«å ããŠãããã®åäœãä¿èšŒãããã¹ãã³ãŒããåãPull requestå
ã§çšæããããšããã¹ããšããŠããŸãã å®è£
ã³ãŒãããããã¹ãã±ãŒã¹ããã¹ãã®å
容ã«å¯Ÿããã¬ãã¥ãŒã®æ¹ãå€ãããšããããŸãã åŒç€Ÿã§ã¯ãã¹ãã®ã«ãã¬ããžã«å¯ŸããŠã®å€§ããªæãã¯ç¹ã«ãããŸããããã«ãã¬ããžãããéèŠèŠããŠããããšããããŸãã ããã¯ããã®ãã¹ãããå®ãããã¹ãã«ãªã£ãŠãããã©ããã§ããéãã¹ãæã«éããã³ã±ãã¹ãæã«ã³ã±ããã¹ãã«ãªã£ãŠãããã©ãããéèŠãªã®ã§ãã äŸãã°æ£åžžç³»ã®æ¬¡ã®ãããªãã¹ãã³ãŒãããããšããŸãã const mockOnSuccessCallback = jest.fn (); const mockOnErrorCallback = jest.fn (); const { result } = renderHook (() => useHoge ( { onSuccessCallback: mockOnSuccessCallback , onErrorCallback: mockOnErrorCallback } )); act (() => { result.current.handleSubmit (); } ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledWith ( 'test' ); hooksã®é¢æ°ãå®è¡ããæåæã«åŒæ°ã§æž¡ããã³ãŒã«ããã¯é¢æ°ãå®è¡ãããããšã確èªããŠããŸãã äžèŠäœã®å€å²ããªããã¹ãã³ãŒãã§ããããã®ãã¹ãã³ãŒãã«ã¯æ¬¡ã®èŠç¹ãæããŠãããå®ããã¹ããšããŠã¯äžååãªã®ã§ãã æåæã®é¢æ°ãè€æ°åå®è¡ããããšããŠãéã£ãŠããŸã ãšã©ãŒæã®ã³ãŒã«ããã¯é¢æ°ãå®è¡ããããšããŠãéã£ãŠããŸã ãããã£ãã±ãŒã¹ã§ã¯ãåŒç€Ÿã§ã¯æ¬¡ã®ãããªãã¹ãã³ãŒããè¯ããšãããŠããŸãã const mockOnSuccessCallback = jest.fn (); const mockOnErrorCallback = jest.fn (); const { result } = renderHook (() => useHoge ( { onSuccessCallback: mockOnSuccessCallback , onErrorCallback: mockOnErrorCallback } )); act (() => { result.current.handleSubmit (); } ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledTimes ( 1 ); expect ( mockOnSuccessCallback ) .toHaveBeenCalledWith ( 'test' ); expect ( mockOnErrorCallback ) .not.toHaveBeenCalled (); ãã®ãã¹ãã³ãŒãã«ããããæåæã«1åã ãã³ãŒã«ããã¯é¢æ°ããã©ã¡ãŒã¿ä»ãã§å®è¡ããããšã©ãŒã®ã³ãŒã«ããã¯é¢æ°ãå®è¡ãããªããããšãå®ãããšãã§ããŸãã ãã®2ã€ã®ãã¹ãã³ãŒãã®ã«ãã¬ããžã¯å€ãããŸãããããã¹ããšããŠå®ãããšãã§ããå
容ãç°ãªããŸãã åŒç€Ÿã§ã¯ã«ãã¬ããžããããã¹ããå®ãå
å®¹ã®æ¹ã«éãã眮ããŠãããçµæãšããŠã«ãã¬ããžãäžãã£ãŠããã ããªã®ã§ãã åŒç€Ÿã®ãªããžããªã§ã¯ãã¹ãã«ãã¬ããžã90ïŒ
ãè¶
ããŠãããã®ãçãããªãã§ãããããã¯ã«ãã¬ããžãæèããŠãã¹ããæžããã®ã§ã¯ãªããå®ããã¹ããæžãç¶ããããšã«ãã£ãŠåæã«äžãã£ããã®ãªã®ã§ãã ãã®ãããªäžå®ã®å質以äžã®ãã¹ãã³ãŒããååšããããšã«ãããã©ã€ãã©ãªã®ããŒãžã§ã³ã¢ãããæ¢ååŠçã®ãªãã¡ã¯ã¿ãªã©ã¯ãCIéãã°å³mergeã§OKããšããæåãæ ¹ä»ããŠããŸãã å
šãŠã®ä¿®æ£ã«å¯ŸããŠåäœç¢ºèªãè¡ãããšã¯ç¡ãããã¹ãã³ãŒãã®ãé°ã§ã¹ããŒããšå質ã®äž¡æ¹ãæ
ä¿ããç¶æ³ãç¶æãç¶ããããšãå®çŸããŠããã®ã§ãã CI/CD åŒç€Ÿã®CIã®ã»ãšãã©ã¯GitHub Actionsã§çµ±äžããŠããŸãã åŒç€Ÿã§ã¯Pull requestãäœæããããã³ã«ãã¹ããLinterãªã©ãå®è¡ããã¬ãã¥ãŒã®å¹çåãã³ãŒãã®å質ãäžå®ã«ä¿ã€ããã«ããŠããŸãã é«éå CIã®é床ã«ã¯éåžžã«æã£ãŠãããæ§ã
ãªé«éåã®å·¥å€«ãããŠããŸããCIã®å®è¡é床ãé
ããšãPull requestãmergeãããŸã§ã®æéãé·ããªã£ãŠããŸããçµæçã«ã¯ãªãã£ã«ã«ãã¹ã«ãªã£ãŠããŸãããã§ãã 1ã€ç®ã¯ãã£ãã·ã¥ã®æŽ»çšã§ããGitHub ActionsãæäŸããŠããåçš®ããã±ãŒãžããã£ãã·ã¥ããä»çµã¿ãå©çšããããšã§ãCIã®ã»ããã¢ããã«å¿
èŠãªæéãåæžããããšãåºæ¥ãŸãã åŒç€Ÿã§ã¯ããã€ãã®ãããžã§ã¯ãã« Nx ãå°å
¥ããŠãããNxãæã€ 倿޿€ç¥æ©èœ ãš ãªã¢ãŒããã£ãã·ã¥æ©èœ ã«ãã£ãŠCIã倧å¹
ã«é«éåããŸããã 2ã€ç®ã¯ãã¹ãã³ãŒãã®å®è¡ã䞊ååããããšã§ãã GitHub Actionsã®matrixãšåŒã°ããæ©èœ ãå©çšããCIã®ã¯ãŒã¯ãããŒãã®ãã®ã䞊åå®è¡ã§ããããã«ããŠããŸãã ãã¹ããã¡ã€ã«ãããã€ãã®ã°ã«ãŒãã«åé¡ããããããã®ã¯ãŒã¯ãããŒã«ã°ã«ãŒãããšã®ãã¹ããã¡ã€ã«ãå²ãåœãŠãç¬èªã®ã¹ã¯ãªãããçšæããŠããŸãã 1ã€ã®ã¯ãŒã¯ãããŒå
ã§å
šãŠã®ãã¹ããã¡ã€ã«ãå®è¡ããŠããŸããšããã¹ããã¡ã€ã«ã®æ°ã«æ¯äŸããŠCIã®å®è¡æéãé·ããªã£ãŠãããŸãã ãããã°ã«ãŒãåããããŠã¯ãŒã¯ãããŒã䞊åå®è¡ããããšã§ãCIã®ããŒã¿ã«ã§ã®å®è¡æéã¯ã»ãšãã©å€ãããŸããããCIãå®äºãããŸã§ã®æéãäžå®ã«ä¿ã€ããšãåºæ¥ãããã«ãªããŸãã 詳现㯠å¥èšäº ã®æ¹ã§ã玹ä»ããŠããã®ã§ãèå³ãããæ¹ã¯ãã¡ããã芧ãã ããã 3ã€ç®ã¯GitHub Actionsã®ã¯ãŒã¯ãããŒãå®è¡ããã runnerã®ã¹ããã¯ãäžãã ããšã§ãã runnerã®CPUã®ã³ã¢æ°ãã¡ã¢ãªãå¢ããããã·ã³ãå©çšã§ããããã«èšå®ãããã¹ãã³ãŒãã®å®è¡ã³ãã³ããèŠçŽããŠãåãã¯ãŒã¯ãããŒå
ã§ããã¹ãã³ãŒãã䞊åå®è¡ã§ããããã«ããŠããŸãã ã€ãŸãã¯ãŒã¯ãããŒãã®ãã®ãšãã¯ãŒã¯ãããŒå
ã®äž¡æ¹ã®äžŠååãå®çŸããŠããŸããããã«ãããåŒç€Ÿã§ã¯æå€§ã§40åã®ãã¹ããã¡ã€ã«ã䞊åå®è¡ããŠãããªããžããªããããŸãã runnerã®ã¹ããã¯ãäžããããšã«ããå©çšæéã®å€§å¹
ãªå¢é¡ãäºæ³ãããŸãããGitHub Actionsã®èª²éã¯runnerã®ç·å®è¡æéã«å¯ŸããŠè¡ãããŠãããã¯ãŒã¯ãããŒèªäœã®å®è¡ãé«éåãããåãçµæçã«ç·å®è¡æéãçããªãã課éé¡ãå¿
èŠä»¥äžã«èšããã§ããŸãããšãé²ãã§ããŸãã èªåå CIé«éå以å€ã«ãæ¥åã®å¹çåã®ãããã»ãŒå
šãŠã®ãããžã§ã¯ãã«ãªãªãŒã¹äœæ¥ãèªååããä»çµã¿ãåãå
¥ããŠããŸããGitHub Actionsã®ã¯ãŒã¯ãããŒãæåå®è¡ããã ãã§ããªãªãŒã¹çšã®Pull requestãèªåçæããããããmergeããã ãã§èªåçã«staging/productionç°å¢ãžã®ãããã€ãå®è¡ãããããã«ãªã£ãŠããŸãã æŽã«Pull requestã®LabelsãAssigneesãèªåã§èšå®ããããã«ãããŠããŸãã ãã®ããã«æéãšã³ã¹ããæããŠã§ãCI/CDã®é«éåãšèªååã®äž¡æ¹ãå®çŸãããŠããŸãã éç¥ äœãããã®ç°å€ãå€åãäŸé Œããã£ãéã«ããã®ã¿ã€ãã³ã°ã§Slackã«éç¥ãé£ã¶ããã«ãªã£ãŠããŸãã ãŸããšã©ãŒãéå®³ã®æ€ç¥ã§ããæ¬çªç°å¢ã§ãšã©ãŒãé害ãåçš®è² è·ã®å¢å ãçºçããéã«ãSentryãDatadogãéããŠSlackã«éç¥ãé£ã°ãããã«ãªã£ãŠããŸãããã®ä»çµã¿ã«ãã£ãŠäžå
·åãéå®³ã«æåã«æ°ã¥ããŸã§ã®æéãççž®ãããä¿®æ£ã³ãŒããæ¬çªç°å¢ã«ãããã€ããããŸã§ã®æéãççž®ãããŸãã æ¬¡ã«éçºæã®éç¥ã§ããGitHubã®WebhookãéããŠãIssueãäœãããæãã³ã¡ã³ãã远å ãããéã«Slackã«ã¡ã³ã·ã§ã³ä»ãã§ãªã¢ã«ã¿ã€ã ã§éç¥ããããã«ããŸããã ç¹ã«å¹æã倧ããã£ãã®ã¯Pull requestã®ã¬ãã¥ãŒäŸé Œãã¡ã³ã·ã§ã³ä»ãã§éç¥ããããšã§ãããã®ä»çµã¿ã«ãããã¡ãŒã¹ãã¬ãã¥ãŒãŸã§ã®æéãççž®ãããçµæçã«Pull requestãããŒãžããããŸã§ã®æéãççž®ãããŸããã æ¬æ¥ã§ããã°GitHubã®å
¬åŒAPPãå©çšããŠéç¥ãéä¿¡ããã°ããã®ã§ãããåŒç€Ÿã§ã¯ç¬èªã«éçºããã¹ã¯ãªãããå©çšããŠããŸãã å
¬åŒAPPã¯éç¥å
å®¹ã®æ
å ±ãå
¥ã£ãŠããã®ã§äžèŠãããšäŸ¿å©ã§ãããåŒç€Ÿã®éçºã¹ããŒãã ãšéç¥ãå€ãããŠãéã«éç¥ã®å
å®¹ãæµããããŠããŸãããšããããŸããã ãã®ããããã£ãšã·ã³ãã«ãªå
容ãéç¥ããŠãããç¬èªã¹ã¯ãªãããçšããŠéç¥ãéä¿¡ããŠããŸãã äžå
·åãé害ãã¬ãã¥ãŒäŸé Œãã³ã¡ã³ãããæ°ã¥ããªããšããããäœãåãããããŸãããæ°ã¥ããªãããšãã¯ãªãã£ã«ã«ãã¹ã«ãªãã®ã§ãã ãŸãšã ãããã§ããã§ããããïŒ åŒç€Ÿã§ã¯éçºçç£æ§ãéçºã¹ããŒãã«éãã眮ããŠããããã®ããã«ã¯æéãšã³ã¹ããæããŸãæ¥ã
æ¹åãç¶ããŠããŸãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers ãŸãã6æ28æ¥ïŒéïŒã»29æ¥ïŒåïŒã«ãLeanãšDevOpsã®ç§åŠãã®èè
ã§ããNicole Forsgrenã®æ¥æ¥ããã¹ã©å
±å嵿¥è
å
CTOã®ç»å£ãªã©ãåœå
å€ã®éçºçç£æ§ã«é¢ããææ°ã®ç¥èŠãéãŸãConferenceãéå¬ããŸãã éçºçç£æ§ã«é¢ããä»ã®äŒæ¥ã®åãçµã¿ãæµ·å€ã®äºäŸã«èå³ãããæ¹ã¯ããã²ãç³ã蟌ã¿ãã ããïŒ dev-productivity-con.findy-code.io