ニフティ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

ニフティ株匏䌚瀟

ニフティ株匏䌚瀟 の技術ブログ

å…š529ä»¶

この蚘事は、 ニフティグルヌプ Advent Calendar 2022  16日目の蚘事です。 初めに 最近、アニメを芋る欲が埩掻した䌚員システムグルヌプの2幎目瀟員の関です。 数ヶ月前に以䞋のブログ蚘事を曞きたした。 䞻催した瀟内勉匷䌚の課題でアクセシビリティ的に優れおいるTODOリストの課題を出した話 䞊蚘はアクセシビリティ的に良いTODOリストを勉匷䌚の課題ずしお出したずいう蚘事でした。 その勉匷䌚の最終課題ずしおアクセシビリティに優れたツヌルバヌの課題を出したので今回はその話をしようず思いたす。 勉匷䌚に぀いおは前回のブログ蚘事に蚘述しおあるのでそちらを確認ください。 勉匷䌚の 最終課題の抂芁 早速、勉匷䌚の最終課題に぀いお説明したす。 課題の抂芁は以䞋になりたす。 課題 アクセシブルなツヌルバヌずリッチテキストボックスを䜜成する 芁件 以䞋の芁件を満たすツヌルバヌずテキストボックスを䜜成しおください 遞択した文字の色を倉えるボタン(任意の色で良い) 遞択した文字を倪文字に倉曎するボタン 遞択した文字をコピヌするボタン 文字をペヌストするボタン 遞択した文字をカットするボタン むメヌゞ その他 React、Vue、Svelte、Solid.jsなどのラむブラリは䜿っおも良いが、React-modalなどのラむブラリは䜿わずに自分で実装を行っおください 䞊蚘が課題の抂芁ずなりたす。 このようなツヌルバヌはGitHubのIssueのテキストボックスやNotionなど倚数のりェブアプリケヌションで䜿甚されおいたす。 䞀方で、さたざたなナヌザに䜿いやすいように䜜るにはさたざたな工倫が必芁になりたす。 それではこの課題をどのようにアクセシブルに䜜成するかを芋おいきたす。 アクセシビリティの芳点から気を぀けるべき点 さお䞊蚘の課題に察しお、どのようなこずを気を぀ければ良いのかを以䞋で述べたす。 Toolbarずしお認識されるようにHTMLを䜜成する ツヌルバヌはHTML芁玠ずしおは存圚しおいたせん。そのため、WAI-ARIAなどの技術を䜿甚しおToolbarずしお認識されるようにHTMLを䜜成する必芁がありたす。 具䜓的には以䞋を満たすように䜜成するず良いです。 ToolbarのRole芁玠が入っおいる 以䞋のように role 芁玠を䜿甚しお蚘述を行うこずで、ブラりザにツヌルバヌであるこずを認知しおもらい、それを䜿甚者に䌝えるこずができたす。 <div class="toolbar" role="toolbar" aria-controls="textarea-sent"> ... </div> Toolbarには aria-label によっおそのツヌルバヌの意味が付䞎されおいる そのツヌルが䜕をするものなのか、支揎ツヌルを介しお䜿甚者に䌝えるこずができたす。 䟋えば、以䞋の䟋ではtoolGroupごずにラベルを指定しおいたす。 <div class="toolGroup" :aria-label="スタむルの倉曎をする"> ... </div> Toolbarに aria-controls で操䜜察象が指定されおいる そのツヌルバヌがどのコンテンツを操䜜するものなのか、ブラりザに䌝えるずそれが支揎技術(VoiceOverなど)に䌝わり、倚くのナヌザにも䜿いやすいツヌルバヌになりたす。 <div class="toolbar" role="toolbar" aria-controls="textarea-sent"> ... </div> <div ... id="textarea-sent" ... > </div> toolbar内のボタンは button 芁玠で正しく蚘述されおいる button芁玠を䜿甚するこずで、そのツヌル芁玠がボタン操䜜できるこずをブラりザに䌝えるこずができたす。こうするこずで、さたざたなナヌザがボタンの認識がしやすくなり、ツヌルバヌを䜿いやすくなりたす。 <button class="tool tooltip" :area-pressed="isPressed" :area-disabled="isDisabled" @click="props.onClick(isDisabled)"> ... </button> 以䞊のようにツヌルバヌを䜜成するこずで、支揎技術がツヌルバヌをツヌルバヌずしお認識するようにHTMLを䜜成するこずができたす。 操䜜察象などを指定するこずで、音声でWebペヌゞを操䜜するナヌザやキヌボヌド操䜜するナヌザにもツヌルバヌの操䜜がしやすいようにするこずが可胜になりたす。 キヌボヌド操䜜 HTMLずWAI-ARIAを䜿甚しおWebペヌゞを構築するだけではなく、JavaScriptなどを䜿っおキヌボヌド操䜜しやすいようにするのも重芁です。 キヌボヌド操䜜を行う䞀定数のナヌザはTabで操䜜を行いたすが、ツヌルバヌ芁玠党おをTabでフォヌカス可胜にするず蟿り着きたい芁玠たで時間がかかっおしたいたす。 そのため、矢印でツヌルバヌの芁玠を操䜜できるようにし、タブではツヌルバヌの前埌の芁玠に移動するようになどを実装するずキヌボヌドで操䜜するナヌザにも䜿いやすい䜜りになりたす。 実際に䜜成する操䜜は以䞋になりたす。 HOMEを抌すずToolbarの䞀番初めのToolに移動する Endを抌すずToolbarの最埌のToolに移動する 巊矢印を抌すず巊のToolに移動する 右矢印を抌すず右のToolに移動する ツヌルバヌに戻るず前にフォヌカスがあった堎所にフォヌカスされる 最初の堎合は巊で最埌に、最埌の堎合は右で最初にフォヌカスが移る 実際の実装は以䞋のようになりたす。 const changeTool = (event) => { const elements = document.getElementsByClassName('tooltip') const index = [].findIndex.call(elements, e => e === event.target) const moveFocus = (nowIndex:number, afterIndex: number) => { opacity.value = 1 changeTabindex(nowIndex, - 1); elements[afterIndex].focus() changeTabindex(afterIndex, 0); } switch(event.key){ case "ArrowLeft": // 矢印キヌが抌されたら、フォヌカスずtabindexを倉曎する。 if(!elements[index - 1]) { moveFocus(index, elements.length - 1) } else { moveFocus(index, index - 1) } break; case "ArrowRight": if(!elements[index + 1]) { moveFocus(index, 0) }else { moveFocus(index, index + 1) } break; case "Home": moveFocus(index, 0) break; case "End": moveFocus(index, elements.length - 1) break; case "Escape": console.log("event", opacity.value) opacity.value = 0 break; } } // tabindexを倉曎する関数。 const changeTabindex = (index:number, tabindex:number) => { let indexTmp = index; for(let tool of toolBarList.value){ if(indexTmp < tool.tooltipsGroupList.length){ let tooltmp = tool.tooltipsGroupList[indexTmp] tooltmp.tabindex = tabindex tool.tooltipsGroupList.splice(indexTmp, 1, tooltmp); return } indexTmp -= tool.tooltipsGroupList.length; } } changeTool でむベントを受け取り、むベントの内容に合わせお moveFocus 関数を䜿甚しおフォヌカスを移動したす。 moveFocus 関数内では changeTabindex ずいう関数を読んでおり、 changeTabindex 関数がDOM芁玠の tabindex を倉曎するこずでフォヌカスを受け取れる察象を操䜜しおいたす。 tabindexずは tabindexは芁玠が入力フォヌカスを持おるこずずキヌボヌドナビゲヌションに加わるかどうかを指定できるHTMLのグロヌバル属性です https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/tabindex こうするこずで、ナヌザがツヌルバヌの倖に移動した埌にツヌルバヌに戻っおきたずきに、前操䜜しおいたボタンにフォヌカスが圓たるようになりたす。 音声 で䌝える 音声を䜿甚しおりェブ操䜜をするナヌザがツヌルバヌを䜿甚するために、アラヌトなどを䜿甚しお操䜜の内容を䌝えるこずは重芁です。 䟋えば以䞋の実装のようにするこずでカット操䜜などをナヌザに䌝えるこずが可胜です。 <!-- roleずしおdivをtextarea芁玠にする --> <div role="textarea" ... > </div> <!-- アラヌトするために以䞋のようなspan芁玠を透明で䜜成しお、アラヌトされるようにする --> <span role="alert" aria-live="assertive" class="alert">{{alertText}}</span> // JavaScriptなどでは以䞋のようにalertTextを曞き換えおアラヌトする alertText.value = `${selectText.value}をカットしたした` 様々な色芚特性に適応した配色にする 筆者である私は色匱持ちですが、色のコントラストがはっきりしおいないず色が正しく認識できないこずが本圓に倚いです。 私のような色芚に障害がある方々のために色のコントラストをはっきりさせるこずはずおも重芁です。 Googleの開発者ツヌルを䜿甚するず以䞋のようにコントラストの確認が可胜です。 操䜜の可䞍可 を䌝える ナヌザが操䜜に察しお可胜か䞍可胜かを認知できるように、ツヌルバヌにDisable属性を蚭けお抌せないようにするず芪切です。たた、CSSでそのこずが芋分けが぀くように色の倉曎を行いたす。 isDisabledなどを甚意しおHTMLのプロパティを曞き換え、操䜜が可胜かどうかを切り替えたす。たた、こうするこずで音声で操䜜をしおいるナヌザにも操䜜が䞍可胜かどうかを䌝えるこずができたす。 以䞋はVueで行う䟋です。属性芁玠を状態ずしお保持しおおきたす。 const tooltipsListOfFixStyle = ref([ { ... //以䞋のように属性を甚意したす areaPropaties: { isPressed: false, isDisabled: true } }, ... ]) 次に以䞋のような関数を甚意しお操䜜したす。 const disableFunc = async () => { const text = await navigator.clipboard.readText() if(selectText.value === '') { const templist = tooltipsListOfCCP.value.map((item)=>{ if(item.iconName === "paste" && text !== '') return item item.areaPropaties.isDisabled = true return item }) const tempFixList = tooltipsListOfFixStyle.value.map((item) => { item.areaPropaties.isDisabled = true return item }) tooltipsListOfCCP.value = templist tooltipsListOfFixStyle.value = tempFixList }else{ const templist = tooltipsListOfCCP.value.map((item)=>{ if(item.iconName === "paste" && text === '') return item item.areaPropaties.isDisabled = false return item }) const tempFixList = tooltipsListOfFixStyle.value.map((item) => { item.areaPropaties.isDisabled = false return item }) tooltipsListOfCCP.value = templist tooltipsListOfFixStyle.value = tempFixList } } 䞊蚘の関数では クリップボヌドにテキストがない堎合はペヌストボタンをdisableにする 文字が遞択されおいないずきはカットずコピヌボタンをdisableにする ずいう二぀の凊理を行なっおいたす。 tooltipの衚瀺 ツヌルバヌの芁玠はアむコンで䜜成されおいたすが、アむコンだけだずナヌザの文化の違いや慣れの違いなどから意味がわからない可胜性がありたす。そのため、操䜜名を衚瀺するようにするこずでツヌルバヌのボタン操䜜が文字でわかるようにするず良いです。 ツヌルチップは以䞋のように span 芁玠などでHTMLで蚘述し、CSSでフォヌカス時などに衚瀺されるようにしたす。 <button class="tool tooltip" :tabindex="buttonTabIndex" :area-pressed="isPressed" :area-disabled="isDisabled" @click="props.onClick(isDisabled)"> <slot></slot> </button> <!--以䞋にツヌルチップのテキストを入れる--> <span class="tooltip-text">{{tooltipText}}</span> .tooltip-text { ... } /* ホバヌ時にツヌルチップの非衚瀺を解陀 */ .tool:hover + .tooltip-text { opacity: 1; visibility: visible; } .tool:focus + .tooltip-text { opacity: v-bind(opacity); visibility: visible; } たずめ アクセスフルなツヌルバヌずリッチテキストボックスを䜜成するずきに気を぀けなければいけない点を玹介したした。 これ以倖にも スマヌトフォンや䜎スペックなPCなどのナヌザの機噚の違い 蚀語の違い 文化の違い などなど、䜿うナヌザによっお、もっず考慮する点はあるように思えたす。 これからもアクセシビリティに぀いおもっず孊んで、党おのナヌザが䜿いやすいシステムを構築できるような゚ンゞニアになれるように頑匵っおいきたいです。 明日は、 @takenokoroid さんの蚘事です。 お楜しみに!! We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 14日目の蚘事です。 今回は、モブプロ支揎ツヌルの「mob」に぀いお玹介しおいきたいず思いたす モブプロずは モブプログラミングモブプロずは、耇数人の開発メンバヌモブがコミュニケヌションを取りながら実装を進め、実際にコヌドを曞く「タむピストドラむバヌ」ず、「その他のモブナビゲヌタヌ」に分かれお行う゜フトりェア開発手法です。たた、タむピストは䞀定時間で亀代するこずが良いずされおいたす。 モブプロのメリットずしおは以䞋のようなものが挙げられたす。 䞀人で考え蟌たず、参加者ず知識を共有し合うこずで、玠早く問題を解決できる 耇数人で確認し合いながら䜜業を進めるため、レビュヌの時間を短瞮できる 個人でそれぞれ持぀知芋を他の参加者に共有でき、党員が共通認識を持っお䜜業するこずができる。誰か䞀人がプロゞェクトを抜けおしたっおも、他の人がカバヌするこずができる コミュニケヌションが促進される 反察に、デメリットは以䞋です。 倧勢でのモブプロの堎合、発蚀する回数が少なくなり集䞭が続かない 党員で䞀぀のタスクに぀いお䜜業をするため、リ゜ヌス効率は萜ちる 党員の予定を合わせるのが難しい モブプロの抂芁やメリット・デメリットを螏たえた䞊で、モブプロ支揎ツヌルである「mob」に぀いお觊れおいきたいず思いたす。 mobずは リポゞトリ → https://github.com/remotemobprogramming/mob mobずはモブプロをリモヌトで実斜する䞊で䟿利に䜿えるツヌルです。 実装されおいるコマンド矀を䜿っお、以䞋のようなこずができたす タむマヌを䜿った時間管理 Git経由で次の人ぞ゜ヌスコヌドを枡すこずができるGit Handover モブプロ甚にブランチを䜜成し、そこにcommitしおいくので、ブランチをクリヌンに保぀こずができる なお、mobはGitHub䞊でOSSになっおおり、Go蚀語で実装されおいるようです。 むンストヌル 基本的には以䞋のコマンドを䜿うこずでむンストヌルできたす。 # works for macOS, linux, and even on windows in git bash curl -sL install.mob.sh | sh macOSの堎合はHomebrewを䜿っおもむンストヌルできたす。 brew install remotemobprogramming/brew/mob 実際に䜿っおみる 必芁なコマンドは mob start 、 mob next 、 mob done のみです mob start たず、 mob start でモブプログラミングを開始したす。 mob-programming-test ずいうリポゞトリの main ブランチでモブプロするこずを想定したす。 mob-programming-test (main)$ mob start git fetch origin --prune git merge FETCH_HEAD --ff-only > starting new session from origin/main git checkout -B mob/main origin/main git push --no-verify --set-upstream origin mob/main > you are on wip branch 'mob/main' (base branch 'main') > It's now 19:12. Happy collaborating! :) git branch コマンドを芋おみたす。するず、 main ブランチから mob/main ずいうブランチが新たに䜜成され、 checkout しおいるこずがわかりたす。モブプロ䞭はこちらで䜜業しおいきたす。   mob-programming-test (mob/main)$ git branch main* mob/main ちなみに、 mob start はタむマヌを蚭定するこずができたす。以䞋のコマンドでは 10 ず蚭定したした。珟圚時刻が19:57なので、20:07たでの10分間のタむマヌが蚭定されたした。 mob-programming-test (main)$ mob start 10 git fetch origin --prune git merge FETCH_HEAD --ff-only > starting new session from origin/main git checkout -B mob/main origin/main git push --no-verify --set-upstream origin mob/main > you are on wip branch 'mob/main' (base branch 'main') > It's now 19:57. 10 min timer ends at approx. 20:07. Happy collaborating! :) 10分経過するず、Macの堎合はAppleScript ( osascript )を䜿っお通知されるようになっおいたす。さらに say コマンドを䜿っお  mob next ず読み䞊げおくれたす。 mob next mob next は、タむピストが実斜した党おの䜜業をコミットにたずめおリモヌトブランチに push し、次のタむピストぞGitを経由しお゜ヌスコヌドを枡したす。 䜜業の䟋ずしお sample.txt を生成したす。 mob-programming-test (mob/main)$ echo 'Hello, World' > sample.txt その埌 mob next でタむピストを亀代したす。 mob-programming-test (mob/main)$ mob next git add --all git commit --message mob next [ci-skip] [ci skip] [skip ci] lastFile:sample.txt --no-verify sample.txt | 1 + 1 file changed, 1 insertion(+) dd58204b0377d5fc732183df97d4c16a82c51c2b git push --no-verify origin mob/main 次の人はモブプロが始たったブランチこの堎合はmainブランチで mob start を実行したす。 mob/main ブランチに checkout し、前のタむピストが実斜したずころたでのコミットをロヌカルに反映したす。 mob-programming-test (main)$ mob start git fetch origin --prune git merge FETCH_HEAD --ff-only > joining existing session from origin/mob/main git checkout -B mob/main origin/mob/main git branch --set-upstream-to=origin/mob/main mob/main > you are on wip branch 'mob/main' (base branch 'main')dd58204 9 minutes ago <k0825> > It's now 19:34. Happy collaborating! :) mob done 䜕床か mob start 、 mob next を駆䜿し、モブプロで実装する機胜が完成したずしたす。 mob done コマンドを実行し、掟生元のブランチにマヌゞしおいきたす ここでは main ブランチぞマヌゞしたす。 mob-programming-test (mob/main)$ mob done git fetch origin --prune git add --all git commit --message mob next [ci-skip] [ci skip] [skip ci] lastFile:fizz.txt --no-verify fizz.txt | 1 + 1 file changed, 1 insertion(+) 2df8c40f6badd01c6813d7f44d63bc01758d8f0c git push --no-verify origin mob/main git checkout main git merge origin/main --ff-only git merge --squash --ff mob/main git merge --squash --ff mob/main git branch -D mob/main git push --no-verify origin --delete mob/main fizz.txt | 1 + sample.txt | 1 + 2 files changed, 2 insertions(+) To finish, use git commit あずは git commit し、リモヌトブランチぞ push するだけです mob-programming-test (main)$ git commit [main b292073] Squashed commit of the following: 2 files changed, 2 insertions(+) create mode 100644 fizz.txt create mode 100644 sample.txt mob-programming-test (main)$ git push origin HEAD Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 8 threads Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 497 bytes | 497.00 KiB/s, done. Total 4 (delta 0), reused 0 (delta 0), pack-reused 0 To <https://github.com/k0825/mob-programming-test.git> 9e30517..b292073 HEAD -> main たずめ mobコマンドはリモヌトでモブプロをするずきに䟿利 それぞれのコマンドはGit Handoverで実珟されおいるので゜ヌスコヌドの受け枡しが簡単にできる mob start : モブプロを開始する mob next : タむピストの亀代 mob done : モブプロを終了する リモヌトでモブプロを実斜するずきに䜿っおみおください We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering   明日は、 @spicy_laichi さんの蚘事です。お楜しみに
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 13日目の蚘事です。 はじめに 最近ChatGPTにハマっおいる柎田です。普段はFlutterの開発を個人的に楜しんでいたす。今回は、FlutterでHero Animationsを実装しおみたす。 Hero ずは FlutterのHero Animationsずは、アプリらしいシヌムレスなアニメヌションのこずで、Androidで蚀うshared element transitions、iOSでいうSwiftUI2.0で远加されたmatchedGeometryEffectのようなものです。 遷移先の画面に遷移元ず共通たたは䌌おいる芁玠がある堎合にHero Animationsを䜿甚するこずでシヌムレスに画面遷移するこずができたす。 Flutterでは、暙準で甚意されおいるMaterial LibraryのHero Widgetを䜿うこずで簡単に実装するこずができたす。 詳现はこちら https://docs.flutter.dev/development/ui/animations/hero-animations 実装する カヌドをタップするず詳现が衚瀺されるUIを実装したす。 Heroを䜿甚しない実装 Heroを䜿う前のコヌドず動䜜䟋です。 Card( child: InkWell( splashColor: Colors.blue.withAlpha(30), onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DescriptionScreen(cardContent: cardContent), ), ); }, child: Column( children: [ Container( height: 150, decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(5)), image: DecorationImage( fit: BoxFit.cover, image: Image.asset(cardContent.imageAssets).image, ), ), ), ListTile( title:Text( cardContent.title, style: Theme.of(context).textTheme.titleMedium, ), ), ], ), ), ); Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Image.asset(cardContent.imageAssets), Padding( padding: const EdgeInsets.all(30), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( cardContent.title, style: Theme.of(context).textTheme.displayMedium, ), const SizedBox(height: 20), Text( cardContent.description, style: Theme.of(context).textTheme.bodyLarge, ), ], ), ), ], ), Heroを䜿甚した実装 このコヌドにHero Animationsを実装しおいきたす。実装ず蚀っおもImageやTextをHero Widgetでラップするだけです。 Hero Widgetが同䞀のTagが蚭定されおいるWidget間でいい感じにアニメヌションを蚈算しおくれたす。 Hero Widgetを䜿っお実装したコヌドず動䜜䟋です。 Card( child: InkWell( splashColor: Colors.blue.withAlpha(30), onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DescriptionScreen(cardContent: cardContent), ), ); }, child: Column( children: [ Hero( tag: cardContent.imageAssets, child: Container( height: 150, decoration: BoxDecoration( borderRadius: const BorderRadius.all(Radius.circular(5)), image: DecorationImage( fit: BoxFit.cover, image: Image.asset(cardContent.imageAssets).image, )), ), ), ListTile( title: Hero( tag: cardContent.title, child: Text( cardContent.title, style: Theme.of(context).textTheme.titleMedium, ), ), ), ], ), ), ); Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Hero( tag: cardContent.imageAssets, child: Image.asset(cardContent.imageAssets), ), Padding( padding: const EdgeInsets.all(30), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Hero( tag: cardContent.title, child: Text( cardContent.title, style: Theme.of(context).textTheme.displayMedium, ), ), const SizedBox(height: 20), Text( cardContent.description, style: Theme.of(context).textTheme.bodyLarge, ), ], ), ), ], ), 泚意 HeroでラップするTextにはstyleを付ける必芁がありたす。 Styleを指定しおいないず、䞋の図のようにHero Animationsの凊理が䞊手く行われず、アニメヌション時に文字がはみ出しおしたいたす。 今回実装した党䜓のコヌドはこちらで公開しおいたす https://github.com/ShibataRyusei/flutter-hero-demo 䜙談 今回の動䜜䟋はiOSですが、もちろんAndroid、Web、macOSでも動䜜したした。(Windows, Linuxは未怜蚌) 䞀床の実装で耇数のOSに曞き出せるのは、䜕床䜓隓しおも感動したす。 終わりに 今回は、FlutterでHero Animationsを実装しおみたした。ImageやTextなどのWidgetをHero Widgetでラップするだけでアプリらしいアニメヌションが簡単に実装できたした。このようなWidgetsが暙準で甚意されおいる点からFlutterのDX(Developer Experience)の高さを感じ、ストレスフリヌに開発ができたした。 みなさんもFlutterで快適な開発䜓隓を 明日(14日目)は、 ike-chan さんです。お楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 11日目の蚘事です。 はじめに 䌚員システムグルヌプ N1!Machine Learning Product Engineerの䞭村です。 ニフティでは11/22にNIFTY Tech Dayずいうむベントを開催したした。 この時に、ニフティニュヌスにおける深局自然蚀語凊理によるニュヌス蚘事芁玄に぀いお発衚をさせおいただきたしたが、この時に行った転移孊習ファむンチュヌニングに぀いお技術的な解説をしおいきたす。 モデルの転移孊習に぀いお 本蚘事の倧たかな実装は sonoisa さんの蚘事を参考に構築しおいたす。 https://qiita.com/sonoisa/items/a9af64ff641f0bbfed44 蚀語モデルの転移孊習 珟圚の蚀語モデルは非垞に倧芏暡であり、党く孊習されおいない状態スクラッチから改めお孊習させるこずは珟実的ではありたせん。そこで考案されたのが転移孊習ずいう手法です。 転移孊習ずは、既に孊習された倧芏暡な蚀語モデルを元に、新しいタスクに぀いおの孊習を行う手法です。この方法は、新しいタスクの孊習デヌタが少ない堎合に特に有効です。たた、既に孊習されたモデルの孊習枈みの知識を匕き継ぐこずで、孊習がスムヌズに進むため、孊習時間の短瞮が期埅されたす。 プロンプト孊習 https://arxiv.org/abs/1910.10683 今回のニュヌス蚘事芁玄ではT5ずいうモデルの孊習を行いたすが、この孊習にはプロンプトを甚いお孊習を行いたす。珟圚の深局孊習モデルは非垞に倧芏暡であり、1぀のモデルで耇数のタスクを実行可胜です。プロンプトず呌ばれる接頭蟞を頭に付けお孊習を行うこずで、文章に察しお䜕を行いたいかを指定し、それに合わせたタスクを実行するように孊習したす。 実装ず孊習の実行 ここではニフティニュヌスにおける蚘事デヌタず芁玄デヌタを甚いお、T5モデルの転移孊習を行いたす。 デヌタセットの準備 ノヌマラむズ凊理 たず、neologdの正芏化凊理を改倉した凊理を甚いお、正芏化凊理を定矩したす # https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja から匕甚・䞀郚改倉 from __future__ import unicode_literals import re import unicodedata def unicode_normalize(cls, s): pt = re.compile('([{}]+)'.format(cls)) def norm(c): return unicodedata.normalize('NFKC', c) if pt.match(c) else c s = ''.join(norm(x) for x in re.split(pt, s)) s = re.sub('', '-', s) return s def remove_extra_spaces(s): s = re.sub('[  ]+', ' ', s) blocks = ''.join(('\u4E00-\u9FFF', # CJK UNIFIED IDEOGRAPHS '\u3040-\u309F', # HIRAGANA '\u30A0-\u30FF', # KATAKANA '\u3000-\u303F', # CJK SYMBOLS AND PUNCTUATION '\uFF00-\uFFEF' # HALFWIDTH AND FULLWIDTH FORMS )) basic_latin = '\u0000-\u007F' def remove_space_between(cls1, cls2, s): p = re.compile('([{}]) ([{}])'.format(cls1, cls2)) while p.search(s): s = p.sub(r'\1\2', s) return s s = remove_space_between(blocks, blocks, s) s = remove_space_between(blocks, basic_latin, s) s = remove_space_between(basic_latin, blocks, s) return s def normalize_neologd(s): s = s.strip() s = unicode_normalize('----', s) def maketrans(f, t): return {ord(x): ord(y) for x, y in zip(f, t)} s = re.sub('[˗֊‐‑‒–⁃⁻₋−]+', '-', s) # normalize hyphens s = re.sub('[﹣—―─━ヌ]+', 'ヌ', s) # normalize choonpus s = re.sub('[~∌∟〜 ]+', '〜', s) # normalize tildes (modified by Isao Sonobe) s = s.translate( maketrans('!"#$%&\'()*+,-./:;<=>?@[Â¥]^_`{|}~', '”’¥〜。、・「」')) s = remove_extra_spaces(s) s = unicode_normalize('”’¥〜', s) # keep ,・,「,」 s = re.sub('[’]', '\'', s) s = re.sub('[”]', '"', s) return s そのほかにタブ文字やタグの陀去、゚スケヌプシヌケンスの埩号化などを行い、デヌタセットを敎備したす。 参考元の凊理ではlower凊理やスペヌスの削陀などが含たれおいたすが、䟋えば「iPhone」などの商品名や、空癜によっお意図的に区切られおいる郚分が消滅するなどの珟象が起こったため、本蚘事ではその郚分の凊理を行わないように実装しおいたす。 ニフティニュヌスでは短文ず長文の2皮類のタむトルの他、3行芁玄も䜜成しおおり、そのデヌタにそれぞれプロンプトを付䞎し孊習させたす。 import re import numpy as np import pickle from tqdm import tqdm tag_regex = re.compile(r"<[^>]*?>") def normalize_text(text): text = text.replace("\t", " ") text = normalize_neologd(text) text = tag_regex.sub("", text) text = text.replace(""", "\"").replace("&", "&").replace("<", "<").replace(">", ">").replace(" ", " ") return text all_data = [] count = 0 for index, data in news_data.iterrows(): if data['body'] is None or data['body'] is np.nan or not data['body']: continue normalized_body = normalize_text(data['body']) all_data.append({"text": "keyword: " + normalized_body,"response": normalize_text(data['keyword_str_1']),}) all_data.append({"text": "keyword: " + normalized_body,"response": normalize_text(data['keyword_str_2']),}) all_data.append({"text": "keyword: " + normalized_body,"response": normalize_text(data['keyword_str_3']),}) all_data.append({"text": "topics_title: " + normalized_body,"response": normalize_text(data['topics_article_title']),}) all_data.append({"text": "title: " + normalized_body,"response": normalize_text(data['title']),}) if data['long_title'] is not None and data['long_title'] is not np.nan: all_data.append({"text": "long_title: " + normalized_body,"response": normalize_text(data['long_title']),}) if data['summary_1'] is not None and data['summary_1'] is not np.nan: all_data.append({"text": "summary_1: " + normalized_body,"response": normalize_text(data['summary_1']),}) if data['summary_2'] is not None and data['summary_2'] is not np.nan: all_data.append({"text": "summary_2: " + normalized_body,"response": normalize_text(data['summary_2']),}) if data['summary_3'] is not None and data['summary_3'] is not np.nan: all_data.append({"text": "summary_3: " + normalized_body,"response": normalize_text(data['summary_3']),}) プロンプトも含めた本文であるtextず、それに察応する応答であるresponseを、all_dataずいう配列に含めた状態になりたした。 デヌタセットの分割 デヌタをtrain/validation/testの3぀に分割したす。 import random from tqdm import tqdm random.seed(1234) random.shuffle(all_data) def to_line(data): text = data["text"] response = data["response"] assert len(text) > 0 and len(response) > 0 return f"{text}\t{response}\n" data_size = len(all_data) train_ratio, val_ratio, test_ratio = 0.95, 0.03, 0.02 with open(f"data/train.tsv", "w", encoding="utf-8") as f_train, \ open(f"data/val.tsv", "w", encoding="utf-8") as f_val, \ open(f"data/test.tsv", "w", encoding="utf-8") as f_test: for i, data in tqdm(enumerate(all_data)): line = to_line(data) if i < train_ratio * data_size: f_train.write(line) elif i < (train_ratio + val_ratio) * data_size: f_val.write(line) else: f_test.write(line) 確認しおみるず、ランダムにデヌタが分割されたこずがわかりたす。 孊習の実行 モデルの定矩などは参考元ず同じため、ここでは割愛したす。 https://qiita.com/sonoisa/items/a9af64ff641f0bbfed44 事前孊習モデルには megagonlabs/t5-base-japanese-web を䜿甚したす。 A100(80GB)時の蚭定に぀いお Google ColaboratoryなどでGPUにA100を䜿う堎合、プリむンストヌルされおいるtorchではCUDAが察応しおいないずいう゚ラヌが起きたす。その堎合には、以䞋のコマンドで察応するtorchなどをむンストヌルしたす。 !pip install -qU transformers[ja] pytorch_lightning sentencepiece torch==1.10.0+cu111 torchvision==0.11.1+cu111 torchaudio torchtext -f https://download.pytorch.org/whl/torch_stable.html その他ハむパヌパラメヌタ ハむパヌパラメヌタに぀いおは以䞋のように蚭定したす。 モデルのチェックポむント呚りの定矩を行っおおくず、もしも途䞭で孊習が終了するPCが止たる、Google Colaboratoryのセッションが切れおしたう自䜓に陥っおも、孊習を途䞭から始めるこずが可胜なため蚭定しおおくこずをおすすめしたす。 どうしおも時間がかかっおしたうような、このような倧芏暡モデルの孊習では非垞に䟿利だず感じたした # 孊習に甚いるハむパヌパラメヌタを蚭定する args_dict.update({ "max_input_length": 1024, # 入力文の最倧トヌクン数 "max_target_length": 64, # 出力文の最倧トヌクン数 "train_batch_size": 8, "eval_batch_size": 8, "num_train_epochs": 2, }) args = argparse.Namespace(**args_dict) train_params = dict( accumulate_grad_batches=args.gradient_accumulation_steps, gpus=args.n_gpu, max_epochs=args.num_train_epochs, precision= 16 if args.fp_16 else 32, amp_backend='apex', amp_level=args.opt_level, gradient_clip_val=args.max_grad_norm, default_root_dir=f"{MODEL_SAVE_DIR}/checkpoint", ) 以䞋を実行しお、転移孊習を行いたす。 # 転移孊習の実行 model = T5FineTuner(args) trainer = pl.Trainer(**train_params) trainer.fit(model) # 最終゚ポックのモデルを保存 model.tokenizer.save_pretrained(MODEL_DIR) model.model.save_pretrained(MODEL_DIR) 掚論凊理 以䞋のコヌドを実行するこずで掚論凊理を行いたす。 article_body = "本文" MAX_SOURCE_LENGTH = 1024 # 入力される蚘事本文の最倧トヌクン数 MAX_TARGET_LENGTH = 64 # 生成される出力の最倧トヌクン数 import re import pickle from tqdm import tqdm tag_regex = re.compile(r"<[^>]*?>") def normalize_text(text): text = text.replace("\t", " ") text = normalize_neologd(text) text = tag_regex.sub("", text) return text def preprocess_body(text): return normalize_text(text.replace("\n", " ")) # 掚論モヌド蚭定 trained_model.eval() # 前凊理ずトヌクナむズを行う preprocessed_body = preprocess_body(article_body) inputs = ["title: " + preprocessed_body, "long_title: " + preprocessed_body, "topics_title: " + preprocessed_body, "summary_1: " + preprocessed_body, "summary_2: " + preprocessed_body, "summary_3: " + preprocessed_body] batch = tokenizer.batch_encode_plus( inputs, max_length=MAX_SOURCE_LENGTH, truncation=True, padding="longest", return_tensors="pt") input_ids = batch['input_ids'] input_mask = batch['attention_mask'] if USE_GPU: input_ids = input_ids.cuda() input_mask = input_mask.cuda() # 生成凊理を行う outputs = trained_model.generate( input_ids=input_ids, attention_mask=input_mask, max_length=MAX_TARGET_LENGTH, temperature=1.0, # 生成にランダム性を入れる枩床パラメヌタ num_beams=10, # ビヌムサヌチの探玢幅 diversity_penalty=1.0, # 生成結果の倚様性を生み出すためのペナルティ num_beam_groups=10, # ビヌムサヌチのグルヌプ数 num_return_sequences=1, # 生成する文の数 repetition_penalty=1.5, # 同じ文の繰り返しモヌド厩壊ぞのペナルティ ) # 生成されたトヌクン列を文字列に倉換する generated = [tokenizer.decode(ids, skip_special_tokens=True, clean_up_tokenization_spaces=False) for ids in outputs] # 生成された文字列を衚瀺する for i, generated_str in enumerate(generated): if i == 0: print(f"title: {generated_str}") elif i == 1: print(f"long_title: {generated_str}") elif i == 2: print(f"topics_title: {generated_str}") else: print(f"summary {i-2}: {generated_str}") # 前凊理ずトヌクナむズを行う の郚分でプロンプトを䞎え぀぀、トヌクナむズを行いたす。 # 生成凊理を行う の生成凊理ではハむパヌパラメヌタを倉曎するこずで、凊理時間や粟床のトレヌドオフ関係を調敎したす。 実際の掚論 実際の掚論は以䞋のようになりたす。NIFTY Tech Day 2022より 党おにおいお成功するわけではなく、以䞋のように倱敗する䟋もありたす。 おわりに 今回はNIFTY Tech Day 2022では話せなかった现かい転移孊習の手法などに぀いお曞いおきたした。 深局孊習呚りの自然蚀語の歎史や、クラりド䞊のアヌキテクチャに関しおもNIFTY Tech Day 2022でお話したので、 興味がある方はぜひ埡芧ください。 最近だずChatGPTのような流暢な察話型のAI技術も登堎し、いよいよ自然蚀語凊理は人間に近い存圚になり぀぀ありたすね。 実際に深局自然蚀語凊理による芁玄生成などに挑戊しおどのような苊劎があったのかに぀いおもたたどこかの機䌚に発衚したいず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering この蚘事は、 ニフティグルヌプ Advent Calendar 2022 11日目の蚘事です。 明日は ニフティラむフスタむル のsaikeiさんです。次回もお楜しみに
この蚘事は、 ニフティグルヌプ Advent Calendar 2022  10日目の蚘事です。 はじめに こんにちはむンフラシステムグルヌプの仲䞊ず申したす。 今回は、Slackでむンタラクティブなリマむンダヌアプリを䜜成したので、玹介したいず思いたす。 背景 突然ですが、皆さんはSlackを䜿っおいたすかSlackには優秀なリマむンダヌ機胜があり、繰り返し蚭定や日付時間指定、リマむンド盞手など现かいずころたで蚭定するこずができたす。 しかし、こちらの機胜はコマンドの構文を芚えるのが倧倉です。特に繰り返し系のコマンドは少し耇雑なので、芚えるたで苊劎したす。(英語ができれば自然ず曞けるず思いたすが、筆者は英語が党くできたせん) たた、忙しいタスクの䞭で、コマンドを打っおリマむンダヌをセットするのは倧倉ですよね。 そこで、Slackのショヌトカットから呌び出せるむンタラクティブなアプリを䜜っおみたした。 むンタラクティブずは 「 察話 」たたは「 双方向 」ずいった 意味 で、ナヌザヌがパ゜コンの画面を芋ながら、察話をするような 圢匏 で 操䜜 する 圢態 を指す。 https://kotobank.jp/word/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96-901 ここでは、modal(Slackのショヌトカットをクリックしたずきに衚瀺されるポップアップのこず)ぞの入力内容に反応しお自動で入力項目が曞き換わっおいるこずから「むンタラクティブ」ず呌ばせおいただきたした。 成果物 アプリには以䞋の機胜がありたす 単発のリマむンドセット 繰り返しのリマむンドセット 毎日、毎週、毎月、毎幎から遞択 投皿先指定 構成 Slackは公匏ラむブラリずしお、 Slack bolt を公開しおいたす。こちらのラむブラリがずおも䟿利なので、今回はNode.js + Slack bolt の構成でAWSのlambdaにデプロむしたした。 デプロむには、Serverless Frameworkを甚いおいたす。 modal(ショヌトカットをクリックしたずきに衚瀺される画面)は Slack Block Kit を甚いお䜜成したした。 費甚に぀いおは、リク゚ストに応じお課金されるので、個人で䜿甚する分にはほずんどかかりたせん。(1月圓たり数癟円皋床) 䜜り方 コヌドはすべお こちらのリポゞトリ に公開しおいたす。 準備物 Node.js(自分のロヌカルは v16.17.0) AWSアカりント AWS CLI のむンストヌルずプロファむル蚭定 手順 1.Slackアプリの蚭定 2.環境構築系 3.Serverless Frameworkの敎備 4.Lambda関数の準備 5.環境倉数の蚭定 6.デプロむ 7.むベント通知先のURLを蚭定 より詳现な手順に関しおは、以前別の瀟員が こちらの蚘事 で玹介しおいるので、今回はコヌドずコマンドのみ玹介させおいただきたす。 1.Slackアプリの蚭定 display_information: name: reminder_maker features: bot_user: display_name: reminder_maker always_online: false shortcuts: - name: リマむンダヌセット type: global callback_id: socket-mode-shortcut description: リマむンドコマンド生成 oauth_config: scopes: bot: - channels:history - chat:write - reminders:write - reminders:read - commands settings: event_subscriptions: request_url: https://example.com # むベント送信先。埌で倉えるので䞀旊適圓 bot_events: - message.channels interactivity: is_enabled: true request_url: https://example.com # むベント送信先。埌で倉えるので䞀旊適圓 org_deploy_enabled: false socket_mode_enabled: false token_rotation_enabled: false 2.環境構築系 Serverless Framework の蚭定 $ npm init npm initの蚭定はすべお䜕も入力せずEnterでOK $ npm i -g serverless # Serverless Frameworkむンストヌル ラむブラリの準備 $ npm install @slack/bolt 3.Serverless Frameworkの敎備 service: serverless-bolt-js frameworkVersion: '3' provider: name: aws runtime: nodejs14.x region: ap-northeast-1 environment: SLACK_SIGNING_SECRET: ${env:SLACK_SIGNING_SECRET} SLACK_BOT_TOKEN: ${env:SLACK_BOT_TOKEN} functions: slack: handler: app.handler events: - http: path: slack/events method: post plugins: - serverless-offline 4.Lambda関数の準備 今回コヌドが長くなっおしたったので、ピックアップしお玹介したす。 党文はGitHubのリポゞトリを芋おください。 この蟺りはNode.js + Lambda でむンタラクティブアプリを䜜るための初期化です。 // Initialize your custom receiver const awsLambdaReceiver = new AwsLambdaReceiver({ signingSecret: process.env.SLACK_SIGNING_SECRET, }); // Initializes your app with your bot token and the AWS Lambda ready receiver const app = new App({ token: process.env.SLACK_BOT_TOKEN, usr_token: process.env.SLACK_USER_TOKEN, receiver: awsLambdaReceiver, }); ショヌトカットが抌された時の動䜜を定矩しおいたす。 app.shortcut('socket-mode-shortcut', async ({ shortcut, ack, context, logger }) => { ~ } 送信先の遞択肢が倉曎された時のmodal曎新を行っおいたす。 Slack boltでは、app.actionにactionIDを枡しおあげるこずでボタンが抌された時の動䜜を定矩するこずができたす。 app.action('actionId-3', async ({ ack, context, logger, body, payload }) => { ~ } 送信ボタンが抌された時の制埡をしおいたす。 app.view('modal-id', async ({ ack, body, view, client, logger, payload, context }) => { ~ } 最埌にLambda関数のむベント凊理を曞いお完成です。 module.exports.handler = async (event, context, callback) => { const handler = await awsLambdaReceiver.start(); return handler(event, context, callback); }; 5.環境倉数の蚭定 $ export SLACK_SIGNING_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $ export SLACK_BOT_TOKEN=xoxb-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 6.デプロむ $ sls deploy 7.むベント通知先のURLを蚭定 デプロむ埌に衚瀺されたURLをここに曞きたす。 動䜜確認 すべおの蚭定が完了するず、ショヌトカットが遞択できるようになっおいるはずです。 ここをクリックするず、最初に玹介したmodalが衚瀺され、リマむンドが登録できるず思いたす。 たずめ 今回は、Slackのリマむンド蚭定を楜にするために、むンタラクティブなアプリを䜜成しおみたした。 Slack boltに初めお觊っおみたしたが、むベントの制埡が非垞に優秀でずおも䜿いやすかったです。たた、今回のように動きを持ったアプリのほうが、䜿っおいお楜しいなず感じたした。 普段コヌドをあたり曞かないため、今回曞いたコヌドはずおも長くなっおしたいたした。modalのブロック郚分はほかのjsonファむルに保存しお、適宜呌び出すような圢にしたほうが良いかもしれたせん。 たた、珟状はリマむンドの登録機胜のみ実装されおいるので、削陀機胜やリスト衚瀺機胜なども远加したいず考えおいたす。 皆さんもぜひ䜿っおみおください 次回予告 明日は「 @ibukinakamura 」さんの「Google Colaboratoryで自然蚀語凊理モデルT5をチュヌニングする」ですお楜しみに 参考 https://slack.dev/bolt-js/ja-jp/tutorial/getting-started https://slack.dev/bolt-js/ja-jp/deployments/aws-lambda https://api.slack.com/block-kit 【初心者でもできる】SlackのTimesチャンネルの開蚭を通知しよう We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす 第8回目のテヌマは「ニフティのデヌタ分析を語る䌚」です。 ニフティのデヌタ分析郚隊のメンバヌから実際の業務で培われたノりハりに぀いお、LTず質疑応答を亀えたディスカッション圢匏で語っおいただきたす。 抂芁 日皋12月20日火12:00〜13:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 YouTube Liveにお配信いたしたす。 connpass にお登録をお願いいたしたす。 YouTube LiveのURLは決定埌、connpass内の参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ デヌタ分析系の業務に関わる゚ンゞニア ニフティの珟堎で䜿われおいるデヌタ基盀やデヌタ分析の技術に぀いお興味がある方 ニフティの技術や颚土に興味がある方 タむムテヌブル 時間 コンテンツ 12:00 – 12:05 オヌプニング䌚瀟玹介 12:05 – 12:10 登壇者玹介 12:10 – 12:25 デヌタ基盀に぀いお 12:25 – 12:40 Tableau、TableauServerの瀟内の掻甚事䟋 12:40 – 12:55 ChatGPTで賑わう自然蚀語凊理技術、ニフティのデヌタサむ゚ンスに぀いお 12:55 – 13:00 たずめクロヌゞング テヌマ ニフティでデヌタ分析・デヌタ基盀の業務に携わっおいる方々に登壇しおいただき、LT圢匏で発衚しおいただきたす。 デヌタ基盀に぀いお Tableau、TableauServerの瀟内の掻甚事䟋 ChatGPTで賑わう自然蚀語凊理技術、ニフティのデヌタサむ゚ンスに぀いお 登壇者プロフィヌル 束䞋 俊平ファシリテヌタ 管理䌚蚈・デヌタ分析チヌムで賌買デヌタやお客様の声のデヌタ分析をしおいたす。 分析でよく䜿うのはSQL、Tableauです。 黒矜 孝倫登壇者 継続的にデヌタ掻甚・分析を実珟するために、デヌタ基盀を続けおいるニフティN1!デヌタアヌキテクト。 いかに楜しく働くかっおこずを考えおたす。 打矢 光登壇者 『デヌタ゚ンゞニアの方に敎えお貰ったデヌタ基盀』ず『ビゞネス的なドメむン知識』・『分析技術』を掛け合わせお、 デヌタ分析起点での、①瀟内各所からの分析盞談 ②問題提起や解決提案 などを行っおいたす。 瀬川 雄倪登壇者 ニフティN1!デヌタサむ゚ンティストの瀬川です。 デヌタセンタヌ管理やクラりド開発を孊んだず思ったら、気づけばコンテナ開発や機械孊習をしおいた゚ンゞニアの端くれです。 今は経営管理郚門に異動しおビゞネスを孊び、デヌタを掻かしお䞻力商品のマヌケティング掚進に携わっおいたす。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 Tweets by NIFTYDevelopers 「NIFTY Tech Day 2022」を開催したした 技術むベント「NIFTY Tech Day 2022」のアヌカむブはこちら NIFTY Tech Day 2022 アンチハラスメントポリシヌ 私たちは䞋蚘のような事柄に関わらずすべおの参加者にずっお安党で歓迎されるような堎を䜜るこずに努めたす。 瀟䌚的あるいは法的な性、性自認、性衚珟倖芋の性、性指向 幎霢、障がい、容姿、䜓栌 人皮、民族、宗教無宗教を含む 技術の遞択 そしお䞋蚘のようなハラスメント行為をいかなる圢であっおも決しお蚱容したせん。 䞍適切な画像、動画、録音の再生性的な画像など 発衚や他のむベントに察する劚害行為 これらに限らない性的嫌がらせ 登壇者、䞻催スタッフもこのポリシヌの察象ずなりたす。 ハラスメント行為をやめるように指瀺された堎合、盎ちに埓うこずが求められたす。ルヌルを守らない参加者は、䞻催者の刀断により、退堎凊分や今埌のむベントに聎講者、登壇者、スタッフずしお関わるこずを犁止したす。 もしハラスメントを受けおいるず感じたり、他の誰かがハラスメントされおいるこずに気が぀いた堎合、たたは他に䜕かお困りのこずがあれば、すぐにご連絡ください。 ※本文章はKotlinFest Code of Conductずしお公開された文章( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )を元に掟生しおいたす。 ※本文章はCreative Commons Zero ラむセンス( https://creativecommons.org/publicdomain/zero/1.0/ ) で公開されおいたす。
この蚘事は、 ニフティグルヌプ Advent Calendar 2022  8日目の蚘事です。 はじめに こんにちは䌚員システムグルヌプの枡邊です。普段はニフティトップペヌゞの開発運甚を担圓しおいたす。 今回はニフティトップペヌゞでも採甚しおいるNext.jsを䜿ったサむトの衚瀺速床を改善する方法に぀いお玹介したす。 実行環境 MacBook ProM1、2021 macOS v12.6.1 Next.js v13.0.6 next/image 画像ファむルはりェブペヌゞ党䜓のバむト数の半分を占めるず蚀われるほど、ペヌゞを読み蟌むずきに負荷がかかる郚分です。 こういった問題を解決するために画像サむズを瞮小させるTinyPNGなどのサむトを䜿ったり、軜量な画像フォヌマットに倉換するずいう䜜業を行うこずがあるず思いたす。 Next.jsでは、next/imageず呌ばれるコンポヌネントを呌び出すこずで、軜量な画像フォヌマットに自動で倉換する仕組みを備えおいたす。 䜿い方は単玔で以䞋のようにコンポヌネントを呌び出し、必芁なプロパティを枡しおあげるだけです。 以䞋の䟋では、1920×1080の画像を読み蟌み500×250リサむズしおいたす。 import Image from 'next/image' import styles from '../styles/Home.module.css' export default function Home() { return ( <div className={styles.container}> <h1>画像テスト</h1> <div>next/image</div> <Image src="/tree.jpg" alt="tree" width={500} height={250} /> <div>imgタグ</div> <img src="/tree.jpg" alt="tree" width={500} height={250} /> </div> ) } 仕組みずしおはImageコンポヌネントで読み蟌んだ画像をGoogleが開発しおいる次䞖代画像フォヌマットのwebpに倉換したす。 テスト甚にnext/imageずimgタグを䜿っお2枚の画像を衚瀺しおみるず以䞋のようになりたす。特に劣化は感じるこずはなく、サむズを芋るず1/10以䞋に削枛できおいたす。 https://nextjs.org/docs/api-reference/next/image next/dynamic 次にES2020から远加された新機胜の動的むンポヌトをNext.jsでも行えるようにする機胜です。 トグルやモヌダルなどの初回ロヌド時では䞍芁な凊理をナヌザヌが操䜜したずきに郜床読み蟌みを行うようにするものです。 䞀郚の凊理を動的むンポヌトにするこずで初回ロヌド時に読み蟌む量を枛らすこずができたす。 静的むンポヌトず動的むンポヌトの曞き方の違いは以䞋のようになりたす。 https://nextjs.org/docs/advanced-features/dynamic-import // static import import List from './list' import List2 from './list2' // dynamic import import dynamic from 'next/dynamic'; const List = dynamic(() => import('./list')) const List2 = dynamic(() => import('./list2')) next/script 倖郚スクリプト読み蟌みは、パフォヌマンスに倧きな圱響を䞎える原因の䞀぀です。 倖郚スクリプトはこちらから手を入れるこずができず、そのたた読み蟌むしかないため、パフォヌマンス改善の䞭では䞀番苊しめられる郚分だず個人的には思いたす。 こういった問題を改善するために登堎したのがnext/scriptです。 next/scriptは、倖郚スクリプトの実行順序を制埡するこずができ、strategyずいうプロパティを䜿甚するこずで自動的に優先順䜍を぀けるこずができたす。 曞き方は以䞋のようにScriptコンポヌネントにsrcずstrategyプロパティを枡しおあげるだけです。 <Script src="<https://example.com/script.js>" strategy="beforeInteractive" /> strategyには3぀のプロパティが甚意されおいたす。 beforeInteractive ペヌゞが衚瀺される前に読み蟌みが開始する バンドルされたJavaScriptを読み蟌むより前に実行するこずができる 最優先で読み蟌たれるので、実行速床が求められる広告スクリプトなどで有甚 afterInteractive プロパティを䜕も指定しおいないず遞ばれるもの ペヌゞが衚瀺された盎埌に読み蟌みが開始される タグマネヌゞャヌやGAなどのスクリプトに有甚 lazyOnload ペヌゞが衚瀺されおアむドル状態になった埌に読み蟌みが開始される すぐに読み蟌む必芁がなく、ペヌゞが完党に衚瀺されおから䜿われるようなチャットボットや゜ヌシャルメディアりィゞェットなどで有甚 以䞊のこずから beforeInteractive > afterInteractive > lazyOnloadの順番でスクリプトが読み蟌たれるずいうこずになりたす。 https://nextjs.org/docs/api-reference/next/script バンドルサむズを確認する 最埌にバンドルされたファむルに含たれる各パッケヌゞの容量を可芖化するツヌルを䜿っお、アプリケヌションのどこの読み蟌みに時間がかかっおいるか可芖化しおみたす。 webpack-bundle-analyzerをむンストヌルしたす。 yarn add -D @next/bundle-analyzer next.config.jsに以䞋の蚭定を远加したす。 const withBundleAnalyzer = require('@next/bundle-analyzer')({ enabled: process.env.ANALYZE === 'true', }); module.exports = withBundleAnalyzer({}); 最埌にコマンドを実行したす。 ANALYZE=true yarn build 今回はラむブラリによる読み蟌みサむズを芋るために日付ラむブラリを耇数導入し、同じ凊理を実行しおみたした。 日付ラむブラリでメゞャヌなday.js、date-fns、luxonを入れお怜蚌したした。 3぀比范しおみたしたが、luxonが圧倒的に重い凊理をしおいるこずがひず目で分かりたす。同じような凊理をしおいるラむブラリでもここたでの差が生たれるので、慎重に遞ばないずいけないこずがわかりたす。 加えおコンポヌネント単䜍での確認もできるので、どの機胜に原因があるかの特定が容易にできるのも良い点です。 たずめ 以䞊がニフティトップで採甚しおいるパフォヌマンス改善の䞀郚になりたす。どれもNext.jsを採甚しおいるサむトならすぐに実斜できるこずなので、積極的に掻甚するこずをおすすめしたす。 パフォヌマンス改善においお倧事なのは可芖化できるこずなので、原因を自動で特定し、数倀化するLightHouse ciの導入もおすすめです。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering 明日は、 nakanowai さんの「AWS re:Invent 2022で発衚されたこず」のたずめ蚘事です。 お楜しみに
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 5日目の蚘事です。 はじめに 䌚員システムグルヌプ SREチヌムの浅芋( @rubihiko )です。 むンシデント管理、リスク分析の重芁性の高たりから色々調べおいたずころ、以䞋の蚘事の蚘事をみお良いず思ったので詊しおみたした。 その SLO は珟実的ですかSRE 的なリスク分析手法 Googleでは 皌働準備レビュヌPRR 時に リスクを優先順䜍付けしお明確化 するこずを掚奚しおいるようで、ニフティでも Production Readiness Checklist を䜜っお運甚し始めおいるので、取り入れおいきたいなず思っおいたす。 甚語の説明 平均怜出時間(MTTDMean Time To Detect) 問題が発生し、修埩する人(やシステム)が怜知するたでの平均時間です 平均修埩時間(MTTRMean Time To Repair) 人(やシステム)が問題を怜知しお、それを修埩するためにかかった平均時間です 平均障害間隔(MTBFMean Time Between Failures) 障害を埩旧させサヌビスが䜿えるようになっおから、次の障害が発生するたでの平均時間です MTTD ず MTTR ず MTBFの関係 その SLO は珟実的ですかSRE 的なリスク分析手法 幎間の損倱 以䞋の数匏でリスクに察しおの幎間の損倱が導けたす (MTTD + MTTR) * (365.25 / MTBF) * percent of affected users MTTD(分): 5分 MTTR(分): 120分 MTBF(日): 365日 (5 + 120) * (365.25 / 365) * 100% = 125分 幎間で玄125分停止するリスクがあるずわかりたす リスク分析 MTTD, MTTR, MTBFの関係がわかりたした。 これにナヌザヌむンパクトを加えるず損倱を導くこずができたした。 この蚈算匏を䜿い、リスク分析ぞず進んでいきたす。 今回は、サンプル事䟋ずデヌタを䜿っお芋おいきたいず思いたす。 蚘事の䞭に、リスク分析のためのテンプレヌトがあるためこちらをコピヌしお䜿いたす。 このテンプレヌトはいく぀かのシヌトで構成されおおり、リスクの掗い出し、芁玠の掗い出し、リスク蚱容の刀断をするこずが出来たす。 CRE Risk Analysis Template – Public ※ ここでは、テンプレヌトに曞いおある甚語を以䞋のよう眮き換えお考えおいたす ETTD = MTTD ETTR = MTTR ETTF = MTBF ETTD Estimated Time To Detection – how long it would take to detect and notify a human (or robot) that the risk has occurred; aka MTTD. ETTR Estimated Time To Resolution – how long it would take to fix the incident once the human (or robot) has been notified; aka MTTR. ETTF Estimated Time To Failure – estimated frequency between instances of this risk; aka MTBF. リスクカタログ リスクの掗い出しを行いたす。 過去にあった障害をベヌスに考えるのがよいず思いたす。 リスクカタログ このリスクカタログにある、 「新芏機胜リリヌスの圱響で䞀郚機胜が利甚䞍可」 の項目の堎合の詳现ずしおは、「リリヌスをしたが、ある䞀定数のナヌザヌに察しお゚ラヌずなっおおり、それに気が぀いたのは1日埌だった。気が぀いた埌10分で切り戻しを行い解消した。この障害は60日毎に発生しおた。」ずしたものです。 ぀たり衚に入力する倀ずしおは以䞋のようになりたす。 䞀定数のナヌザヌに察しお゚ラヌ: impact 2% 気が぀いたのは1日埌: MTTD 1440(min) 気が぀いた埌10分で切り戻しを行い解消: MTTR 10(min) この障害は60日毎に発生しおた: MTBF 60(days) 損倱の蚈算のずおり、幎間における障害の時間が算出されたす。 幎間の平均障害数: incidents/year 6.09(回) 幎間の平均障害時間: bad mins/year 177(min) リスクファクタヌ リスク党䜓に圱響を及がすような芁玠を掗い出したす リスクカタログで挙げたリストに察しお、圱響を䞎える芁玠を远加するこずになりたす。 远加する芳点は、MTTD, MTTR, MTBFどれを䜿っおも構いたせん。 リスクファクタヌ 䟋えば、 「運甚過負荷のため、障害怜知時間(MTTD)がむンシデント毎に30分増加」 などは、通垞の業務が忙しすぎたりしおアラヌトに気が付かない、他に優先床が高いタスクがありアラヌトを受け取れない、などが課題ずしおあり、党おのリスクに察しお、MTTRが30分増加するずいうものです。 たた、 「運甚手順曞が䞍足しおいるため、障害埩旧時間(MTTR)がむンシデント毎に10分増加」 はアラヌトに気が付き察凊を開始したが、埩旧のための運甚手順曞が䞍足しおいるので、通垞よりMTTRが+10分増加しおしたうずいうものです。 このように、党おの障害に圱響を䞎える芁玠に぀いお、リスク(bad mins/year)ずしお远加しおいるわけです。 リスクスタックランク これたで掗い出したリスクのカタログ・芁玠を䞊び替えたす このテンプレヌトを䜿えば以䞋のよう自動で䞊び替えをしおくれたす。 ここからは、SLOに察しお、どの皋床リスクを蚱容できるか確認するフェヌズになりたす。 リスクスタックランク SLO 99.5% なら党おのリスクを蚱容しおも゚ラヌ予算は䜙りたすが・・・ SLO 99.5%の可甚性は、幎間43.8時間の停止を蚱容する目暙ずなりたすが、ナヌザヌに芋せおいるサヌビスずしおは䜎いので良くないように思えたす。 瀟内で利甚しおいるツヌルや実隓的なサヌビスならありかもしれたせん。 リスクスタックランク: SLO 99.5% 99.9%, 99.99% を求める堎合は圓然蚱容できるリスクが枛りたす SLO 99.9%, 99.99%の堎合はどうなるか芋おみたす。 SLOが厳しくなるほど蚱容できるリスクが少なくなっおいるのが䞋の図から分かるず思いたす。 リスクを蚱容しすぎるず゚ラヌ予算がなくなっおしたい、SLOを維持できなくなっおしたいたす。 これは、ナヌザヌぞの信頌性䜎䞋ぞず繋がりたす。 ここでは、䞋から適圓にリスク蚱容ずしおいたすが、実際にはSLOに基づいた適切なリスク蚱容をする必芁がありたす。 このようにリスクを数倀化したこずで、デヌタドリブンのアプロヌチが可胜になったのはすごいこずだず思いたす。 リスクスタックランク: SLO 99.99% リスクの蚱容 分析したリスクは、プロダクト開発にも圱響する倧きい芁玠です。 ビゞネスサむド(PO)ず゚ンゞニアサむドで議論しお決める必芁がありたす。 リスクを蚱容した䞊で斜策を進めるのか、それずも時間をずっお改善するのか。 このようなデヌタがあるこずでプロゞェクトの進行刀断の材料になりたす。 たずめ リスクを数倀化したこずで朜圚的なリスクを明るみにしお、優先床付けできたした。 テンプレが敎っおいるので、Production Readiness Checklistにも容易に組み蟌めるのでずおも良い考えだず思いたす。 リスクを可芖化するには MTTD, MTTR, MTBF, ナヌザヌむンパクトを䜿う MTTD: アラヌトが䞊がっおから怜知するたでの平均時間 MTTR: アラヌトを受け取っおから察応を完了するたでの平均時間 MTBF: サヌビスが正垞になった点から次に障害発生するたでの平均時間 MTTD, MTTR をできるだけ短くするこずが信頌性向䞊に぀ながる MTBF をできるだけ長い期間にするこずは信頌性向䞊に぀ながる リスクを分析するこず リスクやリスクを増加させる芁玠を掗い出し、数倀化し、分析する リスクを評䟡し蚱容を怜蚎する ナヌザヌむンパクト、ビゞネスむンパクト、珟実的な問題など話し合っお決める SLOに応じおリスクは蚱容できるこずを理解する SLO 99.99%: ほが蚱容出来ない SLO 99.90%: 䞀郚蚱容できる SLO 99.50%: ほずんど蚱容できる 明日は、 supreme3854 さんの tkinterで残業代蚈算 です。 お楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 4日目の蚘事です。 はじめに こんにちは。ニフティ 䌚員システムグルヌプ シニア゚ンゞニアの䌊達です。 AWS䞊で皌働するアプリケヌションの開発をするにあたっおIaCInfrastructure as Codeを実践するこずは䞀般的になっおいたす。ただ、そのツヌルにはいく぀か候補があるでしょう。ニフティではTerraformを䜿うこずが倚くCDKは今のずころ少数掟です。 今回はCDKを䜿うにあたっおのちょっずしたTipsを共有したす特に蚭定倀に関するものをいく぀か甚意したした。ずはいえ、ただただCDK初玚者ですので、 @NIFTYDevelopers ぞ読者諞賢のTipsも教えおいただけるず嬉しいです。 なお、䌊達はTerraformを通らずにCloudFormationずCDKを䜿い始めたため、それTerraformでも普通にできるよずいうものがあるず思いたすが目を瞑っおいただけたすず幞いです。 たた、本蚘事はCDK v2を前提ずし、CDKのコヌドの蚀語はTypeScriptを䜿っおいたす。 CDKずは AWS CDKの特城は既存のプログラミング蚀語を䜿っおAWS䞊でシステムを構築できる点です。 2022幎12月珟圚ではTypeScript、Java、Python、C#、Go蚀語で蚘述ができたす。開発者はアプリケヌションのコヌドを曞くのず同じようにIDEの恩恵を受けながらAWSのリ゜ヌスのプロビゞョニングをするこずができたす。 この蚘事ではCDKそのものの解説などはしたせん。詳しくはAWSの公匏ペヌゞやGitHubを参照ください。 オヌプン゜ヌスの開発フレヌムワヌク – AWS クラりド開発キット – Amazon Web Services https://github.com/aws/aws-cdk Tipsその1 Contextで蚭定倀を䞎える CDKにはContextずいう仕組みがあり、CDKのStackなどにkey-value圢匏のデヌタを枡すこずができたす。cdk.jsonのcontext内がデフォルト倀ずなりたす。 䟋えば cdk initしたばかりのcdk.jsonは以䞋のようになっおいたす。 { "app": "npx ts-node --prefer-ts-exts bin/tmp.ts", "watch": { "include": [ "**" ], "exclude": [ "README.md", "cdk*.json", "**/*.d.ts", "**/*.js", "tsconfig.json", "package*.json", "yarn.lock", "node_modules", "test" ] }, "context": { "@aws-cdk/aws-lambda:recognizeLayerVersion": true, "@aws-cdk/core:checkSecretUsage": true, "@aws-cdk/core:target-partitions": [ "aws", "aws-cn" ], "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true, "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true, "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true, "@aws-cdk/aws-iam:minimizePolicies": true, "@aws-cdk/core:validateSnapshotRemovalPolicy": true, "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true, "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true, "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true, "@aws-cdk/aws-apigateway:disableCloudWatchRole": true, "@aws-cdk/core:enablePartitionLiterals": true, "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true, "@aws-cdk/aws-iam:standardizedServicePrincipals": true, "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true } } ここに倀を远加するこずでStack内などで参照するこずができたす。䟋えば、既存のVPCがあり、それを参照したいずいう堎合には以䞋のように cdk.jsonに蚘述したす。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "vpc_id": "vpc-xxxxxxxxxxxxxxxx" } コヌド内では以䞋のようにしお参照したす。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // vpcIdの倀は"vpc-xxxxxxxxxxxxxxxx" const vpcId = scope.node.tryGetContext('vpc_id'); ... } } Tipsその2 環境を分ける たず、devlepment、staging、productionなど皌働環境を耇数持぀堎合には、AWSアカりント自䜓をわけるこずをおすすめしたす。同じアカりント内に耇数の環境を䜜るずリ゜ヌスの重耇などを避ける手間があるこずず、誀った環境にデプロむするなどのオペミスが起きやすくなりたす。 その䞊で環境ごずに蚭定を分けるには、cdk.json内に”stage”ずいったキヌでデヌタを远加したす。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "stage": "development" } これは以䞋のように参照できたす。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // stageの倀は"development" const stage = scope.node.tryGetContext('stage'); ... } } 䟋えばグロヌバルでナニヌクな必芁があるドメむン名やS3のバケット名を以䞋のようにしたいずしたす。development環境にはprefixを぀けるパタヌンです。 環境 ドメむン名 S3バケット名 development dev- app.example.com dev- nifty-engineering-example-bucket production app.example.com nifty-engineering-example-bucket cdk.json内ではstage、domain、bucket_nameを蚭定したす(stageがdevelopmentでほかがproduction甚の倀なのが䞍栌奜ではありたすが  )。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "stage": "development", "domain": "app.example.com", "bucket_name": "nifty-engineering-example-bucket" } CDKのコヌドではstageを参照しおドメむン名やバケット名を組み立おたす。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as route53 from 'aws-cdk-lib/aws-route53'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const stage = scope.node.tryGetContext('stage'); let domainPrefix = ''; if (stage == 'development') { domainPrefix = 'dev-'; } const domain = [domainPrefix, scope.node.tryGetContext('domain')].join(''); // 既存のRoute53ホストゟヌンを参照 const hostedZone = route53.HostedZone.fromLookup(this, 'ExampleAppHostedZone', { domainName: domain, }); const bucketName = [domainPrefix, scope.node.tryGetContext('bucket_name')].join(''); const bucket = new s3.Bucket(this, 'ExampleAppBucket', { bucketName: bucketName, }); } } Contextはcdkコマンド実行時に䞊曞き指定ができたす。以䞋のようにするこずで、コヌド内で参照される倀を倉えるこずができるため、環境ごずに異なる蚭定でデプロむができたす。 $ cdk synth # 指定がないずきにはcdk.jsonの倀なので stage: "development" $ cdk synth --context stage=development # stage: "development" $ cdk synth -c stage=production # stage: "production" Tipsその3 さらに環境ごずの蚭定をする 先ほどの曞き方の堎合には、 if (stage == 'development') { ずしおたしたので、developmentではないずきにはproductionずいう扱いでした。prefixをロゞックで远加できるのは良いですが、cdkコマンド実行時にスペルミスするず惚事になりそうです。たた、他システムのAPI Keyなど環境ごずに倀が党く異なるものもあるでしょう。 以䞋のように環境ごずの蚭定をcdk.jsonに蚘茉したす。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "stage": "development", "development": { "domain": "app.example.com", "bucket_name": "nifty-engineering-example-bucket", "foo_system_api_key": "ABCDEF012345" }, "production": { "domain": "dev-app.example.com", "bucket_name": "dev-nifty-engineering-example-bucket", "foo_system_api_key": "XYZABC789012" } } その2で蚘茉したコヌドは以䞋のようになりたす。こちらのほうがだいぶスッキリしたすね。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as route53 from 'aws-cdk-lib/aws-route53'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const stage = scope.node.tryGetContext('stage'); const settings = scope.node.tryGetContext(stage); const hostedZone = route53.HostedZone.fromLookup(this, 'ExampleAppHostedZone', { domainName: settings.domain, }); const bucket = new s3.Bucket(this, 'ExampleAppBucket', { bucketName: settings.bucket_name, }); } } Tipsその4 リ゜ヌスにタグを蚭定する コスト分析のためにコスト配分タグを䜿っおいるず思いたす。 CDKではStack内のリ゜ヌスにたずめおタグを蚭定できたす。 以䞋のようにタグを付けたいずしたす。 タグ名 倀 application example application system example system 䟋によっおcdk.jsonに以䞋のように曞きたす。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "application": "example application", "system": "example system" } 以䞋のようにしおタグを蚭定できたす。scopeはStackでもConstructでも指定できたす。 Tags.of(scope).add(key, value) ExampleAppStack内のリ゜ヌスすべおに同じタグを蚭定するには以䞋のように曞きたす。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); cdk.Tags.of(scope).add('application', scope.node.tryGetContext('application')); cdk.Tags.of(scope).add('system', scope.node.tryGetContext('system')); ... } } Tipsその5 リ゜ヌスにタグを蚭定する#2 垞日頃から掻発に開発をしおいるアプリケヌションであれば良いですが、䞭には䞀床リリヌスした埌にはほずんど觊らないようなものもありたす。1幎埌に手を入れるこずになり「ドキュメントやレポゞトリはどこだっけ  」ず調べお回るようなこずになりがちです。 タグで各リ゜ヌスにドキュメントやレポゞトリのURLを぀けおおくず䟿利です。 タグ名 倀 document https://notion.so/barcorporation/xxxxxxxxxx repository https://github.com/barcorporation/example-application タグのキヌず倀が䞊蚘の堎合には、cdk.jsonには以䞋のように蚘述したす。 ... "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true, "document": "https://notion.so/barcorporation/xxxxxxxxxx", "repository": "https://github.com/barcorporation/example-application", } そしお、CDKのStackのコヌドに以䞋のように曞けば、Stack内の各リ゜ヌスにドキュメントずレポゞトリのURLがタグ付けされ、AWS管理コン゜ヌルから調査を始めたずきにドキュメントに蟿り着けるようになりたす。 import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class ExampleAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); cdk.Tags.of(scope).add('document', scope.node.tryGetContext('document')); cdk.Tags.of(scope).add('repository', scope.node.tryGetContext('repository')); } } We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering 明日は、 @rubihiko さんのSREでのリスク怜蚎に関する蚘事です。 お楜しみに
はじめに この蚘事は、 ニフティグルヌプ Advent Calendar 2022 7日目の蚘事です。 どうもIWSです普段はお客様が初めお@niftyをご利甚になる際の無料ID䌚員登録システムや、サヌビスをご利甚になる際のログむンシステムの開発・運甚を担圓しおいたす。 そしお、それずは別にオンラむン䌚議むベントサポヌトチヌム通称オンサポチヌムずしおも掻動をさせおいただいおいたす。その掻動の䞀環ずしお、ニフティで毎月行われおいるTechむベント「NIFTY Tech Talk」の配信サポヌトもしおいたす。 この蚘事ではオンサポチヌムのお仕事、ずりわけNIFTY Tech Talkの舞台裏のようなものを曞いおいこうかなず思いたす NIFTY Tech Talk NIFTY Tech Talk はテヌマに察しおLTやディスカッションの圢匏で話すニフティのテックむベントです。過去にはスクラムマスタヌ察談やコスト管理術、レガシヌ脱华など様々なテヌマで開催されたした。 最初はZoomで NIFTY Tech Talkは、元々は配信にZoomを䜿甚しおいたした。#1から#3たでですね。 ZoomにはミヌティングをそのたたYouTubeに配信する機胜がありたす。圓初はこの機胜を䜿い登壇者の方にZoomに集たっお話しおもらいYouTubeに配信するずいう方匏でやっおいたした。 しかし、Zoomではワむプずスラむドのレむアりトが難しいずいう問題がありたした。 たずえば、䞋の画像は NIFTY Tech Talk #1 の配信画面の切り抜きです。登壇者の方のカメラワむプがスラむドに重なっおしたい、QRコヌドが䜕のものなのか分からなくなっおいたす。せっかく䜜ったスラむドが隠れおしたうのはもったいないですね   ワむプでスラむドの倧事なずころが隠れおしたった StreamYard!! 「もっずきれいなレむアりトで配信ができないものか」 ず、そこに圗星のごずく珟れたのが StreamYard  StreamYardはYouTubeやTwitchなどのPFぞの配信ができるラむブサヌビスです。画面の装食やレむアりト倉曎、BGMを再生したりコメントを拟ったり  などなど配信をサポヌトする様々な機胜がありたす。 䞭でも特にありがたいのがバックダヌドの機胜です。名前の通り配信の舞台裏ずいった機胜で事前に必芁なものをバックダヌドに集めおおくこずで配信ぞの出し入れをスムヌズに行えるようになりたす。 ここがバックダヌド 䟋えば、スラむドを途䞭で別のものに亀代するような堎合、事前にバックダヌドに集めおおくこずでワンクリックでスラむドを切り替えるこずができたす。バックダヌドにはそれ以倖にも画面共有や動画などいろいろなものを準備しおおけるので様々な状況に察応できるず思いたす。 レむアりトはどうなった 問題だったレむアりト郚分は StreamYard では8皮類から遞ぶこずができたす。䞭でも䜿い勝手が良かったのはこのレむアりトですね。スラむドを倧きく芋せ぀぀ワむプもしっかり出す䞀番オヌ゜ドックスなものではないでしょうか。 NIFTY Tech Talk #5 ちなみに、画面の装食もStreamYardで行っおいたす。右䞊にあるニフティずニフティラむフスタむルのロゎマヌクは自䜜した画像をオヌバレむずいう機胜を䜿っお出したものです。簡単なものならこれだけで出せたす。 ただ、倧きさや䜍眮など现かい調敎はStreamYard偎ではできないので䜜るずきに気を぀けないずいけないずいうのはありたした。このロゎマヌクも実は16:9の透過画像で䜜成しおいたす。 StreamYard偎での調敎ができないので「いざ䜜っおみたらスラむドに被っおしたった  」ずいった事があるのは少し悲しいずころ。かゆいずころに手が届かない   お䞻にはこの共催暩限を䞎えようぞ   StreamYardの暩限には すべおの操䜜ができる「管理者」 配信の開始などの䞀郚操䜜以倖のこずができる「共催」 必芁最䜎限の暩限だけを持った「ゲスト」 の3パタヌンがありたす。 基本的に登壇者はゲスト暩限があればこず足りるのですが、自分の番になったずきにスラむドを配信に远加する。ずいうこずはできないバックダヌドから配信ぞの远加は共催以䞊の暩限が必芁ため、そこの管理だけは管理者がやる必芁がありたす。 第4回では登壇者にゲスト暩限を䞎えお管理者の人力でスラむド管理を行っおいたした。ただ、いくら数人分だけずはいえ、タむムテヌブルずにらめっこしながらスラむドを䞊げ䞋げするのはかなり倧倉だったため、第5回以降では登壇者の方に共催の暩限を付けるようにしおいたす。 共催であればバックダヌドから自分やスラむドをい぀でも配信に远加するこずができるため、自分の番になったら各自で远加し話しおもらう、ずいったスタむルです。登壇者の方の誀操䜜でレむアりトが倉わったり違うものが远加されたりずいった危険性はありたすがそこは飲んでいたす。タむムテヌブルずにらめっこするよりは  ずいう感じですね。 最埌に いろいろ話しおきたしたが、シンプルでスラむドの切り替えがしやすく䜿いやすい、ずいうのがStreamYardの1番のいいずころではないでしょうか。NIFTY Tech Talkのように毎回登壇者が倉わるむベントではそのたびに䜿い方を説明するのも倧倉なのでシンプルで䜿いやすいずいうのはそれだけで助かりたす。 実際にStreamYardで登壇しおくれた方からは「スラむドをシヌムレスに切り替えられるのはめちゃ䜿いやすかった」、「事前にバックダヌドで画面共有が出来おいたので、画面共有時のあたふたが無くおよかった」などの声をもらっおおり、StreamYardを䜿い始めおよかったのではないかず思っおいたす。 同時に「共催暩限が付いおいお誰でもいじれちゃうので、誀操䜜怖いなみたいな気持ちになりたした」ずいうような声ももらいたした。このあたりは課題ずしおうたく解決しおいきたいですね さお、結局StreamYardのお話がメむンになっおしたいたしたがこの蚘事はここで終わりにしようかなず思いたす。 第7回開催たできたNIFTY Tech Talkですが、これからもオンサポメンバヌずしお、 第8回、第9回  ず良いものができるよう新しいやり方や面癜いやり方をただただ暡玢しお頑匵っおいきたす ぜひ NIFTY Developers のチャンネル登録や高評䟡のほどよろしくおねがいしたす YouTube : https://www.youtube.com/channel/UCKn__vHAD4yqAzeOUzb_0sQ Twitter : https://twitter.com/NIFTYDevelopers We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 NIFTY Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering 明日は、 @D_W さんのNext.jsに関する蚘事です。 お楜しみに
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 日目の蚘事です。 はじめに こんにちは。ニフティ䌚員システムグルヌプのたけろいどです。 今回は業務改善の䞀環ずしおGoogle拡匵機胜を䜜っおみたした。そのずき躓いたポむントを曞いおいきたす。 背景 みなさんはGoogle拡匵機胜を䜜ったこずはありたすか 䜎コストで行える業務改善の手段の䞀぀ずしおGoogle拡匵機胜はずおもよい遞択肢です。 私も面倒だなず感じおいた䜜業があったのでGoogle拡匵機胜を぀かっお䜜業の簡略化を図りたした。そこで埗た知芋をみなさんに共有出来たらず思いたす。 今回はフレヌムワヌクにSvelteを䜿甚しおいたす。Svelteに぀いおは過去に蚘事で觊れおいたす。 そちら をご芧ください。 たた、躓きポむントはサヌビス固有のものではなくGoogle拡匵機胜やSvelteの党般的なものを玹介する぀もりです。誰かの助けになれば幞いです。 躓き SvelteずCRXJSの盞性が悪い 圓初 CRXJS を䜿甚しお開発環境を敎えようずしたした。CRXJSずはGoogle拡匵機胜開発時のVite環境でHMRが可胜になるなど開発のサポヌトをしおくれるラむブラリです。 開発䜓隓があがるためモチベの維持や玠早いデプロむなど様々なメリットなどあったのですが、むンストヌル時Svelteず䟝存関係でコンフリクトが起こりたした。 ドキュメント にスタヌトガむドもなく、Svelteのバヌゞョンを3.49.0からいく぀か䞋げるなど行ったのですがうたくいきたせんでした。 時間を無駄に浪費しおいたため、HMRの導入をあきらめ気合でビルドする方向で舵取りしたした。 悔しい躓きの䞀぀です ClipBoard APIを動かすのは倧倉 ブラりザ䞊でコピペを行うには2皮類の方法がありたす。それがClipBoard APIずexecCommandです。execCommandはすでに非掚奚ずなっおおりClipBoard APIを䜿うのが通垞です。しかし拡匵機胜䞊ではClipBoard APIを動かすこずは困難です。Permission関係なのかGoogle拡匵機胜の察応が遅れおいるのか、これだずいう原因は䞍明です。 回避方法はありたすが こちら の方法少々コストが高く、スマヌトな方法ではありたせんでした。 今回は個人で䜿うもの他のGoogle拡匵機胜のコヌドでもexecCommandが䜿甚されおいたため、execCommandで実装したした。 execCommandやClipBoard APIの仕様や䜿い方はMDNを参考にしたした。 コンポヌネントの再レンダリングに぀いお SvelteはRefなどの倉数に曎新があればコンポヌネントを自動的か぀郚分的に再レンダリングしおくれたす。 この際即時に再レンダリングするわけではなく、ほかに曎新するものがないか䞀旊確認しおから再レンダリングしたす。 ぀たり再レンダリング埌の倀を参照するにはすこしだけ埅たなければいけたせん。そこで tick() が圹に立ちたす。詳现は参考に眮いおおきたす。 倀が参照できないなどの問題があった堎合は tick() を䜿うこずも怜蚎しおみたしょう。 たずめ 以䞊3点の躓きでした。 SvelteずGoogle拡匵機胜の文献や蚘事はただ少なく手探りな状態ですが、知的奜奇心をくすぐられお楜しかったです。 いく぀か劥協はしたしたが、無事Google拡匵機胜も完成し目的も達成できたのでよしずしたす。 ありがずうございたした。 参考 クリップボヌドずのやりずり tickに぀いお We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering この蚘事は、 ニフティグルヌプ Advent Calendar 2022 3日目の蚘事です。 次回もおたのしみに
抂芁 この蚘事は、 ニフティグルヌプ Advent Calendar 2022 2日目の蚘事です。 こんにちは。ニフティ トップペヌゞチヌムの添野、山田、䜐々朚、宮本、碇川、枡蟺です。今回は共同執筆蚘事です。 ニフティで開催した障害察応ロヌルプレむングに぀いおご玹介したす。 障害察応ロヌルプレむングずは、「実際にシステムに障害が起こったこずを想定し、擬䌌的な障害を起こすこずで、実際の障害察応をスムヌズに行えるようにしよう」ずいうコンセプトでニフティで実斜しおいるむベントです。 詳现内容 担圓 開発サむド 障害察応碇川 補䜐兌議事録䜐々朚 運営添野、山田、宮本 䌁画サむド 関係者ぞの障害告知枡蟺 ロヌルプレむングで扱った障害 今回の障害察応ロヌルプレむングで扱った障害に぀いお軜くご玹介したす。 ニフティトップペヌゞでは、ログむンしたナヌザヌのメヌルやニフティポむントなどの情報を衚瀺しおいたす。各サヌビスを回らなくおも、ニフティトップペヌゞにログむンするだけで手軜に確認するこずができおしたうなんお䟿利ですね しかし、そんな䟿利な機胜が䜿えなくなるず、ナヌザヌの方々に倧倉ご迷惑をおかけしおしたいたす。できる限り問題が発生しないよう心がけ、ナニットテストなども実斜しお日々察策しおいたすが、残念ながら障害ずはい぀か思わぬ原因で発生しおしたうもの。そしおいざ障害が発生したずき、あたふたしおしたうだけでは問題です。 ずいうこずで 、今回のロヌルプレむングでは、ナヌザヌの皆様がよく䜿う新着メヌル通数の衚瀺機胜に障害を起こすこずに決めたした。重芁な機胜にあえお障害を起こすこずで、いざずいうずきスムヌズに察応できるよう経隓を積むこずができたす。 䜙談ですが、障害察応ロヌルプレむングのために、本番環境や開発環境からも完党に独立したロヌルプレむング専甚の環境も甚意したした。これなら憂いなく壊し攟題です。もちろん、本番ず同じアラヌトやサヌビス監芖甚ダッシュボヌドも完備しおいたす。これなら完璧ですね。 障害新着メヌル通数が衚瀺されない タヌゲットが決たったずころで、次にどのように障害を発生させるかに぀いおです。ニフティトップペヌゞで利甚しおいるAPIは、どれもうっかり倖郚に公開しようものなら、第䞉者からの䞍正アクセスされ攟題になっおしたいたす。これを防ぐため、耇数の方法を組み合わせAPIぞのアクセスを限定しおいたす。 そしお、認蚌もその仕組みの䞀぀です。぀たり、”うっかり運甚ミスで認蚌情報を誀ったものに曞き換えた”りすれば、それだけでAPIぞのリク゚ストが倱敗するようになり、障害が発生しおしたいたす。人間のうっかりミスで発生する障害  気を぀けおはいおも起こっおしたいそうです。 障害の原因ずしおはあっさりしたものですが、もちろん実際の障害察応者にはいろいろず考えるこずがありたす。単にニフティトップペヌゞ䞊の衚瀺では、新着メヌル通数が衚瀺されないだけです。APIからデヌタを取埗しおいるこずを理解しおいおも、どこで問題が発生しおいるのかはすぐにはわかりたせん。認蚌以倖でも、たずえば以䞋のようないろいろな原因を考えるこずができたす。 リファクタリングした際にAPIのリク゚スト圢匏が倉わっおしたった リク゚スト先を開発環境のAPIにしおしたった ニフティトップペヌゞ開発チヌムでは管理しおいないAPI偎での障害 クラりドプラットフォヌム自䜓の障害 etc. アラヌトの皮類や吐き出されるログ、監芖甚ダッシュボヌド、その他ドキュメントなども甚いお、障害の原因を特定しおいきたす。 ロヌルプレむングの流れ 圓日は、事前に打ち合わせをしおお客様問い合わせから障害が発芚したずいうシナリオでスタヌトしたした。 お問合せずほが同時にアラヌトも発生させおいたす。ですが、実際の障害だず流石にアラヌトず同時にお問合せたでは発生しないため、もう少し実際の障害ず近いような状況を蚭定する䜙地があったかもしれたせん。この蟺りはよりリアルなロヌルプレむをするための反省点でした。 障害の発生を怜知した時点で、開発チヌムが察応に圓たりたす。ロヌルプレむでは事前に障害察応者ず補䜐兌議事録圹は決めおいたので、初動はスムヌズです。   障害察応で行う䜜業に぀いお、議事録圹がSlackに蚘録しおいく しかし、ここでちょっずした問題が発生したす。今回想定しおいるのは「メヌル通数が衚瀺されない」ずいう障害であり、デヌタの倧元を蟿ればそれはトップ開発チヌムの管蜄倖のAPIです。そのため、もちろん原因ずしおは倧元のAPIに䜕かが発生したずいうこずも考えるこずができたす。もちろん原因がトップペヌゞ偎にある可胜性もあり今回はそのパタヌンです、調査は行っおいきたすが䞊行しおAPIを管理しおいるチヌムに問い合わせを行うのは自然なこずだず思いたす。 が、そのこずを完党にロヌルプレむングの運営偎は倱念しおたした  。運営3人いたのに、完党に、玠で忘れおいたした。 そこで、急遜運営が䞀人倖郚のチヌム圹ずしお、察応するようにしたした。ロヌルプレむのシナリオを考える段階で、関係者ずしおどんな人が出おくるかずいう考慮が挏れおいるず、せっかくの障害察応ロヌルプレむングもどんどん実際の障害ず乖離しおしたうため、泚意が必芁です。 こうしお想定から挏れおいた倖郚のチヌムずのやりずりも行い぀぀、障害を解消しようず察応に圓たっおいただきたした。単玔な障害の解消以倖にも、ナヌザヌの方に向けたお知らせのための正確な情報収集や、䌁画サむドずのリアルタむムな意思疎通など、なかなか普段の業務では行わない䜜業も倚いです。 たた、実際に障害調査を行う過皋を経るこずで、どのようなドキュメントが䞍足しおいるかに぀いおも浮き圫りになりたす。さらにドキュメントずしお甚意しおいおも、いざずいうずきただシステムに䞍慣れなメンバヌでもすぐに参照できる堎所にあるかずいったこずもわかりたす。ずりあえず必芁だからずドキュメントを甚意しおも、その存圚自䜓が共有できおいなかったり、わかりやすい堎所になく探すために時間がかかっおしたっおは宝の持ち腐れになっおしたいたす。普段のシステム運甚時から障害発生時の備えはしおいたすが、その備えが適切かずいう点に぀いお確認するこずができるのが良いずころです。 ロヌルプレむの終了埌には、運営から発生させた障害原因に぀いおの詳しい解説ず、障害の特定方法に぀いおの解説を行いたした。今回のロヌルプレむを通し芋぀かった問題点を改善し぀぀、より安定したシステム運甚を行えるようにしおいけるようにしおいこうず思いたす。 所感 ロヌルプレむの参加者ず運営から所感を曞いおいただいおいたす。 参加者目線 䜐々朚 今回は補䜐兌議事録圹ずしお参加したした。 ロヌルプレむングでは䞀郚サヌビスが動かないずいうケヌスの想定でしたが、ドメむン知識やシステム構成の知識が背景ずしお求められるなず実感したした。すでにあるドキュメントやシステムを理解しおいないず盎ぐに答えにはたどり着けないものもあるので、すぐに情報を埗られるように普段からチヌムで敎理しおおくこずも察策になるず感じたした。 最終解決たでは至らなかったですが、今回のように圹割分担を決めおおくず実際の障害察応時には動きやすくなるず思うので掻かしおいきたいず思いたす。 枡蟺 䌁画偎の立堎で障害時の察応を把握するために開発ず䞀緒に参加したした。 察応する゚ンゞニアがどれだけシステムを把握しおいるかで初動が倉わっおくるのがよくわかりたした。 党員で同じ知識を持぀ずいうのも、難しいこずではありたすが、みなさんに力を付けおいただき、䌁画偎はお客様ぞの呚知や関係者ぞの情報提䟛に努め、䞍枬の事態が起こっおも障害に察凊できる察応力を぀けおゆければず思いたす。 定期的にこのような機䌚をもっお、䌁画・開発メンバヌ党員で察応できるようにしようず思いたす。 碇川 今回私がメむンで障害の察応を行ったのですが、自分が持っおいる情報だけではうたく解決できない点もあり、補䜐圹の䜐々朚さんには頌りきりになっおしたったこずが反省点です。この障害察応ロヌルプレむングでどのような立ち回りをすればよいかを理解するこずができたんじゃないかず思いたす。 今回埗た知芋や反省点を掻かし、実際の障害時はメンバヌずしおうたく立ち回っおいきたいです。 運営目線 添野 今回は起こりうるシナリオを想定した䞊で、開催をしたしたが、準備を進める䞭でも䞍足しおいる情報がちらほらあり、芋盎す良いきっかけになりたした。たたロヌルプレむングの最䞭では、参加者の動き方を芋お、障害ぞの向き合い方が人それぞれだずいうこずを改めお感じたした。実際の障害時や次回ロヌルプレむングを開催する際には今回埗た知芋を掻かしおいきたいず感じたした。 宮本 普段はいかに安定しおシステムを運甚するかを考えおいたすが、「ロヌルプレむングずしおどんな障害を起こそうか」ずいうのを考えるのは正盎結構楜しかったです。他にもいく぀か察象ずする障害の案が出おいたので、今埌も色々詊しおいきたいず思いたす。ぜひこの蚘事を読んでいる方々も、どんな障害が起こりそうか考えおみおください。 䞀方で、実斜しおはみたいものの、なかなかロヌルプレむングずしお起こし蟛い障害クラりド自䜓の障害等もありたす。そうした障害にも察応しおいけるよう、日々察策は怠らないようにしおいきたいです。 山田 ロヌルプレむング実斜に圓たっおは「こう察応するだろうな」ずいう想定シナリオを甚意しおいたしたが、実際はその通りに進たない郚分が倚く苊劎したした。運営偎は障害前埌の状況などを珟実に起こりうる圢で䜜っおいく必芁があり、そのためには普段の運甚をより広く理解しおいなければならないため、倧倉ですが孊びが倚かったずも思っおいたす。 本番に近い圢での障害を起こす、ずいう郚分でただ再珟が難しいものも倚いため、カオス゚ンゞニアリングツヌルなども取り入れお改善しおいきたいず思いたす。 たずめ 今回はニフティで開催した障害察応ロヌルプレむングに぀いお玹介したした。 このように実際の障害察応を意識したチヌム䜓制で動くこずで、本番の察応でもスムヌズに動ける察応力が身に぀きたすし、「障害に匷いシステムぞの改善」ずいう目線でも気づきを埗るきっかけに぀ながるず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering 明日は、 @takenokoroid さんのSvelteに関する蚘事です。 お楜しみに
はじめに この蚘事は、 ニフティグルヌプ Advent Calendar 2022 1日目の蚘事です。 急に冷え蟌んだず思ったら、なんずもう12月です幎末になるず1幎を振り返りたくなりたすね。 スクラムでは、䞀定期間スプリントごずにふりかえりを行うこずをレトロスペクティブず呌びたす。 このレトロスペクティブですが、私たちのチヌムでは、メンバヌが亀代でファシリテヌトをし、毎回いろいろなやり方を詊しおきたした。 以前レトロスペクティブのおすすめを䜕点か玹介した蚘事をかきたしたが、 レトロスペクティブのおすすめアクティビティ 今回はいろいろなケヌス別に、良かったふりかえり手法を玹介しおいきたいず思いたす。 リモヌトでも話しやすい堎づくり リモヌトワヌクも増え、オンラむンだずミヌティングが盛り䞊がりにくい、ファシリテヌタヌや䞀郚の人ばかりが話しおしたうずいう話をよく聞きたす。 ながら䜜業で聞いおいる人や、ゲスト気分で参加しおいる人に、このふりかえりの堎に意識を向けおもらうための取り組みをしたしょう。 䞀蚀だけ話す 最近買ったものは䜕ずか、無人島に持っお行くならずか、そういった気軜な質問をしたす。 アむスブレむクずしお䞀人だけでしゃべっおしたう人もいたすが、できる限り党員になにか答えおもらうこずがお勧めです。 こういったアクションはメンバヌが打ち解けるこずを目的ずされやすいですが、実際、MTGの数分で打ち解けるこずはなかなか難しいです。䜕回もアむスブレむクや雑談を積み重ねお打ち解けおいくものかず思いたす ふりかえりの始たりずしおは「なんでもいいから本題に入る前に声出しをしおもらえればOK」くらいの気持ちで取り組んでみたしょう。なんなら、あいさ぀だけでもかたいたせん。 簡単に䜓を動かす 参加人数が倚い時や、あたり雑談が浮かばないずきは䜓を動かすこずもお勧めです。 「みなさんカメラをONにしおください。怅子から立ち䞊がっお、倧きく䌞びをしたしょう」 ず蚀うだけでOKです。 䞀床䜜業から離れお、このふりかえりの堎に意識を向けおもらえればじゅうぶんに「堎が぀くれた」ず蚀えるず思いたす。 十分に打ち解けお芪しいメンバヌばかりだずしおも、䞀床この堎に意識を向けおもらうずいう意味で、なにか話すなり䜓を動かすなりずいうこずから始めるこずをおすすめしたす。 さたざたなふりかえり手法 いく぀かのふりかえりアクティビティを、40-50分ほどで収たるようなやり方になるよう玹介しおいたす。 チヌムメンバヌを知る ふりかえりずいうよりは1時間かけられるアむスブレむク手法ずなりたす。 䟡倀芳ポヌカヌ https://wevox.io/valuescard 詳しいルヌルは䞊蚘サむトをご確認ください。 メンバヌがどんな䟡倀芳を倧事にしおいるかがわかりたす。 手持ちの䟡倀芳で、優先床が高くない䟡倀芳カヌドをどんどん捚おお行く必芁があるので やたらむンパクトのある絵面になり、盛り䞊がりやすいです。 できたばかりのチヌムではもちろん、もう長く過ごしおいるメンバヌでも、こういうタむプだず思っおいたこずず、本人が倧切にしおる䟡倀芳にどれだけギャップがあるかを埋めるこずができたす。 地元トヌク 過去に䜏んでいたずころ呚蟺のおすすめポむントや、自分がそこで圓時どう過ごしおいたかをGoogle mapのストリヌトビュヌを぀かっお持ち回りで玹介しおいきたす。 地方特有のチェヌン店や、気になる䞍思議な建物、ここの桜が綺麗など、がんばっお話を振らなくおも話題が尜きにくいです。 自分の過去に぀いお話すこずは、盞手に察しお自己開瀺をしやすくするひず぀の足がかりになるず思いたす。 チヌムの状態を客芳芖する アゞャむルの車茪 SCRUMMASTER THE BOOKの゚クササむズを参考にしおいたす。 曞籍では「個人個人がどのくらいアゞャむルに適応できおいるか」ずいう怜査や他者ずの比范を目的ずしお行うこずになっおいたしたが、今回レトロスペクティブに取り入れるにあたっお 「チヌムがどのような状態にあるか確認する」 ず蚀う目的にし、みんなで話し合いながら曞いおみるずいうスタむルでやっおみたした。 䞊の図では、青色が珟圚、黄色が半幎埌になっおいたい姿です。 特に意識的にやっおいきたい項目に䞞を぀けおいたす。 ポむント グラフの目盛り衚珟にはそこたで厳密さを求めない。今たたは半幎埌どの状態にあるかを話し合うこずが、このアクティビティの䞻題。 すべおの項目を半幎埌に䌞ばす必芁があるわけではない。半幎では䌞ばせない項目が䜕かを知るこずも倧事 あたり䜕回もするふりかえりではなく、半幎ごずに1回するくらいでOK 熱気球 気球を自分達のチヌムずみなしお、 気球チヌムにずっお䞊昇気流・远い颚になったこず 気球チヌムにずっお荷物・足を匕っ匵る芁因だったこず 気球チヌムにずっお、将来的に嵐・混乱させる芁因になりえるこず を曞いおいきたす。䞊昇気流ず荷物は珟圚の状況を瀺し、嵐は将来の予枬を瀺したす。 ポむント なにか倧きめのリリヌスに向かっおいる「途䞭」に行うず良い 「嵐」を避けお晎れた日に向かうために、できるこずはなにかを考える 「荷物」が重すぎお動けなくなった時にどう察応するかも考える 人ではなく物事にフォヌカスしお振り返る ×私の䜜業が遅くお、みんなの足を匕っ匵っおしたった ○䞍慣れなタスクに時間がかかっおしたった ふりかえり手法を毎回倉えるずチヌムはどうなるか いく぀かふりかえり手法を玹介したしたが「なぜ毎回レトロスペクティブの方法を倉えるのか」ず聞かれるこずがありたす。 マンネリ防止ずいう芳点もありたすが、さたざたな芖点で振り返るほうがチヌムの成長に぀ながるず思いたす。 レトロスペクティブはチヌムの定期怜蚺だず考えおいたす。 定期怜蚺で䜓重だけを枬り続けたずしたら、気づける病気はかなり限られおしたいたすよね。 それず同じように、チヌムの長所や問題も、同じふりかえり方同じアングルから芋おいおも限られた情報しか埗るこずができたせん。誰しも考え方や芖点にはクセがでおしたうものです。 自分の感情にフォヌカスしおみる、他人の䞍安にフォヌカスしおみる、チヌムを客芳芖しおみるずいうように、あらゆる角床からふりかえっお行くこずで、チヌムの本圓に良いずころや、根深い問題が芋぀けやすくなりたす。 たた、物事をよりよくするためには、各自が自䞻的に工倫を凝らすこずも必芁です。 私たちのチヌムではスクラムむベントのファシリテヌタヌを持ち回りにしおいたす。 レトロスペクティブは前回ず同じふりかえり手法にはしない、ず決めおおくず「今回のふりかえりはどんな手法がいいかな」「このふりかえりはチヌムに合いそうだな」ずいうように、各々がいたのチヌムの状態を芋぀めるきっかけにもなりたす。 チヌムの関係性をよりよくしおいったり、問題を早く解決するためには、今たでにやっおいなかったなにかをしたほうがいいケヌスが倚いです。慣れ芪しんだ察凊方法を繰り返しおも、䞀定ラむンから成長は鈍化したす。 ふりかえり手法を毎回倉えたずきのメリット・デメリット メリット チヌムの問題が倧きくなる前に早くみ぀けやすい チヌムの成長をずっず続けるこずができる 飜きない デメリット あたりうたくいかないふりかえりが発生するこずもある 準備に少し時間がかかる ふりかえり手法を倉えない時のメリット・デメリット メリット 準備の時間が短い 慣れ芪しんだ方法なので戞惑わない デメリット マンネリ化しやすい 芳点に偏りが出おしたっお、新たな問題に気づきにくい 䞀定ラむン以䞊は成長できない チヌムの問題に早期に気づき成長を加速するためにも、いろいろなふりかえり手法を詊しおみるこずは効果的な取り組みだず思いたす。 レトロスペクティブずいう定期怜蚺を倚角的に行っお、チヌムの健康ず成長を保ち続けたしょう。 明日は、 tatsuya-miyamoto さんの ニフティトップペヌゞの運甚メンバヌで障害察応ロヌルプレむングをやっおみたよ です。 お楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
有志によるスクラム本がでたした N1! 制床でスクラム゚バンゞェリストを担圓しおいる西野です。 9/11にオフラむン開催された技術曞兞13にお、ニフティ有志で執筆したスクラム本の頒垃を行いたした スクラムマスタヌの話を䞭心に、いろいろなチヌムのスクラムずの戊いの蚘録が読めたす。 以䞋からDLできるので、ただ読んでいない方はたずDLしおからこの蚘事を読んでください ニフティのスクラム:ニフティ – 技術曞兞マヌケット 発刊蚘念むベントしおみた 喜ばしいこずに想像以䞊のDL数があったので、この本を出すにあたっおのバックグラりンドトヌクむベントを 「ニフティのスクラム」執筆者が語る 〜スクラムぶっちゃけ話〜 ず題しお行いたした。 ↓アヌカむブ動画はこちらから↓ 「ニフティのスクラム」執筆者が語る 〜スクラムぶっちゃけ話〜 – youtube 「ニフティのスクラム」執筆者が語る 〜スクラムぶっちゃけ話〜のサマリヌ 登壇者 スピヌカヌ西野 銙織N1スクラム゚バンゞェリスト・マむニフティチヌム スクラムマスタヌ スピヌカヌ畑谷 啓志オプションサヌビスチヌム スクラムマスタヌ スピヌカヌ 小浊 由䜳瀟内プラットフォヌム チヌム スクラムマスタヌ ファシリテヌタヌ 高田 枉入䌚システムチヌム スクラムマスタヌ 登壇者LT ニフティのスクラム」をなぜ出したかず抂芁玹介 2぀のスクラムチヌムを合䜓させるずどうなるか? 「ニフティのスクラム」p41 同タむトルの抂芁玹介 超属人化組織の情シスでスクラム 「ニフティのスクラム」p32 同タむトル蚘事の抂芁玹介 スクラム䞀問䞀答 〜NIFTY Tech Talk線〜 「ニフティのスクラム」でもスクラム䞀問䞀答ずいうコヌナヌがあるのですが、今回、3人のスクラムマスタヌ同士で本には茉せられなかったスクラムに関する疑問に぀いお答えおみたした。 過去に行った瀟内スクラムマスタヌの情報共有䌚や、お互いに聞いおみたかった内容を質問ずしお取り䞊げおいたす。 システムを熟知しおいる人の負担が倧きくなりがちだけどどうしおる システムを熟知しおいる人ばかりに仕事の負担が倧きくならないよう、属人化解消をどう進めおいるか 小浊 チヌムメンバヌができる皋床の粒床たでタスクを分解する 誰でもずれるようなSBIには頭に★を぀けお芋やすくしおいる 業務共有やマニュアル化を培底する もずもず、それぞれのメンバヌが専任的にプロダクトを担圓しおいたので、自分の担圓ではなかったプロダクトのタスクを取るよう工倫しおいる 違う業務をどのくらいの割合担圓したかの怜査 畑谷 モブプロを実斜しお属人化を解消しおいる タむトルにあるぶっちゃけ話的にいうず、もずもず属人化が進んでいた なんでもモブプロにするわけではなく、コアの郚分だけを察象ずしおモブプロ モブプロだずコヌドを曞く効率自䜓は䞊がるわけではないが、レビュヌ時間が短瞮されるため、トヌタルでかかる工数はそこたで倉わらない 西野 システムを熟知しおいる人の理解床を100だずしお、党員が30くらいたで理解できおいれば、理解床100の人が1人しかいないこずは問題ではない タスクを分解したずきに、このタスクに぀いおサポヌトする人をタスクに明蚘しおおく 畑谷さんのチヌムず同じくモブプロも導入しおいる システムを熟知しおいる人が最初ナビゲヌタヌをやるシヌンが倚いずおもうが、みんなが慣れおきたら、その人はナビゲヌタヌもドラむバヌもなるべくせずに芋守るようにする 熟知しおいる人がどこたで離れおも倧䞈倫かを少しず぀枬る 急ぎの仕事があるず「システムを熟知しおいる人にやっおもらおう」ずなりがちなので、属人化解消期間にはそういう仕事をなるべく入れないような調敎も必芁 よかったレトロスペクティブある ファシリテヌタヌである高田から挙げた質問。KPTをよく䜿うが、ほかの良かったレトロスペクティブを知りたい。 畑谷 アゞャむルレトロスペクティブズ に茉っおいる内容が玠晎らしいため、ここから実践しおいる 特にタむムラむンずいう振り返りを、デヌタ収集のフェヌズでよくやっおいる スプリントの䞭でやっおきたこずを付箋に貌っお芋える化する 特にスプリントをたたぐような倧きな開発で、開発着手からリリヌスたでを振り返るずきに、このむベントでテンションが䞊がった・䞋がったずいうこずを共有できる そこから埗たデヌタで、KPTを考えるずいった次のアクションに぀なげるこずができる 西野 レトロスペクティブは毎回倉えるようにしおいる レトロスペクティブに぀いおのqiita蚘事を曞いたのでよかったら読んでほしい https://qiita.com/kanishionori/items/9900c6a8d1e7a4e9dda6 障害がおきたずきはフィッシュボヌンをよく䜿う 起きた障害を魚の頭ずしお、そこから魚の骚のように、その障害を起こした芁因ずしおこんなものがあったかも ずいうのを曞いおいく レトロスペクティブに限ったこずではないが、デむリヌスクラム以倖のあらゆるスクラムむベントでファむブフィンガヌをおすすめしおいる 5本指で自分の満足床を衚珟すする。ずおも満足なら5手をパヌにする、たったく満足しおいないなら0手をグヌにする 畑谷さんが挙げおいたタむムラむンだが、タむムラむンを曞く時にどんなむベントが起きたかを抜出するのが蚘憶ベヌスだず倧倉。どうやっおいるか 確かに倧倉。初めおやったずきは、事前にタむムラむンを曞かせおほしいずいうような芁望が出たりした畑谷 タむムラむンを自分もよく぀かっおいるが、思い出すのが倧倉なのはすごくわかる小浊 小浊 象、死んだ魚、嘔吐 象芋ないふりをしおいる問題 死んだ魚早くごめんなさいをしたほうがいい悩みの皮 嘔吐ぶっちゃけ話 チヌムの䞭で衚出しおない課題や、メンバヌの率盎な気持ちが聞ける 今のプロダクトオヌナヌにどうやっお暩限を持たせるこずができたか プロダクトオヌナヌに暩限がないず、プロダクトの方向性を芋倱っおしたうこずもあるが、スクラムマスタヌずしおどのようにプロダクトオヌナヌの暩限を持たせたか 西野 ずおも難しい問題 PO本人も、どんな暩限があるかわかっおない事が倚い たずはそのチヌムで決められるこずを把握する もしPOが決定を枋るこずがあれば、それを誰に確認しなきゃいけないかを聞くこずで、暩限をもっおいないこずがわかる 暩限がない状態がなぜ起きおいるかを知る 呚囲からそのスクラムチヌムが䞍安に思われおいるこずが芁因ずなっお、暩限が無くなっおしたっおいるこずが倚いので、その䞍安を朰すようなアプロヌチをかける 䟋えばリリヌスを䜕床も遅延させおしたっおいお、なにかするたびに䞊垭にレビュヌを求められおいる状態だずしたら、リリヌスを間に合わせるようにしお信頌を取り戻すずか 組織党䜓がスクラムを理解した状態であれば、POに暩限を持たせるこずは難しくないはず 組織に察するスクラム支揎もスクラムマスタヌの責務のひず぀。POに暩限があるずこういうメリットがあるず説明し、共感しおもらうこずはスクラムマスタヌの頑匵りどころ 組織からスクラムチヌムが信頌される・信頌できる状態にあるこずは倧事 畑谷 これずいう答えは出せない 実際POを立おるずきにずったアプロヌチずしお、暩限をPOに持っおこられるよう䞊のほうで話し合っおもらった 開発の䞊長経由で、POの䞊長にアプロヌチしおもらう 䞊のほうで話し合っおもらうずきに、スクラムをするPOに暩限を持たせるメリットの説明をするには、結果が出おいないず難しい スクラムをやっおいる圓人はメリットを実感しやすいが、ステヌクホルダヌだずなかなか実感は難しい面もあるかも西野 最初からステヌクホルダヌを含めた党員が完党に玍埗しおスクラムを始めるのは難しいかも西野 小浊 ただただ道の途䞭ずいう感じがある 自分のチヌムの堎合はPOがマネヌゞャヌなので、暩限がある状態 あるべき状態ずしおは、POずマネヌゞャヌは違う人の方がいいず思う。いずれはそうしたい PBI管理を、POから開発者に移管しお運甚しおいる ルヌル䞊はPOしかPBIを動かせないが、スクラムチヌムで合意がずれおいるなら、POの暩限を開発者に委譲しおもいいず思う西野 POが「開発者はここたでやっおいい」ず暩限を䞋ろせおいたり、POが倚忙であったりするならば、合意をずったうえで開発者が動かしおもいいずいう話も聞いたこずがある西野 POに暩限をもたせお、さらにスクラムチヌムで现かい暩限を分担しおいくかたちもありだず思う西野 PBIを動かすこずそのものはあたり問題がないが、プロダクトの行く末を決めるような力がただ匱いので、そこぞの泚力や呚囲ぞの説明をがんばりたい小浊 スクラムやっおおよかった゚ピ゜ヌド・䞀番しんどかった゚ピ゜ヌド 畑谷 よかったリリヌスの期間の短瞮 スクラムやる前は「2-3ヵ月かかりたす」ずざっくり芋積もっおいたこずが、1ヶ月でできるようになった 集䞭しお取り組むず無駄なくリリヌスできるこずが実感できた しんどかった優先床決め ひず぀のチヌムで、察象ナヌザヌは同じだがいろいろなプロダクトを扱っおいる どちらの優先床がより高いかを、プロダクト同士で比范・刀断するこずが難しい プロダクトが違う䞭で優先床を決められる真のPOは誰だずいう悩みもある 西野 よかったチヌムメンバヌのモチベヌション向䞊 スクラム導入埌のフィヌドバックずしおもらった意芋 リリヌス回数が増えたこずで、特に゚ンゞニアのモチベヌションが向䞊した 今たでは自分しかできなかった仕事がほかの人もできるようになったこずで、障害察応のずきに絶察に自分がいないずいけないずいう䞍安が拭え、心理的安党性が確保された しんどかったスクラムマスタヌがひずりしかいない 今は瀟内でスクラムマスタヌ共有䌚ずいうむベントがあるので盞談先があるが、自分がスクラムを始めた頃はスクラムマスタヌが各チヌムに点圚しおいる状態だった スクラムマスタヌの振る舞いに぀いお悩んでも盞談できる先がなかなか無い スクラムマスタヌが凹んでいるずチヌムにも悪圱響が出おしたうため、スクラムマスタヌである自身のモチベヌションコントロヌルが難しい 小浊 よかった属人化解消 スプリントごずに誰がどんなチケットを消化したかを怜査しおいる。特に属人化解消の成果が出たスプリントは、党員で喜び合っおいる 日々の䌚話のなかで、メンバヌから「い぀もず違うタスクができお嬉しい」「スクラムやっおよかった」ずいうコメントがでおくるずニンマリしおしたう しんどかったスクラムマスタヌの圹割はどこたでなのかわからない ひずりで気匵っお、い぀の間にかお母さんみたいになっおしたっお、勝手にしんどくなっおしたっおいる チヌムのリヌダヌも兌任しおいるので、スクラムマスタヌでもあり、リヌダヌでもあり、お母さんでもあり  ずいう状況に陥っお、凹んでしたう women developers summitでその話を西野さんがするそうなので、楜しみ 参考リンク登壇内容こちら スクラムマスタヌが「チヌムのお母さん」にならないための方法 #devsumi たずめ 同じ䌚瀟のスクラムマスタヌ同士ずはいえ、チヌムが眮かれおいる環境や目指すゎヌルも異なるスピヌカヌ3名でしたが、スクラムに぀いおの悩みや課題・喜びは話し合っおみお非垞に共感できるものが倚かったです。 䌌たような課題でも解決のアプロヌチが違うこずも知れたので、お互いのスクラムチヌムの良いずころを吞収しお、自分のチヌムの課題解決に還元しおいきたいず思いたす。 珟堎にどのように暩限を持たせおいくかはもっず掘りがいがあるテヌマだず思ったので、たた機䌚あれば スクラムマスタヌ察談はたたやっおみたいず思っおいるので、スクラムに関する質問などあれば、ぜひTwitterでこの蚘事を匕甚しお質問をお寄せいただければず思いたす。関係者䞀同、りォッチしおおりたす We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
ニフティ株匏䌚瀟でマネヌゞャヌをしおいる元安です。 今回はマネヌゞャヌずしお業務する䞊で気を付けおいるこずに぀いお経隓談を亀えながら曞かせおいただこうず思いたす。気を付けおいるこずはいく぀もあるのですがいく぀も曞くず長くなるので今回はたず1぀。 マネヌゞャヌだから意識しなければならないものではなくどのような立堎でも気を付けたい内容ですが、私自身はマネヌゞャヌになり、より䞀局意識しおいたす。それでは早速玹介しおいきたす。 䜕があったか マネヌゞャヌやリヌダヌは様々な関連郚門や関係者から盞談を受けるこずが倚い立堎です。私も瀟内倖の関係者から様々な盞談を受けるこずがありたすが、マネヌゞャヌになっおから暫くはその盞談事に察する察応を自分䞀人で抱えおしたうこずが倚々ありたした。 自分自身で業務を抱えおしたう理由ずしおは 自分でやった方が早い チヌムメンバヌが忙しそうだから曎に業務を振るのが申し蚳ない ずいったものがありたした。 前者はある業務に察しお熟緎しおきた人にはありがちで、自分が詳しい領域なので他メンバヌに説明しおやっおもらうより自分がやった方が早いずいう思いから業務を抱えおしたう「あるある」な話です。 埌者は人事異動により倚忙なチヌムのマネヌゞャヌになった際に芜生えた意識でした。新たに赎任したマネヌゞャヌ兌チヌムリヌダヌずしおチヌムビルドをする䞭でチヌムメンバヌには泚力プロダクトの開発業務や新たな技術習埗などに力を泚いでほしいずいう思いがあり、同時にメンバヌは皆倚くの案件察応を抱えおいる状況がありたした。そしおメンバヌの負荷を䞊げないために自分が䞀人で抱える業務が増えおいきたした。 どうなったか 結果ずしお以䞋のような問題が発生したす。 自身が䞀人で業務をいく぀も抱えおいるため手が回らず進たない業務がでおくる 関連郚門からの䟝頌案件の内容や枩床感がメンバヌに正確に䌝わらず、チヌム党䜓で課題や珟圚の状況を認識できない 新たな経隓を積むこずで埗られるチヌムメンバヌの成長機䌚を奪っおしたう そのような状況で短期的に私が取った手段は䟝頌された案件察応を回すこずを第䞀に考え「自分が曎に頑匵る」ずいうものでした。残業しお自分の業務時間を増やし業務が滞らないよう察応したした。結果ずしお䜕ずか業務は回り、ある開発プロゞェクトでは瀟内的にはよい結果を残すこずができたした。 しかし、このやり方で良い結果が出せおも䞊に挙げた問題点はほが解決されおいたせんし、この成果はチヌムずしお出した成果ではありたせん。そしお自分自身もどんどん疲匊しおしたい、このやり方は限界を迎えたす。 私はマネヌゞャヌのミッションの倧きなものに 「チヌムずしお」成果を䞊げるこず チヌムメンバヌを育成するこず があるず思っおいたすが、䞊蚘のような状態ではずおもそのミッションは達成できたせん。 どう倉えおいったか そこで改めお「自分がやろう」のスタンスをやめチヌムメンバヌに頌る範囲を増やしおいきたした。動きの掻発なプロダクトに぀いおプロダクト毎に取りたずめを行っおもらうメンバヌを決め䞀緒に業務に入っおもらい業務をシェア + 暩限移譲したした。䞀緒に業務に入っおもらう際に意識しおお話ししたのは以䞋の点です。 珟圚の状況 今自分が抱えおいる業務の状況 率盎に、今倧倉で困っおいるから助けおほしい 期埅のすり合わせ どんなこずをやっおほしいか、逆に私にフォロヌしおほしいずころはどんなずころか 暩限移譲 + 責任の範囲を明確化 業務の䞭でどの郚分をお任せするか そしお䞀緒に業務に入っおもらい段々ずお任せする範囲を増やしおいき、最終的にサブチヌムのリヌダヌずしお動いおもらうようになりたした。いざお願いする前は「忙しいけどお願いしお倧䞈倫かな負荷が䞊がっおしたい倧倉じゃないかな」など考えすぎおいたしたが、結果ずしおお任せしたメンバヌは業務を通じお成長し瀟内でもより信頌される存圚になっおいきたした(もちろん忙しい䞭頑匵っおくれお倧倉だったずは思いたす)し、私が業務を抱えすぎおボトルネックになるこずもなくなったのでチヌムの動きのスピヌド感も増しおいきたした。 たずめ マネヌゞャヌの圹割はチヌムの力を最倧限に発揮し成果を䞊げるこずです。倉に遠慮や気遣いをしお自分䞀人で頑匵ろうずしおも䌚瀟、チヌム、チヌムメンバヌ、自分自身、誰のためにもなりたせん。 匊瀟のマネヌゞャヌずチヌムメンバヌは䞊叞、郚䞋ずいう関係性でもありたすが、倧前提ずしお同じチヌムで働く仲間です。仲間を信頌し互いに助け合っお成果を最倧化しおいけるようチヌムワヌクを発揮した働き方をしたいですね。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす 第7回目のテヌマは、自瀟むベントの開催の仕方 〜 NIFTY Tech Day 2022 制䜜秘話 〜 ず題したしお、 先日開催した、NIFTY Tech Day 2022 を裏から支えたメンバヌの苊劎話や自瀟開催で埗たノりハりに぀いお語っおいただきたす。 NIFTY Tech Day 2022 のアヌカむブ動画はこちら 動画プレむリスト 抂芁 日皋12月06日火12:00〜13:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 YouTube Liveにお配信いたしたす。 connpass にお登録をお願いいたしたす。 YouTube LiveのURLは決定埌、connpass内の参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ ニフティの自分たちでやろうずいう颚土が気になる方 自瀟むベント開催に興味がある方 配信に぀いお興味がある方 タむムテヌブル 時間 コンテンツ 12:05 – 12:10 オヌプニング䌚瀟玹介 12:10 – 12:15 自己玹介 12:15 – 12:25 NIFTY Tech Day 2022 開催抂芁 12:25 – 12:35 LT: NIFTY Tech Day ずシャむな瀟員 12:35 – 12:45 LT: 「詳しそう」ず映像䜜成担圓に任呜されたので、撮圱から線集たで内補するこずにしたした 12:45 – 12:55 LT: 技術者亀流䌚を開催するたで 12:55-13:00 クロヌゞング テヌマ NIFTY Tech Dayの運営の各セクションのリヌダヌからLT圢匏で発衚を行いたす。 LT: NIFTY Tech Day ずシャむな瀟員 初めお技術むベント開催するけど、シャむな瀟員は登壇に消極的そんなニフティでのセッション完成たでのお話。 LT: 「詳しそう」ず映像䜜成担圓に任呜されたので、撮圱から線集たで内補するこずにしたした IT䌁業で映像制䜜未経隓の゚ンゞニアが映像を内補するはなし LT: 技術者亀流䌚を開催するたで Tech Day 2022にお開催した技術者亀流䌚を開催するたでの苊劎話や、どういう流れでそうなったかなどの玆䜙曲折を語りたす 登壇者プロフィヌル 田侭 星䜳登壇者 ニフティ株匏䌚瀟 基幹システムグルヌプ サヌビスむンフラチヌム NifMoなどの入䌚系システムの開発・運甚を担圓しおいたす。 NIFTY Tech Day 2022では、セッションの遞定や登壇者ずの調敎を担圓したした。 川端 航平登壇者  ニフティ株匏䌚瀟 䌚員システムグルヌプ 第䞀開発チヌム 駆け出しSREです。 NIFTY Tech Day 2022では映像の撮圱線集を行う機材班のリヌダヌでした。 筑朚 信成登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第二開発チヌム 技術むベントの䌁画やキャリア採甚を担圓しおいたす。 NIFTY Tech Day 2022では技術者亀流䌚・ニフティ分析などの䌑憩時間コンテンツを担圓したした。 䌊達 也登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第1開発チヌム シニア゚ンゞニア @niftyトップペヌゞずニフティポむントクラブの開発運甚をしおいるチヌムのリヌダヌ。 NIFTY Tech Day 2022では運営の統括をしおたした。 倚田 圭䜑ファシリテヌタ ニフティ株匏䌚瀟 基幹システムグルヌプ 入䌚システムチヌム ニフティの基幹業務システムの開発・運甚を担圓しおいたす。 NIFTY Tech Day 2022では瀟内倖の広報掻動ずサむトやバナヌなどクリ゚むティブ制䜜の調敎を担圓しおいたした。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 Tweets by NIFTYDevelopers アンチハラスメントポリシヌ 私たちは䞋蚘のような事柄に関わらずすべおの参加者にずっお安党で歓迎されるような堎を䜜るこずに努めたす。 瀟䌚的あるいは法的な性、性自認、性衚珟倖芋の性、性指向 幎霢、障がい、容姿、䜓栌 人皮、民族、宗教無宗教を含む 技術の遞択 そしお䞋蚘のようなハラスメント行為をいかなる圢であっおも決しお蚱容したせん。 䞍適切な画像、動画、録音の再生性的な画像など 発衚や他のむベントに察する劚害行為 これらに限らない性的嫌がらせ 登壇者、䞻催スタッフもこのポリシヌの察象ずなりたす。 ハラスメント行為をやめるように指瀺された堎合、盎ちに埓うこずが求められたす。ルヌルを守らない参加者は、䞻催者の刀断により、退堎凊分や今埌のむベントに聎講者、登壇者、スタッフずしお関わるこずを犁止したす。 もしハラスメントを受けおいるず感じたり、他の誰かがハラスメントされおいるこずに気が぀いた堎合、たたは他に䜕かお困りのこずがあれば、すぐにご連絡ください。 ※本文章はKotlinFest Code of Conductずしお公開された文章( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )を元に掟生しおいたす。 ※本文章はCreative Commons Zero ラむセンス( https://creativecommons.org/publicdomain/zero/1.0/ ) で公開されおいたす。
2022幎11月2日に  スクラムマスタヌが「チヌムのお母さん」にならないための方法  ずいうタむトルで  women developers summit  に登壇させおいただきたした。 倖郚むベントでは初めおの登壇だったのですが「わかりやすかった」「スクラムをやっおいなくおも参考になった」ずいう意芋もいただけお、登壇しおよかったです。 この蚘事では、登壇で話した内容ず、その補足をしおいきたいず思いたす。 スクラムマスタヌが「チヌムのお母さん」にならないための方法 自己玹介 ニフティでスクラム゚バンゞェリストに任呜されおいる西野銙織ず申したす。 このN1! の䞭で䜿える費甚で、アドバンスド認定スクラムマスタヌも取埗させおもらっおいたす。 写真で掲げおいる本「ニフティのスクラム」PDF版が以䞋から無料DLできたす ニフティのスクラム:ニフティ – 技術曞兞マヌケット 登壇を垌望した背景 今回公募枠で登壇させおもらったのですが、この話をしたいずおもったきっかけは、瀟内スクラムマスタヌの集たりから出た疑問でした。 瀟内にスクラムチヌムが10以䞊 スクラムを導入しおいこうずいう動きが䌚瀟党䜓で高たっおおり、今幎はじめお認定スクラムマスタヌの資栌をずった人も倚いです。 月1のスクラムマスタヌの集たり そういう背景もあっお、ニフティでは、去幎から月1で「スクラムマスタヌ共有䌚」ずいう集たりを開催しおいたす。 そのスクラムマスタヌ共有䌚で「チヌムの自埋をうたく匕き出せない」ずいう話をよく聞きたす。 特に女性のスクラムマスタヌから「たるで自分がチヌムのお母さんのようになっおしたう」ずいう声があがりたした。男性のスクラムマスタヌも共感しおいたした。 たしかに自分も䞀時期「私はお母さんか」ずいう状態になっおしたったこずがありたした。 セッションの察象局 本セッションの察象者は、気を䜿いがちなスクラムマスタヌを想定しおいたす。 スクラムをやっおいなくおも、先茩だずかリヌダヌだずかで、䜕かを教える立堎になった人や、チヌムで開発をした経隓がある人なら共感できる点があるず思いたす。 スクラムマスタヌは責任感が匷いタむプが倚い スクラムマスタヌは、チヌムにひずりしかいない圹割ずいうこずもあっおか、責任感が匷いタむプが倚いなず感じたす。 特に「みんなが困っおいるから」圹割を匕き受けがちな人 あずは、「誰かリヌダヌになっお」ず蚀われたずきに、自分がすすんでリヌダヌをやりたい、ずいうよりは、みんなが困っおいる雰囲気を感じお「じゃあ 」ずリヌダヌになるような、献身的なタむプも倚い印象です。 スクラムマスタヌが抱えがちな悩み ここから垜子を被ったネコがちょくちょくでおきたすが、スクラムマスタヌだず思っおください。 自分がスクラムマスタヌになりたおのころ、お母さんみたいになっおいたずいう状況です。 開発以倖の仕事を䞀手に匕き受けおいる 自分がスクラムマスタヌになりたおのころ「スクラムをやっおいくぞ」ずいう気負いず「でもスクラムマスタヌっお具䜓的になにをやればいいんだろう」ずいう䞍安から、開発以倖の仕事を党郚やる人になっおしたいたした。 チヌムのお母さんみたいになっおしたっおいる ここでいう「お母さん」ずは 誰がやるか明確でない仕事を率先しお匕き受ける これから問題になりそうなこずを先んじお朰す ずいうような、仕事に集䞭しやすい環境を敎えるこずをやる人、を指しおいたす。 お母さん的な状態になるず、なにか問題があるず「ちょっずお母さん  じゃなくおスクラムマスタヌ来お」ず、みんながたずスクラムマスタヌに頌っおしたう、ずいう状態を匕き起こしおしたいたした。 このセッションで䌝えたいこず そういった経隓をふたえお、このセッションでは以䞋の3点を䌝えたいず思いたす。 「よかれず思っお」は危険信号 みんなが働きやすい環境を぀くらなきゃずいう思いから「よかれず思っお」いろいろな仕事を匕き受けるず、どのような悪圱響があるか スクラムマスタヌはなんでも屋さんではない スクラムマスタヌの仕事は、スクラムを回すこず以倖は厳密には定矩されおいないが、そのせいで開発以倖の仕事を党郚やる人ずしお立ち回るず、スクラムマスタヌずしおどうなるか 自分がいなきゃ ずいう欲望からの脱华 このチヌムには自分がいなきゃだめだずいう状況は、ある意味で自己肯定に繋がっおしたうこずがある。そういう執着を手攟すために知るべきこず よかれず思っおは危険信号 スクラムマスタヌになりたおの頃の悩み ずにかくみんなが仕事をしやすい環境を䜜らなくおは  ずいう気持ちから、いろいろな仕事を抱え蟌んでしたっおいたした。 か぀お自分が補䜜や開発をやっおいた頃、差し蟌みや調敎で䜜業が䞭断されおしたうこずにストレスを感じおいたため、チヌムメンバヌにはそういう぀らさを味わっおほしくないずいう思いもありたした。 たた、1-2幎目の人が倚いチヌムだったので、自分はWEB補䜜のディレクションをしたこずはあるが、チヌムメンバヌにはただそういった経隓がないから、自分がやらないずプロゞェクトがうたく回らなくなっおしたうかも、ずいう䞍安もありたした。 すべおスクラムチヌムのために「よかれず思っお」やっおいたこずで、これでチヌムがより良くなるのだろうず信じおいたした。 どんどんチヌムのお母さんになっおいく そうした「よかれお思っお」を぀みかさねおいった結果、どんどん自分のお母さん化が進んでいきたす。 䜕でも屋さん化 毎日目の前に雑務が積み重なっお、スクラムに関する話をチヌムにするこずもどんどん枛っおいきたした。自分は本圓にこれでスクラムマスタヌをやっおいるずいえるのかずいう䞍安も増えおいきたす。 仕事ぞのモチベヌションが䞋がる 「誰がやっおもいいけど、誰かがやらなきゃいけない仕事」の倚くは、明確なアりトプットがないからか達成感も匱く、仕事ぞのモチベヌションが維持しにくくなりたした。 チヌムはそれがスクラムマスタヌの仕事だず思っおしたう チヌムもはじめおスクラムをやっおいる状態なので、自分がそういうふるたいをするこずで、スクラムマスタヌは開発以倖の仕事をする圹割なのだず思われおいたした。 最初から「そういうもの」だず思われおいるず、チヌムが仕事しやすい環境になるよう尜くしおいる぀もりでも、あたり評䟡も感謝もされにくかったです。 お母さんが毎日家事をしお家を敎えおいおも、それがあたり家族から感謝されなくお悲しくなる状態っおこういうこずか  ず思ったりもしたした。 スクラムマスタヌはなんでも屋さん ではない スクラムマスタヌは、スクラムをうたく回しおいくこず以倖に明確にこれをするずいうこずがルヌルずしおないため、なんでも屋さん的になりがちにですが、それは正しい振る舞いでしょうか。 「名前のない仕事」が属人化した匊害 「透明性」がなくなる 「集䞭」はスクラム䟡倀基準のひず぀ですが、みんなが仕事に集䞭できるこずに目を向けすぎお、スクラム3柱の「透明性」が倱われたした。 具䜓的には、プロダクトオヌナヌず開発者の間で行われるべき調敎を、スクラムマスタヌずプロダクトオヌナヌだけに閉じお調敎しおいる状態がありたした。 䜓調䞍良などで2日ほど䌑んでしたったずきに、プロダクトオヌナヌず自分の間で話しおいたこずが開発者に共有されおおらず「このタスクはこの方向性でいいんだっけ」ず珟堎を混乱させおしたうこずもありたした。 チヌムの状態を芋る䜙裕がない 「明日たでに経費申請をしなきゃ」ずか「ナヌザヌから問い合わせが来おたな」ずいうこずをひずりで察応しおいくず、目の前の仕事にばかり意識がむいおしたい、チヌムの進捗状況やチヌムメンバヌに問題がおきおいないかずいうこずにも目を配る機䌚がどんどん枛っおいきたす。 サヌバントリヌダヌシップ献身的だけど   スクラムマスタヌに求められるものずしおサヌバントリヌダヌシップがあげられたす。 献身的なふるたいでチヌムをサポヌトするこずでリヌダヌシップを発揮するずいうもので、自分ずしおはみんながあんたりやりたくない仕事を匕き受けるこずで、献身的にふるたっおいる぀もりでした。しかし消耗するばかりで、なんだかうたくいっおいる感じがしたせん。 このたたのやり方を続けお、チヌムメンバヌが自己管理や自埋ができた状態になっおいくむメヌゞがたったく浮かびたせん。 どこから間違えおしたったのか、あらためおサヌバントリヌダヌシップのあり方に぀いお調べ盎しおみたした。 「献身」の方向性を間違えない 今思えば、献身的にふるたうこずず、犠牲的であるこずを履き違えおいたように思いたす。 チヌムメンバヌに献身するずいうこずは、誰かにずっお面倒なこずを代わりにやるのではなく、チヌムの、その人の成長に身を捧ぐこずです。 スクラムガむドにあるスクラムマスタヌの項目には「支揎」ずいう蚀葉がたくさんでおきたすが、自分がやっおいたこずは、支揎・サポヌトではなくお、代圹や代理でした。 犠牲的なふるたいをやめお、チヌムの成長にフォヌカスするこずで、チヌムの埗意なこずを䌞ばし、苊手なこずを克服するサポヌトをしおいく、本来のスクラムマスタヌずいう圹割に戻れた気がしたす。 デむリヌスクラムのファシリテヌションを分担 絵にあるように、たずはデむリヌスクラムのファシリテヌトからメンバヌに分担しおみたした。 自分がファシリテヌタヌを離れたこずで「カンバンに茉せられなかった䜜業が実はあっお」ずいう感じで、チヌムに察しお盞談をしたかったこずが話せるようになり、チヌムメンバヌも自分達で仕事を管理しおいくずいう意識を持ちやすくなりたした。 成長に察しお向き合っおみたこずで、人に仕事を任せるこずは負担になるこずばかりでなく、孊びや成長に繋がるず実感を持おるようになっおきたした。 あたり過干枉になりすぎず芋守ろう、ずいうこずを自分でも意識的にやるようになりたした。 ファシリテヌションをロヌテ制にした瀟内事䟋 瀟内で行っおいるスクラムマスタヌ共有䌚でも、自分ばかり頑匵っおしたうずか、なかなかチヌムメンバヌの方からアクションを起こしおくれない、ずいった悩みを聞くこずがありたした。 そういう状況の改善策ずしお、デむリヌスクラムのファシリをロヌテ制にしおみるのはどうかずいう提案をしお、実際にうたくいったケヌスが倚いです。 そのずきのスクラムマスタヌ共有䌚には5チヌムぶんのスクラムマスタヌがいたのですが、うち半分以䞊はデむリヌスクラムのファシリテヌトをロヌテヌションする文化が根付いおいたした。 チヌムが成長する機䌚を奪い取らない ここでポむントなのですが、気を遣いがちな人は、仕事を人に任せおみようず蚀われおも、実際行動に移す心のハヌドルが高いず思いたす。なので、「自分がやっおしたうこずで、人が成長する機䌚を奪っおいるかもしれない」ず思うくらいでちょうどいいです。 他埋的な状態 自埋の察矩語ずしお他埋ずいう蚀葉がありたす。自分にルヌルがなく、他人にルヌルを預けおしたっおいる状態です。 「スクラムマスタヌの私がうたくたわさなきゃ」ず気負っおしたうず、チヌムメンバヌに「デむリヌ集たっおください」「リファむンメントしたほうがいい」ずいうような、指瀺をするような話し方、いわゆるティヌチングの状態になりがちです。 これが続くず、チヌムメンバヌはこの堎合、スクラムマスタヌずいう他人にいろいろなルヌルを任せおいる状態になっおしたいたす。 自埋的な状態 チヌムの自埋を匕き出すためにはどうすればいいでしょうか。 自埋は、自分で自分のルヌルを぀くっお動けるこず、自分で自分を管理できおいる状態をさしたす。 「こうしおください」ずは蚀わずに、問いかけや傟聎を䞭心ずしたコヌチングをしお、自分でトラブル察凊できる力を぀けおもらうこずが自埋を匕き出す近道でしょう。 そう考えるず、今たでチヌムメンバヌがハヌドルに躓く前に取り陀いおいたこずは、成長を阻んでいたずもいえたす。 スクラムマスタヌが本圓にやるべき仕事は、ハヌドルを芋぀けおもらうこず、そのハヌドルをどう乗り越えるか考えるきっかけを䞎えるこずです。 ずはいえ、いたたでスクラムマスタヌがやっおしたっおいた仕事をチヌムに任せるのは、ただ仕事が増えるように芋えおしたい、むダがられないか心配ですよね。 そのずきは、チヌムがスクラムをどの皋床掻甚できおいるか、そしお次のフェヌズはどうなっおいくずいいか、ずいう芳点が持おるずいいので、次の章で話しおいきたす。 スクラム掻甚たでの3フェヌズ スクラムが浞透するたでをフェヌズにわけおみたした。 スクラムを導入期、適甚期、掻甚期の3フェヌズにわけたずしたら、この3フェヌズのなかで、スクラムマスタヌはティヌチングずコヌチングの割合を倉えおいく必芁がありたす。 導入期 チヌムがスクラムずいうルヌルの把握ができるたでです。 この期間は、スクラムずはこういうものであるず指瀺したり教えたりする、ティヌチングの割合が倚くなりたす。ここは倚少、面倒芋のいいお母さん的な振る舞いでも問題ないず思いたす。 適甚期 スクラムむベントに慣れ出しお、スプリントごずにリリヌスも出せるようになっおきた時期です。 適甚期は「スクラムをやっおいる」状態ですが、チヌムや組織が抱える問題解決のために「スクラムを掻甚できおいる」状態になるこずを目指した方がいい状態です。 適甚期〜掻甚期 この時期は、ティヌチングの割合を䞋げおコヌチングの割合を増やしおいくずいいでしょう。お母さん的な振る舞いをやめお、スクラムにおけるコヌチや垫匠のような振る舞いに倉化しおいきたす。 スクラムを孊び始めた頃、スクラムマスタヌは、スクラムを確立させるこず以倖に明確にこれをやれずいうルヌルがないのは困るなず思っおいたのですが、スクラムの適甚床合いやチヌムの様子をみお、どう振舞うずいいかを垞に倉えおいく必芁があるから、厳密な定矩がないのだず改めおわかりたした。 この適甚期から掻甚期に移行するための取り組みずしお、スクラムマスタヌだけがやっおいた仕事をチヌムに分担しおいくずいいです。 チヌムメンバヌには「スクラムがたわっおきたので、より䞊のフェヌズにいく」ずいうような説明をあらかじめしおおくず良いでしょう。たずはファシリテヌションやスクラムむベントの準備・調敎などの仕事から分担しお、自分達でスクラムをたわしおいくずいう意識を持ちやすくしたす。 现かい仕事やチヌム内倖の調敎なども「誰かがスクラムマスタヌがやっおくれるだろう」ずいうマむンドから「私たちがやっおいくためにはどうすればいいか」ずいうマむンドに倉わっおいけるように導く必芁がありたす。 スクラムマスタヌだけができる仕事を無くしおいく スクラムマスタヌだけができる仕事はルヌル䞊ないはずですが、さきほど述べたスクラム導入期〜適応期のスクラムマスタヌは、自分だけがやりがちな仕事を持っおいるこずが倚いず思いたす。 チヌムメンバヌにスクラムを回すこずから任せおいく 最初にスクラムチヌムに任せおみるこずずしお、スクラムむベントのファシリテヌト、特にデむリヌスクラムがおすすめずいう話をしたした。 ほか、開発倖の誰がやるか決たっおない仕事をもしスクラムマスタヌだけがやっおいたなら、少しず぀チヌムに戻しおいきたしょう。フォロヌはしおもいいですが、それをやる機䌚をチヌムから奪っおはいけないず基本的に考えたす。 仕事しやすい環境を自分たちで䜜れるようにするこずが、チヌムの自埋に必芁なこずです。 任せた最初は開発が停滞しうたくいかないこずもあるかもしれたせんが、それ自䜓はあたり問題ではありたせん。私たちスクラムマスタヌが本圓にやるべき仕事は、チヌムの成長を促すこずです。 チヌムメンバヌが䞍埗意な仕事を代わりにやるのは、過干枉なお母さんになっおしたいたす。 こういった仕事をどうしたらうたくいくようにできるか、自分の経隓をもずにコヌチしおいくこずが、本来のスクラムマスタヌの圹割・責任ずいえたす。 スクラムマスタヌがいる意味なくなっちゃう こうしお埐々にスクラムマスタヌが実務を手攟しおいくず、最初のうちはコヌチングするこずも倚いのですが、だんだん自分がスクラムをたわすために頑匵る必芁が枛っおいきたす。 チヌムの自埋を考えるず本来は良いこずですが、自分はなんのためにこのチヌムにいるのだろうずいう気持ちになっおしたうこずもあるかもしれたせん。実際問題ずしお、自分は䞍安な時期がありたした。 自分がいなきゃ ずいう欲望からの脱华 そういえば新入瀟員のころに、瀟内報になりたい将来像をずいうのを曞かされたこずを思い出したした。 頌られる人になりたい、唯䞀無二の人になりたいず曞く人がずおも倚いです。人間だれしも、幎代問わず、人に必芁ずされたいずいう欲求があるず思いたす。 仕事でもなんでも「あなたがいおよかった」っお蚀われるず、うれしいですよね。 ただ「君がいないず困る」たでくるず、スクラムチヌムずしおはおそらく健党ではない状態です。 スクラムマスタヌはなぜ1人なのか 「君がいないず困る」状態は健党ずはいえたせんが、実際問題ずしお、スクラムマスタヌは䞀人しかいたせん。 やっぱり、スクラムマスタヌの自分がいないず困るのでは  ずなりそうですが、スクラムマスタヌがいないこずず、私個人がいないず困る状態は違いたす。 スクラムをうたく回すテクニックや芳点そのものは、個人に属人化させずに、チヌムに共有しおいくべきです。 スクラムマスタヌがチヌムに1人しかいない理由は スクラムマスタヌが誰かに感情や意芋をひっぱられない䞭立的な立堎をずるため 開発者にもプロダクトオヌナヌにも属さないポゞションの人がチヌムにひずりいるこずで、察立を防ぐ ずいう圹割もあるず思いたす。 自分もスクラム導入初期に開発ずスクラムマスタヌを兌任しおいた時期もありたしたが、スクラムマスタヌ専任になっお少し離れた芖点からチヌムをみおみるず、いたたで開発者からの意芋ばかり聞いおいたかもずか、プロダクトオヌナヌがスクラムチヌムからやや浮いおいる状態かもしれないなど、スクラムずしお䞍健党な状態が芋えやすくなりたす。 スクラムマスタヌはいないず困るかもしれたせんが、スクラムマスタヌをやっおいるその個人がいないず困る状態にする必芁はありたせん。 スクラムマスタヌが、スクラムを支揎する範囲 でも、スクラムマスタヌが、自分のチヌムのスクラムをたわすために頑匵る必芁が枛っおきたずいうこずは、本圓にスクラムマスタヌずしおの仕事が枛っおきたこずずむコヌルでしょうか。 ここでスクラムマスタヌはそもそもどんな圹割だったか、スクラムガむドを読み返しおみたしょう。 スクラムマスタヌがスクラムを支揎する範囲ですが、スクラムマスタヌは、プロダクトオヌナヌ、開発者ずいったスクラムチヌムに察しおのみ、スクラムの支揎をするわけではありたせんでした。 スクラムガむドには スクラムマスタヌは、スクラムチヌムず、より倧きな組織に奉仕する真のリヌダヌである スクラムガむド – ScrumGuide ず曞かれおいたす。 スクラムチヌムが健党にスクラムを回せるようになっおきたずしおも、組織単䜍だずどうでしょうか。 スクラムが組織に十分に浞透しおいるずいえる状態になるたで、私たちスクラムマスタヌの仕事は終わりたせん。 スクラムマスタヌずはなにか 最埌に、スクラムマスタヌずは䞀䜓なんなのか、その目指すずころを考えおみたす。 盎蚳するず、スクラムの先生や、垫匠ずいう意味が䞀番近いように思いたす。 スクラムマスタヌは、スクラムの理解ず教え方を極めるポゞションです。 そのため、スクラムマスタヌがやっおいたファシリテヌションや、スクラムのノりハりをどれだけチヌムに䌝授したずしおも、組織にスクラムをひろめる仕事がありたす。 なので、今の自分がスクラムに぀いおわかっおいるこずをチヌムメンバヌに䌝えおも「自分はスクラムをマスタヌした」さらに「組織党員がスクラムをマスタヌした」ずいえるようになるたでは、スクラムに぀いお孊ぶこずはただただありたす。 さらに、自分のチヌムが䞖界䞀のチヌム、自分の組織が䞖界䞀の組織になるたでは、私たちスクラムマスタヌの仕事は終わりたせん。 たずめ 「よかれず思っお」の先回りは危険信号です 信じお・任せお・フォロヌ/コヌチするこずが本圓のスクラムマスタヌの仕事ではないでしょうか。 スクラムマスタヌはなんでも屋さんではありたせん スクラムマスタヌは、スクラムの浞透フェヌズに合わせお振る舞いを倉えおいきたす。 䜕かを任せないずいう刀断は、他者の成長の機䌚を奪っおいるのず同じこずです。 自分がいなきゃ ずいう欲望から脱华したしょう 先生、垫匠ずしお䞀歩䞋がっお、チヌムの成長を芋守りたしょう。 チヌムの成長の次は、組織におけるスクラムの成長をサポヌトしおいく仕事もありたす。   ニフティ有志によるスクラム本無料配垃䞭 自己玹介のずきに軜く觊れたしたが、スクラムがうたく行った話、うたくいかなかったけど頑匵った話、さたざたなニフティのスクラム話が茉っおいたす。 無料ですので技術曞兞のサむトからDLしおみおください。 ニフティのスクラム:ニフティ – 技術曞兞マヌケット   We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめに こんにちは。入䌚システムチヌム高畑ず申したす。 ニフティでは打ち合わせ等にGoogle Meetを䜿甚しおいたす。Google Meetで打ち合わせ開始時に誰がいお誰がいないのか、党員参加しおいるかを確認する時間が発生しおしたうため、今回は予め䜜成したリストからMeet画面に出垭しおいない人を衚瀺するChrome拡匵機胜を䜜成したした。 Google Meetでは 出垭機胜 が提䟛されおおりGoogleカレンダヌの参加者情報を元に出垭状況を確認できたす。しかし、Googleカレンダヌに玐付いおいなかったり、耇数の䌚議でURLを䜿いたわしたりしおいる堎合には、Googleカレンダヌの参加者リストずは別管理で誰がいないかを確認したい堎合があるため拡匵機胜の䜜成に至りたした。 拡匵機胜開発抂芁 Chrome拡匵機胜はHTML/CSS/Javascriptの知識があれば簡単に䜜成するこずができたす。 ディレクトリにmanifest.jsonずいう名前の拡匵機胜の蚭定ファむルずHTML/CSS/JavaScript、画像等を配眮し、zipにたずめれば完成です。manifest.jsonは以䞋のように拡匵機胜の名前や画面右䞊のアむコンクリック時にポップアップ衚瀺するHTMLファむル名、アむコン画像のファむル名等を指定したす。 ポップアップ以倖にも蚭定次第で今タブで開いおいるペヌゞにJavaScriptを远加し内容を曞き換えたり、バックグラりンドでJavaScriptを実行したりできるため、翻蚳やブックマヌク等さたざたな甚途に掻甚できたす。 { "manifest_version": 3, "name": "名前", "version": "0.0.1", "description": "誰が居ないかを通知する拡匵機胜。", "action": { "default_popup": "ポップアップずしお衚瀺したいHTMLファむル名" }, "icons": { "128": "アむコンファむル名" }, } この拡匵機胜でできるこず この拡匵機胜ではMeetの参加者から予め䜜成したメンバヌリストに存圚しない参加者をリスト衚瀺したす。 Meetを開いおいる際に拡匵機胜のアむコンをクリックしメンバヌリストを入力したす。 その埌、「䞍圚確認」ボタンをクリックするこずで、MeetのHTMLをパヌスしお埗た出垭者のリストず入力したメンバヌリストを照合し、出垭しおいない人のリストを衚瀺したす。 メンバヌリストはMeetのURL毎にロヌカルストレヌゞに管理しおいるため、別のMeetのURLでは別のメンバヌリストを持たせるこずができたす。 オプション画面からMeetのURLごずの蚭定状況を確認できたす。䞍芁な蚭定はこのペヌゞで削陀するこずができたす。 拡匵機胜を䜿いたい Chrome拡匵機胜ずしお配垃しおいたせんが、゜ヌスコヌドを配垃しおいたすのでデベロッパヌモヌドずしお導入するこずができたす。導入方法の詳现は以䞋URLを参照ください。 https://github.com/octop162/dareinai 実珟方法 拡匵機胜の玹介は以䞊ですが、ここからは実装方法のデヌタ受け枡し郚分に぀いお説明したす。デヌタの受け枡し郚分以倖はHTML/CSS/JavaScriptでの開発のため通垞のWebペヌゞず倧差ありたせん。 Chrome拡匵機胜には3通りのJavaScriptを圓おるこずができたす。 default_popup Chrome右䞊アむコンから衚瀺される小さい画面に圓おるJavaScript content_scripts タブで開いおいるペヌゞのHTMLに圓おるJavaScript background 開いおいるペヌゞずは別にバックグラりンドで動䜜するJavaScript 今回は画面右䞊に衚瀺する小さい画面にタブのMeet画面で衚瀺しおいる内容をもずにしたリストを衚瀺したいため、default_popupずcontent_scriptsの間でデヌタのやり取りをする必芁がありたす。default_popupの画面からMeetのDOMを盎接参照するこずはできたせん。 default_popupずcontent_scriptsの間でデヌタのやり取りをするためにはchrome.tabs.sendMessageを䜿甚するこずができたす 参考 。ここではボタンクリック時に{ action: “GET_MEMBERS” }を付加しおメッセヌゞを送信しおいたす、結果は非同期で指定した関数ここではshowAbsentees関数にコヌルバックされたす。 // popup.js // 䞍圚確認クリック時にmeetのDOMから珟参加者を取埗する $("#confirm").on("click", function () { chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => { chrome.tabs.sendMessage(tabs[0].id, { action: "GET_MEMBERS" }, showAbsentees); }); }); 送信されたメッセヌゞはchrome.runtime.onMessage.addListenerで受け取るこずができたす。受け取った{ action: “GET_MEMBERS” }を元にしお凊理内容を刀別し、sendResponseに返したいオブゞェクトを入れるず元のJavaScriptにコヌルバックされたす。 // content.js /** * ポップアップからメッセヌゞを受け取り、メンバヌリストを配列ずしお返す * HTML構造が倉化した堎合ここのセレクタを修正する */ chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { if (message.action === "GET_MEMBERS") { switch (message.action) { case "GET_MEMBERS": let members = document.querySelectorAll( "div[role='list'] > div[role='listitem'] > div > div > div > span:first-child" ); sendResponse(Object.values(members).map((member) => member.textContent)); return true; } } }); これで珟圚の参加者を配列ずしお受けずれたすので、あずは元のJavaScriptで照合すれば今回実珟したかった䞍圚者のリストを䜜成するこずができたした。 感想ず展望 Chrome拡匵機胜はデヌタの受け枡し郚分以倖は通垞のHTML/CSS/JavaScriptの範囲で実装できるためそこたで倧倉でなく、日々のちょっずした䞍満の解決策ずしおずおも䟿利に感じたした。 今回はjQueryでサクっず䜜成しおしたいたしたが、HTMLの生成郚分等が読みづらい箇所があるため、React.jsで曞き盎したいです。たた、機胜拡匵ずしおは欠垭者が衚瀺されるだけで本日お䌑みなのかたたたた䞍圚なのか刀別できないため状況確認できるようになるず尚良くなるず思いたした。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす 第6回目のテヌマは「ニフティのスクラム」執筆者が語る 〜スクラムぶっちゃけ話〜。珟圚、ニフティでは9人の認定スクラムマスタヌが圚籍しおおり、倚数のチヌムでスクラムを実践しおいたす。 今回は、先日行われた技術曞兞13にお頒垃した「ニフティのスクラム」に぀いお、執筆者によるLTず察談を頒垃たでの裏話を亀えながら語りたす。 「ニフティのスクラム」は↓から無料でダりンロヌドできたす。   https://techbookfest.org/product/i99SVfgSGa1uSTwcez6H4Y?productVariantID=e3ivMhH8PXCWbtj3VdpiEi 抂芁 日皋10月27日朚12:00〜13:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 YouTube Liveにお配信いたしたす。 connpass にお登録をお願いいたしたす。YouTube LiveのURLは決定埌、connpass内の参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ スクラムに興味がある方、携わっおいる方 悩めるスクラムマスタヌ 他瀟のぶっちゃけ話が知りたい方 ニフティの開発スタむルに興味がある方 タむムテヌブル 時間 コンテンツ 12:05-12:10 オヌプニング䌚瀟玹介 12:10-12:15 登壇者玹介 12:15-12:30 LTx3 12:30-12:55 【察談】スクラム䞀問䞀答 12:55-13:00 クロヌゞング テヌマ 【察談】スクラム䞀問䞀答 ではこんな話をしたす。 システムを熟知しおいる人の負担が倧きくなりがちだけどどうしおる よかったレトロスペクティブある 今のプロダクトオヌナヌにどうやっお暩限を持たせるこずができたしたか スクラムやっおおよかった゚ピ゜ヌド・スクラムやっおお䞀番しんどかった゚ピ゜ヌド 登壇者プロフィヌル 西野 銙織登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第開発チヌム ニフティのスペシャリストを任呜するN1!制床にお、スクラム゚ノァンゞェリストを担圓しおいたす。 2019幎〜スクラムマスタヌずしお、ニフティぞのスクラム導入を開始。 8チヌム、゚ンゞニア玄30名以䞊に察しスクラム導入を支揎しおいたす。 アドバンスド認定スクラムマスタヌA-CSM資栌所持。 技術曞兞では「ニフティのスクラム」の線集・レむアりトず䞀郚執筆をしたした。 畑谷 啓志登壇者 ニフティ株匏䌚瀟 䌚員システムグルヌプ 第開発チヌム ニフティのオプションサヌビス党般の開発リヌダヌ、スクラムマスタヌ兌任。スクラムチヌムの立ち䞊げから解散たでの経隓を持぀。認定スクラムマスタヌ保持者。 小浊 由䜳登壇者 ニフティ株匏䌚瀟 むンフラシステムグルヌプ 瀟内情報システムチヌム ニフティの情シス担圓者です。䞻にプラットフォヌム、アプリケヌションの瀟内システムを担圓するチヌムのサブリヌダヌ兌スクラムマスタヌで、技術曞兞では情シスのスクラムに぀いお曞きたした。昚幎末に認定スクラムマスタヌを取埗しおいたす。NIFTY Tech Talk、NIFTY Tech Dayを始め、瀟内倖のむベントを䌁画したりもしおいるニフティのにぎやかしです。 高田 枉ファシリテヌタ ニフティ株匏䌚瀟 基幹システムグルヌプ 入䌚システムチヌム ニフティの基幹業務システムのサブリヌダヌ兌スクラムマスタヌを担圓しおいたす。 2021幎12月に認定スクラムマスタヌ資栌を取埗したした。 技術曞兞では、「ビゞネス郚門ずの二人䞉脚」のテヌマを執筆。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 Tweets by NIFTYDevelopers 「NIFTY Tech Day 2022」を開催したす 技術むベント「NIFTY Tech Day 2022」を11月22日火に開催したす。 本むベントに事前参加登録いただき、事埌アンケヌトに回答いただいた方の䞭から抜遞で100名様に圓瀟ポむントサヌビス「ニフティポむントクラブ」のポむント3,000ポむントをプレれントしたす。 NIFTY Tech Day 2022 アンチハラスメントポリシヌ 私たちは䞋蚘のような事柄に関わらずすべおの参加者にずっお安党で歓迎されるような堎を䜜るこずに努めたす。 瀟䌚的あるいは法的な性、性自認、性衚珟倖芋の性、性指向 幎霢、障がい、容姿、䜓栌 人皮、民族、宗教無宗教を含む 技術の遞択 そしお䞋蚘のようなハラスメント行為をいかなる圢であっおも決しお蚱容したせん。 䞍適切な画像、動画、録音の再生性的な画像など 発衚や他のむベントに察する劚害行為 これらに限らない性的嫌がらせ 登壇者、䞻催スタッフもこのポリシヌの察象ずなりたす。 ハラスメント行為をやめるように指瀺された堎合、盎ちに埓うこずが求められたす。ルヌルを守らない参加者は、䞻催者の刀断により、退堎凊分や今埌のむベントに聎講者、登壇者、スタッフずしお関わるこずを犁止したす。 もしハラスメントを受けおいるず感じたり、他の誰かがハラスメントされおいるこずに気が぀いた堎合、たたは他に䜕かお困りのこずがあれば、すぐにご連絡ください。 ※本文章はKotlinFest Code of Conductずしお公開された文章( https://github.com/KotlinFest/KotlinFest2018/blob/master/CODE-OF-CONDUCT.md )を元に掟生しおいたす。 ※本文章はCreative Commons Zero ラむセンス( https://creativecommons.org/publicdomain/zero/1.0/ ) で公開されおいたす。
抂芁 サヌビス開始から35幎、ニフティは垞に技術者やIT技術ず共にありたした。 高い奜奇心で新しい技術トレンドをいち早く導入し、システムやサヌビスぞの掻甚を垞に暡玢しおいたす。ニフティが創業時から倉わらないのは、奜奇心ず挑戊し続けるこず。 この”NIFTY Tech Day”を通じお、私たちの今ず未来をお䌝えしたす。 詳现 公匏サむト 日皋 11月22日火13:00〜18:00 配信URL 準備次第掲茉いたしたす 芖聎環境 むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 connpass にお参加登録を受け付けおいたす。 たたむベント参加登録時にぜひTwitter投皿をお願いしたす タむムテヌブル 時間 セッション 13:00-13:20 キヌノヌト 13:20-13:45 ゲストセッション 13:45-14:10 スクラムのハヌドルの越え方〜リリヌス数を1.5倍にするたで〜 14:10-14:35 耇数プロダクトを抱えお行うスクラム開発のこれたでずこれから 14:40-15:05 クリヌンアヌキテクチャはこの3幎間で私たちのチヌムに䜕をもたらしたのか 15:05-15:30 なぜニフティはLeSSを遞んだのか。 @nifty MAX光における倧芏暡スクラム開発䜓隓談 15:35-16:00 若手゚ンゞニアによるリモヌトワヌク支揎ツヌルの開発 ①AWS/GCPずSlackを駆䜿したオフィスの固定電話廃止ぞの取り組み ②オンラむン䌚議を盛り䞊げる音声リアクションツヌル「もじこえ」の開発 16:00-16:25 安心・安党な@niftyメヌルサヌビスの裏偎 16:30-16:55 セシヌル事業におけるモノリシックアヌキテクチャずの向き合い方 16:55-17:20 CI/CDを導入しお倉わったモバむルアプリ開発䜓制 17:20-17:45 深局自然蚀語凊理によるニュヌス蚘事芁玄の手法ず実装 17:45-18:00 クロヌゞング アンケヌト懇芪䌚ご案内 各セッションの詳现に぀きたしおは公匏サむトをご芧ください。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です ニフティ株匏䌚瀟 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティラむフスタむル株匏䌚瀟 想像以䞊を、み぀けよう。 をコヌポレヌトメッセヌゞに、“䞀人ひずり”のラむフスタむルを䟿利で豊かにするため、ニフティラむフスタむルの゚ンゞニアは日々開発をしおいたす。 採甚情報 や ニフティラむフスタむル Tech Blog をご芧ください。 ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 https://twitter.com/NIFTYDevelopers