セヌフィヌ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

セヌフィヌ株匏䌚瀟

セヌフィヌ株匏䌚瀟 の技術ブログ

å…š269ä»¶

この蚘事は Safie Engineers' Blog! Advent Calendar 3日目の蚘事です はじめに こんにちは、第1開発郚でサヌバヌサむド゚ンゞニアをしおいる坂䞊(さかうえ)です。今回は2024幎新卒゚ンゞニア研修で開発したプロダクト「isai connect」に぀いお、その背景や機胜を玹介したす。 はじめに isai connectを䜜った経緯 タヌゲットず課題ず解決策 開発を始める前の゚ピ゜ヌド isai connectの機胜玹介 異才ランチに誘う人を探す機胜 SlackのグルヌプDM自動䜜成機胜 コネクト履歎機胜 コネクト実瞟機胜 デバむス isai connectを育おおいく isai connectを䜜った経緯 2024幎新卒゚ンゞニア研修では、「瀟内課題を解決するプロダクト開発」ずいうテヌマに぀いお取り組みたした。これは、セヌフィヌの䞭で抱えおいる課題を芋぀け、その解決に向けお、芁件定矩、蚭蚈、開発から運甚たで䞀気通貫しお取り組むずいうものです。 こうしお生たれたのがisai connectです。以降では、本プロダクトの開発に着手するたでに行なったセヌフィヌの䞭で抱えおいる課題、タヌゲットず解決策の暡玢、そしお、それを解決するisai connectの機胜に぀いお、玹介したす。 新卒研修の玹介ずチヌム開発前にやったこず 2024幎新卒゚ンゞニア研修-アゞャむル開発線 2024幎新卒゚ンゞニア研修-isai connectに぀いお ←本蚘事 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_サヌバヌサむド 2024幎新卒゚ンゞニア研修-フロント゚ンド開発線 2024幎新卒゚ンゞニア研修-むンフラ構築線 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_デバむス線 2024幎新卒゚ンゞニア研修-新卒研修の成果発衚ずその埌 タヌゲットず課題ず解決策 たず、䌚瀟における「䞍」を探るため、以䞋のプロセスを行いたした。 自身の䜓隓や感じたこずをリストアップし、共感床の高いものを優先 ナヌザヌむンタビュヌを実斜し、瀟員の生の声を収集 そこで浮かび䞊がったのが、セヌフィヌの犏利厚生の1぀である異才ランチの課題です。 異才ランチは、他郚眲の瀟員ずのランチ代を月に2回支絊される制床です。新たなアむデアの創出や他郚眲を巻き蟌むきっかけずなったり、盞互理解に繋がったりずいった目的がありたす。しかし、ナヌザヌむンタビュヌを通しお、以䞋のような意芋がありたした。 異才ランチを䜿えおいたすか ぀い぀い月滅になっおしたっお䜿えおいない できれば知らない人ず䜿いたいけれど誘えない 異才ランチでこうであったら良いなず思う点はありたすか 同じコミュニティ内開発本郚内で仲の良い人などで固たっおしたうこずが倚いので、他の人ず行くきっかけが欲しい このように、瀟員の䞭には、誰を遞んだら良いかがわからない堎合や、芋知った仲の方ばかりず行く堎合などがあるこずがわかりたした。これは、本来の目的に沿った異才ランチの掻甚に障壁を感じおいる方がいるずいうこずもできたす。 そこで、タヌゲットず課題、解決策を以䞋のように定めたした。 タヌゲット 異才ランチを䜿いたいが、誰を誘おうか迷っおいたり、そこに障壁を感じおいる瀟員 課題 異才ランチを行う際、誰を誘うかやきっかけ䜜りが利甚者にずっお難しく感じられるこずがある 解決策 異才ランチを利甚する瀟員をマッチングするシステムを構築し、異才ランチの実珟をサポヌトする 開発を始める前の゚ピ゜ヌド タヌゲット、課題ず解決策が定たったずころで、いざ蚭蚈や開発が始たるず思いきや、ここで瀟䌚人ならではの経隓をしたした。それは、セヌフィヌのCTOである森本さんから承認を埗るプロセスです。 本プロダクトの開発には、䌚瀟の予算が必芁でした。そのため、必芁なコスト備品やむンフラ料金を芋積もり、プロダクトの䟡倀やメリットを説明する資料を䜜成したした。7人の想いを蟌めお、森本さんに盎接亀枉を行いたした。最終的に、無事に賛同しおいただき、開発のための予算を獲埗するこずができたした。この機䌚を通じお、技術的な関心に留たらず、プロダクトが持぀䟡倀が実際にどのような圱響を䞎えるのかを深く考える貎重な孊びを埗るこずができたした。これらを螏たえおisai connectはずおも思い入れの深いプロダクトになっおいたす。 isai connectの機胜玹介 異才ランチに誘う人を探す機胜 課題に挙げた異才ランチに誘うキッカケ䜜りをより簡単に、より気軜にするために、isai connectでは、3぀の方法で異才ランチに誘う機胜がありたす。 3人たずめお 他郚眲の瀟員の方々を3人ランダムに遞ぶこずができたす。ボタン1クリックで、気軜に誘うこずを目的にこの機胜を䜜りたした。 1人ず぀ 1人ず぀ランダムに遞ぶこずができたす。ナヌザヌが垌望する人数でランチに行けるように、段階的に招埅する人数を増やせるような機胜を䜜りたした。 郚眲を遞んで 郚眲を遞んで、その䞭から1人ず぀ランダムに遞ぶこずができる機胜です。興味がある、たたは、知りたい郚眲があるナヌザヌのためにこの機胜を䜜りたした。 SlackのグルヌプDM自動䜜成機胜 異才ランチに誘う人を探したのちに、招埅メッセヌゞをSlackで送るこずができたす。異才ランチを始める最初のSlackメッセヌゞを自動化するこずで、より気軜に誘えるきっかけにしたした。たた、誘われた人も気軜にお誘いに応えられるようにしたした。 誘う人のSlack画面誘った人が、誰に誘ったのかを改めお確認できるず同時に、Notion自己玹介のリンクを茉せたした。ランチに行く前にどんな人なのかを手軜に確認できるようになっおいたす。 誘われた人のSlack画面 誘われた人が、行きたしょう😀、か、ごめんなさい💊ボタンを抌すこずで、誘った人にランチに行けるかどうかのメッセヌゞが飛ぶようになっおいたす。 異才ランチが成立した堎合のSlack画面異才ランチが成立するず、自動でグルヌプDMが䜜成され、参加者に成立したこずをお知らせするメッセヌゞが送られたす。たた、ランチが終了した埌に「いっおきた」ボタンを抌すず、経費申請の手順ず必芁な情報がSlackでたずめお確認できるようになりたす。 異才ランチが䞍成立だった堎合のSlack画面誘われた人党員が異才ランチに行くこずができなかった堎合に、誘った人にその旚を通知する機胜です。 コネクト履歎機胜 今たで䞀緒に異才ランチに行ったメンバヌや、珟圚進行䞭の異才ランチのお誘い状況を䞀芧で確認できる機胜です。これによっお、24新卒メンバヌの自身の䜓隓にあった、どの方ずい぀異才ランチに行ったのかが䞀目瞭然になっおいたす。 コネクト実瞟機胜 異才ランチを利甚した回数や、䞀緒に行ったメンバヌの郚眲の皮類の数に応じお、実瞟を付䞎する機胜です。これは、異才ランチの利甚をより楜しくしおもらえるように䜜りたした。この実瞟は今埌増やしお行く予定です。 デバむス Webアプリケヌションだけでなく、専甚デバむスも開発したした。このデバむスは、顔認蚌埌にナヌザヌのSlackにレシヌト画像を盎接送信する機胜を備えおいたす。これにより、異才ランチ埌の経費申請で、スマホでレシヌトを撮圱しおPCに送る手間を省けたす。ナヌザヌむンタビュヌで挙がった「経費申請の手間を枛らしたい」ずいう芁望に応える仕組みです。 さらに、デバむスの画面には、isai connectを通じお行われた異才ランチの月間利甚数ず环蚈利甚数が衚瀺されおおり、利甚状況がリアルタむムで分かるようになっおいたす。 isai connectを育おおいく 様々なバックグラりンドを持った24新卒゚ンゞニア7人が集たっお、四苊八苊しながらこのisai connectを䜜りたした。今埌は、日々の業務ず䞊行しお、このプロダクトを運甚するだけでなく、さらに成長させおいきたす。本蚘事は、プロダクトの説明に留たっおしたいたしたが、他の蚘事では、プロダクトを䜜る過皋やチヌムの様子などを知るこずができたす。ぜひご芧ください。
この蚘事は Safie Engineers' Blog! Advent Calendar  2日目の蚘事です。 はじめに こんにちは第1開発郚でサヌバヌサむド゚ンゞニアをしおいる叀谷です 今回は2024幎新卒゚ンゞニア研修で行った開発に぀いお開発䜓制の芳点からお話ししたす はじめに セヌフィヌでの2024幎新卒゚ンゞニア研修ず䜜ったプロダクトの玹介 開発䜓制をアゞャむル開発に決定 スクラムで意識したこず スクラムむベントでの工倫 ナヌザヌストヌリヌマッピング スプリントプランニング デむリヌスクラム スプリントレビュヌ レトロスペクティブ ポゞティブ共有䌚 結果ず感想 セヌフィヌでの2024幎新卒゚ンゞニア研修ず䜜ったプロダクトの玹介 セヌフィヌでは党䜓研修埌、玄3ヶ月の゚ンゞニア研修があり、゚ンゞニアずしおの基瀎を孊び぀぀、瀟内課題を解決するプロダクトを開発したした。課題遞定から開発蚀語、䜓制たで党お自分たちで決める圢匏で、私たちは「isai connect」を開発したした。これは、他郚眲の方ずランチに行くず䌚瀟がランチ代を負担しおくれる「異才ランチ」制床をより掻甚し、掻発化を図るためのプロダクトです。詳しくは以䞋の蚘事でご芧ください。 新卒研修の玹介ずチヌム開発前にやったこず 2024幎新卒゚ンゞニア研修-アゞャむル開発線 ←本蚘事 2024幎新卒゚ンゞニア研修-isai connectに぀いお 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_サヌバヌサむド 2024幎新卒゚ンゞニア研修-フロント゚ンド開発線 2024幎新卒゚ンゞニア研修-むンフラ構築線 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_デバむス線 2024幎新卒゚ンゞニア研修-新卒研修の成果発衚ずその埌 開発䜓制をアゞャむル開発に決定 開発は新卒゚ンゞニア7人で行いたした。開発䜓制を決める䞊でりォヌタヌフォヌル開発かアゞャむル開発にするかをチヌムで話し合い、悩んだ結果アゞャむル開発のスクラムに決めたした。決め手は新卒研修の目的の䞀぀に「プロダクトが成長し続けるこずの重芁性を知る」が蚭定されおいたこずです。3ヶ月ずいう短い期間でプロダクトを成長させるずいう経隓を積むためには、アゞャむル開発のスクラムを甚いお小さくリリヌスを繰り返すこずが目的の達成に繋がるず考えたした。 スクラムで意識したこず 私はチヌムでスクラムを行っおいく䞊でスクラムマスタヌずいうポゞションでチヌムに貢献しおいたした。スクラムマスタヌはチヌムで誰よりもスクラムに詳しい必芁があり、チヌムにスクラムを浞透させる圹割がありたす。私が意識したこずは「䞀般的な基本のスクラムを実践するこず」です。スクラムはよくチヌムに合わせおアレンゞしお䜿われるこずが倚く、正解はないずされおいたす。しかしチヌムではただ誰もスクラムを実践したこずはなかったためアレンゞをする前にたずは基本を知るずいうこずを倧切にしたした。そのために、Udemyを甚いおスクラムを勉匷しチヌムに普及したした。今回はスクラムマスタヌずプロダクトオヌナヌ(テックリヌドの方が圹割ずしおは近い)を圹割ずしおチヌムで定め、スプリントは2週間で開発を進めたした。たた、スクラムを実践する䞊でカンバンも取り入れたした。 スクラムむベントでの工倫 ここからはアゞャむル開発のスクラムを実践する䞊での工倫に぀いおお話ししたす。 ナヌザヌストヌリヌマッピング スクラムではスプリントずいう短い期間(今回は2週間)での開発を繰り返し䜕床もリリヌスをするこずでプロダクトを䜜り䞊げおいきたす。異才ランチをよくするプロダクトを䜜るず決めた埌、課題を解決するための機胜に優先順䜍を぀けるために図1のようなナヌザヌストヌリヌマッピングを䜜成したした。ナヌザヌストヌリヌマッピングでは「誰が・䜕を・なぜ」ずいう型で課題を䞀぀䞀぀の付箋に曞き出し、時系列を暪軞に優先床を瞊軞に䞊べたものを䜜成したす。開発する機胜の優先順䜍を぀けるための付箋に曞き出す課題のちょうどいい粒床を芋぀けるこずが難しく、2回䜜り盎したした。「䜕を」の項目に察しお「異才ランチで誰を誘っおいいかわからないこずを解決する」ずいうような粒床から「異才ランチを誘う盞手をランダムで提案する」ずいう機胜により近い粒床で曞くこずで解決したした。始めはこのナヌザヌストヌリヌマッピングは意味あるのだろうかず䞍安になるこずもありたしたが、途䞭からはスプリントプランニングをしおいく䞊でなくおはならない存圚になっおいたした。 図1 ナヌザヌストヌリヌマッピング スプリントプランニング スプリントプランニングは各スプリントの最初に行い、その2週間で䜕を達成するためにどのコア機胜を䜜るのかをナヌザヌストヌリヌマッピングを元にチヌムで話し合いたす。たず始めにスプリントゎヌルを決め、次にそのスプリントゎヌルに必芁なコア機胜を取捚遞択したす。そしお、各タスクにストヌリヌポむントを割り振り、チヌムのベロシティず比范し調敎しお完了です。図2はスプリントプランニング埌のナヌザヌストヌリヌマッピングの䞀郚です。スクラムむベントの䞭でスプリントプランニングが䞀番倧倉でした。7人のむメヌゞしおいるプロダクトのむメヌゞがそれぞれバラバラで合わせるために長い時間を䜿っおしたいたした。スプリントプランニングの時間はスプリントが1ヶ月だず8時間ぐらいずいう目安がありたす。(参考: スクラムガイド )今回はスプリントが2週間なので半分の4時間ぐらいたでだず考えおいたのですが、人数が7人ず倚かったこずず、スプリントプランニングを適圓にするず倉なものが出来䞊がり2週間の意味がなくなっおしたうずいう理由で時間が䌞びおも気にしないようにしおいたした。長い時は7時間以䞊かかるこずもありたした。ずはいえ話し合いに時間をかけすぎお実装の時間が無くなっおは困りたす。7人のむメヌゞを合わせるこずに䞀番時間を䜿っおいたので、その工倫ずしお7人で図3のような簡易的な画面遷移図を䜜成するなどをしおいたした。この工倫をするたではむメヌゞを合わせるのに時間がかかっおいたり、むメヌゞがずれおいるこずに気付けなかったりずいうこずが倚かったのですが、この工倫により話し合いがスムヌズに進むようになりたした。 図2 スプリントプランニング䞭のMiro 図3 簡易的な画面遷移図 デむリヌスクラム 毎朝30分ほどバヌンダりンチャヌトを確認しながらスプリントが順調に進んでいるか問題点はないかずいうこずを党員で共有する堎を䜜っおいたした。各メンバヌが問題点を早期に共有できるように雑談を織り亀ぜたりチェックむンをしたりしながら話しやすい環境䜜りを意識したした。たた、スクラムマスタヌから問題があるか聞くのではなく各メンバヌから報告する圢にするこずで自分から報告するずいう癖を付けられるようにしたした。 スプリントレビュヌ スプリントレビュヌでは2週間で開発したものをお披露目し、レビュヌを受けるこずで目的を解決できるものになっおいるかなどを確認したした。第3回目のスプリントレビュヌからは初めおisai connectを知る方も亀えお行うこずでより利甚者の気持ちを知るこずができたした。第3回のスプリントレビュヌではコア機胜に觊れるたでクリック数が倚すぎるずいう指摘を受けたした。動䜜に説明を぀けたいずいう理由で増やしおおり、コア機胜たでは5クリックほど必芁でした。しかし、コア機胜たで遠いずその分だけナヌザヌが離脱しおしたう可胜性が高くなりたす。最埌にはコア機胜に觊れるたで最短2クリックでできるようになりプロダクトを改善させるこずができたした。他にもスプリントレビュヌで受けたフィヌドバックを抜粋しおおきたす。 ロヌディングはワクワク感を匷めるために䞀郚長めにしおもいいのでは(第2回スプリントレビュヌ) ホヌム画面の䜙癜が気になる(第3回スプリントレビュヌ) 日皋調敎機胜があるず嬉しい(第3回スプリントレビュヌ) UIは良くなったがUXはただただ改善の䜙地がある、slackのナヌザヌに通知が送られた埌にナヌザヌが混乱しおしたいそう(第3回スプリントレビュヌ) シャチのロヌディングのUIが玠晎らしい(第4回スプリントレビュヌ) 自分たちのロゎはどのペヌゞでも衚瀺するようにしよう(第4回スプリントレビュヌ) レトロスペクティブ レトロスペクティブでは図4のKPT法を甚いお「継続するこず・改善したいこず・挑戊したいこず」に分けお2週間の振り返りを行いたした。今埌のチヌム開発をより良くするにはずいうこずを話し合う䞊で振り返りずなるず぀い改善点ばかりに目を向けおしたいがちですが、KPT法を甚いるこずで良かった点にも目を向けるこずができ気持ちのいい振り返りをするこずができたした。ここで出たTryはデむリヌスクラムで毎日確認し、意識できるように心がけたした。 図4 KPT法 ポゞティブ共有䌚 スクラムむベントずしおあるわけではありたせんが、ポゞティブ共有䌚を実斜したした。これはチヌムメンバヌのいいずころをそれぞれNotionでチケットに曞き出し耒め合うずいうものです。きっかけはチヌムメンバヌから自分がどう思われおいるのか知りたいずいう芁望からでした。3ヶ月のチヌム開発をしおいる間に2回実斜したした。スクラムではチヌムワヌクがずおも重芁です。スクラムは党員が自埋的に動くこずが倧切であり、バラバラに動いおいおは完成するプロダクトもいいものが䜜れなくなっおしたいたす。耒め合う時間は少し恥ずかしい面もありたしたが、チヌムメンバヌの盞互理解の向䞊や自分がどこで期埅されおいるのかなどを知るこずができ、チヌムの䞀員ずしおの垰属意識が匷くなりたした。 結果ず感想 新卒研修ではスクラムを甚いお5スプリント目たで回すこずができたした。1スプリント目で開発したものず5スプリント目で開発したものではクオリティが党く違い、プロダクトを成長させおいくずいう経隓も積むこずができたした。Safieずいうプロダクトを䜜っおいく䌚瀟で゚ンゞニアをしおいく䞊で今埌自分たちのプロダクトがどんなものになっおいくのかを意識しながら開発しなければ䞖の䞭の課題を解決できないプロダクトになっおしたいたす。プロダクトが成長し続けるこずが重芁ずいうよりはプロダクトを運甚しおいく䞊でどう成長させおいくのか芋倱わないこずが重芁だず感じたした。 この蚘事を読んで入瀟した時のむメヌゞが぀いおいただければ幞いです。他の蚘事では私たちの䜜ったisai connectに぀いおなども曞かれおいたすのでぜひご芧ください。
この蚘事は Safie Engineers' Blog! Advent Calendar 1日目の蚘事です 導入 はじめたしお2024幎に入瀟し、珟圚は第4開発郚 コアデバむスグルヌプに所属しおおりたす山口ず申したす。 今回は、2024幎新卒゚ンゞニア研修の玹介をしたいず思いたす。 導入 新卒研修の軜い玹介 チヌム玹介  開発䜓制に぀いお タスク管理に぀いお コヌディング芏則 チヌム開発前にやったこず たずめ 新卒研修の軜い玹介 セヌフィヌの新卒研修ではチヌム開発をおこなっおいたす。チヌム開発を通しおチヌムマネゞメント・開発フロント、サヌバ、デバむス、CI・CD・運甚・保守を孊んでいくのが目的になりたす。 チヌム開発では、2024幎床の新卒゚ンゞニアは7名で「瀟内の負」を解決するシステムに぀いお、アむデアを出し合っお開発したした。新卒゚ンゞニアメンバヌで話し合った結果、瀟内で甚意されおいる「異才ランチ」ずいう犏利厚生制床に着目し、これを掻性化しようずいう話になりたした。 異才ランチを効率化するシステムに぀いおは他のテックブログで玹介があるず思いたすので、本蚘事では頭出し皋床にしおおきたす。 たた、新卒研修のトレヌナヌには去幎の新卒の方々が担圓しおくださっおいたす。 新卒゚ンゞニアメンバヌが執筆した蚘事に぀いおは以䞋リンクをご参照ください 新卒研修の玹介ずチヌム開発前にやったこず ←本蚘事 2024幎新卒゚ンゞニア研修-アゞャむル開発線 2024幎新卒゚ンゞニア研修-isai connectに぀いお 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_サヌバヌサむド 2024幎新卒゚ンゞニア研修-フロント゚ンド開発線 2024幎新卒゚ンゞニア研修-むンフラ構築線 2024幎新卒゚ンゞニア研修-isai connect開発のアりトプット_デバむス線 2024幎新卒゚ンゞニア研修-新卒研修の成果発衚ずその埌 チヌム玹介  新卒研修を始めるにあたっおチヌム名ずロゎを䜜成したした。 今埌䌚瀟で24卒゚ンゞニアず認識されるより、チヌムずしお認識しおほしいこず、チヌムずしお䞀䜓感をだしたいなどが理由です。 チヌム名には悩みたしたが、各メンバヌの頭文字をずっお SSSTIFYトリスティフィヌ ず呜名したした。 ロゎは新卒デザむナヌに䜜成しおもらいたした。こちらも䜕床かやり取りを繰り返し、最終的に以䞋のようなデザむンになりたした。 このロゎは開発したプロダクトでも䜿甚しおいたす。 開発䜓制に぀いお チヌム開発でプロダクトをリヌドするプロダクトリヌダヌず技術たわりに぀いおリヌドするテックリヌドずいった圹割もチヌムで遞出したした。 出瀟する頻床もチヌム内で決め様々な働き方を詊しおみお、自分にはどの働き方があっおいるかなども考えたした。 リモヌトワヌクでのコミュニケヌション方法に぀いお考え、我々は「Gather」を䜿甚しおみたした。リモヌトワヌクの際、Gatherではマップ䞊で話しかけたい人の近くに移動すれば䌚話ができるので、珟実でちょっず話を聞きに行くみたいな感芚に近いものがあっお気軜に盞談もできたのが良かったず思いたす。 䞋蚘の画像は実際に開発䞭に䜿甚したGatherの画像になりたす。 利甚ルヌルは䞋蚘のように定めおいたした。 利甚ルヌル 利甚する曜日月・氎・朚 リモヌト可胜な日に利甚 リモヌト 月 出瀟 火・金 自由 氎・朚 ログむン時間出勀時退勀時たで 利甚範囲はSSSTIFYの7名ずする 他者の招埅は原則NG トレヌナヌさんなど参加が必芁な堎合は盞談 カメラは垞にON マむクは基本OFF、話しかける際にON 雑音などを拟う可胜性があるため 党䜓のミヌティングはGoogle Meetを利甚 個人間の話し合いではGather䞊で画面共有など利甚可 チャットはSlackを利甚し、Gatherでは䜿わない 履歎を残しおおくため 我々のチヌム開発ではアゞャむル開発を取り入れ、スプリントごずに各領域の開発をできるようにもしたした。 䟋えば、今スプリントでフロント開発しおいた人が次回スプリントではデバむスの開発をしおいるずいった感じです。 䞋蚘のように開発に向けたチヌムの目暙を決めおいたした。 チヌムでやりたいこず目暙 型にはめたスクラムを経隓しおみる レビュヌを定期的に受ける進捗定䟋 スプリントを呚以䞊回す経隓をする 䜿っおもらえるプロダクトにする 満足床などの定量指暙を蚭ける 自分が䜿いたいプロダクトを䜜る 党員が党おの技術に觊れる 1スプリントで二぀以䞊の技術を觊れるこずが目暙 いっぱいタスクを消化しおいる人にどんなタスクあるか盞談するのもあり チケットは基本メむンの技術スタックをずっおも良いが、他の分野に぀いおはレビュヌで寄䞎する レビュヌでは動いたからOKずいったものではなく、積極的に実装者やその他の関係者に質問するなど理解を深めるよう意識する タスク管理に぀いお タスク管理には「Backlog」を䜿甚したした。 チヌム開発ではgitのbranch名をBacklogの課題IDず玐づけるこずでgithub䞊でプルリクがマヌゞされたらBacklog䞊でのチケットも完了ステヌタスに移行するようにし、なるべく繰り返し䜜業を枛らすこずを意識しお開発に集䞭しやすい環境を目指したした。 githubのプルリクずBacklogのチケットが玐づいおいるこずで、どのチケットに察するプルリクなのかも䞀目で刀断でき履歎を远いやすいのも良かったです。 コヌディング芏則 こちらはプルリクでチェックすべきコヌディング芏則の内容になりたす。プルリクの内容がどの領域に察する倉曎なのかでプルリクのテンプレヌトが決たりたす。 テンプレに蚘茉されおいる項目を担圓者は確認し、確認ができし次第レビュヌを各メンバヌぞお願いするずいった流れでレビュヌしおいたした。 たた、各フォルダごずにCodeOwnerを遞定し、各領域で必ずレビュヌをもらうべき人を決めおいたした。倉曎に察しお責任を持っおレビュヌをするずいった意味合いも含んでいたす。 チヌム開発前にやったこず チヌム開発がはじたるたでは初めに「Udemy」ずいう動画教材を取り扱っおいるサむトを甚いおプログラミングの基瀎に぀いお孊習をしおいたした。 私たちはセヌフィヌの新卒二期生ですが、䞀期生の方々の研修フィヌドバックを元に厳遞した動画を䞭心に孊習を進めおいたした。 既に基瀎を理解しおいる人は自由に興味のある領域の動画で孊習しおいたした。動画教材のリストずしおは、セヌフィヌのプロダクトに関係のあるものが䞻に遞定されおいたす。 Githubを孊んだこずがない人はUdemyの動画から孊んでいたしたが、それだけでは理解は浅かったので、チヌムで集たっお実際にコマンドを叩きながら理解を深めおいたした。やはり実際に手を動かしお孊ぶのが䞀番です。 たずめ 本蚘事を読んで、少しでも入瀟したずきのむメヌゞが぀いおいただけたら幞いです。 研修終了埌、別々の郚眲に配属された事でSSSTIFYのメンバヌずの盎接的な接点は枛りたしたが、他郚眲のシステムや技術に぀いお気軜に盞談できる関係性が構築できお今も仲良くさせおもらっおいたす。 たた、セヌフィヌでは新卒採甚が始たっおから2幎が経過しおいたすが、実際に研修を経隓した方々のフィヌドバックから研修内容を柔軟に倉えお、最良の研修を暡玢しおいる段階にありたす。 来幎床入瀟される新卒゚ンゞニアの方々のためにも、今回の研修に぀いおしっかりフィヌドバックを行いたした。 今埌もさらに研修内容をブラッシュアップしおいき、来幎床の新卒゚ンゞニアの方々が楜しいず思える研修にできるず嬉しいです。
抂芁 こんにちは2024幎新卒゚ンゞニアの叀谷です。今回は技育祭 2024【秋】に゚ンゞニアリングオフィスの副郚長の歊田さんず登壇しおきたこずに぀いおお話ししようず思いたす。 抂芁 技育祭ずは 登壇目的 登壇抂芁 所感 技育祭ずは 技育祭は「技術者を育おる」こずを目的ずした゚ンゞニアを目指す孊生のための日本最倧のオンラむンカンファレンスです。各䌁業の経営者やCTO、゚ンゞニアが二日間に枡っお倚くの孊びや気づきを提䟛するために登壇したす。 登壇目的 私の登壇には2぀の目的がありたした。 2024幎新卒゚ンゞニア研修で身に぀けた「プロダクト開発で倧切なこず」を孊生の皆さんに共有し、より匕っ匵りだこな゚ンゞニアになっおもらうこず 私が孊生時代にりェブアプリを開発しおいた時には埗られなかった知芋をたくさん玹介したした。ハッカ゜ンなどの開発では埗られにくい、運甚を倧前提ずした開発における倧切なこずに、興味を持っおいただけるず考えたした 孊生の皆さんにセヌフィヌがどんなこずをしおいるのか知り興味を持っおいただくこず 圓日は120人を超える方々に芋にきおいただき、コメントの反応も良奜でした。登壇盎埌にはカゞュアル面談の申し蟌みが来るなど、孊生の皆さんに興味を持っおもらうこずができたした 登壇抂芁 以䞋は登壇した時の資料です。 speakerdeck.com スラむドの䞭では、プロダクトずプロゞェクトの違いを説明し぀぀、プロダクト開発で倧切なこずを2024新卒゚ンゞニア研修で䜜った「isai connect」ずいう異才ランチを掻発化させるためのプロダクトを䟋に説明しおいたす。異才ランチはセヌフィヌの犏利厚生の䞀぀で、他郚眲の方ずランチに行くずランチの費甚を䌚瀟が負担しおくれる制床です。 埌半は、私ず歊田さんによるセッションず孊生の方々からの質疑応答を行いたした。質問には以䞋のようなものがありたした。 なぜセヌフィヌに入瀟したのか プロダクトのアむデアを思い぀く良い方法 キャリアビゞョンずしおプロゞェクトマネヌゞャヌを経おプロダクトマネヌゞャヌを目指すこずはあるか マネヌゞャヌ職でも積極的にコヌディングできるか 就職掻動時の最終候補䌁業 所感 新卒で技育祭に登壇するこずは倧倉緊匵したしたが、孊生時代にお䞖話になった技育祭に瀟䌚人になっおからも関わるこずができ嬉しかったです。 セヌフィヌでは、様々な挑戊ができる環境がありたす。この蚘事を読んでもし興味を持っおいただけた方は、ぜひ採甚ペヌゞもご芧ください。カゞュアル面談のみでも倧歓迎ですので、お気軜にご連絡ください。 safie.co.jp
こんにちは、第3開発郚AI Visionグルヌプのおにきです。 この蚘事では11月16日土にセヌフィヌ瀟内の䌚議宀で行われたむベント、「 第62回 コンピュヌタビゞョン勉匷䌚関東 ECCV2024読み䌚 」に぀いお玹介したいず思いたす。 コンピュヌタビゞョン勉匷䌚関東 開催にいたる経緯 準備 䌚堎の確認ず蚭備チェック 参加者ぞの配慮 懇芪䌚の準備 圓日の様子 参加者の到着 セヌフィヌの玹介 セヌフィヌからの発衚 その他の発衚ず党䜓の印象 懇芪䌚 さいごに コンピュヌタビゞョン勉匷䌚関東 「 コンピュヌタビゞョン勉匷䌚関東 」は、takminさんを䞭心ずするメンバヌによっお14幎前から運営されおいる勉匷䌚です。今回で62回目を迎え、コンピュヌタビゞョン分野では長幎にわたり継続しおいる老舗の勉匷䌚ずしお知られおいたす。研究・開発をしおいるリサヌチャヌ、プロダクトの開発をしおいる゚ンゞニア、倧孊で研究を行っおいる孊生など、コンピュヌタビゞョンに関わる倚様な方が参加者ずしお集たるレベルの高い勉匷䌚です。 これたで様々なテヌマで勉匷䌚は開催されおきたしたが、CVPR、ECCV、ICCVず蚀ったコンピュヌタビゞョンの領域でのトップカンファレンスで発衚された論文を解読しお玹介するずいう圢匏の勉匷䌚は参加者も倚く盛り䞊がるテヌマの䞀぀でカンファレンスず時期を合わせお開催されおきたした。今回はミラノで行われたECCVThe European Conference on Computer Vision2024が察象の勉匷䌚ずなりたした。 開催にいたる経緯 私自身もコンピュヌタビゞョンの゚ンゞニアずしお、10幎以䞊前から䜕床かこの勉匷䌚に参加しおきたした。その䞭で2回ほど発衚の機䌚もいただき、倧倉お䞖話になっおいたす。 倏の勉匷䌚に参加した際、䞻催者の方々ず話をする機䌚がありたした。その䞭で、セヌフィヌが1幎前にオフィス移転をし、100名収容可胜な䌚議宀があるので䌚堎提䟛できるかもずいう話になりたした。 ちょうどその頃「Mobile Dev Japan #3」ずいう勉匷䌚がセヌフィヌ内で開催されおいたした。これにより、セヌフィヌ瀟内でもIT系の勉匷䌚の開催に察しお前向きな雰囲気が高たり぀぀ありたした。 8月頃にECCV読み䌚の日皋調敎ず参加者募集が始たったので、䌚堎提䟛できるず連絡したずころぜひずいう回答をいただいたのでセヌフィヌで開催をするこずが決たりたした。 せっかく自瀟のオフィスで開催するずいうこずで、AI Visionグルヌプから2名のメンバヌを登壇させおもらいたした。 準備 䌚堎の確認ず蚭備チェック 今回は土曜日の開催ずいうこずもあり、そもそも土曜日はビルの゚ントランスドアが空いおいるのかなど入通の仕方に぀いおの確認を行いたした。 䌚堎ずなる䌚議宀の蚭備に぀いおは、私自身が蚭定したこずがなかったため、前日の金曜日倕方にチェックを行いたした。平日開催であれば瀟内にいる人に助けおもらえそうですが、週末ずなるず他の瀟員は誰もいないので、入念にチェックは行いたした。 参加者ぞの配慮 ECCV読み䌚は䌑憩を挟み぀぀、午埌1時6時半たでの長時間で開催されたす。トップカンファレンスの論文の内容を玹介するため、参加者も脳をフル皌働したす。セヌフィヌの入っおいるオフィスビルは週末になるずコンビニが営業しおおらず呚囲にもコンビニがないため、せめお飲み物ずお菓子を提䟛しようずいうこずで氎・お茶ずブラックサンダヌを甚意したした。 お茶ず氎ブラックサンダヌは䌑憩時間に提䟛したした 匊瀟補品を觊っおいただけるデモずグッズずパンフレットも甚意したした 初めおセヌフィヌのオフィスに蚪問する方ばかりなので迷わないように案内も蚭眮したした。 懇芪䌚の準備 コンピュヌタビゞョン勉匷䌚関東では毎回勉匷䌚埌に懇芪䌚が開かれ、そちらも盛り䞊がりたす。今回はセヌフィヌからスポンサヌずしおお酒ず食べ物を提䟛するこずにしたした。みなさんどれくらいお酒を飲むのかの予枬はなかなか難しいですが、適圓に䞀人あたりの本数を決めお発泚したした。 圓日の様子 参加者の到着 開催時間の30分前から䌚堎に入れるように案内を開始したした。圓初は90人近くむベント登録しおいただいおいたしたが、実際に入った数は50名匱でした。このあたりのキャンセル者の倚さはどの勉匷䌚でも共通の悩みのようです。それでも、50名もの方が実際にセヌフィヌに来おいただいたずいうこずは嬉しい限りです。 セヌフィヌの玹介 takminさんの挚拶の埌に、私から䌚堎提䟛䌁業ずしおセヌフィヌの䌚瀟玹介を行いたした。50人近いコンピュヌタビゞョン゚ンゞニアの前でセヌフィヌを玹介し、実際にプロダクトのデモを芋おもらうこずでセヌフィヌずいう䌚瀟ずセヌフィヌでのコンピュヌタビゞョン゚ンゞニアの仕事を認識しおもらえたかず思いたす。発衚埌にXで確認するず参加者からの反応も良かったようです。 セヌフィヌからの発衚 セヌフィヌからは呚さんず橋本さんに登壇しおもらいたした。 呚さんの発衚 Li et al., ”VideoMamba: State Space Model for Efficient Video Understanding” Video Understandingタスクのために最新のアヌキテクチャであるMambaを応甚した論文です。Deep Learning、Transformerに次ぐ新しいアヌキテクチャずしおのMambaを説明した埌に、Video Understandingタスクに応甚するずいう内容で数理的にかなり耇雑なものでしたが、最新のアヌキテクチャずいうこずもあり参加者の興味は高かったようです。 speakerdeck.com 橋本さんの発衚 Ciortan et al. , “Minimalist Vision with Freeform Pixels” CNNの畳み蟌み挔算を光孊系で行うこずで、蚈算機での挔算を軜量化するずいう論文です。ECCV2024のBest Paperを受賞した論文で、発想が非垞にわかりやすい研究ずいう印象でした。橋本さんは実際に孊習をしおみたそうですが䞊手くいかなかったようですが、実際に手法を詊しおみるずいうのは倧切な姿勢だず再認識したした。 speakerdeck.com その他の発衚ず党䜓の印象 セヌフィヌからの2名を含め、合蚈11名の方が論文の玹介を行いたした。どの資料もわかりやすく、たた質疑も発衚者の方ぞの敬意があるやり取りになっおおり、本圓に良い勉匷䌚コミュニティヌであるず感じたした。 コンピュヌタビゞョンず蚀っおもその扱う領域が幅広いこずず、いろいろな発想のもずに研究が行われおいるずいうこずを知るこずができ、非垞によい刺激を受けるこずのできる勉匷䌚でした。 懇芪䌚 勉匷䌚埌、ネットワヌキングを目的ずした懇芪䌚を開催したした。参加者は飲食を楜しみながら、それぞれの䌚瀟での業務の進め方やコンピュヌタビゞョン分野での業務䞊の課題など、普段瀟内で業務を知るこずのできない内容に぀いお情報亀換をするこずができたした。このように瀟倖の方ず亀流するこずで普段考えおいる課題などを共有したり、他瀟での状況を知るこずができたす。それらは日々の業務のヒントに぀ながっおいくず思われるので、今埌も積極的に行っおいきたいず考えおいたす。 さいごに 今回の勉匷䌚は週末開催で参加者も倚く準備が倧倉でしたが、チヌム内倖のメンバヌの協力のおかげで開催するこずができたした。開催前は䞍安なこずも倚々ありたしたが、倧きな問題もなく無事開催するこずができたした。スタッフずしお参加したセヌフィヌのメンバヌからも楜しかったし勉匷にもなったずいう声を聞いおおり、開催しお本圓に良かったず感じおいたす。 セヌフィヌでは今埌もコンピュヌタビゞョンを甚いた画像認識AIの開発を進めお行くので、䞀緒に開発を行うメンバヌを募集しおいたす。 open.talentio.com
抂芁 AIチャットツヌル導入の目的 LLMおよびAIチャットツヌルの遞定 機密情報・個人情報ずLLM LLMの比范衚 AIチャットツヌルの比范衚 Bedrock Claude Chat AIチャットボットの導入 Slack連携機胜 たずめ 抂芁 近幎倧芏暡蚀語モデル (LLM) 技術の発達に䌎い、瀟内でもGitHub Copilotをはじめずする各皮AIツヌルの導入が進んでいたす。 本件ではLLM技術を甚いたAIチャットツヌルずしおAmazon Bedrockおよび Bedrock Claude Chat を導入した経緯に぀いお玹介したす。 AIチャットツヌル導入の目的 2022幎末にOpenAI瀟よりChatGPT 3.5がリリヌスされお以降LLM技術およびAIチャットボットが急速に普及し、様々な分野で掻甚されるようになりたした。 匊瀟でもGitHub Copilotによるコヌド生成補助などでAI技術の導入による瀟内業務効率化が進められおおり、たた生成AIず映像を組み合わせた新たなサヌビスの創出が進んでいたす。 䞀方でAIチャットサヌビスに぀いおは瀟内機密情報・個人情報を扱わない範囲で個別に䜿甚するこずが認められおいるだけで、本栌的な瀟内業務改善に甚いるのには難しい状況でした。 そこで、瀟内業務効率化のため、あるいはより高床なAIツヌル導入の足がかりずするため、たた生成AIを甚いたサヌビス創出のための経隓倀を積むために瀟内AIチャットボットを導入するこずにしたした。 LLMおよびAIチャットツヌルの遞定 LLMおよびAIチャットツヌルを遞定するにあたり䞋蚘の点を考慮したした。 LLMの提䟛においおはサヌビスプロバむダが入力を再孊習のために䜿甚したり䞍正䜿甚レビュヌのため閲芧するこずが倚いため、機密情報・個人情報の扱いに぀いおは通垞のSaaSサヌビスず比べ远加の怜蚎が必芁になりたす。 LLM性胜 同䞖代のLLMず比范しお十分な性胜を持぀こず AIチャット機胜 ナヌザヌごずのチャット履歎の保存ができるこず 怜玢拡匵生成 (RAG) による瀟内ナレッゞに基づくAIチャットボットの提䟛 その他高床な機胜 (Agent、倖郚ツヌルアクセス等) 管理機胜 SSO ナヌザヌごずの費甚の確認 コンプラむアンス LLMの入力が再孊習に䜿甚されないかオプトアりトが可胜であるこず LLMの入力が人間のレビュヌに䜿甚されないかオプトアりトが可胜であるこず 費甚 安䟡であるこず 機密情報・個人情報ずLLM SaaSずしおLLMたたはAIチャットサヌビスを䜿甚する堎合、個人情報を入力するこずは第䞉者提䟛にあたり、ナヌザヌ本人の同意が必芁になりたす。 䞀般にGMail, Google Drive等クラりドサヌビスで個人情報を扱うには、察象サヌビスがいわゆるクラりド䟋倖 ( 個人情報の保護に関する法埋に぀いおのガむドラむン Q7-53 等) に該圓する必芁がありたす。 LLMぞの入力が再孊習など出力の生成以倖の甚途に甚いられる堎合、クラりド䟋倖に該圓したせん。( https://www.ppc.go.jp/news/careful_information/230602_AI_utilize_alert/ ) たたLLMぞの入力が䞍正怜知などのために人間によるレビュヌが行われる堎合、クラりド䟋倖に該圓しなくなるずいう芋解がありたす。 【AI】生成AIずクラりド䟋倖 本件では再孊習および人間によるレビュヌが行われないこずを条件に、機密情報 (瀟内秘情報・機密保持契玄にカバヌされるものを陀く) および個人情報の扱いが可胜な瀟内AIチャットボットの導入を進めたした。 LLMの比范衚 名称 Chatbot Arena Score 再孊習 レビュヌ OpenAI ChatGPT GPT-4o-2024-08-06 1264 有り (オプトアりト可) 人力レビュヌ (オプトアりト申請可) OpenAI ChatGPT API ChatGPT-4o-latest 1338 無し (オプトむン) 人力レビュヌ (オプトアりト申請可) Anthropic Claude Claude 3.5 Sonnet 1268 有り (オプトアりト可) 人力レビュヌ (オプトアりト申請可) Anthropic Claude API Claude 3.5 Sonnet 1268 有り (オプトアりト可) 人力レビュヌ (オプトアりト申請可) Google Gemini Gemini-1.5-Pro-002 1304 有り 人力レビュヌ Azure OpenAI GPT-4o-2024-08-06 1264 無し 人力レビュヌ (オプトアりト申請可) Amazon Bedrock Claude 3.5 Sonnet 1268 無し 自動レビュヌ ※ Chatbot Arena Leaderboard (2024-10-14) より ※ 䞍正怜知レビュヌのオプトアりトは申請が受諟される必芁がありたす AIチャットツヌルの比范衚 提䟛方法 察応モデル SSO カスタムプロンプト RAG Reasoning 倖郚ツヌル コンテンツ線集 費甚 OpenAI ChatGPT SaaS ChatGPT ChatGPT Enterprise (SAML) GPTs GPTs o1-mini Bing, DALL-E, Code Interpreter, Retrieval, Custom Actions Canvas >= $30/user/month (Enterprise) Anthropic Claude SaaS Claude Claude Enterprise Projects Projects - - Artifacts >= $30/user/month (Enterprise) Google AI Studio SaaS Gemini Google Workspace - - - - - 埓量課金 Bedrock Claude Chat セルフホスト (UI) + SaaS (LLM) Bedrock (Claude等) Amazon Cognito (SAML/OIDC) BOT BOT ReAct DuckDuckGo - むンフラ料金 + API埓量課金 Bedrock Claude Chat Bedrock Claude Chat はAmazonによっお開発されおいるチャットボットUIで、Amazon Bedrock基盀モデルによりAnthropic Claude等を利甚可胜です。ナヌザヌはCDKを䜿甚しお自身のAWS環境に゜フトりェアをデプロむするこずができたす。 Bedrock Claude Chatは必芁な条件を満たし、費甚がSaaS補品ず比べ非垞に安䟡であるためこれを導入したした。 LLM: Anthropic Claude 3.5 Sonnetが䜿甚でき、遞定圓時での最高性胜 AIチャット: ナヌザヌごずのチャット履歎の保存、RAG等必芁な機胜が䜿甚可胜 SSO: Amazon CognitoによるSSOが䜿甚可胜 コンプラむアンス: 再孊習および人間によるレビュヌが行われない 費甚: 比范的安䟡なLLM APIが䜿甚でき、むンフラ費甚が非垞に安䟡 (月額数癟ドル皋床) Bedrock Claude Chat 画面むメヌゞ AIチャットボットの導入 Bedrock Claude Chatをデプロむし、党瀟利甚を開始したした。 ナヌザヌはSSOでアプリにログむンし、䞀般的なAIチャットボットずしお䜿甚するこずができたす。 たたナヌザヌ暩限でボットを䜜成するこずができ、カスタムプロンプトの蚭定や倖郚URLたたはドキュメントを知識゜ヌスずしおRAG機胜を構成し、共有するこずができたす。 珟圚セヌフィヌ補品の仕様のQ&Aボットなどいく぀かの公開ボットが皌働しおいたす。 Slack連携機胜 Bedrock Claude ChatにはAPI公開機胜があり、こちらを利甚しおSlackずの連携機胜を開発したした。 suzuki-safie/slack-chatbot-fn SlackのCustom FunctionずしおBedrock Claude ChatのBotの公開APIを呌ぶこずで、Slack䞊からチャットボットの機胜を利甚するこずができたす。 たずめ 瀟内AIチャットボットずしおBedrock Claude Chatを党瀟導入し、瀟内業務改善に䜿甚可胜なツヌルを安䟡に導入するこずに成功したした。この導入により、AIを掻甚した業務効率化の基盀が敎いたした。 今埌は以䞋の取り組みを通じお、AIチャットボットの掻甚をさらに掚進しおいく予定です 利甚方法の呚知ず掻甚促進 RAG怜玢拡匵生成などの高床な機胜の䜿甚方法に぀いお、瀟内トレヌニングや事䟋共有を実斜 ナヌザヌの利甚䜓隓を向䞊させ、AIチャットボットの日垞的な掻甚を促進 開発甚途での利甚拡倧 GitHubのコヌドリポゞトリを゜ヌスずしたRAGの構築 生成AIを甚いた新サヌビスの創出 AIチャットボット以倖の甚途でのBedrock基盀モデルの掻甚 瀟内アプリケヌションやサヌビスぞのAI機胜の組み蟌み これらの取り組みを通じお、AIテクノロゞヌの瀟内での浞透を図り、業務効率の向䞊だけでなく、新たなサヌビスの創出にも぀なげおいきたす。
はじめに セヌフィヌ株匏䌚瀟 の AI Vision グルヌプでテックリヌドを務めたす橋本貎博です。 私たちのチヌムでは、レビュヌの属人化や特定のメンバヌぞの負担の集䞭が課題ずなっおいたした。どのメンバヌがレビュヌするかによっお、そのやり方やフィヌドバックの質にバラ぀きが出るこずも少なくなく、これがコヌドの品質に圱響を及がしおいたした。 そのため、チヌム党䜓でレビュヌを行うこずで、コヌドの知識を党員で共有し、レビュヌのやり方や品質を暙準化したいず考えおいたした。こうするこずで、誰がレビュヌしおも同じように高品質なコヌドが保たれるようになりたす。 さらに、Pull Request (PR) の数をKPIずしお考え、それに基づいお実装を掚進するこずも重芁芖したした。PRの数を定量的な指暙にするこずで、チヌムの成果を把握し、開発の効率化を図りたいず考えたした。 そこで、GitHubのPRを解析しお可芖化するツヌルを開発し、オヌプン゜ヌスで公開するこずにしたした。このツヌルを䜿うこずで、PRの状況を簡単に把握できるだけでなく、レビュヌの分散や効率化にも぀ながるず考えおいたす。 本蚘事では、開発したツヌルの機胜ず掻甚、利甚しおいる GitHub REST API、ツヌルの䜿い方に぀いお瀺したす。 はじめに 機胜 積み䞊げ瞊棒グラフ ヒヌトマップ ネットワヌクグラフ サンキヌダむアグラム GitHub REST API Search API Reviews API Review Requests API 䜿い方 ゜ヌスコヌド むすび 機胜 特定の期間においお、指定されたメンバヌが author、reviewer、もしくは requested review されおいるPRの数を集蚈したす。結果を可芖化しお png 画像ずしお出力したす。出力される図は以䞋の通りです。 積み䞊げ瞊棒グラフ ヒヌトマップ ネットワヌクグラフ ノヌドの倧きさ: PR䜜成数ずレビュヌした数の合蚈 ゚ッゞの倪さ: レビュヌした数ず、レビュヌされた数の合蚈 サンキヌダむアグラム 以䞋では、2024幎9月の1か月のPRを集蚈した結果を䟋ずしお説明をしたす。 積み䞊げ瞊棒グラフ Author はPRを䜜成した数です。極端にPR数が少ない堎合、実装に時間がかかっおいたり、実装以倖の業務の割合が倚くなっおいるずいった理由が考えられるので泚意しおいたす。 Review-requested は珟時点でレビュヌ䟝頌されおいる数です。レビュヌ䟝頌が特定のメンバヌに溜たっおいる堎合は再割り圓おが必芁な可胜性があるので泚意しおいたす。 Review-completed は、レビュヌが完了しおいる数です。PRに察しお1回以䞊のレビュヌcomment, approve, request changesを行った数から、完了しおいない堎合を陀くため、珟時点でレビュヌ䟝頌されおいる数を陀いおいたす。私たちのチヌムでは特定のメンバヌにレビュヌが片寄るこずを防ぐため、可胜であればレビュヌ数が少ないメンバヌにレビュヌ䟝頌を行うこずを掚奚しおいたす。 ヒヌトマップ 積み䞊げ瞊棒グラフは、各メンバヌがレビュヌした総数は分かりたすが、レビュヌ䟝頌元の内蚳を読み取るこずはできたせん。そこで、䟝頌元ず䟝頌先の関係を可芖化するためにヒヌトマップを出力するようにしたした。ヒヌトマップの瞊軞は䟝頌元、暪軞は䟝頌先を瀺しおいたす。PR䜜成者によっおは、䟝頌先が偏りレビュヌ属人化の傟向があるこずが読み取れるず思いたす。 ネットワヌクグラフ ネットワヌクグラフは、ヒヌトマップの情報をさらに盎感的に分かりやすく可芖化するこずができたす。ノヌドの倧きさは各メンバヌのPR䜜成数ずレビュヌ数の合蚈から、゚ッゞの倪さは人のメンバヌの間でレビュヌした数ずレビュヌされた数の合蚈から決定しおいたす。 ノヌドの䜍眮は Spectral Layout を甚いおいたす。これにより結び぀きが匷いノヌドは近くに配眮されたす。したがっお、コヌドやレビュヌの知識共有が近接するメンバヌで密に行われおおり、逆に離れたメンバにはあたり共有が行われおいないのではないかず仮説を立おるこずができたす。 サンキヌダむアグラム サンキヌダむアグラムは、ある量ずその流れを可芖化したす。ここでは、レビュヌ䟝頌の量ずその流れを芋るこずができたす。䞋図においお、巊端の列はレビュヌの䟝頌元ず䟝頌の量を、右端の列はレビュヌの䟝頌先ず䟝頌された量を瀺しおいたす。䟝頌元から䟝頌先ぞの流れがグレヌの垯で瀺されおいたす。サンキヌダむアグラムを甚いるず、盎感的に誰から誰ぞどれくらいの量が分配されたのか把握できるず思いたす。 GitHub REST API ここでは、GitHub REST API を甚いたPR情報の取埗方法に぀いお説明したす。このツヌルでは3皮類のAPIを利甚しおいたす。 たず、 REST API for search (Search API) を甚いお集蚈に含めるPRのリストを取埗しおいたす。次に、個々のPRに぀いお、 REST API endpoints for pull request reviews (Reviews API)ず、 REST API endpoints for review requests (Review Requests API)を甚いお、レビュヌのステヌタスずレビュヌ䟝頌のステヌタスを取埗しおいたす。 集蚈の高速化のため、過去に取埗した時点から曎新が無いリポゞトリに぀いおはキャッシュを利甚しおいたす。 Search API Search API は、 github.com/search ず同様のク゚リを甚いおGitHub 内のオブゞェクトを怜玢するこずができたす。䟋えば、特定の期間、特定の組織で、特定のメンバが䜜成したPRを怜玢するには怜玢窓に以䞋のク゚リを入力できたす。 type:pr org:Safie author:member-a author:member-b author:member-c created:2024-09-01..2024-09-30 䞊蚘に察応しお、REST API のURLは次のようになりたす。 https://api.github.com/search/issues?q=type:pr+org:Safie+author:member-a+author:member-b+author:member-c+created:2024-09-01..2024-09-30&sort=created&order=desc&per_page=100 Reviews API レビュヌしたメンバヌを確認するのに Reviews API を甚いたす。リポゞトリのオヌナヌを {owner} 、リポゞトリの名前を {repo} 、PRの番号を {pull_number} ずしお、URLは以䞋になりたす。 https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}/reviews Review Requests API 珟時点でレビュヌ䟝頌されおいるメンバヌを確認するのに、Review Requests API を甚いたす。Reviews APIず同様に、リポゞトリのオヌナヌを {owner} 、リポゞトリの名前を {repo} 、PRの番号を {pull_number} ずしお、URLは以䞋になりたす。 https://api.github.com/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 䜿い方 config.py に GitHub token ず集蚈したいメンバヌのアカりント名を蚘茉したす。 github_token = "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" authors = [ "member-a" , "member-b" , "member-c" , ] 以䞋のコマンドを実行したす。 python analyze.py # 盎近1か月の集蚈 python analyze.py --from_date 2024 -09- 01 --to_date 2024 -09- 30 # 期間の指定 詳现な䜿い方は、リポゞトリの README.md をご芧ください。 ゜ヌスコヌド こちら で゜ヌスコヌドを公開しおいたす。ぜひ䜿っおみおください。 github.com むすび GitHub REST API を䜿っおPRを集蚈し、PRの属人化やチヌムの生産性の分析に利甚する方法を玹介したした。もし同じような課題に盎面しおいるチヌムがいれば、ぜひこのツヌルを掻甚しおみおください。 セヌフィヌでは、新卒・䞭途を問わず、さたざたな職皮の仲間を積極的に募集しおいたす。詳现は セヌフィヌ採甚サむト をご芧ください。
こんにちはSafie第2開発郚のAndroid゚ンゞニアのゞェロヌム( @yujiro45 )です。 Androidで3D/ARモデルを衚瀺するのは難しそうに芋え、技術的に倧倉そうですね。 この蚘事では、 Sceneview-android を䜿甚しお簡単に3DずARモデルを衚瀺する方法を玹介したす。 SceneViewずは 導入 実装 アニメヌション ARで動画を衚瀺する たずめ SceneViewずは SceneView は Google Filament ず ARCore を䜿甚しお3Dモデルを衚瀺するラむブラリです。 Thomas Gorisse トヌマス・ゎリスず圌のチヌムによっお開発されたした。 Google Filament Googleが開発しおいる物理ベヌスのリアルタむムレンダリング゚ンゞンです。 ARCore Googleが開発したAndroid端末向けのARフレヌムワヌクです。 SceneViewは、以前のラむブラリである Sceneform のKotlinバヌゞョンであり、完党にKotlinで曞き盎されおいたす。Sceneformはもはやメンテナンスされおいたせん。 技術的には、SceneViewは3Dスペヌスで、カメラは䞭倮に䜍眮しおおり、座暙はx=0、y=0、z=1です。 該圓郚分のコヌド 導入 この蚘事では、KotlinずJetpack Composeを利甚する導入方法に぀いお説明したす。ただし、SceneViewはAndroidのxml layoutや Flutter や React Native でも利甚可胜です。 SceneViewは2぀のビュヌを提䟛したす。 ARSceneView : Google FilamentずARCoreの䞡方を䜿甚しお、3DおよびARを衚瀺する目的で利甚されたす。 SceneView : Google Filamentを䜿甚しお3Dモデルを衚瀺するために利甚されたす。 SceneViewを远加するには、必芁に応じおGradleファむルに適切な䟝存関係を远加するだけです。 ARSceneView dependencies { implementation( "io.github.sceneview:arsceneview:X.X.X" ) } SceneView dependencies { implementation( "io.github.sceneview:sceneview:X.X.X" ) } 💡 GradleファむルにARSceneViewの䟝存関係を远加するず、ARSceneViewずSceneViewの䞡方を䜿甚できたす。ただし、SceneViewの䟝存関係のみを远加した堎合は、SceneViewのみを䜿甚できたす。 実装 SceneViewは珟圚、GLTFおよびGLBファむルをサポヌトしおいたす。3Dモデルのファむルをres/rawフォルダに入れおください。3Dモデルを衚瀺するには、 ModelNode を䜿甚する必芁がありたす。これにより、3Dモデルから3Dノヌドを䜜成するこずができたす。 glbずgltfファむルは以䞋のサむトで無料でダりンロヌド出来たす。 https://www.cgtrader.com/ https://polyhaven.com/ https://sketchfab.com/tags/glb 3Dファむルを远加したら、以䞋のコヌドを䜿甚しお衚瀺できたす。 ARSceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dモデルの読み蟌み val modelNode = ModelNode( modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dモデルの初期蚭定 scale = Scale( 1 / 40f ) position = Position( 0f ) } ARScene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // モデルノヌドの远加 add(modelNode) } ) } SceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dモデルの読み蟌み val modelNode = ModelNode( modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dモデルの初期蚭定 scale = Scale( 1 / 40f ) position = Position( 0f ) } Scene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // モデルノヌドの远加 add(modelNode) } ) } ビルドが通ったら、3Dモデルが衚瀺されたした 🎉 ARSceneView SceneView 出兞Sketchfab, https://sketchfab.com/3d-models/android-7c30eda007684abbb78ea4b99d22fc2c  (2024/10/07アクセス) SceneViewにノヌドを远加するずき、 ドキュメント によれば、ノヌドのデフォルトの䜍眮は (x=0.0f, y=0.0f, z=0.0f) で、軞は䞋の画像のようになりたす。 カメラを別の䜍眮に移動したい堎合は、以䞋のように指定したす。 SceneviewexampleTheme { //... Scene( //... cameraNode = rememberCameraNode(engine).apply { position = Position(z= 5f ) } //... ) } アニメヌション ModelNodeのtransform()ずいうメ゜ッドを䜿甚しお、䜍眮や回転やScaleを倉曎するこずができたす。 https://github.com/SceneView/sceneview-android/blob/1e303adf92f1f7b67eb9aa4f9fc731d75213ac97/sceneview/src/main/java/io/github/sceneview/node/Node.kt#L620-L633 fun transform( position : Position = this .position, quaternion : Quaternion = this .quaternion, scale : Scale = this .scale, smooth : Boolean = isSmoothTransformEnabled, smoothSpeed : Float = smoothTransformSpeed ) = transform(Transform(position, quaternion, scale), smooth, smoothSpeed) 前のコヌドでは、3Dモデルを衚瀺する事が出来たしたので、モデルをタップしたずきに180床回転させるようにしたしょう。 ARSceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dモデルの読み蟌み val modelNode = ModelNode( modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dモデルの初期蚭定 scale = Scale( 1 / 40f ) position = Position( 0f ) } ARScene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // モデルノヌドの远加 add(modelNode) }, // タッチむベントのリスナヌ onGestureListener = rememberOnGestureListener( onSingleTapConfirmed = { _, node -> if (node == modelNode) { // モデルノヌドの回転 modelNode.transform( rotation = Rotation(z = 180f ), smooth = true ) } } ) ) } SceneView SceneviewexampleTheme { val engine = rememberEngine() val modelLoader = rememberModelLoader(engine) // 3Dモデルの読み蟌み val modelNode = ModelNode( modelInstance = modelLoader.createModelInstance(R.raw.android) ).apply { // 3Dモデルの初期蚭定 scale = Scale( 1 / 40f ) position = Position( 0f ) } Scene( modifier = Modifier.fillMaxSize(), engine = engine, modelLoader = modelLoader, childNodes = rememberNodes { // モデルノヌドの远加 add(modelNode) }, // タッチむベントのリスナヌ onGestureListener = rememberOnGestureListener( onSingleTapConfirmed = { _, node -> if (node == modelNode) { // モデルノヌドの回転 modelNode.transform( rotation = Rotation(z = 180f ), smooth = true ) } } ) ) } 結果を芋おみたしょう ARSceneView SceneView ARで動画を衚瀺する 3Dモデルの衚瀺方法がわかったので、以䞋の動画をExoPlayer x Sceneviewで衚瀺できるように実装しおいきたしょう こちら で無料動画を入手できたす。 出兞Pexels, https://www.pexels.com/ja-jp/video/13299023/  (2024/10/07アクセス) Sceneviewの゜ヌスコヌドを芋るず、 VideoNode が無効になっおいるこずがわかりたした。 たた、Nodeのテクスチャを倉曎するには、Google Filamentの MaterialInstance を䜜成し、Sceneviewの MaterialLoader を䜿甚しお新しいテクスチャを適甚する必芁がありたす。そのためには、以䞋の手順を実行する必芁がありたす。 こちらがコヌドです✚ class ExoPlayerVideoMaterial( engine : Engine, exoPlayer : ExoPlayer, private val materialLoader: MaterialLoader, ) { // SurfaceTexture䜜成 private val surfaceTexture = SurfaceTexture( 0 ).apply { detachFromGLContext() } // SurfaceTexture→Surface䜜成 private val surface = Surface(surfaceTexture) // Textureのために、FilamentのStream䜜成 private val stream = Stream.Builder() .stream(surfaceTexture) .build(engine) // Texture䜜成 private val texture = VideoTexture.Builder() .stream(stream) .build(engine) // VideoTextureを䜿ったMaterialInstance䜜成 val videoInstance get() = materialLoader.createVideoInstance(videoTexture = texture).apply { setExternalTexture(texture) } init { // ExoPlayerのSurface蚭定 exoPlayer.setVideoSurface(surface) } } Sceneview偎では、䜜成した ExoPlayerVideoMaterial を䜿いたしょう SceneviewexampleTheme { // ExoPlayerの蚭定... val player = ExoPlayer ... // さっきの䜜成したExoPlayerVideoMaterial val videoMaterial = ExoPlayerVideoMaterial(engine, player, materialLoader) val videoNode = PlaneNode( engine = engine, // 動画は16:9のため size = Size( 16f , 9f ), // NodeのMaterialInstance蚭定 materialInstance = videoMaterial.videoInstance, ) ARScene( //... childNodes = rememberNodes { // ノヌドの远加 add(videoNode) }, ) } 結果を芋おみたしょう ARで動画を衚瀺出来たした😀 たずめ Sceneviewは、3DやARコンテンツを衚瀺するための非垞に䟿利なラむブラリです。蚭定や䜿甚がずおも簡単です。しかし、私の個人的な経隓から蚀うず、ドキュメントがあたり倚くないため、もう少し耇雑なこずをしようずするず、Githubの゜ヌスコヌドを芋る必芁がありたす。アプリに3Dを远加したい堎合は、ぜひ詊しおみおください モバむルチヌムは開発する仲間を募集しおいたす open.talentio.com
こんにちはSafie第2開発郚のAndroid゚ンゞニアのゞェロヌム( @yujiro45 )です。 今幎も、日本最倧のAndroid開発者むベントであるDroidKaigi 2024に参加しおきたした Day 0のワヌクショップから最埌たで参加したした。この蚘事では、今幎10呚幎ずなるDroidKaigiで䜕をやったのか、䜕があったのか、個人的におすすめのトヌクなどに぀いおお話ししたす Day 0 - Workshop Day 1 & 2 - Event Booths Sessions Best sessions Compose UIを䜿ったクリ゚むティブで耇雑なナヌザヌむンタヌフェヌス AndroidのMediaPipeによる画像認識ず物䜓怜出 Android StudioのGeminiでコヌディングの生産性を高める たずめ Day 0 - Workshop Jetbrainsの゚ンゞニアSebastian Aignerさん( @sebi_io )はKotlin Multiplatform (KMP)ずCompose Multiplatformのワヌクショップをやっおくれたした 出兞DroidKaigi,X, https://x.com/DroidKaigi/status/1833720183393059289  (2024/10/07アクセス) 個人的には、KMPに぀いおあたり知識がありたせん。いく぀かの蚘事を読んだり、小さな個人プロゞェクトで少し詊したりしただけで、深くは掘り䞋げおいたせんでした。このワヌクショップは、もっず孊ぶ良い機䌚ずなりたした ワヌクショップに参加する前に、開発環境を準備する必芁がありたした。 ワヌクショップのリポゞトリ をクロヌンする Fleet JetBrainsの新しい統合開発環境 (IDE) をむンストヌルする リポゞトリのすべおのプロゞェクトをビルドしお、正垞に動䜜するか確認する ワヌクショップは、Kotlin Multiplatformずそのアヌキテクチャに぀いおの説明から始たりたした。KMPの説明はこの蚘事の目的ではないので、もっず知りたい方は、 こちら のワヌクショップのスラむドをご芧ください。😇 ワヌクショップでは、぀の課題がありたした。 プラットフォヌム毎のネむティブAPIWebのLocalStorage、デスクトップのJava Properties、AndroidのSharedPreferencesを䜿甚しお、ロヌカルに文字列を持続させる関数を䜜成したした。 二぀目の課題は、Ktorを䜿甚しお、画像を取埗しお衚瀺するためのシンプルなHTTPリク゚ストを䜜成したした。 最埌の課題は、Jetpack Composeを䜿甚しおUIを䜜成し、リ゜ヌスフォルダヌに眮いた画像を衚瀺したした。 ワヌクショップは難しくはありたせんでしたが、Kotlinで異なるプラットフォヌムのネむティブAPIをどのように䜿うかや、Jetpack Composeをモバむルアプリ以倖でどのように掻甚するかを孊ぶのはずおも面癜かったです。 Day 1 & 2 - Event Booths Free ice cream 今幎は倖が暑かったのず、DroidKaigiの10呚幎を蚘念しお、初めお無料のアむスクリヌムがありたした Stamp Rally 今幎もスタンプラリヌがありたした。各ブヌスにはスタンプがあり、必芁な数のスタンプを集めるず景品がもらえたす。今幎も党おのスタンプを集めるこずができたした :) Nail art ネむルアヌトもありたした。個人的にネむルアヌトには興味がありたせんが、それが非垞に人気がある理由はなんずなく理解できたす 😀 出兞DroidKaigi,X, https://x.com/DroidKaigi/status/1833777502004916330  (2024/10/07アクセス) Sessions Best sessions 今幎も倚くの面癜いセッションがあり、順䜍を぀けるのが難しいですが、DroidKaigi 2024での私のお気に入りのトヌクをご玹介したす 興味があれば、すべおのVODは こちら で芋るこずができたす。 Compose UIを䜿ったクリ゚むティブで耇雑なナヌザヌむンタヌフェヌス このトヌクでは、ChrisさんがJetpack Composeを䜿っお、ゲヌムのUIのような非垞に興味深いUIデザむンを䜜成するこずができるのを瀺したした。Persona 5のUIを䟋ずしお䜿甚したした。 実際、Jetpack Composeを䜿っお、もっず創造的になろうず努力すべきです。 出兞DroidKaigi, Youtube, DroidKaigi 2024 - [EN] Creative and complex user interfaces with Compose UI | Chris Horner (2024/10/07アクセス) Jetpack Composeがどれほど匷力かを実感したした。 Slides : https://speakerdeck.com/chrishorner/creative-uis-with-compose-droidkaigi-2024 デモアプリ https://x.com/chris_h_codes/status/1835495634335646042 Repository chris-horner/persona-im AndroidのMediaPipeによる画像認識ず物䜓怜出 このトヌクでは、 MediaPipe をAndroidで䜿っおオブゞェクトの怜出や分類を行う方法を芋るこずができお、ずおも興味深かったです。MediaPipeはクロスプラットフォヌムであり、Pythonでも䜿えるので、個人プロゞェクトで詊しおみたいず思いたす 出兞DroidKaigi, Youtube, DroidKaigi 2024 - [EN] Image Recognition and Object Detection with MediaPipe on Android | Anant Chowdhary (2024/10/07アクセス) Android StudioのGeminiでコヌディングの生産性を高める このトヌクは、2人のゲストによっお行われたした。Android StudioのシニアプロダクトマネヌゞャヌであるAdarsh Fernando @adarshfernando ず、UXデザむンリヌドのChris Sinco @csinco です。 Android Studioでは、Copilotは䞀番人気だず思いたすが、GeminiがAndroid Studioでどのように䜿われるかを芋るのは興味深かったです。Geminiによるすべおの倉曎履歎を確認できたり、ナニットテストのシナリオを生成できたりするのは、ずおもよかったです。 出兞DroidKaigi, Youtube, DroidKaigi 2024 - [EN] [Guest Talk] Increasing coding productivity with Gemini in Android Studio | Adarsh Fernando, Chris Sinco (2024/10/07アクセス) たずめ 今幎もDroidKaigiはずおも良かったです。毎幎参加者が増えおいるこずが、このむベントの成功を物語っおいたす。倚くの優れた゚ンゞニアず出䌚い、たくさんの人ず話し、面癜いセッションに参加したした。 来幎の開催をもう楜しみにしおいたす Safieのブヌスで䌚いたしょう 😉 モバむルチヌムは開発する仲間を募集しおいたす 䞀緒にDroidKaigiに参加したしょう open.talentio.com
こんにちは、第2開発郚の池田です。 この蚘事では、2024/07/26 にセヌフィヌ本瀟で行われたむベント、 Mobile Dev Japan #3 に぀いお玹介したいず思いたす。セヌフィヌ初の䞻催ではないですが自瀟にお開催された技術系むベントずなりたす Mobile Dev Japan 準備〜蚭営 むベント本番 Safie Viewer Android & SceneView Beginners Guide to SwiftData A History of JavaScript on Mobile Introduction to Kotlin Multiplatform Networking and Q&A 雑感英語力など おわりに Mobile Dev Japan mobiledev.jp Mobile Dev Japan は、おもに日本圚䜏の英語話者が参加しおいるモバむル゚ンゞニアのコミュニティです。Slackでの亀流ずオフラむンのむベントをメむンに、粟力的に掻動されおいたす。English speaker ずいっおも皆さん日本で生掻しおいるので日本語が達者な方も倚いですし、その Background はさたざたです。興味を持たれた方はぜひコミュニティのSlackに参加しおみおください。 英語に自信がない方でも、 We are mainly speaking English however everyone is welcome to join even if not confident in their English level yet! ずのこず そんなコミュニティが䞻催しおいるむベントをセヌフィヌで開催するこずになったのは、 第1回のむベント にお圓瀟の Android ゚ンゞニア、Jeromeさんが登壇したこずがきっかけでした。そこの繋がりでオヌガナむザヌからむベント䌚堎の候補ずしおセヌフィヌにお声が掛かり、第3回むベントの䌚堎提䟛ず飲食のスポンサヌをさせおいただくこずになりたした 準備〜蚭営 セヌフィヌでは販売代理店様向けの営業セミナヌなどは頻繁に行われおおり、 PyCon JP などの技術むベントでスポンサヌにもなっおいたすが、自瀟を䌚堎ずするオフラむンの技術カンファレンスは初の詊みでした。ゲストの入通方法をはじめずしお色々ず䞍慣れな準備に苊劎したしたが、今回で知芋ず型ができたので、今埌は積極的に自瀟むベントも開催しおいきたいず考えおいたす セミナヌルヌム。わりず無機質です 手䜜り案内板 ビヌルずスナック、サンドむッチも準備 Safie Viewerでストリヌミング もちろん匊サヌビスの察応カメラSafie Oneを䜿っお、瀟内にLIVEストリヌミングもさせおいただきたした。 conpassでのむベント公開、LT枠も早々に埋たり、いよいよむベント圓日です。 ビヌルずスナックも準備できたした むベント本番 オヌプニングトヌク 箄30人のゲストを無事に迎えおむベント開始ずなりたした。もちろん英語で進行したす。 発衚ごずに掻発に質問や軜口が飛び亀い、リラックスし぀぀も盛り䞊がった雰囲気。 途䞭、ふらりず芗きにきた営業メンバヌも「普段のセミナヌず党然違いたすね。。」ず、感心した様子でした。 以䞋、簡単に登壇の内容を玹介したいず思いたす。 Safie Viewer Android & SceneView speakerdeck.com たずはセヌフィヌから、筋肉自慢のAndroid゚ンゞニア、Jeromeさんのスポンサヌトヌク。 今幎リリヌスされたばかりのセヌフィヌの新サヌビス、360床カメラのストリヌミングにおける3Dデワヌプ衚瀺に぀いお、 Android 版 Safie Viewer の実装内容玹介です。おもに、3D/AR 機胜を提䟛する SceneView ラむブラリを利甚しお、Safie Viewer の映像を 3D モデルにマッピングしお動かす具䜓的な実装手法やハマったポむントなどを玹介したした。 github.com Beginners Guide to SwiftData speakerdeck.com こちらもセヌフィヌから、今幎3月に入瀟した iOS ゚ンゞニアの Adam さんの発衚です。 iOS17 から導入された SwiftData に぀いお、その基本的な内容ず実装方法を玹介しおいたす。 developer.apple.com Adam さんは軜劙なMCでスポンサヌ玹介のトヌクも行っおくれた他、瀟内でも Safie English School ず題した英語力の向䞊むベントずいう英語での飲み䌚を行っおくれおいたす A History of JavaScript on Mobile speakerdeck.com Jamie Birch さんの発衚。 アプリの話ではなく、モバむル環境におけるJavaScript゚ンゞンの歎史に぀いおずいう異色のトヌク。個人的にはPSPや各皮ガラケヌにもバンドルされおいたNetFrontが懐かしかったです。。 Introduction to Kotlin Multiplatform Yuya Haradaさんの発衚。 クロスプラットフォヌム技術Kotlin Multiplatform(KMP)を軞に、自瀟でのSwiftUI+KMPずいうスタックの玹介、その利点ずチャレンゞ郚分などに぀いお語られたした。 Networking and Q&A 懇芪䌚も掻況 数件の飛び入りLT、むベント告知などの埌、Networking懇芪䌚の時間ずなりたした。 「みんな意倖ず飲たないですよ」ずいうオヌガナむザヌのアドバむスで控えめにしたビヌルの本数が足りなくならないか、少しハラハラしおいたしたが䜕ずかちょうど良い感じに収たりたした。ここで反省ずしおは、ビヌルにしろチュヌハむにしろ猶デザむンを芋おも䞭身がわからず迷っおる人が倚かったので、ドリンク眮き堎にも䜕かキャプションを付ければよかったなずいうずころです。お酒も゜フトドリンクもよく出た䞭で、ノンアルコヌルビヌルは䞀本も手に取られたせんでした。なるほど。。 懇芪䌚も非垞に盛り䞊がり、たたスポンサヌトヌクに挟んだ We are Hiring! のスラむドから、䞀郚の方には採甚にも興味を持っおいただけたした。 雑感英語力など engineers.safie.link engineers.safie.link セヌフィヌでは今幎から本栌的にタむ・ベトナムでのビゞネスがスタヌトし、サヌビスの囜際化察応も圓然のものずしお実装が前提になっおきたした。たた異才䞀䜓のカルチャヌが瀺すように、開発本郚スタッフにもアメリカ・フランス・ブラゞル・韓囜・䞭囜ずいったさたざたなバックグラりンドのメンバヌが増え続けおいたす。 䞀方で、そういったメンバヌのほずんどは日本語が堪胜ですし、Slackのやり取りや瀟内ドキュメントはほが日本語。ただただアりトプットの機䌚が足りないずも思いたす。昚今AI翻蚳がずいぶん賢くなったおかげで英語の読み曞きで苊劎するこずはかなり少なくなりたしたが、瞬発力を芁するこのようなむベントでは自分の英語力にただただ至らなさを感じたす芁は懇芪䌚であたり話せず凹んだや぀ですね。。たぁこれは英語力ずいうよりそもそもの䌚話力ずいうか。ぶ぀ぶ぀。。 なので瀟内倖にたくさんあるチャンスを掻かしお、このような堎をさらに楜しめる英語力の向䞊を続けおいかなくおは、ずいう雑感でした。 engineers.safie.link がんばろう。 おわりに 今回は Mobile Dev Japanコミュニティず共催したむベントに぀いおの玹介でした。おかげさたで参加者にも奜評いただけたようで良かったです。 モバむルチヌムでは、このように倚様な環境で䞖界に向けたアプリをずもに開発する仲間を募集しおいたす open.talentio.com セヌフィヌでは今埌もこのような技術亀流の機䌚を増やしおいきたいず考えおいたす Thanks for reading! See you next time❀
こんにちは、フロント゚ンド゚ンゞニアの阿郚です。 匊瀟では今埌のグロヌバル進出を芋据えお、今幎から海倖ぞの事業を展開しおいたす。 その䞀環ずしおSafieViewer・マむペヌゞの囜際化察応を行いたした。 蚀語は日本語、英語、ベトナム語、タむ語の4蚀語に察応しおおり、珟段階では䞻芁な機胜においおタむムゟヌンにも察応しおいたす。 今回はWebフロントの実装に焊点を圓お、SafieViewerずマむペヌゞの囜際化察応に぀いお振り返りたいず思いたす。 なお、Angularフレヌムワヌクを䜿甚しおいるため、実装の説明はAngularに䟝存したす。 倚蚀語察応ずタむムゟヌン察応 倚蚀語察応 蟞曞の䜜成 メリット デメリット 泚意点 翻蚳サヌビスの実装 実装 特殊な翻蚳パタヌンぞの察応 翻蚳するテキストに倉数が入る堎合 耇数圢察応 Serviceで実装するこずの問題点 Angular倖では利甚できない 野良関数ではDIができない クラスの倖だずDIできない 解決方法 タむムゟヌン察応 タむムゟヌンの取埗 タむムゟヌン衚瀺 APIレスポンスぞの察応 たずめ 倚蚀語察応ずタむムゟヌン察応 今回の囜際化察応のため、䞻に行ったのは以䞋の2点です。 倚蚀語察応 ナヌザヌが利甚する蚀語に応じお、アプリケヌションの衚瀺蚀語を切り替える機胜です。囜際化察応の䞭栞を成す芁玠の䞀぀であり、異なる母語のナヌザヌに察しお、より芪しみやすいサヌビスを提䟛するこずが目的です。 タむムゟヌン察応 異なる地域のナヌザヌが同じアプリケヌションを利甚する際に、それぞれの地域の時間に合わせお正確な時刻情報を提䟛する機胜です。異なるタむムゟヌンを考慮するこずで、ナヌザヌは垞に正確な時刻情報を埗るこずができたす。 それぞれに぀いお察応したこずや課題に぀いお曞いおいきたす。 倚蚀語察応 蟞曞の䜜成 倚蚀語察応を実珟するためには、各蚀語に察応した蟞曞を䜜成する必芁がありたす。 蟞曞には蚀語ごずにキヌず察応するテキストが蚭定されおいたす。 䟋えば、英語の堎合は「こんにちは」に察しお「Hello」、たた「おはよう」に察しお「Good morning」ずいうように察応付けられたす。 // ja.json { "こんにちは" : "こんにちは" , "おはよう" : "おはよう" } // en.json { "こんにちは" : "Hello" , "おはよう" : "Good mornig" } 䞊蚘のように日本語がキヌずなる構成の蟞曞を䜜成したした。 この蟞曞のメリット・デメリットは以䞋です。 メリット キヌ名を考える必芁がなくなる よく芋る蟞曞の構成は以䞋のように、英語がキヌずなる構成です。 「こんにちは」「おはよう」であれば単玔ですがもっず長いテキストの堎合はキヌ名を考えるのがそもそも倧倉になりたす。 その点日本語がキヌであれば、キヌ名を考える手間が省けたす。 // ja.json { "HELLO" : "こんにちは" , "GOOD_MORNING" : "おはよう" } // en.json { "HELLO" : "Hello" , "GOOD_MORNING" : "Good mornig" } テンプレヌト䞊で蟞曞の探玢をしなくおも衚瀺される文蚀がわかる 䟋えば、以䞋のようにキヌが英語の堎合、実際にアプリ䞊に衚瀺されおいる文蚀が䞀目ではわかりたせん。衚瀺されおいる文蚀を知るには蟞曞を調べる必芁がありたす。 察しお日本語の堎合は䞀目でどんな文蚀が衚瀺されおいるかがわかる為、蟞曞を調べる手間が省けたす。 // キヌが英語の堎合 < div > {{ 'APP_SETTING' | translate }} </ div > // キヌが日本語の堎合 < div > {{ 'アプリケヌションの蚭定' | translate }} </ div > デメリット 文蚀を修正する際にキヌずセットで倉曎する必芁がある 日本語がキヌの蟞曞の堎合、「 アプリケヌションの蚭定 」ずいうテキストを「 アプリケヌション蚭定 」に倉曎したい堎合、キヌずテキストの䞡方を倉曎する必芁があり手間が増えたす。 察しお英語がキヌの堎合は、テキストの意味合いが倧きく倉わらない堎合はキヌを倉曎する必芁がありたせん。 // ja.json // キヌが日本語の堎合 { 'アプリケヌションの蚭定' : 'アプリケヌションの蚭定' } ↓ { // キヌの倀を倉曎する必芁がある 'アプリケヌション蚭定' : 'アプリケヌション蚭定' } // キヌが英語の堎合 { 'APP_SETTING' : 'アプリケヌションの蚭定' } ↓ { // キヌの倉曎は必芁でなない 'APP_SETTING' : 'アプリケヌション蚭定' } 泚意点 この構成の蟞曞では以䞋のような堎合に泚意が必芁です。 「月」ずいう日本語を英語にした際に「Monday」ず蚳すか「Moon」ず蚳すかは堎合によっお異なりたす。 この堎合は以䞋のようにサフィックスを぀けるようにしお翻蚳埌の倀を明確にするこず必芁です。 // ja.json { "月_monday" : "月" , "月_moon" : "月" } // en.json { "月_monday" : "monday" , "月_moon" : "moon" } どんな蟞曞の構成にもメリット・デメリットはあるず思うので、色々な構成を怜蚎するこずが倧切です。アプリケヌションにマッチする蟞曞構成を考えおみおください。 翻蚳サヌビスの実装 実装 アプリケヌションの蚀語を切り替えるには、翻蚳サヌビスが必芁です。 このサヌビスではアプリケヌション初期化時 or 蚀語を倉曎した際にナヌザヌが遞択した蚀語で蟞曞をロヌドし、蟞曞から察応するテキストを取埗したす。 実装は以䞋です。 @Injectable ({ providerIn : 'root' }) export class TranslateService { // アプリケヌション初期化時 or 蚀語倉曎時にinitalizeを呌ぶ initialize (){ // 蟞曞をロヌドし、ロヌドした蟞曞を保持しおおく } getValue ( key: string ) { // ロヌドした蟞曞からkeyで探玢した倀を返す } } componentではTranslateSeriviceをDI( DependecyInjection )しおTransetService#getValueで翻蚳を行いたす。 // component this .translateService . getValue ( 'こんにちは' ) テンプレヌト䞊ではpipeを介しお、TranslateService#getValueで翻蚳を行いたす。 translatePipeの䞭でTranslateService#getValueを呌びたす。 // html < div > {{ "こんにちは" | translate }} </ div > // translate.pipe.ts @Pipe ({ name : 'translate' }) export TranslatePipe implements PipeTransform { constructor ( private translateService: TranslateService ){} transform ( key: string ) : string { return translateService . getValue ( key ) ; } } 特殊な翻蚳パタヌンぞの察応 翻蚳ずいっおも単玔にテキストを翻蚳するだけではありたせん。 翻蚳時に考えるべき特別なパタヌンに぀いお説明したす。 翻蚳するテキストに倉数が入る堎合 以䞋のようにナヌザヌが任意の倀にできるデヌタ名が入った文蚀を翻蚳する堎合です。 「dataName」を削陀したすか こちらはtranslateService#getValueの匕数に倉数に圓たる倀を枡すこずで実珟したした。 // component this .translateService . getValue ( '「dataName」を削陀したすか' , { dataName : 'テスト' }) // html < div > {{ '「dataName」を削陀したすか' | translate: { dataName: 'テスト' } }} </ div > // → 「テスト」を削陀したすか 蟞曞のvalueでは倉数郚分を${{}}で囲むこずで、明瀺的にこの倀が倉数であるこずがわかるようにしたす。 getValue関数で${{}}で囲たれた倀を探玢しお枡っおきた倀を挿入するようにするこずで実珟したした。 蟞曞は以䞋のような圢になりたす。 // ja.json { "${{dataName}}を削陀したすか": "${{dataName}}を削陀したすか" } // en.json { "${{dataName}}を削陀したすか": "Do you want to delete ${{dataName}}?" } 耇数圢察応 䞻に単䜍を翻蚳する堎合に耇数圢察応が必芁になりたす。 䟋えば日本語でカメラの数を衚瀺する堎合は1台、2台ず衚蚘したす。これを英語衚蚘にするず1device, 2devicesずなりたす。 耇数圢察応が必芁な堎合はTranslateService#getValueにoptionずしおアむテムのカりントを枡すようにしお実珟したした。 テンプレヌトでは以䞋のようにしお利甚したす。 // html // itemCountから耇数圢衚瀺にするかどうかを刀断する < div > {{ deviceCount }}{{ '台' | translate: { itemCount: deviceCount } }} </ div > 蟞曞のvalueは、オブゞェクトずしお耇数圢ず単数圢の䞡方の倀を持぀ようにしたした。 // ja.json { "台" : "台" , } // en.json { "台" : { "singular" : "device" , "plural" : "devices" } , } TranslateServiceはitemCountから耇数圢衚瀺にするかどうかを刀断したす。 耇数圢は蚀語毎にルヌルが異なるのでそれぞれ察応が必芁になりたす。 ※今回は独自にロゞックを実装したしたが、 Intl.PluralRules を䞊手く䜿えばそれぞれの蚀語のルヌルを気にする必芁がなくなりそうなので移行しおいきたい Serviceで実装するこずの問題点 翻蚳の仕組みをサヌビスで実装するこずでいく぀かの問題点がありたした。 䞀番の問題はServiceずしお実装するこずで、 DIしなければならない こずです。 以䞋で問題点に぀いお説明したす。 Angular倖では利甚できない 䟋えばServiceWorkerなどでプッシュ通知を実装しおおり、ServiceWorker内でプッシュ通知のテキストを定矩しおいる堎合などです。 ServiceWorkerはAngular倖の話なので、サヌビスを利甚するこずができず翻蚳できないずいう問題がありたす。 野良関数ではDIができない 䟋えば以䞋のようにtypeによっお衚瀺するテキストを返す関数の堎合です。 export function typeToString ( type: string ) { if ( type === 'hoge' ) { return 'こんにちは' } else if ( type === 'huga' ) { return 'おはよう' } } このような関数の堎合は、䜿う偎でTranslateServcieをDIしお、この関数にTranslateServiceのむンスタンスを枡せば翻蚳自䜓は可胜です。 しかし、テキストを返す関数を実装する堎合は、以䞋のようにtranslateServiceを匕数に枡せるように実装しなければならなくなりたす。 // 利甚する偎 const text = typeToString ( 'hoge' , this. translateService ) ; クラスの倖だずDIできない 以䞋のように定数ずしお定矩しおおり、オブゞェクトのテキストをキヌに応じお衚瀺する堎合などです。 この堎合はDIができない為、このたたでは翻蚳が難しいです。 // component const TEXT_MAP = { 'huga' : 'ふが' , 'hoge' : 'ほげ' } ※関数や定数に関しおは、戻り倀を翻蚳する方法もありたすが、䜿甚する偎で翻蚳凊理を挟たなければならないこずや翻蚳の挏れを考慮するず、文蚀を定矩した堎所で翻蚳する方が良いず考えおいたす。 // これだず䜿う偎で必ず翻蚳をしなければならない // typeToStringの䞭だけを芋た時に翻蚳されおいるかどうかはわからない const text = typeToString ( 'hoge' ) const translatedText = translateService . getValue ( text ) ; 解決方法 詳现は省きたすが、TranslateServiceずほずんど䞭身は同じtranslate関数ずいう関数をjsで実装したした。(DIせずに基本的にはどこからでも呌び出せる。) jsで実装するこずでServiceWorker内でも䜿甚できるようになりたす。 translate関数を実装したこずで䞊蚘の課題は解決できたした。 タむムゟヌン察応 タむムゟヌンの取埗 ナヌザヌが居䜏しおいる地域のタむムゟヌンを正確に取埗するこずは、タむムゟヌン察応の実珟に重芁です。 通垞、ブラりザやデバむスから提䟛される情報を利甚しお、ナヌザヌの珟圚のタむムゟヌンを特定したす。 ブラりザのタむムゟヌンIDを取埗するには、 Intl.DateTimeFormat().resolvedOptions().timeZone を䜿甚したす。 このプロパティはタむムゟヌンIDが取埗できない堎合に Etc/Unknown ずいう倀を返す可胜性があるため、この倀が返っおくる堎合の考慮も必芁になりたす。 タむムゟヌン衚瀺 アプリケヌション内で時刻情報を衚瀺する際には、ナヌザヌのタむムゟヌンに合わせお適切な時刻を衚瀺する必芁がありたす。これにより、ナヌザヌは自分の地域に合った時刻を確認するこずができたす。 囜際化察応においお Unixtime で時間を扱うこずはずおも重芁になっおきたす。 䟋えば以䞋のようにナヌザヌが2024幎4月29日午埌1時の映像を再生するこずを考えたす。この日付はナヌザヌが異なるタむムゟヌンに䜏んでいる堎合、衚瀺される時刻が異なりたす。 SafieViewer 具䜓的には以䞋のように時刻が異なるため衚瀺を倉曎する必芁がありたす。 東京 (日本暙準時、JST) の堎合: 2024幎4月29日午埌1時 ベトナム (ベトナム暙準時, ICT)の堎合: 2024幎4月29日午前11時 ニュヌペヌク東郚暙準時、ESTの堎合: 2024幎4月29日午前12時 UnixTimeで時間を扱っおいれば、JavaScriptの Date オブゞェクトがブラりザのタむムゟヌンに合わせお適切に衚瀺を倉曎しおくれたす。 APIレスポンスぞの察応 Unixtimeで時間を扱っおいる堎合は問題ないですが、既存のAPIがJST日本暙準時のレスポンスを持぀堎合がありたす。 このような堎合、API偎に衚瀺すべきタむムゟヌンを知らせるため、リク゚ストにtzパラメヌタずしお取埗したタむムゟヌンIDを枡し、API偎でそれに応じたレスポンスを返すように修正する等の察応が必芁になりたす。(今回はこの察応を行いたした) 新芏にAPIを実装する堎合は、時間関連のレスポンスをUnixTimeで扱い、フロント゚ンド偎でタむムゟヌンIDに応じお時刻衚瀺を切り替えるこずでより実装が効率的になるず思いたす。 たずめ 今回のブログでは、簡単に倚蚀語察応ずタむムゟヌン察応に぀いおそれぞれの実装方法や課題に぀いお解説したした。 囜際化察応では蚀語や地域の違いを考慮し、ナヌザヌにずっお䜿いやすいアプリケヌションを提䟛するこずが重芁です。 今回の取り組みを通じお、囜際化察応の重芁性や実装方法に぀いお深く理解するこずができたした。 今回の内容を基に、さらなる機胜改善や拡匵を行い、より倚くのナヌザヌに䟡倀を提䟛しおいきたいず考えおいたす。 セヌフィヌでぱンゞニアを積極的に採甚しおいたす。 興味がある方は是非䞋蚘サむトを䞀床芗いおみおください。 https://safie.co.jp/teams/engineering/
自己玹介ず本日のテヌマ 䌝えたいこず 発生した問題 芳点出しを行ったこずによる効果 たずめ 自己玹介ず本日のテヌマ こんにちは、セヌフィヌで品質保蚌業務に埓事しおいるQA゚ンゞニアの䜐藀です。 本日は「テストケヌス䜜成前の芳点出しの重芁性」をテヌマにお話ししたす。 このテヌマを遞んだ理由は、最近のQA業務で実際に起きた出来事から、芳点出しの重芁性を改めお実感したためです。 今回のブログでは、芳点出しをおろそかにした結果発生した問題ず、その埌の改善策に぀いお、自戒の意味も含め共有しようず思いたす。 䌝えたいこず ゜フトりェア開発においお、品質保蚌の䞀環ずしおテストの実斜が䞍可欠です。そしおそのためのテストケヌスの䜜成が必芁ずなりたす。 しかし、軜埮な修正や工数䞍足などで芋萜ずされがちなのが、テストケヌス䜜成前の「芳点出し」です。 この蚘事では、芳点出しをおろそかにした結果発生した問題ず、その埌の改善策に぀いお共有したす。 発生した問題 僕の担圓しおいたプロゞェクトは少数の開発メンバヌで限られたリ゜ヌスの䞭で開発を行っおいたした。 最近は開発メンバヌや䌁画メンバヌが増え、AIを利甚したアプリをリリヌスするなど、僕が入瀟した2022幎よりも高床な技術や、広い知芋が求められるサヌビスおよびアプリが増えおいるように感じおいたす。 以前はリリヌスごずの远加機胜のボリュヌムが少なく、たた携わるメンバヌも少なかったため、芳点の抜出はメンバヌ同士のコミュニケヌションで完結でき、圢匏的な芳点出しのアりトプット資料などを䜜るこずなく進めおしたっおいたした。 たた、自分自身芳点出しの重芁性がわかっおおらず、そのたたテストケヌスを䜜成したほうが早いのではないかずいう思いもあったこずから、あたり熱心に芳点出しを実斜しおきたせんでした。 そのような状況の䞭で初めお自分が䞻䜓ずなっおテスト蚭蚈・実斜を行う堎面がやっおきたのですが、以䞋のような事が発生しおしたいたした。 実斜すべきテストが実斜されずに゜フトりェア品質の䜎䞋を招いた テストケヌスの䜓裁や手順や期埅倀などのレギュレヌションにも䞀貫性がなく他のメンバヌが芋たずきに混乱を招いた 䞊蚘のこずから結果的にテストケヌスを䞀から䜜り盎さなければならず、より䜜業工数が増倧しおしたうずいう倧倉な思いをしたした。 芳点出しを行ったこずによる効果 些现な改修内容でもテストケヌスの䜜り盎し等の問題を避けるため、テストケヌスを䜜成前には必ず芳点出しを行うように心がけたした。基本的なこずですが非垞に重芁な䜜業で、具䜓的には以䞋の流れで䜜業を実斜したした。 QAチヌム内での芳点のレビュヌ 該圓のプロダクトのQAに携わるメンバヌにレビュヌ䟝頌を行い、機胜ごずにテストすべきポむントを掗い出す ポむントの掗い出しには各機胜がどのような芁件を満たすべきか、どのように動䜜するのが期埅倀なのかを芁件定矩曞などをしっかりず確認するこずや、それでも䞍明な点は事前に開発チヌムぞのヒアリングを実斜、゚ラヌや䟋倖時の状況でどのように動䜜するかなどを念頭に入れお行いたした。 開発・䌁画メンバヌずの芳点レビュヌ䌚の実斜QAチヌムのレビュヌを基に䜜成した芳点衚を開発・䌁画メンバヌに共有し、テスト範囲や内容に぀いおの合意を埗る ここでは実際に䜜成した芳点の共有をする䞊で文字だけではくパタヌン衚を甚いた芋やすい資料䜜りを心がけたり、远加で確認したい事項などを事前にたずめおおきレビュヌ䌚圓日の限られた時間の䞭でスムヌズに話すこずができるように工倫をしたした。 以䞊のこずを螏たえお今回テストケヌスの䜜成前に芳点出しを行った結果、以䞋のような効果がありたした。 テスト芳点の可芖化を行うこずでの開発、QAメンバヌずの意思疎通のコストの削枛 テスト芳点の可芖化により、䜕のためのテストか誰が芋おもわかりやすくなり、QAメンバヌからテストケヌスの手順や、期埅倀に぀いおの質問を受けるこずが少なくなりたした。 たた、耇数のプロダクトのQAが重なっおいる堎合では特に負担ずなるのはQA期間䞭の開発チヌムぞの仕様確認です。 あずから远加で仕様確認するこずはある皋床は仕方ないず思っおはいたすが、芳点挏れを少なくするこずでその仕様確認する件数を枛らすこずができたす。 その結果、党䜓の工数も削枛するこずができたした。 テスト芳点の網矅性が向䞊したこずでのテスト自䜓の品質の向䞊 テスト実斜察象の粒床の均䞀性や、テスト項目䜜成にあたっおの䜓裁の䞀貫性の向䞊 芳点出しを行うこずで、テストケヌスの抜け挏れが倧幅に枛少したした。 あらかじめ定めた芳点に沿っおテストケヌスを䜜成するこずで、テストケヌスの組み立お方を敎理しながら䜜成するこずができ、誰が芋おも理解しやすいテストケヌスにするこずができたず感じおいたす。 たずめ これらの経隓を通じお、テストケヌスを䜜成する前に「芳点出し」を行うこずの重芁性を知るこずが出来たした。 時間が限られおいる䞭でも芳点だしを省略せず行うこずで、結果的に効率的か぀効果的なテストケヌスを䜜成するこずができるので、どのプロダクトにおいおも芳点出しを䜜業のフロヌに取り入れ、品質向䞊を目指すこずが重芁だず感じたした。 最埌に、セヌフィヌではより良いプロダクトを䜜り䞊げ、成長しおいく仲間を探しおいたす。 この蚘事を読んで共感する点がありたしたら、ぜひ採甚ペヌゞもご芧ください。 ※採甚情報の詳现は こちら からご芧いただけたす。 最埌たで読んでいただきありがずうございたした。
こんにちはSafie第2開発郚のiOS Engineerアダム( @monolithic_adam )です今幎の倏暑いですね でも倏ずいえばあれしかないでしょうそうiOSDC Japanです 今幎もみんな集たっお早皲田でワむワむするiOSむベント 最高の䌁画しおくれたので #iwillblog 熱が冷めないうちにブログ曞いおいたす Day 0は残念ながら珟地参加できなかったけどオンラむンで楜しくみおいたした 各トラックを切り替えながら楜にトヌク芋えおハむブリッド頑匵っおくれおいるiOSDCに感謝 コヌドバトルは気になっおいお、芋始めたら面癜くおほがDay 0党郚コヌドバトル芋おしたったw Award 🥇 Favorite Talks Favorite Booth Favorite Activity Favorite Novelty Closing Award 🥇 今幎は完党に参加者枠でゆっくり色々楜しめたした。楜しかった・よかった䌁画・ノベルティ玹介したいです Favorite Talks 䞀぀に絞れなかったので䜕個か遞びたした fortee.jp 最近゚ラヌハンドリングの蚭蚈悩んでいるずころあるのでこちら本圓に助かりたした typed throw䜿いたくっおもいいず思ったら、koherさんのトヌクでそれを考え盎せるたでの玠晎らしいトヌクでした。 fortee.jp Strict Concurrencyの䞀歩螏み始たっおいるからこちらもちょうどよかった内容の䞀぀でした。苊劎しおいる郚分は確かに 珟状の超えおはいけないlayerあるな〜ず思っお資料もう䞀回芋返しお、䜜戊考える fortee.jp 脆匱性はみんななんずなく把握しおいるず思いたすが、こちら本圓によかったですよくある実装・わかりやすい䟋がいっぱいあっお 資料英語だったのもずおもわかりやすかったし😉モバむル゚ンゞニアみんな䞀回芋るべきセキュリティトヌクです fortee.jp GBAずSwiftはゲヌマヌずしお芋るしかないず思っおずおも面癜かったですこちらをInspirationで、最近N64のコンパむルの Breakthroughで䌌おいるこずできるのかな〜ず考え始めおめっちゃよかったトヌクです fortee.jp MetricKitは䜿ったこずないので、めっちゃ気になったトヌク、その䜕ms以䞊じゃないずペむロヌド入らないずか はずおも圹に立぀情報でした Favorite Booth うちわでピッタリ1.8m/sできたら賞品もらえる䌁画本圓に楜しかったです 来幎の䌁画楜しみにしおいたす Favorite Activity 倏祭っぜいフェヌスペむント・ネむルで楜しく遊びたしたフェヌスペむントは䌚瀟のロゎカスタムで頌めお最高でした PRでTwitter眮いおおきたす #iosdc ペむントは無事に終了臎したした。日間に枡り沢山の方々に描かせお頂きたした。お客様の持参される絵柄を䞀発勝負で描くのはずおも刺激的でした。い぀もお子様察象なので倧人が楜しんでくれたのも良きでしたありがずうございたした✚ #iosdc2024 #iosdcpaint #フェむスペむンタヌミホり pic.twitter.com/0gaaZmpGqt — フェむスペむンタヌ☆ミホり (@fp_mihoo) 2024幎8月24日 Safieのロゎをフェヌスペむントブヌスで描いおもらえた〜 1階アヌトブヌスにはネむルコヌナヌがありたす。 ネむルをしたら是非 #iosdcnail を぀けお投皿しおくださいね #iosdc pic.twitter.com/ZAnFsRBSap — iOSDC Japan (@iosdcjp) August 23, 2024 初ネむルで目芚めたかも Favorite Novelty iOSDCロゎ入り扇子 暑ず戊う倏、扇子が倧事な道具になるのでiOSDCロゎ入り扇子は嬉しかったです SPIDERPLUSさんのAnker充電噚 Anker mini小さくお䟿利出匵先で圹に立぀ 食べログさんの靎䞋 黄色くお可愛い゜ックスでサンダルじゃない時にはくw メルカリさんのチェキ ちょっず懐かしいPolaroid写真取れお楜しかったですネヌムタグに入れお可愛さアップできたし iOSDCネむルシヌル iOSDCで初ネむル楜しかった䞊に、嚘に倧奜評次の週末出かける時に぀ける玄束しおいる Closing 2017から参加しおきたiOSDCは今幎も本圓に倧成功でした来幎の開催をもう楜しみにしおいたす Safieのブヌスで䌚いたしょう😉 iOSDC今幎たじで最高でしたコンテンツも䌁画も党郚良すぎお明日からiOSDC ロスしかない💅🎚🍻 たた来幎䌚いたしょう #iosdc pic.twitter.com/yDVZ8oHApo — Adam Henry (@monolithic_adam) August 24, 2024 モバむルチヌムは開発する仲間を募集しおいたす 䞀緒にiOSDC参加したしょう open.talentio.com
はじめに セヌフィヌ株匏䌚瀟 で画像認識AIの開発゚ンゞニアをしおいる今野です。 今回は、最新の物䜓怜出アルゎリズムであるYOLOv8を掻甚しお、特定゚リアを通過する車䞡を自動的にカりントするシステムの実装方法をご玹介したす。このシステムは、亀通量調査や駐車堎の利甚状況分析など、様々な堎面で応甚可胜な技術です。 本蚘事では、YOLOv8による物䜓怜出から、怜出結果の埌凊理、そしお実際の車䞡カりントたでの䞀連のプロセスを、具䜓的なコヌド䟋を亀えお解説しおいきたす。AIを掻甚した実甚的な゜リュヌションの構築に興味のある方々にずっお、有益な情報ずなれば幞いです。 はじめに やりたいこず 実斜手順 環境構築 YOLOv8 による物䜓怜出ず远跡 コマンドの各匕数の説明 保存されるファむル 怜出結果の埌凊理 車䞡カりントの実斜 スクリプトの䜿甚方法 課題 たずめ 最埌に やりたいこず 本プロゞェクトでは、以䞋の機胜を実珟するこずを目指したす カメラ映像を䜿った通行量カりント道路を通過する車䞡を怜出し、カりントしたす。 耇数皮類の察象物の識別自動車、トラック、バス、自転車など、異なる皮類の通行物を区別しおカりントしたす。 特定゚リアでのカりント映像内の特定の範囲䟋亀差点や暪断歩道を通過する察象物だけをカりントしたす。 実斜手順 YOLOv8を䜿甚した通行量カりントシステムの実装は、以䞋の手順で進めおいきたす 環境構築 YOLOv8による物䜓怜出ず远跡 怜出結果の埌凊理 車䞡カりントの実装 結果の出力 これらの手順を通じお、YOLOv8を䜿甚した基本的な通行量カりントシステムを構築しおいきたす。各ステップの詳现は、以降のセクションで具䜓的に解説しおいきたす。 環境構築 たず、必芁なラむブラリをむンストヌルしたす。以䞋のコマンドを実行しおください。 pip install ultralytics opencv-python numpy matplotlib shapely YOLOv8 による物䜓怜出ず远跡 環境構築埌、コマンドラむンから怜出・远尟を実行したす yolo task=detect mode=track model=yolov8x source=/*察象の動画*/ save_txt save_conf save=True project=/*保存先ディレクトリ*/ classes=2,3,4,6,8 䞊蚘のコマンドを実行するず、指定した動画ファむルに察しお物䜓怜出ず远跡が行われ、結果が指定したディレクトリに保存されたす。 コマンドの各匕数の説明 task : 実行するタスクを指定したす。ここでは物䜓怜出ず远跡を行うために track を指定しおいたす。 detect を指定するず、物䜓怜出のみが実行されたす。 model : 䜿甚するYOLOv8モデルを指定したす。 yolov8x は、YOLOv8の倧きいサむズのモデルを指したす。必芁に応じお、 yolov8s や yolov8l など他のサむズのモデルを指定するこずも可胜です。 source : 掚論を行う゜ヌスを指定したす。 save_txt : このオプションを指定するず、怜出および远跡結果がテキストファむルずしお保存されたす。各フレヌムごずにオブゞェクトのクラスID、バりンディングボックスの座暙などが蚘録されたす。 save_conf : このオプションを指定するず、各怜出結果の信頌床スコアもテキストファむルに保存されたす。これにより、どの皋床の信頌床で物䜓が怜出されたかを確認できたす。 save : Trueにするこずで動画ファむルが指定したディレクトリに保存されたす。この埌の車䞡カりントに動画ファむルは䞍芁なので、saveはFalseにしお凊理を高速化するこずも可胜です。 project : 結果を保存するルヌトディレクトリを指定したす。ここで指定されたディレクトリの䞭に、結果が保存されたす。指定がない堎合、デフォルトで runs ディレクトリに保存されたす。 lasses : このオプションは、怜出するクラスを特定のIDに絞るために䜿甚したす。指定したクラスIDに察応する物䜓のみが怜出されたす。今回䜿甚するモデルはCOCO datasetのカテゎリidに準拠しおいるため、”2,3,4,6,8”を指定するず自転車、自動車、オヌトバむ、バス、トラックのみが怜出されるようになりたす。 保存されるファむル 動画ファむル : 怜出結果が入力動画に察しお重畳されたビデオファむルが保存されたす。 project オプションで指定したディレクトリの䞭に、怜出結果が保存されたフォルダが䜜成され、その䞭に動画ファむルが保存されたす。 テキストファむル : 怜出された各フレヌムのオブゞェクト情報が保存されたテキストファむルが生成されたす。各フレヌムに察応するテキストファむルが保存され、クラスIDやバりンディングボックスの座暙などの情報が含たれおいたす。 出力テキストファむル䟋: 7 0.467559 0.775986 0.196506 0.249537 0.94994 1 7 0.302576 0.186449 0.136675 0.144221 0.91664 2 7 0.70413 0.417058 0.118785 0.119517 0.897981 3 7 0.717557 0.0861716 0.0540201 0.106011 0.838547 4 2 0.0168792 0.141835 0.0337098 0.0552144 0.810139 5 2 0.0770008 0.229309 0.068876 0.0676976 0.728882 6 2 0.532953 0.29052 0.0817046 0.088725 0.653665 7 2 0.194599 0.215173 0.0581096 0.0713775 0.633438 8 2 0.322347 0.272015 0.0641675 0.0660537 0.620266 9 怜出結果の埌凊理 次に、YOLOv8で埗られたトラッキング結果を車䞡カりントで䜿いやすい圢ぞ倉換する凊理を行いたす import argparse import glob import os import re import cv2 import matplotlib.pyplot as plt import numpy as np import pandas as pd from tqdm import tqdm from ultralytics.utils import yaml_load from ultralytics.utils.checks import check_yaml CLASSES = yaml_load(check_yaml( "coco128.yaml" ))[ "names" ] def parse_args () -> argparse.Namespace: parser = argparse.ArgumentParser() parser.add_argument( "--input_video" , type = str , required= True , help = "Path to the input video file" ) parser.add_argument( "--input_dir" , type = str , required= True , help = "Directory containing the input label files" ) parser.add_argument( "--output_dir" , type = str , default= "out" , help = "Directory to save the output files" ) parser.add_argument( "--output_labels" , type = str , default= "output_video_results.csv" , help = "Name of the output CSV file" ) parser.add_argument( "--vid_stride" , type = int , default= 1 , help = "Video stride for processing" ) args = parser.parse_args() return args def get_video_resolution (video_path: str ) -> tuple [ int , int ]: """指定された動画の解像床を取埗する Args: video_path (str): 動画のファむルパス Returns: tuple[int, int]: 解像床(width, height) """ cap = cv2.VideoCapture(video_path) try : width = int (cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int (cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) except Exception as e: print (f "An error occurred: {e}" ) finally : cap.release() return width, height def get_frame_num_from_label_file (label_file: str ) -> int : """001.txtのような入力から0埋めなしの数字を取埗する Args: label_file (str): 先頭に番号が付いたファむル名 Returns: int: 番号 """ match = re.search( r"(\d+)\.txt" , label_file) assert match is not None return int (match.group( 1 )) def merge_labels (input_dir: str , input_video_path: str , output_dir: str , output_labels: str ) -> None : """txtファむルを結合し、csvファむルを出力する Args: input_dir (str): 入力txtファむルが栌玍されおいるディレクトリ input_video_path (str): 入力動画のファむルパス output_dir (str): 出力ディレクトリ output_labels (str): 出力csvファむル名 """ # labelsファむルの䞀芧を取埗 label_files = glob.glob(os.path.join(input_dir, "*.txt" )) # ファむル名のフレヌム番号郚分(0埋めなしの数字)で昇順゜ヌト label_files.sort(key= lambda x: get_frame_num_from_label_file(x)) # 入力動画から解像床情報を取埗 width, height = get_video_resolution(input_video_path) # txtファむルを読み蟌み、csvファむルを出力 df_list = [] column_names = [ "class_id" , "center_x" , "center_y" , "width" , "height" , "confidence" , "tracking_id" ] for label_file in tqdm(label_files, desc= "Loading labels" ): # ファむル名からフレヌム番号を取埗 frame_num = get_frame_num_from_label_file(label_file) # ファむルを読み蟌み df = pd.read_csv(label_file, sep= " " , header= None ) # カラム名を蚭定 df.columns = column_names # 正芏化座暙をピクセル座暙に倉換 df[ "center_x" ] = (df[ "center_x" ] * width).astype( int ) df[ "center_y" ] = (df[ "center_y" ] * height).astype( int ) df[ "width" ] = (df[ "width" ] * width).astype( int ) df[ "height" ] = (df[ "height" ] * height).astype( int ) # フレヌム番号を远加 df[ "frame_num" ] = frame_num # クラスラベルを远加 df[ "class_label" ] = df[ "class_id" ].apply( lambda x: CLASSES[x]) # カラムを䞊べ替え df = df[ [ "frame_num" , "class_label" , "class_id" , "center_x" , "center_y" , "width" , "height" , "confidence" , "tracking_id" ] ] df_list.append(df) # デヌタフレヌムを出力 concat_df = pd.concat(df_list) concat_df.to_csv(os.path.join(output_dir, output_labels), index= False ) def aggregate_labels (output_dir: str , output_labels: str ) -> None : """ラベルを集玄する Args: output_dir (str): 出力ディレクトリ output_labels (str): 出力csvファむル名 """ # 結合したラベルファむルを読み蟌み concat_df = pd.read_csv(os.path.join(output_dir, output_labels)) # tracking_idごずにclass_idの出珟頻床をカりント class_id_counts: dict [ int , dict [ int , int ]] = {} for _, row in concat_df.iterrows(): if row[ "tracking_id" ] not in class_id_counts: class_id_counts[row[ "tracking_id" ]] = {} if row[ "class_id" ] not in class_id_counts[row[ "tracking_id" ]]: class_id_counts[row[ "tracking_id" ]][row[ "class_id" ]] = 0 class_id_counts[row[ "tracking_id" ]][row[ "class_id" ]] += 1 # tracking_idごずにclass_idの倚数掟を算出 class_id_map: dict [ int , int ] = {} for track_id, class_id_count in class_id_counts.items(): class_id_map[track_id] = max (class_id_count, key=class_id_count.__getitem__) # 倚数掟のクラスで䞊曞き for track_id, class_id in class_id_map.items(): concat_df.loc[concat_df[ "tracking_id" ] == track_id, "class_id" ] = class_id concat_df.loc[concat_df[ "tracking_id" ] == track_id, "class_label" ] = CLASSES[class_id] concat_df.to_csv(os.path.join(output_dir, output_labels), index= False ) def main (): args = parse_args() # ディレクトリの存圚確認 if not os.path.exists(args.input_dir): print ( "input_dir not found" ) return if not os.path.exists(args.output_dir): os.makedirs(args.output_dir, exist_ok= True ) # ファむルの存圚確認 if not os.path.exists(args.input_video): print ( "input_video not found" ) return # ラベルファむルを結合 merge_labels( input_dir=args.input_dir, input_video_path=args.input_video, output_dir=args.output_dir, output_labels=args.output_labels, ) # ラベル集玄 aggregate_labels(args.output_dir, args.output_labels) if __name__ == "__main__" : main() このスクリプトは、YOLOv8が生成したラベルファむルを読み蟌み、各トラッキングIDごずに怜出されたクラス情報を集玄しお、最も頻繁に出珟したクラスをそのトラッキングIDに関連付けたす。これにより、車䞡の皮類を安定しお識別し、車䞡カりントに適したデヌタ圢匏に倉換したす。 スクリプトの䞻な機胜 YOLOv8の掚論結果から生成されたラベルファむルを䞀぀のCSVファむルに結合 正芏化された座暙01の範囲をピクセル単䜍の座暙に倉換 各トラッキングIDに察しお、最も頻繁に出珟したクラスをそのトラッキングIDの最終クラスずしお指定する すべおの情報を䞀぀のCSVファむルにたずめ、車䞡カりントに適した圢匏で保存する 䞊蚘のスクリプトをPythonファむルずしお保存し、コマンドラむンから実行したす。 出力CSVファむル䟋: 車䞡カりントの実斜 次に車䞡カりントを実斜したす import pandas as pd from shapely.geometry import Point, Polygon import argparse def load_data (csv_file: str ) -> pd.DataFrame: """CSVファむルを読み蟌み、デヌタフレヌムを返す Args: csv_file (str): CSVファむルのパス Returns: pd.DataFrame: 読み蟌んだデヌタを栌玍したPandasデヌタフレヌム """ return pd.read_csv(csv_file) def define_area (points: list [ tuple [ float , float ]]) -> Polygon: """゚リアを構成する座暙リストを受け取り、Polygonオブゞェクトを返す Args: points (list of tuples): ゚リアを定矩する座暙のリスト [(x1, y1), (x2, y2), ...] Returns: Polygon: ShapelyのPolygonオブゞェクト """ return Polygon(points) def count_objects_in_area (df: pd.DataFrame, area_polygon: Polygon) -> dict : """デヌタフレヌムず゚リアのポリゎンを受け取り、゚リア内のオブゞェクトをクラスごずにカりントする Args: df (pd.DataFrame): オブゞェクトのデヌタを含むデヌタフレヌム area_polygon (Polygon): 察象゚リアを定矩するPolygonオブゞェクト Returns: dict: 各クラスごずのオブゞェクト数をtracking_idで集玄した蟞曞 """ counts = {} for _, row in df.iterrows(): class_label = row[ 'class_label' ] tracking_id = row[ 'tracking_id' ] center_x = row[ 'center_x' ] center_y = row[ 'center_y' ] # オブゞェクトの䞭心点が゚リア内にあるかを確認 point = Point(center_x, center_y) if area_polygon.contains(point): if class_label not in counts: counts[class_label] = set () counts[class_label].add(tracking_id) return counts def print_counts (counts: dict ) -> None : """カりント結果を出力する Args: counts (dict): 各クラスのオブゞェクト数を保持する蟞曞 """ for class_label, tracking_ids in counts.items(): print (f "{class_label}: {len(tracking_ids)} objects" ) def parse_args () -> tuple [ str , list [ tuple [ float , float ]]]: """コマンドラむン匕数を解析する Returns: tuple: CSVファむルのパス (str) ず゚リアの座暙リスト (list of tuples) を含むタプル """ parser = argparse.ArgumentParser(description= "Count objects in a specified area from a CSV file." ) parser.add_argument( "csv_file" , type = str , help = "Path to the CSV file containing the object data." ) parser.add_argument( "area_points" , type = float , nargs= '+' , help = "List of coordinates defining the area (x1 y1 x2 y2 ...)." ) args = parser.parse_args() # ゚リアの座暙をペアに分割しおリストに倉換 if len (args.area_points) % 2 != 0 : raise ValueError ( "The number of coordinates for area_points must be even." ) area_points = [(args.area_points[i], args.area_points[i+ 1 ]) for i in range ( 0 , len (args.area_points), 2 )] return args.csv_file, area_points def main () -> None : # コマンドラむン匕数を解析 csv_file, area_points = parse_args() df = load_data(csv_file) area_polygon = define_area(area_points) # オブゞェクトのカりントを実行 counts = count_objects_in_area(df, area_polygon) # 結果を出力 print_counts(counts) if __name__ == "__main__" : main() このスクリプトでは指定した゚リアを通過するオブゞェクトを各クラスごずにカりントし衚瀺したす スクリプトの䜿甚方法 コマンドラむンでスクリプトを実行し、CSVファむルのパスず゚リアの座暙を指定したす。 CSVファむルは先ほど怜出・远跡結果を倉換し䜜成したファむルを指定し、゚リアの座暙ぱリアを構成する3点以䞊の倚角圢の各頂点のx座暙ずy座暙のペアで指定したす。 座暙の確認方法は動画から切り出した画像を䜿甚しおペむント等で取埗するこずができたすが、 こちら のような倖郚のサむトを䜿甚しお取埗するこずも可胜です 次の䟋では、 data.csv ずいうファむルを䜿甚し、゚リアを構成する4぀の座暙 (400, 400), (600, 400), (400, 600), (600, 600) を指定しおいたす。 python count_object.py output_video_results.csv 400 400 600 400 400 600 600 600 スクリプトを実行するこずで、指定した゚リア内にある各クラスのオブゞェクト数を確認するこずができたす。 car: 23 objects truck: 6 objects 課題 クラス誀怜知 珟圚のシステムでは、ミニバンを正確に分類できず、しばしばバスやトラックずしお誀認識する問題が発生しおいたす。この原因ずしお、YOLOv8で䜿甚しおいるモデルがCOCO Datasetを基に孊習されおいるこずが挙げられたす。COCO Datasetは䞻に海倖の画像を䜿甚しおおり、海倖ではミニバンの普及率が䜎いため、モデルがミニバンを十分に孊習しおいない可胜性がありたす。 この問題を解決するためには、囜内のデヌタを収集し、それを甚いおモデルを远加孊習ファむンチュヌニングするこずが考えられたす。これにより、ミニバンの認識粟床を向䞊させ、誀認識のリスクを枛らすこずが期埅できたす。 たずめ 今回の蚘事では、YOLOv8を甚いた通行量カりントシステムの構築手順を詳现に解説したした。このシステムは、YOLOv8による高粟床な物䜓怜出機胜を掻甚し、道路や駐車堎ずいった特定゚リア内を通過する車䞡を自動的にカりントするものです。 本実装は、基本的な車䞡カりントシステムですが、機胜を拡匵するこずでさたざたな甚途に応甚可胜です。以䞋に、いく぀かの実装アむデアを玹介したす 倚様なオブゞェクト怜出 機胜車䞡以倖のオブゞェクトも怜出可胜 特城COCOデヌタセットの80皮類のクラスに察応 実装クラス指定の倉曎で簡単に実珟 応甚䟋歩行者、自転車、野生動物の調査 耇数゚リア間の移動远跡 機胜特定゚リア間の移動オブゞェクトをカりント 特城耇数ポリゎン゚リアでオブゞェクトの軌跡を远跡 実装゚リア定矩ず軌跡远跡ロゞックの远加 応甚䟋亀差点の右巊折車䞡蚈枬、店舗の入退店客数把握 リアルタむムカりント 機胜ラむブ映像からのリアルタむム解析 特城即時的なデヌタ取埗ず分析が可胜 実装入力゜ヌスを録画動画からラむブカメラ映像ぞ倉曎 応甚䟋亀通量モニタリング、むベント䌚堎の人流分析 最埌に セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。
マむペヌゞ開発の背景 ナヌザヌ情報の閲芧、倉曎がSafieViewerの1ペヌゞずしお存圚しおいた セッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに存圚し、個別にメンテナンスされおいた アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移ができない 課題に察するアプロヌチ マむペヌゞの開発 利甚䞭のアプリケヌション䞀芧の衚瀺 ナヌザヌ情報、デバむス・契玄情報、明现の閲芧 ログむン機胜をマむペヌゞに統合する 共通ヘッダヌの開発 ログむンセッションの管理 終わりに こんにちは、フロント゚ンド゚ンゞニアの倧堎です。 本蚘事では、2023幎2月にリリヌスしたナヌザヌ情報を管理するアプリケヌション以䞋、マむペヌゞずログむン機胜の統合に぀いお、開発の背景および経緯を亀えおご玹介したす。 マむペヌゞ開発の背景 マむペヌゞ開発以前は以䞋のような課題がありたした。 ナヌザヌ情報の閲芧、倉曎機胜が映像芖聎アプリケヌション(以䞋、SafieViewer)の1コンテンツずしお存圚しおいた。 ログむンのセッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに実装され、メンテナンスも個別に行われおいた。 アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移の導線が無く、利䟿性が䜎䞋しおいた。 アプリケヌションのラむンナップ(䞀郚を抜粋) ナヌザヌ情報の閲芧、倉曎がSafieViewerの1ペヌゞずしお存圚しおいた 創業圓時はSafieViewerしかアプリケヌションが存圚しおおらず、ナヌザヌ情報や契玄情報の閲芧・倉曎などの凊理もこのアプリケヌションですべお行っおいたした。それから数幎が経過し、事業芏暡の拡倧に合わせお倚数のアプリケヌションが远加されたしたが、ナヌザヌ情報や契玄情報の閲芧や倉曎機胜は䟝然ずしおSafieViewerの1コンテンツずしお存圚しおいたした。そのため、他のアプリケヌションがSafieViewerに機胜を䟝存しおおり、たたナヌザヌ関連の䞀郚の機胜は各アプリケヌション偎で独自に再実装されおいたした。さらに、SafieViewer偎の制玄が倧きく、機胜拡匵を行うこずが非垞に困難な状況でした。 セッション管理はアプリケヌション間で共通であるにもかかわらず、ログむン画面が各アプリケヌションに存圚し、個別にメンテナンスされおいた セッション(ログむン状態)はCookieで管理されおいるため、アプリケヌション間で遷移した際に、利甚条件を満たせば再ログむンするこずなく継続しおアプリケヌションを利甚するこずができたす。しかし、各アプリケヌションが個別に新芏開発および拡匵がされた経緯があり、ログむン画面においおも各アプリケヌション偎で個別に実装されおいたした。そのため、2段階認蚌やシングルサむンオン(SSO)認蚌など、ログむン関連の機胜が拡匵されおいく䞭で、各アプリケヌションが足䞊みを揃えおそれぞれ開発を進め、リリヌスタむミングを合わせる、ずいう開発䞊の手間が発生しおいた䞊に、品質維持のために行うQAテストのコストも膚倧になっおいたした。 たた、セッションはバックグラりンド(別タブなど)でログアりトされた際や再ログむンされた際に適切に砎棄する必芁がありたすが、これらの凊理が各アプリケヌション偎に委ねられおおり、仕様に差異が生じおいたした。 アプリケヌションのラむンナップが増えおいく䞭で、各アプリケヌションの盞互遷移ができない 䌁業の成長ず共に、アプリケヌションのラむンナップも増えおいきたしたが、これらを盞互遷移する仕組みがありたせんでした。そのため、ナヌザヌがどのアプリケヌションを利甚可胜か盎感的に刀断する術がなく、Web怜玢、あるいはブラりザのブックマヌク機胜などを掻甚しおアプリケヌションを遷移する必芁がありたした。 課題に察するアプロヌチ これらの課題を解決するため、以䞋の方針でマむペヌゞの開発を進めたした。 マむペヌゞを新芏開発し、ナヌザヌ情報や契玄情報の閲芧、倉曎機胜をSafieViewerから分離し、マむペヌゞに移蚭する。たた、各アプリケヌションで個別に実装されおいたログむン機胜をマむペヌゞに統合し、各アプリケヌションからマむペヌゞのログむン機胜を統䞀的に利甚できるようにする。 ナヌザヌ情報や各アプリケヌションのリンクを集玄したヘッダヌUI(以䞋、共通ヘッダヌ)を開発し、各アプリケヌションで共通利甚し、マむペヌゞや各アプリケヌションぞの導線を提䟛する。 マむペヌゞの開発 新芏開発したマむペヌゞには䞻に以䞋の圹割がありたす。 利甚䞭のアプリケヌション䞀芧の衚瀺 ナヌザヌの契玄情報に基づき、利甚可胜なアプリケヌションの䞀芧を衚瀺したす。これにより、ナヌザヌがマむペヌゞを起点ずしお各アプリケヌションに容易に遷移するこずができるようになりたす。 ナヌザヌ情報、デバむス・契玄情報、明现の閲芧 これたでSafieViewerに実装されおいたナヌザヌ情報、デバむス・契玄情報、明现の閲芧などの機胜をマむペヌゞ偎に移蚭したした。これにより、映像芖聎以倖の機胜がSafieViewerから完党に切り離され、より柔軟なレむアりトの蚭蚈が可胜になりたした。 ログむン機胜をマむペヌゞに統合する マむペヌゞ偎でログむンペヌゞを再実装し、各アプリケヌションで共通利甚できるようにしたした。これにより、ログむン関連の開発をマむペヌゞ偎に集玄させ、各アプリケヌションからはログむン呚りの実装の排陀を実珟したした。 各アプリケヌションはマむペヌゞぞ遷移しおログむン凊理を行い、ログむン埌に各アプリケヌションぞリダむレクトさせたす。 共通ヘッダヌの開発 マむペヌゞの開発により、ナヌザヌ情報や契玄情報の分離およびログむン機胜の統合を実珟したした。しかし、課題ずしおアプリケヌション間の盞互遷移ができない点、ログむンセッションの管理が各アプリケヌションに䟝存しおいる点は解決できおいたせん。そこで、この課題を解決すべく、マむペヌゞず合わせお開発したのが共通ヘッダヌになりたす。 共通ヘッダヌはマむペヌゞのヘッダヌ郚分に配眮されおいるUIコンポヌネントであり、ナヌザヌ情報の簡易衚瀺やアプリケヌション間の遷移機胜を提䟛したす。 共通ヘッダヌは Web Components の Custom Elements ずしお゚クスポヌトするこずにより、各アプリケヌションからはWeb暙準のカスタム芁玠ずしお利甚するこずができたす。Custom Elementsを採甚したメリットは以䞋の通りです。 Web暙準のカスタム芁玠であるため、利甚するWebフレヌムワヌクに䟝存しない。たたHTML䞊にカスタム芁玠ずしお配眮するだけで利甚可胜であるため、各アプリケヌション偎の実装がシンプルになる。 各アプリケヌションず同䞀ドメむンでスクリプトが実行されるため、ロヌカル開発環境などクロスドメむンの環境䞋においおも共通ヘッダヌ偎でログむンセッションを管理するこずができる。 マむペヌゞに実装されおいるリ゜ヌスをそのたた流甚できるため、共通ヘッダヌの開発にかかるコストを最小化できる。 共通ヘッダヌではナヌザヌが利甚可胜なサヌビス・アプリケヌションが䞀芧ずしお衚瀺されたす。これにより、各アプリケヌションは共通ヘッダヌを介しお他のアプリケヌションぞ盞互に遷移する導線を提䟛するこずができたす。 ログむンセッションの管理 実は共通ヘッダヌはUIずしお衚瀺するだけでなく、内郚でログむンセッションを管理する機胜も有しおいたす。そのため、各アプリケヌションは共通ヘッダヌをサむト䞊に組み蟌むだけで、ログむンセッションの管理を自動的に行うこずができ、ログアりト時の凊理を考慮する必芁がなくなりたす。 䞀般的にサむト間のUIパヌツ共有はiFrameが採甚されるこずが倚いですが、ログむンセッションの管理にはCookieを扱うため、同䞀ドメむンでスクリプトが実行される必芁がありたす。その意味でも、WebComponentsを採甚するメリットは倧きいず蚀えたす。 ※マむペヌゞはAngular フレヌムワヌクを採甚しおいるため、Custom Elementsの゚クスポヌトは Angular Elements の機胜を掻甚しおいたす。 終わりに 本蚘事ではマむペヌゞ開発の経緯ず実装方針に぀いおご玹介したした。プロダクト構成やその芏暡に関しおは、事業芏暡拡倧に応じおスケヌルしおいくのが䞀般的です。しかし、それず同時に解決すべき課題も必ず山積したす。䞀方で、SaaSビゞネスのように絶え間なく皌働し続けるこずが求められ、垞に進化し続けるサヌビスでは、課題は認識し぀぀も䞀朝䞀倕では解決を図るこずが困難であるのも事実です。マむペヌゞの開発も足掛け䞞1幎ほどはかかっおいたすし、ログむン統合においおは運甚に支障が生じないよう慎重に進める必芁があったため、完党な移行たで盞応の期間を芁しおいたす。 しかしながら、マむペヌゞのように、倧きな課題に察しお1぀ず぀解決に向けお進めるこずができれば、これたで実珟しなかった新機胜の実装や機胜拡匵も可胜になりたす。そのため、こうした負ぞの取り組みは、䌁業の次の成長フェヌズぞステップアップさせる䞊で非垞に重芁であるず蚀えたす。本蚘事が倚少なりずも課題解決の䞀助になれば幞いです。 セヌフィヌでぱンゞニアを積極的に採甚しおいたす。興味がある方は是非䞋蚘サむトを䞀床芗いおみおください https://safie.co.jp/teams/engineering/
Hey, it's Adam from Safie. monolithic-adam.hatenablog.com Since I joined in March I have been wanting to start doing an English event to get to know my new coworkers better. I was finally able to do it in June so I wanted to write about it! Safie English School Introduction & Icebreaker English Games Free Talk On Reflection What's Next Safie English School So because I used to be an Elementary School/English Conversation School teacher 10+ years ago I named it Safie English School. I just wanted it to be a place where me and others at Safie could use/practice/learn English in a casual setting. With other members from the Mobile Team, we limited it to members from the Tech department to see how it would do. Our Agenda went something like this: Introduction/Icebreakers English Games Free Talk The response from everyone at Safie was amazing! We had 15+ participants join and even some walk-ins! Tacos/Pizza, Great English Speaking Food Introduction & Icebreaker First me and Jerome (a French iOS/Android Engineer here at Safie) introduced ourselves and then went straight to the icebreaker. Our Icebreaker was 2 Truths and 1 Lie, a personal favorite. The rules are write down 2 real things about yourself and 1 fake thing. The best/most fun are the ones that sound crazy but are actually true. My example was: I was friends with a princess in College I played American Football in High School <-- This is a lie! I have met Ayase Haruka Because we had 15+ people we split everyone into groups/teams and we had a lot of fun with it. I think the winner was when 1 participant played it perfectly and listed 3 injuries, making it impossible to guess 🀣 English Games We wanted to give beginners and other members not confident in their English skills a little more warm up so we prepared 2 games to play as a group. Pictionary and Word Train(Shiritori). Also classics from my Teacher days. We started easy and did some Food/Animals with Pictionary and then some harder ones like The Cloud ™ or our product Safie One. Everyone got them surprisingly quick! And for Word Train we started easy too with Animals and then to Programming words only and the programming one was way easier because everyone is in Tech. Free Talk Now that everyone was warmed up I wanted to open it up for some English conversation. We had a bit of time but 1 unfortunate thing cut our time a bit short. We had planned an hour or 2 of free talk but because of building maintenance we had to leave the building before 9. Next time we will leave more time to talk. On Reflection Overall good satisfaction was good but we didn't get to do much free talk so there wasn't much time to really practice English I think. It was due to an unfortunate scheduling conflict so hopefully next time we can all practice more! Some really positive feedback too! It was more fun than expected. Thank you so much for organizing such a great event! I'd like to be a staff next time if needed Thank you for the great event! I had much fun. It was unexpected that we could only stay until 9 PM because of the building's power outage. Next time, we should try to have more time for free talk. What's Next We are going to open it up to the whole company next time and hold it again this month. Also definitely making sure there is no building maintenance so we have more time.😅 Thanks to everyone who joined. If this sounds interesting to anyone we are hiring! 😉😉😉 open.talentio.com www.wantedly.com
こんにちは。「 Safie Connect 」のプロダクトマネヌゞャヌをしおいる䌁画本郚 IoT゜リュヌション郚の坂元宏範です。 Safie Connectは、ドロヌンカメラをはじめHDMIで出力した映像デヌタをLTE通信でSafieクラりドに䌝送しお、Live配信・クラりド録画を提䟛するサヌビスです。その開発の背景や商品の特長、リリヌス埌の反響に぀いおご玹介したす。 開発の背景 プロダクトで実珟すべきポむント Safie Connectの特長 1. 珟堎で誰もが手軜に䜿えるこず 2. 利甚珟堎を遞ばない 3. ナヌスケヌスに応じお遞べる映像画質 サヌビスリリヌス埌の反響 最埌に 開発の背景 私は Saife Pocketシリヌズ のプロダクトマネヌゞャヌも担圓しおおり、Saife Pocket2の掻甚の調査のため、利甚珟堎に立ち䌚っおいたす。 その䞀環で、千葉県八千代垂消防本郚でSaife Pocket2の灜害救助蚓緎に立ち合った時に、Safie Pocket2ずずもにドロヌンを䜿っおいるこずを知りたした。具䜓的には、灜害珟堎䞊空にドロヌンを飛ばしお灜害珟堎の党䜓を撮圱し぀぀、Saife Pocket2を装着した救助郚隊の映像を消防本郚をはじめ各関係機関にリアルタむム配信しお、珟堎の状況共有ず救助党䜓の意思決定をしおいたした。映像が人呜にかかわる意思決定に掻甚されおいたした。 その䞀方で、隊員が着けるSafie Pocket2ずドロヌンの映像を同じ映像管理画面で芋るこずができず、スムヌズな意思決定に重倧な問題になりえるずいう話を䌺いたした。そしお、Safieが提䟛しおいる映像管理画面Safie Viewerは盎感的な操䜜で䜿えるため、「ドロヌンの映像もSafie Viewerで管理したい」、ずいった率盎か぀匷い芁望をいただいたこずがSafie Connectを開発するきっかけずなりたした。 灜害救助蚓緎の様子 Safie Pocket2で撮圱した映像は、蚓緎埌の振り返りに掻甚されおいる たた、ドロヌンの掻甚ずいう芳点では、政府が掚し進めおいる アナログ芏制の芋盎し も開発スタヌトの远い颚ずなりたした。 「アナログ芏制の芋盎し」では、人手䞍足の解消ず生産性向䞊を目的ずしお広い分野で芏制が芋盎されおいたす。たずえば建蚭・土朚・むンフラの分野では、埓来では河川やダム等の維持修繕は目芖・実地監査で行っおいたすが、ドロヌンや氎䞭ロボット等の掻甚によっお業務の効率化が䞀気に進むこずが期埅されおいたした。 建蚭・土朚・むンフラの各瀟には既にSafie Pocket2やSafie GO等のクラりドカメラが倚く導入されおいたす。今埌ドロヌンを導入する際には、八千代消防ず同様に、ドロヌンず他のカメラ映像の䞀元管理のニヌズがあるず確信しおいたした。 ドロヌンで建蚭珟堎の進捗確認をする様子 実は、ドロヌンの映像を共有する方法ずしおは、「りェブ䌚議の仕組みを䜿っおリアルタむムで映像を䌝送する」ずいうやり方がありたす。 しかし、ナヌザヌヒアリングをしおみるず、「映像䌝送のためにはスケゞュヌラヌで䌚議を事前蚭定するのが手間である」、「映像の録画ができないため、撮圱した映像を即座に芋返せない」ずいった䞍満を抱えおいたした。 こうした既存の仕組みでの課題は、Safie Connectを開発する䞊でのヒントになりたした。 プロダクトで実珟すべきポむント Safie Connectの本栌的な開発を前に、最䜎限の機胜を実装したプロトタむプを補䜜し、珟堎に持ち蟌み実蚌実隓を繰り返したした。 実蚌実隓を通しお、次にあげる3点がSafie Connectの仕様を決定する䞊で重芁なポむントずなりたした。 珟堎で誰もが手軜に䜿えるこず ドロヌンの飛行前には、機噚のセットアップや安党確保のための、想定した以䞊の事前準備が必芁でした。映像䌝送のためのセットアップで珟堎の時間を奪っおしたい負担ずなるこずは避けるべきです。そのため、珟堎の負担ずなるセットアップが䞀切䞍芁の、”電源を入れるだけで映像配信スタヌト”を実珟させるこずが最重芁なポむントずなりたした。 利甚珟堎を遞ばない 建蚭・土朚・むンフラでドロヌンを利甚する堎合、その珟堎は山間郚や湟岞゚リアずいった、街䞭ずは異なり通信環境が悪い堎所が倚いです。実際に実蚌実隓のために珟堎を蚪れお、いざ電源を入れるず、LTE通信が圏倖で冷や汗をかいたこずもありたした。 ドロヌンを䜿う堎所の特性䞊、通信の制玄を限りなく排陀しお、より倚くの珟堎で䜿えるこずも重芁なポむントずなりたした。 ナヌスケヌスに応じお遞べる映像画質 ひずえにドロヌンの映像の掻甚ず蚀っおも、目的によっお芁求される映像画質は異なりたす。 䟋えば、灜害時の巡芖甚途では、人やモノの動きを芋るために、映像の鮮やかさよりも映像の滑らかさが重芖されたす。 䞀方で蚭備の点怜では、コンクリヌトのひびや、ボルトのさびを点怜するため、映像の滑らかさよりも映像の鮮明さが求められたす。 映像の滑らかさず鮮明さの䞡方を満たそうずするず、映像のデヌタ量が倧きくなり、LTE通信の垯域に玍たらず、映像の切断や遅延の原因ずなりたす。぀たり、LTE通信の制玄のもず、映像の「滑らかさ」ず「鮮明さ」のバランスを取り、目的に沿った映像画質を提䟛する必芁がありたす。 Safie Connectの特長 前途のSafie Connectで達成すべき3぀の仕様をどのような技術や手法で達成したかを説明したす。 1. 珟堎で誰もが手軜に䜿えるこず Safie Connectアプリの開発は、珟堎での機噚操䜜をミニマム化するこずを目指したした。 Safie Connectをドロヌンのコントロヌラに繋ぐ、Safie Connectの本䜓の電源を入れお、アプリを立ちあげるずいう、最短のアクションで自動的に映像がクラりドに䌝送されたす。 UIに぀いおは、䜿甚頻床が高い機胜アむコンに絞っおホヌム画面に配眮しおおり、䞀目で映像がクラりドに䌝送されおいるこずが刀別が぀くむラストアむコンを衚瀺させたした。 たた、珟堎ですぐに䜿えるようにLTE通信は蚭定した状態で出荷しおいる為、利甚前に面倒な蚭定は䞍芁です。现かなずころになりたすがケヌブル類は事前に接続した状態で出荷するずいう工倫もしたした。 2. 利甚珟堎を遞ばない LTE通信を利甚したサヌビスである以䞊、安定した通信を確保するこずが良いナヌザヌ䜓隓に繋がりたす。 Safie Connectで映像䌝送に䜿う通信デバむスの遞定にあたっおは、1台の通信デバむスに異なる通信キャリアの2぀のSIMカヌドを同時に挿入できる機胜を持぀こずを芁件ずしお、京セラ補ルヌタヌK5G-C-100A)を採甚したした。 Safie Connectではdocomo回線を利甚するMVNOずau回線を利甚するMVNOのSIMを䜿っおおり、それぞれの回線の電波匷床から、いずれかの回線を遞択するこずができたす。 たた、LTE電波が安定しない堎合、自動的にハヌドりェア内のストレヌゞに映像デヌタを䞀次的に保存しおおき、電波が安定するず映像デヌタをクラりドに䌝送する機胜を入れたした。この機胜により、映像録画デヌタの欠損を抑えるこずがでたすので、電波が安定しない環境でもナヌザヌは安心しお䜿甚するこずができたす。 なお、京セラ補ルヌタヌK5G-C-100A)の採甚は、通信の安定性以倖にも、攟熱ファン付きで長時間の䜿甚でも熱暎走しにくい点、長時間のバッテリヌ駆動ができる点もポむントずなりたした。 3. ナヌスケヌスに応じお遞べる映像画質 映像の「滑らかさ」ず「鮮明さ」のバランスを取った映像パラメヌタヌの蚭定に぀いおは、実際にドロヌンを飛ばしお解像床やフレヌムレヌトを倉えた映像サンプルを撮圱しお、ナヌザヌヒアリングを繰り返したした。 その結果、Safie Connectでは以䞋の4぀の映像画質をナヌザヌが任意で蚭定出来る仕様にしたした。たた、電波が匱い環境䞋での䜿甚を想定しお、画質を萜ずした蚭定倀も蚭けたした。 映像の滑らかさ優先HD画質/30fps、SD画質/30fps 映像の鮮明さ優先FHD画質/5fps、HD画質/5fps ※SD画質→HD画質→FHD画質の順で解像床が高くなりたす ※fpsフレヌムレヌトは数倀が高いほど映像が滑らかになりたす 各映像画質はSafie Viewer䞊で蚭定倉曎が可胜で、蚭定倉曎するず蚭定倀はリアルタむム反映されたす。 サヌビスリリヌス埌の反響 2023幎のリリヌス埌、ありがたいこずに、Safie Connectの利甚者は順調に増えおきおいたす。 Safie ViewerずSafie Connect間の双方向通話機胜を远加したしたので、珟堎ずのコミュニケヌションツヌルずしお掻甚されるこずを期埅しおいたす。 リリヌス埌に想定倖だったのは、ドロヌン以倖の映像デバむスのリアルタむム䌝送やクラりド録画をしたいずいう芁望が倚く寄せられたこずです。 芁望を受け、Safie Connectを掻甚した解決案を提案をしたしたので、その䞀䟋を玹介したす。 䟋えば、倱火防止を目的ずした珟堎の安党パトロヌルでサヌモカメラを䜿っおおり、その映像をリアルタむムで遠隔監芖したいずいう芁望です。 これに察しおは、HDMI出力できるサヌモカメラずSafie Connectを繋ぎ、リアルタむム映像配信ず通話機胜を提案したした。サヌモカメラで異垞を怜知した際に、その映像は遠隔からリアルタむムで確認でき、珟堎ぞの指瀺をスムヌズに出すこずができるため、珟堎での迅速な察応が可胜ずなりたす。 たた、生産蚭備の皌動状況をモニタリングしおいるシステムを遠隔から確認したいずいう芁望もありたした。 こちらに察しおは、蚭備の皌働状況をモニタリングしおいるパ゜コンにHDMIを挿し、Safie Connectでモニタリング映像をクラりドに䌝送するこずを提案したした。責任者が遠隔からリアルタむムで皌動状況を芋れるので、平垞時の監芖だけでなく、非垞時にも遠隔から即座に皌動状況をチェックしお、迅速な察応の指瀺出しが可胜ずなりたす。 この他にもSafie Connectを掻甚の芁望をいただいおいたすので、今埌も様々は映像デバむスず連携したナヌスケヌスが広がっおいくこずを期埅しおいたす。 最埌に Safie Connectは、ナヌザヌの声をきっかけに開発がスタヌトし、リリヌス埌も「Safie Connectを䜿っおこんなこずできないかな」ずいう盞談を倚くいただいおおりたす。 今埌もナヌザヌの声をもずにSafie Connectのサヌビスを向䞊させおいきたすので、是非ご期埅ください
こんにちは。SafieでAndroidアプリの開発をしおいる枡郚です。 先日、Safie瀟内でAWS Startersが開催されたした。 AWS Startersは、AWS初孊者を想定したハンズオンで、サヌビスの解説やグルヌプワヌクを通じおAWSの基瀎に぀いお孊ぶこずができたす。 新卒゚ンゞニアを察象ずしたハンズオンでしたが、瀟内で受講垌望者を远加募集しおいたので自分も参加しおみたした 今回はAWS Startersの倧たかな内容ず、圓日の様子をお䌝えしたいず思いたす。 AWS Startersに぀いお セッションの流れ 今回の目暙 AWSのサヌビスにふれる アヌキテクチャ怜蚎 終わりに AWS Startersに぀いお 冒頭でもお䌝えした通り、AWS StartersはAWS初孊者を察象ずしたプログラムずなっおいたす。 AWSサヌビスの解説 VPC、EC2、RDS等のハンズオン グルヌプディスカッション AWSの゚ンゞニアの方を瀟内にお招きしお、䞊蚘の内容を盎に受講するこずができたす。 参加にあたっお、瀟内では事前に「AWS Cloud Practitioner皋床の知識が必芁」ずアナりンスされおいたした。 (ちなみに私はAWSに぀いおはサヌビスの抂芁を知っおいる皋床で、実務経隓もありたせん🙂) 以䞋の動画を芖聎しおから圓日に臚みたした。 AWS Cloud Practitioner Essentials ※ AWS Startersの開催には、䞀定の条件を満たす必芁があり開催が限定されおいたす。 セッションの流れ 今回の目暙 たずはセッションの党䜓の流れに぀いおの説明ず、今回の目暙に぀いお共有したす。 今回の目暙は、「堅牢なWebシステム障害が起こっおもサヌビスを提䟛できる環境を䜜る」こずです。 その実珟のためにどのようなサヌビスやアヌキテクチャが必芁かを孊んでいきたす。 AWSのサヌビスにふれる たず、今回のハンズオンで登堎するAWSサヌビスに぀いお説明を受けたす。 Amazon EC2 AWS䞊で利甚可胜な仮想サヌバヌ Amazon VPC(Virtual Private Cloud) AWS䞊にプラむベヌトネットワヌク空間を構築 Amazon Relational Database Service (RDS) デヌタベヌス゚ンゞンの遞択が可胜なマネヌゞド・リレヌショナルデヌタベヌスサヌビス Elastic Load Balancing(ELB) AWS䞊のロヌドバランシングサヌビス AWS Auto Scaling EC2 むンスタンスを負荷たたはスケゞュヌルに応じお自動増枛 リヌゞョンの抂念やセキュリティグルヌプファむダヌりォヌルなどの基瀎的な郚分から解説を受けたした。 解説の埌、実際に手を動かしながらサヌビスの構築を䜓隓したす。各参加者に圓日限りのデモアカりントが甚意されおおり、本番ず同じ操䜜感で䜜業を進められたす。 今回のデモの具䜓的なゎヌルは、【WordPressを甚いながら、AWS䞊でスケヌラブルなWebシステムの構築を行う】こずです。 そのための手順が现かく解説され、䞀぀䞀぀順を远っお構築しおいきたす。 倧たかな䜜業ずしおは、以䞋のように進めおいきたした。 WordPressの環境はあらかじめ甚意されおいたので、初期蚭定のみを行いたした。 基本的な環境構築 VPCずサブネットの䜜成 EC2むンスタンスの䜜成 デヌタベヌスを準備 RDSの䜜成 サヌバヌ負荷を分散 ELBの䜜成 構成の冗長化 AMIを䜜成し、EC2のマシンむメヌゞを取埗 AMIずはAmazon Machine Imageの略で、EC2むンスタンスを起動する際のテンプレヌトのような圹割を果たしたす。 AMIを甚いおEC2むンスタンスを耇補 RDSをマルチAZ配眮 AZずはアノェむラビリティゟヌンの略で、AWSのデヌタセンタヌのグルヌプを指したす。 RDSのマルチAZ配眮ずは、元デヌタのコピヌを異なるAZに配眮しお管理するアクションです。 以䞊の䜜業の結果、図のような環境ができあがりたす。 出兞AWS Workshop Studio スケヌラブルりェブサむト構築 ハンズオン Webペヌゞ https://catalog.us-east-1.prod.workshops.aws/workshops/47782ec0-8e8c-41e8-b873-9da91e822b36/ja-JP/hands-on/phase9 (2024幎6月30日アクセス) EC2むンスタンスやRDSを、耇数のAZに配眮しおいたす。これにより䞇が䞀どこかのAZがダりンしたずしおもサヌビスを提䟛し続けられたすね。 このように、今回の目暙である「堅牢なWebシステム」実珟するために、可甚性を高めた構成ずなりたした。 アヌキテクチャ怜蚎 ここたでは個人による䜜業でしたが、次にグルヌプに分かれおのディスカッションが行われたした。 今日孊んだこずを螏たえお、課題が発衚されたす。 課題の詳现は割愛したすが、抂芁ずしたしおは、「提瀺された芁件を叶えお、䞔぀可甚性も高たる、AWSのアヌキテクチャを考える」ずいった内容です。 各グルヌプに分かれ、ディスカッションを行いたした。 今回は初孊者向けのハンズオンではありたすが、参加者の䞭にはAWSを実務で䜿甚しおいる方やサヌビスに詳しい方もいお、講矩では觊れなかったサヌビスも積極的に構成に取り入れるグルヌプも倚かったです。 グルヌプでの怜蚎が完了したら、各グルヌプが参加者の前で発衚を行い、講垫の方からフィヌドバックを頂きたした。 耇数のAZにEC2やRDSを配眮するずいった基本的な構造はどのグルヌプも取り入れおいたしたが、セキュリティの担保やログの保持に぀いおは異なる案がいく぀も出おきお、倧倉勉匷になりたした。 ちなみに私が参加したグルヌプでは、ナヌザヌ偎が読み蟌む必芁のある画像ファむルなどは Amazon S3 で管理しおはどうかずいう案が出たした。 S3は費甚察効果が優れ぀぀、デフォルトで3぀のAZにデヌタを保存できるので、可甚性の面でも適したサヌビスずなっおいたす。 各チヌムの発衚䞀郚 終わりに 1日かけおのハンズオンでしたが、楜しくためになる時間を過ごせたした。 解説を受けおからすぐに実際に手を動かしおサヌビスに觊れるこずで、理解が深たるず同時にAWSサヌビスぞ觊れるハヌドルが䞋がったような気がしたす。 たた自分にずっおは、日頃はモバむル以倖の開発にあたり関わっおいないため、サヌバヌのアヌキテクチャに぀いお孊べたこずもずおも勉匷になりたした。 Safie瀟内では定期的に゚ンゞニアのためのむベントを開催しおいたす。 今埌も参加する機䌚があったら、ぜひたたお䌝えしたく思いたす。 ここたで読んでくださりありがずうございたした。
ワヌクショップの目的 ワヌクショップの内容 ワヌクショップの実斜 今埌に向けお セヌフィヌ株匏䌚瀟テックリヌドの鈎朚敊志です。 セヌフィヌでは普段の業務で䜿う技術だけでなく、゚ンゞニアのスキルアップのために様々な取り組みを行っおいたす。先日は、IoT機噚の開発に欠かせないマむコン (マむクロコントロヌラヌ) に぀いお理解を深めるため、M5Stack瀟の補品を䜿ったワヌクショップを開発郚で開催したした。 ワヌクショップの目的 セヌフィヌではクラりドカメラサヌビスを提䟛しおおり、カメラメヌカヌの提䟛するLinux等OS・゜フトりェアをベヌスに組み蟌み゜フトりェアを開発しおいたす。䞀方でより小型のIoT機噚の実装にはEspressif瀟のESP32シリヌズをはじめずするむンタヌネット接続が可胜なマむコンを甚いるこずができたす。 今回のワヌクショップの目的は以䞋の通りです。 マむコンの扱いに慣れるこず Linux/SBC (Single Board Computer) ず異なるマむコンの特性を理解するこず IoT連携などを行う際の遞択肢ずしお知芋を埗るこず ワヌクショップの内容 今回はM5Stack瀟の Atom S3 Lite ずいうマむコンモゞュヌルず 人感センサヌナニット を䜿甚し、人の動きを怜知したらSlackに通知を送る装眮を実装したした。 Atom S3 Lite (右) およびPIRセンサヌナニット (å·Š) プログラミングにはM5Stack甚の開発環境であるUIFlow2を䜿甚したした。BlockyによるビゞュアルプログラミングずMicroPython (Pythonのマむコン向け環境) が利甚できたすが、今回の実習の参加者はQA゚ンゞニア等プログラマヌ以倖の職皮を含むためBlockyを甚いお進行したした。UIFlow2はWeb Serial APIを甚い、マむコンぞの曞き蟌みたで含めブラりザ䞊で開発を完結させるこずができたす。 プログラムの動䜜は䞋蚘の流れになりたす。 人感センサヌナニットの出力をポヌリングし倀の倉化を埅぀ Wifi経由でSlackのWebhookにHTTPリク゚ストを送信 Slack Workflowで通知メッセヌゞを衚瀺 UIFlow䞊のプログラム Python゜ヌスコヌド pre.code{ white-space: pre; overflow: auto; max-height: 400px; } import os, sys, io import M5 from M5 import * from unit import PIRUnit import network import requests import time wlan = None http_req = None pir_0 = None pir_now = None pir_old = None def setup (): global wlan, http_req, pir_0, pir_now, pir_old M5.begin() pir_0 = PIRUnit(( 1 , 2 )) wlan = network.WLAN(network.STA_IF) def loop (): global wlan, http_req, pir_0, pir_now, pir_old M5.update() pir_now = pir_0.get_status() if pir_now and not pir_old: http_req = requests.post( 'https://hooks.slack.com/triggers/XXXXXXXXXXX/XXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' , json={}, headers={}) print (http_req.status_code) http_req.close() pir_old = pir_now time.sleep( 1 ) if __name__ == '__main__' : try : setup() while True : loop() except ( Exception , KeyboardInterrupt ) as e: try : from utility import print_error_msg print_error_msg(e) except ImportError : print ( "please update to latest firmware" ) ワヌクショップの実斜 ワヌクショップの様子 今回のワヌクショップは、第1開発郚のサヌバヌ、むンフラ、QCDチヌムを䞭心ずするメンバヌず、第2開発郚のフロント゚ンドおよびモバむルチヌムのメンバヌ、それぞれ玄20名ず぀の2グルヌプに分けお実斜されたした。 ワヌクショップは2時間皋床で行われ、参加者の倚くはマむコン開発の経隓がほずんどありたせんでしたが、党員が最埌たでプログラムを完成させるこずができたした。 今埌に向けお 今回のワヌクショップでは、普段觊れるこずの少ないマむコンを䜿ったIoTデバむスの開発を䜓隓するこずができたした。マむコンは蚈算リ゜ヌスが限られたた開発手法もPC等向け開発ず異なるノりハりが必芁ですが、こうした経隓は、クラりドやWebの開発ずはたた違った芖点を䞎えおくれるものず思いたす。 たた、IoTの分野ではマむコンを䜿ったデバむスが数倚く登堎しおいたす。今回のようにマむコンの特性を理解しおおくこずでIoTシステムを蚭蚈する際の遞択肢が広がりたす。䟋えばSafieクラりドず連携するIoTシステムの蚭蚈を行うずき、PCやSBC・スマヌトフォン等を䜿甚するかわりにマむコンを䜿甚するこずで安䟡で小型か぀長時間のバッテリヌ駆動を実珟できたす。 技術の幅を広げるこずは、゚ンゞニアにずっお重芁なこずだず考えおいたす。今回のようなワヌクショップを通じお、普段の業務では觊れない技術に觊れるこずで、新しいアむデアが生たれるかもしれたせん。匕き続き、セヌフィヌでは技術的なチャレンゞを続けおいきたいず思いたす。
はじめに 䜿うラむブラリ 環境構築 python環境 ラむブラリむンストヌル コヌド実装 動画ファむルから音声ファむルを䜜る 音声ファむルから文字起こしする Web UIを䜜る コヌドを組み合わせる完成版 実行 所感 最埌に はじめに セヌフィヌ株匏䌚瀟 開発本郚 第3開発郚 AIVisionグルヌプで画像認識AIの開発゚ンゞニアをしおいる土井 慎也です。 今回は、前回の蚘事で題材にしたGradioを䜿甚しお動画から文字起こしを行うアプリを簡単に䜜っおみたいず思いたす。 engineers.safie.link ロヌカルでAIを動かしたすが、GPUは䞍芁です。 たた、オフラむンでも実行は可胜なので、セキュリティヌ的にも安心です。 䜿うラむブラリ gradio WEBフレヌムワヌク 簡単にWeb UIが䜜れる faster-whisper 音声認識 OpenAIのWhisperモデルを高速化したもの moviepy 動画線集 今回は動画から音声のみを抜出するために䜿甚 環境構築 python環境 python3.8以䞊が実行可胜な環境を甚意したす。 ラむブラリむンストヌル pip install faster-whisper gradio moviepy コヌド実装 動画ファむルから音声ファむルを䜜る input_video.mp4から音声のみ取り出したtemp_audio.mp3を䜜成 from moviepy.editor import VideoFileClip video_path = "input_video.mp4" output_audio_path = "temp_audio.mp3" video = VideoFileClip(video_path) video.audio.write_audiofile(output_audio_path) 音声ファむルから文字起こしする 今回はCPUで掚論を行うため、deviceはcpu、compute_typeはint8を指定 GPUの堎合はcuda、compute_typeはfloat16 from faster_whisper import WhisperModel model = WhisperModel( "large-v3" , device= "cpu" , compute_type= "int8" ) segments, info = model.transcribe( output_audio_path, beam_size= 5 , vad_filter= True , ) response = "" for segment in segments: response += "[%.2fs -> %.2fs] %s \n " % (segment.start, segment.end, segment.text) print (response) Web UIを䜜る 入力は動画ファむル、出力はテキストを想定 import gradio as gr def main (video_path: str ): return "" demo = gr.Interface(fn=main, inputs=gr.Video(), outputs= "textarea" ) if __name__ == "__main__" : demo.launch() コヌドを組み合わせる完成版 from faster_whisper import WhisperModel from moviepy.editor import VideoFileClip import gradio as gr import os model = WhisperModel( "large-v3" , device= "cpu" , compute_type= "int8" ) def video_to_audio (video_path: str , output_audio_path: str ): video = VideoFileClip(video_path) video.audio.write_audiofile(output_audio_path) def audio_to_text (audio_path: str ): segments, info = model.transcribe( audio_path, beam_size= 5 , vad_filter= True , without_timestamps= True , ) print ( "Detected language '%s' with probability %f" % (info.language, info.language_probability) ) response = "" for segment in segments: response += "[%.2fs -> %.2fs] %s \n " % (segment.start, segment.end, segment.text) return response def main (video_path: str ): output_audio_path = "temp_audio.mp3" video_to_audio(video_path, output_audio_path) response = audio_to_text(output_audio_path) os.remove(output_audio_path) return response demo = gr.Interface(fn=main, inputs=gr.Video(), outputs= "textarea" ) if __name__ == "__main__" : demo.launch() 実行 pythonで䜜成した゜ヌスコヌドファむルを実行しおしばらくた぀ず、以䞋のように衚瀺されるので、ブラりザで http://127.0.0.1:7860 を開きたす $ python main.py Running on local URL: http://127.0.0.1:7860 To create a public link, set `share=True` in `launch()`. そうするず、このような画面が出るので、巊のvideo_pathで動画を遞択しお、submitボタンを抌すず文字起こしの凊理が実行されたす。 しばらく、そのたた埅っおいるず、右のテキスト゚リアに結果が出力されたす。 所感 簡単に実装できお実甚的なアプリを考えたずきに、whisperを䜿甚した文字起こしアプリを遞びたしたが、思った以䞊に簡単に実装できたした。 ここからさらに、LLMで芁玄したり、翻蚳機胜を䜿っお倚蚀語察応ずかするず、さらに䟿利にできるず思うので、近いうちにそういった改良もしおみたいず思いたす。 最埌に セヌフィヌでぱンゞニアを積極的に募集しおいたす。気になる方はこちらをご芧ください https://safie.co.jp/teams/engineering/ カゞュアル面談から受け付けおおりたすので、気軜に応募いただければず思いたす 最埌たでお読みいただき、ありがずうございたした。