ãã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§ããã³ããšã³ãã®ãªãŒããããŠããæ°çŠ( @puku0x )ã§ãã åŒç€Ÿã§ã¯ Nx ãæŽ»çšããŠCIãé«éåããŠããŸãããã®èšäºã§ã¯ãæè¿å°å
¥ãã Nx Agents ã§ããã³ããšã³ãã®CIãããã«é«éåããäºäŸã玹ä»ããŸãã Nxã«ã€ããŠã¯ä»¥åã®èšäºã§ç޹ä»ããŠãããŸãã®ã§ãæ°ã«ãªãæ¹ã¯æ¯éã芧ãã ããã tech.findy.co.jp ããã³ããšã³ãã®CIã®èª²é¡ Nx Agents Nx Agentså°å
¥ã®çµæ Nx Agentså©çšäžã®å·¥å€« ãããžã§ã¯ãã现ããåå²ãã Node.jsã®ããŒãžã§ã³ãæãã ãã£ãã·ã¥ã®æŽ»çš ç¹å®ã®ã¹ãããã®çç¥ é«åºŠãªãšãŒãžã§ã³ãå²ãåœãŠ ãŸãšã ããã³ããšã³ãã®CIã®èª²é¡ ãããŸã§ããã£ãã·ã¥ã®æŽ»çšããã䞊ååãããã·ã³ã¹ããã¯ã®åäžããšãã£ã工倫ã«ãããããã³ããšã³ãã®CIãé«éåããŠããŸããã ããããã³ãŒãããŒã¹ã®å¢å€§ã«ããæéã®ãããã¿ã¹ã¯ã«CIæéãåŒãããããŠããŸãåé¡ãé¡èã«ãªã£ãŠããŸããã æ¬¡ã®å³ã¯ããã£ãã·ã¥ãããããªãã£ãå Žåã®CIæéã®äžäŸã§ãã ä»ã®ã¿ã¹ã¯ãæ©ãçµãã£ãŠãäžçªæéã®ãããã¿ã¹ã¯ãåŸ
ã€å¿
èŠããããããçµæãšããŠCIæéã䌞ã³ãåŸåã«ãããŸããã Nx Agents ã¿ã¹ã¯åäœã®äžŠååã§ã¯ãCIæéã®ããã«ããã¯ãè§£æ¶ããã®ãå°é£ã§ãã ãDTEïŒDistribute Task ExecutionïŒãã¯ãã®åé¡ã解決ããææ³ã§ãããNx Cloudã«ã¯DTEã®ãããŒãžããªãµãŒãã¹ã§ããã Nx Agents ããæäŸãããŠããŸãã Nx Agentsã®åäœã€ã¡ãŒãžïŒNxå
¬åŒããã¥ã¡ã³ãããæç²ïŒ Nx Agentsã¯ä»å¹Ž2æã«ãªãªãŒã¹ãããŸãããè²»çšã¯GitHub Actionsããå®äŸ¡ãšãªã£ãŠããŸãã blog.nrwl.io Nx Agents GitHub ActionsïŒLarger runnerïŒ Linux 2ã³ã¢ $0.0055/min $0.008/min Linux 4ã³ã¢ $0.011/min $0.016/min åè: Nx Cloud - Available Plans GitHub Actions の課金について - GitHub Docs äœ¿ãæ¹ã¯éåžžã«ç°¡åã§ãNxã¯ãŒã¯ã¹ããŒã¹ãNx Cloudã«æ¥ç¶ããåŸãCIã®ã¿ã¹ã¯å®è¡åã«æ¬¡ã®ãããªã³ãã³ãã远å ããã ãã§ãã npx nx-cloud start-ci-run --distribute-on="3 linux-medium-js" å©çšãããã·ã³ã®æ°ãã¹ããã¯ã¯ã倿Žã®åœ±é¿ç¯å²ã«å¿ããŠåçã«èšå®ã§ããŸãã npx nx-cloud start-ci-run --distribute-on=".nx/workflows/dynamic-changesets.yml" # .nx/workflows/dynamic-changesets.yml distribute-on : small-changeset : 3 linux-medium-js medium-changeset : 6 linux-medium-js large-changeset : 9 linux-large-js DTEèªäœã¯GitHub Actionsã® matrix ã®æ©èœãçšããŠæ§æããããšãå¯èœã§ãããCIã倱æããå Žå㯠å¿
ãDTEãã¹ãåŽã®ãã·ã³ãRe-runããå¿
èŠããããŸã ãæ€èšŒããéãã§ã¯èª€æäœã確å®ã«é²ãæ¹æ³ãç¡ãã£ããããNx Agentsã®å©çšãããããããŸãã Nx Agentså°å
¥ã®çµæ Nx Agentsãæå¹ã«ããå Žåã®CIæéã®äŸã瀺ããŸãã ãã®ã¯ãŒã¯ãããŒã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãã«ãããã¹ããåãã§ãã¯ãªã©ãå
šãŠNx Agentsã§å®è¡ããæ§æãšãªã£ãŠããŸãã npx nx-cloud start-ci-run --distribute-on=".nx/workflows/dynamic-changesets.yml" npx nx affected --target=build,build-storybook,test,lint,stylelint,typecheck --configuration=ci npx nx-cloud complete-ci-run å
ã®æ§æã§ã¯çŽ18åããã£ãŠãããã®ãçŽ11åã«ãªããŸããã CIæ¬äœãçŽ10åãåŸè¿°ããäºååŠçã远å ã§çŽ1åãããèšç®ã§ãã CIæéã¯çŽ7ååæžãããŠãããããã 40% ã»ã©é«éåã§ãããšããããšãããããŸããã åã¿ã¹ã¯ãè€æ°ã®ãšãŒãžã§ã³ãã§åæ£å®è¡ãããããšã§ãã¿ã¹ã¯åäœã§äžŠååããŠããå Žåãããé«éåã§ããŸããã Nx Agentså©çšäžã®å·¥å€« Nx Agentsã¯ä»å¹ŽãªãªãŒã¹ãããã°ããã®ãµãŒãã¹ã§ãããããããã¥ã¡ã³ãã®äžåãããŠããŠã®äžè¶³ãšãã£ã課é¡ãããããšã«æ³šæããŸããããããã¥ã¡ã³ãã«ç€ºãããŠããã»ããã¢ããã®äŸã¯ãæäœéã®ãã®ãããªãããæé©åã®äœå°ããããŸãã ããã§ã¯ãåŒç€Ÿã§å®è·µããŠããå©çšäžã®å·¥å€«ã玹ä»ããŸãã ãããžã§ã¯ãã现ããåå²ãã DTEã®æ§è³ªäžãåäœã®ã¿ã¹ã¯ã®å®è¡æéãé·ããªãã»ã©ãšãŒãžã§ã³ãã®å©çšå¹çãäžãããŸãã ã³ãŒããå
šãŠ apps/** åŽã«çœ®ããšãã£ãã·ã¥ãããçãäžããCIæéãå»¶ã³ãããããŸã㯠libs/** ã«åé¢ããããšããå§ãããšè¯ããšæããŸãã å
±æã©ã€ãã©ãªã«ã€ããŠã¯ãã³ã³ããŒãã³ãç³»ããŠãŒãã£ãªãã£ç³»ã§å¥ã®ã©ã€ãã©ãªãšããŠäœããšè¯ãã§ãããã åŒç€Ÿã®å ŽåãäŸãã°ãã«ãæéã 2å ãè¶
ãããããªãã®ã確èªããå Žåã¯ãã¢ãžã¥ãŒã«ã®ç§»åãåå²ã宿œããŸããã åå²ãé£ããå Žåã¯ãNx Agentsã®å®è¡å¯Ÿè±¡ããå€ããšãã£ã工倫ãå¿
èŠãããããŸããã Node.jsã®ããŒãžã§ã³ãæãã nx-cloud-workflows ã® workflow-steps/install-node 㯠nvm ã«å¯Ÿå¿ããŠããŸããnvm以å€ã®ç®¡çããŒã«ãå©çšããŠããå Žåã¯èªåã§ã»ããã¢ããçšã®ã¹ã¯ãªãããæžãå¿
èŠããããŸãã äŸãšã㊠asdf ãçšããå Žåã®ã¹ã¯ãªããã瀺ããŸãã # .tool-versions nodejs 20 . 18 . 0 # .nx/workflows/agents.yml launch-templates : custom-linux-medium-js : resource-class : 'docker_linux_amd64/medium' image : 'ubuntu22.04-node20.11-v10' init-steps : - name : Checkout uses : 'nrwl/nx-cloud-workflows/v4/workflow-steps/checkout/main.yaml' - name : Setup Node.js script : | git clone https://github.com/asdf-vm/asdf.git $HOME/.asdf --branch v0.14.1 source $HOME/.asdf/asdf.sh asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git asdf install nodejs echo "PATH=$PATH" >> $NX_CLOUD_ENV CIæéã¯5ã10ç§ã»ã©å»¶ã³ãŸãããNode.jsã®ããŒãžã§ã³äžäžèŽã«ãããšã©ãŒãåé¿ã§ããŸãã ãã£ãã·ã¥ã®æŽ»çš workflow-steps/cache ãå©çšããäŸåã©ã€ãã©ãªã®ãã£ãã·ã¥ã¯ã»ãŒå¿
é ãšèšããã§ãããã node_modules ããã£ãã·ã¥ããããšã§å€§å¹
ãªæéåæžãå¯èœã§ãã # .nx/workflows/agents.yml launch-templates : custom-linux-medium-js : ïŒäžç¥ïŒ - name : Restore NPM Cache uses : 'nrwl/nx-cloud-workflows/v4/workflow-steps/cache/main.yaml' inputs : key : '.tool-versions' paths : ~/.npm base_branch : '<ããã©ã«ããã©ã³ãå>' - name : Restore Node Modules Cache uses : 'nrwl/nx-cloud-workflows/v4/workflow-steps/cache/main.yaml' inputs : key : '.tool-versions|package-lock.json|yarn.lock|pnpm-lock.yaml' paths : node_modules base_branch : '<ããã©ã«ããã©ã³ãå>' - name : Restore Browser Binary Cache uses : 'nrwl/nx-cloud-workflows/v4/workflow-steps/cache/main.yaml' inputs : key : '.tool-versions|package-lock.json|yarn.lock|pnpm-lock.yaml|"browsers"' paths : | ~/.cache/ms-playwright base_branch : '<ããã©ã«ããã©ã³ãå>' ããã§ç€ºããäŸã§ã¯ã以åã®èšäºãšåæ§ã« ~/.npm ããã£ãã·ã¥ããããšã§ã node_modules ããã£ãã·ã¥ãããããªãã£ãå Žåã§ãå¯èœãªéãé«éåäœããããã«ããŠããŸãã tech.findy.co.jp workflow-steps/cache ã®äœ¿ãåæã¯ actions/cache ãšã»ãŒåãã§ããããã©ã«ããã©ã³ã以å€ã«ãã£ãã·ã¥ãå
±æããå Žåã¯ãããã©ã«ããã©ã³ããžã®pushæã«ãã£ãã·ã¥ãæŽæ°ãããšè¯ããšæããŸãã # .github/workflows/update-cache.yml on : push : branches : - '<ããã©ã«ããã©ã³ãå>' paths : - package-lock.json jobs : cache : runs-on : ubuntu-latest steps : ïŒäžç¥ïŒ - uses : actions/cache@v4 id : cache ïŒäžç¥ïŒ - run : npx nx-cloud start-ci-run --distribute-on="3 linux-small-js" - name : Install dependencies if : steps.cache.outputs.cache-hit != 'true' run : npm ci - run : npx nx-cloud complete-ci-run èšå®å¯èœãªæå°ãšãŒãžã§ã³ãæ°ã¯ 3 ã§ããç¹ã«æ³šæããŸãããã å®ãæžãŸããããšããã§ã¯ãããŸãã... ç¹å®ã®ã¹ãããã®çç¥ 2024幎10æçŸåšãNx Agentsã§ã¯GitHub Actionsã®ãããªæ¡ä»¶åå²ã®æ§æã¯ãµããŒããããŠããŸãããé©å®ã¹ã¯ãªãããæžããŠå¯Ÿå¿ããŸãããã # .nx/workflows/agents.yml launch-templates : custom-linux-medium-js : ïŒäžç¥ïŒ - name : Install Node Modules (if needed) script : | if [ ! -d node_modules ] ; then npm ci fi é«åºŠãªãšãŒãžã§ã³ãå²ãåœãŠ --distribute-on=".nx/workflows/dynamic-changesets.yml" ã¯èšè¿°ãç°¡æœã§ããäžæ¹ãçŸç¶ã§ã¯ small medium large ã®3段éããèšå®ã§ããŸããããŸããè² è·ã«å¿ããŠãã·ã³ã¹ããã¯ãäžãããšãã£ãé«åºŠãªå²ãåœãŠããµããŒããããŠããŸããã nx.dev Nx Agentsã®ä»åŸã®ã¢ããããŒãã«æåŸ
ããŠãè¯ãã§ãããåŸ
ã¡ãããªããšããå Žåã¯æ¬¡ã®ããã«ãã¡ã€ã³ãžã§ãã®å段㧠nx show projects --affected ãå®è¡ãã outputs çµç±ã§ãªãã·ã§ã³ãæž¡ããšè¯ãã§ãããã jobs : check : runs-on : ubuntu-latest outputs : distribute_on : ${{ steps.output.outputs.distribute_on }} parallel : ${{ steps.output.outputs.parallel }} steps : ïŒäžç¥ïŒ - uses : nrwl/nx-set-shas@v4 with : main-branch-name : ${{ github.base_ref }} - name : Get affected projects id : get_affected_projects run : | length=$(npx nx show projects --affected --json | jq '. | length' ) echo "length=$length" >> $GITHUB_OUTPUT - name : Output id : output run : | if [ $ {{ steps.get_affected_projects.outputs.length }} -gt 20 ] ; then echo 'distribute_on="4 custom-linux-large-js"' >> $GITHUB_OUTPUT echo 'parallel=4' >> $GITHUB_OUTPUT elif [ $ {{ steps.get_affected_projects.outputs.length }} -gt 10 ] ; then echo 'distribute_on="3 custom-linux-medium-plus-js"' >> $GITHUB_OUTPUT echo 'parallel=3' >> $GITHUB_OUTPUT else echo 'distribute_on="3 custom-linux-medium-js"' >> $GITHUB_OUTPUT echo 'parallel=2' >> $GITHUB_OUTPUT fi main : needs : check runs-on : ubuntu-latest steps : ïŒäžç¥ïŒ - name : Setup Nx Cloud run : npx nx-cloud start-ci-run --distribute-on=${{ needs.check.outputs.distribute_on }} - run : npx nx affected --target=build,test,lint -parallel=${{ needs.check.outputs.parallel }} ãã®ææ³ã¯ dynamic-changesets.yml ã«ããå€å®ãš nx affected ã§æ€åºããã圱é¿ç¯å²ã«ä¹é¢ãããå Žåã«ãæå¹ã§ãã ãŸãšã ãã®èšäºã§ã¯ãNx Agentsã®å°å
¥ã«ããããã³ããšã³ãã®CIãé«éåããäºäŸã玹ä»ããŸããã Nx Agentsã®æäŸããDTEã®ä»çµã¿ã¯ãã¿ã¹ã¯åäœã®äžŠååãè¶
ããé«éåãå¯èœã§ãã äžæ¹ã§ããããžã§ã¯ãã®çްååãååã§ãªãå Žåããåäžã®ã¿ã¹ã¯ãéåžžã«æéã®ãããå Žåã§ã¯æåŸ
ãã广ãåŸãããªãããã驿驿ã§å©çšããã®ãè¯ãã§ãããã åœå
ã®Nx Agentså°å
¥äºäŸã¯ãŸã å°ãªããšæãããŸãããæ€èšŒäžã«åŸãããç¥èŠã¯ä»åŸãçºä¿¡ããŠãããŸãã®ã§ãæ¯éã圹ç«ãŠãã ãããç§ãã¡ã®åãçµã¿ãå°ãã§ãçæ§ã®å©ããšãªãã°å¹žãã§ãã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã ãèå³ãããæ¹ã¯âãã¡ããããå¿åãã ããã herp.careers
ããšã³ãžãã¢ã®æ¥åžžããšã³ãžãã¢éã®äººçãå€ããäžå Part1 ã§ã¯å€§å€ã奜è©ãããã ããŸããã ä»åã¯Part2ãšããŸããŠãåŒç€Ÿãšã³ãžãã¢ã®äººçãå€ããäžåãã玹ä»ããããŸãã ãã²ãèªæžã®ç§ã®ãäŸãšããŠãåèã«ããŠããã ããã°å¹žãã§ãïŒ äººçãå€ããäžå SRE ãµã€ããªã©ã€ã¢ããªãã£ãšã³ãžãã¢ãªã³ã°âGoogleã®ä¿¡é Œæ§ãæ¯ãããšã³ãžãã¢ãªã³ã°ããŒã ããã°ã©ããç¥ãã¹ã97ã®ããš ãã®æ¬ãèªãã ãã£ãã Clint Shankããã®ãšãã»ã€ãåŠã³ç¶ããå§¿å¢ã Karianne Bergããã®ãšãã»ã€ãã³ãŒããèªãã ãã®æ¬ããåŠãã ããš Clean Coder ãããã§ãã·ã§ãã«ããã°ã©ããžã®é ãŸãšã 人çãå€ããäžå SRE ãµã€ããªã©ã€ã¢ããªãã£ãšã³ãžãã¢ãªã³ã° âGoogleã®ä¿¡é Œæ§ãæ¯ãããšã³ãžãã¢ãªã³ã°ããŒã SRE ãµã€ããªã©ã€ã¢ããªãã£ãšã³ãžãã¢ãªã³ã° âGoogleã®ä¿¡é Œæ§ãæ¯ãããšã³ãžãã¢ãªã³ã°ããŒã ãªã©ã€ãªãŒãžã£ãã³ Amazon ããã«ã¡ã¯ããã¡ã€ã³ãã£ã§SREãæ
åœããŠãã倧ç¢ã§ãããã¡ã€ã³ãã£äžäººç®ã®SREãšããŠå
¥ç€ŸããSREæŽã¯8幎ç®ã«ãªããŸãã ãSite Reliability Engineering -- How Google Runs Production Systemãã®æ¥æ¬èªèš³ã¯ãå€ãã®ãšã³ãžãã¢ã«æèªãããŠããåèã§ãã Googleã®SREããŒã ã®åãçµã¿ãæžãããŠãããããããSREãç®æãæ¹ã¯ãã¡ãããæ¢ã«SREãšããŠã掻èºãããŠããæ¹ãããŸã æ¬æžãèªãŸããŠããªãããã§ãããæ¯éäžåºŠæã«åã£ãŠé ãããäžåã§ãã ç§ã¯ãã€ãŠ2010幎代ååããäžç€ãŸã§å€§èŠæš¡ãªã·ã¹ãã ã§ã€ã³ãã©ãšã³ãžãã¢ãšããŠåããŠããŸããããå®éã¯SREã«è¿ãæ¥åãæ
ã£ãŠããŸããã åã·ã¹ãã ã§ã¯éçºã¡ã³ããŒãšã®ã³ãã¥ãã±ãŒã·ã§ã³ã¯æŽ»çºã§ã¢ãã¿ãªã³ã°ãCI/CDãå°å
¥ããŠããŸããããéçšé¢ã«å¯ŸããŠæ¬¡ã®ãããªãã¬ãã·ã£ãŒãæããŠããŸããã ã·ã¹ãã 倿Žã«å¯Ÿãã倱æã¯èš±å®¹ãããªã æäœæ¥ã«ããç°å¢æ§ç¯ãéçšãå€ã 24/7ã§ã®ãªã³ã³ãŒã«æ
åœ ãããã®ãã¬ãã·ã£ãŒã«å¯Ÿããçãã®1ã€ããSRE Bookãã§ããã ãã®æ¬ã§ã¯SLIãSLOããšã©ãŒããžã§ããããã¹ãã¢ãŒãã ããã€ã«ãšãã£ãSREã«ãšã£ãŠéèŠãªæŠå¿µãããªã³ã³ãŒã«äœå¶ã®èãæ¹ã解説ãããŠããŸãã äŸãã°åè¿°ã®ãã¬ãã·ã£ãŒã«å¯ŸããŠã¯æ¬¡ã®ãããªã¢ãããŒãããšãããšãã§ããŸãã SLI/SLOãå®ããšã©ãŒããžã§ããã«åºã¥ããéçšããããªããã¹ãã¢ãŒãã ãæŽ»ãã ãã€ã«ãæžããããèªååãé²ãã ãªã³ã³ãŒã«äœå¶ã¯é©åãªäººæ°ã§é©åãªæã¡åããè¡ã äžèšã¯åœããåã®ããšãããããŸããããç§èªèº«ã®èããæŽçããããã§åŒ·åãªåŸæŒããããŠãããŸããã ãšããã§ããã¡ã€ã³ãã£ã§ã¯ãããã¯ãæ¯ã«SLI/SLOãèšå®ããšã©ãŒããžã§ããã«åºã¥ããæ¯ãè¿ããæšé²ããŠããŸãã åŒç€ŸSREããŒã ã¯ç«ã¡äžãããæ¥ãæµ
ãã§ãããããããããã®äžåã§åŸãç¥èãæŽ»ããããã¡ã€ã³ãã£ã®ãµãŒãã¹ãããä¿¡é Œæ§ã®é«ããã®ã«ããŠãããããšèããŠããŸãã ããã°ã©ããç¥ãã¹ã97ã®ããš ããã°ã©ããç¥ãã¹ã97ã®ããš ãªã©ã€ãªãŒãžã£ãã³ Amazon éçºæšé²ããŒã ã§ãRubyãšRustãšTypeScriptãæžããŠããããã¯ãšã³ããšã³ãžãã¢ã® 西æ ã§ãããšã³ãžãã¢æŽã¯4幎ç®ã§ãã ãã®æ¬ã¯ãšã³ãžãã¢ãšããŠä»äºããŠããäžã§çŽ æŽãããç¥èŠãå
±æããŠããããšãã»ã€éã§ãã ãšãã»ã€éã§ãããããã¿ã€ãã«ãæ°ã«ãªããšãã»ã€ããèªãã§ãã圢ã§ãåé¡ãªãã§ãã ã©ã®ãšãã»ã€ãçµéšè±ããªãšã³ãžãã¢éãå·çããŠããŸããäŸãã°ãã·ã¹ãã èšèšã«çç·Žãããšã³ãžãã¢ãããã°ã©ãã³ã°èšèªã®ã³ããã¿ãå·çããŠãã豪è¯ãªäžåã«ãªã£ãŠããŸãã ãšãã»ã€ã®ããŒãã¯ããªãã¡ã¯ã¿ãªã³ã°ãèšèšååããšã³ãžãã¢ãšããŠä»äºãããŠããå§¿å¢ããã¹ãçã®æ§ã
ãªãã®ããããŸãã ãã®æ¬ãèªãã ãã£ãã ç§ããšã³ãžãã¢ãšããŠåããŠå幎ã»ã©çµã£ãé ãèªåã®çæ³ã®å§¿ãžè¿ã¥ãããã«ãã©ãããã°ããã®ãåãããªããªã£ãææã§ããããŸããã ãããªäžãæ¯é±éã£ãŠãã ãžã¥ã³ã¯å æžåºæ± è¢æ¬åº ã§ããŸããŸãããã°ã©ããç¥ãã¹ãããšããæåãç®ã«å
¥ã£ãŠããã®æ¬ãèªã¿å§ããŸããã æ¬¡ã®ãšãã»ã€ãèªãã§ãèªåãã©ãããã°ããã®ããæãã€ããã£ããã«ãªããŸããã åœæã®ç§ãå©ããŠããããšãã»ã€ã¯æ¬¡ã®ãã®ã§ãã Clint Shankããã®ãšãã»ã€ãåŠã³ç¶ããå§¿å¢ã ãã®ãšãã»ã€ã§ã¯ãèªåèªèº«ã§åŠã³ç¶ããããã«ãæžç±ãã€ã³ã¿ãŒããããå©çšããåŠç¿ãã¬ãã«ã®é«ã人ãšä»äºãããããšãªã©ãæšå¥šãããŠããŸãã ãŸããæè¡ã®é²åã«å¯Ÿå¿ã§ããããã«ãåžžã«åŠã³ç¶ããéèŠæ§ã«ã€ããŠãæžãããŠããŸãã ãã®ãšãã»ã€ãèªãã§ãåœæã¯æ¬¡ã®ããšãæ¯æ¥æ¬ ããããã£ãŠããŸããã ä»äºã§ããããªãã£ãã©ã€ãã©ãªã®ã¡ãœãããä»çµã¿ããã®æ¥ã®ãã¡ã«ã©ã€ãã©ãªã®ããã¥ã¡ã³ããèªã ã©ã€ãã©ãªã®æåãçè§£ããããã«ããŒã«ã«PCã§ã³ãŒããåãã ãã®ãšãã»ã€ã«ãããæ®æ®µå©çšããŠããã©ã€ãã©ãªã«ã€ããŠã®ç¥èãæ·±ããããšããèšè¿°ãåèã«ããŠããŸããã çŸåšãæ°ã¶æåããæ°èŠãããã¯ãã§Rustã®æ€èšŒãããŠããŸãããããªäžãRustã®ããšããã£ãšç¥ããããšæãã Osaki.rs ãšããã³ãã¥ããã£ãç«ã¡äžããŠãå匷äŒãéå¬ããŠããŸãã ãã®å匷ãç«ã¡äžããèæ¯ã®ã²ãšã€ã«ããã®ãšãã»ã€ã«ãããå匷äŒãèªãç«ã¡äžããããšããèšè¿°ãåèã«ããŠããŸãã ãã®Osaki.rsã¯ãconnpassã®ã¡ã³ããŒæ°ã40人ã»ã©ã«ãªããŸããããããããRustã®å匷äŒãç¶ããŠãããŸãã Karianne Bergããã®ãšãã»ã€ãã³ãŒããèªãã ãã®ãšãã»ã€ã§ã¯ããšã³ãžãã¢ãä»ã®ãšã³ãžãã¢ãèªåã®éå»ã®ã³ãŒããèªãããšã®éèŠæ§ã«ã€ããŠè¿°ã¹ãããŠããŸããä»ã®ãšã³ãžãã¢ãæžããèªã¿ãããã³ãŒããèªãããšã§ãèªèº«ã®æé·ã«ã€ãªãããšåŒ·èª¿ãããŠããŸãã ãŸããéå»ã«èªåãæžããã³ãŒããèªã¿è¿ãããšã§ãã¹ãã«ã®åäžã確èªã§ãããããªãããæ°ãæ¹§ããšãè¿°ã¹ãããŠããŸãã ãã®ãšãã»ã€ãèªãã§ãåœæã¯æ¬¡ã®ããšãæ¯æ¥æ¬ ããããã£ãŠããŸããã èªåãé¢ãããããã¯ãã®ãªããžããªã®å
šãŠã®ãã«ãªã¯ãšã¹ãã«ç®ãéã ããŒã ã¡ã³ããŒãäœæãããã«ãªã¯ãšã¹ããèªãããšã§ãããŒã ã¡ã³ããŒãã©ã®ãããªã³ãŒããæžããŠããã®ããç¥ãããšãã§ããèªåã®ã¹ãã«ã¢ããã«ã€ãªãããšèããŠããŸããã çŸåšãRustãããæžãæ¹ãšèªã¿ãããã³ãŒãã®æžãæ¹ãåãããªãæãã¹ã¿ãŒæ°ãå€ãã©ã€ãã©ãªã®ãœãŒã¹ã³ãŒããèªãã§ãRustãããæžãæ¹ãæ¥ã
åŠãã§ããŸãã ãã®æ¬ããåŠãã ããš äžèšã®ãšãã»ã€ãèªãã§ãåœææ©ãã§ããèªåãã©ãããã°ããã®ããæãã€ããã£ããã«ãªããŸããã ããããæ©ãã§ãªã«ãåããªããããå°ãã ãã§ãããããç¥ããªãã£ãããšã朰ããŠããã»ææŠããŠããããšã®å€§åããåŠã¹ããšæããŸãã ãã£ãªã¢ãããããäœãåŠã¶ïŒãšæ©ãã ãšãã¯ãä»ã§ããã®æ¬ãèªã¿çŽããŸãã ãŸãã宿çã«æžåºãžè¡ã£ãŠãçŽ æŽãããæžç±ãæ¢ããŠããŸãã Clean Coder ãããã§ãã·ã§ãã«ããã°ã©ããžã®é Clean Coder ãããã§ãã·ã§ãã«ããã°ã©ããžã®é äœè
: Robert C.Martin KADOKAWA Amazon 2024幎4æã«ãã¡ã€ã³ãã£ãžå
¥ç€ŸããŠã Findy Tools ã®éçºãããŠããæã§ãã ç§ãã㯠Clean Coderãããã§ãã·ã§ãã«ããã°ã©ããžã®é ãšããæ¬ã玹ä»ããŸãã ç§ã¯ãšã³ãžãã¢ãšããŠåãå§ããŠ2幎ç®ã«æ¬æžãèªã¿ãŸããããèªèº«ãæ¥åã®äžã§æããŠãã課é¡ãšãã®è§£æ±ºçã®ãã³ãã®å€ããåŸãããŸããã ãããŠããã®æ¬ã®èãæ¹ãæ¥ã
ã®æ¥åã«å€§ããªåœ±é¿ãäžããŠããããšèããŠããŸãã æ¬æžã¯ãã¿ã€ãã«ã®éãããããã§ãã·ã§ãã«ããã°ã©ããã«ãªãããã®æè¡çãªã¹ãã«ã ãã§ãªããã³ãã¥ãã±ãŒã·ã§ã³åããšã³ãžãã¢ãªã³ã°ã«å¯Ÿããåãåãæ¹ãªã©ã®ãœããã¹ãã«ã«çŠç¹ãåœãŠãŠç޹ä»ãããŠããŸãã ããã§ããããããã§ãã·ã§ãã«ããšã¯ãã責任ãåããå§¿å¢ãæã€ããšãšå®çŸ©ãããŠããŸããããã¯ããšã³ãžãã¢ãæ±ãããã仿§ãå®çŸããããã®ã³ãŒããæžãã ãã§ãªããæçµçã«ããžãã¹ã®ææãéæãã責任ãæããããšãæå³ããŸãã æ¬æžã§ã¯ããšã³ãžãã¢ãçŽé¢ããããå
·äœçãªèª²é¡ãšãã®è§£æ±ºçã解説ãããŠããŸããäŸãã°ïŒ ãããã¯ãã«ãã°ãçãã ãã¹ãé§åéçºïŒTDDïŒãã广çãªãã¹ãæŠç¥ã®æ§ç¯ãéèŠã ç¡çãªèŠæ±ãçŽæã«éã«åããªãå Žå æç¢ºã«ãããŒããšèšãã仿§ã亀æžããããšãããã®å§¿å¢ã 粟床ã®é«ãèŠç©ãããã§ããªã PERTããã©ã³ãã³ã°ããŒã«ãŒãªã©ã§å
·äœçãªæ°å€ãæããçŸå®çãªèŠç©ãããããã ããŒã ã¯ãŒã¯ã®åé¡ ããã°ã©ãã³ã°ã¯äžäººã§å®çµãããã®ã§ã¯ãªããä»è
ãšã®åæ»ãªã³ãã¥ãã±ãŒã·ã§ã³ãäžå¯æ¬ ã ç¹ã«å°è±¡ã«æ®ã£ãã®ã¯ãæ¬æžã®ç¬¬2ç« ã«ããç¡çãªèŠæ±ã«å¯ŸããŠãããŒããšèšãããšã®éèŠæ§ã§ãã ç§ã¯æ¬æžãèªãåããããã§ãã·ã§ãã«ãªãšã³ãžãã¢ãšã¯ãã©ããªèŠæ±ã«ã察å¿ããæè¡åãæã€ã¹ãã ãšèããŠããŸããã ããããæ¬æžãèªãã§ããã§ããªãããšã¯æãããšããããšããããã§ãã·ã§ãã«ã®è²¬åã§ããããšã«æ°ã¥ããããŸããã ããã«ãã詊ãã«ãã£ãŠã¿ãããšããææ§ãªèšèãåé¡èŠãããŠããŸãã ãã®ãã¬ãŒãºã¯ã調æ»ã®æéãæããŠããã®ãããããã¯å®è£
ã詊ãããšãæå³ããŠããã®ããäžæçã§ã誀解ãæããããŸããã ç§èªèº«ãäœæ°ãªã䜿ã£ãŠããèšèãªã®ã§ããæç¢ºã«äœãåé¡ã§äœãããã®ããå
·äœçã«èšãããã«ããŸããã æ¬æžã®å
容ã¯äžæäžå€ã§èº«ã«ã€ããã®ã§ã¯ãããŸããããç§ã¯æ¥åã§å°ã£ããšãã«äœåºŠãèªã¿è¿ããŠããŸãã ç¹ã«ãæè¿ãšã³ãžãã¢ã«ãªã£ãæ¹ãããããã§ãã·ã§ãã«ãšã¯äœãïŒããšæŒ ç¶ãšããŠããæ¹ã«ãšã£ãŠã匷ãæéãšãªãäžåã§ãããã²æã«åã£ãŠã¿ãŠãã ããã ãŸãšã ãããã§ããã§ããããïŒ ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ããã«ã¡ã¯ãããã°ãã¯ã éçºçç£æ§ã®å¯èŠåã»åæããµããŒããã Findy Team+ éçºã®ããã³ããšã³ã ãªãŒããããŠãã @shoota ã§ãã å
æ¥ã END ã ããã«ã¹ã¿ãã¯ãšã³ãžãã¢ãžã®éïŒãReact ãš TypeScript ã®ä¿®è¡ããã話 ãšããã¿ã€ãã«ã§ããã«ã¹ã¿ãã¯ãšã³ãžãã¢ãç®æãããã®ããã³ããšã³ãã®ä¿®è¡ã®èšäºãæçš¿ããããŸããã ãã¡ãã®èšäºã§ã¯ React / TypeScript ã«ãããŠå人åŠç¿çšåºŠã®ã¬ãã«ã«ãã£ã END ããæ©èœéçºãèªèµ°å¯èœã«ãªããŸã§ã®å
å®¹ãæžãããŠããŸãã ããã§æ¬èšäºã§ã¯ãEND ã®æé·ãšææŠããµããŒãããå®éã«æå°ã«ããã£ãç§ãã¡ã³ã¿ãŒèŠç¹ã§ã®è©±ãããããŸãã è²æã®ã¯ããŸã äžæºå ãŽãŒã«èšå® å©èµ°ãããŠããã å®è·µ è²æã®æ¹éãšå®è·µ ãã¬ãŒããªã 3 ã¶æã®ææãšåæ ãã«ãªã¯ãšã¹ãã®å¯èŠå ã¡ã³ãã£ãŒã®åæ ã¡ã³ã¿ãŒã®åæ ææãšãŸãšã æé·ããããšã³ãžãã¢ãæ¢ããŠããŸãïŒïŒ è²æã®ã¯ããŸã Findy Team+ã®éçºã¡ã³ããŒã¯ããã¯ãšã³ãã»ããã³ããšã³ãã«ãããã䞻軞ã眮ãã€ã€ãå€ãã®ã¡ã³ããŒããã®å£æ ¹ãè¶
ããè²¢ç®ãã§ããããšãç®æããŠããŸãã ãã®ãªãã§ããã¯ãšã³ãã䞻軞ãšããŠãã END ãããã³ããšã³ãé åã«éäžããŠææŠããããšãã話ãæã¡äžãããŸããã ããã³ããšã³ãã¡ã³ããŒã®æ¯çãå°ãªãããçæéã§ã¯ãªãéäžããŠææŠããããšããæ±ºæããããèªåãšããŠãååãã«æå°æ
åœããããŠããããŸããã äžæºå ãŽãŒã«èšå® æ¥ã«è²æããããšãªã£ãŠãäœãšãªãå§ããŠããŸããšã¡ãããšæé·ã§ããŠããã®ããè²æããµããŒãã§ããŠããã®ãã©ãããããããªããªããŸãã ãŸãã¯ããã«ç§ãããã®ã¯ããšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒ(EM) ãšã®ããåããã§ããã å
·äœçã«ã¯æ¬¡ã®ãããªè³ªåãããã©ã®ãããã®æéã§ã©ããŸã§ã§ããããã«ãªãã®ãïŒããããçšåºŠã®å¹
ã§æ±ºããŠãããŸããã ã¡ã³ãã£ãŒãç®æããŽãŒã«ã¯ã©ã®ã¬ãã«ãïŒ EM ã®æåŸ
ãããŽãŒã«ã¯ã©ã®ã¬ãã«ãïŒ ã©ããããã®è²ææéããšããïŒ ãŽãŒã«ã®ã¬ãã«ããã£ãããš 3 段éãæ³å®ããŸããã åºæ¬ã¯ããã¯ãšã³ãã䞻軞ãšãã€ã€ããç¶æ³ã«ããããŠããã³ããšã³ããæžããããã«ãªããã ããã¯ãšã³ãã»ããã³ããšã³ãã«åãéãŠãªãäž¡èŒªã§æŽ»åã§ããããã«ãªããã ããã³ããšã³ã䞻軞ã«ç§»ããã çµæ 2 çªç®ã®ã¬ãã«ãã€ã¡ãŒãžããªããã ããã«ã¹ã¿ãã¯ãªåãããã£ãªã¢ã®ç®æšãšããŠæ³å®ãã€ã€ããŸãã¯ããã³ããšã³ããèªèµ°ã§ããã¬ãã«ã ã ããšãããã 3 ã¶æã ã§ç®æããŠã¿ãããšãªããŸããã å©èµ°ãããŠããã ããšããšå人㧠React ã¯æžããããšããããšãã£ãŠããTeam+ã®èšå€§ãªã³ãŒãã®åã«ç«ã€ãšãªããªãã©ãããæãä»ãããããããšäžå®ã«ãªããã®ã§ãã ãªã®ã§ãŸãã¯ã¡ã³ãã£ãŒã®å¿ã®æºåäœæãšããŠãããã³ããšã³ãã®èãæ¹ããŸãšããèªã¿ç©ãæžããŸããã èªã¿ç© MVC ã¢ãŒããã¯ãã£ããªããžã§ã¯ãæåãšãã£ã銎æã¿ã®æŠå¿µãšç
§ãããªãããã©ããªãã©ãã€ã ã»ã·ãããåŸ
ã£ãŠããã®ããããã°ã®ããã«æžããŠãããŸããã ãã®ã»ãããããŸã§ã«ãããã³ããšã³ãã®èšèšã React ã®ææ³ãªã©ã«é¢ãã瀟å
èšäºãæžããŠããã®ã§ãããããåãããŠå
±æããŠãããŸããã å®è·µ è²æã®æ¹éãšå®è·µ èªåã§èª¿ã¹ããèãããããããšããã¡ã°ã身ã«ã€ãã®ã§ãåºæ¬çã«ã¯å¯ãæ·»ãéãããç§ã®ãªãã§ããã€ãã®ã²ãŒããèšããŠèŠå®ãããšãèšç»ããŸããã ç§ã¯ãããŸã§ããžã¥ãã¢å±€ã®ããã³ããšã³ããšã³ãžãã¢ã®è²æçµéšããã£ãã®ã§ããããã®ã²ãŒããå€ãã®äººãã¶ã€ããå£ã§ããããšãç¥ã£ãŠããããããã¯ãªã¢ã§ããŠããããã¿ãªãããµããŒãã®åŒ·åŒ±ãã€ããŠããç®æ®µã§ãã æé·ã¹ããã React ã« Props ãæž¡ããŠåçŽãª HTML ãåºåããã³ã³ããŒãã³ããæžãã ã³ã³ããŒãã³ããçµã¿åããã倧ããªã³ã³ããŒãã³ããåãå«ããŠæžãã ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®ãã³ãã©ãŒãçŽç²ãªé¢æ°ãšããŠæžãã ããã¯ãšã³ã API ãšã®éä¿¡ã€ã³ã¿ãŒãã§ãŒã¹ãçè§£ããã³ãŒãçæãã§ãã ããŒã¿ãšã³ã³ããŒãã³ãéã TypeScript ãã€ãã£ãŠåå®å
šãã€æŽåããŠã€ãªãããšãã§ãã å€ãã®å Žåã« Step. 3 ãš Step. 5 ãããè©°ãŸããã€ã³ãã§ããããä¹ãåãããã®ç¥èãçè§£ã®ããã®äŒç·ã匵ã£ãŠããããã«ãããã¥ã¡ã³ããªã©ããã«ãªã¯ãšã¹ãã Slack ã§ã©ãã©ãæž¡ããŠãããŸããã ç¹ã« Step. 5 ããžã¥ãã¢å±€ã®é¬Œéã§ããããŸã§ã® React Component ã®ç©ã¿äžããš API ã®åå®çŸ©ãåæã«æŽçããªããã°ãªããªããããããŒã¿ãšããžã¥ã¢ã«ã®è²¬ååé¢ããã®ããã®é¢æ°ãšåã®èšèšãªã©ã§èŠæŠããŸãã æž¡ããè³æã®äžã§ã誀èªãããããã®ãåæç¥èãå€ãå¿
èŠãªãã®ã¯å£é ã§è£è¶³ãããªã©ããªããããããŸã§ã®çè§£åºŠãæž¬ã£ãŠæ¬¡ã®ã¹ãããã«å¿
èŠãªãã®ãéžãã§ããããã«ããŸããã ããã㊠Step. 5 ãä¹ãè¶ããããã®çè§£ãç©ã¿äžããããã«é²è·¯è£æ£ãããŠãããŸããã ãã¬ãŒããªã ãã®ããã«ææŠããã¡ã³ãã£ãŒåŽã«ã¯ãããããªå£ãè¶
ããããã®é 匵ããå¿
èŠã«ãªã£ãŠããŸãããäžæ¹ã§ãµããŒãããã¡ã³ã¿ãŒåŽããèªåã®ããã©ãŒãã³ã¹ãç¶æãç¶ããã®ãé£ãããªã£ãŠããŸãã ã©ããããã®åã¿ã®ãµããŒããå¿
èŠãã¯åã
人ã«ãã£ãŠéããŸãããå°ãªããšãã¡ã³ã¿ãŒã® 20%ãããã¯ãµããŒãã«åãæ³šããããã®ã§ãã Findy ã§ã¯ Findy Team+ ã䜿ã£ãŠèªåã®ããã©ãŒãã³ã¹ãèšæž¬ããç¿æ
£ããããŸãããç§ã¯ è²æã«éããŠãã®æ°å€ãããçšåºŠã¯èœã¡èŸŒãããšãèŠæ ã®äžã§ããã®èœã¡èŸŒã¿å¹
ãã§ããã ãå°ããããããšã«ãææŠããŠããŸããã ç§ã®ãããŒãžã£ãŒã«ããã®æ³å®ã®èœã¡èŸŒã¿å¹
ã®ããåãããããè²æãšèªå·±ããã©ãŒãã³ã¹ã®ãã©ã³ã¹ããšã£ãŠããããšã 1on1 ãªã©ã§è©±ããŠããŸãã ããã©ãŒãã³ã¹ãå¯èŠåããããšã§æ°å€ã®å€åã«ãã¡ããšçç±ä»ããã§ããã®ã Findy Team+ ã䜿ã£ãŠããæå€§ã®å©ç¹ã§ãã 3 ã¶æã®ææãšåæ ãã«ãªã¯ãšã¹ãã®å¯èŠå å®éã«ã¯æ³å®ãããæé·é床ãå®å®ããŠããã®ã§æåã® 2 ã¶æåŒ±ã§èšå®ãããŽãŒã«ã«å°éãããã§ãããããšããããã¯ãã®ãŸãŸ 3 ã¶æéã¿ã£ã¡ããšé²ããŠã¿ãŸããã é£æåºŠãé«ãããªãã¿ã¹ã¯ãäžå¿ã«å®æœããŠããã£ãŠã¯ãããã®ã®ãæçµçã«ããã³ããšã³ããžã® ãã«ãªã¯ãšã¹ãæ°ã¯ç§ãšã»ãŒåçãããä»¥äž ãåºããããã«ãªã£ãŠããŸããã Team+ã®ã°ã©ãã§å¯èŠåããŠã¿ããšæ¬¡ã®ããã«ãªããŸããã éãç§ããªã¬ã³ãžãEND ã¡ã³ãã£ãŒã®åæ å
ã»ã©ã®ã¡ã³ã¿ãŒïŒç§ïŒãšã¡ã³ãã£ãŒïŒENDïŒã®äž¡æ¹ã® PR äœææ°ã§ããããããã¡ã³ãã£ãŒïŒENDïŒã ãã«çµããšãäžç€ã«æ°å€ã®è°·ããããŸãã å®ã¯ãããçãéãã§ãåè¿°ã®æ³å®ãã Step ãšæéãç
§ããåãããããšã§æé·ã®éçšãèŠããŠããããã«ãªããŸãã è²ææ¹éãšããã©ãŒãã³ã¹ã®è°· ã¯ããã¯åçŽãª HTML åæã®ããã® Component äœæïŒStep. 1, 2ïŒã§äŒžã³ãŠããæ°å€ãããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å®è£
(Step. 3) ãå§ãŸããšåŸã
ã«éåããŠãããŸãã ã€ã³ã¿ã©ã¯ã·ã§ã³ã®å®è£
ã«æ
£ããŠãããšããã¯ãšã³ã API ãšã®é£å (Step. 4) ã®ã€ã¡ãŒãžãã€ãããããªã£ãŠããŸãããããããããã€ãªãããšãããšèæ
®ããããšãäžæ°ã«å¢ãããããæ°å€ãäžãã£ãŠããŸãã ãããŠãã®é¬Œéãä¹ãè¶ãããšããŸããããããšé 調ã«äŒžã³ãŠããäºãããããŸãã ã¡ã³ã¿ãŒã®åæ æ¬¡ã«èªåãã¡ã³ã¿ãŒãããŠããæéã«ã©ããããã®ããã©ãŒãã³ã¹åœ±é¿ããã£ãããèŠãŠã¿ãŸãã åãæéã§ã®ç§ã® PR äœææ°ãã°ã©ãã«ãããšãäœãšãã€ãŸããªããããã«å€åãå°ãªãã°ã©ãã«ãªããŸããã ã¡ã³ã¿ãŒã®PRäœææ° ãããããã«ã¯ç§å¯ããããŸãã ãŸãã¡ã³ã¿ãŒãå§ããŠããã¡ã³ãã£ãŒã®ãã«ãªã¯ãšã¹ãã¯ãã¹ãŠã¬ãã¥ãŒããŠãããããã«èªåã®ããã©ãŒãã³ã¹ã«å¯Ÿãã圱é¿ãæããŠããŸããã å
·äœçã«ã¯æ¬¡ã®ãããªããšãããã«ãªã¯ãšã¹ãããããããšã«éœåºŠå®æœããŠããããã§ãã èšèšæå³ãæ±²ã¿åãã«ããæ§é ã«ãªã£ãŠããéšåãèªã¿è§£ã å³å¯ã§ãªãåå®çŸ©ã«ãã£ãŠåãã§ãã¯ãããæããŠããç®æããªãããã§ãã¯ãã ææå
容ãšãšãã«å®è£
ãµã³ãã«ãæžãããããã®çç±ã瀺ããªãã¡ã¬ã³ã¹ãæ¢ããŠæç€ºããã ããã§ãããŒãžã£ãŒãšçžè«ããŠãèªèº«ã®ãã«ãªã¯ãšã¹ãäœææ°ã 4 以äžã«ãªããªãããã«æ°Žæºãç¶æããŠããããšã宣èšããã¬ãã¥ãŒã®æ¿åºŠã調æŽããŠãã£ãã®ã§ãã ïŒãããŸã§ã®ç§ã®å¹³åãã«ãªã¯ãšã¹ãäœææ°ã¯ 5.6ã5.8 çšåºŠã§ããïŒ ããããŸã§çãéãã«ãã«ãªã¯ãšã¹ãæ°ã調æŽã§ãããã®ãïŒããšæããããããããŸããã ãããèªåã®ããã©ãŒãã³ã¹ãèœãšããŠã¯éçºãé²ãŸãããŸãäžæ¹ã§ã¡ã³ããŒã®æé·ã«ãæè³ããªããã°å
šäœã®çç£æ§ãé«ãŸããŸããããã® å®çžŸãšæè³ã®ãã©ã³ã¹ãèªåã®æ°å€ã軞ã«ãã ããšã§å
šäœæé©ãå³ã£ãŠãã£ãã®ã§ãã ãã£ãšèªåããã«ãªã¯ãšã¹ããæžããç¶æ³ã§ããã®åã¯è²æãžã®æè³ã«äœ¿ããŸãããããããŠãããŒãžã£ãŒãšåæããããã©ãŒãã³ã¹ãç¶æããªãããæå€§éã®è²æãé²ããã®ã¯æå€ãšé£ãããããŸããã ææãšãŸãšã ä»åã®è²ææéã®å
šäœãéããŠãããããèšç»ã©ããã«é²ããããšãã§ããŸããããã¡ããã¡ã³ãã£ãŒã®ããã³ã·ã£ã«ã®é«ããã¡ã³ã¿ãŒã®çµéšããã£ãŠã®ããšã§ãããæ¬¡ã®ãããªç¹ãæåãžã®éããã¹ã«ãªã£ããšæããŸãã ã¡ã³ãã£ãŒã®ãŽãŒã«èšå®ã æè¡ãªãŒããšãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒã®äž¡è
ã§åæããŠããéå§ããããš é©åãªã¹ããããšã¶ã€ããå£ãçšæããããš æé·ã®ããã®ãé©åºŠãªã¹ãã¬ã¹ããæãç¶ããããããã«ããããšã§ãã¢ãããŒã·ã§ã³ãç¶æ æã倧ããªè°·ãè¶
ããããã®æºåãšããŠãµããŒããæèãã ã¡ã³ã¿ãŒã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãšãã®ä¿èšŒã©ã€ã³ãé©åã«èšå®ãã ãã®ããã©ãŒãã³ã¹ã©ã€ã³ãææšãšã㊠ãµããŒãã®åã¿ãå¯å€ã§ããããã«ããããš ãããã«ãã£ãŠãéå§æã«èšå®ãããŽãŒã«ãè¶
ããŠçéã§æé·ããŠããããŸããã åæ¥ã®æ§å æåŸã«ããã¡ã³ãã£ãŒã®åæãã§ããã END ã®ãã«ãªã¯ãšã¹ãäœææ°ã°ã©ããããäžåºŠã¿ãŠã¿ããšãéåžžã«ãããããªããã³ã°ã¯ã«ãŒã¬ãŒæ²ç·ã«ãªã£ãŠãããéåžžã«è峿·±ããªãšæããŸããã æé·ããããšã³ãžãã¢ãæ¢ããŠããŸãïŒïŒ ããã¯ãšã³ã䞻軞ã®ããªãã§ãããã³ããšã³ãéçºãèªèµ°ã§ããã¬ãã«ãŸã§æé·ããããšãåºæ¥ãŸãã ãã¡ããããã³ããšã³ãã倧奜ããªããªããããªãŒããšã³ãžãã¢ãç®æããŠã¹ãã«ã¢ããã§ããããšã§ãããïŒ ãã²ããå¿åãåŸ
ã¡ããŠãããŸã (â©ÂŽâ ïœ)â© herp.careers
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã æ¢ã«çããã埡åç¥ããšæããŸãããåŒç€Ÿã§ã¯éçºçç£æ§ã®åäžã«å¯ŸããŠéåžžã«åãå
¥ããŠããŸãã 以åå
¬éããâã®èšäºã§ãåŒç€Ÿã®é«ãéçºçç£æ§ãæ¯ããŠããåãçµã¿ãæè¡ã«ã€ããŠã話ãããŠããã ããŸããã tech.findy.co.jp ãããããããšã«ããã®èšäºãå€ãã®æ¹ã«èªãã§ããã ãåé¿ãããã ããŠãããŸãã ããã§ä»åã¯ãâã®èšäºã§ã玹ä»ãããŠãããPull requestã®ç²åºŠãã«ã€ããŠæŽã«æ·±å ãããŠã話ããããšæããŸãã Pull requestã®ç²åºŠã¯ãåŒç€Ÿã«JOINãããæåã«å¿
ãèŠããŠãããæéèŠãã¯ããã¯ã®1ã€ã§ãã ããã§ã¯èŠãŠãããŸãããïŒ å€§ããªPull request é©åãªç²åºŠãšã¯ é©åãªç²åºŠãç¶æããããã« ã¿ã¹ã¯åè§£ è¿·ã£ããå°ãã ã¬ãã¥ãŒãæåªå
ã«ãã CIé«éå feature flagéçš topic branchéçš ãŸãšã 倧ããªPull request Pull requestã®ã¬ãã¥ãŒäŸé Œãé£ãã§ããŠç¢ºèªãããã倧ããªPull requestã§ãã©ãŠã¶ããã£ãšéããçµéšãããæ¹ã¯å°ãªããªããšæããŸãã 倧ããªPull requestã«ããããã¡ãªããã¯æ°å€ãååšããŸãã ãããšæãã€ããã¡ãªãããåæããŠã¿ãŸããå¿åœãããããèªè
ã®æ¹ãããã®ã§ã¯ãªãã§ããããïŒ topic branchã®çåæéãé·ããªããçµæçã«base branchãšã®å·®åã倧ãããªãconflictã®çºç確çãé«ããªã 倿Žå
容ãå€å²ã«æž¡ããããåé¡çºçæã®åå ç¹å®ã«æéãæãã£ãŠããŸã revertæã«äœèšãªå
容ãŸã§revertãããŠããŸã ã¬ãã¥ãŒã®è³ªãèœã¡ã ã¬ãã¥ã¯ãŒãèŠãã¹ãç¯å²ãåºããªããããèªç¥è² è·ã倧ãããªã ããšã§èŠãšãããããšãªããã¡ çµæçã«topic branchã®çåæéãé·ããªã base branchãšã®å·®åã倧ãããªã conflictã®çºç確çãé«ããªã ææå
容ãå¢ããçµæçã«ææ»ããå¢ãã etc ãã®ããã«ãã¡ãªããã¯æ°å€ãååšããŸããã·ã¹ãã éçºã«ãããŠå€§ããªPull requestã®ååšã¯ãåæ»ãªéçºãé»å®³ããèŠå ãšãªãã§ãããã ã§ã¯ã倧ããªPull requestããšã¯å
·äœçã«ã©ããªPull requestã®ããšãæããŠããã®ã§ããããïŒ é©åãªç²åºŠãšã¯ ããã§ãµã€ãºãšç²åºŠã®éãã説æããå¿
èŠãåºãŠããŸãã ãã®Pull requestã1ã€ã®ããšã«æ³šåã§ããŠãããã©ããããç²åºŠãèªãäžã§éåžžã«éèŠãªãã€ã³ãã«ãªããŸãã Pull requestã®ãµã€ãºãšã¯ãã³ãŒãã®å€æŽè¡æ°ã倿Žãã¡ã€ã«æ°ã®ããšãæããŸãã ããããã³ãŒãã®è¡æ°ã倿Žãã¡ã€ã«æ°ãå€ãã£ããšããŠãã倿Žå
容ãäžæã§ããã°åé¡ãªãã¯ãã§ãã äŸãã°ã颿°åã倿ŽããŠäžæ¬çœ®æããå ŽåãäŸã«æããŸãããã倿Žãã¡ã€ã«æ°ã¯å€ããªããŸããã倿Žå
容ã¯äžæã§ãã ãããã£ãã±ãŒã¹ã®å ŽåãPull requestã®æŠèŠæ¬ã«äžæ¬çœ®æããæšãèšèŒããŠããã°ã倿Žå
容ãå
šãŠç¢ºèªãããšã倿ŽåŸã®é¢æ°åãã¬ãã¥ãŒããCIãéãã°ããŒãžåºæ¥ãã¯ãã§ãã äžæ¹ãPull requestã®ç²åºŠãšã¯ãã³ãŒãã®å€æŽå
容ã®ããšãæããŸãã äŸãã°ã倿Žãã¡ã€ã«æ°ãå°ãªãäžæ¹ãããŒã¿ååŸã»ããŒã¿å å·¥ã»æç»åŠçãåãPull requestã§å¯Ÿå¿ããå ŽåãäŸã«æããŠèããŠã¿ãŸãããã ãã®å Žåãããããã®åŠçã¯å
šãç°ãªãå
容ã§ãããããåãPull requestå
ã§å¯Ÿå¿ããŠããŸã£ãããã倿Žå
容å
šãŠãäžåºŠã«ã¬ãã¥ãŒããå¿
èŠããããã¬ãã¥ã¯ãŒã«å¯Ÿããèªç¥è² è·ã倧ãããªã£ãŠããŸããŸãã æ¥µè«ã§ãããããšã倿Žè¡æ°ã1äžè¡ãè¶
ããŠãããšããŠãã倿Žå
容ãäžæã§ããã°åé¡ã¯ç¡ããšèããŠããŸãã éã«å€æŽè¡æ°ã20è¡çšåºŠã®äžå
·åä¿®æ£ã®äžã«ãã€ãã§ã«ãªãã¡ã¯ã¿ãããå
容ãå«ãŸããŠããå Žåãç²åºŠã倧ãããšå€æãPull requestãåå²ãã¹ããªã®ã§ãã ãªããªãã°ãããäžå
·åä¿®æ£ã«å€±æããŠããŠrevertããããšããéã«ãã€ãã§ã«ãªãã¡ã¯ã¿ããå
容ãrevertãããŠããŸãããã§ãããããã£ãã±ãŒã¹ã®å Žåããªãã¡ã¯ã¿ãããPull requestãå¥ã§äœæããŸãã ã€ãŸãæ¬è³ªã¯ã³ãŒãã®å€æŽè¡æ°ã倿Žãã¡ã€ã«æ°ã§ã¯ãªãã倿Žå
容ãã®ãã®ã«ãããšããããšãçè§£ã§ããããšæããŸãã ç²åºŠãé©åã§ããã°ã1è¡ã ãã®ä¿®æ£ã§ãã1äžè¡ã®ä¿®æ£ã§ãåé¡ãããŸããã 10ã®ãã«ãªã¯ã1åã¬ãã¥ãŒãããããã1ã®ãã«ãªã¯ã10åã¬ãã¥ãŒããæ¹ããäœæè
ãã¬ãã¥ã¯ãŒå
±ã«è² æ
ãå°ãªãã®ã§ãã é©åãªç²åºŠãç¶æããããã« ã¿ã¹ã¯åè§£ Pull requestã®ç²åºŠã«ã€ããŠå®å
šã«çè§£ããã®ã§ãããããã¯é©åãªç²åºŠã§Pull requestãäœããïŒãšæãç«ã£ãŠããããã«å®çŸãããã®ã¯é£ãããã®ã§ãã çè§£ã¯ããŠãããã©ããã£ãŠã¿ããšããããšãã©ãã©ãå¢ããŠãããçµæçã«Pull requestãè¥å€§åããã¡ã§ãã ããã解決ããã®ãã¿ã¹ã¯åè§£ã§ããæŠèŠã¯âã®ããŒãžãåç
§ããŠãã ããã tech.findy.co.jp ã¿ã¹ã¯åè§£ã«é¢ããŠããå¥ã®æ©äŒã§è©³çްã«ã話ã§ããã°ãšæããŸãã è¿·ã£ããå°ãã ãšã¯èšããæåã®ãã¡ã¯ç²åºŠã«å¯ŸããŠæ©ãããšãåºãŠãããšæããŸãã ãã£ãšäœã蟌ãã§ããã¬ãã¥ãŒäŸé ŒãåºãïŒãããšãä»ã®æ®µéã§åºãïŒã§ãä¿®æ£å
容ãå°ããããªããïŒãªã©ãšãã£ãèè€ã¯èªåã«ãçµéšããããŸãã ããããæã¯ãããå°ããç²åºŠã®æ®µéã§ã¬ãã¥ãŒäŸé Œãåºãããšããªã¹ã¹ã¡ããŸããã¬ãã¥ãŒã®ããåãã®äžã§ç²åºŠã«å¯Ÿããè°è«ãè¡ããããã§èªèãåãããã°OKã§ãã Pull requestã倧ããäœã£ãŠåŸããåè§£ãããããå°ããäœã£ãŠåŸããä¿®æ£å
容ã远å ããæ¹ãå§åçã«æ¥œã ããã§ãã ãŸãã¯å°ããããŠãè¯ãã®ã§å°ããäœããããããèä»ãããŠãããããªã€ã¡ãŒãžã§Pull requestãäœæããŠãããšè¯ãã§ãããã ã¬ãã¥ãŒãæåªå
ã«ãã Pull requestã®ç²åºŠãå°ãããªã£ãå Žåãã¬ãã¥ãŒäŸé Œã«å¯ŸããŠæåªå
ã§åãçµãå¿
èŠããããŸãã ãªããªãã°ãããŒãžããªããšæ¬¡ã®ä¿®æ£ã«çæåºæ¥ãªãå Žåã«ãã¬ãã¥ãŒãããã«ããã¯ã«ãªãçµæçã«éçºã¹ããŒããé
ããªã£ãŠããŸãããã§ãã èªåã®äœæ¥ãäžæäžæããŠã10åçšåºŠã¬ãã¥ãŒããŠèªåã®äœæ¥ã«æ»ããšã³ã³ããã¹ãã¹ã€ãããæ»ãã®ãéåžžã«é£ãããšæããŸãã ã§ãå¿é
ããªããŠããã§ããPull requestã®ç²åºŠãé©åã§ããã°ãã¬ãã¥ã¯ãŒã確èªããå
容ãå°ãããªãããã¬ãã¥ãŒã«æããæéãççž®ãããŸãã ãã®ãããèªåã®äœæ¥ãäžæäžæããããšã«ãªã£ããšããŠãããããŸãèªåã®äœæ¥ã«æ»ãããšãã§ããããã«ãªããŸãã åŒç€Ÿã§ã¯1ã€ã®Pull requestã®ã¬ãã¥ãŒã«æããæéã¯ã»ãã®æ°åçšåºŠãšãªã£ãŠããŸãã1å以å
ã§çµããããšããããŸãã ç²åºŠãé©åãªPull requestãåœããåãšãªãã°ãã¬ãã¥ãŒãæåªå
ã«ããç¿æ
£ãæåãçµç¹ã«æ ¹ä»ãã¯ãã§ãã CIé«éå ç²åºŠãå°ãããªã£ãŠãããšãåœç¶ãªããäœæãããPull requestã®æ°ãå¢ããŸããã€ãŸãCIã®å®è¡åæ°ãæ¯äŸããŠå¢ããŠãããŸãã CIã®å®è¡åæ°ãå¢ããç¶æ
ã§å®è¡é床ãé
ããšãéã«éçºå¹çãèœã¡ãŠããŸããŸããCIãé
ãããPull requestã®ç²åºŠã倧ãããªã£ãŠããŸããšãã£ãã±ãŒã¹ãèŠãããšããããŸãããããªã£ãŠããŸããšæ¬æ«è»¢åã§ãã ããã§CIã®é«éåãåæã«é²ããæ¹ãè¯ãã§ãããã詳现ã¯ãã®èšäºã§ã¯å²æããŸãããâã®å¥èšäºãåèã«ããŠã¿ãŠãã ããã tech.findy.co.jp feature flagéçš Pull requestã®ç²åºŠã¯é©åã«ãããããæ¬çªç°å¢ã«ã¯åœ±é¿ãåºããããªãããšãããã¿ãŒã³ã¯feature flagã䜿ããšè¯ãã§ãããã ããŒã«ã«ç°å¢ã§ã®ã¿å®è¡ããããããªã³ãŒãã«ããŠãããŠããã®ç¶æ
ãç¶æãã€ã€base branchã«ããŒãžãç¶ããŸããæ¬çªå
¬éOKã®ã¿ã€ãã³ã°ã§feature flagãè§£é€ããæ¬çªç°å¢ã«åæ ããŸãã feature flagã®éçšæ¹æ³ã¯SaaSã䜿ããã©ã€ãã©ãªã䜿ããªã©ã®æ¹æ³ããããŸãããä»åã¯äžçªã«ã³ã¿ã³ã«å°å
¥ã§ããæ¹æ³ã®ãã³ãŒãäžã«ãã©ã°ãåã蟌ãã§åãæ¿ããææ³ã玹ä»ããŸãã å®éã«ã³ãŒãã®äŸãèŠãŠã¿ãŸãããã export const SampleComponent = () => { const isEnabledNewLabel = process .env.FEATURE_NEW_LABEL === 'true' ; return ( < div > { isEnabledNewLabel && < span > NEW </ span > } < span >Sample</ span > </ div > ); } ; ç°å¢å€æ°ã«åã蟌ãŸããŠãã FEATURE_NEW_LABEL ã®å€ã«ãã£ãŠã NEW ã®è¡šç€ºãåãæ¿ããåçŽãªcomponentã§ãã ãã®ä»çµã¿ã«ãããããŒã«ã«ç°å¢ã®ç°å¢å€æ°ãtrueãæ¬çªç°å¢ã®ç°å¢å€æ°ãfalseã«ããããšã§ãæ¬çªç°å¢ã«åœ±é¿ãäžããã«æ°æ©èœã®éçºãé²ããããšãå¯èœã«ãªããŸãã éçºãå®äºããŠæ¬çªç°å¢ã«åæ ããéã«ã¯ãæ¬çªç°å¢ã®ç°å¢å€æ°ãtrueã«ããããšã§æ°æ©èœãå
¬éã§ããŸããäœãããã®åé¡ãçºçããå Žåãæ¬çªç°å¢ã®ç°å¢å€æ°ãfalseã«æ»ãããšã§ãæ°æ©èœãéå
¬éã«å€æŽå¯èœã§ãã æ¬çªç°å¢ã§åé¡ãèµ·ããªããã°ãç°å¢å€æ°ã®ãã©ã°ãšã³ãŒãäžã®åå²ãåé€ããŸãã ãã®ææ³ã¯feature flagã®ç®¡çãç
©éã«ãªã£ãããã³ãŒãå
ã®åå²ããã¹ãã±ãŒã¹ãå¢ãããšãã£ããã¡ãªããããããŸãããPull requestã®ç²åºŠãé©åã«ç¶æããããã«ã¯éåžžã«æå¹ãªææ®µã§ãã æ¬çªç°å¢ã«åœ±é¿ãåºããã«ãPull requestã®ç²åºŠãé©åã«ç¶æãç¶ããã¹ããŒãæãæã£ãŠéçºããææ®µã®ïŒã€ãšããŠæŽ»çšããŠã¿ãŠãã ããã topic branchéçš æ§ã
ãªäºæ
ã«ãã£ãŠfeature flagã䜿ããªãã䜿ããããªãå Žåã®ææ®µãšããŠãtopic branchéçšã玹ä»ããŸãã base branchããtopic branchãåã£ãŠãããããæŽã«develop branchãåããŸããdevelop branchããtopic branchãžã®Pull requestãäœæããããã§ç²åºŠãç¶æãã€ã€ã¬ãã¥ãŒãããŸãã æ¬çªåæ OKã®ã¿ã€ãã³ã°ã§topic branchããbase branchãžã®Pull requestãäœæããããŒãžããŸãããã®ã¿ã€ãã³ã°ã§ã®ã¬ãã¥ãŒã¯å¿
èŠæäœéã§OKã§ãããªããªããdevelop branchããtopic branchãžã®Pull requestã§ã¬ãã¥ãŒããŠããããã§ãã ãã®ææ³ã«ãããbase branchã«ã¯ãªãªãŒã¹ã®ã¿ã€ãã³ã°ãŸã§å€æŽå
容ãåæ ãããŸããããã®ããæ¬çªç°å¢ãžã®åœ±é¿ãäžãããPull requestã®ç²åºŠãé©åã«ç¶æãç¶ããããšãå¯èœã«ãªããŸãã 宿çã«base branchããtopic branchãžå€æŽãmergeããŠããã®ããã€ã³ãã§ããtopic branchã®çåæéãé·ããªãã®ã§ãbase branchãšã®å·®åã倧ãããªãconflictãçºçãããããªãããã§ããæäœã§ã1æ¥1åã¯base branchã®ä¿®æ£å
容ãåã蟌ãã§ãããšè¯ãã§ãããã ãŸãšã ãããã§ããã§ããããïŒ ç²åºŠãé©åã«ç¶æããããšã§ãã¬ãã¥ã¯ãŒãã¬ãã¥ã€ãŒã®äž¡è
ã«å¯ŸããŠåªããPull requestãäœæãç¶ããããšãã§ããŸãã åŒç€Ÿã§ã¯æéèŠãã¯ããã¯ã®1ã€ãšããŠããŸãããæ¯èŒçã«ã³ã¿ã³ã«èŠããããšãã§ããã³ãããæŽãã°èª°ã§ãå®è·µã§ããå
容ã§ãã æ¯éãçããã詊ããŠã¿ãŠãã ããã çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers
ããã«ã¡ã¯ããã¡ã€ã³ãã£ã§Findy Team+ïŒä»¥äžTeam+ïŒãéçºããŠããENDïŒ @aiandrox ïŒã§ãã æ®æ®µã¯ããã¯ãšã³ãã®éçºãã¡ã€ã³ã§æ
åœããŠããã®ã§ããã3ã¶æéããã³ããšã³ãã®éçºã«ææŠããæ©äŒããããŸãããçãæéã§ããããããã³ããšã³ãããã¯ãªãŒãããçŽæ¥æå°ããŠããããªããå®è£
ãããããšã§ãããã³ããšã³ãã®éçºãäžäººã§ã§ãããããã«æ
£ããããšãã§ããŸããã ä»åã¯ããã®çµéšãšåŠã³ã«ã€ããŠæžããŠãããŸãã ããã³ããšã³ãã«ææŠããåã®èªåã«ã€ã㊠ããã³ããšã³ãã«ææŠããããšã«ãªã£ãçµç·¯ ããã³ããšã³ããåŠã¶äžã§å©ããããããš ããã³ããšã³ãã®ããŠããŠãæºãŸã£ãèšäºã®å
å® éçºããŒã«ãæã£ãŠãã ããã¯ãªãŒããšãã³ããŒãã³ã§ã¿ã¹ã¯ããã£ãŠãã react.devã®èŒªèªäŒ ã€ãŸã¥ããç¹ ã¿ã¹ã¯ç²åºŠãé©åã«åå²ããããš Team+ã®ããã³ããšã³ãã®è²¬åã®èãæ¹ TypeScriptã§æ
£ããå¿
èŠããã£ãããš 3ã¶æã®ææŠã®ææ èªèº«ã®äŒžã³ãã ãããã« ããã³ããšã³ãã«ææŠããåã®èªåã«ã€ã㊠ããšããšã¯ããã¯ãšã³ãïŒRuby on RailsïŒã®éçºãã¡ã€ã³ã§ããŠããŸããã åè·ã§ã¯ç¹ã«ããã¯ãšã³ããšããã³ããšã³ããåãããŠããããRails View / CoffeeScript / FlowType / jQuery / Reactã®æ··åšããããã³ããšã³ããè§Šã£ãŠããŸããããŸããå人éçºã§React / TypeScriptãè§Šã£ãããšã¯ãã£ããã®ã®ããããŸã§ãåãããšãéèŠããŠãããããã¢ãŒããã¯ãã£ã®æèã¯ããŸãããŠããŸããã§ããã Team+ã®ããã³ããšã³ãã§ã¯ãå幎ã«ä¿®æ£ãã«ãªã¯ãããã€ãåºããã®ã§ãã¢ãŒããã¯ãã£ã¯ãªããšãªãææ¡ããŠããŸãããããããæ¢åã®å®è£
ãèžè¥²ãããŸãŸäžéšãä¿®æ£ããçšåºŠã ã£ãã®ã§ãæ°èŠã§Componentãäœã£ãããšã¯ãããŸããã§ããã ããã³ããšã³ãã«ææŠããããšã«ãªã£ãçµç·¯ ããšããšå人éçºãªã©ãããŠããã®ã§ãããã³ããšã³ããžã®èå³ããããŸãããå°æ¥çã«ã¯ãã«ã¹ã¿ãã¯ãšã³ãžãã¢ãšããŠã¹ãã«ãåºããããšããæãããããŸãããããŸãã¯ããã¯ãšã³ãã®æè¡ã身ã«ä»ããããšãåªå
ããŠããŸããããããªäžããããã³ããšã³ãã®æãè¶³ããªããã ãã©ãã£ãŠã¿ãªãïŒããšããææ¡ããããŸããã ããæ©äŒïŒãšããããšã§ããããããã§ããããããã¯ãªãŒããšäžç·ã«ãã£ãŠãããããšæã£ãŠãŸããããã£ããŒããšãã³ãã³æåã§é²ãã§ãããŸããã ããã³ããšã³ããåŠã¶äžã§å©ããããããš ããã³ããšã³ãã«ææŠããã«ãããã以äžã®ãµããŒããããããšã«ãããã¹ã ãŒãºã«å®è£
ãé²ããããšãã§ããŸããã ããã³ããšã³ãã®ããŠããŠãæºãŸã£ãèšäºã®å
å® ç€Ÿå
èšäºã«ãããã³ããšã³ããæžããšãã«äœãèããŠããããã©ãããŠãããããšãããã®ãããããããåèã«ã§ããŸããããããŒã¿å±€ãæ±ããã®ã¯ããŒã¿å±€ã®è²¬åã«éã蟌ãããã¬ãŒã³ããŒã·ã§ã³å±€ã¯èŠãç®ã«æ³šåãããã€ãŸããPure㪠Presentational Componentã¯ååãšããŠããžãã¯ãæã£ãŠã¯ãªããªãããšãã£ãåºæ¬çãªèãæ¹ãšãå®éã«ç»é¢ãäœããšãã®äœæ¥å·¥çšãæžããŠããã®ã§ããšãŠã圹ç«ã¡ãŸããã åºæºã®èãæ¹ããã£ãã®ã§ãè¿·ã£ããšãã«ããã«ç«ã¡è¿ã£ãããããã®å Žåã¯ã©ããªã®ãïŒããšå
·äœçã«è³ªåããããšãã§ããŸããã éçºããŒã«ãæã£ãŠãã éçºäžã¯JavaScriptã®çµ±åãã¹ãããŒã«Wallaby.jsã䜿çšããŠããã®ã§ããããã°ãã¹ã ãŒãºã«é²ã¿ãéçºäœæ¥ãéåžžã«å¹ççã«ãªããŸããã tech.findy.co.jp ãŸããCIã«ãã£ãŠäžå®ã®å質ãèªåçã«æ
ä¿ãããã®ã§ãã¬ãã¥ãŒåã«èªåã§æ°ä»ããããšãå€ãã£ãã§ããESLintã¯å®è£
ã«å¯ã£ãŠãããŠããæãããããhooksã®äŸåãªã©ãèªåã§è£å®ããŠãããããååŠè
ãšããŠã¯å®å¿ã§ããŸããã ããã¯ãªãŒããšãã³ããŒãã³ã§ã¿ã¹ã¯ããã£ãŠãã ããã¯ãªãŒããšã¯åãããŒã ãªã®ã§ãæäŒã§é²æã®å
±æããããšãæ©ã¿ãã€ã³ããå
±æãããããŠããŸããããŸããå®è£
æ¹éã«æ©ãã ãšãã¯åå ±ãã£ã³ãã«ã«æããŠæŸã£ãŠããã£ãããéœåºŠãã¢ãããªã©ã§ãµããŒãããŠããããŸããã ãŸããèªåãäœæãããã«ãªã¯ã«é¢ããŠã¯ãã¹ãŠèŠãŠããã£ãŠããã®ã§ãç§ã®çè§£åºŠãææ¡ãããŠããŸããããã®ããããã«ãªã¯ã®å®è£
ã«ã€ããŠã®ææããçè§£åºŠãæµ
ãããªãšãããªã©ããã£ãã¿ã€ãã³ã°ã§åŒã³åºããŠããã ããŸãããéœåºŠå£é ã§èª¬æããããèªåãããããã®çè§£ã§åã£ãŠãŸãïŒããšå£æã¡ããããšã§ãå
·äœçãªè©±ããç解床ãé«ããããšãã§ããŸããã â»ãäœè²é€šè£ãã¯äžèŠæããã«èŠãããããããŸããããæããããããããšã¯ãããŸãããã³ã¯ã¯ãã€ãš react.devã®èŒªèªäŒ ããšããšãããã³ããšã³ããã¡ã€ã³ãšããã¡ã³ããŒã§Reactå
¬åŒã® Learn React ã®èŒªèªäŒãè¡ã£ãŠããã®ã§ãèªåãéäžããåå ããããã«ãªããŸããã æžãããŠããæç« ã ãã ãšèšèãæŠå¿µãé£ããã£ãã®ã§ããã茪èªäŒã§ã¯å
·äœçãªè§£èª¬ããã£ããããããªãç¹ã質åã§ãããããã®ã§ãå®è·µãçè«ã§è£åŒ·ã§ããŸãããããã«ããããã«ãªã¯ã§ææãããå
容ã«ã€ããŠãã€ãŸãããããããšãªã®ãããšçè§£ã§ããããã«ãªããŸããã ã€ãŸã¥ããç¹ ã¿ã¹ã¯ç²åºŠãé©åã«åå²ããããš ããã¯ãšã³ãã«é¢ããŠã¯ãæè¡çã«ããã¡ã€ã³çã«ãæ
£ããŠããã®ã§ã1ã€ã®ã¯ã©ã¹ããšã«ãã«ãªã¯ãäœæããããšãã§ããŠããŸãããããããããã³ããšã³ãã«é¢ããŠã¯ãããŒã«ã«ã®ç»é¢ã§åãç¶æ
ãŸã§å®è£
ãããšå€§ãããããã«ãªã¯ã«ãªãããšããããŸããã ãããè§£æ¶ããããã«ã1ã€ãã€å®è£
ããç®æã®ãã¹ããæžãããšã§å®å¿ããŠãã«ãªã¯ãåºãããšãã§ããŸãããããã¯ãšã³ãã§ã¯åœç¶ã®ããã«èããŠããããšã§ããããããã³ããšã³ãã§ã¯ã€ãç»é¢ã§ã®ãããã°ãããããšããå¿ãåããŠããŸã£ãŠããããšãèªèŠããŸããã ãŸããæåã¯Componentãåå²ããŠå®è£
ãããšããæå³ãããŸãçè§£ã§ããŠããããäžéå端ãªç¶æ
ã§1ãã«ãªã¯ã«ããããããŠããŸããã Team+ã®ããã³ããšã³ãã®è²¬åã®èãæ¹ ããã³ããšã³ãã®èšèšã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã ã³ã³ããŒãã³ãå ã«ã¹ã¿ã ããã¯å æ±ãããŒã¿ Page Component Params Hook ãã©ãŠã¶URL Container Component Facade Hook API ã ã¹ãã¬ãŒãžç Presentational Component Presenter Hook ãã©ãŒã Findy転職フロントエンドの開発生産性を向上させるためにやったこと - Findy Tech Blog ãã®ææ³ããªããšãªãé ã«å
¥ããŠãããã®ã®ãå®éã«å®è£
ããŠããéäžã§ãããã®èšè¿°ã¯Facadeã§æžãã¹ããªã®ããPresenterã§æžãã¹ããªã®ãããšè¿·ãããšããããŸããã äŸãã°ãGAãã©ããã³ã°ã®èšè¿°ãæåã¯Facadeã«æžããŠããã®ã§ããããGAã®å®è¡ã¯UIã®ã¯ãªãã¯ã¢ã¯ã·ã§ã³ãããªã¬ãŒãšããã®ã§ãPresenterã«æžãã®ãé©åããšãã£ããã£ãŒãããã¯ãåããŸãããpropsã§æž¡ããã颿°ãPresenterã§wrapãããšãã£ãããæ¹ããæåã¯éžæè¢ã«ãªãã£ãã®ã§ãæ°é®®ã«æããŸããã ãŸããContainerããContainerãåŒãã§ããå Žåããããã©ã®ããã«ã³ã³ããŒãã³ããåå²ããã¹ããè¿·ãå Žé¢ããããŸãããç»é¢å
ã®APIãåºæºã«Facadeãåå²ããããã«å¿ããŠContainerãçµã¿ç«ãŠãŠãããšããããããã£ãã§ãã TypeScriptã§æ
£ããå¿
èŠããã£ãããš ä»ãŸã§æžããŠããRuby / Railsãšæ¯èŒããŠãTypeScriptã«ã¯åããããšããã®ã倧ããªéãã§ãããå人çã«ã¯ãã®å
ç¢ãã®äžã§JavaScriptã®é¢æ°ãªã©ã䜿ãããªãã®ãé£ããã£ãã§ãã äŸãã°ã以äžã®ãããªç¹ã§ãã null ã undefined ã ãã§ãªãã 0 ãfalsyãªå€ã«ãªã é
åã«å¯Ÿã㊠find ãå®è¡ãããšæ»ãå€ã undefined ã«ãªããããããå¿
ãå€ãååšããå Žåã« find ã䜿ããšãåãšå®æ
ãåããªããªã£ãŠããŸã 3ã¶æã®ææŠã®ææ ãã®æ©äŒã«ã1ã€ã®æ°æ©èœãããã¯ãªãŒããš2人ã§åæ
ããŠéçºããŸãããç§ã¯ã以äžã®ãããªäžèЧç»é¢ãšåæç»é¢ããããã2ç»é¢ãã€æ
åœããŸããã äžèЧç»é¢ åæç»é¢ ãŸããå®å®ããŠãã«ãªã¯ãäœæããããšãã§ããããã«ãªããŸããã ãã®3ã¶æãéããŠãReactå
šäœãTeam+ã®ããã³ããšã³ãã§ã®èšèšææ³ãåŠã³ãã³ã³ããŒãã³ãã®è²¬åã®åé¢ãç¶æ
管çã®æ¹æ³ã«ã€ããŠãå®è·µãéããŠçè§£ããããšãã§ããŸãããããã«ãããä»ã®ãšã³ãžãã¢ãžã®ã¬ãã¥ãŒãããçšåºŠèªä¿¡ãæã£ãŠè¡ããã¬ãã«ã«ãªããŸããã æ¹ããŠæããã®ã¯ããã åãã°ããã®ã§ã¯ãªããReactã§å¯èªæ§ã»èšèšãèæ
®ããã³ãŒããæžãã®ã¯é£ãããšããããšã§ãããèšè¿°æ¹æ³ã®èªç±åºŠãé«ãåãæå³ãèšèšãšããŠä¹ããå¿
èŠãããïŒããã¯ãªãŒãããã®åã売ãïŒãšããã®ã宿ããŸããã èªèº«ã®äŒžã³ãã ä»åã®ææŠã§ã¯è¡šç€ºããããŒã¿ãååŸãããã®ã°ããã ã£ãã®ã§ããã©ãŒã åŠçãããŒã¿ã®æŽæ°ãªã©ã«ä»åŸã¯ç©æ¥µçã«ææŠãããã§ãã ãŸããreact.devã®èŒªèªäŒãå
±éã³ã³ããŒãã³ãã倿Žããããšãããšãã«ãèªåã®å®åäžè¶³ãæããŸãããTypeScriptã®ç¥èäžè¶³ãåã®äŒæãèªã¿è§£ããªãã£ãããæ¢åã®å®è£
ã®å€æŽå¯Ÿè±¡ãããã£ãŠãä¿®æ£æ¹æ³ãããããªããæŠå¿µã¯ããããåç§°ãç¥ããªãããªã©ã®äŒžã³ãããèŠã€ããŸãããããã«é¢ããŠã¯ãå®éã«ãã£ãŠã¿ããä»ã®äººã®ãã«ãªã¯ãåèã«èããããšãç©ã¿éããŠããããšã§ãèªèº«ã®ç³§ã«ããŠããã€ããã§ãã ã©ã€ãã©ãªã«é¢ããçè§£ããŸã æµ
ãã®ã§ãä»åŸã¯éçºã«ããããŠãããã³ããšã³ãç°å¢ã®ã¡ã³ããã³ã¹ãã§ãããããªç¥èãå¢ãããŠããããã§ãã ãããã« ãã®ããã«ããã¡ã€ã³ãã£ã§ã¯ãã«ã¹ã¿ãã¯ãç®æãç°å¢ã§åãããšãã§ããŸãããŸããçŸåšãã¡ã€ã³ãã£ã§ã¯å
±ã«åã仲éãåéäžã§ããèå³ã®ããæ¹ã¯ããã¡ãã®ããŒãžãããã²ã©ããïŒ herp.careers
ããã«ã¡ã¯ã 2024/7/1 ãããã¡ã€ã³ãã£ã«å
¥ç€Ÿããæè€ã§ãã ãã¡ã€ã³ãã£ã§ã¯ã Findy Team+ ãšããããšã³ãžãã¢çµç¹ã®éçºçç£æ§ãå¯èŠåããéçºããŒã ããšã³ãžãã¢ãªã³ã°ã¡ã³ããŒã®ããã©ãŒãã³ã¹ãæå€§åããããã®ãµãŒãã¹ã®éçºã«æºãã£ãŠããŸãã ä»åã¯ãç§ãå
¥ç€Ÿåæããããããã¢ãŠããããã§ããçç±ã«ã€ããŠã玹ä»ããŸãïŒ å
¥ç€Ÿåæãããã«ãªã¯1æ¥4ä»¶åºããŸãã ãã¡ã€ã³ãã£ã§ã¯1æ¥ããã4ä»¶ãã«ãªã¯ãäœæãããšããã®ã1ã€ã®ææšãšããŠããŸãã å
¥ç€ŸçŽåŸã¯æ
£ãããŸã§ã¯çµæ§å³ããææšã ãªãšæã£ãŠããã®ã§ããããã®èšäºã§ç޹ä»ããæ§ã
ãªä»çµã¿ã®ãµããŒããããæ°ãã€ãããåæããéæã§ããŠããŸããã äžéå
¥ç€Ÿããããã ãšæããŸãããå
¥ç€ŸçŽåŸã«ãªããªãææãåºããªããŠãã¬ãã·ã£ãŒãæããŠããŸããšããããšããããŸãã ç°¡åãªã¿ã¹ã¯äžå¿ã§ã¯ãããŸãããåæããè²¢ç®ããŠãããšãã宿ãæãŠãã®ã§å¿ççã«ããããããã«ãªã¯ãåºããŠè¯ãã£ããªãšæããŠããŸãã â»1æ¥4ä»¶ãšããæ°å€ã¯ãããŸã§ã¢ãŠããããéã®åèã§ãã éé²ã«ãã«ãªã¯ãããããåºãã°ãããšããããšã§ã¯ãããŸãããã¢ãŠããããããããã¯ãã®ææã«ã€ãªããããšã倧åã§ãã å
¥ç€Ÿ1ã¶æç®ãã«ãªã¯æ° 1æ¥å¹³å4.6ä»¶!! å
¥ç€Ÿ2ã¶æç®ã®ãã«ãªã¯æ° 1æ¥å¹³å5.7ä»¶!! å
¥ç€Ÿåæããããããã¢ãŠããããã§ããçç± Good First Issueã®ç²åºŠãé©åã§ãã£ãããš æ°ããåç»ãã人åãã®IssueãšããŠGood First Issueãæºåããæåããã¡ã€ã³ãã£ã«ã¯ãããŸãããç²åºŠãšããŠé£ããããç°¡åã«çµãããããè¯ãç²åºŠã§åãçµããã¿ã¹ã¯ã«ãªã£ãŠããŸããã ãã®äžã§è€æ°ç®æã«åãä¿®æ£ãå ããäœæ¥ããããããããªãã¹ãéãçµããããæèã§å¯Ÿå¿ããŸããã äŸïŒåããªãã¡ã¯ã¿ãªã³ã°ãè€æ°ãã¡ã€ã«ã«æž¡ã£ãŠå¯Ÿå¿ããã¿ã¹ã¯ ããåŠçãå¥ãã¡ã€ã«ã«ç§»åãããšãããªãã¡ã¯ã¿ãªã³ã° 察å¿ãã¹ããã¡ã€ã«åãåæãããŠããŠãããããã ã¹ã ãŒãºãªéçºãæ¯ããã¬ãã¥ãŒãšCI/CDãããããš å
¥ç€Ÿåã¯éçºçç£æ§ãå¯èŠåãããããã¯ããéçºããŠããããããªã®ã§ãããããéçºããããããã ãããªãŒãšæã£ãŠããŸãããã å
¥ç€ŸåŸã¯ãã®æ³åãè¶
ããŠéçºãããããç°å¢ã ãªãšæããŸããã ç¹ã«æ¬¡ã®ããšãèŠå ã§éçºããµã¯ãµã¯é²ããããšãã§ããŠããŸãã ã¬ãã¥ãŒãéãïŒãšã«ããéãïŒ 1PRããããªãŒãã³ããã¬ãã¥ãŒãŸã§ã®å¹³åæéïŒ3.3h ãã«ãªã¯ã®ç²åºŠãå°ããããŠåºãæåãæ ¹ä»ããŠããããã¬ãã¥ãŒè² è·ãå°ãªã ãªãªãŒã¹äœæ¥ã楜ã§ãæéãåãããªã ãªãªãŒã¹PRäœæãe2eãã¹ããèªååãããŠããŠåºæ¬çã«ããŒãžãã¿ã³ãæŒãã ãã§å®äºã§ãã ãã®èŸºãã¯ä»ã®æ¹ã® å
¥ç€Ÿãšã³ããªãŒ ã§è©³ãã玹ä»ãããŠããã®ã§ããããã£ããèŠãŠã¿ãŠãã ããã ã¡ã³ã¿ãŒãšå¯ã«ã³ãã¥ãã±ãŒã·ã§ã³ ã¡ã³ã¿ãŒãšã®1on1ã§äžæ
£ããªç¹ãè§£æ¶ãã€ã€ãããããšãæç¢ºã«èšå®ããŠããã ããããšã§éçºã«éäžã§ããŸããã 1on1ã§å°è±¡çã ã£ãã®ã¯äžåºŠã«å€ãã®æ
å ±ãã€ã³ãããããªãããã«ããŠããã ããããšã§ãã å
¥ç€ŸåŸã«å¿
èŠãªæ
å ±ãé©åãªã¿ã€ãã³ã°ã§é©åãªéã«åããŠã€ã³ãããããŠããã ããã®ã§ãã¹ãã¬ã¹ãªãæ¥åã«æ
£ããããšãã§ããŸããã é©åãªé »åºŠ(ç§ã®å Žåã¯é±1å)ã§ã¡ã³ã¿ãŒãšã®1on1ããããããã§èª²é¡ãè§£æ¶ã§ãã 1on1以å€ã§ãéœåºŠã¡ã³ã¿ãŒã«è³ªåããŠè¿
éã«çåç¹ãè§£æ¶ã§ããéçºã«éäžã§ãã ãµãããããããŠæ¥ã
æ¹åãè¡ããã ç§ã®ããŒã ã§ã¯2é±éã«1åã®é »åºŠã§Findy Team+ã®ãKPTãµãããããæ©èœã䜿ã£ãŠãµãããããè¡ã£ãŠããŸãã ããã§åºã課é¡ã«å¯Ÿããæã¡æãè°è«ããŠæ¹åã«ç¹ããåãçµã¿ããšãŠããããªãšæããŸããã ãµããããã§åºãã¢ã¯ã·ã§ã³ã¯ãŸãã¯è©Šãã«ãã£ãŠã¿ãŸããããšããæãã§ããã«å®è¡ãããŸãã ã¢ã¯ã·ã§ã³ãããã«å®è¡ããããšããã¹ããŒãæããšãŠããããªãšæããŸããã ãããŠãã£ãŠã¿ãã¢ã¯ã·ã§ã³ã«ã€ããŠã©ãã ã£ãããåãããŠæ¬¡ã®ãµããããã§ç¢ºèªããŠããã®ã§ ç¶ç¶çã«æ¹åãè¡ãããä»çµã¿ã«ãªã£ãŠããŸãã æ°ããåç»ããç§ãæãã課é¡ã¯ãã§ã«æ¹åã®ã¢ã¯ã·ã§ã³ãé²ãã§ãããšããç¶æ
ã§ããã (ãªã®ã§èª²é¡ãæãã€ããªããšãã課é¡ããããŸãããã) ãã®ããã«çŸç¶ã«æºè¶³ãããããè¯ãããã«ã¯ã©ããããè¯ãããå
šå¡ã§èãè¡åããŠããããšãé«ãéçºçç£æ§ã«ç¹ãã£ãŠãããã ãããªãšæããŸããã æããããProblemã«å¯ŸããŠTryãèšå® å
šãŠã®ã³ãŒãããŒã¹ãææ¡ããŠããªããŠãæ¢åãå£ããªãä»çµã¿ ãŸããã¹ãã«ãã¬ããžã99%ã§ãèªåã®æ¹ä¿®ã§ä»ãžåœ±é¿ããã£ãå Žåã«ã¯ã¡ãããšãã¹ããèœã¡ãããã«ãªã£ãŠããŸãã ãã®ããã«ãèªåã®éçºã«éäžã§ããä»çµã¿ãæŽã£ãŠããããã æåããå
šãŠãææ¡ããŠããªããŠããå®å
šã«éçºãé²ããããšãã§ããŸãã ãªã®ã§ãå
šããããã¯ãã®ç¥èããªãå
¥ç€ŸçŽåŸã§ã èªåã®æ
åœäœæ¥ã«éäžã§ããã®ã§ããµã¯ãµã¯ãã«ãªã¯ãåºãããšãã§ããŸããã äžæç¹ã¯é æ
®ããã«ããã«èãããçžè«ã§ãã åè¿°ããã¡ã³ã¿ãŒãšã®1on1ããããŸãããå®äŸä»¥å€ã§ãäžæç¹ã¯ããã«Slackã®ã¡ãã»ãŒãžãããã«ã§èãããšãæšå¥šãããŠããŸãã ãªã³ããŒãã£ã³ã°è³æã«ããäžæç¹ã¯éœåºŠSlackãããã«ã(åºç€ŸããŠããå Žåã¯)察é¢ã§ç¢ºèªããŸãããïŒããšæèšãããŠãããã¿ãªããå¿«ãå¿ããŠãããŸãïŒ ãŸãããã¡ã€ã³ãã£ã§ã¯Slackã§times(åå ±)ãã£ã³ãã«ãåèªæã£ãŠããŸãã èªåã®timesã§çåãã€ã¶ãããšããããªäººãå©ãã«ããŠãããæåãããã®ã§å©ãã£ãŠããŸãïŒ ä»åŸã®æ±è² ãã¡ã€ã³ãã£ã®ããªã¥ãŒã§ãããèªåã®åŒ·ã¿ã§ããããã¹ããŒããã倧åã«çéã§éçºããã£ãŠããããã§ãïŒ ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ãã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§ããã³ããšã³ãã®ãªãŒããããŠãããŸã æ°çŠ( @puku0x )ã§ãã GitHub Actionsã¯ãCI/CD以å€ã«ãæ§ã
ãªæ¥åã®å¹çåã«åœ¹ç«ã¡ãŸãã ãã®èšäºã§ã¯ãåŒç€Ÿã§å®æœããŠããGitHub Actionsã䜿ã£ãèªååã«ã€ããŠç޹ä»ããŸãã èªåå æ
åœè
ã¢ãµã€ã³ ã©ãã«èšå® ãªãªãŒã¹ QAãã§ãã¯é
ç®ã®æœåº 宿å®è¡ ãŸãšã èªåå æ
åœè
ã¢ãµã€ã³ éçºãããŒã®äžã§ã¯ãPull requestãäœã£ãŠããã¬ãã¥ãŒã«åºããŸã§ã«ããã€ãã®ã¿ã¹ã¯ãè¡ãããšããããŸãã åŒç€Ÿã§ã¯ãPull requestã®äœæè
ãAssigneeïŒæ
åœè
ïŒãšãªãå Žåãå€ããããâãã¡ãã®ActionãçšããŠã¢ãµã€ã³ã®èªååãããŠããŸãã github.com - uses : kentaro-m/auto-assign-action@v2.0.0 with : repo-token : ${{ secrets.GITHUB_TOKEN }} addAssignees : author runOnDraft : true Assigneeã®ã¿èªååããŠããã®ã¯ãã¬ãã¥ãŒã«åºãã¿ã€ãã³ã°ãPull requestã®äœæè
åŽã§å¶åŸ¡ãããã£ãããã§ãã ã¬ãã¥ã¢ãŒã«ã€ããŠã¯ãGitHubã®æšæºæ©èœã§ã¬ãã¥ãŒçšã®GitHubããŒã ãäœã£ãŠã©ã³ãã ã¢ãµã€ã³ããããã«ããŠããŸãã ã©ãã«èšå® åŒç€Ÿã§ã¯ãPull requestãã©ãã«ãçšããŠç®¡çããŠããããŒã ããããŸãã ä»äžããã©ãã«ã«ã€ããŠã¯ãã»ãã³ãã£ãã¯ããŒãžã§ãã³ã°ãšçžæ§ã®è¯ããã®ãçšããããããšãå€ãã§ãã GitHub - azu/github-label-setup: 📦 Setup GitHub label without configuration. ã©ãã«èšå®ã®èªååã¯ãå
¬åŒã®ActionããããŸãã®ã§æ¯èŒçå°å
¥ããããã§ãããã github.com actions/labelerã¯ãæè¿ã®æŽæ°ã§ãã©ã³ãåãåºã«ã©ãã«ãèšå®ããæ©èœã远å ãããŸããã ãã®äŸã§ã¯ããã©ã³ãåã®å
é ã feat ã fix çã§ãã£ãå Žåã«å¯Ÿå¿ããã©ãã«ãä»äžããããã«ããŠããŸãã 'Type: Feature' : - head-branch : [ '^feat' ] 'Type: Bug' : - head-branch : [ '^fix' , '^bug' ] ã¢ãã¬ãã®å Žåããã¡ã€ã«ã®ãã¹ã«å¯Ÿå¿ããã©ãã«ãèšå®ãããšãã©ã®ãããžã§ã¯ãã«åœ±é¿ããã倿ãããããªããŸãã 'Scope: App1' : - changed-files : - any-glob-to-any-file : - apps/app1/**/* - libs/app1/**/* 'Scope: App2' : - changed-files : - any-glob-to-any-file : - apps/app2/**/* - libs/app2/**/* actions/labelerã¯ãPull requestã®ã¿ã€ãã«ãåºã«ããã©ãã«èšå®ã«ã¯ã2024幎9æçŸåšã ãšå¯Ÿå¿ããŠããªãããã§ãã ãã®å Žåã¯ãæåã§GitHubã®APIãåŒã¶ã·ã§ã«ãçµãå¿
èŠããããŸãã run : | pr_title=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" \ "https://api.github.com/repos/Findy/***/pulls/${{ github.event.pull_request.number }}" \ | jq -r '.title' ) if [[ $pr_title =~ ^feat ]] ; then pr_type='Feature' fi curl -X POST -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ -H "Accept: application/vnd.github.v3+json" -d '{"labels": ["Type: '"$pr_type"'"]}' \ "https://api.github.com/repos/Findy/***/issues/${{ github.event.pull_request.number }}/labels" ãã€ãå
¬åŒã®Actionã«ã欲ããã§ããïŒ ãªãªãŒã¹ æé ã®å€ããªãªãŒã¹äœæ¥ããåŒç€Ÿã§ã¯èªååãåãå
¥ããŠè² æ
ãæžãããŠããŸãã ããã§ã¯ããã³ããšã³ãç³»ã®ãªããžããªã«æ¡çšãããŠãããã®ã玹ä»ããŸãã ããŒãžã§ãã³ã°çšã¯ãŒã¯ãããŒãå®è¡ ããŒãžã§ãã³ã°çšPull requestãèªåçæããã ããŒãžã§ãã³ã°çšPull requestãããŒãž ããŒãžã§ãã³ã°çšPull requestã®ããŒãžãèµ·ç¹ã«ãªãªãŒã¹çšPull requestãèªåçæããã ïŒãããã¯ãã«ãã£ãŠã¯ããã§Stagingç°å¢ãžã®ãããã€ãå®è¡ãããŸãïŒ ãªãªãŒã¹çšPull requestãã¬ãã¥ãŒåŸãããŒãž ãªãªãŒã¹çšPull requestã®ããŒãžãèµ·ç¹ã«æ¬çªããã〠éçºè
ã¯ãã¯ãŒã¯ãããŒã®èµ·åããšãèªåçæãããPull requestã®ããŒãžÃ2ããšããã·ã³ãã«ãªæé ã§æ¬çªãããã€ãŸã§ã§ããããã«ãªããŸãã ãŸãã Conventional Commits ã«æºæ ããã³ãããã¡ãã»ãŒãžãæ¡çšããŠãããèªåããŒãžã§ãã³ã°ããªãªãŒã¹ããŒãã®èªåçæãšãã£ãæ©æµãåŸãããŠããŸãã ãããã€é »åºŠã¯Four Keysã®ææšã«ãå
¥ã£ãŠããããšãããããŒã ã®å¥åº·ç¶æ
ãç¥ãææããã«ãªããŸããå¯èœãªéãé«ãé »åºŠã§ãããã€ã§ãããããä»çµã¿ã¯ãã£ãããšæŽåããŠãããŸãããðª åè: https://dev.to/puku0x/github-actions-1mi5 QAãã§ãã¯é
ç®ã®æœåº ãªãªãŒã¹ã®éã«ãQAæ
åœè
ããã§ãã¯ãã¹ãé
ç®ãPull requestã®å±¥æŽããèªåæœåºããŠããããŒã ããããŸãã ãŸãã .github/PULL_REQUEST_TEMPLATE.md ã«æ¬¡ã®ãããªé
ç®ãèšå®ããŠãããŸãã æ¬¡ã«ããªãªãŒã¹æã«èµ·åããGitHub Actionsããããã§ãã¯æžã¿ã®é
ç®ãæœåºããã¹ã¯ãªãããèµ·åããŸãã def category_by_pull (pull) return :planner_qa_pr if body.include? " - [x] äŒç»åŽQA " return :developer_qa_pr if body.include? " - [x] éçºåŽQA " return :other_pr end ãªãªãŒã¹çšã®Pull requestã®æ¬æã«åæ ããããããQAæ
åœè
ãäœãèŠãã¹ããããããããããªããŸãã 宿å®è¡ cron ã䜿ããã®ãGitHub Actionsã®è¯ããšããã§ãã on : schedule : - cron : '30 0 * * 1-5' # å¹³æ¥09:30 (JST) äŒæ¥ã»ç¥æ¥ã®èæ
®ãå¿
èŠãªå Žåã¯ã次ã®ããã«å段ã«å€å®çšã®ãžã§ããä»èŸŒãã§ needs ã§ç¹ããŸãã check : outputs : is_holiday : ${{ steps.check_holiday.outputs.result }} steps : - run : npm install @holiday-jp/holiday_jp - uses : actions/github-script@v7 id : check_holiday env : TZ : 'Asia/Tokyo' # ã¿ã€ã ãŸãŒã³åºå®å¿
é with : script : | const holidayJp = require('@holiday-jp/holiday_jp'); return holidayJp.isHoliday(new Date()); some_job : needs : check if : needs.check.outputs.is_holiday == 'false' outputs 㯠string ã§è¿ã£ãŠããããã boolean ã§æ±ãããå Žå㯠fromJson(needs.check.outputs.is_holiday) ã®ããã«å€æãããšè¯ãã§ãããã ãŸãšã ãã®èšäºã§ã¯ãGitHub Actionsã䜿ã£ãæ§ã
ãªèªååã®ææ³ã玹ä»ããŸããã å
¬åŒãæäŸããActionã®ä»ã«ããäžã®äžã«ã¯æçšãªActionããããããããŸãã ãµãŒãããŒãã£è£œã®Actionã®å©çšã«ã€ããŠã¯ããèŠä»¶ãæºããããããã»ãã¥ãªãã£äžã®æžå¿µã¯ãªããããç¶ç¶çãªã¡ã³ããã³ã¹ãæåŸ
ã§ããããçãéžå®ã®åºæºãšãªãã§ãããã ååã®èšäºã§ã¯ GitHub Actionsé«éåã®äºäŸ ãæžããŠãããŸãã®ã§ãåãããŠã芧ããã ããããšæããŸãã åŒç€Ÿã®ä»ã®GitHub Actions掻çšäºäŸã¯ã次ã®ã¹ã©ã€ãã§ç޹ä»ããŠãããŸãã ファインディでのGitHub Actions活用事例 - Speaker Deck ãã¡ãã®çºè¡šã«ã€ããŠã¯ãconnpassã®ã€ãã³ãããŒãžã«ã¢ãŒã«ã€ãåç»ãžã®ãªã³ã¯ãèŒããŠãããŸããçæ§ã®åèãšãªãã°å¹žãã§ãã findy.connpass.com ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ã¯ããã« ããã«ã¡ã¯ãããã»ã¹æ¹åã»ã¢ãžã£ã€ã«ã³ãŒãã§ãTech Blogç·šéé·ã®é«æ©ïŒ @Taka_bow ïŒã§ãã çããã¯ã2021幎6æã«çãŸãã GitHub Copilot ãå©çšããŠããŸããïŒ ãã®çæAIããŒã¹ã®ã³ãŒãã£ã³ã°æ¯æŽããŒã«ã¯ãã³ãŒãã®èªåè£å®ãçæã颿°ã®èªåçæããšã©ãŒä¿®æ£æ¯æŽãªã©ãéçºè
ã®äœæ¥ãå€é¢çã«ãµããŒãããŸãã ãã¡ã€ã³ãã£ã§ã¯2023幎3æããå°å
¥ããéçºããŒã å
šå¡ãæ¥åžžçã«æŽ»çšããŠããŸããFindy Team+ã§å¹æã枬å®ããçµæãã³ãŒãã£ã³ã°ã®å¹çåãã³ãã¥ãã±ãŒã·ã§ã³ã³ã¹ãã®åæžãããã«ã¯éçºè
ã®æºè¶³åºŠåäžãªã©ãå€ãã®å©ç¹ã確èªãããŸããã ä»åã¯ããã®ãã㪠ãœãããŠã§ã¢éçºã«ãããçæAIã®åœ±é¿ãåæããææ°ã®è«æãçŽ¹ä» ããŸããGitHub Copilotãéçºããã»ã¹ã«ããããå€åããéçºè
ã®çç£æ§ãžã®åœ±é¿ã«ã€ããŠã®ç ç©¶ãæžããããè峿·±ãè«æã§ãã ã¯ããã« çæAIãé«åºŠãªã¹ãã«ãèŠããä»äºã«äžããåœ±é¿ å®éšã®æŠèŠ å
·äœçãªææ ã·ãã¢éçºè
ã«ã¯æ§ãããªå¹æ ãžã¥ãã¢éçºè
ãžã®åœ±é¿ ã·ãã¢éçºè
ãžã®åœ±é¿ è©³çŽ°ãªæ¯èŒ ããŒã«æ¡çšãã¿ãŒã³ã®éã è£è¶³ïŒAccentureã®å®éšåæã®ããŒã¿ç Žæ£ïŒè«æä»é²DïŒ ãããã«ïŒè©Šãããã®ã¯ã人éã ãç¥ããïŒ çæAIãé«åºŠãªã¹ãã«ãèŠããä»äºã«äžããåœ±é¿ 2024幎9æ5æ¥ãGitHub Copilotã«é¢ãã1ã€ã®è«æããã¬ããªã³ããµãŒããŒã®ã²ãšã€ SSRN(Social Science Research Network) ã«å
¬éãããŸããã papers.ssrn.com çŽèš³ãããš ãçæAIãé«åºŠãªã¹ãã«ãèŠããä»äºã«äžãã圱é¿ïŒãœãããŠã§ã¢éçºè
ã察象ãšãã3ã€ã®ãã£ãŒã«ãå®éšããã®èšŒæ ã ãšãã£ããšããã§ããããã æ»èªåè«æãªã®ã§ãçŸåšã¯èª°ã§ãèªãããšãåºæ¥ãŸãã ãã®è«æã¯ãKevin Zheyuan Cuiæ°ïŒããªã³ã¹ãã³å€§åŠïŒãMert Demireræ°ïŒããµãã¥ãŒã»ããå·¥ç§å€§åŠïŒãSonia Jaffeæ°ïŒãã€ã¯ããœããïŒãLeon Musolffæ°ïŒãã³ã·ã«ããã¢å€§åŠãŠã©ãŒãã³æ ¡ïŒãSida Pengæ°ïŒãã€ã¯ããœããïŒãããã³Tobias Salzæ°ïŒããµãã¥ãŒã»ããå·¥ç§å€§åŠïŒã«ãã£ãŠå·çããããã®ã§ã å€§èŠæš¡ãªå®éš ã®çµæãåæããç§åŠçã¢ãããŒãã®ææãèšãããŠããŸãã å®éšã®æŠèŠ ãã®ç ç©¶ã§ã¯ãGitHub Copilotã®å¹æãæ€èšŒãããããå€§èŠæš¡ãªã©ã³ãã 忝èŒè©Šéšãè¡ãããŸãããå®éšã®èå°ãšãªã£ãã®ã¯ãMicrosoftãAccentureããããŠå¿åã®Fortune 100ãšã¬ã¯ãããã¯ã¹è£œé äŒç€Ÿã®3瀟ã§ãã é©ãã¹ãããšã«ããã®å®éšã«ã¯å®ã« 4,867人 ãã®éçºè
ãåå ããŸããã åå è
ã¯2ã€ã®ã°ã«ãŒãã«åããããäžæ¹ã«ã¯ GitHub Copilot ãæäŸãããããäžæ¹ã¯ åŸæ¥ã®éçºææ³ ãç¶ç¶ããŸããããã®æ¯èŒã«ãããGitHub Copilotãæ¬åœã«éçºè
ã®çç£æ§ãåäžãããã®ãã客芳çã«æ€èšŒããããšãç®çã§ããã ãŸããå瀟ã®å®éšæéã¯æ¬¡ã®éãã§ãã Microsoft ïŒ2022幎9æåæ¬ãã2023幎5æ3æ¥ãŸã§ïŒçŽ7ã¶æéïŒ Accenture ïŒ2023幎7ææ«ãã2023幎12æãŸã§ïŒçŽ4ã¶æéïŒ å¿åã®å€§æäŒæ¥ïŒFortune 100ïŒ ïŒ2023幎10æãã2ã¶æéïŒæ®µéçã«ããŒã«ã¢ãŠãïŒ ãã®ãããªå®éšã®èšèšã«ãããç°ãªãäŒæ¥ç°å¢ãæéã§ã® GitHub Copilotã®å¹æãå
æ¬çã«è©äŸ¡ããããšãå¯èœãšãªããŸããã å
·äœçãªææ å®éšçµæã¯ãGitHub Copilotã®å¹æãæç¢ºã«ç€ºããŠããŸãã GitHub Copilotã䜿çšããéçºè
ã°ã«ãŒãã§ã¯ã次ã®ãããªé¡èãªæ¹åãèŠãããŸããã ã¿ã¹ã¯å®äºæ°: å¹³åã§26.08%å¢å ïŒæšæºèª€å·®: 10.3%ïŒ ã³ãããæ°: 13.55%å¢å ïŒæšæºèª€å·®: 10.0%ïŒ ã³ãŒãã³ã³ãã€ã«åæ°: 38.38%å¢å ïŒæšæºèª€å·®: 10.0%ïŒ ãããã®æ°åã¯ãGitHub Copilotãéçºäœæ¥å
šäœã®å¹çã確å®ã«åäžãããŠããããšã瀺ããŠããŸããç¹çãã¹ãã¯ãçµéšã®æµ
ããžã¥ãã¢éçºè
ãžã®å¹æã§ãããã®ã°ã«ãŒãã§ã¯ã GitHub Copilotã®æ¡çšçãããé«ã çç£æ§ã®åäžãããé¡è ã§ãã£ãããšãå ±åãããŠããŸãããã®ããšãããGitHub Copilotãç¹ã«ãã£ãªã¢åæã®éçºè
ã®ã¹ãã«åäžãšçç£æ§å¢å ã«å€§ããè²¢ç®ããå¯èœæ§ã瀺åãããŠããŸãã ã·ãã¢éçºè
ã«ã¯æ§ãããªå¹æ ãã®ç ç©¶ã§ç¹ã«æ³šç®ãã¹ãã¯ãGitHub Copilotããžã¥ãã¢éçºè
ãšã·ãã¢éçºè
ã«äžãã圱é¿ã®éãã§ãã ãžã¥ãã¢éçºè
ãžã®åœ±é¿ GitHub Copilotã¯ãçµéšã®æµ
ãéçºè
ã«å¯ŸããŠç¹ã«å€§ããªå¹æã瀺ããŸããã æ°ããã³ãŒãã®æžãæ¹ãæ§æãå¹çããåŠç¿ ã¿ã¹ã¯ã®é²æã倧å¹
ã«åäž ãã«ãªã¯ãšã¹ãæ°ã40%å¢å ïŒã·ãã¢éçºè
ã¯7%ïŒ ãããã®çµæãããGitHub Copilotã¯ãžã¥ãã¢éçºè
ã«ãšã£ãŠåãªãè£å©ããŒã«ãè¶
ãã åŠç¿ããŒã« ãšããŠã®åœ¹å²ãæãããŠãããšèããããŸãã ã·ãã¢éçºè
ãžã®åœ±é¿ äžæ¹ãã·ãã¢éçºè
ã«å¯Ÿãã圱é¿ã¯æ¯èŒçå°ãããã®ã§ãããããã«ã¯æ¬¡ã®ãããªèŠå ãèããããŸãã ãã§ã«ç¢ºç«ãããäœæ¥ã¹ã¿ã€ã«ããã æ°ããããŒã«ã®æ¡çšã«å¯Ÿããæ
éã è©³çŽ°ãªæ¯èŒ 次ã®è¡šã¯ããžã¥ãã¢ãšã·ãã¢éçºè
ã«ãããGitHub Copilotã®å¹æã®éãã瀺ããŠããŸãã é
ç® ãžã¥ãã¢éçºè
ã·ãã¢éçºè
ãã«ãªã¯ãšã¹ãå¢å ç 40% 7% ã³ãããæ°å¢å ç 21% 16% ãã«ãæ°å¢å ç 29% 13% GitHub Copilotæ¡çšç 82.1% (±2.1pp) 76.8% (±2.1pp) æ¡çšåŸ1ã¶æåŸã®ç¶ç¶äœ¿çšç 84.3% 74.8% GitHub Copilotææ¡åãå
¥ãç 25.2% 24.7% 泚ïŒãã®ç ç©¶ã§ã¯ãäŒç€Ÿã§ã®æ¡çšæã®è·äœãåšè·æéã«åºã¥ããŠéçºè
ãããžã¥ãã¢ããšãã·ãã¢ãã«åé¡ããŠããŸããå
·äœçãªåºæºã«ã€ããŠã¯è©³çްãæããã«ãããŠããŸããã ããŒã«æ¡çšãã¿ãŒã³ã®éã å®éšçµæãããGitHub Copilotã®åææ¡çšçã¯äºæ³å€ã«äœãã£ãããšãåãããŸããã Microsoftã§ã¯æåã®2é±éã§æ¡çšçã42.5%ã«ãšã©ãŸãã ãªãã€ã³ããŒåŸã«64%ãŸã§äžæ ãAccentureã§ã¯å
šäœã§çŽ60%ã®æ¡çšçã§ããã ãã®çµæã¯ãæ°ããããŒã«ã®å°å
¥ã«ã¯åãªãæäŸä»¥äžã®ãã®ãå¿
èŠã ãšããããšã瀺ããŠããŸããé©åãªãã¬ãŒãã³ã°ããµããŒããäžå¯æ¬ ã§ã段éçãªå°å
¥ã宿çãªãªãã€ã³ããŒã广çãªäœ¿çšæ³ã®æè²ã»ãã·ã§ã³ãªã©ãæå¹ãªæŠç¥ãšãªãããã§ãã ãããã®ç¥èŠã¯ãGitHub Copilotã«éãããæ°æè¡ã®å°å
¥æã«çŽé¢ããäžè¬çãªèª²é¡ãåæ ããŠããŸããåã«ããŒã«ãå°å
¥ããçŸå Žä»»ãã«ããã ãã§ã¯ã广çã«æŽ»çšã§ããªãã§ããããæ¥éã«é²åããéçºç°å¢ã§ã¯ãæ°ããŒã«ãæŠç¥çã«å°å
¥ããç¶ç¶çã«ãµããŒãããããšããçµç¹ã®ç«¶äºåãä¿ã€ããã§æ¥µããŠéèŠã§ãã è£è¶³ïŒAccentureã®å®éšåæã®ããŒã¿ç Žæ£ïŒè«æä»é²DïŒ Accentureã®å®éšã«ã¯æå€ãªå±éããããŸããã2023幎4æã«å瀟ã宿œããå€§èŠæš¡ãªã¬ã€ãªãïŒ19,000人ã®åŸæ¥å¡åæžïŒã«ãããåœåã®å®éšãäžæãäœåãªããããã®ã§ãã ãã®ã¬ã€ãªãã¯å®éšã«ã倧ããªåœ±é¿ãäžããŸããã å®éšåå è
ã®42%ã圱é¿ãåãã ããŒã¿ã®è³ªã«åé¡ãçãã GitHub Copilotã®äœ¿çšç¶æ³ãæ¡çšããŒã¿ã®èšé²ãäžååã« çµæãšããŠããã®åæå®éšã®ããŒã¿ã¯ä¿¡é Œæ§ã«æ¬ ãããã®ãšãªããŸããããããã204人ã®éçºè
ã«çµã£ãŠè¡ã£ãåæã§ã¯ã次ã®ãããªåŸåãèŠãããŸããã ãã«ãªã¯ãšã¹ãæ°: 39.18%æžå° (æšæºèª€å·®: 36.78%, çµ±èšçã«ææã§ã¯ãªã ) ã³ãããæ°: 43.04%å¢å (æšæºèª€å·®: 38.80%) ãã«ãæ°: 12.33%å¢å (æšæºèª€å·®: 53.60%) ãããã®çµæã¯çµ±èšçãªä¿¡é Œæ§ãäœããå®éšçµæãšããŠã¯åèçšåºŠã«ãšã©ããã¹ãã§ãããã ãããã«ïŒè©Šãããã®ã¯ã人éã ãã®ç ç©¶ãããGitHub CopilotããœãããŠã§ã¢éçºè
ã®çç£æ§åäžã«ç¢ºããªå¹æãããããããšãæããã«ãªããŸãããç¹ã«ããžã¥ãã¢éçºè
ãžã®é¡èãªå¹æã¯æ³šç®ã«å€ããŸãã äžæ¹ã§ãã·ãã¢éçºè
ãžã®å¹æãéå®çã ã£ãç¹ãè峿·±ãçºèŠã§ããããã¯ãçµéšè±å¯ãªéçºè
ããã§ã«é«ãã¹ãã«ãæã¡ãAIã®ãµããŒããããã»ã©å¿
èŠãšããŠããªãå¯èœæ§ã瀺åããŠããŸãã ãããããžã¥ãã¢éçºè
ãAIã®ææ¡ãéµåã¿ã«ãããªã¹ã¯ãèæ
®ããå¿
èŠããããŸããããã§ãã·ãã¢éçºè
ã«ããã³ãŒãã¬ãã¥ãŒã®éèŠæ§ãäžå±€é«ãŸããšèšããã§ãããã 調æ»äŒç€Ÿã® ç±³ã¬ãŒãããŒãçºè¡šããå
容 ã«ãããšãAI ã³ãŒãã¢ã·ã¹ã¿ã³ãïŒçæAIïŒã«é¢ããããžãã¯ã»ã¯ã¢ãã©ã³ããšå
±ã«ã次ã®ãããªäºæž¬ããªãããŠããŸããã æŠç¥çèšç»ã®ä»®èª¬ 2027幎ãŸã§ã«ããœãããŠã§ã¢éçºã©ã€ããµã€ã¯ã«ïŒSDLCïŒã®ãããããã§ãŒãºãæ¡åŒµããããã«AIãæŽ»çšãããã©ãããã©ãŒã ãšã³ãžãã¢ãªã³ã°ããŒã ã®å²åã¯ã5%ãã40%ã«å¢å ããã 2027幎ãŸã§ã«ã80%ã®äŒæ¥ãAIã§æ¡åŒµããããã¹ãããŒã«ããœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ããŒã«ãã§ãŒã³ã«çµ±åããŠãããããã¯2023幎åé ã®çŽ15%ãã倧å¹
ãªå¢å ãšãªãã 2027幎ãŸã§ã«ãAIçæã³ãŒãã«å¯Ÿããâãã¥ãŒãã³ã»ãªãŒããŒãµã€ãâïŒäººéãAIã«å¯ŸããŠåããèŠããæ¢ãããã§ããïŒ *1 ãäžè¶³ããŠããããã«ãæ¬çªç°å¢ã«æµåºãããœãããŠã§ã¢æ¬ é¥ã25%ã«éãã2023幎ã®1%æªæºãã倧å¹
ã«å¢å ããã 2028幎ãŸã§ã«ã90%ã®äŒæ¥ã®ãœãããŠã§ã¢ãšã³ãžãã¢ãAIã³ãŒãã¢ã·ã¹ã¿ã³ãã䜿çšããããã«ãªãã2024幎åé ã®14%æªæºããå¢å ããã 2028幎ãŸã§ã«ãçæAIïŒGenAIïŒã®äœ¿çšã«ãããã¬ã¬ã·ãŒã¢ããªã±ãŒã·ã§ã³ã®ã¢ããã€ãŒãŒã·ã§ã³ã³ã¹ãã2023å¹Žã®æ°Žæºãã30%åæžãããã Figure 1: Magic Quadrant for AI Code Assistants ããã§ãã人éåŽã«ãããã§ãã¯ãäžè¶³ããããšã§ãœãããŠã§ã¢æ¬ é¥ã®äžæãäºæž¬ãããŠãããçµå±ã®ãšããã AIããŒã«ã®æŽ»çšãšäººéã®çµéšã倿åã®ãã©ã³ã¹ãã質ã®é«ãéçºããã»ã¹ã®éµ ãšãªãããã§ãã ç§ãã¡ã«æ±ããããã®ã¯ãæè¡ã®é²åãåã«èгå¯ããã ãã§ãªãããããæå€§éã«æŽ»çšãã€ã€ã人éãªãã§ã¯ã®åµé æ§ãæŽå¯åãçºæ®ããŠããããšã§ãããã®æ°ããæä»£ã®éçºç°å¢ã§ãç§ãã¡ã¯ã©ã®ãããªäŸ¡å€ãçã¿åºããŠãããã§ããããããã®çãããçãããšäžç·ã«èŠã€ããŠãããããšæããŸãã ãç¥ããïŒ çŸåšãç§ãšäžç·ã«ã€ãã€ããªã³ã°ããŒã ã®ç«ã¡äžããè¡ãã¡ã³ããŒãæ¢ããŠããŸãïŒ ã€ãã€ããªã³ã°ããŒã ã¯ãåãªãéçºæ¯æŽãè¶
ããéèŠãªåœ¹å²ãæ
ããŸãã çµç¹å
šäœã®ãšã³ãžãã¢ãªã³ã°åãåäž éçºã¹ãã«åäžã®ããã®ãã¬ãŒãã³ã°ãã¯ãŒã¯ã·ã§ããã宿œ ããã»ã¹æ¹åã®ææ¡ãšã³ãŒãã³ã°ãè¡ããéçºçç£æ§ãšDevExãåäž ç€Ÿå
å€ã®ãšã³ãžãã¢ã察象ãšããæŽ»åãå±é ãã®ããŒã ã§ããã¡ã€ã³ãã£ã®æé·ãšã³ãžã³ãšãªããŸãããïŒèå³ãããæ¹ã¯ããã²ãã¡ããã¯ãªãã¯ããŠã¿ãŠãã ããâ herp.careers ä»ã«ãããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã herp.careers *1 : AIã®æç®ã§è¯ãåºãŠãã"human oversight"ã¯é©ããæ¥æ¬èªèš³ããªããäžæŠãã®ããã«èš³ãã
ãã¡ã€ã³ãã£æ ªåŒäŒç€Ÿã§ããã³ããšã³ãã®ãªãŒããããŠãããŸã æ°çŠ( @puku0x )ã§ãã åŒç€Ÿã§ã¯ãæ°å¹Žåã«ç€Ÿå
ã®CIç°å¢ããã¹ãŠGitHub Actionsã«ç§»è¡ããŸããã ãã®èšäºã§ã¯ãåŒç€Ÿã®GitHub Actions掻çšäºäŸã®å
ãCIé«éåã«ã€ããŠã玹ä»ããŸãã ãªãCIé«éåã«åãå
¥ããã®ã CIé«éå ãã£ãã·ã¥ã®æŽ»çš ãžã§ãã®äžŠåå Larger Runners ãŸãšã ãªãCIé«éåã«åãå
¥ããã®ã åœããã°ãã¯ããåŒç€Ÿã§ã¯ããã³ãã³CIé«éåã®å€§åãã«ã€ããŠèšåããŠããŸãã Findyの爆速開発を支えるテクニック - Findy Tech Blog RailsのCIのテスト実行時間を 10分から5分に高速化した話 - Findy Tech Blog Findy転職フロントエンドの開発生産性を向上させるためにやったこと - Findy Tech Blog ããã¯ãªãã§ããããïŒ éçºãé²ãã«ã€ããŠãã³ãŒãããŒã¹ãè¥å€§åããCIã®åŸ
ã¡æéãå¢ããŠããã®ã¯çããã«ãçµéšããããšæããŸãã CIã®åŸ
ã¡æéãé·ããšã€ãã¬ãã¥ãŒãæŸçœ®ããŠããŸããã¡ã§ãã ã¬ãã¥ãŒãé
ããšãã©ã³ãã®çåæéã䌞ã³ãã³ã³ããªã¯ãã®çºç確çãäžãããŸãã ã³ã³ããªã¯ãã解決ããŠããCIãé
ãç¶æ
ã§ã¯ãŸãåãããšã®ç¹°ãè¿ããšãªãã§ãããã GitHubã®èª¿æ»ã§ã¯ãéçºè
ã¯å€ãã®æéãCIåŸ
ã¡ã«è²»ãããŠãããšå ±åãããŠããŸãã github.blog èŠæ¹ãå€ãããšãCIé«éåã¯ã³ãŒãã£ã³ã°ã®å¹çåãšåçšåºŠã®ã€ã³ãã¯ãããããšèšããŸãã ããŒã ã®éçºçç£æ§ãæ¯ããåºç€ãšããŠãåŒç€Ÿã¯CIé«éåã«åãå
¥ããŠããã®ã§ãã CIé«éå ãã£ãã·ã¥ã®æŽ»çš åŒç€Ÿã§ã¯ã actions/cache ã䜿ã£ãŠãäŸåé¢ä¿ã®ã€ã³ã¹ããŒã«ãçã工倫ãåãå
¥ããŠããŸãã ããã§ã¯äŸãšããŠãããã³ããšã³ãç³»ã®ãªããžããªã®ã¯ãŒã¯ãããŒã玹ä»ããŸãã - uses : actions/setup-node@v4 id : setup_node with : node-version : 20 - uses : actions/cache@v4 id : cache with : path : node_modules key : ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm-${{ hashFiles('**/package-lock.json') }} - if : steps.cache.outputs.cache-hit != 'true' run : npm ci ããã³ããšã³ãåšãã®CIãçµãã ããšã®ããæ¹ã¯ãã³ãšæ¥ãããšæããŸãã ãã®ã¯ãŒã¯ãããŒã§ã¯ã node_modules ãã£ã¬ã¯ããªããã£ãã·ã¥ããŠããŸãã npmå
¬åŒã§ã¯éæšå¥šãšãããŠããŸãããïŒ ãªããã®ãããªæžãæ¹ã§ã倧äžå€«ãªã®ã§ããããïŒãã®ç§å¯ã¯ãã£ãã·ã¥ã®ããŒã«ãããŸãã key : ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm-${{ hashFiles('**/package-lock.json') }} ãã£ãã·ã¥ããŒãšããŠãOSãNode.jsã®ããŒãžã§ã³ãããã±ãŒãžãããŒãžã£ãŒã®çš®å¥ãªã©ã现ããèšå®ãããŠããŸãã node_modules ãã£ã¬ã¯ããªã®ãã£ãã·ã¥ãéæšå¥šãšãããçç±ã¯ãç°ãªãç°å¢ã§å®è¡ãããããšã«ãããã¡ã€ã«ã®äžæŽåãé²ãããã§ããããã«æ°ãä»ããŠããã°ãã£ãã·ã¥ããŠãè¯ãã®ã§ãã â»æè¿ã®GitHub Actionsã§ã¯Armã©ã³ããŒãå©çšã§ããããããã£ãã·ã¥ããŒã«CPUã¢ãŒããã¯ãã£ã远å ãããšããå
ç¢ã«ãªãã§ãããã node_modules ããã£ãã·ã¥ãããããªãã£ãå Žåãèæ
®ããŠã .npm ãã£ã¬ã¯ããªã®ãã£ãã·ã¥ãå«ãããšæ¬¡ã®ããã«ãªããŸãã - uses : actions/setup-node@v4 id : setup_node with : node-version : 20 - uses : actions/cache@v4 id : cache with : path : node_modules key : ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm-${{ hashFiles('**/package-lock.json') }} - uses : actions/cache@v4 if : steps.cache.outputs.cache-hit != 'true' with : path : | ~/.npm key : ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm-${{ hashFiles('**/package-lock.json') }} restore-keys : ${{ runner.arch }}-${{ runner.os }}-node-${{ steps.setup_node.outputs.node-version }}-npm- - if : steps.cache.outputs.cache-hit != 'true' run : npm ci åŒç€Ÿã®å Žåã§ã¯ãããã§ããã20ç§ã30ç§ã»ã©é«éåã§ããŸããã ãžã§ãã®äžŠåå ããã¯ãšã³ãã®ãã¹ããäŸã«æããŸãããã®ã¯ãŒã¯ãããŒã§ã¯ã matrix æ©èœãçšããŠãã¹ãã10䞊åã§åäœãããããã«ããŸããã strategy : matrix : ci_node_index : [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] steps : - name : Test env : CI_NODE_TOTAL : ${{ strategy.job-total }} CI_NODE_INDEX : ${{ matrix.ci_node_index }} run : | # get spec files order by filesize TEMP_FILE_PATH=$(mktemp) git ls-tree -r -t -l --full-name HEAD | grep '_spec.rb' | sort -n -k 4 | awk '{ print $5 }' | ./scripts/ci/rspec_split_files.sh > $TEMP_FILE_PATH # echo outputs echo "====SPEC FILES COUNT====" cat $TEMP_FILE_PATH | tr ' ' '\n' | wc -l echo "====SPEC FILES====" cat $TEMP_FILE_PATH | tr ' ' '\n' # run rspec bundle exec parallel_rspec -- --format progress -- $(cat $TEMP_FILE_PATH) #!/bin/bash i = 0 ret = () while read -r line do if [ $[ i % $[ CI_NODE_TOTAL ]] = $[ CI_NODE_INDEX ] ] ; then ret += ($line) fi let i++ done echo ${ret[ @ ]} åçŽã«ãã¹ããåçé
åããã®ã§ã¯ãªãããã¡ã€ã«ãµã€ãºã§ãœãŒããããšããå·¥å€«ãæœãããŠããŸããããã¯ããã¹ãå®è¡æéããã¡ã€ã«ãµã€ãºã«æ¯äŸãããšããä»®å®ã«åºã¥ããŠããŸãã ãããã®å·¥å€«ã«ãããå®è¡æéãåŸæ¥ã®çŽååã«ãªããŸã§é«éåã§ããŸãã ð 詳现ã¯âãã¡ãã®èšäºãã芧ãã ããã tech.findy.co.jp Larger Runners åºæ¬çã«ã¯äžŠååã§CIé«éåãç®æããŸãããé£ããå Žåã¯Larger Runnersã䜿ãã®ãæã§ãã ïŒäžŠååã®å¯åŠã®å€å®ã¯ããã¹ã察象ãã¡ã€ã«ã®åå²ãå€éšããå¶åŸ¡å¯èœãã©ããã§æ±ºããŠããŸãïŒ Larger Runnersã¯ãå¥çŽããŠãããã©ã³ããGitHub Teamãã©ã³ããŸãã¯ãGitHub Enterprise Cloudãã©ã³ãã®å Žåã«å©çšå¯èœã§ãã æå€§ã§64ã³ã¢ãŸã§ã¹ããã¯ã¢ããã§ãããããã§ãããã€ã䜿ã£ãŠã¿ããã§ããïŒ docs.github.com Armã©ã³ããŒã«ã€ããŠã¯å
æ¥GAãšãªã£ãããšããããç©æ¥µçã«ç§»è¡ãæ€èšããããã«ãªããŸããã github.blog 3å²çšåºŠã®ã³ã¹ãåæžãã§ããããšãããæ¢ã«ç€Ÿå
ã®ããã€ãã®ãããžã§ã¯ãã§ã¯Linux Armã©ã³ããŒã«å®å
šç§»è¡ããŠããŸãã 2024幎9æçŸåšã§ã¯ã ruby/setup-ruby ãªã©ãµãŒãããŒãã£ã®å¯Ÿå¿ãé²ãã§ããªããã®ããããŸããç§»è¡ã®éã¯åäœæ€èšŒãååã«ããŠãããšè¯ãã§ãããã åèãŸã§ã«ãåŒç€Ÿã®ããã³ããšã³ãã§ã®é«éåã®äŸã瀺ããŸãã Build Test 2ã³ã¢ 15m8s 12m7s 4ã³ã¢ 8m38s 6m56s ã¹ããã¯ã¢ãããããšã³ã¹ãã¯å¢ããŸããããã®åCIã®åŸ
ã¡æéã®åæžãæåŸ
ã§ããŸããå®è³ªçãªè² æ
ã«å€§ããªå€åãç¡ãå Žåã¯åŒ·æ°ã§ã¹ããã¯ã¢ããããŠãããŸããã ðª ãŸãšã ãããã§ããã§ããããïŒ ãã®èšäºã§ã¯ãåŒç€Ÿã®GitHub Actions掻çšäºäŸã®å
ãCIé«éåã«ã€ããŠã玹ä»ããŸããã CIã®åŸ
ã¡æéã«ã€ããŠã¯ããç¶ç¶çããªããªãŒãã®æžç±ãåèã« 10å以å
ãç®æããšè¯ãã§ãããã www.kadokawa.co.jp å®éã«åŒç€Ÿã§ã¯ããããã®åãçµã¿ãè¡ãåã¯1PRããã15åã20åã»ã©ããã£ãŠããCIãã10å以å
ã®å®äºãç®æããŠåãçµãã§ããçµæãå¹³å5åçšåºŠãŸã§é«éåã§ããäŸããããŸãã åŒç€Ÿã«ã¯CIã®æŽåã«é¢å¿ã®é«ãã¡ã³ããŒãå€ãåšç±ããŠãããŸããå匷äŒçã§ãäŒãããæ©äŒããããŸããããã²ã声ãããã ããã CIは5分以内!素早い開発サイクルを支えるCI - Speaker Deck ファインディでのGitHub Actions活用事例 - Speaker Deck ãã¡ãã®çºè¡šã«ã€ããŠã¯ãconnpassã®ã€ãã³ãããŒãžã«ã¢ãŒã«ã€ãåç»ãžã®ãªã³ã¯ãèŒããŠãããŸãã findy.connpass.com 次åãžç¶ããŸãïŒð ãã¡ã€ã³ãã£ã§ã¯äžç·ã«äŒç€ŸãçãäžããŠãããã¡ã³ããŒãåéäžã§ããèå³ãæã£ãŠããã ããæ¹ã¯ãã¡ãã®ããŒãžãããå¿åãé¡ãããŸãã herp.careers
ããã«ã¡ã¯ã Findy ã§ Tech Lead ãããããŠããã£ãŠãæžç°ã§ãã çªç¶ã§ããçããã¯æ¬ãèªã¿ãŸããïŒ ãšã³ãžãã¢ãšããè·æ¥æãæè¡æžãããžãã¹æžãªã©ãæ§ã
ãªãžã£ã³ã«ã®æ¬ãèªãæ©äŒãå€ãã®ã§ã¯ãªãã§ããããïŒ ããã§ä»åã¯ã人çãå€ããäžåãšé¡ããŠãåŒç€Ÿãšã³ãžãã¢éã®ãæ°ã«å
¥ãã®äžåã玹ä»ããŠãããŸãã ããã§ã¯èŠãŠãããŸãããïŒ äººçãå€ããäžå æžç° ãœãããŠã§ã¢ã»ãã¡ãŒã¹ã ããããããžãã¹ãäžå€ãããæåŒ·æŠç¥ ãžã§ããµã³ã»ã¢ã€ã 髿© 1å
ãã«ã³ãŒã ã·ãªã³ã³ãã¬ãŒã®ã¬ãžã§ã³ã ãã«ã»ãã£ã³ãã«ã®æåã®æã æ£® ã¢ãžã£ã€ã«ãµã ã©ã€ââé人éçºè
ãžã®é ãŸãšã 人çãå€ããäžå æžç° ãœãããŠã§ã¢ã»ãã¡ãŒã¹ã ããããããžãã¹ãäžå€ãããæåŒ·æŠç¥ ãœãããŠã§ã¢ã»ãã¡ãŒã¹ã äœè
: åå· åä¹ æ¥çµBP Amazon åå·åä¹ããèã®æ¬ã§ãDXïŒããžã¿ã«ãã©ã³ã¹ãã©ãŒã¡ãŒã·ã§ã³ïŒã®æ¬è³ªãçè§£ããããã«ã¯å¿
èªã®äžåã§ãã 2024幎9æã«ã¯å
容ã倧å¹
æ¹å®ãã第2çãçºå£²äºå®ãšã®ããšã§ããã¡ããåãããŠãã§ãã¯ããŠããããã§ããã ãœãããŠã§ã¢ãã¡ãŒã¹ã第ïŒçãããããããžãã¹ãäžå€ãããæåŒ·æŠç¥ äœè
: åå· åä¹ æ¥çµBP Amazon å
容ãšããŠã¯ãæ¥æ¬ã®ITå²ã®æ¯ãè¿ãããå§ãŸããçŸåšã®åé¡ç¹ã®ææããããŠDXã®åšãæ¹ãé²ãæ¹ã«ã€ããŠè©³ãã解説ãããŠããŸãã ãŸããããããã®æä»£ã®åŒ·ãéçºçµç¹ã®åšãæ¹ãäœãæ¹ã«ãèšåãããŠããããšã³ãžãã¢ã ãã§ã¯ãªããããŒãžã£ãŒãçµå¶è
ã®æ¹ã«ãæ¯éèªãã§æ¬²ããäžåã«ãªã£ãŠããŸãã å®éã«èªã¿é²ããŠãããšå
±æã§ããéšåãå€ãããããã£ãŠãããã©äžã
å®è¡ã«ç§»ãããšãã§ããªãããšããæ¹ã«ãã³ããå±ããŠããããããªå
容ã§ããã ãã®æ¬ãäžã«åºãåœæãèªåã¯30代ã«å
¥ã£ãã°ããã§ããããããããŒãžã£ãŒãšããŠã®ãã£ãªã¢ãå°ãããã£ãŠããé ã§ããã çµå¶é£ããã£ãŠæ¬²ããããšãšéçºçµç¹ãããããããšããºã¬ãŠããæèŠãå°ãªãããããããã®æ¬ãèªãã ããšã«ãã£ãŠããããã¯ãªã¢ã«ãªããå®éã«å®è¡ã«ç§»ãããšãåºæ¥ãããšããããŸããã èªåãæ±ããŠããæèŠãšãããã®ã¯åœææå±ããŠããçµç¹ç¹æã®ãã®ã§ã¯ãªãã瀟äŒå
šäœã®åé¡ã§ãããšããããšãå確èªã§ãããããéã«å²ãåã£ãŠè¡åã«ç§»ãããã®åæ°ãè²°ãããšãã§ããŸããã ãããããã®æ¬ãšåºäŒã£ãŠããªãã£ãããä»ã§ãéåæãšèè€ããŠäœãé²ããããªããŸãŸã ã£ããšæããŸããããããããšãããããšã³ãžãã¢äººçã®ã¿ãŒãã³ã°ãã€ã³ããšãªã£ã1åã«ãªã£ããšæããŸãã ãžã§ããµã³ã»ã¢ã€ã ãžã§ããµã³ã»ã¢ã€ããå倧ãªè£œåãçã¿åºãã¢ããã«ã®å€©æãã¶ã€ã㌠äœè
: ãªãŒã¢ã³ã㌠ã±ã€ãâ æ¥çµBP Amazon 1åãšèšã£ãŠããªããããã1åã®ç޹ä»ããããŠãã ããïœ ãã®ã¹ãã£ãŒãã»ãžã§ããºã絶察çãªä¿¡é Œãå¯ãããã¶ã€ããŒããžã§ããµã³ã»ã¢ã€ãæ°ã®çãç«ã¡ãåŠçæä»£ãã¢ããã«å
¥ç€ŸåŸã®iMacãiPhoneãiPadãMacBook Airãªã©æ°ã
ã®é©æ°çãªè£œåã¥ããã§ã®è©Šè¡é¯èª€ã瀟å
ã§ã®äºããŸã§ãæããäžåã§ãã ã¢ãã¥ããã«å¯Ÿããæèãå§¿å¢ããã¶ã€ã³ã«å¯Ÿããèãæ¹ãªã©ããšã³ãžãã¢ã«ãå€ãã®ãã³ããäžããŠãããå
容ã«ãªã£ãŠããŸãã ãã®æ¬ãäžã«åºãåœæãèªåã¯20代äžç€ãããã§è¥ããããããäœãããŠãã£ãªã¢ãèããã¹ããªã®ã暡玢ããŠããé ã§ããããã®æã«ãã®æ¬ãšåºäŒããäœæ°ãªãã«èªãã§ãããšã¢ã€ãæ°ã®ã¢ãã¥ããã«å¯Ÿããå§¿å¢ã«é©ããããŸããã è©³çŽ°ã¯æ¬ãèªãã§ããã ãããã®ã§ãããäŸãã°æ°è£œåã®ãã¶ã€ã³ãããéãåœŒã¯æ°çŸãæ°åãã¿ãŒã³ã®ãããã¿ã€ããäœãããã§ãã ãã®ãã¿ãŒã³ãªã®ã§ãããçŽ äººããã¿ãããããšèŠã ãšå
šãåããã¶ã€ã³ã«èŠããããã§ããããããããã¯å
šãŠæ°ããªåäœã§éãããã§ããã®éããæ¯ã¹ã€ã€ãæçµçãªãã¶ã€ã³ã«èŸ¿ãçãããã§ããiPhoneãMacbookãªã©ã®ãã¶ã€ã³ãæåã¯ãã®ããã«ããŠçãŸãããšã®ããšã§é©ããããŸããã ãããèªãã æãèªåãæ©ãã§ããããšãå®ã¯ãŸã çãèãã ã£ããšæ°ä»ããããŸãããäžççãããã¯ããçãã ãã¶ã€ããŒã ãšããŠãããŸãæåã«æ³¥æãããšãããåã£ãŠããããã§ãã èªåçšåºŠã®ãšã³ãžãã¢ãä»ã®æ®µéã§ãŠããŠãæ©ãã§ããæããã£ãããç®ã®åã®ããšã«éäžããŠ1åãã€æ³¥æãããšãããåãç¶ããåŒãåºããå¢ããããšã«éäžããããšæ±ºæã§ããŸããã ãããããã®æ¬ãšåºäŒã£ãŠããªãã£ãããä»ã§ããŠããŠãæ©ãã§æãåãããŠããªãã£ããããããŸããããã®æ¬ããŸãããšã³ãžãã¢äººçã®ã¿ãŒãã³ã°ãã€ã³ããšãªã£ã1åã«ãªã£ããšæããŸãã 髿© ãã¡ã€ã³ãã£ã§ãšã³ãžãã¢å
Œããã»ã¹æ¹åã³ãŒããããŠãã髿©ïŒ @Taka_bow ïŒã§ãã 1å
ãã«ã³ãŒã ã·ãªã³ã³ãã¬ãŒã®ã¬ãžã§ã³ã ãã«ã»ãã£ã³ãã«ã®æåã®æã 1å
ãã«ã³ãŒã ã·ãªã³ã³ãã¬ãŒã®ã¬ãžã§ã³ã ãã«ã»ãã£ã³ãã«ã®æåã®æã äœè
: ãšãªãã¯ã»ã·ã¥ããã , ãžã§ããµã³ã»ããŒãŒã³ããŒã° , ã¢ã©ã³ã»ã€ãŒã°ã« ãã€ã€ã¢ã³ã瀟 Amazon ã·ãªã³ã³ãã¬ãŒã®äŒèª¬çã³ãŒãã§ããã¹ãã£ãŒãã»ãžã§ããºã®èŠªåã§ããã£ããã«ã»ãã£ã³ãã«ã ã1å
ãã«ã³ãŒããã¯ãåœŒã®æ§ã
ãªæããèšé²ããæ¬ã§ããèè
ã¯å
GoogleäŒé·ã®ãšãªãã¯ã»ã·ã¥ããããå
Google SVPã®ãžã§ããµã³ã»ããŒãŒã³ããŒã°ãå
Googleã§çµå¶ã³ã³ãµã«ã¿ã³ãã®ã¢ã©ã³ã»ã€ãŒã°ã«ã®3åãïŒãã§ã«èè
ããããé¢åïŒïŒ ãã®3人ã®ã¿ãªããããã«ã®æå°ãä»°ãã èµ·æ¥å®¶ãã¡ã®å€ãã仿¥ã®ãã¯ãããžãŒæ¥çãçœåŒããŠããŸããçŸåšã®GAFAMã®éçã¯ããã«ã®åœ±é¿åãªãããŠã¯èªããªããšèšãããŠããŸãã ç§ã奜ããªãšããœãŒãã®1ã€ã«ãGoogleããããžã£ãŒããå
šå»ãã管çè·ã®ããªãçµç¹ãäœã£ãçŽåŸã®ãã©ãªãŒã»ãã€ãžãšãã«ã®ãããšãã§ãã ãã«ã¯èšããŸãã ãããã«ã¯ãããžã£ãŒã眮ããªããšãã¡ã ã ã©ãªãŒã¯çãã«ã€ãŸã£ããã¡ããã©ãããžã£ãŒãå
šå»ããã°ããã§ã圌ã¯çµæ§æºè¶³ããŠããã®ã ã£ãã(åŸç¥) äºäººã¯ã©ã¡ããè²ããããã°ããå ã
ãããã®è°è«ãç¶ããããšããšããã«ã¯ã©ãªãŒã®æµåã«ãªãã£ãŠããããªããšã³ãžãã¢ã«çŽæ¥èããŠã¿ãã°ãããšèšã£ãã(äžç¥)ãã«ã¯ãã®äžäººã«ããããžã£ãŒãã»ããããšèšªããã ããããšããè¿äºã ã£ãã ãªãã ïŒ ãäœããåŠã°ããŠããã人ããè°è«ã«æ±ºçãã€ããŠããã人ãå¿
èŠã ããã ãã®æ¥åœŒãã¯æ°äººã®ãœãããŠã§ã¢ãšã³ãžãã¢ãšè©±ããããçãã¯ã»ãšãã©åãã ã£ãã ãã®ãšããœãŒã 1 ã¯ãããšãããã¯äŒæ¥ã§ããããŒãžã£ãŒãããããŠéèŠãªååšã§ããããšã瀺ããŠããŸãããšã³ãžãã¢çµç¹ã®ãããžã¡ã³ãã§æ©ã¿ããããšãä»ã§ãèªã¿è¿ããŸãã æ£® FIndy ããã¯ãšã³ããšã³ãžãã¢ã®æ£® @jiskanulo ã§ãã ã¢ãžã£ã€ã«ãµã ã©ã€ââé人éçºè
ãžã®é ã¢ãžã£ã€ã«ãµã ã©ã€ââé人éçºè
ãžã®é äœè
: ïœïœïœïœïœïœïœïŒ²ïœïœïœïœïœïœïœïœ , 西æçŽäºº , è§è°·ä¿¡å€ªé ãªãŒã 瀟 Amazon ã¢ãžã£ã€ã«éçºãé²ããäžã§ã®ããŒã äœããèŠç©ããèšç»ãæ¥ã
ã®éçºãšå€å²ã«ããã£ãŠè§£èª¬ãããå
¥éæžãšããŠããããã§ãã ã¢ãžã£ã€ã«ãµã ã©ã€æ¥æ¬èªèš³çãåºçããã2011å¹ŽåœæãITæ¥çã®ãšã³ãžãã¢ãéãŸãåç« ãèªã¿åããã茪èªäŒã®ã³ãã¥ããã£ãæ¥æ¬åå°ã§çãŸããŸããã ãã®ã³ãã¥ããã£ã¯æ¬¡ç¬¬ã«çãäžãããç¿2012幎ã«ã¯åèè
ã®Jonathan Rasmussonãããæ¥æ¬ã«ãæãããŠåå è
100人è¶
ãã®å€§ã€ãã³ã Agile Samurai Dojo Gathering 2012 ãéå¬ããã«è³ããŸããã èãããçš®åã¯ä»ãäžçã§ãèœå¹ããŠããã§ãããã ç§å人ã®åœæã®æãåºãèšããŸãã 2010幎ã«åœæå€ããŠããäŒæ¥ãéè·ãæ°ã¶æã®ç¡è·æéãçµãŠæ°ããäŒç€Ÿã«å€ããŠããŸããã ãŠããããã¹ããå°å
¥ããŠå®å
šã«éçºããããã®ä»çµã¿ã¥ãããå¶æ¥ã¡ã³ããŒã®æ¥åå¹çåã®ããã®ããŒã«äœæã瀟å
ãµãŒããŒã®ç®¡çãããŒã¿ã»ã³ã¿ãŒãžã®ã©ããã³ã°ãªã©ãªã©äŒç€Ÿãšãããã¯ãã«è²¢ç®ããã¹ãåãçµãã§ããŸããã ãããªæ¥ã
ã1幎ã»ã©éããããã äœæ¥ãããªãã ãã§1æ¥çµãã£ãŠããŸãäœæ¥è
ã«ãªã£ãŠãããªãšæããŠããŸãããã äžäººã§ã§ããããšã¯éçããããšãæããŠãããããŒã ãçµãã§ãããã課é¡è§£æ±ºã®ããæ¹ãæš¡çŽ¢ãã©ãããã°ãããããã¯ããäœããã®ãããããããããããã¯ããšã¯âŠãšè²ã
ãªããšã«æãæ©ãã§ããŸããã æãæ©ãã§ãããªãã§ã¢ãžã£ã€ã«ãµã ã©ã€ã«åºäŒãããã®æ¬ãéããŠã³ãã¥ããã£ã«åå ããŠä»ã®æ¹ãšäº€æµãæ·±ããããšã§åããããªæ©ã¿ãæ±ããŠãã仲éãããããããããšãç¥ããŸããã ãã¡ã€ã³ãã£ç€Ÿã«å
¥ç€ŸããŠããããã®æ¬ã«ãããé人éçºè
ãã®æ¯ãèãããããããŠå¿ãããããšããŠããŸãã ãŸãšã ãããã§ããã§ããããïŒ çŸåšããã¡ã€ã³ãã£ã§ã¯äžç·ã«åãã¡ã³ããŒãåéäžã§ãã èå³ãããæ¹ã¯ãã¡ããã â herp.careers ïŒåŒçšïŒãšãªãã¯ã»ã·ã¥ããã. ãžã§ããµã³ã»ããŒãŒã³ããŒã°. ã¢ã©ã³ã»ã€ãŒã°ã«. 櫻äºãç¥å (翻蚳). 1å
ãã«ã³ãŒã ã·ãªã³ã³ãã¬ãŒã®ã¬ãžã§ã³ã ãã«ã»ãã£ã³ãã«ã®æåã®æã. ãã€ã€ã¢ã³ã瀟, 2019/11/14, p.63 ↩
ã¯ããã« çæ§ãã¯ãããŸããŠã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