フォルシアのブログ - TECH PLAY

TECH PLAY

フォルシア

フォルシア の技術ブログ

å…š252ä»¶

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にチャレンゞしおいたしたよ。 今埌もフォルシアでは、ワヌクショップの開催を予定しおいたす。゚ンゞニアずしおの知芋を広げたい方フォルシアのこずを知りたい方、ぜひご応募お埅ちしおおりたす ワヌクショップの日皋、お申し蟌みは こちら