FORCIA ã¢ããã³ãã«ã¬ã³ããŒ2018 ã®8æ¥ç®ã®èšäºã§ãã æè¡æ¬éšã®ä¹æã§ããæè¿ã Prettier ãšãããã©ãŒããã¿ãŒãããŠããšèããã®ã§ãè§Šã£ãŠã¿ãŸããããã㟠ESL int ã®èšå®ã«æ²¿ã£ãŠãã©ãŒããããããŠãããã©ãPrettier å°å
¥ãããã©ããªãã詊ããŠã¿ããããšèå³ãæãããŠããæ¹åãã«ããã®ç¹åŸŽãšå°å
¥ã®ä»æ¹ã玹ä»ããŸãã Prettier ãšã¯ Prettier ã¯ä»¥äžã®ç¹åŸŽãæã€ãã©ãŒããã¿ãŒã§ãã( https://prettier.io/ #What is Prettier? ããæç²) An opinionated code formatter ("opinionated" ã§ãã) Supports many languages (å€èšèªãµããŒã) Integrates with most editors (å€ãã®ãšãã£ã¿ãŒãšã®çµ±åãå¯èœ) Has few options (éããããªãã·ã§ã³) å
¬åŒãµã€ãã«ãã説æã®ãšãããPrettier 㯠JavaScript å°çšã®ãã©ãŒããã¿ãŒã§ã¯ãªããHTMLãCSS ãMarkdown ãªã©åºããã¡ã€ã«çš®é¡ããµããŒãããæ±çšã®ãã©ãŒããã¿ãŒã§ãããŸããVisual Studio Code ã Vim ãªã©ã®ãšãã£ã¿ãŒãšçµ±åãããã¡ã€ã«ä¿åæã«èªåã§ãã©ãŒããããããããšãç°¡åã«ã§ããŸãã ãã ãã¯ãæå€§ã®ç¹åŸŽã¯ "opinionated" ã§ããããšã ãšå人çã«ã¯æã£ãŠããŸããçŽèš³ã§ã¯ãç¬æçãªããšããèªèª¬ãæ²ããªãããšããæå³ã§ãããæèš³ãããšãã¿ããªãã©ãŒãããæ¹éã£ãŠã©ããããã®ããããšæãïŒèªåã¯ããããããšæãïŒã ããåŸã£ãŠããã£ãŠããšã§ãããã£ãšå
·äœçã«ãããšãã€ã³ãã³ãïŒç©ºçœ2ã€ã«æ±ºãŸã£ãŠãã ãïŒã¿ããšããªãããŒãã£ãŠããšã§ãããããã§ã§ããã æ¹éããããããæ±ºãŸã£ãŠããã®ã§ããã©ãŒãããã¹ã¿ã€ã«ã倿Žã§ããäœå°ãããŸããªããããããéããããªãã·ã§ã³ãã®ç¹åŸŽã«ç¹ãããŸããäŸãã°ãESLint ã¯ã¹ã¿ã€ã«ã«é¢ãããªãã·ã§ã³( Rules - Stylistic Issues ) ã ãã§180 è¿ãããã®ã«å¯ŸããŠãPrettier ã®ãªãã·ã§ã³ ( Options · Prettier )㯠18ãããããŸããã å
¬åŒãµã€ãã® Why Prettier? ã«ã¯ä»¥äžã®ããã«æžãããŠããŸãã By far the biggest reason for adopting Prettier is to stop all the on-going debates over styles. (Prettier ãæ¡çšããæå€§ã®çç±ã¯ãã¹ã¿ã€ã«ã«é¢ããå
šãŠã®è°è«ãæ¢ããããã§ãïŒ Prettier ã¯ãã©ãŒãããããŒã«ã§ãããªããããããã§ããããããªãããšãããã©ãŒãããæ¹éãäžããŠããããšããã«ãã®ç¬èªæ§ããããŸããäžèªç±ãªããã«ãèŠããŸãããéã«èšãã°ããã¡ãã§çްããæ±ºããªããŠãããæãã«ãã©ãŒãããããŠãããããšããé
åããããŸãã Prettier ã®å°å
¥ JavaScript ã®ãã©ãŒããããç®çãšãã Prettier ã®å°å
¥æ¹æ³ã«ã€ããŠèª¬æããŸãã Prettier ã¯ãããŸã§ãã©ãŒããã¿ãŒãªã®ã§ãESLint ã§ãã no-unused-vars (æªäœ¿çšã®å€æ°ãèš±å¯ããªãïŒãªã©ã®ã³ãŒãå質ã«ããããææãšä¿®æ£ã¯ã§ããŸããïŒåèïŒ Prettier vs. Linters ïŒãã§ãã®ã§ãçŸå®çã«ã¯ãªã³ã¿ãŒãšäœµçšããã±ãŒã¹ãå€ãã¯ãã§ããããã§ã¯ãESLint ãæ¢ã«å°å
¥ãããŠãããšããåæã§ãESLint ã« Prettier ã«ãããã©ãŒããããçµ±åããæ¹æ³ã玹ä»ããŸãã Prettier ã®ã€ã³ã¹ããŒã« 1. npm ãŸã㯠yarn ã§ãå¿
èŠãªããã±ãŒãž ( prettier , eslint-config-prettier , eslint-plugin-prettier )ã ã€ã³ã¹ããŒã«ãã npm i -D prettier eslint-config-prettier eslint-plugin-prettier 2. eintrc ã® extends ã® æåŸ ã« Prettier çšã®èšå® plugin:prettier/recommended ã远å ãã module.exports = { "extends": [ "standard", // https://github.com/standard/eslint-config-standard "my-awesome-format-rule", // ãŒããèããæåŒ·ã®ãã©ãŒãããã«ãŒã« "plugin:prettier/recommended" // Prettier ã®èšå®ïŒâ
ããã倧äºïŒ ], } ããã§ Prettier ã®ããã©ã«ãèšå®ã§ãã©ãŒãããããæºåãã§ããŸããã "plugin:prettier/recommended" ã®èšå®ã¯ Prettier ã®ãã©ãŒãããã«ãŒã«ãé©çšããã ãã§ãªããæ¢ã«ãããã©ãŒãããã«ãŒã«ïŒãã®äŸã ãš "standard" ãš "my-awesome-format-rule" å
ã®ãã©ãŒãããã«ãŒã«ïŒããç¡å¹ã«ãããåããããŠãããããextends ã®æåŸã«æžãå¿
èŠããããŸãã åäœç¢ºèª ã³ãã³ãã©ã€ã³ã§ eslint ãå®è¡ããŠã¿ãŠ prettier/prettier ãšããçš®é¡ã®ãšã©ãŒãåºãŠããã°ãããã Prettier ã«ãããã©ãŒãããéåã®ææã§ãã $ npx eslint target.js 125:1 error Replace `â¹â¹â¹â¹â¹â¹[colName]·` with `··········[colName]` prettier/prettier ããã¯ãã¿ãããã©ãŒãããã«ãŒã«ã«éåããŠããã®ã§ã空çœã«å€æããŠãã ããããšãããšã©ãŒã§ããã eslint --fix ã§èªåçã«ä¿®æ£ïŒãã©ãŒãããïŒãå¯èœã§ããä¿®æ£ååŸã§ã©ãå€ããã確èªããŠã¿ãŠãã ããã èªåãã©ãŒãããã®èšå® åæã«ãã©ãŒãããããŠãããªããšå
šç¶å¬ãããªãã®ã§ã eslint --fix ãã»ãŒãæã«èªåçã«è¡ãããã«ããŸããèšå®ã¯ãšãã£ã¿ããšã«ç°ãªãã®ã§ãã䜿ãã®ãšãã£ã¿ã®èšå®æ¹æ³ã確èªããŠãã ããã Integrations - ESL int - Pluggable JavaScript linter ç§ã¯ Visual Studio Code ã䜿ã£ãŠããã®ã§ã ESL int çšãã©ã°ã€ã³ ã®ã€ã³ã¹ããŒã« ã»ãŒãæã®èªåFixã®èšå® "eslint.autoFixOnSave": true ãè¡ããŸããã ãã©ãŒãããã«ãŒã«ã®èª¿æŽ åè¿°ã®ãšãããPrettier ã¯åºæ¬çãªãã©ãŒãããæ¹éãæ±ºããããŠãããšããããŠãªã§ããããšã¯ããä»ãŸã§ã€ã³ãã³ãã«ã¿ãã䜿ã£ãŠããã®ã空çœã«ãªããªã©ãããããŸã§äœ¿ã£ãŠããã©ãŒãããæ¹éãšããŸãã«ã®ã£ãããããããã......ããšããææ³ãæã€æ¹ããããããããŸããããã®å Žå㯠rules ã« Prettier ã®èšå®ã远å ããããšã§ãããçšåºŠèª¿æŽãå¯èœã§ãã ïŒåèïŒOptions · Prettier https://prettier.io/docs/en/options.html èšå®äŸ module.exports = { extends: ["airbnb-base", "plugin:prettier/recommended"], rules: { "prettier/prettier" : [ "error", { // èšå®å¯èœãªãªãã·ã§ã³ã®äžéš. () ã¯ããã©ã«ãå€. printWidth: 100, // è¡ã®æå€§é· (80) tabWidth: 4, // 1 ã€ã³ãã³ããããã®ç©ºçœæ° (2) useTabs: true, // ã€ã³ãã³ãã«ã¿ãã䜿çšãã (false) semi: false, // åŒã®æåŸã«ã»ãã³ãã³ãä»å ãã (true) singleQuote: true, // åŒçšç¬ŠãšããŠã·ã³ã°ã«ã¯ãªãŒãã䜿çšãã (false) } ] } }; Prettier ã«ãããã©ãŒãããäŸ ä»¥äžã¯å
¬åŒãµã€ãã§ã玹ä»ãããŠãã Prettierã«ãããã©ãŒãããã®äŸã§ãããPrettier ã®èœåãåããç¹åŸŽçãªäŸãªã®ã§ããã§ã玹ä»ããŸãã颿°åŒã³åºãã1 è¡ã®æå€§é·ãè¶
ããŠããã±ãŒã¹ã§ãããã®ã±ãŒã¹ã¯ ESL int åç¬ã§ãææã¯ã§ããŸãããä¿®æ£ã¯ã§ããŸããã ãã©ãŒãããå ïŒ1 è¡ã printWidth èšå®(80 æå) ãè¶
ããŠãã NGïŒ foo(reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne()); ãã©ãŒãããåŸïŒåŒæ°ããšã«æ¹è¡ãå
¥ããŠèŠãããããŠãããïŒ foo( reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne() ); äŸãã°ããã§ isThereSeriouslyAnotherOne() åŒæ°ãåé€ãããšã80 æå以äžã«ãªãããã 1 è¡ã§ã®ãã©ãŒãããã«æ»ããŸããè³¢ãã å°å
¥ããŠã¿ãææ³ å®ããããšãç§ã¯ãããŸã§èªåãã©ãŒãããã®æ©èœã䜿ã£ãŠããªãã£ããããPrettier ã詊ããŠã¿ãŠãèªåãã©ãŒãããã£ãŠæé«ïŒïŒããšæããŸãããéã«ç©ºçœãã€ã³ãã³ããæžããŠããçµ±äžæã®ãã綺éºãªèŠãç®ã«ãã©ãŒãããããŠãããŸãã äžæ¹ã§ãESLint ãšãšãã£ã¿ã飿ºãããèªåãã©ãŒããããç¿æ
£ãšããŠããæ¹ã«ãšã£ãŠã¯ãJavaScriptã®ãã©ãŒãããã«éã£ãŠèšãã° Prettier ã®å°å
¥ã¯ããã»ã©å€§ããªã¡ãªããã¯ãªãã®ã§ã¯ããšãæããŸããããã ããPrettier ã«ãããã©ãŒãããäŸãã§ç€ºãããã㪠Prettier ã«ããã§ããªãããšãããã詊ããŠã¿ã䟡å€ã¯ããã®ã§ã¯ãªãã§ããããã ãŸããPrettier ã§ãã©ãŒããããããçµæãèŠãŠããååŸã®çµ±äžæãèãããšãããã¯æ¹è¡ããã« 1 è¡ã§æžããæ¹ãããã ãã......ããšä¿®æ£ããããªãããšããããŸãããæããçŽããŠããŸã£ãããããšãPrettier ãå³ãããã俺ã®ããæ¹ã ããšèšããã°ããã«å®¹èµŠãªããã©ãŒããããçŽããŠãããŸããããã¡ãã£ãšåªããããŠïŒèéå©ãããŠïŒã»ãããšæããªãããªãã£ãã§ããããã㯠Prettier ã®ææ³ãšã¯éãã®ã§ãããããªãã§ãã ä»åå°ã詊çšããŠã¿ãéãã§ã¯ãå
šé¢çã«å°å
¥ã«è³æãšãŸã§ã¯å€æã§ããŸããã§ããããã¹ã¿ã€ã«ã«ã€ããŠã®çްããè°è«ãã¬ãã¥ãŒææã¯ãããŠãã³ãŒãæžãããšã«éäžããããããšããPrettier ã®æ¹éã¯ãšãŠãå
±æã§ããŸããå°å
¥ãç°¡åã§ãååãªãªãŒã¹ã 2017/1 ãšãŸã è¥ãããŒã«ãªã®ã«äººæ°ãšããã®ãçŽåŸã§ããåŒãç¶ã泚ç®ããŠãããããšæããŸãã
Qiitaã®Rust Advent Calendar 2018 4æ¥ç®ã®èšäºã§ãã æè¡æ¬éšã®æŸæ¬ã§ãããã©ã«ã·ã¢ã§ã¯ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãRustã§éçºããŠããŸããæ¬èšäºã§ã¯ããªãRustãéžãã ããã説æããŸãã é床 Rust ã¯2015幎ã«1.0ããªãªãŒã¹ãããæ¯èŒçæ°ããããã°ã©ãã³ã°èšèªã§ããããé床ãå®å
šæ§ãäžŠè¡æ§ãããŽãŒã«ãšããŠããŸãã èšèªã®éžå®ã«ããã£ãŠã¯ãåäœé床ãéèŠèŠãããŸããã Computer Language Benchmarks Game ïŒãã³ãããŒã¯çµæãå
¬éããŠãããµã€ãïŒã«ããã°ãRustã¯JavaãGoããé«éã§ãC++䞊ã®é床ãåºããšèšãããŠããŸããå®éã«æã
ãæ€èšŒããéããRustã¯Goããã¯é«éã§ãJavaãšç°ãªãGCãç¡ããããRustã®æ¹ã奜ãŸãããšããçµæã«ãªããŸããã ã¬ããŒãžã³ã¬ã¯ã·ã§ã³(GC)ãç¡ã Rustã§ã¯æææš©ã®æŠå¿µãåãå
¥ããããšã§ããã€ã¡ã¢ãªäžãããªããžã§ã¯ããè§£æŸããããã管çããŠããŸãããã®ããGCãå¿
èŠãªããGCã«ããããã°ã©ã ã®åæ¢ãé¿ããããšãåºæ¥ãŸããæè¡æ€èšŒæã«Javaå®è£
ãæ€èšããŸããããGCãèµ°ãã¿ã€ãã³ã°ã§ã¬ã¹ãã³ã¹ã«æéããããããšããããå®å®ããŠé«éãªã¬ã¹ãã³ã¹ãè¿ãã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ã®çšéäžãRustã«è»é
ãäžãããŸããã éçãã£ã¹ãããã«ãããŒãã³ã¹ãæœè±¡å Rustããªãéãã®ããšããæèã§ããŒãã³ã¹ãæœè±¡åããšããããŒã¯ãŒãã«èšåãããäºãå€ãã§ãããå°ãåã¿ç ããŠèª¬æããããšæããŸãã Rustã§ã¯ãžã§ããªã¯ã¹(generics)ãšãã¬ã€ã(trait)ã«ãã£ãŠå€çžæ§(Polymorphism)ããµããŒãããŠããŸãããžã§ããªãã¯é¢æ°ã¯åãååã®é¢æ°ã«ç°ãªãåãæž¡ãããšãã§ããŸããäžèšã«äŸã瀺ããŸãã use std::fmt::Debug; fn main() { fn print_debug (x: T) { println! {"{:?}", x}; } print_debug(1u8); print_debug("&str"); #[derive(Debug)] struct Point { x: i32, y: i32, } let origin = Point { x: 0, y: 0 }; print_debug(origin); } Rust Playgroundã§åãããŠã¿ã ãžã§ããªãã¯é¢æ°ïŒäžèšäŸã§ã¯ print_debug ïŒãçšããå Žåãã³ã³ãã€ã«æç¹ã§åŒæ°ã®åãå
šãŠæããã«ãªã£ãŠãã( u8, &str, Point )ãããããããã®åå°çšã®é¢æ°ãäœæãããŸãã å®è¡æã«åãã颿°ãžã®å²åœé¢ä¿ã解決ããåçãã£ã¹ããããè¡ãå Žåã¯å®è¡æã«ãã®åã®ã³ã¹ããæãããŸãããRustã¯ã³ã³ãã€ã«æã«è§£æ±ºããŠããŸãéçãã£ã¹ãããã䜿çšãããããå®è¡æã«ã¯ãŒããªãŒããŒãããã§é¢æ°ã察å¿ããåŒã³åºãäºãã§ããŸãã éçºå¹ç ãŸããéçºå¹çã®é¢ãèæ
®äºé
ã§ãããRustã¯æ°ããèšèªã§ã¯ãããã®ã®ãä»ã®èšèªä»¥äžã«å¹çè¯ãéçºã§ããç°å¢ãæŽã£ãŠããŸããæšæºçãªããŒã«ã»ãããããããšãããã¹ããæšæºã©ã€ãã©ãªã«å«ãŸããŠããããšã¯C++ããã奜ãŸããéšåã§ãã rustupã«ããç°¡åãªç°å¢æ§ç¯ Rustã¯ç°å¢æ§ç¯ãé©ãã»ã©ã«ç°¡åã§ãã rustup.rs ã«ã¢ã¯ã»ã¹ãã衚瀺ãããã³ãã³ããå®è¡ããã ãã§Rustã䜿ãå§ããããšãåºæ¥ãŸãã Rustã®ããã±ãŒãžãããŒãžã£ã§ããCargoã§ãããããã±ãŒãžç®¡çã ãã§ãªãããããžã§ã¯ãã®äœæãããã¹ãããã«ãæã®èšå®ãŸã§äžè²«ããŠç®¡çããŠããŠãããããããããããªããŒã«ã䜿ãåããå¿
èŠããããŸããããã¡ããrustupã§ã€ã³ã¹ããŒã«ãããŸãã ã³ãŒãã£ã³ã°æã®ãµããŒã Rust Language Server (RLS) ãéçºãããŠãããã³ãŒãã£ã³ã°é¢ã§è£å®ãªã©ã®ãµããŒããåããããŸã rustfmt ã§çµ±äžçãªã³ãŒãæŽåœ¢ãå¯èœã§ã äžèšã®ããŒã«çŸ€ãæ¥ã
ã¢ããããŒããããŠãããäžäŸ¿ãªãããŒã«çŸ€ã®æ©æµã«é ãã£ãŠããŸãã ãšã©ãŒã¡ãã»ãŒãžã芪å Rustã®ã³ã³ãã€ã©ã®ç¹åŸŽãšããŠãéåžžã«èŠªåãªã¡ãã»ãŒãžãæãããããŸããæææš©ãã©ã€ãã¿ã€ã ãšãã£ã銎æã¿ã®èãæŠå¿µããããããå®ç§ãªã³ãŒããäžæã§æžãããšã¯ãŸã é£ããã®ã§ãããåºæ¬çã«ãã©ããããã©ããä¿®æ£ããã°é©åãªã¢ãããŒã·ã§ã³ãã§ãããããã³ã³ãã€ã©ããšã©ãŒã¡ãã»ãŒãžãšããŠè¡šç€ºããŠãããŸããã³ã³ãã€ã©ã®ãµããŒããåããªããã³ãŒããæžããŠããããšãåºæ¥ãŸãã èšèªæšæºã®ãã¹ã Rust㯠èšèªã®æšæºæ©èœ ãšããŠãã¹ããçšæãããŠãããcargo testã®ã³ãã³ãã§å®è¡ããããšãåºæ¥ãŸãããã¹ãçšã®ã©ã€ãã©ãªçŸ€ãã€ã³ã¹ããŒã«ããŠ......ãšãã£ãäœæ¥ãç¡ãã®ã¯å¬ããããšã§ããcargo new --libããéã«äœãããã¹ã±ã«ãã³ã«ã¯ããã¹ãã±ãŒã¹ã®ã¹ã±ã«ãã³ãå«ãŸããŠããŸããããã«ãã¹ããæžããªããšãšããæ°åã«ãããŠãããŸãããå®è£
ãšãã¹ããåããã¡ã€ã«ã«æžããããããã¹ãã仿§ã®åœ¹å²ãæããããããªããŸããdocã³ã¡ã³ãäžã®ãã¹ããå®è¡ãããã®ã§ãå®è£
ãšã³ã¡ã³ããä¹é¢ããããšãé²ãããããªã£ãŠããŸãã ãŸãããã¹ãã¯ãã¡ã€ã«ããšã«äžŠåã§åŠçãããããããããžã§ã¯ãå
šäœã®ãã¹ããè¡ãéãé«éã«ãã¹ããå¯èœã§ãã åŠç¿ã³ã¹ã Rustã®ãã¡ãªãããšããŠãåæã®åŠç¿ã³ã¹ãã®é«ããæããããŸãã å®éãåçšïŒã»æææš©ïŒã»ã©ã€ãã¿ã€ã ã®æŠå¿µã¯éŠŽæã¿ãèããããã¥ã¡ã³ããèªã¿ã³ã³ãã€ã©ãšæ ŒéããªããåŠç¿ããŠããããšã«ãªããŸããã確ãã«éŠŽæã¿ã®èãæŠå¿µã§ã¯ãªããã®ã®ããŠãŒã¶ãŒãšããŠäœ¿ãåã«ã¯é£ããæŠå¿µã§ã¯ãªããããè·æ¥ããã°ã©ããä»äºãšããŠåãåã£ãŠããŸãã°ã³ã³ãã€ã©ã®ãµããŒãåã§åé¡ãªãå©çšã§ããã¬ãã«ã ãšèããŠããŸãã ææ³ã«é¢ããŠã倿°ã®åã¯ã¢ãããŒã·ã§ã³é¢šã«æžãâ»ãããããã¯ã®æ«å°Ÿã®åŒãè¿ãå€ã«ãªãããšå¿µããã°ãä»ã®æç¶ãåèšèªãšå€§ããªéãã¯ãããŸãããå
æ¥ã®å匷äŒã§ãRustã¯é¢æ°åé¢šã®ææ³ãæžããæç¶ãåèšèªããšãã£ããã£ãŠããæ¹ãããã£ããããŸãããå®éæç¶ãåèšèªã«éŠŽæã¿ã®ãã人éãããããšããã¿ãŒã³ããããªã©é¢æ°åèšèªã«ç¹åŸŽçãªæ©èœã䜿ãããšãã§ããæç¶ãåèšèªãšãã颚ã«èŠããææ³éšåã®åŠç¿ã³ã¹ãã¯å€§ãããããŸããã ãã©ã«ã·ã¢ã§ã¯æŠå¿µãšåºæ¬ææ³ãçè§£ããããã®ãã³ãºãªã³ã瀟å
ã§è¡ããRustãæžãããšã³ãžãã¢ãå¢ããããšè©Šã¿ãŠããŸãã â»JavaScriptã®FlowãPythonã§ã¢ãããŒã·ã§ã³ãæžããããšããã人ã§ããã°ããã€ãã®äœçœ®ã«æžãã ãã§ãã ããã㫠以äžã®çç±ããããã©ã«ã·ã¢ã§ã€ã³ã¡ã¢ãªããŒã¿ããŒã¹ãäœãéã«ãé床ãšéçºå¹çã®é¢ã§Rustã¯è¯ãéžæè¢ã«ãªããŸããã 2019幎1æ16æ¥ã«äºå®ããŠãã Shinjuku.rs #2 ã§ã¯ãã¢ããèŠãã§ãããã§ãã
æè¡æ¬éšã®çžæŸ€ã§ããæ¥é ã¯SQLãSQLãåºåããããã°ã©ã ã°ããæžããŠããŸãã å
æ¥ãPostgreSQL9.6ç³»ã®æ€çŽ¢ã¢ããªããã¥ãŒãã³ã°ããæ©äŒããããpg_prewarmãšè€åindexãçšããããšã§ãåçãªæ¹åãå³ãããšãã§ããŸãããä»åã¯ãã®ãšãã«äœ¿ã£ããã®2ã€ã®æè¡ã«ã€ããŠã玹ä»ããŸãã ãã¥ãŒãã³ã°ããã¢ããªã®æŠèŠ ã¯ããã«ãä»åç§ããã¥ãŒãã³ã°ããã¢ããªã®æŠèŠãã説æããŸãã PostgreSQL9.6ç³»ã§åäœããŠããã ã¢ããªã±ãŒã·ã§ã³ã®ã¿ãã©ã«ã·ã¢ã«ãŠç®¡çãOSã¯é¡§å®¢ã管çããŠããã çŽ27000ä»¶ã®ããã«ãšããã«çŽã¥ãçŽ500äžä»¶ã®å®¿æ³ãã©ã³ããç¹å®ã®æ¡ä»¶ã®
FORCIAã¢ããã³ãã«ã¬ã³ããŒ2018 3æ¥ç®ã®èšäºã§ãã æè¡æ¬éšã®çžæŸ€ã§ããæ¥é ã¯SQLãSQLãåºåããããã°ã©ã ã°ããæžããŠããŸãã å
æ¥ãPostgreSQL9.6ç³»ã®æ€çŽ¢ã¢ããªããã¥ãŒãã³ã°ããæ©äŒããããpg_prewarmãšè€åindexãçšããããšã§ãåçãªæ¹åãå³ãããšãã§ããŸãããä»åã¯ãã®ãšãã«äœ¿ã£ããã®2ã€ã®æè¡ã«ã€ããŠã玹ä»ããŸãã ãã¥ãŒãã³ã°ããã¢ããªã®æŠèŠ ã¯ããã«ãä»åç§ããã¥ãŒãã³ã°ããã¢ããªã®æŠèŠãã説æããŸãã PostgreSQL9.6ç³»ã§åäœããŠããã ã¢ããªã±ãŒã·ã§ã³ã®ã¿ãã©ã«ã·ã¢ã«ãŠç®¡çãOSã¯é¡§å®¢ã管çããŠããã çŽ27000ä»¶ã®ããã«ãšããã«çŽã¥ãçŽ500äžä»¶ã®å®¿æ³ãã©ã³ããç¹å®ã®æ¡ä»¶ã®ããã«ã»ãã©ã³ãæ€çŽ¢ããã ä»¶æ°å¢å çã«ããDBãè¥å€§åãã postgresåèµ·åæã®æ€çŽ¢ 㚠倧éã®ãã©ã³ããããããå Žåã®æœèšæ€çŽ¢ ãé
ããªã£ãŠããã postgresã®ãã£ãã·ã¥ã®ãããçã¯è¯ããªããã仿§ã®éœåäžæ¹åã§ããªãã®ã§å¯Ÿè±¡å€ãšããã ããŒã¿æ§é ãšæ€çŽ¢æã®SQL 次ã«ãããŒã¿æ§é ã®æŠèŠãã説æããŸããæœèšã«ã¯uniq ã«hotel_idããã©ã³ã«ã¯plan_idãå²ãæ¯ãããŠããŸãã 以äžãããŒãã«æ§é ã§ãã hotelïŒhotel_idãprimary keyã«ããããã«ãã¹ã¿ãæœèšã®å
šæ
å ±ãæã€ãïŒæœèšäžŠã³é keyãç¶ãïŒ planïŒplan_idãprimary keyã«ããããã«ãã¹ã¿ããã©ã³ã®å
šæ
å ±æã€ããŸãjoin keyãšããŠhotel_idããã€ã ãã©ã³æ
å ±ããæœèšæ€çŽ¢ã®éã«çºè¡ãããSQLã¯æ¬¡ã®ãšããã§ãã SELECT {HããŒãã«äžã®ã«ã©ã } FROM ( SELECT hotel_id FROM plan P WHERE {æ€çŽ¢æ¡ä»¶ããçºè¡ãããWHEREå¥} GROUP BY P.hotel_id )s INNER JOIN hotel H USING(hotel_id) ORDER BY H.hotelorderkey1, H.hotelorderkey2, H.hotelorderkey3.... OFFSET.... LIMIT.... {äžåã«å¿
èŠãªã®ã¯10ä»¶çšåºŠ} ãã¥ãŒãã³ã°æ¹æ³ postgresåèµ·åæã®ãã¥ãŒãã³ã°ã«ã¯ PostgreSQL9.4ããå®è£
ãããŠããEXTENSIONã® pg_prewarm ãé©åã«èšå®ããããšã§å¯Ÿå¿ããŸãã 倧éã®ãã©ã³ããããããå Žåã®æœèšæ€çŽ¢ã«é¢ããŠã¯é©åã«indexã貌ããGROUP BY ãéãããã°è¯ãã ãããšããããšãå®è¡èšç»ããèªã¿åããã®ã§ã è€åindex ãæ¡çšããã¥ãŒãã³ã°ããŸããã æ¹æ³ïŒ pg_prewarmã®èšå®ã«ãããã¥ãŒãã³ã° pg_prewarmãšã¯ïŒ SELECT pg_prewarm('hotel', 'buffer', 'main'); ã®ããã«ããŒãã«åãæå®ããŠãç¹å®ã®ãªã¬ãŒã·ã§ã³ããã£ãã·ã¥ããã¢ãžã¥ãŒã«ã§ããpostgresãµãŒããŒãåèµ·åãããšãããŒãã«ãã¡ã¢ãªããèœã¡ãŠããŸããŸããããŒãã«ãã¡ã¢ãªã«èŒã£ãŠããªãç¶æ
ã®ãŸãŸãªã³ã©ã€ã³ã«åºããŠããŸããšãæåã«äžæ°ã«ããŒãã«ãèªã¿èŸŒã¿ã倧éã®I/OãçºçããŠããŸãé«è² è·ãšãªããŸãããpg_prewarmãçšããŠäºããã£ãã·ã¥ããŠããã°é«è² è·ãé¿ããããšãã§ããŸãã ãŸãããã£ãã·ã¥ã«ä¹ãåããªãããŒãã«ãµã€ãºãããå Žåã§ãããã£ãã·ã¥ã«ä¹ãç¯å²ã§ããŒãã«ããã£ãã·ã¥ããŠããã ãã§é«è² è·ãé¿ããããšãã§ããŸãã ïŒpg_prewarm å
¬åŒããã¥ã¡ã³ãïŒ https://www.postgresql.jp/document/9.6/html/pgprewarm.html 3ã€ã®ã¢ãŒãã¯ã©ãã䜿ãã¹ãã pg_prewarmã«ã¯3ã€ã®ã¢ãŒãããããŸãã buffer : posgresã®ãããã¡ãã£ãã·ã¥ã«èŒããŸãã prefetch : OSã«éåæã®ãã¬ãã§ããããªã¯ãšã¹ãããŸããããOSããã«ãæã«ãã¬ãã§ããããµããŒãããŠããªãå Žåã¯ãšã©ãŒãšãªããŸãã read : ãããã¯ã®èŠæ±ãããç¯å²ãèªã¿èŸŒã¿ãŸãããã¬ãã§ãããšã¯éã£ãŠããã¹ãŠã®ãã©ãããã©ãŒã ã«ãµããŒãããããã«ãã«ããããŠããŸãããé床ãé
ããªããŸãã 以äžã®çç±ãããbufferãæ¡çšããŸããã çç±1ïŒãµãŒãã¹ã«é¢ããŠãã©ã«ã·ã¢ã§OSã®ç®¡çãããŠããããæš©éãèšå®ã«é¢ããŠå€æŽãã§ããªãããã çç±2ïŒpg_buffercacheã䜿ãã°ããããã¡ãã£ãã·ã¥ã«ã©ã®ããŒãã«ãã©ãã ãä¹ã£ãŠããã確èªã§ããããïŒå
·äœçãªç¢ºèªã®SQLã¯äžã«èšèŒããããŸãïŒã 4ã€ã®ããŒãã«ãã¡ã¢ãªã«ä¹ããã«ã¯ãã©ã®æžãæ¹ãè¯ãã pg_prewarmãåŒã³åºãã¯ãšãªã®æžãæ¹ã¯ã倧ãã2éãèããããšãåºæ¥ãŸããä»åã¯åæ¹ãæ€èšŒããŸããã ãã¿ãŒã³1ïŒäžã€ã®SELECTæãšããŠåŒã³åºãã SELECT pg_prewarm('table1', 'buffer', 'main') ,pg_prewarm('table2', 'buffer', 'main') ,pg_prewarm('table3', 'buffer', 'main') ,pg_prewarm('table4', 'buffer', 'main') ; ãã¿ãŒã³2ïŒããããå¥ã®SELECTæãšããŠåŒã³åºãã SELECT pg_prewarm('table1', 'buffer', 'main'); SELECT pg_prewarm('table2', 'buffer', 'main'); SELECT pg_prewarm('table3', 'buffer', 'main'); SELECT pg_prewarm('table4', 'buffer', 'main'); ãã¿ãŒã³1ã¯ãããŒãã«ãµã€ãºã倧ããããŠãããšã¯ãšãªãé·æéã«ãªããããŠç°åžžãæ€ç¥ããŠããŸããŸããããã¿ãŒã³2ã§ã¯äžã€ãã€SQLãå®è¡ããããã£ãã·ã¥ããããªãå Žåã¯åããé ã«èœã¡ãŠããã ãã§ããããã®ããããã¿ãŒã³2ã®æžãæ¹ã§éèŠæ§ã®é«ã(I/Oã«ã€ãªããããã)ããŒãã«ãåŸãã§åŒã³åºãããã«æž©ããŠããã®ããããšèããŸããã ããŒãã«ããã£ãã·ã¥ããèœã¡ãŠãããã©ããã¯EXTENSIONã®pg_buffercacheã䜿ãããšã§èª¿æ»å¯èœã§ãã CREATE EXTENSION pg_buffercache; SELECT C.relname ,count(*) AS buffers FROM pg_buffercache B INNER JOIN pg_class C ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN ( 0 ,( SELECT oid FROM pg_database WHERE datname = current_database() ) ) GROUP BY C.relname ORDER BY 2 DESC ; relname | buffers ----------------------------------------+--------- plan | 167927 hotel | 3418 ïŒåèã«ããããã°ïŒ PostgreSQL Deep Dive ïŒpg_buffercache å
¬åŒããã¥ã¡ã³ãïŒ https://www.postgresql.jp/document/9.6/html/pgprewarm.html I/Oã®é«ãæéãé¿ãã pg_prewarmã¯ãããªãã«æéãæããã¯ãšãªã§ãå®è¡äžã¯I/Oãé«ãã§ããpostgresåèµ·åæã«ãpg_prewarmã®çµäºãåŸ
ã£ãŠæ€çŽ¢ãè¡ãããããã«èšå®ãããããšãããpostgresåèµ·ååŸã®åææ€çŽ¢ã«ãããI/Oãæ¿æžããŸããã çµæ å
ã®ç¶æ
ã§ã¯postgresåèµ·ååŸã¯ãããŠã®ãªã³ã©ã€ã³æå
¥æã«ãé«è² è·ãªç¶æ
ã5ïœ10åçšåºŠç¶ããŠããŸããããprewarmãæ¡çšããå Žå㯠ãªãã©ã€ã³ç¶æ
2ïœ5åçšã§I/Oãèœã¡çãããã«ãªããŸãã ã æ¹æ³ïŒ è€åindexã«ãããã¥ãŒãã³ã° æ€çŽ¢ããžãã¯ã«ã€ããŠã¯ããã©ã³æ
å ±ããæœèšæ€çŽ¢ã®éã«çºè¡ãããSQLã¯ä»¥äžã®ãšããã§ãïŒåæ²èŒïŒã SELECT {HããŒãã«äžã®ã«ã©ã } FROM ( SELECT hotel_id FROM plan P WHERE {æ€çŽ¢æ¡ä»¶ããçºè¡ãããWHEREå¥} GROUP BY P.hotel_id )s INNER JOIN hotel H USING(hotel_id) ORDER BY H.hotelorderkey1, H.hotelorderkey2, H.hotelorderkey3.... OFFSET.... LIMIT.... {äžåã«å¿
èŠãªã®ã¯10ä»¶çšåºŠ} æ€çŽ¢ããŒãã«ãjoinããŒã«ã¯åºæ¬çã«indexã匵ã£ãŠãããŸãããè€åindexã¯ãããŸããã§ããããã®ããWHEREå¥ã§ååã«planãçµããªãã£ãå Žåã«ãGROUP BYã®åŠçã«æéãããã£ãŠããŸã£ãŠããŸããã hotel_orderã«é¢ããŠãåœç¶ãªããhotel_idã«ãã£ãŠäžæã«å®ãŸããŸãããªãã°planããŒãã«ã«ãããããæãããããšã§ã以äžã®ãããªSQLã«å€æŽããŠãåãæå³ã«ãªããŸãã ã«ã©ã ã®å®çŸ© ROW_NUMBER () OVER (ORDER BY H.hotelorderkey1, H.hotelorderkey2, H.hotelorderkey3....) AS hotel_order SELECT {HããŒãã«äžã®ã«ã©ã } FROM ( SELECT P.hotel_order, P.hotel_id FROM plan P WHERE {æ€çŽ¢æ¡ä»¶ããçºè¡ãããWHEREå¥} GROUP BY P.hotel_order, P.hotel_id -- hotel_idã ãã®ãšããšåãã§ã ORDER BY P.hotel_order, P.hotel_id -- hotel_orderã ãã®ãšãã®åãã§ã )s INNER JOIN hotel H USING(hotel_id) ORDER BY s.hotel_order -- inner joinã®ååŸã§æœèšäžŠã³é ã¯ç¶æãããªãã®ã§ãå床䞊ã¹çŽããå¿
èŠã§ã OFFSET.... LIMIT.... {äžåã«å¿
èŠãªã®ã¯10ä»¶çšåºŠ} SELECT, GROUP BY,ORDER ã®ããŒãäžèŽããŸããã®ã§ä»¥äžã®è€åindexãçšæããã°ãindexãçšããŠé«éã§ãµãã¯ãšãªãçµããããšãã§ããŸãã CREATE INDEX hotel_order_index_on_plan ON plan (hotel_order, hotel_id); 倿§ãªORDERãã¿ãŒã³ããããŸããããã®ãããªhotel_orderãäœçš®é¡ãæºåããã°ããã ããDBæ§ç¯ãæ€çŽ¢ããžãã¯ãããé£ãããªããã®ã§ã¯ãããŸããã çµæ ããšããš2ç§ä»¥äžããã£ãŠããæ€çŽ¢ã¯ãšãªãã çŽ1/700ã®3ms ã§çµäºããããã«ãªããŸãããäœè«ã§ããããããµãŒãã¹åæ ãããšãããæ€çŽ¢ãæ©ããªãã ãã§ã¯ãªããååã§åé¡ã«ããŠããI/OãæŽã«äžãããŸããã ãããã« äžèš2ã€ã®æ¹ä¿®ã¯ãå®éã®ãµãŒãã¹ã䜿ãéã«ãäœæã§ããã¬ãã«ã®æ¹åã«ãªããŸãããé
ãã¯ãšãªã«çç®ããé«éåã¯ããŠãŒã¶ãŒã®æãæªãçµéšãåäžããããããã³ã¹ããè¯ããšæããŠããŸãããåèã«ãªãã°å¹žãã§ãã
FORCIAã¢ããã³ãã«ã¬ã³ããŒ2018 1æ¥ç®ã®èšäºã§ãã æè¡æ¬éšã®éŸå³¶ã§ããã¢ããã³ãã«ã¬ã³ããŒã®æåã®èšäºãšããããšã§äœãæžããããšèããŠãããã§ããã以åèšäºãæžããAlexaãã¹ããŒãã¹ããŒã«ãŒã«ã€ããŠæžãããšæããŸããããã€ãã®Alexaã¹ãã«éçºã«æºãããã¹ããŒãã¹ããŒã«ãŒãVUIã®ç¹æ§ã匱ã¿ããã®è£ãæ¹ãèŠããŠããŸããã 以åã®èšäºã¯ ãã¡ã 人æ°ã¹ãã«ã®åŸå ã¯ããã«Alexaã¹ãã«ã®äººæ°åŸåããã©ã®ãããªã¹ãã«ã䜿ãããã®ãèããŠã¿ãããšæããŸããå°ãåã®ããŒã¿ã«ãªããŸããã Amazonã©ã³ãã³ã°å€§è³2018äžåæ ãèŠããšã人æ°ã®ã¹ãã«ã¯å€§ãã以äžã«åé¡ã§ããã§ãããã æ
å ±æäŸç³» éæèåžã®æ ªåŒåžå Žã®æ
å ±æäŸã¹ãã«ãJRæ±æ¥æ¬ã®éè¡æ
å ±æäŸã¹ãã«ãYahoo!ãã¥ãŒã¹ã®ããã«äžè¬çãªæ
å ±ãæäŸããã¹ãã«ã§ããç¹åŸŽãšããŠãŠãŒã¶ããšã®æ
å ±ã®åºãåãã¯åºæ¬çã«ç¡ãããã£ãŠããã䜿ãè·¯ç·ãç»é²ããïŒäŸïŒJRæ±æ¥æ¬åè»éè¡æ
å ±æ¡å
ïŒãªã©ã§ããŠãŒã¶æ¯ã«åŸãããæ
å ±ã¯å€§ããå€ãããŸããã ãã£ã©ã¯ã¿ãŒç³» ãã«ãã¥ãŠããŒã¯ãè±ãã°ãã¯ãããšãããã£ã©ã¯ã¿ãŒãšã®äŒè©±ã楜ãããã®ã§ããç¹åŸŽãšããŠãŠãŒã¶ã¯äŒè©±ã®å
容ãããã£ã©ã¯ã¿ãŒã®å£°ãéèŠããŠãããšèšããã§ãããã ã²ãŒã ç³» é§
ãããšã powered by é§
ãã±ããšãã¢ã«ã¯ã®è±èªã¯ã€ãºã®ããã«ã²ãŒã ãæ¥œããã¹ãã«ã§ãããããšãã®ããã«ãŠãŒã¶ãçºè©±ãã¹ãåèªãå°ãªããã®ããè±èªã®ãªã¹ãã³ã°ã®ããã«åé¡æãæµããŠãŠãŒã¶ã¯éžæè¢ããçãããšãã£ããã®ãå€ãããã§ãã 鳿¥œç³» radiko.jpãã«ã©ãªã±JOYSOUNDã®ããã«é³æ¥œãæµãã¿ã€ãã®ã¹ãã«ã§ããã¹ããŒã«ãŒããæµããé³èªäœã«äŸ¡å€ãããã®ã§ã¹ããŒãã¹ããŒã«ãŒãšã®çžæ§ã¯ããã人æ°ãªããšã¯ããªãããŸãã ã¹ãã«ã®èŠæãªãšãã 人æ°ã®ã¹ãã«ããèŠãŠåããããšã¯ãã€ã³ãããã®æ
å ±éïŒãŠãŒã¶âã¹ãã«ïŒãå°ãªããã¢ãŠããããã®æ
å ±ïŒã¹ãã«âãŠãŒã¶ïŒã¯éã®å€å¯¡ã¯ãããã®ã®çš®é¡ãå°ãªããšããããšããšæããŸããããã«ã¯ã¹ããŒãã¹ããŒã«ãŒãVUIã®ç¹åŸŽã§ãããé³å£°ã§æäœããããšããæ§è³ªã圱é¿ããŠããŸãããŠãŒã¶ã®çºè©±ã¯ãé·ããªãã°ãªãã»ã©è€éããèãåãã®é£æåºŠãäžãããŸãããã®ãããåäœã®ãŠãŒã¶çºè©±ã¯ã§ããã ãçãããããšããã§ããã现ããäœåºŠã質åãããšãŠãŒã¶ãç²ããããŠããŸããŸãã ã€ã³ãããã®æ
å ±ãå°ãªããšããããšã¯ããã«å¿ããŠè¿åŽããã¢ãŠããããã®æ
å ±ã®çš®é¡ãå°ãªããªã£ãŠããŸããšããããšã§ããããŠãŒã¶ã«å€ãã®æ
å ±ãå
¥åããæé©ãªæ
å ±ãæäŸãããããªãµãŒãã¹ã¯èšèšãé£ãããªããŸãã èŠæãå
æããã«ã¯ïŒ ã€ã³ãããã®éãå¿
èŠãªãµãŒãã¹ãäŸãã°ãŠãŒã¶ã®å¥œã¿ã«å¿ããååãæäŸããECãµã€ãããæ
è¡ååãæ€çŽ¢ãããããªãµãŒãã¹ã¯ã¹ãã«ã§å®çŸã§ããªãã®ã§ããããïŒ ãããªããšã¯ãªããšèããŠããŸãã ã¢ã¡ãªã«ã®ã¹ã¿ãŒããã¯ã¹ã®ã¹ãã« ã¯ãã®åé¡ã®è§£æ±ºã®ãã³ãã«ãªãã§ãããã ã¢ã¡ãªã«ã®ã¹ã¿ãŒããã¯ã¹ã®ã¹ãã«ã¯Alexaããã³ãŒããŒã泚æããŠåºèã§ååãããšãã§ããã®ã§ãããããã«å¿
èŠãªãŠãŒã¶ã®çºè©±ã¯ãAlexa, order my Starbucksãã®ã¿ã§ããã©ãããä»çµã¿ã«ãªã£ãŠããããšèšããšããªã³ã©ã€ã³ãªãŒããŒãå¯èœãªã¹ã¿ãŒããã¯ã¹ã¢ããªäžã§ãããã©ã«ã泚æããèšå®ãããŠãããAlexaããã¯ã¹ãã«ãåŒã³åºãã ãã§ãã®æ³šæãè¡ããããšããããã§ããã¹ã¿ãã®æ³šæã®ããã«ã¯ãã³ãŒãã®çš®é¡ãããµã€ãºãããã«ã¯ã®éããªã©ã®ã€ã³ããããå¿
èŠã§ãããããã«ã¯é©ããããŒã«ã®ã¹ããã¢ããªããŠãŒã¶ã«å©çšãããæ³šæã®æ©èœã®ã¿ãããæè»œã«äœ¿ããAlexaäžãããè¡ããããã«ãªã£ãŠããã®ã§ããçºæ³ãšããŠã¯ Amazon Dash Button ã«è¿ãã§ããã ãããã« ã€ã³ãããã®æ
å ±éãå°ãªãããšã¯Alexaã«éãããã¹ããŒãã¹ããŒã«ãŒã«å
±éãã匱ç¹ãšèšããŸããæ
å ±ã®ã€ã³ãããéšåã¯ããé©ããããã€ã¹ïŒã¹ãããPCïŒãå©çšãã匷ã¿ã§ãããæè»œãããçãããŠå®è¡éšåã®ã¿ãã¹ããŒãã¹ããŒã«ãŒäžããè¡ããããã«ããã¹ã¿ãŒããã¯ã¹ã®äŸã¯äžã€ã®è§£ã ãšæããŸããã€ã³ãããæ
å ±ãè£å®ããç¹ã¯ãŠãŒã¶ã«å¥ç«¯æ«ã§å
¥åããã以å€ã«ãããŠãŒã¶ã®webãµã€ãã§ã®è¡åå±¥æŽãå©çšããã䌌ããŠãŒã¶ã®æ
å ±ã䜿ããªã©ãèããããã§ããããã¹ããŒãã¹ããŒã«ãŒãVUIã®ç¹æ§ãçè§£ããåŸæãªéšåãä»»ããèŠæãšããéšåã¯ä»ã®æ¹æ³ã§ååŸãããšãã£ãããšãã¹ãã«ã®èšèšã§ã¯éèŠã ãšèããããŸãã
æè¡æ¬éšã®å
å±±ã§ããä»å€ããã©ã«ã·ã¢ã§ã¯åã®è©Šã¿ãšãªããFORCIA Summer Internship 2018ããéå¬ããŸããã ååã®èšäº ã§ã¯ãã€ã³ã¿ãŒã³ããŒã ããã®èŠç¹ã§ããµããŒã€ã³ã¿ãŒã³ãå®çŸãããŸã§ã®éã®ããã玹ä»ããŸãããä»åã¯ã¡ã³ã¿ãŒèŠç¹ã§ãå
·äœçã«ã€ã³ã¿ãŒã³çã«åãçµãã§ããã£ã課é¡ã«ã€ããŠãåç·šã»åŸç·šã®2åã«åããŠã玹ä»ããŸãããµããŒã€ã³ã¿ãŒã³ã«åå ãããªãã£ãåŠçã®çããã«ãããã©ã«ã·ã¢ã®åãçµã¿ããã£ããœãã£ãŒãå€å°ã§ãç¥ã£ãŠããã ããã幞ãã§ãã ç§ã¯ã¡ã³ã¿ãŒãšããŠãäžèš2ã€ã®ã³ãŒã¹ãæ
åœããŸããã æ€çŽ¢é«éåã³ãŒã¹ïŒç¬¬1ã¿ãŒã ã»ç¬¬3ã¿ãŒã ïŒ ECãµã€ãã®ãªã³ã©ã€ã³ã®SQLã培åºçã«ãã¥ãŒãã³ã°ããã³ãŒã¹ã§ãã ããŒã¿ã¯ã¬ã³ãžã³ã°ã³ãŒã¹ïŒç¬¬2ã¿ãŒã ã»ç¬¬3ã¿ãŒã ïŒ ãæ€çŽ¢æ¹åã®ããã®ãECãµã€ãçšããŒã¿ã®ã¯ã¬ã³ãžã³ã°ãã«åãçµãã³ãŒã¹ã§ãã èšäºã¯ ãã¡ã åç·šã§ã¯ããæ€çŽ¢é«éåã³ãŒã¹ãã«ã€ããŠã詳ãã説æããŠãããŸãã æ€çŽ¢é«éåã³ãŒã¹ é«éåã¯ãªãéèŠã ãã©ã«ã·ã¢ã¯åµæ¥æãããäžè²«ããŠãéããã«ãã ãããæ€çŽ¢ã®é«éåã«åãçµãã§ããŸããããªãé«éåãéèŠãªã®ã§ãããããç§ã®èãã代衚çãªçç±ã¯æ¬¡ã®ãšããã§ãã ãŠãŒã¶ã«ãšã£ãŠãã¹ãã¬ã¹ã®ç¡ããµãŒãã¹ãšãªã éããã°ãã®åãè€éãªåŠçããããããšãã§ãã è€éãªåŠçãšã¯ãäŸãã°ãŠãŒã¶ããšã«æ€çŽ¢çµæã®äžŠã³é ãæé©åããããæéãªã©ã®è¡šç€ºå
容ãå€ãããããããšã§ãããã©ã«ã·ã¢ã®æ€çŽ¢é床ãžã®ãã ããã«ã€ããŠã¯ ãã¡ã ã®èšäºã«ããŸãšããããŠããŸãã®ã§ããã²ã芧ãã ããã ãã®æ€çŽ¢é«éåã³ãŒã¹ã¯ãŸãã«ãã©ã«ã·ã¢ã® ã³ã¢æè¡ ããããŠã³ã¢ããªã¥ãŒãäœæããŠããã ã絶奜ã®å Žãšãªãã¯ãã ãšæããç§ãæ°åããå
¥ããŠèª²é¡äœæãè¡ããŸããã 課é¡ã®æŠèŠ ä»åã¯ããšããECãµã€ãã®æ€çŽ¢ã§å®éã«äœ¿çšãããŠããSQLãã課é¡çšã«å€å°ç°¡ç¥åããç¶æ
ã§ãã€ã³ã¿ãŒã³ã·ããã®æåã«æç€ºããŸããããã®SQLã¯ãååã®åºæ¬æ
å ±ãä¿æãããååãã¹ã¿ããååãå±ããã«ããŽãªã®æ
å ±ãä¿æãããã«ããŽãªãã¹ã¿ããªã©ã10çš®é¡çšåºŠã®ãã¹ã¿çŸ€ãããECãµã€ãã®ååäžèЧã®è¡šç€ºã«äœ¿çšãã10é
ç®çšåºŠãè¿åŽããSQLã«ãªããŸãã ãã®SQLã¯ãã€ã³ããã¯ã¹ãäœæãããŠããŸããããNULLãå«ãŸããŠããŸããããªã³ã©ã€ã³ã§è€æ°ããŒãã«ãšã®JOINãè¡ãããŠããŸãïŒèª²é¡ãšã¯èšãããªããªãã²ã©ãSQLã§ããïŒããã®ãŸãŸå®è¡ããå Žåã®å®è¡æéã¯10ç§ä»¥äžã§ãã ãªã³ã©ã€ã³ã®ã¬ã¹ãã³ã¹ãæ¯å10ç§ä»¥äžãšãªããšããŠãŒã¶ã«äžããã¹ãã¬ã¹ã¯å€å€§ãªãã®ãšãªã£ãŠããŸããŸãããã®ãããªãµãŒãã¹ããã£ããšãããããŸãšãã«äœ¿ãããããšã¯ãªãã§ããããããã§ã ãå®è¡æéã10ç§ä»¥äžã®ãã®SQLãé«éåããïŒç®æšæ§èœã¯300ããªç§ä»¥å
ã ãæ€çŽ¢é«éåã³ãŒã¹ã®ãé¡ãšããŸããã ã€ã³ã¿ãŒã³çã®åãçµã¿ 第1ã¿ãŒã ã®ã€ã³ã¿ãŒã³çã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®éçºçµéšã¯ãããã®ã®ãSQLã¯ORMã®äœ¿çšãäžå¿ã§ãSQLã®ãã¥ãŒãã³ã°ãããããè€éãªSQLãæžãããããçµéšã¯ç¡ãããšããããã¯ã°ã©ãŠã³ãã®æ¹ã§ããããèªèº«ããã®ç¹ã«èª²é¡æèãããã匱ç¹å
æã®ããã«ãã®ã€ã³ã¿ãŒã³ã·ããã«å¿åããŠãã ãããŸãããå®éãORMã§ãã£ãŠããã©ã®ãããªSQLãå®è¡ãããŠããã®ãçè§£ããŠããããšã¯ãšãŠãéèŠã«ãªããŸãããã®æå³ã§ãèª²é¡æèããšãŠãçŽ æŽãããæ¹ã ãªãšæããŸããã 第3ã¿ãŒã ã®ã€ã³ã¿ãŒã³çã¯ãããŒã¿åæçšã®SQLã®çµéšãããæ¹ã§ããããã ããããŒã¿åæãè¡ã£ãŠãããšãã¯ãäžæ©ãããŠå®è¡ããŠç¿æ¥çµæã確èªããããšãã£ãããšãå€ãã£ãããã§ãã1ç§ã§ããé
ãããšèšããããªã³ã©ã€ã³ã§ã®ããã©ãŒãã³ã¹ã®äžçã«æåã¯æžæãã€ã€ããææ¢ã«èª²é¡ã«ãã£ã¬ã³ãžãããŠããŸããã ã€ã³ã¿ãŒã³ã·ããæéäžã¯ãã€ã³ããã¯ã¹ã®äœæïŒéé²ã«äœæããã°ãããšãããã®ã§ã¯ãããŸããïŒããæ€çŽ¢ã«æé©ãªããŒã¿ã®ä¿ææ¹ãPostgreSQLã®ãŠãŒã¶å®çŸ©é¢æ°ã®å®è£
ãªã©ãæ§ã
ãªè§åºŠããé«éåãæ€èšããŠããã ããŸããã ç¹ã«å°è±¡çã ã£ãã®ã¯ããã é«éåãå³ãã ãã§ã¯ãªãããäºæ¹ãšãã äžå¿
èŠã«ãªãããªæäŸã¯ããªãïŒé床é¢ãèæ
®ããŠæéã¯é¢æ£å€ã§ä¿æããªã©ïŒ 粟床ãèæ
®ããæ©èœã®æäŸïŒããŒã¯ãŒãæ€çŽ¢ã«ãããŠãåèŽããã«ã©ã ã«å¿ããŠäžŠã³é ã倿Žããããžãã¯ã®å®è£
ããªã©ïŒ ã®ããã«ã æ©èœé¢ã§ãç©æ¥µçã«å·¥å€«ããããŠããç¹ã§ããã ããã«ã¯ãæçµæ¥ã«æ¯ãè¿ããããŠãããšãã第1ã¿ãŒã ã®ã€ã³ã¿ãŒã³çã ãäœã®ããã®é«éåã§ããã®ãããšãã芳ç¹ããšãŠãéèŠã§ããããšãåãããŸããããã®ããã«ãé«éå以å€ã«ããUI/UXã®èšèšãããŒã¿ã¯ã¬ã³ãžã³ã°ã䜵ããŠèæ
®ããå¿
èŠãããã®ã ãšå®æããŸããã ãšãã£ããã£ãŠããŸããããã¡ãã¯æ£ã«ãã®ãšããã§ããã®çºèšã«ã¯ç§ãæããèãæã¡ãŸãããå®éãä»åã®ã€ã³ã¿ãŒã³ã·ããã§ã¯UI/UXã³ãŒã¹ãããŒã¿ã¯ã¬ã³ãžã³ã°ã³ãŒã¹ããããŸãã顧客ã«äŸ¡å€ãæäŸããããã«ãããããã¯å¯ã«é¢é£ããŠããããã§ãããã£ã5æ¥éã§ãã®çºèšã«è³ãåœŒã®æé·é床ã«å€§å€æåããæ¬åœã«ãããã¬ãã«ã®åªç§ãªåŠçã®æ¹ã«æ¥ãŠé ãããã ãªãšå®æããæ¬¡ç¬¬ã§ãã ããŸã ããããæ¬ é人ã«åŠã¶ SQLåŸ¹åºæåæž èè
ïŒãã㯠åºç瀟ïŒç¿æ³³ç€Ÿ (2008/2/7) SQLã®åºç€åºãçšã«ãäºå課é¡ãšããŠãé人ã«åŠã¶ SQLåŸ¹åºæåæžããšããæ¬ãèªãã§ããããŸããã SQLã¯éåæåã®èšèªã§ãããšããããšãïŒãã€ãããããïŒïŒæžããŠãããæç¶ãåèšèªãšæ ¹æ¬ææ³ãç°ãªãããšãããåãããŸããå¿çšç·šãšäœµããŠãšãŠããããããªã®ã§ãSQLå
¥éè
ã®æ¹ã«ãã²èªãã§ããã ãããæ¬ã§ãã æ¬¡åäºå 次åã¯ãããµããŒã€ã³ã¿ãŒã³ã¡ã³ã¿ãŒãèªãã€ã³ã¿ãŒã³çã®åãçµã¿ãåŸç·šãããšããŠãããŒã¿ã¯ã¬ã³ãžã³ã°ã³ãŒã¹ã®åãçµã¿ãã玹ä»ããŸãããæ¥œãã¿ã«ïŒ
2017幎æ°åå
¥ç€Ÿãšã³ãžãã¢ã®æ°è°·ã§ãããã©ã«ã·ã¢ã§ã¯ãæ€çŽ¢ãšã³ãžã㢠å
Œ ãã€ãããã¯ãã©ã€ã·ã³ã°ã®æ§æ³äŒç»/ç ç©¶éçº/äºæ¥éçºãæ
åœããŠããŸããåŠçæä»£ã¯æ°çå·¥åŠã®ç ç©¶ãããŠããŸããã ä»åã¯ã å
æ¥ã玹ä»ãã京éœå€§åŠãšã®å
±åèšè
äŒèŠ ã§çºè¡šããç ç©¶ããŒãããã€ãããã¯ãã©ã€ã·ã³ã°ãã«ã€ããŠãå
·äœçãªæ§æ³ãã説æããŸãã ãã€ãããã¯ãã©ã€ã·ã³ã°ãšã¯ å
æ¥ã USJ ãå
¥å Žåžã«å€åäŸ¡æ Œæ§ãå°å
¥ããããšãçºè¡š ãã話é¡ãšãªã£ãŠãããã€ãããã¯ãã©ã€ã·ã³ã°ãäžèšã§èšããšããã€ãããã¯ãã©ã€ã·ã³ã°ãšã¯ãéèŠãšäŸçµŠã«å¿ããŠäŸ¡æ Œã調æŽãã 売ãæãšè²·ãæã®é©åãªãããã³ã°ãå®çŸããææ®µ ã§ããèªç©ºåžãããã«ãã€ãã³ããã±ãããªã©ã§åºãã売ãæãè²·ãæãããããŒãªãã®ä»çµã¿ããããå€ãã®åæã«é©çšããŠäžã®äžã«åºããŠãããããšããã®ããã®ç ç©¶/äºæ¥ã®è¶£æšã§ãã çµæžç£æ¥çã®ã¬ããŒã ã§ãã2030幎代ã«ç¢ºå®ã«èµ·ããæªæ¥ãšããŠãã€ãããã¯ãã©ã€ã·ã³ã°ãåãäžããããŠãããä»åŸã©ãã©ãåºãã£ãŠããããšãäºæ³ãããŠããŸãã åŸæ¥ãã€ãããã¯ãã©ã€ã·ã³ã°ã«ã¯é©æ§ããã ãŸããåŸæ¥ã®ãã€ãããã¯ãã©ã€ã·ã³ã°ã«ã€ããŠãèªç©ºåžãäŸã«ã説æããŸãã賌å
¥å¯èœãªåº§åžæ°ãå€ã売ãå§ãæãå
ã®äºå®ã決ãŸã£ãŠããè²·ãæã¯å°ãªãéèŠãå°ããããã«ãèªç©ºåžã¯æ¯èŒçå®äŸ¡ã§è³Œå
¥ããããšãã§ããŸããäžæ¹ããã©ã€ãçŽåæã¯ã賌å
¥å¯èœãªåº§åžæ°ãå°ãªãéèŠã倧ãããªãããã«ãé«é¡ã«ãªããšãã£ãä»çµã¿ã§å°å
¥ãããŠããŸãã ãã®æ¹æ³ãé©ããã®ã¯ãããã®æ¥ãããªããšãããªãããšããæ§è³ªã®åŒ·ãåæã§ããïŒä»ã«ãããããçç±ã¯ãããŸããããã§ã¯å²æïŒãããã«èªç©ºåžãããã«ãã€ãã³ããã±ãããªã©ã«ã¯å
è¡ããŠå°å
¥ãããŠããŸããéã«ãããã®æ¥ãããªããŠããããªããšããæ§è³ªãæ¯èŒç匷ããµãŒãã¹ïŒæ ç»é€šãªã©ã®ã¬ãžã£ãŒãå»çãµãŒãã¹ãçŸå®¹é¢ãªã©ïŒã«ã¯ã ãªããªãé©çšããã«ããçŸç¶ ããããŸãã ãã€ãããã¯ãã©ã€ã·ã³ã°ãåºãã£ãŠããææµãèžãŸãããšããã®é©æ§ã®æç¡ã®åé¡ã¯é¿ããŠéããªãéã§ãã ãã©ã«ã·ã¢ã®æ±ããã€ãããã¯ãã©ã€ã·ã³ã°ãšã¯ ãæéãÃãå©çšé »åºŠãã®èгç¹ãèšããå
šäœæé©ãæ±ãã çç®ããã®ã¯ã 売買ã«ãããå
±éæ§é ã åšåº«ã®æŠå¿µã䌎ãããããååã®å£²è²·ã«ã¯ããæäŸå¯èœãªæ ãåããŠããããšããå
±éããæ§è³ªããããæ ã®åãŸãå
·åã®ãã©ããããæ©äŒæå€±ã§ãããšãããŠããŸããæã
ã¯ãèªç©ºåžãæ ç»é€šãåŒããŠã¯ãµãŒãã¹ã«éããã¢ãã«è³ããŸã§å
±éããããã®ãæ ãåãããæ§é ã«çç®ããããããåæã®æ ã å¹ççã«åããŠããã«ã¯ ãšããã¢ãããŒãã§ãã€ãããã¯ãã©ã€ã·ã³ã°ãæããŠããŸãã ãããããŒã¹ãšãã以äžã®èãæ¹ãããã©ã«ã·ã¢ã®ããããšããŠããã¢ãããŒãã§ãã äžåäžæ¥ãšããåäœã§ã¯ãªããäžå®æéã§ã®ãæ ããšèãã å人ã®å©çšé »åºŠ/å©çšé¡ãšç©ºãç¶æ³ãå
ã«ãã人ããšã«é©åãªäŸ¡æ Œãšã¿ã€ãã³ã°ãæç€ºãã ãããæ¯æ¥ãå
šãŠã®å©çšè
ã«å¯ŸããŠå®æœããããšã§ãå
šäœãšããŠå¹ççã«æ ãåããæ©äŒæå€±ãè§£æ¶ãã ãã®èãæ¹ã¯ã€ãŸããããã®ååããããã§å£²ããšããã®æ ã®äœïŒ
ãåãŸãã®ãããšãã£ããããªãååäžäœãäžã€ãšããäŸ¡æ Œèšå®ã§ã¯ãªããã人ã«ãã€ãããã§å©çšããŠããããããšãã£ãã å人åäœã§ã®ãã€ãããã¯ãã©ã€ã·ã³ã° ãšããŠèŠãããšãã§ããŸãã ãã€ãããã¯ãã©ã€ã·ã³ã°ã®æ±çšçè«åµåºãž å©çšé »åºŠãšç©ºãç¶æ³ãå
ã«æ©äŒæå€±ãè§£æ¶ããŠãããã®ã¢ãããŒãã¯ãæ°ççæ§é ãšããŠåæéã«å·®ã¯ãããŸãããããã«ãåºãé©çšã§ããæ±çšçè«ãäœãããšãã§ãããšèããŠããŸããä»ã¯ãŸã ãªããã€ãããã¯ãã©ã€ã·ã³ã°ã«é¢ããæ±çšçãªæ°çã¢ãã«ãããããã£ãã¢ãããŒãã§æ§ç¯ããŠããããšããŠããŸãã ãŸãšã ããããã¹ã¿ãŒããããã®ç ç©¶/äºæ¥ã¯ãããŸããŸãªæ¥çã§æ©äŒæå€±ãè§£æ¶ãããããšãç®æããŠãããéã®ããšããŠã¯ã ããŒãããŒäŒæ¥ãšå
±ã«ããŸããŸãªæ¥çããŒã¿ã䜿ã£ãŠå®èšŒå®éšãç¹°ãè¿ããå°ããã€åœ¢ã«ãªã£ãŠãããã®ã ãšæã£ãŠããŸãã ãŸããèšè
äŒèŠã§ã倿°è³ªåã®ãã£ãããå人ããšã«äŸ¡æ Œãå€ããããšããæåã¯æ ¹ä»ãã®ãïŒããšããåé¡ã«ã€ããŠãã人ã
ã®çŽåŸæãåŸããããã©ãããéµãšãªããšèããŠããŸããå
¬ææ£å€§ã§ãã§ã¢ãªçè«ãšããŠã®ç ç©¶éçºãé²ããäžã®äžã«æµžéãããã€ãããã¯ãã©ã€ã·ã³ã°ã®åºç€äœããç®æããŠãããŸãã
çµå¶äŒç»å®€ã®èŠåã§ãããã©ã«ã·ã¢ã¯å
æ¥ã京éœå€§åŠãšããã€ãããã¯ãã©ã€ã·ã³ã°ã«ã€ããŠã®å
±åç ç©¶éå§ããçºè¡šããèšè
äŒèŠãéœå
ã§éå¬ããŸãããäŒå Žã«ã¯ãããããã®å ±éé£ã«ãéãŸãããã ããçºè¡šããå
容ã«ã€ããŠã¯æ°èããããã¡ãã£ã¢ãªã©å€æ°ã®åªäœã§å€§ããåãäžããŠããã ãããšãã§ããŸãããä»åã¯ãã®èå°è£ãã玹ä»ããŸãã ãã¬ã¹çºè¡šã®åºæ¬ã®ããã èšè
äŒèŠã®æºåãšããã°ãçºè¡šã¹ã©ã€ãã®äœæããæãããã¡ãã£ã¢ã®æ¹ã
ãžã®ãé£çµ¡ãåœæ¥ã®ã¿ã€ã ã¹ã±ãžã¥ãŒã«çå®ãäŒå Žã»åžäŒé²è¡åœ¹ã®éžå®ãå°éå
·ã®çšæ......ãªã©ããããããã¹ãããšããããŸãããäžçªå¿ããŠã¯ãããªãæºåã¯ãããã¬ã¹ãªãªãŒã¹ã®äœæãã§ãããã¬ã¹ãªãªãŒã¹ãšã¯ãå ±éæ©é¢ã«åããŠèªç€Ÿã®æ
å ±ãçºä¿¡ããææžãä»åã®å Žåã¯ãäŒèŠåœæ¥ã«äŒå Žã§å ±éé£ã«é
åžããã»ãã忥ã«ãã¬ã¹çºè¡šãšããŠèªç€Ÿã®ã³ãŒãã¬ãŒããµã€ãããã¬ã¹ãªãªãŒã¹é
ä¿¡ãµã€ãã§æ²èŒããç®çã§äœæããŸãã åœç¶ã®ããšãªãããåºå ±æ
åœè
ã®ç§èªèº«ãå
容ãçè§£ããŠããªããšææžãäœæã§ããªãã®ã§ãä»åã®ç ç©¶ã®è©±ãåºå§ããé ãããé¢ä¿è
ãéãŸãæã¡åããã«ã¯ãªãã¹ãé¡ãåºãããã«ããŠããŸãããæåã®é ã¯ä»ã®ã¡ã³ããŒã話ããŠããå
容ãçè§£ã§ããã«ãåæ©çãªè³ªåãããŠåšå²ã«å¿é
ã®çŒå·®ããåããããããšãïŒæ°ã®ããïŒïŒãããããªãçšèªã¯ãã£ãããšGoogleå
çã«èãããšããããŸãããããããäœåºŠã話ãèããã調ã¹ããããŠãããã¡ã«ãå°ããã€çè§£ãæ·±ããŠãããŸããã ïŒäœåºŠãä¿®æ£ãéããŠå®æãããã¬ã¹ãªãªãŒã¹ã¯ ãã¡ã ïŒ ããã¯ããã«ãäŒèŠã«éã«åããªã ãã¬ã¹ãªãªãŒã¹ã®æºåã¯é 調ã«é²ãã§ãã£ãã®ã§ãããäŒèŠã®æ¬çªçŽåãŸã§ç§ãã¡åºå ±ã¡ã³ããŒããããããããŠããã®ã¯ãç»å£è
ã®åŸãã«ç«ãŠãããã京éœå€§åŠããšãFORCIAãã®ããŽãå°åãã倧ããããã«ãçãããèšè
äŒèŠã®æ åãåçã§ã芧ã«ãªã£ãããšãããããšæããŸããããã®ããã«ã£ãŠæ¡å€ãµã€ãºã倧ããã®ã§èªåãã¡ã§äœãã®ã¯é£ããããå°éã®å¶äœäŒç€Ÿã«äŸé ŒããŠãæéãããããã§ãã å®ã¯ãä»åã®äŒèŠã®éå¬ã確å®ããã®ã¯æ¬çªãŸã§ããšæ°æ¥......ïŒãšããã¿ã€ãã³ã°ãæ¡ã®å®ãã©ã®å¶äœäŒç€Ÿããã§ããéã«åããªãããç¡çããšæããç¶ããŸããããããªã£ããããèªäœãããããªãã......ãšåã°ããããã¢ãŒããããã§ãããã¡ããšã§é§ã蟌ãã æå€§æå°å·äŒç€Ÿããã«ãã€ã¬ã®ã¥ã©ãŒãªå¯Ÿå¿ãããŠããããã®ãªã®ãªäœãšãå¶äœããŠããããããšã«ãªããŸããïŒ ãšã¯ãããã©ãé 匵ã£ãŠãä»äžããã¯æ¬çªåæ¥ã®å€ãšã®ããšãåœæ¥ãŸã§å®æç©ãèŠãããªãããããã¡ããšä»äžãã£ãŠãããããŸããäœããã®äºæ
ã§éã«åããªãã£ããã©ããããããšããã£ãšãã€ãã€ããŠããŸãããããåœæ¥ãäŒèŠæ¬çª1æéåãããåã«ç«æŽŸãªããã«ãäŒå Žã«å±ããŠãã²ãšãŸããããäŒèŠæ¬çªã§ã倧掻èºã§ããïŒããããïŒã 倩æ°ã峿¹ããçæ³ã ã£ãèšè
äŒèŠ ããã€ãã倩æ°ãç¶ããŠããæ±äº¬ã§ããããé¢ä¿è
ã®èª°ãããæŽãç· or 女ããªã®ããäŒèŠåœæ¥ã¯æããæ°æã¡ã®è¯ãå¿«æŽã§ãããäŒèŠã®äŒå Žã¯éœå
ã«ãã京éœå€§åŠã®ç£åŠé£æºæ¬éšãç§ãã¡åºå ±ã¡ã³ããŒã®ã»ãã«ã匷åãªå©ã£äººç€Ÿå¡ãã¡ã«åä»ã»æ¡å
ããäŒå Žèšå¶ãèšé²ä¿ãªã©ãæ
åœããŠããã£ãŠæºåã¯äžç«¯ã§ãã åé ã«ããäŒããããšãããåœæ¥ã¯æ¬åœã«å€ãã®å ±éé£ã®æ¹ã
ã«ãæ¥å Žããã ããç¡äºã«èšè
äŒèŠãéãããšãã§ããŸãããäŒèŠã§ã¯ã京éœå€§åŠã®æ¢
éææãšåŒç€Ÿã®ä»£è¡šå±ä»£ãçµå¶äŒç»å®€é·æŽ²å·»ããšã³ãžãã¢å
Œç ç©¶å¡ã®æ°è°·ãç»å£ããæ¬å
±åç ç©¶ã«ã€ããŠã話ãããŸããã çœç±ã®è³ªçå¿ç äŒèŠçµç€ã«ã¯è³ªçå¿çã®æéãèšããŠããã®ã§ãããäºæ³ä»¥äžã«ããããã®è³ªåãããã ãããããã§å€§çãäžããïŒãªãã¹ããŸãã¹ããªãèšè
ã®æ¹ã
ããã®è³ªåã«åçã§ããããã«äºå®ããŠããæéã倧å¹
ã«æ¡å€§ããŸããããã®ããšããããã€ãããã¯ãã©ã€ã·ã³ã°èªäœãäžéçã«ã泚ç®ãããŠããå€ä»ãã®ææ³ãªã®ã ãšããããšã宿ããã®ãšåæã«ã京éœå€§åŠãšãã©ã«ã·ã¢ãè¡ãå
±åç ç©¶ã®ããŒãã«ãèå³ããã£ãŠããã ããã®ã§ã¯ãªãããšæå¿ããæããŠããŸãã ãããªçœç±ãã質çå¿çã¿ã€ã ã§ãå ±éé¢ä¿è
ã®æ¹ã
ããå®éã«ããã ãã質åã®äžéšãã玹ä»ããŸãã äœå¹ŽåŸã«å®è£
ããã®ãïŒã¹ã±ãžã¥ãŒã«æã¯ïŒ ã人ã«ãã£ãŠæç€ºããäŸ¡æ Œãå€ããããšããäŸ¡æ Œå€åã¯ãã§ã«è¡ãããŠããã®ãïŒ ã人ã«ãã£ãŠæç€ºããäŸ¡æ Œãå€ããã®ã¯äžå
¬å¹³ã ããšããèããªã©ã瀟äŒçã«ã¯ãã€ãããã¯ãã©ã€ã·ã³ã°ã«åçºããããšæãããå¿ççãªéšåã«ã€ããŠã¯ã©ãæããïŒ ãã€ãããã¯ãã©ã€ã·ã³ã°ã®æ°ããã¢ãã«ãå®è£
ããå Žåã®ãµãŒãã¹äŸçµŠåŽãžã®ã¡ãªããããŠãŒã¶ãŒåŽãžã®ã¡ãªãããããããæŽçããŠèª¬æãããšïŒ äžèšã¯ã»ãã®äžéšã§ããããããã®åçãšããã¬ã¹ãªãªãŒã¹ãšäŒèŠã§çºè¡šããæ
å ±ããããŠãå¥éåæããŠããã ããå
容ãããã芧ã®ãããªèšäºãæžããŠããã ããŸããïŒ â æ¥çµxTECHïŒ18/9/28ïŒ ãã©ã«ã·ã¢ãšäº¬å€§ããã€ãããã¯ãã©ã€ã·ã³ã°ã®å
±åç ç©¶ãå
¬æ£ãªå€ä»ãç®æã https://tech.nikkeibp.co.jp/atcl/nxt/news/18/02829/ â CNET JapanïŒ18/9/28ïŒ é絊ãã©ã³ã¹äžæŽåã®è§£æ¶ã«åããæé©äŸ¡æ Œèšå®ãç ç©¶--ãã©ã«ã·ã¢ãšäº¬éœå€§åŠ https://japan.cnet.com/article/35126288/ â æ¥æ¬çµæžæ°èé»åçïŒ18/10/1ïŒ ããã€ãããã¯å€ä»ããå
±åç ç©¶ãã©ã«ã·ã¢ã»äº¬å€§ https://www.nikkei.com/article/DGXMZO35947710R01C18A0XY0000/ â ITmediaïŒ#SHIFTïŒïŒ18/10/3ïŒ ãµãŒãã¹ã¯å€åäŸ¡æ Œãåœããåã«ïŒãã©ã«ã·ã¢ãšäº¬éœå€§åŠãå
±åç ç©¶ http://www.itmedia.co.jp/business/articles/1810/03/news043.html â æ¥çµç£æ¥æ°èïŒ18/10/4ïŒ ã¬ãžã£ãŒäŸ¡æ Œé絊ã§å€åæ
å ±æ€çŽ¢ã·ã¹ãã ã®ãã©ã«ã·ã¢ https://webreprint.nikkei.co. jp/r/LinkView.aspx?c= 7E63B54D37E34D24A04647D3F2A2A2 FC èšäºãèªããšãç±ã質çã®ç«¯ã
ãçµæ¶ãšãªã£ãŠç¹ã蟌ãŸããŠããããšãããããããŸããã å
·äœçã«ã©ã®ãããªç ç©¶ãè¡ãã®ãããã®è©³çްã«ã€ããŠã¯è¿æ¥äžã«ç ç©¶å¡ã®æ°è°·ããèšäºã«ããŠãããäºå®ã§ãããèå³ãããæ¹ã¯ããã¡ãã®èšäºããã²æ¥œãã¿ã«ããŠããŠãã ããïŒ
ããã«ã¡ã¯ïŒæè¡æ¬éšã»ã€ã³ã¿ãŒã³ã·ããäŒç»ããŒã ã®å·å£ã§ããæ¢
éšããã£ãšããéã«æããããããå€ããã£ãŠããŸãããå€ãšããã°...ããããæãæµ®ãã¶ãã®ã¯ãããŸãããåŠçã®çæ§ã®äžã§ã¯ã€ã³ã¿ãŒã³ãããããšèããŠããæ¹ãå€ãã®ã§ã¯ãªãã§ããããïŒãã©ã«ã·ã¢ã§ã¯ãèªåã®ç ç©¶ãçµéšã掻ãããŠæŽ»èºããããšã³ãžãã¢å¿æã®åŠçã®çæ§ã«åãããã¯ã¯ã¯ã¯ãããããªã€ã³ã¿ãŒã³ã·ããããçšæããŸããïŒïŒãã¡ããæçµŠã§ãïŒïŒ æŠèŠã¯äžèšãªã³ã¯ãã芧ãã ãããïŒçŸåšã¯çµäºããŠãããŸãïŒ FORCIA Summer Internship 2018 RustãAlexa... ãã©ã«ã·ã¢ãªãã§ã¯ã®éžã¹ãïŒã³ãŒã¹ æ€çŽ¢ã¢ããªã±ãŒã·ã§ã³éçºã³ãŒã¹ æ€çŽ¢é«éåã³ãŒã¹ Rustæ€çŽ¢ãšã³ãžã³éçºã³ãŒã¹ Alexa Skilléçºã³ãŒã¹ Google Hotel Adsé
ä¿¡æé©åã³ãŒã¹ ããŒã¿åæã³ãŒã¹ ããŒã¿ã¯ã¬ã³ãžã³ã°ã³ãŒã¹ UI/UXã³ãŒã¹ ïŒã³ãŒã¹ãçšæããŠããã€ã³ã¿ãŒã³ã·ãããªããŠããªããªãç¡ãã®ã§ã¯ãªãã§ãããã...ïŒããã°ã©ãã³ã°ã®çµéšãããæ¹ãæ
å ±ç³»ã®ç ç©¶ããããŠããæ¹ã®ã¿ãªãããçæ°ç³»ã®ç¥èã»çµéšãããæ¹çã«å¹
åºãæ¥ãŠããã ãçºã«ããããã®ã³ãŒã¹ããçšæããŸããã ããã§ã¯ããã€ãã®ã³ãŒã¹ãã玹ä»ããŸãã â æ€çŽ¢ã¢ããªã±ãŒã·ã§ã³éçºã³ãŒã¹ ã¹ã¿ã³ããŒããªã³ãŒã¹ãšããŠãçšæããŸããããã©ã«ã·ã¢ã§ã¯ãšã³ãžãã¢ã®å€§åãæ€çŽ¢ã¢ããªã±ãŒã·ã§ã³ã®éçºãè¡ã£ãŠããããã®æ¥åã«å®éã«æºãããã³ãŒã¹ã§ããæ
åœããã¢ããªã±ãŒã·ã§ã³ã«é¢ããŠã仿§ã®æ€èšããæ°èŠæ©èœã®å®è£
ãŸã§ãè¡ããŸãã倧ææ
è¡äŒç€Ÿæ§ãMROæ¥çãçŠå©åçæ¥çã®å€ããå°å
¥ããŠããæ€çŽ¢ãã©ãããã©ãŒã ãSpookãã«èŸŒãããããšã³ãžãã¢ã®ãã ãããå®éã«æãåãããšãã§ããã³ãŒã¹ã§ãã ⢠Rustæ€çŽ¢ãšã³ãžã³éçºã³ãŒã¹ ãã©ã«ã·ã¢ã§ã¯æ°ããæ€çŽ¢ãšã³ãžã³éçºãæ¥ã
è¡ã£ãŠãããŸãããã®ãã¡ã®äžã€ã§ã¯ãRustãšããçŸåšã§ã¯ãŸã åçšå©çšãå°ãªãããã°ã©ãã³ã°èšèªã䜿çšããŠããŸãããã®ã³ãŒã¹ã§ã¯ãããªããã°ã©ãã³ã°èšèªã®ãã¥ãŒãŠã§ãŒãïŒïŒïŒãRustã䜿ã£ãŠçéæ€çŽ¢ãšã³ãžã³ãéçºã§ããŸãã â£Alexa Skilléçºã³ãŒã¹ æè¿è©±é¡ã®ã¹ããŒãã¹ããŒã«ãŒããã©ã«ã·ã¢ã§ã¯Alexaã§ã®æ€çŽ¢Skillã®éçºãè¡ã£ãŠããŸããã¹ããŒãã¹ããŒã«ãŒã®éçºã¯ãšã«ããå¥¥ãæ·±ã...ïŒä»¥åã«ã åœããã°ã§ç޹ä»ããŠããŸãã ãwebã¢ããªãªã©ãšæ¯èŒããŠãç»é¢ããªãã¹ããŒãã¹ããŒã«ãŒã§ã¯ãã¹ããŒãã¹ããŒã«ãŒã§ã¯ã¢ãŠããããã®æ
å ±éãå§åçã«å°ãªãããããŠãŒã¶ãŒã®æ±ããæ€çŽ¢çµæããã³ãã€ã³ãã§è¿ãå¿
èŠããããŸãããã®ãããªé³å£°UIã®ç ç©¶ãããŠã¿ããæ¹ããã²â£Alexa Skilléçºã³ãŒã¹ãžãå¿åãã ããïŒ ïŒã³ãŒã¹ãã©ãã«å¿åããããæ©ãŸããããšããæ¹ã¯ããã²ãã®æšããšã³ããªãŒã·ãŒãã«èšèŒããŠãã ãããç ç©¶å
容ãçµéšãèæ
®ãããæ¡å
ããããšãã§ããŸãã ã¡ã³ã¿ãŒã¯ãã©ã«ã·ã¢ãããã¬ãã«ã®ãšã³ãžã㢠åªç§ãªã€ã³ã¿ãŒã³çã«ã¯åªç§ãªã¡ã³ã¿ãŒã...ãšãã¡ã³ã¿ãŒã¯ç€Ÿå
ã§ããããã¯ã©ã¹ã®ãšã³ãžãã¢ã«äŸé ŒããŸããã äŸãã°ãâŠããŒã¿ã¯ã¬ã³ãžã³ã°ã³ãŒã¹ ã®ã¡ã³ã¿ãŒã¯ããŒããšã³ãžãã¢ã®å
å±±ããã«ãé¡ãããŸãããå
å±±ããã¯æ±äº¬å€§åŠå€§åŠé¢çåŠç³»ç ç©¶ç§ã忥ããæ°åïŒå¹Žç®ã倧忡件ã®èæ³¢ãäœåºŠãä¹ãè¶ããäžã§ãé¡§å®¢ã®æã€å
ããŒã¿ã«ã€ããŠç ç©¶ãéããŠããŸãããSpookã§ã¯ããŠãŒã¶ãŒãæ¬åœã«äœ¿ããããæ€çŽ¢ãã©ãããã©ãŒã ãæäŸããã¹ãéçºãè¡ã£ãŠãããŸãããæ€çŽ¢çµæã«è¡šç€ºããã®ã¯ãããŸã§å
ã®ããŒã¿ããŠãŒã¶ãŒãæ€çŽ¢çµæã«çŽåŸæãæã€ããã«ã¯ãå
ã®ããŒã¿ã®ç²ŸåºŠãéãæŽåæ§ãå¿
èŠãšãªããŸãããã®ã³ãŒã¹ã§ã¯ãæ©æ¢°åŠç¿ãé§äœ¿ããŠå
ããŒã¿ã®ç ç©¶ãè¡ã£ãŠããã ããŸããå
å±±ããã¯ãæ©æ¢°åŠç¿ãå§ããšããæå
ç«¯ã®æè¡ã§ããžãã¹ã®èª²é¡è§£æ±ºãããééå³ããåªç§ãªåŠçã®çããã«ãã²å³ãã£ãŠé ãããã§ããããšãã¡ã³ã¿ãŒã®äŸé Œãå¿«ãåŒãåããŠãã ãããŸãããåœããã°ã§ã¯ãã¿ãã§åªããå
å±±ããã® ã€ã³ã¿ãã¥ãŒèšäº ãæ²èŒããŠããŸãã®ã§ããã²äœµããŠã芧ãã ããã ãã¡ãããã¡ã³ã¿ãŒä»¥å€ã®ãšã³ãžãã¢ãé©å®ã€ã³ã¿ãŒã³çããµããŒãããŸãïŒSlackã§å°ã£ãŠããããšãæžã蟌ããšãçã§åªãããã©ããŒããŠããããããªé°å²æ°ã§ãã äŒãããã®ã¯æè¡ã ããããªã ã€ã³ã¿ãŒã³ã·ããã§ã¯ããã©ã«ã·ã¢ã®æè¡ä»¥å€ã«ããäŒããããããšããããããããŸããéãã»ãããã¯ããžã®ãã ãããããŠãŒã¶ãŒãžã®æããããæè¡åãçšããããžãã¹çããšã³ãžãã¢ãæã€ã¹ã "ãšã³ãžãã¢ãªã³ã°æè¡ä»¥å€ã®æè¡" ããã©ã«ã·ã¢ã®ãšã³ãžãã¢ããçŽæ¥åŠã¹ãæ©äŒã«ããããšæããŸãã ãŸããã€ã³ã¿ãŒã³ã·ããæéäžã¯ç€Ÿå¡ãšã®ã©ã³ãäŒãªã©ã®äº€æµã®å ŽãèšããŸããã©ããªäººãåããŠããã®ãïŒã©ããªä»äºå
容ãªã®ãïŒçŠå©åçã¯ã©ããã£ãŠäœ¿ã£ãŠããã®ãïŒãªã©ãæ°ã«ãªããã€ã³ãã«ã€ããŠã©ãã©ããèããã ããïŒãã©ã«ã·ã¢ç€Ÿå¡ã®æã€é°å²æ°ã«æ¹ãããŠå
¥ç€Ÿã決ãã瀟å¡ãå€ãã瀟å¡ãšã®äº€æµãéããŠå®éã«ãã®é°å²æ°ãæããŠããã ããã°ãããªãšèããŠããŸãã èªåã®åŒ·ã¿ã掻ããããåŠçã®çæ§ããåŸ
ã¡ããŠãããŸã ãã©ã«ã·ã¢ã®æ¬¡äžä»£ã®ãã¯ãŒãšãªããããªã€ã³ã¿ãŒã³çãåéããŠããŸãã äžèšã®ãªã³ã¯ã®äžã®å¿åãã©ãŒã ããããèªèº«ã®ç ç©¶å
容ã»çµéšã»èå³çããã²ã¢ããŒã«ããŠãã ããïŒ FORCIA Summer Internship 2018 ïŒçŸåšã¯åéãçµäºããŠãããŸãïŒ ã€ã³ã¿ãŒã³ã·ããäŒç»ããŒã ã»ç€Ÿå¡äžåãçæ§ã®ãå¿åããåŸ
ã¡ããŠãããŸãïŒ
æè¡æ¬éšã®éŸå³¶ã§ããæè¿Microsoftã GitHubãè²·åãããšãããã¥ãŒã¹ ãäžéãéšãããŠããŸãããGitHubãMicrosoftåäžã«å
¥ã£ãåŸãä»ãŸã§ã®äžç«çãªç«å Žãä¿ãããããæ³šç®ããããšããã§ãã ãããªäžãGitHubã®ç«¶åãµãŒãã¹ã§ããGitLab㫠泚ç®ãéãŸã£ãŠããŸã ããã©ã«ã·ã¢ã§ããœãŒã¹ã³ãŒã管çã«GitLabãå©çšããŠããã®ã§ã仿¥ã¯GitLabã®å§ãæ¹ããã©ã«ã·ã¢ã§ã®éçšã«ã€ããŠã玹ä»ããããšæããŸãã GitLabãšã¯ GitLabãšã¯Gitãªããžããªãã¹ãã£ã³ã°ããããœãããŠã§ã¢ã§Gitã¬ããžããªã®ç®¡çã¯ãã¡ããã®ããšãIssueãWikiãMerge Request(GitHubã§èšãPull Request)ãªã©ã®æ©èœãåããããŠããŸããæ©èœãšããŠã¯GitHubãšéè²ãªããç¹ã«CIåšãã¯GitLabã®æ¹ãåãå
¥ããŠãããGitHubããåªäœã§æ©èœãè±å¯ã§ãã ãŸããGitHub㯠GitHub.com ã§ã¯ã©ãŠããµãŒãã¹ãšããŠã®æäŸãåºæ¬ã§ããªã³ãã¬ãã¹ã§åããã«ã¯æåã®GitHub Enterpriseãå©çšããå¿
èŠããããŸããGitLab㯠GitLab.com ã®ããã«ã¯ã©ãŠããµãŒãã¹ããããªããããªã³ãã¬ãã¹ãã€ç¡åã§ãã©ã€ããŒããªç°å¢ã«æ§ç¯ããããšãå¯èœãªã®ã倧ããªé
åã®äžã€ã§ãã ãã©ã«ã·ã¢ã§ãGitLabããªã³ãã¬ãã¹ã§å©çšããŠãããIssueãMerge RequestãCIæ©èœãå©çšããéçºãé²ããŠããŸãã GitLabãã¯ããã ãªã³ãã¬ãã¹ã§GitLab Community Editionãå§ããŠã¿ãŸãããã å
¬åŒããŒãžã®ã¬ã€ã ã詳ããã®ã§ãã¡ãã«åã£ãŠå
¥ããŠããã®ãè¯ãã§ããïŒdockerã§ã®æ§ç¯æ¹æ³ãªã©ããããŸããïŒ CentOS6ç³»ãäŸãšãããã®ããã¡ãã # http, sshã¢ã¯ã»ã¹ã®èš±å¯ sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh # å¿
èŠãªããã±ãŒãžã®ã€ã³ã¹ããŒã« sudo yum install postfix sudo service postfix start sudo chkconfig postfix on # gitlabã®ã€ã³ã¹ããŒã« curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash sudo yum -y install gitlab-ce ããã§æäœéã®æºåã¯å®äºã§ããã€ã³ã¹ããŒã«ãããµãŒãã«ãã©ãŠã¶ã§ã¢ã¯ã»ã¹ãããšã«ãŒããŠãŒã¶ã®èšå®ç»é¢ãžé·ç§»ããã¯ãã§ãã /etc/gitlab/gitlab.rb ã«èšå®ãã¡ã€ã«ãããã®ã§ãè²ã
ãšããã£ãŠã¿ããšè¯ãã§ããããæ°è¡ã§ç°¡åã«GitLabãå§ããããŸããã ãã©ã«ã·ã¢ã§ã®GitLabéçš ãã©ã«ã·ã¢ã§ã¯GitLabã Vagrant ã§ç®¡çãããVMäžã§åäœãããŠããŸããVagrantã®èšå®ãã¡ã€ã«(Vagrantfile)ã«ã¯ããããžã§ãã³ã°ã¹ã¯ãªãããæå®ã§ããã®ã§ãGitLabãæ§ç¯ããããã®ã¹ã¯ãªãããçšæããŠããã vagrant up ããã ãã§GitLabã®ç°å¢ãäœæãããããã«ããŠããŸãã Vagrantfile, provision.sh(ããããžã§ãã³ã°çšã¹ã¯ãªãã)ã¯äžèšã®ãããªã€ã¡ãŒãžã§ãã Vagrantfile Vagrant.configure(2) do |config| config.vm.box = "bento/centos-6.7" config.vm.hostname = "gitlab" #providerã¯libvirtãå©çš config.vm.provider "libvirt" do |libvirt| libvirt.storage_pool_name = "STORAGEPOOLNAME" libvirt.management_network_name = "NETWORKNAME" libvirt.management_network_address = "NETWORKADDRESS" libvirt.storage :file, :size => "40G" libvirt.memory = "8192" libvirt.cpus = "4" end config.vm.provision :shell, :path => "provision.sh" end provision.sh #!/bin/bash # GitLabã®ã€ã³ã¹ããŒã« yum install -y postfix cronie service postfix start chkconfig postfix on curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash yum install -y gitlab-ce-9.2.7-ce.0.el6.x86_64 # install versionã¯åºå® # GitLabã®èšå®ã®é©çš cp /vagrant/files/gitlab.rb /etc/gitlab/ gitlab-ctl reconfigure å
¬åŒã®ã¬ã€ãããäžèŠãªéšåã¯åã£ãŠããŸããVagrantfileã®ãããã£ã¬ã¯ããªã«èšå®ãã¡ã€ã« files/gitlab.rb ãäºåã«çšæããŠãããèªåã§äºã決ããèšå®ãåæ ãããããã«ããŠããŸãã éçšTips ãã©ã«ã·ã¢ã§ã®GitLabéçšã®Tipsãå°ãã玹ä»ããŸãã ãã·ã³ã¹ãã㯠äžèšã®Vagrantfileã«ã¹ããã¯ãèšèŒãããŠããŸãããCPU4ã³ã¢ãã¡ã¢ãª8GBã§éçšããŠããŸããå©çšäººæ°ã¯100äººã«æºããªãçšåºŠãªã®ã§ æšå¥šããããã·ã³ã¹ãã㯠ããã¯äœè£ãæã£ãã¹ããã¯ãšãªã£ãŠããŸãããããã¯ã°ã©ãŠã³ããžã§ããå€ãããšãå©çšã®ãµã¯ãµã¯æãéèŠãããããšãããã®å²åœãšãªã£ãŠããŸãã ãŠãŒã¶èªèšŒ ãã©ã«ã·ã¢ã§ã¯åå人ã®ãã·ã³ããã¡ã€ã«ãµãŒãã®ãŠãŒã¶èªèšŒã«LDAPãå©çšããŠããŸããGitLabã§ãæ°è¡çšåºŠã®èšå®ã§ LDAPãå©çšã§ãã ãããGitLabã®ããã«æ°ãã«ãŠãŒã¶ç®¡çã®ä»çµã¿ãªã©ãäœãå¿
èŠã¯ãããŸããã§ããã ããã¯ã¢ãã GitLabã¯èšå®ãã¡ã€ã« gitlab.rb ãš ããã¯ã¢ãããã¡ã€ã« ã ãããã°åŸ©å
ããããšãã§ããŸããGitLab.comã§ã¯2017幎㫠æ¬çªããŒã¿ããŒã¹ãåªå€±ããŠããŸã ãªããŠäºä»¶ããããŸããããé©åã«ããã¯ã¢ãããååŸãä¿ç®¡ããŠããã°æäºã®éãåé¡ã¯ãããŸãããVagrantã§VMãäœãçŽããããã¯ã¢ãããã¡ã€ã«ãé©çšããã°ãã®ã®15åçšåºŠã§åŸ©æ§ãå¯èœã§ãã ç°¡åã«ç°å¢ã埩å
ã§ããããšã¯ã¢ããããŒãã®æ€èšŒã®éã«ã圹ç«ã¡ãŸããURLãå€ããŠå¥ã®VMã§GitLabã®ãã©ãŒãµãŒããç«ã¡äžããããã§ã¢ããããŒãã宿œãåé¡ãªããã®æ€èšŒãæè»œã«è¡ãããšãã§ããŸãã æè»œã«ãªã³ãã¬ãã¹ã§å§ããããã®ã¯GitLabã®å€§ããªé
åã§ãããªã³ãã¬ãã¹ã ãšãã©ãã«æã®å¯Ÿå¿ã«ã³ã¹ãã...ãšæãããã¡ã§ãããæ°å¹ŽéçšããŠããäžã§å€§ããªãã©ãã«ãèµ·ããããšã¯ãªããå®å®ããŠçšŒåããŠããŸããçŸåšGitHubãå©çšãããŠããæ¹ããã®æ©äŒã«GitLabã®å©çšãæ€èšãããŠã¯ãããã§ããããïŒ
æè¡æ¬éšã®éŸå³¶ã§ããæ¬æ¥ã¯ãä»è©±é¡ã®ã¹ããŒãã¹ããŒã«ãŒã«ã€ããŠãæšå¹Žããæ¥æ¬ã§ãæ®åãé²ã¿ãæè¿ã§ã¯AmazonãGoogleãLINEãªã©ã®ãã¬ãCMã§ãç®ã«ããããšãå€ããªããŸããããçãããå®éã«äœ¿ã£ãŠã¿ãããšã¯ãããŸããïŒ ãã©ã«ã·ã¢ã§ã¯Amazon Alexaãå©çšããã¹ãã«ã®éçºã«åãçµãã§ããŸãïŒ JTBå®¿æ³æ€çŽ¢ã¹ãã« ïŒãæ§ã
ãªæ€çŽ¢ãµã€ãã®æ§ç¯ãè¡ã£ãŠãããã©ã«ã·ã¢ããVUIïŒVoice User InterfaceïŒã§ã®æ€çŽ¢ã·ã¹ãã ãæ§ç¯ããã«åœãããæããããšãçŽé¢ããé³å£°ç¹æã®åé¡ãã玹ä»ããããšæããŸãã ç»é¢ïŒGUIïŒãšé³å£°ïŒVUIïŒã®éã ãŸããåŸæ¥ãŸã§ã®PCãã¹ããã®ç»é¢ãéããã€ã³ã¿ãŒãã§ãŒã¹ïŒGUIïŒã§ã®æ€çŽ¢ãšAlexaãªã©ã®VUIã®éããèããŠã¿ãŸãããã ãŠãŒã¶ã®èªç±åºŠ åŸæ¥ãŸã§ã®GUIã§ã¯ãç»é¢ã®èšèšã§ãŠãŒã¶ã®è¡åãå¶éããããšãã§ããŸãããã©ãžãªãã¿ã³ããã«ããŠã³ã眮ããŠããã°ãŠãŒã¶ã¯ã©ãããéžãã§ãããŸãããæ¥ä»éžæã«ã¬ã³ããŒã眮ããŠããã°æ¥ä»ãéžæããŠãããŸãããããVUIã§ã¯ãæ¥ä»ãæããŠäžããããšèšã£ãŠããŠãŒã¶ããªããšçãããã¯ããããŸãããã¡ãããšæ¥ä»ãçããŠããããããããŸãããããæ¥ä»ã¯æ±ºããªãã§æ¢ããããããã£ã±ããããããæåã«æ»ã£ãŠããªã©ãšèšããããããããŸãããäœãæãæåŸ
ãã以å€ã®çºè©±ããŠãŒã¶ãããéã®å¯Ÿå¿ãèããŠããå¿
èŠããããŸãããŠãŒã¶è¡åã®èªç±åºŠã®é«ãã¯VUIã®å€§ããªç¹åŸŽãšèšããã§ãããã æ
å ±é ã¢ãŠããããã®æ
å ±éãGUIãšVUIã®å€§ããªéãã§ããGUIã§ã¯æåã§å€§éã®æ
å ±ãç»é¢ã«è¡šç€ºããããšãå¯èœã§ãäŒãããæ
å ±ã¯æåã®è²ã倧ãããå€ããããç»åãçšãããããããšã§ãŠãŒã¶ã«å¹ççã«å±ããäºãã§ããŸãããå¿
èŠã§ãªããããããªãæ
å ±ããšããããç»é¢ã«èŒããŠããããšã§ããŠãŒã¶ã«æ
å ±ãåæšéžæããããšããããšãå¯èœã§ãããããã¢ãŠãããããé³å£°ã®VUIã§ã¯æäŸã§ããæ
å ±éã¯éãããŠããŸããé·ã
ããåå説ææããŠãŒã¶ã¯èããŠããããªãã®ã§ããŠãŒã¶ã®æ±ããæ
å ±ããã³ãã€ã³ãã§ç°¡æœã«å±ããå¿
èŠããããŸãã ãŠãŒã¶ã®æ
£ã èŠèœãšããã¡ãªã®ããŠãŒã¶ããã®ã€ã³ã¿ãŒãã§ãŒã¹ã«ã©ãã ãæ
£ããŠãããã§ããGUIã¯æ¢ã«å€ãã®äººãå©çšããããšã«æ
£ããŠãããæå³ããåäœããããããã«ã©ããããè¯ãããç¥ã£ãŠããŸããäŸãã°ããã©ãŠã¶ã§åã®ããŒãžã«æ»ããããã°å·Šäžã®ç¢å°ãèªç¶ãšæŒããŸãããç»é¢ã®äžã®æ¹ãèŠãããã°ããŠã¹ãã€ãŒã«ãåãããç»é¢ãäžã«ã¹ã¯ã€ããããããŸããããã¯å€ãã®ãã©ãŠã¶ãå·Šäžã«æ»ããã¿ã³ããããç»é¢ãäžã«ã¹ã¯ããŒã«ããŠããUIã«ãŠãŒã¶ãæ
£ããŠããããã§ãããããå€ãã®äººã«ãšã£ãŠVUIã¯åããŠã®çµéšã§ããä»ã®çºè©±ããã£ã³ã»ã«ããããããçµäºããããããéãã¢ããªãéãããããšæã£ãæã«ã©ããããè¯ãããããããŠãŒã¶ãè¿·ã£ãŠããŸãããšãããããŸããVUIããŸã åºå§ããŠéããªãUIãšããã®ãåå ã§ãããé©åã«ãã«ããåºããªã©ããŠãŠãŒã¶ãè¿·åã«ãªã£ãŠããŸããªãããã«èšèšããŠããå¿
èŠããããŸãã GUIãšVUIã®èª²é¡ã®éã GUIãšVUIã®éãã¯ãæåããšãé³å£°ãã®éããšèããããšãã§ããŸããå°åãäŸã«ãšã£ãŠæåãé³å£°ã«å€ãããšã©ããã£ãåé¡ãèµ·ããã®ãèããŠã¿ãŸãããã åé³ç°æŒ¢ååé¡ïŒä»å°ãšå·å
ïŒ å®®åçã®ä»å°ïŒããã ãïŒãšé¹¿å
å³¶çã®å·å
ïŒããã ãïŒã®ããã«åãèªã¿ã§æŒ¢åãç°ãªãå°åã«èµ·ããåé¡ã§ããé³å£°æ
å ±ã ãã§ã¯ããã2ã€ãåºå¥ããããšãã§ããŸããã®ã§ãçŸç¶ã§ã¯ãŠãŒã¶ã«ãå®®åçã鹿å
å³¶çãã©ã¡ãã®ããã ãã§ããïŒããšèãããšã«ãªããŸããæåã§ããã°2ã€ãåºå¥ããããšãã§ããã®ã§ãé³å£°ç¹æã®åé¡ãšèšããã§ãããã ç°é³å挢ååé¡ïŒæž
æ°Žãšæž
æ°ŽïŒ é岡çã®æž
æ°ŽïŒãã¿ãïŒãšäº¬éœåºã®æž
æ°ŽïŒããã¿ãïŒã®ããã«ç°ãªãèªã¿ã§æŒ¢åãåãå°åã«èµ·ããåé¡ã§ããæåã§ã¯åºå¥ã§ããªãã§ãããé³å£°ã§ã¯åºå¥ããããšãå¯èœã§ããããããçŸç¶ã®Alexaã«ãããŠã¯Alexaå
ã§é³å£°ã挢åã«å€æããŠé£æºãããä»çµã¿ãšãªã£ãŠããããã¹ãã«åŽã«é£æºãããæ
å ±ã¯æŒ¢åã®ã¿ãšãªãã2ã€ãåºå¥ããããšãã§ããŸãããä»åŸãèªã¿æ
å ±ã飿ºãããããã«ãªãããšã§è§£æ¶ã§ããå¯èœæ§ããããŸãã åé³å挢ååé¡ïŒè接ãšèæŽ¥ïŒ çŸ€éŠ¬çã®è接ïŒããã€ïŒãšæ»è³çã®è接ïŒããã€ïŒã®ããã«åãèªã¿ãåãæŒ¢åã®å°åã«èµ·ããåé¡ã§ããåœç¶ã§ããããããæåãé³å£°ããåºå¥ããããšã¯äžå¯èœã§ãããŠãŒã¶ã«ã©ã¡ãã®è接ããèãè¿ãå¿
èŠãåºãŠããŸãã ãããããã®åé¡ã«éããäžèš3ã€ã®åé¡å
šãŠã«èšããããšã§ãããååŸã®æèãèªãããšã§ãã®åé¡ã¯è§£æ¶ã§ããå¯èœæ§ããããŸããäŸãã°ãæã®éœããã ãããšããã°å®®åçã®ä»å°ãæããŠããã§ãããããæ¹¯çã調ã¹ãåŸã«ãããã€ããšèšãã°çŸ€éЬçã®è接ãæããŠããå¯èœæ§ãé«ãã§ããããããŒã¯ãŒãã®åšèŸºããæ
å ±ãéããããšã§ããŠãŒã¶ã®æå³ããããŒã¯ãŒããæšæž¬ããããšã¯ããããå¯èœã«ãªã£ãŠãããšæãããŸãã VUIã®ãããã VUIã®ã«ã®ã¯ã€ã³ããããã¢ãŠããããå
±ã«æ±ããæ
å ±ãå°ãªãããšã«ãããšæããŸãããŠãŒã¶ãæ±ãããã®ã¯ã³ã³ã·ã§ã«ãžã¥ã®ãããªãã²ãšããšèšãã°æèãèªãã§æ¬²ããæ
å ±ãç°¡æœã«è¿ããŠããããããªãã®ã§ãããããããå®çŸããããã«ã¯ãŠãŒã¶ã®çºè©±ä»¥äžã®æ
å ±ãå¿
èŠã§ããäŸãã°ãã®ãŠãŒã¶ã以åãã€ãã³ã°ã«ã€ããŠèª¿ã¹ãŠããããšããæ
å ±ãäºåã«åŸãããŠããã°ãããã®å€ã®è¯ãæ
è¡å
æããŠããšã ãèšãããæã«ãæ²çžã¯ãããã§ãããïŒããšããããŠãŒã¶ã欲ãããã¬ã³ã¡ã³ããã§ããŸãããŠãŒã¶ããã®ã€ã³ããããå°ãªããªã£ãŠããŸã以äžãçºè©±ä»¥å€ã®ãŠãŒã¶æ
å ±ãããã«éããç°¡æœãã€æçãªæ
å ±ããŠãŒã¶ã«è¿ãããããããã®VUIã§ã¯éèŠã«ãªã£ãŠããã§ãããã
æè¡æ¬éšã®æŸæ¬ã§ãããã©ã«ã·ã¢ã§ã¯ã2019幎æ°åã®åŠçã察象ã«ãã¯ãŒã¯ã·ã§ãããäŒç€Ÿèª¬æäŒã宿œããŠããŸãããšã³ãžãã¢å¿æè
åãã®ã¯ãŒã¯ã·ã§ããã§ã¯ãèšå€§ãã€è€éãªããŒã¿ããé«éã«æé©è§£ãå°ãç¬èªã®ãé«éæ€çŽ¢æè¡ãããããã°ã©ãã³ã°ã®å®è·µã亀ããªããåŠã¹ãããã°ã©ã ãçšæããŠããŸãã æ¬æ¥ã¯ç¹å¥ã«ã4æ24æ¥ïŒç«ïŒã«éå±±ã§éå¬ãããšã³ãžãã¢ã¯ãŒã¯ã·ã§ããã§åºé¡ããåé¡ã解説ããŸãã åé¡ Level1 Level2 Level3 ãŸãšã ä»åŸã®ã¯ãŒã¯ã·ã§ããã®ãæ¡å
åé¡ ããã§ã¯ãå®éã«åºé¡ããåé¡ãèŠãŠãããŸãããã å顿 N人ã®èº«é· h_i ãšQåã®è³ªåã¯ãšãªãäžããããŸãã å質åã¯ãšãªã¯ã (h_min_j, h_max_j) ã®2èŠçŽ ã§æ§æãããŸãã ãã®ãšããããããã®ã¯ãšãªã«ã€ã㊠h_min_j <= h_i <= h_max_j ãæºãã人æ°ãçããªããã â»èº«é·ãã¯ãšãªã¯ãã¹ãп޿°ã§ããã å
¥å å
¥åã¯æšæºå
¥åãã以äžã®åœ¢åŒã§äžãããããïŒãâã以éã¯æ³šéã§ãïŒ N Q â ãã®ããšèº«é·ã®ããŒã¿ãNåãæ¬¡ãã§ã¯ãšãªãQåå
¥åããã h_1 â 1çªç®ã®èº«é· ïž h_N â Nçªç®ã®èº«é· h_min_1 h_max_1 â 1çªç®ã®ã¯ãšãª ïž h_min_Q h_max_Q åºå åã¯ãšãªã«å¯ŸããŠçããšãªãå€ãæŽæ°ã§åºåããã Sample Input 0 3 1 4 9 5 3 5 Sample Output 0 2 Explanation 0 3人ã®èº«é· 4,9,5 ãšã¯ãšãª (3, 5) ãäžããããŸãã身é·ã3以äž5以äžã®äººã¯1çªç®(4)ãš3çªç®(5)ã®2人ã§ãããããã£ãŠã¯ãšãª (3, 5) ã«å¯ŸããŠåºåãã¹ãå€ã¯2ã§ãã Sample Input 1 5 2 2 3 4 4 4 1 1 4 4 Sample Output 1 0 3 Explanation 1 身é·ã1以äž1以äžã®äººã¯0人ã§ãã身é·ã4以äž4以äžã®äººã¯3人ã§ãã Sample Input 2 6 2 10 2 5 6 10 8 6 7 1 9 Sample Output 2 1 4 Explanation 2 身é·ã6以äž7以äžã®äººã¯1人ã§ãã身é·ã1以äž9以äžã®äººã¯4人ã§ãã Level 1 äžèšã®åé¡èšå®ã«å
·äœçãªå¶çŽïŒå
¥åã®å€åïŒãäžããŠãåã¬ãã«ã®åé¡ãèŠãŠãããããšæããŸãããŸãéåžžã«å€ã®å°ããåé¡ãèããŸãã å¶çŽ(Level1) 1 <= N <= 10 1 <= Q <= 10 1 <= h_i <= 10 1 <= h_min_j <= h_max_j <= 10 ãã®åé¡ã解決ããåçŽãªããã°ã©ã ãå®è£
ããŸãã å
šå¡ã®èº«é·ãé
åã«æ ŒçŽãã å質åã«ã€ããŠå人ã®èº«é·ãç¯å²å
ã«åãŸã£ãŠããããå€å®ãã æ¡ä»¶ã«åœãŠã¯ãŸã人æ°ãçããŸãã äžèšãPython3ã®å®è£
äŸã§ãã Python:Level1å®è£
äŸ N, Q = map(int, input().split()) P = [] for i in range(N): h = int(input()) P.append(h) # å質åããšã« for i in range(Q): h_min, h_max = map(int, input().split()) count = 0 # å人ã®èº«é·ãå€å®ãã for p in P: if h_min <= p <= h_max: count += 1 print(count) äžèšã¢ã«ãŽãªãºã ã®èšç®éã¯Qåã®ã«ãŒã(8è¡ç®)ã®äžã«Nåã®ã«ãŒã(13è¡ç®)ãå
¥ã£ãŠãããã O(QN) ã«ãªããŸããæå
ã®ç°å¢ã§å®è¡ããŠã¿ããš0.1ç§ä»¥äžã§åºåãè¿ã£ãŠããŸãã Level2 å¶çŽ(Level2) 1 <= N <= 10,000 = 10**4 1 <= Q <= 10,000 = 10**4 1 <= h_i <= 10,000 = 10**4 1 <= h_min_j <= h_max_j <= 10,000 = 10**4 Level2ã§ã¯ããããã®å€ã1000åã«ãªããŸããLevel1ã§å®è£
ããããã°ã©ã ã§ã¯ãçããåºããŸã§ã«çŽ8ç§ã®æéãå¿
èŠã«ãªããŸãã Level1ã§å®è£
ããããã°ã©ã ã®ã©ãã«æéãããã£ãŠããããèããŸãããã2éã«ãŒãã«ãã£ãŠåèš Q * N åã身é·ã®æ¯èŒãè¡ãããŠããŸãã å®éã«èªåããã®äœæ¥ãè¡ããšããããšèããŠã¿ããšã身é·ãæããã«ç¯å²ããå€ããŠãã人ã«ã¯äœåºŠã質åããªãã§ãããã 質åããšã«å人ã®èº«é·ãå€å®ããã¢ã«ãŽãªãºã 㯠"æ¯åãå
šå¡ãã®èº«é·ã確ãããå¿
èŠããã" ç¹ãéå¹çã§ãã ããã§ã¯ãã©ãããã° "ãå
šå¡ãã«å¯ŸããŠã®å€å®" ãé¿ããããããèããŠã¿ãŸãããã ãLevel2ã®ãã€ã³ãã æ°ããã®ã§ã¯ãªããèšç®ããã äžé以äžã®äººæ°ããäžéã«æºããªã人æ°ãåŒãããšã§æ¡ä»¶ãæºãã人æ°ãèšç®ããããšãã§ããŸãã åŠæ ¡ã®å€§æé€ã§ã12çªãã16çªã®5人ã¯çªæãïŒãã®ãããªã·ãŒã³ããããŸããã§ãããïŒ äºåã«ãœãŒãããŠããã ãœãŒããããŠãããšããã®ã¯åŒ·ãæ§è³ªã§ãæé ã«ãœãŒããããŠããŠãiçªç®ã®äººãäžéæªæºã®å Žåãi-1çªç®ä»¥äžã®äººãäžéæªæºã§ããããšãæããã§ãã ãããã®ãã€ã³ãããµãŸãããšãåé¡ã¯æ¬¡ã®ããã«èšãæããããŸãã ãåé¡ã®èšãæãã ãœãŒããããé
åããäžéæªæºã®æåŸã®äººãäžé以äžã®æåŸã®äººãèŠã€ãããã ããã§ã泚æãããç¹ããããŸããåããé çªã«èŠãŠãããšãæ¢ããŠãã人ãé
åã®åŸãã®æ¹ã«ããå Žåãçµå±ã»ãŒãã¹ãŠã®äººã®èº«é·ã確èªããããšã«ãªããŸãã ãã£ãšå¹çè¯ãèšç®ããããã«ãäœäººããããã¯ã¢ããããŠè³ªåãããããšæããŸãã åºæ¬æ
å ±æè¡è
詊éšãå匷ããŠãã人ãæ
å ±ç³»ã®äººãªãèããããšããããããããŸãããã "çãäžã®äººããèããŠè§£ã®ååšç©ºéãååã«ãã" ãšããèãæ¹ããããŸãã ãã㯠"äºåæ¢çŽ¢" ãšåŒã°ããæ¢çŽ¢ã¢ã«ãŽãªãºã ã®äžã€ã§ãä»åã®åé¡èšå®ãšçžæ§ãè¯ããããäºåæ¢çŽ¢ã䜿ã£ãŠã¿ãŸãããã äºåæ¢çŽ¢ã䜿çšããŠããœãŒããããé
åããããå€T以äžã®æåã®äººã®ã€ã³ããã¯ã¹ããæ¢ããŸãã P ã身é·ãæé ã«ãœãŒããããé
åãé
å P äžã§èº«é· T 以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãæ¢ããšããŠèª¬æãé²ããŸãã P[lb] < T <= P[ub] (â»)ãæºããããã« lb, ub ãåæåããŸãããã®æ¡ä»¶ãä¿ã¡ãªããæŽæ°ããããšãäºåæ¢çŽ¢ã®ãã€ã³ãã§ãã m = (lb+ub)//2 (å¹³åã®å°æ°ç¹ä»¥äžåæš)ãšã㊠P[m] < T â lb = m , T <= P[m] â ub = m ãšè§£ã®ååšç¯å²ãæŽæ°ããŸãã lb+1 == ub ãæãç«ã€ãšãã(â»)ã®æ¡ä»¶ãã ub ããããããå€T以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãã§ããããšãåãããŸãã äŸãšããŠäžèšã®å
¥åãäžãããããšãã身é·ãh_min=3以äžã®æåã®äººã®ã€ã³ããã¯ã¹ãæ±ããŸãã N = 12 H = {1, 2, 2, 4, 4, 5, 6, 6, 7, 7, 7, 10} h_min=3, h_max=6 P[0]=1 < T=3 ã§ããããšã確èªããäžã§ã lb=0, ub=len(P)=12 ã§åæåããŸããâ»é
åäžã«T以äžã®å€ããªãå Žåã¯Pã®èŠçŽ æ°(=12)ãè¿ããŸãã m = (lb+ub)//2=(0+11)//2=5 ãšãªããŸãã P[m]=P[5]=6 >= T=3 ãªã®ã§ ub = m=5 ã«æŽæ°ããŸãã m = (lb+ub)//2=(0+5)//2=2 ãšãªããŸãã P[m]=P[2]=2 < T=3 ãªã®ã§ lb = m=2 ã«æŽæ°ããŸãã m = (lb+ub)//2=(2+5)//2=3 ãšãªããŸãã P[m]=P[3]=4 >= T=3 ãªã®ã§ ub = m=3 ã«æŽæ°ããŸãã lb+1 == ub ãæãç«ã¡ãã身é·ãh_min=3以äžã®æåã®äººã®ã€ã³ããã¯ã¹ã㯠ub=3 ã§ããããšãåãããŸãã åŠçã®æµããåãã£ããšããã§ãå®è£
ãããŠã¿ãŸãã Python:Level2å®è£
äŸ """ ãœãŒãããŠäºåæ¢çŽ¢ """ import bisect N, Q = map(int, input().split(" ")) P = [] for i in range(N): h = int(input()) P.append(h) # O( N*logN ) P.sort() # O( Q*logN ) for i in range(Q): h_min, h_max = map(int, input().split()) count = 0 lower = bisect.bisect_left(P, h_min) upper = bisect.bisect_left(P, h_max + 1) print(upper - lower) æšæºã©ã€ãã©ãªã䜿ã£ãŠããäºåæ¢çŽ¢éšåãæžãäžããšãããªããŸãã """ äºåæ¢çŽ¢ """ def bisect_left(array, target): if target <= array[0]: return 0 lb = 0 ub = len(array) while lb + 1 < ub: m = (lb + ub) // 2 if target <= array[m]: ub = m else: lb = m return ub äºããœãŒãããæéã¯ããããã®ã®ã1åãœãŒãããŠããã ãã§ãQåã®ã¯ãšãªåŠçã«ãããæéã倧å¹
ã«ççž®ããããšãåºæ¥ãŸããäºåã«N人ã®èº«é·ããœãŒãããèšç®éã O(NlogN) ãQåã®ã¯ãšãªããããã«å¯ŸããŠãäºéšæ¢çŽ¢ãè¡ãèšç®éãO(QlogN)ã§ãåèšã®èšç®é㯠O(NlogN) + O(QlogN) ã«ãªããŸãã Level3 Level3ã§ã¯å¶çŽãæŽã«10åã«ããåé¡ãèããŸãã å¶çŽ(Level3) 1 <= N <= 100,000 = 10**5 1 <= Q <= 100,000 = 10**5 1 <= h_i <= 100,000 = 10**5 1 <= h_min_j <= h_max_j <= 100,000 = 10**5 Level2ã§ãé«éã«æ€çŽ¢ã§ããŠã¯ããŸããããŸã ç¡é§ãªéšåããããŸãã1åã®ã¯ãšãªãåŠçãããšãã«2åã®äºåæ¢çŽ¢ãå®è¡ããååŸã®å¢çãšãªãäººãæ¢ãäœæ¥ãããŠããŸããä»åã®åé¡èšå®ã§ã¯å
·äœçãªäººãç¹å®ããå¿
èŠã¯ãªãã人æ°ã ãã«çç®ããã°ååã§ããæ
å ±ã®æã¡æ¹ãå€ããŠãå身é·ããšã«äœäººããããæã£ãŠã¿ãŸãããã 人æ°ã ããé
åã«æã£ãå Žåãã¯ãšãªã«å¯ŸããåŠçã¯ãäžéããäžéãŸã§ã®å身é·ããšã®äººæ°ã®åããšããŠè¡šçŸããããšãã§ããŸããããã§ã泚æãå¿
èŠã§ãããã¯ãšãªããšã«äžéããäžéãŸã§ãè¶³ããŠãã£ãã®ã§ã¯ã O(QH) ã®èšç®éã«ãªãã身é·ã®å¹
ã倧ããå Žåã«æ¹åããããŸããã æ
å ±ã®æã¡æ¹ãæŽã«äžå·¥å€«ããŠã身é·i以äžã®åèšäººæ°ãiçªç®ã®èŠçŽ ãšããŠæã€ãããªé
åãèããŸãããããã㯠O(N+H) ã§æºåã§ããŸããLevel2ãšåãå
·äœäŸã䜿ã£ãŠèª¬æããŸãã åãã«èº«é·ã®å€ååã®é
åã確ä¿ããŠãããå人ã®èº«é·ãèªã¿èŸŒãã ãã察å¿ããå€ã+1ããŸãããã®åŠçã¯å ç®Nåã§ O(N) ã§ããæ¬¡ã« P[i] = P[i] + P[i-1] ãšã㊠P[i] ã身é·i以äžã®äººæ°ã衚ãããã«ããŒã¿ãæã¡ãŸãããã®åŠçã¯èº«é·ã®äžéãŸã§è¶³ãå¿
èŠããããããå ç®H_MAXåãå¿
èŠã§ O(H_MAX) ã§ãã ãã®é
åäžã§ãäžéãšäžéã®åŒãç®ãè¡ãããšã§ãç¯å²ã«å«ãŸãã人æ°ãçããããšãå¯èœã§ããäºåã«äººæ°ãè¶³ããŠæã£ãŠããããšã§ãã¯ãšãªã«å¯ŸããŠã¯ïŒåã®åŒãç®( O(1) )ã§ã¬ã¹ãã³ã¹ããäºãã§ããŸãããã®ææ³ã环ç©åãšãããŸãã Level3ã®ãã€ã³ããèããŠã¿ãŸãããã ãLevel3ã®ãã€ã³ãã èº«é·æ
å ±ã®æã¡æ¹ãå€ãã æ¯åã®æ¢çŽ¢ããå¿
èŠãªã åŒãç®1åã§èšç®ãã¹ã Python:Level3å®è£
äŸ """ 环ç©å """ H_MAX = 10**5 N, Q = map(int, input().split(" ")) P = [] lower_count = [0] * (H_MAX + 1) # 身é·i以äžã®äººæ°ãlower_count[i]ã«æ ŒçŽããã for i in range(N): h = int(input()) lower_count[h] += 1 # O( H_MAX ) for i in range(H_MAX): lower_count[i + 1] += lower_count[i] # O( Q ) for i in range(Q): h_min, h_max = map(int, input().split()) upper = lower_count[h_max] lower = lower_count[h_min - 1] print(upper - lower) # 人æ°ãåãã£ãŠããã®ã§åŒãç®ã ãã§çãããããã èšç®é㯠O(N) + O(H) + O(Q) ã«ãªããŸããæ¯åã®æ¢çŽ¢ãå¿
èŠãªããããé«éã«åŠçãããããšãåºæ¥ãŸãã ãŸãšã ä»åã®ã¯ãŒã¯ã·ã§ããã§ã¯ãå¶çŽã®å€§ããã«åãããŠã¢ã«ãŽãªãºã ã®æ¹åãšèãæ¹ã玹ä»ããŸããã ããŒã¿æ°ãå°ãªããªããå®è£
ãç°¡åãªå
šæ¢çŽ¢ã ããŒã¿æ°ãå€ãå Žåã¯ãœãŒãããŠãããŠäºåæ¢çŽ¢ãïŒååŠçïŒ ããŒã¿æ°ã ããå¿
èŠã«ãªãå ŽåãããŒã¿æ°ã ãæ°ããŠãããŠãåŒãç®ãã环ç©åã®ææ³ã䜿ãããïŒããŒã¿ã®æã¡æ¹ãå€ããïŒ ã€ãå
æ¥ã瀟å
slackã§ãO(N)ãO(logN)ã«æ¹åããŸããïŒããšãã話é¡ãäžãã£ãŠããŸãããèšç®éãèããªããã¢ã«ãŽãªãºã ã®æ¹åãããããšã«é¢çœããæããæ¹ãäžç·ã«åããã®ã楜ãã¿ã«ããŠããŸãïŒ ä»åŸã®ã¯ãŒã¯ã·ã§ããã®ãæ¡å
å®éã®ã¯ãŒã¯ã·ã§ããã§ã¯åå è
ã®çããããLevel1ã§åé¡ãçè§£ããŠãLevel2ã®å®è£
ã«åãçµããšããæ§åã§ãããç«¶æããã°ã©ãã³ã°ã«æ
£ããŠããæ¹ã¯ãLevel2ãŸã§ã¯ç¬æ®ºãLevel3ã«ãã£ã¬ã³ãžããŠããŸãããã ä»åŸããã©ã«ã·ã¢ã§ã¯ãã¯ãŒã¯ã·ã§ããã®éå¬ãäºå®ããŠããŸãããšã³ãžãã¢ãšããŠã®ç¥èŠãåºãããæ¹ãã©ã«ã·ã¢ã®ããšãç¥ãããæ¹ããã²ãå¿åãåŸ
ã¡ããŠãããŸãïŒ ã¯ãŒã¯ã·ã§ããã®æ¥çšããç³ã蟌ã¿ã¯ ãã¡ã