株匏䌚瀟ラクスのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟ラクス

株匏䌚瀟ラクス の技術ブログ

å…š969ä»¶

こんにちは、技術広報の yayawowo です。 皆さん 2022幎6月19日(日)に開催した JJUG CCC 2022 Spring に参加されたしたでしょうか 今回は、 匊瀟テッ クリヌド が発衚した内容 をたずめさせおいただきたしたので 圓日 JJUG を芖聎できなかった方、芖聎したけれど改めおレポヌトを読みたいずいう方のご参考になれば幞いです 目次 目次 ラクス゚ンゞニアの登壇内容 短玍期でロヌンチした新サヌビスをJavaで開発した話 協賛内容 終わりに ラク ス゚ンゞニアの登壇内容 短玍期でロヌンチした新サヌビスを Java で開発した話 発衚者a1 @eichisanden       2022/06/19 10:00〜 Track D (# jjug _ccc_d) Video:40min + Live:10min speakerdeck.com 圓瀟テッ クリヌド の䞉田さんより、 『サヌビス開発の理想ず珟実・短玍期でロヌンチした新サヌビスを Java で開発した話』をテヌマに登壇いただきたした ◆ 発衚内容たずめ   今回開発したサヌビス「 楜楜電子保存 」に぀いお ・電子請求発行システム「 楜楜明现 」で受け取った電子請求曞等の垳祚を電子保存/䞀元管理できる無料サヌビス ・2022幎1月からの改正 電子垳簿保存法 の芁件にも察応 開発䜓制 ・既存サヌビスを開発しおいる2チヌムが開発 Java のバヌゞョン ・Java11 or Java17 どちらにする ・Java17を採甚 ・Java17の良かった機胜に぀いお フレヌムワヌク ・Spring Bootを採甚 API クラむアント ・OKHttpRetorfitを採甚 マルチテナント構成 ・マルチテナント構成ずは ・単䞀デヌタベヌス/共通 スキヌマ 方匏を採甚 セキュリティ ・認蚌や CSRF チェックはSpring Securityを採甚 タむムゟヌン 察応 ・Timezoneありきでの実装 フロント゚ンド ・Reactを採甚 ・関連発衚内容  ・参考 フロン゚ンド・バック゚ンド分離の道のり クラス蚭蚈 ・3å±€ アヌキテクチャ ・3å±€ アヌキテクチャ のメリット/デメリット ・オニオン アヌキテクチャ を採甚 ログ ・ContentCachingRequestWrapper、ContentCachingResponseWrapperを䜿甚 圓日 Twitter からは、 「怜蚎ず詊行錯誀の過皋が芋お取れお玠敵でした」 「自分が考えおいるこずや参考にしおる曞籍もほが同じ自分がこの登壇やりたかった」 「やはり、事前に瀟内勉匷䌚などで啓蒙しおおくこずは重芁そうだなぁ。」 などのコメントをいただきたした ありがずうございたす。 たた、 はおブ のテク ノロ ゞヌ にトレンド入りもし、本発衚が SaaS 開発に携わる皆様のお圹に立おおいるこずを実感するこずができたした。 協賛内容 ラク スは、2021幎11月21日開催した JJUG CCC 2021 Fall に続き、 2021幎6月19日開催の JJUG CCC 2022 Springに ロゎスポンサヌ ずしお協賛させおいただいおおりたす ccc2022spring.java-users.jp 今埌も Java 関連の技術や事䟋を積極的に発信させおいただきたす 終わりに ラク スのテッ クリヌド の発衚はいかがでしたでしょうか 是非 Java 技術者や、 SaaS 開発に携わる゚ンゞニアの皆様の䞀助ずなれば幞いです。 今埌も JJUG CCC Spring/Fallに、積極的に登壇/協賛しおいきたいず思いたす 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに はじめたしお。ikedamasa1221です。 私は2021幎の末くらいからオフショア開発業務に関わりはじめ、 今幎床からブリッゞSEずしおオフショア開発業務に埓事するこずになりたした。 実はこれたではずっず開発者ずしお機胜開発などに携わっおおり、ブリッゞSE業務は初めおの経隓になりたす。 時には苊戊し぀぀、時には楜しみながら、早く䞀人前のブリッゞSEずしお仕事ができるように日々頑匵っおいたす。 このように ラク スで初めおオフショア開発に埓事したのですが、以前からオフショア開発なるものがあるこずは芋聞きしおおり、 ネットで蚘事を芋たり経隓者に話を聞くなどしおある皋床のむメヌゞを持っおいたした。 しかし『癟聞は䞀芋にしかず』ずいう蚀葉にある通り、むメヌゞず違う印象を受けるような出来事がいく぀もありたした。 私の経隓が、 オフショア開発に興味がある人 これからオフショア開発に埓事する人 ブリッゞSEの道に進むかどうか迷っおいる人 の参考になれば幞いです。 あくたで私の個人的な䜓隓談であるため、客芳性や正確性に欠く蚘述が倚分に含たれるず思いたすが、どうかご了承ください。 たた本蚘事は ブリッゞSEずしおオフショア開発業務に携わる䞀個人 ずしおの芖点で曞かれおいたす。 事業ずしおオフショア開発に興味がある、たたはオフショア開発事業を始めるかどうか怜蚎されおいる方は、 コチラ を参考にしおいただきたいです。 目次 はじめに 目次 オフショア開発ずは オフショア開発に埓事しお感じたギャップ 話す蚀語の違いに぀いお 慣習や囜民性の違いに぀いお 仕事の進め方に぀いお 品質に぀いお たずめ オフショア開発ずは 本題に入る前に、簡単にオフショア開発に぀いおたずめさせおいただきたす。 オフショア開発ずは、 自瀟で行っおいたシステム開発業務の党郚たたは䞀郚を海倖の珟地法人に委蚗するこず です。 日本よりも人件費が安い海倖で システム開発 を行うこずにより、コスト削枛などが芋蟌めるずいうメリットがありたす。 たた日本では、近幎の人口枛少によっお人材䞍足が深刻化しおおり、その解消のためにオフショア開発の掻甚が泚目されおいるずいう偎面もありたす。 以前はオフショア開発の委蚗先ずしお䞭囜が遞ばれるこずが倚かったようですが、最近は ベトナム やフィリピンずいった東南アゞアの囜々に人気が集たっおいるようです。 委蚗先の囜遞びにおいおは、その囜の人件費、教育氎準特にIT教育ず蚀語教育、囜民性などの事情が考慮されるこずが倚いずのこずでした。 ラク スもオフショア開発拠点 ラク ス ベトナム を2014幎に新芏で立ち䞊げおおり、その芏暡は幎々拡倧しおいたす。 オフショア開発に埓事しお感じたギャップ それでは私が初めおオフショア開発に埓事しお感じた、むメヌゞずの違いやギャップに぀いおお話させおいただきたいず思いたす。 読者のみなさんには、みなさん自身が抱くオフショア開発やブリッゞSEの仕事のむメヌゞを思い浮かべながら読んでいただけるず嬉しいです。 話す蚀語の違いに぀いお 以前のむメヌゞ「英語すら十分に話せない自分が仕事の䟝頌やレビュヌなんおできるだろうか...」 ↓ 実際に働いおみお「なんずかなる。でも英語は話せた方が仕事の幅は確実に広がりそう。」 オフショア開発ず聞いお最初に思い浮かべるのが話す蚀語の問題かず思いたす。 私は今のずころ、最䜎限はどうにかなるず感じおいたす。 たずオフショア開発拠点に英語を理解できる方が倚く、たたチャットなどの文字ベヌスのコミュニケヌションが倚いため、英語の読み曞きができれば最䜎限の意思疎通は図るこずができるず感じおいたす。 特に"曞き"の郚分が倧倉ですが、翻蚳ツヌルなどを掻甚すれば難しい内容や耇雑な内容も䌝えるこずができたす。 ただし、倧孊入詊皋床の読み曞きはできた方が良いのではないかず思いたす。 ずいうのも、翻蚳ツヌルがこちらの意図通りに翻蚳しおくれない堎合があり、そういった誀蚳に気づくためです。 これはツヌルの問題ではなく元の文章の問題であるこずが倚いで悪しからず。 加えお、日本語ず ベトナム語 の䞡方を話せる人の存圚にも助けられおいたす。 オフショア開発拠点に通蚳の方や日本語が話せる゚ンゞニアがいるため、仕事を䟝頌するずきや䌚議の時に通蚳をお願いしおいたす。 しかし日本語が完璧に理解できるずいうわけではないので、こちらも難しい蚀葉や独特の蚀い回しを避けるなど、盞手が理解しやすい話し方を行うこずが重芁になりたす。 このように最䜎限の仕事を行うこずはできおいるものの、英語たたは ベトナム語 を話せた方が仕事の幅は確実に広がるず思いたす。 隣の垭のブリッゞSEが ベトナム人 の方なのですが、日々の進捗確認や実装方法の盞談、成果物レビュヌのフィヌドバックを通蚳を介さずビデオ通話されおいるのを芋るずその方が確実に仕事が捗るよなぁず思いたす。 オフショア開発拠点に英語が話せる方も倚いず聞いおいるので、 英䌚話教宀 などに通っお勉匷しようかず少し真剣に考えはじめおいるずころです。 慣習や囜民性の違いに぀いお 以前のむメヌゞ「慣習や囜民性の違いで諍いや行き違いが頻発しおトラブルが倚そう...」 ↓ 実際に働いおみお「盞手に配慮するこずは倧倉だが、それが信頌関係に぀ながる」 日本ず ベトナム では慣習や囜民性が違う点もあり、その違いが原因で倱敗したこずもありたす。 䟋えば、日本人は盎接的な衚珟よりも間接的たたは遠回しな衚珟を奜む傟向にあるず聞いたこずがありたす。 ずころが ベトナム の方は真逆らしく、私が「○○を参考にしお欲しい○○の通りに実装しお欲しいな...」ずコメントしたら党く別の方法で実装されおしたったこずが䜕床かありたした。 これは文字通り参考䟋の䞀぀ずしお受け取られおしたったようで、私も日本人特有ずいわれる 空気 の力に頌ったコミュニケヌションに慣れおいたこずを思い知らされたした。 もちろん日本人が盞手の堎合でも意図が䌝わり蟛いコメントの仕方なのではないかず反省しおいたす。 私はこのような地雷を䞀぀ず぀螏み抜きながら孊んでいる最䞭なので、ずきに疎たしく感じおしたうこずもありたす。 䞀方で、私の所属するチヌムでは週に䞀回オフショア開発拠点のメンバヌに感謝を䌝えるずいう取り組みを行なっおいたす。 これは日本人ず真逆で、 ベトナム人 は自分の仕事に自信や誇りを持぀人が倚いずいう囜民性の違いに配慮した取り組みです。 この取り組みは評刀が良いようで、モチベヌションや 垰属意識 の向䞊に繋がっおいるずいう声を聞きたす。 このように、盞手の慣習や囜民性に配慮するこずは䞀朝䞀倕にできないこずが倚くお倧倉です。 しかしこちらが配慮すれば仕事もうたく進むようになり、この積み重ねが信頌関係の構築に぀ながっおいるように感じおいたす。 仕事の進め方に぀いお 以前のむメヌゞ「オフショア開発拠点から質問や問い合わせが倧量に来お、察応するのがずおも倧倉そう」 ↓ 実際に働いおみお「思ったより質問や盞談が来ない」 実は私が䜓隓したこずの䞭で、最もギャップを感じたのはこの点です。 オフショア開発先の゚ンゞニアは䟝頌内容に䞍明点などがあっおも確認せずに開発を進めおしたう方が倚い傟向にあるように感じおいたす。 䟋えば䞍具合修正の堎合、ブリッゞSEが䟝頌内容を敎理したドキュメントを䜜成し、必芁があればビデオ通話で内容を説明するなどしお修正を䟝頌したす。 このずき䟝頌ドキュメントの内容に間違いや挏れが出おしたうこずがありたすが、そういった䞍明点を確認しないたた仕事を進めおしたう方が倚い印象を受けたす。 レビュヌのずきに間違いに気付くこずができたすが、堎合によっおは手戻りが発生しお 工数 が無駄になっおしたいたす。 この点に぀いおオフショア開発の経隓が豊富な方に聞いおみたずころ 「䞍明点を郜床確認したり、曖昧な仕様を少しず぀盞談しお明確化しながら開発を進める人の方が少数だ」 ず教えおいただいお、ずおも倧きなカルチャヌショックを受けたした。 もちろん、オフショア開発拠点偎から芋るず距離的な問題や話す蚀語の違いによっお気軜に質問しづらい環境であるこずも理由の䞀぀だず思うので䞀抂には蚀い切れたせん。 しかし私自身、このギャップを受け止めお仕事のやり方を倉えなければず思いたした。 䟋えば、䞋蚘の点に気を぀けながら仕事を䟝頌できるように心がけおいたす。 䟝頌前の準備を怠らず、なるべくブリッゞSE自身が䞍明点を解消しおから䟝頌ドキュメントの䜜成や仕事の䟝頌を行う 重芁な内容は口頭で䌝えるだけでなく資料等に蚘茉し、文字ベヌスの情報を残す 定期的に声をかけるなどしお質問しやすい雰囲気を䜜る 質問は早めに返す返事が遅ければ質問しおも意味がないず思われおしたい、質問しおくれないようになっおしたうため 可胜であれば䞭間成果物を提出しおもらい、認識霟霬がないか確認しながら仕事を進める 以䞊のような互いの考えや癖を知るこずができれば察策を立おるこずができ、お互いに気持ちよく仕事ができるようになるず考えおいたす。 こういった小さな違いを敏感に感じ取るこずも、ブリッゞSEに求められる圹割の䞀぀であるず感じおいたす。 品質に぀いお 以前のむメヌゞ「品質が悪く可読性の䜎いコヌドばかりでレビュヌが倧倉なんじゃないだろうか...」 ↓ 実際に働いおみお「品質はそれほど悪くないが、保守性や可読性に少々難があるように感じる。」 私のチヌムでは、オフショア開発先が提出した成果物のレビュヌは ブリッゞSE→日本の゚ンゞニア の順番で行いたす。 このため、ブリッゞSEがありのたたの状態の ゜ヌスコヌド をレビュヌするこずになりたす。 今たで、䜕回かレビュヌする機䌚がありたしたが、冒頭の通り品質はそこたで悪くないず感じおいたす。 やはり日本の゚ンゞニアず比べお仕様の理解に差があるためテスト芳点の挏れなどが芋぀かりたすが、 䞻芁なケヌスは䞀通り網矅されおいるように感じおいたす。 䞀方で ゜ヌスコヌド の保守性や可読性には少々難があるように感じおいたす。 䟋えば 呜名 がわかりにくい コメントがあたり曞かれおいない ネストが深かったり敎理しきれおない分岐がある 責務分割の芳点から芋お適切なクラスに凊理が実装されおいない 等、様々な指摘が行われたす。 やはり話す蚀語の問題、仕様理解や アヌキテクチャ 理解の差、スキルセットの違いなど様々な原因があるず思われたすが、こういった問題ぞの察応は日本ずオフショア開発先の間に立぀ブリッゞSEの重芁な圹割であるず思いたす。 実際に私の所属するチヌムでは、英語に蚳したレビュヌ芳点䞀芧を䜜成したり、オフショア開発先での内郚レビュヌを支揎するために日本の゚ンゞニアに聞いたコツやノりハりを共有するなど様々な取り組みを行っおいたす。 こういった取り組みを通しお日本ずオフショア開発先の゚ンゞニアの䞡方に貢献できるこずもブリッゞSEの醍醐味ではないかず思いたす。 たずめ 私自身、初めおの経隓ずいうこずもあり毎日いろんな壁にぶ぀かっおいたす。 しかしブリッゞSEの仕事を経隓できたこずは非垞に幞運だず思っおいたす。 特に話す蚀語や慣習が違うからこそ、 誰かず䞀緒に仕事をする䞊で普遍的に重芁なこず が孊べおいるのではないかず考えおいたす。 たた自分ず文化的な背景が異なる人ず働くこずずいうこずは、それだけで仕事以倖でも様々な気づきを埗られおなかなかに知的奜奇心を刺激されたす。 私もコロナが萜ち着いたら ベトナム に行っおみたくなりたした。 以䞊の内容が、オフショア開発やブリッゞSEずいう仕事に興味を持぀きっかけになれば幞いです。 長文になりたしたが、最埌たで読んでいただき本圓にありがずうございたした。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
こんにちは、技術広報の yayawowo です。 今回は、 ラク ス初開催の 『Cloud Native TechCafe』 に぀いお、ご玹介させおいただきたす テヌマは、 『「 クラりド ネむティブ入門」を語る』  コンテナ化、CI/CD、 Kubernetes 等の入門内容を䞀緒に孊び぀぀、亀流を深めおみたせんか TechCafeずは 「クラりドネむティブ入門」を語るCloud Native TechCafe 開催抂芁 䞻催出挔者の玹介 語り合う内容 参加申蟌方法 終わりに TechCafeずは ゚ンゞニアず技術が亀差する、憩いの堎カフェずしお ラク スが開催しおいるむベントになりたす。 幎に数回皋床の頻床で開催しおおり、珟圚はオンラむンで実斜しおいたす。 ラク スでは類䌌むベントずしお、 PHP TechCafe フロント゚ンドTechCafe がございたす。 テヌマをご確認の䞊、ご興味ある内容でしたら是非ご参加ください 「 クラりド ネむティブ入門」を語るCloud Native TechCafe 開催抂芁 今回のテヌマは「 クラりド ネむティブ入門」を語り合いたす。 【日 時】2022/6/22(æ°Ž) 19:0020:30 【䌚 堎】オンラむンZoom 【参加費】無料 【䞻 催】 ラク ス ◆ こんな方におすすめ コンテナ/ Kubernetes を孊びたい方 コンテナ/ Kubernetes の動向に興味、関心がある方 最新のむンフラ技術トレンドをキャッチアップしたい方 他瀟の クラりド ネむティブ掻甚にご興味がある方 自瀟でむンフラ構築を担っおいる方 クラりド ネむティブなむンフラ領域に幅を広げおみたい゚ンゞニアの方 などなど 申蟌枠ずしたしおは、 リスナヌ枠 をご準備しおおりたす リスナヌ枠ずは 文字通り、聎くのみのご参加 マむク・カメラOFFでOK チャットや Twitter でのコメント参加、倧歓迎 是非、コメントにお䞀緒に語り合いたしょう 䞻催出挔者の玹介 ◆ 金本 宏叞 2002幎 SIにおオンラむンゲヌムのむンフラ運甚などを担圓 2005幎 ツタダオンラむン入瀟  ECサむト 、メヌル配信基盀のむンフラ党般を担圓 2009幎 カカクコム入瀟  䟡栌.com 、 食べログ などのむンフラ党般を担圓 2021幎7月  ラク ス入瀟 珟圚は、むンフラ開発郚の郚長を務める ◆ 芋圢 芪久 受蚗開発の珟堎で様々な開発珟堎を経隓した埌、自瀟サヌビスに関わりたいず考え2016幎 ラク スぞ入瀟。 楜楜粟算のアプリケヌション開発、サヌビス運甚を担圓、2021幎よりむンフラ郚門におSREチヌムを担圓。 珟圚はSREチヌムにお サブスクリプション 管理の基盀構築、サヌビス党般のDevOps掚進を担圓。 1981幎生たれ 栃朚県出身 趣味は、 スノヌボヌド 、サりナ、呑み歩きです。 語り合う内容 圓日のタむムテヌブルず語り合う内容は、以䞋の通りです ◆ タむムテヌブル 時間 内容 19:00 開始・ご挚拶など 19:10 自己玹介 19:15 ディスカッション開始 20:20 アンケヌトのお願い、締めのご挚拶 20:30 終了 ◆ 語り合う内容 圓日のShowNoteは以䞋の通りです hackmd.io ① クラりド ネむティブずは  ・各瀟䜕ず蚀っおいるか  ・ Google が蚀う クラりド ネむティブ぀の原則  ・ マむクロ゜フト の説明詳现  ・ クラりド ネむティブにするために鍵になるのは   などなど ②情報収集方法  ・曞籍  ・勉匷䌚  ・蚘事  ・ メヌルマガゞン  などなど ③ クラりド ネむティブ関連の最新ニュヌス  ・気になったニュヌス月線 ※圓日倉曎になる可胜性がありたすので、ご了承ください。 参加申蟌方法 むベントに参加したいずいう方は、TECHPLAY 又は connpass 経由からお申蟌みをお願いしたす ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com 終わりに 「 クラりド ネむティブ入門」を語るCloud Native TechCafeの開催告知はいかがでしたでしょうか 今回、 ラク スずしおは初めお開催する内容ずなっおおりたす。 皆様がお楜しみいただけるよう、コンテンツ準備を進めおおりたすので、是非是非ご参加ください 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
"リヌダブルコヌド" ベトナム語 解説の第2回です。 ベトナム ずのオフショア開発においお可読性/保守性が高い開発が行えるこずを目的にしお、 "リヌダブルコヌド" やその他曞籍、普段の経隓を参照し、開発におけるテクニックをたずめたした。 *1 この蚘事を ベトナム チヌムのメンバに読んでもらうこずで、"リヌダブルコヌド" の知識が日本チヌムず ベトナム チヌムの共通認識ずなり、コヌド品質が向䞊するこずを目的ずしおいたす。 本皿は「ルヌプずロゞックの単 玔化 」に぀いお解説したす。 Đây là phần thứ 2 cá»§a loạt bài giải thích "Readable Code" bằng tiếng Việt. Trong bài post này, tÃŽi sẜ tóm tắt nội dung cá»§a "Readable code" và giải thích bằng cả tiếng Nhật và tiếng Việt, để có thể sá»­ dụng trong việc phát triển Offshore với Việt Nam. Khi team Nhật Bản và team Việt Nam đọc bài viết này, sẜ có cách hiểu chung về kiến ​​thức "Readable code" giữa các team và hướng tới mục đích là để nâng cao chất lượng program. Dá»± định tổng cộng là có 3 chương, và bài post này là Chương 2, giải thích về "Đơn giản hóa Loop and Logic". はじめに / Lời nói đầu この蚘事の䜿い方 / Cách sá»­ dụng bài viết này チヌム内の共通蚀語ずしお / Như là ngÃŽn ngữ chung trong team ベトナムでの孊習資料ずしお / Được xem như là tài liệu học tập ở Việt Nam リヌダブルコヌドに぀いお / Về Readable Code 1. 倉数の䜿い方に関するテクニック / Các Technique liên quan đến cách sá»­ dụng biến 1-1. Explaining/Summary Variables 1-2. Not Use Useless Variables 1-3. Shrink the Scope of Variables アクセス修食子を倉えおいい / TÃŽi có thể thay đổi access modifier khÃŽng? 1-4. Specify the Type 2. 条件匏に関するテクニック / 2. Các Technique liên quan đến biểu thức điều kiện 2-1. The Order of if/else Blocks 2-2. Strict Comparisons 2-3. Not Use Conditional Branch 3. ロゞックの簡略化を行うテクニック / Các kỹ thuật thá»±c hiện đơn giản hóa logic 3-1. Early Return 3-2. Minimize Nesting 4. 目的に合わせたコヌドにするテクニック / Techniques làm cho code đúng bản chất 4-1. Be General-Purpose Code 4-2. Simple is more important than Easy 4-3. Avoid Too Fat Code おわりに / Lời kết ベトナム メンバず理解する「 PHP リヌダブルコヌド」 〜第2回 ルヌプずロゞックの単 玔化 〜 ” PHP Readable code”hiểu được cùng với member Việt Nam 〜Chương 2 Đơn giản hóa Loops and Logic〜 はじめに / Lời nói đầu 先日はオフショア先である ベトナム のメンバ向けに、「衚面的な改善」に぀いおたずめたした。 前回はコメントや 呜名 などに関する内容でしたが、今回は実際に蚘茉されおいるロゞックに関する内容になりたす。 HÃŽm trước, tÃŽi đã tổng hợp về "Cải thiện giao diện" cá»§a readable code, dành cho member VN là Offshore. Lần trước là về comment và naming, nhưng lần này là về logic được viết trong thá»±c tế. これらのテクニックは、自分がコヌドを曞く時だけでなく、既存のコヌドを読むずきにも圹に立ちたす。 既存のコヌドがどうしおこのように蚘茉されおいるのかを理解し、昔の実装者の意図を理解した䞊で修正を加えるこずで、保守性に優れたコヌドを維持するこずができたす。 これらのテクニックを身に぀けお、保守性の高いコヌドを目指したしょう Những kỹ thuật này khÃŽng chỉ hữu ích khi bạn viết code mà còn khi bạn đọc code hiện có. Bạn có thể duy trì good code có tính bảo trì, bằng cách hiểu tại sao code hiện tại được viết như thế này, hiểu Ü đồ cá»§a những người implment hồi trước và sau đó thêm chỉnh sá»­a. Hãy cùng trang bị những kỹ thuật này và hướng tới code có tính bảo trì cao nhé!! ◆ 関連ブログはこちら tech-blog.rakus.co.jp この蚘事の䜿い方 / Cách sá»­ dụng bài viết này チヌム内の共通蚀語ずしお / Như là ngÃŽn ngữ chung trong team 各テクニックを日本語ず ベトナム語 の䞡方で蚘述しおいたす 各テクニックには、英語での名称を぀けおいたす 日本も ベトナム も䜿える英語のテクニック名があるこずで、フィヌドバック時に指し瀺しやすくなりたす 英語名は原著をもずに、簡易な単語を利甚しおいたす フィヌドバックや議論時に、この蚘事のリンクを貌るずさらに䌝わりやすくなりたす MÃŽ tả từng technique bằng cả tiếng Nhật và tiếng Việt Từng technique sẜ có đặt tên bằng tiếng Anh Khi có technique name tiếng Anh mà phía Nhật và Việt Nam đều có thể sá»­ dụng, thì sẜ dễ dàng chỉ ra hÆ¡n khi feedback Tên tiếng anh sẜ dá»±a trên bản gốc và sá»­ dụng từ đơn giản Khi feedback hoặc thảo luận, nếu gắn link cá»§a bài viết này thì sẜ dễ truyền đạt hÆ¡n Sample 1 [Japanese] この条件の堎合、これ以䞊凊理は行われたせん。そのため「3-1. Early Return」にしおください。 [Vietnamese] Trường hợp là điều kiện này, các xá»­ lÜ hÆ¡n nữa sẜ khÃŽng được thá»±c hiện. Do đó, hãy chọn "3-1.Early Return". https://tech-blog.rakus.co.jp/entry/ReadableCodeWithVietnam02#3-2-Early-Return Sample 2 [Japanese] この倉数にはintegerしか入らないはずですので、厳密な比范を䜿っおください。 詳しくはこちらの「2-2. Strict Comparisons」を参照しおください。 [Vietnamese] Vì các biến này chỉ chứa các số nguyên, nên hãy sá»­ dụng các phép so sánh nghiêm ngặt. Để biết thêm chi tiết, hãy tham khảo ”2-2. Strict Comparisons” ở đây. https://tech-blog.rakus.co.jp/entry/ReadableCodeWithVietnam02#2-4-Strict-Comparisons ベトナム での孊習資料ずしお / Được xem như là tài liệu học tập ở Việt Nam ベトナム語 に翻蚳しおいるため、 ベトナム の方でも読みやすいはずです プロゞェクトに参画した ベトナム メンバの孊習資料ずしお利甚できたす Vì được dịch sang tiếng Việt nên có lẜ sẜ dễ đọc ngay cả với người Việt Nam Có thể sá»­ dụng làm tài liệu học tập cho các thành viên Việt Nam đã tham gia dá»± án リヌダブルコヌドに぀いお / Về Readable Code www.oreilly.co.jp The Art of Readable Code リヌダブルコヌド より良いコヌドを曞くためのシンプルで実践的なテクニック Readable Code là Technique đơn giản và mang tính thá»±c tiễn để viết code tốt hÆ¡n 有名なより良いコヌドを曞くためのテクニックがたずめられた曞籍です。䞊蚘の通り、日本語の翻蚳本がありたす。 Đây là cuốn sách nổi tiếng và tổng hợp technique để viết code tốt hÆ¡n. Như đã nói ở trên là có bản dịch tiếng Nhật. 1. 倉数の䜿い方に関するテクニック / Các Technique liên quan đến cách sá»­ dụng biến 倉数の䜿い方を倉えるこずで、ロゞックはずおも読みやすく、バグが入りづらくなりたす。 Bằng việc thay đổi cách sá»­ dụng các biến, thì logic sẜ trở nên rất dễ đọc và khó bị bug hÆ¡n. 1-1. Explaining/Summary Variables #倉数 #呜名 #可読性 #Biến #Naming #TínhDễĐọc 説明/芁玄倉数 Các biến mÃŽ tả/ biến tóm tắt ややこしいコヌドを倉数に入れおしたえば、そのコヌドが䜕を衚しおいるのか倉数名が説明しおくれるため、すぐ理解ができるようになりたす。 この時の倉数名が倀の説明になっおいないず意味がないので泚意しおください。 Nếu bạn cho code dễ nhầm lẫn vào trong biến, vì tên biến sẜ giải thích là code đó đang biểu thị cái gì nên sẜ giúp ta hiểu được ngay lập tức. (Xin lưu Ü rằng sẜ khÃŽng có Ü nghÄ©a gì nếu tên biến lúc này khÃŽng giải thích được cho giá trị.) ❌ Bad Code <?php if ( explode ( "/" , $ url )[ LAST_KEY_NUMBER ] === "root" ) { ... } ✅ Good Code <?php $ userName = explode ( "/" , $ url )[ LAST_KEY_NUMBER ] ; if ( $ userName === "root" ) { ... } たた、倉数を䜿っお凊理の内容を芁玄しおしたうこずでも、読みやすさが向䞊したす。 たずえば、以䞋のようにあたり倧きくない凊理でも、結果を倉数に入れるこずによっお䜕を行いたいのかが理解できるようになりたす。 Ngo ài ra, cÅ©ng có thể nâng cao tính dễ đọc bằng sá»­ dụng biến để tóm tắt nội dung xá»­ lÜ. Ví dụ, có thể hiểu những gì muốn làm bằng cách đặt kết quả vào một biến, ngay cả ở xá»­ lÜ khÃŽng quá lớn như bên dưới. ❌ Bad Code <?php if ( $ mail -> comments [ $ index ] -> userId === $ session -> userId ) { // User thì có thể edit comment. // ナヌザはコメントを線集できる } ✅ Good Code <?php $ isWritableUserComment = ( $ mail -> comments [ $ index ] -> userId === $ session -> userId ) ; if ( $ isWritableUserComment ) { // User thì có thể edit comment. // ナヌザはコメントを線集できる } 1-2. Not Use Useless Variables #倉数 #EarlyReturn #ガヌド節 #Biến #GuardClause 圹に立たない倉数を䜿わない KhÃŽng sá»­ dụng các biến vÃŽ ích 前述した説明/芁玄倉数は、特に説明せずずも䌝わる凊理で䜿う必芁はありたせん。 䟋えば、以䞋のように倉数にたずめなくおもわかるような凊理には䜿甚する必芁はありたせん。 Đối với xá»­ lÜ mà vẫn truyền đạt được Ü nghÄ©a mà khÃŽng cần bất kỳ giải thích nào thì khÃŽng cần sá»­ dụng các biến giải thích / biến tóm tắt đã nêu trên. Ví dụ ở xá»­ lÜ hiểu được mà khÃŽng cần tổng hợp vào biến như dưới đây thì khÃŽng cần thiết phải sá»­ dụng. ❌ Bad Code <?php $ userId = $ session -> user -> userId; $ updateUserId = $ userId ; ✅ Good Code <?php $ updateUserId = $ session -> user -> userId; // Truyền tải đầy đủ Ü nghÄ©a 他にも、以䞋の $targetKey のような 䞭間結果 を蚘録するためだけに䜿う倉数も䞍芁なので削陀したしょう。 このような䞭間結果を蚘録する倉数は、コヌドの理解の助けにはなりたせん。 Ngo ài ra, biến sá»­ dụng chỉ để ghi kết quả trung gian , như $targetKey bên dưới thì cÅ©ng khÃŽng cần thiết nên hãy xóa đi. Các biến ghi lại kết quả trung gian như vậy khÃŽng giúp ta hiểu được code. ❌ Bad Code <?php /** * Xóa user đã được chỉ định khỏi danh sách người gá»­i mail * メヌル送信者リストから指定されたナヌザを削陀する */ function removeUserFromToAddressList ( array $ addressList , int $ removedUserId ) { foreach ( $ addressList as $ key => $ address ) { if ( $ address [ "userId" ] === $ removedUserId ) { $ targetKey = $ key ; } } array_splice ( $ addressList , $ targetKey ) ; return $ addressList ; } 詳しくは埌述したすが、以䞋のように Early Return を行うこずで、 $targetKey を削陀するこずができたす。 Chi tiết sẜ được mÃŽ tả sau, nhưng bạn có thể xóa $targetKey bằng cách thá»±c hiện Early Return như sau. ✅ Good Code <?php /** * Xóa user đã được chỉ định khỏi danh sách người gá»­i mail * メヌル送信者リストから指定されたナヌザを削陀する */ function removeUserFromToAddressList ( array $ addressList , int $ removedUserId ) { foreach ( $ addressList as $ key => $ address ) { if ( $ address [ "userId" ] === $ removedUserId ) { array_splice ( $ addressList , $ key ) ; return $ addressList ; // Early Return } } } 1-3. Shrink the Scope of Variables #倉数 #スコヌプ #Biến #Scope 倉数のスコヌプを狭くする Thu hẹp phạm vi cá»§a các biến このテクニックは非垞に有効です。 このテクニックはコヌドの読みやすさを䞊げるだけでなく、床重なる倉曎に匷くなり、バグを含みにくいコヌドを䜜るこずができたす。 Technique này rất hiệu quả. Kỹ thuật này khÃŽng chỉ làm cho code cá»§a bạn dễ đọc hÆ¡n mà còn làm cho nó có khả năng chống lại các thay đổi lặp lại nhiều lần và làm cho code cá»§a bạn ít bug hÆ¡n. 倉数のスコヌプを広くしおはいけたせんスコヌプが広く、寿呜が長い倉数は、以䞋のような問題を匕き起こしたす。 倉数の倀がどこで倉曎されおいるかわからなくなる 間違っお倉数の倀を䞊曞きしおしたう危険がある 広い範囲でその倉数の倀を芚えながらコヌドを読たないずいけなくなっおしたう 圱響範囲が倚くなり、修正が難しくなる KhÃŽng được phép mở rộng phạm vi cá»§a biến!! Biến có phạm vi rộng và tuổi thọ lâu sẜ gây ra các vấn đề như: Sẜ làm cho bạn khÃŽng biết giá trị cá»§a biến đã được thay đổi ở đâu Có nguy cÆ¡ vÃŽ tình ghi đÚ nhầm lên giá trị cá»§a một biến Bạn vừa phải đọc code vừa nhớ giá trị cá»§a biến đó ở một phạm vi rộng. Phạm vi ảnh hưởng sẜ trở nên nhiều và làm cho việc chỉnh sá»­a trở nên khó khăn hÆ¡n. グロヌバル倉数 を考えるずわかりやすいず思いたす。 グロヌバル倉数 はどこでも読める䞀方で、どこでも曞き換えるこずができおしたいたす。 そのため、 グロヌバル倉数 を䜿った凊理を蚘述するずきには、コヌド党䜓のどこで グロヌバル倉数 の倀が曞き換わるかを調査しおから䜿う必芁があり、ずおも手間がかかりたす。 䞀方、スコヌプが狭い倉数であれば、その倉数が扱われおいる範囲をすぐ理解できるため、意図しない倀の倉曎に怯えながら実装する必芁はありたせん。 コヌドを読むずきに考えるこずをできるだけ枛らすためにも、その倉数のスコヌプを狭くしたしょう。 TÃŽi nghÄ© sẜ dễ hiểu nếu bạn nghÄ© về biến toàn cục (Global variables). Các biến toàn cục có thể đọc ở bất kỳ đâu, mặt khác có thể được viết lại ở bất kỳ đâu. Do đó, khi viết một xá»­ lÜ đã sá»­ dụng biến toàn cục, cần phải khảo sát xem giá trị cá»§a biến toàn cục được viết lại ở đâu trong toàn bộ đoạn code trước khi sá»­ dụng, điều này rất mất thời gian. Mặt khác, nếu biến có phạm vi hẹp, thì bạn có thể dễ dàng hiểu được phạm vi mà biến đó đang được sá»­ dụng do đó bạn khÃŽng cần phải lo sợ trước những thay đổi ngo ài Ü muốn cá»§a các giá trị. Hãy thu hẹp phạm vi cá»§a biến để giảm thiểu tối đa những suy nghÄ© khi đọc code. 以䞋の䟋では、 foo() の内郚で グロヌバル倉数 $dirPath を曞き換えおいたすが、元のコヌドではそれが芋えたせん。 そのため、 グロヌバル倉数 $dirPath が曞き換えられおいるこずに気づかず、実装者は違うファむルに曞き蟌たれるず勘違いしお実装しおしたいたす。 Trong ví dụ sau, biến toàn cục $dirPath được viết lại bên trong foo() , nhưng bạn sẜ khÃŽng thể nhìn thấy ở code gốc. Do đó, implementer sẜ khÃŽng nhận thấy rằng biến toàn cục $dirPath đã được viết lại và sẜ implement với phán đoán sai rằng nó được ghi lại vào một file khác. ❌ ​Bad Code <?php global $ dirPath ; $ dirPath = "/usr/local/system/tmp" ; foo () ; $ filePath = $ dirPath . "/data.log" ; file_put_contents ( $ filePath , "user:Jonh login" ) ; // TÃŽi định ghi dữ liệu vào "/usr/local/system/tmp/data.log" // Trên thá»±c tế, nó được viết vào "/tmp/data.log". // Bởi vì là đang viết lại $dirPath ở trong foo(). // // // "/usr/local/system/tmp/data.log" にテヌタを曞き蟌んだ぀もりだが、 // 実際は "/tmp/data.log" に曞き蟌たれおしたう。 // なぜなら、foo() 内で $dirPath を曞き換えおいるから。 : : : function foo () { global $ dirPath ; $ dirPath = "/tmp" ; } $dirPath を グロヌバル倉数 にせず、 foo() の匕数にするこずで、 $filePath が foo() で利甚されおいるこずを明確に瀺すこずができたす。 Bằng cách dùng $dirPath làm đối số cá»§a foo() mà khÃŽng biến nó thành một biến toàn cục, có thể biểu thị rõ ràng việc $filePath đang được sá»­ dụng trong foo() . ✅ Good Code <?php $ dirPath = "/usr/local/system/tmp" ; $ dirPath = foo ( $ dirPath ) ; // foo()で倀が曞き換えられおいるこずがわかる/ Có thể hiểu rằng giá trị đã được viết lại ở $dirPath = foo($dirPath); // foo() $ filePath = $ dirPath . "/data.log" ; file_put_contents ( $ filePath , "user:Jonh login" ) ; : : : function foo ( $ dirPath ) { $ dirPath = "/tmp" ; return $ dirPath ; } グロヌバル倉数 でなくおも、クラス内の、メンバ倉数がミニ グロヌバル倉数 化しおしたうこずがありたす。 以䞋の䟋の堎合、 $status がミニ グロヌバル倉数 になっおおり、どこで倉曎されおいるかわからない状態になっおしたっおいたす。 Ngay cả khi nó khÃŽng phải là một biến toàn cục, một biến member cá»§a một class có thể trở thành một mini global variable. Trong ví dụ dưới đây, $status đang là một mini global variable và bạn sẜ khÃŽng biết rằng nó đã được thay đổi ở đâu. ❌ Bad Code <?php class StatusLogic { private $ status ; private function updateStatus () { $ this -> status = "ACTIVE" ; $ this -> changeStatusToCorrect () ; return $ this -> status; } private function changeStatusToCorrect () { $ this -> status = "INACTIVE" ; // Xá»­ lÜ sá»­ dụng $status} // $status を䜿う凊理 } } 特に問題がないのであれば、 $status をロヌカル倉数にするこずで、各倉数のスコヌプが狭くなりたす。 Nếu khÃŽng có vấn đề gì, việc dùng $status làm một biến cục bộ sẜ làm thu hẹp phạm vi cá»§a các biến. ✅ Good Code <?php class StatusLogic { private function updateStatus () { $ status = "ACTIVE" ; $ status = $ this -> changeStatusToCorrect ( $ status ) ; return $ status ; } private function changeStatusToCorrect ( string $ status ) { $ status = "INACTIVE" ; // Xá»­ lÜ sá»­ dụng $status // $status を䜿う凊理 return $ status ; } } アクセス修食子を倉えおいい / TÃŽi có thể thay đổi access modifier khÃŽng? #アクセス修食子 #プロパティ #スコヌプ #AccessModifier #Property #Scope 以䞋のクラスでは、メンバ倉数である $userName には private アクセス修食子が指定されおいたす。 Ở class sau, private access modifier được chỉ định cho biến member $userName . <?php class User { /** @var int User id */ private int $ userId ; /** @var string User Name */ private string $ userName ; // ★★★★★ public function __construct ( int $ userId , string $ userName ) { $ this -> userId = $ userId ; $ this -> userName = $ userName ; } } では、あなたが䞊叞から、「このUserクラスの むンスタンス から、 ナヌザ名 を取埗しお衚瀺するように」ず指瀺された堎合、どのように修正したすか この堎合、以䞋のように アクセス修食子を倉曎するこずは避けた方がいい でしょう。 Vì vậy, nếu sếp cá»§a bạn yêu cầu bạn "lấy tên user từ instance cá»§a class User này để hiển thị", bạn sẜ chỉnh sá»­a như thế nào ?? Trong trường hợp này, bạn nên tránh thay đổi access modifier như sau. ❌ Bad Code <?php { /** @var int User id */ private int $ userId ; /** @var string User Name */ public string $ userName ; // ❌ Thay đổi từ `private` thành `public`!! public function __construct ( int $ userId , string $ userName ) { $ this -> userId = $ userId ; $ this -> userName = $ userName ; } } // Xá»­ lÜ khác // 他の凊理 $ user = new User ( 1 , "Jonh" ) ; $ userName = $ user -> userName; // Vì đã đặt `public` nên có thể đọc được. print ( $ userName ) ; アクセス修食子を private から public に倉曎するず、このクラスの むンスタンス を䜿う党おの凊理から倉数の参照ず倉曎ができおしたうため、倉数のスコヌプがずおも広くなっおしたいたす。 最初にこの User クラスを実装した人は、䜕かの理由があっお $userName を private にしおいたはずです。 安易にアクセス修食子を倉曎せず、倉数のスコヌプを広くしない修正方針を考えるべきです。 Nếu bạn thay đổi access modifier từ private thành public , thì phạm vi biến sẜ trở nên rất rộng vì có thể tham chiếu và thay đổi các biến từ tất cả các xá»­ lÜ sá»­ dụng các instance cá»§a class này. Người đã implement class user này lúc đầu chắc có lẜ đã đặt $userName thành private vì có lÜ do nào đó. Bạn nên suy nghÄ© về phương châm fix mà khÃŽng thay đổi access modifier và khÃŽng mở rộng phạm vi cá»§a các biến. たずえば、以䞋のように getter() を䜜成するこずで、少なくずも他の凊理から $userName の䞊曞きは行われなくなりたす。 Ví dụ: bằng cách tạo getter() như sau, ít nhất xá»­ lÜ khác sẜ khÃŽng ghi đÚ lên $userName . ✅ Good Code <?php class User { private int $ userId ; private string $ userName ; public function __construct ( int $ userId , string $ userName ) { $ this -> userId = $ userId ; $ this -> userName = $ userName ; } public function getUserName () { return $ this -> userName; } } : : // Xá»­ lÜ khác // 他の凊理 $ user = new User ( 1 , "Jonh" ) ; $ userName = $ user -> getUserName () ; print ( $ userName ) ; ずはいえ、堎合によっおは private な倀を他の凊理からは党く読み取っお欲しくないコヌドもありたす。 そのずきは、その倀を䜿う凊理をクラス内に実装するなどの工倫が必芁です。 どのような意図でそのコヌドが蚘茉されおいるかを読み取っお、適切な実装を考える こずが倧切です。 Tuy nhiên, tùy trường hợp, cÅ©ng có code mà bạn khÃŽng muốn đọc được tất cả các giá trị private từ xá»­ lÜ khác. Trong trường hợp đó, cần phải cÃŽng phu hÆ¡n chẳng hạn như implement xá»­ lÜ sá»­ dụng giá trị đó ở trong class. Điều quan trọng là phải đọc được code đó đang được mÃŽ tả với Ü định như thế nào và suy nghÄ© về cách implement phù hợp . 1-4. Specify the Type #型 #Type 型を指定する Chỉ định type さお、せっかく ラク スのブログで PHP で蚘事を曞いおいるので、 PHP ならではの泚意事項も蚘茉しおおきたす。 PHP はバヌゞョンアップするたびに、型に厳栌になっおきたした。文字列型ず数倀型の足し算ができなくなったり、 count() 関数の匕数に配列以倖の倀を指定するず゚ラヌになるようになった仕様倉曎がこれにあたりたす。 これに䌎っお、倉数に予期しない型の倀が入っおいるず、思わぬ゚ラヌが生じる堎合がありたす。 そのため、今埌䜜成する PHP コヌドでは、各倉数にどの型が入るかを意識し、違う型の倀が入らないようにするべきでしょう。 Nhân tiện, tuy khÃŽng có mÃŽ tả trong Readable code nhưng vì tÃŽi đã viết một bài blog về PHP trên blog cá»§a Rakus, nên tÃŽi sẜ mÃŽ tả thêm mục chú Ü chỉ đối với PHP . Mỗi khi PHP được nâng cấp, nó trở nên khắt khe hÆ¡n về type. Đó là thay đổi specification như: khÃŽng thể cộng string type với numeric type, hoặc xảy ra lỗi khi chỉ định một giá trị khÃŽng phải là mảng làm đối số cá»§a hàm count() . Cùng với điều này, nếu thêm kiểu giá trị khÃŽng mong muốn vào biến, thì sẜ có trường hợp phát sinh error khÃŽng lường trước được. Do đó, trong code PHP mà bạn sẜ viết trong tương lai, bạn nên Ü thức ở các biến sẜ chứa type nào và tránh đưa vào các giá trị có type khác . たずえば、以䞋のように $result に数倀や文字列が入るようなコヌドは避けたしょう。 Ví dụ: chúng ta nên tránh code có chứa numerical value hoặc character string ở $result như bên dưới. ❌ Bad Code <?php $ countRows = count ( $ rows ) ; if ( $ countRows > 0 ) { $ result = $ countRows ; } else { $ result = "ERROR: NO RESULT" ; } ✅ Good Code <?php $ countRows = count ( $ rows ) ; if ( $ countRows > 0 ) { $ result = $ countRows ; } else { $ result = 0 ; } 2. 条件匏に関するテクニック / 2. Các Technique liên quan đến biểu thức điều kiện コヌド䞭に条件匏があるず考えるこずが増えるため読みにくくなっおしたいたす。 ずはいえ、コヌドから条件匏をなくすこずはできたせんので、できるだけわかりやすい蚘述をするこずが倧事です。 Nếu có các biểu thức điều kiện trong code thì nó khó đọc hÆ¡n vì bạn phải suy nghÄ© nhiều. Tuy nhiên, biểu thức điều kiện khÃŽng thể bị xóa khỏi code, vì vậy điều quan trọng là phải viết nó dễ hiểu nhất có thể. 2-1. The Order of if/else Blocks #if文 #倀の比范 #CâuIf #SoSánhGiáTrị if/else 文の順番 Thứ tá»± cá»§a lệnh if/else 特に理由がある堎合以倖は、吊定より肯定の条件を先に曞きたしょう。 吊定条件が先にあるず、吊定条件が重芁な凊理に芋えおしたいたす。 もちろん、吊定条件の方が重芁な凊理であれば、吊定条件をはじめに曞いおも問題ありたせん。 Trừ khi có lÜ do đặc biệt, còn lại hãy viết điều kiện khẳng định trước điều kiện phá»§ định. Nếu điều kiện phá»§ định có ở phía trước, thì sẜ cho rằng điều kiện phá»§ định là một xá»­ lÜ quan trọng. (Tất nhiên, nếu điều kiện phá»§ định là 1 xá»­ lÜ quan trọng, bạn có thể viết điều kiện phá»§ định ngay từ đầu mà khÃŽng có bất kỳ vấn đề nào.) ❌ Bad Code <?php if ( $ aaa !== $ bbb ) { ... } else { ... } ✅ Good Code <?php if ( $ aaa === $ bbb ) { ... } else { ... } 2-2. Strict Comparisons #型 #PHP #倀の比范 #Type #SoSánhGiáTrị 厳密な比范 So sánh chặt chẜ こちらは PHP ならではの泚意事項です。 Đây là một số lưu Ü chỉ có ở PHP . Tuy nó khÃŽng được đề cập trong Readable code, nhưng tÃŽi sẜ đề cập đến nó vì nó là một vấn đề lớn. 先ほども述べた通り、 PHP はバヌゞョンアップするたびに、型に厳栌になっおきたため、倉数に予期しない型の倀が入っおいるず、思わぬ゚ラヌが生じる堎合がありたす。 そのため、条件匏でも厳栌に型を指定した比范を䜿い、事故を枛らすべきです。 Như đã đề cập trước đó, PHP đã trở nên chặt chẜ hÆ¡n về type mỗi khi nó được nâng cấp version, vì vậy nếu một biến chứa kiểu giá trị khÃŽng mong đợi thì sẜ có trường hợp phát sinh error khÃŽng lường trước được. Do đó, bạn cÅ©ng nên giảm thiểu các sá»± cố bằng cách sá»­ dụng các phép so sánh đã được chỉ định type một cách chặt chẜ ngay cả ở biểu thức điều kiện. 以䞋のように、できるだけ厳栌な比范を行いたしょう。 Thá»±c hiện phép so sánh nghiêm ngặt nhất có thể như bên dưới. ❌ Bad Code <?php if ( $ value == 0 ) { ... } if ( $ value != 0 ) { ... } ✅ Good Code <?php if ( $ value === 0 ) { ... } if ( $ value !== 0 ) { ... } 2-3. Not Use Conditional Branch #if文 #CâuIf 条件分岐を䜿わない KhÃŽng sá»­ dụng phân nhánh điều kiện. さお、ここたで条件匏に぀いおのテクニックを述べおきたしたが、そもそも 条件分岐は少ない方が読みやすいコヌドになりたす 。 条件分岐はロゞックを蚘述する䞊で必芁䞍可欠ではありたすが、あちこちに if 文が存圚するコヌドはずおも読みづらくなっおしたいたす。 Đến đây tuy tÃŽi đã mÃŽ tả Technique về các biểu thức điều kiện, nhưng vốn dÄ© phân nhánh điều kiện mà có ít nhánh thì càng dễ đọc . Mặc dù phân nhánh điều kiện cần thiết khi mÃŽ tả logic, nhưng code mà có tồn tại câu lệnh if ở chỗ này chỗ kia thì sẜ trở nên rất khó đọc. Do đó, mặc dù nó khÃŽng có đề cập ở Readable code nhưng tÃŽi sẜ đề cập đến việc giảm câu lệnh if. 条件分岐を枛らすテクニックはいく぀かありたすが、ここでは1぀だけ玹介したす。 以䞋の䟋では、ナヌザが画面から遞択したチャットツヌルに、メッセヌゞを投皿したす。 ナヌザは、"LINE"、"Slack"、"Zalo" のうち、いずれかのチャットぞメッセヌゞを投皿するこずができたす。 Có một số Technique để giảm phân nhánh điều kiện, nhưng tÃŽi chỉ giới thiệu ở đây một Technique. Ở ví dụ dưới đây,sẜ post message vào Chat tool mà user lá»±a chọn từ màn hình. User có thể post message lên bất kỳ Chat nào trong "LINE", "Slack" hoặc "Zalo". ❌ Bad Code <?php $ chatType = $ request -> get ( "chatType" ) ; $ postMessage = $ request -> get ( "postMessage" ) ; switch ( $ chatType ) { case CHAT_TYPE_LINE : $ lineAccount = getLineAccount () ; $ linePostResult = postMesseageToLine ( $ postMessage ) ; break ; case CHAT_TYPE_SLACK : $ slackAccount = getSlackAccount () ; $ slackPostResult = postMesseageToSlack ( $ postMessage ) ; break ; case CHAT_TYPE_ZALO : $ zaloAccount = getZALOAccount () ; $ zaroPostResult = postMesseageToZalo ( $ postMessage ) ; break ; } : : : // Phần hiển thị màn hình // 画面衚瀺郚分 switch ( $ chatType ) { case CHAT_TYPE_LINE : if ( $ linePostResult === "success" ) { displayMessage ( "Posted a message to LINE." ) ; } else { displayMessage ( "Error occurred when post a message to LINE." ) ; } break ; case CHAT_TYPE_SLACK : if ( $ linePostResult === "success" ) { displayMessage ( "Posted a message to Slack." ) ; } else { displayMessage ( "Error occurred when post a message to Slack." ) ; } break ; case CHAT_TYPE_ZALO : if ( $ linePostResult === "success" ) { displayMessage ( "Posted a message to Zalo." ) ; } else { displayMessage ( "Error occurred when post a message to Zalo." ) ; } break ; } 䞊蚘のように、各チャットの凊理をswitch文もしくはif分で蚘茉するず、凊理が煩雑になっおしたいたす。 そのため、以䞋のように、 各チャットの凊理を蚘茉したクラスの むンスタンス を甚意するこずで、条件分岐を枛らすこずができたす。 たた、条件分岐内の凊理も少なくするこずができたす。 Như đã đề cập ở trên, nếu mÃŽ tả xá»­ lÜ các Chat bằng câu lệnh switch (hoặc if), thì xá»­ lÜ sẜ trở nên phức tạp. Do đó, phân nhánh có điều kiện có thể được giảm bớt bằng cách chuẩn bị instance class có mÃŽ tả xá»­ lÜ cá»§a mỗi Chat như bên dưới. Ngo ài ra, cÅ©ng có thể giảm bớt xá»­ lÜ trong phân nhánh điều kiện. ✅ Good Code <?php $ chatType = $ request -> get ( "chatType" ) ; $ postMessage = $ request -> get ( "postMessage" ) ; switch ( $ chatType ) { case CHAT_TYPE_LINE : $ chat = new Line () ; break ; case CHAT_TYPE_SLACK : $ chat = new Slack () ; break ; case CHAT_TYPE_ZALO : $ chat = new Zalo () ; break ; } // Ở các class chat // có một method `post ()` để post message vào từng Chat // 各チャットのクラスには、 // それぞれのチャットぞメッセヌゞを投皿する `post()` メ゜ッドがある $ postResult = $ chat -> post ( $ postMessage ) ; : : : // Phần hiển thị trên màn hình // 画面衚瀺郚分 if ( $ postResult === "success" ){ displayMessage ( "Posted a message to " . $ chat -> name ()) ; } else { displayMessage ( "Error occurred when post a message to " . $ chat -> name ()) ; } 3. ロゞックの簡略化を行うテクニック / Các kỹ thuật thá»±c hiện đơn giản hóa logic 難しいロゞックを読み解く堎合、脳にはそれだけ負荷がかかっおしたいたす。 できるだけロゞックは簡単にし、誰でも読み解けるようにするこずが重芁です。 Khi đọc hiểu những logic khó, nó sẜ khi ến não bạn căng thẳng. Việc đơn giản hóa logic trong khả năng có thể, để ai đọc vào cÅ©ng có thể hiểu được là điều quan trọng. 3-1. Early Return #EarlyReturn #ガヌド節 #早期リタヌン #GuardClause #ReturnSớm 早くに return する Early Return 関数にお早くに凊理を終了できる堎合は、終了できる状態になったずきに倀を return したしょう。 もう他に凊理を行う必芁がないのに、開発者は return を芋぀けるたでその凊理を読たなければいけなくなっおしたいたす。 Trường hợp có thể kết thúc xá»­ lÜ sớm ở hàm, thì hãy return giá trị khi nó đã ở trạng thái có thể kết thúc. Mặc dù khÃŽng cần thá»±c hiện thêm các xá»­ lÜ khác nhưng Developer phải đọc các xá»­ lÜ đó đến khi tìm thấy return . ❌ Bad Code <?php function isValidInputedUser ( $ inputedUser ) : bool { $ result = true ; if ( $ inputedUser -> id <= 0 ) { $ result = false ; } else { ............... ............... ............... : : ............... ............... ............... } return $ result ; } 以䞋のように蚘茉すれば、最埌たで読たなくおも、 id が0以䞋の堎合は他になにもせず凊理が終わるこずがすぐにわかりたす。 Nếu mÃŽ tả như sau, thì dù khÃŽng đọc đến cuối, bạn có thể thấy ng ay rằng nếu id nhỏ hÆ¡n hoặc bằng 0, thì xá»­ lÜ kết thúc mà khÃŽng cần làm gì khác. ✅ Good Code <?php function isValidInputedUser ( $ inputedUser ) : bool { if ( $ inputedUser -> id <= 0 ) { return false ; } ............... ............... ............... : : ............... ............... ............... return $ result ; } たた、このテクニックは、関数の内郚だけでなく、ルヌプ内でも有効です。 ルヌプ内で凊理を終了できる堎合は、 break を利甚したしょう。 Technique này khÃŽng chỉ hữu ích ở bên trong hàm, mà còn ở bên trong loop. Trường hợp có thể kết thúc xá»­ lÜ ở bên trong loop, thì hãy sá»­ dụng break . ❌ Bad Code <?php // Lấy 1 recipe bạn chưa từng tạo // 䜜ったこずがないレシピを1件取埗する $ done = false ; foreach ( $ recipeList as $ recipe ) { if ( !$ done ) { if ( !$ recipe -> isMade ) { $ done = true ; $ suggestRecipe = $ recipe ; } } } return render ( "sugestOneRecipe.html" , $ suggestRecipe ) ; ✅ Good Code <?php // Lấy 1 recipe bạn chưa từng tạo // 䜜ったこずがないレシピを1件取埗する foreach ( $ recipeList as $ recipe ) { if ( !$ recipe -> isMade ) { $ suggestRecipe = $ recipe ; break ; // Early Return!! } } return render ( "sugestOneRecipe.html" , $ suggestRecipe ) ; 3-2. Minimize Nesting #ネスト #EarlyReturn #ガヌド節 #Nest #GuardClause ネストを浅くする Làm cho nest cạn đi 以䞋のようなコヌドは、ずおも読みにくく感じないでしょうか。 Bạn có cảm thấy code như bên dưới rất khó đọc khÃŽng? ❌ Bad Code <?php if ( $ val < 1 ) { if ( $ val < 0.5 ) { if ( $ val < 0.05 ) { if ( $ val < 0.005 ) { if ( $ val < 0.0005 ) { : : 深いネストがあるず、考えるこずが倚くなるため読みにくいコヌドになりたす。できるだけネストは浅くしたしょう。 個人差はあるず思いたすが、私は Level 3 のネストがあるず解消できないかを考え、Level 4 になるずなんずしおも避けようずしたす。 Việc có nest sâu sẜ làm cho code khó đọc vì nó khi ến bạn phải suy nghÄ© rất nhiều. Hãy làm cho nest cạn nhất có thể. TÃŽi nghÄ© rằng có những sá»± khác nhau với mỗi người, nhưng nếu có nest ở level 3, thì tÃŽi suy nghÄ© xem có thể loại bỏ nó được khÃŽng và nếu là level 4 thì tÃŽi sẜ cố gắng tránh nó bằng mọi cách. ネストを浅くするためには、先ほど玹介した Early Return が有効です。 以䞋のようにif文の条件を敎理するこずで解消できたす。 Để làm cho nest cạn thì phải ON Early Return đã tÃŽi đã giới thiệu trên đây. Có thể xóa bằng việc điều chỉnh điều kiện cá»§a câu lệnh if như dưới đây. ❌ Bad Code <?php $ user = loadUser ( $ userId ) ; if ( $ user -> loadResult === "success" ) { if ( !$ user -> hasPermission ) { $ errorMessage = "ERROR: Permission." ; } else { $ errorMessage = "" ; } } else { $ errorMessage = "ERROR: Failed load." ; } $ display [ "user" ] = $ user ; $ display [ "errorMessage" ] = $ errorMessage ; return render ( "userInfo.html" , $ display ) ; 以䞋の䟋では、Early Return を利甚するこずで、䞊蚘コヌドのネストを1 Level 枛らすこずができたした。 Trong ví dụ dưới đây, chúng tÃŽi có thể giảm bớt nest cá»§a code viết trên xuống 1 level bằng cách sá»­ dụng Early Return. ✅ Good Code <?php $ user = loadUser ( $ userId ) ; $ display [ "user" ] = $ user ; if ( $ user -> loadResult !== "success" ) { $ display [ "errorMessage" ] = "ERROR: Failed load." ; return render ( "userInfo.html" , $ display ) ; } if ( !$ user -> hasPermission ) { $ display [ "errorMessage" ] = "ERROR: Permission." ; return render ( "userInfo.html" , $ display ) ; } $ display [ "errorMessage" ] = "" ; return render ( "userInfo.html" , $ display ) ; 4. 目的に合わせたコヌドにするテクニック / Techniques làm cho code đúng bản chất 基本的に、プログラムで行う凊理は小さな問題に分割されおいる方が䟿利です。 䟋えば、倧きな関数があり、その関数内で党おの凊理を行っおいるずしたら、 なにか仕様倉曎があったずきにはその関数内で行われおいる党おの凊理をテストする必芁がありたす。 たた、倧きな関数では、コヌドを読むずきもこの関数では最終的に䜕がやりたいのか分かりづらくなっおいるでしょう。 そのため、保守性が高く読みやすいコヌドを曞くためには、 その凊理でやりたい本圓の目的 を明確にしお、 目的でない問題は他の凊理に切り出す こずが必芁です。 Về cÆ¡ bản, rất tiện lợi khi chia xá»­ lÜ thá»±c hiện trong program thành các vấn đề nhỏ. Ví dụ: nếu có một hàm lớn và đã thá»±c hiện tất cả xá»­ lÜ trong hàm đó, khi có sá»± thay đổi specification gì đó, thì cần phải test tất cả các xá»­ lÜ được thá»±c hiện trong hàm đó. Ngo ài ra, đối với hàm lớn, cả khi đọc code, bạn cÅ©ng bị khó biết được là cuối cùng bạn muốn làm gì trong hàm này đúng khÃŽng. Do đó, để viết code có tính bảo trì cao và dễ đọc, hãy làm rõ vấn đề bản chất mà bạn muốn làm trong xá»­ lÜ này , cần cắt các vấn đề khÃŽng phải là bản chất sang xá»­ lÜ khác . 4-1. Be General-Purpose Code 汎甚コヌドにする Chọn code đa dụng #疎結合 #密結合 #独立したコヌド #責務 #倖出し #LiênKếtLỏngLẻo #LiênKếtChặtChẜ #CodeĐộcLập #TráchNhiệm #OutputRaNgoài 凊理を他の関数に切り出すずき、 できればその関数はアプリケヌションに無関係な独立したコヌドになっおいる方がいいでしょう。 もし、そのコヌドがアプリケヌションの仕様に䟝存しおいた堎合は、 コヌドの内容を理解するためにアプリケヌションの仕様を理解しおおく必芁がありたすし、 アプリケヌションの仕様が倉曎されたずき、そのコヌドも合わせお修正する必芁がありたす。 たた、独立したコヌドは、そのコヌドのみで実行するこずができるため、 テストも簡単に行うこずができたす。 切り出したコヌド自䜓はできるだけ他の凊理ず䟝存せず、 疎結合 な状態を保぀こずで、 保守性の高いコヌドになりたす。 Khi cắt xá»­ lÜ sang hàm khác, nếu có thể thì hàm đó nên là code độc lập khÃŽng liên quan đến application đúng khÃŽng. Nếu code đó đã tồn tại trong specification cá»§a application, thì cần phải hiểu spec cá»§a application để hiểu nội dung code, và khi spec cá»§a application bị thay đổi, thì code đó cÅ©ng cần chỉnh sá»­a cho phù hợp. Ngo ài ra, code độc lập có thể thá»±c thi chỉ với code đó, nên việc test cÅ©ng có thể thá»±c hiện dễ dàng. Chính bản thân code đã cắt ra khÃŽng phụ thuộc với xá»­ lÜ khác hết mức có thể, và giữ trạng thái loosely coupling, nên sẜ trở thành code có tính bảo trì cao . 以䞋はアプリケヌションぞの䟝存性が高いコヌドです。 Dưới đây là code có tính phụ thuộc vào application cao . ❌ Bad Code <?php // Hiển thị recipe yêu thích cá»§a user // ナヌザのお気に入りレシピを衚瀺する $ favoriteRecipeName = getUserfavoriteRecipe () ; print "<p> { $ favoriteRecipeName } </p>" ; /** * Lấy recipe yêu thích cá»§a user * ナヌザのお気に入りレシピを取埗する * @return string Recipe name yêu thích / お気に入りレシピ名 */ function getUserfavoriteRecipe () : string { $ userId = $ _COOKIE [ "userId" ] ; // ★★★★★ $ user = new User ( $ userId ) ; return $ user -> favoritRecipe -> name ; } getUserfavoriteRecipe() の䞭に泚目しおください。 関数の䞭で cookie からナヌザIDを取埗しおいたす。 しかし、これはアプリケヌションのどこかで cookie にナヌザIDを保存しおいるため実行できるのであっお、 もし、 cookie にナヌザIDが保存されおいない堎合ぱラヌになっおしたいたす。 ぀たり、「ナヌザIDが cookie に保存されおいる」ずいうアプリケヌションの仕様に䟝存しおしたっおいる状態です。 Hãy tập trung vào trong getUserfavoriteRecipe() . Đã lấy user ID từ cookie trong hàm. Tuy nhiên, điều này có thể thá»±c thi vì đã lưu user ID vào cookie ở đâu đó trong application, nên nếu user ID khÃŽng được lưu vào cookie thì sẜ bị lỗi Nói cách khác, là trạng thái phụ thuộc vào spec cá»§a application gọi là  "user ID được lưu trong cookie ". 凊理を倖出しする堎合は、以䞋のように仕様から独立した぀くりにするべきでしょう。 Khi going out xá»­ lÜ, thì nên tạo độc lập từ spec như dưới đây nhỉ. ✅ Good Code <?php // Hiển thị recipe yêu thích cá»§a user // ナヌザのお気に入りレシピを衚瀺する $ userId = $ _COOKIE [ "userId" ] ; // ★★★★★ $ favoriteRecipeName = getUserfavoriteRecipe ( $ userId ) ; print "<p> { $ favoriteRecipeName } </p>" ; /** * Lấy recipe yêu thích cá»§a user * ナヌザのお気に入りレシピを取埗する * @param int $userId * @return string Recipe name yêu thích / お気に入りレシピ名 */ function getUserfavoriteRecipe ( int $ userId ) : string { $ user = new User ( $ userId ) ; return $ user -> favoritRecipe -> name ; } ナヌザIDを関数の倖で取埗しお匕数で枡すこずにより、 getUserfavoriteRecipe() は仕様から解攟されたした。 これで関数単䜓のテストも容易に䜜成するこずができたす。 Do lấy user ID ở ngo ài hàm và truyền với đối số, nên getUserfavoriteRecipe() đã được giải phóng khỏi specification. Điều này làm cho có thể tạo unit test cho hàm dễ dàng. ただし、もちろんやりすぎはよくありたせん。 あたりに凊理を分けすぎるず、凊理があちらこちらに飛んでしたい、凊理の流れを远いづらくなりたす。 適切な粒床を刀断しお、凊理を分けるようにしたしょう。 Nhưng tất nhiên, làm quá mức là khÃŽng tốt. Nếu chia xá»­ lÜ quá nhiều, thì xá»­ lÜ sẜ bay sang chỗ này chỗ kia, dẫn đến khó theo dõi luồng xá»­ lÜ. Hãy phán đoán độ chi tiết phù hợp để phân chia xá»­ lÜ. 4-2. Simple is more important than Easy Easy より Simple が倧事 Simple quan trọng hÆ¡n Easy #SimpleMadeEasy #Simple #責務 #TráchNhiệm さお、この蚘事は日本語ず ベトナム語 で曞かれおいたすが、ここで少し英語の話をさせおください。 翻蚳チヌムのみなさん、ややこしくおすみたせん。。。 Bài viết này được viết bằng tiếng Nhật và tiếng Việt, nhưng chỗ này thì hãy để tÃŽi nói bằng tiếng Anh một chút. (Xin lỗi vì team dịch vì hÆ¡i rắc rối một chút...) "Easy" ず "Simple" の違いを考えたこずはあるでしょうか 日本語では䞡方ずも「簡単」ず蚳せたす。 ベトナム語 はどうでしょう しかし、英語でのこれらには埮劙なニュアンスの違いがありたす。 Bạn đã từng suy nghÄ© về sá»± khác nhau giữa "Easy" và "Simple" đúng khÃŽng? Trong tiếng Nhật thì cả 2 đều dịch là「Đơn giản」.Tiếng Việt thì sao Tuy nhiên, có sá»± khác biệt nhỏ về sắc thái giữa các từ này trong tiếng Anh. このニュアンスの違いに぀いお、 Clojure の䜜者である Rich Hickey が数幎前に "Simple Made Easy" ずいう発衚をしおいたす。 *2 *3 Về sá»± khác biệt sắc thái này, Rich Hickey là tác giả cá»§a Clojure đã có phát biểu gọi là "Simple Made Easy" trong vài năm trước. *4 *5 この発衚によるず、"Simple" の語源は ラテン語 の "simplex" であり、「1回折る」「1回線む」などの意味をもち、いずれも「単䞀の」ずいう意味を含みたす。 たた、察矩語は 「絡たった」「も぀れおいる」ずいった意味を持぀ "Complex" です。 Theo phát biểu này, nguồn gốc cá»§a từ "Simple" là "simplex" từ tiếng Latinh, có nghÄ©a là "gấp 1 lần", "đan 1 lần", v.v., tất cả đều bao hàm Ü nghÄ©a là " cá»§a đơn nhất". Ngo ài ra, từ trái nghÄ©a là "Complex", có nghÄ©a là "vướng" hoặc "rối". 䞀方、"Easy" の語源は ラテン語 の "adjacens" ず蚀われおおり、「近くにある」「身近な」「芪しみのある」ずいう意味をもち、 察矩語は "Difficult" か "Hard" です。 Mặt khác, nguồn gốc cá»§a từ "Easy" được gọi là "adjacens" từ tiếng Latinh, có nghÄ©a là「Ở gần」「Gần gÅ©i」「Thân thiện」, Từ trái nghÄ©a là "Difficult" hoặc "Hard". ここで倧事なこずは、"Easy" の「身近な / 芪しみのある」ずいう意味は、あくたで䞻芳的、盞察的な意味であり、 "Simple" の「単䞀の」ずいう意味は客芳的であるずいう点です。 Điều quan trọng ở đây là Ü nghÄ©a "Gần gÅ©i / Thân thiện" cá»§a từ "Easy" chỉ mang tính chá»§ quan và tương đối. Ý nghÄ©a cá»§a " cá»§a đơn nhất" trong "Simple" là điểm mang tính khách quan. たずえば、メヌルを送信する関数があるずしたす。 この関数はずおも高機胜で、匕数に From アドレスや、To アドレスを指定できるだけでなく、 添付ファむルがある堎合は添付ファむルのパスを匕数に指定するこずで利甚できるほか、 To アドレスを配列にすれば耇数の To アドレスを指定でき、 さらに、テキストず HTML の本文文字列をそれぞれ匕数に枡せばマルチパヌトメヌルにも送信できたす。 Ví dụ: giả sá»­ có một hàm gá»­i mail. Hàm này có tính năng rất cao , khÃŽng chỉ có thể chỉ định From address và To address cho đối số mà còn nếu có file đính kÚm, bạn còn có thể sá»­ dụng khi chỉ định path cá»§a file đính kÚm cho đối số, ngo ài ra nếu đặt To address là mảng, thì còn có thể chỉ định nhiều To address, thêm nữa, nếu truyền chuỗi body cá»§a text và HTML lần lượt cho đối số thì còn có thể gá»­i tới multipart mail. ぀たりこの関数は、あらゆるメヌルを "Easyに" 䜜成できる関数です。 Nói cách khác, hàm này là hàm có thể tạo tất cả các mail một cách "Easy" しかし、匕数によっおさたざたな条件があるため、この関数の䞭には非垞に倚くの if 文が含たれたす。 添付ファむルがあった堎合の if 文、マルチパヌトメヌルを送る堎合の if 文 etc... Tuy nhiên, bao gồm rất nhiều câu if trong hàm này vì có các điều kiện khác nhau tùy thuộc vào đối số. (Câu if khi có file đính kÚm, câu if khi gá»­i multipart mail, v.v.) そのため、この関数は "Complexである" ずも蚀え、 䞋図の②にあたりたす。 Vì vậy, hàm này có thể gọi là "Complex", tương ứng với ② trong hình dưới đây. さお、この関数が存圚するシステムで「 SMTP サヌバを指定する」機胜を実装するこずになったずしたす。 この堎合、䞊蚘の "Easyな" 関数を修正するこずは非垞に難しくなりたす。 なぜなら、条件分岐がたくさんあるため考慮事項が増えおしたい、テストも非垞に難しくなっおしたいたす。 たた、この関数を䜜成した本人は内容を理解できるかもしれたせんが、 他の人が芋るず条件分岐がずおも倚く読みづらいコヌドに芋えおしたうこずでしょう。 Bây giờ, giả sá»­ quyết định implement chức năng "chỉ định SMTP server" trên system tồn tại hàm này. Trong trường hợp này, sẜ rất khó chỉnh sá»­a hàm có tính "Easy" viết trên. LÜ do là vì có nhiều phân nhánh điều kiện nên mục cân nhắc tăng lên và việc test cÅ©ng trở nên rất khó khăn. Ngo ài ra, chính người tạo ra hàm này có lẜ có thể hiểu nội dung, nhưng mà nếu người khác xem , thì sẜ thấy rất nhiều nhánh điều kiện và có vẻ như là code khó đọc. この関数は、ずある1堎面ではずおも䟿利で Easy かもしれたせが、 Complex になっおいるため、拡匵性がなく他の堎面では Easy でなくなっおしたいたす。 Hàm này có thể rất tiện lợi và Easy trong 1 tình huống nào đó, nhưng mà vì nó là Complex, nên với tình huống khác khÃŽng có tính mở rộng thì sẜ trở nên khÃŽng Easy. この堎合、Easy よりも、Simple であるこずを重芖すべきです。 Trường hợp này, thì nên chú trọng là Simple hÆ¡n là Easy. Simple、぀たり単玔でわかりやすいこずを心がけた堎合、そのコヌドは拡匵性に優れ、さらに他者にも読みやすくなりたす。 もちろん、Easy であるこずはいいこずですが、Easy であるこずを求めたため、Complex になっおしたっおは意味がありたせん。 拡匵性がなく、バグを生み出しやすいコヌドより、利甚するために手間がかかるが単玔でわかりやすいコヌドの方がずっず嬉しいです。 実装を行うずきは、Easy より Simple を重芖すべきです。 Simple, tức là nếu giữ suy nghÄ© cố gắng để cho nó đơn giản và dễ hiểu, thì code đó sẜ có tính mở rộng, và cả người khác cÅ©ng dễ đọc hÆ¡n nữa. Tất nhiên, Easy là tốt, nhưng mà vì đã yêu cầu là Easy, nên nếu trở thành Complex thì khÃŽng có Ü nghÄ©a gì. So với code khÃŽng có tính mở rộng, dễ sinh ra bug, thì dù mất thời gian cÃŽng sức để sá»­ dụng tÃŽi vẫn thích code đơn giản dễ hiểu hÆ¡n. Khi thá»±c hiện implement, nên chú trọng Simple hÆ¡n là Easy. 4-3. Avoid Too Fat Code 肥倧化したコヌドを避ける Tránh code cồng kềnh #やりすぎ #仕様を枛らす #LàmQuáNhiều #GiảmSpecifications コヌドは少なく短い方が保守性や可読性が高くなりたす。 これの解決方法は、䞍芁な仕様を枛らすこずだけではありたせん。 そもそものコヌドを小さく関数やクラスに分割し、 他のコヌドから分離するこずで、事実䞊コヌドを短くするこずができたす。 他の凊理から分離されおいるこずが明確なコヌドは、 仕様の远加時やバグの修正時にも線集箇所が局所的になるため、修正や品質の担保が容易になりたす。 他の項目でも觊れたしたが、汎甚的なコヌドを意識するこずや、凊理を分離するこずなどを考え぀぀、 コヌドの "重量" を意識し、できるだけ軜量なコヌドを曞くよう心がけたしょう Code càng ngắn thì tính bảo trì và tính dễ đọc càng cao . Giải pháp cho điều này khÃŽng chỉ là giảm các spec khÃŽng cần thiết. Ngay từ đầu, nếu chia code nhỏ ra thành các hàm và class, và tách khỏi code khác, thì trên thá»±c tế có thể rút ngắn code lại. Code mà rõ ràng được việc phân tách khỏi xá»­ lÜ khác thì, vì cả khi thêm spec hoặc khi chỉnh sá»­a bug, những chỗ edit sẜ mang tính cục bộ , nên việc chỉnh sá»­a và đảm bảo chất lượng sẜ đơn giản hÆ¡n. Như tÃŽi đã đề cập trong các mục khác, hãy cùng để tâm đến việc nhận thức đến code đa dụng, vừa suy nghÄ© về việc phân tách xá»­ lÜ, để tâm đến "trọng lượng" cá»§a code và cố gắng viết code nó càng nhẹ càng tốt! おわりに / Lời kết 先の蚘事でも觊れたしたが、日本ず ベトナム では文化だけでなく、゚ンゞニア向けのコンテンツ量も違いたす。 お互いに蚀語も違いたすし、英語を䜿ったずしおもお互いの母囜語ではないためどこたで意図が䌝わるかは䞍確定です。 この蚘事を利甚するこずで、 ベトナム ずの霟霬のない開発が行えるこずを願いたす。 Như tÃŽi đã đề cập trong bài viết trước, khÃŽng chỉ văn hóa mà lượng nội dung dành cho kỹ sư cÅ©ng khác nhau giữa Japan và Việt Nam. NgÃŽn ngữ khác nhau, và ngay cả khi bạn sá»­ dụng tiếng Anh, cÅ©ng khÃŽng chắc chắn Ü đồ sẜ được truyền đạt vì nó khÃŽng phải là ngÃŽn ngữ mẹ đẻ cá»§a cả 2. Chúng tÃŽi hy vọng rằng khi sá»­ dụng bài viết này, sẜ có thể phát triển mà khÃŽng có sá»± hiểu lầm với Việt Nam. RAKUS Vietnam Co.,Ltd Rakus Việt Nam đang tích cá»±c tuy ển dụng kỹ sư ( Java , PHP ) và member QA. Bạn có muốn cùng tạo ra những sản phẩm SaaS với chất lượng như blog này khÃŽng? Nếu bạn quan tâm, hãy ứng tuy ển nhé. ラク ス ベトナム では、゚ンゞニア( Java , PHP )やQAメンバの採甚を積極的に行っおいたす。 このブログのような品質を意識した自瀟 SaaS プロダクトを䞀緒に䜜りたせんか ご興味ありたしたら、是非応募をお願いしたす。 www.rakus.com.vn ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com *1 : 原版の翻蚳や芁玄ではありたせんのでご泚意ください。 *2 : https://www.infoq.com/presentations/Simple-Made-Easy/ *3 : https://speakerdeck.com/takeru0757/simple-is-not-easy *4 : https://www.infoq.com/presentations/Simple-Made-Easy/ *5 : https://speakerdeck.com/takeru0757/simple-is-not-easy
技術広報の yayawowo です。 『仕様曞』 ず聞き、䜕の仕様曞を思い浮かべたすでしょうか たた、仕様曞ず蚭蚈曞の違いを説明できるでしょうか 今回は、仕様曞ずは䜕なのかをはじめ、皮類や䜜成のポむントなどを分かりやすく解説したいず思いたす システム開発 に携わる方は、是非ご参考になさっおください。 仕様曞ずは 仕様曞があるず良いこず 蚭蚈曞ず䜕が違うの 仕様曞の皮類 芁求仕様曞 機胜仕様曞 技術仕様曞 テスト仕様曞 良い仕様曞ずは 芁求事項挏れがない 図衚を䜿い、䞁寧に説明しおいる 機胜の振る舞いを明確にしおいる おすすめ曞籍 ラクスの特城 終わりに ◆ 関連ブログも合わせおご確認ください ・ 「芁求を仕様化する技術・衚珟する技術」から孊ぶ芁求仕様曞䜜成テクニック ・ プロゞェクトマネゞメント ずは 【たずめ】 ・ PMBOK ずは【たずめ】 ・ 芁件定矩 ずは【たずめ】 ・ プロゞェクトマネゞメントTips 20遞 珟堎から語るプロマネの極意 仕様曞ずは 仕様曞ずは、 システム開発 の仕様機胜/性胜/特性/満たすべき芁件などをたずめた曞類のこずを蚀いたす。 簡単に蚀えば、「こんなシステム䜜りたすよ」を説明した曞類です 仕様曞があるず良いこず 仕様曞があるこずにより、以䞋を回避するこずが出来るずいえたす。 回避䟋 ステヌクホルダヌ ずの認識違い 仕様挏れ 仕様倉曎による、 工数 増加 仕様倉曎による、スケゞュヌル遅延 などなど 䞊蚘は䞀䟋に過ぎたせんが、仕様曞があるこずによるメリットは倚くありたす。 蚭蚈曞ず䜕が違うの システム開発 を行う䞭で、 蚭蚈曞 もよく聞く蚀葉だず思いたす。 倧きな違いは以䞋2点です。 ①. 仕様曞の内容に察しおの実珟方法開発過皋が蚘茉されおいる ②. 蚭蚈曞は開発偎が䜜成するものであるため、技術的内容ずなる 文字だけではわかりにくいかず思いたすので、 ナヌザヌからオムラむスを䜜っおほしいず䟝頌された堎合を䟋に説明したいず思いたす 図䟋オムラむス 仕様曞結果 オムラむス 蚭蚈曞過皋 オムラむスを䜜る方法 ご飯を炊く 玉ねぎをみじん切りにする フラむパンに火を぀け、サラダ油を入れる みじん切りした玉ねぎを炒める etc
 いかがでしょうか 少しは仕様曞ず蚭蚈曞の違いをご理解いただければ幞いです 仕様曞の皮類 仕様曞にはいく぀か皮類がありたす。 こちらでは、代衚的な4぀に絞っお説明したいず思いたす 芁求仕様曞 芁求仕様曞ずは、開発するサヌビスや補品が持぀べき機胜/特性/特城などをたずめた曞類です。 ナヌザヌが開発郚隊に察しお開発を䟝頌するものであり、具䜓的な技術芁件を蚘茉しおいるものではございたせん。 芁求仕様曞には、最䜎限必芁な芁玠である 5W1H をたずめる必芁がありたす。 WHENい぀ WHEREどこで WHOだれが WHAT䜕を WHYなぜ HOWどのように 機胜仕様曞 機胜仕様曞ずは、前述した芁求仕様曞のニヌズをどのようにしおシステムの機胜で実珟するかをたずめた曞類です。 開発郚隊の責任者であるPMプロゞェクトマネヌゞャヌやSE システム゚ンゞニア が、ナヌザヌの芁望を ヒアリ ングし、䜜成したす。 䜜成目的は、゚ンドナヌザヌである䟝頌者ず、開発者である開発郚隊で認識霟霬の発生を回避するためです。 機胜仕様曞を芋るこずで、 システム開発 にすぐ着手できるよう、䞁寧に䜜成するこずが必芁になりたす 技術仕様曞 技術仕様曞ずは、前述した機胜仕様曞にたずめた機胜を システム開発 でどのように実珟するかをたずめた曞類です。 開発郚隊のSE システム゚ンゞニア 、 プログラマヌ が盞談しながら䜜成したす。 認識霟霬がありながらの システム開発 はずおも危険です。 技術仕様曞を䜜成し、技術的な定矩や手法をはっきりさせお開発を進めるこずが重芁になりたす。 テスト仕様曞 テスト仕様曞ずは、䜜成した芁件定矩曞通りにシステムが開発/機胜できおいるか、をテストするためにたずめた曞類です。 どの機胜を、どのテスト技法で動䜜確認するかを蚘茉しおおりたす。 䞻に、 結合テスト や総合テスト工皋をたずめおおりたす。 テスト蚈画曞、テスト蚭蚈曞が類䌌曞類ずしおありたすので、こちらも少し解説したす。 テスト蚈画曞 システム開発 におけるテスト方針目的/範囲/人員/スケゞュヌルなどをたずめた曞類 テスト蚭蚈曞 テスト仕様曞ず扱いは同じであり、テスト蚭蚈仕様曞ず呌ぶこずもある ◆ 関連ブログ tech-blog.rakus.co.jp 良い仕様曞ずは 芁求事項挏れがない 仕様曞は、開発者にずっお システム開発 の軞ずなるものです。 その仕様曞に芁求事項の挏れがあった堎合、どうなるず思いたすか お察しの通り、開発スケゞュヌルの遅延だけでなく、システム品質の䜎䞋やコスト増加を招くこずになりかねたせん。 システム開発 で䜕をしおほしいか、を仕様曞にしっかり萜ずし蟌むこずが倧倉重芁ずなりたす。 図衚を䜿い、䞁寧に説明しおいる 仕様曞を読むのは仕様曞を曞いた本人でなく、第 䞉者 になりたす。 誰が芋おも分かりやすい資料にするには、図衚を䜿った説明が効果的です。 しかし、ただ単に図衚を䜿えば良いずいうものではありたせん。 想定する利甚ナヌザヌが完成したシステムをどのように䜿うかを明確なストヌリヌや、むメヌゞ図を䜿っお開発者に䌝える必芁がありたす。 ワむダヌフレヌム や画面遷移図、シヌケンス図、開発前埌の比范画像等を仕様曞内に入れおおくず良いかもしれたせん。 機胜の振る舞いを明確にしおいる 芁求事項の挏れがない仕様曞も倧事ですが、现郚たで機胜の振る舞いを明確に定矩するこずも倧倉重芁です。 開発玍期に開発者から提䟛されたシステムを確認した際、 「あれこの機胜がないんだけど・・・」 このようなこずが起きおしたうのは、倧倉危険です。 この堎合、リリヌス延期や远加開発になるこずが想定されたす。 仕様曞には、機胜の振る舞いを明確に定矩するこずで、最終的な成果物の品質を向䞊させたしょう。 おすすめ曞籍 仕様曞を初めお曞く人におすすめの曞籍をご玹介させおいただきたす 孊習の䞀助ずなれば幞いです。 『SE䞀幎目のための仕様曞の曞き方』 「仕様曞ずは䜕か」を知りたい方におすすめです。 手戻りが発生しない、分かりやすい仕様曞を曞きたい方に分かりやすく解説された1冊になりたす 『速効メ゜ッド IT゚ンゞニアのためのビゞネス文曞䜜成術』 ゚ンゞニアだけでなく、ビゞネスサむドの方にもオススメしたい曞籍です。 具䜓的なケヌスやテンプレヌトもあり、盎ぐに実践できる内容ずなっおおりたす。 『[入門+実践]芁求を仕様化する技術・衚珟する技術 -仕様が曞けおいたすか?』 「芁求」ずはなにか、「仕様」ずはなにか、を具䜓的に解説しおくれおいる䞀冊です。 芁求仕様曞䜜りの考え方や具䜓的プロセスを身に぀けるために、是非ご䞀読ください。 ラク スの特城 䞊蚘は、圓瀟の 開発プロセス になりたす。 仕様曞を䜜成/よく掻甚するタむミングは、以䞋タむミングずなりたす。 芁件定矩 抂芁蚭蚈 詳现蚭蚈実装受入 ラク スでは䞭堅゚ンゞニアはもちろんのこず、若手゚ンゞニアでも芁件定矩や抂芁蚭蚈に関わる事が可胜です。 若手゚ンゞニアにずっおは成長できる堎をご準備しおおりたす 少しでも圓瀟にご興味をお持ちの方がおりたしたら、たずは圓瀟が䞻催する技術/採甚むベントにご参加ください。 ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com お埅ちしおおりたす 終わりに 「仕様曞」のたずめは、いかがでしたでしょうか 仕様曞は システム開発 を行う䞭で、芋返すこずが倚い曞類になりたす。 䜜成をする際は、情報の過䞍足がないものを䜜れるように頑匵っおください たた今回初めお䜜る方は、曞籍を読むこずは倧前提ですが、既存の仕様曞を読み返すこずもおすすめです。 先茩方の知恵を有効掻甚し、是非ご自身が䜜る仕様曞を良いものにしおいただけたすず幞いです。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
初めに 初めたしお、sakekobaです。 普段むンフラのお仕事をさせお頂いおおりたすが、ここ数幎の間に「SRE」ずいう蚀葉を聞くようになったように感じたす。 SREに぀いお知りたいけど難しいな 。ず思っおいたので、SREに぀いお、出来るだけ分かりやすくたずめる事にチャレンゞしたした。 「SRE」ずは分かりやすく蚀うず䜕なのか SREの取り組みは、具䜓的に䜕をすればいいのか どういう人がSREに向いおいるのか ずいう点に぀いお、たずめおみたした。 目次 初めに 目次 「SRE」ずは 「SRE」の「信頌性」を定矩する SLI SLA SLO 省力化する 信頌性向䞊のための掻動を行う ゚ラヌバゞェット ポストモヌテム ラクスのSRE課に぀いお ラクスの取り組み どういう人がSRE゚ンゞニアに向いおいるのか 「SRE」ずは 「SRE」をざっくり蚀うず「新しいサヌビス運甚の考え方、そしおその圹割」です。 SREずは「サむト・リラむアビリティ・゚ンゞニアリング」の頭文字をずった蚀葉で、日本語では「サむト信頌性゚ンゞニアリング」ずなりたす。 サむトサヌビスの信頌性を゚ンゞニアリングする意蚳ですが、しっかり䜜りこむこずを目的ずしお、 システム゚ンゞニア リングの知芋からのアプロヌチで、システム管理、運甚をより良くしたす。 SREの䞭で謳われおいる「信頌性が高い」ずは、ナヌザが期埅通りにサヌビスを䜿える障害等で䜿えないこずが無い少ない状態のこずです。 勿論、SREが広たる前もシステムの運甚者は高い信頌性維持を目指しおいたすが、システム運甚に求められるスキルは、「サヌバ・NW・ ミドルりェア 等の幅広い知識を以お安定運甚に寄䞎するこず」であるため、運甚者自身が手でコマンドを打぀等で運甚䜜業を行うこずが倚い状態でした。 そのため、䟋えば䞋蚘のような問題がありたした。 手䜜業が倚いず、それだけヒュヌマン゚ラヌで障害のリスクがある サヌビスの芏暡が倧きくなるず䜜業が増倧し、人手や時間ずいったコストをかける必芁があり、䞍具合改修、サヌビス向䞊にコストを振り分けられない サヌビスの「開発者」ず「運甚者」が完党に分かれおいるこずで、「ナヌザの為により良い改善をどんどんリリヌスしたい」開発ず、「安定皌働の為には、システムのリリヌス䜜業は最小限にしたい」ず考える運甚の間に倧きな壁がありリリヌスのスピヌドが遅くなる などなど  これらの問題を解消する圹割が、SREです。 䟋えば䞋蚘がありたす。 SREチヌムが「信頌性」を定矩し、皆で同じ方向を向く 手䜜業が倚いシステム管理・運甚の分野に、SREが自動化を取り入れる その他、゚ラヌ蚱容の定矩や障害発生時の事埌怜蚌等、信頌性向䞊のための掻動を行う SREずいう蚀葉を提唱したのは Google 瀟ですが、その Google 瀟が、䞋蚘の資料を公開しおいたす。 sre.google たた、このSREに぀いおの資料の日本語版が オラむリヌ 瀟より出版されおいたす。 www.oreilly.co.jp SREは䌚瀟・サヌビスの課題によっお様々なアプロヌチで信頌性の向䞊に取り組みたす。 このブログでは、先に䞊げたSREの圹割の䟋 信頌性の定矩 省力化する 信頌性向䞊のための掻動 を少し掘り䞋げお蚘茉したいず思いたす。 「SRE」の「信頌性」を定矩する SREの゚ンゞニアチヌムには、「信頌性」を定矩しお関わる人を同じ方向に向ける圹割がありたす。 そもそも「信頌性が高いサヌビス」ずは䜕でしょうか。 24時間垞に動䜜しおいお、応答が即座に返っおきお ず、思い぀くものはあるかず思いたすが、具䜓的にするずどうでしょう。 䟋えば・・・ 「 ECサむト で決枈だけされお賌入圚庫の確保が遅い時があった」ら買えない堎合もあり、怖くお䜿えないかもしれたせんが、「暇぀ぶしの無料動画サむトで読み蟌みが遅い時があった」ずしおも、怖くお䜿えないずたでは思わないかもしれたせん。 たた、同じ ECサむト だずしおも、「お気に入りリスト」のような付属機胜の曎新が䞀時的に䜿えなかったずしおも、賌入機胜ほど困らないかもしれたせん。 このように、ものによっお党く違う期埅に応える必芁があるため、SREでは具䜓的に数字に萜ずし蟌むこずで、関わる人が同じ方向を向けるようにしたす。 SREではこの信頌性の定矩を、SLI 、 SLA 、SLOを甚いお行いたす。 SLI サヌビス・レベル・むンゞケヌタヌず読みたす。 サヌビスレベルを枬るため、 定量 的な指暙を定矩したす。 たずえば、「早くサむトが衚瀺される」ずいう目暙だけでは、「1秒で衚瀺されるのは遅い早い」のように人によっおバラバラな捉え方をしおしたいたす。 その為「理想的なリク ゚ス トの 応答時間 は0.5秒」のように指暙ずなる 定量 的な項目を定矩し、埌述のSLOを枬るために䜿いたす。 SLA サヌビス・レベル・アグ リヌメント ず読みたす。 この蚀葉自䜓はSREに特化したものではない為、SREに関わらず、この甚語を耳にされたこずがあるかもしれたせん。 サヌビスを䜿甚するナヌザず「合意した察倖的に玄束した」サヌビスの品質のこずです。 この「合意」はお金を払っお契玄しおいるサヌビスで、契玄曞に明蚘されおいる堎合もあり、「契玄違反では」ず蚀えおしたうようなものです。 絶察に守るべきラむンずなるため、次に挙げる「SLO」より緩く蚭定されおいるこずが䞀般的です。 SLO サヌビス・レベル・オブゞェクティブず読みたす。 内郚的に蚭定したサヌビスレベルの目暙倀です。 関わる人の認識を合わせるためでもあるので、高すぎおも、䜎すぎおも問題がありたす。 高すぎるず、垞に目暙達成のため原因远及をする矜目になりたす。 䜎すぎるず、普段は良くおも「内々にはSLOの範囲だけどい぀もより悪いずナヌザからクレヌムが来た」等の時に察応に困る矜目になりたす。 SLOの考え方に぀いおは、 Google のブログに具䜓的に曞かれた蚘事がありたす。 cloud.google.com 省力化する 冒頭で䞊げた問題の䟋に、手䜜業に䌎う問題がありたした。 手䜜業が倚いず、それだけヒュヌマン゚ラヌで障害のリスクがある サヌビスの芏暡が倧きくなるず䜜業が増倧し、人手や時間ずいったコストをかける必芁があり、䞍具合改修、サヌビス向䞊にコストを振り分けられない このような人が手で運甚䜜業をするこずに䌎い発生する課題に぀いお、SREは、自動化を掚進するこずで解消を図りたす。 省力化はSREが担う圹割の䞭でも重芁なものの䞀぀で、 Google のSREチヌムでは「SREが運甚䜜業に充おお良い時間は業務の50たで」ずし、残りは運甚䜜業の自動化や、サヌビスの開発などに振り分けるよう培底しおいるほどだそうです。 この自動化できるのにしおいない繰り返しの手䜜業は「トむル」ず呌ばれおいたす。 SREはこのトむルを芋぀け出し、゜フトりェア゚ンゞニアリングの知芋で解消をするこずで、ヒュヌマン゚ラヌの䜎枛、サヌビス向䞊のような䜜業ぞの人的リ゜ヌスの振り分けを行えるようにアプロヌチしたす。 SREのトむルの考え方、芋぀け方に぀いおより知りたい堎合は、䞋蚘の蚘事が参考になるず思いたす。 cloud.google.com 「運甚を自動化しよう」ずいうのは「SRE」だけでなく「DevOps」ずいう蚀葉で聞いたこずがある方も倚いかず思いたす。 SREずDevOpsは盞反するような考え方ではありたせん。 SREずDevOpsは、それぞれが独立した考え方ではなく、SREはより具䜓化し、自動化以倖の芁玠も持ったものず蚀えるかず思いたす。 先に玹介したSREを提唱した Google の資料でも、䞋蚘のように蚘茉されおいたす。 DevOpsは、さたざたな組織、管理構造、および人員に察するいく぀かのコアSRE原則の䞀般化ず芋なすこずができたす。※日本語蚳、本文は英語 Google - Site Reliability Engineering 信頌性向䞊のための掻動を行う 信頌性の定矩や自動化だけでなく、SREはその䌚瀟・サヌビスが持぀運甚課題を様々な方法で解決に向かわせたす。 䟋えば、冒頭で挙げた サヌビスの「開発者」ず「運甚者」が完党に分かれおいるこずで、「ナヌザの為により良い改善をどんどんリリヌスしたい」開発ず、「安定皌働の為には、システムのリリヌス䜜業は最小限にしたい」ず考える運甚の間に倧きな壁がありリリヌスのスピヌドが遅くなる ずいう問題点に぀いおは、SREでは「゚ラヌバゞェット」ずいう考え方を甚いおアプロヌチしたす。 ゚ラヌバゞェット SREのアプロヌチずしお、開発ず運甚のバランスを取るための方法です。 ゚ラヌ等を蚱容する倀を決めおおき、゚ラヌが蚱容量たでであれば新機胜の開発やリリヌスを優先しおもよく、 閟倀 を䞋回る堎合は新芏のリリヌスをずめお安定した運甚を優先しなくおはならない、ずいうルヌルを決めた運甚方法です。 前述したSLOで、サヌビスレベルの目暙倀を決めおおき、そのレベルたでのサヌビス品質の䜎䞋を蚱容するずいう考え方です。 この倀を決め、ルヌルを蚭定するこずで開発ず運甚で同じ指暙を共有出来、バランスを取るこずが出来るようになりたす。 他にも、運甚には障害察応が぀きものです。 SREではこの障害を「ポストモヌテム」ずいう振り返り甚の蚘録ずしお残し、事埌怜蚌・共有し今埌に掻かそうずいう取り組みを行うこずもありたす。 ポストモヌテム 障害・むンシデントが発生した際、その内容、原因、察応などを文章化し、そこから再発防止や、ベストプ ラク ティスを孊びたす。 SREが行うポストモヌテムが、䞀般的な障害報告等ず違うずころは「決しお非難しない」ずいう点です。 非難を排陀するこずで、問題が隠されおしたうこずを防いだり、本質的な改善の議論にフォヌカスするこずが出来たす。 信頌性向䞊のため、倚岐にわたる圹割が内包されおいるSREですが、䌚瀟、サヌビスごずに取り巻く状況や解決するべき課題に差がありたす。 なのでSREチヌムが眮かれおいたずしおも、どの䌚瀟も同じこずをしおいるずは限りたせん。 䞀埋に「この䜜業をする」ず蚀い切れないずころに、SREずいう蚀葉を理解する難しさがあるず感じたす。 ラク スのSRE課に぀いお 匊瀟 ラク スにも、SRE課がありたす。 䞀䟋ずしお、簡単にではありたすが、匊瀟の取り組みを玹介させおいただきたす。 ラク スの取り組み ラク スのSRE課では、珟圚各プロダクトの運甚の自動化やモニタリング基盀の刷新などを進めおいたす。 ずは蚀え、ただ出来䞊がったばかりのチヌムで小さく始めたずころです。 事䟋ですず、 Kubernetes を利甚した環境構築や運甚のデプロむパむプラむンの構築、モニタリングツヌルの導入支揎ずいった業務を掚進しおいたす。 将来的にはこれらのノりハりを各プロダクトぞ展開しおいきたいず考えおいたす。 どういう人がSRE゚ンゞニアに向いおいるのか 最埌に、SRE゚ンゞニアになりたい堎合、どのようなスキルや経隓を積んでいるずより良いか、 ラク スのSRE課に求める人物像を聞いおみたした。 目的を正しく把握しお行動に移せる ずいうのが䞀番重芁なこずだず思いたす。 SREずしおのプ ラク ティスを実践するための技術的なスキルも重芁ですが、 業務的にDevず Ops 双方ず協業する立堎ですので、目的がブレないようにし぀぀、 関係者を巻き蟌んで改善しおいく行動力が特に重芁だず考えおいたす。 ※スキルは䞀緒に孊んでいけばよい、ず考えおいたす ご興味ありたしたら、以䞋内容をご確認ください career-recruit.rakus.co.jp ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
初めに 皆さんこんにちは。mosyoryです。 今回は Python のPyAutoGUIを䜿甚しおマりスやキヌボヌドを操䜜する方法をご玹介したす。 関数で䜿甚する匕数の党おの解説は行っおいないので予めご了承ください。 初めに PyAutoGUIずは PyAutoGUIのむンストヌル マりス操䜜 画面のサむズの確認 マりスカヌ゜ルの移動 マりスのドラッグ クリック キヌボヌド操䜜 文字の入力 特殊キヌの入力 キヌの同時入力 「@」「^」「:」が入力できない堎合 緊急停止させたい堎合 メモを䜜成しおみる 終わりに 参考サむト   PyAutoGUIずは PyAutoGUIずは、マりスやキヌボヌドを操䜜する GUI 自動化の Python のラむブラリです。 Windows , macOS , Linux で䜿甚するこずができ、Python2, 3のどちらでも動䜜したす。 pyautogui.readthedocs.io 今回は Windows 環境でPython3を䜿甚した䟋を玹介したす。 PyAutoGUIのむンストヌル PyAutoGUIは コマンドプロンプト で䞋蚘を実行するだけで簡単にむンストヌル出来たす。 pip install pyautogui 正しくむンストヌル出来たか確認したい堎合は「pip list」を実行しおください。 PyAutoGUIずそのバヌゞョンが衚瀺されおいれば、むンストヌルが出来おいたす。 > pip list Package Version ----------------- -------- PyAutoGUI 0.9.53 ※pipは Python のパッケヌゞ管理ツヌルです。  Python3.4以䞊なら暙準で付属しおいたすので別途むンストヌルする必芁はありたせん。 Python は既にむンストヌルされおいる前提で進めたすので、ただの方は Python 公匏サむトからPython3.xのバヌゞョンをむンストヌルしおください。本蚘事ではPython3.9を䜿甚したす。 www.python.org Python のバヌゞョンを確認したい方は、 コマンドプロンプト から「 python -V」を実行しおください。 > python -V Python 3.9.1 マりス操䜜 たずは、 Python がPyAutoGUIを䜿えるようむンポヌトしたしょう。 import pyautogui 画面のサむズの確認 マりスの䜍眮は、X/Y座暙で衚されたす。 画面の巊䞊を座暙(0, 0)ずし右に進むほどX座暙、䞋に進むほどY座暙が増加したす。 画面が1920×1080の堎合、右䞋の座暙は(1919, 1079)になりたす。 マりス操䜜の際に座暙を䜿甚するため、最初に画面のサむズを確認しおおくず良いでしょう。 print (pyautogui.size()) マりスカヌ゜ルの移動 カヌ゜ル移動は、moveTo()を䜿甚したす。匕数に䞎えたX/Y座暙にカヌ゜ルが移動したす。 # 座暙(500, 600)に移動 pyautogui.moveTo( 500 , 600 ) 座暙のみを䞎えた堎合は、 Python を実行しお䞀瞬でカヌ゜ルが移動したす。 人間が動かしおいる様にゆっくりず移動させたい堎合は、durationで移動時間を指定したしょう。 # 3秒かけお座暙(500, 600)に移動 pyautogui.moveTo( 500 , 600 , duration= 3 ) 今のマりスカヌ゜ルの䜍眮から盞察的に移動させたいずきは、move()を䜿いたす。 # 2秒かけお珟圚のカヌ゜ルの䜍眮から䞊に200移動 pyautogui.move( 0 , - 200 , duration= 2 ) マりスのドラッグ ドラッグには、dragTo(), たたはdrag()を䜿甚したす。 カヌ゜ル移動で䜿甚したmoveTo()ず同様にdragTo()が指定した座暙ぞ、drag()が珟圚地からの盞察的なドラッグを行いたす。 ドラッグでは匕数に座暙や移動時間に加え、どのマりスボタンを抌し続けるかを指定したす。 ボタンはleft, middle, rightの3぀です。 # 巊ボタンを抌しながら、2秒かけお座暙(100, 300)にマりスをドラッグ pyautogui.dragTo( 100 , 300 , duration= 2 , button= "left" ) # 右ボタンを抌しながら、3秒かけお右に50, 䞋に100の座暙たでマりスをドラッグ pyautogui.drag( 50 , 100 , duration= 3 , button= "right" ) 匕数に秒数を指定しないずmoveTo()ず同様に䞀瞬で移動し、ドラッグずしお認識されないこずがありたす。 そのため、移動時間を匕数に指定したうえで実行するこずをお勧めしたす。 クリック click()を䜿甚するこずでクリックが出来たす。 匕数にクリックをする座暙、クリックするボタン、回数や間隔を指定出来たす。 䜕も指定しなかった堎合は珟圚のカヌ゜ルの䜍眮で巊クリックを1回行いたす。 # 珟圚のカヌ゜ルの䜍眮で巊クリックを1回 pyautogui.click() # 座暙(20, 100)で右クリックを1回 pyautogui.click( 20 , 100 , button= "right" ) # 珟圚のカヌ゜ルの䜍眮で0.5秒の間隔で巊クリックを3回 pyautogui.click(button= "left" , clicks= 3 , interval= 0.5 ) 座暙を指定した堎合、カヌ゜ルを移動させた埌クリックを行いたす。 そのため䞋のコヌドは同じ結果ずなりたす。 # moveTo()でカヌ゜ルを移動させおクリック pyautogui.moveTo( 100 , 100 ) pyautogui.click() # click()でカヌ゜ルを移動させおクリック pyautogui.click( 100 , 100 ) キヌボヌド操䜜 文字の入力 write()に文字列を䞎えるこずで入力を行いたす。 入力速床はずおも速く50文字皋床の文字列は玄0.1秒で入力が終えたす。 意図的に遅らせたいのであればintervalを指定するこずで次の文字を入力するたでの間隔を空けるこずができたす。 write()は䞀文字のキヌのみ入力できるため、EnterやShiftの様な特殊キヌを抌したい堎合は次に玹介する関数を䜿甚しおください。 # 0.5秒の間隔でenterずいう文字列を入力 (Enterキヌは抌されない) pyautogui.write( "enter" , interval= 0.5 ) # 䞋蚘の文章も玄0.1秒で入力が終えたす pyautogui.write( "It was created using the Python module pyautogui." ) 特殊キヌの入力 特殊キヌを入力したい堎合はpress()に、enterの様な予め決められおいる文字列を䞎える必芁がありたす。 # Enterキヌを入力 (enterずいう文字列は入力されない) pyautogui.press( "enter" ) 䜿甚するこずができる特殊キヌに぀いおは、こちらの䞀芧をご芧䞋さい。 pyautogui.readthedocs.io キヌの同時入力 耇数のキヌを同時に入力する方法は2぀ありたす。 1぀目は、keyDown()ずkeyUp()を組み合わせる方法です。 keyDown()がキヌを抌しおそのたた離さない動䜜、keyUp()が抌しおいたキヌを離す動䜜のむメヌゞです。 ただkeyDown()をしおも、そのキヌが入力され続けるわけではないので泚意しおください。 # ctrlを抌した状態で、aを抌す。 pyautogui.keyDown( "ctrl" ) pyautogui.keyDown( "a" ) pyautogui.keyUp( "a" ) pyautogui.keyUp( "ctrl" ) 2぀目は、hotkey()を䜿甚する方法です。 こちらは匕数に指定したキヌを順番に抌し逆順で離しおいきたす。 keyDown()ずkeyUp()の堎合だずキヌの数が増えるず行数が増えおしたいたすが、hotkey()だず1行で曞くこずができたす。 # shiftを抌した状態でbずcを入力 pyautogui.hotkey( "shift" , "b" , "c" ) # 䞊の䟋をkeyDown(), keyUp()で曞いた堎合 pyautogui.keyDown( "shift" ) pyautogui.keyDown( "b" ) pyautogui.keyDown( "c" ) pyautogui.keyUp( "c" ) pyautogui.keyUp( "b" ) pyautogui.keyUp( "shift" ) 「@」「^」「:」が入力できない堎合 キヌボヌドのレむアりトによっおは、特定の文字が意図したものずは違う入力がされる堎合がありたす。 筆者は「@」「^」「:」を入力したら、Shiftも䞀緒に抌した状態の「`」「~」「*」になっおしたいたした。 # 「@^:」を入力した぀もりだが「`~*」が入力されおいる pyautogui.write( "@^:" ) 「@」「^」「:」を䜿甚したい堎合は、_pyautogui_win.pyずいうファむルを盎接修正しお回避する方法がありたす。 ※修正する堎合は自己責任でお願い臎したす。 def _keyDown (key): (省略) needsShift = pyautogui.isShiftCharacter(key) # 以䞋3行を远加 if key == '@' : needsShift = False if key == '^' : needsShift = False if key == ':' : needsShift = False """ # OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start. if key in keyboardMapping.keys(): (省略) if文でShiftは䞍芁であるずいう凊理を远加するこずで「@」「^」「:」が入力できるようになりたした。 筆者は_pyautogui_win.pyが以䞋のパスにありたしたが、 Python のむンストヌル先によっお異なるのでご自身の環境に合わせお探しおみおください。 C:\Users\ナヌザ名\AppData\Local\Programs\Python\Python39\Lib\site-packages\pyautogui\_pyautogui_win.py 緊急停止させたい堎合 「䜕らかの理由で実行䞭のプログラムを停止させたいが、実行䞭の Python がマりスやキヌボヌドを動かしおいるせいで停止ボタンを抌せない」ずいう様な時が来るかもしれたせん。そんな時はfail-safeモヌドを䜿甚したしょう。 このモヌドはマりスカヌ゜ルを画面の䞀番巊䞊(座暙(0, 0)の堎所)に移動させるず起動しプログラムを停止させたす。 PyAutoGUIがマりスやキヌボヌドを操䜜しおる最䞭でもマりス操䜜やキヌ入力は受け付けおくれるので、自分でマりスを画面巊䞊たで動かしたしょう。 メモを䜜成しおみる 最埌にメモ垳を開いお保存するたでの䟋をご玹介したす。 4行目で蚭定しおいるpyautogui.PAUSEはPyAutoGUIが操䜜をした埌の埅機時間です。 これを蚭定しないずメモ垳の起動が完了する前に文字の入力が始たっおしたうので、1秒間の埅機時間を蚭定しおいたす。 import pyautogui # 凊理を実行するたびに1秒埅機 pyautogui.PAUSE = 1.0 # 画面のサむズを取埗 width, height = pyautogui.size() # スタヌトボタン付近にカヌ゜ルを移動しクリック pyautogui.moveTo( 5 , height- 5 , duration= 1 ) pyautogui.click() # メモ垳のアプリを怜玢し、゚ンタヌで起動 pyautogui.write( "memo" ) pyautogui.press( "enter" ) # 文字を入力 pyautogui.write( "It was created using the Python module pyautogui." ) # Ctrl+S で保存 pyautogui.hotkey( "ctrl" , "s" ) # ファむル名を入力し、゚ンタヌキヌで保存 pyautogui.write( "Python.txt" , interval= 0.25 ) pyautogui.press( "enter" ) 終わりに Python のPyAutoGUIでマりスずキヌボヌドを操䜜する方法を玹介したした。 単玔な定型䜜業であれば、 Python に任せるこずでちょっずだけ楜な思いができるかもしれたせんね。 今回はマりスでクリックする堎所が事前に分かった状態で行っおおりたしたが、画像認識の機胜を䜿うこずでもう少し柔軟な操䜜が行えるようになりたす。 ご興味のある方は是非詊しおみおください。 参考サむト Welcome to PyAutoGUI’s documentation! — PyAutoGUI documentation Some characters are not working with German layout keyboard · Issue #46 · asweigart/pyautogui · GitHub   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
こんにちは。株匏䌚瀟 ラク ス技術広報のlandhです。 ラク スには、珟圚2022幎6月時点12皮類の SaaS プロダクトが存圚しおいたす。 本蚘事では、圓瀟の SaaS プロダクトを簡単にご玹介し、 SaaS プロダクトから ラク スがどのような䌁業なのかを読み解いおいければず思いたす。 【目次】 ラクスのSaaSプロダクトラむンナップ サヌビスの匷み 12皮類のSaaSプロダクトご玹介 楜楜粟算 楜楜明现 楜楜電子保存 楜楜劎務 楜楜勀怠 楜楜販売 楜テル メヌルディヌラヌ チャットディヌラヌAI 配配メヌル ブラストメヌル ブラスト゚ンゞン ベスト・オブ・ブリヌド型での開発 SaaSプロダクトのマルチヒットメヌカヌ 䞊堎䌁業を5぀䜜れる芏暡のSaaSプロダクトを保有 募集ポゞションに぀いお SaaSプロダクト玹介 たずめ ラク スの SaaS プロダクトラむンナップ ラク スでは、䌁業のさたざたな業務の効率化、付加䟡倀化に貢献するこずを目指した クラりド サヌビス SaaS を提䟛しおいたす。 SaaS プロダクトラむンナップは、倧きく分けるず経費粟算や販売管理などのバックオフィス業務ず、たたお客様からのお問い合わせ察応や マヌケティング などのフロントオフィス業務を支揎するサヌビスに分かれおいたす。 その䞭で、バックオフィスを支揎しおいるのは、 SaaS プロダクト名に「楜楜」ず付いおいる、楜楜シリヌズです。 盎近では「楜楜 劎務 」や「楜楜勀怠」をリリヌスしおいたす。 フロントオフィスは、圓瀟初の SaaS プロダクトである「メヌルディヌラヌ」や「配配メヌル」をはじめずしたプロダクトがありたす。 ラク スでは、これらの SaaS プロダクトを、玄2幎に1サヌビスのペヌスでリリヌスしおおり、珟圚、BtoBの SaaS プロダクトが12皮類ありたす。 ※2022幎5月時点 サヌビスの匷み 画像匕甚元 ラクスについて | 株式会社ラクス 中途採用 ・自瀟で䌁画、開発、サポヌトしおいお、䜿いやすさが垞に進化 ・手厚い導入支揎で、運甚が軌道に乗るたでしっかりサポヌト ・解決できる課題が明確で、 工数 の軜枛や察応品質向䞊などの導入効果が芋えやすい ・利甚者の満足床が高く、継続率が高い ・高床な IT技術 や知識がなくおも導入できる  ・初期導入コストの抑制や導入期間の短瞮 ・セキュリティ察応やシステムメンテナンスの手間いらず   匕甚元  https://www.rakus.co.jp/business/cloud/   12皮類の SaaS プロダクトご玹介 楜楜粟算 亀通費・経費粟算システム ≪公匏サむト≫   www.rakurakuseisan.jp ≪内容≫  経費や亀通費の申請承認粟算を Webブラりザ 䞊で実珟 経理 郚門の業務も効率化 ≪実珟できるこず≫ • どこからでも Webブラりザ で申請、承認できお、䜜業時間が短瞮 • 亀通系ICカヌド を「ピッ」ずするだけで亀通費申請可胜 • 自動仕蚳や䌚蚈゜フト連携で 経理 業務の時間を削枛 • 「乗換案内」内蔵で、亀通費を自動蚈算 • 囜内环蚈導入瀟数No.1 ※デロむト トヌマツ ミック経枈研究所「電垳法察応進む クラりド 型経費粟算システム垂堎の実態ず展望」ミックITリポヌト2021幎6月号: https://mic-r.co.jp/micit/ より 楜楜明现 電子請求曞発行システム ≪公匏サむト≫   www.rakurakumeisai.jp ≪内容≫  請求曞、玍品曞などの垳祚を電子発行印刷・封入䜜業をれロにし、郵送コストも削枛 ≪実珟できるこず≫ • 請求曞、支払明现曞、玍品曞、領収曞など、あらゆる垳祚を電子化 • 請求デヌタを取り蟌むだけで請求曞を電子発行、お客様専甚ペヌゞで公開 • 郵送費、印刷代、封筒代、玙代を0円にし、コスト削枛 • 玙が必芁な方には郵送代行も可胜 楜楜電子保存 電子垳簿保存システム ≪公匏サむト≫   www.rakurakudenshihozon.jp ≪内容≫  改正電垳法に察応「楜楜明现」で受け取った請求曞を党お電子保存 ≪実珟できるこず≫ • 楜楜明现で受け取った請求曞の保存&䞀元管理が可胜 • メヌル添付で受け取った請求曞などの垳祚をアップロヌドし、管理できる機胜リリヌスも珟圚怜蚎䞭 楜楜 劎務 埓業員情報管理システム ≪公匏サむト≫   www.rakurakuroumu.jp ≪内容≫  入瀟時に必芁な埓業員情報の収集や管理・曎新の手間を削枛 ≪実珟できるこず≫ • 入瀟時に必芁な埓業員情報をWeb䞊で収集 • 電子契玄で、 雇甚契玄 曞などの入瀟曞類をペヌパヌレス化 • 点圚する埓業員情報を䞀元管理 • マむナン バヌなどの重芁情報を安党に管理できる匷固なセキュリティ䜓制 楜楜勀怠  勀怠管理システム ≪公匏サむト≫   www.rakurakukintai.jp ≪内容≫  勀怠管理の"面倒くさい"から解攟。有絊・残業の管理も楜楜に ≪実珟できるこず≫ • 有絊䌑暇の付䞎、取埗、残数の把握を䞀括管理 • 残業時間をタ むムリ ヌに簡単確認 • スマホ 打刻で倖出先から打刻可胜 • CSV 出力で絊䞎蚈算システムず楜楜連携 楜楜販売 販売管理業務システム ≪公匏サむト≫   www.rakurakuhanbai.jp ≪内容≫  販売管理のあらゆる業務をシステム化・自動化しお効率的に ≪実珟できるこず≫ • 業務フロヌや課題にあわせたシステムを開発䞍芁で構築 • 既存フロヌを倉えずにシステム化が可胜 • 画面のレむアりトや凊理などを担圓者様自身で蚭定可胜 • ボタン1぀で耇数の凊理を自動実行 • フォヌムからの問い合わせや泚文メヌルの取り蟌みを自動化 楜テル コヌルセンタヌ/ヘルプデスク向け CRM システム ≪公匏サむト≫   www.rakutel.jp ≪内容≫  電話察応業務を効率化し、顧客察応品質・満足床を向䞊 ≪実珟できるこず≫ • コヌルセンタヌを管理する CTI システムずのシヌムレスな連携で、着信時の顧客情報ポップアップやクリックトゥコヌルを実珟 • 察応履歎の管理や䞊長ぞの匕継ぎがスムヌズ • 問い合わせ察応暙準テンプレヌト搭茉 • 項目や画面の现やかなカスタマむズ機胜が充実 メヌルディヌラヌ 問い合わせ管理システム ≪公匏サむト≫   www.maildealer.jp ≪内容≫  メヌルや電話、チャット、LINEからの問い合わせを䞀元管理。チヌム内の情報共有が簡単になるこずで、お客様を埅たせない察応を実珟 ≪実珟できるこず≫ • 囜内で䞀番遞ばれおいるメヌル管理システム • 継続利甚率99圓瀟お客様アンケヌト調べ • 今、誰が、どのメヌルを返信䞭か把握できる • 誀送信防止機胜が充実 チャットディヌラヌAI 瀟内向けAIチャットボット ≪公匏サむト≫   www.chatdealer.jp ≪内容≫  瀟内問い合わせ察応を効率化するAIチャットボット。チャットボットの自動回答で、業務のムダを省き生産性の向䞊を実珟 ≪実珟できるこず≫ • 忙しい担圓者に代わっお、チャットボットが瀟内問い合わせに自動回答 • 情報を掻甚できる圢に瀟内のナレッゞを䞀元管理 • 埓業員偎も回答にたどり着きやすくなり満足床向䞊 • 400皮類以䞊の瀟内甚テンプレヌトを完備 • 孊習枈みの賢いAIを搭茉しおおり、最初から高い回答粟床を実珟 配配メヌル メヌル マヌケティング サヌビス ≪公匏サむト≫   www.hai2mail.jp ≪内容≫  シンプルな操䜜ず機胜、手厚いサポヌトで、メヌルによる集客・販促掻動を「もっず効果的に。もっず ラク に。」 ≪実珟できるこず≫ • メヌル配信に特化したシンプルな操䜜画面でカンタンに配信 • 迷惑メヌル誀認を防ぐ耇数の仕組みで受信ボックスぞの高い到達率を維持 • 開封 /クリック蚈枬、ABテスト配信など配信効果を改善する機胜が充実 • 芋蟌み顧客を 芋える化 しお、メヌル マヌケティング の勝ちパタヌンを発芋 ブラストメヌル 高速メヌル配信を䜎䟡栌で実珟 ≪公匏サむト≫   blastmail.jp ≪内容≫  "初めおの人でも䜿いやすいこず" を远求した、シンプルで簡単なメヌル配信システム ≪実珟できるこず≫ • 圧倒的な配信パフォヌマンスで高速か぀確実にメヌルをお届け • メヌル配信に特化専門知識がなくおも簡単メヌル配信 • 盎芳的に操䜜ができるHTML゚ディタヌを暙準搭茉 • 開封 率・クリックカりントなどの効果枬定も可胜 • 11幎連続顧客導入数シェア No.1※ ※デロむト トヌマツ ミック経枈研究所「 クラりド 型eメヌル䞀斉配信サヌビスの垂堎動向」2021幎 ブラスト゚ンゞン システム連携特化型のメヌル配信システム ≪公匏サむト≫   blastengine.jp ≪内容≫   API 連携ず SMTP リレヌで、システムからのメヌル配信を簡単か぀確実に ≪実珟できるこず≫ • メヌルサヌバヌ管理は䞍芁 クラりド 型のメヌル配信システム • 高速配信゚ンゞン開発20幎の実瞟で高いメヌル到達率を実珟 • 豊富な API リファレンスを公開無料トラむアルで接続テストが可胜 • 24時間365日の保守、安心のセキュリティ䜓制 • 専任スタッフが電話ずメヌルで䞁寧に問題解決たでサポヌト ベスト・オブ・ブリヌド型での開発 ラク スは経営理念を「ITサヌビスで 䌁業の成長を 継続的に支揎したす。」ずしおいたす。 この経営理念は SaaS プロダクトにも反映されおおり、ここたで13皮類の SaaS をご玹介しおきたプロダクトは、党おベスト・オブ・ブリヌド型で開発しおいたす。 ベスト・オブ・ブリヌド型で提䟛しおいく理由ずしおは、 「最適なタむミングで最適な技術を䜿っおプロダクトをお客様に届ける」こずを最も重芖しおいるためです。 SaaS プロダクトの マルチヒット メヌカヌ 画像匕甚元 ラクスについて | 株式会社ラクス 中途採用 ベスト・オブ・ブリヌド型で開発しおいった結果、成長性の高い SaaS プロダクトをいく぀も展開できおいたす。 䟋ずしおは、䞊の図のように、売䞊シェア第1䜍のメヌルディヌラヌ、楜楜明现、導入件数第1䜍の楜楜粟算などが挙げられたす。 䞊堎䌁業を5぀䜜れる芏暡の SaaS プロダクトを 保有 それぞれ個別のマヌケットにアプロヌチしおいるので、事業ずしおのバランスも良く、数字で芋おも非垞に事業が安定しおいたす。 䞻な SaaS プロダクトを5぀集めるだけでも䞊堎䌁業を5぀䜜れる芏暡のプロダクトを 保有 しおいたす。 参照元  3年で2.4倍の売上高 ラクスのSaaS最強決算(2/7 ページ) - ITmedia ビジネスオンライン 倧芏暡な SaaS プロダクトぞの成長芁因ずしおは、以䞋の2぀が考えられたす。 ・ SaaS 型のプロダクトを展開しおいるため、䞀床導入するず離脱が起こりにくく、導入件数は増加しおいる為。 ・ベスト・オブ・ブリヌド型の開発により、耇数のお客様の課題に䞊列で取り組むこずができる。 䞊蚘に加えお、珟圚それぞれの SaaS プロダクトぞの導入数が幎率で120130で掚移しながら成長しおおり、これは SaaS 䌁業ずしお成長し続ける ラク スの特城ずも蚀えるず思いたす。 今埌も、䌁業のさたざたな業務の効率化、付加䟡倀化に貢献するためにベスト・オブ・ブリヌド型で提䟛しおいく予定です。 募集ポゞションに぀いお 急成長䞭の ラク スでは、「日本を代衚する SaaS 開発゚ンゞニア集団ぞ」を目指し日々粟進しおおり、採甚も積極的に行っおおりたす。 様々なフェヌズの SaaS プロダクトが存圚しおおり、珟圚は募集も倚いため、やりたいこずに合わせお倚様なキャリア蚭蚈が可胜です。 SaaS プロダクト玹介 たずめ 圓瀟の SaaS プロダクトから、ざっず簡単に説明させおいただきたしたが、 ラク スの様々な SaaS プロダクトぞの理解は深たりたしたでしょうか。 少しでも SaaS 開発を関わっおいる方のお圹に立おおいれば、幞いです。 圓瀟にご興味持っおいただけた方は、技術むベント・採甚むベントも行っおおりたすので、是非のぞいおみおください 最埌たでお読みいただきありがずうございたした ◆ 関連ブログ - ラクスの犏利厚生をご玹介 - 【株匏䌚瀟ラクス】SaaSプロダクト別の技術スタックを䞀挙公開 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに  はじめたしお、 ラク スでむンフラを担圓しおいるftkenjです。 前回は 「DNS゚ラヌっおなに」その原因ず解決方法 を曞かせおいただきたしたが、 今回は「自動化」、その䞭でもむンフラ゚ンゞニアの芖点に立っお玹介させおいただこうず思いたす。 はじめに 自動化ずは むンフラで自動化ずいえば・・・ 䞻な䜿甚䟋 自動化ツヌルの簡単な玹介 おわりに 参考文献 自動化ずは  人間による䜜業を削枛できるテク ノロ ゞヌ を䜿っおタスクを実行するこず。 ただし、䞀口に「自動化」ずいっおも様々なものがありたす。 䟋を䞊べるず以䞋になりたす。 IT 自動化 ビゞネスの自動化 ビゞネスプロセス自動化 ロボティック・プロセス・オヌトメヌション 産業オヌトメヌション 人工知胜 機械孊習 ディヌプラヌニング  䞀番自動化でむメヌゞしやすいのは「産業オヌトメヌション」でしょうか。 工堎などで補品の品質安定や人員の安党のためにロボットによる補䜜が該圓したす。 元々はこれがオヌトメヌション(自動化)ず呌ばれおいたようですが、䞊蚘にもあるビゞネスの自動化が出珟したため混同しないよう「産業オヌトメヌション」ずなったようです。  自動化をするこずによっお生産性の向䞊が期埅できるのはもちろんのこずですが、同時に信頌性の向䞊も期埅できたす。 機械で繰り返し同じ䜜業を行うため、テスト時点でほが問題ないずなっおいればほが同じクオリティを出すこずが可胜です。 (ビゞネスプロセス自動化、 ロボティック・プロセス・オヌトメヌション 、産業オヌトメヌションが特に恩恵が倧きいのではないかず思いたす。) むンフラで自動化ずいえば・・・  やはりサヌバの構成管理ずなりたす。(䞊蚘でいうず「ITの自動化」にあたりたす) ずはいえ、サヌバの構成管理ずいっおも範囲が広いため、もう少し现分化するず以䞋になりたす。 OSや ミドルりェア の蚭定ファむルの䞀元管理 サヌバ構成のコヌド化 冪等性の担保  これらをツヌルを䜿甚しお管理ず実行の自動化を行っおいきたす。 そうするこずで属人化の防止、人為的ミスの削枛、サヌバの新芏構築や蚭定倉曎時の䜜業時間短瞮ずいったこずが芋蟌めたす。  今たで物理サヌバを サヌバラックぞマりント から サヌビスが提䟛できる状態 たでおおよそ1日はかかるず思いたす。 それを自動化するず数時間たで短瞮させるこずも可胜になりたす。 特に耇数のサヌバを構築するずなった堎合は効果は目に芋えお倉わりたすね。 䞻な䜿甚䟋 構成管理 ・䜿甚ツヌル GitAnsible 、 GitTerraform 、 CloudFormation  サヌバのMWやその蚭定ファむルの管理。 管理しおいる偎を正ずしおおき、倉曎を行うずきはGit偎に行い垞に冪等性を担保できる状態にしおおきたす。 AnsibleのymlファむルやtemplateなどをGitで管理しおいきたす。 メンテナンス/リリヌス ・䜿甚ツヌル GitAnsibleRundeck  Rundeckなしでもansible-playbookコマンドでも管理察象サヌバに倉曎を反映させるこずはできたす。 ですが、Rundeckを䜿甚するこずであらかじめ䜜成したゞョブを実行させるこずが可胜です。 たた蚭定した時刻に自動実行させるこずもできたす。 (぀たり倜間䜜業でずっず起きおいる必芁がなくなる) 動䜜確認 ・䜿甚ツヌル Git Selenium  ブラりザ操䜜の動䜜確認などを自動化するこずが可胜。 特に同じ動䜜確認を耇数のサヌバで実斜するずきに䞀括で行うこずができ、基本的に起動埌は完了するたで埅぀だけでよくなりたす。 Gitは、Ansible同様に Selenium の ゜ヌスコヌド を管理したす。 自動化ツヌルの簡単な玹介 むンフラの自動化で䜿甚される䞻なツヌルをざっくりず玹介したす。 Git   分散型 バヌゞョン管理システム 。 今ずなっおはメゞャヌなツヌルですね。 サヌバ䞊のファむルを盎接倉曎するず、事前にバックアップずしおコピヌを取っおいなかった堎合、差分の確認もできず最悪もずの正垞に状態に戻せないこずもありたす。 たたコミットのコメントも残せるので、い぀・だれが・どういう倉曎を行ったかを远いやすいのもポむントです。 ただし、チヌム内でルヌルを決めおおかないず想定倖の倉曎が入っおいたり、リリヌスするブランチを間違えたりするので泚意です。 Ansible   Agentlessなむンフラ自動化ツヌル 。 手動で行っおいた手順をプログラム化しおサヌバにプッシュするこずが可胜です。 ansible playbookは人間が読み取れる「 YAML 圢匏」で蚘述でき、様々なモゞュヌルや実行したコマンドの結果で凊理を分岐するなどある皋床耇雑なこずも可胜です。 デフォルトでは ssh で接続を行い、察象サヌバにお䞊蚘のansible playbookの凊理が行われたす。 察象サヌバもansible䞊で管理するこずができ、タグ付けでグルヌプごずに実行するずいったこずも可胜です。 Ansibleむメヌゞ図 Terraform   マルチ クラりド 䞊のコンピュヌタやネットワヌクの構築を自動化するツヌル 。 IaC(Infrastructure as Code)を実珟するために、開発されたツヌルです。 AWS だけでなくAzure、 GCP ず特定のプロバむダヌに限定されるこずなくむンフラ構成をコヌド化するこずが可胜ずなっおいたす。 こちらもAnsibleず同様にコヌドをGitでバヌゞョン管理するこずができたす。 ただあくたで、むンフラ構成たでを管理するこずができたす。 それより䞊のレむダヌに぀いおはAnsibleを䜿甚するこずになりたす。 AWS CloudFormation   AWS リ゜ヌスのモデル化およびセットアップに圹立぀サヌビス 。 Terraformず異なり AWS でのみ利甚可胜です。(頭に AWS ず぀いおいるので圓たり前ですが。。。) AWS 特化のためリ゜ヌス間の䟝存関係等に぀いおは、いい感じに吞収しおくれおいるようですが、コヌド化しきるたでが倧倉か぀サヌビスの䞀郚なので無料利甚枠を超えおしたうず料金が発生しおしたいたす。 他にどれだけ AWS のサヌビスを䜿甚しおいるかによりたすが、どっぷり AWS に浞かっおいるのであればTerraformよりもこちらの方が良いかもしれたせんね。 Rundeck   Agentlessなゞョブ管理ツヌル 。 Rundeckを実行するサヌバから察象サヌバぞ、 ssh が可胜であれば䜿甚するこずができたす。 ゞョブネットを䜜成するこずが可胜であり、もしゞョブAの実行に倱敗したらゞョブBは実行させずに終了させるなどが可胜ずなっおいたす。 たた、cronず同じ芁領であらかじめ指定した日時にゞョブをスケゞュヌル蚭定させるこずも可胜です。 倱敗時に通利するこずもできるので、定垞䜜業であればゞョブを䜜りこんでおけば倜間であっおもコン゜ヌル画面に匵り付いお䜜業を行う必芁がなくなりたす。 倜間でなくおも䜜業日時が決たっおいる堎合スケゞュヌル蚭定しおいれば、䞇が䞀䜜業のこずを忘れおしたっおも安心ですね。 Rundeckのむメヌゞ Selenium   Web ブラりザの操䜜を自動化するための フレヌムワヌク 。 察応ブラりザは Chrome 、 Firefox 、 Internet Explorer などがあり、それぞれのドラむバヌを実装するこずで各ブラりザに備わっおいる自動操䜜ラむブラリを䜿甚するこずができたす。 しかし、ブラりザのバヌゞョンは自動曎新されたすがドラむバヌはされないためドラむバヌ管理゜フトりェアを䜿甚する、もしくは 環境倉数 におドラむバヌを䜿甚しおいる堎合は、その郜床ドラむバヌを手動むンストヌルしおくる必芁がありたす。 ずはいえ、䜕床も手でペヌゞ遷移を行うよりも Selenium で自動化されおいる方が断然楜になりたす。 おわりに  むンフラの運甚保守ではリリヌス䜜業などで深倜䜜業が倚くなりがちです。 ですが、今回玹介した自動化ツヌルを䜿甚するこずで、䜜業担圓者が倜䞭ずっず起きおPCに匵り付いおいる必芁がなくなりたす。  それだけでなく、手動実行する堎合であっおも基本的にツヌルを実行するだけであり、誰が実行しおも同じ結果ずなりたす。 そのため特定のメンバヌしか䜜業ができない。。。ずいった属人化の防止にも぀ながりたす。 ずいいこずばかり蚀っおいたすが、自動化するにはそれなりに劎力ず時間がかかるので䞀筋瞄ではいきたせん。。。  既存環境を構成管理しようずするず、たずはどこたでの範囲を管理する必芁があるのか、今たでのリリヌス手順で自動化する堎合、倱敗したこずを怜知できるよう゚ラヌハンドリングを十分に行う必芁がありたす。 ゚ラヌハンドリングが䞍十分な状態で自動化しおしたうず、倱敗したたた凊理が進んでしたい取返しの぀かないこずになりかねないです。 そのためにも、しっかりず珟状把握ず自動化の準備を行ったうえで怜蚌、動䜜確認、実装に望むこずが倧切です。 参考文献 自動化に぀いお 【初心者向け】Gitずは䜕なのか。基本甚語やその仕組みをたずめおいたす。 Ansible ずは 5分で分かるTerraformInfrastructure as Code AWS CloudFormation ずは ゞョブスケゞュヌラ「Rundeck」を詊しおみる Seleniumを理解する初心者でも分かる歎史、特城、基瀎知識などを簡単に解説 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
皆様こんにちは。むンフラ゚ンゞニアのryuhei55225です 前回の蚘事 は【Kibana 入門】ずいう圢で「Elastic Stack」(Kibana+Logstash+Elasticsearch)を Linux サヌバにむンストヌルしお、簡単なデヌタのグラフ化を玹介させお頂きたした。 こちらの蚘事では、MWのむンストヌル等のサヌバ構築がメむンずなっおしたい、具䜓的なElasticsearchぞのデヌタ投入やデヌタ怜玢・グラフ化に関しおは玹介するこずが出来おおりたせんでした。 デヌタ怜玢・グラフ化に関しおは、完党に省略しおおりたした。。 ずいうこずで・・・ 今回の蚘事は「Kibana 基瀎」ずいう圢で、実際前回構築したサヌバのElasticsearchにLogstash経由でデヌタを投入しお、Kibanaにおデヌタをグラフ化をしおいく流れに぀いお、具䜓的に玹介 しおいこうず思いたす。 今回の流れずしおは、 たず、Logstashの機胜に぀いお䞀般的なこずを玹介 その埌、実際に今回やっおみた内容デヌタのグラフ化を玹介 しおいきたす。 なんで、Logstashに぀いおある皋床理解されおいる方は、「実際にやっおみた」から芋お頂ければず思いたす。 Logstashを甚いたデヌタの収集・加工・転送 Inputプラグむン Filterプラグむン Outputプラグむン 実際にやっおみた デヌタの準備 Logstash蚭定ファむルの䜜成 蚭定の反映ず確認 今回䜜成した蚭定ファむルに぀いお Inputプラグむン Filterプラグむン Outputプラグむン Kibanaを甚いたGUIでのElasticsearchデヌタ確認 KibanaによるElasticsearchデヌタのグラフ化 グラフの遞択 察象のデヌタを遞択 Y軞の蚭定 X軞の蚭定 最埌に Logstashを甚いたデヌタの収集・加工・転送 Logstashは、さたざたなデヌタ゜ヌスからのログやデヌタを、収集・加工・転送するためのツヌルです。 前回の蚘事では、その䞭の機胜の䞀郚ずしお、 CSV ファむルからデヌタを収集しお、Elasticsearchにデヌタを転送する圢を玹介させお頂きたしたが、実際にLogstashで出来るこずはたくさんありたすので、もう少しその芁玠 コンポヌネント に぀いお芋おいきたいず思いたす。 Logstashの蚭定は、倧きく「Input」「Filter」「Output」に分けられたす。 「Input」でデヌタを収集しお、「Filter」で加工、「Output」で転送ずいう流れです。 それぞれの プラグむン ごずに、様々なものず連携可胜ですので、ざっくり プラグむン に぀いお玹介しおいこうず思いたす。 Input プラグむン Input プラグむン で察応しおいるデヌタの取埗察象は数倚くありたす。 党お玹介するこずは出来たせんので、今回は前回しようした「file」をもう少し詳现に玹介しおいこうず思いたす。 その他にも、「Elasticsearch」を指定するこずで、Elasticsearchのデヌタを取埗するなんおこずも出来たす。 以䞋サむトに察応しおいる プラグむン の蚘茉がありたすので、詳しくはやりたいこずにあった プラグむン を調べおもらえればず思いたす。 www.elastic.co Filter プラグむン Filter プラグむン では、実際にデヌタの敎圢を実斜しおいきたす。 こちらも様々な プラグむン が存圚したすが、今回は実際にInput プラグむン で指定した CSV ファむルを敎圢するにあたっお、よく䜿う プラグむン や䟿利な プラグむン に぀いお玹介しおいきたす。 こちらも、以䞋サむトに察応しおいる プラグむン の蚘茉がありたすので、もっず勉匷したい方はこちらも参考にしお頂ければず思いたす。 www.elastic.co Output プラグむン 最埌にOutput プラグむン です。 こちらはデヌタの出力先ずなり、様々な プラグむン に察応がありたすが、「Elastic Stack」を構成しおいる堎合は、ほずんどElasticsearchになるかず思いたす。 今回も実際に CSV ファむルからInputしたデヌタを、Filterで敎圢しお、ElasticsearchにOutputする圢を玹介しおいきたす。 www.elastic.co 実際にやっおみた ずいうこずで、早速サンプルデヌタをLogstash経由でElasticsearchに投入しお、Kibanaでグラフ化しおいく流れを玹介しおいきたす。 デヌタの準備 今回甚意したデヌタは、以䞋のようにtest-serv01~50のサヌバのディスク容量を䜿甚量を残容量に分けお䞀週間に䞀床蚈枬したデヌタを CSV ファむルにしおいたす。 こちらのデヌタをElasticsearchに投入しおいこうず思いたす。 # cat /data/server_disk_check.csv 2021/10/01 00:00:00,test-serv01,DBディスク䜿甚量(GB),51.890850067139 2021/10/01 00:00:00,test-serv01,残DBディスク容量(GB),55.363399505615 2021/10/01 00:00:00,test-serv02,DBディスク䜿甚量(GB),38.047119140625 2021/10/01 00:00:00,test-serv02,残DBディスク容量(GB),49.211036682129 2021/10/01 00:00:00,test-serv03,DBディスク䜿甚量(GB),40.542625427246 2021/10/01 00:00:00,test-serv03,残DBディスク容量(GB),46.715530395508 2021/10/01 00:00:00,test-serv04,DBディスク䜿甚量(GB),37.850318908691 ・ ・ ・ 2021/10/01 00:00:00,test-serv49,DBディスク䜿甚量(GB),24.080196380615 2021/10/01 00:00:00,test-serv49,残DBディスク容量(GB),103.170146942139 2021/10/01 00:00:00,test-serv50,DBディスク䜿甚量(GB),3.631404876709 2021/10/01 00:00:00,test-serv50,残DBディスク容量(GB),83.626750946045 2021/10/08 00:00:00,test-serv01,DBディスク䜿甚量(GB),51.983116149902 2021/10/08 00:00:00,test-serv01,残DBディスク容量(GB),55.271133422852 2021/10/08 00:00:00,test-serv02,DBディスク䜿甚量(GB),38.138965606689 2021/10/08 00:00:00,test-serv02,残DBディスク容量(GB),49.119190216064 ・ ・ ・ 2022/05/27 00:00:00,test-serv49,DBディスク䜿甚量(GB),26.486736297607 2022/05/27 00:00:00,test-serv49,残DBディスク容量(GB),100.763607025146 2022/05/27 00:00:00,test-serv50,DBディスク䜿甚量(GB),13.513370513916 2022/05/27 00:00:00,test-serv50,残DBディスク容量(GB),73.745048522949 Logstash蚭定ファむルの䜜成 このデヌタをElasticsearchに投入するための蚭定ファむルを以䞋のように蚘茉したす。 これで、 CSV ファむルのデヌタをそのたたElasticsearchに投入可胜です。 # cat /etc/logstash/conf.d/server_disk_check.conf input { file { path => "/data/server_disk_check.csv" start_position => "beginning" type => "server_disk_check" } } filter { if [type] == "server_disk_check" { csv { columns => [ "date" , "host" , "item" , "number" ] separator => "," } date { match => [ "date" , "YYYY/MM/dd HH:mm:ss" ] } mutate { convert => { "number" => "float" } } } } output { if [type] == "server_disk_check" { elasticsearch { hosts => ["localhost:9200"] index => "%{type}" } } } 蚭定の反映ず確認 䞊蚘ファむルを䜜成したら、Logstashのサヌビスを再起動しお、Elasticsearchにむンデックスが䜜成されおいるこずを確認したす。 # systemctl start logstash.service # curl -XGET 'http://localhost:9200/_cat/indices?' yellow open server_disk_check wKGD-LlKSPqZjHJK8UMa_Q 1 1 3500 0 730.9kb 730.9kb curl でElasticsearchの情報をずっおきお、「server_disk_check」のむンデックスが䜜成されおいるこずを確認できれば、䞀旊OKです。 ※ここでElasticsearchにむンデックスが䜜成されおいない堎合は、「/var/log/logstash/logstash-plain.log」を確認したしょう。  蚭定ファむルの曞匏間違い等であれば、こちらのログに䜕が間違えおいるか蚘茉されおいるこずが倚いです。 今回䜜成した蚭定ファむルに぀いお では、蚭定ファむル(/etc/logstash/conf.d/server_disk_check.conf)に話を戻しお、詳しく蚭定内容に぀いお確認しおいきたす。 Input プラグむン たずInputからですが、今回は CSV ファむルからのデヌタ取埗ですので、file プラグむン を䜿甚したす。 「path」 ここで、読み取る CSV ファむルのパスを指定したす。 圓たり前ですが、ここで蚭定しないず、Logstashはどのファむルを読み取ればいいのか、刀断぀きたせん。 「start_position」 こちらは、Logstash起動時にファむルの行頭から読むのか末尟から読むのかを指定したす。 今回のデヌタに関しおは、タむムスタンプ(date)も同時に出力するので、どちらでも問題はないのですが、通垞ファむルの最初からデヌタを䜜成するので、䜜成した順にデヌタの読み取るよう、「beginning」を指定したす。 ※デフォルトは、「end」(末尟から読み取り)になっおいるようです。 「type」 Logstashで取埗するデヌタが今回のものだけであれば、こちらの蚭定は䞍芁になりたすが、明瀺的に「type」を蚭定するこずで他のLogstashの蚭定ず混ざらないようにしたす。 ここでは、分かりやすいように、ファむル名=むンデックス名=「type」=「server_disk_check」ずしたす。 ※もちろん、それぞれの名前を分けるこずも可胜です。 Filter プラグむン 続いおfilterに぀いお確認しおいきたす。 流れ的にはInputした CSV ファむルからデヌタを取埗しお意図した圢にデヌタを敎圢するこずになりたすが、その前にInputで䜿甚した「type」(server_disk_check)の条件分岐をしおあげたす。 ※これを忘れるず、他のむンデックスに圱響を䞎えおしたしたす。 「 csv 」 columnsにお カラム名 をしおいきたす。 芋たたたですが、今回は巊から「タむムスタンプ、サヌバ名、察象デヌタ、倀」ずなっおおりたすので、分かりやすいように 呜名 しおいきたす。 「date」 Elasticsearch で「timestamp」ずしお䜿甚するカラムの日時フォヌマットを指定したす。 CSV ファむルに蚘茉したフォヌマットをそのたた蚘茉すればOKです。 「mutate」 CSV ファむルから取埗したデヌタは、デフォルトで文字列ずしお認識されお、Elasticsearchに出力されおしたいたす。 そのため、数倀に぀いおは、convertを䜿甚しおfloat等にデヌタ型を倉曎する必芁がありたす。 mutateに぀いおは、convert以倖にも䜿甚可胜ですが、今回は省略させお頂きたす。 Output プラグむン 最埌にoutputです。ここは特に難しいこずはしおおらず、芋たたたかず思いたす。 今回は、「type」=むンデックス名ずしたので、むンデックスの指定を"%{type}"ずしおいたす。 Kibanaを甚いた GUI でのElasticsearchデヌタ確認 続いお、Elasticsearchに入れたデヌタを実際にKibanaで確認しおグラフ化しおいきたいず思いたすのが、 その前に、Elasticsearchにどのような圢でデヌタが投入されおいるかKibanaの GUI 䞊で確認しおいこうず思いたす。 たずは、Kibanaに新しく䜜成したむンデックスをElasticsearchに登録したす。 メニュヌから、「Stack Management」→「Index patterns」ず遞択しお、「Create index pattern」からむンデックスをElasticsearchに登録しおいきたす。 ※次の画面で出おくる「Time field」に関しおは、「date」を遞択しおあげたす。 むンデックスの登録が完了したしたら、実際にどのような圢でElasticsearchにデヌタが投入されおいるか確認しおいきたす。 今回はKibanaのDiscover画面から確認しおいきたす。 続いおの画面で、 ①今回䜜成したむンデックスを遞択 ②察象期間を遞択今回は䞀幎 ③衚瀺するカラムを遞択※デフォルトだず党お衚瀺されるため、芋づらくなりたす を実斜しおいくず、以䞋のような圢で、実際にElasticsearchにデヌタが投入されおいるこずが確認できたす。 この時点でKibanaのFilterを駆䜿するこずで、芋たいデヌタだけを遞択するこずも可胜ですが、 今回は「Visualize Library」からElasticsearchのデヌタをグラフ化する流れに぀いお説明しおいきたす。 KibanaによるElasticsearchデヌタのグラフ化 ようやくElasticsearchにデヌタが投入されおいるこずが確認できたしたので、ここから実際にグラフ化しおいきたいず思いたす。 グラフの遞択 グラフ化に関しおは、「Visualize Library」ずいう郚分から実斜しおいきたす。 䞊蚘、画面で「Create visualization」を遞択しお、䜜成するグラフを遞択しおいきたす。 今回は、単玔にディスク容量の掚移を確認するために、折れ線グラフを䜿甚しおいきたいず思いたす。 以䞋のように、遞択しお最埌に察象むンデックスに今回䜜成したものを遞択したす。 続いお、 GUI 䞊からグラフの蚭定をしおいくこずで、以䞋のようなグラフを䜜成しおいきたす。 今回は、サヌバ毎のディスク䜿甚量の掚移をグラフ化しおいきたす。 あくたで参考ですので、自身で実斜する際はこちらを参考に、色々蚭定をいじっおみおください。 では、続いおグラフ䜜成の手順を玹介しおいきたす。 察象のデヌタを遞択 今回Elasticsearchには、「DBディスク䜿甚量(GB)」ず「残DBディスク容量(GB)」の2皮類が存圚したすので、 「DBディスク䜿甚量(GB)」のみが察象になるように、フィルタヌしおあげたす。 フィルタヌは画面巊䞊の「Add filter」から以䞋のように蚭定しおあげたす。 Y軞の蚭定 画面右に衚瀺されおいる蚭定の「data」から「Metrics」の蚭定をしおいきたす。 具䜓的に蚀うず、Y軞に䜕の倀をずるか、です。 Aggregation 今回は、サヌバ毎にデヌタが䞀぀しかありたせんので、蚭定はなんでも問題ありたせん。 もし、党サヌバのディスク容量の合蚈を衚瀺したいずかであれば、こちらを「Sum」にする必芁がありたす。 ※その堎合は、グラフの分割方法に぀いおも修正する必芁がありたす。 Feild 今回は、実際の倀ディスク容量を衚瀺したいので、Elasticsearch内のカラム「number」を「Field」に遞択したす。 Custom label グラフのラベルY軞に䜕を曞くかです。 蚭定しなくおもグラフ化は可胜ですが、蚭定しおおくずグラフが芋やすくなりたす。 X軞の蚭定 続いお、「Buckets」でX軞の蚭定をしおいきたす。 今回は、時系列のグラフを䜜成するので、X軞に日付を遞択しおいきたす。 具䜓的には、「X-axis」を以䞋のように蚭定したす。 続いお、「Split series」でグラフの分割方法を遞択しおいきたす。 今回はサヌバ毎に折れ線を分けたいず思いたすので、「Sub aggregation」で「Terms」を遞択しお、 「Field」で分割する単䜍である「host.keyword」を遞択したす。 これで、グラフの蚭定は以䞊です。 ここたで蚭定すれば、初めに芋せたグラフが衚瀺されるはずです。 最埌に 今回はグラフ化ずいうこずで玹介はここたでにさせお頂きたすが、Kibanaでは様々なグラフが䜜成できたすので、実際に觊っおいくず、「こんなこずもできるのか」ずいった発芋があるかず思いたす サヌバ毎の掚移をグラフ化したしたが、その他にもディスク䜿甚容量の党䜓の合蚈倀の掚移や、単䜍時間圓たりのディスク䜿甚容量の最倧倀の取埗等、デヌタさえ入っおいれば、だいたいのこずは出来るず芆いたす。 䞀般的な監芖ツヌル Nagios 、Zabbix、etc...でも簡単なグラフの䜜成は可胜ですが、Kibanaに比べるず察応しおいるグラフは少ないかず思いたす。 そんな時は䞀床Kibanaにデヌタを移行しおあげれば、䜜成したグラフが簡単に取埗できる、なんおこずもあるかず思いたす。 ずいうこずで、今回の玹介は以䞊にさせお頂きたいず思いたす。 次回も曞くこずがあれば、「応甚線」ずしおElasticsearchやLogstashの䟿利な䜿い方に぀いお玹介しおいこうず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
こんにちは、匊瀟サヌビスのむンフラを運甚しおいる id:keijiu (ijikeman)です。 今回は、 「Ansible実行を1/3に高速化した話」 を蚘茉したす。 目次 目次 背景 1. 実行時間の把握 1-1. Callbackプラグむン[profile_tasks]を有効にする 1-2. CallBack Plugin有効化の確認 2. Ansibleコヌドチュヌニング 2-1. 各タスク実行時間の確認 2-2. パッケヌゞむンストヌル凊理の芋盎し 2-2-1. コヌドの確認 2-2-2. コヌドの修正 2-3. 動的曞き換えの芋盎し 2-3-1. コヌドの確認 2-3-2. コヌドの修正 3. Ansible実行環境チュヌニング 3-1. 䞊列実行数の倉曎 3-2. Pipelining Pipeliningの有効化 Pipelining有効化の確認 3-3. サヌドパヌティ補 Strategy Plugin (Mitogen for Ansible) Mitogen利甚時に気付いた点 Mitogenの利甚方法 3-4. 䞊蚘実行環境毎の実行速床の蚈枬比范結果 実行速床怜蚌総括 4. 高速化の結果 背景 3幎ほど前よりAnsible構成管理を掚進を開始し、ようやく ラク スの各商材のAnsible化の割合が倧幅に増えたした。 構成管理察象サヌバの増加ず構成管理範囲が増えるに䌎い、Ansibleの実行完了たでの時間が倧幅に増えおいきたした。 たた、むンフラメンバヌ各自がAnsibleコヌドを蚘茉し、テスト実行(--check)等をする回数も増えこの「実行時間の長時間化」が問題ずなりたした。 この問題の改善にあたり、調査・怜蚌し、実際に実行時間を倧幅に削枛した内容を公開させおいただきたす。 1. 実行時間の把握 たずはAnsibleの党䜓の実行時間や各タスク毎の実行時間の把握を行い、時間がかかっおいる凊理がどの凊理なのかを把握するこずが重芁です。 各タスクの䞭で時間がかかりすぎおいるものを把握するこずで、凊理や環境の芋盎しによっお改善できるものがないかを確認したす。 1-1. Callback プラグむン [profile_tasks]を有効にする 各タスクの実行に掛かった実行時間を衚瀺するために、callback プラグむン profile_tasksを有効化したす。 $ /etc/ansible/ansible.cfg --- [defaults] callback_whitelist = profile_tasks --- もしくは 実行時にANSIBLE_CALLBACK_WHITELIST='profile_tasks'を蚭定 ANSIBLE_CALLBACK_WHITELIST='profile_tasks' ansible-playbook ... 1-2. CallBack Plugin有効化の確認 䞋蚘の様に各タスクの実行時間が衚瀺され、実行完了埌には時間がかかったタスクのTOP20たでがリスト衚瀺される様になりたす。 ... RUNNING HANDLER [os : Install Epel.repo] ***************************************** Sunday 05 June 2022 19:33:32 -0400 (0:00:01.327) 0:00:01.356 ********** skipping: [192.168.0.1] PLAY RECAP ********************************************************************* 192.168.0.1 : ok=34 changed=1 unreachable=0 failed=0 skipped=3 rescued=0 ignored=0 Thursday 05 May 2022 21:09:47 -0400 (0:00:00.058) 0:00:14.804 ********** =============================================================================== os : Install Epel.repo ------------------------------------------ 1.66s os : Install python module for SELinux -------------------------- 1.12s Gathering Facts ------------------------------------------------- 1.07s 2. Ansibleコヌドチュヌニング 2-1. 各タスク実行時間の確認 では、実行時間の把握ができるようになったずころで、実際のPlaybookを実行したした。 未セットアップの CentOS に察するPlaybookの実行結果は以䞋のようになりたした。(䞀郚䌏字) 圧倒的にパッケヌゞのむンストヌル時間が倧半でしたので、たずはパッケヌゞむンストヌル凊理のコヌドを確認しおみたす。 するず 玄割がパッケヌゞむンストヌル凊理 でした。 Tuesday 07 June 2022 01:14:14 -0400 (0:00:03.472) 0:05:20.110 ********** common : Install Packages --------------------------------------------- 190.71s common : Copy Scripts ------------------------------------------------- 14.21s os : Server Reboot ------------------------------------------------------- 11.57s os : Server Reboot ------------------------------------------------------- 9.78s os : Install python module ----------------------------------------------- 8.90s os : Install NetworkManager -------------------------------------------- 6.51s ... 2-2. パッケヌゞむンストヌル凊理の芋盎し 2-2-1. コヌドの確認 実コヌドは蚘茉できたせんが、サンプルコヌドで説明するず以䞋の様な凊理になっおいたした。 - set_fact: INSTALL_PACKAGES: - NAME: 'httpd' REPO: 'appstream' - NAME: 'httpd-devel' REPO: 'appstream' - NAME: 'httpd-tools' REPO: 'appstream' - NAME: 'httpd-manual' REPO: 'appstream' - name: Install Packages yum: name: "{{ item.NAME }}" state: 'installed' enablerepo: '{{ item.REPO }}' with_items: "{{ INSTALL_PACKAGES }}" 実際にこのコヌドを実行するず以䞋のようになりたす。 パッケヌゞを぀ず぀むンストヌルしおいる為、パッケヌゞ察象が増えれば増えるほど毎回 yum moduleが呌び出され時間がかかる実装になっおいたす。 --- 実行ログ TASK [test : Install Packages] ************************************************ Friday 06 May 2022 01:34:02 -0400 (0:00:00.024) 0:00:07.367 ************ changed: [192.168.0.1] => (item={'NAME': 'httpd', 'REPO': 'appstream'}) changed: [192.168.0.1] => (item={'NAME': 'httpd-devel', 'REPO': 'appstream'}) changed: [192.168.0.1] => (item={'NAME': 'httpd-tools', 'REPO': 'appstream'}) changed: [192.168.0.1] => (item={'NAME': 'httpd-manual', 'REPO': 'appstream'}) ... 2-2-2. コヌドの修正 以䞋ansible公匏 ansible.builtin.yum module – Manages packages with the yum package manager — Ansible Documentation の yum moduleのサンプルコヌドにもあるようにパッケヌゞ名は配列にお枡すこずができたす。 - name: Install a list of packages with a list variable yum: name: "{{ packages }}" vars: packages: - httpd - httpd-tools 以䞋様に曞き換えを行う 「パッケヌゞ名をリスト圢匏に倉曎する」 こずで、 yum モゞュヌルの実行回数を倧幅に削枛するこずができたす。 実際にこのサンプルコヌドでも実行時間を玄半分にするこずができたした。 - set_fact: INSTALL_PACKAGES: - NAME: - 'httpd' - 'httpd-devel' - 'httpd-tools' - 'httpd-manual' REPO: 'appstream' --- 実行ログ TASK [test : Install Packages] ************************************************ Friday 06 May 2022 01:36:19 -0400 (0:00:00.023) 0:00:03.246 ************ changed: [192.168.0.1] => (item={'NAME': ['httpd', 'httpd-devel', 'httpd-tools', 'httpd-manual'], 'REPO': 'appstream'}) 2-3. 動的曞き換えの芋盎し ラク スで䜿っおいるansibleコヌドテンプレヌトでは、汎甚的な凊理を別のタスクファむルにしお、 「include_role」や「include_tasks」で動的に読み蟌み曞き換えるこずで、コヌドの再利甚性を高める取り組みを行っおおりたす。 その為、繰り返し凊理を行うず毎回コヌドの動的曞き換えず実行が行われる為、凊理時間が䌞びおいきたす。 2-3-1. コヌドの確認 以䞋のように汎甚的な凊理を別のロヌルに集めおおり $ roles/libraries/tasks/copy.yml --- - name: FILE COPY copy: src: "{{ item.SRC }}" dest: "{{ item.DEST }}" owner: "{{ item.OWNER }}" group: "{{ item.GROUP }}" mode: "{{ item.MODE }}" 呌び出し元からinclude_role等で呌び出しお利甚しおいたす。 $ roles/test/tasks/main.yml --- - name: Copy files include_role: name: libraries tasks_from: copy.yml with_items: - { SRC: 'test1', DEST: '/tmp/test1', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test2', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test3', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test4', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test5', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test6', OWNER: 'root', GROUP: 'root', MODE: '0644' } 実行するず、毎回copy.ymlが呌ばれる毎に凊理が行われる為、毎回TASKが呌ばれたす。 TASK [Copy files] ******************** Monday 06 June 2022 02:00:31 -0400 (0:00:01.356) 0:00:01.386 TASK [libraries : FILE COPY] ********* Monday 06 June 2022 02:00:31 -0400 (0:00:00.087) 0:00:01.474 changed: [192.168.0.1] TASK [libraries : FILE COPY] ********** Monday 06 June 2022 02:00:33 -0400 (0:00:01.099) 0:00:02.573 changed: [192.168.0.1] TASK [libraries : FILE COPY] ********** Monday 06 June 2022 02:00:33 -0400 (0:00:00.910) 0:00:03.484 changed: [192.168.0.1] TASK [libraries : FILE COPY] ********** Monday 06 June 2022 02:00:34 -0400 (0:00:00.869) 0:00:04.354 changed: [192.168.0.1] TASK [libraries : FILE COPY] *********** Monday 06 June 2022 02:00:35 -0400 (0:00:00.889) 0:00:05.243 changed: [192.168.0.1] TASK [libraries : FILE COPY] ********* Monday 06 June 2022 02:00:36 -0400 (0:00:00.854) 0:00:06.098 changed: [192.168.0.1] PLAY RECAP ********************************************* 192.168.0.1 : ok=7 changed=6 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Monday 06 June 2022 02:00:37 -0400 (0:00:00.830) 0:00:06.928 *********** =================================================== Gathering Facts --------------- 1.36s libraries : FILE COPY ---------- 1.10s libraries : FILE COPY ---------- 0.91s libraries : FILE COPY ---------- 0.89s libraries : FILE COPY ---------- 0.87s libraries : FILE COPY ---------- 0.85s libraries : FILE COPY ---------- 0.83s Copy files --------------------- 0.09s 2-3-2. コヌドの修正 動的曞き換え(include_*)を䜿わずに静的凊理に倉曎したす。 $ roles/test/tasks/main.yml --- - name: Copy files copy: src: "{{ item.SRC }}" dest: "{{ item.DEST }}" owner: "{{ item.OWNER }}" group: "{{ item.GROUP }}" mode: "{{ item.MODE }}" with_items: - { SRC: 'test1', DEST: '/tmp/test1', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test2', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test3', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test4', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test5', OWNER: 'root', GROUP: 'root', MODE: '0644' } - { SRC: 'test1', DEST: '/tmp/test6', OWNER: 'root', GROUP: 'root', MODE: '0644' } Ansibleを実行するずわずかですが、実行時間が短くなりたした。 曞き換えを行う回数が増えるほど効果は高くなりたすが、倉曎による効果はそれほど高くない為、「コヌドの再利甚性」ずどちらがよいかはで䜿い分ける必芁がありそうです。 TASK [test : Copy files] *********************************** Monday 06 June 2022 02:01:26 -0400 (0:00:01.413) 0:00:01.437 *********** changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test1', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test2', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test3', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test4', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test5', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) changed: [192.168.0.1] => (item={'SRC': 'test1', 'DEST': '/tmp/test6', 'OWNER': 'root', 'GROUP': 'root', 'MODE': '0644'}) PLAY RECAP ********************************************************************* 192.168.0.1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Monday 06 June 2022 02:01:31 -0400 (0:00:05.252) 0:00:06.689 *********** =================================================== test : Copy files --------------------5.25s Gathering Facts -------------------1.41s 3. Ansible実行環境チュヌニング 3-1. 䞊列実行数の倉曎 Ansibleの暙準蚭定では䞊列で実行するタヌゲット数が"5"ず蚭定されおいる為、倚くのタヌゲットに察しお実行する堎合に時間がかかりたす。 その為、䞊列実行数の倉曎を行いたす。 FORKS蚭定はAnsibleの子プロセスを増やす蚭定の為、増やせば増やすほどCPUぞの負荷がかかりたす。 各CPUの䜿甚率を確認し、䞍足しおいるようであればCPU数を増やすこずを怜蚎しおください。 $ /etc/ansible/ansible.cfg --- [defaults] forks = 5 もしくは 実行時にANSIBLE_FORKS=NUMを蚭定 ANSIBLE_FORKS=20 ansible-playbook ... 3-2. Pipelining ansibleのデフォルト蚭定の堎合、各タスクを実行する床に以䞋の䟋の様にタヌゲット偎の"~{ansible実行ナヌザのホヌム ディレクト リ}/.ansible/"に python プログラムの展開を行いAnsibleを実行しおいたす。 その為、タヌゲットぞのデヌタ転送時間ずこれらのファむルの曞き蟌み等により、各タスクの実行に時間がかかりたす。 /home/ansible_user/.ansible/ansible-tmp-1651804170.1883245-2652826-75480101479031/ 合蚈 120 drwx------. 2 root root 31 5月 5 22:28 . drwx------. 3 root root 68 5月 5 22:28 .. -rw-------. 1 root root 119155 5月 5 22:28 AnsiballZ_stat.py Pipeliningの有効化 Pipeliningを有効化するこずで、 ssh のpipeを経由しおansibleを実行するこずで高速化を行うこずができたす。 $ /etc/ansible/ansible.cfg --- [ssh_connection] pipelining = True ※蚭定を蚘茉するセクションは[defaults]ではなく[ ssh _connection]であるこずに泚意しおください もしくは 実行時にANSIBLE_PIPELINING=True か ANSIBLE_PIPELINING=1を蚭定 ANSIBLE_PIPELINING=1 ansible-playbook ... 公匏ドキュメント Ansible Configuration Settings — Ansible Documentation にもある通り、 requrettyが蚭定されおいるナヌザでansibleを実行する堎合は、sudo蚭定にお無効にする必芁がある為泚意が必芁です。 Pipelining有効化の確認 Ansible実行時にPipeliningが有効になっおいるかは、-vvvオプションを付けるこずで確認するこずができたす。 以䞋の䟋の様に "Pipelining is enabled" ず出力されおいるこずを確認しおください。 ... Pipelining is enabled. <192.168.0.1> ESTABLISH SSH CONNECTION FOR USER: ansible_user ... 3-3. サヌドパヌティ 補 Strategy Plugin (Mitogen for Ansible) Mitogen — Mitogen Documentation Other Toolsずしお公匏で玹介されおいるMitogen for Ansibleを䜿うこずで、䞊蚘Pipeliningよりも実行速床の高速化を行うこずができたす。 Mitogenは 実行コヌドのRAMぞのキャッシュ pipelineず同様タヌゲットぞの曞き蟌み削枛 埓来のPreforkモデルに加えお、Thread化によるさらなる䞊列化・高速化 ネットワヌクコネクションの再利甚等 によりAnsibleの実行を高速化するこずができたす。 Mitogen利甚時に気付いた点 Mitogen利甚時に以䞋の事象が確認できたしたので、利甚するには事前に怜蚌が必芁です。 珟行v0.2.9ではタヌゲットサヌバ偎に"/usr/bin/ python "が必芁(/usr/bin/python3ではダメ) ansible 2.10以降には未察応 (2022/06/13時点でAnsible v2.10以䞊に察応するv0.3.xは未リリヌス 2022/06/13远蚘) タヌゲットの python 環境によっおは動かないコヌドがある include_roleは未察応 CPU䜿甚率がPipeliningよりかなり高い メモリの䜿甚率が高い Pipeliningずの䜵甚はできない どなたかv2.10以降でmitogen for Ansibleが動くよずいうコメントをいただきたしたが、公匏ニュヌスに蚘茉されおいるように v0.2.xは2.10未満 v0.3.x系は2.10以䞊 をサポヌトずいう颚にバヌゞョンが分かれるようです(2022/06/13远蚘) Release Notes — Mitogen Documentation Mitogenの利甚方法 ■Ansible実行環境にMitogenを蚭眮 $ curl -kL -o https://networkgenomics.com/try/mitogen-0.2.9.tar.gz $ tar zxvf mitogen-0.2.9.tar.gz -C /opt/ ■Strategy プラグむン ずしおmitogenを蚭定 $ ansible.cfg --- [defaults] strategy_plugins = /opt/mitogen-0.2.9/ansible_mitogen/plugins/strategy ■各playbook毎にstrategyを蚭定しおmitogenを有効化したす。(ansible.cfgで党䜓に適甚しおもよい) $ playbook.yml --- - name: Test Playbook strategy: mitogen_linear hosts: test-servers ... あるPlaybookの実行時間の差を確認したずころ、以䞋様にかなりの差がありたした。 Default状態 ... 0:00:22.399 Pipelining ... 0:00:17.744 Mitogen for Ansible ... 0:00:09.333 3-4. 䞊蚘実行環境毎の実行速床の蚈枬比范結果 怜蚌ずしおタヌゲットサヌバ20台に察し、 ディレクト リ10個䜜成する凊理を行いたした。 それぞれの環境毎に5回実行し、䞀番早い時間ず䞀番遅い時間を陀く3回の平均時間を蚘しおいたす。 [怜蚌結果] AnsibleサヌバCPU数 FORK数 CPU䜿甚率 平均実行時間 コメント [Default] 1 5 20 - 40% 01:39 1 10 20 - 70% 01:05 1 20 30 - 100% 00:42 CPUが100%ずなる堎合があり凊理埅ちが発生 2 5 10 - 20% 01:36 1 vCPUでもCPUに䜙裕があった為、CPU远加効果なし 2 10 20 - 40% 01:01 1 vCPUでもCPUに䜙裕があった為、CPU远加効果なし 2 20 15 - 80% 00:36 CPU 100%が解消され凊理時間が短瞮 [Pipelining] 1 5 30 - 40% 00:40 Pipeliningの効果が高いが若干CPU䜿甚率が䞊昇 1 10 30 - 70% 00:28 Pipeliningの効果が高いが若干CPU䜿甚率が䞊昇 1 20 30 - 100% 00:21 Pipeliningの効果が高いが若干CPU䜿甚率が䞊昇 2 5 15 - 30% 00:38 1 vCPUでもCPUに䜙裕があった為、CPU远加効果なし 2 10 20 - 40% 00:26 1 vCPUでもCPUに䜙裕があった為、CPU远加効果なし 2 20 30 - 50% 00:17 CPU 100%が解消され凊理時間が短瞮 [Mitoge] 1 5 100% 00:18 Pipeliningよりさらに効果が高いがCPU䜿甚率がかなり䞊昇 1 10 100% 00:16 Pipeliningよりさらに効果が高いがCPU䜿甚率がかなり䞊昇 1 20 100% 00:16 Pipeliningよりさらに効果が高いがCPU䜿甚率がかなり䞊昇 2 5 25 - 50% 00:19 CPUに䜙裕がでたが、CPU远加効果なし 2 10 40 - 60% 00:16 CPUに䜙裕がでたが、CPU远加効果なし 2 20 30 - 70% 00:14 SWAPが発生 2+2GBメモリ 20 50% 00:14 メモリを远加するこずでSWAPが解消 実行速床怜蚌総括 Pipelining Ansible暙準機胜ずしお実装されおいる為、手軜に利甚が可胜で効果が高い為、暙準で利甚できるようにしおおくずよい。 Ansible実行偎のCPU䜿甚率の䞊昇が若干芋られるが、実行環境の倧幅な芋盎しは必芁ない。 䞊列実行数(ANSIBL_FORKS) 䞊列実行数を䞊げお実行する堎合はAnsible実行偎のCPU䜿甚率を確認しお匕き䞊げる必芁がある。 Mitogen for Ansible CPUの䜿甚率が高い為、CPUの割り圓お数に泚意が必芁。 䞊列実行数を増やすAnsible実行サヌバのメモリ䜿甚量が䞊がる為、メモリの割り圓おに泚意が必芁。 初期導入䜜業が必芁だが、Pipelineよりも効果が高い。 4. 高速化の結果 最終的に Mitogen Plugin及び䞊蚘コヌドの改修等を進め 以䞋の様に 1/3に高速化するこずができたした ■改修前 Tuesday 07 June 2022 01:14:14 -0400 (0:00:03.472) 0:05:20.110 ********** ■改修埌 Tuesday 07 June 2022 01:04:01 -0400 (0:00:02.327) 0:01:34.366 ********** 終わり ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに はじめたしお。knng1です。 本蚘事では、AnsibleのRoleの䜿甚方法に぀いおたずめおいきたいず思いたす。 Ansibleを実務で䜿甚する堎合、基本的にはRole化されおいるずころが倚いず思いたすので、 これからAnsibleã‚’è§Šã‚‹æ–¹ 最近Ansibleの勉匷を始めた方 の参考になれば幞いです。 はじめに Ansible ずは Ansible 䜿甚䟋 ディレクトリ sample.yml 実行ログ Roleに぀いお ディレクトリ sample-role.yml roles/yum/tasks/main.yml roles/template/tasks/main.yml roles/template/handlers/main.yml 実行ログ その他の機胜に぀いお defaults roles/<Role名>/defaults/main.yml サンプル vars roles/<Role名>/vars/main.yml files roles/<Role名>/files/main.yml meta roles/<Role名>/meta/main.yml Ansible Role おたけ ansible-galaxy init Ansible ずは Ansibleは RedHat 瀟が開発する OSS の構成管理ツヌルです。 あらかじめ蚘述したPlaybookファむル通りに゜フトりェアのむンストヌルや蚭定を自動で行うこずができたす。 管理察象機噚には SSH プロトコル を䜿甚するため、゚ヌゞェントレスでの導入が可胜です。 新芏に構築するシステムはもちろん、すでに数十台、数癟台を管理しおいるようなシステムでも容易に導入ができたす。 詳现はAnsibleを説明しおいる 公匏ドキュメント をご参照ください。 Ansible 䜿甚䟋 今回は apache のむンストヌル、confファむルの配垃、サヌビスの再起動を行う簡単なPlaybookを䜜成したした。 ※Playbookの詳现に぀いおは こちら ディレクト リ ├── ansible.cfg ├── sample.yml ├── templates │ └── httpd.conf.j2 └── test-hosts sample.yml [root@AnsibleServer ansible]# cat sample.yml --- - hosts: test-server gather_facts: false tasks: - name: install apache yum: name: httpd state: installed - name: setup apache template: src: httpd.conf.j2 dest: /etc/httpd/conf/httpd.conf - name: restart apache service: name: httpd state: restarted enabled: yes 実行ログ Playbookを実行するず䞋蚘のようなログが出力されたす。 changedが衚瀺されおいれば、taskの実行によっおタヌゲットのサヌバに倉曎が加えられたこずを瀺しおいたす。 [root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample.yml PLAY [test-server] ************************************************************************************************************************************************************************************************** TASK [install apache] *********************************************************************************************************************************************************************************************** changed: [test-server] TASK [setup apache] ************************************************************************************************************************************************************************************************* changed: [test-server] TASK [restart apache] *********************************************************************************************************************************************************************************************** changed: [test-server] PLAY RECAP ********************************************************************************************************************************************************************************************************** test-server : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Roleに぀いお AnsibleのRoleは凊理毎にグルヌプ化しお分割する機胜です。 roles アトリビュヌト で察象のグルヌプ(Role)を呌び出すず「roles/<Role名>/tasks/main.yml」が読み蟌たれたす。 ※「main.yml」以倖の名前ではincludeやimportをしないず読み蟌んでもらえないのでご泚意ください。 たた、rolesを䜿甚しおいる堎合、handlersを䜿甚するこずができたす。 handlersは「roles/<role名>/tasks/main.yml」内の察象のタスクがchangedステヌタスで終了した堎合に実行される凊理です。 ここで実行したい凊理は「roles/<role名>/handlers/main.yml」に蚘述し、tasks配䞋のmain.ymlで「notify: <タスク名>」を蚘述しお呌び出したす。 コンフィグファむルの配垃等、サヌバに倉曎が加わった堎合のみサヌビスを再起動したい堎合にずおも有甚な機胜です。 サンプルPlaybookをrole化しお分割するず、以䞋のような感じになりたす。 ディレクト リ ├── roles │ ├── template │ │ ├── handlers │ │ │ └── main.yml │ │ ├── tasks │ │ │ └── main.yml │ │ └── templates │ │ └── httpd.conf.j2 │ └── yum │ └── tasks │ └── main.yml ├── sample-role.yml └── test-hosts sample-role.yml - hosts: test-server gather_facts: false roles: - yum - template roles/ yum /tasks/main.yml --- - name: install apache yum: name: httpd state: installed roles/template/tasks/main.yml --- - name: setup apache template: src: httpd.conf.j2 dest: /etc/httpd/conf/httpd.conf notify: restart apache roles/template/handlers/main.yml --- - name: restart apache service: name: httpd state: restarted enabled: yes 実行ログ [root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample-role.yml PLAY [test-server] ************************************************************************************************************************************************************************************************** TASK [yum : install apache] ***************************************************************************************************************************************************************************************** changed: [test-server] TASK [template : setup apache] ************************************************************************************************************************************************************************************** changed: [test-server] RUNNING HANDLER [template : restart apache] ************************************************************************************************************************************************************************* changed: [test-server] PLAY RECAP ********************************************************************************************************************************************************************************************************** test-server : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 その他の機胜に぀いお AnsibleのRoleには前述した「tasks」、「handlers」、「templates」以倖にもいろいろな機胜がありたす。 䟿利に䜿甚できるものが倚いので、簡単に説明させおいただきたす。 defaults roles/<Role名>/defaults/main.yml 察象のAnsibleのRoleは、デフォルト倉数を定矩する機胜です。 その他の倉数ファむルで定矩された堎合、ここで定矩された倉数は䞊曞きされたす。 蚘述方法はその他倉数ファむルず同様です。 サンプル --- ansible_user: root package: - { state: installed , name: httpd } - { state: installed , name: tomcat } vars roles/<Role名>/vars/main.yml その名の通り、倉数を定矩する機胜です。 ここで定矩する倉数は最埌に読み蟌たれるため、「defaults」はもちろん「group_vars」や「host_vars」の倉数も䞊曞きたす。 デフォルト倉数はずもかく、倉数ファむルが耇数個所にたたがっお配眮されるず管理が煩雑になるため、 個人的には特別な理由がない限りは「group_vars」や「host_vars」を䜿甚した方が管理しやすいず思いたす。 files roles/<Role名>/files/main.yml Copyモゞュヌルを䜿甚する際にファむルを栌玍する ディレクト リです。 ここに栌玍されたファむルはファむル名のみで呌び出し可胜です。 meta roles/<Role名>/meta/main.yml Ansibleの各Roleの䟝存関係を定矩するファむルです。 「 yum 」のmeta/main.ymlで「template」を指定した堎合、䞋蚘のように「template」⇒「 yum 」の順に実行されおしたいたすので泚意が必芁です。 [root@AnsibleServer ansible]# ansible-playbook -i test-hosts sample-role.yml PLAY [test-server] ************************************************************************************************************************************************************************************************** TASK [template : setup apache] ************************************************************************************************************************************************************************************** changed: [test-server] TASK [yum : install apache] ***************************************************************************************************************************************************************************************** changed: [test-server] RUNNING HANDLER [template : restart apache] ************************************************************************************************************************************************************************* changed: [test-server] PLAY RECAP ********************************************************************************************************************************************************************************************************** test-server : ok=3 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 Ansible Role おたけ ansible-galaxy init AnsibleのRoleの各 ディレクト リは「ansible-galaxy init <Role名>」で簡単に生成できたす。 新芏でAnsibleのRoleを䜜成する際に利甚しおみおください。 [root@AnsibleServer ansible]# ansible-galaxy init roles/test - Role roles/test was created successfully [root@AnsibleServer ansible]# [root@AnsibleServer ansible]# ll roles/test total 4 drwxr-xr-x 1 root root 512 May 29 11:42 defaults drwxr-xr-x 1 root root 512 May 29 11:42 files drwxr-xr-x 1 root root 512 May 29 11:42 handlers drwxr-xr-x 1 root root 512 May 29 11:42 meta -rw-r--r-- 1 root root 1328 May 29 11:42 README.md drwxr-xr-x 1 root root 512 May 29 11:42 tasks drwxr-xr-x 1 root root 512 May 29 11:42 templates drwxr-xr-x 1 root root 512 May 29 11:42 tests drwxr-xr-x 1 root root 512 May 29 11:42 vars ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに JUnitずSpockに぀いお ラむフサむクルの定矩 テストクラス デヌタドリブンテスト たずめ はじめに こんにちは、ryrkssです。 今回は、今のプロゞェクトのテスト フレヌムワヌク に JUnit ず Spock が䜿われおいるので、 簡単なテストコヌドでどう曞き方が違うのか比范しおみようず思いたす。 たた、それぞれ各テストで出おくる アノテヌション や怜蚌メ゜ッドに぀いおの説明は割愛したす。 本蚘事で䜿う JUnit は JUnit5 です。 以埌 JUnit が倚発したすが党お JUnit5 ずしお捉えおいただければ幞いです。 JUnit ずSpockに぀いお みなさんご存知の方は倚いず思いたすが「知らないよ」ずいう方に向けおちょっずだけたずめたす。 JUnit Java のテスト フレヌムワヌク ずいえば真っ先に思い浮かぶ有名なテスト フレヌムワヌク です。 Java ゚ンゞニアであれば党おの人が通る道ではないでしょうか。 Spock Groovy で動䜜する Java のテスト フレヌムワヌク です。 Java ずは違う蚀語で曞くので「違う蚀語芚えないずいけないのか」ず思う人もいるかもしれたせんが、 Java ずほが同じ感芚でコヌディングできたす。 䜕よりデヌタドリブンテストが JUnit ず比べお非垞に曞きやすく可読性も高いです。 あずは、MockAPIが暙準で入っおいるこずも嬉しい人には嬉しいず思いたす。 ※私は䜿い慣れおいる Mokito を䜿っちゃっおたすが。 JUnit ず Spock は共存できるので、是非どちらも詊しおみおください。 それでは、 JUnit ず Spock のテストコヌドの曞き方を比べおみたす。 ラむフサむクルの定矩 良く䜿いたすが JUnit は アノテヌション 、 Spock はメ゜ッド名で定矩したす。 JUnit アノテヌション で実行タむミングを衚珟したす。 // 各テストメ゜ッドが実行される前に郜床実行 @BeforeEach void init() {} // 各テストメ゜ッドが実行された埌に郜床実行 @AfterEach void cleanup() {} // テストクラスが実行される前に1床だけ実行 @BeforeAll static void initAll() {} // テストクラスが実行された埌に1床だけ実行 @AfterAll static void cleanupAll() {} Spock メ゜ッド名で実行タむミングを衚珟したす。 // 各テストメ゜ッドが実行される前に郜床実行 def setup() {} // 各テストメ゜ッドが実行された埌に郜床実行 def cleanup() {} // テストクラスが実行される前に1床だけ実行 def setupSpec() {} // テストクラスが実行された埌に1床だけ実行 def cleanupSpec() {} Spock のメ゜ッド名だけで刀別しおくれるのは、コヌドがスッキリしお良いですよね。 JUnit はお銎染みの アノテヌション 定矩です。 芋慣れすぎお䜕も思わないです。 テストクラス JUnit @Test @DisplayName( "文字列結合" ) void combineStringsTest() { var expected = "テスト" ; var actual = sut.combineStrings( "テ" , "ス" , "ト" ); assertEquals(expected, actual); } Spock def "文字列結合" () { setup : def expected = "テスト" when : def actual = sut.combineStrings( "テ" , "ス" , "ト" ) then : actual == expected } 単玔なテストを曞きたしたが、結構違いたすね。 JUnit ず Spock で目に付く違いは、ブロックの定矩です。 JUnit はコヌドを蚘述しおいるだけですが、 Spock には setup: や when: など 蚘茉しおいるもの以倖にもそれぞれのフェヌズに応じたブロックがありたす。 単なる分かりやすくするためだけのものではないので、ちゃんず状況に応じた䜿い分けをしたしょう。 たた、こう芋るず JUnit は アノテヌション @Test を毎回぀けなければならないのが冗長に感じたす。 怜蚌メ゜ッドに぀いおも JUnit はメ゜ッドを䜿甚する必芁がありたすが、 Spock は等䟡 挔算子 を䜿うだけで事足りたす。 こちらは比范的䞇胜で配列やリスト、数倀なども等䟡 挔算子 で怜蚌できたす。 デヌタドリブンテスト こちらもよく䜿いたす。 同じようなテストを1぀1぀メ゜ッドで分けるのは、テストケヌスが芋えにくく可読性が萜ちおしたいたすよね。 JUnit は ParameterizedTest で怜玢するず出おくるず思いたすが、 枡しおいる倀ず想定結果の関係性が分かりにくく、同時に曞きにくいず感じおしたいたした。 その反面 Spock は非垞に曞きやすく、芋やすいので実装しおいる時にパタヌンを掗い出しやすいです。 たたレビュヌ時もテストケヌスを考えずずも頭に入っおくる感芚で個人的には䞭毒になるレベルです。 癟聞は䞀芋に劂かずずいうこずで、早速比范しおみたいず思いたす。 JUnit 䟋ずしお、3皮類の曞き方を蚘茉したす。 ただパラメヌタが少ない䞔぀、型を同䞀にしおいるので幟分芋え方がたしですが、 ②、③に぀いおはパラメヌタ数が倚くなる、色々な型が混じるずなるず 本圓に䜕のテストをしおいるのか分からなくなっおきたすね 。 /* ① 単䞀パラメヌタのみを定矩する曞き方 匕数で定矩した型に暗黙的に倉換される(サポヌトされおいる型は芁確認) */ @ParameterizedTest @ValueSource(strings = { " テスト " , " テスト" , "テスト " }) void trimTest1(String target) { var expected = "テスト" ; var actual = sut.trim(target); assertEquals(expected, actual); } /* ② csv圢匏でパラメヌタを定矩できる曞き方 デリミタを倉曎したり倖郚ファむルを指定するこずもできる 䟋は文字列だけだが他の型も定矩できお、匕数で定矩したそれぞれの型に暗黙的に倉換される */ @ParameterizedTest @CsvSource ({ " テスト , テスト" , " テスト, テスト" , "テスト , テスト" , }) void trimTest2(String target, String expected) { var actual = sut.trim(target); assertEquals(expected, actual); } /* ③ 別メ゜ッドにパラメヌタを定矩できる曞き方 メ゜ッドで匕数を定矩するので独自の型をパラメヌタで䞎えるこずができたり、 ただのメ゜ッドなので最終的に返り倀の圢にしおあげれば䜕でもできるむメヌゞ */ @ParameterizedTest @MethodSource( "trimArguments" ) void trimTest3(String target, String expected) { var actual = sut.trim(target); assertEquals(expected, actual); } static Stream<Arguments> trimArguments() { return Stream.of( Arguments.of( " テスト " , "テスト" ), Arguments.of( " テスト" , "テスト" ), Arguments.of( "テスト " , "テスト" ), Arguments.of( null , "" ) ) } Spock 䟋ずしお2皮類ありたすが、どちらもメ゜ッドに @Unroll を぀けお、 where: にパラメヌタを定矩しおいくだけずなりたす。 たた、文字列だけを扱うテストになっおたすが、勿論他の型が混じっおも問題ありたせん。 簡単なものしか蚘茉しおいたせんが、 where は色々な䜿い方ができるようなので興味のある方は調べおみおください。 /* ①デヌタテヌブルを䜿甚した曞き方 1行目がテスト内の倉数にマッピングされ、2行目以降がその倉数に入れるデヌタパタヌン || を぀けるこずで怜蚌甚のデヌタず想定結果を芖芚的に分かりやすくできる */ @Unroll( "文字列前埌空癜陀去 #title" ) def "trimTest1" () { when : def actual = sut.trim(target) then : actual == expected where : title | target || expected "前埌空癜" | " テスト " || "テスト" "前空癜" | " テスト" || "テスト" "埌空癜" | "テスト " || "テスト" "null" | null || "" } /* ②デヌタパむプを䜿甚した曞き方 巊シフト挔算子で倉数ずデヌタ郚を接続 */ @Unroll( "文字列前埌空癜陀去 #title" ) def "trimTest2" () { when : def actual = sut.trim(target) then : actual == expected where : [title, target, expected] << [ [ "前埌空癜" , " テスト " , "テスト" ], [ "前空癜" , " テスト" , "テスト" ], [ "埌空癜" , "テスト " , "テスト" ], [ "null" , null , "" ] ] } たずめ いかがでしたでしょうか 簡単な䟋しか出せおおらずむメヌゞが぀きにくいかもしれたせんが、 テストの可読性・曞きやすさだけでいうず JUnit よりも Spock の方が印象ずしお良いのかなず私は感じたした。 珟圚のチヌムでも新しく䜜るテストクラスは倧䜓 Spock で䜜っおたりしおたす。 ただし、 JUnit にしかできないこずもありたす。 䟋えば、 JUnit のネスト( @Nested )を䜿っおテストをたずめるこずが Spock ではできたせん。 テストも色々な曞き方があっお奥が深いですね〜 テストの実装はベストプ ラク ティスをあたり深く考えおこなかったのですが、 しっかりず可読性や䜕が最良なコヌディングかを考えおいかなくおはいけないな、ず感じおおりたす。 党䜓を通しおかなり Spock よりの蚘事になっおしたいたしたが、 結論 JUnit も Spock もどちらも䜿いやすいです。 最埌に...冒頭でも曞かせおいただきたしたが JUnit ず Spock は共存できるので 是非実際にそれぞれでテストを曞いおみおください ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに Gather.Townずは 導入しようず思ったきっかけ オフィスの䜜り方 どう䜿ったか たずめ・感想 はじめに こんにちは。新卒3幎目hy094です。 最近はスパむのアニメにハマっおいたす。ファミリヌのや぀です。 今回は Gather.Town を導入したらリモヌトワヌク䞭の開発速床が向䞊した話をしたいず思いたす。 Zoomが2人の通話でも制限時間が40分になっおしたい、代替ツヌルを探しおいる方もいるかず思いたすので、少しでも刀断材料になれば嬉しいです。 Gather.Townずは 䞀蚀で蚀うず "Pokemon x Zoom thing" ( Notion – The all-in-one workspace for your notes, tasks, wikis, and databases. ) です。 ポケモン ずZoomを掛け合わせたかのようなツヌルで、ゲヌム奜きの人には芪しみやすくか぀Zoomに近い䜿い心地で利甚できたす。(䜿い方によっおはZoomを䞊回る利䟿性すら秘めおいるず思いたす。 衚題では「リモヌトオフィス」ず衚珟したしたが、これは私たちの䜿い方がリモヌトオフィスに近かったためです。Gather.Townはオフィスに限らず様々な甚途に掻甚できたす。 䞀䟋ずしお、瀟内サヌクルでの掻甚事䟋です。 Gather.Townで瀟内サヌクル掻動の䞀郚をオンラむン化したした - Qiita 導入しようず思ったきっかけ 匊瀟は基本オフィスワヌクで、緊急事態宣蚀やたんえん防止等重点措眮などが発什されおいる堎合のみ完党リモヌトワヌクになる運甚でした。 ここしばらくは萜ち着いおおり出瀟しおいたすが、珟圚もおそらく同様です 皆さんもご存知の通り、発什したり解陀したりが繰り返されおいたため、私たちも出瀟ずリモヌトを繰り返しおいたした。 そこで出瀟した際にリモヌトの仕事がどうだったか新卒入瀟の埌茩に聞いたずころ、 「気軜に盞談しにくい」 ずいった声がありたした。 出瀟時は隣にちょっず声をかけるだけのずころを、チャットで連絡→返信埅぀→ZoomURLを共有→入宀埅぀→盞談ずいった流れで、実装で少し詰たったずころを聞くだけで15分〜30分かかるずいった状態です。 そこで䞁床䞊蚘の瀟内サヌクルでの導入事䟋を芋お、同じ空間にいれば声をかけやすいのではず導入しおみるこずにしおみたのです。 オフィスの䜜り方 導入方法に぀いおは再掲になりたすが、匊瀟の昚幎の アドベントカレンダヌ に蚘茉があるのでそちらを参照しおください。 Gather.Townで瀟内サヌクル掻動の䞀郚をオンラむン化したした - Qiita ここでは、オフィスの䜜成方法だけお䌝えしたす。 基本は䞊蚘の蚘事の通りで倧䞈倫なんですが、「Explore social experiences」でそのたたテンプレヌトが遞べなくなっおいたので、テンプレヌトたでの道のりも瀺しおおきたす。 䞀番巊の「Set up an office or team social」を遞択 巊の「Remote Office」を遞択 オフィスを改造したり増築する予定がない方はこのたた「Confirm Selection」を抌しおください。 ※「Confirm Selection」で䜜成されるspaceに床や壁を远加しようずするず、デフォルトで぀いおいる背景など党お消え去っおしたうためです。䞀床space䜜り盎したした ※ただ壁ず床の远加はベヌタ版のようなので、いずれ線集できるようになるかもしれたせん 壁や床を線集しようずするず以䞋のような譊告が出お・・・ Yesを抌すず真っ癜になっおしたいたす 「Confirm Selection」がある画面の巊䞋に「See other space」ずいうボタンがあるので、それを遞択するずテンプレヌト遞択画面に飛べたす。 あずは先皋の蚘事の通り䜜成しおいただければ問題なく郚屋の改築が可胜です。 どう䜿ったか オフィスずしおGather.Townの特性を最倧限掻かすための䜿い方はズバリ 「垞時ログむンし座っおおくこず」 です。 他の䜜業をやっおいる時も裏で起動しおおき、キャ ラク タヌを机の前(怅子の䞊)に眮いおおきたす。 芋た目で「出瀟しおる感」があるのはもちろん、通知機胜(ログむン䞭でGather.Townが非アクティブな人に通知を送るこずができる)などを䜿うこずで、オフィスでは普通にやっおいる「すみたせん、今お時間いいですか」をリモヌトで実珟するこずができたした。 実際の䜜業䞭の颚景↓ ちなみに、埌ろ向いおたすが青いのが僕です。 ポケモン のアクア団をむメヌゞしたした。 たた、逆にチャットで悩んでる雰囲気の人を芋぀け、教える偎の人が突撃するこずも容易になりたした。 盞談がしやすくなったこずで䞀人で悩む時間が栌段に枛り、結果的に開発がスムヌズに進むようになりたした。 ただ、䞀぀倧きな問題があり・・・ Gather.Townはそこそこ重く、それを垞時起動ずするずそれなりにメモリを喰っおしたうこずです。 導入の際はマシンスペックやコミュニケヌションぞの課題感ず盞談しおいただければず思いたす。 たずめ・感想 たず、導入しお本圓によかったです。 オフィスワヌクず遜色ないレベルでコミュニケヌションが取りやすくなり、開発もスムヌズに進むので導入前に比べお楜しく開発できたした。 たた、Gather.Townの導入は圓時2幎目の私が提案し、導入に至っおいたす。 若手も色々ず提案でき、それをやっおみるこずができる環境は個人的にはずおも嬉しいです。 Gather.Townには他にもたくさんメリットデメリットがありたしたが、そちらは別途「 ラクス フロント゚ンドチヌムnote 」の方にたずめたした 是非ご確認ください。 note.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
こんにちは、技術広報の yayawowo です。 システム開発 で重芁な『開発ずテスト』に぀いお、 ゚ンゞニアの䜓隓談やTipsを芗いおみたせんか 延べ450名以䞊の参加申蟌をいただいた、 『開発×テスト LT䌚』党2開催分の資料をたずめお玹介したす むベント詳现はこちらをご確認ください ・ 開発×テスト LT䌚 ・ 開発×テスト LT䌚 - vol.2 開発×テスト Tips 11遞 絶察にテストコヌドを曞かないチヌムのテストルヌル 意倖ずカンタン!?テストコヌドの改善から始めるシステム開発の効率化 テスト嫌いなプログラマがテストを語る ISTQB/JSTQBシラバスから孊ぶAgileTesting 単䜓テストれロからテスト文化を醞成させた話 少しず぀手厚くしお䞍具合や仕様挏れを防ぐために CircleCIお゙timing dataに基぀゙いたテスト分割をDartお゙利甚お゙きるようにした話 ゜フトりェア゚ンゞニアが品質保蚌を孊んでわかったこず 個人開発でテストを曞いおみお良かったこず䌞びしろ UTアンチパタヌン むンシデントゼロを支える技術 最埌に 開発×テスト Tips 11遞 絶察にテストコヌドを曞かないチヌムのテストルヌル 発衚者 ヒグ さん speakerdeck.com ◆ 発衚内容 ・テストコヌドのいいずころ  →テストを自動化しお効率化  → 単䜓テスト を入れるこずでコヌドの品質を評䟡  →修正しお再テストが容易 ・手動テスト/自動テストのメリット/デメリット ・自動テストデヌタの扱いやすさ、手動テストの柔軟性  →双方の長所を掻かしお生産性向䞊に繋げおいきたい 意倖ずカンタン!?テストコヌドの改善から始める システム開発 の効率化 発衚者 面川泰明 さん speakerdeck.com ◆ 発衚内容 ・テストやっおお぀らいこずはありたせんか  →考慮挏れしたテストケヌスで䞍具合を発芋できない  →テスト甚のドキュメントをいちいち䜜成/曎新するのが面倒 ・今回取り組んだ内容  ① テストコヌドは適切にケヌス分けする  ② あえおDRYをやめ、べた曞きする ・続けお良かったこず  ゚ンゞニアテストケヌスの考慮挏れに気づきやすくなった  テスタヌ テスト甚のドキュメントを䜜成/曎新する手間が削枛された テスト嫌いな プログラマ がテストを語る 発衚者 癜柳隆叞 さん speakerdeck.com ◆ 発衚内容 ・テストが「嫌い」な プログラマ は倚いはず  →おおっぎらに「嫌い」ずも蚀えない空気感 ・「嫌い」だから遠ざけおいいわけではない ・「嫌い」の理由を芋぀める  →そこから出おくる芖点を掻甚する ISTQB/ JSTQB シラバス から孊ぶAgileTesting 発衚者 Daiki Tanoguchi さん speakerdeck.com ◆ 発衚内容 ・品質はチヌムのもの ・リスク評䟡は「盞察芋積もり」でできる ・探玢的テストはセッションベヌスドか぀テストチャヌタヌを甚いお行おう ・芁求゚ンゞニアリングの技法を䜿っおテストを考えよう 単䜓テスト れロからテスト文化を醞成させた話 発衚者 south さん speakerdeck.com ◆ 発衚内容 ・やったこず  →ラむブラリ導入Jest/Testing Library  →ドキュメントラむブラリの䞻芁な API /テスト芳点/サンプルコヌド  →モック関数を甚意  →読曞&発衚  → ペアプロ ・モブプロ ・ラむブラリを導入しお終わりではなくテストが曞きやすい環境を敎備 ・テストは慣れるしかないが段階的に慣れおいくための支揎をしよう 少しず぀手厚くしお䞍具合や仕様挏れを防ぐために 発衚者 fumiyasac さん 少しず぀手厚くしお䞍具合や仕様挏れを防ぐために from Fumiya Sakai www.slideshare.net ◆ 発衚内容 ・少しず぀UnitTestを手厚くしお耇雑になっおも仕様を読み取れる様にする  ① 仕様を良い意味で疑いながら必芁な芳点を掗い出す  ② UnitTestがあるず以前の仕様の確認もできる  ③ 蚀葉だけでは玛らわしい郚分にはテストを手厚く曞く様にする CircleCIお゙timing dataに基぀゙いたテスト分割を Dart お゙利甚お゙きるようにした話 発衚者 operandoOS さん speakerdeck.com ◆ 発衚内容 ・ Dart testsでCircleCIのtiming dataを利甚しお良い感じにテスト分割/䞊行実行したい   ① Dart testの結果を Junit XML で出力する  ② 出力した Junit XML をテスト メタデヌタ ずしおCircleCIに認識させる  ③ テスト実行のコマンドを曞き換える ・"No timing found for <ファむル>"ずいう゚ラヌが出た堎合  原因timing dataのfile keyの倀がnull  察応  ・ dart -junitreportの内郚で利甚しおいる dart -testreportラむブラリの修正  ・ dart -junitreportで Junit XML 出力する際、testcase elementにfile attributeの远加  ・file attributeに蚘茉されたfile pathをCI䞊で sed コマンドを利甚しお曞き換え ゜フトりェア゚ンゞニアが品質保蚌を孊んでわかったこず 発衚者 hisaichi5518 さん speakerdeck.com ◆ 発衚内容 ・品質を定矩するのが重芁 ・プロダクト品質を保蚌するには、品質を䜜りこむこずが倧事 ・品質を䜜り蟌むには、チヌム党員が 開発プロセス をすべおフェヌズでテストをするHolistic testing ・テストずは、 開発プロセス のフェヌズで出来た成果物に察しおチヌム党員が想定したものか確認するこず 個人開発でテストを曞いおみお良かったこず䌞びしろ 発衚者 あきお さん akio-blogger.blogspot.com ◆ 発衚内容 ・なんで個人開発でテストを曞こうず思ったのか  →個人開発では0からテストを曞くこずができる  →個人開発だから自由に技術遞定ができる  →若干仕様が耇雑な郚分がある ・良かったこず  →テストが開発蚘録代わりになる  →最初以倖はテストのメンテコストを感じない  →少し時間はかかるけどチャレンゞングなこずができる UT アンチパタヌン 発衚者 ryo07 さん UTアンチパタヌン from ryoheiseki1 www.slideshare.net ◆ 発衚内容 ・ アンチパタヌン  ① 「そもそもテストが存圚しない」  ② 「テスト名が雑」  ③ 「mock, verify に any を䜿うな」  ④ 「テストの䞭に実装コヌドを混ぜるな」  ⑀ 「なにもアサヌトしおいない」  ⑥ 「Null チェックが甘い」 むンシデントゼロを支える技術 発衚者 Yuji Yamaguchi さん speakerdeck.com ◆ 発衚内容 ・フロント゚ンドテストの぀らみ  → 単䜓テスト は問題ないのに手戻りや結合バグが倚くなりがち ・testing-libraryの導入で良かったこず/難しかったこず ・testing-libraryを䜿うず、実態に近い状態でテストをするこずができる ・党䜓仕様を把握するための材料ずしお、テストケヌスを䜜成するのもオススメ ・ 単䜓テスト よりもコストがかかるので、やりすぎないように泚意が必芁 最埌に 『開発×テスト LT䌚』のたずめはいかがでしたでしょうか 参考になる システム開発 /テストのTIpsが1぀でもありたしたら、幞いです。 たた、『開発×テスト LT䌚 vol.3』が7/20(æ°Ž)19:00、開催を予定しおおりたす rakus.connpass.com 登壇/芖聎ずもに募集をしおおりたすので、是非お気軜にご参加ください 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
4/16に ラク スに入瀟したした、技術広報の飯野です。 入瀟しお1ヶ月ず少し経ちたしたので入瀟゚ントリを曞いおみるこずにしたした。 本投皿は瀟倖の方はもちろんですが瀟内メンバヌにも自己玹介の絶奜の機䌚ですので、瀟内倖を問わず読み物ずしおお楜しみいただければず思いたす。 「技術広報っお䜕をしおいるの」「なぜ゚ンゞニアから技術広報に」ずいう方から「 ラク スっおどんな䌚瀟か知りたい」ずいう方にたで幅広く読んでいただければ幞いです。 目次 経歎 転職のきっかけ 入瀟の決め手 ラクスの技術広報ずは 入瀟埌やっおいるこず 瀟内の雰囲気 入瀟埌の課題感 たずめ 経歎 倧孊 文孊郚日本文孊科を卒業しおおり、生粋の文系です。 入瀟1瀟目の垞駐先で「奜きな叀文は 源氏物語 です」ず蚀ったずころ、倧局倉わった子扱いをされおいたした。そんなに倉わった人間ではないです。 1瀟目 前述の䞭小 SIer に新卒で入瀟し、SES客先垞駐の圢態で玄4幎働いおいたした。 Web広告代理店、宝くじ、 クラりド サヌビス、ネット蚌刞等の珟堎で゚ンゞニア経隓を積たせおいただきたした。 SESあるあるかず思いたすが6幎前の情報なので今ずは違うかもしれたせん、 垞駐先によっお埅遇がかなり倉わるこず 完党な りォヌタヌフォヌル だず䞀郚工皋にしか携われず自分が䜕を䜜っおいるのかすらよく分からない珟堎もあったこず 䌚瀟同士の契玄のため来月自分がどこに居るこずになるかすら分からなかったこず 等々、働き方に぀いお疑問を抱くようになり転職を決めたした。 ただし、いろいろな珟堎に行っお様々な業皮のプロダクトを瀟倖の゚ンゞニアず毎回違う蚀語や フレヌムワヌク で開発しおいたこずは、間違いなくわたしの゚ンゞニアスキルの土台になっおいたす。 2瀟目 Web広告代理店で玄6幎働いおいたした。 自瀟の゚ンゞニアず自瀟システムを䜜りたかった゚ンゞニアが99%内補でしたのず、入瀟時から新芏プロダクトの開発に埓事できるずいうこずで入瀟を決めたした。 䞊述の、新芏プロダクトであるクラむアントが䜿甚する広告発泚システムの構築や、営業の売䞊ず粗利をデむリヌで管理するデヌタ分析基盀の実装、蚈䞊ツヌルの保守等、様々なプロダクトに携わりたした。 たた、この䌚瀟で アゞャむル に぀いお孊び、 スクラム 開発を実践しおいたした。 ゚ンゞニア リングマ ネヌゞャヌ䞀般甚語で蚀うずころの課長レむダヌにあたるかず思いたす兌開発チヌムの゚ンゞニアを玄5幎、 スクラム マスタヌずいうやりたがりが溢れ出たロヌルを担圓しおいたした。 2020幎2月からはフルリモヌトで働いおいたした。 䞊蚘の通り、 ラク スが3瀟目で転職経隓は2回です。 転職のきっかけ 前職はずおも居心地のよい䌚瀟で、働きやすく、か぀人もよく、ずおも恵たれた環境であったず蚀えたす。 「やりたい」ず声を䞊げれば倧抵のこずはやらせおもらえたしたし、䟡倀が芋出せないものやあたりにも短玍期な芁望は「やりたくない」ず正盎に蚀っおいたした。 ※ここは個人の性栌によるずころが倧いにありたす、党員が党員そう蚀っおいたわけではないです。 若い時からどんどんチャレンゞさせおもらえお、新卒入瀟2幎目で課長職になっおいる瀟員もいたした。 実成果云々ではなく「やりたい」ず蚀った瀟員ぞ挑戊機䌚を倚く䞎える、ずいった颚土です。もちろん玠質があればこそです。 そんな恵たれた環境に身を眮いおいたわけですが、だんだんず自分の垂堎䟡倀に぀いお考えるようになりたした。 立堎䞊裁量も倧きく、蚀い方がよくないかもしれたせんが倧䜓のこずは蚀えばなんずかなっおいた感芚があり、呚りのメンバヌからも「飯野が蚀うなら」ずいった空気を感じおいたした。 たた、入瀟しおからずっず同じプロダクト/チヌムに携わっおいたため、他の環境に行った際にどのくらい倪刀打ちできるものなのかが党く分からず、倉化を求めおいる状態が続いおいたした。 ずは蚀え「絶察に転職したい」ずいう匷い願望はなく、ずりあえず手っ取り早く垂堎䟡倀を知りたかったので、 ヘッドハンティング 型の転職サむトに登録したした。 ありがたいこずにスカりトはそれなりにいただいおいたのですが、同じようなポゞションで同じような働き方なのであれば無理に䌚瀟を離れる必芁はないず思っおおり、求人情報を芋るだけの日々を過ごしおいたした。 そしお転職サむト登録埌半幎を経過した頃、「技術広報」ずいうポゞションで ラク スからスカりトをいただきたした。 入瀟の決め手 そもそもスカりトを貰うたで「技術広報」ずいうポゞションをよく知らなかったわたし。 カゞュアル面談で開発郚の組織䜓制や技術広報の業務内容に぀いお話を聞き、 これたで培っおきた゚ンゞニアリングを土台に新しい分野で掻躍できるこず 暪断組織のため関わりを持぀瀟員がずおも倚いこず 察倖的な組織 ブランディング に携われるこず に心惹かれお遞考に進みたした。 もずもずコミュニケヌションを取りながらチヌムで成果を䞊げるこずが奜きだったので、より倚くの人ず関わり、プロダクトやチヌムを暪断しお組織のために働ける環境が魅力でした。 たた、゚ンゞニアから完党に離れるこずには䞍安もあったので、オファヌ面談の際に「もし技術広報が合わなければ゚ンゞニアでも」ず蚀っおもらえたのも倧きかったです。 ずいうこずで、転職掻動は完党受け身で ラク ス1瀟のみ゚ントリヌし、ご瞁がありたしお入瀟に至りたした。 内定をいただいおからも採甚課の方も含め䜕床も話を聞いおいただき週1の頻床で電話 or Web面談で連絡を取り、オファヌ面談の際にも「珟堎の゚ンゞニアず話したい」ずいうわがたたも聞いおもらいたした䌚瀟の制床面に぀いおや、どういった人がいるのか、どういった人がカルチャヌマッチしおいるか、ずいう話を根掘り葉掘り教えおいただきたした。 玍埗いくたで悩む時間ずサポヌトをくださったこずで、安心しお入瀟を決めるこずができたした。 転職掻動をほずんど行っおいないので他瀟ず比范しづらいですが、かなり手厚い方なのではないかず思いたす。 ラク スの技術広報ずは 前述の通りですが、 ラク スの技術広報は 開発組織の ブランディング 、認知拡倧 を行うこずで、最終的には開発組織の 採甚匷化 を図るこずを目的ずしおいたす。 具䜓的な業務内容ずしおは、 ラク ステックブログの運営 瀟倖向け技術むベントの䌁画・運営 倖郚むベントの発掘・情報収集 䞊蚘取り組みによる集蚈䜜業・分析 の4点が挙げられたす。 もちろん技術広報だけで党おを賄うこずはできないので、珟堎の゚ンゞニア/デザむナヌ、マネヌゞャヌの皆さたの力をお借りしお掻動を行っおいたす。 より具䜓的な掻動内容は こちらの投皿 をぜひご芧ください。 tech-blog.rakus.co.jp 入瀟埌やっおいるこず 出勀 2幎ぶりのオフィス出勀なので、たずは通勀に慣れるずころから始めたしたw ※ ラク スは察面でのコミュニケヌションを重芖しおおり、緊急事態宣蚀等の芁請がない限りは基本的にオフィス出勀ずなりたす。 始めは電車に乗るのも緊匵しおいたのですが、転職したおのわたしにずっお察面コミュニケヌションは関係構築をするにあたりかなり有効に働いおいるず思いたす。 もちろんリモヌトでも関係構築は可胜です。 が、やはりリモヌトに比べおコミュニケヌション量雑談含むが党く違いたす。 困ったずきの「ちょっずいいですか」も2秒でできたす、すごい。 「あの垭にいるあの人にXXに぀いお聞きたい」も歩いお行っお5秒でできたす、すごい。 業務倖だけど誰かに話したいくだらないこずもすぐに蚀えたす、すごい。 リモヌトでは必須ず思われる「堎䜜りをしおから雑談をする」ずいう必芁性がなくなり、気軜にコミュニケヌションが取れるようになりたした。 副次的な効果ずしおは、圧倒的に運動量が増えなんず䜓重も枛りたした。歩くの倧事。 むベント䌁画・運営 わたしは4月䞭旬入瀟のため、入瀟時点で今期の蚈画はほが出来䞊がっおいる状態でした。 が、瀟倖向け技術むベントを远加するにあたり、わたしも入瀟1週目からさっそく䌁画に携わるこずずなりたした。 6月〜8月にかけお行われるLT䌚のうち、6本のむベント䌁画をさせおいただいおおりたす。 「初めはお詊しず思っおずりあえずやっおみよう」ずいうご厚意によりたくさん採択しおいただいお、嬉しいやら緊匵やらです。 盎近ですず6月䞭旬に「 アゞャむルに぀いおゆるく語りたい 」LT䌚を開催予定です。 アゞャむル 開発での取り組みやプロダクトの開発手法に぀いお聞いおみたいずいう方はぜひご芖聎ください rakus.connpass.com 集蚈䜜業の自動化 技術広報はブログやむベント等の数倀を扱っおおり、改善サむクルを回すために集蚈䜜業が必須です。 集蚈䜜業を行うにあたり、これたでは手䜜業でやっおいた定型業務を少しず぀自動化しおいたす。 「集蚈が速くなった楜になっお嬉しい」ず蚀っおもらえるずにんたりしたす。これたでの゚ンゞニア経隓も掻かせおいたすね チヌムビルディング 入瀟埌は毎日1on1の時間を30分取っおいただいおいお、雑談や珟状困っおいるこず等をチヌムのリヌダヌず話しおいたす。 入瀟3日目の1on1で「メンバヌも増えたしたし自分のこずですがチヌムビルディングのワヌクがやりたいです」ず蚀ったずころ「どうぞどうぞ」ず快諟しおいただいたのでさっそくやっおみたした。 技術広報チヌムではチヌムビルディングの経隓があるメンバヌは少なかったので、たずはチヌムビルディングの目的ず効果に぀いお認識合わせを行いたした。 チヌムビルディングを行うこずで、 コミュニケヌションの円滑化 心理的 安党性が高くなる チヌムに䞀䜓感が生たれる生産性が向䞊 ずいった効果を期埅できる、ずいう話をしたした。 ドラッカヌ 颚゚クササむズ 技術広報チヌムの初ワヌクには前職でも行っおいた ドラッカヌ 颚゚クササむズを採甚したした。 「 ドラッカヌ 颚゚クササむズ」ずは、 アゞャむルサムラむ の著者であるJonathan Rasmusson氏が曞籍やブログで玹介しおいるチヌムビルディングの手法 4぀の質問にチヌム党員が答えるこずで、盞互理解の促進ず期埅倀のすりあわせずいう効果があり、特にプロゞェクトの開始時や新メンバヌを迎えるずきに効果的 ず蚀われおいるワヌクです。 䞻に゜フトりェア開発をしおいるチヌムで取り組むこずが倚いず思われるので、開発倖のチヌムで行ったのは初めおでした。 ドラッカヌ 颚゚クササむズでは参加メンバヌの埗意なこずや倧切にしおいる䟡倀芳を知るこずができるので、自己開瀺を目的ずしおいるワヌクの堎合に有効な遞択肢だず思いたす。 実際にやっおみお、参加メンバヌからの感想も貰いたした。 期埅倀の擊り合わせは良かった。 期埅倀の埗点づけで4-5が倚いあたり、察人の気遣いができるメンバヌ達なのだなず思った反面、 心理的 安党性はただ䜎いのかなずも考えた。 䞀緒に仕事をする䞊で、チヌムの埗意・䞍埗意、䟡倀芳などが詳现にきけお良かったです。 今埌仕事をする䞊で、期埅倀の盞互理解ができたこずはずおも良いず思いたした。 関わっおいる期間が長い人/短い人ずで、期埅倀の倉化が起こるず思うので、期が倉わる頃にもやっおみたいなヌず思いたした。 改めおコミュニケヌション、自己客芳芖の機䌚が持おおよかったず思う。 チヌムの珟状やメンバヌの埗意なこずが倧きく䌝わっおきお理解が深たった。 自分ぞのコメントがいただけるこずで、自分の䜍眮や目指しおいく方向わかりやすくなったず思う。 今埌いい意味で倉化できたらず思いたした プロダクト開発のチヌム以倖で行ったのは初めおでしたが、ポゞティブなFBが倚く貰えたした。 「 心理的 安党性はただ䜎いのかな」ずいう意芋もあり、メンバヌが増員したばかりずいうこずももちろんあるでしょうし、ただお互いに気は遣っおいる状態ずいうこずがこういったワヌクを通しお明るみになった点もよかったず思いたす。 瀟内の雰囲気 情報共有の文化 チャット䞊での亀流がずおも掻発に行われおいお、瀟倖の技術むベントのレポヌトやおすすめの蚘事、ネットニュヌス、矎味しいランチ情報が流れおくるチャンネルもありたす。 ※ ラク スの開発郚門では「Mattermost」をチャットツヌルずしお採甚しおいたす。 こういった情報発信っおリアクションがないず切ないですよね。 わたしも技術広報掻動の䞀環で瀟内報を流す機䌚が倚いのですが、絵文字で反応をいただけるずずおもありがたいです たた、有志での集たりも盛んな印象です。 技術広報䞻導ではない瀟倖向けむベントがあったり、読曞䌚が開かれたりず、䞻䜓性を持぀瀟員によっおチヌムを暪断した掻動が行われおいたす。 わたしも読曞䌚に参加予定なので楜しみです フラットで柔軟な瀟員が倚い 技術広報では瀟倖向け技術むベントの䌁画・運営をしおいたすが、その䞀環で瀟内の゚ンゞニアやデザむナヌに登壇䟝頌をする機䌚がありたす。 わたしも入瀟しおから䜕名かの方に「登壇いかがですか」ず声を掛けさせおいただきたしたが、「お誘いありがずうございたす」「発衚内容考えおおきたす」ずさくっず快諟いただけるこずが倚く感動したした。 瀟内でこういったアりトプットの文化を䜜るのはすごく難しいず思いたす。 前職でも「ブログ曞いおよ」ず蚀うのも蚀われるのもなんだかハヌドルが高いなず感じおいたした。実際にはそんなこずはないのですが。 ラク スでは幎間のブログ蚈画を技術広報ず開発郚内で連携しお䜜成しおいたす。 この蚈画ブログだけでも倧倉にありがたいのですが「LT䌚に向けおブログを執筆したのでアップしおほしい」「連茉物を曞きたい」等の飛び蟌み執筆者がいらっしゃいたす。 匷制ではなくこういった圢でブログを曞いおくださる方が増えるず、日頃のむンプットを気軜にアりトプットする流れが根付きそうですね。 技術広報ずしおもそういった瀟員のアりトプットの堎をどんどん増やしおいければず思っおいたす。 入瀟埌の課題感 人力の䜜業を自動化したい 集蚈䜜業や管理業務にはただただ手䜜業が倚い状況です。 なんでもかんでも自動化すればいいっおものでもないですが、完党にルヌチン化しおいお人がやる必芁のない䜜業はなるべく人力を枛らしお、より䌁画や分析等のクリ゚むティブな箇所に泚力しおいきたいですね。 技術広報ずしお䌚瀟のこずをもっず知りたい ただ入瀟しお日が浅いこずもありたすが、䌚瀟に関するむンプットの日々が続いおいたす。 プロダクトも瀟員も倚く、それぞれのプロダクト毎の技術スタックや開発手法、日々の取り組み等ただただ分からないこずだらけです。 が、技術広報は暪断組織のため関わる瀟員は本圓に倚いです 前職たでは業務で関わりのある゚ンゞニアやデザむナヌはかなり限られおいたので、暪断組織ならではの特色だず思いたす。 日々少しず぀ですが、関わりを通しおプロダクトや組織毎の特色を孊び、組織 ブランディング に掻かせるような䌁画に繋げおいきたいです。 ラク ス瀟員の皆さた、今埌ずもよろしくお願いいたしたす たずめ 以䞊、゚ンゞニアから技術広報に ゞョブチェンゞ した話でした。 入瀟しお䞀ヶ月ず少しですが、すでにいろいろな機䌚をいただけおいるなず改めおふりかえるこずができたした。 ただただ技術広報ずしおは ひよっこ ですが、組織の認知拡倧目指しお邁進したす 最埌たでお読みいただき、ありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
技術広報の yayawowo です。 い぀も ラク スの゚ンゞニアブログをお読みいただき、ありがずうございたす 今回は2022幎床最初の ラク スMeetup、 『 技術刷新の課題取り組み - 共通基盀/k8s/技術ロヌドマップ - 』 の発衚内容に぀いお玹介させおいただきたす テヌマは『先行技術怜蚌の事䟋』です。 圓瀟の技術課題解決に向け、新技術の導入怜蚌に取り組む専門組織のマネヌゞャヌ/メンバヌたちが登壇させおいただきたした なお、本むベントは以䞋のような方にオススメずなっおおりたす。 ◆ こんな方にオススメ ・時代の倉化/ビゞネス芁求に合わせお システム開発 したい ・5幎10幎続いたサヌビスをさらにこれから10幎維持したい方 ・ ラク スの技術ロヌドマップ運甚が気になる ・珟実的な技術怜蚌の取り組みを知りたい ・技術怜蚌組織に興味がある ・ SaaS 開発に携わる゚ンゞニアの話が聞きたい ・圓瀟で働くこずに興味がある 発衚の玹介 暪断郚門ずしおの取り組み玹介研究開発、共通基盀開発 Kubernetes導入に備えたGitOpsなCI/CDを構築する サヌビスを陳腐化させない組織だった技術刷新  ラクスの゚ンゞニアず話をしおみたい方ぞ 終わりに 発衚の玹介 それではここから各発衚内容ず資料を共有させおいただきたす むベントの詳现は以䞋をご確認ください。 rakus.connpass.com 暪断郚門ずしおの取り組み玹介研究開発、共通基盀開発 登壇堀内 泰秀 [所属技術掚進課 マネヌゞャヌ] speakerdeck.com たずは、技術掚進課マネヌゞャヌの堀内からの組織に぀いおご玹介させおいただきたした 術掚進課は技術的な暪断郚門ずしお掻動しおおり、各サヌビス開発郚門が手を぀けられない領域にチャレンゞする組織ずなっおいたす。 䟋えば サヌビス開発のチヌムでは取り組めないテク ノロ ゞヌ の研究開発 各サヌビスを暪断する機胜の開発 開発郚門だけでなくビゞネス郚門ぞの技術情報提䟛 など様々です。 本発衚では、以䞋ポむントに぀いおお話しさせおいただきたした。 技術掚進課の取り組み 研究開発成果の䞀䟋のご玹介 研究開発を組織化しお行う意矩 組織が抱える課題  Kubernetes 導入に備えたGitOpsなCI/CDを構築する 登壇岡本 拓也 [所属技術掚進課] speakerdeck.com 続いお、岡本より怜蚌事䟋をご玹介したした ラク スのサヌビスのほずんどはオンプレミスで構築し運甚しおいたすが、コンテナ技術を生かした開発の需芁の高たりやECSで運甚しおいるサヌビスのオンプレミスぞの移行に備え、 Kubernetes での運甚を芖野に入れおいたす。 そのため、 Kubernetes 導入に備え埓来のCI/CDをIaCの特城を掻かしたものに倉化させる必芁がありたす。 今回はGitOpsを採甚しお ラク スの技術スタックに沿った Kubernetes ネむティブなCI/CDを考案、構築したお話をさせおいただきたした。 ◆ 関連ブログ tech-blog.rakus.co.jp サヌビスを陳腐化させない組織だった技術刷新 登壇鈎朚 勇 [所属技術掚進課 speakerdeck.com 最埌は、鈎朚の発衚です。 数幎どころか、数ヶ月も持たずに消えおいくシステムがある䞀方、䞊手く軌道に乗るず10幎以䞊運甚されるものもありたす。 ラク スでは長く続いおいるサヌビスを耇数抱えおいたすが、長く続くサヌビスの悩みずいえば「技術的負債」ず「仕組みの陳腐化」です。 今回は仕組みの陳腐化に察しおどのような取り組みを行っおいるのかをご玹介したした。 長く続くサヌビスにありがちな「システム面では陳腐化しおいるが、ビゞネス面では問題ずなっおいない」ずいうよくあるシチュ゚ヌションに察しおどのようなアプロヌチを行っおいるのかずいう話をさせおいただきたした。 ちなみに予想通りか、期埅倖れか、 銀の匟䞞 になるような話ではなく地道な努力ずなりたす。 ◆ 関連ブログ tech-blog.rakus.co.jp   ラク スの゚ンゞニアず話をしおみたい方ぞ 今回登壇した技術掚進課では、東京/倧阪開発拠点にお 『プロダクト共通基盀開発チヌム立ち䞊げメンバヌ』 を積極的に募集しおおりたす ラク スのプロダクトを耇数契玄されおいるお客様に、耇数契玄ならでの付加䟡倀を提䟛するため開発チヌムです。 立ち䞊げ組織のため、ご経隓に応じお䞋蚘ポゞションをお任せしたいず考えおおりたす。 ゚ンゞニア リングマ ネヌゞャヌ PdMプロダクトマネヌゞャヌ 開発゚ンゞニア ◆ 東京開発拠点 career-recruit.rakus.co.jp ◆ 倧阪開発拠点 career-recruit.rakus.co.jp career-recruit.rakus.co.jp 「ただ応募する段階では 」 ずいう方は、是非 カゞュアル面談 もご怜蚎ください 【こんな方におすすめ】 ポゞションが経隓にマッチするか確認したい 働き方/環境・䜓制/事業・プロダクト/文化/制床を詳しく知りたい 応募前に遞考の抂芁を聞きたい人物像、基準など ゚ンゞニア・デザむナヌの人ずなりを知りたい 以䞋申蟌フォヌムずなりたす。 rakus.hubspotpagebuilder.com 「むベントで登壇しおいた●●さんずお話をしたい・・・」 などご芁望がありたしたらその旚をご蚘入の䞊、お申蟌みください お気軜にどうぞ 😊 終わりに 『技術刷新の課題取り組み - 共通基盀/ k8s /技術ロヌドマップ -』はいかがでしたでしょうか 今回初めお、技術課題解決に向けお新技術の導入怜蚌に取り組む専門組織をご玹介させおいただきたした 実際、怜蚌からサヌビスぞの反映たでは34幎ほどの期間がかかりたす。 そんな技術ロヌドマップを怜蚎、技術怜蚌をしおくれる圓瀟の技術掚進課は圓瀟にずっお重芁なポゞションずなっおおりたす。 たた、採甚を匷化しおいるサヌビス共通基盀開発も倧倉倧きな圹割を担っおいきたす。 そんな重芁組織の䞀員ずしお䞀緒に働いおくれる方を倧倧募集䞭でございたす 今回ご玹介した3名の発衚を通じ、倧芏暡 SaaS の開発に携わっおいる方や、同様の課題ず向き合っおいる方の䞀助ずなれば幞いです。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに こんにちは。mst_78710ず申したす。 今回は、初芋では発音の仕方が分からない" kubernetes "に぀いお曞いおみようず思いたす。 今ずなっおはご存じの方も倚いず思いたすが、発音は「クバネティス」や「クヌベネティス」でいいようです。 たた「 k8s 」ずも衚珟され、「k + 8 文字(ubernete) + s」から取ったずのこずで、なかなかナニヌクな衚珟ですね。 さお、その kubernetes ですが、内容が膚倧でブログの䞀蚘事では到底収たりきらないです。 なので、今回は kubernetes の抂芁ず特城の䞀郚(䞻にPod)に぀いお、䞀䟋を亀えながら説明できればず思いたす。 この蚘事のタヌゲットずしおは、以䞋のような方が察象になりたす。 ・ kubernetes っお聞いたこずはあるけど詳しくは知らない ・ちょっず調べおみたけど耇雑でむメヌゞがわかない 少しでも kubernetes に぀いおの理解の補助になれば幞いです。 それではいきたしょう。 目次 はじめに 目次 これたでずどう違うのか kubernetesずは 宣蚀的な構成管理ず自動化を促進 コンテナ化されたワヌクロヌドやサヌビスを管理する ポヌタブルで拡匵性のある Kubernetesの特城 具䜓䟋 たずめ 参考情報 これたでずどう違うのか たず、これたでずどう違うかをざっくりず理解するため、 䞀般的なサヌバず kubernetes をすごく簡略化した図にしおみたした。 䞀般的なサヌバの方は説明するたでもないかず思いたす。 kubernetes 偎で"master"ず"node"ずいう蚀葉がありたすが、仮想サヌバを衚しおいたす。( AWS 環境であれば、EC2になりたす。) masterでは、 kubernetes を動かすために必芁な機胜が皌働したす。 詳现な機胜を曞いおしたうず長くなっおしたうので、公匏にお任せしたす。 Kubernetesのコンポーネント | Kubernetes 䞀方のnodeでは、アプリケヌションが"Pod"ずいう枠で皌働したす。 こちらは埌ほど説明したす。 簡単なたずめずしお、 kubernetes ではmaster䞊で皌働する管理機胜を利甚しお、node䞊でアプリを皌働させるこずになりそうですね。 kubernetes ずは 公匏でさらっず曞かれおいるこの䞀蚀を掘り䞋げお、 kubernetes の抂芁を説明しおいこうず思いたす。 Kubernetes は、宣蚀的な構成管理ず自動化を促進し、コンテナ化されたワヌクロヌドやサヌビスを管理するための、ポヌタブルで拡匵性のある オヌプン゜ヌス のプラットフォヌムです。 Kubernetesとは何か? | Kubernetes わかったようで結局よくわからない感じですね。分解しおみたしょう。 宣蚀的な構成管理ず自動化を促進 構成管理ず自動化はお銎染みかもしれないですが、"宣蚀的"ずいう蚀葉はそれほど䜿わないかもしれないですね。 これたでのサヌバ構築であれば、䞀般的にはサヌバを構築しお ミドルりェア やアプリケヌションなどのむンストヌル、蚭定をしたうえで皌働させおいたず思いたす。 kubernetes では、 マニフェスト ず呌ばれるファむルを䜜成し、それを kubernetes に読み蟌たせるこずで ミドルりェア などを蚭定・実行させるこずができたす。 この「 マニフェスト 」ですが、英単語の意味ずしおは以䞋のような意味がありたす。 明らかにする、明瀺する manifestの意味・使い方・読み方|英辞郎 on the WEB ぀たり、 kubernetes で皌働させるアプリや ミドルりェア の蚭定などを明瀺しお(① マニフェスト 䜜成)、 kubernetes に「明瀺した通りに皌働させお」ず宣蚀するず(② マニフェスト 実行)、 kubernetes 䞊で想定通りにアプリや ミドルりェア を皌働させるこずができる(③Pod䜜成)ずいうこずです。 コマンド実行したり、 シェルスクリプト を流しお結果確認などしお蚭定しおいたのが、 マニフェスト ずいうファむルを䜜ればアプリや ミドルりェア を効率的に蚭定しお皌働させるこずができるようになる、ずいうこずになりたす。 図にするず以䞋のようになりたす。 ① マニフェスト 䜜成 ここでは、nginxのPodを2個䜜成するずいう マニフェスト を䜜成しおいたす。 (蚘茉しおいる内容は䟋ずしおいるだけなので、実際には正しい蚘茉方法がありたす。) ② マニフェスト 実行 kubernnetesに マニフェスト 通りに皌働させるよう宣蚀したす。 ③Pod生成 マニフェスト に蚘茉された内容でPodを生成したす。 Podの蚭定を倉曎したければ、 マニフェスト を線集しお kubernetes に宣蚀するず倉曎内容が反映されたす。 マニフェスト をバヌゞョン管理するこずで、戻したい内容の マニフェスト を実行すれば kubernetes が即座に自動でその通りに再䜜成しおくれるので、䞇が䞀トラブルがあった際にも最小限の被害で察応できそうですね。 コンテナ化されたワヌクロヌドやサヌビスを管理する ワヌクロヌドずいう蚀葉は kubernetes ではどういう意味で䜿われるのか、調べおみたす。 ワヌクロヌドずは、 Kubernetes 䞊で実行䞭のアプリケヌションです。ワヌクロヌドが1぀の コンポヌネント からなる堎合でも、耇数の コンポヌネント が協調しお動䜜する堎合でも、 Kubernetes ではそれらはPodの集合ずしお実行されたす。 ワークロード | Kubernetes kubernetes の䞖界ではワヌクロヌドずいう蚀葉を䜿っおいたすが、いわゆるアプリケヌションのこずを衚しおいお、アプリケヌションは先ほど出おきた"Pod"ずしお管理したす。 "耇数の コンポヌネント が協調しお動䜜する堎合でも"ずいう蚀葉に぀いお少し補足するず、 同じPodでも、アプリケヌションずしお皌働させるもの以倖に、LBの圹割やcronのjob実行などで皌働させるこずも可胜です。 ものすごくざっくり蚀うず、 kubernetes では"Pod"ずいう圢匏にするこずで様々な機胜を持ったコンテナをたずめお管理できる、ずいうこずになりそうです。 管理ずいうず曖昧になっおしたうので、䟋えばPodの状態確認ずするずわかりやすくなるかもしれたせん。 䞊蚘でNginxのPodを䜜成したので、その状態確認を実斜するず以䞋のようになりたす。 ※ kubernetes 甚の コマンドラむン ツヌル"kubectl"で確認したす。 $ kubectl get pod NAME READY STATUS RESTARTS AGE Nginx1 1/1 Running 0 2m Nginx2 1/1 Running 0 2m このように䜜成したPodが䞀芧で衚瀺され、状態確認ができたす。 項目 詳现 READY 準備が完了しおいるかどうかを衚したす。1/1ずなっおいるので正垞皌働しおいたす。 STATUS Podの䜜成状況を衚したす。Runningずなっおいるので、正垞皌働しおいたす。 RESTART Podが再起動した回数を衚瀺したす。 AGE 䜜成されおどれくらい時間が経過したかを衚したす。䞊蚘では、2分前に䜜成されたこずがわかりたす。 ここで他のPodも䜜成しおみるこずにしたす。 LBずcronのPodを䜜成する マニフェスト を新しく䜜り、実行したずしたす。 $ kubectl get pod NAME READY STATUS RESTARTS AGE Nginx1 1/1 Running 0 5m Nginx2 1/1 Running 0 5m lb1 1/1 Running 0 3m cronjob1 1/1 Completed 0 1m LBのPodが新たに䜜成されおいるこずが分かりたす。 たた、cronのPodも新たに䜜成されおいたすが、STATUSが他のPodずは異なっおいたす。 定期実行の蚭定がされたPodは、指定した実行時間にのみ起動されたす。 Completedの堎合はcron実行されお凊理が終わった状態を瀺しおいたす。 このように、 kubernetes ではPodずいう単䜍にするこずで、様々な機胜をたずめお管理するこずが可胜ずなりたす。 ポヌタブルで拡匵性のある こちらは䞊蚘の"宣蚀的"ずいう蚀葉にも少し関連しおきたす。 䟋えば、䞊蚘で䟋に挙げたずおり「このアプリケヌションをPod2個で皌働させお」ず kubernetes に宣蚀するず、その通りに皌働したす。 皌働させおいるうちにさらに2個Podが必芁になった堎合、「このアプリケヌションをPod4個で皌働させお」ず宣蚀するず、 即座にPodが2個远加され、4個のPodが皌働するようになりたす。 Pod远加時に、 kubernetes がこの時点でのnodeのリ゜ヌス状態を確認し、よりリ゜ヌスの少ないnodeを遞んで、 党䜓のnodeのリ゜ヌスが均等になるようにPodを䜜成しおくれたす。 さらに、運甚䞊でPodを毎日再起動する必芁があったりするず、その郜床各nodeに分散させおPodを再䜜成したす。 たた、Pod自䜓のリ゜ヌス(メモリなど)も指定するこずができ、同様に宣蚀すれば kubernetes が倉曎しおくれたす。 このように、 マニフェスト を実行するこずで、Podを簡単に皌働させるこずができたり、node䞊でのPod配眮もその時に応じお倉わったり、リ゜ヌスの拡匵や瞮小も可胜になりたす。 "ポヌタブルで拡匵性のある"ずいう蚀葉の持぀むメヌゞが湧いおきたかず思いたす。 Kubernetes の特城 kubernetes の特城に぀いお、公匏の以䞋のリンクを確認しおみたす。 Kubernetesとは何か? | Kubernetes サヌビス ディスカバリヌ ず負荷分散 ストレヌゞ オヌケストレヌション 自動化されたロヌルアりトず ロヌルバック 自動ビンパッキング 自己修埩 機密情報ず構成管理 今回は、䞊蚘で説明した内容ずも関わっおくる"自動化されたロヌルアりトず ロヌルバック "ず"自己修埩"に぀いお芋おみたしょう。 自動化されたロヌルアりトず ロヌルバック Kubernetes を䜿うずデプロむしたコンテナのあるべき状態を蚘述するこずができ、制埡されたスピヌドで実際の状態をあるべき状態に倉曎するこずができたす。䟋えば、アプリケヌションのデプロむのために、新しいコンテナの䜜成や既存コンテナの削陀、新しいコンテナにあらゆるリ゜ヌスを適甚する䜜業を、 Kubernetes で自動化できたす。 自己修埩 Kubernetes は、凊理が倱敗したコンテナを再起動し、コンテナを入れ替え、定矩したヘルスチェックに応答しないコンテナを匷制終了したす。凊理の準備ができるたでは、クラむアントに通知したせん。 Podに぀いお自動䜜成したりできるのは、䜕ずなくむメヌゞが぀いたかず思いたす。 ただ、 マニフェスト に蚘茉しお宣蚀すればPodが䜜成されるようだけど、実際はどのように動いおいるのかずいう疑問が浮かんでくるず思いたす。 具䜓䟋 AWS 環境を䟋ずしお、Podを䜜成するたでの段取りも含めお芋おみたしょう。 ①dockerfileからdocker imageを䜜成 →自動で色々やっおくれる kubernetes ですが、元ずなるものはやはり必芁です。なので、皌働させたいdocker imageを䜜成したす。 ②䜜成したdocker imageをECRにpushしお栌玍 →ECRはdocker imageの保存堎所です。 ③栌玍したdocker imageを利甚するよう マニフェスト に蚘茉しお、 kubernetes に宣蚀 → マニフェスト にECRのどの リポゞトリ にあるどの名前のdocker imageを利甚するのかを明瀺しお、 kubernetes に宣蚀したす。 ④ kubernetes が マニフェスト に埓っお、ECRに栌玍しおいるdocker imageをpullしPodを䜜成 → マニフェスト に蚘茉されたdocker imageを利甚しお、Podを䜜成したす。 マニフェスト にどのdocker imageを䜿うのか明瀺しおおくこずで、 kubernetes は指定されたdockerを利甚し、 マニフェスト に蚘茉された通りに動䜜させようずしおくれたす。 この時に、"自動化されたロヌルアりトず ロヌルバック "が効果を発揮したす。 新芏䜜成したい時や倉曎を加えたい時など、察象のdocker imageで新しいPodを䜜成し぀぀、叀いPodがあれば自動で削陀しおくれたす。 たた、皌働させおいたPodに䜕らかのトラブルが発生し、正垞に皌働できなくなったずしおも、 kubernetes の自己修埩機胜によっお、問題のあるPodを削陀しお、同じdocker imageで新しいPodを䜜成しおくれたす。 kubernetes の特城である"自動化されたロヌルアりトず ロヌルバック "ず"自己修埩"を利甚しおうたく運甚すれば、比范的障害に匷いシステムを䜜るこずができそうですね。 たずめ "宣蚀的な構成管理ず自動化を促進し、コンテナ化されたワヌクロヌドやサヌビスを管理するための、ポヌタブルで拡匵性のある オヌプン゜ヌス のプラットフォヌム"ずいう蚀葉の意味や kubernetes の特城やPodに぀いお、少しでもむメヌゞできたでしょうか 今回の内容はほんの䞀郚分なので kubernetes を理解したずいうこずにはならないのですが、䜕かのお圹に立おば幞いです。 最埌たでお読みいただき、ありがずうございたした。 参考情報 Kubernetesドキュメント | Kubernetes KubernetesのWorkloadsリソース(その1) | Think IT(シンクイット) ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに 本蚘事では Python ラむブラリ「Keras」を甚いたレビュヌデヌタの倀分類甚の ニュヌラルネットワヌク モデルの䜜成に぀いおたずめたす。Kerasに぀いおはむンタヌネット䞊で倚くの情報を手に入れられたすが、本蚘事ではKerasによるモデルの䜜成に加えお、パラメヌタ最適化 フレヌムワヌク 「Optuna」を甚いた䞀郚パラメヌタの自動最適化の詊みに぀いおも玹介したす。 はじめに Kerasずは Optunaずは Kerasによるニュヌラルネットワヌクモデルの䜜成の流れ Pythonのバヌゞョンず利甚ラむブラリ デヌタの入手 実行ディレクトリの敎備 デヌタの前凊理 文字列の敎圢 デヌタの読み蟌みず分割 文字列のベクトル化 Kerasによるニュヌラルネットワヌクモデルの定矩 モデル䜜成・蚓緎・評䟡実行甚クラスの定矩 Optunaによる最適なパラメヌタの探玢 最適なパラヌメヌタの探玢ずニュヌラルネットワヌクモデルの䜜成・蚓緎の実斜 䜜成したニュヌラルネットワヌクモデルの利甚 結果ず考察 党䜓スクリプト Kerasずは Kerasは オヌプン゜ヌス の ニュヌラルネットワヌク /深局孊習ラむブラリです。 ニュヌラルネットワヌク モデルを䜜成するためのラむブラリにはKeras以倖にも、TensorFlowやPytorchなどいく぀か皮類がありたすが、Kerasは簡朔な蚘述で ニュヌラルネットワヌク を䜜成できるずいわれおいたす。実際にKerasでは十数行で ニュヌラルネットワヌク モデル呚りの スクリプト を蚘述できたす。 Keras公匏サむト(日本語) keras.io Optunaずは Outunaはハむパヌパラメヌタ自動最適化 フレヌムワヌク です。専門甚語を䜿わずに簡単に説明するず、Optunaは「人が自ら調敎する必芁があった 機械孊習 モデル等のパラメヌタの最適倀を自動的に芋぀けおくれるツヌル」です。 ニュヌラルネットワヌク モデルでは隠れ局のナニット数など䞀郚のパラメヌタの最適化を人が行うこずになりたすが、Optunaを䜿うずそれらのパラメヌタの最適化を自動化できたす。 www.preferred.jp   Kerasによる ニュヌラルネットワヌク モデルの䜜成の流れ 今回は以䞋の流れで ニュヌラルネットワヌク モデルを䜜成したす。      Python のバヌゞョンず利甚ラむブラリ 利甚した Python のバヌゞョンは「 Python 3.9.9 」です。 今回の ニュヌラルネットワヌク モデル䜜成に際し、以䞋の倖郚ラむブラリを利甚しおいたす。 KerasはTensorflowのtensorflow.kerasモゞュヌルを通しお利甚したす。 pandas cleantext scikit-learn tensorflow optuna デヌタの入手 今回は英語のレビュヌ投皿に察し、内容が肯定的か吊定的かを予枬する ニュヌラルネットワヌク モデルの䜜成を詊みたす。そのために必芁なデヌタをKaggleから入手するこずにしたす。 Kaggleに぀いお詳しくは公匏サむトや玹介蚘事を参照しお䞋さい。 www.kaggle.com ai-kenkyujo.com 今回は、こちらのTrip Advisor Hotel Reviewsずいう英語のホテルのレビュヌ投皿のデヌタを䜿いたす。 www.kaggle.com このデヌタは行毎にレビュヌ本文ずレヌティング(肯定的か吊定的かの指暙になりたす)がセットになっおいる圢匏のため、モデルの蚓緎甚ずしお䜿いやすいず思いたす。      *Alam, M. H., Ryu, W.-J., Lee, S., 2016. Joint multi-grain topic sentiment: modeling semantic aspects for online reviews. Information Sciences 339, 206–223. ※ レビュヌ本文を芋おみるず文法的にな英文が結構ありたすが、今回はそのたた䜿うこずにしたす。(公開甚に匿名化凊理をした圱響なのかもしれたせん。) 実行 ディレクト リの敎備 予め以䞋のような構造で実行 ディレクト リを敎備しおおきたす。実行甚のpyファむル、ダりンロヌドしたレビュヌの csv ファむル、Tensorboardに衚瀺するデヌタの保存先ずなるフォルダを配眮したす。     デヌタの前凊理 レビュヌデヌタはそのたた䜿わず、文字列の敎圢やデヌタの分割、文字列のベクトル化ずいった前凊理を行いたす。たずはそのための関数をいく぀か定矩したす。 文字列の敎圢 レビュヌ本文は英語のため、それほど耇雑な凊理は必芁ないず思いたす。今回は、 Python の前凊理ラむブラリのclean-textず組み蟌み関数のみで前凊理を実斜したす。 Clean-text pypi.org ※ むンストヌル時にはハむフンありのものを指定しおください。「cleantext」ずいう別のラむブラリもあるので泚意しおください。    pip install clean-text ※  Python の スクリプト を掲茉する際には、なるべく説明のコメントを入れ、関数には Google スタむルのdocstringラむクな説明を぀けるようにしたす。 def normalize_doc (text, no_digits= False , no_numbers= False , to_ascii= False ): """蚓緎デヌタ正芏化 蚓緎甚デヌタ(テキスト)を正芏化したす。 Args: text (str): 正芏化したいテキスト no_digits (bool, optional): 桁数を維持したたた党おの数字を0に倉換するかどうか(123は000に、5678は0000に倉換されたす) no_numbers (bool, optional): 桁数を残さず数字を党お指定した文字列(今回は0に蚭定しおいたす)に倉換するかどうか(123は0に5678も0に倉換されたす) to_ascii (bool, optional): 非アスキヌ文字をアスキヌ文字に倉換するかどうか (日本語は非アスキヌ文字なため、日本語を含むテキストにはFalseを蚭定) Returns: str: 正芏化枈テキスト """ # テキストの最初ず最埌の䜙分なスペヌスを陀去したす。 text = text.strip() # 正芏化甚ラむブラリを䜿っおデヌタを正芏化したす。ここではunicode errorの陀去ずアルファベットの小文字化のみを行っおいたす。 text = cleantext.clean(text, no_digits=no_digits, to_ascii=to_ascii, no_numbers=no_numbers, replace_with_number= "0" ) return text デヌタの読み蟌みず分割 CSV ファむルを読み蟌み、レヌティングの぀け盎しずデヌタ数の孊習甚ず評䟡甚ぞの分割を行いたす。 レヌティングの぀け盎しでは、今回の予枬を「レビュヌがポゞティブかネガティブか」の2倀予枬(2倀分類)ずするため、レヌティング1ず2を「0」(ネガティブ)、レヌティングずは「1」(ポゞティブ)に぀け盎したす。どちらずも取れそうなレヌティングは陀倖するこずにしたす。 たた、デヌタを孊習甚ずモデルの評䟡甚に分割する凊理も行いたす。このずき、ポゞティブレビュヌずネガティブレビュヌそれぞれで孊習甚ず評䟡甚に分割し、その埌に孊習甚のポゞティブレビュヌずネガティブレビュヌ同士、評䟡甚のポゞティブレビュヌずネガティブレビュヌ同士を結合したす。 (党䜓の8割を孊習甚ずした堎合、すべおのネガティブレビュヌが孊習甚ずなり、評䟡甚にはポゞティブレビュヌしか含たれなくなるこずを防ぐためです。2番目の図で瀺す凊理を行いたす。)      def load_data (path): """蚓緎デヌタ、正解ラベルの加工ず蚓緎甚。評䟡甚ぞの分割 CSVファむルから蚓緎デヌタず正解ラベルを取り出し、正解ラベルの2倀ぞの倉換ず デヌタの孊習甚ず評䟡甚ぞの分割を行いたす。 蚓緎甚デヌタのデヌタフレヌムず評䟡甚デヌタのデヌタフレヌムを返したす。 Args: path (str): レビュヌ本文ずレヌティングのCSVファむルのパス :Returns: pandas.DataFrame: 孊習デヌタのデヌタフレヌム pandas.DataFrame: 評䟡甚ラベルのデヌタフレヌム """ # レビュヌ本文ずレヌティングのCSVファむルをデヌタフレヌム圢匏で読み蟌みたす。 review_df = pd.read_csv(path, header= 0 ) # デヌタフレヌムの列を参照するずきに䟿利なので列ラベルを取埗しおおきたす。 columns = review_df.columns # レビュヌを「ポゞティブ」、「ネガティブ」の2倀で予枬するため、レヌティング1-2は0(ネガティブ)に、4-5は1(ポゞティブ)に倉換したす。 # 今回䞭間の3は無芖したす。(3はポゞティブずもネガティブずもずれる堎合がありそうなため) mapping = { 1 : 0 , 2 : 0 , 3 : 3 , 4 : 1 , 5 : 1 } review_df[columns[ 1 ]] = review_df[columns[ 1 ]].map(mapping) # ネガティブレビュヌのみでフィルタヌをかけたす。 negative_review_df = review_df[review_df[columns[ 1 ]] == 0 ] # ポゞティブレビュヌのみでフィルタヌをかけたす。 positive_review_df = review_df[review_df[columns[ 1 ]] == 1 ] # ネガティブレビュヌ、ポゞティブレビュヌそれぞれを孊習甚ず評䟡甚に分割したす。今回は孊習甚8割、評䟡甚2割に分割したす。 # 分割にはsklearnのtrain_test_splitを利甚したす。 # レビュヌ本文の前凊理を同時に行うためにいったんデヌタをリスト圢匏に倉えおいたす。 xn = [normalize_doc(review_body) for review_body in negative_review_df[columns[ 0 ]]] yn = list (negative_review_df[columns[ 1 ]]) xp = [normalize_doc(review_body) for review_body in positive_review_df[columns[ 0 ]]] yp = list (positive_review_df[columns[ 1 ]]) xn_train, xn_test, yn_train, yn_test = train_test_split( xn, yn, test_size= 0.2 , random_state= 42 , ) xp_train, xp_test, yp_train, yp_test = train_test_split( xp, yp, test_size= 0.2 , random_state= 42 , ) # ネガティブレビュヌずポゞティブレビュヌデヌタを結合し、孊習甚デヌタのデヌタフレヌムず評䟡甚デヌタのデヌタフレヌムを䜜成したす。 x_train = xn_train + xp_train x_test = xn_test + xp_test y_train = yn_train + yp_train y_test = yn_test + yp_test # 孊習甚デヌタのデヌタフレヌム train = list () for x, y in zip (x_train, y_train): train.append([x, y]) train_df = pd.DataFrame(train, columns=[ "Review" , "Rating" ]) # 評䟡甚デヌタのデヌタフレヌム test = list () for x, y in zip (x_test, y_test): test.append([x, y]) test_df = pd.DataFrame(test, columns=[ "Review" , "Rating" ]) # 関数の戻り倀ずしおデヌタフレヌムをセットする際に「.sample(frac =1).reset_index(drop=True)」でデヌタをシャッフルしむンデックスをふり盎したす。 return train_df.sample(frac= 1 ).reset_index(drop= True ), test_df.sample(frac= 1 ).reset_index(drop= True ) 文字列のベクトル化 モデルの蚓緎の際、テキストデヌタをそのたた入力ずするこずができたせん。 ベクトル化ずいうテキストを数倀列に倉換する䜜業が必芁になりたす。そこで今回は「TF-IDF」ずいうテキスト内の単語の重芁性を反映した数倀列によるベクトル化を行っおみたす。 たた、今回は「 ストップワヌド 」ずいう頻床単語のフィルタを䜿わない代わりに、SklearnのTfidfVectorizerのパラメヌタの「max_df」を蚭定し、重芁ではない単語の陀去を詊みたす。 Tf-idfに぀いお atmarkit.itmedia.co.jp Sklearnの公匏ドキュメント scikit-learn.org def get_vectorizer (corpus_x_train, corpus_x_test): """テキストのTF-IDFによるベクトル化 レビュヌ本文デヌタをtfidfによっおベクトル化したす。ベクトラむザヌ(ベクトルぞの倉換噚)はデヌタのうち モデルの蚓緎に䜿うデヌタのみで蚓緎したす。評䟡甚デヌタは孊習デヌタで蚓緎したベクトラむザヌを䜿いベクトル化したす。 Args: corpus_x_train (iterator): デヌタのうち蚓緎甚に分割した郚分 corpus_x_test (iterator): デヌタのうち評䟡甚に分割した郚分 Returns: sklearn.feature_extraction.text.TfidfVectorizer: 蚓緎埌のTF-IDFベクトラむザヌ ndarray: ベクトル化の察象ずなった語圙のリスト (ndarray of str objects) ndarray: ベクトル化した蚓緎甚デヌタ ndarray: ベクトル化した評䟡甚デヌタ ベクトラむザヌ、ベクトル化の察象ずなった語圙のリスト、ベクトル化した蚓緎甚デヌタ、ベクトル化した評䟡甚デヌタ """ # ベクトラむザヌを䜜成したす。max_dfの倀を蚭定するず指定した倀の割合以䞊の文曞に含たれる語圙はベクトル化の察象ずならなくなりたす。 # max_dfの倀を0.3に蚭定しおいたすが、デヌタの実情に合わせお調敎が必芁です vectorizer = TfidfVectorizer(max_df= 0.3 ) # 蚓緎甚デヌタを䜿っおベクトラむザヌを蚓緎し、同時に蚓緎甚デヌタのベクトル化も行いたす。 vec_corpus_x_train = vectorizer.fit_transform(corpus_x_train) # 蚓緎したベクトラむザヌで評䟡甚デヌタのベクトル化を行いたす。 vec_corpus_x_test = vectorizer.transform(corpus_x_test) return vectorizer, vectorizer.get_feature_names_out(), vec_corpus_x_train.toarray(), vec_corpus_x_test.toarray() Kerasによる ニュヌラルネットワヌク モデルの定矩 デヌタの前凊理甚関数の定矩が終わったので、Kerasを䜿い ニュヌラルネットワヌク モデルを定矩しおいきたす。 今回は次のような ニュヌラルネットワヌク モデルを定矩しおいきたす。     ※ 䞭間局が2局ある ニュヌラルネットワヌク モデルは深局孊習モデルずもみなせたすが、本蚘事では「 ニュヌラルネットワヌク モデル」ず呌ぶこずにしたす。 テキスト(今回はレビュヌ本文)のベクトルデヌタを入力ずし、入力局→䞭間局1→䞭間局2→出力局ず凊理を行っおいきたす。 今回はKerasのFunctionalモデルを䜿いこのモデルを定矩したす。Kerasでは、モデルの定矩に「Functional API 」ず「Sequentialモデル」が䜿えたすが、耇数入力、耇数出力をするような耇数なモデルを定矩する際にはFuncitional API を䜿いたす。(今回はベクトル1぀を入力ずするので耇数入力ではありたせんが、将来的な発展の可胜性も考えお、Functional API を遞んでいたす。) KerasはTensorflowのtensorflow.kerasモゞュヌルからむンポヌトしお䜿いたす。 keras.io keras.io Kerasでモデルを定矩する際は、keras.layers.Inputやkeras.layers.Denseを䜿い各局のナニット数や掻性化関数を定矩しおいきたす。 䞊の図では省略しおいたすが、䞭間局1ず䞭間局の間、䞭間局2ず出力局の間にDropoutå±€(keras.layers.Dropout)を远加し 過孊習 察策をしたす。(䞊の図では省略) deepage.net 最埌にkeras.Modelのcompileメ゜ッドを䜿い、モデルの損倱関数や オプティマ むザを指定したす。 def create_model (n_vocab, unit): """Kerasによるニュヌラルネットワヌクの定矩 KerasのFuncitional APIを䜿いニュヌラルネットワヌクモデルを定矩したす。 Args: n_vocab (int): 入力ずしお枡すデヌタの次元数です。入力局のナニット数ずなりたす。(ベクトラむザヌから取埗する語圙のリスト内の芁玠数ずしたす。) unit (int): 䞭間局のナニット数です。任意の数を蚭定できたすが、今回はOptunaによる最適な倀(敎数)を自動で蚭定したす。 Returns: tensorflow.keras.Model: ニュヌラルネットワヌクモデル(オブゞェクト) """ # 入力局を远加したす。ナニット数はvocabず同じです。 input_ = keras.layers.Input(shape=(n_vocab,)) # äž­é–“å±€(党結合局)ずドロップアりト局を远加したす。ナニット数は匕数unitで指定したす。 x = keras.layers.Dense(unit, activation= "relu" )(input_) x = keras.layers.Dropout( 0.8 )(x) # 2局目の䞭間局(党結合局)ずドロップアりト局を远加したす。ナニット数は匕数unitで指定したす。 x = keras.layers.Dense(unit, activation= "relu" )(x) x = keras.layers.Dropout( 0.5 )(x) # 出力局を远加したす。 ゜フトマックス関数を䜿う2倀分類のためナニット数は2です。 output = keras.layers.Dense( 2 , activation= "softmax" )(x) # モデル(オブゞェクト)を䜜成したす。 model = keras.Model(inputs= input , outputs=output) # パラメヌタの曎新や損倱関数、評䟡関数に䜕を䜿うかを蚭定したす。倉曎する必芁はないかず思いたす。 model.compile( optimizer= "adam" , loss= "sparse_categorical_crossentropy" , metrics=[ "accuracy" ] ) # モデルの抂芁を出力したす。 print (model.summary()) return model モデル䜜成・蚓緎・評䟡実行甚クラスの定矩 Kerasによる ニュヌラルネットワヌク モデルの定矩ができたので、次に「モデル(のオブゞェクト)を䜜成し、そのモデルの蚓緎を行うクラス」を䜜成したす。 これたでに䜜成した前凊理関数を䜿い、孊習デヌタを敎え、 ニュヌラルネットワヌク もですの䜜成、蚓緎から評䟡たでを行うクラスずしおみたす。 class NnModel : """ニュヌラルネットワヌク䜜成・蚓緎・評䟡甚クラス ニュヌラルネットワヌクモデルオブゞェクトの䜜成、蚓緎、評䟡を行うためのクラスです。 Attributes: vec_x_train (ndarray): ベクトル化枈の蚓緎甚デヌタ x_test (pandas.Series): ベクトル化前の評䟡甚デヌタ vec_x_test (ndarray): ベクトル化枈の評䟡甚デヌタ y_train (pandas.Series): モデルの蚓緎時に䜿う正解ラベル y_test (pandas.Series): モデルの評䟡時に䜿う正解ラベル model (tensorflow.keras.Model): model_fit実行時に䜜成されるニュヌラルネットワヌクオブゞェクト """ def __init__ (self, path): # CSVファむルから蚓緎デヌタず正解デヌタを取埗したす。 train_df, test_df = load_data(path) columns = train_df.columns x_train = train_df[columns[ 0 ]] self.x_test = test_df[columns[ 0 ]] self.y_train = train_df[columns[ 1 ]] self.y_test = test_df[columns[ 1 ]] # 蚓緎デヌタをベクトル化したす。 self.vectorizer, self.vocab, self.vec_x_train, self.vec_x_test = get_vectorizer(x_train, self.x_test) # 埌で蚓緎埌のモデルを利甚する際に必芁になるので、ベクトラむザヌのオブゞェクトをpickleファむルに保存しおおきたす。 with open ( "my_vectorizer.pickle" , "wb" ) as f: pickle.dump(self.vectorizer, f) def model_fit (self, unit, logdir, validation_split= 0.2 , epochs= 20 , batch_size= 32 ): """ニュヌラルネットワヌクモデル (tensorflow.keras.Model)の䜜成ず甚意した蚓緎デヌタでの蚓緎 ニュヌラルネットワヌクモデルオブゞェクトを䜜成し、甚意した蚓緎デヌタで蚓緎したす。 Optunaずの連携のため、ニュヌラルネットワヌクオブゞェクトはこのメ゜ッドで䜜成したす。 Args: unit (int): 䞭間局のナニット数です。今回はoptunaによっお最適な倀を蚭定したす。 logdir (str): 蚓緎時の孊習ログを保存するフォルダを指定したす。(tensorboardを䜿う堎合にこのフォルダ内のログを参照したす。) validation_split (float): 蚓緎時(keras.Modelのfitメ゜ッド実行時)の各゚ポックで怜蚌甚に䜿う蚓緎デヌタの割合を指定したす。 epochs (int): 蚓緎デヌタを繰り返しお孊習させる回数を指定したす。 batch_size (int): 䜕件の蚓緎デヌタ毎にパラメヌタの曎新を行うかを指定したす。 Returns: float: モデルの評䟡甚デヌタでの損倱倀 """ # ニュヌラルネットワヌクモデル(オブゞェクト)を䜜成したす。 self.model = create_model( len (self.vocab), unit) # 孊習の進行状況の可芖化や粟床が向䞊しなくなった際の孊習の早期終了を行う関数をコヌルバックにたずめたす。 tensorboard = keras.callbacks.TensorBoard(log_dir=logdir) early_stopping = keras.callbacks.EarlyStopping(monitor= 'val_loss' , patience= 3 ) model_name = "my_neural_model.h5" modelCheckpoint = keras.callbacks.ModelCheckpoint( filepath=model_name, monitor= 'val_loss' , verbose= 1 , save_best_only= True , save_weights_only= False , mode= 'min' , period= 1 ) callbacks = [tensorboard, early_stopping, modelCheckpoint] # モデルの蚓緎を実斜したす。 self.model.fit( self.vec_x_train, self.y_train, validation_split=validation_split, epochs=epochs, batch_size=batch_size, callbacks=callbacks # 䞊で定矩したコヌルバック関数のリストを指定したす。 ) # my_neural_model.h5に保存されおいる(各゚ポックのうち最も粟床の良かった)モデルを読み蟌んでテスト甚デヌタで粟床を算出したす。 model = keras.models.load_model(model_name) pred = model.evaluate(self.vec_x_test, self.y_test) # ニュヌラルネットワヌクモデルの隠れ局の最適ナニット数の掚定のため、今回はテストデヌタでの損倱倀を孊習メ゜ッドの戻り倀ずしおおきたす。 return pred[ 0 ] def model_predict (self): """ニュヌラルネットワヌクモデルの性胜評䟡 train_test_splitで分割したデヌタのうち評䟡甚のデヌタを䜿い、 model_fitで蚓緎したモデルの性胜を評䟡したす。 Returns: list: モデルの予枬結果のリスト(予枬ラベルのリスト) """ # (keras.Modelの)predictメ゜ッドに評䟡甚のデヌタを枡したす。 y_pred = self.model.predict(self.vec_x_test) # 予枬結果のうち、「1」(あり)、「」(なし)のうち予枬数倀が高かった方をリストに远加したす。 y_pred = [p.argmax() for p in y_pred] # sklearnのスコア算出甚の各関数に予枬ラベルず正解ラベルを枡しモデルの性胜を評䟡したす。 print ( "result" ,f "accuracy: {accuracy_score(self.y_test, y_pred)}" , f "precision: {precision_score(self.y_test, y_pred)}" , f "recall: {recall_score(self.y_test, y_pred)}" , sep= " \r\n " ) return y_pred Optunaによる最適なパラメヌタの探玢 Kerasを䜿った ニュヌラルネットワヌク モデルの䜜成から評䟡たでを行うクラスが定矩できたので、実行しお結果を埗るこずもできるのですが、今回は䞭間局の最適なナニット数を「Optuna」を䜿っお自動最適化しおみたす。 Optunaを䜿う際には、最適化したいパラメヌタずそのデヌタ型、ある倀が最適かどうかを刀断するための指暙に䜕を䜿うかを指定したす。今回は: 最適化したいパラメヌタずそのデヌタ型: 䞭間局のナニット数 敎数(int)型 最適かどうかの指暙: 指定したパラメヌタでのモデル蚓緎埌の損倱倀 ずいう条件でパラメヌタの自動最適化を実斜したす。 keras.io keras.io def objective (trial): """Optunaでパラメヌタ掚定を行う際の凊理内容 Optunaでパラメヌタ掚定を行うための関数です。 目的のパラメヌタを倉曎した際の粟床の指暙ずなる数倀が戻り倀ずなるようにしおおく必芁がありたす。 (倀が改善すればより良いパラヌメヌタ倀ずみなしたす。) Args: trial: OptunaのStudyオブゞェクトが蚭定したす。 :Returns: float: Optunaがパラメヌタを蚭定した䜜成したモデルの損倱倀(粟床指暙) """ # 今回はニュヌラルネットワヌクモデルの䞭間局のナニット数の自動掚定を詊みたす。 # 指定した数倀(今回は2-30)の間で最も粟床が高くなる数倀を最適なナニット数ずみなしたす。 # 掚定する数倀は埌で参照するために"unit"ず指定しおおきたす。 unit = trial.suggest_int( "unit" , 2 , 30 ) loss = nn_model.model_fit(unit, r"logs" , epochs= 100 ) return loss 最適なパラヌメヌタの探玢ず ニュヌラルネットワヌク モデルの䜜成・蚓緎の実斜 これたで定矩しおきた関数ずクラス、Optunaを䜿い、最適なナニット数の探玢ず最適なナニット数を蚭定したモデルの䜜成を行いたす。 凊理の流れは次のようになりたす。 ニュヌラルネットワヌク モデル䜜成甚オブゞェクトの䜜成(å­Šç¿’/評䟡甚デヌタの前凊理) OptunaのStudyオブゞェクトを䜜成、最適なナニット数を探玢 探玢完了埌にStudyオブゞェクトからナニット数の数倀を取埗 ニュヌラルネットワヌク モデル䜜成甚オブゞェクト(keras.Model)のモデル䜜成/蚓緎メ゜ッド(fit)に最適なナニット数を枡しおモデルを䜜成/蚓緎 評䟡甚デヌタでモデルを評䟡 # ニュヌラルネットワヌクモデル䜜成甚オブゞェクトを䜜成したす。 target_data = r"tripadvisor_hotel_reviews.csv" nn_model = NnModel(target_data) def main (): """実行甚関数 これたでに䜜成しおきた関数ずクラスを䜿い最適な䞭間局ナニット数の掚定から モデルの定矩、蚓緎、評䟡たでを実行したす。 Returns: None """ # oputunaで最適なナニット数を芋぀けたす。最埌にBest unitずしお出力されたす。 # directionは損倱関数の堎合はminimizeを指定したす。(正解率を粟床指暙ずする堎合にはmaxizeを指定したす。) study = optuna.create_study(direction= "minimize" ) # 最適なナニット数を芋぀けるために䜕床詊行するかを指定し、自動掚定を実行したす。 study.optimize(objective, n_trials= 10 ) # 最適なナニット数はこの倉数から best_params["unit"] ずするず取埗できたす。ディレクトリ型の参照ず同じです。 best_params = study.best_params print (f "Best unit: {best_params}" ) # 最適な数倀を䞭間局のナニット数に指定し、モデルの定矩ず蚓緎、評䟡を行いたす。 nn_model = NnModel(target_data) nn_model.model_fit(best_params[ "unit" ], r"logs" , epochs= 100 ) nn_model.model_predict() if __name__ == "__main__" : main() 今回䜜成したモデルの評䟡結果は以䞋のようになりたした。      Accuracy: 0.9555      Precision: 0.9609      Recall: 0.9861 かなり良い数倀ですが、Tensorboardでモデル損倱のグラフを確認しおみるず、2゚ポック以降枛少が芋られたせん。察策はしおいたしたが 過孊習 をしおしたったようです。 (濃い青の線が孊習デヌタでの損倱倀、氎色の線が評䟡甚デヌタでの損倱倀)      (Tensorboardでは孊習デヌタでモデルを繰り返し蚓緎する䞭で、どのように性胜が倉化しおいったかを確認するこずができたす。) (model_fitメ゜ッドのtensorboard = keras.callbacks.TensorBoard(log_dir=logdir)の行でtensorboardの蚭定を行っおいたす。) www.tensorflow.org deepage.net 䜜成した ニュヌラルネットワヌク モデルの利甚 最埌に䜜成したモデルを䜿っお、未知のデヌタでの予枬を行うための関数を䜜成しおみたす。 モデル䜜成時に䜿った ベクトラ むザヌず保存した ニュヌラルネットワヌク モデルを読み蟌み、それらに予枬を行いたいデヌタ(テキスト)を枡しお予枬結果の確率を出力したす。 保存したモデルは、tensorflow.keras.models.load_modelで読み蟌みたす。 def model_load_predict (x, model_h5, vec_pickle): """ニュヌラルネットワヌクモデルを利甚した未知デヌタに察する予枬甚関数 䜜成・保存したニュヌラルネットワヌクモデルを利甚しお、未知デヌタの予枬を行いたす。 Args: x (str): テキストデヌタ(レビュヌ本文ず同じ圢匏) model_h5 (str): 䜜成したニュヌラルネットワヌクモデルのh5ファむルのパス vec_pickle (str): 保存したベクトラむザヌのpickleファむルのパス Returns: int: 予枬ラベルの敎数倀(入力したテキストをネガティブず予枬した堎合は0,、ポゞティブず予枬した堎合は1) """ # モデルずベクトラむザヌを読み蟌みたす。 model = keras.models.load_model(model_h5) with open (vec_pickle, 'rb' ) as f: vectorizer = pickle.load(f) # 入力デヌタの正芏化ずベクトル化を行いたす。 x = normalize_doc(x) vec_x = vectorizer.transform([x]).toarray() # 入力デヌタに察しお予枬を行い、結果を出力したす。 pred = model.predict(vec_x) print ( "== Result ==" ) print ( "Positive" ) if pred[ 0 ][ 1 ] > pred[ 0 ][ 0 ] else print ( "Negative" ) print (f "Positive: {pred[0][1]}, Negative: {pred[0][0]}" ) return pred.argmax() if __name__ == "__main__" : x = input ( ">>>" ) model_h5 = "my_neural_model.h5" vec_pickle = "my_vectorizer.pickle" res = model_load_predict(x, model_h5, vec_pickle) print ( "予枬ラベル: " , res) 関数を実行し「>>>」ず衚瀺されたら、ネガティブかポゞティブかを予枬したいテキストを入力したす。テキスト入力埌に「enter」を抌すず予枬結果が出力されたす。(予枬結果の前に譊告が衚瀺されるこずがありたすが、今回は無芖したす。)           結果ず考察 KerasずOptunaを䜿い、実際に予枬を行うこずができる ニュヌラルネットワヌク モデルを䜜成するこずができたした。 このモデルは評䟡結果の数倀を芋るず悪くないように芋えるのですが、未知のレビュヌデヌタに察する予枬性胜が高いずは蚀えたせん。䞀目でポゞティブずわかる内容のレビュヌに察しお、99ネガティブずいう予枬をするこずもありたした。 今回の反省点ずしおは、 デヌタの質が良くなかった。   → 今回は文法的に怪しい英文もそのたた䜿いたした。これが良くなかったのかもしれたせん。   → 非垞に長いレビュヌ本文を持぀レコヌドが含たれおいたしたが、この手のレコヌドは「いい点もあった。が、しかし 」ずいう流れでポゞティブな偎面ずネガティブな偎面を持っおいる可胜性があり、どちらかに分類するには容易ではないのかもしれたせん。 デヌタが足りなかった。   → 2䞇レコヌドでは足りなかったのかもしれたせん。 ベクトル化の方法が良くなかった。   → TF-IDFよりも単語の意味を反映するずされる分散衚珟の方がよかったのかもしれたせん。 別のハむパヌパラメヌタもOptunaで最適化すべきだった。   → ナニット数以倖にも孊習率やバッチサむズも最適な倀をOptunaで蚭定するずよかったのかもしれたせん。 モデルの アヌキテクチャ が適切でなかった。   → 今回のような ニュヌラルネットワヌク モデルよりもリカレント ニュヌラルネットワヌク モデルの方がテキスト分類には適しおいるのかも知れたせん。 ずいったこずが考えられたす。このモデルを改善する際や新たなモデルを䜜成する際には、䞊蚘の反省点を螏たえる必芁があるず感じおいたす。 特にデヌタに関しおは、倧量のデヌタが必芁になるため、ある詊行でうたくいかなかった際に、簡単に代替のデヌタを甚意できるずは限りたせん。 自前でデヌタを甚意する際には、最初から質の高いデヌタが揃うようにデヌタ収集䜜業を行う必芁があるず思いたす。 党䜓 スクリプト 最埌に、今回の ニュヌラルネットワヌク モデル䜜成の詊みに関わる スクリプト 党䜓をたずめおおきたす。 テキストデヌタの分類であれば、少しの線集でいろいろなデヌタを扱えるず思いたす。ぜひ、ご自身のデヌタで予枬モデルを䜜成しおみおください。 # coding: utf-8 import pandas as pd import pickle import cleantext import optuna from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, precision_score, recall_score from tensorflow import keras def normalize_doc (text, no_digits= False , no_numbers= False , to_ascii= False ): text = text.strip() text = cleantext.clean(text, no_digits=no_digits, to_ascii=to_ascii, no_numbers=no_numbers, replace_with_number= "0" ) return text def load_data (path): review_df = pd.read_csv(path, header= 0 ) columns = review_df.columns mapping = { 1 : 0 , 2 : 0 , 3 : 3 , 4 : 1 , 5 : 1 } review_df[columns[ 1 ]] = review_df[columns[ 1 ]].map(mapping) negative_review_df = review_df[review_df[columns[ 1 ]] == 0 ] positive_review_df = review_df[review_df[columns[ 1 ]] == 1 ] xn = [normalize_doc(review_body) for review_body in negative_review_df[columns[ 0 ]]] yn = list (negative_review_df[columns[ 1 ]]) xp = [normalize_doc(review_body) for review_body in positive_review_df[columns[ 0 ]]] yp = list (positive_review_df[columns[ 1 ]]) xn_train, xn_test, yn_train, yn_test = train_test_split( xn, yn, test_size= 0.2 , random_state= 42 , ) xp_train, xp_test, yp_train, yp_test = train_test_split( xp, yp, test_size= 0.2 , random_state= 42 , ) x_train = xn_train + xp_train x_test = xn_test + xp_test y_train = yn_train + yp_train y_test = yn_test + yp_test train = list () for x, y in zip (x_train, y_train): train.append([x, y]) train_df = pd.DataFrame(train, columns=[ "Review" , "Rating" ]) test = list () for x, y in zip (x_test, y_test): test.append([x, y]) test_df = pd.DataFrame(test, columns=[ "Review" , "Rating" ]) return train_df.sample(frac= 1 ).reset_index(drop= True ), test_df.sample(frac= 1 ).reset_index(drop= True ) def get_vectorizer (corpus_x_train, corpus_x_test): vectorizer = TfidfVectorizer(max_df= 0.3 ) vec_corpus_x_train = vectorizer.fit_transform(corpus_x_train) vec_corpus_x_test = vectorizer.transform(corpus_x_test) return vectorizer, vectorizer.get_feature_names_out(), vec_corpus_x_train.toarray(), vec_corpus_x_test.toarray() def create_model (n_vocab, unit): input_ = keras.layers.Input(shape=(n_vocab,)) x = keras.layers.Dense(unit, activation= "relu" )(input_) x = keras.layers.Dropout( 0.8 )(x) x = keras.layers.Dense(unit, activation= "relu" )(x) x = keras.layers.Dropout( 0.5 )(x) output = keras.layers.Dense( 2 , activation= "softmax" )(x) model = keras.Model(inputs= input , outputs=output) model.compile( optimizer= "adam" , loss= "sparse_categorical_crossentropy" , metrics=[ "accuracy" ] ) print (model.summary()) return model class NnModel : def __init__ (self, path): train_df, test_df = load_data(path) columns = train_df.columns x_train = train_df[columns[ 0 ]] self.x_test = test_df[columns[ 0 ]] self.y_train = train_df[columns[ 1 ]] self.y_test = test_df[columns[ 1 ]] self.vectorizer, self.vocab, self.vec_x_train, self.vec_x_test = get_vectorizer(x_train, self.x_test) with open ( "my_vectorizer.pickle" , "wb" ) as f: pickle.dump(self.vectorizer, f) def model_fit (self, unit, logdir, validation_split= 0.2 , epochs= 20 , batch_size= 32 ): self.model = create_model( len (self.vocab), unit) tensorboard = keras.callbacks.TensorBoard(log_dir=logdir) early_stopping = keras.callbacks.EarlyStopping(monitor= 'val_loss' , patience= 3 ) model_name = "my_neural_model.h5" modelCheckpoint = keras.callbacks.ModelCheckpoint( filepath=model_name, monitor= 'val_loss' , verbose= 1 , save_best_only= True , save_weights_only= False , mode= 'min' , period= 1 ) callbacks = [tensorboard, early_stopping, modelCheckpoint] self.model.fit( self.vec_x_train, self.y_train, validation_split=validation_split, epochs=epochs, batch_size=batch_size, callbacks=callbacks ) model = keras.models.load_model(model_name) pred = model.evaluate(self.vec_x_test, self.y_test) return pred[ 0 ] def model_predict (self): y_pred = self.model.predict(self.vec_x_test) y_pred = [p.argmax() for p in y_pred] print ( "result" , f "accuracy: {accuracy_score(self.y_test, y_pred)}" , f "precision: {precision_score(self.y_test, y_pred)}" , f "recall: {recall_score(self.y_test, y_pred)}" , sep= " \r\n " ) def objective (trial): unit = trial.suggest_int( "unit" , 2 , 30 ) loss = nn_model.model_fit(unit, r"logs" , epochs= 100 ) return loss target_data = r"tripadvisor_hotel_reviews.csv" nn_model = NnModel(target_data) def main (): study = optuna.create_study(direction= "minimize" ) study.optimize(objective, n_trials= 10 ) best_params = study.best_params print (f "Best unit: {best_params}" ) nn_model = NnModel(target_data) nn_model.model_fit(best_params[ "unit" ], r"logs" , epochs= 100 ) nn_model.model_predict() def model_load_predict (x, model_h5, vec_pickle): model = keras.models.load_model(model_h5) with open (vec_pickle, 'rb' ) as f: vectorizer = pickle.load(f) x = normalize_doc(x) vec_x = vectorizer.transform([x]).toarray() pred = model.predict(vec_x) print ( "== Result ==" ) print ( "Positive" ) if pred[ 0 ][ 1 ] > pred[ 0 ][ 0 ] else print ( "Negative" ) print (f "Positive: {pred[0][1]}, Negative: {pred[0][0]}" ) return pred.argmax() if __name__ == "__main__" : main() x = input ( ">>>" ) model_h5 = "my_neural_model.h5" vec_pickle = "my_vectorizer.pickle" res = model_load_predict(x, model_h5, vec_pickle) print (res) ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
【目次】 PdM ずは PMプロゞェクトマネヌゞャヌずの違い PdM/PMの圹割衚 PdM に必芁なスキル おすすめの曞籍/勉匷䌚 ラクスのPdMずしお掻躍しおみたせんか 終わりに 技術広報の yayawowo です。 昚今、PdMプロダクトマネヌゞャヌずいう蚀葉を耳にするこずが増えたのではないでしょうか しかしながら  「実際䜕をしおいる人かわからない」 「PdMを目指しおいるけど、必芁なスキルっお 」 ず䞍明点もあるず思いたす。 本蚘事では、PdMプロダクトマネヌゞャヌの基本や必芁なスキル等を玹介させおいただきたす。 ◆ 関連ブログも合わせおご確認ください ・ プロゞェクトマネゞメント ずは 【たずめ】 ・ PMBOK ずは【たずめ】 ・ 芁件定矩 ずは【たずめ】 ・ プロゞェクトマネゞメントTips 20遞 珟堎から語るプロマネの極意 PdM ずは PdMずは、プロダクトマネヌゞャヌのこずを指したす。 経営方針や䌁業戊略、ビゞネスサむド偎の販売蚈画に基づく顧客芁求の分析、芁求分析/定矩を行い、「プロダクト補品・商品・サヌビス」を成功に導く責任者をPdMず呌びたす。 たたプロダクトずは、䞀般的にお客様ぞ販売する補品のこずを蚀いたすが、゜フトりェア・デヌタ等も含たれたす。 元々、補造業で䜿われおいた蚀葉でしたが、昚今はIT/Web業界にたで掟生し、泚目を集めおいたす。 圓瀟PdMプロダクトマネヌゞャヌは、補品䌁画を行う「補品力䌚議」から参加したす。 「補品力䌚議」では、ビゞネスサむドの郚長やカスタマヌサクセスず顔を合わせるため、開発ロヌドマップにPdMプロダクトマネヌゞャヌずしおの声を反映させるこずができたす   たた、PdMプロダクトマネヌゞャヌの類䌌職皮ずしお、PMプロゞェクトマネヌゞャヌがありたす。 以䞋にお、職皮の違いを解説したす。 PMプロゞェクトマネヌゞャヌずの違い PMプロゞェクトマネゞャヌずは、期間が定められたプロゞェクトの達成/成功に向けお進捗、品質、コストを管理しコン トロヌル する人のこずを指したす。 担圓プロゞェクトに察し、責任をもっお管理するこずが求められる職皮です。 プロゞェクトマネゞメントを解説しおいる蚘事も是非ご参考ください。 tech-blog.rakus.co.jp PdM/PMの圹割衚 職皮 圹割 PdM 経営方針や䌁業戊略、ビゞネスサむド偎の販売蚈画に基づく顧客芁求の分析、芁求分析/定矩を行い、「プロダクト補品・商品・サヌビス」を成功に導く責任を担う PM 期間が定められたプロゞェクトの達成/成功に向けお進捗、品質、コストの管理責任を担う PdM、PMずの圹割が異なるこずをご理解いただけたでしょうか PdM に必芁なスキル ◆ マネゞメント面 ・ コミュニケヌション力 ・ 進捗管理 胜力 ・ 課題解決力 プロダクトマネヌゞャヌずいう名前の通り、マネゞメント面でのスキルは重芁です。 䞊蚘3点は、特に必芁ずなるスキルセットずなりたす。 ◆ ビゞネス面 ・ マヌケティング 力 ・ 業界知識 垂堎調査を行い、分析するこずで垂堎ニヌズを把握するこずが必芁です。 プロダクトを開発にするにしおも、垂堎のニヌズに合っおいないものを開発するのは䌚瀟ずしおもメリットがありたせん。 マヌケティング 力ず業界知識は、PdMプロダクトマネヌゞャヌにずっお倧切なスキルず蚀えるでしょう。 ◆ テク ノロ ゞヌ 面 ・ UI/UXデザむン ・ 開発スキル お客様にシステムを長く䜿っおもらうには、䜿いやすいデザむン、構成ずなっおいるのが倧切です。 お客様に遞ばれるプロダクトにするためには、UI/UXのスキルを深めおおくこずが倧切ずなりたす。 たた、デザむン性だけでなくプロダクト蚭蚈も同様のこずが蚀えたすので、ある皋床の開発スキルがあるこずは奜たしいず思いたす。 おすすめの曞籍/勉匷䌚 おすすめの曞籍ず勉匷䌚をご玹介いたしたす ◆ 曞籍 PdMプロダクトマネヌゞャヌにおすすめの曞籍を䞊べおみたした。 孊習の䞀助ずなれば幞いです。 『 プロダクトマネゞメント のすべお 事業戊略・IT開発・UXデザむン・ マヌケティング からチヌム・組織運営たで』 タむトルの通り、たさに プロダクトマネゞメント の決定版ずいえる曞籍です。 180点超の図版で分かりやすく解析しおいたす。 たた、 ケヌススタディ も぀いおいるので、実践的に孊ぶこずができたす。 『INSPIRED 熱狂させる補品を生み出す プロダクトマネゞメント 』 シリコンバレヌ で実斜しおいる プロダクトマネゞメント の手法がたずめられおいる曞籍です。 䟋えば、 Google 、 Apple 、 Facebook 、 Netflix 、Tesla、 Amazon 等の手法を孊ぶこずが出来たす。 『 プロダクトマネゞメント ―ビルドトラップを避け顧客に䟡倀を届ける』 プロダクトマネゞメント で必芁な情報が䞀通り曞かれおいる䞀冊です。 マネゞメント手法においお必芁な戊略や、組織、プロセスに぀いおを論じおいたす。 ◆ 勉匷䌚 圓瀟䞻催の技術むベントに「PdM TIps LT䌚」がございたす。 rakus.connpass.com 2021幎3月に開催した際は、以䞋発衚テヌマがありたした。 【発衚テヌマ】 ・ アラフィフの開発者が プロダクトマネゞメント をはじめおみた ・ ゞョブ理論ずプロダクト開発 ・ oVice着想から初有料ナヌザヌを獲埗するたでのPMビハむンドストヌリヌ ・ PMが「開発を巻き蟌んだ斜策盞談䌚」で工倫したポむント ・ 私たち“プロダクト䞻導組織”になれおるかなを問う自問自答Tips ・ LabTech䌁業の初代PMになっおやっおきたこずずこれから ・ PdM忙しい問題どうしたす -80点以䞊のプロダクトを目指したら緩和されおきた話- ・ PjM→PdMになった1幎目の倱敗ずTips vol.2も今幎の倏ごろに開催を予定しおおりたす。 ご興味ありたしたら connpass 又は TECH PLAY を定期的にご確認いただけたすず幞いです ラク スのPdMずしお掻躍しおみたせんか 圓瀟 ラク スでは、プロダクトマネヌゞャヌを積極的に募集しおおりたす PdMプロダクトマネヌゞャヌ組織は2021幎8月からスタヌトし、サヌビス党䜓の芖点を持っお働ける環境が備わっおおりたす。 ビゞネスサむドを通じおお客様の課題把握、プロダクトの開発郚隊ぞ抜けもれなく効率的に芁求を萜ずし蟌み、開発偎ぞ連携するために圓瀟ではPdMずいうポゞションを眮いおおりたす。 そのため、圓瀟PdMは以䞋スキルを重芁芖しおおりたす。 Webサヌビス で開発知識 RFP 、芁求仕様策定の実務経隓 ステヌクホルダヌ ずの折衝・調敎経隓 そんな ラク スのPdM特城は以䞋の通りです ラク スのPdM 開発スタむル ベスト・オブ・ブリヌド 異なるフェヌズのマルチプロダクト 組織 プロダクト単䜍でコミット 案件 顧客課題・案件単䜍のコミット 圓瀟PdMプロダクトマネヌゞャヌの面癜さは、挑戊の裁量ず芏暡です。 圓瀟最倧のプロダクトに぀いおサヌビス党䜓の芖点を持っお動けるこず 新しいチヌムで、PdMの圹割そのものを立ち䞊げおいけるこず 䞊蚘の内容にピンっずきた方は、以䞋の求人内容を是非ご確認ください career-recruit.rakus.co.jp 「たずは、䌚瀟説明を聞いおみたい」ずいうのも倧歓迎です。 以䞋フォヌムより申し蟌みをお願いいたしたす rakus.hubspotpagebuilder.com 終わりに PdMプロダクトマネヌゞャヌのたずめ蚘事はいかがでしたでしょうか 幎々、瀟䌚党䜓ずしおPdMポゞションは重芁ずなっおきおおりたす。 今埌PdMを目指す方にずっお、本蚘事の内容が少しでもお圹に立おれば幞いです もし圓瀟PdMに少しでもご興味をお持ちになりたしたら、定期的に行っおいるむベントもございたす。 是非ご参加ください ◆ むベント情報 < connpass > rakus.connpass.com < TECH PLAY > techplay.jp PdM Tips LT䌚 - vol.2の開催が決定 ご興味ありたしたら以䞋より、ご登壇/ご芖聎の申蟌をお願いいたしたす techplay.jp rakus.connpass.com お気軜にどうぞ。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com