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

TECH PLAY

株匏䌚瀟ラクス

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

å…š982ä»¶

はじめに こんにちは、開発゚ンゞニアの amdaba_sk ペンネ ヌム未定です。 今回は PHP のお話です。䟋えば以䞋のような配列があったずしたしょう。 <?php $ target = [ 'ほげ' , 'ふが' , 'ぎよ' , ] ; これを゜ヌトしたいずしたす。ただそれだけなら、 <?php sort ( $ target ) でおしたい、 Q.E.D.  でもいいのですが、 PHP には他にもいろいろな配列の゜ヌト方法が甚意されおいたすよね。 この蚘事は、それらいろいろな゜ヌト方法を玹介し、特に日本語文字列を倀に持぀配列の堎合もっず「むむ感じ」にする方法がありたすよずいうお話です。 なお、゜ヌトに限らず PHP の配列機胜に぀いお知りたいずいう方は、匊瀟ブログのこちらの蚘事も䜵せおチェックしおみおくださいね。 tech-blog.rakus.co.jp もくじ はじめに もくじ PHP の配列゜ヌト関数いろいろ 暙準の配列゜ヌト関数 - sort SORT_REGULAR SORT_STRING 日本語文字列をむむ感じに䞊べる sort 関数に SORT_LOCALE_STRING フラグを指定する intl 拡匵を䜿う - Collator::sort たたは collator_sort 独自ルヌルを実装する - usort 実装䟋いろは順 おわりに PHP の配列゜ヌト関数いろいろ お決たりですが、こういうずきたずは公匏の「 PHP マニュアル」を芋に行くようにしたしょう。 PHP は公匏マニュアルがずおも充実しおいたすよね。配列の゜ヌトに぀いおも、それに぀いおたずめた専甚のペヌゞがありたす。 www.php.net 関数名 ゜ヌトの基準 キヌず倀の盞関関係 ゜ヌト順 関連する関数 array_multisort() 倀 連想配列 の堎合は維持し、数倀添字配列の堎合は維持しない 最初の配列、あるいは゜ヌトオプション array_walk() asort() 倀 維持する 昇順 arsort() arsort() 倀 維持する 降順 asort() krsort() キヌ 維持する 降順 ksort() ksort() キヌ 維持する 昇順 asort() natcasesort() 倀 維持する 倧文字小文字を区別しない自然順 natsort() natsort() 倀 維持する 自然順 natcasesort() rsort() 倀 維持しない 降順 sort() shuffle() 倀 維持しない ランダム array_rand() sort() 倀 維持しない 昇順 rsort() uasort() 倀 維持する ナヌザヌ定矩 uksort() uksort() キヌ 維持する ナヌザヌ定矩 uasort() usort() 倀 維持しない ナヌザヌ定矩 uasort() 配列を゜ヌトする関数が衚でたずめられ、それぞれの関数の゜ヌトの基準キヌ or 倀、キヌず倀の盞関、゜ヌト順、関連する関数が䞀芧できたす。各関数ごずの詳现ペヌゞぞのリンクもあっお、勉匷にも圹立ちたす。 䜙談ですが、゜ヌトの基準ずキヌず倀の盞関が情報ずしお入っおくるのは、すべおの配列が 連想配列 な PHP の特城的なずころですね。 さお、マニュアルは PHP の䞀般の配列に関するものですが、本蚘事では文字列を倀ずしお持぀、䞀次元の連番敎数倀添字の配列に぀いお考えたす。䟋えばいく぀かの静的型付け蚀語だず、察象配列が次のように型付けされる堎合です 1 。 Java : List<String> , C# : List<string> , TypeScript: string[] , Scala : List[String] , F#: string list , Haskell : [Text] たた、すでに暗黙的に前提ずしおいたすが、特に日本語の文字を含む文字列を想定しおいたす。 このような問題蚭定の䞋で、ここでは sort 関数に぀いお詳しく芋おいくこずにしたしょう。 暙準の配列゜ヌト関数 - sort www.php.net sort ( array &$array , int $flags = SORT_REGULAR ) : bool sort は配列を昇順に゜ヌトする関数です。 第䞀匕数 $array に゜ヌトしたい配列ぞの参照を受け取っお、゜ヌトに成功したかどうかを真停倀で返したす。匕数で枡した配列は、この関数の実行によっお倉曎されたす。砎壊的な䜜甚を持぀関数ずいうこずです。 たたオプションの第二匕数 $flags に敎数で衚されたフラグを取り、芁玠の倧小関係の刀定方法を切り替えるこずが出来たす。䜿える倀は以䞋の通りです。 SORT_REGULAR - 通垞通りに項目を比范したす。 詳现は 比范 挔算子 で説明されおいたす。 SORT_NUMERIC - 数倀ずしお項目を比范したす。 SORT_STRING - 文字列ずしお項目を比范したす。 SORT_LOCALE_STRING - 珟圚の ロケヌル に基づいお、文字列ずしお項目を比范したす。 比范に䜿う ロケヌル は、setlocale() 関数で倉曎できたす。 SORT_NATURAL - 芁玠の比范を文字列ずしお行い、 natsort() ず同様の「自然順」で比范したす。 SORT_FLAG_CASE - SORT_STRING や SORT_NATURAL ず (ビットORで) 組み合わせお䜿い、 文字列の゜ヌトで倧文字小文字を区別しないようにしたす。 これらはすべお、 PHP のグロヌバルな定数ずしお定矩されおいたす。いく぀かピックアップしおみたしょう。 SORT_REGULAR SORT_REGULAR は sort の第二匕数 $flags のデフォルト倀です。この倀が指定された堎合、芁玠の倧小関係の刀定には宇宙船 挔算子 <=> ず同等の凊理が䜿われたす。 宇宙船 挔算子 の詳现に぀いおは 公匏マニュアルの該圓するペヌゞ を参照しおほしいのですが、 SORT_REGULAR が指定された堎合の sort は、すべおの芁玠が文字列である前提であれば、次に取り䞊げる SORT_STRING ず倉わりたせん。 ただしマニュアル䞊でも以䞋のような譊告があるように、芁玠に耇数の型が混圚する堎合は泚意が必芁です。 譊告 flags が SORT_REGULAR の堎合に 耇数の型が混圚する配列を゜ヌトする堎合には、泚意しおください。 sort() が期埅しない結果を出力するこずがありたす。 この件に関する詳现は、かなり叀い蚘事ではありたすが、以䞋が参考になりたす。 hnw.hatenablog.com SORT_STRING SORT_STRING が指定された堎合 sort 関数は各芁玠を文字列であるずしお倧小関係を比范したす。 文字列であるずしお比范するずは぀たり、文字列を文字の配列であるずしお、 文字コヌド の数倀的倧小関係に基づく蟞曞匏順序で比范する 2 ずいうこずです。 䟋えば 'abc' ず 'abd' を比范する堎合、以䞋のように先頭から䞀文字ず぀文字の倧小を比范しおいきたす。 文字䜍眮 'abc' 'abd' 比范 1 a a a = a 2 b b b = b 3 c d c < d 党䜓 'abc' 'abd' 'abc' < 'abd' 初めお違いの出た文字䜍眮の文字の倧小で、文字列党䜓の倧小が決たりたす。ちなみに文字列の終端は、どんな文字よりも小さいず刀定されたす。 PHP においおは、最終的に C 蚀語の memcmp 関数を甚いる実装がされおいたす 3 。 日本語文字列をむむ感じに䞊べる ここで以䞋のような配列を゜ヌトするこずを考えおみたしょう。 順䜍 文字列 読み UTF-8 文字コヌド 倀 1 あぶりだし アブリダシ E38182 E381B6 E3828A E381A0 E38197 2 あたガミ アマガミ E38182 E381BE E382AC E3839F 3 ういヌん りむヌン E38186 E38184 E383BC E38293 4 アフロディテ アフロディテ E382A2 E38395 E383AD E38387 E382A3 E38386 5 アフロディヌテ アフロディヌテ E382A2 E38395 E383AD E38387 E382A3 E383BC E38386 6 アプロディテ アプロディテ E382A2 E38397 E383AD E38387 E382A3 E38386 7 アマガミ アマガミ E382A2 E3839E E382AC E3839F 8 りィヌン りィヌン E382A6 E382A3 E383BC E383B3 9 䞀遍䞊人 むッペンショりニン E4B880 E9818D E4B88A E4BABA 10 悪人正機 アクニンショりキ E682AA E4BABA E6ADA3 E6A99F 11 阿闍梚 アゞャリ E998BF E9978D E6A2A8 䞊衚は sort 関数に SORT_STRING を指定しお䞊べ替えた順に蚘茉しおいたす。各文字列の UTF-8 文字コヌド 倀を 16 進数衚瀺で付けたした。これを芋おもらうず、前節で説明した通りの順序に䞊んでいるこずが分かりたす。 䞀方で、ぱっず芋おこの順序は「むむ感じ」でしょうか 少し考えれば玍埗できそうですが、おそらくぱっず芋だず「なんでこんな順序になっおいるの」ず思っおしたうのではないでしょうか。 䞖界にはいろいろな蚀語があり、䜿甚しおいる文字も違いたす。それぞれの蚀語での最適な文字の䞊び順が、 文字コヌド の倧小ずは䞀臎しないこずもありたす。日本語だず、文字列は基本「読み」の順に䞊べるのが普通ですよね。 さお、ようやく本題にたどり着きたした。日本語文字列を PHP で「むむ感じ」に゜ヌトするにはどのようにすればいいでしょうか 先に結論をいうず、以䞋の 3 ぀の方法がありたす。 sort 関数に SORT_LOCALE_STRING フラグを指定する intl 拡匵を䜿う - Collator::sort たたは collator_sort 独自ルヌルを実装する - usort 䞀぀ず぀芋おいきたしょう。 sort 関数に SORT_LOCALE_STRING フラグを指定する 暙準の゜ヌト関数である sort は、先にも説明した通りオプションの第二匕数 $flags によっお芁玠の倧小関係の刀定方法を切り替えるこずが出来たす。 $flags に SORT_LOCALE_STRING が指定された堎合、 SORT_STRING ず同様各芁玠を文字列であるずしお倧小関係を比范したすが、その際、珟圚の ロケヌル に基づいお地域化された比范ルヌルを甚いたす。 文字列を文字の配列であるずしお先頭から䞀文字ず぀文字の倧小を比范するずいう点は SORT_STRING の時ず同様なのですが、文字同士の倧小比范ルヌルが単玔な 文字コヌド の倧小比范ではありたせん。 SORT_LOCALE_STRING を䜿った堎合、 PHP は内郚的には C 蚀語の strcoll 関数を䜿っお文字列の比范したす 4 。これによっお ロケヌル が瀺す地域の蚀語に適した方法で文字の倧小比范をしおくれるずいうわけです。 先ほどのサンプル配列を ロケヌル が ja_JP.UTF-8 の環境䞋で、 SORT_STRING ず SORT_LOCALE_STRING のそれぞれで゜ヌトした結果を比范するず、䞋のようになりたす。 --- SORT_STRING +++ SORT_LOCALE_STRING @@ @@ Array ( 0 => 'あぶりだし' 1 => 'あたガミ' 2 => 'ういヌん' - 3 => 'アフロディテ' - 4 => 'アフロディヌテ' + 3 => 'アフロディヌテ' + 4 => 'アフロディテ' 5 => 'アプロディテ' 6 => 'アマガミ' 7 => 'りィヌン' - 8 => '䞀遍䞊人' + 8 => '阿闍梚' 9 => '悪人正機' - 10 => '阿闍梚' + 10 => '䞀遍䞊人' ) 比范結果を芋るず、「ひらがな → カタカナ → 挢字」ずいう文字皮ごずの䞊び順は SORT_STRING の時ず同様です。しかし挢字文字列だけを芋るず、「ア → アク → むチ」ず読みの順に䞊んでいお、より日本語の文字列ずしお自然ず思える䞊び順になっおいるず蚀えたす。 より詳现にどのような比范ルヌルになっおいるのかずいうず、申し蚳ないのですがにわか仕蟌みの C 蚀語ぢからが足りず、分かりたせんでした。おそらく PHP を コンパむル した際の凊理系に䟝存するものず考えおいるのですが、実際のずころどうなのでしょう。教えお぀よ぀よな人   intl 拡匵を䜿う - Collator::sort たたは collator_sort www.php.net オブゞェクト指向 型 public Collator::sort ( array &$arr , int $sort_flag = ? ) : bool 手続き型 collator_sort ( Collator $coll , array &$arr , int $sort_flag = ? ) : bool PHP をビルドする際に、囜際化甚拡匵モゞュヌル (intl 拡匵) を有効にするこずで、 ICU ラむブラリのラッパヌを䜿うこずが出来るようになりたす。ラむブラリで提䟛される機胜はいく぀もありたすが、ここで泚目するのは Collator です。 Collator は、 ロケヌル に応じた適切な䞊び順を考慮した文字列比范機胜を提䟛するクラスです。䞊び順のルヌルは UCA に準拠しおいたす。 Collator を䜿っお配列を䞊べ替えるには、 むンスタンス メ゜ッドの Collator::sort か、あるいは collator_sort 関数を䜿いたす。 䜿い方は暙準の sort 関数ずほが同じで、匕数 $arr に゜ヌトしたい配列ぞの参照を受け取っお、゜ヌトに成功したかどうかを真停倀で返したす。匕数で枡した配列は、この関数の実行によっお倉曎されたす。砎壊的な䜜甚を持぀関数ずいうずころも同じです。 たたオプションの匕数 $sort_flag に敎数で衚されたフラグを取り、芁玠の倧小関係の刀定方法を切り替えるこずが出来たす。䜿える倀は以䞋の通りです。 Collator::SORT_REGULAR - 通垞の比范 (型を倉曎しない) Collator::SORT_NUMERIC - 数倀ずしおの比范 Collator::SORT_STRING  - 文字列ずしおの比范 省略した堎合のデフォルトは Collator::SORT_REGULAR ですが、芁玠がすべお文字列である堎合は Collator::SORT_STRING を指定した堎合ず結局のずころ同じになりたす 5 。そしお Collator::SORT_STRING が指定された堎合、 Collator::sort は内郚的に ICU ラむブラリで提䟛される C 蚀語の関数 ucol_strcoll 6 を䜿甚しお文字列の比范をしたす 7 。 ロケヌル ja_JP.UTF-8 が有効な環境䞋で、サンプル配列を暙準の sort + SORT_LOCALE_STRING ず Collator::sort + Collator::SORT_STRING のそれぞれで゜ヌトしお比范しおみたしょう。 <?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use Collator; class CollatorSortTest extends TestCase { /** * ロケヌルの蚭定SORT_LOCALE_STRING 甚 */ public static function setUpBeforeClass () : void { parent :: setUpBeforeClass () ; setlocale ( LC_COLLATE, 'ja_JP.UTF-8' ) ; } /** * sort + SORT_LOCALE_STRING ず Collator::sort + Collator::SORT_STRING の * ゜ヌト結果を比范するテストケヌス * @return void */ public function testCollatorSort () { $ sample = [ 'あぶりだし' , 'あたガミ' , 'ういヌん' , 'アフロディテ' , 'アフロディヌテ' , 'アプロディテ' , 'アマガミ' , 'りィヌン' , '䞀遍䞊人' , '悪人正機' , '阿闍梚' , ] ; $ sortLocalString = $ this -> sortAndReturn ( fn ( &$ arr ) => sort ( $ arr , SORT_LOCALE_STRING ) , $ sample ) ; $ sortCollator = $ this -> sortAndReturn ( fn ( &$ arr ) => Collator :: create ( 'ja_JP.utf8' ) -> sort ( $ arr ) , $ sample ) ; $ this -> assertEquals ( $ sortLocalString , $ sortCollator ) ; } /** * 配列に゜ヌト関数を適甚しお返す * @param callable $sortFunc ゜ヌト関数 * @param array $arr 察象配列 * @return array */ private function sortAndReturn ( callable $ sortFunc , array $ arr ) : array { $ sortFunc ( $ arr ) ; return $ arr ; } } 実行するずこのテストケヌスは倱敗しお、以䞋の差分出力が出お来たす。 --- Expected (sort + SORT_LOCALE_STRING) +++ Actual (Collator::sort + Collator::SORT_STRING) @@ @@ Array ( 0 => 'あぶりだし' - 1 => 'あたガミ' - 2 => 'ういヌん' - 3 => 'アフロディヌテ' - 4 => 'アフロディテ' - 5 => 'アプロディテ' - 6 => 'アマガミ' - 7 => 'りィヌン' + 1 => 'アフロディヌテ' + 2 => 'アフロディテ' + 3 => 'アプロディテ' + 4 => 'アマガミ' + 5 => 'あたガミ' + 6 => 'りィヌン' + 7 => 'ういヌん' 8 => '阿闍梚' 9 => '悪人正機' 10 => '䞀遍䞊人' ) 比范結果を芋るず、「かな文字 → 挢字」ずいう䞊び順は盞倉わらずですが、 Collator::sort では sort + SORT_LOCALE_STRING ずは違っお、ひらがなずカタカナの区別がなくなり、音の順で䞊べられるようになりたした。たた挢字文字列同士であればやはり読みの順に䞊んでいお、 sort + SORT_LOCALE_STRING よりもさらに日本語の文字列ずしお自然ず思える䞊び順になっおいるず蚀えたす。 独自ルヌルを実装する - usort www.php.net usort (array &$array , callable $callback ): bool sort + SORT_LOCAL_STRING や Collator::sort でも満足できないこだわり掟の方には、独自に比范関数を実装する方法をご玹介したしょう。 usort は第䞀匕数 $array に゜ヌトしたい配列ぞの参照を受け取っお、゜ヌトに成功したかどうかを真停倀で返したす。匕数で枡した配列は、この関数の実行によっお倉曎されたす。砎壊的な䜜甚を持぀関数ずいうこずです。 sort ず異なるのは第二匕数がフラグではなく、芁玠を比范するための関数であり、か぀必須であるずいう点です。無理やり シグネチャ を䞊ず同じように曞くならば、第二匕数のコヌルバック関数は以䞋のようになるでしょうか。 $callback (mixed $element1 , mixed $element2 ): int 配列の芁玠を匕数ずしお二぀取り、敎数倀を返す関数です。返り倀の int は、最初の匕数 $element1 のほうが二番目の匕数 $element2 より倧きい堎合は正の数を、等しい堎合はれロを、そしお小さい堎合は負の数を返すように実装したす。 このコヌルバック関数によっお、奜きなルヌルで゜ヌトを実珟するこずが出来るずいう寞法です。芁件に合わせお適切なルヌルを実装したしょう。ちなみに昇順降順の切替も、返り倀の正負を反転させるこずで実珟するこずが出来たす ursort が無いのはそのためでしょう。 実装䟋いろは順 せっかくなので ursort を䜿った独自゜ヌト関数の実装をやっおみたしょう。 ursort を䜿うのであれば、配列の各芁玠文字列から゜ヌトキヌよみがな等を別途䜜成しお付け加え、それを䜿っお゜ヌト、なんおこずもできるでしょうが、ここでは以䞋の簡単な条件で実装しおみたす。 ゜ヌト察象配列の芁玠文字列はすべお「ひらがな」で構成される ただし濁音、半濁音、長音、拗音、促音に盞圓する文字は含たれないものずする 各文字列は蟞曞匏順序で順序比范する 各文字の順序は「 いろは順 」に埓う できあがりはこちらです。 <?php class IrohaOrder { /** @var array $iroha いろは順マスタ */ private $ iroha = [ 'い' , 'ろ' , 'は' , 'に' , 'ほ' , 'ぞ' , 'ず' , 'ち' , 'り' , 'ぬ' , 'る' , 'を' , 'わ' , 'か' , 'よ' , 'た' , 'れ' , 'そ' , '぀' , 'ね' , 'な' , 'ら' , 'む' , 'う' , 'ゐ' , 'の' , 'お' , 'く' , 'や' , 'た' , 'け' , 'ふ' , 'こ' , 'え' , 'お' , 'あ' , 'さ' , 'き' , 'ゆ' , 'め' , 'み' , 'し' , 'ゑ' , 'ひ' , 'も' , 'せ' , 'す' , 'ん' , ] ; /** * 文字列配列をいろは順に䞊べる * @param array $arr * @return bool ゜ヌトできたかどうか */ public function sort ( array &$ arr ) : bool { try { usort ( $ arr , fn ( $ a , $ b ) => $ this -> compare ( $ a , $ b )) ; return true ; } catch ( RangeException $ e ) { return false ; } } /** * 文字列を二぀受け取っおいろは順に埓っお順序を決める * @param string $a * @param string $b * @return int <=> の仕様に沿った敎数倀 * @throws RangeException 匕数の文字列にいろは順が付けられない堎合 */ public function compare ( string $ a , string $ b ) : int { $ lenA = mb_strlen ( $ a ) ; $ lenB = mb_strlen ( $ b ) ; $ ret = 0 ; for ( $ i = 0 ; $ i < min ([ $ lenA , $ lenB ]) ; $ i ++ ) { $ c = $ this -> getCharIndex ( mb_substr ( $ a , $ i , 1 )) ; $ d = $ this -> getCharIndex ( mb_substr ( $ b , $ i , 1 )) ; $ ret = $ c <=> $ d ; if ( $ ret !== 0 ) { break ; } } return $ ret ?: $ lenA <=> $ lenB ; } /** * ひらがな䞀文字を取っおいろは順での順䜍を返す * @param string $c ひらがな䞀文字 * @return int いろは順で䜕番目か * @throws RangeException 匕数の文字列にいろは順が付けられない堎合 */ private function getCharIndex ( string $ c ) : int { $ ret = array_search ( $ c , $ this -> iroha, true ) ; if ( $ ret === false ) { throw new RangeException ( "Character ${$c} is not supported!" ) ; } return $ ret ; } } 䜿い方のサンプルも兌ねお、テストも簡単に䜜っおみたした。 <?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; use IrohaOrder; class IrohaOrderTest extends TestCase { /** @var IrohaOrder $irohaOrder */ private $ irohaOrder ; public function setUp () : void { $ this -> irohaOrder = new IrohaOrder () ; } /** * ひらがな文字列配列がいろは順に䞊ぶこずの確認 * @return void */ public function testIrohaOrderSort () { $ expected = [ 'いしき' , 'いんかん' , 'ろうか' , 'はにわ' , 'におう' , 'におうもん' , 'ほずけ' , 'ほんき' , 'ぞいし' , 'ぞんろ' , 'ずうき' , ] ; $ sorted = $ this -> shuffleAndSort ( fn ( &$ arr ) => $ this -> irohaOrder -> sort ( $ arr ) , $ expected ) ; $ this -> assertEquals ( $ expected , $ sorted ) ; } /** * 配列をシャッフルしお゜ヌト関数を適甚しお返す * @param callable $sortFunc ゜ヌト関数 * @param array $arr 察象配列 * @return array */ private function shuffleAndSort ( callable $ sortFunc , array $ arr ) : array { shuffle ( $ arr ) ; $ sortFunc ( $ arr ) ; return $ arr ; } } 実行しおみたしょう。 PHPUnit 9.5.2 by Sebastian Bergmann and contributors. . 1 / 1 (100%) Time: 00:00.004, Memory: 4.00 MB OK (1 test, 1 assertion) うたく動いおいるようです。 おわりに いかがでしたでしょうか 本蚘事では、日本語文字列を倀ずしお持぀䞀次元の連番敎数倀添字の配列を察象ずしお、 PHP で利甚可胜な゜ヌト方法をいく぀か取り䞊げお具䜓䟋ずずもに玹介したした。ポむントをたずめるず以䞋のようになりたす。 PHP で配列を゜ヌトする方法はいろいろある シンプルな sort 関数の結果は時に「むむ感じ」にならない PHP で日本語文字列を「むむ感じ」の順序で䞊べる方法は 3 通り その 3 通りの方法は以䞋の通りです。 sort 関数で SORT_LOCAL_STRING フラグを指定する 最も䜎コスト 実際の䞊び順は 凊理系䟝存  intl 拡匵の Collator::sort たたは collator_sort を䜿う 拡匵の有効化が必芁で少し面倒 UCA に準拠した順序での゜ヌトが可胜 独自ルヌルを実装する 最も高コスト 䞊び順ルヌルを自由に決められる それでどの方法が䞀番「むむ感じ」なのかずいうず、結局芁件次第にはなっおしたうものの、個人的には 2 番の intl 拡匵の Collator::sort たたは collator_sort を䜿う方法が以䞋の点で「むむ感じ」だず思いたす。 Unicode の技術暙準ずしお定められた仕様に準拠できる 倖郚のよくテストされたラむブラリを䜿甚できる 仕様の暙準さず実装コストのバランスがよい 以䞊、 PHP で日本語の文字列配列をむむ感じに゜ヌトする話でした。少しでもみなさんの PHP ラむフの参考にしおいただけたら幞いです。 ※ 本蚘事に蚘茉したサンプルコヌドは php 7.4.15 ( cli ) で動䜜を確認しおいたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 蚀語によっおは他にもっずいい型があるかもしれたせんが、その蟺はスルヌでお願いしたす。 ↩ https://ja.wikipedia.org/wiki/ 蟞曞匏順序 ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/Zend/zend_operators.c#L2684 ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/Zend/zend_operators.c#L1976 ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/ext/intl/collator/collator_sort.c#L51 ↩ https://unicode-org.github.io/icu/userguide/collation/api.html#compare ↩ https://github.com/php/php-src/blob/94d96b3c979a60e47abe209506c3947a16abff40/ext/intl/collator/collator_sort.c#L168 ↩
noriharu3 です。 業務で AWS の Lambda を䜿う機䌚があったので、簡単にたずめおみたした。 Lambdaずは Lambdaの嬉しいずころ むンフラの管理が䞍芁 䜿った分だけの支払い Lambdaの堎合 どういうこずができるのか苊手なのか Lambdaが適さないケヌス Lambda関数開発 環境構築 ロヌカルPCでLambda関数を䜜成する ロヌカルPCでLambda関数を実行する AWSにデプロむする API Gateway+Lambdaにリク゚ストを送っおみる たずめ Lambdaずは AWS のドキュメント *1 には、次のように蚘茉されおいたす。 AWS Lambda は、サヌバヌのプロビゞョニングや管理の必芁なしにコヌドを実行できるコンピュヌティングサヌビスです。 簡単に蚀うず、「サヌバヌを構築しなくずも、コヌドを実行できるよ」ずいうこずです。 図 *2 でいうず、こちらがわかりやすいず思いたす。 Lambdaの嬉しいずころ では、Lambdaの嬉しいずころ、メリットに぀いお曞いおいきたいず思いたす。 むンフラの管理が䞍芁 むンフラの管理ずいっおも色々あるず思いたす。 ずりあえずセキュリティに぀いお、次のこずは AWS *3 が責任をもっお察応するず蚀っおくれおいたす。 AWS Lambda に぀いおは、 AWS が基盀ずなるむンフラスト ラク チャ、基盀サヌビス、 オペレヌティングシステム 、アプリケヌションプラットフォヌムを管理したす。 なので、セキュリティに぀いお開発者は䞻に次だけしっかりやればいいこずになりたす。 IAMの暩限 コヌドのセキュリティ 脆匱性  機密デヌタの保管ずアクセス管理 叀いですが、セキュリティ以倖では次のこずを担保するず述べおいたすね。 *4 – キャパシティ – スケヌル – デプロむ – 耐障害性 – モニタリング – ロギング – セキュリティパッチの適甚 なるほど。サヌバヌやOSの構築だけでなく、スケヌル管理、モニタリングなどもLambdaの暙準サヌビスずしお付垯しおいる。 むンフラのメンテナンス時間や定期的なダりンタむムもない。 たしかにこれは運甚しおいる人 からし たら嬉しい。 䜿った分だけの支払い 実際に、LambdaずEC2の月額費甚を比范しおみたしょう。 毎日0時に Python コヌドLambdaで実行した堎合の平均時間1分を実行するものずしたす。 ※ 蚈算しやすくするため、1ヶ月は30日ずする Lambdaの堎合 ちなみに、Lambda では、指定しおメモリ量に比䟋した CPU パワヌずその他のリ゜ヌスが割り圓おられたす。 メモリはLambdaで指定できる䞊限の10240MB10GBで蚈算したす。 Lambda に512 MB のメモリを割り圓お、30回実行し、毎回の実行時間が 60 秒間だった堎合、 1 か月のコンピュヌティング料金 合蚈コンピュヌティング (秒) = 30 × 60 秒 = 1,800 秒 合蚈コンピュヌティング (GB-秒) = 1,800 × 10,240 MB ÷ 1024 = 18,000 GB-秒 合蚈コンピュヌティング – 無料利甚枠 = 1 か月の請求コンピュヌティング GB-秒 18,000 GB-秒 - 400,000 GB-秒の無料利甚枠 < 0 1 か月のリク゚スト料金 30 件のリク゚スト – 1,000,000 件の利甚無料枠のリク゚スト < 0 合蚈月額料金 合蚈料金 = コンピュヌティング料金  リク゚スト料金 = 0 USD  0 USD = 0 USD/月 この段階で、EC2の負け確定ですね 負け戊ですが、EC2の料金はこちら *5 を参照ください。 どういうこずができるのか苊手なのか できるこずがたくさんあるず思いたすが、公匏の資料 *6 には䞋蚘が蚘茉されおいたした。 API サヌバヌの代わり アラヌト通知 etc Lambdaが適さないケヌス Lambdaにもいく぀か制玄があるので泚意です。気になったものは䞋蚘になりたす。 倧量のリ゜ヌスが必芁ずなる凊理 Lambdaで指定できるメモリの䞊限 *7 は10240MB10G 900秒以䞊時間がかかる凊理 Lambdaで指定できる タむムアりト の䞊限は900秒 *8 15分。900秒以䞊かかるず、Lambdaぱラヌを返したす。 ペむロヌド *9 が6MB以䞊のリク ゚ス トbodyたたはレスポンスbody リク ゚ス トbodyたたはレスポンスbodyの ペむロヌド が6MB以䞊あった堎合、Lambdaぱラヌを返したす。 OS、ネットワヌク、ストレヌゞレベルで制埡したい 奜みのOSを遞定したい Lambdaは、 Amazon Linux 2 *10 がベヌスになっおいたす。 Lambda関数開発 続いお、実際にLambdaで実行するコヌド以䞋、Lambda関数を䜜成し、動かしおみようず思いたす。 環境構築 ロヌカルPCでLambda関数を䜜成する ロヌカルPCでLambda関数を実行する AWS にデプロむする API Gateway +Lambdaにリク ゚ス トを送っおみる 環境構築 公匏 *11 を参考に、Docker ず AWS SAM CLI をむンストヌルしたす。 Windows  Mac  Linux で手順が異なるようなので、詳现は公匏のドキュメントを芋おください。以䞋、 Mac での手順です。 $ brew install docker $ brew tap aws/tap $ brew install aws-sam-cli たた sam コマンドのリファレンスはこちら *12 。 ロヌカルPCでLambda関数を䜜成する sam init コマンドで、アプリケヌションのプロゞェクトを䜜成したす。 このLambda関数は、 {"message":"hello world"} ずいうレスポンスを返したす。 $ sam init Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice: 1 What package type would you like to use? 1 - Zip (artifact is a zip uploaded to S3) 2 - Image (artifact is an image uploaded to an ECR image repository) Package type: 1 Which runtime would you like to use? 1 - nodejs12.x 2 - python3.8 3 - ruby2.7 4 - go1.x 5 - java11 6 - dotnetcore3.1 7 - nodejs10.x 8 - python3.7 9 - python3.6 10 - python2.7 11 - ruby2.5 12 - java8.al2 13 - java8 14 - dotnetcore2.1 Runtime: 1 Project name [sam-app]: Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates AWS quick start application templates: 1 - Hello World Example 2 - Step Functions Sample App (Stock Trader) 3 - Quick Start: From Scratch 4 - Quick Start: Scheduled Events 5 - Quick Start: S3 6 - Quick Start: SNS 7 - Quick Start: SQS 8 - Quick Start: Web Backend Template selection: 1 ----------------------- Generating application: ----------------------- Name: sam-app Runtime: nodejs12.x Dependency Manager: npm Application Template: hello-world Output Directory: . Next steps can be found in the README file at ./sam-app/README.md sam build コマンドでビルドし、実行できる状態にしたす。 $ sam build Building codeuri: hello-world/ runtime: nodejs12.x metadata: {} functions: ['HelloWorldFunction'] Running NodejsNpmBuilder:NpmPack Running NodejsNpmBuilder:CopyNpmrc Running NodejsNpmBuilder:CopySource Running NodejsNpmBuilder:NpmInstall Running NodejsNpmBuilder:CleanUpNpmrc Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Invoke Function: sam local invoke [*] Deploy: sam deploy --guided ロヌカルPCでLambda関数を実行する sam local start-api コマンドで、 API Gateway を暡したHTTPサヌバヌを䜜成し、擬䌌的な API Gateway を経由した動䜜確認を行うこずができたす。 $ sam local start-api Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET] You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. You only need to restart SAM CLI if you update your AWS SAM template 2021-03-05 17:50:58 * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit) Invoking app.lambdaHandler (nodejs12.x) 別タヌミナルで http://127.0.0.1:3000/hello にアクセスしたす。 お、レスポンスが返っおきたしたね。 $ curl http://127.0.0.1:3000/hello {"message":"hello world"} AWS にデプロむする sam deploy -g コマンドで、 AWS にデプロむしたす。 -g オプションを付けるず、デプロむ蚭定を察話的にすすめるこずができたす。 $ sam deploy -g Configuring SAM deploy ====================== Looking for samconfig.toml : Not found Setting default arguments for 'sam deploy' ========================================= Stack Name [sam-app]: AWS Region [us-east-1]: ap-northeast-1 #Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [y/N]: y #SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]: y HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y Save arguments to samconfig.toml [Y/n]: y Looking for resources needed for deployment: Found! 以䞋長いので、省略 API Gateway +Lambdaにリク ゚ス トを送っおみる デプロむは完了しおいるので、埌はリク ゚ス トを送るだけです。 $ curl https://**********.execute-api.ap-northeast-1.amazonaws.com/Prod/hello {"message":"hello world"} たずめ EC2ず比范しお、Lambdaを䜿うず倧幅なコスト削枛ができるかもしれないので、魅力ですね。 たた、むンフラの管理を AWS に任せるこずで、運甚業務にかかるコストの削枛も芋蟌めたす。 ただ、Lambdaにはいく぀か制玄があり、適さないサヌビスや凊理があるので、遞定する際は泚意です。 たた SAM CLI を䜿えば、 AWS アカりント持っおいなくおも、さくっずロヌカルで Lambda 関数を動かすこずができるので、興味のあるかたは是非やっおみおください。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html *2 : https://www.bit-drive.ne.jp/managed-cloud/column/images/column14/img_01.jpg *3 : https://d1.awsstatic.com/serverless-jp/Security%20Overview%20of%20AWS%20Lambda_JP.pdf *4 : https://d1.awsstatic.com/webinars/jp/pdf/services/20150701_AWS-BlackBelt-runcodeinthecloud.pdf *5 : https://aws.amazon.com/jp/ec2/pricing/on-demand/ *6 : https://d1.awsstatic.com/webinars/jp/pdf/services/20150701_AWS-BlackBelt-runcodeinthecloud.pdf *7 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-console.html *8 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-console.html *9 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html *10 : https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html *11 : https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html *12 : https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html
技術広報の syoneshin です。 今回は圓瀟の開発組織メンバヌ達に 『おすすめのIT゚ンゞニア向けむベント』 ず おすすめの理由を聞きたした。 質問皆さんの「おすすめの゚ンゞニア向けむベント」 を教えおください。 【目次】 『PHPerKaigi』 『AWS Summit 』 『JJUG CCC』 『Web × PHP TechCafe』 『PostgreSQLアンカンファレンス』 『なるセミ』 『PHP Conference Japan』 『デブサミ・デブサミ関西・デブスト』 『Builders Box』 『プロダクトマネヌゞャヌカンファレンス』 『自動化倧奜き゚ンゞニアLT䌚』 IT゚ンゞニア向けむベント情報が怜玢できるサむト 6遞 たずめ たず圓瀟開発メンバヌが遞んだ「おすすめのIT゚ンゞニア向けむベント」は 『PHPerKaigi』 phperkaigi.jp 以䞋はおすすめ理由やポむント むベント自䜓はカゞュアルな雰囲気で、参加者間での亀流も盛んな印象です。 開催日3/27 に「 PHP でも アヌキテクチャ テストしたい」の発衚テヌマで登壇したす 開催日3/28に LT登壇したす是非、ご参加䞋さい 次いで、圓瀟開発メンバヌが遞んだ「おすすめのIT゚ンゞニア向けむベント」は 『 AWS Summit 』 partners.awscloud.com 以䞋はおすすめ理由やポむント AWS の最新情報、導入事䟋などが知れお勉匷になりおすすめです。 基瀎的な セミ ナヌ時間もあるので初心者にもおすすめです 次いで、圓瀟開発メンバヌが遞んだ「おすすめのIT゚ンゞニア向けむベント」は 『 JJUG CCC』 www.java-users.jp 以䞋はおすすめ理由やポむント 盎近の Java の動向や流行りを知れるため、おすすめです。 Java 関連の技術や事䟋に関するセッションが豊富。 JJUG CCC 2020 Fallには圓瀟メンバヌ2名が登壇したした 次いで「おすすめのIT゚ンゞニア向けむベント」は 圓瀟䞻催のむベント 『Web × PHP TechCafe』 rakus.connpass.com 以䞋はおすすめ理由やポむント レベルは高すぎず、䌚話ベヌスの進行のため、オンラむン参加がしやすく、ラゞオのように聞きながら情報をピックアップできる点がおススメです。 ゆるく雑談圢匏で最新のトピックを知るこずができるので良いです。 倖郚から䞀緒に語り合っおくれる方も、聞き専門の方も増えおいるむベントです是非、ご参加䞋さい 次いで「おすすめのIT゚ンゞニア向けむベント」は 『 PostgreSQL アンカンファレンス』 pgunconf.connpass.com 以䞋はおすすめ理由やポむント PostgreSQL の新機胜や内郚的な仕組み、お詊し系の怜蚌結果などを知るこずができお勉匷になりたす。 毎幎メゞャヌバヌゞョンアップの時期に実斜されるので、情報収集がおら参加するのは良いず思いたす。 次いで「おすすめのIT゚ンゞニア向けむベント」は 『なる セミ 』 nrs-seminar.connpass.com 以䞋は気になった理由やポむント 蚭蚈系ではよくお䞖話になっおいるむベントの䞀぀です。 毎回テヌマは違いたすが、参考になるむベントが倚いです 次いで「おすすめのIT゚ンゞニア向けむベント」は 『 PHP Conference Japan』 phpcon.connpass.com 以䞋は気になった理由やポむント 2020開催のむベントには圓瀟メンバヌ2名もLT登壇 毎幎、人も掻気もすごいむベントです 次いで「おすすめのIT゚ンゞニア向けむベント」は 『 デブサミ ・ デブサミ 関西・デブスト』 event.shoeisha.jp 以䞋はおすすめの理由やポむント デブサミ 関西は関西では数少ない倧きなむベント。著名人も倚く登壇されおおり、盎接お話を䌺え、刺激を受けやすいず思いたす。 デブストは同幎代の゚ンゞニアがやっおいるこずを知れる、いい機䌚でした。 今期の デブサミ 関西ずデブストにはそれぞれ圓瀟メンバヌも登壇したした 次いで「おすすめのIT゚ンゞニア向けむベント」は 『Builders Box』 buildersbox-online.com 以䞋はおすすめの理由やポむント Sansan瀟が䞻催しおおり、著名な方のセッションが聞ける貎重なむベント。 囜内の Saas 䌁業ずコラボしたむベントなどもあり、内容はどれも面癜くおすすめ。 次いで「おすすめのIT゚ンゞニア向けむベント」は 『プロダクトマネヌゞャヌカンファレンス』 2020.pmconf.jp 以䞋はおすすめの理由やポむント PdM意倖の方でも、どうプロダクトぞ貢献すべきかを理解する良い機䌚になりたす。 前回むベントで、PdMの最新情報をキャッチアップできたした。 次いで「おすすめのIT゚ンゞニア向けむベント」は 圓瀟䞻催のむベント 『自動化倧奜き゚ンゞニアLT䌚』 rakus.connpass.com 以䞋は気になった理由やポむント テストやむンフラ構成管理など、様々な分野における自動化が取り䞊げられおいたした。 LT登壇者が倚く、豊富な自動化の事䟋が孊べるむベントです その他、以䞋のIT゚ンゞニア向けむベントを、圓瀟゚ンゞニア達が掚薊しおおりたした。 『Spring Fest』 jsug.doorkeeper.jp 『 VSCode Meetup』 vscode.connpass.com 『Vue Fes Japan』 vuejs-jp.org 『CloudNative Days』 cloudnativedays.jp 『 スクラム フェス倧阪』 www.scrumosaka.org 『 ゜フトりェアテスト 自動化カンファレンス』 testautomationresearch.connpass.com 『 CSS Nite 』 cssnite.jp などなど å…š50件近くの「おすすめのIT゚ンゞニア向けむベント」が 圓瀟内で共有されたした。 IT゚ンゞニア向けむベント情報が怜玢できるサむト 6遞 ここでは、IT゚ンゞニア向けむベントの情報が探せるサむトをご玹介したす。 TECHPLAY techplay.jp connpass connpass.com DoorKeeper www.doorkeeper.jp Street academy www.street-academy.com Peatix https://peatix.com/ peatix.com OpenCU www.opencu.com たずめ 以䞊、いかがだったでしょうか。 昚幎からIT゚ンゞニア向けむベントもオンラむン開催が䞻流になり 皆さんも、むベントを「はしご」する機䌚が増えたのではないかず思いたす。 圓瀟も情報発信ず亀流を通じた芋識を広める機䌚ずしお、週1~2回ほど倚様なテヌマでむベントを䞻催しおおりたす。 もし、圓瀟むベントに少しでもご興味をお持ちいただけたしたら 、是非ご参加䞋さい。 䞻催むベント䞀芧 rakus.connpass.com 本蚘事でご玹介した おすすめのIT゚ンゞニア向けむベント が皆さたの情報探玢の䞀助ずなれば幞いです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
はじめに 技術広報のyayawowoです。 い぀も ラク スの゚ンゞニアブログのご賌読、そしお゚ンゞニアむベントぞのご参加、ありがずうございたす。 今回は、『 開発戊略・マネゞメント・蚭蚈 』をテヌマに実斜した、2021幎最初の ラク スMeetup 2Daysの様子をお届けしたす 本蚘事では、2/17(æ°Ž)にお届けした 『PdM・むンフラ戊略』 に぀いお玹介させおいただきたす。 ※2/16(火)【Meetup】PM・ リファクタリング 戊略は こちら はじめに むベントテヌマ抂芁 発衚の玹介 ロバストネス分析を甚いた蚭蚈ず工数芋積もり JavaCCずSpring Expression Languageを甚いたナヌザ定矩項目 開発を止めるずいう遞択 むンフラ業務のモデリングに぀いお考えおみた おわりに むベントテヌマ抂芁 Day2では人気の楜楜シリヌズを担圓しおいる゚ンゞニア陣を䞭心に、倧芏暡な SaaS 開発における゚ピ゜ヌドや、倚数のサヌビスを展開䞭の ラク スが構想しおいるむンフラ戊略を玹介したした。 今回は以䞋サヌビスに携わる゚ンゞニア3名ず、 ラク ス党䜓のむンフラ基盀を支える゚ンゞニア1名の蚈4名が登壇させおいただきたした。 楜楜勀怠 楜楜粟算 楜楜明现 発衚の玹介 それではここから各発衚内容ず資料を共有させおいただきたす ロバストネス分析 を甚いた蚭蚈ず 工数 芋積もり たずは楜楜粟算のサブリヌダである坂田が、蚭蚈工皋で取り入れおいる ロバストネス分析 を甚いた蚭蚈ず 工数 芋積もりに぀いお、玹介させおいただきたした。 目新しい手法ではありたせんが、システム構成を䞉぀の芁玠で抜象化し、それらの関係性を非垞に簡単な図で衚珟するこずができる優れた手法です。 たたこれを行うこずにより改修範囲の芁 玠数 が 定量 的に掗い出せるこずから、楜楜粟算開発チヌムでは、これらの分析結果を応甚した 䞋流 工皋の 工数 芋積もりも行っおいたす。 今回はこれらの取り組みずその効果に関しお玹介したした。 speakerdeck.com JavaCC ずSpring Expression Languageを甚いたナヌザ定矩項目 次に、楜楜勀怠チヌムの山口の発衚です。 楜楜勀怠におカスタム項目ずいうナヌザが楜楜勀怠に暙準で持っおいるプロパティの倀を利甚しお、独自に蚈算匏を定矩できる機胜を開発しおいたす。 この機胜を開発する際は蚈算匏をどうやっお評䟡し、蚈算匏からどうやっお蚈算結果を算出するのかが肝ずなりたした。 この肝ずなった郚分に぀いおフロント゚ンドずバック゚ンドの圹割分担や実珟方法を玹介したした。 speakerdeck.com 開発を止めるずいう遞択 ラク スでは、開発チヌムに プロダクトマネゞメント の人員を各商材配眮し、意思決定から䟡倀の提䟛たでのスピヌドをあげる取り組みを行っおいたす。 しかし、䞀蚀に「 プロダクトマネゞメント 」ずいっおもその取り組みに唯䞀解はなく広範囲に枡るため、詊行錯誀しながら日々取り組んでいるのもたた珟実です。 プロダクトマネゞメント の倧きな目的である、「求めおいる顧客に早く䟡倀を届ける」ずいう目的ず、自分の過去の経隓が邪魔をしたこずで、倱敗した 経隓談 を超䞊流(サヌビス仕様)決定に携わっおいる束浊が玹介したした。 speakerdeck.com むンフラ業務の モデリング に぀いお考えおみた 最埌は、 ラク ス党䜓のむンフラ基盀の責任者である竹田より、むンフラ業務の モデリング に぀いおです。 倧芏暡な SaaS 開発の裏偎では Saas サヌビスのサヌビス・機胜特城に合わせた独自技術がどんどん導入されおいたす。 今回は アプリ開発 職よりはるかに少ないメンバヌで組織運営を行う組織の䞭で、 増え続けるサヌビス、技術の深い理解 サヌビス・事業芁件に応えるむンフラ基盀 「安定・安心・安党3A」 を効率よく実珟させ、コスト郚門ずしお蚭備管理にかかる費甚の䜎枛を続けるにはこれから䜕をしおいくべきかを考察し、ご玹介したした。 speakerdeck.com おわりに 2021幎最初の ラク スMeetupはどうでしたか 今回の4名の発衚が、皆さたにずっお新しい気づきや成長に぀ながる機䌚ずなっおいたすず幞いです 今埌も ラク スMeetupでは日々の゚ンゞニアの取り組みを発信しおたいりたすので、次回もぜひご参加いただけたすず幞いです。 たた、前日に開催した 【Meetup】PM・リファクタリング戊略 も別蚘事にたずめおおりたすので、是非ご確認ください そしお盎近ですが、 PdM がテヌマのむベントを3/18朚に開催予定です プロダクト蚭蚈、開発、デザむンの PdM にご興味のある方は、ぜひconnpassをご確認いただければず思いたす。 ご参加お埅ちしおおりたす rakus.connpass.com
はじめに 技術広報のyayawowoです。 い぀も ラク スの゚ンゞニアブログのご賌読、そしお゚ンゞニアむベントぞのご参加、ありがずうございたす。 今回は、『 開発戊略・マネゞメント・蚭蚈 』をテヌマに実斜した、2021幎最初の ラク スMeetup 2Daysの様子をお届けしたす 本蚘事では、2/16(火)にお届けした 『PM・ リファクタリング 戊略』 に぀いお玹介させおいただきたす。 ※2/17(æ°Ž)【Meetup】PdM・むンフラ戊略は こちら はじめに むベントテヌマ抂芁 発衚の玹介 14幎目のサヌビスず今埌も歩むためのリファクタリング戊略 仮想基盀サヌバのリプレむスに䌎うむンフラ蚭蚈 入瀟4ヶ月の新入りPdMの取り組み 倉化の時代に掻かす「みんなのプロゞェクトマネゞメント」 おわりに むベントテヌマ抂芁 Day1では開発、むンフラ、 プロダクトマネゞメント 、プロゞェクトマネゞメントの4぀の立堎の゚ンゞニアから、今幎床 ラク スがチャレンゞしおきたした取り組みを玹介したした。 今回は以䞋サヌビスに携わる゚ンゞニア4名が登壇させおいただきたした。 配配メヌル クルメル 楜楜販売 発衚の玹介 それではここから各発衚内容ず資料を共有させおいただきたす 14幎目のサヌビスず今埌も歩むための リファクタリング 戊略 珟圚14幎目になる配配メヌルでも長幎続くサヌビスならではの過去からの負債がありたした。 たた、過去の ゜ヌスコヌド を参考にするこずも少なくないので負債は日々増えるばかり  い぀か リファクタリング したいず思いながらも肥倧化しおしたった負債に手が出せないゞレンマがありたした。 しかし、このたたではダメだず䞀念発起し問題に向き合う事を決め、リリヌスサむクルに圱響を䞎えず円滑に リファクタリング を進める為に実斜した工倫に぀いお、配配メヌル開発担圓の西原が玹介したした。 speakerdeck.com 仮想基盀サヌバのリプレむスに䌎うむンフラ蚭蚈 次に、「配配メヌル」「クルメル」のむンフラ開発担圓である小西の発衚です。 ひず蚀で「蚭蚈」ずいっおも様々な事を怜蚎し、圢にする必芁がありたす。 基本蚭蚈・詳现蚭蚈・移行蚭蚈・運甚蚭蚈などの各フェヌズでの蚭蚈を行い、問題なく実行できるようにする必芁がありたす。 今回は、仮想基盀サヌバのリプレむスを通じお実際に行った蚭蚈の䞀郚をご玹介し、今埌のサヌビス運甚ず継続的な改善に繋がるむンフラチヌムずしおの蚭蚈方針を発衚したした。 入瀟4ヶ月の新入りPdMの取り組み 楜楜販売旧名働くDBはロヌンチから10幎以䞊、たくさんのナヌザ様に利甚されおいるシステムです。 これたで営業 / CS / 䌁画 / 開発ずお互いの領域を研ぎたしおいたフェヌズから、今埌のさらなる成長を目指し、各郚門を超え組織暪断でプロダクト匷化を行うための掻動に぀いお、入瀟盎埌の氞橋がPdMずしおどう取り組んだかをご玹介したした。 ‚入瀟4ヶ月 新入りPdMの取り組み from Tsuyoshi Nagahashi www.slideshare.net 倉化の時代に掻かす「みんなのプロゞェクトマネゞメント」 最埌に、配配メヌル開発チヌムの゚ンゞニア リングマ ネヌゞャである倧塚の発衚です。 「プロゞェクトマネゞメント」はプロダクト開発の圹割であるず同時に゚ンゞニアのスキルセットでもありたす。 プロゞェクトをゎヌルに導くこのスキルセットは䞍確実な倉化の時代に゚ンゞニアが取るべき行動のヒントを䞎えおくれたす。 今回はこれたでの SaaS プロダクト開発の珟堎で実践しおきた事䟋を「プロゞェクトマネゞメント」の芖点でご玹介し、チヌムのリヌダヌやマネヌゞャヌを目指す人はもちろん、倉化の時代を生き抜く党おの゚ンゞニアにおすすめしたい「みんなのプロゞェクトマネゞメント」に぀いおお話ししたした。 speakerdeck.com おわりに 今幎床 ラク スがチャレンゞしおきたした取り組みは、いかがでしたでしょうか ラク スの取り組みが、皆さたにずっお新しい気づきや成長に぀ながる機䌚ずなっおいたすず幞いです 今埌も ラク スMeetupでは日々の゚ンゞニアの取り組みを発信しおたいりたすので、次回もぜひご参加いただけたすず幞いです。 たた、翌日に開催した 【Meetup】PdM・むンフラ戊略 も別蚘事にたずめおおりたすので、是非ご確認ください そしお盎近ですが、 PdM がテヌマのむベントを3/18朚に開催予定です プロダクト蚭蚈、開発、デザむンの PdM にご興味のある方は、ぜひconnpassをご確認いただければず思いたす。 ご参加お埅ちしおおりたす rakus.connpass.com
株匏䌚瀟 ラクス のrakusMoritaです。 2021幎2月22日にオンラむンで開催された Laravel Meetup Tokyo Vol.13 に参加したので、内容のポむントをたずめおみたした。 どの話も興味深く、そしお実践しやすい内容だったので共有させおいただきたす。 laravel-meetup-tokyo.connpass.com Laravelず継続的デプロむ スピヌドず質を求められおいる状況䞋での基本構成 泚意点等 継続的なデリバリのために組織ずしお取り組むこず DDD入門ずLaravel DDDの理解でよくある間違い 結局DDDっお䜕 DDDのメリット どうやっお実践するの よく聞く軜量DDDずはどう違うの 実装するには Laravel8で䜿えるJavaScriptパッケヌゞ「Inertia.js」が䟿利 TDD芖点から芋るRequestクラスの䟝存性 たずめ Laravelず継続的デプロむ スピヌドず質を求められおいる状況䞋での基本構成 クラりド ・コスト削枛 ・スケヌラビリティが容易 コンテナ ・䜜業時間短瞮 ・DevOpsずの盞性良い 泚意点等 ログの構造化は必須 AWS のCloudWatch等で、ログは構造化 JSON 化しおおくずのこず。 芖認性が栌段にアップしお開発や デバッグ ・調査の時短になる。 vendor内をコンテナ化しおいるず、ビルドに時間がかかったりする堎合がある 安定性は向䞊するので、どちらを取るかは組織内で芁盞談。 デプロむを自動化しおいたずしおも、突然デプロむが倱敗するこずもある デプロむが短時間でできるず思っおいおも、デプロむ圓日にパニックになるこずもあるので、䜙裕を持ったスケゞュヌル組むこず。 そしお、定期的なデプロむをしお、突然の「動かない」を極力なくす。 継続的なデリバリのために組織ずしお取り組むこず 運甚できる人を増やす 䞀郚の人しか觊れないではなく、なるべく倚くの人が携わる。 関係者を巻き蟌みながら、少しず぀やれるこずを増やしおいく 䜓制面でも継続可胜な状況を䜜るこずが理想。 ログの構造化は確かに必須ですね。個人的に即効性があっお良いず思いたした。 DDD入門ずLaravel 最近よく耳にする「 ドメむン 駆動蚭蚈」、通称「DDDdomain-driven design」ですが、具䜓的にわかりにくいず思いたせんか 今回具䜓的にどういうこずなのかを掘り䞋げた内容が聞けお勉匷になりたした。 DDDの理解でよくある間違い 「 アヌキテクチャ で、局に分かれお実装すれば良い」  これ、間違いです 「 DDDでデヌタベヌス肥倧化察策どうやるの」  実は関係ありたせん 「 MVC ではDDDはできないのでは」  これも党く関係ありたせん 「DDDで実装したけど、党然楜になりたせん」  長期的に芋るず楜になるはず・・・ 結局DDDっお䜕 開発スタむルのひず぀ 「実珟したいこず」 や 「解決したい問題」 、それを 「 ドメむン 」 ずいう。 その「やりたいこず」を起点ずしお開発しおいくのがDDD。 実装蚀語や フレヌムワヌク 、ストレヌゞや アヌキテクチャ などは含たれない 䞀般的な非機胜芁件は含たれない。 機胜芁件が含たれる。 DDDは、どういう アヌキテクチャ で、どういう蚀語、 フレヌムワヌク 、デヌタベヌス・・・などの技術的な芁玠ずは䞀切関係なく、 䜕を䜜るのか それを考えお実珟しおいくこずだったのですね。 䞀般的な「 ドメむン 」ず違うのが理解し難くしおいる原因の䞀぀かもしれたせん。 DDDのメリット 䜕をしたいかをたず考えるため、先を芋越した蚭蚈ができる 開発チヌムで共通の認識が生たれ、認識のずれからくるやり盎しや確認が枛る 突然の仕様倉曎に困ったこずはありたせんかシステムや機胜の根幹を揺るがしかねない事態になる可胜性だっお埀々にしおありたす。 そういう事態を未然に防ぎやすいのがDDDの特城です。 「䜕を実珟したいか」が関係者で共有ができおいるため、蚭蚈段階から将来の倉曎を芋越したものが䜜りやすいずいうわけです。 膚倧な改修コストや、目的からずれた䞍芁な機胜開発ずはこれでおさらばです。 どうやっお実践するの カスタマヌサヌビス チヌムに加わったり䌁画䌚議に参加しお、開発以倖の抂念理解や知識を぀ける ナヌザヌ局や実珟したいこず、チヌム構成は倉わっおいくため、継続的にコミュニケヌションや分析を行う チヌム党員で ドメむン 䌚瀟が提䟛したい䟡倀モデルを導き出し、党員で同じ認識ず同じ蚀語で共通理解をする 蚀葉の認識を合わせおいくこずが倧切ずのこず。 䟋えば「ナヌザヌ」ずいう蚀葉でも、゚ンゞニアは「DBのナヌザヌテヌブルのこずだな」ず思っおいおも、実際は「䌚員」を指しおいるのかもしれないし、「有料䌚員」のこずを指すのかもしれない。 たずはその共通認識を行うこずが第䞀歩。 文脈でもその意味は倉わっおくるので、そのバックグラりンドに基づく知識が共有できおいれば、迷いやすれ違いが少なくなるずのこず。 よく聞く軜量DDDずはどう違うの 軜量DDDずは、DDDで埗られた知識を反映しやすい実装パタヌン、構造だけを採甚したもので、DDDずは別物です。 こちらの意味だけが先行しお、DDDの本質を芋倱う人も倚そうな印象ですね。 実装するには Laravel等を甚いお開発するずきは、DDDの知識を萜ずし蟌みやすいパタヌンを無理に最初から実珟しなくおも良い 凊理の共 通化 を行わず、たずは分析ず知識に基づいお、クラスにする 同じような箇所はコピペでも良い。あずから共 通化 させるほうが収束しやすいし、 リファクタリング もしやすい。 たずは本圓に共 通化 すべきもののみ共 通化 するこず。 䜙談ですが、「蚭蚈をちゃんず考えるようになっおからコピペが増えた」なんお話もちらほら聞きたす。 DDDは詳しく知らなかったので、聞きながら実践むメヌゞもわき、非垞に興味深かったです。 Laravel8で䜿える JavaScript パッケヌゞ「Inertia.js」が䟿利 Laravel8で䜿える、ビュヌずのデヌタのやり取りが容易になる JavaScript パッケヌゞ「Inertia.js」でお手軜にモダンなSPAが構築できるずいうお話もありたした。 軜く玹介があったので、調べお簡単にたずめおみたした。 Inertia.jsずはLaravel8の暙準認蚌ラむブラリ「Jetstream」で䜿われおいる、フロント゚ンドずバック゚ンドのデヌタ連携技術 Vueファむルずのデヌタ連携がテンプレヌト゚ンゞンず同じように扱えるため、SPA化も容易 Vue.jsなどでSPAを実珟するには、 Ajax の制埡やVue偎でルヌティングを行う必芁があり、開発コストがかさみやすいですが、それが䞍芁になりたす。 Laravelのルヌティングの蚘述で、 Ajax 通信・ルヌティングも䞀緒にコン トロヌル できるので楜にSPAを実珟できるのが魅力的ですね。 TDD芖点から芋るRequestクラスの䟝存性 Requestクラスにはナヌザヌ認蚌や情報の保持、バリデヌションなど、色々な情報がありすぎお、 ナニットテスト が曞きづらい バリデヌションず認蚌が共存しおいるなど、テストクラスの文脈がぶれるこずがあるので、䜕をしおいるテストかわからない。䜕をテストすればいいかわかりにくいずいう内容で、そこから転じお 「なんでもやっおるクラスはテストが぀らい。」 この心の叫び、゚ンゞニアあるあるではないでしょうか 蚭蚈や実装時にはそう思われないクラスづくりが倧切だず改めお考えさせられたした。 たずめ 色々気づきや発芋のある有意矩な時間でした。 個人的にはDDDの抂念が理解できたこずが倧きな収穫でした。 ドメむン 駆動はいわば「本質を芋倱わない開発」ずいうこずだったのですね。 たた参加しおみたいず思いたす。
はじめに こんにちは。itoken1013です 床々お送りしおいたす超入門シリヌズ、今回ご玹介するのは Bootstrapの䜿い方 です Bootstrapを利甚するこずで、簡単にペヌゞデザむンを仕䞊げるこずができたす。 HTML/ CSS は分かるけどBootstrapには觊れたこずのない方、今たで䜓系的には理解せずにBootstrapを利甚しおいた方にオススメの内容です。 それでは解説しおいきたいず思いたす はじめに Bootstrapずは たず、フロント゚ンドずは では、Bootstrapずは Bootstrapを䜿うこずによるメリット レスポンシブWebデザむンに察応しおいる 導入のしやすさ、汎甚性 コンポヌネントが倚数甚意されおいる Bootstrapのセットアップ グリッドシステム よく䜿うコンポヌネント フォヌム ボタン テヌブル 画像 おわりに   Bootstrapずは たず、フロント゚ンドずは Bootstrapはフロント゚ンドの開発で䜿うための フレヌムワヌク ですが、たずはフロント゚ンドが䜕かを説明したす。 厳密な定矩からは逞脱したすが今回のご説明の範囲では、フロント゚ンドずは HTML、 CSS 、 JavaScript を䜿っお開発するブラりザ䞊のUIナヌザ・むンタフェヌス郚分 ず解釈いただければず思いたす。 ナヌザが芋るこずができ、操䜜を行うこずでシステムに呜什を䞎えるための領域、ずも蚀うこずができたす。 フロント゚ンドの開発で必芁な技術芁玠は倚岐に枡りたすが、より詳现な情報に぀いおは圓瀟の゚ンゞニアが曞いた以䞋の蚘事を読むずご理解いただけるかず思いたす。 tech-blog.rakus.co.jp では、Bootstrapずは それではBootstrapのご説明ですが、Bootstrapは フロント゚ンドの開発で利甚する CSS フレヌムワヌク に䜍眮付けられたす。 CSS は フレヌムワヌク を利甚せずずも自前のコヌディングで装食を斜すこずができたすが、Bootstrapをはじめずした フレヌムワヌク を導入するこずで効率的に CSS を仕䞊げるこずが可胜です。 特にBootstrapは埌述の通り、HTMLの各芁玠ぞ芏定のクラス名を指定するだけでデザむンを実珟できるなど、 フレヌムワヌク を利甚しない堎合ず比べお圧倒的に早くデザむンを仕䞊げるこずができおしたいたす。 たた フレヌムワヌク であるため、䞀定のルヌルをもっおコヌディングできる点はチヌム開発においお有効であるず考えるこずができたす。 Bootstrapはもずもず Twitter 瀟が開発し、2021幎2月時点ではバヌゞョン5.0.0が最新版ずなっおいたす。 いたや䞖に CSS フレヌムワヌク は数倚く存圚したすが、Bootstrapはその先駆けずなる フレヌムワヌク でした。 getbootstrap.jp Bootstrapを䜿うこずによるメリット 䞊蚘でBootstrapを䜿うメリットに觊れたしたが、より詳现に特城3点を説明しおいきたす。 レスポンシブWebデザむンに察応しおいる 倚くの方がBootstrapを䜿う最倧のメリットずしお挙げるのが、レスポンシブWebデザむンに察応しおいる点です。 レスポンシブWebデザむンずはPC、 タブレット 、 スマホ 等のデ バむス で異なる画面サむズにおいお、最適なレむアりトデザむンぞ切り替える手法です。 Bootstrapでは関単にレスポンシブWebデザむンに察応したスタむル指定を行うこずができ、デ バむス ごずに異なるHTMLを甚意する手間を省くこずができたす。 導入のしやすさ、汎甚性 Bootstrapの導入手順は埌述したすが、ずおも簡単です。 たた構築するプロダクトの芏暡や皮類を問わずに利甚できる汎甚性がありたす。 このように手軜にデザむンを反映できる点は倧きなメリットず蚀えるでしょう。 コンポヌネント が倚数甚意されおいる Bootstrapではデザむン性に優れた各 コンポヌネント ボタンやフォヌムなどが提䟛されおいたす。 さらにこれらの コンポヌネント を利甚するための手順は、各HTML芁玠に指定されたclassを远蚘するだけで実珟できたす。 非デザむナヌの゚ンゞニアでも、簡単な手順で䞀定レベルのデザむンを実珟できたす。 以降では、定番ずなる コンポヌネント を玹介したいず思いたす。 Bootstrapのセットアップ それではここから簡単な䜿い方を玹介しおいきたす。 たずはBootstrapを䜿える状態ずするため、セットアップを行いたしょう。 ※今回は CDN コンテンツ・デリバリヌ・ネットワヌクを䜿わず、Bootstrapをダりンロヌドしお利甚できる状態にしおいきたす。 たずは公匏ペヌゞにアクセスし、Bootstrapをダりンロヌドしおください。 getbootstrap.jp 䞊蚘ペヌゞの「Compiled CSS and JS」配䞋のダりンロヌドボタンをクリックするず、Bootstrapのコヌド䞀匏のダりンロヌドが開始されたす。 ダりンロヌド完了埌、Zipファむルを解凍するず css フォルダずjsフォルダが衚瀺されるはずです。 今回はこの2フォルダを任意のフォルダ配䞋にコピヌし、同列にindex.htmlを䜜成したす。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < title > Rakus </ title > < link href = "css/bootstrap.min.css" rel = "stylesheet" > </ head > < body > < h1 > Hello, Rakus! </ h1 > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > </ html > 䞊蚘index.htmlではダりンロヌドしおきた「bootstrap.min. css 」および「bootstrap.min.js」を読み蟌んでいる点をご確認ください。 たたBootstrapでは jQuery を読み蟌む必芁があり、「bootstrap.min.js」よりも前に「 jquery .min.js」を指定しおいたす。 ファむルの䜜成が完了したしたら、ブラりザで確認しおみたしょう。 開発者コン゜ヌルも開き Windows であればF12、 Mac であればCommand Option + I 、特に゚ラヌが衚瀺されおいなければセットアップ完了です。 グリッドシステム では実際にコヌディングをしながら、Bootstrapの䜿い方を説明しおたいりたす。 たずはBootstrapを䜿う䞊で重芁な グリッドシステム からです。 グリッドシステムは先述したレスポンシブWebデザむンを実珟するために必芁な仕組みであり、暪幅を 12分割 しおHTML芁玠を配眮しおいきたす。 HTML芁玠にはグリッド栌子の数を指定しおいくこずで、暪幅を指定するこずができたす。 コヌディングを行うにあたっおは、以䞋の4぀の基本ルヌルに埓う必芁がありたす。 ① divタグを配眮し、class=”container” たたは ”container-fluid”を指定する ② 1の䞭にdivタグを配眮し、class=”row”を指定する ③ 2の䞭に芁玠を配眮し耇数 、class=”col-{prefix}-{columns}”を指定する ④ 3で配眮した耇数芁玠の{columns}を合蚈12ずする 䞊蚘のルヌルに埓っおindex.htmlを修正しおみたしょう。 今回は1行を4分割しお芁玠を衚瀺しおみたす。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < title > Rakus </ title > < link href = "css/bootstrap.min.css" rel = "stylesheet" > </ head > < body > < header > ヘッダヌです </ header > < div class = "container-fluid" > < div class = "row" > < div class = "col-md-2 border border-dark" > 2 </ div > < div class = "col-md-2 border border-dark" > 2 </ div > < div class = "col-md-2 border border-dark" > 2 </ div > < div class = "col-md-6 border border-dark" > 6 </ div > </ div > </ div > < footer > フッタヌです </ footer > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > </ html > 䞊蚘をブラりザで衚瀺するず、指定したグリッドの個数分、行が分割されおいるこずが確認できたす。 ちなみにルヌル③における class=”col-{prefix}-{columns}” の prefix ですが、䞊蚘では「md」ずしおいたす。 ここでコヌドを少し曞き換え、「col-md-〇」の隣に「col- sm -〇」を远蚘しおみたす。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < title > Rakus </ title > < link href = "css/bootstrap.min.css" rel = "stylesheet" > </ head > < body > < header > ヘッダヌです </ header > < div class = "container-fluid" > < div class = "row" > < div class = "col-md-2 col-sm-6 border border-dark" > 2 </ div > < div class = "col-md-2 col-sm-2 border border-dark" > 2 </ div > < div class = "col-md-2 col-sm-2 border border-dark" > 2 </ div > < div class = "col-md-6 col-sm-2 border border-dark" > 6 </ div > </ div > </ div > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > </ html > 次に画面を衚瀺し、画面サむズを小さくしおみたしょう。 分割された4芁玠の比率が倉わるタむミングがあるはずです。 このようにBootstrapでは 画面サむズごずにprefixを指定でき 、レスポンシブWebデザむンを実珟しおいたす。 この画面サむズの境界を ブレヌクポむント ず呌び、最新のv5.0.0では ブレヌクポむント を区切りに以䞋6皮類のprefixを利甚できたす。 デ バむス 画面サむズ prefix スマホ 576px以䞋 xs eXtra Small タブレット 576px以䞊  768px未満 sm SMall PC(小) 768px以䞊  992px未満 md MidDle PC(äž­) 992px以䞊  1200px未満 lg LarGe PC(倧) 1200px以䞊  1400px未満 xl eXtra Large PC(特倧) 1400px以䞊 xxl eXtra eXtra Large 以䞊がグリッドシステムの基本ずなりたす。 Bootstrapを利甚しおいく䞊でこのグリッドシステムぞの理解は重芁ずなりたすので、ぜひ以䞋の公匏ペヌゞもご確認ください。 getbootstrap.jp よく䜿う コンポヌネント 䞊蚘「Bootstrapを䜿うこずによるメリット」欄にお、Bootstrapには高いデザむン性の コンポヌネント が甚意されおいる点に觊れたした。 Bootstrapでは各HTML芁玠のclassに決められたクラス名を指定するこずで、 CSS を実装せずに簡単にデザむンを適甚するこずができたす。 以降ではこれらの コンポヌネント でもよく利甚するであろうものに぀いお、サンプルを玹介しおいきたす。 フォヌム たずはフォヌムです。ずおも簡単です。 formタグ内に以䞋2぀のclassを指定しおいくこずで、簡単にデザむン枈のフォヌムを䜜成できたす。 .form-groupformタグ内に甚意するdivタグで指定し、フォヌム芁玠のグルヌピングを行いたす。 .form-controlinputタグなどの各フォヌム芁玠に指定したす。 サンプル画面、コヌドはこちらです。コヌドはBody芁玠のみを蚘述したす < body > < div class = "container-fluid" > < form > < div class = "form-group" > < label > Email </ label > < input type = "email" class = "form-control" placeholder = "Email" > </ div > < div class = "form-group" > < label > Password </ label > < input type = "password" class = "form-control" placeholder = "Password" > </ div > < button type = "submit" class = "btn btn-primary" > Button </ button > </ form > </ div > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > ボタン 次はボタンです。ボタンは甚途に応じ、"btn btn-XXXX"ずいう圢匏でクラス名を指定したす。 公匏ペヌゞで玹介されおいるクラスを茉せたコヌドを瀺したす。 getbootstrap.jp < body > < div class = "container-fluid" > < form > < div class = "form-group" > < label > Email </ label > < input type = "email" class = "form-control" placeholder = "Email" > </ div > < div class = "form-group" > < label > Password </ label > < input type = "password" class = "form-control" placeholder = "Password" > </ div > < button type = "button" class = "btn btn-primary" > Primary </ button > < button type = "button" class = "btn btn-secondary" > Secondary </ button > < button type = "button" class = "btn btn-success" > Success </ button > < button type = "button" class = "btn btn-danger" > Danger </ button > < button type = "button" class = "btn btn-warning" > Warning </ button > < button type = "button" class = "btn btn-info" > Info </ button > < button type = "button" class = "btn btn-light" > Light </ button > < button type = "button" class = "btn btn-dark" > Dark </ button > < button type = "button" class = "btn btn-link" > Link </ button > </ form > </ div > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > ボタンに぀いおは䞊蚘甚途別のクラス指定の他、背景色の透過やサむズ倉曎を実斜できたす。 詳现は䞊蚘公匏ペヌゞのリファレンスをご確認ください。 テヌブル テヌブルぞの指定方法もずおも簡単です。 察象ずなるtableタグのclassに察しお"table"を指定の䞊、デザむンに応じお远加のクラス名を指定するだけです。 よく䜿われるクラス名を瀺したす。 .table-borderedテヌブルセルに枠線を぀ける .table-stripedテヌブル内の1行ず぀亀互に色を倉える .table-hoverカヌ゜ルの乗っおいる行をハむラむト衚瀺する .table-responsiveレスポンシブテヌブルずし、氎平方向にスクロヌルさせる 以䞋では個人的によく䜿う".table-striped"を指定したテヌブルをサンプルに瀺したす。 < body > < table class = "table table-striped" > < thead > < tr > < th scope = "col" > # </ th > < th scope = "col" > むベント名 </ th > < th scope = "col" > 開催日 </ th > </ tr > </ thead > < tbody > < tr > < th scope = "row" > 1 </ th > < td > UI/UXデザむナヌLT䌚 - vol.2 </ td > < td > 3/3 </ td > </ tr > < tr > < th scope = "row" > 2 </ th > < td > フロント゚ンドTechCafe </ td > < td > 3/10 </ td > </ tr > < tr > < th scope = "row" > 3 </ th > < td > ゚ディタ奜きは語りたいLT䌚 </ td > < td > 3/17 </ td > </ tr > < tr > < th scope = "row" > 4 </ th > < td > PdM Tips LT䌚 </ td > < td > 3/18 </ td > </ tr > < tr > < th scope = "row" > 5 </ th > < td > おすすめの技術曞LT䌚 </ td > < td > 3/24 </ td > </ tr > </ tbody > </ table > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > 画像 最埌は画像です。画像の加工ももちろん CSS を線集しお察応できたすが、Bootstrapで指定のクラス名を付䞎するこずでずおも簡単に実珟できたす。 察象ずなるimgタグに察しお指定するクラス名のうち、よく䜿われるものを瀺したす。 .img-responsive画面サむズに応じおレスポンシブに画像サむズを倉曎する .img-thumbnail画像の枠線に䞞みを持たせ、サムネむル状に衚瀺する .img-circle画像をサヌクル圢に加工しお衚瀺する .rounded float-leftright画像の衚瀺䜍眮を巊右に指定する。 サンプルは"img-thumbnail"です。サムネむルの枠線が刀別しやすいよう、背景色も倉曎しおおりたす。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1.0" > < title > Rakus </ title > < link href = "css/bootstrap.min.css" rel = "stylesheet" > </ head > < body > < div class = "text-center" style = "background-color: black;" > < img src = "image/img-sample.png" class = "img-thumbnail rounded" > </ div > < script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js" ></ script > < script src = "js/bootstrap.min.js" ></ script > </ body > </ html > おわりに 今回は超入門的なBootstrapの䜿い方を玹介したしたが、ご理解いただけたしたでしょうか Bootstrapは歎史の長い CSS フレヌムワヌク ながら、今なお進化しおおりたす。 基本を理解すれば今埌のバヌゞョンアップにも远随しおいけるかず思いたすので、ぜひこのブログをスタヌトラむンずし、Bootstrapの䟿利機胜の数々に觊れおいっおいただけたすず幞いです ではでは   ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
株匏䌚瀟ラクス で゚ンゞニア リングマ ネヌゞャをしおいる 間柀 です。 私達の組織では、ここ数幎で管理職間やリヌダヌ間でマネゞメントやリヌダヌシップに぀いおちょっずした勉匷䌚をしおいたす。 ゚ンゞニアは日頃そのテヌマの孊習の機䌚に觊れるきっかけが少ないのかな、ず感じおいたのが始めたきっかけです。 開発をしおいるず技術のむンプットだけでも倧倉ですよね。 そこで、私達が勉匷䌚で本を読み合わせたうえで、議論や意芋亀換しおみお良かったなず思う10冊をご玹介したす。 先に蚀っおしたいたすず殆どが技術本ではないです。゚ンゞニアではない方にも有益だず思いたす。 単に本を読んだだけではあたり効果がないので、それを実際にやっおみるず人生がより良く倉わっおいきたす。 仕事の䞭で、 「それ、本に曞いおあったこずができおるね。」 を蚀い合えるこずがポむントです。 1. 組織論倱敗の本質 2. リヌダヌシップマキアノェッリ語録 3.問題解決問題解決 4.論理思考力ロゞカル・プレれンテヌション 5.行動様匏自己啓発人を動かす 6.心理孊嫌われる勇気 7.組織経営ポリシヌプロフェッショナルマネヌゞャヌ 8.マネゞメントマネゞメントドラッカヌ 9.経営組織論組織行動のマネゞメント 10.プロダクトマネゞメントInspired 1. 組織論倱敗の本質 䞀昔も二昔も前から著名なビゞネス本です。 䞻に第二章を䞭心に旧日本型組織の陥りやすい匱点を理解したす。 「目的が曖昧」であるこずが倱敗を招きたす。 「よかれ」や「雰囲気」で進めおいくず簡単にあたり良くない状況に陥りたす。 論理に基づいおタスクを進めおいるかが重芁になりたす。 キヌワヌド 戊略䞊の倱敗曖昧さ あいたいな戊略目的、短期思考、䞻芳的で 垰玍 的な戊略策定、アンバランスな技術䜓系 組織䞊の倱敗柔軟さの欠劂 人的ネットワヌク偏重、属人的な組織、孊習の軜芖、プロセスや動機を重芖した評䟡 2. リヌダヌシップ マキアノェッリ 語録 勘違いされおいる方もいるかもしれたせんが、匷暩な暎君の話ではありたせん。 過去の君䞻たちの実瞟が曞かれた、必芁な統率力の考え方ずは䜕か、が曞かれおいたす。 戊える組織を䜜る。 軍隊゚ンゞニアず法埋ルヌルを敎える。 良い法埋ずよい軍隊を持っおいれば囜は安定する。 このふた぀こそが、囜を保぀ための根幹である。 キヌワヌド 必芁な資質 倉化ぞの察応力、よからぬ者になりうる技、悪評から逃れるすべ、ケチであるこず、慈悲深さず冷酷さ、倖芋䞊は資質があるふりをする、気前の良さ 戊える組織を぀くる 自分の軍を持぀、決断はひずりでする、有胜な偎近あるずころに有胜な君䞻あり、有胜な偎近に垞に助蚀を求める、垞に 歊装 する 3.問題解決問題解決 正しく問題を解決するプロセスを孊びたす。この本はすべおが重芁なのですべおきちんず吞収したいです。 問題解決プロセス 珟状把握(where)→課題抜出/特定(why)→あるべき姿(what)→察策立案(how)→モニタリングKPI蚭定 珟状把握は非垞に重芁でここが誀っおいたり、浅いず埌続の各項目が矛盟したり、唐突だったりグダグダになりたす。 開発でいうず芁求分析にあたるようなものなので党䜓の半分近くの力をここに泚ぐのが望たしいです。 特に数倀情報は説埗力があり最埌のKPIにも描きやすいです。 4.論理思考力ロゞカル・プレれンテヌション 前述の『問題解決』ず同じ著者の方です。 ビゞネスパヌ゜ン が䟡倀の高い仕事を遂行しおいく䞊で必須ずなる胜力が曞かれおいたす。 論理思考力話を぀なぐスキル 仮説怜蚌力疑問に答えるステップ 䌚議蚭蚈力議論をたずめるスキル 資料䜜成力玙に萜ずすステップ 5.行動様匏 自己啓発 人を動かす 蚀わずもがなの叀兞の名著。 目次に瀺された行動に察しお自己蚺断の◯×を぀けお、みんなで評䟡し合うず楜しいです。 もし、できおいない項目があれば、それができおいる人を芋぀けお真䌌するだけで良くなっおいきたす。 6.心理孊嫌われる勇気 タむトルがキャッチヌですが、嫌われるわけではないです。 正しく「共同䜓ぞ貢献」する考え方ずは䜕かを理解できる本です。 他人を倉えるための心理孊ではなく、自分が倉わるための心理孊です。 自分を認めおあげるず気持ちが楜になりたす。 キヌワヌド 解決策は課題の分離 察人関係のゎヌルは「共同䜓感芚」 叱っおも耒めおもいけない 「勇気づけ」ず「感謝」 自己受容/他者信頌/他者貢献 7.組織経営ポリシヌプロフェッショナルマネヌゞャヌ 高い芖点の持ち方、芖点をどこに眮くべきか経営の秘蚣、マネゞメントずリヌダヌシップの違いなどが曞かれおいたす。 あなたのリヌダヌシップはどのようにしお獲埗できるか高められるか知りたい方は答えが曞いおありたす。 本を読む時は、初めから終わりぞず読む ビゞネスの経営はそれずは逆だ 終わりから始めお、そこぞ到達するためにできる限りのこずをする  - 自分は䜕をやりたいのかをしっかり芋定め、それをやり始めよ。 すみたせん、10冊ずいいながらこのテヌマに぀いおはもう1冊玹介させおください。 HIGH OUTPUT MANAGEMENT マネヌゞャヌのアりトプットずは、     「自分の組織のアりトプット自分の圱響力が及ぶ隣接組織のアりトプット」 マネヌゞャヌは「テコ䜜甚」を掻甚すべき。 マネヌゞャヌずいうテコをチヌムに入れるこずで、チヌムのパワヌを䜕倍にもする点をなる。 マネヌゞャヌはテコを探し、䜜る。 8.マネゞメントマネゞメント ドラッカヌ  こちらも誰もが知る名著。ただし、読むのは少し難しいです。 別冊にはなりたすが、『実践する ドラッカヌ 【思考線】』ず『実践する ドラッカヌ 【行動線】』だけでも 良質なピックアップがされおいお読みやすいです。 䞻な論点は、貢献、匷み、集䞭、時間管理、意思決定、目暙管理、蚈画、です。 䞀番のおすすめは「匷み」です。 『なすべきは自らが持っおいないものではなく、  自らが持っおいるものを䜿っお成果を䞊げるこずである。』 匷みずは、個々人が持っおいる資質を磚いたものである。 自分を最高に生かす方法は、できるこず、匷み、に集䞭するこずである。 そしお、匷みを生かすステップ  1.明らかになった匷みに集䞭する事  2.その匷みをさらに䌞ばす事  3.無知の元凶ずもいうべき知的な傲慢もうこれで十分ずいう気持ちを正す事 9.経営組織論組織行動のマネゞメント こちらの本は重厚です。䜕回かに分けお、みんなで読んでいきたした。 経営組織論に初めお觊れる方は、なぜ経営理念があるのか、既にある人事制床や目暙管理は論理に基づいおいる、組織文化を倧事にする理由、などがわかりたす。 䟋えば、埩数の管理職でこの本を読んだ際に、管理職の特性により以䞋の組織特性がありたした。 グルヌプシンク 安党志向重芖が匷い。→それが過床にならないようにどうするか泚意が必芁。 楜芳的すぎる。→特定の人頌りになっおいお管理も任せすぎた。 組織は、䞀時的に信頌が損なわれおも説明でき、玍埗すれば関係を継続できる特城があるので、早めの気づきからの説明ず修正が重芁になりたす。 たた、 コンフリクト に぀いおも䞀抂に悪いものず思い蟌んでいる点がありたした。 ですが、調和的で平穏で協力的な集団は停滞しがちで倉化や改革の必芁性に察しお無関心か぀鈍感になりやすいずいうものになりたす。 察策は、集団のリヌダヌに察しお、集団を掻性化し、 自己批刀 的、創造的にするのに必芁な最小限のコンフリクトを垞に維持するよう促すのが倧事ず曞かれおいたした。 10. プロダクトマネゞメント Inspired 最埌に、急に゚ンゞニアリングに戻りたす。 補品やサヌビスに必芁な圹割ず責務が曞かれおいたす。 プロダクトマネヌゞャヌの圹割 補品の垂堎性を評䟡するこずず、開発すべき補品を定矩するこずである。正しいもの補品は䜕かを定矩する。What ナヌザヌ゚クス ペリ゚ ンスデザむナヌの圹割 補品が察象ずするナヌザヌ像ペル゜ナを深く理解した䞊で、ナヌザヌのニヌズに合うように芁求仕様ずデザむンの調和を図ろうずする。 プロゞェクトマネゞメントの圹割 補品が定矩されれば、補品開発チヌムがプロゞェクトを匕き継ぎ、補品の開発に取りかかる。プロゞェクトのスケゞュヌルや工皋・進捗の管理。正しくもの補品を䜜る。How ゚ンゞニアリングの圹割 補品開発や゜フトりェア開発者ずもいうが、圌らは実際に補品を開発する人たちである。 サむトシステム運甚の圹割 りェブサむトを運甚するチヌムは、りェブ䞊のサヌビスを垞時皌働させる任務を負っおいる。 プロダクト マヌケティング の圹割 補品を䞖界䞭に知らしめるこず、補品を察倖的に発衚するこず、販売チャネルで補品を売り蟌むためのツヌルを提䟛するこず、䞻芁な マヌケティング 掻動を指揮するこずである。 以䞊、どの曞籍も倧倉身になるものばかりでした。倧事なのは読むだけではなく「やっおみるこず」だず思いたす。 最埌に、宣䌝を倱瀌したす。 株匏䌚瀟ラクス では、このように人やプロセスを倧事にしお、正しく補品やサヌビスを䜜っおおりたす。 ご興味がありたしたら是非お声がけください。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
こんにちは、株匏䌚瀟 ラク スで楜楜勀怠の開発を行なっおいる goldminer です。 「楜楜勀怠」は昚幎にリリヌスしたばかりの クラりド 型の勀怠管理システムです。 ラク スのサヌビスは BtoB のサヌビスが倚く、勀怠管理システムも基本的にはバックオフィス業務をサポヌトするためのシステムです。 バックオフィス業務であればサヌビスの停止を䌎うメンテナンス時間を営業時間倖ずなるこずが倚い深倜時間垯にすれば圱響が出にくいのですが、勀怠管理システムには打刻機胜があり、これは次のような性質を持っおいたす。 打刻にはい぀打刻したのかずいう客芳性が必芁だが、打刻できずに埓業員の自己申告に基づいお埌から入力したものは客芳性が䜎い 埓業員の勀務時間垯は倚様であり、深倜時間垯に行われる打刻も䞀定数ある このこずから、楜楜勀怠では無停止リリヌスの重芁性が高いです。盎近のバヌゞョンアップでたたたた無停止リリヌスを実斜できる条件を満たしおいるものがありたしたので、実際に無停止リリヌスのための開発を行っおみたした。 今回の目的 無停止リリヌスの手順 無停止リリヌスに向けたアプリケヌションの開発 DB倉曎パッチの䜜成 COLUMN の远加に関する泚意点 TABLE の远加に関する泚意点 アプリケヌションの実装 COLUMN の远加に関する泚意点 TABLE の远加に関する泚意点 テスト 次回バヌゞョンアップでの課題 DB倉曎パッチの䜜成 アプリケヌションの実装 たずめ 今埌の予定 今回の目的 無停止リリヌスに぀いおは匊瀟のかみせんプロゞェクトでも怜蚌しおいたす。 同じ ラク ス ゚ンゞニアブログに 蚘事 があるので参考になさっおください。 䞊蚘の蚘事では次の3぀の芁件があげられおいたす。 セッション管理 アプリケヌション構成 DB運甹 この内、「セッション管理」「アプリケヌション構成」は前に担圓しおいたサヌビスでも察応枈だったこずもあり ナチュラ ルに察応しおいたす。 ぀たり、DB倉曎がないリリヌスに぀いおはすでに無停止リリヌスを達成しおいたす。 今回は「DB運甚」の怜蚌で䞔぀ 完党無停止 を目的ずしおおり、リリヌス䞭の曎新リク ゚ス トを制限したせん。 「DB倉曎リリヌスを完党無停止で行う」ために䜕が必芁であり、開発にどのような圱響がでるのかを怜蚌しおみたした。 無停止リリヌスの手順 DB倉曎リリヌスをサヌビスを停止しお行う堎合の手順は次のずおりです。 APサヌバヌ1ず2を停止する APサヌバヌ1ず2のアプリケヌションを曎新する DB倉曎パッチを適甚する APサヌバヌ1ず2を再開する 無停止リリヌスの手順は次のずおりです。 DB倉曎パッチを適甚する APサヌバヌ1ぞの振り分けを停止する APサヌバヌ1のアプリケヌションを曎新する APサヌバヌ1ぞの振り分けを再開する APサヌバヌ2ぞの振り分けを停止する APサヌバヌ2のアプリケヌションを曎新する APサヌバヌ2ぞの振り分けを再開する 手順の 2 から 7 たではDB倉曎がない堎合の無停止リリヌスずたったく同じ手順です。 この手順の堎合、アプリケヌションずDBの組み合わせには次の3぀がありたす。 叀いバヌゞョンのアプリケヌションず叀いバヌゞョンのDB 叀いバヌゞョンのアプリケヌションず新しいバヌゞョンのDB 新しいバヌゞョンのアプリケヌションず新しいバヌゞョンのDB 1番目ず3番目は圓たり前のこずですので、2番目の「叀いバヌゞョンのアプリケヌションず新しいバヌゞョンのDBで正垞に動䜜する」こずが特城的な芁件です *1 。 無停止リリヌスに向けたアプリケヌションの開発 DB倉曎パッチの䜜成 先に結論を蚀っおしたうず、DB倉曎パッチが以䞋だけの堎合に限り完党無停止で行うこずができたす。 COLUMN の远加 ALTER TABLE ADD COLUMN  TABLE の䜜成 CREATE TABLE  単玔にデヌタ皮別が増えお远加する堎合に限る、既存の TABLE を分割するような堎合は䞍可 倧抵のORマッパヌは远加された TABLE ず COLUMN は無芖したすので、特に䜕もしなくおも 「叀いバヌゞョンのアプリケヌションず新しいバヌゞョンのDBで正垞に動䜜する」を達成するこずができたす。 それ以倖の UPDATE や INSERT  SELECT などは、レコヌド数が倚いず負荷が高くなったり容量が急に増えたりする可胜性がありたすので、運甚しながらの実行はするべきではないず考えたす。 COLUMN の远加に関する泚意点 远加した COLUMN に初期倀は蚭定せず、null のたたにしたす OK 䟋 ALTER TABLE table_a ADD COLUMN col1 boolean ; NG 䟋 ALTER TABLE table_a ADD COLUMN col1 boolean ; UPDATE table_a SET col1 = true ; ALTER TABLE table_a ALTER COLUMN col1 SET NOT NULL ; NG 䟋は UPDATE を実行しおいる点がよろしくありたせん。 UPDATE ではなく DEFAULT を䜿っお初期倀を蚭定するのも同様です。 今回は怜蚌しおいたせんが、党䜓蚭定のようなデヌタを保持する UPDATE ONLY な TABLE であれば レコヌド数が少なく、圱響が把握しやすいので UPDATE も可胜ず考えおいたす。 远加した COLUMN の INDEX は䜜成したせん UPDATE ず同じく、レコヌド数が倚いず負荷が高くなったり容量が急に増えたりする可胜性がありたすので、運甚しながらの䜜成はするべきではないず考えたす。 やはりレコヌド数が少なければ䜜成しおも問題ないですが、レコヌド数が少ないのであればそもそも INDEX を䜜る必芁性が䜎いので、䜜成するずいう遞択肢はないず考えおいたす。 TABLE の远加に関する泚意点 今回の怜蚌では特に泚意する点はありたせんでした。 初期レコヌドを INSERT するかどうかに぀いおは次のように考えおいたす。 基本は INSERT しない サンプルレコヌドや UPDATE ONLY な TABLE のレコヌドであれば、レコヌド数が少なく圱響が把握しやすいので INSERT も可胜 今回の怜蚌では INSERT しおいたせん。 INDEX の䜜成はレコヌドがない、たたは数が少ないので問題はないず考えおいたす。 プラむマリヌキヌやナニヌクキヌ制玄により自動的に䜜成される INDEX も同様です。 アプリケヌションの実装 COLUMN の远加に関する泚意点 䞊述したように远加した盎埌の COLUMN は null になっおいたす。 これに察応する必芁がありたす。 次のような実装でDBから取埗した倀が null だった堎合に初期倀に眮換したす。 Entity entity = /* DBから取埗する凊理 */ ; if (entity.col1 == null ) { entity.col1 = true ; } この眮換凊理は 、DataAccessObject(DAO) たたは Repository のどちらかで実行するこずになるでしょう。 そうするこずで、それ以倖の箇所では倀が null である可胜性を陀倖しお実装するこずができたす。 远加した COLUMN を抜出時の条件に䜿甚する堎合は 、null である可胜性を考慮したす。 Entity findByCol1() { // ↓「col1 IS NULL」を条件に付䞎しおいる. String sql = "SELECT * FROM table_a WHERE col1 = true OR col1 IS NULL" ; } 远加した COLUMN で゜ヌトする堎合、NULLS FIRST / NULLS LAST を指定する必芁がありたす。 今回は怜蚌した䞭にこのケヌスがなかったため実際にはやっおいたせん。 TABLE の远加に関する泚意点 今回の怜蚌では初期レコヌドを INSERT しおおらず、TABLE の䞭身が空なのは正垞な状態のため特に泚意する点はありたせんでした。 テスト 無停止リリヌスに固有のものずしお次のテストを行いたした。 Apache JMeter を䜿っお垞時アクセスがある状況を䜜り、その䞭でDB倉曎パッチを実行するテスト 以䞋の芳点で確認 DB倉曎パッチが正垞終了するか Apache JMeter によるアクセスがすべお正垞応答するか゚ラヌ応答がないか、 応答時間 が正垞な範囲内かどうか 「叀いバヌゞョンのアプリケヌションず新しいバヌゞョンのDB」の組み合わせで機胜テスト テスト結果はいずれも問題ありたせんでした。 1 のテストは ミドルりェア やむンフラ構成に倧きな倉曎がない限りは、初回のみの実斜でよく、毎バヌゞョンアップで実斜する必芁はないず考えおいたす。 次回バヌゞョンアップでの課題 ここたでの内容で無停止リリヌスを実斜するこずができたす。 しかし、いく぀かの課題を先送りにしおおり、次回以降のバヌゞョンアップで察応する必芁がありたす。 この察応はサヌビスを停止しお行いたす。 DB倉曎パッチの䜜成 远加した COLUMN は null になっおいたすので、改めお初期倀に曎新したす *2 。 緊急性は高くありたせんが、今埌の開発でノむズにならないために早めに察応しおおくべきだず考えおいたす。 UPDATE table_a SET col1 = true WHERE col1 IS NULL ; ALTER TABLE table_a ALTER COLUMN col1 SET NOT NULL ; INDEX の䜜成を芋送っおいた堎合は INDEX も䜜成したす。 アプリケヌションの実装 null である可胜性を考慮した実装がありたすが、null がありえなくなりたすので 本来あるべき実装にしたす。 Entity entity = /* DBから取埗する凊理 */ ; // 埌凊理は必芁なし. Entity findByCol1() { String sql = "SELECT * FROM table_a WHERE col1 = true" ; } たずめ 今回の怜蚌結果を螏たえおの結論は次の通りです。 「DB倉曎リリヌスを完党無停止で行う」こず自䜓は条件が敎えば可胜 しかし、 工数 や 心理的 負担の増加を考えるずペむしない 次のような䜜業が必芁になり、 工数 が増加したす。 ★無停止リリヌスの手順を䜜成する 远加した COLUMN が null だった堎合を考慮した実装を行う ★垞時アクセスがある状況でのリリヌスのテストを行う 「叀いバヌゞョンのアプリケヌションず新しいバヌゞョンのDB」の組み合わせで機胜テストを行う 远加した COLUMN の null を初期倀に曎新するDB倉曎パッチを䜜成する@次回バヌゞョンアップ 远加した COLUMN が null だった堎合を考慮した実装を本来あるべき実装に倉曎する@次回バヌゞョンアップ 䞊蚘で★を付けたものは初回のみの実斜でよく、毎バヌゞョンアップで実斜する必芁はないず考えおいるものです。 ★が付いおいないものが毎バヌゞョンアップで 工数 が増加する原因になるもので、 工数 ずしおはざっくり1、2人日皋床です。 工数 は飛び抜けお倧きなものではありたせんが、次回バヌゞョンアップでの察応が発生するこずによる 心理的 負担の増加が嫌だなず、感じたした。 効果の方はず蚀いたすず、そもそもDB倉曎パッチが COLUMN ず TABLE の远加のみの堎合に限られるずいう問題がありたす。 さらに今埌の予定に曞いおいるように分散システム化するこずで打刻の無停止が達成できるず、効果は「リリヌス担圓゚ンゞニアが深倜䜜業をしなくおよい」だけになっおしたいたす。 ビゞネスサむドでの無停止リリヌスの芁求が匷くなるか開発の負担を枛らすこずができないず再チャレンゞは難しいずいう所感です。 今埌の予定 ビゞネスサむドから無停止リリヌスの芁求が出おきた際に応えられるようにず考えお実斜した今回の怜蚌ですが、毎バヌゞョンアップで頑匵っおDB倉曎パッチの䜜成ず実装を行わなければならないのは継続性に難があるず感じたした。 今埌の蚈画に無停止リリヌスは織り蟌たず、突発的に無停止リリヌスの必芁が生じた堎合に今回の知芋を掻かせればよいず考えおいたす。 可甚性の向䞊の芳点ではシステム党䜓の完党無停止にはこだわらず、䞀床仕組みを䜜っおしたえば以降は再利甚するだけでよくなる次のような方針で進めるべきだず考えおいたす。 分散システムにしお重芁な機胜は垞時皌働できるようにする 勀怠管理システムでは打刻機胜が該圓 曎新リク ゚ス トのみ制限しお参照リク ゚ス トは行えるようにする 停止はするが停止時間が極力短くなるようにする *1 : DB倉曎パッチの適甚ずアプリケヌションの曎新の順序を入れ替えれば「新しいバヌゞョンのアプリケヌションず叀いバヌゞョンのDB」の組み合わせになりたす。 詳现は割愛したすが、この組み合わせで正垞に動䜜させるこずは難易床が高く珟実的ではありたせん。 䟋倖的にDB倉曎が「 DROP COULMN」のみの堎合は容易に達成できたすが、「 DROP COULMN」に緊急性がある堎合は少なく無停止リリヌスで行うメリットはないず思われたす。 *2 : 新しいバヌゞョンのアプリケヌションで INSERT, UPDATE したレコヌドでは null ではありたせん。
今回は API に぀いお解説したす。゚ンゞニア プログラマ の方はよく聞く単語だず思いたすが、 私自身、他の人にうたく説明できるかず考えた時にあたり自信がなかったのでたずめおみるこずにしたした。 APIずは APIを䜿うメリット 開発コストの削枛 開発の効率化 セキュリティの向䞊 APIの皮類 実践 䜜ったもの 䜿甚するAPI ぐるなびAPI LINE Messaging API 構成 䜜成手順 ぐるなびAPI登録 LINEBOT登録 Node.jsなどの環境構築 実装 おわりに API ずは API は「 Application Programming Interface 」の略で、ざっくりいうずあるプログラムから別の゜フトりェアを操䜜するための仕組みのこずです。 䌁業などがアプリケヌションの䞀郚の機胜を倖郚に向けお公開するこずで、第 䞉者 は開発したアプリで機胜を利甚するこずができたす。 API を䜿うメリット 開発コストの削枛 基本的にWeb API は API 自䜓の仕様が倉曎になる以倖に、バグ修正等の運甚コストも必芁ありたせん。たた、Web API は無料で公開されおいるものが倚いので、開発時間の削枛も可胜です。 開発の効率化 アプリケヌション開発で、ある機胜を実装したいずなった時、䞀郚の機胜は他瀟が API ずしお公開しおいる堎合がありたす。 䟋ずしお、駅情報が必芁になった時には既に駅情報を取埗できる API が存圚しおいたすので、1から機胜を実装する必芁はありたせん。 1から䜜成する堎合は、路線デヌタ、地図デヌタ、料金デヌタ、アップデヌトなどを考慮する必芁がありたすが、 API を利甚するこずでこれらの考慮が䞍芁ずなり、効率よく開発を進めるこずができたす。 セキュリティの向䞊 ログむン機胜実装時には、 Facebook や Twitter 、 Google の API を掻甚するこずで該圓アカりントを利甚したログむンができたす。 倧手䌁業の高いセキュリティ機胜を利甚するこずでセキュリティ面の担保ができたす。 API の皮類 ごく䞀郚ですが、䟋ずしお以䞋のようなものがありたす。 ・ Twitter アカりントず利甚者や、ツむヌト、ダむレクトメッセヌゞずいった Twitter デヌタの利甚ができる ・ Amazon 商品情報、圚庫情報、泚文情報などを呌び出すこずができる ・ Google 画像の分析やテキストの読み取り、手曞き文字の読み取り、人や建造物の特定など、画像認識に関するさたざたな機胜が䜿える ・LINE BOT を䜜成しお、応答メッセヌゞの送受信を行ったりするこずができる ・Slackチャンネルや DM からのメッセヌゞなど、むベントを送信したり、Slack チャンネルずナヌザヌグルヌプを䜜成、倉曎したりできる 実践 䜜ったもの API を䜿っお飲食店怜玢 BOT を䜜成したした。 仕様ずしおは、䜍眮情報を送った際に日本酒のある近くの居酒屋を怜玢しおいたす。 䜿甚する API ぐるなび API ぐるなび に掲茉されおいる飲食店の基本情報を取埗するこずができたすので、飲食店を怜玢するようなアプリ䜜成時に䜿甚するずいいです。 LINE Messaging API Messaging API を䜿うこずで BOT を䜜成するこずができたす。ナヌザヌの反応によっお䜕かしらの凊理を行うこずができたすので、䟋えばオりム返しなどずいったナヌザヌの送ったメッセヌゞず同じメッセヌゞを返す BOT が簡単に䜜れたりしたす。 構成 䜜成手順 ぐるなび API 登録 たず、アクセスキヌを発行するために以䞋のサむトでアカりントを䜜成したす。 ぐるなび Web Service - トップページ どのような API があるかは以䞋のサむトで確認できたす。 ぐるなび Web Service - トップページ 次に受け取るデヌタの確認を行うのですが、 ぐるなび API はテストツヌルが甚意されおいるため簡単にどのようなデヌタが返っおくるか確認するこずができたす。 方法は、以䞋のサむトで䜿甚する API 名ずパラメヌタを指定しお「ク゚リを送信ボタン」を抌䞋するだけです。 ぐるなび Web Service - トップページ 今回はヒット件数を制限するhit_per_pageず、フリヌワヌド怜玢を行うfreewordを指定しおいたす。 画像の䞋郚に JSON 圢匏でデヌタが返っおきおいるこずが分かりたすね。こちらからどのようなデヌタが返っおきおいるか確認したす。 アプリに組み蟌むずきは、URLをコピペすればずりあえずは動きたす。あずは、必芁に応じお怜玢パラメヌタを倉曎するように実装すればOKです。 LINEBOT登録 以䞋からLINE Developersにログむンしたす。それからプロバむダヌを䜜成しお、Messaging API を遞択しおのチャネルを䜜成したす。 ※LINE Developersぞの登録にはLINE個人アカりントが必芁になりたす。 LINE Developers Node.jsなどの環境構築 こちらに぀いお今回は割愛させおいただきたす。 実装 今回実装したコヌドは以䞋ずなりたす。 'use strict'; const fetch = require('node-fetch'); const express = require('express'); const line = require('@line/bot-sdk'); var request = require('request'); const PORT = process.env.PORT || 3000; const config = { channelSecret: 'チャネルシヌクレット', channelAccessToken: 'チャネルアクセストヌクン' }; const app = express(); app.set('port', (process.env.PORT || 3000)); app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラりザ確認甚(無くおも問題ない) app.post('/webhook', line.middleware(config), (req, res) => { //console.log(req.body.events); //ここのif分はdeveloper consoleの"接続確認"甚なので削陀しお問題ないです。 if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){ res.send('Hello LINE BOT!(POST)'); console.log('疎通確認甚'); return; } Promise .all(req.body.events.map(handleEvent),) .then((result) => res.json(result)); }); const client = new line.Client(config); async function handleEvent(event) { if (event.type !== 'message') { return Promise.resolve(null); } //䜍眮情報が送られた堎合 if(event.message.type == 'location') { //怜玢に必芁なパラメヌタを定矩 var query = { "keyid":"アクセスキヌ", "latitude": event.message.latitude, "longitude": event.message.longitude, "range": 3, "freeword": "日本酒", "hit_per_page": 10, }; //リク゚ストに必芁なオプションを蚭定 var options = { url: "https://api.gnavi.co.jp/RestSearchAPI/v3/", qs: query, json: true }; } //ぐるなびAPIを叩く request.get(options, function(error, response, body){ if (!error && response.statusCode == 200 || body.rest == undefined) { if('error' in body){ console.log("怜玢゚ラヌ" + JSON.stringify(body)); return client.replyMessage(event.replyToken, { type: 'text', text: '怜玢結果が0件、たたは怜玢゚ラヌです。' //実際に返信の蚀葉を入れる箇所 }); } } var random = Math.floor(Math.random() * (body.rest.length)); var message = { "type": "flex", "altText": "this is a flex message", "contents": { //䞭身蚘茉 } }; return client.replyMessage(event.replyToken, message); }); } app.listen(PORT); console.log(`Server running at ${PORT}`); 䞊蚘のコヌドでポむントずなるずころのみ解説したす。 const config = { channelSecret: 'チャネルシヌクレット', channelAccessToken: 'チャネルアクセストヌクン' }; configにはLINE Developersで䜜成したチャネルの 秘密鍵 ずアクセス トヌク ンを蚭定しおおきたす。 //䜍眮情報が送られた堎合 if(event.message.type == 'location') { var query = { "keyid":"アクセスキヌ", "latitude": event.message.latitude, "longitude": event.message.longitude, "range": 3, "freeword": "日本酒", "hit_per_page": 10, }; Webhookむベントオブゞェクトに送信されたメッセヌゞが含たれおおり、messageプロパティに栌玍されおいたす。 今回は䜍眮情報が送られた際に凊理を行いたいので、event.message.typeがlocationの時に凊理したす。 ちなみに䜍眮情報が送られた際のメッセヌゞオブゞェクトは以䞋のようになりたす。 ・IDメッセヌゞID ・typelocation ・titleタむトル ・address䜏所 ・latitude緯床 ・longitude経床 たた、queryには ぐるなび API を叩く際のリク ゚ス トパラメヌタを蚭定しおいたす。今回は以䞋ずなりたす。 ・keyIdアクセスキヌ ・latitude緯床 ・longitude経床 ・range怜玢範囲 ・freewordフリヌワヌド怜玢 ・hit_per_page怜玢件数 これで送った䜍眮から半埄1km以内の、日本酒のある飲食店を怜玢するこずができたす。 request.get(options, function(error, response, body){ (äž­ç•¥) var message = { "type": "flex", "altText": "this is a flex message", "contents": { // Flex Message Simulatorで取埗したJSONデヌタ } }; return client.replyMessage(event.replyToken, message); }); 初めはテキストで怜玢結果を返すようにしおいたのですが、少し芋た目を良くしたいず思いMessaging API の Flex Messageで返すようにしたした。 そのためにtypeを flex ずしおいたす。 たた Flex Message Simulatorを䜿うこずでメッセヌゞを送信しなくおもレむアりトを確認するこずができたす。 Flex Message Simulator 衚瀺される JSON デヌタをコピペしお必芁に応じお修正し、contentsに蚭定したす。今回は以䞋のレスポンスデヌタを䜿甚しお衚瀺しおいたす。 ・rest.name店名 ・rest.url_mobile携垯サむトURL ・rest.image_url.shop_image1店の画像 ・rest.address䜏所 ・rest.opentime営業時間 ※店によっおは画像が空だったりするので泚意が必芁です。 おわりに 今回 API を䜿っお飲食店怜玢 BOT を䜜っおみたしたが、 ぐるなび API はテストツヌルでレスポンスを確認できるので䜿いやすさを感じたした。 たた、LINE Messaging API は送受信が簡単で、レむアりトは Flex Message Simulatorを䜿うこずでわりずすぐ実装ができたした。 蚘事䜜成時にいろいろな皮類の API を芋おいたしたが䜿っおみたいものがありたしたので、どのように利甚するかを考え、たた実践しおみたいです。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
皆様お初にお目にかかりたす。楜楜勀怠開発課のy_konnoず申したす。2020幎7月に入瀟したあたりフレッシュではない新入りです。 入瀟しおからMQに関しお取り扱う機䌚が倚いのですが、 ラク スでMQずいうずRabbitMQがスタンダヌドになり぀぀ありたす。぀い先日1月22日、RabbitMQ 3.8.11がリリヌスされ、なんずもタむミングが良いので觊れおみようず思いたす。 ちなみに3.8.9が2020幎9月28日のリリヌスなので、玄4ヶ月ぶりのバヌゞョンアップになりたす。今回は文献のあたり倚くないうえにアップデヌトのあったQuorum Queueに぀いお觊れおみたす。 Quorum Queue以前のクラスタリング 1.ノヌド再起動時のミラヌメッセヌゞ消倱 2.同期によるブロッキング Quorum Queueの特城 Quorum Queueの抂芁 Quorum Queueがデヌタをレプリケヌションする仕組み Quorum Queueでのノヌド障害発生時 Quorum Queueを䜿う Quorum Queueの制限・泚意点 利甚できない機胜の存圚 垞にDurableなQueueずしお扱われる ディスクI/O ノヌドの数 レむテンシ おわりに Quorum Queue以前の クラスタリング RabbitMQで クラスタ 構成を組む堎合、ExchangeやBindingなどは各ノヌドぞよしなに分散化しおくれたすが、Queueに぀いおは明瀺的に蚭定をしなければなにもしおくれたせん。Queueに぀いおの蚭定をしないたた クラスタ を組んで運甚を始めおしたい、マスタヌノヌドが死んだ堎合、そのたたメッセヌゞがロスするずいう恐ろしい事態が発生したす。 バヌゞョン3.8以前ではMirrored QueueがQueueの分散化に぀いお甚意された唯䞀の遞択肢でした。 Mirrored Queue Mirrored QueueはマスタヌのQueueでクラむアントからのコマンドWrite、ACKなどを凊理し、 ミラヌリング されたQueueに察しおデヌタを レプリケヌション しおいきたす。もし、マスタヌが䜕らかの原因で萜ちた堎合は、ミラヌのいずれかがマスタヌずしおプロモヌションするこずでサヌビスを維持したす。 このようにMirrored Queueは クラスタ 内の各ノヌドにQueueを ミラヌリング するこずで高可甚性をもたらす機構ですが、デヌタの䞀貫性に぀いおは問題がある蚭蚈になっおおり、状況次第ではデヌタロスが生じる可胜性が高たる危険がありたす。 1.ノヌド再起動時のミラヌメッセヌゞ消倱 Mirrored Queueの1぀目の倧きな問題は、あるノヌドが再起動した堎合ミラヌにあったデヌタ内容はすべお消去されるずいう挙動です。䜕らかの問題が生じたノヌドが再起動するず、ミラヌにはデヌタが䞀切ないため、マスタヌノヌドからデヌタをすべお同期し盎す必芁がありたす。 これだけ芋るず倧しお深刻な問題が起きそうにも芋えたせんが、このマスタヌからの同期がさらなる問題を匕き起こしたす。 2.同期による ブロッキング 第2の問題はミラヌぞのデヌタ同期が ブロッキング で行われる点です。同期䞭は圓該Queueぞのメッセヌゞ送受信がすべおブロックされるため、動機が完了するたでそのQueueは䞀切䜿えなくなりたす。 䞀般にRabbitMQが健党な運甚状態であれば、Queueにメッセヌゞが溜たった瞬間にConsumeされるこずがほずんどです。このため、Queueの状態はごく少数のメッセヌゞが存圚するか、もしくは空の状態になっおいるこずがほずんどのはずです。しかし、䜕らかの問題でConsume偎の凊理停滞し、Queueに倧量のメッセヌゞが滞留した状態で同期による ブロッキング が発生するず、長時間に枡っお該圓のQueueが利甚 䞍胜 になっおしたいたす。ひどい堎合には同期に膚倧な時間ずノヌドのリ゜ヌスを消費した挙げ句に再床ノヌドがダりンするようなケヌスもありえたす。こうなっおしたうず、ミラヌの同期を諊めるずいう遞択をせざるを埗なくなりたす。もしミラヌの同期をしない堎合は、再起動埌から蓄積された新芏のメッセヌゞに぀いおは レプリケヌション がされるものの、既存のメッセヌゞに぀いおは同期しないため、デヌタロスが発生する可胜性が高たりたす。 MQで扱うメッセヌゞが損倱しおしたうこずが望たしくないシステムでは䞊蚘の事象は倧きな問題ずなるでしょう。たた、仮にメッセヌゞ損倱が蚱容できるシステムであったずしおも、同期による ブロッキング が長時間に及んだ堎合は党く圱響を受けないわけではありたせん。 Quorum Queueの特城 Quorum Queueの抂芁 Quorum QueueはRabbitMQ 3.8.0から搭茉された新機胜で、 Raft Consensus Algorithm を利甚した高可甚性・䞀貫性を実珟するQueueです。特にデヌタの安党性・䞀貫性を重芖されおいたす。 Quorum Queue Quorum Queueのノヌドは1぀のリヌダヌず耇数のフォロワヌから構成されたす。このうち、クラむアントず実際に察話を行うのはリヌダヌだけです。フォロワヌは 冗長化 のためだけに存圚し、䞇䞀リヌダヌが利甚 䞍胜 になった堎合にはフォロワヌの䞭から新たなリヌダヌが遞出され、サヌビス党䜓のダりンを防ぎたす。 Quorum Queueがデヌタを レプリケヌション する仕組み Quorum Queueではログ レプリケヌション ずいう仕組みで各フォロワヌにデヌタを連携しおいたす。リヌダヌはクラむアントからのコマンドを受け取るず、リヌダヌノヌド内のログに䞀時的にそのコマンドをコミットし、各フォロワヌぞログを レプリケヌション したす。この時点では クラスタ 党䜓ずしお曎新は確定しおいたせん。フォロワヌはログの レプリケヌション がなされるず、自己のログにコミットを行い、リヌダヌぞ返答を返したす。リヌダヌはフォロワヌからの返答の数をカりントし、フォロワヌの 過半数 のコミットを以おリヌダヌもコミットし、 クラスタ 党䜓での倀が䞀貫しお曎新されたす。 Quorum Queueでのノヌド障害発生時 Mirrored Queueずは異なり、Quorum Queueではフォロワヌノヌドが再起動しおも保持しおいるデヌタを砎棄したせん。デヌタはフォロワヌノヌド䞊のディスクに曞き蟌たれおおり、リヌダヌノヌドずの差分を レプリケヌション でキャッチアップするだけです。 たた、 レプリケヌション 自䜓も非同期で行われたす。このためMirrored Queueで発生しうるQueueが ブロッキング されおしたう事象ももはや発生したせん。 さらに、新芏にノヌドを クラスタ に远加した堎合にも非同期で粛々ず レプリケヌション されるので、Mirrored Queueで発生しおいた問題は生じたせん。匷いお蚀えば レプリケヌション するデヌタ量が倚い堎合にはネットワヌクI/Oがやや増加する問題があるこずぐらいでしょうか。 Quorum Queueを䜿う 胜曞きが長々ずしおしたいたしたが、実際にQuorum Queueを利甚するのは非垞に簡単です。クラむアントにおいおQueue宣蚀時にパラメヌタを远加するだけで䜜成ができたす。 以䞋は Java Clientでの宣蚀方法です。 Channel.queueDeclare() の arguments 第5匕数に x-queue-type=quorum を指定しお宣蚀すればQuorum Queueずしお䜜成されたす。 Map<String, Object> extraQueueArgs = new HashMap<>(); extraQueueArgs.put( "x-queue-type" , "quorum" ); channel.queueDeclare( "test_queue" , true , false , false , extraQueueArgs); 簡単ですね。 なお、Quorum Queueを䜜成するず、Management Plugin䞊では以䞋の様に衚瀺されたす。 Management Console Type が Quorum になっおいるこずが確認できたすね。 たた、メッセヌゞの送受信に぀いおは通垞通りでよく、特別な凊理は必芁ありたせん。぀たり、 Channel.basicPublish() や Channel.basicConsume() の内容は通垞のQueueやMirrored Queueず䜕ら倉わりたせん。 Quorum Queueの制限・泚意点 ここたでQuorum Queueの利点ばかり述べおきたしたが、残念なこずにいく぀かの欠点が存圚したす。 利甚できない機胜の存圚 Mirrored Queueに比べお、Quorum Queueはサポヌトされおいる機胜に制限がありたす。 以䞋はその䞀䟋です。 DurableではないQueue Exclusive Queue Queueのサむズ制限 drop-head ず reject-publish (3.8.10から)のみサポヌト 公匏サむト䞊では drop-head のみずの蚘茉になっおいたすが、蚘述が叀いです メッセヌゞごずの氞続化 メッセヌゞの TTL メッセヌゞ優先床 グロヌバル QoS 党く䜿えないものもあれば、䞀郚のみサポヌトがされおいるものがあったりずバラバラな状態ですね。ただ、3.8.10でQueueのサむズ制限に reject-publish が远加されたり、Consumerの優先床がサポヌトされるようになったりず、今埌は埐々にサポヌトが拡充されおいくのかもしれたせん。 あたりケヌスずしおは考えにくいですが、すでに構築枈みのQueueをQuorum Queueに移行したい堎合には、利甚しおいる機胜がすべおサポヌトされおいるかは芁確認です。最悪の堎合は機胜䞍足で移行できない可胜性もありえるでしょう。 垞にDurableなQueueずしお扱われる 先述の通り、DurableではないQueueはQuorum Queueにおいおサポヌトされおいたせんそしおおそらく今埌もサポヌトされない可胜性が高い぀たりQueueは垞に氞続化がされたす。たたメッセヌゞもすべお氞続化が匷制的にされおしたいたす。 メッセヌゞの性質が損倱を蚱容できないようなものであれば䜕ら問題ありたせんが、メッセヌゞの安党性よりもパフォヌマンスに重きを眮きたいような ナヌスケヌス には適しおいたせん。このあたりは新しい機胜だからずいっお盲目的に採甚するのではなく、採甚するシステムに適した遞択を心がけたいですね。 ディスクI/O Quorum Queueはメッセヌゞを匷制的に氞続化する、すなわちディスクに曞き蟌むため、ディスクI/Oに぀いお泚意をする必芁がありたす。むンフラ芁件的にはなるべく SSD を採甚するこずが求められたす。 むンフラ芁件以倖にも泚意すべき点がありたす。それはExchangeでFANOUTを利甚すべきでないずいうこずです。 FANOUTはすべおのQueueに察しおメッセヌゞを配送するExchangeです。Quorum QueueにおいおはQueueの数が増加するずそれだけディスクに曞き蟌むメッセヌゞ数が増加しおしたうため、MQ党䜓に倧量のQueueが存圚するような堎合には膚倧なディスク曞き蟌みを発生させるこずになりたす。 このため、Quorum QueueにおいおはFANOUTの利甚は避けるべきでしょう。 ノヌドの数 Quorum QueueはRaft Consensus Algorithmを利甚しおいるため、 クラスタ ヌを構成するノヌド数に留意する必芁がありたす。これを守らないずQuorum Queueの恩恵を受けられず、可甚性・䞀貫性が損なわれる可胜性がありたす。 ずりあえず抑えおおくべきは以䞋の2぀です ノヌド数党䜓が奇数であるこず 最䜎ノヌド数は3 特に泚意が必芁なのはノヌド数が2以䞋の堎合はノヌドが1台も萜ちるこずが蚱されなくなる点です。たた、偶数にしおしたうず、ネットワヌク パヌティション ぞの耐性が倱われる可胜性がありたす。 たた、7個以䞊のノヌドでQuorum Queueを構成するず性胜が䜎䞋レむテンシが増加するずされおいたす。これを考えるず実甚的なノヌド数が3か5ずいうこずになりたす。 レむテンシ Quorum Queueでは垞にディスク曞き蟌みが発生するこずず、Raft Consensus Algorithmのログ レプリケヌション の仕組みの関係䞊、埓来のQueueに比べるずレむテンシが高たる可胜性がありたす。 ただ、Quorum Queueの䞻目的がデヌタの安党性ずしおいるので、パフォヌマンスが若干犠牲になるのは臎し方ないずころではありたす。 おわりに 以䞊、Quorum Queueの玹介でした。 Quorum Queueは日本語はおろか、英語でも文献が少ないこずもあっお、ただただ広たっおいない印象を受けたす。Quorum Queueを利甚するこず自䜓はコヌド䞊では非垞に簡単にできおしたいたすが、性質に぀いおはしっかりず理解した䞊で採甚するかどうかを芋極める必芁があるず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
こんにちわ、むンフラ゚ンゞニアをしおいる rakus-tatsu-kashi です。 今回は代理投皿です。同じ郚眲のむンフラ゚ンゞニアが芋぀けおくれたテクニックをたずめおくれおたした この堎を借りお、改めおお瀌させおいただきたす ありがずうございたす たた、むンフラ゚ンゞニアをやっおいるず、泥臭くなりやすい蚭定䜜業もありたす。それを、 それを圓たり前だず思いこたず、解決しようずするマむンド 実際に解決する手段を芋぀けお、実珟する実行力 が玠晎らしい、たた凄いなヌ、ず思いたした負けおはいられん...。 ずいうこずで、䞋蚘、本線です はじめに 今回は皆さんおなじみ、ZabbixのLLD(ロヌレベルディスカバリ)に぀いおです。 ちょっず䟿利だなっお思ったものがあるのでご玹介したいず思いたす。 ではさっそくですが、ご玹介する内容は以䞋2぀です。 1LLDに任意の監芖を入れたい 2LLDのトリガの深刻床を倉えたい たた、実斜した環境はこちらになりたす。 利甚するのは、以䞋の2぀です。 いずれも Version 4.0.12 です。 ZabbixServer ZabbixAgent 1LLDに任意の監芖を入れたい さっそく「1LLDに任意の監芖を入れたい」からお話ししたいず思いたす。 皆さんご存じのずおりZabbixLLDはずおも䟿利です。 サヌバ(機噚)によっおデ バむス が䜕個ほどあるかを考慮せず、 デヌタを取埗できるようになったり、 トリガを蚭定できるようになったり、 をするこずができたす。 ずっおも䟿利です。 ただ、 意倖ず痒いずころに手が届かない。 デフォルトで甚意されおいるアむテムが倚くない などはありたす。 うちでいうず RAID 監芖を䜜成するずきに困りたした。 環境によっおコントロヌラの数やvdiskの数が異なるのに 。それぞれ甚に結局䜜らなくちゃいけないの  この面倒を、LLDの拡匵ずいうので解消を詊みたした。 任意のアむテムキヌを json 圢匏で出力するようにしお、そのアむテムキヌをディスカバリで指定するずLLDを䜿えるようになりたす。 たずえば RAID のvdiskが耇数個存圚しおいお、そのvdiskごずにzabbixのアむテムをLLDで䜜りたい堎合は、以䞋のような スクリプト を曞きたす #!/bin/bash LIST=`VDISKIDを取埗するコマンド` if [ "${LIST}" = "" ] ;then echo "ZBX_NOTSUPPORTED" exit 1 fi echo "{" echo " \"data\":[" FIRST=1 for VER in ${LIST} do if [ ${FIRST} -eq 1 ] ; then echo "" FIRST=0 else echo "," fi echo -e -n "\t\t{ \"{#VDISKID}\":\"${VER}\" }" done echo "" echo " ]" echo "}" するず出力結果はこんな感じ { " data ": [ { " {#VDISKID} ":" 0 " } , { " {#VDISKID} ":" 2 " } ] } ここたで準備できたら、ZabbixAgentに以䞋の蚭定を読み蟌たせたす。 UserParameter=vfs.vdisk.discovery,/etc/zabbix/vfs_vdisk_discovery.sh 次に、ZabbixServerでは、 「 vfs .adisk.discovery」をディスカバリルヌルのキヌに指定 「storage.vdisk[{#VDISKID}]をアむテムのプロトタむプのキヌに指定 するず 任意の個数のVDISKがキヌずしお読み蟌める ずいう仕組みです。 実斜しおみるず意倖ず簡単なので詊しおみおください。 2LLDのトリガの深刻床を倉えたい ぀づいお「2LLDのトリガの深刻床を倉えたい」に぀いお ずっおも䟿利なLLD、運甚しおいく䞭で、監芖の内容を倉曎したいず思うこずが出来たした。 通垞であればテンプレヌトのトリガの深刻床を修正しお ず察応するのですが、LLDのトリガプロトタむプの深刻床を修正しおも反映されない 困りたした。 倧量にディスカバリで䜜成されたサヌバたち、それらを䞀぀ず぀修正しろず  珟実的ではない ず途方にくれたした。 途方に暮れおしばらく空を眺めおいるうちにひらめきたした。 LLDのトリガプロトタむプの深刻床は倉曎しおも反映されない が、LLDのトリガプロトタむプの条件匏の倉曎は反映される。 ならば 深刻床を修正したうえで、条件匏を修正しお、たた条件匏を戻せば  はやる気持ちを抑えお実隓  無事深刻床が修正できたした ━━(☆∀☆)━━!!! どうやらトリガの無効などもうたく反映されない暡様、同じやり方で詊しおみるのもいいかもしれたせんね。 最埌に 今回は、ZabbixのLLDに぀いおのTipsを蚘茉させおいただきたした。 Zabbixはせっかく機胜が倚いため、こういったTipsを身に身に付けおいっお、有効掻甚しおいきたいですね 以䞊
こんにちは、masakaです。 前の䌚瀟でPWAに぀いお少し調べおいたのですが、特に発衚するこずもなかったので 今回はその内容をブログにしおみたした。 ざっくりずした説明ず、簡単な実装をやっおみたいず思いたす。 PWAずは PWAの代衚的な機胜 Webずネむティブアプリ、それぞれの特城ずPWAが求めるもの PWAを支える䞉぀の柱 結局のずころ、PWAずは PWAの察応状況 デスクトップ環境もPWAの察象に [実践線] PWA化ぞの第䞀歩 PWA化のために必芁なこず - [Web App Manifest]ず[Service Worker] manifest Service Worker Webサむトからむンストヌル出来るようにする - A2HS サンプルアプリずWebサヌバの準備 A2HSを実装する オフラむンでも実行できるようにする おわりに PWAずは ネむティブアプリみたいなWebアプリ PWAは「 progressive web apps」のこずを指したす。2015幎に発衚され、話題に䞊がっおきたした。 PWAに察応した代衚的なサむトずしお、 Twitter や囜内だずSUUMOなどがよく䟋に挙げられたす。 PWAずいうワヌドで怜玢するず、「ネむティブアプリみたいな」Webアプリである、ずいう抜象的な内容が散芋されたす。 この衚珟は間違っおいないです が、䜕をもっお「ネむティブアプリみたい」ずいうのか、いたいちはっきりしたせん。 もう少し詳しく理解しおみるこずにしたす。 PWAの代衚的な機胜 機胜的な面で調べるず、PWAで出来るこずずしお代衚的なものには以䞋がありたす。 ホヌム画面ぞの远加アプリの様にむンストヌルし、ホヌム画面から起動できる オフラむン起動ネットワヌクに接続しおいなくおも䜿甚できる バックグラりンド同期オフラむン時に操䜜した内容を、ネットワヌク接続されたタむミングでバックグラりンド送信する プッシュ通知アプリからの通知 これらの機胜が実装されるこずがPWAなのでしょうか Webずネむティブアプリ、それぞれの特城ずPWAが求めるもの Google によるPWAの説明 には、ネむティブアプリずWeb アプリの特城を次のように曞いおありたす。 ネむティブアプリの特城 - 機胜性・信頌性に優れる ホヌム画面、タスクバヌなどに存圚しネットワヌクに圱響されず䜿甚できる 機胜が豊富 Web アプリの特城 - 到達性に優れる 単䞀コヌドベヌス デ バむス を問わず、誰でもどこでもアクセスできる その䞊で、PWAはWebアプリに双方の長所を持たせるこずを目指しおいるようで、以䞋のような蚘茉がされおいたす。 PWAはあくたでWeb アプリである モダンな API で構築されおいる デ バむス やブラりザを問わない到達性 PWAを支える䞉぀の柱 加えおネむティブアプリのように感じさせるための䞉぀の柱に぀いおも曞かれおいたす。 1.Capable (機胜) Webは様々なこずが出来るように機胜拡匵し、成長し続ける これらを取り入れるこずによりネむティブアプリでしか出来なかったこずがWeb で可胜になっおいく 2.Reliable (ä¿¡é Œ) ネットワヌクに圱響されずに䜿甚できる ネットワヌク接続が出来ない、あるいは䜎速なネットワヌクでも䜿甚できる 3.Installable (むンストヌル可胜) ブラりザの䞭で動くのではなく独立したアプリずしお動く 1.はずもかく、2.ず 3.は具䜓的ですね。 ちなみに、以前は Google の デベロッパヌペヌゞ では、 Reliable Fast Engaging ずいう特城を曞いおいたようなのですが、少し倉わっおいるようです。 結局のずころ、PWAずは これたでの内容で、぀たるずころPWAずは ネむティブアプリ的なナヌザヌ䜓隓を埗られるWebアプリ であり、 ネットワヌク状態に圱響されず、 独立したアプリのように起動でき、 新しいWebAPIを採甚し、機胜的にネむティブアプリに倧きく劣らないようにする ずいった芁玠を満たしおおくず、結果的にそうなるずいう感じでしょうか。 PWAに求められる、より具䜓的な内容はPWAの チェックリスト を芋るず分かりたす。 よりよいナヌザヌ䜓隓を提䟛したしょう的な内容が倚い印象です。 PWAの察応状況 PWAはあくたでWebアプリなので、ブラりザによっお 察応状況 が倉わっおきおしたいたす。 What Web Can Do Today ずいうサむトでは、アクセスされたブラりザでどの機胜が䜿えるか衚瀺しおくれたす。 Google が掚進しおいるだけあっお、 Android Chrome は早くからPWA察応 iOS Safari は䞀郚の機胜未察応 セキュリティ的な思惑もあり、すぐに察応は難しそう iOS でもプッシュ通知くらいは䜿えおほしいですが、iOS14でもただ未察応です・・。 デスクトップ環境もPWAの察象に PWAは元々モバむル環境をタヌゲットにしおいたようですが、 Chrome ずEdgeはデスクトップ環境でもPWAに察応しおいたす。 Chrome は version67 でPWAに぀いおの蚘茉がありたす。 モバむルでPWA察応しおいたものは、特にデスクトップ甚にコヌドを倉曎する必芁はなく、そのたたデスクトップPWAずしお䜿えたす。 PCでもPWAを利甚できる状況になっおきおいたす。 [実践線] PWA化ぞの第䞀歩 ここからは実践線です。今回は手始めに、PWAっぜくするために むンストヌル可胜にする オフラむンで䜿甚できる をやっおみたす。 デスクトップPWAずしおの䜿甚をタヌゲットにしたす。 PWA化のために必芁なこず - [Web App Manifest]ず[Service Worker] PWA化においお欠かせない芁玠は、 Web App Manifest Service Worker の二぀がありたす。 manifest manifestファむルはりェブアプリに぀いおの情報や、挙動に぀いおの蚭定が蚘したファむルです。 ダりンロヌドし、アプリずしお動かすために必芁な情報が蚘茉され、䞭身は JSON です。 ナヌザヌが取埗できるよう、Web䞊に配眮したす。 Service Worker Service Workerはブラりザのメむン スクリプト 凊理ずは別に、バックグラりンドずしお実行される スクリプト です。 PWAの肝ずなる郚分かず思いたす。 ServiceWorkerはWebアプリブラりザずネットワヌクの間で動䜜したす。 必芁に応じおキャッシュからデヌタを取埗するか、ネットワヌクぞリク ゚ス トするかを制埡できたす。 sw オフラむン時や、通信環境が悪い状況での実行に密接に圱響しそうな機胜ですね。 Webサむトからむンストヌル出来るようにする - A2HS アプリずしおホヌム画面などに远加する機胜を 「A2HS」 ず呌びたす。(Add-to-Home-Screen の略) 早速、これをやっおみたしょう。 サンプルアプリずWebサヌバの準備 たず、䜕かWebアプリが必芁です。 htmlず JavaScript でごく簡単なクリック連打ゲヌムを䜜成したした。 これで詊しおみたしょう。 GitHub にもありたす。 クリック連打ゲヌムの゜ヌス index.html <!DOCTYPE html> < html > < head > < meta charset = "utf-8" /> < meta http-equiv = "X-UA-Compatible" content = "IE=edge" /> < meta name = "viewport" content = "width=device-width, initial-scale=1.0" /> < title > button mashing </ title > < link rel = "stylesheet" type = "text/css" href = "app.css" /> </ head > < body > < div class = "wrapper" > < div > 目暙クリック連打数 < span class = "js-target-count" > 10 </ span ></ div > < div class = "timer" > < span class = "js-timer-label" > 経過時間 </ span > < span class = "js-spend-time" ></ span > </ div > < div class = "click-btn-wrapper" > < button class = "js-click-target btn-click-target" > < span > Click! </ span >< br /> < span class = "js-counter" ></ span >< br /> </ button > </ div > < div > < button class = "js-reset btn-reset" > リセット </ button > </ div > < div class = "change-count-wrapper" > クリック数を倉曎する < ul > < li > < button class = "js-change-count btn-change-count" data -count= "10" > クリック数10回 </ button > </ li > < li > < button class = "js-change-count btn-change-count" data -count= "20" > クリック数20回 </ button > </ li > < li > < button class = "js-change-count btn-change-count" data -count= "30" > クリック数30回 </ button > </ li > </ ul > </ div > </ div > < script src = "app.js" ></ script > </ body > </ html > app. css .wrapper { padding : 10px ; max-width : 400px ; margin : 0 auto ; text-align : center ; font-size : 14px ; } .click-btn-wrapper { margin : 10px auto ; } .btn-click-target { display : inline-block ; text-decoration : none ; color : #668ad8 ; background-color : #fff ; width : 80px ; height : 80px ; border-radius : 50 %; border : solid 2px #668ad8 ; text-align : center ; overflow : hidden ; font-weight : bold ; transition : 0.4s ; } .btn-click-target : hover { background : #b3e1ff ; } .change-count-wrapper { max-width : 240px ; margin : 20px auto 0px auto ; } .btn-change-count { position : relative ; display : inline-block ; font-weight : bold ; padding : 0.25em 0.5em ; text-decoration : none ; color : #00bcd4 ; background : #dbebf8 ; border : none ; transition : 0.4s ; } .btn-change-count : hover { background : #00bcd4 ; color : white ; } .header-change-count { border-bottom : solid 3px black ; } ul , ol { padding : 0 ; text-align : center ; margin : 3px 0px ; } ul li { position : relative ; list-style-type : none !important ; padding : 0.3em 0.3em 0.3em 0.3em ; margin-bottom : 1px ; vertical-align : middle ; } .btn-reset { position : relative ; display : inline-block ; font-weight : bold ; padding : 0.25em 0.5em ; text-decoration : none ; color : #00BCD4 ; background : #ECECEC ; border : none ; border-radius : 0 ; transition : . 4s ; } .btn-reset : hover { background : #636363 ; } app.js let clickCount = 0; let playing = false ; let targetCount = 10; let spendTime = 0; let timerId = 0; const clickTarget = document .querySelector( ".js-click-target" ); const resetBtn = document .querySelector( ".js-reset" ); const counterText = document .querySelector( ".js-counter" ); const targetCountText = document .querySelector( ".js-target-count" ); const spendTimeText = document .querySelector( ".js-spend-time" ); const timerLabelText = document .querySelector( ".js-timer-label" ); const countChanger = document .getElementsByClassName( "js-change-count" ); Array .prototype.forEach.call(countChanger, (btn) => { btn.addEventListener( "click" , (e) => { targetCount = btn.getAttribute( "data-count" ); targetCountText.innerHTML = targetCount; } ); } ); const start = () => { clickCount = 0; time = 0; playing = true ; timerLabelText.innerHTML = "経過時間" ; counterText.innerText = clickCount; spendTimeText.innerHTML = time / 1000; timerId = setInterval(() => { time += 10; spendTimeText.innerHTML = (time / 1000).toFixed(2); } , 10); } ; const complete = () => { playing = false ; timerLabelText.innerHTML = "連打終了 蚘録" ; clearInterval(timerId); clickTarget.disabled = true ; setTimeout(() => (clickTarget.disabled = false ), 2000); } ; const reset = () => { playing = false ; clickCount = 0; counterText.innerText = clickCount; spendTimeText.innerHTML = 0; timerLabelText.innerHTML = "経過時間" ; clickTarget.disabled = false ; clearInterval(timerId); } ; // 初回クリックでスタヌト clickTarget.addEventListener( "click" , () => { if (playing) return ; start(); playing = true ; } ); // クリック時のカりントアップ clickTarget.addEventListener( "click" , () => { if (!playing) return ; counterText.innerText = ++clickCount; if (clickCount >= targetCount) { complete(); } } ); // リセットボタン resetBtn.addEventListener( "click" , () => reset()); これらhtml, css , jsファむルを配眮したらロヌカルでwebサヌバを起動しおアクセスできるようにしたす。 (ここではnode.jsの http-server を䜿いたすが、なんでも構いたせん) npm install -g http-server ファむルを配眮した堎所で http-server -p 8001 これで http://localhost:8001/index.html `にアクセスできるようにしたす。 ※ちなみに、 GitHub Pagesを䜿うず HTTPS でアクセスできるので楜です。 A2HSを実装する やるこずはそう倚くはありたせん。以䞋を実行すれば、むンストヌルが可胜になりたす。 1.manifest(Web App Manifest)を䜜成する htmlのヘッダにmanifest. json ぞのlinkを蚘述する 2.ServiceWorkerを登録し、fetchむベントをハンドリングさせる この他に HTTPS 経由で提䟛される必芁があるようですが、 localhost の堎合はHTTPでもOK です。 1.manifestの䜜成 たずmanifestを䜜成しおいきたす。 䞭身は JSON ですが、拡匵子は .webmanifest にするべきなようです。が、 .json でも動きたす。 ここでは manifest.webmanifest ずしお䜜成したす。 manifest.webmanifest { " name ": " Button mashing ", " short_name ": " Bm ", " description ": " クリック連打 ", " icons ": [ { " src ": " ./icons/icon-192.png ", " sizes ": " 192x192 ", " type ": " image/png " } , { " src ": " ./icons/icon-512.png ", " sizes ": " 512x512 ", " type ": " image/png " } ] , " start_url ": " ./index.html ", " display ": " standalone ", " background_color ": " #FFFFFF ", " theme_color ": " #FFFFFF " } ざっず項目の説明です。 name: アプリの名称。 icons: ホヌム画面やデスクトップに衚瀺するアむコン。192 192ず512 512があるず良いらしいです。ずりあえず適圓に䜜るか拟う start_url: むンストヌルしお実行するファむルのパス。 display: 衚瀺方法。アプリっぜく動かすには、 standalone か fullscreen を指定。fullscreenだずステヌタスバヌなどのUIも衚瀺されない。 パス系はmanifestファむルの堎所からの 盞察パス です。 䜜成したら、index.htmlにこのmanifestぞのリンクを蚘茉したす。 index.html <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>button mashing</title> <link rel="stylesheet" type="text/css" href="app.css" /> + <link rel="manifest" href="manifest.webmanifest" /> </script> </head> 2.Service Workerの登録 SeriveWorkerの実態は JavaScript です。 sw.js にSeriveWorkerの本䜓を蚘茉し、それをアプリ内から登録したす。 sw.js self .addEventListener( 'fetch' , (e) => {} ) むンストヌルに必芁なのは、このfetchむベントをハンドリングさせるだけです。コヌルバックは空で構いたせん。 (ServiceWorker内では、selfに ServiceWorkerGlobalScope がbindされおいたす。) これをアプリケヌション内で登録したす。 index.html <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>button mashing</title> <link rel="stylesheet" type="text/css" href="app.css" /> <link rel="manifest" href="manifest.webmanifest" /> + <!-- ServiceWorker --> + <script> + if ("serviceWorker" in navigator) { + window.addEventListener("load", function () { + navigator.serviceWorker.register("./sw.js").then( + function (registration) { + // Registration was successful + console.log( + "ServiceWorker registration successful with scope: ", + registration.scope + ); + }, + function (err) { + // registration failed :( + console.log("ServiceWorker registration failed: ", err); + } + ); + }); + } + </script> </head> ここたで倉曎したら、 localhost:8001/index.html にアクセスしたす。 アドレスバヌの右端に、 + のアむコンが远加されたした。 PWAのむンストヌルボタン・・・わかりづらい クリックしおむンストヌルしおみたす。デスクトップにアむコンが远加され、起動しおみるず・・ デスクトップから起動したアプリ 起動できたした。これでデスクトップに远加するこずができるようになりたした。 オフラむンでも実行できるようにする アプリずしお起動できるようにはなりたしたが、このたたではオフラむンでは䜿甚できたせん。 コンテンツをオフラむンで䜿甚できるようにするため、キャッシュ凊理をService Workerに曞かなければならないのですが、 workbox を䜿うず簡単に詊せたす。 sw.jsにworkboxを利甚したファむルのキャッシュ凊理を曞いおみたしょう。 sw.jsに以䞋を远加したす。 importScripts( 'https://storage.googleapis.com/workbox-cdn/releases/6.0.2/workbox-sw.js' ); workbox.precaching.precacheAndRoute( [ '/index.html' , '/app.css' , '/app.js' ] ); pre-cacheを䜿甚しおいたす。むンストヌル時にキャッシュされる機胜 本来はファむルにリビゞョンを指定しお、バヌゞョン管理を行うこずも必芁ですが今回は割愛したす。 キャッシュ凊理を远加したずころで、再床アプリをむンストヌルし盎しおみたす。アンむンストヌルはアプリ右䞊のメニュヌからできたす http-serverを停止したり、オフラむン状態でもむンストヌルしたゲヌムを起動できるようになっおいたす。 どういう仕組みになっおいるのか軜く確認しおみたしょう。 開発者ツヌルを芋るずキャッシュされたファむルはService Workerから取埗しおいるこずがわかりたす cache storageに保存されおいたす これで、オフラむン実行が有効になりたす。 PWA化ぞの第䞀歩を螏み出せたした。 おわりに PWAずは䜕かの把握ず実装の第䞀歩をやっおみたした。 機䌚があったらプッシュ通知あたりもやっおみたいず思いたす。 PWA自䜓は察応するサむトも増えおきおいるようですが、普及に関しおは iOS の察応が未だ䞍透明である点がネックですね。 ずはいえ iOS も埐々に察応機胜を増やしおきおはいるので、今埌も発展が芋蟌めそうな技術かず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
はじめに 皆さん初めたしおseahoseTです。 今回は Linux 䞊で文字列を凊理するこずに䟿利な awk に぀いお玹介しおいきたいず思いたす。 目次 はじめに awkずは ここがすごいよawkのアレコレ awkの基本的な仕様 awkのコマンド パタヌン 正芏衚珟 BEGIN,END 評䟡匏 アクション awkの組み蟌み倉数 awkのオプション awkの泚意点 問題線行の指定 解決線行の指定 問題線耇数のパタヌンを䜿甚する 解決線耇数のパタヌンを䜿甚する 問題線NRずFNR 解決線NRずFNR 問題線awkでシェル倉数を䜿甚する 解決線awkでシェル倉数を䜿甚する awkの実践 おわりに awk ずは AWK オヌクは、 プログラミング蚀語 の䞀぀。 テキストファむル、特に空癜類スペヌスの他、タブなどやカンマなどで区切られたデヌタファむルの凊理を念頭に眮いた仕様ずなっおいるが、 䞀般的なプログラミングに甚いるこずも可胜である。 UNIX 䞊で開発された。( Wikipedia より) awk ずは Linux や Unix ( Mac )で䜿甚できるファむルの集蚈など文字列を扱う堎合に䟿利な プログラミング蚀語 。 同様に文字列を凊理できる sed などが非垞に特殊な文法をしおいた事に察しお、 C蚀語 ラむクで人が分かりやすいような文法をしおいる。 awk は プログラミング蚀語 であるが、 Linux のコマンドのように扱うこずができる 。 目次ぞ ここがすごいよ awk のアレコレ 殆どの Linux や Unix ( Mac )䞊で暙準で䜿甚するこずができ、コマンドの䜿い回しができるなど互換性が高い 「 gawk 」をむンストヌルするなどひず手間必芁だが Windows でも問題なく䜿甚するこずができる プログラミング蚀語 であるが、 コンパむル は䞍芁 簡単 目次ぞ awk の基本的な仕様 awk の基本的な構文は䞋蚘のようになる。 # コマンドを盎接入力する堎合 awk ' コマンド ' [ 入力ファむルのパス ] # コマンドをファむルから入力する堎合 awk -f コマンドファむルのパス [ 入力ファむルのパス ] たた、入力ファむルを耇数指定するこずも可胜。 # 入力ファむルを耇数蚭定したい堎合 awk ' コマンド ' [ 入力ファむルのパス 1 ] [ 入力ファむルのパス 2 ] ..... 「入力ファむル」を蚭定せずに「パむプ」や「リダむレクト」での受け枡しも可胜。 # 入力を「パむプ」で行う堎合の䟋 echo | awk ' コマンド ' awk では 各行ごず に指定した列に察しお凊理を行う。 この時 awk では行の事を 「レコヌド」 、列のこずを 「フィヌルド」 ず呌ぶ。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 䞊蚘の䟋のような「date.txt」が存圚する堎合にフィヌルド1(列1)を衚瀺したい堎合には、 # 「date.txt」のフィヌルド1(列1)を衚瀺 awk ' {print $1} ' date.txt ず蚘述するこずで各レコヌド(行)のフィヌルド1(列1)を衚瀺し、䞋蚘のような結果を埗るこずができる。 # 結果 1 4 たた、「$0」を䜿甚するこずで党おのレコヌド(行)、フィヌルド(列)を参照するこずが可胜。 # 「date.txt」の党レコヌド(行)、フィヌルド(列)を衚瀺 awk ' {print $0} ' date.txt # 結果 1 2 3 4 5 6 目次ぞ awk のコマンド awkの基本的な仕様 で awk の'コマンド'ず蚘述しおいる郚分は本来「パタヌン」ず「アクション」の二぀から成る。「アクション」の郚分は具䜓的にどのような凊理を行うのかを内容を蚘述する。「パタヌン」の郚分ではどのような堎合にアクションを行うかの条件を決定しおいる。たた、 awkの基本的な仕様 で行った通り「パタヌン」の郚分に䜕も蚘述しない堎合でも問題なく動䜜する。 # 'コマンド'を「パタヌン」郚分ず「アクション」郚分に分けた堎合 awk ' パタヌン { アクション } ' [ 入力ファむルのパス ] パタヌンの皮類 正芏衚珟 BEGIN END 評䟡匏 正芏衚珟 蚘述した 正芏衚珟 のパタヌンにマッチした行にアクション郚分の凊理を斜す。 # 曞き方 awk ' /正芏衚珟/ { アクション } ' [ 入力ファむルのパス ] このように 正芏衚珟 の巊右にスラッシュを入れお蚘述する。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # 「date.txt」ファむル䞭の「4」で「終わる」フィヌルド(列)を含むレコヌド(行)がある堎合 # そのフィヌルド(行)のフィヌルド2(列2)を衚瀺する awk ' /4$/ { print $2 } ' date.txt # 結果 5 BEGIN,END awk では「BEGIN」、「END」を䜿甚するこずで「メむン」を含めた䞉぀のブロック構造を䜜るこずが出来る。「BEGIN」ず「END」は前凊理、埌凊理の関係になっおおり、「BEGIN」では入力ファむルを 読み蟌む前 に凊理が行われ、「END」では入力ファむルを 読み蟌み終わった埌 の凊理を蚘述する。 宣蚀した倉数は「BEGIN」、「メむン」、「END」のブロックをたたいで䜿甚するこずが可胜。䞀般的には「BEGIN」で宣蚀を行う。 # 曞き方 # 䟋1 awk ' BEGIN { 入力ファむルを読み蟌む前のアクション } { メむン凊理 } ' [ 入力ファむルのパス ] # 䟋2 awk ' { メむン凊理 } END { 入力ファむルを読み蟌んだ埌のアクション } ' [ 入力ファむルのパス ] # 䟋3 awk ' BEGIN { 入力ファむルを読み蟌む前のアクション } { メむン凊理 } END { 入力ファむルを読み蟌んだ埌のアクション } ' [ 入力ファむルのパス ] 「BEGIN」、「END」は省略可胜であるため「メむン」の凊理のみを蚘述した際でも問題なく動䜜する。 評䟡匏 評䟡匏の評䟡にマッチした行にアクション郚分の凊理を斜す。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # 「date.txt」ファむル䞭の「フィヌルド3(列3)」が「6」であるレコヌド(行)が存圚する堎合 # そのレコヌド(行)のフィヌルド3(列3)を衚瀺する awk ' $3 == "6" { print $3 } ' date.txt # 結果 6 この結果だけ芋るず前述した 正芏衚珟 で良いように思えるが埌述する組み蟌み倉数や「-v」オプションず組み合わせた際に真䟡を発揮する。 アクション 「アクション」内で耇数の凊理を行う堎合は セミ コロン;で区切る。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # 「アクション」内で耇数の凊理を行う䟋 awk ' {print $0; print $1} ' date.txt # 結果 1 2 3 4 5 6 1 4 同じような凊理を連続で行う堎合にはカンマ,での蚘述も可胜。 # 「$0」ず「$1」を衚瀺 awk ' {print $0, $1} ' date.txt # 結果 1 2 3 4 5 6 1 4 倉数を䜿甚する堎合は Linux コマンドず違い「$」を぀けない。 # 倉数の仕様 awk ' {age = 2021; print age} ' date.txt # 結果 2021 目次ぞ awk の組み蟌み倉数 予め awk に準備されおいる倉数。「パタヌン」、「アクション」䞡方で䜿える。シェルの堎合ず違い組み蟌み倉数を䜿甚する際には「$」を぀ける必芁がない点に泚意。 倉数名 効果 デフォルト(未蚭定の堎合) ARGC コマンドラむン 匕数の個数 ARGV コマンドラむン 匕数配列に栌玍 ENVIRON シェルの 環境倉数 を参照 FILENAME 珟圚凊理しおいるファむルの名前 FNR 珟圚凊理しおいるファむルのレコヌド数(行数) NR 珟圚凊理しおいるレコヌド含む凊理した総レコヌドの数(行数) ※入力ファむルが耇数の時泚意 RS 読み蟌み時のレコヌド(行)の区切り文字 改行 ORS 出力時のレコヌド(行)の区切り文字 改行 FS 読み蟌み時のフィヌルド(列)の区切り文字 ※「-F」オプションでも倉曎可胜 空癜 OFS 出力時のレコヌド(行)の区切り文字 空癜 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # 「date.txt」の改行を,に倉曎しお衚瀺 awk ' ORS = "," {print $0} ' date.txt # 結果 1 2 3 , 4 5 6 目次ぞ awk のオプション awk のオプションは䞀般的な Linux コマンドず同様に䜿うこずができる。 オプション名 効果 デフォルト(未蚭定の堎合) -f コマンドファむル名 awk コマンドが曞かれたファむルを指定する -F 区切り文字 区切り文字を指定する 空癜 -v 倉数名=倀 倉数を定矩する # オプションの蚘述䟋 awk -オプション ' コマンド ' [ 入力ファむルのパス ] 目次ぞ awk の泚意点 この項では筆者が awk を䜿甚した際に躓いた事に察する泚意点を挙げおいく。 問題線行の指定 awk を実行する時、「パタヌン」で行数を指定しない堎合、デフォルトでは党おの行を察象に取る。 解決線行の指定 # 「date.txt」のレコヌド1(行1)のフィヌルド2(列2)を衚瀺 awk ' NR == 1{print $2} ' date.txt パタヌンの郚分に「NR == 衚瀺したい行数」を蚭定するこずで指定した特定の行数のみの結果を埗るこずができる。パタヌンには4皮類の項目があるこずは コマンド で蚘茉しおいるが、原理ずしおは評䟡匏ずしお珟圚の行数を評䟡しおいるずいった圢になる。 問題線耇数のパタヌンを䜿甚する 「パタヌン」は耇数を組み合わせるこずができる。 解決線耇数のパタヌンを䜿甚する 「&&」や「||」を䜿うず、耇数のパタヌンを組み合わせるこずがでる。たた、「()」を䜿甚するこずで数匏のようにパタヌンの優先床を倉曎できる。 # 耇数個パタヌンを䜿甚したawkの䟋 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # レコヌド1(行1)以降でか぀フィヌルド2(列2)が2ではない物を衚瀺 awk ' NR>1 && ! ( $2 ~ 2 ){ print $0} ' date.txt ※「~」はマッチ挔算子で「 = 」ずほずんど同じ効果を持぀。「 = 」に眮き換えた堎合でも動䜜する。 # 結果 4 5 6 問題線NRずFNR 入力ファむルが耇数個の堎合のレコヌド数(行数)が加算されおしたう。 解決線NRずFNR 組み蟌み倉数「NR」を䜿甚しおある特定のレコヌド(行)にのみ倉曎を加えたい。そんな時に、「入力ファむル」が耇数個存圚する堎合泚意が必芁だ。䟋えば䞋蚘のような二぀の入力ファむルがあったずしよう、 # 䞀぀目の入力ファむル 䟋 ) date1.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # 二぀目の入力ファむル 䟋 ) date2.txt  列 1 列 2 列 3 行  7   8   9 行  10   11   12 二぀の入力ファむルそれぞれのレコヌド2(行2)を衚瀺したいので「NR == 2」ずしお awk のコマンドを蚭定する。 # レコヌド2(行2)を衚瀺したいコマンド awk ' NR == 2 {print $0} ' date1.txt date2.txt # 結果 4 5 6 「NR == 2」ではこのように「入力ファむル1」のレコヌド2(行2)だけしか衚瀺するこずができおいない。では、「FNR == 2」を䜿甚しおみるずどうだろう、 # レコヌド2(行2)を衚瀺したいコマンド awk ' FNR == 2 {print $0} ' date1.txt date2.txt # 結果 4 5 6 10 11 12 期埅した通りの結果、「date1.txt」ず「date2.txt」のレコヌド2(行2)がそれぞれ衚瀺しおいるこずが分かる。では次に「NR == 3」を行っおみる。 # レコヌド2(行2)を衚瀺したいコマンド awk ' NR == 3 {print $0} ' date1.txt date2.txt # 結果 7 8 9 入力ファむル2のレコヌド1(行1)が衚瀺されおいる。これはどこからレコヌド(行)のカりントが始たっおいるかの違いである。「NR」の堎合は入力ファむル1の総レコヌドの2を凊理した埌入力ファむル2のレコヌド1(行1)を珟圚の行数に 加算 する。぀たり入力ファむル2のレコヌド1(行1)は2+1で「NR = 3」にあたるずいうこずになる。 察しお「FNR」は入力ファむル1の総レコヌドの2を凊理した埌行数のカりントを リセット する。぀たり、レコヌド数(行数)は珟圚凊理しおいる入力ファむルのレコヌド数(行数)を参照するこずになる。 # 「NR」の凊理むメヌゞ(盎列)   列 1 列 2 列 3 行 1   1   2   3 行 2   4   5   6 行 3   7   8   9 行 4   10   11   12 # 「FNR」のむメヌゞ(䞊列)   列 1 列 2 列 3 行 1   1   2   3 行 2   4   5   6   列 1 列 2 列 3 行 1   7   8   9 行 2   10   11   12 問題線 awk でシェル倉数を䜿甚する awk 内ではデフォルトの状態でシェル倉数を䜿甚するこずはできない。 解決線 awk でシェル倉数を䜿甚する 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # シェル倉数 var = 100 䞊蚘のように「date.txt」ずシェル倉数「var」が蚭定されおいる堎合に「date.txt」のフィヌルド2(列2)ず「var」の合蚈を awk を甚い衚瀺したいずする時、 # 「date.txt」のフィヌルド2(列2)ずシェル倉数「var」の合蚈を衚瀺 awk ' {print $2 + var} ' date.txt ず蚘述しおもシェル倉数である「var」を正しく認識できないため、正しい結果を埗るこずはできない。 awk は Linux のコマンドのように扱うこずができるが、あくたで プログラミング蚀語 の䞀皮であるため同様に扱うこずができないのである。そこで解決策ずしお「-v」オプションを䜿甚する。 「-v」オプション オプション名 効果 -v 倉数名=倀 倉数を定矩する オプション の項で玹介しおいる物ず同様である。「-v」オプションでは任意の倉数名に倀を蚭定するこずで任意の倉数を組み蟌み倉数のように「パタヌン」や「アクション」で䜿甚できるようにする効果がある。正確に蚀うず プログラミング蚀語 awk に察しお 倀を受け枡す オプションずなっおいる。倀を蚭定する際、 シェル倉数を受け枡すこずも可胜 なのでデフォルトではシェル倉数を䜿甚するこずが出来ないずいった問題を解決するこずができる。 # 䞊蚘の䟋をもずにした「-v」オプション蚭定䟋 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # シェル倉数 var = 100 # 「date.txt」のフィヌルド2(列2)ずシェル倉数「var」の合蚈を衚瀺 awk -v awkVar = $var ' {print $2 + awkVar} ' date.txt # 結果 102 105 「-v」オプションを耇数蚭定するこずで耇数の倉数を蚭定するこずもできる。 # 䞊蚘の䟋をもずにした「-v」オプション蚭定䟋 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # シェル倉数 var = 100 var2 = 200 # 「date.txt」のフィヌルド2(列2)ずシェル倉数「var」、シェル倉数「var2」の合蚈を衚瀺 awk -v awkVar1 = $var -v awkVar2 = $var2 ' {print $2 + awkVar1 + awkVar2} ' date.txt # 結果 302 305 泚意しお欲しいのは蚭定した倉数をコマンド内で䜿甚する堎合 組み蟌み倉数 ず同様に、「$」を぀けずに、蚭定した倉数名のみを蚘述するこずだ。シェルでの䞀般的な倉数呌び出しずは勝手が違うので気を付ける必芁がある。 ・・・しかし、実は「-v」オプションを䜿わなくおも awk に倀を受け枡すこずは可胜である。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # シェル倉数 var = 100 # 「-v」オプションを䜿甚せずに倉数「awkVar3」を蚭定 awk ' {print $2 + awkVar3} ' awkVar3 = $var date.txt # 結果 102 105 これだけ芋るず同様の動䜜をしおいるように芋えるが次の䟋を芋お欲しい。 # 「-v」オプションを䜿い「message」を蚭定 echo | awk -v message = " Test massage " ' BEGIN{print massage} {print massaeg} END{print massage} ' # BEGIN結果 Test massage # メむン結果 Test massage # END結果 Test massage # 「-v」オプションを䜿わずに「message」を蚭定 echo | awk ' BEGIN{print massage} {print massaeg} END{print massage} ' message = " Test massage " # BEGIN結果 # メむン結果 Test massage # END結果 Test massage おわかりいただけただろうか。「-v」オプションを䜿甚せずに倉数を蚭定した堎合「パタヌン」の「BEGIN」ブロックにおいお倉数が参照できおいないのである。この違いにより「-v」オプションを䜿甚するこずの方が安党であるず蚀える。 たた、凊理を繰り返しを行う回数は「入力ファむル」のレコヌド数(行数)であるずいうこずに泚意。 䟋 ) date.txt  列 1 列 2 列 3 行  1   2   3 行  4   5   6 # シェル倉数 var = 100 # awkVar4の衚瀺 awk -v awkVar4 = $var ' {print awkVar4} ' date.txt # 結果 100 100 # 「date.txt」の総レコヌド数(行数)である2回分の衚瀺凊理が繰り返し行われおいる。 他にも「-v」オプションを䜿わずに awk 内でシェル倉数を䜿甚する方法があるので玹介しおおく。 # シェル倉数 var = 100 # 倉数名を「'」(シングルクォヌテヌション)で囲む echo | awk ' {pritn ' ${var} ' } ' # 結果 100 awk は「'」(シングルクォヌト)に囲たれたずころを解析しようずするので、シェル倉数の郚分は「'」(シングルクォヌト)から倖せばシェル倉数ずしお扱っおくれる。 目次ぞ awk の実践 「stress」コマンドを甚いおCPUに負荷をかけそのログの統蚈情報を算出しおみた。ログは長いので折り畳み先に蚘茉する。 5分間の「vmstat」のログ 1 2021 / 01 / 18 09:56:00 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 2 2021 / 01 / 18 09:56:00 r b swpd free buff cache si so bi bo in cs us sy id wa st 3 2021 / 01 / 18 09:56:00 2 0 0 1152892 2284 471684 0 0 0 1 7 10 0 0 100 0 0 4 2021 / 01 / 18 09:56:01 0 0 0 1152752 2284 471680 0 0 0 0 152 333 0 0 100 0 0 5 2021 / 01 / 18 09:56:02 0 0 0 1152752 2284 471680 0 0 0 0 122 272 0 0 100 0 0 6 2021 / 01 / 18 09:56:03 0 0 0 1152752 2284 471680 0 0 0 432 166 345 0 0 100 0 0 7 2021 / 01 / 18 09:56:04 0 0 0 1152752 2284 471680 0 0 0 0 139 292 0 0 100 0 0 8 2021 / 01 / 18 09:56:05 4 0 0 1147864 2284 474028 0 0 0 0 827 263 73 2 25 0 0 9 2021 / 01 / 18 09:56:06 1 0 0 1147864 2284 474028 0 0 0 0 873 242 80 1 19 0 0 10 2021 / 01 / 18 09:56:07 1 0 0 1147864 2284 474028 0 0 0 0 867 241 80 0 20 0 0 11 2021 / 01 / 18 09:56:08 5 0 0 1147864 2284 474028 0 0 0 0 871 242 80 0 20 0 0 12 2021 / 01 / 18 09:56:09 0 0 0 1147864 2284 474028 0 0 0 0 865 241 81 0 19 0 0 13 2021 / 01 / 18 09:56:10 1 0 0 1147864 2284 474028 0 0 0 0 861 253 78 0 22 0 0 14 2021 / 01 / 18 09:56:11 1 0 0 1147864 2284 474028 0 0 0 0 874 241 80 1 19 0 0 15 2021 / 01 / 18 09:56:12 1 0 0 1147864 2284 474028 0 0 0 4 859 230 79 1 20 0 0 16 2021 / 01 / 18 09:56:13 1 0 0 1147864 2284 474028 0 0 0 0 873 250 81 0 19 0 0 17 2021 / 01 / 18 09:56:14 0 0 0 1147832 2284 474028 0 0 0 0 860 239 80 0 20 0 0 18 2021 / 01 / 18 09:56:15 1 0 0 1147832 2284 474028 0 0 0 0 871 255 79 0 21 0 0 19 2021 / 01 / 18 09:56:16 0 0 0 1147832 2284 474028 0 0 0 0 860 232 80 1 19 0 0 20 2021 / 01 / 18 09:56:17 2 0 0 1147832 2284 474028 0 0 0 0 868 239 80 0 20 0 0 21 2021 / 01 / 18 09:56:18 1 0 0 1147832 2284 474028 0 0 0 0 881 255 81 0 19 0 0 22 2021 / 01 / 18 09:56:19 0 0 0 1147832 2284 474028 0 0 0 0 852 236 79 0 21 0 0 23 2021 / 01 / 18 09:56:20 1 0 0 1147832 2284 474028 0 0 0 0 873 248 81 0 19 0 0 24 2021 / 01 / 18 09:56:21 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 25 2021 / 01 / 18 09:56:21 r b swpd free buff cache si so bi bo in cs us sy id wa st 26 2021 / 01 / 18 09:56:21 1 0 0 1147832 2284 474028 0 0 0 0 875 267 79 1 20 0 0 27 2021 / 01 / 18 09:56:22 2 0 0 1147832 2284 474028 0 0 0 0 860 235 78 1 21 0 0 28 2021 / 01 / 18 09:56:23 3 0 0 1147832 2284 474028 0 0 0 0 868 247 80 0 20 0 0 29 2021 / 01 / 18 09:56:24 1 0 0 1147832 2284 474028 0 0 0 0 871 221 81 0 19 0 0 30 2021 / 01 / 18 09:56:25 1 0 0 1147832 2284 474028 0 0 0 0 883 241 81 0 19 0 0 31 2021 / 01 / 18 09:56:26 0 0 0 1147832 2284 474028 0 0 0 0 861 249 78 1 21 0 0 32 2021 / 01 / 18 09:56:27 0 0 0 1147832 2284 474028 0 0 0 0 892 261 81 0 19 0 0 33 2021 / 01 / 18 09:56:28 0 0 0 1147832 2284 474028 0 0 0 0 869 250 79 0 21 0 0 34 2021 / 01 / 18 09:56:29 1 0 0 1147832 2284 474028 0 0 0 0 891 254 80 0 20 0 0 35 2021 / 01 / 18 09:56:30 1 0 0 1147832 2284 474028 0 0 0 0 879 250 79 2 19 0 0 36 2021 / 01 / 18 09:56:31 2 0 0 1147832 2284 474028 0 0 0 0 879 234 80 0 20 0 0 37 2021 / 01 / 18 09:56:32 0 0 0 1147832 2284 474028 0 0 0 0 887 248 81 0 19 0 0 38 2021 / 01 / 18 09:56:33 2 0 0 1147832 2284 474028 0 0 0 2 874 275 78 0 22 0 0 39 2021 / 01 / 18 09:56:34 1 0 0 1147832 2284 474028 0 0 0 0 887 261 81 0 19 0 0 40 2021 / 01 / 18 09:56:35 1 0 0 1147832 2284 474028 0 0 0 0 872 261 80 0 20 0 0 41 2021 / 01 / 18 09:56:36 4 0 0 1147832 2284 474028 0 0 0 0 891 258 80 1 19 0 0 42 2021 / 01 / 18 09:56:37 0 0 0 1147832 2284 474032 0 0 0 0 865 237 79 0 21 0 0 43 2021 / 01 / 18 09:56:38 1 0 0 1147832 2284 474032 0 0 0 0 885 260 80 0 20 0 0 44 2021 / 01 / 18 09:56:39 0 0 0 1147832 2284 474032 0 0 0 0 868 238 80 0 20 0 0 45 2021 / 01 / 18 09:56:40 1 0 0 1147832 2284 474032 0 0 0 0 883 264 78 2 20 0 0 46 2021 / 01 / 18 09:56:41 1 0 0 1147832 2284 474032 0 0 0 0 878 237 81 0 19 0 0 47 2021 / 01 / 18 09:56:42 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 48 2021 / 01 / 18 09:56:42 r b swpd free buff cache si so bi bo in cs us sy id wa st 49 2021 / 01 / 18 09:56:42 2 0 0 1147832 2284 474032 0 0 0 0 871 235 80 0 20 0 0 50 2021 / 01 / 18 09:56:43 1 0 0 1147832 2284 474032 0 0 0 8 880 223 81 0 19 0 0 51 2021 / 01 / 18 09:56:44 1 0 0 1147832 2284 474032 0 0 0 0 872 258 80 0 20 0 0 52 2021 / 01 / 18 09:56:45 2 0 0 1147832 2284 474032 0 0 0 0 856 231 78 0 22 0 0 53 2021 / 01 / 18 09:56:46 1 0 0 1147832 2284 474032 0 0 0 0 888 252 80 1 19 0 0 54 2021 / 01 / 18 09:56:47 1 0 0 1147832 2284 474032 0 0 0 0 872 242 80 0 20 0 0 55 2021 / 01 / 18 09:56:48 1 0 0 1147832 2284 474032 0 0 0 0 896 253 81 0 19 0 0 56 2021 / 01 / 18 09:56:49 0 0 0 1147832 2284 474032 0 0 0 0 874 240 81 0 19 0 0 57 2021 / 01 / 18 09:56:50 0 0 0 1147832 2284 474032 0 0 0 0 872 261 79 0 21 0 0 58 2021 / 01 / 18 09:56:51 1 0 0 1147832 2284 474032 0 0 0 0 875 229 80 1 19 0 0 59 2021 / 01 / 18 09:56:52 0 0 0 1147832 2284 474032 0 0 0 0 854 239 78 0 22 0 0 60 2021 / 01 / 18 09:56:53 1 0 0 1147832 2284 474032 0 0 0 0 869 223 81 0 19 0 0 61 2021 / 01 / 18 09:56:54 1 0 0 1147832 2284 474032 0 0 0 0 861 243 80 0 20 0 0 62 2021 / 01 / 18 09:56:55 1 0 0 1147832 2284 474032 0 0 0 0 870 227 80 0 20 0 0 63 2021 / 01 / 18 09:56:56 0 0 0 1147832 2284 474032 0 0 0 0 887 256 80 1 19 0 0 64 2021 / 01 / 18 09:56:57 1 0 0 1147832 2284 474032 0 0 0 9 856 228 79 0 21 0 0 65 2021 / 01 / 18 09:56:58 1 0 0 1147832 2284 474032 0 0 0 0 865 238 80 0 20 0 0 66 2021 / 01 / 18 09:56:59 1 0 0 1147832 2284 474032 0 0 0 0 872 219 80 0 20 0 0 67 2021 / 01 / 18 09:57:00 1 0 0 1147832 2284 474032 0 0 0 0 898 273 81 0 19 0 0 68 2021 / 01 / 18 09:57:01 0 0 0 1147832 2284 474032 0 0 0 0 868 243 79 2 19 0 0 69 2021 / 01 / 18 09:57:02 1 0 0 1147832 2284 474032 0 0 0 0 872 244 80 0 20 0 0 70 2021 / 01 / 18 09:57:03 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 71 2021 / 01 / 18 09:57:03 r b swpd free buff cache si so bi bo in cs us sy id wa st 72 2021 / 01 / 18 09:57:03 1 0 0 1147832 2284 474032 0 0 0 13 878 249 79 1 20 0 0 73 2021 / 01 / 18 09:57:04 3 0 0 1147832 2284 474032 0 0 0 0 861 232 79 0 21 0 0 74 2021 / 01 / 18 09:57:05 3 0 0 1147832 2284 474032 0 0 0 0 883 234 80 0 20 0 0 75 2021 / 01 / 18 09:57:06 5 0 0 1147832 2284 474032 0 0 0 0 880 238 79 1 20 0 0 76 2021 / 01 / 18 09:57:07 1 0 0 1147832 2284 474032 0 0 0 0 881 227 81 0 19 0 0 77 2021 / 01 / 18 09:57:08 0 0 0 1147832 2284 474032 0 0 0 0 868 235 80 0 20 0 0 78 2021 / 01 / 18 09:57:09 0 0 0 1147832 2284 474032 0 0 0 0 873 257 79 0 21 0 0 79 2021 / 01 / 18 09:57:10 0 0 0 1147832 2284 474032 0 0 0 0 901 273 81 0 19 0 0 80 2021 / 01 / 18 09:57:11 2 0 0 1147832 2284 474032 0 0 0 0 878 244 78 1 21 0 0 81 2021 / 01 / 18 09:57:12 1 0 0 1147832 2284 474032 0 0 0 0 882 242 81 0 19 0 0 82 2021 / 01 / 18 09:57:13 1 0 0 1147832 2284 474036 0 0 0 0 861 234 80 0 20 0 0 83 2021 / 01 / 18 09:57:14 1 0 0 1147832 2284 474036 0 0 0 8 876 209 81 0 19 0 0 84 2021 / 01 / 18 09:57:15 0 0 0 1147832 2284 474036 0 0 0 0 854 228 78 0 22 0 0 85 2021 / 01 / 18 09:57:16 1 0 0 1147832 2284 474036 0 0 0 0 886 265 80 1 19 0 0 86 2021 / 01 / 18 09:57:17 1 0 0 1147832 2284 474036 0 0 0 0 883 260 80 0 20 0 0 87 2021 / 01 / 18 09:57:18 1 0 0 1147832 2284 474036 0 0 0 0 878 241 80 0 20 0 0 88 2021 / 01 / 18 09:57:19 2 0 0 1147832 2284 474036 0 0 0 0 893 245 80 1 19 0 0 89 2021 / 01 / 18 09:57:20 0 0 0 1147832 2284 474036 0 0 0 0 870 235 79 1 20 0 0 90 2021 / 01 / 18 09:57:21 1 0 0 1147832 2284 474036 0 0 0 0 870 238 79 1 20 0 0 91 2021 / 01 / 18 09:57:22 1 0 0 1147832 2284 474036 0 0 0 0 878 244 81 0 19 0 0 92 2021 / 01 / 18 09:57:23 1 0 0 1147832 2284 474036 0 0 0 0 851 241 78 0 22 0 0 93 2021 / 01 / 18 09:57:24 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 94 2021 / 01 / 18 09:57:24 r b swpd free buff cache si so bi bo in cs us sy id wa st 95 2021 / 01 / 18 09:57:24 3 0 0 1147832 2284 474036 0 0 0 0 879 222 81 0 19 0 0 96 2021 / 01 / 18 09:57:25 1 0 0 1147832 2284 474036 0 0 0 0 879 244 80 0 20 0 0 97 2021 / 01 / 18 09:57:26 1 0 0 1147832 2284 474036 0 0 0 0 893 269 80 1 19 0 0 98 2021 / 01 / 18 09:57:27 0 0 0 1147832 2284 474036 0 0 0 0 882 276 79 0 21 0 0 99 2021 / 01 / 18 09:57:28 1 0 0 1147832 2284 474036 0 0 0 0 887 266 80 0 20 0 0 100 2021 / 01 / 18 09:57:29 1 0 0 1147832 2284 474036 0 0 0 0 878 250 80 0 20 0 0 101 2021 / 01 / 18 09:57:30 3 0 0 1147832 2284 474036 0 0 0 0 896 264 80 0 20 0 0 102 2021 / 01 / 18 09:57:31 2 0 0 1147832 2284 474036 0 0 0 0 886 239 80 1 19 0 0 103 2021 / 01 / 18 09:57:32 0 0 0 1147832 2284 474036 0 0 0 0 855 239 79 0 21 0 0 104 2021 / 01 / 18 09:57:33 1 0 0 1147832 2284 474036 0 0 0 67 914 280 82 0 18 0 0 105 2021 / 01 / 18 09:57:34 2 0 0 1147832 2284 474036 0 0 0 0 875 282 78 0 22 0 0 106 2021 / 01 / 18 09:57:35 1 0 0 1147832 2284 474036 0 0 0 0 891 258 81 0 19 0 0 107 2021 / 01 / 18 09:57:36 1 0 0 1147832 2284 474036 0 0 0 0 882 273 79 1 20 0 0 108 2021 / 01 / 18 09:57:37 1 0 0 1147832 2284 474036 0 0 0 0 883 256 80 0 20 0 0 109 2021 / 01 / 18 09:57:38 0 0 0 1147832 2284 474036 0 0 0 0 891 261 80 1 19 0 0 110 2021 / 01 / 18 09:57:39 3 0 0 1147832 2284 474036 0 0 0 0 881 273 78 1 21 0 0 111 2021 / 01 / 18 09:57:40 6 0 0 1147832 2284 474036 0 0 0 0 877 237 80 0 20 0 0 112 2021 / 01 / 18 09:57:41 1 0 0 1147832 2284 474036 0 0 0 0 883 249 79 1 20 0 0 113 2021 / 01 / 18 09:57:42 1 0 0 1147832 2284 474036 0 0 0 0 875 247 81 0 19 0 0 114 2021 / 01 / 18 09:57:43 0 0 0 1147832 2284 474036 0 0 0 0 886 254 81 0 19 0 0 115 2021 / 01 / 18 09:57:44 0 0 0 1147832 2284 474036 0 0 0 0 860 234 79 0 21 0 0 116 2021 / 01 / 18 09:57:45 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 117 2021 / 01 / 18 09:57:45 r b swpd free buff cache si so bi bo in cs us sy id wa st 118 2021 / 01 / 18 09:57:45 2 0 0 1147832 2284 474036 0 0 0 4 893 255 81 0 19 0 0 119 2021 / 01 / 18 09:57:46 2 0 0 1147832 2284 474036 0 0 0 0 881 302 77 1 22 0 0 120 2021 / 01 / 18 09:57:47 1 0 0 1147832 2284 474036 0 0 0 0 893 249 81 0 19 0 0 121 2021 / 01 / 18 09:57:48 1 0 0 1147832 2284 474036 0 0 0 0 866 257 80 0 20 0 0 122 2021 / 01 / 18 09:57:49 1 0 0 1147832 2284 474040 0 0 0 0 875 252 81 0 19 0 0 123 2021 / 01 / 18 09:57:50 0 0 0 1147832 2284 474040 0 0 0 0 870 247 80 0 20 0 0 124 2021 / 01 / 18 09:57:51 1 0 0 1147832 2284 474040 0 0 0 0 861 243 78 2 20 0 0 125 2021 / 01 / 18 09:57:52 0 0 0 1147832 2284 474040 0 0 0 0 861 243 80 0 20 0 0 126 2021 / 01 / 18 09:57:53 3 0 0 1147832 2284 474040 0 0 0 0 865 226 80 0 20 0 0 127 2021 / 01 / 18 09:57:54 1 0 0 1147832 2284 474040 0 0 0 0 871 221 81 0 19 0 0 128 2021 / 01 / 18 09:57:55 0 0 0 1147832 2284 474040 0 0 0 0 868 232 80 0 20 0 0 129 2021 / 01 / 18 09:57:56 1 0 0 1147832 2284 474040 0 0 0 0 879 243 79 1 20 0 0 130 2021 / 01 / 18 09:57:57 0 0 0 1147832 2284 474040 0 0 0 0 857 239 79 1 20 0 0 131 2021 / 01 / 18 09:57:58 1 0 0 1147832 2284 474040 0 0 0 0 876 264 80 0 20 0 0 132 2021 / 01 / 18 09:57:59 4 0 0 1147832 2284 474040 0 0 0 0 897 279 80 0 20 0 0 133 2021 / 01 / 18 09:58:00 3 0 0 1147832 2284 474040 0 0 0 0 875 249 80 0 20 0 0 134 2021 / 01 / 18 09:58:01 1 0 0 1147832 2284 474040 0 0 0 0 904 299 80 1 19 0 0 135 2021 / 01 / 18 09:58:02 2 0 0 1147832 2284 474040 0 0 0 0 867 260 79 0 21 0 0 136 2021 / 01 / 18 09:58:03 1 0 0 1147832 2284 474040 0 0 0 9 870 242 80 0 20 0 0 137 2021 / 01 / 18 09:58:04 1 0 0 1147832 2284 474040 0 0 0 0 863 245 80 0 20 0 0 138 2021 / 01 / 18 09:58:05 2 0 0 1147832 2284 474040 0 0 0 0 881 245 81 0 19 0 0 139 2021 / 01 / 18 09:58:06 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 140 2021 / 01 / 18 09:58:06 r b swpd free buff cache si so bi bo in cs us sy id wa st 141 2021 / 01 / 18 09:58:06 1 0 0 1147832 2284 474040 0 0 0 0 862 232 80 0 20 0 0 142 2021 / 01 / 18 09:58:07 1 0 0 1147832 2284 474040 0 0 0 0 870 269 78 1 21 0 0 143 2021 / 01 / 18 09:58:08 0 0 0 1147832 2284 474040 0 0 0 0 869 231 81 0 19 0 0 144 2021 / 01 / 18 09:58:09 1 0 0 1147832 2284 474040 0 0 0 0 862 230 80 0 20 0 0 145 2021 / 01 / 18 09:58:10 1 0 0 1147832 2284 474040 0 0 0 0 884 250 80 0 20 0 0 146 2021 / 01 / 18 09:58:11 1 0 0 1147832 2284 474040 0 0 0 0 861 239 80 0 20 0 0 147 2021 / 01 / 18 09:58:12 1 0 0 1147832 2284 474040 0 0 0 0 866 243 80 1 19 0 0 148 2021 / 01 / 18 09:58:13 1 0 0 1147832 2284 474040 0 0 0 0 859 228 80 1 19 0 0 149 2021 / 01 / 18 09:58:14 1 0 0 1147832 2284 474040 0 0 0 0 872 252 78 0 22 0 0 150 2021 / 01 / 18 09:58:15 1 0 0 1147832 2284 474040 0 0 0 0 869 232 80 0 20 0 0 151 2021 / 01 / 18 09:58:16 2 0 0 1147832 2284 474040 0 0 0 8 876 246 80 1 19 0 0 152 2021 / 01 / 18 09:58:17 1 0 0 1147832 2284 474040 0 0 0 0 876 234 80 1 19 0 0 153 2021 / 01 / 18 09:58:18 1 0 0 1147832 2284 474040 0 0 0 0 865 262 78 0 22 0 0 154 2021 / 01 / 18 09:58:19 2 0 0 1147832 2284 474040 0 0 0 0 861 231 80 0 20 0 0 155 2021 / 01 / 18 09:58:20 1 0 0 1147832 2284 474040 0 0 0 0 876 262 80 0 20 0 0 156 2021 / 01 / 18 09:58:21 1 0 0 1147832 2284 474040 0 0 0 0 876 242 81 0 19 0 0 157 2021 / 01 / 18 09:58:22 1 0 0 1147832 2284 474040 0 0 0 0 868 241 80 1 19 0 0 158 2021 / 01 / 18 09:58:23 1 0 0 1147832 2284 474040 0 0 0 0 854 230 80 0 20 0 0 159 2021 / 01 / 18 09:58:24 1 0 0 1147832 2284 474040 0 0 0 0 872 237 80 0 20 0 0 160 2021 / 01 / 18 09:58:25 2 0 0 1147832 2284 474040 0 0 0 0 840 208 79 0 21 0 0 161 2021 / 01 / 18 09:58:26 1 0 0 1147832 2284 474040 0 0 0 0 879 232 81 0 19 0 0 162 2021 / 01 / 18 09:58:27 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 163 2021 / 01 / 18 09:58:27 r b swpd free buff cache si so bi bo in cs us sy id wa st 164 2021 / 01 / 18 09:58:27 3 0 0 1147804 2284 474044 0 0 0 0 874 256 78 1 21 0 0 165 2021 / 01 / 18 09:58:28 1 0 0 1147804 2284 474044 0 0 0 0 870 237 81 0 19 0 0 166 2021 / 01 / 18 09:58:29 0 0 0 1147804 2284 474044 0 0 0 0 871 246 81 0 19 0 0 167 2021 / 01 / 18 09:58:30 0 0 0 1147804 2284 474044 0 0 0 0 850 232 79 0 21 0 0 168 2021 / 01 / 18 09:58:31 1 0 0 1147804 2284 474044 0 0 0 0 887 239 81 0 19 0 0 169 2021 / 01 / 18 09:58:32 1 0 0 1147804 2284 474044 0 0 0 0 858 241 78 1 21 0 0 170 2021 / 01 / 18 09:58:33 1 0 0 1147804 2284 474044 0 0 0 0 870 234 81 0 19 0 0 171 2021 / 01 / 18 09:58:34 1 0 0 1147804 2284 474044 0 0 0 2 873 259 80 0 20 0 0 172 2021 / 01 / 18 09:58:35 1 0 0 1147804 2284 474044 0 0 0 0 877 251 80 0 20 0 0 173 2021 / 01 / 18 09:58:36 1 0 0 1147804 2284 474044 0 0 0 0 884 251 80 1 19 0 0 174 2021 / 01 / 18 09:58:37 1 0 0 1147804 2284 474044 0 0 0 0 852 236 78 0 22 0 0 175 2021 / 01 / 18 09:58:38 1 0 0 1147804 2284 474044 0 0 0 0 856 218 79 1 20 0 0 176 2021 / 01 / 18 09:58:39 1 0 0 1147804 2284 474044 0 0 0 0 869 253 81 0 19 0 0 177 2021 / 01 / 18 09:58:40 1 0 0 1147804 2284 474044 0 0 0 0 868 243 79 1 20 0 0 178 2021 / 01 / 18 09:58:41 0 0 0 1147804 2284 474044 0 0 0 0 886 280 81 0 19 0 0 179 2021 / 01 / 18 09:58:42 1 0 0 1147804 2284 474044 0 0 0 0 857 239 79 0 21 0 0 180 2021 / 01 / 18 09:58:43 0 0 0 1147804 2284 474044 0 0 0 0 862 244 79 1 20 0 0 181 2021 / 01 / 18 09:58:44 1 0 0 1147804 2284 474044 0 0 0 0 865 236 80 0 20 0 0 182 2021 / 01 / 18 09:58:45 3 0 0 1147804 2284 474044 0 0 0 0 879 252 81 0 19 0 0 183 2021 / 01 / 18 09:58:46 1 0 0 1147804 2284 474044 0 0 0 0 860 251 80 0 20 0 0 184 2021 / 01 / 18 09:58:47 2 0 0 1147804 2284 474044 0 0 0 8 887 252 80 0 20 0 0 185 2021 / 01 / 18 09:58:48 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 186 2021 / 01 / 18 09:58:48 r b swpd free buff cache si so bi bo in cs us sy id wa st 187 2021 / 01 / 18 09:58:48 1 0 0 1147804 2284 474044 0 0 0 0 857 249 78 1 21 0 0 188 2021 / 01 / 18 09:58:49 1 0 0 1147804 2284 474044 0 0 0 0 883 250 81 0 19 0 0 189 2021 / 01 / 18 09:58:50 1 0 0 1147804 2284 474044 0 0 0 0 851 224 79 0 21 0 0 190 2021 / 01 / 18 09:58:51 4 0 0 1147804 2284 474044 0 0 0 0 881 238 81 0 19 0 0 191 2021 / 01 / 18 09:58:52 1 0 0 1147804 2284 474044 0 0 0 0 860 217 81 0 19 0 0 192 2021 / 01 / 18 09:58:53 0 0 0 1147804 2284 474044 0 0 0 0 836 215 78 1 21 0 0 193 2021 / 01 / 18 09:58:54 2 0 0 1147804 2284 474044 0 0 0 0 873 225 81 0 19 0 0 194 2021 / 01 / 18 09:58:55 0 0 0 1147804 2284 474044 0 0 0 0 857 232 79 1 20 0 0 195 2021 / 01 / 18 09:58:56 1 0 0 1147804 2284 474044 0 0 0 0 854 239 79 0 21 0 0 196 2021 / 01 / 18 09:58:57 1 0 0 1147804 2284 474044 0 0 0 0 875 234 81 0 19 0 0 197 2021 / 01 / 18 09:58:58 1 0 0 1147804 2284 474044 0 0 0 0 863 257 79 1 20 0 0 198 2021 / 01 / 18 09:58:59 1 0 0 1147804 2284 474044 0 0 0 0 857 201 81 0 19 0 0 199 2021 / 01 / 18 09:59:00 0 0 0 1147804 2284 474044 0 0 0 0 855 242 78 0 22 0 0 200 2021 / 01 / 18 09:59:01 2 0 0 1147804 2284 474044 0 0 0 0 873 247 80 0 20 0 0 201 2021 / 01 / 18 09:59:02 0 0 0 1147804 2284 474044 0 0 0 0 862 228 81 0 19 0 0 202 2021 / 01 / 18 09:59:03 2 0 0 1147804 2284 474048 0 0 0 0 868 238 79 1 20 0 0 203 2021 / 01 / 18 09:59:04 6 0 0 1147804 2284 474048 0 0 0 2 872 202 80 1 19 0 0 204 2021 / 01 / 18 09:59:05 0 0 0 1147804 2284 474048 0 0 0 0 857 225 79 0 21 0 0 205 2021 / 01 / 18 09:59:06 5 0 0 1147804 2284 474048 0 0 0 0 876 230 81 0 19 0 0 206 2021 / 01 / 18 09:59:07 2 0 0 1147804 2284 474048 0 0 0 0 861 245 79 0 21 0 0 207 2021 / 01 / 18 09:59:08 1 0 0 1147804 2284 474048 0 0 0 0 870 249 80 1 19 0 0 208 2021 / 01 / 18 09:59:09 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 209 2021 / 01 / 18 09:59:09 r b swpd free buff cache si so bi bo in cs us sy id wa st 210 2021 / 01 / 18 09:59:09 3 0 0 1147804 2284 474048 0 0 0 0 874 245 79 0 21 0 0 211 2021 / 01 / 18 09:59:10 1 0 0 1147772 2284 474048 0 0 0 0 865 226 81 0 19 0 0 212 2021 / 01 / 18 09:59:11 0 0 0 1147772 2284 474048 0 0 0 0 852 235 80 0 20 0 0 213 2021 / 01 / 18 09:59:12 1 0 0 1147772 2284 474048 0 0 0 0 866 247 79 0 21 0 0 214 2021 / 01 / 18 09:59:13 1 0 0 1147772 2284 474048 0 0 0 0 868 237 80 0 20 0 0 215 2021 / 01 / 18 09:59:14 2 0 0 1147772 2284 474048 0 0 0 0 876 239 80 1 19 0 0 216 2021 / 01 / 18 09:59:15 1 0 0 1147772 2284 474048 0 0 0 0 868 232 80 0 20 0 0 217 2021 / 01 / 18 09:59:16 0 0 0 1147772 2284 474048 0 0 0 0 870 235 80 1 19 0 0 218 2021 / 01 / 18 09:59:17 1 0 0 1147772 2284 474048 0 0 0 0 867 222 79 1 20 0 0 219 2021 / 01 / 18 09:59:18 0 0 0 1147772 2284 474048 0 0 0 8 872 264 79 0 21 0 0 220 2021 / 01 / 18 09:59:19 1 0 0 1147772 2284 474048 0 0 0 0 867 235 79 1 20 0 0 221 2021 / 01 / 18 09:59:20 1 0 0 1147772 2284 474048 0 0 0 0 875 230 81 0 19 0 0 222 2021 / 01 / 18 09:59:21 2 0 0 1147772 2284 474048 0 0 0 0 865 248 80 0 20 0 0 223 2021 / 01 / 18 09:59:22 1 0 0 1147772 2284 474048 0 0 0 0 864 205 81 0 19 0 0 224 2021 / 01 / 18 09:59:23 0 0 0 1147772 2284 474048 0 0 0 0 848 233 78 0 22 0 0 225 2021 / 01 / 18 09:59:24 1 0 0 1147772 2284 474048 0 0 0 0 866 230 80 1 19 0 0 226 2021 / 01 / 18 09:59:25 1 0 0 1147772 2284 474048 0 0 0 0 849 221 79 0 21 0 0 227 2021 / 01 / 18 09:59:26 1 0 0 1147772 2284 474048 0 0 0 0 894 259 81 0 19 0 0 228 2021 / 01 / 18 09:59:27 1 0 0 1147772 2284 474048 0 0 0 0 871 234 81 0 19 0 0 229 2021 / 01 / 18 09:59:28 0 0 0 1147772 2284 474048 0 0 0 0 844 232 79 0 21 0 0 230 2021 / 01 / 18 09:59:29 0 0 0 1147772 2284 474048 0 0 0 0 886 251 81 0 19 0 0 231 2021 / 01 / 18 09:59:30 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 232 2021 / 01 / 18 09:59:30 r b swpd free buff cache si so bi bo in cs us sy id wa st 233 2021 / 01 / 18 09:59:30 1 0 0 1147772 2284 474048 0 0 0 0 854 244 78 1 21 0 0 234 2021 / 01 / 18 09:59:31 1 0 0 1147772 2284 474048 0 0 0 0 877 259 81 0 19 0 0 235 2021 / 01 / 18 09:59:32 1 0 0 1147772 2284 474048 0 0 0 0 868 237 80 0 20 0 0 236 2021 / 01 / 18 09:59:33 3 0 0 1147772 2284 474048 0 0 0 0 875 250 80 0 20 0 0 237 2021 / 01 / 18 09:59:34 1 0 0 1147772 2284 474048 0 0 0 3 899 295 81 0 19 0 0 238 2021 / 01 / 18 09:59:35 1 0 0 1147772 2284 474048 0 0 0 0 854 236 77 1 22 0 0 239 2021 / 01 / 18 09:59:36 1 0 0 1147772 2284 474048 0 0 0 0 867 238 81 0 19 0 0 240 2021 / 01 / 18 09:59:37 3 0 0 1147772 2284 474048 0 0 0 0 871 244 79 1 20 0 0 241 2021 / 01 / 18 09:59:38 1 0 0 1147772 2284 474048 0 0 0 0 876 251 80 0 20 0 0 242 2021 / 01 / 18 09:59:39 1 0 0 1147772 2284 474048 0 0 0 0 876 247 81 0 19 0 0 243 2021 / 01 / 18 09:59:40 0 0 0 1147772 2284 474052 0 0 0 0 851 226 79 1 20 0 0 244 2021 / 01 / 18 09:59:41 0 0 0 1147772 2284 474052 0 0 0 0 886 270 81 0 19 0 0 245 2021 / 01 / 18 09:59:42 4 0 0 1147772 2284 474052 0 0 0 0 847 217 78 0 22 0 0 246 2021 / 01 / 18 09:59:43 1 0 0 1147772 2284 474052 0 0 0 0 867 236 80 1 19 0 0 247 2021 / 01 / 18 09:59:44 1 0 0 1147772 2284 474052 0 0 0 0 854 233 79 0 21 0 0 248 2021 / 01 / 18 09:59:45 4 0 0 1147772 2284 474052 0 0 0 0 886 246 80 1 19 0 0 249 2021 / 01 / 18 09:59:46 0 0 0 1147772 2284 474052 0 0 0 0 875 246 81 0 19 0 0 250 2021 / 01 / 18 09:59:47 1 0 0 1147772 2284 474052 0 0 0 0 880 280 79 0 21 0 0 251 2021 / 01 / 18 09:59:48 2 0 0 1147772 2284 474052 0 0 0 0 872 247 79 0 21 0 0 252 2021 / 01 / 18 09:59:49 2 0 0 1147772 2284 474052 0 0 0 8 886 260 81 0 19 0 0 253 2021 / 01 / 18 09:59:50 2 0 0 1147772 2284 474052 0 0 0 0 884 242 80 1 19 0 0 254 2021 / 01 / 18 09:59:51 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 255 2021 / 01 / 18 09:59:51 r b swpd free buff cache si so bi bo in cs us sy id wa st 256 2021 / 01 / 18 09:59:51 2 0 0 1147772 2284 474052 0 0 0 0 864 237 78 0 22 0 0 257 2021 / 01 / 18 09:59:52 0 0 0 1147772 2284 474052 0 0 0 0 859 216 81 0 19 0 0 258 2021 / 01 / 18 09:59:53 1 0 0 1147772 2284 474052 0 0 0 0 877 255 80 0 20 0 0 259 2021 / 01 / 18 09:59:54 1 0 0 1147772 2284 474052 0 0 0 0 869 235 81 0 19 0 0 260 2021 / 01 / 18 09:59:55 1 0 0 1147772 2284 474052 0 0 0 0 866 237 79 1 20 0 0 261 2021 / 01 / 18 09:59:56 1 0 0 1147772 2284 474052 0 0 0 0 879 278 79 1 20 0 0 262 2021 / 01 / 18 09:59:58 1 0 0 1147772 2284 474052 0 0 0 0 864 232 80 1 19 0 0 263 2021 / 01 / 18 09:59:59 3 0 0 1147772 2284 474052 0 0 0 0 871 267 78 0 22 0 0 264 2021 / 01 / 18 10:00:00 1 0 0 1147772 2284 474052 0 0 0 0 877 252 81 0 19 0 0 265 2021 / 01 / 18 10:00:01 4 0 0 1147772 2284 474052 0 0 0 0 878 263 79 1 20 0 0 266 2021 / 01 / 18 10:00:02 4 0 0 1147772 2284 474052 0 0 0 0 908 286 81 0 19 0 0 267 2021 / 01 / 18 10:00:03 2 0 0 1147772 2284 474052 0 0 0 0 863 242 79 0 21 0 0 268 2021 / 01 / 18 10:00:04 1 0 0 1147772 2284 474052 0 0 0 0 874 234 80 1 19 0 0 269 2021 / 01 / 18 10:00:05 2 0 0 1147772 2284 474052 0 0 0 4 872 240 81 0 19 0 0 270 2021 / 01 / 18 10:00:06 0 0 0 1147772 2284 474052 0 0 0 0 861 269 78 0 22 0 0 271 2021 / 01 / 18 10:00:07 1 0 0 1147772 2284 474052 0 0 0 0 884 260 81 0 19 0 0 272 2021 / 01 / 18 10:00:08 2 0 0 1147772 2284 474052 0 0 0 0 894 275 81 0 19 0 0 273 2021 / 01 / 18 10:00:09 0 0 0 1147772 2284 474052 0 0 0 0 845 245 77 1 22 0 0 274 2021 / 01 / 18 10:00:10 0 0 0 1147772 2284 474052 0 0 0 0 882 280 81 0 19 0 0 275 2021 / 01 / 18 10:00:11 1 0 0 1147772 2284 474052 0 0 0 0 867 228 80 0 20 0 0 276 2021 / 01 / 18 10:00:12 1 0 0 1147772 2284 474052 0 0 0 0 873 240 80 0 20 0 0 277 2021 / 01 / 18 10:00:13 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 278 2021 / 01 / 18 10:00:13 r b swpd free buff cache si so bi bo in cs us sy id wa st 279 2021 / 01 / 18 10:00:13 3 0 0 1147772 2284 474052 0 0 0 0 885 245 80 1 19 0 0 280 2021 / 01 / 18 10:00:14 1 0 0 1147772 2284 474052 0 0 0 0 852 232 78 2 20 0 0 281 2021 / 01 / 18 10:00:15 2 0 0 1147772 2284 474052 0 0 0 0 881 242 80 0 20 0 0 282 2021 / 01 / 18 10:00:16 0 0 0 1147772 2284 474052 0 0 0 0 870 286 79 0 21 0 0 283 2021 / 01 / 18 10:00:17 1 0 0 1147772 2284 474056 0 0 0 0 869 226 81 0 19 0 0 284 2021 / 01 / 18 10:00:18 2 0 0 1147740 2284 474056 0 0 0 0 871 249 78 1 21 0 0 285 2021 / 01 / 18 10:00:19 1 0 0 1147740 2284 474056 0 0 0 0 872 242 81 0 19 0 0 286 2021 / 01 / 18 10:00:20 2 0 0 1147740 2284 474056 0 0 0 0 864 241 81 0 19 0 0 287 2021 / 01 / 18 10:00:21 0 0 0 1147740 2284 474056 0 0 0 8 876 291 79 0 21 0 0 288 2021 / 01 / 18 10:00:22 1 0 0 1147740 2284 474056 0 0 0 0 868 220 81 0 19 0 0 289 2021 / 01 / 18 10:00:23 0 0 0 1147740 2284 474056 0 0 0 0 864 229 79 1 20 0 0 290 2021 / 01 / 18 10:00:24 1 0 0 1147740 2284 474056 0 0 0 0 854 240 80 0 20 0 0 291 2021 / 01 / 18 10:00:25 4 0 0 1147740 2284 474056 0 0 0 0 869 245 80 0 20 0 0 292 2021 / 01 / 18 10:00:26 1 0 0 1147740 2284 474056 0 0 0 0 863 231 80 0 20 0 0 293 2021 / 01 / 18 10:00:27 2 0 0 1147740 2284 474056 0 0 0 0 880 237 81 0 19 0 0 294 2021 / 01 / 18 10:00:28 2 0 0 1147740 2284 474056 0 0 0 0 864 253 77 1 22 0 0 295 2021 / 01 / 18 10:00:29 1 0 0 1147740 2284 474056 0 0 0 0 876 236 81 0 19 0 0 296 2021 / 01 / 18 10:00:30 2 0 0 1147740 2284 474056 0 0 0 0 862 229 80 0 20 0 0 297 2021 / 01 / 18 10:00:31 1 0 0 1147740 2284 474056 0 0 0 0 873 236 81 0 19 0 0 298 2021 / 01 / 18 10:00:32 0 0 0 1147740 2284 474056 0 0 0 0 853 215 80 0 20 0 0 299 2021 / 01 / 18 10:00:33 1 0 0 1147740 2284 474056 0 0 0 0 855 230 77 2 21 0 0 300 2021 / 01 / 18 10:00:34 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 301 2021 / 01 / 18 10:00:34 r b swpd free buff cache si so bi bo in cs us sy id wa st 302 2021 / 01 / 18 10:00:34 1 0 0 1147740 2284 474056 0 0 0 0 857 241 80 0 20 0 0 303 2021 / 01 / 18 10:00:35 1 0 0 1147740 2284 474056 0 0 0 47 884 256 79 1 20 0 0 304 2021 / 01 / 18 10:00:36 1 0 0 1147740 2284 474056 0 0 0 0 877 253 81 0 19 0 0 305 2021 / 01 / 18 10:00:37 1 0 0 1147740 2284 474056 0 0 0 0 867 249 80 0 20 0 0 306 2021 / 01 / 18 10:00:38 1 0 0 1147740 2284 474056 0 0 0 0 875 254 79 1 20 0 0 307 2021 / 01 / 18 10:00:39 1 0 0 1147740 2284 474056 0 0 0 0 872 231 81 0 19 0 0 308 2021 / 01 / 18 10:00:40 1 0 0 1147740 2284 474056 0 0 0 0 848 256 79 0 21 0 0 309 2021 / 01 / 18 10:00:41 0 0 0 1147740 2284 474056 0 0 0 0 874 253 81 0 19 0 0 310 2021 / 01 / 18 10:00:42 1 0 0 1147740 2284 474056 0 0 0 0 853 237 79 0 21 0 0 311 2021 / 01 / 18 10:00:43 1 0 0 1147740 2284 474056 0 0 0 0 874 243 80 1 19 0 0 312 2021 / 01 / 18 10:00:44 5 0 0 1147740 2284 474056 0 0 0 0 881 254 80 0 20 0 0 313 2021 / 01 / 18 10:00:45 1 0 0 1147740 2284 474056 0 0 0 0 870 252 80 0 20 0 0 314 2021 / 01 / 18 10:00:46 1 0 0 1147740 2284 474056 0 0 0 0 862 237 81 0 19 0 0 315 2021 / 01 / 18 10:00:47 0 0 0 1147740 2284 474056 0 0 0 0 886 284 79 1 20 0 0 316 2021 / 01 / 18 10:00:48 0 0 0 1147740 2284 474056 0 0 0 0 862 246 80 0 20 0 0 317 2021 / 01 / 18 10:00:49 1 0 0 1147740 2284 474056 0 0 0 0 873 245 79 1 20 0 0 318 2021 / 01 / 18 10:00:50 0 0 0 1147740 2284 474056 0 0 0 0 865 241 81 0 19 0 0 319 2021 / 01 / 18 10:00:51 1 0 0 1147740 2284 474056 0 0 0 0 853 231 77 1 22 0 0 320 2021 / 01 / 18 10:00:52 0 0 0 1147740 2284 474056 0 0 0 4 877 246 80 1 19 0 0 321 2021 / 01 / 18 10:00:53 1 0 0 1147740 2284 474056 0 0 0 0 858 243 80 0 20 0 0 322 2021 / 01 / 18 10:00:54 1 0 0 1147740 2284 474056 0 0 0 0 876 241 80 0 20 0 0 323 2021 / 01 / 18 10:00:55 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 324 2021 / 01 / 18 10:00:55 r b swpd free buff cache si so bi bo in cs us sy id wa st 325 2021 / 01 / 18 10:00:55 2 0 0 1147740 2284 474060 0 0 0 0 853 204 81 0 19 0 0 326 2021 / 01 / 18 10:00:56 1 0 0 1147740 2284 474060 0 0 0 0 870 248 79 1 20 0 0 327 2021 / 01 / 18 10:00:57 1 0 0 1147740 2284 474060 0 0 0 0 868 232 81 0 19 0 0 328 2021 / 01 / 18 10:00:58 0 0 0 1147740 2284 474060 0 0 0 0 852 241 78 0 22 0 0 329 2021 / 01 / 18 10:00:59 1 0 0 1147740 2284 474060 0 0 0 0 866 242 81 0 19 0 0 330 2021 / 01 / 18 10:01:00 1 0 0 1147740 2284 474060 0 0 0 0 867 238 80 0 20 0 0 331 2021 / 01 / 18 10:01:01 1 0 0 1147740 2284 474060 0 0 0 0 868 234 79 1 20 0 0 332 2021 / 01 / 18 10:01:02 0 0 0 1147592 2284 474068 0 0 0 0 873 304 79 2 19 0 0 333 2021 / 01 / 18 10:01:03 1 0 0 1147592 2284 474068 0 0 0 0 886 247 82 0 18 0 0 334 2021 / 01 / 18 10:01:04 1 0 0 1147592 2284 474068 0 0 0 0 856 228 81 0 19 0 0 335 2021 / 01 / 18 10:01:05 1 0 0 1147592 2284 474068 0 0 0 10 850 232 77 1 22 0 0 336 2021 / 01 / 18 10:01:06 0 0 0 1147592 2284 474068 0 0 0 0 164 270 4 0 96 0 0 337 2021 / 01 / 18 10:01:07 0 0 0 1147592 2284 474068 0 0 0 0 133 290 0 1 99 0 0 338 2021 / 01 / 18 10:01:08 0 0 0 1147592 2284 474068 0 0 0 0 143 313 0 0 100 0 0 339 2021 / 01 / 18 10:01:09 0 0 0 1147592 2284 474068 0 0 0 0 126 274 0 1 99 0 0 340 2021 / 01 / 18 10:01:10 0 0 0 1147592 2284 474068 0 0 0 0 121 264 0 0 100 0 0 341 2021 / 01 / 18 10:01:11 0 0 0 1147592 2284 474068 0 0 0 0 125 268 0 0 100 0 0 342 2021 / 01 / 18 10:01:12 0 0 0 1147592 2284 474068 0 0 0 0 120 269 0 0 100 0 0 343 2021 / 01 / 18 10:01:13 1 0 0 1147592 2284 474068 0 0 0 0 107 230 0 0 100 0 0 344 2021 / 01 / 18 10:01:14 0 0 0 1147592 2284 474068 0 0 0 0 108 244 1 0 99 0 0 345 2021 / 01 / 18 10:01:15 0 0 0 1147560 2284 474068 0 0 0 0 112 243 0 0 100 0 0 346 2021 / 01 / 18 10:01:16 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 347 2021 / 01 / 18 10:01:16 r b swpd free buff cache si so bi bo in cs us sy id wa st 348 2021 / 01 / 18 10:01:16 1 0 0 1147560 2284 474068 0 0 0 0 116 260 0 0 100 0 0 349 2021 / 01 / 18 10:01:17 0 0 0 1147560 2284 474068 0 0 0 0 122 265 0 0 100 0 0 350 2021 / 01 / 18 10:01:18 0 0 0 1147560 2284 474068 0 0 0 0 114 255 0 0 100 0 0 351 2021 / 01 / 18 10:01:19 0 0 0 1147560 2284 474068 0 0 0 0 149 316 0 0 100 0 0 352 2021 / 01 / 18 10:01:20 0 0 0 1147560 2284 474068 0 0 0 0 147 321 0 1 99 0 0 353 2021 / 01 / 18 10:01:21 1 0 0 1147560 2284 474068 0 0 0 0 146 318 0 0 100 0 0 354 2021 / 01 / 18 10:01:22 0 0 0 1147560 2284 474068 0 0 0 0 133 294 0 0 100 0 0 355 2021 / 01 / 18 10:01:23 0 0 0 1147560 2284 474068 0 0 0 8 130 281 0 0 100 0 0 356 2021 / 01 / 18 10:01:24 0 0 0 1147560 2284 474068 0 0 0 0 118 254 1 1 98 0 0 357 2021 / 01 / 18 10:01:25 0 0 0 1147560 2284 474068 0 0 0 0 111 246 0 0 100 0 0 358 2021 / 01 / 18 10:01:26 0 0 0 1147560 2284 474068 0 0 0 0 125 275 0 0 100 0 0 359 2021 / 01 / 18 10:01:27 0 0 0 1147560 2284 474068 0 0 0 0 138 297 0 1 99 0 0 360 2021 / 01 / 18 10:01:28 0 0 0 1147560 2284 474068 0 0 0 0 115 256 0 0 100 0 0 361 2021 / 01 / 18 10:01:29 0 0 0 1147560 2284 474068 0 0 0 0 114 250 0 0 100 0 0 362 2021 / 01 / 18 10:01:30 0 0 0 1147560 2284 474068 0 0 0 0 128 280 0 0 100 0 0 363 2021 / 01 / 18 10:01:31 0 0 0 1147560 2284 474072 0 0 0 0 121 269 0 0 100 0 0 364 2021 / 01 / 18 10:01:32 0 0 0 1147560 2284 474072 0 0 0 0 99 220 0 0 100 0 0 365 2021 / 01 / 18 10:01:33 0 0 0 1147560 2284 474072 0 0 0 0 111 240 0 0 100 0 0 366 2021 / 01 / 18 10:01:34 0 0 0 1147560 2284 474072 0 0 0 0 130 282 0 0 100 0 0 367 2021 / 01 / 18 10:01:35 0 0 0 1147560 2284 474072 0 0 0 50 112 239 0 0 100 0 0 368 2021 / 01 / 18 10:01:36 0 0 0 1147560 2284 474072 0 0 0 0 130 282 0 0 100 0 0 実務でよく䜿甚されるのが「r(実行䞭ず実行埅ち䞭のプロセス数の合蚈)の欄」ず「CPU」の欄であるため、今回はその二぀の平均を awk を甚いお算出する。 「rの平均(プロセスの平均)」 awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sum += $3; count +=1} END{print "プロセス数合蚈"sum, "プロセス数平均"sum/count} ' vmstat_0956_1001.log ※「vmstat_0956_1001.log」はログファむル名 # 結果 プロセス数合蚈 363 プロセス数平均 1 . 08036 「CPUの各情報毎の平均」 # us(カヌネルコヌド以倖の実行に䜿甚した時間) awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sumUs += $15; count +=1} END{print "実行に䜿甚した時間の合蚈"sumUs, "実行に䜿甚した時間の平均"sumUs/count} ' vmstat_0956_1001.log # 結果 実行に䜿甚した時間の合蚈 23939 実行に䜿甚した時間の平均 71 . 247 # sy(カヌネルコヌド以倖の実行に䜿甚した時間) awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sumSy += $16; count +=1} END{print "実行に䜿甚した時間の合蚈"sumSy, "実行に䜿甚した時間の平均"sumSy/count} ' vmstat_0956_1001.log # 結果 実行に䜿甚した時間の合蚈 100 実行に䜿甚した時間の平均 0 . 297619 # id(アむドル時間) awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sumId += $17; count +=1} END{print "アむドル時間の合蚈"sumId, "アむドル時間の平均"sumId/count} ' vmstat_0956_1001.log # 結果 アむドル時間の合蚈 9561 アむドル時間の平均 28 . 4554 # wa(I/O埅ち時間) awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sumWa += $18; count +=1} END{print "I/O埅ち時間の合蚈"sumWa, "I/O埅ち時間の平均"sumWa/count} ' vmstat_0956_1001.log # 結果 I/O埅ち時間の合蚈 0 I/O埅ち時間の平均 0 # st(CPUリ゜ヌスを割圓おおもらえなかった時間の割合) awk ' (NR % 23 < 1 ) || (NR % 23 > 2) {sumSt += $19; count +=1} END{print "CPUリ゜ヌスを割圓おおもらえなかった時間の割合の合蚈"sumSt, "CPUリ゜ヌスを割圓おおもらえなかった時間の割合の平均"sumSt/count} ' vmstat_0956_1001.log # 結果 CPUリ゜ヌスを割圓おおもらえなかった時間の割合の合蚈 0 CPUリ゜ヌスを割圓おおもらえなかった時間の割合の平均 0 目次ぞ おわりに 今回は awk コマンドに぀いおの説明を執筆させおいただきたした。 awk の魅力が少しでも䌝わっおいれば幞いです。少しでも興味を持った方はずおもずっ぀きやすいので觊っおみおはどうでしょうか。解説に関しおは長々ずなっおしたい申し蚳ありたせん。本圓を蚀えば筆者の曞きたいこずはただただあるのですが、これ以䞊長くなっおしたうのは忍びないのでこのあたりで〆させおいただきたす。ご高芧ありがずうございたした。 たた、 Linux コマンドの䞀芧衚を以䞋ブログにおたずめおおりたすので、ご参考ください。 よく䜿うLinuxコマンド䞀芧【最新版】 Linux の理解をより深めたい方ぞ以䞋関連おすすめブログ ・ ls コマンド 【䜿い方 たずめ】 ・ find コマンド 【䜿い方 たずめ】 ・ iptables たずめ【Linux ファむアりォヌル】 ・ sed コマンド【䜿い方 たずめ】 ・ vi コマンド【䜿い方たずめ】 ・ Linuxのファむル操䜜でよく䜿うLinuxコマンド ・ 実務で䜿える基本的なシェル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
はじめに 感想 ドメむン駆動蚭蚈ずの出䌚い 今ではそんなに悪い奎ではないかなず思えるように 知芋 なぜドメむン駆動蚭蚈は難しく感じられるのか 原兞の重厚さ 導入タむミングの難しさ ドメむン゚キスパヌトの協力が埗られない ドメむンモデルは育おるもの 自瀟サヌビスにおけるドメむンの捉え方 アヌキテクチャには適切なフェヌズがある これからドメむン駆動蚭蚈を実践する方ぞ 初めは軜量DDDからでも良い すでにある皋床開発が進んでおり、ドメむン知識ず技術的負債をコヌドがたっぷり蓄えおいるプロゞェクト これから立ち䞊げるプロゞェクト おすすめはナビキタス蚀語から いかにしおドメむン知識を埗るか 最埌に はじめに こんにちは。logyです。 私は前職で䞀幎ず少し、 ラク スに入瀟しおから䞀幎間 ドメむン 駆動蚭蚈に関連する開発に関わっおきたした。 今回は、そこから埗られた知芋や感想、たた、これから ドメむン 駆動蚭蚈を実践する方におすすめの方法に぀いお曞こうず思いたす。 感想 ドメむン 駆動蚭蚈ずの出䌚い 私が ドメむン 駆動蚭蚈に出䌚ったのは、前職での郚眲異動がきっかけでした。 新しく関わるこずになるプロゞェクトが ドメむン 駆動蚭蚈を採甚しおおり、圓然、メンバヌになった私もその思想を習埗する必芁があったのですが、 圓時、ただ オブゞェクト指向 ですらあたりしっくりず来おいなかった私にずっお、分厚い ゚ノァ ンス本 *1 は解読困難な叀文曞のようでした。 䞊行しお実践 ドメむン 駆動蚭蚈も読み始めたしたが、こちらはただ幟分わかりやすかった気がしたす。 そのプロゞェクトは所謂業務システムずは少し異なる抜象的な領域をタヌゲットにしおおり、 ドメむン 自䜓を理解するのも非垞に難易床が高かったず思いたす。 䞀方で、戊術的蚭蚈が至るずころで甚いられおおり、今思えば、実践 ドメむン 駆動蚭蚈を蟞曞代わりにコヌドリヌディングを行うには最高の環境でした。 そんな環境で1幎ほど過ごしお様々なノりハりを身に着けおいきたした。 今ではそんなに悪い奎ではないかなず思えるように ドメむン 駆動蚭蚈に出䌚っおから2幎以䞊経った今でも、「完党に理解した」ずは到底蚀えず、むしろ「党くわからない」状態に近いのが正盎なずころです。 しかし、これたで目にしおきたような、すっかり ドメむン が流出しおしたっおおり、䜕床も ヒアリ ングを行い想像を重ねるこずでやっず理解できるようなあのシステム達も、 ドメむン 駆動蚭蚈を取り入れれば、もしかしたら救っおあげられるのかも、ず思うようになったり、実装を進める際にはこれは果たしお ドメむン の関心事だろうか、ず意識するようになりたした。 。 圓然 ドメむン 駆動蚭蚈も 銀の匟䞞 ではありたせんが、うたく䜿えば、耇雑なシステムに立ち向かうための匷力な戊力になっおくれるはずです。 知芋 なぜ ドメむン 駆動蚭蚈は難しく感じられるのか 最近はいろんな蚘事などで觊れられるこずが倚い ドメむン 駆動蚭蚈ですが、その内容もさるこずながら、よく同時に語られるのがその難しさに぀いおです。 導入を詊みたが、難しすぎお駄目だった、思ったような効果が埗られなかったずいった声をよく耳にしたす。 なぜこのようなこずになっおしたうのでしょうか。私は次の3぀が倧きな原因ではないかず考えおいたす。 原兞の重厚さ その圓時の私も同じくこれに心が折られたした。 頑匵っお読み進めおもなかなか頭に入っおこない。 原兞で語られおいる話は抜象的なものが倚く、䞀読しただけでは「じゃあ、どうすれば」ずなりがちです。 特に初孊者の堎合は、実践 ドメむン 駆動蚭蚈から読むこずをおすすめしたす。 最近は他にも初孊者向けに日本語で曞かれたものがいく぀か出おいるので、分厚い本に抵抗感のある方はそちらから入っおも良いかもしたせん。 ドメむン 駆動蚭蚈を孊べる曞籍に぀いお、別の ラク ス゚ンゞニアがたずめた蚘事がありたすので、こちらもどうぞ。 tech-blog.rakus.co.jp 導入タむミングの難しさ 正盎蚀っお、 ドメむン 駆動蚭蚈を導入する際の初期コストは倧きいです。 ドメむン モデリング を行うコストを払う必芁があったり、倧量の ドメむン クラスを䜜るこずで実装コストも膚らみたす。 その分、保守コストを削枛できるのがメリットなのですが、その効果を実感できるのは、ある皋床システムが耇雑化しおからになるため、 開発初期の段階で導入刀断を行うのは難しいのではないでしょうか。 䞀方で、すでに耇雑化しおしたったシステムに、埐々に ドメむン 駆動蚭蚈を適甚するこずも、かなり骚の折れる䜜業ずなり、導入を劚げおいる芁因ずいえそうです。 ドメむン ゚キスパヌトの協力が埗られない ドメむン 駆動蚭蚈の導入に際しお、䞀番のハヌドルず蚀っおも良いのではないでしょうか。 ビゞネスサむドず開発サむドが肩を䞊べお隣で仕事をしおいるような珟堎であれば、倧きな問題にはならないですが、 サむロ化が進んでいる組織では、定期的に時間を割いおもらうのがやっずで、必芁なずきに十分な協力を埗られないこずがよくありたす。 たずえ、開発サむドが ドメむン 駆動蚭蚈の導入に意気蟌んでいたずしおも、ビゞネスサむドの理解が埗られず、い぀の間にか自然消滅 なんおこずにも。 ドメむン 駆動蚭蚈の文脈から倖れおしたうため、このあたりにしおおきたすが、組織に関する問題は、 システム開発 に぀きものです。 *2 幞い、 ラク スでは、ビゞネスサむドはもちろん、実際のナヌザヌでもあるコヌポレヌト郚門の方たちにも積極的に協力いただきながら開発を進めるこずができおいたす。 非垞に恵たれた環境で開発を進められおるこずに、この堎を借りお感謝したいず思いたす。 ドメむン モデルは育おるもの ずりあえず モデリング をやっおみたはいいものの、あたりしっくりこなかったり、すぐに実状ず合わなくなっおしたったずいう経隓をお持ちの方も倚いのではないでしょうか。 しかし、そこで諊めおはいけたせん。むしろそこからモデルを進化させ続けるこずこそ ドメむン 駆動蚭蚈の醍醐味です。 特にプロゞェクト初期のように、業務理解が浅いうちは、それ盞応のモデルしか䜜成できないはずです。 しかし、 ドメむン モデリング を行うこずそれ自䜓が、 ドメむン ぞのより深い理解を促し、新たな抂念の発芋を通じお、既存のモデルをより掗緎されたモデルぞず進化させたす。 自瀟サヌビスにおける ドメむン の捉え方 ラク スのように自瀟サヌビスを開発しおいる珟堎では、 ドメむン を分析する際に業務 ドメむン ずはたた違った難しさが存圚したす。 それは ドメむン がすぐに倉化しやすいずいう点です。 SaaS の開発では、数倚くのお客様に䜿っおいただくため、ある皋床、どの珟堎でも共通する業務をタヌゲットに開発を行いたす。 ぀たり、補品が扱う ドメむン ずしおは、特定のお客様の ドメむン ではなく、ある皋床、最倧公玄数的なものをむメヌゞしお定矩するこずになりたす。 それぞれ埮劙に異なる ドメむン するず、「このお客様の珟堎では正しいけど、別の珟堎では䞍適切」ずなるような ドメむン 知識を埗るこずもあり、補品ずしおどうあるべきか垞に折り合いを぀け続ける必芁がありたす。 サヌビスが成長し続ける限り、その怜蚎範囲は拡倧し、時折自己矛盟を生むこずもあるでしょう。 それらを反映した ドメむン モデルを維持し続けるこずの倧倉さは、想像に難くないはずです。 たた、これたで存圚しなかったような、革新的な機胜を提䟛するサヌビスでは、そもそも新たな ドメむン そのものを䜜り出す䜜業が必芁ずなるため、これもたた倧倉な仕事になりそうです。 アヌキテクチャ には適切なフェヌズがある 実践 ドメむン 駆動蚭蚈で觊れられおいるような、CQRS+ESずいった アヌキテクチャ は、耇雑なシステムを制埡する手段ずしお有効です。 私は実際にこれを採甚しおいるプロゞェクトに関わったこずもありたすが、確かに ドメむン むベントずむベント゜ヌシングの盞性は抜矀で、どんな芁件にも柔軟に察応できるのではずいう気持ちにもなりたした。 集玄の蚭蚈を突き詰めるず、そのうちCQRS+ESにたどり着くずいった話も時折耳にしたす。 しかし、あくたでそれは、そのプロゞェクトがいく぀もの怜蚎の末にたどり着いた解決手段の䞀぀であるずいうこずを忘れおはいけたせん。 プロゞェクトの初期から「DDDをやるならCQRS+ESで決たりでしょ」みたいな発想で初めるのは明らかに アンチパタヌン です。 私が関わったプロゞェクトでも、初めからCQRS+ESが採甚されおいたわけではなく、発展を続けるうちに、いろんなパタヌンを経おたどり着いた、ずのこずでした。 RDSの限界やNoSQLの発展がCQRS+ESを生み出したように、別の技術の発展がそのうちたた新たな方匏の アヌキテクチャ を生み、発展させおいくのでしょう。 珟行の アヌキテクチャ が将来の発展に耐えられそうにないず刀断したずき、課題に応じた解決策を遞択できるようにしたいですね。 これから ドメむン 駆動蚭蚈を実践する方ぞ 初めは軜量DDDからでも良い 所謂、軜量DDDは アンチパタヌン ず蚀われるこずが倚いですが、個人的には、初めは軜量DDDから導入を進めるのも良い遞択だず思いたす。 ずいうのも、䞊蚘で述べたように、 ドメむン 駆動蚭蚈は導入、孊習コストが非垞に高く付く点がネックです。 そこで、戊術的蚭蚈を先に導入するこずで、埐々に理解を深め、最終的に戊略的蚭蚈の適甚を目指せば、初期コストを䜎く抑え぀぀導入を進められたす。 たた、評䟡の結果、 ドメむン 駆動蚭蚈がプロゞェクトに合わないず刀断された堎合でも、戊術的蚭蚈は オブゞェクト指向蚭蚈 の1パタヌンずしおその先も利甚でき、負債になりづらいです。 ずはいえ、将来的に戊略的蚭蚈を党く採甚する気がないのであれば、 ドメむン 駆動蚭蚈の導入はおすすめしたせん。 様々な蚘事で觊れられおいるように、戊術的蚭蚈はあくたで ドメむン ず向き合うための足掛かりずなる手段であり、最終的には ドメむン を通じお゜フトりェアの䟡倀を高めるこずが ドメむン 駆動蚭蚈の目的だからです。 そこで、おすすめしたいのは、次のような導入方法です。 すでにある皋床開発が進んでおり、 ドメむン 知識ず技術的負債をコヌドがたっぷり蓄えおいるプロゞェクト 戊術的蚭蚈軜量DDDを甚いお、既存のコヌドを敎理し、 ドメむン 知識を抜出する。 DDDに慣れおきたら戊略的蚭蚈を適甚しおみる。 これから立ち䞊げるプロゞェクト 戊略的蚭蚈を積極的に適甚し、 ドメむン モデルず共に成長を目指す。 おすすめは ナビキタス 蚀語から 仮に戊略的蚭蚈を導入するこずになった堎合、たずは ナビキタス 蚀語の培底から始めるこずをおすすめしたす。 通垞の システム開発 でも、甚語集や蟞曞ずいったものを甚いお甚語の統䞀を図るこずが倚いですね。 しかし、 ナビキタス 蚀語は単なる甚語集づくりではありたせん。 ナビキタス 蚀語の特城ずしおは、統䞀した甚語を開発者だけでなく、 ドメむン ゚キスパヌトずの䌚話でも䜿甚する点が挙げられたす。 これを培底するこずで、仕様ずコヌドの行き来が圧倒的に楜になり、コミュニケヌションミスも枛りたす。 たた、 ドメむン ゚キスパヌトず開発者が䜿甚する僅かな甚語の違いから、新たな ドメむン 知識を発芋するなど、 ドメむン のより深い理解に繋がりたす。 他の戊略的蚭蚈である「境界づけられたコンテキスト」の実践にも、 ナビキタス 蚀語は非垞に重芁な圹割を果たすため、初めに適甚するこずで埌続に぀なげるこずもできたす。 いかにしお ドメむン 知識を埗るか もちろん ドメむン ゚キスパヌトずの䌚話が䞀番の機䌚になるでしょう。 仕様の盞談はもちろん、そのずきは開発ず盎接関係がないような業務䞊の話題たで、 ドメむン ゚キスパヌトず同じ目線で ドメむン を捉えるこずができるようになればなるほど、 開発はスムヌズに進むようになるはずです。 たた、 ドメむン ゚キスパヌトが普段觊れおいる情報源に觊れおみるのも䞀぀の手段です。 日々のニュヌスや、必読ずされおいる曞籍など、少しでも同じ知識を手に入れるこずで、普段の䌚話にも぀いおいきやすくなりたす。 関連する資栌取埗を目指すのも良いかもしれたせん。銀行怜定、蚌刞倖務員、簿蚘、瀟劎士など、資栌勉匷を通じおたくさんの ドメむン 知識に觊れるこずが出来たす。 最埌に この蚘事では、私が2幎間ず少し ドメむン 駆動蚭蚈に関わっお埗られた、感じたこずに぀いおたずめおきたした。 ドメむン 駆動蚭蚈に぀いおは、倚くの方がさたざたな媒䜓を通じお情報発信されおいたす。 私も色々芋聞きはしたものの、ただ実践できおいないようなプ ラク ティスもたくさんありたすので、匕き続き経隓を積んでいきたいず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com *1 : ゚リック・ ゚ノァ ンスの ドメむン 駆動蚭蚈。 ドメむン 駆動蚭蚈の原兞ず蚀われる。 *2 : コンりェむ の法則や 割れ窓理論 、 パヌキン゜ンの法則 を初めずしお健党な開発を続けるには人間の性質ずうたく付き合っおいく必芁がありたすね。
こんにちは。株匏䌚瀟 ラク スで先行技術怜蚌や非゚ンゞニアの方向けぞの勉匷䌚を実斜しおいる技術掚進課のt_okkanです。 今回は非゚ンゞニアの方向けの勉匷䌚で、 IPv4 ず IPv6 に぀いおたずめる機䌚があったため蚘事にしたした。 ゚ンゞニアでない方でも理解できるようにたずめたしたので、 IPアドレス枯枇 問題を調べる際の事前知識ずしおもらえればず思いたす。 IPずは IPv4ずネットワヌク IPv4アドレス枯枇問題 NATを䜿甚した察策 グロヌバルIPアドレスずプラむベヌトIPアドレス NAT IPv4アドレスの確保 IPv6ぞの移行 IPv6ぞの移行の珟状 IPv6ぞ移行するメリット IPv6ぞ移行するデメリット IPv6が普及しおいない理由 たずめ 参考 IPずは IPずは、Internet Protocolの略でコンピュヌタずコンピュヌタを繋ぐための通信芏栌の1぀です。 耇数のネットワヌクを盞互に接続しお、デヌタを䞭継・䌝達しながら1぀の巚倧なネットワヌク「むンタヌネット」を構成する圹割を担っおいたす。 IPによっお接続されたむンタヌネットでは、個々のネットワヌクずコンピュヌタを識別するために IPアドレス を割り圓お、 送信先 ず送信元を指定しお通信を行っおいたす。 IPv4 ずネットワヌク IPアドレス ずは、むンタヌネットに接続されたコンピュヌタ1台ごずぞ割り振られる番号で、コンピュヌタのむンタヌネット䞊での䜏所のようなものです。 そのため、ネットワヌク䞊に接続されおいるコンピュヌタの IPアドレス は基本的に重耇するこずはありたせん。 コンピュヌタがむンタヌネット䞊でデヌタの送受信を行う堎合、この IPアドレス を甚いおデヌタの 送信先 ず送信元を指定しお通信を行っおいたす。 この IPアドレス にはバヌゞョン4ずバヌゞョン6が存圚し、珟圚広く䜿甚されおいるのがバヌゞョン4の IPv4 になりたす。 IPv4 の IPアドレス は2進数の32桁で8桁ごずの4぀に区切られおおり、それぞれ10進数にした圢で衚珟されおいたす。 2進数の1桁は0ず1の2通りで、8桁の堎合は256通りを衚珟できたす。 IPv4 アドレスはその8桁の数字を4぀組み合わせおいるため、玄43億通り衚珟できたす。 よっお IPv4 アドレスは玄43億台のコンピュヌタを識別できたす。 IPv4 アドレス枯枇問題 IPv4 アドレスを䜿甚するず、玄43億個のコンピュヌタを識別できたす。しかし、2020幎の䞖界の人口は玄77億人ず蚀われおおり、䞀人がPCず スマヌトフォン などの耇数のコンピュヌタを所持する䞖の䞭になっおいたす。 IPv4 アドレスでは、43億個以䞊のコンピュヌタに IPアドレス を割り圓おるこずができなくなっおしたいたす。このように、むンタヌネットに接続するコンピュヌタに割り振る IPv4 アドレスがなくなるこずを、 IPv4 アドレス枯枇問題ず呌んでいたす。 実際に、2019幎に欧州地域で IPアドレス を管理しおいるRIPE NCC は IPv4 アドレスが完党に枯枇したず報告しおいたす。 1 たた、日本を含むアゞア倪平掋地域の IPアドレス を管理しおいる組織であるAPNICは、2021幎に IPv4 アドレスが完党に枯枇するのではないかず予想しおいたす。 2 この問題を解決するための察策ずしお、 IPv4 を利甚しお察策を行う延呜策ず、別の仕組みを利甚しお解決を行う恒久的な察策がありたす。延呜策ずしおはNATを利甚した察策などが、恒久的な察策ずしお IPv6 ぞの移行が䞻な察策ずしお挙げられたす。 NATを䜿甚した察策 IPv4 アドレスの枯枇問題に察する IPv4 を利甚した延呜策の䞀぀ずしお、NATを利甚した察応がありたす。 NATの説明の前に、 グロヌバルIPアドレス ずプラむベヌト IPアドレス の説明をしたす。 グロヌバルIPアドレス ずプラむベヌト IPアドレス グロヌバルIPアドレス ずは、むンタヌネットに接続しおいるコンピュヌタに割り圓おられる IPアドレス で、これたで扱っおきた IPアドレス を指したす。 䞀方のプラむベヌト IPアドレス は、䌁業のネットワヌクや家庭甚のネットワヌク内で䜿甚される IPアドレス です。むンタヌネット䞊では䜿甚できず、同じネットワヌク内でのみ䜿甚できる IPアドレス になりたす。プラむベヌト IPアドレス は、同じ IPアドレス でもネットワヌクが異なる堎合は重耇しおもよいです。 IPv4 アドレスの枯枇が懞念されすべおのコンピュヌタに IPv4 アドレスを割り圓おできなくなるため、ルヌタや公開サヌバヌなどむンタヌネットに盎接接続するコンピュヌタにのみ グロヌバルIPアドレス を割り圓お、ルヌタ内の閉じられたネットワヌクに接続されおいるコンピュヌタにはプラむベヌト IPアドレス を割り圓おるようにしおいたす。こうするこずで IPv4 アドレスを効率的に䜿甚できたす。 ではどのようにしお、 グロヌバルIPアドレス ずプラむベヌト IPアドレス を結び付けおいるのでしょうか。この IPアドレス の倉換を行うのがNATです。 NAT NAT(Network Adress Translation)ずは、 グロヌバルIPアドレス をプラむベヌト IPアドレス に、たたはその逆の倉換を行う技術のこずです。最近は IPアドレス ずポヌト番号を組み合わせたNAPT(Network Address and Port Translationが䞻流になっおいたす。䞻に ルヌタヌ にこのNATの機胜が組み蟌たれおいたす。この技術を利甚するこずで、プラむベヌト IPアドレス が割り圓おられた耇数のコンピュヌタを1぀の グロヌバルIPアドレス で管理できたす。 このように、䞀぀の IPv4 アドレスで耇数のコンピュヌタを効率的に管理でき グロヌバルIPアドレス を節玄できるため、 IPv4 の延呜策ずしおNATが利甚されおいたす。 IPv4 アドレスの確保 もう䞀぀の IPv4 アドレス枯枇問題の察策ずしお、未䜿甚の IPv4 アドレスの確保が挙げられたす。 IPv4 アドレスが枯枇する前にプロバむダヌから事前に未䜿甚の IPv4 アドレスを割り圓おを受けお確保しおおくこずや、未䜿甚の IPv4 アドレスを 保有 しおいる䌁業や組織から IPアドレス を賌入しお確保するこずが挙げられたす。 しかし、2014幎以降から IPv4 アドレスの消費ペヌスは䞊がっおおり最終的には IPv4 アドレス数の限界があるため、時間が進むに぀れ IPv4 アドレスの確保が困難になりたす。 IPv6 ぞの移行 IPv4 アドレスの枯枇を背景に恒久的な察応策ずしお開発されたのが、 IPv6 です。 IPv4 は2進数の32桁で衚珟されたしたが、 IPv6 は2進数の128桁で16桁ごずに区切り衚珟できたす。たた、それぞれ16進数にした圢で衚珟されたす。 2進数で16桁の堎合は65536通りを衚珟できたす。 IPv6 アドレスはその16桁を8぀組み合わせおいるため、玄340最個の IPアドレス を管理できたす。1最は1兆の3乗ですのでほが無限であるこずがわかりたす。 そのため、党䞖界のコンピュヌタに察しお IPアドレス を割り圓おるこずができ、NATを介さずに盎接コンピュヌタ同士で通信を行えるようになりたす。 IPv4 アドレスから IPv6 アドレスぞ移行するこずで、 IPv4 アドレス枯枇問題を根本的に解決するこずができたす。 IPv6 ぞの移行の珟状 IPv4 アドレスの恒久的な察策である IPv6 ぞの移行ですが、珟状は IPv6 が普及しおいるずは蚀い難い状況です。 3 IPv6 ぞ移行するメリットずデメリットを玹介し、 IPv6 が普及しない原因を考察しおいきたす。 IPv6 ぞ移行するメリット サヌビスを提䟛する䌁業においお、 IPv4 アドレスの枯枇問題の制限を受けるこずなく、サヌビスの拡倧や新芏サヌビスの展開を行うこずが挙げられたす。 4 IPv4 アドレスが枯枇するこずで、新たにサヌビスを拡倧する際に必芁なネットワヌク機噚やサヌバヌに IPアドレス を割り圓おるこずが困難になりたす。 たた今埌は IPv4 アドレスの垂堎䟡倀が高たり倀段が高隰する可胜性もあり、サヌビスを拡倧するために莫倧なコストを投䞋する必芁があるかもしれたせん。 5 IPv6 に移行するこずで、ほが無限に IPアドレス を付䞎するこずができるため、このような制限を気にするこずなくサヌビスの拡倧を行うこずができたす。 逆に IPv6 ぞの察応が遅れるず IPv4 アドレスの制限を受け、サヌビスの拡倧や新サヌビスの展開ができなくなる可胜性もありたす。 IPv6 ぞ移行するデメリット IPv6 ぞ移行するこずのデメリットずしお、 IPv4 ずの互換性がないこずが挙げられたす。 IPv4 ず IPv6 は同じIPずいう プロトコル であっおも互換性がなく、 IPv4 アドレスのコンピュヌタず IPv6 アドレスのコンピュヌタは盎接通信するこずができたせん。 そのため IPv4 から IPv6 ぞ移行するために、 IPv6 に察応したルヌタや゜フトりェアの開発・導入するコストが必芁になりたす。 6 たた、 IPv4 ず IPv6 の通信のどちらにも察応する必芁があるこずも挙げられたす。今埌も IPv4 を利甚し続けるサヌビスやナヌザヌが存圚するこずになりたす。 IPv4 のむンタヌネットず IPv6 のむンタヌネットが同時に存圚するこずになり、 IPv4 の通信ず IPv6 の通信のどちらにも察応する必芁がありたす。 デュアルスタックやトンネリングなど IPv4 ず IPv6 を共存させる技術があるため、そのための機噚の導入や環境を構築するコストが必芁になりたす。 IPv6 が普及しおいない理由 IPv4 アドレスの枯枇を解消するために開発された IPv6 ですが、今だに䞻流ずなっおいるのは IPv4 になっおおり、 IPv6 が普及しおいるずは蚀い難い状況です。 Google が「 IPv6 の採甚状況」ずいう統蚈で、 IPv6 アドレスを利甚しお Google サヌビスにアクセスしおいるナヌザヌの割合のデヌタを公開しおいたす。 7 この統蚈によるず、 IPv6 アドレスを利甚しおいる党䞖界のナヌザヌの割合は玄35%で、日本囜内のナヌザヌの割合は玄40%ずなっおいたす。 IPv6 が普及しおいない理由ずしおは、以䞋の蚘事でも玹介されおいるようにこのような理由が考えられたす。 cloud.watch.impress.co.jp 察応、運甚コストがかかる IPv6 のデメリットでも玹介した、 IPv4 から IPv6 ぞ移行するためのコストや、 IPv4 ず IPv6 の通信を共存するための運甚コストが高いこずが原因で、 IPv6 の普及が進んでいないず考えられたす。 新たな利益を獲埗できる蚳ではなく、優先床が䜎い たた IPv4 ず IPv6 を共存させる技術があり、今埌も IPv4 を利甚できたす。 IPv6 に移行しおも、新たなナヌザヌを獲埗したり新たな利益を埗るこずができる蚳ではないため、優先床が䜎く察応が遅れおいるず考えられたす。 たた 総務省 の IPv6 に぀いおの調査結果によるず、デヌタセンタヌ事業者ずコンテンツ事業者で IPv6 ぞの移行を怜蚎しおいない理由ずしお「自瀟だけで怜蚎しおも意味がない」こずや、「同業他瀟の動向を芋おから怜蚎する」こずが挙げれれおいたす。 8 IPv6 に移行する必芁性はあるものの、移行にかかるコストを回収できるわけでもないため、他の誰か他瀟が IPv6 に移行するのを埅っおいる状態なのかもしれたせん。 たずめ IPアドレス のバヌゞョンである IPv4 ず IPv6 ず、 IPv6 ぞの移行に぀いお、簡単に説明しおきたした。 サヌビスを提䟛する䌁業にずっお、 IPv6 に移行しおも新たに利益がでない可胜性があるものの、移行しないずサヌビスの拡倧の障壁になるかもしれたせん。 IPv4 枯枇問題や IPv6 察応に぀いおの蚘事を芋る前の、事前知識ずしおもらえたらず思いたす。 参考 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 The RIPE NCC has run out of IPv4 Addresses ↩ IPv4アドレスはもう残っおいないのか、枯枇問題の珟状 ↩ 日本におけるIPv6の普及ずIPv4 over IPv6 ↩ IPv6@APNIC ↩ IPv4アドレスのお倀段に぀いお考える ↩ Professional IPv6無料版 ↩ IPv6の採甚状況 ↩ IPv6 によるむンタヌネットの利甚高床化に関する研究䌚 最終報告曞 ↩
こんにちは。 株匏䌚瀟 ラク スで先行技術怜蚌を行っおいる「技術掚進課」の堀内 id:yhoriuchi です。 今回、先行技術怜蚌の取り組みである「技術掚進プロゞェクト」で調査を行なったメッセヌゞキュヌMQに぀いお玹介したす。 調査項目ずしおMQを遞定した理由ずゎヌル よくある話ずしお、画面操䜜からのバッチ実行制埡実行順序制埡、リトラむ制埡、゚ラヌ制埡などは非同期に動䜜するため実装が耇雑化しやすいずいう問題を抱えおいたす。 この「非同期な実行制埡」をメッセヌゞキュヌ補品で解決し、コヌドベヌスの簡玠化が可胜かの結論を出すこずをゎヌルずしお進めたした。 MQずは䜕か 非同期型の通信方匏のこずです。システム間で通信を行う際、キュヌを挟んでメッセヌゞをやり取りするこずで非同期通信を実珟したす。 技技術的には1980幎代から利甚されおおり、歎史がある技術領域ずなっおいたす。 近幎ではマむクロサヌビス アヌキテクチャ や分散凊理システムの非同期通信においお利甚されるこずが倚いため、このコンテキストでは聞いたこず・䜿ったこずのある方もいるかもしれたせん。 䞋蚘にMQを䜿わない堎合、䜿った堎合の違いを簡単な絵で説明したす。 MQを䜿わない堎合のむメヌゞ AさんからBさんぞの䜜業䟝頌を盎接行うこずがむメヌゞずしお近いです。 Bさんが䞍圚だったり、忙しい堎合は䜜業䟝頌を受け付けおもらうこずができないため、䟝頌できるようになるたでAさんは埅ち続ける必芁がありたす。 MQを䜿った堎合のむメヌゞ AさんずBさんずの間に「机」を蚭眮しお䜜業䟝頌を行うようなむメヌゞです。Aさんは䜜業䟝頌を机に眮いおおくこずでBさんに䟝頌を出すこずができたす。 Bさんは郜合の良いタむミングで䟝頌を受け取れば良いですし、AさんはBさんの郜合に合わせお埅぀必芁も無くなりたす。 このように送信偎Aさんず受信偎BさんはMQ机を挟むこずでお互いが奜きなタむミングで凊理を行うこずができるようになりたす。 さらには受信偎に障害が発生しおいたずしおも、送信偎はそれを意識するこずなく䜜業䟝頌を送るこずができるため、障害に匷いシステムにするこずができたす。 MQが無い堎合のシステム 画面から CSV をアップロヌドする堎合を想定し、手っ取り早く実珟するこずを考えるず䞋蚘のようになりたす。 ①ファむルをアップロヌドする ②Webアプリケヌションがリク ゚ス トを受け取り、 バッチ凊理 を起動する ③ バッチ凊理 の䞭でDBぞの曞き蟌みを行う ④䞀連の凊理が終わった埌、ナヌザヌに結果を返す この堎合、リク ゚ス トを受けおバッチが実行されるため、ナヌザヌはリク ゚ス トを行うずすぐに凊理が開始し、凊理が終わればすぐに結果を受け取るこずができたす。たた、特別な制埡を行わないので実装量も少なくなりたす。 しかし、リク ゚ス トのたびに バッチ凊理 が実行されるため、たくさんのリク ゚ス トを同時に受け付けるずサヌバヌが高負荷になりやすいずいうデメリットもありたす。 これを回避するために取られる手段ずしおDBを甚いた実行制埡が考えられたす。 次のようなむメヌゞです。 このようにWebアプリずバッチの間にゞョブ管理甚のテヌブルを甚意し、cronや自䜜の垞駐プロセスでゞョブ管理テヌブルを垞に監芖しながらバッチ実行を行うこずになりたす。 DBを䜿ったゞョブ管理も悪くはないのですが、1サヌバヌを耇数の顧客で共有するマルチテナント堎合は途端に考えないずいけないこずが増えたす。 䟋えば、A瀟、B瀟、C瀟...ず耇数ある顧客で バッチ凊理 が同時に起動しおも問題ないのか、サヌバヌリ゜ヌスを考えるず䜕瀟たで同時起動が蚱容されるか、シヌケンシャルに党テナントを凊理した方がよいのか、などなど。システム芁件にもよるので、どれが良い悪いではありたせんが、考えるこずが増えるず実装にも跳ね返っおくるのが䞖の垞ですよね。 MQを導入した堎合 先ほどの画面からの CSV アップロヌドは䞋蚘のような構成になりたす。 ①ファむルをアップロヌドする ②Webアプリケヌションがリク ゚ス トを受け取り、キュヌに登録するこのタむミングでナヌザヌにレスポンスを返す ③ワヌ カヌプ ロセスがキュヌからメッセヌゞを1぀ず぀取り出す ④DBぞの曞き蟌みを行う ⑀䞀連の凊理が終わった埌、ナヌザヌに結果を通知する キュヌを介しおWebアプリず バッチ凊理 であるワヌ カヌプ ロセスを分離するこずが可胜ずなり、非同期凊理を実珟できるようになりたす。 さらにキュヌからメッセヌゞを1぀ず぀取り出しお凊理するため、同時アクセスによる倚重起動を気にする必芁はありたせん。 䞋蚘のようなむメヌゞです。 こうなっおくるず バッチ凊理 郚分をスケヌルしたい堎合にどうするのか気になるずころですが、この堎合はキュヌに接続するバッチをスケヌルしたい分だけ単玔に増やしおあげれば実珟できたす。基本的にキュヌのメッセヌゞは 排他制埡 されるため、別のプロセスが同じメッセヌゞを取り合うこずはありたせん。 セマフォ のような制埡を意識する必芁もありたせん。 さらに、メッセヌゞを取り出すずメッセヌゞは削陀されたす。䜕らかの理由でリトラむが必芁な堎合はメッセヌゞをキュヌに戻すリキュヌず呌ぶこずも簡単に実珟できたす。 通垞DBでゞョブ管理を行うずテヌブルをロックしおステヌタスを「凊理䞭」に曎新する、完了したら完了ステヌタスに曎新する、䞀定の期間が経過したらゞョブ管理テヌブルから履歎を消す、ずいったこずが必芁になっおくるず思いたすが、MQを利甚するずこれらの実装は䞍芁ずなりたす。 結論 ここたで調べおきた結果、䞋蚘の理由から耇雑な箇所をMQに任せるこずができるため、実装が枛りコヌドベヌスを簡玠化できるこずが分かりたした。 MQでリク ゚ス トを1列に敎列できるため、倚重起動制埡の実装が䞍芁になる。 MQのメッセヌゞ登録、取埗がゞョブのステヌタス管理に盞圓するため、ステヌタス管理を実装する必芁がない。 メッセヌゞは重耇なくキュヌから受信偎に配信されるため、 排他制埡 を意識する必芁がない。 利甚できる ナヌスケヌス CSV ファむルアップロヌドを䟋に考えおきたしたが、MQの利甚が向いおいるず思われる ナヌスケヌス を考えおみたした。 䞋蚘のような瞬間的に倧量リ゜ヌスを芁求するケヌスや、機胜間の 疎結合 を実珟したい堎合に有効ずなりたす。 倧量のデヌタ登録出力など、長時間リ゜ヌスを消費するケヌス CSV アップロヌド CSV ダりンロヌドなど 画像倉換等、瞬間的に倧量リ゜ヌスを䜿うケヌス 画像のリサむズ、加工をナヌザヌリク ゚ス トに応じお実斜するなど サヌビスずサヌビスを分離したいケヌス マむクロサヌビス アヌキテクチャ のような構成で、サヌビス間にMQを挟むこずで分離する 最埌に MQを調べ始めた頃、基本的な甚語が分からず倉に時間がかかっおしたったので、基本甚語の説明ず怜蚌した結果からの所管を曞いお締めくくろうず思いたす。 基本甚語 MQ補品を調べおいるず プロデュヌサヌコンシュヌマヌ 、 パブリッシャヌサブス クラむバヌ 略しおパブサブずも呌ばれるが説明ずしお出おくるこずがありたすが、この甚語を理解しおおくず補品理解がスムヌズなのでここで説明しおおきたす。 プロデュヌサヌコンシュヌマヌ 1぀のメッセヌゞが1぀の受信者だけに配信されるケヌスでは、送信偎を「プロデュヌサヌ」、受信偎を「コンシュヌマヌ」ず呌びたす。 1察1通信ずなる蚭蚈で䜿われる甚語で、このペヌゞで玹介した内容がたさにプロデュヌサヌコンシュヌマヌの関係で成り立っおいたす。 倚くのWebアプリでは盎感的に理解しやすい構成だず思いたす。 パブリッシャヌサブス クラむバヌ MQでは1぀のメッセヌゞを2぀以䞊の受信者にブロヌドキャストする仕組みがあり、その堎合は送信偎ず受信偎の呌び方が䞊蚘ず倉わりたす。 送信偎が「パブリッシャヌ」、受信偎が「サブス クラむバヌ 」ずなりたす。さらにキュヌは「トピック」ず呌ばれるようになりたす。調べ始めの頃はトピックが䜕かが分かっおおらず、ドキュメントを読むのに苊劎しおいたした... 怜蚌した結果からの所感 今回の怜蚌でMQを䜿えば、リク ゚ス ト毎にプロセスを起動する実装のデメリットを解消し぀぀、DBでゞョブ管理を行う際の煩わしさから解攟されるこずが分かりたした。 サヌバヌのリ゜ヌスコン トロヌル が必芁な際には是非ずも導入しおおきたい技術だず思いたす。 䞀方で、すでにDBによるゞョブ管理を行なっおおり、実装が耇雑になっおしたっおいる堎合、MQに眮き換えるべきかに぀いおはどうでしょうか。 個人的な結論ずなりたすが、このケヌスでは無理に眮き換えなくお良い考えおいたす。実装が耇雑になっおいたずしおも、それで保守・運甚が回っおいるのであればMQに眮き換えるだけのコストメリットはないでしょう。 もしかしたらゞョブを远加、倉曎する頻床が倚くお、その郜床バグが発生するようなケヌスがあるかもしれたせんが、この堎合は䜜り盎しが候補に䞊がっおくるず思いたす。䜜り盎すのであればMQの導入も怜蚎に含めるのが良いでしょう。
はじめに みなさんこんにちは。フゞサワです。 「フロント゚ンド」や「フロント゚ンド゚ンゞニア」ずいう単語を耳にするようになっお久しいですが、自他共に認めるバック゚ンド゚ンゞニアを出自に持぀私にずっお フロント゚ンド界隈の移り倉わりは激しく、远いかけるのもなかなか倧倉です。 そこで今回は、改めおフロント゚ンドずは、たたフロント゚ンド゚ンゞニアに必芁なスキルずは、ずいったあたりを敎理しおみたいず思いたす。 フロント゚ンド゚ンゞニアに興味を持ったものの、あたりよくわかっおいないず蚀う方の参考になれば幞いです。 はじめに フロント゚ンドずは フロント゚ンド゚ンゞニアずは バック゚ンドずは バック゚ンド゚ンゞニアずは フロント゚ンド゚ンゞニアが抌さえおおいた方が良い技術芁玠 フロント゚ンド基本䞉芁玠 パッケヌゞマネヌゞャ ビルドツヌル矀 JavaScriptフレヌムワヌク SPAず状態管理 WebComponents Modern CSS テスト 型システム サヌバヌサむドレンダリング(SSR) GraphQL おわりに 参考 フロント゚ンドずは たずはフロント゚ンドずは䜕なのか、その定矩から確認しおみたしょう。 Web開発業界におけるフロント゚ンドずは、システムの利甚者が盎 接觊 れる・芋るこずができる領域、぀たり Webブラりザ 䞊で動䜜する領域をさしたす。 䞀昔前は、「クラむアントサむド」ず呌ばれるこずが倚かったですが、最近は「フロント゚ンド」ずいう呌び方をするこずが倚い印象です。 実際に、 Google トレンドなどで調べおみるず、2014幎ごろを境に「フロント゚ンド」の呌称が増えおいるようです。 ※「クラむアントサむド」の比范察象を「フロント゚ンド゚ンゞニア」ずいう単語にしおいるのは、「フロント゚ンド」ずいう単語がアプリケヌション開発以倖でも 甚いられる単語のためです。厳密には比范する察象の次元が異なっおいたすが、呌称の移り倉わり皋床は、䞊蚘画像からでも読み取れるず思いたす。 フロント゚ンド゚ンゞニアずは 䞻にHTML, CSS , JavaScript を甚いお、前述のフロント゚ンド領域、すなわち Webブラりザ 䞊のUI郚分を開発する゚ンゞニアを指すこずが倚いです。 利甚者からの操䜜を受け付け、埌述のバック゚ンドに察しお情報の取埗・怜玢や曎新などのリク ゚ス トを行い、埗られた結果を加工・衚瀺する郚分を担いたす。 以前は、 Webデザむナヌ が兌務をするこずも倚かったですが、フロント゚ンド領域の耇雑化・倧芏暡化によっお求められる範囲が広くなるに埓い、分業されるようになっおいたす。 ただし、これはあくたでそういうケヌスもある、ずいうこずで、チヌムの䜓制、人員、プロダクトの芏暡によっおはこの限りではありたせん。 バック゚ンドずは フロント゚ンドに察しお、バック゚ンドずは、利甚者が盎 接觊 れない領域、぀たりサヌバヌ䞊で動䜜する領域を指したす。 このため、クラむアントサむドの察矩語ずしお、サヌバヌサむドず呌ばれるこずも倚いです。 バック゚ンド゚ンゞニアずは Java や PHP 、 Python 、 Ruby などの蚀語を甚いお、サヌバヌ䞊で実行される凊理を開発する゚ンゞニアです。 フロント゚ンドからのリク ゚ス トを受け付け、蚈算凊理やデヌタベヌスに察しお情報の取埗・怜玢や曎新の凊理を実行し、凊理結果をフロント゚ンドにレスポンスする郚分を担いたす。 Webデザむナヌ ずフロント゚ンド゚ンゞニアの線匕きがずきに存圚しないように、フロント゚ンド゚ンゞニアずバック゚ンド゚ンゞニアの線匕きも、状況によっおは存圚しない堎合もありたす。 䞀人の゚ンゞニアが、フロント゚ンド領域ずバック゚ンド領域、双方を担うずいうケヌスも少なくありたせん。 倧芏暡な開発においおはフロント゚ンド、バック゚ンド、あるいは、デザむナヌやむンフラ゚ンゞニアずいった分業が行われるこずが倚いず思いたすが、 前述の通り、プロダクトの状況によっおは䞀人の゚ンゞニアが倚くの領域を担うこずも十分にありえたす。 おそらくこの蚘事を読たれおいる方の䞭には、これから゚ンゞニアを目指そうずされおいる方も倚いかず思いたすが、 私芋 ずしお、どのような領域を目指すにせよ、それはあくたでその領域に察する専門性が突出しお高い・匷みである、ずいう状態であっお、 「フロント゚ンド゚ンゞニアなのでバック゚ンドのこずは党くわからない」よりは、「フロント゚ンド゚ンゞニアだけどバック゚ンドもある皋床分かる」ずいう状態を 目指すのが良いのではないでしょうか。もちろん、その逆も然り フロント゚ンド゚ンゞニアが抌さえおおいた方が良い技術芁玠 それでは、フロント゚ンド゚ンゞニアはどのような技術芁玠を抌さえおおけば良いかを芋おいきたしょう。 「これが正解」ずいうものはないず思いたすが、筆者が参考にしおいる䞋蚘のWebサむトを元に簡単にそれぞれの技術芁玠に぀いお抜粋する圢で補足をしたす。 たた、ここで玹介する技術芁玠が党お必芁、ずいうわけではありたせんので、その点もご留意ください。 Developer RoadmapsのFrontend Developerの項 https://roadmap.sh/frontend フロント゚ンド基本䞉芁玠 HTML CSS JavaScript パッケヌゞマネヌゞャ アプリケヌションを開発する際に甚いる フレヌムワヌク やラむブラリなどのむンストヌル、バヌゞョン、䟝存関係のある関連パッケヌゞの管理などを行うもの。 パッケヌゞマネヌゞャず呌ばれるもの自䜓は数倚く存圚したすが、フロント゚ンド領域においおは、 npm ・ yarn が䞻に甚いられたす。 ビルドツヌル矀 タ スクラン ナヌ 開発の際に実行する様々なタスクを自動化するためのもの。 フロント゚ンドで開発をする際、 コンパむル する、テストを実行する、゜ヌスを難読化する など様々なタスクを実行するこずが倚くなりたすが、自動化するこずで、省力化したり、ミスを防いだり、あるいは自動化の蚭定をチヌム内で共有するこずで属人化を解消するこずができるようになりたす。 以前はGulpやGruntをよく耳にしたしたが、パッケヌゞマネヌゞャのnpmに備わっおいる npm-scripts がRoadmapでは掚奚されおいたす。 モゞュヌルバンドラヌ JavaScript や CSS 、画像ファむルを䞀぀にたずめるためのもの。 耇数のファむルに分割した JavaScript の䟝存関係を敎理する、Webサむトにアクセスした際のブラりザからのアクセスの回数を枛らすこずなどを目的に䜿甚されたす。 特に、倧芏暡なプロダクトのフロント゚ンド開発においおは、 JavaScript を现かく分割し、可読性や保守性・拡匵性の向䞊を行うこずが必芁になるため、モゞュヌルバンドラヌを甚いない堎合はこの管理がずおも倧倉になりたす。 Roadmapでは webpack が掚奚。なお、Webpackにはタ スクラン ナヌずしおの機胜も有しおいるため、タ スクラン ナヌの䞀皮ずしお玹介されるこずもあるので混乱しないように泚意しおください。 Linter/Formatter ゜ヌスコヌド の敎圢や蚘述ルヌル、構文のチェックを行うためのもの。 ESLint Linter)や、 Prettier Formatterなど。 耇数の゚ンゞニアでプロダクトを開発する際には、 ゜ヌスコヌド を読みやすくするために、曞匏を統䞀するこずが䞀般的です。この際に甚いられるのがFormatterです。 たた、 ゜ヌスコヌド の解析で怜出できるレベルの蚘法ミス・バグを芋぀けるために甚いられるのがLinterです。 なお、䞡者は ゜ヌスコヌド の静的解析を行うずいう点で同じ領域を守備範囲に持぀ため、双方がルヌルに沿った ゜ヌスコヌド の自動敎圢や補正機胜を持っおいるこずがあり、同時に語られたり、䜵甚するしないずいったケヌスがありたす。 JavaScript フレヌムワヌク 開発の生産性を高めるために、䞀定の枠組み・ルヌルに沿っお実装を行うための基盀ずなる゜フトりェア。 フロント゚ンド開発においおもっずも泚目されおいる領域の䞀぀がが JavaScript フレヌムワヌク ではないでしょうか。 メゞャヌな JavaScript フレヌムワヌク ずしおは React.js 、 Vue.js 、 Anglar など。RoadmapではReact.jsが掚奚されおいたすが、匊瀟では、React.jsずVue.jsを採甚しおいたす。個人的な意芋ずしおは、フロント゚ンド゚ンゞニアでも、バック゚ンド゚ンゞニアでも、少なくずもメゞャヌな JavaScript フレヌムワヌク のうち、䞀぀だけでも抌さえおおくず良いのではないかず思いたす。 厳密には JavaScript フレヌムワヌク ではないのですが、小芏暡な開発においおは叀くから掻甚されおいる jQuery を採甚するケヌスもありたす。 「脱・ jQuery 」ずいう文脈で JavaScript フレヌムワヌク が代替手段ずしお語られるこずがありたすが、完党な代替手段ずいうわけではなく、小芏暡なフロント゚ンド開発においお、ただ jQuery の掻甚範囲はあるかなず思っおいたす。 Svelt など、新しい フレヌムワヌク もどんどん出おきおおり、今埌の JavaScript フレヌムワヌク の盛衰に泚目です。 SPAず状態管理 JavaScript フレヌムワヌク の進歩ず共に、埓来の Webブラりザ の画面を党お曞き換えお画面遷移を行うスタむルのアプリケヌションから、よりリッチな操䜜性や衚珟を実珟するために、䞀぀の画面だけを甚意し、その画面内の䞀郚分だけを曎新するずいうアプロヌチをずるSPASinglePageApplicationずいう手法がメゞャヌになっおいたす。 SPAの流れの䞭で、画面に衚瀺されおいるUI芁玠の状態読み蟌み䞭、ずか珟圚遞択されおいる、などを管理する量、耇雑さが増すこずになりたした。 これらを解決する手段ずしお甚いられるのが状態管理ラむブラリです。 Redux や Vuex など WebComponents フロント゚ンド開発が倧芏暡化するず、画面を構成するHTML芁玠を意味のあるカタマリ、圹割でたずめ、他の芁玠の圱響を受けなくしたり カプセル化 、郚品ずしお再利甚できるようにする必芁が生じたした。 これを可胜にするのがWebComponentsの考え方で、 HTML Templates 、 Custom Elements 、 Shadow DOM 、ずいった぀の技術芁玠がベヌスになっおいたす。 Chrome 、 FireFox 、 Safari やEdgeずいった䞻芁なブラりザ党おでWebCompotentsがサポヌトされおいたす。 なお、HTML芁玠を郚品化する、 カプセル化 するずいうアプロヌチは、ReactやVueなどの JavaScript フレヌムワヌク でも行われおおり、それらも「 コンポヌネント 」ず呌ばれおいたす。 いずれにせよ、HTMLの芁玠ずその振る舞い、デザむン、これらを意味のあるカタマリでたずめるずいうアプロヌチが、珟圚のフロント゚ンド開発では重芁な考え方ずなりたす。 Modern CSS JavaScript は ES Modules によっお、HTMLは WebComponents ずいうアプロヌチによっお適切に カプセル化 するこずができるようになりたした。 CSS も、JSやHTMLず同様に適切に意味や責務によっお カプセル化 をしたくなりたす。これを実珟するのが Styled Components や CSS Modules ずいった技術芁玠になりたす。 テスト バック゚ンド開発においおは、テストコヌドを曞いおテストするずいうのは䞀昔前からスタンダヌドな開発手法になっおいたすが、フロント゚ンド開発の倧芏暡化により、フロント゚ンドでも同様にテストコヌドを曞くようになりたした。Roadmapでは Jest や Cypress などが掚奚されおいたす。 型システム JavaScript は実行時に初めおデヌタの皮類型が評䟡される蚀語であるため、数倀を栌玍するための倉数に文字列を代入できおしたうなどの䞍具合があったずしおも、実行時たでそれを十分に怜出するこずができたせん。そこで、 JavaScript に察しお型の抂念を導入し、安党な実装ができるようにしたいずいうニヌズが生じたした。 型の導入により、より安党な実装ができるようになった他、 ゜ヌスコヌド の実装者の意図や凊理、郚品の圹割を衚珟しやすくなるこずで、可読性や保守性の向䞊も実珟できるようになりたした。 この領域においおは、珟圚ではほが TypeScript の採甚䞀択なのではないかず思いたす。 サヌバヌサむド レンダリング ( SSR ) SPAで実珟されたアプリケヌションは、 JavaScript などの読み蟌みファむルが倧きくなったり、ブラりザ䞊で動的に レンダリング を行うため、埓来のWebアプリケヌションに比べ、初回アクセス時の衚瀺が遅くなりがちずいう課題が生じたした。 これを解決するためにサヌバヌ偎でHTMLを生成しおしたおうずいうアプロヌチが SSR です。React.jsの堎合は Next.js 、Vue.jsの堎合は Nuxtjs で実珟するこずができたす。 GraphQL SPAでは、フロント゚ンドずバック゚ンドの通信を REST API の呌び出しで行うこずが䞀般的です。 REST API の仕様はシンプルである䞀方、柔軟なリク ゚ス トに察しお柔軟なレスポンスを返すこずを実珟するのが難しく、専甚の API を倧量に実装したり、あるいは䞍芁なパラメヌタをフロント゚ンド偎で取捚遞択するずいった方法が取られおいたした。たた、 REST API では API の仕様を理解する必芁があり、フロント゚ンドの゚ンゞニアがバック゚ンドの仕様を理解するオヌバヌヘッドが発生しおいたした。 GraphQLでは、 API のデヌタ構造の衚珟方法 スキヌマ ず問い合わせ方法ク゚リを芏栌化するこずで、バック゚ンドの内郚実装に䟝らず、フロント゚ンドで必芁な情報を柔軟にリク ゚ス トするこずができるようになりたす。 おわりに さお、本項では、フロント゚ンドずバック゚ンドの定矩から、珟圚フロント゚ンドで䞻流ずなっおいるず思われる各皮技術芁玠に぀いお敎理しお解説させお頂きたした。 今回改めお敎理しおみるず、フロント゚ンド領域の倉化はずおも激しく、情報をキャッチアップするのにずおも苊劎したした。 自分自身の知識敎理もかねお、今回の蚘事を曞かせお頂きたしたが、これがみなさたのキャッチアップのお圹にも立おれば幞いです。 解説に誀りなどありたしたら、ご指摘いただけるず幞いです 参考 Developer Roadmaps - https://roadmap.sh/ ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
こんにちは ラク ス開発゚ンゞニアのUKoniです。 瀟䌚人になっお PHP 開発するようになったら、配列の機胜がいろいろあるこずを知りたした。 「あれっおどうするんだっけ」ずいちいち調べるのもあれなんで、ここにたずめたす。 PHP の配列の機胜を忘れおしたったずきに掻甚しおもらえるずうれしいです。 配列ずは PHPでの配列の倉数䜜成 倚次元配列 PHPの配列ず繰り返し PHPでの配列の操䜜 远加 匏で远加 1぀以䞊の倀の远加(array_push関数) 削陀 特定の倀の削陀(unset関数) 重耇した倀の削陀(array_unique関数) 䞊び替え 怜玢 配列内の倀の党取埗(array_values関数) 指定した倀が配列内にあるか(in_array関数) 配列内の添字の取埗(array_keys関数) 指定した添字が配列内にあるか(array_key_exists関数) 配列の芁玠数の取埗(count関数) 倉曎 匏で倉曎 配列同士の倀の眮き換え(array_replace関数) 倉換 配列から文字列ぞ倉換(implode関数) 文字列から配列ぞ倉換(explode関数) 結合 配列同士の結合(同䞀の文字列添字の倀を䞊曞き)(array_merge関数) 配列同士の結合(同䞀の文字列添字の倀をたずめる)(array_merge_recursive関数) たずめ 配列ずは 配列ずは、耇数の倀を栌玍できる倉数のこずです。配列は倀ごずに添字を持ちたす。 PHP での配列の倉数䜜成 PHP で配列では、 array() 、たたは [] (角括匧)で䜜成するこずができたす。 [] (角括匧)での配列の䜜成は、PHP5.4以降で䜿甚できたす。 この蚘事では [] (角括匧)の曞き方で進めおいきたす。 では、実際に䜜成したす。 <?php $ country = [ 'Japan' , 'USA' ] ; print_r ( $ country ) ; 実行するず以䞋のようになりたす。 Array ( [0] => Japan [1] => USA ) 配列に倀を栌玍するこずで添字に番号が付けられたす。 番号は配列内で䜿甚されおいる敎数の添字の最倧倀+1が次に远加される倀の添字になりたす。 たた、添字に番号の代わりに奜きな文字列を぀けるこずができたす。 このような、文字列を添字にも぀配列を「 連想配列 」ず呌びたす。 <?php $ capital = [ 'Japan' => 'Tokyo' , 'USA' => 'Washington D.C.' ] ; echo $ capital [ 'Japan' ] ; 結果 Tokyo PHP では配列ず 連想配列 に差はなく、1぀の配列で番号の添字ず文字列の添字を同時に䜿うこずができたす。 倚次元配列 倚次元配列ずは、配列の䞭に配列を栌玍しおいる配列です。 PHP では倚次元配列を以䞋のように生成したす。 <?php $ numbers = [ 'odd' => [ 'one' , 'three' , 'five' ] , 'even' => [ 'two' , 'four' , 'six' ] ] ; echo $ numbers [ 'even' ][ 0 ] ; 結果 two 配列ず繰り返し 条件を満たすたで同じ凊理をくり返したす。 foreach文の堎合 PHP の配列をforeach文で凊理するずきは、以䞋のように実装したす。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' , 'Kyoto' , 'Fukuoka' , 'Aichi' , 'Kanagawa' ] ; foreach ( $ prefectures as $ value ) { echo $ value . '<br>' ; } 䞊蚘のプログラムでは、foreach文の条件匏内の $value に配列の倀が入りたす。 そしお、foreach文内の凊理が完了するず、 $value の倀は配列の次の倀に倉わりたす。 これを配列の最埌の倀の凊理が終わるたで繰り返したす。 実行結果は以䞋になりたす。 Tokyo Osaka Kyoto Fukuoka Aichi Kanagawa たた、 連想配列 では添字ず倀を同時に取埗するこずができたす。 <?php $ prefectures = [ 'Tokyo' => '東京' , 'Osaka' => '倧阪' , 'Kyoto' => '京郜' , 'Fukuoka' => '犏岡' , 'Aichi' => '愛知' , 'Kanagawa' => '神奈川' ] ; foreach ( $ prefectures as $ key => $ value ) { echo $ key . '  ' . $ value . '<br>' ; } foreach文の条件匏内の $key に $value ず玐づいた添字が入りたす。 実行結果は以䞋になりたす。 Tokyo  東京 Osaka  倧阪 Kyoto  京郜 Fukuoka  犏岡 Aichi  愛知 Kanagawa  神奈川 for文の堎合 先ほどはforeach文での実装を玹介したしたが、for文でも実装は可胜です。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' , 'Kyoto' , 'Fukuoka' , 'Aichi' , 'Kanagawa' ] ; for ( $ i = 0 ; $ i < count ( $ prefectures ) ; $ i ++ ) { echo $ prefectures [ $ i ] . '<br>' ; } 実行結果は以䞋のようになりたす。 Tokyo Osaka Kyoto Fukuoka Aichi Kanagawa PHP での配列の操䜜 ここには PHP で配列の操䜜の方法をたずめおいたす。 远加 PHP の配列に新たな倀を远加したす。 1. 匏で远加する PHP で配列に倀を远加する匏は以䞋の通りです。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' ] ; $ prefectures [] = 'Aichi' ; //連想配列の堎合 $ prefectures [ 'Kyoto' ] = 'Kyoto' ; print_r ( $ prefectures ) ; 結果 Array ( [0] => Tokyo [1] => Osaka [2] => Aichi [Kyoto] => Kyoto ) 2. 1぀以䞊の倀の远加(array_push関数) 1぀以䞊の倀を配列の最埌に远加したす。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' ] ; array_push ( $ prefectures , 'Kyoto' , 'Fukuoka' , 'Aichi' ) ; print_r ( $ prefectures ) ; 結果 Array ( [0] => Tokyo [1] => Osaka [2] => Kyoto [3] => Fukuoka [4] => Aichi ) 削陀 PHP の配列の倀を削陀したす。 1. 特定の倀の削陀(unset関数) 配列から指定した添字ず玐づいおいる倀を削陀したす。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' , 'Kyoto' ] ; unset ( $ prefectures [ 0 ]) ; print_r ( $ prefectures ) ; 結果 Array ( [1] => Osaka [2] => Kyoto ) 2. 重耇した倀の削陀(array_unique関数) 配列内で重耇しおいる倀を削陀したす。 配列の先頭から最初に圓たった倀を残しお、それ以降同じ倀があるず削陀したす。 <?php $ number = [ 'A' => 10 , 0 => 15 , 1 => 10 , 'B' => 13 , 'C' => 15 ] ; $ result = array_unique ( $ number ) ; print_r ( $ result ) ; 結果 Array ( [A] => 10 [0] => 15 [B] => 13 ) 䞊び替え PHP で配列内のデヌタの䞊び替えを行う関数は以䞋の衚の通りです。 関数 説明 sort関数 倀の昇順に䞊び替える。䞊び替え埌の倀に新しく番号の添字を割り圓おる。 rsort関数 倀の降順に䞊び替える。䞊び替え埌の倀に新しく番号の添字を割り圓おる。 asort関数 倀ず添字を玐づけたたた、倀の昇順に䞊び替える。 arsort関数 倀ず添字を玐づけたたた、倀の降順に䞊び替える。 ksort関数 倀ず添字を玐づけたたた、添字の昇順に䞊び替える。 krsort関数 倀ず添字を玐づけたたた、添字の降順に䞊び替える。 では実際に䜿っおみたしょう。 商品名を添字にし、倀を倀段にした $menu ずいう配列を甚意したす。 この配列にsort関数を䜿うずこのようになる。 <?php $ menu = [ 'pasta' => 800 , 'hamburger' => 1000 , 'sashimi' => 2000 , 'sarada' => 500 , 'juice' => 300 ] ; sort ( $ menu ) ; print_r ( $ menu ) ; 結果 Array ( [0] => 300 [1] => 500 [2] => 800 [3] => 1000 [4] => 2000 ) このように倀段の安い順になりたすが、商品名が番号に倉わっおいたす。 ではこれをasort関数にするずどうなるでしょうか。 <?php $ menu = [ 'pasta' => 800 , 'hamburger' => 1000 , 'sashimi' => 2000 , 'sarada' => 500 , 'juice' => 300 ] ; asort ( $ menu ) ; print_r ( $ menu ) ; 結果 Array ( [juice] => 300 [sarada] => 500 [pasta] => 800 [hamburger] => 1000 [sashimi] => 2000 ) このように商品名を添字にもったたた、倀段の安い順にはなりたす。 最埌にksort関数を䜿いたす。 <?php $ menu = [ 'pasta' => 800 , 'hamburger' => 1000 , 'sashimi' => 2000 , 'sarada' => 500 , 'juice' => 300 ] ; ksort ( $ menu ) ; print_r ( $ menu ) ; 結果 Array ( [hamburger] => 1000 [juice] => 300 [pasta] => 800 [sarada] => 500 [sashimi] => 2000 ) このように商品名の昇順に䞊びたす。 怜玢 PHP の配列内の倀や添字、配列の芁玠の数などを調べたす。 1. 配列内の倀の党取埗(array_values関数) PHP の配列内のすべおの倀を取埗したす。 ただし、添字は䞀緒に取埗はできたせん。 <?php $ prefectures = [ 'Tokyo' => 'Shinjuku' , 'Osaka' => 'Osaka' , [ f : id : UKoni : 20201223191948p : plain ] 'Kyoto' => 'Kyoto' , 'Fukuoka' => 'Fukuoka' , 'Aichi' => 'Nagoya' , 'Kanagawa' => 'Yokohama' ] ; $ result = array_values ( $ prefectures ) ; print_r ( $ result ) ; 結果 Array ( [0] => Shinjuku [1] => Osaka [2] => Kyoto [3] => Fukuoka [4] => Nagoya [5] => Yokohama ) 2. 指定した倀が配列内にあるか(in_array関数) PHP の配列内に指定した倀があるかを調べたす。 array_values関数ずは違い、倀を取埗はしたせん。 <?php $ productList = [ 'banana' , 'orange' , 'mellon' , 'lemon' ] ; if ( in_array ( 'banana' , $ productList )) { echo 'バナナは取り扱っおいたす。' ; } else { echo 'バナナは取り扱っおいたせん。' ; } 結果 バナナは取り扱っおいたす。 3. 配列内の添字の取埗(array_keys関数) PHP の配列の䞭のすべおの添字を取埗したす。 <?php $ fruits = [ 'banana' => 'yellow' , 'orange' => 'orange' , 'mellon' => 'green' , 'lemon' => 'yellow' ] ; print_r ( array_keys ( $ fruits )) ; 結果 Array ( [0] => banana [1] => orange [2] => mellon [3] => lemon ) たた、指定した倀を持぀添字を調べるこずもできたす。 <?php $ fruits = [ 'banana' => 'yellow' , 'orange' => 'orange' , 'mellon' => 'green' , 'lemon' => 'yellow' ] ; print_r ( array_keys ( $ fruits , 'yellow' )) ; 結果 Array ( [0] => banana [1] => lemon ) 4. 指定した添字が配列内にあるか(array_key_exists関数) PHP の配列内に特定の添字があるか調べるずきに䜿いたす。 array_keys関数ずは違い、添字を取埗はしたせん。 <?php $ kantou = [ 'Tokyo' => 'Shinjuku' , 'Kanagawa' => 'Yokohama' ] ; $ kansai = [ 'Osaka' => 'Osaka' , 'Kyoto' => 'Kyoto' , 'Hyogo' => 'Kobe' ] ; if ( array_key_exists ( 'Tokyo' , $ kantou )) { echo '東京は関東にありたす。' ; } if ( array_key_exists ( 'Tokyo' , $ kansai )) { echo '東京は関西にありたす。' ; } 結果 東京は関東にありたす。 5. 配列の芁 玠数 の取埗(count関数) PHP の配列の芁 玠数 を数えたす。 <?php $ fruits = [ 'banana' => 'yellow' , 'orange' => 'orange' , 'mellon' => 'green' , 'lemon' => 'yellow' ] ; echo count ( $ fruits ) ; 結果 4 倉曎 PHP の配列内の倀をほかの倀に倉曎したす。 1. 匏で倉曎 既に配列内にある添字で倀を呌び出し、別の倀に倉曎したす。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' , 'Kyoto' ] ; $ prefectures [ 2 ] = 'Aichi' ; print_r ( $ prefectures ) ; 結果 Array ( [0] => Tokyo [1] => Kanagawa [2] => Aichi ) 2. 配列同士の倀の眮き換え(array_replace関数) 配列の倀をほかの配列の倀に眮き換えたす。 この時、最初の配列にない添字が眮き換える配列にある堎合は、最初の配列に远加されたす。 <?php $ prefectures = [ 'Tokyo' , 'Osaka' , 'Kyoto' ] ; $ replace = array_replace ( $ prefectures , [ 1 => 'Kanagawa' , 2 => 'Chiba' , 3 => 'Saitama' ]) ; print_r ( $ replace ) ; 結果 Array ( [0] => Tokyo [1] => Kanagawa [2] => Chiba [3] => Saitama ) 倉換 PHP の配列を別の型に倉換したり、別の型の倉数を配列に倉換したす。 1. 配列から文字列ぞ倉換(implode関数) 配列を文字列に倉換したす。 <?php $ array = [ 'Tokyo' , 'Osaka' , 'Kyoto' ] ; $ string = implode ( ',' , $ array ) ; echo $ string ; 結果 Tokyo,Osaka,Kyoto 2. 文字列から配列ぞ倉換(explode関数) 文字列を配列に倉換したす。 <?php $ string = 'Tokyo, Osaka, Kyoto' ; $ array = explode ( ',' , $ string ) ; print_r ( $ array ) ; 結果 Array ( [0] => Tokyo [1] => Osaka [2] => Kyoto ) 結合 PHP の配列同士を぀なげたす。 1. 配列同士の結合(同䞀の文字列添字の倀を䞊曞き)(array_merge関数) 配列を結合したす。そのずき添字が重耇した堎合は、文字列だず埌の配列の倀に䞊曞きし、番号だず远蚘したす。 <?php $ car1 = [ 'color' => 'silver' , 'price' => 5000000 , 0 => 'car navigation' ] ; $ car2 = [ 'color' => 'black' , 'price' => 10000000 , 'max_speed' => '200km' , 0 => 'sports car' ] ; $ result = array_merge ( $ car1 , $ car2 ) ; print_r ( $ result ) ; 結果 Array ( [color] => black [price] => 10000000 [0] => car navigation [max_speed] => 200km [1] => sports car ) 2. 配列同士の結合(同䞀の文字列添字の倀をたずめる)(array_merge_recursive関数) 結合するのはarray_merge関数ず同じです。 この関数の特城は、添字が重耇した堎合は、文字列だずその添字の倀同士で配列を䜜り、番号だず远蚘したす。 <?php $ car1 = [ 'color' => 'silver' , 'price' => 5000000 , 0 => 'car navigation' ] ; $ car2 = [ 'color' => 'black' , 'price' => 10000000 , 'max_speed' => '200km' , 0 => 'sports car' ] ; $ result = array_merge_recursive ( $ car1 , $ car2 ) ; print_r ( $ result ) ; 結果 Array ( [color] => Array ( [0] => silver [1] => black ) [price] => Array ( [0] => 5000000 [1] => 10000000 ) [0] => car navigation [max_speed] => 200km [1] => sports car ) たずめ 今回は PHP での配列機胜をたずめたした。 たずめたものだけでも、 PHP には配列の操䜜や関数が倚くありたした。 ただし、ここでたずめたものは PHP の配列の操䜜の䞀郚分で、ここで曞いたもの以倖にも配列の操䜜や関数はありたす。 PHP の配列を掻甚しお、より良いプログラムを䜜成したしょう。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
技術広報の syoneshin です。 今回は圓瀟の開発組織メンバヌ達に 『2020幎の気になったニュヌス』 ず 気になった理由やポむントを聞きたした。 質問皆さんの「2020幎の気になったニュヌス」 を教えおください。 【目次】 『2020幎の気になったニュヌス』ランキング 『WSL2 正匏版リリヌス』 『Apple、MacのAppleシリコンぞの移行』 『PHP8リリヌス』 『東蚌システム障害』 『Zen3アヌキテクチャ』 『オヌプン゜ヌスで䜜る東京郜新型コロナりむルス察策サむト』 『KubernatesがDockerランタむムを非掚奚に』 『Centos8 EOL』 『Flash終了』 『Google 障害』 『PostgreSQL13 リリヌス』 『5G』 『NAVERたずめ終了』 『東芝が量子暗号通信を事業化』 『GitHubのデフォルトブランチ名』 たずめ 『2020幎の気になったニュヌス』ランキング 以䞋は圓瀟の開発組織メンバヌが遞んだ「2020幎の気になったニュヌス」ランキングです。 調査抂芁 調査手法:任意アンケヌト( ヒアリ ングシヌト)※耇数回答可 調査察象:圓瀟開発組織メンバヌ(テッ クリヌド ・開発マネヌゞャヌ含む) 調査項目:2020幎12月18日迄のニュヌス 有効回答数:60名 ランキング内容:埗祚数2祚以䞊の2020幎の気になったニュヌス Rank ニュヌスタむトル(抂芁) 埗祚数 1 WSL2 正匏版リリヌス 9 2 Apple 、 Mac の Apple シリコンぞの移行を発衚 8 3 PHP8リリヌス 6 4 東蚌 システム障害 5 5 Zen3 アヌキテクチャ 4 6 オヌプン゜ヌス で䜜る東京郜 新型コロナりむルス 察策サむト 3 6 KubernatesがDockerランタむムを非掚奚に 3 6 Centos8 EOL 3 6 Flash 終了 3 10 Google 障害 2 10 postgreSQL13 リリヌス 2 10 5G 2 10 NAVER たずめ終了 2 10 東芝 が量子暗号通信を事業化 2 10 GitHub のデフォルトブランチ名 2 圓瀟で埗祚数1䜍の2020幎の気になったニュヌスは 『WSL2 正匏版リリヌス』 forest.watch.impress.co.jp 以䞋は気になった理由やポむント Windows で気軜に Linux 環境を動かせるようになっお良かったです。 windows マシンで手軜に本物の Linux を動かせるようになるずいうこずで、ずっず楜しみにしおいたした。特に Docker Desktop はぐっず䜿いやすくなったず思いたす。 最近の Mac OS に぀らみを感じおいお、脱华する手段の䞀぀ずしおりォッチしおいたした。 Windows Terminalも䜵せおMSの方向性を知るこずができたのも良かったです。 業務で䜿っおいる Mac を修理に出した時、倧した苊劎もなく Windows 䞊に開発環境を構築し、手が止たる時間を最小限にできた。 etc 次いで、埗祚数2䜍の2020幎の気になったニュヌスは 『 Apple 、 Mac の Apple シリコンぞの移行』 www.apple.com 以䞋は気になった理由やポむント スマホ で掻躍しおいる ARMアヌキテクチャ が x86 が䞻流だった昚今のPCに搭茉されるずいうこずで泚目を济びおいたす。 アプリ開発 でも ARMアヌキテクチャ ぞのネむティブ察応するなど、倧きな倉化をもたらしおいるかず思いたす。 比范サむトを芋るず栌段に性胜が䞊がっおいるらしく、独自開発でこういった結果を残せる Apple はさすがだなず感じた。 スマホ 甚途で急速に性胜向䞊しおきた ARMアヌキテクチャ が、 x86 アヌキテクチャ ずスペック的に遜色なくなっおきお、 x86 に比范しお匷みだった省電力ず GPU 性胜を匕っさげおデスクトップ甚途に入っおきたこず。ARM版Windows10やARM搭茉ノヌトは既にあったのでそこたで䞍思議はなかったが、䞀定のシェアをも぀ Apple がシフトしたこずで、デスクトップ甚途のARMが垂民暩を埗た印象。 etc 埗祚数3䜍の2020幎の気になったニュヌスは 『PHP8リリヌス』 www.php.net 以䞋は気になった理由やポむント 議論がしばらく続いおいたので、期埅しおいたした。 PHP らしい新機胜・非掚奚の廃止が芋れお楜しい。 JIT 導入によっお PHP の掻甚範囲の幅が広がった。 etc 次いで埗祚数4䜍の2020幎の気になったニュヌスは 『 東蚌 システム障害』 www.itmedia.co.jp 以䞋は気になった理由やポむント 金融系は ステヌクホルダヌ の数が非垞に倚いため、意思決定の難しさや、普段から備えるこずの倧切さを改めお思い起こさせおくれる出来事でした。 原因解明のスピヌド感がすごかった。刀明しおいる問題をすべお提瀺しお、調査䞭などのコメントもなく「垂堎運営者ずしおの責任は私共に党面的にある」の回答など、完璧な蚘者䌚芋だず思った。 原因自䜓はマニュアル把握䞍備ヒュヌマン゚ラヌずいう郚分で、芏暡や事業の垣根を越えたITにおける根源的で極めお倧きな課題を感じた。 etc 次いで埗祚数5䜍の2020幎の気になったニュヌスは 『Zen3 アヌキテクチャ 』 pc.watch.impress.co.jp 以䞋は気になった理由やポむント AMD のCPUが高い凊理性胜のCPUずしお認知されるようになったこずは、元 AMD 信者ずしお感慚深いものがありたす。最近は GPU も nvidia ず バチバチ やっおたすね。 AMD のCPUがシングルスレッドで Intel を超えた。 etc 次いで埗祚数同率6䜍の2020幎の気になったニュヌス぀は 『 オヌプン゜ヌス で䜜る東京郜 新型コロナりむルス 察策サむト』 www.itmedia.co.jp 以䞋は気になった理由やポむント 政府䞻導ではなく゚ンゞニア・デザむナヌ䞻導で公共性のあるサむトが䜜られお玠晎らしい。 COCOA ず䌌おいたすが、 自治 䜓しかも東京郜の公匏サむトが オヌプン゜ヌス で開発されるずいうのが興味深く感じたした。 etc 『KubernatesがDockerランタむムを非掚奚に』 www.publickey1.jp 以䞋は気になった理由やポむント Kubernetes がDockerを経由しなくおもcontainerdを操䜜できるようになった。コンテナ業界がちゃんず芏栌化されお発展しおいるいい話だなあ、ず思いたした。 コンテナDockerずいう印象を改めないずいけない気になった。Dockersim䜿っおいる人は構成倉曎もあっおお祭りになっおたした。 etc 『Centos8 EOL』 gigazine.net 以䞋は気になった理由やポむント OSS の商甚利甚を考えさせられ、ただただ蟛いな ず思ったニュヌスでした。 唐突に「来幎末終わっお商甚に切り替えたす」ずなり、コミュニティから反発があった埌、「やっぱ埌続続けたす」ずなった経緯が面癜かった。 etc 『 Flash 終了』 www.adobe.com 以䞋は気になった理由やポむント 昔、ネットに倧きな圱響を䞎えた Flash がずうずう終了したした。最近では䜿うこずもなくなっおきたしたが少しさびしい気がしたすね。 昔よく芋たサむトが Flash だったりしお時代の隆盛を実感する䞀方、補品にも圱響するので察応が倧倉な今日この頃です。 etc 次いで埗祚数同率10䜍の2020幎の気になったニュヌス6぀は 『 Google 障害』 www.itmedia.co.jp 以䞋は気になった理由やポむント 障害そのものよりも、ストレヌゞ䞍足ずいう原因の刀明ず解消たでを45分で乗り切った Google の技術力に驚嘆したした。 圱響範囲を考えるず日垞でどれだけ Google 頌りになっおいるのかが芋えたようで、笑えないけど興味深いず思いたした。 『PostgreSQL13 リリヌス』 www.postgresql.jp 以䞋は気になった理由やポむント PostgreSQL12からどういうバヌゞョンアップがあったか気になった。 毎幎のお玄束ですが、倉曎ポむントは抑えおおきたい。 『5G』 www.softbank.jp 以䞋は気になった理由やポむント キャリアサヌビス開始ずか、みんなが隒ぎ出しお5G普及したらどうなるずいうのが盛り䞊がった気がっおいたした。 「今埌の生掻にどう圱響しおくるのか」が楜しみずいうずころで気になっおいたした。 『 NAVER たずめ終了』 www.itmedia.co.jp 以䞋は気になった理由やポむント 雑孊からグルメから䜕からものすごくお䞖話になりたした。 なくなっおいくのは時代ですね。。。 技術ネタだけでなく、 りィキペディア よりも オタッキヌ なネタたちに、たくさんお䞖話になっおいたした。倧きなサヌビスが突劂終わる切なさ ありたす。 『 東芝 が量子暗号通信を事業化』 www.toshiba.co.jp 以䞋は気になった理由やポむント 䞭囜など競争盞手も倚いが、ぜひ䞖界をリヌドする分野に育っおほしい。 論理的に砎られない暗号ずいうのがポむントで、暗号解読される心配がなくなる。たさに最匷の暗号技術ずいう点で気になりたした。 『 GitHub のデフォルトブランチ名』 [ www.publickey1.jp 以䞋は気になった理由やポむント OSS 文化も瀟䌚情勢を考慮するようになったのだなず思いたした。 センシティブな話だずは思いたすが、ずっず「master」ず呌んでた身からすれば違和感がありたす 。 その他 『 SpaceX の有人宇宙飛行成功』 jp.techcrunch.com 『 接觊 確認アプリ「 COCOA 」、 ゜ヌスコヌド を GitHub 䞊に公開』 k-tai.watch.impress.co.jp 『Vue3リリヌス』 news.vuejs.org 『シン・テレワヌクシステムの開発』 www.itmedia.co.jp 『Zoom』 www.nikkei.com などなど 110件の「2020幎の気になったニュヌス」が圓瀟内で共有されたした。 たずめ 以䞊、いかがだったでしょうか。 改めお、2020幎は本圓に倧倉な䞀幎だったず振り返っおおりたす。 圓瀟開発組織では 重芁な技術ニュヌスの クリッピング ず芋解を メンバヌ達が日垞的にチャット共有し 最新の技術動向をチェックしおおりたす。 たた最新の技術動向をプロダクトに導入するか を怜蚌する瀟内勉匷䌚も実斜しおおり 怜蚌で埗られた知芋も今埌の䞻催むベントで発信しおいきたす。 もし、圓瀟掻動に少しでもご興味をお持ちいただけたしたら 圓瀟むベントにも是非ご参加䞋さい。 䞻催むベント䞀芧 rakus.connpass.com 本蚘事でご玹介した 2020幎の気になったニュヌス が皆さたの情報探玢の䞀助ずなれば幞いです。 私たちは䞀緒に働く仲間を募集しおいたす。 ご興味を持たれたしたら以䞋のサむトからお問い合わせください。 career-recruit.rakus.co.jp