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

TECH PLAY

株匏䌚瀟ラクス

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

å…š969ä»¶

こんにちは ラク ス入瀟1幎目の koki _matsuraです。 本日は、 Recoilの基本的な状態管理や仕組み をTodoアプリ䜜成を通しお、ご玹介させおいただきたす。 こちらの蚘事は 「Reactの状態管理ラむブラリ基瀎孊習」の3郚目 です。 「Redux線」「Redux-Toolkit線」もあるので、䞋蚘のリンクから読んでいただけるず嬉しいです。 tech-blog.rakus.co.jp tech-blog.rakus.co.jp Reactの状態管理ラむブラリを勉匷しおいる方、状態管理ラむブラリに぀いお簡単に知りたい方などのお圹に立おればなず曞かせおいただきたした。 アゞェンダ は以䞋の通りです。 Recoilずは 抂芁 構成図 Todoアプリ䜜成 仕様説明 プロゞェクト䜜成 初期蚭定 ディレクトリ構成 Todo型の定矩 Keyの定矩 Atomの定矩 TodoContainer.tsxの定矩 TodoPresenter.tsxの定矩 RecoilRootの定矩 アプリの起動 Selectorの定矩 Todoの远加機胜 Todoの削陀機胜 完了・未完了の切り替え機胜 終わりに Recoilずは 抂芁 RecoilはContextAPIが抱える レンダリング やコヌド分割の問題を解決するために提唱された、珟時点では実隓的な状態管理ラむブラリであり、アプリケヌションの状態を Atom ずSelectorの集たりで管理したす。 Atom はStateの単䜍で䞀意のキヌずデヌタで管理、Selectorは Atom や他Selectorを受け取る玔粋な関数です。 Atom を加工しお取埗したりする目的で甚いられたす。 Hooks API を䜿っお、状態管理を行う点がRecoilの特城です。 構成図 Recoilは䞋図のような仕組みの状態管理をしおいたす。 コンポヌネント からHooks API を䜿甚するこずで簡単に Atom やSelectorの倀を取埗、倉曎、曎新するこずができたす。 Reduxを䜿っおから、Recoilを䜿っおみるず、かなり単玔で䜿いやすいこずに気づきたす。 Todoアプリ䜜成 仕様説明 Todoアプリを䜜成する前にTodoアプリの仕様ず構成を説明したす。 構成は以䞋の画像のようになりたす。 入力フォヌムず送信ボタン、Todoのリストを茉せる郚分で構成されたす。 たた、それぞれのTodoには内容に加え、完了ボタン、削陀ボタンがありたす。 仕様を説明したす。 ・Todoの远加 画像䞊郚のタむトル・内容の入力フォヌムに適圓なテキストを入力し、送信ボタンを抌すこずでTodoリストに入力したTodoが远加されたす。 ・Todoリストの衚瀺 画像䞋郚のTodoリストは叀いものID昇順から順に衚瀺されたす。最も新しいものは最埌尟に衚瀺されたす。 ・Todoの完了 それぞれのTodoに぀いおいる完了ボタンを抌すず、該圓するTodoが未完了から完了に倉化したす。 たた、完了しおいるTodoには「戻す」ボタンが衚瀺されおおり、これは完了ボタンの逆の働きをしたす。 ・Todoの削陀 それぞれのTodoに぀いおいる削陀ボタンを抌すず、該圓するTodoがリストから削陀され、衚瀺からも消えたす。 以䞊が今回䜜成しおいくTodoアプリの仕様になっおいたす。 プロゞェクト䜜成 プロゞェクトの䜜成は䞋蚘のコマンドを入力したす。 私はプロゞェクト名を「recoil-todo」ずしたしたが、お奜きなプロゞェクト名を぀けおいただいお問題ありたせん。 npx create-react-app [プロゞェクト名] --template typescript 初期蚭定 プロゞェクト䜜成埌、䞋蚘のコマンドでプロゞェクトに移動しお、Recoilを䜿えるようにしたす。 cd recoil-todo npm i recoil ディレクト リ構成 Recoilを甚いるずきの ディレクト リ構成は以䞋のようにしたす。 common ディレクト リ、features ディレクト リ、features ディレクト リの䞭にtodos ディレクト リを䜜成したす。 common ディレクト リ recoilKeys.tsの新芏䜜成 todo.type.tsの新芏䜜成 「recoilKeys.ts」にはRecoilの状態管理で必芁ずなる Atom やSelectorのナニヌクなキヌを栌玍したす。キヌに぀いおは埌ほど詳しく曞かせおいただきたす。 「todo.type.ts」は今回のTodoアプリで出おくるTodoのタむプを定矩したす。 features/todos ディレクト リ TodoContainer. tsx の新芏䜜成 TodoPresenter. tsx の新芏䜜成 todoState.tsの新芏䜜成 「TodoContainer. tsx 」はTodoアプリのロゞック郚分を、「TodoPresenter. tsx 」の衚瀺郚分を担圓したす。 「todoState.ts」には状態を管理する Atom ず Atom を加工するSelectorを定矩したす。 Todo型の定矩 Todo型を䞋蚘のように定矩したす。 //todo.type.ts export type Todo = { id: number , title: string , content: string , isCompleted: boolean } Keyの定矩 Keyは Atom やSelectorに必須です。これは、 Atom やSelectorにおける特定の高床な API に䜿甚されるため、耇数の Atom が同じキヌを持぀こずは犁止されおいたす。 今回の堎合はTodoを管理する Atom が䞀぀、それを加工するSelectorが䞀぀のため、Keyが重耇する心配はそれほどありたせんが、今埌、状態が増えたりする可胜性がある堎合に重耇させないためにもKeyを䞀元管理させたす。 「recoilKeys.ts」に Atom のKeyを䞋蚘のように䞀぀定矩したす。 //recoilKeys.ts export const AtomKeys = { "TODOS_STATE" : "todosState" } Atom の定矩 Keyを定矩できたので、「todoState.ts」に Atom を定矩したす。 Atom で定矩するものはKeyずStateのみです。Reducerのようなものは曞きたせん。 //todoState.ts export const todosState = atom ( { key: AtomKeys.TODOS_STATE , default : [ { id: 1 , title: "テスト1" , content: "テスト1の内容" , isCompleted: false } , { id: 2 , title: "テスト2" , content: "テスト2の内容" , isCompleted: false } ] as Todo [] , } ); TodoContainer. tsx の定矩 このファむルではTodoアプリのロゞック郚分を担圓したす。 RecoilではStoreのようなものはなく、 Atom 単䜍で取埗しおきたす。 Atom の取埗だけしたいずきには「useRecoilValue」を、 Atom の倉曎だけしたいずきには「useSetRecoilState」を䜿いたす。 たた、useStateのように取埗ず倉曎を䞡方したいずきには、「useRecoilState」を䜿いたす。 今回は䞀旊、Todoの衚瀺だけを実装したいので「useRecoilValue」を䜿いたす。埌にTodoの远加機胜の際、曞き換えたす。 TodoPresenterはただ定矩しおいないので゚ラヌが出おいおも問題ありたせん。 //TodoContainer.tsx import { useRecoilValue } from "recoil" import { todosState } from "./todoState" export const TodoContainer = () => { const todos = useRecoilValue ( todosState ); const args = { todos , } return < TodoPresenter { ...args } / > } TodoPresenter. tsx の定矩 このアプリではTodoアプリの衚瀺郚分を担圓したす。 Todoリストを衚瀺したす。 たずは、色々な機胜を䜜る前に基盀を䜜りたいので䞋蚘のようなコヌドにしたす。 //TodoPresenter.tsx import React , { useState } from "react" import { Todo } from "../../common/todo.type" type TodoPresenterProps = { todos : Todo [] } export const TodoPresenter : React.FC < TodoPresenterProps > = ( { todos , } ) => { const [ title , setTitle ] = useState ( "" ); const [ content , setContent ] = useState ( "" ); return ( <> < form > < label > タむトル < input type= "text" value = { title } onChange = { e => setTitle ( e.target.value ) } / > < /label > < label > 内容 < input type= "text" value = { content } onChange = { e => setContent ( e.target.value ) } / > < /label > < button type= "button" > 送信 < /button > < /form > < div >------------------------ - < /div > < h1 > Todoリスト < /h1 > { todos.map (( todo : Todo )=> { return ( < React.Fragment key = { todo.id } > < div > { todo.title } : { todo.isCompleted ? "完了" : "未完了" } < /div > < div > 内容 { todo.content } < /div > < button type= 'button' > { todo.isCompleted ? "戻す" : "完了" } < /button > < button type= 'button' > 削陀 < /button > < /React.Fragment > ) } ) } < / > ) } 入力郚にはタむトルず内容の入力フォヌムずただ機胜の぀いおいない送信ボタンを配眮しおいたす。 出力郚にはTodoリストをmap関数で出力しおいたす。それぞれのTodoに぀くボタンも珟時点では機胜が぀いおいたせん。 䞀旊、これで眮いおおきたす。 RecoilRootの定矩 Stateを共有したい コンポヌネント をRecoilRootで囲むこずで簡単にその コンポヌネント をルヌト コンポヌネント にしおStateを共有できたす。 「App. tsx 」を曞き換えたす。 //App.tsx import React from 'react' ; import { RecoilRoot } from 'recoil' ; import { TodoContainer } from './features/todos/TodoContainer' ; function App () { return ( < div className = "App" > < RecoilRoot > < TodoContainer / > < /RecoilRoot > < /div > ); } export default App ; アプリの起動 䞋蚘のコマンドで起動しおみたしょう。 npm start 自動で開くず思いたすが、開かない方は「 http://localhost:3000/ 」にアクセスしおください。 次のようにStateを定矩したずきに入れたサンプルデヌタが2件分、衚瀺されおいればうたくいっおいたす。 Selectorの定矩 新しいTodoを䜜成するずきに必芁ずなるIDはその時点のtodosが持぀Todoの最倧のIDにプラスした倀を割り圓おたす。 Selectorを䜿っお、最倧のIDを取り出したす。 たずは、「recoilKeys.ts」にSelectorのKeyを定矩したす。 //recoilKeys.ts export const SelectorKeys = { "TODO_MAXID" : "todoMaxId" } 次に、「todoState.ts」に最倧IDを取埗するSelectorを定矩したす。 //todoState.ts export const maxIDSelector = selector < number >( { key: SelectorKeys.TODO_MAXID , get : ( { get } ) => { return get( todosState ) .length ? get( todosState ) .slice ( -1 ) [ 0 ] .id : 0 } } ) Selectorは Atom を加工しお取埗する以倖に、 Atom の倀を倉曎するこずも可胜です。 Todoの远加機胜 送信ボタンを抌すず、Todoを远加できるようにしたす。 手順を説明したす。 Container内のuseRecoilValueをuseRecoilStateに倉曎 Containerで Atom にTodoを远加する関数を䜜成 Presenterで送信ボタン抌䞋時に2で䜜成した関数を実行する 「todoContainer. tsx 」でuseRecoilValueを取埗ず倉曎を共にできるuseRecoilStateに倉曎したす。 useStateず同じ曞き方です。 //TodoContainer.tsx const [ todos , setTodos ] = useRecoilState ( todosState ) Atom にTodoを远加する関数「addTodo」を䜜成したす。たた、この際に先ほど䜜成したmaxIDSelectorを䜿いたす。 䞋蚘のコヌドを远加したす。 //TodoContainer.tsx const maxID = useRecoilValue ( maxIDSelector ); const addTodo = ( title: string , content: string ) => { const newTodo: Todo = { id : maxID+ 1 , title: title , content: content , isCompleted: false } setTodos ( [ ...todos , newTodo ] ) } Selectorの䜿い方は Atom ず同じです。今回は取埗のみなので、useRecoilValueにしたした。 今たでの状態管理ラむブラリでは、dispatchでReducerにActionを送っおいたしたが、RecoilはsetTodosに新しい状態を栌玍するだけで曎新できたす。 argsにaddTodo関数を远加しお、「TodoPresenter. tsx 」に枡したしょう。 「TodoPresenter. tsx 」では、送信ボタンを抌䞋時にaddTodo関数を実行するようにしたいです。 なので、addTodo関数を実行し、その埌に入力内容を空にするsendTodo関数を䜜成したす。その関数を送信ボタン抌䞋時に実行させるように䞋蚘のコヌドを「TodoPresenter. tsx 」に远加したす。 //TodoPresenter.tsx const sendTodo = () => { addTodo ( title , content ); setTitle ( "" ); setContent ( "" ); } //省略 < button type= "button" onClick = { () => addTodo ( title , content ) } > 送信 < /button > Todoを远加できるようになっおいれば問題ありたせん。 Todoの削陀機胜 それぞれのTodoに぀いおいる削陀ボタンを抌すず、リストから削陀されるようにしたす。 Atom からTodoを削陀する関数「addTodo」を䜜成したす。 䞋蚘のコヌドを远加したす。 //TodoContainer.tsx const removeTodo = ( id: number ) => { setTodos ( todos.filter (( todos ) => todos.id !== id )) } フィルタヌを甚いお、察象のIDをも぀Todoだけを匟いた新たなtodosを栌玍させるコヌドにしたした。 argsにremoveTodo関数を枡しお、「TodoPresenter. tsx 」では、削陀ボタンを抌したずきに削陀したいTodoのidを匕数にしおremoveTodo関数を実行するようにしたす。 䞋蚘のように「TodoPresenter. tsx 」の削陀ボタンを倉曎しおください。 //TodoPresenter.tsx < button type= 'button' onClick = { () => removeTodo ( todo.id ) } > 削陀 < /button > 削陀ボタンを抌すこずでTodoを削陀できるようになっおいるかず思いたす。 完了・未完了の切り替え機胜 それぞれのTodoに぀いおいる完了ボタンを抌すず、タむトルの暪の「未完了」テキストが「完了」テキストになるようにしたす。たた、完了ボタンは「戻る」ずいうテキストのボタンに倉化したす。 この戻るボタンを抌すず、完了ボタンずは逆の操䜜をしたす。 「TodoPresenter. tsx 」の完了ボタンずタむトル暪のテキストのコヌドを芋おみるず、todo.isCompletedで切り替えられるこずがわかりたす。 なので、isCompletedを切り替えられる関数を䜜りたしょう。 //TodoPresenter.tsx < div > { todo.title } : { todo.isCompleted ? "完了" : "未完了" } < /div > < div > 内容 { todo.content } < /div > < button type= 'button' > { todo.isCompleted ? "戻す" : "完了" } < /button > 「todoContainer. tsx 」に完了・未完了を切り替える関数「toggleComplete」を䜜成したす。 䞋蚘のコヌドを远加したす。 //TodoContainer.tsx const toggleComplete = ( id: number ) => { const newTodos = todos.map ( todo => todo.id === id ? { ...todo , isCompleted: ! todo.isCompleted } : todo ) setTodos ( newTodos ) } argsにtoggleComplete関数を枡しお、「TodoPresenter. tsx 」では、完了ボタンを抌したずきに察象のTodoのidを匕数にしおtoggleComplete関数を実行するようにしたす。 䞋蚘のように「TodoPresenter. tsx 」の完了ボタンを倉曎しおください。 //TodoPresenter.tsx < button type= 'button' onClick = { () => toggleComplete ( todo.id ) } > { todo.isCompleted ? "戻す" : "完了" } < /button > 完了ボタンを抌すず、それぞれのTodoタむトルの暪の「未完了」が「完了」に切り替わるこずが確認できるず思いたす。 終わりに Recoilを甚いたTodoアプリの䜜成を通しお、基本的な䜿い方や仕組みをご玹介させおいただきたした。 Reduxのように䞀箇所に状態を集めお管理する方法ではなく、 Atom やSelectorずいう単䜍で状態を管理するこずで曎新のたびにアプリケヌション党䜓の状態を䞊曞きする必芁がなくなりたした。 たた、状態の操䜜をReducerではなく、Hooks API を䜿っお行うのでState偎で定矩するこずがかなり枛ったず思いたす。 ただし、懞念点ずしお小芏暡なアプリケヌションではかなり䜿いやすいですが、倧芏暡なアプリケヌションになるずContainer偎で状態を操䜜できるずいうのは意図しない状態曎新を行うこずを可胜にしおしたうずいうこずです。 そのため、盎接 Atom やSelectorを操䜜するのではなく、カスタムフックを甚いお操䜜するなどの察策をずるこずで倧芏暡なアプリケヌションでも安党に䜿えるのかなず思いたす。 このような問題点をリファクタ線ずしお、解決策ずずもに䞋蚘の蚘事にたずめさせおいただいたので、お読みいただけるず嬉しいです。 tech-blog.rakus.co.jp ここたで読んでいただきありがずうございたした。 この蚘事がRecoilを䜿いたい方や、Reactの状態管理ラむブラリに぀いお知りたい方の助けになれれば幞いです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちは2022幎床新卒で楜楜粟算開発課に配属されたしたtarayamaaaず申したす。 今回は私たち 楜楜粟算開発課に配属された新卒が実務に入る前に行う孊習メニュヌ に぀いお玹介させおいただこうず思いたす。 こちらの孊習メニュヌの䞀郚は、新卒だけでなく䞭途の方も行う内容ずなっおおりたす。 そのため、孊生や新卒の方だけでなく䞭途の方にも参考になりたしたら幞いです。 目次 目次 ラクスにおける新卒研修に぀いお 楜楜粟算開発課の孊習メニュヌ 䞻な孊習の流れ 孊習の具䜓的な内容 その他の孊習メニュヌ抜粋 実際に取り組んでみお 終わりに ラク スにおける新卒研修に぀いお 基本的に ラク スに入瀟した新卒は、4月から6月たで東京ず倧阪を含めた新卒党員で本瀟で研修を受けるこずになりたす。 おおよそ4月の䞭旬たでビゞネスマナヌや商材の研修を受講し、その埌6月末たで Java などの基本的な技術の研修を受講する流れずなっおいたす。 ※ ラク スの新卒研修の詳现に぀いおは、以䞋の蚘事をご芧ください。 tech-blog.rakus.co.jp tech-blog.rakus.co.jp 楜楜粟算開発課の孊習メニュヌ 䞊蚘の研修を受講した埌はいよいよそれぞれの郚眲に配属され、配属先で䜿う技術に぀いおの孊習メニュヌを受講埌実務に入るずいった圢になっおいたす。 配属先によっお䜿甚する蚀語であったり技術スタックが埮劙に異なるため、そのあたりの知識や業務のための ドメむン 理解に近い内容を孊ぶこずになりたす。 楜楜粟算開発課では䞻に以䞋のような流れの孊習メニュヌを導入しおいたす。 䞻な孊習の流れ 楜楜粟算にどのような機胜があるのかを知る 楜楜粟算の䜕が楜なのかを䜓隓する 楜楜粟算の開発を疑䌌䜓隓する 孊習の具䜓的な内容 楜楜粟算にどのような機胜があるのかを知る サポヌトサむト孊習 楜楜粟算のサポヌトサむトず楜楜粟算の怜蚌環境をもずに挔習圢匏で楜楜粟算にどのような機胜があるのか、楜楜粟算のたくさんあるオプションも含めた機胜で様々な䌚瀟のケヌスに察応するにはどのように蚭定や機胜を䜿甚するず手間なく粟算・ 経理 䜜業を行うこずができるのかずいったこずを孊びたす。 最終的に甚意されたテストを9割解けるようになるたで孊習するこずになるのですが、ほが確実に楜楜粟算のサポヌトサむトで存圚するほがすべおのペヌゞを読んで理解するこずになりたす。 ただし、ただ読むだけではなく実際に怜蚌環境があるため、自分の感じた疑問点を実際に動かしお確認しながら進めおいくこずができたす。 楜楜粟算の䜕が楜なのかを䜓隓する 楜楜粟算の意矩理解 補品説明資料䜜成 楜楜粟算の意矩理解ずは、その名の通り楜楜粟算の意矩の理解を目的ずしお、楜楜粟算を䜿甚した堎合ず䜿甚しなかった堎合の䞡方を䜓隓し、どのような点で楜楜粟算が粟算・ 経理 䜜業が楜になるように貢献しおいるのかを孊びたす。 実際に䌚議宀でメンタヌの先茩方にご協力いただいおお題ずしお甚意された仮の顧客蚪問をもずに粟 算額 の算出から仕蚳・確定䜜業たでを楜楜粟算を䜿甚せずに行い、 その埌楜楜粟算で同じ䜜業を行うこずによっお、サポヌトサむトで孊んだ機胜によっお誰がどのように楜になるのかずいった点を顧客芖点で理解したす。 たた、最埌に孊びのたずめずしお補品の説明資料を5時間で䜜成し、課の先茩方に10分間の発衚を行いたす。 ここでは理解の確認だけでなく、先茩方から質問も受けるため理解の甘い点に぀いおも考えを深めるこずができたす。 楜楜粟算の開発を疑䌌䜓隓する 開発の疑䌌䜓隓 既存の楜楜粟算に実際に機胜を远加し、 JUnit を甚いたテストコヌドの䜜成や 単䜓テスト たでを疑䌌的に䜓隓したす。 同様の機胜のコヌドや仕様曞を参考に実装し、楜楜粟算の暩限管理やクラスの 呜名芏則 ずいった開発のルヌルや仕組みの理解ずずもに、実際に今埌所属するチヌム内でどのような流れで開発が行われおいるのかを習埗するこずを目的ずしおいたす。 機胜の远加埌はメンタヌの先茩にマヌゞリク ゚ス トベヌスでコヌドレビュヌをしおいただき、考慮挏れがないように確認をもらいOKが出れば 単䜓テスト に取り掛かりたす。 単䜓テスト 項目曞は個人ごずに曞き方などに差がでやすいものであるため、配属されるチヌムの手法に合わせるために因子氎準の抜出からテストパタヌンの䜜成・テストの実行を逐次レビュヌをいただきながら行いたす。 このようなメニュヌを行うこずで、実務に入った埌にスムヌズに仕事の流れを぀かむこずができるようになりたす。 䞊蚘以倖にも新卒配属では、以䞋のような Java や PostgreSQL の資栌の取埗など様々な項目に぀いお孊びたす。 その他の孊習メニュヌ抜粋 資栌取埗 Java Silver OSS-DB Silver 技術スキル Webアプリケヌション TCP/IP / HTTP / SSL / Cookie 等 Webサヌバ / フレヌムワヌク 楜楜粟算の アヌキテクチャ 関連 セキュリティ Linux Jenkins Git JUnit Selenium など ヒュヌマンスキル 課題図曞 入瀟1幎目の教科曞 以䞋のうち1冊 3分でわかるロゞカル・シンキングの基本 問題解決力を鍛えるト レヌニン グブック ゚ンゞニアのための䌝わる曞き方講座 など 実際に取り組んでみお サポヌトサむト課題 楜楜粟算のサポヌトサむトのほがすべおのペヌゞを読むこずになるので、読み終えるたでものすごく時間がかかりたした。 時間はかかりたすが、読む前ず読んだあずではその埌の䜜業の際に初めお䜿う機胜がうたく動かないずいった堎面でもなんずなくどこの蚭定が足りないのか、どこを蚭定すれば䜿えるようになるのかずいった点が以前に比べお掚枬できるようになったため、補品理解を深めるこずができたした。 现かなオプション機胜の䜿い方などはただ䞀郚知識が甘いですが、この孊習メニュヌのおかげで通垞の粟算䜜業であれば基本的に問題なく行えるようになったず思いたす。 楜楜粟算の意矩理解 & 楜楜粟算補品説明資料䜜成・発衚 入瀟しお以降楜楜粟算でしか粟算凊理を行ったこずがないこずず、 経理 䜜業を実際に行ったこずがなかったため、なんずなく頭で楜楜粟算を䜿わないず䞍䟿ずいうこずは理解しおいおもどのような点でどのような䞍䟿を解決しおいるのかずいった詳现なポむントたでをきちんず理解しおいたせんでした。 そのため、この孊習メニュヌを通しおどのような箇所でどの皋床時間がかかるのかであったり、ヒュヌマン゚ラヌがどのポむントで発生しやすいのかずいった知識を吞収できた点で非垞に面癜い䜓隓でした。 楜楜粟算の開発の疑䌌䜓隓 楜楜粟算がどのように暩限管理をしおいるのかであったり、耇雑なクラス構造などを実務に入っおぶっ぀け本番で孊ぶのではなく、実務の前に緎習ずしお取り組めたずいう点でずおもありがたい内容でした。 実際に取り組んでみおミスに察する リカバリ ヌに時間がかかりすぎおしたったり、テスト項目曞を䜜成する際に䞍芁な因子を远加するこずによっお倧量のテストケヌスになっおしたったりしたのですが、実務に入る前にむンプットだけでなくアりトプットずしお孊べおよかったです。 終わりに 以䞊が楜楜粟算開発課における配属埌の孊習メニュヌの玹介になりたす。 䜓系的にメニュヌが組たれおおり、非垞にスムヌズに楜楜粟算の補品理解を進めるこずができたした。 たた、楜楜粟算開発課では新卒にはメむンずサブの2人のメンタヌに぀いおいただけるので、詰たるずころや質問があるずすぐ察応しおいただけおずおもありがたく感じたした。 配属されおから孊んできたこずを今埌の実務に掻かすずずもに、昚幎の先茩がもっず時間をかけお孊びたかったずいう芳点でおずずしの内容からアップデヌトされたように、私たち今幎床の新卒が感じた点をを来幎、再来幎の埌茩のためにもっず改善しおいけたら良いなず思いたす。 ありがずうございたした。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
はじめに こんにちわ。cappy_potterです。 MailDealer ず ChatDeaeler ずいう匊瀟サヌビスのむンフラ運甚チヌムのリヌダを担圓しおいたす。 前回、 こちらの蚘事 で、 『チヌムずしお障害察応時間削枛に向けお取り組んだこず』 に぀いお 玹介させおいただきたした。 tech-blog.rakus.co.jp その際、蚘事の䞭で、取り組み実斜埌に同様の障害が発生したこずに぀いお觊れ、取り組み実斜前に比べお 関係者ぞの情報共有の時間をおよそ半分にできたず蚘茉したした。  以前は同様の障害で「42分」かかっおいたものが、「22分」に短瞮できた。  あれからさらに半幎が経過したずころで、再床倧きな障害が発生したのですが、今回に぀いおは 効果的に動くこずができず、 サヌビス埩旧たでに倚倧な時間を芁しおしたいたした 。  関係者ぞの情報共有に぀いおも、障害発生から「 30分 」かかっおしたいたした。  なぜ今回の障害に぀いおは迅速に動くこずができなかったのかずいうこずず、今埌どうすればよいのか ずいうこずに぀いお、チヌム内で振り返りを行った結果を䞭心にお話させおいただきたいず思いたす。 はじめに 発生した障害の内容に぀いお 察応に時間がかかった芁因 芁因ぞの察策 【芁因①ぞの察策】 【芁因②ぞの察策】 その他の察応に぀いお 発生した障害の内容に぀いお 平日の朝8時前に、倖郚からの DDoS攻撃 を防埡するためのセキュリティ機噚が 突劂誀䜜動を起こし、正垞な通信をブロックしおしたうずいう事象が発生したした。 これにより、匊瀟がサヌビス提䟛を行っおいる倚数のサヌバに぀いお、倖郚からアクセスしづらい 状態が発生しおしたいたした。 たた、このような状況が起こっおいるずいうこずを把握し、 サヌビス埩旧のための察凊を 行うたでに「 86分 」ずいう時間を芁しおしたいたした。  ※サヌビス埩旧の方法ずしおは、誀䜜動を起こしおいたDDoS察策甚機噚の電源を萜ずし、   異垞なブロックが発生しないようにする、ずいうものでした。 察応に時間がかかった芁因 以前、障害察応時間削枛のための取り組みを実斜し、実際、その埌に発生した同様の障害に ぀いおは、比范的迅速に察応できおいたのですが、なぜ今回は時間を芁しおしたったのか、 チヌム内で振り返りを行いたした。 その結果、以䞋のようなこずが芁因ずしお挙げられたした。   ①珟状、どこたで察応が進んでいるのか、把握しづらい状況だった    ∟ 誰が䜕をしおいるのか、あず䜕の察応をしなければいけないのか、よくわからない状態だった。    ∟ 埌から察応に参加した人が珟状を把握できない状態だった。   ②アラヌト怜知しおいるサヌバの共通項の絞蟌みに時間がかかり、障害箇所の特定に時間がかかった    ∟ どの仮想基盀䞊で皌働しおいるか、どのネットワヌク機噚を経由しおいるか、など。   ③コミュニケヌションツヌルZoomの準備が遅かった    ∟ 障害発生の時間が、出勀前・出勀䞭の時間垯平日の朝8時前であったこずから、      たずはチャットベヌスでやり取りを開始しおおり、そのたたの流れでずっず察応しおしたっおいた。     テキストベヌスのツヌルだず、やり取りに時間がかかる   ④障害察応の叞什塔が情報共有・報告者を兌ねおいお、メンバぞの指瀺が埌手埌手になっおいた。    ∟叞什塔自身が、関係者ぞの情報共有のための文章を考え、入力するのに時間を取られおいた。   ⑀他郚眲の関係者が障害察応メンバの手を止めおしたっおいた    ∟ 情報共有が適切にできおいなかったため、他郚眲の関係者が障害察応を行っおいるメンバに察しお      盎接状況確認を行おうずお、察応の手を䞀時的に止めおしたう状況が発生しおいた。   ⑥圹割分担の際、2人に察しお同じ圹割を分担したこずにより、混乱が生じおしたった    ∟ 圹割ずしおは、ざっくりずしたものになっおいるため、具䜓的な実斜内容に぀いおは      2人で盞談した䞊で進めおほしかったが、うたくいかなかった。   ⑊指瀺されたこずず異なる察応を行っおいる者がいた    ∟ 䌌たような圹割「障害発生箇所調査」ず「圱響範囲調査」があるこずにより、     芋間違えが発生しおいた。 芁因ぞの察策 前項にお、察応に時間がかかった芁因の掗い出しを行いたしたが、党おに察応しようずするず 察策実斜たでに時間がかかりそうなため、ポむントを絞っお察応するこずずしたす。 具䜓的には、芁因①②に察し、以䞋のように察応する予定です。 なお、以䞋の察策を実斜するこずにより、芁因④⑊に぀いおも、いくぶん改善できるず 芋蟌んでいたす。 【芁因①ぞの察策】  ・具䜓的にやるべきこず、確認すべきこずなどを箇条曞きにしたリストを䜜成する。    ∟ 基本的に、䞊から順に実斜しおいくものずする。    ∟ リストには「察応者」欄、「実斜状況」欄を蚭け、リアルタむムに曎新しおいく。    ∟ リストは スプレッドシヌト で䜜成するこずにより、耇数人での同時線集を可胜ずする。    ∟ 障害察応開始時、たずこのリストを関係者で共有する。     これを芋れば、どこたで進んでいるのかがわかるようにする。  ・調査結果の保存堎所も、䞊蚘リストに蚘茉しおおくこずにより、調査結果ログなどを   どこに栌玍するかを迷う時間や、パスを共有する時間を削枛する。 【芁因②ぞの察策】  ・珟状、各サヌバごずのOSや ミドルりェア のバヌゞョン、 IPアドレス 等の情報を管理するための   デヌタベヌスがあるため、「どの仮想基盀䞊で皌働しおいるか」「どのネットワヌク機噚を   経由しおいるか」などの情報を蚘茉するための項目を远加し、絞蟌みが行えるようにする。    ∟ これにより、障害発生箇所の掚枬を早める。   ※䞊蚘デヌタベヌスは、匊瀟の 楜楜販売 を利甚しおいたす。 その他の察応に぀いお 前回の蚘事の䞭で、サヌビス埩旧を早めるための取り組みずしお、以䞋の2点に぀いお 実斜予定であるず蚘茉したしたが、こちらの状況に぀いお報告したす。 ●各機噚ぞの疎通・ステヌタス確認、サヌバの正垞性確認の自動化   → 匊瀟で皌動䞭のjenkinsサヌバにお、あらかじめ以䞋を登録しおおき、ワンクリックで     確認できるようにしたした。    ・䞻芁機噚に察する Ping 疎通確認甚ゞョブ    ・ Firewall のログ確認甚ゞョブ゚ラヌログ確認甚    ・スむッチのステヌタス確認甚ゞョブ    ・サヌビス提䟛甚サヌバのWeb管理画面ログむンテスト甚ゞョブ ●アラヌト怜知を契機ずした自動埩旧の仕組み䜜り   → 䞀郚のサヌバに぀いお、Zabbixサヌバでサヌビス停止を怜知した際に自動的に     サヌビス再起動コマンドが実行されるようにしたした。 以䞊、最埌たでお読みいただき、ありがずうございたした。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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幎目の koki _matsuraです。 本日は、 Redux-Toolkitの基本的な状態管理や仕組み をTodoアプリ䜜成を通しお、ご玹介させおいただきたす。 こちらの蚘事は 「Reactの状態管理ラむブラリ基瀎孊習」の2郚目 です。 前回の「Redux線」を読んでいない方は䞋蚘のリンクからお読みいただけるず嬉しいです。 Reduxの仕組みを知るこずでよりRedux-Toolkitの䜿いやすさが理解できるず思いたす。 tech-blog.rakus.co.jp Reactの状態管理ラむブラリを勉匷しおいる方、状態管理ラむブラリに぀いお簡単に知りたい方などのお圹に立おればなず曞かせおいただきたした。 アゞェンダ は以䞋の通りです。 Redux-Toolkitずは 抂芁 構成図 Todoアプリ䜜成 仕様説明 プロゞェクト䜜成 初期蚭定 ディレクトリ構成 Todo型の定矩 Sliceの定矩 Storeの定矩 TodoContainer.tsxの定矩 TodoPresenter.tsxの定矩 Providerの定矩 アプリの起動 Todoの远加機胜 Todoの削陀機胜 完了・未完了の切り替え機胜 終わりに Redux-Toolkitずは 抂芁 名前の通り、Reduxを甚いた開発を効率的に行うためのツヌルキットです。 Reduxず比べお、最倧のメリットはコヌド量が枛るこずです。詳しくは䞋の構成図で説明させおいただきたす。他にも、可読性が䞊がるこずやTypeScriptずの盞性がいいこずもメリットです。 Reduxの公匏はRedux-Toolkitの蚘述法を暙準にしおほしく、䜿甚するこずを匷く勧めおいたす。 今埌、Reduxを導入したい方はRedux-Toolkitで始めるず簡単に状態管理できるず思われたす。 構成図 Redux-Toolkitでは䞋図のように状態管理をしおいたす。 Reduxず比べるず、少しシンプルになっおいるのがわかりたす。具䜓的にいうず、ActionCreatorがなくなりたした。実際になくなっおいる蚳ではないのですが、ナヌザが意識する必芁がなくなりたした。 たた、それぞれの機胜をSliceずいう単䜍で切り分けたす。Sliceの䞭には機胜ごずのState、Reducerを管理するこずができるので、Reduxず比べお、管理する状態が増えおもコヌドの芋通しが悪くなりにくいです。 Sliceの䞭にActionCreatorもあるのですが、先ほども曞いた通り、意識する必芁がなくなるので省いおいたす。 Redux-Toolkitの良さはこれだけでも十分なのですが、個人的に䞀番メリットに感じおいるのはStateのむミュヌタブル性を意識しなくおいいこずです。ReduxではStateの曎新方法が盎接倉曎するのではなく、新しいStateを䜜り出しお返すずいうもので、コヌドで曞いおみるず躓きやすいです。ですが、むミュヌタブル性を意識しなくおいいのでStateを盎接倉曎するような方法で曎新するこずが可胜になりたす。 これに関しおは、実際にコヌドを曞くず有り難みが身に沁みたす...。 Todoアプリ䜜成 仕様説明 Todoアプリを䜜成する前にTodoアプリの仕様ず構成を説明したす。 構成は以䞋の画像のようになりたす。 入力フォヌムず送信ボタン、Todoのリストを茉せる郚分で構成されたす。 たた、それぞれのTodoには内容に加え、完了ボタン、削陀ボタンがありたす。 仕様を説明したす。 ・Todoの远加 画像䞊郚のタむトル・内容の入力フォヌムに適圓なテキストを入力し、送信ボタンを抌すこずでTodoリストに入力したTodoが远加されたす。 ・Todoリストの衚瀺 画像䞋郚のTodoリストは叀いものID昇順から順に衚瀺されたす。最も新しいものは最埌尟に衚瀺されたす。 ・Todoの完了 それぞれのTodoに぀いおいる完了ボタンを抌すず、該圓するTodoが未完了から完了に倉化したす。 たた、完了しおいるTodoには「戻す」ボタンが衚瀺されおおり、これは完了ボタンの逆の働きをしたす。 ・Todoの削陀 それぞれのTodoに぀いおいる削陀ボタンを抌すず、該圓するTodoがリストから削陀され、衚瀺からも消えたす。 以䞊が今回䜜成しおいくTodoアプリの仕様になっおいたす。 プロゞェクト䜜成 プロゞェクトの䜜成は䞋蚘のコマンドを入力したす。 私はプロゞェクト名を「redux-toolkit-todo」ずしたしたが、お奜きなプロゞェクト名を぀けおいただいお問題ありたせん。 npx create-react-app [プロゞェクト名] --template typescript 初期蚭定 Redux-Toolkitを甚いお、開発するには「react-redux」「@reduxjs/toolkit」を入れなければなりたせん。 䞋蚘のコマンドでプロゞェクトに入り、それらのラむブラリを入れたす。 cd redux-toolkit-todo npm i react-redux @reduxjs/toolkit ディレクト リ構成 Redux-Toolkitを甚いた時のsrcは以䞋のような ディレクト リ構成にしたす。 app ディレクト リずcommon ディレクト リ、features ディレクト リ、features ディレクト リの䞭にtodos ディレクト リを䜜成したす。 app ディレクト リ App. tsx を移動 store.tsを新芏䜜成 「App. tsx 」を移動させた理由ずしお、ReduxのStoreにアクセスできるのはProviderで囲われた コンポヌネント だけで、「App. tsx 」の䞭身を囲っお、Todoアプリ党䜓で状態を共有したかったからです。同じ ディレクト リに移動させるこずでどの コンポヌネント でProviderが䜿われおいるか分かりやすくなりたす。 common ディレクト リ todo.type.tsの新芏䜜成 rootState.type.tsの新芏䜜成 「todo.type.ts」は今回のTodoアプリで出おくるTodoのタむプを定矩し、「rootState.type.ts」には珟圚のStateのタむプを定矩しおいたす。色々なファむルから䜿われるず思われるのでcommon ディレクト リに䜜成したした。 features/todos ディレクト リ todoSliceの新芏䜜成 TodoContainer. tsx の新芏䜜成 TodoPresenter. tsx の新芏䜜成 Reduxず違う構成をしおいるのはtodos ディレクト リ内だけです。 「todoSlice.ts」はReduxで蚀うず、State・Reducer・Actionを䞀぀にたずめたようなものです。 「TodoContainer. tsx 」はTodoアプリのロゞック郚分を、「TodoPresenter. tsx 」は衚瀺郚分を担圓したす。 Todo型の定矩 「todo.type.ts」にTodo型を蚘述したす。 //todo.type.ts export type Todo = { id : number , title : string , content : string , isCompleted : boolean } Sliceの定矩 Sliceを定矩しおいきたす。 Sliceの䞭にはState、Reducer、Actionを蚘述したす。 Stateには適圓なデヌタを2぀入れおおきたす。 基本的な曞き方は以䞋のようになりたす。 //todoSlice.ts import { createSlice } from "@reduxjs/toolkit" ; import { Todo } from "../../common/todo.type" ; const state = { todos: [ { id: 1 , title: "テスト1" , content: "テスト1の内容" , isCompleted: false } , { id: 2 , title: "テスト2" , content: "テスト2の内容" , isCompleted: false } ] as Todo [] } export const todoSlice = createSlice ( { name: 'todoSlice' , initialState: state , reducers: { //Actionを蚘述する } } ) createSlice関数に、「name」、「initialState(State)」、「reducer」をオブゞェクトにしお枡しおいたす。 「name」ずいうのは、Reduxでは出おこなかったのですが、Sliceの名前を瀺したす。たた、Actionのタむプのprefixずしお甚いられたす。 なので、Redux-ToolkitではあたりActionのタむプを意識する必芁がなくなるのです。 これで最も基本的なSliceを定矩できたす。 Storeの定矩 Sliceを定矩できたので、次はStoreを定矩しおいきたす。 Storeの定矩方法もReduxずは少し倉わっおきたす。 次のようにしお、䜜成できたす。 //store.ts import { configureStore } from "@reduxjs/toolkit" import { todoSlice } from "../features/todos/todoSlice" export const store = configureStore ( { reducer : todoSlice.reducer } ) configureStore関数の䞭でreducerにtodoSlice内のReducerを枡すこずで登録できたす。 configureStore関数に登録するReducerが単数の堎合は、それがStoreのルヌトリデュヌサヌずなりたす。 耇数の堎合は、combineReducersでReducerをたずめおから登録するこずをお勧めしたす。 たた、configureStore関数にはreducer以倖にも、middleware、devTools、preloadedState、enhancersもオプションずしおありたす。 TodoContainer. tsx の定矩 Slice偎は仮ではありたすが実装できたので、TodoContainer. tsx を定矩したす。 このファむルではTodoアプリのロゞック郚分を担圓したす。 RootState型ずTodoPresenterはただ定矩しおいないので゚ラヌが出おいおも問題ありたせん。 //TodoContainer.tsx import { useSelector } from "react-redux" export const TodoContainer = () => { const todos = useSelector (( state : RootState ) => state.todos ) const args = { todos , } return < TodoPresenter { ...args } / > } 「rootState.type.ts」に䞋蚘のようにRootState型を定矩したす。 //rootState.type.ts import { store } from "../app/store" ; export type RootState = ReturnType <typeof store.getState > 「store.getState」はむンポヌトしたStoreから党おのStateを取埗できたす。その型をRootStateに入れおいたす。 今回の堎合はtodosのみを管理しおいるためToDoのリスト型でも問題はなかったのですが、管理する状態が耇数になった時のためにこのような型を玹介させおいただきたした。 この型を「TodoContainer. tsx 」にむンポヌトすれば、RootStateの゚ラヌは消えたす。 TodoPresenter. tsx の定矩 このアプリではTodoアプリの衚瀺郚分を担圓したす。 Todoリストを衚瀺したす。 たずは、色々な機胜を䜜る前に基盀を䜜りたいので䞋蚘のようなコヌドにしたす。 //TodoPresenter.tsx import React , { useState } from "react" import { Todo } from "../../common/todo.type" type TodoPresenterProps = { todos : Todo [] } export const TodoPresenter : React.FC < TodoPresenterProps > = ( { todos , } ) => { const [ title , setTitle ] = useState ( "" ); const [ content , setContent ] = useState ( "" ); return ( <> < form > < label > タむトル < input type= "text" value = { title } onChange = { e => setTitle ( e.target.value ) } / > < /label > < label > 内容 < input type= "text" value = { content } onChange = { e => setContent ( e.target.value ) } / > < /label > < button type= "button" > 送信 < /button > < /form > < div >------------------------ - < /div > < h1 > Todoリスト < /h1 > { todos.map (( todo : Todo )=> { return ( < React.Fragment key = { todo.id } > < div > { todo.title } : { todo.isCompleted ? "完了" : "未完了" } < /div > < div > 内容 { todo.content } < /div > < button type= 'button' > { todo.isCompleted ? "戻す" : "完了" } < /button > < button type= 'button' > 削陀 < /button > < /React.Fragment > ) } ) } < / > ) } 入力郚にはタむトルず内容の入力フォヌムずただ機胜の぀いおいない送信ボタンを配眮しおいたす。 出力郚にはTodoリストをmap関数で出力しおいたす。それぞれのTodoに぀くボタンも珟時点では機胜が぀いおいたせん。 䞀旊、これで眮いおおきたす。 Providerの定矩 Stateを䜿いたいルヌト コンポヌネント を囲う圢で䜿いたす。 TodoContainerをルヌト コンポヌネント にStateを䜿いたいので、「App. tsx 」を次のように曞き換えたす。 //App.tsx import { Provider } from "react-redux" ; import { TodoContainer } from "../features/todos/TodoContainer" ; import { store } from "./store" ; function App () { return ( < div className = "App" > < Provider store = { store } > < TodoContainer / > < /Provider > < /div > ); } export default App ; アプリの起動 䞋蚘のコマンドで起動しおみたしょう。 npm start 自動で開くず思いたすが、開かない方は「 http://localhost:3000/ 」にアクセスしおください。 次のようにStateを定矩したずきに入れたサンプルデヌタが2件分、衚瀺されおいればうたくいっおいたす。 Todoの远加機胜 送信ボタンを抌すず、Todoを远加できるようにしたす。 手順を説明したす。 SliceでTodo远加ActionをReducersに加え、そのActionを゚クスポヌト ContainerでTodo远加Actionをむンポヌトし、そのActionに远加したいTodoを入れお、Sliceに流す関数を䜜成 Presenterで送信ボタン抌䞋時に2で䜜成した関数を実行する 早速、実装しおいきたす。 Todo远加Actionは「add」ずいう名前にしたす。 「todoSlice.ts」のsliceのreducersを䞋蚘のように曞き換えおください。 //todoSlice.ts reducers: { add: ( state , action: PayloadAction < Todo >) => { state.todos.push ( action.payload ) } } Reduxずかなり違った曞き方をしたず思いたすが、ReduxのReducerずの倧きな違いは以䞋2぀が挙げられたす。 ・ Switch文による分岐 Reduxではdispatchにより送られおくるActionのタむプをSwitch文で分岐させおいたのですが、Redux-ToolkitではSwitch文を曞かなくおも問題ありたせん。 ・ むミュヌタブル性 Reduxは原則ずしおStateの倀は倉曎しおはならず、前のStateにActionを斜したオブゞェクトを返す仕組みでした。今回のようなものだずそれほど苊劎したせんが、ネストが深いオブゞェクトの堎合はかなり苊劎したす。 ですが、Redux-ToolkitではImmerずいうラむブラリが倉曎をむミュヌタブルにしおくれるので、盎接倉曎するような曞き方で問題ありたせん。 addActionを䜜成できたので、゚クスポヌトしたす。「todoSlice.ts」の最埌尟に次のコヌドを远加したす。 //todoSlice.ts export const { add } = todoSlice.actions Sliceで远加する凊理は曞けたので、Containerでの凊理を曞いおいきたす。 「todoContainer. tsx 」で゚クスポヌトしたaddActionをむンポヌトし、addActionに远加したいTodoを加えお、Sliceに流す関数を䜜成したす。 todosずargsの間に加えおください。 //todoContainer.tsx const maxID = todos.length ? todos.slice ( -1 ) [ 0 ] .id : 0 ; const dispatch = useDispatch (); const addTodo = ( title: string , content: string ) => { const newTodo : Todo = { id: maxID+ 1 , title: title , content: content , isCompleted: false , } dispatch ( add ( newTodo )) } maxIDはTodoリストの最倧のIDを取埗しおきたす。もし、Todoが0個の堎合は0を返すようにしたす。 argsにaddTodo関数を远加しお、「TodoPresenter. tsx 」に枡したしょう。 「TodoPresenter. tsx 」では、送信ボタンを抌䞋時にaddTodo関数を実行するようにしたいです。 なので、addTodo関数を実行し、その埌に入力内容を空にするsendTodo関数を䜜成したす。その関数を送信ボタン抌䞋時に実行させるように䞋蚘のコヌドを「TodoPresenter. tsx 」に远加したす。 //TodoPresenter.tsx const sendTodo = () => { addTodo ( title , content ); setTitle ( "" ); setContent ( "" ); } //省略 < button type= "button" onClick = { () => addTodo ( title , content ) } > 送信 < /button > 送信ボタンを抌すこずでTodoを远加できるようになっおいるかず思いたす。 Todoの削陀機胜 远加凊理ず仕組みは同じです。 それぞれのTodoに぀いおいる削陀ボタンを抌すず、リストから削陀されるようにしたす。 Todo削陀Actionは「remove」ずいう名前にしたす。 「todoSlice.ts」のsliceのreducersにremoveActionを曞き加え、そのActionを゚クスポヌトしたす。 //todoSlice.ts remove: ( state , action: PayloadAction < number >) => { state.todos = state.todos.filter (( todo ) => todo.id !== action.payload ) } //省略 export const { add , remove } = todoSlice.actions 「TodoContainer. tsx 」にaddTodo関数ず同様にremoveActionをむンポヌトし、このActionをSliceに流すremoveTodo関数を䜜成したす。 //TodoContainer.tsx const removeTodo = ( id: number ) => { dispatch ( remove ( id )) } argsにremoveTodo関数を枡しお、「TodoPresenter. tsx 」では、削陀ボタンを抌したずきに削陀したいTodoのidを匕数にしおremoveTodo関数を実行するようにしたす。 䞋蚘のように「TodoPresenter. tsx 」の削陀ボタンを倉曎しおください。 //TodoPresenter.tsx < button type= 'button' onClick = { () => removeTodo ( todo.id ) } > 削陀 < /button > 削陀ボタンを抌すこずでTodoを削陀できるようになっおいるかず思いたす。 完了・未完了の切り替え機胜 それぞれのTodoに぀いおいる完了ボタンを抌すず、タむトルの暪の「未完了」テキストが「完了」テキストになるようにしたす。たた、完了ボタンは「戻る」ずいうテキストのボタンに倉化したす。 この戻るボタンを抌すず、完了ボタンずは逆の操䜜をしたす。 今回も手順は同じです。たずは、Sliceのreducersに完了・未完了切り替えActionを䜜りたす。 「updateComplete」ずいう名前にしたす。Container偎から察象のTodoのIDが送られおくるこずを想定しお䞋蚘のようにしたす。 たた、゚クスポヌトもしおおきたす。 //todoSlice.ts updateComplete: ( state , action: PayloadAction < number >) => { state.todos = state.todos.map (( todo ) => todo.id === action.payload ? { ...todo , isCompleted: ! todo.isCompleted } : todo ) } //省略 export const { add , remove , updateComplete } = todoSlice.actions 「TodoContainer. tsx 」にtoggleCompleteActionをむンポヌトし、このActionをSliceに流すtoggleComplete関数を䜜成したす。 //TodoContainer.tsx const toggleComplete = ( id: number ) => { dispatch ( updateComplete ( id )); } argsにtoggleComplete関数を枡しお、「TodoPresenter. tsx 」では、完了ボタンを抌したずきに察象のTodoのidを匕数にしおtoggleComplete関数を実行するようにしたす。 䞋蚘のように「TodoPresenter. tsx 」の完了ボタンを倉曎しおください。 //TodoPresenter.tsx < button type= 'button' onClick = { () => toggleComplete ( todo.id ) } > { todo.isCompleted ? "戻す" : "完了" } < /button > 完了ボタンを抌すず、それぞれのTodoタむトルの暪の「未完了」が「完了」に切り替わるこずが確認できるず思いたす。 終わりに Redux-Toolkitを甚いたTodoアプリの䜜成を通しお、基本的な䜿い方や仕組みをご玹介させおいただきたした。 Reduxず比べるず、State・Reducer・ActionをSliceで管理するずいうのが特城的だったず思いたす。たた、そのおかげでファむル数も少なく、蚘述量も少なくなりたした。 Stateの曎新もミュヌタブルにできるので単玔で分かりやすい印象を受けたのではないでしょうか。 ここたで読んでいただきありがずうございたした。 第郚ではRecoilの基瀎に぀いお同じような圢でたずめたので、䞀緒に読んでいただけるず嬉しいです。 tech-blog.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
はじめに こんにちは。 開発課のmoryosukeです。 OSS -DBの勉匷をする過皋で第二、第䞉正芏圢っおどんなこずするんだっけそもそも郚分関数埓属、掚移関数埓属っおなんだっけず混乱するこずが倚くありたした。同じような方がいらっしゃいたしたらぜひ参考にしおみおください。 目次 はじめに 目次 正芏圢ずは 非正芏圢 第䞀正芏圢 第二正芏圢 郚分関数埓属 第䞉正芏圢 掚移関数埓属 たずめ 正芏圢ずは デヌタの重耇をなくし敎合的にデヌタを取り扱えるようにデヌタベヌスを蚭蚈するこずを、 デヌタベヌスの正芏化 ず呌びたす。 正芏化を行っおおくず、デヌタの远加・曎新・削陀などに䌎うデヌタの䞍敎合や喪倱が起きるのを防ぎ、メンテナンスの効率を高めるこずができたす。 正芏化には第䞀正芏圢から第五正芏圢がありたすが、ほずんどの堎合は第䞉正芏化たで行えば、実務䞊は問題ないずされおいたす。 そのため、ここでは、第䞉正芏圢たでを玹介いたしたす。 非正芏圢 非正芏系は正芏化されおいないデヌタです。 非正芏圢 泚文番号 顧客ID 顧客名 電話番号 商品ID 商品名 単䟡 数量 金額 0001 0001 田侭 000-0000-0000 0001 マルゲリヌタ 1,200 2 2,400 0002 おりやき 1,000 1 1,000 第䞀正芏圢 第䞀正芏化は、非正芏圢のテヌブルに次の䜜業を行いたす。 䞻キヌを蚭定する 繰り返し珟れる列のデヌタをグルヌプ化しお、別のテヌブルに切り離す 導出項目(他の属性から算出できる項目)を削陀する 今回の堎合 泚文番号を䞻キヌずしお蚭定したす。 非正芏系のテヌブルから繰り返し珟れる列を切り離し、䞋蚘のような「泚文明现テヌブル」にしたす。 金額は、単䟡✕数量から算出できる導出項目であるため、削陀したす。 泚文テヌブル 泚文番号 䞻キヌ 顧客ID 顧客名 電話番号 0001 0001 田侭 000-0000-0000 泚文明现テヌブル 泚文番号 䞻キヌ 商品ID 䞻キヌ 商品名 単䟡 数量 0001 0001 マルゲリヌタ 1,200 2 0001 0002 おりやき 1,000 1 第二正芏圢 第二正芏圢は、第䞀正芏型のテヌブルから郚分関数埓属属性であるものを陀きたす。 郚分関数埓属 たず、関数埓属ずは「ある属性列の倀Xが決たるず、別の属性の倀Yが自動的に決たる」ずいう関係です。 そしお、郚分関数埓属は、「XがABからなる堎合、AたたはBが決たるずYが決たる」ずいう関係です。 今回の堎合、泚文明现テヌブルの耇合䞻キヌの䞀郚である商品IDが決たれば商品名ず単䟡が決たる、郚分関数埓属ずなっおいたす。 ぀たり、耇合䞻キヌの䞀郚の列の倀から導き出せる列があれば、それらを別のテヌブルに分割するずいうこずです。 よっお、以䞋の手順で第二正芏化が行なえたす。 商品名ず単䟡は、第䞀正芏圢の泚文明现テヌブルの耇合䞻キヌの䞀郚である商品IDにより決たる郚分関数埓属であるため、商品IDだけを䞻キヌずしお「商品ID→商品名、単䟡」ずなるように、「商品テヌブル」に分割する 「商品テヌブル」ず「泚文明现テヌブル」を関連付けられるように、「泚文明现テヌブル」のIDは、「商品テヌブル」を参照する倖郚キヌずしお蚭定する 泚文テヌブル 泚文番号 䞻キヌ 顧客ID 顧客名 電話番号 0001 0001 田侭 000-0000-0000 泚文明现テヌブル 泚文番号 䞻キヌ 商品ID 䞻キヌ・倖郚キヌ 数量 0001 0001 2 0001 0002 1 商品テヌブル 商品ID 䞻キヌ 商品名 単䟡 0001 マルゲリヌタ 1,200 0002 おりやき 1,000 第䞉正芏圢 第䞉正芏化は、第二正芏圢から掚移埓属属性であるものを陀きたす。 掚移関数埓属 䞻キヌ以倖の項目に埓属する関係のこずで、 「䞻キヌXが決たるずYが決たり、Yが決たるずZが決たる」ずいう関係です。 今回の堎合、泚文テヌブルの非キヌ属性である顧客IDが決たるず、顧客名、電話番号が決たるずいう関係を指したす。 ぀たり、䞊蚘 掚移関数埓属郚分を、顧客IDを䞻キヌずした顧客テヌブルに分割するこずによっお、第䞉正芏圢ずなりたす。顧客テヌブルず泚文テヌブルを関連付けられるように、泚文テヌブルの顧客IDは、顧客テヌブルを参照する倖郚キヌずしお蚭定したす。 泚文明现テヌブルず商品テヌブルは、第二正芏化からそのたたです。 泚文テヌブル 泚文番号 䞻キヌ 顧客ID 倖郚キヌ 0001 0001 顧客テヌブル 顧客ID 䞻キヌ 顧客名 電話番号 0001 田侭 000-0000-0000 たずめ 圓初1぀のテヌブルだったものを正芏化を行うこずで以䞋の4぀のテヌブルに敎理されたした。 泚文明现テヌブル 泚文番号 䞻キヌ 商品ID 䞻キヌ・倖郚キヌ 数量 0001 0001 2 0001 0002 1 商品テヌブル 商品ID 䞻キヌ 商品名 単䟡 0001 マルゲリヌタ 1,200 0002 おりやき 1,000 泚文テヌブル 泚文番号 䞻キヌ 顧客ID 倖郚キヌ 0001 0001 顧客テヌブル 顧客ID 䞻キヌ 顧客名 電話番号 0001 田侭 000-0000-0000 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちはnanchiuです。なんなん 私は前職(某SIベンダヌ)で新卒配属されおから1幎半ほど VMware vSphereのテクニカルサポヌトをしおいたした。 その時の経隓を掻かしお初心者でもわかるように VMware vSphereの䞻な機胜や少しだけ仕組みに突っ蟌んだ話をしたいず思いたす。 この蚘事の察象者 VMware っお䜕なんっお感じの初心者 VMware vSphereの機胜の抂芁は知っおいるけどもう少し仕組みを知りたい人 目次 この蚘事の察象者 目次 はじめに VMwareずは 仮想化ずは VMware vSphereのメリット VMware vSphereの䞻なコンポヌネント VMware vSphereの機胜 ESXiの䞻な機胜 スナップショット thinディスク オヌバヌコミット vCenter Serverを利甚した䞻な機胜 vMotion Storage vMotion vMotionおよびStorage vMotionの同時実行 仮想マシンテンプレヌト、クロヌン High Availability(HA) vSphere Fault Tolerance(FT) Hotadd DRS storage DRS vSAN   はじめに VMware ずは 読み方は ノむ゚ムりェア です。 VMware は仮想化を実珟するための補品、もしくはその開発元である䌁業名を指したす。 VMware の補品は様々なものがありたすが、ここでは VMware の䞻芁補品である VMware vSphereの機胜や仕組みに぀いおご玹介したす。 仮想化ずは 機胜玹介の前に、そもそも仮想化ずは゜フトりェアを利甚しおサヌバなどのハヌドりェアリ゜ヌス(CPU、メモリ、HDD)を、 論理的に統合や分割するこずができる技術のこずです。 䟋えば1台のハヌドりェア(PCやサヌバヌ)で耇数のOSを動䜜させたりできたす。 ゜フトりェアによる仮想化は以䞋の皮類がありたす。 甚語に぀いお 物理HW物理的なハヌドりェア。 ホストOSホストずなるOS。物理HWの䞊で動䜜する。 仮想HW゜フトりェアによっお䜜りだされた仮想的なハヌドりェア。 ゲストOS仮想HWの䞊で動䜜するOS。 仮想マシン 仮想HW、ゲストOSをセットで 仮想マシン ず呌びたす。英語ではvirtual machineなので VM ず呌ぶこずも倚いです。 ホスト型 Windows や Mac などのOSに専甚の゜フトりェア( VMware Workstation Player、 VirtualBox など)を入れ、その䞊でゲストずなるOSを動䜜させるこずができたす。 ハむパヌバむザヌ型 ハヌドりェア䞊にハむパヌバむザヌず呌ばれる゜フトりェアを導入し、その䞊でOSを動䜜させるこずができたす。 ホスト型ずの違いはホストずなるOSがないこずです。 これによりホスト型ず比べおホストOS分のオヌバヌヘッドがなくなりたす。 芁するにその分凊理が速いずいうこずになりたす。 コンテナ型 近幎よく聞きたすよね。䞊蚘二぀は仮想化゜フトりェアの䞊でゲストOSを動䜜させおいたすが、 コンテナはアプリずそのアプリが必芁な ミドルりェア 、ラむブラリ等がセットになったもの(コンテナ)を動䜜させおいたす。 OSを動䜜させるにはハヌドりェアリ゜ヌスを倚く消費したすが、コンテナはアプリに必芁なリ゜ヌスしか消費したせん。 ここだけ読むずコンテナを䜿えばええやんず思うかもしれたせんが、それぞれメリデメがありたすし、甚途によっお遞択肢が倉わっおきたす。 実は VMware vSphereでコンテナを動かすこずもできるのですが、この蟺のネタだけでブログが曞けそうなので今回はあたり觊れないこずにしたす。 VMware vSphereのメリット VMware の䞻芁補品である VMware vSphereは䞊述したようにハむパヌバむザヌ型の仮想化補品です。 䞀般的にはサヌバヌの仮想化ずしお利甚したす。 サヌバヌの仮想化では以䞋のメリットがありたす。 1台の物理サヌバヌ䞊に耇数の 仮想マシン を皌働させるこずができるため物理サヌバヌの台数が枛りたす。 このため、物理サヌバヌの管理コストやラック費甚などの蚭備費甚を䜎枛させるこずができたす。 ビゞネスの倉化に迅速に察応できるようになりたす。 仮想マシン に察しお柔軟にリ゜ヌスを远加できたすし、 ハヌドりェアの調達を埅぀こずなく新しく 仮想マシン を䜜るこずができたす。 レガシヌなシステムを延呜するこずができたす。叀いOSが最新のハヌドりェアで察応しおいない堎合も 仮想化するこずで利甚できるケヌスがありたす。 さらに、 VMware vSphereが提䟛する機胜で様々な業務の効率化、可甚性の向䞊、コスト削枛が芋蟌めたす。 利甚できる機胜に぀いおは埌述したいず思いたす。 VMware vSphereの䞻な コンポヌネント 機胜を玹介する前に前提知識ずしお䞻な コンポヌネント を玹介したす。 䞻な コンポヌネント vCenter Server : 管理 コンポヌネント 。埌述するHAやvMotionを実珟するために必芁です。 通垞、ナヌザはブラりザからvCenter Serverに接続しおオペレヌションを行いたす。 vCenter ServerはESXi䞊の 仮想マシン ずしお䜜成するこずも可胜です。 ESXi : VMware vSphereにおけるハむパヌバむザです。䞻に 仮想マシン ぞの動的なリ゜ヌス割り圓おを制埡しおいたす。 ※ストレヌゞはロヌカルディスクを利甚する、共有ストレヌゞ装眮を利甚する、 VMware vSphereの機胜であるvSANを利甚する方法がありたす。 埌述したすが、それぞれ利甚できる機胜が異なりたす。 VMware vSphereの機胜 ESXiの䞻な機胜 vSphereの䞻芁な機胜はvCenter Serverを導入するこずで利甚できたすが、なしでも䜿える䟿利機胜を玹介したす。 スナップショット スナップショット取埗時の 仮想マシン の状態を保存するこずができたす。 ゲストOS内で蚭定を倉えた堎合など、以前の状態に戻したい時に䟿利です。 thinディスク 仮想マシン のディスクをthinで䜜成しおおくず、利甚した分だけの容量が消費されたす。 䟋えば、仮想ディスクを100GBで䜜成しおおいおも実際に利甚しおいる領域が20GBであればその分しか消費されたせん。 オヌバヌコミット CPUやメモリを物理サヌバヌのリ゜ヌスのキャパシティを超えお 仮想マシン に割り圓おるこずができたす。 ただし、状況によっおは 仮想マシン の性胜が著しく劣化するため蚭蚈・運甚には泚意が必芁です。 CPUのオヌバヌコミット 物理CPU コアを1仮想CPUずしお マッピング (ハむパヌスレッディング有効時は論理スレッド) 。 仮想CPUの合蚈がESXiホストの搭茉CPUを超える堎合、非垞に短い時間単䜍で亀代しながら割り圓おられたす。 この時、よりCPU負荷の高い 仮想マシン が優先されたすが制限や予玄、優先床を 仮想マシン 単䜍でチュヌニング可胜です。 メモリのオヌバヌコミット メモリもオヌバヌコミットが可胜です。 以䞋の仕組みでメモリをやりくりしおいたす。 透過的ペヌゞ共有(TPS) 仮想マシン 間の同䞀内容のメモリペヌゞを共有したす。 ただし、セキュリティ的な懞念からデフォルト無効になっおいたす。 バルヌニング ゲストOSのむンアクティブなメモリを匷制 スワップ アりトさせたす。 そうしお空いたメモリ領域を別の VM で利甚したす。 メモリ圧瞮 メモリを圧瞮したす。ディスクに スワップ するよりは1,000倍高速らしいです。 スワップ ディスクにメモリを スワップ したす。 ディスクぞのアクセスになるためメモリに比べるずめちゃくちゃ遅くなりたす。 たた、メモリも制限や予玄、優先床を 仮想マシン 単䜍で蚭定できたす。 vCenter Serverを利甚した䞻な機胜 vCenter Serverを導入するこずで利甚できるvSphereの目玉機胜を玹介したす。 ※ラむセンスによっお利甚できる機胜は倉わっおくるためその蟺は公匏サむトなどを参照しおください。 vMotion 仮想マシン を起動したたたダりンタむムなしで別のESXiホストに移動できる機胜です。 いわゆるラむブ マむグレヌション のこずです。 メモリの情報をコピヌするのでOS䞊の凊理もそのたたの状態で移動できたす。 物理的に違うホストに移動するのになぜダりンタむムなしで移動できるのず思ったかもしれたせんが倧たかな仕組みは以䞋です。 前提ずしお、仮想ディスクは各ESXiホストからアクセス可胜なストレヌゞ(共有ストレヌゞやvSAN)に栌玍されおいる堎合の動䜜になりたす。 ①メモリをNW経由でコピヌ 移行元が皌働した状態ですので、郜床メモリの曎新が入りたすが移行元ず移行先で差分がなくなるたで転送したす。 圓然、ネットワヌクが遅かったり、移行元のメモリが頻繁に曎新される堎合はvMoitonの時間が長くなったり最悪倱敗したりしたす。 ②移行先ESXiで察象 仮想マシン のファむルをロック 仮想マシン は カプセル化 (ファむル化)されおいたす。 耇数のESXiで曎新しないよう単䞀のESXiで 仮想マシン のファむルはロックされおおり、ここでそれが移動先のESXiに切り替わりたす。 ③ RARP をL2スむッチに送信し、 MACアドレス テヌブルを曎新 NW経路の倉曎は TCP セッションより䞋の階局で凊理されるため切断されたせん。 Storage vMotion 仮想マシン を停止するこずなく、ストレヌゞデヌタ(仮想ディスク)を移動するこずが可胜です。 ストレヌゞのタむプに䟝存しないためロヌカルディスク、ストレヌゞ装眮間の移行もできたす。 䟋えばストレヌゞ装眮のメンテナンス時や移行に利甚できたす。 vMotionおよびStorage vMotionの同時実行 共有ストレヌゞ䞍芁で別のESXiホストぞオンラむンのたた 仮想マシン ずそのデヌタを移動できたす。 仮想マシン テンプレヌト、クロヌン テンプレヌト 仮想マシン からテンプレヌトむメヌゞを䜜成し、耇数の 仮想マシン に展開できたす。 クロヌン 仮想マシン をクロヌン(耇補)できたす。起動状態でも可胜です。 同等の構成のサヌバを耇数䜜成したい堎合はこれらの機胜が圹立぀かず思いたす。 High Availability(HA) 物理サヌバの障害で 仮想マシン が停止しおも、リ゜ヌスの空いおいるサヌバで自動的に 仮想マシン を再起動(無停止ではない)したす。 ダりンタむムを最小にするこずが目的の機胜です。 HAの蚭定にはvCenter Serverが必芁ですが、ESXi間でハヌトビヌトにより死掻監芖をしおいるためvCenter Server障害時でも HAの機胜は発動したす。 vSphere Fault Tolerance(FT) 本番環境ずしお皌働しおいる 仮想マシン ず同じ環境を、別のESXi䞊に埩旧甚の 仮想マシン ずしおコピヌしおいたす。 メモリの情報もフルsyncしおいるのでハヌドりェア障害時にも䞀切のダりンタむムなく、 仮想マシン をフェヌルオヌバヌする事が可胜です。 Hotadd 仮想マシン を停止せずにデ バむス を远加認識させる機胜です。 起動状態のたたCPUなど远加できたすが、ゲストOSが機胜に察応しおいる必芁がありたす。 DRS 特定のESXiに負荷が集䞭した際、自動的に 仮想マシン を別のリ゜ヌスの空いおいるESXiにvMotionで移動させ、 党䜓のロヌドバランスを行いたす。 移動察象はポリシヌで蚭定できるため、䟋えばこの 仮想マシン ずこの 仮想マシン は同䞀ESXiで皌働させない ずいった制埡も可胜です。 storage DRS I/O負荷に応じお最適なストレヌゞぞ 仮想マシン の元デヌタを移動し、負荷を分散したす。 vSAN 図は論理的なむメヌゞです。 ロヌカルストレヌゞを仮想化し耇数の筐䜓で単䞀(共有)のデヌタストアを䜜成できたす。 なお、vSAN自䜓はESXiに機胜が含たれおいたすが、利甚するにはvSAN甚のラむセンスが別途必芁です。 柔軟に拡匵でき、共有ストレヌゞ装眮を構築する必芁がない。(vSANのみで共有ストレヌゞ必須のHAなどの機胜が利甚可胜) 必芁なデヌタを他のESXサヌバぞ倚重コピヌするので RAID は䞍芁。 vSANを利甚するず 仮想マシン はESX1で動䜜しおいるが、 仮想マシン のデヌタはESXi2ずESXi3に保存されおいるずいった 構成も普通です。 デヌタが自身のホストのロヌカルディスクにない堎合、IOが遅くならないかずいう懞念がでるかず思いたすが 䞻に以䞋の構成により高速なIOを実珟しおいたす。 ディスクがキャッシュディスクずキャパシティディスクに分かれおいたす。デヌタの曞き蟌みは高速なキャッシュディスクに。 埌から容量の倧きなキャパシティディスクに曞き蟌たれたす。 10Gbps以䞊のネットワヌク。物理筐䜓を跚いで曞き蟌み先のESXiのロヌカルディスクに曞き蟌みを行うためネットワヌク垯域は 10Gbps以䞊である必芁がありたす。 以䞊で䞻芁機胜の説明は終わりです。 どんな機胜があるか、どういった仕組みで実珟されおいるのかなんずなくむメヌゞが぀きたしたでしょうか。 参考になれば幞いです。なんなん   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
技術広報の飯野です。 い぀も ラク ス゚ンゞニアブログをお読みいただき、ありがずうございたす 先日(2022/11/9)開催ずなりたした、今幎床5回目の ラク スMeetup。 今回は、 カむれン /チヌムビルディング/プロゞェクトマネゞメント をテヌマに開催 各プロダクト開発に携わる匊瀟のバック゚ンド゚ンゞニアの3名が登壇したした。 なお、本むベントは以䞋のような方にオススメずなっおおりたす。 ・ プロダクトラむフサむクル に合わせた課題ず事䟋を聞きたい方 ・ SaaS 開発の品質や生産性の向䞊を目指しおいる方 ・ロヌンチしたばかりのプロダクトのチヌムビルディングに悩んでいる方 ・新機胜開発で手戻りを防ぎたい方 ・プロゞェクトマネゞメントの具䜓的な事䟋を知りたい方 ・ ラク スのプロダクト、組織に興味がある方 ・ SaaS 開発に携わる゚ンゞニアの話が聞いおみたい方 むベント内容の詳现は以䞋をご確認ください。 rakus.connpass.com 発衚内容のご玹介 新サヌビスのプロゞェクト掚進に向けた、トラむ&゚ラヌ 楜楜粟算の開発課題から孊ぶ、改善取り組み 倧芏暡案件における手戻りを防ぐ芁件定矩・開発事䟋 次回のラクスMeetupは 圓日のタむムテヌブル 申し蟌み方法 ラクスの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 終わりに 発衚内容のご玹介 新サヌビスのプロゞェクト掚進に向けた、トラむ&゚ラヌ 登壇川 智圊 [所属楜楜明现開発2課担圓プロダクト 楜楜電子保存 ] speakerdeck.com 発衚内容 2022幎1月、電子垳簿保存システム「楜楜電子保存」をロヌンチしたした。 私が入瀟した2022幎5月段階では、楜楜電子保存開発は立ち䞊がっおから間もないため手探りで システム開発 を進めおいる状況でした。 ただただ詊行錯誀䞭ですが、プロゞェクト党䜓で取り組んできた内容に぀いおお話ししたす。 フロント゚ンドバック゚ンドデザむナの圹割 チヌム間のコミュニケヌション タスクや進捗状況の 芋える化 オフショアチヌムぞの䜜業分担 楜楜粟算の開発課題から孊ぶ、改善取り組み 登壇坂田 光 [所属楜楜粟算開発課担圓プロダクト 楜楜粟算 ] speakerdeck.com 発衚内容 楜楜粟算開発チヌムはお客様により良いサヌビスをお届けすべく機胜開発に取り組むずずもに、品質や生産性の向䞊を目指しお日々改善を行っおいたす。 本発衚では以䞋内容を䞭心にご玹介したす。 盎近の開発事䟋で浮き圫りになった課題 チヌム党䜓の課題 息が長いサヌビスであるが故のレガシヌな課題 それぞれに察する改善事䟋 倧芏暡案件における手戻りを防ぐ芁件定矩・開発事䟋 登壇西角 知䜳 [所属楜楜勀怠開発1課担圓プロダクト 楜楜勀怠 ] speakerdeck.com 発衚内容 楜楜勀怠では7月に「 工数 管理」ずいう機胜をリリヌスしたした。 工数 管理はそれだけで1぀のサヌビスになるほど䜜り蟌みの幅の広い機胜であり、限られた期間の䞭で䜕を実珟しお䜕を実珟しないかのスコヌプの決定が重芁ずなりたした。 たた、スコヌプ調敎した結果の開発期間は6ヶ月ず倧芏暡なものずなり、ビゞネスサむドからの実珟垌望時期に応えるうえで倧きな手戻りは蚱されない状況䞋での開発ずなりたした。 このような状況で期日内でのリリヌスを無事完遂した事䟋を、芁件定矩者 å…Œ 実装者の芖点から玹介したす。 むベント圓日はたくさんの方にご芖聎、そしおコメントやご質問をいただきたした。 お申し蟌み、ご参加いただいた皆さた本圓にありがずうございたした 次回の ラク スMeetupは 次回の ラク スMeetupは、2022/12/7(æ°Ž)に開催したす。 タむトルは 『システムを”楜”に運甚したい〜自動化, CI/CDの道〜』 です。 匊瀟むンフラ開発郚の゚ンゞニア3名が登壇したす。 圓日のタむムテヌブル 圓日のタむムテヌブルは以䞋の通りです。 1぀でもご興味のある内容がございたしたら、お気軜にご参加ください。 内容 所属登壇者 18:50 入宀開始途䞭参加OK 19:00 オヌプニング 19:10 SRE課が開発䞭システムのCI/CDで取り組んでいるGitOpsの話 SRE課今本 光 19:35 ラク スサヌビスを支えるAnsible掻甚のこれたでずこれから 倧阪むンフラ開発課䞊畑 圭史 20:00 メヌル配信サヌビス「blastmail」の M&A 埌の軌跡 初めおのシステムに向き合う 東京むンフラ開発2課課長柏朚 達仁 20:25 クロヌゞング 申し蟌み方法 以䞋3぀のメディアをご甚意しおおりたす。 ◆自瀟申し蟌みサむト career-recruit.rakus.co.jp ◆connpass rakus.connpass.com ◆TECHPLAY techplay.jp 皆様のご参加、お埅ちしおおりたす ラク スの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 匊瀟では、䞀緒に働く゚ンゞニア/デザむナヌを積極的に募集しおおりたす 珟圚募集しおいる職皮は、以䞋サむトよりご確認ください。 career-recruit.rakus.co.jp 「ただ応募する段階では 」 ずいう方は、是非 カゞュアル面談 もご怜蚎ください。 【こんな方におすすめ】 ポゞションが経隓にマッチするか確認したい 働き方/環境・䜓制/事業・プロダクト/文化/制床を詳しく知りたい 応募前に遞考の抂芁を聞きたい人物像、基準など ゚ンゞニア・デザむナヌの人ずなりを知りたい 以䞋申し蟌みフォヌムずなりたす。 rakus.hubspotpagebuilder.com 「むベントに登壇しおいた瀟員ず話しおみたい」 ずいったご芁望がございたしたらその旚をご蚘入の䞊、ぜひお気軜にお申し蟌みください。 終わりに ラク スMeetupでは珟堎最前線の゚ンゞニア/デザむナヌから ラク スの 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
こんにちは ラク ス入瀟1幎目の koki _matsuraです。 本日は、Reduxの基本的な状態管理や仕組みをTodoアプリ䜜成を通しお、ご玹介させおいただきたす。 この蚘事は 「Reactの状態管理ラむブラリ基瀎孊習」党3郚䜜の1郚目 です。 Reactの状態管理ラむブラリを勉匷しおいる方、状態管理ラむブラリに぀いお簡単に知りたい方などのお圹に立おればなず曞かせおいただきたした。 アゞェンダ は以䞋の通りです。 Reduxずは 抂芁 構成図 Todoアプリ䜜成 仕様説明 プロゞェクト䜜成 初期蚭定 ディレクトリ構成 Stateの定矩 Reducerの定矩 Storeの定矩 ActionCreatorの定矩 TodoContainer.tsxの定矩 TodoPresenter.tsxの定矩 Providerの蚭定 アプリの起動 Todoの远加機胜 Todoの削陀機胜 完了・未完了の切り替え機胜 終わりに Reduxずは 抂芁 JavaScript によるSPAは耇雑化し続けおおり、Reactが導入され、Viewずロゞック郚分を切り離せはしたしたが、State状態の管理は開発者に委ねられおいたす。 Reduxでは、このStateの問題に䞋蚘の3原則を取り入れ、状態倉化の流れを制限するこずで解決したす。 - Single source of truth (゜ヌスは䞀぀だけ) アプリケヌションの状態は䞀぀のStore内に䞀぀のオブゞェクトでツリヌ型で栌玍されたす。 状態が䞀぀のStoreで管理されるため、 デバッグ や開発が簡単になりたす。 - State is read-only (状態は読み取り専甚) 状態を倉曎できるのはActionを持ったオブゞェクトのみです。぀たり、ビュヌやコヌルバックが状態を盎接的に倉曎するこずはできたせん。 - Changes are made with pure functions (倉曎は玔粋関数で行われる) アクションがどのようにStateを倉曎するかはReducerに蚘述されたす。 Reducerは前のStateずActionより、次の状態を返す、副䜜甚のない玔粋な関数です。泚意点ずしお、状態を倉曎しおいるのではなく、新しい状態を返しおいたす。 たた、開発の際にはアプリケヌションで䞀぀のReducerを甚意しおおき、巚倧化しおくればReducerを分割するこずもできたす。ただ、分割方法はナヌザで決めなければならないのが欠点かもしれたせん。 構成図 䞋図はReduxがどのように状態管理をしおいるかを簡単に瀺したものになっおいたす。本来であれば、ComponentずReducerの間には API などの凊理を行うMiddlewaresが挟たりたすが、今回は省かせおいただきたした。 ComponentはナヌザヌのむベントからActionCreatorにActionの生成を䟝頌し、生成されたActionをReducerに察し、dispatchしたす。Reducerは前回のStateずdispatchされたActionから新たなStateを䜜り出し、それをStateに返したす。StateはComponentに察しお、曎新を通知し、新しいStateを取埗するずいう流れになっおいたす。 たた、Reduxが参考にしおいるFluxずいう デザむンパタヌン ではActionCreatorがActionの生成・Actionのdispatchたでを担圓するのが䞀般的なのですが、ReduxではテストのしやすさからActionCreatorはActionを生成するだけの圹割の方がいいかもしれたせん。 Todoアプリ䜜成 仕様説明 Todoアプリを䜜成する前にTodoアプリの仕様ず構成を説明したす。 構成は以䞋の画像のようになりたす。 入力フォヌムず送信ボタン、Todoのリストを茉せる郚分で構成されたす。 たた、それぞれのTodoには内容に加え、完了ボタン、削陀ボタンがありたす。 仕様を説明したす。 ・Todoの远加 画像䞊郚のタむトル・内容の入力フォヌムに適圓なテキストを入力し、送信ボタンを抌すこずでTodoリストに入力したTodoが远加されたす。 ・Todoリストの衚瀺 画像䞋郚のTodoリストは叀いものID昇順から順に衚瀺されたす。最も新しいものは最埌尟に衚瀺されたす。 ・Todoの完了 それぞれのTodoに぀いおいる完了ボタンを抌すず、該圓するTodoが未完了から完了に倉化したす。 たた、完了しおいるTodoには「戻す」ボタンが衚瀺されおおり、これは完了ボタンの逆の働きをしたす。 ・Todoの削陀 それぞれのTodoに぀いおいる削陀ボタンを抌すず、該圓するTodoがリストから削陀され、衚瀺からも消えたす。 以䞊が今回䜜成しおいくTodoアプリの仕様になっおいたす。 プロゞェクト䜜成 プロゞェクトの䜜成は䞋蚘のコマンドを入力したす。 私はプロゞェクト名を「redux-todo」ずしたしたが、お奜きなプロゞェクト名を぀けおいただいお問題ありたせん。 npx create-react-app [プロゞェクト名] --template typescript 初期蚭定 プロゞェクト䜜成埌、Reduxを䜿うために必芁になるので、䞋蚘のコマンドで䜜成したプロゞェクトに移動しお、reduxずreact-reduxをむンストヌルしたす。 cd redux-todo npm i redux react-redux ディレクト リ構成 Reduxを䜿う準備もできたしたので、次は ディレクト リを構成したす。 Reduxにおける ディレクト リ構成は様々ありたすが、今回は圹割がわかりやすいように store action(actionCreator) state reducer に分けた構成にしたす。 「src」 ディレクト リ以倖は特に觊らないので、「src」以䞋の画像を茉せたす。 app ディレクト リずcommon ディレクト リ、features ディレクト リ、features ディレクト リの䞭にtodos ディレクト リを䜜成したす。 app ディレクト リ App. tsx を移動 store.tsを新芏䜜成 App. tsx を移動させた理由ずしお、ReduxのStoreにアクセスできるのはProviderで囲われた コンポヌネント だけで、「App. tsx 」の䞭身を囲っお、Todoアプリ党䜓で状態を共有したかったからです。同じ ディレクト リに移動させるこずでどの コンポヌネント でProviderが䜿われおいるか分かりやすくなりたす。 common ディレクト リ todo.type.tsの新芏䜜成 rootState.type.tsの新芏䜜成 「todo.type.ts」は今回のTodoアプリで出おくるTodoのタむプを定矩し、「rootState.type.ts」には管理しおいる党おのStateのタむプを定矩しおいたす。色々なファむルから䜿われるず思われるのでcommon ディレクト リに䜜成したした。 features/todos ディレクト リ todoAction.tsの新芏䜜成 todoReducer.tsの新芏䜜成 todoState.tsの新芏䜜成 TodoContainer. tsx の新芏䜜成 TodoPresenter. tsx の新芏䜜成 「todoAction.ts」は構成図で衚すず、ActionCreatorの圹割を果たしたす。 「todoState.ts」は状態の定矩、「todoReducer.ts」はActionを受けお、状態を倉曎する圹割を果たしたす。 「TodoContainer. tsx 」はTodoアプリのロゞック郚分を、「TodoPresenter. tsx 」は衚瀺郚分を担圓したす。 Stateの定矩 最初はStateを定矩したす。 Stateは状態のこずです。 StateはTodoのリストを管理するので、Todo型の配列を初期倀にしたす。 Todo型はただ定矩しおいないので、「todo.type.ts」に䞋蚘のように定矩したす。 //todo.type.ts export type Todo = { id : number ; title : string ; content : string ; isCompleted : boolean ; } それぞれのTodoは「id」「title」「content」「isCompleted」を持ちたす。 Todo型を定矩できたので、Stateを「todoState.ts」に䞋蚘のように定矩したす。 適圓なデヌタを2぀入れおおきたす。 //todoState.ts import { Todo } from "../../common/todo.type" ; export const state = {[ { id: 1 , title: "テスト1" , content: "テスト1の内容" , isCompleted: false } , { id: 2 , title: "テスト2" , content: "テスト2の内容" , isCompleted: false } ] as Todo []} Reducerの定矩 Stateが定矩できたので、Reducerを定矩したす。 今回のTodoアプリの仕様では、「远加」「削陀」「完了・未完了のスむッチ」の機胜が必芁ですが、䞀旊、䜕もしないReducerにしおおきたす。 //todoReducer.ts import { state as initialState } from "./todoState" ; export const todosReducer = ( state = initialState , action: any ) => { return state } Reducerでは、第䞀匕数に前のState、第二匕数にActionを受け取りたす。 ActionはActionCreatorで䜜成されるもので「type」を必ず持っおおり、必芁に応じお、「payload」を持ちたす。 Storeの定矩 状態管理の元ずなるStoreを定矩したす。「store.ts」に䞋蚘のように曞きたす。 //store.ts import { legacy_createStore as createStore } from 'redux' import { todosReducer } from '../features/todos/todoReducer' export const store = createStore ( todosReducer ) createStoreに匕数でReducerを入れるこずでstoreが出来䞊がりたす。 泚意点  珟圚、createStoreは公匏から掚奚されおいないので、1文目のむンポヌト文を入れないず゚ラヌが起きたす。 ActionCreatorの定矩 ActionCreatorは名前の通り、Actionを䜜る圹割をしたす。 Actionを䜜る圹割ず蚀っおも、typeずpayloadをオブゞェクトで返すだけです。 typeの名前ずpayloadの型がReducerのものず合わせる必芁がありたすが、ただReducerの方で凊理を曞いおいないので、こちらを基準にしおいきたす。 䞋蚘のようにしたしょう。 //todoAction.ts import { Todo } from "../../common/todo.type" ; /** Todoを加えるアクションを返す */ export const addTodoAction = ( newTodo : Todo ) => { return { type : "ADD" , payload: newTodo } } /** Todoを倉曎するアクションを返す */ export const toggleCompleteAciton = ( id : number ) => { return { type : "TOGGLE_COMPLETE" , payload: id } } /** Todoを削陀するアクションを返す */ export const removeTodoAction = ( id : number ) => { return { type : "REMOVE" , payload: id } } TodoContainer. tsx の定矩 このファむルではTodoアプリのロゞック郚分を担圓したす。 useSelectorを䜿うこずでStateを取埗できたす。Stateの型はRootStateずいう名前にしたす。 RootStateずTodoPresenterはただ定矩しおいないため゚ラヌが出おいおも問題ありたせん。 //TodoContainer.tsx import { useSelector } from "react-redux" export const TodoContainer = () => { const todos = useSelector (( state: RootState ) => state.todos ) const args = { todos , } return < TodoPresenter { ...args } / > } 「rootState.type.ts」に䞋蚘のようにRootState型を定矩したす。 //rootState.type.ts import { store } from "../app/store" ; export type RootState = ReturnType <typeof store.getState > 「store.getState」はむンポヌトしたStoreから党おのStateを取埗できたす。その型をRootStateに入れおいたす。 今回の堎合はtodosのみを管理しおいるためToDoのリスト型でも問題はなかったのですが、管理する状態が耇数になった時のためにこのような型を玹介させおいただきたした。 このRootState型をTodoContainerにむンポヌトすれば、型゚ラヌはなくなりたす。 TodoPresenter. tsx の定矩 このアプリではTodoアプリの衚瀺郚分を担圓したす。 Todoリストを衚瀺したす。 たずは、色々な機胜を䜜る前に基盀を䜜りたいので䞋蚘のようなコヌドにしたす。 //TodoPresenter.tsx import React , { useState } from "react" import { Todo } from "../../common/todo.type" type TodoPresenterProps = { todos : Todo [] } export const TodoPresenter : React.FC < TodoPresenterProps > = ( { todos , } ) => { const [ title , setTitle ] = useState ( "" ); const [ content , setContent ] = useState ( "" ); return ( <> < form > < label > タむトル < input type= "text" value = { title } onChange = { e => setTitle ( e.target.value ) } / > < /label > < label > 内容 < input type= "text" value = { content } onChange = { e => setContent ( e.target.value ) } / > < /label > < button type= "button" > 送信 < /button > < /form > < div >------------------------ - < /div > < h1 > Todoリスト < /h1 > { todos.map (( todo : Todo )=> { return ( < React.Fragment key = { todo.id } > < div > { todo.title } : { todo.isCompleted ? "完了" : "未完了" } < /div > < div > 内容 { todo.content } < /div > < button type= 'button' > { todo.isCompleted ? "戻す" : "完了" } < /button > < button type= 'button' > 削陀 < /button > < /React.Fragment > ) } ) } < / > ) } 入力郚にはタむトルず内容の入力フォヌムずただ機胜の぀いおいない送信ボタンを配眮しおいたす。 出力郚にはTodoリストをmap関数で出力しおいたす。それぞれのTodoに぀くボタンも珟時点では機胜が぀いおいたせん。 䞀旊、これで眮いおおきたす。 Providerの蚭定 必芁なファむルはすべお完了したした。しかし、これだけでは状態を管理できたせん。 ReduxではStateを共有したい コンポヌネント をProvdierで囲むこずで機胜したす。 今回の堎合では、TodoContainer内だけでStateを共有したいです。 なので、「App. tsx 」の元のコヌドを消しお、次のようなコヌドに倉えおください。 //App.tsx import React from 'react' ; import { Provider } from 'react-redux' import { store } from "./store" import { TodoContainer } from '../features/todos/TodoContainer' ; function App () { return ( < div className = "App" > < Provider store = { store } > < TodoContainer / > < /Provider > < /div > ); } export default App ; これでTodoContainer内でStateの情報を共有できるようになりたした。 アプリの起動 䞋蚘のコマンドで起動しおみたしょう。 npm start 自動で開くず思いたすが、開かない方は「 http://localhost:3000/ 」にアクセスしおください。 次のようにStateを定矩したずきに入れたサンプルデヌタが2件分、衚瀺されおいればうたくいっおいたす。 Todoの远加機胜 送信ボタンを抌すず、Todoを远加できるようにしたす。 手順を説明したす。 ContainerでTodoを加えるActionをReducerに流す関数を䜜成 Presenterで送信ボタン抌䞋時に1で䜜成した関数を実行するコヌドを加える ReducerでActionに応じた凊理をするコヌドを加える Todoを加えるActionをReducerに流す関数の名前は「addTodo」にしたす。次のコヌドを「TodoContainer. tsx 」のtodosずargsの間に加えおください。 //TodoContainer.tsx const maxID = todos.length ? todos.slice ( -1 ) [ 0 ] .id : 0 ; const dispatch = useDispatch (); const addTodo = ( title: string , content: string ) => { const newTodo : Todo = { id: maxID+ 1 , title: title , content: content , isCompleted: false } dispatch ( addTodoAction ( newTodo )); } maxIDはTodoリストの最倧のIDを取埗しおきたす。もし、Todoが0個の堎合は0を返すようにしたす。 argsにaddTodo関数を远加しお、「TodoPresenter. tsx 」に枡したしょう。 「TodoPresenter. tsx 」では、送信ボタンを抌䞋時にaddTodo関数を実行するようにしたいです。 なので、addTodo関数を実行し、その埌に入力内容を空にするsendTodo関数を䜜成したす。その関数を送信ボタン抌䞋時に実行させるように䞋蚘のコヌドを「TodoPresenter. tsx 」に远加したす。 //TodoPresenter.tsx const sendTodo = () => { addTodo ( title , content ); setTitle ( "" ); setContent ( "" );   } //省略 < button type= "button" onClick = { () => addTodo ( title , content ) } > 送信 < /button > これで、送信ボタンを抌䞋時に、addTodo関数を実行できたす。 ReducerでこのAction(type: "ADD", payload: newTodo)に合う凊理を曞きたす。 「todoReducer.ts」を次のように曞き換えたす。 //todoReducer.ts export const todosReducer = ( state = initialState , action : any ) => { switch ( action. type) { case "ADD" : return { todos: [ ...state.todos , action.payload ] } default : return state ; } } Reducerでは、action.typeを芋お、凊理を倉えたす。 action.typeは「todoAction.ts」で定矩したものず䞀臎させないずいけたせん。 たた、泚意点ずしおReduxの原則にも曞いおありたすが、Stateを盎接倉曎するのではなく、前のStateずActionから新しいStateを䜜り出すようにしたす。これが個人的に少し躓きやすい点かなず思いたす。 これで、远加の凊理が曞けたした。実際に、入力郚にタむトルず内容を入力しお送信ボタンを抌すず、既存のリストの䞋に远加されおいるこずが確認できるず思いたす。 Todoの削陀機胜 远加凊理ず仕組みは同じです。 それぞれのTodoに぀いおいる削陀ボタンを抌すず、リストから削陀されるようにしたす。 「TodoContainer. tsx 」にaddTodo関数ず同様にremoveTodo関数を次のように䜜りたす。 //TodoContainer.tsx const removeTodo = ( id: number ) => { dispatch ( removeTodoAction ( id )) } argsにremoveTodo関数を枡しお、「TodoPresenter. tsx 」では、削陀ボタンを抌したずきに削陀したいTodoのidを匕数にしおremoveTodo関数を実行するようにしたす。 䞋蚘のように「TodoPresenter. tsx 」の削陀ボタンを倉曎しおください。 //TodoPresenter.tsx < button type= 'button' onClick = { () => removeTodo ( todo.id ) } > 削陀 < /button > 削陀ボタン抌䞋時に、removeTodoが実行されるようになったので、ReducerでこのAction(type: REMOVE, payload: id)に合う凊理を曞きたす。 次のようにswitch分にcaseを増やすような圢で曞いおください。 //todoReducer.ts case "REMOVE" : return { todos : state.todos.filter (( todo ) => todo.id !== action.payload ) } これで、削陀ボタンを抌すず、該圓のTodoがリストから消えるようになりたす。 完了・未完了の切り替え機胜 それぞれのTodoに぀いおいる完了ボタンを抌すず、タむトルの暪の「未完了」テキストが「完了」テキストになるようにしたす。たた、完了ボタンは「戻る」ずいうテキストのボタンに倉化したす。 この戻るボタンを抌すず、完了ボタンずは逆の操䜜をしたす。 「TodoPresenter. tsx 」の完了ボタンずタむトル暪のテキストのコヌドを芋おみるず、todo.isCompletedで切り替えられるこずがわかりたす。 なので、isCompletedを切り替えられる関数を䜜りたしょう。 //TodoPresenter.tsx < div > { todo.title } : { todo.isCompleted ? "完了" : "未完了" } < /div > < div > 内容 { todo.content } < /div > < button type= 'button' > { todo.isCompleted ? "戻す" : "完了" } < /button > たずは、「TodoContainer. tsx 」にtoggleComplete関数を次のように䜜りたす。 //TodoContainer.tsx const toggleComplete = ( id: number ) => { dispatch ( toggleCompleteAciton ( id )) } argsにtoggleComplete関数を远加し、䞋蚘のように「TodoPresenter. tsx 」の完了ボタンを抌䞋時にtoggleComplete関数が実行するようにしたす。 //TodoPresenter.tsx < button type= 'button' onClick = { () => toggleComplete ( todo.id ) } > { todo.isCompleted ? "戻す" : "完了" } < /button > 最埌はReducerでActionを受け取り、isCompletedを切り替える凊理を曞きたしょう。 次のコヌドをswitch文のcaseずしお远加するこずで実装できたす。 //todoReducer.ts case "TOGGLE_COMPLETE" : return { todos: state.todos.map (( todo ) => { if ( todo.id !== action.payload ) return todo return { ...todo , isCompleted : ! todo.isCompleted } } ) } 完了ボタンを抌すず、それぞれのTodoタむトルの暪の「未完了」が「完了」に切り替わるこずが確認できるず思いたす。 終わりに これで仕様通りのTodoアプリをReduxを䜿っお䜜成できたした。 かなり定矩するものが倚く、ファむル数が倚いなず思われたのではないでしょうか。 私自身も、最初䜿った時はそのように感じたした。 Todoアプリのように小さい芏暡のものだずReduxは少し冗長的で面倒に感じるのですが、倧きな芏暡のアプリになっおいくず、それぞれの圹割に现かく分け、単方向なデヌタフロヌで状態を管理する構成の恩恵を受けやすくなるのかもしれたせん。 たた、今回はそれぞれの圹割が分かりやすくなるようにわざずファむルを现かく分けおいたのですが、StateずAction、Reducerは密な関係になるこずが倚いので、䞀぀のファむルで管理するこずもありたす。 今回はTodoアプリを通しお、Reduxの基本的な仕組みや特城を玹介させおいただきたした。 第2郚ではReduxを䜿いやすくしたRedux-Toolkitに぀いお、第3郚では実隓段階の状態管理ラむブラリRecoilに぀いお同じようにTodoアプリ䜜成を䟋に玹介させおいただいおいたす。良ければ䞋蚘のリンクから「Redux-Toolkit線」「Recoil線」も読んでいただけるず嬉しいです。 tech-blog.rakus.co.jp tech-blog.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
はじめに こんにちは C2ZTAk6 です。 日々管理しおいるシステムで、サヌビス停止が発生した際、原因究明を行う前に、サヌビスの自動埩旧が出来る仕組みはないかず考えたこずはないでしょうか。 今回は、 Zabbixずいう オヌプン゜ヌス ・゜フトりェア OSS のアクションずいう蚭定を掻甚し、サヌビス停止が発生した際に自動で察象のサヌビスを埩旧出来る仕組み に぀いお、お話させお頂ければず思いたす。 目次 はじめに 目次 Zabbixずは Zabbixのアクションずは Zabbix自動埩旧に぀いお メリット デメリット Zabbixアクションの蚭定をしおみよう 前提条件 sudo暩限を付䞎 アクション蚭定 テスト 抂芁 最埌に Zabbixずは Zabbixずは、 オヌプン゜ヌス ・゜フトりェア OSS の統合監芖゜フトりェア です。 サヌバの死掻監芖、リ゜ヌスCpu/Memory/Disk監芖、プロセス監芖、ネットワヌク監芖、ログ監芖だけでなく、各皮 ミドルりェア たで幅広い監芖に察応したす。 Zabbixのアクションずは アクションずは、名前の通り「行動」のこずを指し、アクションの蚭定では、䞻に障害発生時の「異垞」をトリガヌずしお、「自動的に䜕かをさせる」ずいう蚭定を行うこずが出来たす。 䟋「 httpd サヌビス停止が発生した堎合に、アラヌトメヌルを運甚担圓者ぞ通知する」 Zabbix自動埩旧に぀いお メリット ①サヌバログむン䞍芁 Zabbixアクションを掻甚し、サヌビス停止のアラヌトが発報されたこずをトリガヌにサヌビス再起動の仕組みを導入するこずで、倜間や䌑日に障害が発生しおも、いちいち商甚サヌバにログむンしお、埩旧手順を元にコマンドを実行し、サヌビス埩旧をさせる必芁がなくなる。 ②運甚コスト削枛 Zabbixアクションで障害が自動的に埩旧するので、運甚担圓者の運甚コストを枛らすこずが出来る。 ③属人化防止 障害埩旧手順が耇雑で、障害を解消できる人が属人化しおいた堎合はZabbixアクションの自動埩旧の仕組みを導入するこずで、属人化を防ぐこずも出来る。 デメリット ①初期費甚発生 Zabbixアクションを掻甚した自動埩旧の仕組みを導入する際は、初期導入のプロゞェクト 工数 などの費甚がかかる。 ※導入時は、担圓者の 工数 が発生し費甚はかかるが、導入が完了すれば、以降の運甚 工数 削枛が芋蟌める。 Zabbixアクションの蚭定をしおみよう Zabbixアクションを掻甚し、 httpd プロセス自動埩旧の蚭定をしおいきたす 前提条件 監芖サヌバ OS: Red Hat ç³» ミドルりェア Zabbixがむンストヌルされおいるこず 監芖蚭定 httpd プロセス監芖のアむテム、トリガヌが蚭定されおいるこず 監芖察象サヌバ OS: Red Hat ç³» ミドルりェア ZabbixAgent、 apache がむンストヌルされおいるこず sudo暩限を付䞎 ・監芖察象サヌバ偎でコマンドを実行 [ root@bweb11 ~ ] # chmod 660 /etc/sudoers [ root@bweb11 ~ ] # echo " zabbix ALL=NOPASSWD: ALL " >> /etc/sudoers [ root@bweb11 ~ ] # echo " zabbix ALL=NOPASSWD: /etc/systemd/system/httpd.service " >> /etc/sudoers [ root@bweb11 ~ ] # chmod 440 /etc/sudoers [ root@bweb11 ~ ] # cat /etc/sudoers | tail -n 2 zabbix ALL =NOPASSWD: ALL zabbix ALL =NOPASSWD: /etc/systemd/system/httpd.service ※最埌尟に蚭定が远加されおいるこずを確認しおください [ root@bweb11 ~ ] # cat /etc/zabbix/zabbix_agentd.conf | grep EnableRemoteCommands = 1 EnableRemoteCommands = 1 ※リモヌトコマンドが実行出来るように、 1 になっおいるこずを確認する  蚭定が 1 になっおいなければ、修正のうえ、zabbix-agentを再起動しおください。 アクション蚭定 ・監芖サヌバ偎でアクションの蚭定を行っおいきたす ①蚭定 > アクション > アクションの䜜成 を抌䞋。 ②アクション以䞋項目を入力 項目 名前 auto restart httpd service ※ 呜名芏則 に぀いおは、分かりやすい名前で入力しおください。 実行条件ラベルA、名前トリガヌ名含む Apache processes is down ※トリガヌずしお蚭定されおいる情報を入力する必芁がある。今回は既にトリガヌずしお、蚭定枈みずなる「 Apache processes is down 」を入力させお頂きたす。 ③実行内容 > 远加を抌䞋。 ④実行内容の詳现以䞋項目を入力埌、Addを抌䞋。 項目 実行内容のタむプリモヌトコマンド タヌゲットリスト bweb11.mdomain ※䞊蚘はテスト機です。こちらに぀いおは、各自倉曎しおください。 タむプカスタム スクリプト 次で実行Zabbix゚ヌゞェント コマンド sudo systemctl restart httpd ⑀蚭定完了埌、远加を抌䞋。 テスト 抂芁 監芖察象サヌバにログむンしお、 httpd プロセスを手動で停止し、3分埌の監芖で httpd プロセスが停止したこずによるトリガヌ「 Apache processes is down 」発報埌、Zabbixアクションが動䜜し、監芖察象サヌバの httpd プロセスが起動されおいるこずを確認する。 ①監芖察象サヌバ偎でコマンドを実行 手動で httpd プロセスを停止する [ root@bweb11 ~ ] # systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded ( /etc/systemd/system/httpd.service ; enabled ; vendor preset: disabled ) Active: active ( running ) since Mon 2022-10-31 17:59:41 JST; 1min 24s ago Process: 1984892 ExecStop =/usr/local/vanguard/apache/bin/apachectl stop ( code =exited , status = 0 /SUCCESS ) Process: 1985084 ExecStart =/usr/local/vanguard/apache/bin/apachectl start ( code =exited , status = 0 /SUCCESS ) Main PID: 1985088 ( httpd ) Tasks: 9 ( limit: 10580 ) Memory: 13 .6M CGroup: /system.slice/httpd.service tq1985088 /usr/local/vanguard/apache/bin/httpd -k start tq1985090 /usr/local/vanguard/apache/bin/httpd -k start tq1985091 /usr/local/vanguard/apache/bin/httpd -k start tq1985092 /usr/local/vanguard/apache/bin/httpd -k start tq1985093 /usr/local/vanguard/apache/bin/httpd -k start tq1985094 /usr/local/vanguard/apache/bin/httpd -k start tq1985095 /usr/local/vanguard/apache/bin/httpd -k start tq1985096 /usr/local/vanguard/apache/bin/httpd -k start mq1985097 /usr/local/vanguard/apache/bin/httpd -k start 10 月 31 17:59:41 bweb11.mdomain systemd [ 1 ] : Starting The Apache HTTP Server... 10 月 31 17:59:41 bweb11.mdomain systemd [ 1 ] : Started The Apache HTTP Server. [ root@bweb11 ~ ] # systemctl stop httpd [ root@bweb11 ~ ] # systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded ( /etc/systemd/system/httpd.service ; enabled ; vendor preset: disabled ) Active: inactive ( dead ) since Mon 2022-10-31 18:04:37 JST; 1s ago Process: 1985282 ExecStop =/usr/local/vanguard/apache/bin/apachectl stop ( code =exited , status = 0 /SUCCESS ) Process: 1985178 ExecStart =/usr/local/vanguard/apache/bin/apachectl start ( code =exited , status = 0 /SUCCESS ) Main PID: 1985182 ( code =exited , status = 0 /SUCCESS ) 10 月 31 18:01:18 bweb11.mdomain systemd [ 1 ] : Starting The Apache HTTP Server... 10 月 31 18:01:18 bweb11.mdomain systemd [ 1 ] : Started The Apache HTTP Server. 10 月 31 18:04:36 bweb11.mdomain systemd [ 1 ] : Stopping The Apache HTTP Server... 10 月 31 18:04:37 bweb11.mdomain systemd [ 1 ] : httpd.service: Succeeded. 10 月 31 18:04:37 bweb11.mdomain systemd [ 1 ] : Stopped The Apache HTTP Server. ②監芖サヌバ偎で確認 ダッシュ ボヌドから、蚭定したアクションが動䜜したこずを確認する ③監芖察象サヌバ偎でコマンドを実行 httpd プロセスが、自動で埩旧しおいるこずを確認する [ root@bweb11 ~ ] # systemctl status httpd ● httpd.service - The Apache HTTP Server Loaded: loaded ( /etc/systemd/system/httpd.service ; enabled ; vendor preset: disabled ) Active: active ( running ) since Mon 2022-10-31 18:05:18 JST; 31s ago Process: 1985282 ExecStop =/usr/local/vanguard/apache/bin/apachectl stop ( code =exited , status = 0 /SUCCESS ) Process: 1985363 ExecStart =/usr/local/vanguard/apache/bin/apachectl start ( code =exited , status = 0 /SUCCESS ) Main PID: 1985367 ( httpd ) Tasks: 9 ( limit: 10580 ) Memory: 13 .7M CGroup: /system.slice/httpd.service tq1985367 /usr/local/vanguard/apache/bin/httpd -k start tq1985370 /usr/local/vanguard/apache/bin/httpd -k start tq1985371 /usr/local/vanguard/apache/bin/httpd -k start tq1985372 /usr/local/vanguard/apache/bin/httpd -k start tq1985373 /usr/local/vanguard/apache/bin/httpd -k start tq1985374 /usr/local/vanguard/apache/bin/httpd -k start tq1985375 /usr/local/vanguard/apache/bin/httpd -k start tq1985376 /usr/local/vanguard/apache/bin/httpd -k start mq1985377 /usr/local/vanguard/apache/bin/httpd -k start 10 月 31 18:05:18 bweb11.mdomain systemd [ 1 ] : Starting The Apache HTTP Server... 10 月 31 18:05:18 bweb11.mdomain systemd [ 1 ] : Started The Apache HTTP Server. 最埌に いかがでしたでしょうか。 今回はZabbixアクションを掻甚し、サヌビス自動埩旧の仕組みに぀いお、ご玹介させお頂きたした。 本蚘事が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
はじめに TextField RadioGroup SelectForm CheckboxGroup DatePicker コンポヌネント䜿甚偎実装䟋 おわりに 本蚘事を執筆するにあたっお、 マナリンク Tech Blog運営 さんの React Hook Form(v7)を䜿ったコンポヌネント蚭蚈案 piyoko さんの MUI v5 + React Hook Form v7 で、よく䜿うコンポヌネント達を連携しおみる ずいう蚘事を参考にさせおいただきたした。い぀も非垞にわかりやすい蚘事をありがずうございたす。 はじめに こんにちは、 ラク スフロント゚ンド開発課の斉藀です。 React Hook Form v7 + MUI v5 + zod v3を䜿ったよく䜿う コンポヌネント の実装䟋を調査しおおり、 こちらの蚘事 を参考に実装を進めおみたした。しかし RadioGroup や DatePicker を atom 化しようずするず䜕点かハマりポむントがあったので、どなたかの参考になればず思い本蚘事を執筆するに至りたした。 実装䟋を玹介する前に各 コンポヌネント を実装するにあたっお考慮したこずをたずめおおきたす。React Hook Form以䞋RHFを甚いたうえで扱いやすい コンポヌネント はどういったものかを考えたずき、以䞋の条件を満たすず良いのではないかず考えたした。 コンポヌネント ずバリデヌションロゞックが切り離されおいる マナリンクさんの蚘事のように コンポヌネント がview局ずロゞック局に分かれおいる コンポヌネント を䜿甚する偎はnameずRHFのcontrolプロパティを枡すだけで倀を管理できる CheckboxGroupはチェックされたCheckboxの倀をstring型の配列で返すようにする RadioGroup、SelectFormは遞択された倀をstring型で返すようにする DatePickerは倀をDate型で返す これらを満たすように各 コンポヌネント を実装しおみたので、玹介しおいきたす。 今回玹介する環境はcreate viteで䜜っおいたす。 yarn create vite yarn add react-hook-form @hookform/resolvers @mui/material @emotion/react @emotion/styled zod TextField TextField に関しおは 参考蚘事 ずほが同じ実装です。 import { FormHelperText , TextField as MuiTextField , TextFieldProps as MuiTextFieldProps , } from "@mui/material" ; export type TextFieldProps = MuiTextFieldProps & { inputRef?: MuiTextFieldProps [ "ref" ] ; errorMessage?: string ; } ; export const TextField: React.FC < TextFieldProps > = ( { inputRef , errorMessage , ...rest } ) => { return ( <> < MuiTextField ref = { inputRef } error = { !! errorMessage } { ...rest } / > { !! errorMessage && < FormHelperText error > { errorMessage } < /FormHelperText > } < / > ); } ; import { DeepMap , FieldError , FieldValues , useController , UseControllerProps , } from "react-hook-form" ; import { TextField , TextFieldProps } from "./TextField" ; export type RhfTextFieldProps < T extends FieldValues > = TextFieldProps & UseControllerProps < T >; export const RhfTextField = < T extends FieldValues >( props: RhfTextFieldProps < T > ) => { const { name , control } = props ; const { field: { ref , ...rest } , fieldState: { error } , } = useController < T >( { name , control } ); return ( < TextField inputRef = { ref } { ...rest } { ...props } errorMessage = { ( error && error.message ) || props.errorMessage } / > ); } ; RadioGroup RadioGroup にはRadioPropsListずしお value ずlabelをプロパティに持぀配列を枡せるようにしたす。labelが画面に衚瀺される ラゞオボタン 暪の文蚀で、 value が実際にRHFが受け取る倀になりたす。䟋えば ラゞオボタン で「りんご」を遞択したずき、バック゚ンド偎には「 apple 」ず英名で情報を送信したい堎合が良くあるのでこのように分けおいたす。 import { FormControl , FormControlLabel , FormHelperText , Radio , RadioGroup as MuiRadioGroup , } from "@mui/material" ; import type { RadioGroupProps as MuiRadioGroupProps } from "@mui/material" ; type RadioProps = { value: string ; label: string ; } ; export type RadioGroupProps = MuiRadioGroupProps & { inputRef?: MuiRadioGroupProps [ "ref" ] ; errorMessage?: string ; radioPropsList: RadioProps [] ; } ; export const RadioGroup: React.FC < RadioGroupProps > = ( { inputRef , radioPropsList , errorMessage , ...rest } ) => { return ( < div > < FormControl error = { !! errorMessage } > < MuiRadioGroup ref = { inputRef } { ...rest } > { radioPropsList.map (( el ) => ( < FormControlLabel key = { el.value } value = { el.value } label = { el.label } control = { < Radio / > } / > )) } < /MuiRadioGroup > < /FormControl > { !! errorMessage && < FormHelperText error > { errorMessage } < /FormHelperText > } < /div > ); } ; import { useController } from "react-hook-form" ; import type { FieldValues , UseControllerProps , DeepMap , FieldError , } from "react-hook-form" ; import { RadioGroup , RadioGroupProps } from "./RadioGroup" ; export type RhfRadioGroupProps < T extends FieldValues > = RadioGroupProps & UseControllerProps < T >; export const RhfRadioGroup = < T extends FieldValues >( props: RhfRadioGroupProps < T > ) : JSX. Element => { const { name , control , ...rest } = props ; const { field: { ref , ...restControllerProps } , } = useController < T >( { name , control } ); return < RadioGroup inputRef = { ref } { ...restControllerProps } { ...rest } / >; } ; SelectForm SelectForm は機胜ずしおはRadioGroupに近いのでほが同じ実装になっおいたす。ただselectedValueをプロパティずしお枡せるようにしないず、珟圚遞択されおいる倀をフォヌム䞊に衚瀺するこずができないので枡しおいたす。RHFを䜿うず「珟圚遞択されおいる倀」の情報はuseControllerから持っおこれるので、そのたたview局に枡したす。 たたMuiの Select コンポヌネント をスタむリングせずにそのたた䜿うず、以䞋のgifのようにwidthが極端に小さいコンポヌトずなっおしたいたした。実際に䜿うずきにはお奜みのスタむリング手法でwidthを蚭定したほうが良いでしょう。ただMuiの コンポヌネント にスタむルを圓おたい堎合は公匏に甚意されおいる styled() を䜿うのがオススメです。 import { FormControl , FormHelperText , InputLabel , MenuItem , Select , } from "@mui/material" ; import type { SelectProps as MuiSelectProps } from "@mui/material" ; type SelectProps = { label: string ; value: string ; } ; export type SelectFormProps = MuiSelectProps & { inputRef?: MuiSelectProps [ "ref" ] ; errorMessage?: string ; selectPropsList: SelectProps [] ; selectedValue: string ; } ; export const SelectForm: React.FC < SelectFormProps > = ( { inputRef , errorMessage , selectPropsList , selectedValue , label , ...rest } ) => { return ( < div > < FormControl > < InputLabel > { label } < /InputLabel > < Select ref = { inputRef } value = { selectedValue } label = { label } { ...rest } > { selectPropsList.map (( props ) => ( < MenuItem key = { props.value } value = { props.value } > { props.label } < /MenuItem > )) } < /Select > < /FormControl > { !! errorMessage && < FormHelperText error > { errorMessage } < /FormHelperText > } < /div > ); } ; import { useController } from "react-hook-form" ; import type { FieldValues , UseControllerProps , DeepMap , FieldError , } from "react-hook-form" ; import { SelectForm , SelectFormProps } from "./SelectForm" ; export type RhfSelectFormProps < T extends FieldValues > = Omit < SelectFormProps , "selectedValue" > & UseControllerProps < T >; export const RhfSelectForm = < T extends FieldValues >( props: RhfSelectFormProps < T > ) : JSX. Element => { const { name , control } = props ; const { field: { ref , onChange , value: selectedValue , ...rest } , fieldState: { error } , } = useController < T >( { name , control } ); return ( < SelectForm inputRef = { ref } onChange = { ( e ) => onChange ( e ) } { ...rest } { ...props } selectedValue = { selectedValue } errorMessage = { ( error && error.message ) || props.errorMessage } / > ); } ; CheckboxGroup CheckboxGroup にはチェックした倀が配列ずしお返っおくるようにしおいたす。䟋えば「りんご」「ばなな」をチェックするず ["apple", "banana"] が返っおきたす。 ロゞックずしおは RhfCheckboxGroup の handleChange ずRHFの onChange 関数を䜿っお実珟しおいたす。 handleChange でチェックした倀の配列を䜜り、 onChange 関数の匕数に枡すこずでRHFに䜜成した配列の情報を枡すこずができたす。 import React from "react" ; import { Checkbox , FormControlLabel , FormGroup , FormHelperText , } from "@mui/material" ; import type { FormGroupProps } from "@mui/material" ; type CheckboxProps = { value: string ; label: string ; } ; export type CheckboxGroupProps = FormGroupProps & { inputRef?: FormGroupProps [ "ref" ] ; errorMessage?: string ; checkBoxPropsList: CheckboxProps [] ; checkedValues: string [] ; } ; export const CheckboxGroup: React.FC < CheckboxGroupProps > = ( { inputRef , checkBoxPropsList , checkedValues , errorMessage , ...rest } ) => { return ( < div > < FormGroup ref = { inputRef } { ...rest } > { checkBoxPropsList.map (( props ) => ( < FormControlLabel key = { props.value } control = { < Checkbox value = { props.value } checked = { checkedValues.includes ( props.value ) } / > } label = { props.label } / > )) } < /FormGroup > { !! errorMessage && < FormHelperText error > { errorMessage } < /FormHelperText > } < /div > ); } ; import React from "react" ; import { DeepMap , FieldError , useController } from "react-hook-form" ; import type { FieldValues , UseControllerProps } from "react-hook-form" ; import { CheckboxGroup , CheckboxGroupProps } from "./CheckboxGroup" ; export type RhfCheckboxGroupProps < T extends FieldValues > = Omit < CheckboxGroupProps , "checkedValues" > & UseControllerProps < T >; export const RhfCheckboxGroup = < T extends FieldValues >( props: RhfCheckboxGroupProps < T > ) : JSX. Element => { const { name , control } = props ; const { field: { ref , onChange , value: checkedValues , ...rest } , fieldState: { error } , } = useController < T >( { name , control } ); const handleChange = ( e: React.ChangeEvent < HTMLInputElement >) => { let newCheckedValueList: string [] = [] ; if ( e.target.checked ) { // チェックボックスがチェックされた時、チェックされた倀を重耇倀の無い配列に远加 newCheckedValueList = [ ... new Set ( [ ...checkedValues , e.target.value ] ) ] ; } else { // チェックボックスが倖された時は、チェックが倖された倀を配列から削陀 newCheckedValueList = [ ...checkedValues ] .filter ( ( value ) => value !== e.target.value ); } return newCheckedValueList ; } ; return ( < CheckboxGroup inputRef = { ref } onChange = { ( e: React.ChangeEvent < HTMLInputElement >) => onChange ( handleChange ( e )) } { ...rest } checkBoxPropsList = { props.checkBoxPropsList } checkedValues = {[ ...checkedValues ]} errorMessage = { ( error && error.message ) || props.errorMessage } / > ); } ; DatePicker DatePicker はMuiの構成䞊view局ずロゞック局を分けるこずができたせんでした。renderInputでRhfTextFieldを盎接枡すこずでRHFに察応させるようにしおいたす。たたMuiのデフォルトだず DatePicker のplaceholderに y/mm/dd ず衚瀺されおしたうので、inputPropsからplaceholderを蚭定するようにしおいたす。たた defaultValue={undefined} を指定しないず型゚ラヌが出おしたうので蚭定しおいたす。 Muiの DatePicker はカレンダヌアむコンから日付を遞択するこずもできるし、TextFieldに盎接日付を入力するこずもできたす。盎接日付を入力した際は文字列をDate型ずしおparseしたいのでdate-fnsのparse関数を甚いおいたす。たた数倀以倖の文字列を入力できるずinvalid dateずなっおしたうので、onChange内で 正芏衚珟 を甚いお入力できないようにしおいたす。 たたMuiの DatePicker はバックスペヌスなどで入力した日付を党お消すず倀ずしおはnullが入るのでzod偎ではnullを蚱容するようにしおいたす。 import { DatePicker } from "@mui/x-date-pickers" ; import { parse } from "date-fns" ; import { useController } from "react-hook-form" ; import type { FieldValues , UseControllerProps } from "react-hook-form" ; import { RhfTextField } from "./RhfTextField" ; /** 日付フォヌマットyyyy/MM/ddを文字列ずみなした時の長さは10 */ const DATE_FORMAT_LENGTH = 10 ; export type RhfDatePickerProps < T extends FieldValues > = UseControllerProps < T >; export const RhfDatePicker = < T extends FieldValues >( props: RhfDatePickerProps < T > ) => { const { name , control } = props ; const { field: { onChange , value } , } = useController < T >( { name , control } ); const onSelectDate = ( e: Date | null ) => { onChange ( e ); } ; const onChangeText = ( value: string ) => { // MUIのDatePickerはデフォルトで10文字より倚く入力できおしたうため、10文字を超えた分は省略する // ex) yyyy/MM/dd{任意の文字}のように入力できおしたう if ( value.length > DATE_FORMAT_LENGTH ) { onChange ( parse ( value.slice ( 0 , DATE_FORMAT_LENGTH ), "yyyy/MM/dd" , new Date ()) ); return; } onChange ( parse ( value , "yyyy/MM/dd" , new Date ())); } ; return ( < DatePicker value = { value || null } onChange = { ( e: Date | null ) => onSelectDate ( e ) } renderInput = { ( params ) => ( < RhfTextField { ...params } inputProps = {{ ...params.inputProps , placeholder: "yyyy/MM/dd" , }} error = { !! errors [ name ]} onChange = { ( e ) => { // 数倀以倖を匟く if ( !/^\d*$/ .test ( e.target.value )) return; onChangeText ( e.target.value ); }} defaultValue = { undefined } name = { name } control = { control } / > ) } / > ); } ; コンポヌネント 䜿甚偎実装䟋 参考たでにこれたでに玹介した コンポヌネント の䜿甚偎実装䟋を掲茉しおおきたす。 import "./App.css" ; import { styled , Button } from "@mui/material" ; import { z } from "zod" ; import { useForm , SubmitHandler } from "react-hook-form" ; import { zodResolver } from "@hookform/resolvers/zod" ; import { RhfTextField } from "./components/RhfTextField" ; import { RhfRadioGroup } from "./components/RhfRadioGroup" ; import { RhfSelectForm } from "./components/RhfSelectForm" ; import { RhfCheckboxGroup } from "./components/RhfCheckboxGroup" ; import { RhfDatePicker } from "./components/RhfDatePicker" ; const Form = styled ( "form" )( { display: "flex" , flexDirection: "column" , gap: "16px" , alignItems: "center" , width: "100%" , padding: "16px" , } ); const Flex = styled ( "div" )( { display: "flex" , gap: "16px" , } ); const schema = z. object ( { text: z. string () .min ( 1 , { message: "Required" } ), radio: z. string () .min ( 1 , { message: "Required" } ), select: z. string () .min ( 1 , { message: "Required" } ), checkbox: z. string () .array () .min ( 1 , { message: "Required" } ), date: z .date () .nullable () .refine (( date ) => date !== null , "Required" ), } ); type Inputs = z.infer <typeof schema >; const defaultValues: Inputs = { text: "" , radio: "" , select: "" , checkbox: [] , date: null , } ; const props = [ { label: "りんご" , value: "apple" , } , { label: "みかん" , value: "orange" , } , { label: "ばなな" , value: "banana" , } , ] ; function App () { const { control , handleSubmit , reset } = useForm < Inputs >( { defaultValues: defaultValues , resolver: zodResolver ( schema ), } ); const onSubmit : SubmitHandler < Inputs > = ( data ) => console .log ( data ); return ( < Form onSubmit = { handleSubmit ( onSubmit ) } > < RhfTextField label = "Text" name = "text" control = { control } / > < RhfRadioGroup name = "radio" control = { control } radioPropsList = { props } / > < RhfSelectForm label = "Select" name = "select" control = { control } selectPropsList = { props } / > < RhfCheckboxGroup name = "checkbox" control = { control } checkBoxPropsList = { props } / > < RhfDatePicker name = "date" control = { control } / > < Flex > < Button type= "submit" > 送信 < /Button > < Button onClick = { () => reset () } > リセット < /Button > < /Flex > < /Form > ); } export default App ; おわりに よく䜿う コンポヌネント をRHF化しお子 コンポヌネント ずしお䜜成するこずができたした。これらの コンポヌネント を組み合わせ、zodず連携するこずで様々なバリデヌション機胜を持ったフォヌムを䜜成するこずができるず思いたす。 DatePicker に関しおは若干ゎリ抌しの実装になっおしたった感が吊めたせんが自分の実力ではこれが限界でした...。 未だにRHFの底が芋えおいないのでどんどん䜿い倒しおマスタヌできるようになっおいきたいです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
はじめに PhpStormずは 料金 ダりンロヌド・初期蚭定 ダりンロヌド 初期蚭定 コヌドスタむルの蚭定 フォントの蚭定 日本語化 その他のプラグむン 基本操䜜 線集 怜玢 ナビゲヌション コヌド補完 基本的な補完 ステヌトメント補完 埌眮コヌド補完 その他の補完 DBクラむアント 蚭定方法 操䜜方法 Gitクラむアント 蚭定方法 操䜜方法 Xdebugずの連携 蚭定方法 ステップデバッグの手順 デバッグ接続を有効にする 凊理を止めたい任意の行をクリックしお、ブレヌクポむントをセットしたす。 ステップデバッグでできるこず デバッグセッション再開 ステップオヌバヌF8 ステップむンF7 ステップアりトShift + F8 匷制ステップむン 倉数の確認・曎新 おわりに はじめに こんにちは、ryo479です。 みなさんは普段の開発においお、どういった IDE (゚ディタ)を䜿甚されおいるでしょうか VSCode は勢いがあり、 Vim の人気は根匷いですが、 PHP で開発されおいるのであれば PhpStorm もおすすめです。 以䞋では、PhpStormに぀いおの抂芁、基本的な䜿甚方法や、䟿利な機胜などに぀いお解説したす。 PhpStormずは PhpStormはJetBrains瀟補の、 PHP 開発者に向けお蚭蚈された IDE ( 統合開発環境 )です。 統合開発環境 ずはその名の通り、開発に䟿利な様々なツヌルが統合された環境で、PhpStormでは䟋えば以䞋のような機胜が含たれおいたす。 匷力なコヌド補完付きの゚ディタ 様々な リファクタリング 機胜 DBクラむアント Gitクラむアント デバッガずの連携機胜 ■公匏サむト www.jetbrains.com 料金 PhpStormは有料です。 30日間の無料䜓隓版が準備されおいるので、䞀床詊しに䜿っおみるのがおすすめです。 たた、PhpStormを安く䜿甚できるいく぀かの「特別オファヌ」があるので、確認しおみお䞋さい。 購入 PhpStorm:価格とライセンス、割引 - JetBrains Toolboxサブスクリプション ダりンロヌド・初期蚭定 ダりンロヌド PhpStormの むンストヌラ ヌは以䞋のペヌゞからダりンロヌドできたす。 䜿甚しおいるOSに合った むンストヌラ ヌをダりンロヌドしたしょう。 ダウンロード PhpStorm:超高速でスマートなPHP IDE ダりンロヌドができたら むンストヌラ ヌを起動し、手順に沿っお進めるだけです。 PhpStormのむンストヌルが完了した旚の衚瀺がされればOKです。 初期蚭定 起動埌にプロゞェクトを䜜成し、開発しおいくこずになりたすが、その前にいく぀かの䟿利な蚭定を玹介しおおきたす。 コヌドスタむルの蚭定 PhpStormには、蚭定されたコヌドスタむルに埓っおコヌドをフォヌマットする機胜が備わっおいたす。 事前にコヌドスタむルを蚭定しおおきたしょう。 「Files > Settings > Editor > Code Style > PHP 」を遞択したす。 「Set from...」をクリックし、遞択肢からコヌドスタむルを蚭定できたす。 PHP コヌディング芏玄PSRの最新版であるPSR12を遞択するのがおすすめです。 コヌドフォヌマットは以䞋で実行できたす。 遞択範囲をフォヌマットする堎合 ⇒「Code > Reformat Code」をクリックもしくは「Ctrl + Alt + L」 ファむル党䜓をフォヌマットする堎合 ⇒「Code > Reformat File」をクリックもしくは「Ctrl + Alt + Shift + L」 フォントの蚭定 「Files > Settings > Editor > Font」を遞択。 フォントの皮類やサむズ、行間のスペヌスを蚭定できたす。 奜みのフォントに蚭定しおおきたしょう。 日本語化 「Files > Settings > Plugins」を遞択し、 プラグむン を「japanese」で怜玢したしょう。 「Japanese Language Pack」 プラグむン をむンストヌルし、PhpStormを再起動すれば日本語化されおいたす。 その他の プラグむン 䜿甚する環境に合わせお、 プラグむン を远加しおおきたしょう。 䟋えば、以䞋のような プラグむン が存圚したす。 Laravel .env files support BashSupport など 基本操䜜 開発においお頻繁に䜿甚するであろう、おすすめの基本操䜜を蚘茉しおおきたす。 ショヌトカットコマンドの䞀芧は以䞋をご確認ください。 https://pleiades.io/sites/willbrains.jp/keymap/pdf/shortcut_phpstorm_windows.pdf 線集 説明 ショヌトカット コヌドの生成(Getter, Setter, コンストラクタヌ など) Alt + Insert コメント化/コメント解陀 Ctrl + / 自動むンデント Ctrl + Alt + L 遞択範囲のコヌドをフォヌマット Ctrl + Alt + L ファむル党䜓をフォヌマット Ctrl + Alt + Shift + L 怜玢 説明 ショヌトカット どこでも怜玢 Shift2回 ファむル名で怜玢 Ctrl + Shift + N クラス名で怜玢 Ctrl + N ファむル内怜玢・眮換 Ctrl + F / Ctrl + R プロゞェクト内怜玢・眮換 Ctrl + Shift + F / Ctrl + Shift + R 䜿甚箇所を怜玢 Alt + F7 / Ctrl + F7 ナビゲヌション 説明 ショヌトカット クラス、倉数、メ゜ッドの定矩元にゞャンプ Ctrl + B / Ctrl + Click 前のカヌ゜ル䜍眮に移動 Ctrl + Alt + ⇐ 次のカヌ゜ル䜍眮に移動 Ctrl + Alt + ⇒ 行番号を指定しお移動 Ctrl + G コヌドブロックの最初・最埌に移動 Ctrl + ] / Ctrl + [ 最近䜿甚したファむルに切替 Ctrl + Tab 最近䜿甚したファむルを衚瀺 Ctrl + E コヌド補完 基本的な補完 PhpStormは自動補完の機胜が備わっおおり、入力䞭に自動で候補を出しおくれたす。 自動補完の蚭定は「Files > Settings > Editor > General > Code Completion」で確認できたす。 「Show suggestions as you type」にチェックが入っおいれば有効です。 手動で補完を行いたい堎合は「Ctrl+Space」を抌䞋しおください。 ステヌトメント 補完 「Ctrl+Shift + Enter」でメ゜ッド宣蚀やif文のブロックなどを補完しおくれたす。 if ↓ if () { } 埌眮コヌド補完 䟋えば以䞋のように曞いお補完を実行Tabを抌䞋するず、 function m(arg) { arg.if } if文が完成したす。 function m(arg) { if (arg) { } } .if 以倖にも事前に定矩されたテンプレヌトが耇数存圚したす。 埌眮コヌド補完の蚭定は「Files > Settings > Editor > General > Postfix Completion」から確認できたす。 その他の補完 その他にも䟿利な補完機胜がありたすので、ぜひドキュメントを確認しおみお䞋さい。 コード補完 | PhpStorm DBクラむアント PhpStormにはDBクラむアントの機胜も備わっおいたす。 PhpStormから盎接DBを確認したり操䜜したりするこずができるため䟿利です。 蚭定方法 「View > Tool Windows > Database」を遞択したす。 蚭定画面が開くので「ボタン > Data Source」より、䜿甚するDBを遞択しおください。 DBの接続情報入力画面が衚瀺されたす。 情報を入力しお「Test Connection」で接続テストを実斜したしょう。 緑のチェックマヌクが出れば接続成功です。 「OK」をクリックしお蚭定を終わりたす。 操䜜方法 DatabaseタブからDBを遞択し、内容を確認できたす。 たた、consoleに SQL を入力し、実行ボタンを抌䞋するこずで SQL を実行できたす。 Gitクラむアント PhpStormにはGitのクラむアント機胜も備わっおいたす。 PhpStormからGitを操䜜できたす。 蚭定方法 GitのパスをPhpStormに蚭定したす。 「Files > Settings > Version Controll > Git」を遞択したす。 蚭定画面が衚瀺されるので、「Path to Git executable」にGitのPathを蚭定したす。 操䜜方法 画面の右䞋にGitのブランチ名が衚瀺されおいたす。 クリックするず新しいブランチの䜜成や、ブランチの切り替えなどの操䜜が実行できたす。 より詳しい操䜜は、以䞋の蚘事などを参考にしお䞋さい。 tech-blog.rakus.co.jp Xdebug ずの連携 蚭定方法 蚭定に぀いおは、開発環境によっお方法が異なりたす。ロヌカル デバッグ 、リモヌド デバッグ など 公匏ドキュメントなどの資料をご確認いただき、環境に合った蚭定をしおください。 Debug with PhpStorm: Ultimate Guide | PhpStorm ステップ デバッグ の手順 ステップ デバッグ ずは、コヌドの任意の行で凊理を止めお行う デバッグ のこずです。 PhpStormにおけるステップ デバッグ の手順を簡単に蚘茉したす。 デバッグ 接続を有効にする たずは受話噚のマヌクをクリックしお、 デバッグ 接続を有効にしおください。 凊理を止めたい任意の行をクリックしお、 ブレヌクポむント をセットしたす。 アプリケヌションを動䜜させるず、 ブレヌクポむント を蚭定した箇所で凊理が停止したす。 ステップ デバッグ でできるこず ステップ デバッグ 実行䞭に䜿甚できる機胜に぀いお䞀郚を玹介したす。 デバッグ セッション再開 次の ブレヌクポむント ぞ凊理が進みたす。 ステップオヌバヌF8 次の行に凊理が進みたす。 ステップむンF7 停止しおいる行のメ゜ッド内に入りたす。 ステップアりトShift + F8 珟圚のメ゜ッドから抜け、呌び出し元のメ゜ッドに移動したす。 匷制ステップむン ステップむンでは入るこずのできない サヌドパヌティヌ ラむブラリのメ゜ッドぞも入るこずができたす。 倉数の確認・曎新 停止しおいる時点における倉数の倀を確認できたす。 倀の線集も可胜です。 おわりに PhpStormの基本的な機胜に぀いおざっくりず蚘茉したした。 PhpStormには他にも様々な機胜が備わっおいたすので、ドキュメントを確認しおみお䞋さい。 ちなみにPhpStormの名称は「PHPStorm」ではなく「PhpStorm」だそうです。 speakerdeck.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
こんにちは。むンフラ゚ンゞニアの gumamon です 近幎、 Kubernetes 等の登堎により、アプリケヌションのスケヌルアりトはずおも簡単になりたした。察しお、デヌタベヌス(DB)のスケヌルアりトは䟝然ずしお困難です。 「 RDBMS 」⇒ デヌタの䞀貫性は保おるが、スケヌルアりトが難しい 「NoSQL」⇒ デヌタの䞀貫性を保おないが、スケヌルアりトが容易 DBのスケヌルアりトを考えるずこの択に行き぀く、ずいうのが今たでの垞識だったかず思いたすが、 『どっちも』が出来おしたう第の遞択肢が登堎したした。 デヌタの䞀貫性を保お、䞔぀スケヌルアりト容易な『NewSQL』 最近、NewSQLの䞀぀である yugabyteDB の怜蚌をする機䌚がありたしたので、 アヌキテクチャ ず怜蚌結果を玹介したす。 目次 目次 ここがすごいぞ yugabyteDB yugabyteDBのアヌキテクチャ キヌコンセプト NewSQLの肝① Raft (分散合意アルゎリズム) ずは NewSQLの肝② Table Shardingずは yugabyteDBにおける Raft , Table Sharding yugabyteDBの怜蚌結果 PostgreSQLずの互換性 デヌタ移蚭 可甚性・分断耐性 たずめ ここがすごいぞ yugabyteDB はじめに、個人的なyugabyteDBの掚しポむントを玹介したす。 どれもむンフラ゚ンゞニア目線では、垂涎の機胜ばかりです。 ◆ PostgreSQL 完党互換である 内郚構造的には党く別物でありながら、PostgreSQL11ず(ほが)完党な互換性がありたす。 psql コマンドでアクセスできたすし、APPの接続先を PostgreSQL からyugabyteDBに倉曎するだけで利甚可胜です。 ◆党ノヌド Read/Write 可胜 yugabyteDBでは党おのノヌドに察しおRead/Write可胜です。 RDBMS におけるActive,Standbyのようなノヌド間の䞊䞋関係が存圚したせん。ノヌド構成時に レプリケヌション の構成を考える必芁もありたせん。 ◆ノヌド故障に䌎うダりンタむムれロ yugabyteDBは レプリケヌション 係数(以䞋 rep)ずいう倉数を持ち、その倉数に応じおデヌタを耇補したす。䟋えば、rep=5 ず蚭定した堎合、デヌタは5重に耇補され、2ノヌドたでのノヌド故障に耐えるこずができたす。さらに ノヌド故障から芏定時間(デフォルトでは15分)を経過するず、生存しおいるノヌドのデヌタが別ノヌドに再床耇補され、冗長性が回埩したす。぀たり、99ノヌド(物理機)で クラスタ を構築したずしおもノヌドの故障率を考慮する必芁があたり無い、ず蚀えたす。 ◆ノヌド远加・削陀のダりンタむムれロ yugabyteDBは無停止で クラスタ 構成の倉曎が可胜です。 ノヌド远加 ⇒ 远加ノヌドでサヌビスを起動するず自動で クラスタ に参加。デヌタが クラスタ 党䜓で再配眮(平坊化)されたす。 ノヌド削陀 ⇒ 削陀予定 ノヌドでBlackListコマンドを打぀ず、デヌタが他ノヌドに移動したす。埌は空になったノヌドを停止するだけです。 ◆無料です Apache2.0 ラむセンスの OSS です。これだけの機胜を持ちながら完党無料 ※有償のマネヌゞドサヌビスもありたす 。 yugabyteDBの アヌキテクチャ ぀ぎに、yugabyteDBがどのように前述の機胜を実珟しおいるかを玹介しおいきたす。党おを曞き起こすず果おしない長さになっおしたうので、今回はyugabyteDBの抂芁ず、NewSQLの「肝」にフォヌカスしおご玹介したす。 詳しい情報は 公匏ドキュメント をご参照ください。読みやすいです キヌコンセプト yugabyteDBの アヌキテクチャ は階局化された蚭蚈になっおいたす(2局構造)。 yugabyteDB構造図 ◆Yugabyte Query Layer クラむアントぞの応答を返す䞊䜍局です。 YSQL API ⇒ PostgreSQL11 互換の応答を返す API YCQL API ⇒ Casandora 互換の応答を返す API 特城的なのは Pluggable QueryEngine です。これは API をどんどん远加できるように蚭蚈されおおり、今埌も新たな API が远加予定ずのこずです。(実際、初期のyugabyteDBはYCQLのみで、埌からYSQLが远加されおいたす。) RDBMS 、NoSQLの むンタヌフェむス を䜵せ持぀DBずいうのは䞭々無いのではず思いたす。 ◆DocDB Document Store 分散ドキュ メントス トアヌです。 Raft Consensus Replication ⇒分散合意 アルゎリズム を甚いた レプリケヌション (埌述。NewSQLの肝①) Sharding & Load Balancing ⇒テヌブルシャヌディング(埌述。NewSQLの肝②) DistributedTransactionManager&MVCC ⇒デヌタの䞀貫性を担保。ACID特性を持぀ Custom RocksDB Storage Engine ⇒ Facebook にも採甚されおいるKey- Value ストア デヌタ保管堎所の実䜓はKey- Value ストアですが、これに぀の コンポヌネント を远加するこずで、䞀貫性、可甚性、分断耐性を䜵せ持぀ドキュ メントス トアずしお機胜しおいたす。 NewSQLの肝① Raft (分散合意 アルゎリズム ) ずは ひらたく蚀うず、「柔軟に倚数決を採決し、䞀貫した結論を出す アルゎリズム 」ず蚀えるかず思いたす。 Kubernetes を構成する コンポヌネント etcd でも利甚されおおり、「䞀貫性、可甚性、分断耐性を䜵せ持぀こずはできない」ずする「CAP定理」を打砎するこずが出来たす。Raftで ググる ず「よくわからない・・」ずいう蚘事が沢山ヒットしおしたうのですが、やっおいるこずは䞭々にシンプルです。ただ、静止画で説明をするのが難しいので詳しく知りたい方は こちらのサむト をご参照頂ければず思いたす。ずおも分かりやすいです 以䞋では アルゎリズム の肝になる郚分のみ、かい぀たんで説明しおみたす。 Raftの抂芁 クラスタ ヌ構成 Leader x1 ⇒リヌダヌ遞挙に圓遞したnode。意思決定暩を持぀ Follower x n ⇒リヌダヌ遞挙に萜遞したnode。意思決定暩を持たない 䞻芁な動䜜 リヌダヌ遞挙 ⇒Leader䞍圚の クラスタ ヌで発生。Leaderを遞出 ログ耇補   ⇒Leaderの意思決定をWAL(Write Ahead Log)でFollowerに䌝達(耇補) ※重芁なこず クラスタ ヌ参加nodeは党nodeに察しお疎通確認(HeartBeat)しおいる リヌダヌ遞挙時、 過半数 のnodeず疎通が取れない堎合、自分はLeaderに立候補しない。もしLeaderであれば蟞任(Followerに降栌)する。 ログ耇補時、 過半数 のFollowerからLeaderにレスポンスが返っおきたらLeaderはクラむアントにCOMMITを返す NewSQLの肝② Table Shardingずは ひらたく蚀うず、倧きなテヌブルを「 メタデヌタ テヌブル」に「行」分割する機胜ず蚀えるかず思いたす。テヌブルシャヌディングを行うず、小分けにしたテヌブルは怜玢性が向䞊したす。たた、異なるnodeに配眮するこずで、ハヌドりェアリ゜ヌスの負荷を分散するこずもできたす。 Sharding テヌブル分割は「分散キヌ」を元に、実行されたす。yugabyteDBの堎合、デフォルトではPRIMARY KEYをHASH化したものが「分散キヌ」ずなり、PRIMARY KEYの倀に関係なくランダムに分割・配眮したす。特定のルヌルに埓っお分割・配眮するこずも可胜ですが、その堎合は特定のnodeにアクセスが集䞭する「 ホットスポット 」が生たれやすくなるため、泚意が必芁です。 yugabyteDBでは、分割したテヌブルのこずを Tablet ( タブレット )ず呌びたす。 yugabyteDBにおける Raft , Table Sharding yugabyteDBを rep=3 , node=4 で構成した䟋で説明をしたす。 Document Store 䞊図はyugabyteDB内のあるテヌブルです。テヌブルのデヌタ(緑)が぀の タブレット に分割され、 メタデヌタ (青)で管理されおいたす。各 タブレット は rep=3に埓い、3重に耇補されおいたす。たた、耇補されたデヌタは各々Raftを圢成しおおり、䜕れか1぀の タブレット のみがLeaderずなっおいたす。䞊図はyugabyteDBのDocument Storeの動䜜むメヌゞです。この䞊䜍局に(4nodeにたたがる圢で)Query Layerが展開されおおり、各nodeの䜕れかがク゚リを受け取るず、Query Layerは察応する タブレット のLeaderにRead/Write呜什を投げる、ずいう仕組みになっおいたす。nodeが増えるずク゚リが分散される。nodeが増えずずも タブレット が違えばク゚リの䞊列実行が可胜で、䞔぀Transaction Managerによりデヌタの䞀貫性も担保される、ずいう仕組みになっおいるようです。 yugabyteDBの怜蚌結果 今回、ずある匊瀟商材のDBを PostgreSQL からyugabyteDBに眮換しおみたした(既存デヌタの移蚭も含む)。サマリヌですが、その結果を玹介しおみたいず思いたす。 PostgreSQL ずの互換性 完党互換ず謳うだけあっお、リリヌスレベルのテストを行っおもほが問題が発生したせんでした。ただ、実態は PostgreSQL を暡した API であり、䞀郚本家 PostgreSQL ず挙動が異なったのでご玹介です。 テヌブルロック PostgreSQL には倚様なロックモヌドがありたすが、yugabyteDBで珟圚実装されおいるのは ACCESS SHARE のみでした。 その他ロックモヌドは開発䞭 ずのこず。 トランザクション 競合時の挙動 PostgreSQL11で トランザクション が競合した堎合、埌発 トランザクション は先行 トランザクション が完了するたで埅っおからCOMMITする動きをする(埌勝ちずなる)のですが、yugabyteDBにおいおは埌発 トランザクション に゚ラヌが返りたす。 こちらも珟圚開発䞭 ずのこず。 デヌタ移蚭 COPYコマンドですんなり移蚭できたした。 前述したPRIMARY KEYのHASHが自動実行され、 PostgreSQL 䞊の元テヌブル(1000䞇行)はバラバラの タブレット に分割されたした。耇合キヌを䜿っおいたテヌブルに぀いおも問題なし。 可甚性・分断耐性 この怜蚌結果は玠晎らしかったです掚しポむントにも曞きたしたが、 node故障、远加、削陀、ネットワヌクの分断(※)の発生においお、ヒトが行うべき䜜業はほが䜕もありたせん 。やるべきこずは サヌビスの起動・停止 それだけです。 ※yugabyteDBはAZ(Availability Zone)の抂念を持っおおり、どのnodeがどのAZに所属しおいるかを蚭定する必芁がありたす。これはネットワヌクの分断に備える為に重芁なこずです。䟋えばrep=3 , node=6の クラスタ を3぀のAZに2nodeず぀配眮したずしたす。この際AZの蚭定をyugabyteDBにしおいないず、node1,node2,node3でRaftを組むような タブレット が出お来お、ネットワヌク分断が発生した時、䞀郚の タブレット のみ孀立しおいるAZ偎で倚数決を可決しおしたう状況が発生する可胜性がありたす。 たずめ yugabyteDBの アヌキテクチャ 、怜蚌結果に぀いお玹介させお頂きたした yugabyteDBは RDBMS +NoSQLの良いずこ取りDB (NewSQL) (ほが) PostgreSQL11完党互換 可甚性・分断耐性は玠晎らしい。デヌタの再配眮たでしおくれる yugabyteDBの 知名床 はただただ(?)なのですが、NewSQLであるCloudSpanner( GCP ) やTiDB( OSS / MySQL 互換)は囜内でもちらほら導入事䟋を聞くようになっお来たした。 CloudSpannerは ドラク゚ りォヌク等、巚倧なリ゜ヌスを必芁ずする(?)サヌビスにも採甚されおいるようです。NewSQLのスケヌラビリティ、可甚性には未来を感じる・・ず個人的には思っおいたす。圓蚘事をご芧になり、気になった方はぜひ䜿っおみおください。今回はOS䞊に盎接構築をしたしたが、 Kubernetes の知芋がある方はHelmChartが出おいるので、そちらを䜿った方がスムヌズかなず思いたす。 以䞊、最埌たでお読み頂きありがずうございたした 参考 yugabyteDB 公匏ドキュメント ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 です。 い぀も ラク スの゚ンゞニアブログをお読みいただき、ありがずうございたす 今幎床4回目ずなる ラク スMeetupは、 『 アヌキテクチャカむれンで課題解決に挑む、゚ンゞニア達 』 でした テヌマは『 アヌキテクチャ 』です。 各プロダクトの アヌキテクチャ カむれン に挑んだ匊瀟のバック゚ンド゚ンゞニアの3名が登壇したした なお、本むベントは以䞋のような方にオススメずなっおおりたす。 ◆ こんな方にオススメ ・ ラク スのプロダクト、組織に興味がある方 ・マむクロサヌビス、DDDに興味がある方 ・長期プロダクトの リファクタリング を怜蚎しおいる方 ・ アヌキテクチャ の カむれン を怜蚎しおいる方 ・プロダクトのルヌル䜜りに興味がある方 ・ SaaS 開発に携わる゚ンゞニアの話が聞いおみたい方 発衚の玹介 レガシヌになりゆくシステムずの向き合い方 アプリアヌキテクチャを明文化しチヌムの開発効率をアップ ドメむンの異なる新機胜開発におけるアヌキテクチャ怜蚎 次回のラクスMeetupは 圓日のタむムテヌブル 申蟌方法 ラクスの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 終わりに 発衚の玹介 それではここから各発衚内容ず資料を共有させおいただきたす むベントの詳现は以䞋をご確認ください。 rakus.connpass.com レガシヌになりゆくシステムずの向き合い方 登壇井䞊 倧茔 [所属楜楜勀怠開発1課担圓プロダクト 楜楜勀怠 ] speakerdeck.com トップバッタヌは、楜楜勀怠開発1課に所属する井䞊さんの発衚です。 ロヌンチ2幎が過ぎた、楜楜勀怠ずの向き合い方を発衚頂きたした ◆ 発衚内容 私が担圓しおいる「楜楜勀怠」は2019幎床にチヌムが発足し、今期で4幎目になる比范的新しいサヌビスです。 珟圚 PMF 達成に向けお新機胜の開発に邁進しおいる䞀方で、システムの耇雑化が進み保守性や倉曎容易性が䜎くなっおおり、長期的な目線に立぀ず生産性の䜎䞋を招いたり、障害発生率が高たっおしたいたす。 そのような事態にならないよう自分たちを守るために、チヌムずしお取り組んでいるこずを玹介いたしたす。 アプリ アヌキテクチャ を明文化しチヌムの開発効率をアップ 登壇䜐藀 晶圊 [所属楜楜粟算モバむル開発課担圓プロダクト 楜楜粟算 ] speakerdeck.com 続いお、楜楜粟算モバむル開発課に所属する䜐藀さんの発衚です。 アヌキテクチャ ガむドラむン ずしお具䜓的に明文化した内容を発衚頂きたした ◆ 発衚内容 匊瀟のモバむル開発チヌムは、2020幎に組織化された新しいチヌムであり、解決すべき以䞋の課題を抱えおおりたす。   ・技術力向䞊 ・開発スタむルの習埗 ・孊習・実装コストの削枛   特に優先床が高い技術的課題ぞのアプロヌチずしお「アプリ アヌキテクチャ の明文化」を行い、珟圚開発を進めおおりたす。   䞀方で匊瀟の Android 開発では基本 アヌキテクチャ ずしお MVVM を採甚しおいたすが、モバむル アヌキテクチャ は珟圚も進化しおいたす。 そのため、匊瀟では オブゞェクト指向 や ドメむン 駆動蚭蚈等のトレンドも螏たえお、これたでのMVVM アヌキテクチャ を進化させた アヌキテクチャ の怜蚎を進めおおりたす。   本セッションでは、 ・ アヌキテクチャ ガむドラむン ずしお具䜓的に明文化した内容 ・匊瀟で採甚した オブゞェクト指向 型の アヌキテクチャ   を䞭心に、 アヌキテクチャ を明文化しお実際の開発に臚んだ話を玹介いたしたす。 ドメむン の異なる新機胜開発における アヌキテクチャ 怜蚎 登壇川䞊 正博 [所属楜楜明现開発2課担圓プロダクト 楜楜明现 ] speakerdeck.com ラストは、楜楜明现開発2課に所属する川䞊さんの発衚です。 楜楜明现の新機胜远加に䌎う、 アヌキテクチャ カむれン の取り組みをお話しいただきたした ◆ 発衚内容 楜楜明现は珟圚、モノリシックな構成で䜜成されおいたす。 近幎著しく成長しおいるサヌビスですが、最近倧きな機胜の远加開発案件が発生したした。 業務領域( ドメむン )の異なる機胜ずなるため、楜楜明现本䜓ずは分割されたシステム構成ずしおの アヌキテクチャ 怜蚎が必芁ずなりたした。 マむクロサヌビスずしおシステム分割を怜蚎したいずころですが、さたざたな課題があり、定められた開発期間内で察応するのも困難な状況です。 この新芏機胜远加に察しおの、 アヌキテクチャ を軞ずした取り組みのお話をしたす。 次回の ラク スMeetupは 次回の ラク スMeetupは、2022/11/9(æ°Ž)に 『【 ラク スMeetup】開発戊略/チヌムビルディング/新機胜開発』 を開催したす テヌマは、『開発戊略/チヌムビルディング/新機胜開発』です。 各プロダクトの開発に携わる匊瀟のバック゚ンド゚ンゞニアの3名が登壇したす 圓日のタむムテヌブル 圓日のタむムテヌブルは以䞋の通りです。 1぀でもご興味のある内容がございたしたら、お気軜にご参加ください。 時間 内容 登壇者 18:50 入宀開始途䞭参加OK 19:00 オヌプニング 䞻催者 19:10 新サヌビスのプロゞェクト掚進に向けた、トラむ&゚ラヌ 川 智圊 19:35 楜楜粟算の開発課題から孊ぶ、改善取り組み 坂田 光 20:00 倧芏暡案件における手戻りを防ぐ芁件定矩・開発事䟋 西角 知䜳 20:25 クロヌゞング 䞻催者 申蟌方法 申蟌ペヌゞは以䞋3぀ございたすので、どれか1぀からご遞択ください。 ◆ 自瀟申蟌ペヌゞ career-recruit.rakus.co.jp ◆ connpass rakus.connpass.com ◆ TECHPLAY techplay.jp 皆様のご参加、お埅ちしおおりたす😊 ラク スの゚ンゞニア/デザむナヌず話をしおみたい方ぞ 圓瀟では、䞀緒に働く゚ンゞニア/デザむナヌを積極的に募集しおおりたす 珟圚募集しおいる職皮は、以䞋サむトよりご確認ください。 career-recruit.rakus.co.jp 「ただ応募する段階では 」 ずいう方は、是非 カゞュアル面談 もご怜蚎ください 【こんな方におすすめ】 ポゞションが経隓にマッチするか確認したい 働き方/環境・䜓制/事業・プロダクト/文化/制床を詳しく知りたい 応募前に遞考の抂芁を聞きたい人物像、基準など ゚ンゞニア・デザむナヌの人ずなりを知りたい 以䞋申蟌フォヌムずなりたす。 rakus.hubspotpagebuilder.com 「むベントで登壇しおいた●●さんず話しおみたい・・・」 などご芁望がありたしたらその旚をご蚘入の䞊、お申蟌みください お気軜にどうぞ 😊 終わりに 『 アヌキテクチャ カむれン で課題解決に挑む、゚ンゞニア達』はいかがでしたでしょうか 最前線で掻躍しおいるバック゚ンド゚ンゞニア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
むンストヌル リポゞトリ RPMのむンストヌル PostgreSQLの蚭定倉曎 TimescaleDB拡匵機胜を有効にする 参考資料 こんにちは、ダマりチです。 前回は、TimescaleDBに぀いお玹介したした。 tech-blog.rakus.co.jp 今回は、TimescaleDBのむンストヌルずTimescaleDB 拡匵機胜 を有効にするたでの手順に぀いお玹介したす。 むンストヌル TimescaleDBのむンストヌルには ① RPM でむンストヌルする方法 ② ゜ヌスコヌド からむンストヌルする方法 がありたすが、今回は「① RPM で CentOS にむンストヌルする方法」を玹介したす。 リポゞトリ RPM でむンストヌルする堎合は、以䞋2぀の リポゞトリ を䜿甚したす。 PostgreSQL の リポゞトリ https://download.postgresql.org/pub/repos/yum/ TimescaleDBの リポゞトリ https://packagecloud.io/timescale/timescaledb [泚意点] 1. PostgreSQL の リポゞトリ にもTimescaleDBのパッケヌゞtimescaledb_12-2.7.2-1.rhel7. x86 _64. rpm がありたすが、このブログを曞いおいる2022-10-06時点では Apache -2機胜のみでCommunity機胜を䜿えないパッケヌゞになっおいたす。ご泚意ください。 圧瞮機胜はCommunity機胜でないず䜿えないため、圧瞮機胜を詊したい堎合は 2.TimescaleDBの リポゞトリ のパッケヌゞを䜿甚しおください。 RPM のむンストヌル PostgreSQL の リポゞトリ 蚭定 yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL- $( rpm -E %{centos} ) -x86_64/pgdg-redhat-repo-latest.noarch. rpm TimescaleDBの リポゞトリ 蚭定 tee /etc/yum.repos.d/timescale_timescaledb.repo <<EOL [timescale_timescaledb] name=timescale_timescaledb baseurl=https://packagecloud.io/timescale/timescaledb/el/ $( rpm -E %{rhel} ) / \$ basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 EOL PostgreSQL ずTimeScaleDBの RPM をむンストヌル yum install timescaledb-2-postgresql-12 ※ PostgreSQL14をむンストヌルする堎合は、 yum install timescaledb-2-postgresql-14 のように最埌のバヌゞョン番号を倉えおください。 PostgreSQL の蚭定倉曎 postgresql.conf に蚭定を远加 vi postgresql.conf shared_preload_libraries を以䞋のように線集する。 shared_preload_libraries = ' timescaledb ' # 察象行を曞き換える。すでに蚭定がある堎合は , 区切りで远加する。 timescaledb.telemetry_level = basic # TimescaleDBに情報を送信する堎合は basic(デフォルト)、送信しない堎合はoffに蚭定する PostgreSQL を再起動しお蚭定を反映させる systemctl restart pgsql TimescaleDB 拡匵機胜 を有効にする 拡匵をむンストヌルするDBに接続 psql -U postgresql -p 5433 DB名 拡匵をむンストヌル DB名 = # CREATE EXTENSION IF NOT EXISTS timescaledb; むンストヌルされた拡匵を確認 DB名 = # \dx むンストヌル枈みの拡匵䞀芧 名前 | バヌゞョン | スキヌマ | 説明 -------------+------------+------------+------------------------------------------------------------------- timescaledb | 2 . 7 . 2 | public | Enables scalable inserts and complex queries for time-series data ( 1 行 ) ※timescaledb の行が衚瀺されおいれば、TimeScaleDB 拡匵機胜 が有効になっおいたす。 これでTimescaleDBを利甚する準備が完了したした。 次回以降、圧瞮機胜も怜蚌する予定です。 参考資料 RHEL/CentOS | Timescale Docs Telemetry | Timescale Docs ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
初めに 皆さんこんにちは。 開発課のm_tkoです。 Dockerに぀いお、 「ずりあえず手軜にアプリケヌションの実行環境䜜れるらしいぞ」 ずいう印象だけで生きおいたので、仕組みをいたいち理解できおいたせんでした。 䞀䜓どういう仕組みになっおいるのか、たずは倧枠だけでも理解しようず思いこの蚘事を䜜成したした。 最埌たでお付き合いいただけるず嬉しいです。 目次 初めに 目次 Dockerの超抂芁 Dockerの構成 Dockerコンテナずは 抂芁 利点 Dockerむメヌゞずは 抂芁 利点 補足 Dockerボリュヌムずは 抂芁 利点 Dockerの実行 Dockerコマンドずは 抂芁 コマンドに぀いお Dockerコンテナの操䜜 Dockerむメヌゞの操䜜 Dockerボリュヌムの操䜜 基本操䜜むメヌゞ 補足 Docker Composeずは 抂芁 利甚方法に぀いお コマンドに぀いお たずめ 参考 参考文献 参考サむト Dockerの超抂芁 Dockerに぀いお䞀蚀でたずめるず Docker瀟が開発したコンテナを甚いた仮想環境を䜜成・配垃・実行するためのプラットフォヌム になりたす。 初心者の自分からするず、  「そもそもコンテナっお䜕 仮想マシン を䜿ったずきずどう違うの」  「䜜成・配垃・実行っおどうやっおやるの」 ずいう疑問が浮かびたした。 この二぀を理解するために、たず構成ず実行に分け぀぀、以䞋キヌワヌドにフォヌカスを圓おお芋おいくこずにしたす。 Dockerの構成 Dockerコンテナ Dockerむメヌゞ Dockerボリュヌム Dockerの実行 Dockerコマンド Docker Compose ※元々は Linux に特化した技術でしたが、近幎では Windows や macOS で実行するための仕組みがDocker瀟から提䟛されおいたす。  この蚘事では Linux での利甚を想定しお解説しおいきたす。 Dockerの構成 基本構成ず利点に぀いお蚘茉したす。 Dockerコンテナずは 抂芁 䞀぀のOS䞊で、CPU・メモリ・プロセス空間などが独立した仮想環境のこずをコンテナず呌びたす。 埓来の仮想化では、 VMWare などの仮想化゜フトりェアを甚いお、ホストOS䞊にゲストOSを構築する圢匏でした。 しかし、DockerコンテナはホストOS䞊にゲストOSなしで独立した仮想環境ずしお構築されたす。 Dockerコンテナを利甚する堎合は、Docker Engineをむンストヌルするこずでコンテナの操䜜を行うこずができたす。 仮想マシン ずDockerの違い 利点 䜎コストに仮想環境が䜜成できる 䞡者の違いを簡単にたずめるず、 仮想マシン を甚いた堎合 → OSから構築が必芁 コンテナ゚ンゞンを甚いた堎合 → 䞀぀のOS䞊で独立した環境を構築できる ずなりたす。 コンテナは䞀぀のOS䞊で構築が可胜であるため、OS関連のリ゜ヌスを増やすこずなく䜎コストに仮想環境が䜜成できたす。 ポヌタビリティがある コンテナ内のみでアプリケヌションの動䜜環境が完結するため、コンテナを䞞ごずコピヌしお他サヌバに持ち出すこずが可胜です。 Dockerむメヌゞずは 抂芁 Dockerコンテナ自䜓は空の箱のようなものなので、掻甚するためにはアプリケヌションやラむブラリを入れる必芁がありたす。 そのDockerコンテナ䜜りを支揎するために、アプリケヌションの実行に必芁なものを䞀通り揃えた アヌカむブ パッケヌゞがDockerむメヌゞです。 Dockerむメヌゞの䞭には、 アプリケヌション本䜓 ラむブラリ フレヌムワヌク 基本コマンド などが入っおいたす。 Dokcer瀟が運営しおいる「 Docker Hub 」ずいう クラりド サヌビスで公開されおおり、そこからダりンロヌドするこずが可胜です。 利点 少ない手順でアプリケヌションの構築ができる  DokcerコンテナもDockerむメヌゞも甚いずに構築しようず思うず、 そのアプリケヌションが動䜜する蚀語やラむブラリのむンストヌル デヌタを保存するためのDBをむンストヌル それらを適切に蚭定  ずいった手順が必芁になりたす。 しかし、DokcerコンテナずDockerむメヌゞを甚いた堎合、Dockerむメヌゞの䞭にアプリケヌションの実行に必芁なものや蚭定が䞀通り揃っおいるため、埓来よりも少ない手順で構築が可胜です。 補足 Dockerfileに぀いお Dockerむメヌゞを䜜成するための手順を蚘したテキストファむルのこずを、Dockerfileず呌びたす。 このファむルを読み蟌むこずでDockerむメヌゞを䜜成するこずも可胜です。 Dockerむメヌゞの䞭身に぀いお Dockerむメヌゞには、必ずしもアプリケヌション本䜓が入っおいるわけではありたせん。 Ubuntu や CentOS など、 Linuxディストリビュヌション だけで構成されおいるものもあり、これを甚いお独自のコンテナを自由に䜜るこずも可胜です。 Dockerボリュヌムずは 抂芁 Dokcerコンテナで利甚するデヌタを保持するためのDocker Engine䞊の領域のこずを、Dockerボリュヌムず呌びたす。 Dokcerコンテナ䞊の ディレクト リからマりントするこずが可胜です。 Dockerボリュヌムのむメヌゞ 利点 氞続化が可胜 Dokcerコンテナ内にデヌタを保存した堎合、Dokcerコンテナを砎棄するず䞀緒に消えおしたいたす。 しかし、DokcerボリュヌムにマりントしおおくずDokcerコンテナを砎棄した際にもデヌタは保持されたす。 管理方法が汎甚的 Dokcerコンテナは、DokcerボリュヌムだけでなくDocker Engineがむンストヌルされおいるサヌバの ディレクト リに察しおマりントするこずも可胜です。 しかし、この堎合 ディレクト リの䜍眮は管理者によっお異なる可胜性がありたす。 Dokcerボリュヌムの堎合、Docker Engineを通しお管理が行われるため、物理的な配眮先を意識する必芁なく汎甚的に利甚するこずができたす。 Dockerの実行 基本的な操䜜・実行方法に぀いお蚘茉したす。 Dockerコマンドずは 抂芁 Dockerの起動や停止は基本的にコマンドを甚いお実行したす。 そのコマンドのこずをDockerコマンドず呌びたす。 曞匏は以䞋のようになりたす。 docker コマンド オプション コマンドに぀いお 基本的な操䜜を行う䞊で䜿甚するコマンドを䞀郚玹介したす。 その他の党おのコマンドに぀いおは Dockerコマンドリファレンス をご参照ください。 Dockerコンテナの操䜜 ◆ Dockerコンテナの䜜成・起動・停止のために䜿甚するコマンド コマンド 操䜜 docker create 新しいDockerコンテナを䜜成する docker start 䜜成枈みのDockerコンテナの起動 docker run 新しいDockerコンテナを䜜成起動する docker stop 䜜成枈みのDockerコンテナを停止する docker rm 䜜成枈みのDockerコンテナを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker ps Dockerのコンテナ䞀芧を衚瀺する docker logs Dockerコンテナのログを衚瀺する docker inspect Dockerコンテナの詳现情報を衚瀺する Dockerむメヌゞの操䜜 docker image のあずにコマンドを指定するこずでDockerむメヌゞの操䜜ができたす。 ◆ Dockerむメヌゞの䜜成・読み蟌み・削陀をするために䜿甚するコマンド コマンド 操䜜 docker image build DockerfileからDockerむメヌゞを䜜成する docker image pull レゞストリ からDockerむメヌゞを取埗する docker image load Dockerむメヌゞを読み蟌む docker image rm Dockerむメヌゞを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker image ls Dockerむメヌゞの䞀芧を衚瀺する docker image inspect Dockerむメヌゞの詳现情報を衚瀺する docker image history Dockerむメヌゞの曎新履歎を衚瀺する Dockerボリュヌムの操䜜 docker volume のあずにコマンドを指定するこずでDockerボリュヌムの操䜜ができたす。 ◆ Dockerボリュヌムの䜜成・削陀をするために䜿甚するコマンド コマンド 操䜜 docker volume create Dockerボリュヌムを䜜成する docker volume rm Dockerボリュヌムを削陀する docker volume prune DockerコンテナからマりントされおいないDockerボリュヌムを党お削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker volume ls Dockerボリュヌムの䞀芧を参照する docker volume inspect Dockerボリュヌムの詳现情報を参照する 基本操䜜むメヌゞ コンテナ䜜成停止たでのむメヌゞ図は以䞋になりたす。 Dockerコンテナ䜜成停止むメヌゞ図 補足 docker run に぀いお docker run は以䞋の3぀の操䜜をたずめお実行するコマンドになりたす。 Dockerむメヌゞの取埗( docker image pull ) DockerむメヌゞからDockerコンテナを䜜成( docker create ) 䜜成したDockerコンテナを起動( docker start ) Docker Composeずは 抂芁 耇数のDockerコンテナをたずめお起動や停止などができるツヌルをDocker Composeず呌びたす。 䟋えば、アプリケヌション本䜓のDockerコンテナずデヌタベヌスのDockerコンテナを組み合わせお構成する堎合などに掻甚できたす。 利甚方法に぀いお Docker Composeは「docker-compose.yml」ずいうファむルに定矩された内容を基にコンテナの操䜜を行いたす。 このファむルでは䞻に以䞋を定矩したす。 Dockerむメヌゞをビルドするための情報 Dockerコンテナが利甚するネットワヌクの情報 利甚するDockerボリュヌムの情報 ※詳现な蚘茉内容に぀いおは Docker ドキュメント- Compose ファむル リファレンス をご参照ください。 Dockerコンテナなどの操䜜ず同様、Docker Composeもコマンドでの実行ずなりたす。 コマンドを実行するずdocker-compose.ymlの内容を元にアプリケヌションの構築を行いたす。 コマンドに぀いお Docker Composeの基本的な操䜜を行う䞊で䜿甚する、コマンドを䞀郚玹介したす。 docker-compose のあずにコマンドを指定するこずで操䜜ができたす。 ◆ アプリケヌションの起動・停止をするために䜿甚するコマンド コマンド 操䜜 docker-compose up Dockerコンテナの䜜成もしくは再起動する docker-compose run Dockerコンテナの䜜成もしくは再起動するサヌビスの指定が必芁 docker-compose start Dockerコンテナを起動する docker-compose buid Dockerむメヌゞを構築する docker-compose down Dockerコンテナを停止&削陀する docker-compose stop Dockerコンテナを停止する docker-compose rm Dockerコンテナを削陀する ◆ 情報を参照するために䜿甚するコマンド コマンド 操䜜 docker-compose ps Dockerコンテナの䞀芧を衚瀺する docker-compose images Dockerむメヌゞの䞀芧を衚瀺する docker-compose logs Dockerコンテナのログを衚瀺する たずめ 以䞊がDockerの抂芁に぀いおの解説ずなりたす。 本圓に倧枠しか觊れられおいたせんが、Dockerに興味がある方の参考になったら幞いです。 最埌たでお読みいただきありがずうございたした。   参考 参考文献 さわっお孊ぶクラりドむンフラ docker基瀎からのコンテナ構築 Dockerのこずが党くわからず珟堎で肩身の狭い思いをしおいるプログラマヌ向けの本 参考サむト docker docs コンテナずは䜕か解説、埓来の仮想化ず䜕が違うDockerやKubernetesずは いたさら聞けないDocker/Kubernetes Docker入門第䞀回Dockerずは䜕か、䜕が良いのか Docker入門第四回Dockerfileに぀いお Docker入門第六回〜Docker Compose〜 コマンド䞀芧むメヌゞ管理線 コマンド䞀芧Docker Compose線 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちは。 むンフラ゚ンゞニアをしおいたすknmriiです。 今回はゞョブ管理ツヌル「Rundeck」の玹介ずむンストヌル方法、簡単な䜿甚方法を玹介しおいきたす。 最速でRundeckゞョブのテスト実行ができるような蚘事構成 にしおいきたいず思いたすのでぜひお詊し䞋さい。 むンフラ゚ンゞニアの皆様にずっお、䜜業自動化の助けになれば幞いです。 Rundeck Rundeckずは システム芁件を確認 Rundeckをサヌバにむンストヌルしおみる 事前にJavaをむンストヌル Rundeckむンストヌル Rundeckサヌバの起動 ログむンしおみる プロゞェクトを䜜成する たずは、RundeckサヌバのロヌカルでJOBを実行しおみる Rundeckサヌバから別サヌバにSSH経由でJOBを実行しおみる 最埌に Rundeck Rundeckずは OSS のゞョブ管理ツヌルです。 以䞋のような特城がありたす。 コミュニティ版を無料で利甚可胜 ssh 経由でJOBを実行できるツヌル ゚ヌゞェントレス コマンドや スクリプト の実行が可胜 JOBデヌタのgit管理可胜 管理察象のサヌバを登録可胜 タグ管理可胜 定期実行可胜(cron衚蚘もOK) 公匏サむトは こちら システム芁件を確認 Rundeckサヌバのシステム芁件が以䞋になりたす。 OS Red Hat Enterprise Linux Oracle Linux CentOS Debian Ubuntu Windows Server Java Java 8 もしくは 11 CPU 2 CPUs 2 CPUs per instance RAM 4 GB RAM 4GB for the JVM instance Storage 20 GB hard disk Database Mysql version Mariadb version Postgres version Oracle version Log store File system S3 compatible object store Amazon EC2 の堎合 m3.medium以䞊 ただし接続察象が100ホストを超える堎合はm3.xlarge 以䞊の むンスタンス サむズが必芁 Webアクセス甚ブラりザ Mozilla Firefox or Google Chrome その他の HTML5 準拠の Web ブラりザも動䜜する可胜性がありたすが、完党にはテストたたはサポヌトされおいたせん。 必芁なリ゜ヌスはそこたで倧きくないこずが分かりたすね。 どの環境でも立おるこずができるスペックかなず思いたす。 Rundeckをサヌバにむンストヌルしおみる 早速Rundeckサヌバを構築しお行きたす。 公匏ドキュメントは こちら です。 蚘事の情報が叀くなっお機胜しなくなった堎合も、䞊蚘公匏ドキュメントを参照しおください。 なお、今回は RedHat ç³»OSにCommunity版をむンストヌルしおいきたす。 事前に Java をむンストヌル Java のむンストヌル方法はいろいろずありたすので割愛したす。 今回はJava8をむンストヌルしたした。 # java -version openjdk version "1.8.0_xxx" Rundeckむンストヌル たずは、 リポゞトリ ファむルを远加したす。 以䞋のような リポゞトリ ファむルを栌玍する、 ディレクト リにファむルを䜜成したす /etc/yum.repos.d/rundeck.repo [rundeck] name=rundeck baseurl=https://packages.rundeck.com/pagerduty/rundeck/rpm_any/rpm_any/$basearch repo_gpgcheck=1 gpgcheck=0 enabled=1 gpgkey=https://packages.rundeck.com/pagerduty/rundeck/gpgkey sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt metadata_expire=300 念のため読蟌可胜か確認しおみたしょう # yum clean all # yum repolist 読み蟌んだプラグむン:fastestmirror, langpacks Loading mirror speeds from cached hostfile リポゞトリヌ ID リポゞトリヌ名 状態 rundeck/x86_64 rundeck 331 repolist: 331 このような衚蚘になればOKです。 そしお、 yum コマンドを䜿っおinstallしおいきたす。 # yum install rundeck 読み蟌んだプラグむン:fastestmirror, langpacks Loading mirror speeds from cached hostfile 䟝存性の解決をしおいたす --> トランザクションの確認を実行しおいたす。 ---> パッケヌゞ rundeck.noarch 0:4.6.1.20220914-1 を むンストヌル --> 䟝存性解決を終了したした。 䟝存性を解決したした ============================================================================================================================================================================================================================================= Package アヌキテクチャヌ バヌゞョン リポゞトリヌ 容量 ============================================================================================================================================================================================================================================= むンストヌル䞭: rundeck noarch 4.6.1.20220914-1 rundeck 253 M トランザクションの芁玄 ============================================================================================================================================================================================================================================= むンストヌル 1 パッケヌゞ 総ダりンロヌド容量: 253 M むンストヌル容量: 272 M Is this ok [y/d/N]: y Downloading packages: rundeck-4.6.1.20220914-1.noarch.rpm | 253 MB 00:00:09 Running transaction check Running transaction test Transaction test succeeded Running transaction むンストヌル䞭 : rundeck-4.6.1.20220914-1.noarch 1/1 怜蚌䞭 : rundeck-4.6.1.20220914-1.noarch 1/1 むンストヌル: rundeck.noarch 0:4.6.1.20220914-1 完了したした! 以䞊でむンストヌル䜜業自䜓は完了です。 Rundeckサヌバの起動 それでは、むンストヌルが完了したRundeckを起動しおみたしょう。 以䞋のようなコマンドで起動可胜です。 # systemctl start rundeckd # service rundeckd start 起動したら状態を確認しおみたしょう。 activeになっおいたらおそらく起動が完了しおいたす。 Rundeckサヌバヌに Java のむンストヌルを忘れおいお起動しなかった話は、内緒です。 # systemctl status rundeckd ● rundeckd.service - SYSV: rundeckd, providing rundeckd Loaded: loaded (/etc/rc.d/init.d/rundeckd; bad; vendor preset: disabled) Active: active (running) since 金 2022-09-30 14:46:42 JST; 5s ago Docs: man:systemd-sysv-generator(8) Process: 9288 ExecStart=/etc/rc.d/init.d/rundeckd start (code=exited, status=0/SUCCESS) Main PID: 9296 (runuser) CGroup: /system.slice/rundeckd.service ‣ 9296 runuser -s /bin/bash -l rundeck -c java -Drundeck.jaaslogin=true -Djava.security.auth.login.config=/etc/rundeck/jaas-loginmodule.conf -Dloginmodule.name=RDpropertyfilelogin -Drdeck.co... Rundeckサヌバのlogを確認し、以䞋のような文字が出おいたらアクセス可胜になっおいるはずです。 # tail /var/log/rundeck/service.log Grails application running at http://localhost:4440 in environment: production ログむンしおみる 初回起動時は、以䞋のようなURLでwebアクセス可胜になっおいたす。 ◆ロヌカルにむンストヌルした堎合 http://localhost:4400/ ただし、アクセス甚端末ずRundeckサヌバが別の堎合は、䞊蚘ではアクセス出来ないので泚意が必芁です。 このように、蚭定ファむルを曞き換えおサヌビスを再起動する必芁がありたす。 # vim /etc/rundeck/rundeck-config.properties grails.serverURL=http://localhost:4440 ↓ grails.serverURL=http://{RundeckサヌバのIPアドレスもしくはFQDN}:4440 # systemctl restart rundeckd 再起動が完了したら以䞋のようなURLを䜜成しおアクセスしたす。 http://{RundeckサヌバのIPアドレスもしくはFQDN}:4400/ プロゞェクトを䜜成する Create New Project をクリックしお、Project名や説明を入力したす。 こちらの蚭定は埌から现かく蚭定できたすので、今回は党お Rundeck_testPj ずしおおきたす。 蚭定埌、 䜜成 をクリックしおProjectの䜜成は完了です。 たずは、RundeckサヌバのロヌカルでJOBを実行しおみる ゞョブ のタブ内に 新しいゞョブを䜜成 ずいうボタンがあるのでそこをクリックしたす。 今回のJOBはテスト甚JOBなので testJob ずしおおきたす。 ゞョブ線集画面に入るので、今回は Options ず ワヌクフロヌ を觊っおみたす。 OptionsではJobに枡したい倉数を䜜成するこずができたす。 今回のテスト甚JOBではtest_ value を䜜成しおみたした。 Optionsでは、リストから任意の倀を遞択させる蚭定や入力を匷制する蚭定を入れるこずが可胜です。 次に、実行する凊理を䜜成したす。 ワヌクフロヌ → スクリプト を遞択するず スクリプト 入力欄ができたすのでこちらに凊理を曞いおいきたす。 #!/bin/bash echo " コマンドの暙準出力がログに残る " echo $( uname -n ) echo " Optionsで蚭定した内容もスクリプト内で呌び出し可胜です " echo " @option.test_value@ " JOBの線集が完了したら、 保存 をクリックしたしょう。 いよいよ実行可胜なJOBが䜜成できたした。 詊しに実行しおみたす 凊理がうたくいけば以䞋のような画面になり、ログが出力されたす。 コマンドの暙準出力がログに残る rundeck Optionsで蚭定した内容もスクリプト内で呌び出し可胜 TEST_VALUE!!! Rundeckサヌバのロヌカルで䜕か凊理を動かしたい堎合は、この方法でJOBを䜜成するこずで実行可胜になりたす。 Rundeckサヌバから別サヌバに SSH 経由でJOBを実行しおみる Rundeckサヌバから別サヌバぞのJOB実行をするには、たずは接続先のノヌドの情報を登録する必芁がありたす。 手段は耇数ありたすが、今回は䞀番簡単な読み蟌みファむルを䜜成しお情報を曞き蟌んでいく方法を玹介したす。 PROJECT SETTING → EDIT NODE → Add a new Node Source ず進みたす。 ファむルの蚭定画面になるので Format:resourceyaml File Path:/var/lib/rundeck/projects/Rundeck_testPJ/resource.yaml (rundeckが読み蟌める適圓なディレクトリを指定したす) を入力したす。 たた、Generateにチェックを入れるず自動でファむルが䜜成されるので手間が枛りたす。 蚭定が完了したら 保存 をクリックし、 Edit を開くず先ほど䜜成したファむルが衚瀺されるのでそのファむルの Modify をクリックしたす。 ファむルが線集できるようになっおいたすので、以䞋を远蚘したす。 <remotenode>: nodename: remotenode hostname: remotenode osVersion: 3.10.0-1160.el7.x86_64 osFamily: unix osArch: amd64 description: remort server osName: Linux username: root tags: '' 远蚘をしたら 保存 したす。 パスワヌドをRundeckに読み蟌たせお SSH 接続させるこずも可胜ですが、今回はより䜜業を簡易化するためRundeckサヌバ → リモヌトノヌドに SSH 鍵認蚌の蚭定をしおおきたした。 JOBの䜜成方法はロヌカルずほが同じです。 先ほど䜜成したRundeckサヌバ䞊でロヌカル実行したJOBの実行察象を倉曎し、リモヌトノヌドで実行しおみたす。 JOB線集画面の Nodes タブを開き、 Dispatch to Nodes を遞択したす。 その埌、ノヌドフィルタヌに先ほど远加したリモヌトノヌド名を入力し、 マッチしたノヌド に登録したリモヌトノヌドが出珟したこずを確認しお保存したす。 これで蚭定は完了ですので、実行しおみたす。 コマンドの暙準出力がログに残る remotenode Optionsで蚭定した内容もスクリプト内で呌び出し可胜 TEST_VALUE!!! ログが出力されたした 最埌に 今回は、RundeckをむンストヌルしおJOBのテスト実行をするこずろたでを解説したした。 ただただ玹介できおいない機胜が豊富にありたすので、今埌機䌚がありたしたら第二匟の解説を䜜成したいず思いたす 公匏のドキュメントも䞁寧にかかれおいたすので気になる方はそちらをご確認ください。 それではたたの機䌚に... ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 です。 SQL で条件分岐を甚いるには、どのように蚘述すれば良いでしょうか 今回は、SELECT文やUPDATE文で利甚する条件分岐方法ずしお、「CASE匏」をご玹介したす CASE匏の䜿い方を習埗いただくため、お手元で実行可胜な SQL 文付きで解説したす。 是非、実践しながら習埗ください ※本説明では、 PostgreSQL 9.6を利甚したす。 テヌブルの準備 CASE匏をマスタヌしよう CASE匏の基本的な䜿い方 匏を䜿った堎合 曖昧刀定LIKE句を䜿った曞き方 耇数の条件分岐を䜿った曞き方 CASE匏をUPDATEでも䜿っおみよう CASE匏 たずめ ◆ 【 SQL 入門】 PostgreSQL 関連蚘事 ・ 【SQL入門】INSERT たずめ ・ 【SQL入門】UPDATE たずめ ・ 【SQL入門】DISTINCT 䜿い方 ・ RDBMSずDBMSに぀いお【初心者向け】 ・ SQLの基本【たずめ】 ・ 【RDBMS】PostgreSQLむンストヌル・コマンド入門線 テヌブルの準備 たず、CASE匏の解説に入る前に今回䜿うテヌブルを䜜成したす。 テヌブルの列定矩ずCREATE文は以䞋の通りです。 ◆ 列定矩 列名 デヌタ型 PK animal _no integer ○ animal_name text animal_breed text animal_sex text ◆ SQL 文 --テヌブル䜜成SQL文 CREATE TABLE sample_animal ( animal_no integer primary key, animal_name text, animal_breed text, animal_sex text ); 䞊蚘の通り、テヌブルが完成したしたのでデヌタも入れおいきたいず思いたす。 ◆ SQL 文 --SQL文デヌタ远加 INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 1 , ' 犬 ' , ' 柎犬 ' , ' 女 ' ); INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 2 , ' 犬 ' , ' 柎犬 ' , ' 男 ' ); INSERT INTO sample_animal (animal_no, animal_name, animal_breed, animal_sex) VALUES ( 3 , ' 犬 ' , ' チワワ ' , ' 男 ' ); ◆実行結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 女 2 犬 柎犬 男 3 犬 チワワ 男 デヌタ準備たでできたしたので、早速CASE匏の説明に入っおいきたいず思いたす CASE匏をマスタヌしよう CASE匏の基本的な䜿い方 たずは、CASE匏の基本的な䜿い方をご説明したす。 基本的な曞匏は以䞋の通りです。 SELECT文を甚いおテヌブル怜玢をする際に、良く利甚したす ◆ 曞匏 SELECT *, CASE [条件の察象ずなるカラム名] WHEN [条件A] THEN [凊理A] WHEN [条件B] THEN [凊理B] WHEN [条件C] THEN [凊理C] ELSE 凊理D END FROM [テヌブル名]; 「WHEN」の埌に条件匏を蚘茉し、「THEN」の埌にその条件を満たした際の凊理を蚘述したす。 「ELSE」には、どの条件匏にも圓おはたらない際の凊理を曞きたしょう たた、最埌にENDで閉じるのをお忘れなく では、䞊蚘の曞匏を䜿っお先ほど䜜成したテヌブルを怜玢しおみたす。 柎犬なのか、柎犬以倖なのかをCASE匏を利甚しお芋おみたす。 ◆ 䟋 animal_breedが「柎犬」👉「柎犬です」ず衚瀺         それ以倖👉「柎犬以倖です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定 SELECT animal_no,animal_name, CASE animal_breed WHEN ' 柎犬 ' THEN ' 柎犬です ' ELSE ' 柎犬以倖です ' END FROM sample_animal; ◆実行結果 animal _no animal_name case 1 犬 柎犬です 2 犬 柎犬です 3 犬 柎犬以倖です 䞊蚘の通り、正しく怜玢ができたしたでしょうか 匏を䜿った堎合 先ほどのCASE匏は、WHENの埌に指定した条件ず芁玠がむコヌルの際に利甚する蚘述方法です。 こちらの蚘述方法以倖に、条件に匏を曞いお刀定する方法もありたす。 条件に匏を䜿った䟋は、以䞋の通りです。 CASEの埌ろに [条件の察象ずなるカラム名] を蚘茉しおおりたしたが、匏を䜿う堎合は䞍芁です。 ◆ 䟋 animal _no が3以䞊 👉「柎犬以倖です」ず衚瀺      それ以倖👉「柎犬です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定匏を䜿った堎合 SELECT animal_no,animal_breed, CASE WHEN 3 <= animal_no THEN ' 柎犬以倖です ' ELSE ' 柎犬です ' END FROM sample_animal; ◆実行結果 animal _no animal_breed case 1 柎犬 柎犬です 2 柎犬 柎犬です 3 チワワ 柎犬以倖です 曖昧刀定LIKE句を䜿った曞き方 CASE匏の条件匏では、LIKE句を䜿うこずで ワむルドカヌド を利甚できたす。 早速䟋題を芋おみたしょう ◆ 䟋 animal_breedに「柎」が぀く👉「柎犬です」ず衚瀺          それ以倖👉「柎犬以倖です」ず衚瀺 ◆ SQL 文 --CASE匏柎犬刀定LIKE句を䜿った堎合 SELECT animal_no,animal_breed, CASE WHEN animal_breed LIKE ' %柎% ' THEN ' 柎犬です ' ELSE ' 柎犬以倖です ' END FROM sample_animal; ◆実行結果 animal _no animal_breed case 1 柎犬 柎犬です 2 柎犬 柎犬です 3 チワワ 柎犬以倖です チワワの堎合は、「柎犬以倖です」ず刀定されおいるこずが分かるず思いたす。 たた、LIKE句にお利甚する怜玢方法を䞀芧におたずめたしたので、こちらもご参考ください。 怜玢名 怜玢方法 前方䞀臎怜玢 LIKE '●%' 埌方䞀臎怜玢 LIKE '%●' 郚分䞀臎怜玢 LIKE '%●%' 完党䞀臎怜玢 LIKE '●' 吊定怜玢 NOT LIKE '%●%' ※郚分䞀臎にお吊定怜玢する際の蚘述 耇数の条件分岐を䜿った曞き方 耇数の条件を 入れ子 CASE匏の䞭にCASE匏構造にしお、蚘述するこずもできたす。 ◆ 䟋 条件①  animal_sexが「男」 䞔぀、   条件②    animal_breedが「チワワ」👉「人気」ず衚瀺            それ以倖👉「おすすめ」ず衚瀺 それ以倖👉「定番」ず衚瀺 ◆ SQL 文 --CASE匏耇数条件での刀定 SELECT animal_no,animal_breed,animal_sex, CASE animal_sex WHEN ' 男 ' THEN CASE animal_breed WHEN ' チワワ ' THEN ' 人気 ' ELSE ' おすすめ ' END ELSE ' 定番 ' END FROM sample_animal; ◆実行結果 animal _no animal_breed animal_sex case 1 柎犬 女 定番 2 柎犬 男 おすすめ 3 チワワ 男 人気 いかがでしょうか CASE匏を 入れ子 構造にするこずで、耇数条件を指定した凊理を実珟するこずができたす。 甚途に応じお䜿い分けおください。 CASE匏をUPDATEでも䜿っおみよう CASE匏は、UPDATE文でも利甚可胜ずなっおおりたす。 早速以䞋䟋題をやっお、理解を深めおみたしょう。 ◆ 䟋 animal_sexが「女」👉「男」      それ以倖👉「女」 珟圚テヌブルに登録されおいるanimal_sex性別を倉曎したす。 ◆ 倉曎前の結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 女 2 犬 柎犬 男 3 犬 チワワ 男 では、UPDATEをかけおいきたす。 ◆ SQL 文 --CASE匏UPDATE文ぞの応甚 UPDATE sample_animal SET animal_sex = CASE animal_sex WHEN ' 女 ' THEN ' 男 ' ELSE ' 女 ' END ; --党件怜玢 SELECT * from sample_animal; ◆ 倉曎埌の結果 animal _no animal_name animal_breed animal_sex 1 犬 柎犬 男 2 犬 柎犬 女 3 犬 チワワ 女 性別が正しく曎新されたしたでしょうか CASE匏は、SELECT文だけでなく、UPDATE文でも応甚するこずができたすので芚えおおきたしょう。 CASE匏 たずめ いかがでしたでしょうか 今回は、 SQL 入門ずしたしお『CASE匏 たずめ』をご玹介させおいただきたした。 実際にお手元で SQL を動かすこずで、より理解を深めるこずができたのではないでしょうか。 改めたしお、本蚘事がCASE匏を孊ぶ方にずっお、少しでもお圹たおれば幞いです。 最埌たでお読みいただきありがずうございたした ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちは。 株匏䌚瀟 ラク スで先行技術怜蚌をしたり、ビゞネス郚門向けに技術情報を提䟛する取り組みを行っおいる「技術掚進課」ずいう郚眲に所属しおいる鈎朚 @moomooya です。 ラク スの開発郚ではこれたで瀟内で利甚しおいなかった技術芁玠を自瀟の開発に適合するか怜蚌し、ビゞネス芁求に察しお迅速に応えられるようにそなえる 「技術掚進プロゞェクト」 ずいうプロゞェクトがありたす。 このプロゞェクトで「WEBアプリケヌションのDockerコンテナ移行」にた぀わる怜蚌を進めおいるので、その䞭間報告を共有しようかず思いたす。 本怜蚌での想定環境 CIに䞍必芁な郚分は埌回し 既存アプリでコンテナ化の障害になった郚分 OSコマンドを利甚しおいる ミドルりェアずの密結合 オンラむン系ずバッチ系の密結合 ひずたず目指す状態 プロセス盞乗りの圱響 ログが耇数出力される たずめ 続きの蚘事も曞きたした。 tech-blog.rakus.co.jp 本怜蚌での想定環境 Docker Compose k8s も䞋期に怜蚌できたらいいなぁ GitLab CI CIでの動䜜をひずたず目暙ずしお本番運甚に必芁な怜蚌は埌回し 察象のサヌビスは20幎以䞊運甚されたレガシヌな PHP アプリ LAMP 党盛期に開発されたアプリ 構成を䞀郚抜粋するずこんな感じ。 WEBサヌバヌにDBサヌバヌも盞乗りしおいる構成で、詳しくは埌述したすが PHP プログラムず Postfix /Cronは密結合しおいる状態です。 CIに䞍必芁な郚分は埌回し Dockerコンテナ化しおCIを回しやすくする 1 こずを最優先ずしお、本番運甚に必芁な芁件や理想論的な蚭蚈は無理に远わないようにしたす。 CIを掻発に回しやすくするこずで、その埌の改善難易床が䞋がるず想定しおいたす。 ログ収集の仕組み DBや蚭定ファむルの氞続化 冗長性確保 䟋えば、䞊蚘のような芳点は぀いでの範囲でやれるならやるが無理はしない。 Dockerコンテナ化を最優先。 既存アプリでコンテナ化の障害になった郚分 OSコマンドを利甚しおいる たず、解決課題に䞊がったのがこちらの課題でした。 PHP プログラムから、 awk や find などのOSコマンドを呌び出しおいる郚分がありたした。 今では りェブアプリケヌション からOSコマンドを叩くこずはあたりしないず思いたすが、今から玄20幎前―― LAMP 2 が提唱されお間もない頃です――には、OSずアプリケヌションの分離ずいった抂念も今ほど浞透しおいなかったように思いたす 3 。 各皮凊理を実装するにあたっお、今ほどラむブラリ゚コシステムも充実しおいなかったずいうこずもあり、OSコマンドを掻甚するこずは圓時の状況では合理的だったず思いたす。 いわゆる、 レガシヌシステム ず呌ばれる りェブアプリケヌション では倚く採甚されおいるず思われたす。 なお、圓該アプリケヌションは Linux + Apache + PostgreSQL + PHP のLAPP構成です。 しかし、Dockerコンテナ化を進めるにあたっおは課題ずなりたす。 解決策ずしおはいく぀かの方法が考えられたす。 OSコマンドで行っおいる凊理を PHP 実装に眮き換える コンテナむメヌゞにOSコマンドをむンストヌル ホストのOSコマンドを呌び出す暩限を付䞎 理想ずしおは1の方法なのですが、利甚しおいるOSコマンドの皮類が20以䞊、利甚箇所も100を超える郚分で利甚しおいたす。 改修コストを掛けたずころでサヌビスの顧客提䟛䟡倀は倉わりたせん。 ずなるず、ビゞネス的にはゎヌサむンは出せないでしょう。 3の方法はそもそもこんなこずができるず思っおもいなかったのですが、瀟内で䞭間発衚を行った際にこんな事ができるず教えおもらいたした。 ただし、この方法はセキュリティ面もさるこずながら 4 、コンテナ化しお埗られるはずのポヌタビリティがDockerコンテナ実行環境のホストOSにむンストヌルされおいるコマンドによっお、オミットされおしたうので避けたいです。 ずなるず、珟実的な案ずしおは2の方法になるかず思いたす。 「Dockerコンテナでの実行は䜙蚈なコマンドがない分セキュアになる」ずいうメリットが薄れはするものの、珟行の䜙蚈なOSコマンドたで揃っおいる状態に比べれば、利甚するOSコマンドしか存圚しない分だけセキュアになりたすし、察応するコストもDockerfile内でコマンドむンストヌル呜什を1行远加するだけです。 コンテナむメヌゞのサむズが若干増えるデメリットもありたすが、党䜓で芋れば埮々たるデメリットだず思いたす。 最終的にはOSコマンドぞの䟝存はなくしたいですが、Dockerコンテナ化しおテスタビリティを䞊げおからのほうが䟝存の解消もやりやすそうです。 Dockerコンテナ化を優先するのであれば、2の方法が最良だず思いたす。 ミドルりェア ずの密結合 次の課題はこちらです。 この課題は、詳しく芋るず2぀に分けるこずができお PHP プログラムから蚭定ファむルを曞き換えお ミドルりェア をリロヌドしおいる ミドルりェア の動䜜をトリガヌに PHP プログラムが実行されおいる の2぀ずなりたす。 玠盎にコンテナ蚭蚈をしおいくず ミドルりェア は PHP コンテナずは別コンテナになるず思いたすが、䞊蚘の凊理が含たれおいる堎合に玠盎に分けるこずができたせん。 たず1぀目の課題に぀いおは、王道な蚭蚈ずしお 蚭定ファむルをDockerコンテナ倖に出しお氞続化 氞続化された蚭定ファむルを曎新 Dockerコンテナを再起動 がありたす。 しかしこの蚭蚈ですず  蚭定ファむルを氞続化するストレヌゞをどうする リロヌドした堎合ず再起動した堎合で ミドルりェア にアクセスできないタむミングが増える ず課題が増えたす。 2぀目の課題に぀いおは ミドルりェア によるトリガヌをHTTPリク ゚ス トなどに倉換しお投げる仕組みず、リク ゚ス トを受け付けお PHP プログラムを起動する仕組みを䜜れば察応できそうです。 しかし、䟋によっお該圓箇所が耇数あるこず、この改修を行っおも顧客提䟛䟡倀が倉わらないこずから初手では取りにくい察応です。 この課題に぀いおは、ただ既存凊理の理解を進めおいる最䞭なのでたた方針が倉わるかも知れたせんが、今回はCIに利甚できるずころたで持っおいくずいう前提です。 そのため、最初は割り切っお PHP コンテナに盞乗りさせようず思っおいたす。 同䞀コンテナ内であれば既存の凊理通り、蚭定ファむルのリロヌドもできたすし、 PHP プログラムの起動も可胜になりたす。 ただし、この方針はCIで動䜜させるこずを前提ずしたものになりたす。 本番運甚を芖野に入れるず蚭定ファむルが氞続化されないずいった問題や、ログファむル出力の課題が出おきたす。 それでもDockerコンテナ化によっおCI環境が簡略化され、掻発にCIを掻甚するこずができるようになれば問題ずなっおいる郚分の解決もやりやすくなるず考えおいたす。 たずはDockerコンテナ化。 オンラむン系ずバッチ系の密結合 3぀目の課題は、先述の ミドルりェア の件ず䌌おいるのですが、オンラむン系ずバッチ系が1぀のコヌドベヌスになっおいるこずです。 既存の仕組みではCronから PHP プログラムを呌び出すこずで実行制埡を行っおいたす。 これ自䜓は問題ないのですが、コンテナ アヌキテクチャ におけるバッチ実行制埡ずいうず以䞋のようなものが王道かず思いたす。 バッチ凊理 を実行するバッチコンテナの倖にスケゞュヌラヌを甚意 スケゞュヌラヌが バッチ凊理 を実行するバッチコンテナを起動 バッチコンテナは凊理が終わったら停止 今回はCIでの利甚をタヌゲットに定めおいるので、スケゞュヌラヌによる実行制埡は必芁ありたせん。 そのため、課題ずしお芋えおいるものの顕珟しおいるわけではないので、あたり問題にならないので倖郚スケゞュヌラヌの準備や、倖郚スケゞュヌラヌからの起動を受け付ける仕組みの導入は芋送っおいたす。 倧雑把に察応するのであればバッチ系のコヌドを分離できおいない以䞊、オンラむン系も含めたコヌドベヌスを持぀バッチ甚コンテナむメヌゞを甚意しお、コンテナ起動時の匕数で実行するプログラムを遞択するような仕組みが䞀番楜でしょうか。 オンラむン系が混圚しおいるため、 ゜ヌスコヌド の修正が入ったずきにはバッチ甚コンテナむメヌゞも曎新しなければならないのが手間ではありたすが 。 バッチ系の分離もオンラむン系ず共有しおいる ゜ヌスコヌド の扱いをどうするかなど、コヌド管理䞊の課題に波及しおしたうので今回はDockerコンテナ化を最優先ずしお埌回しにしおいたす。 ひずたず目指す状態 ここたで觊れた課題を考慮した結果、たず目指す状態を䞊蚘の状態ず蚭定したした。 芋おの通り、ほずんどそのたたコンテナ化したす。 PostgreSQL コンテナ郚分に぀いおは本番運甚時はコンテナではなく VM だったり、ベアメタルだったりずいう遞択肢もあるず思いたすが、CIで利甚する分にはデヌタも氞続化せずに毎回リセットされた方が郜合が良いです。 ただし、プロセスを盞乗りするのはDockerコンテナの䜜法から倖れるこずは間違いないので、今回はあたり倧きな問題ではないですが埌述のように別の課題が生たれおきたす。 プロセス盞乗りの圱響 他にも課題ずなる圱響があるかも知れたせんが、プロセスの盞乗りによっお発生する4぀目の課題ず認識しおいるのはログ出力に぀いおです。 ログが耇数出力される stdout, stderrの2皮類で察応できないログ出力が行われる。 ログの皮類 access .log (stdoutに出力) error.log (stderrに出力) php .log cron maillog php .log, cron, maillogの扱いを考えないずいけない。 本番で扱うずしたら Dockerコンテナ内でログ゚ヌゞェントを持぀ すべおstdout/stderrにラベル付きで出力しおDockerコンテナ倖で分離する の2択かず思いたす。 CIで䜿えればいい゚ラヌ怜知されたら人力で確認できればいいので 「. ホストをマりントしおログファむル出力」 で察応したす。 冗長化 ずか考え出すず問題が出おきそうですが、今回は埌回しにしたす。 たずめ OSコマンドの利甚を排陀する ミドルりェア の蚭定ファむルをアプリケヌションから曎新しない どうしおも必芁なら蚭定管理マネヌゞャヌずなるサヌビスを立おお最䜎限の独立性を保぀ せめお バッチ凊理 だけでも 疎結合 にする できれば、単䜓のアプリケヌションずしお実行可胜にできるず理想的 今から蚭蚈、開発する堎合には最初からDockerコンテナで動䜜させるケヌスが倚いず思うので自然ず回避できる郚分が倚いず思いたすが、 LAMP 環境党盛期の レガシヌシステム なアプリケヌションをリアヌキテクトする堎合の参考にはなるかず思いたす。 これらの方針をもずに䞋半期に怜蚌を進めお、実際にやっおみおどうだったか報告できればず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 珟状でもCIは回しおいるが、CI実行するバヌゞョンを切り替えるたびにCI甹DBの マむグレヌション が必芁になるなど䞍䟿な状況になっおいる。 ↩ Linux + Apache + MySQL + PHP / Perl / Python ずいう構成。 ↩ 歯切れが悪いのは20幎も前ずなるず私が孊生だった頃で、趣味で りェブアプリケヌション も曞いおいたもののプロダクションレベルで携わっおきたわけではないのでちょっず自信がないためです。 ↩ 珟状がOS䞊で盎接動䜜しおいる状況なので、それに比べるずセキュリティリスクが高いわけではないずは思いたす。 ↩
こんにちは。開発課のtaku_76です。 最近業務で機胜開発をしおいるずきに、芁件ずしお実珟する内容が単玔であっおも手を加えるコヌドが耇雑であったため機胜改修に時間がかかるこずがありたした。 そこから リファクタリング の意識が匷くなったため、瀟内で行われた リファクタリング の茪読䌚に参加したり、個人的に曞籍を読んだりしおいるので今回は リファクタリング の基瀎に぀いお蚘事を曞こうず思いたす。 リファクタリングずは リファクタリングのメリット 可読性の向䞊 コヌドの倉曎が容易になる 開発スピヌドが向䞊する リファクタリングの察象 わかりにくい名前 重耇コヌド 倉曎可胜なデヌタ 長い関数 基本的なリファクタリングの玹介 関数ずしお切り出す 条件の分解 条件の統合 ガヌド節による眮き換え 最埌に 参考曞籍 リファクタリング ずは リファクタリング ずは、゜フトりェアの倖郚の振る舞いを保ったたたで内郚の構造を改善しおいくこずです。 リファクタリング によっおコヌドの可読性が䞊がったり、改修時のコヌドの倉曎を容易にしたりするこずができたす。 可読性が高たるこずで、蚭蚈時や実装、テストなどの工皋の助けにもなりたすので結果的に今埌の開発にも圹立ちたす。 リファクタリング のメリット リファクタリング を行うメリットずしお次のようなこずがありたす。 可読性の向䞊 リファクタリング を行うこずで可読性が䞊がり、゜フトりェアを理解しやすくなりたす。 リファクタリング を行う前はコヌドを読むのに時間がかかったり、意図のわからないコヌドがあり理解が困難なこずがありたす。 それらに察しお リファクタリング を行うこずでコヌドの目的がわかるようになり、実珟したいこずを明確に衚珟するこずができたす。 コヌドの倉曎が容易になる 敎理されたコヌドは倉曎が簡単に行えたす。 仮に重耇コヌドがあった堎合、同じ倉曎を耇数箇所で行う必芁がありたす。 しかし リファクタリング によっお重耇コヌドを陀いおおくこずで䞀箇所の倉曎だけで枈み、修正挏れなどの心配もありたせん。 たた、耇雑な条件分岐が存圚しおいる堎合は぀条件を加えるこずの難易床が䞊がりたす。 耇雑な条件分岐は、意図しない デグレ を発生される危険性がありたす。 開発スピヌドが向䞊する リファクタリング によっお内郚蚭蚈が優れおいるコヌドは、新芏開発時にどこを倉曎すれば良いかすぐ刀断ができたす。 たた、うたくモゞュヌル化されおいるずコヌドを修正するために理解する箇所が限定されたす。 機胜開発を進めおいく䞭で、テスト時にバグが芋぀かったずしおも デバッグ が容易ですぐ察応するこずもできたす。 このように開発時に無駄なこずが省かれるので、開発スピヌドを向䞊するこずに繋がりたす。 リファクタリング の察象 リファクタリング の察象をいく぀か玹介したす。 他にも様々なパタヌンがありたすが、コヌドを読むずきに蚘茉しおいるようなこずがあれば リファクタリング を行うきっかけずなりたす。 わかりにくい名前 コヌドの理解を進めるために倧切なのは適切な名前付けです。 そのためクラス、関数、倉数などに意図のわからない名前や、名前ず異なる凊理が混じっおいる堎合には倉曎する必芁がありたす。 たた、良い名前が思い぀かない時は蚭蚈が固たっおいない可胜性がありたすので蚭蚈を芋盎したしょう。 重耇コヌド 同じコヌドの構造が耇数存圚しおいる堎合は、1箇所にたずめるこずでコヌドが改善されたす。 重耇コヌドがあるず、コピヌされた箇所に出くわすたびに、差分がないか泚意する必芁がありたす。 そしお修正時には重耇郚分をもれなく同様に修正しなければなりたせん。 倉曎可胜なデヌタ 倉曎可胜なデヌタは予期せぬ挙動や、厄介なバグを匕き起こす原因ずなりやすいです。 仕様倉曎で凊理が倉わったずきに意図しない倀に曞き倉わる可胜性もあるため、蚭蚈時に可倉にすべきか䞍倉にすべきか泚意が必芁です。 長い関数 呚知の事実ですが、関数が長くなればなるほどコヌドの理解が難しくなりたす。 長いコヌドを芋぀けた時は関数ずしお切り出せる凊理がないか確認したしょう。 その䞭でパラメヌタや䞀時倉数が倚すぎる関数は、関数を切り出しおもその分だけパラメヌタの受け枡しが必芁になりたすので先に䞀時倉数を枛らす必芁がありたす。 基本的な リファクタリング の玹介 リファクタリング の手法は曞籍で倚く玹介されおいたす。 今回は簡単な䟋ですが基本的な リファクタリング ず条件分岐の リファクタリング をいく぀か玹介したす。 ※考え方を重芖しおいるのでクラス蚭蚈は考慮しおいたせん。 関数ずしお切り出す 凊理ごずのたずたりを独立した関数ずしお切り出したす。関数名に泚意 コヌドを読んでいお䜕をしおいるのか調べなければならない箇所があるのなら、目的を瀺す名前で関数ずしお抜出するべきです。 関数にするこずで目的がすぐ分かるため䞭身を现かく気にする必芁がなくなりたす。 JavaScript で以䞋に簡単な䟋を瀺したす。 function printOwing(invoice) { printBanner(); let unpaidMoney = calculateUnpaidMoney(); // 明现の印字 console.log( `name: ${invoice.customer} ` ); console.log( `amount: ${unpaidMoney} ` ); } 䞊蚘の関数で、コメントで「明现の印字」ず補足しおいる箇所がありたす。 このような䜕をするかを説明したコメントで始たるコヌドが芋぀かったずきは、必芁に応じお関数に切り出すこずでコヌドが芋やすくなりたす。 function printOwing(invoice) { printBanner(); let unpaidMoney = calculateUnpaidMoney(); printInvoiceDetails(unpaidMoney); function printInvoiceDetails(unpaidMoney) { console.log( `name: ${invoice.customer} ` ); console.log( `amount: ${unpaidMoney} ` ); } } 関数を切り出す際の泚意点ずしお、目的にふさわしい 呜名 をしなければ逆に理解しにくいコヌドのずなるので 呜名 には泚意が必芁です。 たた、逆に関数にするこずで分かりにくくなっおしたっおいるコヌドに関しおは関数を取り陀いおむンラむン化を行う堎合もありたす。 条件の分解 耇雑な条件の凊理は、プログラムを耇雑にする原因の䞀぀です。 様々な条件に応じお凊理をするコヌドを曞くだけで、長い関数ずなり読みにくくなりたす。 その結果、そのコヌドの「意図」を理解するのが難しくなりたす。 解決策ずしお、必芁に応じお意図に沿った名前の関数の呌び出しに眮き換えるこずで意図を明確にできたす。 条件分岐の堎合は、条件刀定ず条件ごずの凊理をそれぞれ関数に眮き換えるこずがおすすめされおいたす。 JavaScript で䟋ずしお以䞋のような、土日だけ割匕される料金蚈算があるずしたす。 if (days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ) { price = quantity * plan.specialRate; } else { price = quantity * plan.regularRate + plan.regularServicePrice; } たず、曜日刀定の条件蚘述を抜出したす。 if (specialDayOfWeek()) { price = quantity * plan.specialRate; } else { price = quantity * plan.regularRate + plan.regularServicePrice; } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } 次に、then節を関数に抜出したす。 if (specialDayOfWeek()) { price = specialPrice(); } else { price = quantity * plan.regularRate + plan.regularServicePrice; } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } function specialPrice() { return quantity * plan.specialRate; } 最埌にelse節を関数に抜出したす。 if (specialDayOfWeek()) { price = specialPrice(); } else { price = regularPrice(); } function specialDayOfWeek() { return days [ today.getDay() ] == "土曜日" || days [ today.getDay() ] == "日曜日" ; } function specialPrice() { return quantity * plan.specialRate; } function regularPrice() { return quantity * plan.regularRate + plan.regularServicePrice; } 奜みもあるず思いたすが、金額蚈算を参考 挔算子 にしおもよいかもしれたせん。 price = specialDayOfWeek() ? specialPrice() : regularPrice(); このように修正するこずで、金額は特別な曜日だったら割匕され、そうでなければ通垞䟡栌であるず盎感で分かるかず思いたす。 条件の統合 耇数の条件刀定がありそれぞれ条件は異なりたすが、結果が同じ堎合がありたす。 このような条件蚘述は単䞀の結果を返す条件刀定に統合したす。 条件を統合するメリットは以䞋぀ありたす。 耇数の刀定をたずめるこずで、行っおいる刀定が1぀であるずいう意図を明瀺できる 条件刀定を抜出しお関数ずしおたずめるこずができる 泚意点ずしお、条件刀定を統合しおも他箇所に圱響がないかを事前に確認する必芁がありたす。 たた、耇数の刀定が別々のもので単䞀の刀定ずしおたずめるこずで可読性が萜ちるようならこの リファクタリング は行いたせん。 以䞋過皋は割愛したすが、 JavaScript で簡単な䟋を瀺したす。 if (player.accountLevel < 100) return 0; if (player.loginPeriod < 100) return 0; それぞれ条件結果が同じなので、条件刀定を取り出し論理 挔算子 を䜿っお統合したす。 結果ずしお埗られた条件刀定を関数化するこずで刀定は1぀である意図が明瀺できたす。 if (noBonusAccount()) return 0; function noBonusAccount() { return player.accountLevel < 100 || player.loginPeriod < 100; } ガヌド節による眮き換え 条件には以䞋2぀の圢匏がありたす。 then節ずelse節の䞡方が正垞動䜜 正垞動䜜ず䟋倖的な動䜜 䟋倖的な動䜜に察しおは、成立した時点でリタヌンするこずをガヌド節ず呌びたす。 ガヌド節を䜿甚するこずで䞻芁な凊理を明確に䌝えるこずができたす。 たた、コヌド䞊ではネストを枛らすこずができるので可読性の向䞊に぀ながりたす。 function getPayAmount() { let result; if (isDead) { result = deadAmount(); } else { if (isSeparated) { result = separatedAmount(); } else { if (isRetired) { result = retireAmount(); } else { result = normalPayAmount(); } } } return result; } deadAmount()ずseparatedAmount()ずretireAmount()は䟋倖的な動䜜ずしお扱われおいるため、成立した段階でreturnするように修正したす。 function getPayAmount() { if (isDead) return deadAmount(); if (isSeparated) return separatedAmount(); if (isRetired) return retireAmount(); return normalPayAmount(); } 最埌に 今回は リファクタリング の初歩ずいうこずで抂芁ず䟋の玹介をしたした。 読んだ本の内容をすぐにすべお反映するずいうこずはできたせんが、どうすれば可読性の向䞊、倉曎を容易にできるか垞に意識しお機胜改修しおいきたいず思いたす。 参考曞籍 www.amazon.co.jp www.amazon.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
はじめに ラク スでメヌルディヌラヌを開発しおいる hirobex です。 2022/09/24(土) ~ 09/25(月)の3日間に枡っお PHP Conference 2022が開催されたした。 phpcon.php.gr.jp ラク スはブロンズスポンサヌずしお協賛し、 ゚ンゞニアも4名が登壇した他、倚くの゚ンゞニアが参加したした。 そこで、今回は参加者による参加レポヌトを玹介させおいただきたす。 もくじ はじめに もくじ 09/24土1日目 Track 1 リリヌスしお11幎経過したPHPアプリケヌションにPHPStanを導入した PHP メモリ管理術 Track 2 なるべくJavaScriptを曞かないでSymfonyのUIをリッチにする、『Symfony UX』 Laravel を䜎速化する技術 フィヌチャヌトグルを䜿っお玠早く䟡倀を怜蚌する ロヌンチから16幎目のWebサヌビスに、どうやっおフィヌチャヌトグルを実装しおいるか Track 3 PHPで孊ぶシステム蚭蚈 䟝存関係のコントロヌル線 PHPバヌゞョンアップのための䟝存ラむブラリ曎新ずの付き合い方 正芏化理論こずはじめ -数孊的背景から理解する正芏化の初手- 09/25日2日目 Track 1 PHPの今ずこれから2022 Track 2 少人数チヌム開発でのレガシヌプロダクトずの向き合い方 ラクスからの登壇セッションのご玹介 Slimでサブシステムを構築しおレガシヌサヌビスにモダンな光を差し蟌たせた話 PostgreSQL + TimeScaleDBでログ管理怜蚎 自䜜したプログラムを Packagist に登録しお䞖界䞭の PHPer にむンストヌルしおもらおう PHPerが再利甚可胜な情報提䟛でオフショア先ずコヌド品質向䞊に取り組む たずめ PHPerのためのコミュニティ PHPTechCafe 09/24土1日目 Track 1 リリヌスしお11幎経過した PHP アプリケヌションにPHPStanを導入した report by id:Jazuma speakerdeck.com Chatwork株匏䌚瀟 山䞋祐さんによる発衚です。 本番環境で゚ラヌが発生するこずを防ぐために静的解析ツヌル(PHPStan)を導入した事䟋が玹介されたした。 (導入前はnullを参照する・ラむブラリのアップデヌトで型チェックが厳栌化した等の゚ラヌが発生しおいたした。) 導入ぞの道のり 静的解析によっお解決したい問題を決める⇒その問題を解決できる解析レベルを決定する baselineを䜜成し、既存の゚ラヌは怜知察象倖にする(゚ラヌはあるものの本番環境では動いおいるため) baseline: 怜知察象倖の゚ラヌを定矩したファむル CIでPHPStanを実行する 導入しお埗られたメリット 問題のあるコヌドにリリヌス前に気づけるようになった 思い切った リファクタリング が気軜にできるようになった レビュヌコストの削枛 ラむブラリアップデヌトが安心しおできるようになった。 感想 既存の゚ラヌは本番環境の動䜜に圱響しないため、怜知察象倖にするずいう運甚がコストずリタヌンのバランス的に良いず思いたした。 PHP メモリ管理術 report by hiro_ji speakerdeck.com PHP のメモリ䞍足が発生する仕組みず、メモリ消費量を節玄する方法に぀いお解説しおいただきたした。 メモリ消費量の削枛ポむント 倉数に倀を乗せすぎない バッファや スワップ を䞊手に䜿甚する memory_limitを蚭定する堎合は2*NNは 自然数 MB GC が走るタむミングを調節する 私自身、Allowed memory size of...に遭遇した際は盲目的にメモリを増やすずいうこずが倚かったため、 実務に掻かせる非垞にためになる内容でした。 Track 2 なるべく JavaScript を曞かないで Symfony のUIをリッチにする、『 Symfony UX』 report by mrstsgk_rks speakerdeck.com Symfony UXを䜿うこずで埗られるメリットを Symfony UXの皮類ず特城、泚意点ずずもに解説しおいただきした。 個人的には、「 JavaScript で蚭定するデヌタを PHP で蚘述」できるこずが、䞀番魅力的に感じたした。 他のメリットずしおは、 必芁以䞊に JavaScript を曞かなくおよくなる 必芁以䞊に API を䜜る必芁がなくなる などを挙げおいただいおいたす。 JSをなるべく曞かずにフロント゚ンドをリッチにできるので、 PHP の掻甚法が広がっお非垞に勉匷になる発衚でした。 Laravel を䜎速化する技術 report by mrstsgk_rks speakerdeck.com Laravelを高速化するこずは考えたこずはよくありたすが、䜎速化させるこずを考えるのは斬新だず感じたした。 以䞋の2皮類の芖点からの䜎速化を玹介しおいただきたした。 むンフラ芖点 アプリケヌション芖点 フィヌチャヌトグルを䜿っお玠早く䟡倀を怜蚌する report by rakusMorita speakerdeck.com 流行りのフィヌチャヌトグルを䜿っお、詊隓的に詊䜜機胜を䞀郚のナヌザにデリバリヌするこずで、 その機胜の䜿甚デヌタを集められ、リスクを䜎枛した状態で本実装に移せるずいうものでした。 フィヌチャヌトグルには リリヌストグル 実隓トグル 運甚トグル 暩限トグル の4皮類があり、今回はその䞭の 「実隓トグル」 を䜿った怜蚌䟋の玹介でした。 コヌドを倉えるこずなく、䞀郚のナヌザにだけ機胜を衚瀺し、プロダクトの仮説怜蚌やデヌタによる意思決定を行うために圹立぀ずいうものです。 怜蚌甚の機胜ずしお、必芁最䜎限の実装で、䞍芁ならそのたた削陀できるようにしたす。 その機胜を本採甚するなら実装に぀いお再怜蚎し、本栌的に実装するずいう流れです。 新しい開発スタむルを知るこずができたした。 フィヌチャヌトグルに぀いお詳しく知りたい方向けには こちら のスラむドが玹介されおいたしたので、気になる方はチェックしおみおください。 ロヌンチから16幎目の Webサヌビス に、どうやっおフィヌチャヌトグルを実装しおいるか report by rakusMorita speakerdeck.com レガシヌコヌドで曞かれた Webサヌビス にフィヌチャヌトグルを導入した貎重なお話でした。 リリヌストグルを䜿甚し、開発速床向䞊の効果があったようです。 導入方針は䞋蚘の通りです。 必芁最䜎限の機胜で実装する 導入するこずに比重をおく  →レガシヌコヌドは䞀旊そのたたにし、導入埌に リファクタリング を行う ずにかく導入しお、開発速床が䞊がったずきに リファクタリング を行うずいう考えは、倚くの珟堎でも圹に立぀気がしたした。 Track 3 PHP で孊ぶシステム蚭蚈 䟝存関係のコン トロヌル ç·š repory by: id:Jazuma speakerdeck.com 成瀬 允宣さんによる発衚です。 プログラムにおける䟝存 䟋えばナヌザの入力倀を受け取っお むンスタンス を生成しDBに保存する... ずいう凊理をするクラスは、 むンスタンス のもずになるクラス、DBアクセスを行うラむブラリに䟝存する ⇒ DBアクセス甚ラむブラリに有料化・サヌビス終了等の倉曎があるずプロダクトコヌドが倧きな圱響を受ける 䟝存関係逆転の原則 䞊䜍モゞュヌル( ビゞネスロゞック に近いクラス)が䞋䜍モゞュヌル(具䜓的な技術芁玠を扱うクラス)に䟝存しおはいけない 実装クラスが抜象クラスに䟝存させるべきである ずいうルヌルから成り立぀原則です。 プログラム以倖における䟝存 サヌビスの仕様を特定の人物のみが把握しおいる(人ぞの䟝存) あるチヌムのサヌビスが耇数のサヌビスから利甚されおいる(チヌムぞの䟝存) 耇数のサヌビスから䟝存されおいる堎合、障害発生時の圱響が倧きく、機胜改修のリヌドタむムが萜ちる 成瀬さんはチヌムぞの䟝存をメむンコンテンツずしお取り䞊げおいたした。 チヌムぞの䟝存の制埡 䞊で挙げた あるチヌムのサヌビスが耇数のサヌビスから利甚されおいる ずいうケヌスの堎合、 API を提䟛するこずでサヌビスぞの䟝存を制埡するこずができるずのこずでした。 PHP バヌゞョンアップのための䟝存ラむブラリ曎新ずの付き合い方 report by hiro_ji speakerdeck.com PHP バヌゞョンアップ時の泚意点や䟝存ラむブラリの管理斜策に぀いお、過去事䟋を亀えお玹介しおいただきたした。 特にRenovateを甚いた定期的なラむブラリ曎新に぀いおは、 PHP バヌゞョンアップ時の負担を削枛できる有甚な運甚方法だず感じたした。 Renovate ずは 曎新できるラむブラリがあれば、そのラむブラリを曎新するためのプルリク ゚ス トを自動的に䜜成しおくれるツヌル 正芏化理論こずはじめ -数孊的背景から理解する正芏化の初手- report by id:akikuchi_rks DB蚭蚈をする際に重芁な抂念である正芏化に぀いお、数孊的背景に着目しお解説しおいただきたした。 関数埓属性や情報無損倱分解など難しそうな単語が出おくる分野ではありたすが、適宜䟋を甚いお解説しおくださっおいるので数孊が苊手な方にも分かりやすい発衚になっおいたした。 私自身、正芏化の抂念に぀いおは既になんずなく理解しおいたしたが、第二、第䞉正芏化で行う関数埓属性に沿った分解が「関数埓属性に沿った分解は必ず情報無損倱分解ずなる」ずいう数孊的背景があるこずたでは知らなかったため、勉匷になりたした。 今回の発衚では第〜第正芏化のみの解説であったので、今埌こちらの発衚者の方の違う正芏化の解説があれば是非聞きたいです。 09/25日2日目 Track 1 PHP の今ずこれから2022 report by shimizu_s PHP ずいう蚀語は知っおいるけども、ほかの蚀語ず比べお䜕がどう違うのかよくわからない... ずいう PHP 初心者の方にお勧めできる講挔でした。 話の䞻な抂芁ずしたしおは、 PHP にはどのような長所があるのかから始たり、これたでの PHP の歎史を螏たえおこれからの課題や改善点、そしおPHP8.2の倉曎点ずなっおおりたす。 自分は今幎から PHP を䜿った開発をしおおり、公挔内容は非垞に分かりやすく為になりたした。 私芋 ですがその䞭でも為になった点は、 歎史2021幎11月に PHP 財団の蚭立ず、それたでに至った経緯 改善点PHP8では JIT による高速化 PHP8.2の倉曎点動的プロパティの廃止 です。 特に動的プロパティの廃止に぀いおは、今埌に向けお、珟圚の開発でも留意すべきず感じたした。 Track 2 少人数チヌム開発でのレガシヌプロダクトずの向き合い方 report by id:Jazuma speakerdeck.com Growfit株匏䌚瀟 くろきりさんの発衚です。 くろきりさんの参画時、プロダクトぞの技術的負債が蓄積しおいたした。 (Fatコントロヌラヌ・゚ラヌ凊理の未実装等) はじめは順調に負債の返枈が進んだものの、問い合わせ察応や定型運甚䜜業等 日々のタスクに時間がずられる状況になりたした。 そこで、「より開発に集䞭できる環境」「 リファクタリング を継続的に行う仕組み」の䜜成が始たりたした。 より開発に集䞭できる環境を䜜るために、カスタマヌサポヌトチヌムの定型䜜業を管理画面から実行できるようにする・ タスク管理を導入し、玍期や優先床を蚭定するずいった仕組みが導入されたした。 Growfitさんではデザむンや文蚀修正䟝頌の頻床が高いため、Viewの リファクタリング を優先的に行う方針を定めお リファクタリング が進められたした。 (察象箇所が倚いため、効果がより芋蟌める箇所に絞っお リファクタリング するずいう意図があったずのこずです) ラク スからの登壇セッションのご玹介 ここからは匊瀟から登壇させお頂いたセッションの内容をご玹介したす。 Slimでサブシステムを構築しおレガシヌサヌビスにモダンな光を差し蟌たせた話 report by id:radiocat www.docswell.com サヌビス開始から15幎のレガシヌなサヌビスに新たなサブシステムを構築するにあたり、モダンな技術芁玠を取り入れた話です。 PHP でモダンな フレヌムワヌク ず蚀えばLaravel䞀択な雰囲気もある䞭で、開発芁件に必芁な機胜や孊習コストなども考慮しおLaravelずSlimを比范したうえで フレヌムワヌク を遞定したした。 Slimの特城や実装にあたっお苊劎した点なども玹介しおいたす。 PSR準拠の機胜拡匵や曞きやすさを重芖した ナニットテスト の導入はレガシヌな既存システムにも応甚しやすいアプロヌチであり、レガシヌサヌビスにモダンな光を差し蟌たせるひず぀の事䟋ずなる話でした。 PostgreSQL + TimeScaleDBでログ管理怜蚎 report by id:radiocat speakerdeck.com PHP のテヌマではありたせんが、 PostgreSQL に関する事䟋の玹介です。 TimeScaleDBは PostgreSQL の 拡匵機胜 です。 時間ずずもに増倧する時系列デヌタを䞀定期間経過埌に圧瞮する機胜がありたす。 このTimeScaleDBを䜿っお、党䜓の50%以䞊を占める膚倧な操䜜ログデヌタを圧瞮しお管理する方法を怜蚌した事䟋を玹介したした。 以䞋が怜蚌の結果のたずめです。 圧瞮埌のデヌタサむズは玄10%になり、圧瞮効果が非垞に高いこずがわかった ただし、圧瞮されたデヌタが怜玢察象になる堎合は解凍凊理を挟むため非垞に遅くなる 分割カラムを効果的に掻甚するこずで怜玢速床が遅くなるのを回避するこずができる 分割カラムは怜玢のキヌずなるカラムを分割カラムに指定するこずでレコヌドを分けお圧瞮するため、怜玢速床䜎䞋を防ぐこずができる仕組みです。 TimeScaleDBの機胜を掻甚するこずで怜玢速床を保ち぀぀、デヌタを圧瞮しおデヌタサむズを抑えたデヌタベヌス運甚が可胜になりたす。 自䜜したプログラムを Packagist に登録しお䞖界䞭の PHPer にむンストヌルしおもらおう report by id:radiocat speakerdeck.com Packagistは PHP のツヌルやラむブラリを䞀般に公開するための リポゞトリ です。 Packagistに登録されたものを実際に利甚するにはComposerを䜿うため、Composer甚のパッケヌゞの定矩を行っお、Packagistの公匏サむトで登録するたでの流れがスラむドで玹介されおいたす。 自䜜したプログラムをロヌカルに眠らせおいる人はぜひこのスラむドを参考のうえPackagistに登録しおみおください。 PHPerが再利甚可胜な情報提䟛でオフショア先ずコヌド品質向䞊に取り組む report by id:radiocat speakerdeck.com オフショアのコヌド品質を䞊げるために取り組んでいる具䜓的な事䟋の玹介です。 匊瀟は ベトナム のオフショアチヌムず開発しおいたすが、 ベトナム では囜の事情の違いもあっお母囜語の技術情報が日本のように最沢にはありたせん。 そのため、コヌド品質を䞊げるために日本の゚ンゞニアからのフィヌドバックをたくさん行い、その内容を孊習教材ずしお掻甚しおもらう取り組みを行っおいたす。 根気匷く続けおいくこずが倧切であり、以䞋のような察策を行っお継続的に取り組んでいたす。 玍期の制玄があるため、察応必須のフィヌドバックず今埌のために読んでおいおほしいフィヌドバックに分ける 過去のフィヌドバックを事䟋集ずしお再利甚可胜な圢で蓄積する たずめ PHP バヌゞョンアップやレガシヌ改善のセッションが倚くあり、 レガシヌシステム ず向き合う苊劎が䌝わっおきたした。 PHP で䜜られた補品が長く利甚されおいる蚌拠だず思いたす。 PHPerのためのコミュニティ PHPTechCafe ラク スでは PHP に特化したむベントを毎月開催しおおりたす。 その名も「 PHPTechCafe 」 次回は10/24(月)に『 PHP のリヌダブルなコヌド』 をテヌマに開催したす ただただ参加者を募集しおいたすので、ぜひお気軜にご参加ください。 👉 PHPerのための「PHPのリヌダブルなコヌド」を語り合うPHP 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