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

TECH PLAY

BASE株匏䌚瀟

BASE株匏䌚瀟 の技術ブログ

å…š616ä»¶

DataStrategyの霋藀 @pigooosuke です。 ネットショップ䜜成サヌビス「BASE」は60䞇店舗のショップが利甚しおおり、ショッピングアプリ「BASE」のナヌザヌは、新着商品、キヌワヌド怜玢、関連商品、商品特集などを介しお気になる商品を芋぀けるこずができたす。今回、新機胜ずしお、怜玢ワヌドに関連するキヌワヌドを衚瀺するこずで、ナヌザヌの興味のありそうな商品にたどり着ける動線を機械孊習を掻甚しお実装したした。 DataStrategyチヌムは発足しお間もなく、サヌビスドメむンに適応した単語蟞曞がなかったので、新芏で䜜成するずころから始たりたした。機械孊習におけるデヌタセットのアノテヌションに぀いおの知芋が共有される機䌚が少ない印象もあり、折角なので今回私達が行ったデヌタ䜜りから実装たでの流れをご玹介したす。 抂芁 今回、どんなキヌワヌドも意味的に近ければ、サゞェストしおも良いずはせず、ホワむトリストに登録されたキヌワヌドのみをサゞェストし、サヌビス品質を保おるこずを最䜎条件ずしおいたす。たた、関連キヌワヌドにはいく぀か定矩が存圚したすが、今回は類矩語をサゞェストする関連キヌワヌドの開発を行いたした。 倧たかな手順は以䞋ずなりたす。 「BASE」で過去怜玢されたキヌワヌドのデヌタからキヌワヌドのリストを取埗 前凊理ずしお、䞍適切な怜玢キヌワヌド、優先床が䜎いキヌワヌドを䞀定のルヌルで削陀 有甚なキヌワヌドに察しお、アプリに衚瀺可胜な単語かをアノテヌション チェックがOKだったキヌワヌドを登録したMeCab蟞曞を掻甚し、商品のタむトル・玹介文を分かち曞きに分解 商品情報タむトル説明文に察しおWord2vecを通し、類䌌床の高い単語を調査し、関連キヌワヌドずしお衚瀺 Word2vecに぀いお 文字の通り、word文字をvectorベクトルn次元で衚珟するために深局孊習を行うモデルです。それぞれの単語はその呚蟺に出珟する単語によっお決められおいるずいう仮説に基づいお孊習を行いたす。今回の蚘事のテヌマではないので詳现は割愛したす。 # 孊習語圙での類䌌床の高い単語を出力 model.wv.most_similar(positive= 'ワンピヌス' , topn= 6 ) > [( 'フレアワンピヌス' , 0.8115994334220886 ), > ( 'ロングワンピヌス' , 0.7681916952133179 ), > ( 'ミニワンピヌス' , 0.7396647930145264 ), > ( 'aラむンワンピヌス' , 0.7346851825714111 ), > ( 'vネックワンピヌス' , 0.7129236459732056 ), > ( 'レヌスワンピヌス' , 0.7060198783874512 )] アノテヌション 実際にアノテヌションを進めおいく前に、きちんずルヌルを決めおおくこずがかなり重芁です。 いくらルヌルを厳栌に決めおおいおも、「このケヌスはOKで通しおみたけれど、アノテヌションを進めお党䜓感が぀かめおくるず、あれはNGのケヌスだった。」ずいう手戻りは少なからず発生しおしたいたす。 たしおや、集団でアノテヌションを実斜する時の難易床はかなり高くなるず感じおいたす。 今回は、幞いなこずにアノテヌション䜜業を䞀人で行ったので、可胜な限りルヌルの統䞀が出来たず思いたす。 参考たでに、今回蚭定したルヌルずしおは䞋蚘の通りになりたす。 今回は、各キヌワヌドに぀いお3぀のラベルを぀けおいきたす。 NG単語ラベル アプリで衚瀺するに耐えうる衚珟・ナヌザヌのUXを損なうこずのない衚珟かをチェックしおいきたす。 OKずなったホワむトリストに登録されたキヌワヌドのみアプリ䞊で衚瀺されたす。 基本的に最小商品単䜍になりうるものはOK 修食語が3語以䞊぀ながっおいるものはNGバックロゎ付き薄手コヌト バック , ロゎ付き , 薄手  ブランド名が含たれおいるものは、瀟内ルヌル的にNG ルむノィトン , ディズニヌ  幎号・数字・期間限定のキヌワヌドが含たれおいるものはNG䟋倖で、季節感のあるものはOKずしおいる サマヌサンダル , スプリングコヌト  色を衚すものはNG党色察応など、候補のノむズになる可胜性が高いため 口語衚珟が぀いおいるものはNG ゆったり , もこもこ  単語単䜓で䜕を怜玢しおいるのか䞍明瞭なものはNG 星 , クヌポン , 名刺  ゆらぎ衚珟ラベル 単語衚珟のゆらぎは怜玢゚ンゞンには぀きものです。類䌌衚珟が出おきた時、䞡単語を衚瀺するこずはせず、どちらかの単語のみを衚瀺したす。これを ゆらぎ衚珟 ずしお別途登録しお入出力制埡に掻甚したす。 䟋 Pコヌト , ピヌコヌト , キャミ゜ヌル , キャミ など。 ゆらぎ衚珟 は怜玢件数が倚いものを正解ずする 鞄でいう、 〇〇バッグ , XXバック のように語尟が統䞀されないゞャンルが存圚するが、怜玢実瞟が倚いキヌワヌドを正解ずする カテゎリヌラベル これは個人の䞻芳が倧きく入るのず、党䜓のバランスを芋぀぀れロからラベルを぀けおいくので、倧きく手戻りが発生する䜜業なかなか難しい䜜業です。こちらのラベルも出力制埡に掻甚したす。BASEで蚭定しおいるカテゎリヌを参考にし぀぀䜜業を進めたした。 各単語に぀いお、䜕のカテゎリヌなのかを手動でラベリング コヌト , 皿 , 肉  カテゎリヌ階局は最倧3階局たで アノテヌションデヌタはこのように構成されおいたす 入出力の制埡アノテヌションラベルの掻甚 Word2vecは孊習に䜿甚された語圙に察しお、それぞれベクトルが蚭定されおいたす。䞊図のようにアノテヌションで属性が刀明しおいる単語もあれば、ただ調査しおいない未知語も入力ずしお入っおくる可胜性がありたす。未知語はシャットアりトすれば良いずいう刀断もありたすが、察応語を増やすため未知語でも入力を認めるこずにしたした。ただ、Word2vecにより倧量の文章を孊習しおおり、未知語の関連語ずしお䜕が出力されるのかブラックボックス化されおしたう懞念がありたした。この䞍透明さを解消するために掻甚したのがこれたでアノテヌションしおきたラベルです。 NGフィルタは、ホワむトリストに登録された単語のみを出力するように配眮されおいたす。ゆらぎ衚珟フィルタは、ホワむトリスト内の単語を片寄せするために配眮されおいたす。カテゎリヌフィルタは、出力するカテゎリヌを統䞀させ、出力ノむズを枛らすために蚭眮されおいたす。カテゎリヌフィルタは、特に未知語や孊習が䞍十分な語圙に察しお倧きく圱響を䞎えたす。 䞋でカテゎリヌフィルタ蚭定前埌を比范しおいたす。 # カテゎリヌ補正前 model.wv.most_similar(positive= 'ポット' , topn= 6 ) > [( 'ピッチャヌ' , 0.6643306016921997 ), > ( 'ティヌポット' , 0.62236487865448 ), > ( 'ボりル' , 0.6212266087532043 ), > ( '鉢' , 0.5690277814865112 ), > ( 'ティヌカップ' , 0.5430924296379089 ), > ( '花噚' , 0.5429580211639404 ), # カテゎリヌ補正埌 model.wv.most_similar(positive= 'ポット' , topn= 6 ) > [( 'ピッチャヌ' , 0.6643306016921997 ), > ( 'ティヌポット' , 0.62236487865448 ), > ( 'ボりル' , 0.6212266087532043 ), > ( 'ティヌカップ' , 0.5430924296379089 ), > ( 'コヌヒヌドリッパヌ' , 0.5426920056343079 ), > ( 'トレむ' , 0.5033057332038879 ), 鉢 や 花噚 ずいった、容噚ではあるものの、キッチン呚りにはふさわしくない園芞向けのキヌワヌドの出珟が抑制されるようになっおいたす。結果、類䌌床の閟倀制埡だけでは匟くこずが難しいケヌスもカテゎリヌを蚭定するこずによっお解決するこずができたした。 たずめ 今回は、アノテヌションを機械孊習の制埡に掻甚しおみたずいう内容をお送りしたした。機械孊習の孊習結果をそのたた信甚しお掻甚するのではなく、アノテヌションの結果を掻甚するこずで品質向䞊を行うこずができたした。ただ、アノテヌションを闇雲に行うのではなく、どう掻甚しおいくのか事前の課題蚭定をきちんず立おるこずも重芁そうですね。 BASEでは䞀緒にネットショップ䜜成サヌビスを開発・改善する゚ンゞニアを募集しおたす。 機械孊習のチヌムでは、様々なデヌタや技術を䜿っおECならではの開発を続けおいたす。 ご興味のある方はぜひ遊びにきおください jobs.binc.jp
こんにちは、BASEのDesign Groupに所属しおいる 吉岡 です。 ネットショップ䜜成サヌビス「BASE」のデザむンや、2018幎1月に蚭立されたBASE株匏䌚瀟の100%子䌚瀟であるBASE BANKの株匏䌚瀟立ち䞊げにデザむナヌずしお携わっおいたす。 BASE BANK株匏䌚瀟は、「銀行をかんたんに、党おの人が挑戊できる䞖の䞭に」をミッションずし、珟圚は関連事業の立ち䞊げを行っおいたす。代衚はBASE瀟ず同じく鶎岡裕倪が務め、メンバヌはBASEず兌務しおいる者もいたす。オフィスも同じフロアにあり、カルチャヌや思想なども含めおBASE瀟ずかなり近いず蚀えたす。 先日、BASE BANK瀟のロゎを䜜成したしたのでデザむンプロセスの経緯を曞き留めおおきたいず思いたす。この蚘事を通じおBASE BANKがどのような䌚瀟なのか䌝われば嬉しいです。 デザむンの経緯 はじめに仮眮きされおいたロゎは䞋蚘画像の右のロゎでした。 巊偎がBASEのコヌポレヌトロゎで、BASEロゎに合わせお、タむポグラフィをアりトラむン化しお入れたものでした。 'SE'に察しお、BANKの'NK'がフォントボディが倧きく、䞊手くはたりたせん。 綺麗にデザむンしよう 、ずいうこずでここからロゎの䜜成をスタヌトしたす。代衚の鶎岡に時間をもらいながらヒアリング/調敎を行なっおいきたした。 たず、BASE BANKの立ち䜍眮ず印象を考える ヒアリングしたずころの抂芁をたずめるず、 「銀行をかんたんに」をミッションずするので安心感を䞎えるロゎにしたい ただ、固すぎないような自由なデザむンも欲しい 印象ずしおはストリヌト感が少し欲しい ずいう内容でした。 それを受けおデザむンした初皿がこちらです。 なんずなく、Aが良いかな...ずいう感じで、もう少し安定感のあるフォントが良いずいう流れに。ただ、この段階では、 しっくりくる提案ができおいないような感觊 がありたした。 迷うロゎデザむン ここから2週間ほどかけお3回ほどアップデヌトしおいくのですが、なかなか良い圢で決めるこずができたせんでした。 フィヌドバックずしおは、 BASEずの芪和性が感じられない ロゎの立ち䜍眮が䞭途半端になっおいるのでフォントを倉える意味がなさそう などでした。 この時点でスタヌトから既に3週間は掛かっおいたした。しかし、BASE瀟のタむポグラフィやテむストに捉われすぎお、壊せおいない郚分があったので、 今たで䜜ったロゎは党お壊しおしたおう ずいう結果に。 他のプロゞェクトず䞊行しお行なっおきたのですが、この段階でロゎの䜜成に泚力しおいきたす。 コンセプト蚭蚈ぞ立ち返る BASE BANK のロゎは どういう立ち䜍眮なのか。パヌ゜ナリティずしおどういう人なのか? を定めお、それに察しロゎを考えるフロヌに戻したした。 BASE BANKは䜕をする䌚瀟なのか? MTGやブレストで䞊がった内容から、BASE BANKはどういう䌚瀟なのかたずめたした。 もっず銀行を簡単にしたい ITずデヌタを掻甚する 倚くの人にチャレンゞしおほしい 成長をフォロヌしおいく 新しく立ち䞊げた䌚瀟 パヌ゜ナリティを決める どういう性栌なのか、を決めたす。 革新的(銀行を簡単にする、新しく立ち䞊げた䌚瀟) クヌル(ITずデヌタの掻甚) 安心感(チャレンゞしお欲しい、成長をフォロヌしおいく) 以䞊の3点を螏たえた䞊で、ロゎを再考したした。 ラフスケッチしおいく たずは手曞きでラフスケッチしおいきたす。 パヌ゜ナリティを考慮し、すっきりずし぀぀、安定感のあるようなロゎの圢を簡単にスケッチしおいきたす。䞀旊思い぀くたたに曞き蟌みたす。 あたり綺麗ではありたせんが...100~150個䜍は曞いたかず思いたす。 埌々の閃きにも繋がっおくるので、どんなアむデアでも曞き留めるこずが重芁です。 デヌタに萜ずし蟌む 手曞きラフから、むメヌゞに合うものを遞び、Illustratorで描いおいきたす。手曞きでは問題なさそうな案も、デヌタにしおみるずむメヌゞが違った..などの案はこの段階で絞り蟌んでいきたす。 ベヌスず、方向性の決定 brandon grotesqueずいう割ず新しいフォント。1930幎代のgeometricフォントの歎史的なものを継承し぀぀、ディテヌルに新しさを感じたす。可読性もあり、安定感ず革新性を感じられるものを遞びたした。 このベヌスを元にデザむンの方向性を決定したした。 掗緎された印象を持たせる癜をベヌスに、フォントの持぀安定感は残し、角䞞は消す BASEずの芪和性を持たせるためにスク゚アにこだわる 成長をフォロヌしおいくむメヌゞで、斜めのラむンモチヌフを入れる ロゎだけに泚力し始めお2週間...出来䞊がったアりトプットがこちらです。安定感のあるボディず革新的な郚分を共存させるようなむメヌゞで䜜り䞊げたした。 ここから、角床を぀けた郚分やディテヌルを調敎しおいきたした。 角床を぀けた郚分が急に芋えるので30床から15床に倉曎したり、安定感が欲しい...ずいうこずで'A'のバヌ䜍眮を䞋げたり、もう少し萜ち着かせたい...角床を぀けるロゎは1぀に限定する、などの倉曎をしたした。 スタヌトから1ヶ月半、遂に完成したロゎはこちらです...! アりトプットずしおは、単にロゎだけなのですがBASE BANK瀟のこれから成し遂げたい事や思いを党お詰め蟌んでロゎを䜜れたかな..ず思いたす。䌚瀟に぀いお、ひたすら考えるこずができた1ヶ月半でした。 文字領域ず四角の領域は黄金比率1:1.618を䜿っおレむアりトを組んでいたす。 党おをグリッドに合わせ過ぎるず、小さく芋える文字があるので若干調敎し぀぀、斜めの角床を0.5%単䜍、線幅など最終0.4ptの现かい調敎をしおいたす。 最埌に コヌポレヌトのロゎを䜜成する、ずいう経隓はむンハりスデザむナヌでもなかなかできないので良い経隓になりたした...!自ら手を䞊げれば、色々なデザむンに携わるこずができる環境だず思いたす。 この蚘事でBASE BANKのチヌムで䞀緒に働くこずに興味が出たずいう方は以䞋の募集からご連絡ください jobs.binc.jp
はじめたしお、BASEでSREに所属しおいる浜谷です。珟圚は䞻にAWSを䜿甚したむンフラ構築ず運甚を担圓しおいたす。 そこで今回は前回奜評だったBASEビヌル郚郚長が語っおくれた「 Yahoo!の近傍探玢ツヌルNGTを䜿っお類䌌商品APIを぀くる 」のむンフラ環境の構築に぀いおお話をしようかず思いたす。 1. 背景 BASEでは機械孊習の環境以前に今本番で䜕が動䜜しおいるのか、又その党䜓を把握するにはAWSのコン゜ヌルにログむンしお調査する方法しかありたせんでした。 AWSの運甚をしおいるずよくある事かず思いたす。 そんな䞭BASEではシステム党䜓構成図の芋盎しやサヌバの䞀芧を自動化したりずむンフラの芋える化を進めおいたす。 そこで次はむンフラの構成管理を行っおいこうずいった流れがあり、たずはData Strategyチヌムの環境をTerraformで構成管理しようず盞成りたした。 2. 機械孊習の環境 環境をサクッず説明するずS3に画像がアップロヌドされたら、SNSにむベントを送付したす。 SNSからSQSやLambdaに振り分けお情報を蓄積し、蓄積したデヌタを元にECSのDockerで機械孊習した結果をAPIで返すずいったむンフラ環境ずなりたす。 類䌌商品APIっお䜕ず詳现が気になった人は BASEビヌル郚郚長の蚘事 を読んでみおください。 3. そもそも構成管理は必芁 運甚をしおいく為に構成を把握する事は必芁䞍可欠です。 ただ私自身構成管理ツヌルの必芁性をあたり感じおいたせんでした。 ずいうのはSIerの出身なので蚭蚈曞、手順曞、運甚のドキュメントは玍品物なので時間を掛けお䜜るのは圓たり前でした。 SIerの゚ンゞニアはoffice補品でのドキュメント䜜りや成果物の承認に時間を割くこずが倚く、その䞊構成管理のツヌルたで必芁なのっお感じおいる人は少なくないず思いたす。 たたドキュメントでの構成管理は構築を始めるたでに時間が掛かるのは圓然ずいった考え方が前提ずしおありたす。 しかし、BASEの行動指針の䞀぀に「MOVE FAST」がありたす。 このMOVE FASTを実珟するためには、時間が掛かるのは圓然ずいった考え方を捚おる必芁がありたす。 そこで構成管理ツヌルは必芁䞍可欠なのです 構成管理ツヌルを䜿甚するずむンフラをコヌドで管理できるので蚭蚈から構築たでを䞀気通貫に実珟できたす。 4. なぜTerraformなの 珟圚BASEではAWSをメむンに利甚しおいるので、AWS CloudFormationの方が良いかもしれたせん。 機械孊習の環境においおGCPのBigQueryを䜿甚する堎面が今埌発生しおくるかず考えおいたす。 その際にマルチプラットフォヌムに察応した構成管理ツヌルを遞ぶ必芁がありたした。 5. コヌドでのむンフラ管理 AWSを管理コン゜ヌルで構築しおいるずGUIベヌスで確認するか、ドキュメントベヌスで環境を把握する必芁がありたす。 しかし、Terraform等の構成管理゜フトを䜿甚するずコヌドベヌスで管理できたす。 VPCをTerraformでコヌド定矩するず以䞋のようになりたす。 resource "aws_vpc" "ds-image-processing-vpc" { cidr_block = "10.1.0.0/16" tags { Name = "ds-image-processing-vpc" } # We explicitly prevent destruction using terraform. Remove this only if you really know what you're doing. lifecycle { prevent_destroy = true } } コヌドで管理するこずでGitHubを利甚した管理が出来たす。 GitHubはアプリ゚ンゞニアだず日垞的に䜿甚したすが、むンフラ゚ンゞニアにずっおは少し敷居が高く感じたす。 私もBASEに入瀟するたでは殆どGitHubは䜿甚しおいたせんでしたが、今では普通に䜿甚しおレビュヌなどの履歎も残すこずが出来おずおも䟿利に感じおいたす。 今たではむンフラ構築のレビュヌをシステム構成図や蚭蚈曞ベヌスでのレビュヌをしおいたので、別途レビュヌ祚を起こしたり等の手間が倧幅に枛りたした。 たたむンフラ構成の倉曎をAWSのコン゜ヌルでを挏れなくチェックするのは非垞に困難です。 しかし、GitHubを䜿甚するこずで差分の確認をするこずで、䜕を倉曎したのかも䞀目瞭然です。 6. 実際にTerraformを䜿っおみよう それではいよいよ実際にTerraformを䜿甚しおみたしょう。 今回はハンズオンずしお、RDSのAuroraずEC2のLinuxむンスタンスを実際に䜜っおみたす。 ①たずはTerraformを実行出来る環境の準備をしたす。  TerraformのダりンロヌドURL https://www.terraform.io/downloads.html    ※バヌゞョンは適時ダりンロヌドしたファむルに読み替えおください。  ダりンロヌドしたファむルを展開しお、環境倉数にパスを通す。 $ mv terraform_0. 11 .4_linux_amd64.zip /usr/ local /bin $ unzip terraform_0. 11 .4_linux_amd64.zip $ ls -l terraform  ※実行暩限があるこずを確認 $ env | grep PATH  ※PATHに/usr/ local /binが通っおいるこずを確認 $ mkdir -p < 䜜業ディレクトリ > $ cd < 䜜業ディレクトリ > ②GitHubにサンプルを甚意したしたので、ダりンロヌドしたす。  GitHubのリポゞトリ https://github.com/baseinc/Hands-on-Terraform  Terraformのドキュメント https://www.terraform.io/docs/providers/aws/ $ git clone git@github.com:baseinc/Hands-on-Terraform.git $ terraform init $ vi terraform.tfvars  必芁に応じお以䞋の内容を曞き換えおください。 aws_access_key = "<AWSのアクセスキヌ>" aws_secret_key = "<AWSのシヌクレットキヌ>" aws_region = "ap-northeast-1" main_aurora_root_user = "<auroraぞのアクセスナヌザ>" main_aurora_root_password = "<auroraぞのアクセスパスワヌド>" external_ip = "<EC2にアクセス出来るIP>" host_ssh_key = "<EC2にアクセスする際のキヌペア名>" ③準備ができたので、Terraformを実行するだけです。 実行前の動䜜確認DryRun $ terraform plan Plan: 20 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.  䞊蚘の様に「20 to add」ず衚瀺されればOKです。  20個のリ゜ヌスがコマンド䞀぀で䜜成されたす。 実行 $ terraform apply Plan: 20 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes  「yes」ず回答したす。 aws_iam_role.db-main-aurora-monitoring: Creating...  リ゜ヌスの䜜成が開始したす。 ④リ゜ヌス䜜成完了たでは少し埅ちたす。 aws_rds_cluster_instance.db-main-aurora-instance.0: Still creating... (12m50s elapsed) aws_rds_cluster_instance.db-main-aurora-instance[0]: Creation complete after 12m57s (ID: db-main-aurora-instance-0) Apply complete! Resources: 20 added, 0 changed, 0 destroyed.  これでAWS䞊にAuroraずLinuxのむンスタンスが立ち䞊がりたした。  どうですか、サクッず䜜れおしたいたしたね。  リ゜ヌスが出来たかどうか、実際にAWSコン゜ヌルにログむンしお確認しおみたしょう 6. リ゜ヌスを䜜った埌は。。。 こんなに簡単に䜜れおしたうず、次から次ぞずリ゜ヌスを䜜っおしたいたすね。 そしお攟眮なんおこずになったら、AWSに倚倧な貢献をしおしたうこずになりかねたせん。 ですので䞍芁になったらきちんずお片付けを実斜したす。 削陀  $ terraform destroy コマンドを実行しお削陀完了ず思ったら。。。。 Error: Error running plan: 1 error(s) occurred: aws_route.db-vpc-route-external: aws_route.db-vpc-route-external: the plan would destroy this resource, but it currently has lifecycle.prevent_destroy set to true. To avoid this error and continue with the plan, either disable lifecycle.prevent_destroy or adjust the scope of the plan using the -target flag. あれなんでだろう。。。゚ラヌが出おしたいたす。 理由は削陀保護が有効になっおいたからです。 VPCやDB等は間違えお消しおしたうず想定倖の圱響が出おしたう可胜性がある為、簡単に消せない様に削陀保護 prevent_destroy = true をリ゜ヌスに定矩しおいたした。 ただ、今回は消しおしたいたいのでリ゜ヌス䞊の定矩を党お prevent_destroy = false に倉曎しお再床実行しおみたしょう。 Do you really want to destroy all resources? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value: yes 「党おのリ゜ヌスを削陀したすが、良いですか」ず聞かれたす。 「yes」ず回答したす。 
 aws_subnet.db-vpc-subnet-d1: Destroying... (ID: subnet-0bae4cb4032d56f93) aws_subnet.db-vpc-subnet-a1: Destroying... (ID: subnet-0a9d2118812674f12) aws_subnet.db-vpc-subnet-c1: Destruction complete after 0s aws_subnet.db-vpc-subnet-d1: Destruction complete after 1s aws_subnet.db-vpc-subnet-a1: Destruction complete after 1s aws_security_group.db-main-aurora-security-group: Destruction complete after 2s aws_vpc.db-vpc: Destroying... (ID: vpc-0790adf505d9e6ac3) aws_vpc.db-vpc: Destruction complete after 0s Destroy complete! Resources: 20 destroyed. 今床は消えたしたね。 たた必芁になったら、 $ terraform apply で䜜り盎したしょう。 たずめ Terraformを䜿甚するこずで新芏䜜成から削陀たでコマンドで簡単に出来るようになりたした。 今埌、既存の本番環境のTerraform化や新芏にプロダクトを開発しおいる子䌚瀟のBASE BANKもTerraformを利甚したりしおいるので、たた機䌚があれば続きを曞ければなぁず思いたす。
こんにちはBASE Product Division サヌバヌサむド゚ンゞニアの東口 @Khigashiguchi です。䞻にEコマヌスプラットフォヌム「BASE」の決枈領域の開発や、 BASE BANK ずいうBASEの子䌚瀟にお 金融事業の立ち䞊げ を行っおいたす。 さお、2018/8/7(火)に、ランサヌズ、ReBuild、BASEの3瀟で゚ンゞニア向けの勉匷䌚「 レガシヌコヌド改革UT/CIでWebサヌビスの技術的負債を解消する取り組み 」を開催したした。 www.wantedly.com そこで「 PHPバヌジョンアップず決枈テストを支えたナニットテスト 」ずいうタむトルで発衚させおいただきたした。 「レガシヌコヌドを取り扱うためにどのようなナニットテストを曞いおいったか」に぀いお実䜓隓ベヌスでの取り組みず埗られた課題に぀いお話しおいたす。 参加者の方からも、「 実䜓隓ベヌスでの知芋が参考になった 」ずいったフィヌドバックもいただけたした。 登壇資料 この発衚は、 PHPカンファレンス関西2018 におLT発衚させおいただいた、 テストを曞いたこずがない゚ンジニアがテストを曞けるようになるたお゙やったこず の詳现版ずしお、以䞋のポむントに぀いお蚀語化させおいただきたした。 テストがないコヌドに察しお、どういう考え方でテストを曞いおいったか チヌムずしおどうやっおテストを広めようずしたか 結果ずしおどのような課題があったか 実際にコヌドレベルでの説明にたで萜ずし蟌んでいるので、同じ課題を持぀方にずっお䞀぀の有益な知芋ずしお参考になれば幞いです。 たた、今回はむベントタむトルが「 レガシヌコヌド改革UT/CIでWebサヌビスの技術的負債を解消する取り組み 」ずいうものなので、「 レガシヌコヌド 」をテヌマずした発衚になりたした。 そのため、「レガシヌコヌド」ずいうテヌマで発衚するに圓たり、䞻に䞋蚘の2点の曞籍を改めお読み盎しお発衚のコアずなる郚分の蚀葉をお借りさせおいただいおいたす。 www.shoeisha.co.jp www.shoeisha.co.jp ずおも参考になるので、今回の資料を入り口にそちらもご参考にしおいただければず思いたす。 たずめ ランサヌズ、ReBuild、BASEの3瀟で゚ンゞニア向けの勉匷䌚「 レガシヌコヌド改革UT/CIでWebサヌビスの技術的負債を解消する取り組み 」を開催したした。 レガシヌコヌドを扱うためのナニットテストの考え方ず曞き方に぀いお話したした。
はじめたしお、BASEビヌル郚郚長の氏原です。BASEのData Strategy Groupで機械孊習゚ンゞニアをしおいたす。 今回初登堎ずいうこずで、暑いずきにいいサワヌ゚ヌルのお話でも......ずいきたいずころですが、ここは開発ブログずいうこずなので仕方ありたせん。開発のお話をしたしょう。 珟圚私は商品の画像に基づいお、その商品に䌌た商品を類䌌商品ずしお提瀺するAPIの開発を行なっおいたす。今回はこのAPIをYahoo!さんの NGTNeighborhood Graph and Tree for Indexing を䜿っお䜜成したこずに぀いお曞いおみようず思いたす。 背景 BASE株匏䌚瀟はネットショップ䜜成サヌビス「BASE」を運営しおいたす。ここで䜜成されたショップはそれぞれ別のWEBサむトずしお公開されおいたすが、ショッピングアプリ「BASE」では䜜成されたショップを暪断しお商品を怜玢し賌入するこずができたす。しかしショップの数は公称で50䞇店舗、非垞に倚くの商品がありたすのでナヌザヌさんが興味を持぀であろう商品をいかにしお探しやすくするかはサヌビスにずっお喫緊の課題ず蚀えたす。その取り組みの䞀環ずしお、私は商品詳现ペヌゞにある関連商品の改善を目的に類䌌商品APIの䜜成を行っおいたす。 党䜓の抂芳 類䌌商品APIは以䞋の3぀の構成芁玠で成り立っおいたす。 画像の特城量抜出 新しい商品画像がサヌビスに登録された際に特城量を蚈算しお保存する 特城量のindexing 関連商品ずしお出す商品の画像を遞別しお近傍探玢甚のindexを䜜成する API 怜玢元商品の画像から近傍の画像を探玢しその画像に察応する商品を類䌌商品ずしお返す ではそれぞれに぀いお解説しおいきたしょう。 画像の特城量抜出 BASEには毎日結構な量の商品が新しく登録されおいきたす。既存の商品の画像を差し替えたりするこずもありたす。それらの新しい画像の特城量は随時蚈算しおおかないずいけたせん。 特城量抜出の党䜓構成 BASEでは商品画像をS3に保存しおいたす。S3ではファむルが登録されるず、そのこずをむベントずしお通知できたす。特城量抜出ではそれを利甚しお以䞋のようにシステムを組んでいたす。 S3, SNS, SQS S3で画像が登録されるず、そのむベントをたずSNSに投げたす。そしおSNSはそのむベントをそのたたSQSに投げたす。 䞀旊SNSを通しおいるのは、画像登録を契機に䜕かしらの凊理を行いたいずいう芁望は今埌他にも出おくるこずを想定しおいるためです。SNSであればsubscriberを増やせばむベントをbroadcastできたす。 こうしおS3に登録された画像はむベントずしおSQSに溜たっおいきたす。 ECS SQSに溜たったむベントを取りに行くのがECS配䞋で皌働しおいるServiceです。ここではSQSからむベントをpollingしお、取埗したむベントから画像を取埗しお䞀枚づ぀特城量を蚈算しおDBに保存しおいきたす。ECSはAuto Scalingず組み合わせればSQSが溜たっおきたずきにServiceを増やすのが簡単です。 画像の特城量 みなさん、画像の特城量ずいえば䜕を思い぀きたすかSIFTずかHOGでしょうか。最近ですずDeepLearningでしょうか。今回、画像の特城量の抜出にはMobileNetを利甚したした。 いちからMoblieNetを䜜るのではなく孊習枈みモデルをそのたた利甚したした。 Kerasのや぀ ですね。ホント楜になりたしたね。 from keras.applications.mobilenet import MobileNet model = MobileNet(weights= 'imagenet' , include_top= False , input_shape=( 224 , 224 , 3 ), pooling= "max" ) include_topはFalseにしおクラス分類のネットワヌクは倖しお特城量を抜出する郚分だけ䜿いたす。画像はもう単玔に224×224にリサむズしお䜿いたす。これで224×224のRGB画像からfloat32の1024次元のベクトルが埗られたす。 from keras.applications.mobilenet import preprocess_input from keras.preprocessing import image import boto3 import keras.applications.mobilenet import numpy as np import io # S3から画像を取っおくる s3 = boto3.resource( 's3' ) img_object = s3.Object(bucket, object_key) response = img_object.get() # 画像を読み蟌む img_data = io.BytesIO(response[ "Body" ].read()) img = image.load_img(img_data, target_size=( 224 , 224 )) # numpyのarrayにしおMobileNetの前凊理をする x = image.img_to_array(img) xs = preprocess_input(np.array([x]) # 特城量を蚈算する vec = model.predict(xs).flatten() 特城量を保存するDB 䞊で埗られた特城量はDBに保存しおおきたす。 今回特城量を保存するのにはAuroraを利甚したした。1024次元のfloat32のベクトルを保存するのに容量あたり気にしないでもいい堎所が欲しかったためです。でもRDSずか単にベクトル保存する堎所ずしおは機胜過倚ではありたす。必芁な機胜を考えるず単なるKey-Value Storeでいいんですが、ここは今埌も芁怜蚎です。 特城量のindexing 画像登録に連動しおDBに特城量を保存できるようになりたしたが、サヌビスで䜿うにはある画像の特城量vectorの近傍にあるvectorがどれなのかを知るこずができるようにしなくおはいけたせん。これを実珟するために今回は NGT を利甚したした。 NGTずは Yahoo!さんの説明をそのたた匕甚させおいただきたす。 NGTは任意の密ベクトルに察しお事前に登録した同次元のベクトルから最も距離が近いベクトルの䞊䜍数件k件を高速に近䌌k最近傍探玢k-Nearest Neighbor Searchするための゜フトり゚アです。 高次元ベクトルデヌタ怜玢技術「NGT」の性胜ず䜿い方の玹介 超高速に近傍のベクトルを探せる゜フトです。本圓に超高速です。350䞇件の1024次元のベクトルを登録しおみたずころ、メモリを15G皋床食いたすが近傍1000件取っおくるのに数十msくらいしかかかりたせん。これならキャッシュを䜵甚すれば十分䜿えるず刀断したした。 python wrapperもあるので䜿うのも簡単です。 index䜜成の党䜓構成 ECS Taskを利甚したバッチ凊理でNGTのindexを䜜成しおいたす。 ECS indexの䜜成は日次バッチで行うのでCloudWatch Eventをdailyで投げるようにしお、ECSがそれを受け取っおTaskを実行するようにしたした。 TaskはAuroraからindexingする特城量を取埗しおNGTに登録したす。このずき党郚の特城量を䜿うのではなく、叀い商品は登録しないなどある皋床の取捚遞択をしおいたす。 NGTはpython wrapperを䜿っおこんな感じです。適圓に簡略化しおたす from ngt import base as ngt ngt_index = ngt.Index.create(b "any/where/you/want/to/save/index" , 1024 ) # 結果は倧きいのでサヌバヌサむドCursor぀かう conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.SSCursor) cursor = conn.cursor() cursor.execute(......) # 画像の特城量ずかずっおくる # 倧きくお党郚持っおこれないから䞀個づ぀凊理 for row in cursor: image_id, vec = row oid = ngt_index.insert_object(vec) # NGT内でのobject idず画像のIDの玐付けは自分で芚えおおく必芁あり ... # indexの䜜成 ngt_index.build_index(num_threads= 8 ) S3 䜜成されたNGTのindexはS3に保存しおいたす。indexは毎日䜜成され、ある皋床の期間保存しお叀いものは捚おおたす。 API NGTのindexが日々䜜成されるようになりたしたので、今床はそれを利甚する郚分を甚意したしょう。 API提䟛郚分の党䜓構成 構成ずしおはAPI Gatewayを入り口ずしたECSの二段構えになっおいたす。 これは類䌌商品を取埗するずいう機胜ず類䌌画像を取埗するずいう機胜を分離させおおくこずで、類䌌画像APIを利甚した他の機胜の開発を簡単にするためです。䟋えば、珟圚BASEの商品の画像怜玢APIも開発䞭ですが、これはこの仕組みにそのたた乗っかっおいたす。 類䌌商品API ここは以䞋のような圹割を受け持ちたす。 API Gatewayから商品IDを受け取る 商品IDを察応する画像IDに倉換する 画像IDを類䌌画像APIに投げ、類䌌画像のIDを受け取る 類䌌画像のIDを察応する商品IDに倉換する 類䌌商品のIDをAPI Gatewayに返す やっおるこずはシンプルです。 構成のずころには出おいたせんが、毎床類䌌画像APIを呌ばなくおもいいようにElastiCacheを蚭眮しお、類䌌画像APIを呌ぶ前にそっちを確認しおいたす。 類䌌画像API ここはNGTの薄いwrapperになっおたす。やっおいるのは画像IDや画像の特城量そのものを受け取り、近傍の画像のIDを返すだけです。 ここはindex䜜成が終わったずきに新しいindexを読むように再起動されたす。この再起動はECSの仕組みを䜿っお耇数動いおいるECS Serviceを少しづ぀再起動させおいくこずでサヌビスずしおは無停止で行われるようになっおいたす。 実際にどう倉わるか では、構築したAPIで類䌌商品がどの皋床改善したかみおみたしょう。 この掋服の関連商品は以前のロゞックだず以䞋のようになっおたした。 うん、服ですらないですね。 正盎どうしおこれらが関連商品に䞊がっおきたのか謎です。名前だろうか。 で、それが今回のAPIで以䞋のように改善したした。 おお服だ ......たあそれだけで感動できるほど前のが悪すぎたずいう話もありたす。 雰囲気もなんずなく䌌おたすかね。ファッション系は抂ね良い感じに類䌌商品を出せるようになりたした。 たずめ 私の所属しおいるData Strategyチヌムは最近できたばかりで、たっさらなAWS環境を枡しおもらっおむンフラ含めお䞀から類䌌商品APIを構築するずいうなかなか楜しい経隓をさせおもらいたした。ただただ粟床を䞊げたいずころではありたすが、そこそこ良いものができたのではないかず思っおいたす。 実際関連商品のタップされる率は今たでの2倍ほどに䌞びおおり䞀安心ずいうずころです。 今回構築した類䌌商品APIでは今のずころ画像しか芋おいたせん。そのため少々コンテキストから倖れたものが出おくるこずもありたす。そこで珟圚商品のタむトルや説明も考慮するようにAPIをアップデヌトしようずしおいるずころです。もっず粟床を䞊げお、私がいいビヌルを探せるように......いえ、ナヌザヌさんがいい商品をみ぀けられるようにこれからも頑匵りたす。 開発した成果は、ショッピングアプリ「BASE」で芋るこずが出来たす。個別の商品を芋るビュヌをスクロヌルしお「関連する商品」をぜひご芧䞋さい。 iOS https://itunes.apple.com/jp/app/base-beisu-guo-nei-zui-da/id661263905?mt=8 Android https://play.google.com/store/apps/details?id=in.thebase.base P.S. 長くなるんで省きたしたが、実は今回䜜ったAPIのAWSの構成管理はTerraformで曞いお1発で構築できるようにしおいたす。その話はたたの機䌚にしたいず思いたす。
こんにちはBASE Product Division サヌバヌサむド゚ンゞニアの東口 @Khigashiguchi です。䞻にEコマヌスプラットフォヌム「BASE」の決枈領域の開発をしおいたす。 さお、この床、BASE株匏䌚瀟は7月14日土に開催された「 PHPカンファレンス関西2018 」にシルバヌスポンサヌずしお協賛いたしたした。 私は圓日スポンサヌ担圓ずしお参加し、前日に開催された「 PHPカンファレンス関西2018非公匏前倜祭 」ず合わせお2倜連続でLT発衚しおきたした。 たた、同じくBASE Product Divisionの田䞭 @tenkoma も本線の懇芪䌚におLT発衚いたしたした。 PHPカンファレンス関西2018 2018.kphpug.jp PHPカンファレンス関西は、倧阪・梅田のグランフロント倧阪で開催され、党囜のPHPerが集結したむベントになりたした。 メむン䌚堎の様子 BASEは、シルバヌスポンサヌずしお協賛いたしたしたので、オヌプニングにおBASEを玹介しおいただきたした。 発衚内容 本線 本線では、「 テストを曞いたこずがなかったBASE入瀟前から珟圚に至るたでテストに察しおどういう取り組みを行っおきたか 」をぎゅっず5分に詰めお話したした。 LT発衚䞭の様子 内容を詰めたので、ある意味「LTっぜく」スピヌド・テンポ感重芖のプレれンではありたしたが、芁点ず随所のポむントは無事䌝わったようで「䞀郚実践しおみよう」ずいう反応をいただけたので良かったです。 懇芪䌚 こちらは、先ほどご玹介した田䞭 @tenkoma の発衚です。 CakeFest2019 ずいうCakePHPにフォヌカスしたカンファレンスの候補地に日本が入っおおり、 「みんなで日本開催に投祚しよう」 ずいう話をしたした。 懇芪䌚LTの様子 7月30日たで投祚䞭 なので私もこのブログが曞き終わったら投祚したす 非公匏前倜祭 非公匏前倜祭では、 PhpSpreadsheet ずいうラむブラリを扱う䞊でトラブルシュヌティングに぀いお話したした。  非公匏前倜祭での様子 「PHPでExcelを扱ったこずがある方」が参加者の方に倚かったので、 「あるある」 ずいう共感をいただきながら、ラフに話させおいただきたした。 たずめ PHPカンファレンス関西2018にスポンサヌし、せっかくの倧阪遠埁なので匵り切っお2倜連続LTにチャレンゞしおみたしたが、充実感があっお楜しかったのです。 ただ、個人的な反省ずしおは䞡日資料完成が発衚盎前になるくらい远い蟌たれたので資料準備はより蚈画的にしないずです。 もし来幎参加される方はチャレンゞしおみおはいかがでしょうか。 続きは8/7 (火)の勉匷䌚で 今回、PHPカンファレンス本線で5分に詰め蟌んだテスト関連の話を15分に䌞ばした詳现版を、8月7日火に開催する゚ンゞニア向け勉匷䌚におお話ししたす。ランサヌズさん、ReBuildさんにもお越しいただき、CIや技術的負債を解消する取り組みに぀いおお話ししおいただきたす。 ご興味のある方はぜひ䞋蚘のペヌゞよりお申蟌みください。 base.connpass.com
こんにちは、BASEのDesign Groupに所属しおいる 北村 です。 珟圚は䞻にプラットフォヌムずアプリのデザむンを担圓しおいたす。 BASEのデザむンチヌムはここ数幎で䞀気に人が増え、瀟内でも倧所垯の郚眲ぞず成長したした。今回は、BASEのデザむナヌが日々の開発でどんなこずを行い、どんなこずを考えおいるのかに぀いおご玹介したいず思いたす。 1. BASEのデザむナヌの圹割 プロゞェクトの共通認識を䜜る仕事 BASEでは仕様怜蚎の段階からデザむナヌが入り、プロゞェクトの担圓者ず䞀緒に開発芁件を詰めおいきたす。ずきには箇条曞きの芁件曞からワむダヌを起こし、UIをアりトプットしおいきたす。画面デザむンが先にあるず、メンバヌ同士のコミュニケヌションがスムヌズになり、か぀他郚眲ずの認識合わせも円滑になるため、BASEの開発フロヌでは たずデザむンありき ずいう文化が浞透しおいたす。たた単玔に、先にデザむンがあるず実際の画面をどう䜜っおいけば良いのかチヌムの皆で把握しやすい、ずいう利点がありたす。 プロゞェクト内で共通認識ずなるアりトプットを担うのが、BASEのデザむナヌの仕事のひず぀です。 BASEにおけるデザむナヌの責任 BASEでは基本的に、プロゞェクトにアサむンされたデザむナヌ本人がデザむンクオリティのチェックを行いたす。 さらに、担圓デザむナヌが自分で画面のUIを実装するこずも倚いです。最近はフロント゚ンド゚ンゞニアも増えたので分業が進んではいたすが、䟋えば现かなむンタラクションの実装やUIの改修などはデザむナヌ自身が積極的に行っおいたす。 画面のUIを蚭蚈するだけでなく、最終的なUXの担保たで担うのが、BASEのデザむナヌの責任範囲になりたす。 2. BASEのデザむン思想ず、倧切にしおいるこず 「お母さんも䜿える」ずいう共通蚀語 BASEには瀟内党䜓の共通蚀語ずしお「 お母さんも䜿える 」ずいう思想が存圚しおいたす。 これは、BASE創業圓時から倉わらない哲孊で、代衚取締圹CEOである鶎岡の匷いポリシヌであり、「BASE」の重芁なコンセプトです。 ずいうのもこのコンセプトは、「BASE」のサヌビス立ち䞊げのストヌリヌにた぀わりたす。鶎岡の母は、倧分の商店街で掋品店を営んでいたすが、「ネットで服を売っおみたい」ず鶎岡に盞談があったので、楜倩のような倧手のECモヌルを䜿っおみるよう勧めたしたが、䜿い方が難しくおできないず母から返っおきたす。 その際に鶎岡は、母ず同じような悩みを持っおいる人が䞖の䞭にたくさんいるのではないかず感じ、「BASE」の開発を始めた、ずいう背景がありたす。 お母さんのために、良くも悪くも「機胜を぀けない」 䟿利だけれど䜿い方が難しい機胜よりも、いかにクリック数を少なくしお、簡単にショップを開蚭・運営しおもらうかが最優先事項になりたす。 4、5クリックしなければならない機胜より、2、3クリックで完了する機胜を開発・提䟛する。たずえば、ナヌザが䞀番䜿甚する管理ペヌゞには、あえお機胜を぀けないなど、蚭蚈に぀いおは、圓初から「ナヌザの手間を枛らすための開発」を意識しおいたした。 珟圚、BASEチヌムには13人ほどの゚ンゞニアがいたすが、新しい機胜ができおもチヌム内で「この機胜は、お母さんたちには䜿えないのでは」ずなったら、たずえ䟿利そうな機胜でもリリヌスしおいたせん。 出兞 お母さん目線で䜜っおみたら、「BASE」はシンプルなサヌビスになった BASEではプロダクトの開発䞭、あらゆる堎面・文脈で「 お母さん 」ずいう単語が出おきたす。「これっお耇雑すぎおお母さんは䜿えないよね」や「この説明、お母さんに䌝わるのかな」など、議論の䞻語ずなるこずがずおも倚いです。 耇雑な仕組みだったずしおも、お母さんも䜿えるくらい簡単なサヌビスずしお提䟛するのが、プロダクトを䜜るずきに最も倧切にしおいる思想です。 誠実さを倧切にしおいる、BASEのデザむン思想 「お母さんも䜿える」を実珟するために、デザむナヌで䜜成したデザむン思想がありたす。 誠実であるこず あらゆるナヌザに寄り添える、柔軟な拡匵性 䟡倀を最倧化させる新しいショップ䜓隓 「お母さんも䜿える」芪しみやすいサヌビス 簡単じゃないものを簡単に BASEのデザむナヌはなによりも「誠実」さに重きをおいおいたす。 䟋えばナヌザが䜕かものを売りたいず思ったずきに、今たでだずハヌドルが高くお気軜にできなかったものを、誰でもできるようにするのがむンタヌネットの力で、BASEはそのむンタヌネットのポゞティブな力を信じおサヌビスを䜜っおいたす。 䞀方で、むンタヌネットがむンフラずしお広たっおいく䞊で負の偎面もあり、䌝え方次第では誀った情報が倚くの人に広たっおしたったり、誰かを傷぀けおしたうこずがあったりしたす。 そういった意味で、デザむンの圹割は非垞に重芁です。倚くの人に圱響を䞎えるむンタヌネットずいうむンフラ䞊でサヌビスをデザむンする以䞊、誠実さを忘れおはいけない、ずいう思想を倧切にしおいたす。 3. デザむン思想を実珟するワヌクフロヌ では実際に、2 のデザむン思想を実珟するために行っおいるワヌクフロヌをご玹介したいず思いたす。 BASEにおけるデザむンのフロヌ PMやディレクタヌから機胜芁件がくる 芁件・仕様を元にデザむナヌがワむダヌ、たたはプロトタむプを起こす 起こしたデザむンを「 UI/UXミヌティング 」でレビュヌする 実装に入る 週2回おこなわれるUI/UXミヌティング BASEでは週に2回、UI/UXミヌティングずいう堎が蚭けられおいたす。 このミヌティングでは、各デザむナヌそれぞれが担圓しおいるプロゞェクトのUIをレビュヌしおもらいたす。 プロゞェクトの粒床によっおたちたちですが鶎岡、PM、ディレクタヌ、プラットフォヌムデザむナヌ、アプリデザむナヌ、フロント゚ンド゚ンゞニア、CSが䞀堂に䌚し、デザむナヌの䜜成したUIを芋ながらみんなで議論し合いたす。 他のデザむナヌ目線でのUIに察するダメ出しも含め、ビゞネス芖点からの芁望や、実装に察するツッコミ、党䜓のUXぞの指摘など、倚角的な意芋が入りたす。もちろん「そもそもその機胜っお必芁なの」ずいう意芋が出るこずも倚々ありたす。そこをたずめお取捚遞択するのもデザむナヌの圹目です。 たずえ途䞭で仕様が倉わろうずも プロゞェクトのメンバヌだけでは把握できなかったより倧きなナヌザ䜓隓が、UI/UXミヌティングでの議論で芋えおくる郚分もありたす。先日公開された゚ンゞニアの 日比野 、 柳川 の蚘事でも曞かれおいたしたが、BASEではプロゞェクトを進行しおゆくなかで「ちゃぶ台返し」が起こるポむントがしばしば発生したす。 デザむン目線でいうず、䟋えば 「簡単じゃないものを簡単に」が満たされおない 「芪しみやすさ」が満たされおない 「䟡倀を最倧化させるショップ䜓隓」が満たされおいない 「お母さんも䜿える」が満たされおない この郚分の螏み蟌みが甘く、議論が充分でないたたプロゞェクトが進んでしたった時に、UI/UXミヌティングで指摘を受けるこずも倚いです。 これはBASE党䜓にデザむン思想が浞透しおいるからこそ起こる議論で、たずえもう䞀床仕様を緎り盎すこずになったずしおも、より良いものを䜜る努力は惜したない、玍埗するたで議論する、ずいうBASEの「SPEAK OPENLY」のあらわれだず思っおいたす。 たずめ BASEのデザむナヌは裁量が倚く、担う範囲も広いですが、開発の䞊䜍レむダヌから関われる環境ずいうのはやはりやり甲斐がありたす。 誠実にサヌビスを䜜る、ずいうBASEのデザむナヌが倧切にしおいる思想に共感しおくださった方、䞀緒サヌビスを䜜りたしょう デザむナヌを随時募集しおいたす jobs.binc.jp
こんにちは、Back-end Engineer の田䞭 @tenkoma です。ショッピングアプリ 「BASE」向けAPIの開発を担圓しおいたす。 去る6月16日に犏岡で開催された「 PHPカンファレンス犏岡2018 」に参加しおきたした。圓日は䞀般参加でしたが、前日に開催された 非公匏前倜祭 リゞェクトコン で発衚しおきたのでブログでもご玹介したす。 BASEのPHPアプリケヌションは2018幎5月にようやくPHP7化が完了したした。 アップデヌトプロゞェクトの䞭でナニットテストしやすくするためにテストスむヌトをカスタマむズしたので、発衚で3぀ほどをTipsずしお玹介したした。 玹介した3぀のTipsに぀いおこの蚘事でも説明したす。 Tips 1. assertSame() で配列のdiffを出力できるようにする PHPUnit 7 で assertSame() は 配列のdiff を出力できる ようになりたした。CakePHP2アプリ(デヌタ圢匏ずしお配列を倚甚する)で䜿えるずありがたいのですが PHPUnit 7 の利甚は難しそうです。そこで、配列のdiffを出力できるように移怍しおみたした。以䞋のように出力されたす。 SampleTest.php <?php App :: uses ( ' ExtendTestCase ', ' ExtendTestSuite.TestSuite ' ) ; class SampleTest extends ExtendTestCase { public function testAssertArray () { $ actual = [ ' User ' => [ ' id ' => 1 , ' name ' => ' Taro ' ]] ; $ expected = [ ' User ' => [ ' id ' => ' 1 ', ' name ' => ' Taro ' ]] ; $ this -> assertSame ( $ expected , $ actual ) ; } } 出力 There was 1 failure: 1) SampleTest::testAssertArray Failed asserting that Array &0 ( 'User' => Array &1 ( 'id' => 1 'name' => 'Taro' ) ) is identical to Array &0 ( 'User' => Array &1 ( 'id' => '1' 'name' => 'Taro' ) ). --- Expected +++ Actual @@ @@ Array &0 ( 'User' => Array &1 ( - 'id' => '1' + 'id' => 1 'name' => 'Taro' ) ) テストが倱敗したずきかなり原因がわかりやすくなるので、すぐにPHPUnit 7にアップグレヌドできない堎合は以䞋のコヌドを実装するず䟿利です。 assertSame ExtendTestSuiteConstraintIsIdentical.php Tips 2. テストスむヌト向けにナニットテストを曞く setUp() , tearDown() などに蚘述したコヌドをどうテストするか、ずいう話で test for test cycle(setUp/tearDown) #1 のようなテストコヌドを曞きたした。 スラむドの最埌で、CIで耇数のPHPバヌゞョンでテストした話をしたしたが、そのためのCircleCIの蚭定は .circleci/config.yml のようになっおいたす。 Tips 3. runkit, php-timecopのコヌドをIDEで補完するためのスタブ PhpStorm組み蟌みのスタブファむル に無い runkit , php-timecop のようなPHP拡匵のコヌドを補完できるようにするものです。以䞋のリポゞトリを git clone しおIDEの include_path に远加しおお䜿いください。 tenkoma/php-stubs-mighty-magic カンファレンスレポヌト 以䞋はカンファレンス圓日・非公匏前倜祭埌倜祭のレポヌトです。来幎も開催されるらしいので、参加したい方の参考になれば幞いです。 前日に犏岡入り (6月15日・金) 非公匏 PHPカンファレンス犏岡2018前倜祭リゞェクトコン PHPカンファレンス犏岡を楜しむには前日入りが必須。13:30頃に犏岡空枯に到着したした。 このずきただリゞェクトコンの資料が仕䞊がっおいなかったので博倚駅近くにずったホテルで資料の手盎しをしたした。 リゞェクトコンの䌚堎であるLINE Fukuoka株匏䌚瀟ず同じビルの1Fで知り合いの方ず䞀緒に食事を取り、19:00 に䌚堎到着したした。 以䞋、発衚前の珟堎の様子です。 䌚瀟に報告しないずいけないので写真撮っおる pic.twitter.com/amuPYMhBaX — Koji Tanaka (@tenkoma) 2018幎6月15日 発衚順は1番目。印象に残るよう GitHub Username Shirt を着お発衚したした。 #phpconfuk_rej @tenkoma さんヌ pic.twitter.com/l0xKtavLKp — 青ごぞいもち (@blue_goheimochi) 2018幎6月15日 カンファレンス本線より倚い同時3セッション。だれも聞きに来なかったらどうしようず思いたしたが、倚くの人に聞いおいただけたようです。 PHPカンファレンス犏岡2018 圓日 (6月16日・土) PHPカンファレンス犏岡2018 PHPカンファレンス犏岡は去幎初参加でした。そのずきは前日午前2:00くらいたで懇芪䌚に参加した結果圓日1時間以䞊遅刻しおしたいたしたが、今幎は午前10時に間に合いたした。 「PHPカンファレンス犏岡2018」は同時2セッションです。2぀の䌚堎は䞡方ずも垭に䜙裕がある感じで出入りがしやすかったです。 参加したセッションに぀いお玹介したす。 MySQLで画像 を扱うメリット・デメリットず障害・解決事䟋 資料: MySQLで画像 を扱うメリット・デメリットず障害・解決事䟋 - Speaker Deck 以前実装しおみたこずがあり、メリット・デメリットに぀いお実感したので、さらに孊がうずおもい参加。 発想ずしおは思い぀きがちですが、適甚するメリットの倧きいケヌスは限られそうですね。 ログの蚭蚈しおたすかPSR3ずログ蚭蚈の話 資料: ログの蚭蚈しおたすかPSR3ずログ蚭蚈の話 - Speaker Deck 䜕をログに残せば良いかで迷うこずが未だにあり、呚蟺知識を匷化したくお参加。ログのリスクの郚分を䞀番集䞭しお聞いおたした。 Event Sourcing,CQRS For PHP Application 資料: Event Sourcing,CQRS For PHP Application - Speaker Deck 耇雑化するサヌビスのための蚭蚈パタヌン、アプリケヌションずミドルりェアの組み合わせ䟋玹介。扱うデヌタやトランザクションが増えたり、集蚈分析などのシステムがあるず必芁ずされそうに思いたした。 Testing Live!!! 資料: Testing Live!!! 実際のWebサヌビスに察しお探玢的にテストを行い、問題を探すデモでした。5分ずいう短い時間でアプリケヌションに朜む䞍敎合が芋぀かり、䌚堎がすごく盛り䞊がっおたした。 PHP 5.3 + CakePHP1.3 バヌゞョンアップ報告 資料: PHP 5.3 + CakePHP1.3 バヌゞョンアップ報告 - Speaker Deck 去幎、同じくPHPカンファレンス犏岡で発衚された蚈画の珟状報告。BASE もCakePHPを利甚しおいるので、気になりたした。 物理局のこず、時々でいいから、思い出しおください。 資料: 物理局のこず、時々でいいから、思い出しおください。 - Speaker Deck システムの物理局ずいうより物理むンフラ構築運甚に぀いお面癜おかしく玹介。倱敗談が聞いおいお面癜すぎたした。 その他 スポンサヌブヌスも参加者に足を運んでもらえるようAsk The Speakerコヌナヌ(セッション埌に発衚者に盎接質問できる堎所)ずコヌヒヌが甚意されおおり、い぀行っおも賑わっおいたした。 翌日 (6月17日・日) いっぱいご参加頂けお嬉しい限り #phpconfuk_after #fusic pic.twitter.com/CEMKSoHJit — せいけ しろヌ (@seike460) 2018幎6月17日 非公匏 PHP Conference Fukuoka After Hack!! 去幎同様、株匏䌚瀟Fusicのセミナヌルヌムで開催されたので参加したした。参加者各自で自由に䜜業しながら、発衚したい人が自由に発衚するようなゆるやかな集たりでした。 僕は前倜祭で発衚した内容のコヌド tenkoma/extend-cakephp2-testsuite-example の準備をしおいたのですが、飛行機の郜合で2時間ほどしか参加できたせんでした。 来幎もし開催されるなら、絶察フルで参加できるように調敎したす たずめ 非公匏前倜祭 リゞェクトコンで発衚したした PHPカンファレンス犏岡、フルで楜しむなら前埌のむベントもチェックしおみるのがオススメです。
こんにちは、BASEのPayment Engineer Groupに所属しおいる 柳川 です。 先日BASEではショップコむンずいう新機胜をリリヌスしたした。ショップコむンの説明を簡単にするず、BASEをご利甚いただく各ショップさんが、独自にショップで䜿えるコむンを発行するこずで、ショップさん独自の経枈圏を䜜れる機胜です。詳しい説明は こちら をご芧いただけるず幞いです。 私はこの機胜の開発でサヌバヌサむド゚ンゞニアずしお蚭蚈、開発、リリヌスを行いたした。 今回は開発者ブログの蚘事ずいうこずで、開発しおいお気が぀いたこずをたずめおみたいず思いたす。 事前情報 プロゞェクトの特城 修正範囲がでかい 新芏コヌド既存の決枈コヌドに手を入れる 端的にいうず新しく決枈方匏を䜜るずいうこず 開発量に察しお実装者が少ない サヌバヌサむド゚ンゞニア:1人 デザむナヌ:2人 私の特城 倧芏暡開発をしおいたSIer出身。 プロゞェクトの情報ず私の特城から、SIer時代の開発経隓をうたく掻かせば、䞊手にプロゞェクトを回せるのではずうっすら考えながら開発に挑むのでした。 やったこず UMLを曞いた 開発が始たる前に、自分の䞭で以䞋のこずを確認したいず考えUMLを曞きたした。 ヒト モノ コト カネ このあたりのこずを詰めるず、実装の挏れが防げるず考えおのこずでした。 SIerからスタヌトアップに転職しおからは、関係者の人数が少ないこずや、スピヌドが求められるこずからこの工皋を省くこずも倚かったのですが、今回はそうも蚀っおはいられない物量であるず考えおSIer時代の知識を匕っ匵り出しおきたした。このずき曞いたUMLが、人に蚭蚈を共有する䞊でも圹に立ちたした。少人数で開発しおいるず、開発䞭の内容がブラックボックスず化しおしたうきらいがありたすが、その点を少なからず軜枛できたのではないかず思いたす。 たた図に起こすこずで、゚ンゞニア以倖も盎感的に機胜の把握が行えたようです。匊瀟がドキュメント管理ツヌルずしお䜿甚しおいる DocBase にお PlantUML の蚘法が䜿甚できるため、そちらを䜿甚しおUMLを蚘述したした。文章でダむアグラムの䜜成ができるので、通垞のドロヌむングツヌルに比べ、あずからの倉曎が非垞に容易でした。おすすめです。 蚭蚈曞を曞いお蚭蚈曞のレビュヌをした 転職埌はあたり行っおこなかった、蚭蚈曞自䜓のレビュヌをしたした。 小さな機胜開発であれば 頭の䞭や手元のメモで蚭蚈→実装→コヌドレビュヌ→リリヌス この流れで、進めお倧きな問題はないように思いたす。 しかし今回は開発量の倚さが懞念されたため、SIer時代を思い返しお、蚭蚈曞をある皋床曞いお、なおか぀蚭蚈曞のレビュヌもしようず考えたした。臎呜的な指摘等炙り出せたので、本圓にやっおよかったず思いたした。 ちゃぶ台返しポむントを積極的に䜜った SIer時代の経隓を思い出しお蟛いのが倧幅な手戻り、いわゆるちゃぶ台返しずいうや぀です。 残念ながら自瀟プロダクトの開発でもちゃぶ台返しは起こりたす。倧切なのはいかにちゃぶ台返しのむンパクトを少なくしお、プロダクトのクオリティの向䞊に掻かすか。 ちゃぶ台返しは敵ではなく、味方なのです。 今回はちゃぶ台返しぞの察抗手段ずしお、いろいろなずころで现かくちゃぶ台返しを起こさせるずいう䜜戊を取りたした。 蚭蚈曞のレビュヌ 耇数回のコヌドレビュヌ 出来おいる堎所たでをデプロむしお操䜜しおもらいながらのレビュヌ 䞊蚘のように開発期間䞭に数々のレビュヌをはさみたした。 ちゃぶ台返しの回数こそ倚くなったような気はしたすが、結果的に工数が収たった䞊でクオリティを䞊げられたのではないかず思いたす。ポむントずしおはSlackでレビュヌを䟝頌をするだけではなかなか芋おもらえないので、必芁ず思うタむミングで必芁な人には明確に時間を取っおもらいレビュヌを行うこずです。他力本願は駄目 リリヌス前にQAプロセスを入れられたこず 今回少人数での開発、か぀開発量が倚かったこずもあり、明瀺的にQA期間を蚭け、リリヌス前の怜蚌を行いたした。機胜の開発に関わっおいないメンバヌの新鮮な目で、QAをおこなっおもらうのは、実際にバグが朰せるのはもちろん、粟神的にも倧きな助けずなりたした。 うたくやれなかったこず リリヌスの単䜍がでかくなっおしたった この 発衚資料 を読みながら反省したのですが、リリヌスの単䜍がでかくなっおしたったのは反省点かなず思いたす。埌で確認する範囲がでかくなるだけなので、できるだけ现かく早く出すべきだったず思いたす。ただすぐには本番皌働しないコヌドを本番に組み蟌むのも圱響確認ずロヌルバックずいう点でどうだろう、ずいうのはあるので難しいずころかなずも思いたす。 リリヌス前の忙しい時期がうたく回らなかった 開発自䜓は、少ない人数でも段取りをしながら進めるこずが出来たのですが、リリヌス盎前に立お蟌んでくるず、開発䜜業ずそれ以倖䜜業の垜子をかぶり盎すこずが出来たせんでした。特にリリヌス前のQA䜜業を行うこずず、バグを修正するこずを同時に行うのが厳しかったです。リリヌス盎前に忙しくなるこずがわかっおいるなら、極力垜子をかぶり盎すこずなく進められるように、人をアサむンしおもらうなどで準備するべきでした。 開発範囲が少ない堎合は、できるだけ䞀人でやったほうがスピヌディヌに進められたすが、ある皋床開発範囲が倧きくなるず、各人が各ロヌルに分かれた䜓制を䜜るこずに匷みが出おくるのだろうなず思いたした。このあたりは今埌の課題かなず思いたす。 たた、自分が今䜕に集䞭すべきかを客芳的に考えるのが倧切だず感じたした。テンパらない。 たずめ 倧きめの機胜開発を、䞻導する立堎ずしお担圓させおいただき、非垞に勉匷になりたした。たるごず任せおいただけたからこその気付きが倚かったように思いたす。特に蚭蚈曞を䜜る、開発プロセスを明確化する等のSIerで培った技術が圹に立ったのはいい経隓でした。 SIer時代は、最初から決たりずしおあった開発の手順に窮屈感を感じるこずもありたしたが、実際になんのために行うのかずいうこずを考えお、開発䞭の課題ず照らし合わせおいくず、力ずなる郚分は無数にあるなず感じたした。 圓たり前ですがSIerでもスタヌトアップでもアプリケヌションを䜜るずいう䞊では同じです。アプリケヌション開発の道具ずしお䜿える゜フトりェアの開発手法を、積極的に取り入れおいくべきだず感じたした。すべおの開発工皋が最初に描いたずおりに進んだわけではありたせんでしたが、それも含めいい経隓でした。忙しく開発䜜業を終えたあずは、知識の吞収が早い気がするので、振り返られなかった分をしっかり振り返っお、孊ぶべきものを芋定め孊んで、次に掻かしたいです。日々勉匷。 最埌に BASEでは、様々な経隓を掻かしながら䞀緒に未来を䜜っおいく仲間を募集しおいたす。前向きか぀自由にやっおいけるのは間違いない環境です。 ご興味を持たれた方は以䞋の採甚情報から jobs.binc.jp
こんにちは、CTOの藀川です。 これたで゚ンゞニアの肩曞においお、゚ンゞニア専門職の䞊玚職ずしおリヌド゚ンゞニアずいう圹割を蚭定しおおりたした。 リヌド゚ンゞニアず蚀うず、䞖間の芋方ずしおは「技術力に優れた゚ンゞニア」ずいうやや挠然ずした圹割ず想像しおいるのではないでしょうか Webサヌビス開発における「技術力」ずは 「良いサヌビス」ずは 「良いサヌビス」を提䟛するために、゚ンゞニアに求められるスキル Webサヌビス䌁業における゚ンゞニア属性「テック」ず「サヌビス」 「テックリヌド」ず「サヌビスリヌド」の圹割 リヌド゚ンゞニア テックリヌド サヌビスリヌド 「サヌビスリヌド」ずは、その䞀文字を盎す䜜業に意矩、喜びを感じられるこず 䞀緒に良いサヌビスを䜜りたせんか Webサヌビス開発における「技術力」ずは そもそも「技術力ずは䜕ぞや」ずいうのが曖昧なこずが倚いです。 ずいうのも、私共が担っおいるビゞネスは、Webサヌビスを提䟛しおいたす。Webサヌビスは24時間365日運甚されおいたすので、必芁な技術も倚岐に枡りたす。毎日新機胜を開発しおいたすし、継続的か぀安定的に運甚しおいく必芁がありたすし、セキュリティ芁件は日々倉わっおいきたす。 僕らはコンピュヌタサむ゚ンスの力の恩恵を受け぀぀、特には恩返しを詊み、サヌビス実珟ずしおの゜フトり゚ア゚ンゞニアリングを掚し進め、ナヌザヌさんに䜿い続けおいただくサヌビスを継続的に開発運甚しおいくこずが求められたす。 我々の堎合は、フリヌミアムなECプラットフォヌムですから、倚くのショップオヌナヌさんのビゞネスや生掻を支えるこずを生業ずしお、結果ずしお生たれた流通総額GMVずいう成果に連動しおお絊料をいただきたす。 たた、サヌビスそのものは倖郚環境に合わせお倉化しおいくこずが必芁ですので、それをスピヌディヌに掚進する力が゚ンゞニアには求められたす。Webサヌビスで䜕もしないのはビゞネス的にもセキュリティ的にも退化を意味したす。垞に時代の倉化にアンテナを匵り、技術を甚いお倉化を生み出しおいきたす。たた、そのような技術的問題点を䞀切感じさせるこずなくナヌザさんには安心しお䜿っおいただけるように良いサヌビスずしお提䟛しおいく必芁がありたす。 「良いサヌビス」ずは Photo by WOCinTech Chat  ここで蚀う、良いサヌビスずは、 サヌビスクオリティ 目的に察しavailableではなく、usefulであるこず。 プロダクトクオリティUIを通じた高い品質のサヌビスを安心、安定しお䜿えるこず サむト信頌性 倉化ず継続 スケヌラビリティ 䜕が起きおも困らない セキュリティ などで構成されたす。 「良いサヌビス」を提䟛するために、゚ンゞニアに求められるスキル これらを元に私共が提䟛するサヌビスを実珟するこずに関しお、゚ンゞニアに求めるスキルに぀いお軜く想像するだけでも、結構たくさん思い぀きたす。 Webアプリケヌションの技術開発力PHP等のサヌバサむド蚀語、JS、動画アプリケヌション よいWebサヌビスを䜜るサヌビス開発力UI/UX、ビゞネスフロヌ、サヌビスを実装に倉える力 HTML5、iOSやAndroidアプリケヌションのアプリ開発力䞻にパフォヌマンス、安定性、OSの知識等 Webフロント゚ンド、iOSやAndroidアプリケヌションのUI開発力クリ゚むティビティの実珟、UI安定性 サヌバむンフラの実珟力、DevOpsの開発力、AWS等のクラりドの知識 セキュリティをしっかり維持する力、もしくは過去の問題の発芋力 サヌビスの継続的運甚に関するコミットメントを持おる力 なにげに、これは特殊技胜だず思いたす 機械孊習やAIなどを実珟する技術力、統蚈的知識 倉化するフロント゚ンドをキャッチアップし、クリ゚むティビティず結び぀ける構築力 芁件をチヌムにわかりやすく翻蚳する翻蚳力、ドキュメント力 未来に向けたアヌキテクチャ蚭蚈、倉化を実珟する力これはスキルだけあっおもできない プラットフォヌム開発力、倖郚パヌトナヌを巻き蟌むAPI開発力など プロゞェクトマネゞメント、アゞャむル等工皋蚭蚈力ず実践力 テストやQAなどプロダクトクオリティを実珟する方法論に長けおいるこずず、チヌムメンバヌを匕っ匵る力 PHPそのもの、フレヌムワヌクそのものの成長性維持に貢献する知識、人脈、コミットメント、コミュニティ掻動ができる力 Webサヌビス䌁業における゚ンゞニア属性「テック」ず「サヌビス」 ここに挙げた通り、䞀぀のWebサヌビスの成長に必芁なスキルぞの関心に぀いお、䞀人の゚ンゞニアがすべお満たすのは珟実的に䞍可胜です。 Webサヌビスの゚ンゞニアに期埅される胜力のわかりやすい事䟋ずしお、深倜に起きおいるこず障害などではなくアラヌトなどの適応力は、䜕より我々のビゞネスそのものぞの関心がなければ、到底できるものではありたせん。「このアラヌトは今は気にしなくおも倧䞈倫」の䞀蚀をSlackに投げるためのバックグランドにある技術知識ず圓瀟のサヌビスの経隓こそがWebサヌビスの゚ンゞニアずしお求められる郚分です。 もちろんやるこずはそれだけではないですから、゚ンゞニアそれぞれ特技にあわせお圹割を定矩し、貢献、成果を評䟡できる䜓制を぀くり、その総䜓ずしお゚ンゞニアチヌムを構成しおいくこずになりたす。それに必芁な貢献を期埅できる胜力に、投資的にお絊料を先払いするのに必芁な肩曞を䞊玚技術職ずしお割り圓おおいくこずになりたす。 それに必芁な胜力を抜象的にたずめおいった時に、Webサヌビス䌁業の゚ンゞニアに求められる胜力属性には「テック」ず「サヌビス」ずいう括りがあるこずにたどり着きたした。 テックのスキルが優れおいるだけで良いサヌビスが䜜れるほどWebサヌビスは甘くありたせん。䞀方で、良いサヌビスを䜜るためにはテックの適応力は䞍可欠です。たた時間軞ず共に倉化しおいく技術に察する適応性、応答性は、テックのスキルが優れおいる人材が埗意ずする分野です。 「テックリヌド」ず「サヌビスリヌド」の圹割 今回、テックずサヌビスにおける理想像をたずめお、それらを達成しおいる暡範ずなるべき゚ンゞニアを「リヌド゚ンゞニア」ず定矩し、曎に现かい属性ずしお、「テックリヌド」ず「サヌビスリヌド」ずいう肩曞を定矩したした。 Webサヌビス䌁業の゚ンゞニアはテックぞの適応力ずサヌビス開発力は䞍可分です。しかし、その人の魅力の出自はテックなのかサヌビスなのか、どちらに立脚するかで肩曞を倉えおいたす。今回、その圹割定矩を行いたした。 その定矩が以䞋になりたす。たずは、リヌド゚ンゞニアの圹割です。 リヌド゚ンゞニア 事業に配属され、事業の䞭での開発やサヌビス運営をリヌドする以䞊の成果を期埅されたロヌル。 サヌビスの継続的発展を実珟するための技術力や、BASEのサヌビス哲孊を具珟化するためのサヌビス開発力などを兌ね備え、圧倒的な䞻䜓性でサヌビスの成長に取り組む暡範ずなるべき圹割を担う。 「圧倒的な䞻䜓性」こそがリヌド゚ンゞニアにずっお重芁なポむントです。 そしお、テックリヌドです。 テックリヌド 高い技術力を持ち、時代の倉化を読みながら、適切な技術を、適切なタむミングず適切な方法で自瀟サヌビスに取り入れ、スケヌラビリティの実珟や高いセキュリティを通じおサヌビスの進化に寄䞎するこずが期埅される。サヌビスの継続的進化を担い、メンバヌの技術的成長の暡範ずなる圹割 「適切な技術を、適切なタむミングず適切な方法」を暡玢するこずを匷く求めおいたす。技術倉化の激しい業界だからこそ、タむムラむンに日々流れおくるような玠敵な技術ありきではないずいうこずです。たた、チヌムに倉化を生み出すスキルがテックリヌドには重芁です。それが「サヌビスの継続的進化を担う」ずいう郚分に期埅されおいたす。 該圓職皮はWebアプリケヌション゚ンゞニア、フロント゚ンドWeb、App問わずに加えお、SREのようなDevOps゚ンゞニアや技術基盀を担うアヌキテクトなども想定しおいたす。 そしお、今回远加したのがサヌビスリヌドです。 サヌビスリヌド BASEのサヌビス哲孊を熟知し、高い顧客䜓隓を実珟するサヌビスを開発するこずで、䜓隓の質を通じたサヌビス信頌性を実珟する。 顧客に支持され続けるサヌビスの継続的発展に寄䞎し、サヌビスづくりの暡範ずなる圹割。 圓瀟のサヌビスでビゞネス芁件をサヌビスずしお蚭蚈する際に、ナヌザヌぞのベネフィット実珟を前提ずしおすべおを再構築する必芁がありたす。぀たり「本圓にその芁求はナヌザベネフィットが提䟛できるのかプロダクト偎で党郚掗い盎せ」ずいう工皋が必芁なのですが、そのあたりのアレンゞを゚ンゞニアずいう圹割の䞭で期埅できる人材がサヌビスリヌドです。 䟋えば、぀い぀い受蚗出身だず僕自身がそうなのですが、ビゞネス芁件は実珟すべき前提条件ずしお盲目的に受け入れおしたいがちですが、そのたた無理やり実装したずころで戊闘力のある良いサヌビスが提䟛できないのであれば、すべおの話をひっくり返さなくおはいけないかもしれたせん。そこぞのサヌビス思考力が「高い顧客䜓隓」の実珟には䞍可欠です。その芖座を元に高いプロダクトクオリティを実珟するこずがサヌビスの継続的発展に繋がりたす。 たた、顧客ニヌズに耳を傟け、時には己の刀断で即座に修正を行える信頌ずいうのも必芁です。その修正の粒床や刀断力が顧客ニヌズや䌚瀟のOKR達成に察しお䞍適切であれば、その行動を誰かがマネゞメントする必芁がありたす。䟋えば倧技䞻矩のアヌキテクトであったり、スキルが高いがゆえに過剰に䜜り盎したくなる病などを持っおいる人は、サヌビスリヌドには適しおいたせん。目の前で困っおいる人、その裏偎にいる人を想像し、適切な粒床の修正を行うずいう刀断力は、テックを䞭心ずした思想ずは少し違う䟡倀芳が求められるこずが倚いようです。 この圹割は基本的にはWebアプリケヌション゚ンゞニアやフロント゚ンドWeb、App問わずなどを想定しおいたすが、もしかしたらフロント゚ンドを担うデザむナヌ職もこの範疇に入るかもしれたせん。デザむナヌずデヌタサむ゚ンティストは違う圹割構造を定矩するこずになるずは思いたすが 「サヌビスリヌド」ずは、その䞀文字を盎す䜜業に意矩、喜びを感じられるこず サヌビスリヌドずいう肩曞は怜玢しおみるず、いく぀かのWebサヌビス䌁業の蚘事で芋぀かり、参考にさせおいただきたした。 しかしながら、なかなか䞀般的な゚ンゞニアの評䟡スキルずしお芋えないこずが倚いです。䞖の䞭の刀断軞が技術偏重ずたでは思いたせんが、技術系メディアが曞籍等を䜜るのに必芁なテクニカルな郚分にアテンションが集䞭しやすいずいうのがあるのかもしれたせん。テックぞの貢献は、GitHubで蚀うPublicリポゞトリにおける貢献や掻躍が倚くむンタヌネットで共有されおいたす。サヌビスぞの貢献は、䞻に䌁業内のPrivateリポゞトリぞの隠れた貢献であるこずで、なかなか共通基盀ずしおの技術者評䟡に結び぀きにくく、Webサヌビスを䜜るこずはコヌドさえ曞ければ誰でもできるんじゃないかず、その質やコミットメントの郚分を無芖されおしたい、圓たり前の行動のように芋えおしたうこずで適切に蚀語化されおいないずいうのがあるように感じおいたす。 サヌビスで実珟したい哲孊その機胜は䜕のためにあるのか、䜕を実珟したいのかを顧客が所有する仕事に慣れおいる受蚗の方やSIerの方で、僕の面接を受けおいる人であれば聞いおいる方もいらっしゃるかもしれたせんが、「その䞀文字を盎す䜜業に意矩、喜びを感じられるこず」がWebサヌビスに埓事する゚ンゞニアに求める郚分です。今回、その暡範ずなる圹割がサヌビスリヌドそのものです。今回テックリヌドずサヌビスリヌドの肩曞を持぀゚ンゞニアができたしたが、圓瀟の゚ンゞニアはテックリヌド職であっおもサヌビス属性は実はすごく高いです。そもそも、それが芋えないず採甚しおいたせんから、テックリヌドずサヌビスリヌドは敵察しない抂念だず曞いたずおり、その人の魅力はどこが䞻軞かで分けおいたす。 䞀緒に良いサヌビスを䜜りたせんか この぀の抂念は敵察するものではなく、䞡立が望たしいわけですが、そうは蚀っおも、その人の埗意技ずしお技術倉革を䞻軞に掻躍する人もいれば、技術は手段ずしおサヌビス実珟に掻躍する人もいるわけで、その䞡属性をチヌムずしお評䟡したすよずいうのが今回のテックリヌドずサヌビスリヌドずいうリヌド゚ンゞニアの属性化に繋がっおいたす。今埌はそこをしっかり明確化しおいくこずで、サヌビスづくりをしたい゚ンゞニアももっず増やしおいきたいず思っおいたす。 この䞡者の人材がバランスよく融合するこずで、サヌビス党䜓のクオリティが実珟できるずいうのが、この蚘事に曞いおた論点です。それぞれの属性を匷みずした゚ンゞニア、それぞれ、ちゃんず高く評䟡しおるんですよずいう圓瀟にご興味を持っおくださったお方がいらっしゃいたしたら是非、お話したしょう。 採甚情報はこちらから jobs.binc.jp
こんにちは。BASE で Design Group に所属しおいる 䞉䜐和 です。䞻に ネットショップ䜜成サヌビス「BASE」 のフロント゚ンドを担圓しおいたす。 背景 BASE のデザむンチヌムはここ最近で人数が急激に増え、掻動が掻発になっおきおおり、その䞭のプロゞェクトの䞀぀ずしお、珟圚スタむルガむドの刷新に取り組んでいたす。 しかし、人数が増えおいく䞀方で、コヌディングのルヌルの統䞀をコヌドレビュヌや個人の裁量に任せおいたり、マヌクアップからリリヌスするたでに時間がかかっおしたうこずが問題になっおきおいたした。 そこで、新しいスタむルガむドでは、デザむナヌや゚ンゞニアの䜜業工数を短瞮し、より効率よく開発を進めるために、コヌディングルヌルの敎備ずリグレッションテストを導入するこずにしたした やったこず stylelint を䜿っおコヌディングルヌルを管理 BackstopJS でテストを行うこずでデグレを防ぐ 前提ずしお、 nodejs や yarn などの䞀般的なフロント゚ンド開発環境が敎っおいるものずしたす。 stylelintを導入 stylelint を䜿っお、これたで個人の裁量で保たれおいたコヌディング芏玄ぞの準拠を機械的に行えるようにしたす。 導入 stylelintをむンストヌル その他必芁なプラグむン等をむンストヌル stylelint-scss SassのSCSS蚘法のためのプラグむン stylelint-order プロパティをアルファベット順に䞊び替えるプラグむン stylelint-config-standard CSSのコヌディング芏玄集 prettier-stylelint コヌドフォヌマッタヌprettierずstylelintを組み合わせお䜿甚する yarn を䜿っおむンストヌルしたす。 $ yarn add -D stylelint stylelint-scss stylelint-order stylelint-config-standard prettier-stylelint 蚭定 既存のコヌディングルヌルに合わせお、 .stylelintrc を蚭定しおいきたす。 BASE の堎合はプロパティをアルファベット順に゜ヌトしたかったので、 stylelint-order を䜿甚したりしおいたす。私はいたたで abc の歌を歌いながら順番にプロパティを䞊べおいたした........ // .stylelintrc { " parser ": [ " css " ] , " plugins ": [ " stylelint-scss ", " stylelint-order " ] , " extends ": [ " stylelint-config-standard ", " ./node_modules/prettier-stylelint/config.js " ] , " rules ": { " indentation ": 4 , // むンデント " order/order ": [ " custom-properties ", " declarations " ] , // アルファベット順で゜ヌトする " order/properties-alphabetical-order ": true , // アルファベット順で゜ヌトする " length-zero-no-unit ": true , // 倀が「0」なら単䜍を省略する " number-leading-zero ": " always ", // 小数点の頭の「0」は省略する " color-hex-length ": " short ", // HEX圢匏のカラヌコヌドは3文字で衚蚘する " shorthand-property-no-redundant-values ": true // ショヌトハンドでプロパティを曞く } } 蚭定ができたら、 package.json の scripts にコマンドを远加しお、 yarn lint-sass で実行できるようにしたす。 // package.json // ... " scripts ": { " lint-sass ": " prettier-stylelint --quiet --write src/sass/**/* " } // ... 実際の䜿甚方法 たずは思うがたたに sass(scss) を蚘述したす。 . btn--submit { color : $white ;  background-color: $green ; border : none ; } めちゃくちゃですねでも倧䞈倫です、lint を実行するず... $ yarn lint-sass こうなりたす。 . btn--submit { background-color : $green ; border : none ; color : $white ; } 完璧ですねもう歌は歌わなくおも倧䞈倫になりたした 結果 垞にコヌディングルヌルを意識する必芁がなくなったので、マヌクアップのスピヌドも䞊がりたした 2. BackstopJSを導入 BackstopJS を䜿っお、戻りが発生しないよう、動䜜チェックする仕組みを䜜りたす。 導入 BackstopJSをむンストヌル stylelintず同様に、yarn を䜿っおむンストヌルしたす。 $ yarn add -D backstopjs backstop.json にオプションを蚭定し、スナップショットを撮る スナップショットを䜿っおテストする 蚭定 backstop.json に必芁なオプションを蚭定しおいきたす。 // backstop.json { " viewports ": [ { " label ": " sp ", " width ": 320 , " height ": 480 } , { " label ": " pc ", " width ": 1024 , " height ": 768 } ] , " scenarios ": [ { " label ": " reference ", // スナップショットの名前 " url ": " テストするURL ", " hideSelectors ": [] , " removeSelectors ": [] , " selectors ": [ "# test - sandbox " // スナップショットを撮圱する郚分 ] , " readyEvent ": null , " delay ": 500 , " misMatchThreshold " : 0.1 , " onBeforeScript ": "", " onReadyScript ": "" } , { " label ": " test ", // スナップショットの名前 " url ": " テストするURL ", " hideSelectors ": [] , " removeSelectors ": [] , " selectors ": [ "# test - sandbox " // スナップショットを撮圱する郚分 ] , " readyEvent ": null , " delay ": 500 , " misMatchThreshold " : 0.1 , " onBeforeScript ": "", " onReadyScript ": "" } ], " paths ": { " bitmaps_reference ": " ./backstop_data/bitmaps_reference ", " bitmaps_test ": " ./backstop_data/bitmaps_test ", " compare_data ": " ./backstop_data/bitmaps_test/compare.json ", " casper_scripts ": " ./backstop_data/casper_scripts " } , " engine ": " phantomjs ", " report ": [ " CLI ", " browser " ] , " cliExitOnFail ": false , " casperFlags ": [] , " debug ": false , " port ": 3001 } 蚭定ができたら gulpfile にタスクを远加したす。 // gulpfile.coffee // ... exports.backstopref = () => connect.server( { root: './build' , livereload: true } ) backstopjs( 'reference' ).then () -> connect.serverClose() exports.backstop = () => connect.server( { root: './build' , livereload: true } ) backstopjs( 'test' ).then () -> connect.serverClose() // ... そしお、 package.json の scripts にコマンドを远加しお、 yarn backstop-ref で参照甚画像の䜜成、 yarn backstop-test でテストが実行できるようにしたす。 // package.json // ... " scripts ": { " backstop-ref ": " gulp backstopref ", " backstop-test ": " gulp backstop " , } // ... 実際の䜿甚方法 はじめに、テストの元デヌタになる参照甚の画像を䜜りたす。 $ yarn backstop-ref BackstopJS は、この画像をもずに比范テストを行っおくれるので、予期せぬ倉曎を行っおしたった堎合にテストが倱敗し、それに気づくこずができたす。 詊しに、このボタンの border-radius を 8px から 0px ぞ倉曎しおみたしょう。 そしおおもむろにテスト実行甚のコマンドを叩きたす。 $ yarn backstop- test // ... compare | ERROR { requireSameDimensions: false , size: isDifferent, content: 0.32%, threshold: 0.1% } : reference bbq_reference_0_test-sandbox_0_sp.png compare | ERROR { requireSameDimensions: false , size: isDifferent, content: 0.32%, threshold: 0.1% } : test bbq_test_0_test-sandbox_0_sp.png compare | OK: reference bbq_reference_0_test-sandbox_1_pc.png compare | OK: test bbq_test_0_test-sandbox_1_pc.png report | Test completed... report | 2 Passed report | 2 Failed report | Writing jUnit Report report | Writing browser report report | jUnit report written to: ~~/backstop_data/ci_report/xunit.xml report | Resources copied report | Copied configuration to: ~~/backstop_data/html_report/config.js COMMAND | Executing core for `openReport` openReport | Opening report. report | *** Mismatch errors found *** COMMAND | Command `report` ended with an error after [ 0.51s ] COMMAND | Error: Mismatch errors found. at ~~/backstopjs/core/ command /report.js: 113 : 17 at < anonymous > :null:null COMMAND | Command ` test ` ended with an error after [ 5.371s ] COMMAND | Error: Mismatch errors found. at ~~/backstopjs/core/ command /report.js: 113 : 17 at < anonymous > :null:null [ 15 : 02 : 59 ] ' backstop ' errored after 5.38 s 差分が発生したので、テストが倱敗し、レポヌト甚の HTML が出力されたした。 これを開いおみるず、差分のある箇所がピンク色になっおいたす分かりやすいですね 結果 䜜業を開始する前にスナップショットを䜜成しおおくこずで、行った䜜業でのデグレに早く気づいたり、防ぐこずできるようになりたした。 たずめ 今回、stylelintやBackstopJSを利甚したこずで、実装者の負担が以前よりも軜くなりたした 実装者が増えおも差分が生たれにくく、デザむンの䞀貫性を保぀こずができる仕組みを考え、匕き続きスタむルガむドを䜜成しおいきたいず思いたす。たた同時に、それらをメンテナンスしやすい環境も敎えおいきたいず思いたす
こんにちはBASE Product Division サヌバヌサむド゚ンゞニアの 東口 です。䞻にEコマヌスプラットフォヌム「BASE」の決枈領域の開発をしおいたす。本ブログでは、PHPerKaigi 2018での登壇蚘事等も曞いおいたす。 devblog.thebase.in BASEのサヌバヌサむドの倚くはPHPで曞かれおいるので普段觊る機䌚の倚い蚀語はPHPなのですが、先月からGoを曞きたい有志が集たっお定期的にGo蚀語勉匷䌚を行っおいたす。 きっかけ 初めたきっかけは2018幎4月15日に開催された Go Conference 2018 Spring でした。スポンサヌ䌁業のラむンナップや実際に䌚堎の熱気に觊れお、改めおGo蚀語の勢いや実甚性を匷く再認識したした。それたでGoを曞きたいず思っおいたこずもありカンファレンスに参加しおいた同僚ず勢いで始めるこずを決めたした。 孊生版goconやろうずしおいる方に刺激を受けお「Goならわかるシステムプログラミング」瀟内読曞䌚を勢いで䜜った #gocon — Kazuki Higashiguchi (@hgsgtk) 2018幎4月15日 やり方 察象曞籍ずしお、 『Goならわかるシステムプログラミング』 を進めおいくこずにしたした。この曞籍を遞んだ理由は、Goずいう蚀語自䜓の曞き方ではなくGoを䜿っお目的のあるコヌドを曞ける点でした。たた、個人的にPHPを觊っおるず意識しにくい䜎レむダの仕組みに぀いお知っおおきたいずいう意図もありたした。 Go Conference 2018 Spring の翌週から毎週1回2時間定期的に時間を取っお実斜しおいたす。 集たっおやるずいうこずで発衚の時間を䜜ろうかずいう怜蚎もありたしたが、身内でやる分にはたずは各自奜きなペヌスでもくもく進めおいく方法で進めるこずにしおいたす。 たた、読曞䌚䞭の䌚話や詰たったずきの内容をGo蚀語に぀いお話すslackの #golang チャネルにお話しおいたす。ここで各自詰たったずころに぀いお話しおいたりしおいるので埌続の人がそこを芋お参考にできるずいう利点が有りたした。 良かったこず 孊習のペヌスメヌカヌになる 定期的に時間をずるこずで途䞭で止たりがちな本の写経をする習慣ができ、週䞀回Goを觊るペヌスメヌカヌ的な存圚になっおいたす。 議論ができる 党員が同じ曞籍をベヌスにやっおいるので、「このペヌゞで䜿われおいる関数の内郚実装がどうなっおいるか」等、䞀人で進めおいるずスルヌしお先に進めがちな箇所に぀いお疑問を深掘りする機䌚になっおいたす。 Goに觊れた経隓のある゚ンゞニアが増えた 本読曞䌚を期に、「実はGoやりたかった」ずいう゚ンゞニアがGoを曞き始めたした。 元から瀟内slackに #golang チャネルずいうGo蚀語に぀いお話すチャネルがあったのですが参加者が7人くらいで曎新頻床もあたり高くありたせんでした。 しかし、読曞䌚を通じおGo蚀語に觊れた゚ンゞニアが増え#golangチャネルに人が増えGoの話題に぀いお話す機䌚が増えたした。Go蚀語のむベントの共有や「MySQLドラむバをGoで曞いおみたら面癜そう」ずいった、こういうチャレンゞをしたら面癜そうず蚀った䌚話がslackでされおいたす。 たずめ プロダクションでGoを採甚しおいる箇所はスポット郚分に限られるので、この読曞䌚を通じおGoをプロダクション環境や趣味のプロダクトに適甚するきっかけになればず思っおいたす。 読曞䌚やもくもく䌚ずいった勉匷䌚を始める際どういう颚に運営するかみたいなこずを考えお止たっおしたうかもしれないですが、やっおから考えるくらいの気持ちで始めおみおはいかがでしょうか
iOS゚ンゞニアの 倧朚 です。 日々の開発で、ちょっずした埮修正でメ゜ッドを远加・削陀するず、差分コンパむルが効かずビルド10分埅ちずなり、開発効率の䜎䞋が問題ずなっおいたした。それを解決するためEmbedded Frameworkを導入したずころ、差分ビルドが成功し-2分になったずいうお話です。 私が入瀟したのは、2017幎の2月でした。そしお、アプリはもずもずObjective-Cで曞かれおいお、Swiftコヌドの占める割合は10%以䞋だったようです。それから1幎近くで、90%以䞊Swiftコヌドに眮き換えたした。 その時点で、ビルドにかかる時間の長さが目立぀ようになり、ちょっずした䞍具合の調査や埮調敎しおいるだけなのに10分近く埅たなければいけないケヌスが目立぀ようになっおきたした。 問題ずしおは以䞋の2぀がありたした。 1぀のメ゜ッドを远加しただけなのに、䜕故か10分近くかかるため、埮調敎するのに䞍向き タむプミスしたので䞀旊途䞭キャンセルしお修正し再ビルドしたが、差分ビルドが効かず10分埅ち 前提 日々の開発で行うDebugビルドを察象ずしおいたす。そのため、AdHoc配信などでビルドする堎合のケヌスArchiveはCircle CIでおこなっおいるため特に察象にしおいたせん。差分ビルドが効くようにしお開発効率を改善しおいきたす。 環境 MacBook Pro (15-inch, 2016) macOS High Sierra10.13.4 Xcode 9.2 Swift 4.0 Swift:Objective-Cの比率は、9:1 ビルド察象のSwiftファむルは玄850ファむル 䞀般的なビルド蚭定やSwift-Objective-Cのブリッゞングに察する改善はすでに行なっおいた New build systemを䜿っおいる 改善の流れ ビルド時間蚈枬 ビルドが遅くなっおいる原因コヌドを探しお修正する これ以䞊速く出来ない? コヌドをモゞュヌル単䜍に分割 差分ビルドが効くようになり、開発効率改善 ビルド時間蚈枬 パむク: Cプログラミングに関する芚え曞き にもある通り、掚枬するのではなく、どこで時間がかかっおいるか蚈枬しおみたす。 XcodeのBuildSettingsの OTHER_SWIFT_FLAGS に -Xfrontend -debug-time-function-bodies を远加するず、閟倀以䞊のビルド時間がかかっおいるメ゜ッドを、Xcode䞊でWarningレベルで報告しおくれたす。 ちなみにBASEアプリでは、App Extensionsを䜿甚しおいるこずもあり、蚭定の抜け挏れを防ぐため、XcodeのGUI䞊ではなく、 xcconfig ファむルで蚭定しおいたす。 // Debug.xcconfig #include "Shared.xcconfig" #include "DebugPlugins.xcconfig" SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) DEBUG; // 蚈枬甚フラグ OTHER_SWIFT_FLAGS = -enable-bridging-pch -Xfrontend -debug-time-function-bodies -Xfrontend -debug-time-compilation -Xfrontend -warn- long -function-bodies= 200 -Xfrontend -warn- long -expression-type-checking= 200 ; GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG= 1 ; 蚈枬結果が含たれるビルドログはXcode䞊で党おは芋えないのず、出力されたファむルを読み解く時間が惜しいずいう堎合は、 BuildTimeAnalyzer-for-Xcode を䜿うずよいでしょう。 ビルドが遅くなっおいる原因コヌドを探しお修正する さお蚈枬結果を眺めおみたずころ、泚文内容ず支払い情報を送信するためのHTTPBodyの生成structを返す凊理で10秒前埌ビルドにかかっおいたした。 その凊理は、Structに (String, Any) のタプルの配列で必芁なパラメヌタヌをセットしおいるのですが、型情報がわからないたたなため時間がかかっおいたようです。 そこで、䞀旊倉数に栌玍するこずによっお、型掚論が効くようになり、ビルド時間も倧幅に改善したした。 diff --git a/CartClient.swift b/CartClient.swift index 9e2b4c060..93a882f19 100644 --- a/CartClient.swift +++ b/CartClient.swift @@ -42,6 +42,11 @@ class CartClient: APIClient { case .checkout(paymentType: let `type`, payment: let payment, cart: let cart): let orderRequestInfo = cart.orderRequestInfo + // 䞀旊倉数に栌玍しお型情報を甚意する + // 䜏所ずメヌルアドレスは必須なのでforce unwrappingで取り出しおも問題ないはず + let familyName = payment.shippingContact!.name?.familyName ?? "" + let givenName = payment.shippingContact!.name?.givenName ?? "" + let tel = payment.shippingContact!.phoneNumber?.stringValue ?? "" return Parameters([ ("payment", type.paymentMethod), @@ -49,14 +54,14 @@ class CartClient: APIClient { ("item_id", orderRequestInfo.itemId), ("shop_id", orderRequestInfo.shopId), ("variation", orderRequestInfo.variationId), ("amount", orderRequestInfo.amount), - ("last_name", payment.shippingContact!.name?.familyName ?? ""), - ("first_name", payment.shippingContact!.name?.givenName ?? ""), + ("last_name", familyName), + ("first_name", givenName), ("postal_code", payment.shippingContact!.postalAddress!.postalCode), ("state", payment.shippingContact!.postalAddress!.state), ("address", payment.shippingContact!.postalAddress!.city), - ("address2", payment.shippingContact!.postalAddress?.street ?? ""), - ("tel", payment.shippingContact!.phoneNumber?.stringValue ?? ""), - ("mail_address", payment.shippingContact!.emailAddress ?? ""), + ("address2", payment.shippingContact!.postalAddress!.street), + ("tel", tel), + ("mail_address", payment.shippingContact!.emailAddress!), ("version", appVersion())]) default: break 改善結果は以䞋の通りです。 コンパむル時間 内容 9323.63ms 元のコヌド 265.4ms(-97%) 远加する倀を䞀旊倉数に保存(Optionalのたた) 16.6ms(-99.8%) さらにNonOptionalにしお保存 他にも修正しおいくらか改善したしたが、劇的な改善には至りたせんでした。 if boolValue = true { のような比范をやめお if boolValue { に倉曎しお䞭身の刀定を行う 条件に䞀臎したコレクションの芁玠を取埗するメ゜ッド filter() を䜿うだけで条件を満たせるのに compactMap() 䜿っお䜙蚈にビルド時間がかかっおいた。 100ms以内に収たり喜んだのも぀かの間、再床ビルドするず200ms以䞊時間がかかっおしたう問題もあり、これ以䞊は誀差でしかないず考え修正を打ち切りたした。 これ以䞊速く出来ない? Swiftコヌドコンパむル時間短瞮も倧事なのですが、最初に述べた 差分ビルドが効くようにしお開発効率を改善 達成するのが第䞀の目暙です。 考えおみるず、党おの゜ヌスファむルをアプリケヌションタヌゲットでビルドするのは無駄です。APIからデヌタを取埗するコヌドやデヌタモデルなどは、最初に定矩しおしたえばほずんど修正するこずはありたせん。 モゞュヌルずしお切り出せば、関係ないコヌドのビルドはFramework偎で行うこずになり、ビルド時間の倧幅な改善が芋蟌めそうです。 iOSには、Cocoa Touch Frameworkずしおコヌドを共有する仕組みがありたす。さらに、Embedded Frameworkずいう仕組みを䜿っおXcodeのワヌクスペヌスに盎接組み蟌むこずもできたす。 コヌドをモゞュヌル分割 Embedded Frameworkを䜿っお、コヌドをモゞュヌルずしお分割しおいきたす。 レむダヌ化アヌキテクチャヌ等で、各々理想のアヌキテクチャヌはあるず思いたすが、ビルド時間の解決に䜿うこずにしたす。 iOS SDKにのみ䟝存し単䜓で動䜜する共通コヌド アプリで定矩したデヌタモデルやAPIクラむアントコヌド等、耇数箇所で利甚し倉曎が頻繁に発生しないコヌド 䞊蚘䞡方に共通しおいえるこずですが、蚭定ファむルの読み蟌みが必芁な郚分はアプリケヌションタヌゲット偎で読み蟌み、その結果オブゞェクトをフレヌムワヌク偎で定矩したデヌタモデルに倉換しお枡すようにした方がテストもしやすいですし、埌々䟝存関係の゚ラヌで悩む必芁も無くなりたす。 たた、再利甚可胜にするこずを考えるず、APIの゚ンドポむントやストレヌゞのパスなども、アプリケヌションタヌゲットから枡すようにした方が良さそうです。 最終的には䞋蚘のようにモゞュヌル分割したした。 UIExtensionKitずAppKitずいう名前のフレヌムワヌクを䜜成し、アプリケヌションタヌゲットはそれをむンポヌトしお䜿うようにしたした。 frame "Application Target" { [AppContext] [App] } package "UIExtensionKit" { [Extensions] } package "AppKit" { [AppContext Interface] [Registory] [Data Structures&Logics] } [App] . [AppContext] : Init [App] ... [Extensions] : Use [AppContext Interface] <|.. [AppContext] : Implement [Registory] *- [AppContext Interface]: DI [Data Structures&Logics] . [Registory] : Use [App] . [Data Structures&Logics] : Use 図のApplication Targetずいうのはアプリケヌションの゚ントリヌポむントずなるタヌゲットです。アプリを起動する堎合はこのタヌゲットを起動したす。 UIExtensionKitは、iOS SDKでのみ実装しおアプリの業務ロゞックは含たないそれ単䜓で動䜜するコヌドです。カラヌパレットの定矩やViewコンポヌネントが配眮されおいるセルのIndexPathを取埗する䟿利メ゜ッドなどがありたす。 AppKitは、アプリで定矩したデヌタモデルやそれらを操䜜するビゞネスロゞックなどを含みたす。 APIリク゚ストのクラむアントだったり、APIのレスポンスを加工したりロヌカルのストレヌゞにシリアラむズしたデヌタを保存したりするコヌドがありたす。 結果 改善結果は以䞋の通りです。差分ビルドの結果は、 UIViewControllerに viewWillAppear(_:) を远加しおビルドした結果です。 コンパむル時間 ビルド皮別 内容 494.4s<箄8分> フルビルド 分割しおいない元のプロゞェクト 247.055s<4分8秒> フルビルド フレヌムワヌクを䜿っおモゞュヌル分割したプロゞェクト 232.8s<3分52秒> 差分ビルド(成功時) 分割しおいない元のプロゞェクト 86.924s<1分27秒> 差分ビルド フレヌムワヌクを䜿っおモゞュヌル分割したプロゞェクト たずめ 差分ビルドが倱敗しおビルドに時間がかかるずいう堎合は、Frameworkを䜿っおモゞュヌル分割しおみたら改善できたずいうお話でした。これによっお、無駄に残業しお仕事をするこずもなくなり、効率よく開発できるようになったず思いたす。 おたけ(モゞュヌル分割に関しお) モゞュヌル分割に察応するためには、技術的な課題がいく぀かありそれを解決しなければなりたせん。 ざっず挙げたすず アプリケヌションタヌゲットでしか䜿えないもしくは実䜓が存圚しないオブゞェクトやメ゜ッドが存圚し、Frameworkやテストタヌゲットから利甚したい堎合に簡単にアクセスできそうにない フレヌムワヌク内のコヌドを動䜜させるには、アプリケヌションタヌゲットに配眮した蚭定ファむルを読み蟌む必芁がある Objective-Cで曞かれた広告や解析SDKを利甚する堎合、耇数のモゞュヌルでむンポヌトするこずができない 今回の堎合フレヌムワヌク偎は、䞀方的に利甚される偎なので、䜕らかの方法でこういった䟝存関係を解消する必芁がありたす。 それには、䟝存関係逆転の原則DIP)ずいう方法を䜿いこの問題を解決したした。フレヌムワヌク偎にAppContext Interfaceずいう抜象むンタヌフェヌスを定矩するこずにより、アプリケヌションの詳现に立ち入らず䟝存関係の゚ラヌを防ぐこずができるようになりたした。 フレヌムワヌク偎に甚意する抜象むンタフェヌスの䟋は、䞋蚘のようなコヌドです。 これを、アプリケヌションタヌゲットやテストタヌゲットが実装すれば、フレヌムワヌク偎は抜象むンタフェヌスを通しお凊理を行えるようになりたした。䞍必芁にSDKをむンポヌトしお䟝存関係の゚ラヌになるこずもありたせん。APIの゚ンドポむントも枡すようにすれば、切り替えのたびにフレヌムワヌク偎をビルドし盎す必芁もありたせん。 // AppKit.frameowrk public protocol AppContext { var apiConfig : APIConfig { get } var tracker : Tracker { get } var legacyImageSliceFetcher : LegacyObjCImageSliceFetchable { get } var bundleResolver : BundleResolvable { get } var keychainResolver : KeychainResolvable { get } var realmContainer : RealmContainer { get } var legacyAPIBridging : LegacyObjCAPIBridging { get } var appConfig : AppConfig { get } var traits : Traits { get } var userDefaultsResolver : UserDefaultsResolvable { get } var activity : Activity { get } } public enum TrackerActions { case setUser(userId : String ?) case error(Error) case errorWithAdditionalUserInfo(Error, userInfo : [String: Any] ?) } // FabricのCrashlyticsはFrameworkの䞭に重耇しおリンクできないので、アクションを通じお凊理を行わせる(凊理の詳现実装自䜓はこのフレヌムワヌクを利甚する偎にある) public protocol Tracker { func dispatch (action : TrackerActions ) } フレヌムワヌクを利甚する偎(アプリケヌションタヌゲットやテストタヌゲット)は、䞋蚘のようにこのむンタフェヌスを実装すれば良いこずになりたす。 // アプリケヌションタヌゲット import AppKit final class AppContext : AppKit.AppContext { var apiConfig : AppAPIConfig = APIConfig() // [...] } // テストタヌゲット import AppKit final class MockAppContext : AppKit.AppContext { var apiConfig : AppAPIConfig = MockAPIConfig() // [...] } フレヌムワヌク偎で解決できない䟝存関係は、利甚する偎で抜象むンタフェヌスを実装するこずにより解決できるようになりたした。 しかしこの実䜓をどう枡せば良いのでしょうか 䞋蚘のようなコンテナをフレヌムワヌク偎に甚意し、それを利甚するようにすればどこからでも呌び出せるようになりたす。 public struct Registory { private static var context : AppContext ! public static func setContext (_ context : AppContext ) { self .context = context } static func resolve <D> (keyPath : KeyPath <AppContext, D> ) -> D { return context[keyPath : keyPath ] } } これでフレヌムワヌクの倖偎から必芁な凊理を行えるようになりたした。 参考文献 パむク: Cプログラミングに関する芚え曞き 実践ドメむン駆動蚭蚈 (Object Oriented SELECTION) ノァヌン・ノァヌノン var a = Array.from(document.querySelectorAll("pre.code")); a.forEach(function (pre) { if (pre.attributes['data-lang'].value) return; var xhr = new XMLHttpRequest(); xhr.open("POST", "https://plantuml-service.herokuapp.com/svg"); xhr.onload = function () { if (xhr.status === 200 && pre instanceof HTMLPreElement) { pre.parentNode.replaceChild(xhr.responseXML.documentElement, pre); } } xhr.send("@startuml\n" + pre.innerText + "\n@enduml"); });
(BASEオフィス内の光景) 初めに こんにちはBASEでBack-end Engineer Groupに所属しおいる 菊地陜介 です 今幎床からBASEでは䞖の゚ンゞニアに興味を持っおもらおうず、積極的に技術ブログを発信しおいこうずいう運びずなりたした。本蚘事を読んで少しでも興味を持っお頂けたしたらぜひ 私たで ご連絡ください さお、私はRedash゚ノァンゞェリストずしおRedashを瀟内に普及させたしたので、その話に぀いお曞こうず思いたす。「Redashっお䜕」、「Redashサヌバっおどうやっお立おるの」、「Redashの䟿利機胜は」などの疑問に぀いおは先に玠晎らしい蚘事がたくさんありたすので、そちらを参考にされおください。 この蚘事では、Redashをどのように瀟内に普及させたのかずいうこずに぀いお述べたいず思いたす。 背景 私がBASEに入瀟したのは、今からちょうど䞀幎前の2017幎4月でした。 圓時は䜕か新機胜をリリヌスしおも出しっ攟しで、効果があったのかなかったのかの怜蚌が十分になされおおらず、次のアクションに掻かせおいないなず感じおいたした。日々、「なんだか知らないけど今日は数倀が良いような気がする」ずいった挠然ずした感想を持぀だけでした。 ちょうど、前職でRedashを導入したこずで瀟内に良い圱響を䞎えるこずができたずいう成功䜓隓があったので、BASEにも導入しお普及させようずいう運びになりたした。たたRedashを導入するこずは、数倀分析をしやすくなるこず以倖にも様々な効果が期埅できるので本蚘事でご玹介したす。 Redashを導入するメリット Redashを導入するこずで享受できるメリットは倚々あるのですが、特に私が䞀抌しのメリットは䞋蚘になりたす。 非゚ンゞニアが゚ンゞニアに䟝頌しおいたデヌタ抜出が䞍芁になる このようなお互い䞍毛なやりずりけっこう倚く行われおいるのではないでしょうか。 カスタマヌサポヌトのRさん(以䞋Rさん): 「ショップAの商品情報䞀芧が欲しいのですが、デヌタを抜出しおもらえないでしょうか」 頑固゚ンゞニアのHさん(以䞋Hさん): 「はい、どうぞ」 〜3時間埌〜 Rさん: 「ショップBの商品情報䞀芧が欲しいのですが、デヌタを抜出しおもらえないでしょうか(さっき頌んだばかりだし頌みづらいな、、)」 Hさん: 「はい(たたかよ)、今忙しいのであずで枡したす」 〜3時間埌〜 Rさん: (䟝頌しおから3時間経ったけどただ忙しいのかな、それずも忘れおるのかな、リマむンドした方がいいのかな、、、。あヌ、めんどくせええ。) それがRedashが普及するずこんなふうになり、業務効率化がはかれたす。 Rさん: 「ショップAの商品情報䞀芧が欲しいのですが、デヌタを抜出しおもらえないでしょうか」 Hさん: 「Redashに任意のショップの商品情報䞀芧を取埗できるク゚リを甚意したので、これからは自分で抜出できたす。」 〜以降〜 Rさん: 「ショップBの商品情報䞀芧が必芁だな。Redashでさくっず抜出しようっず。あヌ気を遣う必芁がなくお楜チン。」 Hさん: 「前たで頻繁にきおたデヌタ抜出䟝頌がこなくなったからコヌディングに集䞭できおハッピヌ。」 BigQueryの高額請求に怯えなくおよくなる BigQueryはク゚リが凊理したデヌタ量に応じお課金されるため、うっかり 月に150䞇溶かす ずいう恐れがありたす。それ故に気軜にク゚リを叩けないずいう人も倚いのではないでしょうか。私もその䞀人でした。 しかしRedashでは、匷制的にBigQueryのコスト䞊限蚭定を適甚できるため、䞍甚意にコストのかかるク゚リを叩く心配がなくなるのです。 ちなみにこれが前職でRedashを導入した理由でした。 Redash普及のためにやったこず Redashが導入された圓初、BASEのslack䞊にRedashで䜜ったグラフをアップしたりしおその玠晎らしさを共有しようず努めたした。しかしみんなの反応は薄く、兌ねおよりRedashに興味を持っおいた䞀郚のメンバヌが䜿うだけでした。 䞖の䞭には䟿利なツヌルがたくさんあるにも関わらず、瀟内党䜓に普及するようなツヌルは少ないように感じおいたす。そもそも新しいツヌルが普及しない理由ずしおは䞋蚘のようなものが挙げられるず思いたす。 そもそも存圚を知らない 存圚は知っおいるけどなんだか難しそう 䞀郚の人しか䜿っおないから䜿えなくおも倧䞈倫 そこで私はマヌケティング理論で有名な「キャズム理論」に思いを銳せ、どうやっおキャズムを超えるか考えたした。 キャズム理論を応甚する 消費者(瀟員)は䞋図の5぀のグルヌプに分類でき、アヌリヌマゞョリティヌ局たで普及させるこずができれば新商品や新サヌビスは急激に垂堎に浞透しおいくず蚀われおいたす(これはむノベヌタヌ理論ずいうや぀)。 (出兞 【キャズム理論】マヌケティングの深い溝を乗り越えるには より匕甚) しかし、アヌリヌアダプタヌ局ずアヌリヌマゞョリティ局の間(゚ンゞニアず非゚ンゞニアの間)には簡単に超えられない深いキャズム(分かり合えない䟡倀芳)が存圚し、そこをどうやっお超えるかずいうのが新技術(Redash)が普及するかどうかの倧きなポむントになりたす。 (出兞 【キャズム理論】マヌケティングの深い溝を乗り越えるには より匕甚) そこで私は、いかにキャズムを超えるかずいうずころに泚力しようず心に決め、各郚眲のコアずなるメンバヌ(アヌリヌマゞョリティ局)に売り蟌みにいくこずにしたした。 ちなみに私が思い描いたむノベヌタ理論の局ず瀟内のグルヌプの察応衚は䞋蚘になりたす。 å±€ 瀟内のグルヌプ むノベヌタヌ局 元からRedashに興味を持っおいたメンバヌ アヌリヌアダプタヌ局 ゚ンゞニア アヌリヌマゞョリティヌ局 Customer SupportやMarketing、経理・財務のリヌダヌ レむトマゞョリティ局 Customer SupportやMarketing、経理・財務のメンバヌ ラガヌド局 Customer Experienceのメンバヌ どのようにRedashを売り蟌んだか 私は他郚眲の人がRedashのメリットを最も享受できるのは先に述べた↓であるず考えおいたした。 非゚ンゞニアが゚ンゞニアに䟝頌しおいたデヌタ抜出が䞍芁になる ですので最もデヌタ抜出を䟝頌する頻床が高いCustomer Supportのコアメンバヌに、定番のデヌタを抜出するク゚リを党お甚意しお売り蟌みに行きたした。 やはり普段デヌタ抜出䟝頌にストレスを感じおいたようで、すぐにRedashを利甚するこずのメリットを理解しおもらえたした。同様に普段の業務の䞭でマヌケも法務経理も゚ンゞニアぞのデヌタの抜出䟝頌が床々発生しおいたので、各郚眲のコアメンバヌに同じ切り口で売り蟌みにいき、垃教掻動に勀しみたした。 その埌は、私が䜕も働きかけなくおも自動的に瀟内のあらゆるメンバヌに普及しおいきたした。「キャズムを超えた」ず感じた瞬間でした。 たずめ Redashが普及した埌は「新機胜をリリヌスしたら必ず効果怜蚌しよう」ずいう意識が根付きたした。今ではより質の高い効果怜蚌をするためにはどうすれば良いかずいうこずをみんな意識するようになり、組織ずしお䞀段階レベルアップしたなず感じおいたす。他にも「非゚ンゞニアが゚ンゞニアに䟝頌しおいたデヌタ抜出が䞍芁になった」などの業務効率の改善をはかるこずができ、Redash゚ノァンゞェリストずしおはやりきったなずいう思いです。 今回はキャズム理論を応甚させおRedashを瀟内に普及させたかずいうこずに぀いお曞きたしたが、これは他にも応甚が効くず思いたすので参考にしおいただければず思いたす。 おたけ 瀟内で新たに䞀ヶ月で登録されたク゚リの数ず环積数 Redash普及率80% Redashのアカりント開蚭数を調べたら80でしたので、BASEチヌムが玄100人であるこずを考えるず普及率は玄80%でした。
こんにちは。 ショッピングアプリ「BASE」 のiOSアプリを担圓しおいる 竜口 です。 背景あの改修の効果枬定甚のログ、送られおる ショッピングアプリ「BASE」内で、斜策の効果枬定やKPIの経過芳察で様々なログを䜿甚しおいるのですが、现かい改修などで特定のログが送られない事象があり、効果枬定が出来ずに倚郚眲の䜜業が止たるずいうこずがありたした。 そこでアプリ今回はiOSのみでログが正しく送られおいるこずを保蚌するために、ログのテストをするようにしたした。 党䜓の流れ 次のこずをしたした。 EarlGreyでUITestを実装 テストの䞭で送られるログをMockに保持 テスト完了埌、Mockにあるログの有無を確認 テストをCircleCIで自動化 これで改修によるログの圱響を保蚌出来るようになりたす 1. EarlGreyでUITestを実装 EarlGrey Reference は、Googleが䜜っおいるiOSのUI automation test フレヌムワヌクです。 曞き方は、簡単で以䞋の䟋の堎合 UIButton.accessibilityIdentifier に特定のIDを指定しお、テストでは selectElement で指定したIDの芁玠を取埗し、芁玠の有無の確認、芁玠をタップ等できたす。 class ViewController : UIViewController { override func viewDidLoad () { super .viewDidLoad() button.accessibilityIdentifier = "BTN" } } class UIAutomationSpec : XCTestCase { func testTapButton () { EarlGrey .selectElement(with : grey_accessibilityID ( "BTN" )) // 芁玠を指定 .assert(grey_sufficientlyVisible()) // 存圚するかを確認 .perform(grey_tap()) // 指定した芁玠をタップする } } 2. テストの䞭で送られるログをMockに保持 UITest内でログを送る際に、Mockにログを保存する凊理を远加したす。 class ViewController : UIViewController { @IBAction func didTouchUpButton (_ sender : UIButton ) { LogManeger.send(log : Log (name : "tap_button" )) } } struct LogManeger { static func send (log : Log ) { isTest { LogMock.store(log) // Mockに保存 } // Logを送る } static func isTest (_ doForTest : () -> Void ) { #if DEBUG if ProcessInfo.processInfo.environment[ "XCTestConfigurationFilePath" ] != nil && enabledUITest { doForTest() } #endif } } 3. テスト完了埌、Mockにあるログの有無を確認 テスト開始前に保蚌するログを指定しお、終わった段階でログが揃っおいるかを確認する。 class UIAutomationSpec : XCTestCase { override func tearDown () { super .tearDown() LogMock.removeAll() } func testTapButton () { LogMock.addExpect(Log(name : "tap_button" )) // 期埅するログを指定 EarlGrey .selectElement(with : grey_accessibilityID ( "BTN" )) .perform(grey_tap()) XCTAssert(LogMock.verify(), "Logが揃っおいたせん。" ) // ログが揃っおいるか確認 } } 4. テストをCircleCIで自動化 実装したテストをCircleCIで動かすようにしお、倉曎があっおもログが送られるこずを保蚌できるか確認できるようにしたした。 なかでもハマったずころがいく぀かありたしたので玹介したす。 ロヌカル環境では通るけどCircleCIでは通らなかった 䞀番長く戊った凡ミスです。 ロヌカル環境で実機確認しおテスト通るのに、CircleCIで行うず通らないし䜕故か画面が真っ黒になっおいたした。 原因は、ロヌカル環境ずCircleCIで実行しおいる環境が違うので、UITestの結果が環境に䟝存する堎合、結果が倉わっおしたうこずでした。 CircleCIは、どこかの堎所でこちらが指定したOS,端末のSimulatorで初回むンストヌルずしお起動されテストしおいたす。 なのでロヌカル環境で確認する時に、CircleCIの環境を揃える必芁があり、今回のようにロヌカル環境で実機確認しおいるず結果が倉わる堎合がありたす。 テスト通らなかったのはわかるがなぜ通らなかったのかわからない CircleCIでテスト通らなかった際に、どこの箇所で通らなかったのかはわかりたすが、どの画面でなぜ通らなかったかはわかりたせん。 なので EarlGrey.setFailureHandler(handler: ) で通らなかった時のErrorMessageずその画面のスクショをSlackに送るようにしたした。 たずめ ただカバヌしおる郚分は䞀郚重芁機胜のみですが、テスト導入し今の所ログの䞍具合も起こらず、䜕よりUIの保蚌も最䜎限できるので安心しお開発できるのが良いです BASEを日本䞀のサヌビスに成長させる仲間を募集しおいたす BASEでは、Web、アプリ、SRE、デヌタ解析など幅広い職皮を募集しおいたす。 ご興味を持った方、カゞュアルな面談もできたすので、䞀床オフィスに遊びに来おみたせんか base.ac
こんにちは、BASE株匏䌚瀟 BASE Product div サヌバヌサむド゚ンゞニアの東口です。䞻にサヌビスの決枈郚分ずPHP・CakePHPのバヌゞョンアップをしおいたす。 CakePHP2.10.9のリリヌスに察しお、 Koji Tanaka さんず Kazuki Higashiguchi がcontributeいたしたした。 Release 2.10.9 · cakephp/cakephp · GitHub 自分自身は、BASEに入瀟しおからCakePHPを仕事で䜿い始めお半幎、初のコントリビュヌトでした。備忘録ずしおコントリビュヌトに至った経緯を残しおいきたす。 䜕をしたのか Release 2.10.9 · cakephp/cakephp · GitHub を匕甚するず䞋蚘のBugFixを行いたした。 CakeTestCase::getMockForModel() now correctly handles secondary connections. github.com だいたいの流れ きっかけは、テストコヌドを曞いおいた際になぜか意図しない挙動をするこずに同僚が出くわしたこずでした。 実際に起きおいたこずはIssueに曞いた内容ですが、テストケヌス内で、メむンではないDBに接続するModelをmockするメ゜ッドを䜿甚した際に䞋蚘の゚ラヌが発生しおいたした。 MissingConnectionException: Database connection "Mysql" is missing, or could not be created. Issueを出すずころたで、既にプルリクを䜕床も送っおいる同僚の Koji Tanaka さんにざっくり教えおもらいながらやりたした。おおたかな流れは以䞋です。 調査 いけそうな修正方針決める Issueを出す 機胜修正する テストを修正する Pull Requestを出す マヌゞしおもらう 今回は、既にテストコヌドが曞いおあり通っおいたのでなぜ通っおいるのかずいう原因調査が少し倧倉でした。 マヌゞされた phperkaigiの裏でこ぀こ぀出しおたcakephp本䜓ぞのcontributeが通った^-^ — kazuki.higashiguchi (@Khigashiguchi) 2018幎3月10日 今回のバグの原因調査にあたり、䞭のコヌド読んだりデバッグログを仕蟌んだりしおいるうちにCakePHPの䞭身が芋えおきたのが良かったです。 最埌に 今回のcontributeはちょっずしたBug Fixでしたが、今埌も自瀟が䜿っおいるOSSが発展しおいくようコントリビュヌト頑匵っおいきたす ゚ンゞニア募集䞭 BASE株匏䌚瀟では、OSSにコントリビュヌトしおいきたい゚ンゞニアの方募集䞭です jobs.binc.jp
BASE Back-End Engineerの田䞭 ( @tenkoma )です。アプリケヌションのPHPアップデヌトなどを担圓しおいたす。 3/14 (æ°Ž)に開催された技術勉匷䌚ヒカ☆ラボにお、アプリケヌションで利甚しおいるPHP/CakePHPアップデヌトの取り組みに぀いお発衚したした。 【 ヒカ☆ラボ 】【Laravel5、CakePHP3など】ベンチャヌ䌁業のリアルなPHP事情 : ATND サヌビスの裏偎の話であり、今たで特に公開はしおいたせんでしたが、機䌚をいただいたのでこれたでの取り組みを振り返るこずにもなるず思い、発衚するこずにしたした。 BASEのPHPアプリケヌションは2016幎末たでほがPHP 5.3で動䜜しおいたした。2017幎にPHPCakePHPのアップデヌトを掚し進めるプロゞェクトが立ち䞊がり、アプリごずに段階的にアップデヌトをリリヌスしおいたす。 今回の発衚では䜕を・どの順番でアップデヌト䜜業したかをお話しいたしたした。同様のプロゞェクトを怜蚎䞭、実斜䞭の方の参考になれば幞いです。 登壇資料 BASE の PHP アプリ アップデヌトに぀いお // Speaker Deck ゚ンゞニア募集䞭 BASE株匏䌚瀟ではモダンな開発環境を぀くっおいく゚ンゞニアを募集しおいたす。 jobs.binc.jp
こんにちは、BASE株匏䌚瀟 BASE Product div サヌバヌサむド゚ンゞニアの東口です。䞻にサヌビスの決枈郚分ずPHP・CakePHPのバヌゞョンアップをしおいたす。 䞋蚘の蚘事でも公開いたしたしたが、BASE株匏䌚瀟はPHPerKaigi 2018にプラチナスポンサヌずしお協賛いたしたした。 devblog.thebase.in たた、私自身もLTを採択いただいたので、スポンサヌ担圓者兌LTスピヌカヌずしお参加いたしたした。 PHPerKaigi 2018 phperkaigi.jp  PHPerKaigi 2018は今幎初開催のPHP゚ンゞニアのためのカンファレンスです。 TrackA・Bの2぀レヌンがあり、TrackAがトヌク、TrackBはコミュニケヌション䞭心の䌁画が行われおいたした。   トヌクが1レヌンだったこずもあり、みなさんレベルの高い厳遞されたトヌク内容でしたたた、TrackBで行われた「Interactive Round Table」等のコミュニケヌションの堎もずおも盛り䞊がっおいたした。 䌚堎の様子 TrackAを行っおいたメむン䌚堎の雰囲気です。 TrackAの様子 スピヌカヌが登壇する堎所には豪華なバックパネル 䌚堎には、PHPerKaigi 2018ずスポンサヌ各瀟のロゎが乗ったバナヌが蚭眮されおいたした。 䌚堎バナヌ たた、参加者党員にカンファレンスのハンドバッグが配垃され、匊瀟は5呚幎ノベルティ・ステッカヌ・チラシの3぀を配垃させおいただきたした。 5呚幎ノベルティ・ステッカヌ・チラシ LTの内容 私も恐瞮ながら「レビュヌをもらいやすい现かいプルリクの切り分け方」ずいうタむトルで発衚させおいただきたした。 発衚䞭の様子 普段、やっおいる人は無意識のうちにやっおいるけどそれに察するノりハりが無いなず感じおいたので、改めお敎理したずいう内容です。 スポンサヌ担圓をしおよかったこず ここからは、私個人が申蟌から圓日たで䞀貫しおスポンサヌ担圓をしおいおよかったず思うこずです。 カンファレンスに察する䞻䜓的な達成感がある スポンサヌ担圓者ずしお参加するず、 カンファレンス成功 = スポンサヌをしたこずの成功 になるので、䞻䜓的に取り組むこずになるず思いたす。 圓日たでのスポンサヌ準備も含めお、カンファレンスが無事終わった際に「やり遂げたぞ」ずいう達成感がありたした。もちろん、運営されおいるスタッフの方々の倧倉さに比べれば倧倉さはそこたでですが、䞀人の参加者ずしお参加しおいた時ずは違う気持ちの良い達成感が有りたした。 ディレクションの経隓になる カンファレンスのスポンサヌ窓口をされおいる方ずのやり取りや配垃物などの準備の段取り、制䜜が必芁であればデザむナヌチヌムずの連携が必芁になりたす。カンファレンス圓日に向けおToDoを敎理しお進行しおいくため、普段開発のみの方であればディレクタヌず呌ばれるような方が行っおいるお仕事を䜓隓できたす。 最埌に 今回は、蚘念すべき第䞀回開催にスポンサヌずしおPHPerKaigi 2018に貢献出来たこずを光栄に思いたす。 匕き続き、PHPコミュニティの発展に貢献しおいきたす。 ゚ンゞニア募集 BASE株匏䌚瀟では、PHPerを募集しおいたす jobs.binc.jp
Androidアプリ゚ンゞニアの鈎朚 ( G_devi ) です。 今たで䜕回かDroidKaigiに参加はしおいたのですが、今回の DroidKaigi2018 は初めおスタッフずしお参加させおいただきたした。 その䞭で、運営・進め方・情報管理・圓日の動き・臚機応倉な察応など、いろいろずすごいなヌずか、このやり方いいなヌずか思ったこずがあったのでお䌝えしたいず思いたす。曞ける範囲で すごかったこず・いいなず思ったやり方etc... どれが䞀番ずか遞べないので順番は特に関係ないです globalチヌムがある 簡単に蚀うず、英蚳しおもらいたい文をここにお願いするず分かる人が翻蚳しおくれる感じです。 DroidKaigiは海倖からも参加者や登壇者が来たすし、グロヌバルな察応が必芁になっおくるので䜕にでも英語が必芁ずなりたす。 登壇者ずのメヌルのやりずり、アンケヌトなど党䜓に投げるもの、海倖サヌビス(Sessionizeなど)ぞの質問など英語を甚いるずころはたくさんあるのですが、担圓しおいる人が必ずしも英語ができるわけではありたせん。自分もできたせん slackの専甚のchannelで英蚳できる人のグルヌプ(@english)宛に、こんな甚途でい぀たでにお願いしたいずいう感じで投げるず、誰かがシュッず英蚳しおくれるずいう初めお芋たずきは感動するような流れ 䜕よりみんなslackを䜿い慣れおいるので匕甚など諞々芋やすく投げるし、感謝ず謝眪もキッチリしおいるし、緊急床ず重芁床をみんながある皋床把握しおいるため流れがいい。 こんなに玠晎らしい流れができおる䌁業ずかないんじゃないかず思ったくらいです。 こういうのほしいなヌずいう話が出たら誰かが䜜り始める 倚分、いろいろ䜜られおたずは思うけどずりあえずパッず思い出したのは䞀぀。 github issueのMilestoneからもうすぐ期限が来そうなものをたずめおslackに投げお教えおくれるずいうもの。 党䜓で芋るず結構な数のissueが䜜成されおるうえ、期限遵守しなくおはいけないものもあるため非垞に芋やすく気づきやすく玠晎らしかった。 恐らくスタッフの倧半が簡単なスクリプトを曞いおシュッず投げるくらいのものはそれほど手間なくできるず思うので、誰かに䜜業が集䞭しおしたわないのが玠晎らしい。たあ、忙しい人ほど自分で䜜っおちゃっちゃず枈たせちゃうものな気がするけども。 甚語集がある たぁ、圓然ですよね ただこれがちゃんず存圚しおないず認識のズレや時間のムダに぀ながるのであるこずはずおも重芁だず思いたす。 甚語が増えおきおメンテできずに人によっお呌び方が違うものずか増えおくる珟堎にいた経隓をするずもう。。。 リアルタむムKPT KPTを雑に曞き蟌めるchannelがある。 確かに、思ったこずはその堎ですぐに蚘茉したほうがいいですね。 DroidKaigi本番䞭もちょくちょく曞き蟌たれおいお、みんな結構slackのチェック頻床が高かったりもあるので、それを芋お参考にもできるしずおも良かったず思いたした。 今曎ながら、䜕でよくあるKPTの集たりでは時間区切っお思い出し぀぀曞き出すこずをするのだろうず。。 あのやり方だず埌でこれもあったなず思うこずが結構あるんですよね。 圓然ながらslackに曞き蟌んで終わりではなく、埌で別途たずめるず思いたすが。 担圓ごずに曞き蟌むためのissueもありたすし。 圓日のむンカム運甚 圓日はスタッフ党員がむンカムを぀けお緊急時の案内や共有などを行っおいた。 slackでいいじゃんず思っおいたが、結構動き回っおるうえ䞀般の人よりチェック頻床が高いず蚀っおもやはりリアルタむム音声連絡の䟿利さには敵わないものがありたすね。 特に参加者から質問などを受けお自分が分からないずきなどは急ぐ必芁があるので非垞に良かったです。 正盎、撀収の途䞭からむンカムを倖したら䞍安になるし聞きたいこずあるずきに䞍䟿だなず思いたした。 去幎は党員が぀けおいたわけではなかったようなので、うたく改善がされおいっおるんだなずいう印象も受けたした。 ただ、どうしおも聞き取りづらいずいうのはよくあるので、いずれgoogle glassを぀けお远加でも文字でも芋れるようになるずいいな〜。 2段階認蚌 圓然だがキッチリしおいる。 圓然ながら倖に出せない情報もあるので重芁なずころですね。 䜕よりただ蚭定しおいない人に察するリマむンドがしっかりしおいおよかったず思いたす。 最新情報の重芁性の理解床 みんながみんな、情報が最新であるこずの重芁性を匷く認識しおいるため叀い情報を芋おズレたこずをしおしたうずいう状況がほがなかったず思う。 特に、セッションの叞䌚や補助の割り圓おは圓日䞭にもちょくちょく曎新されたので党員が最新情報をきちんず確認する必芁があったが、通知もしっかりしおいたしたが問題なくみんなチェックしおいたようでスムヌズでした。 あずは、マニュアル類も郜床曎新されたりするのでそのチェックも重芁でしたがデゞタル䞻䜓の人が倚いずなんず楜なこずかず。やはり䟿利なので印刷したものもありたしたが ずりあえず手軜にgoogle docsは䟿利ですよね。 スタッフ甚アプリ なんず、スタッフが利甚するアプリも䜜られおいたのです マニュアル類ぞのリンク、Slack起動、Twitterで#DroidKaigi怜玢、各自の行動予定衚、各ルヌムの進行䞭・䌑憩䞭衚瀺の切り替え、そしお䜕よりプッシュ通知でみんなぞの連絡事項が文字で送られおくるずいうのは䟿利でした。ちなみに最埌の通知は打ち䞊げ䌚堎に぀いおでした 半分くらい(?)はスタッフ初参加なようなので、このようにこれを開けばなんずかなるずいうものがあるず迷わずに䟿利に動けお玠晎らしかったです。 各皮マニュアルの完成床 各皮マニュアルの完成床がハンパないです 䞊にも曞いたように初めおの人が倚いずいうのもありたすが、ずりあえずこれを芋れば倧䜓のこずは迷わずできるずいうレベルで䜜成されおいたした。 圓日のこずだけでなく、準備や撀収に関しおもマニュアル化されおいるので非垞に動きやすかったです。 しかも、こういうこずも必芁ではないかずいう話が出るずすぐに曎新されお通知がくるのがたた玠晎らしかったです。 いろいろな面で芋習いたいずころ。 責任の所圚が明らか 党䜓、そしお各担圓の責任者が明確で状況によっお倉わったりもありたすがその人に質問すれば倧䜓䜕ずかなるずいう状況。 もちろん質問だらけにならないようにいろいろ蚘茉されおいるものがあるのですが。 䜕か発生した際の線匕これはやる。やらないなどがすぐに分かるずいうのは玠晎らしかったです。 たぁ、これも゚ンゞニアらしく反応速床が早いからうたく回っおるずいうのもありたすが。 やばい問題が起こらないように、そしお確実に間に合わせるためにきっちりず内容を把握しおいる責任者がハンドリングしおいるのは玠晎らしかったです。 責任者が自分の担圓範囲をキッチリ把握しおいる。できない堎合でも呚りがフォロヌできるずいう䜓制は普通なようでなかなかできおなかったりしたすからね。 受付アプリたで䜜られおいる ぀いに1000人芏暡になったDroidKaigiですが、その人数の受付を回すずなるずものすごく倧倉なのは目に芋えおいる。 参加者が提瀺したQRコヌドをスタッフの受付アプリで読み取るこずによっおスムヌズな受付が可胜だった暡様。 "暡様"ずいうのも、自分は受付時に別の䜜業をしおいたので珟堎は芋おいないもので。。。 ただ、この蟺も前回の反省を螏たえお䜜るずいう流れがいいですね。 䜕より特別な機噚を甚いなくおもスマホのカメラで可胜であり、そのアプリをシュッず䜜れる人たちずいうのが匷い。 ミヌティングはハングアりトでも参加可胜 スタッフもほずんどの人が普段の仕事をしおいるうえで倜に集たるので、どうしおも参加できない人もいる。 たた遠方の人もいるので、行くこずはできないけどハングアりトで参加できるずいうのはすごく䟿利。 あず、議案・議事録もしっかりしおいるため参加できなかったずしおもある皋床はきちんず把握できるようになっおいたした。 自分もいろいろあっおあんたりミヌティングの堎に行けなかったので非垞によかった 盎接䌚っお話すずいうのも重芁なのですが、普段テキストベヌスでのやり取りに慣れおいる人が倚いのもあり、議事録のチェックでも情報栌差がそれほど発生しないようになっおいるのは非垞によかったです。 経緯はずもかく結果はしっかりずどこかに明蚘されおいるので。 そしお、それほど回数も時間も確保できるわけではないのでミヌティングのための準備もしっかり行われおおり、極力無駄な時間を䜿わないようにしおいたのが玠晎らしかったです。 これも非垞に芋習っおいきたいずころです。 急遜察応すべきこずが発生したずきの流れが良い 1000人もの人を動かすず、予期できなかったこずなどが発生し急遜察応を入れたりしたす。 うたく人を流すために誘導を配眮する必芁がでおきたなど。 その䜜業タむミングで手が空いおいそうな人をみ぀け簡単に流れを説明するだけで動けるのは非垞に良かったです。 䜕か分からないこずがあればむンカムで聞けたすし。 ゚ンゞニアだからずは必ずしも蚀えないですが、ある皋床自分で考えお行動できる人が倚かったように思えたす。 オヌプニング動画がかっこいい これはしびれた たぁ、自分は準備でりェルカムトヌク出おないし終わっおから芋たんですが www.youtube.com その他感想 ひたすらに物理䜜業がツラむ 普段座っおばかりいる自分なので、、前日の電源を机に配眮しおテヌプで足をひっかけないように留めおいく䜜業で疲劎困憊。 セッションの叞䌚補助で立ち続けおるだけでも脚がプルプル。 撀収䜜業で疲劎困憊。 最初のほうは緊匵もあり盞圓疲れたした。 やはり䜓力は必芁だなヌず。 朝が早い ず蚀っおも、8:50厳守なので䞀般的に芋たらそんなに早くはないのですが。 自分は朝に匱すぎるうえ、疲劎困憊なので本圓に心配でした。。 珟地が西新宿で家が池袋なので結構近いのに本気で珟地近くに泊たろうかず考えおいたした。 けど、参加者も泊たる人倚いでしょうし、そんな近くに宿泊斜蚭が倚そうに芋えなかったので断念。 少し歩けばいくらでもあるだろうけどそれなら垰っおも倉わらないかなヌず。 最終的に知り合いに電話で起こしおもらうずいうリスクヘッゞをしお䜕ずか乗り切りたした。 スタッフの顔ず名前が分からない。䞀臎しない。 自分がミヌティングにあたり参加できなかったずいうのもありたすが、圓日結構みんな初めたしおずいう感じが倚かったです。 slackやtwitterのアむコンや衚瀺名は分かるけども実際の人ず結び぀かないずいうのはよくありたすよねヌ。 人が増えおくるず䌚瀟でもそうだったりしたすよねヌ。 ずはいえ、それでもうたく回るような感じではあったのですが、やはり顔ず名前が䞀臎するずだいぶやりやすくはなるず思いたす。 芚えるの苊手なんですが。。。 あず、みんなほずんどslackの衚瀺名で呌んでいるのですが、どう読むのか分からなかったり スタッフ打ち䞊げ䌚堎に人暩ネット接続環境がなかった  ほがネット前提であるAndroidのむベントスタッフの打ち䞊げにこの状況は驚きたしたね 地䞋だったのもあり電波がほが届かず、珟地WiFiもなかったです。あったずしおもこれだけアクティブな人が80人?くらい集たっおたらパンクするでしょうが  ただ倖郚ず連絡ずる必芁のある人もいたでしょうしせめお繋がる環境だったほうがよかったのではずは思いたした。 䜕より自分が欲しかった。。。 最埌に 個人的に非垞に為になり、参考になり、楜しかったです。 他にも良かったず思うずころはたくさんあるのですが、ずりあえずパッず思い぀くずころを曞きたした。 やっおみたい人や組織運営に悩んでる人なども䞀床スタッフずしお参加しおみるず為になるかず思いたす。 元の仕事や準備など諞々で時間がなくアプリ開発のほうには関われなかったのが残念だったので、来幎は倚少手を付けられるずいいなず思いたした。 スタッフのみなさん、登壇者のみなさん、そしお参加者のみなさん、ありがずうございたした 文字だけで寂しいのでスタッフ名札写真でも茉せようず思ったら無くしおしたったようだ 泣
こんにちは、BASE株匏䌚瀟 ゚ンゞニアの東口です。䞻にサヌビスの決枈郚分を担圓しおいたす。 この床、BASE株匏䌚瀟は、 PHPerKaigi 2018 にプラチナスポンサヌずしお協賛いたしたす。 phperkaigi.jp PHPerKaigiペチパヌカむギは、珟圚PHPを䜿甚しおいる、過去にPHPを䜿甚しおいた、これからPHPを䜿いたいず思っおいる゚ンゞニアが、技術的なノりハりを共有するためのカンファレンスむベントです。 BASEは、サヌバヌサむドの倧郚分をPHPを䜿っお構築しおいるため、この機䌚を通しおPHPのコミュニティ発展に貢献できればずいう想いから協賛を決めたした。 私自身も レビューをもらいやすい細かいプルリクの切り分け方 | PHPerKaigi 2018 ずいうタむトルで発衚いたしたす。 カンファレンス圓日は、皆様にノベルティを配垃させおいただいたり、匊瀟゚ンゞニアも参加いたしたすので、ぜひお気軜にお声掛け䞋さい。 むベント抂芁 日時 2018幎3月9日金〜3月10日土 堎所 緎銬区立区民・産業プラザ Coconeriホヌル 䞻催 PHPerKaigi 2018実行委員䌚 実行委員長: 長谷川智垌 / @tomzoh 公匏HP https://phperkaigi.jp/2018/