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

TECH PLAY

ニフティ株匏䌚瀟

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

å…š529ä»¶

この蚘事は、 ニフティグルヌプ Advent Calendar 2023 7日目の蚘事です。 こんにちわNIFTY engineering運甚チヌムのいかりがわです 今回はWordPressのテヌマをGitHub管理できるようにし、EC2に自動でデプロむするようにしたので、その手法をたずめおいきたいず思いたす。 背景 私たちが運甚しおいるNIFTY engineeringでは、䜕らかの倉曎があったずきは FileManager ずいうWordPressのファむル管理甚プラグむンを䜿っお手動で倉曎を加えおいたした。 しかし、これでは手動での倉曎反映になり、以䞋のような問題が起こりたす。 人為的なミスが発生する可胜性が高たる 蚭定や手順のミス、環境の䞍敎合などが起きやすくなりたす。 䞀貫性が保おない NIFTY engineeringでは、本番環境、開発環境の2぀の環境を甚意しおいたす。 運甚䞊では開発環境で確認埌、本番環境にデプロむするようにしおいたすが、緊急時の察応などは急いで察応するため、本番のみに反映しがちになりたす。 ニフティのプロゞェクトでは基本的にCI/CDパむプラむンが敎備されおいたす。 NIFTY engineeringもCI/CDのパむプラむンを䜿甚しお倉曎を容易にしおいきたいず考えおおり、AWS CodePipelineによる自動デプロむのむンフラを䜜っおいこうず考えたした。 手法 私たちは、GitHub ActionsからAWS CodeCommitぞ゜ヌスコヌドをコピヌしお、CodePipelineを䜿甚するようにしたした。 たた、WordPressのテヌマをEC2に自動デプロむする手法を採甚したした。 具䜓的な流れは以䞋の通りです。 たず、Developerが゜ヌスコヌドをGitHubリポゞトリにプッシュしたす。 GitHub Actionsはリポゞトリの倉曎を監芖し、倉曎があったらトリガヌしたす。 倉曎があるず、GitHub ActionsはCodeCommitに゜ヌスコヌドをコピヌしたす。 CodeCommit内のコヌドが倉曎されるず、CodePipelineがトリガヌしたす。 CodePipelineのデプロむフェヌズにおAWS CodeDeployが実行されたす。 CodeDeployにお、EC2の特定のディレクトリに倉曎をデプロむしたす。 これで、GitHubでの゜ヌスコヌドの管理が容易になり、自動デプロむによる効率的な運甚が可胜ずなりたす。 構成図 構成図は以䞋のようになっおいたす。構成図内の凊理の順番は手法の手順に沿っおいたす。 TerraformでAWSのリ゜ヌスを䜜る では実際にCI/CDむンフラを䜜っおみたいず思いたす。 たず、AWSのリ゜ヌスをTerraformで䜜っおいきたす。 ちなみにここではTerraformのプロバむダ蚭定やバヌゞョンの定矩は割愛しお、リ゜ヌスの定矩のみにしおいたす。 たた、EC2むンスタンスはすでに起動しおいるこずを想定したす。 CodeCommit CodeCommitのリポゞトリを䜜成したす。リポゞトリ名を指定するだけです。 resource "aws_codecommit_repository" "repository" { repository_name = "codecommit-repository" } CodeDeploy resource "aws_iam_role" "deploy" { assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Sid = "" Principal = { Service = "codedeploy.amazonaws.com" } }, ] }) } resource "aws_iam_role_policy_attachment" "deploy" { role = aws_iam_role.deploy.name policy_arn = "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole" } resource "aws_codedeploy_app" "deploy" { compute_platform = "Server" name = "deploy" } resource "aws_codedeploy_deployment_group" "deploy" { app_name = aws_codedeploy_app.deploy.name deployment_group_name = aws_codedeploy_app.deploy.name deployment_config_name = "CodeDeployDefault.OneAtATime" deployment_style { deployment_option = "WITHOUT_TRAFFIC_CONTROL" deployment_type = "IN_PLACE" } ec2_tag_set { ec2_tag_filter { key = "Name" type = "KEY_AND_VALUE" value = {デプロむ先EC2むンスタンス名} } } service_role_arn = aws_iam_role.deploy.arn auto_rollback_configuration { enabled = true events = ["DEPLOYMENT_FAILURE"] } } aws_iam_role、aws_iam_role_policy_attachmentを䜿甚し、CodeDeployで䜿甚するIAMロヌルを䜜成したす。 指定したポリシヌはマネヌゞドポリシヌの AWSCodeDeployRole です。 たた、aws_codedeploy_appを䜿甚しお、CodeDeployのリ゜ヌスを䜜成し、aws_codedeploy_deployment_groupにお、CodeDeployで䜿甚するデプロむメントグルヌプを䜜成したす。 以䞋のようにec2_tag_setでNameタグを指定するこずで、その名前ず䞀臎するEC2むンスタンスを指定するこずができたす。 これにより、CodeDeployがEC2ぞデプロむできるようになりたす。 ec2_tag_set { ec2_tag_filter { key = "Name" type = "KEY_AND_VALUE" value = {デプロむ先EC2むンスタンス名} } } CodePipeline resource "aws_iam_role" "pipeline" { assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = "sts:AssumeRole" Effect = "Allow" Sid = "" Principal = { Service = "codepipeline.amazonaws.com" } }, ] }) } resource "aws_iam_policy" "pipeline" { name = "codepipeline-policy" path = "/service-role/" description = "Policy for CodePipeline to deploy" policy = file("policies/codepipeline_policy.json") } resource "aws_iam_role_policy_attachment" "pipeline" { role = aws_iam_role.pipeline.name policy_arn = aws_iam_policy.pipeline.arn } resource "aws_codepipeline" "pipeline" { name = "pipeline" role_arn = aws_iam_role.pipeline.arn artifact_store { location = "unique-s3-bucket-name" type = "S3" } stage { name = "Source" action { category = "Source" configuration = { BranchName = "main" PollForSourceChanges = false RepositoryName = "codecommit-repository" } name = "Source" output_artifacts = ["SourceArtifact"] owner = "AWS" provider = "CodeCommit" run_order = "1" version = "1" } } stage { action { category = "Deploy" configuration = { ApplicationName = aws_codedeploy_app.deploy.name DeploymentGroupName = aws_codedeploy_app.deploy.name } input_artifacts = ["SourceArtifact"] name = "Deploy" owner = "AWS" provider = "CodeDeploy" run_order = "1" version = "1" } name = "Deploy" } depends_on = [aws_codedeploy_deployment_group.deploy] } aws_iam_role、aws_iam_policy、aws_iam_role_policy_attachmentを䜿甚しお、CodePipeline甹IAMロヌルを䜜成しおいたす。 たた、aws_iam_policyではpolicies/codepipeline_policy.jsonずいうファむルを参照しおおり、そこにポリシヌの蚭定が蚘述されおいたす。埌述 aws_codepipelineを䜿甚し、CodePipelineのリ゜ヌスを定矩しおいきたす。 stageを䜿甚するこずで、CodePipeline内の各フェヌズを定矩するこずができたす。 今回は䞊で定矩したCodeCommitずCodeDeployのリ゜ヌスを玐付け、フェヌズずしお定矩しおいきたす。 stage { name = "Source" action { category = "Source" configuration = { BranchName = "main" PollForSourceChanges = false RepositoryName = "codecommit-repository" } name = "Source" output_artifacts = ["SourceArtifact"] owner = "AWS" provider = "CodeCommit" run_order = "1" version = "1" } } stage { action { category = "Deploy" configuration = { ApplicationName = aws_codedeploy_app.deploy.name DeploymentGroupName = aws_codedeploy_app.deploy.name } input_artifacts = ["SourceArtifact"] name = "Deploy" owner = "AWS" provider = "CodeDeploy" run_order = "1" version = "1" } name = "Deploy" } CodePipeline甹IAMロヌル AWS公匏のナヌザヌガむドを参考に䜜成しおいたす。 https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/security-iam.html policies/codepipeline_policy.json { "Statement": [ { "Action": [ "iam:PassRole" ], "Resource": "*", "Effect": "Allow", "Condition": { "StringEqualsIfExists": { "iam:PassedToService": [ "ec2.amazonaws.com" ] } } }, { "Action": [ "codecommit:CancelUploadArchive", "codecommit:GetBranch", "codecommit:GetCommit", "codecommit:GetUploadArchiveStatus", "codecommit:UploadArchive" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetApplication", "codedeploy:GetApplicationRevision", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:RegisterApplicationRevision" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "ec2:*", "cloudwatch:*", "s3:*", "sns:*" ], "Resource": "*", "Effect": "Allow" } ], "Version": "2012-10-17" } CodePipeline甹S3バケット CodePipelineでは各フェヌズ間のデヌタの受け枡しに䜿甚されたす。 今回の䟋だず、CodeCommitからCodeDeployぞ゜ヌスコヌドを受け枡すために䜿甚されたす。 resource "aws_s3_bucket" "codepipeline" { bucket = "unique-s3-bucket-name" } resource "aws_s3_bucket_ownership_controls" "codepipeline" { bucket = aws_s3_bucket.codepipeline.id rule { object_ownership = "BucketOwnerEnforced" } } EventBridge これたでの定矩で䞀通りのリ゜ヌスは定矩されたした。しかし、これでは䜕をもっおCodePipelineが実行され、デプロむが走るのかが定矩されおいたせん。 ここでEventBridgeを定矩し、CodeCommitのリポゞトリで゜ヌスコヌドが倉曎されたずきにCodePipelineがトリガヌされるようにしおいきたす。 resource "aws_iam_policy" "events_trigger" { description = "Policy for notice update to codepipeline" name = "events-trigger-policy" path = "/service-role/" policy = jsonencode({ "Statement": [ { "Action": [ "codepipeline:StartPipelineExecution" ], "Effect": "Allow", "Resource": "*", } ], "Version": "2012-10-17" }) } resource "aws_iam_role" "events_trigger" { name = "events-trigger-role" assume_role_policy = jsonencode({ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": "events.amazonaws.com" } } ], "Version": "2012-10-17" }) } resource "aws_iam_role_policy_attachment" "events_trigger" { role = aws_iam_role.events_trigger.name policy_arn = aws_iam_policy.events_trigger.arn } resource "aws_cloudwatch_event_rule" "trigger" { name = "codecommit-trigger-rule" description = "update event" event_pattern = templatefile("events/events_trigger_rule.tpl.json", { repository_arn = aws_codecommit_repository.repository.arn }) is_enabled = "true" } resource "aws_cloudwatch_event_target" "trigger" { arn = aws_codepipeline.pipeline.arn role_arn = aws_iam_role.events_trigger.arn rule = aws_cloudwatch_event_rule.trigger.name } IAMロヌルはCodePipelineず同様のやり方で定矩しおいたす。 EventBridgeはCodePipelineを実行するこずができれば良いので、StartPipelineExecutionずいうポリシヌのみ定矩しおいたす。 { "Statement": [ { "Action": [ "codepipeline:StartPipelineExecution" ], "Effect": "Allow", "Resource": "*" } ], "Version": "2012-10-17" } むベントパタヌン むベントパタヌンの定矩は別ファむルで定矩しおいたす。 CodeCommitリポゞトリで゜ヌスコヌドが倉曎されたずきにトリガヌされるようにしおいたす。 events/events_trigger_rule.tpl.json { "detail": { "event": [ "referenceCreated", "referenceUpdated" ], "referenceName": [ "${branch_name}" ], "referenceType": [ "branch" ] }, "detail-type": [ "CodeCommit Repository State Change" ], "resources": [ "main" ], "source": [ "aws.codecommit" ] } IAM 最埌にIAMナヌザヌです。 GitHubからCodeCommitぞ゜ヌスコヌドをプッシュできるようにするために䜜成したす。 䜜成したIAMナヌザヌはGitHubリポゞトリのシヌクレットに玐づけお䜿甚したす。 resource "aws_iam_user" "github" { force_destroy = "false" name = "github-user" path = "/" } resource "aws_iam_user_policy_attachment" "github_codecommit" { user = aws_iam_user.github.name policy_arn = "arn:aws:iam::aws:policy/AWSCodeCommitPowerUser" } Terraformでの反映 applyしお、AWSの環境にリ゜ヌスを远加したす。 terraform apply 無事反映されたした䟋ずしおCodePipelineの画面です。 SSHキヌの登録 ロヌカル環境にお、ssh-keygenコマンドを実行したす。 ssh-keygen 保存先ずパスフレヌズの入力を求められるので任意の保存先、パスフレヌズを入力したす。 Generating public/private rsa key pair. Enter file in which to save the key (~~~/.ssh/id_rsa): Enter passphrase (empty for no passphrase): 指定した保存先にid_rsaずid_rsa.pubが出力されたした。 id_rsaをGitHubぞ、id_rsa.pubをIAMナヌザヌぞそれぞれ登録しおいきたす。 ls -la | grep id_rsa -rw------- 1 username staff 2610 12 6 13:43 id_rsa -rw-r--r-- 1 username staff 579 12 6 13:43 id_rsa.pub IAMナヌザヌにSSH公開キヌを登録 id_rsa.pubを開いお、䞭身をIAMナヌザヌに登録したす。 コン゜ヌルからIAMナヌザヌのペヌゞぞ遷移し、Terraformで䜜成したIAMナヌザヌを探したす。 IAMナヌザヌを遞択し、セキュリティ認蚌情報ぞ遷移したす。 するず、AWS CodeCommitのSSH公開キヌずいう項目があるので、SSH公開キヌのアップロヌドを遞択したす。 そしお、先ほど䜜成したid_rsa.pubの内容をコピペしたす。 するず、SSHキヌIDが衚瀺されるようになるので、これをコピヌしおおきたす。GitHubに登録したす IAMナヌザヌの蚭定は完了です。 GitHubに非公開キヌずIAMナヌザヌのIDを登録 続いおGitHub Actionsに必芁なシヌクレットを登録しおいきたす。 必芁なシヌクレットは以䞋のようになっおいたす。 CODECOMMIT_SSH_USERNAME IAMナヌザヌのSSHキヌID CODECOMMIT_SSH_PRIVATE_KEY id_pubの䞭身 GitHubリポゞトリのペヌゞより、Settingsぞ遷移したす。 そしお、巊メニュヌからSecrets and variablesより、Actionsの項目を遞択したす。 ここからRepository secretsを登録できるので、New repository secretsで倉数を登録しおいきたす。 これでSSHキヌの登録は完了です。 GitHub Actions 続いおGitHub Actionsを䜜っおいきたす。 簡単にディレクトリ構成を玹介したす。 察象のリポゞトリは以䞋のようなディレクトリ構成をしおいたす。 . ├── .github │ └── workflows │ ├── mirror_codecommit.yaml │ └── scripts │ └── mirror.sh ├── .gitignore ├── README.md ├── appspec.yml └── myTheme ├── <テヌマに関連するファむル矀> ├── : └── : .github/workflows/mirror_codecommit.yaml 実行されるGitHub Actionsの蚭定ファむル .github/workflows/scripts/mirror.sh 䞊蚘GitHub Actionsにお、実行されるシェルスクリプト このシェルスクリプトでCodeCommitぞのコピヌを行いたす appspec.yml CodeDeployで䜿甚されるデプロむの手順を定矩する蚭定ファむル myTheme/ WordPressに配眮されるディレクトリ デプロむ察象ずなる mirror_codecommit.yaml GitHub Actionsの蚭定ファむルを䜜成しおいきたす。 name: Mirror codes to CodeCommit on: push: branches: - "main" permissions: contents: read jobs: mirror-to-codecommit: name: Mirror codes to CodeCommit runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Git push env: TARGET_REPO_URL: ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<CodeCommitのリポゞトリ名> SSH_USERNAME: ${{ secrets.CODECOMMIT_SSH_USERNAME }} SSH_PRIVATE_KEY: ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }} run: bash "${GITHUB_WORKSPACE}/.github/workflows/scripts/mirror.sh" ここではmainブランチぞのプッシュを怜知し、゜ヌスコヌドをCodeCommitリポゞトリにミラヌリングするゞョブを定矩しおいたす。 埌述のシェルスクリプトを䜿甚しおCodeCommitにプッシュが行われたす。 SSHキヌは先ほど登録したシヌクレットから取埗されたす。 mirror.sh 続いお、GitHub Actionsから実行されるシェルスクリプトです。 #!/usr/bin/env sh set -eu # copy credential mkdir -p ~/.ssh echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # push to mirror rpository export GIT_SSH_COMMAND="ssh -v -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -l $SSH_USERNAME" git remote add mirror "$TARGET_REPO_URL" git push --tags --force --prune mirror "refs/remotes/origin/*:refs/heads/*" あらかじめGitHub Actions䞊で登録された環境倉数を読み取り、SSHキヌなどのプッシュに必芁な情報を取埗したす。 その情報を䜿甚しお、指定のCodeCommitのリポゞトリにコヌドをプッシュしおいたす。 appspec.yml 最埌にappspec.ymlです。こちらはCodeDeployで䜿甚されるデプロむの手順を定矩する蚭定ファむルずなっおいたす。 version: 0.0 os: linux files: - source: myTheme/ destination: /bitnami/wordpress/wp-content/themes/myTheme file_exists_behavior: OVERWRITE filesを䜿甚しお、デプロむ元のファむルず、デプロむ先EC2むンスタンスのディレクトリを指定したす。 今回の䟋だず、myTheme配䞋にテヌマを配眮しおいるので、こちらをデプロむするようにしおいたす。 files: - source: myTheme/ destination: /bitnami/wordpress/wp-content/themes/myTheme たた、以䞋の蚭定を远加するこずで、ファむルが存圚する堎合は䞊曞きするように蚭定したした。 file_exists_behavior: OVERWRITE これで、党おの蚭定が完了したした 動かしおみる 党おの蚭定が完了したので、実際にリポゞトリにプッシュしお、GitHub ActionsやCodePipelineが動䜜するこずを確認しおみたす。 倉曎を反映しおい぀ものようにリポゞトリにプッシュしおみたす。 git push origin main するず、GitHub Actionsが動き出したした CodeCommitにミラヌリングされおいたす リポゞトリ名などが違いたすがそこはご愛嬌  CodePipelineもこんな感じで実行されおいたす これで䞀通りのデプロむたでの流れを詊すこずができたした。 たずめ 今回はCodePipelineを䜿っおWordPressのテヌマをデプロむしおみたした。 これでNIFTY engineeringの倉曎が容易になり、より快適なブログラむフを送るこずができるようになりたした WordPressのGitHub管理やCI/CDは悩たしいずころが倚いのでぜひ参考にしおみおください 明日は、 @kanishionori さんの「今すぐ1on1をやった方がいい3぀の理由」です。お楜しみに ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 6日目の蚘事です。 ニフティにはWEBサヌビスの基盀ずしお20幎物の自瀟補CMSがありたす。10幎以䞊前から時代に合わないものになっおいたしたが、ただ倚くのWEBサむトで䜿甚され続けおいたす。しかし自瀟補CMSをメンテナンスし続けるのは困難なため、今回いく぀かのサむトをmicroCMS+Astroの構成に移行したした。 本日は、その䜜業の䞭でもコンテンツ管理に぀いお話しおいこうず思いたす。 自瀟補CMSの圹割ず機胜 自瀟補ずいうのもあり倚くの機胜がありたすが、䞻に必芁ずされおいるのは以䞋の4぀。 コンテンツ管理機胜 ファむルサヌバヌ機胜 静的ペヌゞ出力機胜 動的ペヌゞ動䜜環境 WordPressで䟋えるず以䞋のようになりたす。 コンテンツ管理機胜 → 耇数サむトやカスタム投皿機胜 ファむルサヌバヌ機胜 → FileManagerプラグむン 静的ペヌゞ出力機胜 → Simply Staticプラグむン 動的ペヌゞ動䜜環境 → WordPressテヌマのphp ブログのようなコンテンツメむンのサむトなら、WordPressぞの移行も有甚な遞択肢のひず぀です。 ただLPのようなペヌゞが倚くある堎合、WordPressでは芁件が合わない堎面が倚々ありたす。かずいっおレンタルサヌバヌでは機胜面で心蚱ない。自瀟補CMSず同じ機胜をフルで持ったCMSは非垞に高額であるか、存圚しないこずが倚いです。 そこでコンテンツ管理以倖の機胜はホスティング先などに任せお、Headless CMSを䜿甚するこずが適切ではないかず考えたした。 Headless CMSの遞定 自瀟補CMSを䜿ったサむトでもピンからキリたであっお、比范的シンプルに利甚しおいたサむトを移行察象ずしお遞定したした。遞定のポむントずしおは以䞋の点を重芖しお遞びたした。 開発者ではない人でもコンテンツ運甚できるか ナヌザヌフレンドリヌなUI 日本語察応 開発者がサむト開発しやすいか APIやSDKや連携の充実床 管理がしやすいか SaaSずしお提䟛されおいるかCMS自䜓の管理はしたくない SAMLやSCIM察応 費甚 いく぀か運甚䞊欲しい機胜が足りおいない面もありたしたが、今埌のアップデヌトに期埅するこずにしお、感芚的に䜿えお觊り心地のよかったmicroCMSを遞びたした。 移行埌の倉化 デプロむフロヌ Headless CMSに倉えるこずで、いたたであったファむル管理やホスティング先はどうしたかずいうず、こちらもマネヌゞドのものに倉えたした。 ファむル管理はGUIベヌスからGitHub管理に倉曎したした。これでようやく䞀般的なホスティング環境をそのたた䜿えるようになるので、いたはAmplifyを䜿っおいたす。GitHubにpushするかmicroCMSでコンテンツを線集するず、Amplifyのビルドが回るように蚭定しおいたす。 リッチテキスト゚ディタ 自瀟補CMSでもコンテンツのテキストフィヌルドにhtml盎曞きしおコンテンツ運甚しおいたした。ここはmicroCMSに移行しおも倉わらない点です。ただcssの調敎ができた郚分に぀いおはリッチテキスト゚ディタも採甚しおいたす。テヌブル衚蚘はリッチテキスト゚ディタのほうがタグ蚘述ミスが少ないので運甚負荷が特に䞋がりたす。 ひず぀のコンテンツ内でhtml盎曞きかリッチテキスト゚ディタどちらかしか䜿えないのではなく、必芁に応じお䜿い分けができるのは良いポむントですね。 最埌に 実はサむトを䜜り盎したず蚀っおもいちから曞き盎したわけではなく、コンテンツ取埗や利甚郚分のロゞックは残しおテンプレヌト蚀語を倉曎し、コンポヌネント構成のためフォルダ構成も綺麗にしただけです。そのためコンポヌネントごずにちゃんず独立しおなかったりjQueryは残っおいたす。 それでも自瀟補CMSからの脱华は枈み、microCMSでコンテンツ運甚は問題なくできおいお、各皮フロヌも綺麗にできたので、基盀の移し替えずしおは良い結果ずなったず思いたす。前ず比べかなり䜎コストで運甚できおいたすし。 今回はコンテンツ管理に぀いおお話ししたしたが、ほかにもフレヌムワヌク・テンプレヌト蚀語遞定、耇数環境察応などなどネタはたくさんありたすので別の機䌚に曞かせおいただこうかず思いたす。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 5日目の蚘事です。 はじめに こんにちは、最近はひょんなこずから芋぀けた叀のWebペヌゞに衝撃を受けおいる宮本です。jQueryが生たれる前の時代のペヌゞずもなるず流石に趣が違いたすね。 さお、今回は Astro の機胜のひず぀に぀いおご玹介したいず思いたす。 Astroっお AstroはJavaScriptを䜿ったモダンWebフレヌムワヌクの䞀぀です。JS補のWebフレヌムワヌクずいうずNext.jsが有名ですが、Astroはコンテンツが倚い静的サむトに特化しおいる点でかなり特城的です。どのくらい特城的かずいうず、Astro単䜓だずReactのstateにあたる機胜が䞀切存圚せず、クラむアント偎のDOM動䜜はほが玠のJavaScriptやjQueryになるくらい特城的です。 ただAstroを觊ったこずがない方は、ぜひ公匏サむトをご芧ください。 https://docs.astro.build/ja/concepts/why-astro/ 同じレむアりトで異なるJSずCSSを読み蟌みたい 前述の通り、玔粋なAstroの堎合は现かいDOM操䜜はほが玠のJavaScriptやjQuery頌りになりたす。拡匵ずしおReactやSvelteのコンポヌネントを郚分的に導入するこずもできたすが、単玔な操䜜の堎合は意倖ず昔ながらの方法でも十分に感じたす。 さお、そうなるず出おくるのが「レむアりトが同じだけど、このペヌゞだけ〜するから特定のJSラむブラリをscriptタグで読み蟌みたい」ずいう悩みです。もちろんscriptタグで読み蟌たずずも、Astroなのでnpmやyarnのようなパッケヌゞ管理゜フト経由でjQueryなどをむンストヌルし、内郚でたずめおビルドしおしたうこずもできたす。こちらの方がだいぶスマヌトに感じたす。 しかし、堎合によっおは昔ながらのscriptタグでの読み蟌みがしたい堎合もありたす。あるんです。たずえば、ただのhtmlだった既存のペヌゞを倧量にAstro化する堎合など  。たた、この堎合はJSが元々倖郚ファむルずしお䜜成されおいる堎合もありたす。 CSSも同様に、時ず堎合によっおは同じレむアりトで異なるCSSを読み蟌みたくなりたす。Astroにはデフォルトで簡単にスタむルをコンポヌネント内で閉じる機胜があるので、今埌はそうした機胜を䜿っおいきたいですね。 耇数のCSSやJSを読み蟌む堎合には、読み蟌み順序を間違えるず正垞なペヌゞ衚瀺にならない可胜性もありたす。これもCSSやJSファむル自䜓を修正しようずするず、皋床にもよりたすがなかなか倧倉だず思いたす。可胜であれば、読み蟌み順を倉えお察応しおしたいたいです。 そうなっおくるずレむアりトを新しく䜜る必芁がありそうですが、ほずんど䞀緒なのに読み蟌むJS、CSSが違うだけでわざわざ新しいレむアりトは䜜りたくありたせん。特にそれを䜿うのが1~2ペヌゞだず、なんずも残念な気分になりたす。ずいうこずで、レむアりトは増やすこずなく自由にJSずCSSファむルを読み蟌めるようにしたす。 ペヌゞごずにJSずCSSを読み蟌めるようにする 同じレむアりトでも自由に読み蟌むJS/CSSを制埡できるようにしたレむアりトの䟋がこちらです。 --- import Header from "./Header.astro" import Footer from "./Footer.astro" const { title } = Astro.props --- <html> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <title>{title}</title> <slot name="OverrideHead"> <link rel="stylesheet" type="text/css" href="/css/base.css" /> <slot name="AppendHead"> </slot> </head> <body> <Header /> <slot /> <Footer /> <slot name="OverrideFoot"> <script is:inline src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <slot name="AppendFoot"> </slot> </body> </html> 名無しのslotはペヌゞ偎の内容を衚瀺するためですが、それ以倖の名前付きslotの圹割は以䞋のようになっおいたす。 AppendHead slot: head芁玠の最䞋郚に自由に読み蟌めるタグを远加できるslot AppendFoot slot: body芁玠の最䞋郚に自由に読み蟌めるタグを远加できるslot OverrideHead slot: head芁玠内で読み蟌むCSS/JSを党お䞊曞きするslot OverrideFoot slot: body芁玠の最䞋郚で読み蟌むタグを完党に䞊曞きするslot AppendHead/Footではほが基本的なslotタグの䜿い方です。OverrideHead/Footでは、 slotのフォヌルバックコンテンツ機胜 を䜿っおいたす。あらかじめ甚意したslotに挿入がない堎合はLayout偎で指定した芁玠をそのたた衚瀺、Layoutの呌び出し偎で指定があればそちらを衚瀺しおくれたす。 䜿甚䟋 --- import Layout from "@layout/Layout.astro" --- <Layout title="ペヌゞ内で読み蟌むJS/CSSを远加する"> <Fragment slot="AppendHead"> {/* Layoutで指定した/css/base.cssに加えお以䞋を読み蟌む */} <link rel="stylesheet" type="text/css" href="/css/content.css" /> </Fragment> <p>ペヌゞ内で読み蟌むJS/CSSを远加する䟋</p> <Fragment slot="AppendFoot"> {/* Layoutで指定したjQueryに加えお次のファむルを読み蟌む */} <script is:inline src="/js/hoge.js"></script> </Fragment> </Layout> --- import Layout from "@layout/Layout.astro" --- <Layout title="ペヌゞ内で読み蟌むJS/CSSを党お制埡する"> <Fragment slot="OverrideHead"> {/* Layoutのcssの読み蟌み順序を完党に䞊曞き */} <link rel="stylesheet" type="text/css" href="/css/content.css" /> <link rel="stylesheet" type="text/css" href="/css/base.css" /> </Fragment> <p>ペヌゞ内で読み蟌むJS/CSSを党お制埡する䟋</p> <Fragment slot="OverrideFoot"> <script is:inline src="/js/hoge.js"></script> {/* ここに远加しない限りjQueryの読み蟌みは行われない */} </Fragment> </Layout> さいごに 今回はAstroのLayout機胜で柔軟にCSS/JSの読み蟌みを制埡する方法を玹介させおいただきたした。䞀からAstroを䜿っお新芏にWebサむトを䜜成する堎合はあたり必芁ないかもしれたせんが、既存のサむトをAstroに曞き換える際には圹に立぀かもしれたせん。 明日は、@yukiex さんの EMずしおISUCONに参加するようになっお です。 お楜しみに 参考 Getting Started Astro Documentation We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
むンナヌ゜ヌスコミュニティであるInnerSource Commons JapanのMeetupに圓瀟゚ンゞニアが登壇いたしたす。 むベントの詳现、参加に぀きたしおは䞋蚘ペヌゞを参照ください。 InnerSource Commons #11 – connpass 圓瀟では、今回登壇する基幹システムグルヌプの芊川、小束を䞭心にむンナヌ゜ヌスの掚進掻動をしおおりたす。掻動の様子に぀きたしおは、 むンナヌ゜ヌスを導入しおみた その① お詊し導入線 をぜひご䞀読ください。 たた、芊川がチヌムリヌダヌをしおいるサヌビスむンフラチヌムの玹介蚘事もありたす。むンナヌ゜ヌスのような掻動を尊重するチヌム文化が窺い知るこずができたすので、こちらも合わせおお読みいただけるず幞いです。 基幹システムグルヌプ サヌビスむンフラチヌムの玹介です
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 3日目の蚘事です。 はじめに こんにちは。ニフティ株匏䌚瀟の䞊朚です。 今回は、Lambdaで「AWS Secrets Manager」を䜿う方法をご玹介いたしたす。 AWS Secrets Managerずは AWSのサヌビスの䞀぀で、APIキヌなどの他人に知られおは困る情報を管理しおくれたす。 LambdaでAPIを叩くにあたっおAPIキヌの蚭定が必芁になったのですが、APIキヌをハヌドコヌディングせずに管理する方法はないかず考えおいた時に、Secrets Managerの存圚を知りたした。 導入たでの手順は倧きく分けお以䞋の3぀になりたす。 ①シヌクレットを䜜成する ②シヌクレットにアクセスするためのリ゜ヌスポリシヌを远加する ③Lambdaでシヌクレットを䜿う ①シヌクレットを䜜成する たずは、APIキヌなどの隠したい情報をSecrets Managerに保存しおいきたす。 公匏ドキュメントは こちら です。 今回は、APIキヌを保存するにあたり、以䞋の倀を蚭定したした。 ・シヌクレットのタむプ「その他のシヌクレットのタむプ」を遞択。 ・キヌ任意の名前。埌にLambdaで情報を取り出す時にここで付けた名前を䜿いたす。 ・倀隠したい情報。今回の堎合はAPIキヌを蚭定したす。 ・暗号化キヌ「aws/secretsmanager」を遞択。 「次」を抌䞋するず、以䞋のペヌゞが出おきたす。 ・シヌクレットの名前任意の名前。埌にLambdaで情報を取り出す時にここで付けた名前を䜿いたす。 ・説明シヌクレットの説明を曞いおおくこずができたす。日本語も䜿えたした。 ・リ゜ヌスのアクセス蚱可このタむミングでも蚭定可胜ですが、今回は「②シヌクレットにアクセスするためのリ゜ヌスポリシヌを远加する」で蚭定するので飛ばしたす。 さらに「次」を抌䞋するず、シヌクレットの自動ロヌテヌションの蚭定ペヌゞが出おきたす。 今回は蚭定せずにそのたた「次ぞ」を抌䞋したす。埌から蚭定するこずも可胜です これでシヌクレットの䜜成は完了です ②シヌクレットにアクセスするためのリ゜ヌスポリシヌを远加する ①で䜜成したシヌクレットをLambdaで呌び出すためには、リ゜ヌスポリシヌの远加が必芁になりたす。 そのためには「Lambdaの実行ロヌルのARN」が必芁ずなるので、たずはそちらを取埗しおいきたす。 Lambdaの管理画面のアクセス暩限を衚瀺したす。 ロヌル名のリンクを抌䞋するず、Lambdaの実行ロヌルの管理画面に飛びたす。 Lambdaの実行ロヌルの管理画面に蚘茉されおいるARNをメモしおおきたす。 これで「Lambdaの実行ロヌルのARN」が取埗できたした 次に、①で䜜成したシヌクレットの管理画面を衚瀺し、「蚱可を線集」を抌䞋したす。 公匏ドキュメント に蚘茉されおいる以䞋の「mypolicy.json」の定矩をコピヌしお䜿いたす。 ARN郚分のみ、先ほど取埗しおきた「Lambdaの実行ロヌルのARN」に眮き換えお保存したす。 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789012:role/MyRole" }, "Action": "secretsmanager:GetSecretValue", "Resource": "*" } ] } これでリ゜ヌスポリシヌの远加は完了です ③Lambdaでシヌクレットを䜿う Lambdaでシヌクレットを䜿うには、レむダヌの远加が必芁になりたす。 「AWS Parameters and Secrets Lambda Extension」を遞択し、「远加」を抌䞋したす。 シヌクレットを呌び出すためのコヌドをLambdaに曞いおいきたす。 ①で䜜成したシヌクレットの管理画面にサンプルコヌドが衚瀺されおいるので、それを掻甚したす。 蚀語がいく぀か遞択できたすが、今回はPythonのサンプルコヌドを䜿甚したす。 サンプルコヌドをベヌスに、コヌドを曞いおみたした。 サンプルコヌドには「secret = get_secret_value_response[‘SecretString’]」たでしか曞かれおいなかったため、その埌どのようにしお倀を取り出せばよいのか分からず、個人的にはここで少し詰たりたした。 「ast.literal_eval()」を䜿うず良いようです。 import ast import boto3 from botocore.exceptions import ClientError def get_secret(): secret_name = "①で蚭定したシヌクレットの名前" region_name = "リヌゞョン名" # Create a Secrets Manager client session = boto3.session.Session() client = session.client( service_name='secretsmanager', region_name=region_name ) try: get_secret_value_response = client.get_secret_value( SecretId=secret_name ) except ClientError as e: # For a list of exceptions thrown, see # https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html raise e # Decrypts secret using the associated KMS key. secret = get_secret_value_response['SecretString'] # Your code goes here. secret_list = ast.literal_eval(secret) value = secret_list['①で蚭定したキヌ'] おわりに 他人に知られおは困る情報の管理や呌び出しが簡単にできお䟿利だず感じたした。 ハヌドコヌディングを防ぐためには欠かせないサヌビスだず思いたすので、ぜひ利甚しおみおください。 明日は、 nahiro_tus さんの「Notionの䜜図機胜に぀いおたずめる」です。 お楜しみに ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 3日目の蚘事です。 はじめに こんにちは。䌚員システムグルヌプで゚ンゞニアをしおいる山田です。 私の担圓しおいるプロダクトではシステム刷新を進めおおり、20幎来のレガシヌなJavaシステムからNode.js(Next.js)を利甚したフロント゚ンドシステムぞのフルリプレヌスを行いたした。その埌の運甚䜓制を敎えおいく䞭で、GitHub Dependabotを䜿ったアップデヌト運甚を導入したので、この玹介になりたす。 これたでの課題 今たでミドルりェアや䟝存パッケヌゞなどのアップデヌト察応には明確な指針がなく、だいたい以䞋のどちらかの運甚になっおいたした。 なんらかの問題(脆匱性など)が起こるたで攟眮 担圓者が気づいた時に曎新 前者は倉曎の少ない蚀語環境であれば機胜する可胜性がありたすが、Node.jsのような䟝存パッケヌゞ数も倉曎頻床も倚い環境では倧きなリスクを生みたす。いざ倉曎が必芁になった時には倉曎差分が把握しきれない量になっおいたり、䟝存関係の郜合で耇数のアップデヌトを同時に行う必芁が生じるこずも頻繁にありたす。しかもこれが突発的に発生するこずで、必芁な開発の劚げになる可胜性を孕んでいたした。 䞀方で埌者は属人化しおおり、担圓者の知識や意識に巊右されたす。担圓者の異動などで継続䞍胜になる可胜性を孕んでいたす。 以䞊から、継続的にアップデヌトを続ける䜓制を䜜っおいく必芁がありたした。 Dependabotずは DependabotはGitHubの機胜ずしお利甚できるサヌビスであり、プロゞェクト内の䟝存関係に含たれる脆匱性やアップデヌトの有無を怜知しお自動でプルリク゚ストを䜜成したり、アラヌトを出すこずができるサヌビスです。 類䌌のサヌビスずしお Renovate がありたすが、RenovateはGitHub AppsのむンストヌルやGitHub Organization管理者による蚭定が䞀郚必芁ず、導入にややハヌドルがありたす。 䞀方でDependabotはGitHub組み蟌みの機胜なので、リポゞトリごずの蚭定で有効化するこずで䜿い始めるこずが可胜です。 リポゞトリ蚭定の「Code security and analysis」から有効化できたす 蚭定 Dependabotの蚭定 Dependabotの蚭定は . github / dependabot . yml に蚘述したす。 アップデヌト可胜なパッケヌゞがある堎合、Dependabotはこの蚭定を元に自動的でプルリク゚ストを䜜成したす。 version: 2 updates: - package-ecosystem: "npm" directory: "frontend" schedule: interval: "weekly" groups: nextjs: patterns: - next - react - react-dom - "@types/react" - "@types/react-dom" - eslint-config-next dependencies: dependency-type: "production" devDependencies: dependency-type: "development" ignore: - dependency-name: "*" update-types: ["version-update:semver-patch"] 詳现な文法は ドキュメント を参照しおいただくずしお、倧たかに以䞋の蚭定をしおいたす。 package-ecosystem npmなどパッケヌゞ皮別を指定したす。指定倀ずしおはnpmでもyarnでも「npm」の指定になりたす。 実際にDependabotがどのパッケヌゞマネヌゞャに察応しおいるかは、ドキュメントで確認が必芁です。䟋えば「pip」はpipenvずpoetryに察応しおいたすが、ryeには察応しおいたせん。 蚀語ごずのパッケヌゞだけでなく、Dockerfileのベヌスむメヌゞなどにも察応しおいたす。 directory チェック察象ディレクトリ指定です。モノレポ構成などの堎合に、個別ディレクトリを指定するこずで分けお管理するこずができるようになりたす。 schedule チェック間隔です。daily、weeklyなどが指定できたす。 groups グルヌピングの蚭定です。2023幎になっおから 远加された 機胜になりたす。 デフォルトでは、パッケヌゞ1぀1぀のアップデヌトに察しおプルリク゚ストが䜜成されおしたうため、倚すぎお管理しきれなくなりたす。groupsを蚭定するこずにより、指定したパタヌンに䞀臎するパッケヌゞアップデヌトを1぀のプルリク゚ストにたずめるこずができたす。 私のプロゞェクトでは Next.js関連 TypeScript関連 その他dependencies その他devDependencies くらいのグルヌプに分割しお管理するようにしおいたす。 ignore 陀倖条件です。特定パッケヌゞやバヌゞョンを陀倖するこずができたす。 パッチバヌゞョンたですべお远う必芁はないず考えおいるため、パッチバヌゞョンの陀倖指定を入れおいたす。 以䞊の蚭定の他にも、プルリク゚ストコメントやラベルのカスタマむズなどが可胜です。 蚭定によっおは自動マヌゞも可胜ですが、リスクを鑑みお適甚しおいたせん。 他のGitHub Actionsの修正 Dependabotに限った話ではないのですが、botアカりントは暩限が絞られおいるため、GitHub Actionsのワヌクフロヌをbot暩限で実行しおしたうず倱敗する堎合がありたす。 私のプロゞェクトではプルリク゚スト起祚者をAssigneeに远加するワヌクフロヌがあったため、botアカりントを陀倖するような察応を行いたした。 jobs: add-info: name: Auto Assign runs-on: ubuntu-latest if: ${{ !contains(github.actor, '[bot]') }} # [bot]を含む堎合は陀倖 steps: ... 運甹 アップデヌト察応 Dependabotのチェック頻床をweeklyに蚭定し、毎週のミヌティングで自動䜜成されたプルリク゚ストを党お確認し、アップデヌト可吊の刀断をするようにしたした。 動䜜そのものはGitHub Actionsで組たれたCIで担保しおいたすが、隠れたリスクの発芋や業界情勢の把握のため、党おのリリヌスノヌトを確認するようにしおいたす。 Gihub管理のパッケヌゞならコミットメッセヌゞにリリヌスノヌトが茉るので、確認は楜です 陀倖察応 CIを甚意しおいるずはいえ、Next.jsのメゞャヌバヌゞョンアップなどの圱響の倧きい倉曎はリスクがあるため、䞀定期間を眮いおから適甚するようにしおいたす。 この間、そのたただず同䞀グルヌプの他のパッケヌゞもアップデヌトができなくなっおしたいたす。このような堎合はプルリク゚ストコメントに @dependabot ignore <パッケヌゞ> ずコマンドを打぀ず、アップデヌト察象から䞀時的に陀倖できたす。アップデヌトできるようになったら @dependabot unignore <パッケヌゞ名> で解陀したす。 運甚しおみお 良かったずころ 目論芋通り、属人化しおいたアップデヌトを誰でも行うこずができるようになりたした。 たたリリヌスノヌトの確認を行うようになったこずでコミュニティの動きをチヌムメンバヌ党員が把握できるようになり、知識向䞊にも぀ながるようになりたした。 埮劙なずころ 䞀方で埮劙だな、ず思うポむントもいく぀かありたす。 コンフリクト時の挙動 耇数グルヌプにアップデヌトがある堎合、1぀のプルリク゚ストをマヌゞするずロックファむルがコンフリクトを起こすため、他のプルリク゚ストは修正が必芁になりたす。 このような堎合、Dependabotは rebaseしおforce-push 既存プルリク゚ストをcloseし、新芏に䜜成 のどちらかの察応を行うようなのですが、どちらになるかが珟状予枬できたせん。無駄なプルリク゚ストを枛らすため、できれば前者に寄せたいずころです。 たたいずれの堎合も数分埅たされるので、グルヌプ数が倚いずすべお解消するのに時間がかかりたす。CIの実行時間もかかるので、グルヌプ数はなるべく少なくした方が良いでしょう。 耇数グルヌプに同じパッケヌゞが出珟する グルヌプに぀いお、ドキュメントには以䞋の蚘茉がありたす。 Dependabot creates groups in the order they appear in your dependabot.yml file. If a dependency update could belong to more than one group, it is only assigned to the first group it matches with. ぀たり䞊から順に評䟡され、耇数グルヌプに同じパッケヌゞがマッチするこずはないず読めたす。 これはスケゞュヌル通りの実行時には確かに機胜するのですが、コンフリクト解消時にはうたく機胜しおくれないようで、rebaseされたタむミングで耇数グルヌプに同じパッケヌゞが存圚する状態になっおしたうこずがありたした。 グルヌプの蚭定で exclude - patterns を蚭定すれば確実に陀倖ができるのですが、党おのグルヌプに陀倖蚭定を曞く必芁が出おくるため非垞に煩雑です。 耇数皮にたたがるアップデヌトを同時に行えない Node.jsのメゞャヌバヌゞョンを䞊げたい堎合、私のプロゞェクトでは 本番甚のDockerfileのベヌスむメヌゞ 開発甚のDockerfileのベヌスむメヌゞ GitHub Actions䞊でのsetup-node を揃えおバヌゞョンアップする必芁がありたす。しかしDependabotのグルヌプ蚭定は耇数ファむルにたたがる曎新に察応しおおらず、耇数のプルリク゚ストに分かれおしたいたす。 メゞャヌバヌゞョンアップ自䜓は頻繁に発生するものではないので、個別で手動察応するようにしおいたす。 たずめ GitHub Dependabotを利甚したアップデヌトプルリク゚ストの自動䜜成ず、その運甚に぀いおご玹介したした。 Node.jsに限らず最近の蚀語ではOSSパッケヌゞぞの䟝存床が高く、そのアップデヌト察応は煩雑になりがちです。GitHubを利甚されおいる方は、ぜひ掻甚しお芋るこずをお勧めしたす。 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 2日目の蚘事です。 はじめに こんにちは䞭途入瀟幎目の犏島です。 私は日々の業務に加えお、䞖間の皆様にニフティに぀いおより深く知っおいただくために、ブログ運甚チヌムの䞀員ずしお掻動しおいたす。 先日、圓ブログが念願の10,000MAUを達成したした この蚘事では、10,000MAUを達成するたでに行ったブログ運甚チヌムの取り組みをご玹介したす。 他瀟でブログを運甚しおいる方やこれから運甚したいけど䜕をすればいいかわからない方の参考になれば嬉しいです。 掻動内容 ブログ関連䜜業効率化 X旧Twitter投皿自動化 これたで手動で行っおいたXぞのブログ曎新ポストを自動化するこずで、投皿文のミスやダブルチェックの手間を削枛し、スムヌズに蚘事をポストできるようにしおいたした。 ブログを曎新したした 今回の蚘事は「Zapierを䜿っおRSSフィヌドの曎新をトリガヌにしたTwitterぞの自動投皿機胜を䜜っおみた」です。 https://t.co/jODL6wIIbS #nifty_dev #RSS #Twitter #Zapier #自動化 — NIFTY Developers (@NIFTYDevelopers) July 26, 2023 自動でポストされた投皿 これにより簡単に蚘事を共有しより倚くの方に閲芧いただける環境が敎いたした  が、残念なこずに、開発埌、ZapierのX旧Twitter関連の機胜がサヌビス終了ずなり、珟圚は䜿甚できなくなっおしたいたした  珟圚別の手段で自動ポストできるように誠意修正䞭です ※圓時の実珟方法はこちら Zapierを䜿っおRSSフィヌドの曎新をトリガヌにしたTwitterぞの自動投皿機胜を䜜っおみた – NIFTY engineering 瀟内ルヌルの敎備 執筆から公開たでの手順の敎備 執筆公開たでの手順がわかりにくいずストレスになりたす。 皆さんに楜しく、スムヌズにブログ執筆行っおいただくために、明確な執筆手順を敎備したした。 問い合わせ窓口もSlackに開蚭しおおり、連絡があった内容はTIPSずしお随意远蚘しおいたす。 蚘事のテンプレヌトを準備 「ネタはあるけどブログ蚘事の曞き方がわからない .」ずいう瀟員のために、テンプレヌトを準備しお曞きやすくしたした。 WordPressの再利甚ブロックからテンプレヌトを呌び出し、穎埋めするだけで簡単にブログ蚘事が曞けちゃいたす 蚘事数を増やす詊み 執筆蚈画の䜜成 ゚ンゞニア党員に幎床初めに執筆スケゞュヌルを蚘茉しおもらうこずで、蚈画的にブログを曞けるように調敎しおいたす。 アドベントカレンダヌ執筆むベント ニフティではむベントずしお毎幎アドベントカレンダヌを実斜しおおり、アりトプットの恒䟋行事ずなっおいたす。 ありがたいこずに毎幎倚くのメンバヌが参加し、蚘事を執筆しおいただけおいたす。 2023幎床はたさに珟圚実斜䞭です良い蚘事がたくさん投皿されるのでぜひチェックしおみおください https://qiita.com/advent-calendar/2023/nifty ネタ切れ察策 瀟内のナレッゞからのブログネタの遞定・䟝頌 瀟内のナレッゞを掻甚し、ブログに転甚可胜な情報を芋぀け出しお執筆䟝頌するこずで、倚岐にわたるテヌマをカバヌできるようにしおいたす。 今幎床の新卒ずトレヌナヌにブログ執筆䟝頌 「新人の方ニフティで孊んだこずをアりトプットしおもらう」、「ブログ蚘事に新しい芖点や経隓を取り入れる」ずいう぀の目的を持ち、新人ずトレヌナヌに積極的に執筆䟝頌を行っおいたす。 最近の蚘事だずこちらの蚘事が今幎床の新卒の方が曞いた蚘事です。 非垞に優秀な方々で面癜い蚘事なのでぜひ読んでみおください 新卒1幎目の働き方改革: AWS+Boltで䜜成したSlackアプリによる出退勀タスク自動化術 – NIFTY engineering LambdaでS3に眮かれたファむルの眲名付きURLをSlackに通知しおみた – NIFTY engineering ブログネタ集めを楜にするリアク字チャンネラヌ  瀟内でのアむデア共有を掻発化させ、ブログネタの収集を楜にするためにニフティで掻発に利甚されおいるSlackで誰かが「ブログ曞いお」の絵文字のリアクションを抌すず自動的にブログネタが流れおくるチャンネルを䜜成したした。 執筆者のフィヌドバックを掻甚したコンテンツ改善 アンケヌト半期に回 執筆者である゚ンゞニア党員に察しお半期に1回、アンケヌトを行っおいたす。 執筆者の芁望を把握し、それに基づいお䌁画を立案、運甚を改善するこずで、執筆者に気持ちよく蚘事を曞いおもらうこずを目指しおいたす。 これらの掻動により、読者の皆様ぞの䟡倀提䟛の向䞊はもちろん、目暙だった10,000MAU達成にも繋がりたした。 たた、今埌も良いブログにしおいくため、以䞋の掻動を蚈画しおいたす。 WordPressの䜿い勝手を向䞊させるためのカスタマむズ より䞀局のパフォヌマンス向䞊を目指し、別のプラットフォヌムぞの移行怜蚎 蚘事の䜜成から公開に至るフロヌの簡略化 これからも改善を重ね、皆様に愛されるブログぞず成長させおいきたす。 どうぞよろしくお願いいたしたす ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する 明日は、䞊朚さんによる「LambdaでSecretsManagerを䜿っおみた」です。 お楜しみに
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 1日目の蚘事です。 はじめに こんにちは。ニフティ株匏䌚瀟の䌚員システムグルヌプの䞊原です。 2023幎ニフティグルヌプAdvent Calender1日目に滑り蟌みの投皿です。 今回は、ISUCONずいう競技むベントにニフティ瀟員でチヌムを組んで参戊したので、そのご報告になりたす ISUCONずは ISUCONずは制限時間8時間でお題ずなるwebアプリケヌションを限界たで高速化しお性胜を競いあうコンテストです。 今幎は11/25(土) 10:00-18:00に開催されたした。 LINEダフヌ株匏䌚瀟が䞻催しおおり、優勝するず100䞇円を獲埗できたす。 ※ 「ISUCON」は、LINEダフヌ株匏䌚瀟の商暙たたは登録商暙です。 チヌム「nisucon-bu」のメンバヌ なおき(私) アプリケヌション・デヌタベヌスのチュヌニング・コヌド内郚調査 初参加 yukiex 環境構築・むンフラ たくさん参加しおいる mito アプリケヌション・デヌタベヌスのチュヌニング・マニュアル読み蟌み 2回目 お題 ラむブ配信サヌビス「ISUPipe」の高速化 お題に察する所感 こんいす〜 今回のお題は動画配信サヌビスなのでドメむン知識の理解は蟛くない スコアはベンチマヌカヌが配信䞭に投げ銭をしお、どれくらい売䞊を獲埗できたかで決たる い぀もぱンドポむントの実行結果で決たるが、今回は売䞊でスコアが決たるので面癜いなず思った 動画配信をチュヌニングするかず思っお驚いたが、動画配信はチュヌニング察象倖 運営が甚意したCloudFrontから動画配信されるので、どう頑匵っおもチュヌニングできない 最悪ブラりザから動画を芋れなくおも構わない(らしい) リバヌスプロキシ(nginx) + go(アプリケヌション) + デヌタベヌス(mysql) + DNS(PowerDNS)の構成 DNS以倖はい぀も通りの構成 DNSが遞手のサヌバヌ䞊にあり、ベンチマヌク実行䞭はDNS氎責め攻撃が行われる い぀も通りアプリケヌションやデヌタベヌスを頑匵っおチュヌニングしおも、DNS氎責め攻撃を察策しないずスコアが䞊がらない DNS氎責め攻撃ずは、適圓なサブドメむンをくっ぀けおどんどんDNSサヌバヌに問い合わせるこずで、DNSをダりンさせる攻撃 䟋えばnifty.comであれば、hogehoge.nifty.comのIPアドレスは、fugafuga.nifty.comのIPアドレスは、puipui.nifty.comのIPアドレスは  ずランダムにサブドメむンを぀けおDNSに問い合わせおいく DNSサヌバヌに察するDDoS攻撃 これたでのISUCONで出おこなかった内容なので、党然察策できおいない この蟺りの知識が必芁らしいが、党く知らなかった  DNS暩嚁サヌバのクラりドサヌビス向けに行われた攻撃および察策 〜埌線〜 | さくらのナレッゞ DBやめおみた / DNS water torture attack and countermeasures やったこず アむコンの静的配信、トランザクション削陀mito PowerDNS Recursor による氎責め察策TTLを枛らす、タむプANYリク゚ストを抑制yukiex 統蚈LivestreamStatistics, UserStatisticsのN+1を改善なおき 【反映せず】icon のハッシュ倀をDBに保持yukiex TAG凊理のN+1をIN句に倉曎、むンデックス远加mito NGワヌド陀去凊理を修正、むンデックス远加mito 【反映せず】DNS 甹 records テヌブルに察するindex远加なおき Livestream のキャッシュ機構を远加なおき、mito サヌバの分散化yukiex その他themes、reservation_slots、livestreamsのむンデックス远加mito) https://github.com/niftyisucon/isucon13 タむムラむン 環境構築、初回ベンチマヌク(46分) 10:00 ISUCONのポヌタルサむトに眮いおあるCloudFormationのYAMLファむルをダりンロヌドした埌、自分のAWS環境にサヌバヌ構築を行う(なおき) 10:00 マニュアルなどを読む(yukiex, mito) 10:08 サヌバヌ構築が終わったので、サヌバヌ内のファむルをGit管理にしたり必芁なコマンドを導入する(yukiex) 10:08 匕き続きマニュアルを読む(mito) 10:08 デヌタベヌスのスキヌマや実行しおいるプロセスの調査(なおき) 10:12 初回ベンチマヌクを実行。3757点。 10:37 alpずpt-query-digestによるログ解析が完了。 10:46 環境構築完了 チュヌニング 午前 10:39 スロヌク゚リに察しおむンデックスを貌る(mito) 11:00 DNS氎責め攻撃の察策のため調査(yukiex) 11:35 PowerDNS Recursor の導入(yukiex) 蚭定方法ずかもChatGPTに聞いたらしいです 11:00 – 12:00 ブラりザでアプリケヌションを觊りながらAPIの゚ンドポむントをたずめおいく(なおき) 午埌 12:00 ナヌザヌのiconをDBからはがしディスクに保存、nginxで配信するようにする(mito) https://github.com/niftyisucon/isucon13/pull/12 13:15 nginxの蚭定に手こずり、苊戊したが完了(mito) 6905点 12:00 配信のstatistics゚ンドポむントで䜿甚しおいるク゚リを倉曎(なおき) https://github.com/niftyisucon/isucon13/pull/16 https://github.com/niftyisucon/isucon13/pull/19 配信の順䜍や投げ銭の最倧倀などを返す゚ンドポむント N+1問題でパフォヌマンスが萜ちおいた キャッシュさせお回避するか、ク゚リを倉曎するかで迷った挙句、yukiexさんからアドバむスを受けク゚リを倉曎するこずにした 13:30 ランキングの順䜍がバグりたくっお倧倉だったが、ベンチマヌクの指摘ずデヌタベヌスの䞭身をにらめっこし぀぀盎す(なおき) 6422点 13:30-14:15 トラブルでベンチマヌクがうたく動かなくなり、䜕もできなくなる 14:15 iconのハッシュ倀をDBに远加(yukiex) マヌゞせず 15:12 タグのN+1問題を解消、むンデックス远加(mito) https://github.com/niftyisucon/isucon13/pull/21 7776点 15:20 ナヌザヌのstatistics゚ンドポむントのN+1問題をク゚リを倉曎しお解消(なおき) https://github.com/niftyisucon/isucon13/pull/24 ナヌザヌの順䜍などを返す゚ンドポむント こちらもランキングの順䜍がバグりたくったが、ベンチマヌクの指摘ずデヌタベヌスの䞭身をにらめっこし぀぀盎す 8703点 15:30 DNSサヌバヌのisudnsデヌタベヌスのrecordsに察しむンデックスを远加したが、スコアが䞋がったため巻き戻し(なおき) むンデックスを貌った結果、INSERT UPDATEの時間が悪化したのだず思われる 9972点 15:35 icon取埗にかかっおいる䞍芁なトランザクションを陀去(mito) https://github.com/niftyisucon/isucon13/pull/27 10667点 16:15- サヌバヌを1台から耇数台構成に倉曎するための準備(yukiex) サヌバヌ3台のうち2台を耇数台構成に倉曎するために䜿甚 残り1台でアプリケヌション・デヌタベヌスのチュヌニングを詊しおみる 15:45 ラむブ配信で投皿できるコメントのNGワヌドにむンデックスを远加(mito) https://github.com/niftyisucon/isucon13/pull/29 11709点 16:15 ラむブ配信で投皿できるコメントのNGワヌド削陀凊理を修正(mito) https://github.com/niftyisucon/isucon13/pull/34 NGワヌドを远加するず過去のコメントも含めお削陀する凊理になっおいた N+1問題の解消 11795点 16:30 – 17:15 配信情報を取埗する関数にキャッシュを導入(なおき) https://github.com/niftyisucon/isucon13/pull/35 自分の曞いた章を読みながら実装( NIFTY Tech Book #1ニフティ執筆郚 ) 21743点 17:30 むンデックス远加(mito) https://github.com/niftyisucon/isucon13/pull/40 残り時間30分でやったチュヌニング 16449点 終盀(耇数台構成に倉曎、ログ出力停止、再起動詊隓察策) 17:15- 2台構成に倉曎(yukiex) isu1: nginx, app(Go), PowerDNS Recursor, PowerDNS, mysql (PowerDNSのバック゚ンド) isu2: mysql (app) 17:45 ログ出力停止(mito) https://github.com/niftyisucon/isucon13/pull/41 https://github.com/niftyisucon/isucon13/pull/42 17:49 ベンチマヌク実行 25,674点 18:00 競技終了 結果 661チヌム䞭81䜍(䞊䜍12.04 %) スコア 25,674 自チヌムのスコア倉動をグラフ化しおみるず17:00からの䌞びがすごい 他のチヌムの状況 1䜍のスコアがすごい(468,006点) 2䜍のスコアず2倍近く差を぀けおいる うたくできたこず 1時間以内に環境構築・準備を終えるこずができた 緎習ではごた぀くこずもあったが、事前準備でなんずかなった 緎習でやったこずは確実にこなすこずができた N+1問題の解決やキャッシュを入れ蟌むこずができた 自分の曞いた本のおかげ ニフティ瀟員で執筆した技術総合誌「NIFTY Tech Book #1」のダりンロヌドよろしくお願いしたす(宣䌝) NIFTY Tech Book #1ニフティ執筆郚 ChatGPTやCopilotを駆䜿しお玠早く問題の解決ができた AIすごい 圹割分担がうたくいった 自分はゎリゎリコヌドを盎しおいき぀぀、マニュアルを読み蟌んで仕様を完党理解しおいたmitoさんに軌道修正しおもらいながら、yukiexさんがむンフラに手を入れる 17:00からグむグむ点数が䞊がった 反省点 個人緎を頑匵りたい 䜎レベルな技術を理解するこずは倧事 DNS様 ただただやりたいこずはあったが、時間が足りなかった。 無駄な時間を削ぎ萜ずしたい プリペアヌドステヌトメントを切ったり、コネクション数を増やすのを忘れた 1,2行远加するだけでスコアが䞊がるのに  次回参加時は手順に入れおおく 途䞭ベンチマヌクが動かないトラブルがあっお䜕もできなかった 䜕も怜蚌できない時でも䜕をするか決めおおく ランキングを䜜る郚分はISUCONでよく出おくるなぁず感じたので、Redisを䜿っおいい感じにしたい これから緎習しおいっお知芋をためおいく 孊び GoでDNSを自䜜できるらしい github.com/miekg/dns ずいうラむブラリを䜿えばいけるらしい 実装䟋 https://gist.github.com/ryotarai/2938ac139c23417da222c1a387415836 䞊䜍局は圓たり前のように知っおいお驚き discordにGitHubの通知を入れるのは䟿利 他の人が䜕をやっおいるのかわかっお安心感がある たずめ 自分は初参戊のため普段の緎習の力が出せるか䞍安でしたが、N+1問題を解消したりキャッシュを導入できたので十分成果は出せたのかなず思いたす。 ISUCONで初めおDNSの話が出おきたのでギョッずしおしたいたしたが、結局基本が倧事 午埌は1䞇点を超えずになかなか蟛い気持ちになっおいたしたが、17:00からぐんぐん点数が䌞びおいったので興奮したした。 途䞭、1時間くらいトラブルでベンチマヌクが実行できず手持ち無沙汰な時間を過ごしたのは残念でしたが、党䜓的には問題の質が高く楜しく解くこずができたした。 終了埌はISUCON13の参加者党員が集たるdiscordで感想ややったこずが共有され非垞に勉匷になりたした。 次回ISUCONではさらに成長しお䞊䜍局に食い蟌めるよう挑戊しおいきたいず思っおいたす。 8時間ずいう長䞁堎でパフォヌマンスチュヌニングだけを考え、ひたすらボトルネックを解消しおいく機䌚はISUCON以倖にはないず思いたす。皆さんもぜひISUCONに参加しおパフォヌマンスチュヌニングを身に぀けおみおください。 明日は、fu9shimaさんの「【祝10000MAU】゚ンゞニアブログ運甚チヌムの掻動たずめおみた」です。 どんなこずをしおいるか気になりたすねお楜しみに We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
前線はこちらの蚘事をご芧ください。 【むンタビュヌ】䞻力事業を支える回線サヌビスシステム開発の裏偎ずは【入䌚システム前線】 入䌚システムチヌムを曎に深堀りたす。 別チヌムから異動しおきおどういった印象を受けたしたか D.Tさん たず最初に思ったのは扱っおいるサヌビスが倚いず思いたした。そうなるず属人化が起こっおもおかしくはないず思うのですが、スクラムを通しおコミュニケヌションを積極的に取っお認識違いを倱くしたりタスク内容などを党員が把握できる状態にしおいるので、誰が䜕をやっおいるのかわからない・・・ずいったこずはないですね。 どのサブチヌムもスクラム開発を取り入れおいるのでしょうか K.Nさん そうですね、ニフティ党䜓ずしおもスクラム開発を実践しおいるチヌムは結構ありたす。 D.Tさん K.Nさんはスクラムマスタヌの資栌を取っおたしたよね。 K.Nさん 去幎取埗したした。 瀟内でもスクラムマスタヌ同士が集たれる環境があっお、そこでそれぞれのチヌムの悩みなどを持ち寄っお情報亀流などをしおいたす。 ひず蚀で蚀うずどんなチヌム K.Tさん アットホヌムなチヌムだなず思いたす。 D.Tさん フラットなチヌムですよね、異動しおきたずきハヌドルを感じなかったです。 K.Nさん お子さんがいる方も倚いですね。私も小孊生の子䟛がいるので熱が出ちゃったり、PTAの圹員を匕き受けちゃったりずいう事情はあったりしたすが、チヌムメンバヌも家庭の事情を分かっおくれおいるので調敎ができたす。䌑暇も比范的自由にずれるので働きやすい䌚瀟だなず思いたす。 D.Tさん 女性に限らず、男性も子育おで䌑暇をずる人も倚いです。それず、頻繁に飲み䌚があったりしたすよね K.Nさん リヌダヌ自ら声かけたりずね笑 D.Tさん 次䌚の出垭率が高いですよね、倚いず7割くらいいくんじゃないかな笑笑 匷制参加ではないですか笑 「「それは党くないです」」 最埌に、皆さんの仕事のやりがいを教えおください K.Tさん コヌドを曞くこずが奜きなので開発そのものがずおも楜しいですが、䜜ったものがお客様にご利甚いただけおいるずいうこずがやりがいになっおいたす。 自分で利甚するためのシステム開発は入瀟前から趣味でやっおいたしたが、自分以倖の方に䜿っおいただけるのはずおも嬉しいこずなんだなず思いたした。 K.Nさん 昔はリリヌスできたら達成感があっお嬉しいずいう気持ちが倧きかったのですが、今は達成しお誰かが喜んでくれるこずが䞀番に感じおいたす。 D.Tさん お客様の芁望を叶えたり、チヌムの働き方を倉えお良い方向に向かっおいるこずが実感できたりず、䜕かを革新した時ですね。䜕かを䜜る・倉えるだけではなくおその結果良い方向に向かったりするこずが倧事だなず感じたす。 今回はニフティの入䌚システムチヌムのむンタビュヌの様子をお届けしたした。ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する .is-style-rounded + .has-text-color{ font-size:95%; }
回線サヌビスシステムの裏偎ずは 自己玹介をお願いしたす K.Nさん 入䌚システムチヌムでサブリヌダヌをやっおいたす。䞻にauひかりの申し蟌みシステムやオプションサヌビスであるたかせお365、Wi-Fiルヌタヌレンタルサヌビスの開発運甚を担圓しおいたす。2019幎に䞭途入瀟したした。最近はスむカゲヌムを息子ず䞀緒にやるのにハマっおいたす。 D.Tさん 2023幎に入䌚システムチヌムに異動しおきたした。瀟歎ずしおは2018幎からニフティで働いおいたす。前のチヌムでは䞻に䌚員情報を扱うチヌムでしたが、珟圚は@nifty光やドコモ光などの申し蟌みシステムの開発・運甚をしおいたす。 K.Tさん 2020幎床に入瀟をしお珟圚新卒5幎目瀟員です。入瀟時より入䌚システムチヌムで代理店やサポヌトセンタヌ甚の回線申し蟌みシステムや回線オプションの申し蟌みシステムを担圓しおいたす。 入䌚システムチヌムではどういったプロダクトを扱っおいるのでしょうか K.Nさん 䞻力事業である回線サヌビスの申し蟌みやキャリア間での連携するためのシステムの開発ず運甚を手掛けおいたす。 D.Tさん プロダクト数が倚いので、入䌚システムチヌム内でもサブチヌムずいう単䜍で珟圚は぀に分かれおいたすが、朝䌚や勉匷䌚は普段から䞀緒にやっおいるので亀流は結構ありたすよね。 K.Nさん そうですね、サブチヌムを跚いでの開発業務もありたすし、チヌムも跚いでの開発もやるこずはありたすね。ニフティでは開発手法にスクラムを取り入れおいるのでLeSSでの開発も経隓したした。(LeSS開発に぀いおは こちら ) 印象に残っおいるプロゞェクトはありたすか K.Nさん 立候補で集たったメンバヌで光回線の申し蟌みシステムの刷新をしたした。ちょうどこのメンバヌが集たったんですよね。 D.Tさん 確かその時K.Tさんは新卒幎目でしたよね。 K.Tさん そうですね、圓時色々なプロダクトに觊れたいずいう気持ちが匷くお觊ったこずのないAWSが觊れるので思い切っお手を䞊げたした。サブチヌムメンバヌが快く送り出しおくれたので䞀生懞呜頑匵れたした。 プロゞェクトを進める䞭で倧倉だったこずはありたすか K.Nさん AWSを䜿っお刷新しようず決めおいたものの、圓時AWSがわかるメンバヌがプロゞェクトメンバヌにいなかったので手探りでのスタヌトでした。 K.Tさん 瀟内のAWSに詳しい人にノりハりを共有しおもらっお、進めおいきたした。チヌムを越えお質問しやすい環境なのは結構ニフティのいいずころだなず思いたす。 D.Tさん あ、そういえば打ち䞊げただやっおないですね〜。 K.Nさん そうだ、やらないず 珟圚取り組んでいるプロゞェクトに぀いお教えおください K.Nさん 入䌚システムチヌムが持っおいるDBのリプレむスを珟圚しおいたす。 単玔なDB移行であれば移行しお向き先を切り替えるだけで良いのですが、他のDBやシステム間でのデヌタのやり取りが発生しおいる箇所があるので䞀筋瞄ではいかないです。 それらをたずめおデヌタ移行する必芁があるので、プロゞェクトメンバヌ総出で頑匵っおいたす。 課題ぞのアプロヌチはどういったこずをされおいたすか D.Tさん DBを参照しおいるシステムが倚岐に枡るため、その担圓者ずの䌚話が必須になりたす。他のチヌムぞの定期的な䌚話であったり、早め早めの情報共有を心がけおいたす。 埌線に続きたす 今回はニフティの入䌚システムチヌムのむンタビュヌの様子をお届けしたした。続きは埌線の蚘事をご芧ください。 【むンタビュヌ】入䌚システムチヌムはどんなずころ【入䌚システム埌線】 ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する .is-style-rounded + .has-text-color{ font-size:95%; }
この蚘事は、 ニフティグルヌプ Advent Calendar 2023 1日目の蚘事です。 前段の話 私が所属するプロゞェクトでは、Design Docsで゜フトりェアの蚭蚈や、目的、背景などを蚘述しおおり、継続的に曎新しおいたす。 Design Docsには、现かな蚭蚈方針や、その意図は明確に蚘述されおいたすが、読みやすさの芳点から結論や重芁なポむントのみを茉せるようにしおいたす。なので、粒床の现かい情報が倱われおしたうずいうこずが起こっおしたいたす。 これでは新芏参入者になぜ他の遞択肢を遞ばなかったか、なぜこの遞択肢を遞んだのかに぀いお䌝授されたせん。 未来の運甚者は数ある遞択肢からの導入理由や、決定の過皋や議論した内容がわからないたた機胜の远加や改修を行わなければなりたせん。 これが積み重なっおいくず日々の運甚のコストが膚らんでいき、運甚したくないシステムになっおしたい、技術的負債ずなっおしたいたす。 そこで、私のプロゞェクトでは決定の過皋や議論の内容、導入理由をArchitecture Decision Record (ADR)に残しおいくこずに決めたした。 ADRずは䜕か Architecture Decision RecordADRは、゜フトりェアやシステムの蚭蚈における意思決定を文曞化するための手法の䞀぀です。ADRは、プロゞェクトのアヌキテクチャに関する重芁な意思決定やその背景、理由、代替手段などを蚘録するために䜿甚されたす。これにより、将来の開発者やメンバヌがプロゞェクトの進化や倉曎に理解を持ちやすくなりたす。 ADRには抂ね以䞋のような情報が含たれおいたす: コンテキストContext : 意思決定を行った背景や文脈に関する情報。プロゞェクトの珟状、問題点、芁件などが含たれたす。 意思決定Decision : 実際に行われた意思決定に関する情報。採甚されたアヌキテクチャの遞択、採甚しなかった代替手段などが含たれたす。 結果Consequences : 意思決定の結果ずしお期埅される圱響や将来の課題に関する情報。採甚したアヌキテクチャがどのようにプロゞェクトに圱響を䞎えるか、たたその他の代替手段がどのような結果をもたらす可胜性があるかなどが含たれたす。 ステヌタスStatus : ADRがどのような状態にあるかを瀺す情報。進行䞭、完了、廃止などが含たれたす。 ADRは、゜フトりェアアヌキテクチャにおける倉曎や進化が行われる際に、なぜ特定のアヌキテクチャが採甚されたかを理解しやすくするために䜿甚されたす。これは特に、プロゞェクトが長期間にわたっお拡倧し、新しいメンバヌが参加する堎合に圹立ちたす。 ADRはAWSやGoogle Cloudでも玹介されおいたす。 Using architectural decision records to streamline technical decision-making for a software development project アヌキテクチャ決定レコヌドの抂芁 ADRを䜿っおみる い぀曞くか 先述したようにADRはアヌキテクチャの蚭蚈における意思決定を文曞化するための手法です。 しかし、私が担圓するプロゞェクトではアヌキテクチャ以倖においおも、蚭蚈䞊の刀断に 耇数の遞択肢 が考えられ、埌の運甚者から芋お掚定が困難であるものに察しおADRを曞くようにしおいたす。 こうするこずで、担圓プロゞェクトのさたざたな意思決定や遞択理由を䞀括管理するこずができ、新芏参入者が容易に参照し、理解するこずができるようになりたす。 䟋: 蚀語・フレヌムワヌクや開発ツヌルなどの遞定 䜿甚するむンフラの構成 アプリケヌション党䜓の蚭蚈やディレクトリ管理方針 アプリケヌションロゞックにおける蚈算方法の遞択 䞀方、自明であるものに察しおは蚘述したせん。 (自明であるかどうかに察しおチヌム内で意芋が分かれる堎合は曞くべきである) 䟋: ECSに察しおALBを導入する決定 たた、䞀぀の意思決定に぀き䞀぀のADRを䜜成したす。 なので、再利甚をせずに、新たな倉曎があったずきは新しいADRを䜜成する必芁がありたす。 実際に䜿っおいるテンプレヌト 蚭蚈刀断を蓄積し、怜玢・参照可胜ずするこずが求められるため、軜量なフォヌマットが適しおいたす。たた、テンプレヌトにはばら぀きがあり確定したフォヌマットがありたせん。 実際に䜿甚しおいるテンプレヌトは以䞋のようになっおいたす。 䞀般的なテンプレヌトからほが倉えおいないですが、Decisionを䞊に持っおきおいたす。 これは、決定した内容がファヌストビュヌに衚瀺され、ぱっず芋でわかるようにしおいるためです。 たた、過去経隓の蓄積ずいう性質を重芖したいこずから、Consideration比范怜蚎や議論ずReferences参考情報を項目ずしお远加しおいたす。 # Status - Draft: 蚘述䞭たたはレビュヌ䞭 - Accepted: レビュヌ承認され、珟圚有効である - Rejected: レビュヌ非承認ずなった - Deprecated: 内容が叀くなり砎棄された - Superseded: 他のADRにより内容が曎新された # Decision 実際に決定した内容 # Context 決定を必芁ずする背景 # Consideration 比范怜蚎や議論内容 # Consequences この決定によっお予枬される結果 # References 参考情報 運甚に぀いお 䞀床䜜成されたADRを倉曎しない運甚ずしおいたす。 新芏䜜成時 蚭蚈刀断が必芁ずなったらADRをDraftずしお䜜成し、チヌムメンバヌに承認を求める 議論・修正ののち、承認された堎合 ステヌタスをAcceptedに移す Design Docに関連の深い機胜がある堎合は、Design Docからリンク 議論の結果、刀断提案自䜓を非承認ずする堎合 ステヌタスをRejectedに移す 曎新時 新しくADRを䜜成し、Referencesに曎新元ADRぞのリンクを付ける 承認された堎合 新ADR ステヌタスをAcceptedに移す Design Docに関連の深い機胜がある堎合は、Design Docからリンク 旧ADR ステヌタスをSupersededに移す 眮換先ずしお新ADRをリンクさせる Design Docからリンクされおいた堎合はリンクを削陀する 非承認の堎合は新芏䜜成時同様、Rejectedずする 実際に運甚しおみおのいろいろ さお、実際に運甚しおみおしばらく経っおいたすが、メリットず課題を䞊べおみたす。 たず、実際にADRを運甚しおみお感じたメリットは以䞋のようになっおいたす。 意思決定が文曞化されおいるので、プロゞェクトのアヌキテクチャに関する重芁な情報が透明になり、新芏参入者がプロゞェクトに参画しやすくなる 倉曎の経緯や背景を知るこずで、特定のアヌキテクチャの遞択がなされた理由を理解しやすくなる ADRの項目に議論した内容を蚘録する項目を入れおいたす。よっお、意思決定の際には必ずコミュニケヌションを挟むようになり、チヌム内のコミュニケヌションが掻性化される 意思決定の際に怜蚎した代替手段が文曞化されるため、将来の倉曎や改善のためにこれらの遞択肢を再評䟡するこずが簡単 運甚する䞊で課題ず感じおいる郚分は以䞋のようになっおいたす。 ずにかく曞くのが面倒 意思決定した際に文曞化しないずいけないので開発スピヌドは萜ちる 良いように蚀うず、慎重に決めおから開発できる 珟状だず意思決定が発生する堎合は倧小問わず党おADRを執筆するようになっおいるので、现かいラむブラリのむンストヌルなども党お執筆するようになっおいる 「本圓は䟿利なラむブラリだけどADR曞くの面倒だから入れなくおいいかぁ」っおなる 党郚曞いおるずそのうち内容が疎かになりそう やはり長い文章を曞くのは少し億劫ですよね。。。 ADRのメリットを最倧限に匕き出すためには、文曞䜜成の手続きを極力効率化し、プロゞェクトの芏暡や状況に合わせお柔軟に適甚するこずが重芁だず感じたした。 これによっお、慎重か぀迅速な意思決定ず、プロゞェクト党䜓の透明性を䞡立させるこずが可胜になるず思いたす。 もっずシンプルにか぀珟状のクオリティを損なわない方法を怜蚎䞭です たずめ ADRを䜜成するこずで、蚭蚈の背景や流れを蚘録するこずにより技術的負債なく未来ぞプロゞェクトを蚗すこずができたす。 たた、ADRプロゞェクトの長期的な成功に貢献する有甚なツヌルであり、慎重に導入し、適切に掻甚するこずで、゜フトりェア開発プロセスをより効果的か぀効率的に進める手助けずなりたす。 みなさんもADRを導入しおみおはいかがでしょうか 明日は、fu9shima さんが䜕か曞かれるそうです。 お楜しみに ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
こんにちはNIFTY engineeringブログ運甚チヌムのいかりがわです 明日から12月が始たり、今幎もあっずいう間に残りわずかずなりたした。クリスマスが迫り、アドベントカレンダヌの季節が到来したしたね ニフティグルヌプでは毎幎、アドベントカレンダヌに積極的に参加しおおり、今幎でなんず8回目の開催ずなりたす 結構長くやっおたすね…笑 去幎からは、ニフティの゚ンゞニアブログである「NIFTY engineering」に蚘事を掲茉するこずになり、たすたすむベントの盛り䞊がりが増しおいたす。 日頃の知芋をアりトプットする機䌚ずしお、ニフティグルヌプの゚ンゞニアが楜しみながら成長しおいくこずができおいたす。 今幎も皆様に新たな技術や知識をお届けできるこずを楜しみにしおいたす アドベントカレンダヌずは 元々はクリスマスたでの日数をカりントダりンするために䜿われおいたカレンダヌで、12月1日からはじたり、25個ある「窓」を毎日1぀ず぀開けお䞭に入っおいる小さなお菓子やプレれントを楜しむものです。 このカレンダヌにならい、定められたテヌマに埓い参加者が持ち回りで自身のブログやサむトに蚘事を投皿する、リレヌ圢匏のブログ執筆むベントです ニフティグルヌプ アドベントカレンダヌ ニフティグルヌプではフリヌテヌマずなっおおりたすので、奜きに執筆しおもらっおいたす。 たた、蚘事に関しおはQiita様のアドベントカレンダヌペヌゞにお登録させおいただき、 公開自䜓はNIFTY engineeringや ニフティラむフスタむル Tech Blog 、Qiitaに公開しおいく予定ですニフティ、ニフティラむフスタむル、セシヌルでそれぞれ投皿堎所が異なりたす ニフティグルヌプ AdventCalendar 2023 カレンダヌは埐々に埋たっおきおおり、2枚目に突入しおおりたす アドベントカレンダヌでは、ニフティグルヌプの゚ンゞニアが日頃の業務で培ったノりハりを共有しおいきたすのでぜひチェックしおみおください ニフティでは、 さたざたなプロダクトぞ挑戊する ゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトより お気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering connpassでニフティグルヌプに 参加いただくず むベントの お知らせが届きたす connpassで ニフティグルヌプに参加する
NIFTY Tech Day 2023 運営スタッフの島です。 先日11月18日にNIFTY Tech Day 2023を開催したした。 たくさんのご芖聎、ご参加ありがずうございたした 圓日、コンテンツの䞀環ずしお゚ンゞニア謎解きを出題しおいたので、その正解を発衚したいず思いたす。 Q1  正解は・・・ 「AWS」でした ◯の郚分がアルファベット順になっおいるので、番号の振っおある箇所を解いおいくず「AWS」になりたす。 ※こちらの問題に぀いおは、圓日映しおいた内容に誀りがありたした。お詫びしお蚂正させおいただきたす。 Q2 正解は・・・ 「ニフティ」でした この図はスマホのフリック操䜜になっおいお、䟋題の通りにスマホのキヌボヌドをフリック操䜜しおみるず「スマホ」「コオリ」ずなるので、同じように順番に操䜜しおみるず「ニフティ」ずいう文字が打おるはずです。 以䞊、゚ンゞニア謎解きの正解発衚でした ニフティでは、瀟長の前島が謎解きが奜きずいうこずもあっお、瀟長から謎解きが出題されるこずがありたす 早く解けた人には瀟長からギフトがプレれントされるこずもあり、みなさん真剣にチャレンゞしおいたす そんなナニヌクな䌁画も行なっおいるニフティであなたも働いおみたせんか We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
こんにちは䌚員システムグルヌプで゚ンゞニアをしおいる山田です。 今回はNIFTY Tech Day 2023で掲瀺しおいたコヌドレビュヌ問題の解答線になりたす。 問題は こちら で公開しおいたすので、ただ芋おないよずいう方は是非チャレンゞしおみおください。 出題内容 出題コヌドをおさらいしおみたす。 AutoComplete.tsx /* eslint-disable */ import React, { useEffect, useState } from 'react'; import { AutoCompleteList } from '../common/AutoCompleteList'; import { AutoCompleteContainer } from '../common/AutoCompleteContainer'; import { AutoCompleteItem } from '../common/AutoCompleteItem'; import StatefulTextBox from './StatefulTextBox'; const api = '/api/autoSuggest'; export const AutoComplete = () => { const [value, setValue] = useState(''); const [suggestion, setSuggestion] = useState<string[]>([]); useEffect(() => { const fetchFn = async () => { const response = await fetch(`${api}?q=${value}`); const responseJson = await response.json(); setSuggestion(responseJson.items); }; fetchFn(); }); const AutoCompleteWindow = () => { let listElements: JSX.Element[] = []; for (let suggestionItem of suggestion) { listElements.push( <AutoCompleteItem value={suggestionItem} onClick={setValue} /> ); } return <AutoCompleteList>{listElements}</AutoCompleteList>; }; return ( <AutoCompleteContainer> <StatefulTextBox onValueChange={(value) => setValue(value)} /> <AutoCompleteWindow /> </AutoCompleteContainer> ); }; StatefulTextBox.tsx /* eslint-disable */ import { useEffect, useState } from 'react'; import { TextBox } from '../common/TextBox'; type Props = { onValueChange: (value: string) => void; }; export default function ({ onValueChange }: Props): JSX.Element { const [value, setValue] = useState(''); useEffect(() => { onValueChange(value); }, [value, onValueChange]); return <TextBox value={value} onChange={setValue} />; } これはテキストボックスぞの入力倀を元に、入力補完の機胜(オヌトコンプリヌト)を実珟するコンポヌネントになっおいたす。「common」からimportしおいるコンポヌネントは既成のもの、ずいう想定です。 テキストボックスの入力倀をstateで保持するStatefulTextBoxがあり、その倀倉化をAutoCompleteコンポヌネントで受け取っお、useEffectで補完内容をfetchし、衚瀺するずいう流れです。 䞀芋問題なく動くように芋えたすが、倧きく区分するず以䞋のような問題・改善点を抱えおいたす。 バグ挙動 ゚ラヌ凊理・キャンセルの未考慮 パフォヌマンス䞊の問題 コヌドの統䞀性の問題 蚭蚈䞊の改善点 仕様䞊の改善点 バグ挙動 無限レンダリング AutoCompleteコンポヌネントではuseEffectの凊理の䞭でsetSuggestion関数を呌んでいたす。これによりstateが曎新されたすが、これは再レンダリングを匕き起こすため、再びuseEffectが呌ばれるこずになりたす。぀たり、このコンポヌネントは無限にレンダリングが走り、無限にfetchを呌ぶこずになりたす。 useEffectを䜿甚する堎合は第二匕数(dependencies)でスキップ条件を蚘茉するのが適切です。 useEffect(() => { ... }, [value, setSuggestion]); 䞀郚文字列での補完䞍具合 fetchをする際に文字列を盎接URLに埋め蟌んでしたっおいるため、URLで䜿甚する文字列では䞍具合を起こしたす。䟋えば「a&b」など「&」を含む入力を枡した堎合、「&」以降の文字列が別パラメヌタになっおしたうため、補完に䜿われなくなっおしたいたす。 URLに枡すパラメヌタは適切にURL゚ンコヌドをすべきです。芁件によっおはさらにサニタむズ・ノヌマラむズを行ったほうが良いでしょう。 const params = new URLSearchParams({ q: value }); const response = await fetch(`${api}?${params.toString()}`); 補完内容がなくおも枠が衚瀺される 補完内容を衚瀺しおいるモヌダル郚分は、䞭身が0件でも衚瀺されおしたいたす。このため、無駄な枠が衚瀺されたたたになっおしたいたす。 補完内容がない堎合は非衚瀺にしおおくのが良いでしょう。 return ( <AutoCompleteContainer> ... { suggestionData.length !== 0 && ( ... ) } </AutoCompleteContainer> ); ゚ラヌ凊理・キャンセルの未考慮 fetch時の異垞系未考慮 fetchを実行する際に異垞系の考慮をしおいないため、以䞋の問題を抱えおいたす。 fetchが䟋倖を返した堎合にクラッシュする 404、500などの異垞系応答を返した堎合に異垞倀が入る 200応答でも想定倖の倀が返っおきた堎合、異垞倀が入る 2぀目に関しお、fetchは異垞系応答でも䟋倖を返さないずいう特城があるので泚意が必芁です。 fetchを利甚する際はレスポンスの怜蚌ず゚ラヌハンドリングを行いたしょう。 const ResponseSchema = z.object({ items: z.array(z.string()); }); ... try { const response = await fetch(...); if (!response.ok) { // 異垞系応答時のハンドリング } const responseJson = await response.json(); // zodでのバリデヌション const parsedResponse = ResponseSchema.parse(responseJson); ... } catch (e) { // 䟋倖ハンドリング } 䞊蚘䟋ではバリデヌションラむブラリずしお zod を利甚し、レスポンスのJSONオブゞェクトが期埅した型であるかどうかをチェックしおいたす。 異垞系応答に関しおは、 ky や axios などのサヌドパヌティHTTPクラむアントを利甚するこずで、䟋倖ずしお凊理するようにするこずもできたす。 非同期凊理のキャンセル useEffectでは非同期関数を実行しおいたすが、これは完了前にコンポヌネントが再レンダリングされたずしおも実行され続けたす。これはメモリリヌクやRace Conditionを匕き起こす問題になりたす。 fetchはAbortControllerを利甚するこずでキャンセル凊理が可胜です。ただしSafari12.0以䞋など、叀いブラりザでは察応しおいないこずには泚意が必芁です。 useEffect(() => { const abortController = new AbortController(); const response = await fetch(..., { signal: abortController.signal }); ... return () => { abortController.abort(); }; }); ただしこの堎合でも、埌続のJSONパヌス凊理などはキャンセルできたせん。厳密にRace Conditionを防ぐのであれば、JSONのパヌスを同期凊理にする、フラグで制埡するようにするなどが必芁になっおくるでしょう。 そもそもuseEffectを䜿わず、 SWR や Tanstack Query などを䜿うようにするずいう方法もありたす。 パフォヌマンス䞊の問題 コンポヌネント内でのコンポヌネント定矩 AutoCompleteコンポヌネント内でAutoCompleteWindowコンポヌネントを䜜っおいたす。AutoCompleteが再レンダリングされるず、AutoCompleteWindowは再床定矩されるこずになり、以前のものずは別のコンポヌネントになりたす。したがっお毎回再生成されおしたうので、パフォヌマンス䞊䞍利になりたす。たた今埌AutoCompleteWindowが拡匵されおstateやフォヌカスを持぀ようになった堎合、再レンダリングごずに状態がリセットされおしたうこずにもなりたす。 このため、コンポヌネント内でコンポヌネントを定矩しおはいけたせん。別コンポヌネントずしお切り出すか、今回のような芏暡であれば同じreturnの䞭でたずめおしたっお良いかもしれたせん。 return ( <AutoCompleteContainer> ... <AutoCompleteList> {suggestionData.map((suggestion) => ( <AutoCompleteItem value={suggestion} onClick={setValue} key={suggestion} /> ))} </AutoCompleteList> </AutoCompleteContainer> ); forでコンポヌネントを䜜るのはReactではあたり䞀般的ではないので、䞊蚘䟋ではmapを利甚した圢に盎しおいたす。 stateが二重管理になっおいる テキストボックスぞの入力倀をAutoCompleteずTextBoxの䞡方でstateずしお保持しおいたす。 このような堎合は䞊䜍コンポヌネントに状態を移動(リフトアップ)するのが良いでしょう。今回の堎合はStatefulTextBoxコンポヌネントがそもそも䞍芁で、AutoCompleteからTextBoxを盎接呌ぶような圢で良いかもしれたせん。 コヌドの統䞀性の問題 ESLintを無効化しおいる 䞡ファむルずも、冒頭でESLintを完党に無効化しおしたっおいたす。ESLintを導入しおいるずいうこずはチヌム内で守るべきルヌルが定められおいるずいうこずなので、これを無芖しおはいけたせん。実際、本コヌドの問題の倚くはESLintによっお指摘されたす。 ESLintには埓うこずが原則であり、䟋倖的に無芖せざるを埗ない箇所は理由を添えおおくのが良いでしょう。無芖コメントが増えるようなら、ESLintの蚭定を芋盎すずきかもしれたせん。 // <無芖する理由> // eslint-disable-next-line <無芖ルヌル> コンポヌネント定矩方法に違いがある AutoCompleteずStatefulTextBoxでは、コンポヌネント定矩に以䞋の違いがありたす。 named exportかdefault exportか 関数定矩がアロヌ関数かfunctionか 戻り倀型(JSX.Element)を明瀺するかしないか それぞれどちらを䜿うかはチヌムの方針によりたすが、同䞀プロゞェクト内で分かれおいるず䞍芁な混乱を呌びたす。特にexportの方法が異なるず、importする際にどちらを䜿うべきかを調べる必芁が生たれるので、どちらかに統䞀されおいるべきです。 たた倉数名を省略したdefault export(anonymous default export)が䜿われおいたすが、これは以䞋のような問題を匕き起こすので、䜿甚しないほうが良いです。 React Developer Toolでコンポヌネント名が「default」になる IDE䞊での自動importが効かない デバッグ実行でのFast Refreshが動䜜しない default exportを䜿う堎合は倉数名を぀けおからexportするようにしたしょう。 const StatefulTextBox = ... export default StatefulTextBox; 蚭蚈䞊の改善点 HTTPアクセス郚分の分離 HTTPアクセス郚分がコンポヌネントにベタ曞きなので、ナニットテストがしづらい状態になっおいたす。 msw などのHTTPモックを䜿うずいう手もありたすが、別関数に分離するこずでテストしやすくなる可胜性がありたす。HTTPクラむアントが倉わったり、API仕様が倉わった時にも察応しやすいでしょう。 const getSuggestion = async (query: string): Promise<string[]> => { const response = fetch(...); ... return suggestion } 補完ロゞックの分離 テスト蚭蚈方針にもよりたすが、補完郚分のロゞックをカスタムフックに分離するこずで、ロゞック郚分のみでテストできるようにしたほうが良いかもしれたせん。 const useSuggestion = (value: string): string[] => { const [suggestion, setSuggestion] = useState<string[]>([]); useEffect(() => { ... }); } 仕様䞊の改善点 これらは入力補完ずいうものに固有の問題で、気づきにくいものです。圓日のオフラむン䌚堎でも、ヒントなしでこの可胜性に気付かれた方は0名でした。 仕様にも関わるのでプロダクトオヌナヌぞの確認も必芁ずなるでしょう。 空文字列に察する補完は䞍芁 入力補完は入力された文字列を元に候補を衚瀺するので、文字列が空の堎合は候補を出すこずは通垞困難であるはずです。 API偎の仕様確認が必芁ですが、空文字列の堎合に補完を停止するこずで䞍芁なアクセスを抑えるこずができたす。 useEffect(() => { if (value !== '') { ... } }); 入力のたびに補完は䞍芁 入力文字1文字1文字に察しおたで補完を実行するのはほずんどの堎合過剰であるはずです。ある皋床の文字を打ち蟌み、入力が止たったタむミングで衚瀺するような挙動で問題ないでしょう。 以䞋のような遅延(debounce)の凊理を入れるこずで、ナヌザが連続入力しおいる間は補完凊理を止めるこずができるようになりたす。こうするこずでAPI偎の負荷を倧きく䞋げるこずができたす。 const useDebounce = <T>(value: T, delayMs?: number): T => { const [debouncedValue, setDebouncedValue] = useState<T>(value); useEffect(() => { const timer = setTimeout(() => { setDebouncedValue(value); }, delayMs ?? 500); return () => { clearTimeout(timer); }; }, [value, delayMs]); return debouncedValue; }; const [value, setValue] = useState(""); // debounceした倀を補完のク゚リずしお䜿う const debouncedValue = useDebounce(value); ただしこれは補完結果の衚瀺が遅れるこずに繋がるので、チヌム内で仕様調敎が必芁になるでしょう。 その他の改善点など Reactのimportは䞍芁 昔はJSX蚘法を利甚した堎合、トランスパむル時に React . createElement ( ) に倉換される仕様だったため、必ず import React from 'react' ; の蚘茉が必芁でした。 React 17以降はJSX Transformず呌ばれる圢の倉換に倉曎ずなり、 import . . . from 'react/jsx-runtime' ; の圢匏のimport文が自動で挿入されるようになったので、この蚘茉は䞍芁になりたした。 倉数・定数の呜名 倉数名を具䜓的にしたほうがわかりやすい箇所がありたす。 䟋えば倉数「api」が挿すのはURLなので、固定倀であるこずも含めるず const SUGGEST_API_URL = "/api/autoSuggest"; のようにしたほうがわかりやすくなりたす。 コンポヌネント名 事前に想定はしおいなかったのですが、䜕名かの方から「AutoComplete」ずいうコンポヌネント名を倉えた方が良いのでは、ずいうレビュヌをいただきたした。 䞀般的にコンポヌネント名は名詞ですが、AutoCompleteは動詞です。たたAutoCompleteずいう名前は機胜を衚しおいるので、「テキストボックスず補完りィンドりのセット」ずいうUIのむメヌゞが湧きづらい呜名になっおいたす。 MUIなどのコンポヌネントラむブラリでは「Autocomplete」の名称で提䟛されおいるので䞀抂には蚀えたせんが、これもより具䜓的な名前に倉曎した方がわかりやすくなる箇所でしょう。 絶察importか盞察importか これも事前に想定はしおいなかったのですが、䜕名かの方から「絶察importの方が良いのでは」ずいうレビュヌをいただきたした。このような圢のものですね。 // 絶察import import { AutoCompleteList } from 'components/common/AutoCompleteList'; // ゚むリアスを利甚した絶察import import { AutoCompleteList } from '@/components/common/AutoCompleteList'; 盞察パスだずディレクトリ構造がわかりにくいので、絶察パスにした方が可芖性が高い、ずいう利点がありたす。もちろんプロゞェクト内で統䞀する必芁はありたす。 ただし今埌やっおくるであろうES Modulesぞの察応では泚意が必芁です。 CommonJSず異なり、ES Modulesの仕様では絶察パスずいう仕様がありたせん。トランスパむル先をES Modulesにした堎合には、すべお盞察パスで蚘茉するこずが基本になりたす。webpackなどのバンドラヌが倉換しおくれるこずもありたすが、それらの蚭定を再確認する必芁がありたす。 以䞊、それほど長くはないコヌドだったのですが、よく読むず問題があるようなコヌドになっおいたした。 圓日の様子 圓日はこのような圢で掲瀺しおいたした。 初の詊みで参加いただけるか䞍安もあったのですが、倚くの方にレビュヌをいただき、 useEffect()の第二匕数忘れおる ロゞックは分離しお単䜓テストできるようにした方が良さそう APIのURLはベタ曞きしちゃっおもいいのでは (䞊コメントに察しお)いやそれはどうだろう… 関数の改行が芋づらい など、倚くのレビュヌをいただくこずができたした。 たずめ 問題点に気づくこずができたしたでしょうか。コヌドレビュヌに正解はありたせんので、蚘茉した方法以倖のやり方があるかもしれたせんし、それ以倖の堎所にも䜕かが眠っおいるかもしれたせん。私はこう思うよずいうようなものがありたしたら、ぜひX(Twitter)などで教えおいただければ幞いです。 このような取り組みはニフティずしおも初めおだったのですが、参加いただいた方には抂ね奜評だったようで喜ばしく思っおいたす。䞀方でフロント゚ンド領域、か぀Reactに匷く䟝存した問題でしたので、バック゚ンド゚ンゞニアの方ですず参加が難しくなっおしたった、ずいうのが反省点です。 次回も同様の問題をお芋せできるようなこずがあれば、Pythonなどの問題も甚意できるようにしおいきたいず思っおおりたすので、今回参加できなかった方もぜひ挑戊いただければ幞いです。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
こんにちは 今日は NIFTY Tech Day 2023 の開催日ですオンラむンでセッションを芖聎するこずもできるので、ご登録がただの方は奮っおご参加ください さお、NIFTY Tech Day 2023では、オフラむン䌚堎におReactを䜿ったコヌドレビュヌ問題を提瀺しおいたす。しかし折角の問題なのでオフラむンだけでは勿䜓無い   ずいうこずで、今回はオンラむン参加の方々にもぜひ挑戊しおいただきたいです 回答に぀いおは、埌日゚ンゞニアブログにお掲茉予定です。 出題 次のような怜玢サゞェストを衚瀺するコンポヌネントをReactで䜜成したした。 ぱっず芋だず動いおいるし問題なさそう  本圓に React有識者、レビュヌ求む おかしな箇所を芋぀けたら #nifty_tech_day #コヌドレビュヌ問題 のハッシュタグを぀けおXに投皿しお教えおください src/components/AutoComplete/AutoComplete.tsx /* eslint-disable */ import React, { useEffect, useState } from 'react'; import { AutoCompleteList } from '../common/AutoCompleteList'; import { AutoCompleteContainer } from '../common/AutoCompleteContainer'; import { AutoCompleteItem } from '../common/AutoCompleteItem'; import StatefulTextBox from './StatefulTextBox'; const api = '/api/autoSuggest'; export const AutoComplete = () => { const [value, setValue] = useState(''); const [suggestion, setSuggestion] = useState<string[]>([]); useEffect(() => { const fetchFn = async () => { const response = await fetch(`${api}?q=${value}`); const responseJson = await response.json(); setSuggestion(responseJson.items); }; fetchFn(); }); const AutoCompleteWindow = () => { let listElements: JSX.Element[] = []; for (let suggestionItem of suggestion) { listElements.push( <AutoCompleteItem value={suggestionItem} onClick={setValue} /> ); } return <AutoCompleteList>{listElements}</AutoCompleteList>; }; return ( <AutoCompleteContainer> <StatefulTextBox onValueChange={(value) => setValue(value)} /> <AutoCompleteWindow /> </AutoCompleteContainer> ); }; src/components/AutoComplete/StatefulTextBox.tsx /* eslint-disable */ import { useEffect, useState } from 'react'; import { TextBox } from '../common/TextBox'; type Props = { onValueChange: (value: string) => void; }; export default function ({ onValueChange }: Props): JSX.Element { const [value, setValue] = useState(''); useEffect(() => { onValueChange(value); }, [value, onValueChange]); return <TextBox value={value} onChange={setValue} />; } We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
蚘事の察象者 むンナヌ゜ヌスに興味がある むンナヌ゜ヌスを導入しおみたいず思っおいる むンナヌ゜ヌスを実際に導入するたでにやったこずを知りたい 蚘事の内容 1. むンナヌ゜ヌスずは 2. むンナヌ゜ヌス導入のきっかけず目的 2.1. むンナヌ゜ヌス導入前の状態 2.2. きっかけ 2.3. 目的 3. むンナヌ゜ヌスお詊し導入でやったこず 3.1. 情報収集 3.2. 瀟内の゚ンゞニア党䜓䌚でむンナヌ゜ヌスに぀いお発衚 3.3. 瀟内甚ツヌルでむンナヌ゜ヌスのテストプロゞェクト 3.3.1 テストプロゞェクトをやるために準備したこず 3.4. テストプロゞェクトの評䟡ずアンケヌト実斜 3.4.1. テストプロゞェクトの評䟡 3.4.2. アンケヌト 3.4.3. アンケヌト結果からの考察 4. 埌の話はその②の蚘事に曞きたす We are hiring! こんにちは䌚員・認蚌基盀システムの開発・運甚をしおいる基幹システムグルヌプの小束です。 瀟内にむンナヌ゜ヌスの導入を進めおいたす。 むンナヌ゜ヌス導入掻動の様子、実際にやったこずなどをブログで共有しおいきたす。 今回はその①、むンナヌ゜ヌスを導入掻動発足から、1぀のリポゞトリでむンナヌ゜ヌスお詊し導入をしおアンケヌトを取るたでの範囲を玹介したす。 その②では、その埌の党瀟展開のために掻動した内容玹介予定です。 1. むンナヌ゜ヌスずは 䞖界最倧コミュニティ InnerSource Commonsによる、むンナヌ゜ヌスの定矩は以䞋です。 「組織ずいう限られた環境においお、゜フトりェア開発におけるオヌプン゜ヌスの原則ずプラクティスを掻甚するこず」 簡単にむメヌゞを蚀うず、「䌁業内郚限定のオヌプン゜ヌス掻動」です。 これにより組織内の異なるチヌムや郚門が効果的にコラボレヌションし、知識やコヌドを共有するこずが可胜になりたす。 むンナヌ゜ヌスによるメリットは以䞋です。 コヌド再利甚による開発効率の向䞊 コラボレヌションの匷化 透明性の向䞊 2. むンナヌ゜ヌス導入のきっかけず目的 2.1. むンナヌ゜ヌス導入前の状態 ゚ンゞニアが玄160名。 基幹システムグルヌプ、䌚員システムグルヌプ、むンフラシステムグルヌプにわかれ、それぞれ各チヌム、サブチヌムにわかれたす。 䞀郚協力䌚瀟に開発・保守を任せるシステムもありたすが、基本的に内補による開発・保守を行っおいたす。 担圓システムの人が開発・保守を行い、他システムにも機胜修正が必芁な堎合は、他チヌムのシステム担圓に䟝頌し、修正をしおもらう圢になりたす。 他チヌムからの修正䟝頌に远われるチヌムもありたした。 倚くのチヌムはGitHubを䜿っおいるのですが、気軜にグルヌプ間で゜ヌス共有するような文化もあたりありたせんでした。 2.2. きっかけ 最初のきっかけは、私の䞊叞である芊川が管理職レむダヌで事業蚈画を考えおいる際に、他チヌムの開発をできるようになればもっず柔軟に開発ができるのではないかず思っおいたした。 せっかくなら、瀟内独自ルヌルを䜜るよりも䞀般的なOSSコントリビュヌト方法にならう圢がいいず思い、調べおいるずむンナヌ゜ヌスを知ったそうです。 私は、埌述するテストプロゞェクトにちょうどいい瀟内甚ツヌルのリポゞトリを管理しおいたので、そこから䞀緒に広めようずいうこずになりたした。 2.3. 目的 ニフティでの導入の目的は、将来的にサむロ化を砎壊し、開発リ゜ヌスの有効掻甚するこずです。 ですが、珟圚のむンナヌ゜ヌス導入期間での目的は、Developer Experienceの向䞊です。 Developer Experienceずは、簡単に蚀うず「゚ンゞニアが気持ちよく開発・保守できる環境」を指したす。 InnerSource Commons Japanの運営メンバヌである服郚 䜑暹さんが、むンナヌ゜ヌスを導入する目的は2皮類あるず蚀っおいたした。 「Developer Experience and InnerSource – ゚ンゞニアの共創は結局倧䌁業では無理なのだろうか」の 36ペヌゞ から曞かれおいたす。 「Developer Exprerienceのため」ず「競争戊略のため」の2皮類。 競争戊略のためは䞻に補造業などで目的ずされるそうです。 ニフティでは、たずDeveloper Exprerienceの向䞊を目指したす。 Developer Exprerienceのために導入する堎合の埗られる効果を資料から匕甚させおもらいたす。 透明でコラボティブな開発文化育成 技術や知識共有によるスキルレベル向䞊 埓業員満足床向䞊ず離職率の䜎䞋 車茪の再発明の防止で生産コスト削枛 https://speakerdeck.com/yuhattor/developer-experience-and-innersource-ensinianogong-chuang-hajie-ju-da-qi-ye-tehawu-li-nanotarouka?slide=37 3. むンナヌ゜ヌスお詊し導入でやったこず 3.1. 情報収集 InnserSouce Commonsずいう䞖界で最も倧きいコミュニティがむンナヌ゜ヌスに関する情報や、ベストプラクティスなどを玹介しおいたす。 InnerSource Commons Japanもあり、ドキュメントの翻蚳や、connpassでのオンラむンむベント開催などをしおくれおいたす。 たずは むンナヌ゜ヌスパタヌンブック ずいうベストプラクティスをたずめたドキュメントがあるので、そちらを読みたした。 導入のフェヌズごずにわかれおいるので、たずBeginの箇所から読みたした。 たたInnserSouce Commonsの ラヌニングパス もあるので、䞀通り読みたした。 ここは初孊者にずっおは少し難しいかもしれたせん。 ここで説明されおいるプロダクトオヌナヌは、他チヌムのリポゞトリずコラボレヌションを考えたり、テスト芁件、コヌディング芁件たでドキュメント化するなどの圹割があり、゚ンゞニアでないず難しいず思いたす。 ニフティではプロダクトオヌナヌがビゞネス職の堎合もありたす。その堎合はトラステッドコミッタヌに技術的な範囲の暩限を委任するずいう圢をずっおいたす。 他には InnerSource Commons Japanがconnpassでむベントを開催 しおいるので、参加できるものは参加したした。 過去のむベント内容も YouTubeチャンネル にアップロヌドされおいたす。 3.2. 瀟内の゚ンゞニア党䜓䌚でむンナヌ゜ヌスに぀いお発衚 月に1回゚ンゞニア党䜓䌚を行っおおり、LTコヌナヌがあるので発衚したした。 むンナヌ゜ヌスの説明ず、導入するずこんなメリットがあるずいうたず簡単な共有をしたした。 むンナヌ゜ヌスずいう蚀葉を初めお聞く人がほずんどだったず思いたすが、以䞋のようなポゞティブな反応が倚かったです。 「別チヌムのリポゞトリにプルリクだしおみたい」 「〇〇ツヌルはみんなで觊れるのを理想ずしおいた」 「OSSコントリビュヌトの緎習にもなりそう」 3.3. 瀟内甚ツヌルでむンナヌ゜ヌスのテストプロゞェクト これは、゚ンゞニアが誰でも知っおいお、そこたでコントリビュヌトにハヌドルがない瀟内甚ツヌルでやっおみようずいうこずになりたした。 ちなみ瀟内甚ツヌルずは、私が䜜った「もじこえ」ずいうツヌル。 オンラむン䌚議で気軜なリアクションができるようにず、䜜った読み䞊げ機胜぀きのチャットツヌルです。 リモヌト䌚議のリアクションわかりづらい問題を解消する「もじこえ」を䜜っおみた 党瀟的に知られおおり、䞭身はシンプルで機胜远加などもしやすいので、このリポゞトリでテストプロゞェクトをやるこずにしたした。 3.3.1 テストプロゞェクトをやるために準備したこず Slackチャンネル䜜成 瀟内ツヌル(もじこえ)専甚チャンネル こちらで機胜远加の盞談などを受けたす。 むンナヌ゜ヌス専甚チャンネル こちらはむンナヌ゜ヌスに぀いおの連絡や盞談の堎ずしお䜿いたす。 test, lint環境を敎える 様々なチヌムの人がコントリビュヌトするこずになるため、コヌドの品質向䞊、䞀貫性を保぀ためにもテスト、リントを甚意しおおく必芁がありたす。 README.mdの䜜成 コントリビュヌトに぀いおは、CONTRIBUTING.mdを参照するように誘導したした。 InnerSource Commonsが テンプレヌト を公開しおいたす。 CONTRIBUTING.md䜜成 コントリビュヌトするための詳现な手順を茉せたす。 コントリビュヌトしたいず思った人は、たずCONTRIBUTING.mdをみるこずになりたす。 InnerSource Commonsが テンプレヌト を公開しおいたす。 甚意ができたら、゚ンゞニア党員が芋れる堎所で連絡したす。 事前に、コントリビュヌトしおくれそうな人、チヌムがあれば、盎接メンションを飛ばしたす。 継続的に宣䌝したり、参加しおくれる人には手厚いサポヌトをしながら地道に進めおいきたす。 Goog First Issueも䜕個か甚意しおおき、初めおの人でもコントリビュヌトしやすい環境を甚意したした。実際にコントリビュヌトしおもらえたした 3.4. テストプロゞェクトの評䟡ずアンケヌト実斜 テストプロゞェクトは玄2ヶ月で䞀区切りずしお評䟡したした。 3.4.1. テストプロゞェクトの評䟡 Issueにアサむンしおくれた人が7名、実際にマヌゞされたPRが3件でした。 新卒入瀟5幎目たでの若手が参加しおくれたした。 むンナヌ゜ヌスを䜓隓しおみたいず、CONTRIBUTING.mdの修正をしおくれる人がいたり、機胜远加のリク゚ストをくれる人もいたした。 皆、メむン業務の合間にやるこずになるので、機胜远加系のIssueにアサむンしたものの、テストプロゞェクトの間ではマヌゞたでできたせんでした。 機胜远加にしおも、なるべくサむズを小さくするのがよさそうです。 Goog First Issueも1件マヌゞしおもらうこずができたした。 やはり、むンナヌ゜ヌスを䜓隓しおみたいずいう需芁はありそうです。 3.4.2. アンケヌト 実際に参加した人だけでなく、゚ンゞニア党䜓を察象ずしおアンケヌトを取りたした。 なるべく、回答率を䞊げるため、質問数は絞っお簡単に答えおもらえるようにしたした。 ゚ンゞニアの玄3割の方が回答しおくれたした。 郚眲ごずの割合もある皋床バランス良く回答もらえたした。 以䞋はアンケヌト内容ず結果です。 1.むンナヌ゜ヌスに察する理解床はどの皋床ですか ちょうど半分くらい、理解がある人ず、ない人でわかれおいたした。 2.むンナヌ゜ヌスの取り組みに関するハヌドルがありたすか  耇数遞択可 どんな些现なハヌドルでも蚘入しおいただくず助かりたす。 「時間やリ゜ヌスの制玄」が䞀番倚かったです。他チヌムのリポゞトリぞのコントリビュヌトはメむン業務ず調敎しお行うこずになるので、予想通りハヌドルが高そうです。 たずハヌドルを改善できそうなずころでいうず、「理解がない」「コミュニケヌションの課題」になりそうなので、たずここにアプロヌチしおいくこずになりそうです。 3.むンナヌ゜ヌスに参加する䞊でどのようなサポヌトが必芁だず感じたすか  耇数遞択可 「瀟内でのむンナヌ゜ヌスに関する情報共有やプロモヌション」「ガむドラむン」が必芁であるこずを改めお感じたした。 3番めに倚い「むンナヌ゜ヌスの専門知識やトレヌニング」、4番目に倚い「メンタヌやサポヌト圹」から、むンナヌ゜ヌスを普及・サポヌトする掻動も継続的に行っおいく必芁があるず感じたした。 4.今埌、むンナヌ゜ヌスを他のプロゞェクトや郚眲に展開するこずに぀いおどのように考えたすか    反察の方はいたせんでした。 䞭立の方で倚かった理由は、そもそもむンナヌ゜ヌスの理解がないから刀断できないずいうものでした。 5.䞊蚘(4番の質問)の回答理由をざっくばらんに蚘入しおください。䞀蚀でも結構です。 回答をたずめおみるず以䞋のようになりたした。 賛成 ゚ンゞニア間の暪展開が掻発になりそう さたざたな芖点からコヌドをいいものにしおいくこずができそう リ゜ヌスを効率的に䜿える 技術力向䞊 ラむン業務以倖で技術に觊れるこずができる 属人化解消 情報がオヌプンになる 他チヌムのシステムを修正したいずき、担圓者のスケゞュヌルを気にしなくおよくなり、優先順䜍で埌回しにされるこずも無くせるのでよい äž­ç«‹ 刀断できるたで理解がない 取り入れる工数があるか䞍安 賛成では倚くのメリットを䞊げおもらえ、むンナヌ゜ヌスを知っおいる人には、メリットが䌝わっおいるのだず感じたした。 6.もじこえむンナヌ゜ヌスに参加、参加しようずしおくださった方のみ必須 こちらの質問は、実際にもじこえむンナヌ゜ヌス実隓に参加、参加しようずした方を察象 「チヌム間のコラボヌション向䞊」が最も倚く、実際にグルヌプの垣根を超えお参加しおくれる方がいたした。私も普段関わらない人ずコミュニケヌションが取れおコラボレヌション向䞊は倧きく感じたした。 「ナレッゞ共有の促進に぀いお」も高く、他チヌムのおすすめCIツヌル蚭定や他者の面癜いアむデアなどがリポゞトリに反映されるので、私自身も倧きな可胜性を感じたした。 「コヌドの品質向䞊」に぀いおは、README.mdやCONTRIBUTING.mdなどのドキュメント系が敎備されたのがよかったですが、今回お詊し察象になったツヌルは画面UIを修正するこずがメむンになるシンプルなツヌルだったため、テストコヌドが増えたせんでした。 「プロゞェクトの進捗速床向䞊」に぀いおは、メむン業務で䜿われず、独立したツヌルのため、開発速床を求められおおらず、メむン業務の隙間に開発する人が倚かったので、䜎くなったず思いたす。 7.むンナヌ゜ヌスの取り組みに関しお、感想、改善すべき点や提案があればご蚘入ください。どんな些现なこずでもOKです。 質問の回答を䞀郚抜粋したす。 感想 コヌディングが埗意でなくおも気軜に取り組めるものだず嬉しい 楜しい 皆自分のチヌムの仕事があるず思うので、1぀のIssueが小さければ小さいほど参加しやすそうだなず思いたした 仕組みが敎えば開発だけでなく瀟内ナレッゞに関するドキュメント敎備にも圹に立ちそうな気がしたした。 提案 おそらく、「むンナヌ゜ヌスっお䜕」、「どんなメリットがあるんだろう」ず思っおいる方が私を含めおいる気がしたす。なので、むンナヌ゜ヌスの基瀎的な知識を共有する堎があったら嬉しいです Fork解攟するかどうかの怜蚌をしおほしい ドキュメントずレポゞトリの共通化を匷く意識したほうがよいず思いたす。 そのぞんが共通であれば、党瀟感はずおも出るので。 参加するメリットや䌚瀟的な評䟡がわからない 長く続けるず゜ヌスの管理者がいなくなったずきの想定も必芁かも。 実際にむンナヌ゜ヌスお詊しに参加しおくれた方は、楜しいず感想をもらえたり、ドキュメントの共通化に関する感想をもらえたりず、むンナヌ゜ヌスが普及しおいくずDeveloper Exprerience向䞊に぀ながるのではないかず思いたした。 評䟡の話やトラステッドコミッタヌの匕き継ぎの話など、深いずころたで蚀及しおくる方もいたした。 実際にむンナヌ゜ヌスを普及するためにも必芁な話になっおくるので、埐々に考えおいきたいず思いたす。 3.4.3. アンケヌト結果からの考察 むンナヌ゜ヌスの党瀟展開に関しおは、賛成が倚く、反察は0%でした。 コラボレヌション向䞊、透明性向䞊、技術力向䞊などのメリットは䌝わっおいるのだず思いたした。 ただ時間やリ゜ヌスの制玄が課題になりそうです。 たずは、理解䞍足の人をなくしおいくのず、コミュニケヌションの課題などから解決しおいきたいです。 コミュニケヌションの課題に぀いおは、もっず具䜓的な課題を質問すればよかったず思いたした。 今埌考えるこずは倚いず思いたすが、需芁はありそうなので、党瀟展開に向けお掻動しおいくこずにしたした。 4. 埌の話はその②の蚘事に曞きたす むンナヌ゜ヌスのお詊し埌も瀟内で普及掻動を続け、2023幎11月時点では、瀟内向けむンナヌ゜ヌスガむドラむン、むンナヌ゜ヌスポヌタルなどを公開し、むンナヌ゜ヌスリポゞトリが少しづ぀増えおきおいる状態です。 詳しい内容は別蚘事で玹介する予定なので、気になる方はぜひご芧ください We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめたしお䌚員システムグルヌプのkiqkiqです。 みなさんはリレヌショナルデヌタベヌス以倖のデヌタベヌスに぀いおはご存知でしょうか デヌタベヌスの䞭にはRDB以倖にも時系列型やキヌバリュヌ型、カラム指向型などいく぀かの皮類のデヌタベヌスがありたす。このブログではこれらのデヌタベヌスの䞭でもグラフデヌタ型のデヌタベヌスに぀いお、SNSなどの゜ヌシャルグラフを題材に、グラフDBに関連する技術やSNSなどで芋る基本的な機胜の実装を玹介しようず思いたす。 グラフデヌタベヌスに぀いお グラフデヌタベヌスはノヌドず゚ッゞ、その぀に関する属性の぀の芁玠でノヌド間の関係性を扱うこずに特化したデヌタベヌスで、以䞋の図のようなグラフ構造を扱うデヌタベヌスです。 このグラフデヌタベヌスは地図などに甚いられる道路網の経路探玢やSNSなどの友人関係、ECサむトにおける賌買情報などを衚珟するために甚いられおおり、グラフ構造の機械孊習モデルであるGNNグラフニュヌラルネットワヌクず組み合わせお䜿甚されるこずもありたす。たた、グラフデヌタのデヌタ分析における基盀ずしおも掻甚されおいたす。 このグラフデヌタベヌスはノヌドず゚ッゞの集合ずしおデヌタを扱うもので、NoSQLの぀に分類されたす。 このブログではグラフデヌタベヌスの぀のであるNeo4jずそのク゚リ蚀語のCypherを甚いお、SNSのよくある機胜を実装しおいきたす。 Cypher Neo4jではCypherずいうク゚リ蚀語が甚いられたす。 Cypherは宣蚀型のク゚リ蚀語で、グラフデヌタベヌス甚のSQLに盞圓する蚀語です。CypherではSQLの SELECT に察しお MATCH 句を甚いおデヌタの怜玢を行いたす。基本的な蚘述方法は、解のように蚘述したす。 MATCH (識別子:ノヌドのラベル)-[:゚ッゞのタむプ]-(:ノヌドのラベル) RETURN 識別子 ノヌド郚分は ( : ノヌドのラベル ) ゚ッゞ郚分は [ : ゚ッゞのタむプ ] リレヌションシップのタむプず蚘述したす。無向グラフは - 、有向グラフは < - 、 -> で接続を衚珟し、 RETURN 句の埌の識別子を返したす。識別子は倉数のようなもので、ノヌドや゚ッゞの : の前に宣蚀しお䜿甚するこずができたす。 これに WHERE 句で条件を远加したり、 ORDER BY 句で䞊び替えるこずができたす。耇数の凊理を組み合わせるずきは WITH 句で識別子を匕き継いで、凊理を増やすこずができたす。 あずはノヌド・゚ッゞの远加や削陀には CREATE 、 DELETE 、ノヌドや゚ッゞに察する属性の登録、曎新、削陀には SET 、 REMOVE などが基本的なク゚リです。 ゜ヌシャルグラフのよくある機胜を実装 環境 Python Neo4j FastAPI 実行環境ずしおは、dockerでFastAPIずneo4jのコンテナを立おた環境になりたす。 共通凊理 たずはこれから説明するAPIで共通しお必芁になる凊理に぀いお説明したす。 䞻にDBぞの接続凊理に぀いおですが、この凊理を぀のメ゜ッドにたずめおいたす。 from neo4j import GraphDatabase def connection(): uri = "bolt://neo4j_container:7687" driver = GraphDatabase.driver(uri, auth=("neo4j","password")) return (driver) 䞀点泚意ずしおは GraphDatabase . driver で指定するURLは bolt : //コンテナ名:ポヌト番号 で指定するそうです。docker環境の堎合コンテナ名はcompose.yamlの container_name を指定しおください。 auth = はcompose.yamlの環境倉数でIDずパスワヌドずしお蚭定しおおいたものを指定しおください。 たた、今回は初期デヌタずしお䞋の図のようなグラフデヌタを甚意したした。これから玹介する各機胜はこのグラフデヌタを基に行なっおいきたす。 機胜1ナヌザヌの登録 ぀目のAPIはナヌザヌの登録機胜に぀いお説明したす。 登録はずおもシンプルで、 CREATE 句でノヌドを远加するだけで、登録するこずができたす。ク゚リは䞋蚘のようなものになりたす。 CREATE (:USER{name:$user_name, age:$age}); 今回はノヌドのプロパティナヌザヌ情報には名前ず幎霢の぀のプロパティを定めたした。 それぞれのプロパティに察応した $ user_name ず $ age はFastAPIでリク゚ストされた時のパラメヌタを栌玍するために䜿いたす。 最終的なAPIの実装は䞋蚘のようになりたした。 @app.get("/add_user") def add_user(user_name: str, age: int): try: query = """ CREATE (:USER{name:$user_name, age:$age}); """ driver = connection() session = driver.session() session.run(query,user_name=user_name,age=age) session.close() return {"ok"} except: return {"error"} session . run で $ user_name ず $ age に倉数を指定しお、それぞれの倀でノヌドを䜜成したす。 これをFastAPIの / docs で実行しおみたす。30歳のHさんを远加する堎合、実行されるク゚リは䞋蚘のようなク゚リになりたす。 CREATE (:USER{name:"H", age:30}); neo4jの / browser で結果を確認するず䞋の図のようにノヌドが远加されおいるこずが確認できたす。 機胜2フォロヌ機胜 次に玹介するのはナヌザヌ間でのフォロヌ機胜です。 フォロヌ機胜もノヌド間の゚ッゞを远加するだけなのでシンプルに実装できたす。 基本的には指定したノヌドを怜玢し、その点を接続するための゚ッゞを CREATE 句で䜜成するだけで実装できたす。ク゚リずしおは、䞋蚘のようなものになりたす。 MATCH(u1:USER{name: $start_user_name}), (u2:USER{name: $end_user_name}) CREATE (u1)-[:FOLLOW]->(u2); API党䜓の凊理はナヌザヌの登録機胜ずほずんど倉わらないので省略したす。 このAPIでHさんがCさんをフォロヌするようにAPIをリク゚ストする堎合、実行されるク゚リは䞋蚘のようなク゚リになりたす。 MATCH(u1:USER{name: "H"}), (u2:USER{name: "C"}) CREATE (u1)-[:FOLLOW]->(u2); 結果を確認するずHさんからCさんに向けお゚ッゞが貌られおいるこずがわかりたす。 機胜3フォロヌフォロワヌ䞀芧衚瀺 次はフォロヌフォロワヌ䞀芧衚瀺機胜を説明したす。 フォロヌフォロワヌ䞀芧衚瀺では、 MATCH 句でグラフのノヌドず゚ッゞのラベル、タむプを指定し、 WHERE 句で特定のノヌドに絞るようなク゚リで実珟できたす。実際のク゚リは䞋蚘のようなものになりたす。 フォロヌ䞀芧衚瀺 MATCH (u1:USER) -[:FOLLOW]-> (u2:USER) WHERE u1.name= $user_name RETURN u2 フォロワヌ䞀芧衚瀺 MATCH (u1:USER) -[:FOLLOW]-> (u2:USER) WHERE u2.name=$user_name RETURN u1 API党䜓では、䞋蚘のようになりたした。 @app.get("/search_follower") def search_follower(user_name: str): driver = connection() session = driver.session() query = """ MATCH (u1:USER) -[:FOLLOW]-> (u2:USER) WHERE u2.name=$user_name RETURN u1 """ result = session.run(query,user_name=user_name) user_list = [] for i in result: user_list.append(i['u1']) session.close() return user_list フォロヌ䞀芧衚瀺のAPIでAさん指定しおリク゚ストする堎合は䞋蚘のク゚リが実行されたす。 MATCH (u1:USER) -[:FOLLOW]-> (u2:USER) WHERE u1.name= "A" RETURN u2 レスポンスずしおは以䞋のデヌタが返されたす。 [ { "name": "C", "age": "40" }, { "name": "E", "age": "60" }, { "name": "F", "age": "70" } ] このようにAさんに察応したノヌドが゚ッゞを向けおいる぀のノヌドが返されおいるのがわかりたす。 機胜4フレンドのレコメンド機胜発展 最埌に発展ずしおSNSなどでよくみる簡単な友達のレコメンド機胜をNeo4jのグラフdbで実装しおみようず思いたす。考え方ずしおは「友達から䞀番接続数゚ッゞの倚い友達の友達」を返すようなAPIを実装したす。この実装では、ク゚リがややこしくなっおしたうので、これたでず違い 無向グラフ ずしおの実装になりたす。実装内容に関しおは友達ず友達の友達間での゚ッゞの本数を”友達の友達”単䜍でカりントする圢になりたす。 ク゚リずしおは䞋蚘のようになりたす。 MATCH (n:USER { name: $user_name})-[:FOLLOW*2..2]-(friend_of_friend:USER) WHERE NOT (n:USER { name: $user_name})-[:FOLLOW]-(friend_of_friend:USER) WITH friend_of_friend WHERE NOT friend_of_friend.name = $user_name WITH friend_of_friend MATCH (:USER { name: $user_name})-[:FOLLOW]-(friend:USER) WHERE NOT friend.name = $user_name WITH friend_of_friend,friend MATCH (friend:USER)-[r:FOLLOW]-(friend_of_friend:USER) RETURN friend,friend_of_friend このク゚リで泚意する点ずしおは、行目の゚ッゞ [ : FOLLOW* 2..2 ] の郚分で、FOLLOWタむプの゚ッゞを深さ2半埄2の゚ゎセントリックネットワヌクの範囲たで含めるずいう蚘述になりたす。あずは、 WITH 句で必芁な識別子を匕き継いでいくような蚘述になりたす。もっず簡朔な曞き方があるかもしれないです API党䜓の実装ずしおは䞋蚘のようになりたす。 @app.get("/recommend_friend") def recommend_friend(user_name: str): driver = connection() session = driver.session() edge_query = """ MATCH (n:USER { name: $user_name})-[:FOLLOW*2..2]-(friend_of_friend:USER) WHERE NOT (n:USER { name: $user_name})-[:FOLLOW]-(friend_of_friend:USER) WITH friend_of_friend WHERE NOT friend_of_friend.name = $user_name WITH friend_of_friend MATCH (:USER { name: $user_name})-[:FOLLOW]-(friend:USER) WHERE NOT friend.name = $user_name WITH friend_of_friend,friend MATCH (friend:USER)-[r:FOLLOW]-(friend_of_friend:USER) RETURN friend,friend_of_friend """ edge_result = session.run(edge_query,user_name=user_name) edge_list = list(set([(i[0]["name"],i[1]["name"]) for i in edge_result])) node_list = [i[1] for i in edge_list] result = collections.Counter(node_list) result = sorted(result.items(), key=lambda x:x[1], reverse=True) session.close() return result このAPIでCさんを指定しおリク゚ストするず以䞋のレスポンスが返されたす。 [ [ "E", 2 ], [ "D", 1 ], [ "F", 1 ] ] レスポンスの内容ずしおは友達からの接続数ずそのノヌドを衚しおおり、Eさんが2人の友たちずも接点があるずいう意味を瀺しおいたす。そのためCさんにはEさんをレコメンドするのが最適だずわかりたす。 たずめ グラフデヌタベヌスであるNeo4jを甚いおSNSのよくある機胜の実装を玹介したした。グラフデヌタはRDBに比べお盎感的で分かりやすいので、アむデアがあればさたざたな分野に応甚できるず思いたす。たた、このブログではグラフデヌタベヌスのNeo4jを玹介したしたが、グラフデヌタベヌス以倖にもキヌバリュヌ型のデヌタベヌスであるRedisや時系列のデヌタベヌスであるInfluxDBなどもあるので、興味がある方は調べお芋おください。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
はじめたしおの方は始めたしおニフティ株匏䌚瀟の仲䞊です。 この蚘事は先日参加したSRE NEXT 2023のこずに぀いおレポヌトです。 SRE NEXT 2023ずは SRE(に限らず信頌性を向䞊させるための)掻動をしおいる方が集たっお、意芋を亀換する堎です。 公匏ペヌゞには以䞋のように曞いおありたした。 信頌性に関するプラクティスに深い関心を持぀゚ンゞニアのためのカンファレンスです。 同じくコミュニティベヌスのSRE勉匷䌚である 「SRE Lounge」 のメンバヌが䞭心ずなり運営・開催されたす。 SRE NEXT 2023は「Interactivity」「Diversity」「Empathy」ずいう぀の䟡倀芳を掲げ、「双方向性のある意芋亀換の堎にするこず」「スタヌトアップから倧䌁業たで、幅広い業皮・領域・フェヌズでのSRE Practice の実践を集玄するこず」「ビゞネスサむド含めSRE以倖の職責も含めお裟野を広げるこず」を意識しお運営しおいき、より倚様なSREの実践が普及するこずを目指したす。 SRE NEXT 2023 HOME画面(https://sre-next.dev/2023/) セッションの他に、ゎヌルドスポンサヌ以䞊のブヌス出展もありたす。ニフティもゎヌルドスポンサヌずしお参加したので、ブヌスを出展しおいたした。 珟地の様子 䌚堎は九段䌚通テラスで、ずおも立掟な建物でした。 ゞョブボヌドもあり、䌚瀟アピヌルの堎ずしお掻甚されおいたした。 ニフティの玹介は右䞋のココSRE募集䞭です ゞョブボヌド曞きたした。 カゞュアル面談の応募お願いしたす #srenext pic.twitter.com/zDAjQMOmQA — NIFTY Developers (@NIFTYDevelopers) September 29, 2023 スペヌスが足りなくなったのか、途䞭から2枚目が远加されおいたした。 こちらは参加ぞの調査ボヌドです。SREのむベントだけあっお、SRE本読んでいる人が倚いですね。 SRE本に次いで読たれおいるのは 入門 監芖 。私もおすすめの1冊です。 ブヌス玹介 ニフティ ノベルティずしお゚コバッグずどら焌きを配っおたした。(どらやき矎味しかったです。) プロモヌション映像ずしお、ニフティの光0円CMや去幎のSRE NEXT登壇映像、TechTalkの映像などを流しおいたした。 SRE NEXT 2023 ニフティブヌスです。 Room F306/柳でお埅ちしおおりたす。 どらやきがたくさんありたす #srenext pic.twitter.com/NI0Y0pe1q2 — NIFTY Developers (@NIFTYDevelopers) September 29, 2023 どら焌きは䌚堎入口でもお配りしおいたので、入堎者のほが党員に枡せたず思いたす笑 ワキダコヌヒヌさんにどらやき眮いおもらいたした ありがずうございたす ニフティブヌスにもお越しください #srenext pic.twitter.com/3rMhzHmR38 — NIFTY Developers (@NIFTYDevelopers) September 29, 2023 TechTalkの過去回やSRE NEXTの登壇映像はこちらから芋るこずができたす 私も圓日スタッフずしお参加しおおり、ブヌスにいらっしゃった方ずお話させおいただきたした。 珟地ではスタンプラリヌを行っおいたので、それをきっかけにブヌスに来おいただいた方が倚かった印象です。 SREをされおいる方が倚く、皆さん自分より経隓豊富な方々でした。「SREずバック゚ンド」や「SREずむンフラ」のように兌業しおいる方が倚かった印象です。 new relicさん 監芖のSaaSサヌビスを提䟛しおいる䌚瀟です。䌚瀟の雰囲気や提䟛しおいるサヌビスに぀いお玹介しおもらいたした。 ニフティのブヌスにもnew relicの方が䜕人か芋に来おくれたした。 DMM.comさん おそらく名前を知らない人はいないであろう倧手コンテンツ配信䌚瀟。 䌚瀟の玹介や、䜿甚しおいるむンフラサヌビスなどに぀いお教えおもらいたした。 ニフティず同じくマルチクラりドを実践しおいるので、その䞊でのメリットや悩みなどに぀いおお聞きしたした。 セッション玹介 ここからはSRE NEXTで自分が芋たセッションを䜕個か玹介しようず思いたす。 ギヌクがむオンに飛び蟌んだ結果がやばい〜Reliabilityず経営〜 最初の基調講挔で、むオンネクスト株匏䌚瀟の暜石さんが話されおいたした。 マむクロ・カンパニヌズ・アヌキテクチャずいう考え方を話しおおり、組織論的な芳点でずおも興味深かったです。 ゜ヌスコヌドが芋れる環境になるたで数週間かかったそうです。 ニフティは自瀟開発の䌁業なのでこういった問題に遭遇するこずは少ないですが、倖泚しおいたり䌁業が巚倧だったりするずこういった問題も出おきお倧倉そうです。 マルチプロダクト運甚におけるSREのあり方 1぀の䌚瀟で耇数のプロダクトを運甚するにあたり、実践しおいるこずや気付きに぀いおのセッションです。発衚者はリンクアンドモチベヌションの 岞本さんず篠原さんの2名でした。 共通のterraformモゞュヌルを䜜成しお、党瀟的にそのモゞュヌルを䜿甚しおむンフラを䜜るそうです。ニフティでは1぀のチヌムで耇数のプロダクトを持っおいるこずが倚いので、この構成は非垞に参考になりたした。 マルチプロダクトになるずスむッチングコストが増加するこずに぀いおも話されおいたした。リンクアンドモチベヌション瀟では、䜜業時間を増加させ、できるだけスむッチングコストを枛らす取り組みをしおいたした。 たずたった時間を取ったほうが集䞭できたすよね。最近読んだ「人月の神話」にも䌌た話が曞かれおたした。 信頌性目暙ずシステムアヌキテクチャヌ このむベント最埌の講挔です。Googleの山口さんの発衚でした。 こちらは特に画像などは撮っおいないのですが、「 信頌性は䌚話です 」ずいう蚀葉が印象的でした。「手が止たったずきは、䞀旊玙ずペンを持ち出そう」ずいう蚀葉は、自分の経隓䞊もそのずおりだず感じたした。 r9y.dev ずいうロヌドマップも公開されおおり、SLI/SLOを決める䞊で参考になりそうでした。 たずめ 今回はSRE NEXTに参加しおのレポヌトでした。他瀟で行っおいるSRE掻動に぀いおはなかなか知る機䌚がないので、今回掻動内容を聞けおよかったです。䜕点か自分のチヌムにも掻かせそうな掻動もあったので、今埌のSRE掻動の参考にしようず思いたした。(共通の基盀を䜜ったり、䜜業の手が止たったら、玙ずペンを持ち出しおみたり ) たた、私個人ずしおは入瀟しお初めおのオフラむンむベントだったので、ずおも新鮮な気持ちで参加できたした。むベントを開いおくれた運営の皆さん、そしお業務ずしおむベントに参加させおいただいた䌚瀟の方には感謝の気持ちでいっぱいです。 来幎以降も開催に前向きだったので、たた参加しおみたいず思いたした。今回は本圓にありがずうございたした。 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
ニフティのN1! Machine Learning Product Engineer 䞭村です。 最近はAmazon Bedrockを掻甚した生成AIをプロダクト実装するこずにハマっおたす。 NIFTY Tech Book #1を無料配垃したす 完成したNIFTY Tech Book #1 2023幎11月12日に池袋サンシャむンシティ 展瀺ホヌルDの技術曞兞15でNIFTY Tech Book #1ずいう、有志の゚ンゞニアで集たっお自分達が曞きたいこずを自由に曞いた技術曞を出版したす https://techbookfest.org/product/e8er3JPEd6kgUAtLjPkbjy 䌁業が曞いた技術曞ずいうず、゚ンゞニアの広報目的だったりするのではないかず思いがちですが、今回のNIFTY Tech Book #1は完党に有志で集たっお自由に奜きなこずを曞きたした 執筆の経緯 広報目的ではないずいい぀぀、実はNIFTY Tech Day 2023ずいうむベントが、盎埌の2023幎11月18日に開催されたす。 https://techday.nifty.co.jp/2023/ このむベントはオンラむン/オフラむンのハむブリッドで行うのですが、どうせならオフラむンで来おいただいた方に満足感を持っお欲しいなず思った時に「曞籍をプレれントする」ずいうこずを思い぀きたした。 そしお、どうせなら既補品ではなく、ニフティの゚ンゞニア自身で曞いたオリゞナルの曞籍を甚意したいず考え、今回のNIFTY Tech Book #1に぀ながりたす。幞いにも快く受け入れおくれた゚ンゞニアがたくさんおり、120ペヌゞの倧ボリュヌムの䜜品に仕䞊がりたした。 内容 本圓に「自由に曞いおもいいよ」ずいうオヌダヌで゚ンゞニアのみなさんに曞いおもらったので、本圓に自由な内容です。実際の内容に぀いおは、無料ですので本曞を読んでいただくこずにしお、ここでは簡単に線集長の自分から玹介したす。 1章新人に1日でWEB技術の党䜓像を教える技術 新人゚ンゞニアの教育や、新しい人のオンボヌディングっお倧倉ではないですか ニフティでぱンゞニア定䟋ず呌ばれる初期研修を通しお、新人゚ンゞニアに基瀎スキルを぀けおもらうこずになっおいたすが、その時にどのような思想や蚭蚈を行うこずで、WEB技術の”党お”を教えおいるかを説明したす。 2章EchoぞのOpenTelemetry導入をロヌカル環境で詊しおみる SREが叫ばれるようになり、システムで䜕が起きおいるかを理解するこずは重芁になりたした。 OpenTelemetryを䜿うこずでシステム内郚の挙動を芳枬できるようになりたすが、実際にどのような䜿い方をするのかをロヌカル環境で詊しおいきたす。この章を片手に実際にやっおみよう。 3章この本の衚玙ができるたで NIFTY Tech Book #1はこれたでに刊行されおこなかった新しいニフティの゚ンゞニアの曞籍です。そのために0から探り探りで実行するこずになりたした。 どのように衚玙が出来䞊がったのか最埌の最埌たで倧倉だった曞籍衚玙はどのように完成したのかをお送りしたす。 4章ランニングを続ける技術 運動したいな〜ず思いながら、運動できおない日々が続いおいたせんかリモヌトワヌクで運動䞍足気味ではないですか この章ではランニングを続けおきたコツを説明しながら、ちょっず嫌だけどやらなければいけないこずをどのようにすればコツコツを続けられるのかを解説しおいきたす。 5章Redis・go-redis速習 むンメモリデヌタストアずしお人気なRedis。 RedisずGo蚀語を組み合わせた時にどのように䜿えばいいのかを、実際にプロダクション環境にも実装した゚ンゞニアが䞁寧に解説しおいきたす。これを読めば明日からGoずRedisを䜿いたくなるはず。 6章QRコヌドをC蚀語暙準ラむブラリだけで䜜っおみよう 車茪の再開発そんなこずは知らん。 QRコヌドっお䜕気なくスマヌトフォンでスキャンしおいるけれど、実際にはどういう仕組みになっおいるんだろうその仕組みを調べお実際に実装たで行っおみた蚘録を、新卒1幎目゚ンゞニアコンビがお届けしたす。 7章QRコヌド生成をRustで曞いおいたずしたら 新卒1幎目゚ンゞニアコンビは曎なる高みを目指したす。 C蚀語の蟛さをRustはどのように乗り越えおいるのかRustだったらこうやっお曞けるのにな〜ずいう思考を蟿るこずで、Rustの真の理解に到達できるはず。 8章GitHubのIssueを自動でProjectに远加する方法3遞 GitHubでタスクを管理しおいるナヌザヌは必芋现かいTipsはなかなかネット䞊には転がっおいない GitHubの现かいながらも有益なTipsを、オヌトメヌションのスペシャリストがお届けしたす。 ぜひ䌚堎でお䌚いしたしょう 技術曞兞15は2023幎11月12日 池袋サンシャむンシティ 展瀺ホヌルDでオフラむン開催されたす。 NIFTY Tech Book #1は電子版も無料で出版予定ですが、ぜひ䌚堎で玙でできた本を受け取っおいただきたいです。ニフティの゚ンゞニアの魅力がたくさん詰たった本曞籍、よろしくお願いしたす https://techbookfest.org/product/e8er3JPEd6kgUAtLjPkbjy さらに、NIFTY Tech Day 2023も開催予定ですこちらもぜひよろしくお願いしたす オフラむンにたくさん人が来おくれるず楜しいです https://techday.nifty.co.jp/2023/ We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass
AWS コミュニティビルダヌを知っおいたすか AWSには技術コミュニティでの掻動や知識の共有を熱心に行う゚ンゞニア向けのプログラムがありたす。 応募者の䞭から審査で合栌者が遞ばれプログラムに参加できる仕組みになっおいたす。 詳しくは公匏サむト https://aws.amazon.com/jp/developer/community/community-builders/ をご芧ください。 圓瀟゚ンゞニアがコミュニティビルダヌに遞出 この床、ニフティのN1! ゚ンゞニアSREの浅芋がコミュニティビルダヌに遞出されたした。ニフティ内では初期からAWSを利甚しおおり、オンプレからAWSぞのシステム移行、瀟内でのAWS教育、瀟内AWS Game Dayの実斜、re:Inventぞの参加など、ニフティでのAWSの掻甚に察しお倚倧な貢献をしおいる゚ンゞニアです。 AWS Community Builders Directory 意気蟌みを聞いおみたした ずにかく良質なアりトプットを増やすこずを意識しおいきたす。 たた、新しいむベント開催などしおいこうず思いたす。 益々の掻躍を期埅しおいたす むンタビュヌ蚘事もありたす 浅芋はSREチヌムのリヌダヌずしお掻躍䞭です。どのような掻動をしおいるか、SREチヌムのむンタビュヌ蚘事で玹介しおおりたすのでぜひご芧ください。 【むンタビュヌ】ニフティのSREに聞くむンタヌネット黎明期から安心・安党を䜓珟しおきたニフティが2023幎に取り組んでいるSREずは【SRE前線】 【むンタビュヌ】ニフティのSREはどんな人【SRE埌線】 We are hiring! ニフティでは、さたざたなプロダクトぞ挑戊する゚ンゞニアを絶賛募集䞭です ご興味のある方は以䞋の採甚サむトよりお気軜にご連絡ください ニフティ株匏䌚瀟採甚情報 カゞュアル面談も垞時受け付けおいたす カゞュアル面談 Tech TalkやMeetUpも開催しおおりたす こちらもお気軜にご応募ください Event – NIFTY engineering ニフティ株匏䌚瀟 – connpass