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

TECH PLAY

株匏䌚瀟ラクス

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

å…š982ä»¶

こんにちは ラク ス入瀟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
はじめに こんにちは、開発課に所属しおいる新卒 1 幎目の ke-suke0215 です。 今回、 axois に぀いお調べおみたした。 axios は非同期で API 呌び出しを簡単に行うこずができるラむブラリです。 しかし、簡単がゆえに内偎でどのように動いおいるか曖昧な人も倚いのではないでしょうか。 axios の䞭身を理解するには、よく䞀緒に䜿われる async ず await の理解が重芁になっおきたす。 たた、 async ず await の理解には Promise に぀いおの理解が必芁になり、Promise は非同期凊理の蚘述に䜿うものです。 なので、非同期凊理、Promise、async ず await、最埌にメむンの axios の順で説明しおいきたす。 サンプルプログラムは TypeScript で蚘述しおいたす。 目次 はじめに 目次 非同期凊理ずは Promise に぀いお pending, resolve, reject の 3 ぀の状態がある Promise を動かしおみる 状態を倉曎する then ず catch async ず await axios の䞭身で行われおいるこず たずめ 非同期凊理ずは 非同期凊理は字からも分かる通り、同期凊理ではない凊理のこずです。 具䜓的には䞋のように衚されたす。 同期凊理実行した凊理の終了を埅っお次の凊理に進む動き 非同期凊理実行した凊理の終了を埅たずに次の凊理に進む動き 蚀葉だけだず分かりづらいため、実際のプログラムを芋ながら説明しおいきたす。 ここでは 2 ぀の匕数文字列を受け取り、 setTimeout を甚いお 1 秒埌に 1 ぀目の匕数を衚瀺し、その盎埌に 2 ぀目の匕数を衚瀺するプログラムを考えたいず思いたす。 実行時には匕数に "匕数" ず "匕数" を入れおいるので、実行した秒埌に 匕数 匕数 ず衚瀺されるのが期埅する振る舞いです。 const sampleFunc = ( str1: string , str2: string ) : void => { // 1秒埌に実行 setTimeout (() => { console .log ( str1 ); } , 1000 ); console .log ( str2 ); } ; sampleFunc ( "匕数" , "匕数" ); しかしこのプログラムを実行するず、䞋のように盎ちに 匕数 が衚瀺され、その 1 秒埌に 匕数 が衚瀺されたす。 匕数 匕数 これが非同期凊理です。 setTimeout で 1 秒埅っおいる間、TypeScript は凊理の終了を埅たずに次に進んでしたいたす。なので 匕数 が先に衚瀺されおしたうのです。 期埅する振る舞いを実珟するためには、 setTimeout の凊理が終了しおから次に進んでほしいので、ここでやりたいこずは非同期凊理を同期凊理のように扱うこずです。 Promise に぀いお Promise は䞀蚀で衚すず『非同期凊理の状態を監芖するためのオブゞェクト』です。 非同期凊理を同期凊理のように扱える曞き方の 1 ぀になりたす。 具䜓的に説明しおいきたす。 pending, resolve, reject の 3 ぀の状態がある これが Promise を考える䞊で重芁な抂念になっおきたす。3 ぀の状態の意味は䞋蚘のようになっおいたす。 pending埅機凊理の完了を埅っおいる resolve解決凊理が成功 reject 拒吊凊理が倱敗 Promise は垞にこの 3 ぀のうちどれかの状態になっおいたす。 はじめは埅機を衚す pending になっおおり、凊理の内容によっお状態を倉化させたす。 期埅通りであれば成功を意味する resolve 、期埅にそぐわない堎合は倱敗を意味する reject に倉曎するのが基本的な䜿い方です。 Promise を動かしおみる 先皋のプログラムに少し倉曎を加え、 setTimeout の䞭で条件分岐を远加しお Promise を䜿っおみたす。 第 1 匕数に文字列を入れお関数を実行すれば成功ずし、1 秒埌に第 1 匕数を衚瀺しお盎埌に第 2 匕数を衚瀺したす。 第 1 匕数が空文字なら倱敗ずし、第 1 匕数が空文字である旚を䌝えるメッセヌゞを出力したす。 ただ説明しおいない蚘述もありたすが、䞀旊スルヌしおください。 const sampleFunc = ( str1: string , str2: string ) : void => { new Promise < void >(( resolve , reject ) => { setTimeout (() => { if ( str1 !== "" ) { console .log ( str1 ); resolve (); // 状態をresolve成功に倉曎 } else { reject (); // 状態をreject倱敗に倉曎 } } , 1000 ); } ) .then (() => { console .log ( str2 ); } ) . catch (() => { console .log ( "第1匕数が空文字です" ); } ); } ; sampleFunc ( "匕数" , "匕数" ); 今回は先皋ず同様 "匕数" ず "匕数" を匕数にいれおいるので、実行した 1 秒埌に 匕数 匕数 ず出力されたす。 Promise を䜿甚しおいない蚘述では 匕数 が先に衚瀺されおいたしたが、今回は期埅通りの動きです。 プログラムの詳现を芋おいきたしょう。 状態を倉曎する コメントでも蚘茉しおいたすが、6 行目の resolve() ず 8 行目の reject() が状態を成功ず倱敗に倉曎する蚘述です。 これは Promise を むンスタンス 化する際の匕数に入れる、コヌルバック関数の 2 ぀の匕数が倉曎する関数名に該圓したす。 str1 が空文字ではない堎合は状態を resolve にしたいので、倀を出力しおから resolve() を実行し、空文字の堎合は reject() を実行するこずで状態を reject にしおいたす。 then ず catch Promise が非同期凊理を制埡できるのは、状態によっおその埌の凊理を倉える仕組みを持っおいるからです。 Promise の凊理の埌には、 .then ず .catch を続けるこずができたす。 具䜓的には、Promise の䞭の凊理が終了したずき状態が resolve であれば then の匕数の䞭が、 reject であれば catch の匕数の䞭が実行されるようになっおいたす。 今回は resolve() が実行されお凊理の終了時には Promise の状態が resolve になっおいるので、then の匕数の䞭身が実行され、catch は無芖されたす。仮に匕数である str1 を空文字で実行した堎合、then は無芖されお catch の匕数の䞭身が実行される動きずなりたす。 したがっお、特定の凊理今回の堎合は setTimeout の終了を埅っおから次の凊理を行いたい堎合、 Promise の䞭で最初の凊理を実行 状態を resolve に倉曎 then の匕数に次の凊理を蚘述 このようにするこずで実珟できたす。 以䞊が Promise における非同期凊理の基本的な説明です。 async ず await ここたでで芋おきた Promise は、次に実行したい凊理を then や catch に入れおいたした。 ですが async ず await を䜿うず then などを䜿甚しなくおも非同期凊理を同期凊理のように動かすこずができるので、よりシンプルに曞くこずができたす。 Promise の節に蚘述したプログラムを async ず await に曞き換えたものを芋おみたす。 const sampleFunc = async ( str1: string , str2: string ) : Promise < void > => { await new Promise < void >(( resolve , reject ) => { setTimeout (() => { if ( str1 !== "" ) { console .log ( str1 ); resolve (); // 状態をresolve成功に倉曎 } else { reject (); // 状態をreject倱敗に倉曎 } } , 1000 ); } ); console .log ( str2 ); } ; sampleFunc ( "匕数" , "匕数" ); 出力結果は Promise の時ず同様に䞋蚘のようになりたす。 匕数 匕数 順を远っお説明したす。 async は同期凊理ずしお扱いたい䞀連の凊理を蚘述した関数の前に぀けたす。 次に、await です。await には以䞋のようなルヌルがありたす。 await の次で Promise を むンスタンス 化する async を぀けた関数の䞭に曞く Promise オブゞェクトの前に await を぀けるこずで、その Promise オブゞェクトが倀を返すのを埅぀ようになりたす。 ぀たり Promise 内の凊理が終了するたで次の凊理に進たなくなるのです。 これにより非同期凊理を同期凊理のように扱うこずができたす。 await を぀けた凊理が終了したずきに状態が resolve であればそのたた次の凊理に進み、 reject であれば゚ラヌずなりたす。 今回は省略しおいたすが、 try ず catch で囲むこずで゚ラヌ埌の凊理を曞くこずができたす。 この䟋では制埡する非同期凊理は 1 ぀ですが、耇数ある堎合には async ず await で then などを省略できるメリットがより顕著に感じられるはずです。 axios の䞭身で行われおいるこず ようやく本題の axios に぀いおです。 冒頭でも述べたしたが、axios は非同期で API 呌び出しを行うこずができたす。 たた、先皋説明した async,await ず䞀緒に䜿われるこずが倚いです。 䟋ずしお郵䟿番号をパラメヌタずしお枡すず䜏所を返す API を䜿甚したす。 匕数に郵䟿番号を入れるずその䜏所を取埗する関数を䜜成し、実行しおみたす。 それではサンプルプログラムを芋おいきたしょう。 import axios from "axios" ; const sampleFunc = async ( zipcode: string ) : Promise < void > => { // APIを呌び出す const response = await axios. get( "https://zipcloud.ibsnet.co.jp/api/search" , { params: { zipcode: zipcode } , } ); console .log ( response.data ); } ; sampleFunc ( "7830060" ); こちらのプログラムを実行するず、次のような出力ずなりたす。 { message: null, results: [ { address1: '高知県', address2: '南囜垂', address3: '蛍が䞘', kana1: '', kana2: '', kana3: '', prefcode: '39', zipcode: '7830060' } ], status: 200 } きちんず䜏所の情報が垰っおくるこずが確認できたす。 それではプログラムの解説に移りたす。 axios はラむブラリなので、1 行目でむンポヌトしおいたす。 今回は get を䜿甚しおいたすが、post や delete を䜿うこずもできたす。 匕数に URL を入れ、必芁であればパラヌメタを指定するこずで API を呌び出すこずができたす。 先皋たでは setTimeout を利甚し、明瀺的に 1 秒凊理を埅っおいたのでわかりやすかったです。 API の呌び出しに぀いおも具䜓的な埅機時間は堎合によりたすが、通信するのに䞀定の時間がかかるため await を䜿甚しないずデヌタを取埗する前に console.log(response.data); が動いおしたいたす。 axios は「Promise ベヌス」ず蚀われたすが、この面で 2 ぀のこずを自動的にやっおくれおいたす。 Promise の むンスタンス 化 resolve ず reject ぞ自動的に状態を倉曎 await のルヌルを説明した郚分で、 await の次で Promise を むンスタンス 化する ず曞きたした。 今回のプログラムでは await の埌に axios が来おおり、䞀芋 Promise を むンスタンス 化しおいないように思えたす。 しかしこのずき axios は、裏偎で自動的に Promise を むンスタンス 化しおくれおいるのです。 たた、通信が成功したかどうかによっお Promise の状態を、resolve もしくは reject に倉えおくれおいたす。 これらによっお Promise をあたり意識せずに「async ず await ぀けお axios で API 呌び出せばいい感じに動く」ずいうこずが実珟されおいたす。 たずめ axios が内偎でどのような凊理を行っおいるのかを、遡っお芋おきたした。 Promise から順を远っお芋おいくず、わかりやすかったず思いたす。 内偎の凊理を理解するこずで、実行する䜍眮や゚ラヌの拟い方などで迷うこずが枛るのではないでしょうか。 参考にしおいただければ幞いです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちは ラク ス入瀟幎目の koki _matsuraです。 本日は、Next.jsずVercel、Supabaseを甚いお簡単なアプリを高速で開発する手順に぀いおお話しできればず思いたす。 アゞェンダ は以䞋の通りです。 Next.jsずは ReactずNext.jsの違い Next.jsの特城 Vercelずは Supabaseずは ToDoアプリ䜜成 Supabaseにデヌタベヌスを甚意 VercelでNext.jsプロゞェクトを䜜成・デプロむ・GitHub連携 VercelずSupabaseの連携 GitHubからクロヌン Vercelから環境倉数を取埗 Supabaseのデヌタベヌスに接続 コヌド線集 終わりに 参考文献 Next.jsずは Next.jsはReactベヌスのアプリケヌション フレヌムワヌク です。 公匏サむトではNext.jsずはReactを甚いたWeb アプリ開発 で生じる問題を党お解決する フレヌムワヌク だず玹介されおいたす。 ReactずNext.jsの違い サヌバの有無 これがNext.jsずReactの1番の違いです。 Next.jsはサヌバヌ機胜を持っおいるのですが、Reactはサヌバヌ機胜を持っおいたせん。そのため、Next.jsは単䜓でWEBアプリを動かすこずができたす。Reactはサヌバヌを別に甚意し、サヌバヌ甚のモゞュヌルや ディレクト リなどを考えないずいけないため、孊習のコストが高くなりたす。 フレヌムワヌク かラむブラリか Next.jsはアプリケヌション フレヌムワヌク ずしおWEBアプリケヌションの土台ずしお䜿われ、Reactは郚分的にDOMの倀で衚瀺を倉化させるこずに特化しおいるViewラむブラリずしお䜿われたす。 郚分導入 Next.jsは フレヌムワヌク なので、郚分導入はできたせん。䞀方、Reactはラむブラリなので Ruby on Rails や Django の フレヌムワヌク に取り入れるこずが可胜になっおいたす。 Next.jsの特城 画像の最適化 Next.jsにはimgタグの代わりずなるImageタグがあり、これを䜿うこずで画像の次䞖代フォヌマットであるWebPぞ自動で倉換し、高速に画像を衚瀺するこずができたす。 ファむルベヌスルヌティング 通垞、WEBペヌゞを衚瀺したい堎合は特定のフォルダ配䞋にindex.htmlを配眮したす。しかし、Next.jsでは導入時点で"pages"ずいうフォルダがあり、その配䞋にファむルを配眮するず自動でパスが生成されたす。 ハむブリッド レンダリング Reactでは CSR (Client Side Rendering)にのみ察応しおいたす。 CSR はペヌゞのサむズが倧きい時にロヌディング時間が長くなっおしたうずいうデメリットがあり、 SEO 的にも悪くなるず考えられたす。 䞀方、Next.jsでは CSR だけでなく、 SSR (Server Side Rendering)にも察応しおおり、ペヌゞごずに個別に レンダリング 方法を蚭定できたす。たた、プレ レンダリング も可胜で、最初にペヌゞにアクセスする際にHTMLを提䟛するため、 レンダリング の速床を倧幅に軜枛するこずが期埅できたす。 ファストリ フレッシュ ゜ヌスコヌド に倉曎があったずきにその箇所のみが再描画する機胜です。これにより効率的に開発を進めるこずができたす。 以䞊のこずから、WEB アプリ開発 における開発者の手間を省いおくれる フレヌムワヌク になっおいたす。 Vercelずは Next.jsを開発したVercel Inc.が提䟛しおる ホスティング サヌビスです。 GitHub などの リポゞトリ ず連携するこずで簡単に䜜成したWEBアプリを数十秒でデプロむできたす。 Supabaseずは SupabaseはSupabase Pte. Ltd.が開発しおいる開発者向け オヌプン゜ヌス のデヌタベヌスプラットフォヌムです。 SupabaseはFirebaseず比范し、倧きな違いずしお、デヌタベヌスが挙げられたす。FirebaseはNoSQLを甚いおいるのに察し、Supabaseは PostgreSQL を甚いおいたす。たた、Supabaseの管理画面はずおも盎感的で個人的には調べなくおも操䜜しやすいです。なので、普段からリレヌショナルデヌタベヌスを觊っおいる人からすれば、Firebaseよりも孊習コストを少なく始められるものになっおいたす。 ToDoアプリ䜜成 これから実際に先ほど玹介させおいただいた「Next.js」「Vercel」「Supabase」を甚いお、入力した文字列がリスト型に出力される基本的な機胜しか持たないToDoアプリを䜜成、デプロむするたでを手順を远っお説明したいず思いたす。 Supabaseにデヌタベヌスを甚意 たずはSupabaseにデヌタベヌスを甚意しおいきたす。 Supabase のサむトで「 Sign in」したしょう。 アカりントをお持ちでない方は「Start your project」をクリックしおください。 䞋蚘の画面が衚瀺されれば、「 Sign in with GitHub 」を抌し、 GitHub ず連携したしょう。 成功すれば、䞋蚘のような画面が衚瀺されたす。この画面巊䞊にある「New Project」をクリックしたす。 Organization・Name・Database Password・Regionはご自由に蚭定しおください。 蚭定が終われば、「Create new project」をクリックしたす。 ホヌム画面が衚瀺されおいれば成功です。 では、本題ずなるデヌタベヌスを䜜成したす。サむドバヌから「 SQL Editor」を遞択埌、巊䞊に衚瀺される「New query」をクリックしたす。 するず、゚ディタヌが衚瀺されたすので䞋蚘のようなコヌドを入力し、右䞋の「RUN」をクリックし実行させたす。 ToDoアプリを䜜成するため、ID、タむトル、達成したか、䜜成した時間をカラムずしお持たせたす(今回の蚘事ではID・タむトルのみでも問題ありたせん)。 テヌブルが䜜成されたかは、サむドバヌから「Database」をクリックし、衚瀺された画面にコヌド通りのテヌブルがあるかで刀断できたす。 正垞に実行されおいれば、䞋蚘の画像のようになりたす。 以䞊でSupabase䞊でデヌタベヌスが䜜成できたした。 次はVercel䞊でNext.jsのプロゞェクトを䜜成し、デプロむ、 GitHub 連携しおいきたしょう。 VercelでNext.jsプロゞェクトを䜜成・デプロむ・ GitHub 連携 Vercel のサむトで「Continue with GitHub 」をクリックしたしょう。 䞋蚘のような画面が衚瀺されるので、右䞊から「Add New Project」をクリックしたしょう。 Next.jsのプロゞェクトを䜜成したいのでテンプレヌトを遞択したしょう。 䞋蚘の画像ではGit リポゞトリ を䜜成しおいたす。自分のアカりントを「GIT SCOPE」で遞択し、「REPOSITORY NAME」には自由に名前を぀けおください。 「Create private Git Repository」はチェックを入れるずprivate リポゞトリ ずしお䜜成されたす。 「Create」をクリックするずGit リポゞトリ が䜜成され、自動でデプロむたでしおくれたす。 デプロむ完了埌、 ダッシュ ボヌドに戻るず䞋蚘の画像のようになっおいたす。 「View Git Repository」をクリックするず自分のGitアカりントに リポゞトリ が䜜成されおいるこずが確認できたす。「Visit」を抌すず、䜜成したプロゞェクトがデプロむされおいるこずが確認できるず思いたす。 以䞊で、Vercel䞊でNext.jsプロゞェクトを䜜成、デプロむ、 GitHub ずの連携が完了したした。 次はVercelずToDoアプリ甚のデヌタベヌスを䜜成したSupabaseを連携をしたす。 VercelずSupabaseの連携 たず、先ほどの䜜成したプロゞェクトが衚瀺されおいる画面から「Settings」に移動したす。 「Browse Marketplace」をクリックし、「Supabase」を怜玢したす。 怜玢結果に二぀出おきたすが、「Supabase」ず曞かれおいる方を遞択したす。 「Add Integration」をクリックしたしょう。 Supabaseをどのアカりントに統合するのかを遞択したす。 この画面ではどのプロゞェクトにSupabaseを統合するのかを蚭定したす。 「All Projects」を遞択すれば、すべおのプロゞェクトに統合されたす。今回はToDoアプリだけに統合したいので、「Specific Projects」を遞択したす。そしお、該圓するプロゞェクトを遞択したしょう。 遞択が終われば、「CONTINUE」をクリック。 Vercel䞊で先ほど䜜成したプロゞェクトずSupabaseで䜜成したデヌタベヌスをそれぞれ遞択し、「Add Integration」をクリックしお連携したす。 これでVercelずSupabaseの連携は終わりたした。 次は䜜成されたGit リポゞトリ をクロヌンしたす。 GitHub からクロヌン 自身の GitHub にアクセスするず、先ほどVercel䞊で䜜成したプロゞェクトがあるので、 SSH をコピヌしたしょう。 CLI を開き、䞋蚘のコマンドを実行し、ロヌカル環境にクロヌンしたす。 クロヌンができれば、奜きなコヌド゚ディタヌで開き、䞋蚘のコヌドでロヌカル開発サヌバヌを起動したす。 起動が終われば、 http://localhost:3000 にアクセスしおみたしょう。 テンプレヌトず同じプロゞェクトが衚瀺されれば、成功です。 Vercelから 環境倉数 を取埗 Vercelで䜜成したプロゞェクトには、䞋蚘のような連携したSupabaseの 環境倉数 が「Settings」の「Environment Variables」にありたす。 Vercel䞊の 環境倉数 を取埗するために CLI で䞋蚘のコマンドでVercelにログむンしたす。 「Ok to proceed?」には「y」ず入力するず、ブラりザが開くので、「Continue with GitHub 」を遞択したす。ブラりザに「 CLI Login Success」ず衚瀺されるずログむン成功です。 次にVercelプロゞェクトをロヌカル環境にクロヌンしたプロゞェクトにリンクしたす。䞋蚘のコマンドを入力したす。 該圓するプロゞェクトなら「y」を入力したす。 プロゞェクトをリンクできたので、䞋蚘のコマンドを入力するこずでプロゞェクトの 環境倉数 を取埗したす。 成功すれば、プロゞェクトに「.env」が䜜成されたす。ここにはSupabaseの 環境倉数 が含たれおいたす。 この 環境倉数 はGitにあげおはいけないのでファむル名を「.env.local」に倉曎し、無芖されるようにしたす。 以䞊で、Vercelの 環境倉数 を取埗できたした。 次はこの 環境倉数 を甚いお、Supabaseのデヌタベヌスに接続したす。 Supabaseのデヌタベヌスに接続 Supabaseで䜜成したデヌタベヌスに接続するためにはSupabaseクラむアントが必芁ずなるので、䞋蚘の2぀のコマンドで型定矩ずSupabaseクラむアントをむンストヌルしたす。 むンストヌルが完了すれば、「utils/supabase.ts」を䜜成し、次のコヌドを入力したす。このコヌドでは、Supabaseクラむアントを初期化しおいたす。 Supabaseクラむアントを甚いお、デヌタベヌスを操䜜する準備ができたので、実際にコヌドを線集しおいきたす。 コヌド線集 珟時点のコヌドはNext.jsのテンプレヌトのものなので、コヌドを線集したす。入力郚ず出力郚を甚意しお、シンプルなToDoアプリを䜜りたしょう。 入力郚の コンポヌネント 「/components/InputToDoForm. tsx 」を䜜成したす。コヌドは䞋蚘のようにしたす。 pushTodo関数でデヌタベヌスのテヌブルtodosに入力内容を远加しおいたす。 fetchTodosは入力郚、出力郚䞡方で䜿甚するのでHooks化しおいたす。 出力郚の コンポヌネント 「/components/ToDoList. tsx 」を䜜成したす。コヌドは䞋蚘のようにしたす。 fetchTodosを蚘述しおいる「Hooks/useAddTodo.ts」を䜜成したす。コヌドは䞋蚘のようにしたす。 fetchTodosはデヌタベヌスtodosから党件取埗しおきたす。 2022/10/11 䞊蚘コヌドのuseEffect内で誀りがあったため修正いたしたした。 コンポヌネント の䜜成、内郚の凊理ができたので、テンプレヌトのコヌドが蚘述されおいる「pages/index. tsx 」を䞋蚘のように線集したす。 線集が終われば、ロヌカル環境を立ち䞊げ、 http://localhost:3000 にアクセスしたす。入力郚ず"todoリスト"の文字列があれば問題ありたせん。 入力郚に適圓な文字列をうち、その文字列が"todoリスト"の文字列の䞋にリストで衚瀺されおいれば、完成です。 「テスト」「テスト2」「テスト3」ず3床入力した堎合は以䞋のようになりたす。 入力ず出力に問題はなかったので、 GitHub にプッシュしたす。 そしお、プッシュ埌、Vercelにログむンするず自動でビルド・デプロむをしおくれたす。 Vercelの該圓プロゞェクトの画像がテンプレヌトのものからToDoアプリのものに倉わっおいればデプロむが終わっおいたす。 終わりに Next.jsずVercel、Supabaseを甚いた簡単なアプリを開発する手順に぀いおご玹介させおいただきたした。 Supabaseのデヌタベヌス䜜成は非垞に簡単で、Vercelも GitHub の連携さえすれば、自動でビルド・デプロむしおくれるので開発だけに集䞭できたした。 是非、Next.jsのアプリケヌションを䜜ろうずしおいる方はSupabase+Vercelを䜿っおみおください。 参考文献 supabase.com reffect.co.jp weseek.co.jp zenn.dev ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
はじめに こんにちは新卒幎目の hachimd です 先日、先茩゚ンゞニアの方に「 Java で゜ヌトする時っお Collections 䜿うんですよね」っお話をしたら「いやいや、 Java の゜ヌトは Stream が䟿利だよ」っお教えおいただきたした。 そこで今回は、Stream を䜿っお、どうやっお゜ヌトするのか、どう䟿利なのかを、Collections を䜿った゜ヌトず比范しおれロから解説しおみようず思いたす。 考え方から蚀及しおいるので、゜ヌトの方法が党くわからない人でも倧䞈倫です。 なお、今回は JDK11 を䜿甚しおいたす。 目次 はじめに 目次 基本的な゜ヌトの考え方 Collections を䜿った゜ヌト 芁玠の倧小関係が明らかなずき 倧小比范の方法を制埡したい時 Collections.sort のデメリット Stream を䜿った゜ヌト Stream を䜿った単玔な゜ヌト Stream を䜿った『人オブゞェクト』の゜ヌト 3 皮類の敎数を返す凊理で゜ヌト comparing によるキヌの指定だけで゜ヌト 耇数のキヌで゜ヌト 最埌に 参考曞籍   基本的な゜ヌトの考え方 ゜ヌトは䞀蚀で蚀うず、「昇順 or 降順で䞊び替えるこず」ず蚀えたす。 ここで、「名前」ず「幎霢」を持぀『人オブゞェクト』を䞊び替える際に、「たず名前順で䞊び替え、名前が同じ時は幎霢順で䞊び替える」ずいうルヌルにするず、単に昇順・降順では䞊べられないず感じおしたいたすが、『人オブゞェクト』の倧小関係を決める際に「名前を最優先、次点で幎霢」ず考えるず、あくたで『人オブゞェクト』の倧小関係に埓っお昇順・降順に䞊べおいるのでシンプルになりたす。 ぀たり、゜ヌトしたい芁玠に察しお、どのように倧小を決定するかを決めおやれば、あずは API を䜿っお゜ヌトができるずいうこずです。 【重芁】゜ヌトするのに必芁なこずは、芁玠の倧小関係を決めおあげるこず Collections を䜿った゜ヌト ここではたず、倧小関係が明らかなものを゜ヌトする方法ず、倧小関係が明らかでない『人オブゞェクト』を゜ヌトする方法を解説したす。 どちらも Stream が䜿えるようになる以前によく䜿われおいた、 Collections.sort() を䜿っお解説をしお、 Collections.sort() のデメリットにも蚀及したす。その埌、 Stream を䜿ったシンプルでわかりやすい゜ヌトの方法を解説しおいきたす。 芁玠の倧小関係が明らかなずき 数倀や文字列のように倧小関係が明らかなずきは、倧小関係を決めおやらなくおも゜ヌトするこずができたす。たた、゜ヌトの結果は自然順序明らかな倧小関係に基づく昇順になりたす。 ゜ヌトするには Collections.sort() を呌び出すだけです。 List<Integer> numbers = Arrays.asList( 5 , 4 , 8 , 3 , 1 ); // ゜ヌトを実行 Collections.sort(numbers); // 結果を出力 for ( int num: numbers){ System.out.print(num + " " ); // 1 3 4 5 8 } 倧小比范の方法を制埡したい時 次に、age ず name をプロパティにも぀ Person を゜ヌトするこずにしたす。 Person オブゞェクトの幎霢差を返す ageDifference メ゜ッドも定矩しおいたす。 public class Person { private final int age; private final String name; public Person(String name, int age) { this .name = name; this .age = age; } public int getAge() { return age; } public String getName() { return name; } @Override public String toString() { return "Person{" + "age=" + age + ", name='" + name + ' \' ' + '}' ; } public int ageDifference( final Person other) { return this .age - other.age; } } Person の倧小関係がどう決たるのかは我々が定矩しおあげる必芁がありたす。 Java では、芁玠の倧小比范の方法を自分で決定するには Comparator ずいうむンタフェヌスを利甚したす。 Comparator は関数型むンタフェヌスで、抜象メ゜ッドずしお compare メ゜ッドが定矩されおいたす。 cpmpare メ゜ッドの実際の凊理に「倧小比范の方法」を蚘述しおいきたす。たた、この凊理はある決たりに埓っお曞く必芁がありたす。具䜓的には、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返す」ような凊理になりたす。 参考 Comparator むンタフェヌスの compare メ゜ッド  それでは「たず幎霢順で䞊び替え、幎霢が同じ時は名前順で䞊び替える」ずいうルヌルで、実際に゜ヌトをする凊理を芋おいきたしょうここでは Collectons を䜿った゜ヌトはめんどくさいなず感じおもらえれば倧䞈倫です。 たずはコヌドを芋おみたしょう。 List<Person> people = Arrays.asList( new Person( "John" , 20 ), new Person( "Sara" , 21 ), new Person( "Jane" , 21 ), new Person( "Greg" , 35 ) ); // compareメ゜ッドをオヌバヌラむドしおPersonオブゞェクトの倧小比范の方法を定矩する // 比范方法幎霢で比范しお同じなら名前で比范 Comparator<Person> personComparator = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { int ageDiff = p1.ageDifference(p2); if (ageDiff != 0 ) { return ageDiff; } else { int nameDiff = p1.getName().compareTo(p2.getName()); return nameDiff; } } }; // 幎霢で゜ヌトする // 第1匕数゜ヌト察象のpeople // 第2匕数Personの倧小比范方法が定矩されたComparator Collections.sort(people, personComparator); // 䞊びを確認 for (Person person : people) { System.out.println(person); } // ゜ヌト結果 // Person{age=20, name='John'} // Person{age=21, name='Jane'} // Person{age=21, name='Sara'} // Person{age=35, name='Greg'} それでは解説です。 重芁なのは Person オブゞェクトの倧小比范の方法を定矩する郚分です。 ここでは、compare メ゜ッドの実装の決たりに埓うず、 2 ぀の Person オブゞェクト p1, p2 が匕数 p1 が p2 より 小さい ずする堎合は 負の敎数 を返す p1 が p2 より 倧きい ずする堎合は 正の敎数 を返す 䞡方が 等しい 堎合は 0 を返す ような凊理にする必芁がありたす。 たた、䞊べ方は「たず幎霢順で䞊び替え、幎霢が同じ時は名前順で䞊び替える」ずいうルヌルですので、Person の倧小関係ず compare メ゜ッドで返す倀の察応は以䞋のようになりたす。 p1 の幎霢が p2 の幎霢より小さければ p1 は p2 より 小さい  負の敎数 を返す p1 の幎霢が p2 の幎霢より倧きければ p1 は p2 より 倧きい  正の敎数 を返す もし幎霢が同じなら、 p1 の名前が p2 の名前より小さければ p1 は p2 より 小さい  負の敎数 を返す p1 の名前が p2 の名前より倧きければ p1 は p2 より 倧きい  正の敎数 を返す 名前の倧小も同じなら、 p1 ず p2 の倧小は 同じ  0 を返す 䞊蚘のコヌドの実装では 1,2 は幎霢差を返すこずで実珟しおいたす。 3,4,5 は String クラスに甚意された compareTo()メ゜ッドを䜿っお実珟しおいたす。 なお、Comparatorのcompareメ゜ッドをオヌバヌラむドする郚分に関しお、 ラムダ匏 を䜿っお凊理だけを盎接匕数に枡すこずも可胜です。 Collections.sort(people, (p1, p2) -> { int ageDiff = p1.ageDifference(p2); if (ageDiff != 0 ) { return ageDiff; } else { int nameDiff = p1.getName().compareTo(p2.getName()); return nameDiff; }}); ※ 補足 compareTo()は String クラスに甚意された 2 ぀の文字列を蟞曞的に比范するメ゜ッド。 Comparable むンタフェヌスの実装であり、これも、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返す」ように実装されおいる。 参考 Comparable むンタフェヌスの compareTo メ゜ッド  Collections.sort のデメリット コヌドを芋ただけでは䜕をしおいるか分かりにくい 䞊の実装のようなコヌドを理解するには、Comparator むンタフェヌスの compare メ゜ッドをどのように実装するかを知っおいる必芁がありたす。さらに、正の敎数を返すのか負の敎数を返すのか垞に芚えおおくこずはなかなか倧倉です。しかもそのような凊理を曞く必芁があるのでコヌド自䜓も長く読みづらいものににっおしたいたす。 元のリストが砎壊されおしたう このデメリットはずおも重芁です。 Collectons の sort メ゜ッドは、゜ヌトしたいリストの芁玠を盎接䞊び替えおいたす。プログラミングの䞖界では、このようにオブゞェクトを盎接倉曎するようなメ゜ッドは砎壊的メ゜ッドず呌ばれたす。砎壊的メ゜ッドを䜿うずきは特に泚意が必芁です。それは、オブゞェクトを盎接倉曎しおしたうず、埌でたたそのオブゞェクトを利甚する際に゜ヌトされおいるのかされおいないのかなどを意識しなければならず、凊理を远うのが倧倉になりバグが混入しやすくなるからです。そのため、元のオブゞェクトは倉曎せず、凊理結果の新しいオブゞェクトを返すような非砎壊的メ゜ッドを利甚するこずが奜たしいず蚀えるでしょう。 Stream を䜿った゜ヌト それでは Stream を䜿っお芋やすくか぀簡朔に蚘述できる゜ヌト方法を解説しおいきたす。 ここたで Collections を䜿った゜ヌトを説明しおきたしたが、「Collections を䜿う゜ヌトは倧倉だな」ず感じおいただければそれで倧䞈倫です。 Stream はデヌタの集たりに察しお、さたざたな凊理゜ヌトや絞り蟌み、各デヌタに察する凊理などを簡朔に蚘述できるようにするむンタフェヌスです。 Stream を䜿うこずで、正の敎数 or 負の敎数 or 0 を返す凊理compare メ゜ッドの実装を意識しなくおも柔軟な゜ヌトができるようになりたす。 もちろん今たで通り、 3 皮類の敎数を返す凊理を曞いお゜ヌトするこずもできたす。 ここでは、『人オブゞェクト』に察しお、これたで通り 3 皮類の敎数を返す凊理を Stream を䜿っお曞くずころから始め、コヌドを改良しおいきながら、最埌に、compare メ゜ッドの実装を意識しなくおも゜ヌトできるような方法を玹介したす。 Stream を䜿った単玔な゜ヌト Stream を䜿った『人オブゞェクト』の゜ヌトに行く前に、数倀のように芁玠の倧小関係が明らかなものを゜ヌトする方法に぀いお觊れおおきたす。 List<Integer> numbers = Arrays.asList( 5 , 4 , 8 , 3 , 1 ); List<Integer> sortedNumbers = numbers.stream().sorted().collect(toList()); Stream で゜ヌトをする堎合は sorted メ゜ッドを䜿甚したす。 倧小関係が明らかな堎合は、匕数なしで䜿うこずで自然順序で゜ヌトできたす。 たた、これは非砎壊的メ゜ッドなので、゜ヌト結果を新しい倉数に栌玍しおいたす。 collect(toList()) は sorted メ゜ッドの戻り倀型が Stream なので型を List に戻しおいるだけです。 たた、 Integer は Comparable むンタフェヌスを実装しおいる自然順序が定矩されおいるので、以䞋のように、 naturalOrder() や reverseOrder() を䜿甚しお昇順、降順にするこずもできたす。 // 昇順 List<Integer> sortedNumbers = numbers.stream().sorted(Comparator.naturalOrder()).collect(toList()); // 降順 List<Integer> sortedNumbers = numbers.stream().sorted(Comparator.reverseOrder()).collect(toList()); ※Person クラスが Comparable むンタフェヌスを実装しおいれば、同様に naturalOrder() や reverseOrder() を䜿甚できたす今回は Comparable は実装しおいたせん。 Stream を䜿った『人オブゞェクト』の゜ヌト それでは Stream を䜿った『人オブゞェクト』の゜ヌトを解説しおいきたす。 3 皮類の敎数を返す凊理で゜ヌト Comparator むンタフェヌスの compare メ゜ッドを実装しお倧小関係比范方法を定矩するのはこれたでず同じです。 先ほどの繰り返しになりたすが、「2 ぀の匕数をずり、 第 1 匕数が第 2 匕数より小さいずする堎合は負の敎数、䞡方が等しい堎合は 0、第 1 匕数が第 2 匕数より倧きいずする堎合は正の敎数を返すような凊理」を枡しおあげたす。 幎霢で゜ヌト // Comparatorはラムダ匏を䜿っお凊理だけを盎接枡す List<Person> sortedPeopleByAge = people.stream().sorted((person1, person2) -> person1.ageDifference(person2)).collect(toList()); 名前で゜ヌト List<Person> sortedPeopleByName = people.stream().sorted((person1, person2) -> person1.getName().compareTo(person2.getName())).collect(toList()); 倧小関係が明らかでない堎合は、sorted メ゜ッドの匕数に Comparator を入れたす ラムダ匏 で入れおいたす。 Collections の゜ヌトず比范しお、非砎壊的メ゜ッドになっおいるのは良いこずですが、どんな敎数を返すか意識する必芁があるので、ただ、それほどメリットが感じられたせん。次は comparing メ゜ッドを䜿っお改良しおいきたす。 参考 Stream クラスの sorted メ゜ッド  comparing によるキヌの指定だけで゜ヌト comparing メ゜ッドは、゜ヌトに䜿うキヌを返す関数を受け取り、そのキヌで倧小比范する Comparator を返したす。 䟋えば、「Person を受け取っお Person の name を返す関数」を受け取るず、Person の name で゜ヌトする Comparator を返すこずができたす。 ぀たり、「名前の倧小関係を䜿う」ずいうこずを指定しおあげれば、「3 皮類の敎数を返す Comparator 」を返しおくれたす。 蚀い換えれば compare メ゜ッドを実装した Comparator をキヌの指定だけで䜜っおくれるずおも䟿利なや぀です。 List<Person> sortedPeopleByName = people.stream().sorted(comparing((Person person) -> person.getName())).collect(toList()); 3 皮類の敎数を返す凊理ではなく、゜ヌトするキヌを返す凊理を枡すだけになり、どんな敎数を返すのかを考えるこずが無くなりたした キヌを返す凊理自䜓を定数ずしおやるずコヌドも芋やすくなりたす。 final Function<Person, String> byName = person -> person.getName(); final Function<Person, Integer> byAge = person -> person.getAge(); List<Person> sortedPeopleByName = people.stream().sorted(comparing(byName)).collect(toList()); List<Person> sortedPeopleByAge = people.stream().sorted(comparing(byAge)).collect(toList()); メ゜ッド参照を䜿うずさらに簡略化できたす。 List<Person> sortedPeopleByName = people.stream().sorted(comparing(Person::getName)).collect(toList()); List<Person> sortedPeopleByAge = people.stream().sorted(comparing(Person::getAge)).collect(toList()); ここたで芋やすく簡略化できるず、Stream の機胜を䜿わない理由がないのがわかっおくるのではないでしょうか。 正の敎数を返すんだったかな負の敎数を返すんだったかななんお迷うこずもなく、コヌドも蚘述しやすく理解しやすいものになりたした。 参考 Comparator むンタフェヌスの comparing メ゜ッド  耇数のキヌで゜ヌト 最埌に、幎霢で比范した埌に名前で比范しお『人オブゞェクト』を゜ヌトしおみたす。 Stream を䜿うずこの凊理も非垞に簡単に曞けたす。comparing に続けお thenComparing メ゜ッドを䜿うだけです。 List<Person> sortedPeopleByAgeAndName = people.stream().sorted(comparing(Person::getAge).thenComparing(Person::getName)).collect(toList()); 序盀に玹介した、 comparing メ゜ッドの実装を自分で曞いお Collections.sort を䜿っお゜ヌトしたコヌドず比范するず、非砎壊的メ゜ッドになりコヌドも非垞にシンプルでわかりやすいものになっおいたすね。 ゜ヌトするなら Stream が圧倒的に䟿利です。 参考 Comparator むンタフェヌスの thenComparing メ゜ッド  最埌に 今回は Stream を䜿っお簡朔に゜ヌトをする方法を、埓来の Collections を䜿甚した方法ず比范しお解説したした。 これから゜ヌトを䜿う人も、これたで Collections で゜ヌトをしおいた人も、ぜひ Stream を䜿っおシンプルでわかりやすいコヌドで実装しおみおください 参考曞籍 Java による関数型プログラミング Java8 ラムダ匏ず Stream   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
匊瀟で毎月開催し、 PHP ゚ンゞニアの間で奜評いただいおいる PHP TechCafe。 2022幎5月のむベントでは「静的解析」に぀いお語り合いたした。 匊瀟のメンバヌが事前にたずめおきた静的解析ツヌルやその䜿い方の情報にしたがっお、他の参加者に意芋を頂いお語り合いながら静的解析に぀いお孊びたした。 今回はその内容に぀いおレポヌトしたす。 rakus.connpass.com 静的解析ずは 䞀般的な䜿い方 線集䞭コヌドの怜蚌 CIに組み蟌む 実行時の型怜査に぀いお PHPDocを曞かないず型が通らなくなる テストコヌドを静的解析の察象に入れるか PSRずの関係性 代衚的なPHP静的解析ツヌル PHPMD PHP_CodeSniffer (phpcs) PHPStan Psalm PhpStorm PHPコマンドによる文法チェック 線集埌蚘 静的解析ずは Wikipedia からの匕甚が玹介されたした。 コンピュヌタの゜フトりェアの解析手法の䞀皮であり、ファむルを実行するこずなく解析を行うこず。 ゜ヌスコヌド に察しお行われるこずが倚く、少数ながらオブゞェクトコヌドに察しお行う堎合もある。 ja.wikipedia.org 具䜓䟋ずしお、 PHP の ゜ヌスコヌド に察しおプログラムを実行せずに解析し、問題点を怜出するむメヌゞです。 䞀般的な䜿い方 今回は以䞋の二぀を挙げお、玹介されたした。 線集䞭コヌドの怜蚌 IDE を利甚し、コヌディング䞭に静的解析を行うこずをむメヌゞしお玹介されたした。 䟋ずしお「 PHP 文法の誀りを衚瀺」「䞍適切コヌドの指摘」「コヌド補完」を挙げられおいたした。 その際に、次のような様々な意芋がありたした。 PHPerならPhpStormを䜿甚しおいるこずが倚いため、恩恵は受けおいるず思う。 コヌドを曞いおいる際に、䞋に赀い線で衚瀺されおいる。 コンパむル しない蚀語で䜜る堎合、実行時゚ラヌずなる前に気づけるのは、非垞に心匷い味方ずなる。 CIに組み蟌む コヌドを定期的/自動的に静的解析を行うこずをむメヌゞしお玹介されたした。 具䜓䟋ずしおは、以䞋の説明がありたした。 GitにPushした際に自動的に解析を行い、䞍適切なコヌドやルヌル違反を指摘する。 静的解析の実行をGit hooksに組み蟌んでいる堎合もある。 GitにPushし、線集したコヌドで譊告が怜出されれば、Pushを拒吊するようにも出来る。 PhpStormでコミットする際に、チェックを走らせる事や、自分で遞んだコヌド解析ツヌルを走らせる事もできる。 メリットずしお、以䞋のような事が玹介されたした。 コヌドレビュヌの芳点が明確になる事で、より有益な話に時間を䜿えるようになる。 人に指摘されるより気が楜である。 実行時の型怜査に぀いお 参加者から「実行時の型怜査」に぀いお考えを聞く質問があり、倧倉盛り䞊がりたした。 以䞋が質問ず合わせお貌られたリンクになりたす。 https://stitcher.io/blog/we-dont-need-runtime-type-checks この蚘事は PHP の珟堎で玹介された。 PHP ランタむムが型チェックを行うため、メ゜ッドの戻り倀の型を PHP の蚀語機胜でintず蚘茉した堎合、実行時にStringを戻り倀ずしお返华するずタむプ゚ラヌで萜ちる。 Docコメントに at return int ず蚘茉すれば静的解析のずきに匟かれるため、二箇所に return を曞く必芁があるのは面倒である。 これに぀いおは、次のような様々な意芋がありたした。 自瀟内でもレビュアヌによっお意芋が割れおいる。 Docコメントだけでなく、メ゜ッドの戻り倀の型を蚘茉しお欲しい人。 䞡方蚘茉は面倒くさいため、蚀語機胜ずしおサポヌトされおいる型はメ゜ッドの戻り倀の型を蚘茉し、サポヌトされおいない型はDocコメントに蚘茉する人。 レビュヌコスト䞋げるために静的解析を入れおいるが、意芋が割れるため返っおコストが䞊がっおしたっおいる。 これには PHP の歎史的背景もある。 元々はメ゜ッドの戻り倀に型指定ができないため、Docコメントぞ蚘茉し、静的解析でチェックする事でしのいできた。 メ゜ッドの戻り倀に型指定できるようになった今、「Docコメントで静的解析によるチェック」、「蚀語仕様ずしお瞛りを入れる」のどちらが良いのか 最終的には以䞋の方針が挙げられたした。 今から新芏䜜成の堎合は、蚀語仕様でもチェックした方が良い。 既存凊理ぞの修正の堎合、元々静的解析チェックのみで統䞀されおいた箇所は、そのたた「Docコメントに戻り倀を蚘茉」で統䞀でも良い。 しかし、Docコメントはただの文字列であるため、蚀語仕様で瞛れるように少しづ぀ リファクタリング しおいく方が良い。 PHPDocを曞かないず型が通らなくなる たた、質問者様の考えは以䞋であったようです。 原則、メ゜ッド戻り倀の型宣蚀は蚘茉する。 Docコメントは ゞェネリック スのような必芁ず刀断した堎合のみ蚘茉する。 䞊蚘以倖の基準は、PHPStanでレベルを䞊げた際に、Docコメントを蚘茉しないず゚ラヌず刀定された堎合に蚘茉する。 これに぀いおは、次のような様々な意芋がありたした。 PHPStanでしかチェックできないものも倚いので、今埌方針に悩む箇所が発生しそうだ。 PHPStanでレベルを䞊げる事により゚ラヌずなる堎合は、他のツヌルを䜵甚する事で、少しづ぀PHPStanでメンテする範囲を緩める方法もある。 PHP 蚀語の型指定が衚珟豊かではないので、衚珟豊かにするず実行時にそれだけ解析しお凊理が重くなるため、Docコメントの方に曞いおおいたほうが PHP 党䜓の利益になる。 今は蚀語仕様が過枡期であるため、 PHP の利点途䞭で゚ラヌ䞭断せず最埌たで実行を残すためにノヌチェックに出来るオプションが垌望されおいる。 メ゜ッド戻り倀の型宣蚀をCS-Fixerで䞀括で蚘茉する方法もある。 自動眮き換えによる信頌性を疑問芖しおいるので、怜出だけ担圓するのは良さそう。 テストコヌドが存圚すれば品質は担保できる。 最終的には、チヌム皆で話し合っお方針を決めお行くのが倧事だずたずめられたした。 テストコヌドを静的解析の察象に入れるか 話の流れから「CIずかで解析を回すずきにテストコヌドは解析察象に入れるか吊か」のアンケヌトが取られたした。 このアンケヌトには、次のような様々な意芋がありたした。 テストコヌドを解析するメリットが分からない。 プロゞェクト内で PHP の有名なラむブラリを確認したが、解析察象になっおいるものが倚かった。 倉曎郚分のみテストできる機胜があれば䟿利である。 CS-Fixerを䜿甚しおいるが、PHPStanは面倒なので陀倖にするこずが倚い。 解析の察象に入れおデメリットは特にないため、基本方針ずしお解析の察象ずしおいる。 議論の䜙地はあるようですが、解析察象ずしお入れるほうが優勢でありたした。 PSRずの関係性 PSRずは PHP -FIGが策定しおいる PHP の暙準芏玄集です。 芏玄は各ルヌルがほが独立しおおり、奜きな芏玄のみを遞んで採甚するこずができたす。 www.php-fig.org PSR1ずか2ずか12ずかはコヌディング芏玄に関するものなので取り入れおいる静的解析ツヌルも倚いのではないか PSR2は珟圚では非掚奚だが、昔からの名残で残っおいるものもある 代衚的な PHP 静的解析ツヌル PHPMD コヌドの耇雑性を怜知しおくれるものです。 具䜓䟋を挙げるず、バグになりそうなコヌド、最適ではないコヌド、耇雑な衚珟、未䜿甚のパラメヌタ・メ゜ッド・プロパティなどを怜出しおくれるツヌルです。 これに぀いおは、次のような様々な意芋がありたした。 むンストヌル方法は色々あり、最近だずComposerが䟿利。盎接GtiHubから萜ずすこずも出来る。 コマンドで実行した堎合、PHPMDで怜出察象のファむルや ディレクト リを指定、結果のフォヌマット遞択、ルヌルセット指定の手順である。 ルヌルセットは、コヌドサむズや、蚭蚈関連ルヌル、ネヌミング、未䜿甚コヌド怜出などのルヌルが予め定矩されおいる。 xml ファむルを配眮し、必芁なルヌルのみ適甚、たたは、䞍芁なルヌルを削陀し、個別ルヌル最倧倀や最小倀などぞ倉曎するこずも可胜である。 実行䟋 [ root@vg110 core ] # vendor/phpmd/phpmd/src/bin/phpmd test .php text codesize,controversial,design,naming,unusedcode /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseMethodName The method test_function is not named in camelCase. /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseParameterName The parameter $param_string is not named in camelCase. /usr/local/vanguardDev/vanguard/vg-back/core/ test .php:5 CamelCaseVariableName The variable $param_string is not named in camelCase. phpmd.org PHP _CodeSniffer (phpcs) コヌディング芏玄の違反を怜出するラむブラリです。 PSRや PEAR などの様々なコヌディング芏玄を指定しお怜査を実斜しおくれたす。 これに぀いおは、次のような様々な意芋がありたした。 独自の芏玄を远加するこずも可胜である。 むンストヌル方法は色々あり、Composerや GitHub からなど、奜みの方法で導入できる。 コヌディング芏玄の違反を自動で修正するphpcbfも付属しおいる。 党お修正する事は出来ず、修正出来た物も目芖チェックは必芁である。 完党に信甚する蚳ではなく、phpcsの指摘があるファむルをナヌザに通知し、修正は手動で行う運甚をしおいる。 phpcbfは結構正確だが、phpcsに問題がある。 改行やむンデントに぀いお、コヌド䞊は正垞であっおも、CS-Fixerが゚ラヌず刀定するケヌスがたたにある。 実行䟋 $ phpcs /path/to/code/myfile.php FILE: /path/to/code/myfile.php -------------------------------------------------------------------------------- FOUND 5 ERROR ( S ) AND 1 WARNING ( S ) AFFECTING 5 LINE ( S ) -------------------------------------------------------------------------------- 2 | ERROR | Missing file doc comment 20 | ERROR | PHP keywords must be lowercase; expected " false " but found | | " FALSE " 47 | ERROR | Line not indented correctly; expected 4 spaces but found 1 47 | WARNING | Equals sign not aligned with surrounding assignments 51 | ERROR | Missing function doc comment 88 | ERROR | Line not indented correctly; expected 9 spaces but found 6 -------------------------------------------------------------------------------- コヌディング芏玄の指定 # むンストヌルされおいるコヌディング芏玄を確認 $ phpcs -i The installed coding standards are MySource, PEAR, PSR1, PSR12, PSR2, Squiz and Zend # コヌディング芏玄を指定しお実行(デフォルトはPEAR) $ phpcs --standard=PSR12 /path/to/code/myfile.inc # デフォルトのコヌディング芏玄を倉曎 $ phpcs --config-set default_standard PSR12 芏玄のカスタマむズ phpcs. xml ファむルを蚭眮しお独自のコヌディング芏玄を蚭定できる。 <? xml version = "1.0" ?> <ruleset name = "Custom Standard" > <rule ref = "PSR12" > <!-- "PSR12" の䞭で陀倖するルヌル --> <exclude name = "Generic.Files.LineLength" /> </rule> <!-- 远加するルヌル --> <rule ref = "PEAR.WhiteSpace.ObjectOperatorIndent" /> <!-- 陀倖するファむル・ディレクトリ --> <exclude-pattern> node_modules/ </exclude-pattern> </ruleset> github.com PHPStan こちらも同じくComposerやDockerから利甚可胜です。 PHARからもダりンロヌド可胜です。 ただし、Composerが無いずPHPStanの 拡匵機胜 は䜿えたせん。 解析の厳密さはオプションで倉曎可胜で、PHPStanの堎合はレベル0から9で蚭定可胜です。 レベル0が䞀番ゆるく、レベル9が最も厳密ずなっおいる レベル0は基本的なチェックで、PSRず同等のチェックレベル レベル9では、混合型(mixed)に぀いおも厳密であるレベル混合型(mixed)は、別の混合型(mixed)に枡す操䜜しか蚱可されないになる PHPStanの公匏に蚘茉がありたすが、以䞋の理由から䜿甚方法はレベル0から順番に察応しおいくのが正攻法のようです。 初めからレベル9を蚭定するず、゚ラヌ件数が膚倧ずなり、䜕から手を付けたらいいか分からなくる。 䞊䜍のレベルで゚ラヌを怜知した際は、䞋䜍のレベルで怜知される゚ラヌも合わせお修正を行わないず、゚ラヌは解消されない 歎史の長いプロゞェクトでは、レベル0の蚭定でも倚くの゚ラヌが怜出されたす。 党おの怜出された゚ラヌ察応が困難な堎合は、ベヌスラむンの蚭定を掚奚したす。 ベヌスラむンを蚭定するこずにより、以䞋のようなこずが出来るこずが玹介されたした。 ある時点で怜出した゚ラヌ内容を基準ずし、それ以降の静的解析の実行で、基準ずした゚ラヌ内容を報告しないように出来る。 既存コヌドで怜出されおいる゚ラヌを陀倖出来るため、新しいコヌドず倉曎されたコヌドで怜知された゚ラヌのみに泚力するこずが出来る。 カスタムルヌルも蚭定できるようになっおおり、 phpstan-rules ず phpstan-strict-rules を䜿甚しお拡匵するこずが出来る。 これに぀いおは、次のような様々な意芋がありたした。 レベル5からレベル6の間が深い河である レベル6は「タむプヒントの欠萜を衚瀺」であるため、クリア難易床が高い ベヌスラむンの抂念があるこずは有難い 別のツヌルでPHPStanのベヌスラむンず同様の事を行ったが、非垞に蟛かった ベヌスラむンの抂念は他ツヌルでは、Psalmにもある サむボりズ さんでは「ベヌスラむンを自動実行する」取り組みを行っおいお面癜そう※ phpstan.org ※ 情報元の玹介はありたせんでしたが、蚘事化にあたっお調べたずころ参考になるスラむドがありたした。  ツヌルはPHPStanではないですが、適応出来そうです。 効果的な静的解析の CI導入パターンを求めて / Great static analysis with CI - Speaker Deck Psalm こちらもPHPStanず同様で、厳密さをレベルで調節できたす。 ただし、レベルの匷匱がPHPStanず逆になっおおり、レベル1が最も厳しく、レベル8が䞀番ゆるい蚭定になっおいたす。 良い点ずしお、次のように玹介されたした。 怜知された違反ルヌルがなぜ䞍適切なのか理由が解説されるため、玍埗感を埗やすくなっおいる。 これがなんで悪いの ず思うずきがあるが、理解ができるず盎すモチベヌションも埗られるのではないか。 䟋 psalm.dev PhpStorm 線集䞭に解析を行い、危険な箇所に察しお䞋線で瀺すか、ハむラむトしおくれたす。 解析方法は PHP ファむルをPhpStormで開くだけです。 文法の誀りをハむラむトし、重芁床によっおハむラむト郚分の色が倉曎されるため芋やすい。 プロファむルの線集で解析内容を線集でき、任意の解析を远加する事もできる。 他の解析ツヌルをむンストヌルし䜿甚すこずも可胜。 pleiades.io PHP コマンドによる文法チェック 少し本筋ずは違いたすが、「静的解析を調べる際に、 php -l で文法チェックができるこずを芋぀けた。」ず玹介されたした。 そのため、文法の間違いに぀いおは、静的解析ツヌルを䜿甚せずに゚ラヌ怜知する事が出来たす。 これに぀いおは、次のような様々な意芋がありたした。 php -l で静的解析できるこずを初めお知った。 静的解析かず蚀われるず疑問がある。䞀応解析は行っおいるので意味は合っおいる 党ファむルを察象に php -l を実行したこずが䜕床かある。 おそらく党ファむルに察しお䞀括眮換のような凊理を実行したタむミング。 たたは、 PHP のメゞャヌバヌゞョンアップ埌に粗探しずしお調査するタむミング。 PHP のバヌゞョンアップ埌に䞀旊実行し、゚ラヌ怜知した堎合は早急に察応が必芁であるため。 線集埌蚘 以䞊、静的解析の抂芁ず代衚的なツヌルに぀いお取り䞊げたした。 PHP TechCafeでは今たで取り䞊げるこずがなかった話題でしたので、䞻催者/参加者ずもに盛り䞊がりを芋せおいたした 今埌も静的解析の掻甚方法や、新たなニュヌスに着目しおいきたいず思いたす 「 PHP TechCafe」では今埌も PHP に関する様々なテヌマのむベントを䌁画しおいきたす。 皆さたのご参加をお埅ちしおおりたす。 connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
技術広報の yayawowo です。 今回は、 Linux 䞊でファむルや ディレクト リ内容を䞀芧衚瀺する際に利甚する、 『ls コマンド』 に぀いお玹介したす ls コマンドの基本をはじめ、掻甚䟋をコマンドサンプルを亀えお説明させおいただきたす。 【目次】 ls コマンドずは ls コマンドの䜿い方 基本曞匏 ls コマンドのオプション䞀芧 衚瀺フォヌマット関連 出力フォヌマット関連 サむズ関連 時間関連 ゜ヌト関連 ls コマンドの掻甚䟋 Linux関連のおすすめブログ 終わりに ls コマンドずは lsコマンドは、ファむルや ディレクト リの䞀芧を衚瀺するためのコマンドです。 ls コマンドの䜿い方 基本曞匏 ls コマンドの基本曞匏は、以䞋の通りです。 $ ls [ オプション ] [ ファむル/ディレクトリ ] ファむルや ディレクト リの䞀芧を衚瀺させるには、察象のファむル/ ディレクト リ名を指定する必芁がありたす。 たた、ls コマンドには倚くのオプションがありたす。 以䞋にたずめおおきたすので、甚途に合わせお䜿い分けください。 ls コマンドのオプション䞀芧 衚瀺フォヌマット関連 オプション 説明 -l 詳现情報を衚瀺 -o グルヌプ情報以倖の詳现情報を衚瀺 -n 所有者/グルヌプ名の代わりにナヌザIDずグルヌプIDずし、詳现情報を衚瀺 -a .ドットファむルも含めお衚瀺 -A 「.」「..」以倖の.ドットファむルも含めお衚瀺 -d ディレクト リ内容を衚瀺せず、 ディレクト リ名のみを衚瀺 出力フォヌマット関連 オプション 説明 -1 リストを1ä»¶1行で衚瀺 -m リストをカンマ区切りで衚瀺 -C リストの出力を列瞊に゜ヌト衚瀺 -x リストの出力を行暪に゜ヌト衚瀺 -q 衚瀺䞍可胜な文字をで衚瀺 -F ファむル/ ディレクト 名の埌にタむプ識別子*/=>@|のどれかを付けお衚瀺 -p ディレクト リ名の埌にのみ、/を付けお衚瀺 サむズ関連 オプション 説明 -k -l ず䜵甚し、1KB単䜍のサむズ圢匏で衚瀺 時間関連 オプション 説明 -c -l ず䜵甚し、ファむル属性の倉曎時間ctimeを衚瀺 -u -l ず䜵甚し、最終アクセス日を衚瀺 ゜ヌト関連 オプション 説明 -S ファむルサむズが倧きい順に衚瀺 -t ファむル曎新日が新しい順に衚瀺 -v 数字順に゜ヌト衚瀺 -r 䞊び順を反転させお衚瀺 ls コマンドの掻甚䟋 前提ずしたしお、 /home 配䞋に以䞋 ディレクト リずファむルを準備しおおりたす。 /home  ┗ sample  ┗ sample2  ┗  hoge .txt  ┗ hoge2.txt これを䜿い、ls コマンドの掻甚䟋をご玹介したす 詳现情報を衚瀺-l localhost:/home# ls -l total 8 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 所有者/グルヌプ名の代わりにナヌザIDずグルヌプIDずし、詳现情報を衚瀺-n localhost:/home# ls -n total 12 -rw-r--r-- 1 0 0 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 0 0 0 Sep 13 09:40 hoge2.txt drwxr-xr-x 2 0 0 37 Sep 13 09:12 sample drwxr-xr-x 2 0 0 37 Sep 13 09:12 sample2 .ドットファむルも含めお衚瀺-a localhost:/home# ls -a . .. hoge.txt hoge2.txt sample sample2 リストを1ä»¶1行で衚瀺-1 localhost:/home# ls -1 hoge.txt hoge2.txt sample sample2 ディレクト リ名の埌にのみ、/を付けお衚瀺-p localhost:/home# ls -p hoge.txt hoge2.txt sample/ sample2/ ファむルサむズが倧きい順に衚瀺-S ※ -l ず -S の耇数オプション利甚のため、コマンド実行時は -lS ず定矩しおいたす。 localhost:/home# ls -lS total 8 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt ファむル曎新日が新しい順に衚瀺-t ※ -l ず -t の耇数オプション利甚のため、コマンド実行時は -lt ず定矩しおいたす。 localhost:/home# ls -lt total 8 -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample 䞊び順を反転させお衚瀺-r ※ -l ず -t ず -r の耇数オプション利甚のため、コマンド実行時は -ltr ず定矩しおいたす。 # ファむル曎新日順に衚瀺 localhost:/home# ls -lt total 8 -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample # ファむル曎新日順を反転し、衚瀺 localhost:/home# ls -ltr total 8 drwxr-xr-x 2 root root 37 Sep 13 09:12 sample drwxr-xr-x 2 root root 37 Sep 13 09:12 sample2 -rw-r--r-- 1 root root 0 Sep 13 09:12 hoge.txt -rw-r--r-- 1 root root 0 Sep 13 09:40 hoge2.txt Linux 関連のおすすめブログ tech-blog.rakus.co.jp Linux コマンドのたずめ蚘事です 本ブログがあれば、 Linux 操䜜に困らないず思いたす。 tech-blog.rakus.co.jp Linux 䞊で゚ディタを觊る機䌚が倚い方向け vi コマンドの基本的な䜿い方を目的別にたずめおおりたす。 tech-blog.rakus.co.jp Linux 䞊に存圚するログを調査するにあたり、良く甚いる文字列怜玢を行う grep コマンドの蚘事です。 grep コマンドの䞭でも、実務でよく䜿っおいる怜玢方法を䜵せお玹介しおいたす tech-blog.rakus.co.jp 2぀のファむルを比范しお違い(差分)を出力するdiff コマンド。 diffコマンドの衚瀺オプションを知りたい方は、是非ご確認ください。 tech-blog.rakus.co.jp Linux 䞊でファむルや ディレクト リ怜玢時に利甚するfind コマンドに぀いお玹介 find コマンドの基本をはじめ、掻甚䟋をコマンドサンプルを亀えお説明しおおりたす。 終わりに いかがでしたでしょうか 今回はファむルや ディレクト リの䞀芧を衚瀺したい際に良く甚いる、ls コマンドをご玹介させおいただきたした。 たた、ls コマンドのオプションも今回ご玹介させおいただきたしたが、利甚甚途に合わせお䜿い分けおいただくこずで業務効率を䞊げるこずができたす ls コマンドは、 Linux を觊る方にずっおは基本のキかず思いたす。 もし、ls コマンドを觊るずきに「どのオプション䜿うんだっけ」ず䞍安になった方は是非本蚘事をご参考いただけたすず幞いです。 最埌たでお読みいただきありがずうございたした ◆ その他おすすめブログ ・ sar コマンド【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で䜿える基本的なシェルLinuxコマンドの話 forずsed ・ 【Linux】今振り返りたい、プロセスっお䜕 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
匊瀟で毎月開催し、 PHP ゚ンゞニアの間で奜評いただいおいる勉匷䌚「 PHP TechCafe」。 2022幎3月のむベントでは『PHPerのための「Laravel9に぀いお語る」』をテヌマに語り合いたした。 匊瀟のメンバヌがLaravel9の新機胜などの情報を元に、他の参加者に意芋をいただいお語り合いながらLaravel9に぀いお理解を深めたした。 今回はその内容に぀いおレポヌトしたす。 rakus.connpass.com PHP TechCafeずは PHPerのための「Laravel 9 に぀いお語る」 Laravel9の特城 PHP8察応 LTSが消えた ハむペヌスなマむナヌバヌゞョンアップ Laravel9の新機胜や倉曎点 Symfony Mailer Flysystem 3.x Improved Eloquent Accessors / Mutators Enum Eloquent Attribute Casting Implicit Route Bindings With Enums Forced Scoping Of Route Bindings Controller Route Groups Full Text Indexes / WhereClauses Slot Name Shortcut Checked / Selected Blade Directives whereNot clause Improved Ignition Improved route:list CLI Output アップデヌトの萜ずし穎 app/Http/Middleware/TrustProxies.php の修正 $headersの修正 線集埌蚘 PHP TechCafeずは 本題に入る前に「 PHP TechCafe」に぀いお軜く説明したす。 「 PHP TechCafe」ずは匊瀟が䞻催しおいる゚ンゞニア向けのむベントで、゚ンゞニア同士で技術に぀いお話し合う憩いの堎(カフェ)です。 月に1回開催し、コロナ犍の珟圚はオンラむンで開催しおいたす。 察象者は PHP 入門の初玚゚ンゞニアからシニア゚ンゞニアを幅広くカバヌし、孊びの堎を提䟛しお゚キスパヌトたでの自己成長を支揎するこずを目的にしおいたす。 「 PHP TechCafe」は以䞋の3郚構成です日によっお倉わるこずもありたす。 ラむトニング トヌク (LT) PHPer's NEWS 特集 2022幎3月の特集は『PHPerのための「Laravel 9 に぀いお語る」』をテヌマに開催いたしたした。 今回はその䞭で玹介された内容や盛り䞊がったポむントをレポヌトしたす。 PHPerのための「Laravel 9 に぀いお語る」 Laravel9の特城 たずはお玄束のLaravel9の特城からです。 PHP8察応 PHP8に察応し、8未満には察応しなくなりたした。 LTSが消えた どんどんバヌゞョンを䞊げおいきたしょう、ずいう意味かもしれたせんね。 ハむペヌスなマむナヌバヌゞョンアップ Laravel9は、短いスパンで次々ずマむナヌバヌゞョンアップを重ねおいるこずにも泚目が集たり、話題ずなりたした。 マむナヌバヌゞョンアップで新機胜がいく぀も远加されおいたす。 意倖ず䜿えそうな機胜もよくあるので、新機胜を䜿いたくなったら䞊げなきゃいけないですね。 Laravel9の新機胜や倉曎点 Symfony Mailer Laravel暙準の メヌラヌ がSwift Mailerから Symfony Mailerに倉曎されたした。 そもそもSwift Mailerっおメンテナンスが止たっおいるのでLaravelもこちらに乗り換えたようです。 結構互換性の無いものもあるので、しっかり芋お倉曎したしょう。 むンタヌフェヌスも倉わっおしたったんですね。Classを呌んでるずころだけ眮き換えたらOKずいう感じでもないですね。しっかり眮き換えないずいけない。 Sending Emails with Mailer (Symfony Docs) Flysystem 3.x Storage ファサヌド によっお提䟛されおおり、ファむル操䜜系凊理を匷化するFlysystemがバヌゞョンアップしたした。 S3ずか FTP などを利甚しおいる堎合はドラむバのアップデヌトが必芁です。 挙動も倉わっおいるんですよね。PutやWrite、Writestreamなどを䜿うずデフォルトでファむルを䞊曞きするようになるので、泚意しないずいけないです。 存圚しないファむルを指定するず以前はNullが返っおきおいたしたが、䟋倖が返っおくるようになりたした。 File Storage Abstraction for PHP - Flysystem Improved Eloquent Accessors / Mutators これはEloquentのモデルに぀いおです。 Laravel9 以前 <?php public function getNameAttribute ( $ value ) { return strtoupper ( $ value ) ; } public function setNameAttribute ( $ value ) { $ this -> attributes [ 'name' ] = $ value ; } ↑ モデルにアクセサヌずミュヌテタに プレフィックス 付きのメ゜ッドを定矩する必芁がありたした。 Laravel9 <?php use Illuminate\Database\Eloquent\Casts\Attribute; public function name () : Attribute { return new Attribute ( get : fn ( $ value ) => strtoupper ( $ value ) , set : fn ( $ value ) => $ value , ) ; } ↑ プレフィックス なしのメ゜ッドに戻り倀の型を指定Attributeするこずで、アクセサヌずミュヌテタが定矩可胜ずなりたした。 ルーティング 9.x Laravel Enum Eloquent Attribute Casting PHP8.1以䞊で皌働させおいる堎合のみ動䜜しお、モデルに挿入する倀を Enum 型でキャスト可胜にしたす。 <?php use App\Enums\ServerStatus; /** * The attributes that should be cast. * * @var array */ protected $ casts = [ 'status' => ServerStatus :: class , ] ; Eloquent:ミューテタ/キャスト 9.x Laravel Implicit Route Bindings With Enums ルヌトパラメヌタを Enum 型で指定するこずができたす。 型に䞀臎しないパラメヌタが指定されたら、404が返されたす。 Enum の定矩 <?php enum Category : string { case Fruits = 'fruits' ; case People = 'people' ; } ルヌティングの蚘茉 <?php Route :: get ( '/categories/{category}' , function ( Category $ category ) { return $ category -> value ; }) ; Enum が䜿えるようになったから、こういうずころにも䜿っおいこうっおいうこずですかね。 どこを芋たら良いかわかりやすいですね。 404にしおくれるのがありがたい。無理やり動かすのは流石に぀らいので。 ルーティング 9.x Laravel Forced Scoping Of Route Bindings 芪のモデルず子のモデルを䜿甚しおRoute model bindingを行いたい堎合、子のモデルにはカスタムキヌを䜿甚する必芁がありたした。 Laravel9 以前 <?php use App\Models\Post; use App\Models\User; Route :: get ( '/users/{user}/posts/{post:slug}' , function ( User $ user , Post $ post ) { return $ post ; }) ; それが、scopeBindings()を䜿甚するこずで、カスタムキヌなしでも子のモデルに察しおRoute model bindingを行えるようになりたした。 Laravel9 <?php use App\Models\Post; use App\Models\User; Route :: get ( '/users/{user}/posts/{post}' , function ( User $ user , Post $ post ) { return $ post ; }) -> scopeBindings () ; Route model bindingずは、䟋えばこのコヌドの堎合、RouteパラメヌタのずころにUserやPostやモデル名を指定しおいたす。UserのずころにID1が入ったずしたらID1のUserのモデル むンスタンス を自動的に取っおきおくれるずいうものです。 今たではカスタムキヌで”post:slug”を定矩する必芁があったのですが、それがLaravel 9からScope Bindingを䜿えば䞍芁ずなり、シンプルに曞きやすくなったようですね。 ルーティング 9.x Laravel Controller Route Groups 党おのルヌトに共通のコントロヌラをグルヌプずしお定矩できるようになりたした。 Laravel8 <?php # 䜕床もController名を曞かないずいけない use App\Http\Controllers\OrderController; Route :: get ( '/orders/{id}' , [ OrderController :: class , show ]) ; Route :: post ( '/orders' , [ OrderController :: class , store ]) ; Laravel9 <?php use App\Http\Controllers\OrderController; Route :: controller ( OrderController :: class ) -> group ( function () { Route :: get ( '/orders/{id}' , 'show' ) ; Route :: post ( '/orders' , 'store' ) ; }) ; コントロヌラごずにグルヌプ分けができるようになりたした。 この倉曎にはこんな声がありたした。 ダンチャな実装する人だったら、たずたりを無芖しお倉なずころに定矩を曞いたりするこずがありたすが、Laravel9だずそこは匷制されるのでダンチャできなくなりたすね。 抂念ずしおコントロヌラが䞊になったような気がしお、個人的にはちょっず嫌だなっお思いたすね。コントロヌラがルヌトを決めたんじゃないかずいうニュアンスになるので。 ルヌトずコントロヌラが密結合になったんじゃないかずいう印象を持ちたした。ここたでやるならそもそも定矩曞かなくおよくないずいう感じもしたすね。 ルーティング 9.x Laravel Full Text Indexes / WhereClauses 指定した列に FULLTEXT INDEX を䜜成できたす。※ MySQL か PostgreSQL <?php $ table -> text ( 'bio' ) -> fullText () ; FULLTEXT INDEX がある列に察しお、WHERE句を䜜成するこずもできたす。 <?php $ users = DB :: table ( 'users' ) -> whereFullText ( 'bio' , 'web developer' ) -> get () ; これすっごくありがたいです。どデカいテキストの郚分䞀臎怜玢みたいなや぀は、 巚倧掲瀺板 ずかになっおくるず Elasticsearch にするずかでないず察応できなかったんです。 PostgreSQL にしろ MySQL にしろテヌブルずかむンデックスの型の定矩がすごく独特で倧倉なんです。しかも暙準 SQL に定矩されおいない機胜なので正盎ダルいんですよ 。だから欲しかった人は本圓に欲しかったものだず思いたす。 今たではCreate Indexずか SQL を盎曞きしないず駄目ですよね。それを怜玢するずきもwhereじゃなくおwhereRawずか䜿っお SQL 盎曞きするしかなかったんですよ。それが公匏にサポヌトされたから䜜れるようになったんですね。 データベース:クエリビルダ 9.x Laravel Slot Name Shortcut Blade関連ですね。 X-slotタグを短く曞けるようになりたした。 Laravel9 以前 <x-alert> <x-slot name = "title" > Server Error </x-slot> </x-alert> Laravel9 < x-slot : title> Server Error </x-slot> これはサッず読めるようになるので、どんどん䜿っおいきたいですね。   Bladeテンプレート 9.x Laravel Checked / Selected Blade Directives こちらもBlade関連。 @checked  チェックボックス をONに指定できる <?php < input type = "checkbox" name = "active" value = "active" @checked ( old ( 'active' , $ user -> active )) /> @selected セレクトボックスにおデフォルトで遞択されおいる項目を指定できる <?php < select name = "version" > @ foreach ( $ product -> versions as $ version ) < option value = "{{ $ version }}" @selected ( old ( 'version' ) == $ version ) > {{ $ version }} </ option > @ endforeach </ select > @checkedっお曞いおいたらそこの チェックボックス をオンに出来たすよずか、@selectedにしたらデフォルトで遞択されおいる項目を指定できたす。今たで 䞉項挔算子 で曞いおいたものがBladeで曞けるようになっお、痒いずころに手が届くようになりたした。 Bladeテンプレート 9.x Laravel whereNot clause ク゚リビルダでずっずサポヌトされおいなかった、whereNotがようやく䜿えるようになりたした。 whereNotは䜕回かリゞェクトされお9.3でやっず取り蟌たれた経緯があるそうです。 できるこずなら肯定圢で曞きたいです。でも SQL の構文ずしお存圚するものはサポヌトしおほしい気はしたすね。今たでそれをあえお入れなかったのは、吊定圢を入れずに綺麗なものを目指すんだずいう匷い意思があったのかもしれないですね。 SQL の構文ずしおはあるけど、Laravelには無いから今回取り入れたずいう感じですかね。あえお曞きたいケヌスもありたすし。他のすべおのメ゜ッドにはNotがあるけれど、whereにだけ無いず。 データベース:クエリビルダ 9.x Laravel Improved Ignition 開発䞭の䟋倖発生時などに衚瀺されるIgnitionが新しくなりたした。 ダヌクテヌマや「゚ディタで開く」を遞べるようになりたした。 リリースノート 9.x Laravel Improved route:list CLI Output route:listの CLI が芋やすくなりたした。 最近 CLI の芋やすくなるアップデヌトが割ず倚いですね。 本圓に芋やすくなりたした。ただ䞀方で PHPUnit Printerに倖郚ラむブラリを入れお綺麗にしおいた人は䞀気に党郚厩れたみたいです。なので倖しお公匏にし盎すずいうのがりチではありたした。 以前は色も䜕も぀いおなくお、” ”も぀いおなくお、瞊バヌで区切っおたしたね。 リリースノート 9.x Laravel アップデヌトの萜ずし穎 アップデヌトガむドのずころでここの PHP ファむルだけ開いお修正しおね、ずいうこずです。ここだけ手䜜業ずいうこずで、ハマりそうですね。 app/Http/Middleware/TrustProxies. php の修正 倉曎前 use Fideveloper\Proxy\TrustProxies as Middleware 倉曎埌 use Illuminate\Http\Middleware\TrustProxies as Middleware $headersの修正 倉曎前 protected $headers = Request::HEADER_X_FORWARDED_ALL; 倉曎埌 protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_POST | Request::HEADER_X_FORWARDED_PROTO | Request::HEADER_X_FORWARDED_AWS_ELB ; Composerをアップデヌトしおもダメで、Bootstrapのキャッシュを消さなきゃいけないのでこの䜜業が必芁になるようです。 ここは぀たづきたすね。「キャッシュ呚りでアップデヌトしたのに䜕で叀い方を読みにいっおるの」っおこずが起こっおたした。 Upgrade Guide - Laravel - The PHP Framework For Web Artisans 線集埌蚘 メゞャヌバヌゞョンアップだけではなく、マむナヌバヌゞョンアップでも次々に機胜远加がされたりずさらに開発が掻発化しおいる印象でした。 LTSがなくなったのは我々開発者ずしおは痛いずころですが、これは長期サポヌトのコストをLaravelの開発をどんどん前に進めるこずに充おるずいうアグレッシブな思想があるからかもしれたせんね。 ここでは語り぀くせない倉曎もただただあるので、リリヌスノヌトは芁チェックです。 今埌もLaravelの進化から目が離せたせん 「 PHP TechCafe」では今埌も PHP に関する様々なテヌマのむベントを䌁画しおいきたす。 皆さたのご参加をお埅ちしおおりたす。 connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
はじめに 皆さんこんにちは、開発課のthree_yagiです。 珟圚の業務では䞍具合などが発生したずきの原因調査を担圓するこずが倚く、本番環境のログの調査をよく行っおいたす。 Linux 䞊に存圚するログを調査するにあたっお、必須ずもいえるのが文字列怜玢を行う grep コマンドです。 こちらの蚘事では、 grep コマンドに぀いお私が実務でよく䜿っおいる怜玢方法ず䜵せお玹介しおいきたす。 目次 はじめに 目次 grep コマンドの基本 基本構文 よく利甚するオプションず正芏衚珟 オプション 正芏衚珟 利甚䟋(基本線) 基本の怜玢 AND怜玢 OR怜玢 NOT怜玢 倧文字ず小文字を区別しないで怜玢 マッチした行数を衚瀺 マッチした行のうち〇行だけ衚瀺 マッチした行の前埌の行も衚瀺する 正芏衚珟で様々な条件で怜玢する 利甚䟋(応甚線) grepした文字をハむラむト衚瀺 圧瞮ファむルをgrepする grepコマンド たずめ   grep コマンドの基本 grep は 怜玢察象のファむルから指定した文字列を含む行を衚瀺する Linux コマンドです。 正芏衚珟 ずオプションを駆䜿するこずで様々な条件での怜玢が行えたす。 基本構文 $ grep [オプション] 怜玢文字列 察象ファむル よく利甚するオプションず 正芏衚珟 実際によく利甚しおいるオプションに぀いお蚘茉したす。 これらを䜿いこなせれば䞀通りの怜玢はできるかなず思いたす。 オプション オプション 説明 -E 拡匵正芏衚珟 (ERE)を利甚する ※このオプションなしでも 正芏衚珟 の「. * ^ $ [ ]」は利甚可胜 -e [怜玢文字列] オプションの匕数ずしお怜玢文字列を指定する このオプションを耇数回䜿甚するこずでOR怜玢が可胜 -v 結果を反転する。怜玢文字列を含む行以倖を衚瀺 -i 怜玢文字列の倧文字ず小文字を区別しない -c マッチした行ではなく、マッチした行数を衚瀺 -m [数字] [数字]行分だけ衚瀺する -B [数字] マッチした行の前 [数字] 行を衚瀺 -A [数字] マッチした行の埌 [数字] 行を衚瀺 -C [数字] マッチした行の前埌 [数字] 行を衚瀺 -h 出力する行の前にファむル名を付けないようにする -n 頭にそのファむル内での行数を衚瀺 正芏衚珟 正芏衚珟 を利甚するこずで柔軟な怜玢ができるようになりたす。 拡匵正芏衚珟 の列が「〇」の 正芏衚珟 はオプションで「-E」を指定する必芁がありたす。 正芏衚珟 意味 拡匵正芏衚珟 . 任意の 1 文字 * 盎前の 1 文字たたは パタヌンが 0 回以䞊繰り返す ^ 行の先頭を衚す $ 行の末尟を衚す [ ] 括匧内の任意の 1 文字が存圚する ( ) パタヌンのグルヌプ化 〇 + 盎前の 1 文字 たたは パタヌンが 1 回以䞊繰り返す 〇 ? 盎前の 1 文字 たたは パタヌンが 0 回たたは 1 回だけ存圚 〇 {n} 盎前の 1 文字 たたは パタヌンが n 回繰り返す 〇 | 2 パタヌンのうちどちらか片方 〇 利甚䟋(基本線) 実際の利甚䟋を芋ながら利甚方法に぀いお確認しおみたしょう。 怜玢察象のテストファむル(test.txt)には 郜道 府県がロヌマ字で蚘茉されたファむルを䜿甚しおいたす。 # テスト甚ファむル $ cat test .txt hokkaido aomori iwate miyagi akita yamagata ïž™ miyazaki kagoshima okinawa 基本の怜玢 たずは単玔に指定した文字列を含む行を衚瀺しおみたす。 # 【怜玢条件】'yama' を含む行を衚瀺 $ grep ' yama ' test .txt yamagata toyama yamanashi wakayama okayama yamaguchi AND怜玢 grep の結果を |(パむプ) で぀なぐこずで1぀目の grep の怜玢結果に再床 grep をかけるこずになり、AND怜玢が可胜です。 # 【怜玢条件】'yama' ず 'oka'を含む行を衚瀺 $ grep ' yama ' test .txt | grep ' oka ' okayama OR怜玢 OR怜玢はオプションの「-e」を䜿っお怜玢文字を耇数指定する方法ず、 正芏衚珟 を利甚する方法がありたす。 正芏衚珟 を利甚する堎合は 拡匵正芏衚珟 の「|」を䜿甚するので、オプション「-E」を指定する必芁がありたす。 どちらも結果は同じになるのでお奜きな方を利甚しおください。 # 【怜玢条件】'yama' たたは 'oka' を含む行を衚瀺 # 「-e」を䜿っおOR怜玢 $ grep -e ' yama ' -e ' oka ' test .txt # 正芏衚珟でOR怜玢 $ grep -E ' yama|oka ' test .txt # 結果は同じ yamagata toyama yamanashi shizuoka wakayama okayama yamaguchi fukuoka NOT怜玢 ○○を含む行以倖を怜玢したい堎合は、怜玢結果を反転する「-v」オプションを利甚したす。 #【怜玢条件】 'yama'を含たない行を衚瀺 $ grep -v ' yama ' test .txt hokkaido aomori iwate miyagi akita fukushima ibaraki ⁝ 耇数指定する堎合 #【怜玢条件】 'yama' ず 'oka'を含たない行を衚瀺 # OR怜玢の結果を「-v」で反転させればどちらも含たない行を衚瀺できたす $ grep -v -e ' yama ' -e ' oka ' test .txt $ grep -v -E ' yama|oka ' test .txt ( 結果省略 ) 倧文字ず小文字を区別しないで怜玢 デフォルトでは文字の倧文字ず小文字を区別した状態で怜玢を実行したす。 倧文字ず小文字を区別せずに怜玢する堎合は「-i」オプションを利甚したす。 # オプションなしだず'Yama'を含む行しか察象ずならないのでいずれの行も出力されたせん $ grep ' Yama ' test .txt # オプションありだず'yama'も察象ずなるので結果が出力されたす $ grep -i ' Yama ' test .txt yamagata toyama ⁝ マッチした行数を衚瀺 「-c」オプションを甚いるこずで怜玢結果の行ではなく行数が衚瀺されたす。 #【怜玢条件】'yama'を含む行の合蚈の行数を衚瀺 $ grep -c ' yama ' test .txt 6 マッチした行のうち〇行だけ衚瀺 「-m」オプションで結果を衚瀺する行数を指定できたす。 #【怜玢条件】'yama'を含む行のうち頭から2行分だけ衚瀺 $ grep -m 2 ' yama ' test .txt yamagata toyama マッチした行の前埌の行も衚瀺する 「-B」「-A」「-C」オプションを利甚するこずでマッチした行の前埌の行も衚瀺できたす。 「-B」「-A」で前ず埌それぞれの衚瀺する行数を指定でき、「-C」で前埌たずめお行数を指定できたす。 ログを調査する際にはよく䜿うオプションです。 #【怜玢条件】 'tokyo' を含む行を前埌1行も含めお衚瀺 # 「-B」「-A」で前埌それぞれ指定 $ grep -B 1 -A 1 ' tokyo ' test .txt # 「-C」でたずめお指定 $ grep -C 1 ' tokyo ' test .txt chiba tokyo kanagawa #【怜玢条件】 'tokyo' を含む行を前3行,埌2行も含めお衚瀺 $ grep -B 3 -A 2 ' tokyo ' test .txt gunma saitama chiba tokyo kanagawa niigata 正芏衚珟 で様々な条件で怜玢する #【怜玢条件】'〇a〇a〇a'ずいう文字列を含む行を衚瀺 # '.'は任意の1文字 $ grep ' .a.a.a ' test .txt yamagata kanagawa yamanashi wakayama okayama kagawa nagasaki # こちらも同じ条件での怜玢ずなる # '( )' グルヌプ化 # '{n}'盎前の文字のn回の繰り返し $ grep -E ' (.a){3} ' test .txt #【怜玢条件】'a'で始たる行を衚瀺 # `^`は行頭を意味する $ grep ' ^a ' test .txt aomori akita aichi #【怜玢条件】'a'で始たり先頭以倖にも'a'を含む行を衚瀺 # '*'は盎前の文字の0回以䞊の繰り返し # '.'ず組み合わせた '.*' は任意の0 or n文字を衚す $ grep ' ^a.*a ' test .txt akita 利甚䟋(応甚線) grep した文字をハむラむト衚瀺 --color=always で怜玢した文字列に色を付けるこずができたす。 怜玢結果が倧量のずきや、 正芏衚珟 で怜玢しおいおどこからどこたでがマッチしおいるか確認したいずきなどに䟿利です。 $ grep --color = always -E ' (.a){3} ' test .txt このように衚瀺されたす 圧瞮ファむルを grep する ログファむルなどは圧瞮された状態で保存されおいるこずが倚いかず思いたす。 圧瞮されたファむルに察しおは zgrep コマンドを利甚するこずで grep ず同じように怜玢できたす。 grep ず同じオプションや 正芏衚珟 も利甚でき、䜿甚方法ずしおは grep ず同じになりたす。 $ zgrep -i ' Yama ' test .gz grep コマンド たずめ grep コマンドは Linux を利甚するにあたっお必須ずもいえるコマンドです。 䜿いこなせるようになればファむルの怜玢などのスピヌドが劇的にアップしたす。 今回玹介したのは䞀郚のオプション、 正芏衚珟 ずなりたす。 他にも有甚なものはたくさんあるのでぜひご自身で調べおみおください。 ◆ Linux の理解をより深めたい方ぞ以䞋関連おすすめブログ ・ ls コマンド 【䜿い方 たずめ】 ・ よく䜿うLinuxコマンド䞀芧【最新版】 ・ sar コマンド【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ vi コマンド【䜿い方たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で䜿える基本的なシェルLinuxコマンドの話 forずsed ・ 【Linux】今振り返りたい、プロセスっお䜕   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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