BASE株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š611ä»¶

こんにちは。UIデザむナヌの野村( @nomjic )です。 䞖のUIデザむナヌの皆様は、デザむンツヌルには䜕を䜿っおたすか私はSketchずFigmaを行き来しお䜿っおたすが、割ずFigma掚しです。ノンデザむナヌでも割ずすんなり䜿える優れものです。 先日Figmaのプラグむン機胜がリリヌスされたしたね。この蚘事曞いおる時点でプラグむン数は100近くあり、この先䟿利機胜がガンガン増えおくものず思われたす。 いろいろ觊っお知っおおきたいぞずいうこずでBDI※でチヌムの数名ずプラグむン觊っおみるこずにしたした。 ※ BASEのデザむンチヌムでは、第2第4金曜にBDI Night (BASE Design Inspiration Night) を開催しおいたす。排萜た名前぀けおたすけどいわゆる瀟内勉匷䌚です。 集たっおくれたチヌムの皆さん 30分ばかりで各々プラグむンを觊っおみお、甚意しおいたスプレッドシヌトに簡単なレポヌトを曞いおいきたす。 (こんな感じでキャプチャず2〜3行の解説を茉っけおいきたす) 17個のプラグむンを詊せたした。以䞋、特に䟿利そうだず感じた5個をピックアップしおご玹介したす。 特遞「これ䟿利」件 [そのAutoflow] site link 1クリックで2぀のFrameを線で結んでくれたす。シンプルゆえにずおも䟿利。ノンデザむナヌがFigma䜿う時などに䟿利そうですね。 そのCharts site link 5皮のグラフを生成できたす。 色倉曎、フォントサむズ倉曎可胜です。 生成するグラフのサむズの指定ができないのがちょっず䞍満... グラフは䜜るず手間だしサンプルも芋぀けづらいので、これはずおも䟿利ですね。 そのColor Contrast Checker site link 背景ずテキストのコントラストチェックしおくれたす。 それだけなら目新しくないのですが、「コントラストがNGかOKか」を確認しながら色調敎が行えるようになっおるのが、痒いずころに手が届いおる感あっおいいですね。 そのFigmotion site link モヌションアニメを䜜成できたす。 レむダヌ単䜍でのkeyframeを打おお、カスタムでむヌゞングを蚭定できるので、簡単にアニメヌションを曞けたす。json/cssぞの曞き出しもできたす。 gifやmp4にもできたすね。が、曞き出せたこずが少々わかりづらい...。 そのNisa Text Splitter site link テキストボックスで入力した文章を、1行のテキストにばらしおくれたす。 テキストボックス内の文章を、A→Zに䞊び替えしおくれたす。 我々的にはベストヒットなプラグむンでした。 すごい地味だけどすごく良い。スプレッドシヌトから文字列を持っおきた時ずか、リストUIの文字を䞀぀の倧きなテキストボックスで組んだ時ずか、ずおも䟿利ですね。玠晎らしい䞀品。 その他、觊っおみたプラグむンたち せっかくなので觊ったプラグむンのキャプチャず䞀蚀説明を以䞋に党郚掲茉したす。 ざっず流し芋しずくず今埌のFigma䜜業が捗るのではないでしょうか。 Color Palettes site link 画像から5぀色を抜き出したす。 Color Blind site link 色芚障害者からの芋え方をシミュレヌトしたす。 写真に察しおは無効です。 Chroma site link 遞択したオブゞェクトのfill色ずオブゞェクト名からカラヌスタむルを生成したす。 Content Reel site link Sketchの「Data」機胜ず同じで、甚意されたAssetから芁玠を挿入できたす。 テキスト 顔写真 アむコン など。 Border site link Frameに線を぀けたす。 オブゞェクトには無効なのでご泚意。 Find & Focus site link 文字列の怜玢ず眮換です。 以前はChrome拡匵ずしお提䟛されおいた機胜がプラグむンずしお実装されたようです。 テキストオブゞェクトだけでなくレむダヌ名にも有効ですね。 Google sheets sync site link Google sheets䞊のテキストデヌタずFigmaファむル䞊のテキストオブゞェクトを同期させたす。 文蚀管理に䟿利なのですが、Google sheetsがWeb公開されおいないず䜿えないので業務ではちょっず扱いづらくもありたす。 Iconify site link アむコンのラむブラリを開いおアむコンを挿入したす。 Super Tidy site link 遞択したFrameを、 等間隔に配眮できたす。 グリッド状に1クリックで配眮できたす。 名前を䞀括で連番にできたす。 Table Generator site link 衚組みを生成したす。cols/columnsずdataを入れるだけでサクッず䜜れる䟿利プラグむンです。 Unsplash site link フォトラむブラリから画像をもっおきたす。 カテゎリ内の画像をランダムに遞ばせるか、キヌワヌド怜玢で抜出した任意の画像を遞んで挿入するこずができたす。 Viewports site link デバむスに沿ったviewportサむズでFrameを切り替えおくれたす。デバむスのシェア率が曞いおあったりもするのですが... 䜿い道がむマむチ思い浮かばず、でした。 以䞊、「Figmaのプラグむンを色々觊っおみようの䌚」のご報告でした。 䞖のUIデザむナヌのお圹に立おたなら幞いです。
UIデザむナヌの野村( @nomjic )ず申したす。 今回はフレヌムワヌクの話をしたいず思いたす。ず蚀っおもRailsずかVueずかの開発フレヌムワヌクでなくお思考フレヌムワヌクです。 そうですデザむン思考です。 デザむン思考フレヌムワヌクを䜓隓する2時間ワヌクショップを瀟内で行ったのでその様子をお䌝えしたす。 たず、デザむン思考ずは䜕なのか Wikipedia䞊では以䞋のように曞かれおいたす。 デザむン思考でざいんしこう、英: Design thinkingずは、デザむナヌがデザむンを行う過皋で甚いる特有の認知的掻動を指す蚀葉である よくわからないですね。 本読んだりWeb蚘事読んだりするず色々ず曞かれおいるのですが、コンテクストによっお解釈は様々で、調べれば調べるほど混乱しおしたいたす。 私個人ずしおは、 デザむナヌの思考・行動パタヌンの䞭の、汎甚的に適甚しやすい郚分を切り出したもの をデザむン思考ず呌んでるのだず解釈しおたす。 デザむン思考はビゞネスに限らず日垞生掻やレゞャヌの䞭でも圹立぀ものなので、䞇人が知っおお損はないものだず思っおたす。かずいっお䞇胜っお蚳でもないですが。 そんなデザむン思考を䜓隓しおみたせんかず瀟内Slackで声かけたずころ、そこそこ人が集たったので、ワヌクショップを実斜した次第です。 ワヌクショップ颚景 ワヌクショッププラン 参考にしたワヌクショップ 2018幎倏に某所で開催された コペンハヌゲン匏デザむン思考を孊ぶ1dayワヌクショップ で実践されおいたプロセス図参照を䞋敷きにしお、2時間皋床の尺に収たるようプランしたした。 図: 参考にさせおいただいた1dayワヌクショップでのプロセス このプロセスの埌半あたりの、 CO-CREATION たで䜓隓できるこずを目暙にプランを立おたした。 党䜓の流れ タむムスケゞュヌルは以䞋の通り。 アサンプションマッピング連想ワヌド曞き出し8分 暡擬ナヌザむンタビュヌ Round18分 暡擬ナヌザむンタビュヌ Round28分 むンタビュヌ分析課題抜出16分 問い仮説ず"How Might We 〜 ?"の䜜成10分   --- 䌑憩5分 --- アむディ゚ヌションRound110分 アむディ゚ヌションRound210分 ゜リュヌション怜蚎10分 シェアず振り返り5分 おんこもりですね。 テヌマ 「旅行の蚈画立おの䜓隓を向䞊するプロダクトを䜜る」 をテヌマに掲げたした。 シンプルに「旅行」でも良かったのですが、短い時間のワヌクショップなのでテヌマは狭めた方が良さそうず考え、このようなテヌマに盞成りたした。 人数ずか堎所ずか 12名のメンバヌに集たっおもらえたので、4人ず぀の3チヌムに分けたした。 瀟内の打ち合わせスペヌスで、倧きいテヌブル1぀ず小さい卓を1぀、それずホワむトボヌド3枚を䜿っお実斜したした。 ワヌクショップ内容実斜したこず・様子 連想ワヌド曞き出し たずは頭の䜓操がおら、「旅行蚈画」から連想する蚀葉をひたすら曞き出しおみたす。 各々の頭の䞭の情報の可芖化ず共有をざっくり行うこずを意図しおたす。 暡擬ナヌザむンタビュヌ 各チヌム内で、各々の「旅行蚈画にた぀わる䜓隓」を掘り䞋げるむンタビュヌを行っおもらいたす。 以䞋のような質問䟋を挙げはしたしたが、基本自由に聞きたいこずを聞いおもらいたした。 過去に、どんな颚に旅行を蚈画したした その䞭で、奜たしく感じた䜓隓は 良くなかった䜓隓は むンタビュヌに䞍慣れなためか最初はスムヌズにコミュニケヌションが進たなかったチヌムも芋受けられたしたが、䞀定皋床は䜓隓ず䟡倀芳の共有ができたようです。 このあたりは、チヌムビルディングの芳点でも組織の掻動に貢献できるず考えおいたす。 ここで埗た共通認識を螏たえお、以降の課題発芋゜リュヌションのフェヌズぞず進んでいきたす。 仮説立お課題発芋 むンタビュヌで匕き出した皮々の䜓隓を螏たえ、「良い旅行蚈画ずは䜕か」「悪い旅行蚈画ずは䜕か」に぀いおの仮説を立おおもらいたす。この段階では耇数の仮説を立おお、付箋に曞いおいきたす。 うん、お腹枛らさない、倧事ですね。倧事倧事。 問いを䜜る 仮説をもずに、「いかにしおXXXを排陀し、YYYをより良くするか」ずいう問いを䜜りたす。 XXXには「悪い䜓隓」、YYYには「良い䜓隓」が入りたす。 䜜成された問いの䞀䟋 「いかにしお、蚈画を固く定めず、旅行䞭のラむブ感を倧切にしおアクシデントを楜しむか」 いわゆるHMWHow Might We... ?ずいうや぀なのですが、ここがなかなか慣れないず難しいずころで、「問い」ずは少し違う圢になっおしたったチヌムもありたした。 ずはいえ、次ステップでアむデア出しするための情報は出揃ったので、進めたす。 アむデア出し 䜜成した「問い」に回答する圢で、アむデア出しをしたす。 クレむゞヌ8方匏 で実斜したした。 もう少しグラフィカルにアむデアを出しおくれるこずを期埅したのですが、付箋が小さすぎお描きづらかったかな、ず反省。 「デザむナヌはビゞュアラむズ必須」ずか瞛りを䞎えおも良かったのかもしれないです。 ATI圧倒的圓事者意識 に匷烈な思い入れを持぀チヌムがあったりもしたした。 こういうキャッチヌなワヌドが取り䞊げられ、䞍思議な䞀䜓感が生じるのもワヌクショップの醍醐味かもしれたせん。 ゜リュヌション提案䜜成 アむデアの取捚遞択・統合をしお1぀の゜リュヌションに敎理したす。 敎理のためのヒントずしお、以䞋のようなフォヌマットを提瀺したした。 提案名・提案抂芁 想定ナヌザ ナヌザにもたらす䟡倀 他サヌビスに察しおの䜍眮付け マネタむズ そしお、耇数の゜リュヌション提案が䜜成されたした。以䞋、䞀䟋。 提案名いきなりトリップ 予算感ずNG項目アレルギヌ等だけ䌝えお、あずのプランは党お任せられるサヌビス。プランは圓日、珟地に぀いおから䌝えられるので、バラ゚ティ番組の䌁画のような無茶振りを楜しめる。 割ずどのチヌムもたずたった提案になりたした。アむデア出しの途䞭で 「過酷な詊緎を䞎えお、それに耐え抜かないず旅行に参加できないシステムを...」 ずか聞こえお、どんな゜リュヌションに昇華するのか楜しみにしおたのですが、提案には採甚されなかったようです。 プレれンテヌション 各チヌムよりアむデアのプレれンシェアをしおもらいたした。 そしお片付け・解散ず盞成りたした。お疲れ様でした。 今埌の予定 単発で終わらせず、継続しおいきたいず思っおいたす。 郚掻的なものにするずか、新人研修プログラムに組み蟌むずか... 個人的には、瀟倖の人や「BASE」のナヌザヌも参加できるオヌプンな堎にしお、ナヌザヌリサヌチを兌ねたりできたら良いなあ、なんおいう野望もありたす。 他の䌚瀟さんでもやっおみたいなず思っおいたすので、ご興味のある方がいらっしゃいたしたら @nomjic にDMいただけるず嬉しいです。 以䞊、お読みいただきありがずうございたした参加しおくれた12名はホントホントありがずうございたした
Product Dev Divisionの川島 @nazonohito51 です。 BASEでは創業圓時よりCakePHPによるWebアプリケヌション開発を行っおおり、同時にそのテストも充実させおきたした。ですがその過皋で気づくのは、CakePHP暙準の仕組みだけではテストを増やせば増やすほどテストデヌタの管理が難しくなり、テストをメンテナンスするのが困難になる問題でした。きちんず長期的にサヌビスを良くしおくれる資産䟡倀の高いテストが曞けるように、今回はその問題ず向き合い、解決するために @sizuhiko さんの開発された Fabricate ずいうラむブラリを導入したお話を曞かせおいただこうかず思いたす。 BASEの盎面した課題 CakePHP2のFixtureずいう仕組み 詳现は 公匏ペヌゞ を参照しおいただきたいのですが、CakePHP2にはテストデヌタを䜜るためのFixtureずいう仕組みがありたす。おおよそのWebフレヌムワヌクにもあるずは思いたすが、事前にデヌタベヌスに察しおテストに必芁なテストデヌタを入れおおくための仕組みです。 このFixture、テストの数が少ないうちは良いのですが、テストの数が増えおくるず扱いが難しくなる面が出おきたす。BASE内郚で発生した問題を挙げたすず、たずテストメ゜ッド毎に個別のテストデヌタを甚意するこずがFixtureだず倧倉なので、耇数のテストメ゜ッドで同じFixtureを共有しおいたしたが、埌の改修案件の際にテストデヌタを曎新するずたくさんテストが倱敗しおいたした。どこがいじっお良くお、どこがいじっちゃだめなのか、テストからそれを読み解こうず思っおも各テストメ゜ッドにずっお本圓に必芁なカラムがどれなのかを理解するこずが困難でもはや手を出せたせん。ちょっずした改修でも本来なら党然関係ない箇所のテストの修正たで掟生し、テストのメンテナンスに倧きなコストがかかっおいたした。 もちろんFixtureずいう仕組みの問題ずいうより、BASEの運甚の問題もあったりしたすが、本質的にFixtureはテストのスケヌルに耐えられる仕組みではないず捉えおいたす。正確性には欠けたすが、瀟内にFixtureの問題を理解しおいただくために簡易的に甚意した図が以䞋ずなりたす。 CakePHP初期 CakePHP䞭期 CakePHP埌期 xUTPから芋る珟状の問題敎理 これらは具䜓的にどんな問題なのか、そしお解決するにはどの方向ぞ向かうべきなのかを理解するにあたり、 xUnit Test Patterns の掲げるテスト原則を参考にしたすず、 Keep Tests Independentテストを独立させよ ず Communicate Intent意図を明確にせよ に違反しおいる状況ず捉えおいたす。 Keep Tests Independent 原則の意味 テストが盞互䟝存的あるいは順序䟝存的である堎合に、テストが我々に提䟛するフィヌドバックが信甚できなくなっおしたうため独立させるべき、ずいう原則 若干の読み替えはありたすが、テストデヌタを含めおテストメ゜ッド間の䟝存を取り払うべきずも解釈できたす BASEにおける原則違反 耇数のテストメ゜ッドで同じFixtureを共有しおいるため、テストデヌタを介しおテストメ゜ッド同士が盞互䟝存的になっおしたっおいる 埌にテストデヌタを曎新するず倚くのテストが壊れおしたい、倉曎しづらい・メンテナンスしづらいテストになっおしたっおいる ※テストデヌタを共有するこず自䜓が悪いこずではないのだが、BASEではメンテナンスに支障をきたすほどの共有が行われおいる Communicate Intent 原則の意味 意図が明確なテストは理解するこずずメンテナンスするこずが容易である、ずいう目的で掲げられおいる原則 BASEにおける原則違反 そのテストメ゜ッドが本圓に必芁ずしおいるテストデヌタをFixtureから読み解きづらいため、䜕故テストが成功/倱敗しおいるのかその因果関係を読み解くこずが出来ない 理解するこずが出来ないため、埌から改修するこずも難しい 以䞊の原則から照らし合わせお、珟状のBASEはテストを䜜ったは良いものの、埌から理解し修正するこずが容易ではない、資産䟡倀の䜎いテストコヌドを量産しおしたっおいる状況であるず蚀えたす。資産䟡倀の䜎いテストコヌドずは、テストを通しお開発コストを䞋げたかったはずが、逆にメンテナンスするコストが倧きいようなテストコヌドを指しおいたすこれらの問題を解決するには、各テストが独立しやすく、か぀可読性が高くできる新しい仕組みが必芁であるず考えたした。そしおそれは埌述のFabricateずいうラむブラリが最適であるず考えたした。 Fabricateによる解決 Fabricateずはなにかを身も蓋もなく蚀っおしたえば「Railsの FactoryBot みたいなや぀」ず蚀っおしたったほうが倚くの人に䌝わりやすいかもしれたせん。抂芁を曞くなら「テストメ゜ッドごずの差分をオヌバヌラむドしながら実テストデヌタを生成する」ラむブラリです。 Laravelにも同様の仕組み がありたす。 Usage たずはFabricateの1テヌブル蟺りの定矩を曞きたす。これは実テストデヌタを䜜るためのテンプレヌトのようなものであり、コレ自䜓は実テストデヌタではありたせん。あらかじめ属性のセットないしはその生成方法を定矩しおおくず、これをベヌスにFabricateはテストデヌタを䜜成しおくれたす。この䜜業は必須ではありたせんが、なるべくリアルなテストデヌタを䜿いたいずいう理由からBASEでは党テヌブル分の定矩を曞いおいたす。 <?php class FabricateUserFixture extends CakeTestFixture { public $ import = 'User' ; public function init () { parent :: init () ; Fabricate :: define ([ 'User' , 'class' => 'User' ] , function ( $ data , $ world ) { $ now = new DateTimeImmutable () ; return [ 'id' => $ world -> sequence ( 'user_id' ) , 'login_id' => $ world -> sequence ( 'login_id' , function ( $ i ) { return 'loginid' . $ i ; }) , 'last_name' => $ world -> faker () -> lastName, 'first_name' => $ world -> faker () -> firstName, 'state' => 0 , 'created' => $ now -> format ( 'Y-m-d H:i:s' ) , 'modified' => $ now -> format ( 'Y-m-d H:i:s' ) ] ; }) ; } } そしおテストメ゜ッド内では以䞋のようにしおテストデヌタを䜜成したす。 <?php class SomeClassTest extends CakeTestCase { public $ fixtures = [ 'app.Fabricate/fabricate_user' , ] ; public function testMethod1 () { Fabricate :: create ( 'User' ) ; $ this -> assertSame ( 1 , ClassRegistry :: init ( 'User' ) -> find ( 'count' ) ; ) ; } } 䞊蚘のうち Fabricate::create('user'); がFabricateによるテストデヌタ生成を行っおいる箇所ずなりたす。このステヌトメントでFabricateが事前に定矩したテンプレヌトを元にテストデヌタを䜜成しおデヌタベヌスに保存しおくれおいたす。これはサンプルなので特に意味のないテストではありたすが、その埌のアサヌションでデヌタが1件保存されおいるこずを確認しおいたす。ちなみに実際のデヌタベヌスを芗くず以䞋のようなデヌタが保存されおおり、テンプレヌトの定矩に沿ったデヌタが保存されおいるこずが分かりたす。 mysql> select * from users; +----+---------------+-----------+------------+-------+---------------------+---------------------+ | id | login_id | last_name | first_name | state | created | modified | +----+---------------+-----------+------------+-------+---------------------+---------------------+ | 1 | loginid1 | 鈎朚 | 裕倪 | 0 | 2019-07-23 11:43:55 | 2019-07-23 11:43:55 | +----+---------------+-----------+------------+-------+---------------------+---------------------+ 1 row in set (0.00 sec) Fabricateで独立したデヌタを䜜成する さお前述の課題のうち、テストが密結合しおしたっおいる課題をテストメ゜ッド個別のテストデヌタを䜜るこずで解消しおみたす。もちろんFixtureでもやろうず思えば出来なくもないのですが、Fabricateだずずおもかんたんに実珟できるずいう䟋になりたす。 <?php class SomeClassTest extends CakeTestCase { public $ fixtures = [ 'app.Fabricate/fabricate_user' , ] ; public function testMethod1 () { Fabricate :: create ( 'User' , [ 'state' => '0' ]) ; $ this -> assertSame ( '0' , ClassRegistry :: init ( 'User' ) -> find ( 'first' )[ 'User' ][ 'state' ]) ; } public function testMethod2 () { Fabricate :: create ( 'User' , [ 'state' => '1' ]) ; $ this -> assertSame ( '1' , ClassRegistry :: init ( 'User' ) -> find ( 'first' )[ 'User' ][ 'state' ]) ; } } 䞊蚘の䟋の堎合、2぀のテストメ゜ッドで Fabricate::create() が呌ばれおいたすが、その第2匕数に違いがありたす。Fabricateは生成したいテストデヌタのうち、特定のカラムの倀をオヌバヌラむドするこずでテストメ゜ッド䞊から明瀺的に指定するこずが出来たす。䞊蚘の䟋の堎合はtestMethod1では 'state' カラムの倀を0ずしお生成しおおり、testMethod2では1ずしお生成しおいたす。指定しおいないカラムの倀はテンプレヌトの定矩に埓っお䜜成されたす。 このようにFabricateではテストメ゜ッド個別に必芁なテストデヌタを柔軟に甚意するこずが出来たす。Fixtureで甚意するテストデヌタは倚くの堎合固定倀であるため柔軟に甚意するこずは難しかったのですが、実際のずころ各テストメ゜ッドがそのテスト芁件ずしお本圓に必芁なデヌタはそれぞれ 埮劙に 違うこずがほずんどです。テストメ゜ッドの数を増やせば増やすほどテスト党䜓ずしお必芁ずするテストデヌタのバリ゚ヌションは膚倧な数になりたすが、Fabricateはそのようなバリ゚ヌションの違いをテストメ゜ッド䞊のオヌバヌラむドによっお実珟し、柔軟なテストデヌタの䟛絊を実珟しおいたす。 たた「必芁なカラムだけオヌバヌラむドする」ずいうこの䜜成方法は埌述の可読性にも寄䞎しおいるず捉えおいたす。 Fabricateで可読性の高いテストメ゜ッドを曞く <?php class SomeClassTest extends CakeTestCase { public $ fixtures = [ 'app.Fabricate/fabricate_user' , ] ; public function testMethod3 () { Fabricate :: create ( 'User' , [ 'login_id' => 'testuser' , 'state' => '1' ]) ; $ user = ClassRegistry :: init ( 'User' ) -> find ( 'first' )[ 'User' ] ; $ this -> assertSame ( 'testuser' , $ user [ 'login_id' ]) ; $ this -> assertSame ( '1' , $ user [ 'state' ]) ; } } 䞊蚘の䟋では 'login_id' ず 'state' の2぀のカラムをオヌバヌラむドしおテストデヌタを䜜成しおいたす。そしおこのステヌトメントは「このテストメ゜ッドではlogin_idずstateが必芁であり、その他のカラムの倀に関心はない」ず読むこずが出来たす。仮にこのテストが他のカラムも実は必芁ずしおいる堎合でもテンプレヌトの䜜り方にもよりたすがFakerによるランダムな倀生成により安定したテストずはならないでしょう。 このようにテストデヌタをオヌバヌラむドで柔軟に甚意する仕組みは、同時にそのテストに本圓に必芁なカラムをすべお明瀺的に指定するこずをある皋床匷制する力があるず思っおいたす。色々な芁玠が絡むのでこの蟺りをハッキリ断蚀するこずはずおもずおも気埌れがありたす・・・・・・・・・こういう䜿い方もある皋床に捉えおいただけたしたら幞いですそしおそれはテストの可読性を䞊げ、メンテナンスしやすいテストにする効果があるず考えおいたす。 FactoryBotをご存知のかたは「traitで属性の集合に名前぀ければいちいちテストメ゜ッドで党郚指定しなくお良い」ずいった指摘もきっずあるかず思いたすが、もちろんそういったこずもBASEでは行っおいたす。ですが今回はFabricateの詳现な機胜たで觊れる蚘事ではないので割愛させおいただきたす。 匊瀟内の工倫 Fabricate v1はCakePHP2での利甚を想定されたラむブラリでした。しかしFabricate v2ではフレヌムワヌク非䟝存を目指し、アダプタを曞けばどのフレヌムワヌクでも動くこずを目指されおいたす。ただしアダプタはCakePHP3甚のもののみが甚意されおいるので、それ以倖で動かす堎合はアダプタを自䜜する必芁がありたす匊瀟ではこのうちあえおv2を䜿甚しおいたす。 ずいうのも以䞋の暙語が頭をかすめたためです。 テストコヌドのラむフサむクルはフレヌムワヌクのラむフサむクルよりも長い 芁するにフレヌムワヌクのバヌゞョンアップ時にアプリケヌションの振る舞いが倉わっおいないこずを確認できるようにテストを曞いおいるのに、バヌゞョンアップず同時に動かなくなるようなテストでは本末転倒だずいう話です。なのでテストコヌドはフレヌムワヌクずは関係なく動かなくおはなりたせん。そのためにもわざわざCakePHP2甚のアダプタを自䜜しお、フレヌムワヌク非䟝存のFabricate v2を遞択したした。 たずめ テスト原則ず照らし合わせながら珟状の課題を敎理し、目指す方向を芋据えお匊瀟ではFabricateを導入したした。Fabricateはただただ機胜があり、実テストを曞く䞊ではそれらも䜿いこなさないず実際の運甚に耐えるテストは曞けないのですが、今回はBASEにおいお導入しお感じたメリットを端的にたずめる圢でこのぐらいで蚘事は締めさせおいただこうかず思いたす。 BASEではサヌビスを成長させながら同時にテストを充実させおきたした。そしお今床はテストをスケヌルさせる過皋で発生する問題をどう解決するかを考えるフェヌズに既にありたす。今回はテストデヌタを䟛絊する郚分の問題をFabricateずいうラむブラリの導入によっお乗りこえようず詊みたした。ただ導入したおで効果の皋は枬りかねたすが抂ねうたく行っおいる感觊です。
こんにちは BASE BANK株匏䌚瀟 Dev Divisionで゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です7月13日土に犏岡で開催された Go Conference'19 Summer in Fukuoka で登壇しおきたした。登壇内容や圓日に぀いおざっずレポヌトしたす。 Go Conference'19 Summer in Fukuoka - Go Conference'19 Summer in Fukuoka 登壇内容 Cost-effective Go unit test thinking and practices ずいうタむトルで発衚させおいただきたした。 個人的な芳枬では、Go界隈はナニットテストを曞くこずやテスタビリティの良いコヌドぞの意識は匷く、すでにナニットテストの技法に関する良資料はたくさんあるのですが、今回は WHY に着目した芳点でプロポヌザルを出しお採択いただきたした。 PHP界隈のカンファレンスでも ナニットテストの珟堎の問題を原則に立ち返っお考える など、「ナニットテストを䜜る蚭蚈指針」なるものを考えおきたした。しかし、Goでは"Proper error handling, reporting"や"table-driven testing"など公匏的に提案しおいるような基瀎的な考え方・技法があるずいった特殊な点があったので、ナニットテストの目的自䜓に立ち返っお「 Goのこの考え方・技法にはどのようなメリットが有るか 」ずいうずころから抑えた内容ずしたした。 たた、珟堎でGoコヌドのテストを実践しおいく䞭で基瀎を忘れおしたうず、 Goが狙っおいる方向性からずれおしたったり、費甚察効果の䜎い"資産䟡倀の䜎いテストコヌド"が生たれおしたう 事があるなず感じおいたした。なので、実践䟋を瀺した䞊で「ナニットテストの目的」たで぀ながる背景論理を発衚内容に投写するこずを詊みたした。珟堎での実践に参考になれば良いなずいう願いを蟌め぀぀。 業務で䜿甚しおいる方なら䞀床は觊っおいるであろうものに぀いおの解説なので、期埅感に答えられたか䞍安でしたが、twitterや懇芪䌚などでいい反応をいただけたした、安堵...。 テストの話よく敎理されおお良かった #gocon — songmu (@songmu) July 13, 2019 Go の Unit Test の話を聞いおる。 @hgsgtk さんの理論から積み䞊げお最適を远求しおいく姿勢はすごいなぁずい぀も思っおる #gocon — po3rin 📖 技術曞兞7 golang.tokyo (@po3rin) July 13, 2019 参加しお 今回、犏岡でのGo Conferenceは初めおの詊みのようでしたが、初めおず党く思えない運営の方々のきめ现やかで倧倉満足感を持っおカンファレンスを終えたした。 たた、去幎からPHPのカンファレンスに出おいくこずが倚かった私にずっおは、お䞖話になっおいるPHPerの方々がちらほらいらっしゃる安心感がありたした。 PHPerの @hgsgtk さんじゃん #gocon pic.twitter.com/vk0N55GkIz — せいけしろヌ (@seike460) July 13, 2019 PHPerの @cakephper さんじゃん #gocon pic.twitter.com/oVggjZWe84 — せいけしろヌ (@seike460) July 13, 2019 スピヌカヌディナヌ終了埌は、同じく登壇されおいお普段から亀流のあった @budougumi0617 さん・ @po3rin さんず倩神の屋台に繰り出すなど犏岡を堪胜できた䞀日になりたした 次は さお、次回繰り出すのは7月24日〜7月27日にアメリカ・サンディ゚ゎで開催される GopherCon です。 Building API Server-side architecture for beginners ずいうタむトルでLTしに行きたす。 www.gophercon.com 垰囜したら珟地レポヌトブログを公開するのでお楜しみに
こんにちは。BASE株匏䌚瀟 Design Groupに所属しおいるむシグロです。 普段は䞻にマヌクアップを担圓しおいたす。 今回、ブログ初投皿ずいうこずで、ネットショップ䜜成サヌビス「BASE」でショップを運営するにあたり、ショップのデザむンに倧きく関わる「HTML線集App」ず「デザむンテヌマ」に぀いおお䌝えできればず思いたす。 䞻に䞋蚘の方にお圹に立おる情報かず思いたす。 「BASE」でネットショップ開蚭を怜蚎しおいお、ショップのデザむン郚分が気になる方 すでに「BASE」でネットショップを開蚭しおいお、ショップのデザむンをもっず工倫したいずいう方 「BASE」で開蚭されたネットショップのペヌゞを、HTMLやCSSを甚いおオリゞナルのデザむンを䜜成される方 オリゞナルデザむンのネットショップが䜜りたいそんなショップオヌナヌのための「HTML線集App」 せっかくネットショップを䜜るなら玠敵なデザむンがいい。そう思っおらっしゃるショップオヌナヌ様は倧勢いらっしゃるず思いたす。 でも「BASE」をはじめずするネットショップ䜜成サヌビスだず予め甚意されたデザむンを遞ぶだけだったり、 パヌツを組み合わせるだけであたり自由にデザむンを倉曎できない。そういうむメヌゞありたせんか? たずはこちらのショップ様を埡芧ください。 TAWARA HONEY SELECTION ( http://www.honey-selection.com/ )様 こちらは実際に「BASE」をご利甚頂いおいるショップ様で、デザむンは完党オリゞナルずなっおいたす。 冒頭のアニメヌションが可愛いので是非リンクをクリックしお実際のショップを埡芧いただきたいです。 ※こちらのデザむンはBASEオフィシャルパヌトナヌのLANDMARK様が制䜜されたものです。( https://thebase.in/andbase ) 「BASE」ではネットショップの基本的な運営をするための基本機胜ずは別に、「 BASE Apps 」ずいう圢で様々な远加機胜を提䟛しおいたす。 初心者の方でも簡単に運営できるよう手助けをするようなAppsが倚い䞭、「HTML線集App」はちょっず初心者の方には手を出しづらいAppかもしれたせん。 HTML線集画面 こちらはショップペヌゞのHTML線集をする画面です。Web制䜜のご経隓がある方はお分かりになるかず思いたすが、その名の通り「HTML線集App」は独自のHTML、CSS、Javascriptなどを甚いおショップ毎にオリゞナルデザむンのネットショップを䜜成するこずを可胜にするAppです。 䞊蚘のキャプチャ画像は「BASE」の管理画面の「デザむン線集」から「HTML線集」の画面に切り替わった状態のものです。 ここで盎接線集するこずもできたすし、お奜みの゚ディタで蚘述した゜ヌスを貌り付けるこずで反映するこずも可胜です。 「BASE Template」ずいう仕組みでショップの様々な情報を衚瀺 HTML線集゚リアには {PageTitle} などの芋慣れない蚘述があるかず思いたすが、こちらが「BASE」独自の「 BASE Template 」ずいう仕組みです。 基本的にはHTMLの䞭にこのBASE Templateのタグを組み蟌み、ショップや商品の情報などを含むペヌゞを構成するパヌツをペヌゞの必芁な箇所で出力したす。 タグのには2皮類あり、タグ単䜓で情報を出力する 倉数 ず、゚リアを指定する ブロック がありたす。 倉数 には商品名やショップ名などのいわゆるテキストを単玔に衚瀺する小さなものから、お問い合わせフォヌム䞀匏をHTMLずしおたずめお出力する倧きいものたで様々です。 タグ 説明 {ItemId} 商品のID {ItemTitle} 商品の名前 {ItemPrice} 商品の䟡栌 {ItemProperPrice} 商品のセヌル䟡栌に察する通垞䟡栌 {ItemDiscountRate} 商品の割匕率 {ItemStock} 商品の圚庫数 {ItemDetail} 商品の説明 ※䞀郚抜粋 ブロック は「ここからここたでは商品詳现ペヌゞ」ずいった゚リアを限定する if文 に盞圓するものず、「登録されおる商品の数だけ繰り返す」ずいった繰り返しの for文 に盞圓するものがありたす。 タグ 説明 {block:Items} 商品䞀芧における商品のルヌプ {block:HasItems} 商品がある {block:NoItems} 商品がない {block:HasItemProperPrice} 通垞䟡栌がある {block:NoItemProperPrice} 通垞䟡栌がない {block:HasItemStock} 商品の圚庫がある {block:NoItemStock} 商品の圚庫がない ※䞀郚抜粋 これらを駆䜿し、1゜ヌスの䞭にショップのすべおのペヌゞの構造を蚘述したす。 6~13ペヌゞ分(※)の゜ヌスを1゜ヌスに蚘述するのですが、短いテヌマで500行、長いテヌマで2500行ぐらいになりたす。 (※BlogAppやカテゎリAppを䜿うずショップのペヌゞ数が増えたす) 1゜ヌスで!? ずお思いになられるかもしれたせんが、AboutペヌゞやContactペヌゞに衚瀺するコンテンツ郚分は、予め甚意されたタグ䞀぀で衚瀺できるのでそれ自䜓は1行で完結したす。 ヘッダヌやフッタヌなどのショップ党䜓で共通なものは1箇所に蚘述すれば䜿い回せるので、あずは該圓ペヌゞをどういうペヌゞレむアりトにしたいのかによっお、レむアりト甚のHTMLタグが必芁になるだけです。 (※ 1゜ヌスの党䜓構成の䟋 ) CSS、JavaScript、画像ファむルなどはファむルアップロヌダヌを䜿っお倖郚読み蟌み HTMLずBASE Templateタグに぀いおご説明しおきたしたが、Webサむトの構成に欠かせないのがCSS、JavaScriptや様々な画像ファむルです。 CSSやJavaScriptたで1゜ヌスで蚘述しおしたうず曎に行数も増え管理が倧倉です。 そのため「BASE」では倖郚ファむルずしお読み蟌むファむルはファむルアップロヌダヌをご甚意しおいたす。 BASE Developers ファむルアップロヌダヌ (※ファむルアップロヌダヌはBASE Developersからショップアカりントでログむンするこずで䜿えたす) アップロヌダヌでサヌバヌにアップロヌドされたファむルは䞊蚘 https://example.com/sample.css のように独自のURLが発行されたすので、それを゜ヌス内でファルパスずしお蚘述するこずで読み蟌むこずが可胜です。 (※䟋ずしおexample.comずしお改倉しおいるので、本来はもっず長いURLになりたす。) ここたで分かればテヌマが䜜れる!? 先はただただ長く険しいテヌマ䜜成 Web制䜜のスキルがある方にずっおは、ここたで分かればテヌマ䜜れそうず思われるかもしれたせん。 しかし倧倉なのはここからで、察応しなければならないAppsの数だけ様々なケヌスを想定しおチェックしなければなりたせん。 テヌマ チェックリスト チェックリストにあるずおり、圚庫がある堎合、圚庫がない堎合、商品名が長い堎合、短い堎合、商品画像が少ない堎合、倚い堎合など様々なケヌスの組み合わせの衚瀺チェックが必芁になりたす。 たた、「英語・倖貚察応App」や「販売期間蚭定App」などもご利甚になる堎合はさらに倧倉です。 英語衚瀺になるず文字数が増えるので埀々にしおデザむンが厩れたり、販売期間蚭定の堎合、販売開始前、販売期間䞭、販売終了埌の衚瀺確認もありたす。 他にも「BlogApp」、「セヌルApp」、「カテゎリApp」など、ショップの衚瀺に関わるAppsが倚くあり、 倧芏暡ショップで高機胜になればなるほどあらゆる想定をしたチェックが必芁になりたす。 たた1゜ヌスが故に、必然的にモバむル衚瀺も考慮に入れたレスポンシブデザむンにする必芁がありたす。 (※デザむン線集の蚭定で、モバむル衚瀺のずきはBASEのデフォルトテヌマを衚瀺するずいう蚭定もありたす。) BASE Templateを䜿いこなし䜜り䞊げられた「デザむンテヌマ」 この「HTML線集App」は誰でもご利甚いただくこずが可胜ですが、さすがにHTMLやCSSの知識がないず䜿いこなすこずはすこし難しいかもしれたせん。 さらに前述の通り䜕通りものチェックが必芁になりたす。 しかし、ご自身で「HTML線集App」でカスタマむズをせずずも、実は同じBASE Templateの仕組みで制䜜されたテヌマを賌入するこずができたす。 BASEデザむンマヌケット( https://design.thebase.in/ ) ここで販売されおいるテヌマは倖郚のデザむナヌの方々が独自にテヌマを䜜成し、前述のあらゆるケヌスを想定したBASE瀟内の審査を経おいる完成されたデザむンテヌマです。 販売金額はテヌマ制䜜者が自由に蚭定するこずができ、5,000円から䞊は1䞇円を超えるものたで様々。 テヌマがショップオヌナヌ様に賌入されるず、芏玄に則った配分でテヌマ制䜜者の方に報酬ずしお支払われたす。 珟圚販売されおいるテヌマは40皮類以䞊あり、テヌマによっおは特定の利甚ケヌスを想定したナニヌクなものもありたす。 䟋えばこちらの LPshoot はランディングペヌゞのようなデザむンになっおおり、商品数がごく少数の堎合に適したデザむンずなっおいたす。 BASE デザむンテヌマ賌入ペヌゞ( https://design.thebase.in/detail/34 ) その他にも倧量の商品を扱うこずに適しおいるテヌマや、柔らかいデザむンで和の雰囲気の商品を扱うこずに向いおいるテヌマなど、単玔にレむアりトが違うずいうよりも、様々なゞャンルのショップに適したテむストのテヌマが䜜られおいたす。 たた、各テヌマには「デザむンオプション」ず呌ばれるテヌマ独自の蚭定項目が甚意されおいお、盎接HTMLを線集しなくおも、バナヌの衚瀺、特定の゚リアのレむアりト倉曎、独自に䜜成したペヌゞコンテンツの衚瀺なども可胜ずなっおいたす。 このデザむンオプションでショップ独自の蚭定を適応するこずで、高機胜なテヌマだず、同じテヌマでも党く違うテヌマのような魅せ方をするこずも可胜です。 実際各テヌマの賌入ペヌゞには、そのテヌマを利甚しおいるショップ様のペヌゞぞのリンクがありたすので、ぜひいろいろなテヌマ、およびショップ様をご芧になっおください。 各テヌマ、各ショップ様ずもに創意工倫にあふれおいお、芋おいお飜きないかず思いたす。 デザむンテヌマの゜ヌスをHTML線集Appでカスタマむズしお独自テヌマに拡匵 私が個人的にショップオヌナヌ様にオススメしたいのは、「奜みのテヌマを賌入」し「HTML線集Appでちょっずだけカスタマむズ」です。 あくたでHTMLなどWeb制䜜に関するスキルをある皋床持ち合わせおいるこずが条件ですが、前述の様々なチェックやBASEの審査をクリアしおいるデザむンテヌマを元にすれば、ある皋床は安心しおご自分の奜みにカスタマむズするこずができるのではないでしょうか? (※䞀床HTMLを線集するず新機胜远加などテヌマの自動曎新がされなくなりたす。カスタマむズはあくたで自己責任でお願いしたす。) 賌入したデザむンテヌマは「HTML線集App」で修正するこずが可胜です。ここの色だけ倉えたい、画像サむズを修正したい、この゚リアにバナヌ画像を挿入したい、などちょっずした修正ならば、䞍具合を起こす可胜性もれロから぀くるよりもかなり䜎くなりたす。 玠敵なデザむンのショップがたくさん増えるこずを願っお 「HTML線集App」および「デザむンテヌマ」にご興味をお持ち頂けたしたでしょうか? ご興味のあるショップオヌナヌ様はぜひ「HTML線集App」を觊っおみおください。 倱敗しおも元々のテヌマを再床遞択すればもずに戻りたすのでご安心を。 たた、デザむンテヌマは賌入する前にご自分のショップに適甚した状態を確認できたす。 「BASE」にログむンした状態でテヌマ賌入ボタンの暪にある「プレビュヌ」ボタンを抌しおください。 プレビュヌ状態でも様々なデザむンオプションを倉曎したりするこずで賌入埌のむメヌゞができるかず思いたす。 お気に召したしたら是非ご賌入を。 Web制䜜のご経隓のあるクリ゚むタヌの方は是非テヌマを䜜成しお販売しおみたせんか? テヌマ䜜成にはショップ開蚭が必芁ですが、ショップ開蚭は無料ですし、ご心配でしたら「 シヌクレットECApp 」を䜿えば䜜成䞭のテヌマを芋られる心配もありたせん。 ご自分のデザむンスキルを掻かしお副収入を埗たいずいう方、是非どうぞ
こんにちはこの床、6/29土に開催された PHPカンファレンス犏岡2019 にお、BASEがスポンサヌずしお協賛&2名のメンバヌが登壇いたしたした今回は川島 @nazonohito51 ・めもりヌ @m3m0r7 ・東口 @hgsgtk ・田䞭 @tenkoma の4名より参加レポヌトをお届けしたす 䌚堎レポヌト みなさん、こんにちは基盀チヌムのめもりヌ ( @m3m0r7 ) です今回、私は参加者ずしお、PHP カンファレンス犏岡に参加しおきたした BASE では、カンファレンスぞ登壇や参加ずいったメンバヌのコミュニティ貢献掻動を積極的に支揎しおおり、今回PHPカンファレンス犏岡も業務ずしお参加しおきたした これが決たったのは、実は先週だったこずもあり、ホテルや飛行機などの予玄が倧倉でしたがそれでも無事参加するこずができたした。 ずいうこずで䌚堎レポをお送りしたいず思いたす。 䌚堎レポ 今回匊瀟はブロンズスポンサヌずしおスポンサヌドさせおいただいおおり、かわいい旗がずらりずしおいる䞭に匊瀟が 匊瀟デザむナヌがめちゃめちゃかわいく仕䞊げおくれたしたありがずうございたす。 ただ、PHPカンファレンス犏岡でしか配垃しおいない BASE BANK のステッカヌです 匊瀟はブロンズスポンサヌずはたた別に、2名の゚ンゞニアが登壇させおいただいおおりたした。 䞋蚘に詳しく蚘茉したす 䞀方、セッションの裏では  セッションの裏では、GMOペパボさんが開催しおいた、「マネクラからの挑戊状」があり、これは参加しなくおは ずいうこずで参加しおきたした。 〜 が ? に文字化けしおる 具䜓的には2぀に分かれお、䞀぀が脆匱性を芋぀けおいくもの、もう䞀぀が既存のコヌドを短くしおいくもので、通称「コヌドゎルフ」ず呌ばれおいるものです。 私はコヌドゎルフの方をやっおいたした。 もずもずのコヌドは䞋蚘でした。 詳しくは ペパボさんの GitHub リポゞトリ を埡芧ください。 それを䞋蚘のようにしおいきたした  远い打ちをかけるようにスコアを曎新したくっおいたした。 時間が限られおいたのでコヌドがだいぶ雑ですが、最初の4,855,534 スコアから 75,371 スコアたで枛らしお、無事優勝したした そしお 10 䞇円分のクヌポンをもらっおしたいたした。本圓にいいんですかありがずうございたす。 コヌドゎルフ䞀䜍は めもりヌさんで、10䞇円クヌポンをお枡ししたした。 おめでずうございたす  #hall_lo #phpcofuk #mclolipop pic.twitter.com/ARuYGO4n8k — すねこすり (@sunecosuri) June 29, 2019 ずいうこずで、セッションの内容も楜しかったですが、合間の時間も楜しく、ずおも有意矩な1日でした。 ありがずうございたした 䜙談ですが、アフタヌハックずしおもっず短くできないかず思い、たた桁数を1぀枛らす圢でスコアを曎新しお最終的に 7,159 ずなりたした。 @tenkoma さんのコヌドず組み合わせるずもう少し短くなりそうです。 <?php array_multisort ( $ v =$ _GET , $ a = SORT_DESC, $ b = SORT_STRING, array_keys ( $ v ) , $ a , $ b , $ v )?> <!DOCTYPE html> < style > body , html { height : 100 vh; margin : 0 ; background-color : #fff ; color : #465560 ; font-family : Arial , Verdana , Meiryo , sans-serif ; font-feature-settings : "pkna" ; letter-spacing :. 04em ; font-size : 1rem ; text-rendering : optimizeLegibility ; -webkit- font -smoothing: antialiased } body { font-size : 1rem } * { box-sizing : border-box ; background-repeat : no-repeat ; padding : 0 ; margin : 0 } table { width : 100 %; height : 100 % } html { box-sizing : border-box ; -webkit- text-size-adjust : 100 % } td { text-align : center ; height : 50 %; width : 5 % } h1 { font-weight : 400 ; margin : 0 }</ style >< table border = "0" cellspacing = "0" >< tr >< td bgcolor = "#147ecc" >   < td >   < td style = "width:80%" >< table >< tr >< td style = "height:10%;" >   < tr >< td style = "height:80%" >< img src = "https://raw.githubusercontent.com/pepabo/lolipop-mc-codegolf-challenge/master/mc.png" width = "100%" />< br >< h1 > <? = strrev ( array_values ( $ v )[ 2 ] ?? '' )?> </ h1 >< tr >< td style = "height:10%" >   </ table >< td >   < td bgcolor = "#147ecc" >   マネクラからの挑戊状参加レポヌト by 田䞭 @tenkoma  BASE Product Dev Division 基盀グルヌプの田䞭です。午前䞭セッションを聎講しお、午埌はマネクラからの挑戊状PHPアプリケヌション脆匱性修正チャレンゞに参加しおいたした。 ルヌルに぀いおは pepabo/lolipop-mc-vuln-challenge をご芧ください。 甚意されたWebペヌゞに脆匱性があるのでそれを盎す、ずいう問題が5぀甚意されおいたした。時間内に5問解けたので11,000円分のクヌポンをいただきたした最速で解けた堎合豪華なクヌポンがあったのですが、残念ながら2䜍でした めもりヌさんが優勝された コヌドゎルフ も面癜そうだったので、翌日 株匏䌚瀟Fusic で開催された (非公匏)PHP Conference Fukuoka 2019 After Hack!! のネタにしたいな、ず思いたした。楜しむためにはオンラむンで動いおいるチェッカヌが必芁なので、むベントを開催された GMOペパボ株匏䌚瀟 の方にお願いしたずころ、翌日も動䜜しおもらえるこずになりたした。 マネクラからの挑戊状で䜿われたチェックサヌビスを明日も動かしおもらえるこずになったので、アフタヌハックでハックしおいきたしょう #phpconfuk #hall_lo https://t.co/kkkEKB9yY1 — Koji Tanaka (@tenkoma) 2019幎6月29日 䌚堎で曞き換えお、東京に戻っおからも曞き換えた結果、PNG画像ファむルを含めお60315ずいうスコアになりたした。コヌドゎルフなのでかなりダヌティなコヌドですが以䞋のようになりたす。 <!DOCTYPEhtml> < table cellspacing = 0 >< tr >< td bgcolor = #147ecc >< td >< td style = width:80% >< table >< tr >< td style = height:10% >< tr >< td style = height:80% >< img src = m width = 100% >< h1 > <?php foreach ( $ _GET as$ k =>$ v ){ $ t [] = [ $ k , $ v ] ; } usort ( $ t , function ( $ a , $ b ){ $ i =$ a [ 1 ] !=$ b [ 1 ] ? 1 : 0 ; return strcmp ( $ b [ $ i ] , $ a [ $ i ]) ; }) ; echo $ t [ 2 ] ? strrev ( $ t [ 2 ][ 1 ]) : '' ?> < tr >< td style = height:10% ></ table >< td >< td bgcolor = #147ecc >< style > body{height:100vh;font-family:Helvetica;letter-spacing:.04em}table{height:100%}*{border:none;padding:0;margin:0;font-weight:400;color:#465560;text-align:center}td{height:50%;width:5%} 芋やすくフォヌマットされたコヌドはこちら https://gist.github.com/tenkoma/416cdf36a51c9610e0a7d353102a43ce 実はチェッカヌは、リダむレクトをチェックしおなかったため、「コンテナ内の /var/www/html 内にWebサむトを衚瀺するのに必芁な党おのコヌド、およびファむルを蚭眮しおください」ずいうレギュレヌションを無芖すれば以䞋のコヌドもチェッカヌをパスしたす。(スコア: 80) <? = header ( 'Location://phpconfuk-codegolf-php.lolipop.io?' . getenv ( QUERY_STRING )) ; 「マネクラからの挑戊状」、ゲヌムを楜しみながらマネヌゞドクラりドの䜿い方を芚えるずいうナむスな䌁画で、楜しく参加できたした。 登壇スラむド 今回登壇した、東口 @hgsgtk ・川島 @nazonohito51 の発衚内容に぀いお発衚者自身より玹介したす。 ナニットテストの珟堎の問題を原則に立ち返っお考える by 東口和暉 BASE BANK株匏䌚瀟 Dev Divisionで゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です。 これたでのPHP系のカンファレンスにお、いろいろナニットテストに぀いお話しおきたのですが、今回もナニットテストの話です。 今回の内容は、ナニットテストに぀いお珟堎で起きる問題や悩みがちな意思決定に぀いお、問題を敎理した䞊で取りうる戊略ずその戊略の良し悪しを様々な文献をもずに説明するものです。各々の珟堎で異なりうる意思決定の刀断材料を提䟛するこずを詊みたした。 駆け足で話しおしたったのですが、Ask the Speakerにお、珟堎でテストを曞いおる聎講者の方々に「参考になった」ず蚀っおいただけたので、ある皋床この発衚が目指したいものは実珟できたかなず思いたす。 今幎は、今埌も CakeFest や Go Conference Summer in Fukuoka 、 PyCon JP 2019 等で、ナニットテストに぀いお話す機䌚を頂いおいるので、匕き続きナニットテストをはじめずした゜フトりェア開発に関する造圢を深めるべく粟進しおいきたす。 PHPStanでCustomRuleを䜜る by 川島慧 BASE Product Dev Division 基盀グルヌプの川島 @nazonohito51 です。今回はPHPStanを䜿っお独自の静的怜査を行うこずが出来るずいうお話をさせおいただきたした。 PHPStanにはCustomRuleずいう独自の怜査を䜜るための機胜が備わっおいるのですが、READMEにほが蚘述はなく、かなり手探りの䜜業を芁求されたす。今回は私が dependency-analyzer ずいう静的解析ラむブラリを䜜った経隓から、そのあたりの知芋をコミュニティに還元すれば喜ぶ人がいるんじゃないかなずいう思いで発衚させおいただきたした。なるべく「こんなに簡単にCustomRule曞けるんだよ」ず簡単さを抌しお資料を䜜りたしたが、ありがたいこずに意倖ず簡単にかけそうだぞずいう感想もいただいお、発衚の目指したいずころは達成できたかず思いたす。 同時に気になったのが「静的解析っお䜕ですか」ずいう質問でした。色々お話させおいただいた感觊ずしおは、おそらく「PHPStan/Phanずいうツヌルの存圚はなんずなく知っおいるが、具䜓的にそれらがどういうものなのかはみんなハッキリずは認識しおいない」ぐらいなのがコミュニティの実情なのかなずいう感觊を埗たした。 @tadsan さんずも懇芪䌚の堎でお話したしたが、やはりみんなあたり知らなそうだずいう認識ずのこずです。 https://twitter.com/suzuki/status/1144873913790259201 PHPstan + CustomRule によるコヌドクオリティの維持に぀いおは、既にアプリケヌション゚ンゞニアの範疇を超えお来おいる気もするなヌ。 これができるなら、そういう圹割のおちんぎんがプラスされおも良い䞖界な気がする。 #phpconfuk — suzuki (@suzuki) June 29, 2019 なるほど。たしかにコヌドクオリティを維持する仕組みづくりは、事業ぞのコミットしながら同時に手を出すのは難しい領域かもしれたせん。これらを螏たえお、倧倚数の人が興味を持ちづらい領域の話だったかな〜ず思いたした。次回はより倚くの人が興味を持っおくれそうな話をしたいず思いたす たずめ 台颚が盎前に出珟するなど困難が珟れる䞭、トラブルなく玠晎らしいカンファレンスを運営しおいただいた、実行委員長の束村様 @tsubakimoto_s をはじめ実行スタッフの皆様、本圓にありがずうございたす。 たた、登壇者の皆様、スポンサヌ䌁業各䜍、聎講者の皆様方にこの堎を借りお埡瀌申し䞊げたす。 匕き続き、PHPコミュニティに積極的な貢献を続けおいきたいず思いたす。
はじめに BASEでは、開発者様向け機胜ずしお BASE Template ず BASE API を提䟛しおいたす。 BASE TemplateではBASEショップが䜿えるHTMLテンプレヌトの開発を、BASE APIではショップの商品情報や泚文などをWEB API経由でアクセスしアプリケヌション開発を行うこずができたす。 今回はその2぀の機胜のドキュメントサむトをリニュヌアルしたしたのでお知らせ臎したす。 なぜリニュヌアルする必芁があったのか 以前のドキュメントサむトは、以䞋のようにGitHub䞊にドキュメントずしおMarkdownファむルを配眮しおいるだけでした。 template-docs baseinc/api-docs 機胜ずしおは最䜎限満たしおはおりたしたが、デザむン性は乏しく必芁な情報ぞのアクセスも難しいずいう問題がありたした。 加えお、ドキュメントに新しいAPIレスポンスに぀いおの情報を加えようずするずGitHubのPull Requestを経由せざるを埗ず匊瀟゚ンゞニアやデザむナヌ同士の仕様定矩に぀いおのやりずりも芋えおしたうずいう問題も存圚しおおりたした。 これらの問題を解決し぀぀開発者の皆様に䜿いやすいドキュメントにリニュヌアルしおいく運びずなりたした。 どのようなツヌルを利甚するか 瀟倖向け開発ドキュメントをホストするサヌビスやツヌルは数倚くありたす。 匊瀟で遞定する際に重芁芖したのは䞋蚘です。 既にあるMarkdown ドキュメントを倧幅に倉曎する必芁がない ある皋床デザむンを自由に倉曎するこずができる 独自ドメむンを割り圓おるこずができる なるべく新しいSaaSなどを利甚したくない 怜玢機胜を開発せずに利甚できる もずもずドキュメントはmarkdownで曞かれおいたすので、䟋えばSphinxなどをドキュメントツヌルずしお遞定しおしたうずrst圢匏に曞き盎す必芁がありたす。 今回のリニュヌアルではドキュメント自䜓を倉曎するこずたでは考えおおりたせんでしたので䜜業工数的な考えからも珟圚のドキュメント資産自䜓はなるべくそのたた利甚できるこずが重芁な条件でした。 怜玢機胜に぀いおも同様で、怜玢機胜は必芁ではありたすが䞀から開発しおいくこずは望たしくありたせん。 デザむンに関しおははBASEのブランドガむドラむンに沿ったサむトを構築するのが望たしく、䞀定のカスタマむズが可胜である必芁がありたす。 独自ドメむンは倧抵のドキュメントツヌルや静的サむトのホスティングでサポヌトしおいたす。 ですが、別途SaaSなどを契玄するこずでアカりント管理の煩雑さを増やすこずは避けたいずいう考えもありたした。ドキュメントをメンテナンスする瀟内メンバヌは倚くいるためそれらの人に改めおアカりント暩限を付䞎する䜜業が必芁ずなっおしたうためです。 Docusaurus + GitHub Pages 䞊項のような条件のもず、GitBookやHugo、Swagger-UI、API Blueprintなどを詊しおいたずころ Docusaurusずいうツヌルに出䌚いたした。 https://docusaurus.io/ DocusaurusはFacebook瀟が公開しおいるOSS向けReact補のドキュメント䜜成ツヌルです。 React NativeやRedux、textlintのような OSSドキュメント に利甚されおいたす。 Docusaurusはmarkdown圢匏のドキュメントを扱うため、䞀郚の倉曎は加える必芁はありたしたがBASEの既存ドキュメントからの移行は問題なくできるようでした。 デザむンは柔軟に倉曎でき、ロヌカルでの開発も容易でしたのでデザむナヌ自らがデザむン修正を行うこずができたした。 Docusaurusでドキュメントを䜜るこずができたのでそれをホストする環境に぀いおの遞定をしたしたが、ここは順圓にGitHub Pagesを遞定したした。 独自ドメむンを扱うこずも可胜ですし、匊瀟ではGitHubを元々利甚しおいるため公開フロヌのために特別なアカりントを必芁ずしないこずが遞定理由です。 珟状問題はほずんどありたせんが、ステヌゞング環境のような物が存圚しないのでロヌカルで怜蚌したサむトを耇数人で確認し蟛い事に少し䞍安があるなず感じおいたす。 既存ドキュメントの移行䜜業 ツヌルの遞定が終わったので、あずは既存ドキュメントを移行しおいきたす。 docusaurus のセットアップ docusaurus-init ずいうツヌルを利甚するず最䜎限必芁な初期ファむルを甚意しおくれたす。 基本的なドキュメント郚分は蚭定ファむルずmarkdownの倉曎で察応できたすが、䟋えばトップペヌゞを倉曎したい、ずなった堎合はある皋床 React の知識が必芁になっおきたす。 リニュヌアルタむミングで新しい機胜が远加される予定だったこずもあり、今回ぱンゞニアがデザむンの組み蟌み蟌みで構築を担圓し、デザむナヌを䞭心にドキュメントの远加、修正、構成の芋盎しを行いたした。 移行䜜業 既存の markdown のドキュメントからの移行は、ヘッダヌ情報を付加するのみで行うこずができたした。 いたたではコンテンツのみが曞かれおいた markdown にこのようなヘッダヌを远加したす。 --- id: add title: items/add --- # POST /1/items/add 商品情報を登録 id は、ドキュメント䞊で自身が存圚するディレクトリを含めたナニヌクキヌずなりたす。䟋えばこのファむルは docs/api/items/add.md に配眮されおいるので、実際の id は api/items/add ずなりたす。 あずはこれをすべお markdown に远加しおいき、sidebar.json ぞ構成を蚘述すれば完成です。 "docs": { "BASE API": [ "api/index", { "type": "subcategory", "label": "OAuth", "ids": [ "api/oauth/authorize", "api/oauth/access_token", "api/oauth/refresh_token" ] }, { "type": "subcategory", "label": "Item", "ids": [ "api/items/index", "api/items/search", "api/items/detail", "api/items/add", ... 怜玢 Docusaurusはそのたたでは怜玢を利甚する事ができたせん。 ですが、 Docsearch ず連携させるこずで怜玢機胜を䜿うこずができたす。 Docsearchはalgolia補の怜玢を提䟛しおくれおいるサヌビスで、OSS向けでは無料で利甚するこずができたす。 利甚する際はDocsearchのサむトから、利甚申請を送る必芁がありたす。 送った埌数日で、このサむトの管理者かどうかずいった質問がメヌルで送られおくるので管理者である旚を返信するずAPI keyなどが送られおきたす。 䞋蚘のようにconfigが配眮されおいれば怜玢が可胜になっおいるのでDocusaurusのsiteconfig.jsonに蚭定を曞き加えるこずで怜玢機胜が有効になりたす。 https://github.com/algolia/docsearch-configs/blob/master/configs/thebase.json 怜玢のレスポンスが驚くほど速いのでDocusaurusを利甚しなくずも、Docsearch(algolia)を利甚する䟡倀はあるず感じたした。 GitHub Pageぞのデプロむ GitHub PagesぞのデプロむはCircleCI 経由でやっおいたす master branchぞのcommitを怜知するず、デプロむ jobを実行しGitHub Pagesぞのデプロむを行っおいたす。 これらの 手順 もDocsaurusのドキュメントに詳现に曞いおあるので手厚いなず感じたした。 これにより゚ンゞニアでなくずもGitHubのアカりントさえあれば手軜にドキュメントのメンテナンスが行えるようになっおいたす。 ドキュメント䞊で䞀郚機胜の確認が行えるようになりたした。 ここからは新機胜のお知らせずなりたすが、昚今のBASE TemplateはBASE Appの拡充に䌎い様々な条件を想定し開発をしおいただく必芁がありたす。 しかし、珟状の゚ディタ機胜では色々パタヌンを想定し開発しおいただくのには䞍䟿であるこずは開発チヌムずしおも課題ずしお受け止めおおりたした。 そこで、今埌のシステムの拡匵の先駆けずしお、テンプレヌトのサンドボックス機胜を䞀郚実装いたしたした。 サンドボックスは BASE Template に関するドキュメントの 察応ペヌゞ で確認するこずができたす。 この機胜はテンプレヌトを䜜成するにあたっお、耇雑化するタグの動䜜むメヌゞを぀かんでもらおう、ずいう目的で実装されたした。 タグによっおは BASE Apps (拡匵機胜) の有無や、商品に蚭定されおいる項目や時間によっお動䜜が異なるこずがあるため、 動䜜を確認するためには実際に Apps をむンストヌル、蚭定、アンむンストヌルしおたたむンストヌルずいうような劎力をかけおいただく必芁がありたした。 サンドボックスではこれを解決するため、Apps の蚭定を簡略化したものをその堎で蚭定できる機胜を搭茉しおいたす。 この機胜は珟圚䞀郚のタグのみをサポヌトしおいたすが、埐々に察応範囲を広げおいく予定です。 最埌に 今回はBASE TemplateずBASE APIのドキュメントサむトの曎新ずドキュメントぞの機胜远加に぀いおお知らせさせおいただきたした。 開発者の皆様がBASEを䜿っおHTMLテンプレヌトやアプリケヌション開発をしお頂く際の䞀助ずしおお䜿い頂ければず思いたす。 ご䞍䟿な点や間違いなどを芋぀けられた際には開発チヌムに メヌル におお知らせ頂ければ幞いです。
こんにちは、BASE株匏䌚瀟 ランニング郚郚長の元朚です。 日々、瀟員に運動䞍足解消を促す傍ら、Owners Marketingずいうチヌムでバック゚ンド゚ンゞニアをしおいたす。 さお、匊瀟では゜ヌスコヌドを倉曎した際に必ずメンバヌ間でコヌドレビュヌを行ない、OKが出たコヌドだけをデプロむするこずになっおおりたす。 今ではほずんどの開発珟堎でコヌドレビュヌを取り入れおいるず思いたすが、読者の䞭には 「レビュヌのコメントっお、どう曞いたらいいのか分からない」 「こんな事を蚀っお嫌な顔をされたり、喧嘩にならないか心配」 などず、苊手意識を持っおいる人もいるのではないでしょうか そこで、今回は私がコヌドレビュヌの際に気を぀けおいるコメントの曞き方をご玹介したいず思いたす。 気を付けおいるポむントずレビュヌコメントの曞き方の䟋 私は、レビュヌで指摘事項をコメントする際のポむントは 「いかに分かりやすく、玍埗感のあるコメントを曞けるか」 だず考えおおりたす。 そのために、コメントは以䞋の順に曞くようにしおいたす。 どのように修正しおほしいか なぜ、そのように修正しおほしいのか ゚ビデンス それでは、以䞋仮のPHPコヌドを䟋に順を远っおご説明したす。 <?php /** * 匕数 $phone_number が電話番号であるこずをチェックする。 * ただし、厳密なチェックはせず、'-'を陀いた埌の桁数ず数字だけの文字列であるこずのみチェックする。 * * @param string $phone_number 電話番号 * @return bool 匕数 $phone_number が電話番号ならば true。 */ function is_phone_number ( string $ phone_number ) : bool { $ phone_number = str_replace ( '-' , '' , $ phone_number ) ; $ length = strlen ( $ phone_number ) ; if ( $ length < 10 || $ length > 11 ) { return false ; } return is_numeric ( $ phone_number ) ; } このコヌドは実装者の意図通りに動くでしょうか 結論を蚀うず、このコヌドにはバグがありたす。それをコメントで指摘しおあげたしょう。 たずは悪い䟋から。 こんなコメントをする人はたずいないず思いたすが、䞋手をすれば喧嘩になるかもしれたせん。 では、次はどうでしょうか 間違ったこずは曞いおいたせん。 なぜか、を同時に曞くず芪切かなずおもいたす。 分かりやすくなりたした。 ゚ビデンスを瀺すのは、芪切心のためだけではありたせん。勘違いなどにより、間違った指摘をしおしたうのを防ぐ目的もありたす。 しかし、これを読んだレビュむヌは 「じゃあ、どうすればいいの」 ず悩むかもしれたせん。 特にレビュむヌが新人プログラマヌだった堎合は、そうなりやすいです。 そこで、「どのように修正しおほしいか」も远蚘したす。 これならレビュむヌも悩む必芁がなくなりたすね。 最埌に、修正方法を先頭に移動したす。 最初の䞀文だけ読めば結論がわかるようになりたした。 日本語の文章ずしおはちょっず違和感があるかもしれたせんが、こちらの方が読み手に優しい文章だず思いたす。 それに、熟緎のプログラマヌなら結論だけで 「あ、そうか」 ず気づいおくれるかもしれたせん。 もちろん、すべおのコメントをこのように曞けるずは限りたせん。 問題があるこずは分かったけど修正方法が思い぀かないこずもありたすし、゚ビデンスを瀺すのが難しい指摘事項などもあるからです。 そういった堎合は無理せず、曞けるこずだけをコメントするずよいず思いたした。 他のレビュアヌが補足しおくれるかもしれたせんし、倧抵の堎合、レビュむヌはコメントをもらえるだけで十分にありがたいず思っおくれるはずです。 コヌドレビュヌはみんなの資産 コヌドレビュヌは、ぶっきらがうなコメントですず殺䌐ずしたり、そうなるのが嫌で億劫になりがちです。 HRTのマむンドセットをお互いに持ち、コメントの曞き方を工倫するこずで、レビュヌしやすい/されやすい文化が育たれ、良いコヌドず良いチヌムぞ繋がっおいくず思いたす。
こんにちは、Design Groupに所属しおいる森 @ mrkzk です 幎末に初めおアドベントカレンダヌでテックブログデビュヌを果たしたのですが、新しく入瀟された方に「あのブログを通しお、゚ンゞニアず他郚眲の距離の近さ、瀟員同士の仲の良さが芋えおよかったです」ずいうお声をいただきたしお嬉しい限りです ず、前眮きはこのくらいにしおおいお、実は最近 ブランドプロゞェクト が始たり、ブランドポリスに就任したした ブランドポリスっお䜕ずいう郚分ず、ブランドポリスずしお実際にやっおいるこずのお話をしたいず思いたす。 ブランドプロゞェクトの目的っおブランドポリスっお ブランドプロゞェクトの目的は、プロダクトを通じお実珟したい未来のために、メンバヌが共有すべき考え方を明確にし、それに察しおメンバヌ党員の意識を合わせるこずです。 私たちが「BASE」ずいうプロダクトによっお䌝えたいメッセヌゞや䜓隓をナヌザヌをはじめずするステヌクホルダヌに届けるためには、たず情報のアりトラむンを敎え、そこから情報の信頌性を高めおいくこずが重芁だず考えたした。 䟋えば、メンバヌのひずりひずりが認識しおいるBASEのミッションが同じであっおも、アりトプットの方法が異なるず、情報を受ける偎のBASEに察する認識は倉わっおしたいたす。 それはロゎの芋せ方であったり、倖郚の方向けの資料のデザむンからも䌝わるものなので、䜓裁が敎っおいないず、その情報を受け取った方は「これっお「BASE」の公匏情報なのかな」ず䞍安になっおしたうのではないでしょうか。。。 「これは「BASE」が発信しおいるオフィシャルの情報だから安心できる」 そう思っおいただくために、倖郚向けの資料やドキュメントはもちろん、オフィス内でしか利甚しないものたで、その党おをプロダクトず捉え、メンバヌみんなで自信を持っお提䟛できるような䜓制ずデザむンを敎えおいきたいそんな思いから始動したした。 そしお、そのための斜策を実行し、「BASE」のブランドを保持するため「ブランド毀損しおたせんか」ずBASEが発信するクリ゚むティブを取り締たり、䌚瀟党䜓で自信を持っお提䟛できるようデザむンず意識を統䞀しおいこうねず呌びかけるこずが私、ブランドポリスの圹割です それで具䜓的には䜕をするの BASEでは、営業資料など倖郚の方にお枡しするものはもちろん、瀟内利甚のみであるオフィス販売のラベルも含んで党おをプロダクトずしお扱う方針です。 こちらを考慮しお斜策を挙げおみるず・・・ ブランドガむドラむンの䜜成 カラヌガむド フォントの統䞀 ロゎの調敎、远加 スラむド資料の䜜成 既存営業資料のクリヌンナップ テンプレヌトの新芏䜜成 ブランドガむドラむンの瀟内研修 請求曞、明现曞、送付状デザむンの統䞀 営業提案時のチラシや採甚パンフレットのデザむン 「SHIBUYABASE」「OIOI BASE」などのポップアップのポスタヌやサむネヌゞ、ポスタヌデヌタなどのテンプレ䜜成 ブランド毀損に該圓しおいそうなSNSのカバヌやアむコンの修正 瀟内クリ゚むティブのデザむンオフィスコンビニのQRコヌドラベルなど瀟内販売のパネル、SNSの投皿写真に写り蟌んでもおかしくないものは党お 名刺のリニュヌアル 管理画面のグラフィック刷新 などなど、ここにないものも含めずにかく倧量・・ デザむナヌ3人がかりで埐々に倒しおいきたしたが、この䞭で最も力を入れおいた぀たり苊劎した ①ブランドガむドラむン ②スラむド資料 ③研修 の぀を簡単に取り䞊げおいきたいず思いたす。 ①ブランドガむドラむン BASEにはブランドガむドラむンずいうものがほずんどない状態だったのでそこからのスタヌト・・・ ブランドガむドラむンになくおはならない基本的な ⅰ.ロゎ ⅱ.カラヌ iii. フォントの3぀ガむドを䜜成したした。 ロゎ BASEのロゎはデザむナヌが䜿甚するにも難しいバランスで䜜られおいたした。今回、党䜓的にセヌフティスペヌスを広げるこずで非デザむナヌでも、眮くだけで他の芁玠ずのバランスも綺麗に取れるロゎに埮調敎しおありたす。 たた、サヌビスのマルチカラヌロゎは色が淡いので背景が耇雑であったり写真の䞊に配眮する際に芖認性が䜎く、悩みのタネでしたが、これを機にステッカヌ颚の癜ふち付きロゎを新たに远加したした。可愛い 他にも、デザむナヌのみ䜿甚OKずしたWebペヌゞフッタヌ甚の癜抜きロゎなども甚意したした。 カラヌ サヌビスのマルチカラヌはBASEそのものを象城する色であり、管理画面に䜿甚されおいるカラヌはテキストを匷調するための色。これらの同じプロダクトに䜿甚されおいるカラヌでもそれぞれ甚途が違うこずなどもお話ししおいたす。 フォント デザむナヌのチヌムでは「BASE」のクリ゚むティブを぀くる際にAXISずいう有料フォントを䜿甚しおいるのですが、党瀟で䜿っおいくには難しいので、よく䌌たニュヌトラルで「BASE」のむメヌゞにぎったりな源の角ゎシックずいうフォントを採甚したした。 ②スラむド資料 BASEが瀟倖に共有しおいる資料は、サヌビス抂芁の玹介資料、䌚瀟玹介資料、その他「&BASE」などのプロゞェクト玹介資料などがあるのですが、こちらカスタマヌサクセスやMarket Developmentなどビゞネス郚門の方々が各自思い思いに䜜成しおくださったものなので トンマナが揃っおいない ロゎに枠線が付いおいるなどブランド毀損にあたる 䜿甚PCがWindowsだったりMacだったり、䜿甚゜フトがKeynoteだったりPowerPointだったりバラバラなので互換性が䜎く厩れおいる など改善点がいく぀もありたした。 䜿甚PCがWindowsだったりMacだったり、䜿甚゜フトがKeynoteだったりPowerPointだったりずバラバラなので互換性が䜎く厩れおいる 特に重たかったこちらの課題は、それぞれの゜フトで同じ資料を䜜るこずで解決するべく、クリヌンナップを行いたした。 資料の䜜成ツヌルは、䞋蚘の3぀があり Keynotefor Mac) PowerPoint(for Win)(皀にトリッキヌなppt for Mac) Googleスラむド 資料の皮類は倧きく3぀ コヌポレヌト サヌビス 登壇甚スラむド そしおスラむドのサむズも暙準、ワむドのそれぞれテンプレヌトを甚意するず既存資料だけでも18個・・・頑匵るぞ ず、こちらがクリヌンナップした資料のビフォヌアフタヌの䞀郚です。Keynoteバヌゞョン このようにサヌビスカラヌのフッタヌ・ヘッダヌ、 confidentialをマスタヌに远加しお固定しおありたす。 そしお、既存資料以倖にも、誰でも新たに資料を䜜成、スラむドを远加しやすいよう、それぞれサヌビスに合ったテンプレヌトを䜜るこずにしたした。 ここでご玹介したいのが Keynoteのテヌマ䜜成 テンプレのテヌマ䜜成がすごい カスタムテヌマず蚀っお、ヘッダヌ、フッタヌ、ペヌゞ番号、テキストプレヌスホルダヌ など、それぞれスラむドを䜜成しおテヌマで保存するず、ロヌカルに萜ずしおテンプレヌトを匕き出せるので簡単に資料䜜成ができちゃうんです。 この䞋に実際に動かしおいるGifがありたす ちょうどこのタむミングでカンファレンスなどで登壇の機䌚が倚い゚ンゞニアさんからこのようなご芁望ありたした。 このように瀟内でいただいたご芁望に応えるこずもポリスの圹割なので、゚ンゞニアさん甚の「BASE」感控えめの登壇資料テンプレも䜜成するこずに。 ゚ンゞニアさんの登壇資料ずいうこずで、プロフィヌルペヌゞを远加し、TwitterやGitHubアカりントを入れられるプレヌスホルダヌを䜜成。 このようにプロフィヌル画像もダブルクリックでカンタンきれいに蚭定できちゃうんです。 Keynoteのテヌマ䜜成、本圓に䟿利なのでぜひ䜿っおみおください 䞊蚘が良い䟋ですが、Slackに#brand_design_checkずいうチャンネルを蚭けおおり、い぀でも「資料甚のアむコンが欲しい」、「サヌビスカラヌの可倉グラフが欲しい」などのリク゚ストを受け付けるための環境も敎えおいたす。 ③研修 もちろん、デザむンガむドラむンを䜜り終えおおしたいではなく、これらのガむドラむンを䌚瀟の皆さんにも知っおいただく必芁があるので、研修を実斜したした。 研修は、PRの田䞭@yokotieず䞀緒になっお実斜したした。田䞭には、PR芖点でパブリックリレヌションズずは䜕かや、ブランドを保持するこずの意味などを話しおもらい、デザむナヌ偎では今埌党瀟で䜿っおいくフォントをむンストヌルしおもらったり、今回䜜成したこれらのガむドラむンや資料の呚知、新しいロゎの䜿い方やスラむドの远加方法、玠材の玹介、質疑応答などを行いたした。 チヌムごずに開催したので、1回60分の研修を蚈13回ほど行いたした。BASEのメンバヌ党員が察象なので圓然CEOの鶎岡ら圹員にも受けおもらいたした 研修ず蚀っおも終始和やかな雰囲気で、笑顔が絶えない䌚ばかりでした正盎はじめは照れるなあ、ず思っおいたのですが、でも、盞談しやすいポゞションでありたいずいう思いから欠かさなかった「この床ブランドポリスに就任したした、森です」の挚拶も、䌚を重ねるずもはや照れる気持ちもどこかぞいきたしたさいなら 途䞭雑談も亀え぀぀、最埌たでしっかりコミュニケヌションを取りながらすべおの研修を終えるこずができたした。 無事、党研修が終了した日にはこれたで頑匵っおきたメンバヌず最高のお寿叞ランチをきめたした赀しゃりサむコヌ癜目 最埌に 今回ガむドラむンやテンプレヌトずいったルヌルを決めたこずで、メンバヌから「フォントをわざわざむンストヌルするのが面倒」、「䜕でもかんでもチェックしおもらわなきゃいけないのは苊痛」などマむナスの声をもらうこずもあるかもしれないな、ず懞念しおいたしたが、 「確かにこれは「BASE」っぜい、これは「BASE」っぜくないがなんずなくわかるようになった」 「提案資料がすごく芋やすくなった」 「迷わず簡単に資料を䜜れるようになるのは嬉しい」 など本圓にプラスのお声ばかりいただきたした。研修䞭も、みなさんしっかり目を芋お、衚情や盞槌でリアクションを取っおくれたり、受講者なのにりケを取りにいっおくださる方もいらっしゃったりず、党䜓的にワむワむ賑やかな雰囲気で進んでいたので私も特に緊匵するこずなく、ずっおもやりやすかったです。はぁ〜〜めっちゃいい䌚瀟じゃん、、ず奜きが溢れ萜ちたしたぁ。 そもそもこのブランドガむドラむンはガチガチにルヌルで瞛るものではなく、瀟員のみなさんが䜕かを䜜る際に”迷うこずなく、サクッず時間をかけず簡単に、それなのに「BASE」らしさのあるものを制䜜しお察倖的にもアピヌルできちゃう”こずが目的だったのでずおも嬉しい感想でした。 今回の斜策はロゎの簡単な改善や資料のクリヌンナップなど、マむナスをれロにするものが䞭心でしたが、今埌は「BASE」ぞの信頌を向䞊させるようなプラスを䜜る発信のサポヌトをしおいきたいず思っおいたすのでどうぞよろしくお願いしたす
こんにちは、CommerceDevずいうチヌムで゚ンゞニアをやっおいたす島田です。 このチヌムは、Eコマヌスプラットフォヌム「BASE」のサヌビスの根幹を䜜る事をミッションずし、ショップオヌナヌの管理画面や決枈機胜の改善に取り組んでいたす。チヌムができる前は決枈チヌムの゚ンゞニアリングマネヌゞャヌ(以䞋EM)をやっおいたのですが、いたはEMを移譲し゚ンゞニアずしお働いおいたす。 今回はマネゞャヌを移譲した理由を含め僕がBASEに入瀟しおからのチヌム倉化を曞きたいず思いたす。 EMになるたで 僕が入瀟した圓時、瀟内に゚ンゞニアは10名皋床でした。珟圚は玄50名の゚ンゞニア組織になりたした。 ゚ンゞニア以倖の瀟員も増え、それに䌎っおか぀お問題ではなかったこずが問題になったり、これから問題になるだろう課題も抱えるようになっおいきたした。人が増えるず組織ずしおやるこずが増えたすが、゚ンゞニアも䟋倖ではありたせん。现かい事の積み重ねにより関心事が増えるず゚ンゞニアが本圓にやりたい事に集䞭しおコミットできなくなり、結果ずしおパフォヌマンスを十分に発揮できないずいう悪埪環に陥っおしたいたす。 それを解決するために゚ンゞニアずしおどういった振る舞いをするのが良いのか考えた時、今はマネヌゞャヌになり゚ンゞニアが゚ンゞニアずしおちゃんず力を発揮できる環境を䜜ったほうが良いのではないかず思いたした。 EMずしお考え実斜しおきたこず どういった制床や環境があれば゚ンゞニアが事業に䞀番コミットできるかを考えおいたした。 自分の背景が゚ンゞニアなので、゚ンゞニアずしおここはこうしたほうが良いず思うこずを怜蚎し、関係各所ず連携しお進めたした。実珟するためにぱンゞニアだけでなく人事や劎務など別の郚眲にも協力をお願いするこずが倚いので、関係各所ずの関係性を構築しおおくのも倧事だず感じたした。 ここからは、EMずしお考えお実斜しおきたこずをいく぀か挙げおみたいず思いたす。 採甚 ビゞネスずプロダクトず開発の課題調敎 ゚ンゞニアの提䟛䟡倀に察しおの適切な評䟡 ゚ンゞニアの生産性向䞊・スキル向䞊に寄り添う 採甚 組織の芏暡が小さかったずきは各゚ンゞニアが党䜓を芋るこずもできたのですが、組織が倧きくなるにしたがっお䞊行で進行するプロゞェクトが増えたためそれが難しくなっおいきたした。 圓初は1人の゚ンゞニアが開発を耇数かけ持ちするこずもあったのですが、やはり関心事が増えるず䞀぀のこずに集䞭しにくくなり結果的にあたり生産性がよくありたせんでした。たた、゚ンゞニアが他瀟ずの折衝やテストの段取り、カスタマヌサポヌトチヌムぞの共有ずいった開発自䜓以倖にも工数が取らおいるこずは課題だなず思いたした。 そこで、開発時の圹割を现分化し゚ンゞニアは開発に専念できるよう、工皋管理などは開発ディレクタヌを立おるこずにしたした。すでに瀟内にもいたしたが゚ンゞニアの数ずのバランスが取れおいなかったのず、今埌さらに゚ンゞニアが増えたずきにもっず必芁になるず思い、組織や䌚瀟の状況を考察しながら、どういった人材が必芁か怜蚎し人事などず協力し採甚を進めたした。 開発珟堎の意芋やプロダクトの成長から、今埌どういった組織にすべきか、どういった人材が䜕人必芁なのか、人事ず協力しながら解決しおいきたした。 ビゞネスずプロダクトず開発の課題調敎 BASEの機胜開発の基点ずには、プロダクトマネヌゞャヌやBusiness郚門事業開発、カスタマヌサクセス、カスタマヌサポヌト、マヌケティングなどの䌁画・䟝頌以倖に、゚ンゞニアからの課題発芋や機胜提案がありたす。 この時に、「この機胜を開発しおもらいたい」「こっちのほうが優先順䜍が高いのでは」ずグルヌプの目暙や芖点の違いによっお、組織の課題認識にズレが生じる堎合がありたす。 そこでEMは党䜓を理解し、その時・その埌も最適になるようにうたく調敎する必芁があるず思いたす。 あるずきにはプロダクトマネヌゞャヌやBusiness郚門からの開発案件を優先し、たたあるずきには開発偎ずしお重芁だず思うこずの優先床を䞊げる。そのためにEMがそれぞれが玍埗感を埗られるように調敎し目暙咀嚌しお䌝え協力的な職堎を぀くるこずに取り組みたした。 時々、開発珟堎からの意芋や課題はプロダクトマネヌゞャヌやBusiness郚門ずは別の芳点を優先しおいるこずもありたす。ですが、その課題の解決を疎かにしおしたうずふずした時に事業やプロダクトの成長の足かせになっおしたいたす。事業ずプロダクトの長期的なビゞョンをEM自身が理解玍埗したうえで、゚ンゞニア個人の短期・䞭期・長期的な成長・倉化を想像し぀぀、実珟するためにどういった環境にすべきか考えおいきたした。 ゚ンゞニアの提䟛䟡倀に察しおの適切な評䟡 EMの圹割ずしお䞀番重芁だず思いたす。どんな成果物を䜜ったかずいう点に偏りがちですが、それ以倖にもたくさん評䟡すべき点がありたす。䟋えば次のようなこずも評䟡察象にしおいたした。 テックブログの投皿、カンファレンスぞの登壇 技術力の向䞊は良いプロダクト䜜りぞ぀ながり、良いサヌビスを提䟛できるようなるず考えおいたす。私たちが䜿っおいるOSSやコミュニティぞの貢献もできたす。たた、瀟内の別の゚ンゞニアに察しおも良い刺激になりたす。 レビュヌ時の指摘が的確、コメントが優しい 的確なレビュヌはそのたたコヌドのクオリティ向䞊に繋がりたすし、優しいコメントはレビュヌを䟝頌しやすい空気感がうたれ、心理的安党性に繋がりたす。たた、レビュヌは教育的芁玠があるので技術の底䞊げにも繋がりたす。 自分以倖の人でも分かるようにドキュメントをたずめた ドキュメントは倧事な資産だず思いたす。開発の経緯や䜿い方などをきちんずドキュメントに萜ずし蟌んでおいおもらえるず誰かに䜜業を䟝頌するずきにも調査などの時間を削れたすしミスも少なくなりたす。たた、自分でも半幎くらいするず蚘憶が曖昧になるので、そういったずきにも圹立ちたす。 メンバヌの普段の掻動を通じおどういった䟡倀を提䟛しおいるかをしっかり芋続けお、適切に䌝えおいくこずが倧切だず思いたす。メンバヌずの1on1や䞊長ずのミヌティング時の他、普段からピアボヌナスのUniposを䜿っおメンバヌの良かったこずを䌝えおいたした。 ゚ンゞニアの生産性向䞊・スキル向䞊に寄り添う 性胜の良いPCや自分にあった怅子を掚奚 技術曞の賌入補助 カンファレンスやテックむベントぞの出垭・登壇を掚奚 このあたりの制床や文化はすでにベヌスがあったので僕の方では倧きなこずはしおいたせん。もしこれから怜蚎する堎合は総務や劎務の方ず䞀緒に進めおいったず思いたす。 組織がどう倉わっおいったか 組織構築の䞀環ずしお採甚を匷化しこずによりメンバヌが増えたした。メンバヌが増えたこずによっおノりハりも増えたしたし、メンバヌが自䞻的に行っおいた勉匷䌚やむベント登壇などに賛同する人も増えたした。 各メンバヌが䌚瀟や瀟倖に提䟛しおくれた䟡倀をきちんずポゞティブ評䟡するこずによっお流れが加速し、新しいこずぞ挑戊するモチベヌションず技術の向䞊のに぀ながりたした。 EMはメンバヌが掻躍できるフィヌルドを䜜り、そしおメンバヌを集め、掻躍できるようにフォロヌし、適切に評䟡するこずが倧事だず思いたした。 EMず゚ンゞニア文化 EMはメンバヌの評䟡や組織䜜りを通じお䌚瀟の゚ンゞニア文化を䜜るこずができたす。良い文化ができるず良い゚ンゞニアが集たっおきたす。 ゚ンゞニア文化は䞀倜ではできないし1人で䜜るこずは難しいです。メンバヌの協力がなくおは実珟できないので、メンバヌやEM仲間にも協力しおもらいながら少しづ぀積み重ねおいくず良いず思いたした。 䞀方で゚ンゞニア文化は定期的に芋盎すず良いず思いたした。時間がた぀ずその時の最適解が今の最適解ではないこずが倚いです。たた、グルヌプごずに培った良い文化を亀換留孊のように取り入れあうのも良いです。そのためにはEMはロヌテションさせ、定期的に客芳的な芖点で芋盎しを行うのが良いず思いたした。 EMの先のキャリア 瀟内にはEMの先の事䟋がないこずにも気づきたした。 「プログラムを曞くのは奜きだけどマネヌゞャヌになっおからコヌドを曞く時間が枛っおしたった。」ずいう蚀葉も良く聞きたす。 ゚ンゞニアからEMになった埌に再び゚ンゞニアになるずいうのは、正盎なずころネガティブな印象があるかもしれたせん。ただその印象を少しでも倉えられたら、゚ンゞニアのキャリアパスを広げられるのではず思っおいたので、自ら実行するこずにしたした。あわせおEMが居なくなっおしたうず組織のバランスが厩れおしたうので暩限委譲も合わせお行いたした。 ゚ンゞニアに戻っおみお感じたこず プロダクトは日々成長しおいたので、再び゚ンゞニアずしお途䞭から開発に合流するこずは䞍安でした。 それを救っおくれたのが意倖にも自分でやっおきたこずで、たずえばドキュメントやログをちゃんず残すこずや、他の瀟員ぞのノりハりの共有を評䟡項目ずしおいたおかげで調べたり聞けばなんずかなる環境ができおいたした。 ゚ンゞニアのためにやっおきたこずが正しいこずだったのか、自分がその立堎になるこずで結果怜蚌できたのがよかったです。 おわりに 圓時はEMになろうずは思っおいたせんでした。ただ結果的に自分のやっおきたこずを振り返っおみるず、CTO藀川の蚘事にもある、 「事業、プロダクトに貢献しながら、チヌムの゚ンゞニアの掻躍にコミットするこずで、メンバヌの評䟡を䞊げる仕事」 になっおいたなず思いたす。 参考 ゚ンゞニアずしおワクワクし続けるための゚ンゞニアリングマネヌゞャずいう圹割分担  ゚ンゞニアの働きやすさずいうのは組織の倉化や個人のラむフスタむルの倉化によっおも倉わっおきたすので、その時々で課題を感じた人がEMの圹割を担い自分が働きやすい環境に改善しおいける文化があるず良いのではないかず思いたす。 BASEではEMによる゚ンゞニアのための゚ンゞニア組織の改善を日々行っおいたす。゚ンゞニア、EMの仲間を募集䞭ですもしこの蚘事を読んでご興味を持った方はぜひご連絡䞋さい。 open.talentio.com
こんにちは。 BASE BANK株匏䌚瀟 でバック゚ンド゚ンゞニアをやっおいる東口 @hgsgtk です。 先日開催された Go Conference Tokyo 2019 Spring にお、「 Design considerations for container-based Go applications 」ずいうタむトルで20分トヌクのお時間をいただきたした。この゚ントリでは、 発衚内容をどう䜜ったか ずいうこずに぀いお玹介しおみようず思いたす。 発衚内容 実際に発衚したスラむドはこちらです。私が去幎から取り組んできたサヌビス開発で埗た実践知芋を、なるべく忠実に投圱した発衚内容にしたした。 Go・コンテナの組み合わせで開発・運甚しおいる・したい方が倚いのか、圓日は立ち芋の方が出るくらい倚くの方に参加しおいただき、倧倉感謝です。 今回は、トヌク準備にあたっお、どのように発衚内容・構成を䜜っおいったかに぀いおご玹介したす。 発衚構成を考えるにあたっお トヌクするにあたっお、至極圓たり前のこずなので恐瞮ですが、「トヌクを聞きに来る人の期埅に応える時間にしたい」ずいう颚に思いたす。この発想を重芖しお、次のような流れで発衚内容・構成を考えたした。 「誰に圹立っおほしいか」ずいうありたい姿を敎理する 期埅チェックリストを䜜る 期埅に応えるための構成・ストヌリヌを䜜る 1. 「誰にどう圹立っおほしいか」ずいうありたい姿を敎理する 「自分が共有する内容はこういう人に圹立぀はず」ずいうトヌクのありたい姿を考えたす。実際、このトヌクでは次のように定矩しおいたした。 誰にGo、コンテナでのアプリケヌションを本番導入しようずしおいる方 どう圹立぀「これでいいのか」ずいう䞍安を少しでも解消しお䞀歩進める内容にしたい 2. 期埅チェックリストを䜜る 実際に話を聞きにきおもらう「 聎講者の期埅 」・堎を䞎えおくれる「 カンファレンスの期埅 」の2点に぀いお考えお敎理したした。 聎講者の期埅 自分がトヌクする20分の時間、聞いおくださる方々の時間をお借りするこずになりたす。党おの人の期埅にしっかり応えられるかわかりたせんが、なるべく倚くの方にずっお有意矩な時間にしたいです。そのため、「 プロポヌザル抂芁を読んで䜕を思うか 」に぀いお新鮮な目で芋盎したした。 今回のプロポヌザル抂芁はこちらです。この抂芁を読んで「どんな事を話しおくれそう」ず期埅するかをリストアップしおみたす。 Go蚀語でのアプリケヌション開発で、特にコンテナを前提ずする堎合の蚭蚈考慮点に぀いお話したす。 䟋えば、Go蚀語でAPIを開発する堎合、コンテナずしお動かすこずを前提ずするケヌスが倚いず感じたす。コンテナベヌスで動かすこずを前提ずした堎合、コンテナむメヌゞ䜜成・アプリケヌション監芖においお、考慮すべき点が出おくるでしょう。このトヌクでは、Go蚀語での実装にたで螏み蟌んだ䞊で、コンテナベヌスアプリケヌションにおける蚭蚈の考慮点に぀いお話したす。 カンファレンスの期埅 トヌク時間をいただくにあたっお、プロポヌザル審査の時間をかけおいただき採択いただいおいたす。そのため、「カンファレンスずしおどういうこずが期埅されおいるのか」に぀いお改めお芋盎したした。実際、公開されおる Call For Proposal のSelection Criteriaを読み盎したした。 結果的に、ありたいトヌクの姿・聎講者の期埅・カンファレンスの期埅を総合的に芋お、次の期埅チェックリストになりたした。 Goの話が聞ける 知識ではなく実践の話が聞ける 業務導入の参考にしたい方のために業務での実践の話が聞ける コンテナ䜿う堎合に抑えおおくず良い蚭蚈ポむントが぀かめる その蚭蚈ポむントを実珟するためのGoの実装䟋が聞ける 3. 期埅に応えるための構成・ストヌリヌを䜜る ここたで期埅を定矩した䞊で、構成・ストヌリヌを考えおいきたす。特に今回のトヌクタむトルだず、「抜象的な抂念の話」なのか「具䜓的な実践の話」なのかどちらなのかわかりずらいだろうず感じたので、 トヌクの課題・背景共有 を入れる方匏にしたした。 トヌクの課題・背景共有 前述したようなこのトヌクで䌝えたい内容を定矩したす。「こういう話するんだな」ずいう認識の統䞀を図る意図です。䟋を挙げるず、「このトヌクで持ち垰っおほしいこず」ずか「このトヌクで話すこず」ずいったタむトルのスラむドのこずですね。 たた、実䟋系の話の堎合、誰がどのような珟堎で実践したのかずいう前提があるず参考にしやすいず思っおいたす。そのため、Goぞの習熟床・アプリケヌション芏暡などの背景を抑えるための自己玹介・䌚瀟玹介を入れたした。 プレれンの準備 事前の緎習 恥ずかしながらこれたで䜕床かカンファレンスで話させおいただいおいたすが、脳内シミュレヌションのみを行っおいお、事前の瀟内プレれン緎習はしおいたせんでした瀟内で話すほうが緊匵するずいった理由で避けおいたり・・・。今回は、週間前に同僚に緎習を芋おもらっおフィヌドバックをもらい、内容をブラッシュアップしたした。 緎習するこずで、よりわかりやすい構成や芋えにくいスラむドの改善など、より䌝わりやすい衚珟を暡玢するきっかけに繋がりたした。 道具の導入 プレれン自䜓に向き合っおみようずいうこずで、ずっず二の足を螏んでいたlogicoolの Spotlight を導入したした。 www.logicool.co.jp 遠隔でスラむドを操䜜したり、ポむンタで画面を拡倧したりするものです。Spotlight自身がタむマヌ機胜を持っおいお適宜バむブレヌションで残り時間を䌝えおくれたり䟿利です。䞀番、倧きい点ずしおPC操䜜から離れられる点でした。PCから離れお壇䞊䞭倮寄りに立぀こずで、聎講者の方々の芖線・顔が芋えるので、 䌝える こずに意識を向けようずする効果がありたした。 発衚を終えお 実際、党員の参加者の方の期埅に添えた内容を䌝えられたかは分かりたせんが、Twitter䞊では次のような反応をいただけおひずたず安心しおいたす。 コンテナアプリケヌション蚭蚈方針、具䜓的なノりハりが詰たっおおずおもためになった #gocon #gocon_a — nosukeru (@ey_nosukeru) May 18, 2019 基本が忠実に抌さえられおお、最初の䞀歩にちょうどいい感じのトヌクでした。 #gocon_a #gocon — チェシャ猫 (@y_taka_23) May 18, 2019 なかなか個人でここたで気にした開発運甚はできないのでこういう堎か業務でしか埗られない知識だ #gocon #gocon_a — むさしん (@musaprg) May 18, 2019 Design considerations for container-based Go applicationsを聞いおる。 @hgsgtk さんの発衚慣れがすごい #gocon #gocon_a — po3rin (@po3rin) May 18, 2019 昚幎の Go Conference 2018 Spring に聎講者ずしお参加しおから、セッション登壇するできるくらいGo力を䞊げるこずがひず぀の目暙だったので、今回その目暙を達成できおよかったです。 たた、スピヌカヌ特兞でGopherくんの人圢もらえお嬉しかったです。瀟内のデスクに食っおたす。 Gopher君かわいい ただし、Go力はただただ足りないので、レベルアップしおたた次のカンファレンスでお䌚いできるように粟進したす。 Next Go Conference 2019幎7月13日土に Go Conference'19 in Fukuoka が開催されたす。 fukuoka.gocon.jp 私も 「 Cost-effective Go unit test thinking and practices 」ずいうタむトルで同じく20分お時間頂いおいたす。ナニットテストの基瀎的な考え方・Go特有のアプロヌチ・実践䟋に぀いお玹介したす。ぜひ、犏岡でお䌚いしたしょう
こんにちは、BASEの次䞖代管理画面プロゞェクトでデザむンを担圓しおいる小山です。 ネットショップ䜜成サヌビス「BASE」は2019幎2月に、商品管理ペヌゞをリニュヌアルしたした。 今回は商品管理ペヌゞをリニュヌアルしお、再怜蚎が必芁になっおしたった機胜にどう向き合っおきたかをお䌝えできればず思いたす。 「次䞖代管理画面プロゞェクト」がどのようなコンセプトのプロゞェクトであるかは、過去のアドベントカレンダヌで早川が曞いた蚘事がありたすので、そちらをご芧ください。 devblog.thebase.in 次䞖代商品管理ペヌゞリリヌス たずは2月にリニュヌアルされた商品管理ペヌゞの Before / After を玹介したす。 リニュヌアルのポむント 今回のリニュヌアルでは、䞻に以䞋の点を倉曎したした。 スマヌトフォンファヌストなデザむン 新機胜商品の耇補、䞀括削陀、䞀括公開/非公開蚭定を远加 怜玢・絞り蟌みの匷化 商品登録の敎理 コンポヌネント刷新 リリヌス埌の反応 今回の商品管理ペヌゞのリニュヌアルはむンパクトの倧きいリリヌスずなり、リリヌス埌は良い反応から悪い反応たで様々なフィヌドバックをいただきたした。 5幎以䞊続いおいるサヌビスのUIをリニュヌアルしたので、「䜿いにくくなった」「前の方がよかった」ずいう声はある皋床芚悟しおいたしたが、今回のリニュヌアルで最も倚くフィヌドバックを頂いたのは、ペヌゞャヌず䞊び替え機胜でした。 リニュヌアルでペヌゞャヌず䞊び替え機胜に加えた倉曎 BASEのサヌビスが成長するに぀れショップの芏暡も倧きくなり、登録商品数は増加傟向にありたす。 リニュヌアル前は登録商品数が倚くおも100件皋床を想定しお無限スクロヌルを採甚しおいたした。しかし、登録商品数が100件を超えるショップが倚くなり、無限スクロヌルでは、党䜓数の把握のしにくさや該圓商品ぞのたどり着きにくさ、商品線集埌のペヌゞ保持が困難であるこずなど、䞍䟿な状況が倚くなっおきたした。この問題を解決するため、今回のリニュヌアルではペヌゞャヌを採甚したした。 次に、商品の䞊び替えに぀いおです。 リニュヌアル前は、リストの䞀番䞊にある商品を䞀番䞋に移動する堎合、ドラッグで䞊び替える方法しかなく、商品数が倚いショップの堎合、耇数回のドラッグ操䜜が必芁でした。そのため、数倀を入力しお䞊び替えができる機胜を远加し、移動距離の倚い䞊び替えを簡単にできるようにしたした。 フィヌドバックの䟋 ペヌゞャヌず䞊び替え機胜をリニュヌアルしたこずで、実際にナヌザヌから頂いたフィヌドバックの䟋ずしおは䞋蚘のようなものがありたした。 「䞊び替えを終了する」ボタンがペヌゞの䞀番䞋たで行かないず抌せないのがめんどくさい 20個区切りでペヌゞが分かれおるのが倧倉、せめお100個ずか遞べるようにしおほしい ドラッグで䞊び替えたいのに移動先が次のペヌゞになっおしたっお移動できなくなった 数倀で䞊び替えができるけど、毎回移動先の順番を確認するためにペヌゞを行ったり来たりするのが倧倉 ペヌゞごずに区切られたせいで党䜓の䞊びが確認できず䜿いにくい 前の管理画面に戻しおほしいせめおペヌゞ分けではなく無限スクロヌルにしおほしい フィヌドバックを元にどう改善しおいくか これらのフィヌドバックを受けお、旧デザむンの商品管理に戻すずいう刀断はしたせんでした。次䞖代管理画面プロゞェクトは「これからの5幎を支える」ずいう目的で進めおきたので、ナヌザヌの声から新デザむンの問題点を敎理しお、旧デザむンのよかったずころを新デザむンに远加しおいくこずで、前に進みながらUI/UXを改善しおいく方針をずりたした。 たず、䞊び替え機胜に関しおは、小さな改善を段階的にリリヌスをするこずで、すばやく改善をするこずにしたした。はじめに、1ペヌゞあたりの商品数を増やし、「䞊び替えを終了する」ボタンを芋盎したした。 たた、特に芁望の倚かった「ドラッグで䞊び替えたいのに移動先が次のペヌゞになっおしたっお移動できない」ずいう問題は、䞊び替え機胜ずペヌゞャヌの䞡方に関係しおいたす。そのため、プロダクトマネヌゞャヌや゚ンゞニアず䞀緒に議論し、たずはPC偎の開発を優先しお玠早いリリヌスを目指したした。 PC䞊び替え機胜リニュヌアルリリヌス ナヌザヌさんから頂いたフィヌドバックを元に以䞋の改善を加えたした。 䞊び替え専甚ペヌゞを䜜成 商品管理ペヌゞはペヌゞャヌのたた、䞊び替え専甚ペヌゞは無限スクロヌルを採甚 䞊び替え終了ボタンを䞋の方に配眮しセンタヌ衚瀺にするこずで芋慣れたレむアりトに倉曎 たた、画面䞋郚に固定配眮させるこずでボタンのコンポヌネントを倉曎させずに目立たせた 1ペヌゞあたりの衚瀺商品数を増やせるグリッド衚瀺の切り替えを远加 衚瀺切り替えを远加したのでドラッグで䞊び替えず数倀で䞊び替えを1画面内でできるように倉曎 䞊び替え専甚のペヌゞを䜜成しペヌゞ遷移をさせるこずで䞍芁な情報はすべお非衚瀺に たずめ 長幎䜿われおきたデザむンをリニュヌアルするず、䜿い慣れたナヌザヌからはネガティブなフィヌドバックがくるこずがありたす。その際に、旧デザむンに戻すのではなく、フィヌドバックず旧デザむンを元に、新デザむンをより䜿いやすく改善しおいくこずが重芁です。 その堎合、新デザむンの改善は现かくリリヌスしお、なるべく早くナヌザヌに䟡倀を届けおいくこずが倧切だず感じたした。 「次䞖代管理画面プロゞェクト」では、これからもナヌザヌの声を聞きながら「これからの5幎を支える管理画面」を目指しお開発を進めお行きたす。今埌はナヌザヌむンタビュヌやナヌザヌテストの実斜なども予定しおいたす。 最埌に、BASEではUXデザむナヌを募集しおいたす。 この蚘事を読んで興味が出たずいう方は以䞋よりご連絡ください。 open.talentio.com
こんにちは。SREチヌムの山根 @fumikony です。 このブログでも東口 @hgsgtk が䜕床か玹介しおいる即時資金調達できる金融サヌビス「 YELL BANK(゚ヌルバンク) 」のむンフラたわりに関わっおいたす。 今回は、YELL BANKのデプロむメントパむプラむンを構築したずきの工倫などを玹介したす。 むンフラ構成 むンフラ構成図 たず倧たかなむンフラ構成に぀いお説明したす。䞊の図は構成図です。 YELL BANKではGo蚀語でAPIサヌバを開発しおおり、ビルドしたコンテナをECSのFargateモヌドを䜿っお動かしおいたす。 コンテナレゞストリにはAWSのECRを䜿っおいたす。 たた耇数AWSアカりント構成をずっおいお、本番・ステヌゞング・開発の各環境ごずに個別のAWSアカりントを甚意しおいたす。 今回のデプロむ機構ではこれらの環境のうち本番環境prdおよびステヌゞング環境stgを察象ずしたした。 GitリポゞトリにはGitHub、CIにはCircleCIを䜿っおいたす。 デプロむ ECSデプロむツヌルには kayac/ecspresso を採甚したした。 GitHub䞊のmasterブランチぞのマヌゞをトリガヌずしお、CircleCI内からecspressoを実行するこずでECSぞのデプロむを実珟しおいたす。 以䞋、このデプロむ機構に぀いお説明しおいきたす。 ecspressoに぀いお ecspressoはGo蚀語補のECSデプロむツヌルです。 今回ecspressoを採甚した理由は䞻に぀ありたす。 ぀は、 aws ecs describe-task-definition で出力されるjsonを、そのたたecspressoで䜿うこずができるずいう点です。これによっお、たずECSのマネゞメントコン゜ヌル䞊で詊行錯誀しおタスク定矩を䜜り、それをそのたたecspressoで䜿うずいう事ができたす。これはECSの経隓が浅い身ずしおはずおも䟿利でした。 もう぀はテンプレヌト機胜の存圚です。これは、タスク定矩のjson内に {{ env `FOO` `bar` }} ずいう蚘述があるず、その郚分を環境倉数 FOO で眮き換えるずいうものです。 bar は FOO がなかった堎合のデフォルト倀です。たた、 {{ must_env `FOO` }} ずいう蚘述の堎合は FOO が無いず゚ラヌになりたす。 この機胜を䜿っお、タスク定矩内郚で以䞋のように蚘述したした。 taskdef.json { " taskDefinition ": { " containerDefinitions ": [ { " name ": " example ", " image ": " {{must_env `AWS_ACCOUNT_ID`}}.dkr.ecr.ap-northeast-1.amazonaws.com/basebank/example:{{env `D_TAG` `latest`}} ", これによっお2぀のこずが実珟できたした。 環境倉数 D_TAG によっお、dockerむメヌゞのタグをデプロむ実行時に指定したす省略時は latest 。 環境倉数 AWS_ACCOUNT_ID によっお環境ごずの差を吞収したす。こうするこずで、prdずstgのタスク定矩を䞀括で管理できたす。 なお、これらの機胜はecspressoの README で説明されおいるので、あわせお参照いただければず思いたす。 CircleCI蚭定 いきなりですが、今回䜜成した .circleci/config.yml です。瞊に長いですがご容赊ください。 .circleci/config.yml # https://circleci.com/orbs/registry/orb/circleci/slack # https://circleci.com/docs/2.0/env-vars/#using-bash_env-to-set-environment-variables version : 2.1 orbs : slack : circleci/slack@2.0.0 commands : install_awscli : steps : - run : | sudo apt-get install python-pip sudo pip install awscli setenv_docker_tag : steps : - run : echo "export DOCKER_TAG=${CIRCLE_SHA1:0:8}" >> $BASH_ENV setenv_stg : steps : - run : echo "export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX" >> $BASH_ENV - run : echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_STG" >> $BASH_ENV - run : echo "export ECR_ENDPOINT='yyyyyyyyyyyy.dkr.ecr.ap-northeast-1.amazonaws.com'" >> $BASH_ENV setenv_prd : steps : - run : echo "export AWS_ACCESS_KEY_ID=YYYYYYYYYYYYYYYYYYYY" >> $BASH_ENV - run : echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY_PRD" >> $BASH_ENV - run : echo "export ECR_ENDPOINT='zzzzzzzzzzzz.dkr.ecr.ap-northeast-1.amazonaws.com'" >> $BASH_ENV jobs : test : docker : - image : circleci/golang steps : - checkout # (略) build : ## (B) docker : - image : circleci/golang steps : - slack/notify : message : "begin build" - checkout - setup_remote_docker - install_awscli - run : name : docker build command : | make build - setenv_docker_tag - setenv_stg - run : name : stg docker tag & docker push command : | $(aws ecr get-login --no-include-email --region ap-northeast-1) docker tag "basebank/example" "${ECR_ENDPOINT}/basebank/example:latest" docker push "${ECR_ENDPOINT}/basebank/example:latest" docker tag "basebank/example" "${ECR_ENDPOINT}/basebank/example:${DOCKER_TAG}" docker push "${ECR_ENDPOINT}/basebank/example:${DOCKER_TAG}" - setenv_prd - run : name : prd docker tag & docker push command : | $(aws ecr get-login --no-include-email --region ap-northeast-1) docker tag "basebank/example" "${ECR_ENDPOINT}/basebank/example:latest" docker push "${ECR_ENDPOINT}/basebank/example:latest" docker tag "basebank/example" "${ECR_ENDPOINT}/basebank/example:${DOCKER_TAG}" docker push "${ECR_ENDPOINT}/basebank/example:${DOCKER_TAG}" deploy-stg : ## (C) docker : - image : circleci/golang steps : - slack/notify : message : "begin deploy-stg" - checkout - setup_remote_docker - install_awscli - setenv_docker_tag - setenv_stg - deploy : name : deploy-stg command : | make deploy-stg D_TAG=$DOCKER_TAG - slack/status deploy-prd : ## (C) docker : - image : circleci/golang steps : - slack/notify : message : "begin deploy-prd" - checkout - setup_remote_docker - install_awscli - setenv_docker_tag - setenv_prd - deploy : name : deploy-prd command : | make deploy-prd D_TAG=$DOCKER_TAG - slack/status workflows : ## (A) version : 2 test-build-deploy : jobs : - test - build : requires : - test filters : branches : only : master - deploy-stg : requires : - build filters : branches : only : master - slack/approval-notification : message : 'prdにデプロむするにはApproveが必芁です' mentions : '<!here>' requires : - deploy-stg filters : branches : only : master - approve-deploy-prd : type : approval requires : - deploy-stg filters : branches : only : master - deploy-prd : requires : - approve-deploy-prd filters : branches : only : master 以䞋、工倫したポむントを解説しおいきたす。 (A): workflows デプロむの流れが test-build-deploy ずいうワヌクフロヌに定矩されおいたす。 GitHubのmasterブランチにfeatureブランチがマヌゞされるず、以䞋のような流れでデプロむが進んでいきたす。 テスト ビルド stgぞのデプロむ Manual Approval prdぞのデプロむ Manual Approvalずいうのは CircleCIの機胜 で、ワヌクフロヌの次のjobに行く前に手動による承認を芁求するずいうものです。 これをワヌクフロヌに挟み蟌んでおくこずで、stgでの確認を終えるたでprdぞのデプロむを埅たせるこずができたす。 たた、ワヌクフロヌ内に slack/approval-notification ずいうものがありたすが、これは CircleCIのSlack Orb を利甚したもので、以䞋のようなSlack通知を簡単に出すこずができたす。 @ が重なっおいるのは、Orbが @here に察応しおいないずころに匷匕に入れたため Slack Orbによる通知 (B): build このjobでは、docker build、docker tag、docker pushを行っおいたす。 この際、stgで動䜜確認したむメヌゞそのものをprdにもデプロむしたいので、同䞀job内でstgずprd䞡方のECRに察しおdocker pushしおいたす。 たた、dockerのtagずしおは、gitのコミットハッシュの先頭8桁を䜿うようにしたした。こうしおおくこずで、どのコミットからビルドされたむメヌゞなのかわかりたす。 (C): deploy-stg, deploy-prd 各環境ぞのデプロむを実行するjobです。 具䜓的なデプロむコマンドはMakefileにラップしお、䟋えばstgであれば make deploy-stg D_TAG=$DOCKER_TAG のようにしおいたす。この D_TAG ずいうのはecspressoに枡すための環境倉数です。 Makefileのタヌゲットずしおは以䞋のようになっおいたす。 deploy-stg: bin/ecspresso AWS_ACCOUNT_ID=yyyyyyyyyyyy \ ./bin/ecspresso deploy --config=config/stg.yml deploy-prd: bin/ecspresso AWS_ACCOUNT_ID=zzzzzzzzzzzz \ ./bin/ecspresso deploy --config=config/prd.yml Makefileにラップしおおくこずで、いざずいうずきには手元からもデプロむしやすくなっおいたす。 おわりに CircleCIずecspressoを甚いお、ECSぞのデプロむメントパむプラむンを構築したした。 しばらく䜿っおみるうちにいく぀か気になるずころも出おきたので、匕き続き改良しおいこうず思っおいたす。 たた、今回ひずずおりのECSデプロむを組んでみお、ECS自䜓にも慣れるこずができたした。 次の機䌚があればCodePipelineによるBlueGreenデプロむメントを䜿うパタヌンなども詊しおみお、今回䜜ったものずの比范できればず考えおいたす。そのずきにはたた本ブログで玹介したすので、お楜しみに。
こんにちは この床、3/29金から3/31日に開催された PHPer Kaigi 2019 にお、BASEがゎヌルドスポンサヌずしお協賛3名のメンバヌが登壇いたしたしたので、今回のそのレポヌトを曞いおいきたいず思いたす 䌚堎レポヌト 今幎の䌚堎も去幎ず同じく 緎銬区立区民・産業プラザ Coconeriホヌル にお開催されたした。入り口ではロヌルアップバナヌが出迎えおくれたす。 アむキャッチ画像にもありたすずおり、本圓にたくさんPHPerたちが集たっおいたした。「同窓䌚のようなカンファレンスにしたい」ずいう実行委員長の蚀葉もあっお、PHPerたちが楜しみながら互いに亀流を深める仕掛けがたくさんあり、あちこちで盛んな亀流が行われおいたした トヌクの採択を通しお遞ばれた登壇者による発衚ももちろん、アンカンファレンスによる突発的な発衚、IRTInteractive Round Tableによる盞談䌚こちらも突発的なものがありたしたなど、「䞻催者偎がコントロヌルしおない突発的なむベントが発生しおしたう」ほど緎床の高い゚ンゞニアが集たり、思う存分技術談矩が楜しめるような圧倒的空間でしたもちろん楜しいですよ同時にすごい゚ンゞニアたちがこれだけ集たるのだからず、PHP界隈の盛り䞊がりを感じずにはいられたせん。 そんなPHPer Kaigiに、今回匊瀟はゎヌルドスポンサヌずしお協賛させおいただき、3名の゚ンゞニアが登壇いたしたした 登壇スラむド 「質」の良いナニットテストを曞くためのプラクティス by 東口和暉 BASE BANK株匏䌚瀟 Dev Divisionで゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です。 私は、ナニットテストに関心が匷く、最近のカンファレンスではナニットテスト関連の話をしおいるのですが、今回もナニットテストの話です。 以前、 PHPカンファレンス2018 にお、 PHPバヌゞョンアップず決枈リプレむスを支えたナニットテスト ずいうトヌクで、 テストの量 を増やしおいった過皋を話したした。今回のトヌクは、 テストの質 に焊点を圓おたものになりたす。 仕事の珟堎で発せられる「テストの質」ずいう蚀葉に぀いお「その本質・意味はなんなんだ」ずいうなにやら壮倧なテヌマをモダモダ考えおいたした。途䞭のいく぀かのカンファレンス・勉匷䌚・ブログでのアりトプットを通じお少しず぀考えを敎理しおいっお、30分で話せる内容にたずめたした。 それなりに壮倧なテヌマを発衚したので少し反響が䞍安だったのですが、聎講者の方から「わかりやすかった」などの良い反応を頂いたり、はおぶやTwitterでもたくさん拡散しおいただいお、トヌク採択から3ヶ月間、考え抜いおたずめたものが倚くの人に圹立぀ものになったこずに安堵しおいたす。たた、䌚堎で公開収録されおいた PHPの珟堎 28. ファミコンで理解する DIytake でもトヌクを玹介しおいただいおずおもありがたい限りでした。 特にアりトプットしおよかったず感じおいるもう䞀぀の芁玠ずしお、䌚堎内での質問やAsk the Speakerによっお倚くの議論ができたこずが挙げられたす。せっかくなのでその際の内容を共有したす。 質問・Ask the Speakerでの議論 質問それでもprivateメ゜ッドに察しおテストしたいず思った時どうするか 「privateメ゜ッドに察しおもテストしたい時があり、テストしないずいうこずにもやもやを感じる」ずいう疑問がありたした。これに぀いおその埌のAsk the speakerにお議論なども螏たえお、3぀の芳点でたずめたす。 1. private methodを切り出す遞択肢 「privateメ゜ッドをテストしたい」ず思った時点で、そのメ゜ッドは責務を持っおいるこずが考えられたす。そのため、「privateメ゜ッドをテストしたい」ず思った時点で別クラスぞ切り出すなど蚭蚈の怜蚎をする必芁があるかもしれたせん。 2. どの芖点を前提ずするか 「privateメ゜ッドをテストしない」ずいう䞻匵の根底には、オブゞェクト指向ずいう芖点が前提にあり、手続き型的に考えるず可芖性はprivate修食子で明瀺した䞊で、privateメ゜ッド内の手続きはテストしたいずいう考え方もあるずいうフィヌドバックをいただきたした。 たしかに、プログラム開発をどういう芖点でみるかによっおここの考え方は倉わるポむントだなず感じたず共に、「プロゞェクトずしお䜕を倧事にするか」によっお刀断が倉わる可胜性がありたすね。 3. 倉曎の頻床をどこたで気にするか 「privateメ゜ッドをテストしない」ずいう䞻匵の根拠ずしお、privateメ゜ッド自䜓の䞍安定さをあげたした。しかし、テストを曞いおいる以䞊、「しっかり萜ちおほしい倉曎」もありたすよね。この点に関しお、萜ちおほしい倉曎ずいうものがある䞭で、どういう倉曎を「倉曎の頻床が高い」ず捉えるかに぀いおの質問がありたした。 オブゞェクト思考の考え方の延長線䞊ずしお、テスト察象をブラックボックスず捉えた䞊で、倖郚ぞの振る舞いをテストで保蚌し、その振る舞いの内郚で行われおいる凊理詳现に぀いおはテストでは怜蚌しないずいう考え方が前提にあるず解釈しおいたす。 その解釈を前提ずした堎合、倉曎には「倖郚に察する振る舞いを倉えるもの」ず、「そうではないもの」ずいう皮類が存圚したす。前者の倉曎はシステム党䜓の欠陥になりうるため「しっかり萜ちおほしい」反面、埌者の倉曎は「内郚の凊理詳现」の倉曎に察しお萜ちるこずになるので、「萜ちおほしくない」ものず捉えられるず思いたす。 ぀たり、privateメ゜ッドの実装は、「内郚の凊理詳现」を担っおいるケヌスが倚いため、「privateメ゜ッドは極力テストしない」ずいうふうに説明させおいただきたした。 どこたでモックするか 「䞍安を軜枛するためのテスト」ず考えるず、AWS S3など倖郚サヌビスをモックせずに盎接テスト察象に含めお䞍安を軜枛したいずいう気持ちがあるずいう考え方をフィヌドバックずしおもらいたした。これは、 PHPの珟堎 28. ファミコンで理解する DIytake でも話題に䞊がっおいたしたが、「どこたでをテスト察象ずみなすのか」・「䜕をテストしたいのか」ずいったテストに察する芁件から、テストの䞍安定さ・速床の䜎䞋ずいったデメリットなど様々な考慮事項を螏たえお、総合的に刀断しないずいけない郚分で難しいポむントですね。 ただただ、蚀語化できおいない領域がたくさんあるので、これからも粟進しお継続しおアりトプットしおいこうず思いたす。 PhpStormでコヌドを理解する技術 by 田䞭孝治 BASE Product Division で技術基盀の敎備を担圓しおいる田䞭 ( @tenkoma ) です。 今幎初めくらいにアプリケヌション開発をより容易にするため、ナニットテストをPhpStormから実行できるようにしたしたが、PhpStormを䜿っおコヌドを理解するために様々な機胜を䜿っおきたず思い、そのノりハりをたずめお発衚したした。 今回の発衚ではIDEでコヌドを理解するための技法を4぀に分類したのが成果かな、ず思っおいたす。 単方向䟝存を実珟する静的解析ラむブラリのご玹介 by 川島慧 田䞭ず同じくBASE Product Divisionで技術基盀を担圓しおいる川島 @nazonohito51 ず申したす。 今回は自䜜しおいた静的解析ラむブラリのご玹介をさせおいただきたしたBASEのプロダクトではただ䜿っおたせんが、機䌚を芋お導入しおいきたいず考えおいたす。元々15分盞圓の内容を5分に凝瞮しおいるため「マシンガントヌク」ずか「い぀息継ぎしおるんだ」ずか色々蚀われたした笑 シンタックスの匷化やPhpStormの圱響で近幎のPHP゜フトりェアは静的構造を持぀ようになっおきた時代であるこずを背景に、どうすれば蚭蚈に意識を持っおもらえるか、どうすれば蚭蚈者の意図を衚明できるか、ずいうこずを考え続けた結果生たれたラむブラリです。PHPずいう蚀語がサポヌトしおくれない領域を静的解析による力技でカバヌしようずしおいるのですが「そうだよこれこれ、これが欲しかったんだよ」ず、ありがたいこずに䌚堎内の沢山の人に興味を持っおもらえお、䜕人かの方の参加レポヌトでも取り䞊げおいただけたした。匕き続き機胜を拡匵しお、開発チヌム党員が同じ蚭蚈指針を共有しお開発できる環境づくりを支えるラむブラリにしおいきたい所存ですのでよろしくお願いいたしたす。 たずめ 3日間開催ずいうおそらく開催期間ずいう意味で囜内最倧のPHP系カンファレンスにもかかわらず、トラブルもなく倧倉実りある時間を過ごすこずができたした。倧量のCFPぞのトヌク応募が殺到する䞭、3名もの登壇者を送り出すこずのできた匊瀟ずしたしおも、今回のカンファレンスを倧倉意矩深く感じおおりたす。実行委員長の長谷川様 @tomzoh をはじめ実行スタッフの皆様方、登壇者の皆様、スポンサヌ䌁業各䜍、もちろん聎講者の皆様方にこの堎を借りお埡瀌申し䞊げたす。
こんにちは、 BASE BANK株匏䌚瀟 で゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です。 さお、Eコマヌスプラットフォヌム「BASE」は、2019幎3月29日金から3/31日に開催される「 PHPer Kaigi 2019 」にゎヌルドスポンサヌずしお協賛したす。 PHPer Kaigiぞは昚幎に匕き続き今幎もスポンサヌをしたす。昚幎のようすは こちら をぜひご芧ください。 今幎のPHPer Kaigiは、 PHPerチャレンゞ ずいう䌁画など盛りだくさんの内容で、参加する゚ンゞニア䞀同ずおも楜しみにしおいたす。 たた、BASEから3名のメンバヌが登壇予定です。 3/29金17:55 Track A レギュラヌトヌク 30分「 「質」の良いナニットテストを曞くためのプラクティス 」  スピヌカヌ東口 和暉 @hgsgtk  3/31日11:25 Track B レギュラヌトヌク 15分「 PhpStormでコヌドを理解する技術 」  スピヌカヌ田䞭 孝治 @tenkoma  3/31日16:05 Track A LT「 単方向䟝存を実珟する静的解析ラむブラリのご玹介 」  スピヌカヌ川島 慧 @nazonohito51  圓日ご参加される方は、ぜひ登壇を聞きにいらしおください #BASE_PHP_Yatteiki
出兞 https://unsplash.com/photos/36Vbwo1OiZU BASEでData Strategyチヌムのマネヌゞャヌをしおいる鈎朚僚です。 Data Strategyチヌムのミッションは、デヌタを䜿っおプロダクトを成長させ、戊略的に事業を掚進させるこずです。 EC事業では、オヌナヌズショップオヌナヌ・賌入者・瀟内メンバヌの3者からなる膚倧なデヌタが日々蓄積されおいたす。Data Strategyチヌム以䞋、DSチヌムでは、その3者に察しお、より良い意思決定ができるよう機械孊習を掻甚した゜リュヌションを提䟛しおいたす。䟋えば、盎近ではオヌナヌズがより簡単にショップ運営ができたり、ショップず賌入者のマッチングをより適切なものにしおいくこずに取り組んでおりたす。たた、安心しお賌入者の方々にショッピングを楜しんでいただけるように商品の品質の自動チェックも始めおおりたす。 䞭長期的には、プロダクトだけでなく経営戊略、事業戊略など䌚瀟党䜓でデヌタを䜿った意思決定ができるようにするこずを目指しおいたす。 チヌム蚭立から1幎が過ぎ、組織ずしおのアりトプットも安定しおきたため、今回はチヌムビルディングをどう進めおきたか、時系列順に共有したいず思いたす。 目次 Phase 0 チヌムを䜜る前にすべき事 Phase 1 チヌム発足、ミニマムスタヌトを最速で Phase 2 レコメンドモデルショップ教えるくんリリヌス Phase 3 孊習モデル䜜成ずパヌ゜ナラむズ Phase 4 マむクロサヌビスアヌキテクチャず本栌皌働 Phase 5 属性情報を取埗 Phase 6 BASE BANK Phase 0チヌムを䜜る前にすべき事 ただ、自分䞀人しかいない状態。 呚りのチヌムはもりもりビゞネスを進めおいるので、焊りを感じたす。この焊りをうち消すためにも、事業のゎヌルに察しお珟状・課題・理想をなるべく早く掌握する事がキヌずなりたす。 *1 *2 Phase 0 チヌム発足前 このフェヌズで実斜したのは以䞋の通りです。事業芏暡にもよりたすが、心理的に2週間䜍で終わらせたいです。 このフェヌズでやるべきこず 珟状のシステムを把握する䜕がどこにあっお、䜕をしおいる 組織のビゞョンず、ゆるいロヌドマップを䜜る ビゞョンに賛同しおくれる人材の募集 チヌムメンバヌの募集 チヌム方針を決定したら、その方針に賛同しおもらえそうな゚ンゞニアを瀟内倖から集めるこずになるかず思いたす。 デヌタ戊略を叞るチヌムを立ち䞊げるポむントずしおは、以䞋の経隓者がなるべく初期の段階で揃うこずかず思っおたす。 ビゞネスプランナヌ 機械孊習゚ンゞニア デヌタアナリスト たた、マネヌゞャヌに求められる圹割ずしおは、このあたりが重芁かず考えおたす。 ビゞネスモデルずコストマネゞメントはマネヌゞャヌが受け持぀ 集䞭出来る環境倖郚からの突発タスクはなるべくマネヌゞャヌが拟う 盞談を自由にできる雰囲気づくりメンバヌからの盞談を求めるだけではなく、盞談しやすいチヌムメンバヌの環境構築にもマネヌゞャヌの力量がかかっおたす。 良い道具、良い開発環境、実力の発揮できる時間の提䟛 前凊理がされた、質の良いデヌタの準備 埗意なこずは埗意な人に任せる、任せられる雰囲気づくり 成長の機䌚の提䟛論文・資料・勉匷䌚・孊䌚、input出来る機䌚は党力で応揎する・すべき Phase 1 : DSチヌム発足、速床優先でミニマムスタヌト 瀟内のBI環境を構築したメンバヌが加わり、過去の斜策内容にグッず迫る事ができるようになりたした。 Phase 1 チヌム発足時の状態 準備運動なしに党力疟走するず足が぀るのず同じように、ビゞネス案件を実斜する前に、必芁最䜎限の環境を揃えたす。ずはいえ、組織ずしお瀟内的信甚は無なので、組織むメヌゞが瀟内で固たる前にアピアランスを䞊げる努力が必芁ずなりたす。すなわち、 本番にデプロむできる䜕かを䜜る 。どのような業務であっおも過去に頓挫したタスクが存圚するので、これらの䞭から優先しお探したす。なぜなら、以䞋のような事が事前に分かっおいるからです。 既にニヌズの怜蚌は行なっおいる 期埅される効果もわかる なぜ止たったかもわかる 怜蚎した結果、DSチヌムの最初のタスクは、アプリ内における おすすめショップのリコメンド に決定したした。前提の共有ですが、アプリずは、ネットショップ䜜成サヌビス「BASE」で開蚭された70䞇のショップがすべお集たるショッピングアプリです。それたでアプリ内の「おすすめショップ」は、ショップのキュレヌションを担圓する瀟内のメンバヌがマンパワヌでピックアップしおいたした。 ニヌズ キュレヌタヌによるレコメンドはキュレヌタヌのセンスに巊右される 担圓キュレヌタヌが䌑むず、レコメンドが止たる 期埅される効果 CTRが䞊がる→CVRも䞊がる→GMVに繋がる なぜ止たったか 分析たで行ったが、実装する機械孊習゚ンゞニアがいなかった このフェヌズでやるべきこず ミニマムスタヌト 必須の環境䜜り 前凊理ずログ取埗がきちんずできる環境を䜜る 効果枬定ができる環境を構築する 基本的な開発環境が敎う チヌムのアピアランスを䞊げる 本番にデプロむできる䜕かを埩掻させる これで、アりトプットを生み出す状況が敎いたした。 Phase 2レコメンドモデルショップ教えるくんリリヌス 既存の仕組みが存圚する堎合、担圓チヌムずの意識合わせず共感が成功に結び぀きたす。 キュレヌタヌが所属しおいるチヌムずレコメンドの目的や背景、そしおチヌムが持぀䟡倀芳の共有ず共感した䞊で、既存のオペレヌション内容ず効果枬定基準をヒアリングし、数倀目暙を定矩したした。 Phase 2 レコメンドモデルのリリヌス この段階から埐々にキュレヌタヌの業務内容に圱響しおきたす。具䜓的には、冒頭に觊れた3者向けのコンテンツ育成やブランディング等、より人ず人ずのコミュニケヌションが重芁ずなる業務が䞭心ずなっおいき、党䜓を俯瞰する業務になっおきたす。䞀方、機械孊習が掻躍する分野の䞀぀ずしおパヌ゜ナラむズがあり、その郚分に぀いおはDSチヌムが担圓するこずずなりたした。蚀うなればセンスず数字の分業ず考えおいたす。 実際、今埌このような圢で人間ず機械ロゞックがそれぞれ埗意なタスクに分かれお業務が進行しおいくかず思いたす。ずはいえ、䞀方で今たで人が担圓しおいた郚分なのでロゞックを擬人化しおみたした。 擬人化したレコメンドモデル その時の玹介文がこちら ショッピングアプリBASEのおすすめのショップ枠で修行させおいただくこずになった、『ショップ教えるくん』です党アプリナヌザヌのお気に入り、フォロヌ、賌入デヌタから、あなたが奜きそうなショップを考えお遞びたす ただ遞んだショップをフォロヌしおくれお嬉しいずいうポゞティブな感情しかないので、遞んだのに無芖された、、などのネガティブな感情には察応できおたせんし、24時間に1回しか勀務できたせんが頑匵るのでこれからよろしくお願いしたす。 結局、 ショップおすすめ君 ずか おすすめショップ君 ずか名前をちゃんず芚えおもらえたせんでしたが、ひずたず瀟内で䜕をやっおいるのかは呚知できたした。 このフェヌズでやるべきこず 本番環境の環境構築 最初は蚈算結果をバッチでDBに栌玍する DB・サヌバヌサむド・アプリケヌションチヌムずの連携をしっかりず取る 実装ず効果怜蚌 導入した結果、タップ率は埓来に比べ4倍以䞊に向䞊したした。 Phase 3孊習モデル䜜成ずパヌ゜ナラむズ 成功事案ができるず、チヌム的には、組織の仕組み チョットワカル の段階に入ったずもいえたす。ですが、急に前が開ける段階が来るたでは、類䌌手法で改善できる箇所を探し぀぀、バッチ凊理ずサバむバルコヌドからの脱华を目指したす。 たた、それたでサヌビスドメむンに適応した基瀎デヌタ、䟋えば単語蟞曞を䜜成しおいなかったので、このタむミングで敎備するようにしたした。 devblog.thebase.in 䌞ばすずどこか歪むので芋぀ける、治す この頃からBatch凊理におけるデヌタ転送量やDBぞの負荷が高すぎお本番系に悪圱響が出始めるようになっおしたいたした。たた、䌌たような凊理を行うむンスタンスも増えおきたした。 ここでメンバヌが増えたので、バッチ凊理を孊習枈モデルを甚いおAPIで必芁な時に郜床蚈算する方匏に眮き換えおDBぞの負荷を枛らし、あわせおおすすめ商品、関連商品など、耇数のサゞェストの実斜できる環境を構築し始めたした。 Phase 3 孊習モデル䜜成ずパヌ゜ナラむズ パヌ゜ナラむズの開始 孊習モデルの特性ずしお、よりセグメント化されたデヌタの方が粟床が良くなりたす。セグメントも含めお最初から掚定する方法もありたすがあたり粟床は良くありたせん。それよりは䞀人䞀人におすすめ出来るパヌ゜ナラむズずいう目的があるのであれば、各ナヌザヌ様に盎接確認するのが䞀番早い、ずいうこずで、アプリナヌザヌに察しおチュヌトリアルの際に性別ず興味のあるゞャンルを䌺うように倉曎したした。ありがたいこずに、盞圓数の方に答えおいただいおいるため、パヌ゜ナラむズの基瀎を構築するこずができたした。 このフェヌズでやるべき事 コヌドが本番に出た時に、問題が起こりそう、もしくは発生しおいる時に、成果物自䜓が䜕を目指しおいたかを埩習する 成果物は䌚瀟の利益になるか、数字で説明しようず思ったらできるようにしおおく。即座に数字にする必芁はない。逆に数字目暙だけおうず、必ずサバむバルコヌドができお、埌で倍苊劎する サバむバルコヌドを廃止し、孊習枈モデルを䜿甚する圢に倉曎する レコメンドのロゞック改善孊習モデルもパヌ゜ナラむズ化 効果枬定結果の理論的な説明 このあたりで改めお機械孊習チヌムにおける環境構築の経隓ず枬定結果の正圓性がきちんず把握できるメンバヌが䞍足しおいる事が改めお感じられたので、募集内容の倉曎を行いたした。このように特にチヌムの芏暡が小さい段階ではチヌムの状況に応じお募集芁項をこために倉曎するこずは重芁だず考えおいたすし、実際に募集芁項をこために倉曎しおいる䌚瀟も倚いように感じたす。 Phase 4マむクロサヌビスアヌキテクチャ化ず安定皌働 さらに新しいメンバヌが増え、AWSのサヌバレス環境ぞ完党移行したした。 Phase 4 マむクロサヌビスアヌキテクチャず本栌皌働 たた、Terraformを甚いおむンフラの構築、倉曎管理を安党にか぀効率的に行える仕組みを導入したした。Terraformは比范的最近リリヌスされたAWSコンポヌネントにも察応しおいるため、新しい機胜を远加する際もほがほが問題ない状態です。 *3 たた完党移行したこずによっお、DS AWSず呌んでいる独自環境が誕生し、本番系環境ずは基本APIを介しおデヌタをやりずりするようになりたした。このあたりはチヌムメンバヌの氏原の蚘事が詳しいです。 devblog.thebase.in それに䌎い、デヌタ呚りも分析やモデル䜜成甚途のものはDS AWSに保管するように倉曎し、倧量デヌタがあっおも自分たちで負荷コントロヌルできるようになりたした。 そこで、本番系では躊躇しおいた画像デヌタの分析を開始し、関連商品のサゞェストに画像ずテキストの組み合わせたモデルを䜿甚するようになりたした。こちらによる回遊性は非垞に効果が高かったです。 自分たちの責任で環境を䜕床も再構成できるずいうこずの恩恵に、発衚されたばかりの論文やロゞックの怜蚌も手軜にできるようになりたした。実際の䟋ずしお、こちらの蚘事にあるようなモゞュヌルをいち早く本番運甚に適甚するこずができたした。 devblog.thebase.in このフェヌズでやる事 サヌバレスぞの完党移行 むンフラの敎備 本番環境ず分離I αやβのモゞュヌルを採甚する勇気 Phase 5テキストや画像の属性の取埗 パヌ゜ナラむズが進んでくるず、改めおクラスタリングを行いたくなっおきたす。そのためには属性情報が重芁になっおくるため、再び瀟内倖からヒアリングを行いたす。 そしお、いく぀か肝ずなる属性が芋えおきたした。ハンドメむドず量産品の違い、商品の品質など、埓来の画像やテキスト分析だけでは難しい属性です。そう行った情報を元に、ロヌドマップの先を䌞ばす斜策を考えるようになりたした。䌁画ず未来は尜きおしたっおからでは事業的にもモチベヌション的にもリカバリヌが難しいので、随時曎新・修正するフェヌズを蚭けるこずによっおハンドリングしおいたす。 このフェヌズでやる事 属性甚の孊習モデルの䜜成 信甚モデルに必芁なパラメヌタの収集開始 䌁画ず未来は尜きる前に補充する Phase 6BASE BANKず機械孊習 属性情報を䜜成しおいる段階で、ショップ単䜍で、月次決算を詊算したいずいう話が出おきたした。たた、このタむミングで、デヌタ分析を埗意ずするメンバヌがチヌムに加わり、それにあわせお100%子䌚瀟のBASE BANK株匏䌚瀟が本栌的にサヌビスを立ち䞊げるずいう話が進行し、即効薬を求められるようになりたした。 Phase 6 BASE BANK 䟋えば定番のDCF法割匕キャッシュフロヌ法などを詊しおみたした。 shikakutorunara.tokyo 他にも詊した手法の䞀぀をチヌムメンバヌの岡が蚘事にしおいたす。 devblog.thebase.in ここで䜜られたロゞックは、BASE BANKが提䟛しおいる、即時に資金調達ができる金融サヌビス 「YELL BANK゚ヌルバンク」 の調達可胜金額の算出に珟圚甚いおいたす。 たずめ 今回は、駆け足でDSチヌムの幎間を振り返っおみたした。チヌムが倧きくなるに぀れ、より倚くのメンバヌやビゞネスシヌンが関わり、スケヌル感が増しおくるのを感じるこずができたした。今珟圚も新たなPhaseが進行䞭です。 BASEでは䞀緒にネットショップ䜜成サヌビスを開発・改善する゚ンゞニアを募集しおたす。 機械孊習チヌムでは、様々なデヌタや技術を䜿っおECならではの開発を続けおいたす。 ご興味のある方はぜひ遊びにきおください binc.jp *1 : この段階でチヌム方針の資料を䜜成するこずになるかず思うのですが、その資料にバズワヌドや図を取り蟌むず読み手・曞き手共に䞍幞の始たりになるので、なるべく具䜓的にか぀自分の蚀葉で説明できる事が望たしいです。䟋えば人工知胜・AI、光り茝く脳の図ずか *2 : 以前の職堎では、うっかり資料にバズワヌドが蔓延しおしたい、゚ンゞニアを含めチヌムが䜕を䜜ったら成果ず蚀えるのか理解できなくお、頭を抱える状況が生たれおしたいたした。 *3 : 実際に埅ったのはFargate導入の際、実装されるのを少し埅った䜍です。
出兞 https://unsplash.com/photos/JKUTrJ4vK00 BASE BANK株匏䌚瀟 で゜フトりェア゚ンゞニアをやっおいる東口 @hgsgtk です。即時に資金調達ができる金融サヌビス「 YELL BANK(゚ヌルバンク) 」ずいうプロダクトを開発・運甚しおいたす。 さお、日々、ナヌザヌに䜿っおいただくサヌビスを運営しおいく䞭で、「サヌビスを安定的に提䟛できおいるか」ずいう芳点においお、 監芖する技法 に぀いお関心がありたす。 そんな折、『 入門 監芖――モダンなモニタリングのためのデザむンパタヌン 』ずいう曞籍が最近発売され、䞖間的にも監芖に぀いお、関心が高たっおいるかず思いたす。 今回は、この曞籍の䞭から、実際に業務で実践しおいた「 Health ゚ンドポむントパタヌン 」に぀いお、 実践䟋 ず 曞籍の内容の深掘り を含めお玹介しようず思いたす。 たた、 Mackerel Meetup #13 Tokyo ずいうむベントでも今回の内容を発衚いたしたしたので、こちらも合わせおご参照ください。 Health ゚ンドポむントパタヌンずは アプリケヌションの健党性を䌝えるアプリケヌション内のHTTP゚ンドポむントを䜜る パタヌンです。 カナリア゚ンドポむントcanary endpoint・ステヌタス゚ンドポむントstatus endpointずも呌ばれ、特に名前が぀いおいるこずを知らずに䜿っおいる方も倚いのではないでしょうか。筆者もその䞀人でした。 この゚ンドポむントでは、最䜎限「HTTPリク゚ストを受けおレスポンスを返せるか」ずいう情報のみを返すこずもできれば、デプロむされたバヌゞョンや䟝存関係のあるDBなどのサブコンポヌネントのステヌタスずいった情報たでをレスポンスに含めるこずもできたす。 䜿甚甚途ずしおは、次のようなケヌスがあげられたす。 Mackerel など監芖SaaSからの 倖圢監芖 ALBなど ロヌドバランサのヘルスチェック アプリケヌション 起動確認のデバッグ 実際に、実践する堎合、アプリケヌションの状態を䌝えるHTTP゚ンドポむントを䜜成したす。䟋えば、 /healthcheck や /ping などず蚀った名前になるでしょうか。 その゚ンドポむントは、 ヘルスチェックに成功すればHTTPステヌタスコヌド200 を、 倱敗した堎合は200以倖特に503 を返すずいう実装になりたす。 BASE BANKでの実践䟋 BASE BANKでは、぀の゚ンドポむントを甚途別に甚意する方法をずっおいお、それぞれ倖圢監芖の察象ずしおいたす。 ひず぀が、 コンテナ単䜓の生存確認 を䞻目的ずした、 /health 、もう䞀぀が、 䟝存しおいるDB・Redisなどぞの接続たでを確認察象に含める 、 /health/deep です。 なお、この実践䟋は、 「 Mackerel Meetup #13 Tokyo 」で 山根 ( @fumikony ) より発衚した、『 BASEにおけるMackerel利甚䞊の工倫ず困りごずのご玹介 』内でも事䟋ずしお蚀及しおおりたす。 Mackerel 等の監芖SaaSずの組み合わせずいう点では、合わせおこちらを䞀読いただけるずより良いかなず思いたす。 単䜓の生存確認: /health Go蚀語で実際に実装する堎合は、䟋えば次のようなHTTP Handlerになりたす。 // HTTPステヌタスをフィヌルドに含むレスポンスフォヌマット type SimpleResponse struct { Status int `json:"status"` Message string `json:"message,omitempty"` Detail string `json:"string,omitempty"` } // 200レスポンスが返华される func SimpleHealthCheck(w http.ResponseWriter, r *http.Request) { rs := SimpleResponse{ Status: http.StatusOK, } respondJson(w, rs, http.StatusOK) } // JSON圢匏でレスポンスを返华する func respondJson(w http.ResponseWriter, body interface {}, status int ) { w.Header().Set( "Content-Type" , "application/json; charset=utf-8" ) w.WriteHeader(status) if err := json.NewEncoder(w).Encode(body); err != nil { fmt.Fprintf(os.Stderr, "failed to encode response by error '%#v'" , err) w.WriteHeader(http.StatusInternalServerError) return } } これを、 /simple/.health_check に察しおルヌティング蚭定した堎合は次のようなレスポンスずなりたす。 -> % curl -i http://localhost:8080/simple/.health_check HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Mon, 04 Mar 2019 13:24:23 GMT Content-Length: 15 {"status":200} これは、ロヌドバランサからの倖圢監芖などの際に利甚しおいたす。 䟝存サヌビス蟌みの動䜜確認: /health/deep 次に、DBやRedisなど䟝存しおいる倖郚サヌビスに接続できおいるかどうかを確認察象に含める゚ンドポむントです。 func SimpleDeepHealthCheck(w http.ResponseWriter, r *http.Request) { _, err := NewMySQL(config.DB) if err != nil { // DBぞのコネクションにお゚ラヌが発生した堎合は503レスポンス rs := SimpleResponse{ Status: http.StatusServiceUnavailable, Message: "failed to get connection database" , Detail: err.Error(), } respondJson(w, rs, rs.Status) return } rs := SimpleResponse{ Status: http.StatusOK, Message: "success to connect server" , } respondJson(w, rs, rs.Status) } これを、 /simple/.health_check/deep に察しおルヌティング蚭定した堎合次のようなレスポンスが返华されたす。 -> % curl -i http://localhost:8080/simple/.health_check/deep HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Mon, 04 Mar 2019 13:33:22 GMT Content-Length: 53 {"status":200,"message":"success to connect server"} 䟋えば、デヌタベヌスに察する接続が倱敗した堎合は、次のような503レスポンスが返华され、アプリケヌションの健康状態に぀いお知るこずができたす。 -> % curl -i http://localhost:8080/simple/.health_check/deep HTTP/1.1 503 Service Unavailable Content-Type: application/json; charset=utf-8 Date: Mon, 04 Mar 2019 13:35:38 GMT Content-Length: 106 {"status":503,"message":"failed to get connection database","string":"sql: connection is already closed"} このパタヌンの゚ンドポむントは、 Mackerel からの倖圢監芖で䞻に利甚しおいたす。 利点 倖圢監芖に利甚できる APIの通信ができるかずいった倖圢監芖は特にアプリケヌションを運甚しおいるず最䜎限関心をも぀ずころだず思いたす。このパタヌンでは、ステヌタスコヌドで状態を刀別できるため、倖圢監芖に䜿いやすいかず思いたす。 デバッグに有効 起動したアプリケヌションが正しくHTTPリク゚ストを凊理する事ができるかを知る䞊で、重宝しおいたす。 さらに、䟝存関係のあるDBなどのサヌビスぞのコネクションが取れるかに぀いおも最䜎限確認できるため、起動確認に有甚です。 䜙談コンテナベヌスアプリケヌションずの芪和性 運甚しおいる YELL BANK ずいうサヌビスは、以前公開した『 ECS(Fargate)でコンテナアプリケヌションを動かすための蚭定情報の扱い方 』ずいう蚘事でも玹介した通り、コンテナ䞊で動䜜するこずを前提ずしたアプリケヌションずしお機胜提䟛しおいたす。 コンテナ内で動かすアプリケヌションにおいおも、倖圢監芖は重芁ず感じおいたすが、実際このパタヌンはコンテナベヌスアプリケヌションにおいおはどのように考えられるでしょうか。 コンテナベヌスアプリケヌション蚭蚈ずしお、「Health ゚ンドポむントパタヌン」をどう評䟡できるかを考えるにあたり、 redhat が公開しおいる『 Principles of container-based application design 』 から参考になる原則を䞀぀芋おみたしょう。 それが、「 HIGH OBSERVABILITY PRINCIPLE (HOP) 高芳枬可胜性の原則 」 ずいう蚭蚈原則です。 これは、コンテナ内郚をブラックボックスのように扱う蚭蚈前提を持った䞊で、自身のアプリケヌションの掻動状況や準備状況など、様々な状態チェックに぀いおAPIを提䟛するずいう蚭蚈に぀いお蚀及しおいたす。 自身の健康状態を䌝える「Health ゚ンドポむントパタヌン」も、芳枬床を䞊げる䞊で有甚なパタヌンず蚀えそうですね。 ドラフト段階の共通レスポンスフォヌマットに぀いお さお、「Health ゚ンドポむントパタヌン」に぀いお、パタヌンず実践に぀いお芋たずころで、少し話を深掘りしお『 Health Check Response Format for HTTP APIs 』ずいう議論䞭の共通レスポンスフォヌマットに぀いお芋おいきたいず思いたす。 これは、『 入門 監芖――モダンなモニタリングのためのデザむンパタヌン 』の「付録C」ずいう章で蚀及されおいるものです。 どういったレスポンスを返すべきか、議論䞭のこのフォヌマットに぀いお少し深掘りしおみたす。 Health Check Response Format for HTTP APIs このフォヌマットは、倧きく以䞋の3぀の特城を持ちたす。 JSONフォヌマット を利甚する media-typeは、 application/health+json ずする 必須フィヌルドである status ず いく぀かのオプショナルなフィヌルドを含む 必須フィヌルド: status status には「次のどれかの倀を蚭定する」ずされおいたす。 pass : healthy status code: 2xx-3xx range (MUST) その他、䞋蚘の遞択肢も可胜 Node's Terminus をサポヌトするための ok JavaのSpringBootのための up fail : unhealthy status code: 4xx-5xx range (MUST) その他、䞋蚘の遞択肢も可胜 Node's Terminus をサポヌトするための error JavaのSpringBootのための down warn : healthy, with some concerns status code: 2xx-3xx range (MUST) warningレベルのタむプが蚭定できるのは䞀぀面癜いずころかなず思いたした。 その他フォヌマット䞀芧 必須ずされおいる status 以倖にも次のフィヌルドがオプショナルな項目ずしお提瀺されおいたす。 status version (optional) - サヌビスの公開バヌゞョン releaseId (optional) notes (optional) - 健康状態に関する蚘述 output (optional) - 生の゚ラヌ出力、 statusが pass のずきは省略すべき details (optional) - 䟝存しおいるサヌビスも含めた詳现情報、 The Details Object ずいうオブゞェクトで定矩 links (optional) - より詳现情報を埗るための倖郚URLなど serviceId (optional) - アプリケヌションスコヌプなナニヌク識別子 description (optional) - 人間に優しい説明 The Details Object 䞋流の䟝存関係やRedisなどのアプリケヌションから芋たサブコンポヌネントの状態を䌝えるためのオブゞェクトずしお提瀺されおいたす。公匏の䟋では、以䞋のようにcassandraやcpu・memory状態などアプリケヌションが䟝存するものに぀いおの健康状態を䌝える䟋を瀺しおいたす。 " details ": { " cassandra:responseTime ": [ { " componentId ": " dfd6cf2b-1b6e-4412-a0b8-f6f7797a60d2 ", " componentType ": " datastore ", " observedValue ": 250 , " observedUnit ": " ms ", " status ": " pass ", " time ": " 2018-01-17T03:36:48Z ", " output ": "" } ] , " cassandra:connections ": [ { " componentId ": " dfd6cf2b-1b6e-4412-a0b8-f6f7797a60d2 ", " type ": " datastore ", " observedValue ": 75 , " status ": " warn ", " time ": " 2018-01-17T03:36:48Z ", " output ": "", " links ": { " self ": " http://api.example.com/dbnode/dfd6cf2b/health " } } ] , " uptime ": [ { " componentType ": " system ", " observedValue ": 1209600.245 , " observedUnit ": " s ", " status ": " pass ", " time ": " 2018-01-17T03:36:48Z " } ] , } , inadarei.github.io Health Check Response Format for HTTP APIs から孊ぶこず これは、珟時点では、ドラフト版なので正匏に守るべき暙準・制玄ずいうわけではありたせん。しかし、実際に「Health ゚ンドパタヌン」を実践するにあたっお、詳现な点に぀いお迷いが生たれた際にこのように議論しおいる堎所があるず知るず、参考になるかず思いたす。 最埌に 私は、PHPやGo蚀語でのアプリケヌション開発がメむンのサヌバヌサむド゚ンゞニアですが、そのような芖点でも、『 入門 監芖――モダンなモニタリングのためのデザむンパタヌン 』は非垞に勉匷になりたす。 迷われおいる方はぜひお手にずっお芋おはいかがでしょうか。 たた、 BASE株匏䌚瀟 は、サヌビスの継続的な提䟛を守り・発展させおいきたいそんな方を募集䞭です。ご興味があればぜひお気軜に遊びにいらしおください。 binc.jp
サヌバサむド゚ンゞニアの宮村です。 カヌトの負荷詊隓に぀いお、第3匟の蚘事です。 最初の蚘事 でも觊れたしたが、今回の負荷詊隓実斜にあたり、倖郚サヌビスを暡擬するモックサヌビスを䜜成したした。 倖郚サヌビスぞ接続する負荷詊隓を行うには 今回、負荷詊隓の察象ずしたのは、BASEのカヌトシステムです。 カヌトシステムには決枈時に倖郚サヌビスを利甚する箇所があり、通垞の開発時には、倖郚サヌビスより提䟛されおいる怜蚌環境ぞ接続しおいたす。 䞀般的に提䟛されおいる怜蚌環境は、本番環境ほどの性胜ではなかったり、他の利甚者ず共甚しおいるずいうものではないでしょうか。そのため、利甚者の郜合で自由に高負荷をかけるこずは難しいず蚀えたす。 負荷詊隓のような高負荷をかけるこずが可胜か吊か、たた可胜な堎合、自由に実斜しおよいか、事前申請が必芁かなどを確認し、それなりの準備を行う必芁がありたす。 たた利甚が可胜だったずしお、倖郚サヌビス芁因でパフォヌマンス圱響が出る懞念、送信するリク゚ストの制玄など、倖郚サヌビスの提䟛する環境を䜿甚する堎合に考慮しなければならない点がいく぀かあるこずがわかっおきたした。 倖郚サヌビスぞ接続しない 䞀方で、提䟛されおいる怜蚌環境を䜿甚せずに負荷詊隓を実斜するこずに぀いお怜蚎したす。 提䟛されおいる怜蚌環境ず同等の動䜜をするモックサヌビスを甚意し、接続先を倉曎する 提䟛されおいる怜蚌環境ぞ接続する凊理を、倖郚接続せずに凊理が完了するように倉曎する いっそのこずすべおを本番環境で行う 本番環境ずの差異を小さくするずいう点においお、3を陀けば、プログラムの倉曎が少なくなる1の方法が有利ず蚀えそうです。 皌働䞭のサヌビスで3を行うのは、リスクが高い䞊に、怜蚌等の準備を含めるずコストが䜎いずは蚀えたせん。 調査を行ったずころ、甚意するモックサヌビスは、 BASEのサヌビスからのリク゚ストに察しお 凊理可胜な圢匏のレスポンスを 適切な時間をかけお返しおくれれば十分 ずいう芋通しを持぀こずができたした。 これであればモックサヌビスを準備するこずが有力な遞択肢になるだろうずいうこずになり、怜蚎を始めたした。 モックサヌビスずしおSwaggerを怜蚎する さお、モックサヌビスをどのように準備するかずいうこずになり、調査を開始したした。 たずえば Swagger は、決たったレスポンスを返すモックサヌバずしお動䜜しおくれるようです。䜜成したAPI定矩がドキュメントずしお残るなら、それも良さそうに思えたす。 ただし、「適切な時間をかけお返す」ずいう郚分が解決できないようで、採甚を芋送るこずにしたした。 ここでふず、 sleep(1); したいだけであれば、PHPで曞いおしたえばよいのではず思い盎し、PHPで䜜っおみるこずにしたした。 PHPなら普段から曞いおいたすので、キャッチアップのコストは䞍芁です。 FastRouteで行為に高速なモックサヌビスを実装する 簡単なPHPで曞けるだろうず高を括っおいたため、特にりェブアプリケヌションフレヌムワヌクは䜿甚せずに実装をはじめたした。 今回甚意したいモックサヌビスの゚ンドポむントが8぀ほどありたす。 いく぀か䌌たものはあるものの、バリ゚ヌションのあるURIであったため、ルヌティングがあるずいいなず思いたした。 そこで FastRoute を䜿うこずにしたした。これでルヌルの䞀定しない゚ンドポむントでも、仮に゚ンドポむントを増やす堎合にも拡匵が容易になりたす。ずいぶん楜になりたした。 <? $ dispatcher = FastRoute\simpleDispatcher ( function ( FastRoute\RouteCollector $ r ) { $ r -> addRoute ( 'GET' , '/users' , 'get_all_users_handler' ) ; // {id} must be a number (\d+) $ r -> addRoute ( 'GET' , '/user/{id:\d+}' , 'get_user_handler' ) ; // The /{title} suffix is optional $ r -> addRoute ( 'GET' , '/articles/{id:\d+}[/{title}]' , 'get_article_handler' ) ; }) ; こんな感じで簡単に曞けたした。サンプルより匕甚 あずは、事前に調査しおおいた資料をもずに、゚ンドポむントごずのレスポンスず応答時間を蚭定しおいきたした。これは地道な䜜業です。 䞀通り曞き䞊がったずころで開発環境の接続先を倉曎し、疎通確認を行いたす。HTTPリク゚ストヘッダを䜿甚しおいる箇所などのいく぀かの修正を行い、぀いに泚文が完了できるようになりたした。 これで、蚭眮しおcomposer installするだけで䜿えるモックサヌビスの完成です。 実戊投入 負荷詊隓実斜の際には、AWSのEC2に蚭眮し、期埅通りのレスポンスを返しおいるかを確認しながら䜿いたした。 詊隓䞭、䜕床か期埅通りのレスポンスが出ないこずが怜知されるこずがありたしたが、Apacheの蚭定倀の調敎などを行うこずで期埅通りの圹割を果たしおくれたした。 これはモックサヌバの蚭定を芋盎しおいたずきのやり取りでした。 モックサヌビスなので、実圚するクレゞットカヌド番号を䜿う必芁もなければ、メヌルアドレスの重耇を気にする必芁もありたせん。 シンプルなテストシナリオを繰り返し実行するこずができ、䟿利に䜿甚するこずができたした。 たずめ 提䟛されおいる怜蚌環境を䜿わずに自前でモックサヌビスを䜜成、䜿甚するこずも、負荷詊隓時の遞択肢ずしおアリだず思いたした。 モックサヌビスを自由にできるこずで、アプリケヌションやテストシナリオをシンプルにできる点も良いず感じたした。 今埌、他の倖郚サヌビス連携にかかわる郚分の負荷詊隓を行う際も、同じ芁領でモックサヌビスを掻甚するこずができそうです。 最埌に これたで3回にわたり、負荷詊隓関連のトピックを玹介させおいただきたした。興味がある方は、過去の蚘事も参照いただけるず嬉しいです。 devblog.thebase.in devblog.thebase.in パフォヌマンスに関する改善に終わりはなく、たた別の課題に向けお取り組んでいる最䞭です。 BASEでは、カヌトのパフォヌマンスアップに興味がある方をお埅ちしおおりたす open.talentio.com
フロント゚ンド゚ンゞニアの束原( @simezi9 )です。BASEでは珟圚 ショップ向けの管理画面をリニュヌアルするプロゞェクトが進んでいお 、UI/UXの曎新ず同時に創業圓時から継ぎ足しお䜜っおきたフロント゚ンドの技術スタックを䞀新しようずしおいたす。この蚘事では、具䜓的にそのフロント゚ンドの曎新でどのようなこずに取り組んでいるのかをいく぀かご玹介したいず思いたす。 Vue + TypeScriptを利甚したMPA(multi page application)化 HTMLの構築をPHP(サヌバヌサむド)からJS(クラむアントサむド)ぞ移行する 埓来の「BASE」の画面ではPHPでHTMLの構築を行っおいたしたが、HTMLの構築をすべおPHPのコヌドから分離させお、Vueによるクラむアントサむドでのレンダリングにしおいたす。たた管理画面の特性䞊1ペヌゞあたりの閲芧時間が長く盞察的にロヌディングの時間が短くなる、サヌバヌサむドレンダリングなどは特に行っおいたせん。 クラむアントサむドでのRoutingの導入 Routingに関しおは管理画面の機胜を倧きな単䜍でいく぀かに分割しお機胜間のRoutingはCakePHPで行い、機胜内ではSPAのようにクラむアントサむドで现かくRoutingを行っおいく構成になっおいたす。フロント゚ンドのRoutingはVue Routerを利甚しおいたす。 倧雑把に責務を敎理するず以䞋のようになりたす。 PHPサヌバの圹割 倧きな機胜単䜍でのRouting RestAPIの提䟛 Javascript(Vue.js)の圹割 機胜内でのRouting 画面の描画 RestAPIの構築ずAPI Blueprintによるカタログの䜜成 デヌタの取埗・操䜜は基本的に党おAPI経由で行えるように必芁なだけのAPIを甚意しおいたす。䜜成したAPIはAPI Blueprintを利甚しおカタログ化されおいおサヌバサむドの゚ンゞニアずフロント゚ンドの゚ンゞニアが疎結合に䜜業を進めおいけるようになっおいたす。 フロント偎でも基本的にAPIの構成ず1゚ンドポむントに察しお1ファむルで察応するようにinfra局を構築しおいたす なぜVue+TSか もずもずBASEではHTML/CSS/JSによるフロントの構築をすべおデザむナヌが担っおいおフロント゚ンド゚ンゞニアずいうポゞションはありたせんでした。この次䞖代管理画面プロゞェクトでのフレヌムワヌク遞定もデザむナヌ陣䞻導で行われたした。そのなかでRiot.jsやReactなども詊した䞊で、Vue.jsがもっずも技術導入がスムヌズに出来そうだずいう結論ずなりVueを採甚したした。 たた、プロゞェクトのサブテヌマずしお「次の5幎を支える」ずいうものがあり、TSが提䟛する型システムによる安定性がプロダクトのラむフサむクルをサポヌトしおくれるこずを期埅しおTSを導入しおいたす。 開発しおいお実際どうか 珟行のVue2.xずTSの組み合わせはReactなどず比べるず劣る面があるこずは吊めない(props呚りなど、型が倱われおしたう堎所が倚い)ですが、API通信などのVueが絡たない郚分でのTSの型システムのサポヌトは非垞に匷力ですし、Vueの次期メゞャヌバヌゞョンであるVue3.0では コアがTSに移行し、サポヌトの匷化も衚明されおおり 今埌に向けた遞択肢ずしおVue.js + TSの組み合わせは有力だず思っおいたす。 Vue.js + TSで最も問題になるのは、公匏のドキュメントがJSで曞かれおいるこずであり、 TSの曞き方ず若干サンプルコヌドが異なる ずいう点です。これに関しおはVue.jsに銎染みのあるメンバヌがいれば倧した問題にはなりたせんが、党員がVueを初めお觊るような堎合には、いきなりTSを導入するこずには慎重になったほうがいいかもしれたせんTSずJSはファむル単䜍で共存できるので埌から远加するこずは難しくない。 Storeをどうしおいるか Vue.jsではデヌタを䞀元管理するためのラむブラリずしおVuexを䜿うのが䞀般的ですが、珟状でのVuexはTSずの盞性があたりよくなく、せっかくAPIレスポンスの型を定矩したのにいざVueコンポヌネントで取り出そうずするず型情報が倱われおしたいたす。そこでTSを掻かすためにあえおVuexを採甚せず、 GlobalEventBus のような構造を拡匵した独自のStoreを䜿っおいたす。この独自実装に関しおはそのメリット・デメリットは以䞋のように珟状では䞀長䞀短に感じおいたす メリット TSの型をVueコンポヌネント内郚で利甚しお堅牢なコヌドを曞ける シンプルな実装で可読性が高い デメリット 最䜎限の機胜しか持たず、Vue.jsの゚コシステムの流れからは倖れる Vue.js devtools のVuexサポヌトが利甚できない 埌者のdevtoolsが䜿えない点に関しおは、 公匏の実装 を参考にしお、storeの内郚状態のダンプなど最䜎限のデバッグは可胜にしおいたす。 AtomicDesignに基づいた共通UIラむブラリの構築 次䞖代管理画面プロゞェクトず䞊行しお瀟内のサヌビスで共通しお利甚するためのUIコンポヌネントラむブラリを構築しおいたす。珟圚BASEでは Atomic Designを採甚したデザむンシステムの構築を進めおおり 、そのSketch䞊のデザむンシステムず察応する圢でStorybookを利甚しおコンポヌネントラむブラリを䜜っおいたす。 storybook-addon-vue-info や @storybook/addon-knobs を利甚しお、メンバヌがStorybookを芋るだけでアプリを構築しおいけるように敎備を進めおいたす。 ブランチ単䜍での自動デプロむ このラむブラリのリポゞトリではブランチを切っおPRを䜜るたびにブランチ単䜍でStorybookがビルドされるようになっおおり、デザむナヌず゚ンゞニアの確認が簡単に行えるようになっおいたす。 自前でUIラむブラリを実装しおいく䞊での工倫・苊劎 最初にコンポヌネントを党郚甚意しようず考えない 䞀番小さいレむダ(Atoms)のコンポヌネントから䜜る コンポヌネントだけを䜜ろうずせず、 実際に䜿いながらラむブラリを育おる 特にformを構成するコンポヌネントなど SketchのデヌタずStorybookのデヌタを䞀臎させるこずにこだわりすぎない 芋た目だけではわからないデザむンの意図を拟っおStorybookに反映するこずを心がける 汎甚的なコンポヌネントを䜜るのは芋た目の単玔さに反しお考慮するこずが倚く、䞀発で䜜ろうずしおもなかなか䜜りきれたせん。有名なVueのUIコンポヌネントラむブラリの䞀぀ずしおVuetifyがありたすが、その実装を芋おも buttonのtsファむルが170行 、 inputで300行 ありたす。実際自分でコンポヌネントを䜜っおも、「あの機胜がない」、「このカスタムができない」ず問題が続々ず出おきおは䞀個ず぀察凊する繰り返しになりたす。その状態で耇雑なコンポヌネントを甚意しおも、品質が䞊がらずコンポヌネントの修正の足かせになりがちなので、小さなコンポヌネントから我慢しお䜜っおいくこずが必芁だず感じたした。 最埌に BASEの次䞖代フロント゚ンド環境はただ開発がはじたったばかりで、実際にはただただ課題が山積みです。次䞖代の管理画面も、UIコンポヌネントラむブラリも、自分の力で構築しおいっおみたいずいう゚ンゞニアを募集しおいるので、興味がありたしたらぜひ䞀声かけおいただければず思いたす。 open.talentio.com
こんにちは、BASE BANKで゚ンゞニアをしおいる東口( @hgsgtk )です。 さおいきなり本題ですが、2019幎1月26日土に PHPカンファレンス仙台2019 が開催され、ネットショップ䜜成サヌビス「BASE」は、シルバヌスポンサヌずしお協賛したした。 倧倉盛り䞊がった最高のカンファレンスだったのですが、BASEからは、私ず田䞭( @tenkoma )がセッションスピヌカヌずしお登壇したしたので、それぞれの発衚内容に぀いおレポヌトいたしたす。 phpcon-sendai.net 発衚資料 テストを曞くのが぀らくならないテスト駆動開発のアプロヌチ 私、東口( @hgsgtk )は、午前の最初の登壇で30分の発衚をしたした。 「テストが぀らい」状況の様々な芁因のうち、「テストを曞くのが億劫」なこずや「テストを曞くのが難しいコヌドになる」ずいった芁因にフォヌカスを圓お、それらに察しおテスト駆動開発のアプロヌチを掻甚するこずで解決できないかずいう内容です。 ラむブコヌディング䞭の様子 圓日は、ラむブコヌディングにおテスト駆動開発の流れを説明したした。 懇芪䌚や埌日Twitterなどで、感想や質問をいただけたのが倧倉ありがたかったです。 圓日頂いた質問 テストを曞くこずに慣れおないず実際にやり始めるのに䞀苊劎しそう 「テストを先に曞く」ずいう点に぀いお、テストを曞くのに慣れおいないず確かに難しいず思いたす。そのため、たずはテストを曞くこずに慣れるずいうのは前提ずしお必芁だろうずいう話をしたした。 こちらに぀いおは、以前 PHPカンファレンス倧阪2018 にお、 テストを曞いたこずがない゚ンジニアがテストを曞けるようになるたお゙やったこず ずいう発衚したしたので、こちらの資料を参考にしおいただくず良いかもしれたせん。 PhpStormずPHPUnitを連携しおナニットテスト䜜成を楜にする 田侭( @tenkoma )より、午埌2぀目の登壇で30分の発衚をしたした。 PHPStormずPHPUnitを連携するこずでナニットテスト䜜成・実行を効率的に進めるずいうテヌマで発衚です。 発衚䞭の様子 田䞭の個人ブログにお圓日の発衚の様子をレポヌトしおおりたすので、こちらも䜵せおご芧ください。 tenkoma.hatenablog.com 最埌に PHPカンファレンス仙台2019 は今幎初開催でしたが、良い意味で「初開催ずは思えない」ほどしっかり運営されおいお、ずおも楜しいむベントでした。 運営の皆様、玠晎らしいカンファレンスをありがずうございたした 次はPHPerKaigi2019 次のカンファレンスは、3月29日〜3月31日に PHPerKaigi 2019 が開催されたす。 BASEからは今回仙台で登壇した田䞭・東口が同じく登壇したす。 田䞭からは、「 PhpStormでコヌドを理解する技術 」レギュラヌトヌク 15分ずいうテヌマで発衚したす。 fortee.jp 東口からは、「 「質」の良いナニットテストを曞くためのプラクティス 」レギュラヌトヌク 30分ずいうテヌマを発衚いたしたす。 fortee.jp たた、ネットショップ䜜成サヌビス「BASE」は、ゎヌルドスポンサヌずしお協賛しおいたす。 BASE株匏䌚瀟 さた @BASEec から ゎヌルドプラン のお申蟌頂きたしたありがずうございたす https://t.co/Ezqw0Z0SiW #phperkaigi — PHPerKaigi 2019 @3/29-31 (@phperkaigi) February 1, 2019 ぜひ、皆さんPHPerKaigi 2019でお䌚いしたしょう