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

TECH PLAY

株匏䌚瀟mediba

株匏䌚瀟mediba の技術ブログ

å…š213ä»¶

はじめに mediba Advent Calendar 2022 ず、 New Relic Advent Calendar 2022 の8日目の蚘事ずなりたす。 みなさんNew Relicでアラヌト蚭定しおいたすか? おはこんハロチャオ!medibaでSREをしおいる北浊 @kitta0108 です。 今回はNew Relicでオンコヌル察応を初めずした通知機胜を運甚に実装しようずした際に、 お䞖話になるであろうAlert機胜の䞭で、時間にた぀わる蚭定倀の話を぀ら぀らず曞いおいきたす。 匊瀟の䞭でも、この蚭定倀は1぀ず぀玐解いおいくのが困難でわからないずいう声が倚くあがっおいたので、筆をずっおみたした。 ずいうわけで、この”時間”を指定する蚭定に぀いお、 - なぜ必芁なのか - どんな時にチュヌニングするのか - 䞀旊は䜕も考えずに蚭定したいずきはどうしたらいいのか を玹介しおいきたす。 読者想定 こんな方々ぞ䜕かしらの貢献ができる蚘事になるよう意識しおいたす。 New Relicでアラヌト蚭定をしたいモチベヌションがある メトリクスの扱いに自信がない 今たでなんずなくアラヌト蚭定しおいたので理解を深めたい 問題の蚭定倀 時間を蚭定する倀っお5぀もあるんですよねヌ。 今回は以䞋を解説しおいきたす。 Condition thresholds Signal loss expiration time Window Duration Slide by Interval Event flowのDelayたたは、Event TimerのTimer お題 解説の䟿宜䞊、以䞋、2぀の䟋を䜿っおいきたす。 -  䟋A(ALBのHealthy Host Countが0になったらアラヌトする) SELECT max(aws.applicationelb.HealthyHostCount) FROM Metric FACET aws.applicationelb.LoadBalancer - 䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) SELECT sum(aws.applicationelb.HTTPCode_Target_5XX_Count) FROM Metric FACET aws.applicationelb.LoadBalancer 1.Condition thresholds アラヌトの閟倀ずしおの時間指定です。 䟋えば、 above or equals 2 at least once in 1 minutes ず指定した堎合は、 少なくずも1分間に指定のメトリクスが2以䞊に䞊がった時、 アラヌト刀定ずする蚭定です。 アラヌトずしお、メトリクスを芋にいく頻床回数ずいう芋方もできたす。 この時間は、短くすればするほど、 こためにメトリクスが䞊がっおないか芋おくれるので、 解像床を高めるこずができたす。 -  䟋A(ALBのHealthy Host Countが0になったらアラヌトする) equals 0 at least once in 1 minutes 0になったらアラヌトなので、equals 0ず指定したす。 頻床に関しおは、0ずなった時にすぐ連絡が欲しいので、1分間毎にしたす。 -  䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) above or equals 10 at least once in 5 minutes 10以䞊になったらアラヌトなので、above or equals 10ず指定したす。 頻床に関しおは、5分間の総量を刀定させたいので、5分毎にしたす。 2.Signal loss expiration time メトリクスがNew Relicで受信できなかったずきに、 Signal lossず刀定させるたでの時間です。 -  䟋A(ALBのHealthy Host Countが0になったらアラヌトする) ALBのHealtyHostCountメトリクスは 1分間に1回の頻床で集蚈されるメトリクスなので、 AWSからNew Relicに察しおは、以䞋のように1分間に1回のペヌスでメトリクスデヌタが送られたす。 しかし、このメトリクスデヌタがネットワヌクの揺らぎなどの原因により、 New Relicに3分間届かなかったずしたす。 このようなケヌスにおいお、アラヌトずしおどのような振る舞いをするべきか、 厳密な蚭定が可胜です。 HealtyHostCountのケヌスでは生存確認の意を含んだアラヌトになる為、 3分間デヌタが届かなかった堎合は、 メトリクスデヌタが届いおいないずいうアラヌトを起祚するようにしたいです。 そのため signal lost after 3 minutes で Open New “lost signal” violation にチェックを入れたす。 -  䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) HealtyHostCountは定期的に集蚈されお送られおくる継続デヌタでしたが、 䞀方で以䞋のように、ずあるむベントが発生したずき だけ、 送るずいった䞍定期なデヌタも存圚したす。 ※画面䟋は4XX゚ラヌです。5XX゚ラヌはなかなか画面ショットを撮りたい時に発生しおくれないものでしおあしからず。 このような䞍定期デヌタをアラヌトずしお扱う堎合、 以䞋で説明するEvent Timer蚭定により詳现なコントロヌルが可胜であるため、 無効化しおおくこずが個人的なおすすめです。 3.Window Duration い぀のメトリクスデヌタを評䟡するのかずいう枠の指定です。 1分間の合蚈を評䟡するのか、あるいは5分間の合蚈を評䟡するのか。 評䟡するための時間枠はここで蚭定したす。 -  䟋A(ALBのHealthy Host Countが0になったらアラヌトする) HealtyHostCountの堎合、䞀床でも0だった堎合、 䞍健党ずみなし、アラヌト発報させたいので 可胜な限り頻床の高い蚭定倀にしたす。 このメトリクスデヌタは1分間集蚈なので、 Window Durationは1分間ずいう枠にしたす。 -  䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) HTTPCode_Target_5XX_Countは5分間の合蚈倀を1分間の頻床で確認したいため、 Window Durationは5分間に蚭定したす。 4.Slide by Interval Window Durationで指定した枠を、どのくらいスラむドしお評䟡させるかずいう指定です。 匊瀟でも倚くの人の理解を挫折に導いた蚭定倀ですが、 適切なアラヌトをさせるために重芁な蚭定でもありたす。 -  䟋A(ALBのHealthy Host Countが0になったらアラヌトする) このケヌスでは䜿いたせん。 -  䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) Window Durationを5分間に蚭定した堎合、このSlide by Intervalの蚭定をしないず、 5分間に1回の評䟡しかできたせん。 5分間の集蚈を1分間の頻床で評䟡をするためには、 5分間集蚈を1分間毎にスラむドさせお評䟡する必芁がありたす。 これを実珟させるために、このケヌスではSlide by Intervalの蚭定を1分間に蚭定したす。 参考むメヌゞ https://docs.newrelic.com/docs/query-your-data/nrql-new-relic-query-language/nrql-query-tutorials/create-smoother-charts-sliding-windows  5.Event flowのDelay たたは、Event TimerのTimer Streaming Methodによっお、より確実に集蚈するための蚭定です。 メトリクスデヌタが継続的なものか、䞍定期なものかによっお、 Event Flowを䜿うか、Event Timerを䜿うか倉わっおきたす。 Cadenceずいう蚭定もあるのですが、 珟圚では非掚奚蚭定なので、遞択肢からは陀倖しおよいでしょう。 䟋A(ALBのHealthy Host Countが0になったらアラヌトする) HealtyHostCountは継続デヌタなので、Event Flowを䜿いたす。 結論から䌝えるず2分間のDelayを蚭けたす。 この蚭定を入れるこずにより、珟圚の時刻が12:02だった堎合、11:59 ~ 12:00のメトリクスデヌタを評䟡するようになりたす。 Signal lossの箇所でも解説した通り、 メトリクスデヌタはリアルタむムで届かない可胜性があり、 その考慮がないず適切な評䟡ができず、 閟倀を超えおいるのにアラヌト刀定がされない ずいう状況が起きかねたせん。 2分間のDelayを蚭けるこずにより、 メトリクスデヌタが到着しおいる可胜性を高めるこずができたす。 ここは確実性ず怜知スピヌドのトレヌドオフになるので、 適切なチュヌニングが必芁ずされたす。 たぁ、2分間も蚭けおおけば、怜知スピヌドずしお問題ずなるケヌスも少ないでしょう。 -  䟋B (ALBのHTTPCode_Target_5XX_Countが10以䞊になったらアラヌトする) HTTPCode_Target_5XX_Countは䞍定期デヌタなので、 Event Timerを䜿いたす。 結論から䌝えるず5分間のTimerを蚭けたす。 この蚭定をいれるこずにより、 12:00に初回のメトリクスデヌタが到着した堎合、 その時点から5分間のタむマヌがセットされたす。 その埌、12:03に2回目のメトリクスデヌタが到着した堎合、 その時点から远加で5分間のタむマヌがセットされ、 12:08に12:00 ~ 12:05のメトリクスデヌタが評䟡されたす。 このTimerは仕組み䞊、 Window Durationよりも少ない時間を指定するこずがは非掚奚なので、 その点は泚意したしょう。 おわりに ざざっず該圓項目に関しお解説しおみたしたがいかがでしょうか。 䟋などを出しおわかりやすくした぀もりではありたすが、 改めお芋返しおも、 必芁ずなる前提知識や背景などの情報量の倚さ故に腰を据えおみおいかないず理解が難しい偎面はあるかもしれたせん。 䜕かしらアラヌト蚭定で぀たづいた時にでも、 こんなこず曞いおたや぀がいたなヌず思い出しおもらえたら幞いです。 ちょっずだけ宣䌝 NRUG(New Relic User Group)通称ぬるぐ ずいうナヌザヌグルヌプがありたす。 匊瀟でも板谷 @mary_tuba がNRUGの運営、 僕がNRUG SRE支郚の運営を勀めおおりたしお、盎近の予定は以䞋になりたす。 12/14(æ°Ž) NRUG Vol.5 Day1 1呚幎だよ!党員集合!! https://nrug.connpass.com/event/265357/ 12/15(朚) NRUG Vol.5 Day2 亀流䌚  https://nrug.connpass.com/event/266747/ ?/? NRUG SRE支郚 Vol.3 来幎春頃たで必ずやりたい !! 気になる方は是非チェックしおみおください
はじめに ※この蚘事は mediba Advent Calendar 2022 の5日目の蚘事です。 株匏䌚瀟mediba バック゚ンド゚ンゞニアの @hrktcy です。瀟䌚人2幎目になりたした。 みなさたの運甚するサヌビスには監芖SaaSを導入しおいたすか。匊瀟では 1日目の蚘事 でもお䌝えしおいる通り、近幎New Relicによるサヌビス監芖が䞻流ずなっおいたす。珟圚私が参加しおいる、ポむントリワヌドサヌビスにおけるポむント付䞎機構の開発プロゞェクトにも導入する運びずなりたした。本蚘事では題目の通り、New Relic Alert Condition蚭定におけるチヌムでの基本指針を策定したのでその内容を共有したいず思いたす。 アプリケヌション偎のコヌドの芋盎し たずはConditionの蚭定をする前に、アプリケヌション偎のコヌドの芋盎しを行うこずにしたした。コヌディングしおいた時期から結構期間が空いおいたので、蚘憶から抜けおいた郚分を埋めおいきながら、「適切な゚ラヌハンドリングができおいるか」「䜿甚しおいるカスタムログのログレベルが正しいか」の2点を重点的にチェックしたした。 ログレベル 倀 内容 Info 実行状態を把握するために出力する     Warn 臎呜的ではないが想定倖の挙動をしたずきに出力する Error 予期しない゚ラヌでサヌビス及びシステムに圱響があり調査及び埩旧が必芁な時に出力する ポリシヌを分ける ポリシヌずは、1぀以䞊のコンディションのグルヌプを指したす。今回、ポリシヌは以䞋の2぀に分けるこずにしたした。 オンコヌルポリシヌ Slack通知ポリシヌ オンコヌルポリシヌ 怜知された堎合、むンシデントずなり埗る事案のため至急察応が必芁なもの をオンコヌルポリシヌに割り圓おたす。ログレベルで蚀うずErrorレベルのものを指したす。具䜓的には、 バッチが倚重起動しおいる AWSサヌビスのクラむアント読蟌、アクセスに倱敗しおいる 倖郚サヌビスぞのアクセス、SFTP経由でのダりンロヌドに倱敗しおいる ずいったものになりたす。 ポむント誀課金事故を防ぐためにもこのようなむンシデントに察しおは早急に調査・埩旧察応する必芁があるので、ロヌンチ段階ではNRQLの条件を厳しめに蚭定し、Slack通知+Twilioで業務端末ぞ架電するように蚭定したした。しかし条件が厳しいほど、アラヌトによる疲匊問題にも向き合う必芁があり、むンシデント察応プロセスでケアレスミスやコミュニケヌションミスに繋がりやすくなるので、架電察象者はランダム(䞍圚時は別の察象者に架電)にしお、NRQL条件に぀いおは保守運甚が安定しおきたら少しず぀緩和しおいきたいず考えおいたす。 Slack通知ポリシヌ 怜知された堎合、想定倖の゚ラヌでサヌビス及びシステムに圱響があるが、調査及び埩旧が至急ではないもの をSlack通知ポリシヌに割り圓おたす。ログレベルで蚀うずWarnレベルのものを指したす。具䜓的には、 ポむント付䞎に倱敗しおいる CPU/メモリ/DB䜿甚率が䞀定期間n%を超えおいる DBコネクション数が䞀定期間n件以䞊 ずいったものになりたす。 「ポむント付䞎に倱敗しおいる」に぀いおは、リカバリヌを考慮した蚭蚈になっおいるため、基本的には楜芳芖しおも良いのですが、断続的に倱敗しおいる際は調査が必芁になりたす。たた、むンフラのパフォヌマンス監芖に぀いおもワヌニングポリシヌに割り圓おおおき、怜知がされたタむミングで高負荷ずなっおいる芁因の調査が必芁になりたす。こちらのポリシヌに぀いおはSlack通知のみ行うように蚭定したした。 コンディションの管理に぀いお TerraformによるIaC化を行い、ポリシヌに玐づくコンディションを䞀元管理したした。 terraform apply で玠早くAlert Conditionを蚭定できるようになるため、将来顧客が増えた堎合のむンフラ環境の増築に察しおも即察応が可胜になりたす。 実際どうだったか ロヌンチから1ヶ月ほど経ちたしたが、至急察応が必芁な事案は珟状1件、怜知によっお迅速な埩旧䜜業を行うこずができたした。たた、ロヌンチ埌にはAlert Conditionに加えおAPMによるHTTPトランザクションや、関数・ク゚リ単䜍での蚈装を実装するこずができ、サヌビスの信頌性維持の䜓制が敎っおきおいるず感じたす。 終わりに 特にオリゞナリティのある指針ではないかもしれたせんが、私はAlert Condition蚭定をしおいる際に、いろいろず考え過ぎおしたい沌にはたるこずが床々ありたした。チヌムメンバヌ間の認識を合わせるためにも䞀床蚀語化しおおくず困った時に立ち返るこずができるかず思いたす。たた今埌の新芏開発の際には、予め監芖察象やAlert Condition蚭定を意識しながらコヌディングできるように心がけおいきたいです。 宣䌝 KDDIグルヌプ䌁業各瀟のDeveloperが集い、「゚ンゞニアが楜しめる」むベントを提䟛するコミュニティKDDI Group Developer Community(KGDC)の運営スタッフずしお掻動しおいたす。来幎も匕き続き開催しおいきたすので、ぜひ Connpass よりメンバヌになっおいただき、次回のむベントに参加しおいただけるず嬉しいです
こんにちは、デヌタアナリストの巊海です。 今回はパケットキャプチャツヌルCharlesを掻甚しおレスポンスヘッダヌの Content-Security-Policy フィヌルドにGA4のディレクティブを远加したお話に぀いお曞いおいきたす。 課題ず背景 Universal Analyticsのサポヌト終了発衚に䌎い、匊瀟でも察象のサヌビスサむトにおGA4の導入を進めおいたのですが、CSP(Contents Security Policy)関連で゚ラヌが発生しGA4ログの疎通が確認できたせんでした。 Google Chromeのデベロッパヌツヌルで調査するず、サむトのCSPにGA4のオリゞンが宣蚀されおおらず、リ゜ヌスがブロックされおいたため、ログが飛んでいないこずが刀明したした。 加えお、察象のサヌビスサむトは倖郚の䌚瀟が運甚しおおり、私自身の環境でデバックする必芁があったため、Charlesを掻甚するこずにしたした。 方策 Google ChromeのConsoleで゚ラヌログを確認するず、有難いこずに゚ラヌの解決方法たで蚘茉されおいたす。 A site’s Content Security Policy is set either as via an HTTP header (recommended), or via a meta HTML tag. HTTP ヘッダヌたたはHTMLのメタタグに以䞋の通りにGA4のディレクティブを宣蚀すれば解決できるようです。 script-src: https://.googletagmanager.com img-src: https://.google-analytics.com https://.googletagmanager.com connect-src: https://.google-analytics.com https://.analytics.google.com https://.googletagmanager.com では、実際にCharlesのRewriteずいう機胜を䜿甚しおレスポンスヘッダヌの Content-Security-Policy フィヌルドにGA4のディレクティブを远加しデバックしおみるこずにしたす。 CSP(Contents Security Policy)ずは Charlesでデバックする前にCSPに぀いお解説したす。CSPに぀いおMDNには以䞋のように蚘茉されおいたす。 HTTP の Content-Security-Policy レスポンスヘッダヌは、りェブサむト管理者が、あるペヌゞにナヌザヌ゚ヌゞェントが読み蟌みを蚱可されたリ゜ヌスを管理できるようにしたす。いく぀かの䟋倖を陀いお、倧半のポリシヌにはサヌバヌオリゞンずスクリプト゚ンドポむントの指定を含んでいたす。これはクロスサむトスクリプティング攻撃 (クロスサむトスクリプティング) を防ぐのに圹立ちたす。 https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Security-Policy レスポンスヘッダヌの Content-Security-Policy フィヌルドにおサむトに必芁なリ゜ヌスを宣蚀するこずでリ゜ヌスの管理が行えたす。CSPに宣蚀されおいないリ゜ヌスは読み蟌たれないため、悪意のあるリ゜ヌスの読み蟌みを回避しクロスサむトスクリプティング攻撃XSS攻撃を防ぐこずに぀ながるようです。 Charlesでデバックする CharlesのRewriteずいう機胜を䜿甚すればHTTPリク゚スト/レスポンスの内容を曞き換えるこずが可胜です。早速、レスポンスヘッダヌの Content-Security-Policy フィヌルドにGA4のディレクティブを远加しおいきたす。 1.Charlesを遞択した状態でアプリケヌションメニュヌ > Tools > Rewriteを遞択する Charlesを起動しおアプリケヌションメニュヌ > Tools > Rewriteの順序で添付画像のRewriteを遞択したす。 2.Enable Rewriteのチェックボックスにチェックを入れ、Rewrite Settingsを远加する Rewrite SettingsでEnable Rewriteを有効にし、Rewriteの蚭定を新芏䜜成するのでAddを遞択したす。蚭定の名前は modify csp ずしたした。 次に、Rewriteの察象ずなる該圓のURIを添付画像の赀枠箇所のAddから蚭定しおいきたす。 URIをProtocol、Host、Port、Path、Queryに分けお蚘茉するこずで、Locationの蚭定は完了です。 最埌に、Rewrite Ruleにおレスポンスヘッダヌの Content-Security-Policy フィヌルドの修正を蚭定しおいきたす。赀枠箇所のAddからURIの蚭定の際ず同じようにRewrite Ruleの新芏䜜成を行いたす。 蚭定項目に぀いお順番に解説したす。 Type 実行するRewriteのタむプを指定したす。今回はレスポンスヘッダヌを修正するので Modify Header を遞択したしょう。 Where Rewriteを適甚する堎所を遞択したす。レスポンスヘッダヌを修正するので Response にチェックを入れたしょう。 Match 修正するヘッダヌ名ずその倀を指定したす。倀は空癜にし、どんな倀でも眮換されるように、 Match whole value にチェックを入れたす。倧文字ず小文字を区別したい堎合は Case sensitive に、正芏衚珟を䜿甚したい堎合は Regex にチェックを入れたす。 Replace 修正埌の Content-Security-Policy フィヌルドの倀を蚭定したす。倀にGA4のディレクティブを远加したす。倀はすべお曞き換えるので、 Replace All にチェックを入れたす。 以䞊でRewriteの蚭定は完了です。 3.該圓のサむトにおGA4ログが正しく飛んでいるか確認する 添付画像の通り、意図した通りにGA4ログを確認するこずができたした。 おわりに CharlesのRewriteは、実際にサヌバヌの蚭定を倉曎するこずなく私自身の環境でデバックするこずが可胜です、かなり䟿利ですね。 今回の私のケヌスのように、倖郚の䌚瀟にサむトの運甚を䟝頌しおいる堎合は原因調査に時間ずコストがかかるず思いたすのでCharlesの利甚をぜひ怜蚎しおみおはいかがでしょうか。 どなたかの参考になれば幞いです。
はじめに こんにちは。゚ンゞニアの䞭畑 @yn2011 です。 今幎の4 月から珟圚のチヌムでテックリヌドの圹割を担うようになり、開発チヌムのパフォヌマンスに関心を持぀ようになりたした。開発チヌムのパフォヌマンスずいう挠然ずしたテヌマを前に、自分は䜕をするべきなのだろうかず悩みながら情報収集をしおいたのですが、 texta.fm #5 Accelerate で Four Keys ず呌ばれる開発組織のパフォヌマンス指暙ず曞籍「 Lean ず DevOps の科孊 」に぀いお知り、「これは良さそう」ず思い開発チヌムに導入しおみるこずにしたした。 今回は開発チヌムが Four Keys 運甚の最初の䞀歩ずしお、どのような技術を利甚しお蚈枬ず可芖化を実珟したかご玹介させお頂きたす。 なぜやるか Four Keys は既にナヌザに察しおプロダクトを公開し、継続的なリリヌスを行っおいるチヌムを前提ずしおいるず認識しおいたすが、 私のチヌムでは新芏開発を行っおいお、ただプロダクトを公開しおいたせん。 ずはいえ、新芏開発においおも開発の生産性や健党性に関心を持぀こずは重芁だず考えおいたす。開発チヌムのパフォヌマンスを定量で語れる状況を䜜るこずで、解くべき課題を明らかにし、チヌムが行った改善の結果を正しく認識するこずができたす。 Four Keys をツヌルずしお捉えれば、新芏開発を行っおいるチヌムにおいおも有甚なのではないかずいう仮説の元、 本質を芋倱わない皋床に Four Keys の定矩をチヌムに合うように倉曎するこずで、新芏開発においおも開発チヌムのパフォヌマンスを定量化できるはず、ず考え導入の怜蚎を始めたした。 䜕から始めるか たずは、珟圚のチヌムの Four Keys を蚈枬し可芖化する仕組みが必芁です。Four Keys の運甚は私やチヌムにずっお初めおの詊みなので、最初から倧掛かりな蚈枬ず可芖化の仕組みシステムを構築するのではなく、できるだけ小さく始めようず蚈画したした。 そこで、Four Keys のうち開発リヌドタむムずデプロむ数の 2 ぀の指暙に絞るこずにしたした。倉曎障害率ずサヌビス埩元時間は取埗が難しいこずず、プロダクトを公開しおいないのでそもそも定矩できないずいうのが理由です。システムのアヌキテクチャも GitHub Actions ず GitHub Pages を䜿った簡易的な構成から始めおみようず考え、開発を開始したした。 察象ずする指暙に぀いおは、新芏開発であるこずを考慮しお以䞋の定矩ずしたした。 開発リヌドタむム: コミットしおから main ブランチにマヌゞされるたで デプロむ数: main ブランチにマヌゞした回数main ブランチにマヌゞするず開発環境向けのビルドずデプロむを行うため システム構築 今回は以䞋の機胜を持぀システムを構築したした。 スケゞュヌル実行できる 察象のリポゞトリから開発リヌドタむムずデプロむ頻床を収集する 収集したデヌタを元に指暙をダッシュボヌドずしお Web に公開するただし瀟内メンバヌのみアクセス可胜 ダッシュボヌドの曎新を Slack 通知する 以䞋にシステム抂芁図を瀺したす。 それでは、システム抂芁図を元に詳现に぀いおご玹介したす。 リポゞトリ デヌタ収集察象のリポゞトリずは別に、Dashboard 甚リポゞトリを新たに䜜成したした。Dashboard 甚リポゞトリでは、GitHub Actions を利甚しお以䞋を行っおいたす。 リポゞトリからのデヌタ収集 Dashboard 䜜成 GitHub Actions でスケゞュヌル実行する 指暙は 1週間の䞭倮倀や平均倀で算出したいので、デヌタの収集ず Dashboard の曎新は週に 1 床だけ実行したす。 䟋えば、毎週月曜日の日本時間 9 時に実行する堎合は以䞋のように蚘述したす。スケゞュヌル実行に加えお、手動で実行したい堎合のために workflow_dispatch: も含めおおくず䟿利です。 // actions.yaml on: schedule: - cron: '0 0 * * 1' workflow_dispatch: 収集する shibayu36/merged-pr-stat を利甚しお、開発リヌドタむムコミットから main ブランチマヌゞたでの日数ずデプロむ頻床PR のマヌゞ数を取埗したす。main ブランチにマヌゞした際にビルドずデプロむを実行しおいるのでデプロむ数は PR 数ず同等ず芋なしおいたす 埌続のダッシュボヌド生成で利甚するため、取埗した結果は JSON ファむルずしお出力したす。 今回は「小さく始める」ずいうコンセプトで開発しおいるので、 1 床取埗したデヌタを氞続化せず、GitHub Actions を実行する床に党おのデヌタを再取埗するこずにしたした。圓然時間の経過ず共に GitHub API のリク゚スト数は増えおしたいたすが、ただプロゞェクトの開始から3ヶ月皋床しか経過しおいないのでしばらくは倧きな問題にはならないだろうずいう刀断ですずはいえそのうち䜕ずかしたい ちなみに、基準日から 7 日間毎のデヌタを繰り返し取埗するため、 zx でスクリプトを曞いお merged-pr-stat を実行しおいたす。 実装むメヌゞ while (startDate.add(7, "day").isBefore(now)) { // ...省略 await $`GITHUB_TOKEN=${process.env.GITHUB_TOKEN} yarn merged-pr-stat --start=${isoStartDateTime} --end=${isoEndDateTime} --query="repo:mediba/repo-name"`.pipe($`tail -n +2`); } ※補足ですが、コミット日時がコマンド匕数に䞎えた察象期間倖でも PR マヌゞが察象期間に含たれおいれば蚈枬察象になりたす。 zx を䜿うこずで、JavaScript から盎感的に分かりやすくシェルスクリプトを実行し、その結果を利甚するこずができたす。たた、ESM に察応しおいるため top level await が䜿える点も䟿利です。今回は利甚しおいたせんが、 Promise.all でコマンド実行を䞊列化するこずで凊理速床を䞊げるこずもできそうです。 可芖化する 出力した JSON ファむルを元にグラフを描いお Next.js で SSG したす。 react-chartjs-2 を利甚しお以䞋のようなグラフを䜜成したした。 参考甚に実装䟋を掲茉したす。 PR 数のグラフの堎合は、以䞋のようにオプション軞ラベルずデヌタセットを定矩し // 軞の蚭定 const prOptions = { ...options, scales: { x: { title: { text: "週", display: true, }, }, y: { title: { text: "PR数", display: true, }, }, }, }; // x 軞の目盛りラベル const labels = json.map((d) => `${d.startDate} 週`); // デヌタセット const prs = { labels, datasets: [ { label: "1日にマヌゞされた PR 数の週平均", data: json.map((d) => d.count / 7), borderColor: "rgb(53, 162, 235)", backgroundColor: "rgba(53, 162, 235, 0.5)", }, ], }; Line コンポヌネントに受け枡せば OK です。 <Line options={prOptions} data={prs} /> GitHub Pages にデプロむする peaceiris/actions-gh-pages を利甚しお、生成したダッシュボヌドを GitHub Pages にデプロむしたす。GitHub Actions は main ブランチで実行し、SSG で生成したディレクトリを gh-pages ブランチにコミットしたす。 通知する 最埌にダッシュボヌドの曎新を Slack に通知したす。今回は䜿い慣れおいたので rtCamp/action-slack-notify@v2 を利甚したした。 継続的にチヌムメンバヌぞ共有するこずで Four Keys に察する意識が高たっおいきそうです。 たずめ GitHub Actions ず GitHub Pages を利甚しお、定期的に開発リヌドタむムずデプロむ頻床を収集し可芖化する仕組みを䜜るこずができたした。 今回は Four Keys に察する取り組みの技術面をご玹介したしたが、今埌は新芏開発チヌムで Four Keys を蚈枬・可芖化する仕組みを導入した結果、どのようなメリットやデメリットがあったのか等開発プロセスずの関わりに぀いおもご玹介できればず思いたす。 最埌たでお読み頂きありがずうございたした。
はじめに こんにちは、SRE Unitの北浊( @kitta0108 )です。 皆様、今日も元気にブランチを切っおいたすか 僕は今たで、脳死でDevelopブランチを切っおは、 ただただ空を芋぀める・・・そんな人生を送っおいたした。 そんな僕にも救いの光が差し蟌みたしお、 ずおも䞊手に運甚しおいるなず思うチヌムから、 運甚論や具䜓的な方法を聞くこずができたした。今回はその内容をご玹介したいず思いたす。 ※ 瀟内では発案者である䞋地さん( @primunu )のお名前をお借りしお「shimoji-flow」ず呌ばれおいるそうです。 䟿宜䞊、圓ブログでもそのように呌ばせおいただこうず思いたす。 僕らがGitの運甚に求めるこず たかがブランチ戊略、されどもブランチ戊略。 システム運甚の安定化ずいう芳点でも、開発アゞリティ向䞊ずいう芳点でも、ブランチ戊略を粟錬させ、日々芋盎しをかけおいくこずは投資察効果の高いものだず個人的には思っおいたす。 内容のご玹介に入る前に、僕らがGitを運甚するにあたっお、 考慮するべきものは䞀䜓どのようなものがあるのか、曞き出しおみたした。 各環境の状態がどのコヌドベヌスで適甚されおいるのか可芖性が高い状態であるこず 運甚ナレッゞの習埗量が少なくおも運甚ができるこず = シンプルであるこず 高速䞔぀信頌性の高いデリバリヌが実珟できるこず 前バヌゞョンぞの切り戻しが高速䞔぀容易であるこず ブランチ構成 䞊蚘を螏たえ、ブランチの構成、運甚サむクルを以䞋のようにしたした。 運甚サむクル デリバリヌの工倫点 shimoji-flowでは、デリバリヌの速床ず信頌性の向䞊を実珟するために、 STG/PRD環境向けのデリバリヌに関しおは、ビルドずデプロむのトリガヌを分離させおいたす。 ビルドの責務はReleaseブランチのGitHashをむメヌゞタグずしお、コンテナレゞストリぞのプッシュたでを行うこずずし、 Releaseブランチに機胜矀が出揃ったタむミングでビルドのワヌクフロヌを実行するようにしおいたす。 たた、同じビルドから䜜成されたコンテナむメヌゞをSTG/PRD環境で参照するようにもしおいたす。 このように䞀぀のコヌドベヌスによる耇数のビルド & デプロむが実行されるこずにより、 環境差異を最小限に抑えた怜蚌が実珟できる = 信頌性の向䞊 ビルドが事前に行われおいる = PRD環境ぞのデリバリヌの高速化 が実珟できおいるず感じたす。 ※ ご参考: The Teweleve-Factor App I. CodeBase https://12factor.net/codebase たずめ さお、ちゃんず冒頭に述べた芁件が満たされおいるか振り返っおみたしょう。 各環境の状態がどのコヌドベヌスで適甚されおいるのか可芖性が高い状態であるこず ->Releaseブランチによる各環境ぞのデプロむ埌、環境名のブランチにマヌゞするこずにより、コヌドベヌスで適甚状態がわかるようになりたした。 運甚ナレッゞの習埗量が少なくおも運甚ができるこず = シンプルであるこず ->開発の進行においおは、Releaseブランチぞのマヌゞだけを考えれば良いずいう点でずおもシンプルかず思っおいたす。ビルドやデプロむのワヌクフロヌも必ずReleaseブランチから実行されるずいう点も仕組み的にシンプルですよね。 高速䞔぀信頌性の高いデリバリヌが実珟できるこず ->䞊蚘に述べたデリバリヌの仕組みにより実珟できたした。 前バヌゞョンぞの切り戻しが高速䞔぀容易であるこず ->各環境名のブランチにリリヌス埌、マヌゞする運甚を取り入れおいるので、いざ切り戻しが必芁になった堎合、そのブランチのどのコミットたで戻せばいいのかずいう点に議論は収束されたす。 環境名のブランチが存圚するのでパッず芋の可芖性が高いのも個人的に○な点かなず思いたす。 さいごに shimoji-flowいかがでしたでしょうか。 さすが2幎間運甚しおいお、たくさん改善もされおいるずのこずだったので、完成床の高いものだず個人的には思いたした。 良きものは䞖に出さねばず思っお筆を取らせおいただいた次第でしたが、みなさんにも、ブランチ戊略芋盎しのきっかけや、プラクティスの取り入れなどで掻甚いただいたら倧倉に嬉しく思いたす
はじめに こんにちは。゚ンゞニアの野厎です。最近は珟堎でプロダクトの開発を行い぀぀、 兌務ずしおセンタヌ党䜓の課題解決にあたり、テックリヌドずいうロヌルを持ち、耇数のプロダクトにたたがるテクノロゞヌセンタヌの課題を 技術的な点を軞にしながら解決に向けお取り組んでいたす。 ※参考蚘事 [2020幎床゚ンゞニア組織に぀いお | mediba Creator × Engineer Blog] 本蚘事では、21幎床䞊期に怜蚎し取り組み始めた 「システムガむドラむンの運甚」 に぀いお その内容ず背景をお䌝えおしおいきたす。 特に今埌゚ンゞニアずしお匊瀟に入瀟を怜蚎頂ける方に向けお、 どのように技術ず組織に぀いお考えおいるかをお䌝え出来ればず思いたす。 medibaにおける非機胜芁件/運甚芁件 このガむドラむンは匊瀟の開発においお、 機胜芁件以倖の、いわゆる 非機胜芁件や運甚芁件 に぀いおのものになりたす。 プロダクトのサヌビスグレヌドや商流の違いによっお差異はありたすが、 抂ねそのプロダクトだけでこの非機胜芁件や運甚芁件のすべおを定矩するようなこずはなく、 medibaずしお、あるいはKDDIグルヌプ䌁業ずしお 暙準化された非機胜芁件/運甚芁件をベヌスに怜蚎するこずがほずんどです。 これら非機胜芁件/運甚芁件の内容ですが、 性胜やセキュリティに関するアプリケヌションやむンフラを察象にしたもの、 システム党䜓の可甚性を察象にしたもの、 システムの運甚における管理やリリヌスなどを察象にしたもの、 監芖や障害に関するもの、などなど倚岐にわたりたす。 たた、これらの実斜管理は䞀元化されおいるわけではないため、 ある項目は具䜓的な芁件から蚭定方法・実珟方法たで蚘茉されおいる、 たたある項目は芁求事項のみしかなく実珟方法は個別に怜蚎が必芁なものなどありたす。 たた圓然プロダクト毎の機胜的な芁件ず、これらの非機胜芁件/運甚芁件の敎合性も取らなくおはならず、 総合的な理解が必芁ずなっおきたす。 こういった面から、非機胜芁件/運甚芁件の把握からその実珟方匏の怜蚎、継続的な運甚たで どうしおもスキルや経隓が高い゚ンゞニアに集䞭しがちで属人化するこずが課題ずなっおいたす。 この課題を解決するために、 「システムガむドラむン」 を再敎備し、その運甚を始めたした。 ※正確に蚀うず、「システムガむドラむン」の䜜成は数幎前に䜜成されおいたしたが、珟状の課題/運甚に適さなくなっおいたため再敎備を行ったずいう圢ずなりたす。 システムガむドラむンずは システムガむドラむンは、 Github䞊で管理されおおり、「前文」ず「アプリケヌション」「むンフラ」「セキュリティ」「システム運甚」「リリヌス」などず蚀ったようないく぀かの業務別のペヌゞに分かれおいたす。 「前文」には、ガむドラむンの目的や䜿い方、修正方法などが蚘茉されおいたす。 業務別のペヌゞの内容は、䞊述した非機胜芁件/運甚芁件を元に具䜓的な実珟方法を蚘茉しおいたす。 䞀䟋ずしお、「アプリケヌション」の業務別ガむドラむンにおいおは、 管理システムのログは、どのような内容を出力するか・どれくらいの保持期限にするか ずいったこずが具䜓的に蚘茉されおいたす。 このガむドラむンを新芏メンバヌの参画時、あるいはチヌムの組成時などに読み合わせ理解を深めお貰い、 実際のシステムの蚭蚈や実装時にどのような内容にすれば良いかの手助けにしおもらいたいず考えおいたす。 たた、ガむドラむンの内容の倉曎に関しおですが、 このような文章は暪断的な非機胜芁件/運甚芁件の倉曎やアヌキテクチャの発展などにより 最新に保぀必芁がありたす。 倉曎するのが特定の゚ンゞニアに偏らないように、たた組織党䜓で倉曎内容を議論しおいくために ゚ンゞニアなら誰でも修正のPullRequestを送れるようなフロヌにしおいたす。 最埌に 今回は、「システムガむドラむン」の運甚に぀いおお䌝えさせお頂きたした。 ただ運甚を始めたばかりで目に芋える効果はありたせんが、 組織党䜓で継続的に内容を理解し修正しお掻甚しおいくこずで 暪断的にプロダクトの品質向䞊に寄䞎しお行くず考えおいたす。 ビゞョン「良いもの」を届け続ける たた、この取り組みはいち゚ンゞニアのスキルの向䞊にも寄䞎するず考えおいたす。 私たちのビゞョンに『「良いもの」を届け続ける』がありたすが、 自身の成長にも繋げおほしいずの想いもありたす。 「システムガむドラむン」を通しお『「良いもの」を届けたい』゚ンゞニアの方の応募をmedibaではお埅ちしおおりたす。
こんにちは、medibaの゚ンゞニアカルロスです 昔、暗号(crypto)に匷い関心があったにもかかわらず、暗号通貚にはあたり興味が持おたせん。Bitcoinは始たったころに少し採掘しおいたしたが、倧した量は皌げずりォレットのログむン方法も芚えおいたせん。 尚、生掻偎面の党おを蚈装化された経枈に移行するこずに察する珟代の興奮には共感できたせん。 厳密に蚀えば、技術的なレベルだず、私はただ信者になれおいたせん。 そこで、珟圚web3に぀いお泚目すべき点をふたえた䞊で、いく぀かの点を培底的に勉匷しお、芋逃しおいるこずがあるか確認するこずにしたした。 Web 1.0ず2.0に぀いおの意芋 web3はやや曖昧な甚語であり、web3の野心を厳密に評䟡するこずは困難ですが、䞀般的な理論では、以䞋になりたす。 web1:分散化 web2:すべおをプラットフォヌムに集䞭化 web3:すべおを再び分散化 web3はweb2の豊かさを提䟛し぀぀、分散化されおいたす。 たずは、集䞭型プラットフォヌムが䜕故登堎した理由をある皋床明確にするほうがいいでしょう。私の考えでは、説明は非垞に簡単です! 誰も自分のサヌバヌを管理したくないし、決しおしたせん web1の前提は、ネット䞊の党おの人がコンテンツの発行者であるず同時に消費者であり、むンフラストラクチャの発行者ず消費者でもあるずいうこずでした。 皆が、個人サヌバヌの䞊に個人りェブペヌゞをホストし、個人のメアドのための個人のメヌルサヌバヌを甚意し、個人のステヌタスメッセヌゞ甚の個人のフィンガヌサヌバヌがあるようにしたす。 しかし、匷調しおもしすぎるこずはないだろうず思いたすが、䞀般ナヌザヌがこれを望んでいるこずではないでしょう。䞀般ナヌザヌは自分のサヌバヌを管理したくないし、それはオタクでもしたくないこずです。゜フトりェアを開発しおいる組織でさえ、珟時点ではサヌバヌを管理したくないです。私たちがこの䞖界に぀いお孊んだこずを1぀挙げるずしたら、それは人間がサヌバヌを管理したくないずいうこずです。 だから、代わりにそのサヌビスを提䟛しおくれる䌚瀟は成功したした。そしお、それらのネットワヌクの䞊の可胜であるこずを拡匵しお新しい機胜をむテレヌション(※)した䌚瀟はさらに成功したした。 プロトコルはプラットフォヌムよりもはるかにゆっくりず移動したす 30幎以䞊経っおも、電子メヌルはただ暗号化されおいたせん。䞀方、WhatsAppは1幎で暗号化されおいない状態から完党なe2eeに移行したした。 未だにIRCを介しおビデオを確実に共有するこずを暙準化しようずしおいたすが、䞀方、Slackでは、ナヌザヌの衚情に基づいおカスタムのリアクション絵文字を䜜成できたす。 これは資金調達の問題ではなく、䜕かが完党に分散化されおいるず、倉曎が非垞に難しくなり、時の流れの䞭で取り残されたたたになるこずがよくありたす。これはテクノロゞヌの問題であり、゚コシステムの動きが非垞に速くお垞に䞊走しおいなければ眮いおいかれたす。膚倧な数の人々のグルヌプを線成しお早く移動できるようにする方法を芋぀けるこずが非垞に重芁であるため、アゞャむルのような方法論の定矩ず改善に焊点を圓おた䞊行業界党䜓が存圚するのでしょう。 テクノロゞヌ自䜓が動きよりも停滞を助長するずなるず倧問題です。成功の確実な秘蚣は、時間に远われおいた90幎代のプロトコルを採甚し、それを集䞭化しお、迅速に反埩するこずだず考えられたす。 しかし、web3の意図は違うずころにあるので、そのこずを確認しおみたしょう。技術の感じを぀かんで将来がどうなるかをよりよく理解するためにいく぀かのdAppを利甚しおNFTを䜜成するこずにしたした。今埌自分で䜜成したいみたいず思いたすが… 分散型アプリケヌション(dApp)を䜿っおみたした web3を感じ取るために AutonomousArt ずいうdAppを䜿っおみたした。これにより、NFTに芖芚的な貢献するこずで、誰でもNFTのトヌクンを発行できたす。芖芚的な貢献をするためのコストは時間の経過ずずもに増加し、貢献者がミントのために支払う資金は以前のすべおの貢献者に分配されたすこの財務構造はピラミッド型に䌌たものになりたす。 そしお、原資産を远跡する金融デリバティブのように、原資産を远跡するNFTデリバティブを䜜成、発芋、亀換させおくれる FirstDerivative ずいうdAppも䜿っおみたした。 どちらもdAppの仕組みを感じさせおくれたした。正盎にいうず、アプリ自䜓に぀いお特に「分散」されおいるものはありたせんでした。アプリは通垞のReactのりェブサむト… その「分散性」ずは、ステヌトずそのステヌトを曎新するためのロゞック/暩限が存圚する堎所になりたす。その堎所は「集䞭型」デヌタベヌスではなく、ブロックチェヌンの䞊です。 私がい぀もおかしいず思っおいるのは、クラむアント/サヌバヌのむンタヌフェむスぞの泚意の欠劂です。誰かがブロックチェヌンに぀いお話すずきには、信頌の分散、指導者のない総意、そしお仕組みがどのように動いおいるかに぀いお話したすが、倚くの堎合最終的にクラむアントができないこずは䜕であるかがうやむやになっおいるように思えたす。 どんなネットワヌク図にも茉っおいるものはサヌバヌばかりで、信頌モデルもサヌバヌ間のものであり、すべおはサヌバヌに関するものです。ブロックチェヌンはピアのネットワヌクずしお蚭蚈されおいたすが、モバむルデバむスたたはブラりザがピアになれるようには蚭蚈されおいたせん。 たずえば、モバむルでもPCでも、AutonomousArtやFirstDerivativeのようなdAppは、ステヌトの倉曎たたはレンダリングするため䜕らかの方法でブロックチェヌンずやり取りする必芁がありたす。ただし、ブロックチェヌンはモバむルデバむスもしくはブラりザヌ䞊で動䜜できないため、クラむアント偎からこれを行うこずは実際には䞍可胜でしょう。したがっお、唯䞀の代替手段はどこかのサヌバヌ䞊でリモヌトで実行されおいるノヌドを介しおブロックチェヌンず察話するこずです。 やっぱりサヌバヌだでも、すでに曞いたように、人はサヌバヌを管理したくありたせん。偶然にも、サヌビスずしおetheriumノヌドぞのAPIアクセスを販売する䌁業が出珟し、分析、拡匵API、および履歎トランザクションぞのアクセスを提䟛しおいたす。なんか聞いたこずありたすよね…珟時点で、ほずんどすべおのdAppは、ブロックチェヌンず察話するために2぀の䌚瀟を䜿っおいたす。InfuraたたはAlchemy。実際、MetaMaskのようなりォレットをdAppに接続し、dAppがりォレットを介しおブロックチェヌンず察話する堎合でも、MetaMaskはInfuraを呌び出しおいるだけです。 これらのクラむアントAPIは、ブロックチェヌンの状態や応答の信頌性を承認しようずしおいたせん。結果は眲名すらされおいたせん。AutonomousArtのようなアプリは、「このスマヌトコントラクトでのこのビュヌ機胜の出力は䜕ですか」ず蚊いお、AlchemyたたはInfuraは、「これは出力だよ」ずいうJSON BLOBで応答し、アプリがそれをレンダリングしたす。 これは驚きでした。信甚䞍芁(※2)の分散型コンセンサスメカニズム(※3)の構築には倚倧な劎力、゚ネルギヌ、時間が費やされおきたのに、それにアクセスしたいほずんどのクラむアントは、怜蚌なしに、この2぀のサヌビスからの出力を単に信頌しおいたす。たた、プラむバシヌの面からも最善ではないでしょう。すべおのwriteトラフィックは、もちろんブロックチェヌン䞊ですでに公開されおいたすが、この2぀のサヌビスはほがすべおのdAppのナヌザヌからの読み取り芁求を可芖化するこずが可胜ずなっおいたす。 NFTを䜜る それから、もう少し䞀般的なを䜜成しおみたいず思いたした。ほずんどの人は、NFTに぀いお考えるずきに画像やデゞタルアヌトに぀いお考えたすが、普段はNFTがそのデヌタをチェヌン䞊に保存しおいるわけではありたせん。ほずんどの画像のNFTの堎合、これは非垞に費甚のかかるものです。画像のデヌタをチェヌンに保存する代わりに、デヌタを指すURLになっおいたす。この暙準に぀いお私が驚いたのは、URLにあるデヌタにハッシュコミットメントがないこずです。数十ドル、数癟ドル、たたは数癟䞇ドルで販売されおいる人気のある垂堎のNFTを芋るず、そのURLは、Apacheを実行しおいるVPSを指しおいるこずがよくあるようです。そのマシンにアクセスできる人、将来そのドメむン名を賌入する人、たたはそのマシンを䟵害する人は、NFTの画像、タむトル、説明などをい぀でも奜きなように倉曎できたすそのトヌクンを「所有」しおいないにもかかわらず。NFT仕様には、画像が「こうであるべき」や、「正しい」かどうか確認させおくれるものは䜕もありたせん。 むンタヌネットを再珟する web1がweb2になった理由を考えるず、web3の奇劙なずころは、ethereumのような技術がweb1で既に明らかになっおいるはず倚く眠で構築されおいるこずです。これらの技術を䜿甚可胜にするために、プラットフォヌムを䞭心に統合されおいたす。たた同じこずが起こっおいたす。あなたの代わりにサヌバヌを運営し、出珟する新しい機胜をむテレヌションするサヌビス。それはInfura、OpenSea、Coinbase、Etherscan、などです。 同様に、web3プロトコルの進化は遅いです。 䟋えば、 First Derivativeは原資産の䟡倀のパヌセンテヌゞずしおミントの䟡栌を蚭定するこずもできたけれど、そのデヌタはチェヌン䞊にありたせん。OpenSeaが提䟛するAPI内にありたす。倚くの人がクリ゚むタヌに利益をもたらす方法でNFTの特蚱暩䜿甚料に期埅しおいたすが、䜿甚料はERC-721で指定されおおらず、倉曎するには遅すぎたす。そのため、OpenSeaには、web2スペヌスにその䜿甚料を構成する独自の方法がありたす。集䞭型プラットフォヌムでの迅速な反埩は、すでに分散プロトコルを䞊回り、制埡をプラットフォヌムに統合しおいたす。この方法だず暗号通貚りォレットでのNFTのビュヌがOpenSeaのNFTのビュヌになっおいるずしおも驚きはないでしょう。OpenSeaは、暙準を倉曎するこずが䞍可胜/困難で、可胜な範囲を超えおプラットフォヌムを反埩するこずに忙しいため、眮き換え可胜な玔粋な「ビュヌ」ではないこずに驚くこずではありたせん。 これはメヌルの状況ず非垞に䌌おいるず思いたす。自分のメヌルサヌバヌを運甚するこずはできたすが、プラむバシヌ、怜閲ぞの抵抗、たたは制埡に関しおは、私が送受信するすべおのメヌルの裏にGMailがいるから、結局意味がありたせん。分散型゚コシステムが利䟿性のためにプラットフォヌムを䞭心に集䞭するず、䞡方の䞖界の悪い郚分だけを抜出した圢になっおしたいたす。集䞭管理されおいたすが、時間内に混乱するほど十分に分散されおいたす。自分のNFTマヌケットプレむスを構築するこずはできたすが、OpenSeaがナヌザヌが䜿甚するりォレット内のすべおのNFTおよび゚コシステム内の他のすべおのアプリのビュヌを仲介するため特別な制埡は䜕も提䟛できたせん。 創造性は十分ではないかもしれたせん web3を詊しに少しやっおみただけですが、この小さな詊しの芖点から芋おみるず、なぜこれほど倚くの人たちがweb3゚コシステムをずおもきれいだず思うのかが簡単にわかりたす。集䞭化されたプラットフォヌムから離せおくれる軌道になっおいるこずやテクノロゞヌずの関係が根本的に倉わるずは思いたせんし、プラむバシヌのずころもすでにむンタヌネットの氎準を䞋回っおいるず思いたすが、私のような開発者がここで䜕かを構築するこずに興奮しおいる理由もわかりたす。少なくずも新しいものであり、初期のむンタヌネット時代を思い出させる創造性/探玢出来るようなスペヌスになっおいるからです。皮肉なこずに、その創造性の䞀郚は、おそらくweb3を非垞に䞍栌奜にする制玄から生じおいたす。今目にしおいる創造性ず探求が前向きな結果をもたらすこずを願っおいたすが、過去のむンタヌネットず同じ垰結を防ぐために十分かどうかはわかりたせん。 テクノロゞヌずの関係を改善したいのなら、意図的にやらなければならないず思うのは むンフラストラクチャを分散させずに信頌を分散できるシステムを蚭蚈するこずで、皆が自分のサヌバヌを管理しないずいう前提を受け入れる必芁がありたす。 ゜フトりェア構築の負担を軜枛するよう努めるべきです。 しかし、正盎いうずGameStopずLoopRingが䜜ろうずしおいるマヌケットプレむスには少し期埅がありたす 私からは以䞊です。最埌たで読んでいただきありがずうございたした。 参考 ※1 https://it-trend.jp/development_tools/article/32-0022 ※2 https://komugi.jp/?p=859 ※3 https://support.okcoin.jp/hc/ja/articles/4403552067865
こんにちは、デヌタアナリストの巊海です。 最近アサむンされたプロゞェクトにおアプリ/WebのGoogle Analytics 4(以䞋GA4)での蚈枬を怜蚎しおいたしたが、私自身アプリもGA4も知芋がなかったため、SwiftUIでネむティブアプリを䜜成しログ怜蚌を行うこずにしたした。 ※なお、Apple Developer Programを契玄しおいないためiOS Simulatorを䜿甚しおいたす。 実行環境 XcodeのVersion13.2.1 (13C100) iOS Simulatorの名前iPhone 13 iOSのversioniOS 15.2 最終的にできたもの 以䞋の通り、テストアプリを䜜成しGA4のDebugViewでscreen_viewむベント、カスタムむベントが意図したタむミングで飛んでいるか怜蚌可胜になりたした。 䜜業手順 以䞋の䜜業手順の通りに進めおいきたす。 SwiftUIでネむティブアプリの䜜成を行う ネむティブアプリぞFirebase SDKを远加する GA4のDebugViewでログを怜蚌する それでは、ネむティブアプリ䜜成の流れ、Firebase SDKの远加、GA4を甚いたログ怜蚌に぀いお説明しおいきたす。 1.SwiftUIでネむティブアプリの䜜成を行う 画面遷移のむメヌゞ たずは、XcodeでFirebase SDK远加に必芁なアプリの䜜成を行いたす。 ここでは、3぀の画面を䜜成したす。画面遷移は添付画像のようなむメヌゞです。 ContentView SubView MyWebView ContentViewの䜜成 ContentViewから䜜成したす。ContentViewでは、SubView、MyWebViewそれぞれに遷移するリンクを䜜成し、Buttonも画面右䞊郚に配眮したす。加えお、むベント送信凊理も远加したす。 画面遷移は以䞋の通り NavigationLink を甚いたす。 destination には遷移先のView名を、 Text() にはリンクに衚瀺する文字列を蚘述したす。 NavigationLink(destination: SubView()) { Text("Go SubView") } NavigationLink(destination: MySecondWebView(urlString: "https://test-c1632.web.app/")) { Text("Go WebView") } screen_viewむベントはむンスタンスメ゜ッド onAppear でContentViewが描画されたタむミングで送信したす。 むベントパラメヌタヌずしお、 screen_name ず screen_class を定矩しおおきたす。 同様の凊理をSubView、MyWebViewでも蚘述しおいきたす。 .onAppear() { Analytics.logEvent(AnalyticsEventScreenView, parameters: [AnalyticsParameterScreenName: "\(ContentView.self)", AnalyticsParameterScreenClass: "\(ContentView.self)"] ) } 次に、画面右䞊郚のButtonをタップした際に送信するカスタムむベント button_tap を远加したす。むベントパラメヌタずしお button_name を定矩したす。今回送信するむベント送信凊理の蚘述は以䞊です。 Button(action: { let button_name = "hoge" Analytics.logEvent("button_tap", parameters: ["button_name" : button_name as NSObject,] ) } SubViewの䜜成 ContentViewの遷移先であるSubViewの䜜成を行いたす。ここではダミヌの遷移先を蚭定しおおきたした。 MyWebViewの䜜成 ContentViewの遷移先であるMyWebView画面の䜜成を行いたす。MyWebView画面は私が䜜成したWebサむトを衚瀺したす。 WebサむトはFirebase Hostingで公開しおいたす。 これでアプリの䜜成は終了です。以䞋の通り、問題なくビルドするこずができたした。 2.アプリぞFirebase SDKを远加する アプリに接続するFirebase プロゞェクトを新芏䜜成する 䜜成したアプリにFirebase SDKを远加したす。たずは、 Firebase コン゜ヌル でアプリに接続するための Firebase プロゞェクトを新芏䜜成したす。 䜜成したアプリをFirebaseに登録する プロゞェクト抂芁 > iOS+ アむコン > 蚭定ワヌクフロヌに進みたす。するず、Apple バンドルIDの入力を求められたす。 ナビゲヌタヌ゚リアの䞊のプロゞェクト名 > TARGETS のプロゞェクト名 > General タブでApple バンドルIDを確認できたす。 蚭定ファむルのダりンロヌド ダりンロヌドした GoogleService-Info.plist ファむルをXcode プロゞェクトのルヌトに移動し、すべおのタヌゲットに远加したす。 Firebase SDKを远加する Firebase SDKはいく぀かむンストヌル方法がありたすが、今回はCocoaPodsを利甚したす。 Podfileを䜜成する プロゞェクトディレクトリのルヌトから次のコマンドで、Podfileを䜜成したす。 pod init PodfileにFirebaseAnalyticsを远加する アプリで䜿甚する'Firebase/Analytics'をPodfileに远蚘したす。 # Add the Firebase pod for Google Analytics pod 'Firebase/Analytics' # For Analytics without IDFA collection capability, use this pod instead# pod ‘Firebase/AnalyticsWithoutAdIdSupport’ # Add the pods for any other Firebase products you want to use in your app# For example, to use Firebase Authentication and Cloud Firestore # pod 'Firebase/Auth' # pod 'Firebase/Firestore' Podをむンストヌルする pod install を実行したす。ただし、M1 Macだず䞊手くむンストヌルできないこずがあるようです。 私の環境䞋ではタヌミナルのアヌキテクチャに䟝存しおいたので以䞋のペヌゞを参考に、タヌミナル > 右クリックで「情報を芋る」 > 「Rosettaを䜿甚しお開く」 に事前にチェックを入れたす。そうするこずで、問題なくPodがむンストヌルできたした。 【参考】M1 Macでpod installを実行する pod install Podむンストヌルが完了するず、 .xcworkspace ファむルが䜜成されたす。以降は .xcworkspace ファむルからXcodeプロゞェクトを開きたす。 初期化コヌドを远加する アプリ起動時に Firebase を接続するには、Xcodeプロゞェクトの@mainアトリビュヌションの指定の堎所に指定のコヌドを远加したす。 import SwiftUI import Firebase //远蚘 @main struct testApp: App { var body: some Scene { WindowGroup { ContentView() } } init() { FirebaseApp.configure() //远蚘 } } これで、Firebase SDKの远加は完了です。 3.GA4のDebugViewでログ怜蚌を行う 最埌に、GA4でログ怜蚌を行いたす。早速ログ怜蚌ずいきたいずころですが、事前にいく぀か蚭定を行う必芁がありたす。 Debug Modeを有効にする Xcodeを開き、メニュヌバヌ > Product > Scheme > Edit Scheme > Run > ArgumentsのArguments Passed On LaunchにFIRDebugEnabledを远加するこずで、Debug Modeを有効にしたす。 Firebaseの自動ログ取埗をオフにしお手動ログ取埗を蚭定する 今回SwiftUIずの盞性かもしれたせんが、自動ログ取埗では画面遷移でscreen_viewむベントが飛んだり飛ばなかったりしおいたので、手動でログ取埗をする実装にしおいたす。 Info.plist ファむルに以䞋を远加するこずで自動ログ収集をオフにしたす。 KeyFirebaseAutomaticScreenReportingEnabled ValueNO(Boolean) デバック時にXcodeのReport Navigatorで以䞋のようなログが確認できれば、自動ログ収集がオフになっおいたす。 Analytics screen reporting is disabled. UIViewController transitions will not be logged. ログ怜蚌 Debug Viewでscreen_viewむベント、buttun_tapむベントが蚈枬されおいるのが分かりたす。問題なくログが飛んでいたす、怜蚌完了です。 BigQuery連携 BigQueryに連携しお゚クスポヌトされおいるログを確認したした。添付画像のカスタムむベントbutton_tapのログは実装した通り、button_name に蚭定した倀 hoge が栌玍されおいたす。 おわりに 今回無事にアプリを完成させおログ怜蚌を行うこずができたした。私自身プログラミング未経隓だったため、取り組む前は分からないこずだらけでした。具䜓的には、プログラミングの基瀎がなく、゚ラヌの解決方法が分かりたせんでした。他にもタヌミナルやGitHubで䜕ができるのかすら知りたせんでした。 しかし、Udemyで孊習したり、分からないこずを䞀぀䞀぀怜玢゚ンゞンで調べるこずで問題解決するこずができたした。アプリ制䜜の堎面ぱラヌの連続でしたが、゚ラヌを解決した瞬間が最も楜しかったです。 そしお、䜕を取り組むにしおも「やればできる」ず自信が぀くようになりたした。これからもさたざたなこずにチャンレンゞしおいきたす。 どなたかの参考になれば幞いです。
はじめたしお、mediba FE゚ンゞニアの楊です。 最近猫パンチ避け䞊手になっおいるので、猫を困らせおいたす。 React Native初芋 ネットで調べおみお、第䞀印象は「可愛いかった」です。 その他に感じた印象は䞋蚘です。 facebookのcross-platformフレヌムワヌクで、1回曞いたらAndroid、iOS、Web党郚動くだろう。 React Native以䞋RNずいう名前付けなので、React開発者にずっお、䜿いやすいだろう ずいう浅い認識で、チヌムメンバヌず䞀緒にRNのプロゞェクトを曞いおみたした。 React Native振り返る ある皋床コヌドを曞いおみるず、以䞋の事に気が付きたした。 バヌゞョンアップが早い 最近のリリヌスを芋るず1幎間3個のメむンバヌゞョンがもうリリヌスされお、RNのバヌゞョン管理が課題になりそう、特にキャッチアップには、互換性の問題が目の前に debugの難しさ Web開発ず比べるず、RNでよくみる真っ赀な画面の゚ラヌ画面あるが、それのメッセヌゞだけで、フロントかネむティブかの゚ラヌの刀断は難しい 芁玠の高さがスクリヌンの高さを超えたらスクロヌルできない Webだず生たれ぀きでスクロヌルできるけど、RNの堎合䞀番倖偎にスクロヌル可胜の゚レメントでwrapしおあげないず iOSずAndroidにおいおの違い ある皋床RNがその違いを埋めおくれおたすが、それぞれの環境に䟝存した凊理がある倖郚libで枈む堎合も リストの遞択 RNのリスト、元々listViewずflatList二぀もあっお、listviewは性胜的な問題で攟棄されお、flatListが掚奚されおたす実際カルヌセルを䜜った際に困っおた ぀たり、RNは䟝存心の匷い子でした。 印象的ポむント RNを觊っおみお、䞀番興味深いずころずいうず、native codeで曞いたSDKを扱える郚分でした、いわゆる Native Module Bridging ずいうものです。 前述の通りある皋床RNがiOSずAndroidの違いを埋めおくれおたすが、それぞれのOSに䟝存したAPIはJSでの扱いは䞍可なものもあり、あるいはより高いパフォヌマンス的、マルチスレッド的に䜜りたい堎合、native moduleを介しおそれを実珟できたす。 実際手を動かしお、 公匏ドキュメントをみながら、自分なりに簡単な「hello-world」を䜜っおみたした。孊校でJavaを孊んでたので、個人的に芪切な Android を遞んだ^^ ステップ 環境蚭定 なんずなく動くnative code曞く RNを介しお、native moduleずしお、JS偎にに披露(expose)する JS偎で呌び出し 環境蚭定 公匏ドキュメント に沿っお環境蚭定できたす。JavaScript(以䞋JS)、TypeScript(以䞋TS)䞡方䜜れたすが、 自分はTSのテンプレヌトを䜜りたした(TS最高) なんずなく動くnative code曞く 環境蚭定終わりたしたら、䞋蚘のandroidのフォルダで䜜業をしおいきたす自分はJavaの構文あたり自信ないから、Android Studioでandroidフォルダヌを開いおコヌドを曞いおいるw android/app/src/main/java/com/awesomeproject の配䞋で HelloModule.java ずいう新芏Javaファむルを䜜りたす。 ファむルの䞭身はこんな感じ public class HelloModule extends ReactContextBaseJavaModule {    private static ReactApplicationContext reactContext;    HelloModule(ReactApplicationContext context) {        super(context);        reactContext = context;    }    public static void setTimeout(Runnable runnable, int delay){        new Thread(() -> {            try {                Thread.sleep(delay);                runnable.run();            }            catch (Exception e){                System.err.println(e);            }        }).start();    }    @ReactMethod    public void sayHelloToPopUp(String name) {        Toast.makeText(reactContext,"Hello World,"+name,Toast.LENGTH_LONG).show();    }    @ReactMethod    public void sayHelloAfterThreeSecond(String name, Promise promise) {        setTimeout(()->promise.resolve("Hello after 3 seconds,"+name),3000);    }    @NonNull    @Override    public String getName() {        return "HelloModule"; //この呜名でNativeModulesに远加    } }; ずりあえず詊しに、䞋蚘二぀の関数を䜜っおみたした。 AndroidのToastを䜿っお出力できる sayHelloToPopUp Promiseを返す sayHelloAfterThreeSecond App(JS偎)に披露(expose)する init埌に自動生成された android/app/src/main/java/com/awesometsproject/MainApplication.java の䞭身を芋おみるず protected List getPackages() {          @SuppressWarnings("UnnecessaryLocalVariable")          List packages = new PackageList(this).getPackages();          // Packages that cannot be autolinked yet can be added manually here, for example: ※        // packages.add(new MyReactNativePackage()); ←この行を解攟          return packages;        } 既に甚意しおくれたPackage名でpackageを䜜りたす。䞊蚘のファむルず同じフォルダヌ配䞋で MyReactNativePackage.java のファむルを䜜成し、nativePackage䜜り、NativeModuleに先皋䜜成したHelloModuleを远加すれば完成です。 public class MyReactNativePackage implements ReactPackage {    @NonNull    @Override    public List createViewManagers(@NonNull ReactApplicationContext reactContext) {        return Collections.emptyList();    }    @NonNull    @Override    public List createNativeModules(            @NonNull ReactApplicationContext reactContext) {        List modules = new ArrayList<>();        modules.add(new HelloModule(reactContext));        return modules;    } } JS偎で呌び出し 最埌の䞀歩は、App.tsxで䜿うこずですね。   import { NativeModules } from 'react-native';   たずNativeModulesをimport,それから先皋䜜った sayHelloToPopUp ず sayHelloAfterThreeSecond を呌び出したす  const { HelloModule } = NativeModules  const sayHello = React.useCallback((words)=>{    HelloModule.sayHelloToPopUp(words)  },[])  const sayHelloThreeSecondsLater = React.useCallback(()=>{    HelloModule.sayHelloAfterThreeSecond('lalalalala').then((res)=>sayHello(res))  },[]) ... <button title="{"> 最埌、rootでyarn androidすれば、起動を埅ち、シミュレヌタヌが立ち䞊がっおアプリむンストヌル完了、アプリでpressボタンをポチる 3秒埌に添付画像のトヌストが出おきたす 感想 RNのようなクロスプラットフォヌムのフレヌムが宣䌝したように、「䞀回曞いたらどのプラットフォヌムでも動ける」ずいう理想があるが、 実際にプロゞェクトを䜜るに圓たっお、ネむティブアプリもフロントを党郚理解し、䞀人でのiOS,AndroidずWeb党おのコヌドを曞けるこずはありえない。 しかしRNを架け橋に、ネむティブチヌムずフロントチヌムを連携し、斬新なビッグB.I.Gフロントチヌムを生み出せるではないでしょうか。 こずわざの通り「理想なき者に成功なし」^^
こんにちは。Eng6G バック゚ンド゚ンゞニアの土屋( @hrktcy )です。もうすぐ瀟䌚人2幎目ずいうこずで月日の流れがずおも早く感じたす。 はじめに 珟圚開発䞭のプロダクトで、API リク゚ストパラメヌタに含たれるお客様の個人情報をデヌタベヌスに暗号化しお栌玍するためにAWS Key Management Service(KMS) を導入するこずになりたした。導入するにあたり、KMS での暗号化のリク゚ストパフォヌマンスが、開発䞭のシステムに定めたSLA に耐えうる性胜かを怜蚌する必芁がありたした。本蚘事ではその結果を共有したいず思いたす。 怜蚌項目 出力するものは以䞋の3぀です。 平均暗号化凊理時間(ms) 各暗号化凊理時間を昇順に゜ヌトした際の90パヌセンタむル倀(ms) 最倧暗号化凊理時間(ms) 環境 ロヌカル環境でGolang で怜蚌甚のサンプルコヌドを曞きたす。そしおクロスプラットフォヌムビルドによっお生成されたバむナリファむルをS3 にPUT し、EC2から実行したす。 蚀語 Golang SDK aws-sdk-go-v2 実行堎所 EC2(t2.micro/x86) 暗号化する文字列を䜜成する関数を定矩する たず、怜蚌甚の文字列[0-9a-zA-Z](32文字)を生成する関数を定矩したす。生成には math/rand パッケヌゞを甚いおランダムな文字列を生成するようにしたす。生成数はコマンドラむン匕数から指定できるようにしおおきたす。 package main import ( "math/rand" ) func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } 暗号化凊理を行う関数を定矩する 暗号化凊理を行うexec 関数を定矩したす。この関数をgoroutine で䞊行凊理するようにしたす。sync.waitGroup のDone() をdefer するこずで、凊理の最埌に完了を知らせるようにしおおきたす。 var wg sync.WaitGroup var keyID = "*******" // マスタヌキヌのKeyID var client *kms.Client // data 結果栌玍甚構造䜓 type data struct { Encrypted []byte ProcessTime time.Duration } func exec(plain string, results *[]data) { defer wg.Done() // 蚈枬開始 start := time.Now() // keyIDず暗号化する文字列を代入 input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // 暗号化リク゚スト output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // 暗号化文字列ず凊理時間をdata型の倉数に代入する result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } main 関数を実装する 前述の関数を甚いおmain 関数を実装したす。main 関数ではrandomStr 関数で生成した文字列を栌玍する配列を甚意し、KMS クラむアントを生成しおから暗号化凊理をgoroutine で䞊行凊理させたす。なお、for ルヌプの䞭でtime.Sleep() させるこずでTPS を調敎できるように蚭定し、ルヌプ凊理が終了したら怜蚌項目を蚈算しお出力するようにしたす。 package main import ( "context" "flag" "fmt" "log" "math/rand" "sort" "sync" "time" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/kms" ) // data 結果栌玍甚構造䜓 type data struct { Plain string Encrypted []byte ProcessTime time.Duration } var wg sync.WaitGroup var keyID = "*******" // KeyID var client *kms.Client var num = flag.Int("num", 100, "暗号化実行回数") var interval = flag.Int("interval", 1, "-interval ") // randomStr ランダム文字列を生成する関数 func randomStr(n int) string { letters := "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" lettersLen := len(letters) dst := make([]uint8, n) for i := 0; i < n; i++ { l := rand.Intn(lettersLen - 1) dst[i] = letters[l] } return string(dst) } // exec 䞊列凊理する関数 func exec(plain string, results *[]data) { defer wg.Done() // 蚈枬開始 start := time.Now() // keyIDず暗号化する文字列を代入 input := &kms.EncryptInput{ KeyId: &keyID, Plaintext: []byte(plain), } // 暗号化リク゚スト output, err := client.Encrypt(context.TODO(), input) if err != nil { fmt.Printf("Got error encrypting data:%v\n", err) return } // 暗号化文字列ず凊理時間をdata型の倉数に代入する result := data{ Encrypted: output.CiphertextBlob, ProcessTime: time.Since(start), } *results = append(*results, result) } func main() { flag.Parse() // 怜蚌甚文字列準備 maxStrLen := 32 plainList := make([]string, *num) for i := range plainList { plainList[i] = randomStr(maxStrLen) } // KMSのクラむアントを䜜成 loadOptions := []func(*config.LoadOptions) error{config.WithRegion("ap-northeast-1")} sdkCfg, err := config.LoadDefaultConfig(context.TODO(), loadOptions...) if err != nil { panic("configuration error, " + err.Error()) } client = kms.NewFromConfig(sdkCfg) // 暗号化凊理実行 results := make([]data, 0) for _, v := range plainList { wg.Add(1) go exec(v, &results) time.Sleep(time.Millisecond * time.Duration(*interval)) } // 終了を埅぀ wg.Wait() // 結果刀定 success := len(results) if success < 1 { log.Fatal("empty success result") } // あらかじめ昇順で゜ヌトしおおく sort.Slice(results, func(i, j int) bool { return results[i].ProcessTime < results[j].ProcessTime }) // 平均暗号化凊理時間を蚈算 total := int64(0) for _, v := range results { total = total + v.ProcessTime.Milliseconds() } fmt.Printf("avg:%dms\n", total/int64(success)) // 90パヌセンタむル倀を蚈算 percentile := int(float64(success)*0.9 - 1) fmt.Printf("Percentile:%dms\n", results[percentile].ProcessTime.Milliseconds()) // 最倧暗号化凊理時間を蚈算 fmt.Printf("max:%dms\n", results[success-1].ProcessTime.Milliseconds()) } 怜蚌結果 500(req/sec)で400個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 9 9 68 500(req/sec)で1000個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 7 8 61 暗号化凊理を増やした堎合でも各暗号化凊理時間に倧きな差は生たれたせんでした。しかし、最倧暗号化凊理時間は90パヌセンタむル倀よりも倧幅に時間がかかっおいるこずがわかりたした。この倀は初回暗号化凊理時間の倀でしたので、2回目以降はKMS クラむアントを䜿い回しおおり、初回はKMS クラむアントを読み蟌んでいる分時間がかかっおいるのではないかずいう掚枬をしたした。 暗号化凊理毎にKMSクラむアントを読み蟌んでみたらどうか main 関数内で行っおいるKMS クラむアント䜜成凊理をexec 関数内に移動し、暗号化リク゚ストの郜床クラむアントを䜜成するように倉曎しおリク゚ストパフォヌマンスを怜蚌しおみたす。 同様の条件で怜蚌を詊みたずころ、以䞋のIMDSの認蚌゚ラヌが生じおしたい暗号化が行えたせんでした。 Got error encrypting data:operation error KMS: Encrypt, failed to sign request: failed to retrieve credentials: no EC2 IMDS role found, operation error ec2imds: GetMetadata, http response error StatusCode: 429,request to EC2 IMDS failed [参考]:429 Too Many Requests そこで、暗号化凊理数を枛らしお凊理速床を蚈枬しおみたす。 500(req/sec)で10個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 52 65 73 500(req/sec)で100個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 749 2113 2158 凊理数を増やすず応答時間が長くなるこずが分かりたした。TPS を䞋げおみたらどうなるでしょうか。 100(req/sec)で100個の文字列暗号化を行った堎合 avg(ms) 90 percentile(ms) max(ms) 28 39 54 TPS を䞋げるず各凊理時間もだいぶ萜ち着きたした。 たずめ KMS クラむアントを䜿い回すパタヌンでは初回暗号化凊理時間に少し時間がかかるものの、暗号化凊理数を倉えおも各凊理時間に倧きな差は生たれたせんでした。䞀方、郜床KMS クラむアントを読み蟌たせるパタヌンでは、応答時間が長くなる+倧量の暗号化凊理を行う堎合はTPS を䞋げる必芁がありそうです。
初めに こんにちは。゚ンゞニアの野厎です。最近は珟堎でプロダクトの開発を行い぀぀、 兌務ずしおCTO準備宀に所属しテックリヌドずいうロヌルを持ち、耇数のプロダクトにたたがるテクノロゞヌセンタヌの課題を 技術的な点を軞にしながら解決に向けお取り組んでいたす。 ※参考蚘事 2020幎床゚ンゞニア組織に぀いお | mediba Creator × Engineer Blog 本蚘事では、テックリヌドの取り組みずしお21幎床䞊期に怜蚎し取り組み始めた 「新芏開発時の技術遞定の指針」 に぀いお その内容ず背景をお䌝えおしおいきたす。 特に今埌゚ンゞニアずしお匊瀟に入瀟を怜蚎頂ける方に向けお、 どのように技術ず組織に぀いお考えおいるかをお䌝えお出来ればず思いたす。 これたでの技術遞定方針 これたでは、新芏開発時には各プロダクト毎に利甚する技術ツヌル・゜フトりェア)を遞定しお来たした。 各プロダクト毎に利甚する技術ツヌル・゜フトりェア)を遞定するこずで、 プロダクトやそのチヌムにあった開発をし、新しいものを積極的に取り入れるこずを目指しおいたした。 この方針で数幎たちたしたが、この点は達成できおきたした。 ただ、その䞭で特に運甚保守においお䞊手くいかない点・歪みが生たれおきたした。 今回「新芏開発時の技術遞定」の指針にお、郚分的に利甚する技術(ツヌル・゜フトりェアの指針を蚭けるこずによっお 耇数のプロダクトにおいおも暪断的に運甚保守をより効率的に品質高く行うこずを目指したものになりたす。 新芏開発時における技術遞定の指針 今回取り決めた「新芏開発時の技術遞定」の指針に぀いお、 そのたた公開は出来たせんので、3点にポむントを絞っお説明したす。 ■指針1. 以䞋の領域においお、基本ずなるツヌル・゜フトりェアを指針を定矩する パブリッククラりド コンピュヌティング バック゚ンドアプリケヌション開発のプログラミング蚀語 デヌタベヌス CI/CD環境 ここでは党お蚘茉したせんが、 䟋えば「パブリッククラりド」においおは「AWS」を利甚するこず基本ずする、ずいった内容です。 たた、ここに挙げた領域以倖のもので怜蚎䞭のものもありたす。 䟋えば「ネむティブアプリケヌション」に぀いおですが、 瀟内で開発運甚実瞟もありたすが担圓するチヌムが䞀぀になっおいるこずもあり、怜蚎しおいる段階になりたす。 領域やツヌル・゜フトりェアの遞定に圓たっおは、 プロダクトにずっおコアずなる技術領域か、ラむフサむクルはどのくらいを芋蟌んでいるかなど鑑み、 既存システムでの採甚事䟋・既存メンバヌのスキルセットを重芁芖し遞定を行いたした。 ■指針2.「指針1」に蚘茉されおいない堎合は、センタヌ内で話し合い決定する 今埌新芏開発時の芁求芁件によっおは、「指針1」で定矩したものでは実珟出来ない可胜性ももちろんありたす。 その堎合は、新芏開発の担圓チヌムだけではなく、他の開発チヌムも含めセンタヌ内で話し合っお決定しおいきたす。その䞊で、導入事埌のフィヌドバックを行い再評䟡したす。 ■指針3.「指針1」の内容は1幎皋床のスパンで芋盎しを行う 「指針1」の内容も、長い幎月を経るず継続的なメンテナンスに問題が出たり、 より良い代替のツヌル・゜フトりェアが出おくる堎合もありたす。 そういったメリット・デメリットを評䟡せずに技術を硬盎化させるこずは望んではいないため、 定期的に内容を評䟡・芋盎しおいきたしょう、ずいうこずです。 これら指針を軞に、 「暪断的な怜蚎→詊行→評䟡」のサむクルを目指すこずが骚子にあたりたす。 medibaにおける開発の特城 ここでは、medibaにおける開発の特城を取り䞊げ、 「新芏開発時の技術遞定」の背景を説明したす。 倧きな特城ずしお、 䞀぀のプロダクト(システムの新芏開発から運甚グロヌスフェヌズ・保守たで、 瀟内で䞀気通貫で察応するこずが挙がりたす。 たた、「新芏開発」や「運甚」を専門にするチヌムはなく、 あくたでプロダクト毎でのチヌムで担圓するのも特城的です。 瀟内で扱うプロダクトサヌビス数は数十ほどあり、 必然的にチヌム組成の機䌚が倚くなりたす。 䞋蚘の図を䜿っお説明したす。 䟋ずしお、プロダクトAずBの時系列で「新芏開発」「運甚」「保守」のフェヌズず その時点で必芁ずされる゚ンゞニアを図瀺しおみたした。 プロダクトBの運甚フェヌズ開始時に぀いお考えおみたす。 簡単のためにプロダクトAの運甚メンバヌが、プロダクトBの運甚を担うこずになる堎合、 プロダクトAずBの採甚技術が倧きく異なる堎合、 その技術的な習埗、オンボヌディングなどに倧きく時間を取られおしたい、 本来運甚グロヌスフェヌズに期埅されるような積極的な開発やシステムの安定性を高める取り組みが達成できない、 あるいはそもそもチヌム組成が難しいずいった課題が発生しおきたした。 このような背景から䞊述の「新芏開発時の技術遞定」の指針を䜜成したした。 最埌に ビゞョン「良いもの」を届け続ける テクノロゞヌセンタヌのビゞョンずしお、『「良いもの」を届け続ける』がありたす。 日々珟堎での業務を行っおいるず、 短期的な玍期や自チヌムのメンバヌにしか意識が集䞭するこずが倚く、芖点が狭くなりがちです。 時にはこう蚀ったビゞョンに立ち返り、長期的に組織党䜓や業界党䜓にも目を向け぀぀ 「良いもの」を届け続けるために、自分たちが䜿う技術をより良く倉化させおいくこずは、 組織ずしおも個人ずしおも曎なる成長に繋がるず信じおいたす。 ビゞョンの実珟のために、 地道に䞀歩ず぀䞀緒に取り組んで頂ける゚ンゞニアの方の応募をmedibaではお埅ちしおおりたす。
mediba Advent Calendar 2021 の 18 日目の蚘事です。 こんにちは。゚ンゞニアの䞭畑 @yn2011 です。最近は Switch の月姫で盎死の魔県に぀いお孊んでいたす。 初めに プロダクトを新芏に開発する際に、どんな Lint ツヌルを導入し、どのような蚭定で利甚するかは悩むこずが倚いです。最終的にはチヌムメンバヌず議論をしお決めおいく必芁がありたすが、瀟内倖の他のプロダクトでどのようにしおいるか参考事䟋が欲しい堎合がありたす。業務で開発したプロダクトのコヌドベヌスは瀟倖に公開されるこずは少ないため、他瀟でどのような Lint ツヌルを導入しおいるのかを知る機䌚は少ないです。 そういった背景から、盎近のプロダクト開発においお ① どんな Lint ツヌルを導入しおいるか、② 特に工倫しおいる蚭定は䜕か、 ずいう Lint にフォヌカスした内容を曞いたらどうだろうず考え、今回の蚘事のテヌマずしたした。 昚幎から匕き続き、mediba のプロダクトでは Next.js の採甚が増えおいたす。その䞭のずある Next.js 採甚プロダクトを䟋ずしお今回ご玹介したす。 tsc TypeScript です。Next.js 9 以降は、TypeScript 関連の機胜はビルトむンされおいお yarn build 時に型怜査を行いたすが、型怜査だけを任意のタむミングで行う堎合は、 tsc -p . --noEmit のようなコマンドを実行したす。Lint ツヌルではありたせんが、型怜査のためにだけ䜿甚しおいるので䞀応蚘茉したした。 ESLint ESLint です。Next.js 11 以降は、ESLint 関連の蚭定をビルトむンするようになり、 next lint で実行ず蚭定ができたす。 Next.js 向けのコンフィグずしお、 eslint-config-next がありたす。以䞋のルヌルはオフにしおいたす。 "@next/next/no-img-element": "off", "@next/next/no-html-link-for-pages": "off", "@next/next/next-script-for-ga": "off", "@next/next/no-sync-scripts": "off", Next.js の機胜を掻甚するためのルヌルをなぜオフにしおいるか疑問に思われるかもしれたせんので理由を説明したす。 no-img-element は、Next.js が提䟛する next/image を䜿甚せずに、img 芁玠を䜿甚しおいる堎合に譊告を行うルヌルです。プロダクトでは、SSR ではなく、SSG を䜿甚しおいお next/image は未䜿甚なのでオフにしおいたす。 no-html-link-for-pages は、Next.js が提䟛する next/link を䜿甚せずに anchor 芁玠のみを䜿っおリンクを実装しおいる堎合に譊告を行うルヌルです。next/link を䜿甚するこずで、CSR でペヌゞ遷移を実珟するこずが可胜になりたすが、mediba で利甚しおいる Google Analytics 向けの実装ではペヌゞ遷移時の集蚈に懞念があるこずが分かっおいたす。そういった理由から意図的に next/link を䜿甚しないようにしおいるため、ルヌルをオフにしおいたす。 next-script-for-ga ず no-sync-scripts は、 next/script の仕様をきちんず調査できおいなかったので暫定的に script 芁玠を䜿甚しおいたしたが今埌察応するかもしれたせん。 Stylelint Stylelint です。プロダクトでは、styled-components のような JS in CSS ではなく、 .scss ファむルに定矩した CSS を CSS Modules から利甚しおいるためプロパティの䞊び順の auto fix 等、Stylelint の機胜を党お掻甚するこずができおいたす。 プロパティの䞊び順定矩は、 stylelint-config-recess-order を䜿甚しおいたす。定矩されおいるプロパティの数ずメンテナンスの頻床の面で、他のラむブラリや自身で䜜成するよりも良さそうだったため遞定したした。 たた、 Prettier を䜿甚しおいるので stylelint-config-prettier で競合を防いでいたす。 markuplint markuplint です。HTML Living Standard の仕様に準拠した HTML になっおいるかを怜蚌できたす。React (JSX) にも察応しおいたす。 ルヌルを独自に远加しおいたす。 { "nodeRules": [ { "selector": "meta[property]", "rules": { "invalid-attr": { "option": { "attrs": { "property": { "type": "String" }, "content": { "type": "String" } } } } } } ] } meta 芁玠の属性に぀いおです。SNS でペヌゞを共有された際の挙動を定矩するため、このような meta 芁玠を実装するこずが倚いず思いたす。 <meta content="ペヌゞタむトル"> この実装は markuplint が 2 ぀譊告を出したす。たず、HTML Living Standard の meta 芁玠の仕様には、property 属性が定矩されおいないため譊告を出したす。 たた、name 属性が定矩されおいない堎合に、content 属性を䜿甚するこずができないため、こちらに぀いおも譊告を出したす。 では䞀䜓この属性は䜕なんだ、ずいう話になりたすが、property 属性に぀いおは RDFa で定矩されおおり、 OGP に埓っおこの meta 芁玠を SNS 偎が解釈したす。したがっおここでは䟋倖ずしお取り扱うようにルヌルを倉曎しおいたす。 なお、React 独自の属性 key や dangerouslySetInnerHTML ) は @markuplint/react-spec に含たれおいるため独自にルヌルを远加する必芁はありたせん。䟿利です。 たずめ 盎近の Next.js 採甚プロダクトを䟋に、䜿甚しおいる Lint ツヌルず、その蚭定に぀いおご玹介したした。これらの Lint ツヌルは党お GitHub Actions で commit push をトリガヌにしお実行しおいたすので、ルヌルに違反しおいるコヌドをコミットするずすぐに気づくこずができ、Lint ツヌル運甚の圢骞化を防ぐこずができおいたす。 Lint ツヌルの導入によっお、コヌドベヌスをクリヌンに保぀こずはもちろんですが、暙準仕様やベストプラクティスを知る良いきっかけにもなっおいたす。 Lint ツヌル導入時の参考になれば幞いです。最埌たでお読み頂きありがずうございたした。
はじめたしお、mediba 新卒2幎目 デヌタアナリストの巊海です。 mediba Adventカレンダヌ 10日目ずいうこずで、私からはGTMを䜿甚しお自瀟サむトにMicrosoft Clarity(ヒヌトマップツヌル)を蚭定したお話を曞いおいきたす。 Microsoft Clarityでできるこず Clarityずは、Microsoft瀟から2020幎10月にリリヌスされた無料のヒヌトマップツヌルです。 Clarityでできるこずは、䞻に以䞋の3぀です。 サむト蚪問者数、離脱者数、任意のペヌゞにおけるスクロヌルされた割合など基本数倀を把握できる 1ナヌザヌにフォヌカスしお、サむト䞊でどんな行動をしたのかセッションレコヌディング(録画)できる どこをクリックしお、どこたでスクロヌルしたのかヒヌトマップで芖芚的に可芖化できる 導入線 蚭定手順 GTMを䜿甚する堎合は、以䞋の順に蚭定しおいきたす。 Microsoft Clarity アカりントを䜜成する GTMを䜿甚し、Clarity tracking codeを配信する GTMのプレビュヌで、蚭定したタグが配信されおいるか確認埌、公開する Clarityの管理画面で、正しく数倀が蚈枬されおいるか確認する Microsoft Clarityのアカりントを䜜成する Microsoft Clarity にアクセスし、赀枠箇所をクリックしおアカりントを䜜成したす。その埌、必芁事項を蚘入したす。 GTMを䜿甚し、Clarity tracking codeを配信する Clarity管理画面 > Settings > SetupからClarity tracking codeをコピヌし、GTMのタグ蚭定画面のHTMLに貌り付けたす。 GTM偎で、タグの䜜成ずトリガヌの蚭定を行いたす。 タグの䜜成は、GTM 管理画面 > タグ > 新芏 から䜜成をしたす。タグずトリガヌの蚭定は以䞋の通りです。 タグの皮類カスタムHTML トリガヌの蚭定All Pages 以䞊で、タグの䜜成ずトリガヌの蚭定は完了です。 GTMのプレビュヌで、䜜成したタグが問題なく配信されおいるか確認する GTMのプレビュヌ画面のTags FiredにMicrosoft Clarityタグが確認できたした。問題なく、タグが発火されおいるようです。公開ボタンをクリックしたす。 GTMの蚭定は以䞊になりたす。 Clarityの管理画面で、正しく数倀が蚈枬されおいるか確認する 最埌に、Clarityの管理画面で、問題なく数倀が蚈枬されおいるか確認したす。タグ公開から2時間ほどで、Clarityのダッシュボヌド画面に数倀が反映されたした。 ヒヌトマップのデヌタも反映され、掻甚できるようになっおいたす。 GTM経由で、自瀟サむトにClarityの蚭定が完了したした。 Session Recordingsに぀いお 以䞋の通り、Session Recordingsも掻甚できるようになっおいたす。ナヌザヌのカヌ゜ルの動きが鮮明に閲芧できたす。 掻甚方法の怜蚎 Clarityはどういった堎面で掻甚するこずができるのかを怜蚎したした。ここでは、仮蚭ずしお、任意のペヌゞの次のペヌゞぞの遷移率が枛少傟向であるずしたす。そうするず、以䞋のような課題発芋から意思決定たでの流れがが考えられたす。 課題発芋 たずは、課題を蚭定したす。ここでは、仮の課題ずしお、「任意のペヌゞの次のペヌゞぞの遷移率が枛少傟向である」ずしたす。 珟状把握・芁因調査 GAの定量デヌタを䜿甚し、課題の芁因を突き止めようずしたす。しかし、定量デヌタだけでは、特に芁因が分かりたせん。 次に、Clarityを䜿甚しお、任意のペヌゞで䜕が起こっおいるのかセッションレコヌディングずヒヌトマップで芁因を調査したす。䟋えば非掻性箇所がクリックされおいるような堎合には「誀クリックで離脱しおいる」ず蚀えるかもしれたせん。 方策 方策ずしお以䞋の案が浮かぶのではないでしょうか。 クリックできない箇所をクリックできるように掻性させる 以䞊のように、GAの定量デヌタでは普段発芋できないようなナヌザヌの行動でもClarityを䜿甚すれば、簡単に把握するこずができるでしょう。その結果、意思決定に぀ながるず考えおいたす。 おわりに GTMを䜿甚するこずで、゚ンゞニアに䟝頌せずずも、Clarityを蚭定できるのは䟿利かず思いたす。 Clarityは無料でか぀実装に手間がかかりたせん。そしお、ヒヌトマップやセッションレコヌディング機胜など倚様な機胜も魅力的です。ぜひご自身のサむトにClarityを導入しおみおはいかがでしょうか。 どなたかのご参考になれば、幞いです。
こんにちは。゚ンゞニアの䞭畑 @yn2011 です。千葉県は最高です。 今回は NewRelic ブラりザモニタリング を䜿甚しお JavaScript の゚ラヌ収集を行おうずした際に、NewRelic の゜ヌスマップアップロヌド機胜の仕様で色々ずハマっおしたったずいうお話をしたす。 ゜ヌスマップアップロヌド API に぀いお NewRelic ブラりザモニタリングでは、゜ヌスマップずいうファむルを利甚しお発生した JavaScript ゚ラヌのスタックトレヌスを取埗するこずができたす。 ゜ヌスマップは、以䞋のような内容のファむルです。 { "version": 3, "file": "static/chunks/254-be419541614271942b8c.js", "mappings": "gFAAoEA,... } NewRelic ブラりザモニタリングには゜ヌスマップのバヌゞョン管理機胜があり、゜ヌスマップにナニヌクな識別子をアップロヌド時に付䞎するこずができたす。提䟛されおいる゜ヌスマップのアップロヌド API を利甚しおアップロヌド時に識別子の付䞎ができたす。 publishSourcemap({ sourcemapPath: './dist/bundle.js.map', javascriptUrl: 'https://example.com/assets/bundle.js', ... releaseName: 'OPTIONAL RELEASE NAME', // 远加 releaseId: 'OPTIONAL RELEASE ID', // 远加 }, function (err) { console.log(err || 'Source map upload done')}) releaseName ず releaseId を指定できるこずに違和感を持った方もいるかもしれたせん。これは次項の䌏線です。 ハマリポむント releaseId ず releaseName は䞡方必須 早速䌏線を回収したす。NewRelic ブラりザモニタリングでバヌゞョン管理を行う堎合は、 releaseName ず releaseId の䞡方が必須になりたす。 ドキュメントに蚘茉はないように認識しおいたすが、 @newrelic/publish-sourcemap の実装を確認するず、しっかり条件匏に含たれおいたした。 if (releaseName && releaseId) { console.log('Using release name:', releaseName, 'and release id:', releaseId) request = request.field('releaseName', releaseName) request = request.field('releaseId', releaseId) } コミットハッシュを掻甚する堎合など、どちらか 1 ぀の項目を利甚できれば十分なこずが倚いず思いたす。なぜこのような仕様になっおいるのかは分かりたせんでした。 コンフリクト゚ラヌ ゜ヌスマップのバヌゞョン管理を行わない堎合は、 releaseName ず releaseId を指定する必芁はありたせん。しかし、1 床これらの項目を空でアップロヌドしおしたうず、次にアップロヌドする際に releaseId ず releaseName を指定しおアップロヌドしおもコンフリクト゚ラヌずいうレスポンスが返り、アップロヌドが倱敗したす。 コンフリクト゚ラヌは、NewRelic に同䞀の゜ヌスマップをアップロヌドした堎合に発生する仕様ずなっおいたす。 releaseName ず releaseId が異なる堎合は別の゜ヌスマップずしお解釈されるためアップロヌドが可胜です。 バヌゞョン管理を行う堎合は、1床、 releaseName ず releaseId が空の゜ヌスマップを削陀し、再床アップロヌドする必芁がありたす。 ブラりザ偎で addRelease を呌び出す必芁がある ゜ヌスマップのバヌゞョン管理を行う堎合、ブラりザ偎で browser agent API から次のメ゜ッドを呌び出す必芁がありたす。 newrelic.addRelease(string $release_name, string $release_id) このメ゜ッドを呌び出さないず、発生した JavaScript ゚ラヌを正しいバヌゞョンの゜ヌスマップにマッピングするこずができたせん。メ゜ッドを呌び出さずに JavaScript ゚ラヌを発生させた堎合、NewRelic の画面䞊では releaseName ず releaseId は空になりたす。 addRelease の呌び出しの実装ずしおは、スニペットの末尟ぞの远加が可胜です。 NewRelic ブラりザモニタリングを利甚する堎合は、New Relic から提䟛されるスニペットをブラりザで実行する必芁がありたす。このスニペットの実行埌に、browser agent API が利甚可胜になるため、以䞋のように末尟に呌び出しを远加したす。 // 省略... applicationID:"${config.applicationID}",sa:1}; newrelic.addRelease("foo", "bar"); // 远加 addRelease の呌び出しは、類䌌サヌビスである Sentry では䞍芁であったため、怜蚌時に気づかずハマっおしたいたした。 たずめ NewRelic ブラりザモニタリングの゜ヌスマップに関するハマりポむントを 3 ぀曞きたした。 最終的に、プロダクトでは゜ヌスマップバヌゞョン管理機胜の導入は芋送りたしたが、今埌必芁に応じお察応を怜蚎する予定です。 最埌たでお読み頂きありがずうございたした。
はじめに こんにちは、SRE Unitの北浊( @kitta0108 )です。 圓ブログは、執筆掻動をモブでやったらどうかずいう新しい詊みをしおおりたしお、 テクノロゞヌセンタヌ6G Managerの䞋地さん( @primunu )、 SRE Unitの板谷さん( @mary_tuba )、 そしお北浊の3人でお送りしおおりたす。 さお、皆さんはアプリケヌションの実行基盀ずしおのコンテナむメヌゞを遞定するずき、どのような関心軞を持っお望んでたすか 今回はDistrolessむメヌゞに぀いお、䜕の嬉しみがあるのか、どのような優䜍性があるのかなどを深掘りっおいきたいず思いたす。 皆さんの匕き出しの䞀぀ずしお、知芋に加えおいただけるようなこずがあったならずおも嬉しく思いたす 察象者 むメヌゞを遞定する人 = DockerFileを曞く人 むメヌゞの脆匱性察応を匷めたい人 コンテナサむズの軜量化を远い求めたい人 抂芁 Distrolessずは、Googleが公開しおいるアプリケヌションずそのランタむム䟝存のみが含たれたDebian10(buster)に基づいお䜜成されたコンテナむメヌゞです。 https://github.com/GoogleContainerTools/distroless 必芁な䟝存のみが含たれるずは Distrolessにはアプリケヌションの実行に必芁な䟝存しか含たれおいたせん。 なので、Shellはおろか、aptやcdずいった機胜も有しおいたせん。 だが、それが良い。それで良いのです。以䞋をご芧ください。 この図はAWSのECRにそれぞれ以䞋のプレヌンむメヌゞをプッシュした結果になりたす。 Goのアプリケヌションを動かすずいう前提でむメヌゞを遞んでたす。 alpine:3.13 golang:1.16.5-buster gcr.io/distroless/static-debian10 どうでしょうか。この時点で嬉しみポむントが2぀芋えおいたせんか 嬉しみポむントその1 軜量であるずいうこず Debianの318MBずいうのは眮いおおいおw Alpineの2.81MBず比范しおもDistrolessの0.66MBはめちゃくちゃ軜いです。 コンテナを扱う䞊では、むンフラの振る舞いずしお、スケヌリング性胜や可搬性の向䞊を期埅したいですから、この軜量ポむントは嬉しいですよね。 嬉しみポむントその2 セキュアであるずいうこず 実はこっそりずECRにImage Scanning機胜をONにしおおきたした。 ここでもDistrolessむメヌゞは堂々のNoneの文字が… アプリケヌションを実行する䞊で䜙分な䟝存が含たれないずいうこずは、それだけ脆匱性が露呈する可胜性が䜎くなるこずにも繋がりたす。 コンテナむメヌゞのレむダヌでここを抑えられるのは嬉しいポむントですよね。 むメヌゞのバヌゞョン䞊げ䜜業の頻床も少なくなりそうです。 たずめ 今回はアプリケヌションコンテナのむメヌゞずしおDistrolessを玹介しおみたしたがいかがでしたでしょうか。 利甚しおいる蚀語がDistrolessに察応しおいるのであれば、積極的に利甚を怜蚎しおもいいず個人的には思いたす。 ただし、Distrolessを利甚したむメヌゞの䜜成にはShellが含たれおいないずいう点でちょっずしたコツが必芁になりたす。 時間があったら、むメヌゞの䜜成方法などを具䜓的にしたものを曞いおみようかな…
はじめたしお、2021幎床新卒の朚村です。 フロント゚ンド゚ンゞニアずしお テクノロゞヌセンタヌ5G に所属しおいたす。 今回は、Nuxt.js ならびに TypeScript を利甚しお、簡単な抜遞ツヌルを䜜成しおみた内容に぀いおご玹介したす。 Nuxt.js ず TypeScript Nuxt.js は、Vue.js ベヌスの JavaScript のフレヌムワヌクです。Webペヌゞ構築に有甚な UI 以倖の機胜 Ajax やサヌバヌサむドレンダリングなどをたずめお利甚できる環境を提䟛しおくれたす。 Nuxt.js 公匏サむト TypeScript は、省略可胜な静的型付けずクラスベヌスオブゞェクト指向を加えた JavaScript のスヌパヌセット䞊䜍互換です。䞀蚀で蚀うず「型定矩できる JavaScript 」。 TypeScript 公匏サむト なぜ抜遞ツヌルを䜜ったのか 䞻な理由は、以䞋の2点です。 私の所属するチヌムで扱っおいる Nuxt.js および Typescript の抂芁を掎むため チヌム内でMTGのファシリテヌタが偏っおしたう課題を解決するため 完成物 さっそくですが、完成した物がこちら。 ランダムにナヌザヌを抜遞できるシンプルなツヌルです。 デザむンは近幎流行ったニュヌモヌフィズムを取り入れおみたした。 少ない配色でも凹凞によっお奥行きができるので、シンプルなツヌルでも芋栄えが良くなりたす。 䜿った技術 Nuxt.js 2.15.7 TypeScript 4.2.4 Vue.js 2.6.14 Vuex 3.6.2 firebase 8.7.1 tailwindcss 2.2.4 sass 1.35.1 環境 M1 Mac VSCode yarn 機胜 今回の抜遞ツヌルの機胜は以䞋ずおりです。 ナヌザヌを登録・削陀する ナヌザヌ情報をDBで保持する 登録したナヌザヌからランダムに抜遞する 完了した人・䌑みの人にチェックし、抜遞察象から倖す 抜遞終了埌、遞ばれた人は自動で完了チェックされる 党員チェックしたら䞀括リセットできる 䜜成手順 党䜓的な流れは以䞋のずおりです。 環境構築 各機胜䜜成 Vuex導入 firebase導入 1. 環境構築 create-nuxt-appを利甚しお環境を構築したした。 create-nuxt-app 公匏サむト ず Nuxt.js 入門の蚘事 を参考にしたした。 2. 各機胜䜜成 前述した各皮機胜を実装しおいきたす。 欠垭者の察応 完了した人だけでなく、䌑みの人など抜遞察象から陀倖したい堎合を想定しお、完了チェックずは別に陀倖したいナヌザヌを指定できるようフラグを持たせおいたす。 コンポヌネントに぀いお 個人的に苊劎したのはコンポヌネント呚りです。 たず、どのくらいの単䜍で区切れば良いのかがわかリたせんでした。 そこで今回は Atomic Design を参考に切り出したした。 たた、他の箇所でも䜿えるように汎甚的に䜜るこずです。 クリックなどのむベントは党お芪ぞ枡し、スタむルや衚瀺の倉曎は芪から倀を枡すようにするこずで、atoms単䜍のコンポヌネントがどこでも䜿えるよう心がけたした。 䟋えばボタンコンポヌネントは、予めいく぀かのスタむルを定矩しおおき、芪コンポヌネントで䜿うずきに䞋蚘のように props で必芁なスタむルを枡すずずもに、$emit でクリックむベントを芪に枡しおいたす。 //Button.vue <div> <button :class="[ colorStyle[buttonColor], sizeStyle[buttonSize], fontStyle[buttonFont], ]" @click="$emit('button-click')" > <slot></slot> </button> </div> //Input.vue <Button button-color="gray" button-size="short" button-font="small"> ADD </Button> そしおコンポヌネント間のデヌタの受け枡しです。 䟋えばナヌザヌ情報は、子から emit で芪コンポヌネントに倀を匕き枡し、さらに別の子コンポヌネントに props で枡しお衚瀺しおいたす。 今回はシンプルなツヌルなのでコンポヌネントも少ないですが、こうした受け枡しが重なっおくるずコヌドが煩雑になりメンテナンスがしづらくなりたす。そこで、Vuex を導入し状態管理をするこずにしたした。 3. Vuex 導入 Vuex のストアでナヌザヌ情報の状態を管理したす。 今回はDBも䜿う予定なので、actions でDBに接続した埌、倀を state に反映させおいたす。 Nuxt.js は store ディレクトリにファむルを䜜成するだけでストアを有効化しおくれるので䟿利ですね。今回は管理するのがナヌザヌ情報だけなので、index.ts を䜜らず users.ts を盎䞋に䜜りたした。 Vuex ストアでデヌタを䞀元管理できるので、本圓にわかりやすくなりたした。コンポヌネントを超えお共有される情報を管理するには、ずおも匷力なツヌルだず思いたす。 䞀方で、Vuex を䜿甚する際には、泚意点もありたす。 䟋えば、小さいレベルのコンポヌネントからは Vuex を䜿甚しない方が良いでしょう。 コンポヌネントの䜿い回しが難しくなるのず、画面の䞭で耇数の箇所から Vuex のストアぞの参照ず倉曎が入り組んだ堎合、凊理が远いにくくなるためです。 参考 Vuexはなるべく避ける     Vuexで䜕をするか、䜕をしないか Vuex を利甚する際は、 Atom や Molecule レベルのコンポヌネントの䞭では䜿わない 、 state を盎接参照しない 、などのルヌルを蚭けお運甚したいず思いたす。 4. firebase 導入 DBずデプロむは firebase を利甚したす。 firebase は以前にも䜿ったこずがありたしたが、やはり firestore を䜿えば面倒な手間をかけずにDBが実装できたすね。䞇歳。 デプロむも firebase の Hosting を䜿っお行いたした。 さらに、今回は瀟内向けツヌルなので、デプロむにあたり倖郚からのアクセスを制限するため、 Authentication を䜿甚しおログむン認蚌を远加したす。管理者アカりントずしおナヌザヌを䞀人だけ登録し、簡単なPWを打おば誰でも䜿えるようにしたした。 ログむンしおいない状態では認蚌埌のペヌゞぞ飛べないようにするため、匷制的にindexぞリダむレクトするmiddlewareも远加しおいたす。 const auth = firebase.auth() const middleware: Middleware = ({ route, redirect }) => { auth.onAuthStateChanged((user) => { if (!user && route.name !== 'index') redirect('/') }) } たた、Authentication の認蚌状態は、デフォルトではナヌザヌがブラりザを閉じた埌でも氞続的に維持されるようになっおいたす。 今回は管理者アカりント䞀぀だけの䜿甚になるため、ログアりトせずにりィンドりを閉じおしたうず、他の人がアクセスした時でも前のセッションが続くこずになりたす。 そこで、 firebase.auth().setPersistence メ゜ッドで氞続性タむプを SESSION に倉曎するこずで、りィンドりやタブを閉じるたびにログむン状態がクリアされるようにしたした。 ちなみに、Nuxt.js には nuxt/firebase ずいうモゞュヌルがありたす。firebase をより簡単に利甚できるので、興味があればご芧ください。 詰たったずころ sass の導入 sass の導入で沌りたした。どうやら node のバヌゞョン16 か぀ M1チップ だず node-sass が動かないようです2021/09 執筆時点。node のバヌゞョンを䞋げるこずで解決したした。 型定矩 Vuex での型定矩、props での型定矩、firebase で扱う日時の型定矩  型掚論が効かず、気づけばanyになっおいる型に苊しめられたした。 特に Vuex は、ストアぞアクセスするための䟿利な型がなく、今回䜿甚した this.$store は Nuxt.js で型指定されおいたせん。 自前の型を䜿うか、 nuxt-typed-vuex を利甚するこずで改善するしかないようです。 たた、 TypeScript ず Vuex の盞性は良くなく、コンポヌネントから store を呌び出したずきに型安党が守られない、むンテリセンスが効かないずいった問題がありたす。 次に TypeScript で Vuex を扱う際は、Nuxt.js 公匏で掚奚されおいる vuex-module-decorators を䜿甚したいず思いたす。 振り返り さお、ここたで長々ず曞いおきたしたが、今回のアりトプットを通しお Nuxt.js ず TypeScript の抂芁は倧䜓掎めたかな、ずいう感じです。 結論、Nuxt.js 䟿利 日本語ドキュメントが充実しおいおほが誰でも簡単に始めるこずができる ルヌティングを自分で䜜成する必芁がない SSRなどモヌドを遞べるお柔軟なサむト蚭蚈ができる  など、Nuxt.js を䜿うこずで盎感的にDOMの内容を操䜜でき、より簡単に抜遞ツヌルを䜜るこずができたした。 たた、TypeScript に぀いおも、型定矩のおかげで、コンポヌネント間のデヌタの受け枡しでもどういう型か刀断でき、コヌドが芋やすくなりたす。 さらに、力補完のおかげでコヌドを曞く時間を短瞮できる、゚ラヌチェックを機械に任せるこずができる、など倚くのメリットがありたした。 䞀方で、Vuexずの連携は公匏で掚奚されおいるパッケヌゞを䜿うなど、改善の䜙地がありたす。 最埌に 以䞊、Nuxt.js を利甚しお抜遞ツヌルを䜜成しおみた内容の玹介でした。 最埌たで読んでいただき、ありがずうございたした。 どなたかの参考になれば幞いです。
こんにちは。゚ンゞニアの䞭畑 @yn2011 です。8 月から千葉県民になりたす。 先日、新チヌム発足にあたり、チヌムビルディングのワヌクショップずしお有名なむンセプションデッキの䜜成にチャレンゞしたした。その際に改めおむンセプションデッキに぀いお勉匷し盎したのですが、 実際にチヌムがどういった経緯で、どのようにむンセプションデッキを䜜成したか 、ずいう具䜓的な事䟋の公開が少ないなず感じたした。 そこで今回は、私達が ① なぜむンセプションデッキを䜜成し、② どのようにワヌクショップを進めたのか、③ そしお䜕が埗られたのか に぀いお曞きたいず思いたす。 なぜむンセプションデッキを䜜成したか 新チヌム発足 新プロダクトの開発が決たり、ビゞネスチヌムが先行しお䌁画ず芁求の掗い出しを行っおいたした。ある皋床の敎理が完了したため、デザむナヌず゚ンゞニアが合流し、本栌的に開発を始めおいくぞ、ずいう経緯で新しいチヌムが圢成されたした。 したがっお、ここで蚀う「チヌム」ずは、特定の職皮のみで構成されたチヌムではなく、ビゞネスのメンバヌやデザむナヌ等プロダクト開発に必芁な党おの職皮を含むチヌムです。 ちなみに、゚ンゞニア同士、ビゞネスのメンバヌ同士はこれたでも同じチヌムで仕事をしおいたしたが、゚ンゞニアずビゞネスのメンバヌ同士はほが䞀緒に仕事をしたこずがありたせんでした。 䜕が課題だったか デザむナヌず゚ンゞニアは途䞭からビゞネスチヌムに合流したわけなので、これから開発するプロダクトの目的やプロゞェクトずしお䜕を重芁芖しおいるのか等をしっかり理解できおいたせんでした。したがっお、 プロダクトの芁求事項が曞かれたドキュメントを読んでも、それが適切なのか、なぜ必芁なのかずいう郚分の理解や玍埗床が䜎い 状態でした。 たた、プロダクトの開発を始めるためには、芁求を芁件に萜ずし蟌んだ䞊で初回にリリヌスをする範囲(MVP) を決める必芁もありたした。 どうするか この 2 ぀の課題に぀いお、チヌムメンバヌず盞談し、むンセプションデッキを䜜成するこずず、ナヌザヌストヌリヌマッピングを行うこずで課題を解決するこずになりたした。なお、この蚘事ではむンセプションデッキに぀いおのみ取り扱いたす しかし、やろうずいうのは簡単ですが、実際に私がむンセプションデッキ䜜成のワヌクショップを䌁画するにあたり、いく぀もの課題に盎面するこずずなりたした。ずおも珟堎感溢れるものです。 䟋えば時間の面では以䞋の課題がありたした。 参加しお欲しい関係者は 15 人以䞊で、党員が参加可胜な日皋の調敎が難しい 既に倚くの予定が組たれおいお、1 時間以䞊の時間の確保が難しい プロダクトのリリヌス日は倧たかに決たっおいたこずから、できるだけ早く完了させなければいけない これらの制玄から、むンセプションデッキは 10 個の項目で構成されおいたすが、重芁だず思ういく぀かの項目を遞択し、それ以倖の項目は怜蚎察象から倖したした。そしお、ワヌクショップは 1 回 1 時間で、耇数回に分割するこずずしお、䜕ずか党員参加のワヌクショップ実斜の芋通しを立おるこずができたした。ちなみに、参加可胜なメンバヌだけで実斜しお埌で結果を共有する、ずいったやり方はせず極力党員参加に拘りたした。むンセプションデッキは結果ず同じぐらい構築過皋の議論が倧事だず考えおいたためです。 たた、内容の面では以䞋の課題がありたした。 むンセプションデッキのワヌクショップを実際にファシリテヌトした経隓のあるメンバヌがいない そもそもむンセプションデッキを知らないメンバヌも倚い これらに぀いおは、私が曞籍や Web から情報を埗぀぀創意工倫しお実斜しおいくこずになりたした。 どのようにむンセプションデッキを䜜成したか 怜蚎の結果、ワヌクショップのアゞェンダは以䞋になりたした。かなり厳遞し、最䜎限必芁だず思う 3 ぀の項目のみを遞びたした。 自己玹介 むンセプションデッキの説明 我々はなぜここにいるのか ゚レベヌタヌピッチ トレヌドオフスラむダヌ 分割しおワヌクショップを行うこずにしおいたので、初回は「我々はなぜここにいるのか」たでで、次回に残りのアゞェンダを消化したした。 では、それぞれどのように進めおいったのか、圓日の様子ず合わせおお䌝えしおいきたす。「自己玹介」、「むンセプションデッキの説明」に぀いおは䞀般的なものなので省略したす なお、付箋を䜿いたいこずず、原則圚宅勀務のため Miro を䜿甚しおオンラむンで実斜したした。 我々はなぜここにいるのか 「我々はなぜここにいるのか」は、プロゞェクトの目的に぀いお認識を合わせるためのワヌクショップです。 最初に個人ワヌクの時間を取っお、1 人ず぀自分の考えを付箋に曞いおもらいたした。その埌に共有の時間を取り、ファシリテヌタヌが補足や質問ず、䌌おいる意芋のグルヌピングをしおいきたした。 こちらが実際のワヌクショップの結果です。 グルヌピングは難しいですが、倧きくは定性的なものず定量的なもので 2 ぀に分けたした。䞊の図では 3 ぀に分かれおいたすが、定性のものを曎に 2 ぀に分割しおいたす。 䟋えば、定性的な目的は「ナヌザに〜ずいう䟡倀を提䟛する」等で、定量的な目的は「利甚率 x % 向䞊」等です。 基本的にどの意芋も間違っおいるずいうこずはないのですが、どうしおも定性的なものほど達成できたかどうかを刀断しにくく解釈にもブレがありたす。定量的で、 達成できなければプロゞェクトが解散になるものはどれか ず問い盎すこずで、明確な目的を探しおいきたした。ここは前提ずなっおいるむンプットの差もあるので、ビゞネスチヌムの方々にリヌドしお決めお頂きたした。ただし、今回はこの時点では具䜓的な数倀たでは盛り蟌めたせんでした。ひずたずはプロゞェクトが向かっおいく方向の認識を合わせるこずが倧事なので、蚈枬可胜な指暙であるならば良いのかなず思いたす。 ゚レベヌタヌピッチ ゚レベヌタヌピッチは、事前に甚意されたテンプレヌトを埋めるこずで、プロダクトの骚栌を明らかにするワヌクショップです。 ちなみに、通垞 ゚レベヌタヌピッチは 1 プロダクトに察しお䜜成したすが、今回は関連するプロダクトが耇数存圚しおいたので同じ時間に耇数の゚レベヌタヌピッチを䜜成したした。耇数プロダクトを同時に開発する必芁があったのです珟実は教科曞通りにはいかないずいうこずが実感できたす ゚レベヌタヌピッチの進め方ずしおは、テンプレヌトの項目を 1 ぀ず぀埋めおいく方法を取りたした。1 ぀の項目毎に、個人ワヌク → 共有 → グルヌピング → 最終的な答えずいう手順を螏みたした。初めは、䞀気に党おの項目を埋めおもらい 1 人ず぀共有しおもらったのですが、付箋の敎理がしにくいのず、最初の項目の認識が合っおいないず埌半の内容も異なっおくるのでやり方を倉えたした こちらが実際のワヌクショップの結果です。右の付箋が個人ワヌクで曞いお頂いたもので、巊の赀い付箋が敎理した結果です。 ゚レベヌタヌピッチで意芋が分かれやすかったのは「ナヌザは誰なのか」ず「差別化芁玠は䜕なのか」でした。定矩が難しいからなのか、 経隓䞊この郚分が曖昧なたたプロダクトの開発が進行するこずも倚いので最初に確認できる のはこのワヌクショップの利点だず感じたした。 トレヌドオフスラむダヌ トレヌドオフスラむダヌはプロゞェクトプロダクトで䜕を倧切にするかの優先順䜍を決めるワヌクショップです。 今回はプロダクトずいうよりは初回のリリヌスたでに時間を区切ったプロゞェクトずしおの優先順䜍ずしお怜蚎したした。 けっこう悩みたしたが、進め方は以䞋にしたした。付箋をドットシヌルずしお利甚するむメヌゞです 個人ではなく職皮ごずに色分けした付箋を利甚する゚ンゞニアなら黄色等 個人毎に自分の職皮に該圓する付箋を利甚しお、1 番優先順䜍が高いず思うものに投祚 次に 1 番優先順䜍が䜎いず思うものに投祚 投祚結果を元にプロゞェクトずしおの合意を圢成する こちらが実際のワヌクショップの結果です。今回は郜合により予算は怜蚎から倖したした予算の増枛が実質的に䞍可 スラむダヌの各項目は、スコヌプ、時間、品質等の蚀葉が䜿われたすが、必芁に応じお蚀い換えを行うこずによっお参加者の認識霟霬を防いでいたす。 個別の芁玠の評䟡倀が 2 なのか 3 なのかずいった郚分はあたり議論せず、重芁なものに぀いおざっくりず認識を合わせたした。優先順䜍が䞭間のものに぀いおは、正盎あたりプロゞェクトの進行䞭に意識されるこずは少ないず思ったためです。たた、個人毎ではなく、職皮毎にしたのは参加人数が倚いためです。職皮毎の傟向を倧たかに把握した方が効率良く議論できるず考えたした。 トレヌドオフスラむダヌによっお、 リリヌスの期日に察するステヌクホルダヌの枩床感等、プロゞェクトの制玄に぀いお党員の認識を揃えるこずができる のは利点だず感じたした。たた、プロゞェクト䞭盀での機胜远加や方針倉曎に察しお、トレヌドオフスラむダヌの優先順䜍に埓っお意思決定や議論を行える点も魅力的です。 むンセプションデッキをやっおみおどうだったか むンセプションデッキのワヌクショップの終了埌に、参加者の方々から感想を頂きたした。 むンセプションデッキの䜜成がどういったものか知るこずができた ワヌクショップ圢匏で議論ができたこずによっお、プロダクトに぀いお理解が深たったり認識霟霬があるこずに気づけた ずいったポゞティブな感想を頂きたした。むンセプションデッキによっお、 圓初の課題であった「プロゞェクトの目的や䜕を重芁芖しおいるのかの理解䞍足」を補うこずに貢献できたず蚀えそうです 。 たた、プロダクトに぀いおも゚レベヌタヌピッチによっお耇数芳点から議論するこずで、以前より理解が深たりたした。 テンプレヌトが決たっおいるこずによっお、芳点挏れが少ないのず、質問しにくいこずも党お議題に乗せるこずができる のも良かったです。次の工皋であるナヌザヌストヌリヌマッピングを行うための最䜎限の共通認識の圢成にも圹立ちたした。 䞀方で 発蚀に偏りがある ツヌルの䜿い方には少し戞惑った 最終的なたずめをもう少ししっかりやりたい ずいった意芋も頂けたした。 発蚀の偏りに぀いおは、私のファシリテヌション胜力が足りおいないのず、ワヌクショップの時間にゆずりを持たせるこずができなかったこずも䞀因だず思いたす。時間に远われおいお、進行を優先しすぎおいたした。 ファシリテヌションの際には、 むンセプションデッキを完成させるこずだけが目的ではなく、党員でフラットな議論をするこず・共通の認識を䜜るこずも意識するこずが倧事 ずいう孊びがありたした。 たた、最初に Miro の䜿い方に慣れる時間や、最埌にむンセプションデッキ党䜓を振り返る時間も考慮したアゞェンダを䜜成するずより良いものになりそうです。 たずめ 新チヌムの発足にあたり、むンセプションデッキの䜜成を行うに至った経緯ず、ワヌクショップの実斜方法、その結果埗られた成果や知芋に぀いお曞きたした。 新しいプロゞェクトを始める際や既存のプロゞェクトの方向性が曖昧になっおしたっおいるず感じられおいる方は、むンセプションデッキの䜜成に挑戊しおみるず䜕らかの手がかりになるかもしれたせん。 最埌たでお読み頂きありがずうございたした。
はじめに はじめたしお、2021幎4月新卒入瀟の土屋( @hrktcy )です。バック゚ンド゚ンゞニアずしお6月にテクノロゞヌセンタヌ Eng6G に所属したした。 背景 Eng6G では スマプレチャレンゞ ず呌ばれるサヌビスを、サヌバレスなシステムを構築しお開発・保守・運甚しおいたす。たたバック゚ンドには Go を採甚しおおり、比范的モダンな技術スタックによるプロダクト開発が行われおいたす。 [参考]mediba に入瀟したらアゞャむル志向のチヌムで最高だった件〜モブワヌク無双でテレワヌクを超越したす〜 Go は基本的に暗黙的型倉換が認められないため、開発関連のタスクを党おモブで行う匊チヌムにおいお、ナビゲヌタヌがレビュヌしやすいずいうメリットがありたす。たたモダンな技術を扱うこずで、゚ンゞニアずしおの垂堎䟡倀も高たるず考えおいたす。 そこで Go 未経隓の私がバック゚ンド゚ンゞニアずしおゞョむンするにあたり、孊習ずアりトプットを兌ねお、本皿では  Go でスクレむピングした  mediba+  の蚘事を Slack に投皿するバッチを䜜った話 を備忘録ずしお残したいず思いたす。 開発環境 M1 Mac Docker 20.10.7 Golang 1.14 Terraform 1.0.1 AWS provider 3.49.0 事前準備 Slack API トヌクンを生成しおおく Slack に投皿する App を䜜成し、予め API トヌクンを取埗しおおきたす。   Slack API  ぞアクセス 「  Create an app  」をクリック 「  Create New App  」をクリック 「 名前 」ず「 ワヌクスペヌス 」を指定する アプリを䜜成した埌に衚瀺されたペヌゞで「  Permissions  」をクリック 「  Scopes  」の項目で  chat:write  暩限を蚭定 「  Install App to Workspace  」をクリックし API トヌクンを取埗する バッチの仕様を固める Go でスクレむピングした mediba+ の蚘事を Slack に投皿するにあたり、たずはバッチの仕様を固めるこずにしたした。 スクレむピング方法 スクレむピング系のパッケヌゞ(  goquery  , etc. )を甚いるこずもできたすが、今回は mediba+ の RSS フィヌドをパヌスするこずでスクレむピングを行いたす。圓たり前ですがスクレむピング先の情報が曎新される床にフィヌドの内容は倉曎されたす。バッチ実行時点の日時ず、スクレむピング先の蚘事日時を参照する必芁がありたす。そこで今回は、バッチ実行時点の日時に曎新された蚘事のみを Slack に投皿するようにしたす。 同䞀蚘事を重耇しお投皿しない バッチを実行するたびに同䞀蚘事が投皿されるのは避けたいです。これに぀いおはテヌブルにスクレむピングした蚘事情報を栌玍しおおき、 Slack に投皿する文章を生成する前段階で、蚘事が投皿されたものなのかを刀定する必芁がありたす。 バッチの運甚方法 バッチプログラムを任意の日時に実行されるような環境を敎えたいです。これに぀いおは ECS Fargate + CloudWatch Events で任意の日時にバッチが実行されるような環境を構築するこずで解決したす。本皿では以䞋のシステムを構築したした。本システムは Terraform によっお䞀元管理しおいたす。 ゜ヌスコヌド 1. DB ぞ接続する Go の OR マッパヌずしお提䟛されおいる  gorm  を甚いお、 env ファむルに蚘茉した DB の情報から接続を行いたす。 DBTYPE := "mysql" USER := os.Getenv("USER") // ナヌザ名 PASS := os.Getenv("PASS") // パスワヌド ENDPOINT := os.Getenv("ENDPOINT") //゚ンドポむント DBNAME := os.Getenv("DBNAME") //デヌタベヌス名 CONNECT := USER+":"+PASS+"@tcp("+ENDPOINT+":3306)/"+DBNAME+"?charset=utf8&parseTime=True&loc=Local" db, err := gorm.Open(DBTYPE, CONNECT) if err != nil { fmt.Println("DB接続倱敗") panic(err) } fmt.Println("DB接続成功") 今回接続先のテヌブル情報は䞋図の通りです。 蚘事タむトル(title)ず URL (link)、投皿枈み刀定(status)の3぀のカラムを定矩しおありたす。 2. mediba+ の蚘事をスクレむピングする RSS フィヌドからバッチ実行時の日時に投皿された蚘事をスクレむピングしテヌブルぞ insert したす。フィヌドの取埗には  gofeed  を甚いたす。 # mediba+をスクレむピングする fp := gofeed.NewParser() feed, _ := fp.ParseURL("https://koho.mediba.jp/feed/") 倉数 feed にはパヌスされたフィヌドが栌玍されおおり、 feed.Items で投皿蚘事党おを取埗するこずができたす。今回はバッチ実行時点の日時に曎新された蚘事のみを取埗するために、芁玠1぀1぀を for 文で回し、各蚘事の投皿日時ずバッチ実行時の日時を比范したす。 比范するにあたり、パヌスされた PubDate(UTC) は string 型なので time 型ず比范するこずができず、スクレむピング先によっおはフォヌマットも違う可胜性があるため合わせおあげる必芁がありたす。たた PubDate を JST にする必芁もありたす。 こちらに぀いおは RFC1123Z フォヌマットで統䞀したした。たず PubDate を time.Parse で倉換したす。さらにそれを RFC1123Z のフォヌマットに倉換し、タむムゟヌンを JST にするこずで、投皿日時ずバッチ実行時の日時を比范したす。公匏フォヌマットは こちら から参照できたす。 // RSS構造䜓 type Article struct { link string published string } // RSSのPubDateを文字列→日時の型に倉換、それをRFC1123ZのFormatに倉換し、タむムゟヌンをJSTにする for _, item := range feed.Items { m := make(map[string]Article) if item == nil { break } var timeParse = time.Time{} timeParse, _ = time.Parse(time.RFC1123Z, item.Published) pubDateJST := timeParse.In(time.FixedZone("Asia/Tokyo", 9*60*60)).Format(time.RFC1123Z) // 以䞋Insert凊理 ... } 投皿日時ずバッチ実行時の日時が同じ時、構造䜓 m に蚘事の情報を栌玍し、 gorm を甚いおテヌブルに insert すれば OK です。このずき、 status カラムにはデフォルト倀ずしお false を入れおおきたす。 3. Slack に投皿する Slack に投皿する凊理は以䞋の通りです。 // envファむルに蚘茉したAPIトヌクンからクラむアントを生成する tkn := os.Getenv("TOKEN") c := slack.New(tkn) _, _, err := c.PostMessage("#チャンネル名", slack.MsgOptionText( " テキスト " , true)) if err != nil { panic(err) } else { fmt.Println("投皿完了") } テヌブルに栌玍されおいる、投皿日時がバッチ実行時の日時ず同じ䞔぀ status が false の蚘事のタむトルずリンクを取埗し、 slack.MsgOptionText の第䞀匕数に代入したす。蚘事1぀1぀を連投するず Slack の通知が倚くなり煩わしく感じるので、 string 配列の䞭に取埗した蚘事ずタむトルを append しおいき、 strings パッケヌゞの strings.Join を甚いお、各芁玠を結合しおから投皿凊理を行うようにしたした。 投皿凊理が完了したら gorm を甚いお status カラムの倀を true に update するこずで、バッチを実行し盎しおも同じ蚘事を再床 Slack に投皿しないようにしたす。たた党おのク゚リ操䜜はトランザクション内で行うようにし、返っおきた err が nil かどうかを芋おロヌルバック、コミットを刀断するようにしたす。 実行結果 無事バッチが動䜜するこずを確認できたした。 バッチの実行時間は倧䜓1秒でした。 ぀たづいたずころ Dockerfile の蚭蚈 バッチプログラムでは  Go Modules  ずいう倖郚パッケヌゞ管理システムを甚いおいたす( Go Modules を䜿甚する堎合、 Go のバヌゞョンは1.11以䞊である必芁がありたす)が、 Docker むメヌゞをビルドする際に毎回 Go Modules のダりンロヌドが走るため、バッチの実行時間が長くなっおしたうずいう問題がありたした。たた M1 mac でビルドした Go むメヌゞを ECR に Push するず、自動的に Go むメヌゞが linux/arm 版になっおしたうようでした(蚘事執筆時点)。こちらに぀いおは、  Docker Buildx  で linux/amd64 でビルドし ECR に Push するこずで察応できたしたが、実行時間問題は解決しおいたせん。 そこで  Multistage Build  を採甚するこずにしたした。開発環境甚のむメヌゞの䞭でビルドを行い、生成されたシングルバむナリを本番環境甚の Alpine むメヌゞに移すこずで、倧幅なメモリ削枛ができるだけでなく実行時間も短瞮するこずが可胜です。 FROM amd64/golang:1.15-alpine AS builder WORKDIR /go/src/tsuchiya COPY . /go/src/tsuchiya ENV GO111MODULE=on RUN CGO_ENABLED=0 GOOS=linux go build -o api main.go FROM alpine:latest WORKDIR /root/ COPY --from=builder /go/src/tsuchiya/api . CMD ["./api"] コン゜ヌルから ECR のプラむベヌトリポゞトリを芗いおみたす。 むメヌゞサむズを確認するず100 MB 以䞊削枛されおいるこずが分かりたした。 おわりに スクレむピングした mediba+ の最新蚘事を Slack に投皿するバッチを䜜りたした。静的型付け蚀語に苊手意識を持っおいた私ですが、 Go は構文もシンプルなため、ずおも楜しく実装たで取り組むこずができたした。 なおご存知だずは思いたすが、スクレむピングは盞手先のサヌバにアクセスするため短時間で倧量のアクセスを行うのは NG です。迷惑がかからないよう十分配慮をしたしょう。 最埌に、 mediba では䞀緒にモノづくりができる゚ンゞニアを募集しおいたす。 少しでもご興味がありたしたら こちら からどうぞ。
こんにちは。テクノロゞヌセンタヌ6GでManagerをしおいる䞋地( @primunu )です。 メンバヌずの雑談でたたに話題になる゚ンゞニアのキャリアパス。 どのキャリアを遞択するかはもちろん各々が決定したすが、昚今の゜フトりェア゚ンゞニアのキャリアパスは倚様か぀、組織によっお若干圹割が異なる事があるので、目指す方向がわからず迷子になる事があるず盞談を受けたした。 そこで䞀床立ち戻り、medibaではどんなキャリアパスがあるのかたた、どのような圹割なのかを敎理を含め図解しおみたした。 キャリアパスの抂芁 圹割を図解した所、23のキャリアがありたした。 その䞭でもむメヌゞが付きにくい、たたは他瀟ず若干領域に乖離があるキャリアを重点的に説明しおいきたす。 ※ マネヌゞャヌ/PjMはこちらを参照䞋さい SRE 䞻な業務はAWS党䜓管理や、むンフラ管理や構築、SLO/SLA/SLIの定矩、セキュリティ、バゞェット管理、トむルの掗い出しやトラッキング等が䞻な業務になりたす。なお、IaCやアヌキテクチャ蚭蚈はリヌドバック゚ンド゚ンゞニアやテックリヌドが実斜する事が倚いです。 むンフラ組織から名前がSREに倉わった背景があるので、SREずいう職胜のコミットメント領域がただ䞍明確ずいう課題があり、組織の玍埗床を高める為にも定矩したいず考えおいたす。 ※ SRE奮闘蚘 に今埌蚘茉しおいきたす。 リヌド゚ンゞニア(セキュリティ゚ンゞニア含) 豊富な知識・経隓から最適なアヌキテクチャを遞定し、技術遞定を行いながらPoCを回し、技術で牜匕しおくキャリアになりたす。埌述するテックリヌドず䌌た振る舞いしたすが 倧きな違いは圱響範囲 になりたす。リヌド゚ンゞニアの圱響範囲はチヌムになりたすが、テックリヌドは組織党般に及びたす。 ここたで蚘述するず゚ンゞニアリングしかしないず思われがちですが、ステヌクホルダヌずの䌚話も行いも各メンバヌぞの教瀺も行うので、 ただコヌドを曞くキャリア ではありたせん。 テックリヌド予備軍のキャリアなのでテックリヌドず連携をしプロダクトの技術的意思決定を行いたす。 システムディレクタヌ medibaでは完党自瀟開発の䌚瀟ではなく、プロダクトによっおは受蚗開発もありたす。 珟時点だず受蚗開発プロダクトのみのキャリア になり、そこでステヌクホルダヌず技術ナレッゞを掻かしながらディレクションを行いたす。ディレクタヌずいう事もあり提案や、芁件定矩はもちろんの事、ファシリテヌタも行いたす。ステヌクホルダヌや協力䌚瀟・倖郚䌚瀟ず技術的な䌚話ができ、意思決定ができ必芁があるので〇〇゚ンゞニアの䞊玚職になるず感じおいたす。 プロゞェクトリヌダヌ プロダクトによっおPjMず責務が被る事がありたすが、開発チヌムオンリヌのチヌムや、8人未満の小芏暡チヌムのリヌダヌがmedibaで蚀うプロゞェクトリヌダヌになりたす。 サヌバントリヌダヌではなく前に出お匕っ匵っおいくリヌダヌ ずなりたす。 ステヌクホルダヌずの䌚話はもちろんの事、スケゞュヌル管理や、チヌムビルディングも行いたす。チヌムによっおはスクラムマスタヌがプロゞェクトリヌダヌを兌任する事が倚いず感じおいたす。ハヌドスキルず゜フトスキルの䞡面を求められるので、マネヌゞャヌを目指す方が通るキャリアになりたす。プレマネバランスですが感芚倀ずしおプレヌダヌ7、マネヌゞャヌ3です(個人の感想です)。 そんなプロゞェクトリヌダヌですが、 マネヌゞャヌずの倧きな違いはピヌプルマネヌゞャヌず組織ぞのコミットメントの有無 になりたす。チヌムぞのコミットメントは圓然ですが、組織ぞの干枉は䜎く、ピヌプルマネヌゞメントは盎属マネヌゞャヌの責務になりたす。 品質管理リヌダヌ 品質管理はスポットで入る事が倚く、協力䌚瀟ず連携する事が倚いです。そこで詊隓項目䜜成やスケゞュヌル確認、SLA的に問題ないか実斜、確認するず平行し、協力䌚瀟ずの連携や契玄、統率を行うのが品質管理リヌダヌになりたす。品質管理の知識以倖にも他瀟を巻蟌み組織しなければらないので、 メンバヌをたずめ組織するスキル が求められたす。E2Eテストのシナリオを蚘述したり品質管理におけるPDCAを回す所たでは介入できおおらず今埌の課題ずなっおいたす。 なお、品質管理ずテスタヌの倧きな違いは芁件から詊隓項目䜜成ができるの有無です。 テックリヌド テックリヌドずは完結に蚀うず、リヌド゚ンゞニアの䞊䜍職になり、リヌド゚ンゞニアの箇所でも觊れたしたが、圱響範囲が組織党般ずなりたす。厳密にこれを実斜する等はなく、PjMを実斜したり、PoCを回したりず技術的な意思決定を䞻導し掚進したす。コヌドの品質管理はもちろんの事、チヌム党䜓の生産性、アヌキテクチャ・蚭蚈も行うので広さず深さの䞡面を求められたす。 なお、 medibaのテックリヌドはマネヌゞャヌではなく 、成長支揎等は行やメンタリングは適宜行うもののコミット領域ではなく、あくたでも技術でリヌドしプロダクトの成功に寄䞎するキャリアになりたす。 Unitマネヌゞャヌ、マネヌゞャヌ、シニアマネヌゞャヌ。䜕が違うの 现かい違いはあるものの、 倧きな違いは管蜄するチヌムの皮別ずコミット領域、比率 になりたす。 Unitマネヌゞャヌはプロダクト暪断チヌム、マネヌゞャヌずシニアマネヌゞャヌはプロダクトに匷く関わるマネヌゞャヌになりたす。マネヌゞャヌずシニアマネヌゞャヌの圹割は倧きく倉わりたせんが、 シニアマネヌゞャヌの方が組織ぞのコミットメント が求めれたす。 PO(プロダクトオヌナヌ)や、PM(プロダクトマネヌゞャヌ)のキャリアパスは Biz職からのPO/PMのキャリアパスはあるものの、POの業務範囲に゚ンゞニアに銎染みが薄いPL管理が含たれおいるのが起因しおいるせいか、 ゚ンゞニアずしおのPO/PMのキャリアを描けおいたせん 。 【翻蚳】プロダクトマネゞメントトラむアングル にあるように、プロダクトは開発者、ナヌザヌ、ビゞネスの 3 ぀で構成されおおり、゚ンゞニア芖点は必芁䞍可欠だず認識しおいたす。 ゚ンゞニアリング、デヌタ分析、゚ンゞニアずのコミュニケヌションず蚀った領域をカバヌできるのぱンゞニア出身のPO/PMの匷みだず感じおおり、 プロダクトの意思決定を玠早く刀断できる ず感じおいたす。 先述の通りただ゚ンゞニアのキャリアずしお描けおいないのもの、珟堎ではマネヌゞャヌや、テックリヌドが䞭心ずなり゚ンゞニア領域をカバヌしおいたす。マルチタスクになっおしたうので、キャリアパスにない事を組織課題ず捉え、PO/PMのコミット領域を明確にし、キャリアパスずしお描きたいず考えおいたす。 たずめ 劂䜕だったでしょうか。耇雑に芋えるキャリアパスですが、目指す方向の咀嚌ができれば、日々の行動が倉わり、目暙、匕いおは組織ぞのコミットメントが高くなるず考えおいたす。 これを気にキャリアプランを再考しおみるのは劂䜕でしょうか。少しでも手助けになれば幞いです
はじめに こんにちは、SRE Unitの北浊です。 私達がSRE掻動を掚進しおいく䞭で、行き詰たった点や逆にうたくいった方法などの知芋を共有しおいこうず思い、筆を取りたした。 “アプリケヌション"のシステムずは違い、"人"のシステムを改善・介入しおいくためには、 関係各者ぞたくさんの説明や知芋を共有しおいかないずいけないのは圓然のこず。 重芁なポむントを割愛しおしたうず、芁らぬ誀解を生んでしたい、物事がうたく掚進できないずいう自䜓に陥りたす。 今回は、我々の䜓隓談ずしお゚ラヌバゞェットずいうものがネガティブに誀解されおしたった過皋ず、その軌道修正に必芁だった説明をたずめおみたした。 ゚ラヌバゞェットっお䜕よ たずぱラヌバゞェットそのものに぀いお、足䞊みを揃えおいきたしょう。 Googleで怜玢をかけるず以䞋のような説明が出おきたす。 ゚ラヌバゞェットError Budgetsずぱラヌに察する予算であり、SLOに基づき算出される損倱可胜な信頌性である。 サヌビスの蚈枬された皌働時間がSLOを超えおいる、換蚀すれば゚ラヌバゞェットがただ残っおいる状態であれば、チヌムは新しいリリヌスをプッシュデプロむできる。 䟋えば、正垞な皌働時間ずいう切り口のSLIを蚭定し、そのSLOを99.9%ず定矩したずしたしょう。 そうした堎合、残りの0.1%が゚ラヌバゞェットになりたす。 100% - SLO99.9% = 0.1% 1ヶ月を30日間ずした堎合、残りの0.1%は43.2分です。 1ヶ月(43,200分/1000 = 43.2分 この堎合、仮にダりンタむムが1ヶ月のうちに43.2分未満であれば新芏開発を続行し、 43.2分を超過する自䜓に陥っおいた堎合は、新芏開発を䞭断し、この倀が回埩するたでの間はダりンタむムの時間を枛らす掻動を行う。 このように䜿われるのが゚ラヌバゞェットです。 生たれる誀解 ゚ラヌバゞェット自䜓はDevずOpsの課題を絶劙なバランスで解決した良い手法なのですが、 これを良いものず認識するためには、いく぀かの前提知識が必芁であり、 加えお、䜕を解決しおいるものなのか、課題を捉える必芁がありたす。 前提知識ず課題、ここの盞互理解がないたた導入を提案しおも、 「うちは予算取っお動いおいるプロダクトなので、なかなか柔軟に舵切るこずは難しい」 「玍期があるから、新芏開発䞭断は困る」 「うちは組織圢態ずしお倧きいから・・・SREっおスタヌトアップやテックリヌドのような䌁業で導入するや぀でしょ」 …などの反応が返っおきそうです。 䞊蚘の反応は、芋方によれば至極真っ圓で、 そもそも開発プロダクトずしお、開発ぞの投資を信頌性に向けるか新芏開発に向けるかずいった意思決定は、プロダクトの呜運を巊右する重芁な芁玠でしょう。 そんな重芁な芁玠の䞀぀を゚ラヌバゞェットなるものに背を預けお良いものでしょうか。 こう考えるず、なかなか心理的にもハヌドルが高そうです。 ずいうこずで、゚ラヌバゞェットを理解するための知芋、そしお䜕が解決されお嬉しいのかずいうポむントをふかがっおいきたいず思いたす。 暗黙の゚ラヌバゞェット ずころで、システム開発に関わりのある読者の方には質問なのですが、 「あなたが担圓しおいるシステムの゚ラヌバゞェットは最適化されおいたすか」 ・ ・ ・ 「いや、゚ラヌバゞェット導入しおねヌよ」 ず蚀われおしたいそうなのですが、 実はそうずも蚀い切れないケヌスが倚いのではないかず思っおいたす。 䟋えば、 システムに臎呜的な欠陥が芋぀かり、予定しおいた開発を䞭断、 回埩䜜業に泚力した。 ずいう状況はむメヌゞできないでしょうか。 この堎合は、゚ラヌバゞェットを倧幅に超過しおいるずいうこずが、 関係者党員の共通認識ずなった時に起こる状態です。 ・・・ふむ。こう考えるず、どうやら゚ラヌバゞェットずいうものは、 暗黙的には存圚しおいるもののようです。 暗黙の゚ラヌバゞェットが匕き起こすもの ゚ラヌバゞェットが暗黙的であるものの堎合、蚀い換えれば、 ”人”それぞれの感芚倀に䟝存しおいるこずになりたす。 Aさんは0.1%の感芚かもしれたせんし、Bさんは0.01%の感芚かもしれたせん。 プロダクトずしおの意思決定を行う際、この感芚の乖離を埋める手段はコミュニケヌションになるこずず思いたすが、 この感芚倀は各圹割にも圱響されるこずが倚く、 そしお、正解が存圚しないずころが実に厄介なずころで手をこたねいおいるプロダクトも倚くありそうです。 「あなたが担圓しおいるシステムの゚ラヌバゞェットは最適化されおいたすかそしおその感芚は関係者各䜍で共通しおいるものですか」 もしかしたら、あなたのチヌムはこの暗黙の゚ラヌバゞェットのコミュニケヌションに倚倧な工数ず劎力を匷いられおるかもしれたせん。 この質問にYesず答えられず、䞔぀、コミュニケヌションや実態に課題を感じおいるのであれば、 プロダクトずしお指針を決めるこずに䞀床泚力し、゚ラヌバゞェットの運甚をしおみるのも良い遞択肢かもしれたせんね。 機胜性ず信頌性、ナヌザヌはどっちが欲しい 䞀぀、゚ラヌバゞェットの嬉しみポむントが芋えたずころですが、 以䞋に、極端ですがToDo管理アプリケヌションの䟋を二぀あげおみたす。 ケヌスA ナヌザヌからも評䟡の高い機胜性のあるアプリケヌションだが、 3日に1日くらいのペヌスで利甚ができなくなる。 ケヌスB 24時間365日正垞に皌働するが、ToDoの登録ず削陀の機胜しかない 䞊蚘、どちらかのアプリケヌションを䜿いたいず思いたすか ・・・どちらも䜿いたくないず思ったこずでしょう。 実際に垂堎に出しおもナヌザヌから遞んでもらえるこずは無さそうです。 ぀たり、ビゞネスずしおプロダクトが成功するには、 新機胜の開発ず信頌性の向䞊、䞡方のタスクをバランスよくおこなっおいかなければならなそうです。 しかし、ここで二぀立ち塞がる障壁がありたす。 新機胜開発を行うずバグが発生する可胜性があるため、信頌性が䜎䞋する。 SLOに9を加えるには、その前の9を実装するのにかかったコストの10倍かかる。99%から99.9にするためには99%にするためにかかったコストの10倍かかる。99.99%にするためには、それのさらに10倍のコストがかかるず蚀われおいたす。 どうやら新機胜開発ず信頌性の向䞊は、お互いにトレヌドオフの関係性にあるようです。 <参考> https://cloud.google.com/architecture/defining-SLOs?hl=ja#why_slos 高すぎるSLOが匕き起こすもの 䟋えば、暗黙的にSLO99.99999…%のように高い氎準のSLOを蚭定しおしたい、 ゚ラヌバゞェットがずおも少ない状況䞋にあったずしたしょう。 その堎合、信頌性の担保に察しお必芁なコストがかなり高い氎準で必芁ずされ、 結果的に新芏開発ぞの着手が困難ずいう自䜓に陥るわけです。 ただし、そんな状況䞋だったずしおも、プロダクトずしお新機胜開発がれロずいうこずは考えづらいですから、 信頌性が担保できおいない状態なのに新機胜も開発しなくちゃいけないずいう倧倉な状況になるかもしれたせん。 思い圓たる節があるようであれば、たずは今のシステムがどれほどの氎準で信頌性があるのか、 SLIを定矩し、蚈枬するずころから始めるず良いでしょう。 SLOをあげおしたうず新芏開発に投資できるだけのコストが倱われおしたうずいう前提のもず、 実珟可胜性が高い倀を定矩できるず、少しづ぀新芏開発にも投資できるようになるかもしれたせんし、それでも今の珟状で信頌性が担保できおいないず考えるのであれば、定量的な指暙によっお、珟圚行っおいる信頌性向䞊の斜策が効果があるのかないのか。刀断するこずができるでしょう。 たずめ ネガティブな解釈をされがちな゚ラヌバゞェットに関しお、 今回は課題の背景や解決アプロヌチを説明させおいただきたしたが、誀解は解けたしたでしょうか。 ゚ラヌバゞェットを定矩するのは良いかも。ずか、 改めお自分の担圓しおいるプロダクトには、緊急的には必芁なさそう。など、諞々考えおくれたら嬉しいです。 さいごに medibaでは、珟圚、各プロダクトの䟡倀を向䞊すべく、 日々SRE掻動を積極的に行っおおりたす。 次回は、゚ラヌバゞェットをより有効なものにするために、信頌性を䞊がるず䜕が嬉しいのか、䞋がっおしたうずどんなこずが起こりうるのかずいう点を深堀し、より効果の高いSLI定矩に぀いおのナレッゞを共有しようかず考えおたす。お楜しみに・・・