株匏䌚瀟゚ニグモのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟゚ニグモ

株匏䌚瀟゚ニグモ の技術ブログ

å…š252ä»¶

こんにちは、むンフラ゚ンゞニアの 高山 です。 この蚘事は 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 ↩