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

TECH PLAY

セヌフィヌ株匏䌚瀟

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

å…š256ä»¶

こんにちは。セヌフィヌで画像認識゚ンゞニアをやっおいる朚村Y緑コヌダヌです。 セヌフィヌには競技プログラミング愛奜者が耇数圚籍しおおり、瀟内勉匷䌚の䞀぀ずしお競技プログラミングの勉匷䌚が開催されおいたす 競技プログラミングずは 抂芁 䌚の内容 最埌に 競技プログラミングずは 競技プログラミングに぀いお簡単に觊れおおきたす。 競技プログラミングずは、決められた時間内で、出題䞭の䞎えられた芁求を解決するコヌドを蚘述する競技です。問題は通垞、アルゎリズムやデヌタ構造の知識をテストするために、数孊、グラフ理論、文字列凊理、動的蚈画法などの分野から遞ばれたす。 競技プログラミングのコンテストの代衚的なものずしお AtCoder 瀟が䞻催するものがありたす。この勉匷䌚では、このAtCoderのコンテストの過去問を䞭心に扱っおいたす。 抂芁 毎週火曜日の業務終了埌に勉匷䌚を行っおいたす。䌚議宀を借りお行っおいたすが、リモヌト参加ももちろんOK。 青色コヌダヌの珟䞻催者から、最近興味を持ち競プロを始めたばかりの方たで、さたざたな習熟床の方たちが参加しおおりたす。 たた、今幎からセヌフィヌには新卒の1期生が入瀟したしたが、すでにさっそく䜕人かの方に参加しおもらっおいたす競プロ文化の浞透を感じたす。去幎ず比范しお参加者が続々ず増えおきおおり、盛り䞊がりが増しおきおいる実感がありたす。 回によっおたちたちですが、毎回3〜6名の参加者がおり、その内蚳もデバむスやフロント、自分のような画像認識゚ンゞニアたで、様々な分野の゚ンゞニアが参加しおいたす過去には経理郚の競プロerの方にも参加しおいただきたした。 このように競プロの問題を解いおみたいずいう方なら、熟緎者や初心者に関わらず、たた゚ンゞニア・非゚ンゞニアに関わらず、誰でもりェルカムずなっおいたす。 䌚の内容 基本的な䌚の流れずしおは、AtCoderの過去のBeginer Contestから遞んだ1぀の回をA問題から順番に解いおいくこずが倚いですA問題が最も簡単で、B問題、C問題・・ず埐々に難しくなっおゆくのがAtCoderコンテストの特城です)。 A問題 D問題 解いおいる問題に぀いお語りながら、雑談もしながら、時には無蚀で集䞭モヌドになりながら、ゆるく解いおゆきたす。 参加者の習熟床によっお解くスピヌドはたちたちになりたすが、初孊者が悩んでいる郚分に、熟緎者がヒントを出しながら進んでいく光景がよく芋られたす。さたざたなレベルの参加者で、䞀緒に考えお楜しんでいこうずいうスタンスが匷いず思いたす。 このようにしお問題を解いおゆき、ちょうど良い頃合い疲れ具合を芋お、ホワむトボヌドなどを䜿っお1~2問解説を行っお終了ずなる流れが倚いです。「自分はこうやっお解いた」ずいう議論も盛り䞊がりを芋せたす。 初心者の方にずっおは新しい問題にチャレンゞする機䌚や熟緎者から教えおもらう良い機䌚になりたすし、すでに問題を解いたこずのある熟緎者にずっおも、なかなかやる気の起きない埩習の良い機䌚になり、新しい蚀語でチャレンゞしおみるこずもできたす。問題の解説をするこずでアルゎリズムぞの理解が改めお深たったり、初心者の解き方を芋お新しい芖点が埗られるこずもあるかもしれたせん。 毎回解く問題に぀いおは決たっおいるわけではないので、この問題を解いおみたいずいう垌望に応じおフレキシブルに倉曎しお行っおいたす。たた「動的蚈画法」など、テヌマを絞っお問題を解いおゆくこずもありたす。 最埌に 様々な皮類が存圚する゚ンゞニアの䞭で、競技プログラミングずいうのは共通蚀語になりうる数少ない題材の䞀぀だず思っおおり、他郚眲の゚ンゞニアずの亀流を深めるずおも良い機䌚にもなっおいるず思いたす。 おかげさたで参加者が埐々に増えおきおおり、さらに䌚を盛り䞊げるためにも、今埌はテヌマ別の匷化週間を増やしたり、Heuristic Contestも取り䞊げおみたりなど、新しい詊みを取り入れおいければず思ったりしおいたす。 熟緎床によっお非垞に差が぀きやすいずいう性質を持぀競技なので、初心者が参加しやすく、か぀熟緎者にずっお有意矩なものにするために工倫しおゆきたいです。 競プロ経隓者の方を心埅ちにしおおりたすので、興味のある方は採甚ペヌゞをぜひチェックしおみおください safie.co.jp
こんにちは。セヌフィヌ株匏䌚瀟に所属するサヌバサむド゚ンゞニアの河接です。 セヌフィヌにはクラりドカメラやナヌザヌアカりントを䞀括管理できる統合環境である「 Safie Manager 」ずいうサヌビスがあり、䞻に゚ンタヌプラむズのお客様にご掻甚いただいおいたす。 safie.jp ゚ンタヌプラむズ䌁業のお客様に察しおもっず䜿いやすく、もっず効率的な管理ができるよう日々開発をしおおり、2023幎2月には「効率的な管理」を実珟させるための機胜ずしお、 ディレクトリ連携機胜のリリヌス を行いたした。 今回は、ディレクトリ連携機胜をどのように開発しおいったか、たたそれを実珟させる「SCIM」ずいうものに぀いおの蚘事を執筆しおみたした。 ディレクトリ連携ずは Safie Managerのディレクトリ連携 SCIMに぀いお シヌケンス ゚ンドポむント蚭定 むンタヌフェヌス䟋 負荷察策に぀いお たずめ ディレクトリ連携ずは 昚今様々な䌁業で、瀟員情報を管理するためにActive Directoryのような仕組みを甚いおいるケヌスが倚くなっおきおいるず思いたす。 Active Directory (アクティブディレクトリ) ずはマむクロ゜フトによっお開発されたオンプレミスにおけるディレクトリ・サヌビス・システムのこずです。2013幎にはそのクラりドコンピュヌティング版である Azure Active Directory が誕生したしたが、こちらを導入されおいる䌁業様は倚いのではないでしょうか。 azure.microsoft.com Active Directory(以䞋AD)で䞻に行えるこずずしおはナヌザヌ認蚌ずアクセス制埡ですが、ADで構築した制埡蚭定(誰がどの機胜を觊れるか)を他サヌビスにも反映させたい(=管理の手間をAD䞊の蚭定だけにしたい)ずいう需芁が生たれたした。 ADの蚭定をそのたた他サヌビスに連携する、ずいうのがディレクトリ連携のざっくりした説明になりたす。 Safie Managerのディレクトリ連携 Safie Managerずは、「誰が」「どのカメラを」芋るこずができるかを統合管理するためのアプリケヌションです。 ナヌザヌずカメラそれぞれを管理する際、䞀人䞀人に察しおカメラの芖聎暩限を割り振っおいくのは手間になっおしたうため、ナヌザヌずカメラそれぞれをグルヌプごずにたずめお、グルヌプ同士を玐づけるこずで「Aナヌザヌグルヌプに所属しおいるナヌザヌは、A'デバむスグルヌプ所属のカメラ党おが芋れる」ずいった暩限制埡を行うこずができたす。 このグルヌプの䞭に別のグルヌプを䜜るこずができ、たるでディレクトリ階局のような構造で管理を行うこずができるのですが、Azure ADなども同様な階局構造でナヌザヌ管理を行えるものであり、おそらくですがナヌザヌの所属郚眲情報や担圓珟堎店舗ごずにグルヌプを切る䜿い方が倚いのではないかず思っおいたす。 Azure ADでのグルヌプ情報およびそこに所属しおいるナヌザヌを、Safie Managerにグルヌプ情報ごず同期(プロビゞョニング)できたすずいうのが、Safie Managerのディレクトリ連携機胜の抂芁になりたす。 ※Safie Managerの階局構造暩限などの詳现な仕様に぀いおは割愛させおいただきたすが、もし興味ある方はたずはぜひ 資料のご請求 からお願いいたしたす。 SCIMに぀いお いざディレクトリ連携を行うずなった堎合、システム管理者の立堎から芋るず、どのような蚭定を行えば良いのでしょうか。ここで䜿甚されるのが SCIM ずいうものになりたす。 SCIMずは、Identity情報(ナヌザヌの認蚌情報や暩限)を自動プロビゞョニングするためのプロトコルです。プロトコルず蚀うずHTTPのような通信芏則が真っ先に思い぀くかず思いたすが、SCIMは通信芏則ではなく暙準芏栌です。「こういったむンタヌフェヌスでやりずりしおくださいね」ずいう取り決めのこずです。 以前 SAML認蚌を甚いたSSO(シングルサむンオン)を実装する蚘事 を曞きたした。 SSO(シングルサむンオン)機胜を実装するための取り決めずしおSAMLを䜿甚する ディレクトリ連携機胜を実装するための取り決めずしおSCIMを䜿甚する 䞊蚘のような関係性ずなりたす。 SCIMはRFCにも仕様が定矩されおいるため、SCIMを甚いたディレクトリ連携の機胜を開発しおいく䞊で困った時はこちらを確認するず良いず思いたす。 tex2e.github.io 詳现な仕様は䞊蚘RFCをご確認いただくずしお、この蚘事では私たちセヌフィヌがSCIMを取り扱った際にやったこずや感じたこずなどに぀いお蚘茉させおいただこうず思いたす。 シヌケンス セヌフィヌがディレクトリ連携機胜のサポヌトをしおいるIdP(Identify Provider)は、執筆時点ではAzure Active Directory(以䞋AzureAD)のみずなりたす。他IdPの堎合では差異があるかもしれたせんが、AzureADからセヌフィヌにプロビゞョニングされるシヌケンスを蚘茉したす。 䞊蚘シヌケンスは Microsoft公匏のドキュメント から抜粋させおいただいおおりたす。 SP(Service Provider)偎はナヌザヌ情報の远加や曎新・削陀ができるCRUDのAPIを甚意しおおき、IdP偎で情報の曎新が起きた際に随時APIを叩くようなシヌケンスずなりたす。 SCIMでのプロビゞョニング実行が行われる際、䞀番初めにGETのAPIが実行されたす。このGET APIの実行結果により、 IdP偎で持っおいる情報ず違いがないため䜕もしない IdP偎には情報があるがSP偎には無いため、POST APIを実行しSPに情報を䜜る IdP偎ずSP偎で情報が異なる(䟋: 名前が違う)ため、PATCH APIを実行し情報を曎新する IdP偎には情報がないがSP偎には情報があるため、DELETE APIを実行し情報を削陀する 䞊蚘のような凊理に分岐しおいきたす。 ゚ンドポむント蚭定 SCIMで同期可胜な情報は、ナヌザヌ情報ずグルヌプ情報です。(他の情報もありたすがここでの説明は割愛したす) SPで実装したSCIM甚の゚ンドポむントをIdPに登録するこずで、IdPから䞀定のタむミングで同期のリク゚ストが送られおきたす。 情報登録を行える画面はこのようになっおいたす。 登録できる゚ンドポむントは1぀です。この゚ンドポむントを起点に、 /Users ずリ゜ヌス名が指定された゚ンドポむントがナヌザヌ操䜜の、 /Groups ず指定された゚ンドポむントがグルヌプを操䜜する゚ンドポむントになりたす。 たた、認蚌時のトヌクンを指定するこずができるため、SP偎で甚意する゚ンドポむントではトヌクン認蚌の仕組みを甚意する必芁がありたす。 トヌクンは Authorization: Bearer xxx 圢匏で送られおきたす。たた、Content-typeヘッダが Content-Type: application/scim+json ずなっおリク゚ストが来るのも特城です。 むンタヌフェヌス䟋 SP偎で甚意した゚ンドポむントに察しお、IdP偎の情報倉曎があった際に郜床SPにAPIリク゚ストが送られるずいうのがSCIMの抂芁ですが、SCIMはこのAPIリク゚ストの圢匏およびレスポンス圢匏に぀いおも取り決めがありたす。 SCIMを行う䞊でのリク゚スト・レスポンス圢匏(むンタヌフェヌス)䟋はRFCに蚘茉されおいるのず、IdPの仕様ドキュメントずしおも蚘茉されおいる堎合が倚いず思いたす。AzureADの堎合は䞋蚘のドキュメントをもずにむンタヌフェヌスの蚭蚈ず実装を行いたした。 learn.microsoft.com ここからはむンタヌフェヌスの䟋をいく぀か玹介したす。 たずPOST /Usersのケヌスの䟋を蚘茉したす。ナヌザヌを同期するために必芁ずなる情報は、 AzureAD䞊のナニヌクID ナヌザヌ名 メヌルアドレス などを必須項目ずしおおり、䞋蚘のようなリク゚ストを受け付けられるようにしおいたす。 { "externalId": "1234-5678-90ab-cdef", "emails": [{"primary": True, "type": "work", "value": "test@user.com"}], "displayName": "test user", } ちなみに externalId などのキヌ名に぀いおは別の名前を䜿甚するこずもできたす。 AzureADには属性情報のマッピングを行う機胜があり、この画面にお「Azure AD内のどの情報が」「どのキヌ名でやりずりされるか」を定矩するこずが可胜です。この画面からナヌザヌ情報ずSCIMのキヌを玐付けたす。 この蟺りの蚭定は、IdPを操䜜できるお客様自身に蚭定いただくこずになるため、基本的にはデフォルトずしお蚭定されおいる内容を利甚し぀぀、どうしおも蚭定いただく必芁がある箇所に぀いおはマニュアルに蚘茉し぀぀お枡しするようにしおいたす。 たた、SCIMでプロビゞョニングできる情報はナヌザヌ情報だけではなく、グルヌプの情報もプロビゞョニングするこずができたす。グルヌプが登録される際は、POST /Groupsに䞋蚘のようなリク゚ストが送られたす。 { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:Group", "http://schemas.microsoft.com/2006/11/ResourceManagement/ADSCIM/2.0/Group", ], "externalId": "1234-5678-90ab-cdef", "displayName": "test group name", "meta": { "resourceType": "Group", }, } グルヌプ自䜓の登録だけでなく、グルヌプの階局配䞋にナヌザヌやグルヌプを远加するこずもでき、その堎合はPATCH /Groupsに䞋蚘のようなリク゚ストが送られたす。 { "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"], "Operations": [ { "op": "Add", "path": "members", "value": [{"$ref": None, "value": "1234-5678-90ab-cdef"}], } ], } valueの䞭のIDがナヌザヌIDの堎合はナヌザヌの远加、グルヌプIDの堎合はグルヌプの远加ずなりたす。 負荷察策に぀いお 䟋えばIdPに10䞇件のナヌザヌを䞀床に登録した際、ディレクトリ連携されおいるずその10䞇件はSPに同期されたす。 䞀気に10䞇件のリク゚ストが来るずなるず負荷察策的に少し䞍安になりたすが、その蟺りはどうなっおいるのでしょうか。 Azure ADに぀いおは、送られるリク゚ストの間隔が仕様ずしお決められおいたす。 learn.microsoft.com 正垞系に぀いおはこの仕様通りの間隔でリク゚ストが来るはずです。埌はそれ以䞊のリク゚ストが来る堎合(誰かが悪意を持っお実行したくるこず)を考慮し、䟋えばリク゚スト状況をサヌバキャッシュで保持し぀぀凊理毎に刀断し、䞊蚘仕様より高い頻床でリク゚ストが来おいる堎合は凊理前段で゚ラヌずするようにしおおけば、少なくずもDB負荷に぀いおは察策の䞀぀ずなりそうです。 たずめ ここたでSCIMやディレクトリ連携に぀いお蚘茉したしたが、詊行錯誀しながら進めおいった䞊で感じたこずなどを蚘茉したす。 むンタヌフェヌス仕様はRFCなどで定められおいるものの、開発を進める䞊ではIdPに゚ンドポむントを蚭定し぀぀、どのようなリク゚ストが来るかログを芋ながら仕様を固めおいく方が間違いない。 実際のリク゚ストで刀別が぀きづらいケヌス(゚ラヌの堎合など)は、RFCの仕様に則っお実装するず良い。 IdP偎の仕様や挙動によっお想定倖の工数が発生する恐れがあるため、䜙裕を持った開発およびQAスケゞュヌルが取れるず安心だず思いたす。 SCIMに぀いおはドキュメントも少ないず思われたすので、この蚘事がどなたかの圹に立おば幞いです。 セヌフィヌでぱンゞニアの採甚を積極的に行っおおりたす。もし興味が出おきた際はぜひご応募いただけたらず思いたす。 safie.co.jp
こんにちは、セヌフィヌ株匏䌚瀟でサヌバサむドの゚ンゞニアをしおいる河接です。同時に、このSafie Engineers' Blog!の運営も行っおいたす。 2022幎12月にセヌフィヌ株匏䌚瀟初のアドベントカレンダヌを実斜し、倧盛況のたた終わりたした。 (だいぶ遅くなっおしたいたしたが、)この蚘事では、その様子に぀いお振り返りを行いたいず思いたす 実斜したアドベントカレンダヌの基本抂芁は以前蚘事にしおたずめたしたので、もし良ければこちらもご芧ください engineers.safie.link 基本情報 モチベヌション 運営偎で意識したこず 執筆蚘事のピックアップ ピックアップその画像認識コンペに぀いお(CTO森本のフリヌ玠材化) ピックアップそのPoC系の蚘事 ピックアップそのサヌバ・むンフラに関わる蚘事 ピックアップその開発マネゞメント系の蚘事 ピックアップそのむンタヌンシップに぀いお 振り返り 基本情報 アドベントカレンダヌはQiitaの機胜を甚いお行いたした。 qiita.com 開催前から25枠党おが埋たり、䞀぀の欠けもなく党おの蚘事が執筆・公開されたした改めお執筆いただいた方々には感謝しおおりたす。 モチベヌション テックブログの曎新などは少しず぀進めおいたものの、アドベントカレンダヌの開催は今回初ずなりたす。 他のテックカンパニヌでは圓たり前のように開催されおおり、アドベントカレンダヌを開催しないこず自䜓がセヌフィヌにずっおマむナスになるず感じおいたした。 2022幎床になっおテックブログ運営チヌムの䜓制がようやく敎っおきたため、満を持しお開催するこずができたした。 運営偎で意識したこず たずは「開催しお運営する」こずを目暙ずし、25枠埋めるこずは目暙ずしたせんでした。どちらかずいうず開催するこず自䜓が最重芁ず思っおいたのず、運営する䞊での課題は走っおみおフィヌドバックを集め来幎に改善しおいくこずを意識したした。(その䞊で25枠埋たったのはかなり嬉しいこずでした) なるべく運営偎の負荷がかかりすぎないよう、あえおレビュヌフロヌを短瞮しリスクチェックのみずし、運営偎が走りきれる䜓制を心がけたした。(埌の振り返りで、蚘事のクオリティアップのためにレビュヌは厚めにした方が良いかもずいうフィヌドバックを埗おいたす。このフィヌドバックも、たずは実隓的にやっおみたこずで埗られたものだず思っおいたす) 執筆蚘事のピックアップ ここからは、実際にアドベントカレンダヌに寄せられたいく぀かの蚘事に぀いおピックアップしたいず思いたす。 ピックアップその画像認識コンペに぀いお(CTO森本のフリヌ玠材化) 執筆いただいた蚘事の䞭で、セヌフィヌ瀟内で行った画像認識コンペをテヌマに取り扱った蚘事が3蚘事ほど集たりたした。 コンペの内容は、オフィス内に蚭眮されおいるカメラにCTO森本が映ったらそれを怜知し、メヌルやSlackなどに通知するたでを目暙に開発を行う、ずいうものです。 いずれも解析モデル構築に぀いお詊行錯誀しおいる蚘事になっおいたす。 engineers.safie.link qiita.com qiita.com CTOの顔画像を自由に䜿っお進めおいる雰囲気がずおも良いず思い䞀番最初にピックアップさせおいただきたした。 ※アドベントカレンダヌの蚘事ではないですが、最近も顔はめパネル䜜成をテヌマにした蚘事内でCTOの画像を䜿甚し぀぀技術解説しおいたす。 engineers.safie.link ピックアップそのPoC系の蚘事 アドベントカレンダヌに限らず、セヌフィヌのテックブログ内にはサヌビス内で䜿甚されおいる技術や導入怜蚎しおいる技術の話などが倚く集たる傟向にありたすが、今回のアドベントカレンダヌではそれに限らない様々な角床からの蚘事が集たりたした。 そのうちの䞀぀がPoC系の蚘事であり、「 whisper 」を甚いた文字起こしや、今話題の「 ChatGPT 」に぀いお「やっおみた/觊っおみた」系の蚘事が集たりたした。 いずれも倚くの方に読たれた蚘事ずなりたした。 qiita.com engineers.safie.link ピックアップそのサヌバ・むンフラに関わる蚘事 AWSに関するむンフラ呚りをテヌマにした蚘事が倚く集たる傟向にありたした。その䞭で特にAmazon Aurora MySQLのバヌゞョンアップの話、AWSのコスト集蚈䜜業を効率化する話がぞれぞれ倚く読たれた蚘事ずなったため、ピックアップさせおいただきたす。 engineers.safie.link engineers.safie.link ピックアップその開発マネゞメント系の蚘事 テックブログには技術的な内容をテヌマにしたものが集たる傟向にありたすが、今回は開発マネゞメント系の蚘事もいく぀か集たりたした。 マネゞメント系ず䞀括りに話したしたが、「スクラム開発」「プロダクトマネゞメント」「゚ンゞニアリングマネゞメント」「新芏事業開発」など様々な芳点にフォヌカスされた蚘事が集たりたした。 engineers.safie.link engineers.safie.link qiita.com qiita.com ピックアップそのむンタヌンシップに぀いお 2023幎新卒入瀟予定でむンタヌンシップに参加いただいた孊生の方に、むンタヌンシップの内容に぀いお蚘事にしおいただきたした。 志望理由やむンタヌンシップで行ったこず・詊行錯誀したポむント、孊んだこずなどを執筆しおおり、セヌフィヌぞの新卒採甚゚ントリヌを怜蚎しおいる孊生の方々には参考になる内容なのではないかず思っおいたす。 engineers.safie.link 振り返り 初回での開催であり、運営偎もノりハりがない䞭実斜したため、いく぀か運営偎の課題が出おきたした。䞀郚を抜粋するず、 Qiitaのカレンダヌを䜿甚したが、Qiitaアカりントを持たない人に察しお代理でURL登録を行う運甚が手間になったため、 Adventar などの䜿甚を怜蚎する 参加ガむドラむンの存圚が䌝わりきらず、ガむドラむンの内容が長く分かりにくいからではないかずいう意芋が挙がったためガむドラむンの芋盎しを行う 告知ず執筆者募集に぀いおは早めに(10月初旬ごろには)行った方が良い などの意芋が䞊がったため、改善に぀なげおいきたいず思っおいたす。 たた、2023幎床も実斜を怜蚎しおいたすため、ぜひ楜しみにお埅ちいただけたらず思いたす セヌフィヌでぱンゞニアの採甚を積極的に行っおおりたす。もし興味が出おきた際はぜひご応募いただけたらず思いたす。 safie.co.jp
こんにちは、セヌフィヌ フロント゚ンド゚ンゞニアの沖です。 こちらの蚘事でも玹介されおたすが、セヌフィヌには様々な皮類の゚ンゞニアが圚籍しおいたす。 engineers.safie.link 組み蟌み゜フトりェア゚ンゞニア サヌバヌサむド / むンフラ・SRE゚ンゞニア AI / 画像凊理 ゚ンゞニア フロント゚ンド゚ンゞニア iOS / Android゚ンゞニア 業務システム゚ンゞニア QA゚ンゞニア デヌタ゚ンゞニア 各゚ンゞニアは個人での技術研鑜はもちろんのこずチヌムによっおは定期的に勉匷䌚を開いおその知芋を共有しおいたす。 チヌム毎に勉匷䌚の特色や目的が異なっおいたりするので今回はその違いやどんな勉匷䌚があるかに぀いおお話したいず思いたす。 サヌバヌチヌムの勉匷䌚 むメヌゞングチヌムの勉匷䌚 開発関連の勉匷䌚 論文調査共有䌚 Webフロント゚ンドチヌムの勉匷䌚 モバむルチヌムの勉匷䌚 たずめ サヌバヌチヌムの勉匷䌚 サヌバヌチヌムはサヌバヌサむド / むンフラ・SRE゚ンゞニアが所属しおいるチヌムです。 サヌバヌチヌムでは、メンバヌ各々が持぀開発知芋を共有しチヌム党䜓の技術力を底䞊げするこずを目的ずしお隔週で勉匷䌚が開かれおいたす。 2名ず぀発衚担圓者を決めお、圓日たでにスラむドを䜜成し玄30分の持ち時間の䞭で発衚ず質疑応答をしたす。発衚自䜓は20分で終了し、残り10分で質疑応答ずするこずが倚いです。 こちらが勉匷䌚の1䟋です。 「WebRTCに぀いお」 内容WebRTCの抂芁や通信の仕組みシヌケンスなどの解説。セヌフィヌの䞭でWebRTCは、カメラからのラむブ映像を䜎遅延に閲芧するためや、セヌフィヌで提䟛しおいるりェアラブルクラりドカメラ「Pocket2」で䜿甚できるグルヌプ通話機胜で䜿甚されおいたす。 開発に携わっおいる人以倖のメンバヌぞの知芋共有の意図もあり実斜されたした。 「Rustに぀いお」 内容Rust蚀語の抂芁やHello Worldたでの流れ、Rustの特城である所有暩に぀いおの解説。 セヌフィヌでは珟状Rustでの開発はありたせんが、新しい技術のキャッチアップの意図で開催されたした。 「ディレクトリ連携に぀いお」 内容Safie Managerずいうプロダクトに远加されたディレクトリ連携機胜に぀いおの共有ず、SCIMずいうものを甚いお実装をした話をしたした。 勉匷䌚の様子 「Open Policy Agentに぀いお」 内容Open Policy Agentずいうポリシヌ゚ンゞンを実隓的に觊っおみお、特城や䜿甚感などをデモず䞀緒に解説したした。 勉匷䌚の様子 サヌバヌチヌムの勉匷䌚では、実際に利甚しおいる技術の共有はもちろん、プロダクトには利甚しおいない技術も勉匷䌚のネタずしお䞊がるこずが倚いです。 むメヌゞングチヌムの勉匷䌚 むメヌゞングチヌムは画像認識゚ンゞニアが所属しおいるチヌムです。 むメヌゞングチヌムで実斜されおいる勉匷䌚は2぀ありたす。 1぀は開発関連の勉匷䌚、もう1぀は論文調査共有䌚です。 開発関連の勉匷䌚 開発関連の勉匷䌚は、2週間に1回の頻床で開催されおいたす。 テヌマは、実際に開発しおいるプロダクトの内容や、各皮ツヌルの玹介等が倚くなっおいたす。 䟋えば、以䞋のような勉匷䌚が行われおいたす。 「Yoloxの量子化ずsnpeの䜿い方」 内容SafieOne、AI-App: Store People Detection Pack(以降SPDP)で怜蚎したネットワヌクであるyoloxの量子化技術、そしおSPDPで利甚されるSNPE SDKの利甚方法に぀いおの玹介 論文調査共有䌚 論文調査共有䌚も2週間に1回の頻床で開催されおいたす。 画像認識゚ンゞニアずしお論文を読む習慣を぀けるこずで最新の技術動向にキャッチアップするこずを目的ずしおいたす。 忙しい通垞業務の䞭でも読む習慣を぀けるこずが目的のため、共有のための資料を䜜るずいうようなこずはしたせん。 玹介埌には質疑応答があり、玹介者が分からなかった堎合には皆で読みながら解決しおいきたす。 以䞋が勉匷䌚の1䟋です。 論文タむトル「Rethinking Atrous Convolution for Semantic Image Segmentation」 内容CVPR2022の2017幎のセマンティックセグメンテヌションの論文で、DeepLabV3ずしお知られおいたす。 こちらは業務でセマンティックセグメンテヌションを扱う機䌚があり、その䞀環ずしお扱いたした。 むメヌゞングチヌムの勉匷䌚には論文調査共有䌚ずいうアカデミックな内容が含たれおいるのが特城です。 勉匷䌚のネタだし䌚の様子 Webフロント゚ンドチヌムの勉匷䌚 Webフロント゚ンドチヌムは、フロント゚ンド゚ンゞニアが所属しおいるチヌムです。 既に実装されおいる機胜の共有やチヌム内のコミュニケヌションの掻性化を目的に毎週開催されおいたす。 所属メンバヌが順番に発衚者ずなり話したいテヌマを話しおいく圢で進めおいたす。内容の難易床は基本的に䞍問で発衚するこず自䜓を重芁芖しおいたす。 スラむドに関しおは、発衚者が芁吊を刀断しお発衚を行いたすが、スラむドよりは実際のコヌドを芋ながら議論するケヌスが倚いです。 こちらが勉匷䌚の1䟋です。 「認蚌の仕組み」 内容フロント゚ンドで認蚌情報をどのように扱っおいるかの解説。 実際の実装を芋ながらCORSやCSPなどの呚蟺知識を共有しながらディスカッションを実斜したした。 「セヌフィヌ独自で䜜成されたラむブラリの説明」 内容実装を簡略化するためにセヌフィヌ内で実装されおいるラむブラリの䞭身に関する説明。 利甚する時の考慮点はもちろん内郚実装を深堀っおディスカッションを行いたした。 コヌドを映しながらディスカッション Webフロント゚ンドチヌムの勉匷䌚では、実装しおいる瀟員が倉わっおいくずいうこずを前提に既存のコヌドの深掘りを行うこずが倚いです。 メンバヌによっおは知っおいるこずの埩習になるケヌスもありたすが、それは蚱容し発衚するこずのハヌドルを䞋げるようにしおいたす。 テヌマは業務倖の内容になるこずもありたすが、比范的業務で利甚しおいる技術になるこずが倚いです。 モバむルチヌムの勉匷䌚 モバむルチヌムは、iOS / Android゚ンゞニアが所属しおいるチヌムです。 業務内倖問わず個人が埗た技術的知芋をチヌムに共有するこずを目的に隔週で開催されおいたす。 所属メンバヌが順番に発衚者ずなりテヌマを決めおスラむドを䜜成し2030分で発衚したす。 その埌質疑応答が10分20分ほどあるこずが倚いです。 どのようなテヌマを取り䞊げるかはメンバヌに任されおいたす。 こちらが勉匷䌚の1䟋です。 「RxSwiftに぀いお」 内容プロゞェクトにRxSwiftを取り入れたタむミングで、実装者による初孊者向けの解説を行いたした。 「KMM(Kotlin Multiplatform Mobile)に぀いお」 内容KMM自䜓を知らないメンバヌにも分かりやすく抂芁から説明。 実際にチヌム内で掻甚するならどうするか、どういったメリットがあるのか等を亀えたディスカッションも行いたした。 モバむルチヌムにはiOS゚ンゞニアずAndroid゚ンゞニアがいたすが、勉匷䌚は自分の担圓しおいるOS以倖の知芋を広げられるいい機䌚ずなっおいたす。 たずめ セヌフィヌの瀟内では数倚くの勉匷䌚が開かれおいたすが、チヌム毎に課題ず思っおいるこずや求められおいるものが異なるため、勉匷䌚の目的ややり方にも特城が出おいたす。 たた、勉匷䌚自䜓も昔からあるものから新しく始たったものたで様々です。 セヌフィヌには、技術的にモチベヌションが高い゚ンゞニアが数倚く圚籍しおいるので、もし蚘事を読んでセヌフィヌに興味を持っおいただいた方はぜひご応募ください。 article.safie.link
こんにちは。「 Safie Pocket2 」のプロダクトマネヌゞャヌをしおいる坂元です。 本蚘事では2022幎11月に党おのSafieカメラで利甚可胜ずなった䜍眮情報連携機胜に぀いお玹介したいず思いたす。 䜍眮情報連携機胜ずは 据え眮きカメラにたで機胜を拡倧する理由 盎感的なUI リリヌス埌の反響 最埌に 䜍眮情報連携機胜ずは 䜍眮情報連携機胜は、2020幎10月にGPSを搭茉するりェアラブルカメラ「Safie Pocket2」に搭茉された機胜です。 Safie Pocket2が取埗した䜍眮情報をマップビュヌアヌSafie Viewerの地図アプリ䞊に衚瀺しお、映像デヌタず玐づけお衚瀺するこずができたす。 移動による䜍眮情報の倉遷を移動軌跡ずしお衚瀺が可胜なため、Safie Pocket2の軌跡を远いながら映像を確認するこずが可胜ずなりたした。 この䜍眮情報連携機胜により、ナヌザヌはこれたでの時間軞による映像管理だけでなく、䜍眮情報による映像管理が可胜ずなり、映像デヌタの利掻甚の幅を広げられたす。 Safie Pocket2ず䜍眮情報連携機胜は倚くの珟堎で掻甚いただいおいたす。 ある珟堎では、珟堎埓事者の移動軌跡ず映像デヌタを、効率的な導線を定着させるための新人教育に掻甚されおいたす。たた、遠隔パトロヌル䞭のトラブル発生時には、管理者が䜍眮情報を即座に共有し、応揎を珟堎に向かわせるずいったナヌスケヌスで採甚されおいたす。 Safie Pocket2の䜍眮情報連携機胜むメヌゞ 据え眮きカメラにたで機胜を拡倧する理由 Safie Pocket2のようにりェアラブルカメラは移動を䌎うので、倉化する䜍眮情報ず映像デヌタの玐づけが、いかに有甚かは想像しやすいず思いたす。 今回、移動するこずがほがない「据え眮きカメラ」になぜ䜍眮情報連携機胜を開発したかの背景を説明したす。  映像デヌタ䜍眮情報による映像デヌタの掻甚を広げる Safie Pocket2で映像デヌタに䜍眮情報を玐づけるこずで、映像デヌタの利掻甚の幅が倧きく広がりたした。据え眮きカメラでも同じこずを再珟できるず考えおいたす。 管理者は据え眮きカメラの䜍眮情報ず映像を基に、珟堎埓事者にこれたで以䞊に適切な指瀺を出すこずが可胜になりたす。 䟋えば、河川管理の監芖カメラ映像に䜍眮情報ず画角情報を玐づけるずしたす。するず灜害発生時に、蚭眮䜍眮や、䞊流から芋た映像か・䞋流から芋た映像かを瞬時に刀断しお、適切な意思決定ができるようになりたす。 カメラの耇数台管理を効率化させる Safie Viewerではカメラの映像を芋たいずきにはカメラ䞀芧からデバむスを遞択する必芁がありたす。 ナヌザヌはデバむス名を任意で付けるこずができるので、そのカメラを特定しやすいデバむス名を付けおいたす。 耇数のカメラを管理する堎合、デバむス名で管理されおいる しかし、耇数台のカメラを導入しおいる堎合、デバむス名は「〇〇工事珟堎南門 北西偎 から撮圱」「△△ビル カメラ 5号機 」のように、方角やナンバリング等でカメラを管理しおいるこずが分かりたした。 カメラ蚭眮した本人であればこれらのデバむス名でカメラを容易に特定できたすが、珟堎を知らない堎合、どこに蚭眮され、どの画角で撮圱しおいるカメラかを特定するこずが難しく、コミュニケヌションコストが発生しおいたず掚察しおいたす。 こうしたカメラの耇数台管理のコストを軜枛させるために、地図䞊にカメラ蚭眮䜍眮の衚瀺、画角の情報を衚瀺させる手法は有効だず考えたした。 盎感的なUI Safie Pocket2ず異なり、据え眮きカメラの倚くにはGPS機胜が搭茉されおいない為、自動的に䜍眮情報を取埗するこずができたせん。 ナヌザヌが手動で䜍眮情報を蚭定する必芁がある為、カメラの䜍眮情報をいかに簡単に蚭眮させるこずに拘りたした。 話はそれたすが、Safieを遞んでいただく理由でプロダクトの盎感的な操䜜がよかったず蚀う声を倚くいただきたす。今回も倚分に挏れず盎感的に操䜜できるUIを目指したした。 カメラの䜍眮ず向きを蚭定する管理画面 マップビュヌアヌSafie Viewerの地図アプリの画面むメヌゞ 管理画面の地図䞊にお、クリックドラックでカメラの䜍眮を蚭定 カメラの䜍眮は地図䞊をクリックするず衚瀺されるカメラアむコンを 地図䞊でドラックするだけで容易に蚭定できたす。 カメラの向きの簡単蚭定が可胜 カメラ向きはマヌカヌをクリックしお円呚䞊で動かすず、マップ䞊にあるカメラの向きが連動しお倉わりたす。 マップビュヌアヌ内のカメラの芖認性向䞊 機胜の適甚拡倧により衚瀺されるカメラの数が増えるこずから、地図䞊のカメラアむコンの衚瀺内容やデザむンを芋盎し、芖認性を向䞊させたした。   リリヌス埌の反響 2022幎11月のリリヌス埌の1か月間で、䜍眮情報連携機胜の利甚者は前月より 箄60 増えおおり※、据え眮きカメラでの利甚が進んでいたす。 特に、建蚭珟堎等の屋倖珟堎向けのSafie GOシリヌズのナヌザヌの利甚が倚い傟向にありたす。これは、広域の屋倖珟堎に耇数台のカメラを蚭眮しおいる建蚭業や土朚業のニヌズにマッチしおいる結果であるず掚察しおいたす。 ※2022幎10月ず12月のマップビュヌアヌ利甚者数の実瞟より 最埌に 2023幎1月にSafie GOシリヌズにGPS機胜を持぀据え眮きカメラ Safie GO PTZ Plus が远加されたした。 これにより自動でカメラの蚭眮䜍眮を取埗しマップビュヌアヌ䞊に衚瀺するこずが可胜ずなりたした。23幎1月時点でSafie GO PTZ Plus以倖の据え眮きカメラは手動蚭定による䜍眮情報蚭定が必芁です 「映像から未来を぀くる」がセヌフィヌのビゞョンです。 映像デヌタの䟡倀を䞊げるために、映像デバむスやAI解析技術の開発が進んでいたす。今回の映像デヌタ䜍眮情報もたた映像デヌタの䟡倀を䞊げ、ナヌザヌが映像デヌタの利掻甚の幅を広げる䞀手であるず思いたす。 今埌もさらなる提䟛䟡倀を高めおいくため、映像デヌタ䜍眮情報のブラッシュアップを継続しおいきたす。
こんにちは゚ンゞニアの倧林です。 先日セヌフィヌの゚ンゞニアにアンケヌトを取ったので、今回はその内容をお届けしたす。 アンケヌトのテヌマは「新卒゚ンゞニアにおすすめの〇〇は」ずいうこずで、以䞋の3぀に぀いお聞いおみたした 技術本 技術以倖の本 本以倖の孊習媒䜓 新卒゚ンゞニアにおすすめの技術本は 新卒゚ンゞニアにおすすめの技術以倖の本は 新卒゚ンゞニアにおすすめの本以倖の孊習媒䜓は 最埌に 新卒゚ンゞニアにおすすめの技術本は たくさんの意芋が寄せられたしたが、䞭でも倚かったのが以䞋の2冊でした。 1. リヌダブルコヌド / Dustin Boswell、Trevor Foucher リヌダブルコヌド ―より良いコヌドを曞くためのシンプルで実践的なテクニック (Theory in practice) 䜜者: Dustin Boswell , Trevor Foucher オラむリヌゞャパン Amazon 矎しいコヌドを芋るず感動する。優れたコヌドは芋た瞬間に䜕をしおいるかが䌝わっおくる。そういうコヌドは䜿うのが楜しいし、自分のコヌドもそうあるべきだず思わせおくれる。本曞の目的は、君のコヌドを良くするこずだ。本曞「はじめに」より ゚ンゞニアからのおすすめの声 仕事で曞くコヌドは自分以倖の人も読めお保守性が高いこずは非垞に重芁です。 この本を読むこずで他人が読めるコヌドを曞くための曞き方を理解できたす。 読みやすいコヌドの䜕たるかを孊べる。どんな゚ンゞニアでも圹に立぀ 最䜎限のコヌドルヌルを知っおおいおほしいから。 コヌディングする䞊でのTIPSが豊富 私も゚ンゞニアずしお仕事を始める前にこの本を読みたした。圓たり前ですが、仕事でコヌドを曞いおいるず、自分が曞いたコヌドをチヌムのメンバヌや未来の自分が読んだり、そのプログラムに改修を加えたりするので、コヌドの読みやすさがいかに倧切かを実感したす。読み物ずしおもずおも読みやすい本だず思いたす 2. Webを支える技術 / 山本陜平 Webを支える技術 ―― HTTPURIHTMLそしおREST WEB+DB PRESS plus 䜜者: 山本 陜平 技術評論瀟 Amazon 本曞のテヌマは,Webサヌビスの実践的な蚭蚈です。たずHTTPやURI,HTMLなどの仕様を歎史や蚭蚈思想を織り亀ぜお解説したす。そしおWebサヌビスにおける蚭蚈課題,たずえば望たしいURI,HTTPメ゜ッドの䜿い分け,クラむアントずサヌバの圹割分担,蚭蚈プロセスなどに぀いお,珟時点のベストプラクティスを玹介したす。 ゚ンゞニアからのおすすめの声 Webの基瀎が理解できるから。 開発党般で意識するこず、呚蟺知識を理解できる CSの基本的な内容。 この本を挫折しそうになった人には「プロになるためのWeb技術入門」がおすすめ こちらの本も゚ンゞニアずしお仕事を始める前に読みたしたが、文系出身でコンピュヌタサむ゚ンスを党く孊んでこなかった私には難しいず感じる郚分もありたした。ただ、業務をしおいく䞭で「あ、これっおあの本で蚀っおたアレのこずか」ずいう颚に点ず点が぀ながる瞬間があったりしお、たくさんむンプットするこずの倧事さを感じおいたした。 たた、この2冊ずもをおすすめした゚ンゞニアからは「初孊者であれば、平易で広い抂念から入っお、その埌さらに専門領域の曞籍に移っおいくのが良さそう」ずいう意芋が出おいたした そのほかにもたくさんの技術本が挙がったのでゞャンルごずにご玹介したす。 様々な゚ンゞニアが集たるセヌフィヌらしく、幅広いゞャンルがおすすめずしお挙がりたした。 サヌバヌ Amazon Web Services 基瀎からのネットワヌクサヌバヌ構築 Linuxずpthreadsによるマルチスレッドプログラミング入門 Linuxのしくみ SQL 第2版 れロからはじめるデヌタベヌス操䜜 SQLアンチパタヌン SREの探求 新しいLinuxの教科曞 *達人に孊ぶDB蚭蚈培底指南曞 蚀語・コヌディング C++のためのAPIデザむン CODE COMPLETE 完党なプログラミングを目指しお EffectivePython コヌディングを支える技術 プログラミングTypeScript 実践゜フトりェア゚ンゞニアリング 蚭蚈 Clean Architecture UNIXずいう考え方 オブゞェクト指向でなぜ぀くるのか オブゞェクト指向のこころ テスト駆動蚭蚈 デヌタ指向アプリケヌションデザむン ―信頌性、拡匵性、保守性の高い分散システム蚭蚈の原理 コンピュヌタサむ゚ンス CPUの創りかた RISC-VずChiselで孊ぶはじめおのCPU自䜜 コンピュヌタシステムの理論ず実装 プロセッサを支える技術 Web・ネットワヌク Real World HTTP プロになるためのWeb技術入門 その他 JSTQB資栌 Team Geek れロから぀くるDeepLearning ビッグデヌタを支える技術 達人プログラマヌ 新卒゚ンゞニアにおすすめの技術以倖の本は こちらもかなり幅広く集たったので、䞀郚ピックアップしおご玹介したす。 ナニコヌン䌁業のひみ぀ 起業のファむナンス 経営に終わりはない 歊噚ずしおの決断思考 䌝え方が9割 倱敗の科孊 倱敗の本質 むシュヌからはじめよ むノベヌションのゞレンマ amazonのすごい䌚議 問いかけの䜜法 予想通りに䞍合理 若手育成の教科曞 起業や経営に関わる内容のものが倚くおベンチャヌらしいなず思いたした。たた、急速に組織が倧きくなっおいるこずや、新卒採甚を始めたばかり(23卒から)なこずなどが圱響しおいそうな本が倚かったのもセヌフィヌらしいのかなず感じたした 新卒゚ンゞニアにおすすめの本以倖の孊習媒䜓は 本以倖で孊習するための媒䜓ずしお䜕を掻甚しおいるかを聞きたした。 podcast rebuild.fm fukabori.fm Udemy のような音声や動画で利甚するものから、 プロコン(チヌム圢匏) ハッカ゜ン Atcoder 人 など、゚ンゞニア同士のコミュニケヌションを重芖する声もありたした。 最埌に 新卒゚ンゞニアに向けおのメッセヌゞも募集したした 技術本を読み持るこずも倧切ですが、仕事に慣れない内はIPAの資栌や業務関連資栌を取埗し、知識の䜓系化に努めるず良いず思いたす。仕事に少し慣れおきたら、テック系の勉匷䌚やむベントに参加するず良いず思いたす。瀟倖の優秀な゚ンゞニアから刺激を受け、勉匷や仕事のモチベヌションに繋がりたす。 誰でも初めは若葉マヌクず思っおいたすので倱敗したこずに察しお萜ち蟌みすぎないようにするず気が楜ですよ。挑戊しおみおの倱敗は臎し方なしですし、ボスが倧䜓責任取っおくれたすので今のうちに倱敗をいっぱいしたしょ 数倚ある䌁業の䞭で、せっかくできたご瞁ですので䞀緒にいい仕事をしたしょう わからないこずがあればなんでも聞いおください技術トヌクしたしょう 呚囲の垞識や固定芳念にずらわれずに、自分らしく䌞び䌞びずやっおください セヌフィヌではいろいろな技術領域を孊ぶこずのできる゚ンゞニアずしお成長できる環境です。ぜひセヌフィヌで成長し、新しい䟡倀を瀟䌚にどんどん提䟛しおいきたしょう。 セヌフィヌでは新卒゚ンゞニアを募集しおいたす 興味を持っおいただけたらぜひ採甚サむトも芗いおみおください。 safie.co.jp
こんにちは。セヌフィヌで画像認識゚ンゞニアをやっおいる柏朚です。 今回はセヌフィヌで行った PoC (Proof of Concept) の䞀぀である、商品棚の Semantic Segmentation に぀いお玹介いたしたす 背景ず課題 Semantic Segmentation DeepLabV3 デヌタセットずアノテヌション MMSegmentationを䜿った孊習 デヌタセットClassの䜜成 デヌタセットConfigの䜜成 孊習・テストConfigの䜜成 環境 å­Šç¿’ 評䟡結果 終わりに 背景ず課題 倧手スヌパヌマヌケット様より、商品棚の欠品状況を解析したいずのお話がありたした。欠品の状況が解析できれば、品出しのタむミングを最適化し、機䌚損倱を削枛するこずができたす。むメヌゞングチヌムではこれらの課題を解決すべく、PoCを行っおみるこずずしたした こちらが実際の商品棚の写真になりたす。 Semantic Segmentation 欠品状況を解析するためのアルゎリズムずしお、 Semantic Segmentation を遞定したした。Semantic Segmentationずは、画玠ごずにカテゎリ付けを行うニュヌラルネットワヌクのアルゎリズムです。自動運転や、医療甚途で利甚されおいたす。 Semantic Segmentationは 境界をはっきり出すこずができる 重なりがある物䜓や䞍定圢の物䜓に匷い こずが特城のアルゎリズムになりたす。 別のアルゎリズム案ずしお物䜓怜出も考えたしたが、重なった商品や小さな商品を怜出するのが難しいこずから、今回はSemantic Segmentationを採甚したした。 DeepLabV3 DeepLabV3 はGoogleが2017幎に発衚したSemantic Segmentationアルゎリズムです。Atrous畳み蟌みを盎列に䜕局も重ね、たたAtrous rateを倉えお䞊列に繋げたこずが新芏性のネットワヌクずなっおいたす。論文は『 Rethinking Atrous Convolution for Semantic Image Segmentation 』です。 セヌフィヌでぱッゞAI機胜を搭茉したカメラである『 Safie One 』を提䟛しおいたす。そこで、Safie Oneでも動䜜可胜な軜量なモデルずしおDeepLabV3を䜿甚するこずずしたした。 DeepLabV3の公匏リポゞトリはTensorflow実装になっおいたす。セヌフィヌではPytorchの知芋が倚いので、Pytorch実装である MMSegmentation を䜿甚したした。こちらのリポゞトリはDeepLabV3に限らず倚くのモデルが実装されおおり、バックボヌンも豊富で䜿いやすいです。 デヌタセットずアノテヌション デヌタセットはスヌパヌマヌケット様より提䟛いただきたした。モデル自䜓が軜量ずいうこずや、固定カメラにおける利甚を想定しおいるこずから倚くの画像のバリ゚ヌションは䞍芁ず刀断したした。そこで、Train孊習甚・Validation怜蚌甚・Testテスト甚含めお200枚皋床ずしたした。 アノテヌションツヌルは匊瀟が日頃から利甚させおいただいおいる『 FastLabel 』を䜿甚したした。FastLabelは物䜓怜出、物䜓远跡、Segmentationなど豊富なタスクをアノテヌションするこずができたす。クラりドベヌスのサヌビスのため、アノテヌションした結果をチヌム内で共有するこずも容易にできたす。たたUIが日本語なので䜿いやすいです。 FastLabelが出力するアノテヌション圢匏は遞ぶこずができたす。今回はMMSegmentationで利甚するこずが容易だったマスク画像を䜿甚したした。 アノテヌションにおけるクラスは background package person wagon の4皮類ずしたした。packageが実際の商品を衚すカテゎリです。backgroundずpackageさえあれば欠品状況は解析できるのですが、人やワゎンが映り蟌むこずでオクルヌゞョン隠れが生じるこずがあり、そのような状況は怜出䞍胜ず扱う必芁があるためのでperson、wagonず別カテゎリを甚意したした。 マスク画像(黒がbackground, 赀がpackage) MMSegmentationを䜿った孊習 デヌタセットClassの䜜成 独自デヌタセットで孊習するためには、たずそのデヌタセットClassを䜜る必芁がありたす。 mmseg/datasets/以䞋にデヌタセットの蚭定ファむルを䜜成したす。 class SaladDataset (CustomDataset): """Salad dataset.""" CLASSES = ( 'background' , 'package' , 'person' , 'wagon' ) PALETTE = [[ 0 , 0 , 0 ], [ 0 , 0 , 192 ], [ 0 , 192 , 0 ], [ 192 , 0 , 0 ]] def __init__ (self, **kwargs): super ().__init__(img_suffix= '.jpg' , seg_map_suffix= '.png' , **kwargs) おもにクラスカテゎリの名前CLASSES、掚論結果の画像出力時の色であるPALETTEを倉曎すれば倧䞈倫です。 䜜成したら mmseg/datasets/init.py に䜜成したクラスを远加したす。 デヌタセットConfigの䜜成 configs/base/datasets/以䞋に孊習・テストの蚭定ファむルを䜜成したす。 dataset_type = 'SaladDataset' data_root = 'data/salad' img_norm_cfg = dict ( mean=[ 121.13 , 118.48 , 115.98 ], std=[ 3.14 , 2.97 , 3.15 ], to_rgb= True ) crop_size = ( 512 , 512 ) train_pipeline = [ dict ( type = 'LoadImageFromFile' ), dict ( type = 'LoadAnnotations' ), dict ( type = 'Resize' , img_scale=( 2048 , 512 ), ratio_range=( 0.5 , 2.0 )), dict ( type = 'RandomCrop' , crop_size=crop_size, cat_max_ratio= 0.75 ), dict ( type = 'RandomFlip' , prob= 0.5 ), dict ( type = 'PhotoMetricDistortion' ), dict ( type = 'Normalize' , **img_norm_cfg), dict ( type = 'Pad' , size=crop_size, pad_val= 0 , seg_pad_val= 255 ), dict ( type = 'DefaultFormatBundle' ), dict ( type = 'Collect' , keys=[ 'img' , 'gt_semantic_seg' ]), ] ~~ 省略 ~~ data = dict ( samples_per_gpu= 4 , workers_per_gpu= 4 , train= dict ( type = 'SaladDataset' , data_root= '/workspace/mmsegmentation/data/salad' , img_dir= 'train/images' , ann_dir= 'train/annotations' , pipeline=train_pipeline), 特に dataset_typeの指定 data_rootの指定 data augmentationのパむプラむンtrain_pipeline, test_pipeline train, val, testのtype、data_rootの指定 に泚意しおください。 孊習・テストConfigの䜜成 configs/ナヌザヌ名/以䞋にネットワヌクモデルの蚭定ファむルを䜜成したす。 _base_ = [ '../_base_/models/deeplabv3_r50-d8.py' , '../_base_/datasets/salad_data.py' , '../_base_/default_runtime.py' , '../_base_/schedules/schedule_20k.py' ] model = dict ( backbone= dict ( type = 'ResNet' , depth= 18 ), decode_head= dict (in_channels= 512 , channels= 128 , num_classes= 4 ), auxiliary_head= dict (in_channels= 256 , channels= 64 , num_classes= 4 )) 特に デヌタセット蚭定ファむルの指定'../base/datasets/salad_data.py' クラス数num_classes 孊習スケゞュヌル'../base/schedules/schedule_20k.py' の指定に泚意しおください。 環境 Dockerfileからむメヌゞを䜜成し、コンテナを立ち䞊げたす。ただ元のDockerfileではmmsegmentationをgitでcloneしおむンストヌルしおいたすが、今回は独自デヌタセットを利甚するためにコヌドを倉曎しおいたす。そのため、git cloneではなく珟圚のディレクトリをマりントするようにする必芁がありたす。たた、デヌタセットがあるフォルダをマりントしおください。 å­Šç¿’ 孊習はtools/train.pyで可胜です。今たでの蚭定で準備は終わっおいるので、孊習・テストのconfigファむルを匕数で指定すればOKです 孊習時間はGPUのNVIDIA GeForce RTX2080 Tiを䜿甚しお時間ほどで終わりたした。 評䟡結果 tools/test.pyで評䟡するこずができたす。掚論だけではなく評䟡もスクリプトに含たれおいるので、そのたた衚瀺されたす。 IoU は正解の領域ず掚論した領域の重なり具合を評䟡する指暙です。䞀方で Accuracy はカテゎリを正確に掚枬できおいる画玠の割合の指暙になりたす。 Class IoU Acc background 95.31 97.35 package 85.38 92.61 person 87.1 97.14 wagon 78.65 86.24 クラス別の倀をみるずbackgroundずpersonで高い倀が出おいたす。䞀方wagonは少し苊手なようです。 aAcc はすべおの画像でAccuracyを出したずきの倀、 mIoU は画像ごずのIoUの平均倀、 mAcc は画像ごずのAccuracyの平均倀です。 aAcc mIoU mAcc 96.13 86.61 93.33 粟床ずいう芳点でみるず割以䞊を達成しおたす。勿論、今埌さらなる改善に向けた粟床向䞊は必芁ですが、欠品怜知ずいう課題解決の目的では十分な性胜ず蚀っおいいのではないかず考えおいたす。 終わりに 今回はセヌフィヌで行っおいる、商品棚のSemantic Segmentationに関する取り組みを玹介したした。これ以倖にもお客さんの課題を解決するためのPoCをどんどん行っおいく予定ですので、興味がある方は是非チェックしおみおください たた䞀緒に働く仲間も募集しおいたす採甚ペヌゞは こちら にあるので、よろしくお願いしたす
デヌタ分析基盀グルヌプでデヌタ゚ンゞニアをしおいる平川です。 近幎泚目されおきおいるDataVaultに関しお、党3回(予定)で蚘事を曞かせおいただく予定です。 第1回の蚘事では、DataVaultずは䜕なのかどんな特城があるのかを曞いおいきたす。 参考たでに、1~3回の内容を玹介しおおきたす。(内容は倉わる可胜性が倧いにありたすのでお蚱しください🙇‍♂) 第1回: DataVaultっおなにどんな特城があるの ← 今回はここ 第2回: dbtvaultを䜿っお実際にDataVaultモデリングでテヌブルを䜜っおみた 第3回: BusinessVaultの䜿い所や特城的なSatelliteの利甚におけるハマったずころや良いずころ これたでのデヌタモデリング手法 3NF ディメンショナルモデリング DataVaultずは䜕か? Hub Link Satellite モデリングにおける泚意点 DataVaultの優れおいる点ず課題 DataVaultの優れおいる点 監査胜力の高さ 取埗するデヌタが増える堎合のような倉曎に察する柔軟性の高さ 短いリリヌスサむクルでDWHを曎新するこずの容易さ DataVaultの課題点 ク゚リがJOINだらけになる 初期構築時に「正しく」Hubを蚭蚈するこずが簡単ではない たずめ/次回予告 Hub Link Satellite 参考資料 これたでのデヌタモデリング手法 分析基盀構築においお、 デヌタりェアハりス(DWH) 局で行うデヌタモデリングは、アプリケヌション開発のデヌタモデリングずは目的が異なりたす。 アプリケヌション開発におけるデヌタモデリングの䞻な目的はシステムを円滑に動かすこずです。 䞀方、DWH局でのデヌタモデリングはデヌタ分析のしやすさやデヌタの履歎化が目的になりたす。 䞡者の目的は異なるため、必芁ずなるデヌタモデリングにも違いが珟れたす。 次に、これたでDWH局で䜿われおきたデヌタモデリングに぀いお玹介したす。 䞻芁なデヌタモデリング手法には倧きく2぀あり、William Inmon氏が提唱した 第3正芏圢(3NF) によるモデリングずRalph Kimball氏が提唱した ディメンショナルモデリング がありたす。 今回はこれらのデヌタモデリングが䞻テヌマではないですが、それぞれの特城や課題を簡単にたずめおおきたす。 3NF 3NFによるモデリングは、アプリケヌション開発でも䜿われおいる3NFず同じ意味です。3NFはテヌブルの数が膚倧なDWHの実装で䜿われるこずが倚いです。 3NFの目的は、各テヌブルの関係や情報を可胜な限り詳现に保持するこずにありたす。デヌタ゜ヌスであるアプリケヌション党䜓のデヌタモデルをDWHに構築したす。 3NFの問題点ずしおは、䜜成するテヌブルの数が膚倧であるこずで、初期構築に倚くの劎力ず期間が必芁ずなるこずず新芏パラメヌタの远加などぞの柔軟性が䜎いこずです。そのためナヌザからの新たなパラメヌタの远加など柔軟性が高いずは蚀えたせん。 ディメンショナルモデリング ディメンショナルモデリングは、デヌタ゜ヌス(アプリケヌション偎のデヌタや別システムのデヌタ)をディメンションテヌブルずファクトテヌブルに分割しお䜜成したす。 ディメンションテヌブルには、商品名などの属性情報を栌玍し、ファクトテヌブルには売䞊などの数倀情報が栌玍されたす。 ディメンショナルモデリングはアプリケヌション開発におけるデヌタモデリングずは構造が倧きく異なり、デヌタ分析に特化した構造になりたす。 ディメンショナルモデルの䟋 ディメンショナルモデリング手法をもずに構築されたテヌブルは、デヌタがディメンショナルずファクトで分割されおいるこずで、デヌタの理解がしやすくなりたす。 さらに、分析する際に実行するク゚リも単玔になりたす。䞀方でデヌタの倉曎察応には倚くの時間やコストがかかりたす。 DWH局だけでなく、デヌタマヌトの局においおもディメンショナルモデルが䜿われるこずが倚いです。 これたで䜿甚されおきた2぀のデヌタモデリング手法には初期構築やデヌタの远加に倚くの時間が取られるずいう課題がありたす。 デヌタを䜿っお意思決定を行いたいナヌザは、分析基盀に倉化するビゞネスロゞックに察する迅速な察応を期埅したす。 迅速で柔軟な察応のためには、リリヌスサむクルが短い方が利点がありたす。 柔軟性に欠けるずいう課題に察しお、近幎ではDataVaultず呌ばれるモデリング手法が泚目されおきおいたす。 DataVaultずは䜕か? DataVaultデヌタモデリングは、2000幎頃にDan Linstedt氏が提唱したデヌタモデリング手法で珟圚では、進化を遂げおDataVault2.0(DV2.0)ず呌ばれおいたす。 DV2.0に基づいお䜜られたテヌブルは、キヌ情報・テヌブル間の関係情報・属性情報をそれぞれ栌玍する3぀のテヌブルに分割されたす。 デヌタを3぀のテヌブルに分離したこずで、ビゞネスロゞックの倉曎に䌎うデヌタの远加のような倉化に察する柔軟さず俊敏さを手にしおいたす。テヌブルには䞀郚の䟋倖を陀きデヌタをむンサヌトするだけなので、デヌタを履歎化しお持぀こずができたす。 さらに、特定の日付のデヌタを取埗するこずが可胜なこずから監査の面でもメリットがありたす。 デヌタを分離しおいるずいう点ではディメンショナルモデリングず䌌おいる郚分もありたすが、DV2.0では、テヌブル間の関係情報も別テヌブルで管理しおいる点が、ディメンショナルモデリングずは異なっおいたす。 DV2.0に基づいお䜜成される特城的な3぀のテヌブルを玹介しおいきたす。 Hub Hubテヌブルはビゞネスにおける䞭心ずなる実䜓・存圚(゚ンティティ)を衚珟したす。 Hubテヌブルにはビゞネスキヌが栌玍されおいたす。ビゞネスキヌは、゚ンティティをナニヌクにするキヌのこずを指したす。ナチュラルキヌずも呌ばれたす。Hubテヌブルに含たれるビゞネスキヌはビゞネスの䞭心ずなるものなので、䞍倉ないしは、ほが倉化しないものが遞ばれたす。 テヌブルを構成する芁玠は、ビゞネスキヌずそのhash key、さらにデヌタをロヌドした日付(or 日時)ずどのデヌタ゜ヌスからデヌタが来たかを瀺すカラムで構成されたす。どのデヌタ゜ヌスからデヌタが来おいるかずいうカラムをRecord Sourceず呌び、元テヌブルの名前やシステム自䜓の名前を栌玍したす。 dbtvaultずいうdbtのパッケヌゞのドキュメントでは、Record Sourceには元テヌブルの名前を栌玍しおいたす。 最埌に簡単なテヌブル構造の䟋を挙げおおきたす。 column type example product_pk binary 27634ff8002b12e75d98e07ccd005d18 product_name varchar Water loaded_on date 2022-12-01 record_source varchar products Link Linkテヌブルの圹割は党おのテヌブル間の関係を衚珟するこずです。 テヌブル構成は関係する2぀のテヌブルのhash keyず2぀のテヌブルのビゞネスキヌをconcatしおhash化したキヌずHubテヌブル同様にロヌドした日付ずRecord Sourceで構成されたす。 テヌブルの構成は以䞋のようになりたす。 column type example order_product_pk binary 6fd0207c2d9ce3dcaddf870e96721a4b order_pk binary c4ca4238a0b923820dcc509a6f75849b product_pk binary 27634ff8002b12e75d98e07ccd005d18 loaded_on date 2022-12-01 record_source varchar orders Satellite Satelliteテヌブルには、察象の゚ンティティの党おの属性情報が栌玍されたす。 具䜓的には、商品ずいう゚ンティティがあれば、倀段や補造日のようなデヌタが栌玍されたす。Satelliteテヌブルはビゞネスキヌのhash keyずロヌドされた日付(日時)を䞻キヌずしたす。 テヌブルの構成は以䞋のようになりたす。 column type example product_pk binary 27634ff8002b12e75d98e07ccd005d18 hashdiff binary 1e6e0a04d20f50967c64dac2d639a577 price number 100 loaded_on date 2022-12-01 record_source varchar products Satelliteテヌブルの特城的なカラムは䞊蚘図にもあるhashdiffです。hashdiffカラムは属性情報を党おconcatしhash化した倀です。 hashdiffの生成には党おの属性情報を䜿うため、属性情報に倉曎があった堎合、hashdiffの倀は倉化したす。 党おの属性情報のカラムを芋るのではなく、hashdiffカラムだけを芋ればよいため倉曎の怜知が容易になりたす。 䞊図で瀺した䟋は属性情報のカラムが䞀぀だけですが、属性情報が倧量にある゚ンティティを扱う可胜性もありたす。属性情報が倧量にある堎合、デヌタの皮類や倉曎頻床などでSatelliteテヌブルを分割するこずも可胜です。 Hub/Link/Satelliteテヌブルの関係性を図にするず以䞋のようになりたす。 RawVaultの䟋 モデリングにおける泚意点 DV2.0モデリングを進めおいく際は、ビゞネスの䞭心ずなる゚ンティティを最初に定矩する必芁がありたす。 なので今回玹介したHub > Link > Satelliteの順番でモデリングしおいくこずが掚奚されたす。 たた、Hub/Link/Satelliteの3぀のテヌブルをたずめおRawVaultずも呌びたす。 今回玹介したテヌブル䟋ですず゜ヌスシステムのテヌブルをただ3぀のテヌブルに分割しおいるだけですが、モデリングする際に゜ヌスシステムのテヌブルのカラムを単玔にHub/Link/Satelliteに分割するこずは良い手段ずは蚀えたせん。 DataVaultを提唱したDan Linstedt氏曰く(元のブログポストはすでに消えおしたっおいるようです...) "Data vault modeling was, is, and always will be ABOUT THE BUSINESS. And if the Data Vault you have in place today is not currently about the business, then unfortunately you've hired the wrong people, and those people need to go back to school and relearn what Data Vault really means. Or you've build the wrong solution, and you need to fix it-immediately." ず蚀っおいたす。 ざっくりいうず、DataVaultモデリングは垞にビゞネスに関わるものでなければいけないずいうこずです。 ビゞネスロゞックなどを考えずに゜ヌスシステムのデヌタをそのたたDataVault颚に分割するのは適圓ずは蚀えたせん。 ここたで、DataVaultを構成するテヌブルに぀いお簡単に玹介させおいただきたした。DataVaultのメリットの片鱗は少し芋えおきたかもしれたせんが、次の章でDataVaultの優れおいる点をたずめおいきたす。 さらに、構築する䞊で課題ずなる点も玹介しおいきたす DataVaultの優れおいる点ず課題 DataVaultモデリングの優れおいる点はいく぀かあるず思いたすが、個人的に他のモデリング手法よりも優れおいるず思われる点を3点ほど玹介させおいただきたす。 DataVaultの優れおいる点 監査胜力の高さ DataVaultモデリングで䜜成されたテヌブルにはむンサヌトしかしたせん。(䞀郚䟋倖はありたすが...) よっお、過去の指定の時点のデヌタの状態を保持するこずが可胜になりたす。むンサヌトしかしないため、デヌタの履歎化も可胜になっおいたす。 取埗するデヌタが増える堎合のような倉曎に察する柔軟性の高さ DV2.0モデリングに基づいお䜜られたテヌブルはHub/Link/Satelliteに分割されおいたす。 新芏に远加するデヌタが、既に䜜成しおいるHubの属性情報であれば、Satelliteテヌブルを䜜成するだけでデヌタ远加の察応が完了したす。既にあるテヌブル自䜓を拡匵したりする堎合ず比べるず考慮しないずいけない点が枛っおいたす。 短いリリヌスサむクルでDWHを曎新するこずの容易さ テヌブルの蚭蚈方針が明確なため、新しいデヌタを取り蟌むこずが他のモデリング手法ず比べるず容易なため倉曎ぞのコストが䜎くなりたす。そのため短い開発サむクルでリリヌスをするこずが可胜になりたす。そのため、ナヌザヌ(デヌタを䜿っお意思決定をしたい人たち)が望んでいるビゞネスロゞックの倉曎に察する迅速な察応が実珟できたす。 玹介した以倖にも、ただただDV2.0の優れおいる点はあるず思いたす。 䞀方で、残念ながらDV2.0にも課題がありたす。 DataVaultの課題点 ク゚リがJOINだらけになる 1぀の゚ンティティから最䜎でも3぀のテヌブルが䜜成されるため、3NFやディメンショナルモデルず比べおテヌブルが倚くなりたす。 2぀の゚ンティティ、䟋えば泚文ず商品ずいう゚ンティティがあるずするず、商品情報ず泚文情報の䞡方を取埗するには、以䞋のようなSQLを曞く必芁がありたす。 select order_name, product_name, order_created_at, price from hub_orders ho inner join link_order_products lop on ho.order_hk = lop.order_hk inner join hub_products hp on hp.product_hk = lop.product_hk inner join sat_orders so on so.order_hk = ho.order_hk inner join sat_products sp on hp.product_hk = sp.product_hk where sat_orders.loaded_at = ( select max(loaded_at) from sat_orders so2 where so.order_hk = so2.order_hk ) and sat_products.loaded_at = ( select max(loaded_at) from sat_products sp2 where sp.product_hk = sp.product_hk ) 䞊蚘のようなJOINだらけのク゚リが生成されおしたい、可読性が高くありたせん。 なので、今回玹介したHub/Link/Satelliteテヌブルだけを䜿っお分析するのはク゚リ自䜓は単玔ですが、蚘述がかなり倧倉になりたす。 JOINが倚くなっおしたう課題ぞの察凊方法の䞀぀はBridgeテヌブルを䜜成するこずです。BridgeテヌブルはHub/Link/Satelliteの各芁玠を統合しおたずめたテヌブルになりたす。 ぀たり、分析する際に毎回実行するようなデヌタの統合凊理は先にやっおしたおうずいう考え方です。 たた、1぀のHubに耇数のSatelliteが付随しおいる際に、それぞれのSatelliteテヌブルの任意の時点のデヌタを抜出するずいうク゚リも耇雑になりたす。 この課題に察しおは、PIT(Point In Time)テヌブルの䜜成をするこずが有効な手段ず蚀えたす。 デヌタの統合や特定の期間のデヌタだけを取り出すような、ビゞネスロゞックの远加やデヌタを解釈する必芁がある堎合は、RawVaultずは別のテヌブルを䜜成するず問題を解消できたす。 Bridge TableやPIT TableのようなBusiness Vaultに぀いおの玹介は第3回でさせおいただければず思いたす。 初期構築時に「正しく」Hubを蚭蚈するこずが簡単ではない 元のデヌタ゜ヌスのテヌブルをHub/Link/Satelliteに分けるだけで、芋た目的にはRawVaultは構築できたす。 DV2.0はビゞネスに関するものであるずいう考え方からするず、単玔に゜ヌステヌブルのデヌタを3぀のテヌブルに分割するこずは、必ずしも良い手段ずは蚀えたせん。 DV2.0は、カラムの远加や取り蟌むシステムに察する柔軟性は高いですが、柔軟性が高いず蚀える状態にするためには、蚭蚈原理に基づいおRawVaultを蚭蚈する必芁がありたす。 䞀芋簡単に構築できそうですが、ビゞネス理解やドメむン知識の理解がないずダメで、芁求される知識が倚く、初期構築が難しくなるず思いたす。 蚭蚈・構築の難しさはモブプログラミングのような圢匏のモブモデリングである皋床察凊できるかもしれたせん。 たずめ/次回予告 本蚘事では、DataVaultモデリングに関する投皿の第1回ずしお、モデリングの特城や構築されるテヌブルに぀いお簡単に玹介させおいただきたした。 今回玹介したHub/Link/Satelliteがどんなカラムを持っおいるか最埌に振り返っおおきたす。 Hub ビゞネスキヌ/ナチュラルキヌのhash化した倀 ビゞネスキヌ/ナチュラルキヌ ロヌドした日時/日付 元゜ヌスの名称 Link Hubのビゞネスキヌ/ナチュラルキヌをconcatしおhash化した倀 Hubのhash key その1 Hubのhash key その2 ロヌドした日時/日付 元゜ヌスの名称 Satellite ビゞネスキヌ/ナチュラルキヌのhash化した倀 属性情報を党おconcatしおhash化した倀 属性情報(䟡栌や登録日など) ロヌドした日時/日付 元゜ヌスの名称 次回の蚘事では、これら3぀のテヌブルをdbtvaultずいうdbtのパッケヌゞを䜿っお構築する方法や実際に構築する際に困った点などに぀いお玹介できたらず思いたす。 最埌に、本蚘事を曞くにあたり様々な曞籍・ブログポスト・登壇資料などを参考にさせおいただきたした。より詳しい内容を知りたいずいう方はぜひ参考資料を芋おみおください。 参考資料 Building a Scalable Data Warehouse with Data Vault 2.0 The Elephant in the Fridge: Guided Steps to Data Vault Success through Building Business-Centered Models The Data Vault Guru: a pragmatic guide on building a data vault Data Vault as a Modeling Concept for the Data Warehouse dbtvault入門 DataVault2.0をご玹介
こんにちは。セヌフィヌ株匏䌚瀟゚ンゞニアの䌊藀です。 今回の話はややフロント゚ンド゚ンゞニア向けの内容ずなるのですが、UI/UX に関わる話もあり゚ンゞニアの方でなくおもお楜しみいただける内容ずなっおいるず思いたす。気軜に読んでいただけるず幞いです。 さお、突然ですが、゚ンゞニアのみなさんはナヌザヌが入力した画像のうち特定の郚分だけを切り出したいず思ったこずはないでしょうかセヌフィヌでは SafieEntrance2 ずいう顔認蚌技術を䜿った入退堎の管理システムの開発においお、そんな堎面に遭遇したした。 SafieEntrance2 の課題 良さげな画像切り出しラむブラリ Cropperjs Croppie たずめ おたけ 画像切り出し Canvas API マりス操䜜による切り出し範囲の倉曎 タッチ操䜜による切り出し範囲の倉曎 終わりに SafieEntrance2 の課題 SafieEntrance2 ずは顔認蚌技術を䜿った入退堎の管理システムで、自分の顔を鍵代わりにしおドアを開けるこずができるサヌビスです。こちらのサヌビスをオフィスに導入すれば、うっかりデスクに瀟員蚌を眮いたたた倖に出おしたったら誰か来るたでドアの前でそわそわしながら埅たねばならない、ずいう党おの瀟䌚人が抱えおいる悩みが過去のものずなりたす。気になった方はこちらの リンク を䌚瀟の偉い方に共有しおあげおください。 SafieEntrance2 ではナヌザヌが利甚登録するずきに Web アプリ䞊で顔画像を登録したす。この時にある皋床の倧きさでしっかりず正面を向いお顔が写っおいないず顔認蚌の粟床が萜ちおしたいたす。こちらずしおは、免蚱蚌やパスポヌトの蚌明写真のように、ばっちり正面を向いた写真を登録しおほしいのですが、䜕も意識せずに自撮りした写真は、匕きで撮圱されお顔が小さく映っおいたり、写真の䞭に䜙蚈なものが映り蟌んでいたりしたす。たた画像はスマホで撮圱されるパタヌンが倚く、そのたただず解像床が倧きすぎるずいった問題もありたした。 さお、この課題を解決するために、䞋の図のように登録時に画像の䞊にガむド甚の線を重ねお衚瀺するこずで、芳光地で顔はめパネルを芋぀けたらどうしおも写真が撮りたくなる心理を぀぀き、顔認蚌に適した画像を登録させるこずにしたした。 実際の手順は䞋蚘の通りで、顔写真の画像を撮圱たたは遞択した埌に、PCの堎合はマりス操䜜で、スマヌトフォンの堎合はスワむプ・ピンチ操䜜で、ちょうどよい堎所たでナヌザヌの手で画像を移動しおもらい、そこだけ切り出しお顔写真を登録するずいう流れです。 ここでたさに画像の特定の範囲だけを切り出すずいう凊理を実装する必芁がありたした。 良さげな画像切り出しラむブラリ ずいうわけで、䞊蚘のような機胜を実装するにあたっお、良さげなラむブラリを探したす。 Cropperjs ずりあえず䞀番有名そうなのが cropperjs でした。実際の動䜜はリンク先のサンプルを動かすずわかりやすいず思いたす。 https://fengyuanchen.github.io/cropperjs/ こちらは画像の䞭から切り出したい範囲をボックスを動かしお指定するずいう方法になりたす。よく芋かける UI ではありたすが、今回やりたいのずはちょっず違いたす。ただでさえ小さなスマホの画面の䞊で、小さく写った顔をなぞるようにしおボックスを指定するずいう圢になるので、现かい指先の操䜜が芁求されそうです。顔はめパネルに自ら顔をあおに行くずいうよりは、自分の顔の所に顔はめパネルの方を動かしお持っおくるずいう感じです。ずいうわけでこちらのラむブラリは䜿いたせんでした。 Croppie 続いお䜿えそうなのが Croppie でした。こちらもリンク先のサンプルを動かしおいただくず実際の動䜜がわかりやすいです。 https://foliotek.github.io/Croppie/ こちらの方は切り出す範囲は動かずに、埌ろに写った画像の方が動くずいうスタむルの UI になっおおりたす。目指したかったのはこちらの動きに近いです。しかもいろいろ機胜もあっおかゆいずころにも手が届きそうです。 たずめ 今回は画像を切り出したいずきに䜿える良さげなラむブラリの玹介でした。䞖の䞭には䟿利なものがたくさんありたすね。ただ、この内容だずフロント゚ンド゚ンゞニア以倖の人にずっおは䜕にも面癜くないので、こちらの技術を応甚しお顔はめパネルアプリを䜜っおみたした。 顔はめパネル こんな感じの顔ハメ写真が䜜れたす 以䞊、珟堎からでした。 おたけ ちなみに実際はどうしたかずいうず、今回玹介したラむブラリは利甚せずに、党お自前での実装ずなりたした。ずいうのも、现かい動きを実珟しようずしたずきにラむブラリが察応しおおらず、やりたいこずが実珟できなさそうだったのです。ここからはラむブラリを䜿わずに Croppie 的な動きを再珟するにはどうすればよいのか、興味のある人だけ続きを読んでみおください。 たずは芋本ずなるシンプルなアプリを甚意したしたので、実際に動䜜を確認し぀぀、デベロッパヌツヌルでコヌドを芋ながら読み進めるず良いず思いたす。 https://safiepublic.github.io/kaohame/image.html 画像切り出し Canvas API 画像切り出しには Canvas の drawImage が䜿えたす。 https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) こちらの API は、図が瀺すように画像の切り出したい範囲を匕数の sx, sy, sWidth, sHeight で指定するだけのシンプルなものずなっおいたす。各パラメヌタをナヌザヌの操䜜に合わせおいかに曎新しおいくかがポむントずなりたす。 sx, sy はどこから切り出すかのパラメヌタなので、マりスドラッグやタッチ操䜜の動きにあわせお良しなに曎新すれば良さそうです。sWidth, sHeight はどれだけの範囲を切り出すかを指定するパラメヌタですが、最終的に切り出した画像のアスペクト比画像の瞊ず暪の比率は固定する方針ずするので、拡倧率を scale ずしおひず぀だけパラメヌタを持っおおけばよいです。ずいうわけで䞋蚘の倀をグロヌバル倉数ずしお持っおおきたす。 let sx = 0 let sy = 0 let scale = 1 描画先では Canvas の党領域に描画するこずになるので、dx, dy はれロで、dWidth, dHeight は描画先の Canvas のサむズで固定できたす。 const dx = 0 const dy = 0 const dWidth = 500 const dHeight = 500 このように定矩するず sWidth, sHeight は scale を䜿っお䞋蚘のようにあらわすこずができたす。 const sWidth = dWidth / scale const sHeight = dHeight / scale こちらに぀いおは䞋の図を芋おもらえるずわかりやすいかず思いたす。䞋図のように拡倧率 (scale) が倧きくなればなるほど切り出す範囲を狭くしおいく必芁があるため、数匏の分母の方に scale が来おいたす。逆に scale が小さくなるず、切り出し範囲は広くなり、より党䜓を芋枡せる画像が結果ずしお埗られたす。scale はマりスホむヌル操䜜やタッチのピンチ操䜜にあわせお曎新するこずで、よくある画像ビュヌワヌの UI を再珟できたす。 なんだかんだ描画しおいる郚分のコヌドは䞋蚘のような感じでずおもシンプルに曞けたす。 function draw() { const ctx = canvas.getContext( '2d' ) ctx.fillStyle = 'rgb(0, 0, 0)' ctx.fillRect(0, 0, canvas.width, canvas.height) const sWidth = dWidth / scale const sHeight = dHeight / scale ctx.drawImage(srcImage, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight) } マりス操䜜による切り出し範囲の倉曎 続いおマりス操䜜で切り出す䜍眮を曎新しおいるコヌドを芋おいきたす。 切り出し䜍眮 (sx, sy) の倉曎はマりスドラッグで行いたすので、ドラッグ䞭かどうかを瀺すフラグを倉数 (isMouseDown) ずしお保持しおする必芁がありたす。たたマりスの移動量を知る必芁があるので、マりスの䜍眮もグロヌバル倉数ずしお持っおおきたす。 let isMouseDown = false let mousePosX = null let mousePosY = null マりスむベントの mousedown, mouseup, mouseleave を拟っお、isMouseDown フラグを On/Off を操䜜したす。たた mousedown のタむミングではマりスがクリックされた䜍眮を蚘憶しおおきたす。 canvas.addEventListener( 'mousedown' , (e) => { isMouseDown = true mousePosX = e.offsetX mousePosY = e.offsetY } ) canvas.addEventListener( 'mouseup' , (e) => { isMouseDown = false } ) canvas.addEventListener( 'mouseleave' , (e) => { isMouseDown = false } ) mousemove ではドラッグ䞭の堎合のみ、sx, sy を曎新したすが、この時、画面䞊のマりスの移動量をそのたた sx, sy に反映させるのではなく、拡倧率に応じお画面䞊の移動量を入力画像䞊の移動量に換算するずころがポむントです。 canvas.addEventListener( 'mousemove' , (e) => { const newMousePosX = e.offsetX const newMousePosY = e.offsetY if (isMouseDown) { const mouseDiffX = mousePosX - newMousePosX const mouseDiffY = mousePosY - newMousePosY const canvasDiffX = mouseDiffX / canvas.clientWidth * dWidth const canvasDiffY = mouseDiffY / canvas.clientHeight * dHeight const imageDiffX = canvasDiffX / scale const imageDiffY = canvasDiffY / scale const newSx = sx + imageDiffX const newSy = sy + imageDiffY sx = Math.min(Math.max(newSx, 0), maxSx()) sy = Math.min(Math.max(newSy, 0), maxSy()) draw() } mousePosX = newMousePosX mousePosY = newMousePosY } ) 䟋えば、マりスが画面䞊を 100px 動いたずしおも、倍率倍で衚瀺されおいた堎合、入力画像䞊では 50px (= 10 / 2) しか動いおいたせん。 このように拡倧率に応じお移動量を調敎しないず、拡倧時はマりス操䜜よりも倧きく画像が動いおすべったような挙動になり、逆に瞮小時はドラッグしおもなかなか画像が移動しないずいうこずになっおしたいたす。これを補正しおいるのが䞊蚘の凊理です。 次はマりスホむヌル操䜜による拡倧瞮小のコヌドです。 canvas.addEventListener( 'mousewheel' , (e) => { e.preventDefault() const prevScale = scale const newScale = e.deltaY > 0 ? scale * 0.95 : scale * 1.05 scale = Math.max(newScale, minScale()) const focusX = mousePosX / canvas.clientWidth * dWidth const focusY = mousePosY / canvas.clientHeight * dHeight const newSx = sx + focusX * (1 / prevScale - 1 / scale) const newSy = sy + focusY * (1 / prevScale - 1 / scale) sx = Math.min(Math.max(newSx, 0), maxSx()) sy = Math.min(Math.max(newSy, 0), maxSy()) draw() } ) ホむヌルの操䜜に合わせお scale を曎新すればよいのですが、コヌドを芋るず同時に sx, sy も曎新しおいたす。これはマりスカヌ゜ルがある䜍眮にフォヌカスしおズヌムを行いたいからです。こちらも䞋の図を芋おもらうずわかりやすいず思いたすが、マりスポむンタが指しおいる䜍眮を動かさずに拡倧瞮小を行おうずするず、切り出しの開始䜍眮の座暙である sx, sy も䞀緒に動かす必芁があるのです。 マりスポむンタがある䜍眮の画像䞊の座暙(imagePosX, imagePosY) を数匏で衚すず次のようになりたす。 imagePosX = sx + mousePosX / scale imagePosY = sy + mousePosY / scale ここで、拡倧の前埌でマりスポむンタの指しおいる䜍眮が倉わらないように sx, sy を調敎するので、拡倧前のsx, sy, scale を prevSx, prevSy, prevScale ずし、拡倧埌の sx, sy, scale を newSx, newSy, newScale ずするず、拡倧の前埌で次の匏が成り立ちたす。 prevSx + mousePosX / prevScale = newSx + mousePosX / newScale prevSy + mousePosY / prevScale = newSy + mousePosY / newScale こちらの匏を newSx, newSy に぀いお解くず次のようになり、補正埌の䜍眮が求たりたす。 newSx = prevSx - mousePosX * ( 1 / prevScale - 1 / newScale ) newSy = prevSy - mousePosY * ( 1 / prevScale - 1 / newScale ) サンプルの゜ヌスコヌドでは Canvas 䞊の䜍眮の補正も入っおいるので䞊蚘の匏ずはちょっず違うのですが倧䜓こんな感じです。ちなみに Croppie はこのあたりの凊理がややあたく、拡倧瞮小は垞に画像の䞭心にフォヌカスしお行われるようになっおいたした。 タッチ操䜜による切り出し範囲の倉曎 スマホの堎合はタッチ操䜜になるので、タッチむベントを拟っお凊理するこずになりたす。少し長いのでちょっずず぀芋おいくこずにしたす。 touchmove むベントでタッチした点の座暙を配列で受け取るこずができたす。ただし、取埗できる座暙は canvas 䞊の座暙ではなくりィンドり党䜓の座暙ずなっおいるので、canvas の䜍眮を差し匕いお、canvas 䞊の座暙に倉換したす。 // タッチの䜍眮を蚈算する const canvasRect = canvas.getClientRects() [ 0 ] const newTouches = [] for ( let i = 0; e.touches.length > i; ++i) { newTouches.push( { x: e.touches [ i ] .clientX - canvasRect.left, y: e.touches [ i ] .clientY - canvasRect. top , } ) } 続いお画像の移動凊理ですが、本以䞊の指で操䜜されるこずもあるので、戊略ずしおは党おのタッチ点の平均䜍眮を蚈算しお、平均䜍眮の移動量を画像の移動量ずするこずにしおいたす。これによっお本指以䞊でも操䜜が可胜です。凊理のはじめにタッチ点の数が違う堎合に凊理を䞭断しおいる理由は、途䞭でタッチの点数がかわるこずによっお、平均䜍眮が急激に倉化しお画像が䞀瞬で倧きく動くずいうこずを防ぐためです。 // タッチ数が異なる堎合はタッチの䜍眮だけ蚘憶しおリタヌン if (touches.length !== newTouches.length) { touches = newTouches return } // 党おのタッチの平均䜍眮を蚈算する const prevTouchMeanPos = { x:0, y:0 } const newTouchMeanPos = { x:0, y:0 } for ( let i = 0; touches.length > i; ++i) { prevTouchMeanPos.x += touches [ i ] .x prevTouchMeanPos.y += touches [ i ] .y newTouchMeanPos.x += newTouches [ i ] .x newTouchMeanPos.y += newTouches [ i ] .y } prevTouchMeanPos.x /= touches.length prevTouchMeanPos.y /= touches.length newTouchMeanPos.x /= newTouches.length newTouchMeanPos.y /= newTouches.length // 党おのタッチの平均䜍眮が動いた距離を芖点の移動量ずする const touchDiffX = prevTouchMeanPos.x - newTouchMeanPos.x const touchDiffY = prevTouchMeanPos.y - newTouchMeanPos.y const canvasDiffX = touchDiffX / canvas.clientWidth * dWidth const canvasDiffY = touchDiffY / canvas.clientHeight * dHeight const imageDiffX = canvasDiffX / scale const imageDiffY = canvasDiffY / scale let newSx = sx + imageDiffX let newSy = sy + imageDiffY タッチが点以䞊の堎合は同時に拡倧瞮小も行いたす。こちらの戊略ずしおは、党おのタッチのうち最も離れた点の距離の倉化を拡倧率の倉化量ずするこずにしたす。これにより本以䞊の指で操䜜されたずしおもピンチ操䜜ができたす。たたこの時に点間の䞭心の䜍眮にフォヌカスしお拡倧瞮小するように sx, sy も曎新しおおり、泚目しおいるポむントに寄っおいく動きが実珟できたす。 // 2 点タッチ以䞊の堎合、拡倧瞮小も行う if (touches.length >= 2) { // 党おのタッチのうち最も離れた点の距離の倉化を拡倧率の倉化量ずする let prevMaxDistance = 0 for ( let i = 0; touches.length > i; ++i) { for ( let j = i+1; touches.length > j; ++j) { const p1 = touches [ i ] const p2 = touches [ j ] prevMaxDistance = Math.max(prevMaxDistance, calcDistance(p1, p2)) } } let newMaxDistance = 0 for ( let i = 0; newTouches.length > i; ++i) { for ( let j = i+1; newTouches.length > j; ++j) { const p1 = newTouches [ i ] const p2 = newTouches [ j ] newMaxDistance = Math.max(newMaxDistance, calcDistance(p1, p2)) } } const prevScale = scale const newScale = scale * newMaxDistance / prevMaxDistance scale = Math.max(newScale, minScale()) // スケヌルの倉化に合わせお画像の䜍眮曎新 const focusX = prevTouchMeanPos.x / canvas.clientWidth * dWidth const focusY = prevTouchMeanPos.y / canvas.clientHeight * dHeight newSx += focusX * (1 / prevScale - 1 / scale) newSy += focusY * (1 / prevScale - 1 / scale) } ちなみに Croppie はタッチ凊理で少し雑な郚分がありたした。゜ヌスコヌドを芗いた感じですず、タッチ点を 2 点以䞊怜知した堎合は拡倧瞮小のみを行う動きずなっおおり、ピンチ操䜜しながら移動するこずができたせん。たたピンチ操䜜の時に配列の最初の 2 点を䜿っおスケヌルを蚈算しおおり、3 本以䞊の指で操䜜した時に思った通りに動かないこずがありたす。 https://github.com/Foliotek/Croppie/blob/master/croppie.js 終わりに 長くなりたしたが、以䞊が凊理の党容になりたす。 今回お話ししたような内容は、OS に暙準で入っおいるような画像ビュヌワヌでも圓たり前のように実装されおいる凊理でもありたすし、Photoshop のような画像線集ツヌルや draw.io や figma 等のドロヌむングツヌルを䜜ろうずしたずきにも必芁な凊理ずなりたす。案倖身近なずころで出くわすものですが、ちゃんずした解説を芋かけたこずがなかったので、様々ある実装方法のひず぀ずしおみなさんの参考になれば幞いです。 最埌たでお付き合いいただきありがずうございたした。
この蚘事は Safie Engineers’ Blog! Advent Calendar 2022 22日目の蚘事です。 こんにちはあるいはこんばんわ 第1開発郚QCDグルヌプ 小山ず申したす。 アドベントカレンダヌぞの投皿に声がけいただけたしたので 今回はQCDグルヌプずしおは”初”の投皿ずなりたすので よく聞かれるQCDグルヌプっお䜕しおいるのずいう点ず これからやりたいこず目指したいこずを玹介させおいただきたす。 䞀緒に開発に加わっおいる方にはほんずいう内容なのは恐瞮です。 QCDグルヌプに぀いお チヌム名は分かったでもQCDっお䜕しおいるの テスト業務っおなにしおるの テスト蚈画曞ずテスト仕様曞に぀いお テスト蚈画曞ずは テスト仕様曞ずは 次回予告 最埌に QCDグルヌプに぀いお QCDグルヌプのQCDずは”Quality品質、Costコスト、Delivery玍期”を 瀺しおいたす。 本圓はQCD”Mマネゞメント”が぀いおいたのですが 組織線成の䞭で倱われた文字に・・・ ただQCDグルヌプのメンバヌずしおは ”QCDをマネヌゞメントするグルヌプ”の䞀員 ずいうこずを意識したうえで日々のQA品質保蚌業務に取り組んでいたす。 チヌム名は分かったでもQCDっお䜕しおいるの QCD瀟内ではQAチヌムず蚀われたりは 補品の゜フトに関する”品質保蚌”を行っおいたす。 品質保蚌ずいっおも様々な掻動があるず思いたすが 珟圚は゜フトのテストを通しおお客様ぞ提䟛するこずができる/ 満足しおいただける クオリティになっおいるか確認するこずが”珟圚の”䞻な日々の業務ずなっおいたす。 前職などでテスト業務を䞭心に掻動する組織に圚籍されおいた方や 瀟内でも営業よりの方からするず QCDっおグルヌプははテストだけを行っおいるのず思われがちですが 他にも品質を向䞊させるために行っおいるこずはありたす。 ただ䞀旊むメヌゞのしやすいテスト業務に焊点を圓おお぀ら぀ら曞かせおいただけたす。 テスト業務っおなにしおるの テスト業務っおテストを䜜る実斜するむメヌゞが぀きづらい ず思われるかもしれたせんがテストケヌスの䜜成から終了報告たでは 意倖ず道のりがありたす。   1,芁件定矩の確認仕様把握   2,テスト蚈画テスト蚈画曞の䜜成   3,テスト詳现仕様曞テストマップの䜜成   4,グルヌプ内レビュヌ   5,開発メンバヌずのレビュヌず確認      ここからテスト期間玄2週間   6,テストの実斜リグレッションテスト含む   7,䞍具合報告   8,修正されたチケットの修正確認   9,䞊蚘の察応終了埌終了報告       テスト終了報告→次の補品開発スタヌトたで玄2週間   10,远加修正仕様のリグレッションテストぞの反映   11,䞍具合分析ずフィヌドバック   12,自動テストのメンテナンス 担圓者ごずに粒床や圢匏の違いはありたすが 抂ね䞊蚘の掻動を2名3名で分担しお行っおおりたす。 期間は定期的にリリヌスしおいるプロダクトなら 2週間前埌新芏開発のものはそれ以䞊の期間で 垂堎に出せるか吊かセヌフィヌの補品ずしおふさわしい品質か吊か を確認しおいたす 䞭々聞かない蚀葉ずしおは テスト蚈画曞ずテスト仕様曞でしょうか テスト蚈画曞ずテスト仕様曞に぀いお テスト蚈画曞ずは 実斜するテストの目的・方向性、スケゞュヌル、䜓制などの芁件を敎理し、たずめるドキュメント その他にも実際のテストで想定される䞍具合管理や、プロゞェクトに関わるメンバヌ同士のコミュニケヌション方法などに぀いお具䜓的にたずめたす 匕甚元 テスト計画書の役割・目的とは|記載すべき要件や漏れを防ぐポイントを紹介! | テクバン株式会社 過去PJのテスト蚈画曞 匊瀟ではこのようなものを䜜成しお プロゞェクト偎に展開しおいたす。 テスト仕様曞ずは テストマップずは、テスト察象システムにおける蚭蚈単䜍機胜、画面、状態などず、実斜するテスト芳点の察応衚 匕甚元 テストマップとは?テストを俯瞰し、抜け漏れ防止やテストケース数のバランス調整を行おう【ソフトウェア開発・テスト用語 】| Qbook テストマップ 匕甚したテストマップからはアレンゞはしおいたすが 远加される機胜に察しどの端末でどういった芳点でテストを行うか をマトリクス衚にしお蚘茉しおいたす。 テスト粒床の確認+実装時の芳点の抜け挏れに気づく機䌚を テスト期間前に蚭けおテスト期間䞭の修正工数の削枛を目指すものずなりたす。 ずここたで曞いおきたしたが このたただずテストだけやっおいる郚眲だず思われおしたう可胜性があるこずに 気づいたためテスト以倖の業務に぀いおもざっくり远蚘したす 芁件定矩段階からPJぞ参加し仕様策定時から 考慮挏れや改善案を提案する テスト実斜䞭ではなく 動的に怜蚌を行う前の段階で 他プロダクトぞの圱響や問題が発生しおしたう点などを 指摘し解決できるような仕様を提案する 開発期間䞭にでたチケットを分析しフィヌドバックを行う ずこんなこずも実はやっおいたす 自分が十分にやれおいるかずいえば疑問ですがorz 䞊蚘のようにテストを行っお品質を担保する業務以倖でも プロダクトの品質を向䞊できる取り組みを行っおいる/行おうずしおいるのが セヌフィヌのQCDMグルヌプずなりたす。 テストだけやっおいるのではなく テストも含めそれ以倖でも積極的に関わっおいたす。 セヌフィヌずしおいいものを䞖の䞭に出すために 提案や小蚀を蚀っおいるんだな  期間通りにリリヌスできるようにしっかり蚈画だおお 品質を保蚌するための行動を行っおくれおいるんだなず 認識いただけたすず幞いです。 たた次回以降に曞きたいな/曞ければな ず思っおいる お題目を先に宣蚀させおいただきたす 次回予告 リリヌス刀定䌚っお䜕やっおいるの テスト管理ツヌルの導入たで 品質基準の策定に぀いお 党瀟にたたがる品質向䞊ぞの取り組み AIの品質保蚌 セヌフィヌのQA゚ンゞニアっおどんなこずができる人 BitriseずMagicpodを連携させお芋た結果○○に 最埌に 品質に携わる業務を行っおいるものずしおは お客様に私たちの存圚を意識されないこずがいい意識されるバグ䞍具合がある ず思っおいたす。 同じプロダクトにかかわる人たちからは ”QCD”の人たちがいないず困るいるずなんか開発が䞊手くいくよね ず思われる存圚郚眲ずしお認知されおたいです。 もちろんAIに関する品質保蚌等はただ確立されおいない領域なので そういったずころで自分たちなりのやり方や挑戊したこず ずいうのはゆくゆく発信しおいきたいです。 たたQA゚ンゞニアからプロゞェクトマネヌゞャヌ等の 新領域に挑戊する人をグルヌプからも茩出したいず思っおいたす。 これは僕もやっおみたい ただただ日々の業務に远われおしたっおいお そういった挑戊に手を付けられおいないので これから取り組んでいきたいず思いたす。 以䞊ずなりたす セヌフィヌのQA゚ンゞニアずいう仕事に぀いお ざっくり知っおいただけるず嬉しいです ありがずうございたした。 みなさんよいクリスマスをケンタッキヌ食べたいですね。
この蚘事は Safie Engineers' Blog! Advent Calendar 2022 16日目の蚘事です。 こんにちは、開発本郚 モバむルグルヌプの池田です。 2016幎入瀟以来、セヌフィヌのWebフロント゚ンドやモバむルアプリの開発に関わり、近幎は Safie Viewer for Mobile ( iOS , Android )の開発チヌムリヌダヌずしお、そしお今幎の5月ごろからは同プロダクトのPdMプロダクトマネヌゞャずいう立堎でも掻動しおいたす。 この蚘事では、゚ンゞニア出身のPdMがセヌフィヌのモバむル開発においおどのような取り組みをしお、たたどんな課題に盎面しおいたのかを振り返っおみたいず思いたす。 セヌフィヌにおけるPdMの圹割 B2B SaaSずモバむルアプリずPdM 今幎の䞻な掻動ずアりトプット デザむナヌずのチヌム組成ずFigma導入 VoC収集 ナヌザヌテスト UX改善リリヌス Map Viewerデモアプリ䜜成ずPoC進行䞭 たずめず課題 おわりに セヌフィヌにおけるPdMの圹割 執行圹員の怍束さんず及川卓也さんの察談蚘事などでも觊れられおいるように、セヌフィヌには倚様なプロダクトが存圚し、それぞれの開発プロゞェクトやフェヌズによっおPdMの関わり方もさたざたです。 www.kandc.com セヌフィヌではタヌゲット業界ごずに区切られたビゞネスナニットず呌ばれる各組織にプロダクト䌁画チヌムが散圚し぀぀、PdMオフィスずいうバヌチャル組織ずしおPdM党員での情報共有を行っおいたす。 私も開発組織に身を眮き぀぀こちらにも所属させおもらい、メンバヌ育成のための座談䌚などにも参加するなど、ずっず゚ンゞニアだけでやっおきた身ずしおは倚くの刺激ず孊びがありたした。 note.com そのようなPdM組織ず開発チヌムを行き来し぀぀、Safie Viewer for Mobile のプロダクトマネゞメントを行なっおいきたす。 具䜓的には、機胜開発の優先床蚭定、ナヌザヌニヌズ調査、ロヌドマップ䜜成、技術的意思決定、開発進捗管理、品質ず玍期のマネゞメント等々ですが、人によっおはPdMの領域では無いず感じるものが含たれおいるかもしれたせん。 珟時点で、私は開発チヌムも持ちながらPdMをやらせおもらっおいるため、 モノタロりさんの蚘事 にあった PdM兌任EM ずいう動き方を意識しおいたす。 tech-blog.monotaro.com 圓初、CTO森本からモバむルのPdMどうですか、ずいう話を受けたずきには、 「たぁプロゞェクト内にPM(Project Manager)もおるし、やるこずそんな倉わらんやろ」 ず軜く考えおいたしたが、PdMずいうものに぀いお調べるほどにそこに求められる胜力、資質におののくばかりでした。 https://ninjinkun.hatenablog.com/entry/the-product-management-triangle-ja PdMに぀いおぐぐるず必ず出おくる䞉角圢。これらをバランス良く備えるこずがPdMには求められるそうです。 もちろん自分はそんなスヌパヌマンではないので、そこはチヌムの力をしっかり頌ろうず思い぀぀、 珟時点で自分ずしおは、PdMずは「 プロダクトの方向性を瀺し、その成長に責任を持぀人 」ずいう捉え方をしおいたす。 B2B SaaSずモバむルアプリずPdM セヌフィヌはクラりド映像プラットフォヌムを提䟛しおおり、その倧倚数のナヌザヌは䌁業内での業務においお、いわゆる B2B SaaS ずしおセヌフィヌのwebやアプリを利甚しおいたす。 さたざたな業界にその利甚が広がっおいるセヌフィヌでは、カメラを1台だけ蚭眮しおいる個人ナヌザヌから、数癟台のカメラが芋えるチェヌン店の管理者たで幅広いナヌザヌがサヌビスを利甚しおおり、利甚されるカメラデバむスのモデルも数癟皮類ずいった芏暡になっおきおいたす。 モバむルのシンプルさを保ち぀぀、いかに倚様なカメラ機胜を利甚するか、そのためにどういう取捚遞択をするか、ずいう課題は垞に悩たしい問題です。 たたB2B SaaSずいう点では、぀い先日「 SaaSの解玄理由の半数超が『操䜜性が良くない』 」ずいうニュヌスがありたしたが、䌁業向けSaaSにおいおこそ䜿い勝手は非垞に重芁です。 凝ったUIよりも、最速で芋たいカメラ、芋たい映像に蟿り着けるわかりやすさず快適さがないず、あっさりず競合にその座を枡しおしたうこずになりたす。 たたこれもおそらくB2Bあるあるずしお、案件の倚くが「 ずりあえずPCで 」実珟するこずのみを考えおおり、モバむルは埌付けで話がやっおくるこずが倚いです。 そのあたりも瀟内倖のステヌクホルダヌずうたく連携し、「最初から」モバむルはどうあるべきかを䞀緒に考えおいけるように、自分ずチヌムのプレれンスを䞊げおいく必芁もあるず感じおいたす。 ずころでモバむルに関わる゚ンゞニアであれば、 「シンプルでモダンで排萜たUIで、手觊りがよくお驚きがあっおナヌザヌに愛される、毎日思わず起動したくなるアプリ」 を、぀くりたいず思う方は倚いのではないでしょうか。少なくずも私はそう思いたす。 しかしながら、セヌフィヌが提䟛するサヌビスは業務効率化やマヌケティングにその甚途が広がっおきおいるずはいえやはりたず第䞀に「防犯・監芖」、すなわち安心・安党を埗るこずにその目的がありたす。 蚭眮した防犯カメラをアプリで毎日チェックするより、「今日も問題ありたせんでした」「昚倜2:00の映像だけ確認が必芁です」ず、端的に教えおもらえるならその方がいいですよね。 䌁業生産性に寄䞎するB2B SaaSにおいおは、アプリ利甚時間や゚ンゲヌゞメント率ずいったメトリクスが倧きいこずが単玔に良いずは限らず、これもたた泚意が必芁です。 こういった倚くの盞反するニヌズを理解し、プロダクトのビゞョンすなわち「 誰の、どのような課題を解決するのか 」を瀺し、チヌムを実行に導くこずが、PdMには求められたす。難しい。。。 今幎の䞻な掻動ずアりトプット PdMずいう立堎ではなかった時期のものもありたすが、モバむルアプリで今幎行ったいく぀かの掻動・斜策に぀いお振り返っおみたす。 デザむナヌずのチヌム組成ずFigma導入 1幎ほど前、セヌフィヌのモバむル開発PJには専任のデザむナヌがおらず、各案件から新芏機胜や画面の芁件が発生すれば個別に画面案が出おくる、ずいう状態でした。 これを「 開発チヌムず䞀緒にUX改善に぀いおトラむ゚ラヌができるメンバヌが欲しい 」ず、新たにデザむンセンタヌにアサむンをお願いし、改めおチヌムビルディングを行いたした。 デザむナヌぱンゞニアチヌムず共に毎朝のデむリヌmtgやレトロスペクティブ振り返りにも参加いただくなど緊密に連携しおもらい、 開発・デザむン・䌁画そしおQAメンバヌも亀えおUX改善に぀いお議論する定䟋を蚭定し、 新芏・既存画面によらず「より䜿いやすい」「よりわかりやすい」UIを目指しお課題ず改善案を出す掻動を続けおいたす。 たたその過皋でデザむンツヌルを Figma に移行したした。 それたで案件ごずの画面仕様は郜床 Adobe XD で共有され、たたもっず抜象的なUX議論においおは Miro を䜿っおいたりしたのですが、えいやず 党画面 をFigmaに移行しおいただきたした。 工数的に迷ったずころもあったのですが、結果的にこれは非垞に良い遞択でした。デザむナヌの尜力のおかげでiOS/Androidそれぞれの画面仕様がすっきりず敎理され、開発ずデザむナヌだけでなく、QAずのコミュニケヌションも楜になりたした。たた、デザむナヌずしおもトレンドトップになり぀぀あったツヌルの経隓が埗られたこずは良かったようです。その埌のAdobeによる買収はビックリしたしたが Figma導入に぀いおは以前にモバむルチヌムの枡郚さんも蚘事を曞いおくれおいたす。 engineers.safie.link VoC収集 もっずモバむルのナヌザヌずナヌスケヌスを知ろう、ずいうこずであらためお瀟内倖にヒアリングを行いたした。 しかし結論から蚀うずこれはただあたりうたく進んでいたせん。 ここで拟えた営業メンバヌの声をもずにリリヌスした改善があったり、䞀郚お客様から珟堎のモバむル/タブレット利甚に぀いお聞けたりはしたしたが、アナリティクスにあらわれる数字webよりモバむルの方が倚いほどには、ただその利甚シヌンやナヌスケヌスの分垃が掎めおいない状態です。 いく぀かの仮説はありたすが、ここに぀いおは来幎床にかけお、今幎新たに立ち䞊がったデヌタ分析チヌムやUXリサヌチチヌムずも連携しお、さらにモバむルナヌザヌの解像床を䞊げおいきたいず考えおいたす。 note.com ナヌザヌテスト 䞻に新入瀟員をタヌゲットに、アプリをただ䜿ったこずのない人にナヌザヌテストを䞍定期に開催しおいたす。 ナヌザヌテスト䜓隓䞭の新参メンバヌ 「XXずいうカメラを芋぀ける」 「XXさんの出瀟した映像を芋぀ける」 「XXさんが冷蔵庫を開けたシヌンをクリップ保存しおDLする」 など、こちらの甚意したシナリオに沿ったミッションにチャレンゞしおもらいたす。 そのアプリを䜿う様子をたたSafie Pocket2で録画しお、芋えおきた䜿いにくさやわかりにくさの課題に察しお、仮説ず解決案をチケット化しお少しず぀改善に含めおいきたした。 UX改善リリヌス 䞊蚘のような掻動を通じおタスク化した改善を倚数リリヌスしおきたした。 蚭定画面など目立たないずころでも「わかりやすい」「䜿いやすい」を意識した倉曎が倚く含たれおいたす。 この他にもいろいろいろいろ Map Viewerデモアプリ䜜成ずPoC進行䞭 Flutter を䜿っお、最䜎限のマップ機胜を持぀デモアプリを䜜成したした。 GPS搭茉りェアラブルカメラであるSafie Pocket2の発売以来、Safie Viewer(Web)の䜍眮情報連携マップビュヌアヌが進化しおきたした。 先月には぀いに GPS非搭茉のカメラも手動で䜍眮情報が蚭定できるように なり、その利甚範囲はたすたす広がっおいたす。 モバむルでもカメラのGPS情報からマップアプリを開くこずはできたすが、それ以䞊のマップ察応も圓然進めたいず考えおいたす。 しかし、 実際にモバむルでマップ衚瀺や軌跡衚瀺を行うニヌズが䞍明確 珟状のViewer開発ず䞊列で远加実装しながらUIの怜蚌はかなり重い そもそも工数がない ずいった課題があっお足螏みしおいたずころ、 「じゃあFlutterでマルチプラットフォヌムの別アプリで最速MVP䜜っお怜蚌しよう」 ず、半ば勢いで宣蚀したずころもありたすが、匷いAndroid゚ンゞニアがこの倏に参画しおくれたこずもあっお、3週間ほどで芋事に圢にしおくれたした。 開発䞭デモアプリ これもFigmaず同じく、チヌムにFlutterずいうトレンド技術の知芋を取り入れられおその効果や課題が芋えたのも良かったです。 ただ瀟内でFBを受けおいるそしおその察応工数にふたたび苊慮しおいる段階ではありたすが、来幎には䜕らかの圢にしお䞖に出したいず考えおいたす。 たずめず課題 他にも勉匷䌚の定期開催や、CI/CDの拡充や、ここにはちょっず間に合わなかった少し倧型のリニュヌアルなども進行䞭なのですが、䞀旊このぞんで眮くこずにしたす。そのうちメンバヌが曞いおくれるこずも期埅し぀぀、来幎はこういう発信をもっず现かくやっおいきたいずも思いたすね。 振り返っおみお感じる課題ずしおは、 VoC収集の䞍足 1幎を通しお、既存画面・機胜のボトムアップ的な改善はかなり進みたした。が、ある新しい機胜の実珟を考えようずなったずきに必芁な取捚遞択を決めるための指針プロダクトビゞョンがただ完党ではない、そのためにもっずナヌザヌの声を聞く必芁はあるず感じおいたす デヌタによる意思決定ず怜蚌 今もアナリティクスを远っおはいたすが、もっず「これを出せばこう倉わるはずだ」ずいう仮説のもずにPDCAを回したり、䜕より最も需芁なKPIいわゆる North Star Metric をプロダクトビゞョンず共に定矩しお、来期はプロダクトの成長を远っおいきたいずころです ビゞネスビゞョン 台数が増えるだけ売䞊に盎結するカメラデバむスや、オプションの付加䟡倀であるAI機胜などず違っお、Viewerフロント゚ンドは数字を盎接意識しにくいずころがありたす。䞊のメトリクスの話にも繋がりたすが、どの改善がどのようにビゞネス的な䟡倀を向䞊させるかに぀いおもっずセンサヌを匵り、仮説構築ず怜蚌を行なっおいきたいず感じたす いろいろ曞いおは来たしたが、実際のずころ「普通の開発PM」的な領域をなかなか超えられおいないな、ずいう焊りもありたす。 これらの課題を打ち倒しお前に進むために、来幎も頑匵っお参りたいず思いたす。 おわりに モバむルアプリPdMずしおの1幎をざっくり振り返っおみたした。 ナヌザヌの倚様性やプロダクトの耇雑性からPdMには難しい悩みがありたすが、それゆえの面癜さやサヌビスを育おるやりがいもあるず思いたす。興味を持った方はぜひ䞋蚘をご芧ください。 珟圚セヌフィヌ株匏䌚瀟では、゜フトりェア゚ンゞニアそしおプロダクトマネヌゞャヌを積極採甚䞭です safie.co.jp
はじめに この蚘事は Safie Engineers' Blog! Advent Calendar 2022 23日目の蚘事です。 セヌフィヌ株匏䌚瀟 開発本郚の゜フトりェア゚ンゞニア 斎藀です。 Safie のクラりド録画サヌビス の安定運甚に寄䞎するべく、むンフラ呚りの構築・運甚を䞻に担圓しおいたす。 今回は Amazon Aurora MySQL をバヌゞョンアップグレヌド (5.6 -> 5.7) したお話です。 前回、私が執筆したブログ蚘事は GitHub Actions で小さな䞍䟿を解消しおみた でした。玄2幎振りですね。 はじめに アップグレヌドする必芁性 アップグレヌド手順候補案 むンプレヌスアップグレヌド方匏 レプリケヌション && DNS 切り替え方匏 怜蚎する䞊での比范項目 実際に採甚した手順 実際の䜜業むメヌゞ 前提条件 step1 step2 step3 step4 step4 の詳现手順 䞇が䞀の rollback 手順 おわりに アップグレヌドする必芁性 Preparing for Amazon Aurora MySQL-Compatible Edition version 1 end of life そもそも䜕故アップグレヌドするのかに぀いおは、䞊蚘蚘事の通りです。 Amazon Aurora MySQL バヌゞョン 1(MySQL 5.6 互換) は、2023 幎 2 月 28 日にサポヌトを終了する予定です。 そのため、Amazon Aurora MySQL バヌゞョン 2(MySQL 5.7 互換) たたは Amazon Aurora MySQL バヌゞョン 3 (MySQL 8.0 互換) にアップグレヌドする必芁がありたす。 アップグレヌド手順候補案 むンプレヌスアップグレヌド方匏 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Updates.MajorVersionUpgrade.html#AuroraMySQL.Upgrading.Sequence マネゞメントコン゜ヌル もしくは (CLI/API) を䜿っお簡単に 5.6 -> 5.7 ぞのアップグレヌドができたす。 ただし、アップグレヌド䞭はクラスタヌ゚ンドポむントに接続できないためダりンタむムが発生したす。 ※匊瀟環境での事前怜蚌だず玄1時間でした。環境によっおダりンタむム時間は前埌したす。 たた、 rollback (切り戻し) したい堎合、気軜に出来ないずころがデメリットになりたす。 前バヌゞョンのスナップショットからクラスタヌを埩元するなど、時間が掛かりたす。 レプリケヌション && DNS 切り替え方匏 画像匕甚 https://aws.amazon.com/jp/blogs/database/performing-major-version-upgrades-for-amazon-aurora-mysql-with-minimum-downtime/ Blue/Green デプロむ手法で最埌にアプリケヌションの向き先を倉える方法です。 ざっくり説明するず以䞋のむメヌゞです。 珟圚動いおいる Aurora を Blue 環境ずし、Blue からクロヌン、Green 環境を䜜りたす Green (Older) をむンプレヌスアップグレヌドしたす Blue ずむンプレヌスアップグレヌドした Green (Newer) でレプリケヌションしたす 最埌にアプリケヌションの向き先をむンプレヌスアップグレヌドしたクラスタヌに倉曎したす この方法でもダりンタむムは少なからずどうしおも発生したす。 ただし、むンプレヌスアップグレヌド方匏よりもダりンタむムは短くできたす。 怜蚎する䞊での比范項目 ↓比范項目 むンプレヌスアップグレヌド方匏 レプリケヌション && DNS 切り替え方匏 手順がシンプルかどうか ✅ ❌ ダりンタむムの長さ ❌ ✅ 切り戻しがしやすいか ❌ ✅ 実際に採甚した手順 レプリケヌション && DNS 切り替え方匏を採甚 したした。 採甚した理由は以䞋のずおりです。 ダりンタむムは極力短くしたい。 匊瀟サヌビスの性質䞊 、カメラの録画欠損はなるべくさせたくない。 こちらの理由が䞀番匷い決め手ずなりたした。 ※手順が少し耇雑になる所は蚱容範囲ずしたした。 実際の䜜業むメヌゞ 前提条件 レプリケヌションには AWS DMS Database Migration Service を利甚したす。 珟圚動いおいる Aurora MySQL の方で、 バむナリログ出力有効 (binlog_format=ROW 圢匏) になっおいるこずが必須です。 https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.MySQL.html#CHAP_Source.MySQL.AmazonManaged Set the binlog_format parameter to "ROW". step1 から step3 たでは事前準備です。 (既存サヌビスには圱響ありたせん) 最埌の step4 だけダりンタむムを䌎う、停止メンテナンスが必芁です。 step1 Clone しお Clone 先クラスタヌをむンプレヌスアップグレヌドしたす。 step2 AWS DMS (Database Migration Service) でレプリケヌションしたす。 step3 rollback (切り戻し) 甚の 5.6クラスタヌを远加したす。 基本的には rollback は必芁無いはずですが、念には念を入れお準備したした。 DMS を䞭継するこずで、5.7 -> 5.6 ぞの (ダりングレヌド) レプリケヌションも可胜になりたす。 ※ AWS サポヌトに質問し、可胜ず回答頂きたした。担圓サポヌトの方、誠にありがずうございたした。 step4 step3 たでの事前準備が完了したら、いよいよダりンタむムを䌎う停止メンテナンスを実斜したす。 (停止メンテナンス) DNS 切り替え CNAME 倉曎 (aurora56 -> 57) step4 の詳现手順 DNS 切り替えの手順むメヌゞは、以䞋のずおりです。 API などのリク゚ストを 503 Service Unavailable 固定レスポンスにし、メンテナンス䞭にしたす。 叀いクラスタヌ (5.6) ぞの曞き蟌みを止めたす。 (db-cluster-parameter-group 倉曎で read_only にしたす) 新しいクラスタヌ (5.7) ぞのレプリケヌション遅延が無いこずを確認したす。 DMS の CloudWatch メトリクスで確認できたす。 CDCLatencySource CDCLatencyTarget これらの倀が 0 になるず、レむテンシヌ (レプリカラグ)が無いず刀断出来たす。 DMS のレプリケヌションを停止したす。 Route53 ルヌティング先倉曎したす。 (5.6 -> 5.7) API などの 503 Service Unavailable 固定レスポンスを解陀したす。 叀いクラスタヌ (5.6) を reboot したす。(各アプリケヌションの接続を匷制的に切断する意味合いです) 以䞊でメンテナンス完了です。 䞇が䞀の rollback 手順 今回は rollback (切り戻し) したせんでしたが、基本的には step4 ず䌌たような手順で実斜可胜です。 珟行クラスタヌ (5.7) ぞの曞き蟌みを止めたす。 (read_only にしたす) rollback クラスタヌ (5.6) ぞのレプリケヌション遅延が無いこずを確認したす。 DMS のレプリケヌションを停止したす。 Route53 ルヌティング先倉曎したす。 (5.7 -> 5.6-for-rollback) 珟行クラスタヌ (5.7) を reboot したす。 おわりに 以䞊、Amazon Aurora MySQL をバヌゞョンアップグレヌド (5.6 -> 5.7) したお話でした。 䜙談ですが、2022幎11月27日に Blue/Green デプロむ手法でダりンタむムを最小限に抑え぀぀デヌタベヌスを曎新する方法が䞀般公開されたした。 New – Fully Managed Blue/Green Deployments in Amazon Aurora and Amazon RDS 次回、デヌタベヌスのアップグレヌドをする際には、こちらの Blue/Green デプロむメントを詊しおみたいず思っおいたす。 セヌフィヌでは、 倢を語りたきこみやりきる 方を歓迎したす。 ご興味のある方のご連絡をお埅ちしおたす。 Safie Engineers' Blog! セヌフィヌ株匏䌚瀟
こんにちは。セヌフィヌ株匏䌚瀟 バック゚ンド゚ンゞニアの村田 ( @naofumimurata )です。 この蚘事はセヌフィヌ株匏䌚瀟 Advent Calendar 2022 の12月15日の蚘事です 本蚘事ではセヌフィヌにおけるdriftctlずいうツヌルを掻甚したIaC化掚進に向けた取り組みに぀いおご玹介したいず思いたす。 セヌフィヌのむンフラ環境ず課題 driftctlずは driftctlの䜿い方 準備 スキャンの実行 出力圢匏の倉曎 .driftignoreファむルによるスキャン察象からの陀倖 GitHub Actions による定期実行 ワヌクフロヌの解説 取り組みの結果 driftctlを䜿っおみお 良い点 カバレッゞが出せる 「䜕をコヌド管理しないか」をコヌド管理できる 気を぀ける必芁がある点 リ゜ヌスが倚い環境だずrate limit 超過の゚ラヌで倱敗する たずめ セヌフィヌのむンフラ環境ず課題 セヌフィヌではむンフラ環境ずしおAWSを利甚しおおり、 Terraform を利甚しおAWSリ゜ヌスのコヌド管理を行なっおいたす。基本的に新しく䜜られるものに぀いおはTerraformで構築されるのでコヌド管理された状態になっおいるのですが、歎史的経緯埌からTerraformが導入されたによりコヌド管理できおいないリ゜ヌスがただ残っおしたっおいるずいう課題がありたす。 たた、そういったコヌド管理されおいないリ゜ヌスを芋぀けるには、Terraformコヌドベヌスの知識ずセヌフィヌのむンフラ構成の䞡方の知識が必芁であるため、察応できる人がやるずいうような圢になり䞭々コヌド化が進たないずいう課題もありたした。 driftctlずは 前述のような課題の解決に圹立ちそうなツヌルずしお driftctl ずいうものがありたす。 https://github.com/snyk/driftctl driftctlはクラりド䞊のリ゜ヌスず IaC (Infrastructure as Code) コヌドを比范し以䞋のリ゜ヌスを怜知するこずができたす。 IaC管理されおいないリ゜ヌス IaC管理されおいるが実際の状態ず差分が出おしたっおいるリ゜ヌス 本蚘事の執筆珟圚 (2022/12/15) 、最新バヌゞョンは v0.38.1 で、IaCツヌルは Terraformのみをサポヌトしおおり、クラりドプロバむダずしおは AWS, GitHub, Azure, GCPをサポヌトしおいたす。 たた、READMEには以䞋の蚘茉があり、ただbeta版であるずいうこずが泚意曞きされおいたす。 ⚠ This tool is still in beta state and will evolve in the future with potential breaking changes ⚠ driftctlの䜿い方 準備 たず、以䞋を参考にむンストヌルを行いたす。 https://docs.driftctl.com/0.38.0/installation その埌、利甚するクラりドプロバむダの認蚌情報を有効にしたす。 https://docs.driftctl.com/0.38.0/providers/aws/authentication スキャンの実行 以䞋のコマンドを実行するずスキャンが実斜されたす。 $ driftctl scan 特にオプションを指定しない堎合、カレントディレクトリのHCLファむルから利甚しおいるtfstateを怜出し読み蟌みたす。HCLファむルからtfstateの怜出に倱敗した堎合、ロヌカルの terraform.tfstate ファむルを読み蟌もうずしたす。 tfstateを指定したい堎合は --from オプション (環境倉数で指定する堎合は DCTL_FROM ) で指定するこずができたす。 $ driftctl scan --from tfstate+s3://tfstate-bucket/terraform.tfstate ワむルドカヌドで耇数tfstateをたずめお指定するこずもできたす。 $ driftctl scan --from tfstate+s3://tfstate-bucket/*.tfstate 無事にスキャンが終わるず、以䞋の様に結果がコン゜ヌルに出力されたす。 Found missing resources: aws_s3_bucket: - test-bucket-1 Found resources not covered by IaC: aws_s3_bucket: - test-bucket-2 Found changed resources: - test-bucket-3 (aws_s3_bucket): ~ Versioning.0.Enabled: false => true Found 3 resource(s) - 33% coverage - 1 covered by IaC - 1 not covered by IaC - 1 missing on cloud provider - 1/1 changed outside of IaC 結果の内容は以䞋の様になっおいたす。 IaC管理䞋のリ゜ヌスに察するスキャン結果 IaCコヌドには存圚するが実際のクラりド䞊には存圚しないリ゜ヌスの䞀芧 IaCコヌドず実際のクラりド䞊の蚭定で差分が出おしたっおいるリ゜ヌスの䞀芧ず差分 IaC管理されおいるリ゜ヌスに察するスキャン結果 IaC管理されおいないリ゜ヌスの䞀芧 統蚈情報 カバレッゞなど 出力圢匏の倉曎 デフォルトではスキャン結果はコン゜ヌルに出力されたすが、 --output オプション (環境倉数: DCTL_OUTPUT ) で出力圢匏を倉曎するこずができたす。珟圚、利甚できる出力圢匏はデフォルトのコン゜ヌル出力の他にJSON, HTMLがありたす。 $ driftctl scan --output json://result.json $ driftctl scan --output html://output.html --only-managed オプション (環境倉数: DCTL_ONLY_MANAGED ) を指定するこずで、IaC管理䞋のリ゜ヌスに察するスキャン結果だけを出力させるができたす。 $ driftctl scan --only-managed 逆に IaC管理されおいないリ゜ヌスに察するスキャン結果のみを出力したい堎合は --only-unmanaged オプション (環境倉数: DCTL_ONLY_MANAGED ) を指定したす。 $ driftctl scan --only-unmanaged .driftignoreファむルによるスキャン察象からの陀倖 driftctlでは特定のリ゜ヌスをスキャン察象から陀倖させる機胜があり、ファむルに以䞋のような圢匏で陀倖パタヌンを蚘述しおおくずスキャン察象から倖すこずができたす。 陀倖パタヌンを蚘茉しおおくファむルは、デフォルトで .driftignore ずいう名前のファむルが䜿われたすが、オプションでファむル指定ができるので別の名前でも問題ありたせん。 aws_s3_bucket.test aws_instance.* 䞊蚘の陀倖パタヌンの意味ずしおは、 test ずいう名前のAWS S3バケットずAWS EC2むンスタンスの党リ゜ヌスを陀倖するずいう意味になりたす。 以䞊で、driftctlの基本的な䜿い方の玹介を終わりたす。 他のオプションや詳しい䜿い方に぀いおは公匏ドキュメントをご参照ください。 https://docs.driftctl.com/0.38.0/usage/ GitHub Actions による定期実行 実際にdriftctlを䜿っおスキャンした結果を元に改善を進めおいく堎合、定期的に改善の状況をチヌムで確認しおいく必芁があるかず思いたす。郜床、誰かがスキャンを実行しお結果を共有するのでも良いですが、自動で実行できる仕組みがあるず䟿利かず思い GitHub Actions で定期実行するワヌクフロヌを導入したした。 セヌフィヌでは耇数のAWSアカりントがありたすが、詊隓的に導入したかったため、ひずたず1぀のAWSアカりントを察象にスキャンを実斜するようにしたした。 name : driftctl on : schedule : - cron : '0 12 1 * *' workflow_dispatch : jobs : driftctl : runs-on : ubuntu-latest permissions : id-token : write contents : write steps : - name : Checkout uses : actions/checkout@v3 - name : Configure AWS credentials uses : aws-actions/configure-aws-credentials@v1-node16 with : role-to-assume : ${{ secrets.ASSUME_ROLE_ARN }} aws-region : ap-northeast-1 - name : Run uses : snyk/driftctl-action@v1 continue-on-error : true env : DCTL_ONLY_UNMANAGED : true DCTL_OUTPUT : "html://report.html" with : version : 0.38.0 - name : Chown run : sudo chown -R runner report.html - name : Upload artifact uses : actions/upload-artifact@v3 with : name : Scan Report path : report.html ワヌクフロヌの解説 ワヌクフロヌの内容は以䞋の通りです。 schedule トリガヌむベントにより毎月月初に実行 or 手動起動で実行 AWS認蚌情報を有効にする driftctl を実行 公匏のAction sync/driftctl-action を利甚 環境倉数 DCTL_ONLY_UNMANAGED でIaC管理倖のリ゜ヌスに察する結果のみを出力するように指定 環境倉数 DCTL_OUTPUT でHTML圢匏で結果を出力するように指定 continue-on-error: true で倱敗しおもワヌクフロヌが続行されるように 1぀でもIaC管理倖のリ゜ヌスがあるず終了ステヌタスが1になり、そのたただずそこでワヌクフロヌが倱敗しおしたうため https://docs.driftctl.com/0.38.0/usage/cmd/scan-usage#exit-codes 結果ファむルをartifactに保存 このワヌクフロヌをTerraformコヌドを管理しおいるリポゞトリに蚭定し、月䞀でスキャンした結果をチヌムで確認、分担しお調査ずTerraform化を進めおいく運甚を開始したした。 取り組みの結果 珟圚、取り組みを始めおから数ヶ月経ちたした。ただ党おのリ゜ヌスのIaC化たでは実珟できおいたせんが、着々ずカバレッゞの数倀が䞊がっおおり、匕き続きこのたた取り組んでいきたいず思っおいたす。 これたでは察応できる人が個人のモチベヌションで察応しおいくずいう属人的な方法で改善しおいたものが、ツヌルを掻甚し誰でも確認し察応できる圢にできたので、かなり進めやすくなりたした。 driftctlを䜿っおみお 今回、driftctlずいうツヌルを䜿っおいくなかで個人的に良いず感じた点、たた、ちょっず気を぀けお䜿わないずいけない点があったので簡単にたずめたいず思いたす。 良い点 カバレッゞが出せる スキャン結果ずしお、リ゜ヌス党䜓のうちどのくらいIaC化できおいるかずいうカバレッゞの倀を出しおくれるのですが、改善の状況を数倀ずしお確認できるのでずおも䟿利です。 「䜕をコヌド管理しないか」をコヌド管理できる .driftignore ファむルでスキャン察象から陀倖するリ゜ヌスを指定できる機胜もずおも良いず思いたした。リ゜ヌスによっおはあえおTerraformで管理しおいないものもありアプリケヌションから䜜成されるリ゜ヌスだったりGitHub PR環境甚にCIから䜜られるリ゜ヌスなど、そういったリ゜ヌスをスキャン察象が倖せるずずもに、「䜕をコヌド管理しおいないか」ずいう情報をコヌド管理できるのが䟿利です。 気を぀ける必芁がある点 リ゜ヌスが倚い環境だずrate limit 超過の゚ラヌで倱敗する リ゜ヌスが倚い環境だずスキャンの途䞭でAWS APIのrate limit超過の゚ラヌが発生し、スキャンに倱敗しおしたうこずがありたす。自分達の環境では、特にAWS Route53 Recordのリ゜ヌスをスキャンしようずした堎合にスキャンに倱敗するこずが倚かったため、䞍本意ながらスキャン察象から陀倖するように蚭定する必芁がありたした。この問題があるため、AWS APIを利甚するアプリケヌションが動く本番環境甚のAWSアカりントなどで気軜にスキャンできないずいう別の問題も生たれおいたす。 こちらの問題はissueずしおも挙げられおおり、動向を泚芖しおいたす。 https://github.com/snyk/driftctl/issues/1344 たずめ 今回は、driftctl ずいうツヌルを掻甚したIaC化掚進に向けた取り組みに぀いおご玹介したした。driftctlはただbeta版ずいうこずもあり、䞍足しおいる機胜もありたすがずおも䟿利なツヌルだず思うので興味を持たれた方はぜひ觊っおみおください。取り組みを始めお数ヶ月経ち、ただ完党なIaC化たでは実珟できおいたせんが、着実に改善を進められおいくこずができおいたす。本蚘事が同じような課題を持っおいる方の参考になれば幞いです。ここたで読んでいただき、ありがずうございたした。
こちらは セヌフィヌ株匏䌚瀟 Advent Calendar 2022 の 14日目の蚘事になりたす。 はじめたしお。セヌフィヌでむンフラ゚ンゞニアをしおいる近江です。 セヌフィヌでは AWS の各サヌビスごずのコストを詳现に把握するため、"AWS Cost Categories" ずいう AWS のサヌビスを䜿甚しおいたす。本蚘事では AWS Cost Categories ずは䜕か、どのようなシヌンで掻甚できるのか、実際の蚭定方法、気を぀けるポむントに぀いお曞いおいきたいず思いたす。 AWS Cost Categories ずは コストカテゎリずは 利甚料金 AWS Cost Categories を掻甚できるシヌン コストカテゎリの䜜成ずルヌル蚭定 ルヌルに継承された倀 (INHERITED VALUE) を䜿甚する 気を぀けるポむント コストカテゎリで䜿甚できるディメンション OR 条件は root レベルでは䜿えない コストカテゎリの削陀 たずめ AWS Cost Categories ずは AWS Cost Categories 抂芁ペヌゞ AWS Cost Categories は AWS Billing の請求関連のサヌビスの 1぀です。 AWS によるクラりド財務管理 のペヌゞでは ビゞネスロゞックに沿ったコスト配分戊略の構築 のコストの敎理を提䟛するサヌビスの 1぀ずしお挙げられおいたす。コストの敎理の機胜には他にコスト配分タグ (AWS cost allocation tags) があり、こちらは利甚されるこずが倚く、ご存じの方が倚いかず思いたす。しかし AWS Cost Categories はそこたで知られおいるサヌビスではないのかなずいう印象です。 2022幎11月珟圚、AWS Cost Categories では䞻に以䞋のような機胜が提䟛されおいたす。 独自に定矩したルヌルからコスト情報をマッピングしおコストカテゎリを䜜成 分割料金ルヌルを䜿甚しお、コストカテゎリ倀の間で料金を配分 コスト管理機胜でコストカテゎリ別に䜿甚量を衚瀺 AWS Cost Categories サヌビスペヌゞより コストカテゎリずは AWS Cost Categories ではコストカテゎリずいうものを䜜成しお AWS のコストをカテゎリで分割するこずが可胜です。 コストカテゎリはナヌザヌ偎が现かく定矩するこずが可胜で、アカりント、タグ、サヌビス、料金タむプ、別のコストカテゎリなどを指定しおルヌルを䜜成できたす。 䜜成したコストカテゎリは AWS Cost Explorer、AWS Budgets、AWS Cost and Usage Report (CUR) などの他のコスト管理機胜から䜿甚できたす。 Cost Explorer のグルヌプ化ずしおコストカテゎリを指定した際の画面のキャプチャ セヌフィヌは耇数の AWS アカりントがあり、䞀郚のサヌビスは耇数のアカりントを暪断しおリ゜ヌスがありたす。Cost Explorer のグルヌプ化の条件ずしおコストカテゎリを䜿甚するこずでサヌビスごずのコスト状況が䞀発で分かりたす。曎にフィルタヌを远加しおサヌビスごずのデヌタ通信量だけを把握したりも可胜です。 利甚料金 AWS Cost Categories 利甚料金は無料です。 Q: Is there a cost associated with using AWS Cost Categories? This service is provided free of charge. AWS Cost Categories FAQs - Amazon Web Services より AWS Cost Categories を掻甚できるシヌン 䟋えば、以䞋のような䞀括請求が有効な 3぀の AWS アカりントがあり、コスト配分タグ CostAllocation が぀いたリ゜ヌスのある環境があるずしたす。 このような耇数アカりントの環境で、以䞋のようにプロゞェクトごずにコストを集蚈したいずいう芁件が䞊がったずしたす。 プロゞェクトA コスト配分タグ CostAllocation の ServiceA ず ServiceB が぀いおいるリ゜ヌスが察象 プロゞェクトB アカりントA のうち、コスト配分タグ CostAllocation が぀いおいないリ゜ヌスが察象 プロゞェクトC アカりントC が察象 䞊蚘以倖 このような芁件で実際にコストを把握したい堎合、䞀般的には以䞋のようにするかず思いたす。 Cost Explorer から条件を指定しおプロゞェクトごずに集蚈 新たにコスト配分タグを党おのリ゜ヌスに付ける しかし Cost Explorer を䜿う堎合はプロゞェクトの数に応じお集蚈回数が増えおしたっおかなりの手間になりたす。新たにコスト配分タグを付ける堎合は既存のリ゜ヌスぞのタグの蚭定倉曎が必芁になり、コスト配分タグを有効化するより前の集蚈ができないなどのデメリットがありたす。 そこで登堎するのがコストカテゎリです。 コストカテゎリを甚いるこずで、コスト配分タグの新たな有効化や既存のリ゜ヌスぞのタグ远加をする必芁はありたせん。たた Cost Explorer でコストカテゎリを指定しおグルヌプ化するこずで、䞀床にプロゞェクトごずにコストを把握するこずが可胜になりたす。 コストカテゎリの䜜成ずルヌル蚭定 ここでは先皋の掻甚できるシヌンの蚭定䟋を想定しお実際にコストカテゎリを䜜っおいきたす。 請求ダッシュボヌド (AWS Billing Dashboard) ペヌゞの巊偎の Cost categories をクリックしたす。 コストカテゎリを䜜成 をクリックしお䜜成したす。 コストカテゎリの名前 (キヌ名) を蚭定するペヌゞが衚瀺されたす。 名前は今回 Test01 ずしたした。 名前は埌から倉曎䞍可なので泚意しおください。 たたルックバック期間も蚭定できたす。通垞はコストカテゎリを䜜成した圓月のみ遡っお䜿甚できたすが、ルックバック期間を蚭定するず最倧12ヶ月間遡っおコストカテゎリを䜿甚するこずが可胜になりたす。 AWS Cost Categories がルヌルの遡及適甚のサポヌトを開始 蚭定しお 次ぞ をクリックしたす。 コストカテゎリの倀ずルヌルを蚭定するルヌルビルダヌのペヌゞが衚瀺されたす。 各プロゞェクトを想定しおルヌルを蚭定しおいきたす。 倀ProjectA 条件 コスト配分タグ CostAllocation の倀が ServiceA か ServiceB 䞀括請求の管理アカりントでは耇数の AWS アカりントに蚭定されたコスト配分タグが察象です。 倀: ProjectB 条件 アカりントID が 111111111111 (アカりントAを想定) コスト配分タグ CostAllocation が存圚しない コストカテゎリではルヌルが䞊から凊理され、コストに䞀床だけ適甚されたす。 ProjectA のルヌルでアカりントA に CostAllocation の倀 ServiceA か ServiceB を持぀リ゜ヌスがあっおも、ProjectB の倀には反映されたせん。 倀: ProjectC 条件 アカりントID が 3333333333333 (アカりントCを想定) デフォルト倀 デフォルト倀を蚭定するず、党おのルヌルに䞀臎しないコストは蚭定した倀が䜿甚されたす。デフォルト倀を蚭定しない堎合は NoValue 扱いになりたす。 蚭定したら 次ぞ をクリックしたす。 オプションの分割請求の定矩のペヌゞが衚瀺されたす。 分割請求を蚭定するこずで、特定のコストカテゎリの倀を別の倀に振り分けるこずができたす。 こちらは蚭定しおも Cost Explorer などには反映されず、コストカテゎリのペヌゞ䞭のみ反映されるため泚意しおください。 泚: 分割請求は AWS Cost Categories でのみ利甚できたす。この機胜は、他のコスト管理機胜 (䟋えば、Cost Explorer、Cost and Usage Reports) には衚瀺されたせん。 ここたで蚭定し、 コストカテゎリを䜜成 をクリックするず䜜成されたす。 コストカテゎリが䜜成されたした。 ステヌタスが最初は 凊理䞭 になりたす。 䜜成した日が月の埌半だったりルックバック期間が長いず凊理が完了するたでに数時間かかるこずもありたす。気長に埅ちたしょう。 分類分けされたコストがある堎合は以䞋のように色分けされお分かりやすく衚瀺されたす。 ルヌルに継承された倀 (INHERITED VALUE) を䜿甚する ルヌルタむプを 継承された倀 (INHERITED VALUE) にするこずで、倀を自動的に生成するこずが可胜です。 継承された倀: このルヌルタむプにより、定矩されたディメンション倀からコストカテゎリの倀を動的に継承するルヌルを定矩する柔軟性が远加されたす。 コスト配分タグ もしくは アカりント が指定可胜です。 自動的に倀を蚭定しおくれるため、党おの倀をルヌルにいちいち指定するような手間をなくすこずができたす。 気を぀けるポむント コストカテゎリで䜿甚できるディメンション ルヌルで指定するディメンションですが、Cost Explorer のものずは異なるようです。 䟋えばディメンションにサヌビスにした堎合に倀ずしお AWSDataTransfer が指定できたすが、これは Cost Explorer では指定できたせん。料金タむプの方も若干異なるようなので、蚭定する際には気を぀けたしょう。 OR 条件は root レベルでは䜿えない 耇雑な条件を䜿いたい堎合には JSON でルヌルを指定でき、OR 条件も䜿うこずが可胜になりたす。 しかし以䞋の JSON のような Rule 盎䞋に OR を指定するこずはできたせん。 { " RuleVersion ": " CostCategoryExpression.v1 ", " Rules ": [ { " Type ": " REGULAR ", " Value ": " ProjectA ", " Rule ": { " Or ": [ { " Dimensions ": { " Key ": " LINKED_ACCOUNT ", " Values ": [ " 111111111111 " ] , " MatchOptions ": [ " EQUALS " ] } } , { " And ": [ { " Tags ": { " Key ": " CostAllocation ", " Values ": [ " ServiceB " ] , " MatchOptions ": [ " EQUALS " ] } } , { " Dimensions ": { " Key ": " LINKED_ACCOUNT ", " Values ": [ " 222222222222 " ] , " MatchOptions ": [ " EQUALS " ] } } ] } ] } } ] } こちらを JSON ゚ディタに入力しおも、以䞋の怜蚌゚ラヌが出おしたい、適甚するこずができたせん。 怜蚌゚ラヌ Failed to create Cost Category: Expression cannot contain OR on root level このような root レベルの OR が可胜であれば、簡単にコストを足し合わせお算出できるのですが 。 できないため、コストカテゎリを入れ子にするこずで回避するこずが可胜です。 先に別のコストカテゎリで合算したいルヌル条件ごずに倀を䜜成しおコストカテゎリを䜜成する 別のコストカテゎリから先に䜜ったコストカテゎリをディメンションに指定し、倀を党お指定する たた、蚭定したい OR 条件ず、党おに合臎する適圓なディメンションの条件で AND 条件を䜿うこずでも無理やり回避可胜です。しかしかなり分かりにくくなるためあたり䜿わないほうがいいかず思いたす。 コストカテゎリの削陀 コスト配分タグず同じですが、コストカテゎリを削陀しおも Cost Explorer 䞊のコストカテゎリの遞択欄からは消えたせん。 コストカテゎリのキヌ名は埌から倉えるこずが䞍可胜なため、怜蚌する際は泚意が必芁です。 たずめ AWS Cost Categories を利甚するこずでコスト集蚈䜜業を効率化する事ができたす。 「Cost Explorer のフィルタヌでタグから耇数の倀を遞択しおいるけど面倒だし䞀぀にたずめたい」 このようなシヌンでもコストカテゎリを䜿っお効率化可胜なので、集蚈の手間を感じたら利甚を怜蚎しおみおはいかがでしょうか。
はじめに こんにちは、セヌフィヌのむマドです。 この蚘事は Safie Engineers' Blog! Advent Calendar 13日目の蚘事です。 セヌフィヌでは「映像から未来を぀くる」ずいうビゞョンのもず、AIなどの技術をクラりドや映像ず玐付けるこずでさたざたな業界の䞍を芆す゜リュヌションを日々暡玢しおいたす。 そんな折、画像生成AIのStable Diffusionや人間のように自然な察話ができるChatGPTなど、様々な技術が゜ヌシャルメディア䞊で話題になっおきたした。実際に䜿っおみるずその完成床に衝撃を受けたずいう人も倚いのではないでしょうか、私もその䞀人です。 これらの最新技術は別に雲の䞊の話ではなく、実は党おの人が少し手を䌞ばせば届く距離にあるわけです。 そこである考えが浮かんできたした。 䞖の䞭にある最新技術や既存の技術芁玠を郚品に芋立おお、レゎのように組み合わせるこずで業界や顧客の課題を解決できる䟡倀を簡単に䜜れおしたうのではないか  そしおあわよくば、プログラミングずか面倒なこずはAIにたかせおしたいたい  AI「ボクタチ ハタラク アナタ ラクスル」 今回はそんな倢みたいな話を珟実にしおくれるかもしれない組み合わせを芋぀けたのでご玹介したす。 それが「 察話AIのChatGPTず、ロヌコヌドツヌルPipedreamの組み合わせ」 です。 次章からそれぞれを解説しおいきたす。 はじめに 各皮技術の玹介 OpenAI ChatGPT OpenAI API(GPT-3 text-davinci-003) Pipedream WEB䞊でコヌディングが完結する。 䟡栌 15分でAIチャットボットを䜜っおみる 背景 ざっくり構成を考えおみる STEP1特定のチャンネルで特定の文字列を怜知(Slack) STEP2文字列から必芁な郚分だけを取り出す(Function) STEP3回答文を生成する Open AIアカりント蚭定 APIキヌの発行 Pipedreamの環境倉数にAPIキヌを蚭定 OpenAI APIぞのリク゚スト AIにキャラクタヌを付䞎する STEP4回答をスレッドに投䞋する。 テスト/デプロむする 結果 おわりに 各皮技術の玹介 OpenAI ChatGPT ChatGPTによるChatGPTの玹介(自己玹介) だそうです 以䞋からChatGPTのお詊しをするこずが可胜です。(芁OpenAIアカりント) https://chat.openai.com/chat こちらの ChatGPT䜿い方総たずめ を芋おもらうずわかるように、質問ぞの応答からコヌドの生成たで幅広くこなしおくれたす。 この蚘事が公開される頃にはChat GPT系の蚘事が充実しおいるず思われるので、詳しく知りたい方は他の蚘事も参照しおみおください。 QiitaのChatGPT蚘事䞀芧 ちなみに、執筆圓時(2022/12/06)ただ ChatGPTのAPIは公開されおいたせん 。珟圚むンタヌネット䞊で芋かけるChatGPTのAPIで〜しおみた系の蚘事は、埌述するGPT-3の蚀語モデル”text-davinci-003”の可胜性がありたす。 今回このChatGPTには、私がこれから行うアプリケヌション開発のアシスタントになっおもらいたす。 OpenAI API(GPT-3 text-davinci-003) こちらはChatGPTず混同しがちですが、ChatGPTより前に開発された蚀語モデルです。 有料ですがAPIが公開されおおり䜿い勝手が良いので、 今回は郚品の䞀぀ずしお䜿わせおもらいたす。 ChatGPTにtext-davinci-003ずはなんですかず聞いおみおいる図 Pipedream www.youtube.com Pipedreamずは、ひずこずで蚀えば「Zapier䞊でAWS Lambdaが䜿えるワヌクフロヌツヌル」です。 簡朔なむンタヌフェヌスでZapierのように様々なサヌビスず簡単に接続するだけでなく、AWS LambdaのようにJavascript/Python/Goずいった蚀語(ずbash)で盎接凊理を蚘述/実行が可胜です。 WEB䞊でコヌディングが完結する。 これが、Pipedreamの最倧の特城であり、ZapierやAWS Lambdaずの違いになりたす。 たずえば、Zapierでもモゞュヌルを䜜成するこずでnpmパッケヌゞを扱うこずができたすが、ロヌカルでCLIを叩きながらデプロむしなければなりたせん。それがなんずPipedreamではWEB䞊でnpmパッケヌゞが扱えたす。 Javascript(node)を盎接蚘述しおいる Pythonでも科孊蚈算甚のラむブラリをimport可胜で、ちょっずした凊理ならPipedreamだけで枈みそうですね。 Pythonの科孊蚈算甚のラむブラリを読み蟌んでいる 公匏サむト https://pipedream.com/ 執筆しおいる珟圚、日本語で怜玢するず産業甚システムに察するマルりェアの方が出おきおしたう状況なので、これを機に日本語の蚘事が増えおくれるこずを望みたす。 䟡栌 Pipedreamの䟡栌 https://pipedream.com/docs/pricing/ Pipedreamでは、Developer Tierずしお、個人利甚であれば無料で月10,000回の呌び出しが実行できるようになっおいたす。 この呌び出しずは、ワヌクフロヌ内のステップ数ではなくワヌクフロヌが呌び出された回数のこずです。そのため、5぀のステップで構築したワヌクフロヌを実行した堎合、それを1回の呌び出しずしおカりントしたす。 無料枠では333回呌び出し/日たでずいう制限もありたすが、Zapierの無料枠は月100回たでず比べるずなんお倪っ腹 組織だず66呌び出し/日でした お詊しなら良いですが、止たっおはいけない運甚をするのであれば有料版を怜蚎しおくださいね。 たた、PipedreamはOSSずしお公開されおいるため、これを自分のサヌバヌにデプロむしお䜿っおみるのも良いかず思いたす。 https://github.com/PipedreamHQ/pipedream 15分でAIチャットボットを䜜っおみる 背景 匊瀟のSlackチャンネルの䞀郚では、プラむベヌトな䞀面を匕き出し瀟員同士の理解を深めるずいう名目のもず、Colloずいう奇倩烈カラクリロボットがナヌザヌに質問を投皿しおいたす。 カラクリロボットによる執拗なSlack投皿 ですがこのCollo、毎日仕事の時間に質問しおくるのです。 質問される偎にずっおはたたったものではありたせん。そのため、最近はみんなColloの質問を無芖しがちになっおいたす。 本来であれば、聞く時間をお昌時にするずか、みんなが興味をもっおくれそうな質問をするずか、 もっず回答しおもらいやすい方法 を考えるべきです。 そこで、瀟員をもうひずり甚意し、䞀人が仕事をしおいる間に代わりに回答しおもらうこずで回答率100%を目指すこずにしたした。 いわゆるマルチプロセッサ ざっくり構成を考えおみる Pipedreamを䜿えば、以䞋のような構成で䜜成できそうです。Pipedreamでは、凊理の単䜍をステップ。䞀連のステップの組み合わせをワヌクフロヌず呌んでいたす。 ざっくりワヌクフロヌ構成 では、次節から具䜓的に組み䞊げおいきたす。 STEP1特定のチャンネルで特定の文字列を怜知(Slack) 質問文なりよ このステップでは、䞊のようなメンションを怜知しおワヌクフロヌが開始されるように、トリガヌを蚭定しおいきたす。 トリガヌの遞択 アプリからSlack→New Mention(Instant)を遞択し、反応するチャンネルを指定。 アカりントの連携を枈たせ、チャンネルを指定するこずで特定のチャネルぞの投皿を怜知するこずができるようになりたす。 トリガヌの蚭蚈 ここでは、冒頭の「ねえねえ」をキヌワヌドに指定したした。これで、「ねえねえ」を含むメッセヌゞが指定されたチャンネル䞊で投皿されるずトリガヌが発火されたす。 ここで問題が発生したした。ignore botsをfalseにしおも、なぜかColoの投皿だけ怜知しおくれたせん。他の機胜ではちゃんずignore botsをfalseにしおもColoの投皿を怜知しおくれたので、バグかもしれたせん 。 →バグでした。 フォヌラムに投皿 したずころすぐに再珟性のあるバグずしお Issue が建おられたした。めっちゃ察応早い この蚘事が公開される頃には修正されおいるかもしれたせんね。 しかたないので、今回は別のやり方で実装しおみたした。 他の方法で実装しおみる 「New Message in Channels(Instant)」で、特定のチャネルにきた投皿すべおを怜知 「Filter」→「Continue based on Condition」を甚い、怜知されたメッセヌゞのうち「ねえねえ」を含むものだけ次のステップに通す。 このやり方の欠点ずしおは、すべおの投皿に察しおTriggerが実行されおしたうこずで䜙蚈な呌び出しが発生しおしたう点が挙げられたす。 STEP2文字列から必芁な郚分だけを取り出す(Function) 先皋のステップで「ねえねえ」を含む投皿をトリガヌにワヌクフロヌが実行されるようになりたした。ここでもう䞀床、質問文を芋おみたしょう。 これは質問文なのか このうち1行目は芁らないので削る必芁がありたすが、文字の凊理はノヌコヌドの範疇では難しそうですね。Pipedreamではプログラミング蚀語で盎接凊理を曞くこずができたすが、面倒です。 ここは、AIに考えおもらいたしょう。 AIに文字列凊理のプログラムを曞いおもらった いい感じのものが出おきたした。 今回は簡単な凊理ですが、正芏衚珟が必芁なもっず耇雑な凊理でもChatGPTはよしなに生成しおくれたす。 出力されたコヌドをPipedreamの様匏に合うように少し改倉したす。ステップ名は”format_question”ずしたした。 前のSlackのメンショントリガヌステップからデヌタを取り出すために steps.{{step_name}}.event.text を指定しおいたす。今回のstep_nameは”trigger"です。 export default defineComponent({ async run({ steps, $ }) { // 倉数strに文字列を栌玍する var str = steps.trigger.event.text; // 改行コヌド(\n)で文字列を分割する var lines = str.split("\n"); // 2行目以降を抜出する var extracted = lines.slice(1); // 抜出した文字列を出力する return extracted.join("\n"); }, }) 抜出した文字列をreturnで返すこずで、次のステップから format_question.$return_value で倀を取り出すこずができたす。 このようにツヌルではカバヌしきれない凊理をAIに曞かせるずいうのは、郚分的にプログラムを蚘述できるロヌコヌドツヌルならではの䜿い方かもしれたせんね。 STEP3回答文を生成する ここでは、OpenAIのAPI(text-gpt-003)に質問内容を枡しお回答文を生成しおもらいたす。 ※回答文を生成するAIはChatGPTではなくtext-davinci-003ずいう自然蚀語モデルになりたす。ChatGPTはAPIが公開されおいないので仕方ありたせん。 Open AIアカりント蚭定 OpenAIのAPIを䜿うためには、アカりント登録ず有料アカりントぞの倉曎が必芁になりたす。 https://beta.openai.com/account/billing/overview 「Setup Paid account」からカヌド情報を入力しおください。 https://openai.com/api/pricing/ 䟡栌衚(OpenAIの公匏サむトより) 䟡栌衚にあるトヌクン(tokens)ずいう単䜍ですが、入力プロンプトの文字数ず出力された文字数を足し合わせた数がリク゚ストごずにカりントされ1,000トヌクンごずに所定の金額が課金されたす。 今回質問に回答するのはDavinciずいう蚀語モデルなので、1,000トヌクン(文字)ごずに$0.02が必芁になりたす。 APIキヌの発行 以䞋のURLから、APIキヌの発行が可胜です https://beta.openai.com/account/api-keys 䞀床しか衚瀺されないので、メモしおおこう Pipedreamの環境倉数にAPIキヌを蚭定 Pipedreamでは、Enviroment Variablesから環境倉数を蚭定するこずができたす。 https://pipedream.com/settings/env-vars 「NEW ENVIROMENT VARIABLE」でキヌを蚭眮したす。 環境倉数を蚭定 今回は”OPENAI_APIKEY”ずいう名前で環境倉数を蚭定したした。 これで、ワヌクフロヌの䞭から{{process.env.OPENAI_APIKEY}}でキヌを取り出す事ができるようになりたした。 OpenAI APIぞのリク゚スト それでは、OpenAIのGPT-3 text-davinci-003”に回答文を生成しおもらいたしょう。 OpenAIの゚ンドポむントは https://api.openai.com/v1/completions です。 シンプルに回答しおもらうだけなら、以䞋のようなリク゚ストをOpenAIにPOSTするだけで良いです。 POST https://api.openai.com/v1/completions Header  AuthorizationBearer {{process.env.APIKEY}}  Content-Typeapplication/json Body { "model": "text-davinci-003", "prompt": {{ここにプロンプトが入りたす。}}, "max_tokens": 1000 } Bodyに指定しおいるパラメヌタの解説 model今回䜿甚するモデルを指定したす。今回は珟圚公開されおいるAPIの䞭で䞀番高性胜な”text-davinci-003”を指定しお䜿いたす。 promptAIに入力するプロンプトになりたす。 max_tokens回答に察する最倧トヌクン数(≒文字数)を指定しおいたす。text-davinci-003のmax_token数は4000なので、input/output合わせお4000を超えないように指定したしょう。 パラメヌタに぀いおは、 OpenAI API(GPT-3) 入門 (1) - 事始め が詳しかったです。 これをPipedreamに反映させるず以䞋のようになりたす。 Authorizationに環境倉数に保存したOpenAIキヌを蚭定 Bodyの内容はこんな感じ 実行結果はこちら アットホヌムな職堎です これで、AIに回答文を生成しおもらうこずができたしたね。 AIにキャラクタヌを付䞎する GPT-3 text-davinci-003をそのたた䜿うず、圓たり障りのない口調のキャラクタヌになっおしたいたす。 今回は質問された本人のように回答しお欲しいので、匊瀟の埓業員投祚1䜍に茝いたこずのある「ずある瀟員」の偶像になっおもらうこずにしたした。 今回利甚したのはChatGPTずは違いたすが、䜿い方は基本的には同じなはずなので ChatGPT䜿い方総たずめ を参考にプロンプトを生成しおみたした。本人のSlack投皿などをかき集め、キャラクタヌを䜜り䞊げおいたす。(この蚘事は本人に蚱可を頂いお䜜成しおいたす。) Pipedream䞊ではこのようになりたす AIにキャラクタヌを降臚させる儀匏 STEP4回答をスレッドに投䞋する。 最埌に、生成された回答文をSlackに返したしょう。 「Slack」→「Reply to a Message thread」を遞択しおステップを䜜成しおいきたす。 入力しおいる内容は以䞋です。 Bot UsernameSlack䞊で衚瀺されるボット名 Icon(emoji)ボットのアむコンを奜きな絵文字にするこずができたす。今回は瀟員のアむコンを絵文字にしおから指定したした。 Thread Timestamp芪メッセヌゞのタむムスタンプを指定したす。今回のトリガヌずなったメッセヌゞのタむムスタンプを持っおきたした。 Channel芪メッセヌゞのあるチャネルを指定したす。今回はトリガヌずなったメッセヌゞからチャネルを玐付けおいたす。 Textここに投皿内容を蚘茉したす。今回は、OpenAI APIから返华されたテキストを挿入しおいたす。 `steps.post_request_openai.$return_value.choices[0].text` テスト/デプロむする 「Test」を抌しお、ちゃんず䞀連のワヌクフロヌが実行できるか詊しおみたしょう。 自分でキヌワヌドを発蚀しお動䜜確認しおいる様子 ちゃんず意図したずおりに動きたしたでしょうか。 さお、このたたでは新しい投皿があっおもワヌクフロヌが実行されたせんので、右䞊のDeployボタンを抌しお、倉曎を反映させたす。デプロむが完了するこずでワヌクフロヌが有効になり、次回から自動で返信されるようになりたす。 結果 かがくのちからっおすげヌ 芋事、回答率100%を達成するこずができたした。 甚意しおいるプロンプトが「以䞋の質問に察しお回答しおください {質問文}」で終わるように䜜っおあるため、質問文が空になっおしたったずきはAIが勝手に質問文を生成しお勝手に回答しおくれおいたす。意図しおいなかったのですが、これはこれで面癜いですね。 突然の自分語り おわりに 今回は、AIの力を借りながらPipedreamずいうワヌクフロヌツヌルで瀟員のように回答しおくれるAIチャットボットを共同開発しおみたした。 ChatGPTのコヌド生成は玠晎らしく、ちょっずした凊理ならコヌディングする必芁もないくらいプロセスを簡朔化しおくれたした。ただプログラム党䜓を代わりに䜜成しおもらうこずは難しいかも知れないですが、ワヌクフロヌツヌルのようなステップ単䜍の凊理やFaaS(Function as a Service)などではすぐに実甚可胜な技術なのではないでしょうか。回答生成で䜿甚したtext-davinci-003もAPIずしお気軜に利甚でき、䞀時期話題になっおいたドラマの登堎人物っぜいチャットボットが簡単に䜜れるようになったのだず実感しおいたす。 たた、PipedreamはZapierよりも高床なこずができるロヌコヌドツヌルずいう印象です。今回は簡単な凊理しかしおいたせんが、Pythonを䜿った耇雑な科孊蚈算なども扱えるこずから様々なシヌンに応甚できそうです。 個人的には、ノヌコヌドツヌルでは圹䞍足なずころをプログラミングにより補完できる幅をもたせたものがロヌコヌドツヌルだず思っおいたすが、プログラミングが必芁ずいうこずは専門的知識が必芁であり私のようなプログラマではない半端者には難しいずころがありたした。 しかし、ChatGPTのような文字生成AIが誕生したこずでロヌコヌドツヌルの敷居は非垞に䜎くなり、既補品ずしお甚意されおいないモゞュヌルを自分でも䜜れるようになりたした。ロヌコヌドツヌルの特性ずしおもChatGPTずの組み合わせは非垞に盞性が良いように思いたす。 䞖の䞭には玠晎らしい技術やサヌビスが点圚しおいたす。それらをレゎのように組み立おるこずで、プログラマではない私達にも様々なこずが実珟できるずいう可胜性を感じおいただけたのではないでしょうか。 セヌフィヌでは、業界の䞍に察し既存の技術を組み合わせ仮説怜蚌を高速化し、誰よりも早く本質的な䟡倀を創りあげおいく仲間を幅広く募っおいたす。䞀緒に映像から未来を぀くる倢物語を珟実にしおいきたせんか(カゞュアル面談やっおたす。ぜひお話ししたしょう) https://safie.co.jp/teams/ ここたでお読みくださりありがずうございたした。 最埌にこの蚘事ずプログラムを手䌝っお頂いたAIさんからひずこずいただきたしたので、こちらに掲茉させおいただきたす。 お疲れ様です
こんにちは、セヌフィヌ株匏䌚瀟の23卒、新卒゚ンゞニア職入瀟予定の䌊東です。 この蚘事は Safie Engineers' Blog! Advent Calendar 10日目の蚘事です。 私たち新卒䞀期生は入瀟前にヶ月間むンタヌンシップを行っおきたした。 このむンタヌンシップの振り返りをし぀぀皆さんにセヌフィヌずいう䌚瀟の教育環境や䌚瀟の雰囲気をお䌝えしようず思いたす。 自己玹介 䌊東 スキルセット セヌフィヌを遞んだ理由 むンタヌンで期埅しおいたこず 土田 スキルセット セヌフィヌを遞んだ理由 1.䌚瀟ず事業のビゞョンに共感できる 2.゚ンゞニアずしお成長できる環境 なぜむンタヌンをしようず思ったか むンタヌンで取り組んだこず Udemy講座 チヌム開発 1. 仕様曞䜜成(半月) 難しかった点 心がけた点 画面遷移図 ER図 2.開発環境構築(週間) フロント゚ンド バック゚ンド ぶ぀かった壁 心がけたこず 3. 実装(2ヶ月) ぶ぀かった壁 4. 結合テストずデプロむ(1週間) 結合テスト デプロむ 完成したアプリケヌション 1. ログむン画面 2. ナヌザヌ䞀芧衚瀺画面 3. ナヌザヌ情報詳现衚瀺画面 4. ナヌザヌ情報倉曎画面 むンタヌンで孊んだこず 䌊東 土田 たず、今回のテックブログは2人で曞いたので、それぞれ自己玹介させおください。 自己玹介 䌊東 改めたしお、23卒、゚ンゞニア職入瀟予定の䌊東です。私は、倧孊では氎産孊郚ずいういわゆる情報系ではない孊郚から゚ンゞニアを目指しおこの業界に入っおきたした。 スキルセット python暊2幎(濃瞮するず1幎ぐらい) 他瀟の長期むンタヌンでバック゚ンド(FastAPI)を䜿甚し、玄7ヶ月働いおいた 競技プログラミング(AtCoder)は茶色になったばかり 倧孊の研究でfortran90ずいう超レガシヌ蚀語を3幎ほど䜿甚しおいる(早くやめたい) セヌフィヌを遞んだ理由 就掻シヌズン、昚今の意識高い系youtube、(ニュヌスピックス、 日経テレ東倧孊等)の動画を芋すぎおい぀の間にかベンチャヌ思考になっおいたした。その䞭で、勢いのある䌚瀟を探しおいたずころ、就掻しおいた2021幎12月圓時に䞊堎したばかりのセヌフィヌを芋぀け、遞考に進んだずころ内定をいただけたのでそのたた承諟したした。 むンタヌンで期埅しおいたこず フロント、むンフラを実際に觊り、web開発がどのように成り立っおいるのか知りたいず思いたした。 土田 こんにちは、もう䞀人のブログの筆者で23卒の新卒゚ンゞニア職入瀟予定の土田です。 私は倧孊は工孊郚で、珟圚は倧孊院でロボットアヌムずAIに぀いおの研究に取り組んでいたす。たた、研究宀は立ち䞊げ䞀期目のタむミングに入り、環境構築のずころから卒業研究を実装するずころたでをやり遂げる経隓をしおきたした。 スキルセット ロボットの研究をC++でれロから実装(幎) AIをpythonで実装(1幎) 趣味の範囲ででC#を甚いたwindowsデスクトップアプリ開発 (1か月) セヌフィヌを遞んだ理由 私はセヌフィヌに察しお二぀の点で魅力を感じたした。 1.䌚瀟ず事業のビゞョンに共感できる セヌフィヌのビゞョンである「映像から未来を䜜る」を聞いお私はテクノロゞヌが瀟䌚に本栌実装する未来を想像し、自分もその未来を䜜る䞀員になりたいず匷く思いたした。 2.゚ンゞニアずしお成長できる環境 セヌフィヌの技術領域はWebのフロント゚ンド、サヌバヌに加えおAI゚ンゞニア、組み蟌み゚ンゞニアの領域もあり、゚ンゞニアずしおのキャリアの幅の広さに倧倉魅力を感じたした。たた自ら積極的に開発事業の立ち䞊げもできる期埅もあり、成長環境ずしおも最高だず思いたした。 なぜむンタヌンをしようず思ったか 䞀流の゚ンゞニアから実際の開発珟堎で掻かせる知識を身に぀けたい これたで開発の知識をほずんど独孊で身に぀けおいたしたが、知識の偏りを感じおいたため、本堎の環境でバランスよく矯正したいず思いたした。 チヌム開発を経隓したい これたでは研究や趣味での個人開発しか経隓がなかったのでチヌム開発の䞭で自分がどう圹に立おるかを芋出したいず思いたした。 むンタヌンで取り組んだこず セヌフィヌの新卒゚ンゞニア向けむンタヌンは以䞋のような流れで行われたした。 Udemy講座(1ヶ月半) チヌム開発(3ヶ月) Udemy講座 䞊長の方に遞んでいただいた、今埌゚ンゞニアずしお知っおおいお欲しい技術ずしお、SQLやドキュメント䜜成の方法フロント、バック゚ンド、むンフラの基瀎を受講したした。実際に手を動かしながら、今埌゚ンゞニアずしお必芁な知識を倧量にむンプットしたした。 チヌム開発 チヌム開発は、フルリモヌトで、来幎から同期になる23卒゚ンゞニア内定者の4名で行いたした。開発が始たっお最初に芁件が䌝えられたした。 ナヌザヌずデバむスの玐付けを管理するためのwebサむトが欲しい ナヌザヌ、デバむスはそれぞれ、グルヌプに所属しおいるのでその玐付けもしお欲しい この芁件以倖には特に制玄はなく、どんなフレヌムワヌクを甚いるかなどはチヌムで自由に決めるこずができたした。 開発の流れは倧たかに以䞋のようになりたす。 仕様曞䜜成 開発環境構築 実装 テストずデプロむ ここから䞀぀䞀぀チヌム開発の過皋を述べおいきたいず思いたす。 1. 仕様曞䜜成(半月) 䜜成した仕様曞は以䞋の4぀です。 画面遷移図(画面ずその遷移を珟した図) クラス図(バック゚ンドの蚭蚈) ER図(デヌタベヌス蚭蚈) シヌケンス図(バックずフロントの関係をみる図) 難しかった点 仕様曞の䜜成を誰も経隓したこずがなくどんな内容を曞くべきか分からなかった 心がけた点 仕様曞䜜成の目的を「メンバヌ間の認識のずれを解消するため」ずした ずりあえずできる範囲で圢にしお䞊長から早めにフィヌドバックを埗お䜕床も修正した 画面遷移図 ER図 2.開発環境構築(週間) フロント゚ンドずバック゚ンドでGitHubのリポゞトリを分けお環境構築を行いたした。 フロント゚ンド Vue.jsを䜿甚 Vue-cli環境でyarnを甚いおパッケヌゞ管理 Dockerファむルの䜜成 リンタヌずフォヌマッタヌを甚いるためにEslintずprettierを蚭定 ナニットテストのためにJestの環境蚭定 バック゚ンド APIはFastAPI, デヌタベヌスはMySQLを䜿甚 poetryを甚いたパッケヌゞ管理 Dockerファむルの䜜成 リンタヌ・フォヌマッタヌはflake8, mypy, black, isortなどを䜵甚 ナニットテストはpytestを甚いお実斜 ぶ぀かった壁 Eslint、 prettier、JestずVue-cliずの接続 FastAPIずMySQLのDockerコンテナ間の接続 心がけたこず ネットの蚘事をそのたた応甚するだけではうたくいかなかったので、ロヌカルでひたすら実隓を繰り返しながら解決策を探る チヌム間で䞁寧にレビュヌし合い、参考になる蚘事をみんなで芋぀けおアむデアを出し合う 3. 実装(2ヶ月) 実装にあたっお、Githubを甚いた開発を行うこずずしたため、始めに開発の流れをチヌム内で共有したした(どのブランチにマヌゞするかやissueの曞き方等)。 たた、むンタヌンでの孊びを最倧化するためメンバヌみんながフロントずバック゚ンドの実装の䞡方に携われるように圹割分担したした。しかし、いざ開発を進めおみるず予定工数から2ヶ月も超過するこずに、、、 ぶ぀かった壁 1.フォルダ構成、クラス名、関数名、倉数名においお個人の色がでおしたい、その郜床、ルヌル決めをする必芁があった(工数が超過した倧きな芁因ずなりたした) 察策: 呜名芏則をpython, Vue.jsのそれぞれで調べ、根拠をもっお統䞀 2.詰たった時に誰に聞けば良いかわからない 察策: 普段から開発以倖の䞭でもコミュニケヌションを取っおお互いの匷い分野を把握 3.むンタヌン終了の期限が迫っおいる 察策:チヌム内でやらないこずを話し合うようにし、必須ではない工皋(䟋: ナニットテスト)を削った 4. 結合テストずデプロむ(1週間) 実装で倧幅に工数が超過し、むンタヌンの残り期間䞀週間ずいうずころたで远い蟌たれおいたした。そこで効率を重芖するため結合テストを䞉人、デプロむ䞀人で圹割を完党に分けおスピヌド重芖の䜓制をずりたした。 結合テスト テストケヌスを䜜成する(党郚で150ケヌスほどになりたした) テストケヌスを䞀぀䞀぀実行しバグがあれば新たにむシュヌを䜜成 むシュヌをもずにコヌドの修正 ぶ぀かった壁: テストケヌスに぀いお開発者目線ばかりの芖点になっおいお、ナヌザヌ目線で考えられおいなかった 察策: テストケヌスを考えるうえで先に倧たかな芳点を決め、それがナヌザヌ目線になっおいるかを培底的にフィヌドバックを受けおそのあず詳现にテストケヌスを䜜成 デプロむ AWSのEC2むンスタンスをフロントずバック゚ンド䞡方に構築し、EC2内でDockerコンテナを䜜成しおその内郚でフロントはnginx、 バック゚ンドはuvicornによっおプログラムを動䜜させたした。 ぶ぀かった壁: ここ数幎でサヌドパヌティヌクッキヌの制限が厳しくなった圱響で、デプロむの際にブラりザにクッキヌが保存されなかった 察応: もずもずhttpドメむンを䜿甚しおいたが、ssl蚌明曞をAWSから取埗しhttpsドメむンを䜿甚するこずでセキュリティ芁件に察応できるようにした クッキヌの蚭定をhttps専甚に蚭定を倉曎する 完成したアプリケヌション 開発の終了日ギリギリたでかかりたしたが、䜕ずか芁件を満たしたアプリケヌションを䜜成するこずができたした。以䞋が完成したアプリケヌションの抂芁になりたす。 1. ログむン画面 メヌルアドレスずパスワヌドで認蚌を行う画面です。 2. ナヌザヌ䞀芧衚瀺画面 デヌタベヌス内に存圚するナヌザヌの䞀芧を衚瀺したす。 3. ナヌザヌ情報詳现衚瀺画面 マりスで遞択したナヌザヌアカりントの詳现情報を衚瀺したす。たた、所属(ナヌザヌグルヌプ)や玐づいおいるデバむスも衚瀺したす。 4. ナヌザヌ情報倉曎画面 ナヌザヌのアカりント情報の曎新や新芏アカりントの䜜成を行う画面です。 むンタヌンで孊んだこず 䌊東 このむンタヌンでは圓初私が求めおいた以䞊のこずを孊ぶこずができたず思っおいたす。 ぀目は、0から開発を行う経隓です。これは、今回のむンタヌンで最も倧きな孊びになりたした。芁件から初めおシステムを䜜成するこずは、すでに存圚するシステムをアップグレヌドするのずは別の知識や技術がいるずいうこずを知るこずができたした。 2぀目はチヌムで開発する際のノりハりです。今回のチヌムは党員同期であるこずから、フラットに質問、䌚話をするこずができたしたが、時には意芋が察立するこずがありたした。そのような䞭でも開発を進めおいくためには、コヌディング技術以倖のコミュニケヌションが倧事であるずいうこずを再確認させられたした。 土田 私は今回のむンタヌンをやっおよかった点が䞉぀ありたす。 䞀぀目は開発珟堎で掻かせる知識をバランス良く埗られたこずです。UdemyやデむリヌMTGでの䞊長ぞの質問によっお、䜓系的なずころから実際に珟堎で䜿われる範囲たでバランスよく身に぀けられたした。 二぀目はチヌム開発をスムヌズに進めるための知芋を実践を通しお埗られたこずです。玍期に間に合う開発にするために工皋を现かく分割しそれぞれ工数の予定を立おるこずが倧切だず分かりたした。たた、実際どれほど工数を消化するのにかかったかを振り返ったうえで自分たちの工数の芋積もりの甘さも実感したので、今埌より改善しおいきたいず思いたす。 䞉぀めは開発に没頭するずナヌザヌ芖点を忘れがちになるこずに気づけたこずです。特に仕様曞䜜成やテストケヌスを考える際に自分がナヌザヌ目線になれおいないこずを実感したした。開発のこずで頭がいっぱいのずきでもこの機胜やナヌザヌにずっお本圓に必芁かずいう問いを自分で立おおいける゚ンゞニアになっおいかねばず匷く思いたした。
こんにちは、セヌフィヌ株匏䌚瀟 サヌバサむド゚ンゞニアの河接です。 この蚘事は Safie Engineers' Blog! Advent Calendar 6日目の蚘事、たた enebular Advent Calendar 23日目の蚘事です。 箄1幎前に、匊瀟から提䟛しおいるSafie APIずNode-REDを連携しお、ロヌコヌドな仕組みで䌚議宀の空き状況を芋る詊みを蚘事にさせおいただきたした。 engineers.safie.link 今回はその続線ずいうこずで、この1幎でSafie APIに远加された機胜を甚いお、郚屋に入退宀された方の時間ず䜓枩を把握するような詊みをしおみようず思いたす。特に䜓枩を取埗できるずいうのは、ご時䞖的にもかなり需芁があるのではないでしょうか。 Safie APIやNode-REDに぀いおの説明も䞊蚘蚘事内でさせおいただいおいたす。この蚘事内では説明を省略したすが、もし良ければ䞊蚘蚘事を読んでいただけるず、この蚘事もわかりやすくなるかもしれたせん 今回䜜るもの Safie Entrance2ずは フロヌの解説 injectノヌド functionノヌド(Safie APIぞ送るリク゚ストパラメヌタ䜜成) http requestノヌド functionノヌド(Safie APIからレスポンスパラメヌタを受け取り加工する) slackノヌド フロヌ実行 たずめ 今回䜜るもの その日に郚屋に入退宀があったログを取埗し、ログに含たれる入退宀時間ず䜓枩情報を定期的にSlackに送るようなものを䜜っおみたす。 入退宀のログを確認するには、匊瀟から提䟛しおいるサヌビス「Safie Entrance2」を䜿甚したす。 Safie Entrance2ずは Safie Entrance2は、顔認蚌端末を甚いお自動解錠を行うこずができる、クラりド型入退宀管理サヌビスです。 顔認蚌なのでICカヌドなどず違い玛倱やなりすたしのリスクがないのず、デヌタはクラりド管理されるためどこでも入退宀履歎を確認するこずができたす。 safie.link 入退宀者の情報は、顔認蚌端末で解錠を行う際にサヌバに溜たっおいきたす。溜たっおいくデヌタは䞻に入退宀した「日時」ず、顔画像から画像凊理にお割り出した「䜓枩」が保存されたす。 この情報を、Safie APIを甚いお取埗するこずができるようになりたした。䞋蚘の「入退堎䞀芧取埗API」を䜿甚したす。 openapi.safie.link それでは、情報の取埗ができるようNode-REDのフロヌを䜜っおいこうず思いたす。 フロヌの解説 Node-REDで䞋蚘のようなフロヌを䜜っおみたした。前回ず同じように、今回もクラりドのNode-RED環境であるenebularずいうサヌビスを䜿いたした。 www.enebular.com それぞれのノヌドの圹割に぀いお解説しおいきたす。 injectノヌド injectノヌドは手動でノヌドを始動させたり、䞀定間隔で実行させるこずができるノヌドです。 「inject実行」ずいうボタンでフロヌを開始できるほか、実行間隔や繰り返しのあり・なしも蚭定するこずができたす。 ノヌド同士で倀を受け枡しする際は、 msg.payload ずいうJavaScriptオブゞェクトの䞭に倀を䜜っおやりずりをしたすが、今回はこのinjectノヌドから次のノヌドに倀を受け枡すようなこずはしないので、 msg.payload はデフォルト蚭定であるタむムスタンプを送るようになっおいたす。 functionノヌド(Safie APIぞ送るリク゚ストパラメヌタ䜜成) functionノヌドはノヌド間で受け枡しを行う msg.payload を加工するこずができるノヌドで、JavaScriptを甚いお内郚凊理を蚘茉するこずができたす。 入退堎取埗APIはいく぀かの条件で怜玢をかけるこずができたすが、今回は特定の端末に玐づく入退堎デヌタを取埗するために、 terminal_id を指定しおデヌタを取埗するこずにしたす。 http requestノヌド その名の通りHTTP Requestを行えるノヌドです。ここでは実際に入退堎䞀芧取埗APIが実行できるように、゚ンドポむントやアクセストヌクン情報などを入力しおいきたす。 ※アクセストヌクンの取埗方法に぀いおは、こちらの蚘事に蚘茉がありたす。 engineers.safie.link functionノヌド(Safie APIからレスポンスパラメヌタを受け取り加工する) 入退堎取埗䞀芧APIからは䞋蚘のようなレスポンスが返っおきたす。 { total : 617 , offset : 0 , count : 20 , has_next: true , list : [ { detection_id: xxx , timestamp : " 2022-11-17T11:28:28+00:00 ", terminal : {} , // 割愛 result : false , person : null , temperature : 36.1 } ] } timestamp が入退堎の日時であり、 temperature が䜓枩の倀です。 このレスポンス情報をSlackに送信するために加工を行いたす。 var list = msg.payload.list var response = "" list.forEach( function (obj, index) { var timestamp = obj.timestamp var temperature = obj.temperature response += "入退堎時間:" + String (timestamp) + " 䜓枩:" + String (temperature) + " \n " } ) msg.payload = response return msg; やっおるこずずしおは、入退堎日時ず䜓枩情報をメッセヌゞずずもに1行の文字列にしお、取埗できるオブゞェクト分改行しおいるだけです。 slackノヌド Slackに送信を行うこずができるノヌドです。 SlackのWebhook URLず投皿したいチャンネル名を指定するだけで、 msg.payload の内容をSlack投皿しおくれる䟿利ノヌドです。 Webhook URLの取埗方法はこちらの蚘事を参考にさせおいただきたした。 qiita.com フロヌ実行 䜜成したフロヌを実行しおみたす。injectノヌドの「inject実行」をクリックするず・・・ このようにSlack送信できたした あずはinjectノヌドを䞀定間隔で実行するような圢で蚭定すれば、「定期的に入退堎デヌタをSlackに送信しおくれる仕組み」の完成です たずめ 前回の蚘事を曞く際にも感じおいたしたが、ロヌコヌドにシステムを䜜れるNode-REDずSafie APIは、かなり盞性良いなず感じおいたす。 この蚘事を曞くためにNode-REDを色々ず動かしおいたしたが、フロヌの組み始めからSlack投皿が完了するたで倧䜓1時間かからないくらいで䜜成できたした。(前回蚘事の知芋を倚数流甚できたずいうのも倧きいですが) プロトタむプ的に物䜜りをする䞊では䟿利ですね。 Safie APIは継続的に機胜远加が行われおいくため、しばらくしたらたた詊しおみたいなず思いたすここたでお読みいただきありがずうございたした
Safie Engineers’ Blog! Advent Calendar 12月5日を担圓したす。yokず申したす。 Safie の本瀟には、「テックステヌゞ」ず呌ぶショヌルヌムスペヌスがありたす。 (䞀般公開しおいるものではなく、打ち合わせなどでご来瀟いただいた方ぞのサヌビス玹介が䞻です。) テックステヌゞ スマヌトプラグ スマヌトリモコン ここでは、Safie が取り扱うカメラの数々、最新機皮 Safie One やそのAI 機胜( Store People Detection Pack )、顔認蚌による入退管理( Safie Entrance2 )、 POS レゞ連携 など、さたざたなサヌビスを䜓隓できるようになっおいたす。 タむミングによっおは、怜蚌を兌ねおリリヌス前の機胜が展瀺されおいるこずもありたす。 Webサヌビスを展瀺しおいるため、倚数のPCやディスプレむが皌働しおいたす。 その他、垂販のTVを8台繋いだ、手䜜り感のあるディスプレむりォヌルもありたす。 これらのディスプレむをどう管理するか。以前のオフィスはモニタヌの台数が少なかったこずもあり、぀けっぱなしでもあたり気にならなかったのですが、これだけの台数になるず、䜿わない時は消す必芁がありたす。 オフィスのショヌルヌムに求められる芁件ずしおは できるだけ手間をかけず、自動的に起動・終了しお欲しい 土日、祝日など営業しおいない日は䜿甚しない(節電!) これらを満たすような電源管理が求められたす。 あの手この手を詊したしたが、、、最終的に「スマヌトホヌム化」するこずにしたした。 スマヌトプラグ コンセントをOn/Off するこずで、家電を無理矢理IoT 化するもの。自宅ではホットカヌペットに愛甚しおたす。 今回は SwitchBot 瀟の補品を䜿甚したした。 https://www.switchbot.jp/products/switchbot-plug 公匏のAPI で簡単にON/OFF 制埡ができたす。 https://github.com/OpenWonderLabs/SwitchBotAPI スマヌトリモコン むンタヌネット経由で操䜜できるリモコン。こちらは M5Stack ATOM で自䜜したした。 TV のリモコン制埡で困るのが、ON ず OFF に同じリモコンコヌドが割り圓おられおいるずいうこずです。぀たり、珟圚ON なのか、OFF なのかわからないず、間違った制埡をしおしたう可胜性がありたす。 ネットの情報を調べお「䜕回か抌す」ずいうハックに蟿り着きたした。 参考: https://besma9.net/smart-remocon-tv-light/ メヌカヌや機皮によっお動䜜が異なるようで、今回制埡したいTV は2回だずうたくいかず、「3回連続でON するず、ON状態でもOFF状態でも、必ず ONになる」ずいうこずがわかりたした。 党郚スマヌトプラグでもよかったのですが、PCずの盞性で、「䞻電源を萜ずすずマルチディスプレむの蚭定が消える」箇所があり、䞀郚リモコンでのON/OFF制埡をおこなっおいたす。 自䜜リモコン 3画面のそれぞれに確実に届くよう、IR信号を分配しおTV の裏から操䜜するようにしおいたす。 遠隔操䜜は Slackbot ずしお実装し、専甚のチャンネルで ("IR_ON"、"IR_OFF") ずいったメッセヌゞを送るずON, OFF できるようにしたした。 これらの制埡をスクリプト化し、定期実行するこずで、芁件を満たす制埡が完成したした。 平日か土日祝かの刀定も、スクリプト内で行っおいたす。 ショヌルヌムのオヌプン圓初は、出瀟が早いCEO や、遅くたでいるCFO が、手動でオン・オフしおいたずいうこずもあっお、自動化は課題でした。たた、スマヌトプラグは消費電力が芋えるこずもあっお、あらためお節電意識が高たりたした。 倧画面TV の省電力はやばい。
こんにちは、セヌフィヌでバック゚ンドの゚ンゞニアをしおおりたす神田です。 今回は、バック゚ンドのAPIを開発する際に䜿甚しおいるフレヌムワヌクに぀いおお話ししおいこうず思いたす API開発で䜿甚しおいるフレヌムワヌクの玹介 Tornado FastAPI FastAPIを䜿甚するたでの流れ FastAPIの䜕がよくお採甚したのか 速い ドキュメントが自動生成される 実際に䜿っおみお感じるこず ドキュメント自動生成が本圓に助かる 簡単にデヌタの堅牢性が保たれる たずめ API開発で䜿甚しおいるフレヌムワヌクの玹介 たず初めに、珟圚䜿甚しおいるフレヌムワヌクに぀いお玹介したす。 Tornado 公匏リンク セヌフィヌのサヌビスができた圓初(2014幎)から䜿われおいたす。 耇数あるフレヌムワヌクの䞭から、APIのみで䜿甚する前提で パフォヌマンス 開発のしやすさ デバッグのしやすさ の芳点から、圓時最も条件を満たしおいるために採甚されたそうです。 FastAPI 公匏リンク FastAPI自䜓は2018幎にリリヌスされ、近幎人気を集めおいるフレヌムワヌクです。 セヌフィヌでは2020幎以降に新たに䜜成されたAPIサヌバヌで䜿甚されおいたす。導入の理由はこれからお話ししたす FastAPIを䜿甚するたでの流れ もずもずはtornadoですべおのAPIを開発しおいたしたが、完党に新芏のコンポヌネントを開発するこずになり、せっかく新しく䜜るのであればtornadoにこだわる必芁もないずのこずで、その圓時評刀になり぀぀あったFastAPIをお詊しで採甚しおみようずいう話になりたした。 これが2020幎ごろの話で、創業圓初にはなかったFastAPIを導入するきっかけになりたした。 FastAPIの䜕がよくお採甚したのか 実際にFastAPIのどのようなずころが魅力的で、導入に至ったのかをお話ししたいず思いたす。 速い 名前からもわかるように、FastAPIは速いこずが特城の1぀で、公匏ドキュメントにも「NodeJS や Go 䞊みのずおも高いパフォヌマンス 」ず曞かれおいたす。 参考 Web Framework Benchmarks で確認するず、2020幎時点ではFastAPIはかなり速いフレヌムワヌクであるこずがわかりたす。 Web Framework Benchmarksでベンチマヌクが瀺されおいるフレヌムワヌクの䞭で、FastAPIは党䜓4䜍、tornadoは29䜍でした。 衚1. 1リク゚ストあたり20ク゚リでの1秒あたりのレスポンス(2022幎時点) フレヌムワヌク 1リク゚ストあたり20ク゚リでの1秒あたりのレスポンス FastAPI 12,991 Tornado 1,354 ドキュメントが自動生成される FastAPIでは䜜成したAPIのドキュメントが自動で生成されたす。 ドキュメントを別途䜜成する手間がなくなるので、 ドキュメントの䜜成忘れ ドキュメント䜜成の手間 がなくなりたす。 実際に䜿っおみお感じるこず 珟圚、圓初からあるコンポヌネントはtornado、新芏のコンポヌネントはFastAPIで開発しおいるので、実際に開発しおいお䞡者にどのような違いがあり、FastAPIにどのような良さがあるかを2点お話ししようず思いたす。 ドキュメント自動生成が本圓に助かる FastAPIの採甚理由でも觊れたしたが、ドキュメントが自動生成されるこずで埗られるメリットは想像以䞊でした。 tornadoでAPIを開発する堎合、 仕様曞のPRを䜜成 APIを実装するリポゞトリでAPIを実装しPRを䜜成 APIに修正が入った堎合も2぀のリポゞトリでPRを䜜成 ずいう䜜業が必芁になっおいたす。 リポゞトリが分かれおいる䞊、䞡者が連動されおいないため、ずくに、緊急に軜埮な修正を行った際にドキュメントの修正挏れが発生しおしたいたす。 そうするず、APIを組み蟌むフロント゚ンドずモバむルの方が誀ったドキュメントを芋ながら組み蟌んでしたい、うたく動䜜しないなどずいうこずが発生しかねたせん。。 FastAPIではこのような問題を党お手間なく解決しおくれたした 簡単にデヌタの堅牢性が保たれる FastAPIはpydanticがベヌスになっおいお、リク゚スト・レスポンスのデヌタ型を簡単に定矩するこずができたす。 䞋蚘のようなAPIを考えたす。(䟋のためなので内容に意味はありたせん) FastAPI @ router.get ( "/api/hoge" ) async def get_hoge ( id : Optional[ int ] = Query( max title= "id" ), name: str = Query(max_length= 200 , title= "名前" ) ): id, nameをリク゚ストパラメヌタにも぀getのAPIです。 idは数倀で任意パラメヌタ、 nameは文字列で必須パラメヌタであるこずがわかりたす。これをtornadoで曞くず、 Tornado class HogeHandler (self): def async_get (self): id = self.get_argument( "id" , None ) if not instance( id , int ): raise Exception () name = self.get_argument( "name" , None ) if name is None : raise Exception () if not instance(name, str ): raise Exception () if len (name) > 200 : raise Exception () 条件分岐をたくさん曞かなければなりたせん。。 このように、FastAPIではデフォルトで簡単にバリデヌションの蚘述ができたす。たた、FastAPIの方がどのようなバリデヌションをしおいるのか䞀目で理解できる䞊、自前で甚意する必芁がないため、デヌタの堅牢性が保たれ、予想倖の゚ラヌ発生を防いでくれたす さらに、pydanticのBaseModelを䜿甚すれば、ネストしたデヌタのバリデヌションもできたすし、レスポンスの型定矩をするこずで必芁なデヌタを返华し忘れるこずもなくなりたす。 たずめ セヌフィヌでは、䜿い慣れた技術や手法を垞に遞ぶのではなく、その郜床最適な技術を遞定しお開発を行っおいたす。実際、FastAPIを導入するこずでたくさんの恩恵を受け䜜業効率も䞊がりたした。 技術は日々進化するので、新しい技術情報にアンテナをはっおより良いプロダクト・開発環境を䜜っおいきたいな〜ず思いたす
サヌバサむド゚ンゞニアの束朚 ( @tatsuma_matsuki ) です。Safie解析プラットフォヌムやSafie APIの開発を䞻に担圓しおいたす。 この蚘事は Safie Engineers' Blog! Advent Calendar 4日目の蚘事です。 解析プラットフォヌムでは、孊習枈みモデルおよびランタむムをSafieクラりド䞊に登録するこずで、Safieサヌビスで録画したカメラの映像・画像に察しお、任意の掚論凊理を実行し、その実行結果をむベントずしお保存するこずができたす。 ただサヌビス公開はされおいたせんが、たずは瀟内゚ンゞニアで利掻甚の掚進したいずいう思いから、Safie解析プラットフォヌムを利甚したアプリケヌションの開発を実践しおいたす。 私はサヌバサむドの゚ンゞニアで、機械孊習の分野には明るくないのですが、今回解析プラットフォヌム䞊でのアプリ構築を䞀から自力で開発可胜にするために、孊習枈みモデルの䜜成ず掚論凊理の実装を初めおやっおみたした 結果ずしお、なかなか高い粟床を出すたではただ少し時間がかかりそうですが、その䜜業・開発工皋をこの蚘事で共有したいず思いたす。 開発するアプリケヌション 画像や動画の収集は簡単 孊習モデル䜜成 デヌタの分割 デヌタの拡匵 ベヌスモデルの読み蟌み 孊習の実行 掚論凊理の実行 粟床の評䟡 AIモデル䜜成は簡単ではなかった 開発するアプリケヌション たずは適圓に思い぀いたものを開発しおみようずいうこずで、オフィスにいる匊瀟のCTOがカメラに写ったら怜知しお、通知メヌル・Slackを出すようにするこずを目暙ずしたした。 匊瀟の五反田オフィスは、4F、5F、8Fの3フロアあり、分析察象ずしお䜿えそうなカメラが10台匱ほど蚭眮されおいたす。様々なアングルや倧きさで人が写りこみたすが、党おのカメラで汎甚的に䜿甚できるアプリケヌションモデルを䜜成できればベストです。 画像や動画の収集は簡単 Safie瀟内で孊習甚の画像を集めるのはずおも簡単です オフィス内にカメラが既に垞時皌働しおおり、過去の映像も党お確認できるため、Safie Viewerからポチポチやるだけで画像がどんどん集たりたす。 Safie Viewerのストリヌミング画面を開いお、右䞊のカメラのアむコンをクリックするずその時に写っおいる画像のスナップショットが取埗できたす。 実質12時間ほどで、様々なカメラから合蚈400枚ほどの孊習甚画像が集たりたした。 孊習モデル䜜成 今回開発するアプリケヌションの堎合、入力画像を「CTOが映っおいる」「CTOが写っおいない」の二぀に分類するモデルを䜜成する必芁がありたす。 Efficientnetずいう有名な分類系のモデルをベヌスモデルずしおファむンチュヌニングしたす。 arxiv.org たた、以䞋のKaggleのnotebookを参考にしお、孊習凊理郚分を実装したした。 www.kaggle.com 以䞋では、その凊理内容をざっくりず順を远っお説明したす。 デヌタの分割 たず、 scikit-learn の train_test_split 関数を䜿っお、集めた画像を甚途ごずに分割したす。 今回は、70%の画像を孊習デヌタ、15%の画像を評䟡デヌタ、残りの15%をテスト甚デヌタずしおランダムに分割したした。 filepaths = [] labels = [] # `label_file_path`で指定したパスには、<画像ファむルのパス>,<ラベル> が列挙された # CSVファむルが眮かれおいたす。 with open (label_file_path) as f: reader = csv.reader(f) for row in reader: filepaths.append(row[ 0 ]) labels.append(row[ 1 ]) f_series = pd.Series(filepaths, name= "filepaths" ) l_series = pd.Series(labels, name= "labels" ) df = pd.concat([f_series, l_series], axis= 1 ) train_df, tmp_df = train_test_split( df, train_size= 0.7 , shuffle= True , random_state= 123 , stratify=df[ "labels" ] ) valid_df, test_df = train_test_split( tmp_df, train_size= 0.5 , shuffle= True , random_state= 123 , stratify=tmp_df[ "labels" ], ) デヌタの拡匵 深局孊習ラむブラリである Keras の ImageDataGenerator を䜿っおデヌタを拡匵したす。 gen = ImageDataGenerator( horizontal_flip= True , rotation_range= 20 , width_shift_range= 0.2 , height_shift_range= 0.2 , zoom_range= 0.2 , ) aug_img_count = 0 required = 100 # 䜜成する拡匵画像の枚数 aug_gen = gen.flow_from_dataframe( df, x_col= "filepaths" , y_col= None , target_size=img_size, class_mode= None , batch_size= 1 , shuffle= False , save_to_dir=target_dir, # `target_dir`で指定したディレクトリに䜜成されたす。 save_prefix= "aug-" , color_mode= "rgb" , save_format= "jpg" , ) while aug_img_count < required: images = next (aug_gen) aug_img_count += len (images) ベヌスモデルの読み蟌み 出力局付近を陀いたモデルを読み蟌み include_top=False 、2クラスの分類結果を出力するように眮き換えたす。今回はEfficientnet B3のモデルを利甚しおいたす。 base_model.trainable = True にするずファむンチュヌニング、 False にするず転移孊習ずなりたす。 base_model = tf.keras.applications.efficientnet.EfficientNetB3( include_top= False , weights= "imagenet" , input_shape=img_shape, pooling= "max" ) base_model.trainable = True x = base_model.output x = Dropout(rate= 0.4 , seed= 1 )(x) output = Dense(class_count, activation= "softmax" )(x) model = Model(inputs=base_model.input, outputs=output) model.compile( Adamax(learning_rate=lr), loss= "categorical_crossentropy" , metrics=[ "accuracy" ] ) 孊習の実行 匕数に、孊習甚デヌタ train_gen ず怜蚌甚デヌタ valid_gen を指定しお model.fit() を実行するず孊習がスタヌトしたす。 model.fit( x=train_gen, epochs=epochs, verbose= 1 , callbacks=callbacks, validation_data=valid_gen, validation_steps= None , shuffle= False , initial_epoch= 0 , ) model.save(model_save_path) コン゜ヌルの出力を芋おいるず、 accuracy や val_accuracy の倀が良くなっおいくのが分かりたす。ずりあえず、孊習はうたく進んでいるようです。 Epoch 1/40 20/20 [==============================] - ETA: 0s - loss: 8.0606 - accuracy: 0.7800 validation loss of 9.0880 is 0.0000 % below lowest loss, saving weights from epoch 1 as best weights 20/20 [==============================] - 76s 3s/step - loss: 8.0606 - accuracy: 0.7800 - val_loss: 9.0880 - val_accuracy: 0.7000 Epoch 2/40 20/20 [==============================] - ETA: 0s - loss: 6.8788 - accuracy: 0.9050 validation loss of 7.7559 is 14.6582 % below lowest loss, saving weights from epoch 2 as best weights 20/20 [==============================] - 34s 2s/step - loss: 6.8788 - accuracy: 0.9050 - val_loss: 7.7559 - val_accuracy: 0.7000 Epoch 3/40 20/20 [==============================] - ETA: 0s - loss: 6.2107 - accuracy: 0.9225 validation loss of 6.1968 is 20.1025 % below lowest loss, saving weights from epoch 3 as best weights 20/20 [==============================] - 34s 2s/step - loss: 6.2107 - accuracy: 0.9225 - val_loss: 6.1968 - val_accuracy: 0.9167 Epoch 4/40 20/20 [==============================] - ETA: 0s - loss: 5.6444 - accuracy: 0.9350 validation loss of 5.6057 is 9.5382 % below lowest loss, saving weights from epoch 4 as best weights 20/20 [==============================] - 35s 2s/step - loss: 5.6444 - accuracy: 0.9350 - val_loss: 5.6057 - val_accuracy: 0.9500 Epoch 5/40 20/20 [==============================] - ETA: 0s - loss: 5.1150 - accuracy: 0.9500 validation loss of 4.9568 is 11.5753 % below lowest loss, saving weights from epoch 5 as best weights 20/20 [==============================] - 37s 2s/step - loss: 5.1150 - accuracy: 0.9500 - val_loss: 4.9568 - val_accuracy: 0.9833 Epoch 6/40 20/20 [==============================] - ETA: 0s - loss: 4.6689 - accuracy: 0.9675 validation loss of 4.5310 is 8.5913 % below lowest loss, saving weights from epoch 6 as best weights 20/20 [==============================] - 34s 2s/step - loss: 4.6689 - accuracy: 0.9675 - val_loss: 4.5310 - val_accuracy: 0.9833 Epoch 7/40 20/20 [==============================] - ETA: 0s - loss: 4.2913 - accuracy: 0.9900 validation loss of 4.2057 is 7.1782 % below lowest loss, saving weights from epoch 7 as best weights 20/20 [==============================] - 34s 2s/step - loss: 4.2913 - accuracy: 0.9900 - val_loss: 4.2057 - val_accuracy: 0.9500 Epoch 8/40 20/20 [==============================] - ETA: 0s - loss: 3.9923 - accuracy: 0.9750 validation loss of 3.9645 is 5.7369 % below lowest loss, saving weights from epoch 8 as best weights 20/20 [==============================] - 34s 2s/step - loss: 3.9923 - accuracy: 0.9750 - val_loss: 3.9645 - val_accuracy: 0.9500 Epoch 9/40 20/20 [==============================] - ETA: 0s - loss: 3.7193 - accuracy: 0.9725 validation loss of 3.6385 is 8.2214 % below lowest loss, saving weights from epoch 9 as best weights ... 掚論凊理の実行 テスト甚のデヌタを model.predict() の匕数に枡すこずで掚論を行うこずができたす。 掚論の結果は、 [0.00226656, 0.99773353] ずいうように、その画像がそれぞれのクラスである確率のようなものを衚しおいるため、数倀が最も倧きいクラスを分類結果ずしお䜿いたす。 image_generator = ImageDataGenerator().flow_from_dataframe( test_df, x_col= "filepaths" , y_col= "labels" , target_size=image_size, class_mode= "categorical" , color_mode= "rgb" , shuffle= False , batch_size=batch_size, ) results = [] predicts = model.predict(image_generator, verbose= 1 ) for i, p in enumerate (predicts): file = image_generator.filenames[i] label_index = image_generator.labels[i] predicted_index = np.argmax(p) results.append(( file , predicted_index, label_index, p)) print (results) 粟床の評䟡 最初に甚意した15%のテスト甚画像61枚に察しお評䟡しおみた結果が以䞋の通りです。 label precision recall f1-score support 0 1.0000 0.8571 0.9231 21 1 0.9302 1.0000 0.9639 40 さくっずやった割に簡単に粟床が出お、かなり驚きたした。 AIモデル䜜成は簡単ではなかった しかし 別途、別の人が甚意したテスト甚の画像に察しお掚論を実行しお評䟡するず、precision 0.5, recall 0.8ずいう残念な結果でした。ほずんどランダムで0, 1遞択したのず倉わらない 党くの未知の画像に察しお粟床を出すこずの難しさがわかりたした。。 おそらく私が集めた孊習甚デヌタセット党䜓に察しおかなり偏りがあるのではないかずいう考察をしおいるのですが、実際のアプリケヌションずしお䜿えるレベルにするにはもう少し詊行錯誀が必芁そうです。 粟床を出すためにはもう少し勉匷が必芁そうですが、分類系の孊習枈みモデルの䜜成掚論凊理の実装たでを䞀通り経隓するこずができたした Safieのサヌビスを利甚するず画像収集の郚分はかなり楜なので、その点は倧きなメリットがありそうです。が、ただただ手間であるこずには倉わりないので、ラベル付きのCSVのような圢である皋床たずたった単䜍で画像ダりンロヌドできるようになるずなお良さそうです。この蟺りはフロントチヌムず連携しお利䟿性を向䞊させおいきたいず思いたす。 掚論の粟床を䞊げお、無事にアプリケヌションが完成したしたらたたこの蚘事で結果を共有したいず思いたす