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

TECH PLAY

ニフティ株匏䌚瀟

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

å…š529ä»¶

はじめに 䌚員システムグルヌプ N1!Machine Learning Product Engineerの䞭村です。 2023幎2月9日に囜内最倧玚のデベロッパヌカンファレンスであるDevelopers Summit 2023に登壇したした。 https://event.shoeisha.jp/devsumi/20230209/session/4151/ この蚘事ではこの登壇に至るたでの経緯や内容に぀いおお話しおいきたす。 なぜ登壇したのか ニフティにはN1!ずいうスペシャリスト制床がありたす。 この制床は瀟内でスペシャリストが掻躍するための制床で、予算が100䞇円個人に䞎えられるなどの暩限があるのですが、 自分は機械孊習゚ンゞニアずしお掻動しおいたす。 この掻動の結果ニフティニュヌスにニュヌス蚘事芁玄を実装したので、これを瀟倖に発信したいずいうモチベヌションです。 ずいう建前ですが 実際は蚘念受隓しおみたら受かっおしたったずいうのが倧きいです。 自分は角谷さんの「Agile Manifest Decade Resurrection」ずいう発衚スラむドがすごく奜きで、LT倧䌚などでもよく䌌たようなテむストの発衚スラむドで発衚しおいたした。 そしお、このスラむドはデブサミ2022の発衚スラむドです。 そのため自分の䞭ではデブサミずいうのはかなり倧きなむベントで、「登壇できる気はしないけど公募だけ出しおみよ〜」ずやっおみたら、たさかの圓遞しおしたいたした。 同じ時間の公募枠はやはり有名だったり圹職クラスの高い人が倚く、戊々恐々しながら圓日を迎えたした。 䜕を話したのか 実は発衚の2週間前たで話すこずをずっず悩んでいたした。 ずいうのも深局孊習によるニュヌス蚘事芁玄のプロダクト実装に぀いおは、䞭身は深局孊習゚ンゞニアからするずそこたで耇雑なものではありたせん。 ずなるず、深局孊習の仕組みや手法を説明するよりも、自分がそれをプロダクトに実装するたでの進め方や人間関係スキルに焊点を圓おた方がいいのではず考えおいたからです。 自分自身はスクラムマスタヌも兌務しおいるのですが、ファシリテヌションや折衝などで耒めおもらうこずが倚いです。 しかし、人間関係のスキルずなるず「これで絶察に䞊手くいく」ずいうこずも蚀いづらく、ずっず本を読みながら䜕を話そうかたずめおいきたした。 以䞋のように、䜜った結果、結局スラむド内で蚀及しなかった資料もたくさんありたす。い぀かどこかで発衚できたら良いな 結局どうしたのか 悩みに悩んだ結果、内容を3点にたずめたした。 皮を蒔く 技術を開花させる 人間関係のスキル 「皮を蒔く」では瀟内で新しいこずをやるためのフォロワヌを獲埗しおいく過皋に぀いお 「技術を開花させる」では技術的にやや螏み蟌んだ内容で䜕を行ったのか詳现な内容に぀いおは、 自瀟むベントで講挔 しおいたすので、そちらを埡芧ください 「人間関係のスキル」では人間関係を䞊手くやっおいく方法に぀いお語りたした。 結局、䞊手く䜓系化ができた郚分は倚くなかったのですが、聞いおいる人が「勇気」を持おる講挔にしたいず思っおいたした。 結果的にTwitterでも「勇気をもらった」「゚モい話で良かった」ずいう声があり、講挔を行った意味があったなず思いたした。 (C のスピヌカヌさんのセッション、深局孊習だけでなく倉革の起こし方で奜き) #devsumi #devsumiC pic.twitter.com/JXbmId9z6D — 篠田 将圊 / CI・CD, DevOps, TDD (@Shinoda_IT) February 9, 2023 説明すごく聞きやすかったです。 今ずおも意識高い気持ちになっおいるけれど明日の朝も維持できおいる方法が知りたい(๑˃̵᎗˂̵) 埌でもう䞀床芋返したい #デブサミ #devsumi #devsumiC https://t.co/IQMdFU5nna — 星☆nishikigoi (@of_nishikigoi) February 9, 2023 「文化が先、組織は埌」 ぀い䌚瀟が、組織がずいうけど、文化づくりが倧事なんだず印象的なワヌドでした。 やっおみお、しんどかったらやめる ず思っおおくこずで、行動にブレヌキをかけないようにするのが倧事 #devsumi #devsumiC pic.twitter.com/epLQbS9jKl — ダマタケ-業務自動化ずSEOを極め䞭 (@gas_seo) February 9, 2023 今回の䞭村䌊吹さんのセッションは凄い力になった もっずたくさんの人に聞いおほしい内容でした #devsumiC pic.twitter.com/pM2xdsgUJP — KiyamaYellow (@kiyama_yellow) February 9, 2023 終わりに 技術むベントの登壇前埌の心境を衚したTwitterの画像がありたす。 勉匷䌚での登壇に぀いお、い぀も感じおいる正盎な気持ちを曞きたした。 pic.twitter.com/Ip5Mvuve0h — 鹿野 壮 Takeshi Kano (@tonkotsuboy_com) October 24, 2022 完党にこれになりたした。 䜜れば䜜るほどこのスラむドの論理は通っおるんだろうかず考えるようになり、䜕床も方向転換をしお倧倉な䜜業でした。 ただ、結果的には䜕冊もの本を読み、どういう颚に話したりすればいいんだろうず考え、自分のレベルアップに繋がりたした。 デブサミはかなり倧きなむベントで倧倉なこずが倚かったですが、もっず倖郚登壇しおいきたいなずいう気持ちになれたした。 これからも登壇機䌚があれば登壇しおいこうず思いたすので、たた次のむベント登壇にご期埅ください アヌカむブ動画公開されるずいいな We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめに こんにちは、ニフティ株匏䌚瀟 むンフラシステムグルヌプ 䜐藀です。 普段の業務では瀟内のネットワヌク運甚などを担圓しおいたす。 珟圚、瀟内の無線ネットワヌクの電波状況改善のため、無線LANサむトサヌベむができるツヌルの導入を怜蚎しおおり、NetSpotずいうツヌルをトラむアルで利甚しおみたのでご玹介したす。 NetSpotずは NetSpotは無線LANサむトサヌベむやWiFi分析が行えるツヌルです。 MacOSやWindowsで利甚ができ、必芁な芁件に応じお無料版やプロ版、゚ンタヌプラむズ版がありたす。 今回は無線LANサむトサヌベむができるプロ版をトラむアルで利甚しおみたした。 NetSpotでやりたいこず 無線䞍調の原因でよくあるのが電波干枉ですが、干枉源ずなっおいる無線ルヌタを探すのに苊劎するこずがよくありたす。NetSpotを䜿っお自分たちで管理しおいない無線ルヌタヌの堎所を特定したいず思っおいたす。 NetSpotの䜿い方 NetSpotを起動するず䞋蚘画面が衚瀺されるので新しい「調査をする」を遞択したす。 画面が遷移するので䞋蚘の項目を入力したす。 ・新しいプロゞェクトの名前プロゞェクトの名前 ・第1ゟヌン名堎所や建物名等 ・ゟヌン゚リアタむププルダりン圢匏なので該圓するものを遞択 ファむルからロヌドを遞択しおフロア図をアップロヌドしたす。 フロア図が衚瀺されるので2か所遞択しお、2点間の距離を入力したす。 調査に含みたくないSSIDがあれば入力したす(今回は䜕も指定したせんでした) アクティブスキャン(通信速床枬定等ができる)の実斜確認があるので実斜する堎合はSSIDを入力したす(今回は未実斜です) フロア図が衚瀺されるので珟圚地を遞択しお無線通信をスキャンを開始したす スキャンが完了したらスキャンできた範囲が緑䞞で衚瀺されたす 䞀通りスキャンした埌にスキャン䞭止を遞択すればスキャン結果が衚瀺されたす。 スキャンした範囲内にある無線機噚がフロア図に衚瀺されたした。 NetSpot䜿っおみた感想 無事に無線ルヌタの䜍眮が怜出ができたした。䞀郚違う郚屋の無線ルヌタも衚瀺されおしたいたしたが、怜知䜍眮の粟床も十分に高く瀟内の調査でも䜿えそうでした。特定の無線ルヌタの電波匷床も枬定できるので、瀟内の無線環境改善の䞀環ずしお匕き続き導入を怜蚎したいず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす テヌマ 第9回目のテヌマは「SvelteKit, Next.jsの導入事䟋玹介など 〜ニフティのフロント゚ンドの今ずこれから〜」です。 ニフティのフロント゚ンド開発に関わるメンバヌから、業務で培われたノりハりや、今埌のニフティのフロント゚ンド技術に぀いお事䟋玹介などLT圢匏で発衚したす。 抂芁 日皋02月21日火12:00〜13:00 配信方法YouTube Live 芖聎環境むンタヌネット接続が可胜なPC/スマヌトフォン 参加方法 YouTube Liveにお配信いたしたす。 connpass にお登録をお願いいたしたす。 YouTube LiveのURLは決定埌、connpass内の参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ SvelteKit, Next.js、自瀟制䜜、アクセシビリティに興味がある方 ニフティの制䜜珟堎、新芏サヌビス開発の技術遞定に぀いお興味がある方 テンプレヌト゚ンゞンの移行に興味がある方 ニフティの技術や颚土に興味がある方 タむムテヌブル 時間 コンテンツ 12:00 – 12:05 オヌプニング䌚瀟玹介 12:06 – 12:15 ニフティトップのNext.jsでのキャッシュ戊略を考えた話 (䜐々朚 優) 12:16 – 12:25 自瀟補CMSのテンプレヌト゚ンゞンからNext.jsに眮き換える (宮本 達矢) 12:26 – 12:35 ニフティのWEBサむト制䜜の流れ瀟内制䜜のメリットデメリット (新田 䞇智) 12:36 – 12:45 新サヌビスにSvelteKitを導入しおみた (たけろいど) 12:46 – 12:55 瀟内にアクセシビリティを取り入れおいきたいなぁず思っおいる話 (関 æ­©æ­Š) 12:56 – 13:00 たずめクロヌゞング 登壇者プロフィヌル 筑朚 信成 ファシリテヌタ 技術むベントの䌁画やキャリア採甚を担圓しおいたす。 フロント゚ンドの知識を深めたく、瀟内で行われおいるフロント゚ンド勉匷䌚に参加しおいたす。 今回はファシリテヌタヌずしお参加したす 䜐々朚 優 登壇者 @niftyトップペヌゞで䞻に開発・運甚を担圓しおいたす。 最近はサヌビスのむンフラコストを削枛できないか、モダン技術を取り入れられないかを孊びながら実践しおいたす。 宮本 達矢 登壇者 @niftyトップペヌゞの開発・運甚担圓。 フロント゚ンドに限らず、バック゚ンドやむンフラも觊っおいたす。最近はデザむン呚りを勉匷䞭です。 新田 䞇智 登壇者 䞻にWEB制䜜ディレクタヌをしおいたす。 最近はアプリのUI蚭蚈や動画コンテンツ䌁画線集なども行っおいたす。 デザむンやフロント゚ンド呚り、初心者スタヌトだったので今も絶賛勉匷䞭ですよろしくお願いしたす たけろいど 登壇者 ニフティのオプションサヌビスの開発・運甚担圓をしおいたす。 ニフティのフロント゚ンド開発をさらに楜しくするために日々邁進しおいたす 関 æ­©æ­Š 登壇者 ニフティポむントクラブの開発・運甚担圓をしおいたす。 業務ではバック゚ンド系を行っおいたすが、フロント゚ンド技術やアクセシビリティに興味があり勉匷䞭です! ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアの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/ ) で公開されおいたす。
はじめに こんにちは、ニフティ株匏䌚瀟 基幹システムグルヌプの石坂です。普段の業務では課金系システムの開発運甚をしおいたす。 今回は、瀟内のサヌバヌを監芖するためにPrometheusを觊っおみたしたので、共有したいず思いたす。 Prometheusずは PrometheusはOSSのリ゜ヌス監芖システムです。 監芖察象に監芖゚ヌゞェントExporterを入れるこずでHTTP経由でメトリクス収集を行いたす。Exporterには様々な皮類がありたすが、今回はログ監芖に甚いるgrok-exporterを䜿っおみたす。 たた、Prometheusには収集したデヌタをグラフ衚瀺する機胜がありたすが、Prometheus単䜓だず機胜が充実しおいたせん。そのため、デヌタ可芖化ツヌルであるGrafanaず組み合わせお䜿われるこずが倚いようです。 実際にログ監芖しおみる Prometheusはdockerむメヌゞが提䟛されおいるため、ロヌカルで簡単に詊すこずができたす。今回はPrometheus、Grafana、監芖察象ずしおCentOSのコンテナをdocker-composeを甚いお起動したす。 docker-compose.yml 監芖察象のサヌバヌを「target-server」ずしおいたす。 version: '3' services: prometheus: image: prom/prometheus:v2.41.0 container_name: prometheus volumes: - ./:/etc/prometheus/ - ./prometheus-data:/prometheus ports: - 9090:9090 network_mode: dockernet grafana: image: grafana/grafana:8.5.2 container_name: grafana volumes: - ./grafana-data:/var/lib/grafana ports: - 3000:3000 network_mode: dockernet target-server: image: centos:centos7 tty: true container_name: target-server ports: - 9144:9144 network_mode: dockernet prometheus.yml Prometheusの蚭定ファむルです。監芖察象のサヌバヌをここに蚘茉しおおきたす。 global: scrape_interval: 15s external_labels: monitor: 'codelab-monitor' scrape_configs: - job_name: 'prometheus-test' static_configs: - targets: ['target-server:9144'] それでは実際に起動しおいきたす。 docker compose up -d 監芖察象サヌバヌに入っおgrok_exporterをむンストヌルしたす。 docker exec -it -u 0 target-server bash [root@9deda05f745d /]# yum install -y wget [root@9deda05f745d /]# cd usr/local/src/ [root@9deda05f745d src]# wget https://github.com/fstab/grok_exporter/releases/download/v1.0.0.RC5/grok_exporter-1.0.0.RC5.linux-amd64.zip [root@9deda05f745d src]# yum install -y unzip [root@9deda05f745d src]# unzip grok_exporter-1.0.0.RC5.linux-amd64.zip [root@9deda05f745d src]# mv grok_exporter-1.0.0.RC5.linux-amd64 ../grok_exporter [root@9deda05f745d src]# 以䞋が今回ログ監芖したいサンプルログファむルずなりたす。 [root@9deda05f745d src]# cd ../grok_exporter [root@9deda05f745d grok_exporter]# head -5 example/exim-rejected-RCPT-examples.log 2016-04-18 09:33:27 H=(○○○.○○○.○○○.○○○) [○○○.○○○.○○○.○○○] F=<z2007tw@○○○.com.tw> rejected RCPT <alan.a168@○○○.net>: relay not permitted 2016-04-18 12:28:04 H=(○○○.○○○.○○○.○○○) [○○○.○○○.○○○.○○○] F=<z2007tw@○○○.com.tw> rejected RCPT <alan.a168@○○○.net>: relay not permitted 2016-04-18 19:16:30 H=(○○○.○○○.○○○.○○○) [○○○.○○○.○○○.○○○] F=<z2007tw@○○○.com.tw> rejected RCPT <alan.a168@○○○.net>: relay not permitted 2016-04-18 19:26:22 H=(○○○.○○○.○○○.○○○) [○○○.○○○.○○○.○○○] F=<z2007tw@○○○.com.tw> rejected RCPT <alan.a168@○○○.net>: relay not permitted 2016-04-26 04:41:25 H=(○○○.○○○.○○○.○○○) [○○○.○○○.○○○.○○○] F=<z2007tw@○○○.com.tw> rejected RCPT <alan.a168@○○○.net>: relay not permitted [root@9deda05f745d grok_exporter]# 以䞋の蚭定ファむルに監芖蚭定を蚘茉したす。 metricsのtypeで監芖察象ログから取埗する倀の皮類を指定するこずができたす。 サンプルでは、typeを「counter」ずしお、゚ラヌログの件数を取埗する蚭定が蚘茉されおいたす。 typeには他にもgaugeやhistogram、summaryなどがあり、䟋えばgaugeを指定するず、䞀臎する各ログ行で蚘録される数倀を取埗するこずができたす。 [root@9deda05f745d grok_exporter]# cat example/config.yml global: config_version: 3 input: type: file path: ./example/exim-rejected-RCPT-examples.log readall: true # Read from the beginning of the file? False means we start at the end of the file and read only new lines. imports: - type: grok_patterns dir: ./patterns grok_patterns: - 'EXIM_MESSAGE [a-zA-Z ]*' metrics: - type: counter name: exim_rejected_rcpt_total help: Total number of rejected recipients, partitioned by error message. match: '%{EXIM_DATE} %{EXIM_REMOTE_HOST} F=<%{EMAILADDRESS}> rejected RCPT <%{EMAILADDRESS}>: %{EXIM_MESSAGE:message}' labels: error_message: '{{.message}}' logfile: '{{base .logfile}}' server: protocol: http port: 9144 [root@9deda05f745d grok_exporter]# 蚭定ファむルを指定しおgrok_exporterを起動したす。 [root@9deda05f745d grok_exporter]# /usr/local/grok_exporter/grok_exporter --config=/usr/local/grok_exporter/example/config.yml & Grafanaにログむンしたす。username: admin / password: admin http://localhost:3000/login デヌタ゜ヌスずしおPrometheusを蚭定したす。 蚭定→Configuration→Add data sourceから、Prometheusを遞択しお画像のようにURLを蚭定。Save&testを抌䞋したら玐付け完了です。 あずはDashboardからPanelを远加しお、可芖化したいメトリクスを指定するこずでグラフを衚瀺するこずができたす。 以䞋の画像は「Unrouteable address」のサンプル゚ラヌログが䜕件発生しおるかを衚瀺しおいたす。 おわりに PrometheusやGrafanaは今も頻繁にアップデヌトされおおり、UIや仕様倉曎が倚いため、参考にできるナレッゞが少ない印象でした。 ですが、今回dockerで詊しおみたように動䜜確認するこずは比范的やりやすいので、興味のある方は䞀床觊っおみるず面癜いかもしれたせん。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめに こんにちは新卒入瀟4幎目の束䞋です。管理䌚蚈・デヌタ分析ナニットで賌買デヌタやお客様の声のデヌタ分析をしおいたす。 先日「NIFTY Tech Talk #8 ニフティのデヌタ分析」ずいうむベントを開催したした。その様子をご玹介したす。 むベント抂芁 NIFTY Tech Talk は、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントではニフティ瀟員が業務を通じお孊んだこずを発信しおいたす。 今回は、第8回目ずなる「デヌタ分析」に関するテヌマで開催したした。デヌタ分析には様々な芖点がありたすが、今回は3぀の芖点からニフティのデヌタ分析に぀いお話をしたした。 ニフティのデヌタ基盀の話 デヌタ゚ンゞニア芖点 Tableau、TableauServerの瀟内の掻甚事䟋 デヌタアナリスト芖点 ChatGPTで賑わう自然蚀語凊理技術、ニフティのデヌタサむ゚ンスに぀いお デヌタサむ゚ンティスト芖点 今回の Tech Talk のアヌカむブを YouTube にアップロヌドしおおりたす。ぜひご芧ください。 内容レポヌト 各セッションから䞀郚抜粋しお、どのような内容だったかご玹介したいず思いたす。 ニフティのデヌタ基盀の話 -デヌタ゚ンゞニア芖点から 䌚員システムグルヌプのN1!デヌタアヌキテクトの黒矜さんが、実際に瀟内でデヌタ基盀を䜜った時の経隓から、デヌタ基盀はどのような考えで䜜っおいけばよいのかを解説したした。 ここに行き着いた理由ずしお最初は瀟内のデヌタを集めるこずを目的ずしおデヌタ基盀を䜜っおいたのですが様々な䞍郜合がでおきた、ずいうずころからでした。 終わらないデヌタ収集 あったら䜿う、䟿利かもずいうデヌタを集めるが䜿わない 掻甚は進たず、時間も溶ける そこで考えを新たにし、デヌタ分析ずセットでデヌタ基盀を考えるようにするずうたく回り始めたした。 たた、ニフティのデヌタ基盀の倉遷も玹介しおいたす。 今はdbtなどの呚蟺技術、ツヌル類が進歩しおいるこずでデヌタ゚ンゞニアを始める際に䞋駄が履きやすい始めやすい環境になっおいるこずも説明いただきたした。 Tableau、TableauServerの瀟内の掻甚事䟋 -デヌタアナリスト芖点から 事業掚進グルヌプ、N1!Data Ninjaの打矢さんより、ニフティではBIツヌルであるTableauをどのように䜿っおいるのかを解説いただきたした。 ニフティではBIツヌルずしおTableauを利甚しおいたすが、Tableauを遞定した理由ずしお倧きく3぀あげおいたす。 探玢的な分析がしやすいこず 様々な皮類のデヌタ゜ヌスのデヌタを結合しお䜿えるこず スケヌルに合わせた芏暡・コストで導入ができるこず Tableauを䜿うこずで定期的に最新の状態にフォヌカスされた状態で重芁な数倀を芋るこずができたす。 たた、探玢がしやすい構造になっおいるためスピヌド感を持った察応を行うこずができたす。 そしお、泚力課題に察する指暙の党瀟共有ずしおもTableauServerを䜿うこずで簡単に共有を行うこずができおいたす。 ChatGPTで賑わう自然蚀語凊理技術、ニフティのデヌタサむ゚ンスに぀いお -デヌタサむ゚ンティスト芖点 最埌に事業掚進グルヌプ、N1!デヌタサむ゚ンティストの瀬川さんからニフティのデヌタサむ゚ンスに぀いおどのようなこずをやっおいるのか解説いただきたした。 ニフティでもデヌタサむ゚ンスの技術を甚いおおりニフティニュヌスでの掻甚事䟋やお客様アンケヌトの芁望抜出に䜿甚しおいたす。 ニフティのデヌタ掻甚は「お客様理解」のために行っおいるずいうずころをベヌスにしおいたす。 たた、デヌタサむ゚ンティストずいう立堎で面癜いずころ、重芁なずこをを説明しおいただきたした。 たずめ 今回の Tech Talk では、ニフティのデヌタ分析に぀いお3぀の芖点から玹介したした。 1 時間ずいう短い枠だったので、今回話しきれなかったものもありたすが、参考にできるものがあれば幞いです。 今埌も NIFTY Tech Talk は継続しお実斜しおいきたすので、ぜひご参加ください。 たたセッションの䞭でも玹介したしたが、この床2023幎2月に開催予定のDevelopers Summitデブサミにも䞭村が たった1人から始めお深局孊習によるニュヌス芁玄をプロダクトに実装した方法ファヌストペンギンでやりきる力 ずしおセッションを行う予定です。興味のある方はぜひ芖聎をおねがいしたす We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
むベント抂芁 NIFTY Tech Talkは、ニフティ株匏䌚瀟の瀟員が䞻催するトヌクむベントです。 本むベントでは、ニフティグルヌプの瀟員が業務を通じお孊んだこずを発信しおいたす 2023幎最初のテヌマは「LT倧䌚」です。 ニフティでは長幎定期的に瀟内LT倧䌚を実斜しおおり、バラ゚ティに飛んだ発衚がなされおいたす。 今回はそんなLT倧䌚の雰囲気を感じ取れる発衚を遞りすぐっおお䌝えしたす。 抂芁 日皋1月27日金18:00〜20:00 配信方法Remo 芖聎環境むンタヌネット接続が可胜なPCブラりザはChrome、Edge掚奚 参加方法 Remoにお実斜いたしたす。 RemoのURLは決定埌、参加者ぞの情報欄に蚘茉いたしたす。 こんな方におすすめ 他瀟のLT倧䌚の雰囲気を知りたい方 ニフティの技術や颚土に興味がある方 ニフティの゚ンゞニアず話しおみたい方 タむムテヌブル 時間 コンテンツ 18:00 – 18:05 オヌプニング䌚瀟玹介 18:05 – 18:15 ニフティLT倧䌚に぀いお 18:15 – 18:22 LT1 効率化小ネタ集 18:22 – 18:29 LT2 新人のすゝめ 18:29 – 18:36 LT3 AI画像生成で神絵垫になれる仕組みをやさしく説明する 18:36 – 18:43 ゲスト枠1 18:43 – 18:50 ゲスト枠2 18:50 – 18:55 たずめ懇芪䌚のご案内 18:55 – 20:00 懇芪䌚 ※ 各LTは7分ずしたす ※ ゲスト登壇者がいない堎合には以降の予定を繰り䞊げたす テヌマ ニフティの瀟内LT倧䌚で優秀発衚賞を受賞した若手゚ンゞニアが登壇いたしたす。 バラ゚ティ豊かなLTからニフティの雰囲気を感じ取っおいただければ幞いです。 登壇者プロフィヌル 小浊 由䜳登壇者 ニフティ株匏䌚瀟 むンフラシステムグルヌプ 瀟内情報システムチヌム ニフティのLT倧䌚の䌁画、運営をやっおいる人です。 普段の業務は情シスで、スクラムチヌムのスクラムマスタヌをやったりしおいたす。 南川 倧暹LT ニフティ株匏䌚瀟 基幹システムグルヌプ サヌビスむンフラチヌム 新卒入瀟3幎目。シングルサむンオンやナヌザヌサむンアップなどの開発や運甚を担圓。効率化、自動化が奜き。 湊谷 のぞみ LT ニフティ株匏䌚瀟 基幹システムグルヌプ サヌビスむンフラチヌム 新卒入瀟3幎目。䞻に顧客情報管理システムやシングルサむンオンなどの開発や運甚を担圓。特技は起床です。 䞭村 䌊吹LT ニフティ株匏䌚瀟 䌚員システムグルヌプ 第二開発チヌム 新卒入瀟4幎目。ニフティニュヌスの開発・運甚を担圓し、最近はモダンなフロント゚ンド開発を孊習䞭。男女混成チアリヌディング元日本代衚。 ニフティグルヌプでは䞀緒に働く仲間を募集䞭です 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティ゚ンゞニアの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/ ) で公開されおいたす。
はじめに こんにちは。セキュリティチヌムの添野隌矢ず申したす。 今回、冬季のむンタヌンシップ12/09 開催に講垫ずしお参加したした。 むンタヌンシップに぀いお ニフティでは新卒採甚掻動の䞀環ずしお、むンタヌンシップを開催しおいたす。 珟圚ニフティでは䞋蚘のむンタヌンシップを実斜しおいたす。 スクラム䜓隓挔習コヌス サむバヌ攻撃察応挔習コヌス システム障害察応挔習コヌス サヌビス䌁画コヌス 詳しくは、 こちら をご芧ください。 本蚘事では、その4぀のむンタヌンシップの䞭で先日開催したサむバヌ攻撃察応挔習コヌスに぀いお玹介させおいただきたす。 本むンタヌンシップのおすすめポむント 1dayで手軜に実際のサむバヌ攻撃ぞの察応を䜓隓でき、ISPに぀いおも知るこずができ、なおか぀ニフティの雰囲気も感じられるむンタヌンシップです。必芁な物は、PCのみです。 サむバヌ攻撃察応挔習コヌス抂芁 むンタヌン期間 1day午埌のみ 開催日皋2022幎床の堎合 倏2回2022/08/26、2022/09/02 冬2回2022/12/02、2022/12/09 開催圢匏 ZoomSlackによるオンラむン実斜 タむムスケゞュヌル むンタヌンシップ内容玹介 本むンタヌンシップでは最初に座孊を行い、埌半はグルヌプに分かれおグルヌプ挔習を行いたす。 座孊に぀いお 座孊では、以䞋の内容に぀いおの講矩をしたす。 ISP・ネットワヌク 昚今の瀟䌚情勢やネットワヌクの基瀎的な知識に぀いお 質問等も甚意されおいお、みんなで楜しみ぀぀孊べたす。 ex) 今幎最倧むンタヌネットトラフィックを蚘録したむベントは䜕かたたそのトラフィック量はどれくらいか等 セキュリティ 昚今のサむバヌセキュリティ事情に぀いお 挔習に぀いお 1グルヌプ5~6人のグルヌプに分かれおもらい、Zoomのブレむクアりトルヌム機胜ずSlackを甚いおグルヌプワヌクをしおもらいたす。 Slackに担圓瀟員からある状況が䞎えられ、その䞎えられた状況に察しおの察策の議論をしおもらいたす。 挔習の内容ずしおは、実際のシステムの担圓者圹ずしお、ある障害事䟋をもずにした机䞊の業務䜓隓ずなりたす。 実際のサむバヌ攻撃では、攻撃者は攻撃の手は止めおくれたせん。 挔習でも、議論䞭に新しいむベントが起こり続けるので、その新しいむベントに察しおも議論をしおもらいたす。 たた各グルヌプには、珟堎瀟員1名がメンタヌずしお付き、孊生のみなさんの挔習のサポヌトをさせおいただきたす。 挔習終了埌、グルヌプ内で最初の振り返りをしおもらい、その振り返りを党䜓で発衚しおもらいたす。 振り返り発衚埌、シナリオの皮明かしがあるので、その皮明かしを螏たえ、チヌムで他にどんなこずができただろうかず再床振り返りができたす。 たた再床の振り返りでは、メンタヌによるフィヌドバックもさせおいただきたす。 懇芪䌚に぀いお むンタヌンシップ実斜埌には、珟堎瀟員ず就掻に぀いおや瀟内の雰囲気に぀いお話せる堎ずしお懇芪䌚の時間を蚭けおいたす。 参加者の感想 むンタヌンシップに参加した孊生のみなさんからの感想をいく぀かご玹介したす。 実際にサむバヌ攻撃を受けた際の察策や考え方を実戊圢匏で䜓隓するこずができたため、座孊より深く理解するこずができた。 サむバヌ攻撃のモデルケヌスに぀いお、実際に攻撃されたシステムの担圓者圹ずしお䜕をすべきか考えるこずで、倚角的な芖点からサむバヌ攻撃の察凊法を考える力が身に぀いた。 成果ずしおはISP業界ずいう今たで曖昧だった領域に関しお知芋を埗た事です。通信事業者やプロバむダなど呚蟺的な知識を浅く知っおいた点が倚かったので、今回のむベントで深く理解できた点は良かったです。 たた以䞋のような想定倖の成果を埗るこずができたずいう感想もいただきたした。 自分自身昔から議論に関しお苊手な郚分がありたしたが、今回の議論では自身の考えをうたく発信するこずができたこずが自分自身驚いおおりたす。 ラフな懇芪䌚で、メンタヌ瀟員さんず気軜に䌚話、瀟内の雰囲気を聞くこずができた。 個人的にセキュリティずいうず技術的な面に目が行きがちであったため、お客様ぞの察応や他郚眲や他瀟ずの関わりなどが必芁䞍可欠であるこずが意倖であった。 終わりに 孊生の方ずお話をした際、セキュリティ゚ンゞニアやむンフラ゚ンゞニアに興味あり぀぀も、普段どんな業務をしおいるのかが分からないずいう孊生の方が倚くいらっしゃいたした。そのような孊生の方にずっおも本むンタヌンは圹立぀むンタヌンシップだず思いたす。 セキュリティ゚ンゞニアやむンフラ゚ンゞニアにご興味ある方、ご応募をお埅ちしおいたす。たた最初でご玹介したサむバヌ攻撃察応挔習コヌス以倖のむンタヌンシップぞのご応募もお埅ちしおいたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめたしお新卒3幎目の湊谷です。 はじめに 突然ですが、皆さん「事前確認」をする機䌚っおありたすか 普段私は䞻にニフティのお客様の情報を管理するシステムの開発・運甚を行っおいたす。 その性質䞊、「顧客情報を取埗するAPIを利甚したい」「動䜜確認甚のテストIDを発行しおほしい」ずいった䟝頌をよくいただきたす。 顧客情報を扱う業務の郜合䞊、䟝頌の正圓性を事前確認するルヌルずなっおおり、Slack で受付調敎をお願いしおいるのですが  いやあ、めんどくさいなあ 。 フリヌフォヌマットでの受付調敎は䟝頌する偎も事前確認する偎も倧倉です。 これをどうにか改善しおいきたいず思いたす。 Slack ワヌクフロヌを䜿っお文字入力を極力なくそう たずはSlackのワヌクフロヌ機胜を䜿っおみたす。 ワヌクフロヌずは、耇数のステップで構成される自動化されたタスクたたはプロセスです。コヌディングの必芁はありたせん。ワヌクフロヌは自分の Slack ワヌクスペヌスで開始されたす。Slack で盎接実行するこずも、他のツヌルやサヌビスず連携させるこずもできたす。 https://slack.com/intl/ja-jp/help/articles/360053571454-Slack-%E3%81%A7%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B ワヌクフロヌを䜿っお事前確認の文章を送信できるようにしおみたしょう。 このようなワヌクフロヌを䜜成したした。 䟝頌偎が蚘入するフォヌム フォヌムの内容を基にワヌクフロヌを開始したチャンネルぞメッセヌゞを送信する 「承認ボタン」を抌すず確認したずいう文章がスレッドに返信される こうするこずで、䟝頌偎は蚘入するこずが少なくなり、確認偎はボタン䞀぀で承認し、必芁な情報を䌝えるこずができるようになりたした。 ですが 党おの申請のワヌクフロヌを䜜成しようずするず、少し䟝頌偎に䞍芪切な぀くりになりそうです。 事前確認の他にもワヌクフロヌはたくさん䜜っおいるのですが、これだけで衚瀺を埋め尜くしおしたいたす。䞀気にばヌっず衚瀺されるのも分かりづらいです。 そこで、「申請前の事前確認甚ワヌクフロヌ」を䞀぀のみ䜜成し、そこで遞択された内容によっお回答を倉曎する仕組みを䜜りたいず思いたす。 Slack Bolt for Javascriptを䜿っおbotを䜜成しよう Bolt は Slack API を䜿いやすくするための Node.js フレヌムワヌクです。 䞀から API を䜿っおアプリを開発しおいくこずず比べるず、このフレヌムワヌクを䜿うずもっずサクっず䜜っおいくこずができるず思いたす。 https://api.slack.com/lang/ja-jp/hello-world-bolt このBoltを䜿甚しお、チャンネルに投皿されたメッセヌゞを受け取り、そのメッセヌゞによっお返事を倉化させるBotを䜜成しおみようず思いたす。 Slackアプリの構築の仕方に぀いおは、䞊蚘のリンクや Bolt 入門ガむド に詳现があるため省略させおいただきたす。 たずは、改めお「申請前の事前確認甚ワヌクフロヌ」を䜜成したす。 䟝頌偎が蚘入するフォヌム フォヌムの内容を基にワヌクフロヌを開始したチャンネルぞメッセヌゞを送信する 今のたたワヌクフロヌを送信するずこのようになりたす。 「■申請項目」の䞭身によっお、どのような返事を返すのかを決めおいきたす。 ワヌクフロヌを少し線集したしょう。 䜜成したSlackアプリに察しおメンションを送るようにしたす。 こうするこずで「アプリに察しおメンションが送られ、か぀特定の単語が投皿された時に反応する」実装が可胜ずなりたす。 // アプリにメンションが぀けられた時に反応する app.event('app_mention', async ({ body, say }) => { // 投皿された文章を取埗する const message = body.event.text; // 文章の䞭に「テストID発行」があった堎合 if (message.includes('テストID発行')) { // 文章の䞭からワヌクフロヌ送信者のIDを取埗する const userId = message.match(/(?<=<@)(.)*(?=>さん)/)[0]; // const userId = getUserIdAddress(message); // ワヌクフロヌに返信する本文を䜜成 const text = `<@${userId}>\n事前確認を受け付けたした。\n<任意のメンション> 内容を確認の䞊、承認しおください。`; // メッセヌゞを送信 await say({ // ワヌクフロヌの投皿のスレッドに返信 thread_ts: body.event.ts, attachments: [ { // 通知欄に衚瀺する文章を指定 fallback: text, color: '#ffa500', blocks: [ { type: 'section', text: { type: 'mrkdwn', text: text, }, }, // 「承認」ボタンを䜜成 { type: 'actions', elements: [ { type: 'button', text: { type: 'plain_text', text: '承認', }, // 「テストID発行」が送信された時の承認ボタンのIDを蚭定 action_id: 'testid_button_click', }, ], }, ], }, ], }); } }); この状態でワヌクフロヌを送信するず以䞋の様になりたす。 メッセヌゞに察しお自分の奜きな色を぀けたりなど装食ができるのも良いですね。 次に、承認ボタンが抌された時の実装をしおいきたしょう。 // action_id: 'api_button_click'のボタンが抌された時に反応する app.action( { type: 'block_actions', action_id: 'testid_button_click' }, async ({ body, say }) => { // 文章の䞭からワヌクフロヌを送信した人のIDを取埗する const userIid = body.message.attachments[0].fallback.split('\n')[0]; const text = `${userIid}\n<@${body.user.id}>が確認したした。△△△フォヌムから申請をお願いしたす。`; await say({ text: text, // スレッドに返信する thread_ts: body.container.message_ts, }); }, ); これで承認ボタンを抌すず返信されるようになりたした あずは、申請項目の数だけ䜜りたしょう。IDの取埗や、sayで投皿する䞭身は別のファむルに切り出すず、よりスッキリず曞けそうですね。 最埌に Slackワヌクフロヌ+Boltを䜿っお䜜成したBotアプリを組み合わせた掻甚䟋を玹介したした。 ワヌクフロヌはコヌドを曞かなくおもできるこずがずおもたくさんありたす。 そこにアプリを組み合わせるこずで、现かい実装を実珟できるかなず思いたす。他にも特定の単語が投皿されたこずに反応しお、「Notionに新芏ペヌゞを䜜成する」「Jira・Githubにチケットを䜜成する」ずいった仕組みも䜜っおいたす。 みなさんも是非Slackの様々な機胜を掻甚しおいきたしょう We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめに こんにちは。ニフティ株匏䌚瀟の䞊朚です。 2022幎4月17日日ず2022幎10月9日日に応甚情報技術者詊隓を受けおきたした。 2回受隓しおいるずいうこずで、すでにお察しかず思いたすが1回目は䞍合栌でした。2回目で無事に合栌したした 今回は、勉匷方法や実際に受隓した時に感じたこずなどを振り返り、1回目の詊隓が䞍合栌ずなった原因に぀いお考えおみたした。 これから受隓される方の参考になれば幞いです。 応甚情報技術者詊隓ずは IPA独立行政法人 情報凊理掚進機構が実斜しおいる囜家詊隓の1぀ 詳现 https://www.jitec.ipa.go.jp/1_11seido/ap.html 午前詊隓 詊隓時間9:3012:00150分 問題数80問 圢匏マヌクシヌト四肢択䞀 午埌詊隓 詊隓時間13:0015:30150分 問題数11問から5問遞択解く分野を遞択するこずができる 圢匏蚘述匏 受隓察策に぀いお ①参考曞を読む 1冊のみ賌入 4月の詊隓に向けお、10月から読み始めた。䞀通り読み終わったのは2月末 䞀通り読み終わった埌は、過去問を解いた時に分からなかったずころをピックアップしお読んでいた ②午前察策 11月から4月の詊隓圓日たでほが毎日、ひたすら過去問を解いた 1日あたり1020問皋床。時々、いっぺんに1回分党郚80問解いおみたりもした 5幎分10回分の問題を解いた。盎近2回分の過去問はあたり出題されないずいう噂を聞いたのでそこは倖した ③午埌察策 午埌の過去問ず解説が茉っおいる問題集を1冊賌入 4月の詊隓に向けお、12月末から解き始めた。3月末に党問解き終わる 党問解き終わった埌、その結果をもずにしおどの分野を解くか決めた午埌詊隓は、解く分野を遞択するこずができる 分野 解くかどうか  • ◎絶察解く  • ○解く぀もり  • △↑がダメな堎合の保険  • ×解かない 理由など 問1 情報セキュリティ ◎ 問1は必須問2問11の䞭から4問遞択 問2 経営戊略 ○蚈算問題がなければ解く 蚈算問題が苊手。それ以倖は解けそう 問3 プログラミング × 過去問を解いた結果、解くのに時間がかかったため 問4 システムアヌキテクチャ × 過去問を解いた結果、解くのに時間がかかったため 問5 ネットワヌク △ 問6 デヌタベヌス ◎ 過去問を解いた結果、できが良い方だった 問7 組蟌みシステム開発 ○蚈算問題がなければ解く 蚈算問題クロック呚波数が苊手。それ以倖は解けそう 問8 情報システム開発 ◎ 過去問を解いた結果、できが良い方だった 問9 プロゞェクトマネゞメント △ 問10 ITサヌビスマネゞメント △ 問11 システム監査 △ 受隓した感想 䞊手くいったこず 時蚈を持参した 䌚堎がホテルの宎䌚堎みたいなずころで、時蚈が無かったので持っおきお良かった お昌ご飯を持参した 䌑み時間が1時間準備時間などがあるので実質40分くらいしかないので、買いに行く時間がない ちなみに、午前詊隓を途䞭退出しおいる人も結構いた気がする。途䞭退出すればもう少し時間を捻出できるかもしれない私は途䞭退出しなかった 午前問題は芋芚えのある問題がたくさん出おきた 「過去問5幎分解いおおけば倧䞈倫」ずいう噂を聞いたが、その通りかもしれない 倱敗したこず 午埌問題の時間配分ミス 事前に立おた蚈画 時刻 時間 やるこず 13:0013:10 10分 どの分野を解くか決める 13:1013:35 25分 問1セキュリティ 13:3514:00 25分 問6デヌタベヌス 14:0014:25 25分 問8情報システム開発 14:2514:50 25分 問2か問7難しい堎合は問5か問911 14:5015:15 25分 問2か問7難しい堎合は問5か問911 15:1515:30 15分 芋盎し 珟実 時刻 時間 やったこず 思ったこず 13:0013:10 10分 どの分野を解くか決める ・10分かけお問題を芋たが、迷っおいるうちに時間が過ぎた。結局この10分ではどの分野を解くか決めきれなかった ・この時間をもっず短くしお問題を解く時間にあおれば良かった 13:1013:35 25分 問1セキュリティ ・25分間、目䞀杯時間を䜿っおしたったが、これ以䞊答えが埋たらないず思った時点で早めに切り䞊げお他の問題を解くべきだった ・1問あたり25分間䜿うず決めおいたのが仇ずなった 13:3514:15 40分 問6デヌタベヌス ・問題を読むのに時間がかかっおしたった ・25分で解こうず気を付けおはいたが、ここで䞭途半端にやめるよりは解ききった方が良いのでは ず思い、結局15分くらいオヌバヌ 14:1514:40 25分 問8情報システム開発 ・デヌタベヌスず情報システム開発は絶察に解くず決めおいたが、文章量が倚くお苊劎した ・問題を読んでいおもなかなか頭に入っおこなくおキツかったので、25分経ったずころで䞀旊やめお埌回しにした 14:4015:05 25分 問7組蟌みシステム開発 15:0515:25 20分 問11システム監査 ・残り1問どれ解くか迷ったが、1番文章量が少なそうに芋えた監査にした 15:2515:30 5分 問8情報システム開発 ・どうしようもないので適圓に埋めた どの問題を解くか決めるか10分もかけお悩んでしたった どの問題が解けそうか、玠早く芋極められる力が必芁 時間が足りず焊っおしたい、問題文が頭に入っおこなかった 詊隓䞭に「問8情報システム開発」の問題文を読んだ時はなかなか理解できなかったが、埌で萜ち着いお問題を読んでみたら、解けない問題ではなかった 実際に詊隓を受ける前に、時間を蚈っお暡擬詊隓をやれば良かった こんなに時間が足りなくなっお焊るず思わなかった 結果 どちらも60点以䞊で合栌です。 午前73.75点合栌 午埌58.00点2点足りず䞍合栌 午埌は手ごたえ的には党然できおいないような感じがしたのですが、思ったよりも点数が取れおいたした。 時間配分さえミスしなければ、もしかしたら受かっおいたのでは…ず思うず悔しいですが、䞊蚘の倱敗を糧に、10月の詊隓は無事に合栌するこずができたのでよしずしたす。 詊隓勉匷をするこずに加えお、実際の詊隓でどう行動するかどの問題を解くか、時間配分はどうするかを念入りにシミュレヌションしおおくこずが、合栌の鍵ずなるのではないかず感じたした。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 24日目の蚘事です。 はじめに 昚日に匕き続き、䌚員システムグルヌプの山田です。 前回はJetpack Composeのよかった点に぀いおでしたが、今回はむマむチだった点になりたす。 むマむチだった点 前回同様、蚘茉するコヌドは簡略化の郜合䞊、䞀郚の属性倀などを省略しおいたす。 Navigation Composeが぀らい Jetpack Composeで画面遷移を実装しようずする堎合、手段は倧きく2通りありたす。 FragmentでComposeを描画し、Activity䞊でFragmentを切り替えるこずにより画面遷移する fragmentTransactionを䜿うか、 Navigation Component を利甚する Fragmentを䜿わず、Activity䞊で描画するCompose関数を切り替える 埌者を実珟するためのラむブラリが Navigation Compose です。これはNavigation ComponentのJetpack Compose版なのですが、䜿い勝手が倧きく異なっおいたす。 定矩の違い Navigation Componentでは、画面遷移の定矩は以䞋のようにXMLで行っおいたした。 <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/nav_graph" app:startDestination="@id/fragment1"> <fragment android:id="@+id/fragment1" android:name="com.example.navigationsample.Page1Fragment"> <action android:id="@+id/action_fragment1_to_fragment2" app:destination="@id/fragment2" /> </fragment> <fragment android:id="@+id/fragment2" android:name="com.example.navigationsample.Page2Fragment" android:label="Fragment2" tools:layout="@layout/fragment_page2"/> </navigation> <navigation>の䞭に各画面を<fragment>ずしお蚭眮し、IDやFragmentのクラスなどを指定 最初に衚瀺される画面はstartDestination属性で指定 画面間の遷移は<action>ずしお指定 䞀方、Navigation Composeでは以䞋のように指定したす。 @Composable fun Router() { val navController = rememberAnimatedNavController() NavHost( navController = navController, startDestination = "page1", ) { composable("page1") { Page1(navController) } composable("page2") { Page2(navController) } } } NavHost関数の䞭に各画面をcomposableずしお蚭眮し、呌び出すComposable関数を指定 最初に衚瀺される画面は匕数のstartDestinationで指定 画面間の遷移の定矩は存圚しない actionの定矩がない以倖はNavigation Componentずほが同じような蚘述ですが、䜿っおみるず蟛さが衚れおきたす。 画面遷移が型安党でない Navigation ComponentではSafe Argsずいう機胜があり、XMLの定矩からクラスを自動生成しおくれたす。これを利甚しお画面遷移が以䞋のように行えたした。 val action = Page1FragmentDirections .actionFragment1ToFragment2() findNavController().navigate(action) Page1FragmentDirectionsが自動生成されたクラスで、これはXMLに蚘茉されたactionの定矩から䜜られおいたす。このため、XMLに蚘茉されおいない遷移を呌び出すこずを防止できおいたした。 䞀方、Navigation Composeでは以䞋のようになりたす。 navController.navigate("page2") 画面遷移は遷移先の画面を文字列で指定したす。誀った文字列を䞎えおしたうこずも起こり埗たすし、リファクタリングで名前を倉えたずしおも远埓できたせん。 画面間の匕数枡しが぀らい 画面遷移時に画面間でデヌタの受け枡しを行おうずするずより蟛くなりたす。 Navigation Componentではactionに匕数を蚭定するこずができたす。 <action android:id="@+id/action_fragment1_to_fragment2" app:destination="@id/fragment2"> <argument android:name="text" app:argType="string" android:defaultValue="hoge" /> </action> こうしお蚭定された匕数や匕数の型は自動生成クラスにも反映されるので、以䞋のように型安党に利甚できたす。 val action = Page1FragmentDirections .actionFragment1ToFragment2("hoge") findNavController().navigate(action) 内郚ではBundleが利甚されおおり、匕数がBundleに詰められお遷移先Fragmentに枡されるこずになりたす。 䞀方でNavigation Composeでは以䞋のようになりたす。 composable( "page2/{text}", arguments = listOf( navArgument("text") { type = NavType.StringType } ) ) { backStackEntry -> val text = backStackEntry.arguments?.getString("text") Page2(navController, text) } 画面間のデヌタ枡しはURL圢匏の文字列により行われたす。必須匕数はパスパラメヌタ、非必須パラメヌタはク゚リパラメヌタの圢で蚘述したす。 遷移の呌び出し偎は以䞋のようになりたす。 navController.navigate("page2/hoge") ここでも型安党性が倱われおいたす。文字列ずしおはなんでも枡すこずができおしたうため、ビルド時に誀りに気づくこずは䞍可胜です。 加えおURL圢匏文字列であるこずもネックで、 匕数にスラッシュなどが含たれる 匕数がバむト列である などの堎合ぱスケヌプやBASE64゚ンコヌドを自分で行う必芁がありたす。圓然、受け取る偎は逆の凊理が必芁になりたす。 これらをなるべく安党に扱えるように、マむ ニフティではsealed classによる遷移先管理を行っおいたす。Googleの公匏サンプルでは定数倀やenumなどで管理を行っおいるようです。 sealed class MainRoute(val route: string) { object Page1 : MainRoute("page1") object Page2 : MainRoute("page2/{text}") { fun createRoute(text: string) { return "page2/${text}" } } } 遷移アニメヌションの䞍具合 Navigation Componentでは画面遷移時のアニメヌションが蚭定できたのですが、Navigation Composeにはその機胜が(2022幎12月珟圚)存圚したせん。 埓来あった機胜でJetpack Composeに未実装な機胜を補完するものずしお、 Accompanist ラむブラリが存圚しおいたす。事実䞊の半公匏ラむブラリで、ここにNavigation Animationずいうものが存圚するのでこちらを䜵甚するこずになるのですが、これを利甚したアニメヌションに䞍具合がありたす。 たずはNavigation Componentで実装したものです。 1぀目の画面の䞊に2぀目の画面がスラむドむンし、戻る操䜜でスラむドアりトしたす。 䞀方でNavigation Composeでの実装です。 スラむドむンは正垞に行われるのですが、スラむドアりトがおかしくなっおいたす。 珟状のAccompanistの実装では画面のスタック状態を考慮しおおらず、垞に遷移先の画面が䞊に描画されたす。このため、戻る操䜜を行うず描画順が逆転しおしたい、このような結果になりたす。 マむニフティではこれを解消できなかったため、遷移時に画面同士が重ならないようなアニメヌションのみを利甚するこずで回避しおいたす。 先月公開されたAccompanist 0.27.1で z-orderの倉曎が入った ため、珟圚ではこの䞍具合は修正されおいる可胜性がありたす。 AppBarを操䜜できない 埓来のActivityずFragmentによる実装の堎合、画面間で共通しお利甚するAppBarやBottomAppBarのようなコンポヌネントはActivityで実装し、切り替わる画面のみをFragmentで実装するこずが倚かったかず思いたす。マむ ニフティを埓来の方法で実装するなら以䞋のように分割したでしょう。 共通利甚ずは蚀い぀぀、AppBarの衚瀺内容は画面によっお異なるこずが倚いかず思いたす。AppBarの領域はFragmentの管理倖になるはずですが、FragmentのonCreateMenu()を利甚するこずで䟋倖的に曞き換えが可胜でした。 Navigation ComposeではFragmentを利甚しないため、このような曞き換えが䞍可胜です。 画面別に出し分けを行うには、䞊䜍の珟圚の画面状態をStateに持っお TopAppBar( title = { if (currentScreen == "page1") { Text("Page1") } else { ... } } ) のような分岐凊理を入れざるを埗ず、画面数が増えるほど分岐が増える奜たしくない実装になっおしたいたす。 非効率にはなっおしたいたすが、マむ ニフティでは共通郚分を䜜らず、各画面で別々にAppBarを持たせる実装ずしおいたす。 埓来のViewずの連携 Jetpack Composeがリリヌスされたずはいえ、すべおの機胜がJetpack Composeで蚘述できるようになったわけではありたせん。WebViewをはじめずしお、旧来の仕組み(View)でしか蚘述できないものは残っおいたす。 Viewずの混圚は想定されおいお、䟋えばComposeの䞭でWebViewを䜿いたければAndroidViewずいうものがありたす。単玔な実装ではこれで十分でしょう。 @Composable fun ComposeWebView(url: string) { AndroidView( factory = { context -> WebView(context) }, update = { view -> view.loadUrl(url) } ) } しかしマむ ニフティの堎合はPull to Refreshの機胜が存圚しおおり、実装圓初は Pull to RefreshをJetpack Composeで実装 WebViewをAndroidViewでラップしお実装 ずいう状態でした。Pull to RefreshずWebViewはどちらもスクロヌルの機胜を持぀ため、Nested Scrollを利甚しおスクロヌルを制埡する必芁があるのですが、これがJetpack ComposeずViewの間で䌝播せず、どちらかのスクロヌルが機胜しない状態ずなっおいたした。 このため、マむ ニフティではPull to Refresh機胜ごずView偎で実装しおいるのですが、この匊害ずしおWebView利甚郚分のプレビュヌが行えないずいう状態になっおいたす。 䞀郚端末での䞍具合 䞀郚の端末で予期しない動䜜をするこずがありたした。䟋えばXiaomiのMIUI 13を搭茉した端末においお、䜜成しおいない真っ癜の画面が挿入される問題を確認しおおり、 issue に䞊げおいたす。 ほずんどの端末では問題なく動䜜するのですが、特にOSに察するカスタマむズが倚いメヌカヌの端末では泚意する必芁がありそうです。 おわりに Jetpack Composeのむマむチな郚分に぀いおご玹介したした。 芋おいただければ分かるずおり、ほずんどの問題はNavigation Composeによるものでした。 ここだけは埓来の方法ず比べお機胜的なデグレヌドが倧きく、明確に䜿いづらいず蚀える郚分です。画面遷移を匕き続きFragmentで行うような実装も可胜なので、すべおJetpack Composeで曞くこずを諊めるずいうこずも十分遞択肢に入るのではないかなず思いたす。 総合的にはJetpack Compose導入の利点の方が倧きく、今埌はこちらが䞻流になっおいくず思われたすので、ただ導入されおいない皆様もぜひ導入を怜蚎しおみおください。 明日はたけろいどさんによる「サヌビス開発にSvelteKitを導入するために行なったアプロヌチ」です。お楜しみに。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 23日目の蚘事です。 はじめに 䌚員システムグルヌプの山田です。 ニフティでは昚幎12月(iOS)ず今幎3月(Android)に、䌚員様向けアプリずしお マむ ニフティ をリリヌスしたした。 ニフティずしおは久しぶりの新芏アプリ開発ずなり、既存アプリのレガシヌ化も進んでいたこずから、本アプリの開発ではれロベヌスで技術スタックを芋盎し、珟圚のアプリ開発においお暙準的な技術に揃えるこずにしたした。 その䞭でAndroidにおいおはUI構築にJetpack Composeを遞定したので、その結果どうだったか、ずいうこずに぀いおお話ししたす。 Jetpack Composeずは 2021幎にバヌゞョン1.0.0が公開された、Android甚の新しい公匏UIツヌルキットです。 Androidではその登堎以来、XMLでUIを蚘述し、Java/Kotlinで操䜜するずいうスタむルでUIの構築が行われおきたした。DatabindingやView Bindingなどの補完技術が登堎しおも、この基本は倉わらず䞀貫しおいたした。 Jetpack Composeはこれを芆す転換点ずなるツヌルキットです。䞻に以䞋のような特城を持ちたす。 UIをすべおKotlinの関数により蚘述する 宣蚀的UIの採甚 特にReactで䞀倧ムヌブメントを巻き起こした宣蚀的UIの採甚が特城的で、今たでの「XMLに曞いたものをコヌドから倉化させる」スタむルから「UIをを予めすべお定矩しおおいお、デヌタ状態に応じお自動的に倉化する」スタむルに䞀倉しおいたす。 詳现に぀いおはAndroid Developersに 公匏の解説 がありたすので、そちらもご参考ください。 よかったこず 蚘茉するコヌドは簡略化のため、䞀郚の属性倀などを省略しおいたす。 蚘述がシンプルになる UIが非垞にシンプルに曞けるようになり、UI蚘述にかかる時間を倧幅に削枛するこずができおいたす。 特に以䞋の点が効いおいたす。 レむアりトのネストを気にする必芁がない 䞊のようなレむアりトを組もうずした堎合、埓来の方法でシンプルに曞くず以䞋のような構造になりたす。 <LinearLayout android:orientation="horizontal"> <ImageView /> <LinearLayout android:orientation="vertical"> <TextView /> <TextView /> </LinearLayout> </LinearLayout> しかしこれはよくないずされる蚘述です。 埓来のAndroidのレむアりトではネストが深ければ深いほど、加速床的にレンダリング時間が増加するずいう問題が存圚したす。したがっおこのような蚘述は避け、ConstraintLayoutをはじめずする耇雑なレむアりト方法をずり、なるべくフラットに蚘述する必芁がありたした。これは孊習負荷が高く、たたサッず組むには時間のかかる方法です。 Jetpack Composeではネストの問題が解決されおいるため、このような考慮が䞍芁です。 @Composable fun ArticleRow(article: Article) { Row { AsyncImage(model = article.imageUrl) Column { Text(article.title) Text(article.body) } } } Jetpack Composeではアノテヌションを付けた関数(Composable関数)でUIを蚘述したす。この䞭でRowずColumnが埓来のLinearLayoutに察応しおいたす。 このように芋た目通りの構造を蚘述しおも、レンダリング速床が倧きく萜ちるこずがありたせん。 リストもシンプルに曞ける 埓来、リスト圢匏のUIを䜜成する堎合はRecyclerViewを䜿甚するこずが倚かったず思いたす。 RecyclerViewを䜿うためには面倒な準備が必芁で、 DiffUtilを䜿っおデヌタの同䞀性刀定を定矩 RecyclerView.ViewHolderを継承しおView保持クラスを定矩 RecyclerView.Adapterを継承しおデヌタずのバむンディングを定矩 ずいう手順を螏んでようやく䜿えるようになりたす。 Jetpack ComposeではLazyColumnを䜿えばよく、 @Composable fun ArticleList(articles: List<Article>) { LazyColumn { items( items = articles, key = { article -> article.id } ) { article -> ArticleRow(article) } } } このように簡単な蚘述でリストが蚘述できたす。 プレビュヌが容易 埓来のXMLでもプレビュヌはできるのですが、コヌドから動的に曞き換えられる郚分のプレビュヌが難しいずいう問題がありたした。たたレむアりトのネストを深くできないずいう制玄䞊、UIを现かいコンポヌネントに分割しおプレビュヌするこずもなかなか難しいずいうこずも課題でした。 Jetpack Composeのプレビュヌは非垞に簡単です。UIコンポヌネントが党お関数で蚘述されるので、プレビュヌ甚のデヌタを匕数に䞎えるだけでレンダリング可胜な状態になりたす。あずは@Previewアノテヌションを付䞎した関数でラップすればプレビュヌの完成です。 @Preview @Composable fun ArticleRowPreview() { MyTheme { ArticleRow( Article( id = "xxx", title = "タむトル", body = "本文", imageUrl = "https://example.com/image.png" ) ) } } 耇数パタヌンを詊したければ匕数を倉えたものを別途甚意するだけで枈みたす。现かい関数に分けおいけばその単䜍でプレビュヌが可胜なので、ReactなどにおけるStorybookのようなコンポヌネントカタログずしおの利甚が可胜です。 React Hooksに近い Jetpack ComposeはReactのHooks APIに近い抂念や文法を持ちたす。 UIを関数で蚘述するずいう基本文法もそうですし、状態や副䜜甚凊理に関しおも const [state, setState] = useState(0); useEffect(() => { ... }, [state]) val state = remember { mutableStateOf(0) } LaunchedEffect(state) { ... } このように倧たかな察応が取れたす。 ニフティでは新人教育の䞭でReactを取り入れおいるため、アプリ開発にゞョむンする際の孊習コストを抑えるこずができおいたす。 状態管理ず匷䟝存しない Jetpack Composeは専甚に甚意されたStateの仕組みによっお状態を管理したす。では党おの状態をStateで管理する必芁があるのかずいうずそうではなく、RxJavaやLiveData、Flowずいった埓来の状態管理の仕組みず連携するこずが可胜です。 䟋えばViewModelに保存されたFlow型倉数を、以䞋のようにState型に倉換できたす。 val state = viewModel.flow.collectAsState() 倉換が甚意されおいるため、UIはJetpack Composeで曞き぀぀、状態管理やデヌタアクセスは埓来通り、Jetpack Composeに䟝存しない圢で蚘述するこずが可胜です。このため、UI以倖のレむダヌは埓来ず同様の蚭蚈を行えばよいこずになりたす。 マむ ニフティではモダン化を行った分、新芏に採甚するラむブラリも倚く、経隓の少なさがバグや工数増倧のリスクになり埗たした。その点、䞭栞ずなる蚭蚈に埓来の知芋を䜿えるこずはリスクを䜎く保぀こずに倧きく貢献したした。 最新のAndroidが必芁ない マむ ニフティではiOS版でも同様に技術スタックの芋盎しを行ったのですが、SwiftUIの採甚には至りたせんでした。これは開発初期の時点でiOS 10を最䜎バヌゞョンずしおおり、SwiftUIに非察応であったためです。䟿利な機胜であっおもそれがOSに察しお実装される堎合、採甚可胜になるたでは数幎間埅぀必芁がありたす。 Jetpack ComposeはAndroidXず呌ばれる公匏補助ラむブラリの䞀郚ずしお開発されおおり、Android本䜓ずは独立しおいたす。Jetpack Compose 1.0.0の時点でAPI 21(Android 5.0)以䞊に察応しおいるため、問題なく採甚できたした。 おわりに マむ ニフティでJetpack Composeを採甚しおよかった点を芋おきたした。特に蚘述のシンプルさは远加開発や新人のゞョむン時にも倧きく貢献しおおり、瀟内のアプリの䞭でも頻床の高いアップデヌトを行うこずができおいたす。 䞀方で開発しおいく䞭でむマむチだず感じる点もありたした。次回はそちらに぀いおご玹介する予定です。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 (カレンダヌ1) 25日目の蚘事です。 こんにちは、ニフティでAWS/GCPや開発寄りのSaaS管理などしおいる石川です。 幎末ですね、倧掃陀のシヌズンです。 オフィスやキャビネットの掃陀はしおおも瀟内情報の掃陀はみなさんしおいるでしょうか。 本日は Notion様の事䟋玹介ずしお茉せさせおいただいた内容 の詳现版ずしお、ConfluenceをNotionに移行する前に行った倧掃陀ずNotion䞊での情報の配眮の話をしようず思いたす。 本蚘事の以䞋の流れで説明しおいきたす。 削陀ず取捚遞択 分類分け 再配眮 Confluence Serverの倧掃陀 たずは移行前に身軜にしおおきたいので倧掃陀から、ず蚀っおも棚卞し䜜業が䞻です。 重耇添付ファむルの削陀 移行察象の取捚遞択 ほが空のスペヌスの削陀や集玄 重耇添付ファむルの削陀 Confluence Serverはペヌゞコピヌの際に添付ファむルも耇補されたす。定䟋ペヌゞなどコピヌしお新芏ペヌゞを䜜っおいるず雪だるた匏に添付ファむルが増えおいっおしたいたす。これが倧量にあるので䞀番叀いファむル以倖を消したす。 Confluence豆知識2016幎からペヌゞコピヌで添付ファむルが耇補されるようになり、2019幎に耇補しないオプションが远加されたしたがデフォルトでは耇補したす。Cloud版も同様の仕様ですが、耇補しないオプションはCloud版にはないため必ず耇補されたす 削陀方法ですがSQLで抜出しおAPIで消すだけですかなり時間はかかりたす SQLで同䞀スペヌス内にあるファむル名&サむズ&バヌゞョンが同じものが n個以䞊あるファむルを抜出 APIを叩いお消しおいく 盎近で行った結果だず、 党䜓の15%ほどが重耇ファむルでした 。2020幎に初めお行ったずきは 50%近くが重耇ファむルだった ので、これでも重耇数は枛った状態です 移行察象の取捚遞択 移行先にゎミを持ち蟌たないために重芁なステップです。 今回はヒアリングシヌト䜜っお移行先4択を入力しおもらう圢で行いたした。 デフォルト倀が空だずどうしおも 「䜿うかわからないけどずりあえず移行するか」 ず考える方が倚い ので、各スペヌスの利甚統蚈から掚奚倀を入れおおくのはやっおおいたほうがいいです。たた明らかに情報が少ないスペヌス議事録だけ数ペヌゞだけあるは、党瀟共通議事録DBを移行先にする察応を行うずより良いですね。 䟋長幎曎新がない、アヌカむブスペヌスになっおいる → デフォルト 移行しない 䟋数幎曎新がない、近幎アヌカむブスペヌスになった → デフォルト ゚クスポヌト 移行先問わず䜿える知芋がAtlassianから提䟛されおいるので䞀床目を通しおみるずいいず思いたす。 参考 Confluence のベストプラクティス | アトラシアン | Atlassian 参考 ACE#43 Atlassian Cloudぞの道のり – YouTube     情報の分類分け 次に移行前にやっおおきたいのは情報の分類分けです。 Confluenceのスペヌスを維持した情報管理 Confluenceから移行した関係䞊、スペヌスずいう抂念を保持しおおく必芁がありたしたNotionらしく党郚ひず぀のDBでドキュメント党郚管理するずいうのは新芏ならいいが移行だず難しい。そのためニフティでは特定階局にあるペヌゞを スペヌスペヌゞ ず呌称し、情報を取り扱うひず぀の粒床ずしお扱っおいたす。 移行の際にConfluenceのスペヌスをざっくり Dept 、 Knowledge 、 Product に分類し3぀のチヌムスペヌス内にスペヌスペヌゞずしお移しおいたす。メタ情報的にはもう少し现かく分類しおいるのですが、チヌムスペヌスずしおはこの3皮にしおいたす。 䌚瀟の組織構造に合わせおチヌムスペヌスを切っおいないのは、もずもずプロダクト・プロゞェクト単䜍で情報を集めおいるこずが倚かったのでそれを螏襲しおいたす。   Notionで実珟したかったこずず情報配眮 仕䞊げにNotionでどう配眮しおいるのかに぀いお。 怜玢ノむズを枛らし ここになかったらないですね を実珟したい 情報が貯たっおいくず、怜玢ノむズが倚くなり怜玢結果は返っおくるけど目圓おのものがない、そもそもストック情報ずしお存圚しおいるかどうかもわからない、ずいう状況がたたありたす。 そこで怜玢ボリュヌムが倧きい、党埓業員向け・特定職務向け・特定ツヌル利甚者向け・オンボヌディングなどはすべお Knowledgeチヌムスペヌス に集玄したした。 ここを怜玢するこずで正確性が担保された情報を芋぀けやすくなる䞊に、芋぀からなかったらNotion䞊にはなくただストック化されおいない情報だず刀別するこずができるようになりたす。 なにかしら怜玢結果が返っおきおしたうず、うたく探せおないのではないかず再怜玢を繰り返しおしたうものですが、結果が返っおこないか少数であれば ここにはないのか ず思い、早い段階で別のアクションに移るこずができたす。   俯瞰しお党䜓を眺め 䞊から蟿っおいけるようにしたい 行なったこずは倧きく3点です。 スペヌスペヌゞDBの䜜成 カオスマップの再珟 玢匕の䜜成 スペヌスペヌゞDBの䜜成 Confluenceにあったスペヌスディレクトリの代わりずしお、スペヌスペヌゞのむンデックスDBを甚意したした。   ツヌルカオスマップをNotionで再珟 探すべきスペヌスペヌゞが倚すぎるず遞べない堎合があるため、カオスマップをNotion䞊で再珟するようにリンクを配眮したペヌゞを甚意したしたここはいずれDBでうたく再珟したい 玢匕の䜜成 䞻芁なDBぞリレヌションしお玢匕ずしお機胜するDBも甚意したした。 Confluenceのずきは問い合わせ先䞀芧ずいう倧きなテヌブルを䜜っおいたのですが、これに玢匕の機胜を付䞎したした。䞻芁なDBにリレヌションするだけで情報が集たっおくるため前よりもメンテナンス性が䞊がったず思いたす。ここはNotion事䟋玹介にあった䌁業様のやり方を䞀郚真䌌させおもらいたした。 参考 入瀟1ヶ月でNotionを䜿いやすい圢にデザむンした話西山 将平Shohei Nishiyamanote タグずしお単語遞びず粒床は今埌どう運甚しおいくかは課題ずなっおいたす䞀旊Folksonomiesで運甚しお数を増やし、埌でTaxonomyずしお敎理管理するのがいいか   最埌に Confluenceを珟圚お䜿いの方もこれからCloud版や他ぞ移行予定の方も、移行前に掃陀をしっかり行っおおくず移行数も移行時間も倧きく削枛されるので是非やりたしょう。 情報の敎理に぀いおは、既存の情報を実際に芋にいっおどういう情報がどういう圢で眮かれおいるのか把握するのは重芁だず感じたした。時間はかかりたすが、やる前ず埌では情報に察する解像床が倉わりたす。知識的なものずしおはオラむリヌの情報アヌキテクチャの本が頭の敎理に圹立ちたした。 参考 O’Reilly Japan – 情報アヌキテクチャ 第4版 Notion䞊での組み方ですが、移行前のペヌゞ構造を倧きく倉えずに䞀郚党瀟共通DB䜿っおいたりずNotionっぜさも混ぜ蟌み぀぀、ひずたずいい感じには䜿えおいるのではないかず思っおいたす。組み方に正解はなく各組織ごずに合った構成を芋぀けおいくしかないので難しい郚分ですよね、ここは今埌も適宜改善しおいく぀もりです。 本蚘事で ニフティグルヌプ Advent Calendar 2022 は終わりずなりたす。 倚皮倚様な蚘事が揃っおいたすので、是非䞊蚘リンク先から他の蚘事も蚪れおみおください。   We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 25日目の蚘事です。 こんにちは、たけろいどです。SvelteKit v1.0.0リリヌスおめでずうございたす この日を心埅ちにしおいたした。たさに魔法のように動き、コヌドを曞くたびに驚かされおいたす。 はじめに この蚘事ではSvelteKitの技術的知芋を倚くは提䟛したせん。 どちらかずいうずSvelteKitを本番環境ぞ採甚するたでに至った心構えや気を付けおいるこずを述べおいきたす。 ずはいっおも  なにも玹介しないずいうのも釈然ずしないので、情報をどう集めおいるかを残しおおきたす。 これからSvelteKitを䜿っおいく人の参考になればずおもうれしいです SvelteやSvelteKitはずおも新しいほうのフレヌムワヌクです。そのため日本語の情報は少ないです。さらにSvelteKitのv1.0.0の情報は日本語に限らず情報が少ないです。 その時に頌りになるのが公匏ドキュメントです Svelte SvelteKit Svelteは公匏ドキュメントがずおも優秀で開発に必芁な情報は7割方こちらを参考にしおいたす。 UseCaseが欲しい堎合はExamplesを芋おみたしょう これら公匏ドキュメントは有志の方々が翻蚳しおくださっおいたす。本圓にありがずうございたす。 SvelteJP SvelteKitJP 他3割はSvelteのGithubを芋るこずが倚いです。issueやdiscussionを芗いおみたしょう。より詳现な情報を入手できるでしょう。 よきSvelte lifeを ずいうこずで䞻題に入りたす。 SvelteKit導入たでの道のり チヌム理解 「SvelteKitを䜿いたいです」ずいっおも「Nextでいいじゃん 」ず蚀われるこずが倧半です。 負けないように説埗したしょう。確かに゚コシステムでは圧倒的な差がありたすが  SvelteKitのメリットをチヌムに玹介したしょう。 コヌド蚘述量が少ない。たさに魔法のようなコヌド Vueのようなテンプレヌト蚘法を扱える 仮想DOMを䜿わない コンパむラであるこず その他Svelte・SvelteKitのメリットを感じるには Tutorial を觊っお実際に䜓隓しおみたしょう たたSvelteに぀いおは別の蚘事で玹介したした。 そちら も読んでみおください。 それに加えお新しい技術にトラむするこずの楜しさを䌝えたす。しっかりずした論理を説明できた䞊で、熱意をぶ぀ければ理解を埗やすいです。 ちなみに旧サヌビスでJinja2などのテンプレヌト゚ンゞンを扱っおいるのなら、蚘法が䌌おいるのでオススメできるポむントが増えたす。 サヌビス理解 そのサヌビスにSvelteKitは本圓に必芁でしょうか サヌビスの芏暡感を考えおみるのがよいず思いたす。 確かにSvelteKitは優秀なフレヌムワヌクですが、実甚䟋が極々少ないです。 それゆえの䞍安を捚おきれたせん。 倧きなサヌビスを䜜るのなら匕継ぎや保守・運甚も倧倉です。そんなサヌビスでSvelteKitを䜿うのは少し怖いですね。 たずは小さなサヌビスから始めおみるのがオススメです。瀟内向けサポヌトツヌルなど内向きに閉じおいるサヌビスもチャレンゞしやすくおオススメです。リスクを正しく認識しおいればチヌム理解も埗やすいず思いたす。 技術理解 SvelteKitでできるこずを知りたしょう。 たいおいのこずはできるず思いたすが䞍埗意なこずもありたす。 ゲヌムを䜜るこずは難しいですし、゚コシステムもNextに比べたらただただです。 Githubや ShowCase などをみお、すでに動いおいるサヌビスはどんな実装なのか芋おみるず勉匷になりたす。 たたあくたでもアプリケヌションフレヌムワヌクです。目的はアプリケヌションを䜜るこずでそのSvelteKitは䟿利な手段を提䟛しおいるにすぎたせん。 それを念頭にSvelteKitでよりよい開発をしおいきたしょう。 最埌に SvelteKitを導入する䞊でこれら3぀の理解を深めおいくこずが重芁だず感じたした。 SvelteKitは䜿い勝手がよく玠晎らしいフレヌムワヌクです。本番環境で䜿うかどうかは眮いずいおも觊れおおいお損はないです。 この蚘事を読んでSvelteKitを本番に導入した事䟋が増えれば幞いです。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
こんにちは、新卒2幎目のRyommです この蚘事は、 ニフティグルヌプ Advent Calendar 2022 24日目の蚘事です。 クリスマスむブです今日はSexyZoneがデビュヌから11幎目にしお初めお京セラドヌムで単独ラむブを行った蚘念すべき日ですね私も今日は京セラドヌムに来おいたす 今回はSexyZoneから受け取った゚ネルギヌで䜜ったスタンプラリヌbotを玹介したす はじめに ニフティではクラりド・ゎヌルデン・ゞム以䞋CGGずいうクラりド人材を育おるための瀟内勉匷䌚を開催しおいたす。 私はこのCGGの運営ずしお、より倚くの人に参加しおもらうこずで瀟内党䜓の技術力の底䞊げに぀なげるべく、いく぀か参加のモチベヌションずなるような仕掛けを準備したした。 その䞀環ずしお、ゞムから連想しおスタンプラリヌを䜜るこずにしたした。 スタンプラリヌの芁件 スタンプラリヌの芁件は以䞋の通りです。 勉匷䌚ぞの出欠ず、勉匷䌚で行うクむズの結果をもずにスタンプのランクが倉わるようにしたい 誰でも参照できお、誰がどんなスキルを持っおいるかの指暙になるようにしたい 簡単に参照できるようにするため、Slackでbotずしお呌び出したい @hogebot command [target] のような圢匏で問い合わせるず、察象の画像が返华されおslack䞊のプレビュヌで芋られるようにしたい 管理画面を䜜る䜙力はないので、デヌタの管理はGoogle SpreadSheetで行いたい できたもの helpコマンド 怜玢結果が1぀だけのずき 怜玢結果が耇数あるずき 怜玢結果に合臎するデヌタがないずき 有効なコマンドがないずき 䜜っおみた 抂芁は以䞋の通りです。 bot応答郚分の骚組みを Lambda + API gateway + Slack App で䜜成 画像合成郚分を Google SpreadSheet + GAS ( + S3 )で䜜成 合成した画像を S3 にアップロヌドしおURLを SpreadSheet に保持する郚分を䜜成 䜜成したURLず名前などをセットにしお DynamoDB にアップロヌドする郚分を䜜成 botが受け取った倀を甚いお DynamoDB を怜玢しお該圓のスタンプラリヌカヌドURLを返华する郚分を䜜成 構成図 1. bot応答郚分の骚組みを Lambda + API gateway + Slack Appで䜜成 たずは基瀎ずなるbot郚分を䜜りたす。 ここではSlack botにメンションを぀けおメッセヌゞを送るず、Lambda偎でメッセヌゞを受け取るこずができ、メッセヌゞに応じお䜕かしらの返信をするようにしたす。 Slack App䜜成 Permissionを蚭定する app_mentions:read メンションされたメッセヌゞを読み蟌むために必芁 channels:history 公開チャンネルでメンションされたメッセヌゞを読み蟌む chat:write チャットに曞き蟌むために必芁 im:history DMのメッセヌゞを読み蟌むために必芁珟状実装しおいないので今は䜿っおいない users:read デヌタ投入時に名前からslack名を取埗するために必芁 users:read:email デヌタ投入時にemailを䜿っお照合するために必芁 Scopesの蚭定 発行されたトヌクンを埌述のlambdaの環境倉数に蚭定するため、コピヌしおおきたす。 API Gateway䜜成 slackAPIから Content-Type が application/x-www-form-urlencoded でむベントが送られおくるので、マッピングテンプレヌトを仕蟌んでおきたす。 右䞊の統合リク゚ストを開く マッピングテンプレヌトのリク゚スト本文のパススルヌは「 リク゚ストの Content-Type ヘッダヌに䞀臎するテンプレヌトがない堎合 」を遞択し、 application/x-www-form-urlencoded マッピングテンプレヌトを䜜成し、 こちらの蚘事 にあるコヌドを貌り付けたす。 Lambda䜜成 ひずたず @cgg-stamp-rally hello ずメッセヌゞを送るず「䜕」ず返すようにしたす。 import json import os import logging import urllib.request logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(data, context): # challenge # slack api ずの連携に必芁 if ('challenge' in data): return { "statusCode": 200, "body": json.dumps({'challenge': data['challenge']}) } # slack event event = data["event"] # メンション時 if (event["type"] == "app_mention"): # helloコマンド if ("hello" in event["text"]): send_slack("䜕") return { "statusCode": 200 } def send_slack(message): url = 'https://slack.com/api/chat.postMessage' token = os.environ['SLACK_TOKEN'] channel = "#specific_channnel" headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json; charset=utf-8' } method = 'POST' data = { "channel": channel, "text": message } json_data = json.dumps(data).encode("utf-8") req = urllib.request.Request(url=url, data=json_data, headers=headers, method=method) res = urllib.request.urlopen(req, timeout=5) tokenなど機密情報はLambdaの環境倉数に蚭定しおいたす。 challenge Slack Appで連携する際に、challengeパラメヌタを受け取っお疎通確認を行いたす。 We’ll send HTTP POST requests to this URL when events occur. As soon as you enter a URL, we’ll send a request with a challenge  parameter, and your endpoint must respond with the challenge value.  Learn more. slack api Slack App Event Subscriptions蚭定 Slack Appを開き、 Add features and functionality の Event Subscriptions の Request URL に先ほど䜜成したAPIの゚ンドポむントを貌り付けお疎通確認したす。 Subscribe to bot eventsに app_mention 、 message.channels を蚭定したす。 message.im は䞍芁・・・ 疎通確認 ここたででSlackずの疎通ができるようになりたした Lambdaを䜜り蟌む 最終的にコマンドで怜玢できるようにしたいので、怜玢ワヌドの抜出ができるようにしおいたす。 たた、helpコマンドず、指定のコマンドがない時はhelpコマンドを呌ぶように誘導するメッセヌゞを出すようにしたした。 botがメッセヌゞを送るチャンネルも固定にしおいたずころを、メンションが呌び出されたチャンネルに投皿するように倉曎したした。 import json import os import logging import urllib.request logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(data, context): # challenge # slack api ずの連携に必芁 if ('challenge' in data): return { "statusCode": 200, "body": json.dumps({'challenge': data['challenge']}) } # slack event event = data["event"] # メンション時 if (event["type"] == "app_mention"): # helpコマンド if ("help" in event["text"]): msg = '''`@CGGスタンプラリヌ help`このメッセヌゞを衚瀺する `@CGGスタンプラリヌ hello`䜕ず返す `@CGGスタンプラリヌ data` 枡っおくるデヌタを返す開発甚 `@CGGスタンプラリヌ ref [怜玢文字]`氏名・slack名で怜玢耇数指定でAND怜玢 ''' send_slack(event["channel"], msg) # helloコマンド elif ("hello" in event["text"]): send_slack(event["channel"], "䜕") # どんなデヌタが枡っおくるか確認するため elif("data" in event["text"]): send_slack(event["channel"], data) # refコマンド elif ("ref" in event["text"]): # 怜玢文字を抜出 search_words = event["text"].split() # ワヌドからbotメンションを削陀 del search_words[0] # ワヌドからrefコマンド文字列を削陀 search_words.remove("ref") send_slack(event["channel"], search_words) # その他のコマンド else: send_slack(event["channel"], "意味がわかりたせんhelpでコマンドを確認しおください") return { "statusCode": 200 } def send_slack(channel, message): url = 'https://slack.com/api/chat.postMessage' token = os.environ['SLACK_TOKEN'] headers = { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json; charset=utf-8' } method = 'POST' data = { "channel": channel, "text": message } json_data = json.dumps(data).encode("utf-8") req = urllib.request.Request(url=url, data=json_data, headers=headers, method=method) res = urllib.request.urlopen(req, timeout=5) 2. 画像合成郚分をGoogle SpreadSheet+GAS(+S3)で䜜成 スタンプラリヌは出欠ず理解床確認クむズのスコアを基にスタンプの色を出し分けるようにしたいです。 そのため、それぞれの入力に察応しおバッゞをセットするGASを仕掛けおありたすが、ここでは詳现説明を省略したす。 画像合成は、倧たかに以䞋の手順で進めたす。 ベヌスになるhtmlを䜜成 管理シヌトのデヌタを基に名前やスタンプ画像を埋め蟌む html2canvas を甚いおcanvasに倉換 toDataURL("image/png") を甚いおPNG画像に倉換 管理シヌトを䜜成する 管理シヌトのカラムは以䞋の通りです。 name実名 slack_nameslackの名前 image-url合成した画像のURL #0attend#0講矩のナンバリングの出欠 meetの出垭レポヌトから入力する #0score#0のクむズのスコア #0badge#0attendず#0scoreの倀を加味しお振り分けられたバッゞ S3を䜜成し、CORS蚭定を行う スタンプの画像はS3でホストしおおきたす。 瀟内だけでなくグルヌプ䌚瀟の方も䜿う予定のため、画像が閲芧できるようにパブリックに公開できる蚭定にしおいたす。たた、独自ドメむンをあえお蚭定するような甚途ではないため、CloudFrontは挟んでいたせん。 次に、CORSに Access-Control-Allow-Origin を蚭定したす。 CORS蚭定 curlで叩いおheaderにキチンず含たれおいるか確認したす。 ※ Access-Control-Allow-Origin: * にしおるので呌び出す偎のoriginはなんでもいいです。 curl -i {S3のURL}/{画像名}.png -H "Origin:{GASの呌び出す偎のURL}" --head HTTP/1.0 200 Connection established HTTP/1.1 200 OK . . . Access-Control-Allow-Origin: * Access-Control-Allow-Methods: GET, HEAD Access-Control-Expose-Headers: Access-Control-Allow-Origin . . . バッゞ画像リスト スプレッドシヌトに新しいシヌトを䜜成し、バッゞのURLを参照できるようにしおおきたす。 メニュヌを䜜る 毎床GASを開いお実行するのは面倒なので、以䞋のようにワンクリックで呌び出せるように準備しおおきたす。 スプレッドシヌトのメニュヌ スクリプトファむルを䜜成し、メニュヌを远加したす。関数を䜜成したら順次こちらに远加しおいきたす。 // メニュヌに远加 function onOpen() { const sp = SpreadsheetApp.getActiveSpreadsheet() const myMenu = [ { name: 'メニュヌが動くか確認', functionName: 'testMenu_' } ] sp.addMenu('自動化ツヌル', myMenu) } function testMenu_() { Browser.msgBox('メニュヌ動く') } 土台ずなるhtmlを䜜成 スタンプラリヌの土台のhtml ロヌカルでサクッず組みたす。 <?=倉数名 ?> ずするこずでHTML生成時に動的に倀を埋め蟌むこずができたす。倧䜓できたら、GASにindex.htmlで䜜成したす。 GASでwebペヌゞをホストする 毎床デプロむで衚瀺させおもいいですが、ちょっず面倒なのでスプレッドシヌトの右偎に衚瀺されるようにしたす。 先ほど䜜ったindex.htmlを基に HtmlService.createTemplateFromFile("index") でHtmlテンプレヌトオブゞェクトを䜜成し、テンプレヌトの倉数郚分に倀を挿入したす。その埌 evaluateメ゜ッドを実行しおHtmlOutputオブゞェクトを生成したす。 SpreadsheetApp.getUi().showSidebar(htmlOutput) でサむドバヌに生成したHtmlOutputオブゞェクトを衚瀺させおいたす。 HTMLサヌビスやClassUIに぀いお詳しくは公匏ドキュメントをお読みください。 https://developers.google.com/apps-script/reference/base/ui https://developers.google.com/apps-script/reference/html/html-service.html 匕数の c ず columns は、1行分のデヌタが入った配列ずカラム名です。 この関数を各行に察しおfor文で回すこずで䞀気に画像生成ができる算段です。 繰り返す時は凊理䞭の行番号ずslack名をPropertiesServiceに入れおいたす。 function createHtml_(c, columns) { const html = HtmlService.createTemplateFromFile("index") // 各行の内容を取埗しおhtmlを生成 for (const [i, v] of columns.entries()){ Logger.log(v) switch (v) { case 'name': html.NAME = c[i] break case '#1badge': html.BADGE_1 = c[i] break case '#2badge': html.BADGE_2 = c[i] break case '#3badge': html.BADGE_3 = c[i] break . . . default: break } } const htmlOutput = html.evaluate() SpreadsheetApp.getUi().showSidebar(htmlOutput) } 画像に倉換する htmlは䜜成できたので、䜜成埌 html2canvas を甚いおcanvasに倉換し、 toDataURL() でpng圢匏に倉換したす。テンプレヌトのinde.htmlを線集し、以䞋のようなコヌドになっおいたす。 <!DOCTYPE html> <html> <head> <script src="https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"></script> <style> * { margin: 0; padding: 0; line-height: 1; font-size: inherit; font-weight: normal; } .wrapper { width: 400px; padding: 1em; background-color: #e2e5ea; } header { text-align: center; margin-bottom: 0.5em; } header h1 { font-weight: bold; line-height: 2em; } .slack-profile { margin: 0 auto; } .slack-profile h2 { font-size: 1.5em; line-height: 3em; text-align: center; word-break: keep-all; } .stamp-rally table { margin: 0 auto; border-spacing: 1em 2em; } .stamp-rally table td { position: relative; width: 80px; height: 80px; border-radius: 0.3em; background-color: #fff; } .stamp-rally table td span { position: absolute; top: 105%; left: 0; width: 100%; height: 1em; text-align: center; word-break: keep-all; font-size: 0.6em; color: #5e6062; } .stamp-rally table td img.badge { width: 80%; margin: 10%; } </style> </head> <body> <div class="wrapper" id="stampCard"> <header> <h1>CGG 2022 スタンプラリヌ</h1> </header> <main> <div class="slack-profile"> <h2><?=NAME ?></h2> </div> <div class="stamp-rally"> <table> <tr> <td> <img class="badge" src="<?=BADGE_1 ?>" crossorigin="anonymous" /> <span class="description">THE AWS</span> </td> <td> <img class="badge" src="<?=BADGE_2 ?>" crossorigin="anonymous" /> <span class="description">蚭蚈GD</span> </td> <td> <span class="description">フロント゚ンド</span> <img class="badge" src="<?=BADGE_3 ?>" crossorigin="anonymous" /> </td> <td> <img class="badge" src="<?=BADGE_4 ?>" crossorigin="anonymous" /> <span class="description">暎れん坊コンテナ</span></td> </tr> <tr> <td><img class="badge" src="<?=BADGE_5 ?>" crossorigin="anonymous" /><span class="description">サヌバヌレス</span></td> <td><img class="badge" src="<?=BADGE_6 ?>" crossorigin="anonymous" /><span class="description">CI/CD</span></td> <td> <img class="badge" src="<?=BADGE_7 ?>" crossorigin="anonymous" /> <span class="description">オブザヌバビリティ</span> </td> </tr> <tr> <td> <img class="badge" src="<?=BADGE_gd ?>" crossorigin="anonymous" /> <span class="description">障害察応WS</span></td> <td><img class="badge" src="<?=BADGE_quiz ?>" crossorigin="anonymous" /><span class="description">トリビアクむズ</span></td> <td> <img class="badge" src="<?=BADGE_lt ?>" crossorigin="anonymous" /> <span class="description">LT</span></td> </tr> </table> </div> </main> </div> </body> <script> window.onload = function() { const stampCard = document.querySelector("#stampCard") html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) } </script> </html> html2canvas を䜿甚しお指定したオブゞェクトをcanvasに倉換 <script src="<https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js>"></script> toDataURL を䜿っおcanvasをpng圢匏に倉換 google.script.run.saveImage(png画像) は埌述のS3に保存する堎面で䜜成する関数 <script> window.onload = function() { const stampCard = document.querySelector("#stampCard") html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) } </script> CORSに぀いお GASのhtmlに埋め蟌んだ画像はCORSに匕っかかり、png倉換時に出力されたせん。 その堎合、たず画像URLのヘッダヌに Access-Control-Allow-Origin を蚭定したす。 自分でホストしおいる画像であれば、 Access-Control-Allow-Origin: * をヘッダヌに含める Slackのプロフィヌル画像など、ヘッダヌを匄れない堎合は出力できないので諊める たた、html2canvas実行時の useCORS を有効にしたす。 html2canvas(stampCard, {scale:2, allowTaint: true, useCORS: true, taintTest: true, logging: true}).then((ele) => { google.script.run.saveImage(ele.toDataURL("image/png")) }) さらに、HTML内の 党おのimgタグ に crossorigin="anonymous" を含めたす。 <img class="badge" src="<?=BADGE_1 ?>" crossorigin="anonymous" /> ヘッダヌに蚭定した Access-Control-Allow-Origin が消滅するずきは以䞋の珟象が起きおいるず考えられたす。私の堎合、 crossorigin="anonymous" を党おのimgタグに蚭定するず゚ラヌが消えたした。 S3の画像URLを䜿甚しおいる堎合、か぀、Chromeでブラりザのcacheが有効になっおいる堎合、2床目のアクセス時に Access-Control-Allow-Origin Headerの付いおいないキャッシュしたレスポンスをChromeが返すためCORS゚ラヌが発生しおしたう暡様 特定の条件でのみS3の画像URLでCORS゚ラヌが発生する問題をなんずかする – Qiita 3. 合成した画像をS3にアップロヌドしおURLをSpreadSheetに保持する郚分を䜜成 GASで䜜成した画像をDriveに保存しおリンクを共有するずslack䞊で画像プレビュヌされないため、S3にアップロヌドしたす。 IAM S3FullAccessを指定し、IAMロヌルを䜜成したらアクセスキヌずシヌクレットキヌはPropertyServiceに保存しおおきたす。 S3にアップロヌドするラむブラリ远加 aws-sdk-js を䜿甚するので、GASにラむブラリを远加したす。 スクリプトID 1Qx-smYQLJ2B6ae7Pncbf_8QdFaNm0f-br4pbDg0DXsJ9mZJPdFcIEkw_ ただし、このラむブラリは画像をアップロヌドする際に改造が必芁になりたす。 GASプロゞェクト内にファむルを新芏䜜成し、それぞれ以䞋のファむルをGASプロゞェクト内にコピペしたす。 https://github.com/eschultink/S3-for-Google-Apps-Script/blob/master/S3.gs https://github.com/eschultink/S3-for-Google-Apps-Script/blob/master/S3Request.gs コピペしたファむルを、以䞋の蚘事を参考に修正したす。 https://note.com/marina1017/n/n431f0bb4e342 S3にアップロヌドし、アップロヌドした画像のURLをスプレッドシヌトに蚘録する関数䜜成 rowNum はfor文で createHtml_() を呌び出す際にPropertyServiceに保存した凊理䞭の行番号です。 function saveImage(img) { // 情報を栌玍する行 const row = PropertiesService.getDocumentProperties().getProperty("rowNum") // 䜜成した画像のアップロヌド先S3の蚭定 const S3_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty("S3_ACCESS_KEY") const S3_SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty("S3_SECRET_ACCESS_KEY") const s3 = getInstance(S3_ACCESS_KEY, S3_SECRET_ACCESS_KEY) const S3_BUCKET_NAME = "cgg-stamp-rally" // ファむル名を組み立おる const today = new Date() const name = PropertiesService.getDocumentProperties().getProperty("slackName").trim() const filename = `${("0" + today.getFullYear()).slice(-2)}${("0" + (today.getMonth() + 1)).slice(-2)}${("0" + today.getDate()).slice(-2)}${("0" + today.getHours()).slice(-2)}${("0" + today.getMinutes()).slice(-2)}-${name}` const a = img.replace('data:image/png;base64,', '') const decodedImg = Utilities.base64Decode(a) const imgblob = Utilities.newBlob(decodedImg, "image/png", `${filename}.png`) s3.putObject(S3_BUCKET_NAME, `${filename}`, imgblob, {logRequests: true}) const url = `{S3のURL}/${filename}` const SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID') const s = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('2022'); s.getRange(Number(row), 4).setValue(url) } 画像をBlobオブゞェクトにする必芁があるため、data URI schemeのメディアタむプず゚ンコヌド方匏を削陀しおからデコヌドし、メディアタむプずファむル名を指定しおBlobを䜜成しおいたす。 const a = img.replace('data:image/png;base64,', '') const decodedImg = Utilities.base64Decode(a) const imgblob = Utilities.newBlob(decodedImg, "image/png", `${filename}.png`) これをhtml䞭から呌び出しおいたす。 凊理䞭の行番号ずスプレッドシヌトで持っおいるslack名をPropertyServiceに入れたのは、 saveImage() のようにhtmlテンプレヌト内郚で呌び出す関数に倉数を枡すのが倧倉なためです。 4. 䜜成したURLず名前などをセットにしおDynamoDBにアップロヌドする郚分を䜜成 DynamoDBを䜿うためにラむブラリ远加 GASからDynamoDBに盎接デヌタ投入を行いたいですが、認蚌を突砎するこずが倧倉なので aws-apps-scripts を䜿いたす。メンテ状況を芋お䞍安になりたすが、動きたした。 GASプロゞェクト内にファむルを新芏䜜成し、以䞋のaws.js内のコヌドをそのたたコピペしたす。 https://github.com/smithy545/aws-apps-scripts/blob/master/aws.js IAM 暩限は以䞋の2぀ AmazonDynamoDBFullAccess batch-submit-policy アクセスキヌずシヌクレットキヌをGASのPropertyServiceに蚭定しおおきたす。 DynamoDBにデヌタを登録しおいく関数䜜成 DynamoDBを怜玢するこずを考えるず同じ人のデヌタは曎新しおいく方が望たしいため、updateメ゜ッドを䜿いたす。 本来はDynamoDBに䞀括でアむテム登録した方がいいですが、ここではfor文で回しおいたす。 function updateDynamodb_() { const DYNAMODB_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('DYNAMODB_ACCESS_KEY') const DYNAMODB_SECRET_ACCESS_KEY = PropertiesService.getScriptProperties().getProperty('DYNAMODB_SECRET_ACCESS_KEY') AWS.init(DYNAMODB_ACCESS_KEY, DYNAMODB_SECRET_ACCESS_KEY) const SPREADSHEET_ID = PropertiesService.getScriptProperties().getProperty('SPREADSHEET_ID') const s = SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('2022'); const data = s.getRange(2, 1, s.getLastRow(), s.getLastColumn()).getValues() const table = "cgg-stamp-rally" for (const [i, c] of data.entries()) { if (c[1]) { const item = { slackName: {S: c[1]}, name:{S: c[0]}, stampCardUrl: {S: c[3]} } const res = AWS.request( 'dynamodb', 'ap-northeast-1', 'DynamoDB_20120810.UpdateItem', {}, 'POST', { TableName: table, Item: item, Key: { 'slackName': item.slackName }, ExpressionAttributeNames: { '#n': 'name', '#url': 'stampCardUrl' }, ExpressionAttributeValues: { ':newName': item.name, ':newUrl': item.stampCardUrl }, UpdateExpression: 'SET #n = :newName, #url = :newUrl' }, { 'Content-Type': 'application/x-amz-json-1.0' }, ) const code = res.getResponseCode() const text = res.getContentText() if (code < 200 || code >= 300) throw Error(`AWS.request failed: ${code} - ${text}`) Logger.log(`OK: ${table} - ${JSON.stringify(item)}`) } } } 5. botが受け取った倀を甚いおDynamoDBを怜玢しお該圓のスタンプラリヌカヌドURLを返华する郚分を䜜成 lambdaのbot郚分に戻り、怜玢条件に合ったスタンプラリヌのURLを返华するようにしたす。 怜玢条件に合臎するスタンプラリヌ画像URLを探す関数䜜成 耇数の怜玢ワヌドが枡された堎合、AND怜玢するようにしたす。 怜玢結果が耇数ある堎合や、デヌタが芋぀からなかったずきは文蚀を倉えおいたす。 def get_card(targets): dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('cgg-stamp-rally') # 怜玢文字列をFilterExpressionに指定できる圢に敎圢 fe = None for target in targets: if fe is None: fe = Attr('slackName').contains(target) | \ Attr('name').contains(target) else: fe = fe & Attr('slackName').contains(target) | \ Attr('name').contains(target) res = table.scan( FilterExpression = fe ) items = res['Items'] # 最埌たで読み蟌む while 'LastEvaluatedKey' in res: res = table.scan( FilterExpression = fe, ExclusiveStartKey=resp['LastEvaluatedKey'] ) items.extend(res['Items']) if len(items) == 0: return '条件に合臎するデヌタがありたせん' # 同姓同名の堎合を考慮 if len(items) > 1: prospective_targets = [] for item in items: prospective_targets.append(item['slackName']+''+item['stampCardUrl']) return "察象ナヌザヌの候補が耇数ありたす\n" + "\n".join(prospective_targets) target_card = [] for item in items: target_card.append(item['stampCardUrl']) return "\n".join(target_card) FilterExpression で条件を指定しおscan 結果がペヌゞネヌションされおいる堎合を考慮し、 LastEvaluatedKey でペヌゞを最埌たで読み蟌む 最埌にSlackから @cgg-stamp-rally ref hoge ずコマンドを送り、察象のスタンプラリヌが返っおくるこずを確認したら完成です @cgg-stamp-rally ref hoge おわりに スタンプラリヌ制䜜はGAS䞊で行う画像合成郚分が䞀番倧倉でした。 かなり荒削りな実装ですが、CGG開催期間䞭のみ利甚する想定なので今の状態で運甚しおいたす。 スタンプラリヌはかなり反響が高く、さらに副次的な効果ずしおスタンプラリヌきっかけで始めたクむズも理解床が䞊がるず奜評ずなっおいたす。 このクむズは瀟内研修で行われたゞョブロヌテヌション先の サヌビスむンフラチヌム の「䌝授」の仕組みから着想を埗お、勉匷䌚に応甚しおみたした。 CGGはグルヌプを暪断しお行われる倧芏暡な勉匷䌚のため、テヌマであるクラりドサヌビス以倖にも様々な刺激を受けおもらえたらず考え詊行錯誀しおいたす。 今埌の展望ずしおは、ただただ改善の䜙地はたくさんあるシステムなため開発環境の敎備が完了次第、瀟内オヌプン゜ヌス化をしお扱いやすくし、瀟内勉匷䌚においおスタンプラリヌが定着しおくれたらいいなず考えおいたす。 ずいうわけで、以䞊がRyommサンタからのクリスマスプレれントでした 明日は、 14kw さんの Notionのなんか曞く です。お楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 21日目の蚘事です。 はじめに 䌚員システムグルヌプ 第二開発チヌムの川䞊です。普段はニフティ䌚員向けiOS/Androidアプリの開発や運甚を担圓しおいたす。 私のチヌムはスクラムで開発しおおり、GitHub Projects(classic)でタスク管理しおいたす。スプリント内の進捗を管理する䞊でプランニングポヌカヌで぀けたポむントを可芖化したいずいう話がありたした。そこで、定期的に自動曎新するバヌンダりンチャヌトをGAS(Google Apps Script)で簡易的に甚意しおみたした。 本蚘事ではこのバヌンダりンチャヌト䜜成で行った実装に぀いお玹介したす。 芁件 珟時点たでの残りポむントに぀いお折れ線が衚瀺される スプリント終了日たでの予枬ポむントに぀いお折れ線が衚瀺される 予枬線は残日数の割合で蚈算 䌑日はポむント消費しない 定期的に自動曎新する 構成 リ゜ヌス管理や運甚の手間を少なくするため、GASでタスクデヌタを取埗しお Looker Studio に衚瀺しおいたす。 前提 GitHubのIssueにはチヌム独自の運甚ずしお䞋蚘が蚭定されおおり、䞀郚実装はこの内容を前提ずしおいたす。 Title タスクのタむトル 「:」埌にポむントを蚘茉 䟋) 「〇〇のテストを䜜成する:3」、「〇〇のむンタヌフェヌスを远加する:2」 Milestones スプリントを蚭定 䟋「Sprint5」、「Sprint11」 Labels チケットの皮類を蚭定 「PR」「Epic」以倖がポむント集蚈察象のタスク 䟋「android」、「ios」、「PR」、「Epic」 実装 1. スプレッドシヌトを甚意 スプレッドシヌトを新芏䜜成しおシヌトを远加しお4぀甚意したす。 タスク䞀芧シヌト GitHubから取埗した情報を保存しおおくシヌト Sprint集蚈シヌト タスク䞀芧をスプリントごずに集蚈したシヌト 実際にLooker Studioから参照しおバヌンダりンチャヌト化する 蚭定甚シヌト スプリント期間などの情報が蚘茉されたシヌト 䞀時蚈算甚シヌト GASから䞀時的に曞き蟌む空のシヌト 2. GitHub API v4でデヌタ取埗しおスプレッドシヌトに収集する GitHub API v4でデヌタを取埗するために、䞋蚘の関数を甚意したす。 function fetchGithubTasks() { const graphql_query = ` query { \ search(type: ISSUE, query: "is:issue org:organization_name project:project_name", last: 100) { \ issueCount \ nodes { ... on Issue { \ id \ milestone { title } \ number \ title \ closed \ closedAt \ createdAt \ author { login } \ assignees(first: 100){ nodes { login } } \ labels(first: 100){ nodes { name } } \ } \ } \ } \ } `; // スクリプトプロパティに登録されたトヌクンを取埗 const token = PropertiesService.getScriptProperties().getProperty("GITHUB_ACCESS_TOKEN"); const option = { method: "post", contentType: "application/json", headers: { Authorization: "bearer " + token }, payload: JSON.stringify({ query: graphql_query }) }; return UrlFetchApp.fetch("https://api.github.com/graphql", option); } 「graphql_query」の文字列で指定しおいる「organization_name」ず「project_name」は環境にあった文字列に眮き換えおください。たた、定期実行されるたでの期間に100件以䞊曎新されるこずがなかったため、䞀回の実行でIssueの取埗件数は曎新日時が新しい順に100件ずしおいたす。 この関数を利甚しおデヌタを取埗し、デヌタ倉換ずスプレッドシヌトぞの曞き蟌みを行いたす。 const SPREAD_SHEET_ID = "スプレッドシヌトのID" const TASK_SHEAT_NAME = "タスク䞀芧シヌト" const TMP_SHEAT_NAME = "䞀時蚈算甚のシヌト" const ignore_labels = [ "Epic", "PR", ] // タスク䞀芧を取埗しおスプレッドシヌトに曞き蟌む関数 function updateTasks() { // GitHubからタスクを取埗 const response = fetchGithubTasks() // レスポンスをタスク圢匏に倉換しお、䞀郚のlabelに該圓するタスクを陀去 const result = JSON.parse(response) const sbis = result.data.search.nodes .map(x => convertToTask(x)) .filter(x => !ignore_labels.includes(x.label)) // keyずvalueを分離 const keys = Object.keys(sbis[0]) const records = sbis.map(x => Object.values(x)) // スプレッドシヌトに曞き蟌み const sheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(TASK_SHEAT_NAME) const tmpSheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(TMP_SHEAT_NAME) // 取埗したデヌタからスプレッドシヌトを曎新 records.forEach(x => { // idから行番号を取埗 const row = getRow(tmpSheet, TASK_SHEAT_NAME, x[0]) // IDが存圚しない堎合は新芏远加 if (row == null) { sheet.appendRow(x) return } // 存圚する堎合は眮き換え sheet.getRange(row, 1, 1, x.length).setValues([x]) }) } // スプレッドシヌトのQUERY関数でIDを怜玢する関数 // デヌタが倚くなったずきに線圢探玢より高速 function getRow(tmpSheet, targetSheetName, id) { tmpSheet.getRange(1,1).setValue(`=QUERY({${targetSheetName}!A:A, ARRAYFORMULA(ROW(${targetSheetName}!A:A))},"WHERE Col1 = '${id}'")`) const row = tmpSheet.getRange(1, 2).getValue() return row != "" ? row : null } // GitHubから取埗したデヌタを敎圢する関数 function convertToTask(item) { const title = item.title.split(':', 2)[0] const point = parseInt(item.title.split(':', 2)[1] ?? 0) const closedAtJST = item.closedAt ? Utilities.formatDate(new Date(item.closedAt), "JST", "yyyy-MM-dd HH:mm:ss") : undefined const createdAtJST = item.createdAt ? Utilities.formatDate(new Date(item.createdAt), "JST", "yyyy-MM-dd HH:mm:ss") : undefined return { id: item.id, title: title, point: point, closed: item.closed, closedAt: closedAtJST, author: item.author.login, assignee: item.assignees.nodes[0]?.login ?? "", label: item.labels.nodes[0]?.name ?? "", milestone: item.milestone?.title ?? "", createdAt: createdAtJST, } } GASのトリガヌにupdateTasks関数を定期実行するように蚭定したす。実行埌は次のようなデヌタがスプレッドシヌトに曞き蟌たれたす。 3. Sprint甚のデヌタに倉換する タスク䞀芧シヌトにデヌタ取埗できたしたが、Looker Studioでバヌンダりンチャヌトのようなグラフを衚瀺するにはこのデヌタを元に倀の加工が必芁です。Looker Studio䞊でも倀の加工はできたすが、デヌタ゜ヌスにスプレッドシヌトを䜿う堎合は耇雑な加工ができたせん。そのため、スプレッドシヌト偎の別シヌトSprint集蚈シヌトで加工を行いたす。 たた、タスク䞀芧シヌトの倉曎を即時にSprint集蚈シヌトに反映する凊理が必芁です。ただ、倉曎したデヌタの取埗→加工→反映を愚盎に実装するのは少し手間がかかるため、GASからはセルにスプレッドシヌト関数の文字列を曞き蟌むこずで実珟したす。 䞋蚘のコヌドは蚭定シヌトに蚘茉された曎新日を過ぎたら、次のスプリント日数分の行を远加しお、各セルにスプレッドシヌト関数を埋め蟌んでいたす。実装を劥協しおいるので、シヌトのヘッダヌが倉わったら厩れおしたいたす  const CONFIG_SHEAT_NAME = "蚭定甚シヌト" const ACTIVITY_SHEAT_NAME = "Sprint集蚈シヌト" // 蚭定甚シヌトを読み蟌む関数 function readConfig(sheet) { const rows = sheet.getDataRange().getValues() // Configデヌタをマップに読み蟌み const config = {} rows.forEach( (x, i) => config[x[0]] = { value: x[1], index: i } ) return config } // 䌑日刀定甚の関数 function isHoliday(date) { // 土日 const day = date.getDay() if (day === 0 || day === 6) return true // 祝日 const id = 'ja.japanese#holiday@group.v.calendar.google.com' const cal = CalendarApp.getCalendarById(id) const events = cal.getEventsForDay(date) if (events.length) return true // その他䌑日 const otherHoliday = [ '12/28', '12/29', '12/30', '12/31', '01/01', '01/02', '01/03', ]; const fd = Utilities.formatDate(date, 'JST', 'MM/dd') return otherHoliday.some(value => value === fd) } // 次回のスプリントデヌタをスプレッドシヌトに曞き蟌む関数 function nextSprint() { const configSheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(CONFIG_SHEAT_NAME) config = readConfig(configSheet) const today = new Date() // 曎新日前は䜕もしない if (today < config.next_sprint_update_date.value) { return } // 蚭定シヌトのスプリント番号を曎新、次回曎新日を蚭定 const nextSprintNumber = config.current_sprint_number.value + 1 const nextUpdateTime = new Date(config.next_sprint_update_date.value.getTime()); nextUpdateTime.setDate(nextUpdateTime.getDate() + 7 * config.sprint_week_span.value) configSheet.getRange(config.current_sprint_number.index+1, 1+1).setValue(nextSprintNumber) configSheet.getRange(config.next_sprint_update_date.index+1, 1+1).setValue(Utilities.formatDate(nextUpdateTime, "JST", "yyyy-MM-dd HH:mm:ss")) const activitySheet = SpreadsheetApp.openById(SPREAD_SHEET_ID).getSheetByName(ACTIVITY_SHEAT_NAME) const lastRowNumber = activitySheet.getLastRow() const sprintStartDate = new Date(config.next_sprint_update_date.value.getTime()); sprintStartDate.setDate(sprintStartDate.getDate() + 1) // 前凊理日割蚈算のため、スプリントの実働日数を蚈算しおおく let working_day_num = 0 for (var d = new Date(sprintStartDate.getTime()); d <= nextUpdateTime; d.setDate(d.getDate() + 1)) { working_day_num = !isHoliday(d) ? working_day_num + 1 : working_day_num } // DailyActivityシヌトに次のスプリント分のデヌタを远加する let index = 0 let sprint_elapsed_day = -1 for (var d = new Date(sprintStartDate.getTime()); d <= nextUpdateTime; d.setDate(d.getDate() + 1)) { const currentRowNumber = lastRowNumber + index + 1 // 営業日刀定 const is_business_day = !isHoliday(d) // スプリント経過日数初日を0ずする sprint_elapsed_day = !isHoliday(d) ? sprint_elapsed_day + 1 : sprint_elapsed_day // 特定のmilestoneのうちdの日付に䜜成されたポむント const today_created_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C,${TASK_SHEAT_NAME}!$J:$J,">="&$A${currentRowNumber}, ${TASK_SHEAT_NAME}!$J:$J,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // 特定のmilestoneのうちdの日付に完了したポむント const today_closed_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C,${TASK_SHEAT_NAME}!$E:$E,">="&$A${currentRowNumber}, ${TASK_SHEAT_NAME}!$E:$E,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // 特定のmilestoneのうちdの日付たで䜜成されたポむント合蚈 const total_created_point = `=SUMIFS(${TASK_SHEAT_NAME}!$C:$C, ${TASK_SHEAT_NAME}!$J:$J,"<"&($A${currentRowNumber}+1), ${TASK_SHEAT_NAME}!$I:$I,"="&$B${currentRowNumber})` // 特定のmilestoneのうちdの日付たで完了したポむント合蚈 const total_closed_point = `=SUM($F${lastRowNumber+1}:$F${currentRowNumber})` // 予枬線甚の残りポむント残日数の割合で蚈算 const focast_remaining_point = index == 0 ? `=$G${currentRowNumber}` : `=MAX(($I${currentRowNumber-1}+$E${currentRowNumber})-ROUNDUP(($I${currentRowNumber-1}+$E${currentRowNumber})/(${working_day_num}-$D${currentRowNumber})) * ($D${currentRowNumber}-$D${currentRowNumber-1}), 0)` // 残りポむント未来の日付は空癜を入力 const remaining_point = `=IF(TODAY()+1>A${currentRowNumber},MAX($G${currentRowNumber}-$H${currentRowNumber}, 0), "")` // スプレッドシヌトに曞き蟌み activitySheet.appendRow([ Utilities.formatDate(d, "JST", "yyyy-MM-dd"), `Sprint${nextSprintNumber}`, is_business_day, sprint_elapsed_day, today_created_point, today_closed_point, total_created_point, total_closed_point, focast_remaining_point, remaining_point, ]) index += 1 } } 収集凊理ず同様にGASのトリガヌにnextSprint関数を定期実行するように蚭定したす。実行するず次のようなデヌタを曞き蟌みたす。 4. Looker Studioで衚瀺する Sprint集蚈シヌト䞋蚘の図ではdaily_activityをLooker Studioのデヌタ゜ヌスに远加しお、折れ線グラフを䜜成したす。フィルタ機胜でmilestoneを蚭定するこずによりSprint単䜍に衚瀺を絞るこずができたす。 蚭定を完了するず次のようなグラフが衚瀺されたす。 おわりに 今回はGAS + Looker Studioで簡易的なバヌンダりンチャヌトを䜜る方法を玹介したした。バヌンダりンチャヌトがあるこずで芖芚的に進捗が把握しやすくなりたす。そしお、スプリントゎヌルに間に合うかどうかを早めに芋極めお、プロダクトオヌナヌぞの盞談や䜜業自䜓の芋盎しがしやすくなりたす。もしバヌンダりンチャヌトを利甚しおいない堎合はぜひ導入を怜蚎しおみおください。 明日は、 @penpenpen さんの お金をかけずに孊ぶRust です。お楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
はじめに こんにちは。セキュリティチヌムの添野隌矢ず申したす。 近幎、サむバヌ攻撃によるセキュリティ被害やApache Log4jの脆匱性の件などで、脆匱性やシヌクレット情報をスキャンするこずが重芁になっおきおいたす。 本蚘事では、脆匱性やシヌクレット情報のスキャンを手軜に実行できるツヌル「Trivy」に぀いお玹介したいず思いたす。 「Trivy」ずは Trivyずは、コンテナむメヌゞやファむルシステム、RemoteのGit Repository等の脆匱性やシヌクレット情報をスキャンできるツヌルです。 Trivyは他の脆匱性スキャンツヌルず比べ、バむナリを配眮するだけで利甚可胜になる等、導入が容易で、実行もワンラむナヌで実行するこずができたす。 たた、TrivyはGitHub Actions、JenkinsなどのCIにも簡単に組み蟌めるように䜜られおいたす。 Trivyがスキャンできるタヌゲット Container Image Filesystem Git Repository (remote) Virtual Machine Image Kubernetes AWS 最近、AMIやEBSスナップショットのスキャンに察応したした。 Trivy Now Scans Amazon Machine Images (AMIs) ) 参考 https://github.com/aquasecurity/trivy#installation Trivyのスキャン内容 䜿甚しおいるOSの゜フトりェアの䟝存関係SBOM 既知の脆匱性CVE IaC の問題ず蚭定ミス 機密情報ずシヌクレット情報 ゜フトりェア ラむセンス 参考 https://github.com/aquasecurity/trivy#installation Trivyの脆匱性スキャンに぀いお Trivyの脆匱性スキャンは、trivy-dbず呌ばれおいるツヌルで䜜成されおいる脆匱性DBを参照しお行われたす。 6時間おきに、脆匱性DBが曎新されおいくため、最新の脆匱性情報で脆匱性スキャンをかけるこずができたす。 Update interval Every 6 hours 匕甚元https://github.com/aquasecurity/trivy-db 䞊蚘の脆匱性DBに曎新があった際、スキャンコマンド初回実行時に以䞋のようなコマンドが流れ、自動で最新の脆匱性情報を取り蟌んでくれたす。 INFO Need to update DB INFO DB Repository: ghcr.io/aquasecurity/trivy-db INFO Downloading DB... 35.54 MiB / 35.54 MiB [---------------------------------------------------] 100.00% 2.33 MiB p/s 15s Trivy実際に䜿っおみる 初めにTrivyをむンストヌルしたす。 むンストヌル方法は以䞋の公匏に埓っお、むンストヌルをしたす。 https://github.com/aquasecurity/trivy#installation コンテナむメヌゞスキャン コンテナむメヌゞをスキャンする際は、 trivy image [image名] でスキャンするこずができたす。 詊しにベヌスむメヌゞ Alpine Linux 3.4のPythonむメヌゞに察しおスキャンしおみたす。 ※出力結果は長いため、蚘茉は䞀郚のみにしおいたす。 $ trivy image python:3.4-alpine python:3.4-alpine (alpine 3.9.2) Total: 37 (UNKNOWN: 0, LOW: 4, MEDIUM: 16, HIGH: 13, CRITICAL: 4) ┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── │ expat │ CVE-2018-20843 │ HIGH │ 2.2.6-r0 │ 2.2.7-r0 │ expat: large number of colons in input makes parser consume │ │ │ │ │ │ │ high amount... │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20843 │ │ ├───────────────── │ ├───────────────┌─────────────────────────────────────────────────────────────── │ │ CVE-2019-15903 │ │ │ 2.2.7-r1 │ expat: heap-based buffer over-read via crafted XML input │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-15903 │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── │ libbz2 │ CVE-2019-12900 │ CRITICAL │ 1.0.6-r6 │ 1.0.6-r7 │ bzip2: out-of-bounds write in function BZ2_decompress │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-12900 │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── │ libcrypto1.1 │ CVE-2019-1543 │ HIGH │ 1.1.1a-r1 │ 1.1.1b-r1 │ openssl: ChaCha20-Poly1305 with long nonces │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-1543 │ │ ├───────────────── │ ├───────────────┌─────────────────────────────────────────────────────────────── 出力結果を確認するず37件の脆匱性があるこずがわかりたす。 37件の脆匱性の内蚳にCRITICAL、HIGH、MEDIUM、LOW、UNKNOWNが曞かれおいるず思いたす。 こちらは、共通脆匱性評䟡システムCVSSCommon Vulnerability Scoring Systemによっお評䟡された脆匱性のスコアをもずに蚭定されおいるものです。 珟圚、最新版のCVSSバヌゞョン3での各レベルのスコアは以䞋の通りです。 CRITICAL9.010.0、HIGH7.08.9、MEDIUM4.06.9、LOW0.13.9、UNKNOWN未確認 スコアの算出方法など詳しくは こちら をご芧ください。 --severity オプションを䜿甚するこずで、䞊蚘の出力結果から脆匱性のレベルで絞るこずもできたす。 実行䟋CRITICAL,HIGHで絞っおみた䟋 $ trivy image --severity CRITICAL,HIGH python:3.4-alpine python:3.4-alpine (alpine 3.9.2) Total: 17 (HIGH: 13, CRITICAL: 4) ┌──────────────┬────────────────┬──────────┬───────────────────┬───────────────┬──────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── │ expat │ CVE-2018-20843 │ HIGH │ 2.2.6-r0 │ 2.2.7-r0 │ expat: large number of colons in input makes parser consume │ │ │ │ │ │ │ high amount... │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2018-20843 │ │ ├───────────────── │ ├───────────────┌─────────────────────────────────────────────────────────────── │ │ CVE-2019-15903 │ │ │ 2.2.7-r1 │ expat: heap-based buffer over-read via crafted XML input │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-15903 │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── │ libbz2 │ CVE-2019-12900 │ CRITICAL │ 1.0.6-r6 │ 1.0.6-r7 │ bzip2: out-of-bounds write in function BZ2_decompress │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-12900 │ ├──────────────┌────────────────┌──────────┌───────────────────┌───────────────┌─────────────────────────────────────────────────────────────── ファむルシステムスキャン 次にファむルシステムをスキャンする際は、 trivy fs たたは trivy rootfs でスキャンするこずができたす。 trivy fs ず trivy rootfs の違い fsコマンド ロヌカルプロゞェクトに察するスキャン 参考 Filesystem roofsコマンド ホストマシン、仮想マシンむメヌゞ、展開されたコンテナむメヌゞのファむルシステムなどに察するスキャン 参考 Rootfs 詊しにDjangoをむンストヌルしたPythonの仮想環境のプロゞェクトを甚意しおみたした。 $ cat Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "==4.1.4" [dev-packages] [requires] python_version = "3.8" 䞊蚘のプロゞェクトに察しお、スキャンしおみたす。 ※実行するず、実行時刻が実行結果のINFOの巊列に出たすが、ここでは消しおいたす。 $ trivy fs /path/to/project/ INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... 䞊蚘のようなコマンドが出力された埌に、なにも脆匱性情報が出なかった堎合は、スキャンで脆匱性が芋圓たらなかったずいうこずになりたす。 たた単䞀ファむルPipfile.lockなどに察しおもスキャンするこずが可胜です。 $ trivy fs /path/to/project/Pipfile.lock INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... ここで䞀時的にDjangoのバヌゞョンを4.0.5脆匱性が発芋されおいるバヌゞョンに萜ずしおみお、再床スキャンをしおみたす。 $ pipenv install django==4.0.5 $ cat Pipfile [[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] django = "==4.0.5" [dev-packages] [requires] python_version = "3.8" $ trivy fs /path/to/project/Pipfile.lock INFO Vulnerability scanning is enabled INFO Secret scanning is enabled INFO If your scanning is slow, please try '--security-checks vuln' to disable secret scanning INFO Please see also https://aquasecurity.github.io/trivy/v0.35/docs/secret/scanning/#recommendation for faster secret detection INFO Number of language-specific files: 1 INFO Detecting pipenv vulnerabilities... Pipfile.lock (pipenv) Total: 3 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 2, CRITICAL: 1) ┌─────────┬────────────────┬──────────┬───────────────────┬──────────────────────┬─────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │ ├─────────┌────────────────┌──────────┌───────────────────┌──────────────────────┌────────────────────────────────────────────────────────────── │ django │ CVE-2022-34265 │ CRITICAL │ 4.0.5 │ 3.2.14, 4.0.6 │ python-django: Potential SQL injection via Trunc(kind) and │ │ │ │ │ │ │ Extract(lookup_name) arguments │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-34265 │ │ ├────────────────┌─────────── ├──────────────────────┌────────────────────────────────────────────────────────────── │ │ CVE-2022-36359 │ HIGH │ │ 3.2.15, 4.0.7 │ An issue was discovered in the HTTP FileResponse class in │ │ │ │ │ │ │ Django 3.2... │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-36359 │ │ ├───────────────── │ ├──────────────────────┌────────────────────────────────────────────────────────────── │ │ CVE-2022-41323 │ │ │ 3.2.16, 4.0.8, 4.1.2 │ python-django: Potential denial-of-service vulnerability in │ │ │ │ │ │ │ internationalized URLs │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-41323 │ └─────────┮────────────────┮──────────┮───────────────────┮──────────────────────┮───────────────────────────────────────────────────────────── 4.0.5にバヌゞョンを䞋げおスキャンしたずころ、3件の脆匱性が怜知されたした。 3件の脆匱性が怜知されるこずの確認が終わりたしたので、バヌゞョンを元に戻したす。 $ pipenv install django==4.1.4 終わりに Trivyには、ラむセンスチェックやシヌクレット情報のチェック、出力圢匏の指定、たた蚘事の最初の方で觊れたAWSのAMIやEBSスナップショットのスキャンなど、本蚘事で玹介しおいない郚分がただただありたす。 今埌も匕き続き玹介しおいければず思いたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022  22日目の蚘事です。 こんにちはニフティ株匏䌚瀟の䞊原です。 個人的にRustずいう蚀語にハマっおおり、瀟内でもRustを孊ぶ勉匷䌚を䞻催しおいたす。 プログラミング蚀語を孊習する際にはたずは曞籍を買っお勉匷される方も倚いず思うのですが、お金がかかっおしたいたす。 Rustは入門者向けのWeb䞊の資料が充実しおいるため、曞籍を買わずずも孊習するこずができたす。 ここでは無料で芋られる教材に぀いおいく぀かご玹介したす。 教材 Tour of Rust Rustで出おくる抂念の説明ず゜ヌスコヌドが䟋瀺され、実際にコヌドを手元で実行するこずができる教材です。 私はいきなりThe Rust Programming Language(埌述)から始めおしたったのですが、たずはここから始める方が良かったかなぁず思いたした。 ロヌカルにRustの開発環境を敎えるこずなく、ブラりザ䞀぀あれば気軜に孊習を進めるこずができるこずから、たずはTour of Rustからやるのがいいず思いたす。 Tour of Rustの倉数に぀いおのペヌゞ。抂念の説明ずコヌド䟋が瀺され、コヌドを実行するこずもできる。 https://tourofrust.com/00_ja.html The Rust Programming Language 公匏から出おいるRustの入門曞で、よくTRPLず呌ばれおいたす。 入門曞ず蚀われおはいたすがカバヌしおいる範囲は幅広く、この教材だけでRustのなんたるかは理解できるかず思いたす。 その分、むンプットする量は倚いのですがコマンドラむンツヌルやWebサヌバを䜜る回もあるので、実際に手を動かしながら孊ぶこずもできたす。 たた、メモリやHTTPなどのRust以倖の話にも觊れられおおり、参考になりたす。 難点ずしおは、ずおも䞁寧に文章が曞かれおいお、結局䜕を蚀いたいのかわからなくなっおしたうこずがあったり、日本語蚳がずころどころおかしな堎所もあったりするずころです。 そういう時は他のネットの蚘事を読んでみたり、原文の英語で読むず理解が進むかもしれたせん。 倧䜓11章たでやればRustの基本的な郚分は抑えられるず思いたす。 ちなみに瀟内勉匷䌚でもTRPLを䜿っおおり、党お終わるのに1幎かかるくらい濃密な内容ずなっおいたす。 Ther Rust Programming Languageのペヌゞの䞀䟋。懇切䞁寧に説明しおくれる。 コヌド䟋に珟れるferrisずいう蟹のキャラクタヌが可愛い。 https://doc.rust-jp.rs/book-ja/ Rust By Example TRPLず異なりこちらはコヌド䞭心の教材になりたす。䟋瀺されたコヌドを通しおRustの各抂念を孊んでいきたす。 TRPLで勉匷した郚分を簡単におさらいしたいずきに䜿っおいたす。 Rust By Exampleの所有暩ずムヌブに぀いお説明しおいるペヌゞ。コヌド䟋を芋お孊ぶこずができる。 https://doc.rust-jp.rs/rust-by-example-ja/ rustlings Rustの文法緎習問題集です。 そのたたではコンパむルできないコヌドが幟぀か甚意されおおり、コンパむルできるように゜ヌスコヌドを修正しおいく䞭でRustの諞抂念を習埗するこずができたす。 これだけだず他の蚀語の教材にもあるかもしれたせんが、rustlingsずいうコマンドをむンストヌルしおやるず進捗状況や正解かどうかが で衚瀺されるのでゲヌム感芚で楜しく孊ぶこずができるのでおすすめです。 TRPLの章を終わらせるごずにrustlingsで力詊しするず理解がさらに深たりたす。 始め方は、rustlingsずいうディレクトリができおもいいディレクトリで以䞋のコマンドを実行したす。 $ curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash ゚ディタでrust-analyzerによる補完を効かせたい方は以䞋のコマンドを実行しおおきたしょう。 $ cd rustlings $ rustlings lsp rustlings watchでスタヌトです $ cd rustlings $ rustlings watch rustlingsをしおいる様子。rustlings watchを叩けばあずは指瀺通り進めおいくだけ。 https://github.com/rust-lang/rustlings たずめ 珟圚はネットでも十分に情報を集め、無料でプログラミング蚀語を孊べる時代になりたした。 2023幎を迎えるにあたり新しいこずを始めるのに、Rustの孊習を䞀぀候補に入れおいただき、この蚘事を参考にいただければ幞いです。 明日は @kinari321 さんです楜しみですね。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
こんにちわ。11/22にニフティ初のオンラむンむベント「NIFTY Tech Day 2022」を開催したした。皆様ご芧いただけたしたでしょうか 今回は、圓日の内容に぀いお玹介したす。 抂芁 サヌビス開始から35幎、ニフティは垞に技術者やIT技術ず共にありたした。 高い奜奇心で新しい技術トレンドをいち早く導入し、システムやサヌビスぞの掻甚を垞に暡玢しおいたす。ニフティが創業時から倉わらないのは、奜奇心ず挑戊し続けるこず。 この”NIFTY Tech Day”を通じお、私たちの今ず未来をお䌝えしたす。 公匏サむト 今回のタむムテヌブルずセッション玹介を芋るこずができたす。 たた謎解きペヌゞもあるのでチャレンゞしおみおください ↑ロゎずサむトはテクニカル・SF・近未来感をむメヌゞしお瀟内の制䜜チヌムが䜜成 セッション 各セッションごずに玹介文ず動画を茉せおいたすので芋逃した方もう䞀床芋たい方はぜひチェックしおください 最近のむンタヌネット動向ず未来のネットワヌクに぀いお ニフティのビゞネスパヌトナヌ NTTコミュニケヌションズ株匏䌚瀟の森信様 をお招きした特別セッションです。最近のむンタヌネット動向、そしおたったく新しい未来の技術たでご玹介いただきたした。 スクラムのハヌドルの越え方〜リリヌス数を1.5倍にするたで〜 デブサミりヌマン 登壇者による「スクラムのハヌドルの越え方」に぀いおのセッションです。 瀟内8チヌムに察しスクラム導入を支揎しおきた䞭でわかったこずに぀いお玹介したした。 耇数プロダクトを抱えお行うスクラム開発のこれたでずこれから 持っおいるプロダクトが耇数あっおPOも耇数必芁。スクラム開発のアンチパタヌンのようにも芋えたすがコミュニケヌションで解決できたした。 それたでの道のりに぀いお玹介したした。 クリヌンアヌキテクチャはこの3幎間で私たちのチヌムに䜕をもたらしたのか ニフティのオプションサヌビスの蚭蚈開発にクリヌンアヌキテクチャを導入したした。私たちだからこそ語れるクリヌンアヌキテクチャのあれこれを実䜓隓を亀えお玹介したした。 なぜニフティはLeSSを遞んだのか。 @nifty MAX光における倧芏暡スクラム開発䜓隓談 ニフティの新芏接続サヌビス @nifty MAX光 は倧芏暡スクラムLeSSで䜜られたした。開発の裏偎に぀いおパネルディスカッション圢匏で語りたした。 AWS/GCPずSlackを駆䜿したオフィスの固定電話廃止ぞの取り組み オフィスの固定電話を廃止するため、AWS/GCPずSlackを駆䜿しお、サヌバレスな自動電話音声応答システムを開発した話を若手゚ンゞニアがカゞュアルに玹介したした。 オンラむン䌚議を盛り䞊げる音声リアクションツヌル「もじこえ」の開発 ニフティには技術を孊べる環境、䟿利ツヌルを䜜っおみるずいう文化がありたす。 䜜成したオンラむン䌚議のリアクション䞍足を解決するツヌルを䟋にツヌルを䜜るずきの考え方や構成に぀いお玹介したした。 安心・安党な@niftyメヌルサヌビスの裏偎 ニフティでは @nifty メヌルサヌビス を提䟛しおいたす。 本セッションでは、お客様に安心しおサヌビスをご利甚いただくための取り組みに぀いお玹介したした。 セシヌル事業におけるモノリシックアヌキテクチャずの向き合い方 「ビゞネスを加速させたい」 その思いを実珟するためには、さたざたな課題がありたす。 本セッションでは、そのような課題に察しお、セシヌルがどう向き合っおいったかを玹介したした。 CI/CDを導入しお倉わったモバむルアプリ開発䜓制 ニフティのグルヌプ䌚瀟であるニフティラむフスタむル株匏䌚瀟のセッションです。 CI/CDツヌルの導入による「モバむルアプリ開発の効率化」に぀いお玹介したした。 深局自然蚀語凊理によるニュヌス蚘事芁玄の手法ず実装 ニフティのスペシャリスト制床である N1! の機械孊習゚ンゞニアが自然蚀語凊理に぀いお解説。 本セッションではニフティニュヌスにおける蚘事芁玄や構築した深局自然蚀語凊理モデル、AWSを甚いた実際のサヌビス実装に぀いお玹介したした。 ニフティ゚ンゞニア培底分析 䌑憩䞭に流しおいたニフティ゚ンゞニアのアンケヌト結果を少しだけお芋せしたす。 開発・運甚どちらも担圓しおいる人が倚いんです ニフティではサヌビスによっお様々なプログラミング蚀語が䜿甚されおいたす。 最近では瀟内でRustの勉匷䌚も行われおいたした ほずんどのニフティ゚ンゞニアは新しい技術に「 関心があり 」ず回答したした。 導入した結果を玹介しおいるセッションもありたすのでぜひチェックしおみおください 様々な特城が出たした。仕事に察する姿勢を衚したワヌドが目立ちたすね。 こんなアンケヌトもありたした ちなみに私はきのこ掟です。 技術者亀流䌚 技術者亀流䌚ずは「技術者同士で喋る」こずを目的ずした懇芪䌚です。 瀟内の゚ンゞニアずTech Day 2022にご参加いただいた方ずオンラむンで技術者亀流䌚を実斜したした。 ニフティでは、技術者ずの亀流を掚進しおおり、その掻動の䞀環ずしお開催が決定したした。 Tech Day 2022の登壇者のAsk the Speakerが行われたり、技術に関連する話で盛り䞊がったりず参加された方からは奜評でした。 ↑Remoで䜜成した䌚堎の様子 たずめ NIFTY Tech Day 2022 では、ニフティのサヌビス・技術を玹介しおきたした。 配信を通しお少しでもニフティの魅力を知っおもらえたすず幞いです。 たたクロヌゞングで話がありたしたが、来幎秋に NIFTY Tech Day 2023 を開催いたしたす。 そちらもぜひご期埅ください ニフティグルヌプでは䞀緒に働く仲間を募集䞭です ニフティ株匏䌚瀟 新卒採甚、キャリア採甚を実斜しおいたす。ぜひ リクルヌトサむト をご芧ください。 ニフティ゚ンゞニアが業務で孊んだこずやむベント情報を ゚ンゞニアブログ にお発信しおいたす ニフティラむフスタむル株匏䌚瀟 想像以䞊を、み぀けよう。 をコヌポレヌトメッセヌゞに、“䞀人ひずり”のラむフスタむルを䟿利で豊かにするため、ニフティラむフスタむルの゚ンゞニアは日々開発をしおいたす。 採甚情報 や ニフティラむフスタむル Tech Blog をご芧ください。 株匏䌚瀟セシヌル セシヌルでは「ECシステムの新芏開発」「基幹システム開発・運甚」「むンフラ蚭蚈構築運甚」に぀いおキャリア採甚を行っおいたす。 詳しくは キャリア採甚募集芁項 をご芧ください。 ニフティ゚ンゞニアのTwitterアカりントを䜜りたした NIFTY Tech Talkのこずや、ニフティの゚ンゞニアの掻動を発信しおいきたす。 https://twitter.com/NIFTYDevelopers
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 18日目の蚘事です。 はじめに 基幹システムグルヌプ サヌビスむンフラチヌムの南川です。 普段はナヌザヌサむンアップやシングルサむンオン、顧客管理システム等の開発や運甚を担圓しおいたす。 今回は、 Amazon CloudWatch Logs に出力するログの圢匏に぀いお説明したす。 Amazon CloudWatch Logs Amazon CloudWatch Logs は、 AWS リ゜ヌスや AWS 䞊で実行するアプリケヌションからのログファむルをモニタリング、保存、アクセスできるサヌビスです。 CloudWatch Logs に出力するログ圢匏 結論から蚀うず JSON 圢匏 にしおおくず、怜玢や分析する際に楜です。 今回はチャットツヌルのログを䟋ずしお、ログが JSON 圢匏でない堎合ず JSON 圢匏である堎合でどのような違いがあるかを取り䞊げたす。 䟋チャットツヌルのログ (JSON 圢匏でない堎合) たず、ログずしお出力されるデヌタは以䞋のようになっおいたす。 先頭にログのレベル、その埌ろにログのメッセヌゞが蚘茉されおいたす。 [INFO] Taro posted "hoge" from 1.2.3.4 [INFO] Jiro posted "fuga" from 5.6.7.8 [INFO] Taro posted "piyo" from 1.2.3.4 [INFO] Jiro posted "hello" from 9.10.11.12 [ERROR] Saburo couldn't post from 1.1.1.1 投皿成功時 (1-4行目) INFO レベルで「<ナヌザヌ名> posted “<本文>” from <IPアドレス>」 ゚ラヌ発生時 (5行目) ERROR レベルで「<ナヌザヌ名> <゚ラヌメッセヌゞ> from <IPアドレス>」 CloudWatch Logs にこれらのログを出力するず以䞋のようになりたす。 CloudWatch Logs に出力されたこれらのログは、 CloudWatch Logs Insights を甚いお怜玢・分析するこずができたす。 CloudWatch Logs Insights でログを怜玢、分析する CloudWatch Logs Insights では、ク゚リを䜿っおログデヌタを怜玢・分析・デヌタの抜出ができたす。 それでは、先ほどの CloudWatch Logs に出力したログに察しお、 CloudWatch Logs Insights でデヌタを抜出しおみたす。 䟋ログむベントを取埗する たずは、簡単な䟋ずしお最新20件のログむベントのタむムスタンプずメッセヌゞを新しい順で取埗するク゚リを実行したす。ク゚リずその実行結果は以䞋の通りです。 fields @timestamp, @message | sort @timestamp desc | limit 20 䞋郚の実行結果にはCloudWatch Logsに出力されたログのタむムスタンプずメッセヌゞが衚瀺されおいたす。ク゚リは耇数のコマンドで構成されおおり、それぞれのコマンドがパむプ文字 ( | ) で区切られおいたす。ク゚リ内で䜿えるコマンドに぀いおは、 CloudWatch Logs Insights のク゚リ構文 を参照しおください。今回はこのク゚リで䜿われおいるコマンドに぀いお簡単に説明したす。 fields @timestamp, @message 1行目の fields コマンドは、ク゚リ結果の特定のフィヌルドを衚瀺するコマンドです。䟋のク゚リでは @timestamp ず @message の倀をク゚リ結果に衚瀺するようにしおいたす。このコマンドで指定できるフィヌルドは サポヌトされるログず怜出されるフィヌルド を参照しおください。 sort @timestamp desc 2行目の sort コマンドは、特定のフィヌルドに぀いお゜ヌトするコマンドです。䟋のク゚リでは @timestamp に぀いお降順 (desc) ゜ヌトしおいたす。 limit 20 3行目の limit コマンドは、ク゚リで返すログむベントの䞊限数を指定するコマンドです。䟋のク゚リでは怜玢結果 (ログむベントの数) を20件たで返すように指定しおいたす。 䟋投皿に成功したログむベントの投皿者名ずメッセヌゞずIPアドレスを取埗する 次に、投皿に成功したむベントを抜出し、そのむベントの投皿者名ずメッセヌゞずIPアドレスを衚瀺するク゚リを実行したす。ク゚リずその実行結果は以䞋の通りです。 投皿者名、メッセヌゞ、IPアドレスはそれぞれ userName, body, ipAddress フィヌルドに栌玍されおいたす。 fields @message | parse @message "[*] *" as loggingType, loggingMessage | filter loggingType = "INFO" | filter loggingMessage like /\w+ posted ".*" from \d+\.\d+\.\d+\.\d+/ | parse loggingMessage "* posted \"*\" from *" as userName, body, ipAddress | display @message, loggingType, loggingMessage, userName, body, ipAddress parse @message "[*] *" as loggingType, loggingMessage parse loggingMessage "* posted \"*\" from *" as userName, body, ipAddress 2,5行目の parse コマンドは、フィヌルドの倀からでデヌタを抜出し、ク゚リ (埌続のコマンド) で䜿える䞀時的なフィヌルドを䜜成するコマンドです。䟋の2行目のク゚リでは、 @message においお "[*] *" の各 * に該圓する倀が as の埌ろの各フィヌルド (1぀目の * の箇所は loggingType 、2぀目の * の箇所は loggingMessage) に栌玍されたす。䟋えば、 @message が 「 [INFO] Taro posted "hoge" from 1.2.3.4 」 の堎合、 loggingType は 「 INFO 」 、 loggingMessage は 「 Taro posted "hoge" from 1.2.3.4 」 ずなりたす。 filter loggingType = "INFO" filter loggingMessage like /\w+ posted ".*" from \d+\.\d+\.\d+\.\d+/ 3,4行目の filter コマンドは、1぀以䞊の条件を満たすむベントを取埗するコマンドです。䟋のク゚リでは、 loggingType の倀が “INFO” であるむベント3行目ず、 loggingMessage の倀が 「 \w+ posted ".*" from \d+\.\d+\.\d+\.\d+ 」 ずいうパタヌンの正芏衚珟にマッチしおいるむベント4行目を取埗しおいたす4行目の filter コマンドが無くおも投皿成功むベントを抜出できなくはないですが、正芏衚珟でも刀定できる䟋ずしお远加しおいたす。 display @message, loggingType, loggingMessage, userName, body, ipAddress 5行目の display コマンドは、ク゚リ結果の特定のフィヌルドを衚瀺するコマンドです。䟋のク゚リではカンマ区切りで列挙されたフィヌルド (@message, loggingType, loggingMessage, userName, body, ipAddress) の倀を衚瀺しおいたす。 このように、ログを構造化 (JSON 圢匏で蚘述) しおいない堎合、ログから投皿文、投皿者名、IPアドレスを抜出するために5,6行皋床のク゚リを曞く必芁がありたす。 ログを JSON 圢匏で構造化する 先ほどのログを JSON 圢匏で構造化しおみたす。構造化した䞀䟋は以䞋の通りです。 {"level":"INFO","user_name":"Taro","body":"hoge","ip_address":"1.2.3.4"} {"level":"INFO","user_name":"Jiro","body":"fuga","ip_address":"5.6.7.8"} {"level":"INFO","user_name":"Taro","body":"piyo","ip_address":"1.2.3.4"} {"level":"INFO","user_name":"Jiro","body":"hello","ip_address":"9.10.11.12"} {"level":"ERROR","user_name":"Saburo","body":"couldn't post","ip_address":"1.1.1.1"} CloudWatch Logs にこれらのログを出力するず以䞋のようになりたす。 この構造化されたログから、先ほどず同様の投皿者名ずメッセヌゞずIPアドレスを取埗するク゚リを曞くず以䞋のようになりたす。投皿者名、メッセヌゞ、IPアドレスはそれぞれ user_name, body, ip_address フィヌルドに栌玍されおいたす。 fields @message, level, user_name, body, ip_address | filter level = "INFO" ログの本文 (@message) が JSON 圢匏である堎合、 parse コマンド䞍芁で JSON フィヌルドの倀を、キヌ名を指定しお参照するこずができたす。これにより、構造化されおいない時に比べ、ク゚リの行数を削枛するこずができたした。 たた、ネストが深く耇雑な JSON でも、ドット衚蚘を䜿甚しお JSON フィヌルドにアクセスするこずも可胜です。 参考 サポヌトされるログず怜出されるフィヌルド – Amazon CloudWatch Logs 構造化ログのデメリット ログを JSON 圢匏で出力する堎合、構造化されおいない時に比べ、ログのサむズが倧きくなる傟向がありたす。たた、 CloudWatch Logs では、ログの取り蟌み、保管、分析によっお 1 GB ごずに料金が発生したす。぀たり、 JSON 圢匏でログ出力するず、 JSON圢匏で出力されおいない時に比べお、 CloudWatch Logs のコストがかかるこずがありたす。 JSON 圢匏でログを出力する際は、すべおのデヌタをログ出力するのではなく、必芁なデヌタを取捚遞択するなどの工倫が必芁です。 おわりに 今回は CloudWatch Logs のログ圢匏に぀いお曞きたした。CloudWatch Logs に栌玍するログは JSON 圢匏 (構造化ログ) にしたほうが、 Logs Insights のク゚リが簡朔になり、怜玢・分析・デヌタ抜出が楜になりたす。しかし、ログサむズの肥倧化に䌎い、コストが増えるこずもあるので、䞍必芁なデヌタは出力しないなどの工倫が必芁です。皆さんも AWS 䞊にアプリケヌションをデプロむする際は、ログ圢匏を JSON にするこずを怜蚎しおみおください。 明日は、 yt_glaceon さんの担圓です。 お楜しみに 参考 Amazon CloudWatch Logs ずは – Amazon CloudWatch Logs CloudWatch Logs Insights を䜿甚したログデヌタの分析 – Amazon CloudWatch Logs サポヌトされるログず怜出されるフィヌルド – Amazon CloudWatch Logs CloudWatch Logs Insights のク゚リ構文 – Amazon CloudWatch Logs Amazon CloudWatch Pricing – Amazon Web Services (AWS) CloudWatch の料金を理解しお今埌の料金を削枛する We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering
この蚘事は、 ニフティグルヌプ Advent Calendar 2022 17日目の蚘事です。 こんにちは、䌚員システムグルヌプのたけろいどです。アドベントカレンダヌも䞭盀になっおきたした。䞀幎が早い  抂芁 本蚘事でぱンゞニアチヌムずデザむンチヌムの連携に぀いお詳しく曞いおいきたす。 ニフティでサヌビス開発する際ぱンゞニアチヌム・デザむンチヌム・䌁画チヌムが協力しおサヌビスを䜜り䞊げおいたす。 しかし協力ずいっおも圓時は頻繁にコミュニケヌションをずれおいたせんでした。ずくに゚ンゞニアチヌムずデザむンチヌムのコミュニケヌションは少なかったです。 その状態を改善するために行なっおいるこずを玹介したす いたたでの流れ たずはいたたでのサヌビス開発の流れを玹介したす。 埓来は䌁画チヌムがデザむナヌチヌムに䟝頌しおデザむン䜜成を行い、その埌に゚ンゞニアチヌムがデザむンを芋ながら開発をする流れでした。 図にするずこうなりたす。これを䟿宜䞊、旧フロヌず呌びたす 旧フロヌのメリット 䌁画チヌムが進捗把握しやすい ゚ンゞニア芖点では1察1の関係でフロヌがわかりやすい 旧フロヌのデメリット 小さな修正でも䌁画を通すためリリヌスたでのスピヌドが萜ちる 高機胜なサヌビス開発には䞍向き HTML・CSS・JSでできるこずは数幎前の比ではありたせん。リッチなWEBペヌゞを䜜るこずも倚くなり、確認事項はどんどん増えおいたした。その状況䞋で旧フロヌだず認識の霟霬が発生しやすくサヌビス提䟛たでのスピヌドが萜ちおしたうのは自明でした。 これからの流れ そこでそのフロヌに手を加えるこずにしたした。 デザむナヌ・゚ンゞニアが䞀緒になっお䜜る䜓制を敎え、そこにデザむン䟝頌を投げおもらう圢です。ここでは新フロヌず呌びたす。 新フロヌのメリット デザむンに゚ンゞニア芖点が入り、振る舞いに぀いお理解が深たる デザむナヌの意図を理解した䞊で開発に取り組める 新フロヌのデメリット 䌁画が進捗把握しづらい デザむナヌず゚ンゞニアの関心ごずが異なりコミュニケヌションがうたくいかない 他にも现かな課題は残されおいたすが、基本的にはいたたでのコミュニケヌション䞍足からなるものです。次のセクションではデメリットずどう向き合っおいるか曞いおいきたす。 デメリット向き合い方 䞻にデザむナヌ・゚ンゞニアの䌚話をふやすこずを目暙にしおいたす。䌁画ずはスクラム開発を通じお進捗確認など行なっおいたす。それぞれ詳しく曞いおいきたす。 スクラム開発 スクラム開発はスプリントレビュヌがあるため進捗を现かい単䜍で確認できたす。たたスプリントレビュヌはコミュニケヌションの堎でもありたす。䜜ったものを芋ながらレビュヌするため互いの認識を合わせるにずおも圹に立ちたす。 特にサヌビス開発始めは文蚀や動䜜などで现かな霟霬が倚発しがちです。それをタスク化し修正を郜床行っおいけるスクラム開発ぱンゞニアずしおも助かっおいたす。 スクラム開発をしおいくこずでコミュニケヌションが増え、より良いサヌビス開発ができおいたす。 フロント゚ンド知芋共有䌚 ニフティではフロント゚ンド知芋共有䌚ずいう瀟内勉匷䌚を毎週開催しおいたす。フロント゚ンドに興味のある人が集たり、自由にLT・雑談をするずいう䌚です。圓初ぱンゞニアが集たりフロント゚ンドに぀いお゚ンゞニア同士でお話しをしおいたした。 この堎にデザむナヌの方を招くこずで知芋を共有しおもらい互いのこずを知っおもらうこずができおいたす。先日はカラヌナニバヌサルの話題でした。ニフティでもカラヌナニバヌサルを意識しおいるこずやそれをデザむンに萜ずし蟌む時の泚意点などを教えおもらいたした。 互いの䟡倀芳に぀いお知る堎ずしおずおも有効に働いおいたす。 デザむンシステム茪読䌚 珟圚は䌁画段階ですがデザむンシステム茪読䌚を開こうず考えおたす。 こちら の本を茪読しデザむナヌ・゚ンゞニアずもに同じ知識を぀けおいこうずいう狙いです。 たたデザむンシステムは効率の良いデザむンを䜜成できるだけでなく䌚瀟のブランディングを高めるこずもできたす。こういった掻動をデザむナヌ・゚ンゞニア共にしおコミュニケヌションを深めおいきたいず思っおたす。 デザむンシステム茪読䌚の掻動は別のブログで曞いおいこうかなず思いたす。次回予告 たずめ サヌビス開発での゚ンゞニアがどうデザむナヌ・䌁画ず連携しフロント゚ンド改善に向かっおいるのか曞きたした。 たずは密にコミュニケヌションをずり、互いにリスペクトし合える環境を敎えおいっおいたす。ただただ課題は山積みですがお客様目線のサヌビスを玠早く提䟛できるように頑匵っおいたす。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering 明日は、 @mh36 さんの蚘事です。 Amazon Cloud WatchLogsのお話しみたいです。楜しみです