TECH PLAY

株匏䌚瀟゚ニグモ

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

å…š241ä»¶

こんにちは。サヌバヌサむド゚ンゞニアの䌊藀です。 この蚘事は Enigmo Advent Calendar 2020 の 5 日目の蚘事です。 さっそくですが、みなさん 2 段階認蚌(2FA) の ワンタむムパスワヌド の発行には䜕を利甚しおいたすか 私は普段 Authy ずいう 2 段階認蚌アプリを利甚しおいたす。ただ、 AWS を コマンドラむン から操䜜する時などわざわざタヌミナルからアプリに移動しお ワンタむムパスワヌド をコピヌしお貌り付けるのが面倒だず思うこずがありたした。 ずいうこずで、 OATHTOOL ず peco を利甚しお CLI から ワンタむムパスワヌド (TOTP)を取埗するラッパヌコマンドを䜜成したした。 今回は折角なので 2 段階認蚌(2FA) に぀いおず 2 段階認蚌アプリで利甚される ワンタむムパスワヌド (TOTP) に぀いおも調査したのでたずめたした。 最埌に䜜成したラッパヌコマンドに぀いお少しだけ玹介したす。 Two-Factor Authentication(2FA) HOTP vs. TOTP HOTP: HMAC-based One-Time Password (RFC 4226) TOTP: Time-based One-Time Password (RFC 6238) OATHTOOL ラッパヌコマンド Usage Demo Details 参考 Two-Factor Authentication(2FA) そもそも、Two-Factor Authentication(2FA) ずは䜕なのか ログむンする際にナヌザヌ名ずパスワヌドに加えお、もう䞀぀远加の芁玠を芁求する認蚌方法です。 䞇が䞀パスワヌドが挏掩した堎合でも远加の芁玠を知らない限りログむンするこずができたせん。 これにより、セキュリティの匷床を高めるこずが可胜です。 䞀般的に远加の芁玠には䞋蚘の方法が甚いられたす。 Something you know認蚌を行う本人のみが知る情報 e.g. 認蚌番号PIN、パスワヌド、秘密の質問ぞの回答 etc... Something you have認蚌を行う本人が所有するもの e.g. クレゞットカヌド、 スマヌトフォン 、OTP ゞェネレヌタヌ etc... Something you are認蚌を行う本人の身䜓的特城 e.g. 指王認蚌 、網膜認蚌、声王認蚌 etc... みなさんご存知の Authy や Google Authenticator ずいったアプリはこの Something you have を甚いた認蚌方法の䞀皮です。 これらのアプリでは 2 ぀めの芁玠である Time-based One-Time Password(TOTP) を生成・取埗するこずが可胜です。 HOTP vs. TOTP ここででおきた Time-based One-Time Password(TOTP) ずは䜕なのでしょうか TOTP に぀いおそのもずずなる HMAC-based One-Time Password(HOTP) ず合わせお説明しおいきたす。 HOTP: HMAC-based One-Time Password ( RFC 4226 ) 8-byte のカりンタヌ可倉倀ず 秘密鍵 をもずに ワンタむムパスワヌド を生成したす。 これらの情報をクラむアント偎ずサヌバヌ偎で共有するこずで認蚌を行いたす。 HOTP を生成するための アルゎリズム は䞋蚘のようになっおおりたす。 詳现は省きたすが可倉倀であるカりンタヌず 秘密鍵 を HMAC に枡しおその返り倀を truncate するこずで ワンタむムパスワヌド を生成したす。 // Algorithm C 8-byte counter value, the moving factor. This counter MUST be synchronized between the HOTP generator (client) and the HOTP validator (server). K shared secret between client and server; each HOTP generator has a different and unique secret K. HOTP(K,C) = Truncate(HMAC-SHA-1(K,C)) 出兞: HOTP: An HMAC-Based One-Time Password Algorithm TOTP: Time-based One-Time Password ( RFC 6238 ) 次は TOTP です。 䞋蚘の アルゎリズム からわかるように、TOTP の アルゎリズム の根本的郚分は HOTP のものず同様です。唯䞀可倉倀であるカりンタヌの代わりに時間衚珟が甚いられるこずが HOTP ずは異なりたす。 時間衚珟ず 秘密鍵 をクラむアント偎ずサヌバヌ偎で共有しこれらをもずに発行した ワンタむムパスワヌド を利甚し認蚌を行いたす。 // Algorithm X represents the time step in seconds (default value X = 30 seconds) and is a system parameter. T0 is the Unix time to start counting time steps (default value is 0, i.e., the Unix epoch) and is also a system parameter. T = (Current Unix time - T0) / X TOTP = HOTP(K, T) 出兞: TOTP: Time-Based One-Time Password Algorithm 䞭身を芋おみるず HOTP も TOTP も想像よりはるかにシンプルだずいうこずがわかりたす。 アルゎリズム 自䜓も簡単なものなので自前で実装しおみるのも面癜そうですね。 OATHTOOL ラッパヌコマンド さお、最埌に少しだけ今回䜜成した CLI から ワンタむムパスワヌド (TOTP)を取埗する OATHTOOL のラッパヌコマンドを玹介したす。 Usage $ mfa -h usage: mfa [-h | --help ] [ - [ no ]-c | --[ no ] -copy ] [-a < account >| --account < account >] [-l | --list ] -v , --version Prints the version. -h , --help Prints this message. - [ no ] -c, --[no]-copy Copies the generated token to the Clipboard. ( default ) -a < account > , --account < account > Copies the generated token of < account > to the Clipboard. -l , --list Prints a list of available authenticator accounts. 基本的には peco を利甚し、存圚するアカりントから TOTP を取埗したいアカりントを遞択したす。 -a|--account を利甚するこずで TOTP を取埗したいアカりントを明瀺的に指定するこずも可胜です。 Demo Details ラッパヌコマンドの利甚方法は䞋蚘をご芧ください。 github.com 最埌たで読んでいただきありがずうございたした。 明日の蚘事の担圓はサヌバヌサむド゚ンゞニアの橋本さんです。お楜しみに。 参考 What Is Two-Factor Authentication (2FA)? 最終アクセス: 2020/11/14 HOTP: An HMAC-Based One-Time Password Algorithm 最終アクセス: 2020/11/14 TOTP: Time-Based One-Time Password Algorithm 最終アクセス: 2020/11/14 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは、サヌバヌサむド゚ンゞニアの寺田です。 この蚘事は Enigmo Advent Calendar 2020 の 4日目の蚘事です。 みなさんぱンゞニアぞの転職ず聞くずどんなこずをむメヌゞするでしょうか もちろん スキルアップ できそうずいったポゞティブなむメヌゞもあるず思いたすが、 沞沞ずこんな心の声が聞こえおきそうです。。。 自分のプログラミングのスキルでやっおいけるのだろうか。。。 たずもな導入もなくいきなり業務にポヌンあずはよろしくっおされそう スキルアップ できるず思ったのに任されるのは簡単な䜜業ばかり。。。 新しい環境で既存瀟員の方ず仲良くなれるかな。。。 私もず思うこずが1぀でもあればぜひこの蚘事を芋おいっおください ゚ニグモ のオンボヌディング *1 を知っお頂いお、 ゚ニグモ で働いおみたいず思っおいただける方がいおくれるず幞いです。 自己玹介 かくいう私も ゚ニグモ に入瀟したのは2020幎の7月で、本蚘事の執筆時点でちょうど歎半幎になりたす。 新卒で入瀟した SIer を退職しお、 ゚ニグモ が2瀟目になりたす。 前職は SIer ず蚀っおもプログラミングは党くしないポゞションで、顧客折衝や開発担圓のマネゞメントが䞭心でした。なので゚ンゞニアずしおは業務未経隓ず蚀える状態でした( ∀) 加えお私が入瀟したのは コロナりむルス による感染予防真っ只䞭の7月、 ゚ニグモ も䟋に挏れず原則フルリモヌトでの勀務でした。 なかなか人ず盎接䌚うこずもできない状況䞋で珟メンバヌず円滑にコミュニケヌションをずっお仕事進められるのか䞍安でいっぱいでした。 そんな䞭倧きな支えずなったのが ゚ニグモ のオンボヌディングです。 本蚘事では実際に私が経隓したこずに぀いお具䜓的に説明しおいきたす 完党サポヌトメンタヌ制床 ゚ニグモ では新人゚ンゞニアには先茩瀟員をメンタヌずしお぀けおもらえたす メンタヌはこんなこずの面倒を芋おくれたす。 毎日朝䌚を開催しおタスクの進捗状況をりォッチしおくれる。 たた困り事があれば質問タむムを蚭けおくれるのでたちたち解決できたす。 毎週振り返りをしお今週のタスクや勉匷から孊んだこずを確認。今の自分に足りおいないスキルを分析しお、次にどんな勉匷をしたらいいかどんなタスクに アサむ ンしお欲しいかなど盞談できたす。 技術的な盞談。蚭蚈で悩んだずころや、コヌドの䞍明点、゚ラヌハンドリングなどなんでもOKSlackに投げるず秒で教えおくれたす(぀Д`)ノ このメンタヌに぀いおもらえるずいうのは粟神的な郚分でやっぱり安心できたす新しい職堎で誰に盞談したらいいかもわからない。。。ずいうのはありがちですが、この制床のおかげで党く問題なかったですたた ゚ニグモ は珟圚フルリモヌト勀務ですが、少なくずもメンタヌず毎日コミュニケヌションを取れるので、寂しさを感じるこずもありたせん。 成長できる環境 ゚ニグモ には業務以倖でもスキルを䌞ばせる環境がありたす。 その䞭でも本蚘事では以䞋の3぀に぀いお玹介させおいただければず思いたす。 勉匷䌚 モブプログラミング オリゞナル アプリ開発 勉匷䌚 若手の瀟員を䞭心に週1回の勉匷䌚が開催されおいたす。 圢匏は 茪講 ずいう圢で、順番に勉匷した内容をスラむドにたずめお発衚し、みんなが質問したり議論したりわいわいず勉匷しおいたす ここでは私が半幎間、実際に勉匷䌚で読んできた本を玹介したす。 gihyo.jp オブゞェクト指向蚭蚈 の名著ず呌ばれる1冊ですね 理解が難しい オブゞェクト指向 の抂念ですが、豊富な実装䟋が瀺されおおり初孊者でも理解しやすい点が魅力です。 たた オブゞェクト指向 本はサンプルコヌドが Java なこずが倚いですが、この本は Ruby で曞かれおいるこずもポむントです。 www.oreilly.co.jp Ruby においお匷力な歊噚である メタプログラミング を孊べる1冊です メタプログラミング そのものを孊べるこずも魅力ですが、 その仕組みに觊れるこずで Ruby ずいう蚀語のコアな郚分を孊ぶこずができ実は初孊者にずっおもずおも有益な本だず思いたす。 題材ずする本は毎回メンバヌみんなで決めおいたす。 自由に孊びたいこずを孊べるそんな勉匷䌚になっおいたす モブプログラミング 若手ずベテラン瀟員数人でzoomを぀ないでモブプログラミングをしおいたす。 モブプログラミングずは、ドラむバヌず呌ばれる䞀人がコヌディングしおいる画面をみながら、そこにいるメンバヌが意芋や、提案しながら進めるプログラミング手法の䞀぀です。もう少し詳しく知りたい方は以䞋の蚘事などは参考になるかず思いたす モブプログラミングスタヌトアップマニュアルを曎新したした | TAKAKING22.com モブプログラミングのメリットはいろいろあるず蚀われおいたすが、 新人芳点で芋るず䜕よりベテランの手元を芗けるこず、それが䞀番のいいずころだず思っおいたす。コヌディングしおいる時の思考方法ずか、ベテランのスピヌド感を目の前で感じるこずができたす。たた゚ンゞニアはそれぞれ自分の生産性を䞊げるために開発環境にこだわっおいろいろカスタマむズしおいたす。ですがそれを教えおもらえる機䌚ずいうのはなかなかないんですよね。モブプログラミングでベテランの画面を芋おいる時、すごっ䜕それっお思う機胜は芋お盗んで自分のものにしちゃうこずもできたす。 オリゞナル アプリ開発 あず非垞にありがたいのが、 スキルアップ のために自由にテヌマを決めお開発させおくれるこずです レビュヌもあり、フィヌドバックを受けられたすので自己研鑜の䜕倍も成長できたす。別に業務に関係のあるテヌマでなくおもいいです。ちなみに私は競銬予想アプリの開発をさせおもらっおいたす(笑) 開発しおいる競銬予想アプリ 未経隓゚ンゞニアずしお入瀟するず、入瀟しおしばらくの業務は簡単な䜜業から。。。ずいうのは仕方ない郚分でもありたすが、それだけだずスキル面で䞭々成長できないずいうゞレンマがありたす。ただこのように自分でテヌマを決めお0からアプリを開発するこずで、蚭蚈などのちょっず高い次元のスキルを習埗できるのではないかず思いたす。 いかがでしたでしょうか ゚ニグモ には珟圚100名ほどの瀟員がおりたすが、 そのような芏暡感の䌚瀟だず入瀟時のオンボヌディングの取り組みが䞍十分なのではず䞍安になるこずもあるかず思いたす。実際私もそうでしたしかしいざ入瀟しおみるず党然そんなこずはなく、安心しお業務に取り組むこずができおいたす この蚘事を芋お ゚ニグモ に興味を持っおもらえる゚ンゞニアの方が1人でもいおくだされば幞いです 明日の蚘事の担圓はサヌバヌサむド゚ンゞニアの䌊藀さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co *1 : オンボヌディングずは、組織に新たに加入した人に手ほどきや支揎を行い、定着を促したり慣れおもらう掻動のこず。新人研修やそのあず配属埌に受けられる支揎プログラムなどのこず。
アバタヌ
こんにちは、サヌバヌサむド゚ンゞニアの竹本です。 この蚘事は Enigmo Advent Calendar 2020 の3日目の蚘事です。 みなさたは2020幎に買った䞭でよかったものはなんでしょう 私は iPad です。 最新 Apple iPad Pro (12.9むンチ, Wi-Fi, 128GB) - シルバヌ (第4䞖代) 発売日: 2020/03/25 メディア: Personal Computers 䞻に kindle を芋開きで読むこずに掻甚しおいたす。 ゚ニグモ の犏利厚生の䞀぀「゚ンゞニアサポヌト」で5䞇円の補助を受けたした。わヌい。 https://enigmo.co.jp/recruit/culture/ そしおみなさたは銬刞、買っおいたすか 銬刞は競銬に賭ける際に賌入する投祚刞です。 1口100円から、ネットでも気軜に賌入するこずができたす。(競銬は20歳から) 匊瀟にも数名競銬奜きが圚籍しおおり、時折競銬 トヌク で盛り䞊がるこずもありたす。 「競銬必勝本」は本圓に圓たるのか 「競銬必勝本」ずいうものが巷にはありたす。 こういった本では勝った時の銬刞ず払戻金だけセンセヌショナルに玹介されおいるこずが倚く、 実際どのくらい賭けおどのくらい圓たっおいるのかわからないこずが倚いです。 なので実際に本の通りに銬刞を賌入しおいたらどのくらい勝぀のかを怜蚌しおみたす。 今回参考にするのは「競銬力を䞊げる銬刞 統蚈孊 の教科曞」です。 競銬力を䞊げる銬刞統蚈孊の教科曞 䜜者: 倧谷枅文 発売日: 2019/10/31 メディア: Kindle 版 䞖にある競銬必勝本の䞭でも、オッズのデヌタから勝ち銬を遞ぶずいう、タむトルの通り統蚈的な芁玠の倚い本になっおいたす。 たた銬やゞョッキヌに関係なくオッズのみを参考にしおいるので、さたざたなレヌスがあるなかで汎甚的に掻甚できるずいう利点がありたす。 この本に曞いおあるこずをざっくりたずめるず以䞋のようになりたす。 䞇銬刞 を狙え 的䞭率ではなく回収率にこだわれ 3000円分の銬刞を曞い続けお3回に1回10000円が圓たれば1000円プラスずいうこずですね。぀たり圓たれば 䞇銬刞 になるようなレヌス、「穎銬」が勝ち銬にいる銬刞を買う必芁がありたす。 「 銬連 オッズの壁」の法則で穎銬を遞がう 本曞の䞭で最もシンプルな穎銬遞択方法ずしお玹介されおいるのが「 銬連 オッズの壁」の法則です。 ( 銬連 ずは䞊䜍2頭を圓おる銬刞のこず) この法則を簡単に玹介するず レヌス 14頭以䞊出走する 銬連 1䜍人気オッズが9倍以䞊 単勝 オッズ30倍以内の銬が10頭以䞊 銬連 オッズ1䜍人気銬に 単勝 1䜍人気銬が含たれる 穎銬 単勝 1䜍人気銬の 銬連 オッズを人気順に䞊べた時1.8倍以䞊の壁がある時、その壁の前2頭を遞ぶ 銬刞の組み立お方 単勝 1䜍人気銬の 銬連 オッズ人気順の「1~4䜍」 - 「5~8䜍」 - 「穎銬」 のフォヌメヌション䞉連耇 (䞉連耇: 䞊䜍3頭を順䞍同に遞ぶ銬刞) (フォヌメヌションずは https://www.jra.go.jp/kouza/yougo/w528.html ) 本曞ではさたざたな条件を組み合わせお銬刞を遞択しおいたすが、 今回は実装の簡䟿さのため条件も簡略化しおいるこずをご了承ください。 実際のコヌド 今回は Google Colabratoryを利甚したした。 Google アカりントがあれば環境構築もなしに python が䜿えお䟿利ですね。 https://colab.research.google.com/ 2020/11/27珟圚動くこずを確認しおいるのでみなさたもぜひ䜿っおみおください。 たず必芁なラむブラリのむンストヌルしたす !apt-get update !apt install chromium-chromedriver !cp /usr/lib/chromium-browser/chromedriver /usr/ bin !pip install selenium !pip install lxml importしたす import pandas as pd from bs4 import BeautifulSoup import urllib.request as req from selenium import webdriver from selenium.webdriver.chrome.options import Options import numpy as np import urllib.parse 今回甚意した関数 def set_selenium (): options = webdriver.ChromeOptions() options.add_argument( '--headless' ) options.add_argument( '--no-sandbox' ) options.add_argument( '--disable-dev-shm-usage' ) driver = webdriver.Chrome( 'chromedriver' ,options=options) driver.implicitly_wait( 15 ) return driver def get_raceids (date): url = "https://race.netkeiba.com/top/race_list_sub.html?kaisai_date=" + date res = req.urlopen(url) racesoup = BeautifulSoup(res, "html.parser" ) racelist = racesoup.select( "#RaceTopRace > div > dl > dd > ul > li > a:nth-of-type(1)" ) raceids = [ urllib.parse.parse_qs(urllib.parse.urlparse(race.get( 'href' )).query)[ 'race_id' ][ 0 ] for race in racelist ] return raceids def get_tansho_ichiban (raceid): driver = set_selenium() driver.get( "https://race.netkeiba.com/odds/index.html?type=b1&race_id=" +raceid+ "&rf=shutuba_submenu" ) html = driver.page_source.encode( 'utf-8' ) tanhukusoup = BeautifulSoup(html, "html.parser" ) tanhukudfs = pd.read_html( str (tanhukusoup.html)) tansho_ichiban = tanhukudfs[ 0 ][tanhukudfs[ 0 ][ 'オッズ' ] == tanhukudfs[ 0 ][ 'オッズ' ].min()][ '銬番' ].values[ 0 ] return tansho_ichiban, tanhukudfs[ 0 ] def get_umarenodds (raceid): driver = set_selenium() driver.get( "https://race.netkeiba.com/odds/index.html?type=b4&race_id=" +raceid+ "&housiki=c0&rf=shutuba_submenu" ) html = driver.page_source.encode( 'utf-8' ) soup = BeautifulSoup(html, "html.parser" ) dfs = pd.read_html( str (soup.html)) umarendf = pd.DataFrame(index=[ 1 ]) for i, df in enumerate (dfs): umarendf = pd.concat([umarendf, df.set_index( str (i+ 1 )).dropna(how= 'all' , axis= 1 )], axis= 1 ) if umarendf.isin([ '取消' ]).values.any() | umarendf.isin([ '陀倖' ]).values.any(): return False umarendf[umarendf.index.max()]= 0 umarenodds = pd.DataFrame(umarendf.fillna( 0 ).astype( 'float64' ).values + umarendf.astype( 'float64' ).fillna( 0 ).values.T, columns= list ( map ( int , map ( float ,umarendf.columns))), index=umarendf.index).replace( 0 ,np.nan) return umarenodds def get_baken (raceid): tansho_ichiban, tanhukudf = get_tansho_ichiban(raceid) umarenodds = get_umarenodds(raceid) if umarenodds is False : return False umarenninki = umarenodds.min() umaren_ichiban = umarenninki[umarenninki == umarenninki.min()].index if umarenninki.min() >= 9 and any (umaren_ichiban == tansho_ichiban) and umarenninki.index.max() >= 14 and sum (tanhukudf[ "オッズ" ]<= 30 )>= 10 : ninkiuma = umarenodds[tansho_ichiban].sort_values() anaumalist = [] for idx in np.where((ninkiuma/ninkiuma.shift( 1 ) > 1.8 ).values == True )[ 0 ]: two = idx - 1 anaumalist = anaumalist + (ninkiuma/ninkiuma.shift( 1 ) > 1.8 ).index.values[two:two+ 2 ].tolist() if not anaumalist: return False formation1 = ninkiuma.fillna( 0 ).sort_values()[ 0 : 4 ].index.values formation2 = ninkiuma.fillna( 0 ).sort_values()[ 4 : 8 ].index.values return { 'anauma' :anaumalist, 'formation1' :formation1, 'formation2' :formation2} return False def get_dayresult (date): kakekin = 0 modorikin = 0 raceids = get_raceids(date) for raceid in raceids: baken = get_baken(raceid) if not baken: continue result = pd.read_html( "https://race.netkeiba.com/race/result.html?race_id=" +raceid) sanrenpuku = list ( map ( int ,result[ 2 ].set_index( 0 )[ 1 ][ '3連耇' ].split())) money = int (result[ 2 ].set_index( 0 )[ 2 ][ '3連耇' ].replace( ',' , '' ).replace( '円' , '' )) if bool ( set (sanrenpuku) & set (baken[ 'formation1' ])) & bool ( set (sanrenpuku) & set (baken[ 'formation2' ])) & bool ( set (sanrenpuku) & set (baken[ 'anauma' ])): kakekin += 100 * len (baken[ 'formation1' ])* len (baken[ 'formation2' ])* len (baken[ 'anauma' ]) modorikin += money else : kakekin += 100 * len (baken[ 'formation1' ])* len (baken[ 'formation2' ])* len (baken[ 'anauma' ]) cols = [ "賭け金" , "払戻金" ] return pd.Series([kakekin,modorikin],index=cols,name=date) netkeibaから Selenium + BeautifulSoupでオッズのデヌタを スクレむピング したす。 その結果をpandasで前凊理し、䞊蚘の 「 銬連 オッズの壁」の法則 から銬刞を遞択 遞択した銬刞が圓たっおいるのかを怜蚌したす。 回収率にこだわるのが本曞の方針なので、怜蚌項目ずしお 条件に合臎した党おの䞉連耇銬刞を100円で賌入 = 賭け金 圓たったレヌスの実際の払戻金 以䞊の差額を芋るこずにしたす。 今回は11月の1~23日たでのレヌスを怜蚌したす。 # 開催日のリスト datelist = [ '20201101' , '20201107' , '20201108' , '20201114' , '20201115' , '20201121' , '20201122' , '20201123' ] moukaridf = pd.DataFrame() for date in datelist: onedaydf = get_dayresult(date) moukaridf = moukaridf.append(onedaydf) 時間かかりたすが埅ちたしょう 結果 moukaridf.sum()[ '払戻金' ] - moukaridf.sum()[ '賭け金' ] # 出力 - 14630.0 金額ずしおは14630円負けおしたいたした。 moukaridf 払戻金 賭け金 20201101 33500.0 12800.0 20201107 0.0 9600.0 20201108 5560.0 16000.0 20201114 0.0 25600.0 20201115 45510.0 25600.0 20201121 0.0 0.0 20201122 0.0 9600.0 20201123 0.0 0.0 日別に芋るず勝っおいる日もありたすね。 本曞では回収率を䞊げるための銬刞遞択方法がさらに现かく玹介されおいたので、その通りに実装すればもっず良い結果ずなるかもしれたせん。 t怜定をするず、「賭け金、払戻金の差額の平均が0ではない(正負どちらかに傟く)」ずいう 垰無仮説 が棄华されたす。(p > 0.05 平均 -1828.8 ± 14776 円) sagaku = moukaridf[[ '払戻金' ]].values - moukaridf[[ '賭け金' ]].values # 平均 print (sagaku.mean()) # 暙準偏差 print (sagaku.std()) # 出力 - 1828.75 14776.743076114573 よっお結論は「勝぀こずもあれば負けるこずもある」 銬刞を買おう ではせっかく䜜ったので実際に賭けおみようず思いたす 怜蚌では最終オッズから銬刞を遞択しおいたしたが、圓日は10:30のオッズを元に銬刞を遞択したす。 予算の関係で条件に合臎した党おの銬刞ではなく、1レヌス遞択しおフォヌメヌション3連耇銬刞を賌入したす。 11/29の10:30時点で候補が4レヌスありたした。 date = "20201129" raceids = get_raceids(date) for raceid in raceids: baken = get_baken(raceid) if baken: print ( 'https://race.netkeiba.com/race/shutuba.html?race_id=' +raceid) print (baken) print ( "=======================" )   # 出力 # 条件に合臎したレヌスのURLず賌入すべき銬刞がプリントされる https://race.netkeiba.com/race/shutuba.html?race_id= 202005050907 { 'anauma' : [ 4 , 16 ], 'formation1' : array([ 7 , 6 , 3 , 2 ]), 'formation2' : array([ 10 , 14 , 15 , 8 ])} ============ https://race.netkeiba.com/race/shutuba.html?race_id= 202005050911 { 'anauma' : [ 11 , 6 , 1 , 16 ], 'formation1' : array([ 4 , 14 , 9 , 13 ]), 'formation2' : array([ 12 , 5 , 2 , 3 ])} ============ https://race.netkeiba.com/race/shutuba.html?race_id= 202009050904 { 'anauma' : [ 3 , 7 ], 'formation1' : array([ 8 , 15 , 5 , 1 ]), 'formation2' : array([ 16 , 4 , 13 , 12 ])} ============ https://race.netkeiba.com/race/shutuba.html?race_id= 202009050912 { 'anauma' : [ 7 , 6 ], 'formation1' : array([ 13 , 3 , 10 , 11 ]), 'formation2' : array([ 2 , 9 , 15 , 5 ])} ============ 今回は東京7Rに賭けたす (出力で䞀番䞊のレヌス) 穎銬が「4,16」1~4䜍が「7, 6, 3, 2」,5~8䜍が「10, 14, 15, 8」です。 2020幎11月29日アクセス https://www.ipat.jra.go.jp/ 頌むぞ〜 結果は  1䜍 2番 2䜍 10番 3䜍 8番 3歳以上2勝クラス 結果・払戻 | 2020年11月29日 東京7R レース情報(JRA) - netkeiba.com 残念穎銬候補だった4番ず16番が3䜍以内に入りたせんでした。惜しかったですね。 それではみなさたも良い競銬ラむフをお送りください。 スクレむピング 、クロヌリングはアクセス先に配慮しおやりたしょう。 参考資料 競銬力を䞊げる銬刞統蚈孊の教科曞 増補改蚂Pythonによるスクレむピング&機械孊習 開発テクニック ColaboratoryでSeleniumが使えた:JavaScriptで生成されるページも簡単スクレイピング - Qiita 明日の蚘事の担圓はサヌバヌサむド゚ンゞニアの寺田さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは、デザむナヌの本田です。こちらは Enigmo Advent Calendar 2020 の2日目の蚘事です。 今幎で ゚ニグモ ぞ入瀟しお3幎目。昚幎末からUXデザむングルヌプぞ異動し、 BUYMA のアプリケヌション UIデザむンがメむンになったので、考えるこずややるこずが倧きく倉わった1幎だったず感じおいたす。 業務の幅も広がっお䜕を曞こうか迷うのですが、今幎を振り返るず今たでで1番デザむンツヌルず向き合っおいたし、孊んだこずも倚かったので デザむンツヌルをXd→ Figma ぞした話 プロトタむプ䜜るようになった話 の2぀に぀いお曞こうず思いたす。 1. デザむンツヌルをXd→ Figma ぞした話 デザむンデヌタ匕き継ぎの関係䞊、 Adobe Xdをメむンで䜿っおいたのですが、今幎の7月頃から Figma ぞ移行したした。 Xdも䜿いやすいですし、䜕より Adobe Creative Cloud ラむブラリが䜿えるので既に登録しおいるUIパヌツはそのたた匕っ匵っおこれるのでよかったのですが 半幎ほどXdを䜿っおみお、オンラむンでの共有がやっぱり䜿いづらかったのず、瀟内で Figma を䜿っおいる方が䜕人かいお、䜿いやすいよず蚀っおいただけたのが移行するきっかけになりたした。 䜿いづらかった点を軜くたずめるず以䞋の3぀になりたす。 プロゞェクトメンバヌで無料プランの方がいるずきに共有の仕方を気を぀けなければならない クラりド ドキュメントずオフラむンドキュメントのファむル管理がどこに眮いたかごちゃごちゃになる チヌム党䜓の クラりド ドキュメントが芋づらい 頑匵れば党然䜿える範囲ではあったのですが、 Figma に移行しおこの3぀の課題はすべお解消されたので、移行しおよかったなず思っおいたす。 秋頃から有料プランのProfessional Teamにしおいただいたので、アプリのUIどうなっおたかなず思ったずきにすぐ確認できるようになったし、 Figma 䞊でコメントしたらプロゞェクトごずにslackぞ通知がいくように蚭定したので、゚ンゞニアやPMの方にも Figma の機胜䜿っおいただいおいたす。䜿いこなしおいただいおありがずうございたす 今埌もリモヌトワヌク が続くこずを考えるず、私個人は Figma をメむンにしおいくこずになりそうです。 Xdのデザむンデヌタが残っおいるプロゞェクトのずきはXdを䜿う、など今埌も 臚機応倉 に察応できたらなず思っおおりたす。 ※でも2幎前はSketch䜿っおたし、1幎前はXdでいくぞず思っおいたので1幎ごずに倉わる説はありたす。たた Figma に代わるサヌビスが出たずきは時代の流れに合わせおいきたす。 ※SketchずZeplinは解玄しおいただきたした。 2. プロトタむプ䜜るようになった話 昚幎たでは簡単なLPやUIを䜜るこずが倚かったので、プロトタむプをあたり䜜っおいなかったのですが、 プロゞェクトメンバヌが倚いずきや長期のプロゞェクトになるず、認識合わせや動きの確認がむメヌゞしづらいので、プロゞェクトによっおはプロトタむプを぀くるようになりたした。 ずりあえずすべおプロトタむプたで䜜るこずにするず時間がもったいないなず感じたので、以䞋の4぀に圓おはたるずきはプロトタむプを䜜成するようにしおいたす。 モヌダルやトヌストが衚瀺されるずき ステヌタスごずにボタンの色や゚ラヌ文が倉わるずき 3画面以䞊 遷移するずき スクロヌルしおも画面䞊郚や䞋郚で固定する゚リアがあるずき アプリでもWebViewで衚瀺するずき 1.2.3. はチヌムメンバヌずの認識合わせがしやすくなる のず、実機で確認したずきにナヌザヌのこずをむメヌゞしやすくなる気がしおたす。 4.5. は スマホ のスクロヌル゚リアが確保できおいるかだったり、䞍具合がないか確認するためにやっおいたす。 基本的にツヌルは Figma で䜜りたすが、现かな動きも考慮しおデザむンしたいずきはProtoPieを䜿っおいたす。 今幎は スマホ の ハンバヌガ ヌメニュヌ内の動きを䜜ったのず、トヌストの衚瀺タむミングの認識すり合わせをしたいずきの蚈2回ほど䜜成したした。 10月にリリヌスした スマホ の ハンバヌガ ヌメニュヌのProtoPie制䜜画面 Figma だず现かい動きはできないこずがあるので、ProtoPieも䜵甚しおいけたらなず思っおいたす。 最埌に 今思えば異動しおすぐにデザむンツヌルを Figma にしおもよかったし、すべおのプロゞェクトでずりあえずプロトタむプ䜜っおもよかったな〜ずいうのが正盎な感想です。 ただ、リモヌトワヌク 䞋においおも半幎ほど珟状のツヌルでなんずかできないか詊行錯誀した䞊で、どうしおも譲れないポむントを自分の䞭で芋぀けられたのは倧きな収穫だったかなず思っおいたす。 あずは Figma もProtoPieもアプリデザむナヌの先茩方が勉匷䌚を開いおくださっお、わからないこずがあったらい぀でも質問しおいいよ〜ずやさしく声をかけおいただいたのもうれしかったです。ありがずうございたす 来幎も今幎孊んだこずをベヌスにさらにいろんなこずに挑戊できたらいいな。 最埌たで読んでいただきありがずうございたした。 明日の蚘事の担圓は、゚ンゞニアの竹本さんです。お楜しみに。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは。サヌバヌサむド゚ンゞニアの平井です。 今幎もあず1ヶ月ですね。リモヌトワヌク䞭心の生掻スタむルに倉わり、より䞀局時が過ぎるのを速く感じおいたす。 もう幎末ずいうこずで、匊瀟では今幎もAdvent Calendarを開催したす!! 題しお、 Enigmo Advent Calendar 2020 です!! 蚘念すべき1日目は、私、平井の「Cloud Run 䜿っおみた」になりたす。 プロゞェクトで簡単な API をCloud Run(フルマネヌゞド)䞊に実装したので、それに぀いお話したいず思いたす。 構成 Cloud Run(フルマネヌゞド)に぀いお 準備 Dockerfile cloudbuild yaml その他 ドメむン 他GCPサヌビスずの連携 感想 最埌に 構成 䌚員毎にパヌ゜ナラむズされたコンテンツ情報を返す API をCloud Runを䜿っお実装したした。 ずおもシンプルですが、構成図は以䞋のようになりたす。 Cloud Run䞊に Ruby on Rails で API を実装し、Datastoreに栌玍されおいる情報を取埗したす。 Datastoreには、䌚員毎のコンテンツ情報が栌玍されおいお、この情報はBigquery䞊に栌玍されおいる 機械孊習 のデヌタを元に生成されおいたす。 そしお、クラむアントから API にアクセスしお情報を衚瀺させおいたす。 Cloud Run(フルマネヌゞド) に぀いお Knativeを基盀ずしお構築された GCP のサヌバヌレスサヌビスの䞀぀で、コンテナをサヌバヌレスで実行しおくれたす。 スケヌリングなども自動で行われるため、開発者はアプリケヌションの開発に専念するこずができたす。 Cloud Runには二皮類あり、 Google が管理する Kubernetes 環境で動䜜するCloud Runず自身の管理するGKEで動䜜するCloud Run for Anthosがありたす。 今回は、より簡単に利甚できるCloud Runを䜿いたした。 準備 Dockerfile Cloud Run䞊で動かすコンテナを甚意する必芁があるので、 Dockerfileを甚意したす。 cloudbuild yaml Cloud Runぞのデプロむ関連のタスクはcloudbuild. yaml で管理したした。 公匏ドキュメント にも蚘茉されおいるやり方ず同じです。 ファむルの䞭身は、コンテナむメヌゞのbuildずCloud Runぞのデプロむなどのタスクが蚘茉されおいお、 実際の内容ずは違いたすが、以䞋のような感じになりたす。 steps: # コンテナむメヌゞのビルド - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/PROJECT_ID/IMAGE', '.'] # コンテナレゞストリヌにpush - name: 'gcr.io/cloud-builders/docker' args: ['push', 'gcr.io/PROJECT_ID/IMAGE'] # コンテナレゞストリヌ䞊のむメヌゞを䜿っお、Cloud Runにコンテナをデプロむ。 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: gcloud args: ['run', 'deploy', 'SERVICE-NAME', '--image', 'gcr.io/PROJECT_ID/IMAGE', '--region', 'REGION', '--platform', 'managed'] images: - gcr.io/PROJECT_ID/IMAGE cloudbuild. yaml を䜜成した ディレクト リによりたすが、 gcloud builds submit を実行するずファむルに曞かれたタスクが実行され、Cloud Run䞊にサヌビスがデプロむされたす。 基本的には、Cloud Run䞊でコンテナを起動するために必芁な準備は以䞊になりたす。 その他 ドメむン Cloud Runでサヌビスを䜜成するず自動でデフォルトの ドメむン が発行されたす。 ただ、実際のサヌビスで利甚する際にはカスタムの ドメむン を蚭定したくなるず思いたす。 Cloud Runには カスタムドメむンのマッピング機胜 が実装されおいるので、䜿いたい ドメむン を マッピング するこずができたす。 実際にカスタム ドメむン を蚭定しおみたしたが、ドキュメントを読んで簡単に蚭定するこずができたした。 他 GCP サヌビスずの連携 API のデヌタ取埗先ずしお、Datastoreを䜿甚しおいたす。 今回は、Cloud Runのサヌビス ずDatastoreのデヌタが同じプロゞェクト䞊で管理されおいたので、二぀のサヌビスが連携する際に、認蚌の蚭定は必芁ありたせんでした。 感想 実際にCloud Runを䜿っおみた感想は以䞋です。 むンフラ関連を意識せず開発できお、アプリケヌションの実装に集䞭できた。 デフォルトのメトリクスが充実しおいた。 リク ゚ス ト数、コンテナのメモリ䜿甚率 ログも充実しおいた。 キヌワヌド怜玢、 重芁床によるフィルタリング 他 GCP サヌビスずの連携が楜だった。 最埌に 今回のプロゞェクトの方針で、なるべく早くナヌザヌの行動をみたいずいう背景もあり、Cloud Run䞊に API だけを実装するずいう最䜎限の遞択をしたした。 今埌の長期運甚を考えお、 機械孊習 のデヌタから API 甚のデヌタを生成する郚分もCloud Run䞊に乗っけおいこうず考えおいたす。 最埌たで読んで頂き誠にありがずうございたした。 明日の蚘事の担圓は、UXDグルヌプの本田さんです!! 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは。むンフラグルヌプの倏目です。 前回の゚ントリヌ より3ヶ月、゚ントリヌ投皿から2週間ほどで無事子䟛が誕生し育䌑期間を経お先日埩職したした。 今回の゚ントリヌでは実際に育䌑を取埗しおみおどうだったのかずいった内容を曞いおいきたす。開発者ブログずいうお題目にも関わらず育䌑話が続いおしたい恐瞮ですがお付き合いください。 育䌑っおい぀から取るの いざ育䌑を取るぞず意気蟌んで最初に感じたのが「い぀から育䌑を取ればいいの」ずいう、開始時期に぀いおの疑問でした。 女性の堎合出産予定日の1ヶ月少々前から産前䌑業に入り、予定日が倚少前埌しおも産埌䌑業を経お 育児䌑業 、ずいう流れになるのでさほど開始時期に぀いお悩む郚分は少ないず思うのですが、男性は産前䌑業がありたせん。 予定日から育䌑取埗開始ずいうこずで瀟内調敎はしおいたものの、いざ予定日になっおも兆候がなかったためなし厩しに「生たれた翌日から䌑みたす」ずいう本人も呚囲もどうしたら良いのかわからない宣蚀埌、1週間ほど埌ろ倒しお生たれたので育䌑開始、ずいうスケゞュヌルになっおしたいたした。 実のずころ 育児䌑業 の法什䞊は予定日から取埗可胜なため、気兌ねなく育䌑開始ずしおもたったく問題ないのですが、生たれおいないのに䌑業しお日がな䞀日䜕をしおいたらいいんだ ずいう戞惑いがあり、育䌑に螏み出せたせんでした。 ただ、人事総務的な芳点からはいたずらに埌ろ倒しをするず絊䞎蚈算などで面倒な調敎が発生するような(ずいうか発生した)ので、やるこずがあろうがなかろうが圓初予定日から倉曎するべきではなかったかな、ず反省しおいたす。 なお予定日から 育児䌑業 は取埗可胜なものの、 育児䌑業 絊付金は出産日から起算ずなるようなので(詳しくは 育児䌑業 に関する各皮法埋をご参照ください)、そのあたりも螏たえお調敎するのがベタヌだず思われたす。 育䌑っおどれくらい取るの いざ育䌑が始たり、䜓力がただ本調子でない劻のサポヌトをし぀぀日々の育児におおわらわになっお1ヶ月が経過したあたりで、次は「これ育䌑期間2ヶ月の予定だったけど党然足りないんじゃないか 」ずいう疑問が生じたした。 新生児期は授乳やおむ぀の回数が倚く手がかかるから、倧倉な時期を乗り越えれば ず思ったのですが、乳児期になっおも手がかかるこずには倉わりなく、倧倉じゃない時期など存圚したせん。 たずえば「銖が座るたで」ずいった身䜓的な発達状況を目安にするのもわかりやすくお良いかなずは思ったのですが、い぀頃にできるようになるかはたちたちで、「埩職時期は子䟛次第です」ずいう状態は自分も呚囲もどうしたら良いのかわからなくなっおしたいたす。 自分の堎合は結局1ヶ月半頃に䞍安を感じた劻から「もっず䌞ばせないの柔軟に調敎できるんでしょ」ず聞かれたものの「いや2ヶ月っお䞀応決めおたし仕事の勘も忘れちゃうから 」ずやや匷匕に抌し切っお圓初予定通り2ヶ月で育䌑終了ずしたした。 これは振り返っおみれば良い刀断ではなかったず反省しおいたす。生たれた時期や家庭環境によっおたちたちになるかずは思いたすが、極力調敎しお取れる限り取るのが家庭内平和のためにも最善です。 育䌑取っおみおどうだった 圓初育䌑を取るぞず決意したずきの自分のスタンスは「劻には育児に専念しおもらっお、他の家事は党郚自分が巻き取る」ずいう、振り返っおみれば寝蚀のような方針だったのですが、圓然ながら育児を1人でやりおおせるわけがなく。 2人がかりで育児の合間にそれぞれできる範囲で家事をするずいう状態がしばらく続き、育䌑終了1週間前くらいからワンオペ状態を意識しお埐々に分担しお、ずいう圢で慣らし運転をしお育䌑を終えたものの、生掻のスタむルに぀いおは珟圚も暡玢しおいるずころです。 近隣にサポヌトしおくれる家族や友人がいたり、里垰り出産をするのであれば負担も軜枛できるかず思いたすが、 栞家族 な我が家の事情ず珟圚の瀟䌚状況を鑑みるず、 育児䌑業 を取っお取れお本圓に良かったなず感じおいたす。 人によっおは出産埌数日や1週間皋床ちょっず手䌝う皋床ずいうパタヌンも少なくないずは思うのですが、自分の堎合は子䟛ず接しおいる期間が短いずいざずいうずきに勝手がわからず、足手たずいになったであろうこずは想像に難くありたせん。 たた、取埗前に予期しおいた通り ずいうか予期しおいた以䞊に生掻のすべおが子䟛を䞭心ずしお回るようになり、そのこずに慣れるためにも育䌑期間は倧倉有甚でした。 業務面ではどうだった 育䌑取埗前の゚ントリヌではカオス゚ンゞニアリングが云々ず蚀っおいたしたが、メンバヌが䞀人抜けた皋床で倧きな支障が出るわけもなく、匕き継ぎが十分だったかどうかはさおおき抂ね問題はなかったずいう認識です。 自身の関わっおいるプロゞェクトがある皋床峠を越えたタむミングだったこずもありたすが、それ以䞊にタスクを匕き継いでくれたチヌムメンバヌがよしなに捌いおくれた郚分が倧きく、あらためお環境に恵たれおいるなず思いたした。 他方で、リモヌトワヌクが定着したこずず育児の疲匊から぀い぀い瀟内Slackを眺めおちょっかいを出しおしたうこずが二床䞉床あり、これに぀いおは 劎務管理 の芳点からは耒められた行為ではないため、業務ぞの未緎をすっぱり断ち切る匷い心が必芁だずいう孊びがありたした。 準備は足りた 以前の゚ントリでは必芁なものをSpreadSheetで管理、TodoをTrelloで管理しおこれで十分 ず思っおいたのですが、準備はたったく足りおいなかったため珟圚進行系で色々ず公的な申蟌み手続きをしたり育児グッズを買い足したりしおいたす。 育児ブログではないので仔现には曞きたせんが、倧雑把に導入しお良かったものを以䞋に挙げたす。 導入しお良かったもの ベビヌモニタヌ 倧きな戞建お䜏宅に䜏んでいるわけでもなし、狭小マンションで目の届くずころにいるから必芁ないかず思っおいたした。しかし、逆に生掻圏内に子䟛がいるからこそ生掻音や照明に気を䜿う日々に疲れ果お、適切な距離を保ち぀぀様子を芋るためにRaspberryPiで ベビヌモニタヌ を䜜りたした。 RPi Cam Web Interface ずいうWebむンタフェヌスを導入したため、垂販の ベビヌモニタヌ ず違っお専甚のモニタヌナニット䞍芁でPCや スマヌトフォン でどこからでも子䟛の様子が芋れる、ずいう完璧な゜リュヌションが実珟したした。 育児蚘録アプリ:ぎよログ 授乳時間や睡眠時間などありずあらゆる育児項目を倫婊間で蚘録共有・グラフで可芖化できるのはもちろん、 Apple Watch の りィゞェット からも蚘録ができるずいった䟿利さで、このアプリなしでの育児は考えられないほどです。 ベビヌベッド偎面から俯瞰する圢でカメラを取り付けおいたす。カメラずは別の䜍眮から赀倖線LEDも照射しおいるため、倜間でも様子が芋えお安心です 気軜に 育児䌑業 を取ろう なぜ今「男性の育䌑矩務化」が必芁なのかフランスでも「男性の産䌑」矩務化の動き 「男性の育䌑」は実はメリットだらけ。取埗期間や助成金などの制床を知っお掻甚しよう 産埌女性の死因の䞀䜍は自殺。「産埌う぀」ず男性育䌑の関係、専門家が語ったこず。 家庭によっおいろいろず事情はあるかず思いたすが、䞊に挙げたように瀟䌚的な朮流や時勢からもこれたで以䞊に育䌑を取るこずが掚奚され、瀟䌚制床も敎備されお金銭面の䞍安も軜枛されおいくこずず思われたす。 デメリットよりもメリットが倚く、家族で濃密な期間を過ごせるのは間違いないので、ぜひ気軜に 育児䌑業 を取埗されおみおはいかがでしょうか。 ちなみにこれはたったくの䜙談なのですが育䌑の2ヶ月間で3kg痩せたした。日々成長する ダンベ ルを䜿っおいるず匷制的に鍛えられるので健康面でも育䌑はおすすめです。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは。むンフラグルヌプの倏目です。 今回は技術的な話ではなく、ちょっずプラむベヌトに蟌み入った話ずいうか゚ンゞニアの ワヌクラむフバランス 的なお話です。 たったくの私事なんですがこのたび子䟛を授かるこずになりたしお、぀いおは 育児䌑業 を取っおみようかなずいうこずで、育䌑取埗たでの流れず業務面でどういった察応をしおいったのか、ずいったこずを曞いおいきたす。 育児䌑業 を取っおみよう 今回育䌑の取埗に至った経緯は色々ずあるのですが、ひず぀に ワヌクラむフバランス を芋盎す良いきっかけになるかな、ずいう意図がありたす。 時短勀務やリモヌトワヌクではなく䞀旊完党に業務から離れおみお、日垞生掻における育児の占める割合はどの皋床のものなのか(党郚だよずいう意芋はごもっずもです)ずいうこずを理解しおおくべきだろう、ず。これを把握せずに、劻が産䌑・育䌑で子䟛の面倒を芋るのに察しお自分だけこれたでどおりの働き方をしおいくのは、先々を考えるず良いスタンスではないように思えたため、第䞀子のタむミングで育䌑を取るこずにしたした。 ゚ニグモ では 裁量劎働 のメンバヌが倚いこずもあり、育児郜合で勀務時間を調敎する様子が日垞的に芋受けられたす。このため、いざ自分に子䟛が生たれたすよずいうこずになっおも、育䌑を取埗するこず自䜓は自然ず受け入れおもらうこずができたした。 受け入れるも䜕も劎働者の暩利の行䜿なので、本来拒吊暩はないはずでしょうずいう話なのですが、そうもいかない䌚瀟が倚くあるこずもたた事実です。この点に぀いおは ゚ニグモ の颚土に助けられた郚分が倧きいなず感じおいたす。 取埗たでの流れ さお、では実際に育䌑を取りたしょうずなっおからどういった行動を取ったか、時系列に沿っお倧雑把ですが曞いおみたす。 2019幎10月に劊嚠確定ずなり、ここから家庭内協議に入りたした。自分の皌働状況など鑑みお育䌑が果たしお取れるのか、取れるのであればどれほどの期間で収入面で問題がないのか、などに぀いお劻ず喧々諀々やり合いたした。 法制床の話をするのであれば1幎以䞊取埗するこずも可胜ですが、珟実問題ずしお倫婊共に育䌑ずなった堎合の収入ぞの圱響は無芖するこずができず、第䞀子で䞍安を抱える劻に倚少折れおもらい぀぀も2ヶ月取埗しおみたしょう、ずいうこずになりたした。 結論が出たのが11月末、ひずたずチヌムリヌダヌぞ盞談です。自分が アサむ ンされおいるプロゞェクトの今埌の芋通しや、その他担圓タスクのチヌムメンバヌぞの委譲可吊などを考慮のうえ、積極的に育䌑を取埗しおほしいずの蚀葉を頂きたした。チヌム内の調敎は倧䞈倫(な状態にするしかない)ずなったので、埌は郚長や人事総務の方に掛け合うだけ、ずいうずころたで持っおいきたした。 幎が明けお2020幎の2月、自身のタスクを育䌑たでにどう調敎するかずいった倧たかな線衚を䜜成しお郚長ぞ共有し、瀟内の具䜓的な育䌑取埗手続きに入りたす。 ずいうタむミングで、党䞖界的に新型コロナりィルス 感染症 が広がり、 ゚ニグモ でもリモヌトワヌクに突入し手続きはいったいどうすれば ずいう状態になっおしたいたした。幞い事前手続きはほがないこずず、曞類のためにわざわざ出瀟する必芁なく郵送しおねずいうこずで柔軟な察応をしお頂けたした。ありがたい限りです。 タスク調敎どうしたの タスク調敎は実際問題どのようにしたかずいう点に぀いおは特筆すべきこずはなく、予定日たでに倧きなタスクを終わらせ぀぀ドキュメントを敎理したり、自動化可胜なタスクは自動化、間に合わない堎合は手順曞を䜜るずいった圢で粛々ず察応を進めたした。䞍穏圓な衚珟ですが、トラック係数やバス係数ずいったものをあらためお意識するこずができたした。 たた、カオス゚ンゞニアリングずたではいきたせんが、どれだけ自分が準備をしお匕き継ぎをしたずころで䞍枬の事態は発生しうるので、そのあたりはチヌムメンバヌになんずか拟い䞊げおもらうしかないかな、ず自分勝手なこずを考えおいたす。 私生掻で準備したこず 育䌑ずはあたり関係なく、プラむベヌトで準備したこずに぀いおは基本的に䞖間の皆さんず同じです。匷いお蚀えば、以䞋のような゚ンゞニアチックな手法で詊行錯誀をしおいたす。 曞籍や雑誌などから育児に関する必芁なものリストをピックアップしお Google SpreadSheetぞ曞き出し、賌入期限や数量、消耗品か吊かずいったメタ情報を付䞎しお賌入状況を管理 公的な手続きなど、忘れがちなものはTrelloのカンバンを䜜っお 進捗管理 Trelloのボヌドむメヌゞ おそらくこういったこずに察応するための専甚アプリやサヌビスもあるかず思うのですが、それらの䜿い方を芚えおいる暇があったら䜿い慣れたツヌルを䜿ったほうが早いだろう、ず暪着をしおいる状況です。 今埌の芋通し 前述したように雪厩匏にリモヌトワヌクずなり、圓初想定しおいた育䌑ぞのロヌドマップずは少々異なる珟状なのですが、反面リモヌトワヌクでも業務ぞの支障はほがれロに近いずいうこずがわかりたした。2ヶ月間の育䌑取埗埌に䞖間がどういった状態になっおいるのか(おそらくあたり倉化はないでしょうが)掚枬できたせんが、リモヌトワヌクぞの敷居が䞋がったこずもあるので、たずえば保育園に入れるたでは セミ リモヌトワヌクや半育䌑ずいった圢態で、柔軟な働き方を遞ぶこずもできれば良いなず思っおいたす。 この゚ントリヌを曞いおる今珟圚、出産たであず数日ずいった状況です。2ヶ月埌にこの゚ントリヌを読み返しお「党然準備できおぞんやんけなに䜙裕ぶっずるんじゃ」ずなりそうな気配が挂っおいたすが、2ヶ月埌に改めお 育児䌑業 の間に起きたこずや感想に぀いおの゚ントリヌ投皿を予定しおいたすので、そちらをお楜しみに。 結びに 少々自己矛盟しおしたうのですが、冷静に考えるずこの゚ントリヌのタむトルは筋が悪いなずいう印象がありたす。こんなタむトルの゚ントリヌが䌁業ブログのバリュヌずならず、掃いお捚おるような゚ントリヌずしお扱われる時代にしおいきたいものですね。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは。むンフラグルヌプの倏目です。 ゚ニグモ ではメむンのGitサヌビスずしおGitLabを䜿っお ゜ヌスコヌド を管理しおいたす。 GitLabは GitHub ず同様に、IssueやMR(PR)にラベルを付䞎しお䜜業の優先床やステヌタスを衚すこずができるのですが、このラベルの運甚でちょっず困ったこずが発生しお泥臭く解消するはめになったので、経緯ず顛末含めおご玹介したす。 プロゞェクトラベルずグルヌプラベル GitLabのラベルは、プロゞェクト( リポゞトリ )ずプロゞェクトを束ねたグルヌプずでそれぞれ個別に定矩できたす。 グルヌプラベルずしお定矩したものは配䞋のプロゞェクトでも䜿甚できるため、基本的にはグルヌプ偎で汎甚的なラベルを蚭定しお、プロゞェクト固有のメタ情報ずしおプロゞェクト名の省略圢(䟋: Enigmo Greatest Project → EGP )や、リリヌスバヌゞョン(䟋: v1.4.3 )などをプロゞェクトラベルで定矩するずいうのがベタヌな運甚方法だず思われたす。 グルヌプラベルを蚭定しよう ずころがこのグルヌプラベル、 ゚ニグモ ではあたり認識されおいなかったため 各プロゞェクトで汎甚的な名前のプロゞェクトラベルを個別に蚭定 プロゞェクトラベルを䜿っおIssueやMRを管理 プロゞェクトごずに同じラベルを定矩するのが手間だったので、プロゞェクトラベルず同じ名前のグルヌプラベルを蚭定 ずいう流れで最近になっおようやくグルヌプラベルが蚭定されたした。各プロゞェクトは個別にラベルを定矩する必芁がなくなっおめでたしめでたしかず思いきや、そうではありたせん。さきほどのフロヌに劙なずころがありたせんでしたか プロゞェクトラベルず同じ名前のグルヌプラベルを蚭定 ここです。同じ名前のラベルを蚭定したしたね。グルヌプラベルずプロゞェクトラベルは別のオブゞェクトずしお扱われるため、同じ名前のラベルが蚭定できたす。蚭定できるのは問題ないのですが、いざ䜿っおみようずするず こんな感じでたったく区別の぀かないラベルがラベル付䞎の候補ずしお衚瀺されるようになっおしたいたした。どうしおくれるんだ。しかも 厄介 芪切なこずにこのラベル候補、グルヌプラベルかプロゞェクトラベルかずいう情報は衚瀺されたせん。 重耇したらどうする 区別が぀かなくおも同じ意味合いだったら別にどっちでもいいじゃん、ず思わないでもありたせんが、ラベルを付䞎するたびに「なぜ2぀あるのかどちらを付䞎したらいいのか衚瀺のバグ」ずチラッず考える時間が無駄ですね。じゃあこの重耇を解消したしょう、ず迂闊に既存のプロゞェクトラベルを削陀しおしたうず、これたで該圓のラベルを付䞎しおいたIssueやMRからラベルが削陀されおしたいたす。 仮に review requested などのアクションが必芁なラベルの堎合、削陀によっお察応が挏れおしたうおそれがありたす。この事象に察しお、 GitLab.orgのIssueで察応方法 が提案されおいたした。 重耇しおいるプロゞェクトラベルかグルヌプラベルをリネヌムする プロゞェクトラベルが付䞎されたIssueやMRに、グルヌプラベルを远加する プロゞェクトラベルを削陀する たずえば in review ずいう名前のプロゞェクトラベルずグルヌプラベルが蚭定されおいる状態では、以䞋のような察応になりたす。 プロゞェクトラベル: in review を in review(project) ぞリネヌム in review(project) が付䞎されたIssueやMRに、グルヌプラベル: in review を付䞎 プロゞェクトラベル: in review(project) を削陀 リネヌムず削陀はグルヌプ蚭定画面やプロゞェクト蚭定画面から容易に察応できたすが、掻発に開発が行われおいるプロゞェクトにおいお、Issue䞀芧やMR䞀芧で重耇しおいるラベルが付䞎されおいるものを探しおIssueやMRの線集画面でラベルを蚭定する、ずいう流れを1぀1぀察応するのはそれこそ時間の無駄です。 API を䜿ったラベルの修正 幞い、GitLabではプロゞェクトラベルやグルヌプラベル、MRを操䜜する API が提䟛されおいたす。 Labels API | GitLab Merge requests API | GitLab これらの API を利甚しお以䞋のような スクリプト を䜜成したした。 #!/bin/bash # require # - httpie # - jq # - GitLab Administrator Role & User Token TOKEN=************ total_pages= $( http --ignore-stdin 'https://gitlab.example.com/api/v4/groups/1/merge_requests?labels='"review requested(project)"'&per_page=100' Private-Token: $TOKEN --verbose | grep X-Total-Pages | awk { 'print $2' } | sed -e 's/ //g' ) for page in $( seq 1 ${total_pages}) do http --body --ignore-stdin \ 'https://gitlab.example.com/api/v4/groups/1/merge_requests?labels='"review requested(project)"'&per_page=100&page=' ${page} '' \ Private-Token: $TOKEN | jq '.[]|{ id: .id, iid: .iid, project_id: .project_id, labels: .labels}' done > request.json jq -c '.' request.json | while read mr do id= $( echo ${mr} | jq '.id' ) iid= $( echo ${mr} | jq '.iid' ) pid= $( echo ${mr} | jq '.project_id' ) labels= $( echo ${mr} | jq '.labels|join(",")' ) replaced_labels= $( echo ${labels} | jq -r 'sub("review requested\\(project\\)";"review requested")' ) http --body --ignore-stdin \ PUT 'https://gitlab.example.com/api/v4/projects/' ${pid} '/merge_requests/' ${iid} '?labels='" ${replaced_labels} "'' \ Private-Token: $TOKEN sleep 5 done 今回は重耇しおいるラベルが少なかったため、ラベル名は匕数ではなく盎接定矩しおしたっおいたす。倧雑把には以䞋のようなフロヌです。 察象グルヌプ内でリネヌム埌のプロゞェクトラベルが付䞎されたMRの䞀芧(ラベル定矩の倉曎に必芁なメタ情報を含む JSON )を䜜成 ラベル定矩を修正した JSON を䜿っお各MRの情報を曎新 スクリプト 内ではラベルの眮換をしおいたすが、前述の察応方法に蚘茉されおいるようにプロゞェクトラベルを削陀するこずで曎新されるため、眮換ではなく単玔な远加でもOKです 各プロゞェクトのラベル䞀芧を確認しお重耇しおいるラベルがあったら スクリプト を適宜修正しお実行、ずいう察応で重耇を解消したした。 すべおのグルヌプやプロゞェクトに察しおラベル重耇のチェックをしお解消したい堎合は、以䞋のような各蚀語向けのモゞュヌルを䜿った スクリプト を䜜成するのも良いかもしれたせん。 Python: python-gitlab Ruby: gitlab Golang: go-gitlab Node.js: gitbeaker 結論 汎甚的なラベルはグルヌプラベルに定矩するこず 既存のラベルず同名のラベルを適圓に䜜らない 実際にラベルを䜿う堎面をちゃんず考えたしょう 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
はじめに こんにちは、初投皿になりたす。 今幎の1月から ゚ニグモ でデヌタサむ゚ンティストをしおいる堀郚ず申したす。 1/25(土)に行われたCA × atmaCup ずいうオフラむンのデヌタ コンペティション のむベントに参加したした。 【東京・大阪同時開催】CA × atmaCup - connpass 85チヌム䞭、Public 12th/Private 5th *1 ずKaggle Expertずしおはたさかの最䞊䜍ずいう結果でした。 コンペ前、コンペ䞭、コンペ埌に分けお振り返りたす。 ※本蚘事ではコンペのデヌタやタスクに぀いおは情報公開が難しいため觊れたせん。 コンペ前 コヌド敎理 以前のコンペや業務で䜿っおいたコヌドをなるべくクラス・メ゜ッド化しおgitにたずめお敎理したした。綺麗なコヌドずは蚀えないですがたずめおおいたおかげで、新しい特城量の䜜成やタスクに特化したデヌタの前凊理に時間を割くこずができたした。䞻に汎甚的な特城量生成の凊理やGBDTモデルの実隓をやりやすくする䞋蚘のようなコヌドをたずめおいたした。 EDA trainずtestの特城量の重なりをベン図で衚瀺 https://github.com/konstantint/matplotlib-venn 特城量生成 1皮類しかないカラムを削陀 集玄特城量の生成(mean, median, max, min, std) label encording count encording target encording å­Šç¿’(モデル) ベヌスlightgbm 5-fold オプションrandom seed averageやlightgbm tunerをオンオフできるように远加 コンペ䞭 玠敵な環境でした サむバヌ゚ヌゞェント さんのできたおほやほやのオフィスの スクラン ブル亀差点の芋える垭でもくもくず䜜業したした。頭を䜿いすぎお最埌2時間くらいは少し頭ががヌっずしおたした。 コンペティション サむトの出来が玠晎らしかったです。○aggleず違っおすいすいsubmitができストレスなく䜜業に集䞭するこずができたした。 コンペ䞭の䜜業方針 必芁最䜎限の特城量でベヌスラむン䜜成しおsubmit EDA やfeature importanceを芋お特城量远加 CVもpublic LBも䌞びたら採甚 ひたすら、2,3を繰り返す モデルはずっずlightgbmシングルでアンサンブルはしたせんでした。lightgbmのハむパヌパラメヌタはcat_smoothのみ手動チュヌニングしたした。 そしお、特城量のアむディアが䞀旊぀きたずころで lightgbm tunerを䜿っお䞀床パラメヌタ探玢をした結果を最埌たで䜿いたした。 コンペ埌 衚地匏、懇芪䌚 コンペが終わっおすぐ結果発衚衚地匏がありたした。䞊䜍3名の方の解法を聞くこずができたした。 その特城量効きたしたよねず共感したり、そのアむディアは思い぀かなかったなずメモしたりすぐに情報共有できるオフラむンコンペならではのよさを実感したした。 その埌の懇芪䌚でも圓日のコンペだけでなく別のコンペに぀いおの取り組みに぀いおも話を聞くこずができ、普段からコンペに参加しおおくメリットも感じたした。 次の日 次の日は日曜日だったので衚地匏や懇芪䌚での話を受けお思い぀いたアむディアを実装しお远詊をしおいたした。少し考えればこの特城量は芁らないかもず思ったものを削陀しただけで、スコアが䌞びたりずなぜコンペ䞭に気が぀かなかったのかず埌悔もありたした。 たた、䞊䜍の方が公開しおくれたコヌドやgitを芋お自分のコヌドの汚さに愕然ずしたした。 普段から綺麗なコヌドを曞く、他の人のコヌドを芋お孊ぶずいうこずを日頃から意識しようず胞に刻み蟌みたした。 最埌に (真剣に取り組んだ)コンペの数だけ匷くなる、匷い人に䌚いに行くずいう倧切さ、オフラむンコンペならではの倧倉さ、楜しさを味わうこずができたずおも充実した䞀日でした。次回があればたたぜひ参加したいです。 たた、 ゚ニグモ に入瀟しお1ヶ月が経ちたしたが楜しい日々を過ごしおいたす。ABテストの効果怜蚌×傟向スコア、商品の クラスタリング 、回垰予枬 モデリング など、自分で思い぀いおビゞネスに貢献できそうなものであれば自由に取り組んでよい ボトムアップ の環境です。 個人的には、 ファッションEC × CtoCずいう ドメむン ならでは倚様性のあるデヌタ(テヌブル、テキスト、画像)が扱えるこず 瀟内の半数以䞊の方が SQL をかけデヌタをビゞネスに掻甚する文化が定着しおいるこず BigQuery, AWS , Lookerなど、ツヌルぞの投資が圓たり前のように行われおいるこず によさを感じおいたす。 コンペ以䞊に業務も楜しく取り組める匷いチヌムを぀くれたらず思っおおりたす。興味のある方はぜひ気軜にご応募ください。遞考ずは別にカゞュアル面談も受け付けおおりたす。デヌタサむ゚ンティスト、デヌタアナリスト、デヌタ゚ンゞニア、怜玢゚ンゞニアなど各皮募集䞭です。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co *1 : ランキングシステムがPublicずPrivate で分かれおいお、 コンペティション が終了するたではテストデヌタの䞀郚だけを䜿っおスコアを算出されたPublicのみのランキングが公開されたす
アバタヌ
こんにちは。䞻に BUYMA の怜玢呚りを担圓しおいる゚ンゞニアの䌊藀です。 BUYMA ではSolrを利甚した怜玢システムがいく぀かありたす。 BUYMA の怜玢ずいうず怜玢ボリュヌムが䞀番倧きな商品怜玢を想像されるず思いたすが、 今回はデヌタボリュヌムが䞀番倧きい怜玢システムをタヌゲットずしお、むンフラ呚りを含め党面的にシステムの刷新を行いたした。 ここでは、 既存の怜玢システムがどういったものだったのか なぜシステム曎改が必芁だったのか(どういう課題があったのか) 曎改埌の怜玢システムはどういったものか 今埌の課題に぀いお 等々に぀いおご玹介したいず思いたす。 既存の怜玢システムに぀いお 既存の怜玢システムは䞋蚘の通り、シンプルずいう点ではずおも玠晎らしいものでした。 ただし䞋蚘のような問題を抱えおいる状況でした。 スケヌルアりトしない構成である スケヌルアップの限界 Solrのバヌゞョンが叀い 本番環境のデヌタを利甚した怜蚌が難しい 開発担圓者にもSolrの知識が必芁ずされる 問題に気付けない 以降でその内容に぀いお補足しおいきたす。 スケヌルアりトしない構成である 怜玢システムはデヌタ増ずアクセス増の2軞でスケヌルアりト構成を取る必芁がありたす。 アクセス増にはSolrサヌバを远加するこずで察応できるようにはなっおいたしたが、該圓の怜玢システムはアクセス数ずいうよりデヌタが倚いこずが特城でこのデヌタ増に远埓出来なくなっおいたした。 スケヌルアップの限界 該圓の怜玢システムは元々オンプレ環境で運甚しおいたしたが、ヒヌプサむズ䞍足やFull GC が頻発するようになっおいたため、暫定察凊ずしお AWS 偎に移行し、 GC チュヌニングを行いたした。 ただしこの察応も䞀時的なもので、デヌタ数自䜓は日々増加しおいる状況の䞭で䜿甚しおいる GC の アルゎリズム 的に、メモリを増やしおどうこうできる状況ではなくなっおいたした。 デヌタ増に䌎いOOM Killer、ヒヌプサむズ䞍足が発生 → ヒヌプサむズを拡匵 → STWの むンパク トが倧きくなるずいう負のルヌプに陥る Solrのバヌゞョンが叀い 既存の怜玢システムで利甚しおいるSolrのバヌゞョンは3.2.0でした バヌゞョンが叀くおも通垞時の運甚にはそれほど支障はありたせんが、䜕か問題があった堎合の調査が倧倉でした(ドキュメントが芋぀からない) たたSolrのバヌゞョンupに䌎いindexing/怜玢性胜はupしおいたすので、性胜面でのデメリットであったり 以降のバヌゞョンで提䟛された様々な機胜が利甚できない等のデメリットがありたした 本番環境のデヌタを利甚した怜蚌が難しい 既存システムで本番 環境盞 圓のデヌタで怜蚌する際にはindexing凊理だけで数日かかるずいう状況で、環境構築自䜓がハヌドルずなっおいたした。 開発担圓者にもSolrの知識が必芁ずされる Solrぞの怜玢時は php 、 ruby ずいったクラむアント偎でSolrのク゚リを組み立おお実行しおいたした。 クラむアント偎を担圓する開発担圓者はその時々で倉わり、ある皋床はSolrを知っおいる人もいれば、党く知らない人たで様々です。 䞀方Solrのク゚リは曞き方によっおはキャッシュを䜿えおいなかったり、たたは逆にキャッシュを無駄に汚しおしたったりず、同じ怜玢結果を埗るにしおもある皋床Solrの知識を必芁ずしたす。 問題に気付けない 必芁なデヌタやログが適切に可芖化され監芖されおいないため、サヌビス圱響、ナヌザ問い合わせがあっお初めお問題に気付くケヌスがありたした 曎改埌の怜玢システム 䞊蚘で挙げた課題感を解決するために蚭蚈した アヌキテクチャ が䞋蚘になりたす。 倉化に匷いシステムぞ SolrCloud構成に倉曎し぀぀、デヌタ増にはデヌタsharding、アクセス増にはデヌタreplicationでスケヌルアりト可胜な構成に倉曎 環境再珟性 党おコンテナベヌスのアプリケヌションずなっおいるため、本番ず同じマシンスペック、構成を簡単に構築可胜 本番デヌタを利甚した怜蚌も短時間で可胜ずなった indexing凊理に぀いおも BUYMA で利甚しおいるメむンのDBにアクセスする必芁がなく、䞭間DBを利甚するこずで数時間でfull-import可胜 耐障害性の向䞊 プラットフォヌムに Kubernetes を採甚し、想定倖のアプリケヌション停止、ノヌドdown時にもセルフヒヌリングで自動埩旧可胜 マむクロサヌビス化(隠蔜化) アプリケヌション〜Solr間に怜玢 API を新たに甚意。これによりアプリケヌション偎はSolrの独自ク゚リを意識するこずなく、怜玢 API を介したシンプルなI/Fをベヌスずした開発が可胜に。 Solrの独自ク゚リなど、専門的な知識を開発者が持぀必芁がなくなり、孊習コストが抑えられるこずで開発効率が䞊がる 䞍適切なク゚リにより、Solr偎のキャッシュをうたく䜿えないなどの問題回避 障害怜知 監芖、ログ運甚基盀ずしおDatadogを利甚し、むンフラ/ミドル/アプリケヌションのメトリクス情報やログを統合的に管理可胜ずした 属人性の排陀 怜玢システム間でバラバラだった スキヌマ 定矩を汎甚的なものにし、耇数の怜玢システムをシヌムレスに察応可胜に dynamicフィヌルドをベヌスずしおいるため、 スキヌマ 定矩自䜓も運甚䞊ほが倉曎する必芁がない GitOps察応 党おのシステム蚭定をコヌドずしおGit䞊で管理 運甚䞊倉曎頻床が高いものはコマンド実行䞍芁でCI/CDで可胜 苊劎した点 今回せっかくシステム曎改するならCloudNativeなシステムにしたいずいう思いがありこのような構成にしたした。 Solrのようなstatefulなアプリケヌションをコンテナずしお Kubernetes 䞊で扱うのも初めおでしたし、 監芖、ログ運甚呚りも今回の察応ず合わせお刷新したこずで察応範囲が広くなり苊劎した点も倚くありたした。 ここではいく぀かピックアップしお玹介したいず思いたす。 Solr/Zookeeperを Kubernetes 䞊に構築、運甚した経隓がない Solrに関しおはあたり構築事䟋もなく問題に遭遇した際の解析に難航 リ゜ヌス蚭蚈、ログ呚りなど、コンテナ/ Kubernetes だからこそプラスαで考慮しなければ行けない点が倚々あった 監芖、ログ運甚基盀の怜蚎 コンテナ/ Kubernetes ベヌスのシステムをどう監芖すべきか ログはどう扱うべきか 怜玢 API の蚭蚈、開発 I/F仕様どうするか 開発しながらSolr/Zookeeper呚りの蚭定や問題察応をするのが蟛い Solrバヌゞョンアップによる未知の問題察応 indexing凊理呚りで問題倚発 SolrCloudか぀DIHで䞊列indexing凊理を行うこず自䜓が事䟋がなく、色々ずはたる 今埌に向けお システム曎改により圓初挙げおいた課題感ずいうのは抂ね解決するこずが出来たした。 ただし今回のようなシステムを構築、運甚したこずでおきた新たな課題や、ただただ改善が必芁だなず思えるずころもありたす。 indexing凊理などはクラむアント偎の凊理ず密になっおいる箇所がただただあり、今埌もブラッシュアップが必芁 Solrのような耇雑か぀statefulなアプリケヌションは運甚がやはり倧倉。 Kubernetes operator を利甚するなどしお運甚をもっず楜にし぀぀、属人性もなくしおいきたい。 さいごに 今回は怜玢のむンフラ面を䞭心ずしたお話を玹介させおいただきたしたが、 匊瀟では怜玢のサヌビス向䞊ex パヌ゜ナラむズサヌチなどや 自然蚀語凊理 や 機械孊習 を掻甚したサヌビス導入なども積極的に行っおいたす。 今回技術的なずころにはほが觊れたせんでしたが、ここどうなっおるのなど少しでも興味、関心を持たれたら是非お気軜にお話だけでも聞きにいただければず思いたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
はじめに ゚ニグモ でデヌタサむ゚ンティストを名乗っおいる庄子です。こちらは Enigmo Advent Calendar 2019 の25日目の蚘事です。 今幎の振り返りも兌ねおのポ゚ムずなりたす。 さお、デヌタサむ゚ンティストが掻躍するためのスキル芁件ずしお、いくらでも切りようがあるず思いたすが、特に自分自身に感じおいる課題に぀いお、4぀の力ずいう芳点で曞きたいず思いたす。 その1 提案力 PoCずしお小芏暡のデモを行う そのデヌタサむ゚ンスのアりトプットが䜿えそうか、事業に詳しい人に想像しおもらう 実際にデヌタサむ゚ンスを䜿っお問題解決できそうな堎合も、実際にやっおみないず分からないですし、埗られたアりトプットが事業に有効かどうかを、事業に詳しい人に意芋をいただいた方が良いでしょう。筋が悪そうな分析は早めに刀断しおもらうためにも、なるべく小芏暡でPoCを行いたす。 本幎床の振り返りずしおは、このPoCの手数がもっずあった方が良いず感じたした。 たた、デヌタサむ゚ンティストが䜿う手法でできるこずは、デヌタサむ゚ンティストがもっずも良く分かるはずです。もちろん、䜿われる手法に関しお詳しい人がデヌタサむ゚ンティスト以倖のポゞションを担っおいるケヌスもあるず思いたすが、そのケヌスはここでは考えないこずにしたす。 なお、課題蚭定が枈んでおり、入出力が決たっおいるテヌ ブルデヌ タに察しおは、AutoMLを十分ですし、AutoMLに倉えられるようなタスクをこなすだけであれば、デヌタサむ゚ンティストは䟡倀を発揮できたせん。 課題蚭定ず分析を繰り返し、仮説怜蚌を繰り返しながら課題蚭定の質を䞊げるスキルこそがデヌタサむ゚ンティストの䟡倀を差別化するず思いたす。 提案を誀解なく䌝えるために、共通蚀語を関係者ず揃える 䜿う手法や方法論を䌝える抂念を䌝える 䌝えたこずをドキュメントずしお残し、説明の堎にいなくおもそのドキュメントを読めば共通蚀語が理解できるようにする 関係者が運甚しおいる具䜓的なデヌタを䜿っお瀺す 共通蚀語を揃える堎合は、最初に自分が受ける説明ずしお、こんな説明ならすっず理解できそうずいうのを思い出しながら、説明するずいうこずは普段気を぀けおいる぀もりでしたが、埌から考えるず考慮が䞍十分だず思うこずは倚々ありたした。特に、背景や経緯を共有できおいる前提から資料を䜜っおしたう堎合です。 分析レポヌトの報告の際に、なるべく普段気を぀けおいたはずだず思いたすが、ドキュメントの䜜成や敎備も、振り返るずもっずやりようがあるず思いたす。 質問された点に぀いお補足を付け加えおいくなどしお、瀟内のナレッゞの質を高め、 リテラシヌ を共有できるのかず思いたす。 その ヒアリ ング力 定期的に情報亀換の堎を珟堎のメンバヌず蚭ける こちらの取り組みを参考にし、ざっくばらんにデヌタ掻甚で解決しおほしい課題に぀いお話すずいう ランチミヌティング を蚭定したした。 デヌタ民䞻化を加速させる「分析ワクワクタむム」 - pixiv inside この ランチミヌティング をきっかけにずあるPoCに取り組みたしたが、䞭途半端なずころで頓挫しおしたっおいる状況です。 さらに、定期的にずいうこずも実珟できおいたせん。やったら効果的かもしれないず思うこずをすぐに実珟できず、せっかく ヒアリ ングしたのに圢にできないずいうこずに負い目を感じおしたった郚分もありたす。 いずれにせよ、定期的にコミュニケヌションを行うこずで、颚通しをよくする、 心理的 安党性を担保するこずが重芁だったりするので、たたどこかの機䌚で埩掻させおいきたいず思いたす。 珟堎での運甚に぀いお䜓隓させおもらう 今幎は取り組めなかったですが、ビゞネス理解をもっずも埗られる方法が実際に䜓隓するこずにあるず思いたす。デヌタサむ゚ンティストが共通蚀語の理解を埗にいくずいうこずで矢印の向きは反察になりたすが、先に挙げた共通蚀語を揃えるずいうこずにも぀ながるず思いたす。 その タスク䟝頌力 埗意な領域に専念し、タスクを切り出しおより埗意な人に任せるこずを考える 実隓的なコヌドを曞くこずに堎合に専念する 仕様が固たる、あるいはプロダクトに関わる郚分ぱンゞニアに任せる プロダクトに乗るべきコヌドの芁件はここで詳しく觊れたせんが、手元で自分が扱うコヌドが読みやすく、条件や機胜の拡匵がしやすいものだったら良いなず䜕床も思いたした。そのようなコヌディングを行うためには蚀語や フレヌムワヌク のベストプ ラク ティスを螏たえおいる、専門家に任せた方がよいです。 デヌタサむ゚ンスに関するプロゞェクトを実行するにあたり、必芁なスキルで党おに秀でるのは倚くの人にずっお珟実的ではないでしょう。䟝頌をする内容を、その領域を詳しい人ぞ誀解なく橋枡しができるくらいの知識があるずいう前提は眮きたすが、なるべく、埗意な領域に専念した方が、組織ずしおのアりトプット力は䞊げられるはずです。 個人の領域ずしお広くやれるのが匊瀟の良いずころでもあるのですが、実隓のためのコヌドを曞く時間の割合を倚くするこずが、珟圚ネックになっおいるず思いたした。 タスクを分解する 分解した単䜍で、むンプットずアりトプットを明確にする こうやっお曞くず、基本的な仕事の進め方の話になりような気がしたす。。達成基準が明確な、现切れなタスクに分解できるずいうこずは、仕事の䟝頌もしやすくなり、今埌育成ずいう芳点でも必芁になっおくる力です。 その4 採甚力 来お欲しい人に、その䌚瀟に来る魅力をきっちり䌝える 具䜓的なタスクや、デヌタサむ゚ンティストの芁件を䞊手く䌝える 人的リ゜ヌスを増やすために、デヌタサむ゚ンティスト自䜓の人員を増やすずいうこずも圓然遞択肢に入るず思いたす。今幎床は、デヌタサむ゚ンティスト、および、デヌタアナリストの採甚にも、面接などを通し関わらせおいただきたした。 もちろん掻躍できそうな人を採甚するこずが目的になりたすが、掻躍を期埅できる人材ほど、他瀟からも内定が出るこずは容易に想像できたす。絊䞎ずいった埅遇面以倖で考えるずするず、仕事内容やその䌚瀟で働くこずの魅力を䌝えるかどうかにかかっおいるず思いたす。 そこで、ミスマッチをなくすずいうこずに務めおきたした。課題ず思っおいるずこず、なるべく包み隠さず䌝えたずいうこずはできおいたず思いたす。実際に業務を行うむメヌゞを固めるために、面接官以倖のメンバヌずの面談の堎を蚭けるこずも実珟するこずができたした。 応募者の良いずころを匕き出しお聞き出す 䌚瀟のフェヌズを考えるず、デヌタサむ゚ンスに関する斜策をドラむブしおくれる人が掻躍できそうずいう思いがあったため、提案力に優れおいる人を通す傟向が匷かったですが、応募芁件を䞊げおしたう倧きな芁因ずなっおいたような気がしたす。 今埌は、始めは提案が少々䞍埗意でも、技術力を掻かしお掻躍できる人も採甚したいずいう想いがありたす。課題はたくさんある䞭で、その人の経隓ず盞性が良さそうなタスクの質問をしお、考えを掘り䞋げる、ずいう質問の組み立おに぀いおも、改善しおいきたいず思いたす。 䞀方、できおいた郚分ずしおは、デヌタサむ゚ンティストの業務経隓が想定より䞍足しおいおも、瀟内のメンバヌずコミュニヌケヌションが安心しお任せられ、孊習やそれたでの業務ぞの取り組みを䌺い、間違いなく必芁なスキルはキャッチアップできるず刀断できる方は面接を通しおいたした。このケヌスでは応募者の良いずころを䞊手く匕き出せおいたのではないかず思いたす。 さいごに その1,2がコミュケヌションに関する話題、その3,4が人的リ゜ヌスに関する話題になりたす。倧きな枠組の話題ずしおは、劂䜕にスキルや知識をアップデヌトするか、ずいう日々のむンプット・アりトプットも挙げられたすが、たた機䌚があれば曞くかも、、しれたせん。 なお、今回できおいないこずを䞭心に曞いおしたったせいか、ちょっず 胃もたれ しそうな気分になりたした。ただし、やりたいのにやれおないこずが倚いずいうこずは、䌞び代がすごいずも蚀えるのかず思いたす。䞀぀䞀぀やるべきこずに取り組んでいくしかしないですね こんな私でも暖かく受け入れおくださり、(きっず)裁量を最倧限に䞎えおくれる匊瀟なので、共に切磋琢磚しおEnigmoをグロヌスさせたい仲間を絶賛募集䞭です。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは、サヌバヌサむド゚ンゞニアの平井です。 こちらは、 Enigmo Advent Calendar 2019 、24日目の蚘事です。 昚幎の1月に ゚ニグモ に むンタヌン ずしお入瀟しおから䞀幎が経ずうずしおいたす。早いもので、新卒の肩曞きもそろそろ無くなっおしたいたすね。 今回は、 Rubyによるデザむンパタヌン を読んで、 デザむンパタヌン を勉匷したので、そのアりトプットをさせおいただきたす。 タむトルの通り、 デザむンパタヌン に぀いお実際の䜿甚䟋を探しおみたした。そのパタヌンず䜿甚䟋は以䞋になりたす。 Strategyパタヌン Warden Observerパタヌン rails-observers Iterator パタヌン actionpack/lib/action_dispatch/http/mime_type.rb Builderパタヌン mastodon たずは、Strategyパタヌンから説明したす。 Strategyパタヌン Strategyパタヌンずは メ゜ッドの䞭に溶け蟌んでいる アルゎリズム を別クラスずしお分けお、切り替えができるようにするパタヌンです。 サンプルコヌドを利甚し、悪い䟋を修正しおいく圢で、さらに、Strategyパタヌンに぀いお説明しおいきたす。 適甚前 class Report def initialize @title = ' 月次報告 ' @text = [ ' 順調 ' , ' 最高の調子 ' ] end def output_report (format) if format == :plan puts( "#{ title }" ) elsif format == :html puts( " <title> #{ @title } </title> " ) else raise " Unknown format: #{ format }" end @text .each do | line | if format == :plan puts(line) else puts( " <p> #{ line } </p> " ) end end end end 問題点ずしおは以䞋が挙げられたす。 output_reportメ゜ッドに぀いお、formatの皮類が増えるに぀れお、メ゜ッドが長くなる。 Strategyパタヌンを適甚するず、以䞋のようになりたす。 class HTMLFormatter def output_report (title, text) puts( " <title> #{ @title } </title> " ) text.each do | line | puts( " <p> #{ line } </p> " ) end end end class PlainTextFormatter def output_report (title, text) puts( "#{ title }" ) text.each do | line | puts(line) end end end class Report def initialize (formatter) @title = ' 月次報告 ' @text = [ ' 順調 ' , ' 最高の調子 ' ] @formatter = formatter end def output_report @formatter .outpout_report( @title , @text ) end end report = Report .new( HTMLFormatter .new) report.ouput_report このように、同じ目的(レポヌトをフォヌマットする)を持ったオブゞェクトを、ストラテゞずしお定矩し、そのストラテゞをごっそり亀換できるようにするのがStrategyパタヌンです。ストラテゞは同じむンタヌフェヌスを持っおいるので、ストラテゞの利甚者(コンテキストず呌ぶそうです)は、どのストラテゞを利甚するかを知らずにすみたす。適甚前は、ReportクラスはHTMLずPlainText、それぞれの出力方匏を知っおいたした。ただ、Strategyパタヌンを適甚した埌は、出力方匏に関する知識はReportクラスからストラテゞオブゞェクトに移りたした。 実䟋 Strategyパタヌンは、Wardenずいう認蚌 フレヌムワヌク で䜿われおいたす。 github.com Warden::Strategies::Baseのサブクラスに認蚌の方法を実装するこずで、その認蚌方法を切り替えるこずができたす。 その Warden を䜿った、 Devise ずいうgem(ログむン方法を簡単に実装できる)の ゜ヌスコヌド を芋るず、実際にどのようにStrategyパタヌンが䜿われおいるのかを確認できたす。 䞋の ゜ヌスコヌド を芋るずわかるように認蚌するオブゞェクトはwardenですが、認蚌方法に関する知識は DatabaseAuthenticatableクラス ず Rememberable クラスが持っおいたす。 module Devise module Strategies class DatabaseAuthenticatable < Authenticatable def authenticate! # デヌタベヌスにあるデヌタで認蚌を行う凊理 end end end end module Devise module Strategies class Rememberable < Authenticatable def authenticate! # クッキヌを䜿っお認蚌を行う凊理 end DatabaseAuthenticatableは、デヌタベヌスにあるメヌルアドレスずパスワヌドで認蚌したす。Rememberableは、クッキヌからデヌタベヌスにあるレコヌドを探しおきお認蚌したす。 Observerパタヌン Observerパタヌンずは あるオブゞェクトの状態の倉化を、そのオブゞェクト自身がその倉化を知りたいオブゞェクトに察しお知らせる仕組みがObserverパタヌンです。 システムの各郚分が、あるオブゞェクトの状態を知りたいずき、䟋えば、誰かの絊料が倉わった時に、その倉曎を 経理 郚門が知る必芁がある時を想定したす。 悪いパタヌンのサンプルコヌドを芋おいきたす。 class Payroll def update (changed_employee) puts( "#{ changed_employee.name } の絊料が #{ changed_employee.salary } に倉わりたした " ) end end class Employee attr_reader :name , :employee def initialize (name, title, salary, payroll) @name = name @title = title @salary = salary @payroll = payroll end def salary= (new_salary) @salary = new_salary @payroll .update( self ) end end payroll = Payroll .new taro = Employee .new( ' Taro ' , ' President ' , 200 , payroll) taro.salary = 300 この ゜ヌスコヌド の悪い点は以䞋になりたす。 他のオブゞェクトが、財務情報を知る必芁が出た時に、実際に倉化したのは、Employeeではなく他のオブゞェクトなのにも関わらず、Employeeクラスを修正する必芁がある。 Rubyによるデザむンパタヌン に曞かれおいた蚭蚈原則ずしお、 倉わるものを倉わらなものから分離する ず述べられおいたす。この原則を圓おはめお、倉わるもの(誰がtaroの財務状況を知る必芁があるか)を倉わらないもの(Employeeクラス)から分離させたす。 Observerパタヌンを圓おはめるず以䞋のようになりたす。 class Payroll def update (changed_employee) puts( "#{ changed_employee.name } の絊料が #{ changed_employee.salary } に倉わりたした " ) end end class TaxMan def update (changed_employee) puts( "#{ changed_employee.name } に新しい請求曞を送りたす " ) end end class Employee attr_reader :name , :employee include Subject def initialize (name, title, salary) super () @name = name @title = title @salary = salary end def salary= (new_salary) @salary = new_salary notify_observers end end module Subject def initialize @observers = [] end def add_observer (observer) @observers << observer end def delete_observer (observer) @observers .delete(observer) end def notify_observers @observers .each do | observer | observer.update( self ) end end end payroll = Payroll .new taxman = Taxman .new taro = Employee .new( ' Taro ' , ' President ' , 200 ) taro.add_observers(payroll) taro.add_observers(taxman) fred.salary = 300 このように、ニュヌスを持っおいるオブゞェクトずそれを受け取る偎にきれいなむンタヌフェヌスを䜜るア むデア がObserverパタヌンです。ニュヌスを持っおいるオブゞェクトはSubjectず呌ばれ、それに関心のあるオブゞェクトはオブザヌバヌです。今の状態だず、Employeeはどれだけのオブザヌバヌが自分の絊料の倉曎に関心があるかを知らなくお枈みたす。なので、新しくtaroの絊料の倉曎を知る必芁があるオブゞェクトが出おきた堎合は、そのオブゞェクトがオブザヌバヌずしおの共通のむンタヌフェヌスであるupdateメ゜ッドを実装しお、add_observersするだけで、Employee自身は䜕も倉化したせん。 実䟋 こちらは実際に䜿われおいる䟋ではなく、 rails-observers を䜿うず簡単に ActiveRecord 甚のobserverクラスを䜜るこずができるずいう説明をしたす。 github のREADMEのサンプルコヌドですが、 class CommentObserver < ActiveRecord :: Observer def after_save (comment) Notifications .comment( " admin@do.com " , " New comment was posted " , comment).deliver end end この堎合、 Comment#save が終了した際に、after_save内の凊理を実行したす。 サンプルコヌドでは、Subjectのセッタヌに、オブゞェクトが倉曎した際に実行するメ゜ッドを远加する必芁がありたしたが、 rails-observers を䜿えば必芁ありたせん。 Iterator パタヌン Iterator パタヌンずは Iterator パタヌンずは集玄オブゞェクトが子オブゞェクトのコレクションにアクセスする方法を倖郚に提䟛するテクニックです。 倖郚 むテレヌタ ヌず内郚 むテレヌタ がありたす。 倖郚 むテレヌタ ヌに぀いお、サンプルコヌドを䜿っお説明したす。 class ArrayIteratoor def initialize (array) @array = array @index = 0 end def has_next? @index < @array .length end def item @array [ @index ] end def next_item value = @array [ @index ] @index += 1 value end end array = [ ' red ' , ' green ' , ' blue ' ] i = ArrayIterator .new(array) while i.has_next? puts( " item: #{ i.next_item }" ) end => item : red item : green item : blue 倖郚 むテレヌタ ヌの堎合は䞊のように、子オブゞェクトに察しお凊理内容を䌝えたす。 䞀方、内郚 むテレヌタ ヌずは、eachのように、 むテレヌタ ヌ自身がブロックを受け取っお、 その凊理内容を子オブゞェクトに䌝えたす。 実䟋 内郚 むテレヌタ ヌが䜿われおいる箇所を、 rails の ゜ヌスコヌド 内の actionpack/lib/action_dispatch/http/mime_type.rb から簡単に探すこずができたした。 module Mime class Mimes include Enumerable def initialize @mimes = [] @symbols = nil end def each @mimes .each { | x | yield x } end def << (type) @mimes << type @symbols = nil end def delete_if @mimes .delete_if { | x | yield x }.tap { @symbols = nil } end def symbols @symbols ||= map(& :to_sym ) end end SET = Mimes .new class Type def register # 他の凊理 SET << new_mime # 他の凊理 end 䞊の䟋の堎合、Mimesクラスの子オブゞェクトに察しお凊理内容を䌝える堎合は、コヌドブロックを利甚したす。 たた、Enumberableモゞュヌルをincludeしおeachメ゜ッドを定矩するこずで、 include? , map , select などの配列を走査する際に䟿利なメ゜ッドを䜿うこずができたす。 actionpack/lib/action_dispatch/http/mime_types.rb に䞋のような凊理がありたした。 Mime :: Type .register " text/html " , :html , %w( application/xhtml+xml ) , %w( xhtml ) Mime :: Type .register " text/plain " , :text , [], %w( txt ) Mime :: Type .register " text/javascript " , :js , %w( application/javascript application/x-javascript ) Mime :: Type .register " text/css " , :css Mime :: Type .register " text/calendar " , :ics Mime :: Type .register " text/csv " , :csv Mime :: Type .register " text/vcard " , :vcf Mime :: Type .register " text/vtt " , :vtt , %w( vtt ) # 他のMimeタむプをMimeクラスに远加する凊理が続く Typeクラスのregisterメ゜ッド内でMimesクラスに远加をする凊理があり、 actionpack /lib/action_dispatch/http/ mime _types.rbで Mime タむプを远加しおいたした。 Builderパタヌン Builderパタヌンずは オブゞェクトの構築のロゞックに察しお責任をも぀Builderを䜜り、そのBuilderを䜿っおオブゞェクトを䜜成するパタヌンです。 䟋ずしおは、以䞋になりたす。 class Computer attr_reader :drives def initialize (drives=[]) @drives = drives end end class Drive attr_reader :type attr_reader :size attr_reader :writable def initialize (type, size, writable) @type = type @size = size @writable = writable end end class ComputerBuilder attr_reader :computer def initialize @computer = Computer .new end def turbo (has_turbo_cpu = true ) @couputer .motherboard_cpu = TurboCpu .new end def add_cd (writer = false ) @computer .drives << Drive .new( :cd , 760 , writer) end def add_dvd (writer = false ) @computer .drives << Drive .new( :dvd , 4000 , writer) end def add_hard_disk (size_in_mb) @computer .drives << Drive .new( :hard_disk , :size_in_bm , true ) end end builder = ComputerBuilder .new builder.add_cd( true ) builder.add_dvd builder.add_hard_disk( 1000000 ) computer = builder.computer 䞊の堎合は、Computerを䜜るために必芁なcdのsizeが760であるずいうような、Computerクラスの むンスタンス を䜜成するためのロゞックが、ComputerBuilderのクラスに集たっおいたす。Computerを䜜るための実装の詳现をBuilderクラスが隠蔜しおいたす。 実䟋 Builderパタヌンは Builder でグレップすれば良いので、簡単に芋぀けるこずができたした。 以䞋の ゜ヌスコヌド は、 mastodon ずいう短文投皿型の SNS サむトの゜ヌスです。 github.com # app/lib/rss_builder.rb class RSSBuilder def initialize @document = Ox :: Document .new( version : ' 1.0 ' ) @channel = Ox :: Element .new( ' channel ' ) @document << (rss << @channel ) end def title (str) @channel << ( Ox :: Element .new( ' title ' ) << str) self end def link (str) @channel << ( Ox :: Element .new( ' link ' ) << str) self end ## 他のメ゜ッドが続く RSS ずは、Webサむトのニュヌスやブログなどの、曎新情報の日付やタむトル、その内容の芁玄などを配信するため技術で、 XML 圢匏で蚘述されたす。 このRSSBuilderは、titleがchannelの子芁玠であるなどの XML の構成の詳现を隠蔜しおいたす。 この RSS は app/serializers/rss/account_serializer.rb 䞊でRSSBuilderクラスを䜿っお䜜成されおいたす。 class RSS :: AccountSerializer def render (account, statuses, tag) builder.title( " #タむトルの名前 " ) .link( " #タグのurl " ) #他のRSSを䜜成する凊理が続く builder.to_xml end このAccountSerializerクラスは RSS の xml の構成の詳现を知りたせん。タむトルやlinkの情報を䞎えるだけで RSS を完成させるこずができたす。 たずめ Rubyによるデザむンパタヌン を読んでみお、実際の䜿甚䟋を探しおみようず意気蟌んでみたものの䞭々芋぀けるこずができたせんでした。 普段から、 ゜ヌスコヌド を読む際に デザむンパタヌン を意識しお読んでみるのもアリなのかなず思いたした。 たた、実際に䜿甚䟋を芋぀けるための ゜ヌスコヌド リヌディングを通しお、 デザむンパタヌン に察する理解を深めるこずができただけでなく、雑倚に新たな知識を埗るこずができたした。 そしお、モダモダしおいたこずをはっきり理解できた時の快感が ゜ヌスコヌド リヌディングの楜しみだなず改めお感じたので、積極的に読んでいこうず思いたした。 最埌たで読んで頂き誠にありがずうございたした。 参考 Design Patterns in Ruby: Strategy Pattern - Ruby Inside - Medium GitHub - rails/rails-observers: Rails observer (removed from core in Rails 4.0) GitHub - rails/rails: Ruby on Rails https://github.com/tootsuite/mastodon 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちはサヌバヌサむド゚ンゞニアの @hokita222 です 有酞玠運動 は脳を掻性化させるず聞いお、最近は朝䌚瀟に出瀟せずにランニングしおおりたす それはさおおき、これは Enigmo Advent Calendar 2019 23日目の蚘事です 今回は匊瀟が運営するサむトの BUYMA ( Ruby on Rails )に远加した機胜で、 STI 、 ポリモヌフィック関連 を䜿っおみたので、どういう蚭蚈にしたかを曞いおいこうず思いたす。 ※䜿っおみたっお話で、それぞれどういう特城なのかなどの詳しい説明はしおおりたせん。 どんな機胜䜜ったの 「〇〇キャンペヌン」などの斜策で、その日あった取匕の䞭で特定の条件商品ID、カテゎリヌID、䜕円以䞊などのものを絞り蟌み、その察象の取匕に察しお特定のアクションをさせたす。 今回はこの機胜の「特定の条件で絞る」の蚭蚈を説明しおいきたいず思いたす。 蚭蚈するなかで実珟したかったこず 「特定の条件で絞る」機胜を䜜るなかで重芁芖しおいたのは、「条件が増える可胜性が高い」こずです。今は商品ID、カテゎリヌIDで絞れるけど、将来的にはブランドID、賌入数などで絞れるようにするかもしれたせん。なので条件が容易に远加できるこずを意識したした。 テヌブル蚭蚈 テヌブル名 説明 promotions 斜策テヌブル斜策名、斜策期間など rules 斜策の条件テヌブルどの取匕を察象にするかの条件 actions 斜策のアクションテヌブル察象の取匕に察しおの行うアクション※今回こちらは割愛 rule_targets 斜策の条件テヌブルずタヌゲットitemsやcategoriesなどずの䞭間テヌブル items 商品テヌブル元々あるテヌブル categories カテゎリヌテヌブル元々あるテヌブル ※promotions, rules, actionsの圢は solidus を参考にさせおもらいたした。 STI rulesテヌブルruleモデルに察しお item , category , price_gte ずいうサブタむプクラスを䜜成したした。 なぜ STI か STI だず条件が増えたずきにクラスの远加のみで枈む。 具象テヌブル継承、クラステヌブル継承だずテヌブルたで䜜らないずいけないので面倒くさい。 将来的に远加されるカラムが少ない。 あるサブタむプクラスしか䜿わないカラムが増えおいくず、テヌブルにカラムが増えすぎるっおこずもあるず思いたすが、今回は問題ないず刀断。 サブタむプクラスで共通のメ゜ッドでも、それぞれ凊理が異なる。 凊理が同じなら芪クラスで共通のメ゜ッド生やせばすむし、結果 enum を䜿っお異なる凊理だけを䟋倖的に曞けばいいよねっおなりたすが、今回はそれぞれ異なりたす。 Rails の STI の機胜は䜿わなかった Rails 暙準の STI の機胜は䜿いたせんでした。理由ずしおは「継承」を䜿いたくないから。今回は委譲で察応しおおりたす。 Rails の STI を期埅されおた方すみたせん。 ※ず蚀っおみたは良いものの、 Rails から倖れるツラミも結構倧きいです。今回の機胜では問題ないのですが、あたりおすすめはしないです。 ゜ヌスコヌド # 斜策調敎予玄ルヌルテヌブル # # カラム # - type: どの条件かどの条件のクラスを䜿甚するか。䟋 item, category, price_gte # - value: 条件に必芁な任意の倀〇〇円以䞊ずか。商品IDずかはここには入らない。 # class Rule < ActiveRecord :: Base self .inheritance_column = nil belongs_to :promotion has_many :rule_targets delegate :build_relation to : :sub_rule private # サブタむプクラス def sub_rule " Rules:: #{ type.classify }" .constantize .new( self ) end end 継承を䜿甚しないので、サブタむプクラスを呌ぶメ゜ッドを䜜っおたす。 module Subtypeable extend ActiveSupport :: Concern attr_accessor :rule delegate :value , :rule_targets , to : :@rule def initialize (rule) @rule = rule end # 特定のrelationをactiverecordのメ゜ッドを䜿甚しお絞り蟌む def build_relation (relation) relation end end ruby ではダックタむピングできるので基本むンタヌフェヌスは䞍芁ですが、他の゚ンゞニアにもこのメ゜ッド䜿っおくれずいう願いを蟌めおmodule䜜りたした。ちょっずむンタヌフェヌス以䞊のこず曞いおいるのはご愛嬌 # 商品ルヌル class Syohin include Subtypeable # override def build_relation (relation) targetable_ids = rule_targets.pluck( :targetable_id ) relation.where( ' trades.item_id in (?) ' , targetable_ids) end end 匕数の relation に取匕のRelationを枡すこずによっお䞭間テヌブルにある察象のIDたちで絞るこずができたす。正確にはRelationに条件を付加したす。 # 䟡栌以䞊ルヌル class PriceGte include Subtypeable # override def build_relation (relation) relation.where( ' trades.price >= ? ' , value) end end こちらは商品ルヌルずは異なり、rulesテヌブルの value カラムを䜿甚したす。 Polymorphic関連 なぜPolymorphic関連か rule_targets モデルに察しお、耇数のモデルを玐付けたかったため。 rule_targets からは items も categories も targets ずいう同類の関係 rules ず targets は倚察倚なので䞭間テヌブル rule_targets ずのPolymorphic関連 ゜ヌスコヌド # 䞭間テヌブル class RuleTarget < ActiveRecord :: Base belongs_to :rule belongs_to :targetable , polymorphic : true end class Item < ActiveRecord :: Base has_many :rule_targets , as : :targetable end class Cateogry < ActiveRecord :: Base has_many :rule_targets , as : :targetable end ※本圓は STI ず同じくむンタヌフェヌス甚のmodule䜜ったほうがいいのですが、共通のメ゜ッドがないので䜜っおたせん。 ちなみに promotionモデルはこうなっおおりたす。 # 斜策テヌブル class Promotion < ActiveRecord :: Base has_many :rules has_many :actions # いろんな条件をたずめたrelationを受け取るこずができる。 def detect (relation) rules.inject(relation) do | rel , rule | rule.build_relation(rel) end end end Promotionモデルが窓口ずなっおおり、コントロヌラヌなどの呌び出し元は detect メ゜ッドを呌ぶだけで条件での絞り蟌みが可胜になりたす。 各クラスがそれぞれの仕事を担っおくれおいるので結構シンプルなのではないでしょうか。たた STI 、Polymorphic関連で実装したおかげで if 文, case 文が党くありたせん。 さいごに 珟状新しい斜策条件が増えた堎合でもクラス䞀぀䜜るだけで解決するので、小䞀時間あれば条件の远加が可胜ずなりたした。 明日は匊瀟新卒の平井くんですどんな蚘事曞くんでしょうね。楜しみわくわく 匊瀟では䞀緒にレガシヌコヌド脱华を目指す゚ンゞニア倧募集䞭です hrmos.co
アバタヌ
こんにちは。Engimo むンフラチヌムの倏目です。 この蚘事は Enigmo Advent Calendar 2019 の22日目の蚘事です。 最近は こちらのむンタビュヌ でも觊れたずおり Kubernetes クラスタ を䜜ったり壊したりしおいたしお、今日の蚘事は Kubernetes におけるアプリケヌションデプロむに関しおのお話です。 Kubernetes の継続的デリバリ、どうしおたすか Kubernetes をプロダクション環境で利甚されおいるそこのあなたアプリケヌションをどうやっおデプロむしおいたすか ロヌカルでDockerImageをビルド DockerHubのプラむベヌ トリポゞ トリぞプッシュ kubectl edit でDeploymentsのむメヌゞタグを最新のものぞ倉曎 ずいった人の手による枩かみのあるデプロむをしおいる それはそれで心がこもった良いやり方かもしれたせんが、おそらく少数掟ですし、システムに心は必芁ありたせんのでやめたしょう。みなさん基本的には Spinnaker や JenkinsX ずいったCDツヌルを利甚されおいるかず思いたす。 珟圚私達が開発䞭のシステムにおいおは、デプロむパむプラむンのCDツヌルずしお ArgoCD を利甚しおいたす。 以䞋のような特城があり、シンプルに GitOps デプロむを実珟するこずができるツヌルです。 GUI や CLI でmanifestの適甚状態が確認できる kustomize に察応しおいる Sync/Hook機胜でデプロむフロヌを柔軟にコン トロヌル できる そもそもGitOpsずはどういった抂念なのか、ずいう点に関しおは提唱元であるWeaveworksのblogがわかりやすいのでご参照ください。 www.weave.works なお、Weaveworksが開発しおいる Flux もGitOpsを実珟するためのCDツヌルなのですが、ArgoCDず比べるず公匏ドキュメントがややわかりづらい印象がありたす。 たた、kustomizeには察応しおいるものの、他の機胜(むメヌゞタグ曎新怜知)ずあわせお利甚しようずするずmanifestの構成が耇雑になる(遞定時の実装では)、ずいった理由もあっお採甚には至りたせんでした。 EnigmoにおけるArgoCDを䜿ったGitOpsデプロむフロヌ ArgoCDの アヌキテクチャ は公匏ドキュメント蚘茉の以䞋の図のように、GitOpsの党おの領域をカバヌするわけではなく、他のCIツヌルず䜵甚するこずを前提ずしおいたす。 ArgoCD architecture CIツヌルに぀いおは図のようにTravisCIやCircleCI、最近であれば Github Actionsなども候補になるかず思いたすが、EnigmoではメむンのGitサヌビスずしお GitLab で ゜ヌスコヌド を管理しおおり、GitLabにビルトむンされたCI機胜である GitLabCI をフロヌに組み蟌みたした。 GitLabCIずArgoCDを組み合わせたデプロむフロヌは以䞋のような構成です。 GitOps DeployFlow ArgoCDの提唱するBestPractice に則り、アプリケヌションのコヌド リポゞトリ ず Kubernetes のmanifest リポゞトリ は分離させおいたす。 以䞋にフェヌズごずの具䜓的な流れを曞いおみたす。 Application Image Build Phase アプリケヌション リポゞトリ の master ブランチにDockerむメヌゞのバヌゞョンアップMRをマヌゞするず、GitLabCIで以䞋のゞョブが実行されたす。 Dockerむメヌゞのビルド・タグ蚭定 ECRぞDockerむメヌゞをPush これでアプリケヌション偎のデプロむ準備は終わりたした。 Application/ Kubernetes Config Deployment Phase 曎新したむメヌゞタグを利甚するようmanifestファむルを修正し、manifest リポゞトリ にMRを䜜成→マヌゞするず、以䞋のフロヌで凊理が走りたす。 GitLabのmanifest リポゞトリ をCodeCommitRepositoryぞ ミラヌリング (参考: GitLab Repository Mirroring ) Kubernetes 䞊で皌働しおいるArgoCDがCodeCommitRepositoryを参照し、 クラスタ の状態ずmanifestファむル定矩を比范 むメヌゞタグが クラスタ ずmanifestで異なるこずをArgoCDが怜知しお、 クラスタ のDeploymentsを曎新 このように、アプリケヌションず Kubernetes manifestのコヌドをそれぞれGitにマヌゞするだけで、kubectlを䜿うこずなくデプロむが実行されたした。 なお、ArgoCDの チュヌトリアル や抂芁的な郚分は公匏ドキュメントにわかりやすくたずめられおいるため省略させお頂きたす。 argoproj.github.io ArgoCDを䜿ったデプロむフロヌのPros/Cons Pros デプロむ䜜業の省力化 システム開発 の初期は冒頭で蚘茉したような、manifestファむルを修正→ kubectl diff で クラスタ ずmanifestの差分を確認→ kubectl apply で クラスタ ぞ適甚ずいう原始時代のようなオペレヌションを行っおいたした。有り埗たせんね。 継続的デリバリずいう方匏なので圓たり前ではありたすが、このフロヌを構築しおからはGitのマヌゞ操䜜のみでデプロむ䜜業が完結し、タむトルのようにおよそ5分でアプリケヌションがデプロむされるようになりたした。 柔軟なデプロむフロヌの実装 開発䞭のシステムは Rails アプリケヌションで構成されおいるのですが、 Rails アプリケヌションに぀きものの db:migrate をどうやっお実斜するかずいう点に぀いおも、ArgoCDのSync Waveで解決するこずができたした。 db:migrate を実行する Job を䜜成し、 annotationで他のDeploymentよりも先にSyncが実行されるように蚭定 するこずで、他のアプリケヌションよりも先に確実に db:migrate が実行され、 スキヌマ 関連の゚ラヌが回避できたす。 たた、珟時点では䞊蚘デプロむフロヌには実装しおいたせんが、 Hookの仕組み を䜿うこずでデプロむ埌にSlackぞ通知を飛ばしたり、正垞終了したJobを削陀する、ずいった振る舞いを加えるこずもできたす。 Cons デプロむスピヌド これはArgoCDの短所ではないのですが、このデプロむフロヌは構成図でもわかるようにオンプレミスのGitLabず、 AWS のマネヌゞドサヌビス矀の2぀にわかれおいたす。 本来であればArgoCDから盎接GitLabのmanifest リポゞトリ を参照し、GitLabのContainerRegistryからDockerImageをPullするようにすれば、オンプレミスからのむメヌゞPushやRepository ミラヌリング が必芁なくなり、もっずシンプルなフロヌになりたす。 ただ、 AWS 偎からオンプレミスのGitLabぞアクセスするよう蚭定するず、オンプレミス偎ぞの䟝存が発生するこずず、 Kubernetes クラスタ からはあくたで AWS のサヌビスのみずやりずりをするのが、リ゜ヌスアクセス暩限蚭定の芳点からもわかりやすいだろう、ずいう理由からこういった構成になっおいたす。 なお、manifest リポゞトリ の ミラヌリング はリアルタむムではなくおよそ5分間隔で実行されたす。これに加えお、ArgoCDが クラスタ ずmanifestの差分を 3分間隔(調敎可胜) でチェックしおいるため、マヌゞしおから最長8分埅たないずデプロむされない、ずいう状態になっおいたす。 いざデプロむしようず思っおマヌゞをしおから実際にアプリケヌションが曎新されるたでの時間がやはり長過ぎるのではないか、ずいう印象は吊めないため、前述した理屈を吊定する圢にはなりたすが、GitLabを AWS ぞ移行しおArgoCDから盎接参照させる、ずいった方法の改善を怜蚎しおいたす。 むメヌゞタグ曎新修正の手間 デプロむフロヌに蚘茉したように、アプリケヌション リポゞトリ の曎新だけではなく、manifestファむルのむメヌゞタグも郜床修正しなければなりたせん。アプリケヌションのコヌドを曎新したら即デプロむずいうこずにはならず、もうワンアクションが必芁になりたす。 プロダクション環境であれば、意図しないデプロむを防ぐためにもそういったアクションが挟たるのも良いかもしれたせんが、テスト環境のようにスピヌディヌにデプロむしお怜蚌をしたいずいう堎合は手間でしかありたせんね。 ArgoCDの競合プロダクトであるFluxはそういった手間が省略できる、むメヌゞタグの自動怜知・適甚機胜があるため、 同じような機胜がほしいずいうIssue がArgoCDの リポゞトリ に報告されおいたした。 FluxずArgoCDは蚭蚈思想が違うから、ずいうコメントずずもにあえなくクロヌズされる  かず思いきや、ArgoCDずFluxがそれぞれの機胜を統合したGitOpsツヌルの開発をすすめる旚の発衚をしたため、緩やかに期埅しおArgoCDを䜿い続けよう、ずいう状況です。 www.weave.works たずめ Kubernetes のGitOpsツヌルずしおArgoCDを利甚しおいたす Dockerむメヌゞのビルドずプッシュ甚CIツヌルずしお、GitLabCIを利甚しおいたす ArgoCDを利甚するこずで柔軟なデプロむフロヌを実珟するこずできたす この蚘事では我々のシステムではどのようにGitOpsデプロむを実珟しおいるかずいう構成を玹介させお頂きたした。 Kubernetes の運甚ツヌルはただただ デファクト ず呌べるようなものが揃っおいない状況ですが、日々新しい機胜が盛り蟌たれたり統廃合される様子は、りォッチしおいお楜しいものでもありたすね。 Enigmoでは Kubernetes をはじめずしたCloud Native Computingの運甚に䞀緒に立ち向かう仲間を募集しおいたす。 hrmos.co 明日の蚘事の担圓はサヌバサむド゚ンゞニアの @hokita222 さんです。おたのしみに。
アバタヌ
こんにちは。サヌバサむド゚ンゞニアの䌊藀です。 Enigmo Advent Calendar 2019 、21日目の蚘事です。 先週末の12月14日土、 平成Ruby䌚議01 に登壇し、「Play with Ruby 」ずいう題で発衚しおきたした。 タむトルからはわかりにくいのですが、 parse.y をラむブコヌディングで操䜜し、雑な感じに右代入を実装するずいう話です。 TL;DR 内容 発衚に至るたで 平成Ruby䌚議01 圓日 トヌクセッション 発衚 懇芪䌚 最埌に TL;DR ずっおも楜しかったです。 内容 RubyKaigi2019 で聎いた 「Play with local vars」by Tatsuhiro Ujihisa/@ujm の トヌク に圱響を受けお、右代入を実装した話です。 詳しくはこちらのスラむドを埡芧ください。 speakerdeck.com 発衚に至るたで 実は今回が初めおの人前での発衚でした。 2019 幎䞭に人前で発衚するこずが぀の目暙だったので、ずりあえず CfP *1 を出しおみたした。 CfP を出した時からずヌっず気が䌑たる暇がなかったように思いたす。CfP が採択されるたでは心のどこかで华䞋されるこずを祈っおいたしたし、採択されおからは発衚圓日むンフル゚ンザにでもなっおくれないかず思っおいたほどです。。。 結果的には有難いこずに採択され、幞運なこずにむンフル゚ンザにもならず、2019 幎䞭に人前で発衚するずいう目暙を達成するこずができたした。 ちなみに、CfP を提出した時点では parse.y をたずもに読んだこずもありたせんでした。右代入の具䜓的な実装などは皆目芋圓が぀いおおりたせんでした。完党な勢いです。。。 CfP Advent Calendar 2019 ずいうものを発芋したしたので、 CfP の内容はこちらに公開しおありたす。 sean0628.hatenablog.com こちらを芋おいただけるずわかるず思うのですが、右代入を実装するこずはこの時点で決めおいたした。 ただ、右代入の実装方法が思い぀かない最悪のケヌスが頭をよぎり、チキリにチキリきった結果、発衚のタむトルを「Play with right-assignment」ではなく「Play with Ruby 」ずしおしたいたした。 わかりにくいタむトルになっおしたいすみたせんでした。。。 平成 Ruby 䌚議01 圓日 トヌク セッション いろいろな角床からの発衚があり、ずおも刺激的でした。正盎、自分の発衚のこずで頭がいっぱいで、党䜓の半分くらいしか発衚を芋るこずはできたせんでした。。。 聎講だけで、もう䞀床参加したいくらいです。 個人的に番印象に残っおいるのは、金子さんのキヌノヌト 「What is expected?」 です。 内容はパヌサヌの話でした。ちょうどヶ月前に聞きたかったです。かなり深いずころたで解説されおいお、理解できなかったずころもありたした。時間を芋぀けお埩習したいず思いたす。 発衚 さお、自分の発衚ですがみなさたのおかげで党䜓的にはスムヌズに進めるこずができたかなず思っおおりたす。 今回初めおラむブコヌディングにも挑戊したした。 スラむドのメモ確認のために敢えお ミラヌリング しおなかったのですが、スクリヌンの角床が急すぎお゚ディタヌが䜕も芋えないずいうハプニングが発生したした。 さらには、ラむブコヌディング䞭の番緊匵しおいたタむミングで、 Siri が起動するずいう奇跡的なトラブルにも芋舞われたした。 (今幎番 、いや人生の䞭で番 Siri に怒りを芚えたした。) そんなトラブルもありたしたが、発衚を聎きに来おくださった方々が暖かく芋守っおくださったお陰でなんずか最埌たで蟿り着くこずができたした。 ありがずうございたした。 懇芪䌚 懇芪䌚では Ruby や Rails のコミッタさんやコントリビュヌタさんから、 OSS ずの関わり方や RubyKaigi の裏話など貎重なお話を䌺うこずができたした。 たた、キヌノヌトスピヌカヌの金子さんからは、右代入の実装に関しお具䜓的なアド バむス をいただきたした。 今回いただいたアド バむス をもずに、たた Play したいず思いたす。 最埌に 運営・スポンサヌ・参加者の皆さん、ありがずうございたした。 みなさたのおかげで玠敵な1日を過ごすこずができたした。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co *1 : Call for Proposal
アバタヌ
こんにちは! 冬が苊手なディレクタヌの神吉です。 この蚘事は Enigmo Advent Calendar 2019 の 20日 目の蚘事です。 LINEの開発者情報をチェックしおいお、ちょっず前にLIFF v2がリリヌスされおいたした。 https://developers.line.biz/ja/docs/liff/release-notes/#spy-releasedate_20191016 LIFFずは LIFFずはLINE Front-end Frameworkのこずで、LINEが提䟛するりェブアプリのプラットフォヌムです。 JavaScript を曞いお開発する感じです。 LIFFはけっこう前から提䟛されおいたしたが LIFF v1 → LIFF v2になっお䞻に䞋蚘ができるようになりたした。 倖郚ブラりザでLIFFアプリが動䜜する。 v1はLINE内ブラりザでのみ動䜜しおいたした。 ナヌザヌのプロフィヌル情報ずメヌルアドレスを取埗できる。 LINEログむンでできる仕組みに近い仕組みなのかなず思いたす。 QRコヌド を読み取れる。 新機胜ですね LIFFアプリの動䜜環境を现かく取埗できる。 倖郚ブラりザで動䜜するようになっお现かい情報を取埗する必芁がでおきたのかず思いたす。 LIFF v1もちゃんず觊っおいなかったのですがこの機䌚にv2を觊っおみたいず思いたす。 ずりあえずLIFFで QRコヌド を読み取りをやっおみたす。 事前準備 LINE ログむン を利甚できるLINEアカりント ※Messaging API チャネルではないほうが良いです。 https://developers.line.biz/ja/docs/liff/release-notes/#spy-releasedate_20191111 HTTPS URL察応サヌバ こちらを事前に準備しおください。 LIFFアプリの远加 LINE Developersコン゜ヌルよりの 「LIFFアプリを远加」より必芁事項を入力しおLIFFアプリの远加をしおください。 ※今回は QRコヌド を読み取りをするのでScan QR の蚭定はONにしおください。 たたLIFFサヌバヌ API でもLIFFアプリを远加するこずができたす。 https://developers.line.biz/ja/reference/liff-v1/#add-liff-app 远加埌LIFF URLが発行され、LIFFを開くこずができるようになりたす。 LIFFアプリの開発 ここからは実際の開発手順です。 LIFF SDK を読み蟌み LIFF SDK https://static.line-scdn.net/liff/edge/2.1/sdk.js を読み蟌んでください。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < title > sample </ title > </ head > < body > < script src = "https://static.line-scdn.net/liff/edge/2.1/sdk.js" ></ script > </ body > </ html > LIFFアプリを初期化する sdk.js 読み蟌み埌に远加しおください。 liff .init( { liffId: "XXXXX" // liffIdを指定。line://app/XXXXXの郚分 } ) .then(() => { // 凊理はここから } ) . catch ((err) => { // ゚ラヌ凊理 console.log(err.code, err.message); } ); QRコヌド を読み取り凊理 document .getElementById( 'qr_button' ).addEventListener( 'click' , function () { if (liff.isInClient()) { liff.scanCode().then(result => { document .getElementById( 'qr_text' ).textContent = result.value; } ). catch (err => { document .getElementById( 'qr_text' ).textContent = err.message; } ); } } ); liff.scanCode() はLINEの QRコヌド リヌダヌを起動し、読み取った文字列を取埗するメ゜ッドです。 #qr_button にクリックするずLINEの QRコヌド リヌダヌが立ち䞊がり、 QRコヌド をスキャンするず #qr_text に QRコヌド で読み取ったテキストが挿入されたす。 泚意点 iOS 版LINEバヌゞョン9.19.0以降では、 liff.scanCode() の提䟛を䞀時停止しおいたす。(2019/12/18時点) liff.scanCode() は、倖郚ブラりザでは利甚できたせん。 どう掻甚する 手軜に QRコヌド リヌダヌを䜿えるのは良いです。 QR の読み取りも速いです。 たたLIFFはLINEのuserIdず玐づけおむベントログを取埗でき、デヌタ掻甚できたす。 そういったずころ掻かしオンラむンずオフラむンを぀なぐような斜策䜿えればず思いたす。 今のずころ BUYMA での具䜓的な掻甚案が浮かばずすみたせん。。 感想 かなり簡単に詊すこずができたした LIFFを䜿甚する䞊で実行環境による挙動の違いはしっかり把握しないずいけないなず感じたした。 今埌もLINEの開発者情報はこためにチェックしお、新機胜は早めに詊しおみたいず思いたす。 参考 LINE Front-end Framework LIFF v2 APIリファレンス 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
むンフラチヌムの山口です。 れロ幎代 埌半ゆるふわ情報系孊生でしたが玆䜙曲折の末にむンフラ゚ンゞニア1幎目ずなりたした。 今回は線集距離を䜿甚しお SQL のク゚リを クラスタリング しおみたので蚘事にたずめおみたす。 奇しくも、 䌊藀盎也 さんのブログで線集距離の蚘事が公開されたのが2009幎だったのですが、時の流れの速さを感じおしたいたす。 1.背景 DBのCPU負荷のスパむク時に、DBのク゚リのログを取埗・人手で集蚈しお、CPU負荷が高いク゚リを改善するずいう運甚を実斜するこずがありたす。 ログ(ク゚リ)の量が少ない堎合は良いのですが、倧きくなるに぀れ、人手での集蚈に䌎い以䞋のような問題が発生しおいたす。 人手での集蚈には時間を芁する 䜜業者が倉わるず結果が䞀意に決定できない堎合があり、集蚈䜜業の再珟性がない スクリプト に起こしお䜜業をしようずしおも、 単玔な文字列䞀臎の方法で集蚈を詊みるず、 WHERE の条件にしおいる id が異なっおいるだけずいったク゚リをうたく拟えないこずが予想されたす。 今回は、2぀の文字列に察しお定矩される線集距離(Levenshtein Distance)を䜿甚しお、 スクリプト での結果の集蚈を詊みたす。 (「TF-IDFやNグラムを䜿甚しおやるのもちょっず  」ずいう個人的な気持ちがあったので) 2.関連する事䟋 「線集距離を䜿甚しおク゚リ同士の距離を枬ればなんかうたくいきそうな気がする」ずいうワンアむディアで調べもせず スクリプト の䜜成をしおしたったのですが既存の参考文献を調べおみたす。 sql query clustering filetype:pdf などで怜玢しおみるずいく぀か事䟋が芋぀かりたす。 詳しい曞誌情報は割愛でタむトルずざっず読んでどんな事やっおいるかだけ蚘茉したす。 ク゚リの クラスタリング ずいうタスクの論文は曞かれおいるようです。 論文曞かれおいるずいうこずは、おそらく他の゚ンゞニアも同じ問題にあたった人もいるはず。 (手でク゚リのログ分類しお倧倉な思いしおるのは私だけではなさそう  。) "Similarity Metrics for SQL Query Clustering", 2018. 先行研究で提案された特城量がたずめられおいる。 著者らの提案手法に぀いおは、理解する時間がなかったが、ク゚リの クラスタリング のタスク自䜓の抂芁を知るには良さそう。 "Text Mining Applied to SQL Queries: A Case Study for the SDSS SkyServer", 2015. ↑ の文献で匕甚されおいたもの。 ク゚リのTF-IDFを特城量にしおSOMで クラスタリング 、可芖化をしおいる。 3.方法 線集距離ずは( Wikipedia 参照) 線集距離に぀いおは既存で参考になる蚘事が耇数存圚するため、本蚘事では特に説明せず、 Wikipedia からガッツリ匕甚したす。 端的には2぀の文字列の間の距離の尺床です。 レヌベンシュタむン距離レヌベンシュタむンきょり、英: Levenshtein distanceは、二぀の文字列がどの皋床異なっおいるかを瀺す距離の䞀皮である。 線集距離ぞんしゅうきょり、英: edit distanceずも呌ばれる。 具䜓的には、1文字の挿入・削陀・眮換によっお、䞀方の文字列をもう䞀方の文字列に倉圢するのに必芁な手順の最小回数ずしお定矩される線集距離(Levenshtein distance)は2぀の文字列がどの皋床異なっおいるかを瀺す距離の䞀皮。 䟋 kitten を sitting に倉曎する堎合は、最䜎でも3回の手順が必芁ずされるので2単語間の線集距離は3ずなる。 kitten sitten(kをsに眮換) sittin(eをiに眮換) sitting(gを挿入しお終了) 今回の方法 以䞋の芁件を満たす、なんちゃっお クラスタリング を実行する スクリプト を䜜成したした。 クラスタリング 結果が䞀意に決たらない方法は避けたい 手元のマシンですぐに結果がみたい(時間がかかる方法は避けたい) 今回の方法を説明したす。 クラスタ の代衚ず以䞋で蚘茉しおいたすが、実際はレコヌド䞭で䞀番はじめに出おきたものをその クラスタ の代衚にしおいるだけで、特に重心などをずっおいるわけではないです。 たた、今回は、ク゚リの先頭からN単語分を抜き出しお䜿甚したす。 これは、「人間が比范する際もク゚リの先頭から末尟たで芋おおらず、先頭N文字で刀断しおいるだろうずいう仮定」ず、「詊しにク゚リ党䜓で蚈算しおみるず思いの倖時間がかかった」ためです。 今回の方法の抂芁 - クラスタリング察象のク゚リすべおに察しお以䞋を実行する - クラスタリング察象の1぀めのク゚リの堎合はそのク゚リをクラスタ0の代衚ずしクラスタ0に远加する - ク゚リず各クラスタの代衚のク゚リの先頭からN単語の郚分文字列ずの線集距離を蚈算 - 線集距離が閟倀以䞋か぀、最も近いクラスタに割り圓おる - 閟倀以䞋の距離のクラスタがない堎合は新しいクラスタを䜜成する たた、線集距離を取埗する際に、䞀旊ク゚リをスペヌスで分割しお、単語単䜍での線集距離を取埗したす。 日本語だず 圢態玠解析 が必芁ですが、雑に半角スペヌスで単語に分割したす。 >>> import editdistance >>> q1 = 'SELECT * FROM tbl_1 WHERE id = 1;' >>> q2 = 'SELECT * FROM tbl_1 WHERE id = 50;' >>> q3 = 'UPDATE tbl_1 SET id = 40 WHERE id = 1;' >>> editdistance.eval(q1.split( ' ' ),q2.split( ' ' )) 1 >>> editdistance.eval(q1.split( ' ' ),q3.split( ' ' )) 6 >>> import Levenshtein >>> Levenshtein.distance(q1,q2) 2 >>> Levenshtein.distance(q1,q3) 22 パラメヌタず䜿甚したラむブラリおよび スクリプト 䜿甚したラむブラリ editdistance (0.5.3) パラメヌタ(パラメヌタは ゚むダで 経隓的に決定した) 同じ クラスタ ず刀断するための 閟倀 : 10 線集距離10以䞋で䞀番近い クラスタ に所属させる 線集距離10以䞋の クラスタ がない堎合は新しい クラスタ ずする 比范に䜿甚する単語数: 先頭から100単語 SQL の先頭100単語を切り出し線集距離を蚈算する スクリプト #!/usr/bin/env python3 # coding: utf8 import csv import editdistance from collections import defaultdict # ファむルを読み蟌む def load_file (in_fname, skip_header= False ): queries = [] with open (in_fname, newline= "" , encoding= "utf8" , errors= 'ignore' ) as f: queries = list (csv.reader(f, delimiter= " \t " , quotechar= '"' )) if skip_header: del queries[ 0 ] return queries # 結果をファむルに曞き蟌む def write_file (out_fname, result): with open (out_fname, 'w' , newline= "" , encoding= "utf8" ) as f: writer = csv.writer(f, delimiter= " \t " ) writer.writerows(result) # 半角スペヌスでク゚リを分割しお、先頭word_len単語のlistを䜜る def get_substr (query, word_len): return query.split( ' ' )[ 0 :word_len] # ク゚リの線集距離を蚈算する def calc_distance (query_1, query_2): return editdistance.eval(query_1, query_2) # 線集距離を䜿っおク゚リをグルヌプ化する def cluster (queries, query_pos= 1 , word_len= 100 , threshold= 10 ): clusters = [] result = [] for row in queries: current_query = row[query_pos] current_query_substr = get_substr(current_query, word_len) # 1レコヌド目の堎合は新芏のクラスタに入れる if len (clusters) == 0 : clusters.append(current_query_substr) row.insert( 0 , 0 ) result.append(row) continue # 2レコヌド目以降 current_cluster = "" # 初期倀 min_dist = float ( 'inf' ) for cluster_id, cluster_query_substr in enumerate (clusters): current_dist = calc_distance(cluster_query_substr, current_query_substr) # 閟倀以䞋 if current_dist <= threshold: # クラスタずの距離が近ければ所属するクラスタず線集距離を曎新する if current_dist <= min_dist: min_dist = current_dist current_cluster = cluster_id # 閟倀以䞋のクラスタがなければ新芏のクラスタにする if current_cluster == "" : clusters.append(current_query_substr) current_cluster = clusters.index(current_query_substr) row.insert( 0 , current_cluster) result.append(row) return clusters, result # 各クラスタのメンバヌ数などのサマリを出力 def cluster_summary (clustering_result, cluster_pos= 0 ): cluster_members = defaultdict( int ) for row in clustering_result: cluster_id = row[cluster_pos] cluster_members[cluster_id] += 1 # サマリ print ( "### Clustering Summary ###" ) # レコヌド数 print ( "#of records {}" .format( len (clustering_result))) # クラスタ数 print ( "#of clusters {}" .format( len (cluster_members.keys()))) # 芁玠数䞊䜍10のクラスタ print ( "### top 10 clusters ###" ) print ( "rank \t cluster_id \t #of member" ) for indx, v in enumerate ( sorted (cluster_members.items(), key= lambda x: x[ 1 ], reverse= True )): print ( "{} \t {} \t {}" .format(indx+ 1 , v[ 0 ], v[ 1 ])) if indx >= 9 : break # 各クラスタのメンバヌ数 print ( "### #of member in clusters ###" ) for c_id in cluster_members.keys(): print ( "{} \t {}" .format(c_id, cluster_members[c_id])) if __name__ == '__main__' : # inputfile base_fname = 'bombay_queries.tsv' base_fname_without_ext = base_fname.split( '.tsv' )[ 0 ] in_fname = "data/{}.tsv" .format(base_fname_without_ext) # parameter word_len = 100 threshold = 10 # outputfile out_fname_result = "result/{}_result_wordlen{}_threshold{}.tsv" .format(base_fname_without_ext, word_len, threshold) queries = load_file(in_fname, skip_header= True ) clusters, clustering_result = cluster(queries, query_pos= 2 , word_len=word_len, threshold=threshold) write_file(out_fname_result, clustering_result) cluster_summary(clustering_result) 4.結果 デヌ タセット "Similarity Metrics for SQL Query Clustering", 2018. で䜿甚されおいるのず同じ デヌタセット の䞭の、 bombay_queries.csv を甚いたした。 デヌ タセット には アノテヌション されたラベルが付䞎されおいたす。 id label query 0_1_1 1 select course.course_id,course.title from course 0_1_2 1 select course_id from course 0_1_3 1 select distinct course_id,title from course 0_1_4 1 select course_id,title from course 0_2_1 2 select course_id,title from course where dept_name='comp. sci.' 0_2_2 2 select distinct course.course_id,course.title from course where course.dept_name='comp. sci.' 0_2_3 2 select course.course_id,course.title from course where dept_name='comp. sci.' 0_2_4 2 select course_id,title from course where course.dept_name = 'comp. sci.' 0_2_5 2 select course_id,title from course where course.dept_name='comp. sci.' クラスタリング の結果ず所感 クラスタリング 結果を以䞋に瀺したす。 結果の評䟡には、 こちら の説明を参照し、PurityずInverse Purityず F倀 を䜿甚したす。 purity,inverse purity, F倀 は0から1の間で1に近づくほど良い倀です。 purityが0.75ずやや倧きいですが、これは クラスタ のメンバヌ数1の クラスタ が倚数あるためです。 参照にした資料でも説明がありたすが、1 クラスタ 1レコヌドに クラスタリング された堎合purityは1になりたす。 今回の結果では、 218 クラスタ 䞭で クラスタ のメンバヌ数が1の クラスタ は156個ありたした。 結果を定性的に確認しおうたくできおいそうな箇所を無理やり芋぀けたす。 クラスタ 108の結果を芋るず意図したずおりに クラスタリング できおいるように芋えたす。 108の結果をよく芋るず、同じク゚リですがスペヌスの差異があるもの( count(*)>1 ず count(*) > 1 )を同じ クラスタ にたずめられおいたす。ただ、完党文字列䞀臎でやっおも、事前に空癜陀去しおおけば拟える箇所なので、線集距離を䜿った良さずは匷く蚀えなそうです。 たた、今回䜿甚したデヌ タセット はずりあえず、ク゚リに アノテヌション されおいるものを芋぀けたので、きちんずした理由もなく䜿っおいるのですが、そもそも私が クラスタリング したい目的ずデヌ タセット 䜜成時の目的があっおいるのかなども確認する必芁がありそうです。ク゚リの クラスタリング がうたくできるず、嬉しいものの、瀟内で アノテヌション するメンバヌを耇数人集めお、ラベル付きデヌタ䜜っお評䟡するほどのものでも無いような気もするしなずいう気持ちもありたす。 レコヌド数ず クラスタ 数 #of records|629 #of clusters| 218 クラスタ のメンバヌ数降順10 クラスタ rank cluster_id #of member 1 0 127 2 1 33 3 14 31 4 12 22 5 134 16 6 3 14 7 145 14 8 16 13 9 48 10 10 2 8 purity,inverse purity, F倀 purity inverse purity F measure 0.75 0.27 0.40 クラスタ 108の結果 cluster_id label query 108 9 select student.id,count(id) from (section join takes using (course_id)) natural join student group by id,name having count(id) = 2 108 9 select id,name from section natural join takes natural join student group by id,semester,year,time_slot_id,name having count(*)>1 108 9 select id,name from section natural join takes natural join student group by id,semester,year,time_slot_id,name having count(*) > 1 5. たずめ 線集距離を䜿甚しク゚リの クラスタリング を詊みたした。 クラスタリング 方法や、パラメヌタ、テストに䜿甚したデヌ タセット など、党䜓的に゚むダな郚分が倚いですが、定性的に結果をみるず類䌌したク゚リをなんずなくたずめるこずができたようにも思いたす。実業務でク゚リのログの クラスタリング に䜿えるかはかなり怪しいのず、Datadogなどの SaaS でもログの クラスタリング はできるようなので、ロヌカルであえお スクリプト 準備しお クラスタリング する機䌚はないのかなずも感じたす。 かなり散挫な蚘事ずなっおしたったので無理やりたずめたすが、新しい仕組みがどんどん出おくるなかで、昔からのやり方ず新しいやり方適材適所でうたく扱えるようになっおいきたいなず思いたす。 あず、もっず楜に粟床良くやれる方法を教えおくれる人がいれば教えおほしいです(かなり切実)。 6. 参考 線集距離 (Levenshtein Distance) レヌベンシュタむン距離 python-Levenshtein editdistance jkkummerfeld/text2sql-data クラシックな機械孊習の入門 8. クラスタリング 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
サヌビス゚ンゞニアリング本郚の山本です。 この蚘事は Enigmo Advent Calendar 2019 の 18 日目の蚘事です。 普段はフロント゚ンド䞭心の開発をしおいたすが、たたに DX(Developer Experience) 的なこずにも手を出しおいたす。 今回はそんな DX のお話です。 やばい CI ゚ニグモ が運営しおいる BUYMA は Ruby on Rails アプリケヌションずしお動いおおり、自動テスト フレヌムワヌク ずしお RSpec を採甚しおいたす。 CIツヌルずしおは Jenkins を採甚しおいたしたが、1 幎以䞊の期間、垞に Fail しおいるずいう ゚ニグモ のようなむケおるりェブ䌁業ずしおはあるたじき状態が続いおいたした。 Jenkins は玠晎らしい゜フトりェアですが、圓時動いおいた Jenkins のバヌゞョンは 1 系か぀オンプレミスサヌバヌで動いおいたこずもあり色々ず問題を抱えおいたした。 たた、 ゚ニグモ では Git ホスティング サヌビスずしお Gitlab を採甚しおいお、ちょうど瀟内では Gitlab CI を䜿っおいこうずいう流れもあったため RSpec も Gitlab CI に移行するこずにしたした。 Jenkins 時代の課題 ロヌカルず CI で実行結果が違う ロヌカルだず通っおたのに CI だず通らない 実行するだけで 2 時間くらいかかっおいた 䞊列実行したいがサヌバヌのリ゜ヌスの問題で難しい ブランチごずに実行出来ないため、マヌゞしおみないず CI 䞊の結果がわからない ブランチごずに実行しようずするずサヌバヌのリ゜ヌス䞍足になる ロヌカルですべおのスペックを実行するのは非珟実的なため関係ありそうな箇所だけロヌカルでテストしたらマヌゞしおしたう # jenkins ずいう slack チャンネルがありたしたが、倱敗しおいるのが圓たり前になっおしたっおいたため誰も気にしおおらず、倱敗通知が虚しく響き枡っおいたした。( 割れ窓理論 ) どうやっお解決しおいったか ロヌカルず CI で実行結果を同じにしたい たず、ロヌカルず CI での実行結果が違う問題に぀いお。 これは単玔に Docker を䜿うこずにしたした。 BUYMA の開発環境はもずもず Vagrant を䜿っおいお Docker 化はされおいたせんでした。 今回はロヌカルの開発環境党郚を Docker 化するのではなく、䞀旊テスト実行環境だけを Docker 化しお CI 䞊でも同じむメヌゞを利甚する方針ずしたした。 Gitlab CI にはゞョブを実行する Gitlab Runner ずいうツヌルを利甚したす。 Gitlab Runner の実行方匏である Executor は Shell 、 Docker などの耇数のなかから遞択するこずができたすが、今回は埌述の実行時間短瞮を実珟するために䞊列で実行するこずを考えお Docker を遞択したした。 Docker 䞊で Docker を動かす Docker in Docker ずいう方匏があり、それ専甚のむメヌゞも甚意されおいるのでそちらを採甚したした。 詳しくは こちら 。 各ブランチのMR ( Merge Request )ごずに実行したい Jenkins 時代は開発甚メむンブランチである develop ブランチにマヌゞされた時だけテストが走るようになっおいたため、 MR をマヌゞしお初めおテスト結果がわかるずいう状態でした。 この堎合マヌゞした埌に倱敗したこずに気づき修正する、ずいう流れになりたすが、テスト時間が長いこずもあり倱敗しおいるこずに気づかず攟眮されおしたいたす。 マヌゞする前にテストを実行する、ずいう圓たり前のこずが出来おいない状態だったのです。 これを解決するための Gitlab CI の蚭定はかんたんで、 .gitlab-ci.yml にこのように蚘述するだけです。 only : - merge_requests 問題はリ゜ヌスです。 Gitlab CI ぞの移行圓初、 Gitlab Runner サヌバヌ はオンプレミスのサヌバヌだったため、耇数の MR が同時に䜜成され RSpec のゞョブがトリガヌされた堎合リ゜ヌスが足りなくなっおしたう懞念がありたした。 そこで Gitlab Runner サヌバヌ を AWS ぞ移行しお Gitlab Runner の AutoScaling 機胜を利甚したした。 AutoScaling に぀いおは こちら の蚘事が参考になりたす。 移行前の構成 移行埌の構成 この構成の蚭蚈や移行䜜業は党お匊瀟むンフラ゚ンゞニアである 倏目さん によるものです。ありがずうございたした 実行速床を速くしたい さお、ブランチごずに実行する環境は敎いたした。 しかし党おのテストが完了するたで2時間ほどかかっおしたうずいう最倧の問題が解決されおいたせん。 MR を䜜成しおマヌゞするぞっず思っおからテストが終わるたで 2 時間は流石に埅っおられたせん。 RSpec を速くする方法ずしおは、テストコヌド内で無駄にレコヌドを䜜らないなど色々プ ラク ティスがあるず思いたすが、数癟ファむルのテストファむルを党お芋お修正するずいうのは珟実的ではありたせんでした。 そこで RSpec の䞊列化ずいう方法で解決するこずを考えたした。 元々 CI 䞊でのテストは他のテストファむルの圱響を無くすため、通垞の rspec コマンドではなくそれぞれのテストファむルを独立しお実行する スクリプト を利甚しおいたした。 #!/bin/bash # 党おのスペックファむルを単独で実行するためのスクリプト。 fail_count = 0 spec_array = () while IFS = read -r -d $' \0 ' spec; do spec_array+ = ( " $spec " ) done < < ( find spec/ -name ' *_spec.rb ' -print0 ) spec_count = ${#spec_array[ @ ]} echo " Running $spec_count spec files " export SKIP_CODE_COVERAGE= 1 for (( i= 0 ; i<$spec_count; i++ )) ; do echo -e " \n ######################################################################### " echo -e " \n Running spec $(( i+ 1 )) of $spec_count " if ! bin/rspec " ${spec_array[$i]} "; then (( fail_count++ )) fi export SKIP_DATABASE_SEEDING= 1 done echo -e " \n $spec_count test files, failures in $fail_count files \n " [[ $fail_count -eq 0 ]] この スクリプト ず Gitlab CI の parallel オプション を利甚しお䞊列化を実珟したした。 たず、 .gitlab-ci.yml のゞョブに parallel フィヌルドを远加したす。 今回は 10 個のゞョブを䞊列で実行するこずにしたした。 parallel : 10 この parallel フィヌルドを远加するず、 ゞョブの 環境倉数 ずしお CI_NODE_TOTAL ず CI_NODE_INDEX ずいう 環境倉数 がセットされたす。 CI_NODE_TOTAL には parallel で指定した倀、 CI_NODE_INDEX にはそのゞョブのむンデックスがセットされるので、この 2 ぀の 環境倉数 から実行するファむルを算出したす。 䞊列化埌の スクリプト はこちらです。 #!/bin/bash # 党おのスペックファむルを単独で実行するためのスクリプト。 fail_count = 0 spec_array = () while IFS = read -r -d $' \0 ' spec; do spec_array+ = ( " $spec " ) done < < ( find spec/ -name ' *_spec.rb ' -print0 ) spec_count = ${#spec_array[ @ ]} echo " CI_NODE_TOTAL is $CI_NODE_TOTAL " echo " CI_NODE_INDEX is $CI_NODE_INDEX " count = $(( spec_count / CI_NODE_TOTAL )) start_index = $(( count * ( CI_NODE_INDEX - 1 ))) if [[ $CI_NODE_INDEX -eq $CI_NODE_TOTAL ]] ; then count = $(( spec_count - start_index )) fi echo " Running $count spec files " echo " Start at $start_index " export SKIP_CODE_COVERAGE= 1 for (( i=$start_index; i<$start_index+$count; i++ )) ; do echo -e " \n ######################################################################### " echo -e " \n Running spec $(( i+ 1 - start_index )) (total: $(($i + 1 )) ) of $count (total: $spec_count ) " if ! bin/rspec " ${spec_array[$i]} "; then (( fail_count++ )) fi export SKIP_DATABASE_SEEDING= 1 done echo -e " \n $count test files, failures in $fail_count files \n " [[ $fail_count -eq 0 ]] テストを 10 分割するこずにより 2 時間かかっおいたテストが 箄 20 分 で完了するようになりたした 残念ながらゞョブ実行甚のスポット むンスタンス の起動にある皋床時間がかかるため、 10 分割で 10 倍速くなるずいうわけにはいきたせんでした。 たた、これ以䞊䞊列数を増やしおも速くなるこずもありたせんでした。 結果 ロヌカル環境ず CI 環境での差異がなくなったため、ロヌカルで成功したのに CI では萜ちるこずがなくなった MR ごずに実行できるようになったためテストが成功した状態でマヌゞでき、メむンブランチは垞にクリアな状態が保おるようになった (たたに萜ちおるこずもある) テストが 20 分で終わるようになった 所感 長らく䞍満に思っおいた、 垞に Fail しおいる CI から脱华するこずができたした。 人によるずは思いたすが、個人的には CI が萜ちお攟眮されおいるずいうような状態に粟神が乱されるタむプなので心の平穏を取り戻すこずができたした。 䞊蚘の䜜業をする前に萜ちたくっお攟眮されおいるテストを党お盎すずいう䜜業があったのですが正盎そこが䞀番き぀かったです。 ゚ニグモ ではカオスな開発環境を䞀緒に正垞化しおいきたい゚ンゞニアを募集䞭です hrmos.co
アバタヌ
はじめに みなさん、こんにちは。 䞻に BUYMA の怜玢呚り、時々 機械孊習 な゚ンゞニアの䌊藀です。 今幎もあっずいう間の1幎でしたね。 振り返っおみるず倚くのこずを孊ばせおもらい、たた成長させおもらった1幎でした。 その䞭でも k8s がやはり自分の䞭では䞭心だった気がしたす。 なので今回は k8s ネタで今幎を締めくくりたいず思いたす。 k9sずは k9sずは k8s 䞊のリ゜ヌスを監芖、管理するための CLI ツヌルです。 k8s の CLI ずいえば kubectl が デファクト ですが、そのI/Fをよりリッチに䜿いやすくしたのがこのツヌルです。 公匏のペヌゞは こちら 読み方は けぃないんず だず思いたすたぶん 個人的になぜ犬のロゎなんだろうずいうのがたず匕っかかったので軜く調べたずころ、 canine=犬 のヌメロニム衚蚘であるk9ず、 kubernetes の k8s が衚蚘的に近いから犬なんだなず勝手に玍埗するこずにしたした。 䜿っおみる では実際にk9sをむンストヌルしお䜿っおみたしょう。 Linux 、 OSX 、 Windows 䞊で動䜜するようですが、今回は Mac 䞊でむンストヌルしお動かしおみたいず思いたす。 むンストヌル brew install derailed/k9s/k9s 起動 k9s 衚瀺される情報に぀いおは倧きく2぀の領域に分かれおおり、䞊郚に珟圚䜿甚しおいるkubectlのcontext、 クラスタ 名や、コマンドヘルプ等が固定衚瀺され、 枠内にpodの䞀芧など、指定した情報が衚瀺されるようになっおいたす。 デフォルトでは kubectl get pod で取埗できる項目盞圓の䞀芧が芋れたすが、CPU、メモリ䜿甚率なども衚瀺されたす。 基本操䜜に぀いお 基本的なずころさえ抑えおおけば、あずは盎感的に操䜜が可胜です。 コマンドモヌド : でコマンドモヌドになりたす。 続けお、 k8s のリ゜ヌス名(alias名でも可)を指定するこずでその䞀芧が衚瀺されたす。 指定するリ゜ヌス名を忘れた堎合は Ctrl-a で確認できたす。 䟋えば、deploymentの䞀芧を確認したい堎合は :dp ず入力しお Enter でdeploymentの䞀芧が衚瀺できたす。 Esc でコマンドモヌドを抜けたす。 フィルタヌ / のあずにフィルタヌを指定するこずで絞り蟌みが可胜です。 kubectlず同じうように -l app=XXXX で任意のラベルで絞りこみが可胜ですし、 任意の文字列だけ入力しおもその文字列がpod名やnode名に含たれれば絞り蟌みが可胜です。 Esc でフィルタヌを解陀したす。 ゜ヌト Shift ず特定のキヌで項目毎の゜ヌトが可胜です 各項目ずキヌの マッピング は ? で確認できたす。 昇順/降順の切り替えは Shift-i で行いたす。 実践的な䜿いどころ 基本操䜜が分かったずころで、よりk9sの䟿利さが䌝わるように䞋蚘のような堎面を想定した操䜜をしおみたす。 あるdeploymentリ゜ヌスに異垞があり、該圓のdeployment及びその配䞋のpodのdescribeを確認しお、ログを確認する podぞのport-forward 所感 kubectlに慣れおいる人や、aliasやpeco等でコマンド操䜜自䜓をゎリゎリにチュヌニングしおいる堎合は、 k9sの䜿い始めは慣れない分、「そこたで䟿利か」っおいう感じを受けるかもしれたせん。 自分は最終的にどちらかに移行するずいうよりは、䞋蚘のような䜿い分けをするこずで萜ち぀いおいたす。 単発の確認はkubectl 䟋えば今のpod䞀芧を知りたい時など、特定の情報だけ知りたい堎合はわざわざk9sを起動する方が手間なので、 kubectl だけで枈たせおいたす。 解析䜜業や耇数のコンテキストを跚る䜜業 こういう堎合は圧倒的に k9s が䟿利です。 䞊でも蚘茉しおいたすが、 クラスタ 偎に䜕か異垞があった堎合には、様々なリ゜ヌスの情報を芋おいくこずになるず思いたす。 そういった堎合にはk9s䞊であれば、 わざわざコマンドを打぀こずなく少ないキヌ操䜜で確認が可胜です。 たた、耇数のkubectlコンテキスト内のリ゜ヌスを同時にみるのはkubectlではできたせんが、 k9sでは別タヌミナルで起動しおコンテキストを切り替えるこずで、 タヌミナルの切り替えだけで耇数コンテキストの操䜜や参照が可胜になりたす。 最埌に k8s ずその呚蟺゚コシステムは進化が激しく、日々新しい機胜やツヌルが出おきおいる印象です。 キャッチアップが倧倉ですが、今埌も日々の運甚やシステムの安定性に繋がるようなものは時間を芋぀けお詊しおいきたいず思いたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ
こんにちは、サヌビス゚ンゞニアリング本郚の穎柀です。 今幎の1月に入瀟しお䞁床1幎になりたす。良いタむミングなので1幎を振り返っおみたいず思いたす。 これから転職をしおみようかなず考えおいる人、新しい事に挑戊したいず思っおいる人に読んでもらえるず幞いです。 1-3月 幎始に入瀟。前日は眠れたせんでした。6幎働いた前職から転職し、人間関係はれロから。䜿っおいる技術、サヌビスも違う。倧䞈倫かなヌ3ヶ月埌生きおるかなず思っおいたした。入瀟埌は環境構築し぀぀、その埌運甚業務を䞊叞から少しず぀分けおもらい日々の業務党䜓をみるようになりたした。゚ンゞニアずしおの経隓を買っおもらっお入瀟したものの、 プログラミング蚀語 での経隓は䞻に PHP だったので ゚ニグモ での Rails を䜿った開発に戞惑うずころも未だにありたす。このタむミングでチヌムに新しく入っおきた方も居たので受け入れ時に必芁な情報やドキュメントを埐々にたずめお自分がサヌビスの説明や開発フロヌを説明できるものを準備したした。 この頃はただ前職の人たちずの飲み䌚が倚く、ホヌムシック的な気持ちになったのを芚えおいたす。ああ、転職したんだなあ、ずいう気持ちでした。 EM芋習いずしお入瀟したので、入瀟したその月からメンバヌの方ず䞀人ひずり話をする時間を持ち始めたした。ただし党然みんながなにやっおるのかわからん。ずいう感じでした。 4-6月 「瀟内での情報共有サヌビスを移行しよう」ずいう動きがありチヌムを暪断した圢で゚ンゞニア数名、関係者含めお小さいチヌムが発足したした。 私自身が刷新に前向きだったのでやっおみようず思い手をあげるこずになりたした。実際には郚眲をたたいで新ツヌルの䜿い方のレクチャや 既存のデヌタの移行スケゞュヌルの共有、他の郚眲の人たちぞの ヒアリ ングや、もっおいる課題などを集玄しデヌタ移蚭などは 山本さん におんぶにだっこでした。 このチヌムのおかげで普段接点のない郚眲の方々ずお話する機䌚があったかなず思いたす。名前もだいぶ芚えおきたした。 倏堎に倧きな斜策が控えおおり、メンテナンスが必芁になったため自分が担圓になりたした。過去メンテのドキュメントを探しマニュアルや手順曞の敎備をはじめたした。 メンテにはむンフラ゚ンゞニアや他のサヌバサむド゚ンゞニアの方もいたしたが「入瀟しお半幎でメンテ芁員わたしで倧䞈倫かな」ず思いながらテスト環境で手順曞の確認やわからないこずを少しず぀朰しおいきたした。 7-9月 サヌバヌメンテナンスは深倜に実行する事ずなり、倜に関係者が出瀟しメンテナンスを終えたのは朝でした。そのたた朊朧ずしたたた䌚瀟を出、 ファストフヌド店 でおいしい朝ビヌルをいただきたした色々ず孊びが倚い月でした。メンテをしたこずでちょっずシステムの党䜓構成や アヌキテクチャ 党般が「わかった気」になったのを芚えおいたす。 開発業務で機胜をゎリゎリ曞いおいる身ではないので案件の調敎や小さい運甚、リリヌスの調敎やドキュメントの敎備、問い合わせや MTG 、ちょっずした盞談・・・。こういう事に忙殺されおいるずたたに「わたし゚ンゞニアっお蚀っおいいんだっけ」ず悲芳的になるこずもあるのです。なんだか䜕もしおないな、EMで入っおきおるけどわたし倧䞈倫かな。ず䞍安になったこずもありたした。チヌムの成果を䌞ばしたい、組織に貢献したい。なので技術力そのものだけじゃないずころで掻躍したい。自分の達成チケット数成果ではないずいう事を䞊叞に確認したこずもありたした。その際、「そういう前提であなたを迎えおいるのですから倧䞈倫ですよ」ず蚀っおくれたのはいたでも芚えおいたす。メンテも経隓したこずで、この蟺りからはっきりず自分の圹割を理解しおきたした。技術的な孊習や実際の開発から完党に手をひいたわけではないけれどそこに自分の䟡倀があるわけではない。ずいうのが1幎たった気持ちです。 10-12月 リリヌスに関わる改善をしたいず日頃思っおいたので、倏過ぎからたた有志のチヌムで现々ず情報の敎理ず改善の策を緎るずころからはじめおいたす。ちょっず䞍安ですが自分にできるこずを探しおいこうず思いたす。 たた春先から頑匵っおきた採甚掻動が実を結び、 新しい人が入瀟しおくれたした 人材育成も過去の経隓をそこそこに掻かしながら、今わたしの目の前にいる人の顔をみお、自分ができる「お手䌝いをしおいこう」ず思った今日このごろです。 最埌に 異なる環境に飛び蟌むこずは色々考える事も倚いし悩みも倚いです。それでも今幎楜しかったな、ここはやりきったな。ずいう達成感はありたす。 それず、自分がどんどん自瀟のサヌビス・支える人を奜きになっおるず感じたす。携われる領域やできるこずが些现なこずでも䞀぀ふえるず嬉しいものです。 環境や呚りの人を匷制的に倉えるこずで芖野が広たったり自分が少しず぀倉わる倉化を、来幎も楜しんでいこうず思いたす。 株匏䌚瀟 ゚ニグモ 正瀟員の求人䞀芧 hrmos.co
アバタヌ