ããã«ã¡ã¯ãã€ã³ãã©ãšã³ãžãã¢ã® é«å±± ã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®25æ¥ç®ã®èšäºã§ãã ã¯ããã« ãšãã°ã¢ å
¥ç€ŸåŸã« AWS ãåŸã
ã«è§Šãå§ã æ°å¹ŽçµéããŸããã æåã¯Webã³ã³ãœãŒã«ããããããããŠããã®ã§ãããCloudFormationã§ã³ãŒãåãé²ããã AWSCLIã SDK ã䜿ãããã«ãªããæè¿ã¯ Ruby ã§ AWS ãªãœãŒã¹ã®æ
å ±ååŸãæäœãããããšãå€ããªã£ãŠããŸããã (以äžã Rubyã§AWSãªãœãŒã¹ã®æ
å ±ååŸãæäœããã ããšã AWSãRubyã§æäœãã ãšè¡šçŸããŸã) AWS ã Ruby ã§æäœããããã«ãªã£ãçç±ã¯ä»¥äžã§ãã ããããWebã³ã³ãœãŒã«ã¯èŠæ(ãšããããæã)ã§ã CLI ã§æäœãããæŽŸã§ãã æ§é çãªããŒã¿ãæ±ãã®ã¯ Shell ã¹ã¯ãªãã ã ãšå³ãã(jqãå«ã) Ruby on Rails (以äžã Rails ãšè¡šèšããŸã)ã䜿ã£ãããšãããã®ã§ã Ruby ã«å°ãã¯æ
£ããŠãã BUYMA ã§ã¯ Rails ãæ¡çšããŠããã®ã§ã瀟å
ã§èãã AWS ãæäœããã«ã¯ python (+boto3)ã䜿ã£ãŠãããŠãŒã¶ã®æ¹ãå§åçã«å€ãããªæ°ãããŸããã python ãšæ¯èŒããŠããããã§ã¯ãªãã®ã§ãçæèœã¡æã¯åŠããªãèšäºã«ãªã£ãŠãŸãã çžæ§ãè¯ããšæãçç± AWS ãš Ruby ã¯çžæ§ãè¯ããšæãçç±ãããã¯ããŒã¿ã® ã·ãªã¢ã©ã€ãº ãç°¡åã«ã§ããããã§ãã ãã®äžç¹ã«å°œããã®ã§ãããã§èšäºçµäºã§ãè¯ããããã ã·ãªã¢ã©ã€ãº ãšã¯ ã·ãªã¢ã©ã€ãº ãšããã®ã¯ ããŒã¿ããªããžã§ã¯ãããã¡ã€ã«ã«æžã蟌ã¿ã§ããããã«å€æããããšã§ãã å察ã¯ã ã·ãªã¢ã©ã€ãº ã èšãã«ããã§ããã ãã£ãŠã¿ãã ã·ãªã¢ã©ã€ãº 㯠yaml ã©ã€ãã©ãªã䜿ãããªããžã§ã¯ãã yaml åããŠããã¡ã€ã«ã«ä¿åããã ãã§ãã $ export AWS_REGION = " ap-northeast-1 " $ pry [ 1 ] pry(main)> require ' aws-sdk-ec2 ' => true [ 2 ] pry(main)> require ' yaml ' => true [ 3 ] pry(main)> ec2_client = Aws :: EC2 :: Client .new(); [ 4 ] pry(main)> ec2_data_list = ec2_client.describe_instances(); [ 5 ] pry(main)> File .open( " ec2_data_list.yml " , ' w ' ){|h| h.write ec2_data_list.to_yaml} => 896272 [ 6 ] pry(main)> quit $ ls -l ec2_data_list.yml -rw-rw-r-- 1 ec2-user ec2-user 896272 Dec 21 15 : 49 ec2_data_list.yml ã ã·ãªã¢ã©ã€ãº ãåãããã«ã yaml ã©ã€ãã©ãªã䜿ã£ãŠloadããã ãã§ã â» aws-sdk-ec2 ã require ããå¿
èŠã¯ãããŸã $ pry [ 1 ] pry(main)> require ' aws-sdk-ec2 ' => true [ 2 ] pry(main)> require ' yaml ' => true [ 3 ] pry(main)> ec2_data_list = YAML .load_file( " ec2_data_list.yml " ); [ 4 ] pry(main)> p ec2_data_list.reservations.count; 149 ç°¡åã§ããã ã·ãªã¢ã©ã€ãº ã§ããããšã®äœãå¬ããã®ã ç°¡åã« ã·ãªã¢ã©ã€ãº ã§ããããšã¯ ããã£ãŠããã ãããšæããŸãããããã®äœãå¬ããã®ãïŒ ããŒã¿æ§é ã ãã®ãŸãŸãã¡ã€ã«ã«ããŠããããèªã¿èŸŒãããšãã§ããã®ã§ 以äžãåé¢ããããšãã§ããŸãã æéããããããŒã¿ååŸã®åŠç ãããã詊è¡é¯èª€ãããããŒã¿æŽåœ¢ã®åŠç ðãå¬ããããšãªã®ã§ãããäŒãããŸããããå®éã«ãã£ãŠã¿ãŸãããã ã¹ã¯ãªãã ã®äŸ ããŒã¿ãååŸãã ã¹ã¯ãªãã ãŸãããŒã¿ãååŸãã ã¹ã¯ãªãã ã§ãã EC2 ã€ã³ã¹ã¿ã³ã¹ ãå€ãå Žå㯠next_token ã nil ã«ãªããŸã§ã«ãŒãããå¿
èŠããããŸãã (ããŒã¿ãå°ãªããã°äžèŠã§ã) ãã㯠ã§ããã ããã£ã«ã¿ãŒããæ¹ãè¯ãã§ãããä»åã¯æ€èšŒãªã®ã§ããŠããŸããã ããŒã¿ååŸã¯æ°ç§çšåºŠã§ãããæ€èšŒã®ãã³ã«ååŸãçŽãã¯å°å³ã«ã¹ãã¬ã¹ã§ãããã $ cat get_all_ec2_data.rb #!/usr/bin/env ruby require ' aws-sdk-ec2 ' require ' yaml ' ec2_client = Aws :: EC2 :: Client .new() all_ec2_data_list = [] token = nil loop do ec2_data_list = ec2_client.describe_instances({ next_token : token}) token = ec2_data_list.next_token all_ec2_data_list += ec2_data_list.reservations break if token.nil? end File .open( " all_ec2_data_list.yml " , ' w ' ){|h| h.write all_ec2_data_list.to_yaml} ã€ã³ã¿ã©ã¯ãã£ã ã·ã§ã«(pry)ã§ç¢ºèª 次ã¯ããŒã¿æ§é ããããŒã¿ãã©ããã£ãŠæŽåœ¢ããã確èªããŸãããã 以äžã¯ Nameã¿ã°ã®ååŸæ¹æ³ã確èªããæã®ãã°ã§ãã [ 1 ] pry(main)> require ' aws-sdk-ec2 ' => true [ 2 ] pry(main)> require ' yaml ' => true [ 3 ] pry(main)> [ 4 ] pry(main)> all_ec2_data_list = YAML .load_file( " all_ec2_data_list.yml " ); [ 5 ] pry(main)> all_ec2_data_list[ 6 ].instances.first.tags => #<struct Aws::EC2::Types::Tag key="Name", value="Test-BM-Rails-19">, #<struct Aws::EC2::Types::Tag key="role", value="Railsweb">, #<struct Aws::EC2::Types::Tag key="Service", value="Buyma">, #<struct Aws::EC2::Types::Tag key="CreateUser", value="takayama">, [ 6 ] pry(main)> all_ec2_data_list[ 6 ].instances.first.tags.class => Array [ 7 ] pry(main)> all_ec2_data_list[ 6 ].instances.first.tags.find{|tag|tag[ " key " ]== " Name " } => #<struct Aws::EC2::Types::Tag key="Name", value="Test-BM-Rails-19"> [ 8 ] pry(main)> all_ec2_data_list[ 6 ].instances.first.tags.find{|tag|tag[ " key " ]== " Name " }[ " value " ] => " Test-BM-Rails-19 " åEC2 ã€ã³ã¹ã¿ã³ã¹ ã®ena_supportãæå¹ã«ãªã£ãŠããã©ããããã§ãã¯ãã ã¹ã¯ãªãã åEC2 ã€ã³ã¹ã¿ã³ã¹ ã® ena_support ãæå¹ã«ãªã£ãŠããã©ãã ãã§ãã¯ãã ã¹ã¯ãªãã ãæžããŠã¿ãŸããã ïŒäŸãšããŠè¯ããã®ãæãã€ããªãã£ãã§ãããïŒ $ cat check_all_ec2_ena_support.rb #!/usr/bin/env ruby require ' aws-sdk-ec2 ' require ' yaml ' all_ec2_data_list = YAML .load_file( " all_ec2_data_list.yml " ) all_ec2_data_list.each do |ec2| name = ec2.instances.first.tags.find{|tag|tag[ " key " ]== " Name " }[ " value " ] puts "#{ name } : #{ ec2.instances.first.ena_support }" end 以äžã®ãããªæãã§åºåãããŸãã $ ./check_all_ec2_ena_support.rb | head -5 Test-Railsweb-Server : true Test-Phpweb-Server : true Test-EC2-Instance : false Test-Airflow-Server : false Test-Redash-Server : false EC2ã®ã¿ã°ã ãåã£ãŠãã¡ã€ã«ã«ä¿åãã ã¹ã¯ãªãã æ¬¡ã¯ EC2ã®ã¿ã°ã ãåã£ãŠãã¡ã€ã«ã«ä¿åãã ã¹ã¯ãªãã ãäœæããŠã¿ãŸããã $ cat check_all_ec2_tags.rb #!/usr/bin/env ruby require ' aws-sdk-ec2 ' require ' yaml ' def convert_tags_to_hash (tags) hash_tags = {} tags.each{|e| hash_tags[e[ " key " ]] = e[ " value " ]} hash_tags end all_ec2_data_list = YAML .load_file( " all_ec2_data_list.yml " ) all_ec2_tag_info_list = {} all_ec2_data_list.each do |ec2| tags = convert_tags_to_hash(ec2.instances.first.tags) all_ec2_tag_info_list[tags[ " Name " ]] = tags end File .open( " all_ec2_tag_info_list.yml " , ' w ' ){|h| h.write all_ec2_tag_info_list.to_yaml} å®è¡ããŠã¿ãŸãã $ ./check_all_ec2_tags.rb $ head all_ec2_tag_info_list.yml --- Test-Railsweb-Server : Name : Test-Railsweb-Server role : Railsweb CreateUser : takayama Test-Phpweb-Server : Name : Test-Phpweb-Server role : Phpweb CreateUser : takayama Test-EC2-Instance : yaml ã«ãªã£ãŠãããšãå¯èªæ§ãé«ããšãããã¡ãªããã§ãïŒ ãã£ãããçµè« ãšããããšã§ã ã·ãªã¢ã©ã€ãº ã®ç°¡åããš ã¡ãªãããããã£ãŠããã ããã®ã§ã¯ãªãããšæããŸãã ã¡ãªãããŸãšã ãã®ãŸãŸã®ããŒã¿æ§é ã§ä¿åã§ãã ã€ã³ã¿ã©ã¯ãã£ã ã·ã§ã«ã§ã®ç¢ºèªãæ€èšŒãããããã ããŒã¿ã®ååŸãšããŒã¿æŽåœ¢ãªã©ã®åŠçãåãããã yaml ã§ä¿åããã®ã§ å¯èªæ§ãé«ã Ruby ã§ã®èªèšŒæ
å ±ã®ååŸ ãããŸã§ã®æ€èšŒã§ã¯ ãããããããããã Readæš©éã®ããEC2äžã§å®è¡ããŠããã®ã§ èªèšŒæ
å ±ã®ååŸã¯äžèŠã§ããããPCäžãªã©ä»ã®å Žæã§ AWS ã® SDK ã䜿çšããå Žå㯠èªèšŒæ
å ±ã®ååŸãå¿
èŠã§ãã $ ls -l ~/.aws/cli/cache/ total 24 -rw------- 1 takayama staff 1421 12 8 20:16 3a9ab49ce67fe5806c5af3d5a378fbbb470561d9.json -rw------- 1 takayama staff 1445 10 24 15:24 65d08609cd764dc442d836e7665fbbd663992aea.json -rw------- 1 takayama staff 1433 8 25 16:07 6c11869d293d59bf5a50ceef707e37b36524415d.json AWSCLIã ãšãäžæèªèšŒæ
å ±ãä¿åããåå©çšã§ããŸããã Ruby ã® SDK ã䜿ã£ãŠ ã¹ã¯ãªãã ãäœã£ãŠããå Žåã¯åå©çšã§ããã ã¹ã¯ãªãã ãå®è¡ãããã³ã«èªèšŒæ
å ±ãååŸãçŽããªããšãããªãã®ãé£ç¹ã§ããã ããããããã ã·ãªã¢ã©ã€ãº ã§è§£æ±ºã§ããŸãããããã ã·ãªã¢ã©ã€ãº ããïŒ ä»¥äžã®ãããªæãã§ãã role_credentials = Aws :: AssumeRoleCredentials .new( client : sts_client, ...) role_credentials.client.config.retry_backoff = nil role_credentials.client.config.defaults_mode_config_resolver = nil File .open( " role_credentials.yml " , ' w ' ){|h| h.write role_credentials.to_yaml} ãã®ãŸãŸä¿åãããšèªã¿èŸŒãæã«ãšã©ãŒã«ãªãã®ã§ äžéšã®äžèŠãªããŒã¿ãåé€ããŠããä¿åããå¿
èŠããããŸããã aws-sdk-core ã®ããŒãžã§ã³ã«ãã£ãŠåé€ããå¿
èŠã®ããããŒã¿ãå€ããããã§ãããå€ãããŒãžã§ã³ã ãš retry_backoff ã®ã¿åé€ã§å€§äžå€«ã§ããã ææ°ããŒãžã§ã³ã ãš defaults_mode_config_resolver ãåé€ããå¿
èŠããããŸããã åé€ããŠãåäœã«ã¯åé¡ãªãããã§ããã èªèšŒåšãã®æ©èœã¯ã¯ã©ã¹ã«ã㊠ããããã® ã¹ã¯ãªãã ã§ç°¡åã«äœ¿ããããã«ããŠããã®ã§ããã AWSCLIã䜵çšããŠäœ¿ãå Žå èªèšŒæ
å ±ã®ååŸã2åã«ãªã£ãŠããŸãåé¡ããããŸãã AWSCLIã䜵çšããå Žåã®èªèšŒ ãšããããšã§ãAWSCLIã®äžæèªèšŒæ
å ±ãã¡ã€ã«ã Ruby ã§ãäœ¿ãæ¹æ³ãèããŸããã ç°¡åã«æžããšã以äžã®ãããªæãã§ äžæèªèšŒæ
å ±ãã¡ã€ã«( json )ãããŒã¹ã㊠ç°å¢å€æ° ãšããŠèšå®ããã ãã§ãã jqå«ãã ãã©ããã®ãããã¯ããããã awscli_credentials_cache=~/.aws/cli/cache/xxxxx.json export AWS_ACCESS_KEY_ID= $( jq -r ".Credentials.AccessKeyId" < $awscli_credentials_cache) export AWS_SECRET_ACCESS_KEY= $( jq -r ".Credentials.SecretAccessKey" < $awscli_credentials_cache) export AWS_SESSION_TOKEN= $( jq -r ".Credentials.SessionToken" < $awscli_credentials_cache) export AWS_REGION=ap-northeast-1 å®éã«è©ŠããŠã¿ãŸããã $ awscli_credentials_cache=~/.aws/cli/cache/3a9ab49ce67fe5806c5af3d5a378fbbb470561d9.json $ export AWS_ACCESS_KEY_ID= $( jq -r ".Credentials.AccessKeyId" < $awscli_credentials_cache) $ export AWS_SECRET_ACCESS_KEY= $( jq -r ".Credentials.SecretAccessKey" < $awscli_credentials_cache) $ export AWS_SESSION_TOKEN= $( jq -r ".Credentials.SessionToken" < $awscli_credentials_cache) $ export AWS_REGION=ap-northeast-1 $ pry [ 1 ] pry(main) > require 'aws-sdk-ec2' = > true [ 2 ] pry(main) > ec2_client = Aws::EC2::Client.new(); = > #<Aws::EC2::Client> æ°ãã«èªèšŒæ
å ±ãååŸããã«å®è¡ã§ããŸããã ã¹ã¯ãªãã ã¹ã¯ãªãã ã«ãããã®ã¯ãã¡ãã§ãã( mac ã䜿ã£ãŠããã®ã§ãdataãgdateã«ãªã£ãŠããŸã) ã¹ã¯ãªãã(é·ãã®ã§ãæãç³ãã§ãã) $ cat create_set_env.sh #!/bin/bash help () { echo -e " \n --- usage $0 <awd_profile_name> \n " exit } get_jq() { jq -r " $2 " < $awscli_credentials_cache } mk_credential_file() { rm -f ~/.aws/cli/cache/* aws sts get-caller-identity --profile $1 > /dev/null awscli_credentials_cache= $( ls -1tr ~/.aws/cli/cache/* | tail -1 ) rm -f $credential_file echo "export AWS_ACCESS_KEY_ID= $( get_jq .Credentials.AccessKeyId ) " >> $credential_file echo "export AWS_SECRET_ACCESS_KEY= $( get_jq .Credentials.SecretAccessKey ) " >> $credential_file echo "export AWS_SESSION_TOKEN= $( get_jq .Credentials.SessionToken ) " >> $credential_file echo "AWS_Expiration= $( get_jq .Credentials.Expiration ) " >> $credential_file echo "export AWS_REGION=ap-northeast-1" >> $credential_file echo -e " \n --- creation of $credential_file was completed!!" echo -e " please exec fllow command" echo -e " source ./ $credential_file \n " exit } check_expiration_time() { local expiration_time= $( awk -F "=" '$0 ~ /AWS_Expiration/{print $NF}' $credential_file) local expiration_unixtime= $( gdate -d " $expiration_time " "+%s" ) local current_unixtime= $( gdate "+%s" ) local diff_time= $(( expiration_unixtime - current_unixtime - 60 )) [ 0 -lt $diff_time ] && echo ok } [ $# -ne 1 ] && help credential_file=set_env.sh [ ! -f $credential_file ] && mk_credential_file $1 [ " $( check_expiration_time ) " != "ok" ] && mk_credential_file $1 echo -e " \n --- no need to update !!" echo -e " please exec fllow command" echo -e " source ./ $credential_file \n " $ ./create_set_env.sh < awd_profile_name > Enter MFA code for arn:aws:iam:: 123456789012 :mfa/takayama: --- creation of set_env.sh was completed!! please exec fllow command source ./set_env.sh $ source ./set_env.sh $ pry [ 1 ] pry(main) > require 'aws-sdk-ec2' = > true [ 2 ] pry(main) > ec2_client = Aws::EC2::Client.new() = > #<Aws::EC2::Client> æå¹æéã1å以å
ã«åããå Žåã¯èªèšŒæ
å ±ãåååŸããããã«ããŠãããŸãã ããããŒã«äœã£ã ã¹ã¯ãªãã ã§ äžæèªèšŒæ
å ±ã®ãã¡ã€ã«ãå
šæ¶ãããŠããã®ãã€ã±ãŠãªãã§ãããåèã«ããŠã¿ãŠãã ããã ãã®æ¹æ³ã¯ Ruby ã¹ã¯ãªãã 以å€ã§ãã AWS ã® ç°å¢å€æ° ã§èªèšŒæ
å ±ååŸã§ããæ©èœãªã䜿ããŸãã äŸãã° Serverless Framework ãšãã Terraform ãšã (æè¿ è§Šã£ãŠããªãã®ã§ã 確èªã§ããŠãŸããã) å®é å®éã«ã¯ ã¯ã©ã¹ãã¢ãžã¥ãŒã«ãäœæããŠDRYãªæãã§ ã¹ã¯ãªãã ãäœã£ãŠããŸãã ãŸããäŸã㰠以äžã®ãããªæ©èœã§ Ruby ã䜿çšããŠããŸãã CloudFormationã¹ã¿ãã¯äœæã倿Žã»ããäœæã倿Žã»ããã®ç¢ºèª ELBãžã®ã€ã³ã¹ã¿ã¹ã®çµã¿èŸŒã¿ãåãé¢ã ã»ãã¥ãªãã£ã°ã«ãŒããžã®è¿œå æŽæ°çšWebã¢ã㪠åçš®èª¿æ» etc ãã®äžãã2ã€ç޹ä»ããŸãã 倿Žã»ããã®ç¢ºèªæ©èœ CloudFormationã¹ã¿ãã¯ã®å€æŽã»ãã㯠以äžã確èªããŠããé©å¿ããããã«ããŠããŸãã ãã³ãã¬ãŒãã®å·®å ãã©ã¡ãŒã¿ã®å€æŽ ã¿ã°ã®å€æŽ ãªãœãŒã¹ãäœãçŽãããã 以äžãç¢ºèªæã®å
容ã§ãã $ ./scripts/check_change_set.sh Lb-Instance-01.yml === Stack Name: Test-Lb-Instance-01 === Diff Check ================================================================ --- [Info]: Lb-Instance-01.yml Template Difference Exist !!! Instance: Instance: InstanceType: { Type: String } InstanceType: { Type: String } Role: { Type: String } Role: { Type: String } Instance: Instance: Type: AWS::EC2::Instance Type: AWS::EC2::Instance > - { Key: addtag, Value: dummy } - | - | RecordSet: RecordSet: Type: AWS::Route53::RecordSet Type: AWS::Route53::RecordSet === Change-Set Check ================================================================ --- - :logical_resource_id: Instance ------------------------- :resource_type: AWS::EC2::Instance :action: Modify :replacement: Conditional !!!!!!!!!!!!!!!!!!!!!!!!! :details: - :attribute: Tags :name: :change_source: - :attribute: Properties :name: InstanceType :change_source: ParameterReference - :attribute: Properties :name: InstanceType :change_source: DirectModification - :logical_resource_id: RecordSet ------------------------- :resource_type: AWS::Route53::RecordSet :action: Modify :replacement: False :details: - :attribute: Properties :name: ResourceRecords :change_source: ResourceAttribute === Change-Set Params Check ================================================================ NAME | CURRENT | NEW | STATUS -------------|----------|-----------|---------- InstanceType | t3.small | t3.medium | change Role | lb | lb | no change === Change-Set Tags Check ================================================================ NAME | CURRENT | NEW | STATUS -----------|---------------------|---------------------|---------- Name | Test-Lb-Instance-01 | Test-Lb-Instance-01 | no change Role | lb | lb | no change CreateUser | dummy | takayama | change === Validation Check ================================================================ --- [Info]: Lb-Instance-01.yml Validation Check OK === Lint Check ====================================================================== --- [Info]: Lb-Instance-01.yml Lint Check OK è£è¶³ Shell ã¹ã¯ãªãã ãå®è¡ããŠãŸãããè€æ°ã®Shell ã¹ã¯ãªãã ãš Ruby ã¹ã¯ãªãã ãã©ããã³ã°ããŠããŸãã ãã³ãã¬ãŒãã®å·®å㯠差åãšé
ç®åã®ã¿æœåºããŠããã®ã§ãããã¥ããã§ãããä»å㯠- { Key: addtag, Value: dummy } ã®è¡ã ãã远å ã«ãªã£ããšããçµæã§ãã ã»ãã¥ãªãã£ã°ã«ãŒããžã®è¿œå æŽæ°çšWebã¢ã㪠ãã¡ãã¯Webã¢ããªãªã®ã§ããããªã¢ãŒãã¯ãŒã¯ãå§ãŸã£ãæã« ç°¡æçã«ã»ãã¥ãªãã£ã°ã«ãŒããžåã¡ã³ããŒã® IPã¢ãã¬ã¹ ã远å ããããšæã£ãŠäœæããæ©èœã§ãã AWS ã Ruby ã§æäœããããšã«æ
£ããŠããã®ã§ã Rails ã¢ããªã ãããšç°¡åã«äœæããããšãã§ããŸããã (ãã®æ©èœèªäœã¯ ãšããããã§äœæãããã®ã§ãã æè¿ ä»ã®æœçã§ ã»ãŒäžèŠã«ãªã 圹ç®ãçµããŸããã) ã»ãã¥ãªãã£ã°ã«ãŒããžã®è¿œå æŽæ°çšWebã¢ã㪠æåŸã« ä»å㯠Ruby ã® ã¹ã¯ãªãã ã®è©±ãããŸããã Ruby ã® ã¹ã¯ãªãã ã£ãŠ ããŸãæžããŠãã人ãããªãã€ã¡ãŒãžãããã®ã§ããããã£ããæžããããã®ã§ã¯ãªãããšæããŸãã AWS ã§æ
å ±ååŸãããšè€éãªããŒã¿æ§é ã§è¿ã£ãŠããããšãå€ãã®ã§ ã·ãªã¢ã©ã€ãº ãç°¡åã«ã§ãã Ruby ãéžæè¢ã«å
¥ããŠãè¯ãããªãšæããŸããã ãã ã€ã³ãã©ãšã³ãžãã¢ã§ã¯ ããã«æžããŠãã人ãå°ãªããšæãã®ã§ãå¯èªæ§ã«æ°ã䜿ã£ãã ã³ã¡ã³ãã§èª¬æããã£ããæžããã ä»ã®äººã®è¿·æã«ãªããªãããã«ããæ¹ãè¯ãããã ãªãšã¯æããŸãã(èªæã蟌ããŠ) ã©ãªããã®åèã«ãªããã°å¹žãã§ãã ãã¡ãã§ Enigmo Advent Calendar 2022 ã¯ä»¥äžãšãªããŸãã 2023幎ããããããé¡ãããŸãïŒ
ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®23æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ã ãšãã°ã¢ åæŸã§ãã ããŒã¿æŽ»çšæšé²å®€ãšããããŒã ã§ãªãŒããŒããããŠããã ããŠããŸãã ããŒã ã«ã¯ããŒã¿ã¢ããªã¹ãïŒåã瀟å
ã®æ¥åã·ã¹ãã ãéçºããGASãšã³ãžãã¢ïŒåããããŠç§ã®èšïŒåãæå±ããŠããŸãã ç®æ¬¡ ç®æ¬¡ ãšãã°ã¢ãåãå·»ãITç°å¢ AppSheetãšã¯ AppSheetã«ããã¢ããªã®éçº AppSheetéçºã®ãã㌠1. ããŒã¿ãçšæ 2. ããŒã¿ãåã蟌㿠3. ã¢ããªãäœæ 4. ã¢ããªãã«ã¹ã¿ãã€ãº 5. ã¢ããªãå
¬éïŒãããã€ïŒ 6. ã¢ããªãã·ã§ã¢ AppSheet è§Šã£ãŠã¿ãææ³ è¯ãã£ãç¹ ä»åã®æ€èšŒã§ã¯åãããªãã£ãç¹ äžæºã»äžå®ã«æã£ãç¹ æåŸã« ãšãã°ã¢ ãåãå·»ãITç°å¢ ãšãã°ã¢ ã§ã¯æäŸããŠãããµãŒãã¹ã BUYMA ãšããæµ·å€é販ãµã€ãïŒ ECãµã€ã ïŒãšããããšããããæ¥åžžçãªæ¥åã«ãããŠå€çš®å€æ§ãªã·ã¹ãã ãITãµãŒãã¹ãããŒã«ã掻çšããŠããŸãã 䜿çšããŠããã·ã¹ãã ãåé¡ãããšã BUYMA ã®ç®¡çç»é¢ BUYMA ã®æ¥åãè¡ãäžå¿çãªã·ã¹ãã ã§ãã ãã£ãããšèŠä»¶ãè©°ããäžã§ãšã³ãžãã¢ã«ãã£ãŠéçºãããŸãã ã¢ããªã±ãŒã·ã§ã³ãœããïŒããŒã«ïŒ ãœãããŠã§ã¢ã»ãã³ããŒãæäŸããŠããããŒã«ãããªãŒã§äœ¿çšã§ããããŒã« äŸãã°ä»¥äžã®ãããªããŒã«ãããã«ããããŸãã Gmail ã Outlook ãªã©ã®ã¡ãŒã«ãœãã Google Spreadsheetã Excel ãªã©ã® 衚èšç® ãœãã Google SlidesãPower Pointãªã©ã®ãã¬ãŒã³ããŒã·ã§ã³ããŒã« ç§äžž ãCodEditoerãªã©ã® ããã¹ããšãã£ã¿ desknetâs ã ãµã€ããŠãº ãªã©ã® ã°ã«ãŒããŠã§ã¢ Google Analytics ãRTmetricsãªã©ã® ã¢ã¯ã»ã¹è§£æ ããŒã« LookerãTableauãRedashãªã©ã®BIããŒã« ãªã©ããªã©ããªã©ã æè¿ã¯ãã©ãŠã¶äžã§å©çšã§ããããŒã«ãå€ãã§ããã ïŒã¡ãªã¿ã«äžã«ãããããŒã«ãç§ã¯è¬ã«å
šéšäœ¿ã£ãããšãããŸãã幎ã®åãïŒïŒ ãå©ãããŒã« 管çç»é¢ã§ã¯ã«ããŒã§ãããã¢ããªã±ãŒã·ã§ã³ãœããã ãã§ãã«ããŒã§ããªãé åã 人åã§è¡ã£ãŠããç¹°ãè¿ãäœæ¥ãèªååïŒãã¿ã³ã²ãšã€ã§å®è¡ïŒããããŒã«ããè€æ°ã®ã¢ããªã±ãŒã·ã§ã³ãœãããçµã¿åãããŠè¡ã£ãŠããäœæ¥ãçµ±åããããŒã«ãªã©ã 代衚çã®ãã®ãšããŠã¯ Excel ãš VBA ãçµã¿åãããæ¥åå¹çåããŒã«ã ãµãŒãã¹ã®æ¹åãéçšã»ä¿å®ã§å¿ãããšã³ãžãã¢ã«éçºããé¡ãããããšãã§ãããçŸå Žã®ITã«è©³ããã¡ã³ããŒããããã§èª¿ã¹ãªããéçºããããšãå€ããïŒç§ããããŸã§æå±ããŠããäŒæ¥ãäžè¬è«ãšããŠãïŒ ããŒã«ã䜿ãã人åã§è¡ã£ãŠããããšãå€ãããã®æ¥åã¯ãšãŠãçç£æ§ãäœããïŒæ¥æ¬ã® åŽåçç£æ§ ã OECD 37å çåœäž21äœïŒ2020幎床ïŒãšäœè¿·ããŠããïŒã€ã®èŠå ããšãå¯ãã«æã£ãŠããŸããïŒ ãšããããšã§ïŒïŒïŒ ãšãã°ã¢ ã§ããã®æã®ãå©ãããŒã«ã®éçºã«åãå
¥ããŠããŸãã Google Spreadsheet + GASã®ããã«ã Google WorkspaceïŒæ§ G SuiteïŒã Google Cloud( GCP ïŒãšãã£ã Google ãµãŒãã¹ãäžæãããšçµã¿åãããŠãå©ãããŒã«ãéçºããããšãå€ãã§ãã Google ãµãŒãã¹ã掻çšããçç±ãšããŠã¯ã å€ãã®æ©èœïŒãµãŒãã¹ïŒãæã£ãŠããããšïŒäžèšã«èšèŒïŒ ããããå®äŸ¡ã«ãã€çŽ æ©ãïŒãµãŒãã®æ§ç¯ãªã©ãå¿
èŠãªãïŒå©çšã§ããããš ãããŠåæ©èœã Google Apps Scriptã§é£æºããããšã§ããçšåºŠã®ã·ã¹ãã ãçæéã«éçºã§ããããš ãæããããŸãã 䞻㪠Google ãµãŒãã¹ Gmail ïŒã¡ãŒã«ïŒ Google Drive ïŒã¹ãã¬ãŒãžïŒ Google SpreadsheetïŒ è¡šèšç® ïŒ Google ã«ã¬ã³ããŒïŒã¹ã±ãžã¥ãŒã«ç®¡çïŒ Google FormïŒã¢ã³ã±ãŒãïŒ Google MapïŒå°å³ïŒ Google Apps ScriptïŒ ããã°ã©ãã³ã°èšèª ïŒ BigQueryïŒããŒã¿ããŒã¹ïŒDWHïŒïŒ ãã ããããã® Google ãµãŒãã¹ãçµã¿åããããšãã«èª²é¡ã«ãªãã®ãããŒã¿ã®å
¥åã§ãã å€ãã®å Žå㯠Google Spreadsheetã«ããŒã¿ãå
¥åããŸããã Google Spraeadsheetã¯èªç±ãããã®ã§ãè¡ãåã®è¿œå ãåé€ã容æã«åºæ¥ãŠããŸããŸããããã°ã©ã ïŒ Google Apps ScriptïŒã§ã¯ã©ã®åïŒäŸãã°CåïŒã«ã¯äœã®å€ïŒäŸãã°ååIDïŒãå
¥ã£ãŠãããããŒã¿ã¯äœè¡ç®ããå
¥åãããããšãã£ãããšã決ãŸã£ãŠããããšãåæãšããŠäœãããŠããã®ã§ãèªç±ã«ïŒåæã«ïŒè¡ãåã远å ãåé€ããããšãšã©ãŒã«ãªã£ããããŸãã ãã¡ãããã»ã«ã®ä¿è·ïŒå€æŽã§ããªãããã«ããïŒãã·ãŒãã®ä¿è·ãªã©ã§å¯Ÿå¿ã¯åºæ¥ãªãã¯ãããŸããããWebã¢ããªã®ããã«çŸããå
¥åãå¶åŸ¡ããããšãé£ãããæŽã«èšãã°ãå
¥åã®ãã§ãã¯ïŒããªããŒã·ã§ã³ã»ãã§ãã¯ïŒãåºæ¥ããçæ³ã§ãã ãšããããšã§ïŒïŒïŒïŒç®ãã€ããã®ãGoogle AppSheetã å眮ãããšãŠãé·ããªããŸãããã以äžã§ã¯Google AppSheetã«ã€ããŠãã£ãšç޹ä»ããŸãã AppSheetãšã¯ ãã£ãã Wiki ã§èª¿ã¹ãŠã¿ããšã AppSheet is an application that provides a no-code development platform for application software, which allows users to create mobile, tablet , and web applications using data sources like Google Drive , DropBox , Office 365, and other cloud-based spreadsheet and database platforms. The platform can be utilized for a broad set of business use cases including project management, customer relationship management, field inspections, and personalized reporting. ããã Google TranslateïŒç¿»èš³ïŒã§æ¥æ¬èªã«èš³ããšã AppSheet ã¯ãã¢ããªã±ãŒã·ã§ã³ ãœãããŠã§ã¢çšã®ããŒã³ãŒãéçºãã©ãããã©ãŒã ãæäŸããã¢ããªã±ãŒã·ã§ã³ã§ããããã«ããããŠãŒã¶ãŒã¯ã Google ãã©ã€ã ã DropBox ãOffice 365ãããã³ãã®ä»ã® ã¯ã©ãŠã ããŒã¹ã® ã¹ãã¬ããã·ãŒã ããã³ããŒã¿ããŒã¹ ãã©ãããã©ãŒã ãªã©ã®ããŒã¿ ãœãŒã¹ã䜿çšããŠãã¢ãã€ã«ã ã¿ãã¬ãã ãããã³ Web ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãããã®ãã©ãããã©ãŒã ã¯ããããžã§ã¯ã管çã顧客é¢ä¿ç®¡çãçŸå Žæ€æ»ãããŒãœãã©ã€ãºãããã¬ããŒããªã©ãå¹
åºãããžãã¹ ãŠãŒã¹ ã±ãŒã¹ã«å©çšã§ããŸãã ã ãããæå³ãããã翻蚳ã«ãªããŸãããïŒåªç§ïŒïŒïŒ èŠçŽãããšã ããŒã³ãŒãã§ã¢ããªãéçºã§ãããã©ãããã©ãŒã ãããŒã³ãŒãããšã¯ãã³ãŒããæžããªããŠè¯ããããã°ã©ãã³ã°ãäžèŠãã£ãŠããšã§ããïŒäžå¿è£è¶³ïŒ å€ãã®ããŒã¿ãœãŒã¹ã«å¯Ÿå¿ïŒ ã¹ãã¬ããã·ãŒã ãããŒã¿ããŒã¹ãªã©ïŒ ãã«ããã©ãããã©ãŒã ïŒã¢ãã€ã«ã ã¿ãã¬ãã ã Webãã©ãŠã¶ ã§äœ¿çšã§ããïŒ ãŸãã AppSheet was acquired by Google in January 2020. ãšããããã«ã2020幎㫠Google ã«è²·åããã Google Cloudã«çµã¿èŸŒãŸããŸããã ãããŒã³ãŒãã§ã¢ããªãéçºããšãã£ãŠããã©ããªã¢ãã«ã§ãäœããèš³ã§ã¯ãªãã§ãããããããããããŒã³ãŒãã§ãããã ã§ã¯å®éã«ã¢ããªãäœããªããAppSheetã§ã® ã¢ããªéçº ã«ã€ããŠèŠãŠãããŸãããã AppSheetã«ããã¢ããªã®éçº ãŸããAppSheetã®éçºã«ã¯AppSheetã®ç»é¢ããã©ãŠã¶ã§éãå¿
èŠããããŸãã ä»åã¯ä»¥äžã®ããŒãžãããç¡æãã©ã€ã¢ã«ãã§è©ŠããŠãããŸãã cloud.google.com AppSheet TOPããŒãž ç¡æãã©ã€ã¢ã«ãªã®ã§åºæ¥ãããšã«å¶éããããŸãã ãŸããç¡æãã©ã€ã¢ã«ãªãã§ã¯ã®èšå®ãå¿
èŠã«ãªããŸãã ãã ããã£ãããšäœ¿çšæã詊ãã«ã¯ååããšæããŸãã AppSheetéçºã®ãã㌠AppSheetã§ã¢ããªãéçºããæµãã¯ä»¥äžã®ãšããã§ãã ããŒã¿ãçšæ ããŒã¿ãåã蟌㿠ã¢ããªãäœæ ã¢ããªãã«ã¹ã¿ãã€ãº ã¢ããªãå
¬éïŒãããã€ïŒ ã¢ããªãã·ã§ã¢ 1. ããŒã¿ãçšæ AppSheetã¯AppSheetèªäœã«ããŒã¿ãä¿æããããã§ã¯ãªãã以äžã®ãããªã¢ããªãããŒã¿ã®ä¿åå
ïŒããŒã¿âãœãŒã¹ïŒãšããŠåäœããŸãã ïŒææçã§ã¯AppSheetèªäœã«ããŒã¿ãä¿æã§ããããã«ãªã£ãããã§ãïŒ Google SheetsïŒ Google ã¹ãã¬ããã·ãŒã ã®æ£åŒåç§°ã§ãããïŒ Microsoft Excel ïŒOffice 365ã Dropbox ãªã© ã¯ã©ãŠã ã«ä¿åãããŠãããã¡ã€ã«ãå¯Ÿè±¡ïŒ ããŒã¿ãŒããŒã¹ïŒ Microsoft SQL Server ã MySQL ã PostgreSQL ãªã©ïŒ ä»å㯠Google Sheetsã«ä»¥äžã®ãããªããŒã¿ãçšæããŠé²ããŠããããšæããŸãã id name category brand sale_start_date url pic ããŒã¿ãçšæ 2. ããŒã¿ãåã蟌㿠AppSheetã®ç»é¢ããçšæããããŒã¿ãåã蟌ã¿ãŸãã ããŒã¿ãAppSheetã«åã蟌㿠Google Sheetsã®ããŒã¿ãAppSheetã«åã蟌ãŸããŸããã ããŒã¿ãåã蟌ãŸããŸããã 3. ã¢ããªãäœæ åã蟌ãã ããŒã¿ãæå®ããŠã¢ããªãäœæããŸãã ã¢ããªãäœæ ããã§ïŒããã ãã§ïŒèªåçã«ã¢ããªãäœæãããŸãã å³ã«åã£ãŠããã®ã ã¹ãã çã®ã¢ããªã®ãã¬ãã¥ãŒç»é¢ã§ãã ã¢ããªã宿 4. ã¢ããªãã«ã¹ã¿ãã€ãº èªåã§äœæãããã¢ããªãã«ã¹ã¿ãã€ãºããŸãã åã蟌ãŸããããŒã¿ã®ããŒã¿åã倿ŽããŸãã sale_start_date ã Data ã«ã url ã Url ã«ã pic ã Image ã«å€æŽããŠãããŸãã é
ç®ã®ã«ã¹ã¿ãã€ãº ãã¬ãã¥ãŒç»é¢ã§ã¯ã sale_start_date ãå¹Žææ¥ã®åœ¢åŒã«ã url ã«å³åŽã«ãªã³ã¯ãã¿ã³ãã pic ãç»åã«å€æŽãããŸããã é
ç®ã®ããŒã¿æ¹ãå€æŽ id ã® EDITABLE ã®ãã§ãã¯ãå€ããŠå€æŽãåºæ¥ãªãããŸãã idã倿Žäžå¯ã« 5. ã¢ããªãå
¬éïŒãããã€ïŒ ã«ã¹ã¿ãã€ãºããã¢ããªãå
¬éïŒãããã€ïŒãã€ãŸãå©çšã§ããããã«ããŸãã Not Deployed ãããã€ã§ãããããã§ãã¯ããŠããŸãã ããã§ãšã©ãŒãã§ãããšã©ãŒãä¿®æ£ããŠãããŸãã ç¡æãã©ã€ã¢ã«ã§ã¯ãå©çšå¶éãããã®ã§ãããã€ãã®èšå®ã倿Žããå¿
èŠããããŸãã ãããã€ãã§ã㯠6. ã¢ããªãã·ã§ã¢ ãããã€ãç¡äºã«å®äºãããšãå©çšããããã®URLãååŸã§ããŸãã LINK Editor Link ãã®ã¢ããªãä¿®æ£ããç»é¢ãžã®URLã§ãã Browser Link Webãã©ãŠã¶ ã§å©çšãããšãã®URLã§ãã Install Link ã¹ãã ã§å©çšãããšãã®URLã§ãã ã¹ãã ã« Install Link ã転éããŠã¯ãªãã¯ãããšãæåïŒãŸã ãAppSheetãã¢ããªã ã¹ãã ã«ã€ã³ã¹ããŒã«ããŠããªãå ŽåïŒã¯ãã¹ãã¢ã«é·ç§»ããã®ã§ãAppSheetãã¢ããªãã€ã³ã¹ããŒã«ããŸãã ã¡ãããš ã¹ãã ã§ã衚瀺ãããŸããã ã¹ãã ç»é¢ ã¹ãã ã§ããŒã¿ã倿ŽããããããŒã¿ãœãŒã¹ã® ã¹ãã¬ããã·ãŒã ã®ããŒã¿ãæ£ãã倿ŽãããŠããŸããã AppSheet è§Šã£ãŠã¿ãææ³ ä»åããã£ãšïŒçŽïŒæéãããïŒAppSheetã䜿ã£ãŠã¿ãŸããã ãã®äžã§æããè¯ãç¹ãšäžæºã»äžå®ã«æã£ãç¹ããŸãä»åã®æ€èšŒã§ã¯åãããªãã£ãç¹ã以äžã«ãããŸãã è¯ãã£ãç¹ ã¹ãã¬ããã·ãŒã ã«ããŒã¿ãçšæããŠèªã¿èŸŒãã ãã§ããŒã¿å®çŸ©ãèªåã§äœæããã ããŒãã«å®çŸ©ãïŒããèšå®ããå¿
èŠããªãã®ã§ããã®æéãçãã åã蟌ãã ããŒã¿ã®å㯠Image ã Url ãªã©å€ããçšæãããŠããããŸã倿Žã容æ ããŒã¿ã®åã«å¿ããŠè¡šç€ºãèªåã§å€ããã®ã§ãUIã®äœæãå¿
èŠãªã ããŒã¿ã®åç
§ã倿Žã远å ã®æ©èœãèªåã§äœæãããã®ã§ãããã䟿å©ã ä»åã®æ€èšŒã§ã¯åãããªãã£ãç¹ ããŒã¿ã®å®çŸ©ãããŒã¿ã®è¡šç€ºã«ã€ããŠã¯ãå€ãã®ãã©ã¡ãŒã¿ïŒèšå®ã§ããé
ç®ïŒããã£ãããã©ã®ãããªèšå®ãã§ããã®ããŸã§ã¯åãããªãã£ãã ãããã€ã®èšå®ãå€ãã®èšå®é
ç®ããã£ãããã©ã®ãããªã«ã¹ã¿ãã€ãºãå¯èœãªã®ãã¯åãããªãã£ãã äžæºã»äžå®ã«æã£ãç¹ AppSheet㯠Google Workspaceã®Enterpriseãã©ã³ã§å©çšãã§ããããBusinessãã©ã³ïŒBusiness StarterãBusiness StandardãBusiness PlusïŒã§ã¯å©çšã§ããªãã Enterpriseãã©ã³ãå¥çŽããŠããããAppSheetãå©çšããå Žåã¯ãAppSheetåå¥ã®å¥çŽãå¿
èŠãšãªãã MOST POPULAR ã®Coreãã©ã³ã§ $10 USD/ user / month ãšãªããªãã®ã倿®µã AppSheetã®ç»é¢ãããã¥ã¡ã³ããè±èªã ããã¥ã¡ã³ã㯠Google Translateãå©çšããã°ããçšåºŠã¯è§£æ±ºãããããããããšãã«å°ããããªæ°ãããã Google ãAppSheetã«ã©ããŸã§ã³ãããããŠãããäžå®ã 2021幎ã«ãµãŒãã¹çµäºããApp Makerã®ãããªæ«è·¯ã蟿ããªããäžå®ã æåŸã« ã§ã¯ãAppSheetã¯ã Google ãµãŒãã¹ãçµã¿åããããšãã«èª²é¡ã«ãªãã®ãããŒã¿ã®å
¥åãã解決ã§ããã®ãïŒ æ£çŽãåºæ¥ããšæããŸãã AppSheetã§ã¢ããªãäœæããŠããã®äœ¿ãæ¹ãå«ããæ¥åããã¥ã¢ã«ãçšæããã°æ¥åã¯åããšæããŸãã ã¢ããªãéã㊠ã¹ãã¬ããã·ãŒã ã®ããŒã¿ãè§ŠãããïŒå€æŽããïŒããšã§ãããŒã¿ã®ä¿è·ãåºæ¥ãã®ã§ããªããã¹ã«ããããŒã¿ã®æ¶å€±ãªã©ãé²ãããšæããŸãã ããã¯ã¯ã©ã€ã»ã³ã¹ã§ãããå€ãã®äŒæ¥ãå¥çŽããŠããïŒã§ãããïŒBusinessãã©ã³ã§å©çšã§ããããã«ããŠã»ããã ããããã°ããå€ãã®ãŠãŒã¶ãå¢ããŠãããã¥ã¢ã«ã®æ¥æ¬èªåãªã©ãé²ãã®ã§ã¯ãªãããšæããŸããã 以äžãèªãã§ããã ãããããšãããããŸããã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ã ãšãã°ã¢ ã§ããŒã¿ã¢ããªã¹ããããŠããäºåã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®22æ¥ç®ã®èšäºã§ãã æ¬èšäºã®æŠèŠ ãã®èšäºã¯ãããŒã¿åææ¡ä»¶ã®é²ãæ¹ã«é¢ããŠã課é¡ã®éžå®ãããŽãŒã«ã®å
·äœåãåæå®äºã«è³ããŸã§ãç§ãä»å¹Žå®éã«å¯Ÿå¿ããäºäŸã§ã©ã®ãããªããšã«æ°ãã€ããªãã察å¿ããã®ããæ¯ãè¿ã£ãŠã¿ãããšãè¶£æšãšããèšäºã«ãªããŸãã ããŒã¿åæã®æ¡ä»¶ã¯å¿
ãããå
·äœçãªç®çããŽãŒã«ãããæã°ãããšã¯éããŸããã æŒ ç¶ãšããèª²é¡æèããå§ãŸãã ãã¢ãª ã³ã°ãéããŠå
·äœçãªç®çããŽãŒã«ãæç¢ºåããŠããããã»ã¹ãå
¥ãããšããããŸãã ããšã«ãããšãåãããç®çããŽãŒã«ãæç¢ºåãããŠããæ¡ä»¶ã®æ¹ãã¬ã¢ã±ãŒã¹ãããããŸããã ãã®åæä»¥å€ã®ããã»ã¹ã®é²ãæ¹ã«ã€ããŠãåæãã®ãã®ãšåçããããã¯ãã以äžã«é£ãããšæããããšãå€ã
ãããŸãã ããããåæã®ææ³ã ã¢ã«ãŽãªãºã ã®è§£èª¬èšäºãªã©ã¯ããèŠãããäžæ¹ãããã»ã¹ã®é²ãæ¹ã«ã€ããŠã¯ãªããªãå
·äœçãªå¯Ÿå¿äºäŸãšãããã®ãç¥ãæ©äŒãå°ãªãå°è±¡ããããŸãã ããã»ã¹ã® ãã¬ãŒã ã¯ãŒã¯ ãšããŠCRISP-DMãšãã£ãæŠå¿µã¯ååšããŠãããããèªäœã¯éåžžã«æçšããšæãã®ã§ãããæŠå¿µã§ãããã解説ãèªããšããæœè±¡çãªå°è±¡ããããŸãã ããã¯èŽãæ¹ãªããšããããããšã¯æããŸããŠããããã£ãããã»ã¹ã®é²ãæ¹ã¯åå¥ç¶æ³ã«å¿ããŠæè»ã«å¯Ÿå¿ãæ±ããããå Žåãå€ãããããããã°ãããšããéã®åŒŸã¯ãªããšããããšããªãšæã£ãŠããŸãã ãã ããã¯ããå
·äœçãªäºäŸã§ããã»ã¹ã®é²ãæ¹ã«ã€ããŠèããŠã¿ãããšãéèŠã§ãèªåã®äžã§ç³§ã«ããŠãããããèªåã®ãã£ãŠããããŒã¿åæã®ããã»ã¹ãæ¯ãè¿ã£ãŠã¿ãããšãããããã®ãããªåœ¢ã§ã¢ãŠããããããŠã¿ãããšã¯ãäžå®ã®æå³ãããã®ã§ã¯ãªãããšæããŸãã®ã§ãã®æ©äŒã«æ¯ãè¿ããããŠã¿ãããšæããŸãã ãã®èšäºã§ã¯ããŒã¿åæãã©ã®ãããªããã»ã¹ãçµãŠå®è¡ããŠãã£ããããšããããŒããã¡ã€ã³ã«ãªããŸãã å
·äœçãªåæææ³ãªã©ã®èª¬æã¯èšèŒããŠãããŸããã®ã§ããäºæ¿ãã ããã 解決ããã課é¡ã確èªãã ãŸãåãã«å®æœããããšã¯ãããããã©ã®ãããªèª²é¡ã解決ããããšãæçã§ãããã確èªããããšã§ããã ç¶æ³ã軜ã説æãããšãç§ã¯æšå¹Ž ãšãã°ã¢ ã«ãžã§ã€ã³ããã°ãããšããããšããããæ¥åã課é¡ã®çè§£ã¯ãŸã ãŸã æµ
ãç¶æ
ã§ããã å察ã«ãä»åèªåãæ
åœããããŒã ã«ã¡ã€ã³ã§ããŒã¿ã¢ããªã¹ãã ã¢ãµã€ ã³ãããã®ãèªåãåããŠãšããããšããããããžãã¹åŽã§ãããŒã¿åæã§ã©ã®ãããªããšãåºæ¥ãã®ããããããã€ã¡ãŒãžãæŒ ç¶ãšããŠããã§ããããšãæã£ãŠããŸããã ãã®ããããŸãã¯ãã£ãã°ããã«éè«ãšããåç®ã§ãåããŒã ã¡ã³ããŒã« ãã¢ãª ã³ã°ããããŠããããŸããã ãã®ææ°ãä»ããã®ã¯ããŒã¿åæãšããããšã«ãã ããããæ®æ®µã©ã®ãããªæ¥åãè¡ã£ãŠããŠãã¡ã€ã³ã§å¯Ÿå¿ããŠããããšã¯ã©ã®ãããªããšããå°ã£ãŠããããšã¯äœãããšããçžæã®æ¥åçè§£ã«éäžããããšã§ãã ããã¯ãã€ã¡ãŒãžãæŒ ç¶ãšããŠããäžã§ããŒã¿åæã®è©±ã«å¯ããŠããŸããšãæ¬è³ªçãªèª²é¡ãåºã¥ããã®ã§ã¯ãªãããšæã£ãŠã®ããšã§ã話ãçºæ£ããŠãããã®ã§ãŸãã¯èªåã®çè§£ãé«ããããšæã£ãŠã®ããšã§ããã äžäººã²ãšãåããæéã¯çããã®ã§ããã®ã§ãå®å
šã«çè§£ãã§ãããšãããã®ã§ã¯ãªãã£ãã§ãããããã§ããæ®æ®µããŒã ã¡ã³ããŒãå°ã£ãŠãã課é¡ãããçšåºŠææ¡ããããšãã§ããŸããã å
šãŠã®èª²é¡ã«çæããããšã¯åºæ¥ãªãã®ã§ãéè«ã®åŸã§èŠããŠãã課é¡ã«å¯ŸããŠããŒã¿åæã§ãµããŒãåºæ¥ãããªããšãçŸ
åããããžãã¹ãµã€ãåŽã®éšé·ãšåªå
床ã®ç¢ºèªãè¡ããšããäœæ¥ãè¡ããŸããã ã¡ãªã¿ã«ãã€ã¡ãŒãžãšã㊠ãã¢ãª ã³ã°ããçµæã以äžã®ãããªè¡šã«ãŸãšããŠäŒè©±ãè¡ããŸããã èª²é¡ ãã¢ãª ã³ã°åŸã®ãŸãšãã·ãŒãïŒã€ã¡ãŒãžïŒ ãã®ããã»ã¹ãçµãŠããã€ã察å¿ããã¹ãããŒããçµã蟌ã¿ã次㮠ãŠãŒã¹ã±ãŒã¹ ã®å
·äœåã«é²ãããšãšãªããŸããã ãŠãŒã¹ã±ãŒã¹ ãå
·äœåãã 察å¿ããããŒãã¯æ±ºãŸããŸããããå
·äœæ§ã«æ¬ ããéšåããããŸããã®ã§ãããžãã¹ã® ãŠãŒã¹ã±ãŒã¹ ãå
·äœåããŠãããã§ãŒãºã«å
¥ããŸãã â»å¯Ÿå¿ããããŒãã¯ããã€ããããŸãããããã§ã¯ãéèŠäºæž¬ã«ãã売ãçååã®åºå匷åãã®ããŒããäŸã«èšèŒããŸãã ããã§ã¯ãå®éã«ããžãã¹ã®å¯Ÿå¿ãããããŒã ã¡ã³ããŒãšé±æ¬¡ã® MTG ã§å
·äœçãªå
容ãããåãããŠãããŸããã ããžãã¹ã§ããããããšãšããŒã¿åæã®ã¢ãŠããããã«éœéœ¬ãçããŠããŸããšãæçšãªåæãåºæ¥ãªããªã£ãŠããŸããŸãã®ã§ãããã¯ããªãéèŠãªãã€ã³ãã§ã念å
¥ãã«çްããèªèåãããããŠããããšãèã«ãªããŸãã äžã€äžã€è©³çŽ°ã«æžãããšã¯ããŸããããäŸãšããŠå
·äœçã«ç¢ºèªããé
ç®ãçŸ
åãããšã éèŠäºæž¬ã®ããŒã¿ãã©ã®ããã«æŽ»çšãããïŒ å¯Ÿè±¡ãšãããã«ããŽãªããã©ã³ãã¯ã©ããïŒ ååã¯ã©ã®çšåºŠã®ç²åºŠã§ç¢ºèªããããïŒïŒã«ããŽãªããã©ã³ããSKUãªã©ïŒ äºæž¬ãè¡ãããæéã¯ãã€ãããã€ãŸã§ãïŒ äžåããã®å¯Ÿå¿ãïŒå®åžžçã«ãããããïŒ ã¹ã±ãžã¥ãŒã«æ åæçµæã®ã¢ãŠããããã€ã¡ãŒãž ãªã©ã®èŠçŽ ããããŸãã ãããã¯äžã€ãã€ãããã«æ±ºãŸã£ãŠãã£ãããã§ã¯ãªããäœåºŠãäŒè©±ã®è¡ãæ¥ãç¹°ãè¿ããåŸã
ã«ãäºãã®èªèãããåãããŠããæµãã«ãªããŸããã ããã§èªåãæ°ãä»ããããšãšããŠã¯ãæ¥åçè§£ãæµ
ããªãã«ããçšåºŠã®ä»®èª¬ããã£ãŠ MTG ã«èšãããã«ããããšã§ãã äžäŸãšããŠãæåãèªåã®äžã§éèŠäºæž¬ã® ãŠãŒã¹ã±ãŒã¹ ã¯ä»¥äžã®ãããªæ³å®ãããŠããŸããã æ¥æ¬¡ã§ç¢ºèªãã äºæž¬æ¥ãã30æ¥çšåºŠå
ã®äºæž¬ãã§ãã éèŠäºæž¬ãšåšåº«éïŒåºåååæ°ïŒãæ¯èŒããŠãäŸçµŠäžè¶³ã«ãªããããªååãããã¯ã¢ããããŠåºåä¿é²ïŒâ»ïŒãã â» BUYMA ã¯ååã®åºåããŠãŒã¶ãŒã«ããŠããã ãCtoCã®ãµãŒãã¹ã§ãã®ã§ã BUYMA ã§ååã ä»å
¥ ããŠåºåãããšããããšã¯åºæ¬çã«ãªããPSããïŒåºåè
ïŒã«åºååéãè¡ããšããã¢ã¯ã·ã§ã³ããšããŸãã ãããã話ãããäžã§ãŸãšãŸã£ãŠãã£ã ãŠãŒã¹ã±ãŒã¹ ã¯ä»¥äžã®ãããªãã®ã§ããã å£ç¯ãã®ã®ååã® ä»å
¥ ãææãçã£ãŠãã¡ãŒã«ã§åºåä¿é²ãè¡ããã ç¹ã«äŒè©±ãããŠããææïŒ6ææ«ïœ7æåæ¬ïŒã¯ãã¢ãŠã¿ãŒã® ä»å
¥ ãã8æããããå§ãŸãã®ã§ã8æã«äžåºŠåºåä¿é²ã¡ãŒã«ãéããååãèŠãããã§9æã«å床ã¡ãŒã«ãéãããã ã¢ãŠã¿ãŒã®å£²ããææã§ãã9æïœç¿å¹Ž1æãŸã§ã®éèŠïŒã©ã®ãã©ã³ãã¢ãã«ãç¹ã«å£²ããã®ãïŒïŒãç¥ãããã å°æ¥çã«ã¯ãå£ç¯ã«å¿ããã«ããŽãªã®éèŠã宿çã«ååŸããŠãåºåä¿é²ã¡ãŒã«ãéããããã«ãããã æ¥æ¬¡ã§ã®ç¢ºèªãäºæž¬æéã30æ¥çšåºŠãšããç§ã®æ³å®ã¯ééã£ãŠããããã§ãããããèªäœã¯åé¡ã§ã¯ãªããããããã€ã¡ãŒãžã§åé¡ããªããïŒãããåãããªãã®ã ãã©ããªããïŒãšäžã€ãã€ç¢ºèªãé²ããŠãã£ãããšã§ã ãŠãŒã¹ã±ãŒã¹ ã®ã€ã¡ãŒãžã®éœéœ¬ããªããªã£ãŠãããŸããã åæãŽãŒã«ã®èšèš ãããŸã§ããžãã¹ã®ã€ã¡ãŒãžãæç¢ºã«ãªããšãåæãŽãŒã«ã¯å€§åèšèšãããããªãããšæããŸãã ä»åã®å Žåã¯ã éèŠäºæž¬ãæ¥åå©çšå¯èœãªã¬ãã«ã®ç²ŸåºŠã§äºæž¬å¯èœãïŒãšããæ€èšŒçµæ 仿ã®éèŠäºæž¬çµæ ãšããäºã€ã®ã¢ãŠãããããå¿
èŠã«ãªããŸãã äžã€ç®ã«é¢ããŠãããŒã¿ãµã€ãšã³ã¹ã«é¢ãã£ãããšã®ããæ¹ãªããåç¥ã ãšæããŸãããäºæž¬ã¿ã¹ã¯ã¯ããŒã¿ã®è³ªãªã©ã«ãã£ãŠå¿
ãããããŸããããšã¯éããªããšãããªã¹ã¯ããããŸãã ãã®ãããä»åãäœæããã¢ãã«ã®ç²ŸåºŠã劥åœã§ãããåŠãïŒãšããæ€èšŒãè¡ã£ãããã§ãåé¡ããªããã°äºã€ç®ã®ã¢ãŠãããããåºããšããã¹ããããèžãå¿
èŠããããŸããã ãã®ãªã¹ã¯ã«ã€ããŠããžãã¹ãµã€ãã«ãçè§£ãããŠããã£ãããã§ãææªããŸããããªãã£ãå Žåãããžãã¹ãµã€ãã§ããçšåºŠå£²ãçã®ååã¯ãã¬ããžãšããŠæŒãããŠããããšããã®ãã¬ããžã ãã§ãåºåä¿é²ã¡ãŒã«ã®äœæã»é
ä¿¡ã«ã¯æ¯éããªãããšã®ç¢ºèªã¯ããŠããŸããã ããå°ã现ãã話ããããšã人ã®ãã¬ããžã ãã§ã¯éçãããã ãããšããåæã§ããã®éèŠäºæž¬ã®çµæãåãå
¥ããããšã§ãããæçšãªåºåä¿é²ãè¡ãããšããžãã¹ãµã€ããæããããšãã宿§ç芳ç¹ã®æ€èšŒãããããŠç¢ºèªããå¿
èŠããããŸããã 宿§ç芳ç¹ã¯ã¢ãŠããããçµæãèŠãŠãããããšã§å€æãããšããŠã å®é çã«éèŠäºæž¬ãæ¥åå©çšå¯èœãªã¬ãã«ã®ç²ŸåºŠãšã¯ã©ããããã®ãïŒãšããå®çŸ©ãããå¿
èŠããããŸããã ããã§ã¯ ãŠãŒã¹ã±ãŒã¹ ãèžãŸãã ã¢ãŠã¿ãŒã®ãã©ã³ãã¢ãã«ã«ãããŠã売äžä»¶æ°äžäœ100ä»¶ãäºæž¬ã§ããããš ãã¡ã€ã³ã®æ€èšŒèгç¹ãšããŸããã ãŸããããçšåºŠåå¹Žã«æ¯ã¹ãŠäŒžã³ããåŠããšããèŠç¹ãå«ãŸãããšãããšããæèŠãããã坿¬¡çã§ã¯ãããŸããã å幎æ¯100%ã120%ã150%ãçšåºŠã®ç²åºŠã§äŒžé·çã®äºæž¬ãå¯èœãïŒ ãšããç¹ãæ€èšŒããããšãšããŸããã ãããã®æ€èšŒèгç¹ã«ã€ããŠãå®éã«æšå¹ŽåºŠã®ããŒã¿ã§ã©ã®ãããªçµæã«ãªãããæ€èšŒããããšãšããŸããã éèŠäºæž¬ã¿ã¹ã¯ã§ã¯ããæéã«å£²ããååä»¶æ°ãäºæž¬ããŸãããä»åã®ç®çã¯å£²ããããªååãããã¯ã¢ããããŠåºåä¿é²ãè¡ããšãããã®ã§ãã®ã§ãå¿
èŠãªåšåº«æ°ã®èæ
®ãªã©ã¯äžèŠã§ããã売äžä»¶æ°ã®äºæž¬ç²ŸåºŠã¯ïŒå
šãèŠãªããšããããšã¯ãªãã§ãããïŒéèŠèŠããªãããšãããžãã¹ãµã€ããšåæããŸããã ããäœè«ã§ãããã¢ãã«ã®ç²ŸåºŠããããããšããã«ã¯æ€èšŒæéãçãã£ãããšãååŸã§ããããŒã¿ãéãããããšããã売äžä»¶æ°ã®äºæž¬ç²ŸåºŠã«ã€ããŠã¯äžå®ããã£ãã®ã§ãããã§ããŒãã«ãäžããããããšã¯å€§åãããããããã®åŸã®çµæãèŠãŠãæåŸ
å€ã³ã³ ãããŒã« ã¯å€§äºã ãªãšæãããšããã§ããã çµæ åæã®ãŽãŒã«ãåæåºæ¥ãããæé©ãªäºæž¬ãåºããã¢ãã«ã®äœæãç®æãã ã¢ã«ãŽãªãºã ããã©ã¡ãŒã¿ã®å€æŽãããŒã¿éïŒæéãç¹åŸŽéïŒã®å¢æžãªã©ãæéã®èš±ãç¯å²ã§è©ŠããŸããã ã¡ãªã¿ã«ãããŒã¹ã©ã€ã³ãšããŠåçŽãªçŽè¿1ã¶æã®å£²äžä»¶æ°ã®æšå¹Žæ¯ããã®ãŸãŸäºæž¬æéã«ãåœãŠã¯ããããšããã«ãŒã«ããŒã¹ã®ææ³ã詊ãããããŠããŸãïŒæå€ãšç²ŸåºŠã¯æªããªãã£ããããŸããïŒã æçµçãªçµæãšããŠã¯ãç¶æ
空éã¢ãã«ã䜿çšããäºæž¬ããã£ãšã粟床ãé«ãã売äžäžäœ100ä»¶ã«å
¥ããã©ã³ãã¢ãã«ã®ãã¡80ä»¶ã®ãã©ã³ãã¢ãã«ãäºæž¬ããããšãåºæ¥ãŠããŸããã 䌞é·çã®äºæž¬ã¯çްããèŠããšåŸ®åŠãªéšåããããŸãããã倧éæã«æšå¹Žãã䌞ã³ãããåŠãçšåºŠã®äºæž¬ã¯æªããªããããã¯å¯æ¬¡çãªæ€èšŒèгç¹ã§ããããã蚱容ãšããŸããã ãªãã売äžä»¶æ°ã®äºæž¬ç²ŸåºŠããã¡ããã¡ããªäºæž¬çµæã§ãåé¡ãªã®ã§ç¢ºèªããããšãããäºæž¬çµæãæãæéäžã®é±æ¬¡å£²äžä»¶æ°ãšå®çžŸã®æ¯èŒçµæã§ã¯ã倧éæã«ç§ïœå¬ã«ãããŠå£²äžä»¶æ°ã䌞ã³ãŠããäºæž¬ã°ã©ããäœæåºæ¥ãŠããïŒäžèšã°ã©ãåç
§ïŒãããžãã¹ãµã€ãã®å®æ§è©äŸ¡ãèžãŸããŠç·åçã«æ¥åå©çšå¯èœã§ãããšã®å€æã«è³ããŸããã ãããã©ã³ãã¢ãã«ã®å®çžŸïŒéç·ïŒãšäºæž¬çµæïŒãªã¬ã³ãžç·ïŒ ãŸãšã ç§ãä»å¹ŽåºŠå¯Ÿå¿ããŠããéèŠäºæž¬ã¿ã¹ã¯ã®äŒç»ã®å§ãŸãïœäºæž¬ã¢ãã«ã®æ€èšŒãŸã§ãç°¡åã«ã§ããæ¯ãè¿ã£ãŠããŸããã ãã®åŸãããžãã¹ãµã€ãã«ä»æã®éèŠäºæž¬çµæãå
±æãåºåä¿é²ã¡ãŒã«ãé
ä¿¡ããçµæãé
ä¿¡åŸã«å¯Ÿè±¡ååã®åºåæ°ã¯å¢å ããPSããããã奜æçãªåé¿ãããã ãããšã®ãã£ãŒãããã¯ãããã ããŠãããŸãã æ¯ãè¿ã£ãŠã¿ãŠãæ¹ã㊠ãã£ã¬ã¯ã·ã§ã³ ãã³ãã¥ãã±ãŒã·ã§ã³ã®å€§åããæããããšãšãªããŸããã 倧ããªéœéœ¬ããªãããŸããããããåæã®çµæãæŸçœ®ãããããšããªããããžãã¹ãµã€ãã®ã¢ã¯ã·ã§ã³ã«ç¹ãã£ãã®ã¯ãæéã¯ããããªãããïŒãããããããïŒïŒçžäºçè§£ãé²ãé©åãªåæãè¡ããããã§ã¯ãªãããšèããŠããŸãã 现ããã¯æžããŠããŸããããä»åæããªãããããžã§ã¯ããããžã¡ã³ãã®ç¥èãªã©ãèŠæã§æèããªããæ¡ä»¶ãé²ããŠãããŸããã ããŒã¿åæã®ææ³ã ã¢ã«ãŽãªãºã ãªã©ã®å匷ã¯ãã¡ããéèŠã§ãããšæãã€ã€ãåæã«ãããžã§ã¯ããããžã¡ã³ããCRISP-DMãªã©ãããžã§ã¯ããåã«é²ããããã®ç¥èãããŒã¿ã¢ããªã¹ããšããŠç£šããŠãããããšæã1幎ã§ããã ä»åã®èšäºã¯ä»¥äžã«ãªããŸãã æåŸãŸã§èªãã§ããã ããããããšãããããŸããã ææ¥ã®èšäºã®æ
åœã¯ããŒã¿ã¢ããªã¹ãããŒã ãããŒãžã£ãŒã®åæŸããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ãããŒã¿ãšã³ãžãã¢ã®è°·å
ã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®21æ¥ç®ã®èšäºã§ãã ç®æ¬¡ ã¯ããã« ã©ãããŠããŒã¿åºç€ãæé©åããå¿
èŠãããã®ïŒ ã©ããããæ¹åã§ããã®ïŒ çŸç¶ã®ããŒã¿åºç€ã®ãããã äž»èŠãªBUYMAåºå¹¹ããŒã¿ã®ææ°ãã¥ãŒã«çç®ããŠã¿ã ææ°ãã¥ãŒãã©ã倿Žããã®ïŒ ã·ã¹ãã æŠèŠãšããŠã¯ã©ããªæãïŒ ãã®æ¹éã§æã£ãããš BQå±¥æŽããŒãã«ã®äœææ¹éã ãã© æ¬åœã«ãã®æ¹æ³ã§æ¹åããã®ïŒ éçšä¿å®ããäžã§æ°ã«ãªã£ãŠããããš èŠèŸŒã¿å¹æã¯ã©ããªã®ïŒ å®è£
ããäžã§æèãããšãã BQå±¥æŽããŒãã«äœæåæãšãªãDAGäŸåé¢ä¿ æ¬çªããŒã¿ã䜿ã£ãç¢ºèªæéãã§ããã ãé·ãã«ãšãã ããŒã¿å質æ
ä¿ã¯ã©ãããã£ã㪠ä»åã¯èŠéã£ãããŒã¿åè³ªå¯Ÿå¿ æ¢åã®æåå®è¡ã¹ã¯ãªãããAirflowã«ç§»æ€ããããšæã£ãã ãããããªãªãŒã¹åŸã®è©±ãããã 广ã¯ã©ãã ã£ãã®ïŒ BQã¯ãšãªã³ã¹ããšãã®ã¯ãšãªæ°ãææ¬¡åäœã§æ¯èŒããŠã¿ã(課é察象ã®ã¿) å¹ææž¬å®ããã«ããã£ãŠ BQã¯ãšãªå¹³åå®è¡æéãšåŠçéãææ¬¡åäœã§æ¯èŒããŠã¿ã(課é察象ã®ã¿) ãšããLookerããã·ã¥ããŒãå
éšã®ã¯ãšãªå®è¡æéãæ¥æ¬¡ã§èŠãŠã¿ã éå»ã®ãšããæç¹ã®ããŒã¿ãé¡ã£ãŠã¿ã ãããªæãã®ã¯ãšãªã㪠ã¿ã€ã ãªãŒãããŠæã£ãããš Lookeräžã§ãexploreãäœæããŠã¿ã€ã ãªãŒãããŠã¿ã ææ æåŸã« ã¯ããã« çããã©ã®ããã«ãéããã§ããããã ç§ã¯æšå¹Žã«ç«ã¡ããã®å¯æãã«ç®èŠããŠããŸãããªã¢ãŒãã¯ãŒã¯äžãè¿ãã§æç«ã«èŠå®ãããçæŽ»ãéãããŠãããŸãã ä»å¹Žãããæ€å®åçŽã«åæ Œããæç«ãšä»²è¯ããªããæ°ãããŸãð± ããŠãããŒã¿åºç€ã®éçºéçšä¿å®ãBIäžã§ã®ããŒã¿æŽåãªã©ã察å¿ãããŠãŸããŠã ä»å㯠"ããŒã¿åºç€ã®åŠçæé©åã«ããBigQueryã³ã¹ãåæž" ã®è©±ããããŠããã ããããšæããŸãã ã©ãããŠããŒã¿åºç€ãæé©åããå¿
èŠãããã®ïŒ ãšãã°ã¢ ã¯å
šç€Ÿçã«ããŒã¿ã掻çšããæåã匷ãã誰ã§ãããŒã¿æŽ»çšãããããããã«æ§ã
ãªããŒã¿ãBigQuery(以äžãBQ)ã«èªåéçŽããŠãããŸãã èŠæš¡ã§ãããšããŒã¿åºç€äžã®ã¯ãšãªã¹ãã£ã³é㯠ãã¿ãã€ã [PB]èŠæš¡/æã§ããã åå¹Žåææ¯ çŽ300%ã§ã®å¢å åŸåã«ãããŸãã ããããããŒã¿æŽ»çšãé²ãã«ã€ããŠäžèšã®èª²é¡ãæããŠããŸããã æšä»ã®åå®äºæ
ãéãªããBQã¯ãšãªã³ã¹ãã倧å¹
ã«å¢å åŸåã«ãã ããŒã¿åç
§ãé
ããã·ãŒã ã¬ã¹ã«åæãããªã«ããŠã³ããã¥ãã (BIã ã¢ããã㯠ã¯ãšãª) æèã®åŠšãã«ã€ãªãã£ãŠããŸããåææ©äŒã®æå€±ã«ã€ãªãã£ãŠãããšæãã 飿ºå
ã§å±¥æŽãæ®ã£ãŠããªãããŒãã«ã®å Žåãè€æ°ã®ããŒãã«ãçšããéå»ã®ãšããæç¹ã®ããŒã¿ãé¡ãã«ãã ããã«äžèšã®çŸç¶ããããããŒã¿åºç€ã®æé©åãé²ããããšæããŸããã åºå¹¹ããŒã¿ã§ãæ°åäžãæ°åã¬ã³ãŒãããããŒãã«ãè€æ°ååšãã çŸç¶ã®ä»çµã¿ã§ã¯æéçµéãšå
±ã«BQã¯ãšãªã¹ãã£ã³éãå¢å ããŠããŸã ã©ããããæ¹åã§ããã®ïŒ çŸç¶ã®ããŒã¿åºç€ã®ãããã ãããåŠç ã§BQ飿ºããŠãããããŒã¿é®®åºŠã¯ååãæå€§1æéé
å»¶ã§ãã BQ飿ºæã¯å·®åæŽæ°åã飿ºãããããã®ããŒã¿ããéè€ãç©çåé€ãªã©ãèæ
®ãããã¥ãŒ(以äžãææ°ãã¥ãŒ)ã§é£æºå
ãšåãææ°ç¶æ
ã®ããŒã¿ãåçŸããŠãŸãã åè: Apache Airflow ã§å®çŸããSQL ServerããBigQueryãžã®ããŒã¿åæ äž»èŠãª BUYMA åºå¹¹ããŒã¿ã®ææ°ãã¥ãŒã«çç®ããŠã¿ã æ±çšçã«å
šãŠã®ææ°ãã¥ãŒãæé©åããæ¹éã«ããŸãããçç±ã¯äžèšãšãªããŸãã BQ飿ºããŠããåºå¹¹ããŒã¿ã ãã§ã200ããŒãã«ä»¥äžãããä»åŸãå«ããŠããŒãã«ã®å©çšç¶æ³ã¯ããããªã çŸç¶ã®ã¢ã¯ã»ã¹å
容ã調æ»ããŠåã
ã«æ§èœæ¹åãããšãªããš ããŒãã«æ°ãåŠçéãå€ã 調æ»ãå¯Ÿå¿æ¹æ³ãèããã®ã倧å€ã ããéçšä¿å®è² æ
ã倧ããã ãã¥ãŒå
éšã®æ¹åãªã®ã§ãBQå©çšè
ãžã®åœ±é¿ãèæ
®ããå¿
èŠããªãããµã€ã¬ã³ãã§ãªãªãŒã¹ã§ããã®ãè¯ããã ææ°ãã¥ãŒãã©ã倿Žããã®ïŒ ææ°ãã¥ãŒã¯å·®åæŽæ°ããŒã¿ããåçŸããŠãããããäžèŠãªã¹ãã£ã³ãå€ãããç¶æ
ã§ããã ãªã®ã§ãåºå¹¹DBå
šäœã宿çã«ããŒãã«åããææ°ãã¥ãŒã§ãã®ããŒãã«ãå©çšããŠã¹ãã£ã³éãæ¹åããããšèããŸããã ææ°ãã¥ãŒã®å€æŽæ¹éã¯ä»¥äžã®ãšããã§ãã çŸç¶. ææ¬¡å·®å+æé次差åã®BQããŒã¿ãçµã¿åããã ææ¡. æ¥æ¬¡å
šä»¶(â»)+æé次差åã®BQããŒã¿ãçµã¿åããã â» ææ¬¡å·®å+æé次差åã§ããŒãã«åãAM0:00åºå®ã以äžãBQå±¥æŽããŒãã«ãšåŒã¶ ã·ã¹ãã æŠèŠãšããŠã¯ã©ããªæãïŒ å³ã«ãããšäžèšã®ããã«ãªããŸãã å°ãçœè²ã®ç®æã¯æ¢ã«ãããä»åæ°èŠã«å¯Ÿå¿ããã®ã¯é»è²ã®ç®æã«ãªããŸãã ããŒã¿åºç€ã®ã·ã¹ãã æŠèŠ ãã®æ¹éã§æã£ãããš ãªã¢ã«ã¿ã€ã 飿ºãå®çŸã§ããå Žåã§ãBQã«å
¥ããåŠçã®çœ®æã§æžã¿ç§»è¡ãã¹ã ãŒãºãã åºå¹¹DBå
šäœãBQå±¥æŽããŒãã«ãšããŠæ®ãããšã§ãéå»ã«é¡ã£ãŠããŒã¿æŽ»çšããããã BQãªã®ã§ããŒã¿éãããŸãæ°ã«ããªããŠè¯ãã¡ãªãããæŽ»ããã BQå±¥æŽããŒãã«ã®äœææ¹éã ãã© æ¢ã«BQäžã«ååŸæžã¿ã®æŽæ°å·®åããŒã¿ãçšããããšã§åŸããã§ãéå»ã®ä»»ææç¹ãŸã§é¡ã£ãŠããŒã¿ãåçŸã§ããã®ãè¯ããã åºå¹¹DBãå€ããããã§ããã ã圱é¿ãäžããªãããã«ãããã£ã å°ãBQã®ãããã¥ãŒãå°ãæ€èšããã®ã§ããçŸç¶ã§ã¯å©çšå¶çŽã«åŒã£ãããèŠéããŸããã æ¬åœã«ãã®æ¹æ³ã§æ¹åããã®ïŒ ä»çµã¿ãããããšæ§èœã¯æ¹åãããšã¯æã£ãŠãŸãããã以äžã®æžå¿µããããŸããã ææ°ãã¥ãŒãã©ã®çšåºŠäœ¿ãããŠããã®ããããããªãã£ã BQå±¥æŽããŒãã«äœæãªã©ãä»åã®å¯Ÿå¿ã«ããå¢å ããBQã¯ãšãªã³ã¹ãããã éçšä¿å®ããäžã§æ°ã«ãªã£ãŠããããš ããŒã¿åºç€ã®ä»çµã¿ãçŸç¶ããè€éã«ãªã ãã©ãã«ã·ã¥ãŒãã£ã³ã° ã倧å€ã«ãªã BQå±¥æŽããŒãã«ãææ°ãã¥ãŒã«çµã¿èŸŒãŸãããããããããŒã¿åè³ªã«æ³šæãæãå¿
èŠãã ããŒã¿åºç€ã®éçšä¿å®ã§æ°èŠããŒãã«åãèŸŒã¿æã¯äžéšæåéçšããŠãã æ¬å¯Ÿå¿åŸã¯ãªãã¬ãŒã·ã§ã³ãããè€éåãã æå ã¹ã¯ãªãã å®è¡ãèšå®ãã¡ã€ã«ä¿®æ£ãããŒã¿ã®åæç§»è¡ãªã© æç«ã®å¯æãé¡ãã¿ãªããã ãšãªããã¹ãããããããªã 瀟å
å€ã§BQããŒã¿ãæ¢ã«å€æ¹é¢ã§æŽ»çšãããŠãã 察å¿åŸã®ããŒã¿äžåã¯åœ±é¿ã倧ããã ããŒã¿ã®åŸ©æ§ã倧å€ãã èŠèŸŒã¿å¹æã¯ã©ããªã®ïŒ ããŸãæéããããããªãã£ãã®ããããäžèšã®ç¢ºèªã«çããŸããã çŸç¶ã®BQã¯ãšãªã³ã¹ãç¢ºèª äž»èŠããŒãã«ãçšãã SQL åäœã§ã®å¹ææ€èšŒ æ¹åçã®ææ°ãã¥ãŒãçšãã广æ€èšŒã§ã¯ ã¹ãã£ã³éãšå®è¡æéå
±ã«1/2çšåºŠåæž ã確èªã§ããŸããã 1/5ã1/8çšåºŠæ¹åããŠããã±ãŒã¹ãããæ³å®ãã广ãããã®ãããšæããŸããã å°ã宿çãªBQå©çšç¶æ³ã®å¹ææž¬å®ã¯Lookeräžã®Marketplaceã§BQå©çšç¶æ³ãç°¡åã«èŠããããããã¡ããå©çšããŸãããæ
£ããŠãæ¹ã§ããã1æ¥ã§äœæã§ããããšæããŸãã å®è£
ããäžã§æèãããšãã å®éãã£ãŠã¿ããšãããããã£ãæ°ãããã®ã§ããããããšæãåºãã話ãããŠã¿ãŸãã BQå±¥æŽããŒãã«äœæåæãšãªãDAGäŸåé¢ä¿ æ¬çªããŒã¿ã®ç¢ºèªæéãã§ããã ãé·ãã«ãšãã æå ã¹ã¯ãªãã ãAirflowã«ç§»æ€ããããšæã£ãã ããŒã¿å質æ
ä¿ã¯ã©ãããã£ã㪠BQå±¥æŽããŒãã«äœæåæãšãªãDAGäŸåé¢ä¿ BQå±¥æŽããŒãã«ãäœæéå§ããã«ãããã ãã®æœåºããã¯ãšãªå
éšã§åç
§ãããŠããããŒãã«ã§å¿
èŠãªæ
å ±ãæã£ãŠããå¿
èŠããããŸãã ææ°ãã¥ãŒã¯æé軞ã®ç°ãªãããŒã¿ãè€æ°çµã¿åãããŠç©çåé€ãèæ
®ããŠããããããŒãã«æ¯ã«äŸåå
DAGãæé軞ãäŸåå
ã®ããŒãã«æ°ãç°ãªããŸãã ãããã®æ
å ±ãèšå®æ
å ±ãšããŠäºåã«å®çŸ©ããæ
å ±ããèªåã§æ§æããŠããŸãã å³ã«ãããšäžèšãšãªããŸãã å·ŠãExternalTaskSensorãå³ãBigQueryExecuteQueryOperatorãšãªãã å³ã®æ°ã ãããŒãã«ããããããªã€ã¡ãŒãžã§ãã åè: DAGéã®äŸåã®è©± DAGäŸåé¢ä¿ æ¬çªããŒã¿ã䜿ã£ãç¢ºèªæéãã§ããã ãé·ãã«ãšãã æ¬çªããŒã¿ã§ã®ç¢ºèªæéãå°ãã§ãé·ãã«åãããã æ¬çªåœ±é¿ããªãããéšåçã«å
è¡ãªãªãŒã¹ãç¹°ãè¿ããŸããã ããããããšã§ãæ¬çªããŒã¿ã§ç¢ºèªãé²ãã€ã€éçºãé²ããããŸããã å¥ä»¶ã®å¯Ÿå¿ã䞊è¡ããŠé²ããããããããšãå¯èœã§ããã ç¢ºèªæéã¯2,3é±éã»ã©åãããŠãšã©ãŒæ€ç¥ãããªããã°å€§äžå€«ã ãããããã§èããŠãŸããã ããŒã¿å質æ
ä¿ã¯ã©ãããã£ã㪠çµéšäžããŸãæãæããªãæ¹ãè¯ããšèããããªããŒã·ã§ã³ãå
¥ããŸããã çŸç¶ã§ã¯æ°ã«ãªãæã ãã«ããŠãããä»åŸå¿
èŠã«å¿ããŠå¢ãããŠããã°è¯ããšèããŸããã äž»èŠããŒãã«ã®æå³åããã§ãã¯ æ°æ§ã®ææ°ãã¥ãŒã§ä»¶æ°æ¯èŒ ãªã© å°ãBigQueryCheckOperatorãã·ã³ãã«ã§æ±çšæ§ãé«ãã£ãã®ã§æ¡çšããŠããŸãã éçºéäžã§ãæ³å®å€ã«ãšã©ãŒæ€ç¥ãããããä»åŸã®éçšã§ãããŒã¿å質ã®ç£èŠã«ããªãã®ã§ããã¯ã倧äºã ãšæããŸããã ä»åã¯èŠéã£ãããŒã¿åè³ªå¯Ÿå¿ æšä»ã®æè¡é²æ©ã ãšãã£ãšè³¢ãããæ¹æ³ãããã¯ãã ïŒãšèª¿ã¹ãŠããã Great Expectations ãšããã®ããããŸããã ä»åãæéã®å
Œãåãã§æ€èšŒã¯ã§ããªãã£ãã®ã§ãããBQããŒãã«ãèªå蚺æããŠããŒã¿ã®å質蚺æçµæãŸã§ãã¡ã€ã«åºåããŠãããããã§ãã GreatExpectationsOperatorãããããã§ãããæ©äŒãããã°è§Šã£ãŠã¿ããããªãšæããŸãã æ¢åã®æåå®è¡ ã¹ã¯ãªãã ãAirflowã«ç§»æ€ããããšæã£ãã ææ°ãã¥ãŒã«ã¯å人æ
å ±åãã/ãªãã®2ã€ååšããŠãããä»ãŸã§ã¯æ°èŠããŒãã«è¿œå æã®ãªãã¬ãŒã·ã§ã³æã¯ ruby ã¹ã¯ãªãã ãçšããŠããŒã«ã«ããæåå®è¡ããŠäœæããŠãŸããã ããªããŒã·ã§ã³ã§æ°æ§ã®ææ°ãã¥ãŒãæ¯èŒããã®ã«å¿
èŠã§ããããæåã§ããã®ãæéã§ããã®ã§ã ãããæ°ã«Airflow( python )ã«ç§»æ€ããŠèªåã§å®è¡ããããšèããŸããã 察å¿éäžã§ãããã¿ããšå
éšã§gsutilã³ãã³ã䜿ã£ãŠãããšã«æ°ã¥ãã ãã "çŸè¡ã®Airflowç°å¢ã ãšgsutilã³ãã³ã( CLI )ãå
¥ã£ãŠãªãããããã䜿ããžãããïŒ" ãšãªããŸããã ç®æšãªãªãŒã¹æéã®2é±éåãåã£ãŠãããå¹ææž¬å®ããã®ããã°ãæžãã¿ã€ãã³ã°ã®ããšããã£ãã®ã§æéãããããããªãã£ãã®ã§ãã CLI å
¥ãããšãªããšããããéã«åãããªããåŸåãã«ããããããšãªããŸãã(æ± ãã ãããèãããšå
šãåãæ¹æ³ã§ãããªããŠãããããšé ãåãæ¿ãã BQã®INFORMATION_SCHEMAãBigQueryHookãäœ¿ãæ¹æ³ã§å¯Ÿå¿ãé²ããŠä¹ãåããŸããã èéããã CLI ãç§»è¡å
ã§äœ¿ããªããŠãå¯Ÿå¿æéãè¿ã¥ããŠãã®ã§æ
ãŠããšãã話ã§ããw ãããããªãªãŒã¹åŸã®è©±ãããã ç¡äºã«äºå®éãã10ææ«ã«ãªãªãŒã¹ã§ããŸããŠããã®åŸã®è©±ãããããšæããŸãã 广ã¯ã©ãã ã£ãã®ïŒ BQã¯ãšãªã³ã¹ããšãã®ã¯ãšãªæ°ãææ¬¡åäœã§æ¯èŒããŠã¿ã(課é察象ã®ã¿) BQã¯ãšãªã³ã¹ãã§ããç±³ãã«æ¯èŒã§ "åææ¯ çŽ25%åæž" ãšãªããŸããã BQã¯ãšãªã¹ãã£ã³éã ãšPB( ãã¿ãã€ã )ã¬ãã«ã§ã®åæžã§ãã æ¡ã倧ããããŠããããããªãã§ãã.. æå¥BQã¯ãšãªã³ã¹ããšã¯ãšãªæ° å¹ææž¬å®ããã«ããã£ãŠ ãã¡ããæ¯èŒæã§äœ¿ããæ¹ã倿Žã«ãªã£ãã墿žããåããã ãšãã°ã¢ å
ã®ã»ãŒå
šãŠã®ãããžã§ã¯ããå«ãã æ°å€ã§ãã ã€ãŸããä»åæ¹åããææ°ãã¥ãŒä»¥å€ã®æ°å€ãå«ãã§ãã ã¯ãšãªæ°ã§ãããBQå±¥æŽããŒãã«èªäœã¯7æã«ã¯åãããŠãã 10æããããªããŒã·ã§ã³ãå
¥ããŠå
è¡ãªãªãŒã¹ããŠã圱é¿ãããã¯ãšãªæ°ãå¢ããŠãã çŽ14äžåã¯ä»å远å ããåŠçãåå ãã BQã¯ãšãªå¹³åå®è¡æéãšåŠçéãææ¬¡åäœã§æ¯èŒããŠã¿ã(課é察象ã®ã¿) BQã¯ãšãªå¹³åå®è¡æéã§ããã "åææ¯ çŽ40%åæž" ãããŠãããŸããã ææ°ãã¥ãŒã絡ãŸãªãã¯ãšãªã倿°ãããšæãã®ã§ããã åçŽãªå¹³åã§ãã®æ°å€ã¯æã£ãŠã以äžã«å¹æããã£ãã®ãããããŸããã åŸã10ææç¹ã§å°ãäžãã£ãŠãã®ã¯ãªãã§ã ããã å
è¡ãªãªãŒã¹ã§ããªããŒã·ã§ã³ãšãã§è»œãã¯ãšãªãæµãå§ãã圱é¿ãã ãŸãã¯éããã®ãå¥ä»¶ã§æ¹åãããã®ã§ãããã æå¥BQã¯ãšãªå¹³åå®è¡æé ãšããLooker ããã·ã¥ ããŒãå
éšã®ã¯ãšãªå®è¡æéãæ¥æ¬¡ã§èŠãŠã¿ã Lookerã§ã¯System Activity ãçšæãããŠããã®ã§ããã¡ãã§ç¢ºèªããŠã¿ãŸããã ãã¯ãååçšåºŠã®æ§èœæ¹åããããŠããã§ãã ç§ã ããã·ã¥ ããŒããããã€ãè§Šã£ãŠã¿ãŸãããã äœæã§ããããã¡ãã£ãšæ©ããªã£ããªããšããããããã§ããã ãšããLooker ããã·ã¥ ããŒãã®æ¥å¥ã¯ãšãªå®è¡æé éå»ã®ãšããæç¹ã®ããŒã¿ãé¡ã£ãŠã¿ã ãããªæãã®ã¯ãšãªã㪠äžèšã®ããã«ãããšãéå»ã®ãšããæç¹ã®ããŒã¿åç
§ãã§ãããã§ããã æ¬æ¥ã®ããŒãã«ãªã¬ãŒã·ã§ã³ã ãæèããã°è¯ãã®ã§æ¥œã§ããã DECLARE target_date string; SET target_date = ' 20221201 ' ; WITH _table_a AS ( SELECT _TABLE_SUFFIX AS tabledate, id, value, times FROM table_a__* WHERE target_date <= _TABLE_SUFFIX -- èŠããå±¥æŽã®æéãæå® ), _table_b AS ( SELECT _TABLE_SUFFIX AS tabledate, id, value2 FROM table_b__* WHERE target_date <= _TABLE_SUFFIX -- èŠããå±¥æŽã®æéãæå® ) SELECT ta.tabledate, ta.id, ta.value, ta.times, tb.value2 FROM _table_a ta -- BQå±¥æŽããŒãã« INNER JOIN _table_b tb -- BQå±¥æŽããŒãã« ON ta.id = tb.id -- æ¬æ¥ã®ããŒãã«çµåæ¡ä»¶ AND ta.tabledate = tb.tabledate -- _TABLE_SUFFIXå士ã§çµåãã ORDER BY ta.tabledate, ta.id ã¿ã€ã ãªãŒã ããŠæã£ãããš èŠããå±¥æŽã®æéã倧ããåãããããšå©çšããããŒãã«ã«ãã£ãŠã¯ããŒã¿ã®åç
§ãé
ãã§ããããã¯ãã¹ãã£ã³éããã°ãããšã«ãªãããã§ãã ãŸããæ¥æ¬¡ã®AM0:00æç¹ã®ã¿ããBQå±¥æŽããŒãã«ãæ®ããŠãªãã®ããããŸãã®ã§ã åŸåãæŽããããªåæãä»ã«èŠãåç
§ããæ¹æ³ããªãæãªã©ã®å©çšçšéã§åããŠããã§ãã Lookeräžã§ãexploreãäœæã㊠ã¿ã€ã ãªãŒã ããŠã¿ã ãã¯ãå°ãéãã§ãã... ãããªæãã§äœ¿ãã®ãè¯ãããã§ãããã ä»ã®exploreã§æ¢çŽ¢çã«åæãã€ã€ éå»ã®ãã®æã®ããŒã¿ã¯ã©ãã ã£ããã ãããšæ°ã«ãªã ä»åäœæããBQå±¥æŽããŒãã«ãçšããexploreã§ç¢ºèªãã 宿çã«ç¢ºèªããããªå Žå㯠ããã·ã¥ ããŒãåããŠæ§èœæ¹åããã ææ å
šäœãéããŠæŠãèšç»éãã«é²ããã倧ããªåé¡ãçºçãããã»ã£ãšããŸããã æžå¿µããŠãBQå±¥æŽäœæåãªã©ã§å¢ããã³ã¹ãããããŸãããããã以äžã«æžå°ããŠãããã®ã§è¯ãã£ãã§ãã ã¹ãã£ã³éãå³è©äžããã ã£ãã®ã§ã宿œã¿ã€ãã³ã°ãè¯ãã£ãã®ããªãšæããŸãã ãŸãããã®æ©äŒã«æåã§å®æœããŠããç®æãå°ãèªååã§ããã®ãè¯ãã£ãã§ãã ãã ãä»åäœæãããªãã¬ãŒã¿æ°ãçŽæ°åãã£ãŠãAirflowã®WebUIç»é¢ã§ãã°è¡šç€ºããããšãããå°ãéããŠéãã¥ãããªã£ãŠãŸãã(ã) ä»åŸãããŒã¿åºç€ã®æŽ»çšãé²ãã»ã©ãä»å察å¿ããã³ã¹ãåæžå¹æãå¢ãããšæããŸãã æåŸã« ããŒã¿åºç€ã®éçºéçšä¿å®ã«æºãããŠããæ¹ã«å°ãã§ãåèã«ãªãã°ãšæãããã®ããŒãã§èšäºãæžããŠã¿ãŸãããæ¬èšäºãéããŠå°ãã§ãã€ã¡ãŒãžãæŽããŠé ããŸããšå¹žãã§ãã ãŸãããå¿ããäžãèšèšã®çžè«ãã³ãŒãã¬ãã¥ãŒãããŠé ããäžåžã«ã¯æè¬ããŠãããŸãã ç§ããã¯ä»¥äžãšãªããŸããæåŸãŸã§ãèªã¿é ãããããšãããããŸããã ææ¥ã®èšäºã®æ
åœã¯ããŒã¿ã¢ããªã¹ãã®äºåããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ æ£ç€Ÿå¡ã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ã iOS ãšã³ãžãã¢ ã® æ± ç° ã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã® 20æ¥ ç®ã®èšäºã§ãã ã¯ããã« 2018幎㮠WWDC ã§çºè¡šãããCreateMLã§ãããçºè¡šåœå Xcode ãçšããã¢ãã«äœæãªã© Mac ã§ã®å©çšã«éå®ãããŠããŸããã ã§ããæè¿ã§ã¯ iOS ãiPadOSãtvOSã§ãå©çšã§ããããã«ãªã£ãŠããããªã³ã ãã€ã¹ ã§ã® æ©æ¢°åŠç¿ ã¢ãã«äœæãã§ããŸãã ïŒå©çšå¯èœOS㯠iOS15.0以éãiPadOS15.0以éãtvOS16.0以éã§ããïŒ ãã®èšäºã§ã¯ iOS ãçšãããªã³ã ãã€ã¹ ã§ã® æ©æ¢°åŠç¿ ã¢ãã«äœæãšãäœæããã¢ãã«ã®å©çšãããŠã¿ãããšæããŸãã MLStyleTransfer ãå©çšããŠã¢ãã«äœæãè¡ããç»åã®ç»é¢šå€æãããŠã¿ãŸãã ã³ãŒãå
ã«èŠãããã®ãã Forced Unwrapping ããŠãç®æããããŸãããå®è£
æã¯guardæçã䜿ã£ãŠé©å®æžãæããæ³å®ãããŠããŸãã æ©æ¢°åŠç¿ ã¢ãã«ã®äœæ ã¢ãã«ã®äœæã¯ä»¥äžã®ãããªã³ãŒãã§äœæã§ããŸããã³ãŒãéãå€ããªããç°¡åã« æ©æ¢°åŠç¿ ã®ã¢ãã«äœæãã§ããŸãã å¿
èŠã©ã€ãã©ãªã®èªã¿èŸŒã¿ import CreateML import CoreML import Combine åŠç¿çšã®ããŒã¿ããã©ã¡ãŒã¿ã®æºå let styleUrl : URL // ã¹ã¿ã€ã«ç»åã®URL let contentUrl : URL // åŠç¿çšã³ã³ãã³ãç»åã®ãã£ã¬ã¯ããªURL let data = MLStyleTransfer.DataSource.images(styleImage : styleUrl , contentDirectory : contentUrl ) let sessionParameters = MLTrainingSessionParameters(sessionDirectory : sessionUrl ) åŠç¿å®è¡ let job = try MLStyleTransfer.train(trainingData : data , sessionParameters : sessionParameters ) åŠç¿çµæã®åŸ
ã¡åããšã¢ãã«ã®ä¿å let writeToUrl : URL // ã¢ãã«ã®æžã蟌ã¿å
URL var mlModel : MLModel // äœæããæ©æ¢°åŠç¿ã¢ãã« job.result.sink { result in switch result { case .failure( let error ) : // ãšã©ãŒæã®åŠç case .finished : // å®äºåŸã®åŠç } receiveValue : { model in do { try model.write(to : writeToUrl ) let compiledUrl = try MLModel.compileModel(at : writeToUrl ) mlModel = try MLModel(contentsOf : compiledUrl ) } catch { // ãšã©ãŒæã®åŠç } } .store( in : & cancellables) ã¢ãã«äœæã³ãŒãå®è£
æã®æ³šæäºé
ã·ãã¥ã¬ãŒã¿ã®ãã«ãã§ã¯åããªãããã宿©ãã«ãã§ãã«ãããå¿
èŠããããŸãã ã·ãã¥ã¬ãŒã¿ã§ãã«ãããããšãããšãCreateMLã® ãã¬ãŒã ã¯ãŒã¯ èªäœãèŠã€ããã以äžãšã©ãŒãåºãŸãã No such module 'CreateML' æ©æ¢°åŠç¿ ã¢ãã«ã®å©çš äžèšã§äœæããã¢ãã«ã¯ä»¥äžã®ããã«å©çšã§ããŸãã ç»é¢šå€æå¯Ÿè±¡ã®UIImageãçšæããåºåãUIImageãšããŠå©çšã§ããããã«å®è£
ããŠã¿ãŸãã å¿
èŠã©ã€ãã©ãªã®èªã¿èŸŒã¿ import CoreML import Vision import VideoToolbox å
¥åå€ã®æºå let inputImage : UIImage // ç»é¢šå€æã®é©å¿å¯Ÿè±¡ç»å let cgImage = inputImage.cgImage let imageConstraint = mlModel.modelDescription.inputDescriptionsByName[ "image" ]?.imageConstraint let featureValue = try MLFeatureValue(cgImage : cgImage! , constraint : imageConstraint! ) let featureProvider = try MLDictionaryFeatureProvider(dictionary : [ "image": featureValue ] ) ç»é¢šå€æåŸã®åºåããŒã¿åãåºã let mlModel : MLModel // äœæããæ©æ¢°åŠç¿ã¢ãã« let stylizedImage = try mlModel.prediction(from : featureProvider ) let imgBuffer = stylizedImage.featureValue( for : "stylizedImage" )?.imageBufferValue UIImageã«å€æ var cgImageForConvert : CGImage? VTCreateCGImageFromCVPixelBuffer(imgBuffer ! , options : nil , imageOut : & cgImageForConvert) let stylizedUIImage = UIImage(cgImage : cgImageForConvert! , scale : 1.0 , orientation : inputImage.imageOrientation ) çµæã®ç¢ºèª å€æçµæ å€æå¯Ÿè±¡ã®ç»åã« ã¹ã¿ã€ã«ç» åã®ç»é¢šãé©å¿ãããšããããã£ãçµæã«ãªãããã§ãã ä»åã¯ããã©ã«ãã®èšå®ããã®ãŸãŸå©çšããŸããããã¢ãã«äœææã«IterationsãStrengthãDensityãªã©ã®ãã©ã¡ãŒã¿ã調æŽããããšãã§ããã®ã§ããã¡ãã倿ŽãããšãŸãéã£ãåºåãåºãããšãã§ããŸãã ãããã« ã¢ãã«ã®äœæã»å©çšãå°ãªãã³ãŒãéã§ç°¡åã«å®çŸã§ããŸããã ãã®èšäºã§ã¯ç»é¢šå€æãæ±ã£ãããšãããå©çšã±ãŒã¹ã¯å€ããªããããããŸããããClassfier ã Regressor ãå©çšã§ãããã®ãããããæ§ã
ãªå±éãèãããããã§ãã ã¹ããŒããã©ã³ ã®ã ãã€ã¹ äžã§åãã®ã§ãããŒã¿ãã¯ããŒãºããªç¶æ
ã§ç®¡çã§ããWebAPIã«æããå¿
èŠããªãã®ã§å®å
šã«æ±ãããšãã§ããã®ã倧ããªã¡ãªããã ãšæããŸãã åé¢ã®æžå¿µäºé
ãšããŠã¯ãã ãã€ã¹ ã®åŠçèœåã«äŸåããã®ã§ãå¿«é©ãªå©çšãèãããšããçšåºŠ ãŠãŒã¹ã±ãŒã¹ ã«å¶éãããã£ãŠãããããããŸããã ïŒä»åã¯ãã¥ãŒãã³ã°ãªã©ã¯ç¹ã«å ããŠãªãã®ã§ã iPhone 11 Pro 端æ«ã§ã¢ãã«äœææã«30åã»ã©æéãèŠããŠããŸããïŒ ãšã¯ããç°¡åã«å®è£
ã§ãã æ©æ¢°åŠç¿ ã®ã¢ãã«äœæãå©çšããªã³ã ãã€ã¹ ã§å®çµããŠåãããšãŠã匷åãªFrameworkã ãšæããŸããçŽè¿ã® WWDC ã§ã¯ Create ML Components ãçºè¡šãããŠãããã iOS ã§ã æ©æ¢°åŠç¿ é¢é£ã¯ããã«é²åãç¶ããŠããã®ã§ãããããæ¥œãã¿ã§ãã ææ¥ã®èšäºã®æ
åœã¯ããŒã¿ãšã³ãžãã¢ã®è°·å
ããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã® 19 æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãWebãšã³ãžãã¢ã®å¹³äºã§ããæ®æ®µã¯SELLããŒã ã«æå±ããŠã㊠BUYMA ã«ãããåºåè
åŽã®æ©èœéçºãæ
åœããŠããŸãã ä»åã¯ãæè¿ãªãªãŒã¹ããã«ã¿ãã°ã·ã¹ãã ããµãŒãã¬ã¹ ã¢ãŒããã¯ã㣠ã§éçºããã®ã§å©çšããæè¡ãåŠã³ã«ã€ããŠæžããããšæããŸãã ç®æ¬¡ ç®æ¬¡ ãµãŒãã¬ã¹ã¢ãŒããã¯ã㣠ã¡ãªãã ãã¡ãªãã ã«ã¿ãã°ã·ã¹ãã ãšã¯ ã·ã¹ãã èšèš æè¡ã¹ã¿ã㯠ãµãŒãã¬ã¹ãã¬ãŒã ã¯ãŒã¯ API ã«ã¿ãã°ããŒã¿æ°èŠäœæãæŽæ°åŠç ã¡ãªãã ãã¡ãªãã åŠã³ è¯ãã£ãç¹ æªãã£ãç¹ ãµãŒãã¬ã¹ ã¢ãŒããã¯ã㣠ãããããµãŒãã¬ã¹ ã¢ãŒããã¯ã㣠ãšã¯äœã§ããããã人ã«ãã£ãŠè§£éã¯ç°ãªãããšæããŸãããç§ã¯ã€ãã³ãé§ååã®ããã°ã©ã å®è¡ç°å¢ãå©çšããŠã¢ããªã±ãŒã·ã§ã³ãéçºãã ã¢ãŒããã¯ã㣠ã ãšçè§£ããŠããŸããã·ã¹ãã ãéçºããŠããäžã§ãµãŒããŒãæèããå¿
èŠãç¡ããšããç¹åŸŽããããŸãããã£ããã¡ãªãããšãã¡ãªããã¯ä»¥äžãæããããŸãã ã¡ãªãã ãµãŒããŒãæ§ç¯ããæéãçããŠãéçºè
ãã¢ããªã±ãŒã·ã§ã³ã®éçºã«å°å¿µã§ããã ãªãœãŒã¹ã®å©çšæéã¯ã³ãŒããå®è¡ããæéã«å¯ŸããŠèª²éããããã¢ã€ãã«æéã¯èª²éãããªãã ãã¡ãªãã å©çšã§ããèšèªãéãããŠããã å®è¡æéå¶é Lambdaã ãšæå€§15å ã«ã¿ãã°ã·ã¹ãã ãšã¯ 次ã«ä»åéçºããã«ã¿ãã°ã·ã¹ãã ã«ã€ããŠèª¬æããŸããã«ã¿ãã°ã·ã¹ãã 㯠BUYMA ã®ã«ã¿ãã°åºåæ©èœã®ããã®ã·ã¹ãã ã§ãã ã«ã¿ãã°åºåæ©èœã¯ãåºåè
ã«å¯Ÿã㊠BUYMA åŽã§çšæããã«ã¿ãã°ãæäŸããããšã§ãåºåè
ã®åºåäœæ¥ã®å¹çåãé«å質ãªç»åã®æäŸãç®çãšããŠããŸãã ã«ã¿ãã°åºåã®å€§ãŸããªæµãã¯ä»¥äžã«ãªããŸãã æ®åœ±ããŒã ãååãæ®åœ±ãç»åã ã¯ã©ãŠã ã«ã¢ããããŒã ãªãã¬ãŒã·ã§ã³ããŒã ãè²åãåçªã®ç¢ºèªããµã€ãºã®èšæž¬ã宿œ 1,2ã®æ
å ±ãã«ã¿ãã°ã·ã¹ãã ã® API çµç±ã§ããŒã¿ä¿å 4ã§ä¿åããããŒã¿ã API ã§ BUYMA åŽã«æäŸ BUYMA äžã®ã«ã¿ãã°åºåç»é¢ããåºåè
ãé©åœãªã«ã¿ãã°ãéžæããŠãåºå 以äžã®æµãã®3,4ã®éšå(ã«ã¿ãã°ããŒã¿ã®æ°èŠäœæ/æŽæ°ãæäŸ)ãã«ã¿ãã°ã·ã¹ãã ãæ
åœããŠããŠãåŒç€Ÿã® ã¯ã©ãŠã ãµãŒãã¹å©çšå®çžŸãã AWS äžã«æ§ç¯ããŸããã ã·ã¹ãã èšèš 詳现ã¯çç¥ããŠããŸããã以äžã ã¢ãŒããã¯ã㣠å³ã«ãªããŸãã ã«ã¿ãã°ããŒã¿æ°èŠäœæ/æŽæ°ã¯ Google App Scriptãã API çµç±ã§å®è¡ãããå³ã®äžéšã該åœéšåã§ãã ã«ã¿ãã°ããŒã¿æäŸã API çµç±ã§å®çŸããŠããŸãã æè¡ã¹ã¿ã㯠次ã«ã«ã¿ãã°ã·ã¹ãã ã®éçºã«å©çšããæè¡ã䞻㫠AWS ã®ãµãŒãã¹ã«ã€ããŠç޹ä»ããŸãã ãµãŒãã¬ã¹ ãã¬ãŒã ã¯ãŒã¯ ãŸãããµãŒãã¬ã¹ ãã¬ãŒã ã¯ãŒã¯ ã«ã€ããŠã¯ SAM ãå©çšããŸããã ãµãŒãã¬ã¹ ãã¬ãŒã ã¯ãŒã¯ ãšã¯ãµãŒãã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããäžã§Infrastructure as Codeãå®çŸããããã®ãã®ã§ããä»åå©çšããSAMã®ç¹åŸŽã¯ä»¥äžã«ãªããŸãã ãµãŒãã¬ã¹ã¢ããªã±ãŒã·ã§ã³æ§ç¯çšã® ãªãŒãã³ãœãŒã¹ ãã¬ãŒã ã¯ãŒã¯ YAML ãã¡ã€ã«ã§ãªãœãŒã¹ç®¡ç CloudFormationæ§æãæ¡åŒµããŠãµãŒãã¬ã¹ã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ãç°¡åã«ãªã£ãŠãã ãµãŒãã¬ã¹ ãã¬ãŒã ã¯ãŒã¯ ã«ã¯SAMãå«ããŠä»£è¡šçãª3ã€ã®ãµãŒãã¹ããããããããã®ã¡ãªããã»ãã¡ãªããã¯ä»¥äžã ãšèããŠããŸãã SAM ã¡ãªãã CloudFormationãæœè±¡åãããã®ãªã®ã§, CloudFormationãç¥ã£ãŠãããæžããããã ãã¡ãªãã æ§æãè¥å¹²åé· serverless ã¡ãªãã AWS , GCP , Azureã§å©çšã§ããã ãã¡ãªãã serverlessç¬èªã®æ§æãèŠããå¿
èŠãããã AWS CDK ãã¡ãªãã ããã°ã©ãã³ã°èšèªã§èšå®ãèšèŒã§ããããå¯èªæ§ã yaml ã«æ¯ã¹ããšäœã ããŒã«ã«ã§ã®ãã¹ãå®è¡ã«ã¯ãSAMã䜿ãå¿
èŠãããã ããæ¹ ä»åãéçºããŒã ã«CloudFormationã®çµéšããããšã³ãžãã¢ãå±
ãç¹ããã«ã ã¯ã©ãŠã ã«å¯Ÿå¿ããå¿
èŠããªãç¹ãããŒã«ã«ç°å¢ã§ã®å®è¡ãç°¡åãªç¹ãã SAM ãéžæããŸããã API API ã¯äžè¬ç㪠API Gateway ãšLambdaã®æ§æã§ãã工倫ããç¹ãšããŠã¯ API Gateway ãšSwaggerã® yaml ãã¡ã€ã«ã飿ºã㊠API å®çŸ©ããããã«ããŸããã 以äžã®ããã«Swaggerã§å®çŸ©ãã yaml ãã¡ã€ã«ã®ãã¹ãæå®ããããšã§é£æºã§ããŸããSwaggerã§ API å®çŸ©ããããã«ããããšã§ API ã远å ããããã«ã¯ API å®çŸ© yaml ãã¡ã€ã«ãæŽæ°ããå¿
èŠãããããã API 远å ã«ããããã¥ã¡ã³ãã®æŽæ°æŒããé²ãããšãã§ããŸãã Resources : Api : Type : AWS::Serverless::Api Properties : DefinitionBody : 'Fn::Transform' : Name : 'AWS::Include' Parameters : Location : api.yaml ã«ã¿ãã°ããŒã¿æ°èŠäœæãæŽæ°åŠç ã«ã¿ãã°ããŒã¿ã®æ°èŠäœæãæŽæ°åŠçéšåã«ã¯ AWS Step Functions ãå©çšããLambdaãã¯ãŒã¯ãããŒçã«å®è¡ããŠããŸãã AWS Step Functionsã¯ã¯ãŒã¯ãããŒç®¡çãµãŒãã¹ã§ json ã§ã¯ãŒã¯ãããŒãå®çŸ©ããŸãã AWS Step Functionsãå°å
¥ããŠã¿ãŠæããã¡ãªããããã¡ãªããã¯ä»¥äžã«ãªããŸãã ã¡ãªãã Step Functionsã® GUI ããªããã§ããã ã¯ãŒã¯ãããŒã®å
šäœåãåã¿ã¹ã¯ã®é²è¡ç¶æ³ããã°ãæåç¶æ³ãããããããã Lambdaãåå²ããããšã§åLambdaã®åé床ãé«ãŸããã¡ã³ããã³ã¹æ§ããããã åLambdaã®ãªãã©ã€èšå®ãç°¡åã ãã¡ãªãã éäžã®Lambdaã§å€±æããéã®ããŒã¿æŽåæ§ãèæ
®ããå¿
èŠãããã å人çã«ã¯ GUI ããªãããªç¹ãç¹ã«å¥œãã§ãããŒã¿äœæãæŽæ°åŠçã«äœãäžå
·åãããéã¯åºæ¬çã«ãã® GUI ãã ãããã° ãéå§ããããã ãããã° ãå¹ççã«ãªãããã«ã¿ã¹ã¯æåæã®åºåå
容ã倱ææã®äŸå€ã¡ãã»ãŒãžã®å
容ã工倫ããŠå®è£
ããŸããã 以äžãåŠç詳现ç»é¢ã§ãå·Šã®ã¢ã€ã³ã³ãã¯ãªãã¯ããããšã§åã¿ã¹ã¯ã®Input, Outputã確èªã§ããŸãã åŠã³ æåŸã«éçºããŠåŸãåŠã³ã«ã€ããŠæžããããšæããŸãããŸãããµãŒãã¬ã¹ ã¢ãŒããã¯ã㣠ã§éçºããŠäœæããè¯ãã£ãç¹ãæªãã£ãç¹ã¯ä»¥äžã«ãªããŸãã è¯ãã£ãç¹ éçºè
ã ãã§æ§ç¯ã§ãããªãœãŒã¹ãå€ãã管çãäžèŠãªã®ã§éçºäœéšãè¯ãã£ãã AWS ãå©çšããéå»ã® ãŠãŒã¹ã±ãŒã¹ ãå€ããåèã«ããæ
å ±ã«å°ããªãã£ãã å
¬åŒããã¥ã¡ã³ã Serverless Land æªãã£ãç¹ ã³ãŒãã®å
± éå ãé£ãã Lambda Layer ã䜿ãã°å¯èœããã ä»åã®å ŽååLambdaã«å
±éããã¢ãã«å®çŸ©ã¯å
± éå ãããã£ãã ãŸããä»åLambda㯠Python ã§éçºããŸãããéçºåæã¯æ®æ®µå©çšããŠãã Ruby ãšã®èšèªçéããåå ã§éçºã«æéãããããŸããã Lambdaã®å
58%ãPythonãå©çš ããŠãããšããæ
å ±ãç¥ããã¡ã€ã³ã®æœ®æµã«ä¹ã£ãã»ããè¯ããšå€æã㊠Python ãéžæããŸãããã ç¹ã« Python ãå©çšããŠè¯ãã£ãç¹ãç¡ãã£ãã®ã§ã¹ã±ãžã¥ãŒã«ãããªãã¿ã€ããªå Žåã¯æ®æ®µæ
£ããŠããèšèªã䜿ã£ãŠããããšæããŸããã 以äžã«ãªããŸãã ææ¥ã®èšäºã®æ
åœã¯ãšã³ãžãã¢ã®æ± ç°ããã§ãããæ¥œãã¿ã« æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ãUIUXãã¶ã€ããŒã®åç°ã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®18æ¥ç®ã®èšäºã§ãïŒ åŒç€Ÿã§ã¯ã BUYMA ã®ãµãŒãã¹ãã¢ããªã»Webãµã€ãã®UIUXãããããããŠããããšãç®çã«ã ãããæ·±ããŠãŒã¶ãŒãçè§£ããŠãããŠãŒã¶ãŒã«ãšã£ãŠäŸ¡å€ã®ããäœéšããå±ããŠããããã«ãUXãªãµãŒãã«åºã¥ããæ¹åã«åãå
¥ããŠããŸãã ä»åã¯ã BUYMA ã®é¡§å®¢çè§£ã®ããã«é²ããŠããUXãªãµãŒãã®åãçµã¿ã«ã€ããŠã玹ä»ããŸãã ã1ããŠãŒã¶ãŒã»ã°ã¡ã³ãåé¡ïœUser Segmentation BUYMA ã®äŒå¡ã«ã€ããŠãRFMã®ææšãããŒã¹ã«ã å©çšé »åºŠè»ž ïŒRecencyïŒFrequencyïŒãã äŸ¡æ Œå¿å軞 ïŒMonetaryïŒãã 幎代軞 ã ãããŠãŒã¶ãŒã»ã°ã¡ã³ãã®åé¡ãé²ããŠããŸãã ãåã»ã°ã¡ã³ãã®ããªã¥ãŒã ããææ¡ããŠã äž»èŠãªã»ã°ã¡ã³ãã«ããããŠãŒã¶ãŒã®è³Œè²·åŸåãå©çšåŸå ã«ã€ããŠã èŠèŠçã«æããããããã«Lookerã®ããŒã«æŽåãããŒã¿ã¢ããªã¹ããšUIUXãã¶ã€ããŒãååã§å®æœããŠããŸãã å©çšé »åºŠè»žïŒRecencyïŒFrequencyïŒ å
šäœã®è³Œè²·åŸåããé©å㪠éŸå€ ãæ€èšããŠããå©çšé »åºŠããšãçŽè¿ã®å©çšåŸåãããã»ã°ã¡ã³ãã®åé¡ãé²ããŠããŸãã äŸ¡æ Œå¿å軞ïŒMonetaryïŒ ãŠãŒã¶ãŒã«ãããçŽç²ãªç涯环èšè³Œå
¥éé¡ã§åé¡ããã®ã§ã¯ãªãããã©ã®ãããã®äŸ¡æ Œåž¯ã®ã¢ã€ãã ãäžå¿ã«è³Œå
¥ããŠãããïŒããã©ããªäŸ¡æ Œåž¯ã®ã¢ã€ãã ã«èå³é¢å¿ãé«ããïŒããšãã芳ç¹ã§ãF0ãŠãŒã¶ãŒãF1-2ãšãã£ãå©çšæŽã®æµ
ããŠãŒã¶ãŒã«ã€ããŠãäŸ¡æ ŒïŒè³Œè²·è¡åïŒã«é¢ããå¿åãææ¡ã§ããããã«åé¡ãé²ããŠããŸãã 幎代軞 幎代ã«ã€ããŠã¯ãçæŽ»ã¹ã¿ã€ã«ãè¡åç¹æ§ã®ç°ãªããèæ
®ããŠåé¡ããŠããŸãã äžèšã®ïŒã€ã®è»žãèæ
®ããŠãã瀟å
ã§äž»èŠãªã»ã°ã¡ã³ãã®ãŠãŒã¶ãŒã¢ãã«ã«ã€ããŠå
±éçè§£ã§ããããã«ããããšããç®æšã«ãŠãŒã¶ãŒã»ã°ã¡ã³ãã®èª¿æ»ã»åé¡ãé²ããŠããŸãã ãŸãããããã® å®é çãªãŠãŒã¶ãŒã»ã°ã¡ã³ãã®åé¡ãããšã«ã ã2ããã3ãã®å®æ§èª¿æ»ãé²ããããšã§ãåã»ã°ã¡ã³ãã®ãããªã¢ã«ãªäŸ¡å€èгã»è¡åç¹æ§ãUXã«é¢ãã課é¡ãææ¡ããŠãå
·äœçãªæ¹åãé²ããããããã«ããŠããŸãã ã2ããŠãŒã¶ãŒã¢ã³ã±ãŒãïœUser questionnaire åŒç€Ÿã§ã¯ã䞻㫠Google ãã©ãŒã ãçšããŠãŠãŒã¶ãŒã¢ã³ã±ãŒããéçšããŠããŸãã äž»ã«ä»¥äžã®ãããªæé ã§ãã1ãã®ãŠãŒã¶ãŒã»ã°ã¡ã³ãåé¡ãããŒã¹ã«ãUXã«ã€ããŠæ·±å ã調æ»ãããã»ã°ã¡ã³ãã«çµã£ãŠã¢ã³ã±ãŒãã宿œããŠããŸãã ã¢ã³ã±ãŒãã¯ãã¡ãŒã«ãLINEã«ããé
ä¿¡ããWebãµã€ãäžã«ã¢ã³ã±ãŒãåéãããŒãåºããªã©ã察象ã®ãŠãŒã¶ãŒã»ã°ã¡ã³ãã«åã£ãã¿ã€ãã§å®æœããããã«å¿ãããŠããŸãã ã¢ã³ã±ãŒãã®èšç»ã»å®æœæé ã¢ã³ã±ãŒãã®ãªãµãŒãç®çã»æ€èšŒå
å®¹ã®æŽç é
信察象è
ã®éžå® ã¢ã³ã±ãŒãèšåã®èšèšã Google ãã©ãŒã ã®äœæ ã¢ã³ã±ãŒãã®é
ä¿¡ã»å
¬é ã€ã³ã»ã³ãã£ã ïŒè¬ç€ŒïŒã®ä»äž ã¢ã³ã±ãŒãçµæãŸãšãã»å
±æã»ãµãããã ã3ãã®ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒãåæã«ã èšåã®äžã§ã€ã³ã¿ãã¥ãŒã«ååããã ããååè
ãåãããã¡ã§ã¢ã³ã±ãŒãã宿œããããšããããŸãã äŒå¡åãã®ãŠãŒã¶ãŒã¢ã³ã±ãŒãã§ã¯ãäŒå¡ããŒã¿ãšçŽä»ããŠåæã§ããããã«ããŠããããã ãŠãŒã¶ãŒã»ã°ã¡ã³ãããŠãŒã¶ãŒã®è³Œè²·åŸåã»å©çšåŸåãèžãŸããŠããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã«ãååããã ãããæ¹ãéžå®ãããŠããã ãããã«ããŠããŸãã ãŸãã现ããæ€èšŒãããUXã«ã€ããŠã®èšåãã¢ã³ã±ãŒãã«çšæããããšã§ã ã¢ã³ã±ãŒãåçå
容ããããããã䟡å€èгãè¡åç¹æ§ãæã€ãŠãŒã¶ãŒãã«å¯ŸããŠã€ã³ã¿ãã¥ãŒã宿œã§ããããã«å·¥å€«ããŠããŸãã ã3ããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒïœUser Interview ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã¯ã2ãã®ãŠãŒã¶ãŒã¢ã³ã±ãŒããããUXã«ã€ããŠããæ·±å ãããŠèª¿æ»ãããå Žåã«å®æœããŠããŸãã è¿å¹Žã®ã€ã³ã¿ãã¥ãŒã¯ããã¹ãŠãªã³ã©ã€ã³ïŒZoomïŒãçšããã€ã³ã¿ãã¥ãŒãšãããŠããã ããŠãããããŸããŸãªå°åãããåå ããã ããŠããŸãã ã€ã³ã¿ãã¥ãŒã¯çŽ60åéã§å®æœããŠããã ãŠãŒã¶ãŒã®äŸ¡å€èгãè¡åç¹æ§ïŒæ¥é ã®è¡åãå奜ãªã©ïŒãã ã€ã³ãµã€ã ãæ·±å ãããŠãã ã A. ãŠãŒã¶ãŒ ã¢ããªã³ã° åã®èšå ããšã éå»ã®äœéšãããããè¡ãããäºæãå®éã®ç»é¢ãçšããŠã·ãã¥ã¬ãŒã·ã§ã³ããã ãã€ã€ã ãã®æ§åã芳å¯ã»ãããŒã«æ²¿ã£ãŠUXïŒãã®ã¿ã€ãã³ã°ã«ãããæèããã€ã³ã»ã²ã€ã³ãªã©ïŒã«ã€ããŠæ·±å ãããŠãã ã B. UXæ€èšŒåã®èšå ãã®ïŒã€ããæ§æããŠããŸãã ã€ã³ã¿ãã¥ãŒã®äž»ãªèšç»ã»å®æœæé ã«ã€ããŠãã玹ä»ããŸãã ã€ã³ã¿ãã¥ãŒã®èšç»ã»å®æœæé ã€ã³ã¿ãã¥ãŒã®ç®çã» ãã¢ãª ã³ã°ãã€ã³ãã®æŽç ã€ã³ã¿ãã¥ãŒåè£è
éžå® *1 ã€ã³ã¿ãã¥ãŒã·ããªãªã®äœæ ã€ã³ã¿ãã¥ãŒæèšºã»èª¿æŽãã¹ã±ãžã¥ãŒã«äœæ åå¥ã€ã³ã¿ãã¥ãŒã·ãŒãã®äœæ ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã®å®æœ ã€ã³ã»ã³ãã£ã ïŒè¬ç€ŒïŒã®ä»äž ã€ã³ã¿ãã¥ãŒçµæãŸãšãã»å
±æã»ãµãããã ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã®åã«ããŠãŒã¶ãŒããããã®ãåå¥ã€ã³ã¿ãã¥ãŒã·ãŒãããçšæããããã«ããŠããŸãã ããããã£ãŒã«ããã賌買åŸåãããå©çšåŸåïŒãæ°ã«å
¥ããç»é²å¹Žãªã©ïŒããã賌買ãåãåããã®å±¥æŽãããã¢ã³ã±ãŒãã®åçããªã©ã现ãããŸãšããã·ãŒããšãªã£ãŠããã åºæ¬çãªã€ã³ã¿ãã¥ãŒã·ããªãªã«åºã¥ãã ãã¢ãª ã³ã°ã®äžã§ãã€ã³ã¿ãã¥ãŒå¯Ÿè±¡è
ããããã«åã£ã ãã¢ãª ã³ã°ãã§ããããã«å·¥å€«ããŠããŸãã ãŸãããã€ã³ã¿ãã¥ãŒã®èšé²ãã«ã€ããŠãåäžã·ãŒãå
ã«åããããšã§ããŠãŒã¶ãŒåäœã§ä¿¯ç°ã§ããããã«ããŠãåŸåã®ææ¡ãããæ¯ãè¿ãããããããã¡ãã«ããŠããŸãã åŒç€Ÿã§ã¯ã宿çã«ãŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒã宿œãããŠããã ããŠãããŸãã ä»åŸãããŠãŒã¶ãŒã€ã³ã¿ãã¥ãŒãéã㊠å®é çãªæ°å€ããã¯èªã¿åãããšãé£ããããŸããŸãªãã€ã³ãæ°ä»ããåŸãŠãããããšèããŠããŸãã ãããã« åŒç€Ÿã§ã¯ãUXãªãµãŒãããå°ããUXã«ããã課é¡ïŒAS-ISïŒãããæœçã»äŒç»ïŒTO-BEïŒãæ€èšããŠãæ¥ã
ãµãŒãã¹ãšUIUXã®æ¹åã«åãçµãã§ããŸãã 仮説éãã®å¹æãåŸãããŠããã®ã確èªããŠããããããã¡ã«ããŠããããã«ãABãã¹ãã®æŽ»çšã广æ€èšŒã宿œããŠçްããã¢ããããŒããæ¹åä¿®æ£ããããªã£ãŠããŸãã UXãªãµãŒããéããŠãããæ·±ããŠãŒã¶ãŒãçè§£ããŠãããŠãŒã¶ãŒã«ãšã£ãŠäŸ¡å€ã®ããäœéšããå±ããããããã BUYMA ã®ãµãŒãã¹ã»UIUXã®æ¹åã«ãæåŸ
ããã ããŸããšå¹žãã§ãã ææ¥ã®èšäºã®æ
åœã¯ ãµãŒããŒãµã€ããšã³ãžãã¢ ã® å¹³äº ããã§ãïŒ ãæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co *1 : ã2ããŠãŒã¶ãŒã¢ã³ã±ãŒãã«ãŠãã€ã³ã¿ãã¥ãŒååè
ãåæã«åãããã«ããŠããŸã
ããã«ã¡ã¯ãããŒã¿ãµã€ãšã³ãã£ã¹ãã®å éšã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®16æ¥ç®ã®èšäºã§ãã æ®æ®µã®æ¥åã§ã¯æ
å ±æ€çŽ¢(æ€çŽ¢/ã¬ã³ã¡ã³ã)ãäžæ£æ€ç¥ããŠãŒã¶ãŒå±æ§ã®æšå®ãªã©ã BUYMA ã«ãããã¯ããšããŠçµã¿èŸŒãããšãè¡ã£ãŠããŸãããã®äžã§ã ã¢ããªã³ã° 以åã®ã¿ã¹ã¯èšèšãæ¢çŽ¢çããŒã¿åæ( EDA : Explanatory Data Analysis)ãããŒã¿ã®ã¯ã¬ã³ãžã³ã°ã»ååŠçãç¹åŸŽéãšã³ãžãã¢ãªã³ã°ãªã©ã䞻㫠SQL (BigQuery)ã§è¡ãéšåã«å€ãã®æéãå²ããŠããŸãã 1 ä»åã¯ãéåæã®ããäºæž¬çµæããæ°ã¥ããåŸåãå
ã«ããŒã¿ã®ååŠçã远å ããããšã§ã¢ãã«ã®ç²ŸåºŠæ¹åã«ã€ãªãã£ãäžäŸã玹ä»ããããŸãã æŠèŠ æ°ã¥ããçµç·¯ æ€åºæ¹æ³ çµæ ãŸãšã ããŸã æŠèŠ ããŒã¿ãã æ©æ¢°ç ãª(ãããã®ãããª)ã¢ã¯ã»ã¹ãé€å€ããããšã§ã æ©æ¢°åŠç¿ ã¢ãã«ã®ç²ŸåºŠãæ¹åããŸããã ããããæ°ã¥ããçµç·¯ãæ€åºæ¹æ³ãé€å€ããçµæã«ã€ããŠç޹ä»ããããŸãã æ°ã¥ããçµç·¯ ååã®ãã©ã³ãã®item2vecãé²èЧ履æŽããçæããéã«ã BUYMA å
ã§äººæ°ã®ãã©ã³ããšçŽè¿1幎ã§1ä»¶ã賌å
¥ãããŠããªããã€ããŒãªãã©ã³ãã®é¡äŒŒåºŠãéåžžã«é«ãåºãŠãããã¿ãŒã³ãè€æ°èŠåããããŸãããéåæãæããåŠç¿ããŒã¿ã§ãã€ããŒãªãã©ã³ãã«å¯ŸããŠã¢ã¯ã·ã§ã³ãè¡ãªã£ãŠãããŠãŒã¶ãŒã®logãé²èЧæ°ãå€ãé ã«èŠããšãããäžå®ééã§å¥ã®åå詳现ã«é·ç§»ãããšããã®ãç¹°ãè¿ããŠããlogãèŠåãããã人éã§ã¯ãªãã¢ã¯ã»ã¹ã®å¯èœæ§ãé«ããšå€æããŸããã ã¡ãªã¿ã«ãitem2vecãªã©ã®ãã¯ãã«ã¯arrayåã§BigQueryã«æ ŒçŽããã³ãµã€ã³é¡äŒŒåºŠãªã©ã SQL ã§èšç®ã§ããæ§ã«ããŠããŸãããšãŠã䟿å©ã§ãã create temp function cos_sim(vec1 array<float64>, vec2 array<float64>) returns float64 as ( ( select sum (elem1 * elem2) / sqrt ( sum (elem1 * elem1))/ sqrt ( sum (elem2 * elem2)) from unnest(vec1) elem1 with offset pos1 inner join unnest(vec2) elem2 with offset pos2 on pos1 = pos2 ) ); æ€åºæ¹æ³ ã1床ã§ã1å以å
ã«æ¬¡ã®åå詳现ãžã®é·ç§»ã100å以äžç¹°ãè¿ããŠãããŠãŒã¶ãŒããšããæ¡ä»¶ã§æ€åºããŸããã 2 ãã¡ãã SQL ã§ã»ãã·ã§ãã€ãºãè¡ãããšã§å®è£
ããŸããã 3 ã»ãã·ã§ãã€ãºã®ã€ã¡ãŒãž ãµã³ãã«ã¯ãšãª with item_action_view_detail as ( select ial.user_id, ial.time, ial.time - lag(ial.time) over ( partition by ial.id order by ial.time ) as interval_action from item_action_log as ial where ial.action = " view_detail " ), session_head as ( select id, time, case when lag(time) over ( partition by user_id order by time ) is null then 1 when time - lag(time) over ( partition by user_id order by time ) > interval 60 second then 1 else 0 end as session_head_flg from item_action_view_detail ), session as ( select user_id, time, concat ( user_id, " - " , sum (session_head_flg) over ( partition by user_id order by time rows between unbounded preceding and current row ) ) as session_id, from session_head ), session_summary as ( select session_id, user_id, count ( 1 ) as cnt_view, from session group by 1 , 2 ) select distinct user_id from session_summary where cnt_view >= 100 çµæ ã©ã³ãã³ã°åŠç¿ãè¡ã£ãŠããã¢ãã«ã«å¯Ÿããæ€åºãããŠãŒã¶ãŒIDãé€å€ããåãšé€å€ããåŸã®ããŒã¿ããããåŠç¿ãããã¢ãã«ã§ã®ãã¹ãããŒã¿ã§ã®ç²ŸåºŠãæ¯èŒãããšããMAP(Mean Average Precision)ãçŽ2%æ¹åããŸãããååã®ãã©ã³ãã®item2vecãé€å€åŸã®ããŒã¿ã§çæãçŽãããšãããçŽæã«åããããªãã©ã³ãå士ãé¡äŒŒåºŠãé«ãåºãããã«ãªããŸããã æ©æ¢°åŠç¿ ã§ã®æšè«çµæãBigQueryã«æ ŒçŽããŠãããããMAPãªã©ã®è©äŸ¡ææšã SQL ã§èšç®ã§ããããã«ããŠããŸãã (äžèšãaverage_precisionã®å¹³åããšã£ããã®ãMAPã«ãªããŸã) create temp function precision (y_true array<int64>, y_pred array<int64>, n int64) returns float64 as ( ( select sum ( case when elem1 = elem2 then 1 else 0 end ) / n from unnest(y_true) elem1 with offset pos1, unnest(y_pred) elem2 with offset pos2 where pos2 < n ) ); create temp function average_precision(y_true array<int64>, y_pred array<int64>, n int64) returns float64 as ( ( select sum ( precision (y_true, y_pred, m+ 1 )) / array_length(y_true) from unnest(generate_array( 0 , n -1 )) as m where y_pred[safe_offset(m)] in unnest(y_true) ) ); ãŸãšã ãã£ãããšã¯åçŽã§ãããããŒã¿ã®ååŠçã®å€§åããäœæã§ããäºäŸã ã£ãã®ã§ç޹ä»ãããŠããã ããŸããã Garbage In, Garbage Outãèžã«å»ã¿ãŸãããã ããŸã æè¿è©±é¡ã®chatGPTã« BUYMA ã«ã€ããŠæè©ãæžããŠããããŸãã æã«ããããã®ã æãæµ®ãã¹ãã BUYMAã«è¡ãã ã¿ããªã®æ³ããéãŸã äžçäžã®ååã ããããèŠã€ããã ãæ±ããããäŸ¡æ Œã§ ä»æ¥ãæ°ãããã®ãå±ãã ãã€ãã©ã³ãã®æãéŽ ãããããªããã°ãã¢ã¯ã»ãµãªãŒ é貚ãå®¶é»ãŸã§ BUYMAã§æ¢ããŠã¿ãã äŒå¡ç»é²ããã° ããã«ãåŸãªç¹å
žã ããããããã ãæ°ã«å
¥ããèŠã€ã㊠買ãç©ã®æ¥œãã¿ãå¢ããã BUYMAã§æ¥œããè²·ãç© æã«ããããã®ã æãæµ®ãã¹ãã BUYMAã«è¡ãã ã¿ããªã®æ³ããéãŸã ä»ããBUYMAã§ è²·ãç©ãããïŒ å®£äŒäžæã§ããã 話é¡ã®AIã«åŒç€Ÿã®ãµãŒãã¹ãèªç¥ãããŠããŠå°ãå¬ããã£ãã§ãã ææ¥ã®èšäºã®æ
åœã¯äººäºã®å³å·ããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co ããŒã¿ã¯ã¬ã³ãžã³ã°ãç¹åŸŽéçæéšåã§ dbt ã®æŽ»çšãæ€èšäžã§ã ↩ å®éã® SQL ã§ã¯ãŠãŒã¶ãŒãšãŒãžã§ã³ã( UA )ã§ã®ãããé€å€ãè¡ã£ãããŒã¿ã«å¯ŸããŠåŠçããŠããŸã ↩ SQL ã§ã®ã»ãã·ã§ãã€ãºã¯ã 10幎æŠããããŒã¿åæå
¥é ã ããã°ããŒã¿åæã»æŽ»çšã®ããã®SQLã¬ã·ã ã«è©³ããèšèŒãããŠããŸã ↩
ããã«ã¡ã¯ããšã³ãžãã¢ã®ç«¹ç°ã§ãã ãã®èšäºã¯ã Enigmo Advent Calendar 2022 ã®15æ¥ç®ã®èšäºã§ãã ãã£ããã§ããããšã³ãžãã¢ã®ã¿ãªããŸã¯äžæµã®ãšã³ãžãã¢ãšã¯ã©ããªãšã³ãžãã¢åããæã¡ã§ããããã èªåã¯ãéå®³ãæªç¶ã«é²ããç¶ç¶çã«å®å®éçšå¯èœãªã·ã¹ãã ãæ§ç¯ã§ãããšã³ãžãã¢ããäžæµã®ãšã³ãžãã¢ã ãšèããŠããŸãã ã²ãšãã«é害ãšèšã£ãŠãã仿§ãšç°ãªãåäœãããªãããªãœãŒã¹äžè¶³çã«ããã·ã¹ãã 忢ãçºçããªãããªã©ãããããšå®çŸ©ã¯ããããªãšæããŸãã ä»åã®ãšã³ããªã§ã¯åè
ã®ã仿§ãšç°ãªãåäœãããªãããšããç¹ã«ã€ããŠãæ¥åãéããŠèŠèãæ·±ããããå Žé¢ããããŸããã®ã§ã玹ä»ããããšæããŸãã æ€çŽ¢ã·ã¹ãã ã®ãªãã¬ã€ã¹ 仿ã¯ããšããæ€çŽ¢ã·ã¹ãã ã®ãªãã¬ã€ã¹ã«æ³šåããŠããŸããã ãšãã°ã¢ ã§ã¯æ€çŽ¢ã·ã¹ãã ã« Apache Solrãå©çšããŠãããä»åãªãã¬ã€ã¹ããã·ã¹ãã ã«ã€ããŠãæ§æãšããŠã¯éå»ã« ãã¡ãã®ããã° ã§ç޹ä»ãããã®ãšè¿ãæ§æãšãªããŸãã èªåã¯æ€çŽ¢ã·ã¹ãã ãžã®ããŒã¿æå
¥ãããã³æ€çŽ¢ãªã¯ ãšã¹ ããè¡ã£ãŠçµæãæŽåœ¢ããç®æ(䞻㫠Rails )ã®æ¹ä¿®ãæ
åœããŠããŸãã ãªãã¬ã€ã¹ã«åœããã Rails ããSolrãžã®çŽæ¥ãªã¯ ãšã¹ ãã§ã¯ãªããäžéåªäœãšããŠæ€çŽ¢ API ãçµç±ãã圢åŒã«å€æŽããŸããã ãã®ããããŸãã¯æ¢åã³ãŒãããã°ã調æ»ããŠãªã¯ ãšã¹ ãæ¹æ³ãåäœä»æ§ããŸãšããããã³ãŒãæ¹ä¿®ã«ç§»ããŸããã ã³ãŒãæ¹ä¿® 調æ»ãã仿§ãå
ã«äžæŠã³ãŒãæ¹ä¿®ãå®äºããããçšåºŠåäœãããã®ãã§ããŸããã ãã®åŸãæ¢åã®ãã¹ãã³ãŒããå
ã«æ°ã³ãŒãã®ãã¹ãã³ãŒãã«ç§»æ€ãé²ããäžã§ã现ããªåããå®è£
ã§ããŠããªãããšã«æ°ä»ããŸããã (ç»åã¯ã€ã¡ãŒãžã§ã) åãæ°å€ãªã®ãæååãªã®ã nil 蚱容ããã®ã 調æ»ããããŠããªãã£ããªã¯ ãšã¹ ãæ¹æ³ãå©çšç®æããã äžã«ã¯ããã£ããããªåãããã®ãã¿ãããªãã®ãŸã§... ã³ãŒãããã°ãç®èŠããã ãã§ã¯åãããªãã£ãããšã次ã
ãšã§ãŠããŸããã ãã¹ãã³ãŒãã®éèŠæ§ã®åèªè ãã¹ãã³ãŒããåäœãããããšã§ããã詳现ãªåäœãç¥ãããšãã§ããŸããã åŸããèãããšããã£ãšãã£ãããšã³ãŒããã§ãã¯ãããŠããã°ææ¡ã§ããŠããç¹ããããšæããŸããããã¯ãäœæ¥ããŠããã®ã人ã§ãã®ã§ãã©ãããŠãèŠèœãšãã¯é¿ããããªããšæããŸãã ãã¹ãã³ãŒãããªããã° ãã°ã¬ ãåŒãèµ·ãããŠããå¯èœæ§ããããã仿§ãšç°ãªãåäœãããªããç¹ãæºè¶³ã§ããªãç¶æ
ã«ããŠããŸããšããã§ããã æ®æ®µã³ãŒããæžãéããã¹ãã³ãŒããæèããŠæžããŠã¯ãããã®ã®ãäœæã«åœãã£ãŠã¯ã³ãŒã ã«ãã¬ããž ãã¢ãã¯ã®äœ¿çšãå¢çå€ãè€éãªãã¿ãŒã³ã®ç¶²çŸ
ãã©ããŸã§å³å¯ã«ãããçããèæ
®ããããšãå€ãã§ãã ãããªãã«æéãèŠããŸããããã¹ãã³ãŒãèªäœã®èŠèªæ§ã«çŽåŸããããªãã£ãããšãæ£çŽããŸããã¹ãã³ãŒããæžãããšã¯å¥œãã§ã¯ãããŸããã§ããã ã§ãããä»åãå€ãã®ç¹ããã¹ãã³ãŒãã«å©ããããŸããã ãã¹ãã³ãŒãã®æçŸ©ãªã©ãæ€çŽ¢ãããšæ§ã
ãªæ¹ã®èšäºãããããããããã®èŸºãã®èšåã¯ããŸããããçå±ãšããŠã¯çè§£ã§ãããã®ã®ãªããªãæºé£²ãäžããããªããã®ã ãšæã£ãŠããŸãã ãã®ç¹ã«ãããŠããå®éã«ãã¹ãã³ãŒãã«å©ãããããšããäœéšã¯éåžžã«è²Žéãªãã®ã§ããã æåŸã« éå»ã«ãã¹ãã³ãŒããå°éã«äœæããã ããæ
åœã®æ¹ã«æè¬ããã€ã€ãä»åŸã®èª°ãã®å©ãã«ãªããšããããšãæèããŠããã¹ãã³ãŒããæžãããšãå¿æããŠããããšæããŸãã ãã¹ãã³ãŒããå
šãŠãã¹ããç¶æ
ã§ã®ãªãªãŒã¹ã¯ã粟ç¥çãªå®å¿æã«ãç¹ãããŸããã ææ¥ã®èšäºæ
åœã¯ãããŒã¿ãµã€ãšã³ãã£ã¹ãã®å éšããã§ãããæ¥œãã¿ã«ïŒ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ããµãŒããŒãµã€ããšã³ãžãã¢ ã® æ©æ¬ ã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã® 14 æ¥ç®ã®èšäºã§ãã ã¯ããã« ãšã³ãžãã¢ãšããŠä»äºãããŠãããšã³ãŒããèªãããšãå€ããšæããŸããäŸãã°ã仿§èª¿æ»ãCSããã®ãååã察å¿ãã¬ãã¥ãŒå¯Ÿå¿ãªã©ããããšæããŸãã ä»å¹Žãæ¯ãè¿ããšã³ãŒããæžã以äžã«èªãããšãå€ããã³ãŒããããæ£ç¢ºãã€éãèªãã«ã¯ã©ãããã°ããããèããããšãå€ããããŸããã ãšããããšã§ããã®èšäºã§ã¯ç§å人ãã³ãŒããèªãæã«æèããŠããããšã玹ä»ããŠããããšæããŸãã ãããªãã³ãŒãã¯èªãŸãªã 1ã€ç®ã¯ãããªãã³ãŒãã¯èªãŸãªãããšã§ããæ¥åã§äœ¿ãããŠããã³ãŒãã®éã¯1ã€ã®æ©èœã§ããšãŠãå€ãã§ãããããªãèªã¿å§ãããšãšãŠãæéãããã£ãããè¿·åã«ãªã£ãŠããŸããããããŸããããªã®ã§ãŸãã¯ã·ã¹ãã å
šäœãææ¡ããŠã€ã³ããããšã¢ãŠãããããäœãªã®ãã®çè§£ãé²ããŸããææ¡ã®ä»æ¹ã¯ãã·ã¹ãã 仿§æžãèªãã ããæ
åœããæ¹ãš MTG ããŠåŠçã®å€§ãŸããªæµããæããŠããã£ãŠããŸãã å
šäœã®ææ¡ãšåæäžŠè¡ã§ãå®éã«åãããŠã¿ãããšãå€ãã§ããå®éã«åãããšçè§£ãé²ã¿ãŸãã èªãç®çãæèãã 2ã€ç®ã¯èªãç®çãæèããããšã§ããã³ãŒããèªãç®çã¯æ§ã
ã ãšæããŸãã衚ã¯äžäŸã§ãã ã³ãŒããèªãã±ãŒã¹ ç¥ãããããš ã¬ãã¥ãŒå¯Ÿå¿ ãã°ãç¡ããã仿§ãæºãããŠããããèšèšçã«åé¡ãªããã確èªããã CSããã®ãååãå¯Ÿå¿ ãã°ãçºçããŠããåå ãç¥ãã ç®çãææ§ãªç¶æ
ã§ã³ãŒããèªã¿å§ãããšãæ¬æ¥ã¯èªãå¿
èŠãç¡ãã³ãŒããèªãããšã«ãªãæéãè¶³ããªããªãã±ãŒã¹ããããšæããŸããæ¥åã¯æéãæ±ºãŸã£ãŠããããšãå€ãã®ã§ãå¹ççã«é²ããããã«ãç®çãæèããããšã¯å€§äºã ãšèããŠããŸãã é©åºŠã«ã¡ã¢ãåã 3ã€ç®ã¯é©åºŠã«ã¡ã¢ãåãããšã§ããæ¥åã§äœ¿ãããŠããã³ãŒãã¯éãå€ããäžåºŠã«èªãã§å
šãŠãææ¡ããã®ã¯å€§å€ã§ãããªã®ã§ç§ã¯ã¡ã¢ãåããªããèªã¿é²ããããšãå€ãã§ããã¡ã¢ã®åãæ¹ã§ããã ãœãŒã¹ã³ãŒã äžã«çŽæ¥æžããããå¥éããã¹ããã¡ã€ã«ã«æžããããslackã®ã¹ã¬ããã«æžããããªã©ããŠæµããæŽçããŠããŸãããŸã æ
£ããŠããªã ããã°ã©ãã³ã°èšèª ã®å Žåã¯èªãã®ã«æéãããããšæãã®ã§ãã¡ã¢ã¯ããªãæå¹ã ãšæããŠããŸãã ãããã« ä»å¹Žã¯è²ã
ãªæ©èœã®ã³ãŒããèªãããšãå€ãã BUYMA ã®ä»æ§ã«ã€ããŠè©³ãããªããŸãããããã ãã§ãªãã³ãŒãã£ã³ã°ã®æè¡ã«ã€ããŠãåŠã¶ããšãå€ãã£ãã®ã§ãã³ãŒããèªããšããã®ã¯ãšãŠã倧äºã ãªãšæ¹ããŠæããŸãããå€åæ¥å¹Žãèªãããšãå€ãã®ã§é 匵ããããšæããŸãã ææ¥ã®èšäºã®æ
åœã¯ãšã³ãžãã¢ã®ç«¹ç°ããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®13æ¥ç®ã®èšäºãšãªããŸãã ãç²ãããŸã§ããã€ã³ãã©ããŒã ã®å±±å£ã§ãã åŒç€Ÿã§ã¯äžéšã€ã³ ãã©ãª ãœãŒã¹ã®ã¢ãã¿ãªã³ã°ã«Datadogãå©çšããŠããŸãã ãã®äžã§ãä»åã¯Datadogã®å©çšéå§åœåã« GUI ã§äœæãããã¢ãã¿ãŒãTerraformerãšTerraformã䜿çšããŠæ§æç®¡çããéã®äºäŸã«ã€ããŠå ±åããŸãã åæ§ã®æè¡ã¹ã¿ãã¯ã䜿çšããã€ã³ããŒããæ§æç®¡çã«ãããå
·äœçãªãã³ãã¬ãŒãçã®äºäŸã«ã¯äºæ¬ ããªããšæããŸãã®ã§ãäœæ¥èšç»ãäžå¿ã«èª¬æããŸãã èŠã¯ãTerraformerãTerraformã®äœ¿ãæ¹ã¯æ§ã
è¯ãè³æããããšæããããä»ååºæã®å¯Ÿå¿ãããç¹ã泚åããŠèª¬æããŸãã æ¬çš¿ã®æ§æã以äžã«èšèŒããŸãããŸãã察象ãšããã¢ãã¿ãŒã®ç¶æ
ãªã©ã®åæã説æããŸããæ¬¡ã«ãäœæ¥ã®æµããæŠèª¬ããTerraformã® ãã£ã¬ã¯ã ãªæ§æçãå°ã説æããŸãããããŠæåŸã«ãŸãšããŸãã 1. åæ ãŸãäœæ¥ã®ç®çãšå¯Ÿè±¡ãšããã¢ãã¿ãŒã«ã€ããŠèª¬æããŸãã ç®ç GUI ã§äººéãæã§äœæããã¢ãã¿ãŒãTerraformã§æ§æç®¡çããã 察象ãšããã¢ãã¿ãŒ æ§æç®¡çã®å¯Ÿè±¡ãšããã¢ãã¿ãŒã®æŠèŠã以äžã«èšèŒããŸãã ãããããžã§ã¯ãã§ã®ã€ã³ ãã©ãª ãœãŒã¹ã®ç£èŠã®ããã«æã§äœæãããã¢ãã¿ãŒ309ä»¶ã察象ãšããŸãã è€æ°çš®é¡ã®ã€ã³ ãã©ãª ãœãŒã¹ã®ç£èŠã®ããã®ã¢ãã¿ãŒçŸ€ã§ãããåœè©²ãããžã§ã¯ãã§ããããšã瀺ãã¿ã°ã®ã¿ãä»äžãããæ³¥å£åç¶æ
ã§ãã察象ã®ã¢ãã¿ãŒãããµãŒãããŒã«ããšã®ã¿ã°ãä»äžããäžã§ãããŒã«ããšã«moduleåãåãæ±ããããããããããšãç®çãšããŸãã ã¢ãã¿ãŒä»¶æ° ç¹åŸŽ 309ä»¶ ã»ã€ã³ããŒã察象ãèå¥ã§ããç¹å®ã®ã¿ã°ãä»äžãããŠãã(äŸ: project: xxx ãšãã£ãã¿ã°ã®ã¿) ã»ã¢ãã¿ãŒã¯ Rails ã®WebãµãŒãããããããµãŒããDBãµãŒããšãã£ãã€ã³ ãã©ãª ãœãŒã¹ã®ç£èŠç®ç 2. äœæ¥ã®æŠèŠ äœæ¥ã®æŠèŠã«ã€ããŠèª¬æããŸããä»åã®å¯Ÿå¿ã¯å€§ãã2段éã«åãããŸãã ãŸããSTEP1ãšããŠã€ã³ããŒã察象ã®ã¢ãã¿ãŒãTerrformerã§äžæŠ1ã€ã®tfãã¡ã€ã«ã«ã€ã³ããŒããããã®åŸäººæã§ãµãŒãã®ããŒã«ã衚ãã¿ã°ãã¢ãã¿ãŒã«ä»äžãapplyããããšã§ãæ³¥å£åç¶æ
ãæ¹åãããŸãã æ¬¡ã«ãSTEP2ãšããŠããµãŒãã®ããŒã«ããšã«å床Terraformerã§ã€ã³ããŒãããtfãã¡ã€ã«ã ãªãã¡ã¯ã¿ãªã³ã° ãapplyãè¡ããŸãã 以éã§åSTEPã®å
容ãšãã€ã³ãã説æããŸãã STEP1: äºåæºå STEP1ã§ã¯æ³¥å£åç¶æ
ãè±ããããšãæåªå
ãšããŸãã ãã®ãããäžæŠTerraformerã§ã€ã³ããŒãããåŸã«ã人éã倧éæã«ã¢ãã¿ãŒã«ã¿ã°ãä»äžãapplyããŸãããã®éã®ãã€ã³ããšããŠã¯ãã¢ãã¿ãŒã«ãã£ãŠã¯ãã©ã®ãããªã¿ã°ãä»äžããã¹ãããæ©ãã±ãŒã¹ããããšæããŸãããTerraformã§ç®¡çå¯èœã«ãªãããšã§æ³¥å£åç¶æ
ããæªãã¯ãªããªãããé床åªå
ã§ããšã€ã€ãã§ã¿ã°ãä»äžãapplyããŠããŸããŸãã å®éã«ã¿ã°ã®ä»äžã¯ç§ãäœæ¥ããã®ã§ãããäœæ¥åœæã®èšé²ãèŠããš10åã§25%é²ãã ãšèšé²ãããã1æéãããããã«æãã®ä»æ©ãæžãã§ããããã§ãã äžæŠæ¢åã®ã¢ãã¿ãŒãTerraformerã§äžæ¬ã§1ã€ã®tfãã¡ã€ã«ã«ã€ã³ããŒããã tfãã¡ã€ã«ã®ã¢ãã¿ãŒã®å
容ã粟æ»ããåã¢ãã¿ãŒã®çšé(ãµãŒãããŒã«)ãå€å¥å¯èœãªãããªã¿ã°ã人æã§ä»äžãapplyãã å³1 STEP2: ãµãŒãããŒã«åäœã§ã®ã€ã³ããŒããš ãªãã¡ã¯ã¿ãªã³ã° 以äžããµãŒãããŒã«æ°åç¹°ãè¿ããŸãã 端çã«ã¯ãTerraformerã§ã€ã³ããŒãããtfãã¡ã€ã«ã®å
容ã人éãèªã¿ãããããã«ä¿®æ£ãããã€æå³ããªããªãœãŒã¹åäœæãªã©ãçºçããªãããã«tfstateãä¿®æ£ããäžã§applyããŸãã ç¹å®ã®ãµãŒãããŒã«ã®ã¢ãã¿ãŒãterrformerã§ã€ã³ããŒã tfãã¡ã€ã«ã ãªãã¡ã¯ã¿ãªã³ã° ããŠapplyãã å³2 3. ã€ã³ããŒãåŸã® ãã£ã¬ã¯ã ãªæ§æãä¿®æ£å
容 ã€ã³ããŒãåŸã® ãã£ã¬ã¯ã ãªæ§æãTerraformerãèªåçæããå
容ããã®ä¿®æ£ãã€ã³ãã説æããŸãã æ¬èšäºã¯ãæè¡çãªèª¬æãäž»ãšããèšäºã§ã¯ãªãããæŠèŠã®ã¿ãç°¡åã«èšèŒããŸãã ãã£ã¬ã¯ã ãªæ§æ ãã£ã¬ã¯ã ãªæ§æã以äžå³ã«èšèŒããŸãã è€æ°ç°å¢ã«å¯Ÿå¿å¯èœãªããmoduleåŽã«äž»ãªãªãœãŒã¹ãåãåºããŠããã®moduleãç°å¢ããšã«åŒã³åºãã¢ãã¿ãŒãäœæããæ§æãšããŠããŸãã ãŸãã terraform workspace çã¯äœ¿ããã«æçŽã«ç°å¢ã»ãµãŒãããŒã«åäœã§tfstateãåããæ§æãšããŠããŸãã ãªã¢ãŒãããã¯ãšã³ãã䜿ããã«ãåå§çã«tfstateã ãªããžã㪠ã«ã³ãããããŸãã ããã¯ãè€æ°äººã§ 人海æŠè¡ çãªæ¹éã§åæ
ããŠäœæ¥ããéã«ãªã¢ãŒãããã¯ãšã³ããæäœããããã®ããŒã®èšå®ããã¹ããå¯èœæ§ã®ããç®æãæ¥µåæžããããšã念é ã«ããããšããã®ããã£ãšããããèšãèš³ã§ãããå®éã¯æšªçãããããã§ãã å³3 tfãtfstateã® ãªãã¡ã¯ã¿ãªã³ã° Terraformerã§ã€ã³ããŒãããéã« ãªãã¡ã¯ã¿ãªã³ã° ãè¡ã£ã芳ç¹ã以äžã§ç®æ¡æžããŸãã ãªãœãŒã¹åã人éãå€èªå¯èœãªãã®ã«ãã resource "datadog_monitor" "tfer--monitor_1234567" ãšãã£ãèªåçæããããªãœãŒã¹åã人éãå€å¥ãããããã®ã«ä¿®æ£ããŸãã 1ã®ãªãœãŒã¹åã®ä¿®æ£ã«äŒŽãtfstateãä¿®æ£ãã ããã¯ãã¢ãã¿ãŒã®å Žåã¯ç¶æ
ãæããªããªãœãŒã¹ã®ããç¹ã«åäœæã§ã倧ããªåé¡ã¯ç¡ãã§ããã ãªãã¡ã¯ã¿ãªã³ã° æã®ä¿®æ£å·®åçã terraform plan ã§ç¢ºèªãããããã« tfstateãä¿®æ£ã極ååäœæãåé¿ããŸãã ãã¢ããã¥ã¡ã³ãã䜿ã Terraformerã§ã€ã³ããŒãããã¢ãã¿ãŒã¯ message ã1è¡ã§å¯èªæ§ãè¯ããªããããã¢ããã¥ã¡ã³ãã䜿ãããä¿®æ£ããŸãã ãŸãšãããããªãœãŒã¹ã¯for_eachã§ãŸãšãã for_eachã§ãŸãšãããããªãœãŒã¹ã¯ for_eachã§è€æ°äœæããŸãããã®éã®2ãšã®å
Œãåãã¯ç¶æ³ãèŠãŠå€æããŸã(å Žåã«ãã£ãŠã¯åäœæããããªããšãã)ã 4. ãŸãšã(ææ) æåŸã«ææãšãŸãšããèšèŒããŠçµãããŸãã ææ å©çšéå§çŽåŸã§ãæäœéã®åæèšèšã¯éèŠ ãã®æã¯ãã®æã®ãã¹ããå°œãããŠãã¯ããªã®ã§æãæªãæ§ã«æããªãæ°æã¡ãéèŠ(ä»ããã®ãã¡æã«ãªãã®ã§) ãã ãéå»ã®çµç·¯ã倿ã«é床ã«å¿åºŠãããå¿
èŠæ§ã¯ãªã(ã§ãªããšãã£ãšèŸããŸãŸã®ãã) ãããã£ããéå»ã®ãããã¿èžãŸããæ¹åæŽ»åãã§ããã®ã¯äºæ¥äŒç€Ÿãªãã§ã¯ ãŸãšã ããäœæ¥ããããã¹ãŠäººé or ãã¹ãŠ ã¹ã¯ãªãã ã§å¯Ÿå¿ããããšãã£ãåœ¢ã«æã£ãŠããŸããšèŸãããšãããããæãæ©ãç®çãéæã§ããããªæ¹æ³ãéžã¶ããšãéèŠãããã¯äŒç€Ÿã®äººçãªãœãŒã¹ã®ç¶æ³ã«ããããšæ³åããããããé©åºŠãªå¡©æ¢
ã¯èªåãã¡ã§èããŠããããç¡ã(身ãèããªããŸãšã)ã ææ¥ã®èšäºã®æ
åœã¯ãšã³ãžãã¢ã®æ©æ¬ããã§ãããæ¥œãã¿ã«ã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ãæ°åãšã³ãžãã¢ã®å·æ¬ã§ãã BUYMA ã®ãµãŒããŒãµã€ããäžå¿ã«éçºããŠããŸãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®12æ¥ç®ã®èšäºã§ãã ããŒã¿ ã¢ããªã³ã° ã«ã€ããŠåŠç¿äžã§ãDBèšèšã®å
¥éæžãèªãã§è«çèšèšã«ã€ããŠç¬¬1~5æ£èŠåãšãã£ãå
容ãåŠç¿ããŸããããããå人éçºã§ããŒã¿ ã¢ããªã³ã° ããããšãããã©ããããããã®ããããããããæãåããããšã¯ã§ããŸããã§ããã ãããªç¶æ³ã®æã«ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãšãã ã¢ããªã³ã° ææ³ã«ã€ããŠç¥ã£ãããšããã£ãããã«ãããŒã¿ ã¢ããªã³ã° ãã€ã¡ãŒãžãããããªããŸããã ãã®èšäºã§ã¯ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãå®è·µããŠã¿ãŠæããããšã玹ä»ã§ããã°ãšæããŸãã ç®æ¬¡ ããŒã¿ãšæ
å ±ã®éã ã€ãã¥ãŒã¿ãã«ããŒã¿ã¢ããªã³ã°ãšã¯ ã€ãã¥ãŒã¿ãã«ããŒã¿ã¢ããªã³ã°ã®æé æ®æ®µRailsã§éçºããŠããŠæããããš ã€ãã¥ãŒã¿ãã«ããŒã¿ã¢ããªã³ã°ãšã®åãåãæ¹ æåŸã« ããŒã¿ãšæ
å ±ã®éã ããŒã¿ãšæ
å ±ã«ã¯ä»¥äžã®éãããããŸãã ããŒã¿ 客芳çãªäºå®ãèšé²ãããã®ã§ãæèãè§£éããªã RDB ã«èšé²ããã æ
å ± æèãè§£éã®äžããããããŒã¿ SQL ã§æœåºãã ãã®éãããæ£ç¢ºãªæ
å ±ãå¿
èŠãªãããŒã¿ãæ£ç¢ºã«èšé²ãããŠããªããã°ãªããªãããšãããããšæããŸãã ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãšã¯ ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãšã¯ãããŒã¿ã倱ããã« RDB ã«æ£ç¢ºã«èšé²ã§ããããã«ãæŽæ°ãšåé€ããªãã¹ãèµ·ããªãããã«ããŒã¿ ã¢ããªã³ã° ããããšã§ãã æŽæ°ãšåé€ãèµ·ãããšããããšã¯ãããŒã¿ã倿Žãããã倱ããããšããããšã§ãã ã€ãŸããæ£ç¢ºãªããŒã¿ããã¹ãŠ RDB ã«èšé²ã§ããŠããªãããšã«ãªããå¿
èŠãªæ
å ±ãæœåºã§ããªãå¯èœæ§ãåºãŠãããšããããšã§ãã ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã®æé ããã§ã¯ãã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãå®è·µããããšã§ãæ£èŠåã«ã€ããŠçè§£ãæ·±ãŸã£ãç¬éããã£ãã®ã§äŸã亀ããŠç޹ä»ã§ããã°ãšæããŸãã 詳ããæé ãç¥ãããæ¹ã¯ä»¥äžã®èšäºããããããããããã§ãã scrapbox.io ãšã³ãã£ãã£ã¯ã€ãã³ããšãªãœãŒã¹ã«ã«åé¡ããã åé¡ã®å€æã«ã¯ããšã³ãã£ãã£ãæ¥æå±æ§ãæã€ãã©ããã§å€æã§ããŸãã æ¥æå±æ§ãæã€ãšã³ãã£ãã£ã¯ã€ãã³ããšã³ãã£ãã£ã«åé¡ãããŸãã ãšã³ãã£ãã£ã«å¯ŸããŠãã~ããããšããåè©ãã€ããŠã¿ããšèå¥ããããã§ãã äŸãã°ãäŒå¡ããããšããæ¥æ¬èªã¯äžèªç¶ã§ããã©ããæ³šæããããšããæ¥æ¬èªã¯èªç¶ã§ãã ããããæ³šæã¯ã€ãã³ããšã³ãã£ãã£ã§äŒå¡ã¯ãªãœãŒã¹ãšã³ãã£ãã£ã§ããããšãããããŸãã ä»åã¯ãã®ã€ãã³ããšã³ãã£ãã£ã«ã€ããŠå°ãæ·±ãŒã£ãŠèª¬æããŠãããŸãã ã€ãã³ããšã³ãã£ãã£ã«ã¯æ¥æå±æ§ãïŒã€ã ãæã€ããã«ãã ã€ãã³ãã¯1ã€ã®æ¥æå±æ§ãæã¡ãŸãã äŸãã°ã泚æãšã³ãã£ãã£ãªãæ³šææ¥æãæã¡ãŸãã ããã§ä»¥äžã®ãããªèšèšã®æ³šæããŒãã«ããã£ããšããŸãã äžèšã®æ³šæããŒãã«ã¯ãæ³šææ¥æã®ä»ã«è«æ±æ¥æãå
¥éæ¥æãæŽæ°æ¥æãæã£ãŠããŸã£ãŠããŸãã ããã¯ãã®æ³šæããŒãã«ã®äžã«ã以äžã®ç°ãªãã€ãã³ããæ··åšããŠããããšã瀺ããŠããŸãã è«æ± å
¥é ãããã¯å¥ã®ã€ãã³ããšã³ãã£ãã£ã§ããè«æ±ãšã³ãã£ãã£ãå
¥éãšã³ãã£ãã£ãšããŠåè§£ããããšãã§ããŸãã ãããããšä»¥äžã®ããã«èšèšããããšãã§ããŸãã ããããããšã§ãè«æ±ãå
¥éãçºçããŠã泚æããŒãã«ãUPDATEããå¿
èŠãªããããããã®ããŒãã«ãžã®ããŒã¿ã®INSERTã®ã¿ã§ããŒã¿ãèšé²ããããšãã§ããŸãã ãããŸã§ã®æµãã¯å®ã¯One Fact in One PlaceïŒïŒã€ã®äºå®ã¯ïŒã€ã®å Žæã«ïŒãšããæ£èŠåã®è¡çºãã®ãã®ãšãªã£ãŠããŸãã 第1~5æ£èŠåãæèããªããååŠè
ãæ£ããæ£èŠåããã®ã¯é£ãããšæããŸããããããŸã§ç޹ä»ããæé ã ãšãŸã ã€ã¡ãŒãžãã€ããããã®ã§ã¯ãªãã§ããããã æ®æ®µ Rails ã§éçºããŠããŠæããããš Rails ã§æ®æ®µéçºãããŠãããšæŽæ°æ¥æããããªãããšã¯éåæããããããããŸããã Rails ã§scaffoldãããšæŽæ°æ¥æã«ã©ã ïŒupdated_atïŒãèªåã§å
¥ããšæããŸãã orderïŒæ³šæïŒãªãœãŒã¹ãscaffoldããã $ rails g scaffold order amount:integer èªåçã«äœææ¥æïŒcreated_atïŒ, æŽæ°æ¥æïŒupdated_atïŒãå
¥ãã # == Schema Information # # Table name: orders # # id :bigint not null, primary key # amount :integer not null # created_at :datetime not null # updated_at :datetime not null # class Order < ApplicationRecord end ãã㯠Rails ãWEBã·ã¹ãã ã§å¿
èŠãªã®ã¯ãææ°ã®ããŒã¿ã ãã§ãããšããå¶çŽãèšããŠããŠãUPDATEãèµ·ããããšåæã®èšèšã«ãªã£ãŠããããã ãšæãããŸãã ãã®åŒ·ãå¶çŽãèšããããšã§UPDATEãDELETEã蚱容ãã代ããã«ããããŠãã®ããšã¯ããŒã¿ããŒã¹ãš1察1ãšãªã£ãModelã® CRUD ã§è¡šçŸã§ãããšããã·ã³ãã«ããæã«å
¥ããããšãã§ããŸãã Modelã«æžãããšãã§ãããServiceã¯ã©ã¹ãè¥å€§åãããããã®ã¯ããŒã¿ ã¢ããªã³ã° ã®èšèšãæªãå¯èœæ§ãé«ãããã§ãã ãã®ãããã¯ä»¥äžã® Podcast ã§è©³ãã説æãããŠããã®ã§ãèããŠã¿ãŠãã ããã anchor.fm ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ãšã®åãåãæ¹ ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã§èãããšãã€ãã³ãããšã³ãã£ãã£ãšããŠæããããšãããšã³ãã£ãã£ã®æ°ãå¢ããINSERTã®ã¿ã§èšé²ããããšããããŒã¿éãå¢ããŸãã ãããããšãè«çèšèšã®æ®µéã§ã¯åé¡ãªãã£ããããããŸããããããç©çèšèšããéã«å®è£
ãèæ
®ãããšããã©ãŒãã³ã¹ã®åé¡ã«çŽé¢ããããšãããããšæããŸãã ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã¯ããŒã¿ ã¢ããªã³ã° ã«ãããæ£è§£ã§ã¯ãªããäžçš®ã®è«çèšèšãããéã®å¶çŽãšããŠæãããšãããšæããŸãã èãæ¹ãšããŠã¯ä»¥äžã®ãããªé çªããšæããŸãã ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã§è«çèšèšããã ç©çèšèšã®æ®µéã§å®è£
ãèæ
®ãããšããã©ãŒãã³ã¹çã«å³ããç®æãèŠã€ããã åé¡ãšãªãç®æã«å¯ŸããŠUPDATEã蚱容ããã æåŸã« ã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã¯ããŒã¿ ã¢ããªã³ã° ã«ãããæ£è§£ã§ã¯ãªããäžçš®ã®èãæ¹ã§ãã ç§ã®ããã«ååŠè
ã§ããŒã¿ ã¢ããªã³ã° ã«å¯ŸããŠèŠææèããã人ã¯äžåºŠã€ãã¥ãŒã¿ ãã«ã㌠㿠ã¢ããªã³ã° ã«ã€ããŠèª¿ã¹ãŠå®è·µããŠã¿ããšãããããããŸããã èå³ããã人ã¯ã WEB+DB PRESS Vol.130ã®ããŒã¿ ã¢ããªã³ã° ç¹éãé¢çœãã®ã§èªãã§ã¿ãŠãã ããã gihyo.jp ãã¡ãã®æ¥œã
ERDã¬ãã¹ã³ãšããæžç±ãå®è·µçãªå
容ãå€ãããããã§ãã www.shoeisha.co.jp ææ¥ã®èšäºã®æ
åœã¯ ã€ã³ãã©ãšã³ãžãã¢ ã® å±±å£ ããã§ãããæ¥œãã¿ã«ïŒ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ã22æ°åã§å
¥ç€Ÿãããšã³ãžãã¢ã®hashinoã§ãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®9æ¥ç®ã®èšäºã§ãã èæ¯ çãããæ®æ®µã³ã³ãããå©çšããŠããŸããïŒ ãšãã°ã¢ ã§ã¯ã KubernetesãæŽ»çš ããŠããŠãéçºç°å¢ã§ãDockerãæŽ»çšããŠããŸãã ããããæè¿ã¯WebAssemblyãã³ã³ãããå®å
šã«çœ®ãæãããããããªããšããåãè³ã«ããŸãã æ¢ã« Kubernetes ã§ã¯ãkubelet API äºæã® Krustlet ãæ³šç®ãéããŠããŸããkubeletã¯ããåç¥ã®éãOCIæºæ ã®ã³ã³ãããå®è¡ããŸãããKrustletã¯ã WebAssembly System Interface ã©ã³ã¿ã€ã ã®WebAssemblyãå®è¡ãããã®ã§ãã Kubernetes äžã§Podã®ä»£ããã«WebAssemblyãåäœãããããšãå¯èœã«ãªã£ãŠããŸãã ãŸãã Fermyon ã§ã¯ãWebAssemblyãã€ã¯ããµãŒãã¹ãæ§ç¯ããããã®Developer Toolã§ããSpinãéçºããŠãããŸãã ãã®ãããªèæ¯ãããã³ã³ããã®ä»£ããã«WebAssemblyãå©çšãããæªæ¥ãæ³åãã§ããããã«ãªã£ãŠãããšããã§ãã ãããŠãå
ã
ææ«ã«å€§ããªãã¥ãŒã¹ãçºè¡šãããŸããã ããããDockerã®WebAssemblyã³ã³ããã§ãã https://www.docker.com/blog/docker-wasm-technical-preview/ ãã®èšäºãèªãã ãšãããDocker API ã䜿ã£ãŠWASM Runtimeã§ã®å®è¡ãå¯èœã«ãªããšããããšã§ãã ããã«ã¯ãWASM ImageãªãæŠå¿µããããããã«ããæ¢åã®Docker ImageãšäŒŒããããªãšã³ã·ã¹ãã ããã€ãã©ã€ã³ã®æŽ»çšãæåŸ
ã§ãããšããããšã§ãã DockerãšWASMã¯ã©ã®ããã«çµ±åãããã®ã å€ãã®èªè
ã®æ¹ãæ°ã«ãªã£ãŠããç¹ã§ããããã¬ãã¥ãŒã«æžããŠãã£ãå
容ãç°¡åã«ç§ãªãã«ãŸãšããŸããã OCIã¢ãŒãã£ãã¡ã¯ã ãšcontainerd-shimãæŽ»çšããŠããã OCIæºæ ã®WebAssemblyã©ã³ã¿ã€ã ã§ãã WasmEdge ãæ¡çšãããã®ããã« containerd-wasm-shim ãäœæãããcontainerd-wasm-shimã¯ãOCI ã¢ãŒãã£ãã¡ã¯ã ããWASMã¢ãžã¥ãŒã«ãæœåºããWasmEdge Runtimeã䜿çšããŠå®è¡ããã containerd-shimã䜿çšã§ããããã«ããããã«ã --runtime=io.containerd.wasmedge.v1 ãã©ã°ã«ãã£ãŠãWASM Runtimeã宣èšã§ããããã«ããã å®éã«ç§ã® MacBook ã®Docker Desktopã§WASMã³ã³ãããäœæããŠå®è¡ããŠã¿ãŸããã ä»åã¯ã å
¬åŒã®ãµã³ãã« ãåèã«é²ããŸããã [ãã¢]å®éã«Docker Desktopã§WASMãå®è¡ããŠã¿ã ä»åã¯ãGoèšèªã䜿ã£ãŠãµã³ãã«ãäœããŸãã WASMãžã® ã³ã³ãã€ã« ã容æãªtinygoãã€ã³ã¹ããŒã«ããŸãã brew tap tinygo-org/tools brew install tinygo ãããŠã Hello World ããã ãã®Goã®ããã°ã©ã ãçšæããŸãã æ¬èšäºã§ã¯ããã®ã³ãŒããWASMãã€ããªã« ã³ã³ãã€ã« ããŠããããOCIã€ã¡ãŒãžãšããŠå©çšå¯èœã§ããããšãæ€èšŒããŸãã package main func main() { println("hello world") } ã§ã¯ããŸãWASMãã€ããªã« ã³ã³ãã€ã« ããŸãããã tinygo build -o wasm.wasm -target wasm ./main.go ãã®ã³ãã³ãã§ã wasm.wasm ãšãããã€ããªãåºæ¥äžãããŸãã ãããããWASMã³ã³ããé¢é£ã®éšåã«å
¥ã£ãŠãããŸãã å
ã»ã©äœæããWASMãã€ããªãOCIäºæã®ã€ã¡ãŒãžã«ããŠãããŸãã 以äžã®ããã«å°ãç¡çç¢çã§ãããDockerfileã䜿ã£ãŠå®çŸã§ããŸãã FROM scratch COPY ./wasm.wasm /wasm.wasm ENTRYPOINT [ "wasm.wasm" ] ããã§å©çšããŠãã scratch ãšããã³ã³ããã€ã¡ãŒãžã¯ãDockerã³ã³ãããå®çŸããäžã§æå°éã®ãã®ã®ã¿ã®ã§æ§æãããéåžžã«è»œéãªã³ã³ããã€ã¡ãŒãžã§ãã ä»åã¯ãDockerã€ã¡ãŒãžã®ãšã³ã·ã¹ãã ãæŽ»çšããããã«scratchã®äžã«WASMã¢ãžã¥ãŒã«ãå
¥ããããã«æ§æããŠããŸãã docker buildx build --platform wasi/wasm32 -t sample-wasm-container . ããã§OCIäºæã®WASMã€ã¡ãŒãžãäœæã§ããã¯ããªã®ã§ããã ------ > exporting to image: ------ ERROR: failed to solve: operating system is not supported ãã®ãããªãšã©ãŒã«ééããŸããã(ããªãè©°ãŸããŸããæ±) Docker Desktopã®Containerdã®ã€ã¡ãŒãžã¹ãã¢æ©èœã¯ããã©ã«ãã§ã¯OFFã®ãããªã®ã§ãONã«ããå¿
èŠããããŸãã 以äžã®ãªã³ã¯ã®æé éãã«é²ããããšã§è§£æ±ºããŸããã https://docs.docker.com/desktop/containerd/ ããäžåºŠä»¥äžã®ã³ãã³ããå®è¡ãããšæåããŸãã docker buildx build --platform wasi/wasm32 -t sample-wasm-container . ã§ã¯ãåºæ¥äžãã£ãã€ã¡ãŒãžãèŠãŠã¿ãŸãããã â docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE sample-wasm-container 0.1 1711f20d1ef5 4 minutes ago 128kB â docker image inspect sample-wasm-container | grep -A 3 "Architecture" "Architecture": "wasm32", "Os": "wasi", "Size": 127948, "VirtualSize": 127948, wasm32 ãšããArchitectureã®ã€ã¡ãŒãžãã§ããŠããããšã確èªã§ããŸãã ã§ã¯ããããããã®ã€ã¡ãŒãžãDocker Hubã«ç»é²ããŠãããŸãã docker image tag sample-wasm-container mikiko/sample-wasm-container:1.0 docker image push hashino/sample-wasm-container:1.0 ãšãããã以äžã®ãããªãšã©ãŒãåºãŸããã server message: insufficient_scope: authorization failed 以äžã®ã³ãã³ãã§å床dockerã«ãã°ã€ã³ããããšã§è§£æ±ºã§ããŸããã docker login Docker Hubã®WebUIãããDockerã€ã¡ãŒãžãä¿åãããŠããããšã確èªã§ããŸãã ã§ã¯ãå®éã«Docker Hubã«ä¿åããWASMã€ã¡ãŒãžãå®è¡ããŠã¿ãŸãããã docker container run --rm --name= \ --runtime=io.containerd.wasmedge.v1 \ --platform=wasi/wasm32 \ mikiko/hello-wasm-container:0.1 hello world ããŸãå®è¡ããããšãã§ããŸããïŒ ãŸãšã æ¬èšäºã§ã¯ãå
ã
æã«çºè¡šãããDocker WASMã³ã³ãããå®éã«å®è¡ããŠã¿ããšãããŸã§é²ããŸããã Dockerãå
¬éããWASMã³ã³ãããæ€èšŒããŠã¿ãŸããã ãããŸã§éãã®ã³ã³ãã ã¬ãžã¹ããª ãæŽ»çšãããã«ãããããã€ã«é¢ãããšã³ã·ã¹ãã ãæŽ»ãããŠãWASMãå°å
¥ã§ããããšãåãããŸããã ãã²ãçããããæ€èšŒãã ããïŒïŒ åèæç® https://www.publickey1.jp/blog/22/docker_desktopwebassemblywebassembly.html https://github.com/opencontainers/artifacts https://www.docker.com/blog/docker-wasm-technical-preview/ https://docs.docker.com/desktop/wasm/ https://nigelpoulton.com/webassembly-the-future-of-cloud-computing/ https://github.com/tinygo-org/tinygo https://tinygo.org/docs/guides/webassembly/ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
æ§ãç ããŸããã ããã«ã¡ã¯ããšã³ãžãã¢ã®åŸè€ã§ãã BUYMA ã®Webã¢ããªãäœãä»äºãããŠããŸãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®ïŒæ¥ç®ã®èšäºã§ãã ãã®èšäºã®ãŽãŒã« ãã®èšäºã®ãã£ãã ã©ã®ããã«å®çŸããã æ°ãã«èŠã€ããèª²é¡ æåŸã« æ¬åœã«æåŸã« ãã®èšäºã®ãŽãŒã« ãã®èšäºã§ã¯ã Visual Studio Code ã§ã³ãŒããæžãã€ã€ããµã¯ãµã¯ rspec ãå®è¡ããã Java ãããžã§ã¯ãããã«ããããã lint ãå®è¡ãããããšããããšãã§ããããã«ãªãããšããã®ããŽãŒã«ãšããŠããŸãã ãšãã£ã¿ã®ã«ã¹ã¿ãã€ãºã æãã人 ããšãã£ã¿ãšã³ã³ãœãŒã«ãè¡ã£ããæ¥ããããªããéçºãé²ããŠãã人ã«ããããã®èšäºãšãªããŸãã 察象ã®ãšãã£ã¿ã¯ Visual Studio Code ã§ãã ãã®èšäºã®ãã£ãã ãã®èšäºãæžããã£ããã«ãªã£ãã®ã¯ç§ãããšãã£ã¿ã emacs ãã Visual Studio Code ãžä¹ãæããããšã«èµ·å ããŸãã emacs ã§ rails ã¢ããªã±ãŒã·ã§ã³ãæžããŠãããšãã¯ã rspec -mode ãšãã emacs æ¡åŒµãã€ã³ã¹ããŒã«ããããšã§ã rspec ãã¡ã€ã«ãšãã¹ã察象ã®ãã¡ã€ã«ãè¡ãæ¥ãã ã«ãŒãœã«ã®ããè¡ã® rspec ãå®è¡ ã«ãŒãœã«ã®ãããã¡ã€ã«ã® rspec ãå®è¡ ãšãã£ãããšãããŒããŒãããè¡ããŸããã Visual Studio Code ã䜿ãå§ããŠããã Rails Go to Spec ãšãã ãã©ã°ã€ã³ ãèŠã€ããŠã rspec ãšãã¹ã察象ã®ãã¡ã€ã«ãè¡ãæ¥ãã ã¯ã§ããããã«ãªã£ãã®ã§ãããã«ãŒãœã«ã®ããè¡ã® rspec ãå®è¡ãããšããäºãã§ããŸããã§ããããã®ããã ãã©ã°ã€ã³ ã§ãæžãã(ãšãã£ã¿ã®ã«ã¹ã¿ãã€ãºã¯å€§å¥œç©ã§ã)ããšæã£ãŠããæã«è¯ãæ¹æ³ãã¿ã€ããã®ã§ãã®èšäºãæžããŸããã ã©ã®ããã«å®çŸããã çµè«ããèšããšã Visual Studio Code ã®æšæºæ©èœã®ã¿ã§å®çŸã§ããŸããããã®æ¹æ³ã¯ããããžã§ã¯ãã® tasks.json ã«ã¿ã¹ã¯ã远å ããããšãšãããŒããŒãã·ã§ãŒãã«ããã®å²åœã§ãã Visual Studio Code ã«ã¯ããããžã§ã¯ãã® ãã£ã¬ã¯ã ãªå
ã«ããã .vscode/tasks.json ãã¡ã€ã«ã«ã¿ã¹ã¯ãèšè¿°ããŠããããšã§ã Tasks: Run Task ãããããžã§ã¯ãã«é¢é£ããã¿ã¹ã¯ãå®è¡ã§ããããšããæ©èœã§ãã ãã®æ©èœãšã Tasks: Rerun Last Task ãžããŒããŒãã·ã§ãŒãã«ããã«å²ãåœãŠãããšã§ãå®çŸããŸãã ã§ã¯ãæ©é rails ãããžã§ã¯ãã察象㫠rspec ãå®è¡ããå ŽåãèŠãŠãããŸãããã以äžã®ãã㪠.vscode/tasks.json ãäœæããŸãã { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format " version ": " 2.0.0 ", " tasks ": [ { " label ": " rspec file ", " type ": " shell ", " command ": " rspec -fd ${relativeFile} ", " group ": " test ", " problemMatcher ": [ { " owner ": " ruby ", " fileLocation ": [ " relative ", " ${workspaceFolder} " ] , " pattern ": { " regexp ": " ^rspec \\ s+(.*):( \\ d+) \\ s+# \\ s+(.*)$ ", " file ": 1 , " line ": 2 , " message ": 3 } } ] } , { " label ": " rspec here ", " type ": " shell ", " command ": " rspec -fd ${relativeFile}:${lineNumber} ", " group ": " test ", " problemMatcher ": [ { " owner ": " ruby ", " fileLocation ": [ " relative ", " ${workspaceFolder} " ] , " pattern ": { " regexp ": " ^rspec \\ s+(.*):( \\ d+) \\ s+# \\ s+(.*)$ ", " file ": 1 , " line ": 2 , " message ": 3 } } ] } ] } äœæããã¿ã¹ã¯ã¯ã以äžã«ãªããŸãã ã¿ã¹ã¯å 説æ rspec file ã«ãŒãœã«ã®ãã rspec ãã¡ã€ã«ã®ãã¹ãããã¹ãŠå®è¡ãã rspec here ã«ãŒãœã«ã®ããè¡ã® rspec ã®ãã¹ããå®è¡ãã ããã§æºåã¯æŽããŸããã ããã§ã¯ãéçºã®æµããèŠãŠãããŸãã rspec ãã¡ã€ã«ãç·šéããŠããŠãç¹å®ã®ãã¹ããå®è¡ããŸãã Tasks: Run Task -> rspec here ãéžã³ãã«ãŒãœã«ã®ããè¡ã® rspec ã®ã¿ãå®è¡ãããŸãã ãŸããç·šéäžã®ãã¡ã€ã«å
šäœã® rspec ãå®è¡ããå Žå㯠Tasks: Run Task -> rspec file ãéžæããããšã§å®è¡ã§ããŸãã å ããŠã Tasks: Rerun Last Task ã«ããŒããŒãã·ã§ãŒãã«ãããå²ãåœãŠãŠããããšã§(ç§ã®å Žåã¯Command + Shift + T)ã§ã rspec ã®äœæãã Tasks: Run Task -> rspec here` ãå®è¡ ãã¹ãã倱æããã®ãç¢ºèª ãœãŒã¹ãå®è£
ããŒããŒãã·ã§ãŒãã«ããããã Tasks: Rerun Last Task ãå®è¡ Tasks: Run Task -> rspec here ãå®è¡ããã ãã¹ããæåããã®ã確èªãã Tasks: Run Task -> rspec file ãå®è¡ åããã¡ã€ã«å
ã®ä»ã®ãã¹ããå£ããŠããªãããšãç¢ºèª ãšããéçºãã§ããããã«ãªããŸããã ã¡ãªã¿ã«ãä»å㯠rspec ã«ç¹åããã¿ã¹ã¯ãèšè¿°ããŸãããã JavaScript ãæžããŠãããšãã¯ãlint ã¿ã¹ã¯ãæžãã Java ãããžã§ã¯ãã®å Žåã¯ããã«ãã¿ã¹ã¯ã JUnit ã¿ã¹ã¯ãæžããŠããããšã§ããã¹ãŠã®èšèªã§åãããã«éçºãé²ããããŸãã ãã§ãããã§ããã æ°ãã«èŠã€ããèª²é¡ ãšæã£ãŠããã®ã§ãããæ°ãã課é¡ãèŠã€ããŸããã rspec here ã§ãç¹å®ã®ãã¹ããå®è¡åŸããœãŒã¹ãã¡ã€ã«ãç·šéããåŸã«ãã«ãŒãœã«ãš rspec ãã¡ã€ã«ã®ãã¹ã察象è¡ã«æã£ãŠãããªããšãåããã¹ããå®è¡ã§ããŸãããããã¯ãå°å³ã«é¢åããããã§ããã°ã Tasks: Rerun Last Task Command ã®ãããªã³ãã³ãã§ãæåŸã«å®è¡ããã¿ã¹ã¯ã®ã³ãã³ãããã®ãŸãŸå®è¡ããäºãã§ããã°ã解決ãããã§ãããã©ããããã®ãããªæ©èœã¯ç¡ãããã§ãã ããã¯ãæ©èœè¿œå ã®äŸé Œãããã ãã©ã°ã€ã³ ãæžããªããšè§£æ±ºã§ããªãããã§ãã ããã¯ãæ¥å¹Žã® ã¢ããã³ãã«ã¬ã³ããŒ ã®æã«ã§ã解決ããããšæããŸãã æåŸã« ã¿ãªãããæ§ãç ãã§ããã§ããããïŒ æ§ãç ããšèšã£ãŠããæ¬åœã«æ§ãç ããšããããšã§ã¯ãªãããããã®ãžã¬ã³ããã®ã話ã§ããããããã®ãžã¬ã³ãããšããã®ã¯ç°¡åã«èª¬æãæžããšã ãããšããã«ãå¿ããæšããã£ãŠããããããããŸãããåœŒã®æšãåãããŒã¹ãæ¥ã«æ¥ã«èœã¡ãŠãããŸãããããçºããŠãã人ããæ§ã®åããæªããªã£ãŠããã®ã§ã¯ïŒãšæããæ§ãç ãã§ã¯ã©ããããšææ¡ããã®ã§ããããããã¯å¿ãããŠæ§ãç ãã§ããæã¯ãªããšçãã ãšããã話ã§ãã ã§ã¯ããšã³ãžãã¢ã«ãšã£ãŠã®æ§ã¯äœã§ããããïŒãããããããšæãã®ã§ããããšãã£ã¿ã¯æ§ã®äžã€ã§ã¯ãªãããšæããŸãã 幎ïŒåã ã¢ããã³ãã«ã¬ã³ããŒ ã®æã ããªã©ãšèšã£ãŠããªãã§ãæ¥ã
æ§ãç ããŸãããã Tasks: Rerun Last Task Command ã¯ä»ã®ã¿ããªã欲ããã®ã§ã¯ããšããäºãä¿¡ããŠã Visual Studio Code ã®ããããŒã¶ã«ãæžããŠã¿ãããšæããŸããè¿ãå°æ¥ã æ¬åœã«æåŸã« ææ¥ã®èšäºã®æ
åœã¯ãšã³ãžãã¢ã®æ©éããã§ãããæ¥œãã¿ã«ã BUYMA ãäœã£ãŠãããæ ªåŒäŒç€Ÿ ãšãã°ã¢ ã§ã¯ãæ§ãç ãã§ä»äºãé²ãããšã³ãžãã¢ãæ±ããŠããŸãããèå³ã®ããæ¹ã¯ä»¥äžã®æ±äººã埡芧ãã ããã æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ããµãŒãã¹ãšã³ãžãã¢ãªã³ã°æ¬éšã®å¯ºç°ã§ãã 軜ãèªå·±ç޹ä»ã«ãªããŸãããç§ã¯ SIer ã§ SE ã2幎éçµéšããã®ã¡ãçŸè·ã® ãšãã°ã¢ ã«ã¯ 2020/7 ãããžã§ã€ã³ããŠãããŸãã æ®æ®µã¯äž»ã« Ruby on Rails ãçšãã BUYMA ã®ãµãŒããŒãµã€ãéçºããã£ãŠããŸãã æè¿èå³ããäºã¯ ã¢ã«ãŽãªãºã ã§ã鱿«ã«ã¯ Atcoder ã«ã¡ããã¡ããææŠãããããŠããŸãã ã¡ãªã¿ã«ããã®èšäºã¯ Enigmo Advent Calendar 2022 ã®7 æ¥ç®ã®èšäºã«ãªããŸãïŒ 12 æã¯ãã®ããã«åŒç€Ÿã®ãšã³ãžãã¢ãèšäºãå·çããŸãã®ã§ããã²ã楜ãã¿ã«ïŒ çµã¿èŸŒã¿ã¡ãœããããªãèŠããå¿
èŠãããã®ãïŒ ç§ãå«ããªãã®ããã¯æèšã§ã...ãªãã¹ãèŠãããã®ã¯å°ãªãæžãŸãããããããªæããç§ã«ãšã£ãŠåžžã«ããã®ã§ãããããªç§ã«ãšã£ãŠããã°ã©ãã³ã°ãå匷ãããŠã®é ã«æã£ãããšã¯ããã§ããã ãã¶ã£ã¡ãã for ãš if ã䜿ããã°äœã§ãã§ããããããªãã®ãïŒã ãããªãã§ãããããŠãã®ããã°ã©ã 㯠for ãš if ã䜿ãã°è¡šããã®ã§ããã§ã¯ãªãèšå€§ãªéã®çµã¿èŸŒã¿ã¡ãœãããèŠããå¿
èŠãããã®ãïŒïŒ äžã€çç±ãšãªãã®ã¯ãããã¯èªã¿ãããïŒ=å¯èªæ§ãé«ãïŒããã§ãããã ãã ãçµã¿èŸŒã¿ã¡ãœããã䜿ã£ãããã°ã©ã ã誰ã«ãšã£ãŠãèªã¿ãããããšèšã£ãããããã§ããªãã§ãããïŒ # é
åã®åèšãèšç®ãã ## inject ãå©çšããå Žå puts [ 2 , 3 , 4 , 5 ].inject { |result, item| result + item } ## for ã«ãŒããå©çšããå Žå sum = 0 [ 2 , 3 , 4 , 5 ].each do |v| sum += v end puts sum é
åã®èŠçŽ ã®åèšãèšç®ããã®ã«ã inject ãšããã¡ãœããã䜿ã£ãŠãŸããããã¯ç¥ã£ãŠã人ã¯ç°¡åã«èªãããããããŸããããçŽæçã«ã¯ for ã«ãŒãã䜿çšããããã°ã©ã ã®æ¹ãèªã¿ãããæ°ãããŸãã ã§ã¯ãçµã¿èŸŒã¿ã¡ãœããã絶察䜿ã£ãæ¹ãè¯ãã±ãŒã¹ãšã¯ã©ããªå Žåã§ããããïŒ ããã¯ã ã for ã if ã䜿ã£ãŠç°¡åã«æžããããã°ã©ã ããå§åçã«æ©ãå Žåã ããã¯çµ¶å¯Ÿã«çµã¿èŸŒã¿ã¡ãœããã䜿ã£ãããã°ã©ã ã®æ¹ãããã§ãããïŒ ruby ã«ã¯åªãã ã¢ã«ãŽãªãºã ã䜿çšããŠæžãããã¡ãœããããããããååšããŠããŸããä»åã®èšäºã§ã¯4ã€ã®ã¡ãœãããšããããã«äœ¿çšãããŠãã ã¢ã«ãŽãªãºã ã«ã€ããŠç޹ä»ããŠããããšæããŸãïŒ array#sort åé¡ 1~100000 ãŸã§ã®æ°åãã©ã³ãã ã«äžŠã³æ¿ããããé
åãã æé ã«äžŠã³æ¿ããŠãã ããã for ãš if ã䜿ã£ãããã°ã©ã len = array.length len.times do |i| (len - 1 - i).times do |j| if array[j] > array[j + 1 ] array[j], array[j + 1 ] = array[j + 1 ], array[j] end end end for ãš if ã ãã䜿ã£ãŠç°¡åã«ããã°ã©ã ãäœæããå Žåããããªæãã§ããããïŒ ããã§çšããããŠãã ã¢ã«ãŽãªãºã 㯠ããã«ãœãŒã ãšãããã®ã§ãã ããã«ãœãŒã ã® ã¢ã«ãŽãªãºã ãå³è§£ãããš... é£ãåã£ãæ°å€åå£«ãæ¯èŒãã倧å°é¢ä¿ãåã£ãŠããªãå Žåã¯å€ã亀æããããšããã®ãåºæ¬ã®èãæ¹ã«ãªããŸãã 1çªç®ã®èŠçŽ ãš2çªç®ã®èŠçŽ ã®å€§å°é¢ä¿ãæ¯èŒ 2çªç®ã®èŠçŽ ãš3çªç®ã®èŠçŽ ã®å€§å°é¢ä¿ãæ¯èŒ ... æåŸããäžã€åãšæåŸã®èŠçŽ ã®å€§å°é¢ä¿ãæ¯èŒ ãšããããšã§ãäžçªæåŸã®èŠçŽ ã®å€ã確å®ããŸãã ãããèŠçŽ ã®æ°ã ãç¹°ãè¿ããšãããã®ã«ãªããŸãã ãªã®ã§ãã«ãŒãã®åæ°ã¯èŠçŽ ã®åæ°ã n ãšãããšã n(n-1)/2 åã§ãèšç®é㯠ãšãªããŸãã ãªãŒããŒèšæ³ ããã§ãªãŒããŒèšæ³ïŒäŸã«åºãŠãã ãšããæžãæ¹ïŒãè»œãæŒãããŠãããŸãããã ãªãŒããŒèšæ³ã¯ã³ã³ãã¥ãŒã¿ãŒã«ããèšç®ãã©ããããã®æéãããããã瀺ãããã®ã§ãã åèšç®éãªãŒããŒã«å¯ŸããŠãå®éã«ã©ããããã®èšç®åæ°ã«ãªãã®ã衚ã§èŠãŠã¿ãŸãããã 10 3 33 100 100 7 664 10000 1000 10 9966 1000000 10000 13 132877 100000000 1000000 20 19931569 1000000000000 èšç®éã¯ãªãŒããŒã«ãã£ãŠããªãç°ãªãããšãããããŸãã ã«æ¯ã¹ãŠ ã¯ããªãé«éã§ããã ããã¯ ã®æ¹ããšãŠãé«éã§ãã ãŸãããã®å·®ã¯æ°ã倧ãããªãã°ãªãã»ã©åºãã£ãŠãããŸãã Ruby ã®çµã¿èŸŒã¿é¢æ°ãäœ¿çš ããã§æ¬é¡ã«æ»ããŸãããã Ruby ã®çµã¿èŸŒã¿ã¡ãœããã䜿çšããŠããã®åé¡ãè§£ããªãã°ã Array#sort ã䜿ããŸãã array.sort Array#sort ã§äœ¿ãããŠãã ã¢ã«ãŽãªãºã 㯠ã¯ã€ãã¯ãœãŒã ãšãããã®ã§ãã æé ãšããŠã¯ä»¥äžã®æµãã§ãœãŒããè¡ããŸãã åºæºãšãªãæ°å€ã決ãã åºæºããå°ãã or 以äžã®ã°ã«ãŒãã«é
åã®èŠçŽ ãæ¯ãåããŠãã èŠçŽ ãïŒã€ä»¥äžããã°ã«ãŒãã«ãããŠãåã°ã«ãŒãå
ã§æ°ãã«åºæºã決ãã ã°ã«ãŒãå
ã§åºæºããå°ãã or 以äžã®ã°ã«ãŒãã«é
åã®èŠçŽ ãæ¯ãåããŠãã ãã®ç¹°ãè¿ãããããããã®ã°ã«ãŒãã®èŠçŽ ã1ã€ãã€ã«ãªããŸã§ç¹°ãè¿ããŠãããæåŸã«å
šãŠãçµåããããšã§ãœãŒããå®çŸããŠãããŸãã èšç®éã§ãããå¹³åã§ ã«ãªããŸãã æè¯ã®ã±ãŒã¹ã§ã¯äžåºŠã®ã«ãŒãã§åã°ã«ãŒãã®èŠ çŽ æ° ããååã®ã«ãŒãã®ååã®æ°ã«ãªã£ãŠãããŸãã 蚌æã¯çããŸããããã®ããã«æ®µã
ãš 1/2 ã«ãªã£ãŠãããæçµçã«n å => 1 åã«èŠçŽ ãæžã£ãŠãããŸã§ã«ãããèšç®é㯠ãšãªããšèŠããŠãããšè¯ãã§ãããã ããã«ãæ¯åã®ã«ãŒãã§é
åã®é·ãã§ãã n åã®æ¯èŒãè¡ãããã ãèšç®éãšãªããŸãã å®éã«ããã°ã©ã ãå®è¡ããŠèšç®éãæ¯èŒããŠã¿ãã®ã以äžã®å®è¡çµæã§ãã n = 100000 ã®å Žåãfor ã«ãŒãã«ãã ããã«ãœãŒã ããã Array.sort ã 1000 åãæ©ãã§ãã Enumerable#bsearch åé¡ 1000000000 åã®èŠçŽ ããããœãŒãæžã¿ã®é
åã®äžããã ç¹å®ã®æ°ä»¥äžã®å€ãåããŠçŸããã€ã³ããã¯ã¹çªå·ãæ±ããŠãã ããã for ãš if ã䜿ã£ãããã°ã©ã array.each_with_index do |v, i| if (v >= 99999999 ) puts i break end end éåžžã«ã·ã³ãã«ã«èãããšããã§ããããïŒ ãã®ãã㪠ã¢ã«ãŽãªãºã 㯠å
šæ¢çŽ¢ ãšåŒã°ãããã®ã§ãã é
åã®å
šèŠçŽ ã«å¯ŸããŠäžã€äžã€æ¯èŒããŠçããæ±ãããã®ã«ãªããŸãã é
åã®é·ãã ãã«ãŒããèµ°ãã®ã§ãé·ã n ã®é
åã«å¯ŸããŠèšç®é㯠ã§ãã Ruby ã®çµã¿èŸŒã¿é¢æ°ãäœ¿çš ã§ã¯ Ruby ã®çµã¿èŸŒã¿å€æ°ã Enumerable#bsearch ã䜿ã£ãå Žåã¯ã©ã®ãã㪠ã¢ã«ãŽãªãºã ã«ãªãã§ããããïŒ array.bsearch { |x| x >= 99999999 } ãã¡ãã§äœ¿çšãããŠãã ã¢ã«ãŽãªãºã 㯠äºåæ¢çŽ¢ ãšãããã®ã§ãã é
åã®äžãã 2 ãšããæ°åãæ¢ãå ŽåãèããŠã¿ãŸãããã ãã¡ãã® ã¢ã«ãŽãªãºã ã§ã¯ä»¥äžã®æé ã§çããæ±ããŸãã 巊端ãšå³ç«¯ã®å€ã®äžå¿ã®å€ãåºæºã«ãæ¢ãããæ°ãåºæºããå°ãã or 以äžããæ±ãã åºæºããå°ããå Žå => æ¢ãããå€ã¯å·Šååã«ãããšããã åºæºä»¥äžã®å Žå => æ¢ãããå€ã¯å³ååã«ãããšããã èŠçŽ ãäžã€ã«ãªããŸã§ç¹°ãè¿ã ãã¡ããã«ãŒããç¹°ãè¿ããã³ã«ãèŠçŽ ã®æ°ã¯ 1/2 => 1/4 => 1/8 ... ãšã©ãã©ãååã«ãªã£ãŠãããŸãã ãªã®ã§ãèŠçŽ ã1ã€ã«ãªããŸã§ã«å¿
èŠãªã«ãŒãã®ãªãŒããŒã¯ ã«ãªããŸãã ããã¯å
šæ¢çŽ¢ã® ããããªãé«éã§ããå®éã«ããã°ã©ã ãå®è¡ããçµæãèŠãŠã¿ãŸãããã ãã®ãããéãã§ãããäºåæ¢çŽ¢ã¯å
šæ¢çŽ¢ãã 1000000 åãæ©ããšããçµæãšãªããŸããã Integer#pow åé¡ ãèšç®ããŠãã ããã ãšãŠã倧ããªæ°ã§çޝä¹ã®èšç®ãããŠãã ãããšããã±ãŒã¹ã§ããã for ãš if ã䜿ã£ãããã°ã©ã ans = 1 ( 100000000 ).times do ans = ans * 3 end puts ans 环ä¹ã¯èšãæããã°åºãææ°ã®åæ°ã ãæãåããããšããããšã§ãã ãããçŽ çŽã«å®è£
ããã°äžèšã®ããã«ãªãã§ããããã ææ°ã®åæ°ã ãã«ãŒãããŠæãç®ãè¡ããŸãã®ã§ãææ°ã n ãšãããšèšç®é㯠ã«ãªããŸãã Ruby ã®çµã¿èŸŒã¿é¢æ°ãäœ¿çš Ruby ã®çµã¿èŸŒã¿é¢æ°ã«ã¯ Integer#pow ãšãããã®ããããŸãããã㯠Integer#** ãš ã¢ã«ãŽãªãºã ã¯åãã§ãã 3 .pow( 100000000 ) ãã¡ã㯠ã¢ã«ãŽãªãºã ãšã㊠繰ãè¿ãäºä¹æ³ ã䜿ãããŠããŸãã äŸãšã㊠ãèããŠã¿ãŸãããã æçŽã«èšç®ãããšã«ãŒãã®åæ°ã¯ææ°ã®æ°ã§ãã 8 åã§ãã ããã ã¯å€æããŠã¿ããšã以äžã®ããã«ãªãããšãããããŸãã ãã®ããã«èããã°ãã«ãŒãã®åæ°ã¯4åã§æžã¿ãŸãã ãã®æé ãäžè¬åããŠèãããšã以äžã®ããã«ãªããŸãã æ±ãããå€ããææ°ã 1/2 ã«ããå€ãæãåãããåŒã§è¡šã ææ°ã 1 ã«ãªããŸã§ç¹°ãè¿ã ææ°ã¯ã«ãŒããçµãããšã« 1/2 => 1/4 => 1/8 ... ãšååã«ãªã£ãŠãããŸããææ°ã n ãªãã°ã1 ã«ãªããŸã§ã«çºçããã«ãŒãã®åæ°ã¯ ã§éåžžã«é«éã§ãã å®éã«ããã°ã©ã ãåãããŠæ¯èŒããŠã¿ãŸããã éåžžã«é«éã§ããæçŽãªèšç®æ¹æ³ãã 1000000 åãæ©ãããšãããããŸãã Integer#gcd åé¡ 463836510 ãš 692647128 ã®æå€§å
¬çŽæ°ãæ±ããŠãã ãã for ãš if ã䜿ã£ãããã°ã©ã ans = 0 ( 1 ...[a, b].max).each do |d| ans = d if (a % d == 0 && b % d == 0 ) end puts ans æå€§å
¬çŽæ°ãšã¯ãäºã€ã®å€ãå²ãåããæå€§ã®æŽæ°ã®ããšã§ãã ãã®å®çŸ©ããã®ãŸãŸå®è£
ãããªãã°ãäžèšã®ãããªããã°ã©ã ã«ãªãããšæããŸãã ãã¡ãã¯å
šæ¢çŽ¢ã® ã¢ã«ãŽãªãºã ãšãªã£ãŠããŠãäžããããæ°ã n ãšãããšèšç®é㯠ãšãªããŸãã Ruby ã®çµã¿èŸŒã¿é¢æ°ãäœ¿çš æå€§å
¬çŽæ°ãæ±ããã¡ãœãããšããŠã Integer#gcd ãçšæãããŠããŸãã a.gcd(b) ãã¡ã㯠ãŠãŒã¯ãªããã®äºé€æ³ ãšåŒã°ãã ã¢ã«ãŽãªãºã ã䜿çšãããŠããŸãã ãŠãŒã¯ãªããã®äºé€æ³ ãšããã®ã¯ä»¥äžã®å®çŸ©ãæããŸãã 2ã€ã® èªç¶æ° a, b ã«ã€ããŠãa / b = qãa % b = r ãšãããšã ãa, b ã®æå€§å
¬çŽæ°ãã¯ãb ãš r ã®æå€§å
¬çŽæ°ãã«çããã åŒã§è¡šããšä»¥äžã®ããã«ãªããŸãã ãã㧠㯠a ãš b ã®æå€§å
¬çŽæ°ã衚ããŸãã ãããç¹°ãè¿ãããšã«ãã£ãŠãå°ãªãã«ãŒãã®åæ°ã§æå€§å
¬çŽæ°ãæ±ããããšãã§ããŸãã äŸãã°ã629 ãš 481 ã®æå€§å
¬çŽæ°ãæ±ããŠã¿ãŸãããã æåŸã®ã¹ãããã§ã¯ã148 ã 37 ã§å²ã£ãéã®ããŸã㯠0 ã«ãªã£ãŠããŸãã ãã㯠148 ãš 37 ã§ã¯ 37 ãæå€§å
¬çŽæ°ã«ãªã£ãŠããããšãæå³ããŸãã ããã«ã = = 37 ãšæå€§å
¬çŽæ°ãæ±ãŸããŸãã ãããŠããã® ã¢ã«ãŽãªãºã ã®èšç®éã¯ãã£ãããš ã«ãªããŸãã ã ãšããŠã ãã以äžã®ããšãèšããŸãã ããªãã¡ã ãæãç«ã¡ãŸãã 2åã®ã«ãŒããçµãããšã§ã確å®ã«å€ã 1/2 以äžã«ãªãããã§ããã å
ã»ã©ããäœåºŠãåºãŠãããã¿ãŒã³ã§ãããå€ã 1/2 ã«æžå°ããŠãã ã¢ã«ãŽãªãºã ã¯èšç®éã ãšãªããŸãã å®éã«å®è¡éåºŠãæ¯ã¹ãŠã¿ãŸãããã èšç®é床㯠10000000 åã«éããªã£ãŠããŸãã ãŸãšã Ruby ã«ã¯è¯ã ã¢ã«ãŽãªãºã ã䜿ã£ãçµã¿èŸŒã¿ã¡ãœãããçšæãããŠãã ã¢ã«ãŽãªãºã ã®ç޹ä»ãšããŠã ã¯ã€ãã¯ãœãŒã äºåæ¢çŽ¢ ç¹°ãè¿ãäºä¹æ³ ãŠãŒã¯ãªããã®äºé€æ³ ã玹ä»ããã è¯ã ã¢ã«ãŽãªãºã ã䜿ãããšã§ããã°ã©ã ã¯äœäžåã«ãé«éã«ãªãããšããã ã¿ã€ãã«è©æ¬ºã«ãªã£ãŠããŸããŸããã倧äºãªããšã¯ Ruby ã®ã¡ãœãããèŠããããšã§ã¯ãªããã©ããã ã¢ã«ãŽãªãºã ããããèªåãçŽé¢ããåé¡ã解決ããããã«ã©ã® ã¢ã«ãŽãªãºã ã䜿ãã¹ããã倿ã§ããããã«ãªãããšã ãšæããŸãã Web ãšã³ãžãã¢ã®è£Ÿéãåºãã£ãŠã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãåŠãã ããšã®ãªããšã³ãžãã¢ã®æ¹ãããã£ãããããšæããŸãããã®æ©äŒã«ãã²èå³ãæã£ãŠãããããšå¬ããããªãšæããŸãïŒ ææ¥ã®èšäºã®æ
åœã¯ ãµãŒãã¹ãšã³ãžãã¢ãªã³ã°æ¬éš ã® åŸè€ ããã§ãããæ¥œãã¿ã«ïŒ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ã2022å¹Žã«æ°åå
¥ç€Ÿãããšã³ãžãã¢ã®å·æ¬ãšæ©éã§ãïŒ ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®6æ¥ç®ã®èšäºã§ãã ãšãã°ã¢ ã§ã¯ç€Ÿå
ã®è¥æãäžå¿ã«junior workshopãšããåã§å匷äŒãè¡ã£ãŠãããŸãã çµéšã®æµ
ãã¡ã³ããŒã®æè¡åã¢ãããäž»ç®çãšããŠãããŸãããèå³ã®ããæ¹ã¯ã©ãªãã§ãåå ã§ããäŒãšãªã£ãŠããŸããïŒããã©ã³ã®æ¹å€§æè¿ã§ãïŒïŒ å匷äŒã®åœ¢åŒãšãå幎ã»ã©å匷äŒããã£ãŠã¿ãŠæãããããã£ãç¹ãä»åŸãã£ãŠã¿ããããšãªã©ã玹ä»ã§ããã°ãšæããŸãïŒ ããã£ãç¹ ããã£ãç¹1ïŒç¥èŠã®å
±æ 1ã€ã®æè¡æžãèªãã®ã«ãã1人ã§èªããããå匷äŒã§ããã°æ§ã
ãªç¥èŠãæã£ãã¡ã³ããŒãéãŸã£ãŠããã®ã§åžåã§ããããšãå€ãã§ãã æè¡æžã®å
å®¹ãæ¥åã§å®è·µããããšããã人ããã¯ãå
·äœçãªãšããœãŒããèãããšãã§ããŸãããæœè±¡çãªæŠå¿µã®å匷ãããŠããæã¯ç¹ã«çè§£ã®å©ãã«ãªããŸãã ããã£ãç¹2ïŒç€Ÿå
亀æµãå¢ãã å匷äŒã¯èª°ã§ãåå OKãšããŠããã®ã§ãæ§ã
ãªã¡ã³ããŒãšäº€æµã§ããããæ©äŒãšãªã£ãŠããŸãã æ®æ®µäžç·ã«ä»äºãããªãã¡ã³ããŒã®ããšãç¥ããããä»éšçœ²ã®æ¥åå
容ãç¥ããããšãã³ãã¥ãã±ãŒã·ã§ã³æŽ»æ§åããäŒç€Ÿçè§£ã®åäžã«ç¹ãã£ãŠãããšæããŸãã 以äžã®ãããªåœ¢ã§Slackã§å匷äŒåœæ¥ã«ãªãã€ã³ããããŠããã誰ã§ãé£ã³å
¥ãã§zoomã®URLããåå å¯èœãšãªã£ãŠãããåå ã®æ·å±
ã¯ãªãã¹ãäžããããã«ããŠããŸããâ ãšã³ãžãã¢æ¡çšããã£ãŠãã人äºã®æ¹ãåå ããŠãããŠããŸãïŒ ããã£ãç¹3ïŒç€Ÿå
æåã®åœ¢æ ãšãã°ã¢ ã«ã¯æè¡çé¢å¿ãé«ããšã³ãžãã¢ãå€ãã®ã§ã瀟å
ã§ã¯äžèšã®ãããªæè¡ååäžã«åããŠã®åãçµã¿ããããŠããŸãã Hacker's Delight ãšã³ãžãã¢ãå人çã«åŠç¿ããŠããããšããæ¥åã§å®è·µããããšãªã©ãçºè¡šããLTäŒã§ããé±ã«1åéå¬ããŠããŸãïŒ éçºå宿 ã³ãã以åã¯éçºå宿ãè¡ãããŠãããŸããïŒããããåéã§ããããããïŒ tech.enigmo.co.jp Ruby Kaigi 2022幎ã¯çŸå°ã® äžéç ã§ãªã³ãã©ã€ã³åå ãããæ¹ãããŸãïŒ tech.enigmo.co.jp Kaigi on Rails 2022幎㯠Gold Sponsors ãšããŠåå ããŸããïŒ tech.enigmo.co.jp è¥æå匷äŒããããã瀟å
æåã®1ã€ãšã㊠ãšãã°ã¢ ã«æ ¹ä»ãããšã³ãžãã¢çµç¹å
šäœã®ã³ãã¥ãã±ãŒã·ã§ã³æŽ»æ§åãæè¡åã®åäžã«ç¹ãããšèããŠããŸãã å匷äŒã®åœ¢åŒ èŒªè¬ ãšãã圢åŒã§ã鱿¿ããã§æ
åœè
ãå匷ããå
容ããŸãšããŠããŠçºè¡šããã¿ããªã質åããŠè°è«ããŠãããšããããæ¹ã§ãã£ãŠããŸãã 22æ°åãäžå¿ã«éå¬ããŠããå匷äŒã¯ã5æããéå¬ããŠããŸãã ãããŠã12æçŸåšã2ããŒãç®ã«çªå
¥ããŠããŸãã 1ããŒãç®ãš2ããŒãç®ã®éã«ã¯ãæ¯ãè¿ããèšããŠãé²ãæ¹ãå°ãæ¹åãããŸããã åæãã倧åã«ããŠããããšãšãæ¹åããããšã玹ä»ããŸãã åæãã倧åã«ããŠããããš å匷äŒãéå¬ããã«ããã£ãŠãããããããš/ãããããªãããšãªã©éå§åã«è©±ãåããŸããã åå è
ãåå è² æ
ã«ãªããªãããã«ããå匷äŒãç¶ç¶ããŠéå¬ãããã åã身ã«ãªããããªãããã«ãããã ãã®ïŒã€ã®æèŠãåããŠã ã¿ããªãäºç¿å¿
èŠã§ã¯ãªãæ¹åŒã«ããã æ
åœè
ã¯å¿
ããããŸãšãèšäºãäœã£ãŠããå¿
èŠã¯ãªããæäœéãã¡ã·ãªããŒãã§ããããã«ããŠããã éå¬åºæ¥ãªãããã§ããã°ãã®é±ã¯ã¹ããããããã 以äžã®ããšã決ããç¡äºã«1ããŒãç®ãçµããããšãã§ããŸããã æ¹åããããš åæãã倧åã«ããŠããããšã«å ããæ¹åããç¹ããããŸãã 以åã¯ãå匷äŒã®æéå
ã«æ±ºãããšãããŸã§ãèªã¿çµãããªãã£ãå Žåãæéãå»¶é·ããŠãŸã§ãã£ãŠããŸããã ããããä»ã¯æéã®ããªã®ãããšããã§çµãããçµãããªãã£ãåã¯ç¿é±ã«ãŸãããŠããŸãã ããã¯ã1ããŒãç®ã®å匷äŒã§ã®åçã«ãã£ãããé²åºŠãæ©ããçè§£ãããŸãåºæ¥ãªããŸãŸé²ãã§ããŸã£ããããšããæèŠããã£ãããã§ãã ãã®ãããçŸåšã®ããæ¹ã§ã¯ãã¿ããªã§çåç¹ãè§£æ¶ãã€ã€ãæèŠäº€æãããç§ãã¡ã®ããŒã¹ã§é²ããçè§£ã確å®ã«ããŠããããšã倧äºã«ããŠããŸãã ä»åŸããããããš ãããŸã§ã®å匷äŒã¯æè¡æžãèªãã§ããŠãå
容ãè°è«ãããšãã£ã圢åŒã§ããããããå°ãæãåãããããšããæèŠããããŸãã ãªã®ã§ä»åŸã¯ã©ã€ãã³ãŒãã£ã³ã°ãããªããäžèšã®ãããªæ¹æ³ãåãå
¥ããŠã¿ãããšèããŠããŸãïŒ AtCoder ãLeetCodeã®åé¡ãè§£ãã SQL ã®åé¡ãè§£ãã ãªãã¡ã¯ã¿ãªã³ã° ãã¿ããªã§èããŠè°è«ããªãããã£ãŠããã ãŸãšã æè¿ã®å匷äŒã¯ãæ
åœè
ããšã«çºè¡šã®ããæ¹ã®åæ§ãã§ãŠããŠã飜ããé¢çœãã§ãã ãŸããå匷äŒã¯å人ã«ãšã£ãŠãäŒç€Ÿã«ãšã£ãŠãã¡ãªãããå€ããšæããŸããã ãããããå匷äŒãããã«çãäžãããããã«å·¥å€«ããŠãããããšæããŸãã ããã¯ããã°ã§ãè¥æå匷äŒã§ãã£ãå
容ãã©ãã©ãçºä¿¡ããŠãããã°ãããªãšæã£ãŠãããŸãïŒ ææ¥ã®èšäºã®æ
åœã¯ ç§ïŒå·æ¬ïŒã®ã¡ã³ã¿ãŒãããŠããã ããŠãããšã³ãžãã¢ã®å¯ºç°ããã§ãã ã¢ã«ãŽãªãºã ã«ã€ããŠã®èšäºã§ãããæ¥œãã¿ã«ïŒ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã® 5æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãããã³ããšã³ããšã³ãžãã¢ã®Wooã§ãã ãšãã°ã¢ ãžå
¥ç€ŸããŠ3幎ç®ã䞻㫠BUYMA ã®è³Œå
¥è
åŽã®ããŒãžãReactã§æ§ç¯ããŠããŸãã BUYMA ã§ã¯Reactã®ã°ã㌠ãã«ã¹ ããŒã管çã®ããã«äž»ã«Reduxã䜿çšããŠããŸãããä»åã¯æ°ããåçµãšããŠRecoilãå°å
¥ããéçºãè¡ãªã£ãŠã¿ãŸããã®ã§ããã®çµéšãå
±æããããšæããŸãã ãŸãã軜ãRecoilã«ã€ããŠçè§£ããRecoilãå°å
¥ããããã«ãªã£ãçç±ãRecoilã§éçºããæã«è¯ãã£ãç¹ãå°ã£ãããšãä»ã«ãªãªãŒã¹ããéã«å€±æãã話ãæåŸã«ã¯ããããRecoilã®ããè¯ãéçºçµéšã®ããã®æŽçãªã©ããã®èšäºã§ã話ãããããšæããŸãã Recoilã軜ãçè§£ãã Recoilã¯Reactãããžã§ã¯ãã®ããã®æ°å€ãã°ã㌠ãã«ã¹ ããŒã管çã©ã€ãã©ãªã®äžã®äžã€ã§ Facebook ã2020幎5æã«åºããã©ã€ãã©ãªã§ãããªã®ã§ãReactãäœã£ã Facebook ãåºããRecoilã¯ä»ã®ã©ã€ãã©ãªïŒRedux, MobxïŒãšã¯éããReactå°çšãªããReactã«æé©åããããšèšããã©ã€ãã©ãªã§ãã Recoilãå°å
¥ããããã«ãªã£ãçç± 2022幎2æã BUYMA ã§ã¯ ã¹ãã ãŠã§ãã®æ€çŽ¢çµã蟌ã¿ç»é¢ã®äœ¿çšæ§ãé«ããäŒç»ãå§ãŸããŸããã åŸæ¥ã®ç»é¢ã¯ããªãåã«äœããããã®ã ã£ãã®ã§ãç»é¢ã®æ©èœæ¹åã§ã¯ãªããæ°ããæ€çŽ¢çµã蟌ã¿ç»é¢ãéçºããæ¹åã«é²ããããŸããã ç§ã¯æ°ããæ€çŽ¢çµã蟌ã¿ç»é¢ã®ã¹ããŒããã©ãæ§æããã°éçºãããããªãã®ããæ©ã¿ãªããã¹ããŒãèšè𿹿³ãªã©ãæ¢ããŠããŸããã ãããªäžãç§ã¯Recoilã«æ¥ããããã«ãªããŸããã æ°ããäœãæ€çŽ¢çµã蟌ã¿ç»é¢ã¯æ©èœã¯å€ããªãããæäœæ§ã¯åçŽã§è»œãç»é¢ã«ãªãå¿
èŠããããŸããã Recoilã¯ãŠãŒã¶ãŒã®çµãèŸŒã¿æ¡ä»¶ã«ããã倿Žãããæ°å€ãã¹ããŒããæè»ã«æ¡åŒµã»åè§£ããªããéçºãã§ããããšæããŸããã ããã«Reduxã«æ¯ã¹ã³ãŒãã®éãå€ãæžããããšãã§ããå°äººæ°ã§ãã¹ããŒãæããéçºãã§ããããšæããŸããã®ã§ãæ€çŽ¢çµã蟌ã¿ç»é¢éçºã«é©åã ãšå€æãå°å
¥ãé²ããããã«ãªããŸããã Recoilã§éçºããæã®è¯ãã£ãç¹ ãŸããRecoilã¯Reactã®Suspenseãšäžç·ã«åäœããããã«ãã¶ã€ã³ãããŠããŸããã ã³ã³ããŒãã³ã ãSuspenseã§å²ããšéåæåŠçãªã©ã§ãŸã ä¿çäžã®äžäœ ã³ã³ããŒãã³ã ããã£ãããã代æ¿ããUIãã¬ã³ããŒããŠãããŸããã ããã«ãããããŒã¿ãååŸããŠããéã®ããŒããŒè¡šç€ºãå
šäœçã«çµ±äžããããšãã§ããŸããã ãã®ä»ãã¹ããŒãã䜿ãæã«ã©ããªãšã©ãŒãçãããã®å®çŸ©ãç°¡åã§ãããããã¯ErrorBoundaryã§ãã£ããããä»çµã¿ã§ããã ErrorBoundaryã¯ãšã©ãŒããã£ãããããšã©ãŒãèšé²ããã¯ã©ãã·ã¥ãã ã³ã³ããŒãã³ã ããªãŒã®ä»£ããã«ãã©ãŒã«ããã¯çšã®UIã衚瀺ããReact ã³ã³ããŒãã³ã ã§ããã ã°ã㌠ãã«ã¹ ããŒãã®èšå®ãšå®çŸ©ãéåžžã«ç°¡åã§ãã¹ããŒãã®äœ¿çšã¯RecoilãæäŸããHooksãå©çšãã¹ããŒããget/setããããšã ãã§ãããReact Hooksã®ææ³ãšäŒŒãŠããããšã§ãåããŠRecoilãæžããšã³ãžãã¢ã§ãããã«ãªããå©ç¹ããããŸããã ãŸããã°ã㌠ãã«ã¹ ããŒãã䜿çšããããã®ãã€ã©ãŒãã¬ãŒãã®éãéåžžã«å°ãªããå
šäœçã«ã©ãŒãã³ã°ã«ãŒããäœããšããã¡ãªããããããŸããã ãããŠãã¹ããŒãã®å€æŽãå®çŸ©ãé »ç¹ã«è¡ãããŠãæ¢åã³ãŒããšã®åœ±é¿åºŠãäœããããéçºèŠä»¶ã«ããã¹ããŒãã®å€æŽã§ãæè»ã«å¯Ÿå¿ãå¯èœã§ããã propsãæž¡ããªããŠãè¯ãç¹åŸŽã§ã¯ ã³ã³ããŒãã³ã ã® ãªãã¡ã¯ã¿ãªã³ã° ãåå²ãªã©ã容æã§ããã API ã®éåæã®åŠçã§ã¯ãŠããŒã¯ãªã€ã³ããããããæã®ã¿å®è¡ãããããã«ãã£ãã·ã¥ãããåŠçãããããŠãŒã¶ãŒã®åãã¢ã¯ã·ã§ã³ãé²ããªã©ã®å®è£
ãèæ
®ããªããŠããã䟿å©ãããããŸããã Recoilã§éçºãããæã«å°ã£ãçµéš ãŠãŒã¶ã®çµãèŸŒã¿æ¡ä»¶å€æŽã«ããReactã®åŠçã§ã¯ãSuspenseãå©çšããŸããã Suspense㯠API ã®éåæåŠçãåŸ
æ©äžã®äžäœ ã³ã³ããŒãã³ã ã®ä»£ããã«ããŒããŒãã¬ã³ããŒããŠãããŸããããå®éã«åäœã確èªãããšçµãèŸŒã¿æ¡ä»¶å€æŽã®åºŠã«è¡šç€ºãããçã£çœã®ããŒããŒç»é¢ãäžããå°è±¡ã¯æ±ããŠããæäœæ§ã®è»œãç»é¢ãšã¯éãããã«æããããŸããã éåæããŒã¿ã䜿ãæå°éã® ã³ã³ããŒãã³ã ãSuspenseã§å²ã ã³ã³ããŒãã³ã æ§é ãèšèšå¯èœã§ããã°ãå
šç»é¢ããŒããŒã衚瀺ããå¿
èŠã¯ãªããããããŸããã ããããæ€çŽ¢çµã蟌ã¿ç»é¢ã¯ããããŒä»¥å€ã®ãšãããéåæããŒã¿ã«ãã£ãŠã¬ã³ããŒããã ã³ã³ããŒãã³ã ã®ãããåè¿°ã®æ¹æ³ã®èšèšãã§ããŸããã§ããã ããããŠèããæ¹æ³ã¯ãåãªãã¹ãããŒè¡šç€ºã§ã¯ãªããã¹ãããŒãçµã蟌ã¿é
ç®ãšäžç·ã«èŠããæ¹æ³ã§ããã ã¹ãããŒã«çµã蟌ã¿é
ç®ãå«ãSuspenseã«æž¡ãããšã«ãªã£ãã®ã§ããã®ããŒã㌠ã³ã³ããŒãã³ã ã¯è¥å€§åãããŸããããããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ã¯ãããŸããã§ãããå ã³ã³ããŒãã³ã ããšã«ã¹ããŒãã䜿ã£ãŠãããããã§ã ãªãã¡ã¯ã¿ãªã³ã° ã¯JSXéšåã®ç°¡åãªä¿®æ£ã§æžã¿ãŸããã Recoilã§éçºããã³ãŒãããªãªãŒã¹ããéã«å€±æãã話 BUYMA ã®Reactã³ãŒãã¯ãbabelãéããŠES5ã³ãŒãã«å€åœ¢ããåŸãããäžåºŠuglifyãè¡ãéçšãçµãããšã«ãªããŸãã ãã®ES5ã«å€åœ¢ããéçšã§ã¯node_modulesãå«ã¿ãŸããã åé¡ã¯node_modulesã«ããRecoilã©ã€ãã©ãªã OOO _app.jsã®çµåãã¡ã€ã«ã«å«ããŠuglifyããããšããæã«èµ·ããŸããã uglifyã¯ES6ã³ãŒããè§£æã§ãããå§çž®ã«å€±æããŠããŸããã Recoilã©ã€ãã©ãªã¯äž»ã«ES6ã§æžãããŠããã®ãåå ã§ããã ãªãªãŒã¹ã®éçšã§ãã確èªã§ããªããã¡ã€ã«å§çž®ã®å€±æã¯äºæ³ã§ããªãã£ãã®ã§ãã çµå±ãä»ã®ä»£æ¡ãæ¢ããªããã°ãªããŸããã§ããã Recoilã©ã€ãã©ãªãES5ã«å€åœ¢ããæ¹æ³ãªã©èããŠã¿ãŸããããããããããªãæ¹æ³ã ãšãããäžã§ã¯å§åããŠããŸããã è¿å¹Ž BUYMA 㯠IE ããµããŒãããªããªããŸããã®ã§ãçµåã®ãã¡ã€ã«ãES5ã«å€æŽããéçšããªããæ¹æ³ããããŸããããããããã®æ¹æ³ã¯åœ±é¿ç¯å²ãå€ããå°äººæ°ã§è§£æ±ºã§ããªããšèããããŸããã ãããªäžã BUYMA ã¯Reactã©ã€ãã©ãªã CDN ããŒãããæ¹åŒã§éçšãããŠããããšãæãåºããŸããã è¿ããšããã®äžçªç°¡åãªæ¹æ³ãèŠã€ããããé ããšããã®é£ããæ¹æ³ã ããèããŠããŸããã çµå±ãRecoilã® CDN ãå©çšããŠuglifyåé¡ã解決ããæ¹æ³ãæ¡çšããããšã«ãªããŸããã Recoilã®ããè¯ãéçºçµéšã®ããã®æŽç æè¿ã¯ãŸãå¥ã®ç»é¢ã§Recoilã䜿ã£ãŠéçºãããŸããã 2åç®ã®éçºçµéšã§ã¯ã åœå éšåã®ç解床ãé«ãããšRecoilãç¥ããªããšã³ãžãã¢ã§ãã³ãŒããçè§£ãããããããšããèããæã¡ãªããã³ãŒããäœæããŸããã selectorã¯ä»¥äžã®ããã«é¢æ°ã®ååã åœå ããŸããã æå³çã«æŽŸçããã¹ããŒãã®ååã åœå ããããšããŸããã ã³ã³ããŒãã³ã ã§ã¯ãäžèšã®æŽŸçããã¹ããŒãã®ååãç°¡åã«çè§£ã§ããããã«ã³ãŒããäœæããŸããã Recoilã®ãã©ã«ããšãã¡ã€ã«ã®æ§é ã¯ã¹ããŒãã®åäœãæå³ããatomsãšæŽŸçã®ã¹ããŒããä¿®æ£ããŠæ°ããçµæãäœãselectorsã«åé¢ããŠäœ¿çšããããšã䟿å©ã§ããã /api /atoms /components /containers /hooks /selectors Recoilã®éçºã®éã«ã¯Reduxã®éçºã®éãšåæ§ãæå³ããªãã¹ããŒãã®æŽæ°ãªã©ã確èªããå¿
èŠãããã®ã§ãéçºããŒã«ãšã㊠DebugObserver ã¯å¿
é ã ãšæããŸãã Reduxã®DevToolã»ã©åŒ·åãªããŒã«ã§ã¯ãªããšæããŸãããã·ã³ãã«ãªæŽæ°ãã°ã®åœ¢ã§ãã€ã Chrome ã®DevToolsãéããŠéçºããç§ã«ã¯èŠããããŠããããããã£ãã®ã§ãäžäŸ¿ã§ã¯ãããŸããã§ããã çµããã« Recoilã«å¯Ÿããå°ããªçµéšã話ãããšãã§ããŠå¬ããã§ãã ä»åºŠæ©äŒãããã°Recoilã®å€æ§ãªãŠãŒãã£ãªãã£æ©èœã®äœ¿çšçµéšãæŽçããŠã¿ãããšæããŸããã éçºããŒã«ã®äžåšãªã©Reduxãããã¯ãã«ã§ã¯ãªããšæããŸãããReactãã¬ã³ããªãŒãªæžãæ¹ãç°¡åãªéåæåŠçãªã©ãéçºããããRecoilã©ã€ãã©ãªã®é·æãšé
åããã®èšäºã§å°ãã§ãäŒããããŸããããšæããŸãã é¢é£èšäº Recoil: https://recoiljs.org/docs/introduction/installation ã°ã㌠ãã«ã¹ ããŒã¿ã¹ç®¡çã©ã€ãã©ãª Recoil : https://abangpa1ace.tistory.com/212 æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ããšã³ãžãã¢ã®å²¡æ¬ã§ãã BUYMA ã®Webã¢ããªãäœãä»äºãããŠããŸãã ãã®èšäºã¯ Enigmo Advent Calendar 2022 ã®2æ¥ç®ã®èšäºã§ãã åŒç€Ÿã¯10/22ã23ã«éå¬ããã Kaigi on Rails ã«ãŽãŒã«ãã¹ãã³ãµãŒãšããŠåå ããæŽã«ãªã³ã©ã€ã³ããŒã¹ãæäŸããŸããã åœæ¥ã®é°å²æ°ãç¥ãããæ¹ããã³ããããããã¯ã«ã³ãã¡ã¬ã³ã¹ã®ã¹ãã³ãµãŒããããããŒã¹ãæäŸããããšæã£ãŠããäŒæ¥ã®æ¹ã«åèã«ããŠããã ããã幞ãã§ãã åå ãããŸã§ã®æºå äžé·ã®åæãåŸã äŒç€Ÿã® ç¥å床 ã«å¯äžããæ®æ®µäœ¿ã£ãŠãã OSS ã§ãã Ruby ããã³ Ruby on Rails ãžã®è²¢ç®ãããæå³ã§ãåå ããŠã¿ãã®ã¯ã©ãããšããããšã§çžè«ãåæãåŸãŸããã äºç®ã®ç¢ºä¿ã»çšè°ã»ã¹ãã³ãµãŒå¿å ã¹ãã³ãµãŒè²»çšç³è«ã®ããã人çã§åããŠçšè°æžãæžããŸãããç¡äºæ¿èªãããŠå®å µããŸããã ãã®ããšã¯å
¬åŒãµã€ãããã¹ãã³ãµãŒå¿åãè¡ããŸããã ãããŸã§ã§ããã¹ãã³ãµãŒãããŠããäŒæ¥ã®æ
åœè
ã®æ¹ã®èŠåŽãæã«åãããã«åãããŸãããå°éãªããã»ã¹ã®äžã«ããã¯ã€ãã³ãã¯æãç«ã£ãŠããã®ã§ããæè¬ã ããŒã¹ã®æäŸå
容ãèãã å
·äœçã«äœãããã°è¯ããåããããéå»ã®åå èšã調ã¹ãäžã§ã瀟å
ã®éçºçµç¹ããšã³ãžãã¢ã®ããŒãœããªãã£ãç¥ã£ãŠãããæ©äŒã«ãããããšããããšã«ããŸããã 瀟å
ã®ãšã³ãžãã¢ãšäººäºæ
åœè
ã®ååãåŸãŠãããŒã¹ã«åå ããŠããã ããããããããŒããšæéå²ã決ããŸããã åœæ¥å©çšããã¿ã€ã ããŒã㫠㯠Google docs ã§å³èã§äœããŸããã åœæ¥ã®é°å²æ°ãšåç åœæ¥ã®çºè¡šã¯ YouTube ã§å
¬éãããŠããŸããïŒä»¥äžã¯ãã¬ã€ãªã¹ãã«ãªã£ãŠããŸãïŒ www.youtube.com äžæ¹ã®ããŒã¹ããªããªãåå ããŠããåŽãšããŠã¯èŠç¥ãã¬äººã®ãšãããžè¡ãã®ã¯åæ°ãããããšãªã®ã§ãåºç€ã¯ããŒã¹ã«æ¥ãŠããã ãã®ã倧å€ã§ãããããŒã¹ã«æ¥ãŠããã工倫ãšã㊠Twitter /spatial.chatã§ã®åç¥ãããããããŒã¹ã§è©±ããŠããããšã®ããŒããç»é¢ã«æžããŠããŸããã spatial.chatã䜿ã£ãŠããŒã¹éå¶ããŠããæ§å ããã£ãã㚠倧ã㪠Rails ã¢ããªã±ãŒã·ã§ã³ãã©ãéçšããŠãããã«é¢å¿ããã人ã¯äžå®æ°ååšãã話é¡ãšããŠéèŠããã äŒæ©æéã«ããŒã¹ã«ãã人ãå¢ãããçºè¡šæéã«æ¥èšªãã人ã¯å°ãªããçºè¡šã®åéã®äŒæ©æéã20~30åãããããããšãäœåãããã®ã§ããã§ æ¥è§Š ãå³ã ç«¶ããã Ruby ã©ã€ãã©ãªã®HowToãªã©ã©ã€ãã³ãŒãã£ã³ã°çãªããšããã£ãŠããããDB ãã€ã°ã¬ãŒã·ã§ã³ ã®ã¹ã©ã€ããçšæããŠçºè¡šããŠãäŒç€Ÿãããã人ãéãŸã£ãŠãã ããŒã¹ãåºããªããªãã©ã€ã³ã€ãã³ãã§åºãããããæ¥œããã®ã ãããªãšæããŸããïŒçè
ã®äž»èгã«åºã¥ãïŒ ã€ãããããš ãªãã©ã€ã³ã§ã®ã¹ãã³ãµãŒåå ã®æ€èšïŒRubyKaigiãKaigi on Rails ãªã©ïŒ ãšã³ãžãã¢ãªãã§ã¯ã®äŒç»ãçšæããïŒã©ã€ãã³ãŒãã£ã³ã°ã®æ§åãå
¬éããïŒ ããã«ã㣠ã®é
åž çºè¡šã®åéã®äŒæ©æéã20~30åãããããããšãäœåãããã®ã§ããã§ æ¥è§Š ãå³ã ïŒå¿
ããããšã¯èšã£ãŠããªãïŒ æ¥å¹Žã®KoR 2023幎ã®Kaigi on Rails ã¯ãªãã©ã€ã³ã§ãéå¬ãæ€èšãããŠããããã§ãã2020幎ã®éå§ä»¥éãåããŠã®ãªãã©ã€ã³ã§ã®éå¬ãšããããšã§çãäžããããšãæåŸ
ããŠããŸãã 2æ¥éããããšãããããŸããïŒã¯ããŒãžã³ã°ã§åç¥ããŸãããã2023ã¯Tokyoã§ãã€ããªããéå¬ãç®æããŠããŸãð ãã®ã¢ã«ãŠã³ãããã©ããŒããŠç¶å ±ããåŸ
ã¡ãã ããã ãŸããäŒãã§ããã®ã楜ãã¿ã«ããŠããŸããïŒïŒ #kaigionrails — Kaigi on Rails (@kaigionrails) October 22, 2022 æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ããã«ã¡ã¯ãã€ã³ãã©ãšã³ãžã㢠㮠å è€( @kuromitsu_ka )ã§ãã å
æ¥ãèªç€Ÿã®ã¡ãã£ã¢ãµãŒãã¹ïŒ STYLE HAUS ïŒã®ElastiCache for Redisã®EOL察å¿ïŒ2.xâ6.xãžã¢ããã°ã¬ãŒãïŒã宿œããŸããã ç°å¢ã®èª¬æãšä»åãã£ãããšã®æŠèŠ STYLE HAUSã®ç°å¢ã¯ã AWS ã«æ§ç¯ããŠããæ¬çªç°å¢ãšã¹ããŒãžã³ã°ç°å¢ãéçºè
ã®PC端æ«ã«æ§ç¯ããŠãããã¹ãç°å¢ããããŸãã æ€èšŒã®æ®µéã§ãPC端æ«ã«æ§ç¯ããŠãããã¹ãç°å¢(æ®æ®µã¯localã®Redisã䜿çšããŠãã)ãããElastiCacheã«æ¥ç¶ããŠãããŒãžã§ã³ã¢ããã®åäœç¢ºèªãããããä»åãæ¥ç¶çšã®ç°å¢ãæ§ç¯ããŸããã â» ãã¡ãã®èšäºãåèã«ãªããšæããŸãã aws.amazon.com ãã£ããããããš ElastiCacheãšéä¿¡å¯èœãªãµããããã«EC2 ã€ã³ã¹ã¿ã³ã¹ ãäœæ EC2 ã€ã³ã¹ã¿ã³ã¹ ã«ãŠSSM Agentãèµ·å( Amazon Linux2ã ãšããã©ã«ãã§ã€ã³ã¹ããŒã«ãããŠãã) PC端æ«ã§Session Managerãå®è¡ ã€ã³ãã©ã®å³ ã€ã³ãã©æ§æãšIAM EC2 ãµããããïŒElastiCacheãžéä¿¡ã§ãããµããããã«äœæ AMIïŒ Amazon Linux2ãå©çš Amazon Linux2ã§ã¯ãSSM Agentãããã©ã«ãã§ã€ã³ã¹ããŒã«æžã¿ åèïŒ https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-setting-up.html ã€ã³ã¹ã¿ã³ã¹ ã¿ã€ãïŒt2.micro EC2ã® ã€ã³ã¹ã¿ã³ã¹ ãããã¡ã€ã« åèïŒ https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-instance-profile.html åèïŒ https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-restrict-access-quickstart.html å®éã« ã€ã³ã¹ã¿ã³ã¹ ãããã¡ã€ã«ã«ä»äžããããªã·ãŒ { " Version ": " 2012-10-17 ", " Statement ": [ { " Effect ": " Allow ", " Action ": [ " ssm:GetDocument ", " ssm:DescribeDocument ", " ssm:StartSession ", " ssm:TerminateSession " ] , " Resource ": " * " } , { " Effect ": " Allow ", " Action ": [ " ssmmessages:CreateControlChannel ", " ssmmessages:CreateDataChannel ", " ssmmessages:OpenControlChannel ", " ssmmessages:OpenDataChannel " ] , " Resource ": " * " } , { " Effect ": " Allow ", " Action ": [ " ec2messages:AcknowledgeMessage ", " ec2messages:DeleteMessage ", " ec2messages:FailMessage ", " ec2messages:GetEndpoint ", " ec2messages:GetMessages ", " ec2messages:SendReply " ] , " Resource ": " * " } ] } éçºç«¯æ«ã®IAMãŠãŒã¶ãŒ åèïŒ https://aws.amazon.com/jp/about-aws/whats-new/2022/05/aws-systems-manager-support-port-forwarding-remote-hosts-using-session-manager/ å®éã«IAMãŠãŒã¶ãŒã«ä»äžããããªã·ãŒ { " PolicyVersion ": { " Document ": { " Version ": " 2012-10-17 ", " Statement ": [ { " Sid ": " 0 ", " Effect ": " Allow ", " Action ": " ssm:StartSession ", " Resource ": [ " arn:aws:ec2:ap-northeast-1:xxx:instance/<EC2ã€ã³ã¹ã¿ã³ã¹ã®ID> ", " arn:aws:ssm:ap-northeast-1::document/AWS-StartPortForwardingSessionToRemoteHost " ] } ] } , " VersionId ": " v2 ", " IsDefaultVersion ": true , " CreateDate ": " 2022-09-28T06:55:24+00:00 " } } äœæ¥è
端æ«ã®æé äœæ¥è
ã®PC端æ«ã«ã¯ãSession Manager ãã©ã°ã€ã³ ã®ã€ã³ã¹ããŒã«ãšãäžèšã®IAMãŠãŒã¶ãŒã®èšå®ãå¿
èŠã§ããã Session Manager ãã©ã°ã€ã³ ã®ã€ã³ã¹ããŒã«æé åè( Mac çšã®æé )ïŒ https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos åè( Linux çšã®æé )ïŒ https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-linux ã»ãã·ã§ã³ç¢ºç«ã®ã³ãã³ã --targetã¯ãä»åãSSM agentãèµ·åãããŠããEC2ã®id --parameters '{"host": ã§æå®ããElastiCacheã®ãšã³ããã€ã³ãããå¿
èŠãªæ¥ç¶å
ã«å€æããã localPortNumber ã¯ã端æ«ã ä»®æ³ãã·ã³ ã®ç©ºããŠããããŒãã䜿ãã ã»ãã·ã§ã³éå§!! $ aws ssm start - session \ -- target < EC2 ã€ã³ã¹ã¿ã³ã¹ã® ID >" \ -- document - name AWS - StartPortForwardingSessionToRemoteHost \ -- parameters '{"host":["<ElastiCacheã®ãšã³ããã€ã³ã>"], "portNumber":["6379"], "localPortNumber":["16379"]}' \ -- profile < PC 端æ«ã«èšå®ãã IAM ãŠãŒã¶ãŒ> Starting session with SessionId : < IAM ãŠãŒã¶ãŒ>_connection_by_SSM-052ccf2de6652c027 Port 16379 opened for sessionId < IAM ãŠãŒã¶ãŒ>_connection_by_SSM-052ccf2de6652c027. Waiting for connections ... Connection accepted for session telnet åäœç¢ºèª aws ssm start-sessionã®localPortNumberã§æå®ããã localhost ã®ããŒããElastiCacheãšç¹ãã£ãŠããã $ (sleep 1 | echo quit)|telnet localhost 16379 Trying ::1... telnet: connect to address ::1: Connection refused Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. +OK Connection closed by foreign host. ææ³ ä»åã®æ¥ç¶ç°å¢ã®äœææ¹æ³ãç¥ããªãã£ãæã¯ãNginxã§å€æ®µã ããã·ãŒ ãçšæããæ¡ãèããŠããŸããããä»åã®æ§æã¯ãçæéäžã€ç°¡åã«æ§ç¯ã§ããŠããã£ãã§ããæ¬æ¥ã®ç®çã ã£ããEOL察å¿ããåé¡ãªããå®äºã§ããŠããã£ãã§ããð¢ æ ªåŒäŒç€Ÿ ãšãã°ã¢ ãã¹ãŠã®æ±äººäžèЧ hrmos.co
ã¯ããã« RubyKaigiã2019幎以æ¥ã®çŸå°éå¬ãšãªãã2022幎㯠äžéç æŽ¥åžã§è¡ãããŸããã ä»å¹Žã¯çŸå°ãšé
ä¿¡ã®ãã€ããªããéå¬ã§ãããåŒç€Ÿãã2åãçŸå°åå ã4åããªã³ã©ã€ã³ã§åå ããŸããã rubykaigi.org éå»ã®åå èš tech.enigmo.co.jp æ¬ããã°ã«ã¯2017幎ã®èšé²ããæ®ã£ãŠãªãã®ã§ããã2019幎ãŸã§æ¯å¹ŽçŸå°åå ããã¹ãã³ãµãŒãããŠãã幎ããããŸãã ã§ã¯ãçŸå°åå ããã¡ã³ããŒãšãªã³ã©ã€ã³åå ããã¡ã³ããŒãããããæããããšã玹ä»ããŸãã çŸå°åå ç·š ãšã³ãžãã¢ã®æ©éã§ããæ°åãšã³ãžãã¢ãšããŠ4æããenigmoã«å
¥ç€ŸããŠããŸãã 詳ãã㯠ãã¡ãã®å
¥ç€Ÿãšã³ã㪠ãã芧ãã ããã ãªãã©ã€ã³ã§ãããªãããã«ã³ãã¡ã¬ã³ã¹ã¯ãååå ã§ããã®ã§ãšãŠã楜ãã¿ã«ããŠããŸããã åã®çŸå°éå¬åå ãšããç®ç·ã§ã¬ããŒãããŠãããããšæããŸãã å°è±¡ã«æ®ã£ãã»ãã·ã§ã³ Ruby Committers vs The World æ°ã
ã®åèšãæ®ã£ãã»ãã·ã§ã³ãã³ããã¿ãŒã®æ¹ãèªç±ã«è°è«ããŠããŠã¯ã¯ã¯ã¯ããŸããã Ruby ã³ããã¿ãŒã®æ¹ã
ã身è¿ã«æããããŠãšãŠã楜ããã£ãã§ãã Why is building the Ruby environment hard? å
±æã§ããããšã®å€ãçºè¡šã§ããã"ãœãããŠã§ã¢ã¯äœãããªããšå£ãã"ãã£ããèžã«å»ãã§ãããŸãã The Better RuboCop World to enjoy Ruby RuboCopã«èŠãããããªãããã®ææ¡ããšãŠãããæ¡ã ãšæããŸãããæ¥œããRuboCopã䜿ã£ãŠãããã...ïŒ ã¹ã©ã€ãã®æ¿çµµãMidjourneyã䜿ã£ãŠããŠã檻ã«éã蟌ãããã ruby ãå¿ããããŸããã ææ³ æŽ¥é§
ã«éãç«ã£ãã®ã¯äººçåã§ããæŒã飯ãå€é£¯ãã¹ãã³ãµãŒäŒæ¥ã®æ¹ã
ããããã ããé£ã¹ç©ãéããŠäžéã«æ¥ããã ãªããïŒãšäž»ã«é£ã¹ç©ã§å®æãã§ããŸãããç¬ ãŸããäŒå Žã«ã¯ç¡æ Wi-Fi ããããã³ã¡ã³ããã¡ã¢ããšãŠãæããŸãããé§
ãããå°ãè·é¢ããã£ãã®ã§ããã ã·ã£ãã« ãã¹ãåºããŠãã ãã£ãã®ã§ãšãŠã䟿å©ã§ãããã¹ãã³ãµãŒäŒæ¥ã®çæ§ãããããšãããããŸãã 宿æ³ããããã«ã§ã¯ãåè¡è
ã®stevenããããšã³ãžãã¢ãããæ°å?ã®404å·å®€ãåŒãåœãŠãŠããŸããïŒ æçµæ¥ã«ã¯ã転è·ãã©ããã®ããŒã¹ã§404ãã£ã¬ã³ãžãšããã¬ãã£ã¬ãã£ãããŸããããããã¯ã¿ãŒããã«ã®ãã³ããããåœãã£ãã®ã§ãããstevenããã¯ãªããš404ã®ãã³ããããèŠäºåœãŠãŠããŸããã äŒå Žã«ã¯åå°ããéãŸã£ãåå è
ãããããããŠããããªã«ã Ruby ã奜ããªäººãã¡ããããã ãšããããšãæããããšãã§ããŸãããããã«ãã人ãã¡ã¯ã»ãšãã© Ruby ãæžããŠãããšããããšã«æåããŸããã ãŸããäŒæ©æéã«ã¯æ®æ®µãªããªã亀æµãã§ããªãåäžä»£ã®ãšã³ãžãã¢ãšã話ããã§ãããšãŠãææçŸ©ã«éããããšãã§ããŸããã æ®æ®µããŸãè§Šããããšã®ãªãæè¡ã®è©±ãèããŠæ¥œããã£ãã§ãã RubyKaigiéå¶ã®ã¿ãªãããã¹ãã³ãµãŒäŒæ¥ã®æ¹ã
ã Rubyist ã®ã¿ãªãããæ¬åœã«çŽ æŽãããã«ã³ãã¡ã¬ã³ã¹ã«åå ãããŠããã ãããããšãããããŸããïŒ ãªã³ã©ã€ã³åå ç·š æ°å2幎ç®ã®å²¡æ¬ã§ãã䞻㫠BUYMA ã®åºåè
åãæ©èœãéçºããŠããŸãã Ruby ã®ååšãç¥ã£ãŠ5幎ã»ã©çµã¡ãŸãããRubyKaigiã«åå ããã®ã¯ä»åãåããŠã§ãã å°è±¡ã«æ®ã£ãçºè¡š 3æ¥éãåã»ãã·ã§ã³ããããæ¥œããŸããŠããã ããŸãããå人çã«å°è±¡ã«æ®ã£ãŠããã®ã以äžã§ãã Ruby meets WebAssembly 1 Building a Lightweight IR and Backend for YJIT 2 ruby /debug - The best investment for your productivity 3 String Meets Encoding 4 Wasm察å¿ã«ã€ããŠã Webãã©ãŠã¶ ã§ Ruby ãåãããšã«æåããŸããã irb ããã©ãŠã¶ã§åããŠãã⊠irb-wasm.vercel.app ãã¢ã®ç޹ä»ã¯æå¿«ã§ãèŽè¡ãåŒãã€ããäžã§å
éšã®å®è£
ã®è§£èª¬ããããŠããŠçŽ æŽããããšæããŸããã Ruby ãWebAssemblyã«å€æããäžã§å€§ãã3ã€ã®éå£ 5 ãããããããAsyncifyãšããéåæåŠçãå®çŸãã ã¢ã«ãŽãªãºã ã«ãã£ãŠåé¡ã解決ããŠãããšã®ããšã§ããã ãŸã Cookpad ãããæäŸãããŠãã Cookpad Code Puzzle for RubyKaigi 2022 ã«ãWasmãåãå
¥ããããŠããããã§ããç§ã¯ãããæžããŠããæç¹ã§func20ãŸã§è§£ããŠããªãã®ã§ããâŠè§£ãããšæ¥œããã§ãã ruby-puzzles-2022.cookpad.tech String Meets Encoding ã®çºè¡šã«ã€ããŠãæ¥åã§ CP932 ãæ±ã£ããããã¹ãã ãšã³ã³ãŒã ããå Žé¢ã«ããåºãããã®ã§çºè¡šã楜ãã¿ã«ããŠããŸãããstackprofãperfãlldbãçšã㊠Ruby ã§ã®string encodingåŠçã§ ããã«ãã㯠ã«ãªã£ãŠããç®æãæ¢çŽ¢ããŠãã課çšãå£éèŠããŠå€§å€å匷ã«ãªããŸãããæçµçã«PRãäœæãããŠããŸãã 6 YJITã ruby /debugã¯äœ¿ã£ãããšããªãã£ãã®ã§ãããã»ãã·ã§ã³ãèããŠé¢çœããšæã£ãã®ã§ã¢ããªã±ãŒã·ã§ã³ã«å°å
¥ããŠã¿ãããšæã£ãŠããŸãã åå ããææ³ 1. Ruby ã®éçºã®ç¬¬äžç·ã«ç«ã€ãšã³ãžãã¢ã®è©±ãèãã®ã¯åºæ¿ã«ãªã Ruby ã ãã§ãªãæ®æ®µäœ¿ã£ãŠããåçš®gemã®äœè
ã»ã³ããã¿ãŒã®æ¹ã®çºè¡šããªã³ã¿ã€ã ã§èŽããšã¯ã¯ã¯ã¯ããŸããããŸãkateiããã®ãããªæèœããµããæ¹ãèŠããšèªåãé 匵ããªããšãããªããšæããŸããã 2.ãªã³ã©ã€ã³ã ãšèœã¡çããŠã¡ã¢ããšãããã èªå®
ããã®åå ãšããããšã§ãå€éšããŒããŒããšã¢ãã¿ãŒã«æ¥ç¶ããç¶æ
ã§çºè¡šãèŠèŽããŠããŸããã2ç»é¢ä»¥äžã®ç°å¢ã§çºè¡šãèããªããæ€çŽ¢ãããã GitHub ã®issue/PRãé²èЧã§ããã®ã§æ
å ±ã®æåå¹çã¯é«ãã£ããšæããŠããŸããïŒåäººã®ææ³ïŒ 3.ãã€ããªããéå¬ã¯å€§å€ é
ä¿¡ãã©ãã«ã«ãã2æ¥ç®ã®çºè¡šãäžéšèããªãã£ãã®ã§ãããã¹ã¿ããã®çæ§ã®å€å€§ãªãå°œåã®ãããã§åã»ãã·ã§ã³ã楜ããããšãã§ããŸããããã®å ŽããåãããŠã瀌ãç³ãäžããŸãã 4.ã³ã³ãã¥ãŒã¿äœããããã Alan Wuããã®YJITã«é¢ããã»ãã·ã§ã³ã«ãããŠãããã¯ãšã³ã/ããã³ããšã³ããšãã話é¡ãäžãããŸããããWebã¢ããªã±ãŒã·ã§ã³ã§ã¯ãªãCPU ã¢ãŒããã¯ã㣠ã«ãããããã§ãããCPUã®åºæ¬åäœã«ãããŠããã§ãããããã³ãŒããããã³ããšã³ããåœä»€å®è¡ãããã¯ãšã³ããšèšããããã§ããç¥ãããã£ã⊠æåŸã« 2023幎ã®RubyKaigiã¯é·éç æŸæ¬åž ã§éå¬ãããäºå®ã§ãã2020幎ã«çŸå°éå¬ãããã¯ãã ã£ãæŸïŒMatzïŒæ¬ã®å°ã§ Rubyist ã®çãããšãäŒãã§ããããšã楜ãã¿ã«ããŠããŸãïŒä¿¡å·ãã°ãã£ã±ãé£ã¹ãŸãããïŒ ãç¥ãã åŒç€Ÿ ãšãã°ã¢ ã¯2022幎10æ21æ¥ã22æ¥ã«éå¬ãããKaigi on Rails 2022ã«ãŽãŒã«ãã¹ãã³ãµãŒãšããŠåå ããŸãïŒ åœæ¥ã¯ãªã³ã©ã€ã³ããŒã¹ãèšçœ®ããŸããEMã»ãã ã¯ãªãŒã ãªã©ãåå äºå®ã§ãã æµ·å€ãã¡ãã·ã§ã³ECã BUYMA ãã®éçºäºæ
ã«ã€ããŠã»åœæ¥ã®çºè¡šã«ã€ããŠãªã©ããã£ãã°ããã«ã話ãã§ããã°ãšæããŸãã kaigionrails.org æ¡çšæ
å ±ã¯ãã¡ã hrmos.co https://speakerdeck.com/kateinoigakukun/ruby-meets-webassembly ↩ https://github.com/ruby/ruby/pull/5826 ↩ https://github.com/ruby/debug ↩ https://speakerdeck.com/ima1zumi/string-meets-encoding ↩ setjmp/longjmpã«äŸåããŠããCRubyã®äŸå€æ©æ§ã»Fiberã®context switchã»ä¿å®ç GC ↩ https://github.com/ruby/ruby/pull/6351 ↩