ãã®èšäºã¯ã ãããã£ã°ã«ãŒã 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