ã¹ããŒããã£ã³ãã®PdMïŒãããã¯ããããŒãžã£ãŒïŒ1幎çã®é·ç°ã§ãã ã¹ããŒããã£ã³ãã«ã¯ãšã³ãžãã¢ãšããŠå
¥ç€ŸããçŸåšã¯SaaSäºæ¥ã®PdMãããŠããŸãã ããã§ä»åã¯ããšã³ãžãã¢ããPdMã«ãžã§ããã§ã³ãžããŠæ°ã¥ããããšãïŒã€ç޹ä»ããããšæããŸãã ãšã³ãžãã¢ä»¥å€ã®è·çš®ã®æ©ã¿ãã€ã³ã ãšã³ãžãã¢ãªã³ã°ã®é¢åããã æåŸã« ãšã³ãžãã¢ä»¥å€ã®è·çš®ã®æ©ã¿ãã€ã³ã æ°ã¥ããããšã®ïŒç¹ç®ãšããŠã¯ããšã³ãžãã¢ä»¥å€ã®è·çš®ã®ãæ©ã¿ãã€ã³ããã«ã€ããŠã§ãã æ¥é ãšã³ãžãã¢ãšããŠåããŠããæ¹ã§ãã£ãŠãããã¶ã€ããŒã»ããŒã±ã¿ãŒã»ã»ãŒã«ã¹ã»äºæ¥è²¬ä»»è
ã»çµå¶è
ãªã©ä»ã®åœ¹å²ã®ã¡ã³ããŒã«å¯ŸããŠã誰ãäœã®ããã«äœãããŠãããïŒããçè§£ããåªãã¯ãããŠããããšæããŸãã ãããããšã³ãžãã¢ãšããŠæ¥åãéè¡ããäžã§ãã©ã€ããæã£ãŠå®ãã¹ããã®ã¯é·æçãªã·ã¹ãã ã®æåã«ãªããŸãã ãã®ããããšã³ãžãã¢ä»¥å€ã®è·çš®ã®æ©ã¿ãã€ã³ãã¯åœäºè
ã«ãªããªããã°çè§£ããããåé¡ã§ãããäžèšã«ã€ããŠæ¬æ°ã§èããæ©äŒã¯å°ãªãããšæããŸãã äžæ¹ãPdMã®æ¥åã¹ã³ãŒãã¯ãããã¯ãã«é¢ããå
šé åã§ãã ãšã³ãžãã¢ãªã³ã°ä»¥å€ã®ãã¶ã€ã³ã»ããŒã±ãã£ã³ã°ã»ã»ãŒã«ã¹ã»äºæ¥è²¬ä»»ã»çµå¶ãšãã£ãå
šé åãéã¿ãäžã§ãæåã®äžæãèã宿œããããšãä»äºã«ãªããŸãã ãããªäžã§ãšã³ãžãã¢ãªã³ã°ä»¥å€ã®çµéšãããŠããŠããªãPdMããåé åã®å°ä»»è
ãšè©±ãæœçã宿œããŠãããããã«ã¯ã圌ãã® æ©ã¿ãã€ã³ããèªèããŠããå¿
èŠ ããããŸãã ãšã³ãžãã¢ãèªèãã¥ããæ©ã¿ãã€ã³ãã®äžäŸãæããŸããšã çŸå Žã®ãã£ãŒã«ãã»ãŒã«ã¹ïŒå¶æ¥ïŒã¯ã åè«æ°ã売äžã®ç®æšãéæã§ããŠãããïŒ æã®ç®æšãéæã§ããããŒã¹ãªã®ãïŒ ã§ããªãã®ã§ããã°ã©ã®ãããªã¢ã¯ã·ã§ã³ãåãã¹ããªã®ãïŒ ãšãã£ãè°é¡ãæ¯é±å®äŸã§è¡ããè¡åãç©ã¿éããŠããå¿
èŠããããŸãã ãã®ãããæã«ã¯ããµãŒãã¹ã®ã¡ãªãã享åãèããããããªã顧客ã ãããã®åè«ã¯å泚ããŠãããïŒããšãã£ããããªæ©ã¿ãã€ã³ãïŒèè€ïŒãçãŸããããšããããŸãã ããã¯ã¡ããã©ãšã³ãžãã¢ã§ãããåããã©ã¯ãœã³ãŒããä»ã®ãªãªãŒã¹ã®ããã«ããŒãžããŠãããïŒããšãã£ãæ©ã¿ãã€ã³ãã«è¿ãããªãšæããŸãã ãããã£ãä»è·çš®ã®æ©ã¿ãã€ã³ããç¥ã£ãäžã§æœçã®ææ¡ãã§ãããåŠãã§ã¹ããŒãæãå§åçã«å€ãããŸãã ãšã³ãžãã¢ãªã³ã°ã®é¢åããã æ°ã¥ããããšã®ïŒç¹ç®ãšããŠã¯ããšã³ãžãã¢æ¥åã®ãé¢åããããã«ã€ããŠã§ãã ãšã³ãžãã¢ã¯è€é床ã®é«ãã³ãŒããã¢ãŠããããããããšãä»äºã®äžã€ã§ãã ãã®ã³ãŒãã¯äžã€ã®ãã¹ã§äžå
·åããããæã«ã¯é害ã®åå ãšãªãããšããããŸãã ãã®ãããã³ãŒãã®æœè±¡åãå
·äœåã»è²¬ä»»ç¯å²ã®æç¢ºåãç²åºŠã®çµ±äžã»èªåãã¹ããããã»ã¹ã®æ¹åãªã©ãåãå
¥ããŠãçæé·æå«ããŠäžå
·åãçºçããªãããã®åãçµã¿ãè¡ãããšãæ±ããããŠããŸãã äžæ¹ãPdMã¯ãäœãã€ããããããªãäœããããšãã£ãæ
å ±ãä»®èª¬ãæ€èšŒçµæãå
ã«æœçãšããŠã¢ãŠããããããããšãä»äºã®äžã€ã§ãã ãã®æœçã¯ãäºæ¥ã«é¢ããå
šãŠã®ååãå
ã«å®è¡ããããšãã§ããŸãã ã³ãŒãã®å®è¡ãšã¯éããæœçã®å®è¡ã«ã¯ã³ã³ãã€ã©ã¯ãªããããšã©ãŒãšãªã£ãŠå®è¡ã§ããªãããšã¯ç¡ãã§ãã ãŸããéåžžã«ã¯ãªãã£ã«ã«ãªåé¡ä»¥å€ã¯å®è¡åŸã«ä¿®æ£ããããšãã§ããŸãã ãããã£ãŠPdMã«ãžã§ããã§ã³ãžãããšããšã³ãžãã¢æ¥åã®é¢åãããã«æ°ã¥ãããšãã§ããŸãã ãŸããã·ã¹ãã éçºã«å°œåããŠãããšã³ãžãã¢ã«æè¬ããæ°æã¡ã«æ°ã¥ãããšãã§ããŸãã â»ãé¢åãããããšè¡šçŸããŸãããããšã³ãžãã¢ã®äžå€§çŸåŸ³ã®äžã€ã®ãæ æ°ãã®èŠç¹ãããšã³ãžãã¢ãšããŠãæ£ãã衚çŸã ãšèããŠããŸãã æåŸã« 以äžãããšã³ãžãã¢ãPdMã«ãªã£ãŠæ°ã¥ããããšãã«ãªããŸãã PdMãçµéšããããšã«ããæ°ã¥ããããšã¯ä»ã«ããããããããŸãã PdMã®æ¥åãéããŠãšã³ãžãã¢ãªã³ã°ã«ã掻ãããæ°ã¥ããåŸãããšãã§ããããããšã³ãžãã¢ã®æ¹ã§PdMãçµéšã§ããã¿ã€ãã³ã°ãããã°ãã²ãã£ã¬ã³ãžããŠã¿ãŠãã ããïŒ
ã¹ããŒããã£ã³ãã®å
¥å±±ã§ãã KubernetesïŒk8sïŒãéçšãããŠããæ¹ã
ã¯ãPodã«åãæž¡ãæ©å¯æ
å ±ãã©ããã£ãŠç®¡çããŠããŸããïŒ k8sã§ã®æ©å¯æ
å ±ã®ç®¡çãšããã°SecretãªãœãŒã¹ãäžè¬çã§ãããSecretãªãœãŒã¹ã管çããäžã§ã¯ä»¥äžã®ãããªèª²é¡ã«æ©ãæ¹ãå€ãã®ã§ã¯ãªãã§ããããïŒ Secretã¯Base64ãšã³ã³ãŒãã®ã¿ãªã®ã§ãå
容ã確èªã§ããã°ç°¡åã«ãã³ãŒãã§ããŠããŸã SecretãªãœãŒã¹ã®ãããã§ã¹ãã«Base64ãšã³ã³ãŒãã®ã¿ã®æ©å¯æ
å ±ãå«ããããGitHubãªã©ã«ãã®ãŸãŸã³ãããããã®ã¯å±éº ãããã®å¯ŸçãšããŠã kubesec ã Sealed Secrets ãªã©ãå©çšããŠæå·åãè¡ãæ¹æ³ãäž»æµã ãšæããŸãããä»åã¯å€éšã®KMSãªã©ã«ä¿åããæ©å¯æ
å ±ãk8sã«çŽæ¥åãæž¡ãããšãå¯èœãª Kubernetes External Secrets ã«ã€ããŠãEKSãšAWS Secrets ManagerãäŸã«ç޹ä»ããããšæããŸãïŒ Kubernetes External Secretsãšã¯ æŠèŠ ã¡ãªãã å°å
¥ ã€ã³ã¹ããŒã« ã¢ã¯ã»ã¹æš©éèšå® å®éã«è©ŠããŠã¿ã æåŸã« Kubernetes External Secretsãšã¯ æŠèŠ Kubernetes External Secretsã¯ããã¡ã€ã³ã¬ãžã¹ãã©ã»ã¬ã³ã¿ã«ãµãŒããµãŒãã¹ãæäŸããŠããGoDaddy瀟ãå
¬éããŠããOSSã§ãã å€éšã®KMSãªã©ã«ä¿åããæ©å¯æ
å ±ãSecretãªãœãŒã¹ãšããŠk8sã¯ã©ã¹ã¿ã«çŽæ¥åãæž¡ãããšãã§ãããã®ã§ãçŸæç¹ã§ä»¥äžãšã®é£æºããµããŒãããŠããŸãã AWS Secrets Manager AWS System Manager Hashicorp Vault Azure Key Vault GCP Secret Manager åäœãšããŠã¯ã 察象ãšããæ©å¯æ
å ±ãæå®ããExternalSecretsãªãœãŒã¹ãäœæããŠããããšã§ãã³ã³ãããŒã©ãKMSã«ä¿åãããŠããå€ãSecretãªãœãŒã¹ã«åæ ããŠããã ãšããã·ã³ãã«ãªãã®ã§ãã ã¡ãªãã åé ã«ç޹ä»ããSecretãæå·åããŠç®¡çããæ¹æ³ãšæ¯èŒããŠã以äžã®ãããªã¡ãªããããããšæããŸãã k8sã§å©çšããSecretãªãœãŒã¹ã®ãããã§ã¹ãã«æ©å¯æ
å ±ãä¿æããªããŠãããªã æ©å¯æ
å ±ã«é¢ãã管çïŒæ©å¯æ
å ±ãã¢ã¯ã»ã¹æš©éãªã©ïŒãäžå
åã§ãã æ©å¯æ
å ±å€æŽã«äŒŽãåæ ã³ã¹ããæžã å°å
¥ å
¬åŒã®GitHubãªããžããªã«èšèŒãããŠããæé ã«åŸã£ãŠãå®éã«å°å
¥ããŠãããŸãã ä»åã¯ãEKSãšAWS Secrets Managerã®ç°å¢ã§è©ŠããŠã¿ãŸãã ã€ã³ã¹ããŒã« ã€ã³ã¹ããŒã«ã¯ãhelmã§å
šãŠè¡ãæ¹æ³ãšhelmãškubectlã䜿çšããŠè¡ãæ¹æ³ããããŸãã ä»åã¯ãhelmãškubectlã䜿çšããŠè¡ãæ¹æ³ã§å®æœããŸãã 1. helmãã€ã³ã¹ããŒã« ãããã§ã¹ãã®çæã«helmãå¿
èŠãšãªããããhelmã³ãã³ããã€ã³ã¹ããŒã«ããŸãã 2. ãªããžããªãclone Kubernetes External Secretsã®ãªããžããªãããŒã«ã«ã«cloneããŸãã $ git clone https://github.com/godaddy/kubernetes-external-secrets 3. ãããã§ã¹ããçæ cloneãããã£ã¬ã¯ããªã§ä»¥äžã³ãã³ããå®è¡ããŠããããã§ã¹ããçæããŸãã â»å
¬åŒã®æé ã®ã³ãã³ãã«ãªãã·ã§ã³ã远å ããŠãnameãšregionã倿ŽããŠããŸãã ãªãã·ã§ã³ã®è©³çްã¯ã ãªããžã㪠ã«èšèŒãããŠããŸãã $ helm template -f charts/kubernetes-external-secrets/values.yaml --output-dir ./output_dir ./charts/kubernetes-external-secrets/ --name test --set env.AWS_REGION='ap-northeast-1' ã³ãã³ããå®è¡ãããšæå®ãã output_dir 以äžã«ãããã§ã¹ããçæãããŸãã 4. çæããããããã§ã¹ããapply output_dir ã«çæããããããã§ã¹ããapplyããã°ã€ã³ã¹ããŒã«ã¯å®äºã§ãã kubectl apply -f ./output_dir/kubernetes-external-secrets/templates/ ã¢ã¯ã»ã¹æš©éèšå® Kubernetes External Secretsã䜿ã£ãŠAWS Secrets Managerã«ã¢ã¯ã»ã¹ããããã«æš©éèšå®ãå¿
èŠãšãªããŸãã å
¬åŒã®ãµã³ãã«ãåèã«ä»¥äžã®ãããªIAMããªã·ãŒãäœæåŸãããŒã«ã«ã¢ã¿ããããŸãã { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetResourcePolicy", "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret", "secretsmanager:ListSecretVersionIds" ], "Resource": [ "arn:aws:secretsmanager:ap-northeast-1:111122223333:secret:aes256-7g8H9i" # AWS Secrets Managerããk8sã«åãæž¡ãããSecretã®ARN ] } ] } å®éã«éçšã§å©çšããå Žåã¯kube2iamãªã©ãå©çšããŠæš©éã®ä»äžå
ãæå°éã«ããããšãæšå¥šãããŠããŸãã å®éã«è©ŠããŠã¿ã 1. AWS Secrets Managerã«Secretãä¿å 以äžã®ã³ãã³ããAWSã³ã³ãœãŒã«ã䜿ã£ãŠãAWS Secrets Managerã«Secretãä¿åããŸãã $ aws secretsmanager create-secret --region ap-northeast-1 --name test/credentials --secret-string '{"username":"admin","password":"1234"}' 2. ExternalSecretãªãœãŒã¹ãäœæ k8sã§SecretãªãœãŒã¹ãäœæãã代ããã«ãAWS Secret ManagerããååŸãããSecretã®æ
å ±ãæå®ããExternalSecretãªãœãŒã¹ãäœæããŸãã 以äžãããªãããã§ã¹ããäœæããŠãapplyããã°å®äºã§ãã apiVersion: kubernetes-client.io/v1 kind: ExternalSecret metadata: name: test-credentials spec: backendType: secretsManager # optional: specify role to assume when retrieving the data roleArn: arn:aws:iam::123456789012:role/test-role # äœæããIAMããªã·ãŒãä»äžããããŒã«ã®ARNãæå® data: - key: test/credentials # AWS Secret Managerã«ä¿åããSecretã®name name: username # 倿°åãèšå® property: username # AWS Secret Managerã«ä¿åããSecretã®ã©ã®ããŒãååŸãããæå® - key: test/credentials name: password property: password 3. k8sã®SecretãªãœãŒã¹ãç¢ºèª ExternalSecretãªãœãŒã¹ã§æå®ããSecretããk8sã®SecretãªãœãŒã¹ãšããŠåãæž¡ãããŠããã確èªããŸãã $ kubectl get secret test-credentials -o=yaml apiVersion: v1 data: username: YWRtaW4= password: MTIzNA== kind: Secret ïž SecretãªãœãŒã¹ãååŸããæ
å ±ãåç
§ããæå®ããSecretãBase64ã§ãšã³ã³ãŒããããç¶æ
ã§è¡šç€ºãããŠããã°æåã§ãã ããã§éåžžã®SecretãªãœãŒã¹ãšåæ§ã«Podå
ã§å©çšããããšãå¯èœãšãªã£ãŠãããAWS Secrets ManageråŽã§Secretã®å€ã倿Žãããå Žåãèªåã§k8sã®SecretãªãœãŒã¹ã«åæ ãããŸãã æåŸã« ä»åã¯ãKubernetesã®SecretãKMSãšé£æºããŠç®¡çããæ¹æ³ã玹ä»ããŸããïŒ æ©å¯æ
å ±ãå«ãã SecretãªãœãŒã¹ã®ãããã§ã¹ãããªããžããªã«ã³ãããããã«ç®¡çã§ããããšã¯ãããªãã®ã¡ãªããã ãšæããŸãã ãŸããåœåã¯AWSã®ãµããŒãã ãã§ããããçŸæç¹ã§AzureãGCPããµããŒãããŠãããç¶æ³ã«åãããŠKMSãéžæã§ããããšãå¬ããç¹ã§ããïŒ æš©éãªã©ã«æ³šæããŠäœã蟌ãã°ãk8sã®Secretãè¯ãæãã«ç®¡çã§ããããã«ãªãã®ã§ã¯ãªãã§ããããïŒåèã«ãªãã°å¹žãã§ãïŒ
ããã«ã¡ã¯ïŒã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãããŠããäžå·ã§ãã ãããªãã§ãããã€ãå
æ¥åŸ
æã® Vue.js 3.0.0 beta ããªãªãŒã¹ãããŸããïŒ We just released Vue 3.0.0-beta.1! Here's an overview from @youyuxi on the status of 3.0 core and official tools & libraries: https://t.co/7TP5ZMtjK4 — Vue.js (@vuejs) April 16, 2020 ã¹ããŒã¿ã¹ã¯ beta ãªã®ã§ããŸ2ç³»ããã¢ããã°ã¬ãŒãããããšã«æµæã¯ããã€ã€ããåŸ
æã®æ°ããŒãžã§ã³ãªã®ã§å
å®¹ãæ°ã«ãªãã»è©ŠããŠã¿ããæ¹ãå€ãã®ã§ã¯ãªãã§ãããããïŒããããç§èªèº«ãããã§ãïŒ ããã§ä»åã®èšäºã§ã¯Vue.jsã®ä»åŸã®ããŒããããã玹ä»ããŠãäœããã€ãªãªãŒã¹ãããã®ãã»ã©ãç§»è¡ããã®ãçããŸãšããäžã§ãæ°ã«ãªã£ãVue 3ç³»ã®å€æŽç¹ãããã€ãããã¯ã¢ããããŠãããŸãã èšäºã®åŸåã«ã¯å®éã«Vue 3ç³»ããµã³ãã«ãããžã§ã¯ãã§å°å
¥ããŠã¿ãŠããã®ã§ããèå³ãããæ¹ã¯ã芧ãã ããã ä»åŸã®ã¹ã±ãžã¥ãŒã«ïŒããŒããããïŒãèŠãŠã¿ã ãŸãã¯ããŒããããã§ããããã¡ãã«Github ProjectsãšããŠå
¬éãããŠããŸãã Roadmap · GitHub åãæç³»åãšããŠã¯ãªãŒã¿ãŒåäœã§åºåãããŠãããå·çæç¹ïŒ2020/04/29ïŒã§ã¯2020 Q1ã®æäžã«äœçœ®ããŠããŸãã é²è¡å
·åãšããŠã¯ 3.0 Beta by end of Q1 ãšãããŠãã3.0 Betaããã§ã«ãªãªãŒã¹ãããŠããã®ã§ãæŠãã¹ã±ãžã¥ãŒã«éããããæ©ããããã§é²è¡ããŠãããšèšãããã§ãã ãŸããRCãªãªãŒã¹ã¯2020 Q2ã®äžãããšããããšã§ãã ããã7æããã«ãªãªãŒã¹ããããããªã¹ã±ãžã¥ãŒã«æã§èªèããŠããã°è¯ãããã§ãã ä»ã«ãã巊端ã®FAQã®åã«ã¯å®éãŠãŒã¶ãŒããå€ãå¯ããããã§ããã質åãšãã®åçãèšèŒãããŠããŸãã åçã®äžããç¹ã«æ°ã«ãªã£ããã€ã³ãã以äžã«çŸ
åããŸããã æ¢åã®Vue 2ç³»ãŠãŒã¶ãŒã«å¯ŸããŠã¯ãã€ã°ã¬ãŒã·ã§ã³ã¬ã€ãããã€ã°ã¬ãŒã·ã§ã³ããŒã«ãCLIã§æäŸïŒè©²åœã³ãŒããèªåã§ã¢ããã°ã¬ãŒãã»æåã§ã¢ããã°ã¬ãŒããå¿
èŠãªãã®ãã¹ãã£ã³ïŒããã 2ç³»ã«é¢ããŠã¯ãã®åŸïŒVue 3ã®RCãªãªãŒã¹ãšã©ã¡ããååŸãããã¯äžæïŒã2.7ããªãªãŒã¹ãããäºå® äºææ§ã®ãã3ç³»ã®æ©èœã2ç³»ã«ãå®è£
ããã 2.7ã¯2ç³»æåŸã®ãã€ããŒãªãªãŒã¹ãšãªãã以åŸ18ã¶æéLTSã«ãªã Vuexã¯Vue 3ã«å¯Ÿå¿ããããã®ããŒãžã§ã³4ããªãªãŒã¹ããã ããŒãžã§ã³4ã¯ä»¥åã®ããŒãžã§ã³ãšå
šãåãAPIãæã¡ãVue 3ã«ç§»è¡ãããŠãŒã¶ãŒãVuexãã¹ã ãŒãºã«ç§»è¡åºæ¥ãããã«ããããã®ãã® ãã§ã«ããŒãžã§ã³5ãšããŠVue 3ã§æèŒããã reactivity API ãªã©ã掻çšããVuexèªäœã®æ°ãããã¶ã€ã³ãè¡ã£ãŠããããåææ®µéã§ãããªãªãŒã¹ã¯2020 Q3以éã«ãªãèŠèŸŒã¿ æåŸã®Vuexã«é¢ããŠã¯ãã§ã«betaçãå
æ¥ãªãªãŒã¹ãããŠããããã®èšäºã®åŸåã§ãå°å
¥ããŠã¿ãŠããŸãã And here's Vuex 4.0.0-beta.1! ð Now we have TypeScript support as well. Please note that you must provide your own augment typings for `this.$store`. Please let us know if you find any issues ð https://t.co/yQQMX7pZnC — Kia King Ishii (@KiaKing85) April 25, 2020 倿Žç¹ãèŠãŠã¿ã 次ã«ãå®éã«Vue 3ç³»ã«ãªãããšã§ã©ããã£ã倿Žããã£ãã®ããèŠãŠãããŸãã 以äžã®ãªã³ã¯ããRFCçµç±ã§3ç³»ã«åã蟌ãŸãããã®ã®äžèЧãèŠããŸãã Pull requests · vuejs/rfcs · GitHub ç¹ã« breaking change ã¿ã°ã®ã€ããPRã¯ä»åŸVue 3ç³»ã«ã¢ããããŒãããäžã§å¯Ÿå¿ãå¿
èŠãªãã®ãå«ãŸããå¯èœæ§ããããã®ãªã®ã§ãããããããã€ãããã¯ã¢ããããŠã¿ãŸãã Scoped Style Changes Scoped Style Changes by yyx990803 · Pull Request #119 · vuejs/rfcs · GitHub åŸæ¥ã®Vueã§ã¯ãSFCã®styleã¿ã°ã« scoped ãæå®ããŠãããšããåºæ¬çã«ã¯è©²åœã®ã³ã³ããŒãã³ãã«ã®ã¿CSSãé©çšãããŠããŸãããæ°ãã« ::v-deep , ::v-slotted , ::v-global ã远å ããPRã«ãªã£ãŠããŸãã ::v-deep ã«é¢ããŠã¯ãããŸã§ /deep/ ã >>> ãšãã£ãã·ã³ã¿ãã¯ã¹ã§åæ§ã®ããšãåºæ¥ãŠããŸããããåé€ãããCSSèªäœã®ã·ã³ã¿ãã¯ã¹ãšæ··åããŠãŠãŒã¶ãŒãæ··ä¹±ãããšãã£ãäºæ
ãã3ç³»ããdeprecatedãšãªãããã§ãã 話ãéžããŸãããå人çã«ã¯RFCã®ãªãã§è§ŠããããŠã以äžã®äžæãæ°ã«ãªããŸããã We are also aware that many users want to be able to use component props or state in the CSS of single-file components. We do have plans to support that but it will be in a separate RFC. ããŒã¿ã«ãã£ãŠå€åããå¯èœæ§ã®ããé«ããå¹
ãæã€ã³ã³ããŒãã³ãã®ã¹ã¿ã€ãªã³ã°ãèŠéãè¯ãç°¡æœã«å®è£
ããããšã¯ãããŸã§é£ããã£ãã®ã§ãããã解決ããããšããªãå¬ããã§ãã...ïŒ Remove data object declaration Remove data object declaration by CyberAP · Pull Request #111 · vuejs/rfcs · GitHub èªãã§åã®åŠãã§ãããã«ãŒãã³ã³ããŒãã³ãã® data ããããã£ã®å€ã«ãªããžã§ã¯ããæž¡ãããšãåºæ¥ãªããªããŸãã ãããŸã§ã«ãŒãã³ã³ããŒãã³ãã® data ããããã£ã®å€ã«ã¯é¢æ°ãããã¯ãªããžã§ã¯ããæž¡ãããšãåºæ¥ãŸãããã2éãã®å®£èšãåºæ¥ãŠããŸãããšãããªããžã§ã¯ããæž¡ãããšãã®ã¿ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹éã§ç¶æ
ãå
±æåºæ¥ãããšãæ··ä¹±ãæãã®ãåé€ãããæå³ã®ããã§ãã æ°å¹ŽåããååšããUIã®ããã®ãµã³ãã«ãããžã§ã¯ããªã©ã¯ãªããžã§ã¯ããæž¡ããŠãããã¿ãŒã³ããã£ããããã®ã§ãä»åŸåèã«ããå Žåã¯æ°ãã€ããå¿
èŠãããããã§ãã Remove filters Remove filters by yyx990803 · Pull Request #97 · vuejs/rfcs · GitHub ãããŸã§ã³ã³ããŒãã³ãã® template ã¿ã°ã§ã¯ {{ msg | format }} ã®ãããªåœ¢ã§å€ããã©ãŒãããããããšãåºæ¥ãŸãããããã®æ§æã {{ format(msg) }} ã®ããã«å€ãããŸãã 倿Žã®æå³ãšããŠã¯ã | ãšããã·ã³ã¿ãã¯ã¹ãJavaScriptèªäœã®æŒç®åãšè¡çªããããšã«ããåŒã®è§£æãè€éã«ããŠããããšãæããããŠããŸãã ãã®ä» æ°ã«ãªã£ãPRã®ç޹ä»ã¯ä»¥äžã§ãããä»ã«ãã¯ã¯ã¯ã¯ãããããªå€æŽãå€ãããã®ã§ãäžåºŠäžèšã®PRäžèЧãã倿Žç¹ãçºããŠã¿ããšããããã§ãïŒ ãŸããVue 3ã§ã¯Composition APIãšãã£ã倧ããªå€æŽãäºå®ãããŠããŸãã Composition APIã¯ä»¥åãã³ãºãªã³èšäºãæžããã®ã§ãããããã°äœµããŠã芧ãã ããã tech.smartcamp.co.jp å®éã«è©ŠããŠã¿ã æåŸã«ãå®éã«Vue 3ã®betaçãæå
ã§è©ŠããŠã¿ãŸãã å°å
¥æ¹æ³ãšããŠã¯ãVue CLIã®ãã©ã°ã€ã³ãšããŠVue 3ã®ããŒã¿çã詊ãããã®ãã®ãå
¬åŒããæäŸãããŠãããããã¡ãã䜿çšããŠãããŸãã github.com ãŸãã¯Vue CLIã§ãµã³ãã«ãããžã§ã¯ããäœæããŸãã $ vue create try-out-vue-3 ããã€ãã®è³ªåã«çããŠãããŸããä»åã¯ä»¥äžã®ããã«éžæããŸããã Linterãªã©ã¯å¥œã¿ã§ãããTypeScriptãšVuexã¯éžæããŠããããã«ããŸãããã ãããžã§ã¯ããäœæãããããšã確èªãããäžè¿°ãããã©ã°ã€ã³ãå
¥ããŸãã $ cd try-out-vue-3 $ vue add vue-next ããã ãã§ã»ããã¢ããã¯å®äºã§ãïŒãã®æè»œãã¯çŽ æŽãããã§ããã 念ã®çºãããŒãžã§ã³ã確èªããããã« package.json ãèŠãŠã¿ãŸãã "vue": "^3.0.0-beta.1", "vue-router": "^4.0.0-alpha.5", "vuex": "^4.0.0-alpha.1" ããããã§ããã 詊ãã« $ yarn serve ããŠã¿ããšã³ã±ãŠããŸãã®ã§ã衚瀺ããããšã©ãŒã«åŸã£ãŠããã€ãã®ãã¡ã€ã«ãä¿®æ£ããŠãããŸãã src/main.ts import { createApp } from "vue" ; import App from "./App.vue" ; import router from "./router" ; import store from "./store" ; const app = createApp ( App ); app.use ( router ); app.use ( store ); app.mount ( "#app" ); src/store/index.ts import { createStore } from 'vuex' export default createStore ( { state: {} , mutations: {} , actions: {} , modules: {} } ); src/router/index.ts import { RouteRecordRaw , createRouter , createWebHistory } from "vue-router" ; import Home from "../views/Home.vue" ; const routes: Array < RouteRecordRaw > = [ { path: "/" , name: "Home" , component: Home } , { path: "/about" , name: "About" , // route level code-splitting // this generates a separate chunk (about.[hash].js) for this route // which is lazy-loaded when the route is visited. component: () => import( /* webpackChunkName: "about" */ "../views/About.vue" ) } ] ; const router = createRouter ( { history : createWebHistory ( process.env.BASE_URL ), routes } ); export default router ; äžèšã®å€æŽãè¡ã£ãåŸãå床 $ yarn serve ãããšããç¡äºç«ã¡äžãããŸããã ã³ã³ãœãŒã«äžã®ãšã©ãŒã衚瀺ãããŠããªãã®ã§ããããã§ããã 以äžã§å°å
¥ã¯å®äºã§ãïŒ ãŸãšã é§ãè¶³ã§ç޹ä»ããŠããŸãããããããã ã£ãã§ããããã æ£åŒãªãªãŒã¹ãŸã§ã¯å°ãæ¥ããããŸãããä»ããæ¬¡ããŒãžã§ã³ã«ç®ãåããŠãããã¹ã ãŒãºãªç§»è¡ãããŠããããã§ããïŒ ä»åã®èšäºã¯ä»¥äžã«ãªããŸããããã§ã¯ïŒ www.wantedly.com
ã¹ããŒããã£ã³ãã®ãã¶ã€ããŒ/ãšã³ãžãã¢ã®haguriã§ãã åŒç€Ÿã§ã¯3æãããªã¢ãŒãã¯ãŒã¯ã«ç§»è¡ããŠããŸãã ã¹ããŒããã£ã³ãã§ã¯éçºããŒã ããã BOXIL ããŒã ããšã Biscuet ããŒã ãã®2ã€ãããŸãã 以åã®èšäºã§ã¯ããªã¢ãŒãã¯ãŒã¯äžã®éçºããŒã ã®æ§åããè¡ã£ãŠããã³ãã¥ãã±ãŒã·ã§ã³ã®å·¥å€«ãªã©ã玹ä»ããŸããã tech.smartcamp.co.jp ä»åã¯ã2ã¶æåŒ±ãªã¢ãŒãã¯ãŒã¯ãããããšã§èŠããŠãããBiscuetããŒã ãå
ã®èª²é¡ãšè§£æ±ºã«åããŠè©Šããæ¹æ³ã«ã€ããŠç޹ä»ããŸãã çºçãã課é¡ãèªèã®ãºã¬ã æ¹å1ïŒå
±éã§åŒã¹ãååãã€ãã æ¹å2ïŒå¿
é 確èªäºé
ããã€ã§ãèŠããããã«ãã æ¹å3ïŒã¢ã€ãã ããšã«UIãäœæããŠãUIã軞ã«è©±ãåã æ¹å4ïŒKPTãä»ç®ã®ããã«ãã ãèªèã®ãºã¬ããããžã¥ã¢ã«ã³ãã¥ãã±ãŒã·ã§ã³ã§æ¹å çºçãã課é¡ãèªèã®ãºã¬ã éåžžã§ã¯ããããããã¯ã«ã€ããŠè©±ãåããšãã¯åãã¹ããŒã¹ã§ãã¯ã€ãããŒãã«æžããããã¢ãã¿ãŒã«æ ããŠæå·®ãã§ç¢ºèªãããããŠããŸããã ãããããªã¢ãŒãã¯ãŒã¯ã«ãªã£ãŠããã¯Slackã Kibela ãéããããã¹ãã³ãã¥ãã±ãŒã·ã§ã³ãäžå¿ã«ãªããŸãã æž©åºŠæãäŒãããªãããšããåãæã«ãã£ãŠèªèãå€ãã£ãŠããããšã§ãèªèã®ãºã¬ããçããŠããŸããã ãã®èª²é¡ã解決ããããã«ããã¶ã€ã³ããŒã ã§å°å
¥ããŠããã³ã©ãã¬ãŒã·ã§ã³ããŒã«ãFigmaãã䜿çšããŠãããžã¥ã¢ã«ã³ãã¥ãã±ãŒã·ã§ã³ã«ããææçéã®ç²ŸåºŠã®åäžãå³ã£ãŠã¿ãŸããã æ¹å1ïŒå
±éã§åŒã¹ãååãã€ãã Biscuetã®éçºããŒã å
ã§ã¯ãããŸãŸã§ç»é¢å
ã®åé åã«ã€ããŠæç¢ºã«ååãæ±ºãŸã£ãŠããŸããã§ããã ãå·ŠåŽã®...ããçãäžã®ãã¹ããªãŒã®ãšããã®äžã®...ããšãã£ãèªèãé£ããäŒè©±ãããããšãå€ããªããŸããã ããã§ã以äžã®äŸã®ããã«ç»é¢å
ã®åé åã®ååãæç¢ºã«æ±ºããŸããã å®éã®ç»é¢ïŒèŠçŽ ãå€ããŠãäœã«ã€ããŠè©±ããŠãããåããã¥ããç¶æ
åãšãªã¢ã«ååãã€ããç¶æ
ãµãŒãã¹ãã€ããããã§ã¯ãåºæ¬çãªããšã§ãã ãã ããªã¢ãŒãã¯ãŒã¯ã§ç©ççãªè·é¢ãé¢ããŠãããããããå
±éã®ååãã€ããããšã¯å€§åã§ãã æ¹å2ïŒå¿
é 確èªäºé
ããã€ã§ãèŠããããã«ãã ãªã¢ãŒãã«ãªã£ãŠåºæ¥ãªããªã£ãããšãšããŠãã匵ãçŽã³ãã¥ãã±ãŒã·ã§ã³ãããããŸãã ããšããšBiscuetéçºããŒã ã§ã¯ãããã©ã³ãã³ã°æã«ç¢ºèªããããšãããªãªãŒã¹åã«ç¢ºèªããããšããšãã£ãå¿
ã確èªããé
ç®ãããã¯ã€ãããŒãã«æžããããå£ã«åŒµã£ããããŠç®èŠã§ç¢ºèªããã£ãŠããŸããã ã³ãã¥ãã±ãŒã·ã§ã³ããšãã¡ã€ã³ã®å ŽãZoomã«ãªã£ãããšã§ãå
±éã®å£ããã¯ã€ãããŒãããªããªãã匵ãçŽã䜿çšããã³ãã¥ãã±ãŒã·ã§ã³ãã§ããªããªããŸããã ããã§ãKibelaã®ãã³ãã¬ãŒãæ©èœãšFigmaã®åãèŸŒã¿æ©èœã䜿çšããŠããªã¢ãŒãã§ãããŒã å
ã§ç¢ºèªããããããã«ããŸããã æ¹å3ïŒã¢ã€ãã ããšã«UIãäœæããŠãUIã軞ã«è©±ãåã Biscuetã§ã¯éçºææ³ã«ã¹ã¯ã©ã ãæ¡çšããŠãããå®è£
ããæ©èœãæ¯é±è©±ãåã£ãŠããŸãã tech.smartcamp.co.jp å®å
šãªã¢ãŒãã«ç§»è¡ããããšã§ãæè¿ã§ã¯Zoomã䜿çšããããã«ãªãããã¯ã€ãããŒããçŽæ¥ç»é¢ãã¿ããªã§èŠãããšãåºæ¥ãªããªããŸããã ãããã¯ãã®å®éã®ç»é¢ãèŠãã« Kibelaäžã§å£é ã«ããèŠä»¶ã®è©±ãåããããã ãçµæãšããŠæ±ºãŸã£ãããšã ããkibelaã« ç°¡ç¥åããŠæžããŠããŸã ãããªããšãèµ·ããŠããŸã£ãŠããŸããã ããã«ãã£ãŠã宿ãããã®ã«ãããçããããäžå
·åãçºçãããããŠããŸãããšãå¢ããŠããŸããŸããã èãã解決çãšããŠãã¢ã€ãã ããšã«æ¯åUIãFigmaã§äœæããŠãUIã軞ã«è©±ãåãããã«ããŸããã å
šå¡ã§åãUIãèŠãŠã仿§ãèããæ±ºãŸã£ãããšã¯Figmaã®è£è¶³ãšããŠKibelaäžã«ããã¹ããšããŠèšè¿°ããããã«ããŸããã å¯èŠåããããšã§ã誰ãã¿ãŠãåãã€ã¡ãŒãžãå
±æããããšãã§ããããã«ãªããŸããã æ¹å4ïŒKPTãä»ç®ã®ããã«ãã ã¹ããªã³ãã®æ¯ãè¿ããšããŠKPTã宿œããŠããŸããKPTãFigmaã䜿çšããŠããŸãã ãªã³ã©ã€ã³äžã§ä»ç®ã®ãããªã³ãã¥ãã±ãŒã·ã§ã³ãã§ãããµãŒãã¹ã¯ããã€ãååšããŠããŸãã ä»åã¯ããšã³ãžãã¢ãã¿ããªFigmaã䜿çšããããžã¥ã¢ã«ã³ãã¥ãã±ãŒã·ã§ã³ãã§ããããã«ãç·Žç¿ã®ããã«Figmaã§å®æœããŸããã ãã®å
容ã«é¢ããŠã¯ãã¹ããŒããã£ã³ãã®ãã¶ã€ã³ããã°ã§ç޹ä»ããŠããã®ã§ãã芧ãã ããã note.com ãèªèã®ãºã¬ããããžã¥ã¢ã«ã³ãã¥ãã±ãŒã·ã§ã³ã§æ¹å ç©ççãªè·é¢ãé¢ããŠããç¶æ³ã§ã¯ã èªèã®ãºã¬ãèµ·ããããã ã§ãã ãã®ããã«ç»åãã€ã©ã¹ããå³åœ¢ã䜿çšããŠãèŠã人ã«ãã£ãŠèªèã®å·®ãããŸãã¥ããæ¹æ³ã«ããæ
å ±ã®äŒãæ¹ãæèããŠãããšè¯ãã§ãã ä»åŸã®ãªã¢ãŒãã¯ãŒã¯ãç¶ãããã§ããããã广çã§å¹ççãªã¢ãŠãããããããŒã ãšããŠã§ããããã«èãã課é¡ãäžæããã£ãããšã¯ãã®ããã°ã§ã玹ä»ããŠããããšæããŸãã ã¹ããŒããã£ã³ãã§ã¯ãã¶ã€ã³ããã°ãnoteã§éå¶ããŠããŸãã åãããã¯ãã«é¢ããæ³ãã ã£ããããã¶ã€ã³ã®å°è©±ãæžããŠããã®ã§ãèŠãŠããã ãããšããããã§ãã note.com ã©ã€ã¿ãŒïŒèæ é貎 / Haguri YukiïŒDesigner & EngineerïŒ
ããã«ã¡ã¯ïŒããªãŒã©ã³ã¹ãšã³ãžãã¢ãšããŠã¹ããŒããã£ã³ãã«åç»ããŠããè³å²¡ã§ãã åŒç€Ÿã®ãããã¯ãã§ããBiscuet( https://biscuet.jp/ )ã®éçºã«åæããåç»ããŠããŸããããµãŒãã¹ãäžã®äžã«å±éãããŠããéçšãããŒã ã倧ãããªã£ãŠããéçšãéè¿ã§èŠããšãŠãè峿·±ãæã£ãŠããŸãã ä»åã¯ããã®Biscuetã§äœ¿çšããŠããVue.jsã®ããã©ãŒãã³ã¹æ¹åãè¡ã£ãã®ã§ãããããã§æ°ã¥ããããã€ãã®ãã€ã³ããæŽçããŠãå±ãããŸãã Vue.jsã®ããã©ãŒãã³ã¹ 颿°åã³ã³ããŒãã³ã propsã¯ããªããžã§ã¯ãå
šäœãåããããã£ããšãïŒ ããããã£ããšã«æž¡ãæ¹æ³ ãªããžã§ã¯ããæž¡ãæ¹æ³ æ³šé æåŸã« Vue.jsã®ããã©ãŒãã³ã¹ Vue.jsã§ã¯ãç¶æ
倿Žã«ãã£ãŠãä»®æ³DOMãç¹°ãè¿ãåèšç®ïŒ updateRender )ããããããããã«ããããã©ãŒãã³ã¹ãæªããªãããšããããŸãã åèšç®ã«çŸmsãããã£ãŠããŸããšããã£ããããåäœãšãªããŠãŒã¶ã«ãå°è±¡ããããããŸããã ããã§ãåèšç®ã®åæ°ãã€ãŸãVue.jsã®ã©ã€ããµã€ã¯ã«ã§ãããšããã® update ã®åæ°ãæžãããŠæ¹åã詊ã¿ãŸãã ãã€ã³ãã¯ä»¥äžã®ïŒç¹ãšãªãã®ã§ãããã説æããŠãããŸãã 颿°åã³ã³ããŒãã³ã props ã¯ããªããžã§ã¯ãå
šäœãåããããã£ããšãïŒ é¢æ°åã³ã³ããŒãã³ã 颿°åã³ã³ããŒãã³ãã«ã€ããŠã®å
¬åŒãªè§£èª¬ã¯ããã¡ããã芧ãã ããã jp.vuejs.org éåžžã®ã³ã³ããŒãã³ããšé¢æ°åã³ã³ããŒãã³ããæ¯èŒãããããååã®ãã¿ã³ã³ã³ããŒãã³ãã䞊ã¹ãŸããã ãã®ãã¿ã³ã颿°åã³ã³ããŒãã³ãã«ããæã®è¡šç€ºæã®åŠçéåºŠãæ¯èŒããããšæããŸãã ãã¿ã³1000å çµæã¯ãã¡ã éåžžã®ã³ã³ããŒãã³ã 颿°åã³ã³ããŒãã³ã ã¯ãªãã¯ãããæç»ãããããã«ããã®ã§ãã¯ãªãã¯ã€ãã³ãã®æéãèŠãŠããŸãã éåžžã®ã³ã³ããŒãã³ãã 153ms ããã£ãŠããã®ãã颿°åã³ã³ããŒãã³ãã§ 71ms ã«ãªããŸããã çŽåå ã§ããã ãã¿ã³äžåãããã ãšã 82ÎŒs ã®ççž®ã§ãïŒ ãŸããÎŒsãäœæã§ããæ¹ã¯ããªããšæããŸãã...ã ã²ãšã€ã²ãšã€ã§ã¯å°ããªå·®ã§ããããã¿ã³ã ãã§ãªãã¢ã€ã³ã³ããã³ã³ããã®æ©èœãæã€ã³ã³ããŒãã³ããªã©ãåºæ¥ãã ãããããã®ã³ã³ããŒãã³ãã颿°åã³ã³ããŒãã³ããšããã°ã塵ãç©ããã°å±±ãšãªãããã©ãŒãã³ã¹ã¢ããã«ç¹ãã£ãŠãããŸãã æåŸã«ãããããã®ãã¿ã³ã³ã³ããŒãã³ãã®ã³ãŒãã§ãã ããŒãã«ãªã³ã³ããŒãã³ã < template > < button class = "btn" @click= "click" : style = "styles" > {{ label }} </ button > </ template > < script > export default { props: { label: String , color: String } , computed: { styles () { return { "background-color" : this .color } ; } } , methods: { click () { this .$emit ( "click" ) ; } } } ; </ script > < style scoped> .btn { width : 50px ; } </ style > 颿°åã³ã³ããŒãã³ã < template functional> < button class = "btn" : style = "$options.styles(props)" v-on= "listeners" > {{ props.label }} </ button > </ template > < script > export default { props: { label: String , color: String } , styles ( props ) { return { "background-color" : props.color } ; } } ; </ script > < style scoped> .btn { width : 50px ; } </ style > å·®åã¯ä»¥äžã§ãã template ã¿ã°ã«ã functional 屿§ãä»ããã props ã§æž¡ãããå€ã¯ã props.ããããã£å ã§åŒã³åºãã computed ã methods ã¯ãªããªããçŽæ¥é¢æ°ãå®çŸ©ããå¿
èŠãããããŸããå®çŸ©ãã颿°ã¯ $options.颿°å ã§åŒã³åºãã äžäœã³ã³ããŒãã³ãããäžäœã®ã³ã³ããŒãã³ããžã€ãã³ããäžããããã v-on="listeners" ãèšå®ããã ããã§ã¯ãäŸãšããŠæããããã props ã®æ°ãïŒã€ã§ããã props ã®æ°ãå€ãã»ãããåŠçæéã®å·®ã¯å€§ãããªããŸãã propsã¯ããªããžã§ã¯ãå
šäœãåããããã£ããšãïŒ èŠªããåã³ã³ããŒãã³ãã«ã props ãéããŠãå€ãæž¡ããšãã©ã®ããã«ããŠãŸããïŒ ãªããžã§ã¯ãã§æž¡ããŠãŸããããããšããªããžã§ã¯ãã®ããããã£ãåå¥ã«æž¡ããŠããŸããïŒ ããæ¹ã«ãã£ãŠã¯ update ã®åæ°ã«å€§ããå·®ãã§ãå ŽåããããŸãã 以äžã®ã³ãŒãã§ã¯ããã©ãŒãã³ã¹ã®å·®ã確èªããããã«300åã®ãã¿ã³ã䞊ã¹ãŠãŸãã ããããã£ããšã«æž¡ãæ¹æ³ 芪ã³ã³ããŒãã³ãã®ã³ãŒã < template > < div > < div > < p > < button @click= "changeProperty" > ããããã£å€æŽ </ button > | < button @click= "changeObjectRef" > åç
§å€æŽ </ button > </ p > < p > ãªããžã§ã¯ãïŒ{{ obj }} </ p > </ div > < normal-btn : label = "aObject.label" v- for = "i in list" :key= "`a-${i}`" /> < normal-btn : label = "bObject.label" v- for = "i in list" :key= "`b-${i}`" /> < normal-btn : label = "cObject.label" v- for = "i in list" :key= "`c-${i}`" /> </ div > </ template > < script > import NormalBtn from "@/components/NormalBtn" ; export default { components: { NormalBtn } , data () { return { list: [ ... Array (100) .keys () ] , obj: { a: { deep1: { deep2: 1 } } , b: 2 , c: 3 } } ; } , computed: { aObject () { return { label: this .obj.a.deep1.deep2.toString () } ; } , bObject () { return { label: this .obj.b.toString () } ; } , cObject () { return { label: this .obj.c.toString () } ; } } , methods: { changeProperty () { this .obj.a.deep1.deep2 = this .obj.a.deep1.deep2 + 1 ; } , changeObjectRef () { this .obj = Object .assign ( {} , this .obj ) ; } } } ; </ script > åã³ã³ããŒãã³ã(NormalBtn)ã®ã³ãŒã < template > < button class = "btn" @click= "click" : style = "styles" > {{ label }} </ button > </ template > < script > export default { props: { label: String , color: String } , computed: { styles () { return { "background-color" : this .color } ; } } , methods: { click () { this .$emit ( "click" ) ; } } } ; </ script > < style scoped> .btn { width : 50px ; } </ style > 芪åŽã§ãã²ãšã€ã®å€§å
ã®ãªããžã§ã¯ãïŒå€æ°åïŒ object ïŒããã computed ã§aObject, bObject, cObjectãšããæŽŸçãããªããžã§ã¯ããäœæããŠãŸãã ãã®æŽŸçãããªããžã§ã¯ãã®ããããã£ïŒ String )ãåã³ã³ããŒãã³ãã«æž¡ããŠããŸãã ããŠãããã§å€§å
ã®ãªããžã§ã¯ãïŒå€æ°åïŒ object ïŒã倿Žãããã©ã®ããã«ãªãã§ãããããåã³ã³ããŒãã³ã㯠update ãããŸããïŒ çãã¯ã props ã«æž¡ãããå€ã倿Žãããæã ãããã®åã³ã³ããŒãã³ãã update ãããŸããéã«ã props ã«å€æŽããªãåã³ã³ããŒãã³ã㯠update ãããŸããã 倿° object ã®åç
§ããŸãã£ãšå
¥ãæ¿ããŠããåãããããã£å€ã§ããã° update ãããŸãããïŒãªããããããã£å€ãåãã§ããåç
§ãå
¥ãæ¿ãã£ãå Žåã¯ã芪ã³ã³ããŒãã³ãã® computed ã¯åèšç®ãããã®ã§æ³šæããŠãã ããïŒ ãªããžã§ã¯ããæž¡ãæ¹æ³ 次ã«èŠªã³ã³ããŒãã³ãããåã³ã³ããŒãã³ãã«ãªããžã§ã¯ããæž¡ãå Žåã§ãã 芪ã³ã³ããŒãã³ãã®ã³ãŒã < template > < div > < div > < p > < button @click= "changeProperty" > ããããã£å€æŽ </ button > | < button @click= "changeObjectRef" > åç
§å€æŽ </ button > </ p > < p > ãªããžã§ã¯ãïŒ{{ obj }} </ p > </ div > < object -prop-btn : object = "aObject" v- for = "i in list" :key= "`a-${i}`" /> < object -prop-btn : object = "bObject" v- for = "i in list" :key= "`b-${i}`" /> < object -prop-btn : object = "cObject" v- for = "i in list" :key= "`c-${i}`" /> </ div > </ template > < script > import ObjectPropBtn from "@/components/ObjectPropBtn" ; export default { components: { ObjectPropBtn } , data () { return { list: [ ... Array (100) .keys () ] , obj: { a: { deep1: { deep2: 1 } } , b: 2 , c: 3 } } ; } , computed: { aObject () { return { label: this .obj.a.deep1.deep2.toString () } ; } , bObject () { return { label: this .obj.b.toString () } ; } , cObject () { return { label: this .obj.c.toString () } ; } } , methods: { changeProperty () { this .obj.a.deep1.deep2 = this .obj.a.deep1.deep2 + 1 ; } , changeObjectRef () { this .obj = Object .assign ( {} , this .obj ) ; } } } ; </ script > åã³ã³ããŒãã³ã( ObjectPropBtn.vue )ã®ã³ãŒã < template > < button class = "btn" @click= "click" : style = "styles" > {{ object.label }} </ button > </ template > < script > export default { props: { object : Object , color: String } , computed: { styles () { return { "background-color" : this .color } ; } } , methods: { click () { this .$emit ( "click" ) ; } } } ; </ script > < style scoped> .btn { width : 50px ; } </ style > å
ã«ç€ºãããããããã£ããšã«æž¡ãæ¹æ³ãã®ã³ãŒããšã»ãŒåãã§ãã éãã¯ãåã³ã³ããŒãã³ãã«æž¡ãå€ããªããžã§ã¯ãã®ããããã£ã§ãªãããªããžã§ã¯ãå
šäœãæž¡ããŠãããšãããåã³ã³ããŒãã³ãã§ã¯ãåãåã£ããªããžã§ã¯ãã®ããããã£ã䜿çšããŠãããšããã§ãã å床ãåã質åã§ããããã§å€§å
ã®ãªããžã§ã¯ãïŒå€æ°åïŒ object ïŒã倿Žããããã©ã®ããã«ãªãã§ãããããåã³ã³ããŒãã³ã㯠update ãããŸããïŒ çãã¯ãåã³ã³ããŒãã³ãã§äœ¿çšãããªããžã§ã¯ãã®ããããã£ã倿Žããããšããã®åã³ã³ããŒãã³ãã update ãããŸãã 䜿çšããããããã£ã®å€ãåããªããåã³ã³ããŒãã³ã㯠update ãããŸããã ãããããã£ããšã«æž¡ãæ¹æ³ããšã®éãã¯ã倿° object ã®åç
§ãå€ãã£ãå Žåã§ãã å
éšã®ããããã£ãå
šãŠåãã§ãã£ãŠãé¢é£ããåã³ã³ããŒãã³ããå
šãŠ update ãããŸãïŒ ãã®äŸã§ããã°ã 300åã®ãã¿ã³å
šãŠïŒå€ã倿ŽãããŠããªããã®ãå«ãïŒ ã« update ãèµ°ããŸãã æ³šé äžã§è¿°ã¹ãããã«ããªããžã§ã¯ããæž¡ãæ¹æ³ãã ãšäžèŠãª update ãè¡ãããå¯èœæ§ããããŸãã ã§ãããèšãããããšã¯ããªããžã§ã¯ããæž¡ããªããšããããšã§ã¯ãªãã å®éã®æ¡ä»¶ã¯è€éã§ããã®ãããªäºäŸãçŽãèŸŒã¿æãèŠã€ãã¥ãããšããããšã§ãã Biscuetã§ãããªããžã§ã¯ããåã³ã³ããŒãã³ããããã«ã¯å«ã³ã³ããŒãã³ãã«æž¡ããŠæäœããããéã« store ãéããŠããŒã¿ã倿ŽãããããŠããŸãã å
·äœçãªä¿®æ£ã®æ¹æ³ã¯æ§ã
ã ãšæããŸãïŒ object ã®åç
§ãå€ããªããããªããžãã¯ã«ããã颿°åã³ã³ããŒãã³ãçïŒã ã±ãŒã¹ãã€ã±ãŒã¹ã§ãå¿
èŠãªå¯Ÿçãåãã°å€§äžå€«ã ãšæããŸããããã®åã« update åæ°ãå€ããšãããèŠã€ããŸãããã 調æ»ã¯Vue.jsã®devtoolsã䜿ããŸãã ãã€ã³ããšããŠã¯ã以äžã®ç»åã®ããã«å€ãæ°ç®æå€ããã ããªã®ã« updated ãæ°ååãèµ°ã£ãŠãããšããã¯æªããã§ãã æåŸã« ãããžã§ã¯ãã®åæããäžèšã®ãããªäºé
ãæ°ã«ããªããèšèšããããšã¯é£ããå ŽåããããšæããŸãã äºåŸçã«ãããã£ãããã©ãŒãã³ã¹ã®æžå¿µãåºãŠããå Žåã§ãããŸãã¯ã³ã³ããŒãã³ãã®åè§£ããåãæãããŸãããã AtomicDesignãå°å
¥ããæ©èœãè€æ°æã£ã倧ããªã³ã³ããŒãã³ããå°ããåè§£ããŠããããšãè¿éããšæããŸãã ããã ãã§å
šãŠè§£æ±ºãšã¯èšããŸããããèŠéããè¯ããªãããšã§ãªã«ã調åãæªããšæãããšãã調æ»ãããããªãã¯ãã§ãã 以äžãé·æã«ãä»ãåãããã ãããããšãããããŸããïŒ
ããã«ã¡ã¯ãBOXILéçºããŒã ã®åŸ³ç°ã§ãã ã€ãã«(?)ç·æ¥äºæ
宣èšãçºä»€ããã瀟äŒå
šäœããã¿ãã¿ããŠããŸããçããå
æ°ã«ãã£ãŠããŸãã§ããããã ã¹ããŒããã£ã³ãã§ã¯3æ2æ¥ããæ°åã³ãããŠã€ã«ã¹ã®ææé²æ¢å¯ŸçãšããŠåšå®
å€åãè¡ããããã«ãªããçŸåšã§ã¯åååºç€ŸçŠæ¢ãšãªã£ãŠããŸãã ãããŸã§ã»ãšãã©ã®æ¥åæéã察é¢ã§éãããŠããŸããããå
šå¡ãåšå®
ã§ä»äºãããããã«ãªã£ãã®ã§ãä»åã¯ãã®æ§åããäŒãããããšæããŸãïŒ ãããŸã§ã®éçºäœå¶ BOXILéçºããŒã ã®æ§å åºå°Zooméšå± ãã¢ããã»ã¢ããã 鱿¬¡æ¯ãè¿ã (Retrospective) 鱿¬¡ææçºè¡š (Sprint Review) ããã¹ãã³ãã¥ãã±ãŒã·ã§ã³ BiscuetéçºããŒã ã®æ§å ãµãZooméšå± 鱿¬¡æ¯ãè¿ã (Retrospective) ããŸã: å
šç€Ÿçãªåã ãããŸã§ã®éçºäœå¶ ã¹ããŒããã£ã³ãã¯éçºããŒã ã2ã€ããããããã BOXIL ãš Biscuet ãéçºããŠããŸãã ã©ã¡ãã®ããŒã ãã¹ã¯ã©ã ãå°å
¥ããŠãããæ¯é±éææ¥ã«Sprint Review, Retrospective, Sprint Planningã宿œããéçºããã»ã¹ãåã£ãŠããŸãã éçºæã¯åäººäœæ¥ãšãã¢ããã»ã¢ããããèšæ©å¿å€ã«äœ¿ãåããŠãããå¿
èŠãããã°ã¢ãããçšã®éäŒæã«éãŸã£ãŠããããéçºãããŠããŸããã åšå®
å€åã«ãªãåã®ã¢ãããã®æ§å BOXILéçºããŒã ã®æ§å åºå°Zooméšå± åšå®
å€åã«ãªãæåã«ãã£ãããšã¯ãããŒã ã¡ã³ãã奜ããªã¿ã€ãã³ã°ã§åå ã§ããããŒãã£ã³ã°ã«ãŒã ãåºå°Zooméšå±ã ãäœãããšã§ããã éäžããããšãã¯æããŠäžäººã§ã³ãŒããæžããããè€éãªããžãã¯éšåã®èšèšããããšãã¯åºå°ã«éãŸã£ãŠãã£ã¹ã«ãã·ã§ã³ãããããšãã£ãåœ¢ã§æŽ»çšããŠããŸãã Slack Channelã®Topicæ¬ã«URLã眮ããŠãããåå ã§ããããã«ããŠããŸã ãã¢ããã»ã¢ããã BOXILã§ã¯ã¢ããããšãã¢ããã䜿ãåããŠãã ãäžäººã§ã¿ã¹ã¯ãããªããšããããã°ãè€æ°äººã§äžç·ã«èããããã³ãŒããæžãããããããšããããŸãã è€æ°äººã§ã³ãŒããè§Šããšãã¯åºå°Zoomã§éãŸã£ãŠè©±ãã€ã€ãVSCode Liveshareãç¹ãã§äžã€ã®ããã°ã©ã ãäœã£ãŠããŸãã (ããŸããã©ã€ãã»ããã²ãŒã¿ã®éçšããããªããªã£ãŠããã®ã§ã¢ãããã§ã¯ãªããªã£ãŠããŸããã...) github.com 鱿¬¡æ¯ãè¿ã (Retrospective) K -> P -> Tã®é çªã§è©±ã ãããŸã§ã¯ãã¯ã€ãããŒããšä»ç®ã䜿ã£ãŠé²è¡ããŠããã®ã§ããããã¶ã€ãã«ååããŠããã£ãŠFigmaããã¯ã€ãããŒã代ããã«äœ¿ã£ãŠã¿ãããšã«ã ããã倧æåã§ãåšå®
ã§ãåé¡ãªãããŒãã£ã³ã°ãè¡ãããšãã§ããŠããŸãð ð Tryãèããåã«ããããã話ããã話é¡ã®ä»ç®ã«ãæ£ãã®æåãæžããŠã話ãTopicãæ±ºããŠããŸãããããã vote ããã ðããŒã¯ãçšæããŠãããŠä»£çšã§ããŠããŸããããããšãïŒ é±æ¬¡ææçºè¡š (Sprint Review) æŠèŠã¯Kibelaã§äºåã«èšè¿°ããããç»é¢å
±æããªããé²ããŠãããŸã Sprint ReviewãZoomã䜿ã£ãŠãã£ãŠããŸãã äºåã«Kibelaã§å®æœããå
容ãçšæããŠããããããããšã«é²è¡ããŠããªãªãŒã¹ããæ©èœã«ã€ããŠã¯éœåºŠãã¢ãããŠããæµãã§ã éœåºŠãã£ããã§æ¥ã質åã«åçãããããã¢äžã§ãªãéçºã¡ã³ãããè£è¶³èª¬æãããããšãèšæ©å¿å€ã«åããŠããŸãã ç©ççã«PCãå
±æããããšããã®ã¯ã§ããªããªã£ãã®ã§ãããç»é¢å
±æã掻çšããããšã§ä»ã®ãšããã¯åé¡ãªãé²ããããŠããŸãã ãªã¢ãŒãã§æ°æ¥œã«åå ã§ãããããåå 人æ°ãå€ã(ãããã) ããã¹ãã³ãã¥ãã±ãŒã·ã§ã³ ä»äœã®äœæ¥ããã£ãŠããã®ãã鲿ãã©ãããçžè«ãããããšããªããããšãã£ãããšãåãããããã«ãããªã£ããããSlackã§ãä»äœãããŠãããããããåãããããã«ãªããŸããã ãã§ããæãã®ãšã ãããã§èª¿åãæªããšãã®ã¢ã©ãŒããç¶æ³ãã€ããããããªããäžç·ã«äœæ¥ããããŒãšããæµãã§åºå°Zoomã«éãŸã£ãããšãã£ãåããã§ããããã«ãªããŸããã ãã以å€ã«ãKibelaã«ããã¥ã¡ã³ããæžãæåãæ ¹ä»ããŠããŠãåšå®
ãã©ããã«é¢ãããä»åŸã«äžæãæ®ããŠããããšè¯ããªãšæã£ãŠããŸãã BiscuetéçºããŒã ã®æ§å ãµãZooméšå± BiscuetéçºããŒã ã§ãäžè¿°ãããããªåºå°Zooméšå±ã®åãçµã¿ãè¡ã£ãŠããããªã¢ãŒãã§ã³ãã¥ãã±ãŒã·ã§ã³ãå°ãªããªããã¡ãªé¢ãè£ããŠãããšæã£ãŠããŸãã äžæ¹ã§ããããã¡ã³ããŒãå®è£
ããã¿ã¹ã¯ã«äžæç¹ãããã®ã§ã¬ãããªçžè«ããããã§ãã£ãããããã®ã¿ã¹ã¯ã¯èª°ããšã¢ãã§é²ããããã®ãããªãšãã«ããã®ãŸãŸé·æéå æããŠããŸãåé¡ããããŸããã ã¿ã¹ã¯ã話ãåã£ãŠããã¡ã³ããŒããããªãã§å²ã蟌ãã®ã¯ãªããªãå¿ççãªéå£ãé«ããããå¥ã®Zooméšå±ãçšæããŠããããããã£ãç¶æ³ãçºçããéã¯ãã¡ãã®éšå±ã«ç§»åãããããªéçšã«ããŠããŸãã Slackã®éçºãã£ã³ãã«ã®Topicã«èšå®ããŠæè»œã«ç§»ååºæ¥ãããã«ããŠããŸã 鱿¬¡æ¯ãè¿ã (Retrospective) BOXILããŒã ã§ã¯äžè¿°ããããã«Figmaã§æ¯ãè¿ããè¡ã£ãŠããŸããããBiscuetéçºããŒã ã§ã¯Asanaã䜿ã£ãŠKPTãè¡ã£ãŠããŸãã Asanaäžã®KPTãããžã§ã¯ã å
·äœçã«ã¯ç»åã®ããã«Asanaäžã«ãããžã§ã¯ããäœæããŠãããKPTããšã«ã»ã¯ã·ã§ã³ãåå²ãããã«KPTã®ãªãã«ã¡ã³ããŒããšã®ã¿ã¹ã¯ãäœæããŠãµãã¿ã¹ã¯ãšããŠã¡ã³ããŒãæãããããã®KPTãæžããŠãã£ãŠããŸãã æåã®æºåãããé¢åã§ãããäžåºŠãã£ãŠããŸãã°ãããžã§ã¯ãã®è€è£œæ©èœã䜿çšåºæ¥ããã以éã¯ã¹ã ãŒãºã«æºååºæ¥ãããã«ãªããŸãã 以äžãã¹ããŒããã£ã³ãéçºããŒã ã®åšå®
å€åã®æ§åã§ããïŒ ä»ã®ãšãã(ãŸã äžã¶æã§ãã)倧ããªåé¡ã¯åºãŠããããäœãšããããŠãããšããæãã§ãã ãªã¢ãŒãã¯æ
£ããªããã¡ããæŽåãæŽã£ãŠããªããã¡ã¯ã©ãããŠãäœèª¿ã厩ãããããªããŸãã瀟äŒå
šäœã®äžå®æãªã©ãããã®ã§æ°æã¡ãæ²ã¿ããããªãããšæããŸãã çãããç¡çãããå
æ°ã«åšå®
å€åããã£ãŠãããŸãããïŒ ãã®èšäºãåèã«ãªãã°å¹žãã§ãã ããŸã: å
šç€Ÿçãªåã å
¥ç€ŸåŒãããã¯ãªããæäŒã飲ã¿äŒãéæäŒãªã©ããªã¢ãŒãã§å®æœãããŸããã ãã¶ããæ°å
¥ç€Ÿå¡ã®æè¿äŒããªã¢ãŒãã§ããã¿ããã§ãððº Zoomã®ãã¬ã€ã¯ã¢ãŠãã«ãŒã æ©èœã掻çšããŠè²ã
楜ããã§ããŸããé¢çœãæ©èœãªã®ã§æ¯é䜿ã£ãŠã¿ãŠãã ãã ð
ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãããŠããç§å·ã§ãïŒ 2æã«è²äŒãååŸãã3æã«åŸ©åž°ãããšæã£ããã³ããã§ãªã¢ãŒãã¯ãŒã¯ããããŠããŒã ç°åãšãªããªãèœã¡çããªã仿¥ãã®ããã ã¿ãªããããããéããã§ããããïŒ ä»åå®¶ã«ããæéãå€ããªãããã£ããã ããæ°ããããšãããããªãŒãšããããšã§ã以åããæ°ã«ãªã£ãŠãã Svelte ãè§Šãããšã«ããŸããïŒ Svelteã®ç޹ä»èšäºã§ã¯ããVue.jsãšæ§æã䌌ãŠããããç¿çãç°¡åããVue.jsã®50åæ©ããã¿ãããªãšããã«ãã©ãŒã«ã¹ãããããšãå€ãããªãšæããŸãããæ¬èšäºã§ã¯ Svelteã®Tutorialããããªãã§ããã¬ãŒã ã¯ãŒã¯(ã©ã€ãã©ãª)ã®æ©èœãšããŠæ®æ®µVue.jsãå©çšããŠããç§ãããããããªãŒãšæã£ããã® ãã玹ä»ããããšæããŸãã Svelteãšã¯ åºæ¬ææ³ ç¹åŸŽçãªæ©èœ propsãclassã®çç¥èšæ³ Await Block Reactive Statement (watchçžåœ) Event fowarding (emitçžåœ) Lifecycle Event Store Writable, Readable Derived (Gettersçžåœ) Custom (Actionsçžåœ) Transition ãã©ã¡ãŒã¿ Custom Transition ç¹æ®ãªã¿ã° svelte:head, svelte:body, svelte:window svelte:component Module Context Debugging ãŸãšã Svelte ãšã¯ Svelteãšã¯ãReactãVue.jsã®ãããªãã¬ãŒã ã¯ãŒã¯ãšåæ§ã«SPAã«ä»£è¡šãããã€ã³ã¿ã©ã¯ãã£ããªUI/UXãç°¡åã«æ§ç¯ããããã«ãã³ã³ããŒãã³ãæåããªã¢ã¯ãã£ãã·ã¹ãã ãªã©ãåããããŒã«ã§ãã 倧ããªéãã¯ãReactãVue.jsããã¬ãŒã ã¯ãŒã¯ãšããŠãã©ãŠã¶ã§åäœããéã«æ©èœããã®ã«å¯Ÿãã Svelteã¯ã³ã³ãã€ã©ã§ããããã«ãæã«çæ³çãªçŽ ã®JavaScriptã«å€æããŸã ã ãã®ãããã¬ãŒã ã¯ãŒã¯ã®ãªãŒããŒããããã»ãŒãªããªããäœååãšããé«éåã«æåããŠãããšã®ããšã§ãã åŸçºã§ããããã æ©èœèªäœã«ãç¹åŸŽããã æ¬èšäºã§ã¯ãã¡ãã«ãã©ãŒã«ã¹ããŠç޹ä»ããŠãããŸãã â» Svelteã®å
¬åŒãµã€ãã¯ã³ã³ãã³ããå€ããã€ã³ã¿ã©ã¯ãã£ããªãã¥ãŒããªã¢ã«ããµã³ãã«ãæŽåãããŠããŠãšãŠããããæãã®ã§ãæéã®ããæ¹ã¯ãã²èŠãŠã¿ãŠãã ããïŒ svelte.dev åºæ¬ææ³ Vue.jsã䜿ãããŠãæ¹ã§ããã°ã以äžã®ãµã³ãã«ã§ããçšåºŠSvelteã®ææ³ãåºç€æ©èœã¯ææ¡ã§ããã®ã§ã¯ãªãã§ããããã App.svelte < script > import SampleComponent from './SampleComponent.svelte' ; let count = 1 ; // dataçžåœ $: doubled = count * 2 ; // computedçžåœ $: quadrupled = doubled * 2 ; function handleClick () { // methodsçžåœ count += 1 ; } </ script > < button on:click= {handleClick} > < SampleComponent count= {count} /> </ button > < p > {count} * 2 = {doubled} </ p > {#if doubled > 0} // v-ifçžåœ < p > {doubled} * 2 = {quadrupled} </ p > {/if} SampleComponent.svelte < style > // ããã©ã«ãã§scopedã«ãªã£ãŠãã p { color : purple ; font-family : 'Comic Sans MS' , cursive ; font-size : 2em ; } </ style > < script > export let count = 0 ; // propsçžåœ </ script > < p > Count: {count} </ p > åºæ¬çã«ã¯ scriptã¿ã°ã styleã¿ã°ããã®ä»(templateçžåœ)ãšãã£ãæ§æ ã«ãªã£ãŠããŸãã (styleã¿ã°ã¯ããã©ã«ãã§scopedã«ãªã£ãŠããããã§ã) Vue.jsã§ãããšããã® data ãscriptã¿ã°å
ã® let ã§ã®å€æ°å®çŸ© ã«ãªã£ãŠããã methods ã¯åçŽãªé¢æ°å®çŸ©(function) ãšãªã£ãŠããŸãã ä»ã®ã³ã³ããŒãã³ããåŒã³åºãéã¯ã€ã³ããŒãããã ãã§å©çšã§ãã export let ã§å®çŸ©ããã props çžåœã«å€ãåãæž¡ã ããšãã§ããŸãã (propsã®typeãvalidatorã¯ãŸã ãªãããã§ãã) å°ãèŠæ
£ããªãèšæ³ã§ãããšã computed 㯠$: computedå = åŒ ã®ããã«èšè¿° ããŸãã ãŸã v-if ã v-for çžåœã®å¶åŸ¡æ§æã {# if } ã {#each cats as { id, name }, i} ã®ãããªèšæ³ã«ãªã£ãŠããŸãã ãã®ä»ã«ã Lifecycle Event ã Slot ãšãã£ãã³ã³ããŒãã³ãã®åºæ¬æ©èœã¯ãµããŒããããŠããŸãã ç¹åŸŽçãªæ©èœ ããããVue.jsã«ã¯ååšããªãæ©èœãã䜿ãåæãåäžããŠããæ©èœãªã©ç޹ä»ããŠãããŸãïŒ propsãclassã®çç¥è𿳠以äžã®ããã«å€æ°(data)åãšpropåãclassåãåäžã ã£ãå Žåãçç¥èšæ³ãçšæãããŠããŸãã å°å³ã«äŸ¿å©ã§ããïŒ < SampleComponent count= {count} class :big= {big} /> < SampleComponent {count} class :big /> Await Block Vue.jsã«éããéåæåŠçã«ããããŒãã£ã³ã°ãªã©ã¯ãå®è£
ãç
©éã«ãªãã€ã¡ãŒãžããããŸãã Svelteã§ã¯Promiseã®ç¶æ
ã«ããUIã®å€æŽãçŽã«ãã³ãã¬ãŒãå
ã«èšè¿°ããããšãã§ããŸãã ããã«ãããã·ã³ãã«ã«ããŒãã£ã³ã°ããšã©ãŒæã®è¡šç€ºå€æŽãªã©ãå®è£
ã§ããããã«ãªã£ãŠããŸãã < script > let promise = getWaitFunction () ; async function getWaitFunction () { const res = await fetch ( `hoge` ) ; const text = await res.text () ; if ( res.ok ) { return text; } else { throw new Error ( text ) ; } } function handleClick () { promise = getRandomNumber () ; } </ script > < button on:click= {handleClick} > Wait Button </ button > {#await promise} < p > ...waiting </ p > {:then result} < p > Result is {result} </ p > {:catch error} < p style = "color: red" > {error.message} </ p > {/await} Reactive Statement (watchçžåœ) ããã¯ããããVue.jsã® watch ã«è¿ãæ©èœã ãšæããŸãã computed ãšäŒŒãèšæ³ã§ $: ããã㯠ãšããããšã§ã ãã®ãããã¯å
ã§äœ¿ãããŠãã倿°(data)ã倿Žãããéã«ããã®ãããã¯ãåè©äŸ¡ããã ããã§ãã 䜿ãåæè¯ããããªåé¢ãå人çã«ã¯ watch ãšæ¯ã¹ãŠå®£èšçã§ãªãããè¥å¹²æããªãšãæã£ãŠããŸãã < script > let count = 0 ; // countã®å€æŽã§çºç« $: if ( count >= 10) { alert ( `count is dangerously high!` ) ; count = 9 ; } // countã®å€æŽã§çºç« $: { console.log ( count ) } function handleClick () { count += 1 ; } </ script > < button on:click= {handleClick} > Clicked {count} {count === 1 ? 'time' : 'times'} </ button > Event fowarding (emitçžåœ) Svelteã§ã¯åã³ã³ããŒãã³ããã芪ã³ã³ããŒãã³ããžã®ã€ãã³ãæ³¢åã¯ã createEventDispatcher ã䜿ããŸãã ç¹åŸŽçãªã®ã¯ã倿®µã®ã³ã³ããŒãã³ãåŒã³åºãã§ãã Vue.jsã§ã¯æ«ç«¯ã³ã³ããŒãã³ãã§çºçããã€ãã³ããæäžäœã®ã³ã³ããŒãã³ãã§äœ¿ãããå Žåãéã®ã³ã³ããŒãã³ãã§handlingãšemitãç¹°ãè¿ãå¿
èŠããããŸãã Svelteã§ã¯ä»¥äžã®ããã« äžç¶ã³ã³ããŒãã³ãã§ on:ã€ãã³ãå ã®ããã«èšè¿°ããã ãã§ã芪ã«ã€ãã³ããåãæµããŠãããããã«ãªã£ãŠããŸã ã ãŸãDOMã€ãã³ãon:clickãªã©ãåæ§ã«ã§ãããããªã®ã§ãVue.jsã®nativeã®ãããªåœ¹å²ãããããã§ãã End.svelte < script > import { createEventDispatcher } from 'svelte' ; const dispatch = createEventDispatcher () ; function sayHello () { dispatch ( 'message' , { text: 'Hello!' } ) ; } </ script > Middle.svelte < script > import End from './End.svelte' ; </ script > <!-- 芪ã³ã³ããŒãã³ãã«ã€ãã³ããæ³¢å --> < End on:message/> Lifecycle Event Lifecycle Event㯠onMound ã onDestroy ã beforeUpdate ã afterUpdate ãšç¹ã«Vue.jsãšãå€ãããªãã§ãã ããã以äžã®ãã㪠ã³ã³ããŒãã³ãå€ã§ãLifecycle Eventã䜿ãã ã®ã¯ç¹åŸŽçããªãšæããŸãã ããã«ãã ã³ã³ããŒãã³ãåŽã®è²¬åãæžããã©ã€ãã©ãªå
ã§å®çµããŠçµäºåŠçãŸã§å®è£
ããããšãã§ããŸã ã util.js import { onDestroy } from 'svelte' ; export function onInterval(callback, milliseconds) { const interval = setInterval(callback, milliseconds); onDestroy(() => { clearInterval(interval); } ); } App.svelte < script > import { onInterval } from './utils.js' ; let seconds = 0 ; onInterval (() => seconds += 1 , 1000) ; // ãã®ã³ã³ããŒãã³ããç Žæ£ããããšclearIntervalããã </ script > Store Vue.jsã§ã¯ã³ã³ããŒãã³ãéã§ã®ç¶æ
管çã¯vuexãããã¡ã¯ãã¹ã¿ã³ããŒãã ãšæããŸãããSvelteã§ã¯æšæºã§Storeã®å®è£
ãååšããŸãã Writable, Readable Storeå®çŸ©èªäœã¯ãšãŠãã·ã³ãã«ã§ã以äžã®ããã«ãªããŸãã stores.js import { writable, readable } from 'svelte/store' ; export const count = writable(0); // subscribe, set, update export const immutableCount = readable(0, function start(set) { // åç
§ã®ã¿ // ãã®äžã§ã®ã¿å€ãæŽæ°ã§ãã // e.g. 宿åŠçãªã© } ); Storeã®åç
§æ¹æ³ã¯SubscribeãšAuto subscriptionããããŸãã Subscribeã¯ä»¥äžã®ããã«Storeã®å€ã倿Žãããããšãæ€ç¥ããæ¹æ³ã§ãã ãã¡ãã®å Žåãåæã«computedã®ãããªããšããUnsubscribe(æ€ç¥ãããªããã)ãã§ããã®ãç¹åŸŽã§ãã < script > import { count } from './stores.js' ; let count_value; const unsubscribe = count.subscribe ( value => { count_value = value; } ) ; </ script > < p > {count_value} </ p > äžæ¹ã®Auto subscriptionã¯åçŽã«Storeã®å€ãååŸãããå Žåã«äœ¿ããçç¥èšæ³ãšãªããŸãã < script > import { count } from './stores.js' ; </ script > <!-- $Storeã®å€å --> < p > {$count} </ p > Derived (Gettersçžåœ) WritableãReadableã®å€ã䜿ã£ãŠãå¥ã®å€ãçæããæ©èœã§ãã stores.js import { derived, writable } from 'svelte/store' ; export const number = writable(0) export const double = derived( number, $number => $number * 2 ); Custom (Actionsçžåœ) StoreãæŽæ°ãã颿°ãå®çŸ©ããããšãã§ããŸãã stores.js import { writable } from 'svelte/store' ; function createCount() { const { subscribe, set, update } = writable(0); return { subscribe, increment: () => update(n => n + 1), decrement: () => update(n => n - 1), reset: () => set(0) } ; } export const count = createCount(); Transition Vue.jsã§ãTransitionã¯ãµããŒããããŠããŸããã Svelteã§ã¯ãã§ã«å®çŸ©æžã¿ã®Transitionãå€ãååšãããããæè»œã«å®è£
ããããšãã§ããŸã ã æãã·ã³ãã«ãªäŸã¯ä»¥äžã®ããã«ãªããŸãã svelte/transition ã«ã¯çŸåšfadeãblurãslideãdrawãscaleãflyãcrossfadeãå®çŸ©ãããŠããã ã¿ã°ã«transitionãã£ã¬ã¯ãã£ããæå®ããã ã ã§è¡šç€ºã»éè¡šç€ºåæ¿æã«Transitionãã€ããããšãã§ããŸãã ãŸãinãoutãšãããã£ã¬ã¯ãã£ããèšå®ããããšã§ã衚瀺ã»é衚瀺ããããã§Transitionãèšå®ããããšãã§ããŸãã < script > import { fade, scale } from 'svelte/transition' ; let visible = true ; </ script > < label > < input type = "checkbox" bind: checked = {visible} > visible </ label > {#if visible} < p transition:fade> Fades in and out </ p > < p in:fade out:scale> Fades in and Scale out </ p > {/if} ãã©ã¡ãŒã¿ Svelteã§å®çŸ©ãããTransitionã«ã¯ãã©ã¡ãŒã¿ãæž¡ããããã«ãªã£ãŠãããããã«ãã£ãŠDurationãªã©ãã«ã¹ã¿ãã€ãºããããšã«ãªããŸãã äŸãã°flyã§ããã°ãdelayãdurationãeasingãxãyãopacityãæå®ã§ããããã§ãã < script > import { fly } from 'svelte/transition' ; let visible = true ; </ script > < label > < input type = "checkbox" bind: checked = {visible} > visible </ label > {#if visible} <!-- 2ç§ãããŠy軞ã«200pxç§»å --> < p transition:fly= "{{ y: 200, duration: 2000 }}" > Flies in and out </ p > {/if} Custom Transition Transitionãèªç±ã«å®çŸ©ããæ¹æ³ã¯Custom CSS transitionsãCustom JS transitionsã®2ã€ãããŸãã ããã«é¢ããŠã¯Vue.jsã§ãSvelteã§ãæ³¥èãã¯ãªã£ãŠããŸãå°è±¡ã§ãããSvelteã§ã¯ svelte/easing ã«Easingã®é¢æ°ãå®çŸ©ããŠãã£ãããšãµããŒããåãããªãšæããŸãã CSSTransition.svelte < script > import { elasticOut } from 'svelte/easing' ; let visible = true ; function spin ( node, { duration } ) { return { duration, css: t => { const eased = elasticOut ( t ) ; return ` transform: scale( ${eased} ) rotate( ${eased * 1080} deg); color: hsl( ${~~(t * 360)} , ${Math.min(100, 1000 - 1000 * t)} %, ${Math.min(50, 500 - 500 * t)} % );` } } ; } </ script > ç¹æ®ãªã¿ã° svelte:head, svelte:body, svelte:window Nuxt.jsã§ã¯ head ããããã£ãã³ã³ããŒãã³ãã«èšå®ããããšã§ããããŒã«èŠçŽ ãèšå®ããããšãã§ããŸãããSvelteã§ã¯ä»¥äžã®ããã«ç¹æ®ã¿ã°ãå©çšããããšã§åã蟌ãããšãã§ããŸãã ãŸã bodyãwindowã«å¯ŸããŠã€ãã³ãèšå®ãå€ã®bindãèšå®ã§ãã ã®ã¯ãããããã§ããã < svelte :head> < link rel = "stylesheet" href = "hoge.css" > </ svelte :heaad> < svelte :body on:mouseenter= {handleMouseenter} on:mouseleave= {handleMouseleave} /> < svelte :window on:keydown= {handleKeydown}/ > < svelte :window bind:scrollY= {y}/ > svelte:component Vue.jsã§ã¯æ¡ä»¶ã«å¿ããŠè¡šç€ºããã³ã³ããŒãã³ããå€ããå Žåããã³ãã¬ãŒãå
ã§ v-if ã䜿ã£ãŠããããªãšæããŸãã Svelteã§ã¯ {#if } ã§åãæ¿ããæ¹æ³ã®ä»ã«ã以äžã®ããã«èšè¿°ããããšãã§ããŸãã ããããããšã§ã ã³ã³ããŒãã³ãåãæ¿ãã®ããžãã¯ãscriptã«å¯ãããããããããæè»ã«æ¡ä»¶ãªã©èšè¿°ã§ãã ããã«ãªããŸãã < script > import Yes from './Yes.svelte' ; import No from './No.svelte' ; let isChecked; $: selected = isChecked ? Yes : No; </ script > < input type = "checkbox" bind: checked = {isChecked}/ > < svelte :component this= {selected}/ > Module Context scriptãšã¯å¥ã« <script context="module"> ãå®çŸ©ããããšã§ãæåã«äžåã ãè©äŸ¡ãããããã¹ãŠã®åäžã³ã³ããŒãã³ãã§å
±éã®ããŒã¿ãã¡ãœãããå®çŸ©ããããšãã§ããŸãã (ã·ã³ã°ã«ãã³ãéçã¯ã©ã¹ã®ãããªã€ã¡ãŒãžã§ããããïŒ) ãããŸã§éå®çãªçšéãæ³å®ããŠãããmoduleã§å®£èšãã倿°ã¯ãªã¢ã¯ãã£ãã§ã¯ãªããscriptã§å€æŽããŠãåã¬ã³ããªã³ã°ã¯ãããªãã®ã§æ³šæãå¿
èŠããã§ãã (䜿ãã¿ã¡ãé£ããã§ãã...) App.svelte < script > import Component1, { alertTotal } from './Component1.svelte' </ script > < Component1 /> < button on:click= {alertTotal} > alert </ button > Component1.svelte < script context= "module" > let totalCount = 0 ; export function alertTotal () { alert ( totalCount ) ; } </ script > < script > function handleClick () { totalCount += 1 ; } </ script > < button on:click= {handleClick} > countup </ button > <!-- 以äžã¯ 0 ã®ãŸãŸå€ãããªã... --> < p > {totalComponents} </ p > Debugging ãããã°çšã®ãããã¯ãçµã¿èŸŒãŸããŠããŸãã {@debug 倿°å} ã®ããã«èšè¿°ãããšãæå®ãã倿°ãå€åããå Žåã«consoleã«åºåããŠãããããã§ãã {@debug} ãšãããšãdebuggerãåã蟌ãŸããã¿ããã§ããã < script > let user = { firstname: 'Ada' , lastname: 'Lovelace' } ; </ script > < input bind: value = {user.firstname} > < input bind: value = {user.lastname} > {@debug user} {@debug} ãŸãšã ä»åVue.jsãŠãŒã¶ãŒã§ããç§ããSvelteã®æ©èœã«ãã©ãŒã«ã¹ããŠãããããã玹ä»ãããŠããããŸããã åŸçºãšããããšã§ Vue.jsãReactã§ã®ç
©ããããè§£æ¶ããæ©èœã ã£ãããNuxtãvuexãšãã£ããšã³ã·ã¹ãã ã§ãµããŒããããŠããæ©èœãæšæºã§çµã¿èŸŒãŸããŠãããã·ã³ãã«ã«å©çšã§ããããŒã« ã ãªãšæããŸããã ãŸã ãšã³ã·ã¹ãã ãæªæçã ã£ããTypeScriptæªå¯Ÿå¿ã ã£ãããèŠå ã§åœå
ã§ã®æ¡çšäºäŸã¯å°ãªãã§ããããã®ãããã® æŽåãé²ããšççºçã«æµè¡ãå¯èœæ§ ã¯ãããªãšæããŠããŸãã åŒç€Ÿã§ã¯ä»ãããã³ããšã³ããããæ©ãããé«ã質(UI/UX)ã§å®çŸã§ããæ¹æ³ã暡玢ããŠããŸãã Svelteããã®äžã€ãããããªããšèããŠããŸãã ãããèªãã§ããã ããæ¹ã§ãããããã³ããšã³ãã®æ¹ä¿®ãæè¡æšé²ã«èå³ããããŸãããããã²ãé£çµ¡ããã ããã°ãšæããŸãïŒ ããããšãããããŸããïŒ
ã¹ããŒããã£ã³ãã®ç¬¹åã§ãã ã¿ãªããã¯Webãµã€ãã®ãç¹ã«ããã³ãã®ããã©ãŒãã³ã¹æ¹åãæ¥é ããè¡ã£ãŠããŸããïŒ åžžã«æèããŠãããšããæ¹ãããã°ãæ°ãåãããšãã«ããŸã«èŠãŠã¿ããªããŠããšãããããããªãããšæããŸãã ä»åã¯ãããªããã©ãŒãã³ã¹ã«åžžã«æèãé
ããããã«ãæ¯æ¥Lighthouseãå©ããŠã¿ãã®ã§ãã®æ§æã玹ä»ããããšæããŸãã Lighthouseãšã¯ èŠä»¶ åŠçã®æµããšå¶çŽ å®éã®æ§æ 1. 宿çã«Cloud Tasksã«åããŒãžããšã®TaskãEnqueueãã TaskãEnqueueãããCloud Tasksã®ãã¥ãŒäœæ TaskãEnqueueããFunctionã®äœæ 2. åããŒãžã«Lighthouseãå®è¡ãBiqQueryã«çµæãæ ŒçŽãã çµããã« Lighthouse ãšã¯ ãŸãã¯Lighthouseã«ã€ããŠç°¡åãªèª¬æã§ãã Lighthouseãšã¯Webãµã€ãã®ããã©ãŒãã³ã¹ãå質ãèšæž¬ããããŒã«ã§ãã³ãã³ãã©ã€ã³ããŒã«ãããã¯Chromeã®æ¡åŒµæ©èœãšããŠæäŸãããŠããŸãã Webãµã€ãã®URLãæå®ããããšã§ãPerformance, Accessibility, Best Practices, SEOã®5ã€ã®èгç¹ãããããã100ç¹æºç¹ãšããŠæ¡ç¹ãããã¬ããŒããçæããããšãã§ããŸãã æè¿ã§ã¯ã Lighthouse CI ãšãããLighthouseãCIå®è¡ã®ã¿ã€ãã³ã°ã§ããªã¬ãŒãããããšãåºæ¥ãããŒã«ãåºãŠããŠããŸãã ãã¡ãã«ã€ããŠã¯ãåŒç€Ÿã®äžå·ã詊ããŠã¿ãèšäºãããã®ã§ããã¡ããã芧ã«ãªã£ãŠãã ããã tech.smartcamp.co.jp èŠä»¶ ä»åã¯ä»¥äžã®èŠä»¶ã§Lighthouseã宿å®è¡ããŠããŸãã æ¬çªç°å¢ã察象ã«ããŠå®è¡ããã 察象ãšãªãããŒãžã¯æ¬çªç°å¢ã®ããŒã¿ã«å€æŽã«è¿œéããŠå€ããã é£åå«ãæç³»åçã«äžŠã¹ãŠå€åãæãããã®ã§ãæ¥æ¬¡ã§å®è¡ããçµæãBigQueryã«ä¿åããã ãããã£ãèŠä»¶ããã£ããããLighthouse CIãªããŠãããããã«ã宿çã«å®è¡ããã®ã«åããŠããããªããŒã«ãç»å ŽããŠããäžãä»åã¯Lighthouse CIãçšããŸããã§ããã ãã¡ãããLighthouse CIã§ãèšå®ã倿Žããããšã§äžèšã®èŠä»¶ãå¶ããããå¯èœæ§ããããŸããããåºæ¬çã«ã¯CIç°å¢äžã§commitã察象ã«ããŠæ€èšŒããããšãåŸæããã«æãããã®ã§ãå©çšããã®ã¯èŠéããŸããã åŠçã®æµããšå¶çŽ å€§ãŸããªåŠçã®æµãã¯ä»¥äžã®ããã«ãªããŸãã BigQueryã®ããŒã¿ãå
ã«å¯Ÿè±¡ãšãªãããŒãžãæœåºãã 察象ãšãªãããŒãžããšã«ä»¥äžã®åŠçãå®è¡ãã Lighthouseã®å®è¡ BigQueryã«å®è¡çµæãä¿åãã 2-aã«ã€ããŠã¯å®éã«æ¬çªç°å¢ãå©ãã®ã§ããã®é »åºŠã¯çšŒåã«åé¡ãªãç¶æ
ã«ããå¿
èŠããããŸãã ãšã¯ããã1ããŒãžããã10~30ç§çšåºŠèšæž¬ã«ãããã®ã§ããã¹ãŠã®ããŒãžãçŽåã§è¡ã£ãŠãããšããŒãžæ°ã«ãã£ãŠã¯å®è¡æéãããããããŠããŸããŸãã ãªã®ã§ã䞊åã§å®è¡å¯èœãªããã«ããªããããã®äžŠåæ°ã«ã¯äžéãèšãããã圢ã§ã®åäœãæ±ããããŸãã å®éã®æ§æ äžèšã®ãããªèŠä»¶ãšå¶çŽãèžãŸããŠã以äžã®ãããªæ§æã«ããŸããã 1. 宿çã«Cloud Tasksã«åããŒãžããšã®TaskãEnqueueãã TaskãEnqueueãããCloud Tasksã®ãã¥ãŒäœæ ãŸããCloud Tasksã®ãã¥ãŒãäœæããŸãã $ gcloud tasks queues create lighthouse 次ã«ãã¥ãŒã®èšå®ãããŠãããŸãã æ¬çªç°å¢ãå©ãããšã«ãªãã®ã§ãå®è¡ééãäžŠåæ°ã«ã¯å¶éãèšãããã§ãã äŸãã°ãã¿ã¹ã¯ã®æå€§é床ã1ä»¶/ç§ãšããæå€§äžŠåæ°ã5ã«ããå Žåã¯ä»¥äžã®ã³ãã³ããå©ããŸãã $ gcloud tasks queues update-app-engine-queue lighthouse \ --max-dispatches-per-second=1 \ --max-concurrent-dispatches=5 以äžãå
¬åŒããã¥ã¡ã³ãã«ãªãã®ã§ããã®ä»ã®èšå®ããããå Žåã¯ã芧ã«ãªã£ãŠãã ããã Creating Cloud Tasks queues | Cloud Tasks Documentation | Google Cloud TaskãEnqueueããFunctionã®äœæ 宿å®è¡ã®Triggerã¯Cloud Pub/Subã®Cronãå©çšããŸãã ãã¡ãã¯Firebase Functionsã§TriggerãPus/Subã«ããFunctionãdeployããã ãã§ç»é²ã§ããŸãã ãã®Triggerã§èµ·åãããFunctionãå®è¡ããã®ã¯ä»¥äžã®2ç¹ã§ãã BigQueryããLighthouseãå®è¡ããã¹ãããŒãžãååŸãã åããŒãžããšã«ãCloud Tasksã«Firebase Functionsãå©ãåŠçãEnqueueããŠãã Enqueueããã®ã¯HTTP Targetã¿ã¹ã¯ã«ããŸãã HTTP Targetã¿ã¹ã¯ã¯ãã®åã®éãHTTPãªã¯ãšã¹ããæããã¿ã¹ã¯ã«ãªã£ãŠãããåŸã»ã©äœãåããŒãžã«Lighthouseãå®è¡ããFirebase FunctionãHTTPãªã¯ãšã¹ãã§å®è¡ããŸãã å®éã®æµãã¯ãããªæãã«ãªããŸãã const client = new CloudTasksClient(); const project = 'project-id' ; const queue = 'lighthouse' ; const parent = client.queuePath(project, tokyoRegion, queue); const httpMethod = 'POST' ; const headers = { 'Content-Type' : 'application/json' } ; const functionEndpoint = 'https://asia-northeast1-project-id.cloudfunctions.net/audit-url' ; export const enqueueLighthouse = functions .regions( 'asia-northeast1' ) .pubsub.schedule( '0 0 * * *' ) .timeZone( 'Asia/Tokyo' ) .onRun(async () => { const targetUrls = await fetchTargetUrls(); // BiqQueryããã¿ãŒã²ãããšãªãURLãååŸãã if (targetUrls.length === 0) { return ; } await Promise.all(targetUrls.map((url) => { const payload = JSON.stringify( { url } ); const body = Buffer.from(payload).toString( 'base64' ); // EnqueueããTaskã®å
容ãèšå®ãã // https://cloud.google.com/tasks/docs/creating-http-target-tasks const task: google.cloud.tasks.v2.ITask = { httpRequest: { httpMethod, functionEndpoint, headers, body } , } ; return client.createTask( { parent , task } ); } )); } ); ããšã¯ããã®é¢æ°ãdeployããã°ã宿çã«Cloud Tasksã«ãã¥ãŒãç©ãŸããŠãããŸãã 2. åããŒãžã«Lighthouseãå®è¡ãBiqQueryã«çµæãæ ŒçŽãã æ¬¡ã«ãCloud TasksããHTTPãªã¯ãšã¹ããåããŠLighthouseãå®è¡ããåŠçãå®è£
ããŸãã lighthouseãå®è¡ããããã®ãã©ãŠã¶ã«ã¯puppeteerãçšããŸãã ããã¯å°ãçœ ããããlighthouseå
¬åŒã®ããã¥ã¡ã³ãã«ã¯ Chrome Launcher ãå©çšããå®è£
æ¹æ³ãæžãããŠããã®ã§ãããç§ã詊ããéãã§ã¯Firebase Functionsã§ã¯Chrome Launcherã䜿çšããŠLighthouseãå®è¡ãããšãšã©ãŒãçºçããŠããŸãã lighthouse/readme.md at master · GoogleChrome/lighthouse · GitHub å®éã®æµãã¯ãããªæãã«ãªãããšæããŸãã // index.ts import * as functions from 'firebase-functions' ; import lighthouse from "lighthouse" ; import puppeteer from 'puppeteer' ; // lighthouseå®è¡ããã®ã§timeoutSecondsã䌞ã°ããŠãã const runtimeOptions: functions.RuntimeOptions = { timeoutSeconds: 540, memory: '1GB' , } ; const puppeteerFlags: Array <string> = [ '--headless' , '--disable-dev-shm-usage' , '--disable-gpu' , '--no-zygote' , '--no-sandbox' , '--single-process' , '--hide-scrollbars' , ] ; const lighthouseFlags: LH.Flags = { output: 'json' , emulatedFormFactor: 'mobile' , // Performanceã®ç¹æ°ã«é¢ä¿ããé
ç®ã ãã«çµã£ãŠããŸãã onlyCategories: [ 'performance' ] , onlyAudits: [ 'first-contentful-paint' , 'first-meaningful-paint' , 'speed-index' , 'interactive' , 'first-cpu-idle' , ] , } ; export const auditUrl = functions .regions( 'asia-northeast1' ) .runWith(runtimeOptions) .https.onRequest(async (req, resp) => { await runLighthouseAndPersistResult(req.body.url); resp.sendStatus(200); } ); async function runLighthouseAndPersistResult(url: string) { const result = await launchChromeAndRunLighthouse(url); // BiqQueryã«çµæãæ ŒçŽããåŠç // ããŒã¿åœ¢åŒãªã©ã¯ https://github.com/sahava/multisite-lighthouse-gcp ãåè return insertLighthouseResult(result); } async function launchChromeAndRunLighthouse(url: string) { const browser = await puppeteer.launch( { args: puppeteerFlags } ); const results = await lighthouse(url, { ...lighthouseFlags, port: parseInt( new URL(browser.wsEndpoint()).port) } ); await browser.close(); return results; } çµããã« ä»åã¯Firebase FunctionsããLighthouseãå®è¡ããæ§æäŸãç°¡åã«ç޹ä»ããŸããã ããã©ãŒãã³ã¹ãæ¹åããäžã§ã®ç¬¬äžæ©ã¯èšæž¬ãå§ããããšã ãšæãã®ã§ããã²çãããLighthouseãå©ããŸãã£ãŠãã ããã
ã¹ããŒããã£ã³ãããšã³ãžãã¢ã®äºäžã§ãã åŒç€Ÿã§ææŠã®æå³ã蟌ããŠãBOXILéçºããŒã ããBiscuetéçºããŒã ãžã®ç°åãããŸããã ä»åã¯ããŒã ç°åã§æ°ã¥ããããšããäŒãããŠããããšæããŸãã 1. ã¹ã¯ã©ã ã«ããããŒã ãžã®åŒãç¶ãã³ã¹ãã®åæž 2. æ°ããããŒã ãžã®äžå® 3.æ°æã¡ã®åãæ¿ã 4. ããŒã ç°åã®ã¡ãªãã ã¡ã³ããŒãç°åãã§ãããšããäºäŸãã§ãã æ°ããæè¡ã«è§Šããããšã§ã§ããããšãå¢ãã æ°ããããžãã¹ã«é¢ããããšã§ãã¡ã€ã³ç¥èãå¢ãã åã®ããŒã ã®ããŠããŠãæ°ããŒã ãžå
±æã§ãã ãŸãšã 1. ã¹ã¯ã©ã ã«ããããŒã ãžã®åŒãç¶ãã³ã¹ãã®åæž ããŒã ãç§»åãããšããããšã§ãèªåãããªããŠã察å¿å¯èœãªç¶æ
ã«ããããã«ãåŒãç¶ãã®ããã®ããã¥ã¡ã³ããæžãããäœæ¥æé ãªã©ãæ®ããªã©ãå¿
èŠããšæããŸãã åŒç€Ÿã®å Žåã¯ãã¹ã¯ã©ã ãå°å
¥ããŠãã广ã§å±äººæ§ã®é«ãäœæ¥ãªã©ãå°ãªãã誰ã§ãåãç¥èãæã£ãŠããç¶æ
ã«ãªã£ãŠããããåŒãç¶ãäœæ¥ãçºçããŸããã§ããã ãã®ãããããŒã ç§»åãèããŠãã1é±éã»ã©ã§åé¡ãªãããŒã ç§»åãè¡ããŸããã 2. æ°ããããŒã ãžã®äžå® ããŒã ãç§»åãããšããããšã¯ãéããããã¯ããéçºãããšããã ãã§ãªããæ°ããã¡ã³ããŒãšéçºãããšããããšã§ã転è·ã«ãè¿ãããã¡ã«ãªããŸãã ãã®äžã§ã©ã®ãããªããšããã£ãŠããã®ããäœãããã°ããã®ããªã©ããããªããã£ããã¢ããã«æéããããå ŽåããããŸãã éé±ã§ããŒã éã§ãã©ã®ãããªã¿ã¹ã¯ãåãçµã¿ãããŠãããå
±æããŠãããããããŒã ã§ã©ããªããšãããŠãããªã©ã¯ããçšåºŠçè§£ããç¶æ
ã§è©±ãèãããšãã§ããŸããã ãã®çµæããªã³ããŒãã£ã³ã°ãããŒã ã«é¢ããŠã®èª¬æãªã©ã¯æå°éã§ããŒã ã«ãžã§ã€ã³ããããšãã§ããŸããã 3.æ°æã¡ã®åãæ¿ã äžçªå€§å€ã ã£ãã®ã¯ãããã¯ããå€ããããšã«å¯ŸããŠã®æ°æã¡ã®åãæ¿ãã§ããã ã¹ã¯ã©ã ã«ããåŒãç¶ãããªããªããèªåãããªããŠã倧äžå€«ãªç¶æ
ã§ããããããããããšã»ããããããããšãªã©ãããç¶æ
ã§ã®ç°åã ã£ãã®ã§ãèŸãããããŸããã ããããèªåã§ãªããŠãéæã§ããç¶æ
ã«ãªã£ãŠãããããããç°åããæ±ºæãã§ããŸããã 4. ããŒã ç°åã®ã¡ãªãã ããŒã ç°åã®è©±ãèãããšãã«ã¡ãªããã«ã€ããŠèããŸããã ãããŠãå®éã«è¯ãã£ããšæãããšããã玹ä»ããŸãã ã¡ã³ããŒãç°åãã§ãããšããäºäŸãã§ãã èªåã¯BOXILããŒã ã®äžã§ãé·ãïŒå¹Žåã»ã©éçºããŠããŸãããããã®èªåãç°åã§ããããšããããã°ãä»ã®äººãç°åãããããªãã®ã§ããäºäŸã¥ããã«ãªããšæããŸããã æ°ããæè¡ã«è§Šããããšã§ã§ããããšãå¢ãã Productãéãã°äœ¿ã£ãŠãæè¡ãäœããã®ãå€ãã£ãŠããã®ã§ãæ°ãã«åŠç¿ããããšãå¢ãããšã³ãžãã¢ãšããŠããã«æè¡ã®å¹
ãåºãããšæããŠããŸãã æ°ããããžãã¹ã«é¢ããããšã§ãã¡ã€ã³ç¥èãå¢ãã æ°ããããžãã¹ã«é¢ããããšã§ãä»ãŸã§è¡šé¢äžããçè§£ããŠããªãã£ãããšã«å¯ŸããŠæ·±ãç¥ãããæ©äŒã«ãªããŸãã ãŸããå®éã«ã©ã売ããããçŸåšã®åžå Žã®ç¶æ
ãªã©ã¯æ¬ã§ã¯åŸãããªãæ
å ±ãªã®ã§ãšãŠãå匷ã«ãªããŸãã åã®ããŒã ã®ããŠããŠãæ°ããŒã ãžå
±æã§ãã éãããŒã ã§ããã°åã課é¡ã§ãè§£æ±ºæ¹æ³ãéã£ãããå¥ã®èª²é¡ã«æ³šåããŠãã®ã§æºãŸãããŠããŠãå€ãã£ãŠããŸãã ãããŠä»åã®ç°åã§ãBOXILããŒã ã®åãçµãã§ããŠè¯ãã£ãããšãBiscuetããŒã ã«éå
ããããšã§ãããŒã éã®ããŠããŠã®å
±æã«ãªãããšæããŸãã çŸåšãBiscuetããŒã ã§ãã¹ããæžããšãã«BOXILã®ãã¹ãã³ãŒããå
±æããŠãã¹ãäœæãããããããæ¯ãè¿ãã®éã«BOXILã®å€±æã»æåäºäŸãªã©ã玹ä»ããŠããŸãã ãŸãšã ãããã§ããã§ããããïŒ ä»åã¯ããŒã ã®ç°åããŠæããããšããã£ãããšã玹ä»ããŸããã ãã®å
容ãããŒã ç°åã®åèã«ãªãã°å¹žãã§ãã
ãåããã®ãèªçãããã§ãšãïŒ ã¹ããŒããã£ã³ãã®ãããã¯ããããŒãžã£ãŒã®é·ç°ã§ãã è¿é ãè²äŒãååŸããããšã³ãžãã¢ã®æ¹ã®èšäºãããèŠãããããã«ãªããŸããã ãããªãªããåŒç€Ÿã¹ããŒããã£ã³ãã§ãçŽè¿ã§ãšã³ãžãã¢ãè²äŒãååŸããæ©äŒããã£ãã®ã§ããã æ¬èšäºã§ã¯éã®èŠç¹ãã€ãŸãæ®ãããã¡ã³ããŒã®èŠç¹ããããè²äŒã§ãšã³ãžãã¢ãªãŒããŒãäžåšãšãªã£ãéçºããŒã ã«ãã©ã®ãããªå€åããã£ãã®ãïŒãããå±ãããŸãïŒ éçºäœå¶ ã¹ã¯ã©ã ã§ã®ãããã¯ãéçº ããŒã ã®ç·šæ ãšã³ãžãã¢ãªãŒããŒã®æ¥å è²äŒã«å
¥ããŸã§ äžåšæã®åé¡ãšå¯Ÿçæ¡ã®å
±æ å®éã«ãšã³ãžãã¢ãªãŒããŒäžåšãšãªã£ãŠ å°ã£ãããš å°ãããšã§èµ·ããããžãã£ããªå€å æã£ããããå°ããªãã£ãããš è²äŒæéãçµã㊠äžäººã²ãšãã®ææ³ è²äŒããšã£ããšã³ãžãã¢ãªãŒããŒããã®ã³ã¡ã³ã ãŸãšã ãã®ä» éçºäœå¶ ã¯ããã«ãæã
ã®ããŒã ã§ã¯ã©ã®ãããªäœå¶ã§éçºãè¡ã£ãŠããã®ãã玹ä»ããŸãã ã¹ã¯ã©ã ã§ã®ãããã¯ãéçº æã
ã®ããŒã ã§ã¯ã¹ã¯ã©ã ã®ããã»ã¹ãåãå
¥ãããããã¯ãéçºãè¡ã£ãŠããŸãã ãã¹ã¯ã©ã ãã©ã®ããã«å®çŸããŠãããïŒãã«ã€ããŠã¯ä»¥åæçš¿ãã以äžèšäºãã芧ããã ããã°ãšæããŸãã tech.smartcamp.co.jp ããŒã ã®ç·šæ ãšã³ãžãã¢ãªãŒããŒãããé ã®ããŒã ç·šæãã玹ä»ããŸãã ä»åã¯ãã®ãããªäœå¶ã®äžã§Tããã1ã¶æã®è²äŒãåãããšãšãªããŸããã æ
åœè
æå±ããŒã åœ¹å² é·ç°ãã POããŒã ãããã¯ããããŒãžã¡ã³ããå
ãšã³ãžã㢠Tãã ãšã³ãžãã¢ããŒã ããŒã ãªãŒãã£ã³ã°ãããã¯ãªãŒããè²äŒãšã£ã人 Hãã ãšã³ãžãã¢ããŒã ãšã³ãžãã¢ãªã³ã°ããã¶ã€ã³ããã人 Aãã ãšã³ãžãã¢ããŒã ãšã³ãžãã¢ãªã³ã°ãã€ã³ãã©åŒ·ãã®äºº Cãã ãšã³ãžãã¢ããŒã ãšã³ãžãã¢ãªã³ã°ãã¢ããªéçºäžå¿ã®äºº â»ããžãã¹ãµã€ãã®ã¡ã³ããŒã¯çããŠããŸãã ãšã³ãžãã¢ãªãŒããŒã®æ¥å è²äŒåã«ãšã³ãžãã¢ãªãŒããŒãæ
ã£ãŠããæ¥åã圹å²ã¯ä»¥äžã«ãªããŸãã ãšã³ãžãã¢ãªã³ã° ãã«ã¹ã¿ãã¯ã®éçº ãµãŒããŒãµã€ãã§ã¯éçºããªãŒãã£ã³ã° æè¡éžå® ã¢ãŒããã¯ãã£èšèšãå€éšé£æºèšèš ãªã¢ãŒãæçã®æ¥åè
ãžã®ã¿ã¹ã¯å²ãæ¯ã ã¹ã¯ã©ã éçºç°å¢ã®æ¹åã«å¯Ÿãããã¢ã€ãã¢åºãã»åªå
床ä»ã»å·¥æ°ã®èŠç©ãã PdMã®æ°æ©èœã¢ã€ãã£ã¢ã«å¯Ÿãããå®çŸå¯èœæ§ãšå·¥æ°ã®èŠç©ãã ãã©ã³ãã³ã°ã®ãã¡ã·ãªããŒã·ã§ã³ãšæšé² çãååŒã圹 å€ãå®è£
ã®çµç·¯ã®ææ¡ ãããã¯ãã®ç«ã¡äžãçµç·¯ã®ãã§ãŒãºãããšã³ãžãã¢ãªã³ã°ã§ã®é¢ããæã è²äŒã«å
¥ããŸã§ 以äžã®ã¿ã€ã ã©ã€ã³ã§è²äŒã«åããæºåãè¡ããŸããã è²äŒååŸã®3ã¶æå éçºããŒã ãžã®å
±æãçžè« è²äŒååŸã®1ã¶æå MTGã«ãŠãèµ·ãããåé¡ã®æŽãåºã è²äŒååŸã®1é±éå MTGã«ãŠãåé¡ãšå¯ŸçãæŽç äžåšæã®åé¡ãšå¯Ÿçæ¡ã®å
±æ POããŒã ãå«ããŠèª²é¡ã話ãåããäžåšæã«ã©ã®ãããªåé¡ãèµ·ãããããããã«ã©ã®ãããªå¯Ÿçãæ³å®ããããããã£ã¹ã«ãã·ã§ã³ããããŒã ã®èªèåãããè¡ã£ãçµæã以äžãšãªããŸããã ãã®ïŒïŒæ¥åå§èšã®ã¿ã¹ã¯å²ãæ¯ãã«å°ã å¯Ÿçæ¡ïŒ ã¹ããªã³ããã©ã³ãã³ã°ã«1Step远å ããããŒã å
šäœã§ã¿ã¹ã¯å²ãæ¯ãã宿œ ãã®ïŒïŒæè¡çãªæææ±ºå®ã«å°ããã¢ãŒããã¯ãã£ã®èšèšããã³ãŒãã®å質ãäžãããããããªã å¯Ÿçæ¡ïŒ å€éšã¢ããã€ã¶ãŒã«æèŠãæ±ãã æææ±ºå®ã¯3åå
šå¡ã§ãã£ã¹ã«ãã·ã§ã³ããŠæ±ºããããšãšãã ãã®ïŒïŒéçºã¹ããŒããäžãã å¯Ÿçæ¡ïŒ POããŒã ã«ãŠã¹ããŒãäœäžãåæãšããäºæ¥èšç»ã®èŠçŽããè¡ã ãã®ïŒïŒãã¿ãããªã å¯Ÿçæ¡ïŒ ãåããã®æé·èšé²ãæµãslackãã£ã³ãã«ãäœã£ãŠéçšããŠããã å®éã«ãšã³ãžãã¢ãªãŒããŒäžåšãšãªã£ãŠ å°ã£ãããš æºåã¯ããŠãããã®ã®ãããäžåšãšãªããšçºèŠããå°ãããšã沢山ãããŸããã 1. ãšã³ãžãã¢ãªãŒããŒã«ãããæææ±ºå®ãããªããªã£ãããš äºåMTGã§ãæè¡çãªæææ±ºå®ã«å°ãå¯èœæ§ãããä»¶ã«ã€ããŠã¯æ€èšããŠããŸãããããã¯ããšã³ãžãã¢ããŒã ã§è¡ãæææ±ºå®ã®å€ãã«ãšã³ãžãã¢ãªãŒããŒã®æèŠãåæ ããããŠãããããå®éã«äžåšãšãªããšãã©ããããïŒããšå°ãã·ãŒã³ãå€ãã£ãããã§ãã 2. æ¢åã®ã³ãŒãã§ãªãŒããŒã«äŸåããŠããéšåãå€ãã£ãããš ãšã³ãžãã¢ãªãŒããŒãäžåšãšãªãããšã§ããšã³ãžãã¢ãªãŒããŒã®ã¿ãææ¡ããŠããã³ãŒããããããšããããããããã«å¯Ÿããæ¹ä¿®ãå³åº§ã«è¡ããªãç¶æ
ãšãªã£ãŠããŸããã 3. ããžãã¹ãµã€ãããã®ãã£ãããšããéçºèŠæã®ææãèãçžè«çžæãããªããªã£ãããš ãã³ã¬ãå®çŸããŠã¿ãããã©ãããã£ãŠã§ããã®ïŒããšãã£ãçžè«ãããçžæããšã³ãžãã¢ãªãŒããŒãšãªã£ãŠãããããã©ãã§èª°ã«çžè«ããã°ããã®ããããããªãç¶æ
ãšãªã£ãŠããŸããã å°ãããšã§èµ·ããããžãã£ããªå€å å®éã«äžåšãšãªããšãšã³ãžãã¢ãªãŒããŒãžäŸåããŠããæ¥åãæ²¢å±±æã£ãããšã«åèªèãããããŸããã ããã«ãããéçºã¡ã³ããŒã¯æ¥åãé²ããããã«èªåã調ã¹ãŠãæææ±ºå®ãããããã³ãŒããæžããå¿
èŠãã§ãããšããŸãPOããŒã ã¯éçºããŒã ã«èãåã«ãããå°ãèªåã§èª¿ã¹ããæéãäœã宿œããããã«ãªããŸããã ãšã³ãžãã¢ãªãŒããŒäžåšã«ãã穎ã¯å€§ãããã®ã ã£ããããç¹ã«äžåšãšãªã£ãåæã®ããã¯ã¹ããŒããããªãäžãã£ãŠããŸããŸããããããã«ããäžäººã²ãšãã®æ¥åç解床ããããã1ã¶æãçµããé ã«ã¯ã¡ã³ããŒå
šå¡ã®ãããã¯ããæ¥åã®è§£å床ãäžãããäžåšã®ç©Žãå
åã«åããããã»ã©ã«ãªã£ãŠããŸããã æã£ããããå°ããªãã£ãããš ãã£ãšå°ããšæã£ãŠããããå®éã«ã¯å°ããªãã£ãããšãæããŸããã ã¹ã¯ã©ã ã«ããæ©æµ åŒããŒã ã§ã¯ã¹ã¯ã©ã ã®ä»¥äžã€ãã³ãã®ãã¡ã·ãªããŒã·ã§ã³ãæ¯åã©ã³ãã ã«æ±ºããŠããŸãã ãã€ãªãŒã¹ã¯ã©ã ãªãã¡ã€ã³ã¡ã³ã ã¹ããªã³ãã¬ãã¥ãŒã§ã®éçºã㢠ã¬ããã¹ãã¯ãã£ã ã¹ããªã³ããã©ã³ãã³ã° ããã«ãããåã€ãã³ããžã®ç解床ãã¹ã¯ã©ã ãã¹ã¿ãŒããšã³ãžãã¢ãªãŒããŒã«åãããäžåšæãèªç¶ãšã¹ã¯ã©ã ãåãããšãã§ããŠããŸããã ãŸããéçºããŒã ã¯ã¡ã³ããŒå
šå¡ã®éçºå¯èœãªåèšæéïŒãã£ãã·ãã£ïŒãšãéå»ã®å®çžŸãã宿œå¯èœãã€ã³ãã®èŠç©ãããè¡ã£ãŠããŸãã ããã«ããã1åãäžåšãšãªã£ãå Žåã«æ¶åã§ãããã€ã³ãïŒéçºå¯èœãªã¿ã¹ã¯éã®èŠç©ããïŒãã§ããŠãããããã¿ã¹ã¯ãè©°ã蟌ã¿ãããéçºãšãªããã«ã€ãã¬ãŒã·ã§ã³ãåãããšãã§ããŸããã è²äŒæéãçµã㊠äžäººã²ãšãã®ææ³ Hãã æ¢åæ©èœããšã³ãžãã¢ãªãŒããŒã«å±äººåããŠããéšåãå€ãèªèã¯ãã£ããããäžåšãšãªãããšã«äžå®ããã£ãã å±äººåããŠããéšåãéçºãé²ããããã«ãã¡ã³ããŒå
šå¡ã§ã³ãŒããã¹ããæžãããšãè€éãªæ©èœã®ããžãã¯ã®ã³ãŒããªãŒãã£ã³ã°ãããŠçè§£ãã§ããããã«ãªã£ãã®ã¯è¯ãã£ãã éçºããã»ã¹ã¯ã¹ã¯ã©ã ãå°å
¥ããŠæ°ã¶æåããäœãäžããŠãã£ãŠããã®ã§ã倧ããå°ãããšã¯ãªãããæãã«é²ããããšãã§ããŠããã£ãã Cãã è²äŒã«å
¥ããŸã§ã¯äžå®æãã£ããæ°æ©èœã®èšèšã»éçºãããšãããããæ¢åã®è€éã§ãã£ããå±äººçãªæ©èœã§äžå
·åãçºçãããè§£æ±ºåºæ¥ãã®ããªãã¿ãããªæŒ ç¶ãšããäžå®ããã£ãã è²äŒæéäžã¯èªåãã¡ã§ãããããåŸãªãç°å¢ã«ãªã£ãããšã§ãèªåãããŸãè§Šã£ãŠããªãã£ãé åãè§Šããã£ããã«ãªã£ãããã®çµæã¢ããªã±ãŒã·ã§ã³ã®å
šäœæãããç«äœçã«ãªã£ãã ãã®ãããã§äžè¿°ã®æŒ ç¶ãšããäžå®ã¿ãããªãã®ãèããªã£ãããèªãã§ãããããªãããããããèªãã°ããããããã«ãªã£ãã Aãã æè¡çãªéšåã¯ãã¡ããã ããéçºããŒã ã®çµ±çãä»ãŸã§ãšéãäœå¶ã«ãªãããšã«ãã£ãŠã©ãæææ±ºå®ããŠãããã¿ãããªé¢ãããªãäžå®ããã£ããããããã¹ã¯ã©ã ã«åãçµãã§ããŠããã»ã¹ã®ååãã§ããŠããããä»ãŸã§é Œã£ãŠãããã©è¶³ããªãéšåãã¿ããªã§è£ããªããšãããªãïŒãšãã屿©æã¿ãããªã®ãããŸãåã¿åã£ãŠãè²äŒåã«æ³åããŠããããããã圢ã§ããŒã ãã¯ãŒã¯ãããšæãã å人çã«ã¯ãããã¯ãªãŒããæããåãPOãæ¥åå§èšã®æ¹ãšèªèéœéœ¬ãèµ·ããªãããããŸãã«é£æºããããã«ããããä»ãŸã§ããããã£ãã確èªãã¬ãã¥ãŒãããããã«æèããç¹ãããã£ãã®ããªãšæãã 人ãæããŠã¡ã³ããŒã匷å¶çã«å€ããããšã§åã¡ã³ããŒã®ç«ã¡äœçœ®ãå€ãã£ãããããŒã ã§äœæ¥ãããšãã®ã¹ã¿ã€ã«ãå€ãã£ããããã®ã¯ãšãŠããããããããåºæ¿ããã£ãŠãšãŠãããå€åã ãšæã£ãã é·ç°ãã POããŒã ããèŠãŠããããã»ã¹é¢ãæè¡é¢ããšã³ãžãã¢ãªãŒããŒã«äŸåããŠããéšåãå€ãããã«æããŠãããããå°ãããšã¯å¢ãããšèããŠããã 誰ãããªã«ããæ
ã圢ã§ãšã³ãžãã¢ãªãŒããŒã®æ¥åã忣åããå¿
èŠã¯ãããšèããŠãããããå人ã®ãªãŒããŒã·ããã«ãã£ãŠäžæã«å·»ãåã£ãŠãããããšãã§ããã®ã¯ãšãŠãããã£ãã ç¹ã«ããšã³ãžãã¢ãªãŒããŒäžåšã«ããèªåå«ããäžäººã²ãšãã®èªè²¬ã®æèãåäžããããšãäžçªã®ææã ãšæãã è²äŒããšã£ããšã³ãžãã¢ãªãŒããŒããã®ã³ã¡ã³ã Tãã ã¹ã¯ã©ã ã§åããŠããããåã¡ã³ããŒããªãŒããŒã·ãããšã£ãŠãããç°å¢ã ã£ãã®ã§ããããŸã§å¿é
ã¯ããŠããªãã£ãã å¿«ãè²äŒãžéãåºããŠãããŠããã®éãæ»ããªãéçºãé²ããŠãããŠæè¬ãããªãïŒ ãŸãšã 以äžãåŒç€Ÿã®äºäŸã«ãªããŸãïŒ ãããã ã£ãã§ããããïŒ è²äŒãååŸããåŽã®äžå®ä»¥å€ã«ããååŸãã人ãæå±ããŠããããŒã ã»çµç¹ã®äžå®ã«ã€ããŠãåŒç€Ÿã®äºäŸã«ãã£ãŠè§£æ¶ããããéšåãããã°å¹žãã§ãã ãã®ä» åœããã¯ããã°ã§ã¯éå»ã«ãè²äŒãååŸããEMããåè²ãŠã§åãçµãã ããšããšã³ãžãã¢ã®ããŠããŠãã©ã掻ããããïŒãã玹ä»ããèšäºãæžããŠãããŸãã ãèå³ãããããŸãããããã²ãã¡ãã埡芧ãã ããïŒ tech.smartcamp.co.jp
ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒãããŠããç±³å
ã§ãã çªç¶ã§ãããã¿ãªããã¯è»¢è·æŽ»åãããéã«ã©ã®ããã«ããŠäŒæ¥ãéžã³ãŸããïŒ äŒæ¥ã®ããžã§ã³/ããã·ã§ã³ã»æè¡åã»ç€Ÿå¡ã®äººæããªã©ãªã©èŠãã¹ããã€ã³ãã¯ãããããããšæããŸãã ãã æ°åã®é¢æ¥ã ãã§ã¯æ¬åœã«ãã®äŒæ¥ãèªåã«ãããããŠããã®ãåãããªãäºãããã®ã§ã¯ãªãã§ããããã äŒæ¥åŽãäžç·ã«åããŸã§ã¯åè£è
ã®æ¹ãèªç€Ÿã§æŽ»èºã§ããã®ããåè£è
ãšèªåãã¡ã®æåŸ
å€ãåã£ãŠããã®ããåãããªããšãã£ãå ŽåããããšæããŸãã ããã§ã¹ããŒããã£ã³ãã§ã¯éžèãé²ãã åè£è
ã®æ¹ã«å¯ŸããŠãäŒé£ãäœéšå
¥ç€Ÿãªã©ã®é¢æ¥ä»¥å€ã®æ¹æ³ã§ãäºãã®ãããåºŠãæž¬ãåãçµã¿ãè¡ã£ãŠããŸãã ä»åã¯ãããã®åãçµã¿ã®äžã§ããäœéšå
¥ç€Ÿãã«æè¿åå ãããæ¹ã«ã€ã³ã¿ãã¥ãŒãè¡ãã客芳çãªèгç¹ã§ã®ææ³ãèšäºã«ããŠã¿ãããšæããŸãïŒ åè 身近なUXデザイン? 会社1日体験を作ってみた話|SMARTCAMP DEXIGN|note 「採用後の活躍」がゴール! 〜エンジニア採用フローを公開します〜 - SMARTCAMP Engineer Blog æ³å®èªè
äœéšå
¥ç€Ÿã®å¶åºŠã«ã€ã㊠ä»åäœéšå
¥ç€Ÿãããæ¹ã£ãŠã©ããªäººïŒ äœéšå
¥ç€Ÿã€ã³ã¿ãã¥ãŒéå§ïŒ äœéšå
¥ç€Ÿã®ã¹ã±ãžã¥ãŒã« äœéšå
¥ç€ŸãéããŠæããäº 1.ã¹ã¯ã©ã ã®ç解床ãé«ãã¡ã³ããŒãæã£ãŠãã 2.éšçœ²ã»è·çš®ãåãã仲ãè¯ã 3.è¯ãæå³ã§ã®å€æ§æ§ããã ãã®ä»ãäœéšå
¥ç€Ÿã§æ°ã¥ããäº äœéšå
¥ç€ŸãéããŠåŸããããã®ã»åŸãããªãã£ããã® äœéšå
¥ç€Ÿèªäœã®æ¹åç¹ äœéšå
¥ç€Ÿå
šäœãéããŠã®ææ³ ã€ã³ã¿ãã¥ãŒã®æåŸã« ãŸãšã æ³å®èªè
以äžã®ãããªæ¹ã
ãæ³å®ããŠããŸã äœéšå
¥ç€Ÿãšã¯ã©ã®ãããªãã®ãç¥ãããæ¹ äœéšå
¥ç€Ÿã«åå ãããšäœãåŸãããã®ãç¥ããã人 äœéšå
¥ç€Ÿã®å¶åºŠã«ã€ã㊠ã¹ããŒããã£ã³ãã®äœéšå
¥ç€Ÿã¯ä»¥äžã®ãããªå
容ãšãªã£ãŠããŸãã å®éã®æ¥åã瀟å¡ãšäžç·ã«è¡ã äŒè°ã®å Žã«ååžããŠããã ä»éšçœ²ã¡ã³ããŒãšã®ã©ã³ãã å
šäœæäŒïŒGood&NewïŒ ãªã©äŒç€Ÿã®ã€ãã³ãã«åå ããŠããã ãŸããäœéšå
¥ç€Ÿã®ãŽãŒã«ã¯ä»¥äžã®ããã«å®ããŠããŸã åè£è
ã®æ¹ã®äŒç€Ÿéžã³ã®è»žã«ãããããŠãããã©ããããäºãã«å€æã§ãã ãäºãã«äžæç¹ã»æžå¿µç¹ãç¡ããªããåãã€ã¡ãŒãžãæãŠã ã¹ããŒããã£ã³ãã®é
åãæŽã«æããŠããã ä»åäœéšå
¥ç€Ÿãããæ¹ã£ãŠã©ããªäººïŒ Webç³»äŒæ¥ã§ããã¯ãªãŒãããããžã¡ã³ããçµéšãããããã«ã¯ã©ã¹ã®ãšã³ãžãã¢ã§ã äœéšå
¥ç€Ÿã€ã³ã¿ãã¥ãŒéå§ïŒ ããã§ã¯ã€ã³ã¿ãã¥ãŒãå§ããŠãããŸãããïŒ äœéšå
¥ç€Ÿã®ã¹ã±ãžã¥ãŒã« - äœéšå
¥ç€Ÿãç²ãæ§ã§ããïŒæ©éã§ããäœéšãããæéãšå
容ãæããŠãã ããã ã¯ããæéã¯2æ¥éã§ãã2æ¥ç®ã¯ååŸããã ã£ãã®ã§æ£ç¢ºã«ã¯1.5æ¥ãããã§ããã 忥ã¯ä»¥äžã®ãããªã¹ã±ãžã¥ãŒã«ã§ããã 忥ã®ã¹ã±ãžã¥ãŒã« ## ååäž - æäŒ - ãªãã¡ã€ã³ã¡ã³ã - ã©ã³ã ## ååŸ - éçºéšçœ²å
šäœã®äŒè° - ã¹ããªã³ãã¬ãã¥ãŒ - ã¹ããªã³ãã¬ããã¹ãã¯ãã£ãïŒKPTïŒ - ã¹ããªã³ããã©ã³ãã³ã° - äœéšå
¥ç€Ÿ1æ¥ç®ã®æ¯è¿ã - äœéšã«ãé¢ãããçãã ããããªå
容ã§ããïŒ é¢æ¥ã®éã«ã¹ã¯ã©ã ã§éçºãé²ããŠããããšã¯èããŠããã®ã§ãKPTãªã©ã¹ã¯ã©ã ã®ã»ã¬ã¢ããŒã宿œããŠããæ¥ã«åå ããããšèªåããåžæããŸããã KPT以å€ã«ãã¹ããªã³ãã¬ãã¥ãŒãã¹ããªã³ããã©ã³ãã³ã°ãåãæ¥ã«è¡ã£ãŠããã®ã§ãã»ãŒ1æ¥äžã»ã¬ã¢ããŒã«åå ããŠããŸãããã å®éã¯äŒæ©ã®æéããã£ãã®ã§ããã®éã«BOXILã®ãœãŒã¹ãèªãçããŠããŸããã - ãªãã»ã©ãããã§ã¯2æ¥ç®ã¯ã©ããªå
容ã ã£ãã®ã§ããããïŒ 2æ¥ç®ã¯ååã®éäžããã®åå ã§ããã 忥ã¯BOXILããŒã ã®ã»ã¬ã¢ããŒã§ãããããã®æ¥ã¯BiscuetããŒã ã®ã»ã¬ã¢ããŒãäžå¿ã«åå ããŸããã æåŸã®æ¹ã«å°ãã§ããã¢ãããã°ã©ãã³ã°ã«ãåå ã§ããŸããã 2æ¥ç®ã®ã¹ã±ãžã¥ãŒã« ## ååäž - ã¹ããªã³ãã¬ãã¥ãŒ - ã©ã³ã ## ååŸ - ã¹ããªã³ãã¬ããã¹ãã¯ãã£ãïŒKPTïŒ - ã¹ããªã³ããã©ã³ãã³ã° - BOXILã®äºæ¥è²¬ä»»è
ãšé¢è« - ã¢ããã - 2æ¥éã®æ¯è¿ã äœéšå
¥ç€ŸãéããŠæããäº - ããããšãããããŸãïŒ2ã€ã®ãããã¯ãã®ã»ã¬ã¢ããŒã«åå ãããã®ã§ãããçŽ2æ¥éã§äœéšãããŠæããäºãæããŠé ããŸããã ã¯ããèªåãç¹ã«è¯ããªãšæã£ãç¹ã¯3ã€ã§ãã 1.ã¹ã¯ã©ã ã®ç解床ãé«ãã¡ã³ããŒãæã£ãŠãã 1ã€ç®ãšããŠãäžçªé©ããã®ã¯ã¹ã¯ã©ã ã®ç解床ãé«ãã¡ã³ããŒãæã£ãŠããããšã§ãã KPTã®éã«ã¯æ¹ããŠTryã®æå³ã»æçŸ©ã«ã€ããŠç¢ºèªããçºèšããã£ããããã©ã³ãã³ã°ã§ãã¹ãã€ã¯ã®ç®çãæçŸ©ãæèããŠããããšã決ããŠããããšãã¡ã³ããŒå
šå¡ãã¹ã¯ã©ã ã®åèŠçŽ ã®ç®çãæçŸ©ãçè§£ããçºèšãè¡åãå€ãã£ãã§ãã ã¹ããŒããã£ã³ãã§ã¯ã¹ã¯ã©ã ãã¹ã¿ãŒã®åœ¹å²ãæã€ã¡ã³ããŒã¯äžåšãªã®ã§ãããããã§ãã¡ãããšã¹ã¯ã©ã ãåºæ¥ãŠããŸããã ããèšãããã¹ã¯ã©ã ãã¹ã¿ãŒã®ãŽãŒã«ããèªåèªèº«ãã¯ãã«ããããšããªã®ã§ãããããã«è¿ãç¶æ
ã«ãªã£ãŠããŸãã ä»ãŸã§èªåãèŠãŠããããŒã ãšæ¯ã¹ãŠã¬ãã«ãé«ããšæããŸããã 2.éšçœ²ã»è·çš®ãåãã仲ãè¯ã 2ã€ç®ã¯éšçœ²ãè·çš®é¢ä¿ãªã仲ãè¯ããšæããŸããã 忥ã¯ãåšæ¿ã§ããã©ã³ãããšåŒã°ããŠãããªãã£ã¹å
ã§é£æãæã¡å¯ã£ãŠã©ã³ããé£ã¹ãäŒã«åå ããã®ã§ãããããããªéšçœ²ã®æ¹ãããããã®åœ¹å²ãè¶
ããŠã³ãã¥ãã±ãŒã·ã§ã³ããšãããŠããŸããã æ°åã®åæã¡ã³ããŒãæã£ãŠãããããªç©ºæ°æãäžéãå«ããŠå
šäœã§ããã®ãè¯ãã§ããïŒ 2æ¥ç®ã¯BiscuetããŒã ã®ã©ã³ãã«åå ããŸãããã1人ãå Žãä»åã£ãŠãã1人ãåè«ãèšã£ãŠçãäžããä»ã®1人ãããã«çªã£èŸŒããšãã£ãæ®æ®µããã®ä»²ã®è¯ããæããŸããã ä»äºãšãã©ã€ããŒãã®å¢çãè¯ãæå³ã§ææ§ãªã®ããªãšæããŸããã 3.è¯ãæå³ã§ã®å€æ§æ§ããã 3ã€ç®ã¯è¯ãæå³ã§å€æ§æ§ãããããšã§ãã 忥ã¯BOXILããŒã ã2æ¥ç®ã¯BiscuetããŒã ã«åå ããã®ã§ãããããããããŒã ã®è²ãéã£ãŠããŸããã ããã¯è¯ãæªãã§ã¯ãªãã®ã§ããå人çã«ã¯å¥œããªç¶æ
ã§ãã ãããããŠã³ã§ã©ã®ãããªããŒã ã«ããããæ±ºããããã®ã§ã¯ãªããèªå·±çµç¹åããçµæãšããŠå€æ§æ§ãçãŸããŠããäºãè¯ããšæããŸããã ä»åŸæ°ãã«ããŒã ãåºæ¥ãæãèªç¶ã«å®éšãçºçããçµç¹å
šäœããããªã£ãŠããã®ãæ³åã§ããŸããã ãã®ä»ãäœéšå
¥ç€Ÿã§æ°ã¥ããäº - ããããšãããããŸãïŒèªåéãæ®æ®µããè¡ã£ãŠããããšãè€ããŠãããããšå¬ããã§ããïŒä»ã«æ°ã«ãªã£ãããšã¯ãããŸããïŒ ããã§ãããã¹ã¯ã©ã ã«é¢ããŠã¯ãã©ã³ãã³ã°ã«ããªãæéããããã®ã§ãã¿ã€ã ããŒããŒã眮ããæ¹ãããããªãšæããŸããã ãŸããKPTã®Tryã«ã€ããŠã§ãããé害ã«èµ·å ãããã®ã«ã€ããŠã®è©±ãã«æéãããã£ãŠããã®ã§ãããã«é¢ããŠã¯å¥éãã¹ãã¢ãŒãã ã®æéããšã£ãŠè©±ããæ¹ãããéäžåºæ¥ãŠè¯ãããã§ãã å
šäœã«å¯ŸããŠã¯ãã©ã³ãã®è©±ãšå°ãéãªããŸãããç€Ÿå¡æ°ãçŽ70åãšããèŠæš¡ã®å²ã«ä»²ã®è¯ããäžäœæããããšæããŸããã æ®æ®µã®æšæ¶ããSlackã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ãã¹ããªã³ãã¬ãã¥ãŒã«ããžãã¹è·ã®ã¡ã³ããŒãäžç·ã«åå ããŠè°è«ããŠãããšãããªã©ãããã®ããã«æããŸããã ãŸãã忥ã®åž°ãã®ãšã¬ããŒã¿ãŒã§äœéšå
¥ç€Ÿã§ã¯é¢ãã£ãŠããªã瀟å¡ã®æ¹ãã話ããããããäºãè¯ãå°è±¡ãæ®ã£ãŠããŸãã äœéšå
¥ç€ŸãéããŠåŸããããã®ã»åŸãããªãã£ããã® - ä»åã®äœéšå
¥ç€ŸãéããŠãåŸããããã®ã»åŸãããªãã£ããã®ã¯ãããŸããïŒ ã¯ããäºæ¥ã®èª¬æããããŸã§ã®çµç·¯ãèãæéãå€ãåããããšã§äºæ¥ã®çããèããããããŸããã ãŸããå人çã«ããããªçµç¹ãäœãããããšæã£ãŠãããã®ãå®çŸãããŠããã®ãç®ã®åœããã«ããŠãå®éã«å®çŸã§ããã®ã ãšããäºãããããŸããã å
·äœçã«ã¯ä»¥äžã®ãããªçµç¹ã§ãã ç®ç·ãäºæ¥ã»ãããã¯ãã«åããŠãã èªåéã®ããŒã ã§ããããç©ãäœã£ãŠããæèããã ãããã¯ããªãŒããŒãªã©ã®åœ¹å²ã¯ããããåèªãä»ã®åœ¹å²ã«æã¿åºããŠè¡åããããã«ãã£ãŠãããã®ãäœãããšããŠãã ããšã¯ããžãã£ããªç¶æ
ãç®æããäºã«å
±æããŠåããŠããã®ã匷ããªãšæããŸããã äžå®ã®ç®æãã¹ãæ¹åæ§ãããŒã ã®äžã«ãã£ãŠãèªåéãé 匵ãã°ãã®æ¹åã«åãã£ãŠããããšããæããããããã«æããŸããã éã«åŸãããªãã£ããã®ã¯æè¡ãéçºç°å¢ã®ç¥èã§ãã äŸãã°æè¡çè² åµãã©ã®ãããªç¶æ
ãªã®ããã³ãŒãã®è³ªãéçºã®ããããïŒDX:Developer ExperienceïŒãªã©ã¯ä»åã¯åãããªãã£ãã§ãã ãã ç§ã®å Žåã¯ã¹ã¯ã©ã ã®ã»ã¬ã¢ããŒãžã®åå ãåžæããŠããããšãããä»åããããç¥ãããšã¯MUSTã§ã¯ãªãã£ãã®ã§ããããŠèšããªããšããæãã§ãã æ±ãããã®ã人ãã£ãŠéãã®ã§ãããã«åãããŠã¡ãã¥ãŒãäœãã®ãè¯ãã®ã§ã¯ãªãããšæããŸãã äœéšå
¥ç€Ÿèªäœã®æ¹åç¹ - äœéšå
¥ç€Ÿèªäœã®æ¹åç¹ã¯äœããããŸããïŒ çãæéã§é¢ãã人ã®ååãäžæ°ã«èŠããã®ã倧å€ãªã®ã§ãåæã¯ãã£ãã»ãããããªãšæããŸããã ãŸããå
çšã®è³ªåãšéãªããŸããããã®äœéšå
¥ç€Ÿã§åŸãŠã»ãããã®ãšéã«ãã£ãŒãããã¯ããŠã»ãããã®ãäºåã«å
±æããŠãããããšæ¬äººããã®ã€ããã§äœéšå
¥ç€Ÿãè¿ããããŠããã®ã§ã¯ãšæããŸããã - 確ãã«ããã¯ãã®ãšããã§ããïŒæ¬¡åã«æŽ»ãããŸãã»ã»ïŒ äœéšå
¥ç€Ÿå
šäœãéããŠã®ææ³ - æåŸã«2æ¥éã®äœéšå
¥ç€Ÿå
šäœãéããŠã®ææ³ãããã°æããŠäžããã ãã人ãå€ããªãšæããŸããïŒ ããšã¯ã«ã«ãã£ãŒããããããšåããããäŒç€Ÿãªãã ãããªãšæããŸããã çŸå Žã®ã¡ã³ããŒã颿¥ã«åºãŠããããä»åã®ãããªäœéšå
¥ç€ŸãããŠãããããšéžèã«ããªãå·¥æ°ããããŠããå°è±¡ããããŸãããéžèã®éã«ãäºãã®ããã床ãéèŠããŠããå§¿å¢ãããäŒãããŸãããã³ã¹ãã¯ããããè¯ãããæ¹ã ãšæããŸãã ãŸãããWillãããŒã¹ã®äŒç€Ÿã ãšããå°è±¡ãæã¡ãŸãããä»çŸåšãã課é¡ã«å¯ŸããŠäºæ¥ãäœããšããããããäžã®äžããã®å
ã©ããªããããã®ãµãŒãã¹ãå¿
èŠããšããèŠç¹ã§äºæ¥ãäœã£ãŠãããããªå°è±¡ãæã¡ãŸããã - ãªãã»ã©ã第3è
èŠç¹ã§èŠããšç€Ÿå
ããã§ã¯æ°ã¥ããªãç¹ãèŠããŠé¢çœãã§ããïŒ ã€ã³ã¿ãã¥ãŒã®æåŸã« - ã¡ãªã¿ã«ãããŸã§ããªãããžãã£ããªææ³ãå€ãé ããŸããããããã ãè€ããŠãã ãããšããããšã¯å
¥ç€ŸææãåºãŸã£ããšããããšã§è¯ãã§ããããïŒ ããã¯ãŸã èãäžã§ãïŒååãã«æ€èšããŸãïŒç¬ - ãããŸãããã¡ãã£ãšæ©ãŸããŸãããïŒ2æ¥éæ¬åœã«ããããšãããããŸããïŒ ãã¡ãããããããšãããããŸããïŒ ãŸãšã ä»åã¯å®éã«äœéšå
¥ç€Ÿã«åå ããŠããã ããæ¹ã«ã€ã³ã¿ãã¥ãŒåœ¢åŒã§èããŠã¿ãŸããã å
容èªäœãããäœéšããŠã©ãæããããäœãåŸãã»åŸãããªãã£ãããäžå¿ã«æžããŸããã æã£ã以äžã«ããžãã£ããªææ³ãããããäžæ¹ã§äœéšå
¥ç€Ÿèªäœã¯æ¹åç¹ãèŠã€ãããä»åŸã«æŽ»ããæå³ã§ãä»åã®ã€ã³ã¿ãã¥ãŒã宿œããŠããã£ãã§ãïŒ äœéšå
¥ç€Ÿã«ã€ããŠã®ç§èªèº«ã®èãã§ãããéžèäžã®æéã ããèãããšé¢æ¥ä»¥å€ã«ããã ãã®æéã䜿ãã®ã¯äŒç€Ÿã»åè£è
ã®åæ¹ã«ãšã£ãŠãããªãã«å€§å€ã§ãå®éã«åŽåãã³ã¹ããããããŸãã ãã å
¥ç€ŸåŸã¯ãã以äžã®æéãé·ããšæ°å¹Žéã¯äžç·ã«åãäºã«ãªãã®ã§ãé·æçã«èãããš1æ¥ã2æ¥äžç·ã«åãã ãã§ãã¹ããããè§£æ¶ãããã®ã§ããã°ååã³ã¹ãã«èŠåãã®ã§ã¯ãªãããšèããŠããŸãã æåŸã«ãåŒç€Ÿã®ããšããã£ãšç¥ãããïŒãšããæ¹ã¯ä»¥äžã®ããã°ãåç»ãã芧ãã ããïŒ ãããŸã§èªãã§é ããŠããããšãããããŸããïŒ boxil.jp note.com www.youtube.com
ã¹ããŒããã£ã³ãããšã³ãžãã¢ã®å
¥å±±ã§ãã åŒç€Ÿã§æè¡çææŠã®æå³ã蟌ããŠå§ããKubernetesïŒk8sïŒããå°èŠæš¡ãªããéçšãéå§ããŠ1幎以äžãçµã¡ãŸããïŒ çŸåšã§ã¯ãk8sã§ã®ã€ã³ãã©ãæ¡çšãããããã¯ããç¡äºã«æ¬çªãªãªãŒã¹ãè¿ãããŠãŒã¶ãŒãæ¬çªçšŒåãè¡ããŸã§ã«ãªã£ãŠãããèºããªãããå°ããã€éçšç¥èŠãæºãŸã£ãŠããŠããŸãã ä»åã¯ãk8sãå®éã«éçšããŠããã£ãïŒã€ã®ç¥èŠã玹ä»ããããšæããŸãïŒ Podã®Nodeé
眮ãåã 解決ç ããŒãªã³ã°ã¢ããããŒãæã«ããŠã³ã¿ã€ã ãçºçãã 解決ç Podå逿ã«ã³ã³ããã«ãã£ãŠããã»ã¹ãçµäºããã¿ã€ãã³ã°ãç°ãªã è§£æ±ºç æåŸã« Podã®Nodeé
眮ãåã k8sã§ã¯Podãæ°èŠäœæããå Žåã«ãkube-schedulerãåããŒãã®ãªãœãŒã¹äœ¿çšç¶æ³çãã倿ããæé©ãªNodeãžã¹ã±ãžã¥ãŒãªã³ã°ïŒé
眮ïŒãè¡ããŸãã ãããããã®ã¹ã±ãžã¥ãŒãªã³ã°æ©èœã¯Podã®æ°èŠäœææã«ãã宿œãããªããããã¯ã©ã¹ã¿ã§é害ãèµ·ãã£ãéã¯ãã¡ããã®ããšãPodæ°ãè² è·ç¶æ³ãªã©ã®èŠå ã«ãã£ãŠæ°èŠã¹ã±ãžã¥ãŒãªã³ã°æã«åããçºçããå ŽåãPodãããŸãåããŒãã«åæ£ãããã«åã£ããŸãŸãšãªã£ãŠããŸããŸãã åŒç€Ÿã®éçšæã«ã¯ãããŒãã®é害ãèµ·ãã£ãŠããªãã«ããããããããããã€ãç¹°ãè¿ããŠãããã¡ã«æ°ä»ãããPodãããããŒãã«åã£ãŠããããã®ããŒãã®è² è·ãé«ããªãã ãã§ãªããåé·æ§ã»ä¿¡é Œæ§ãäœäžããŠããŸã£ãŠããããšããããŸããã ãã®ãããªç¶æ³ã«é¥ã£ãå Žåã¯ãk8såŽã§ã¯èªååã¹ã±ãžã¥ãŒãªã³ã°ãè¡ãããªããããäœããã®ææ®µã䜿ã£ãŠåã¹ã±ãžã¥ãŒãªã³ã°ãè¡ãå¿
èŠããããŸãã 解決ç Deschedulerãå©çšããããšã§ãä»»æã®ã¿ã€ãã³ã°ã§Podã®åã¹ã±ãžã¥ãŒãªã³ã°ãè¡ãããšãã§ããŸãã Deschedulerã¯åäœãšããŠãèšå®ããããªã·ãŒã«è©²åœããPodãNodeããåé€ãããããšã§ãkube-schedulerãPodãåã¹ã±ãžã¥ãŒãªã³ã°ãã奿©ãäœããŸããçŸæç¹ã§5ã€ã®ããªã·ãŒããããçšéã«åãããŠæè»ã«Podãåã¹ã±ãžã¥ãŒãªã³ã°ãããããšãã§ããŸãã å°ãDeschedulerã¯Jobã§åäœãããå¿
èŠããããããå®éã«éçšããå Žåã¯CronJobã§å®è¡ãããªã©ã®å·¥å€«ãå¿
èŠã§ãã GitHub - kubernetes-sigs/descheduler: Descheduler for Kubernetes Deschedulerã«ã€ããŠã¯@ponde_mããã®è³æããšãŠããããããããåèã«ãããŠããã ããŸããïŒ speakerdeck.com ããŒãªã³ã°ã¢ããããŒãæã«ããŠã³ã¿ã€ã ãçºçãã k8sã¯Deploymentå®çŸ©ã®Dockerã€ã¡ãŒãžã®ããŒãžã§ã³ã倿ŽããŠapplyããããšã§ãèªåã§Podã®ããŒãªã³ã°ã¢ããããŒããè¡ã£ãŠãããŸãã ãã®ããŒãªã³ã°ã¢ããããŒãã¯ãæ°ããŒãžã§ã³ã®Podãèµ·åããããšã奿©ã«ãæ§ããŒãžã§ã³ã®Podã®åé€ãéå§ãããä»çµã¿ã«ãªã£ãŠããŸãã ãããããã®ãæ°ããŒãžã§ã³ã®Podãèµ·åãããç¶æ
ã¯ãPodå
ã®ãã¹ãŠã®ã³ã³ãããèµ·åããããšã ããæ€ç¥ãããã®ã§ãããåã³ã³ããã®ããã»ã¹ããµãŒãã¹éå§ã§ããç¶æ
ã«ãªã£ãããšãä¿èšŒãããã®ã§ã¯ãªããããã³ã³ããèµ·åãããµãŒãã¹éå§ã§ããç¶æ
ã«ãªããŸã§ã«æéãèŠããå Žåãªã©ã§ã¯åæ¿æã«ããŠã³ã¿ã€ã ãçºçããå¯èœæ§ããããŸãã 解決ç readinessProbeãå©çšãããã«ã¹ãã§ãã¯ã®ä»çµã¿ãå
¥ããããšã§ããµãŒãã¹éå§ã§ããªãç¶æ
ã®Podãæ€ç¥ãããã©ãã£ãã¯ãéããªãããã«å¶åŸ¡ããããšãã§ããŸããããã«ãã£ãŠãããŒãªã³ã°ã¢ããããŒãæã®ããŠã³ã¿ã€ã ãé²ãããšãã§ããŸãã readinessProbeã¯ãã³ã³ããã«å¯ŸããŠä»»æã®ãã«ã¹ãã§ãã¯ãèšå®ããããšã§ãµãŒãã¹éå§ãã§ããç¶æ
ã確èªããæ©èœã§ããã«ã¹ãã§ãã¯ã«å€±æããPodã¯Serviceã®ãšã³ããã€ã³ãããå€ãããä»çµã¿ã«ãªã£ãŠããŸãããŸããäžåºŠãšã³ããã€ã³ãããå€ãããPodã«ã€ããŠããã«ã¹ãã§ãã¯ã«æåããå Žåã¯ãå床Serviceã®ãšã³ããã€ã³ããžç»é²ãããŸãã ãã«ã¹ãã§ãã¯ã®æ¹æ³ã¯ãhttpGetãexecãtcpSocketã®3ã€ããéžã¶ããšãã§ãããããã³ã³ããã«åãããŠæè»ã«èšå®ãã§ããŸãã åããããªãã«ã¹ãã§ãã¯æ©èœãšããŠlivenessProbeãããããã¡ãã¯ãã«ã¹ãã§ãã¯ã«å€±æããéã«Podãç Žæ£ã»æ°èŠäœæããæ©èœãåããŠããŸãã Configure Liveness, Readiness and Startup Probes | Kubernetes readinessProbeã«ã€ããŠã¯ä»¥äžã®èšäºãåèã«ãªããŸãïŒ cstoku.dev Podå逿ã«ã³ã³ããã«ãã£ãŠããã»ã¹ãçµäºããã¿ã€ãã³ã°ãç°ãªã k8sã§ã¯ãPodã®åé€ãéå§ããããšåã³ã³ããã«å¯ŸããŠTERMã·ã°ãã«ïŒæ£åžžçµäºèŠæ±ïŒãéä¿¡ããTERMã·ã°ãã«ãåãåã£ãåã³ã³ããã§ããã»ã¹ã®çµäºåŠçãéå§ãããŸãã ãã®çµäºåŠçã«ã¯ãç¶äºæéïŒããã©ã«ã30ç§ïŒãèšå®ãããŠãããç¶äºæéå
ã«ããã»ã¹ãæ£åžžçµäºãããªãã³ã³ããã«ã€ããŠã¯KILLã·ã°ãã«ïŒåŒ·å¶çµäºèŠæ±ïŒãéä¿¡ãããPodããšåŒ·å¶çã«åé€ãããŸãããŸããTERMã·ã°ãã«ã®éä¿¡ãšåæã«PodãServiceããåé€ããåŠçãå®è¡ãããŸãã ããã§åé¡ã«ãªãã®ããåã³ã³ããã®ããã»ã¹ãçµäºãããŸã§ã®æéã«å·®ãçºçããå¯èœæ§ãããããšã§ãã Podå
ã®ã³ã³ããå士ã§é£æºåŠçãè¡ãæ§æã«ãããŠã¯ããã®æéå·®ã«ãã£ãŠé£æºåŠçããšã©ãŒã«ãªãå¯èœæ§ããããææªã®å Žåã¯åŒ·å¶çµäºãããç¶äºã§ããã®30ç§ã®éãã£ãšãšã©ãŒã«ãªãå¯èœæ§ããããŸãããŸããServiceããã®åé€ãå®äºãããŸã§ã¯æ°èŠãã©ãã£ãã¯ã®å¶åŸ¡ãè¡ãããªãããããã®ãããªç¶æ³ã«é¥ã£ãå Žåã¯ãšã©ãŒç¶æ
ã®ãŸãŸãã©ãã£ãã¯ãåãç¶ããããšã«ãªããŸãã åŒç€Ÿã«ãããŠããã®äºè±¡ãå®éã«éå»çºçããŠããŸããã åŒç€Ÿã®äŸã§ã¯ãPodå
ã«Railsã¢ããªã³ã³ãããšauthèªèšŒã³ã³ãããååšããŠãããã³ã³ããéã§èªèšŒåŠçãè¡ã£ãŠããã®ã§ããã峿çµäºããauthèªèšŒã³ã³ããã«å¯ŸããŠãRailsã¢ããªã³ã³ãããæ£åžžçµäºããã匷å¶çµäºãŸã§çãç¶ãããšããçŸè±¡ãèµ·ããŠããŸãããããã«ãããauthèªèšŒã³ã³ããã®çµäºåŸããRailsã³ã³ããã匷å¶çµäºããããŸã§ã®30ç§éã¯ãRailsããauthã³ã³ããã®èªèšŒãã§ããªãããã«åŠçããšã©ãŒã«ãªã£ãŠããŸããã 解決ç preStopããã¯ãå©çšããŠã³ã³ãããçµäºããçŽåã®åäœãæå®ããããšã§ãåã³ã³ããã®çµäºåäœãã¿ã€ãã³ã°ãæäœããããšãã§ããŸãã preStopããã¯ã¯ãã³ã³ããããšã«çµäºæã®TERMã·ã°ãã«ãéä¿¡ãããåã«ä»»æã®ã³ãã³ãå®è¡ãã§ããæ©èœã§ãããã»ã¹çµäºã®ããã®ä»»æã³ãã³ãã®æå
¥ã ãã§ãªããsleepãªã©ã®ã³ãã³ããå®è¡ããããšã§TERMã·ã°ãã«ã®æå
¥ã¿ã€ãã³ã°ã調æŽããããšãã§ããŸããå°ãpreStopããã¯ãèšå®ãããŠããå Žåã¯ãpreStopããã¯ãå®äºããã¿ã€ãã³ã°ã§TERMã·ã°ãã«ãéä¿¡ãããŸãã preStopããã¯ã®èšå®ããã«ã¹ãã§ãã¯åæ§ã«httpGetãexecãtcpSocketã®3ã€ããéžã¶ããšãã§ããŸãããã ããexecãå©çšããéã¯åæåŠçã§ããå¿
èŠããããéåæåŠçã®ã³ãã³ããå®è¡ããå Žåã¯ã峿ã«preStopããã¯ãå®äºãããšå€æãããŠããŸããããéåæåŠçãè¡ãå Žåã¯çµäºåŠçã«å¿
èŠãªæéãç®å®ã«sleepãããå¿
èŠããããŸãã å°ãPodçµäºæã®è©³ããæåã¯ã以äžå
¬åŒããã¥ã¡ã³ãã«èšèŒãããŠããŸãã Pod | Kubernetes Podã®çµäºåäœãpreStopããã¯ã«ã€ããŠã¯ã以äžã®èšäºãåèã«ãªããŸãïŒ qiita.com æåŸã« ä»åã¯k8sãå®éã«éçšããŠã¿ãŠããã£ãç¥èŠã玹ä»ããŸããïŒ ä»å玹ä»ãããããªPodã®é
眮ãçµäºãªã©ã®k8såŽã§èªåçã«å¶åŸ¡ãããŠããéšåã®åäœã«ã€ããŠãå°å
¥ã»èšèšæãããã£ããææ¡ããŠããã®ã¯ãªããªãé£ãããšæããŸãã ä»åã®å¯Ÿçã§æããäŸä»¥å€ã«ãåæ§ã«åé¡ãè§£æ¶ããæ¹æ³ã¯ãããšæããŸãããäžäŸãšããŠåèã«ãªãã°å¬ããã§ãïŒ
ã¹ããŒããã£ã³ãã§ Biscuet ãäœã£ãŠãããšã³ãžãã¢ã®äžå·ã§ãã æ¬èšäºã¯2æ5æ¥ã«åŒç€Ÿã§éå¬ããTDDã¯ãŒã¯ã·ã§ããã«ã€ããŠç޹ä»ããŸãïŒ TDDïŒ ãã¹ãé§åéçºã®ããšããã¹ãé§åéçºãšã¯ããã¹ããã¡ãŒã¹ããšããŠåãã«ãã¹ãã³ãŒããæžãããã®åŸãã¹ãããã¹ããã³ãŒããå®è£
ããããã«ãã®åŸã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠè¯ãããããšãããµã€ã¯ã«ãåããŠããéçºææ³ã®ããšã ä»åã®ã¯ãŒã¯ã·ã§ããã¯ãããŒãã©ã¯ãŒããšå
±åéå¬ããåèš20åã®ãšã³ãžãã¢ãåå ããŸããïŒ ãŸããè¬åž«ãšããŠãã¹ãé§åéçºã®ç¬¬äžäººè
ã§ããåç°åäººïŒ @t_wada ïŒããã«ãè¶ãããã ããŸããã æ¬æ¥ã¯ã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿæ§ããã³æ ªåŒäŒç€ŸãããŒãã©ã¯ãŒãæ§ã«ãæãããã ãã1æ¥ã³ãŒã¹ã®TDDã¯ãŒã¯ã·ã§ãããéå¬ãããŠããã ããŸãããååŸã®æŒç¿ãšã³ãŒãã¬ãã¥ãŒã§ã¯éã質åãããããé£ã³åºããè°è«ãçãäžãããŸããããåå ãã ãããŸããçæ§ãèª ã«ããããšãããããŸããïŒ — Takuto Wada (@t_wada) 2020幎2æ5æ¥ åœæ¥ã®æµã åœæ¥ã¯äžžäžæ¥ãããŠã¯ãŒã¯ã·ã§ãããè¡ããŸããã åå ååã¯ãt_wadaããã«ããè¬æŒïŒã©ã€ãã³ãŒãã£ã³ã°ããããŸããã è¬æŒèªäœã¯TDDããŸã ãã£ãããšããªãåå¿è
ã§ãåããå
容ã«ãªã£ãŠããããTDDãšã¯ïŒããšãããšããããäžå¯§ã«è§£èª¬ããŠããã ããŸããã ãã®åŸã¯ãt_wadaããã«ããã©ã€ãã³ãŒãã£ã³ã°ãšããŠãFizzBuzzã顿ã«ä»¥äžã®TDDã«ããããµã€ã¯ã«ãåããªããå®éã«éçºããŠããæ§åãèŠããŠé ããŸããã ååŸ åŸåã¯t_wadaããã«èããŠé ãããé¡ã«å¯ŸããŠãåå è
ããã¢ããã§åãçµã¿ãŸããã äºåã®ã¢ã³ã±ãŒãã«ãããšåå è
ã®3/4ããã¹ããæžããçµéšããã£ãããããé¡ã®é£æåºŠèšå®ã¯é£ããïŒåãæ«é²ç®ïŒïŒã«ãããšã®ããšã§ããã åœæ¥çšæããŠããã ãããé¡ã¯ãã¡ãããèŠããŸããïŒåœæ¥ãæ¬äººã«èš±å¯ããã ããŸããïŒïŒ Revenue Recognition · GitHub äœæ¥äžã¯ãåããŒã t_wadaããã«ã¢ããã€ã¹ãè²°ãã€ã€åãçµã¿ãäžéãšæåŸã«ã¢ãã¬ãã¥ãŒãåå è
å
šå¡ã§è¡ããŸããã ã¬ãã¥ãŒã§ã¯ãTDDçã«æ°ã«ãªããã€ã³ããèªåã®ããŒã ãšã®éãã«ã€ããŠåå è
ãæ°è»œã«çºèšããŠããŠã掻çºãªè°è«ãè¡ãããŸããïŒ çµããã« ä»åã®ã¯ãŒã¯ã·ã§ããã®äºåŸã¢ã³ã±ãŒãã®çµæã¯ãã®ããã«ãªããåå è
ã®æºè¶³åºŠãéåžžã«é«ããã®ã«ãªããŸããïŒ å
æ¥ã®TDDã¯ãŒã¯ã·ã§ããã®ã¢ã³ã±ãŒãçµæãæèŠããåå ããçæ§ã®æºè¶³åºŠã®é«ãã«åŒ·ãæå¿ããæããã ããããªãã¯ã€ã¡ãŒãžãšéã£ãŠè³ªåãããããããšãŠãããããããè¬ç¿ã§ãããããããšãããããŸããïŒããšããç±ãã³ã¡ã³ããããã ãã倧å€å¬ãããšåæã«ããããªâŠâŠãšããæ°æã¡ã«ðŠ — Takuto Wada (@t_wada) 2020幎2æ7æ¥ åå人ãšããŠãå®è·µçã«TDDãåŠã¹ãããšã§ããŸãŸã§TDDã«ã€ããŠèª€è§£ããŠããéšåãæç¢ºã«ãªãåŠã³ãåŸãããšãã§ããŸããïŒ åŒç€Ÿãªãã³ã«ãããŒãã©ã¯ãŒãã°ã«ãŒãã§ã¯ä»åŸããããã£ãåãçµã¿ãéããŠãšã³ãžãã¢ã®æè¡åäžã«åãçµãã§ãããŸãïŒ
ããã«ã¡ã¯ã BOXIL ã®éçºãããŠãã埳ç°( @haze_it_ac ïŒã§ãã ã仿¥ã¯BOXILã®éçºããŒã ãç¹ã«ãšã³ãžãã¢ãä»ã©ãããããšãèããŠã©ããªéçºãããŠããã®ãããããŠããããã©ããªã£ãŠããããšããŠããã ãã玹ä»ããŸãã ã¹ããŒããã£ã³ããšããååãèããããšããã人ãèå³ããã人ã«èªãã§ãããããšå¬ããã§ãã åãããŠèªã¿ãã BOXILéçºããŒã ã®ä» éçºäœå¶ éçºããã»ã¹ã»ã¹ã¿ã€ã« ä»ã®èª²é¡ ããããããšã«å¯ŸããŠã®ãªãœãŒã¹äžè¶³ æè¡è² åµ BOXILéçºããŒã ã®ãããã æ¡çš æ¹åæŽ»å: æè¡ æ¹å掻åïŒããã»ã¹ ãããã«: å®£äŒ BOXILéçºããŒã ã§ãåŸ
ã¡ããŠããŸã ãšã³ãžãã¢ã€ãã³ããã£ãŠããŸã åãããŠèªã¿ãã tech.smartcamp.co.jp æšå¹Žæ«ãŸã§ã®ãBOXILéçºããŒã ã®ãããŸã§ãããçŸProduct Managerã®ç¬¹åãæžããŠããã®ã§äžç·ã«èªãã§ãããããšå¬ããã§ãð BOXILéçºããŒã ã®ä» ä»ã®éçºããŒã ãã埳ç°ã®ç®ç·ã§æ¯ãè¿ã£ãŠã¿ãŸãã éçºäœå¶ çŸåšããBOXILéçºããŒã ãã¯3ã€ã®åœ¹å²ãæã€ããŒã ãå®çŸ©ãããŠããŸããïŒå
ŒåãããŸãïŒ 1. Product Manager ãã¹ã¯ã©ã ã«ãããPOã®åœ¹å²ã§ãã CS, Salesçãšã®ã³ãã¥ãã±ãŒã·ã§ã³ã仿§(=Product Backlog)ã«é¢ãã責任ãæã¡ãŸãã çŸåšãProduct ManagerãšããŠäžåãæ
ã£ãŠããŸãã 2. Designer Team ã https://boxil.jp , https://boxil.jp/mag ã®UIããBOXILã«ããããLPãã€ãã³ãã§äœ¿çšãããã©ã·çã®ãã¶ã€ã³ãè¡ãããŒã ã§ãã ãã¶ã€ã³ãèŠãç®ã®è²¬ä»»ãæã¡ãŸãã çŸåšãäžåïŒæ¥åå§èšã¡ã³ããæ
ã£ãŠããŸãã 3. Developer Team ãããããããŒã®éãŸããæè¬ãšã³ãžãã¢ã§ãã Product ManagerãDesignerãäœã£ã仿§ã»ãã¶ã€ã³ãå®è£
ãã責任ãæã¡ãŸããã¹ã¯ã©ã ã§èšããšããã®PBLã®æ¶åã§ãã çŸåšãæ£ç€Ÿå¡äºåãšæ¥åå§èšã¡ã³ãã«å ããŠProduct Managerãå
Œä»»ã§æ
ã£ãŠããŸãã ãè£è¶³: çŸæç¹ã§ã¯ã¹ã¯ã©ã ãã¹ã¿ãŒã®åœ¹å²ãæã£ãŠããã¡ã³ãã¯ããŸããã æšå¹ŽãããæäŒãããã ããŠãã ã¢ãžã£ã€ã«ã³ãŒã ã«ã¯ãä»ã¯äž»ã«POåŽã®æ¹å掻åã«æ³šåããŠããã£ãŠããŸãã ïŒã¹ã¯ã©ã ãã¹ã¿ãŒã¯ä»»åœãããã®ã§ã¯ãªãèªç¶çºççã«çããŠãããã®ã§ãçããŠããªããã¡ã¯ããŒã å
šäœã§è£ããã倧äžå€«ããšããèªèã§ããïŒ éçºããã»ã¹ã»ã¹ã¿ã€ã« ã¹ã¯ã©ã ãéçºããã»ã¹ã®ããŒã¹ã¯ã¹ã¯ã©ã ã§ãã æ¯é±éææ¥ã« Sprint Review, æ¯ãè¿ã, Planning ã宿œããã以å€ã®æãæšã«äœæ¥ãè¡ã£ãŠããŸãã ã¢ãããã»ãã¢ããã»åäººäœæ¥ ã3~4ã¶æã»ã©ã¢ããããç©æ¥µçã«åãå
¥ããŠããŸããããå°ããã€ã¢ãã§ããããšã»ãããªãã»ããæ©ãã§ããããšã®èªèãã¡ã³ãéã§åã£ãŠããããšããããæè¿ã¯å°ããã€å人ããã¢ã§ã®éçºãå€ããªã£ãŠããŸãã ãä»ã¯Developer Teamã®äžã§ãæ£ç€Ÿå¡äºåããŒã ã»Product ManagerïŒæ¥åå§èšã¡ã³ãããŒã ã®2ã€ã«åãããŠãæ
åœããéçºç¯å²ãåããŠéçºããŠããŸãã ãã¢ã§ããããåäººäœæ¥ïŒã¬ãã¥ãŒã§ããããããã®ããŒã éã§å¥œãã«æ±ºããŠãã£ãŠããŸãã ããŒã éã®é£æºã¯éæå¿
èŠã«å¿ããŠããã¥ã¡ã³ããæžããŠå
±æããŠããŸããä»é±ããã¯éææ¥ã«æéãåã£ãŠããããã«ãªããŸããã ãåè: 実践して分かったモブプログラミングのメリット・デメリット - SMARTCAMP Engineer Blog æ¯ãè¿ã tech.smartcamp.co.jp ããã¡ããã¡ãæ¯ãè¿ã£ãŠããŸãã æäŒïŒDaily ScrumïŒãæ¯é±ã®æ¯ãè¿ããKPTçã¯å®å®ããŠãã£ãšåºç¶ããŠãããäžã¶æãçµã€ãšããŒã ã®åœ¢ãããã»ã¹ãããªãå€ãã£ãŠããŸãã ãæ°æã¡ãæžãSlack ChannelãçèªããŠãæ¥ã
å¿ãèšèã«ããŠãåŸã§æ¯ãè¿ã£ãŠããŸã ä»ã®èª²é¡ ããããããšã«å¯ŸããŠã®ãªãœãŒã¹äžè¶³ ãæšå¹Žæ«ã«ãããã¯ããããŒãžã£ãçèªããã¢ãžã£ã€ã«ã³ãŒãã»ãã¶ã€ããšå
±ã«POã®ãµã€ã¯ã«ãåã£ãŠããããšã§ãéçºããŒã å
šäœã®ããã«ããã¯ãDeveloper Teamã«å¯ã£ãŠããŸããã ïŒæè¿ã¯ PdM, Designer, ã³ãŒãã§ Opportunity Canvas ã Lean Canvas ãäœæããŠããŠãBacklogã®è³ªãã©ãã©ãäžãã£ãŠããŠããŸãðïŒ ãéçºé床ãäžããŠããããã®æœçã¯ããã€ãèµ°ã£ãŠããŸããããããããšæã£ãŠããããšã®å
šãŠãDeveloper Teamã ãã§ããªãããšã¯ã§ããŠããããïŒå
ïŒéçºãªãŒãã§ãããProduct Managerã«äžéšæ©èœéçºãæäŒã£ãŠããã£ãŠããç¶æ³ã§ãã æè¡è² åµ ã è€æ°ãµãŒãã¹ãå¯çµåããŠãã ããšããViewã«ããªãã®ããžãã¯ãæ®ã£ãŠããããšãããéçºããã¹ãã«å€§ããªåœ±é¿ãåºãŠããŸãã 課é¡ãšãªãç®æã«ããããæ©èœæ¹ä¿®ãè¡ãéã¯ãªãã¡ã¯ã¿ãªã³ã°ãäžèŠãªã³ãŒãã®åé€ãããŠãããå°ããã€æ¹åã¯ãããŠããŸããããŸã ãŸã ãããããšã¯å€ãã§ãã BOXILéçºããŒã ã®ãããã æ¡çš ããŸãã¯ãProduct Managerãéçºã«ãå
¥ã£ãŠããç¶æ
ãè±ããã®ãDeveloper TeamãšããŠã®ç¬¬äžã®ç®æšã ãã®ããã«ãä»ã®ã¡ã³ãã§éçºãããããããã«ã§ããããšã¯ãããšåæã«ãæ¡çšããã£ãŠããããšã«ãªããŸãã çŸæç¹ã§ã¡ã³ããå
šå¡æ¡çšã®é¢æ¥ã«å
¥ã£ãã話ããããããŠããŸãããäŒç€Ÿãã®ãã®ãç¥ã£ãŠããã£ãããèå³ãæã£ãŠãããããã®æŽ»åãéçºãšã¯å¥è»žã§ãã£ãŠããå¿
èŠããããŸãã ïŒå
·äœçã«ã¯ ãã®ãšã³ãžãã¢ããã° ãããã§ããã ã«ã³ãã¡ã¬ã³ã¹ãžã®ã¹ãã³ãµãŒ ã èªç€Ÿéå¬ã®ãšã³ãžãã¢ã€ãã³ã çããããããšã¯ãã£ãŠããŸãããä»åŸãç¶ç¶ããŠãã£ãŠãããïŒãšããæå³ã§ãïŒ æ¹å掻å: æè¡ ãä»ã§ãéçºã®åéã®ãªãã¡ã¯ã¿ãªã³ã°ã¯ç©æ¥µçã«å®æœããŠããŸããããã£ãšçŽããéšåã¯å€ããããŸãã ããçšåºŠã¢ããªã¹ã§ã®æ¹åãã§ããããã·ã¹ãã ã»çµç¹ã®åå²ãè¡ãã人ãå¢ããããŒã ã倧ãããªã£ãŠãéçºãæ©ãé²ãããããããªåœ¢ã«ã¢ããªã±ãŒã·ã§ã³ãå€ããŠããå¿
èŠããããŸãã ãRuby on Railsã®ã¬ã€ã€ä»¥å€ã§ããã¯ãªãã£ã«ã«ãªã€ã³ãã©åšãã®æ¹åãªã©ããã£ãšãã£ãŠãããã...ãšæã£ãŠããŸãã æ¹å掻åïŒããã»ã¹ ããªãã¡ã¯ã¿ãªã³ã°ã®éå£ã®äžã€ã«ãè€éãªå²ã«ä»æ§ããœãŒã¹ã³ãŒãã«ä»¥å€ã«ãªãããšããããããŸãã tech.smartcamp.co.jp ããã®ãããªã³ããŒãã£ã³ã°ããã»ã¹ã«ãããŠãçŸç¶ã®ä»æ§ãå
±æããŠããææ®µãã¢ãããã»ãã¢ããã§çŽæ¥äŒãããããããä»ã¯ç¡ããïŒæçµçã«ã¯ã©ãã§ãããããªãã®ã§ããïŒé¢é£ããæ©èœã®ãœãŒã¹ã³ãŒããå
šéšèªãŸãªããšå
ã«é²ããªãç¶æ³ã«ãªã£ãŠããŸãã ãŸãã人ã«ãã£ãŠä»æ§ã®ç解床ã«å·®ããããèæ
®æŒããçºçãããããããšããããŸãã ãããã解決ããããã æ§é åããããã¹ã ããéèŠãªä»æ§ã®ããã¥ã¡ã³ããæŽåããŠããããšããŠããŸãã ãããã«: å®£äŒ ãBOXILéçºããŒã ãç¹ã«Developer Teamç®ç·ããã®ã話ãå²ãšé·ã
ãšæžãããŠããã ããŸãããã€ã¡ãŒãžã¯æ¹§ããŸãããïŒ æ®ãã¯å®£äŒã§ããããããã§ãã©ãŠã¶ããã¯ããã«ãèªãã§ããããšå¬ããã§ãð BOXILéçºããŒã ã§ãåŸ
ã¡ããŠããŸã ã解決ããªããšãããªã課é¡ã¯ããçšåºŠèŠããŠããŸããããšãããã人ãè¶³ããªãããšããã£ãŠãããç¯å²ã¯ãã¡ããã¡ãåºãããŒã ã§ãã ãŸã課é¡ã«å¯ŸããŠããã€ãæžãããŠãã解決çã¯ãä»ã®ç¶æ
ã§æåã ãšæãããæ¹ã§ãã ããã£ãšããããã»ããè¯ãããšãããããã¯åŸæã ããããããããšãã¯åãã§èããé©åã§ããã°å³åº§ã«å®è¡ããããã ããããªãäžç·ã«èããŠãããçµç¹ã§ãã èå³ãæã£ããå°ã話ãèããŠã¿ãããšæã£ãæ¹ã¯ãã²æ°è»œã«ã話ããŸãããïŒïŒïŒïŒïŒ hrmos.co ãšã³ãžãã¢ã€ãã³ããã£ãŠããŸã smartcamp.connpass.com 2/21ã«ãã¹ããŒããã£ã³ãã§éå¬ãããšã³ãžãã¢åãã®ã€ãã³ããè¡ããŸãã æ¡çšæèã§ã€ãã³ãã®ããšæžãã¡ãã£ãã㩠管çç»é¢ãšãããã©ãŒã ãšããä»äºã§ããããããŠãã人ã¯ãã²æ°è»œã«æ¥ãŠãã ããðððððððð
ã¹ããŒããã£ã³ã20åãšã³ãžãã¢ïŒçŸã€ã³ã¿ãŒã³çïŒã®é«ç ã§ãïŒ ç§ã¯å
æ¥ãå¿çšæ
å ±æè¡è
詊éšã«åæ ŒèŽããŸããïŒ å¿çšæ
å ±æè¡è
詊éšã®åéšãæ€èšããŠããæ¹ãããã«ã€ããŠç¥ãããæ¹ã®åèã«ãªãã°ãšæãããªããããåéšããã®ããã©ã®ãããªåŠç¿ãè¡ã£ããããŸãšããŠããããšæããŸãã åéšç®ç ITç¥èã®ç¿åŸ ãã£ãããš åŠç¿èšç»ãäžå¯§ã«ç«ãŠã åå詊éšã¯2åã®æ¬ãèªã¿èŸŒãã ååŸè©Šéšã¯éžæé åã®ã¿å匷ãã çµæ ç¥èã ãã§ã¯ãªãèªä¿¡ã身ã«ä»ãã åéšç®ç ITç¥èã®ç¿åŸ ãå¿çšæ
å ±æè¡è
詊éšïŒä»¥äžãAPïŒããšã¯ãæ
å ±åŠçæè¡è
ãšããŠã®ç¥èã»æèœãäžå®ä»¥äžã§ããäºãèªå®ããåœå®¶è©Šéšãã§ãããæ
å ±åŠçæè¡è
詊éšãã®äžçš®ã§ãã ãæ
å ±åŠçæè¡è
詊éšãã¯10çš®é¡ä»¥äžã®è©Šéšåºåã«åãããŠããŸãããAPã¯ITå
šè¬ã«å¯ŸããŠå¿çšçãªç¥èã»æèœããã€äººã察象ãšããäœçœ®ä»ãã§ãã æ
å ±åŠçæè¡è
詊éšåºå åŒçšå
ïŒ IPA ç¬ç«è¡æ¿æ³äºº æ
å ±åŠçæšé²æ©æ§ïŒæ
å ±åŠçæè¡è
詊éšïŒè©Šéšã®æŠèŠ ç§ããããåéšããç®çã¯ããšã³ãžãã¢ãšããŠåãäžã§ã®ã³ãã¥ãã±ãŒã·ã§ã³ã«å¿
èŠãªITç¥èã®ç¿åŸãã§ãã ç§ã¯å°éãæ
å ±ç³»ã§ã¯ãªãç¥èã«ä¹ããçºãã€ã³ã¿ãŒã³ãããäžã§å
茩ãšã³ãžãã¢éãšã®äŒè©±ã«ã€ããŠãããªãããããã¯äžæãäŒããããªãäºãå€ã
ãããŸããã å
茩ãšã³ãžãã¢éã«çžè«ããçµæãAPã«åæ Œã§ãããããã®ç¥èãããã°ããã解決ã§ãããšããçµè«ã«ãªããŸããã ãªã®ã§åŠç¿ã®åãããããç®æšãšããŠãAPåæ Œãç®æããŸããïŒ ãã£ãããš åŠç¿èšç»ãäžå¯§ã«ç«ãŠã APã®è©Šéšç¯å²ã¯ããªãåºããç¹ã«æªçµéšãšã³ãžãã¢ã«ãšã£ãŠã¯ãšãŠã€ããªãèšå€§ã«æããããŸãã詊éšç¯å²ã¯å€§ããåãããš3ãžã£ã³ã«ãããããããäžäŸãšããŠã¯ã ãã¯ãããžç³» ã¢ã«ãŽãªãºã PCã®ä»çµã¿ DB/NW/ã»ãã¥ãªã㣠éçºç®¡çæè¡ ãããžã¡ã³ãç³» ãããžã§ã¯ããããžã¡ã³ã ã·ã¹ãã ç£æ» ã¹ãã©ããžç³» ã·ã¹ãã æŠç¥ çµå¶æŠç¥ æ³å ã®ãããªé åã詊éšç¯å²ã§ãããããç³»åã®è©Šéšã§ããITãã¹ããŒã詊éšãåºæ¬æ
å ±æè¡è
詊éšïŒä»¥äžãFEïŒãšæ¯ã¹ããšãAPã¯ããæ·±ãçè§£ãæ±ããããã®ã§çåå¯ãªåŠç¿ã§ã¯åæ Œã§ããŸãããåŸè¿°ããåèæžã800ããŒãžãè¶
ããäºãããããã®è©Šéšç¯å²ã®èšå€§ããäŒããããšæããŸãã åŠç¿ã¯è©Šéšæ¥ã®çŽ4ã¶æåããå§ããæåã¯åèæžãã®ãã³ããšèªãã§ããŸããã ãããããã§ã¯åŠç¿é²æã®å®éçãªæž¬å®ãåºæ¥ãã¢ãããŒã·ã§ã³ãç¶ããªãäºããã2ã¶æåããã¯ãã®ããã«ããããªåŠç¿èšç»ãç«ãŠãŠé²ããããã«ããŸããïŒæ°åã¯éå»åã®ç®æšæ£è§£çïŒã åŠç¿èšç»ïŒæç²ïŒ åå詊éšã¯2åã®æ¬ãèªã¿èŸŒãã åå詊éšã®å匷ã«ã€ããŠã¯ãŸãFEã®åèæžãæ¬¡ã«APã®åèæžã䜿ã£ãŠå匷ããŸãããå°ããããã¯åŒç€Ÿã®ãæžç±è³Œå
¥ç¡æå¶åºŠãã«ãŠçšæããŠé ããŸããã gihyo.jp gihyo.jp ãªãç³»å詊éšã®æ¹ã®åèæžãçšããã®ããšãããšãããã¯FEãAPãšç¯å²ã¯äžç·ã§ããã€æ·±ãã¯æµ
ãããã§ãã APã¯äœå¹Žãçµéšã®ãããšã³ãžãã¢ãäž»ãªå¯Ÿè±¡ãšãã詊éšãªã®ã§ãAPã®åèæžãåæ§ã«èª¬æãäžéšçç¥ãããŠãããšæããŸããã ãªã®ã§æªçµéšãšã³ãžãã¢ãšããŠã¯ãŸãFEã®åèæžã§åºãæµ
ãåŠç¿ããæ¬¡ã«APã®åèæžã§åºãæ·±ãåŠç¿ããäºã«ããŸããã å ããŠæ¯é±æ«ã«éå»åãè§£ãããã®æ£è§£çã§åŠç¿é²æã®æž¬å®ãå®éçã«è¡ããŸããã 倧ããåéããšåŠç¿é²æïŒæç²ïŒ 倧ããåéããšã®æ£è§£çã§åŠç¿èšç»ã«å¯ŸããéæåºŠåãã確èªãã€ã€ãå°ããåéããšã®æ£è§£çã§ã©ã®åéãèªåã¯èŠæãªã®ããææ¡ããäºã§ããããéç¹çã«åŠç¿ãããªã©åŠç¿èšç»ãä¿®æ£ãã€ã€ãŸãã¹ããªãç¥èãä»ããŠãããŸããã å°ããåéããšã®åŠç¿é²æïŒæç²ïŒ ååŸè©Šéšã¯éžæé åã®ã¿å匷ãã ååŸè©Šéšã¯è§£ãåé¡ãéžã¹ãçºãç§ã¯ä»äºã«ç¹ãã5ãžã£ã³ã«ïŒæ
å ±ã»ãã¥ãªãã£ãããŒã¿ããŒã¹ãæ
å ±ã·ã¹ãã éçºãããã°ã©ãã³ã°ããããžã§ã¯ããããžã¡ã³ãïŒãå
茩ãšã³ãžãã¢éãšå
±ã«æ±ºãããã®é åã®ã¿éäžçã«å匷ããŸããã ååŸè©Šéšã¯èšè¿°åŒã®èšåãããçºãåå詊éšãããæŽã«æ·±ãçè§£ãå¿
èŠã«ãªããŸãã ãªã®ã§éžãã é åã«ã€ããŠã¯ãã åŠç¿ããã ãã§ã¯ãªããèŠèŠãã®ç¡ãåèªããªããªãäœããšã«ããåãããªãèšèãä»çµã¿ãããã°åŸ¹åºçã«èª¿ã¹ãããã«ããŸããã ãŸãããããåå詊éšãšåæ§ã«å®éçãªåŠç¿é²æã®æž¬å®ã§èŠæåéã¯éç¹çã«åŠç¿ããŸããã çµæ ç¥èã ãã§ã¯ãªãèªä¿¡ã身ã«ä»ãã ãããã®åŠç¿ã«ãã£ãŠçµæçã«ã¯åæ Œã§ããç®çã§ãã£ãITç¥èã®ç¿åŸãåºæ¥ãŸããïŒ ãã æ£çŽãªãšãããåŠç¿äžã¯ãã£ãšèªä¿¡ããªããåéšåŸãåæ Œéç¥ãæ¥ããŸã§ã¯åæ ŒãããšãæããŠããŸããã§ããâŠã ããããæ
å ±åŠçæè¡è
ã®åœå®¶è©Šéšã«åæ Œããããšããäºå®ãèªåã«åæ°ãäžããŠãããå
茩ãšã³ãžãã¢éãšã®ã³ãã¥ãã±ãŒã·ã§ã³ãèªä¿¡ãæã£ãŠè¡ããããã«ãªããŸããã APã®åæ Œãç®æãã«ã¯å€å€§ãªåªåãå¿
èŠã§ãããããã«ãã£ãŠåŸããããç¥èããšãèªä¿¡ãã¯åªåãå ±ãããã ãã®äŸ¡å€ãååã«ãããšæããŸããïŒ ãªã®ã§ããåéšãè¿·ãããŠããŸããããæ¯éäžæ©èžã¿åºããŠæ¬²ãããšæã£ãŠããŸãããã®èšäºããã®åèã«ãªãã°å¹žãã§ãã
ããã«ã¡ã¯ãã¹ããŒããã£ã³ãã§ https://boxil.jp/ ãäœã£ãŠãã埳ç°( @haze_it_ac )ããšããšã£ãŠãã§ãã ãã®å æäŒ ã§ãååãšã¿ã³ããããŠæ¥œããã£ã話ãããã倧åŠçãšèšãããŸããã ãåç¥ã®æ¹ãããã£ãããããšæããŸãããã¹ããŒããã£ã³ãã¯2019幎11æã«ãããŒãã©ã¯ãŒãã°ã«ãŒãã«ãžã§ã€ã³ããŸããã boxil.jp ã°ã«ãŒãéã®ãšã³ãžãã¢äº€æµã®äžç°ãšããŠããŸããã¹ããŒããã£ã³ãã®åçã®äž»è»žã§ãããBOXILã®ããšããããŒãã©ã¯ãŒãã®äººãã¡ã«ãç¥ã£ãŠããããïŒãšããããšã§ãBOXILã®ãœãŒã¹ã³ãŒããå®éã®ç»é¢ãçºããªããã課é¡ã話ãããè°è«ãããäŒãéå¬ããŸããïŒ BOXILã®ç»é¢ãå®éã«èŠãªãã説æãããæ§å åœæ¥ã¯ã¹ããŒããã£ã³ãããããŒãã©ã¯ãŒãåãããŠ20åãè¶
ãã人æ°ã«éãŸã£ãŠããã ããŸããã æåã«ç§ãäŒã®è¶£æšãšBOXILéçºããŒã ãæããŠããçŸç¶ã®èª²é¡æãBOXILãã®ãã®ã®æŠèŠã説æããå
šå¡ã§GemfileããDBã®ããŒãã«ãšã«ã©ã ãèŠããã éäžãã4ã°ã«ãŒãã«åãããŠã¢ãããã®åœ¢åŒã§ãœãŒã¹ã³ãŒããç»é¢ãèŠãŠããããããŸããã ãªãå
¥ã£ãŠããã®ãããããããªãGemfileãèŠã€ãã£ããïŒïŒïŒãç¹å®ã®ã¡ã³ãããç¥ããªãæŽå²ãçºæãããã倧å€ãããªããžãã¯ãçºããããšããšãŠãçãäžãããŸããã ãããŒãã©ã¯ãŒããšã®ãšã³ãžãã¢äº€æµã¯ä»åŸãåŒãç¶ããã£ãŠããäºå®ã§ãïŒãããã Meetupã®å®£äŒ smartcamp.connpass.com 2/21(é) ã«BtoB SaaS ãšã³ãžãã¢Meetupã®ç¬¬3åã宿œããŸãïŒ ç»å£ãéåžžåå ã©ã¡ãããŸã ãŸã 空ããŠããã®ã§ãæ°è»œã«ãåå ãã ãã ð
ããã«ã¡ã¯ãã¹ããŒããã£ã³ãã®äžå·ã§ãïŒ æ®æ®µã¯BiscuetéçºããŒã ã§ãšã³ãžãã¢ãããŠããŸãã å
æ¥1æ22æ¥ã«ããã¯ããã°ã®éå¶ã«ãŸã€ããããã«ãã£ã¹ã«ãã·ã§ã³åœ¢åŒã§ããŒã¯ããã€ãã³ããTech Blog Night ãç¶ç¶çã«ç€Ÿå€ãžã¢ãŠããããã§ããããŒã ãäœããããéå¬ãããŸããã lapras.connpass.com LAPRASäž¡è§ãããã¯ãã¯ãããåéããããããŠåŒç€Ÿã¹ããŒããã£ã³ããã笹åãç»å£ããå¢åžããŠãåå æœéžæ ãªãŒããŒã®äººæ°ã€ãã³ããšãªããŸããã æ¬èšäºã¯ãã®ã€ãã³ãã¬ããŒããšããŠãåãããã¯ããšã«å人ã話ãããŠããå
容ãç°¡åã«ãŸãšãããã®ã«ãªããŸãïŒ ããã°ç«ã¡äžãã®çµç·¯ã«ã€ããŠïŒããã°ãå§ããçç±ãšçã£ãŠãã广ã¯ïŒïŒ ããã¯ããã°ã®éçšæ¹æ³ïŒé »åºŠãæ
åœè
ãèšäºå
å®¹ã®æ±ºãæ¹ã瀟å
ã®èª¿æŽãã¡ã³ããŒã®ã¢ãããŒã·ã§ã³ç¶æãªã©ïŒ ããã¯ããã°ã«ããåŸããã广ã«ã€ã㊠éå»ã«ãã£ãèŠåŽã倱æã«ã€ã㊠äŒå Žè³ªå éçšæ
åœãé 匵ã£ãŠãã£ã±ãæžããªãããããªãåé¡ã«ã¯ã©ããããããïŒ KPIã¯ã©ãããŠããïŒ ããã°ãæžãããšã§ã®è©äŸ¡ã¯ã©ãããŠããïŒ ãŸãšã ããã°ç«ã¡äžãã®çµç·¯ã«ã€ããŠïŒããã°ãå§ããçç±ãšçã£ãŠãã广ã¯ïŒïŒ åéããïŒ ããã¯ããã°èªäœã¯2008幎ããç«ã¡äžãã£ãŠãã åéãããå
¥ç€Ÿããå 2008幎æç¹ã ãšç€Ÿå¡50åããšã³ãžãã¢4åã®æä»£ 䞻婊ã¯ç¥ã£ãŠãããã©ãšã³ãžãã¢ã«ã¯ããããããªããç¥å床ããªããµãŒãã¹ã ã£ã ç®çãšããŠã¯ ãšã³ãžãã¢ã®æ¡çš èªåãã¡ã®ãã¬ãŒã³ã¹ãäžããŠæ¡çšã«ã€ãªããçã åéããèªèº«ãããã°çµç±ã§å
¥ç€Ÿãã æ¡çšã€ãã³ããããŸãïŒã®åç¥ãšã³ããªãèŠãŠ åœæç®æ°ããã£ãRailsã䜿ã£ãŠãªãã¥ãŒã¢ã«ããŠããŠããããªããšèå³ããã£ã 笹åïŒ èªç¥ç²åŸãç®ç äºæ¥é åãtoBã®SaaSãããŒã±ãã£ã³ã°ãã¡ãã£ã¢ãªã®ã§ãšã³ãžãã¢ãå
šç¶ã¹ããŒããã£ã³ããç¥ããªãããšã課é¡ã ã£ã ããã«ããŠèªç¥ãç²åŸããŠãããïŒ ãšã³ãžãã¢ããã°ãšããææ®µãããããããšã¯ãããªããªãåºæ¥ãªããããšãã話ã¯åã
ããããŠãã ãããã§å
éšã®æ°äººã§å§ãã ãã¡ã€ã³ãååŸããŠã¯ãŠãªããã°ã®Proãã©ã³ã賌å
¥ããŠã¹ã¿ãŒããã å人çãªæãããã£ã ãšã³ãžãã¢ãšããŠããã°æžããŠã¿ãããçºä¿¡ããŠã¿ãããšããæ°æã¡ 瀟å
ã«ããã¥ã¡ã³ãæžãæåãæ ¹ä»ãããã ç¥èŠãããã°ã«æçš¿ããæµããåºæ¥ãã°ããã¥ã¡ã³ã代ããã«ãããã°ã®ãã®èšäºèŠãŠãããšããäœ¿ãæ¹ãåºæ¥ãããããªãããšãã仮説ããã£ã ããã¯ããã°ã®éçšæ¹æ³ïŒé »åºŠãæ
åœè
ãèšäºå
å®¹ã®æ±ºãæ¹ã瀟å
ã®èª¿æŽãã¡ã³ããŒã®ã¢ãããŒã·ã§ã³ç¶æãªã©ïŒ åéããïŒ 2008幎ã¹ã¿ãŒãã ããäœåãå·çãæ¢ãŸãæããã£ã å®ã¯ãããã°çãäžããŠãããïŒãå·ä»€ãä»ãŸã§ã«4,5ååºãŠãã 2009~2011幎ãããã¯äººäºã»åºå ±ãäž»äœãšãªã£ãŠå·ä»€ããããŠãšã³ãžãã¢ãæžã
ãããã¿ãããªæãã ã£ã èšãããããããããå®åžžåããŠããŠãªããªãæ ¹ä»ããªãã£ã ããã§ãCTOãäž»å°ãšãªã£ãŠãšã³ãžãã¢ãžã®ãã¬ãŒã³ã¹äžããããã«æžãããïŒãš åœçªè¡š ãäœã£ã åæã®ã¯ããã«åœçªè¡šã®CSVãåãåºããããã¿ããããã°ã©ã ããã æè¡åŽã®ããããçµ±å¶ããããšãããã£ã æ¥åãšããŠæžããŸãããããšããã¹ã¿ã³ã¹ã ã£ãã®ãããã£ã è©äŸ¡ã«ãå«ãŸãã çãäžãã£ãŠããã®ã§æè¿ã¯ãšã³ãžãã¢ä»¥å€ã«ããµãŒãã¹ãã£ã¬ã¯ã¿ãŒãªã©ãæçš¿ããŠãã ãšã«ãã æžãããšã倧äºã ãšããæå ããã æžãããã®ã«å¯Ÿãããã§ãã¯ãšãã¯ãªã 2é±éã«1åãšã³ãžãã¢å
šå¡ãéãŸãMTGããã£ãŠãã®ãªãã§ããã¯ããã°ç޹ä»ã³ãŒããŒããã æžããŠããã°èŠãŠãããããæžããŠãªããã°ãã®å Žã§ãã¬ã 笹åïŒ é »åºŠã¯é±1åºå®ã§åºããŠãã åãã1ã¶æåã¯èª°ããªã«ãæžãã倧ãŸãã«æ±ºããŠãã äžç·ã«èããã»å¯ãæ·»ãå§¿å¢ãå¿ãããŠãã ãšã¯ããæžããªããšãã¯ãã ãã®å Žåã¯äžå¿ã¡ã³ããŒãé 匵ã£ãŠæžããŠãã ããŒã å
šäœã§æžãç¶ããããšã§æåãšããŠå®çãã æåã¯é±ïŒã§æžãã®ãããã©ãã£ããã12æã«ã¯ã¢ããã³ãã«ã¬ã³ããŒãæ¢è¡ãæžããããããã«ãŸã§ãªã£ã æåã¯ã€ã³ã»ã³ãã£ããçšæããŠãã èšäºãåºããŠã鳎ããé£ã°ãã ã£ããšãã«ãããŒãžã£ãŒã«ãé¡ãããŠã 1èšäºã§100ãã¯ãçªç Žããã寿åž100貫奢ã£ãŠããã çŽæãåãä»ãã ããããããã®ã§ç®æšã«åãã£ãŠé 匵ãããã«ãªã£ã ãã©ã³ãã£ã³ã°ãªã©ã¯æåæã¯äœãèãããã£ãŠã ææµã«ä¹ã£ããã€ã¯äŒžã³ããã ããããšããæèã¯ãã£ã ã¯ãŠãã䌞ã³ããããŒã¹ã§èããŠãã æè¿ã¯ãšã³ãžãã¢ãæ®æ®µã®æ¥åã§äœãããŠãããçºä¿¡ã§ããèšäºãåºãããšãå¿ãããŠãã ããã¯ããã°ã«ããåŸããã广ã«ã€ã㊠åéããïŒ å§åçã«æ¡çšïŒã«å¹æããã£ãïŒ ãã¯ãã¯ãããã«èå³ãã£ããã£ããããèãããšãã®è¿çãã»ãŒããã¯ããã°ã«ãªã£ã ãã3幎ããã å®éã«ããããŠçŸè±¡ãšããŠèµ·ãã£ãŠããããããç¶ããŠãããªãããããšããé°å²æ°ã«ãªã£ãŠãã ããã¯ããã°ãçãäžãã£ãŠããããšã§ããããããä»èŸŒãã§ããããã¿ããªãªãŒã¹ããæµããã§ãŠãã 瀟å
ããã°ããããããã¡ãã¯æ
å ±ãå°åºãã«ããããšãå€ã ãã®å°åºãã«ãªã£ãæ
å ±ããŸãšãŸã£ãŠããã¯ããã°ã®èšäºãšããŠæäžããã 瀟å
ã®ã¡ã³ããŒã¯ãã®èšäºãèªãã§å
šå®¹ãç¥ããã¿ãããªããšããŸãŸãã (質å) 1ãšã³ãžãã¢ãèšäºãæžãé »åºŠã¯ïŒ 幎1åããã æžãé çªã¯èªç±ã«äº€æOK 笹åïŒ æç¢ºãªããã°çµç±ã§ã®æ¡çšã¯ãŸã ãªã ä»ãŸã§å
šãèªç¥ããªãã£ããšããããããããã¯ããã°ãã£ãŠãŸãããïŒãã¿ãããªèªç¥ãåŸãããããã«ã¯ãªã£ãŠãã ãšã³ãžãã¢ã«ããã¥ã¡ã³ããæžãåãã€ããŠãã ããã°ä»¥å€ã§ãããã¥ã¡ã³ããæ®ãããã«ãªã£ã ããã°ã«éçºããã»ã¹ãæ®ãããšã§ãæ¡çšé¢è«ãªã©ã®æã«ãã®èšäºãèŠãŠãããããšãåºæ¥ãããã«ãªã£ã å®éã«å
¬éãããŠããèšäºãèŠãŠãããããšã¯ãã©ã³ãã£ã³ã°ã®é¢ã§ã广ããããšæãã éå»ã«ãã£ãèŠåŽã倱æã«ã€ã㊠åéããïŒ è¯ããæªããããŒã ããªã¥ãŒãããããã°ã«ãªã£ãŠãã æžãæ·å±
ãã©ãã©ãäžãã£ãŠããŠãã ã¡ãããšæžããªããšãã°ããšæããšæžãã®ãæé¬±ã«ãªã£ãããã èªç¶çºçããæµããšããŠã Github Enterpriseã§ãã«ãªã¯ãäœã£ãŠèšäºæ¬æãã¬ãã¥ãŒããŠããã ç¿æ
£ããã ã¡ã³ããŒéã§ã¬ãã¥ãŒãã ã¬ãã¥ãŒãéããªããšäžå®ã«ãªãããã«ãªã£ãŠãã 笹åïŒ æåã®ç«ã¡äžãæã¯éçã«ããã©ãã£ã ããããã¯ããã«ãã©ã³ãã£ã³ã°ã«è²¢ç®ããŠããããèããªããšãããªã ä»ãŸã§ã¯ç¶ç¶ãèããŠãã°ããã£ã ããããã¯èšäºå
容ã粟æ»ããããšãå¿
èŠã«ãªã£ãŠãã äŒå Žè³ªå ããã«ãã£ã¹ã«ãã·ã§ã³ã®å
容ã¯ä»¥äžãšãªããŸãã 以äžã¯åå è
ã®è³ªåãäžéšæç²ããŠãéãããŸãïŒ éçšæ
åœãé 匵ã£ãŠãã£ã±ãæžããªãããããªãåé¡ã«ã¯ã©ããããããïŒ åéããïŒ åœçªå¶åºŠãåºæ¥ãåã¯æžããŠãããã®ãé£ããã£ã ãã®äžã§ ããã°ã¯ä»äºã®ã²ãšã€ãæžããªãã®ã¯ä»äºããŠãªããšåãããšã ãããšãã¬ãã·ã£ãŒãããã 笹åïŒ éå¶ãè€æ°äººããããšã¯ããã£ã 3人ã§30èšäº/幎ãããæžãããã1人ã ã£ããç¡çã ã£ã åšãããã£ã€ãã€ã€ãèªåãã¡ããããšç¶ãããã ãšã«ããæçš¿ã«ç©Žãéããªãã®ãå€§äº éçºå宿ãªã©ããããšãã¯èšäºãå
ã«ä»èŸŒãã§ãã KPIã¯ã©ãããŠããïŒ åéããïŒ ç¹ã«æ±ºããŠããªããŠãPVãã¯ãŠãã®æ°ãå
šç¶ã¿ãŠãªã 1å¹Žã®æ¯ãè¿ããšããŠã¯ãŠããå€ãã£ãèšäºãå·çãã人ã«ã¢ã¯ãŒããæäžããåãçµã¿ã¯ãã£ãŠãã æ¥åãšããŠKPIã远ã£ããã¯ããªã 笹åïŒ KPIã¯ãããç¹ã«è¿œã£ãŠã¯ããªã ã¯ãŠãæ°ãKPIã«ãªã£ãŠããŠãã¯ãŠããå€ã = ããºã£ã ãšã¿ãªãã°èªç¥ç²åŸã®ææšã«ãªã äŒç€Ÿã®ãã©ã³ãã£ã³ã°ç®ç·ã ãšKPIãéã£ãŠãã ãªãŒã¬ããã¯ããã®æµå
¥ãå°ãèŠãŠãã 瀟å
ã«ã¡ãã£ã¢éçšããŒã ããã ã©ãããã¿ã€ãã«ã ã£ããSEOãã€ããïŒã¿ãããªã®ã¯ç€Ÿå
ã®ã¡ã³ããŒãæããŠããã åãããããŒã¯ãŒãã¯ã¿ã€ãã«ã®å·Šã«å¯ãã ãªã©ãã¯ããã¯ããã ããã°ãæžãããšã§ã®è©äŸ¡ã¯ã©ãããŠããïŒ åéããïŒ è©äŸ¡å
容ã«ç€Ÿå
å€ã§ã®ã¢ãŠãããããšããé
ç®ããã ããã¯ããã°ã¯ãã®ææ®µã®ã²ãšã€ ã¡ãããšããèšäºã¯ã¢ãŠãããããšããŠè©äŸ¡ããããéã®å Žåããã ããã°ä»¥å€ã®è©äŸ¡å¯Ÿè±¡ãšããŠã¯OSSè²¢ç®ãã€ãã³ãã®ç»å£ããã 笹åïŒ å¶åºŠãšããŠã¯ããŸãèããããŠããªã è·äœã«ããã€ã¡ãŒãž ãžã¥ãã¢ã§ããã°ãèšäºãæžãããšããšãªããã·ãã¢ã§ããã°ãã£ãšé«ãç®æšã«ãªã éåžžã®è©äŸ¡ã«ãã©ã¹ãšããŠè©äŸ¡ããããšã¯ãããã©ãã¡ã€ã³èŠçŽ ãšããŠè©äŸ¡ããããšã¯çŸæç¹ã§ã¯ãªã ãŸãšã ããã¯ããã°ã®éçšã«é¢ããéåžžã«å®è·µçãªå
容ãèããŠæé«ã§ããã ãŸãããã®åŸã®æèŠªäŒã§ã話ããæ¹ã®ãªãã«ã¯ããããããã¯ããã°ãå§ããããšæã£ãŠããæ¹ãå€ãããã£ããã£ãŠããŠãæ¥çãšããŠããã¯ããã°ãå§ããæ©éãé«ãŸã£ãŠãããã ãªãšæããŸããïŒ åŒç€Ÿãå®é1幎éããã¯ããã°ãéå¶ããŠã¿ãŠã©ãã ã£ãããããŸãšãã以äžã®èšäºã䜵ããŠãã§ãã¯ããŠã¿ãŠãã ããïŒ tech.smartcamp.co.jp
ã¹ããŒããã£ã³ããšã³ãžãã¢ã®ä»å·( @ug23_ )ã§ãã å
é±ãRegional Scrum Gathering Tokyo 2020ã«ãã«åå ããŠããŸããïŒ 2020.scrumgatheringtokyo.org æ¬èšäºã§ã¯èããã»ãã·ã§ã³ãäžå¿ã«èããããšãã ç«ææ¥ãããã£ãããš ããŸãšããŸããã ããããšRSGT å
šã¹ã©ã€ã èããã»ãã·ã§ã³ Day1 keynote: The Ten Bulls of the Scrum Patterns ã¢ãžã£ã€ã«ã³ãŒã掻çšè¡ ã¿ãªããã®ãããã¿ãã¯ããããã¯ãã¯ãã¢ã€ãã ã¯Outcomeãçã¿åºããŠããŸããïŒ èŠç©ãããªãã¹ã¯ã©ã ã¢ãããã°ã©ãã³ã° x è¡ååæåŠ x æè² ç¹æ®éšéSETããŒã ã®æ¥åžžã- æè¡ãšå®éšãèåããå®è·µã¢ãžã£ã€ã«è¡ - A Scrum Bookã®æ©ãæ¹ Day2 Keynote: Lost in Translation: The Managerâs Role in Agile ããŒã ã®åå®çŸ© -é²åè«ãšã¢ãžã£ã€ã«- Team-Based TEAM - äŒç€Ÿãè¶ããããŒã - Day3 Open Space Technology NEXTâACTION å
šäœãéããŠ ç«ææ¥ãããã£ãããš ãŸãšã ããããšRSGT ä»åã®è©±ã®åã«ãç§ããªãRSGTã奜ããªã®ããæžããŸãã RSGTèªäœã¯2015幎ã«ååå ããŠããŸããå®ã¯ã»ãã·ã§ã³ã®äžéšã§è©±ããšããçµéšãããŠããŸããã 2015.scrumgatheringtokyo.org 倧åŠé¢ã®ã«ãªãã¥ã©ã ã§åŠçããŒã ã§1幎éã¹ã¯ã©ã ãå®è·µãããšããã§ã話ãã«ããŠïŒãšãããèªããåããŠæå¡ã®ã¿ãªãããšäžç·ã«ç»å£ãããŠé ããã®ã§ããã èŠããææã®æ¥ããã£ãããOSTã« å®è·µè
åã ã£ãŠæžããŠãã£ãŠæããŠåæ¥ããã§ãŠãªãã£ãããšæãããæ°æã¡ã«ãªããŸãããåœæåŠçã ã£ãç§ã«ã¯ããããã³ãã¥ããã£ã匷çã«å°è±¡ã«ã®ãããŸããã ã©ã³ãåºãã®ãããïŒ XPãšãã¹ã¯ã©ã ãšãã¢ãžã£ã€ã«ãšã絡ã¿åã£ãŠããã ãªãŒ ã¹ã¯ã©ã ã«ã¯ã¹ã¯ã©ã ãã¹ã¿ãŒãå¿
èŠã£ãŠèããã®ã«ã¹ã¯ã©ã ãã¹ã¿ãŒã¯èŠããªããšãèšã£ãŠãã è²ããªäººãå±
ãïŒãªããã¡ã€ãæçãŠã人ããã âŠãšãããšããã匷ãã£ãæãåºã 2016ã®ãã±ããã®é«ãã«ããããåŠçã§ãéãªããŠãããŠããŸãããã®åŸã¯ã¹ã¯ã©ã ããé¢ããŠããã®ã§åå ããªããªã£ãŠããã®ã§ããã2019ã§ä¹
ã
ã«åå ããŸããã 2015ãšã¯ããããéããªããšæãã€ã€ãåå ããã ãã§æ°æã¡ãæ¬åœã«ããäžãã£ãŠ å¹Žè¶ã ã®æèŠãå³ãããŸãããOSTã§åã£ããããŠãã¡ãïŒã€ãããŒãã«ãŒã€ã³ã°äºåºããïŒã®è©±ãèããŠããŒã ã§ä»äºãããïŒãšããæ°æã¡ã«ãªããŸããã ãããªããã§2020ãåœç¶åå ã ïŒãš11æã®æç¹ã§ãã±ããã確ä¿ããŠããã®ã§ããã ã¡ãªã¿ã«RSGT2020æéäžã«RSGT2021ã®Super Early Birdãã±ãããçºå£²ãããŸãããè²·ããŸããã§ããïœ å
šã¹ã©ã€ã ã¹ã©ã€ããå
¬éãããŠãããã®ããŸãšãããšã³ããªãã¹ã¯ã©ã ãã¹ããŒãããå
¬éãããŠããã®ã§ãªã³ã¯ããŠãããŸãã scrummasudar.hatenablog.com èããã»ãã·ã§ã³ Day1 keynote: The Ten Bulls of the Scrum Patterns confengine.com çïŒäœã®è©±ã ããïŒãšæããªããèããŠããŸããããåçå³ãšScrum Patternsã®è©±ã§ããã www.tees.ne.jp ãã¿ãŒã³ã¯èªå·±ãèŠã€ããããã®å©ãã«ãªããã® ã¯ãšãŠãè
ã«èœã¡ãŸãããç§ã¯åŠçæä»£4幎éè£åå®¶è¶éããã£ãŠããã®ã§ãããå®ç Žé¢ãæããªããçšœå€ãããŠããŸããããã¿ãŒã³ããªãã£ãŠ ããããã®å¥œãã»ããããã®æ¥œãããã ãšããã®ããããæèŠãæãèµ·ããããŸããã äžæ¹ã§ãã¹ã¯ã©ã ã«ãããŠã¯èªåã¯ã©ã®æ®µéã«ãããã ããããšãçãèŠã€ããïŒæãŸããïŒãã©ã®æ®µéã«ããããã倧äºã§ã¯ãªããšã¯ãããçŸåšå°ãææ¡ããããªãšããæ°æã¡ã«ãªããŸããã äœè«ã§ãããåæéèš³èããªããã¡ã¢åã£ãŠããšãã£ã±ãç²ããŸãããè±èªã§èãããæ°æã¡ãã§ãŠããã ã¢ãžã£ã€ã«ã³ãŒã掻çšè¡ slide.meguro.ryuzee.com åé ã® ã·ã£ãã¿ãŒé³ã«é
æ
®ããããšããèŠç¯ãå®ããŸããã ã®ã¢ããŠã³ã¹ã«å¯ãã«æéãåããŠããŸãããä»äºããäžã§ èŠç¯ãå®ã ãšããæèããã°ãããªãã£ããªãšæããç¬éã§ããã ã³ãŒãã³ã° ãšã¯ããšãããšããããéžã³æ¹ãŸã§è©³ãã解説ãããŠããŸããã確ãã«ã人ã«ã³ãŒãã³ã°ããŠããããªãããã ããªããšæãå
容ã§ããããã»ã£ãšããšäŸ¿å©å±ããã®ããã«äœ¿ã£ãŠããŸããã¡ãªã®ã§éžã°ãªããã°ãªããªãæãæ¥ããšãã«èŠè¿ãããšæã£ãå
容ã§ããã 瀟å
ã§ã¯ãµã€ããŠãºã®å€©éããã«ã³ãŒãã³ã°ããŠããã ããŠããŸãããé¢ããæ¹ã¯ééã£ãŠããªããã§å®å¿ããŸããã tech.smartcamp.co.jp ã¿ãªããã®ãããã¿ãã¯ããããã¯ãã¯ãã¢ã€ãã ã¯Outcomeãçã¿åºããŠããŸããïŒ speakerdeck.com ãã€ã€ ãšããæŠå¿µã玹ä»ãããŠããŸãããã©ãããã䟡å€ãããã®ïŒãšããã®ããéé¡ã§æž¬ããªãã£ãããããšã§è°è«ãããšãã«å¿ããã¡ãªã®ã§å°å
¥ããã»ãããããšããããããã ãšæããŸããã Guild Worksããã¯ããããªçŸå Žãæ¯æŽãããŠããŠããããªããšããææ³ãæã¡ãŸããã èŠç©ãããªãã¹ã¯ã©ã speakerdeck.com èŠç©ããã®èŸãéšåãåé¿ã§ããŠããããæå¹ã«åã£ãŠããã®ãããããŸããããããŠååã®RSGTã®è©±ããå®è·µããŠãããçºè¡šããŠããæ§é èªäœãçŽ æŽãããç¹ã§ãã Scrumã®5ã€ã®äŸ¡å€åºæºãããã®æœçã®æå¹æ§ã説æããŠããã®ããšãŠãããã£ãã§ãïŒ èŠç©ãããããçš®ã®ãã£ãŒãããã¯ã·ã¹ãã ãã®ããã«èããã®ãããªããšæã£ããããŸããã ã¢ãããã°ã©ãã³ã° x è¡ååæåŠ x æè² ã¢ãããã°ã©ãã³ã° x è¡ååæåŠ x æè² from Takuo Doi www.slideshare.net ããããªææ®µã詊ããŠãã奜åãå€ãåºçŸããããã¿ãèããããšããããšããå
容ã 人ã«ãã£ãŠã¯ã²ãšãã§ã®ã³ã®ã³ãããŠäžããã»ããããããåããšããã®ãé¢çœãã§ãããåè¥ããã¯ä»¥åããè¡ååæåŠã®è©±ããããŠãããããªã®ã§ãããŸã§ã®çºè¡šãèŠè¿ããŠã¿ããããªãšæããŸããã ç¹æ®éšéSETããŒã ã®æ¥åžžã- æè¡ãšå®éšãèåããå®è·µã¢ãžã£ã€ã«è¡ - speakerdeck.com HIROãããå
æ°ã«çºè¡šããŠããã®ãã¿ãŠå®å¿ããŸããã äžç·ã«çãç®ã«ããããšã§çã«å¿
èŠãªæ¯æŽãããã ãšããã®ã¯æšªæçãªã¹ãã·ã£ãªã¹ãããŒã ã«å
±éããèãæ¹ã ãšæããŸããSETIçãªããŒã ãSREããŒã ã®ãããªè·èœããŒã¹ã®ããŒã ãå¢ããŠããŠããŸããã äœã£ãŠãã£ãããäœã ã§ã¯ãªããçã«å¿
èŠãªæ¯æŽãå¿
èŠãªã ããå¿
èŠãšããŠããçµç¹ã«äžããŠããã®ãããããæ¹ãªãã ãããªãšæããŸããã A Scrum Bookã®æ©ãæ¹ ã»ãŒã»ãŒKeynoteã®è£è¶³ã®ãããªãCopeãšã®ã€ã³ã¿ã©ã¯ãã£ããªäŒè©±ã質çãé£ã³äº€ãã»ãã·ã§ã³ã§ããã éšéããã¯ãA Scrum Book㯠éåš ã¬ãã«ã ãã©ãã10幎ããã£ãŠã¹ã¯ã©ã ãã¿ãŒã³ããŸãšããŠããã®ã§ãã²æã«ãšã£ãŠã»ãããšãã£ããã£ãŠããŸãããæŸãèªã¿ããŠãæçšãšã®ããšãè±èªãâŠã Day2 Keynote: Lost in Translation: The Managerâs Role in Agile Lost in Translation㯠çžäºçè§£ã®é£ãã ãæããæ ç»ãšã®ããšã§ããã çµç¹ãå€ããã«ã¯ãŸããªãŒããŒé£ãå€ãããªããšãããªãããã®ããã«ã¯ãŸãäžäœããå€ãããªããã°ãªããªãããªãŒããŒé£ã«ããæ°ä»ããäžããããããã«ããªãŒããŒé£ãåã¡ã³ããŒã«ããããæ¯ãèããã§ããããã«ããããŠçµç¹å
šäœãå€é©ã§ããããã«ããŸãã¯èªåã®è¡åãå€ããããè¯ããã®ã玹ä»ããããšããå§ãŸããã ãªãšããè¡æãåããŸããã ãããããšããä»äº ãã§ãããšãããªã ã¢ãžã£ã€ã«ãªçµç¹ãã€ããããã«ã¢ãžã£ã€ã«ã䜿ãã ã¯è¯ãèšèã§ãããã¢ãžã£ã€ã«ã§å€åãäžæ°ã«ããããšãããªãããšãèŠããã®ã«ãçµç¹æ¹é©ã§ããããããªãã®ïŒãšèšãããŠããæãã§ãããã ä»é±CAL1ç ä¿®ãåããæ¹ã¯ããçè§£ã§ããã®ããããããªãŒïŒ ããŒã ã®åå®çŸ© -é²åè«ãšã¢ãžã£ã€ã«- åºç€ããŒã ãåå²ãããŠãããšã¯ã å¥ãããžã§ã¯ãã«ãã©ãã©ã«ãªã£ãŠããŸã£ããšããã¯BGMããããŸã£ãŠæ¬åœã«æ²ããæ°æã¡ã«ãªã£ãŠããŸããŸãããæçµçã«ã¯ 人éãšããŠã®è¶
åäœã®ãããã ããŸã暡玢ãã¯ãããã®ã§ãã¯ãåºç€ããŒã ã ãªãšæããŸããã ãªã«ãããããããã®çºè¡šã®ãããšããã¯ãèãã仮説ãenPiTã§åŠçã«ããããŠã¿ãŠå¹æã宿ããŠã㊠éçºçµéšã®ãªãåŠçã§ãã§ãããã ããïŒ ãšãã£ãŠããããšããã ãšæããŸããæãšåæ°ã Team-Based TEAM - äŒç€Ÿãè¶ããããŒã - speakerdeck.com ããŸã®ãããã¯ã以å€ã®ãã®ãéçºããããšèšãããæãåãããŒã ãšããŠæ¯ãèããã ãããïŒ ãšèãããã£ããã«ãªããŸããããããžã§ã¯ãããŒã ã§ãªãããããã¯ãããŒã ã§ããªããããŒã ã®ããã®ããŒã ãšããããæ¹ã ãªããä»ã®çºè¡šã§ã岡ç°ã¡ãœãããåŒçšãããŠããŸãããä»ã®åéã®ç¥èãã¹ã¯ã©ã ãšãéçºããã»ã¹ã«æã£ãŠããã®å€§å¥œããªã®ã§ã©ãã©ã話ãããŠã»ããã Day3 Open Space Technology ååä»¥äž å ãã«ãã人ççžè«å®€ ãããŠããŸãããæ¥œããã£ãã ã¹ããã¿ãŠããããªãã£ã¹ã«ãã·ã§ã³ãæž¡ãæ©ããŸããã NEXTâACTION ã³ãã¥ããã£ã«ã€ããŠã¿ããªã§ç޹ä»ããã¿ã€ãã³ã°ã§ãtddyyÏã®ç޹ä»ãããŸããã tddyyx.github.io ãããã«ã2015ãããããšãã£ããæŽ»åããŠããã³ãã¥ããã£ã¯å¢ããŸããããã³ãã¥ããã£ãšããŒã ãšèªåãã¿ããªã§ããããããæ¹ãèããŠãããããšããèãæ¹ã¯ç®ãããŠãã³ã§ãããæåããŸããã ã¿ããªã²ãšããããªããã ããäºäŸãå
±æããã£ãŠããããå®è·µããŠãŸãå
±æããŠãRSGTã®ãããªã³ãã¥ããã£ãã§ãããã ãªãšæé«ã®æ°åã«ãªã£ãŠåž°ããŸããã ç«ææ¥ããäœãã ãšããã¯ãŒããããããããŠããŠããªã«ãããããèããŠããŸããã å
šäœãéã㊠ããããªããŒã ã§ããããªãã£ã¬ã³ãžã»å®éšãè¡ãããŠããŠããããèããŠæ·±ãæéãåããŠãããšæããŸãã ç¹ã«Sahotaããâãããããâããã¹ããã®æµãã¯å®ç§ã§ãDay2ã¯ãã®ãŸãŸãã¯ã€ãšã§ãã£ããããŠããŸããã èªåã¯ããŒã ã«äœãã§ãããã ãã ããŒã ãããè¯ãããããã®ç¬¬äžæ©ãšã¯ãªãã ãã ãããããªãäžç·ã«ãããããã ãã ãšããæ°æã¡ã«ãªããªããäžé£äŒãéããããšã«ãªããŸããã ç«ææ¥ãããã£ãããš ããŒã ãšããŠã¯ã ãã£ãšOutcomeãå¢ãããããã«ããã ä»ãŸã§ã¯ã¹ãã«ãã©ã³ã¹ãã¡ãŒãããŒã ã¯ãŒã¯ãæèããŠããã¹ãŠã®å®è£
ãã¢ãããã°ã©ãã³ã°ã§ãã£ãŠãã ã¢ãããã°ã©ãã³ã°ãæå¹ã ãšæããããªãã¿ã€ãã³ã°ããããããçšåºŠã²ãšãã²ãšãã§äœæ¥ããæéãå¿
èŠããã ããšèããèµ·ããŠãã ãããããã人ãå¢ãããŠãã£ãã·ãã£èªäœãäžããŠãããã ãã®ããã«ãã©ããªäººãå¿
èŠããå®ããã ãšããè°è«ã®çã£æäžã§ãããããã§ãããããææ¡ããŠã¿ãŸããã MTGã«ãã£ãŠæéããºã¬ããããªã¢ãŒãã«ãã£ãŠå Žæããºã¬ããããŠãæèçã«ã¢ããåãå
¥ãã€ã€éçºã§ãããããªããã¿ã«ãããã ã¢ãããã°ã©ãã³ã°ã®æå¹æ§ã«ã€ããŠãäžæŠãããŠã¿ãããšã§å®éšããŠã¿ãã 人ããããŠäœè£ããªããªããããããªããã©ãæè¡çãªç éœãã§ããããŒã ã§ããããã 人ãå
¥ãæ¿ãã£ãŠããã¡ã®ããŒã ãããéšåã¯æ®ã£ãŠããæ°ããããã©ãªãã ããã ãã®åŸããæ¡çšãéçºäœå¶ãªã©ãããŒã ã§ã©ãããã¹ããïŒãšããè°è«ãããããã§ããŸãããã¿ãã¯ãšã¹ãã§ã³ãæãããããªããšæããŸãããçµæçã«ããŒã ãããæ¬¡ã®ã¹ããããžé²ãããã®è°è«ã®ãã£ããã«ãªã£ããããããŸããã ä»ã®ããŒã ã¯ãŸã ãŸã æŽå²ãæµ
ãã®ã§ãããããã«ãå€å®¹ã§ãããã©ãããã§ãããŸããã£ãããšãåçŸã§ããçµç¹ã§ãããããããšãã話ãã§ããŸããã ãŸãšã RSGTæé«ã§ãããå®è¡å§å¡äŒã®ã¿ãªããŸãã€ããããŸã§ããã幎äžã§ããããŠå€ãããªãã€ãã³ãããããš ãããå®è·µããŠRSGTã§è©±ãããïŒ ãšãã顿ãæã£ãŠãããæ°ãããŸããæé«ã®ã€ãã³ãã§ãããæ¥å¹ŽããŸãã®ã£ã¶ã®ã£ã¶ããŸãããã ã¹ããŒããã£ã³ãã§ã¯ãã¹ã¯ã©ã ãå®è·µããŠæ¹åãç¹°ãè¿ããªããã¯ã€ã¯ã€éçºãããã¡ã³ããŒãåéããŠããŸãã hrmos.co https://hrmos.co/pages/smartcamp/jobs/000000093 hrmos.co
æããŸããŠããã§ãšãããããŸãã ã¹ããŒããã£ã³ãã®ç¬¹åã§ãã 2020幎ã«ãªã£ãã®ã«ãŸã åŒããã£ãŠãã®ããã£ãŠæãããããã§ãããä»å㯠2019幎ã®ã¢ããã³ãã«ã¬ã³ã㌠ã«åå ããŠã¿ãŠããã£ãããšãæ¯ãè¿ã£ãŠãããããšæããŸãïŒïŒïŒ ãªãAdvent Calendarã«åå ããã åå ã®ããã®äºåæºå å®éã®åå ç¶æ³ æ°åã§æ¯ãè¿ãAdvent Calendar ããŒãžãã¥ãŒ ã¯ãŠã Google Discoverããã®æµå
¥ Googleæ€çŽ¢ããã®æµå
¥ Qiitaå
ã§ã®ã¡ããªã¯ã¹ å¿ã§æ¯ãè¿ãAdvent Calendar ã¢ã³ã±ãŒã æåŸã« ãªãAdvent Calendarã«åå ããã çµè«ããèšããšããAdvent Calendarã«åå ããŠã¿ããã£ãããçç±ã«ãªããŸãã å
æ¥å
¬éããèšäº ã«ãããéãããã®ãšã³ãžãã¢ããã°ãå§ããŠãã1幎ãçµã¡ãŸãã å®ã¯ããã®ãšã³ãžãã¢ããã°ãå§ãããšãã1幎åã«ãAdvent Calendarã«åå ããŠã¿ãããšãã話ãäžãã£ãŠãŸããã äžçªæåã«Advent Calendarãããã°ãäžæ°ã«ã³ã³ãã³ãéãå¢ããŠå§ããŠ1ã¶æã§ããçšåºŠå
å®ããããã°ã«ãªããšèããããã§ãã ãšã¯ããã以äžã®ãããªèŠå ããèžã¿åããã«ã幎æãããã®ã¹ã¿ãŒãã«ãªããŸããã ããã°ãšãã圢ã§ã®ã¢ãŠããããçµéšã®è±å¯ãªã¡ã³ããŒãããªãã£ãããš ã©ããããã®å·¥æ°ãããããããããªãã£ãããš ã©ããããã®ãªã¿ãŒã³ïŒèªç¥åºŠïŒãåŸããããããããªãã£ãããš ã€ãŸããAdvent Calendarã«ã¯2018幎ã®ãšãã«ææŠããããšããŠã§ããªãã£ãå çžããã£ãã®ã§ãã ãããªèŠãæãåºïŒïŒïŒãã1幎ãçµã€ãã¡ã«ãæ¯é±æ¬ ãããã«ããã°ãæŽæ°ãç¶ããããšã§èªä¿¡ãã€ããŠããŸããã ããã§ã§ãããä»å¹Žã¯éãããšã10人ã§ãåããã ãããšãããšãããé
ããã¹ãAdvent Calendarã«åå ããããšã«ããŸããã åå ã®ããã®äºåæºå äºåã«ããŠããããšã¯ä»¥äžã®2ã€ã§ãã Advent Calendarãäœã Advent Calendarãåãã Advent Calendarãäœãäžã§ãã䜿ãããŠããã®ã¯ä»¥äžã®2ã€ã®ãµãŒãã¹ã§ããããã Qiita Adventar ä»åã¯åããŠã§ããããéããããããããªãã£ãã®ã§æè¡ç³»ã«åŒ·ããããšããããšã§Qiitaã«ããŸããã éèŠãªã®ã¯ããã®æ¬¡ã®Advent Calendarãåããäœæ¥ã§ããã åããã«ããã£ãŠä»¥äžã®ãããªããªã·ãŒãå®ããäžã§æ©ãç©é ã§åã£ãŠãããŸããã å¹³æ¥ã¯å¿
é ã§æŽæ°ãã äŒæ¥ã¯åºããããé¡ãããã°ä»»æã§æŽæ°ãã ãã®ãããªããªã·ãŒã«ããã®ã¯ããšã³ãžãã¢ã®æ°ã10人çšåºŠã®ããå
šæ¥çšåããããšæããšã3èšäºæžããªããã°ãªããªã人ãã§ãŠæ¥ãããã§ãã å®éã®åå ç¶æ³ çµæãšããŠã¯ãå¹³æ¥ã¯å
šãŠåããããã§ã25æ¥éã®ãã¡20æ¥éèšäºãåºããŸããïŒïŒ ãã¶ã€ããŒã«ã ãã¶ã€ã³ããã° ã§ååããŠããã£ãŠããã®ã§ããã®ãšã³ãžãã¢ããã°ã§åºããã®ã¯18èšäºã«ãªããŸãã ã¹ããŒããã£ã³ã ã¢ããã³ãã«ã¬ã³ã㌠æ°åã§æ¯ãè¿ãAdvent Calendar ããŒãžãã¥ãŒ 12æã¯éåžžã®æã®2åçšåºŠã®ããŒãžãã¥ãŒãšãªããŸããã éåžžã®æã ãšé±ã«1æ¬åºããŠããã®ã§ãèšäºã®æ¬æ°ã«æ¯äŸããã»ã©ã«ã¯é²èЧã¯ãããªãã£ãããšã«ãªããŸãã ããŒãžãã¥ãŒã®æšç§»ïŒ2019幎5æã2019幎12æïŒ ãã®çç±ãšããŠã¯12æäžã¯Advent Calendarãããããšã§ããããšã³ããªãŒãªã©ãã¥ã¬ãŒã·ã§ã³ã®ç«¶äºçãæ¿ããã£ãããã§ã¯ãšæšå¯ããŠãŸãã ãã®äžã§ã䌞ã³ãèšäºã¯ãããããããå
容ã»ã¿ã€ãã«ãšãã«èå³ãããããããã®ã ã£ããªãšæããŸãã 私はAWS EC2のt2インスタンスを誤解していた - CPUクレジットとベースラインパフォーマンス、そしてT2 Unlimited - SMARTCAMP Engineer Blog 実践して分かったモブプログラミングのメリット・デメリット - SMARTCAMP Engineer Blog ã¯ãŠã æ°åã§æ¯ãè¿ãAdvent Calendar第2匟ã¯ã¯ãŠãæ°ã§ãã æäœ æé« å¹³å 2 67 23.4 å¹³åã¯ãŠãæ°ã23.4ãšããããšã§å
šäœå¹³åã®40.7 *1 ããã¯å°ãªãããæžã£ãŠããããšã«ãªããŸãã Google Discoverããã®æµå
¥ ç¶ããŠã¯ãã¯ãŠããäœè¿·ãããªãæ¯ããæµå
¥æºã®äžã€ã§ããGoogle Discoverããã®æµå
¥ã§ãã å··ã§Googleç ²ãšãåŒã°ããŠãããã€ã§ãã Search Consoleããé²èЧã§ããDiscoverã®ããã©ãŒãã³ã¹ ããããã®æµå
¥ã¯ããŸãã¯ãŠãã«åœ±é¿ããªãã£ãããããã®ã§èŠãã¥ããã£ããã¯ãããã§ãããSearch Consoleã«ç»é²ããŠãããšSearch Consoleäžã§è§£æã§ããããã«ãªããŸãã Googleæ€çŽ¢ããã®æµå
¥ æåŸãSearch Consoleããåããæ
å ±ãªã®ã§ãããGoogleæ€çŽ¢ããã®æµå
¥ã§ãã èšäºãå¢ããããšã«å¯ŸããŠããããŸã§å€åãæ¥ã«çŸããŠãããã®ã§ããªãã®ã§ãããåææ¯ã§1.6åäœã®æµå
¥ã«ãªããŸããã Googleæ€çŽ¢ããã®æµå
¥ 1幎éã§èšäºãå¢ãããŠããããšã«ãã£ãŠãäœãããèšäºãæçš¿ããããããæ©ãæ®µéã§Googleæ€çŽ¢ã«èŒããŠããããããã«ãªã£ãŠããã®ãããããŸããã Qiitaå
ã§ã®ã¡ããªã¯ã¹ Advent CalendarãèŒã£ããŠããã®ã¯Qiitaãªã®ã§ããã¡ãã®ç¶æ³ãã©ãã ã£ãããæžããŠãããŸãã èšäºèªäœã¯ãã¡ãã®ããã°ã«æžããŠããã®ã§ãããæ°ã䌞ã³ãªãã£ãã®ã¯è¯ããšããŠã賌èªè
ã9人ã«çãŸããŸããã 賌èªããŠããã ãã9äººã®æ¹ããããšãããããŸããïŒïŒïŒ Qiitaå
ã§ã®ã¡ããªã¯ã¹ 賌èªè
æ°ã©ã³ãã³ã°äžäœãèŠããšçŽåŸæãããã®ã§ããããããã®äŒæ¥ã«è¿œãã€ã远ãè¶ãã®ç²Ÿç¥ã§ãŸã ãŸã ãã©ã³ãã£ã³ã°ããŠãããªãããªãšæããŸããïŒ è³Œèªè
æ°ã©ã³ãã³ã° å¿ã§æ¯ãè¿ãAdvent Calendar ã¢ã³ã±ãŒã Advent CalendarãçµããŠãåå ããã¿ããªã«ç°¡åã«ã¢ã³ã±ãŒããåã£ãŠã¿ãŸããã ã¢ã³ã±ãŒãâ ãã£ãŠã¿ãŠã©ãã ã£ãã ã¢ã³ã±ãŒãâ¡ ä»å¹Žãããããã æ°åã§æ¯ãè¿ãã®ã»ãã§ãåããéããæ®æ®µã»ã©ã¯PVçã䌞ã³ãªãã®ã§ã³ã¹ããæªããšæããŠãã人ãããŸããã ãããã£ãããšããæ®æ®µã®5åã®ããŒã¹ã§èšäºãäœããªããšãããªããšãããšããã§ãå
šäœçã«ãã©ããæããŠããããã§ãã ãã ãå°äººæ°ã§ãããã£ãããšã«éææãæããŠããããäœãããã®åŠã³ãåŸãŠãã人ãããŸããã æåŸã« 2019幎ã®Advent Calendarã«åå ããããšããããŸã§æ¯ãè¿ã£ãŠããŸããã ãã£ãããŸãšãããšãAdvent Calendarã«åå ããŠã¿ãŠä»¥äžã®ãããªããšãããããŸããã èšäºã®æ¬æ°ãå€ããªãããšã§å
šäœçãªPVã¯äžãããããèªç¥åºŠã¯äžããå¯èœæ§ãã èšäºãããã®PVæ°ãã¯ãŠãæ°ãªã©ã®ã¡ããªã¯ã¹ã¯æ®æ®µã»ã©ã¯äžãããªã å°äººæ°ã§ãAdvent Calendarã«ææŠããŠããããããšã§éææã¯ãããããã©ãããšã¯ãã©ã æ¥å¹Žãããã©ããã¯ãŸã ããããªãã§ãããAdvent Calendarã®é ã«ã¯ãŸãäœãããã®å€åã蚪ããŠããã ãããªãšæãã¯ã¯ã¯ã¯ããŸãã ãšããããã§ãæ¬å¹Žãå®ããããããããŸãïŒ *1 : https://tech.smartcamp.co.jp/entry/tech-blog-retrospective-first-year#%E3%81%AF%E3%81%A6%E3%83%96%E6%95%B0
ã¹ããŒããã£ã³ããšã³ãžãã¢ã®ç§å·ã§ãã æ¬èšäºã¯ スマートキャンプ Advent Calendar 2019 - Qiita ã®25æ¥ç®ã®èšäºã§ãã ãã®ã¹ããŒããã£ã³ã ãšã³ãžãã¢ããã°ãéèšããŠä»æ¥ã§ã¡ããã©1幎ãçµã¡ãŸãã ð 1幎åã®ã¯ãªã¹ãã¹ã«ç§ããªãŒããŒãšããŠã¯ãããããšã§ãããé·ç¶ãããªãããããªãã...æ¡çšã«ã€ãªãããªããŠãããã ããã...ãããªäžå®ãæ±ããªããã®ã¹ã¿ãŒãã§ããã ããã çµæãšããŠ1å¹Žéæ¯é±èšäºå
¬éãTechããã°ã¹ã³ã¢ã©ã³ãã³ã°4äœ *1 ãã€ãã³ãç»å£ãªãã¡ãŒ *2 ãªã©ãªã©å€§ããªææ ãåŸãããšãã§ããŸããã 10人ããããã®ã¡ã³ããŒã§ãããã ãã®ææãæããããã¯ãšãŠã貎éãªäœéšã§ãæ§ã
ãªç¥èŠãåŸãããã®ã§ãç¯ç®ãšãªãæ¬èšäºã§åºãããã®ã¯å
šãŠåºããŠããããšæããŸãïŒ ãªããšã³ãžãã¢ããã°ãã¯ãããã æ¡çšã®ããã®ãã©ã³ãã£ã³ã° ãšã³ãžãã¢çµç¹ãåäººã®æé· èªåã®æé· çµæãšããŠãªã«ãåŸãããã PVæ° ã¯ãŠãæ° ãã©ã³ãã£ã³ã° ããã¥ã¡ã³ãå ã©ããã£ãŠæ°å€ã䌞ã°ããã®ã èšäºãšæµå
¥å
ã®é¢ä¿ãåæ ã¯ãŠããããããšã³ããªãŒã®ä»çµã¿ãåæ SEOã«ã€ããŠåŠã¶ ã©ããã£ãŠæ¯é±å
¬éãç¶æããã å¯ãæ·»ã ã€ã³ã»ã³ãã£ããææã®å
±æã§æåäœéšã®å
±æ éå¶åŽãæ°åã§æžã Tips ã¿ã€ãã«ã¯ããºçããããããããã ã¢ã€ãã£ããã¯ããŸãæ°å€ã«åœ±é¿ããªã Twitterã¢ã«ãŠã³ããšã®äœµçšã¯å€§å€ ããã°ã®ãã¶ã€ã³ã¯ã¬ã¹ãã³ã·ãã«ããã»ããè¯ã æåŸã« ãªããšã³ãžãã¢ããã°ãã¯ãããã æ¡çšã®ããã®ãã©ã³ãã£ã³ã° 1ã€ç®ã¯æ¡çšãç®çãšãããã©ã³ãã£ã³ã° ã§ãã åŒç€Ÿã¯B2BäŒæ¥ã§ããããšã³ãžãã¢ã®æ¹ã
ãåŒç€Ÿã®ãããã¯ãè§Šãæ©äŒã¯ãšãŠãå°ãªãã ã©ãããããªèŠæš¡ã®ã©ããªãããã¯ããäœã£ãŠããäŒæ¥ãªã®ã ãšãã£ãèªç¥ã«èª²é¡ããããŸããã å
·äœçã«ã¯ãç§ãã¡åããšã³ãžãã¢ãšããŠã¯ããžãã¹çã«ãããããããæè¡çã«ããã ãããããããããããããã®ã«ã颿¥ãªã©ã®éãããæéã§ã®èª¬æã§ã¯äŒããããªããªãšèã§æããŠããŸããã å®åžžçã«ã¢ãŠãããããããããšã§ã説æãããåã«ããçšåºŠã®åŒç€Ÿãšã³ãžãã¢ã«é¢ããæ
å ±ãæã£ãŠããç¶æ
ã«ãããããŸãã¯èª¬æã«äœ¿ãè³æãšããŠæŽ»çšã§ããããããªãããšããçºæ³ããã£ããã§ããã ãšã³ãžãã¢çµç¹ãåäººã®æé· 2ã€ç®ã¯ãšã³ãžãã¢çµç¹ãåäººã®æé· ã§ãã ãšã³ãžãã¢ãšããŠæè¡ã¹ãã«ãåäžãããããæ°ããæè¡é åã«èžã¿èŸŒãã ãããããšã¯ãšãŠãéèŠããªãšæã£ãŠããã®ã§ãããå®åžžçãªæ¥åã®äžã§å®çŸããŠããã®ã¯ãªããªãé£ãããšæããŠããŸããã (æè¡å°å
¥ã®èª¿æ»å·¥æ°ãå
±æã³ã¹ããããããã¯ãã®ãã§ãŒãºã«åããªãããšã¯ãããŸããã...) ãããã£ããšãã«ããã°ãæžãæéãšããŠèª¿æ»ãããŠå
¬éããŠå
±æãè¯ãããã§ããã°ãããã¯ãã«ãåæ ãšãã£ããµã€ã¯ã«ãåããã°ãããªãšæããŸããã ãŸãã誰ãã©ããªæè¡ã«èå³ãããã®ãããªã«ãããããã®ãããããŸã§ç¥ããªããªãšæããŠãããã¡ã³ããŒã®ããšãç¥ãæ©äŒã«ããªãããªãšããæãããããŸããã ä»ã«ãããšã³ãžãã¢ãšããŠãã£ãããšããæ£ããããããããæç« ã«ãŸãšãã(ããã¥ã¡ã³ãå)æè¡ã¯éèŠã§ãããããã¯å®éæžããŠäººã«èŠãŠãããçµéšãæé·ãžã®è¿éã ãšæã£ãŠããŠããããã°ã«ãåºããããããšããã®ãããå£å®ã«ãªã£ãŠããã¥ã¡ã³ãæåã圢æã§ããã°ãšãæã£ãŠããŸããã èªåã®æé· 3ã€ç®ã¯å人çã«ãšã³ãžãã¢ããã°ãã£ãŠã¿ããã£ããã ã§ãç¬ ïŒã€ç®ã«æžãããšãããã¢ãŠããããããããšã§ãšã³ãžãã¢ãšããŠæé·ãããšèããŠã¯ããã®ã§ãããç§å人ããã£ãããšãæç« ã«ãŸãšããããã¢ãŠããããããã®ããšãŠãèŠæã ã£ããã§ããã... ãªã®ã§ãæ¡çšã®ãããçµç¹ã®ãããšãããã¬ãã·ã£ãŒãšã¢ãããŒã·ã§ã³ãèªåã«äžããããšã§ããã®å£ãæã¡å£ããïŒãšããæãããããŸããã çµæãšããŠãªã«ãåŸãããã PVæ° PVã¯åºæ¬çã«Google Analyticsãšã®é£æºãååŸããããŒã¿ãèŠãŠããŸããã 以äžãéèšããŠããæ¬æ¥ãŸã§ã®æ¥å¥PVæ°ã«ãªããŸãã â» Google Analyticsãã çŸæç¹ïŒ2019/12/25ïŒã§ 环èš114,257PV ã§ããã 1æ2ææ°çŸPVã§ãããã4æã«èšäºãããºã£ãããããªãã§ããŠããŠãå®å®ããçŸåšé±äžã®èšäºå
¬éã§9000PVã§å®å®ããããªãšãããšããã§ãã(æå¹³å9527.58PV, ææå€§32,156PV) ã°ã©ããèŠãŠããã ããšãPVæ°ã¯èšäºå
¬éæ¥ã®ã¹ãã€ã¯(1ã2æ¥ã§ã»ãŒèœã¡çã)ãšå®åžžçãªã¢ã¯ã»ã¹(çŸåš200PVçšåºŠ)ã§æ§æãããŠããããã§ãã ã¯ãŠãæ° ç·ã¯ãŠãæ°ã¯çŸæç¹ïŒ2019/12/25ïŒã§2,686 ã§ããã èšäºæ°ã¯66ã§ãã®ã§ãèšäºå¹³å40.7ãšãªããŸãã ã¯ãŠãæ°ããã3ã以äžãšãªããŸãã å¹³æãã什åã«å€ããã¿ã€ãã³ã°ã§åºããäŒç»èšäºã1äœã2äœ3äœã¯ã¯ã©ã€ã¢ã³ããµã€ã(Vue.js)èšäºã§ããã tech.smartcamp.co.jp tech.smartcamp.co.jp tech.smartcamp.co.jp ãã©ã³ãã£ã³ã° 倧ãããã©ã³ãã£ã³ã°ãšããŠææãã§ã¯ãããã®ã¯ã以äžã®èšäºã§åãäžããŠããã ãããããããªãšæããŸãã note.com ããŸãä»ç€Ÿããã°ãªã©ããã³ãããŒã¯ããŠããªãã£ãã®ã§ããšã³ãžãã¢å
šå¡4äœãšããçµæã«é©ããŸããã æ°å€ãšããŠææãã§ããšããããšã§ãã¢ãããŒã·ã§ã³ãäžãããŸãããããã¡ãã®èšäºãã¿ãŠåŒç€Ÿãç¥ã£ããšããæ¹ãæ¡çšéžèã®äžã§ããã£ããããŸããã ãŸããã€ãã³ãã®ç»å£ãªãã¡ãŒãé ããããšæŽã«ã¢ãŠããããã®å Žã«ã€ãªãããåœåæ³å®ãã以äžã«åé¿ã®ããåãçµã¿ã«ãªã£ããªãšæããŠããŸãã lapras.connpass.com ãããããšã³ãžãã¢ããã°ãç¶ç¶ããèªäœãããšã³ãžãã¢ã«è£éãšç±éããã蚌æã«ãªããšèããŠããã®ã§ããããéæããããšãã§ããŸããã ããã¥ã¡ã³ãå åœåã®ç®çã®1ã€ãããã¥ã¡ã³ãæåã®åœ¢æãããçšåºŠé²ãã ããªãšæã£ãŠããŸãã äŸãã°ãæè¡çãªãšããã ãšãAWSã®ã¢ã«ãŠã³ã管çãTerraformã§ãã£ãŠãããšã³ãžãã¢ãèšäºã«èµ·ãããŠèª°ã§ãPullRequestéããããã«ããã *3 ãAtomic Designã§ã¯ã©ã€ã¢ã³ãèšèšããŠããããŒã ãèšäºãæžããŠä»ã®ããŒã ãåèã«ããã *4 ãšãã£ãã³ãã¥ãã±ãŒã·ã§ã³ãããã°ãéããŠèµ·ããããšãã§ããŸããã ãŸã颿¥æã®äŒç€Ÿç޹ä»ãªã©ã§ããã¹ã¯ã©ã ã«åãçµãã§ããããš *5 ããªã³ããŒãã£ã³ã°å€§äºã«ããŠããããš *6 ãåŒçšããªããäŒããããã§ããããã«ãªã£ãŠããŸããã æç« ãæžãåãæèã«ã€ããŠãæããã«åäžããŠãããããã°éå§çŽåŸã¯ãã¿åºããã¢ãŠãã©ã€ã³äœæãæç« äœæãæ ¡æ£ãã¹ãŠã§æäŒãå¿
èŠããã£ãããšã³ã¹ããããã£ãèŠãããããŸããããªããš Qiita AdventCalendar ã§ã¯ãªã«ããããšãå¹³æ¥å
šãŠåããããšãã§ãæåããŸãã(å§åçæè¬ïŒ) ã©ããã£ãŠæ°å€ã䌞ã°ããã®ã èšäºãšæµå
¥å
ã®é¢ä¿ãåæ æµå
¥å
(æ²èŒåªäœ)ã«ãã£ãŠPVæ°ãã¯ãŠãæ°ã¯å€§ããå€ãã£ãŠããŸãã ã©ããªèšäºãã©ãããæµå
¥ããããããåæããã®ã¯å€§äºã ãšæããŠããŸãã 以äžãå
šäœã§ã®æµå
¥å
ã®ãµããªãšãªããŸãã (direct)ã¯çœ®ããŠãããšããŠãããããšã³ããªãŒãSmartnewsãGoogleæ€çŽ¢ãTwitterãChrome(Android)ã®ãããããGoogle Newsããã®ä»ã®é çªã«ãªã£ãŠããŸãã â» Google Analyticsãã蚪åè
ã®åç
§å
ããã ãèŠããšããããšã³ããªãŒãšSmartnewsãGoogleæ€çŽ¢ã®æµå
¥ãåçšåºŠãšæããããããããŸããããæ²èŒãããèšäºæ°ãç°ãªããŸãã Smartnewsã«å€§ã
çã«æ²èŒãããã®ã¯ã以äžã®4èšäºã§ããã(ããããåäœã§3000~7000PV) 新卒Webエンジニアだった頃の自分に教えたいちょっとしたタスクからでも経験値を積んでいく考え方 - SMARTCAMP Engineer Blog 【ありがとう平成】年代別にIT技術まとめてみた - SMARTCAMP Engineer Blog 『エンジニアが自称PMになるまで』をテーマに登壇してきた内容【10分まとめ】 - SMARTCAMP Engineer Blog 無償になったPull Remindersを導入してみた! - SMARTCAMP Engineer Blog ãªããšãªãã§ãããææµã«ä¹ã£ãèšäº(4æã«æ°å
¥ç€Ÿå¡ãã¿ãå¹³æä»€åãã¿)ã話é¡ã«ãªã£ãŠãããã詊ããŠã¿ãèšäº(PullReminderèšäº)ã¯ã¯ãªãã¯ãããããã®ããªãšã¯æããŸãã ãã®ä»ã ãšãChrome(Android)ã®ããããèšäºã¯å²åãšããŠã¯å°ãªãã§ããã以äžã«ä»£è¡šãããæè¡ãäžå¯§ã«è§£èª¬ããèšäºãèŒããããããªãšæããŠããŸãã 私はAWS EC2のt2インスタンスを誤解していた - CPUクレジットとベースラインパフォーマンス、そしてT2 Unlimited - SMARTCAMP Engineer Blog ãããã£ã仮説ãããšã«èšäºãæžããŠãå
¬éããŠãã©ãã ã£ããã®ãµã€ã¯ã«ãåããªããéå¶ããŠããŸã(ãããçµæ§æ¥œãã) ã¯ãŠããããããšã³ããªãŒã®ä»çµã¿ãåæ ã¯ãŠãã®äŒžã³ãšãæ²èŒåªäœ(ããããšã³ããªãŒITã«ããŽãªãŒãããããšã³ããªãŒç·åãSmartnewsãGoogle News)ã®é¢ä¿ãææ¡ããããšæããRedashã§èšäºå
¬éããã®ã¯ãŠãæšç§»ãåºããã¯ãšãªãäœæããŸããã äŸãšããŠã¯ä»¥äžã«ãªããŸãã ãã®ããŒã¿ãšGoogle Analyticsã®ããŒã¿ãããããŠåæããããçšåºŠã®èšäºå
¬éããã»ã¹ãå®å®ãããŠãããŸããã (以äžã¯ãããŸã§ãããã£ãåŸåããããšããã¯ãªãã§ã) 20æãã24æãããããšã³ããªãŒã«ä¹ã£ãŠãããšãã¯ãŠãã䌞ã³ããã 6æãã9æã®éãããããšã³ããªãŒã«ä¹ã£ãŠãããšãã¯ãŠãã䌞ã³ããã èšäºå
¬éãã12æéãããçµéãããšããããšã³ããªãŒããæ¥éã«èœã¡ã ã¯ãŠãæ°ã100ãè¶
ãããšããããšã³ããªãŒç·åã«èŒã£ãŠæµå
¥ãå éãã 24ææç¹ã§30ã¯ãŠãçšåºŠã ãšæçµçã«60ã¯ãŠããããã§çå°ãã etc... â» å®éã«äžèšRedashåæçšã®Pythonã³ãŒãã貌ã£ãŠãããŸã import requests from datetime import datetime result = {} add_result_column(result, 'url' , '' , 'string' ) add_result_column(result, 'time' , '' , 'integer' ) add_result_column(result, 'count' , '' , 'integer' ) add_result_column(result, 'acc' , '' , 'integer' ) hb_entry = 'http://b.hatena.ne.jp/entry/json/' urls = [ '{{URL1}}' , '{{URL2}}' ] for url in urls: response = requests.get(hb_entry, params={ 'url' : url}).json() # for bm in response['bookmarks']: # add_result_row(result, {'user': bm['user'], 'time': bm['timestamp'], 'comment': bm['comment']}) def round_by_minutes (dt, minutes= 10 ): return dt.replace(minute = int ( round (dt.minute / minutes) * 10 )) dts = [round_by_minutes(datetime.strptime(bm[ 'timestamp' ], '%Y/%m/%d %H:%M' )) for bm in response[ 'bookmarks' ]] first_dt = min (dts) dts = [(dt - first_dt).seconds / 60 for dt in dts] acc = 0 for dt in sorted ( set (dts)): count = dts.count(dt) acc = acc + count add_result_row(result, { 'url' : url, 'time' : dt, 'count' : count, 'acc' : acc}) SEOã«ã€ããŠåŠã¶ èšäºæµå
¥å
ã®åæãã¯ãŠãæšç§»ã®åæã¯å
¬éæã®ããº(ã¹ãã€ã¯)ã倧ããããããšããæœçã§ããã é·æçãªæè¡ã®ãã©ã³ãã£ã³ã°ãªã©èãããšSEOãæèããŠããå¿
èŠ ãããããªãšèããŠããŸãã åŒç€Ÿã§ã¯å¹žéãªããšã«ãèªç€Ÿã¡ãã£ã¢ãéçšããŠããSEOã«è©³ããã¡ã³ããŒãåšç±ããŠãããããåºç€ãããã¯ããã¯ãŸã§æè»œã«åŠã¶ããšãã§ããŸããã å®è·µã§ããŠãªããã®ãå€ãã§ããã以äžã«åãçµã¿ã玹ä»ããŠãããŸãã ã¿ã€ãã«ã«ããŒã¯ãŒããéèŠãªãã®ããå·Šã«ããã ããŒã¯ãŒãã®è¡šèšããããªãã ç®æ¬¡ãããã(ç®æ¬¡ã§å
šäœãææ¡ã§ããããã«ãã) æäœæåæ°1500以äžãçãããããŒã¯ãŒãã§æ€çŽ¢ããŠäžçªäžã«åºãŠããèšäºããå€ãã®ãçæ³ URLãã«ã¹ã¿ã URLã«ãã ã¯ãŠãªããã°ã ãš/entry/2019/12/25/184533ã®ããã«ãªãããéå±€ãæµ
ãæå³ã®ããè±åèªã®ã»ãããã /entry/engineer-onboardingã®ããã«ãã€ãã³åºåãã®è±åèªã«ãã Google Search Consoleãªã©ããŒã«ãèŠãŠæ¹å(ãªã©ã€ã)ããã 以äžãèŠããšã³ã³ãã³ã(èšäº)ãå¢ããããšãããé 調ã«äŒžã³ãŠãããªãšæããŠããŸãã 䌞ã³ããããããããããšæãã®ã§ã泚åããŠãããããšããã§ãã (çŸåš aws client vpn ãšã aws ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã ãšãã£ãããŒã¯ãŒãã匷ãããã§ããã€ã³ãã©äŒæ¥ã§ãã) â» Search Consoleãã ã©ããã£ãŠæ¯é±å
¬éãç¶æããã å¯ãæ·»ã ãŸãã¯ç®èº«çã«äŸé ŒããŠããã¡ã³ããŒã«æã貞ãå¿
èŠããããšèããŸããã èšäºãåºããŸã§ã®ããã»ã¹ãšããŠã¯ã ãã¿ã®ã¢ã€ãã£ã¢åºã ã¢ãŠãã©ã€ã³ãæžã èšäºãæžã æ ¡æ£ãã ã¢ã€ãã£ããäœã å
¬éãã ã®ããã«ãªããŸãã ãã£ãŠã¿ããšã3. èšäºãæžãã ãã§ãæ
£ããªããšããã倧å€ãªãã§ãããã ãªã®ã§ãåºæ¬çã« 3. èšäºãæžã以å€ã¯ãã¹ãŠçžè«ãŸãã¯äžžæãããŠæ§ããªããšããã¹ã¿ã³ã¹ ã«ããŠããŸããã ããšæèããŠããã®ã以äžã«ãªããŸã 3é±éåã«ã¯å·çäŸé Œãã èšäºã®å
容ã«ã€ããŠã¯æ¬äººã®æžãããããã®ã«ãã åžžã«ããŒã é¢ä¿ãªãæ
å ±åéããæ®æ®µã®æ¥åã§ãããããªãã¿ãæè¡ææŠã®ææ¡ãã§ããããã«å¿ããã æžããŠãããããšã«æè¬ããŠèªåã§ãã¡ãããšèªã ã€ã³ã»ã³ãã£ããææã®å
±æã§æåäœéšã®å
±æ ãããäžçªå€§ããçç±ãããããŸããã 3ææ«ã«ãŸã£ããèšäºãèŠããããã¯ãŠãã1ããã€ããªãããšãŠãã¢ãããŒã·ã§ã³ãäžãã£ãŠããŸããã ãªããšãæéããããšæãããããŒãžã£ãŒãšäº€æžããŠã 1èšäºã§100ã¯ãŠãè¶
ãããã寿åž100貫ã¡ã³ããŒã«æ¯ãèã ãšããçŽæããŠããããŸããã ãããŠãªããšããããäžé±éåŸã«Vue.jsã®èšäºã200ã¯ãŠããè¶
ããŠããŸããŸããã èšäºã䌞ã³ãã®ã¯å¶ç¶ã§ããããã¡ã³ããŒå
šå¡ã§ããããããŠå¯¿åžããã®ãïŒïŒããšããæããå
±æã§ã㊠äžäžžãšãªããã£ããã«ãªã£ã ã®ããªãšæã£ãŠããŸãã(CMOã®æãããã®ç¯ã¯ããããšãããããŸãã) ã€ã³ã»ã³ãã£ããšããŠã¯ãã®äžåã ãã§ããã(ããŸãã«ãæ©ãéæããŠããŸã£ãã®ã§ã¹ãã³ãµãŒãæããŠããŸã£ã)ããã®åŸãèšäºãããºã£ãããnoteã§ç޹ä»é ãããã幞éã«ããã¹ãŠã®ã€ãã³ããæ¥œãã¿ãªããå
šå¡ã§ããªãããªãšæããŠããŸãã éå¶åŽãæ°åã§æžã å¯ãæ·»ã£ãŠãæ¬äººã®ããæ°ããããã©ãã¿ã¹ã¯ç¶æ³çã«å³ãã...ãããªãšãã¯ä»æ¹ãªãã®ã§éå¶ã¡ã³ããŒã§æžãããã«ããŠããŸããã æ¯é±èšäºå
¬éã¯ãã©ã³ãã£ã³ã°ãšããŠãéèŠã§ãããæžããŠãããã¡ã³ããŒã®ãã責任æã«ãã€ãªãã£ãŠãããšæããŠããã®ã§ãããã¯æ»å®ããããšããã°ããŸããã ãã ãæ°åã§æžãã®ãé£ããã®ã§ãæ©ãã«äŸé ŒããŠãã人ã®ã¿ã¹ã¯ç¶æ³ã鲿ãªã©ãã£ããããŠããããã®ãšãã¯èª°ããªã«ãæžããã話åãããã«ããŠããŸããã Tips ã¿ã€ãã«ã¯ããºçããããããããã ããªãè¿·ãã©ãããªã®ã§ããã ããºãçã£ãã¿ã€ãã«(ç
œãæå¥ãå
¥ããããã·ã£ã¬ãæ··ããã)ã¯é£ããã®ã§ããããããŸããïŒ èšäºãæžãã³ã¹ããé«ãã®ã§ãåéºãããããå
å®ã«ã端çã«å
容ãããããã®ããããšæããŸãã ã¢ã€ãã£ããã¯ããŸãæ°å€ã«åœ±é¿ããªã ã¢ã€ãã£ããã¯ã¯ãããŠããçŽäœæ²æãã£ãŠãæè¡ããŽã ãæãèè
ã®é¡åºãæããã¶ã€ãã®æ¬æ°æãããããšãæãšãããŸãããã çµæçã«ããŸãPVãã¯ãŠãæ°ã«ã¯åœ±é¿ããªã ãšæããŠããŸãã (ã¢ã€ãã£ããã§ããºããšãã¯ããããªãã) ããŸãã«ãæå³ã®ããããªããå
茪ãã¿ãšããé¿ããŠããã°äœã§ãããããªãšæè¿ã¯æã£ãŠããŸãã 1ã€ã ãæèããŠããããšã¯ã衚瀺ããåªäœ(ãµã€ãã端æ«)ã«ãã£ãŠç«¯ãèŠåããŠãããããã®ã§ãäžå€®ã«èŠçŽ ãå¯ããã»ããããããªãšæããŸãã Twitterã¢ã«ãŠã³ããšã®äœµçšã¯å€§å€ éå¶ãããªãã§ãTwitterã¢ã«ãŠã³ããäœã£ãŠèšäºå
¬éãã¢ããŠã³ã¹ãããšãæµå
¥ãå¢ããããããªãããšãã仮説ã§ãã£ãŠã¿ãŸããã ããããããã¯ç¹ã«å¹æã¯ãããŸããã§ããã ããããå
¬éã®ã¢ããŠã³ã¹ã ãã§ãªãããã©ãã¯ãŒãå¢ããæœçãããºçããã€ãŒããªã©å¥ã®ããŠããŠãå¿
èŠããã ãªãšæããŸããã ããã°ã®ãã¶ã€ã³ã¯ã¬ã¹ãã³ã·ãã«ããã»ããè¯ã ã¯ãŠãªããã°ã®ã«ã¹ã¿ã ããŒãã ãšãã¬ã¹ãã³ã·ãã«å¯Ÿå¿ããŠããªããã®ãå€ããããŸãã æ¬ããã°èšªåè
ã®ããã€ã¹å
èš³ã¯ä»¥äžã®ããã«ãªã£ãŠããã ã¢ãã€ã«ã60%以äžå ããŠãã ã®ã§å¯Ÿå¿ããŠããã»ããããã§ãããã â» Google Analyticsãã蚪åè
ã®ããã€ã¹å
èš³ æåŸã« 1幎éã®ãšã³ãžãã¢ããã°éå¶ã®ãŸãšããæ¬èšäºã§ãããŠããããŸããã ãã£ãããŸãšãããšãçå£ã«ãšã³ãžãã¢ããã°ãšåãåã£ãŠãããŒã¿ãèŠãããèè
ã«å¯ãæ·»ã£ããããããšã§ä»¥äžã®ç®çãæããããšãã§ãããšããããšã«ãªããŸãïŒ æ¡çšã®ãã©ã³ãã£ã³ã° â ãšã³ãžãã¢çµç¹ã®æé· â åäººã®æé· â 0ããã¯ãããŠãæ°å€çã«ã質çã«ã宿ã§ããã»ã©ã®ææãæããçµéšã¯ãªããªãã§ããªãã®ã§ããšãŠã楜ãã1幎ã§ãã(Google AnalyticsãšãèŠããã³ã«ã¯ã¯ã¯ã¯ããŠãã) æ¥å¹Žã¯SEOã匷åããŠå®åžžçã«PVãç²åŸããããç¹å®ã®æè¡ã®èšäºãåãããŠãããã©ã³ãã£ã³ã°ãããšã次ã®ã¹ãããã«é²ããããã°ãããªãŒãšæããŸãïŒ ä»¥äžã§ä»å¹Žã®æåŸã®èšäºã¯çµãããšãªããŸãïŒ 1幎éããããšãããããŸããïŒ *1 : https://note.com/chanmoro/n/n4473f2f14a12 *2 : https://lapras.connpass.com/event/155775/ *3 : https://tech.smartcamp.co.jp/entry/2019/01/22/153532 *4 : https://tech.smartcamp.co.jp/entry/2019/08/29/115331 *5 : https://tech.smartcamp.co.jp/entry/first-scurm-summary *6 : https://tech.smartcamp.co.jp/entry/engineer-onboarding