ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ç§å·ã§ãã åŒç€Ÿã§ã¯æšå¹Žãããšã³ãžãã¢å宿ãäŒç»ããŠããŸããŠãä»å¹Žã¯10æ15æ¥ãã17æ¥ãŸã§ã®2æ³3æ¥ã§å®æœããŸããïŒ å宿ã®ããŒããå
šäœæã¯å¥èšäºã§ãŸãšããããªãšæããŸããã3æ¥ã®éãããæéã§1ããŒã (4人)1ã€ã®ãããã¯ããäœããææãšããŠçºè¡šããå¿
èŠããããŸããã ãã®æ¡ä»¶ã ãšããŸãæè¡çãªãã£ã¬ã³ãžãã§ããªããª...ãšæããŠã¯ããã®ã§ãããã©ãããŠãããŒã å
ã§GraphQLè§Šãããæ¬²æ±ãé«ãŸã£ãŠããŸã£ãã®ã§ããªããšãè² è·ãããŸãããããªã圢ã§å°å
¥ã§ããªãã調ã¹ãŠèŠã€ãã£ãã®ãPrismaãšããããŒã«ã§ããïŒ æ¬èšäºã§ã¯Prismaã詊ããéã®ã¡ã¢ãTipsãææãæžããŠãããŸãïŒ (å
¬åŒã§Prisma2ãã¢ããŠã³ã¹ãããŠãŸãããã»ãŒå¥ç©ãªã®ã§ä»åã¯Prisma1ã«ã€ããŠæžããŠããŸã) (å€åæçµçãªææç©ã®é²æã¯ãæ
£ã芪ããã ããŒã«ã䜿ã£ãå Žåãšã»ãŒåãã ã£ãããªãšæã£ãŠããŸã) GraphQLãšã¯ Prismaãšã¯ ã€ã³ã¹ããŒã« åæå èµ·å ã¯ãšãª Mutation Query Tips Seedãå®è¡ãã ããŸã«DBãResetããå¿
èŠããã ææ GraphQL ãšã¯ GraphQLãšã¯ãWeb APIã®ããã®èŠæ Œã®ïŒã€ã§ããã¹ããŒãå®çŸ©ããšãã¯ãšãªå®çŸ©ãã«ãã£ãŠãµãŒããšã¯ã©ã€ã¢ã³ãã®éä¿¡ããµããŒãããŸãã ãã¹ããŒãå®çŸ©ãã§æšæºåãããåä»ãã®ã¹ããŒããå®çŸ©ããããã«åã£ãã¯ãšãªãã¯ã©ã€ã¢ã³ãããçºè¡ããããšã§ãå®å
šã§æè»ã«ããŒã¿ååŸãè¡ããŸãã 詳ããã¯å
¬åŒããã¥ã¡ã³ããªã©ãèªã¿ãã ããã ãŸããGitHubãå€éšåãAPIãšããŠGraphQLãæ¡çšããŠããã®ã§ããã¡ãã§è©Šãã®ãè¯ããšæããŸãã developer.github.com Prisma ãšã¯ ã€ã³ã¹ããŒã«ããGraphQLã®ã¹ããŒãå®çŸ©ãããã ãã§ã以äžãã§ããããã«ãªã䟿å©ãªããŒã«ã§ãã èµ·åçšdocker-compose.ymlçæ ããŒã¿ç®¡çã¢ããª(Prisma Admin) CRUDã®èªåçæ(GraphQLãµãŒãã®å®è£
) DB(MySQL/PostgreSQL)ãžã®Migration Seedå®çŸ© CRUDã«ã¢ã¯ã»ã¹ããã¯ã©ã€ã¢ã³ã(JavaScript, TypeScript, Golang)çæ ã€ã³ã¹ããŒã« ãŸãã以äžã®ããã«package.jsonãå®çŸ©ãã yarn install ãªã©ã§äŸå解決ããŸãã package.json { " name ": " prisma-sample ", " devDependencies ": { " prisma ": " ^1.34.8 ", " ts-node ": " ^8.4.1 ", " typescript ": " ^3.6.3 " } } åæå Prismaã¯initã³ãã³ãããããããã«ããå¿
èŠãªãã¡ã€ã«ãèªåçæããŠãããŸãã 以äžã®ããã« yarn prisma init ãšå®è¡ãããšããããŒã¿ããŒã¹ã®æ¥ç¶å
ãã©ããããããããŒã¿ããŒã¹ã®çš®é¡ã¯ãªã«ãããPrismaãµãŒãã«ã¢ã¯ã»ã¹ããããã®ã¯ã©ã€ã¢ã³ããçæããããã®è³ªåãã§ãŸãã 以äžã§ã¯ãLocalã®Dockerã§MySQLãæ°èŠã§èµ·åããTypeScriptã®ã¯ã©ã€ã¢ã³ããçæããããã«ããŸããã $ yarn prisma init ? Set up a new Prisma server or deploy to an existing server? Create new database ? What kind of database do you want to deploy to? MySQL ? Select the programming language for the generated Prisma client Prisma TypeScrip t Client Created 3 new files: prisma.yml Prisma service definition datamodel.prisma GraphQL SDL-based datamodel ( foundation for database ) docker-compose.yml Docker configuration file Next steps: 1 . Start your Prisma server: docker-compose up -d 2 . Deploy your Prisma service: prisma deploy 3 . Read more about Prisma server: http://bit.ly/prisma-server-overview Generating schema... 25ms Saving Prisma Client ( TypeScript ) at /Users/takigawa.yosuke/projects/personal/prisma-sample/generated/prisma-client/ âš Done in 31 .93s. å®è¡åŸã«ä»¥äžã®ãã¡ã€ã«ãçæãããŠããã°OKã§ãã prisma.yml Prismaå
šè¬ã®èšå®ãèšè¿°ãã datamodel.prisma GraphQLã®ã¹ããŒãå®çŸ© docker-compose.yml PrismaãµãŒããDBãªã©èµ·åçš èµ·å $ docker-compose up -d $ docker-compose ps Name Command State Ports ---------------------------------------------------------------------------------- prisma-sample_mysql_1 docker-entrypoint.sh Up 3306 /tcp, 33060 /tcp mysqld prisma-sample_prisma_1 /bin/sh -c /app/ start .sh Up 0 . 0 . 0 .0:4466- > 4466 /tcp localhost:4600/_admin ã§Prisma Admin(Sequel Proã¿ãããªããŒã¿é²èЧãã¢ããããŒããªã©ã§ãã)ã«ã¢ã¯ã»ã¹ãã§ããŸãã ( localhost:4600 ã§ããªãã¿ã®GraphQLã®Playgroundã«ãã¢ã¯ã»ã¹ã§ããŸããPrisma Adminã®ã»ãã䜿ãåæãããããã§ã) datamodel.prisma ã«åæç¶æ
ã§ User ãå®çŸ©ãããŠããã®ã§ä»¥äžãå®è¡ããPrismaãµãŒããæŽæ°ãããšPrisma Adminã§ãUserã確èªã§ãããšæããŸãã $ yarn prisma deploy ããã§ã»ãŒæºåã¯å®äºã§ãïŒ ã¯ãšãª 詊ãã«ããŒã¿å®çŸ©ã以äžã®ããã«ä¿®æ£ããŠããCreateããReadãã®ã¯ãšãªãäœæããŠã¿ãããšæããŸãã ãŠãŒã¶ã®æå±ããäŒç€Ÿã远å ããæ³å®ã§ã®ã¹ããŒãå®çŸ©ã远å ããŸã(Company has_many Usersã§ãã) ID! @id ã§ãŠããŒã¯ãã€ã€ã³ããã¯ã¹è¿œå ãããŠãããŠããããã§ã @hogehoge ã¯Prismaã®ã¢ãããŒã·ã§ã³ã§ããã€ãçš®é¡ããããã é¢é£å®çŸ©ãããéã«ãçžäºã«åç
§å®çŸ©ããã»ããã¯ãšãªãæžãéã«æ¥œãã datamodel.prisma type Company { id: ID! @id name: String! users: [User!]! } type User { id: ID! @id name: String! company: Company! } â» datamodel.prismaæŽæ°åŸã¯ãPrismaãµãŒãã« yarn prisma deploy ã§åæ ããŠãã ãã Mutation 詊ãã« Companyã1ã€ãUserã2ã€çæããŠã¿ãŸãã mutation { createCompany(data: { name: "ã¹ããŒããã£ã³ã", users: { create: [ {name: "ç§å·ã¹ã倪é"}, {name: "ç§å·ã¹ã次é"} ] } }) { id } } Prisma Adminã§ã¯ãšãªãå®è£
ãããšãè£å®ããã£ãããšå¹ããŠããŠãã°ãããã§ããïŒ createCompany ãªã©ã¯Prismaã«ãã£ãŠèªåçæããããã®ã§ãã createCompany ã® ããã㯠{} ã¯mutationæåæã«è¿åŽããŠã»ããããŒã¿ãèšè¿°ããŠããŸãã ãªã®ã§å®è¡åŸã®Responseã¯ä»¥äžã®ããã«èªåä»äžãããIDãå«ãŸããŠããŸãã { " data ": { " createCompany ": { " id ": " ck2q06vkc006n07980p4l1av0 " } } } Query çæããCompanyãšUserããã¹ãŠååŸããã¯ãšãªãäœæããŸãã query { companies { id, name, users { id, name } } } çµæããã¡ãã«ãªããŸãã { " data ": { " companies ": [ { " id ": " ck2q06vkc006n07980p4l1av0 ", " name ": " ã¹ããŒããã£ã³ã ", " users ": [ { " id ": " ck2q06vmf006o07989z7b6e1s ", " name ": " ç§å·ã¹ã倪é " } , { " id ": " ck2q06vmo006p0798yllvbja7 ", " name ": " ç§å·ã¹ã次é " } ] } ] } } ãã®ã¯ãšãªãšã¬ã¹ãã³ã¹ã®ããããããã¯GraphQLã®ã¡ãªããã®ïŒã€ã§ãããã ã¡ãªã¿ã«Prismaã§ã¯ãããŒã¿ã®çµã蟌ã¿çšã®é¢æ°ãçµã¿èŸŒãŸããŠããŸã(䜿ãåæã¯å°ããããããã§ãã...) äŸãã°ãäŒç€Ÿåããã£ã³ããå«ã¿ããŠãŒã¶åã®åŸæ¹ã次éã§ã¯ãªããã®ãããªæ¡ä»¶ã ãšä»¥äžã®ããã«ãªããŸãã query { companies(where: { name_contains: "ãã£ã³ã" }) { id, name, users(where: { name_not_ends_with: "次é" }) { id, name } } } ãã®ãããªPrismaã«ãã£ãŠçæãããŠãããã®ã¯éåžžã«ããããããã®ã§ãå
¬åŒããã¥ã¡ã³ããè£å®ãããã¿ãŠæ
£ããŠããå¿
èŠãããããã§ãã Tips Seedãå®è¡ãã 以äžã®ããã«TypeScriptã®Prismaã¯ã©ã€ã¢ã³ããçæããããã䜿ã£ã seed.ts ãts-nodeã§å®è¡ããŠããã ãã§ããã prisma.yml generate : - generator : typescript-client output : ./generated/prisma-client/ seed : run : yarn ts-node ./seed.ts seed.ts import { prisma } from './generated/prisma-client' async function main () { await prisma.createCompany ( { name: 'ã¹ããŒããã£ã³ã' } ) } main () . catch ( e => console.error ( e )) $ yarn prisma seed ããŸã«DBãResetããå¿
èŠããã ã¹ããŒãå®çŸ©ã§é¢é£ã倿ŽããããSeedã2åå®è¡ãªã©ããšã©ãŒã«ãªãããããªã»ããããå¿
èŠãåºãŠããŠããŸããŸãã ããŒã«ã«ã§ã¯ä»¥äžã®ã³ãã³ãäžçºã§ããããããã¯ã·ã§ã³ã§ã¯ã©ã®ããã«éçšãããšããã®ã§ãããã... æãã§ãã $ yarn prisma reset ææ GraphQLèªäœã¯ãåŠçãã¯ã©ã€ã¢ã³ãã«å¯ããããŠãå¿
èŠãªããŒã¿ãéœåºŠååŸã§ããã®ã§ããããããæããŸããã ãŸããåãããã®ã§ãPrismaã®ãããªèªåçæããã¿ã€ãã®ããŒã«ã§ãè£å®ãå¹ããå°å
¥éå£ã¯äœãæããŸããã ãªã«ãããä»åå°ããªã¢ããªã±ãŒã·ã§ã³ãäœæããã®ããããŸããããµãŒããµã€ãå®è£
èŠããªããŠããã³ãå®è£
ã ãã§æžãã ã®ã¯æ°ããå¯èœæ§ãæããããŸãã...ïŒ ãã è€éãªããŒã¿ãååŸããå Žåããããªãã«ã¯ãšãªãè€éã«ãªãã®ãšãPrismaã®ä»æ§ãGraphQLã®ä»æ§äžããŸãååŸã§ããªãæ¡ä»¶ããã£ãã(ç¥èäžè¶³ããããšæããŸãã)é£ãããæããŸããã (ããšãå
¬åŒã§ã¯Prismaãšããã³ããšã³ããšã®éã«ãã1éå±€GraphQLãµãŒããRest APIãµãŒããæãã®ãæ³å®ããŠãããããªã®ã§ããã®ããããä»åã¯ç¡èŠããé£ããããããŸãã) ãŸããã«ã¯ã€ã³ãµãŒãã§ããªããšãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã§ããªããã¹ããŒãã®å€æŽãããéã«resetããããåŸãªããªããªã©ãããŒã«ãšããŠã®æç床ã¯ãŸã ãŸã äœãããªãšæããŸããã ãã ãGraphQLèªäœäŒžã³å§ãããšããã§ããããããããã¯ã·ã§ã³å°å
¥ãã¡ãã»ãèããå§ããã®ã§ããããã倧ãã«é£èºãããšæããŸãã Prisma2ã¯ãŸãæ¯è²ãéã£ãŠãããã¹ã¢ãŒã«ã§å®çšçãªããŒã«ã«ãªã£ãŠãããããªã®ã§ããã¡ããä»åŸè¿œã£ãŠãããããªãšæããŸããã ãªã«ã¯ãšããããGraphQLãPrismaãæ°æèŠã§ãããããã£ãã§ãïŒ å宿æé«ã§ããïŒ
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ç§å·ã§ãïŒ å
æ¥ã B2B SaaSãšã³ãžãã¢Meetup - SharingIssues ãšããã€ãã³ããåŒç€Ÿã§éå¬ãããŠããã ããŸããã æ§ã
ãªã€ãªããããçºè¡šæ ãåãŸããåå è
ãåœåæ³å®20人ã§ãããã çµæ40å匷 ãã®æ¹ã«ãè¶ãããã ãããšãŠãå
å®ããäŒã ã£ããšæããŠããŸãã ç§ãäž»å¬è
åŽã§ã¯ãããã®ã®ãçºè¡šãé¢çœãèãå
¥ã£ãŠããã®ã§ã ä»åã¯äžåå è
ãšããŠã®ã¬ããŒããå
¬éããããšæããŸãïŒ ã¡ãªã¿ã«ã€ãã³ãã®æŠèŠã¯ä»¥äžã§ç޹ä»ããŠããŸãã 宿éå¬äºå®ãªã®ã§ããèå³ããã°ãã§ãã¯ããã ããã°ãšæããŸãã tech.smartcamp.co.jp ãB2Bé åã«ãããéçºçµç¹äœã ãæ¡çšç·šã ãã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿ ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒ ç±³å
ãã æŠèŠ ææ³ ãéçºãªãŒããŒãçµæçã«PMãšåŒã°ãããŸã§ã ã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿ PdM é·ç°ãã æŠèŠ ææ³ ãB2BãµãŒãã¹ãäœãäžã§å¿ãããŠããããšãæ ªåŒäŒç€ŸãããŒãã©ã¯ãŒã VPoE æžè°·ãã æŠèŠ ææ³ ãã€ã³ã¿ãŒãã«ããŒã±ãã£ã³ã°ã§ç¹ãæããã«ããããã¯ãéçºãæ ªåŒäŒç€Ÿãªã³ã¯ãŠã§ã« CTO æžæ¬ãã æŠèŠ ææ³ ãB2BSaaSéçºã«ãããã¢ãããŒã·ã§ã³ãããŒãžã¡ã³ããA1Aæ ªåŒäŒç€Ÿ æœæ ¹ç°ãã æŠèŠ ææ³ ãB2B補åéçºã«ããã7ã€ã®å€±æãæ ªåŒäŒç€Ÿã·ã£ãã³ CTO å ãã æŠèŠ ææ³ å
šäœéã㊠⻠ã¡ãã£ã¢ã«æ²èŒãããŸããïŒïŒ(2019/11/25远èš) ãB2Bé åã«ãããéçºçµç¹äœã ãæ¡çšç·šã ãã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿ ãšã³ãžãã¢ãªã³ã°ãããŒãžã£ãŒ ç±³å
ãã speakerdeck.com æŠèŠ èªå·±çµç¹åããããŒã + åçŸæ§ãç®æããŠãã 管çè
ãããªããŠãåãã æ¡çšã課é¡(ãããŒãžã£ãŒã«ãªã£ãŠããå®çžŸ0åã ã£ã) èŠæ±ãé«ãã®ã ããæ¹ãééã£ãŠããã®ã æèè
ã«ãã¢ãªã³ã°ããŠããã£ãããš æ¹åæ§ã¯æªããªã åæ¹é¢ã§ãããããããªã æ¡çšãããŒã±ãã£ã³ã°ã®èããå¿çšããŠãããã Lead Generation æ¯éå£ãå¢ãã Nurturing(ä»åããã ã話ã) å¿æåºŠãäžãã äŒç€Ÿè³æå
¬é éçºçµç¹èª¬æè³æå
¬é ãããã¯ãããšã®èª¬æè³æå
¬é ãšã³ãžãã¢ããã° ã¡ã³ããŒã®ããšãç¥ã£ãŠããã å
šå¡ã®ã¹ãã¬ã³ã°ã¹ãã¡ã€ã³ããŒå
±æ å
šå¡ã®æ§æ Œèšºæå
±æ äœéšå
¥ç€Ÿ Closing æ¡çšæ¿è«ŸãåŸã Onboarding å®çã»æŽ»èºããŠããã â- ãŸãšã çµç¹å
šå¡ã§æ¡çšã«æã¡èŸŒã ãšã«ããäŒããåªå 匱ã¿ãçè§£ãã ææ³ æ¡çšãããŸãã§ããªãã£ããšãã«ãæ¡çšã®åãã§ãŒãºã§æœçãèããŠå®æœãã話ã§ããã B2BäŒæ¥ã¯ãããã¯ããç®ã«ããæ©äŒããããªãããšã³ãžãã¢ãªã³ã°ã«ã€ããŠã衚ã«ããŸãåºãªãã®ã§ãæ¡çšã«ã圱é¿ããŠãããšæããŸãã èªç€Ÿã§ããã瀟å¡ã®ã¹ãã¬ã³ã°ã¹ãã¡ã€ã³ããŒã®çµæãªã©ãåè£è
ã«äŒããŠããã®ã¯ãšãŠãããããããšæã£ãŠããŸãã ãéçºãªãŒããŒãçµæçã«PMãšåŒã°ãããŸã§ã ã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿ PdM é·ç°ãã speakerdeck.com æŠèŠ å
æ¬æšPMã§ãçºè¡šããå
容 PdMã«ãªããããšã³ãžãã¢ã«åããå®äœéšãèªãçºè¡š æ°èŠãããã¯ãã®Biscuetã®PdM éçºããäžã§2床ã®è¶å¢(圹å²ãå€ãã£ãããšãèªèŠãããã£ãã) â- ãããã¯ãã®æ¹éãšãæç¢ºã«ãã人ãããªã æ¡çšãããèªåãããã -> ããããããŸã ææãæ®ãããã«éçºãããªããšæ±ºããïŒ äœãããæ©ãåžå Žã«åºãïŒ ãã£ãæœç(éèŠåºŠãšåªå
床ã®ã¡ããªã¯ã¹ãäœã£ãŠå®æœ) ãã¡ã€ã³ç¥èåäž æå°éã£ãŠãªãã ãããããããã Expo, ã«ã³ãã¡ã¬ã³ã¹, ã»ãã㌠éçºã¡ã³ããŒãžãTheMODELå匷äŒã宿œ etc... ææ³ ãããã¯ãéçºãããäžã§ãå¿
èŠãªåœ¹å²ãèªåã§ãã£ãŠãã£ããããããPdMãšãã圹å²ã ã£ããšããçºè¡šã ãã¡ã€ã³ç¥èãå€ãå¿
èŠãšããB2Bæ¥çã§ãæ©ã䟡å€ãå±ããããã«ãå¶æ¥ã®ã»ãããŒãžã®åå ãããŒã ãžã®TheMODELã®æ®åãªã©æŽ»åããŠããã®ãå°è±¡çã§ããã ãB2BãµãŒãã¹ãäœãäžã§å¿ãããŠããããšãæ ªåŒäŒç€ŸãããŒãã©ã¯ãŒã VPoE æžè°·ãã speakerdeck.com æŠèŠ éçºè
ãšããŠãã£ãŠããã£ãåãçµã¿ãçŽ¹ä» BtoB æ¥åãããŒã«åã蟌ãŸããŠãããããµãŒãã¹ãæ¢ãŸããšä»äºãæ¢ãŸã ãã©ãœã³ã£ãœãéçº 120%ãããã£ãš80%éçºã®æ¹ãè¯ããã ãã®ããã®åãçµã¿ åè±èŸå
žã®ãããªãã®ãäœã(瀟å
Wiki) payment allowance family name last name dept_id department_id 衚èšãããé²ããã ã¢ã¯ã¢ã¯äŒ äŒè°å®€ãå°æããŠäžç·ã«ããã ã 声ã«åºãã°è§£æ±ºããããç°å¢ãäœã ããæ±ºå®ãããããªãæ±ºå® ããã°ãããšããŠãã 10ã®ä»äºãçµããã°3çãŸãã 瀟å
ã®ä»ã®åãçµã¿ 瀟å
çšèªéãå
å® å
šç€Ÿçšèªé ãããã¯ãçšèªé æ¥ççšèªé æ°åä»ããèããªãçšèªé **ããã®çšèªé æŽå²ãªãªãšã³ éå»ã®è² åµ æºæãšãšãã«æªæ¥ã©ãããŠããããããäŒããäŒ ãã«ã¹ãµãŒã〠& ãªã³ããŒãã£ã³ã°FB ä»ã®èª²é¡ã«æ°ã¥ããã dmemoéçšããŠã ïŒã¶æã«äžåæªæ¥çµç¹å³äŒè° ãã®äººãããããã䌞ã³ãŠãããã¯ã ããžã·ã§ã³å€æŽãæ¡çšã«æŽ»ãã ææ³ ããªãå
·äœçã«åãçµã¿ã玹ä»ããŠããã ããŸããã çšèªéãdmemoãªã©ã¯ããã£ãã»ãããããéçš(远å ã»æŽæ°)ã課é¡ãšãªã£ãŠããŸãã®ã§ãããã瀟å
ã§å®çããŠããã®ãããããšæããŸãã(ããå°ã詳ããèãããã£ã) éå»ã®è² åµã颚åãããªãããã«ããããã¯ãã®æŽå²ãªãªãšã³ã宿œããåãçµã¿ã¯åŒç€Ÿã§ããã£ãŠã¿ãããšæã£ãŠããŸãã ãã€ã³ã¿ãŒãã«ããŒã±ãã£ã³ã°ã§ç¹ãæããã«ããããã¯ãéçºãæ ªåŒäŒç€Ÿãªã³ã¯ãŠã§ã« CTO æžæ¬ãã speakerdeck.com æŠèŠ åŸæ¥å¡13å ãšã³ãžãã¢6å â- ç
é¢ãäœã£ãŠããäŒç€Ÿ äºçŽæé©åãè¬ãªã¢ãŒã賌å
¥ãªã© ãããã¯ããè€æ°ãããã¡ã³ããŒã®ã¢ãããŒã·ã§ã³ãé«ãããã£ã¡ããã£ã¡ãæãåºã ãã£ã¹ããã¢ããŒã¯ã«ãªã çºæ£ããŠããŸã åå ã¯åäººã®æèã«ãã©ã€ãªãªãã£ããªã ããžã·ã§ã³ãåãããããšãã ã©ãã誰ãæ
åœããã ããŸãè¡ããªã å
šéšã«é¢ãããã 信念ããã åãçµã¿: ã€ã³ã¿ãŒãã«ã»ããŒã±ãã£ã³ã°ã宿œãã 瀟å
ã«ããªãã説æãã åãçµã¿: ã仿¥äžã€ããã§ããªããªããªã«ããããããšåãããã æ¬äººã«äžçªãèŠã€ããŠããã æ¬äººã®ããããããšã«ããã¹ãããšãéããåã(èªçºçã«) åžæããã¶ã£ãã... æ¡çšããæèããŠãã®ã§ããŸããã¶ããªã å°ããçµç¹ã ãããªããšããã ã ãããããªããªãèªåããã ææ³ å°èŠæš¡ãªçµç¹ã§å
šå¡ãã¢ãããŒã·ã§ã³é«ãç¶æ
ããã€ãã¹ã«åãäºäŸã¯å
±æã§ããŸããã ã仿¥äžã€ããã§ããªããªããªã«ãããããåããããã®ã¢ãããŒãã¯ãªãã»ã©ãšæããŸããã äœè«ã§ãããã¹ã©ã€ãã®ã€ã©ã¹ããçµ¶åŠã§é¢çœãçºè¡šã§ããã ãB2BSaaSéçºã«ãããã¢ãããŒã·ã§ã³ãããŒãžã¡ã³ããA1Aæ ªåŒäŒç€Ÿ æœæ ¹ç°ãã speakerdeck.com æŠèŠ B2B Horizontal SaaS ã©ãã®äŒç€Ÿã§ãããã ããæ¥åãæäŸ Vertical SaaS æ¥çç¹å ã€ã¡ãŒãž B2Cã«æ¯ã¹ãŠã¯ãªãšã€ãã£ããããªã åèšå€ãã æè¡ãã£ã¬ã³ãžå°ãªãã ã€ã¡ãŒãžãèŠããã Vertical SaaS æ
å ±åéãé£ãã è³Œè²·ææ¬²ãšã åèã«ãªãã¢ããªã±ãŒã·ã§ã³ãå°ãªã 宿¥åãé£ãã ãœãªã¥ãŒã·ã§ã³ ã»ãã㌠ãã¡ã€ã³ãšãã¹ããŒããžã®ãã¢ãªã³ã° èŠæãå€ãã»å€æ§ è£œé æ¥ã倿§ ãœãªã¥ãŒã·ã§ã³ 課é¡ã®è¿œæ± AsIs/ToBeã·ãŒã ã¹ããŒãªãŒããã 仮説æ€èšŒãé£ãã ããªãŒãã¢ã ãããã¯ãå°ãªã ã¢ããããŒãã«æ
é(ABãã¹ããšãããããã) äžåºŠã®ãã¹ãã¯ãªãã£ã«ã« ãœãªã¥ãŒã·ã§ã³ PMF ãã£ã¢ã«ãã©ãã¯ã¢ãžã£ã€ã« â æè¡ãã£ã¬ã³ãž B2B SaaSã®ããŒã¿ã¢ããªã³ã°ãšã GraphQLã«ãã£ã¬ã³ãž å€èšèªå¯Ÿå¿ MicroService BigQuery, TreasureData, DataDog å¿
èŠæ§ã«å¿ããŠãã£ã¬ã³ãžã³ã° â æ·±ããã¡ã€ã³çè§£ é¢šåæ·ãæå€§ã«åºããäžã§ã®ãããã ãªèšèš æªæ¥ãæããæè¡ãã£ã¬ã³ãž â ã¢ãããŒã·ã§ã³ã¯æºããã ææ³ èŠæãå€ããããªãŒãã¢ã ãããã¯ããå°ãªããªã©ãB2Bãªãã§ã¯ã®èª²é¡ã«å¯ŸããŠãæ§ã
ãªã¢ãããŒããçæ¯ã«å®æœããŠè§£æ¶ããŠããå°è±¡ã§ããã ãããããæããã¢ãããŒã·ã§ã³ã匷ãæããŠããã®ããšãŠãäŒããçºè¡šã§ããã å課é¡ã«å¯Ÿãããœãªã¥ãŒã·ã§ã³ããæ¥çã®æé·ãæè¡ã®é²æ©ãªã©ã§å¢ããŠãããšæããŠããã®ã§ãããäžå±€æ¥œãã¿ãªé åãªããããªãããªãšæã£ãŠããŸãã ãB2B補åéçºã«ããã7ã€ã®å€±æãæ ªåŒäŒç€Ÿã·ã£ãã³ CTO å ãã speakerdeck.com ⻠远èš:2019/11/06 è³æãã¢ããããŠããã ããŸãã æŠèŠ 7ã€ã®å€±æ 倱æãèžã¿æããŠãã®ã§å
±æ 顧客ããšã«ã«ã¹ã¿ãã€ãºåãã¡ãã 売äžã§ããšèšããããšãããããªãã... å¿ã鬌ã«ãã 課é¡ã®çªãè©°ãã éçºã¯ãããããå¶æ¥ã»ããŒã±ãå°ãªã å°ãªãã客ããã«ãã£ããããã«ããããšãªãã㡠補åã«ãã£ããããã客ãããã³ã¹ããããŠæ¢ãã¹ã å¶æ¥ãæ©èœã®ååšæçŸ©ã説æã§ããªã ã€ã³ã¿ãŒãã«ã»ããŒã±ãã£ã³ã° ç®çãéèŠ å¶æ¥ã»ããŒã±ã»éçºãæ©æž¡ããã人ãå¿
èŠãã ç®æãã¢ãŒããã¯ãã£ãšçµç¹å³ããããŠãã Perlã¢ãžã¥ãŒã«é¡ããã¯æ»ãã ãªãã¬ã€ã¹çµç¹ãåãã¡ãã£ã çµç¹ãšæè¡çãªã¢ãŒããã¯ãã£ã¯äŒŒãŠãã æœåšçã«äººã¯çµç¹ã«æºæ ããè¡åãåã éèŠãªèª²é¡ã解決ããŠãªã ã¹ã³ãŒããåºãèŠæã倿§å èšã£ãŠããã®ã𿬲ãããã®ã¯éã ãéãåºããŠãŸã§ã»ããããšã¯ã©ã€ã¢ã³ãã«èããšããã...ãšãªã æãäžãã æè¡çè² åµã«åãåã£ãŠãªã GoogleDriveã§æ€çŽ¢ãããšãã£ã¡ããã(åŒãç¶ãè³æã«ãè² åµã) å°ããè² åµã¯éçºãµã€ã¯ã«ã«çã蟌ã 倧ããè² åµã¯ããžãã¹èª²é¡ã«çã蟌ã ãªãã§ãããªã·ãŒã決ããã®ãå€§äº èªåãã¹ããªã幎äœçœ®ããã°ãã³ãªãªãŒã¹ éœåºŠãªãªãŒã¹ãããã KPIã§å
šç€Ÿã®ææçéãå³ãããŠãªã 売äžä»¥å€ã«ãèå³ãæã£ãŠãå
šç€Ÿã®æ¹åæ§ãç¥ãã¹ã ä»äºãèŠãŠããã人ãèŠãŠãªã ãšã³ãžãã¢ã¯äººã«èå³ãªã(人ããã) 倧ããããšãããããã«ã¯äººãšåãåã£ãŠæè³ãã ãã®äººãäŒç€Ÿã®æ¹åæ§ãšèãããããããŠããã ææ³ å§å·»ã®å€±æäºäŸéã§ããã ã©ã®é
ç®ãB2Bæ¥çã§éçºãããŠãã人ã¯å
±æã§ããã®ã§ã¯ãªãã§ããããã ã·ã³ãã«ã«å€±æãšåŠã³ã玹ä»ãããŠããããããããèããŸããã å床ããã€ãã«çµã£ãŠãçºè¡šããŠããã ããããªãšæããŸããã å
šäœéã㊠ã©ã®çºè¡šãå
±æã§ããå
容ã§ããã€é¢çœã察çããããŠããè峿·±ãã£ãã§ãã çºè¡šãæèŠªäŒã®äžã§ãéå¬ã®ãã£ããã§ããããB2Bã£ãŠããŸãããŠããŠã衚ã«åºãªãããB2Bã¯ãã¡ã€ã³ã倿§ã§é£ããããšãã£ãæèŠãã¿ãªããæã£ãŠããããšãããããéå¬ããŠããã£ããªãšæããŸããã ãããããç¶ããŠããããšã§ãB2B SaaSéçºã§ã®ãããã©ããããããã«æ¥ãã°è§£æ±ºããå Žãäœã£ãŠããããã§ããïŒ æ¬¡ã¯12æéå¬ãç®æããŠããŸãïŒ â» ã¡ãã£ã¢ã«æ²èŒãããŸããïŒïŒ(2019/11/25远èš) Find careersããã«èšäºã«ããŠããã ããŸããïŒ ãšãŠãèªã¿å¿ãã®å
容ã«ãªã£ãŠããŸãã®ã§æ¯éèªãã§ããã ããã°å¬ããã§ãïŒ www.findcareers.jp
ã¹ããŒããã£ã³ãã®é·ç°ã§ãã ç§ã¯ BiscuetïŒãã¹ã±ããïŒ ãšããæ°èŠSaaSã®ãããã¯ããããŒãžã£ãŒãããŠãããŸãã Biscuetã§ã¯éçºããã»ã¹ã«èª²é¡ãæããŠãããããå€éšãã ã¢ãžã£ã€ã«ã³ãŒãã®å€©éãã ãã¢ããã€ã¶ãŒãšããŠå¬åããã¹ã¯ã©ã ã®å°å
¥ãé²ããŠããŸãã ããã§ä»åã¯ãBiscuetããŒã ã§å
æããå°å
¥ãé²ããŠããã¹ã¯ã©ã ã®çŸç¶ããããããã®ç»åãçšããŠãŸãšããŠã¿ãããšæããŸãïŒ ã¹ã¯ã©ã ã®åœ¹å² éçºããŒã ãããã¯ããªãŒããŒããŒã ã¹ã¯ã©ã ãã¹ã¿ãŒ ã¹ã¯ã©ã å
šäœå ã¹ã¯ã©ã ã®ã»ã¬ã¢ã㌠PBLïŒProduct BacklogïŒ SBLïŒSprint BacklogïŒ æäŒïŒDaily ScrumïŒ ã¢ãããã¹ããŒã¹ KPTïŒSprint RetrospectiveïŒ ãã®ä» æåŸã« ã¹ã¯ã©ã ã®åœ¹å² éçºããŒã éçºããŒã ã¯ãšã³ãžãã¢ã®3人ãäžå¿ãšãªã£ãŠéçºãé²ããŠããŸãã ãããããããã¯ãšã³ããããã³ããšã³ããã€ã³ãã©ãšãéã匷ã¿ã®æã€ã¡ã³ããŒãšãªã£ãŠããŸãã åãšã³ãžãã¢ããã¯ãšã³ããããã³ããšã³ããŸã§ã®éçºã¯åºæ¬çã«ã¯è¡ãããšãšããŠããŸãã éçºããŒã ã«ã¯ãã¶ã€ããŒãå
ŒåããŠãããšã³ãžãã¢ãæå±ããŠããã¶ã€ã³ã®æ¹ä¿®ãŸã§éçºããŒã ã§è¡ããããã«ããŠããŸãã ãããã¯ããªãŒããŒããŒã ãããã¯ããªãŒããŒã¯ããããã¯ããããŒãžã£ãŒïŒç§ïŒãšãå¶æ¥ïŒããŒã±ãã£ã³ã°ã®ãããŒãžã£ãŒã®2åäœå¶ãšããŠããŸãã 2åã«ããããšã§éçºãå¶æ¥ãŸã§ã®åºãæ
å ±ãå
ã«æææ±ºå®ãè¡ããããã«ããŠããŸãã ã¹ã¯ã©ã ãã¹ã¿ãŒ ã¹ã¯ã©ã ãã¹ã¿ãŒã®åœ¹å²ã¯å¬åããŠããã¢ãžã£ã€ã«ã³ãŒãã®å€©éãããæ
ã£ãŠããŸãã æ¥åã®ç®çãã¢ãžã£ã€ã«ã®ææ³ãçšããæ¥åå¹æã®æå€§åãšããããšã§ãã¹ã¯ã©ã ãã¹ã¿ãŒãã¹ã¯ã©ã ã ãã«ãšããããèªç±ã«åããããã«ããŠããŸãã èªç€Ÿã«ããããã¹ã¯ã©ã ã®èœãšãæãèŠã€ããããã«å¯ã«ã³ãã¥ãã±ãŒã·ã§ã³ããšããªããã¹ã¯ã©ã ã®å°å
¥ãé²ããŠããŸãã ã¹ã¯ã©ã å
šäœå Biscuetã§ã¯ã¹ã¯ã©ã ã®å
šäœåããã®å³ã§è¡šããŠããŸãã PBLãšSBLã®ç®¡çã« Asana ãæŽ»çšããŠããŸãã å
šç€Ÿå¡ãAsanaã®ã¢ã«ãŠã³ããæã£ãŠãã ãããBiscuetã®ã»ãŒã«ã¹ãå¥ãããã¯ãã®ã¡ã³ããŒããã€ã§ãèŠããããã«ãªã£ãŠããŸãã ã¹ã¯ã©ã ã®ã»ã¬ã¢ã㌠Biscuetã®ã¹ã¯ã©ã ã¯1é±éã¹ããªã³ãã§ãæææ¥ã«Sprint ReviewãSprint Planningãå
¥ããŠããŸãã ã¹ã¯ã©ã ãã¹ã¿ãŒã¯ææã®ã¿åºç€ŸããŠããŸãã Refinementã¯ç«ãéã«30åãã€å®æœããããšã§ã1é±éã®å
2æéãRefinementã«ç¢ºä¿ã§ããããã«ããŠããŸãã Sprint Reviewã¯ã»ãŒã«ã¹ãå«ããå
šãŠã®ãããã¯ãé¢ä¿è
ãåºåžããä»ã®ãããã¯ããšããããã®ãããã¯ãæ¹éãå
±éèªèãšãªãããã«ããŠããŸãã PBLïŒProduct BacklogïŒ PBLã¯ãããã¯ããªãŒããŒããŒã ã管çããŠããŸãã Sprintããšã«Asanaã®ã»ã¯ã·ã§ã³ãåãããšã§ãSprintã®ããã·ãã£ãèªåã§åèšãããããã«ããŠãŸãã Asanaã®ã«ãŒãå
ã«åãå
¥ãæ¡ä»¶ããŠãŒã¶ãŒã¹ããŒãªãŒãèšè¿°ãã圢ã§å©çšããŠããŸãã PBLã®ã¢ã€ãã ããšã®ã¹ããŒã¿ã¹ã¯ããããã¯ãã®éçºç¶æ³ããšã³ãžãã¢ä»¥å€ã§ãçè§£ã§ããããã«ããªãªãŒã¹ç¶æ³ã衚ãã¹ããŒã¿ã¹ãšããŠããŸããïŒæªçæãäœæ¥äžããªãªãŒã¹æžã¿ïŒ SBLïŒSprint BacklogïŒ SBLã¯éçºããŒã ã管çããŠããŸãã Planningã§èšç»ããã¢ã€ãã ã¯ãPBLãšã¯å¥ã®Asanaãããžã§ã¯ãã§SBLãšããŠç®¡çããŠããŸãã ãšã³ãžãã¢ã¯ãSBLã®ã¢ã€ãã ã«ã¢ãµã€ã³ãããã¢ã€ãã ããšã«Githubã®PRãäœæããéçšãšããŠããŸãã SBLã®ã¢ã€ãã ããšã®ã¹ããŒã¿ã¹ã¯ãéçºããŒã å
ã§ã®å
±æããããããããéçºç¶æ³ã衚ãã¹ããŒã¿ã¹ç®¡çã«ããŠããŸããïŒæªçæãwipãreviewãmergeïŒ æäŒïŒDaily ScrumïŒ Googleã«ã¬ã³ããŒãšSBLãèŠãªãããéçºããŒã å
šå¡ã®ãã®æ¥ã®æ¹éã確èªããããã«ããŠããŸãã ãããã¯ããªãŒããŒãå¿
ãæäŒã«åå ããããã«ããŠãããSprintã«åœ±é¿ããããããªèª²é¡ã®å
±æããã®å Žã§ã§ããããã«ããŠããŸãã æ¯åå¿
ãã¿ã€ããŒã§15åã¯ãããè¶
ãããã§ããéã匷å¶çã«çµäºããããšãšããŠããŸãã ã¢ãããã¹ããŒã¹ 52ã€ã³ãã®ãã¬ããæéä»ãã®å°ã«èŒãã3人ãåæã«äœ¿ãããµã€ãºã®æéä»ãã®æºãéçºããŒã ãåžžã«äœ¿ããããã«ããŠããŸãã AppleTVãèšçœ®ããã³ãã¯ã¿ã®å·®ãæ¿ããäžèŠã§ç»é¢å
±æãã§ããããã«ããŠããŸãã éå»ã¢ãããæåã¯ãããŸããã§ããããã¹ã¯ã©ã å°å
¥åŸããã¢ãæ¥åãåŸã
ã«å¢ããä»ã§ã¯ãšã³ãžãã¢ã®5å²ä»¥äžã®æéã¯ãããã§ã¢ãæ¥åãããããã«ãªã£ãŠããŸãã ã¢ãã¹ããŒã¹æ£é¢ã®çªããã¯æ±äº¬ã¿ã¯ãŒãèŠããŸãã æºã®äžã«çœ®ããŠãããã® Refinementã§ã¹ããŒãªãŒãã€ã³ããä»ããããã«ããã©ã³ãã³ã°ããŒã«ãŒïŒmixiããã®ããã«ãã£ïŒãåžžã«ã¢ãããã¹ããŒã¹ã«çœ®ããŠããŸãã è€æ°äººæ¥åã§ã®å©äŸ¿æ§åäžã®ãããã¯ã€ã€ã¬ã¹ã®ããŒããŒããšããŠã¹ã眮ããŠããŸãã KPTïŒSprint RetrospectiveïŒ Sprint Retrospectiveã¯ãKPTã®ãã¬ãŒã ã¯ãŒã¯ãå©çšããŠããŸãã KeepãProblemãTryã¯ãããããæžãæéã»çºè¡šããæéã§åºåããã¿ã€ããŒã§æž¬ã£ãŠKPTãé²ããŠããŸãã 宿œã決ãŸã£ãTryã¯ãSBLã«ä¹ããŠãéçºããŒã ã宿œã§ããããã«ããŠããŸãã ä»ç®ãšæ°Žæ§ãã³ ãã£ã¹ã«ãã·ã§ã³ãæãããã«ãä»ç®ãšæ°Žæ§ãã³ãããŒãã«å
¥ããŠãŸãšããŠæã¡éã¹ãããã«ããŠããŸãã ãã£ã¹ã«ãã·ã§ã³äžã«ä»ç®ãå¥ããããšéåžžã«ã¹ãã¬ã¹ãªã®ã§ã匷ç²çã®ä»ç®ã䜿ã£ãŠããŸãã ãã®ä» ã¹ã¯ã©ã ã®åèæç® ã¹ã¯ã©ã ã®ãã¬ãŒã ã¯ãŒã¯ãå®åã«åãå
¥ãããšã¶ã€ããå£ããšãŠãå€ããããã¹ã¯ã©ã ã¬ã€ããšSCRUM BOOT CAMPãããã«æã«åããå Žæã«çœ®ããŠãããååãèŠè¿ããããã«ããŠããŸãã ãªãã£ã¹ã®åšãã®æ§å é£ã®BOXILïŒãã¯ã·ã«ïŒããŒã ãã¢ããã£ãŠãŸããBOXILããŒã ã¯ã¹ã¯ã©ã ã§ã¯ãªãããããŸãå¥ã§ãŸãšããŠããããšæããŸãã ã¹ããŒã¹ã®åºåãã¯ãã£ã¹ã¿ãŒä»ããã¯ã€ãããŒããå©çšããŠããããã¯ã€ãããŒãããã€ã§ã䜿ãããããšãªã¢ãåºãããå Žåã¯ããã«åãããããã«ããŠãããããŸãã æåŸã« åŒç€Ÿã®ã¹ã¯ã©ã ã¯ãããã ã£ãã§ããããïŒ ã¹ã¯ã©ã ã¯åãå
¥ããã°ããã§ãçŸç¶Sprintã#6ïŒ6é±éåïŒããé²ãã§ããªããããä»åŸãæ¹åãç¹°ãè¿ããŠããããšã«ãªãããã§ãããäžæŠã¹ã¯ã©ã ã§ã®ãããã¯ãéçºãåãããã«ãªã£ãŠããããã瀟å
å€åãããªã«ãã®åèã«ãªãã°ãšæãçŸç¶ãèšäºã«ãŸãšããŠã¿ãŸããã æçµçã«ã¯ã¢ãžã£ã€ã«ã³ãŒãã®å€©éãããå±
ãªããŠãã¹ã¯ã©ã ãåãèªå·±çµç¹åããããŒã ãç®æããŠããã®ã§ãä»åŸã®ã¹ã¯ã©ã ããŒã ã®æé·ããšãŠã楜ãã¿ã§ãïŒ æåŸã«åç¥ã§ã¯ããããŸãããB2Bã®ãããžã¡ã³ãã«ã€ããŠåŒç€Ÿmeetupã§LTç»å£ãããŠããã ããŸãã®ã§ããèå³ãããã°ä»¥äžãªã³ã¯ããåç
§ãã ããã smartcamp.connpass.com
ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãããŠããäºäžã§ãã 仿ã®10/29ã«åŒç€Ÿã§ãšã³ãžãã¢ã€ãã³ã B2B SaaSãšã³ãžã㢠Meetup - Sharing Issues #1 ãéå¬ããããšã«ãªããŸããïŒ åŒç€Ÿã¯BtoBã§SaaSãæ±ãäŒæ¥ãšããŠã ãªããã®ã€ãã³ããããããšèããã®ã ã ã€ãã³ããéããŠå®çŸãããããš ããã®èšäºã§ç޹ä»ããããšæããŸãã èšäºãèªãã§ããã ããèå³ãæ¹§ããæ¹ã¯ä»¥äžããåå ç»é²ããŠããã ããã°å¹žãã§ãïŒ smartcamp.connpass.com ã€ãã³ãè¶£æš ãªããã®ã€ãã³ããããã®ã ãªãmeetupãªã®ã ä»åŸãã£ãŠããããš æåŸã« ã€ãã³ãè¶£æš ä»¥äžã«è©²åœããæ¹ã«éãŸã£ãŠããã ããB2Bæ¥çã§åããšã³ãžãã¢ãªãã§ã¯ã®èª²é¡ãè§£æ±ºæ¹æ³ãªã©ãå
±æããŠããã£ã¹ã«ãã·ã§ã³ãããå ŽãæäŸããããšæããŸãã B2Bæ¥çã§ãšã³ãžãã¢ã»ãã¶ã€ããŒãšããŠåããŠãã B2Bæ¥çã«èå³ããã åãæ¥çã®æ
å ±äº€æã»è°è«ãããã æ£çŽèª²é¡ãããå°ã£ãŠãã 課é¡è§£æ±ºã奜ã ...etc æ¯åå°ããã€ããŒããå€ããããšæããŸãããä»å㯠ãããžã¡ã³ãã«é¢ãã課é¡ã»è§£æ±º ãããŒãã«æ±ºå®ããŸããã ãªããã®ã€ãã³ããããã®ã BtoBã®é åã§ã¯ããžãã¹è·ãšã®ããåããæ§ã
ãªéšçœ²ãé¢ããããããã®èª¿æŽãäŒæ¥çžæã ããããèæ
®ããªããã°ãããªãåé¡ãªã©ãBtoCã®é åãšã¯å°ãç°ãªã課é¡ããããšæããŠããŸãã ç§éã¯ãè¯ã人ã®ãšããã«ã¯ãè¯ãæ
å ±ãéãŸãããšèããŠãããã€ãã³ããšããåœ¢ã§æ
å ±å
±æããå Žãäœãè²ãŠãŠããããšã§ãèªç€Ÿãšã³ãžãã¢ã®æé·ãããŠBtoBæ¥çã®ãšã³ãžãã¢ã®çç£æ§åäžãç®æããããšæã£ãŠããŸãã ãªãmeetupãªã®ã BtoBãšãã£ãŠãæ¥çããããã¯ãã«ãã£ãŠå€§ããå
容ãããšãªãã®ã§ãåå è
ãããããå
±æããå Žã解決ããå ŽãäœãåºããŠãã£ãŠã»ãããšããæå³ã§meetupã«ããŠãŸãã ä»åŸãã£ãŠããããš ã©ã®ãããªäººãéãŸããã«ãããã®ã§ãããããŒãããšã®åŒ·ãã³ãã¥ããã£ã«æŽŸçãããŠããã課é¡ã¯ãã®ã³ãã¥ããã£ã«èãã°åããç¶æ
ã«ããŠããããã§ãã äŸãã°æã¡å¯ã£ã課é¡è§£æ±ºã®ã¯ãŒã¯ã·ã§ãããªã©ãã€ãã³ãå
ã§è¡ããããããæé©ãªè§£æ±ºçãè€æ°åºãããããªãã®ãåºæ¥ãã°ãšèããŠããŸãã æåŸã« ããããããã«æé·ããŠããBtoB SaaSæ¥çã§ããšã³ãžãã¢ã課é¡ã«ã€ãŸããäºãªããããããµãŒãã¹ãžãšäŒžã°ããŠãããç¶æ
ãäœããããäžç·ã«ã³ãã¥ããã£ãè²ãŠãŠãããã°å¬ãããªãšæããŸãïŒ ä»åŸãšãããããããããããŸãïŒ
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ã€ã³ã¿ãŒã³çã®é«ç ã§ãïŒ é«ç æžãšæžããŠãããããªããããšèªã¿ãŸãïŒ(äŒç€Ÿã§ã¯ããã«ãŒãšåŒã°ããŠãŸã) ç§ã¯ã¹ããŒããã£ã³ãã§ã€ã³ã¿ãŒã³ãå§ããŠå幎ã»ã©çµã¡ãŸãããã€ã³ã¿ãŒã³ãå§ããã°ããã®é ããªãã£ã¹æ¥å®¢å¯Ÿå¿ã«éå¹çããæããŠããŸããã ããã§ãSlack APIãšGASã䜿ã£ãŠãªãã£ã¹æ¥å®¢æã®æåäœæ¥ã®èªååã«åãçµã¿ãŸããã æ¬èšäºã§ã¯ã©ã®ããã«èããŠãå®è£
ãšæ¹åãããŠãã£ãããã話ãããããšæããŸãïŒ æ¥å®¢å¯Ÿå¿ã«ããã課é¡ãšèŠä»¶ æ¥å®¢å¯Ÿå¿ã®æé å
·äœçãªèª²é¡ äœææ¹é å®è£
GASã§äºåã«ä»æ¥1æ¥ã®äºå®ãååŸ Slack APIã§èšªåéç¥ååŸ GASã察å¿ããäºå®ãæ€çŽ¢ Slack APIã§äºå®ãéç¥ Slack botã®åé¿ãšæ¹å ååã®åå¿ãšè¿œå æ©èœã®èŠæ 远å å®è£
ãå©çšãèŠæããã¢ãªã³ã°ã®ãµã€ã¯ã« çµããã« æ¥å®¢å¯Ÿå¿ã«ããã課é¡ãšèŠä»¶ æ¥å®¢å¯Ÿå¿ã®æé ã¹ããŒããã£ã³ãã§ã¯åºæ¬çã«ã€ã³ã¿ãŒã³çãã客ããŸãäŒè°å®€ã«ãéãããŠããŸããã ãéãããéã«ã¯ãã客ããŸã®ãååãã䜿çšããäŒè°å®€ããæ
åœè
ã®ååããå¿
èŠãªã®ã§ãããåŸæ¥ã§ã¯ Slackã«åä»ã·ã¹ãã ã®botãããã客ããŸã®ãååããéç¥ããã ãååã«å¯Ÿå¿ããäºå®ãGoogleã«ã¬ã³ããŒäžã§ç®èŠã§æ¢ã èŠã€ãããã䜿çšããäŒè°å®€ããæ
åœè
ã®ååããèšæ¶ãã ã客ããŸãäŒè°å®€ã«æ¡å
ããåŸãæ
åœè
ãåŒã³åºã ãšãããããŒã§ããã å
·äœçãªèª²é¡ äžèšæé ã§ã¯ãç®èŠã§æ¢ãããäºå®æ
å ±ãèšæ¶ããããªã©ééããèµ·ããããã®ã«å ããäžåºŠã®ãªãã¬ãŒã·ã§ã³ã«æéããããäºã課é¡ã§ããã ãŸããäŒç€Ÿãæé·äžã§æ¥ã«æ¥ã«ç€Ÿå¡ãå¢ããŠããçºããã®è² æ
ãå¢ããŠãã£ãŠãããšããåé¡ããããŸããã ããã§ãã®ãããŒãèªååããããšæããè¶£å³ãšããŠåãçµã¿ãŸããð äœææ¹é äž»ã«ä»¥äžã®ãããªæµãã§å®è£
ããããšã«ããŸããã ãŸããå®çšäžã®èª²é¡ãšããŠãReceptionistã«å
¥åãããååããã«ã¬ã³ããŒã«å
¥åãããååã®æŒ¢åãééã£ãŠããããšããããæŒ¢åã®ãã¿ããªãååŸã§ãã ãã¿ãã ãšãããã¿ããªæ€çŽ¢ã·ã¹ãã ã®APIãçšããŠããŸãã ã客æ§ãåä»ã§ååãReceptionistã«å
¥å ReceptionistãSlackã«éç¥ããã®ãGASã§ãã£ãã Googleã«ã¬ã³ããŒããäºå®ãæ€çŽ¢ ãã¿ããªæ€çŽ¢APIã§ååã Slackã«éç¥ å®è£
GASã§äºåã«ä»æ¥1æ¥ã®äºå®ãååŸ ãŸãã¯äŒè°å®€ããšã«è€æ°ããGoogleã«ã¬ã³ããŒã®äºå®äžèЧãååŸããŠããŸãã ãã®ååŸæã«ã ãã¿ãã ã®APIãå©çšãããã¿ããªãååŸããŠããŸãã ãŸãããã®ååŸã«ã¯æéããããã®ã§ãæ¥åæééå§1æéåã«ååŸããããã«ããªã¬ãŒãèšå®ããŸããã yomi-tan.jp ã³ãŒãã¯ä»¥äžã®ããã«ãªããŸããã var scheduleSheetId = PropertiesService.getScriptProperties().getProperties().sheetId; var spreadsheet = SpreadsheetApp.openById(scheduleSheetId); var calendars = [ CalendarApp.getCalendarById( 'ã«ã¬ã³ããŒID1' ), CalendarApp.getCalendarById( 'ã«ã¬ã³ããŒID2' ), CalendarApp.getCalendarById( 'ã«ã¬ã³ããŒID3' ) ] ; function main() { var scheduleList = setSheet(scheduleSheetId); var today = new Date ( new Date ().toLocaleDateString()); var tommorow = new Date ( new Date ().toLocaleDateString()); today.setDate(today.getDate()); tommorow.setDate(tommorow.getDate()+1); //è€æ°ã®ã«ã¬ã³ããŒããååŸ for ( var room = 0; room < calendars.length; room++) { var lastRow = scheduleList.getLastRow() var events = calendars [ room ] .getEvents(today, tommorow); var scheduleListValues = scheduleList.getDataRange().getValues(); //äºå®ã®æ°ã ãç¹°ãè¿ã for ( var i = 0; i < events.length; i++) { var title = events [ i ] .getTitle(); var startTime = events [ i ] .getStartTime(); var endTime = events [ i ] .getEndTime(); var location = events [ i ] .getLocation(); var patternList = [ /.{2}æ§/g , /.{1}æ§/g , /.{3}æ§/g , /.{4}æ§/g ] var kanaList = '' ; //蚪åäºå®ã®å Žå if ( /æ§/ .test(title)) { patternList.forEach( function (pattern) { kanaList = arrangeScheduleInfo(pattern, title, kanaList) } ) //蚪åäºå®ã§ã¯ç¡ãå Žå } else { var kanaList = [ undefined ] } var scheduleInfo = [ title, startTime, endTime, location ] ; scheduleList.appendRow(scheduleInfo); } } } function setSheet(scheduleSheetId) { var scheduleList = spreadsheet.getSheetByName( 'main' ); scheduleList.clearContents(); var scheduleInfoTitle = [ 'äºå®å' , 'éå§æ¥æ' , 'çµäºæ¥æ' , 'å Žæ' ] scheduleList.appendRow(scheduleInfoTitle) return scheduleList } function arrangeScheduleInfo(pattern, title, kanaList) { var kanjiList = title.match(pattern); try { kanjiList.map( function (kanji) { var kanji = kanji.slice(0,-1); var kanaCandidates = translateIntoKanaArray(kanji); kanaList = kanaList + kanaCandidates + ',' ; } ) } catch (e) { kanaList = kanaList.concat( undefined ); Logger.log( 'å³èšäºå®åã¯ãã¿ããäžå¯ïŒ' + title) } return kanaList } function translateIntoKanaArray(name) { var apiUrl = 'http://yomi-tan.jp/api/yomi.php?ic=UTF-8&oc=UTF-8&k=k&n=5&t=' + name; var kanaCandidates = UrlFetchApp.fetch(apiUrl); return kanaCandidates } Slack APIã§èšªåéç¥ååŸ å®éã«ã客ããŸãæ¥ç€ŸãããéãReceptionistããSlackã®ç¹å®ã®ãã£ã³ãã«ã«ã¡ãã»ãŒãžãéãããŸãã ãã®ã¡ãã»ãŒãžã«å¯ŸããŠSlack APIãåå¿ãããæ¥å®¢åãååŸããŸãã var scheduleSheetId = PropertiesService.getScriptProperties().getProperties().sheetId; function doPost(e) { var receptedName = extractName(e.parameter.text); var scheduleList = getActiveSheet(scheduleSheetId, 'main' ); searchSchedule(receptedName, scheduleList) } function extractName(receptedText) { var regex1 = / ã®.+? æ§/ ; var regex2 = /ãã.+? æ§/ ; var regex3 = /ã«ã.+? æ§/ ; if (regex1.test(receptedText)) { var name = receptedText.match(regex1); } else if (regex2.test(receptedText)) { var name = receptedText.match(regex2); } else if (regex3.test(receptedText)) { var name = receptedText.match(regex3); } name = String (name).slice(4,-3); return name } GASã察å¿ããäºå®ãæ€çŽ¢ äºåã«ååŸããŠããäºå®äžèЧãšç
§ããåãããŠã察å¿ããäºå®ã決å®ããŸãã function searchSchedule(receptedName, scheduleList) { scheduleList.forEach( function (schedule) { var now = new Date (); var startTime = new Date (schedule [ 1 ] ); var earlyTime = new Date (startTime.setMinutes(startTime.getMinutes() - 20)); var lateTime = new Date (startTime.setMinutes(startTime.getMinutes() + 20)); if (earlyTime < now && now < lateTime) { nameMatchCheck(schedule, receptedName) } } ) } function nameMatchCheck(schedule, receptedName) { var scheduledNames = schedule [ 6 ] ; if (scheduledNames !== 'undefined' ) { var scheduledNamesList = scheduledNames.toString().split( ',' ); scheduledNamesList.each( function (name) { if (!name) { return ; } else if (name.length === 1) { //1æåã¯èª€å€å®ãå€ãã®ã§ã¹ããã return ; } else if (receptedName.indexOf(name) === 0) { //ååäžèŽ postSchedule(schedule, name) return ; } } ) } return false ; } Slack APIã§äºå®ãéç¥ æ±ºå®ããäºå®ã®å
容ãéç¥ããŸãã function postSchedule(scheduleInfo, scheduledName) { var name = scheduleInfo [ 0 ] ; var startTime = scheduleInfo [ 1 ] .toLocaleTimeString().slice(0,-7); var endTime = scheduleInfo [ 2 ] .toLocaleTimeString().slice(0,-7); var place = scheduleInfo [ 3 ] ; var guests = scheduleInfo [ 5 ] ; var message = 'ãã¡ãã®äºå®ã§ããããïŒ \n ' + name + ' at ' + place + '\n' + startTime + ' ~ ' + endTime; postMessage(message) } function postMessage(message) { var postUrl = PropertiesService.getScriptProperties().getProperties().postUrl; var jsonData = { "username" : "ãè¶ããã" , "icon_emoji" : ":johnny:" , "text" : message } ; var payload = JSON.stringify(jsonData); var options = { "method" : "post" , "contentType" : "application/json" , "payload" : payload } ; UrlFetchApp.fetch(postUrl, options); } Slack botã®åé¿ãšæ¹å ãããã«ãã£ãŠãéç¥ã«å¯ŸããŠæ
å ±ãåºããŠãããSlack botã宿ããŸããã ãã®botã«ãã£ãŠ20ç§çšããã£ãŠããæåã§ã®æ¥åã1ç§ã«ççž®ãããŸããïŒ ååã®åå¿ãšè¿œå æ©èœã®èŠæ åé¿ãäºæ³ä»¥äžã«å€ãã瀟å¡ã®æ¹ã
ããããè¶ãããïŒããŒã«ã®æç§°ïŒã®äººããšèŠãããããŸã§ã«ãªããŸãã(ç¬) ãããšåæã«ãæŽã«è²ããªæ¹ããèŠæãé ããŸããã ãã£ãšåå¿çãé«ããŠæ¬²ãã 1ã€ã®äºå®ã«å¯ŸããŠè€æ°ã®ã客ããŸãããå Žåãå
šå¡ã«å¯Ÿå¿ããŠæ¬²ãã æ
åœè
ãã¡ã³ã·ã§ã³ïŒSlackã®åŒã³åºãæ©èœïŒã§åŒã³åºããŠæ¬²ãã æ
åœè
ãè€æ°äººããå Žåãäžåå ã®äººã¯åŒã³åºããªãã§æ¬²ãã å£èª¿ã坿ãããŠæ¬²ãã 远å å®è£
ãå©çšãèŠæããã¢ãªã³ã°ã®ãµã€ã¯ã« ãã®åŸãæ°ããè²°ã£ãèŠæãåºã«å®è£
ããå®éã«äœ¿ããããã«å¯ŸããèŠæã瀟å¡ãããã¢ãªã³ã°ãããšãã圢åŒã®éçºã3ã¶æã»ã©ç¶ããŸããã ãã®çµæãåå¿çã¯é«ãã瀟å¡ã®èŠæã«ãé©åããè¯ããããã¯ããšãªããŸããð€ çµããã« ãã®botã«èŸŒããæ³ãã¯ãã¹ããŒããã£ã³ãã®PRã¡ãã£ã¢ã§è©±ããŠããã®ã§è¯ããã°ãã¡ããã芧ãã ããã ã¹ããŒããã£ã³ãã®ãæ¥å®¢å¯Ÿå¿ãã®éå¹çã解決ïŒå
å®è
ã€ã³ã¿ãŒã³çãéçºãã âãè¶ãããâ ã«è¿«ã£ãŠã¿ã #Ownership #æ°å | .â².tent
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢å
¥å±±ã§ãã çããã¯ãAWS Lambdaãç¥ã£ãŠããŸããïŒç¥ããªãæ¹ã§ããµãŒããŒã¬ã¹ãšããåèªã¯èããããšãããã®ã§ã¯ãªãã§ããããã Lambdaã¯ããŸãŸã§ããã°ã©ã ãå®è¡ããäžã§å¿
èŠäžå¯æ¬ ã ã£ããµãŒããçšæïŒæ§ç¯ã»éçšïŒããªããŠããå®è¡ãããããã°ã©ã ãLambda颿°ãšããŠäœæã»ç»é²ããã ãã§ãããã°ã©ã ãåäœãããããšãå¯èœãªãµãŒããŒã¬ã¹ã³ã³ãã¥ãŒãã£ã³ã°ãµãŒãã¹ã§ãã 2014幎ã«ãµãŒãã¹ãå
¬éãããŠããçå®ã«ã¢ããããŒããéããŠãããçŸåšã§ã¯æè»ãã€å¹
åºãçšéã§å©çšããããšãã§ããŸãã Lambdaã«ã¯CloudFrontãšé£æºããŠåäœãããããšã®ã§ãã Lambda@Edge ãšããæ©èœããããä»åã¯CloudFront+S3ã§ã®SPAæ§æã®éã«Lambda@EdgeïŒCloudFrontã®ãšããžãµãŒããŒã§å©çšã§ããLambdaïŒã掻çšããäŸã玹ä»ããããšæããŸãïŒ AWS Lambda@Edgeãšã¯ 掻çšäŸïŒ ããããããšïŒãªãªãžã³ãžã®ãªã¯ãšã¹ãããªãã€ã¬ã¯ãããã å®çŸæ¹æ³ïŒOrigin Requestã§URIã倿Žãã æŽ»çšäŸ2 ããããããšïŒã¬ã¹ãã³ã¹ããããã«ã¹ã¿ãã€ãºããã å®çŸæ¹æ³ïŒViewer Responseã§ã¬ã¹ãã³ã¹ãããã倿Žãã ãŸãšã AWS Lambda@Edgeãšã¯ Lambda@Edgeãšã¯ãCloudFrontã®Behaviorã«èšå®å¯èœãªLambda Functionã®ããšã§ãã Lambda FunctionãCloudFrontã®ãšããžãµãŒãã«ãããã€ããŠããããšã§ãCloudFrontãžã®ã¢ã¯ã»ã¹ïŒã¬ã¹ãã³ã¹ãã€ã³ã¿ãŒã»ããããŠLambda颿°ãå®è¡ãã ã¬ã¹ãã³ã¹èªäœãå€ããããäºæ¬¡åŠçãå®è¡ãããªã©ãCloudFrontã®åäœãã«ã¹ã¿ãã€ãºããããšãåºæ¥ãŸãã åŠçãå·®ã蟌ãäºãå¯èœãªã®ã¯ã以äžã®4ç®æãšãªããŸãã ïŒå
¬åŒHPããåŒçš : CloudFront Lambda@Edge での AWS Lambda の使用 - AWS Lambda ïŒ Viewer Request : CloudFront ããã¥ãŒã¯ãŒãããªã¯ãšã¹ããåä¿¡ããåŸ Origin Request : CloudFront ããªã¯ãšã¹ãããªãªãžã³ãµãŒããŒã«è»¢éããå Origin Response : CloudFront ããªãªãžã³ããã¬ã¹ãã³ã¹ãåä¿¡ããåŸ Viewer Response : CloudFront ããã¥ãŒã¯ãŒã«ã¬ã¹ãã³ã¹ã転éããå æŽ»çšäŸïŒ ããããããšïŒãªãªãžã³ãžã®ãªã¯ãšã¹ãããªãã€ã¬ã¯ãããã Webéçšã«ãããŠãªã¯ãšã¹ãããªãã€ã¬ã¯ããããå Žé¢ã¯ãå°ãªããªããšæããŸãã SPAã§HistoryAPIãå©çšããå Žåã§ã¯ãURIã«å¯Ÿå¿ããHTMLãã¡ã€ã«ãååšããªãããããã©ãŠã¶ãªããŒãæãªã©ã®ãªã¯ãšã¹ãããšã©ãŒã«ãªã£ãŠããŸããŸããäžè¬çã«ã¯ã403ïŒ404ãªã©ã®ãšã©ãŒããŒãžãindex.htmlã«ãªãã€ã¬ã¯ãããããšã§ãã®åé¡ãåé¿ãããšæããŸãã å®çŸæ¹æ³ïŒOrigin Requestã§URIã倿Žãã Origin Requestã«Lambda颿°ãèšå®ããããšã§ãæè»ã«URIãæžãæãããªã¯ãšã¹ãããªãã€ã¬ã¯ããããããšãåºæ¥ãŸãã 以äžã¯ãindex.htmlãžãªãã€ã¬ã¯ãããLambda颿°ã®äŸã§ãã exports.handler = ( event , context, callback) => { const { request } = event .Records [ 0 ] .cf; const currentUri = request.uri; // URIã«ããããå«ãå Žåã¯ãã¢ã»ãããžã®ã¢ã¯ã»ã¹ãšã¿ãªããŠãªã©ã€ãããªã if (currentUri.indexOf( '.' ) !== -1) { console.log(`Don 't rewrite. Uri is ${currentUri}`); return callback( null , request); } const newUri = '/index.html' ; console.log(`Old URI: $ { currentUri } `); console.log(`New URI: $ { newUri } `); request.uri = newUri; return callback( null , request); } ; 掻çšäŸ2 ããããããšïŒã¬ã¹ãã³ã¹ããããã«ã¹ã¿ãã€ãºããã WebããŒãžãå
¬éãããšãã®ã»ãã¥ãªãã£å¯Ÿçãªã©ã§ãã¬ã¹ãã³ã¹ããããã«ã¹ã¿ãã€ãºããããšããèŠæããããããšæããŸãã éåžžã§ããã°NginxãApacheãšãã£ãWebãµãŒããŒã®èšå®ã§å¯Ÿçããã®ãäžè¬çã§ãããSPAïŒCloudFront+S3ïŒã®å Žåã¯ã¬ã¹ãã³ã¹ãããã¯ã«ã¹ã¿ãã€ãºãèŸããšæããŸãã å®çŸæ¹æ³ïŒViewer Responseã§ã¬ã¹ãã³ã¹ãããã倿Žãã Viewer Responseã«Lambda颿°ãèšå®ããããšã§ããŠãŒã¶ãŒãžã¬ã¹ãã³ã¹ãè¿ãçŽåã§ã¬ã¹ãã³ã¹ããããç·šéããããšãåºæ¥ãŸãã 以äžã¯ãX-FRAME-OPTIONSãä»äžããã¯ãªãã¯ãžã£ããã³ã°å¯Ÿçããã颿°ã®äŸã§ãã 'use strict' ; exports.handler = ( event , context, callback) => { const response = event .Records [ 0 ] .cf.response; const headers = response.headers; /* X-Frame-Options: DENY Content-Security-Policy: frame-ancestors 'none' */ headers [ 'content-security-policy' ] = [{ key: 'Content-Security-Policy' , value: "frame-ancestors 'none'" }] ; headers [ 'x-frame-options' ] = [{ key: 'X-Frame-Options' , value: 'DENY' }] ; callback( null , response); } ; ãŸãšã ä»åã¯ãLambda@EdgeãæŽ»çšããŠSPAã®åäœãã«ã¹ã¿ãã€ãºããäŸã玹ä»ããŸããã Lambda@Edgeãå©çšããããšã§ãCloudFrontã§ã®é
ä¿¡ã³ã³ãã³ãã«å¯ŸããŠæè»ã«åŠçãè¡ãããšãã§ããããã«ãªããããSPAã«ãããã¯ã©ã€ã¢ã³ãéçšã®å©äŸ¿æ§ãåäžãããããšãåºæ¥ãŸããå°ãã§ãçããã®åèã«ãªãã°å¹žãã§ãïŒ
ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ã®ããŒã ãããŒãžã£ãŒãããŠããç±³å
ã§ãã åŒç€Ÿã§ã¯ãšã³ãžãã¢ãäžå¿ãšãªã£ãŠãšã³ãžãã¢æ¡çšãé²ããŠãããŸãã ãã®ç²æãã£ãŠãããããããããšã«æè¿ãå
¥ç€Ÿã決ããŠããããšã³ãžãã¢ãäœåããããå°ããã€ã§ãã仲éãå¢ããŠããŸããã ãã®èšäºã§ã¯åŒç€Ÿãã©ã®ãããªãšã³ãžãã¢æ¡çšãããŒãè¡ã£ãŠãããã玹ä»ããããšæããŸãã æ³å®èªè
åŒç€Ÿãžå¿åããŠããããŸãã¯åŒç€Ÿã«èå³ãæã£ãŠé ããŠãããšã³ãžãã¢ã®æ¹ ä»ç€Ÿã®ãšã³ãžãã¢æ¡çšãããŒã«èå³ãããšã³ãžãã¢ãããŒãžã£ãŒãæ¡çšæ
åœè
åè äžéæ¡çšã®ãããŒã§ã å¿
ããããã®å
容ããã¹ãŠã®åè£è
ã®æ¹ã«é©çšãããèš³ã§ã¯ãããŸãã åºæ¬çã«ã¹ã«ãŠããæžé¡éžè以éã«ã€ããŠç޹ä»ããŸã æ¡çšãããŒã¯æ¥ã
æ¹åããŠãããããèšèŒããå
容ãšå®éã®ãããŒãç°ãªãå ŽåããããŸã ãªããã®èšäºãæžããã äž»ãªçç±ã¯ä»¥äžã®2ã€ã§ãã ãšã³ãžãã¢ãäžå¿ãšãªã£ãŠãšã³ãžãã¢æ¡çšã®èšèšã»éçšãããŠããããšãç¥ãããŠããªã éžèãããŒãäžéæãªäºã«ããåè£è
ã®äžå®ãç¡ãããã ãã®èšäºã§å°ãã§ããããã®äºãè§£æ¶ã§ããã°å¹žãã§ãïŒ æ³å®èªè
åè ãªããã®èšäºãæžããã æ¡çšãã㌠ååé¢è«åã®æ
å ±å
±æ ã«ãžã¥ã¢ã«é¢è« 颿¥ 颿¥å® 颿¥åæ° éèŠãããã€ã³ã 質åå
容 è¡åæéãSOCSã æ§æ Œèšºæã»SPIã®åéš ãã®ä»ã®åãçµã¿ æåŸ
å€ã®ããåãã ãªãã¡ã¬ã³ã¹ãã§ã㯠ãªãã¡ãŒé¢è« å
宿¿è«Ÿãå
¥ç€ŸåŸã®äžå®æé ããããããããš å¿ãããŠããããš èªç€Ÿã®é
åãèšèªåããæ£ããäŒãã ãªãŒãã³ã§ããããš å
¥ç€ŸåŸã«åãã€ã¡ãŒãžãã€ããŠããã æåŸ
å€èª¿æŽããµãããªã æ¡çšåºæºã¯åŠ¥åããªã æ¹åãç¶ãã æåŸã« æ¡çšãã㌠ååé¢è«åã®æ
å ±å
±æ ããããã¯æ¡çšãããŒãé ã«èª¬æããŠãããŸãïŒ æè¿ã®æµè¡ãã«ä¹ã£ãŠåŒç€ŸãäŒç€Ÿèª¬æè³æãWebã§å
¬éããŠããŸãã äºæ¥å
容ãVision/Mission/Valueãæåãå¶åºŠã絊äžããŒãã«ãªã©èµ€è£žã
ã«æ²èŒããŠããŸããããã®è³æãå
¬éããŠããããšãç¥ãããŠããªãã±ãŒã¹ããŸã ãŸã å€ãããååé¢è«åã®ãããšãã®äžã§URLãå
±æããŠãããŸãã äŒç€Ÿèª¬æè³æ speakerdeck.com åããŠãäŒãããæéã¯åè£è
ã®æ¹ã«ãšã£ãŠãåŒç€Ÿã«ãšã£ãŠã貎éãªæéã§ãã éãããæéã®äžã§åŒç€Ÿã®äºãããæ·±ãç¥ã£ãŠé ããããåœããã°ãå§ã以äžã®ãããªèšäºã»è³æãå
±æãããŠé ããŠããŸãã åè£è
ã®å¿åãèå³ã«ãã£ãŠã¯ãããåŒç€Ÿã«èå³ãæã£ãŠé ãããã«å
±æããèšäºãå€ããå ŽåããããŸãã tech.smartcamp.co.jp note.mu ãã¡ããå
šéšç®ãéãäºã¯åºæ¥ãªããšæããŸãã®ã§ãé¢è«æã«äžç·ã«èŠãªããã¢ã€ã¹ãã¬ã€ã¯ããããåè£è
ã®æ¹ããã®è³ªåã®ãã£ããã«ãªããããªäœ¿ãæ¹ãããŠããŸãã ã«ãžã¥ã¢ã«é¢è« éžèèŠçŽ ã®ç¡ããã«ãžã¥ã¢ã«é¢è«ãããšã³ãžãã¢ãæ
åœããŸããåºæ¬çã«ãšã³ãžãã¢ã®ããŒã ãããŒãžã£ãŒïŒç§ïŒãåãããã¯ãã®éçºãªãŒããŒãæ
åœããããšãå€ãã§ãããåžæã«ãã£ãŠã¯ããŒã ã®ã¡ã³ããŒæ°åã§ã話ããããšããããŸãã ã«ãžã¥ã¢ã«é¢è«ã§ã¯çžäºã«ç°¡åã«èªå·±ç޹ä»ãããåŸã«ä»åç¹ã«è©±ãããäºãåè£è
ã®æ¹ã«ç¢ºèªããããã«å¿ããŠèª¬æã®é çªãå
容ã調æŽããªãã以äžã®å
容ãã話ããŸãã äŒç€Ÿèª¬æïŒè³æãäºåã«èªãã§é ããŠããå Žåã¯è³ªåãªã©ããããã確èªïŒ äºæ¥ã»ãããã¯ã ãšã³ãžãã¢ã®ã¡ã³ã㌠ãšã³ãžãã¢ã®ã«ã«ãã£ãŒ å©çšæè¡ ãšã³ãžãã¢çµç¹ã®æè¿ã®åãçµã¿ ãã®åŸããäºãã®è©³ããèªå·±ç޹ä»ã質åãªã©ãè¡ãããšãå€ãã§ãã ãŸããäºæ¥ããšã³ãžãã¢çµç¹ãªã©ã®èª¬æã«é¢ããŠãè³æïŒä»ã®ãšããéå
¬éïŒãäœæããŠããã誰ã§ãåã説æãåºæ¥ãããã«ããŠããŸãã 颿¥ 颿¥ã®æŠèŠã¯ä»¥äžã®éãã§ãã 颿¥å® äž»ã«ãšã³ãžãã¢ãæ
åœããŸã å
¥ç€ŸåŸã«é¢ããããšã«ãªãã»ãŒã«ã¹ãããŒã±ã¿ãŒãªã©ã®ãšã³ãžãã¢ä»¥å€ã®è·çš®ã颿¥å®ãšããŠåå ããå ŽåããããŸã 颿¥åæ° 3åãå€ãã§ãã人ã«ãã£ãŠ4å以äžã«ãªãå Žåããã ãšã³ãžãã¢é¢æ¥2åãä»£è¡šé¢æ¥1å é æ¹ã®æ¹ãªã©æ¥ç€Ÿãé£ããå Žåã¯ãªã¢ãŒã颿¥ãå¯èœ åžæã«å¿ããŠ1æ¥ã§è€æ°åã®é¢æ¥ãå¯èœ éèŠãããã€ã³ã ã«ã«ãã£ãŒããããéèŠããŠãããæè¡é¢ãåªããŠããŠãã«ã«ãã£ãŒããããããªãå Žåã¯ãèŠéããšãããŠé ã æè¡é¢ã«ãããŠã¯ãã®æã®åéèŠä»¶ãæºãããŠããããå°æ¥çã«æºããããã³ã·ã£ã«ïŒåŠç¿ã»æèããã»ã¹ïŒãããããèŠã 質åå
容 éå»ã®çµéšãäºå®ããŒã¹ã§èã ã©ããªãããžã§ã¯ãã§ãã©ã®ããã«èããã©ããªè¡åããšã£ããç å°æ¥ã®ããžã§ã³ãããããããšãªã©æªæ¥ã«ã€ããŠèã ãããã®è³ªåããåŸè¿°ãããSOCSãã«åœãŠã¯ããŠã«ã«ãã£ãŒãããããããèŠã è¶£å³ãèå³ã®ããæè¡ã®è©±ã§çãäžããäºãå€ã å
šäœçã«ãã£ã¡ããšãã颿¥ã§ã¯ãªããéè«ã®ããã«ã©ãã«è©±ãããããšãå€ããšæããŸãã ãŸããåºæ¬çã«ã¯ãšã³ãžãã¢ããŒã ã®ã¡ã³ããŒãšã¯éžèã®ã©ããã§å¿
ãäŒã£ãŠãããããã«ããŠããã颿¥ã§è©±ããªãã£ãã¡ã³ããŒã¯å¥éã©ã³ããäŒé£ïŒé£²ã¿äŒïŒãèšå®ããã瀟å
ã®ã€ãã³ãã¹ããŒã¹ã§è»œé£ãåããªããè©±ãæ©äŒãèšããŠããŸãã è¡åæéãSOCSã åŒç€Ÿã§ã¯4ã€ã®è¡åæéããããè©äŸ¡èŠæºã«ã䜿çšãããŠããŸãã ããã4ã€ã®é æåããšã£ãŠãSOCSïŒãœãã¯ã¹ïŒããšåŒãã§ãããäž»ã«SOCSãåºæºã«ã«ã«ãã£ãŒããããããã©ããã®å€æãããŠããŸãã SmartThinking 仮説æèã»æ¬è³ªæè å
èŠæ§ãšåµé æ§ Ownership ãªãŒããŒã·ãã äž»äœæ§ Collaboration 瀟å
ã»ç€Ÿå€å
±åµ Speed å®è¡ã¹ããŒã çç£æ§ïŒè³ª/æéïŒ æ§æ Œèšºæã»SPIã®åéš 1æ¬¡é¢æ¥åŸã«Webã§åéšã§ããæ§æ ŒèšºæãšSPIãåããŠããã ããŸãã åºæ¬çã«ã¯æ¥åã®åŸæé åã»äžåŸæé åã®åèã®ããã«äœ¿ããŸãããç¹ã«æ§æ Œèšºæã®æ¹ã¯ç€Ÿå
ã®èª°ã«ç¹åŸŽã䌌ãŠãããã誰ãšçžæ§ãè¯ãããææ¡ããããã«ãå©çšããŠããŸãã â»ç§ãç¥ãéããšã³ãžãã¢ã§ãã®çµæãå
ã«ãèŠéãããããšã¯ãããŸãããæ¢å瀟å¡ã§ãããªãåã£ãçµæãåºãŠããã¡ã³ããŒãããŸããåé¡ç¡ã掻èºããŠããŸãïŒ ãã®ä»ã®åãçµã¿ éžèãããŒã®äžã§åºæ¥ãã ãåŒç€Ÿã®äºãç¥ã£ãŠãããããã®æŽ»åãããã€ãè¡ã£ãŠããŸãã 颿¥æã ãã§ãªãéžèæéäžã«ãé£çµ¡ããšããäžæç¹ãçåç¹ãããã°ãããåããããã®è³æãåèèšäºãéã 颿¥åŸã®ãªãã£ã¹æ¡å
ãšã³ãžãã¢ïŒå
¥ç€ŸåŸé¢ããã¡ã³ããŒãšã®äŒé£ïŒ2æ¬¡é¢æ¥ä»¥éïŒ ã¿ã€ãã³ã°ãåãã°æ1åã®ãã¶ããžæåŸ
1æ¥äœéšå
¥ç€ŸïŒéžèé²ãã§ãã人åãïŒ note.mu æåŸ
å€ã®ããåãã æçµé¢æ¥ãŸã§é²ãã§é ããåŸã¯æ¡ä»¶é¢ã®åžæç¢ºèªãšãæ¹ããŠæåŸ
å€ã®ããåãããè¡ããŸãã åè£è
ã®æ¹ãåŒç€Ÿã§ããããããšãã§ããããäœããããã£ãªã¢ãäœãããããŸãããããåŒç€ŸåŽã®æ³ããšäžèŽããŠãããã確èªããŸãã ç¹ã«æè¿ã¯ãã®äººåãã®å
¥ç€ŸåŸã®åœ¹å²ã2ã3幎åŸã®ãã£ãªã¢ã€ã¡ãŒãžã®è³æãåå¥ã«äœæããèšèã ãã§ãªãèŠèŠçã«ããºã¬ãç¡ãäºã確èªããŠããŸãã æå€ãšåè£è
ã®æ¹ãèªèº«ã§ãæåŸã®æåŸãŸã§æ¬åœã«ããããããšãèšèªåã§ããŠããªãå Žåãããããã®æ®µéã§ããåãããããŸãåºæ¥ãŠããªãå Žåã¯èŸéã«ã€ãªãã£ãŠããããšãå€ããšæããŠããŸãã ãªãã¡ã¬ã³ã¹ãã§ã㯠ãã¹ããããç¡ããããåè£è
æ¬äººã®åæã®ããšã§ãªãã¡ã¬ã³ã¹ãã§ãã¯ãè¡ããŸãã ãªãã¡ãŒé¢è« æåŸã«å
å®éç¥ãšå
±ã«æ¡ä»¶ã®æç€ºãè¡ããŸããæ¥ç€Ÿãé£ããå Žåã¯é¢è«ã§ã¯ãªãã¡ãŒã«ã§å®äºããå ŽåããããŸãã å
宿¿è«Ÿãå
¥ç€ŸåŸã®äžå®æé ç¡äºå
宿¿è«ŸããŠé ããåŸã¯å
¥ç€ŸãŸã§ãšå
¥ç€ŸåŸã®äžå®æéãã ãªã³ããŒãã£ã³ã°æé ããšããŠãå
¥ç€ŸåŸã«åºæ¥ãã ãæ©ãæ®µéã§æŽ»èºããŠé ããããã«ãµããŒããããŠé ããŸãã ããã«é¢ããŠã¯ä»ãŸãã«åãçµãã§ããæäžã§ãããäŸãã°ä»¥äžã®ãããªå
å®¹ãæºåããŠããŸãã Vision/Mission/Valueãã«ãŒã«ã»å¶åºŠãäºæ¥ãçµç¹ãªã©äŒç€Ÿå
šäœã«é¢ããèª¬æ æ¥åããããã§å¿
èŠãªæ
å ±ã®å
±æ æ¥ççšèªãæè¡ãªã©ã®ç ä¿® ä»éšçœ²ã®ã¡ã³ããŒãšã®ã©ã³ã ã¡ã³ã¿ãŒã«ãããã©ã㌠æ¡çšããŽãŒã«ã§ã¯ãªããå
¥ç€ŸããŠé ããæ¹ãæŽ»èºããããšããŽãŒã« ã§ãããã人äºãšã飿ºããªããäŒç€Ÿå
šäœã§ãªã³ããŒãã£ã³ã°ã®ä»çµã¿ãäœã£ãŠããæäžã§ãã ããããããããš ãªã³ããŒãã£ã³ã°ä»¥å€ã«ããŸã ãŸã æŽåã§ããŠããªãäºã ãããªã®ã§ãããä»åŸã¯ä»¥äžã®2ã€ã«ã泚åããŠãããããšæã£ãŠããŸãã æè¡è©Šéšãã·ãã¥ãšãŒã·ã§ã³ãã¹ããªã©ãçšããã¹ãã«ãã§ãã¯æ¹æ³ã®ç¢ºç« 坿¥ãæ¥åå§èšããæ£ç€Ÿå¡åã®ãããŒã®ç¢ºç« ç¹ã«æè¡è©Šéšã¯åè£è
åŽã®è² æ
ã倧ããããã«æ¹æ³ãééãããšæ£ãã倿ãåºæ¥ãªããããå°å
¥ã«ã¯æ
éã«ãªã£ãŠããŸãã ä»ã®ãšããåè£è
ã®æ¹ã®éœåãã€ãã°å¯æ¥ãæ¥åå§èšã§äžå®æéäžç·ã«åãæéãäœãããšãäžçªè¯ããšã¯æã£ãŠããŸãããããä»ã«ãè¯ãæ¹æ³ããããããã¡ã§ã¯ãããªããæ¹ã§ææã§ãŠããããšãããã®ãããã°æããŠé ãããã§ãã å¿ãããŠããããš ä»åã玹ä»ãããããŒã®å
šäœãéããŠå¿ãããŠããããšãããã€ããäŒãããããšæããŸãïŒ èªç€Ÿã®é
åãèšèªåããæ£ããäŒãã 人ãæåãäºæ¥ãäŒç€Ÿãªã©ããããã®é
åãèšèªåããŠãã æèŠçã«æã£ãŠããããšãèªåã®äžã§äžåºŠæŽçããå
·äœäŸãå
ã«ãããããã衚çŸã§çžæã«äŒããããèšèªåããŠãã èšèªåããŠãããªããšé¢æ¥å®ã«ãã£ãŠå
容ã«äžè²«æ§ãç¡ãã£ããã誀ã£ãæå³ã§äŒããæãããã ãªãŒãã³ã§ããããš è¯ãé¢ã ãã§ãªãæªãé¢ãççŽã«äŒãã å
¥ç€ŸåŸã®ãã¹ãããã ãã絶察ã å
¥ã£ãŠæ¬²ãã人ã«ã¯è¯ãããšã°ããäŒããããªãã»ã»ã»ã§ãæªãé¢ãé ããŠãå
¥ç€ŸåŸã«ãã¬ã æªãé¢ã¯äžç·ã«æ¹åããŠãããæ¹ãšåããã å
¥ç€ŸåŸã«åãã€ã¡ãŒãžãã€ããŠããã ã«ã«ãã£ãŒãé°å²æ°ãããããæ¹æ³ã§äŒãã ä»äºã§é¢ããå
šå¡ãšäŒã£ãŠããã æåŸ
å€èª¿æŽããµãããªã åè£è
ã®æåŸ
ãšèªç€Ÿã®æåŸ
ãèšèªåã»èŠèŠåããŠãºã¬ãç¡ãããããåãããã æ¡çšåºæºã¯åŠ¥åããªã äººã¯æ¬²ããã»ã»ã»ã§ã劥åããªã æè¡é¢ããããŠãã«ã«ãã£ãŒããããããªã人ãç¡çã«åããšãäºãäžå¹žã«ãªã æ¹åãç¶ãã åè£è
ã®æ¹ããã®ãã£ãŒãããã¯ãèªåéèªèº«ã®åçãããšã«å®æçã«æ¯ãè¿ããè¡ããæ¹åãç¶ãã æåŸã« 现ãããšããã¯æžãåããŠããªãéšåãããã®ã§ãããå°ãã§ãæ¡çšãããŒã®ã€ã¡ãŒãžãã€ããŠåŒç€Ÿã«èå³ãæã£ãŠé ããã°å¹žãã§ãã ãŸããä»åã¯äž»ã«ãšã³ãžãã¢ã«åããŠæžããŸããããç§ãšåãããã«ãšã³ãžãã¢æ¡çšãæ
åœãããŠãããããŒãžã£ãŒè·ã人äºã®æ¹ãããããšä»åã®å
å®¹ã¯æ¡çšæŽ»åå
šäœã®äžéšã§ãããªããšæããŸãã èªç€Ÿãžã®èªç¥ãå¢ããæŽ»åãéžèã«å
¥ãåã®èå³ãæã£ãŠãããæ¹ãžã®ã¢ãããŒããATSãå©çšããããŒã¿åæãªã©ä»ã®åãçµã¿ãé æ¬¡é²ããŠããŸãã®ã§ãã©ããã§ãããã®åãçµã¿ã«ã€ããŠãå
±æåºæ¥ãã°ãšèããŠããŸãã ä»åã®èšäºã§èå³ãæã£ãŠé ãããšã³ãžãã¢ã®æ¹ã¯ãã¡ããããšã³ãžãã¢æ¡çšã«äžç·ã«åãçµãã§ããããïŒãšããæ¹ã¯ãã²äžåºŠã話ãããŠãã ããïŒ hrmos.co
ã¹ããŒããã£ã³ãã®é·ç°ã§ãã å
æ¥è¡ãããRoppongi Product Manager Meetup #8 ã«ã¹ããŒã«ãŒãšããŠåå ãããŠããã ããŸããã æ¬èšäºã§ã¯ãç§ãPMïŒèªç§°ïŒãšãªããŸã§ã®çºè¡šå
容ããŸãšããŸããã®ã§ãã玹ä»ããŸãã pm-roppongi.connpass.com çºè¡šå
容ãŸãšã çºè¡šã®ç®ç ãããã¯ããšç§ã®ã¿ã€ã ã©ã€ã³ 1åç®ã®è¶å¢ å€ãã®åé¡ãšè¡åæè 宿œããæœçãµã㪠2åç®ã®è¶å¢ å匷äžã®åèæž çºè¡šã¹ã©ã€ãã¯ãã¡ã æåŸã« çºè¡šå
容ãŸãšã çºè¡šã®ç®ç éçºãªãŒããŒãšããŠæ¯ãèã£ãŠããç§ããã€ã®éã«ãPMã®æ¯ãèããããŠãã話ã®ããã察象è
ã¯PMã«ãªããããšã³ãžãã¢ããªãšæããŸãã ãŸããPMã®ä»äºãå
šãç¥ããªãã£ãç§ããæ³¥èãåé¡è§£æ±ºã«åããŠããããšã玹ä»ããŠããã¹ã©ã€ããšãªããŸãã â»ã¡ãªã¿ã«ãäž»å¬ã® pm-roppongi - connpass ã¯ãçŸåœ¹ãããã¯ããããžã£ãŒããããã¯ããããžã£ãŒãå¿ããšã³ãžãã¢ã®éãããã§ããããããã¡ãã®å
容ã§ãããããŠããããã§ããã ãããã¯ããšç§ã®ã¿ã€ã ã©ã€ã³ ãšã³ãžãã¢ãšããŠã¹ããã£ã³ã«ãžã§ã€ã³ããŠãããã®ã®ã2018幎ã¯ã¹ããŒããã£ã³ãã®ã³ãŒãã¬ãŒãITç«ã¡äžããããŠããŸããã ãã¡ãã®æ¡çšãæ¥åæŽçãäžéãçµããã2018幎12æã«éçºããŒã ã«æ»ãããšã«ãªããŸããã ãããã¯ãã®å身ãšãªã瀟å
ãããžã§ã¯ãããã§ã«åããŠããããã1ã¶æã»ã©éçºãè¡ã£ãåŸã«éçºãªãŒããŒã®åœ¹å²ããšããŠããŒã 掻åãè¡ã£ãŠããŸããã éçºãªãŒããŒãšãªã£ãŠããã2床ã®è¶å¢ã®åŸãçŸåšã¹ããŒããã£ã³ãã§ã¯PMïŒãããã¯ããããŒãžã£ãŒïŒãšåä¹ã£ãŠããŸãã æ¬çºè¡šã§ã¯ã1åç®ã®è¶å¢ããã2åç®ã®è¶å¢ãŸã§ã®æ¥åã«ãã©ãŒã«ã¹ãåœãŠãŠããŸãã 1åç®ã®è¶å¢ æ°èŠSaaSãããã¯ãã®ç«ã¡äžããè¡ãäžã§ã¯ãšã³ãžãã¢ãªã³ã°ä»¥å€ãé²ããå¿
èŠããã£ãã®ã§ããããããã察å¿ãã人ãå±
ãªãç¶æ³ã§ããã ããã§ãäžåžã«çžè«ããŠããã£ãFBã®çµæãç§ããããïŒãããããããã¯ããããŒãžã£ãŒã®åœ¹å²ãïŒãè¡ãããšãšæ±ºããŸããã å€ãã®åé¡ãšè¡åæè ãã§ã«ãããã¯ãéçºã®äžéšãèµ°ãåºããŠããããšãããããšã³ãžãã¢å
å€ã§ãã§ã«è²ã
åé¡ãèµ·ããŠããç¶æ
ã§ããã ãããããåªå
床ãšéèŠåºŠã®4象éã«åããŠå¯Ÿå¿ããããšãç§ããã§ããªãåé¡ã«éäžããããšãæèããªããé²ããŸããã ãŸãããæææ±ºå®ïŒèªåããšãªãã€ã€ãã£ããããèªèº«ã®å€æã«ããäžãã圱é¿ã倧ãããªãææãææããããšãéèŠã§ããã 宿œããæœçãµã㪠ç§ã宿œããæœçã¯ãã¹ãŠããããã¯ãé¢ä¿è
ãæå€§ã®ããã©ãŒãã³ã¹ãåºãããã®ãã®ãšãªããŸãã 仿ãã°ãããã¯ããããŒãžã£ãŒãšããŠã¯èŠéãçãããã«æããŸããããšã³ãžãã¢ãPMã«ãªãæåã®äžæ©ã¯ãããªãã®ã ãšæããŸãã 宿œããæœçã®æŠèŠã¯ã1é
ç®ãã€ã¹ã©ã€ãã«åããŠæžããŠããŸãã 2åç®ã®è¶å¢ å€éšã®ã¢ããã€ã¶ãŒã®æ¹ãšå®æçã«ã³ãã¥ãã±ãŒã·ã§ã³ããšã£ãŠããã®ã§ãããç§ã®ãã£ãŠããããšããããã¯ããããŒãžã£ãŒã®åœ¹å²ããšããããšãæããŠããã ãæ©äŒããããŸããã ããããããããã¯ããããŒãžã£ãŒã«ã€ããŠå匷ãé²ããçŸåšç€Ÿå
ã§PMãèªç§°ããŠãããŸãã å匷äžã®åèæž çºè¡šã®æåŸã«ã¯ãçŸåšåŠç¿äžã®æ¬ã玹ä»ããŠãçµäºãšãªããŸãã çºè¡šã¹ã©ã€ãã¯ãã¡ã speakerdeck.com ç»å£ã®æ§å æåŸã« ææ³ã§ããããããã¯ããããŒãžã£ãŒãšããŠã®ã€ãã³ãåå ã¯åã§ããšã³ãžãã¢ãªã³ã°ã ãã§ã¯ãªãå¹
åºãèŠç¹ã§ã話ããããšãã§ããè¯ãçµéšãšãªããŸããã ãããŠãåŒç€Ÿã§åãããã«ãããèŠãã¿ãããŒã ãšå
±ã«æé·ãããã仲éãç¶ç¶ããŠæ¢ããŠããã®ã§ããã®èšäºã«èå³ãæã£ãæ¹ã¯ãã²ã話ããŸãããïŒ hrmos.co
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ä»å·( @ug23_ )ã§ãã 仿3æ¥ãã6æ¥ã«ãããŠ ç£æ¥æè¡å€§åŠé¢å€§åŠã®enPiT2ããã°ã©ã ã®äžç°ã§ããã enPiT2 PBLåºç€ã»å€å宿ãã¢ãžã£ã€ã«ããŒã ãã£ã³ãã ïŒä»¥äžãå€å宿ïŒã«ç€ŸäŒäººã¡ã³ã¿ãŒãšããŠåå ããŠããŸãããæ¬èšäºã§ã¯ãã®åå ã¬ããŒãããéãããŸãã äŒç€ŸåŽã«ã¯æ¥åãšããŠéãåºããŠããã ããŸãããä»»æã§åè¬ããenPiT2ã®åè¬çãã¡ãšçŽæ¥é¢ãããæ©äŒãåŸãããçŽæ¥æ¡çšã«ã€ãªãããªããŠããä»ã®åŠçãšã³ãžãã¢ãæ±ãããã®ã»æµè¡ãããªã©ã®æ
å ±åéã«ãªãããã¢ãžã£ã€ã«éçºãå®è·µããŠããããšãäŒãããããšããäŒç€ŸåŽãžäžããã¡ãªããã説æããŠæçµçã«ã¯ä»£è¡šOKãããã ããŸããã enpit.aiit.ac.jp enPiT㯠é«åºŠIT人æãè²æããç£åŠååã®å®è·µæè²ãããã¯ãŒã¯ ãšããé¡ãã€ããŠãããåŠçæä»£ã®ãã¡ããå®è·µçãªITæè²ãè¡ã£ãŠç€ŸäŒã§æŽ»èºã§ãã人æã茩åºãããšãããããã®ããæéšç§åŠçãããžã§ã¯ãã§ãããšãã«ãBizSysDãšããåéã¯ä»¥äžã®ããã«äœçœ®ã¥ããããŠããŸãã 瀟äŒãããžãã¹ããŒãºã«å¯Ÿããå®çšçãªãœãªã¥ãŒã·ã§ã³ãšããŠã®ããžãã¹ã¢ããªã±ãŒã·ã§ã³ãã·ã¹ãã ãã¶ã€ã³ãèªãææ¡ãéçºããé¡§å®¢ã®æœåšçèŠæ±ãæºããããšã®ã§ãã人æè²æãç®æããŸãã ã¡ã³ã¿ãŒã«ã€ããŠã¯ãäŒã®äžã« TDD+ã¢ãããã°ã©ãã³ã°ã§ã¯ã€ã¯ã€ããäŒ ãããããšãenPiT2ã®å身ã§ããenPiTã®ä¿®äºçã§ãããåŠçã¡ã³ã¿ãŒãšããŠåå ããŠããããšãããæšèŠããŠããã ããããã§ãã tddyyx.github.io å宿ã§ãªã«ããã£ããïŒ å€å宿èªäœã¯9æ2ã6æ¥ããŸããŸã䜿ã£ãŠè¡ãããŸããã äŒã®ãã£ããããæµãã¯ãããªæãã§ããã 9/2: ã¢ãžã£ã€ã«éçºãšã¹ã¯ã©ã ã»ã¹ã¯ã©ã éçºäœéšã¯ãŒã¯ã·ã§ãã 9/3: TDDå
¥éã»TDDïŒã¢ãããã°ã©ãã³ã°ã§ã¯ã€ã¯ã€ããäŒ 9/4-5: ã¹ã¯ã©ã ã«ãããããã¯ãéçº 9/6: å
šäœãµãããã äŒå Žã¯ã³ãããŒç®±æ ¹ã§ãããç·ã«å²ãŸããŠãããã空æ°ããããã ã建ç©ãå圢ãªã®ã§è¡ãæ¥ããããããŠæé«ã§ãããïŒãŸããªãäŒæ¢ã«ãªãããã§ããæ²ããïŒ colony-hakone.com æŽãããéšããµã£ããã§ãããæ¯æ¥ããããããã£ãïŒ ãœããããªã³ã¯ãé£²ã¿æŸé¡ã§ãããèŸããžã³ãžã£ãšãŒã«ãçå§æãããããŠããããã£ãã§ãã äºåã®ãã³ããã§æå¿ã®äŒæ¥ã®ã¿ãªããŸããå·®ãå
¥ãããããèåãã«ããã©ãŒã¡ã³ãæ¯æ¥é©åãªéã§ãããã€ãããŠããŸããã ã¡ã³ã¿ãŒé£ã¯ãåå 倧åŠã®å
çãšåŠçã¡ã³ã¿ãŒã瀟äŒäººã¡ã³ã¿ãŒãšããæ§æã§ããã 1æ¥ç®: ã¢ãžã£ã€ã«éçºãšã¹ã¯ã©ã ã»ã¹ã¯ã©ã éçºäœéšã¯ãŒã¯ã·ã§ãã ç§ã¯å®¿ã®éœåã§2æ¥ç®ããã®åå ã ã£ãã®ã§ããŸããã§ãããã座åŠïŒã°ã«ãŒãã¯ãŒã¯ãè¡ãããŠããããã§ãã ã°ã«ãŒãã¯ãŒã¯ã§ã¯ãã¹ã¯ã©ã ã®ããã»ã¹ã«åã£ãŠãæ©èœæ§ã®ãããªããžã§ã¯ãããå·¥äœããŠããŸããã ã¡ã³ã¿ãŒã®æã空ãå§ãããšåæã«ã¡ã³ã¿ãŒãããã¯ããããšããèªå·±çµç¹çãªç°å¢ã§ããã ïŒããšã§ç¥ããŸãããã¿ãŒã²ãããŠãŒã¶ãç§ã«ãããããã¯ããäœæãããŠããŸããïŒ 2æ¥ç®: TDDã©ã€ãã³ãŒãã£ã³ã°ã»TDDyyÏ ãã¹ãé§åPython ã å¿ççå®å
šæ§ã²ãŒã ã§ç¥ãããå®äºåããã«ããPythonã䜿ã£ãTDDã©ã€ãã³ãŒãã£ã³ã°ã§ããã ååŸã«ã¯å®è·µãšããããšã§ãTDDãã¿ããªã§ãã£ãŠã¿ããïŒã¢ãããã°ã©ãã³ã°ãäœéšããŠã¿ããããšããããšã§æ®æ®µã®ãTDDïŒã¢ãããã°ã©ãã³ã°ã§ã¯ã€ã¯ã€ããäŒãã®ãã©ãŒãããã«åã£ãŠã¢ãã»ãã·ã§ã³ãäœéšããŠããããŸããã å€ã¯LTäŒããã£ãããTDDïŒã¢ãããã°ã©ãã³ã°ã§ã¯ã€ã¯ã€ããäŒã®ã¡ã³ã¿ãŒé£ã ãã§ã¢ãããã£ããããŠããŸãããåç㯠Diamond ãšãããé¡ããããã£ãŠããã«ãªãã€ã¢ã¢ã³ããåºããŠäœé»ã«æµžããªã©ãããŸããã 3, 4æ¥ç®: ã¹ã¯ã©ã ã«ãããããã¯ãéçº åæ¥ã¯å·¥äœã§ã¹ã¯ã©ã ãäœéšããŸãããã3,4æ¥ç®ã§ã¯å®éã«ã³ãŒããæžããŠããŒã éçºããŠããããŸããã ããŒãã¯èªå販売æ©ãCLIã§ãWebã§ããªãã§ãããããèªåã§ãã®ã売ããããã«ããäœããäœããšããæãã ã¹ããªã³ã0ãè¡ã£ãŠåããŒã æãæãã®èªå販売æ©ãèãããšããããã ãããã¯ããªãŒããŒãšã¹ã¯ã©ã ãã¹ã¿ãŒã決ããŠéçºãã¯ãããŸãã éäžãããã¡ã³ã¿ãªã³ã°ãããšãã«ã¹ã¯ã©ã ãã¹ã¿ãŒãšãããã¯ããªãŒããŒããããšèŠã§ããããšãããããŒããšãã話ã«ãªãã1æ¥ç®ã®å·¥äœçšåã«ãã£ããè±çŽã§ãè±ãäœã£ãŠããŸããããè±ãã€ããã®ãªããŠäœå¹Žã¶ãããªãšããæãã§ããã å®çãšãã®å Žã«ãããã®ã掻ãããšããèããé²ããšãéã³ãšã¡ã³ã¿ãªã³ã°ã®å¢çãèãŸã£ãŠæé«ã«æ¥œããæéã«ãªããŸãã ã¡ã³ã¿ãŒåŠçé¢ä¿ãªãã¿ããªã§ã¯ã€ã¯ã€ãããŠããæãããããŸãã Sprint5ã§æåŸã®æåŸã§ãã°ã¬ãŒãã«ãã£ãŠæ©èœãåããªããªã£ãŠããŸã£ãããŒã ã¯ããã¹ãæžããŠããã°ããã£ããªããšæŒããå Žé¢ããããŸãããå°ããåäœã§å€±æãäœéšã§ããã®ã¯ç€ŸäŒäººããããŠããªããªã貎éãªæ©äŒã ãšæããŸãã äŒå Žã®ããªãŒã¹ããŒã¹ã«ã¯ããŒãã²ãŒã ãããçãªã©èªç±ã«éã¹ããã®ããããã€ããŠããã®ã§ããããã®å€ã¯äžæ©äžããçã«èãã人ãå€ãã£ãã§ãã 5æ¥ç®: ãµãããã æçµæ¥ã«ã¯å
šäœã§éãŸã£ãŠ5æ¥éããµãããããŸããã ãŸãã¯ã¿ã€ã ã©ã€ã³ã§æ¯ãè¿ããäºå®ãšææ
ãåããŠè©±ãããããã®åŸããŒã ã§æãéãããTryããããŸãã æåŸã¯ã¿ããªã§äžèšãã€æ¯ãè¿ããè§£æ£ããŸããã ä»å€§åŠãšã®äº€æµãããã£ã åŸæã®éçºã«æŽ»ãããã ããçããã®ããã£ã ãªã©ã®æèŠãã§ãŸããã æã£ãããš 2æ¥ç®ãš5æ¥ç®ã§ã®æ¯èŒã§ãããã©ã®ããŒã ã1æ¥ç®ãšã¯è°è«ã®è³ªãå€ãã£ãŠããããã«èŠããŸããã倧ããç®æšãç«ãŠãããŒã ã«ãªããŠããããšã«æéããããŸããã RSGT2019ã§æ¥œå€©ã®1幎ç®ã®ã¿ãªãããæ¥œå€©ã®æ°åç ä¿®ãããŒã¹ã«çºè¡šãããŠããŸããããåŠçã¯ãã¯ãæãã£ãéãã«ã§ããéå»ã®äœéšã«äŸåããæ¯ãèããã®ã§ãã®ç¹ã匷ããªãšæããŸããäŸãã°1æ¥3åSprintãåãã®ã¯ç€ŸäŒäººããŒã ã§ããªããªãã§ããªãããšã ãšæããŸããããã2æ¥ã§5åãã£ãã®ã¯èªã£ãŠããããšã ãšæããŸãã confengine.com åŠã¶å Žã«ãããç°å¢ã£ãŠããããããšãæããŸããããŒã ãã«ãã£ã³ã°ã®ããã«å宿ãããããŒã ãå€ãã§ãããæãåã£ãŠèªç±ãªå Žã§ããšãã®ããç¶æ³ã«ããã»ããåŠç¿å¹æã¯é«ãŸããããšæããŸããããã®ãããã¯æ°žç¬å
çã«ããèšèšã倧ããå¯äžããŠããæ°ãããŸããèãããæ®éã«åãããææã®ç ä¿®ã®å
容ã ã£ãããã§ãenPiTã¯ãããã§ããã ã¹ããŒããã£ã³ãã§ã¯ïŒ ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ããŒã ã§ã¯é±ã«1床ã¢ãžã£ã€ã«ã³ãŒãã®æ¹ã«æ¥ãŠããã ããããŒãã£ã³ã°ããµãããããèŠãŠããããªããéçºããã»ã¹ãæ¹åããŠããæäžã§ãã ãŸããç§ã®ããããŒã ã§ã¯å¯èœãªéãåžžã«ã¢ãããã°ã©ãã³ã°ã§éçºããããšããåãçµã¿ããã£ãŠããŸãã é£ã®ããŒã ã§ãã¢ããããå§ããŠã¹ããŒã¹ãè¶³ããªããªã£ãã®ã§ã¢ãã¹ããŒã¹ããã1ã€è¿œå ããããšããŠããŸãã ãç»é¢å
±æããªããã§ãããã£ã¹ãã¬ã€ã«ç»é¢ç§»ããŠRubyMine䜿ããšMacã®ãã¡ã³ãåãã£ã±ãªãã«ãªãããããšããåé¡ãããã£ãã®ã§mac miniãã¬ã³ã¿ã«ããŠã¢ããã·ã³ã«ããŠã¿ãããïŒãšãã話ãã¯ãããŠããŸãã ããããªãã©ã¯ãã£ã¹ããããããšããã®ãåãå
¥ããŠãããã«å
šåã§åãçµãããšã§ãã®ã¡ãªãããæããåœããåã«ãªãããšããéçšãç®ã®åœããã«ããŠããŠãšãŠã楜ããã§ãã æåŸã« ãããæžãããã«åçã確ä¿ããããåå è
å
šå¡ã§å
±æããŠããGoogleãã©ãã®ã¢ã«ãã ãçºããŠããããæé«ã®å€ã ã£ããªããšããæãããã¿äžããŠçãã®ããŸããã§ããããããããã®æéã«æžãçµãããŸããâŠïœ åŠçãšé¢ããããšã¯ããããããšããã¡ãããæããããšããç«ã¡äœçœ®ã«ãªããŸãããçºããŠçŽãã¹ãç®æãããããããããã®ã¢ããã€ã¹ããããã解決ã®ããã®ææ®µãã²ãšã€æããŠã¿ãããšããã ãã§åæã«åžåããŠãããã ãªãšããã®ãæ¹ããŠå®æããŸããããããŠå®å
šã«å€±æã§ããå Žã®å€§åããæããŸããã æããããšã§åŠçããåŠã¶ããšãå€ããæããã¹ãã«ã®ç³§ã«ããªã£ããšæãã1é±é匱ã§ããã ã¹ããŒããã£ã³ãã§ã¯ããã¯ãããžãŒã§ç€ŸäŒã®éå¹çããªãããããã«ãã¢ãžã£ã€ã«ã«æ¹åãç©ã¿éããªãããããã¯ããäœã£ãŠãããããšã³ãžãã¢ãåéããŠããŸãã https://hrmos.co/pages/smartcamp/jobs/005 hrmos.co https://hrmos.co/pages/smartcamp/jobs/0000023 hrmos.co
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢å
¥å±±ã§ãã è¿å¹ŽããŠãŒã¶äœéšïŒUXïŒã®åªäœæ§ããSPAïŒSingle Page ApplicationïŒãæ¡çšããŠããWebã¢ããªã±ãŒã·ã§ã³ãå€ãç®ã«ããããã«ãªããŸããã åŒç€Ÿã8æ1æ¥ã«ãªãªãŒã¹ãããã€ã³ãµã€ãã»ãŒã«ã¹ã«ç¹åããCRM BiscuetïŒãã¹ã±ããïŒ ããVue.jsã䜿ã£ãSPAã§æ§æããããµãŒãã¹ã§ãã SPAãæ¡çšããããšã§å€ãã®ã¡ãªããããããŸãããåŸæ¥ã®MPAïŒMultiple Page ApplicationïŒãšã¯ç°ãªãéçšããŠããŠãå¿
èŠã«ãªããšæããŸãã ä»åã¯SPAããããã¯ã·ã§ã³éçšããäžã§é¿ããŠã¯éããªãããªããžã§ã³ã¢ããæã®ã¯ã©ã€ã¢ã³ãåŽã®å¯Ÿå¿ãã玹ä»ããŸãïŒ SPAã«ããããªããžã§ã³ã¢ããæã®èª²é¡ ãªããžã§ã³ç¢ºèªæ©èœã®å®è£
æ¹é ãªããžã§ã³ç¢ºèªæ©èœã®å®è£
ã¢ããªã±ãŒã·ã§ã³ã«ãªããžã§ã³IDãåã蟌ã ãªããžã§ã³ç®¡ççšJSONãã¡ã€ã«ïŒrevision.jsonïŒãS3ã«é
眮 JSONãã¡ã€ã«ããææ°ã®ãªããžã§ã³IDãååŸããã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãšæ¯èŒ ãªããžã§ã³IDã«å·®ç°ãããã°ã¢ã©ãŒãã衚瀺 æåŸã« SPAã«ããããªããžã§ã³ã¢ããæã®èª²é¡ SPAã®Webã¢ããªã±ãŒã·ã§ã³ã§ã¯ãå¿
èŠãªã³ãŒãïŒHTMLãJavaScriptãCSSïŒãæåã«ãŸãšããŠãã©ãŠã¶ã«èªã¿èŸŒã¿ããã©ãŠã¶ã§ã§ããåŠçã¯JavaScriptã§å®çµãããããšã§ããµãŒããšã®APIéä¿¡ãå¿
èŠæå°éã«æããããšãã§ããŸãã MPAã®Webã¢ããªã±ãŒã·ã§ã³ãšã¯ç°ãªãããµãŒãããã¯å¿
èŠæå°éã®ããŒã¿ã®ã¿ãååŸãããããã¯ã©ã€ã¢ã³ããšãµãŒããççµåã«ãªãããšãç¹åŸŽã§ãã ããããã¯ã©ã€ã¢ã³ããšãµãŒããççµåã§ããããšã«ããããªããžã§ã³ã¢ããã®éã«ã¯ãã¯ã©ã€ã¢ã³ããæå³çã«ãªããŒãããªãéããã©ãŠã¶ã«ä¿æãããJavaScriptãã¡ã€ã«ãæåã«èªã¿èŸŒãŸãããªããžã§ã³ã®ãŸãŸãšãªããã¯ã©ã€ã¢ã³ãïŒæ§ïŒãšãµãŒãïŒæ°ïŒã§ãªããžã§ã³ã®äžæŽåãçºçããå¯èœæ§ããããŸãã ç¹ã«å€§ããªã·ã¹ãã ä¿®æ£ïŒDBã®ã«ã©ã 倿Žãªã©ïŒã®å Žåã«ã¯ããªããžã§ã³ãåãããªããšäºæãã¬é害ã«ã€ãªããå¯èœæ§ããããããéçšè
ãæ°ãããªããžã§ã³ããªãªãŒã¹ããéã«ã¯ãäœããã®æ¹æ³ã«ããã¯ã©ã€ã¢ã³ãã«ãã©ãŠã¶ã®ãªããŒããä¿ãææ®µãå¿
èŠãšãªããŸãã ãªããžã§ã³ç¢ºèªæ©èœã®å®è£
æ¹é ä»åã¯ãCDNïŒAWSã®CloudFront + S3ãªã©ïŒã§ã®ã¯ã©ã€ã¢ã³ãé
ä¿¡ãäŸãšããŠã以äžã®æé ã§ãªããžã§ã³ç¢ºèªãè¡ãããšã«ããŸããã å°ãä»åã¯åŒ·å¶ãªããŒãã§ã¯ãªãç»é¢ãžã¢ã©ãŒãã衚瀺ãããããšã§ããã©ãŠã¶ã®ãªããŒãããŠãŒã¶ãŒã«ä¿ã仿§ã«ããŠããŸãã ãªããžã§ã³ç¢ºèªæ©èœã®å®è£
å
容 ã¢ããªã±ãŒã·ã§ã³ã«ãªããžã§ã³IDãåã蟌ã ãªããžã§ã³ç®¡ççšJSONãã¡ã€ã«ïŒrevision.jsonïŒãS3ã«é
眮 JSONãã¡ã€ã«ããææ°ã®ãªããžã§ã³IDãååŸããã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãšæ¯èŒ ãªããžã§ã³IDã«å·®ç°ãããã°ã¢ã©ãŒãã衚瀺 ãªããžã§ã³ç¢ºèªã宿œããããã®å®è£
æ¡ã¯ä»ã«ããããŸãããã以äžã¡ãªãããèæ
®ããŠä»åã®ãããªå®è£
æ¹éã«ããŸããã ã¯ã©ã€ã¢ã³ãåŽã ãã§ãªããžã§ã³ç¢ºèªãå®çµ ãªããžã§ã³ç¢ºèªåŠçã«ãããè² è·ãå°ãªã ãªããžã§ã³ç¢ºèªæ©èœã®å®è£
ã¢ããªã±ãŒã·ã§ã³ã«ãªããžã§ã³IDãåã蟌ã ã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDã¯ãæè»æ§ãæãããããã«ãã«ãæã®ç°å¢å€æ°ïŒAPP_REVISION_IDïŒããååŸããprocess.envã§åç
§ããŸããå°ãã¯ã©ã€ã¢ã³ããã«ãã¯ãwebpackã«ãŠå®æœããŠããŸãã ã¯ã©ã€ã¢ã³ããã«ãæ export APP_REVISION_ID= " 1.0.0 " yarn install yarn build ã¢ããªã±ãŒã·ã§ã³åç
§æ process.env.APP_REVISION_ID ãªããžã§ã³ç®¡ççšJSONãã¡ã€ã«ïŒrevision.jsonïŒãS3ã«é
眮 ææ°ã®ãªããžã§ã³IDãå«ãã JSONãã¡ã€ã«ãS3ãžé
眮ããããã«ããŸãã revision.json {"revisionId": "1.0.0"} JSONãã¡ã€ã«ããææ°ã®ãªããžã§ã³IDãååŸããã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãšæ¯èŒ S3ã«é
眮ãããªããžã§ã³ç®¡ççšJSONãã¡ã€ã«ãååŸããã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãšæ¯èŒããåŠçãå®è£
ããŸãã axiosã©ã€ãã©ãªãå©çšããŠAPIéä¿¡ãè¡ããŸãã(Vueãæ®æ®µäœ¿ã£ãŠããã®ã§Vueã£ãœããµã³ãã«ã§ã) src/revisionCheck.vue <script> import axios from 'axios' export default { data () { return { revisionId: null } } , created () { this .getRevisionId() } , computed: { revisionCheck () { // JSONãã¡ã€ã«ãšã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãæ¯èŒããçµæãè¿ã return this .revisionId === process.env.VUE_APP_REVISION_ID } } , methods: { async getRevisionId () { await axios.get( '/revision.json' ).then(res => { this .revisionId = res.data.revisionId } ) } } } </script> ãªããžã§ã³IDã«å·®ç°ãããã°ã¢ã©ãŒãã衚瀺 ãªããžã§ã³IDã®ç¢ºèªçµæãfalseãšãªã£ãå Žåã«ãã¢ã©ãŒãã®ã¡ãã»ãŒãžã衚瀺ãããããã«ããŸãã src/revisionCheck.vue <template> <div class = "revision-check" v- if = "!revisionCheck" > <div>æ°æ©èœããªãªãŒã¹ãããŠããŸããããŒãžãæŽæ°ããŠãã ããã</div> </div> </template> <script> import axios from 'axios' export default { data () { return { revisionId: null } } , created () { // setInterval颿°ã§å®æå®è¡ãã setInterval(() => { this .getRevisionId() } , 60000) } , computed: { revisionCheck () { // JSONãã¡ã€ã«ãšã¢ããªã±ãŒã·ã§ã³ã®ãªããžã§ã³IDãæ¯èŒããçµæãè¿ã return this .revisionId === process.env.VUE_APP_REVISION_ID } } , methods: { async getRevisionId () { await axios.get( '/revision.json).then(res => { this .revisionId = res.data.revisionId } ) } } } </script> ãããã¯ãã§ã¯æçµçã«ä»¥äžã®ããã«è¡šç€ºããããã«ããŠããŸãïŒ â» setInterval颿°ã«ã€ããŠã¯ãåŒç€Ÿãšã³ãžãã¢ã®ç§å·ã以åèšäºãæžããŠããã®ã§ããã²åèã«ããŠããã ããã°ãšæããŸãïŒ tech.smartcamp.co.jp æåŸã« ä»åã¯ãSPAã«ããããªããžã§ã³ã¢ãã察çã«ã€ããŠç޹ä»ããŸããã åŒç€Ÿã§ã¯ãCircleCIã§ãããã€äœæ¥ãèªååããŠããããªããžã§ã³IDã®æŽæ°ãå«ããŠèªåã§è¡ãããããã«ããŠããŸãïŒ SPAã«ã¯å€ãã®ã¡ãªããããããè¿å¹ŽSPAã®Webã¢ããªã±ãŒã·ã§ã³ãå¢ããŠããŸãããå®éã«æ§ç¯ã»éçšããå Žåã®æ
å ±ããŸã ãŸã å°ãªãã®ãçŸç¶ã§ãã ãªããžã§ã³ã¢ãã察çã«ã€ããŠãå®è£
æ¹æ³ã¯ããã€ããããšæããŸãããä»å玹ä»ããå
容ãåèã«ãªãã°å¬ããã§ãïŒ
ã¹ããŒããã£ã³ãã®ãã¶ã€ããŒ/ãšã³ãžãã¢ã®haguriã§ãã åŒç€Ÿã§ã¯8æ1æ¥ãã€ã³ãµã€ãã»ãŒã«ã¹ã«ç¹åããCRM BiscuetïŒãã¹ã±ããïŒ ãšããæ°ãµãŒãã¹ããªãªãŒã¹ããŸããã biscuet.jp Biscuetã§ã¯ Vue.js + Atomic Design ã§ã³ã³ããŒãã³ãèšèšãããŠããŸããä»åã¯ãã®æ§æãšèãæ¹ã»BiscuetããŒã ã§ã®éçšã«ã€ããŠç޹ä»ããŠãããŸãã Atomic Design ã«ã€ã㊠templatesãšpagesã«ã€ã㊠Biscuetã§ã®ã«ãŒã« atoms molecules organisms pages ãã£ã¬ã¯ããªæ§æ App.vue components/ plugins/biscuet-materials/ ãããã« Atomic Design ã«ã€ã㊠Atomic Design ãšã¯ãã³ã³ããŒãã³ãåäœã§èšèšããŠãããã¶ã€ã³ã»éçºææ³ã§ãã 詳ããã¯ä»¥äžã®èšäºãåãããããã®ã§åèã«ããŠã¿ãŠãã ããã design.dena.com ç°¡åã«èª¬æãããšã以äžã®ç»åã®ããã«ãUIã®ããŒãã5éå±€ã®åäœã§åå²ããŠçµã¿ç«ãŠãŠãããã®ã§ãã åç
§ïŒ http://atomicdesign.bradfrost.com/chapter-2/ 1. atomsïŒååïŒ 2. moleculesïŒååïŒ 3. organismsïŒçäœïŒ 4. templatesïŒãã³ãã¬ãŒãïŒ 5. pagesïŒããŒãžïŒ Atomic Design㯠æç¢ºãªã«ãŒã«ããªããUIãèããããã®ææ³ ã§ãã å®éã®ãµãŒãã¹éçºã«å°å
¥ããå Žåã«ã¯ãã®èãæ¹ãããŒã¹ã«ããŠéçºããŒã ããã¶ã€ã³ããŒã å
ã§å
·äœçãªã«ãŒã«ãå®éã«æ±ºããå¿
èŠããããŸãã ãããã®ã«ãŒã«ã¯å®éã®ããŒã ã«ãã£ãŠç°ãªããŸããããã®èšäºã§ã¯BiscuetéçºããŒã ã§èšå®ããŠã¿ãã«ãŒã«ã玹ä»ããŠããŸãã templatesãšpagesã«ã€ã㊠Atomic Designãå°å
¥ããããšãããšèããªããã°ãããªãã®ããtemplatesãšpagesãã©ãããã®ããšããåé¡ã§ãã ãã®2ã€ã¯å°å
¥åœå以äžã®ããã«èããŠããŸããã templates : organismsãé
眮ãããã®ã§ãpagesããéãããŠããããŒã¿ãåã³ã³ããŒãã³ãã«æµããã® pages : ããŒã¿ãååŸããŠtemplatesã«ããŒã¿ãæž¡ããã® ãããããã®2ã€ãããããšè€éæ§ããŸããšå€æããtemplatesã廿¢ããŸããã ããŸã§ã¯å»æ¢åã«äœã£ããã®ãäžéšæ®ã£ãŠããŸãããéçºããŠããéšåã¯templatesãäœããã«ããããŠããŸãã Biscuetã§ã®ã«ãŒã« Biscuetå
ã§ã¯ã以äžã®ãããªãããããªã«ãŒã«ãèšããŠããŸãã åå©çšæ§ storeåç
§ åéå±€åç
§ ããªãã£ãã¯ã¹ atoms ⯠à à b- molecules ⯠à ⯠b- organisms à ⯠⯠- pages à ⯠à - atoms å®çŸ©: ãã以äžåè§£ã§ããªãæå°åäœã®ãã® è€æ°ã³ã³ããŒãã³ãããã®åŒã³åºããæ³å®ããŠããããã以äžã®2ç¹ã«æ°ãã€ããŠããŸãã storeåç
§ãããªã ä»ã®atomsã䜿çšããªã Biscuetã§ã¯ãã©ã®ã³ã³ããŒãã³ãã§äœ¿çšãããŠããã®ããåãããããããããã«ãããªãã£ãã¯ã¹ãšã㊠b-card ã®ããã« b-xxx ãã€ããŠããŸãã molecules å®çŸ©: 2ã€ä»¥äžã®atomã䜿çšãããã® moleculesã®æ¡ä»¶ãšããŠã以äžã®3ç¹ã ããèšå®ããŠããŸãã atomsãè€æ°çµã¿åããããã® è€æ°ã³ã³ããŒãã³ãããåŒã³åºãæ³å®ããããã® storeåç
§ãããªã ãã¡ããè€æ°ã³ã³ããŒãã³ãããã®åŒã³åºããæ³å®ããŠããã®ã§ãatomsãšåãããã«ã³ã³ããŒãã³ãåã« b-xxx ãã€ããŠããŸãã organisms å®çŸ©: åããŒãžã«ç¹åããŠããæå°åäœã®ãã® organismsã®æ¡ä»¶ã¯ä»¥äžã®ããã«èšå®ããŠããŸãã atomsãšmoleculesããæ§æããããã® ä»ã®ããŒãžã§ã®åå©çšã¯èããªã ã«ãŒããªã©ãåãèŠçŽ ãã€ãã£ãŠç¹°ãè¿ã衚瀺ãããããªãã®ã¯organismsã«çœ®ããŠããŸãã ãã ãorganismsã¯pagesããšã«ãã£ã¬ã¯ããªããšã«åããæ§æã«ããŠããã®ã§ä»ããŒãžã§ã®åç
§ã¯èããŸããã ãã®ããŒãžã ãã§äœ¿ãèŠçŽ ãçµã¿åãããŠorganismsã«ããŠããŸãã äŸãã° ã«ãŒã ã®ããã«1ããŒãžã§è€æ°äœ¿ããããªãã®ã¯organismsã«ããŠããŸãã pages å®çŸ©: åã³ã³ããŒãã³ããé
眮ããŠãããŒãžãšããŠæç«ããããã® äžèšã§æžããatoms, molecules, organismsãçµã¿åãããŠ1ã€ã®ç»é¢ãäœã£ãŠãããŸãã ãã£ã¬ã¯ããªæ§æ å®éã®ãã£ã¬ã¯ããªæ§æã¯ä»¥äžã®ããã«ãªã£ãŠããŸãã src / âââApp.vue âââmain.js âââcomponents/ â âââ organisms/ â â âââ home/ â â â âââ xxxxx.vue â â âââ project/ â â âââ xxxxxx/ â âââ pages/ â âââ Home.vue â âââ Project.vue â âââ xxxxxx.vue âââ plugins/ âââ biscuet-materials/ âââ atoms/ â âââ BCard.vue â âââ BIcon.vue â âââ xxxxxx.vue âââ molecules/ â âââ BInput.vue â âââ BSelect.vue â âââ xxxxxx.vue âââ index.js App.vue å
šäœã«é¢ããã³ã³ããŒãã³ããé
眮ããŠããŸãã <template lang="pug"> #app b-toast b-layout sidebar router-view b-modal(modalName="xxx") b-modal(modalName="xxx") </template> ããŒã¹ã¿ãŒããµã€ãããŒãå
šäœã«é¢ããã¢ãŒãã«çãé
眮ããŠããŸãã components/ organismsãšpagesããããŠããŸãã organismsã¯ããŒãžå
ã®æå°åäœãšããŠããã®ã§ãåºæ¬çã«pagesã®ã³ã³ããŒãã³ãåã§ãã£ã¬ã¯ããªãåã£ãŠããŸãã plugins/biscuet-materials/ atomsãšmoleculesããããŠããŸãã organisms以äžãšã¯éããè€æ°ã³ã³ããŒãã³ãã§èªã¿èŸŒãå¯èœæ§ãããããå®å
šã«åé¢ããŠä»¥äžã®ããã«ã°ããŒãã«ã®ã³ã³ããŒãã³ãç»é²ãããŠããŸãã // index.js const context = require.context( '.' , true , /.vue$/ ) const components = {} context.keys().forEach(contextKey => { const key = contextKey.match( /.+\/(.+)\.vue/ ) [ 1 ] components [ key ] = context(contextKey). default } ) export default { install (Vue) { Object .keys(components).forEach(key => { Vue.component(key, components [ key ] ) } ) } } ãããmain.jsã§ä»¥äžã®ããã«èªã¿èŸŒã¿ã䜿çšããŠããŸãã // main.js import BiscuetMaterials from '@/plugins/biscuet-materials' Vue.use(BiscuetMaterials) ãããã« æåã¯ã¬ãã¬ãã«ã«ãŒã«ã決ããŠãåã³ã³ããŒãã³ããã©ã®éå±€ã«çœ®ãã¹ããã話ãåã£ãŠããŸããã ãã ãã«ãŒã«ã決ãããããšå€æã«è¿·ãããšãå€ããªã£ãŠããŸãããçŸåšã¯ã·ã³ãã«ãªã«ãŒã«ã®ã¿ãèšå®ããããšã§ã以åããå
±éèªèã¯åãããããªã£ãŠããŠããŸãã ãã®èšäºã§ç޹ä»ããæ¹æ³ã¯ã¯BiscuetãšãããµãŒãã¹ã«ãããŠã®ã«ãŒã«ã§ãããã®ãããµãŒãã¹ã®æ§è³ªã«ãã£ãŠå€ãã£ãŠãããšæããŸããããã²åèã«ããŠã¿ãŠãã ããã ãŸããæ¬èšäºã®å
容ã¯åŒç€Ÿã®ãã¶ã€ããŒããŒã ã«ãã ãã¶ã€ã³ããã° ã§ã玹ä»ããŠããŸãã note.mu ãã¶ã€ã³ããã°ã§ã¯ç§ããã¶ã€ããŒç®ç·ã§ã®å
容ãšããŠæžããŠããŸãããã¡ãããããã°ã芧ãã ããïŒ note.mu ã©ã€ã¿ãŒïŒèæ é貎 / Haguri YukiïŒDesigner & EngineerïŒ
ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãããŠãã笹åã§ãã Terraform v0.12ããªãªãŒã¹ãããŠæ°ã¶æçµã¡ãŸãããã¿ãªããã¯ãã䜿ã£ãŠãŸããïŒ ãªããªã䜿ããŠãªãã£ãã®ã§ãããããã°åœçªã«ãªã£ãã®ãããæ©äŒã«ã¢ããã°ã¬ãŒãããŠã¿ãŸããïŒ ä»åã¯ãã¢ããã°ã¬ãŒãã®æé ã玹ä»ããããšæããŸãïŒïŒ ã¢ããã°ã¬ãŒãåã®æºå ã¢ããã°ã¬ãŒãæé ã確èªãã tfenvãã€ã³ã¹ããŒã«ãã Terraform v0.11.14ã§ã¢ããã°ã¬ãŒãåãã§ãã¯ãèµ°ããã ã¢ããã°ã¬ãŒãåãã§ãã¯ã®å¯Ÿå¿ããã Terraform v0.12ãžã®ã¢ããã°ã¬ãŒã Terraform v0.12ãã€ã³ã¹ããŒã«ãã ã³ãŒããä¿®æ£ãã ã¢ããã°ã¬ãŒãã®å¹çš çµããã« ã¢ããã°ã¬ãŒãåã®æºå ã¢ããã°ã¬ãŒãæé ã確èªãã Terraform v0.12ãžã®ã¢ããã°ã¬ãŒãã¯å
¬åŒã®ã¢ããã°ã¬ãŒãã¬ã€ãã«æ²¿ã£ãŠãã£ãŠãããŸãã ã¢ããã°ã¬ãŒãäœæ¥ãå§ããåã«äžéãç®ãéããŠãããŸãããïŒ Upgrading to Terraform 0.12 - Terraform by HashiCorp tfenvãã€ã³ã¹ããŒã«ãã tfenvãšã¯ãrbenvã®ãããªTerraformã®ããŒãžã§ã³ã管çããããŒã«ã§ãã GitHub - tfutils/tfenv: Terraform version manager è€æ°ç°å¢ã§ããããå¥ã®Terraformã®ããŒãžã§ã³ã䜿ãéã«äŸ¿å©ã§ãã ã¢ããã°ã¬ãŒãäœæ¥ãéäžã§æ¢ããããšãããåŸãã®ã§ãå©çšããŠãããŠæã¯ãªãã§ãã Terraform v0.11.14ã§ã¢ããã°ã¬ãŒãåãã§ãã¯ãèµ°ããã v0.11.14ã«ã¯ 0.12checklist ãšããã³ãã³ãã远å ãããŠãããv0.12ã«ã¢ããã°ã¬ãŒãããåã«å¿
èŠãªäœæ¥ã確èªããããšãã§ããŸãã ãŸãv0.11.14ãå©çšã§ããããã«ããŸãããã $ tfenv install 0 . 11 . 14 $ terraform -v Terraform v0. 11 . 14 ç¶ããŠãå¿
èŠãªãã©ã°ã€ã³ãããŠã³ããŒããããŠããããšããtfstateãã¡ã€ã«ãå®ã€ã³ãã©ç°å¢ãåæ ããŠããããšã確èªããŸãã $ terraform init $ terraform apply ãããŠãã¢ããã°ã¬ãŒãåãã§ãã¯ãèµ°ãããŸãã $ terraform 0 .12checklist ãã®ãã§ãã¯ã«ãã£ãŠç¢ºèªãããã®ã¯ä»¥äžã®ããšã§ãã ã¢ããã°ã¬ãŒãããŠããã¹ãProviderããªãã åœåã倿Žãã¹ããªãœãŒã¹ããããã€ããŒã®ãšã€ãªã¢ã¹ããªãã ã¢ããã°ã¬ãŒãããŠããã¹ãå€éšã¢ãžã¥ãŒã«ããªãã ã¢ããã°ã¬ãŒãåãã§ãã¯ã®å¯Ÿå¿ããã ç§ã®ç°å¢ã§ã¯ä»¥äžã®ãããªã¡ãã»ãŒãžãåºåãããŸããã $ terraform 0 .12checklist After analyzing this configuration and working directory, we have identified some necessary steps that we recommend you take before upgrading to Terraform v0.12: - [ ] Upgrade provider " aws " to version 2 . 24 . 0 or newer. No currently-installed version is compatible with Terraform 0 . 12 . To upgrade, set the version constraint for this provider as follows and then run `terraform init` : version = " ~> 2.24.0 " 確èªé
ç®ã®1ã€ç®ãã¢ããã°ã¬ãŒããã¹ããããã€ããŒã®ææãå
¥ããŸããã 該åœã®Providerãå©çšããŠããç®æã§ããŒãžã§ã³ãææ°ã«ããŸãã provider "aws" { version = "~> 2.24.0" region = "${local.aws_region}" } 倿Žãããå床ã0.12checklistã³ãã³ããèµ°ãããŸãããïŒ $ terraform init $ terraform apply $ terraform 0 .12checklist Looks good! We did not detect any problems that ought to be addressed before upgrading to Terraform v0. 12 . This tool is not perfect though, so please check the v0. 12 upgrade guide for additional guidance, and for next steps: https://www.terraform.io/upgrade-guides/0-12.html ããã§ã¢ããã°ã¬ãŒãåã®æºåãçµãããŸããïŒ Terraform v0.12ãžã®ã¢ããã°ã¬ãŒã Terraform v0.12ãã€ã³ã¹ããŒã«ãã ãŸããTerraform v0.12ãå©çšã§ããããã«ããŸãããã $ tfenv install 0 . 12 . 6 $ terraform -v Terraform v0. 12 . 6 ããŒãžã§ã³ãäžããŠãããinitãå床å®è¡ããŸãã $ terraform init ããã§ãTerraform v0.12ãšäºææ§ã®ãªãã·ã³ã¿ãã¯ã¹ã§æžãããŠãããšãããããã°ããããç¥ãããã¡ãã»ãŒãžã衚瀺ããããããªã®ã§ãããç§ã®ç°å¢ã§ã¯è¡šç€ºãããŸããã§ããã ãã ã衚瀺ãããŠãªããããšèšã£ãŠãã¢ããã°ã¬ãŒãäœæ¥ãå®äºããããã§ã¯ãªãã®ã§ãåŒãç¶ãé²ããŠãããŸãããã ã³ãŒããä¿®æ£ãã Terraform v0.12ã®ã·ã³ã¿ãã¯ã¹ã«ããã³ãã³ããv0.12ã«ã¯è¿œå ãããŠããã®ã§ããŸããããã䜿çšããŸãã $ terraform 0 .12upgrade æ£åžžã«å®äºãããšä»¥äžã®ã¡ãã»ãŒãžã衚瀺ãããŸãã Upgrade complete ! The configuration files were upgraded successfully. Use your version control system to review the proposed changes, make any necessary adjustments, and then commit. ãã®äœæ¥ã¯éçã«çŸåšã®ãã£ã¬ã¯ããªäžã®ã³ãŒãã®ã¿ã倿Žããããã§ã åäžãããžã§ã¯ãå
ã«ã¢ãžã¥ãŒã«ãšããŠãå¥ã®ãã£ã¬ã¯ããªã«ãã³ãŒããããå Žåã«ã¯ããã¡ãã«ã€ããŠãå¥éå®è¡ããå¿
èŠããããŸãã $ terraform 0 .12upgrade modules/iam/group $ terraform 0 .12upgrade modules/iam/role ãŸããããã§å®äºã§ã¯ãªããèªåã§ã¢ããã°ã¬ãŒããããªãéšåãããããããã£ãéšåã«ã¯ TF-UPGRADE-TODO ãšããŠãã³ã¡ã³ããã³ãŒãäžã«ãããŠããŸãã ç§ã®ç°å¢ã§ã¯ä»¥äžã®ãããªã¡ãã»ãŒãžãæããŸããã data "aws_iam_policy_document" "developers_policy" { statement { actions = ["sts:AssumeRole"] # TF-UPGRADE-TODO: In Terraform v0.10 and earlier, it was sometimes necessary to # force an interpolation expression to be interpreted as a list by wrapping it # in an extra set of list brackets. That form was supported for compatibilty in # v0.11, but is no longer supported in Terraform v0.12. # # If the expression in the following list itself returns a list, remove the # brackets to avoid interpretation as a list of lists. If the expression # returns a single list item then leave it as-is and remove this TODO comment. resources = [developer.role.arn] } } v0.10以åã§ã¯ãåäžã®å€æ°ãè¿ãããå Žåã§ããªã¹ãã«ããªããšå€æ°ãšããŠè§£éãããªãéšåããããv0.11ã§ããã®èšæ³ããµããŒãããŠããããv0.12ãããµããŒãããªããªã£ããšããããšã§ãã ãªã¹ããè¿ãããã®ãåäžã®å€æ°ãè¿ãããã®ãã§å¯Ÿå¿ãå€ããããã TF-UPGRADE-TODO ãšãªã£ãŠããããã§ãã ä»åã®å Žåã¯ããªã¹ããè¿ãããã®ã§ãã³ãŒãã¯ãã®ãŸãŸã§ã³ã¡ã³ããåé€ããŸããã ãããŸã§è¡ããš terraform plan ã§ãšã©ãŒãã§ãªããªããŸããã ã¢ããã°ã¬ãŒãã®å¹çš çµããã« ä»åã¯Terraform v0.12ãžã®ã¢ããã°ã¬ãŒãäœæ¥ã玹ä»ããŸããã æ°ããæ©èœã«ã€ããŠã®ç޹ä»ã¯ããŸããã§ããããFirst-class expressionsãªã©ã¯ã¹ãããªæžãããšãã§ããããä»ã«ãv0.12ã§è¿œå ãããæ©èœã«ãããéçšã楜ã«ãªãããšãå€ã
ãããŸãã ãããã£ãéçšã楜ã«ãªãç®æã«ã€ããŠã¯ããŸãã®æ©äŒã«æžããããšæããŸãïŒ
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢äºäžã§ãïŒ å€ãã®éçºèŠæãããäžã§ããšã³ãžãã¢ã®ã¿ã§ã€ã³ãã¯ãã®ããæ¹åããããšãã«ã«ãããããããã®ããµã€ãã® ããã©ãŒãã³ã¹æ¹å ããšæããŸãã ä»åã¯ãµã€ãã®ã¹ããŒãèšæž¬ããŒã«ã§ããã Google PageSpeed Insightsã§äœ¿çšãããŠããLighthouseã®ã¹ã³ã¢ ãåèã«ããŠãå®éã«å¹æããã£ãæœçãã玹ä»ããŸãïŒ Google PageSpeed Insightsãšã¯ Lighthouseãšã¯ Performanceé
ç®æ¹åã®é²ãæ¹ å®éã®å¯Ÿç ã¬ã³ããªã³ã°ãããã¯å¯Ÿå¿ ææå
容 察ç ç»åå§çž®å¯Ÿå¿ ææå
容 察ç ãªãã¹ã¯ãªãŒã³ç»åã®é
å»¶èªã¿èŸŒã¿ ææå
容 察ç IntersectionObserver APIãšã¯ å®éã®å®è£
ã€ã¡ãŒãž äžèŠãªJSã»CSSåé€ ææå
容 察ç å¿
é ã®ãã¡ã€ã³ãžã®äºåæ¥ç¶ ææå
容 察ç Resource Hintsãšã¯ dns-prefetch preconnect prefetch ãŸãšã Google PageSpeed Insightsãšã¯ Googleã®ã¹ããŒãèšæž¬ããŒã«ã§ãã åŸè¿°ããLighthouseã®Performanceãããšã«ããŒãžããšã®è©äŸ¡ãæ¡ç¹ããŠããè©äŸ¡é
ç®ãšããŠã¯äžèšã®é
ç®ããããŸãã ã³ã³ãã³ãã®ååãã€ã³ã é床ã€ã³ããã¯ã¹ ã€ã³ã¿ã©ã¯ãã£ãã«ãªããŸã§ã®æé æå³ã®ããã³ã³ãã³ãã®ååãã€ã³ã CPU ã®ååã¢ã€ãã« æå€§æšå® FID developers.google.com Lighthouseãšã¯ Google PageSpeed Insight ã§åæãšã³ãžã³ãšããŠæ¡çšãããŠããèšæž¬ããŒã«ã§ãã Lighthouseã®Performanceé
ç®ãä»åèŠãŠãããã€ã³ããšãªããŸãã chrome.google.com Performanceé
ç®æ¹åã®é²ãæ¹ ããŒã«ã«ã§ã¯æ¬çªç°å¢ãšéããããã¹ããHTTP2察å¿ãªã©ããããŠããªããªã©ã®å·®åããäžèšã®ãããªåé¡ãèµ·ãããŸãã Pefomanceã®ç¹æ°ãéã Pefomanceã®ææç¹ãéã ãªã®ã§ãåºæ¬çã«ã¯ *æ¬çªç°å¢ã§ææãããŠãããã®** ã察å¿ããããŒã«ã«ã§ã¯Lighthouseã§ãã®ææäºé
ãè§£æ¶ãããŠããããªã©ã確èªããªããé²ããŠãããŸãã ãã ãåçŽã«é
ç®éãããã°æ¹åããããã§ã¯ãªããæ¹åãããã®ãããã°ããªããã®ããããŸãã ãããŸã§ææäºé
ã¯æ¹åããå¯èœæ§ãããããšãææããŠããã®ã§ããããŸã§åèãšããŠèªèããŠãããŸãããã å®éã®å¯Ÿç ã¬ã³ããªã³ã°ãããã¯å¯Ÿå¿ ææå
容 ã¬ã³ããªã³ã°ãããã¯ã¯ãµã€ãã衚瀺ãããéã«ãJSãCSSã®èªã¿èŸŒã¿ã«ãã£ãŠã¬ã³ããªã³ã°ãåŸ
ã€ç¶æ
ã«ãªããã³ã³ãã³ãã®è¡šç€ºãé
ããªãçŸè±¡ã§ãã 䞻㫠JSãªã©ãheadéšåã§èªã¿èŸŒãŸããããäžèŠãªCSSãå€ã ãšãã®çŸè±¡ãèµ·ãããŸã 察ç JSã®å¯ŸçãšããŠã¯ç°¡åã§bodyã®ããšãªã©ã§JSãèªã¿èŸŒãããã«ããã®ã¿ã§ãã CSSã®å¯Ÿå¿ãšããŠã¯å°ãé£ãã察çãšããŠäžèŠãªCSSããªããããŸãã¯åæè¡šç€ºã¯FirstViewã§äœ¿çšããCSSã®ã¿ãèªã¿èŸŒãããã«ãããªã©ãèããããŸãã ä»ã«ãloadCSSã䜿çšããŠã¬ã³ããªã³ã°ãããã¯ãåé¿ããäŸãããããã§ãã(èªåã¯ãã£ãããšãªãã§ããããã) 全ブラウザ対応!preload で CSS を非同期で読み込み高速化 ç»åå§çž®å¯Ÿå¿ ææå
容 åçŽã§ç»åãµã€ãºã倧ãããããšèªã¿èŸŒã¿ãé
ããªãããã®ææãã§ãŸãã 察ç ãã¹ãŠã®ç»åå§çž®ããåŠçã»ããããäœããªã©ã®å¯Ÿå¿ããããŸãããæ€èšŒãšããŠããã®ã§ããã°TinyPingãªã©ã§WEBäžã§ç»åå§çž®ããŠã¢ããããŒããããªã©ãããããã§ãã tinypng.com ãªãã¹ã¯ãªãŒã³ç»åã®é
å»¶èªã¿èŸŒã¿ ææå
容 FirstViewãªã©ã§è¡šç€ºãããŠããªãç»åã®èªã¿èŸŒã¿ã«ãã£ãŠãã³ã³ãã³ã衚瀺ãé
ããªãããšããããŸãã 察ç 察çãšããŠã¯Googleãæšå¥šããŠããIntersectionObserver APIã䜿ã£ãlazyload察å¿ããããŸãã IntersectionObserver APIãšã¯ ç¹å®ã®DOMèŠçŽ ãç»é¢å
ã«å
¥ã£ãŠãããã©ãããããã«ãã®äœçœ®ãååŸããããšãã§ããAPIã§ãã å®éã®å®è£
ã€ã¡ãŒãž HTMLåŽ < img src = '' data - src = '' ç»åã®URL ' is-lazyload/> JSåŽ var observer, targetImgs; // ç»åãç»é¢ãªãã«å
¥ã£ããdata-src屿§ãsrc屿§ã«ã»ãããã observer = new IntersectionObserver( function (images) { return images.forEach( function (image) { if (image.isIntersecting) { image.target.src = image.target.dataset.src; return observer.unobserve(image.target); } } ); } ); // lazyload察象ã®ç»åãåã£ãŠãã targetImgs = document .querySelectorAll( "img[is-lazyload]" ); // lazyload察象ã®ç»åã«åŠçãèšå® targetImgs.forEach( function (targetImg) { return observer.observe(targetImg); } ); äžèŠãªJSã»CSSåé€ ææå
容 JSã»CSSãªã©ã§äœ¿çšãããŠããªããã®ãååšããå Žåã«ææãããŸãã äŸãšããŠã¯å¿
èŠãªmodule以å€ããã¹ãŠèªã¿æ··ãã§ãå Žåãªã©ã«ãªããŸãã 察ç ãã¡ãã¯ChromeDeveloperConsoleã®covelegeãªã©ã§ã 䜿çšãããŠããJSã»CSSã確èªããªããããã«ããã¯ãæ¢ã ãŠããåé€ããŠããå°éãªäœæ¥ãå¿
èŠã«ãªããŸãã å¿
é ã®ãã¡ã€ã³ãžã®äºåæ¥ç¶ ææå
容 å€éšã®JSãCSSãªã©ãåžžã«èªã¿èŸŒãã§ããã®ãå€ãããã®åå解決ããã£ãã·ã¥ãããŠããªãç¶æ
ã§ææãããŸãã 察ç Resource Hintsã«ããäºåã®åå解決ããªãœãŒã¹èªäœã®ãã£ãã·ã¥å¯Ÿå¿ãè¡ããŸãã Resource Hintsãšã¯ Resource Hintsã¯linkèŠçŽ ãå©çšãããªãœãŒã¹å
èªã¿ã®ããã®ä»çµã¿ã§ãã äºåã«ååŸãã¹ããªãœãŒã¹ãæç€ºããããšã§ãå
èªã¿ããã£ãã·ã¥ãå¯èœã«ãªããŸãã dns-prefetch DNSã®ãã£ãã·ã¥è¡ãååè§£æ±ºã®æéãåæžããŸãã < link rel = "dns-prefetch" href = "//example.com" > preconnect DNS ã®è§£æ±ºã«å ã㊠TCP ã®æ¥ç¶ãŸã§ã確ç«ããŠãããããã«ãªã¯ãšã¹ããè¡ããç¶æ
ã«ããŸãã < link rel = "preconnect" href = "//example.com" > prefetch äž»ã«éçãªãœãŒã¹ã®ãã£ãã·ã¥ã«äœ¿çšãããŸãã < link rel = "prefetch" href = "//example.js" > ãŸãšã ä»åã¯Lighthouseã§ææãããŠããé
ç®ã®å¯Ÿå¿å
容ã«é¢ããŠç޹ä»ããŸããã ãã®å
容ã§ããããPerformanceæ¹åã«æ©ããã©ãçããã°ãšæããŸãã
ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ç§å·ã§ãïŒ ã¯ã©ã€ã¢ã³ããµã€ã(JavaScript)ã§åŠçã宿å®è¡ãããå Žåã¯çãã䜿ããŸãããïŒ ããsetInterval颿°ã§ãã ãã äœãèãã䜿ã£ãŠããŸããšè²ã
ãªåé¡ãèµ·ãã£ãã... ããã§æ¬èšäºã§ã¯setInterval颿°ã䜿ãéã®å°ãããšãæããŠãããããŸãã£ãšè§£æ¶ããVue.jsãã©ã°ã€ã³ãäœãæ¹æ³ã玹ä»ããããšæããŸãïŒ (ä»åã¯Vue.jsã§å®è£
ããŸãããç¹ã«äŸåããŠããããã¯ãªãã®ã§ä»ã®ãã¬ãŒã ã¯ãŒã¯ãã䜿ãã®æ¹ãåèã«ããŠãã ããïŒ) ãŸãVue.jsãã©ã°ã€ã³ã®é圢ãäœã å°ãããš1 å°ãããš: ãã©ãŠã¶(ã¿ã)ãéãã£ã±ãªãã«ãããšå¿
èŠä»¥äžã«å®è¡ãããŠããŸã 解決æ³: Page Visibility APIãå©çšããŠã¢ã¯ãã£ããªãšãã«ããåŠçãå®è¡ããªã å°ãããš2 å°ãããš: ããŒãžé·ç§»ããŠãsetIntervalãç¶æãããŠããŸã 解決æ³: timeId(setIntervalã®ID)ããã©ã°ã€ã³åŽã§äžæ¬ç®¡ç å°ãããš3 å°ãããš: éçºç°å¢(ããŒã«ã«)ã§å®æå®è¡ããããšãããã°ãªã©ãã«ãã 解決æ³: ç°å¢å€æ°ã«å¿ããŠå®æå®è¡ããªã ãã©ã°ã€ã³å
šäœ ãŸãšã ãŸãVue.jsãã©ã°ã€ã³ã®é圢ãäœã ä»åã¯Vue.jsã§setIntervalã®ã©ãããŒé¢æ°ããã©ã°ã€ã³ãšããŠå®è£
ããããšæããŸãã ãã©ã°ã€ã³ã¯ä»¥äžã®ããã«ãªããŸãã src/plugins/SetInterval/index.js export default { install (vue) { vue.prototype.$setInterval = (func, intervalMilliSec) => { const id = setInterval(() => { func() } , intervalMilliSec) return id } } } ãããmain.jsãªã©Vueèªã¿èŸŒã¿æã«ä»¥äžã®ããã«ã€ã³ã¹ããŒã«ããããšã§å®è¡å¯èœã«ãªããŸãã main.js import Vue from 'vue' import SetInterval from '@/plugins/SetInterval' ... Vue.use(SetInterval) ã³ã³ããŒãã³ãå
ã§ã®å®è¡ã€ã¡ãŒãžã¯ä»¥äžã®ããã«ãªããŸãïŒ export default { created () { this .$setInterval(() => { // åŠç } , 1000) } } src/plugins/SetInterval/index.js ã«å°ãããšã«å¿ããæ©èœã远å ããŠããããšæããŸãïŒ å°ãããš1 å°ãããš: ãã©ãŠã¶(ã¿ã)ãéãã£ã±ãªãã«ãããšå¿
èŠä»¥äžã«å®è¡ãããŠããŸã ããããã£ãšãããããåé¡ããªãšæããŸãã setIntervalã¯éåžžãã©ãŠã¶ãèµ·åããŠããç¶æ
ã§ããã°å®è¡ããç¶ããŸãã äŸãã°ä»ã®ã¿ãã§å¥ãµã€ããèŠãŠããå Žåãªããã«ãè£åŽã§å®è¡ããç¶ãããšäžå¿
èŠã«APIãªã¯ãšã¹ããæãç¶ããŠããŸãåé¡ãèµ·ãããŸãã(ã¿ããè€è£œããå Žåã«ãã®åAPIãªã¯ãšã¹ããæµãã...ãšãè² è·ãã°ãã«ã§ããªããªã£ãŠããŸããã) ããšãããŒãžãé²èЧããŠãããšãã ãã«ãŠã³ãã¢ãã...ãªããŠããšããããããããŸãããã 解決æ³: Page Visibility APIãå©çšããŠã¢ã¯ãã£ããªãšãã«ããåŠçãå®è¡ããªã Page Visibility APIãå©çšããããšã§ãJavaScriptããããŒãžãã¢ã¯ãã£ããã©ãããååŸã§ãããŸãç¶æ
ã倿Žãããã€ãã³ãããã³ããªã³ã°ããããšãã§ããããã«ãªããŸãïŒ document.visibilityState ã visible ã®ç¶æ
ããããŒãž(ã¿ã)ãã¢ã¯ãã£ããªç¶æ
ãšãªãããã®ç¶æ
ã®ã¿é¢æ°ãå®è¡ãããããã«ããŠããŸãã export default { install (vue) { vue.prototype.$setInterval = (func, intervalMilliSec) => { const id = setInterval(() => { if ( document .visibilityState === 'visible' ) { func() } } , intervalMilliSec) return id } } } å°ãããš2 å°ãããš: ããŒãžé·ç§»ããŠãsetIntervalãç¶æãããŠããŸã Vue.jsãªã©ãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠããå Žåãå€ãã¯ã¯ã©ã€ã¢ã³ããµã€ãã§ã«ãŒãã£ã³ã°ãªã©ç®¡çããŠããããšãšæããŸãã ãã®å ŽåãããŒãžé·ç§»æã«setIntervalãç¶æãããŠããŸãã®ã§ãæå³ããªãããŒãžã§åŠçãå®è¡ãããŠããŸãããšãèµ·ããåŸãŸãã äŸãã°ããã°ã¢ãŠãããŠãã°ã€ã³ç»é¢ã«é·ç§»ãããã®ã«ãè£ã§ã¯APIã«ãªã¯ãšã¹ããæãç¶ããŠããŸã...ãªããŠããšãèµ·ãããããããŸããã ãããªãšãã«åœç¶ãã£ã³ã»ã«åŠçãå®è£
ããã°è§£æ±ºïŒãšãªãããã§ãããsetIntervalã®ãã£ã³ã»ã«ã¯ä»¥äžã®ããã«è¿ãå€ã® timerId ãclearInterval颿°ã«æž¡ãå¿
èŠããããæ§ã
ã®ã³ã³ããŒãã³ãã§å¥œãåæã«åŒã³åºããŠããå Žåã¯ãããå°é£ã«ãªããŸãã const timerId = setInterval(() => { // åŠç } ) ... clearInterval(timerId) 解決æ³: timeId(setIntervalã®ID)ããã©ã°ã€ã³åŽã§äžæ¬ç®¡ç 以äžã®ããã«åsetIntervalã®IDãã€ã³ã¹ã¿ã³ã¹å€æ°ãšããŠä¿æããããã䜿ã£ãŠãã¹ãŠããã£ã³ã»ã«ããclearAllIntervals颿°ãªã©ãå®çŸ©ããŠããŸãã ããã«ãã£ãŠãããŒãžé·ç§»æã®ã€ãã³ãããã³ããªã³ã°ããŠãsetIntervalããã£ã³ã»ã«ãããªã©å¯èœã«ãªããŸãïŒ export default { install (vue) { vue.prototype.$intervals = [] vue.prototype.$setInterval = (func, intervalMilliSec) => { const id = setInterval(() => { func() } , intervalMilliSec) vue.prototype.$intervals.push(id) return id } vue.prototype.$clearInterval = (id) => { clearInterval(id) vue.prototype.$intervals = vue.prototype.$intervals.filter(i => i !== id) } vue.prototype.$clearAllIntervals = () => { vue.prototype.$intervals.forEach(clearInterval) vue.prototype.$intervals = [] } } } å°ãããš3 å°ãããš: éçºç°å¢(ããŒã«ã«)ã§å®æå®è¡ããããšãããã°ãªã©ãã«ãã APIã®éçºãããŠããéã«ãå¥ã®æ©èœã§å®æå®è¡ã§APIãå©ãããŠããã°ãæµããŠããŸã... ã¿ãããªããšããããŸãããã 解決æ³: ç°å¢å€æ°ã«å¿ããŠå®æå®è¡ããªã ãããããéçºç°å¢(ããŒã«ã«)ã§ VUE_APP_DISABLE_SET_INTERVAL ãªã©ã®ç°å¢å€æ°ãå®çŸ©ããŠãããŠããã®å€æ°ãå®çŸ©ãããŠããå ŽåsetIntervalãç¡å¹åããŠããŸãã ããããããšã§ãç°¡åã«åãæ¿ããå¯èœã«ãªããŸãïŒ export default { install (vue) { vue.prototype.$setInterval = (func, intervalMilliSec) => { if ( typeof (process.env.VUE_APP_DISABLE_SET_INTERVAL) !== 'undefined' ) { console.log(` [ DISABLE_SET_INTERVAL ] Check environment vars`) return null } const id = setInterval(() => { func() } , intervalMilliSec) return id } } } ãã©ã°ã€ã³å
šäœ export default { install (vue) { vue.prototype.$intervals = [] vue.prototype.$setInterval = (func, intervalMilliSec) => { if ( typeof (process.env.VUE_APP_DISABLE_SET_INTERVAL) !== 'undefined' ) { console.log(` [ DISABLE_SET_INTERVAL ] Check environment vars`) return null } const id = setInterval(() => { if ( document .visibilityState === 'visible' ) { func() } } , intervalMilliSec) vue.prototype.$intervals.push(id) return id } vue.prototype.$clearInterval = (id) => { clearInterval(id) vue.prototype.$intervals = vue.prototype.$intervals.filter(i => i !== id) } vue.prototype.$clearAllIntervals = () => { vue.prototype.$intervals.forEach(clearInterval) vue.prototype.$intervals = [] } } } ãŸãšã ä»åã¯setIntervalã䜿ãéã«èµ·ããåé¡ã解決ããVue.jsãã©ã°ã€ã³ã®å®è£
äŸã玹ä»ããããŸããã 解決æ³ãç°¡åã«ãŸãšãããšä»¥äžã®ããã«ãªããŸãã Page Visibility APIã䜿ã setIntervalãã°ããŒãã«ã§ç®¡çãã éçºã¢ãŒããå®è£
ãã ãããã£ã现ããåé¡ã¯ãåªå
床ãäœããããã£ãŒãããŒã®ããã«ããããã³ã¹ãããªã¹ã¯ãšãªã£ãŠããã®ã§ãåèã«ãªãã°ããããã§ãïŒ
ã¹ããŒããã£ã³ãã®ä»å·ã§ãã å
æ¥ãAWSèªå®è³æ Œã® ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã - ã¢ãœã·ãšã€ã ãåããŠç¡äºåæ ŒããŠããŸãããä»åã¯åéšå¯Ÿçã»åéšãçµãŠã®ææ³ãèŠããŠããããããšããŸãšããŸããã AWSã®èªå®è³æ ŒãããããåãããšããŠããæ¹ãèå³ãããæ¹ã®åèã«ãªãã°å¹žãã§ãã èæ¯ åéšåœæã®çµéšã»ä¿æè³æ Œ åéšæºå ååŒ·æ¹æ³ åºæ¬çãªé²ãæ¹ éèŠé
ç® ãããã¯ãŒã¯ç³» ã³ã³ãã¥ãŒãã£ã³ã°ç³» ã¹ãã¬ãŒãžç³» DB ã»ãã¥ãªã㣠æ¯ãè¿ã£ãŠããå°ãèŠãŠããã°ããã£ããšæããšãã åé¡é 暡詊 åéšã®æµã çµæ è³æ Œç¹å
ž åããŠã¿ãŠ ãŸãšã èæ¯ ãã£ãšä»äºã§AWSãè§Šã£ãŠããŠã以åããAWSèªå®è³æ Œã«ã¯èå³ããã£ãŠåããããªããšæã£ãŠãããã®ã®ãã£ããããªããããããšããŠããŸããã ãããªæãéšçœ²çã« AWSã®ãã¯ãããžãŒããŒãããŒã«ãªãã ãšããæ©éãé«ãŸããAWSèªå®è³æ Œä¿æè
ãå¿
èŠã ãšãªãã ãã£ã³ã¹ã ïŒ ãšã°ããã«æãäžããŸããã AWS Partner Networkã®ãã¯ãããžãŒããŒãã㌠- ã»ã¬ã¯ãã«ãªããšã®ããšã ã£ãã®ã§ã¢ãœã·ãšã€ã以äžã®èªå®è³æ Œãå¿
èŠã§ããã瀟å
ã§ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ãããããããããããšãããããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã - ã¢ãœã·ãšã€ããåéšããããšã«ããŸããã åéšåœæã®çµéšã»ä¿æè³æ Œ Webãšã³ãžãã¢4å¹Žç® AWSã䜿ãå§ããŠ5å¹Žç® ä¿®å£«2幎ãã䜿ã£ãŠããã®ã§ æ
å ±åŠçæè¡è
詊éš: åºæ¬æ
å ±ã»å¿çšæ
å ± JSTQBèªå®ãã¹ãæè¡è
è³æ ŒFoundation Level ãœãããŠã§ã¢å質æè¡è
è³æ Œ(JCSQE)åçŽã»äžçŽ å¥œããªAWSã®ãµãŒãã¹: Elastic Beanstalk è³æ Œè©Šéšåããã®ã¯æ
£ããŠããŸããã åéšæºå AWSèªå®è³æ Œã«ã€ããŠèª¿ã¹ãŠã以äžã®ããšãããããŸããã ã³ã³ãã¥ãŒã¿ãæäœããŠåãã詊éšïŒããããCBTïŒãªã®ã§ãã¹ãã»ã³ã¿ãŒã§åéšãã ãã¹ãã»ã³ã¿ãŒã«ãã£ãŠã¯åéšæ¥ãçµæ§å€ããæ
å ±åŠçæè¡è
詊éšãšéã£ãŠ å²ãšãã€ã§ãåãããã CBTãªã®ã§æš¡è©ŠãåããŠæäœã«ãªããŠããã®ãæãŸãããšã®ããš ãã®åŸãã»ãã®åéšäœéšèšãèªã¿æŒãæªçµéšã§ãïŒé倿éããã«æŽ»çšãããªã©ããŠïŒ1,2é±éã§åãã£ãŠããããšãèŠãŠã2-3é±éåŸãç®åŠã«åéšèšç»ãç«ãŠãŸãããæçµçã«åéšæ¥ã¯äžåžããã¯ãããŸã§æ¥ããããŠããªãã£ããã èªåãšã®çžè« ã§æ±ºãã3é±éåŸã«å®ããŸããã 詊éšç³ã蟌ã¿ãå«ãã以äžã®ãã®ãçšæããŸããã æ¬è©Šéšç³ã蟌㿠暡詊ç³ã蟌㿠åèæžè³Œå
¥: AWSèªå®è³æ Œè©Šéšããã¹ã AWSèªå® ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã-ã¢ãœã·ãšã€ã åé¡éãµã€ãã®ç»é²: ãAWS WEBåé¡éã§åŠç¿ãããããã åèæžã¯ä»¥äžã®æžç±ã賌å
¥ããŸããã AWSèªå®è³æ Œè©Šéšããã¹ã AWSèªå® ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã-ã¢ãœã·ãšã€ã äœè
: NRIãããã³ã æ ªåŒäŒç€Ÿ , äœã
æš æé , æ æäžé , éæŸ€ å çºå£²æ¥: 2019/04/20 ã¡ãã£ã¢: åè¡æ¬ éžãã åºæºãšããŠã¯ãå²ãšæ°ããã§ãã£ãããšãšãèªåãåããŠAWSã«è§Šã£ããšãã«å匷ãã以äžã®æ¬ãšåãNRIãããã³ã ãããèè
ã§ãã£ãããšãæããããŸãã Amazon Web Services ãã¿ãŒã³å¥æ§ç¯ã»éçšã¬ã€ã æ¹èšç¬¬2ç (Informatics&IDEA) äœè
: NRIãããã³ã æ ªåŒäŒç€Ÿ , äœã
æš æé , æ æäžé , å°è¥¿ ç§å , äœè€ ç¬ çºå£²æ¥: 2018/03/23 ã¡ãã£ã¢: åè¡æ¬ â»èªåãèªãã ãšãã¯ãŸã 第1çã§ããããã³ãºãªã³ã§èŠããããããæ¬ã§ãã åé¡éãµã€ãã¯ä»¥äžã®ãAWS WEBåé¡éã§åŠç¿ãããããããå©çšããŸããã aws.koiwaclub.com éšçœ²çã«å¿
èŠã ã£ãã®ã§åé¡éãµã€ã以å€ã®è²»çšã¯äŒç€Ÿã«åºããŠããããŸãããããäŒç€Ÿã§ãã ã»ãã«ãæè¡æžãå¿
èŠã«ãªã£ããããã«è³Œå
¥ããŠããããã®ã§ãããããã§ãã boxil.jp ååŒ·æ¹æ³ åºæ¬çãªé²ãæ¹ 3é±éãç®åŠã«ããŠããŸãããå®éã«å匷ãå§ããã®ã¯10æ¥åãããããã§ãããåé¡éããã£ããèªã¿ã暡詊ãåããŠè§£ãçŽããããåé¡éãè§£ããŸãã£ãŠééãããšããã埩ç¿ããŸããã ã¡ãªã¿ã«ç¡æã§åãããããŠã§ãããŒããã¬ãŒãã³ã°ãªã©ããããŸãããèªåã¯Black Beltãäžå¿ã«èŠãŠããŸããããŸã詊éšã®ããã«AWSã®ãªãã¬ãŒã·ã§ã³ãæ¹ããŠãããšããããšããããŸããã§ãããå®åçµéšãå
šãŠã®ç¶æ
ã§æãã§ããŸãã å®éã®æ¹æ³ãšããŠã¯ãåèæžãããŒã¹ã«iPadã«Apple Pencilã䜿ã£ãŠããŒããäœãããã«å匷ããŠããŸãããã ãã ãããã©ããããªã£ãŠããã®ã§å顿Œç¿ãã¬ã³ã¬ã³ããŸãããééãããšããã調ã¹ãŸãã£ããSlideshareã«ããè³æãå
¬åŒããã¥ã¡ã³ããèªã¿æŒããããªæµãã«åãæ¿ããŸããã éèŠé
ç® åºãé ãšãŸã§ã¯èšããŸããããèªåãéç¹çã«èŠãç®æã¯ä»¥äžã®ãããªæãã§ã ãããã¯ãŒã¯ç³» VPCã®æ§æèŠçŽ ãµããããã®æ§æèŠçŽ ã»ãã¥ãªãã£ã°ã«ãŒããšãããã¯ãŒã¯ACLã®éã VPCå
ã«çœ®ããµãŒãã¹ãšVPCå€ã«ãããµãŒãã¹ EC2ã«ã¢ã¯ã»ã¹ããããã®èŠä»¶: ã€ãªãããªããšãã©ããèŠããïŒ ãªã³ãã¬ãšé£æºããå Žåã«ã€ãããVPNç³»ã®ãµãŒãã¹ã«ã€ããŠãã§ã㯠ã³ã³ãã¥ãŒãã£ã³ã°ç³» EC2 AMIãšEBSã¹ãããã·ã§ããã®éã S3backedãšEBSbackedã®éã ã€ã³ã¹ã¿ã³ã¹ã¹ãã¢ã®æ±ãæ¹ Auto Scalingã®ä»çµã¿ Lambda ã¡ã¢ãªæå®ã ãã¡ã¢ãªã«åãããŠå²ãåœãŠãããCPUãå¢ãã ã¹ãã¬ãŒãžç³» S3 ã¹ãã¬ãŒãžã¿ã€ã: STANDARD-IAãšãONEZONEãšã ã©ã€ããµã€ã¯ã«ããªã·ãŒãããŒãžã§ãã³ã°ãªã©ã®æ©èœ Glacier ã³ã¹ãé¢ã§æå©ãªã¶ãèšããããŠããå¶éã«ã€ã㊠åãåºãæ¹æ³ã«ããéã EBS ã¹ãã¬ãŒãžã¿ã€ãããšã®ã¡ãªãã/ãã¡ãªãã EFS EBSã䜿ãã¹ããšãããšEFSã«ãã¹ããšããã®ãã€ã³ã DB Auroraã«è§Šããããšããªãã£ãã®ã§å
šäœçã«ç¢ºèª DynamoDBããªã«ã§ãããã«ã€ããŠãã£ãããã 20190424 AWS Black Belt Online Seminar Amazon Aurora MySQL from Amazon Web Services Japan www.slideshare.net AWS Black Belt Online Seminar 2017 Amazon DynamoDB from Amazon Web Services Japan www.slideshare.net ã»ãã¥ãªã㣠IAM IAMãŠãŒã¶ãšIAMããŒã«ã®éã IAMã°ã«ãŒãã®äœ¿ãæ¹ æ¯ãè¿ã£ãŠããå°ãèŠãŠããã°ããã£ããšæããšãã ã»ãã¥ãªãã£åšã KMSã顧客ããŒã®æ±ãæ¹ãªã© Kinesis åé¡é åè¿°ã®åé¡éãµã€ãã«ã€ããŠã¯ãææç»é²ïŒãŽãŒã«ããã©ã³ïŒãããš130ã»ãã匱x7åã®å顿Œç¿ãã§ããŸãã çªå·ã®è¥ããã®ã«ã€ããŠã¯å®éã®åé¡åœ¢åŒãšè¿ããªãã§ããã100çªå°ãããã¯çµæ§å®éã®åé¡ãšè¿ãã®ã§ããããã§ãããã£ã¡ã®åé¡éã¯æ¬è©Šéšã®é£æåºŠãšè¿ãã§ãããããŸã§èŸŒã¿å
¥ã£ãåé¡ã¯åºãŸããã æš¡è©Š ãã£ãã詊éšç¯å²ãç·ãããããŠããæš¡è©ŠãåããŸããã çµè«ãããã㚠絶察ã«åããã»ããè¯ãã§ã ãCBTã«æ
£ãããããšããã®ããããŸãããå°é床確èªãšããŠãéèŠã§ãã ãã ããæ³šæããã¹ãã¯ æš¡è©Šã¯æ¬è©Šéšããé£æåºŠãäœã ã§ããããšã§ãã æš¡è©Šã§80%åããŠåãã§ãŸãããããæ¬è©Šéšã¯ãã£ãšé£ããããšããèšäºãèªãã§å±æ©æãèŠããŸãããããããé£ãããšãããèœã¡ããããšããæææã«é§ãç«ãŠãããŸããïœ åé¡ã¯ãã®åŸæ®ãããã©ã®åé¡ããã£ãŠãããã©ãããããããŸããããã®ããå
šåã¹ã¯ãªãŒã³ã·ã§ããããšã£ãŠä¿åããŠèŠçŽãã®ãäžè¬çã§ãã æ£è§£ãäžæãªã®ã§ãç§ã¯å³å¯ã«éžæè¢ã1ã€1ã€æ€èšŒããŠæ¶å»æ³ããã£ãŠãããšããææ®µããšã£ãŠè§£ãçŽããŸãããããã«ãããåãµãŒãã¹ã®éãã现ãã仿§ã«ã€ããŠæŒãããããšãã§ããŸããã ããã®ãµãŒãã¹ã«ã€ããŠããããã£ãŠãªããªããšæã£ãéšåã¯Black Beltè³æãèªãã ããåèæžã«æ»ã£ãããå
¬åŒããã¥ã¡ã³ãããªãªãŒã¹ãèªãã ãããŠè£å®ããŸããã ç§ã¯æš¡è©ŠãåãããŸã§SQSã«FIFOãã¥ãŒãç»å ŽããŠããããšãç¥ããŸããã§ãããæ¬è©Šéšã§ãåºãã®ã§åŸ©ç¿ããŠããŠããã£ãã§ãïŒ åããäžã§ç¥ããªããµãŒãã¹ãç¥ããªãæ©èœã¯ç¹åŸŽããã©ã䜿ãã®ããããïŒãã確èªããã®ãããããããŸããã©ãããå¶éããããïŒãæŒãããŠãããŸãããã åéšã®æµã åœæ¥ã¯ãšã«ããäœè£ããã£ãŠæã¿ãŸããã倿¹åéšã«ããŠããã®ã§äŒç€ŸãåºãŠãã¹ãã»ã³ã¿ãŒãžã ãã¹ãã»ã³ã¿ãŒã§ã¯ãã¹ãŠã®è·ç©ãé ããå¿
èŠããããŸããã¹ããã¯ãã¡ããPCãªã©ã黿ºãªãã§ãããã±ããã®äžèº«ã確èªãããŸããæã¡èŸŒããã®ã¯ããã«ãŒã®ããŒïŒç©çïŒãšèº«å蚌ãã¡ã¢çšã®ãã¯ã€ãããŒãã§ãã é¡åçæ®åœ±ããµã€ã³ãæ±ããããã®ã§å¿ããŠãããŸãã ãç£èŠãããªããåããããšãã話ãèããŠããŸãããç£èŠã«ã¡ã©ããããããŒãã£ã·ã§ã³ã§åºåãããããœã³ã³å®€ãšããæãã§ãããåå¥ã®ç£èŠã¯ãªããããã§åããŠãã ãããããšããæãã ã¡ã¢çšã«æ¶ããªããã¯ã€ãããŒããæž¡ãããŸãããããã¯ãŒã¯æ§æå³ãæžããŠããŸããã 空調ããããããŠå€§å€ã§ããããé²é³ã€ã€ãŒããããã£ãã®ã§çããŠåããŠããŸããã åºé¡ã¯65åãå¶éæéã¯135åãªã®ã§1å2å䜿ã£ãŠãäœè£ããããŸããå³çå¯èœãªåé¡ãååããã®ã§å€§åäœè£ãããã¯ãã§ãã ããããªãåé¡ã10åããããããŸããããåŸã§èŠçŽãæ©èœãããã®ã§å©çšãããšäŸ¿å©ã§ããå
šäœã¯2åãäžå®ãªãšããã¯3åèŠçŽããŸããã äœè«ã§ããä»äºçµããã ããé²é³ã€ã€ãŒããã¯å¿«é©ããã ãã§äœåºŠããã€ã¯ãã¹ãªãŒãããŠããŸããâŠã çµæ è©ŠéšæéãçµäºããåéšããŠã¿ãŠã®ã¢ã³ã±ãŒãã«çãããš ããªãã¯åæ ŒããŸãã çãªè¡šç€ºãåºãŸããã ååã®èšäºãåºããæãš135åã®è©ŠéšãçµããŠåãã£ãããšã ããäŒããããç§ã®Slackã§ã®ãããšãããã¡ãã§ãã ç¿æ¥å€æ¹ã«ã¹ã³ã¢ã¬ããŒããå±ããŸãããæå€§ã§5æ¥éããããšãããŠããŸãããçµæ§æ©ãã£ãã TOEICã¿ãããªåŸç¹åœ¢åŒã§ã100-1000ç¹ã§è¡šèšãããŸããã900ç¹è¶
ããã®ã§ã¡ãããšå匷ããææãåºãããšã宿ã§ããŸããã ã«ããŽãªå¥ã®ã¬ããŒããåºãŸããããŒã»ã³ããŒãžã¯æ£ççã§ã¯ãªããç¹æ°é
åã§ããå
šåæ£è§£ã ïŒïŒïŒãšã¬ãåã³ããŠããŸã£ãã è³æ Œç¹å
ž äœè«ã§ãããåæ Œãããšä»¥äžã®ç¹å
žãåŸãããŸãã AWSèªå®è©Šéšã®æš¡è©Šã®ã¯ãŒãã³ã³ãŒã AWSèªå®è©Šéšã®æ¬è©Šéšãåé¡ã§åããããã¯ãŒãã³ã³ãŒã AWSèªå®ã®åé¡ãäœãããšã«ååã§ããã¯ãŒã¯ã·ã§ãããžã®åå æš©ïŒè±èªãå¿
é ãããâŠïŒ AWS Certifiedéå®ã¢ã€ãã ã®ã·ã§ããïŒæµ·å€çºéã§éæããã¡ããããïŒ åããŠã¿ãŠ åé¡çã«ã¯è©Šéšåã«ã詊éšåé¡ãå
¬éããªããæšã®èªçŽãããªããšãããªãã®ã§çްããéšåãŸã§ãããŸãããã以äžã®ããšãæããŸããã å顿ãçµæ§ãããã«ããéšåãããã®ã§ãè±èªã«ããŠèªã¿çŽããŠã¿ããããã¯ã€ãããŒãã«ã¡ã¢ããªããæŽçããã®ããããã 3å±€ã¢ãŒããã¯ãã£ãšãæããªãå顿ã«åºãŠããã®ã§åºæ¬æ
å ±ãããã®ç¥èã¯æ ¹åºãšããŠãªããšå€§å€ãã ã»ãã¥ãªãã£ããªã·ãŒã®ããã客ãããæ³å®ãã質åã§ãã€ã³ã¿ãŒããããä»ããã«S3ãšãããšããããããšããããã¹ã¿ãŒããŒãã¯ã©ãŠãã«ã¢ããããŠã¯ãããªãæããªã©ãã»ãã¥ãªãã£ç³»ã¯ãã£ã¡ãæŒãããŠãããšåŸç¹æºã«ã§ããã ã»ãã¥ã¢ãªã¢ããªã±ãŒã·ã§ã³æ§ç¯ã¯åé¡ã®26%ãå ããŠããã®ã§å€§äº ãŸãšã AWSã®ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã - ã¢ãœã·ãšã€ãã®åæ ŒäœéšèšãæžããŠã¿ãŸããã AWSã倧åè§Šã£ãŠããŸããããEC2ãšRDSãã¡ã€ã³ã§ãã以å€ã¯ã¡ããã¡ããããšããæãã ã£ãã®ã§æ®æ®µè§Šããªããšãããå匷ãããã£ããã«ãªã£ããšæããŸãã ãœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ããšããååã®éããéçºããŒã ããŠãŒã¶ã顧客ã«å¯ŸããŠãœãªã¥ãŒã·ã§ã³ãæäŸããããã®æ§æãèããã¹ãã«ãåãããããå匷ããããšããã®ãŸãŸå®è·µã§ããããªæèŠããããŸãããå®çŸã®ããã®åŒãåºããå¢ããã®ã¯å¬ãã广ã§ãã ãŸããåºæ¬æ
å ±ãå¿çšæ
å ±ã®ç¥èã¯ããã®ãšãªãã®ãšã§å匷ã®ã¹ã¿ãŒãäœçœ®ãå€ããããšãã宿ãåŸãŸãããäœè£ã®ããã²ãšããªã人ãã¯ãã²ææŠããŠã»ããã§ãããŸã ç§è©Šéšã«éã«åããŸãã ãã®èª¿åã§ã»ãã®ã¢ãœã·ãšã€ãè³æ Œãããœãªã¥ãŒã·ã§ã³ã¢ãŒããã¯ã - ãããã§ãã·ã§ãã«ã«ãææŠããããšæã£ãŠããŸãã倧åé£ããã§ããããâŠãBlack Beltã®è³æã«ã¯ãããžããã£ã±ã䞊ãã§ãããããã£ãŒã«ãèŒã£ãŠããã®ã§ãããç®æããŠé 匵ãããšæããŸããã ãããŸã§ãèªã¿ããã ãããããšãããããŸããã
UNIXãšããèãæ¹ ã¹ããŒããã£ã³ãã§ãšã³ãžãã¢ãããŒãžã£ãŒãããŠããŸãæã§ãã ç§ã¯ãšã³ãžãã¢ãããŒãžã£ãŒããã£ãŠããã®ã§ããããšã³ãžãã¢ã§ã¯ãããŸããã ããŒã±ã¿ãŒãšããŠã¹ããŒããã£ã³ãã«å
¥ç€ŸããããŒã±ãã£ã³ã°ã®ææãæå€§åããããã«ãã£ã¬ã¯ã¿ãŒã®ç«å Žã§ãããã¯ãæ¹åãè¡ããã¡ã«éçºããŒã ã®ãããŒãžã£ãŒã«ãªã£ããšããçµæŽã§ãã tech.smartcamp.co.jp éãšã³ãžãã¢ããšã³ãžãã¢ã®ãããžã¡ã³ããããã«ã¯ãšã³ãžãã¢ã«ã€ããŠåŠã°ãªããŠã¯ãããªãããšãå€ã
ãããŸãããç§ãè²ã
ãšåŠãã§ããæ¬ã®äžã§ã ç¹ã«åœ¹ã«ç«ã£ãæžç± ã玹ä»ããŠããããšæããŸãã ãUNIXãšããèãæ¹ã ãã®æ¬ããªã¹ã¹ã¡ãã察象è
ãšèªãã¡ãªãã ãã®æ¬ãèªãã èæ¯ æ¬ã®å
å®¹ã»æ§æã»èªã¿ããã ç§èŠç¹ã§åŠã³ã«ãªã£ããã€ã³ã3ç¹ â ãã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ã â¡å€§ããªäžãŸãšãŸããã€ããããããåè§£ããå°ããªã·ã¹ãã ã飿ºãããã»ããå¿çšããã â¢ã§ããã ãæ©ã詊äœãäœæãã ãã®æ¬ãèªãã§åœ¹ç«ã£ãäº ãŸãšã ãUNIXãšããèãæ¹ã ãã®æ¬ããªã¹ã¹ã¡ãã察象è
ãšèªãã¡ãªãã ä»åã玹ä»ããæ¬ã¯ãç§ã®ãããªãããŒãžã£ãŒã ãã§ã¯ãªãã ãšã³ãžãã¢ãšäžç·ã«ä»äºããã人 ãªãèªãã§ã¿ããšãšãŠãåèã«ãªãæ¬ã ãšæããŸãã ãµãã¿ã€ãã«ã«ããéããUNIXã®èšèšææ³ãšå²åŠã«ã€ããŠè§£èª¬ããæ¬ãªã®ã§ç¹å®ã®OSã«ã€ããŠèªã£ããã®ã§ã¯ããã®ã§ãããããã«ã¯è¯ãããã°ã©ã ãšã¯ã©ããããã®ãªã®ããšããäºãªã©ãããã°ã©ãã³ã°ã«ã€ããŠã®æ¬è³ªãæžãããŠããããã«æããŸãã ãããã®å
容ã¯ãšã³ãžãã¢ã®èãæ¹ãçè§£ããã®ã«äžåœ¹è²·ããšæããŸãããæ³ååãèšããŸããŠå¿çšããã°ããšã³ãžãã¢ã§ãªããŠãèªåèªèº«ã®æ¥åã®æ¹åã«åœ¹ã«ç«ã€èŠçŽ ãå€ãèŠã€ãããšæããŸãã åãã¯1cmãªããããã§140ããŒãžçšã®èªã¿ãããããªã¥ãŒã ã®æ¬ãªã®ã§ããã²èªãã§ã¿ãŠãã ããã ãã®æ¬ãèªãã èæ¯ ãã®æ¬ã¯ãåŒç€Ÿã®ãšã³ãžãã¢ããŒã ã®ã¡ã³ããŒã«å§ããããŠèªã¿ãŸããã ç§ã倧奜ããªçµå¶è
ã«ããã¹ãã°ã«ãŒãã®ç€Ÿé·ããããŠããäžæå¡ãšããæ¹ãããŸãããã®æ¹ã®æžç±ã®ãªãã§ãäºæ¥çµç¹ã¯ãªãã¹ãå°ããããã¹ããšããæå³åãã§ãã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ããšããèšèãèªãããŠããŸããããã®è©±ãããŠããæã«ãã®æ¬ã玹ä»ãããŸããã ããšã³ãžãã¢ãåãèããéèŠèŠããŠããããšããæèã§ããã®è©³çŽ°ãæžãããæ¬ãšããŠæããŠããããŸããã æ¬ã®å
å®¹ã»æ§æã»èªã¿ããã ãã®æ¬ã§ã¯ãäžã§ç޹ä»ãããã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ãã ãã§ã¯ãªããããã°ã©ãã³ã°ã®æ ¹å¹¹ã«ãªããããªèãæ¹ãæ§ã
玹ä»ãããŠããŸãã æ¬ã®æ§æã¯ããŸãåé ã§äž»èŠãªé
ç®ã®æŠèŠã®èª¬æããããæ¬¡ã®ç« ããé
ç®ã®ããããã«ã€ããŠè©³ãã玹ä»ããŠãã圢ã«ãªã£ãŠããŸãã å
容ãšããŠã¯ãUNIXã®èãæ¹ãšããŠãæçŸ©ã«ã广µããããšè¡šçŸãããçšéèŠèŠããã9ã€ã®é
ç®ãšããUNIXæåã®äžç¿Œãæ
ã£ãŠããããšè¡šçŸããã人ã«ãã£ãŠã¯éèŠåºŠã«å·®ãã§ããã®ã®éèŠãšèããããŠãã10é
ç®ããããŸãããããã®é
ç®ïŒã€ïŒã€ã«ã€ããŠãç« ãã»ã¯ã·ã§ã³ãåããªãã詳现ã«èª¬æããããŠãããŸãã æåŸã«ã¯ãã®ä»ã®OSã®ææ³ã«ã€ããŠã®èª¬æããããŸãã ãã®ã»ãã·ã§ã³ãããããšã«ãã£ãŠãçžå¯Ÿçã«UNIXã«ã€ããŠèããäºãã§ããæ§æã«ãªã£ãŠããŠãéåžžã«ããããããã§ãããè峿·±ãæããŸããã æ§æã¯éåžžã«ããããããã§ãããæç« ãèè
ã®çµéšã«åºã¥ãäºäŸã亀ããªãããã©ã³ã¯ã«èªãããŠããå°è±¡ã§ãè©è匵ããèªãäºãã§ãããšæããŸãã ç§èŠç¹ã§åŠã³ã«ãªã£ããã€ã³ã3ç¹ â ãã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ã åé ã§äžæãããäºæ¥çµç¹ã«ã€ããŠåãããšãèšã£ãŠãããšãã話ãããŸãããããã®æ¬ãèªãã§ããã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ãã¯ççã ãªãšåèªèããŸããã å°ããåè§£ããŠèãåããäºã¯ããŒã±ã®ã¿ã¹ã¯ã§ãå¿çšå¯èœã§ãã äŸãã°EFO(å
¥åãã©ãŒã æé©å)ã®ããã®ABãã¹ãããããšãããã©ãŒã ã®é
眮ã®åé¡ããã©ãŒã ã®å
¥åè£å©ã®åé¡ãèªå°æèšã®åé¡ãèæ¯è²ã®åé¡ãªã©åãåããŠãã¹ããããšãã©ã®é
ç®ãã©ãã ã圱é¿ãäžããããæç¢ºã«ãããæ¹åPDCAãåãããããªããŸãã äœãæœçãèããæã«ãæå°åäœã«åè§£ã§ããŠãããïŒãšèããäº ã¯æœçã®ç²ŸåºŠããããã®ã«è²¢ç®ããŠãããŸãã â¡å€§ããªäžãŸãšãŸããã€ããããããåè§£ããå°ããªã·ã¹ãã ã飿ºãããã»ããå¿çšããã ã¹ã¢ãŒã«ã»ã€ãºã»ãã¥ãŒãã£ãã«ã«é¢é£ããå
容ã§ã¯ãããŸããã å°ããªåäœã§äœããšçµã¿åããã§ããããªäºãã§ãã ãšããã®ãççã ãªãšæããŸãããã®å
容ã¯ããªããšãªãããã ãšæã£ãŠãããã®ãèšèªåãããæèŠã§ããã ç§ã§ãããšããã¯KPIãã¡ã³ããŒæ¯ã«æ¯ãåããŠããæã®èãæ¹ã«è¿ããšæããŸãã倧ãããã£ãããã¿ããªã§ãã®KPIããããã¿ãããªèšå®ãããŠããŸããšã圹å²åæ
ãäžæç¢ºã§ã¡ã³ããŒãåãã ããããªãã£ãããçµãã£ãæã«è©äŸ¡ãã§ããªããšããåé¡ããããŸãã KPIãé©åã«åè§£ãããã®KPIã远ã人ãçµæãã³ã³ãããŒã«ã§ããåäœã«ããããšãéèŠã§ãããã®ããKPIèšèšæã«äžèšã®èãæ¹ããã£ãŠãããšãããã·ã£ãŒãã«èšèšãã§ãããšæããŸãã â¢ã§ããã ãæ©ã詊äœãäœæãã ãªãŒã³ã¹ã¿ãŒãã¢ãããªã©ã®æžç±ã«ãã£ãŠãä»ãã¢ãŒãªãŒãªãªãŒã¹ã®éèŠæ§ã¯å€ãã®äººãèªèããŠããç¶æ
ã ãšæããŸãããæ°å幎åã«æ¢ã«ãããèšèšææ³ãšããŠå®çããŠããäºã¯é©ãã¹ãäºã ãšæããŸããã é·ãçãæ®ã£ãŠãããã®ã®æ ¹æ¬ææ³ã¯ãã¯ãåªããŠããïŒå
ããã£ãŠããïŒãšæããããŠããããããããã®ããåŠã¶äºã®éèŠæ§ãåèªèãããŠãããŸããã ã§ããã ãæ©ã詊äœãäœæããäºèªäœã¯ç§ã¯åžžã«åãçµãã§ãããªããšãããªãäºã§ãããã¿ã€ãã³ã°ã«ãã£ãŠã¯åŸ¹åºã§ããŠãªãäºããããŸãããã®ä»¶ã«ã€ããŠã¯ãã£ãããšæèããåŒãç¶ããã£ãŠãããããšæããŸãã ãã®æ¬ãèªãã§åœ¹ç«ã£ãäº ãšã³ãžãã¢ãçè§£ãããšããæ¹åã§åœ¹ç«ã£ãäºãšããŠã¯ãã ãšã³ãžãã¢ã®é ã®äžãã©ããªã£ãŠããã ããæ³åãããããªã£ãäºããããŸãã æ¥ã
ã®äŒè©±ã®ãªãã§ããèŠçŽ ãå°ããåè§£ããŠããã ãªããšãããéå»ã®ããã°ã©ã ãçµã¿åãããŠæŽ»çšããäºãèããŠãããã ãªããšãããæ³åãã€ããããããèšããããéããšããç¶æ
ãäœãšãªãæ³åã§ãããããŠããã®æ¬ãèªãã ããšã§ããã³ããã¥ã±ãŒã·ã§ã³ããšãããããªã£ããšæããŸãã ãŸããªãã¡ã¯ã¿ãªã³ã°ã®éèŠæ§ã䟡å€ã«ã€ããŠããçè§£ã§ããããã«ãªãã®ã§ããã®å·¥æ°ãåããããšãããšã³ãžãã¢ã®èŠæ±ã«ã€ããŠãåççã«çè§£ã§ãããªã©ããŠããŸãã æ ¹æ¬ææ³ãçè§£ããããšãã§ãããšã倧æ äœãæ£ãããŠäœãééã£ãŠãããã倿ã§ããããã«ãªãããã®ã¬ã€ã€ãŒã§ã¯ å
±éèªèãæã€ããšãã§ããŸã ãããã«ããã¡ãªããã¯ããªã倧ãããšæããŠããŸãã ãŸãšã ãã®æ¬ã¯ããšã³ãžãã¢ã®èãæ¹ã«ã€ããŠçè§£ããäžã§éåžžã«åœ¹ã«ç«ã€æ¬ã§ãã ãŸãæŠå¿µãå¿çšããããšã§ãç§ã§ããã°ããŒã±ãã£ã³ã°ãªã©ããšã³ãžãã¢ãªã³ã°ä»¥å€ã®æ¥åã«åœ¹ç«ãŠãäºãã§ãããšæããŸãã ãšã³ãžãã¢ãçè§£ããäžã§ãããèªèº«ã®ä»äºã®äžã§ãå®çšçãªæ¬ã ãšæãã®ã§ããã²äžèªãããäºãããããããŸãã
ããã«ã¡ã¯ã ã¹ããŒããã£ã³ã ãã¶ã€ããŒã®é«æŸã§ãã ç§ã¯ä»å¹Žã®1æããã¹ããŒããã£ã³ãã«ãã¶ã€ããŒãšããŠå
¥ç€Ÿããã®ã§ããããããã¯ãéšéã®ãšã³ãžãã¢ããŒã ã«æå±ããŠããŸãã åŒç€Ÿã«ã¯ãã¶ã€ã³éšçœ²ããªããšããã®ãçç±ã®1ã€ã§ãããç§ã®æ¥åã®ååã¯éçºãå¿
èŠãšãªãããšãäž»ãªçç±ã§ãã ããããå
¥ç€Ÿããåœæãå®åã§ã® ç§ã®éçºçµéšã¯0ã«çããç¶æ
ã§ããã ãã®èšäºã§ã¯ãéçºçµéš0ããåºçºãããã¶ã€ããŒãããšã³ãžãã¢ããŒã ã«ããå幎ã§èº«ã«ã€ããããšãããããããªãã£ãããšãªã©ãæžããŠããããšæããŸãã 䌌ããããªå¢éã«ããæ¹ã®åèã«ãªãã°å¹žãã§ãã ãããããš0å°ç¹ããã®åºçº èªåã®çæ³ãšã®ã£ãã èªåã®çæ³ çæ³ãšçŸå®ã®ã®ã£ãã åããŠèŠãRuby on Rails ãã¶ã€ã³ / éçºç°å¢ãå€åããŠãã ãªã«ãããããªãã®ããããããªãç¶æ
ãã£ãããš å幎ã§åŸãåŠã³ ãã£ãŠããã£ãããš ãšã³ãžãã¢ã«åŠç¿å
容ã®çžè«ã«ã®ã£ãŠããã ãã¢ãããããŠããã æ¹åç¹ ãã£ãããåŸãŠããå匷ãã æ¥åæéå€ã®åŠç¿æéãåœãŠã«ããããªã åšå²ã«å©ããããå幎é ãããããš0å°ç¹ããã®åºçº ãããªãã®åçœã§ãããç§ã¯ãæªçµéšæ ãã®ãã¶ã€ããŒãšããŠã¹ããŒããã£ã³ãã«å
¥ç€ŸããŸããã åè·ã§ã¯æåŸã®3ã¶æã»ã©ãã¶ã€ã³æ¥åã«æºãã£ãŠããã®ã§ããèªåãã¡ã€ã³ã®ä»äºãšãããã£ãWebãã¶ã€ã³ã«æºããããã£ã³ã¹ãå°ãªããè»¢è·æŽ»åãå§ããããšãã¹ããŒããã£ã³ããšåºäŒãããã£ããã«ãªã£ãŠããŸããã€ãŸãã éçºã©ããããã¶ã€ã³çµéšãããªãæµ
ããšããããã®åºçº ã§ããã å
¥ç€Ÿåã«ããã€ãã®ãµãŒãã¹ã䜿ã£ãŠåŠãã§ã¿ãããšã®èªåã®ã¹ãã«ã¯ä»¥äžã®ãããªç¶æ
ã§ããã ãã¶ã€ã³çµéš å®å è³æãã¶ã€ã³ çŽé¢ãã¶ã€ã³ / ãªãŒãã¬ãã / ãã³ãã¬ãããªã©ã®ç€Ÿã®è²©ä¿ç©ã®ãã¶ã€ã³ ãããŒå¶äœ æ°æ¬ LPãã¶ã€ã³ 1æ¬ ä» ç°¡åãªãµã€ãã®ãã¶ã€ã³ãšã³ãŒãã£ã³ã°äœæ¥ Daily UI ãªã©ã§å人æŒç¿ããã㮠䜿çšå¯èœãªããŒã« Photoshop / Illustrator / XD ã®åºæ¬çãªæäœ éçºãŸããã®çµéš ã³ãŒãã£ã³ã° Progate ã®HTML/CSS/Sassã1åšãã HTML/CSS ã®åºç€çãªåŠç¿æ¬ã1åãã£ãŠã¿ã èªèº«ããã¶ã€ã³ããç°¡åãªãµã€ãã®ã³ãŒãã£ã³ã°äœæ¥ NewsPicks ã®ã¯ã€ã€ãŒãèµ·ãããŠãã¬ãŒã¹ããŠã¿ã Github èªåãæžããã³ãŒãã管çããããã«äœ¿çš addâcommitâpushâpull ããããšãšãbranchãåãããšãã§ããããã ããŒã ã§ã®éçºçµéšãªãïŒïŒGitã®æå³ãšã¯ã»ã»ïŒïŒ ãšã³ãžãã¢ã®æ¹ã¯ãæ°ã¥ããšæããŸãããéçºããšèšã£ãŠãããªãããããã°ã©ãã³ã°ã¯äžåã§ããªãç¶æ
ã§ããïŒçŸç¶ãã§ããããã§ã¯ãããŸãã...ãïŒ æšä»ãWebãã¶ã€ããŒãšãšã³ãžãã¢ã®å¢ç®ã«ç«ã€äººæãå€ããšèšãããŠããŸããããããªãã€ããŒäººæãªã©ã§ã¯ãªã ã³ãŒãã£ã³ã°ããããåºããåå¿è
ãã¶ã€ã㌠ãšãããããã§ããã èªåã®çæ³ãšã®ã£ãã ãã®ãããªç¶æ
ã ã£ãã®ã§ã身ã«ä»ããªããã°ãªããªãããšã¯å±±ã®ããã«ãããŸããå
¥ç€ŸåŸãæ°é±éãçµéããã¿ã€ãã³ã°ã§èªåã®çæ³ãšã®ã£ãããæŽçããŠã¿ãŸããã èªåã®çæ³ å
¥ç€Ÿåœæãããç§ã®çæ³ã¯ æ°å€ã«è²¢ç®ã§ãããã¶ã€ããŒã«ãªã ããšã§ãã ãã¶ã€ã³ã®ææãšãããã®ã¯å
šãŠãæ°å€ã«çœ®ãæããããããã§ã¯ãããŸããããããã§ãæ°å€ã¯1ã€ã®çµæã ãšæã£ãŠããŸãããã¶ã€ããŒæ¬äººã ãã§ãªããé¢ä¿éšçœ²ãå«ããå
šå¡ãã·ã³ãã«ã«åã¶ããšã®ã§ãããã£ãŒãããã¯ã§ãã ç§ã«ãšã£ãŠWebãã¶ã€ã³ãé
åçãšæããæã倧ããªçç±ã®1ã€ã¯ ãã©ããã³ã°ãã§ãã ããšã«ãããŸãã ã€ãŸãã ãã¶ã€ã³ã®æ°å€çãªãã£ãŒãããã¯ãåŸãããç¹ã§ãã èªç€Ÿãããã¯ããæã€äŒç€Ÿã«ããã°ãæ°å€ãè¶³ãããã«æ©ããµã€ã¯ã«ã§ãã¶ã€ã³æ¹åããçµéšãã§ããã¯ããšèããããšããã¹ããŒããã£ã³ãã«å
¥ç€Ÿã決ããçç±ã®1ã€ã«ãªã£ãŠããŸããã¡ãªã¿ã«å
¥ç€ŸåŸã«æºãã£ããã¶ã€ã³æ¹åæœçã¯ä»¥äžã®ãããªãã®ããããŸããã äŸ ã¬ã€ã¢ãŠã倿Žã«ããäŒå¡ç»é²ãã©ãŒã ã®CVRæ¹å ãããã¢ããå®è£
ãã¬ã€ã¢ãŠã倿Žã«ãããªã¹ãã£ã³ã°LPã®æµå
¥æ¹å ã¡ãã£ã¢èšäºå
ã«èšçœ®ãããŠãããã¿ã³ã®CTRæ¹å çæ³ãšçŸå®ã®ã®ã£ãã çæ³ãæ²ããã®ã¯è¯ãã®ã§ãããæ°å€ãè¶³ãããã«ãã¶ã€ã³ãéçšããããã«ã¯è¶³ããªãã¹ãã«ãå€ããã£ããããå¿
èŠãªããã»ã¹ããã£ãããšæžãåºããŠã¿ãŸããã ããã»ã¹ã ããèŠãã°ã·ã³ãã«ã§ãããããããå®éã«èªåã®æã§è¡ããããã«ãªãã«ã¯ åŠç¿æéãšå埩æ©äŒ ãå¿
èŠã«ãªããŸãã ã§ããããã«ãªã£ãããšã¯åŸã»ã©ãŸãšããŸãããèŠããããããã€ã³ãã«ã€ããŠå
ã«æžãåºããŠã¿ãŸãã åããŠèŠãRuby on Rails ã¹ããŒããã£ã³ã ãéå¶ããŠãã ãã¯ã·ã«SaaS ã¯Ruby on Railsã§å®è£
ãããŠããŸããåããŠãããã¯ããè£åŽããèŠãæ¥ã«ããããšã¯ãèªåããããããHTMLãšCSSã«è©²åœãããã¡ã€ã«ãæ¢ãåœãŠãããšã§ããã Railsã§ã¯ãã¡ã€ã«åãå©çšããŠåŒã³åºããã¡ã€ã«ãšèªã¿èŸŒããã¡ã€ã«ã®é¢ä¿ãæãç«ã€ãªã©ã¢ããªã±ãŒã·ã§ã³äžã®ã«ãŒã«ããããŸãã æ
£ã芪ããã ãšã³ãžãã¢ã«ã¯äŸ¿å©ãªãã®ãåèŠã®è
ã«ã¯çè§£ã§ããªããã©ãã¯ããã¯ã¹ ã«ãªã£ãŠããŸããèªåããã¶ã€ã³ãããã®ãèªåã§å®è£
ããæ¥ã¯æ¬åœã«ããã®ããäžå®ã«ãªã£ãããšãèŠããŠããŸãã çŸåšã¯èŠãã¹ããã¡ã€ã«ãçµã£ãŠãšã³ãžãã¢ã«æããŠãããããšã§ãèªåã®æ¥åã«å¿
èŠãªéšåãåŸã
ã«å匷ããããšãã§ããããã«ãªããŸããã ãã¶ã€ã³ / éçºç°å¢ãå€åããŠãã äŸãã°ãå¶äœããåæãŸã§ã®ããã»ã¹ãèªåãæ
£ã芪ããã ããŒã«ã®ã¿ã§å®çµããããšãã§ããã°ã远å ã§åŠç¿ããªããã°ãããªãããšã¯æå°éã«æããããŸãã äžæ¹ã§ãå¶äœããŒã«ãªã©ã転è·ããã£ããã«å€æŽããå¿
èŠããã£ãå Žåã1ã€ã®ããã»ã¹ãå®äºãããã«ã¯ ããŒã«ã«æ
£ãããšããããå§ãã å¿
èŠããããŸããã ç§ã®å Žåã®ãéå»ãšçŸåšã®äœæ¥ç°å¢ã®å€åãæ¯èŒãããšãã®ããã«ãªããŸãã éå» çŸåš ãã¶ã€ã³ Adobe Figma+Adobe ã³ãŒãã£ã³ã° HTML / CSS Slim / Sass ãã¹ãå®è£
Google Optimize Splitâ» åæ ããŒããŒã¿ããExcelã§æåœ¢ ã¯ãšãªãæžããŠredashããåãåºã â»Split ... Ruby on Railsäžã§åãããABãã¹ãããŒã« åŠç¿èšç»ãç«ãŠããšãã¯å
容ã«ç®ãè¡ããã¡ã§ããããããã£ã ç°å¢ã®å€åãªã©ãå å³ããŠèšç»ãç«ãŠãã¹ãã ã£ã ãšä»ã«ããŠæããŸãã ãªã«ãããããªãã®ããããããªãç¶æ
ãéçºãããããšããå
šãåå°åã®ãªãé åã§ã¯ã ä»èªåããªã«ã«ã€ãŸã¥ããŠããã®ããææ¡ããããšãé£ãã ã§ããèªåã蟿ãã¹ãéãèŠã€ããŠãããã»ã¹ãçµã¿ç«ãŠãããããã«ãªãããã«ãåãã¯äººã®é ãåããå¿
èŠããããŸããã ãã®ãšãã«ãäžæã«ããã»ã¹ãçµã¿ç«ãŠãŠããããã ãèªåããªã«ãããããšããŠããã®ãã ãæç¢ºã«ããŠæ©ã段éã§äººã«ãã³ãããããããšã倧äºã ãšåŠã³ãŸããã ãã¡ããèªåã§ç«ãŠã仮説ãç¡é§ã«ã¯ãªããªãã®ã§ã èªåã®é ã§ç°¡åã«ãã©ã³Aãçµã¿ç«ãŠãæ¬æ¥ã®ãšã³ãžãã¢ã«ãã©ã³Bãç«ãŠãŠããã ãšãè¶³ããªãã£ãèããèªåãããŠãã¹ãã«ã§ä»£æ¿å¯èœãªããã»ã¹ãªã©ãç
§ããåãããããšãã§ããŸãã ãã£ãããš ãããã£ãäºå®å€ã®äºæ
ãæ°ã¥ããåŸãªãããå幎éãšã³ãžãã¢ããŒã ã®ãã¶ã€ããŒãšããŠå¶äœ/宿œãããã®ãåæããŠã¿ãŸãã ã³ãŒãã£ã³ã°ãå«ããLPã®å¶äœ Railsã¢ããªã±ãŒã·ã§ã³ã§åããããã¯ãã«ãåçã«å
容ãå€ããããŒãžãæ°èšãã æ€èšŒãããã¶ã€ã³ã®å¶äœãå®è£
Railsäžã§åãABãã¹ãããŒã«ïŒSplitïŒã䜿ã£ãããã¹ãã®èšå® Figma ã STUDIO ãªã©ãæ°ããããŒã«ã䜿ã£ããã¶ã€ã³/ éçº ãããã®å¶äœã¯ããã äœãã°ã§ãããããã§ã¯ãªãã¯ãªãªãã£ãäžããŠããå¿
èŠãããã®ã§ããŸã ãŸã è¯ãå質ã®ãã®ãäœããããã«ãªã£ããšã¯èšããŸããã ãŸããåå Žé¢ã§å¿
èŠãšãªãããã°ã©ã ãã¯ãšãªãªã©ã¯ãšã³ãžãã¢ã«æžããŠããããªã©ã èªåã«ã§ããªããšæç¢ºã«ããããã®ã¯åãåºããŠãååãä»°ãã§å¶äœããŠããŸãã å幎ã§åŸãåŠã³ æªã ã«å€§ããä»äºã1人ã§å®éããããšã¯é£ããã§ãããåç« ã®ãã§ããããã«ãªã£ãããšãã¯å幎åã®èªåã«ã¯ç¢ºå®ã«ã§ããªãã£ãããšã§ãã ããããäžæ¹ã§ ãããã®äœåŸã¯ç¡çã ...ãããå°ãæé·ããŠããã®ç®æšã«ããã...ãã ãšãªã£ããã®ããããŸãã ãã®ãããªå€æãå«ããŠå幎éã§ ããã£ãŠããã£ãããšããšãæ¹åç¹ã ã4ã€ã»ã©æããŠã¿ãŸããèªåãšäŒŒãå¢éã®äººã®äžå©ã«ãªãã°å¬ãããªãšæããŸãã ãã£ãŠããã£ãããš ãšã³ãžãã¢ã«åŠç¿å
容ã®çžè«ã«ã®ã£ãŠããã ãªãããçæ³åãæ±ºãŸã£ãåŸã身ã«ã€ããã¹ãã¹ãã«ããªã¹ãã¢ããããŠäœäººãã®ãšã³ãžãã¢ã«èŠãŠããããŸãããä»ã§ã¯æ¥ããããéãã§ãããRailsãçè§£ããŠæžããããã«ãªãããšãã£ã倧ããããç®æšãããã«ã¯å«ãŸããŠããŸããã èŠäžããŠããå±±ã倧ããããŠé äžãèŠãããé«ãããç®æšãæžããŠãããšæããŸãã 1人ã®ãšã³ãžãã¢ã«ã¯ã£ãããš ãçæç®æšã«æ²ããã®ã¯ç¡çã ãšæããããã¯ãªãããã ã説æããŠãããã èªåãããããããšã®é£æåºŠãšå·¥æ°ãäžç·ã«èŠç©ãã£ãŠããããŸããã ããã«ãæ¥åã§ã®æŽ»çšé »åºŠãåãããŠåªå
é äœã®æŽçãããŠããããèªåãã¯ããã«äœãã§ããããã«ãªãã¹ãããæŽçããããšãã§ããŸããã ãã¢ãããããŠããã ãµã€ãTOPã®ãããªç¹°ãè¿ãã®èŠçŽ ãå€ãããŒãžãå®è£
ãããšãããã®åŠçãè¡ãã³ãŒãããšã³ãžãã¢ã«æžããŠããã£ãããšããããŸãããã®ãšãã«åããŠãã¢ãããããŠããã£ãã®ã§ããã ã©ã®ãããªä»çµã¿ã§åŠçãè¡ãã説æãèããªããæžããŠããããšãæ Œæ®µã«çè§£ãæ·±ãŸããŸãã 説æãããŠãããéçšã§ãããããã£ãŠãªãã£ããã©ããããã®ã³ãŒãã¯ããããæå³ã ã£ãã®ã...ïŒããªã© å¯ç£ç© ãå€ãåŸãããšãã§ããŸããå人ã§ããæ¬ãã«ãªãã¥ã©ã ãéããŠäœç³»çãªå匷ãããããšã¯ã§ãããããããŸããããå®åã§åºãŠããã³ãŒãã®çè§£ã«ã¯äººã®èª¬æãåããããšããéçºå Žé¢ã«ãããŠãéèŠãªãã ãª...ïŒå°äžŠïŒãšæããŸããã ãã¶ã€ããŒããããŸã§ã³ãŒããçè§£ãããŠããå¿
èŠãããã®ãè³åŠã¯ãããšæããŸãããéçºãããªããã¶ã€ããŒã«ãšã£ãŠãã³ãŒããçè§£ããŠããããšã«ã¯ã¡ãªããããããšæããŸãã ãã¶ã€ããŒã¯æåŸãŸã§ä¿®æ£ããããçãç©ã§ãã éçºãå®äºããããšã«ãä¿®æ£ããããã©ã³ãŒãããã¯ãæå·ããšããç¶æ
ãåé¿ãããç®æã¯ããã¢ããã§äžç·ã«äœã£ãŠãããããšã§äºåã«çè§£ãæ·±ããŠãããšããããšããæã«ãµãµããšçŽãããããŸãã æ¹åç¹ ãã£ãããåŸãŠããå匷ãã ã§ããªãããšãè€æ°ææ¡ã§ããŠããå Žåãåæå¹³è¡ã§åŠç¿ãé²ããããšããããæ°ããæè¡ã®äœ¿çšå Žé¢ãããåã«å匷ãããŠãããããšããæ°ãåããŠããã®ã§ãããããã¯ çµæçã«å¹çãæªãæ¹æ³ã«ãªã£ãŠããŸããŸããã å人çã«ãæè¡ã身ã«çããã«ã¯ã€ã³ãããããåŠç¿æéãšå埩緎ç¿ãéèŠã ãšèããŠããã®ã§ããã å®åã§ã®å埩緎ç¿ãã§ããªãã€ã³ãããã¯æ¬¡ã®ã€ã³ãããã«æŒãããããŠæãèœã¡ãŠããŸããŸãã å¿
èŠä»¥äžã«å
åããããããšããããç¶²çŸ
çãªçè§£ãåªå
ããããšããã åŠç¿ã®å¿
èŠãçãŸããå Žé¢ã§å¿
èŠãªããšã ããã€ã³ãããããååŸ©ã®æ©äŒãæ¥åäžã«æã€ ããšãäžçªå¹çã®è¯ãããæ¹ã ã£ãããã«æããŸãã æ¥åæéå€ã®åŠç¿æéãåœãŠã«ããããªã åŠç¿èšç»ãç«ãŠãŠããé ã¯ãæ¥åæéå€ãäŒæ¥ã«å匷ããããïŒãšèããŠããã®ã§ãããæéã®ãªããŸãŸåªåãç¶ããããšã¯èªåã«ã¯äžåãã§ããã ãã§ããªãããšããšãã倧ããå±±ãåã厩ãã«ã¯ ãé·æçã«å°ããã€åŠç¿ãç¶ç¶ãããããçæéã§äžæ°ã«1ã€ãåŠç¿ãããããªã©ã®ããŒã¹é
å ãæèãã¹ãã ã£ããªãšæããŸãã æ¥ã
ã®æ¥åäžã§ããã§ããªãããš / ããããªãããšãã«å¯Ÿå³ããŠããäžã§ãæ¥ååŸãäŒæ¥ãåãããšãç¹°ãè¿ããŠãããšããæ°ãšå¹çãäœäžããŠããŸããŸãã æ¬¡ã®å幎ã¯ããã©ã€ããŒããªæéãåœãŠã«ããã®ã§ã¯ãªããæ¥åæéãéããŠããã«å¹çè¯ãã€ã³ãããããŠå埩ããæéãæãŠããããèããããã«ã·ããããããšæããŸãã åšå²ã«å©ããããå幎é é·ã
ãšæžããŠããŸããŸããããå幎éãã¶ã€ã³ãšéçºæ¥åã«é¢ãã£ãŠããäžã§å€ãã®ããšãçµéšãããŠããããŸããããã®äžã§ã®çºèŠãåçããèšäºãèªãã§ãããæ¹ã®ã圹ã«å°ãã§ãç«ã£ãŠããã°å¹žãã§ãã éçºæªçµéšãã€ãã¶ã€ããŒã§ããèªåããéçºããŒã ã®1人ãšããŠå€ãã®æ¥åã«æºãããŠããã®ã¯ããšã³ãžãã¢ãã¯ãããšããåšãã®ååçãªç€Ÿå¡ã®ãããã§ããããŸãã瀟å¡å士ã®é£æºããã©ããªè³ªåãåãå
¥ããŠããããšæããç°å¢ããã£ãŠãããå®åãéããŠã®åŠç¿ãšããã®ã¯æãç«ã€ãã®ã ãšããã£ãå幎ã§ããã ãã®èšäºãèªãã§ãã ãã£ãæ¹ãå°ãã§ãã¹ããŒããã£ã³ãã«èå³ãæã£ãŠãã ããã°å¬ããã§ãïŒ smartcamp.co.jp ã¹ããŒããã£ã³ãæ ªåŒäŒç€Ÿã«ã¯ãã¶ã€ã³ããã°ããããŸãã®ã§ããã²ãã¡ãããã§ãã¯ããŠãã ããïŒâââââ note.mu
ã¹ããŒããã£ã³ãã§ããŒã±ã¿ãŒãããŠããäœã
æšã§ãã æè¿ã¯èªè²©æ©ã§ãããããã«ã賌å
¥ããããšã«ããã£ãŠããŸãã ç§ã¯åŒç€Ÿã®éå¶ããè³æè«æ±ãµã€ãããã¯ã·ã«ãã®ãããã³ã°æé©åãçæ¥ãšããŠçããŠããã®ã§ããã远ãã¹ãKPIã»å¯èŠåããããŒã¿ã®å
±æã«ã¯ã¹ãã¬ããã·ãŒãã奜ãã§äœ¿ã£ãŠããŸãã SQLã§åãåºããããŒã¿ã§ããã°Re:dashã§å
±æããã®ãã©ã€ããªã®ã§ããã SQLã§ãšã£ãŠãããã®ä»¥å€ã®ããŒã¿ãäžæãçµã¿åãããããªã æ§ã
ãªã¢ã¬ã«ã®ãŒåå¿ãèµ·ãã人ãããïŒè±èªUIããã¡ãªäººãã¯ãšãªèŠããšååãã¡ãã人etc...ïŒ æš©é管çãå€§å€ ãªã©ããã·ã¥ããŒããšããŠå©çšããŠããã«ããã£ãŠãç¹ã«éãšã³ãžãã¢ã«æµžéãã¥ãããšããã®ããããŸãã ããã§ã¹ãã¬ããã·ãŒããããã·ã¥ããŒããšããŠæŽ»çšããŠããæ¹æ³ã玹ä»ããããšæããŸãã æŠèŠ ããŒã«ããšã®åœ¹å²åæ
䜿ã£ãæè¡ æµã å
šäœ 1. Re:dashã§ã¯ãšãªäœæ 2. Re:dashã®ã¯ãšãªå®è¡é »åºŠèšå® 3. Re:dashã§APIååŸ&ã¹ãã¬ããã·ãŒãã§ importdata 颿°ããã 4. ã·ãŒããéãoræŽæ°ãããã³ã«APIãå®è¡ããææ°ã®ããŒã¿ãåæ ãããããã®GASãäœæ GASã®å®è£
æ¹æ³ ä»åæžããGAS è£è¶³ ãŸãšã æŠèŠ Re:dashã®APIãšã¹ãã¬ããã·ãŒãã®importdata颿°ãå©çšããããšã§ã·ãŒãã«ææ°ã®ããŒã¿ãåæ ã§ããŸãã ããŒã«ããšã®åœ¹å²åæ
ã»ããŒã¿ã®æœåºâRe:dash ã»ããŒã¿ã®å å·¥ã»ããžã¥ã¢ã©ã€ãºâã¹ãã¬ããã·ãŒã 䜿ã£ãæè¡ ããŒã¿ã®æœåº SQLïŒGoogle BigqueryïŒ ã¯ãšãªã®å®æå®è¡ Re:dash API Re:dash APIã®å®æå®è¡ Google App Script æµã å
šäœ Re:dashã§ã¯ãšãªäœæ Re:dashã®ã¯ãšãªå®è¡é »åºŠèšå® Re:dashã§APIååŸ&ã¹ãã¬ããã·ãŒãã§ importdata 颿°ããã ã·ãŒããéãoræŽæ°ãããã³ã«APIãå®è¡ããææ°ã®ããŒã¿ãåæ ãããããã®GASãäœæ 1. Re:dashã§ã¯ãšãªäœæ 2. Re:dashã®ã¯ãšãªå®è¡é »åºŠèšå® 3. Re:dashã§APIååŸ&ã¹ãã¬ããã·ãŒãã§ importdata 颿°ããã âãããªæãã§Re:dashã§åºåããããŒã¿ãã¹ãã¬ããã·ãŒãã«è¡šç€ºãããŸãã 4. ã·ãŒããéãoræŽæ°ãããã³ã«APIãå®è¡ããææ°ã®ããŒã¿ãåæ ãããããã®GASãäœæ GASïŒGoogle App ScriptïŒãšã¯ãã¹ãã¬ããã·ãŒãããã©ãŒã ãã«ã¬ã³ããŒãªã©Googleã®ãµãŒãã¹ãã«ã¹ã¿ãã€ãºããããã®èšèªã§JavaScriptãããŒã¹ãšãããŠããŸããG suiteãå°å
¥ããŠããäŒæ¥ã§ããã°ãæ¥åæ¹åã«ã圹ç«ã¡ãŸãã GASã®å®è£
æ¹æ³ ä»åæžããGAS ããããããš=åžžã«ææ°ã®ããŒã¿ãèŠããããã«ããã èŠä»¶ ã·ãŒããéããã³ã«Re:dashã®APIãå®è¡ ãªããŒããããRe:dashã®APIãå®è¡ var configs = [ { //ããã§ã·ãŒããæå® "sheetName": "ã·ãŒã1", //importdataãèšè¿°ããã»ã«ãæå® "cell": "A2", //ããã«å
çšimportdataã§äœ¿ã£ãã®ãšåãurlãããã "url": "http://redash.xxx/api/queries/xxx/results.csv?api_key=~~~~~~~" }, /* äžã®ãããªåœ¢åŒã§èšå®ãã«ã³ãã§åºåã£ãŠè¿œå ããŠä¿åããã°ãåæ ãããŸã(è²ããªãšããã®ã«ã³ãã¯å¿ããã¡ãªã®ã§æ°ãã€ããŠãã ãã) , { "sheetName": "", "cell": "", "url": "" } */ ]; // ãã¡ã€ã«ãéããã or ãã©ãŠã¶ãæŽæ°ããããšãã«å®è¡ããã颿° function onOpen() { // äžã§èšå®ããconfigsã®ãããã(forEach)ã®configãå
ã«setImportRedash颿°ãå®è¡ãã configs.forEach(function(config){ setImportRedash(config.sheetName, config.cell, config.url); }); } // ãã·ãŒãåãã»ã«çªå·ãredashã®URLã ãåãåã£ãŠã»ã«(redashããåã£ãŠããããŒã¿)ãæŽæ°ãã颿° function setImportRedash(sheetName, cell, url) { var timestamp = Utilities.formatDate(new Date(), "JST", "yyyyMMddHHmmss") var formula = Utilities.formatString('=IMPORTDATA("%s&seed=%s")', url, timestamp) SpreadsheetApp .getActiveSpreadsheet() .getSheetByName(sheetName) .getRange(cell) .setValue(formula); } è£è¶³ ãããªæãã§è¡šç€ºãããŠããããŒã¿ãããšã«ããããããŒãã«ãçµãã ãã äŸãã°ãããªæãã®æ
åœå¶æ¥ãªã¹ããšããäœã£ãŠ ãããªæãã§ vlookup 颿°ã䜿ã£ãããã§ããŸãã ãŸãšã ãããã§ãããïŒ ã¹ãã¬ããã·ãŒãã® importdata颿° ã¯Re:dash以å€ã§ãAPIãçšæãããŠãããµãŒãã¹ã§ããã°å¿çšãããã®ã§ã ãããŒã«ã瀟å
ã§å®çããªããïŒããšæ©ãã§ããæ¹ã¯æ¯é詊ããŠããã ããã°ãšæããŸãã
ãšã³ãžãã¢ã®ç¬¹åã§ãã 笹 ã奜ç©ã®ãã³ãããããã£ãŠ ãã³ãã ãšåŒã°ããŠããŸãã çããã¯Gitã®ãªã¢ãŒããªããžããªãšããŠäœã䜿ã£ãŠãŸããïŒåŒç€Ÿã§ã¯GitHubã䜿ã£ãŠããŸãïŒ GitHubã¯ããèªäœã®äœ¿ããããã¯ãã¡ããã§ãããåçš®ããŒã«ãšã®é£æºã®ãããããèªåã§GitHub Appsãäœã£ããMarketplaceã䜿ã£ããããããšã§ã®æ¡åŒµæ§ã®é«ããé
åã§ãããïŒïŒ å
æãGitHubãPull Pandaãè²·åããããšã§ãPull PandaãæäŸããŠããããŒã«ãç¡åå©çšã§ããããã«ãªããŸããïŒïŒ pullpanda.com ããã§ãå®éã«å°å
¥ãããããŒã玹ä»ããŸãïŒ æŠèŠ å°å
¥æ¹æ³ GitHubã»Slackãšã®é£æº éç¥ã®èšå® å®éã®éç¥ çµããã« æŠèŠ Pull PandaãæäŸããŠããããŒã«ã¯å€§ãã以äžã®3ã€ã«åããããŸã Pull Reminders PRã®ç¶æ
ã«å¿ããŠéç¥ãããŠãããæ©èœ ããŒã ã«å¯ŸããŠSlackã®channelå®ã«é£ã¶éç¥ãšãå人ã«å¯ŸããŠSlackã®DMå®ã«é£ã¶éç¥ããã Pull Analytics PRãããŒãžããããŸã§ã®æéãªã©ãå¯èŠåããŠãããæ©èœ Pull Assigner PRã®ã¬ãã¥ã¯ãŒãèªåçã«å²ãæ¯ã£ãŠãããæ©èœ å°å
¥æ¹æ³ å®éã«Pull Reminderãå°å
¥ããŠã¿ãŸãããïŒ ããŒã±ãããã¬ã€ã¹ãããšPull Pandaã®ããŒãžããã®ã©ã¡ãããã§ãå
¥ããããŸãããä»åã¯Pull Pandaã®ããŒãžããå
¥ããŠã¿ãããšæããŸãã Pull Reminders: Pull request reminders for Slack & GitHub GitHubã»Slackãšã®é£æº Pull Pandaã®ããŒãžã«Add To Slackãã¿ã³ãããã®ã§ãããæŒããŠããŸãã¯Slack飿ºãããŸãã Slackäžã§äžããæš©éã確èªããŠInstallãã¿ã³ãæŒããŸãã æ¬¡ã«å人ã¢ã«ãŠã³ãã®GitHub飿ºãããŸãã GitHubäžã§äžããæš©éã確èªããŠAuthorizeããŸãã Pull Pandaã®GitHub AppsãOrganizationãããã¯ã¢ã«ãŠã³ãã®ã¬ããžããªã«å
¥ããŠãããŸãã 飿ºããOrganizationãã¢ã«ãŠã³ããéžæããŸãã ã©ã®ã¬ããžããªã«å
¥ãããéžæããŸãã ãããŸã§ã§ã飿ºã¯äžæŠå®äºããŸããïŒïŒïŒ éç¥ã®èšå® ããããã¯åçš®èšå®ãããŠãããŸãã ããŒã å®ã®éç¥ãšå人å®ã®éç¥ãããããèšå®ã§ããŸãã Team RemindersãæŒããšãããŒã å®ã®éç¥ãSlackã®ã©ã®channelã«éç¥ãããéžæããããšã«ãªããŸãã 以äžã®ãããªé
ç®ãèšå®ã§ããŸãã éç¥ã®æ¥æ éç¥ããæ¡ä»¶ ã¬ãã¥ãŒã®ç¶æ
ãªããžã㪠PRã®çåæéã»å€æŽãããŠããªãæé ã¿ã€ãã«ãã©ãã«ã§ãã£ã«ã¿ãªã³ã° PRãéãããããããŒãžãããããšèšã£ãã€ãã³ãã®ãã㯠å人å®ã«ã¯ãMy DM SettingãæŒããŠä»¥äžã®ãããªé
ç®ãèšå®ã§ããŸãã ã€ãã³ãããã¯ã®éç¥ ã¬ãã¥ãŒãã¢ãµã€ã³ãããŠããPRã«ã€ããŠã®éç¥ å®éã®éç¥ å®éã®éç¥ãããããèŠãŠã¿ãŸãããã ããŒã å®ã®éç¥ã¯ä»¥äžã®ãããªæ
å ±ãæå®ããæéã«å±ããŸãã - Openã«ãªã£ãŠããPRã®ãªã¹ã - ã©ããããå€ãã®ã - 誰ãã¢ãµã€ã³ãããŠããã å人å®ã®éç¥ã¯ä»¥äžã®ããã«ãæå®ããã€ãã³ããçºçããã¿ã€ãã³ã°ã§ã©ãããã€ãã³ããçºçãããéç¥ããŠãããŸãã çµããã« Pull Remindersã®å°å
¥æ¹æ³ã玹ä»ããŸããããPull PandaãæäŸããŠããããŒã«ã¯ã©ãããPull RequestããŒã¹ã§éçºããŠããããŒã ã«æå¹ãªãã®ã ãšæããŸããã Pull AnalyticsãçšããŠãPull Requestã®éçšç¶æ³ãå¯èŠåããäžã§ããªãªãŒã¹é »åºŠãäžããããšããã¹ãã«ãå¹³æºåããããšèšã£ãããŒã ã®èª²é¡ã«å¿ããŠãPull RemindersãPull Assinerã®èšå®ã倿Žããããããšè¯ãããã§ããïŒïŒ
ãªãã£ã¹ãå€ãããèªåžããçªãçºãããšæ±äº¬ã¿ã¯ãŒãèŠããããã«ãªããŸããã ã¹ããŒããã£ã³ãã®ä»å·ïŒ @ug23_ )ã§ãã 2019幎6æ26æ¥ã«äºåç°.rbã«LTæ ã§åå ããŠããŸããã gotanda-rb.connpass.com èªåå«ãã4åã®æ¹ãçºè¡šããã®ã§ãããã玹ä»ããããšæããŸãã @kutaike1504ãã ãŒããã®ããããããããããã®factory_bot @saiid_kkãã RSpecããªããªãã©ãæžãïŒ @ug23_ æ®ã䟡å€ã®ãããã¹ãèšèš @walkersumidaãã CircleCIã§ docker-composeæåŒ·? é£ã³èŸŒã¿LT @nontak2 ãã AWS Summit 2019è¡ã£ãŠãã æåŸã« @kutaike1504 ãã ãŒããã®ããããããããããã®factory_bot speakerdeck.com RSpecã«äžå¯æ¬ ãªfactory_botã®æ¹åãè¡ã£ãããšããçºè¡šã§ããã letå°ç ããããããããäžçºã§äœæã§ããããã«ãã äžçºã§ãããªããšé¢åã ã£ãã®ã¯èªèšŒåšãã ã£ãã®ã§ãããDIããŠè§£æ±º ã§ãæ¹åã«ã¯ãã¡ããã¡ãæéãããã⊠ã¿ããªã©ãããŠãã®âŠïŒ ãšããæãã§ããã ããŒã ããšã«æ¹éãæ±ºããŠå®ããå€ãããšãã¯äžæ°ã«å€ããããªã©è©Šè¡é¯èª€ããŠãããããªãã®ããªãšããå°è±¡ã§ããã @saiid_kk ãã RSpecããªããªãã©ãæžãïŒ speakerdeck.com èŽè¡åå åã®LTã§ãããRSpecã§ã¿ããªã©ãæžããŠãïŒãšããäºæã«çããªããèããŸãããåèãŸã§ã«ãç§ã®æèŠã¯ä»¥äžã®éãã§ããã Request Specã¯: Controllerããš System Specã¯: ã©ã¡ãã§ããªã Shared Examplesã¯: ããŸã䜿ããªã before/after(:all)ã¯: 䜿ã£ãŠããããšæã NestedGroupã¯: ãŸã ééããŠãªã⊠ãã¹ãããŒã¿ã®å®çŸ©ã¯: ããã©ã«ãå€ãããã¯ãããŠãããã æéã¯: äœã (åŸè¿°) ãã¹ãã®èª¬æã¯: æ¥æ¬èª è€éãªäºåããŒã¿ã¯: beforeã§ãletã§ãå Žåã«ãããã itã¹ã³ãŒãå
ã¯: æè»ã« ãæéäœãïŒæ¢ããïŒãã®è°è«ã«ã€ããŠã¯ãæ¯å Date.today ãªã©ã§çæããã»ããæãã¬ãã°ã«æ°ä»ããå¯èœæ§ãããã®ã§æ¯åã€ãã£ãŠããã®ãããã®ããªãšæã£ãŠãŸãã ç§ããŸã ãããŸã§RSpecæžããŠãªãã®ã§RSpecãããã³ãŒãæžããããã«ç²Ÿé²ããããšæããŸããã @ug23_ æ®ã䟡å€ã®ãããã¹ãèšèš speakerdeck.com ã¹ããŒããã£ã³ãã®ãšã³ãžãã¢ãšããŠåã®ãããªãã¯ãªLTã®ããã§ãããã¡ãªã¿ã«å人ãšããŠãåããŠã§ãããæ¥œããã£ããŒïŒ ãã¹ããšãã€ã³ããããçžæ§ããããšåæã«æã£ãŠããã®ã§åèã«ãªã£ããå¬ããã§ãã @walkersumida ãã CircleCIã§ docker-composeæåŒ·? speakerdeck.com ããŸãèšäºãäžãã£ãŠããªããããã§ãããCircleCIã§æ®éã«docker-composeã䜿ããããã«ãªã£ãïŒãªã£ãŠãïŒïŒãããã§ãã ããŒã«ã«ç°å¢ãšãã¹ãç°å¢ã®å·®åã§ã³ã±ãŠèŠããããšããã€ãã¿ããè§£æ¶ãããããã§ããã ãã®ãŸãŸQiitaã«ãæçš¿ãããŠããŸããã qiita.com é£ã³èŸŒã¿LT @nontak2 ãã AWS Summit 2019è¡ã£ãŠãã é£ã³èŸŒã¿ã§AWS Summitã§èããŠãã話ã話ãããŠããŸããã LTã®äžã§ã¯Railsã«ãããè² è·ãã¹ãããŒã«ã«ã€ããŠè§ŠããŠããŸããããããã«ãRubyistã䜿ãè² è·ãã¹ãããŒã«ã£ãŠãªãã§ããããã ç§ã¯ä»¥åã®èšäºã®éããScalaãæ±ã£ãŠããã®ã§Gatlingã䜿ããã¡ã§ãã tech.smartcamp.co.jp tech.smartcamp.co.jp æåŸã« ä¹
ãã¶ãã«ã³ãã¥ããã£ã€ãã³ãã«åå ããŸããããããããªäººãšè©±ããããæ°ããçºèŠãåºæ¿ããããããã£ãŠããã£ãã§ãããããŠå®æçã«ã¢ãŠããããããã®å€§äºã ãªãšæããŸãã äŒå Žã®Zealsããåã³ãªãŒã¬ãã€ã¶ãŒã® @terry_i_ ããããããšãããããŸããïŒ ã¹ããŒããã£ã³ãã§ã¯RSpecæžããªããéçºããŠããããRailsãšã³ãžãã¢ãåéããŠããŸãã ãã²æ°ãããªãã£ã¹ã«éã³ã«ããŠãã ããïŒ hrmos.co