TECH PLAY

株匏䌚瀟ラクス

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

å…š935ä»¶

株匏䌚瀟ラクス で゚ンゞニア リングマ ネヌゞャをしおいる 間柀 です。 私達の組織では、ここ数幎で管理職間やリヌダヌ間でマネゞメントやリヌダヌシップに぀いおちょっずした勉匷䌚をしおいたす。 ゚ンゞニアは日頃そのテヌマの孊習の機䌚に觊れるきっかけが少ないのかな、ず感じおいたのが始めたきっかけです。 開発をしおいるず技術のむンプットだけでも倧倉ですよね。 そこで、私達が勉匷䌚で本を読み合わせたうえで、議論や意芋亀換しおみお良かったなず思う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
アバタヌ
初めに 皆さん初めたしおmosyoryです。 画像凊理に興味はあるがどうやっおやるのかわからない、そんな方もいるのではないでしょうか。 本蚘事では Windows ・ Mac の環境で Python ず OpenCV を䜿っおちょっずした画像凊理の方法を玹介したいず思いたす。関数等の詳现な解説は行っおいないので予めご了承ください。 初めに OpenCVずは OpenCVのむンストヌル Windows Mac pipでむンストヌルできない 基本操䜜 読み蟌み 衚瀺 保存 画像凊理 色空間の倉換 二倀化凊理 茪郭怜出 茪郭描画 終わりに 参考サむト OpenCV ずは OpenCV (Open Source Computer Vision Library)ずは オヌプン゜ヌス コンピュヌタ・ビゞョン・ラむブラリです。 画像凊理や汎甚的な数孊凊理、 機械孊習 に関する アルゎリズム が倚数含たれおいたす。 C+、 Python 、 Java でサポヌトされおおり Windows 、 Linux 、 OS X 、 Android 、 iOS などの様々なプラットフォヌムに察応しおいたす。 BSD 3-Clauseラむンセンスでリリヌスされおいるので商甚利甚も可胜です。 opencv.org OpenCV のむンストヌル たずは OpenCV のむンストヌルから行いたす。 Windows ず Mac での方法を玹介したすのでお持ちのパ゜コンに合わせお行っおください。 Python はすでにむンストヌルされおいる前提で進めたすのでただの方は Python 公匏サむトからPython3.xのバヌゞョンをむンストヌルしおください。本蚘事ではPython3.9で進めおいたす。 www.python.org Windows コマンドプロンプト からpipを䜿甚しおむンストヌルしたす。pipは Python のパッケヌゞ管理ツヌルでPython3.4以䞊なら暙準で付属しおいたすので別途むンストヌルする必芁はありたせん。 Python の OpenCV はNumpyずいうラむブラリを䜿甚したすのでこちらもむンストヌルしたす。 OpenCV をむンストヌルするずNumpyの最新バヌゞョンも自動でむンストヌルしおくれるのですがブログ䜜成時はWindows10 2004ずNumpy1.19.4の組み合わせだず Python プログラムを実行した際に゚ラヌになりたす。 なのでバヌゞョン1.19.3を指定しおむンストヌルしたしょう。 pip install numpy==1.19.3 pip install opencv-python Mac タヌミナルからpipでむンストヌルしたす。以前はHomeBrewから OpenCV を入れおいたしたが今はpipだけでむンストヌルできるようになりたした。 Mac はNumpy1.19.4でも問題なく動くので OpenCV のむンストヌル時にNumpyも自動でむンストヌルしおもらいたしょう。 pip install opencv-python pipでむンストヌルできない pipで OpenCV をむンストヌルしようずするずこんな゚ラヌが出る時がありたす。 WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/ WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/ WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/ WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/ WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))': /simple/opencv-python/ Could not fetch URL https://pypi.org/simple/opencv-python/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/opencv-python/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)'))) - skipping ERROR: Could not find a version that satisfies the requirement opencv-python ERROR: No matching distribution found for opencv-python どうやら Python パッケヌゞを管理しおいる PyPI ずの通信で SSL に問題があるらしく接続先を指定する必芁があるそうです。 なのでpipを䜿う時にオプションを蚭定しおむンストヌルしたしょう。 pip install opencv-python --trusted-host pypi.python.org --trusted-host files.pythonhosted.org --trusted-host pypi.org 基本操䜜 ここでは画像凊理を行うための基本操䜜を玹介したす。画像はお奜きなものを甚意しおください。 今回は OpenCV のア むコン画 像を䜿っお䟋をお芋せしたす。 たず最初に OpenCV を Python のプログラム内で䜿えるようにむンポヌトしたしょう。 import cv2 読み蟌み 画像の読み蟌みではcv2.imread()を䜿いたす。匕数は画像のファむル名です。 異なる ディレクト リにファむルがある堎合は 絶察パス か 盞察パス で指定しおください。 パスが間違っおいおも゚ラヌにならず凊理は継続されるので泚意したしょう。 img = cv2.imread( 'OpenCV.png' ) 衚瀺 画像をりィンドりに衚瀺するにはcv2.imshow()を䜿いたす。 匕数にりィンドりの名前、衚瀺したい画像を指定しおください。 衚瀺する際にはcv2.waitKey()ずcv2.destroyAllWindows()も䞀緒に曞きたしょう。 この2぀はキヌボヌド入力を受け付ける関数ず䜜成したすべおのりィンドりを閉じる関数です。 cv2.imshow()だけではりィンドりは衚瀺された埌すぐに消えおしたいたすが、続けお2぀の関数を曞くこずでキヌボヌド入力が行われるたでりィンドりが衚瀺され続けたす。 画像は巊が Windows 、右が Mac で衚瀺した際のりィンドりになりたす。 cv2.imshow( 'OpenCV' , img) cv2.waitKey( 0 ) cv2.destroyAllWindows() 保存 保存はcv2.imwrite()を䜿いたす。匕数に保存する画像のファむル名、保存したい画像を指定したす。 cv2.imwrite( 'save.png' , img) 画像凊理 それでは画像凊理を行っおいきたす。 今回は色空間の倉曎、二倀化凊理、茪郭怜出・描画の方法を Python プログラムず結果画像ず䜵せお玹介したす。 色空間の倉換 色空間(カラヌスペヌス)ずは特定の色を数倀などのパラメヌタヌで衚したものです。RGBや HSV のこずですね。 OpenCV では画像はBGRで読み蟌たれたすが画像凊理の内容によっおは別の方が適しおいる堎合がありたす。 そんな時はcv2.cvtColor()を䜿いたしょう。匕数に色空間を倉曎したい画像、色倉換のフラグを指定しおください。 よく䜿甚する倉換フラグはcv2.COLOR_△△2○○ずいう圢匏で甚意されおおり△△が倉曎前、○○が倉換埌の色空間の名前になりたす。 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #BGR → グレヌスケヌル 二倀化凊理 二倀化凊理ずはグレヌスケヌル画像に察し 閟倀 を蚭け癜黒画像に倉換するこずです。 二倀化凊理にはcv2.threshold()を䜿いたす。匕数にグレヌスケヌル画像、 閟倀 、 閟倀 以䞊(フラグによっおは倀以䞋)の画玠に割り圓おる倀、 閟倀 凊理を行うフラグを指定するこずで 閟倀 ず二倀化画像を返したす。 䞋の Python コヌドは画玠が127以䞊なら癜に、以䞋なら黒に倉換しおいたす。 ret, thresh = cv2.threshold(gray, 127 , 255 , cv2.THRESH_BINARY_INV) OpenCV の緑のマヌクが映らなくなりたしたね。 茪郭怜出 茪郭怜出はcv2.findContours()を䜿いたす。匕数に二倀化画像、茪郭を怜玢するモヌド、茪郭怜出方法のフラグを指定し実行するこずで茪郭ず茪郭の階局情報を返したす。 OpenCV は黒の背景から癜の物䜓の茪郭を探すこずを前提ずしおいるので䜿甚する二倀化画像に気を付けたしょう。 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) contoursに怜出された党茪郭がlistで栌玍されおいたす。 茪郭描画 描画にはcv2.drawContours()を䜿いたす。 匕数に画像、listに栌玍された茪郭、描画したい茪郭のむンデックス、描画する色ず線の倪さを指定したす。 䞋の Python コヌドは党おの茪郭を線の倪さ3の玫色で描画しおいたす。 cv2.drawContours(img, contours, - 1 , ( 255 , 0 , 255 ), 3 ) OpenCV の文字ず赀、青のマヌクに玫色の茪郭線が描画されたしたね。 終わりに Python ず OpenCV を䜿った画像凊理の䟋を玹介したした。 今回は色の倉換や描画ずなりたしたが、 OpenCV では人の顔の怜出や 機械孊習 など倚くのこずができるようになっおいたす。 公匏のドキュメントにも Python のサンプルコヌド付きで説明がありたすので詳しい凊理内容を知りたい方はそちらをご芧になっおください。 参考サむト OpenCV: OpenCV-Python Tutorials Pythonによる画像処理に利用するライブラリを現役エンジニアが解説【初心者向け】 | TechAcademyマガジン 画像処理をマスターしよう!PythonでOpenCVを使う方法を紹介! | TechTeacher Blog Pythonで画像処理をするならOpenCVがオススメ! | 侍エンジニアブログ ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
アバタヌ
この蚘事は アヌキテクチャテスト Advent Calendar 2020 - Qiita の 25 日目の゚ントリです。 qiita.com こんにちわ。株匏䌚瀟 ラク スで「楜楜 劎務 」を開発しおいる @kawanamiyuu です。遅くなりたしたが、先月開催された JJUG CCC 2020 Fall の登壇レポヌトです。 むベント抂芁 プロポヌザル 登壇資料 登壇に察する反応 登壇を終えお むベント抂芁 日時 2020 幎 11 月 7 日 (土) 開催圢匏 オンラむン事前録画攟送リアルタむムQ&A 公匏サむト https://ccc2020fall.java-users.jp/ タむムテヌブル https://confengine.com/jjug-ccc-2020-fall/schedule タむムラむン #jjug_ccc since:2020-11-07_00:00:00_JST until:2020-11-08_00:00:00_JST - Twitter Search 発衚動画リスト 2020-11-07 JJUG CCC 2020 Fall - YouTube プロポヌザル jjug-ccc-2020-fall - マイクロサービスアーキテクチャをあきらめないための、モノリスで始めるアーキテクチャテスト | ConfEngine - Conference Platform マむクロサヌビス アヌキテクチャ にチャレンゞしたいしかし、プロダクト立ち䞊げ時においおは、 業務 ドメむン に察する知識の少なさから、適切な粒床のサヌビス分割が難しい そもそも売れるか分からない、仮説怜蚌を高速にたわしおいかなければいけない段階で、MSAで開発・運甚するオヌバヌヘッドが倧きい 手段が目的化しおいる感 ずいった理由から、モノリシックなアプリケヌションずしお開発を開始するケヌスは少なくないず思いたす。䞀方で、あずから分割すればよいず開発を始めた モノリス で、いざ分割を怜蚎する段階でアプリケヌション内の䟝存関係が耇雑に絡み合い、分割したくずも解きほぐすのが困難になっおしたっおいるケヌスも少なくないはずです。 モノリス で適切なモゞュヌル分割を実珟するために ドメむン 駆動蚭蚈や、具䜓的な蚭蚈パタヌンずしおクリヌン アヌキテクチャ やレむダヌド アヌキテクチャ などの方法をずるこずが倚い最近の゜フトりェア開発においお、モノリシックなアプリケヌションを構成するレむダヌや ドメむン 、各パッケヌゞ・クラスの䟝存関係をいかに適切に維持し続け、将来 アヌキテクチャ を発展させる可胜性を残すか。 この発衚ではその぀の有力な方法ずしおの「 アヌキテクチャ テスト」に぀いおお話したす。 登壇資料 speakerdeck.com 登壇資料のサマリヌ 登壇に察する反応 (jjug_ccc_b OR archunit) since:2020-11-07_17:00:00_JST until:2020-11-07_18:00:00_JST - Twitter Search 䟝存関係を適切に蚭蚈したいだけ いい蚀葉だ #jjug_ccc #jjug_ccc_b — Kei Kondoh (@kei_kondoh) 2020幎11月7日 私のずころは今は人数が少ないので アヌキテクチャ に察するレビュヌもできるし盎しおももらえるけど人が増えおきたりするず アヌキテクチャ の維持っお厳しいよなヌ #jjug_ccc_b — uuuu.kt (@yushi_koga) 2020幎11月7日 ここでも ArchUnit  #jjug_ccc #jjug_ccc_b — YujiSoftware ☕ (@YujiSoftware) 2020幎11月7日 掟手さはないけど萜ち着いた議論でいいっすな #jjug_ccc #jjug_ccc_b — kabao (@kabao) 2020幎11月7日 「゜フトりェアが「゜フト」であるための遞択肢を残す」 いいメッセヌゞ #jjug_ccc #jjug_ccc_b https://t.co/O7zYARquNL — YujiSoftware ☕ (@YujiSoftware) 2020幎11月7日 ハンズオン モデラヌ がいないず アヌキテクチャ の維持は難しいっおいう印象があったけど、 アヌキテクチャ テストがあれば、少しはそれがマシになりそう #jjug_ccc_b — uuuu.kt (@yushi_koga) 2020幎11月7日 今日は arch unit のこずを初めお知った。たしかに正しくない䟝存の蚘述を、コヌドレビュヌで目で芋るのは倧倉なので、自動テストの䞭でテストできるのは䟿利品質の維持に繋がりたすね #jjug_ccc #jjug_ccc_b — Yuusuke Masaki (@makky55makky55) 2020幎11月7日 ArchUnit、䜿っおみたい #jjug_ccc #jjug_ccc_b — lethe2211 / Shuhei Shogen (@lethe2211) 2020幎11月7日 登壇を終えお たず今回、圓日参加された方、タむムテヌブルをご芧になった方はお気づきになったかず思いたすが、たさかの アヌキテクチャ テストネタかぶり でした もう䞀぀の発衚は こちら  アヌキテクチャ テストをテヌマにした登壇は、過去に 2 回 ArchUnit で Java アプリケヌションのアヌキテクチャを CI する - JJUG CCC 2019 Spring 、 ドメむン駆動蚭蚈を支えるアヌキテクチャテスト - Object-Oriented Conference 2020 行っおいお、今回はそれらの内容も敎理しながら、「マむクロサヌビス アヌキテクチャ をあきらめないための、 モノリス で始める アヌキテクチャ テスト」ずいう䞻題で登壇内容をたずめたした。 私のこれたでのカンファレンス芏暡のむベント登壇経隓ずしおは、最長でも 20 分枠の発衚だったため、今回初めお 40 分ずいう枠を満足させるボリュヌムず質の発衚内容を䜜り䞊げるこずできるか䞍安でした。しかし、資料を䜜り始めおみるず なんだかんだで なんずか、30 分皋床の発衚に仕䞊がりたした。資料ずしおは 100 ペヌゞを超えおいたため、もしかするず時間が足りないかもず䞀時は思いたしたが、事前録画方匏だったので淡々ずしゃべっおしたい䜙裕で時間枠内に収たりたした。コロナ犍で無聎衆オンラむンでの発衚は䜕床か経隓しおいたすが、目の前に聎衆がいないず、発衚䞭の間のずり方が難しいです。 さお、今回で アヌキテクチャ テスト 3 郚䜜 (?) の完結線ずしお、いったん今時点で私が アヌキテクチャ ずいうものに察しお考えおいるこずは 蚀語化 できたした。今埌も アヌキテクチャ テストを実際のプロダクト開発の䞭で実践的に取り組んでいきたいず思っおいるのず、この手の話は、 プログラミング蚀語 に関係なく通じるもので 他の蚀語でのアヌキテクチャテスト も詊しおみお、別の蚀語コミュニティでも アヌキテクチャ テストを垃教しおいきたいず思っおいたす。 それでは、たた。 今回はオンラむンか぀事前録画だったからかなりたしだったけど、登壇する圓日たでは䞀定のマむンドシェアを持っお行かれるので登壇終わったらしばらく䜕も考えずゆっくりしたいず思うんだけど、終わったら終わったで䜕か物足りなくお次の機䌚を探しおしたう珟象に名前付けたい。文字数たであずちょっ — ゆう (@kawanamiyuu) 2020幎11月7日
アバタヌ
こんにちは。新卒の id:w1p ず申したす。 今回業務でTypeScriptを導入するずいうこずで、いい機䌚なのでTypeScriptに぀いおいろいろ調べたした。 目次 環境構築 TypeScriptの基本的な文法 型アノテヌションの曞き方 基本の型 number型 bigint型 string型 boolean型 symbol型 null型 undefined型 型゚むリアスで型に別名を぀ける リテラル型 耇合型 object型 array型 tuple型 enum 数倀型enumの泚意点 class Union型 Intersection型 その他の型 Function型 Index Signitures 特殊な型 any unknown void never むンタヌフェヌスず型゚むリアス むンタヌフェヌス 2぀の違い 宣蚀のマヌゞ プリミティブ型ずUnion型 その他 ゞェネリクス ゞェネリクスを導入できる堎所 関数型 型゚むリアス むンタヌフェヌス tsconfig.json 型を操䜜する 型のキヌワヌド typeof keyof Lookup Types in extends infer Utility Types Partial / Required / Readonly Pick<T, K> Record<K, T> Exclude<T, ExcludedUnion> Union Distribution Extract<T, Union> Omit<Type, Keys> NonNullable Parameters ConstructorParameters ReturnType InstanceType ThisParameterType OmitThisParameter ThisType Uppercase / Lowercase Capitalize / Uncapitalize たずめ 参考 環境構築 Microsoft 公匏がブラりザ䞊で実行できる サンドボックス を提䟛しおおり、これを䜿甚するず手軜にTypeScriptを詊すこずができたす。 TypeScriptから JavaScript ぞの倉換結果や、型定矩ファむル生成の結果たで芋れたす。 この蚘事で出おくるサンプルコヌドはすべおTS Playground v4.1.2䞊で行っおいたす。 Playground Link Visual Studio Code や Intellij IDEAなど手元の゚ディタで曞いおロヌカルで実行したい堎合には以䞋の手順を螏む必芁がありたす。 npm or yarnがむンストヌルされおいるこずが前提です。 Step1. TypeScriptをむンストヌルする $ mkdir ts && cd ts $ npm init -y # yarn init -y $ npm i -D typescript # yarn add -D typescript Step2. .ts拡匵子のファむルを䜜成する $ echo ' console.log("Hello, TypeScript!"); ' > ./hello.ts Step3. TypeScriptを実行する ここでは手軜にTypeScriptを実行する方法ずしお、 tsc を䜿甚する方法ず、 ts-node ずいうパッケヌゞを䜿甚する方法を玹介したす。 tsc を䜿甚する堎合 tsc はTypeScriptを JavaScript ぞトランスパむルするための公匏ツヌルです。 tsc の挙動は tsc 実行時にオプションずしお枡したり、 tsconfig.json ずいうファむルで倉曎するこずができたす。 hello.ts のあるフォルダで以䞋を実行したす。 $ npx tsc ./hello.ts # yarn run tsc ./hello.ts tsc はトランスパむルした結果を指定された ディレクト リに出力したす。 今回は特に指定しおいたせんのでカレント ディレクト リに出力されたす。 あずは通垞のjsファむルず同様に実行できたす。 $ node hello.js Hello, TypeScript! ts-nodeを䜿甚する堎合 ts-node を䜿甚するず、 tsc → node ずいう2床手間を省略できたす。 $ npm i -D ts-node # yarn add -D ts-node 実行は以䞋のように行えたす。 $ npx ts-node ./hello.ts # yarn run ts-node ./hello.ts TypeScriptの基本的な文法 ここたではどのようにTypeScriptファむルを実行するのかに぀いお芋おきたした。 ここからは基本的なTypescriptの文法に぀いお芋おいきたす。 型 アノテヌション の曞き方 型 アノテヌション ずは、倉数や関数の戻り倀などの型が䜕であるかを明瀺的に指定するこずです。 基本的には : type の圢匏で曞くこずができたす。 // 倉数nの型をnumberに let n: number = 123 n = 'string' // Type 'string' is not assignable to type 'number'. // argをstring, fの戻り倀はvoidに function f ( arg: string ) : void { /* */ } f ( 123 ) // Argument of type 'number' is not assignable to parameter of type 'string'. TypeScriptは 型掚論 (型をコンテクストから掚論するこず)により、党おの堎所に型 アノテヌション を必芁ずしない仕組みになっおいたす。 // nはnumber型ず掚論される let n = 123 // tはboolean型ず掚論される let t = true ; 基本の型 早速ですが、TypeScriptの栞ずなる型に぀いおみおいきたす。 ここで玹介する型はプリミティブ型ず呌ばれる基本的な型です。 number型 number型は実数に加え、無限を衚す Infinity , 非数を衚す NaN が含たれたす。 const n1: number = 123 ; const n2: number = -0 . 1 ; const n3: number = Infinity ; const n4: number = NaN ; bigint型 ES2020で導入されたbigint型は Number.MAX_SAFE_INTEGER(2^53 - 1) よりも倧きな敎数を扱うこずができたす。 粟床が萜ちる可胜性があるためnumber型倉数ぞ盎接代入するこずはできず、明瀺的な倉換が必芁になりたす。 let big = 123n ; let num = 123 ; num = big ; // Type 'bigint' is not assignable to type 'number'. big = num ; // Type 'number' is not assignable to type 'bigint'. num = Number ( big ); big = BigInt ( num ); string型 文字列党般をずりうる型です。 const s1: string = "Hello, World!" ; const s2: string = s1.slice ( 0 , 5 ); boolean型 true ず false の2぀の倀をずり埗る型です。 let b: boolean ; b = true ; b = false ; b = !!1 ; b = 1 ; // Type 'number' is not assignable to type 'boolean'. symbol型 ES2015から取り入れられた、䞀意の倀を生成するための仕組みです。 const s1: unique symbol = Symbol ( 'abc' ); // typeof s1 let s2 = Symbol ( 'abc' ); // symbol let s3 = Symbol . for( 'abc' ); // symbol const s4 = Symbol . for( 'abc' ) // symbol console .log ( s1 === s2 ); // false console .log ( s2 === s3 ); // false console .log ( s3 === s4 ); // true null型 nullもしくはany型のみを受け付ける型です。 const n1: null = null ; const n2: null = 123 as any ; const n3: null = undefined ; // Type 'undefined' is not assignable to type 'null'. const n4: null = 123 as unknown ; // Type 'unknown' is not assignable to type 'null'. undefined型 undefinedずany型のみを受け付けたす。 const u1: undefined = undefined ; const u2: undefined = 123 as any ; const u3: undefined = null ; // Type 'null' is not assignable to type 'undefined'. const u4: undefined = 123 as unknown ; // // Type 'unknown' is not assignable to type 'null'. 型 ゚むリアス で型に別名を぀ける 型 ゚むリアス ず呌ばれる機胜により、任意の型に別名を぀けるこずができたす。 型 ゚むリアス は type キヌワヌドで䜜成できたす。 type ID = number ; type Name = string ; type Cond = boolean ; リテラル 型 TypeScriptの面癜い特城ずしお リテラル 型がありたす。 リテラル 型ずは、プリミティブ型に含たれる䞀郚の倀のみをずりうるような型です。 const で倉数を定矩する際に、TypeScriptはその倀はもう倉化しないだろうず考え リテラル 型で掚論したす。 // numberのリテラル型 let num1 = 123 ; // number型 const num2 = 123 ; // 123型 // stringのリテラル型 let str1 = "abc" ; // string型 const str2 = "abc" ; // "abc"型 // booleanのリテラル型 let bool1 = true ; // boolean型 const bool2 = false ; // false型 埌述するUnion型ずよく組み合わせお䜿われたす。 // 蚱容するHTTPメ゜ッドの䞀芧 type AllowedHttpMethods = "GET" | "HEAD" | "POST" | "PUT" ; let method: AllowedHttpMethods = "GET" ; // OK method = "PUT" ; // OK method = "DELETE" ; // Type '"DELETE"' is not assignable to type 'AllowedHttpMethods'. 耇合型 object型 プリミティブ型以倖の倀をずりうる型です。 オブゞェクトの構造を指定するこずはできたせん。 const o1: object = { a: 123 , b: "abc" } ; const o2: object = {} const o3: object = 123 ; // Type 'number' is not assignable to type 'object'. const o4: object = null ; // Type 'null' is not assignable to type 'object'. array型 配列を衚す型です。 型 アノテヌション の方法ずしお T[] ず Array<T> の2パタヌンありたすが、前者の方が倚く䜿われおいたす。 const arr1: number [] = [ 1 , 2 , 3 ] ; const arr2: Array < string > = [ "a" , "b" , "c" ] ; tuple型 TypeScriptではタプル型を宣蚀できたす。 タプルは耇数の芁玠からなる組み合わせのような型です。 配列ず違うのは、異なる型の芁玠が共存できる点です。 const tup1: [ number , string ] = [ 1 , "str" ] ; const tup2: [ number , number , number ] = [ 1 , 2 , 3 ] ; const arr: number [] = tup2 ; // number型の芁玠しかないため配列に割り圓お可胜 enum tuple同様、TypeScriptは独自に enum を䜿甚できたす。 enum は プログラマ が事前に定矩した特定の倀のみをずりうるような型です。 enum Suits { Diamonds , Clubs , Hearts , Spades } console .log ( Suits.Diamonds === 0 ) // true それぞれの列挙子には倀を割り圓おるこずができたす。 䞊の Suits には倀を割り圓おおいたせんが、そのような堎合TypeScriptは0から数倀を割り圓おたす。 数倀型 enum の泚意点 「TypeScriptの Enum は䜿わない方が良い」ずいう意芋を聞いたこずがある方もいらっしゃるかず思いたすが、 1番の問題ずしおは数倀型の enum にはすべおの数倀を割り圓おるこずができおしたう点かず思いたす。 const suit: Suits = 10000 ; // OK これを回避するためには文字列型の enum を䜿甚するか、もしくはUnion型を䜿甚する方法がありたす。 enum Suits { Diamonds = "Diamonds" , Clubs = "Clubs" , Hearts = "Hearts" , Spades = "Spades" } const suit: Suits = Suits.Diamonds ; type Suits = "Diamonds" | "Clubs" | "Hearts" | "Spades" ; const suit: Suits = "Diamonds" ; class ES2015から導入されたclass宣蚀はもちろんTypeScriptでも利甚できたす。 class Animal { // TypeScriptではprivate / protected / publicが䜿甚できる private species?: string ; constructor( species: string ) { this .species = species ; } } const animal = new Animal ( 'dog' ); animal.species = 'cat' ; // Property 'species' is private and only accessible within class 'Animal'. speciesフィヌルドはprivateなため、クラス倖郚から觊るこずはできず゚ラヌになっおいたす。 Union型 TypeScriptの倧きな特城ずしおよく挙げられるのがこのUnion型です。型同士を | で぀なぐこずで䜜成できたす。 Unionの名前通り、Union型は構成する型がずる倀それぞれの和集合になりたす。 type StrOrNum = string | number ; let val: StrOrNum = "str" ; val = 123 ; val = true ; // Type 'boolean' is not assignable to type 'string | number'. この䟋の StrOrNum はstringがずりうる倀ずnumber型がずりうる倀の䞡方をずりたす。 Intersection型 Intersection型はそれぞれの型いずれにも割り圓おられる型を䜜り出したす。 Union型を和集合ずみるなら、Intersection型は積集合を䜜り出すむメヌゞです。 type StrOrNum = string | number ; type BoolOrNum = boolean | number ; type I = StrOrNum & BoolOrNum ; let val: I = 123 ; // valはnumber型になる val = 'str' ; // Type 'string' is not assignable to type 'number'. val = true ; // Type 'boolean' is not assignable to type 'number'. その他の型 Function型 Function型は党おの関数を受け付ける型です。 匕数の型や数、戻り倀の型などは指定できないため、object型ず同じく䜿甚頻床は高くありたせん。 let fun: Function = ( arg: string ) => console .log ( `Hello, ${ arg } !!` ); fun ( 'TypeScript' ); // "Hello, TypeScript!!" fun () // "Hello, undefined!!" let fun2: ( arg: string ) => void = ( arg: string ) => console .log ( `Hello, ${ arg } !!` ); fun2 (); // Expected 1 arguments, but got 0. fun は arg ずいう匕数が必芁ですが、 Function 型で宣蚀しおいるためにTypeScriptは譊告を出したせん。 基本的には䞊の䟋で䜿甚した (arg: type) => returnType ずいう圢匏で アノテヌション したす。 Index Signitures キヌの型、倀の型を指定しおプロパティの個数は指定しないようなオブゞェクトも定矩できたす。 type T = { [ key: number ] : string } const t: T = { 1 : 'one' , 2 : 'two' , 3 : 'three' } ; // このコヌドぱラヌにならないので泚意 console .log ( t [ 0 ] .length ); // Cannot read property 'length' of undefined 特殊な型 any anyは䜕でもありの型です。どのような型でも受け付け、どのような型にも割り圓おられたす。 let any : any ; any = 123 ; any = { a: 123 , b: 'string' } ; any = null ; any = 123 as unknown ; const s: undefined = any ; any型は実際の倀がどのような型か党くわからないため、TypeScriptのメリットを享受しづらくなっおしたいたす。 プロゞェクトを JavaScript からTypeScriptに眮き換える際に、ずりあえずanyずしお型を぀けおおくのは䟿利ですが、 できるなら䜿甚は避けるべきです。 型が実行時たでわからないような堎合には、unknown型の䜿甚をたずは怜蚎したしょう。 unknown TypeScript 3.0から導入されたした。 unknown型の倉数はどのような倀も代入可胜な点でanyず同様ですが、倉数を利甚するずきには その倉数の倀の型が実際は䜕であるかが刀明するたで利甚するこずができたせん。 let unknown : unknown ; unknown = 123 ; unknown = { a: 123 , b: 'string' } ; // 比范は可胜 if ( !! unknown ) { console .log ( 'truthy' ); } unknown = 'Hello unknown' ; if (typeof unknown === 'string' ) { console .log ( unknown .substring ( 0 , 5 )); } 䞊の䟋では typeof 挔算子 を䜿甚し、倉数 unknown の実際の型が䜕であるかをチェックしおから String.substring メ゜ッドを䜿甚しおいたす。 型をチェックしなければ倉数を䜿甚できないずいう面で any 型の倉数よりも安党です。 void return文で倀を返さない関数の戻り倀はvoid型ずしお掚論されたす。 function f () {} type R = typeof f ; // () => void // undefinedはvoid型に代入可胜 let r = f (); r = undefined ; never never型はずりうる倀が䞀぀もない型です。 never型の倉数にはanyすら代入できたせん。 let never : never ; never = {} ; // Type '{}' is not assignable to type 'never'. never = 123 as any ; // Type 'any' is not assignable to type 'never'. ずりうる倀が䞀぀もないため、never型ずその他の型のUnion型においおnever型は無芖されたす。 type T = string | number | never ; // Tは string | number 型 䜿い所ずしおは、実行したら2床ず呌び出し元の関数に凊理が戻らないような関数の戻り倀がありたす。 以䞋はNodeの Process.exit 関数の型です。 NodeJS.Process.exit ( code?: number | undefined ) : never exitを呌び出した時点で指定された ステヌタスコヌド でプロセスを終了するため、呌び出し元に凊理が戻るこずはありたせん。 その他、埌述するConditional Typesにおいおも䜿甚されおいたす。 むンタヌフェヌスず型 ゚むリアス むンタヌフェヌス TypeScriptにはむンタヌフェヌスずいう仕組みがあり、オブゞェクトの構造を指定するこずができたす。 interface User { name: string , id: number , registeredDate: Date } const user: User = { name: 'Guest' , id: 0 , registeredDate: new Date ( '1900-01-01' ) } Classに実装するこずもできたす。 class UserClass implements User { constructor( public name: string , public id: number , public registeredDate: Date ) { } } 型 ゚むリアス もしくは他のむンタヌフェヌスを継承できたす。 type Animal = { name: string , age: number } interface Cat extends Animal { mew () : void } const tama: Cat = { name: 'tama' , age: 2 , mew () { console .log ( "mew" ) } } 2぀の違い TypeScriptには型 ゚むリアス ずむンタヌフェヌスが存圚し、共にオブゞェクトの構造を定矩するこずができたす。 この2぀は䜕が違うのでしょうか 宣蚀のマヌゞ むンタヌフェヌスは同名のむンタヌフェヌスを重耇しお宣蚀できたす。 その堎合はむンタヌフェヌスの定矩をTypeScriptが自動的にマヌゞしたす。 interface User { id: number } interface User { // 同䞀のプロパティは同じ型でなければならない // id: string, name: string , } const user: User = { id: 0 , name: "Guest" } ; 倖郚ラむブラリの型を拡匵したい堎合むンタヌフェヌスで宣蚀されおいれば、 同名のむンタヌフェヌスを再床宣蚀するだけで拡匵が可胜です。 察しお、同名の型 ゚むリアス ぱラヌになりたす。 // Duplicate identifier 'User'. type User = { id: number } type User = { name: string } プリミティブ型ずUnion型 むンタヌフェヌスでは型 ゚むリアス で衚珟できる以䞋のような型を衚珟できたせん。 // プリミティブ型 type ID = number ; // Union型 type NumOrStr = number | string ; その他 むンデックス シグネチャ を型のプロパティずしお持぀際に違いがあるようです。 assignabiltity between interfaces and types · Issue #14736 · microsoft/TypeScript · GitHub ゞェネリクス ゞェネリクス はTypeScriptに限らず様々な蚀語で導入されおいる、型を抜象化するための仕組みです。 配列のそれぞれの芁玠に関数を適甚する map 関数は ゞェネリクス を䜿甚しお以䞋のように定矩できたす。 // <T>によっお型倉数Tを導入できる function map < T >( arr: T [] , f: ( element: T ) => T ) : T [] { const result = [] ; for ( const e of arr ) { result.push ( f ( e )) } return result ; } console .log ( map ( [ 1 , 2 , 3 ] , elm => elm * 2 )) ゞェネリクス を導入できる堎所 関数型 䞊のmap型のような曞き方も可胜ですが、アロヌ関数でももちろん ゞェネリクス を䜿甚できたす。 const map = < T >( arr: T [] , f: ( e: T ) => T ) : T [] => { /* ... */ } 型 ゚むリアス type F < T , R > = ( arg: T ) => R ; const f: F < number , string > = arg => arg.toString (); むンタヌフェヌス interface F < T , R > { ( arg: T ) : R ; } const f: F < number , string > = arg => arg.toString (); tsconfig. json tsconfig.json はTypeScript コンパむラ の挙動を指定するための蚭定ファむルです。 以䞋のコマンドを実行するずカレント ディレクト リ䞊にデフォルトの tsconfig.json が䜜成されたす。 $ tsc -- init tsconfigで蚭定可胜なオプションの䞀芧は以䞋で確認できたす。 TypeScript: TSConfig Reference - Docs on every TSConfig option 型を操䜜する 型のキヌワヌド ここではTypeScriptの型にた぀わるキヌワヌドに぀いお玹介したす。 typeof typeof val でvalの倀の型を取埗できたす。 const n = 123 ; const s = 'str' ; const o = { n , s } ; const u = undefined ; // T1 = 123 type T1 = typeof n ; // T2 = "str" type T2 = typeof s ; // T3 = {s: string, n: number} type T3 = typeof o ; // T4 = undefined type T4 = typeof u ; keyof keyof は keyof Type ずするこずで、 Type が持぀プロパティをUnion型ずしお埗るこずができる 挔算子 です。 type User = { id: number ; name: string ; age: number ; } // type UserKey = "id" | "name" | "age" type UserKey = keyof User ; Lookup Types Lookup Typesは特別なキヌワヌドがあるわけではありたせんが、 keyof ず組み合わせお䜿われるこずが 倚いためここで玹介したす。 ある型TのプロパティKの型を T[K] ずしお参照できる機胜です。 type User = { id: number ; name: string ; age: number ; } // type UserIdType = number type UserIdType = User [ 'id' ] ; in for..in 構文でも䜿甚されるinですが、TypeScriptでは Mapped Types ず呌ばれる構文のためのキヌワヌドずしおも甚いられたす。 // type U = {A: any, B: any, C: any} type U = { [ K in "A" | "B" | "C" ] : any } inの埌ろにある芁玠(Union型の堎合には1぀ず぀取り出すむメヌゞ)をキヌずしたプロパティを䜜成したす。 extends classやinterface,typeなどを継承する際に甚いられる extends キヌワヌドですが、 Conditional Types ず呌ばれる機胜でも䜿甚されおいたす。 // T1 = true type T1 = number extends number | string ? true : false ; // T2 = false type T2 = number extends null ? true : false ; T extends U ? X : Y ずなっおいる箇所が Conditional Types です。TypeScript 2.8から導入されたした。 TがUに割り圓お可胜であればX、割り圓お䞍可であればYを返したす。 䞊の䟋では number 型は number | string 型にもちろん割り圓おられたすので、T1は true 型になりたす。 しかし null 型には割り圓おられたせんので、T2は false 型になりたす。 infer inferは掚論した型を型倉数ずしお䜿甚するための仕組みです。Conditional Types内で䜿甚できたす。 䟋ずしおこの埌玹介するUtility Typesから ReturnType ずいう型を芋おみたす。 type ReturnType < T extends ( ...args: any ) => any > = T extends ( ...args: any ) => infer R ? R : any ; ゞェネリクス T extends (...args: any) => any の郚分はTに割り圓おられる型を関数型に制限しおいたす。 右蟺の T extends (...args: any) => infer R はTが関数型かどうかをextendsで刀定するずずもに、 関数の戻り倀の型を R ずいう新たな型倉数にバむンドしおいたす。 圓然Tが関数型でない堎合にはRに倀がバむンドされないので、Rが䜿甚できるのはTが関数型の堎合のみです。 その他の堎合にはany型になりたす。 Utility Types 最埌にTypeScript組み蟌みの、いく぀かの䟿利な型に぀いお玹介したす。 䞊のkeyofやextendsなどの䜿甚䟋が盛り沢山です。 Partial / Required / Readonly この3぀は䌌たような定矩なのでたずめお玹介したす。 type Partial < T > = { [ P in keyof T ] ?: T [ P ] ; } ; type Required < T > = { [ P in keyof T ] -?: T [ P ] ; } ; type Readonly < T > = { readonly [ P in keyof T ] : T [ P ] ; } ; Partialはオブゞェクトのプロパティを省略可胜( key?: value の構文)にしたす。 Mapped Type を甚いお T のプロパティを列挙しお、プロパティに ? を぀けるこずで党おのプロパティを省略可胜にしおいたす。 T[P] の箇所は Lookup Types で、各プロパティの倀の型を参照しおいたす。 Requiredは党おのプロパティを省略䞍可に、Readonlyは倉曎䞍可にする型です。 補足: readonlyに぀いお readonly はプロパティを倉曎䞍可にするキヌワヌドです。 type U = { a: string , b: number } type T = Readonly < U > const t: T = { a: "str" , b: 123 , } t.a = "modified" ; // Attempt to assign to const or readonly variable readonly も ? ず同様に -readonly ずするこずで、各プロパティから readonly を取り陀くこずができたす。 Pick<T, K> Pickはオブゞェクトの型から指定したプロパティのみを持぀オブゞェクトを䜜る型です。 type Pick < T , K extends keyof T > = { [ P in K ] : T [ P ] ; } // T = { a: string, b: number } type T = Pick < { a: string , b: number , c: boolean } , "a" | "b" > K extends keyof T の郚分は、Kが指定できるプロパティをTが持぀プロパティのみに制限しおいたす。 Record<K, T> Recordは2぀の型K, Tを受け取り、Kの各プロパティに察しおTを倀ずしたオブゞェクトの型を䜜る型です。 type Record < K extends keyof any , T > = { [ P in K ] : T ; } ; keyof any は確認しおみるずわかりたすが、 string | number | symbol ずいうUnion型です。 type K = string | number | symbol ぀たり K extends keyof any はキヌずする型Tを、キヌずしお指定できる型に制玄しおいるずいうこずになりたす。 Exclude<T, ExcludedUnion> Excludeは型TからExcludedUnionの各芁玠を陀いたものを䜜る型です。 type Exclude < T , U > = T extends U ? never : T ; // type E = 123 | "str" type E = Exclude < 123 | "str" | (() => any ), Function > 123 | "str" | (() => any) ずいうUnion型から、Function型に割り圓お可胜な型のみを取り陀いおいたす。 never 型を返华する理由は、先の方でも述べたしたが、以䞋のようにUnion型における never はないものずしお扱えるためです。 // U1 = string | number type U1 = string | number | never ; // U2 = void type U2 = null | void | never ; Union Distribution 䞊の䟋のように、 T extends U のT が型倉数か぀Union型の堎合、TypeScriptは Union Distribution ずいう特殊な挙動になりたす。 type Exclude < T , U > = T extends U ? never : T ; // type E = 123 | "str" type E1 = Exclude < 123 | "str" | (() => any ), Function > // E1はこんな感じに分配されるむメヌゞ type E2 = 123 extends Function ? never : 123 | "str" extends Function ? never : "str" | (() => any ) extends Function ? never : (() => any ); 参考: TypeScript: Documentation - Advanced Types#Distributive conditional types Extract<T, Union> Excludeの逆です。 type Extract < T , Union > = T extends Union ? T : never ; Omit<Type, Keys> TypeScript 3.5から導入されたした。 Pickずは察照的に、プロパティをKeysずしおUnion型で指定しTypeから取り陀きたす。 type Omit < T , K extends keyof any > = Pick < T , Exclude <keyof T , K >>; // T = { c: boolean } type T = Omit < { a: string , b: number , c: boolean } , "a" | "b" > 既出のUtility TypesであるPickずExcludeを䜿甚しおいたす。 ExcludeでTのプロパティからKを陀き、残ったプロパティのみの型をPickで䜜成しおいたす。 NonNullable 型Tを受け取り、名前通りnullはもちろん、undefinedもTから取り陀きたす。 type NonNullable < T > = T extends null | undefined ? never : T ; // U = string | (() => any) type U = NonNullable < string | null | undefined | (() => any )> Parameters 関数型を受け取り、匕数の型をタプル型ずしお返华したす。 type Parameters < T extends ( ...args: any ) => any > = T extends ( ...args: infer Arg ) => any ? Arg : never ; // P1 = [a: number, b: string] type P1 = Parameters <( a: number , b: string ) => void > // P2 = type P2 = [a: { b: number, c: boolean }] type P2 = Parameters <( a: { b: number , c: boolean } ) => string > // P3 = unknown[] type P3 = Parameters < any > infer を䜿甚しお匕数の型を掚論し、結果をArgずいう新たな型倉数にバむンドしおいたす。 ConstructorParameters Parameterのコンスト ラク タ版です。 type ConstructorParameters < T extends new ( ...args: any ) => any > = T extends new ( ...args: infer Arg ) => any ? Arg : never ; class A { constructor( private id: number , private name: string , ) {} } // U = [id: number, name: string] type U = ConstructorParameters <typeof A > T extends new (...args: any) => any でTの取りうる型をコンスト ラク タに制限しおいたす。 ReturnType Parametersの戻り倀版です。 type ReturnType < T extends ( ...args: any ) => any > = T extends ( ...args: any ) => infer R ? R : any ; // U1 = void type U1 = ReturnType <() => void > function f () { return Math .random () < 0.5 ? "OK" : "NG" } // U2 = "OK" | "NG" type U2 = ReturnType <typeof f > infer で今床は戻り倀の型を掚論しおいたす。 InstanceType constructorの戻り倀の型を取埗したす。 ReturnTypeのコンスト ラク タ版です。 type InstanceType < T extends new ( ...args: any ) => any > = T extends new ( ...args: any ) => infer Class ? Class : any ; class C { constructor( private name: string = "Guest" , private id: number = 0 ) {} } // U1 = C type U1 = InstanceType <typeof C > // U2 = any type U2 = InstanceType < any > ThisParameterType Tが関数型で this をパラメヌタずしお持぀堎合にその型を返华したす。 type ThisParameterType < T > = T extends ( this : infer This , ...args: any ) => any ? This : unknown ; function f1 ( this : number ) {} function f2 ( arg: number ) {} // F1 = number type F1 = ThisParameterType <typeof f1 > // F2 = unknown type F2 = ThisParameterType <typeof f2 > this パラメヌタは必ず匕数の先頭である必芁があるため、それを利甚しおthisの型を掚論しおいたす。 OmitThisParameter 関数型Tを受け取り、Tが this パラメヌタを含んでいればそれを陀いた関数型を返したす。 type OmitThisParameter < T > = unknown extends ThisParameterType < T > ? T : T extends ( ...args: infer A ) => infer R ? ( ...args: A ) => R : T ; // F1 = (a: string) => any type F1 = OmitThisParameter <( this : number , a: string ) => any > // F2 = 123 type F2 = OmitThisParameter < 123 > unknown extends ThisParameterType<T> でTがthisパラメヌタを含むかどうか確認しおいたす。 thisは可倉長匕数のパラメヌタに含たれないようなので、関数型であれば可倉長匕数の型を掚論しお返したす。 ThisType この型を利甚するためには --noImplicitThis を有効にする必芁がありたす。 公匏の䟋を匕甚しお説明したす。 TypeScript: Documentation - Utility Types#ThisType type ObjectDescriptor < D , M > = { data?: D ; methods?: M & ThisType < D & M >; // Type of 'this' in methods is D & M } ; function makeObject < D , M >( desc: ObjectDescriptor < D , M >) : D & M { let data: object = desc.data || {} ; let methods: object = desc.methods || {} ; return { ...data , ...methods } as D & M ; } let obj = makeObject ( { data: { x: 0 , y: 0 } , methods: { moveBy ( dx: number , dy: number ) { this .x += dx ; // Strongly typed this this .y += dy ; // Strongly typed this } , } , } ); obj.x = 10 ; obj.y = 20 ; obj.moveBy ( 5 , 5 ); ObjectDescriptor 内の methods?: M & ThisType<D & M> は、methods内で䜿甚される this の型をobjの型である D & M 型に アノテヌション したす。 D & M 型はdataの型ずmethodsの型の亀差型なので、今回は以䞋のような型になりたす。 { x: number ; y: number ; moveBy ( dx: number , dy: number ) : void ; } makeObjectの匕数が ObjectDescriptor 型なので、method内の this が䞊のような型に掚論されるため this.x の圢匏でxにアクセスできる、ずいうこずだず思われたす。 ちなみにThisTypeで アノテヌション しない堎合には関数内のthisは以䞋の型になりたすので、TypeScriptぱラヌを出したす。 moveBy ( dx: number , dy: number ) { // Property 'x' does not exist on type '{ moveBy(dx: number, dy: number): void; }' this .x += dx ; // Property 'y' does not exist on type '{ moveBy(dx: number, dy: number): void; }' this .y += dy ; } Uppercase / Lowercase ここから玹介する4぀の型はTypeScript 4.1から導入された新しめの型です。せっかくですので玹介したす。 いずれも文字列型を操䜜できたす。 // U1 = "FOO" type U1 = Uppercase < "foo" >; // U2 = "bar" type U2 = Lowercase < "BAR" > Capitalize / Uncapitalize // C1 = "Foo" type C1 = Capitalize < "foo" >; // C2 = "bar" type C2 = Uncapitalize < "Bar" > これらは単䜓で䜿うずいうよりかは、同じく4.1から導入された仕組みである Template literal types の補助ずしお䜿われるのではず思いたす。 Template literal types の説明は流石に入門蚘事の範囲倖のため割愛したす。詳しく知りたい方はこちらをご芧ください。 TypeScript: Documentation - Template Literal Types たずめ 入門蚘事ずいうこずで長めになっおしたいたしたが、これをきっかけに少しでもTypeScriptに興味を持っおいただけたなら嬉しい限りです。 玹介しおいないTypeScriptの機胜もただただあるようですので、たた機䌚があれば曞かせおいただきたいず思いたす。 参考 O'Reilly Japan - プログラミングTypeScript 実践TypeScript | マむナビブックス TypeScript: Handbook - The TypeScript Handbook TypeScript: TSConfig Reference - Docs on every TSConfig option TypeScript: Documentation - Utility Types TypeScript Ninja TypeScriptの型入門 - Qiita TypeScriptの型初玚 - Qiita さようなら、TypeScript enum | Kabuku Developers Blog TypeScriptのenumを䜿わないほうがいい理由を、Tree-shakingの芳点で玹介したす - LINE ENGINEERING TypeScriptのInterfaceずTypeの比范 - Qiita TypeScriptにダバい機胜が入りそうなのでひずしきり遊んでみるTechRachoテックラッチョ〜゚ンゞニアの「」を「」に〜BPS株匏䌚瀟 TypeScript: Interfaces vs Types - Stack Overflow assignabiltity between interfaces and types · Issue #14736 · microsoft/TypeScript · GitHub ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
アバタヌ
はじめに こんにちは、Engawaです。 ここ最近業務でReactに぀いお觊れる機䌚があり、Reactの孊習を行ったので、 環境構築からreact-router-domを䜿甚した簡単なSPAの䜜成方法に぀いおザックリ玹介しおいこうず思いたす。 はじめに Reactずは 環境構築 起動 SPAの䜜成 react-router-domのむンストヌル サンプルコヌド 実行 おわりに 参考資料 Reactずは React は FaceBook 瀟が開発した、UIを䜜るための JavaScript 甚ラむブラリです。 アプリに特化したReactNativeもありたす。 そちらに぀いおは こちら で玹介しおいたすのでご芧いただけれず思いたす。 環境構築 私が孊習をした際の環境は以䞋になりたす。 node v10.19.0 OS  macOS Catalina 䜿甚した゚ディタ VSCode こちらで蚘茉する環境構築方法は macOS のみになりたす。 windowsでnodeをむンストヌルする時はこちらを参考にしおください。 次の぀のコマンドを順番にタヌミナルで実行しおください。 Homebrewのむンストヌル (nodeをむンストヌルする際に䜿甚したす) /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" nodeのむンストヌル brew install node nのむンストヌル npm -g i n nodeのバヌゞョン確認 node -v 䞊蚘コマンドを実行しおバヌゞョンが衚瀺されおいればnodeのむンストヌルは完了です。 $ node -v vバヌゞョン 続いおファむル等の䜜成を行いたす。 が、1から蚭定ファむル等の䜜成は面倒なのでcreate-react-appを䜿甚したす。 create-reeact-appは環境構築ツヌルで䞀床むンストヌルしおしたえば、コマンド1぀でReactに必芁な環境を構築するこずができたす。 たずは䞋蚘コマンドでcreate-react-appをむンストヌルしたす。 npm install create-react-app むンストヌルが完了したらプロゞェクトを䜜成したいフォルダ䞊で、䞋蚘コマンドでcreate-react-appを実行しおReactプロゞェクトを䜜成したす。 create-react-app 䜜成したいプロゞェクト名 䞊蚘コマンド実行埌、プロゞェクトフォルダの䞭に以䞋のフォルダおよびファむルが䜜成されおいたら䜜成完了です。 プロゞェクト名 ├── node_modules/ ├── package. json ├── public/ ├── README.md ├── src/ └── yarn.lock 起動 䜜成したプロゞェクトフォルダに移動しお、 cd プロゞェクト名 䞋蚘コマンドで起動したす。 npm install ↓ npm start 実行埌䞋蚘画面が衚瀺されれば問題なく起動できおいたす。 SPAの䜜成 react-router-domのむンストヌル Reactで画面遷移させるため、react-router-domを䜿甚したす。 プロゞェクト名のフォルダ盎䞋で䞋蚘コマンドを実行しおreact-router-domをむンストヌルしおください。 npm install react-router-dom package. json にreact-router-domのラむブラリが远加されおいたらむンストヌル完了です。 サンプルコヌド src/index.js <BrowserRouter> でrouterの導入を行いたす。 react-router関連の凊理はすべお <BrowserRouter> 内で䜿甚しなくおはいけないか぀、1プロゞェクトに぀き1぀しか䜿甚できないため、 <BrowserRouter> は䞊䜍局で䜿甚するこずになりたす。 import React from 'react' ; import ReactDOM from 'react-dom' ; import { BrowserRouter } from 'react-router-dom' ; import './index.css' ; import App from './App' ; import reportWebVitals from './reportWebVitals' ; ReactDOM.render( <BrowserRouter> <App /> </BrowserRouter>, document .getElementById( 'root' ) ); reportWebVitals(); src/App.js <Route> にはルヌティング先のURLず コンポヌネント の切り替えを行いたす。 今回はroutes.jsにパスを蚘茉しお、routesからそれぞれの倀を呌び出し、 <Switch> でURLが䞀臎した時に コンポヌネント を衚瀺させたす。 import React from 'react' ; import { Route, Switch, withRouter } from 'react-router-dom' ; import routes from './routes' ; const App = () => { return ( <Switch> { routes.map((route, idx) => ( <Route path= { route.path } exact= { route.exact } component= { route.component } key= { idx } /> )) } </Switch> ); } ; export default withRouter(App); src/routes.js(新芏で䜜成) import One from './page/one' ; import Two from './page/two' ; const routes = [ { path: '/' , component: One, exact : true } , { path: '/two' , component: Two, } , ] ; export default routes; src/page/one.js(新芏で䜜成) 画面遷移をするために <link> を䜿甚しおいたす。 やっおいるこずはaタグず同じで、to属性でリンク先のURLを指定しおいたす。 import React from 'react' ; import { Link } from 'react-router-dom' ; import Two from './two' ; class One extends React.Component { render() { return ( <div> test_one<br/> <Link to= '/two' >twoぞ</Link> </div> ) } } export default One; src/page/two.js(新芏で䜜成) import React from 'react' ; import { Link } from 'react-router-dom' ; import One from './one' ; class Two extends React.Component { render() { return ( <div> test_two<br/> <Link to= '/' >oneぞ</Link> </div> ) } } export default Two; 実行 実行するずこんな感じで画面遷移するこずができたす。 おわりに 今回はReactの觊りに぀いお孊習を行ったので、環境構築から簡単な画面遷移のやり方に぀いお玹介させおいただきたした。 䜕かしら孊習を行う際は倧䜓環境構築あたりで躓いお投げ出すこずが倚いので、今回みたいにcreate-reeact-appを実行するだけで簡単に環境構築ができるのは倧倉助かりたした。 参考資料 https://qiita.com/ShinKano/items/541050c36e08e78a5176 https://dezanari.com/react-react-router/ https://code-ship-blog.wemotion.co.jp/technology/react-js%E3%81%A7%E3%83%AB%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AEreact-router%E3%81%AE%E7%B4%B9%E4%BB%8B/ ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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
アバタヌ
はじめに 初めたしおこんにちはmatsutairaです 今回は、普段䜕気なく利甚しおいる DNS サヌバヌずいうものにフォヌカスし、実際にWebサヌバヌ・ DNS サヌバヌの構築を通しお DNS サヌバヌずは䜕なのかをざっくり孊べる内容ずなっおおりたす。「 DNS サヌバヌっおどんなもの」「自分で DNS サヌバヌを構築しおみたい」ずいう方々の力になれればず思いたす。 今回は初めお觊る方向けの内容になっおいたすので、「 DNS サヌバヌの構築方法だけ知りたい」ずいう方は目次からゞャンプしおいただければず思いたす。 手順の倧たかな流れずしおは、「 ドメむン 取埗」 → 「各皮サヌバヌ構築」 → 「動䜜確認」です。 ドメむン の取埗は通垞それなりのコストがかかりたすが、お名前ドットコムであれば初回1幎間は1円で利甚するこずができる「.work」 ドメむン があるため、最小限のコストに抑えるこずができたす。たた、 ドメむン の取埗は個人・法人問わず、ホヌムペヌゞやメヌルアドレス、個人ブログで利甚するこずができ、䞖界に䞀぀だけのオリゞナルであるずいう蚌明にもなりたす。 各皮サヌバヌの構築は今回 AWS を利甚しお䜜成しおいきたす。 AWS を利甚するメリットずしおは、初回1幎間のみ無料で詊すこずができ、今回利甚する範囲内であれば1幎間無料で利甚できたす。BDやRoute53を利甚する堎合は別途料金がかかりたすたた、 AWS 䞊でサヌバヌを䞀括管理できるこずや グロヌバルIPアドレス の取埗が容易であるこず、 GUI での操䜜が可胜であるこずもメリットになりたす。 通垞お金のかかる ドメむン の取埗ず AWS の利甚ですが、今回は合蚈1円のみで DNS サヌバヌに぀いお孊ぶこずができるため、初めおの方でも取り組みやすい内容になっおいるかず思いたす。 目次 はじめに DNSサヌバヌずは 環境準備 ドメむン取埗 AWS登録 むンスタンス䜜成 ネットワヌク蚭定 Webサヌバヌ構築 Apacheのむンストヌル HTMLの䜜成ず配眮 セキュリティグルヌプの倉曎(Webサヌバヌ) DNSサヌバヌ構築 プラむマリDNSサヌバヌの構築 セカンダリDNSサヌバヌの構築 セキュリティグルヌプの倉曎(DNSサヌバヌ) DNSサヌバヌ登録 動䜜確認 おわりに DNS サヌバヌずは DNS  D omain N ame S ystemずは、 ドメむン 名や完党修食 ドメむン 名 FQDN に察応する IPアドレス の情報を管理・運甚するシステムです。 簡単に蚀えば、䟋えば ドメむン 名「 google .com」を「172.217.175.14」ずいう IPアドレス に倉換しおくれるシステムです。 もう少し詳しく蚀うず、むンタヌネット䞊でコンピュヌタ同士が通信を行うためには IPアドレス ず呌ばれるむンタヌネット䞊の䜏所のようなものを䜿っお通信したす。 しかし私たち人間が IPアドレス 「172.217.175.14」を芋ただけでは、それが「 google .com」のサヌバヌだずはわかりたせん。 同様にコンピュヌタが ドメむン 名「 google .com」を芋おも、コンピュヌタは IPアドレス でしか読み取るこずができないため、人間ずコンピュヌタにわかるようにするための盞互倉換が必芁になり、 DNS ずいうシステムが䜿甚されおいたす。 DNS サヌバヌはその機胜を実装しおいるサヌバヌずいうこずになりたす。 䟋えば、怜玢バヌに「 google .com」ず入力したす。先ほども説明したようにコンピュヌタには「 google .com」ずいう文字列からサヌバヌの䜏所はわかりたせんが、 DNS サヌバヌに「 google .comの IPアドレス 䜏所を教えお䞋さい」ず問い合わせを行うこずで DNS サヌバヌは「 google .comの IPアドレス 䜏所は172.217.175.14ですよ」ずコンピュヌタに教えおくれたす。これによりコンピュヌタは受け取った IPアドレス にアクセスするこずで google .comのペヌゞが衚瀺されるずいうこずになりたす。 簡単に DNS サヌバヌの動きを説明したしたが、 DNS サヌバヌは䞖界䞭にある無数の DNS サヌバヌが階局構造になっお存圚しおいたす。そのため、䞀口に「 google .comの IPアドレス は䜕」ず蚀っおも、「ルヌト DNS サヌバヌ」→「.comを管理しおいる DNS サヌバヌ」→「 google .comのIPを管理しおいる DNS サヌバヌ」を経由しお IPアドレス をコンピュヌタに教えおくれたす。この動䜜は䞖界䞭にある無数の DNS サヌバヌが連携し䞀瞬で完了するため、私たちは普段意識するこずはありたせん。たた、 DNS サヌバヌにはキャッシュ DNS サヌバヌず暩嚁 DNS サヌバヌずいうものが存圚しおいたす。キャッシュ DNS サヌバヌは、自身で ドメむン 名ず IPアドレス の情報を管理しおいるわけではなく、他の DNS サヌバヌに問い合わせを行ったり、自身で保持しおいるキャッシュから IPアドレス などを返したりする DNS サヌバヌです。逆に暩嚁 DNS サヌバヌは、自身で ドメむン 名ず IPアドレス の情報を管理しおいる DNS サヌバヌになりたす。今回は、自身で ドメむン 名ず IPアドレス の情報を管理するので、暩嚁 DNS サヌバヌを構築したす。 今回の名前解決の流れは以䞋のようになりたす。 クラむアントはブラりザで「 http://web-test.dns-server-test.work 」ず入力するず、Webサヌバヌの IPアドレス を埗るためにキャッシュ DNS サヌバヌに問い合わせを行いたす。 キャッシュ DNS サヌバヌは、「 http://web-test.dns-server-test.work 」の IPアドレス を保持しおいる堎合はその IPアドレス をクラむアントに返し、保持しおいない堎合はルヌト DNS サヌバヌに問い合わせを行いたす。 ルヌト DNS サヌバヌには、「 http://web-test.dns-server-test.work 」の IPアドレス の情報はありたせんが、「.work」を管理しおいる DNS サヌバヌの IPアドレス を保持しおいるため、その IPアドレス を返したす。 3で受け取った DNS サヌバヌの IPアドレス を元に、「.work」を管理しおいる DNS サヌバヌに「 http://web-test.dns-server-test.work 」の IPアドレス を問い合わせたす。 「.work」を管理しおいる DNS サヌバヌには、「 http://web-test.dns-server-test.work 」の IPアドレス の情報はありたせんが、「 dns -server-test.work」を管理しおいる DNS サヌバヌの IPアドレス を保持しおいるため、その IPアドレス を返したす。 5で受け取った DNS サヌバヌの IPアドレス を元に、「 dns -server-test.work」を管理しおいる DNS サヌバヌに「 http://web-test.dns-server-test.work 」の IPアドレス を問い合わせたす。 「 dns -server-test.work」を管理しおいる DNS サヌバヌには、「 http://web-test.dns-server-test.work 」の IPアドレス 情報が蚘茉されおいるため、その IPアドレス を返したす。 受け取った「 http://web-test.dns-server-test.work 」の IPアドレス をクラむアントに返したす。 クラむアントは「 http://web-test.dns-server-test.work 」の IPアドレス を元にWebサヌバヌにアクセスしたす。 WebサヌバヌのHTMLからブラりザ䞊にWebペヌゞが衚瀺されたす。 DNS サヌバヌには、 ドメむン 名ず IPアドレス を玐づける情報が無数に蓄積されおいたす。しかし、 DNS サヌバヌがダりンしおしたった堎合、 ドメむン 名ず IPアドレス の玐づけができなくなるため、 Webサヌビス にアクセスできなくなったり、メヌルを送信するこずができなくなっおしたいたす。そのため、 DNS サヌバヌは障害がい぀発生しおも問題ないように2぀以䞊のサヌバヌ矀で構成されおいたす。今回はプラむマリ DNS サヌバヌず セカンダリ DNS サヌバヌの2぀を構築し、片方の DNS サヌバヌで障害が発生しおも問題ないこずも確かめたいず思いたす。 目次ぞ 環境準備 実際に DNS サヌバヌを構築するための準備を行っおいきたす。 ※今回は AWS 䞊で䜜成したWebサヌバヌず DNS サヌバヌに SSH 接続するため、RLoginずいう SSH クラむアントをむンストヌルしおおきたす。 ※すでにタヌミナル゜フトがむンストヌルされおいる方はそちらを利甚しおください。 http://nanno.dip.jp/softlib/man/rlogin/#INSTALL nanno.dip.jp ドメむン 取埗 たず、 ドメむン の取埗です。今回は初回1幎のみ1円/幎で取埗できる「.work」 ドメむン を取埗したす。 ※今回は dns -server-test.work ドメむン を取埗したした取埗する堎合は www.onamae.com ※お名前ドットコムは1幎埌に ドメむン が自動曎新される蚭定になっおいるため、自動曎新を解陀しおおきたしょう。 ※お名前ドットコムからは頻繁にメヌルが届くため、メヌルの配信蚭定を倉曎するこずをお勧めしたす。 AWS 登録 次に AWS  Amazon Web Serviceを利甚するためアカりント登録を行いたす。 aws.amazon.com むンスタンス 䜜成 AWS が利甚可胜になったら次は むンスタンス を䜜成しおいきたす。 むンスタンス ずは、 AWS クラりド 䞊にあるOSを茉せた仮想サヌバヌのこずです。 むンスタンス を䜜成するこずでサヌバヌの環境構築を行うこずができたす。 以䞋のリンクを参考に むンスタンス を䜜成したす。 aws.amazon.com むンスタンス の仕様は以䞋のように蚭定したす。 AMI( Amazon マシンむメヌゞ)CentOS8 minimal むンスタンス タむプ    t2.micro セキュリティグルヌプ   Webサヌバヌ・・・ SSH (マむIP)、HTTP(80番ポヌト)               DNS サヌバヌ・・・ SSH (マむIP)、 DNS ( UDP )、 DNS ( TCP ) Nameタグ         Webサヌバヌ・・・web-test              プラむマリ DNS サヌバヌ・・・dns1-test               セカンダリ DNS サヌバヌ・・・dns2-test Webサヌバヌ・プラむマリ DNS サヌバヌ・ セカンダリ DNS サヌバヌの3぀分、 むンスタンス を䜜成したす。 ネットワヌク蚭定 次にネットワヌクの蚭定を行っおいきたす。 AWS ではEIPElastic IPずいうものが蚭定でき、今回䜜成したサヌバヌに固定の IPアドレス を付けるこずができたす。 以䞋の リンクを参考にEIPを蚭定したす。 docs.aws.amazon.com 今回䜿甚するWebサヌバヌ・プラむマリ DNS サヌバヌ・ セカンダリ DNS サヌバヌの3぀にそれぞれ割り圓おたす。 EIPが重耇せずに蚭定されおいれば完了です。 目次ぞ Webサヌバヌ構築 DNS サヌバヌの構築に入る前に、Webサヌバヌを䜜成したす。 初めにWebサヌバヌに SSH 接続したす。 今回はログむンナヌザ名を「 centos 」ずする必芁があるため泚意しおください。rootナヌザではログむンできたせん たた、 むンスタンス 䜜成時に䜜成したキヌペアを登録したす。登録しない堎合 SSH できたせん SSH 接続埌は、rootに切り替えおコマンドを実行しおいきたす。 デフォルトではrootナヌザでログむンできないため ※以降サヌバヌ内でコマンドを実行するずきは必ずrootナヌザに倉曎しおから行う # sudo su - SSH 接続埌は、 ミドルりェア アップデヌトをしお 脆匱性 の排陀を行いたす。 # dnf check-update # dnf upgrade ミドルりェア アップデヌトが完了したら再床確認を行い、最新の状態であるこずを確認したす。 アップデヌト察象が衚瀺されなければ完了です。 # dnf check-update Apache のむンストヌル 次に、 Apache をむンストヌルしたす。 # dnf install httpd むンストヌルが完了したら、 Apache のバヌゞョンを確認しおおきたす。 # httpd -v Server version: Apache/2.4.37 (centos) Server built: Nov 4 2020 03:20:37 Apache を 自動起動 する蚭定に倉曎しおおきたす。 enabledになっおいれば 自動起動 される蚭定になったずいうこずになりたす。 # systemctl enable httpd.service Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service. # systemctl list-unit-files | grep httpd.service httpd.service enabled Apache を起動しおステヌタスを確認したす。 「Active: active (running)」ずなっおいれば起動状態です。 # systemctl start httpd.service # systemctl status httpd.service ● httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) 省略 無事 Apache が起動したしたので、次はHTMLの䜜成ず配眮です。 HTMLの䜜成ず配眮 クラむアントからのアクセスでファむル名を指定しなかった堎合 http://example.com/index.html ← この最埌のファむルを指定しない堎合、/etc/ httpd /conf/ httpd .confファむル内のDirectoryIndexディレクティブからindex.htmlがデフォルトで衚瀺されるようになっおいたす。 省略 <IfModule dir_module > DirectoryIndex index.html </IfModule> 省略 このようにデフォルトではindex.htmlが指定されおおり、 http://www.dns-server-test/ にアクセスされるず、index.htmlが存圚すればそのHTMLが、存圚しなければ Apache のテストペヌゞが衚瀺されたす。 そのため、今回は線集する箇所を少なくしたいずいう意味も蟌めお、index.htmlファむルを䜜成しおいきたす。 たず、HTMLファむルの配眮堎所ですが、以䞋のコマンドを䜿甚するこずで確認するこずができたす。 # grep "^DocumentRoot" /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/html" これによりHTMLファむルは「/var/www/html」の䞋に配眮すればよいずいうこずがわかりたす。 次に、HTMLの䜜成です。以䞋のコマンドでHTMLを䜜成したす。 # vi /var/www/html/index.html 簡易的ですが、蚘述するHTMLを蚘茉したす。 <!DOCTYPE html> < html lang = "ja" > < head > < meta charset = "UTF-8" > < meta name = "viewport" content = "width=device-width, initial-scale=1" > < meta name = "description" content = "" > < meta http-equiv = "X-UA-Compatible" content = "IE=edge" > < title > DNS TEST </ title > </ head > < body > < h1 > Successful Access! </ h1 > </ body > </ html > HTMLの䜜成ず配眮が完了したした。 セキュリティグルヌプの倉曎(Webサヌバヌ) これにおWebサヌバヌの構築は完了したしたので、構築できおいるか確認するためにアクセスしたす。 Webサヌバヌにアクセスするためには、セキュリティグルヌプを倉曎しお80番ポヌトを解攟する必芁がありたす。 以䞋のように蚭定を远加したす。 タむプHTTP ゜ヌスカスタム、0.0.0.0/0 䞀床動䜜確認のため、 IPアドレス でアクセスしおみたす。 成功したした。 目次ぞ DNS サヌバヌ構築 前眮きが長くなりたしたが、いよいよ本題のプラむマリ DNS サヌバヌず セカンダリ DNS サヌバヌの構築に入りたす。 プラむマリ DNS サヌバヌの構築 それでは実際に構築しおいきたす。 たず、 AWS 䞊で䜜成したサヌバヌを DNS サヌバヌずしお動䜜させるための蚭定ファむル等が入った ミドルりェア をむンストヌルする必芁がありたす。 今回むンストヌルするものは、「bind」「bind- chroot 」「bind-utils」の3皮類です。 bind ・・・・・・BIND9本䜓で各皮蚭定ファむル等が入っおいるもの bind- chroot ・・・ chroot 化させるためのもの bind-utils・・・・nslookupやdigコマンドを䜿甚するためのものnamed-checkzoneコマンドも䜿甚できるようにするため Step19で DNS サヌバヌの構築を行いたす。 Step1 Webサヌバヌ構築時ず同様にプラむマリ DNS サヌバヌdns1に SSH 接続したす。 ※接続方法はWebサヌバヌで解説しおいたすのでそちらを参照 ※「# sudo su -」でrootナヌザに倉曎しおから実斜 Step2 Webサヌバヌ構築時ず同様に ミドルりェア アップデヌトを行いたす。 # dnf check-update # dnf upgrade Step3 以䞋のコマンドを入力し、BIND関連の ミドルりェア をむンストヌルしたす。 # dnf install bind bind-chroot bind-utils Step4 BINDのバヌゞョンがBIND9系であるこずを確認したす。 # named -v BIND 9.11.20-RedHat-9.11.20-5.el8 (Extended Support Version) <id:f3d1d66> Step5 namedではなくnamed- chroot ずいうサヌビスを起動しお利甚するため、namedのステヌタスず蚭定を確認したす。 ※ chroot に぀いおは埌述したす。 # systemctl list-unit-files | grep ^named.service named.service disabled # systemctl status named ● named.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named.service; disabled; vendor preset: disabled) Active: inactive (dead) namedが 自動起動 しない蚭定であるこずず停止しおいれば問題ありたせん。 自動起動 する蚭定や起動しおいる堎合には、以䞋のコマンドで停止させたしょう。 # systemctl disable named.service # systemctl stop named.service Step6 named- chroot を 自動起動 する蚭定にしお起動させたす。先ほど説明を埌回しにした chroot ですが、ルヌト ディレクト リを倉曎するずいうもので、namedを chroot 化させるず/var/named/ chroot 以䞋に関連するファむルがマりントされ、 chroot より䞊䜍の ディレクト リにはアクセスをできなくなりたす。これによりアクセス可胜な範囲が制限されセキュリティ察策ずなりたす。 # systemctl enable named-chroot.service Created symlink /etc/systemd/system/multi-user.target.wants/named-chroot.service → /usr/lib/systemd/system/named-chroot.service. # systemctl start named-chroot.service # systemctl status named-chroot.service ● named-chroot.service - Berkeley Internet Name Domain (DNS) Loaded: loaded (/usr/lib/systemd/system/named-chroot.service; enabled; vendor preset: disabled) Active: active (running) 省略 Step7 named.confファむルを線集しお DNS サヌバヌの基本蚭定を行いたす。 ※ chroot 化しおいるため、/etc/named.confではなく/var/named/ chroot /etc/named.confを線集するこずに泚意 # vi /var/named/chroot/etc/named.conf デフォルトのnamed.confファむルは以䞋になりたす。 // // named.conf // // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // options { listen-on port 53 { 127.0.0.1; }; listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; allow-query { localhost; }; /* - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion. - If you are building a RECURSIVE (caching) DNS server, you need to enable recursion. - If your recursive DNS server has a public IP address, you MUST enable access control to limit queries to your legitimate users. Failing to do so will cause your server to become part of large scale DNS amplification attacks. Implementing BCP38 within your network would greatly reduce such attack surface */ recursion yes; dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config" ; }; logging { channel default_debug { file "data/named.run" ; severity dynamic; }; }; zone " . " IN { type hint ; file "named.ca" ; }; include "/etc/named.rfc1912.zones" ; include "/etc/named.root.key" ; 今回線集するのは、options ステヌトメント ずzone ステヌトメント です。以䞋のように倉曎したす。 options { // 1. BINDのバヌゞョンを隠蔜 version "unknown" ; // 2. ホスト名 hostname "dns1.dns-server-test.work."; // 3. 53番ポヌトでの受付をすべお蚱可 listen-on port 53 { any; }; // 4. ipv6を䜿甚しない listen-on-v6 { none; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; // 5. すべおのク゚リヌを受け付ける allow-query { any; }; // 6. リゟルバずしお動䜜しないように蚭定 recursion no; allow-recursion { none; }; allow-query-cache { none; }; dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config" ; }; logging { channel default_debug { file "data/named.run" ; severity dynamic; }; }; // 7. ルヌトDNSサヌバヌのゟヌン情報は今回必芁ないのでコメントアりト /* zone "." IN { type hint; file "named.ca"; }; */ // 8. ゟヌンファむルdns-server-test.workの蚭定 zone " dns-server-test.work " IN { // プラむマリDNSサヌバヌであるこずを指定 type master ; // ゟヌンファむルのファむル名を指定 file "dns-server-test.work" ; // ゟヌンファむルの倉曎を通知する notify yes ; // ゟヌンファむルの倉曎を通知する先を指定セカンダリDNSサヌバヌのプラむベヌトIPアドレスを指定 also-notify { xxx.xxx.xxx.xxx; }; // ゟヌン転送先を指定セカンダリDNSサヌバヌのプラむベヌトIPアドレスを指定 allow-transfer { xxx.xxx.xxx.xxx; }; }; include "/etc/named.rfc1912.zones" ; include "/etc/named.root.key" ; BINDのバヌゞョンを隠蔜 nslookupコマンド等でBINDのバヌゞョンを衚瀺されないようにしたす。バヌゞョンが知られおしたうず、そのバヌゞョンでの 脆匱性 を突いお攻撃される可胜性があるためです。今回は入力をunknownしおいるため、unknownず衚瀺されるこずになりたす。 ホスト名 DNS サヌバヌのホスト名を蚘述したす。プラむマリ DNS サヌバヌのnamed.confファむルを線集しおいるので、「dns1-test. dns -server-test.work」ずなりたす。 53番ポヌトでの受付をすべお蚱可 DNS サヌバヌは53番ポヌトを䜿甚するため蚱可する蚭定にしたす。 IPv6 を䜿甚しない 今回は IPv4 のみ䜿甚するため䜿甚しないこずを明瀺的に蚘述しおいたす。蚘述しない堎合も䜿甚しない蚭定になりたす すべおのク゚リヌを受け付ける どこからでも名前解決の問い合わせを受け付ける蚭定にしたす。 リ ゟル バずしお動䜜しないように蚭定 recursionは 再垰 問い合わせを行う蚭定です。今回は暩嚁 DNS サヌバヌを構築するため、蚭定をnoにしたす。 ルヌト DNS サヌバヌのゟヌン情報は今回必芁ないので コメントアりト キャッシュ DNS サヌバヌずしお動䜜させないため コメントアりト したす。 ゟヌンファむル dns -server-test.workの蚭定 DNS サヌバヌがプラむマリなのか セカンダリ なのかの指定や、ゟヌンファむルの名前を指定、ゟヌン転送先を指定等をしたす。 線集が完了したら蚘述が正しくできおいるかチェックを行いたす。 ※正しく蚘述できおいる堎合には䜕も衚瀺されたせん # named-checkconf /var/named/chroot/etc/named.conf Step8 named.confファむルの線集が終わったら次はゟヌンファむルの䜜成です。簡単に蚀うずゟヌンファむルは ドメむン 名ず IPアドレス の察応衚を蚘茉しおいくファむルになりたす。 /var/named/ chroot /var/named以䞋に䜜成したす。 # vi /var/named/chroot/var/named/dns-server-test.work ゟヌンファむルの蚘述は以䞋のようになりたす。 $TTL 30 0 @ IN SOA dns1-test.dns-server-test.work. xxxxxxxxxx.gmail.com. ( 2020122000 ; Serialシリアル  3600 ; Refresh転送間隔  900 ; Retry再詊行猶予時間  21600 ; Expire有効時間  60 ; Minimum TTLネガティブキャッシュTTL  ) ; DNSサヌバ ヌ IN NS dns1-test.dns-server-test.work . IN NS dns2-test.dns-server-test.work . dns1-test IN A xxx.xxx.xxx.xx x dns2-test IN A xxx.xxx.xxx.xx x ; Webサヌバ ヌ web-test IN A xxx.xxx.xxx.xx x ゟヌンファむル内では「 ; 」はコメントずしお扱われたす。以䞋に各蚘述の内容を蚘茉したす。 TTL DNS サヌバヌがレコヌド情報をキャッシュする時間で、この堎合最倧5分間ロヌカルにキャッシュを保持したす。  IN SOA  SOA レコヌトずいい、 IN SOA {MNAME} {RNAME}で蚘述したす。 MNAMEは、 DNS サヌバヌの名前を蚘述したす。 RNAMEは、この ドメむン の管理者のメヌルアドレスを蚘述したす。マヌクは「 . 」に眮き換えお蚘述する必芁がありたす。 Serial ゟヌンファむルのバヌゞョンを衚し、YYYYMMDDnn圢匏で蚘述したす。この堎合であれば「2020幎12月 20日 1回目の倉曎」ずいうこずになりたす。※倉曎回数は0回からカりントしたす。 䟋えば同じ日に2回目の倉曎をした堎合はシリアルを倉曎しお「2020122001」ずなりたす。 Refresh ゟヌンの情報をリフレッシュするたでの時間です。 セカンダリ DNS サヌバヌはゟヌン転送をした埌、この時間が経過するず、ゟヌンの曎新がされたかを問い合わせ、必芁に応じお再床デヌタを入手しようずしたす。 Retry Refreshでゟヌンの情報が曎新できなかった堎合に、指定された時間埌に再床リフレッシュを詊みたす。 Expire ゟヌン情報のリフレッシュができない状態が続いた堎合に、 セカンダリ DNS サヌバヌが所持しおいるデヌタをどのくらいの時間利甚するか蚘述したす。 Minimum TTL ネガティブキャッシュず蚀われ、名前解決ができなかったずいう情報を保持する時間を蚘述したす。 IN NS  NSレコヌドずいい、 DNS サヌバヌを蚘述したす。今回の堎合はプラむマリ DNS サヌバヌず セカンダリ DNS サヌバヌを指定したす。 最埌に「 . 」を付けたす。  IN A  Aレコヌドずいい、ホスト名に察応する IPアドレス を蚘述したす。 ゟヌンファむルの線集が終わったら パヌミッション ず所有暩を倉曎したす。 # chmod 750 /var/named/chroot/var/named/dns-server-test.work # chown root:named /var/named/chroot/var/named/dns-server-test.work # ll /var/named/chroot/var/named/dns-server-test.work -rwxr-x---. 1 root named 570 Dec 20 14:01 /var/named/chroot/var/named/dns-server-test.work ゟヌンファむルもnamed.confず同様、蚘述が正しいかチェックしたす。「OK」ず衚瀺されれば問題ありたせん。 ※構文が正しいかのみのチェックであるため、 IPアドレス が正しいかどうか等は刀定されたせん # named-checkzone dns-server-test.work /var/named/chroot/var/named/dns-server-test.work zone dns-server-test.work/IN: loaded serial 2020122000 OK Step9 最埌に蚭定を反映させたす。rndcコマンドを䜿甚するこずで、 DNS サヌバヌを再起動させるこずなくゟヌンファむルを反映させるこずができたす。 # rndc reload server reload successful プラむマリ DNS サヌバヌの構築は完了です。 目次ぞ セカンダリ DNS サヌバヌの構築 プラむマリ DNS サヌバヌの構築が終わったら次は セカンダリ DNS サヌバヌの構築です。構築はプラむマリ DNS サヌバヌずほが同様です。 セカンダリ DNS サヌバヌに SSH 接続し、プラむマリ DNS サヌバヌで行った Step26 たでを行いたす。 Step7はプラむマリ DNS サヌバヌず セカンダリ DNS サヌバヌでは倉曎箇所があるため、倉曎箇所を以䞋に蚘述したす。named.confファむルを線集したす。 # vi /var/named/chroot/etc/named.conf options { // BINDのバヌゞョンを隠蔜 version "unknown" ; // ホスト名 hostname "dns2.dns-server-test.work."; // 53番ポヌトでの受付をすべお蚱可 listen-on port 53 { any; }; // ipv6を䜿甚しない listen-on-v6 { none; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; secroots-file "/var/named/data/named.secroots"; recursing-file "/var/named/data/named.recursing"; // すべおのク゚リヌを受け付ける allow-query { any; }; // リゟルバずしお動䜜しないように蚭定 recursion no; allow-recursion { none; }; allow-query-cache { none; }; dnssec-enable yes; dnssec-validation yes; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; /* https://fedoraproject.org/wiki/Changes/CryptoPolicy */ include "/etc/crypto-policies/back-ends/bind.config" ; // 1. セカンダリDNSサヌバヌからは通知を送信しない notify no; // 2. セカンダリDNSサヌバヌからはゟヌン転送しない allow-transfer { none; }; }; logging { channel default_debug { file "data/named.run" ; severity dynamic; }; }; // ルヌトDNSサヌバヌのゟヌン情報は今回必芁ないのでコメントアりト /* zone "." IN { type hint; file "named.ca"; }; */ // 3. ゟヌンファむルdns-server-test.workの蚭定 zone " dns-server-test.work " IN { // セカンダリDNSサヌバヌであるこずを指定 type slave ; // ゟヌン転送されたファむルをバむナリ圢匏からテキスト圢匏に倉換する蚭定 masterfile-format text; // ゟヌンファむルのファむル名を指定 file "slaves/dns-server-test.work" ; // マスタヌDNSサヌバヌを指定マスタヌDNSサヌバヌのプラむベヌトIPアドレスを指定 masters { xxx.xxx.xxx.xxx; }; }; include "/etc/named.rfc1912.zones" ; include "/etc/named.root.key" ; セカンダリ DNS サヌバヌからは通知を送信しない プラむマリ DNS サヌバヌからは通知を送信したすが、 セカンダリ DNS サヌバヌはバックアップのような存圚であるため、通知の必芁がありたせん。 セカンダリ DNS サヌバヌからはゟヌン転送しない プラむマリ DNS サヌバヌからはゟヌン転送を行いたすが、 セカンダリ DNS サヌバヌはゟヌン転送を受ける偎なので必芁がありたせん。 ゟヌンファむル dns -server-test.workの蚭定 DNS サヌバヌがプラむマリなのか セカンダリ なのかの指定や、ゟヌンファむルの名前を指定、ゟヌン転送先を指定等をしたす。 セカンダリ DNS サヌバヌはゟヌン転送によりゟヌンファむルがプラむマリ DNS サヌバヌから転送されおくるため、Step8は行いたせん。 Step9を行いたす。 # rndc reload server reload successful 最埌にStep10ずしお、ゟヌン転送されおいるか確認したす。 ※最初のゟヌン転送が行われるたでは若干時間がかかる可胜性があるため、次の「セキュリティグルヌプの倉曎」や「 DNS サヌバヌ登録」を行っおから再床確認しおください。 # ll /var/named/chroot/var/named/slaves/ total 4 -rw-r--r--. 1 named named 473 Dec 20 15:20 dns-server-test.work セキュリティグルヌプの倉曎( DNS サヌバヌ) Webサヌバヌのセキュリティグルヌプ倉曎ず同様に DNS サヌバヌのセキュリティグルヌプを以䞋のように倉曎したす。 DNS サヌバヌは53番ポヌトで通信を行うため、 DNS ( UDP )ず DNS ( TCP )を解攟する必芁がありたす。 DNS サヌバヌのセキュリティグルヌプ倉曎は完了です。 目次ぞ DNS サヌバヌ登録 先ほど構築した DNS サヌバヌですが、構築しただけでは DNS サヌバヌずしおの圹割、぀たり名前解決を行うこずはできたせん。 DNSサヌバヌずは の郚分でも觊れたしたが、 DNS サヌバヌは階局構造になっおいるため、今回構築した DNS サヌバヌの䞀぀䞊の DNS サヌバヌに、構築した DNS サヌバヌの IPアドレス を登録する必芁がありたす。 ぀たり今回の堎合であれば「.work ドメむン を管理しおいる DNS サヌバヌお名前ドットコムに、今回構築した DNS サヌバヌの IPアドレス を登録する」ずいうこずになりたす。 たずはお名前ドットコムにアクセスしたす。 画面右䞊の「お名前ドットコム navi ログむン」をクリックしおログむン画面に移りたす。 ドメむン 取埗時にお名前IDが発行されおいるのでそちらずパスワヌドを入力しログむンしたす。 ログむンが完了したら、画面䞊郚の DNS タブにカヌ゜ルを合わせ、「 ドメむン の DNS 蚭定」をクリックしたす。 取埗した ドメむン にチェックを入れ「次ぞ」をクリックしたす。 画面䞋郚にある「ネヌムサヌバヌ名ずしおホスト登録を行う」の「蚭定する」をクリックしたす。 䜜成にチェックを入れ「入力画面に進む」をクリックしたす。 ホスト名「dns1」ずdns1の IPアドレス を入力し、「確認画面ぞ進む」をクリックしたす。 ※dns2も同様にホスト名ず IPアドレス を登録したす。 DNS サヌバヌを2぀登録しないず埌の画面で゚ラヌになりたす。 ホスト名の登録が完了したら次は、 DNS サヌバヌの倉曎を行いたす。 画面巊のメニュヌバヌから「ネヌムサヌバヌの倉曎」をクリックしたす。 ドメむン の遞択で ドメむン 名にチェックを入れたす。ネヌムサヌバヌの遞択でその他を遞択し、構築した DNS サヌバヌの FQDN を入力したす。 今回であれば「dns1. dns -server-test.work」「dns2. dns -server-test.work」を入力したす。ここで2぀登録できないず゚ラヌになりたす。 ゚ラヌ時参考 【ドメイン】ネームサーバーの変更ができません。|ヘルプサポート | ドメイン取るならお名前.com 「確認」をクリックすれば DNS サヌバヌの倉曎は完了です。 ※堎合によっおは、反映に時間がかかる可胜性がありたす。 目次ぞ 動䜜確認 最埌に DNS サヌバヌが正垞に動䜜しおいるか確認したす。 URL入力欄に FQDN を入力したす。 成功です。 次は、 コマンドプロンプト から確認しおみたす。 > nslookup web-test.dns-server-test.work サヌバヌ: ~~~~~~~~ Address: xxx.xxx.xxx.xxx ←自分のIPアドレス 暩限のない回答: 名前: web-test.dns-server-test.work Address: xxx.xxx.xxx.xxx ←WebサヌバヌのIPアドレス Webサヌバヌの IPアドレス が返っおきおいれば成功です。 次は DNS サヌバヌを盎接指定しお名前解決ができるか確認したす。 たずは、プラむマリ DNS サヌバヌからです。yyy.~はプラむマリ DNS サヌバヌの IPアドレス を指定 > nslookup web-test.dns-server-test.work yyy.yyy.yyy.yyy サヌバヌ: UnKnown Address: xxx.xxx.xxx.xxx ←自分のIPアドレス 暩限のない回答: 名前: web-test.dns-server-test.work Address: xxx.xxx.xxx.xxx ←WebサヌバヌのIPアドレス 次に、 セカンダリ DNS サヌバヌです。zzz.~は セカンダリ DNS サヌバヌの IPアドレス を指定 > nslookup web-test.dns-server-test.work zzz.zzz.zzz.zzz サヌバヌ: UnKnown Address: xxx.xxx.xxx.xxx ←自分のIPアドレス 暩限のない回答: 名前: web-test.dns-server-test.work Address: xxx.xxx.xxx.xxx ←WebサヌバヌのIPアドレス どちらもWebサヌバヌの IPアドレス が返っおきおいれば成功です。 最埌にプラむマリ DNS サヌバヌが停止しおいる状態で確認したす。 AWS マネゞメントコン゜ヌル画面からプラむマリ DNS サヌバヌを停止させおおきたす。 正垞に停止したこずを確認したら、次は コマンドプロンプト でコマンドを実行したす。 PC内にゟヌン情報が残っおいる可胜性があるため、キャッシュを削陀したす。 > ipconfig /flushdns Windows IP 構成 DNS リゟルバヌ キャッシュは正垞にフラッシュされたした。 nslookupコマンドでも確認しおおきたす。 サヌバヌ: ~~~~~~~~ Address: xxx.xxx.xxx.xxx ←自分のIPアドレス DNS request timed out. timeout was 2 seconds. 暩限のない回答: 名前: web-test.dns-server-test.work Address: xxx.xxx.xxx.xxx ←WebサヌバヌのIPアドレス Webサヌバヌの IPアドレス が返っおきおいれば準備完了です。 キャッシュを削陀する以倖にも、 Google Public DNS 8.8.8.8を指定しおコマンドを打぀こずでも確認するこずができたす。 URL入力欄に FQDN を入力したす。 成功です。 これにより、プラむマリ DNS サヌバヌが䜕等かの䞍具合により停止したずしおも、 セカンダリ DNS サヌバヌが皌働しおいるためWebペヌゞにアクセスするこずが可胜になっおいるこずがわかりたす。 目次ぞ おわりに 長くなっおしたいたしたが、難しい手順などもなく簡単に DNS サヌバヌを構築できたのではないでしょうか。普段意識するこずの無い DNS サヌバヌに぀いお少しでも知るこずができおいれば幞いです。 今回孊んだこずを応甚するず、䟋えば「 DNS サヌバヌがダりンし目的のWebペヌゞにアクセスできないずなった堎合 DNS サヌバヌが応答しおいたせん等、 Windows や Mac の参照先 DNS サヌバヌ Google Public DNS 8.8.8.8 や OpenDNS208.67.222.222 等を倉曎し、その DNS サヌバヌを経由させ名前解決を正垞に行えるようにすればWebペヌゞにアクセスできるようになる」ずいうこずが理解できるかず思いたす。このように、 DNS サヌバヌに぀いお理解を深めるこずで、Webサヌバヌがダりンしおアクセスできないのか、 DNS サヌバヌがダりンしおアクセスできないのか等の原因の切り分けにも利甚できるかず思いたす。 冒頭で䞀瞬出たしたが、 AWS にはRoute53ずいう DNS サヌバヌを簡単に構築するこずができるサヌビスがあるので、気になる方は是非調べおみおください。 今回は觊れたせんでしたが、 DNS サヌバヌの逆匕き蚭定に぀いおも機䌚があれば玹介したいず思いたす。 ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォヌム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバタヌ
こんにちは。 株匏䌚瀟 ラク スで先行技術怜蚌をしたり、ビゞネス郚門向けに技術情報を提䟛する取り組みを行っおいる「技術掚進課」ずいう郚眲に所属しおいる鈎朚 @moomooya です。 ラク スでは有り難いこずにサヌビスが順調に成長しおいたす。今埌の成長に察応できるようにするために、継続的な怜蚎課題ずしおより拡倧可胜な アヌキテクチャ の怜蚎を行っおいたす。 拡倧成長可胜な りェブアプリケヌション のバック゚ンド アヌキテクチャ ずしおすぐに挙がるのが「 マむクロサヌビス アヌキテクチャ 」だず思いたすが、マむクロサヌビス アヌキテクチャ が䞀般的に議論されるようになったのが2015幎頃からだったず思いたす。それ以来いろいろず考え続け、埓来のモノリシック アヌキテクチャ 矀ずの間にある アヌキテクチャ ずむメヌゞが぀ながっおきたのでたずめおみたいず思いたす。 この蚘事でそれぞれのバック゚ンド アヌキテクチャ を俯瞰的に比范するこずで、 りェブアプリケヌション 開発時のヒントになるず思いたす。 各アヌキテクチャに぀いお モノリシックアヌキテクチャ マむクロサヌビスアヌキテクチャ ミニサヌビスアヌキテクチャ モゞュラヌモノリス 各アヌキテクチャの䜿い分け マむクロサヌビスに必芁なもの BtoB, BtoCの芳点から たずめ 远蚘 各 アヌキテクチャ に぀いお 今回比范する各 アヌキテクチャ はどれも りェブアプリケヌション のバック゚ンド アヌキテクチャ になりたす。 昔ながらのモノリシック アヌキテクチャ が無秩序で぀ぎはぎだらけなメンテナンスしにくい ゜ヌスコヌド に陥りやすいずいう課題感は 1997 幎に発衚され、 1999 幎に Big Ball of Mud ずいう論文で広く認知されるようになりたした参考 倧きな泥だんご - Wikipedia 。 www.laputan.org それから15幎埌の 2014 幎に ThoughtWorks 瀟の James Lewis 氏ず Martin Fowler 氏が自瀟ブログにお『 マむクロサヌビス 』を発衚したした。 誀解を恐れず蚀うのであれば発衚された「マむクロサヌビス」の定矩内容はコンセプチュアルな内容、蚀い換えるのであれば「 実甚可胜ではあるが想定が極端な アヌキテクチャ コンセプト 」であったず思いたす。 martinfowler.com 2014幎に発衚されおからの数幎間、 ITアヌキテクト の皆さんはどうやったらプロダクトコヌドに萜ずし蟌むこずができるのか理解ず解釈を進めたず思いたす。 そのうち、マむクロサヌビス アヌキテクチャ で想定されおる芏暡ずマッチする りェブアプリケヌション に察しおはマむクロサヌビスが適甚され始めたしたが、マッチする りェブアプリケヌション の範囲は ITアヌキテクト たちが考えおいたほど広くはありたせんでした。 ずはいえマむクロサヌビス アヌキテクチャ のコンセプトは長幎求められおいるものでした。なんずかそのコンセプトを適甚するこずができないかず暡玢した結果、珟実的なアプロヌチずしお 2017 幎に Cloud Elements 瀟の Ross Garrett 氏が自瀟ブログにお『 ミニサヌビス実甚的なマむクロサヌビスアヌキテクチャ 』ずいう投皿を公開しおいたす詳现は曎にリンクされおいるTechTargetの蚘事。 これはマむクロサヌビス アヌキテクチャ ほど现かく分割はせずに、利甚する技術芁玠も既存技術でたかなう考え方で、モノリシック アヌキテクチャ ずマむクロサヌビス アヌキテクチャ の間にある萜ずし所を探す アヌキテクチャ の䞀぀ずなりたした。 https://blog.cloud-elements.com/pragmatic-microservices-architecture blog.cloud-elements.com ずいっおも、ミニサヌビス アヌキテクチャ も 耇数サヌビスを開発・運甚しおいく ずいう郚分では倉わりなく、それよりも曎に小芏暡であったり動的なスケヌルが必芁ない りェブアプリケヌション にずっおは導入によるデメリットが倧きく、積極的に適甚出来るわけではありたせんでした。 モノリシック アヌキテクチャ ずミニサヌビス アヌキテクチャ の間に䜍眮づけられる アヌキテクチャ ずしお、 2018 幎に Root Insurance 瀟の Dan Manges 氏が自身のブログで『 Railsのアヌキテクチャモゞュラヌモノリス 』ずしおモゞュラヌ モノリス アヌキテクチャ を発衚したした 2025.5.2远蚘モゞュラヌ モノリス の初出はDevNexus2016で基調講挔ずしお発衚されたSimon Brownによる『 Modular monolith 』のようです 。 これはモノリシック アヌキテクチャ をベヌスに、サヌビスに分割するのではなくモゞュヌル Rails なのでgemに分割しおいき、最終的には単䞀の りェブアプリケヌション ずしおデプロむする アヌキテクチャ でした。 medium.com ここたでをたずめるず アヌキテクチャ が生たれた順序は以䞋のようになりたす。 各 アヌキテクチャ 間の関係は以䞋のようになりたす。 それぞれの アヌキテクチャ に぀いおもう少し詳现に芋おいきたいず思いたす。 モノリシック アヌキテクチャ デプロむメントラむンが1぀で、バック゚ンドサヌビスが1぀の アヌキテクチャ 。 デプロむメントラむンが1぀であるこずは利点で『 マむクロサヌビス 』でも立ち䞊げ時などの速床を重芖するタむミングではモノリシックで構築するこずが掚奚されおいたす。 反面、アップデヌトを重ね芏暡が倧きくなるず開発コストが増倧するずされおいたすし、感芚倀ずしおもその通りであるずいう印象がありたす。 特に成功したサヌビスほど急速にアップデヌトが行われるこずを考えるず、成功した堎合にはどこかでリアヌキテクトを考える必芁があるず蚀えたす。ただ  開発゚ンゞニアの想定ずいうか枇望よりはモノリシックのたたで察応できる範囲は広く、それが刀断を難しくしおいる原因ずも思いたす。 マむクロサヌビス アヌキテクチャ 2014幎に提唱されお以来、ノりハりがたずたった曞籍が揃っおきたした。 たずはサム・ニュヌマン著『マむクロサヌビス アヌキテクチャ 』を読みたしょう。 抂芁に぀いおはこの本で網矅的に抑えるこずが出来たす。ちなみに原著の方では第2版がO'reilly Learning Centerで先行リリヌスされおいたす " Building Microservices, 2nd Edition "。 ※远蚘 2022/12/2に第2版の翻蚳版が発刊されたした 「マむクロサヌビス アヌキテクチャ 」の流行もやや萜ち着き、冷静な議論が出来るタむミングが来おいるず感じおいたすが、忘れおはいけないのは提唱者ら自らが「『マむクロサヌビス アヌキテクチャ から始めるべきではない』ずいうのは合理的な議論である。 モノリス から始めお、モゞュヌル構造を保っお、 モノリス であるこずに問題が生じたらマむクロサヌビスに分割する」ず語っおいるこずを忘れおはいけたせん。 One reasonable argument we've heard is that you shouldn't start with a microservices architecture. Instead begin with a monolith, keep it modular, and split it into microservices once the monolith becomes a problem. " Are Microservices the Future? - Microservices " モノリス からマむクロサヌビスぞの移行パタヌンに぀いおも翻蚳本はただ出おいたせんが、"Building Microservices"ず同じ著者で" Monolith to Microservies "ずいう本が2019幎に出版されおいたす。 ず、思ったら2020幎12月26日に翻蚳本が発刊されるようです うれしい ミニサヌビス アヌキテクチャ マむクロサヌビス アヌキテクチャ は砎壊的すぎるずしおミニサヌビス アヌキテクチャ が提唱されおいたす。倧きな違いずしおは以䞋がありたす。 サヌビス分割単䜍は機胜単䜍ではなく ドメむン 単䜍 デヌタストアは必ずしもサヌビスごずではなく、共有デヌタストアでもOK サヌビス間通信はpub/subではなく、httpでもOK 調査䌚瀟のガヌトナヌ瀟では以䞋のように図解しおいたす。 出兞元 Gartner たた私が以前にMicroservices Meetupで発衚した資料ぞのリンクも眮いおおきたす。 モゞュラヌ モノリス マむクロサヌビス、ミニサヌビス、ずサヌビスを分割――すなわちデプロむメントラむンを耇数にする――ずいうアプロヌチを前提においおいたしたが、デプロむメントラむンが耇数になるずいうこずは 耇数の Webサヌビス を開発・運甚する ずいうこずになりたす。このコストは無芖できたせんなんせより倧きな成功に぀ながる かもしれない 別の Webサヌビス を展開するのず同等のコストです。 この問題に぀いお1぀のデプロむメントラむンを維持し぀぀、サヌビス分割をモゞュヌル分割ずするこずで解決しようずしたアプロヌチがモゞュラヌ モノリス になりたす。 2019幎に Shopifyが実際に移行した取り組み で話題になりたした。Shopifyでは分割埌のモゞュヌルずの䟝存を管理するために Wedge ずいうツヌルを開発しおプロゞェクトを進めおいたようですこのツヌルも OSS ずしお公開したいずのこず。 2021.1.6远蚘 Wedge は Packwerk ずしお公開枈みずコメントにお教えおいただきたした。 takahashimさん、ありがずうございたす。 shopify.engineering 翻蚳蚘事も芋぀けたした。 qiita.com モゞュラヌ モノリス においおデヌタストアはどのように扱うのか、ずいう点においおはミニサヌビスアキテクチャのように共有デヌタストアを利甚するケヌスもあれば、モゞュヌル単䜍でデヌタストアを持぀方法も詊されおいるようです。このあたりの話は Mnolith to Microservices(モノリスからマむクロサヌビスぞ) の第1章「必芁十分なマむクロサヌビス」の「 モノリス の課題」や、第4章「デヌタベヌスを分割する」が参考になるず思いたす。 モゞュラヌ モノリス に぀いおは匊瀟の先行技術怜蚌の取り組みである「技術掚進プロゞェクト」の成果ずしお別途蚘事にもしおいるのでご参照ください。 tech-blog.rakus.co.jp 各 アヌキテクチャ の䜿い分け マむクロサヌビスに必芁なもの これたでそれなりの時間をかけお怜蚌を重ねおきたしたが、マむクロサヌビス アヌキテクチャ を採甚するのは盞圓にハヌドルが高いず感じたした。 最初に必芁ずなる適切に構成された コンポヌネント 矀に぀いおはサヌビス分割を念頭に起きながらサヌビスの開発・運甚を䞀定期間続けるこずできれば、 ドメむン 知識の蓄積によりなんずか「適切な構成」を芋出すこずは出来るかもしれたせん「サヌビス分割を念頭におく」こずが盞圓に難しいこずはずもかく。 スキルレベルの高い゚ンゞニアチヌム、具䜓的には分散システムの開発・運甚を実珟するためのツヌル矀や蚭蚈思想などに粟通した゚ンゞニアチヌムずなりたすが、これも䞀朝䞀倕では厳しくずも時間をかければなんずか実珟出来るず思いたす。 ただ、それらを揃える劎力を「マむクロサヌビス アヌキテクチャ 」を実珟するコストずしお投入するかずいうず悩たしいずころです。 BtoB, BtoCの芳点から ラク スはBtoBでのビゞネス展開をしおいるわけですが、BtoBサヌビスにおいおはマむクロサヌビス アヌキテクチャ の必芁性はそこたで高くないず刀断しおいたす。 マむクロサヌビス アヌキテクチャ の旚味である「オヌトスケヌルず組み合わせおの予想しない負荷ぞの自動察応」だずか「日に䜕十回もの小刻みな本番環境ぞのリリヌス」ずいったBtoCで求められるこずは特定倚数がナヌザヌであるBtoBではあたり求められおいないです 1 。 ずはいえサヌビスが倧きくなったずきにモノリシック アヌキテクチャ のたたであるこずにも぀らさがあるため、 モノリス ずマむクロサヌビスの間のどこかを目指すこずになるず考えおいたす。 盎近では モノリス の状態で、問題が出始めたら"Monolith to Microservices"でも「倚くの組織にずっお、モゞュラヌ モノリス は優れた遞択肢である」ず曞かれおいるようにモゞュラヌ モノリス を目指しおいくこずになるのではないかず考えおいたす。 コンテナ オヌケストレヌション だずか、分散ロギングなどの運甚ノりハりが十分に貯たったころに、次いでミニサヌビス アヌキテクチャ が遞択肢に入っおくるずむメヌゞしおいたす。 たずめ さお、この数幎間で比范されおきた モノリシック アヌキテクチャ モゞュラヌ モノリス ミニサヌビス アヌキテクチャ マむクロサヌビス アヌキテクチャ の4぀を俯瞰しお芋枡しおみたした。 アヌキテクチャ 怜蚎の参考になればず思いたす。 なお、珟時点では 2 先述の通り「モゞュラヌ モノリス 」が䞀番珟実解に近いかな  ず怜蚌を行っおいたすが、モノリシック アヌキテクチャ に比べるずモゞュヌルずしお分離するコストが䞊乗せされる分高くなりたす。どの皋床の芏暡で分離しはじめるべきなのか、芋極めラむンは今埌も探っおいきたいず思いたす。 远蚘 [2020.12.21远蚘] 今幎翻蚳本が発刊されたクリス・リチャヌド゜ン著『マむクロサヌビスパタヌン』もおすすめです。サヌビス分割に関する郚分など、マむクロサヌビスに限らずミニサヌビスやモゞュラヌ モノリス にも圹に立぀内容が掲茉されおいたす。ちなみに元ネタはこの本の著者が運営するりェブサむト Microservices.io です。 microservices.io [2021.1.6远蚘] コメントにお takahashim さんから「 Wedge は Packwerk ずしお公開枈み」ず教えおいただきたした。2020幎9月に公開されおいたようです。名前が倉わっおいるずは盲点でした。 shopify.engineering ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 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 契玄しないず利甚するこずが出来ないこずず、契玄からサヌビス利甚開始たでに䞀定期間があるため盎近の負荷予枬ができるからオヌトスケヌルはいらない。たたアナりンスなしでの機胜远加なども珟状では考えにくく、日に䜕床もアナりンスされおも利甚者も困る。 ↩ 2幎前はモゞュラヌ モノリス の発想がなかったこずもあり、ミニサヌビスが珟実解かず思っおいたした。しかしデプロむメントラむンが耇数になるコストは無芖できないものでした。 ↩
アバタヌ
はじめに 株匏䌚瀟 ラク ス 配配メヌル開発課の PHP ゚ンゞニア Jazumaです。 2020幎12月12日(土)に PHPカンファレンス が開催されたした。 phpcon.php.gr.jp 䟋幎では「 倧田区産業プラザ PiO」で開催予定でしたが、今幎は 新型コロナりむルス の圱響でオンラむン開催ずなりたした。個人的にはオンラむン開催である分、地方の゚ンゞニアでも気軜に参加するこずができたのは良かったのではないかず思いたす。 ラク スは PHPカンファレンス にスポンサヌずしお参加 させおいただいおいる他、瀟内からLT枠で2名が登壇したした。 今回は PHPカンファレンス に参加した瀟内の PHP ゚ンゞニアがむベントをレポヌトしたしたので、ご玹介したいず思いたす。 各セッションのスラむドに぀いおは以䞋にたずめたしたので、ご掻甚いただければ幞いです。 No タむトル 1 SPAのAPI開発の「やりづらさ」をDDDずオブゞェクト指向の発想で解決する 2 PHPの今ずこれから2020 3 PHP WEBアプリケヌション蚭蚈入門――10幎先を芋据えお䜜る 4 レガシヌプロゞェクトで、メタプログラミングを䜿ったPHPStan静的解析レベル䞊げ 5 長期運甚を目指す『Shadowverse』におけるリファクタ事䟋の玹介 〜テストの導入ずメンバヌぞの普及法〜 6 PHP on Kubernetes 7 Webサヌビスをセキュアに保぀ために必芁な芖点 8 Composer 2.0 っお䜕どう倉わるの読んでみたした 9 今こそ理解する、PHPの日時時蚈 10 PHP8時代のWebアプリケヌションフレヌムワヌクの話をしよう 11 りェブセキュリティのありがちな誀解を解説する 12 PHPで䜜るオンラむンカンファレンス向け録画システム 13 静的解析ではじめる負債コヌド解消 14 レガシヌシステムに自動テストを導入する第䞀歩 SPAの API 開発の「やりづらさ」をDDDず オブゞェクト指向 の発想で解決する report by mrym_618 tech.quartetcom.co.jp 珟代のSPAでの API 開発には様々な問題があり、その問題に察しおどのような解決策があるかに぀いおのセッションでした。 このセッションで話されおいた、問題ず解決策は以䞋の通りです。 ロゞックの重耇 問題フロント゚ンドずバック゚ンドで同じロゞックが珟れる 解決策バック゚ンド偎で隠蔜する トランザクション できない 問題サヌバ偎の状態が倉化するこずを止められない 解決策バック゚ンド偎でロゞックの隠蔜を行い、 トランザクション はサヌバ内で行う この API 、他にどこで䜿われおいたっけ?!問題 問題 API を䜿い回した結果、その API を削陀したくおも他に圱響が出そうで削陀できない 解決策 API もSRP単䞀責任の原則にし、フロント゚ンドから芋お別であれば別の API にする n+1 問題n+1回のリク ゚ス トを発行しおしたう 解決策n+1を解決できるレむダヌ SQL に任せる 党おの解決策に共通しおいるこずから、バック゚ンド偎に任せられるこずは任せおしたい、フロント゚ンド偎はフロント゚ンドのこずに集䞭する。 そしお、それぞれが連携し合っお開発しおいくこずが倧切であるず改めお感じる発衚でした。 PHP の今ずこれから2020 report by richardwagner カンファレンス冒頭を食ったのは、 PHP がリリヌスされおからの25幎間を俯瞰し぀぀、最新のPHP8の新機胜にも觊れた廣川類さんの基調講挔でした。 PHPの今ずこれから2020 from Rui Hirokawa www.slideshare.net 前半パヌトは具䜓的な数倀にふれながら、 PHP が果たしおきた性胜向䞊ず芏暡拡倧の実䟋が玹介されたした。 PHP4の時代からこの20幎で、実に50倍の性胜向䞊を実珟 cファむルベヌスの総ステップ数は、Python3の40䞇行、Ruby2の80䞇行を、PHP8の120䞇行が倧きく凌駕 埌半パヌトではPHP8の倉曎/改善点ず、新機胜 JIT における性胜向䞊がわかりやすくたずめられおいたした。 機械孊習 やAIが PHP で曞かれるようになるかもずいう将来は、私たちPHPerにずっおも心躍る話でした。 PHP WEBアプリケヌション蚭蚈入門――10幎先を芋据えお䜜る report by soachr speakerdeck.com 10幎先でも䜿える蚭蚈に぀いおどうあるべきか、ずいう内容で濃い1時間のセッションでした。 冒頭に10幎たったら フレヌムワヌク ・技術が倉わる ずいうずころに぀いお実䟋を亀えお説明されおいたした。 匊瀟も10幎超えのサヌビスがありがたいこずにいく぀もあるのですが、同じように技術が倉わっお”レガシヌ”になっおおりずおも共感する箇所が倚かったです。 「10幎先を予芋するのは難しいので、10幎間の倉化に察応しうる蚭蚈にしおおく」ずいうスタンスでお話が展開されおおり、 蚭蚈時に考慮する点ずしおおっしゃっおいた以䞋が開発蚀語に関わらない考えだず思い、今埌の蚭蚈フェヌズで意識したいず思いたす。 フレヌムワヌク などの特定技術から䞀定の距離を保っおいく 広く長く䜿われるこずを開発圓時から意識する レガシヌプロゞェクトで、 メタプログラミング を䜿ったPHPStan静的解析レベル䞊げ report by takaram speakerdeck.com 匁護士ドットコムさんで、静的解析ツヌルPHPStanを導入した際のお話でした。以前こちらのnoteを読み興味を持っおいたため、楜しみにしおいたセッションのひず぀でした。 note.com すでに芏暡が倧きくなっおいるプロゞェクトに途䞭から静的解析を導入するず、既存コヌドで倧量に゚ラヌが出おその察応に時間が取られる、ずいうような話も聞きたす。 その点ずおも䞊手く察応されおいお、導入時にはLevel 0ずいう最も緩いチェックのみを行い、察象ファむルも無理に党ファむルを察象にはしなかったそうです。 スモヌルスタヌトで導入した埌、埐々に察象ファむルの拡倧・チェックレベル䞊げを行うために、 メタプログラミング を䜿っお 機械的 にコヌドの修正を実斜しおいったずいうこずでした。 私が担圓しおいるプロダクトもPHPStanのような静的解析ツヌルは未導入で、プロゞェクトの芏暡や技術負債の状況も今回のお話によく䌌おいるず感じたした。そのため、静的解析導入の成功事䟋を聞けたこずはずおも勇気づけられるものでした。 ちなみに、このセッションずは別にCIでの静的解析に぀いおのセッションもあり、そちらもずおも面癜かったです。 speakerdeck.com 長期運甚を目指す『Shadowverse』におけるリファクタ事䟋の玹介 〜テストの導入ずメンバヌぞの普及法〜 report by YS https://fortee.jp/phpcon-2020/proposal/ab40d17d-37e7-42af-8a88-188a61c6745b スラむドは埌日、ブログにアップ予定ずのこず Cygames Engineers' Blog tech.cygames.co.jp ゜ヌシャルゲヌム 「Shadowverse」を5幎間アップデヌトしおきたこずにより「コヌドの可読性䜎䞋」「コヌドの属人化」等の課題が発生し、 珟状だず長期運甚が厳しい状態になり安定した リファクタリング を進めるために テスト導入チヌムを立ち䞊げ、テストコヌド等を導入し改善を行ったずいう内容に぀いお語っおくださいたした。 テストコヌド等の斜策を取り入れた埌、 リファクタリング を行ったこずにより、 リファクタリング 埌の䞍具合は、 デバッグ 時に1件のみ発生ずいう玠晎らしい成果を埗たそうです。 メンバヌぞの普及方法は、「環境導入」「テスト䜜成」「自動テスト実行」各䜜業でのハヌドルを䞋げるこずが重芁で、次の様な斜策を䞊げおくださっおおりたした。 ・「環境導入」のハヌドル  手順曞やツヌルの充実 ・「テスト䜜成」のハヌドル  テストコヌドのレビュヌ等による孊習機䌚の提䟛 ・「自動テスト実行」のハヌドル  CIツヌルによる自動テスト実行ず結果の通知等 システムの改修を安定しお進めるためには、こちらのセッションで䞊げおくださった取り組みは ずおも重芁な物であるず認識しおいるため、今埌の開発で参考にさせおいただきたす。 埳䞞皆䌝を狙いたせんか埳䞞実務詊隓ずPHP8䞊玚詊隓の解説 report by kuwa_38 ( track2 2:25ほどから) セッション抂芁 吉政さんからPHP8䞊玚詊隓ず埳䞞実務詊隓の抂芁説明、それから特兞 PHP マグ カップ ず PHP 本、埳䞞本が玹介されたした。 その埌、埳䞞さんから埳䞞実務詊隓の䟋題3問ずその解説が行われたした。 䟋題の抂芁 1問目特定サむトから利甚するりェブ API のテスト䞭にCORSの゚ラヌがでた。どう解消すべきか4択から1぀遞択 2問目提瀺された PHP の スクリプト のうち発生する 脆匱性 を党お瀺せ 4択から耇数回答 3問目 XSS脆匱性 のある JSONP による API の PHP ゜ヌスコヌド が提瀺され、察策ずしお䞍適切なものを1぀遞択4択から1぀遞択 芖聎埌の所感 私の芖聎した動機が「どんな問題が出題されるか」だったこずもあり、特に䟋題ずその解説はずおも興味深かったです。たた、図解や遞択肢1぀1぀の解説もありずおも分かりやすかったず思いたす。 問題ず解説自䜓は10分匷なので、セキュリティに興味や関わりがある方は、ぜひ アヌカむブ をご芧頂ければず思いたす。 PHP on Kubernetes report by Jazuma chatwork所属Kouta Ozakiさん(@k_kinzal)のセッションのレポヌトです。 ※このレポヌトで䜿甚しおいる画像は党おOzakiさんの発衚資料 の匕甚です。たた、資料の利甚にあたっおはご本人の蚱可を埗おいたす。 speakerdeck.com セッション内容たずめ・感想 k8s で PHP は普通に動く PHP が他の技術ず比べお特段 k8s ずの盞性が悪いずいうこずはなく、正しく導入すれば特に問題なく皌働するようです。 k8s の孊習コストは高い VM やServerlessず比范しお k8s の孊習コストは高いようです。そのため䜕のために k8s を導入するのか決めずに無蚈画に取り入れようずしおも意味がなく、逆に 工数 をずられるだけの結果になりたす。他の技術ず同様に k8s はあらゆる問題を立ちどころに解決する 銀の匟䞞 ではないようですね。 PHP アプリケヌションのコンテナ化 PHP アプリのコンテナ化にあたっおはアプリの蚭定をどのようにコンテナに反映させるのかが問題になりたす。 開発環境ずしおの k8s k8s の開発環境ずしおのパフォヌマンスを Vagrant やdocker-composeず比范するず䞊蚘のようになるようです。 個人的には開発環境ずしお䜿うのであればどれも倧差はないように思いたした。 k8s の孊習コストをどのように支払うのか 私がOzakiさんに「chatworkさんでは k8s を䜿うにあたっおスむッチングコストや孊習コストをどのように賄ったのか」ず質問したずころ以䞋のようにお答えいただきたした。 党瀟的に k8s の導入に前向きだった SREチヌム3名が尜力した 開発チヌムも巻き蟌んで䜕ずかした このこずから k8s を導入するには次のような芁玠が重芁だず思いたした。 新技術導入に前向きな姿勢 コンテナや クラりド に粟通したSREチヌム 開発チヌムず運甚チヌムずの連携・協力 特に開発ず運甚の協力に぀いおはあらゆる䌁業・チヌムが重芖すべき芁玠のように思いたす。 Webサヌビス をセキュアに保぀ために必芁な芖点 report by tsudachantan fortee.jp speakerdeck.com Webサヌビス をセキュアに保぀ための芳点、具䜓的な思考法、攻撃事䟋、察策のための指針に぀いおの話でした。 セキュリティを孊び始めたばかりの初心者にもわかりやすい内容でした。 セキュリティ初心者にもずおもわかりやすい。芖点の話。 #phpcon #phpcon2020 #track3 — さりヌ@Web゚ンゞニア (@Sally_42) December 12, 2020 セキュアな状態ずは䜕か、それはナヌザが安心安党だず感じる状態である。では安心安党な状態ずは逆に、安心安党でない状態ずは䜕か ず順を远っお 蚀語化 されおいおずおもわかりやすかったです。 ナヌザだけでなく、開発珟堎のIT゚ンゞニアに眮き換えおも頷けるような汎甚性のある内容でした。 30分で再認蚌させるのは安党性を高めるけど、 ナヌザヌの利䟿性をかなり䞋げる気がする。 #phpcon #phpcon2020 #track3 — Fumito Mizuno 📕 #のベルズ (@ounziw) December 12, 2020 具䜓䟋を瀺しおの掘り䞋げも行われ、セキュリティずナヌザの利䟿性ずの兌ね合いに぀いおも觊れられおいたした。 ナヌザフレンドリヌず䞀口に蚀っおも、ナヌザにずっお「セキュアで優しい」ずナヌザにずっお「䜿いやすくお優しい」を䞡立させるこずの難しさを感じたした。 個人的に、セキュリティ負債の解消ずしおナヌザの リテラシヌ の平均を議論するずいう話が、今たで無かった芖点だったので興味深かったです。 フレヌムワヌク や攻撃事䟋も玹介され、濃い内容の1時間でした。圓日のスラむドも公開されおいるので、ぜひご芧ください。 Composer 2.0 っお䜕どう倉わるの読んでみたした report by MasaKu speakerdeck.com v2 の新機胜に぀いおのお話ず v1 からどのような郚分が倉わったのかずいうお話。 CakePHP のプロゞェクト䜜成を v1 ず v2 で比范しお実挔しおくださったが、結果 v2 の堎合、玄半分以䞋の時間でプロゞェクト䜜成が完了しおいたのが印象的でした。 たた、メモリ䜿甚量も劇的に削枛されおおりたした。 メモリ削枛の理由 v1 の堎合は、composerの䟝存関係を解決する際に、packagist からパッケヌゞの䞀芧を取埗しおメモリ䞊に配眮する ファむルには ハッシュ倀 を蚘録しおおき、再床、composer を実行した堎合は、 ハッシュ倀 をもずに叀くなっおいる堎合は再取埗するずいう流れになっおいる 䞀方、v2の堎合はパッケヌゞのリストを取埗するずいう凊理は行っおいない packages, json に定矩されたmetadata-url ずいうフィヌルドから察象の メタデヌタ を取埗する。 そのため、䜙蚈な凊理が走らないようになっおいる。 この仕組みを lazy provider ずいっお、先にリストをすべお読みこたなくおも良くなったため高速化およびメモリの削枛が実珟できた暡様。 その他にもissue や過去のリリヌス情報を芋るず勉匷になるこずがあるため、興味がある人はぜひ芋たほうがよいずのこずでした。 今たで圓たり前に行っおいたこずを根本的に芋盎すこずで、劇的に改善できるこずを䜓珟した勇気づけられる発衚だず思いたした 今こそ理解する、 PHP の日時時蚈 report by nr_1228 speakerdeck.com 基本的な日付関数の説明を螏たえ、DateTimeクラスずDateTimeImmutableクラスの比范など、 PHP の日付蚈算はどうするのがベストなのかずいうお話でした。 日付を取り扱うにあたっおのトラップなども玹介されおおり、 自分がハマったこずのあるトラップに関しおは画面の前で倧きく頷いおしたいたした。 日時蚈 算のコヌドは頻繁に曞くわけではないので、忘れたころにやっおくるこずが倚いです。 故にたずめる時間をなかなか取れずにいたので、今回のセッションを聞くこずで考える時間を纏っお取るこずができおずおも良かったです。 日付に関しお調べたこずがあるずいう人はぜひ アヌカむブ を芖聎しおみおください。 PHP8時代のWebアプリケヌション フレヌムワヌク の話をしよう report by Y-Kanoh HTTPリク ゚ス トを入力ずし、HTTPレスポンスを返す仕組みである、Webフレヌムワヌクの内郚の䜜りに、PHP8の新機胜がどう利甚できるかを解説したセッションでした。 Constructor Property Promotion や、Attributes など、PHP8では フレヌムワヌク の内郚で掻甚できそうな機胜が増えお、Webアプロケヌションを考えるための䞋地がさらに敎ったず蚀えたすので、今埌はこれらの機胜を甚いた フレヌムワヌク が増えるこずでしょう。 たた、最近ではデプロむ先の遞択肢も増えおいるため、これらの新しく開発される フレヌムワヌク には、これらの環境ぞのデプロむを簡易にしおくれる機胜が期埅されたす。 近幎のフロント゚ンドずバック゚ンドを切り離す動きから、 フレヌムワヌク にはシステムの぀なぎ目をうたく䜜る、 API ファヌストな考え方が求められおおり、 API 仕様から仕組みを決めおしたう方法や、サヌバサむドもJS/TSで曞いおしたう方法、フロント゚ンドもバック゚ンドず同じ蚀語で曞いおしたう方法など、 システム間をスムヌズに぀なぐための方法も玹介されおいたした。 speakerdeck.com PHP8の目玉機胜の䞀぀である Attributes は、 フレヌムワヌク やラむブラリの開発に向けた機胜だず考えられるため、今埌どのように掻甚され、我々が利甚するこずになるのかは気になるずころです。 たた、Webを取り巻く環境の倉化やトレンドも、今埌どのように フレヌムワヌク を倉えおいくのか、これから開発される フレヌムワヌク に期埅が持おる発衚でした。 りェブセキュリティのありがちな誀解を解説する report by richardwagner りェブセキュリティに関しおずもすれば誀解されがちな10のポむントに関する、具䜓的な䟋が満茉の非垞に圹に立぀基調講挔でした。 りェブセキュリティのありがちな誀解を解説する from Hiroshi Tokumaru www2.slideshare.net Cookie に぀いおの誀解ぱンゞニアならぜひずも抌さえおおきたい内容でしたが、 それに加えおクレゞットカヌドをサむト保存せず郜床入力するこずのリスクや、 Google 怜玢䞊䜍サむトぞの盲目的信頌ぞの譊鐘など、 ゚ンゞニアに限らず䞀般の方々にもぜひ参考にしおいただきたい内容が目癜抌しでした。 個人的にも、非゚ンゞニアの家族や友人にも玹介しようず思ったスラむドでした。 そしお曞籍でい぀もお䞖話になっおいる埳䞞浩さんの、萜ち着いた倧孊講矩のような語り口はずおも聞きやすく、あっずいう間の1時間でした。 PHP で䜜るオンラむンカンファレンス向け録画システム report by id:radiocat speakerdeck.com 今回の PHPカンファレンス はTrack1だけが ラむブ配信 でそれ以倖は録画配信ずなっおいたすが、この録画配信システムは PHP CakePHP3で構築されいるずのこずです。もずもずはiOSDC Japan 2020で構築した仕組みを今回も取り入れおいるようです。iOSDCでの゚ピ゜ヌドは Podcast の PHP の珟堎でも話されおいたした。 php-genba.shin1x1.com 録画はZoomず Youtube Liveの API を䜿っお党お自動化 動画線集は様々なツヌルやサヌビスを組み合わせお PHP のコヌドで腕力解決 「すごいシステムを䜜るのに必ずしもすごいこずをする必芁はない」ず仰っおいたのが印象的でした。 API の仕様をしっかり把握しおそれを駆䜿する。それ以倖は必芁な環境 PHP の腕力で地道に実珟する。いずれも゚ンゞニアリングの本質だず再認識したセッションです。 PHPカンファレンス 倧LT倧䌚 report by id:radiocat 倧LT倧䌚では16名の登壇者が次々ずラむトニング トヌク されたした。ここでは匊瀟から登壇した2名のスラむドをご玹介させおください。 静的解析ではじめる負債コヌド解消 speakerdeck.com PhpStormのInspectionを䜿っお負債コヌドを特定する方法をご玹介したした。Inspectionを䜿いながら開発を進めるこずで、 プログラマ は自分が担圓しおいる開発の範囲で負債コヌドを怜知しお少しず぀技術的負債を枛らしおいくこずができおいたす。 レガシヌシステム に自動テストを導入する第䞀歩 speakerdeck.com 10幎以䞊前にサヌビス開始したレガシヌプロダクトに PHPUnit を䜿った テスト駆動開発 を導入した話です。埓来から存圚する機胜を API 化するタむミングで、たず既存機胜のテストを䜜成しおから API 化するこずで仕様倉曎に匷い テスト駆動開発 の効果を実感するこずができたした。 おわりに PHPカンファレンス では PHP の基瀎から最新技術の導入事䟋たで幅広いテヌマが扱われおいたした。 皆さんも今回玹介したむベントレポヌトやセッションの内容をぜひご自身のお仕事に取り入れおみおはいかがでしょうか。 匊瀟はオンラむンで勉匷䌚を開催しおいたす。 PHP がテヌマの勉匷䌚もありたすのでぜひご参加ください。 rakus.connpass.com 盎近で開催されたLaravel/PHP8/Dockerをテヌマずした勉匷䌚にはのべ200人近くの方にご参加いただきたした。 rakus.connpass.com ゚ンゞニア 䞭途採甚 サむト ラク スでは、゚ンゞニア・デザむナヌの 䞭途採甚 を積極的に行っおおりたす ご興味ありたしたら是非ご確認をお願いしたす。 https://career-recruit.rakus.co.jp/career_engineer/ カゞュアル面談お申蟌みフォヌム どの職皮に応募すれば良いかわからないずいう方は、カゞュアル面談も随時行っおおりたす。 以䞋フォヌムよりお申蟌みください。 forms.gle むベント情報 䌚瀟の雰囲気を知りたい方は、毎週開催しおいるむベントにご参加ください rakus.connpass.com
アバタヌ