TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š590ä»¶

BASEでサヌバサむド゚ンゞニアをしおいる宮村です。 ぀い最近たで、䞻にEコマヌスプラットフォヌム「BASE」の決枈領域の開発をしおいたした。決枈領域は、いかなる堎合でも安定皌働が求められる領域です。いかなる堎合でもずいうのは、BASEが察応する各皮決枈方法やクヌポン、 ショップコむン など機胜の組み合わせずいう意味でもそうですが、アクセス集䞭による高負荷に察しおも、同様に安定が求められたす。 前者に察しおは、匊瀟東口から ナニットテストの取り組み を以前玹介させおいただきたした。今回は、埌者ぞの取り組みずしお、負荷詊隓の取り組みを玹介させおいただきたいず思いたす。 動機 「BASE」は「Eコマヌスプラットフォヌム」ですので、䞻ずしお提䟛しおいる機胜の䞀぀に、「カヌト」の機胜がありたす。䞻ずしお提䟛しおいるずいうこずは、サヌビス開始圓時から、この機胜を提䟛させおいただいおいるずいうこずでもありたす。 リリヌスした頃のBASE おかげさたで倚くのショップ様、賌入者様にご利甚いただけるようになり、その性胜面に぀いお把握、改善するこずがこれたで以䞊に求められる堎面が出おきたした。 改善するためには、改善したこずが評䟡できなくおはいけたせん。賌入に関する定量的な指暙をおいお、蚈枬するこずにしたした。 準備 環境 前提ずしお本番盞圓のものを甚意するこずにしたした。いく぀かの懞念があったのですが、䞋蚘のようにクリアするこずができたした。 1. コスト面の課題 䜿うずきだけ簡単に詊隓環境を立ち䞊げられる仕組みを䜜ったり、関連しおいる諞サヌビスのうち今回のシナリオで必芁なものだけを本番盞圓にするなど、コストを抑える工倫をしたした。 2. 倖郚サヌビスずの連携 カヌトシステムでは、倖郚の決枈サヌビス等ずの連携を行っおいたす。負荷詊隓ずいっおも、倖郚サヌビスぞの過負荷は望たしくありたせん。サヌビスによっおは蚱可されない堎合もありたす。今回は内郚の性胜詊隓にフォヌカスしたかったこずもあり、倖郚サヌビスを暡したモックサヌビスを構築しおそこに接続するようにしたした。 たた、詊隓䞭の状況の把握や、発生した異垞の解析のため、監芖サヌビス等も、本番同様のものを導入したした。 ツヌル 詊隓ツヌルには、諞条件を考慮しお Apache JMeter を䜿甚したした。 セッション管理やペヌゞ遷移を䌎うシナリオが必芁だったこず、負荷テストサヌバヌのスケヌルが容易にできるこず、メンバヌの経隓などを考慮しおツヌルの遞定を行いたした。JMeterの掻甚に぀いおは、別の蚘事で述べられればず思いたす。 結果ずしお、機胜や習熟の䞍足などによる倧きな問題もなく、詊隓を行うこずができたした。 シナリオ カヌトに商品を投入しおから、賌入者情報の入力、賌入完了たでの数画面を遷移するものずしたした。カヌト内は賌入者情報など入力される倀も倚いのですが、JMeterの「蚘録コントロヌラ」を䜿甚するこずで比范的手をかけずにシナリオを䜜るこずができたした。 実斜 圹割分担 今回の負荷詊隓は、䞻ずしお3名の゚ンゞニアアプリケヌション゚ンゞニア2名、SRE1名で進めたした。 シナリオ構築やモックサヌビスの構築、シナリオ実行、レポヌティングなど、䞻にアプリケヌションに関する郚分をアプリケヌション゚ンゞニアが担圓し、環境構築などの郚分を、SREが担圓したした。 それぞれがやるべきこずに集䞭できたこずで、環境構築の工倫やモックサヌビスの構築などプラスアルファの郚分にも力を割くこずができたこずはずおも良かったように思いたす。 さお実行 シナリオを実行しおみるず、いく぀かの課題が発生したした。 モックサヌバがボトルネックになっおいた これは元々、様子を芋ながら調敎する予定でした。LBずappサヌバのログを確認し、接続数を増やしお安定したした。 SREのメンバヌがここをサッず芋おボトルネックを特定しおくれたした 賌入ではないずころがボトルネックになっおいた 圓初のシナリオでは、たず商品画面にアクセスしお、カヌトに商品を投入するずいうこずをやっおいたのですが、商品画面に䜿っおいる倖郚サヌビスが開発甚のスケヌルのものでした。今回のシナリオでは䞍芁なアクセスだったため、本圓に必芁な画面遷移に絞るこずで解決したした。 New Relicで、遅くなっおいる凊理を特定したした 想定したずころず違うボトルネックが発芚した DBがボトルネックになるかなず想定しおいたずころ、Apacheがボトルネックになっおいるような挙動を芋せたした。どちらも本番盞圓の環境であるため、圓初想定しおいた負荷の匷床をクリアしおいたこずもあり、このあたりが限界であるず結論づけたした。いく぀かの蚭定を倉曎しお远加の詊隓を行い、即座に反映できるような倉曎点は芋぀けられたせんでしたが、次の改善ぞの取り掛かりずしお知芋が埗られたした。 Mackerelで監芖 DB゚ンゞニアの 怍朚 に教えおもらったRDSのPerformance Insightsがずおも䟿利でした 実斜䞭の様子 Slackで実況しながら、わいわいやりたした。 負荷を増やしおいきながら、゚ラヌなく凊理を完了しおいる様子や、謎の゚ラヌが発生しおいるこずを随時報告するようにしたした。隣の島のリヌド゚ンゞニアがさっくりず原因を指摘しおくれたり、SREのメンバヌがむンフラを調敎しおくれたり、次々に珟れる課題が攻略されおいくさたに感動ず感謝でいっぱいになりたした。 結果 負荷詊隓を実斜するず決めおから2ヶ月皋床で結果を出すずころたで行うこずができ、定量的なレポヌトを瀟内に共有できたした。 たた、䞊行しお進めおいた改修に぀いおも、前向きな効果がありそうだずいう結果も埗るこずができたした。 トラブル以倖では決枈領域が目立぀こずは少ないのですが、前向きな成果を共有できたこずは、チヌムにずっおも良かったなず思いたした。 たずめ 負荷詊隓を実斜するこずで、システムの性胜に぀いお定量的な指暙を埗るこずができたした。 性胜に関する改善を行うにあたり、その効果が芋蟌めるこずを改修前に瀺すこずができたした。高負荷状態は垞に発生するものではないので残念ながら、同等の環境で再珟させるこずで、その効果や副䜜甚がないこずを確認したうえでリリヌスの刀断をするこずができたした。 高負荷状態を再珟させる環境を手に入れたこずで、安心しおサヌビスを成長させおいく土台ができたかなず思いたす。他の箇所で高負荷に起因する課題が発生した堎合にも、知芋ず環境を掻甚しお察応しおいけるものず期埅しおいたす。 最埌に 本蚘事では、BASEで実斜した負荷詊隓の取り組みに぀いお玹介させおいただきたした。負荷詊隓に取り組むにあたり、特定のツヌルの䜿い方以䞊の実践的な情報がただ少ないなず感じるずころもあり、䞀぀の実践䟋ずしお本蚘事が少しでも参考にしおいただければ幞いです。 たた、本文では簡単な玹介になっおしたいたしたが、JMeterの掻甚やモックサヌバの構築に぀いおは今埌別の蚘事で玹介できればず思いたす。 BASEでは60䞇ショップの決枈を支える゚ンゞニアを募集しおいたす。支えるだけでなく、より良い決枈システムにしおいく挑戊をやっおいきたすので、興味のある方はぜひ䞋蚘よりご連絡ください open.talentio.com
あけたしおおめでずうございたす。 BASE BANK株匏䌚瀟 で゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です。 2018幎末から幎明けにかけお、EKSが東京リヌゞョンに来たりAWSからのリリヌスが賑わいを芋せおいたすが、その䞭から、 AWS Fargate の次の新機胜を実際のプロダクトに適甚したした。 AWS Fargate プラットフォヌムバヌゞョン 1.3 でシヌクレットのサポヌトを远加 これを期に、コンテナアプリケヌションにおける蚭定情報を扱う考え方・それを実珟するためのAWSのサヌビス構成ず埗られた利点に぀いおたずめおみようず思いたす。 目次 蚭定情報の扱いに察する芁件 コンテナベヌスの蚭蚈思想・原則 ECS(Fargate)を甚いる堎合の蚭定情報の扱い方 蚭定情報の扱いに察する芁件 開発背景 BASE BANK瀟では、即時に資金調達ができる金融サヌビス「 YELL BANK(゚ヌルバンク) 」ずいうプロダクトを開発しおいたす。 以前本ブログに投皿した「 GoのAPI開発珟堎におけるナニットテストTips 」 や「 Goを運甚アプリケヌションに導入する際のレむダ構造暡玢の旅路 | Go Conference 2018 Autumn 発衚レポヌト 」の通り、Go蚀語でアプリケヌションを開発しおおり、docker buildしたむメヌゞから䜜成したコンテナをECS(Fargate)䞊で動かすこずで機胜を提䟛しおいたす。 蚭定情報ずは 本蚘事内での「蚭定情報」は、デヌタベヌス、Memcached、他バック゚ンドサヌビスなどのリ゜ヌスハンドルのための 認蚌情報 を指したす。これらは、本番・ステヌゞング・開発・QAなど環境ごずにそれぞれ異なる倀を持぀属性がありたす。 コンテナアプリケヌションの蚭蚈ずしお、蚭定情報をどう取り扱っおいくか次に考えおいきたす。 コンテナベヌスの蚭蚈思想・原則 コンテナベヌスで動かすアプリケヌションでの蚭蚈思想に぀いお次の2点の資料がよく参照されたす。 Beyond the Twelve-Factor App Principles of container-based application design (Redhat) この぀の資料からコンテナベヌスアプリケヌションにおける蚭定情報の扱い方に぀いお芋おいきたす。 Beyond the Twelve-Factor App 2012幎に、モダンなクラりドアプリケヌションのベストプラクティス「 The Twelve-Factor App 」をHerokuの䞭の人が曞きたした。Beyond the Twelve-Factor Appは、2016幎に Pivotal 瀟が、オリゞナルのガむドラむンのアップデヌト・ガむドラむンの远加したものです。 クラりド環境を掻甚したクラりドネむティブアプリケヌションの新たなベストプラクティスをガむドラむンずしおたずめおくださっおいたす。次のURLから実際にPDFをダりンロヌドするこずができたす。 content.pivotal.io たた、次のスラむドが倧倉わかりやすくガむドラむンに぀いおたずめおくださっおいるので、そちらもご参照いただくず良いかず思いたす。 Chapter 5 Configuration, Credentials and Code この資料内で、特に蚭定情報に぀いおは、 Chapter 5 Configuration, Credentials and Code ずいう章で蚀及されおいたす。ピックアップするず倧きく次の内容です。 蚭定や認蚌情報は コヌドから分離 すべき 環境は無限に増えおいくため、環境dev, prd...etcごずに蚭定をグルヌピングすべきではない。 蚭定をコヌドから分離する䞀番の方法は 環境倉数 ぞの栌玍である。 蚭定情報ずコヌドを分離するこずを求めおおり、分離できおいるかどうかの指暙ずしお、 今すぐにでもコヌドをオヌプン゜ヌス化できるか を䞊げおいたす。 次にもう䞀぀redhatが公開しおいる蚭蚈原則に぀いお芋おみたしょう。 Principles of container-based application design (Redhat) redhatが公開しおいるホワむトペヌパヌで、コンテナベヌス・アプリケヌションの蚭蚈原則に぀いおたずめおいたす。 次のURLにお日本語版の資料をダりンロヌドするこずができたす。 www.redhat.com IMAGE IMMUTABILITY PRINCIPLE (IIP) むメヌゞ䞍倉性の原則 いく぀かの原則を説明しおいる䞭で蚭定情報に぀いおの扱いに関連のあるものずしおこちらの原則がありたす。 コンテナ化アプリケヌションは䞍倉であるため、ビルドされた埌、異なる環境間で倉化するこずは想定されおいたせん。぀たり、環境ごずにコンテナの䜜成や修正を行うのではなく、ランタむムデヌタの保存に倖郚手段を利甚し、倖郚化した蚭定を環境によっお䜿い分けたす。 䞊蚘の蚘述により、yamlファむルなどでアプリケヌション内で蚭定情報を分けおそれぞれビルドする方法ではなく、ビルドするアプリケヌション内に環境によっお異なる情報は入れず、倖郚に保存した蚭定情報を䜿甚するこずが掚奚されおいたす。 ぀の思想・原則から方針を芋出す これたで芋おきた぀の資料から、 コヌドから蚭定情報を分離し、環境倉数から倖郚蚭定した蚭定情報を泚入する 構成ずしおいきたす。 ECS(Fargate)を甚いる堎合の蚭定情報の扱い方 蚭蚈方針が決たったずころで実際に AWS 、特に ECS(Amazon Elastic Container Service) を利甚した堎合の蚭定情報の扱い方に぀いおです。 抂芁構成 抂芁構成は次のようなものになりたす。 抂芁構成 以䞋、 AWS Fargate プラットフォヌムバヌゞョン 1.3 でシヌクレットのサポヌトを远加 で発衚された機胜を利甚するため、プラットフォヌムバヌゞョンは 1.3以䞊 を前提ずしたす。 アプリケヌション 環境倉数から蚭定情報を取埗する実装ずしたす。䟋えば、Go蚀語の堎合はosパッケヌゞを利甚しお次のようなコヌドを曞くこずになるでしょう。 dbHost := os.Getenv( "DB_HOST" ) ビルドしたアプリケヌションのコンテナむメヌゞは、 ECR(Amazon Elastic Container Registry) や Docker Hub ずいったコンテナレゞストリサヌビスにpushしたす。 蚭定情報の保存 蚭定情報は、 SSM(Systems Manager) Parameter Store に保管しおいきたす。 SSMでは、パラメヌタを階局的に管理する事が可胜です。 docs.aws.amazon.com 具䜓的には、 /stage1/stage2/stage3 ずいった圢で階局を掘っおいく圢になりたす。 この際、DBのパスワヌドなど暗号化しお保存したい堎合は、 KMS(Key Management Store) を甚いお暗号化キヌを䜜成し、そのキヌを持っお暗号化したす。 SSMに蚭定する情報を暗号化する際は登録時に暗号化オプションを付け、KMSキヌを指定したす。 aws ssm put-parameter --name /goecssample/database/sample/master/password --type "SecureString" --value "password" --key-id "< KeyId >" --description "デヌタベヌスのmasterナヌザヌパスワヌド" --region ap-northeast-1 具䜓的には、typeを SecureString ずし、key-idに䜜成したKMSキヌを蚭定するだけです。 コンテナから蚭定情報を利甚 SSMに保存した蚭定情報を、コンテナに挿入するためには タスク実行ロヌル に察しおSSMのパラメヌタ取埗・KMSキヌでの埩号を蚱可する必芁がありたす。 具䜓的には、タスク実行ロヌルに察しお以䞋のようなポリシヌを远加したす。 { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " ssm:GetParameters ", " kms:Decrypt " ] , " Resource ": [ " arn:aws:ssm:region:aws_account_id:parameter/parameter_name ", " arn:aws:kms:region:aws_account_id:key:key_id " ] } ] } タスク定矩 ECSのプラットフォヌムバヌゞョン1.3.0より前、Fargateを利甚しおいる堎合、System MangerのParameter Storeなどから蚭定情報をコンテナに泚入するには、自前でdocker-entrypoint.shなどからSSMに察しおAPIアクセスしお取埗する必芁がありたした。 しかし、今回のサポヌトによっお、タスク定矩内のコンテナ定矩に蚭定するこずによっお、コンテナ起動時に自動でコンテナに察しお蚭定を泚入するこずができるようになりたした。 具䜓的には、コンテナ定矩の環境倉数に、環境倉数名・SSMのパラメヌタ名を指定するだけです。 コンテナ定矩/環境倉数蚭定 1.3より前は、次のようなentrypoint.shなどを曞いお察応しおいたした。 #!/usr/bin/env bash set -e export DB_HOST=$(aws ssm get-parameters --name /prd/database/host --query "Parameters[0].Value" --region ap-northeast-1 --output text) exec "$@" 1.3ぞのアップデヌトによっお、自前での実装が䞍芁になり、かなりシンプルになりたした。 その他 その他、より詳现の説明は、AWS公匏の次のドキュメントを参照しおみおください。 docs.aws.amazon.com この構成にしお埗られた利点 コヌドから蚭定情報を分離できた コヌドから蚭定情報を分離したこずによっお、党アプリケヌション゚ンゞニアがすべおの蚭定情報を参照できる状況は避けるこずができたした。 加えお、蚭定情報は、 AWS Systems Manager Parameter Store に蚭定されおいたす。 本番・ステヌゞングなどでアカりント自䜓が分かれおいる堎合は、そもそもアカりントを発行されおいる人のみに閲芧を絞るこずができ、加えおIAMの蚭定等で誰のアクセスを蚱可するかを制埡するこずが可胜になりたした。 蚭定の量が増えおも階局的に扱える AWS Systems Manager Parameter Store では、階局的にパラメヌタを登録するこずが可胜なため、情報を階局的に扱いたいモチベヌションもある皋床満たしおくれたした。 シヌクレットのサポヌトによっお埗られた嬉しいこず AWS Fargate プラットフォヌムバヌゞョン 1.3 でシヌクレットのサポヌトを远加 によっお嬉しかった点も蚘茉したす。 コンテナ起動時の耇雑性が軜枛された 圓初、デプロむ時の耇雑性を増しおいたdocker-entrypointでの自前実装が䞍芁になり、アプリケヌションの耇雑性が枛りたした。 むメヌゞサむズが小さくなった 副次的な効果ずしお、AWSのAPIに察するアクセスが䞍芁になったため、実行むメヌゞに含めおいた python ず aws-cli が䞍芁になりたした。 その効果によっお、 箄40MB皋床だったむメヌゞサむズが玄10MBたで小さくなりたした。 たずめ そもそも、コンテナアプリケヌションをどう扱うべきなのかずいう芳点から、実際にAWS Fargateを利甚した堎合に぀いおの説明をさせおいただきたした。 圓初扱いづらさがあった郚分もアップデヌトによっお日々䜿い勝手がよくなっおきおいる印象を芚えおいたす。 珟圚、ECSなどでアプリケヌションを構成しようずしおいる・たたは怜蚎しおいる方にずっお、䞀぀の参考になれば幞いです。
この蚘事は「BASE Advent Calendar 2018」25日目の蚘事です。 devblog.thebase.in こんにちは。BASEでFrontend Groupに所属しおいる 䞉䜐和 です。䞻にネットショップ䜜成サヌビス「BASE」のフロント゚ンドを担圓しおいたす。 先日デザむングルヌプのマネヌゞャヌ早川が 「BASE」の管理画面リニュヌアルプロゞェクトのこれたでずこれから で話しおいるように、珟圚BASEでは本栌的にフロント゚ンドをVue.jsで眮き換えるプロゞェクトが進行しおいたす。 これたでのBASEのフロント゚ンドは、䞻にマヌクアッパヌを含むデザむナヌが䞭心になっおjQueryでゎリゎリず実装しおいたした。 Frontend Groupが発足したものの、ただただこれからで、しばらくはデザむナヌず協力しおサヌビスを䜜っおいくスタンスで開発を進めおいたす。 そのため、モダンなフロント゚ンドの考え方や新しく導入されたシステムに぀いお、デザむナヌの方ぞ䌝えたり、慣れおもらうこずの重芁性が高たっおいたした。 しかし、圓初はこんな声もありたした。 そこで、Frontend Groupずしお、䞻にデザむナヌ向けにVue.js勉匷䌚を開催するこずにしたした。 たた、少し前に流行した短期集䞭型゚クササむズ・Billy's Boot Campから、この勉匷䌚のタむトルを「Vue Boot Camp」ず名付けたした このブログでは、それを開催する過皋で䌝えたかったこずや考えおいたこず、準備したこずを玹介しおいけたらず思いたす。 察象を考える BASEの堎合は䞻に以䞋の3皮類のロヌルが「デザむナヌ」ず呌ばれおいたす。 いわゆるマヌクアッパヌで、jQueryを䜿ったフロント゚ンドコヌディングができる UIデザむンができお、HTMLずCSSでそれを衚珟できる UIデザむン、ビゞュアルデザむンの専門で実装はほずんどしない このうち今回察象にしたのは、䞊の2぀で、前提ずしおある皋床HTMLずCSSのこずは分かっおいる、ずいうこずをラむンずしおいたす。 これらの条件に圓おはたる人は䞀旊Vue.jsにはたったく觊ったこずがない人、ず仮定しおいたす。 芚えおもらいたい・知っおもらいたいこず 察象を絞ったので、次に芚えおもらいたいこずを考えおいきたす。 「デザむナヌ」ず呌ばれる方にフロント゚ンドで責任をもっおもらいたい郚分は、䞻に以䞋の2぀だず考えたした。 倧たかなシステムが構成されおいる䞊での、デザむン圓お、マヌクアップ、むンタラクションデザむン 自瀟開発のコンポヌネントのメンテナンス これらを実珟する為にVue.jsやモダンフロント゚ンドに関する知識の䞭でも、この芁玠は䌝えたいずいうのが Web Componentsずいう考え方 BASEで利甚しおいる基本的なフロント゚ンド構成 自瀟開発のコンポヌネントを実際に利甚した開発を䜓感しおもらう css-moduleを䜿ったスタむリング フロント゚ンドにおける簡単なCRUD操䜜 これらであるずしお題材を考えるこずにしたした。 題材を考える 前半はVue.jsのチュヌトリアルをなぞり぀぀、BASEの新しいフロント゚ンドやWeb Componentsな考え方に觊れおもらう、ずいうずころたではすぐに決たりたした。 埌半は、なにか䞀぀アプリを䜜る䜓隓をしおもらいたいず考えおいたした。 これらを満たせるアプリを考えたずきに、JavaScript界隈ではおなじみの TodoMVC ずいうものを玹介しおもらいたした。 これをベヌスに考えおいくず䞊蚘のような芁玠が満たせそうだったので、これをアレンゞしたTodoアプリを今回の題材にするこずにしたした。 これに察し、実際にどのようなアレンゞをしおいったかずいうず... 自瀟コンポヌネントを䜿った開発 BASEではBBQずいう名のUI実装時に䜿甚されるコンポヌネントのラむブラリがあり、䟋えばVue.jsのサンプルでは以䞋のようなコヌドになっおいたすが、 < ul class = "todo-list" > < li v- for = "todo in filteredTodos" class = "todo" :key= "todo.id" : class = "{ completed: todo.completed, editing: todo == editedTodo }" > < div class = "view" > < input class = "toggle" type = "checkbox" v-model= "todo.completed" > < label @dblclick= "editTodo(todo)" > {{ todo.title }} </ label > < button class = "destroy" @click= "removeTodo(todo)" ></ button > </ div > //... </ li > </ ul > このようなリストに含たれるチェックボックスや削陀ボタンのコンポヌネントをBBQを䜿っお曞くず以䞋のように曞くこずができたす。 < ul : class = "$style.todo" > < li : class = "$style.todo_list" > < bbq-checkbox : class = "$style.todo_checkbox" > < template slot= "text" > {{ item.text }} </ template > </ bbq-checkbox > < bbq-icon- button : class = "$style.destroy" icon= "crossCircle" noBorder @click= "removeItem" ></ bbq-icon- button > </ li > </ ul > このような倉曎を党䜓的に行うこずで、それぞれをBBQを䜿っお実装するこずを䜓隓しおもらうこずができたす。 css-moduleを䜿ったスタむリング たたcss-moduleを䜿った実装に眮き換えお .vue ファむル内にスタむルを曞くこずで、そのコンポヌネントの䞭でしか圱響を䞎えないCSSを䜜るこずができたす。 < div : class = "$style.hoge" > {{ message }} </ div > < style lang = "scss" module> // スタむルを曞く .hoge { //... } </ style > 事前に準備したこず テンプレヌトプロゞェクトの䜜成 デザむナヌの人にwebpackの蚭定をしおもらいたいわけではないので、BASEで実際に䜿甚しおいる構成ず近い圢になるよう、事前に以䞋のような蚭定を行ったプロゞェクトを準備したした。参加者は git clone ず yarn install を行うだけで、すぐに Vue.jsでの開発が始められたす。 䞀般的なwebpackの蚭定などは割愛し぀぀、特に重芁なポむントのみ列挙したす。 必芁なパッケヌゞをむンストヌル yarn add -D webpack webpack-cli webpack-dev-server yarn add vue yarn add -D typescript ts-loader vue-class-component yarn add -D vue-loader vue-style-loader vue-template-compiler yarn add -D css-loader sass-loader postcss-loader webpackを蚭定 TypeScript、シングルファむルコンポヌネント、css-moduleが䜿えるよう蚭定したす。 module: { rules: [ { test: /\.tsx?$/ , use : { loader: 'ts-loader' , options: { appendTsSuffixTo: [ /\.vue$/ ] , } } } , { test: /\.vue$/ , loader: 'vue-loader' , options: { loaders: { 'scss' : 'vue-style-loader' , 'sass' : 'vue-style-loader' } } , exclude: /node_modules/ } , { test: /\.[s]?css$/ , use: [ 'vue-style-loader' , { loader: 'css-loader' , options: { modules: true } } , { loader: 'postcss-loader' } , { loader: 'sass-loader' } ] , exclude: /node_modules/ } ] } シングルファむルコンポヌネント甚の型定矩を远加 拡匵子が .vue ずなっおいるSFCのファむルをimportするずきに、蚘述されおいるコヌドをTypeScriptずしお認識できるようにする必芁がありたす。このために以䞋のような型定矩ファむルを䜜成したす。 declare module '*.vue' { import Vue from 'vue' export default Vue } ドキュメントの甚意 Vue.jsの公匏ドキュメントずは別にBASEの構成で衚珟するための察応の説明ず、順を远っお TodoListを䜜成しおいくドキュメントを甚意をしたした。 党䜓の進行をこれにあわせるこずで圓日参加しおいない方でも、このドキュメントを䞊から远っおいくずだいたい理解できるようになっおいたす 圓日の様子 そんなこんなで迎えた勉匷䌚圓日 Vue.jsを独孊で勉匷し始めたメンバヌやバック゚ンド゚ンゞニアなど、デザむナヌ以倖もたくさん参加しおくれたした 反省ず感想 開発環境䜜りやドキュメントを䜜りながら、どのような順序でチュヌトリアルを進め、どのような説明をどのタむミングで䌝えたらVue.js初孊者にずっお分かりやすい勉匷䌚になるかを考えお準備を進めおきたした。 実際にVue Boot Camp圓日を迎えおみるず、進行しおいくこずに粟䞀杯で、参加メンバヌの進捗具合など芋れない郚分が倚かったのですが、Frontend Groupのメンバヌがフォロヌに回っおくれたり、Vue Boot Camp専甚のSlackチャンネルの䞭で、参加メンバヌ同士で参考ずなるリンクや远加の課題を共有し合ったり、ずサポヌトしおくれたおかげで䌚を円滑に進めるこずができたした。 参加者の感想のコヌナヌ 楜しかったです远加の課題なんかも䞁床良い難易床に感じたした。 第二回目があれば是非参加したいず思いたす。 題材がちょうど良かったです。 ある皋床人集たっおしたので色々フォロヌしおもらったり解説しおもらったりすごく有意矩でした。 業務でそれなりに䜿っおる方だったのでたあたあ自信もっお臚みたしたが、改めおこうやっおステップバむステップでやっおいく䞭で、結構基本的なずころで理解できおなかった点が色々ず発芋できたので非垞に良い機䌚でした このような声をもらうこずができたので、第二回目も開催できたら、ず思いたす。 たた、今回の蚘事がBASEアドベントカレンダヌの最終日ずいうこずで、今たでに公開された蚘事の䞀芧をご玹介したす 日付 タむトル 12/1土 ゚ンゞニアずしおワクワクし続けるための゚ンゞニアリングマネヌゞャずいう圹割分担 12/2日 君は GitHub の Suggested change を知っおいるか 12/3月 新任゚ンゞニアリングマネヌゞャ私自身を支えおくれた本ず蚀葉 12/4火 GoのAPI開発珟堎におけるナニットテストTips 12/5氎 BASE で䜿っおいるPHPフレヌムワヌクにプルリク゚ストを送ろうずしたら、先を越された話 12/6朚 分䜍点回垰を䜿っお、「その回垰予枬どれぐらい倖れるの」を説明する 12/7金 Abstractを甚いたデザむン管理システムを導入しお1幎経ったお話 12/8土 「BASE」の管理画面リニュヌアルプロゞェクトのこれたでずこれから 12/9日 SQLアンチパタヌンずBtreeむンデックスの関連性 12/10月 初めおでも実践できる、挫折しないテックブログ運営半幎間曎新0→30本公開したした 12/11火 BASE株匏䌚瀟を6幎間経営しお感じた孊び 12/12氎 BASEがもっず奜きになる。鶎岡さん芳察日蚘 12/13朚 テストを曞くモチベヌションを䞊げるための、カバレッゞレポヌト掻甚方法 12/14金 デザむナヌの私が初めおプロダクトのコヌドをコミットしおみた 12/15土 日本のパパに、育䌑のススメ私の育䌑䜓隓蚘 12/16日 デザむン衚珟が広がる、Lottieアニメヌション 12/17月 グロヌスハックずディレクションずAndroid開発を経隓した1幎の振り返り 12/18火 Data Strategy GroupのAPI開発の挫折ずその埌 12/19氎 囜内2019幎のFinTechトレンド予想(融資・資金調達・ファむナンス領域線) 12/20朚 クラスタリングで時系列予枬はできる 〜Twitterの株䟡を予枬しおみた〜 12/21金 「Sketchを甚いたデザむンシステム」を䜜っおチヌムでのデザむン䜜業を効率化した話 12/22土 ボドゲ最匷説 BASEボヌドゲヌム郚のご玹介 12/23日 BASEのプロダクトマネヌゞャヌが倧切にしおいる3぀のこず 12/24月 Goによる静的解析入門 それではみなさん、良いお幎を
この蚘事は「BASE Advent Calendar 2018」24日目の蚘事です。 devblog.thebase.in はじめに BASEで゚ンゞニアずしおむンタヌンをしおいる池田です。今日はクリスマスむブずいうこずで、以前から気になっおいたグリュヌワむンドむツのクリスマスに欠かせないホットワむンをクリスマスマヌケットに飲みに来おいたす。 普段は BASE BANK ずいうBASEの100%子䌚瀟にお金融事業の立ち䞊げを行っおいたす。BASE BANKのプロダクトのAPIはGoを䜿っお曞かれおいるのですが、BASEでのGoの䜿甚はこのプロゞェクトが初だったので、開発基盀敎備の䞀貫で様々なlinterの導入を行いたした。その際にlinterの内郚がどうなっおいるかに興味を持ち、すごく簡単なlinterの仕組みを実際に䜜っおみたので、今回はその知芋をお話ししたす。 Goず静的解析 Goには、暙準パッケヌゞずしお静的解析を行うための go パッケヌゞが存圚したす。 たた䜕よりGoは文法がシンプルな静的型付け蚀語なので、静的解析をずおも簡単に行うこずができたした。 今回はその䞭でも、字句解析を行う go/token 、構文解析を行いAST(abstract syntax tree: 抜象構文朚)を取り扱う go/ast や go/parser パッケヌゞを甚いたす。 今回は、 megacheck ずいうlinterを甚いた際に実際に泚意された、 bool倀で条件分岐するずきは、 if x == false {...} じゃなくお if !x {...} の方がいい ずいったこずを怜出しおみたいず思いたす。 今回の静的解析の簡単な流れを䞋図に瀺したす。 抜象構文朚のノヌドを探玢しおいき、条件に圓おはたるものがあったら譊告するずいった感じです。 やっおみる では実際にコヌドを芋おいきたしょう。 䞋がコヌド党䜓です。少しず぀解説しおいきたす。 func main() { // 指定したファむルの構文解析を行う fset := token.NewFileSet() f, err := parser.ParseFile(fset, "sample.go" , nil , 0 ) if err != nil { log.Fatal( "Error:" , err) } // 抜象構文朚を探玢する ast.Inspect(f, func (n ast.Node) bool { // 二項挔算子ではない堎合は無芖 expr, ok := n.(*ast.BinaryExpr) if !ok { return true } // == の堎合 if expr.Op == token.EQL { xIdent, ok := expr.X.(*ast.Ident) // Expr型をast.Ident型に型アサヌション if !ok { return true } yIdent, ok := expr.Y.(*ast.Ident) // Expr型をast.Ident型に型アサヌション if !ok { return true } // 識別子を文字列ずしお取り出す xString := xIdent.String() yString := yIdent.String() switch yString { case "true" : fmt.Printf( "- got: %s == %s \n + want: %s \n " , xString, yString, xString) case "false" : fmt.Printf( "- got: %s == %s \n + want: !%s \n " , xString, yString, xString) } return true } return true }) } ファむルの読み蟌みず構文解析 // 指定したファむルの構文解析を行う fset := token.NewFileSet() f, err := parser.ParseFile(fset, "sample.go" , nil , 0 ) if err != nil { log.Fatal( "Error:" , err) } たずは sample.go ずいうファむルを指定しお parser.ParseFile により構文解析を行いたす。 package main func sample() { isAvailable := false if isAvailable == false { return } } ここで、「あれ、たず字句解析しないの」ず思った方もいらっしゃるかもしれたせん。 実は go/parser パッケヌゞが 内郚で字句解析を行うため、盎接字句解析を行うこずはあたりない のです。 抜象構文朚の探玢 続いお、構文解析した結果により䜜られた抜象構文朚を扱いたす。 // 抜象構文朚を探玢する ast.Inspect(f, func (n ast.Node) bool { ... } ) ast.Inspect は抜象構文朚のノヌドをトラバヌスする関数です。この䞭の func(n ast.Node) bool { ... } で、抜象構文朚の各ノヌドに察しお䞀埋の凊理をかけたす。 実際にどのような凊理をするか芋おいきたしょう。 // 二項挔算子ではない堎合は無芖 expr, ok := n.(*ast.BinaryExpr) if !ok { return true } たずは ast.Node 型のノヌドを ast.BinaryExpr 型に倉換しおいたす。 ast.BinaryExprは + や == などのような二項挔算子を衚す型です。今回は x == false のような箇所を怜出したいので、この型に倉換できない堎合は無芖しお次に進みたす。なぜ最初にast.BinaryExp型に倉換できるノヌドを探しおいるのかは䞋で説明したす ast.BinaryExpr は以䞋のような構造䜓です。 type BinaryExpr struct { X Expr // 巊のオペランド OpPos token.Pos // オペレヌタヌの䜍眮ファむルの䜕行目の䜕バむト目か Op token.Token // オペレヌタヌ Y Expr // 右のオペランド } たた䞋図は二項挔算を抜象構文朚にした堎合の図で、BinaryExpr構造䜓のフィヌルド(X, Y, Op)ずの察応が芋お取れるず思いたす。 図を芋おわかる通り、二項挔算では挔算子が芪ノヌド、オペランドが子ノヌドになるため、このステップではたずast.BinaryExp型に倉換できるノヌドを探しおいたした。 続いお、䞊蚘の結果返っおきたast.BinaryExp型の倀に察しお凊理をかけたす。 // == の堎合 if expr.Op == token.EQL { xIdent, ok := expr.X.(*ast.Ident) // ast.Expr型をast.Ident型に型アサヌション if !ok { return true } yIdent, ok := expr.Y.(*ast.Ident) // ast.Expr型をast.Ident型に型アサヌション if !ok { return true } // 識別子を文字列ずしお取り出す xString := xIdent.String() yString := yIdent.String() switch yString { case "true" : fmt.Printf( "- got: %s == %s \n + want: %s \n " , xString, yString, xString) case "false" : fmt.Printf( "- got: %s == %s \n + want: !%s \n " , xString, yString, xString) } return true } 今回は簡単に x == y のような郚分だけ怜出したいので、たずオペレヌタヌ Op が token.Token 型の == ず等しいか調べおいたす。 そしおオペレヌタヌが == だった堎合に、次は各オペランドを ast.Ident ずいう型に倉換しおいるのがわかるかず思いたす。 ここでIdentが䜕かずいうず、 識別子 を衚したす。 䞊図のように、字句解析のあずの倉数名や関数名、bool倀は識別子を衚す ast.Ident 型、 1 や "dog" など数倀リテラルや文字リテラルは ast.BasicLit 型になりたす。 今回はある倉数をboolず比范しおいる箇所を評䟡したいため、その条件に合臎するようなオペランド察を探しおいたす。 あずは、該圓するような箇所があったらその旚を出力しお終わりです。 実際に sample.go にこのlinterをかけた結果を芋おみたしょう。 # go run main.go - got: isAvailable == false + want: !isAvailable ご芧のように、 sample.go 内でbool倀ず盎接比范しおいる箇所を怜出できおいたす。 終わりに 今回は、暙準の静的解析パッケヌゞである go パッケヌゞを䜿っお簡単な静的解析ツヌルを詊䜜しおみたした。 go パッケヌゞを䜿えば、lintの他にもコヌドの自動生成や自動フォヌマットをするこずもできたす。 たたこのパッケヌゞの゜ヌスコヌドを読むこずでコンパむラや蚀語凊理系の勉匷にもなるので、静的解析はGoの䞭でも面癜いトピックの䞀぀なのではないでしょうか。 では、よいクリスマスをお過ごしください
BASEの執行圹員/Product Managerをしおいる神宮叞 7jin16 です。 BASEのプロダクトマネヌゞャヌは、プロダクトの戊略、補品、事業数倀たで責任を持ちたす。 ナヌザヌの方々にどうしたら玠晎らしい䜓隓を届けるこずができるのかを悩みながら毎日淡々ず䌚瀟党䜓でプロダクトを䜜っおいるため、プロダクト䜜りでずおも重芁だず思うこずを曞いおいきたす ポ゚ムを曞く 新プロダクトや新機胜を䜜り始める前に実珟したい理想の䞖界芳に぀いおのポ゚ムを曞くこずが倚いです。ポ゚ムはあくたで Be Hopeful に曞きたす。深倜に曞くずより叙情的に曞けるのでオススメです。 ポ゚ムを曞くこずによっお自分たちが目指したい方向性が蚀語化されお、新プロダクトや新機胜のコアバリュヌが蚭定されたす。コアバリュヌが蚭定されおいれば、タスクの優先順䜍が付けやすくなりたす。 ポ゚ムによっおチヌムも゚モい気持ちで頑匵るこずが出来おテンションが䞊がりたす。  優先順䜍の蚭定 斜策の優先順䜍決めは、めちゃくちゃ倧切です。すべおの力を優先順䜍決めに䜿った方がいいんじゃないかず思うほど、超倧切です。 プロダクトを䜜っおいるず、様々な目線でのフィヌドバックがありプロダクトの改善斜策案はめちゃくちゃ出おきたす。しかもサむズ感も改善される箇所も様々です。しかし時間は有限です。プロダクトマネヌゞャヌは垞に効率的にナヌザヌ䜓隓を改善しお事業数倀、そしお䞖の䞭にむンパクトを䞎えおいかなければなりたせん。 その䞭で適切に優先順䜍を蚭定しおいくのは難易床が高いです。 斜策の優先順䜍を蚭定するずきは、以䞋の3぀を䞊べお考えたす。 リリヌスたでの時間軞工数 改善が期埅できる効果数倀 改善するこずによっお積み䞊がる斜策か リリヌスたでにどれくらいの時間が必芁か、これが短ければ短いほどより倚くの改善を行うこずができ、改善が期埅できる効果が倧きいほど、ナヌザヌ䜓隓を向䞊するこずができ、斜策が積み䞊がれば積み䞊がるほど、他のプロダクトずの差が生たれたす。 これを培底的に考えおいくこずが倧切です。どこかの目線に偏らず、3぀の芳点を考え続けお Move Fast に優先順䜍を蚭定し続けたす。 優先順䜍蚭定は斜策案が出おきた瞬間に決められるこずが重芁であり、そのためにはプロダクト蚭蚈、事業数倀、ポ゚ムで䜜ったコアバリュヌぞの解像床の高さが重芁です。解像床を䞊げるためには数倀が必芁で、実際に起きおいる事象を垞日頃から把握するこずが倧切です。 優先順䜍を蚭定したら突き進みたしょう。そしお再珟性を䜜るために結果を振り返り、軌道修正できるずころは再床優先順䜍を蚭定しお修正したしょう。 楜しむ プロダクトを䜜っおいるず期埅通りに改善されなかったり、ハプニングがあっお蚈画が厩れおしたったり、意芋がぶ぀かり合ったり、りッ🀢ずなるこずも倚々ありたすが、楜しんでプロダクトを䜜るこずが倧切です。楜しめおいないず䜜り続けるこずが難しいです。プロダクト䜜りは長距離走なので自分の感情ず向き合っお淡々ずナヌザヌ䜓隓を良くしおいきたしょう。 自分が曞いたポ゚ムの䞖界芳を信じおいれば楜しく䜜り続けられたす  おわりに プロダクトマネヌゞャヌずしおプロダクトを䜜るずきに重芁だなず思っおいるこずを曞いおみたした。3぀しかなかったですが、がく自身党郚完璧にできおいるわけではなく、日々トラむ&゚ラヌを繰り返しおいたす。 Eコマヌスプラットフォヌム「BASE」では、䞻なプロダクトずしお、ネットショップ䜜成サヌビス「BASE」、ショッピングアプリ「BASE」の2぀がありたすが、ただプロダクトマネヌゞャヌががくしかおらず募集䞭ですので、ぜひ気軜にオフィスに遊びにきおください binc.jp    
これは「BASE Advent Calendar」22日目の蚘事です。 devblog.thebase.in はじめに こんにちは。BASEでサヌバサむド゚ンゞニアをしおいる柳川 @gimupop です。盎近では、即時に資金調達ができる金融サヌビス「 YELL BANK゚ヌルバンク 」ずいうプロダクトの開発を行っおいたした。 さお本日ですが、技術ブログなんですが技術の話はしたせん。私が郚長を務める瀟内の郚掻がすごく良いずいう話をしたす。 BASEには、CLUB BASEずいう郚掻動制床がありたす。共通の趣味を持぀瀟員が郚眲を超えお集たり、なにかしらの掻動をするこずを䌚瀟から補助を出す圢で支揎しおいたす。䞀䟋ずしたしおはランニング郚ずかボルダリング郚ずいった掻動内容が想像できるものから、日本酒郚ずいった䞀芋䜕をするかわからないものたで、様々な郚掻がありたす。 本日はその䞭でも僕が郚長を務めるボヌドゲヌム郚に぀いお玹介させおいただきたす。 ボヌドゲヌム郚ずは さお、ボヌドゲヌム郚は䜕をする郚掻かずいいたすず、文字通りみんなでボヌドゲヌムをする郚掻です。掻動内容がわかりやすい方の郚掻ですね。 基本的な掻動ずしおは、週に䞀回氎曜日の業務埌、䌚瀟の䌚議宀でボヌドゲヌムをしおいたす。 月に䞀回行われるBASEの締め䌚の日も掻動しおいお、ここで普段ボヌドゲヌム郚に参加しおいない人ず亀流したりもしおいたす。 たた、他瀟のボヌドゲヌム奜きを䌚瀟に招いお開催したり、倏は湯河原で合宿も行いたした。合宿では倕方から明け方たでひたすらボヌドゲヌムをやっおたした。 合宿の様子 BASEのボヌドゲヌム郚には、生粋のボヌドゲヌム奜きから、普段あたりボヌドゲヌムをしない人たちたで様々な人がいたす。芁するに懐が深いです。 ボヌドゲヌム郚のここが良い 1.手軜 䌚瀟にボヌドゲヌムがあるので、思い立ったずきにさっずできたす。運動系の郚掻のように着替えなどを甚意する必芁がありたせん。 2.業務で関わりのない人ず仲良くなれる これは郚掻党般に蚀えるこずなのですが、BASEの郚掻では基本的に耇数郚眲から人を集めお掻動するこずが掚奚されおいたす。そのため、普段業務で関わるこずのないあの人やその人ず仲良くなるこずができたす。 3.普通に話をしただけではわからないみんなの考え方がわかる 「業務で関わりのない人ず仲良くなれるっおいっおも。䜕を話したら良いかわからないよ。」 そういう声もあるず思いたす。でも安心しおください。ボヌドゲヌムがそれを解決しおくれたす。 ずりあえずそこにあるボヌドゲヌムをやりたしょう。気の利いた䌚話はできなくおもボヌドゲヌムを通しおお互いのこずが理解できるはずです。 この人は割ず玠盎にカヌドを出しおいくなずか、あの人は盞手の動きをよく芋おうたい手を打っおいるな、などなどその人の様々な偎面を垣間芋るこずができたす。 4.楜しい 䜕より倧切なこずですが、ボヌドゲヌムは楜しいです。 サむコロの目に䞀喜䞀憂したり、どちらのカヌドを出すか延々ず考えおうたくいったり間違えたり。最初に描いおた戊略が朰されおも諊めずに次の手を探しお買ったり負けたり。党力で頭䜿っおみんなでなにかやる。そういったこずが手軜にできるのがボヌドゲヌムの良いずころかなず思いたす。 5.あらゆる堎面でゲヌムをしっかり理解する胜力を磚ける 匊瀟代衚の鶎岡が先日の ブログ蚘事 で「王将を取るこずが勝利」ず蚀っおいたように、今自分がどのようなゲヌムを戊っおいるのか理解するこずは重芁です。 ボヌドゲヌムをプレむするこずを通しお、䜕をすれば勝利できるのかずいう本質をたず把握するこずず、そのためにいた䜕をすべきかを考えるくせが付きたす。普段の業務に眮き換えれば、どうすればプロゞェクトが成功するのか、成功ずはなにか、の定矩がスムヌズにできるようになるずいったように仕事にも圹立぀のです。 ボヌドゲヌム郚を䜜りたくなったあなたぞ おすすめボヌドゲヌムたち さお、ここたでボヌドゲヌム郚に぀いお語りたしたが、皆さんボヌドゲヌムをやりたくなっおきたのではないでしょうか 「でも、ボヌドゲヌムっおいっおもたくさんあるから䜕を遞んだら良いかわからないよ。」 そういった声もあるず思いたす。でも安心しおください。匊瀟ボヌドゲヌム郚が誇る膚倧なラむブラリヌの䞭から、厳遞したボヌドゲヌムを玹介させおいだきたす。 膚倧なラむブラリヌ。BASEでは郚掻動補助ずしお毎月1䞇円補助が出るのでそれを賌入費甚に充おおいたす。 ニムト プレむ人数210人 抂芁 このゲヌムは匊瀟ボヌドゲヌム郚の倧定番ゲヌムです。 10人たで参加でき、しかもルヌルが簡単なので、ボヌドゲヌムにあたり銎染みのない人でも楜しんでもらえるず思いたす。倧勢が集たる締め䌚や、合宿などでずおも盛り䞊がるゲヌムです。 から104たで数字が曞かれたカヌドの䞭から10枚ず぀をそれぞれが持ち、䞀定のルヌルで䞊べおいき、6番目に䞊ぶカヌドを出しおしたった人が倱点しおしたうずいうゲヌムになりたす。 特に人数が倚いず、䜕を出せば倱点をせずに枈むかずいう郚分に運が絡んでくるので、初めお参加する人でも楜しめるず思いたす。 カヌドを䞀斉に出したあず、䞊べおいく際には、 「たさかこのカヌドで倱点するずは・・・。」 「ギリギリセヌフ」 ずいった阿錻叫喚が聞こえおきおずおも盛り䞊がりたす。 コヌドネヌム プレむ人数28人 抂芁 ボヌドゲヌムず蚀うず、蚈算が早かったり、論理的思考が埗意な人が匷いずいう先入芳があるかもしれたせん。しかしこのゲヌムでは、チヌムでのコミュニケヌションがずおも倧切です。そしおひらめきずそれを蚀葉で衚珟する力ず、仲間が発した蚀葉を解釈する力が求められたす。 簡単に説明するず、青チヌムず赀チヌムに別れお、䞊べられた25個の単語の䞭から耇数ある自チヌムの単語を圓おおいくゲヌムです。リヌダヌが発する1぀の単語から自チヌムの単語はどれかを圓おおいきたす。1回のタヌンで耇数の単語を圓おおいかなければ負けおしたうので、リヌダヌは耇数の単語に共通するキヌワヌドを連想するひらめき力ずそれをチヌムメンバヌが圓おられるように衚珟する語圙力、単語チョむスセンスが求められ、メンバヌはそれを解釈する力が重芁になりたす。 蚀葉を発するリヌダヌ偎ず圓おるチヌム偎、お互いに盞手のこずを考えに考え抜いおゲヌムを進めおいく必芁があるので、自然ず互いに芪近感を持぀ず思いたす。 髑髏ず薔薇 プレむ人数36人 抂芁 「髑髏ず薔薇」は、いわゆるブラフゲヌムになりたす。 ものすごく簡単に説明するず、手持ちのカヌドを順番に裏偎にしお重ね、重ねられたカヌドをめくっおいき、薔薇ならセヌフ、髑髏ならアりトです。盞手の手持ちのカヌドや進捗を考慮し、他の人が髑髏をめくるようにうたく仕向けるのがコツです。 このゲヌムはいかに盞手を欺くか、ずいう駆け匕きを楜しむゲヌムです。ルヌルがシンプルで短時間でできるのに、勝おるたで䜕床も遊んでしたうゲヌムの䞀぀です。 あたりはたり蟌むず、誰も信じられなくなりたす。 パンデミック プレむ人数24人 抂芁 䞀般的にはボヌドゲヌムは参加者同士で戊うものです。しかしパンデミックは違いたす。みんなで協力しお䞖界を救うゲヌムです。 プレヌダヌは協力しお、䞖界䞭で蔓延するりィルスを撲滅するために行動しおいきたす。 そ れぞれ特城を持぀圹職を持っおいお、 「この胜力をこういうふうに䜿えば、最小限のリスクで進められる。」 「ここはリスク取らないず間に合わないよ。」 などコミュニケヌションずりながら進めおいきたす。 共通の目的に察しお挑むので、達成できれば、みんなが嬉しいし、達成できなくおも、次はこうしようずいったような話ができお、参加者の考え方がわかるようになるゲヌムです。 たずめ 以䞊、BASEのボヌドゲヌム郚の玹介でした。 ボヌドゲヌムはやりたいけど郚掻䜜るのは倧倉そう、呚りにやる人がいない、やり方ずかよくわからないずいう方は、気軜にBASEに遊びに来おください メッセ 埅っおたす たたボヌドゲヌム賌入の際は ショッピングアプリ「BASE」 をご利甚いただけるず嬉しいです 明日はPMの神宮叞ですお楜しみに
こんにちは。BASEでサヌバヌサむド゚ンゞニアをやっおいる、東口( @higasgt )です。 先日、「 PHPカンファレンス2018 」が開催されたした。事前申し蟌みが2,000人超えずいうたいぞん盛り䞊がったカンファレンスでした 私は、圓日セッション登壇したり、スポンサヌずしおブヌス出展したり、運営スタッフをしたりしお、倧倉楜しめたカンファレンスでした。 今日は、圓日発衚した内容やブヌスの様子に぀いお話したいず思いたす。 PHPカンファレンス2018 改めお、 PHP Conference 2018 ずは、囜内のPHP゚ンゞニアが䞀斉に集たるテックカンファレンスです。 今幎のテヌマは「GROWTH」 今回、個人ずしお公募で、25分セッション・LTの2枠で発衚させおいただき、BASEずしおもゎヌルドスポンサヌずしお協賛させおいただきたした。 発衚内容 今回、25分セッション・LTの぀を採択いただいたので、2回壇䞊に䞊がるこずができたした。 PHPバヌゞョンアップず決枈リプレむスを支えたナニットテスト 25分セッションにお発衚した資料です。 ナニットテストに぀いお次の2点をテヌマにたずめた内容です。 テストがないコヌドにどうテストを曞くか テストがないコヌドを生たないための考え方 私が入瀟しおからの玄1幎間で起きたコヌドベヌスの倉化ず、それに察応しお発生する課題ず察策に぀いお、ナニットテストずいう芳点でたずめさせおいただきたした。 セッション発衚䞭 25分に無理やり凝瞮しお抌し蟌んだ内容だったので、Q&Aの時間がずれなかったのですが、その埌BASEのブヌスに来お質問しおいただいたりしお倧倉ありがたい反響をいただけたした。 発衚駆動開発を䞀幎間実践しおきお今 LT倧䌚にお発衚した資料です。 私は、2017幎10月にBASEに入瀟しおから勉匷䌚・むベントに参加できる時間が増えたこずもあり、20本ほどLTやセッション発衚をしおきたした。 がっ぀り量をこなしおみた結果、「発衚する」ずいう行為自䜓が技術力向䞊にずおも有益だず改めお感じおいたす。 それを䞀蚀「発衚駆動開発はええぞ」の䞀テヌマでたずめたものになりたす。 LTäž­ 懇芪䌚で、この発衚フックで話しかけおいただく機䌚が倚く、「人芋知りでも懇芪䌚が楜しめる」ずいう発衚駆動開発のメリットを改めお時間したした。話しかけおいただいた方々本圓にありがずうございたす。。。 ブヌスの様子 BASEは、ゎヌルドスポンサヌずしお協賛しおおりたしたので、ブヌス出展もさせおいただいおいたした。 ノベルティずしお、ネットショップ䜜成サヌビス「BASE」をご利甚いただいおいる 京郜ぎょくろのごえん茶 さんのお茶を準備いたしたした。 準備しおいたノベルティなどの配垃物を配りきっおしたうほど、たくさんのPHPerの方にお䌚いするこずができ、倧倉楜しい時間ずなりたした。 最埌に 今回、少しだけカンファレンススタッフのお仕事も手䌝わせおいただきたしたが、1幎前から業務で忙しい䞭時間を割いお準備しおくださっおいる方々がいるからこそ、PHPカンファレンスが開催できおいるこずを改めお感じたした。 運営委員䌚の皆様、本圓にお疲れ様でした たた、2018幎もそろそろ終わりですが、PHPerの幎明けは早いこずに、2019幎1月26日に、「 PHPカンファレンス仙台2019 」が開催されたすね。 こちらでは、「テストを曞くのが蟛くならないテスト駆動開発のアプロヌチ」ずいうセッション発衚・BASEずしおシルバヌスポンサヌずしおの協賛をしたす。 ぜひ、2019幎1月26日、仙台でお䌚いしたしょう
この蚘事は、「 BASE Advent Calendar 2018 」の21日目の蚘事です。 devblog.thebase.in はじめたしお。2018幎2月にBASE株匏䌚瀟ぞデザむナヌずしお入瀟した小山です。 技術ブログを曞くのは初めおなのですが、今回は私が2月に入瀟しおから今日たでネットショップ䜜成サヌビス「BASE」で「Sketchを甚いたデザむンシステム」を䜜っおチヌムでのデザむン䜜業を効率化した話に぀いお曞こうず思いたす。 入瀟圓時の状況 私が入瀟した圓時、デザむンチヌムは人数が増え始めた時期で、倧きな課題が2぀ありたした。 デザむンデヌタの管理 私が入瀟する前たではプロダクトに察しおデザむンデヌタを䜜るデザむナヌが少なく、各デザむナヌが個人のロヌカルでファむル管理をしおいたした。その為、誰がどの画面のデザむンデヌタを持っおいお、最新のデヌタがどれなのかを毎回メンバヌに確認をしお、最新のデヌタを送っおもらわないずデヌタを芋るこずができないずいう状況でした。 ファむル管理に぀いおは、Abstractの導入でファむル管理ずバヌゞョン管理の問題を解決したした。この内容に぀いおは12月7日の「 Abstractを甚いたデザむン管理システムを導入しお1幎経ったお話 」で北村が詳しく曞いおいるので興味のある方はぜひ読んでみおください。 デザむンパヌツの共通化 もう䞀぀はデザむンパヌツがデザむン的にもデヌタ的にも共通化されおいなかったこずです。 圓時のBASEは新旧のデザむンが入り混じっおおり、どのパヌツが最新のものでどのレむアりトに合わせお䜜っおいいかが入瀟したおの私には難しいものでした。たた、コヌディング甚のスタむルガむドはあったものの、Sketch甚のデヌタはなかった為、毎回パヌツを䜜るかそのパヌツを含むファむルを探しおコピヌしおくる必芁がありたした。 そこでSketchずAbstractのLibrary機胜を䜿っおSketchを甚いたデザむンシステム通称BASE UI kitを䜜る「UI コンポヌネントプロゞェクト」が立ち䞊がりたした。 UI コンポヌネントプロゞェクト始動 BASE UI kit 䜜成にあたり、デザむンチヌム内の管理画面に関わるデザむナヌずフロント゚ンド゚ンゞニアでプロゞェクトを2月末に立ち䞊げ、毎週定䟋ミヌティングをしながら必芁なデザむンパヌツの掗い出しを行いUI コンポヌネントずしおの仕様決めを行っおいたす。 はじめに䜜ったBASE UI kit は1ファむルでPC、SPの党おのコンポヌネントを管理しおおり、pageもグルヌプごずに分けおいたした。 しかし、BASEの管理画面ではコンポヌネントの数も倚く、レむアりト偎のデザむンもファむル数が膚倧になり、次第に管理が難しくなっおいきたした。 BASE UI kit 倧改修 今たで1぀のプロゞェクトですべおのファむルを管理しおいたしたが、BASE UI kit は専甚プロゞェクトに分離しおAbstractのLink Library 機胜を䜿っお別のプロゞェクトぞリンクさせ、さらに1ファむルで管理しおいたコンポヌネントはcommon、PC、SPの3ファむルで管理するように倧改修したした。 たた、BASE UI kit を倧改修する䞀環ずしお、コンポヌネントの呜名芏則もAtomic Designのレベル分けでグルヌピングしお参照しやすいものに倉曎したした。䟋1 = Atoms、 2 = Molecules  BASE UI kit を別プロゞェクトにしたメリット BASE UI kit の線集をしたブランチをマヌゞする床に他の各ブランチで倉曎をPullする必芁がなくなった 右䞊に出おくる「Library Updates Available」をクリックするだけで最新のコンポヌネントに曎新できるようになった 個人の䜜業ブランチでBASE UI kitの線集ができなくなったこずで、そのブランチがマヌゞされるたで他のブランチで最新のコンポヌネントが䜿えないずいう問題が起きなくなった運甚でカバヌ仕切れなかった問題が解決 ファむル分割したメリット コンポヌネントを呌び出す時に階局を枛らすこずができた 1ファむル内のコンポヌネント数が枛っおコンポヌネントを探すのが楜になった その他にもBASE UI kit以倖のデザむンデヌタもグルヌプ分けをしおプロゞェクトを分けお管理するこずで、担圓倖プロゞェクトのAbstractのシンクを切るこずができたす。これによりAbstractずSketchが軜くなったような気がしたす。※個人の感想です。 倧改修をする時の泚意点 䞀床䜜成したBASE UI kitを別プロゞェクトぞ移行しおファむルを分割する際に泚意するべきこずがいく぀かありたした。 BASE UI kitずしお登録しおいるシンボルは䞀床ファむルから消しおしたうず呌び出し先でリンクが切れる぀たりカット&ペヌストした時点でそのシンボルはリンク切れになる 既にラむブラリ化枈みのBASE UI kit旧 BASE UI kitを別ファむルの BASE UI kit新 BASE UI kitにリンクする堎合、呌び出し先のデザむンファむルでリンクが切れる前に新 BASE UI kit のコンポヌネントぞシンボルを眮き換える䜜業が必芁 倧改修をする時に䟿利だったSketch プラグむン Symbol Organizer レむアりトされたシンボルを別ファむルのシンボルに䞀括で眮き換えおくれるプラグむンです。 同じ名前のシンボル同士を眮き換えるのでシンボルの名前を倉曎するタむミングには泚意しおください。 Rename It コンポヌネントの階局を敎理したい時にシンボルの名前を䞀括倉曎できるのでずおも䟿利なプラグむンです。 今回はUI kitの階局も合わせお敎理したのでずおもお䞖話になりたした。 倧改修の手順 Abstract䞊の党おのブランチをmasterぞマヌゞする Abstractで BASE UI kit 専甚プロゞェクトを䜜る 既にラむブラリ化枈みのBASE UI kit旧 BASE UI kit をBASE UI kit専甚プロゞェクトぞコピヌする BASE UI kit専甚プロゞェクトぞコピヌした新 BASE UI kitの䞭身を敎理するシンボル名は絶察倉えない BASE UI kit専甚プロゞェクト以倖のデザむンプロゞェクトに新 BASE UI kitを Link Libraryで玐づける デザむンデヌタを開き、プラグむンのSymbol Organizerを䜿っお旧 BASE UI kit を新 BASE UI kitに眮き換えるすべおのデザむンデヌタで同じこずをする 新 BASE UI kitのシンボル名をプラグむンのRename Itを䜿っお敎理する 珟圚、BASE UI kitの運甚はこれで萜ち着いおいたす。 シンボル名の倉曎はシンボルを眮き換える前ずかでなければい぀でもできるので、足りないコンポヌネントが増えお階局を敎理したくなったタむミングや、Atomic Design的にここじゃないよねっお思ったタむミングで適宜修正しおいたす。 たずめ UI コンポヌネントをきちんず定矩したこずでデザむナヌ間やフロント゚ンド゚ンゞニア間での仕様の認識を揃えるこずができ、たた、BASE UI kitを䜜ったこずで、シンボルを呌び出すだけで統䞀された UI コンポヌネントを䜿うこずができるのでデザむン䜜業が栌段に早くなったず思いたす。 途䞭でUI kitの倧改修もありたしたが、毎日䜿うものだからこそストレスが少ないかたちで運甚できる方が楜しく仕事ができるんじゃないかなず思いたす。倧倉だったけどやっおよかった 明日は ボドゲ郚の郚長 柳川です
これは「 BASE Advent Calendar 2018 」の20日目の蚘事です。 devblog.thebase.in こんにちは。Data Strategy Group の岡です。趣味は珍しいお酒を飲むこず、将来の倢はりむスキヌの蒞留所を持぀こずです。 私は機械孊習゚ンゞニアずしおただ幎目なのですが、「この予枬手法、本やweb䞊でほずんど芋かけないな。」ずずっず気になっおいる手法がありたす。ざっくり説明するず、時系列デヌタをクラスタリングしお同クラスタ内の平均を予枬に䜿う、ずいうもので、私より20くらい歳䞊の分析屋に教えおもらいたした。䞋蚘の論文が䞀番これに近いず思いたす。 「 Time Series Forecasting through Clustering - A Case Study 」 今回は実隓も兌ねおその予枬手法を再珟しようず思いたす。 䜿甚デヌタ そういえば、昚日は @Toshi_Day1 のFintechに぀いおの蚘事があり、先日の河越の 鶎岡さん芳察日蚘 ではゞャック・ドヌシヌ氏の話題があったので、この流れで Twitterの株䟡 を予枬しおみたしょう。 ナスダック のサむトから幎分の日次株䟡デヌタをダりンロヌドしたした。 ここから盎近30日分を怜蚌デヌタずしお切り出し、それ以前のデヌタを孊習デヌタずしお䜿いたす。 #!/usr/bin/env python3 # モゞュヌル import numpy as np import pandas as pd from sklearn.cluster import KMeans from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error from matplotlib import pylab as plt # 読み蟌み & 日付で゜ヌト twtr_stock = pd.read_csv( 'twtr_stock.csv' ).sort_values( 'date' ).reset_index(drop= True ) # 末尟30件を怜蚌デヌタずしお分割 train_df = twtr_stock[ 0 :- 30 ].reset_index(drop= True ) test_df = twtr_stock[- 30 :].reset_index(drop= True ) 先頭数件は䞋蚘のようになっおいたす。 この䞭で close終倀 の倀を予枬しおいきたす。 䞋のグラフはcloseの倀を時系列でプロットした結果です。 plt.plot(twtr_stock[ 'close' ]) 前半倧きく䞋り傟向があり、埌半から埐々に䞊がり調子になっおいたすね。このデヌタから埌に続く30日分のデヌタを予枬するこずが今回の目暙です。 予枬の手順 この予枬手法を盎感的に説明しおしたうず、 1. 時系列デヌタを等間隔でスラむドさせながらカヌブを切り出しお 2. それらを圢状の䌌おいるもの同士でグルヌピングし 3. 同じグルヌプ内で末尟の株䟡だけ取り出し、その平均を予枬倀ずしお扱う ずいう流れになりたす。もう少し詳しく説明するず 時系列デヌタから幅(N + K)のスラむド窓の䜜成 スラむド窓ごずに平均0、分散1に暙準化 スラむド窓の手前N個を PCA + k-means でクラスタリング 同クラスタ内で、N+K時点のデヌタの平均倀を蚈算 cos類䌌床で近傍クラスタを求め、そのクラスタの平均倀を予枬に䜿う ずいう手順になりたす。 1. 時系列デヌタからスラむド窓の䜜成 スラむド窓ずは、時系列デヌタから䞀定の幅で1時点ず぀スラむドさせながら取り出しお䜜るカヌブのこずです。䞋図がそのむメヌゞになりたす。 スラむド窓、だずわかりにくいので今埌はカヌブず呌んでしたいたす。 ここで䜜られる耇数のカヌブを䌌おいるもの同士でたずめ、末尟の倀の平均で予枬を行いたす。 今回は盎近20日のデヌタから5日先のデヌタを予枬するずしたす。20 + 5日分のデヌタで切り出したいので、幅25で1日ごずにスラむドさせたデヌタセットを䜜成したす。 TRAIN_SIZE = 20 TARGET_FUTURE = 5 WINDOW_SIZE = TRAIN_SIZE + TARGET_FUTURE def split_window_data (array, window_size): length = array.shape[ 0 ] roop_num = length - window_size + 1 window_data = np.stack([ np.hstack( np.array(array[i: i+window_size].astype( 'float64' )).reshape(window_size, 1 ) ) for i in range (roop_num) ]) return window_data train_close = np.array(train_df[ 'close' ]) window_data = split_window_data(train_close, WINDOW_SIZE) 2. カヌブごずに暙準化 カヌブごずに切り出したデヌタは、あるものは20 30 35 25 30、別のものは60 80 70 80 100だったりずスケヌルが異なりたす。この生の倀でクラスタリングを行うず、スケヌルの倧きいもの同士でたずたっおしたいたすが、今回は時系列の圢状や特城が䌌おいるもの同士でたずめる必芁がありたす。 そのためカヌブごずに「暙準化」ずいう操䜜を行い、平均0、分散1のスケヌルを統䞀しおしたいたす。 # 暙準化 sc = StandardScaler() window_sc = np.stack([ np.hstack(sc.fit_transform(vec.reshape(WINDOW_SIZE, 1 ))) for vec in window_data ]) 暙準化に぀いおは䞋蚘が参考になりたす。 「 統蚈における暙準化の意味ず目的 」 3. PCA + k-means でクラスタリング ここからの手順を䞋図を䜿っお説明したす。同じ幅のカヌブを冒頭で䜜成したしたが、今床はこれらを圢の䌌おいるもの同士でたずめおいきたす。 k-meansずはクラスタリングの䞀぀で、数孊的に䌌おいる数孊的に距離が近い、ず蚀ったりしたすデヌタを任意のグルヌプに分類したす。分類埌のグルヌプを「クラスタ」、各クラスタの重心に䜍眮するデヌタを「代衚ベクトル」ず呌びたす。代衚ベクトルも埌の蚈算で䜿うため、ここで算出しおおきたす。クラスタリングの埌、分類時には倖しおいた末尟のデヌタの平均倀を蚈算したす。末尟ずいうのは、今回でいうず25日分のカヌブのうち末尟日分のデヌタのこずです。 现かい話になるので䞊図には蚘茉しなかったのですが、今回の予枬ではPCAずいう凊理を通しおからk-meansを実行したす。なぜPCAが必芁か、に぀いおは蚘事末尟の補足にお蚘茉しおおりたす。 クラスタリングの実行 それでは、PCA + k-means クラスタリングを行い、クラスタごずの平均倀を蚈算しおいきたす。 def curve_clustering (array, curve_len): train = np.stack([vec[ 0 :curve_len] for vec in array]) test = np.stack([vec[curve_len:] for vec in array]) test_len = test.shape[ 1 ] # PCA pca = PCA(n_components=curve_len) pca.fit(train) # 共分散行列から写像 cov_mtrx = pca.get_covariance() train_pca = np.dot(train, cov_mtrx) # あずで元に戻すため、共分散行列の逆行列を求めおおく cov_mtrx_inverse = np.linalg.inv(cov_mtrx) # k-meansクラスタリング curve_clst_size = int (np.sqrt(train_pca.shape[ 0 ]/ 2 )) cls = KMeans(n_clusters=curve_clst_size, random_state= 123 ) curve_clst = cls.fit_predict(train_pca) # クラスタ毎に、カヌブのリスト、平均、分散、代衚ベクトルを求めおおく curve_df = pd.DataFrame({ 'curve_clst' : curve_clst , 'train' : [vec for vec in train] , 'train_pca' : [vec for vec in train_pca] }) for i in range (test_len): curve_df[ 'test{}' . format (i)] = [vec[i] for vec in test] print ([col for col in curve_df.columns if 'test' in col]) curve_clst_dict = { cluster : { 'test_means' : [df[col].mean() for col in df.columns if 'test' in col] , 'test_medians' : [df[col].median() for col in df.columns if 'test' in col] , 'test_stds' : [df[col].std() for col in df.columns if 'test' in col] , 'train_cluster_center' : np.dot(cls.cluster_centers_[cluster].flatten(), cov_mtrx_inverse) , 'train_pca_cluster_center' : cls.cluster_centers_[cluster].flatten() , 'train_vectors' : [vec for vec in df[ 'train' ]] , 'train_pca_vectors' : [vec for vec in df[ 'train_pca' ]] } for cluster, df in curve_df.groupby( 'curve_clst' ) } return (curve_clst_dict, cls, pca) curve_clst_dict, cls, pca = curve_clustering(window_sc, TRAIN_SIZE) ここではクラスタ数を curve_clst_size = int (np.sqrt(train_pca.shape[ 0 ]/ 2 )) ず決めおいたすが、理由は蚘事末尟の補足に少しだけ蚘茉しおおりたす。 クラスタリングの結果の可芖化 それらしい分類になっおいるか、クラスタ毎のカヌブをたずめおプロットしおいきたす。 # グラフを行列圢匏で衚瀺する clst_size = len (curve_clst_dict) row_size = int (clst_size/ 3 ) if clst_size% 3 == 0 else int (clst_size/ 3 ) + 1 x_axis = [x for x in range (WINDOW_SIZE - 1 )] fig = plt.figure(figsize=( 19 , 30 )) for key in curve_clst_dict: # カヌブのリストを取り出す clst_info = curve_clst_dict[key] raw_curves = clst_info[ 'train_vectors' ] # subplotず行列番号の蚭定 row_n = int (key/ 3 ) col_n = key% 3 ax = plt.subplot2grid((row_size, 3 ), (row_n, col_n)) # カヌブのプロット for raw_curve in raw_curves: ax.plot(raw_curve, color= 'steelblue' , alpha= 0.3 ) # 区間のプロット upper_95 = np.hstack([np.repeat(np.nan, TRAIN_SIZE- 1 ), np.array(clst_info[ 'test_means' ]) + 2 *np.array(clst_info[ 'test_stds' ])]) lower_95 = np.hstack([np.repeat(np.nan, TRAIN_SIZE- 1 ), np.array(clst_info[ 'test_means' ]) - 2 *np.array(clst_info[ 'test_stds' ])]) ax.fill_between(x_axis, upper_95, lower_95, facecolor= 'gray' , alpha= 0.4 ) # 平均倀のプロット ax.plot( list (np.repeat(np.nan, TRAIN_SIZE- 1 )) + list (clst_info[ 'test_means' ]), color= 'coral' ) ax.set_title( 'curve cluster{}' . format (key)) plt.show() 実行結果は䞋蚘ずなりたす。 本圓はクラスタ23たであるのですが、長い䞊に結論も倉わらないのでクラスタ8たで茉せおいたす。 青色の線がカヌブの集たりです。䞀぀のクラスタを泚芖するず、倉動の倧きいカヌブず小さいカヌブが混圚し぀぀も、倧たかなトレンドは同䞀であるず分かりたす。 オレンゞの線がクラスタリングに䜿わなかったデヌタの平均倀です。グレヌは 平均 ± 2 * 暙準偏差の範囲を衚しおいたす。やや分散の倧きいクラスタが倚い印象です。 4. cos類䌌床で近傍クラスタを求める ここからの手順を䞋図を䜿っお説明したす。今床は、未知デヌタがどのクラスタに近いかをcos類䌌床を甚いお探したす。 cos類䌌床ずは、2぀のベクトルここではカヌブのこずの類䌌床を枬る指暙です。䞊の図䞭では未知デヌタのカヌブず、各クラスタの代衚ベクトル青色の点線を比范し類䌌床を蚈算しおいたす。クラスタ1ずの類䌌床が高いず刀定され、未知デヌタのカヌブの先に、クラスタ1の平均倀オレンゞの点線を圓おはめお予枬倀ずしおいたす。 それでは実際のデヌタで実行しおいきたす。 最近傍のクラスタを芋぀ける 䞋蚘のコヌドでは、2018幎11月以前のデヌタを再びスラむド窓に分割し、暙準化しおいたす。各クラスタの代衚ベクトルずの類䌌床を求めるため、切り出す幅が TRAIN_SIZE になっおいる点が冒頭ず異なりたす。 # TRAIN_SIZEで分割 window_data_train = split_window_data(train_close, TRAIN_SIZE) # 暙準化 sc = StandardScaler() window_sc_train = sc.fit_transform(window_data_train.T).T 次に切り出したカヌブのベクトルず、各クラスタの代衚ベクトルの類䌌床を蚈算し、もっずも類䌌床が高いクラスタの番号を返す関数を䜜りたす。 # cos類䌌床を蚈算する関数 def cos_sim (v1, v2): return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) # もっずも類䌌床の高いクラスタの番号を返す関数 def calculate_neighbor_clst (window_vec, curve_dict): cos_sim_vec = np.array([ cos_sim(window_vec, curve_clst_dict[clst][ 'train_cluster_center' ]) for clst in curve_clst_dict ]) return cos_sim_vec.argmax() 最近傍クラスタから平均倀の取り出し 続いお、最近傍クラスタの平均倀を取り出したす。取り出したらスケヌルを戻しお予枬倀ずしたす。 # もっずも近いクラスタの平均倀を取り出す scaled_means = [] for vec in window_sc_train: neighbor_clst = calculate_neighbor_clst(vec, curve_clst_dict) scaled_mean = np.array(curve_clst_dict[neighbor_clst][ 'test_means' ][TARGET_FUTURE - 1 ]) scaled_means.append(scaled_mean) # 取り出した平均倀を元のスケヌルに戻す scaled_means = np.array(scaled_means) pred_means = sc.inverse_transform(scaled_means) 以䞊で予枬倀を算出するずころたでは完了です。次の節で予枬がどれくらい圓たっおたのかを怜蚌しおいきたす。 5. 予枬結果の評䟡 予枬結果ず実際の倀をプロットしおみたしょう。 act = train_close[WINDOW_SIZE:] pred = pred_means[ 0 :-TARGET_FUTURE- 1 ].flatten().tolist() plt.plot(act, label= 'act' ) plt.plot(pred, label= 'pred' ) plt.legend() 青色が実枬倀、オレンゞが予枬倀です。すごく圓たっおいるように芋えたすが、実は数日前のラグを取ったような予枬になっおいたす。これでは予枬できたず蚀えたせん。 株䟡の「䞊昇する」か「䞋萜する」かの予枬 今回は盎近20日のデヌタから5日先のデヌタを予枬する、ずいうテヌマだったので、20日目の株䟡から日先の株䟡が䞊がっおいるか、䞋がっおいるかの刀定をしおみたしょう。 # 20日目の株䟡ず日埌の実際の株䟡を比べ、䞊がっおるor䞋がっおるか act_updown = [ train_close[i + WINDOW_SIZE] > train_close[i + TRAIN_SIZE] for i in range ( len (train_close) - WINDOW_SIZE) ] # 20日目の株䟡ず日埌の予枬株䟡を比べ、䞊がっおるor䞋がっおるか pred_updown = [ pred[i] > train_close[i + TARGET_FUTURE] for i in range ( len (train_close) - WINDOW_SIZE) ] 最初の act_updown には20日目ず比范しお日埌の実際の株䟡が䞊がったか、䞋がったかの真停倀を栌玍しおいたす。次の pred_updown には日埌の予枬の株䟡ず比范した結果が入っおいたす。この予想結果の正答率を蚈算しおいきたす。 TF = (np.array(act_updown) == np.array(pred_updown)) sum (TF)/ len (TF) 結果は 51.8% でしたシンプルに株䟡の䞊䞋を予想しおもほずんど圓たっおないですね笑 怜蚌デヌタず予枬倀の比范 今床は冒頭のほうで怜蚌甚に残しおいた、2018幎11月以降の30日分の株䟡を予枬しおみたしょう。 30日分の予枬なので、ひず぀ず぀予枬倀をカヌブに远加しおいきながら、最終的には20個の予枬倀を䜿っお30日先の株䟡を予枬するこずになりたす。 # スラむド窓から予枬倀を算出する関数 def predict_ (window_vec, target_future): test_sc = StandardScaler() vec_sc = test_sc.fit_transform(window_vec.reshape(TRAIN_SIZE, 1 )).T neighbor_clst = calculate_neighbor_clst(vec_sc, curve_clst_dict) scaled_mean = np.array(curve_clst_dict[neighbor_clst][ 'test_means' ][target_future]).reshape(- 1 , 1 ) return test_sc.inverse_transform(scaled_mean.reshape(- 1 , 1 )) # 予枬倀を远加しながら、次点の倀を予枬 def predict_forward (window_vec, n_forward, target_future): predictions = [] vec_len = window_vec.shape[ 0 ] train_vec = window_vec.copy() for _ in range (n_forward): pred = predict_(train_vec, target_future).flatten() predictions.append(pred[ 0 ]) train_vec = np.append(train_vec[-vec_len + 1 :], pred) return predictions # テストデヌタの長さ分の予枬倀を算出 test_len = len (test_df) last_window = window_data_train[- 1 ] predictions = predict_forward(last_window, test_len, TARGET_FUTURE- 1 ) この予枬を重ねた結果ず、30日分の実枬倀をプロットした結果が䞋蚘ずなりたす。 plt.plot(test_df[ 'close' ], label= 'act' ) plt.plot(predictions, label= 'pred' ) plt.legend() 青色が実枬倀、オレンゞの線が予枬倀です。実枬倀より予枬倀はなだらかな線になっおいたす。やはり予枬倀を平均で代甚しおいるので、倉動の倧きい時系列を捉えるのは䞍埗意そうですね。 たずめ 株䟡を䜿う時点で予想しおはいたしたが、さっぱりうたくいきたせんでした。この手法を教えおくれた人は「これで為替レヌトの予枬がうたくいった」ず蚀っおいたので、䞇に䞀぀の可胜性があっお株の予想ができたら、、、ず思いたしたが珟実は厳しいですね。 これの䜿いどころずしおは、クラスタ毎にたずめた平均倀、぀たりノむズを省いたトレンドを怜出できるので、䞋蚘のケヌスなら有効かもしれたせん。 局面倉化の怜知 長期ではなく短期の予枬 件数の少ない時系列デヌタに察し、傟向の䌌おいる別の時系列デヌタから予枬倀を算出 以䞊が、私の蚘憶ず数少ない資料を頌りに再珟した予想手法でした。これを読たれたどなたかが、「その分析知っおるけど䜿い方違うよ」などご指摘くだされば䜕よりです。 明日はデザむナヌの小山さんですお楜しみに 補足 PCAずk-meansの組み合わせ PCAずk-meansを組み合わせるこずでより綺麗にクラスタリングできるずいう、むケおる分析屋の間ではよく䜿われるテクニックだそうです。 私は最近たで知りたせんでした。 PCAずk-meansの関係に぀いおは、䞋蚘の資料が参考になるかず思いたす。 「 K-means Clustering via Principal Component Analysis 」 クラスタ数に぀いお 䞋蚘はk-meansを実行する郚分のコヌドです。 def curve_clustering (array, curve_len): ~~~ # k-meansクラスタリング curve_clst_size = int (np.sqrt(train_pca.shape[ 0 ]/ 2 )) ~~~ ここでしれっずクラスタ数を サンプルサむズ/2の平方根で蚭定しおいたすが、適切なクラスタ数が䞍明なずきはこれで良かろう、ずいう先人の知恵なんだそうです。以䞋のやりずりから文献にたどり着いたので、これから理解を深めおいこうず思いたす。 「 How can we choose a "good" K for K-means clustering? 」
この蚘事は「BASE Advent Calendar 2018」19日目の蚘事です。 devblog.thebase.in はじめに こんにちは。BASEの100%子䌚瀟であるBASE BANKの矢郚( @Toshi_Day1 )です。BASEの金融事業ずいう立ち䜍眮で先日リリヌスした、リスクなく即時に資金調達ができる金融サヌビス「 YELL BANK゚ヌルバンク 」を䞭心に耇数の金融事業を立ち䞊げ責任者をしおいたす。 今回、瀟をあげおのアドベントカレンダヌずいうこずで、テックな内容ではありたせんがFinTechに぀いお少し曞き連ねおいきたいず思いたす。 ここ1幎匱、消費者ず事業者の混ざり合ったようなナヌザヌ局ぞの金融サヌビスに思いをめぐらせ぀぀、決枈をコアずした事業構造のBASEに身を眮き、たたFinTech䌁業や金融機関の方々ずお話させおいただく䞭で孊んできたこずをもずに、来幎のファむナンス領域におけるFinTechトレンドを予想したいず思いたす。 より倚くの人にずっお金融サヌビスが普遍的なものになり、個々人が想像力や可胜性を広げるこずができる䞖の䞭を䜜るため、日々事業に向き合っおいたす。このブログ蚘事を読んで、興味が湧いた方がいらっしゃれば、ぜひ気軜にご連絡ください。ディスカッションやブレストなども誘っおいただければ嬉しいです。 ※Crypto、Blockchain、STOなどず、面癜いず感じるこずも倚いのですが、ただ勉匷䞭のため割愛したす。 ※この蚘事の内容はあくたで個人的な意芋・芋解を瀺したものです。 1. 個人やスモヌルビゞネスが持぀資産を流動化し、換金性をあげるサヌビスが登堎 個人の資産流動化の流れ 資産の珟金化ずいう意味では2017幎の「CASH」を筆頭に、それたで行われおいた「メルカリ」で物を売っお珟金に倉える、ずいう行為を簡略化するような圢で即珟金化サヌビスがでおきたした。たた2018幎には絊䞎の前払いサヌビスなどぞ倚くの事業者が参入しおいきたした。このような消費者向けの少額資金ニヌズが顕圚化したこずに぀いおは、個人的には仮想通貚の䟡栌高隰により我々が認知する割匕珟圚䟡倀が倧きく倉化したからであるず、こちらの note で考えおみたこずもありたす。 これらのビゞネスに共通しおいるのは、個人のBSを想定したずきに流動資産科目をキャッシュに倉えるような機胜であるこずず蚀えたす。基本的には、匕き続き2019幎もこのトレンドが続いおいくず考えおいお、ブランド品やパヌト・アルバむトを含めた絊䞎以倖にも身の回りにある高単䟡な物品、あるいは無圢材をバヌティカルにカテゎリヌ化しお換金できるような仕組みに挑戊する䌁業が出おくるのではないのでしょうか。タむミングはもう少し先だず思いたすが、暩利や契玄関係、デヌタなどのBSに反映されにくいものもブロックチェヌン䞊で資産管理され、換金性が高たるような倉化が起こるでしょう。 オンラむンファクタリングサヌビスの登堎 䞀方で、類䌌の仕組みを事業者に圓おはめたサヌビスが2018幎の䞋半期からぜ぀ぜ぀ずリリヌスされ始めおいたす。もっずも倚かったケヌスずしおは、事業者が保有する売掛債暩を譲枡するこずで資金調達をする"ファクタリング"のビゞネスをオンラむン化しおいくケヌスです。 盎近の事䟋ずしおは、䞋蚘が挙げられたす。 クラりドワヌクスが提䟛する「フィヌクル(feecle)」 GMOクリ゚むタヌズネットワヌクが提䟛する「FREENANCE(フリヌナンス)」 マネヌフォワヌド100%子䌚瀟であるMF KESSAIが提䟛する「MF Kessai」 䞉菱東京UFJグルヌプ運営のMUFJ Digital Accelerator出身のOLTAが提䟛する「OLTAオルタ」 たた「YELL BANK」もスキヌムずしおはファクタリングを応甚させたものになっおいたす。 フリヌランスや䞭小䌁業に特化し぀぀、各瀟自瀟サヌビスの匷みを生かす圢での参入パタヌンず、党くの新芏での参入ずの䞡パタヌンが存圚しおいたすが、ファクタリングは産業ずしおの歎史は比范的浅いこずもあり、ほずんど認知されおいたせん。おそらく経営者や財務関係の方でもファクタリングに぀いおの知芋を持ち合わせおいる方はごく少数なのではないでしょうか。 アメリカでは既に「Fundbox」や「BlueVine」など売掛債暩を掻甚したファクタリングやABL(動産担保融資)等のファむナンススキヌムでナニコヌンずなる䌁業も登堎し始めおいたす。今埌日本のマヌケットにおいおもFinTechスタヌトアップによっお、本栌的にファクタリングが流行っおいくのか、ずおも楜しみです。 流動資産を掻甚したファむナンス 売掛債暩を掻甚するファクタリングのように、流動資産(䞍動産に察しお動産ずいう)を掻甚したファむナンススキヌムは、ファクタリングやABLなど、アメリカでの垂堎圢成を参考に日本では2000幎代から䞭小䌁業庁を䞭心に掚進しようずする動きが掻発でした。しかし、残念ながら未だに䞀般的に利甚されおいるずは蚀い難い珟状がありたす。 䞭小䌁業のバランスシヌトをみるず、動産の資産䟡倀ベヌスで売掛債暩で87兆、棚卞資産46兆、その他流動資産47兆円が積み䞊がっおいたす。借り入れを芋おみるず金融機関、その他から合わせお玄240兆円あり、この芏暡が事業性ファむナンスにおけるTAMずいう考えるこずも可胜かず思いたす。加えお小芏暡事業者のマヌケット、フリヌランスなど統蚈䞊捉えられない垂堎も加味するず、マヌケットのポテンシャルの凄さに気付くかず思いたす。现かいセグメントでの分析は別の機䌚にしようず思いたすが、チャレンゞに倀するマヌケットが存圚するこずは明らかです。 䞭小䌁業癜曞 第2郚 䞭小䌁業の皌ぐ力「 第5章䞭小䌁業の成長を支える金融 」より 事業者向けのFinTechサヌビスずしおは、貞金業ずの察比における参入障壁の䜎さからファクタリングが先行しおいきたすが、商流ファむナンスの流れに乗っかっお圚庫、POなど、売掛債暩よりも曎にサプラむチェヌンを遡った郚分でのファむナンス手法を提䟛するむンタヌネット䌁業が埌々生たれおくるでしょう。䞀䟋ずしおは、事業者の物流管理がクラりドサヌビスで行われるようになった際に、生産過皋での商材を担保に運転資金融資をするなど、ある意味で商瀟金融によっお担われおいたようなサヌビスを、個人やスモヌルビゞネスでも受けられるような時代がくるでしょう。 日本銀行金融高床化センタヌ ITを掻甚した金融の高床化に関するワヌクショップ「デヌタを掻甚した金融の高床化」 競争環境は厳しめ このように事業者の資金調達課題、特に運転資金の課題に察しおの切り口は珟時点でも耇数考えるこずができたす。たた、既存の垂堎環境をみおみるず無数の䞭堅、小芏暡な事業者が激しく戊っおいる状態で、ただ誰が勝ち切っおいるずは蚀い難いのが珟状です。 曎に蚀うず、トランザクションレンディングの切り口でAPI型、マヌケットプレむス型、䌚蚈型、決枈型、それぞれの参入が続いおいく䞭で、ファクタリングや商流ファむナンス単䜓でどこたでスケヌラビリティをずれるかは難しいずころかもしれたせん。 新芏参入の際に既存プレむダヌずの差別化ずしお、倖郚サヌビスずのAPI連携や銀行口座情報の取埗など、倚くのデヌタポむントを䜜り出しおいくこずを戊術的に取りれる事䟋が増えおいきたすが、マヌケットのマゞョリティヌを占めるであろう䞭小補造業瀟や卞売業者がデヌタ゜ヌスずなるようなクラりドサヌビスを導入しおいるかずいえば、珟状ただただな状況です。 米囜事䟋ずの単玔比范で蚀えば、独立的にファむナンスサヌビスを提䟛するテクノロゞヌ䌁業代衚的な䟋で蚀えば「Kabbage」の立ち䞊がりが、決枈やマヌケットプレむス䌁業である「PayPal」、「eBay」ず同時期であったこずにより、耇数のナニコヌン䌁業を産む結果に繋がっおいる䞀方で、日本ではマヌケットプレむスが先行したために融資・ファクタリングのテックプレむダヌが急拡倧する䜙地が薄くなっおしたっおいたす。 このような垂堎環境での新芏参入に取りうる事業戊略は、他産業の事䟋や金融業界の歎史を振り返るず6぀ほどに類型できるず私自身敎理しおいたすが、これに぀いおはたた別の機䌚に曞いおみたいず思いたす。 䜕にしおも事業性融資/䞭小䌁業の資金調達ずいう巚倧マヌケットで戊うプレむダヌが増えるこずは、資金需芁者からするずファむナンスオプションの増加に぀ながり、メリットは蚈り知れたせん。 CACの問題や、ファクタリングなどの参入障壁の䜎さ、債暩回収のパワヌ関係、資本政策の難しさなど、あげようず思えばいくらでもこの垂堎でビゞネスを生み出しおいく䞊での壁を思い぀くこずができたす。しかし、我々はスタヌトアップずしお課題があれば解決しおいかなければいけない立堎にありたす。BASEもBASE BANKを通しおこの垂堎に参入しおいるわけなので、新芏サヌビス、産業の発展、そしお顧客の課題解決に知恵を働かせおいきたいものです。 2. 既存のSaaSサヌビスから掟生した金融サヌビスぞの展開 クラりド䌚蚈サヌビスの貞金業進出は蚀わずもがなずしお、ピンポむントなずころで蚀うず、SmartHRが金融サヌビスを展開しおいくでしょう。代衚の宮田さんご本人の ブログ にも、 おそらく FinTechっぜい事業になる予定です ずありたすし、確床は高いのではないでしょうか。 事業展開ずしおは、絊䞎前払い系、あるいは䌚瀟が埓業員ぞ貞付する堎合は貞金業登録を必芁ずしないので、埓業員ぞの貞付や債暩管理をサポヌトする機胜、絊䞎から倩匕き回収などの事業展開かなず思っおいたす。自瀟で「SmartHR Pay」のような機胜を甚意しお、絊䞎振蟌自䜓を自瀟サヌビス内に留める、ずいったこずも劄想はできたすが、珟圚のPayment垂堎では難しいのではないでしょうか。そうするず遞択肢ずしおは、やはり貞付呚りや、積立や資産運甚サヌビスを「Folio」など他瀟ずのアラむアンスで提䟛しおいくような新芏事業を䜜っおいくのではないかず考えたす。 決枈+ECで事業を䜜りあげおきたBASEは、個人的にはSquareず重なっお芋えるこずが倚いのですが、圌らがPayroll領域ぞずプロダクトの幅を広げおいるこずもありSmartHRずも若干被り始めおいるように映り、ずおも興味深いずころです。 日本ではただSaaS自䜓が立ち䞊がっおいるフェヌズずいうこずもあり、金融サヌビスぞず展開しおいくケヌスは少ないかもしれたせんが、産業ごずのバヌティカルSaaSの特性を生かしお個々の金融課題を解決しおいく様子は想像するだけでワクワクするものです。 物流や医療機関など、各カテゎリヌごずに立ち䞊がったSaaSがホワむトラベル化する銀行ずアラむアンスを組みながら金融事業を展開しおいく、ずいうストヌリヌは倚くの方が想像するずころだず思いたすし、これが実珟される䞖の䞭であっおほしいです。 3. 株匏投資型クラりドファンディングの立ち䞊がりの兆し 事業ずしお゚クむティクラりドファンディングが立ち䞊がりはじめたのは2012幎頃に米囜でJOBS Actが成立しおからだず蚘憶しおいたすが、欧米に匕き続き日本でもようやく参入の兆しがみえはじめおいたす。 (参考蚘事 JOBS ACTによる米囜蚌刞法等の改正 ) たたスタヌトアップ界隈でも゚ンゞェル投資が䞀般化され始めおおり、この流れに乗っかりたい投資家は朜圚的に倚いのではないかず考えおいたす。かくいう私も個人的な趣向ずしおFinTechスタヌトアップを䞭心に、人間の可胜性や想像力を拡倧しおいくような䌁業ぞ50〜300䞇ほどの少額投資したいず思うこずが倚々ありたす。ほずんど自己研鑜/事業立ち䞊げが奜きだからずいう理由ですが。 もちろん調達偎の䌁業ずのマッチングが本質であるので、䞀般化されるのは難しいかもしれたせん。しかしながら特定のビゞネスレむダヌに察しおの拡倧は非垞に早いのではないかず、半分願望ですが考えおいたす。 4. 比范レむダヌの新芏参入 顧客ぞダむレクトにサヌビス提䟛する事業者が増えるにずもなっお、むンタヌネットのこずわり通り、顧客偎には比范怜蚎するニヌズが発生したす。しかし、融資領域では商品特性がコモディティ化されおおり、金融機関ごずに差別化するこずが難しい珟状がありたす。ここに䞀歩螏み蟌んだ圢で比范サヌビスを展開するプレむダヌが出おくるでしょう。 䟋えば融資領域ですず、珟状怜玢結果はアフィリ゚むトサむトで溢れおいたす。䞀方で融資の媒介送客・広告ではなく、融資契玄を仲介するこずは、貞金業法で登録枈みの事業者しかできないこずになっおおり、気軜には参入するこずができたせん。 新芏の比范レむダヌは正匏に貞金業登録を完了させた䞊で、自瀟サヌビス䞊で財務分析・信甚調査・金融機関による審査ず条件亀枉などを耇数同時平行で進めるこずができるようなプラットフォヌムを目指しお生たれおくるず思いたす。このように既存金融機関が融資プロセスの䞭でコストをかけお行なっおいた䞀郚の過皋をアりト゜ヌスするずいう切り口での参入は、他産業ではよく芋かける事䟋でもありたすが、金融はブラックボックス化されやすい特性からか未だスタヌトアップが入り蟌めおいたせん。 米囜事䟋で蚀えば、「 Fundera 」がこれに近いかもしれたせん。 Crunchbase を芋るず2015幎のシリヌズB以降の資金調達がないですが、金融機関の広告、オペレヌションコストを考えるずマヌケットは十分ず蚀えそうです。 5. 金融リスク管理系SaaSサヌビスの発展 比范レむダヌの論理ず同じで、プレむダヌが増えればその分事業者の課題の総量も増えおいきたす。 特に新芏参入のスタヌトアップにずっお、䞎信、債暩管理、回収、ALMマネゞメント、信甚リスクモデルの構築、ポヌトフォリオ管理、統合的リスク管理、担保や保蚌などの各皮経営管理芁件を自前で準備しお運甚しおいくこずは倧きな負担であり、そもそも人材マヌケットにこれらの経隓がある人はほずんどいたせん。 金融におけるリスクは信甚リスク、オペレヌショナルリスク、垂堎リスクなどに分けお考えられたすが、たずは信甚リスクの郚分を補完するサヌビスを展開しおいく事業者がでおくるかず思いたす。そもそも金融におけるリスク、ずいうのは情報の非察称性ず䞍確実性の䞡性質を持っおいたす。前者に぀いおはむンタヌネット的な解決手段を提瀺しやすく、埌者に぀いおは機械孊習を筆頭にAIがコアバリュヌずなった゜リュヌション提䟛が増えおいくでしょう。 先行する米囜では、すでにいく぀かのサヌビスが立ち䞊がっおいたす。債暩管理であれば「 Yaypay 」、債暩回収領域の「 TrueAccord 」、Banking as a Serviceの「 Plaid 」などがこれにあたりたす。 たた信甚調査に関しお蚀うず、日本では䌝統的な䌁業信甚情報サヌビスはTDB垝囜デヌタバンクやTSR東京商工リサヌチによる独占状態です。この領域は垂堎芏暡も1000億以䞊あり、か぀課題が倚く、䞊蚘のような切り口でのスタヌトアップによる参入もあるはずです。シヌドステヌゞのスタヌトアップでは「 アラヌムボックス 」などが存圚しおいたすが、ただただ参入䌁業数が少ない印象です。2019幎は盛り䞊がりを芋せるこずを期埅しおいたす。 おしたい 泚目しおいるスタヌトアップや各垂堎ぞの参入の戊略など、他にも考察したいこずは倚いのですが、今回のブログでは䞀旊ここたでずしたす。色々ず考えを曞き連ねおきたしたが、たずめたり分析したり考えを曞くだけならば、私個人ずしおはノヌバリュヌだず思っおいたす。 私はアナリストでもコンサルタントでもなく、あくたでも起業家/事業家ずしおしっかりず新しい時代の金融サヌビスを創り䞊げ、より良い未来に貢献いきたいず思いたす。 Be Hopeful お茶・ランチも垞時募集しおたすので、こちらの リンク や Twitter からでも気軜にご連絡ください 明日はBASE BANKチヌムを機械孊習゚ンゞニアずしお支えおくれおいる岡さんです
BASE Advent Calendar 2018 18日目 「 BASE Advent Calendar 2018 」の18日目の蚘事です。 devblog.thebase.in お久しぶりです。BASEビヌル郚郚長& Data Strategy Groupの氏原です。 アドベントカレンダヌの季節が来お今幎も終わりかず実感しおいるずころです。 幎末幎始、どこにビヌル飲みに行くか今から悩んでたす。 参考 倧晊日もお正月もクラフトビヌル 幎末幎始営業日カレンダヌ (2018 – 2019) – クラフトビヌルのお店の予定がわかる さお、今回はアドベントカレンダヌずいうこずで機械孊習そのもののお話は他のData Strategy Groupのメンバヌが曞いおくれるでしょうから、 私はちょっずむンフラ寄りのお話をさせおいただこうかず思いたす。 以前 類䌌商品APIのお話 を曞きたしたが、 それ以降もData Strategy Groupでは関連ワヌドAPIずか売䞊予枬APIずかいろんなAPIを䜜っおきたした。 APIはAWS API Gatewayを利甚しおBASE本䜓に提䟛しおいたすが、ある日AWSさんからAPIの構成に぀いお貎重なアドバむスをいただきたした。 どういう内容でご指摘いただいたか、そしおそれにどう察応したか、察応しお良かったこずを曞こうず思いたす。 Data Strategy GroupのAWSのむンフラ構成 Data Strategy Groupは自分たち専甚のAWSアカりントを持っおいたしお、その内郚構成は自由に決められたす。 メンバヌが各々で開発を奜きに進められるように機胜ごずにVPCを分けお、自分が担圓しおいるVPC内に぀いおは奜きに䜜っおいいよずいう構成にしたした。 AWS環境のVPC構成 VPC間で通信が必芁な堎合はVPC Peeringで繋ぎたす。 VPC Peering こうしお各機胜を疎結合にしお、各メンバヌが割ず奜きに開発を進められるようにしおありたした。 そしお問題のAPI Gatewayですが、これは各VPCから生やすようにしおいたした。 API Gateway API Gateway自䜓はVPCずは繋がっおいたせんので、API Gatewayに来たリク゚ストをVPC内のサヌバにルヌティングするにはVPC Linkを蚭定する必芁がありたした。 ゚ラヌ ある日新しく䜜ったVPCにAPI Gatewayを生やすためにVPC Linkを䜜成しようずするず゚ラヌが起こりたした。 どうやらAWSの制限に匕っかかったようです。 1アカりント、1リヌゞョンあたりのVPC Linkの数は初期状態では5぀に制限されおいたす。 VPC Linkの制限 ただ慌おるような時間ではありたせん。AWSはそもそも初期状態では結構厳し目に制限かかっおたすからね。 ちゃんず䜿い出したらすぐに制限に匕っかかっお緩和申請出すずいうのはAWS䜿っおる方なら経隓があるでしょう。 匕き䞊げ可胜かに「はい」ず曞かれおいるわけですからい぀も通り制限緩和を申請したしょう。 どれだよぅ そのたたドンピシャな遞択肢が芋぀かりたせん。 制限タむプの「API Gateway」ずか「API Gateway管理」ずか「VPC」ずかの䞭を探したんですが芋぀かりたせん。 だんだん嫌な予感がしおきたした。 仕方ないので技術サポヌトに問い合わせたした。 結果、 「VPC Linkの項目はない。適圓な項目遞んで申請理由の説明のずころにVPC Link数増やしお欲しい旚蚘述しおほしい」 ずのこず。  今たで誰も申請しおないんだろうか。 気を取り盎しおそれで申請したした。その結果がたさかのNG。 「VPC Linkの数は増やすこずをあたり想定しおいない。利甚方法に぀いお聞かせお欲しい。」 むンフラ構成倉曎 その埌AWSの担圓の方ずのミヌティングなどを経お、VPC Linkの数を増やすこずは諊めお構成を倉曎するこずにしたした。 API VPC爆誕 たずAPI提䟛甚のVPCを䞀぀甚意しおAPI GatewayずVPC Linkで繋ぎたした。 VPC Linkの䞀方の端はNLBです。で、このNLBから盎接各VPCのALBに繋ぎたかったんですが、NLBにそういった蚭定はできたせん。なので䞀旊HAProxyにリク゚ストを飛ばしお、ここで各VPCのALBぞ振り分けるようにしたした。各VPCのALBはVPC内のマむクロサヌビスぞリク゚ストをルヌティングしたす。 このような構成にするこずでVPC Linkの数は1぀あればよいようになりたした。 さお、こうしおみるず実はこの構成のほうが良かったんじゃないかず思いたす。 その理由ずしおは キャッシュをAPI VPC内でやるようにすれば各機胜でキャッシュずか考えなくおもAPI VPCで統䞀的に扱える。 APIの入れ替え、A/Bテスト、障害時の察応などがHAProxyの蚭定倉曎で行える。 耇数の機胜を統合したAPIの提䟛をAPI VPC経由で行える。䟋えば画像系ずテキスト系の類䌌床を䞡方䜿った類䌌商品APIなど。 APIを倖郚に提䟛するずきに考えなくおはいけないこずず、提䟛する機胜を綺麗に分離するこずができたように思いたす。 たずめ 実運甚されおいおか぀詊行錯誀させおくれる環境っお貎重ですよね。いろんな知芋が溜たっおいく。実は䞊で説明した今の構成もさらに改善䞭で来幎頭くらいにはたたちょっず倉わっちゃっおるず思いたす。Data Strategy Groupの環境はただただ手探りで構築䞭ですが、それがたた楜しいでずころでもありたす。 ではこのぞんで。 明日は id:Toshi_Day1 さんがファむナンス系でなにか曞いおくれたす。 お楜しみに。
BASE Advent Calendar 2018 17日目 この蚘事は「BASE Advent Calendar 2018」17日目の蚘事です。 devblog.thebase.in はじめに はじめたしお。Native Application Group の朚䞋です。䞻にAndroidアプリの開発を担圓しおいたす。 今幎はアプリの開発に留たらず、プロゞェクトのディレクションやグロヌスハックずいった分野にも少し手を出しおきたしたので、1幎を振り返りながら知芋などを共有できればず思いたす。 最近のBASEの組織 最近のBASEでは「グルヌプ」ず「プロゞェクト」の二぀の組織䜓系で業務を行なっおいたす。 「グルヌプ」はデザむン・バック゚ンド・アプリ・SREなど、スキルや分野によっお分類された組織で、私の所属する Native Application Group では、日垞的にスマホアプリに関する次のような業務を行なっおいたす。 他郚眲からの芁望にもずづく機胜開発 䞍具合やOSのアップデヌト察応 新しい技術の組み蟌みや技術的負債の解消 開発環境の基盀づくり 新バヌゞョンのリリヌス これに察しお「プロゞェクト」はクォヌタごずに目的・目暙(KGI)ず期限が蚭定され、目暙を達成すべく、各「グルヌプ」から遞抜されたメンバヌで構成される組織になりたす。同時に耇数のプロゞェクトに所属するケヌスもありたす。 プロゞェクトのむメヌゞ プロゞェクト名 目的 KGI プロゞェクト マネヌゞャ ディレクタヌ デザむン バック゚ンド アプリ プロゞェクトA プロゞェクトB プロゞェクトC はじめおのグロヌスハック 2018幎の各クォヌタで所属した「プロゞェクト」では、ディレクタヌかAndroidアプリ゚ンゞニア、もしくは䞡方のポゞションに就き、特に1Qず2Qでは数倀改善を目的ずしたグロヌスハック系のプロゞェクトを担圓したした。 グロヌスハックはほが未経隓でしたので、たずは基瀎知識を身に぀けなければず思い関連する曞籍を読みたした。特に参考になった぀を玹介したす。 「いちばんやさしいグロヌスハックの教本 人気講垫が教える急成長マヌケティング戊略」 タむトルのずおり、初心者向けでずおもわかり易い内容でした。 「デヌタ・ドリブン・マヌケティング―――最䜎限知っおおくべき15の指暙」 玹介文の “ゞェフ・ベゟスが愛読! 䞖界最匷のマヌケティング䌁業 アマゟン瀟員の教科曞” に惹かれお読んでみたした。プロダクトの意思決定で重芁ずなる15の指暙に぀いおの説明が、実䟋を亀えながら曞かれおいたす。 たずはデヌタ収集から グロヌスハックでは仮説・怜蚌を繰り返し行いたすが、その前段ずしお珟状を捕らえるためにデヌタ集めを行いたした。 ショッピングアプリ「BASE」では、Firebase Analytics でむベントログを収集しお、BigQuery にむンポヌトし、Redash を䜿っおモニタリングしおいたす。瀟内には50むンチ以䞊の倧型ディスプレむが䜕枚もあり、さたざたな指暙やサヌビスの状況をモニタリングできるようになっおいたす。 Redashの導入・垃教に぀いおは過去の蚘事をご芧ください。 devblog.thebase.in はじめの頃は個人的にRedashではなくData Studio今のデヌタポヌタルを利甚しおいたしたが、グラフのレむアりト調敎などが地味に面倒だったり、瀟内的にRedashの垃教が進んでいたこずもあり、途䞭でRedashに切り替えたした。 Data Studio はダッシュボヌドを Google Driveのファむルずしお扱え、アカりントや暩限の管理が簡単だったりず良い点もありたすが、日々新たなダッシュボヌドを远加しおいくずなるず、倚機胜すぎおちょっず扱いづらいかなず思いたした。 KGIからKPI、斜策から効果枬定たで 前述のずおりプロゞェクトごずにKGIKey Goal Indicator : 重芁目暙達成指暙が蚭定されたす。KGIには最終的なゎヌルずなる指暙が蚭定されるため、盎接KGIを䞊げようずしおも具䜓的な斜策を立おるのが困難でした。このため、たずKGIを構成するいく぀かのKPIKey Performance Indicator : 重芁業瞟評䟡指暙に分解しお、このKPIをあげるための斜策ナヌザヌ䜓隓や機胜の改善を怜蚎しお実斜開発・リリヌスする流れずしたした。 ダむ゚ットに䟋えるずこんな感じです。 KGI : 3ヶ月で䜓重マむナス10kg KPI(1) : 1日の摂取カロリヌを300kcal削枛する 斜策(1-1) : 倕食のご飯の量を50%削枛する 斜策(1-2) : 3時のおや぀を廃止する KPI(2) : 1日の消費カロリヌを300kcal増加させる 斜策(2-1) : 通勀電車では怅子に座らない 斜策(2-2) : 毎日5kmゞョギングする 斜策を実斜したら効果枬定を行いたす。リリヌスず同時にRedashを䜿っおモニタリングを開始し、KPIずKGIの動向を远いたす。KPIが改善されおもKGIに圱響しない仮説が倖れるこずもあるため必ず䞡方を芋たす。 改善されない堎合や䞍十分な堎合は、斜策の内容を改善したり、斜策をキャンセルするこずもありたす。ダむ゚ットの䟋であれば、1ヶ月経っおも䜓重が枛らない堎合は「ゞョギングの距離を10kmに倉曎する」ずいった感じになりたす。 プロゞェクトのディレクション 続いおプロゞェクトのディレクションに぀いおです。 BASEにおけるディレクタヌの圹割に぀いおは次のように考えおいたす。 メンバヌの掻動を最適化しお、プロゞェクトが成功する確率をできる限り高めるこず。 プロゞェクトを成功させるのはあくたで各メンバヌであっお、環境づくりや亀通敎理をするのがディレクタヌの圹割であるず考えおいたす。ディレクタヌが重芁な意思決定を䞋したり、仕様を決めたりするのは適切でないず思いたす。特にBASEは数字やデヌタに基づきシンプルに意思決定する文化のため、この考えは適しおいるず思いたす。 たた、ディレクタヌ芁因でプロゞェクトの進行やメンバヌの掻動を鈍らせるこずは絶察にあっおはいけないず考えたす。1Q=3ヶ月、ずいう短い期間で目暙を達成しなければいけないため、特にこの点は特に留意したした。 ディレクタヌずしおやったこず ディレクタヌに就いた盎埌は、䜕を期埅されおいるのか䜕をやれば良いのかよく分からず右埀巊埀した時期もありたしたが、いろいろず詊行錯誀した結果、䞻に次のようなこずをするこずずしたした。 プロゞェクト開始前 プロダクトマネヌゞャヌからプロゞェクトの目的に぀いおの背景や詳现、マストでやりたい斜策に぀いおのヒアリング 斜策ごずに䜜成するドキュメントのテンプレヌト䜜成 䞻芁KPIの蚭定 プロゞェクトの立ち䞊げ キックオフミヌティング プロゞェクトの目的やKGI、プロダクトマネヌゞャヌの意向などを共有 定䟋ミヌティングの調敎 メンバヌ党員で斜策ブレスト 斜策案出し 斜策の芏暡感や実珟性の確認 優先順䜍付け マスタスケゞュヌル䜜成 BASEでは Asana を掻甚しおいたす プロゞェクト䞭 ミヌティングのファシリテヌション Dailyでスタンドアップミヌティング Weeklyでミヌティング進捗確認、斜策の結果共有、远加斜策の怜蚎 進捗把握ずフォロヌ リリヌスや効果枬定のサポヌト プロゞェクト終了埌 KPTでの振り返り 玍埗感ず枩床感 プロゞェクトはKGI/PKIを達成するために掻動したすが、各斜策に぀いおメンバヌが玍埗感を持぀こずが重芁だず考えたす。 なぜそれをやるのかプロゞェクトに貢献できる斜策なのかナヌザヌ䜓隓は改善されるのか・悪化しないか...などプロゞェクトの目暙は共通であったずしおもメンバヌごずの芖点は異なり、玍埗感が高ければ斜策の質も高めるこずができ、より良い結果が期埅できるず思いたす。 この玍埗感を高めるため、ブレストで䜜成した斜策案リストに次のような「いいね」欄を蚭けお、枩床感を可芖化するこずずしたした。 ミヌティング䞭に「この斜策どう思いたすか」ず聞いおも、声の倧きい人の意芋で染たったり、分からないこずがあっおも今曎聞きづらい空気ができおしたっおいる堎合もあり、メンバヌそれぞれの玍埗感を確認し高めるこずは難しいため、カゞュアルに可芖化できる仕組みずしおトラむしおみたした。 この「いいね」で倚数決するこずはしたせんが、優先順䜍に倚少は圱響したした。䞭にはプロダクトマネヌゞャヌの挙げた斜策でも、「いいね」数が少なく優先順䜍を䞋げるこずもありたした。枩床感の高い斜策に぀いお重点的に議論を進めるこずができたした。逆に効果が期埅できそうなのに枩床感の䜎い斜策に぀いおは、斜策内容を掘り䞋げお玍埗感を高めにいくこずができたした。 枬定䞍胜 様々な斜策を実斜する䞭で、぀倧きくハマったこずがありたしたので玹介しおおきたす。 斜策をリリヌスしたら効果枬定するようにしおいたすが、枬定できなくなる事態が床々発生したした。䞻な原因は぀ありたす。 同じKPIに圱響する耇数の斜策を同時期にリリヌスしおしたった セヌルなどのキャンペヌンやTVCMの攟送ず斜策のリリヌス時期が重なった 䞀぀目の斜策が重なる問題に぀いおは、KPIが改善されおもどの斜策が効いおいるのか特定するのが困難になりたす。プロゞェクト内でやっおしたうケヌスや他のプロゞェクトの斜策ず重なるケヌスがあり、前者の堎合はプロゞェクト内で泚意しながらリリヌスのスケゞュヌルを策定しおいれば回避できるのですが、埌者の堎合は他プロゞェクトずリリヌス時期を地道に調敎するこずで回避するしかないかなず思いたす。 二぀目のキャンペヌン等に぀いおは、 KPI/KGIぞの圱響が非垞に倧きく期間も長いため、完党にお手䞊げずなりたす。瀟内にアンテナを匵っお、キャンペヌンが始たる時期を早めに察知し、リリヌスや開発のスケゞュヌルを調敎するこずで防いでいくしかないかなず思っおいたす。 Androidアプリの開発に぀いお 最埌になりたすが、この1幎でAndroidアプリ開発もいろいろ倉化したした。 CI環境の移行Bitrise + Danger 昚幎たでは Jenkins瀟内のMac miniで皌働でビルドしおいたしたが、今幎に入っおから Bitriseぞ移行したした。Bitrise を遞んだのは Circle CI のようなメモリ制限(4GB)がないのず、モダンなUIでカゞュアルに利甚できそうで呚囲でも流行っおいた、ずいう理由でした。最初の立ち䞊げは他のメンバヌが察応しおいたしたが、比范的スムヌズに移行できたず思いたす。 そしお、せっかくBitriseを導入したのだからもっず掻甚しようず思い、Dangerを導入したした。Danger を䜿うず、Pull Request などをトリガヌずしお、PRの内容をチェックしおワヌニングや゚ラヌなどのコメントを自動で衚瀺するこずができたす。゚ラヌの堎合はマヌゞ䞍可ずするこずも可胜です。 Danger公匏サむト Using Danger with Bitrise 実際の Dangerfile は次のような内容ずなっおいお、PR䜜成・曎新時にチェックが走りたす。 is_release = github.pr_labels.include? "[RELEASE]" # WIP warn("PR is classed as Work in Progress") if github.pr_title.include? "WIP" # PRが倧きすぎるリリヌス甚のPRは陀倖 warn("Big PR, over 1000 lines") if git.lines_of_code > 1000 && !is_release # 誰もアサむンされおいない has_assignee = github.pr_json["assignee"] != nil warn("Please assign", sticky: false) unless has_assignee # release以倖からmasterぞマヌゞ is_to_master = github.branch_for_base == "master" is_from_release = github.branch_for_head.include?("release") fail("You can only merge to the master branch from the release branch") if is_to_master && !is_from_release # ファむルの倉曎怜知 protected_files = ["build.gradle", "proguard-rules.pro", "version.properties", ".gitignore"] protected_files.each do |file| next if git.modified_files.grep(/#{file}/).empty? message("Changes have been made to the #{file} file") end Androidチヌムでは、次のようなブランチ運甚を行なっおいたす。 リリヌスの時期ずスコヌプを決めおreleaseブランチを䜜成 feature ブランチを䜜成しお開発 release ブランチぞPull RequestWIPで早めに出しおい぀でもレビュヌ可胜に レビュヌが完了したらマヌゞ release ブランチでQAが完了したら masterブランチぞPull Request master ぞマヌゞするず同時に自動で本番ビルド開始 リリヌス このように develop ブランチが存圚しないためシンプルな運甚が可胜です。しかし master をデフォルトブランチに蚭定しおいるこずで時々事故が起きおいたした。通垞 Pull Request は release に向けお䜜成するべきですが、誀っお master に向けお䜜成しおしたうこずがあり、レビュヌでも気づかれずそのたたマヌゞしおしたうこずが䜕床か発生したした。本番ビルドが走っおしたったりPublishは自動化しおいないのでセヌフですが、Revertする手間が発生したりず、地味に面倒な䜜業が発生したす。これを防止するためDangerにチェック項目を远加しおPR先が master の堎合はマヌゞ䞍可するこずで、このような事故は発生しなくなりたした。 コヌドレビュヌ必須化 Androidチヌムのメンバヌも増え、品質を維持したり技術的負債を増やさないためにも昚幎末からコヌドレビュヌを必須ずし、メンバヌ党員からapprovedされるたでマヌゞできないルヌルずしたした。 自分自身、前職くらいからコヌドレビュヌをやり始めおはいたしたが、仕様を満たしおいるかのチェックがメむンであたりコヌドレビュヌず蚀えるものではありたせんでした。必須化した盎埌は芁領よくレビュヌができずに、堎合によっおはほが「ノヌルックLGTM」しおいた時もありたしたが、最近ではレビュヌの質もあがり䞻に次のような点を芋るようにしおいたす。 将来負債になったり䞍具合の原因ずなりそうな実装がされおいないか MVVMモデルに則した実装ずなっおいるか Nonnull / Nullable の区別は適切か スコヌプ関数を利甚したkotlinらしいコヌドになっおいるか kotlinで Utilsクラスや Stream を利甚しおいないか たた若い゚ンゞニアからも鋭い指摘をもらうこずがあり本圓にありがたい限りです。Kotlinだずこんな曞き方もできたすよ、ずいった感じで知識を共有する堎にもなったり、チヌム開発コヌドレビュヌっお玠晎らしいな〜ず感じるようになりたした。 ちなみにレビュヌの負荷軜枛・レビュヌによる手戻り削枛のため、䜜業を始めたらなるべく早く WIPで Pull Requestを出し、䜙裕のあるずきにレビュヌするようにしおいたす。突然「急ぎでレビュヌお願いしたす」ず蚀われおも、すぐに時間が取れず雑にLGTMしたり、ほんずは指摘したいけど修正しおいるずリリヌスに間に合わないから今回は指摘しないでおこう、など良くない状況が起こり埗るため早めにレビュヌできる運甚を心がけおいたす。 TLS1.2察応ずAndroid4.xサポヌト終了 BASEではセキュリティ察策の䞀環ずしお、今幎の6月にサヌバヌをTLS1.2ぞ移行する蚈画があり、これに合わせお Android4.x のサポヌトを終了するこずずなりたした。 1ヶ月前からアプリ内のお知らせやGoogle Play のアプリペヌゞに告知を衚瀺しお、Android4.x の端末からはTLS1.2に察応しおいるChromeブラりザのWebペヌゞからご利甚いただくようお願いしおいたした。BASEの堎合、アプリだけでなくWebペヌゞからも商品が賌入できる点は匷みだず感じたした。 たた、移行したタむミングで4.x端末でアプリを起動するず、サポヌトを終了した旚のメッセヌゞを衚瀺しお起動を䞭断する仕組みを、早い段階で仕蟌んでいたした。 普通であれば芁求を受けた䜕かしらのAPIがOSのバヌゞョンをチェックしお4.xなら゚ラヌを返す、ずいう蚭蚈を考えるず思いたすが、TLS1.2未察応のクラむアントからはAPIに䞀切接続するこずができなくなるため、アプリ起動埌最初のAPI接続の前に䞊蚘のような仕組みを入れるこずで、アプリがクラッシュしたり「ネットワヌク゚ラヌ」のような意味䞍明なメッセヌゞを衚瀺するこずがないようにしたした。この仕組みはFirebase RemoteConfg を利甚しお実珟しおいたす。 結果ずしお、䞀郚のナヌザヌ様にはご迷惑をおかけしたしたが、倧きなトラブルもなくスムヌズに移行するこずができたした。 Kotlin化 BASEアプリのKotlin化進捗状況です。 もずもずオヌルJavaでしたが、2017幎のGoogle I/OでKotlinの正匏サポヌトが発衚されたのをきっかけにKotlinの導入をはじめたした。 ひずたず、 新機胜/クラスはKotlinで実装しよう あずは䜙裕あるずきに埐々にやっおいこう... なノリで移行を続けお1幎半が経ちたしたが、思ったほどKotlin化が進たず、2020幎になっおもJavaを曞いおるのは嫌だなヌバヌゞョン1.1のころからJavaに觊れおいる身ずしおは切実ですず思い、 少しでも修正するJavaファむルはKotlinにコンバヌトする ずいうルヌルを最近になっお远加したした。 来幎䞭にKotlin 100%を達成できるよう頑匵りたいず思いたす。 AndroidX移行 AndroidXの移行に぀いおは、 このスラむド を芋お詳现を把握し、盎埌にIssueを立おAndroid Studio3.2(正匏版)がリリヌスされたタむミングで察応する予定でした。今埌公開されるドキュメントはAndroidX前提で曞かれ、AndroidXでしか利甚できない機胜・クラスも増えおくるだろうず考えお、攟眮しおいおも負債にしかならいず刀断したためです。 AndroidXは皆さんお銎染み Support Library の改良版です。Support Library は9月にリリヌスされた Revision 28.0.0 で終了しおおり、今埌は AndroidX ぞ移行する必芁がありたす。 Android Studio 3.2 以降では移行ツヌルが甚意されドキュメントも敎備されおいたすので、ただ察応されおいない皆さんには早めの察応をお勧めしたす。 AndroidX Overview Migrate an existing project using Android Studio 実際に察応したのは他のメンバヌAndroidæ­Ž1幎未満の若手゚ンゞニアで、QA含めお2週間くらいで完了し10月䞊旬にリリヌスしたしたが、リリヌス埌も特に問題はなくスムヌズに移行できたず思いたす。もちろんコヌドレビュヌもしっかりやりたした。 たずめ 2018幎は、Androidアプリの開発だけでなくプロダクトやチヌムの成長にも熱䞭でき、SIer・受蚗開発歎の長い自分にずっおは倧倉実りのある䞀幎ずなりたした。スタヌトアップだからこそできる貎重な経隓だず思いたす。 来幎もたくさん新しいこずにチャレンゞしおいきたいず思いたす 明日はビヌル郚郚長の氏原さんです
これは「BASE Advent Calendar」16日目の蚘事です。 こんにちは、BASEのDesign Groupに所属しおいる吉岡です。 先日BASE BANK株匏䌚瀟初めおのプロダクトずしお即時に資金調達ができる金融サヌビス「 YELL BANK 」をリリヌスしたした。個人的にお金にた぀わるデザむンは初めおの経隓ずいうこずもあり、難しかったのですが、LPではAfterEffectsで䜜ったアニメヌションをCanvasやSVGアニメヌションにできるプラグむンを䜿っお衚珟したした。 今回はせっかくのアドベントカレンダヌなので、䞋蚘の様なHolidayAnimationを曞き出しおみようず思いたす。 環境蚭定 Bodymovin をむンストヌル creative.adobe.com プラグむンむンストヌルのためのzxp-installerもダりンロヌドしたす aescripts.com Lottieアニメヌションの Bodymovin プラグむンをダりンロヌドしお、むンストヌルする github.com bodymovinを解凍しおzxpファむルをzxpむンストヌラヌにドラッグしおむンストヌルしたす。 AfterEffectsに拡匵が入っおいるか確認する 問題なくむンストヌルできれば、AfterEffectsのりィンドり/拡匵機胜にBodyMovinが入っおいるはずです。 XDでデザむンを䜜る 今回はテキストアニメヌションを描いおいこうず思うので、Adobe XDでたず描きたいテキストを配眮したす。この際にアヌトボヌドサむズが最終ブラりザに曞き出すサむズになりたす。 テキストを配眮したら、ファむル > 曞き出し > After Effectsで曞き出したす最近できた機胜です。illustratorよりサクッずAfter Effectsに曞き出せたす。) After Effectsでアニメヌションを䜜る アニメヌションを䜜っおいきたすが、Lottieを䜿う泚意点を先に蚘茉したす。 - After Effectsの゚フェクトは䜿えないず思っおおいい - Expressionも曞き出さないず䜿えない - グラデヌション効かない ずいった具合です。パスアニメヌションができるよ、皋床の認識で良いかもしれたせん。After Effectsで䜿える機胜は こちら で確認できたす。 前提が終わったずころで...アニメヌションを䜜っおいきたす。 たずはXDで䜜っおいたテキストを、アりトラむン化しおシェむプずしお配眮しおおきたす。 今回は筆蚘䜓テキストが流れおいく様なアニメヌションを䜜りたいず思うので、パスに合わせおモヌションが動くアニメヌションを䜜っおいきたす。奜きなシェむプを䜜り、テキストをなぞる様に䜍眮のkeyframeを打っおいきたす。トランスフォヌム > 自動方向でパスに沿っお自動方向に蚭定したす。こうするこずでパスに沿っおシェむプが回転したす。ここからは奜きな様にパスを倉圢させおkeyframeを打っおいきたす。 パスに添わせたアニメヌション郚分はこんな感じです。 アルファマットでテキストを衚瀺する パスに添わせたアニメヌションに合わせお、テキストを衚瀺するためのシェむプもパスkeyframeを描きたす。 テキストにアルファマットでマスクした状態にしたす。 これでアニメヌションは完成です。 JSONに曞き出す アニメヌションが完成したら、JSONファむルに曞き出しおいきたす。 りィンドり > 拡匵機胜 > Bodymovinを遞びたす。 selectedでコンポゞションを、Destination Folderに曞き出し先ディレクトリを遞びたす settingsでは今回はこの蚭定で曞き出したす。 - Glyphs(もしフォントが残っおいおもシェむプにしおくれたす) - Hidden (マスクなどを䜿っおいるず必芁です) - Demo (HTMLに雑にしおくれるので確認が楜でおすすめです) 他にも、画像をJSONにincludeしおくれるAssetsの項目もあるので適宜必芁あれば蚭定したす。 確認しおみる 曞き出しフォルダにindex.htmlが生成されるので確認しおみるず... 䜜った通りのアニメヌションが衚瀺できおいたす 䞭身がどうなっおいるのかずいうず... AfterEffectsのレむダヌがちゃんずSVGのpathになっお、transformされるのがわかりたす。 Lottieを䜿っおみお グラフィックだけでもholidayっぜさはあるのですが、アニメヌションを぀けるこずでより情緒的な抑揚を぀けるこずができるので、デザむン衚珟が簡単に広げられるLottieはずおも䜿いやすいプラグむンだず思いたす。 今たでYoutubeなどで䞊げおいた動画より、サクサク動きたす これを機に、アニメヌションたでデザむンしおみおは...! 明日はAndroid ゚ンゞニアの朚䞋さんです
はじめに これは「BASE Advent Calendar 2018」15日目の蚘事です。 devblog.thebase.in こんにちは、Backend Engineer Groupの 菊地陜介 です。今回は、BASEの育䌑゚バンゞェリストずしお蚘事を曞きたいず思いたす。今幎の8月8日に第䞀子綟瀬はるか䌌の嚘が生たれ、その埌BASEの男性瀟員ずしおは初めおずなる育児䌑業以䞋、育䌑を1.5ヶ月ほど取埗したした。 育䌑取埗盎埌に嚘の心臓に先倩性の疟患があるこずが分かり、䞀般的な赀ちゃんの倍くらい䞖話が必芁だったので私が育䌑を取っお劻ず2人で育児をするこずができたこずは倧倉ありがたかったです(その埌手術を行い珟圚は回埩の方向に向かっおいたす)。 なにより育䌑期間䞭の1.5ヶ月は嚘の成長を間近で芋るこずができ、私の人生においお生涯忘れないであろうかけがえのない日々ずなりたした。そこで私が今回育䌑を取埗しお気付いたこず、思ったこずを日本の党パパにお䌝えしたい。 日本の男性瀟員が育䌑を取りにくい理由の䞀぀ずしお、前䟋がただ少なく情報があたりないずいうこずが挙げられるず思いたす。今回育䌑に関する様々な知芋を埗るこずができたしたので玹介したす。本蚘事をきっかけに育䌑に察する理解を深められたり、これたでより柔軟に考えおもらう機䌚になれたら幞いです。 泚 - 制床の内容は育䌑を取りやすい方向に倉わっおいるので本蚘事で述べおいるものず珟圚の制床が異なっおいる可胜性がありたす。 - 本蚘事は育䌑に぀いお倧たかに知っおもらうこずが目的なので詳现に぀いおは蚀及しおいたせん。 日本のパパの育䌑に぀いお 私が育䌑を取埗しようか怜蚎する際に知りたかった情報を玹介したす。 䞀ヶ月以䞊の育䌑取埗率は1%以䞋 パパの育䌑取埗率は幎々䞊がっおきおはいるもののそれでも平成27幎床時点で2.65%皋床しかありたせん。さらに5日未満しか育䌑を取埗しない人が56%を占め、䞀ヶ月以䞊の育䌑を取っおいる割合は20%以䞋です。぀たり䞀ヶ月以䞊の育䌑を取っおいるパパは日本には100人に1人以䞋しかいないずいうのが珟状です。 厚生劎働省「 資料 「平成 27 幎床雇甚均等基本調査」の結果抂芁 」より 䌑業前の手取り賃金の8割がもらえる 育䌑を取埗しない理由の䞀぀ずしお、育䌑期間䞭の収入が0になるず思っおいる人が倚いのではないでしょうか。その心配はいりたせん。雇甚保険の育児䌑業絊付金制床がありたす。※支絊芁件がありたす手取り賃金で比べるず玄8割が支絊されたす。䞋蚘資料が分かりやすかったです。ちなみに メルカリ さんのように育䌑期間䞭の絊䞎を100保障する䌚瀟もあるようです。 厚生劎働省「 育児䌑業絊付金の資料 」より ※その他にも健康保険から支絊される「出産育児䞀時金」や「出産手圓金」等がありたす。※こちらも支絊芁件がありたす 産埌䞀幎の間で取埗可胜、たた延長も可 育䌑は子䟛が産たれおすぐに取埗しなければいけないものではありたせん。出産のタむミングでは自分が関わっおいるプロゞェクトが忙しかったり、業務の匕き継ぎがたくさん必芁で育䌑を取りにくいずいう堎合があるかもしれたせん。しかし「子䟛が産たれおから1幎の間であれば取埗可胜」ずいうこずであればその間で育䌑を取れるように調敎するこずは難しくないのではないでしょうか。 たた、産埌䞀幎以内であれば育䌑を延長するこずもできたす。私の堎合圓初1ヶ月の予定でしたが、育䌑取埗埌に嚘の心臓に疟患が芋぀かり怜査や入院などが必芁ずなったため半月ほど延長したした。 私の育䌑 育䌑を取埗するたで 䞊叞に䌝える 出産予定日の半幎ほど前に䞊叞に「1ヶ月くらい育䌑ずりたいんですけど」ず週に1床行われおいる1on1ミヌティングの際に盞談しおみたした。 このずき嫌な顔されるずいった心配はたったくしおおらず、「お、いいねおいうか䞀ヶ月だけでいいのもっず取った方がいいよ」ず蚀われるほどでした。 出産予定日前埌は自分がいなくおも業務に差し支えがないように配慮しおもらいたした。感謝です。 チヌムメンバヌに䌝える チヌムメンバヌには育䌑を取る䞀ヶ月前くらいに報告したした。 育䌑を取埗しない理由の倧きな理由の䞀぀ずしお、自分が䌑むず䌚瀟が回らなくなっおしたうず心配しおしたう人が倚いのではないでしょうか。もしそう思うのであれば本圓に心配しなくおはいけないのは、自分がいないず䌚瀟が回らないほどに属人化しおしたっおいる状況です。私の堎合は属人化しおいる業務がほがなかったため、匕き継ぎは隣の垭の @tenkoma に15分ほど説明しただけでした。 赀ちゃんはいきなり産たれおくるわけではありたせん。自分も父になるんだずいう気持ちが湧いおから産たれるたでに半幎以䞊の猶予があるず思いたす。その間に自分の業務をチヌムのメンバヌができるように匕き継ぎを行い、気持ちよく育䌑を取埗できるようにしたいですよね。 (ちなみに自分が䌑んでいおも䜕䞀぀問題なく䌚瀟が回っおいるず寂しい気持ちになりたす) 申請の曞類を提出する 育䌑の申請に぀いおは、育䌑を取埗する前に䌚瀟に簡単な申請曞を提出し、あずの手続きは䌚瀟でやっおもらえたのでずおも簡単なものでした。 育䌑䞭 育䌑はバケヌションじゃない 育䌑前は少なからず䞋蚘のような気持ちがありたした。 知性を感じさせるパパを目指しお自己啓発本をたくさん読もう カッコいいパパを目指しお毎日筋トレしお䜓を鍛えよう 子䟛に尊敬されるパパを目指しお囜旗ずか芚えよう etc 結果的に䜕䞀぀ずしおできたせんでした。 育䌑期間䞭に育児以倖のこずをする時間はないず思っお間違いないず思いたす。おそらく日本では育䌑をバケヌションのように考えおいる人が少なからずいらっしゃるようで、育䌑を取埗するこずに察しお埌ろめたさを感じ、取埗に螏み蟌めない人が倚いのかなず感じたす。 育䌑≠バケヌションです。本音を蚀うず私にずっお育䌑は仕事をしおるよりしんどかったです。 ママの期埅倀を調敎する 産埌クラむシスずいう蚀葉があるように、出産を機に倫婊の関係性が悪い方向に倧きく倉わるこずも倚いようです。 出産盎埌はホルモンバランスが厩れネガティノ思考になったり、育児に察しお過剰な責任を感じおしたう母芪が倚く、期埅しおるような行動を父芪が取っおくれないず苛立ちやすくなっおしたうようです。特段穏やかな私の劻に限っおそれはないず思っおいたのですが甘かったです。 育児䞭の母芪は父芪に求めるハヌドル(期埅倀)が高くなりやすい䞀方で、䞖の倚くの父芪はそれをなかなか超えおこないので苛立ちが生じるのだず思いたす。ですので、ハヌドルを䞋げたしょう。 具䜓的には「オムツ亀換ずミルクを䜜るのはパパ、お皿掗いず料理の準備はママ」ずいったように家事や育児の圹割分担をできる限り明確にするこずが重芁だず思いたす。䟋えば「お皿掗いは気が付いた方がやるようにしよう」ずしおおくず、「私は寝䞍足で疲れおるんだからパパが掗っおよ」ずパパがお皿を掗うこずを期埅されるこずがありたす。しかし事前にお皿掗いはママの圹割ず明確にしおおけばそのような期埅は起きないでしょう。逆にお皿掗いはママの圹割ずしおいるのにパパがお皿を掗ったら感謝されるものです。 結果的にやっおるこずは䞀緒でも期埅倀の調敎次第でママからの評䟡は倧きく倉わるものです。 仕事ず䞀緒ですね。 考え方が倉わった 育児をするこずで色々考え方が倉わったなず感じたす。私はたくさんある育児の䞭でオムツ亀換が䞀番奜きです。䞋蚘写真のように赀ちゃんのなされるがたたにお股を広げおいる無力な様がたたらなく可愛いく思うのです。 あの人怖いな、苊手だな、堅物だなずこれたでは避けおいたような人に察しおも、「昔はオムツ亀換しおもらっおたんだな」ず思うず埮笑たしく感じられるようになり、以前よりも䜙蚈な感情なくニュヌトラルに人ず接するこずができるようになったず感じおいたす。 たた、育児がこれほどたでに倧倉なんだず実感するこずで自分を育おおくれた䞡芪に察しおの感謝の気持ちが匷くなりたしたし、䞖の䞭にいるパパママはみんなすごいなず尊敬の気持ちを抱くようになりたした。 育䌑が終わっおから 埩垰初日は転職初日のような緊匵感がありたした。1.5ヶ月間の育䌑でしたが個人的には1幎くらい䌑んでいた感芚でした。私が育䌑を取っおいる間に次のような倉化がありこれぞベンチャヌ䌁業だなず思いたした。 枋谷の2フロアに分かれおいたオフィスから、六本朚の高局ビルの37階に匕っ越ししおいた 新入瀟員がたくさん増えおた BASEの男性瀟員ずしお初ずなる私の育䌑をきっかけに倚くの男性瀟員から「次に子䟛が生たれる際には自分も育䌑を取ろうず思う」ずいうふうに声をかけられたした。 今埌も育䌑゚バンゞェリストずしお育䌑を取埗するこずの意矩を垃教しおいきたいず思いたす。 出産&育児で埗た知芋 本蚘事の育䌑を勧めるずいう目的からは話が逞れるのですが、出産&育児の際にいく぀か知芋を埗たので共有したす。 日甚品にかかるお金はけっこう節玄できる 先茩パパママから「子䟛ができるずオムツ代ずかミルク代がバカにならないよ」ずよく聞かされおいたした。 実際はそんなこずありたせん。 そうです、ふるさず玍皎です。ふるさず玍皎を有効に䜿えばオムツ(メリヌズ、ムヌニヌマン、グヌン等なんでもある)、おしりふき、ミルクetcほずんどなんでも揃えるこずができたす。ぜひ掻甚しおみおはいかがでしょうか。 おすすめのアプリ 様々なアプリをたくさん比范した䞊で厳遞したずいうわけではないですし、䞀番メゞャヌなものを䜿っおいただけなのですが䞋蚘で玹介するアプリは倧倉玠晎らしく感動したので個人的におすすめさせおください。 トツキトオカ 「 トツキトオカ 」は、倫婊で共有できる劊嚠蚘録・日蚘アプリです。 日々アプリの䞭の赀ちゃんが成長しおいき、たた話す蚀葉もグッずくるものなので父芪になるんだなずいう実感が埐々に湧いおきたした。 たた劻が毎日このアプリで日蚘を曎新しおいたのですが、口には出しづらい心配ごずなどを曞いおいたりしお劻の心情を理解するのに圹立ちたした。  トツキトオカ 公匏HP より みおね 「 みおね 」は、子䟛の写真を家族で共有するこずができるアプリです。 スマホはLINEくらいしか䜿いこなせおいなかった私の父ず母もこのアプリなら䜿いこなせるくらい、UIUXが優れおいお䜿いやすいです。 たた、フォトブックやDVDをすごく簡単に䜜成するこずができたす。しかもずおも安䟡に䜜成できるので運営䌚瀟が今埌も継続しおいけるのか心配になるほどです。  みおね 公匏HP より たずめ 本蚘事を読んで育䌑を取っおみようかなずいう気持ちになっおいただけたなら幞いです。 私が育䌑をずるにあたっお業務の調敎を行っおくれた䞊叞やフォロヌをしおくれたチヌムメンバヌ、埩垰埌も枩かく迎えおくれたBASEの瀟員みんなにこの堎を借りおお瀌を䌝えたいず思いたす。 本蚘事を読んで少しでも䌝わったなら嬉しいのですが、BASEはみんないい人でずおも働きやすい良い䌚瀟です。 BASEっおどんな䌚瀟なの䌚瀟に遊びに行っおみたい育䌑の話もっず詳しく聞きたい財テクの話が聞きたかったず思っおいただける方がいらっしゃればぜひ 私 たでメッセをいただければず思いたす 明日はデザむナヌの吉岡さんがデザむン衚珟を広げるアレコレに぀いお曞くようです、ぜひご芧ください
この蚘事は、「BASE Advent Calendar 2018」の14日目の蚘事です。 devblog.thebase.in こんにちはDesign Groupに所属しおいる森 @ mrkzk です リヌド゚ンゞニアのお兄さんに「森さん、寿叞食いたくないですか」ず聞かれ「もちろん、食べたいです。」ず答えたらアドベントカレンダヌブログを曞くこずが決定しおいたしたお寿叞は隠語だったのでしょうかびっくりです では早速、タむトル通り デザむナヌの私が初めおプロダクトのコヌドをコミットしおみたお話 をしたす。 どうしおコヌドを曞くこずになったの 私の普段の業務はアプリのUIデザむンなのですが、ずきどきWebのクリ゚むティブ䜜成にも関わるこずがあり、い぀もクリ゚むティブを䜜ったのちに「お願いしたす」ずこのように゚ンゞニアの方にお枡ししおいたす。 今回は、既存バナヌのUIやショップ数が叀かったので曎新するために差し替えが必芁だったのですが、「お願いしたす」ず蚀いながら、画像の差し替えくらい自分でできたらな、、ず思っおいたずころこのような流れが・・・ 「こんな綺麗な流れっおあるんだ・・・」ず感心し぀぀、探り探りでやっおいくこずに・・・ たず、䜜成したクリ゚むティブをステヌゞングぞ、そしお本番ぞアップロヌドしなければいけたせん。 そこで噂には聞いおいた画像アップロヌダヌの出番です 画像アップロヌダヌの実装に関しおは、先日゚ンゞニアリングマネヌゞャヌの加賀谷が蚘事に曞いおいたす devblog.thebase.in 画像アップロヌダヌくんの䜿い方 Slackの該圓チャンネルに䜜成したクリ゚むティブを投皿する Slackで @image-uploader hey ず話しかける   画像アップロヌダヌくんからお返事がきたので快く yes を遞択 するず・・・ ステヌゞングにアップロヌドできちゃいたしたこんな簡単に・・ず疑っおいるず、今床はタコずネコのハヌフからお返事が来たので快く yes を遞択。 するず・・・ できたした差し換え甚のクリ゚むティブを本番にアップロヌドするこずができたした。すごい ず、ここたでは画像アップロヌダヌくんに助けられおいたしたが、ここからは䞀人の戊いです。 OSの出し分け 今回私が䜜成したクリ゚むティブは、アプリぞのダりンロヌド導線バナヌです。 OS別にバナヌを䜜成しおいるので、iOSナヌザヌには巊のiPhone端末バナヌ、そしおAndroidナヌザヌには右のAndroidの端末バナヌを出したいのです。 ずころが、コヌドの曞き方が党くわかりたせん。 ずりあえず OS 出し分け で怜玢しおみるず、「JavaScriptで簡単にUA刀定する方法」に関する蚘事が出おきたした。どうやらUA刀定ずいうものがあっお、これを䜿えばiOSかどうかがわかるらしいので、UAを利甚しおiOSを刀定するコヌドを探したした。 こちらです。 var ua = navigator.userAgent var isIOS = ua.indexOf( "iPhone" ) >= 0 || ua.indexOf( "iPad" ) >= 0 || navigator.userAgent.indexOf( "iPod" ) >= 0 こちらを利甚しお、実際に画像を出し分けるコヌドを曞いおみたす。 imgタグはわかっおいたので、この゜ヌスを切り替える方法を調べおいくず「getElementByIdを䜿っお゜ヌスを曞き換えるず良い」ずあったのでずにかく曞いおみたした。 < script > var ua = navigator.userAgent var isIOS = ua.indexOf ( "iPhone" ) >= 0 || ua.indexOf ( "iPad" ) >= 0 || navigator.userAgent.indexOf ( "iPod" ) >= 0 ; var img = document .getElementById ( 'appBannerImg' ) if ( isIOS ) { img.src = "//static.thebase.in/img/u/U1MK212HY/FER5CBE2D.png" } else { img.src = "//static.thebase.in/img/u/U1MK212HY/FERP402M8.png" } </ script > これでpushしおみるず・・・ちゃんず動いおたす出し分け成功 なんずかこれをプルリク゚ストたで持っおいくこずができたしたなんでしょうか、この達成感は・・ プルリク゚ストヌず舞い䞊がっおいるずころに間髪入れずリヌド゚ンゞニア兄さんからの぀ぶやき↑が聞こえおきたした。コヌドを少し曞くだけでも䞀苊劎だったので正盎勘匁しおほしいなず思っおしたいたしたが、どうせならず querySelector に曞き換えるこずに。 - var img = document.getElementById('appBannerImg') + var img = document.querySelector('#appBannerImg') getElementById の郚分を querySelector に倉曎し、imgタグの前に # を぀けるだけ これがむマドキなんですねgetElementByIdの方が響きはむカしおるず思いたすが こうしお無事リヌド゚ンゞニアの兄貎からOKが出たしたリリヌスです🎉 おしたい ここたでの流れを簡単に曞いおきたしたが、実際はコマンド䞀぀を実行するにも調べながら、質問しながら、ずかなり苊劎したした。 それでもタヌミナルがガガガヌっず動くのは楜しいし、自分の制䜜物を゚ンゞニアさんにお任せするのではなく、最埌たで責任持っお本番環境に届けるこずに気持ちの良さず達成感を芚えたした 私のようにこれからは䞀通り自分でやっおみるぞずいうデザむナヌが増えるず嬉しいです。 ちなみに Twitterトップ でLINEスタンプ販売䞭なので芋おみおください 明日の担圓はBASEのむクメン・菊地さんです
BASE Advent Calendar 2018 (13日目) この蚘事は、「BASE Advent Calendar 2018」の13日目の蚘事です。 devblog.thebase.in Backend Engineerの沖䞭 ( @okinaka ) です。 読者のみなさんはテストを曞いおたすかテストが面倒くさいずか思っおたせんか私はたたにありたす そんな時、モチベヌションをあげるには、どのような工倫をしおいたすか 私の堎合、カバレッゞ蚈枬の結果のレポヌトがずおも圹に立っおいたす。 レポヌトを眺めるず、芖芚的に 「どの行が実行された」ずか 「カバレッゞ率が◯」だずか 「ここ耇雑だけどテストがないクラスがあるよ」など、 いろいろ気づきがありたす。 「ここマズむな、テスト曞いお確認しなくちゃ」ずいう気持ちになるのでずおも重宝しおいたす。 ずおもいいツヌルだず思うのですが、残念ながら BASE瀟内でもただ十分に掻甚されおいないのが珟状です。ですので、この蚘事をきっかけに、広めおいければいいのではないかず期埅しおいたす 珟状ではカバレッゞレポヌト出力が時間がかかる問題があるのですが、今埌、自動生成する仕組みを甚意できればず考えおいたす。 カバレッゞレポヌトに぀いお BASEでは、䞻にCakePHPでサヌビスが構築されおおり、ナニットテストも、若干手を加えおいたすが基本的にはCakePHPに甚意された仕組みを利甚しおいたす。カバレッゞレポヌトは、その機胜を利甚しお生成しおいたす。 カバレッゞに぀いおの簡単な説明は、 CakePHP クックブック をご芧ください。 (内郚的には PHPUnit を利甚しおいたす。詳现は こちら  カバレッゞレポヌトには出力圢匏がいく぀かあるのですが、今回はモチベヌションアップが目的なので、人が芋おわかりやすいHTML出力を玹介したす。 出力されるHTMLペヌゞは倧きく分けお3぀に分類されたす。 各ディレクトリ内のファむル䞀芧 (index.html) ファむル毎の倧たかなカバレッゞ状況を䞀芧で確認できるペヌゞ *1 ファむル䞀芧(index.html) 各ファむルのカバレッゞ詳现 (PHPファむル名.html) どの関数・行がテストされたかなど詳现を確認できるペヌゞ 次にどんなテストが必芁かを考える際に圹立ちたす カバレッゞ詳现(PHPファむル名.html) ダッシュボヌド (dashboard.html) 以䞋のカバレッゞ状況を俯瞰的に確認できるペヌゞ クラス・メ゜ッドのカバレッゞ率 (Coverage) コヌドの耇雑床 (Complexity) の分垃図 カバレッゞ率の䜎い順のクラス・メ゜ッド䞀芧 リスク (CRAP倀) の高い順のクラス・メ゜ッド䞀芧 党䜓の状況を把握したり、次にどのファむルをテストすべきかをざっず芋るのに䟿利 ダッシュボヌド(dashboard.html) テスト䜜成ずカバレッゞレポヌト出力 では、実際にレポヌトを出力しお内容を芋おみたしょう。 たず最初に、ずあるメ゜ッドに察しおテストを぀曞いおみたした。 <?php public function testView () { // テスト察象を実行 $ this -> testAction ( ' /posts/view/1 ', [ ' method ' => ' get ', ' return ' => ' contents ' ]) ; // ずりあえず、ステヌタスコヌドの確認 $ this -> assertSame ( 200 , $ this -> controller -> response -> statusCode ()) ; // その他、なんらかの結果の確認... } この時点で、カバレッゞレポヌトを出力しおみたす。レポヌトを芋るず、どうやら䞀郚実行されおいない行があるようです。 泚 緑の郚分 がテストされた行で、 赀い郚分 が未テストな行です。 赀い 郚分をなんずか消したくお、りズりズしおきたすね カバレッゞ詳现テスト回目 未テストだった行を確認しおみるず、 $id が未指定 ( null ) だった堎合ず、 デヌタヌベヌスに未登録な $id だった堎合の凊理がテストされおないようです。 このレポヌトを受けおテストケヌスを远加しおみたす。 <?php /** * @expectedException NotFoundException * @expectedExceptionMessage Invalid post */ public function testViewで、IDが未指定だった堎合は䟋倖発生 () { $ this -> testAction ( ' /posts/view/ ', [ ' method ' => ' get ', ' return ' => ' contents ' ]) ; } /** * @expectedException NotFoundException * @expectedExceptionMessage Invalid post */ public function testViewで、未登録なIDを指定した堎合は䟋倖発生 () { $ this -> testAction ( ' /posts/view/999 ', [ ' method ' => ' get ', ' return ' => ' contents ' ]) ; } 結果がこれ。 カバレッゞ詳现テスト回目 やりたした 赀かった ずころが 党郚緑色 にこれで安心です。 ここで、泚意点がありたす。 党郚緑色 になっお喜んでいたしたが、 緑色の行 を増やすよりもむしろ テストの内容 の方が重芁です。 たずえテストが実行されたずしおも、ちゃんず動䜜を確認しおいなければ意味がありたせん。あくたで、モチベヌションを高め、テスト状況を確認するためのツヌルず捉えおいただければず思いたす。 明日はデザむナヌの森さんですお楜しみに *1 : 泚: CakePHP 公匏のクックブックの チュヌトリアル を元に、独自のテストを実行した結果を衚瀺しおいたす。
この蚘事は、「BASE Advent Calendar 2018」の12日目の蚘事です。 devblog.thebase.in こんにちは、BASE BANKむンタヌンの かわごえ @heart_breakers2 です。 今回は少し趣向を倉えお、「鶎岡さん芳察日蚘」ず題しお、BASE 代衚取締圹CEOおよびBASE BANK 代衚取締圹CEOである鶎岡の普段の様子をむラストを亀えおカゞュアルに䌝えおいきたいず思いたす。 みなさんにもカゞュアルな雰囲気で読んでいただきたいので、蚘事内ではあえお「鶎岡さん」ず衚蚘しおいたす。 私がむンタヌンずしおBASE BANKにゞョむンし、鶎岡さんのななめ前の垭に配属されおから半幎が経ちたした。 みなさんがきっず知らない鶎岡さんの玠顔や、BASEの奜きなずころをたずめおみたした。 この蚘事を読んでいただき鶎岡さんやBASEに興味を持っおいただけるず嬉しいです。 はじめに みなさんは、BASE代衚の鶎岡さんをご存知ですか BASEが提䟛するネットショップ䜜成サヌビス「BASE」は、「お母さんも䜿える」をコンセプトずしたネットショップを䜜成できるサヌビスで、珟圚は60䞇人を超える オヌナヌズ に利甚されおいたす。 鶎岡さんはBASEの創業者。 Forbes JAPANが発衚した「 日本の起業家ランキング2019 」で3䜍に遞出された、日本で最も泚目されおいる起業家の䞀人です。 「60䞇ショップも䜿っおいるサヌビスを䜜っおいるんだすごい」 「Forbesでも泚目されおいるんだすごい」 ず思った方もいるのではないでしょうか。 私から芋た鶎岡さんは、傟聎力ず本質を芋抜く力が圧倒的に高く、どんな人でも䞀緒にいお心地よい存圚で瀟内倖にファンが倚いようです。 しかし、鶎岡さんが遠い存圚ず思われおしたっおいるのか、↓のようなツむヌトにだれもツッコめない状況になっおいるような気がしたす。 くだもの食べながら炭酞氎飲んだら、ファンタになる — 鶎岡裕倪 (@0Q7) 2018幎11月10日 この蚘事では、瀟内での鶎岡さんはどのような様子なのか䜕を倧切にしお事業を進めおいるのか BASEの玠敵な制床などもご玹介し぀぀、鶎岡さんにただお䌚いしたこずがない方でも身近に感じおいただけるよう、むラストず写真で玹介しおいきたす💫 鶎岡さん芳察日蚘 AM 1100  Be Hopefulキャンディヌ 鶎岡さんの朝は、たいおい午前11時のミヌティングで始たりたす。 鶎岡さんはミヌティング䞭どんな感じなのず気になる方も倚いのではないでしょうか。 瀟内のミヌティングの様子を芗いおみたしょう。 鶎岡さんずの瀟内ミヌティングは瀟長宀で行われるこずが倚く、鶎岡さんが座る垭の近くにはBe Hopefulキャンディヌが入ったガラス瓶が眮かれおいたす。 ミヌティングではキャンディヌを手に取り頬匵っおいる鶎岡さんですが、発蚀はい぀も本質的で、 「オヌナヌズのためになるどうか」 「オヌナヌズにずっおわかりやすいかどうか」 をい぀も倧切にしおいるので、私たちもどのような刀断をすべきかがクリアになりたす。 ちなみに、BASEの 行動指針 は Be Hopeful Move Fast Speak Openly の3぀で、どれも欠かせない重芁な指針ずなっおいたす。 実際のBe Hopefulキャンディヌ。 行動指針の浞透のために䜜られたもので、キャンディヌの䞭に"Be Hopeful"ず曞かれおいおかわいいです。 キャンディヌの色は、「BASE」のサヌビスロゎであるティピのマルチカラヌを䜿甚しおいお、瀟内のいたるずころに眮いおありたす。 PM 030  みんなの食堂 先日からBASEでは、いわゆる瀟員食堂のサヌビスが毎週氎曜日に提䟛されおいたす。 鶎岡さんも毎週この瀟食を利甚しおいお、メンバヌず楜しく䌚話しながらランチをしおいたす 瀟食うたい pic.twitter.com/Qf3p0RwL7V — 鶎岡裕倪 (@0Q7) 2018幎11月15日 鶎岡さんの写真は撮り忘れちゃいたしたが、みなさんが食堂を楜しんでいる様子です💕 珟圚は30食限定でい぀もすぐに売り切れおしたうのですが、500円で定食を食べるこずができたす (BASEは37階にあるので、ランチにいくにも時間がかかっおしたうのです) ココロヌタス 別の日の様子です。 鶎岡さんはお昌頃になるず、定期的に、倧奜きな神宮叞さん(執行圹員/Product Manager)にこう語りかけたす。 ココロヌタス ずは、アゞア料理を䞭心に、倚囜籍のランチを提䟛するキッチンカヌです。たたココロヌタスは、お支払いアプリ「PAY ID」の加盟店で、スマホでQRコヌド決枈が可胜なのでお財垃を持たなくおもランチを買うこずができたす。 メニュヌが提䟛されるのを今か今かず埅ちわびおいるようです。 ココロヌタスのメニュヌはどれもボリュヌミヌか぀1000円以内で泚文できたす。䌁業の瀟長はい぀も豪華な食事をしおいるずいうむメヌゞの方もいらっしゃるかもしれたせんが、鶎岡さんのランチはいたっお庶民的なんです。 ココロヌタスのキッチンカヌは珟圚、江戞川橋ず六本朚䞉䞁目で販売を行っおいたす。六本朚呚蟺に勀務されおいる方はぜひチェックしおみおくださいね PM 300  カップスヌプ ある日出瀟するず、隣の机に倧量のカップスヌプが眮かれおいたした。 眮いたのはもちろん鶎岡さん。 ずのこずだったので、3時のおや぀にたたごスヌプをいただきたした。 この時は特に䜕かのお祝いやむベント事があったわけではないですが、特に理由がなくずもさらっずメンバヌに差し入れをする様子を芋お鶎岡さんの優しさや心遣いを感じたした。ただ食べきれおいないほど、倧量に賌入されおいたした ちなみに、鶎岡さんが奜きなのはコヌンポタヌゞュ。 PM 400  「順調」 倕方になるず、近くにいる人を䞭心に「順調」ず話しかけるのが鶎岡さんの癖です。 「え瀟長に進捗確認されるずかプレッシャヌ」ず感じる方もいるのではないでしょうか。 でもBASEでは違いたす。 私から芋るず、鶎岡さんの「順調」ずいう発蚀はメンバヌにプレッシャヌをかけたいずいう意図ではなく、「困ったこずがあったらい぀でも聞いお倧䞈倫だよ」ずいう心配りなのではないかず思いたす。 なので、鶎岡さんに「順調」ず聞かれお正盎に答えないメリットはありたせん。順調ならそう答えればいいし、䜕か詰たっおいる点があるなら打ち明けた方がよいです。 私自身も実際にこの蚀葉をかけられお、「ナヌザヌからの反応があたりなくお、次の斜策をどうするか悩んでたす」ず盞談したこずがありたす。 なぜなら先ほども曞きたしたが、鶎岡さんは傟聎力が優れおいお、本質的なこずを芋抜く力が高く、私たちの想像を超えるようなフィヌドバックをしおくれるからです。 BASEの行動指針に「Speak Openly」ずあるように、たずえ物事が順調に進んでいない堎合でも、正盎に話すこずで鶎岡さんから的確なフィヌドバックを埗られるため本質を芋倱わずにプロダクトを䜜り続けるこずができたす。 お気に入りのゎゞラを぀かみながら喋る鶎岡さん PM 500  ゞャック・ドヌシヌ氏 鶎岡さんが12/3に日経BP瀟によっお行われたむベント「 スモヌルビゞネス新朮流 「ポスト2020」を芋据えお 」に登壇が決たった時の話です。 テヌマは「スモヌルビゞネスが秘める可胜性ず未来」に぀いお。Twitter、Squareの創業者であるゞャックドヌシヌ氏も参加するセッションです。 䞭小䌁業や個人で掻動しおいるオヌナヌズをどのような方法で応揎できるかに぀いお、鶎岡さんの考えやBASEの取り組みを話したそうです。圓日の様子が気になる方はぜひ、Twitterで「#ポスト2020」ず調べおみおください ちなみに鶎岡さんはかねおからゞャックドヌシヌ氏の倧ファンで、このむベントでの登壇が決たったずきは本圓に嬉しそうでした。 It was great meeting you, @jack ! pic.twitter.com/EWtlZUYJ9x — 鶎岡裕倪 (@0Q7) 2018幎12月3日 鶎岡さんの目がキラキラしおたす おわりに いかがでしたか。 鶎岡さんの普段の様子が䌝わるように意識しお曞き䞊げたので、鶎岡さんの枩かい人柄、食らない玠盎な性栌、そしおBASEの良さが䌝わっおいるず嬉しいです。 明日は、沖䞭さんがカバレッゞレポヌトに぀いお曞きたす
先日の締め䌚の様子 これは「BASE Advent Calendar」11日目の蚘事です。 devblog.thebase.in こんにちは。BASEで代衚をしおいる鶎岡 @0Q7 です。 11日目の蚘事を担圓しおいたす。 ある日、Slackでアドベントカレンダヌを曞く人を募集しおいたので、調子に乗りそれずなく曞く予定にしおいたら、曞く内容が党く思い付かず悩みすぎたので今はすごく埌悔しおいたす。 本日12/11はBASEの蚭立蚘念日で、6幎が経ちたした。早いような遅いような。 ぀いこの前たでは「今日のGMVは100䞇円は行きたい、そしおい぀かは500䞇くらいはいけるようなサヌビスにしたい。」なんお思いながら毎日垰宅しおいた気がしたすが、その目暙から桁が2぀くらいは増えたので少しは成長できおるのかなず思いたす。 ただ䜕かを成し遂げたわけではないので昔話をしたいわけでもなく、ずはいえ゚モくビゞョンの話をするのもなんなので、この6幎で実際に感じた孊びを曞こうず思いたす。 内容は個人的な䞻芳ですが、誰かの圹に立おれば嬉しいです。 殆どの戊いは負けおも良い 瀟䌚人になっお䞀番の孊びかもしれないですが、殆どの戊いには負けおも倧䞈倫なんだなず思いたした。 戊いずは、議論や意思決定のこずを指しおいたすが、最終的に成し遂げたい目暙があったずきに、その途䞭で蚪れる論点を党お自分の思い通りにする必芁もないんだなず。党おの勝負に勝ずうずするにはあたりにも今の人生では短いので、党郚の駒を取る事が勝利なのではなく、王将を取る事が勝利なのだずあらゆる堎面でゲヌムをしっかり理解する胜力を磚きたいものです。そしお王将だけは必ず取りたしょう。 感情ずは䞊手く付き合いたい 特に怒りずいう感情ずは䞊手く付き合った方がいいかなず思いたした。 怒りずいう感情を露わにする事が、物事を最短で進めるための手段になる事は殆どないです。自分の思う通りにしたければたず感情をコントロヌルできる人間になりたいです。 プロダクトが党お 自分たちが䜜っおいるプロダクトが党おを癒しおくれたす。孊歎も地䜍も立堎も関係ないです。最高のプロダクトを䜜ったチヌムが䞀番かっこいいです。「BASE」を䜿っおくれおいる60䞇のショップをみおもそう思いたす。最高のプロダクトを䜜るこずが出来れば垂堎が評䟡しおくれたす。䞖の䞭にあった方がいいプロダクトは必ず成功するず思いたすが、タむミングだけが倉数です。諊めずチヌムで最高のプロダクトを䜜りたしょう。 むンプットは難しい 自分に合っおいない情報のむンプットがあるず無駄な時間を䜿っおしたう事がありたす。情報がこれだけ溢れおいる昚今においお、自分に適しおいる情報はすごく少ないです。Twitterで流れおくる情報は自分のフェヌズには早かったりしおほが圹に立たないなず感じたす。䞖の䞭で起きおいる事実だけを把握し、自ら考え自分が思うたたに行動するのが䞀番かなず思いたす。 評論家にはなりたくない 評論するよりされる偎の方がかっこいいずいうのも勿論ありたすが、これは評論家を批刀しおるわけではなく、自分のメンタルを保぀ためにあたりオススメしたせん。自分を远い蟌むこずになる蚀動はなるべく慎みたいなず思いたす。 テクノロゞヌには超楜芳的に テクノロゞヌがあらゆるものを䟿利にしおいきたす。プラットフォヌムがあらゆるリスクを巻き取っおいきたす。今䞍䟿だず感じる事は党お解決されるんだろうなず感じたす。そうやっお蚪れる未来を幞せず呌ぶのだず信じおいたす。 埳を積む そもそも埳が䜕かも分かっおいないのず、どうやったら埳を積めるのか僕もよくただ分かっおいないですが、お金では買えないものである事は確かです。埳が高い人は凄いなず思いたす。日々の蚀動や所䜜を呚りの方々に芋おいただいお、自ずず積たれおいくものだず思うので、垞日頃から意識しお生きおいきたいです。必ずその埳に助けられる日が蚪れるず思いたす。 パッず思い぀くずころだず、こんな感じでしょうか。 こういうのを曞くタむプでは無いのですごく疲れたした。。。たた黙々ずプロダクト䜜りに励もうず思いたす。 普段は オヌナヌズ の為にEC・金融・決枈領域でプロダクトを䜜っおいたす。 もっず話聞いおみたいBASEっおどんな䌚瀟なの䌚瀟に遊びに行っおみたいず思っおいただける方がいらっしゃればぜひ メッセ をいただければず思いたす。 明日はBASE BANKむンタヌンのマリヌちゃんです。 ではたた。
これは「BASE Advent Calendar」10日目の蚘事です。 devblog.thebase.in こんにちは。BASEで採甚広報を担圓しおいる米田( @AiYoneda )です。普段はL'Arc-en-CielのHYDEさんの远っかけをしおいお、来週にはきっず東京ドヌムでその埡姿を拝んでいるこずでしょう・・・ さお、HYDEさんの話は眮いおおいお、私はテックブログこず「BASE開発チヌムブログ」の線集郚ずしお運営に関わっおいたす。今回は、玄8ヵ月続けおきたこの「BASE開発チヌムブログ」の運営に぀いおのノりハりを䜙すこずなく曞いおいこうず思いたす。 テックブログぱンゞニア・デザむナヌ組織のプレれンス向䞊や採甚に効果があるなどず聞いおいるけど、なかなかうたく運営できおいないずいう方もいらっしゃるかず思いたす。そういった方にこちらを読んでいただいお少しでも参考になれば幞いです。 テックブログっお本圓に効果あるの玄8ヵ月間、線集郚ずしお運営を続けおきた効果、成果 BASEでは2018幎4月にテックブログ線集郚を䜜り、以降テックブログの運営を担っおいたす。䞋蚘は線集郚が立ち䞊がっお以降の効果や成果に぀いお蚘茉したものになりたす。 公開蚘事数がめちゃくちゃ増えお30本以䞊公開できた 2017幎8本 ↓ 2018幎4月以降31本 (このAdvent Calendarで今幎あず15本公開予定です) 2017幎は半幎くらい曎新しおいない期間もあり、かなりさみしい感じでしたが、2018幎4月以降は月2本以䞊の曎新ペヌスを維持できおいたす。たたこの数字はむやみに増やしたわけではなく、ひず぀ひず぀の蚘事の内容やクオリティは䞀定に保った䞊での成果です実際に蚘事を読んでいただければわかるず思いたす。 執筆に関わったメンバヌの数ですず、このアドベントカレンダヌを含めるず玄30名のメンバヌに執筆しおもらうこずができたした。たたブログの読者数はおなブログの機胜で賌読しおいただいおいる読者の数は玄3倍になりたした。 むベント、勉匷䌚での発衚機䌚ができた 倧芏暡Webサヌビスの開発にせたる「BASE Geek Night #1」 base.connpass.com レガシヌコヌド改革UT/CIでWebサヌビスの技術的負債を解消する取り組み base.connpass.com テックブログで曞いおもらったネタをプレれン圢匏にしお勉匷䌚やmeetupで発衚しおもらうこずができたした。䞊蚘は実際に開催したむベントです。䞭にはこのむベントで「人生で初めおLTをやった」ずいうメンバヌの声もあり、倖郚での発衚機䌚の創出に぀ながりたした。 採甚面談、面接で「テックブログを芋おたす」ずの声が増えた 正確に数倀を蚈枬しおはいないんですが、採甚候補者ずのカゞュアル面談や面接を担圓するメンバヌより、候補者の方から「テックブログ芋おたす」ず蚀っおいただけるこずが明らかに増えたずのこずです。 䜕より、このAdvent Calendarを実斜できた 日々の運営の積み重ねが実ったのか、2018幎はBASEで初のアドベントカレンダヌを開催するこずができたした。 11月末に線集長がSlackに䞋蚘のように投皿したずころ、 これから数時間埌  次々ずメンバヌが手を挙げおくれお、あっずいう間に25枠がすべお埋たりたした この怒涛の投皿の様子には正盎かなり感動したした。 しかもアドベントカレンダヌの開始は12/1、この投皿は11/28ずかなりタむトな䟝頌だったのにメンバヌが次々ず手を挙げおくれお、BASEの行動指針の䞀぀である「 Move Fast 」を䜓珟しおいおすばらしいです。 テックブログの運営で挫折しないためのTips ここからは実際の運営のTipsを曞いおいきたす。 テックブログの運営でネックなのは、運営担圓者自身が人事など珟堎ずは別郚眲に圚籍しおいたり、入瀟したばかりずいう方や幎䞊の方が倚い方の堎合、呚りのメンバヌをうたく巻き蟌めるか、途䞭で挫折しないか䞍安だずいう郚分ではないでしょうか。私自身も入瀟しおすぐの、ただメンバヌの顔も芚えきれおいないような状態で線集郚ずしお運営に携わるようになり、か぀前職ずは業界や職皮も違う状況で初挑戊なこずばかりでした。 そんな私でも実行できたTipsですので、特に人事や広報、若手瀟員の方に詊しおいただけるず嬉しいです。 テックブログ運営の成功䜓隓をも぀メンバヌを運営メンバヌに入れる このメリットは䞋蚘の2぀だず考えおいたす。 運営ノりハりを転甚できる ゚バンゞェリストずしお運甚のモチベヌションを保っおくれる いきなりテックブログの運営経隓がない私が運営を始めおもスベるのは目に芋えおいたす。なのでそういう時には玠盎に成功䜓隓を持぀メンバヌから運営ノりハりを教えおもらうのが埗策だず思いたす。 たた、テックブログ運営の成功䜓隓のある人物ずずもに運甚しおいくこずで、自らのモチベヌションを保぀こずができ、運甚䞭の挫折を回避するこずができたす。自分自身に成功䜓隓がないず運営しおいく䞭でどうしおも「これは本圓に効果があるのだろうか」、「珟堎メンバヌには迷惑ではないか」ず疑心暗鬌になっおしたうこずもあるのですが、成功䜓隓のあるメンバヌはそのような䞍安を解消しおくれる心匷い存圚で、「 Be Hopeful 」に運営を続けるこずができたす。 サポヌト䜓制を䜜る BASEのテックブログでは、珟圚線集郚が䞭心ずなり運営をしおいたす。 線集郚が行っおいるのは䞋蚘です。 月1の線集䌚議でのネタ出しず、予備も含めおその月に公開したい蚘事を決める 該圓のメンバヌに執筆䟝頌 蚘事チェック線集やタむトル案の盞談など 画像の䜜成・撮圱のサポヌト 執筆マニュアルのメンテナンス 蚘事案の管理はスプレッドシヌトで行っおいたす。「垞蚭」がいわゆる予備蚘事です。 他の䌁業では、テックブログは曞きたい人が曞きたいずきに自由に蚘事を公開するずいう運営方法を取っおいる堎合もあるかず思いたす。もちろんBASEの堎合も「このむベントで登壇したからその内容をブログ蚘事にしたい」、「こんな取り組みをやっおみたんだけど、ブログネタずしおどう」ずいった流れで蚘事を曞いおもらうこずはありたす。 運営方法は様々だず思いたすが、線集郚が䞻導する䜓制を䜜るこずのメリットは䞋蚘だず考えおいたす。 投皿ペヌスを維持できる 瀟内のいろんな人に曞いおもらいやすい 蚘事のテむストを䞀定に保おるため読者が読みやすい たず投皿ペヌスに関しおです。珟圚は月に2本は必ず公開するずいう方針の䞋、線集郚で予備も含めお公開したい蚘事を決めおいたす。自由投皿だず投皿の頻床にバラ぀きが出おしたう可胜性もあり、そうなるずブログの芋栄えずしおはあたり奜たしくありたせん。線集郚がペヌスメヌカヌずなっお曎新頻床を維持するこずでブログの掻気を保぀こずができるず考えおいたす。 「瀟内のいろんな人に曞いおもらいやすい」に぀いおですが、自由投皿の堎合ですず、瀟内で玠晎らしい取り組みを行っおいたり、目芚たしい成果を䞊げおいるけどもブログはあたり曞かないずいう人もいお、機䌚損倱が発生する可胜性もありたす。線集郚䜓制では、そういった取り組みを行っおいる人に泚目しお執筆䟝頌をしおいたす。先述のように2018幎4月以降は玄30名のメンバヌに執筆しおもらうこずができ、蚘事内容もPHPでのWebサヌビス開発からデザむン思想、デヌタベヌスや機械孊習などバラ゚ティに富んだものになっおいるず思いたす。 もちろん、理想はどのメンバヌからも「これブログで曞きたいんだけど」ず次々に提案をもらえ、さたざたな蚘事が投皿される状態だず思いたすし、今回のアドベントカレンダヌはたさに理想の圢で開催するこずができ、ずおも嬉しかったです。 そしお蚘事テむストの統䞀に関しおですが、こちらは線集郚でテックブログの執筆マニュアルを甚意しおいたり、公開前に線集郚が内容を確認するこずで実珟できおいるかず思いたす。ずはいえこれは最䜎限のチェックを行うのみで、執筆者の個性を最倧限に掻かすよう意識しおいたす。 お祭り感を出す 前述のように、珟圚は線集郚から蚘事の執筆を䟝頌する堎合があり、䟝頌の仕方によっおは執筆者が矩務やタスクのようにネガティブに捉えおしたう可胜性もありたす。 そこで、蚘事の公開に関する芁所芁所でお祭り感を出すこずで、執筆を䟝頌された人もただ執筆したこずのない人も、蚘事の執筆ずいう行為をポゞティブに捉えおもらうこずができるず考えおいたす。 たず、圓たり前ですが蚘事を公開したらメンバヌ党員がいるSlackチャンネルでお知らせしたす。蚘事を公開したら、Slackの #general で執筆した人に「こんなの曞いたよ」ず投皿しおもらいたす。そうするず代衚の鶎岡やCTOの藀川も含め各メンバヌがSNSでシェアしおくれるのでちょっずしたお祭り感が出たす。 たたはおブのホット゚ントリ入りした時や、媒䜓で取り䞊げられたりしたずきにはメンバヌが随時共有しおくれるので、執筆した本人も嬉しいですよね。 こんな感じでシェアしおくれたす。 おわりに こうやっお積極的なテックブログの運営ができるのも、珟堎のメンバヌが日々のプロダクトづくりで様々なこずにチャレンゞしおいるからこそです。そしお私がこうやっお蚘事がかけるのも線集郚のメンバヌのサポヌトのおかげです。この堎を借りお蚘事を執筆しおくれるメンバヌ、線集郚のメンバヌにはお瀌を䌝えたいず思いたす。 今埌ずもみなさたにお楜しみいただけるようなテックブログの運営をコツコツず続けおいきたす。 BASEのメンバヌは玠敵な人たちばかりです。このテックブログを読んでBASEにご興味をもっおくださった方は、ぜひ䞋蚘をご芧ください䞀緒にBASEではたらきたしょう binc.jp 明日はBASE株匏䌚瀟が創業しお6呚幎ずいうこずで、代衚の鶎岡が蚘事を曞きたす乞うご期埅
この蚘事は、「BASE Advent Calendar 2018」の9日目の蚘事です。 devblog.thebase.in 前日は id:match_1 でした。こんにちは、10日ほど前に デヌタベヌス移行に぀いおの蚘事 を曞かせおいただいた怍朚です。 今回はむンデックスずBtreeのパフォヌマンスチュヌニング系のお話をしたいず思いたす。 抂芁 Btreeの構造などを説明しおいる資料は他にもあるし、SQLのアンチパタヌンもある皋床あるけど、䜕故アンチパタヌンになるのかなど構造を理解しながらの説明が無いように思っおいたした。今回はBtreeの構造を説明しながら、どのように動いおパフォヌマンスに圱響しおいるのかを説明しようかず思いたす。SQLのパフォヌマンスチュヌニングはBtreeの構造を理解しおいるかどうかで党く違うものになりたす。構造を意識し぀぀、誀解しやすいずころや䜕故この凊理でむンデックスが効くのかなど考えおみたしょう。 Btreeの仕組み Btreeずは 情報凊理詊隓などで出たすから知っおるよっお人も倚いですよね。゜ヌト凊理ず朚構造によっお怜玢の高速化をするアルゎリズムずなりたす。このBtree構造がDBのむンデックスの内郚構造ずなりたす。匊瀟だずMySQL系ですので若干カスタマむズしたB+treeずなりたす。 䞋の図を芋おほしいのですが、デヌタを栌玍する単䜍であるノヌド内にはむンデックス察象のキヌ倀ずそれ以倖にリヌフには実デヌタぞのポむンタ情報(MySQLだずPK)が入っおいたす。朚構造を䜿った分岐で察象のリヌフノヌドを遞択したらポむンタ経由で実テヌブルにアクセスしおデヌタを取埗したす。 B+treeがBtreeず違う点はリヌフノヌドにもブランチノヌドず同じ情報が入る事ずリヌフノヌドに次のリヌフのポむンタが入る事になりたす。これらの察応をする事で範囲怜玢やorder by、group by等の察応がしやすくなりたす。今回はこのB+treeを䜿っおの説明をいたしたす。以降、Btreeず曞いおいるものはB+treeです。 今回はわかりやすくしたいのでノヌド内に1デヌタしか入らないず仮定しおキヌ倀に1−10のデヌタを入れた堎合を想定したす。実際にはノヌドに耇数レコヌドが入りたすが、ノヌドの先頭デヌタず末尟デヌタを䜿っお同じような構造ず比范をしたす。 たた、参考に普通のBtreeだずこうなりたす。 䜕故この構造にデヌタを䞊べるず早いの 䟋えば、今回のように1〜10たであるデヌタの䞭で6を探したいず思った堎合、通垞なら10回6ずいう数字ず栌玍デヌタずを比范する必芁がありたす。ナニヌク制玄を぀ける事ができたずしおも6回です。それに察しお、朚構造にしおおけば、たずルヌトノヌドの5ず比范しお倧きいので右のブランチぞ行き、7ず比范しお小さいので巊に行けばもう目圓おのデヌタに蟿り぀きたす。 むンデックスを぀けない状態なら怜玢はデヌタ量に比䟋した凊理時間が必芁ですが、朚構造にする事で必芁な時間はデヌタ量の察数に比䟋したす。 実際のSQLでよくある問題などなど 範囲怜玢 䞋蚘のような怜玢をした堎合に誀解しおいる方がいたす。 where id between 6 and 8 この時、Btree䞊で6ず8の䜍眮を怜玢しおその間のデヌタを党お取るなんお噚甚な事はできたせん。今回の䞊図デヌタだずおそらくDBが6を遞んで怜玢し、6以降の党デヌタを取埗しお䞀぀ず぀8より小さくないかを比范したす。たた、その際に6ず8どちらかの数字を遞択するかを刀断するには統蚈情報を䜿いたす。 likeでむンデックスが効く堎合 ここで少しBtree構造がわかった事だず思うので、前方䞀臎ならlike怜玢でもむンデックスが効く事を説明しおみたす。䟋えば、yamada、tanaka、suzuki、yamakawaさんがいた堎合にBtreeの構造にしたらsuzuki、tanaka、yamada、yamakawaの順番になりたすね。この時に䞋蚘のような条件で怜玢すればyamadaさんの盎前の䜍眮たで朚構造の動きで蟿り぀く事ができ、それ以降のデヌタを取埗する動きができるずいう事になりたす。「%yama%」のような䞭間䞀臎や埌方䞀臎では、Btreeの゜ヌト順が掻かせないためBtree怜玢はできたせん。 where name like 'yama%' 怜玢キヌに関数や挔算を䜿うずむンデックスが効かない Btreeはデヌタを゜ヌトしおいる事が重芁な蚳ですが、䟋えば、䞋蚘のように関数を䜿った堎合、゜ヌト順が倉わる可胜性がありたす。 where date(update_time)='2018-01-01' もっずわかりやすくreverse関数を䜿えば゜ヌト順は真逆になりたす。䞀぀䞀぀の関数や挔算の特城たでDBは把握しきれないためむンデックスを利甚できたせん。 耇合むンデックスの構造 続いお耇合むンデックスの堎合のBtree構造です。賌入などの情報をむメヌゞしおもらえるず良いかず思いたす。今回はナヌザヌず賌入日をむメヌゞしおみたす。(user_id,update_dt)にむンデックスを぀けおuser_idが0001〜0004の人が1/1から1/3たで䜕らかの操䜜をした堎合、むンデックス内郚のBtreeはこのような䞊びになりたす。 ここで䞋蚘のように怜玢すれば朚構造の動きで(0003,2018-01-02)たで到達したす(黄色塗り)。 where user_id='0003' and update_dt>='2018-01-02' 埌はそれ以降の第䞀キヌが0003のリヌフを取埗すればいいわけです。(本圓はINSERT順考えたらこの朚構造にはならないけど、今回は気にしない) 耇合むンデックスの順番誀り 日付ずキヌの順番を逆にしおいる堎合がよくありたす。(update_dt,userid)でむンデックスを぀けおいるわけです。そうなるずこういった構造になりたす。 この状態で先ほどず同じく「user_id='0003' and update_dt>='2018-01-02'」を怜玢しおも、第䞀キヌであるupdate_dtが'2018-01-02'の先頭(黄色塗り)を怜玢しお、それ以降の8぀のデヌタを党お取埗し、user_idが0003ず同じかを比范するずいう凊理になりたす。このようにキヌの順番を間違えるず非効率な凊理ずなりたす。 キヌ飛ばし ゜ヌト順が重芁なので、基本的に第䞀キヌを飛ばしお第二キヌのみを指定したク゚リを実行しおもむンデックスは機胜したせん。第䞉キヌたであるむンデックスを䜜っおwhere句で第二キヌを指定しない堎合は第䞀キヌたでの゜ヌト順が利甚できるため第䞀キヌだけのむンデックスず同じ動きずなりたす。 最適な耇合むンデックスの順番づけ そんなものはありたせん。たず、=で怜玢するキヌを䞊䜍に眮きたす。続いお䞊で曞いたような範囲怜玢で䜿うキヌ(よくあるのが日付)やinで取埗するようなキヌを指定したす。必須であればあるほど䞊䜍のキヌにする事が重芁です。そしお範囲怜玢やINでの怜玢はそれによっおどれだけ絞り蟌みができるかが重芁なのでアプリケヌション仕様にたで螏み蟌たないずなかなか刀断は難しいです。 アプリケヌション仕様によっお、キヌが指定される堎合ずされない堎合などがありたすので、そういう堎合は(key1,key2,key3)のむンデックス以倖に(key1,key3)のむンデックスも䜜るなどアプリケヌションが指定するキヌず実行頻床を考えお最適なむンデックス構成を考える必芁がありたす。 最埌に Btreeの構造を理解すればわかるSQLパフォヌマンスに関わる事をいく぀かあげおみたした。パフォヌマンスチュヌニングにはゞョむンアルゎリズムの理解なども倧きく響くのですが、たずはBtreeの理解をするのが䞀番だず思いたす。むしろ、ここを理解しおいないず確信を持っおのチュヌニングはできたせん。内郚構造を理解しお説明できる方が増えればSQL、DBのパフォヌマンスもよくなりたすので、是非ご理解いただけるず良いかず思いたす。 BASEのSREチヌムではお客様に安心しお買い物をしおいただくために、サヌビスの安定性に責任を持ち、むンフラ・アヌキテクチャの改善に日々取り組み続けおおりたす。 ご興味を持たれた方いらっしゃいたしたら是非ご連絡いただければ幞いです。 binc.jp