TECH PLAY

株式会社ラクス

株式会社ラクス の技術ブログ

935

みなさん、初めましてmrstsgk_rksです。 今回は、私が開発時に使用している言語「 PHP 」についてまとめました。 最初にPHP8.0の新機能について振り返り、PHP8.1の新機能についてもまとめたいと思います。 PHP8.1の新機能に関しては、リリース日が近づいてきたため、本記事に再度まとめさせていただきました。 最後までお読みいただけましたら幸いです。 目次 目次 PHPについて PHPの概要 PHPは動的型付け言語 PHPは初心者向け 理由1. HTMLとの親和性が強い 理由2. 開発環境が整っている 理由3. WordPressのカスタマイズが可能 PHP8.0 新機能 ユニオン型(UnionTypes) ユニオン型のメリット ユニオン型の注意点 JIT JITコンパイラのメリット JITコンパイラのデメリット 名前付き引数 名前付き引数をのメリット PHP8.1 新機能 列挙型(Enum) 交差型(Intersection Types) 戻り値の型never finalクラス定数 readonlyプロパティ 最後に おすすめの関連ブログ 参考文献 PHP について PHP の概要 PHP は動的型付け言語 動的型付け言語とは、事前に コンパイル を行わず、プログラムの実行時に型をチェックします。 メリットとしては、プログラムの書く量が少なく直感的にコードを書けます。 PHP の他には、 JavaScript や Python などが該当します。 一方、 Java のような静的型付け言語などよりも処理が遅いというデメリットもあります。 PHP は初心者向け 理由1. HTMLとの親和性が強い PHP は、もともと動的にウェブページを作成するために作成された言語であり、 PHP は HTML に直接書き込むことが可能です。 なので、 HTML から学習を始めた方にとっては、 PHP は慣れ親しみやすい言語になると思います。 理由2. 開発環境が整っている PHP を実行するには動作環境が必要ですが、 PHP には環境構築ツールが用意されているので 簡単に PHP の動作環境を用意することが可能です。 ・主な環境構築ツール  1. XAMPP    PHP の動作環境を作成する際に真っ先にあがるツールとして、 XAMPP があります。    XAMPP は、 クロスプラットフォーム であり「 Windows 」、「 Linux 」、「 macOS 」などどのOSでも、動作   させることが可能です。   しかし、 macOS の場合は以下で紹介する「 MAMP 」が使用されることが多いです。  2. MAMP    MAMP もXAMPPと同様に環境開発ツールですが、XAMPPに比べて macOS に特化していることが違いです。 理由3. WordPress のカスタマイズが可能 WordPress はブログやWebサイトを構築する際に利用するソフトウェアのことです。 WordPress のようなソフトウェアのことを CMS ( コンテンツマネジメントシステム )と呼び、 WordPress は世界で最も多く利用されている CMS です。 PHP ができると WordPress をカスタマイズすることが可能です。 PHP はWebアプリケーション以外にも WordPress をカスタマイズできるので他の言語に比べて、 PHP でできることは多いと思います。 以上の3つの理由から PHP は初心者向けと言えるでしょう。 PHP8.0 新機能 PHP8の新機能で私が気になったものをまとめます。 ユニオン型(UnionTypes) ユニオン型(UnionTypes) は2つ以上の型をパイプ記号(|)でつなげて書きます。 PHP8以前のバージョンでは、「パラメータ」や「戻り値」、「プロパティ」の型に対して、単一の型宣言しかできませんでした。またPHP8以前のバージョンでは次の例のように、 ユニオン型 は「PHPDoc」の注釈でのみ指定することが可能でした。 class Hoge {  /**   * @var int|float $hoge   */  private $hoge;  /**  * @param int|float $hoge  */  public function setHoge($hoge) {   $this- > hoge = $hoge;  } } そして、PHP8では ユニオン型 をパイプ記号でつないで T1|T2|... で書けるようになりました。 (下記の例を参照) class Hoge { private int|float $hoge; public function setHoge(int|float $hoge): void { $this- > hoge = $hoge; } } PHP8から ユニオン型 を利用することにより、PHPDocに頼らず多くの情報を関数に定義できます。 ユニオン型のメリット 型をしっかりと適用できるので、ミスを早期に発見できる PHPDocの分量を減らすことできる など PHP8で追加された ユニオン型 にはメリットばかりあるように感じますが、注意点もあります。 ユニオン型の注意点 void はユニオン型の一部として使用できない   void は関数が値を返さないことを意味するので、 int|void のように使用できません。 null許容型(nullable)について  PHP8以前のPHP7.1からサポートされたnull許容型ですが、  ユニオン型と混合して ?int|float などと使用できず、正しくは int|float|null  と書くことができます。以下にnull許容型の例を記載します。 public function huga (?int $huga) {  ・・・ } $hugaでは、int値を指定する、nullを指定する、省略するの3つのどれかを許容できます。 false疑似型について   PHP の関数の多くが、失敗時の戻り値にfalseが設定されている関数が多いので、  false疑似型もサポートされています。  また、null単独では ユニオン型 で使うことができませんが、 false|null と使用することも可能です。 JIT JIT とは、Just-In-Timeの略で、プログラム実行時に事前に用意しておいたコードを保持し、そのコードを使いまわすことで、実効速度などの向上を狙う仕組みのことです。 PHPの概要 でも説明しましたが、 PHP は実行時に コンパイル します。 そこで JIT では、リク エス トが来た ソースコード を読み込み、 PHP を一気にネイティブコードに コンパイル し、さらに コンパイル した結果を次のリク エス トに使いまわすことが可能なので、大幅なパフォーマンスの向上が期待できます。 JIT コンパイラ のメリット PHP アプリケーションコードのパフォーマンス向上 など JIT コンパイラ のデメリット WordPress のパフォーマンスに大きな改善をもたらすことはない 複雑性が増すのでデバックやメンテナンスのコストが増加する可能性がある など 名前付き引数 PHP8新機能紹介の最後は、 名前付き引数 です。 名前付き引数 を使用すると、パラメータの場所ではなく、パラメータ名が参照され関数に引数を渡すことができます。関数に 名前付き引数 を渡すには、その値の前にパラメータ名を加えるだけです。 function sample($testNum1 = 1, $testNum2 = 4) {  ・・・ } また、以下のようなコードはNGです。 function NGSample($testNum1 = $value1, $testNum2 = $value2) {  ・・・ } NGsample 関数のコードでは、パラメータ名を動的に渡すことができないことを意味しています。 名前付き引数をのメリット 名前付き引数 に関しては、メリットのみ記述します。 メリットとして考えられるのは、関数の呼び出しが楽になったということでしょうか。 PHP8以前は、引数の順番を知らないと引数が何を表しているのかがわかりずらかったのですが、PHP8以降はパラメータに名前を使えることによって可読性の向上が期待できます。 PHP8.1 新機能 PHP8.1の新機能で私が気になったものをまとめます。 列挙型( Enum ) PHP8.1でついに 列挙型 が追加されました。 enum Suit { case Hearts; case Diamonds; case Clubs; case Spades; } $val = Suit::Hearts; 列挙型 とは、複数の定数をひとまとめにできる型のことです。 列挙型 を使用することで、同グループの定数をひとまとめにすることができるので、 ソースコード の可読性が向上するでしょう。 また、上の例である Suit列挙型 は Suit::Hearts と書くことによって値にアクセスすることが可能です。 交差型(Intersection Types) PHP8で追加された ユニオン型 が型の和集合(または)を表しますが、PHP8.1で追加された 交差型 は、型の積集合(かつ)を表します。なので 交差型 は & でつなげて表現します。 class Hoge { /**  * 交差型 $hogeはHogeかつFugaである  */  private Hoge & Fuga $hoge; } 戻り値の型never PHP8.1から関数の処理を戻さないことを指定できる戻り値の型 never が追加されます。 function redirect(): never { exit(); } PHP8.1から追加される never は、既存の戻り値の型である void と「関数やメソッドが値を返さないことを保証」することに関しては、似ていますが void が宣言された関数は、明示的な値がなくても返すことができるのに対し、 never が宣言された関数では同じことはできません。 つまり、関数を呼び出した後も PHP の実行が続くことを期待する時は void を使用し、その逆の場合は never を使用します。 finalクラス定数 定数を final として宣言すると定数の値を上書きされないことを保証します。 class Huga {  final public const H = "Huga"; } クラス、メソッド、定数に final を定義できますが、プロパティには定義できないので注意が必要です。 readonlyプロパティ PHP8.1新機能紹介の最後は、 readonlyプロパティ です。 PHP8.1から追加される readonlyプロパティ ですが、上で紹介した finalクラス定数 がプロパティには定義できないという注意点を補完してくれる便利なプロパティです。 readonlyプロパティ は一度初期化した後は、 値が変更できない変数 を作成できます。 class Test { public readonly string $sampleWord; public function __construct (string $sampleWord) { $this- > sampleWord = $sampleWord; } } $test = new Test("hoge"); var_dump($test- > sampleWord); // "hoge" $test- > sampleWord = "fuga"; // Error 上の例では、変数 $sampleWord に readonlyプロパティ が指定されています。 コンスト ラク タでこの変数に初期値が代入されるので、 ”hoge” を指定してオブジェクトを作成することにより、 readonlyプロパティ を指定した変数 $sampleWord にその値が代入されます。 しかし変数に値を代入しようとすると、初期化時ではないためエラーを発生します。 最後に いかがでしたでしょうか。 PHP8とPHP8.1の新機能を一部紹介いたしました。 PHP8とPHP8.1には、まだまだ多くの新機能が追加されていますので、ぜひほかの新機能も調べてみてください。 まずは、この記事を通して PHP に少しでも興味を持っていただければ幸いです。 ご覧いただきありがとうございました。 おすすめの関連ブログ PHP に関連する内容で、別途ブログを作成しております。 是非、ご参考ください! ◆関連ブログ ・ PHP カンファレンス 2021【参加レポート】 ・ PHP8.1 の新機能について語り合う・前編【PHP TechCafe イベントレポート】 ・ PHP8.1 の新機能について語り合う・後編【PHP TechCafe イベントレポート】 参考文献 ・ PHP 8の新機能(新機能、改善点、およびJITコンパイラー) ・ 【PHP8.0】PHP8.0の新機能 ・ PHP 8.1の新機能:機能、変更、改善など ・ 【PHP8.1】PHP8.1の新機能 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに こんにちは C2ZTAk6 です。 今回は初めにDockerについての説明を行ったのち、ハンズオン形式で 「CentOS8環境にDockerインストール~Dockerコンテナ上で、Opensslの SRPM からビルドを行いOpensslの RPM を作成する手順」 を紹介していきたいと思います。 目次 はじめに 目次 Dockerとは Dockerfileとは Dockerイメージとは SRPMとは Dockerコンテナ上でRPMを作成するメリットとは Docker環境構築 必要なミドルウェアインストール DockerCEのインストール Docker起動及び、自動起動設定 RPM作成用Dockerベースイメージ作成 Dockerfile作成 Dockerベースイメージ作成用スクリプト作成 Dockerベースイメージ作成スクリプト実行 Dockerイメージが作成されているか確認 Dockerコンテナ上で、SRPM(Openssl)からビルドを実行 Dockerfile作成 SRPMビルドスクリプト作成 SRPM(Openssl)ビルドスクリプト実行 RPMが作成されているか確認する 最後に Dockerとは 仮想化環境を構築するためのツールとなり、コンテナ型の仮想化プラットフォームと呼ばれております。 具体的には、 Windows 、 Linux のホストマシンなどにコンテナと呼ばれる仮想環境を構築し、 コンテナの中でアプリケーションや ミドルウェア 、OSなどを動かすことが出来るツールとなります。 コンテナ型の仮想プラットフォーム構成イメージ Dockerfileとは Dockerで作成するコンテナイメージを管理するためのファイルです。 Dockerfileに記載する内容は、必要な ミドルウェア 、アプリケーション、 ディレクト リ構成、各種設定などを記載致します。 ・以下は今回の ハンズオンで使用するDockerfile変数の説明 となります。 変数名 説明 FROM ベースイメージを指定します。 ARG ビルド時にDockerに渡す変数を定義します。 WORKDIR 作業用 ディレクト リを定義します。 RUN FROMで記載したベースイメージに対してコマンドを実行することができます。 ※その他Dockerfileの変数を調べたい場合は、 公式ドキュメント をご参照ください。 Dockerイメージとは Dockerコンテナを立ち上げる基になるのがDockerイメージです。 Dockerイメージは、 docker hub というDockerの公式サイトからダウンロードしてくることもできます。 また、自身で作成したDockerfileをbuildすることで、自作のDockerイメージを作成することもできます。 Dockerfileを元にDockerContainer作成までのイメージ SRPM とは SRPM とは、 RPM パッケージを作成する事が出来るソースパッケージとなります。 SRPM には、 ソースコード 、パッチ、作成方法が記載されたspecファイル等が含まれており、 spec ファイルを元にビルド(rpmbuild)を行うと ディストリビューション が配布している RPM パッケージと同等の物を作る事が出来ます。 なお、specファイルに記載されている情報を自分好みに修正することで、 ディレクト リ構成や コンパイル 時のオプションなどを制御することが可能となります。 Dockerコンテナ上で RPM を作成するメリットとは ホストOS上で RPM を作成する場合は、対象の RPM を作成する際に どういった ミドルウェア をインストールしたか どういった設定を行ったのか 後追いでの確認が困難となり、 最悪の場合は、同じSPECファイルを元に RPM を作成しても以前と同じ RPM が作成できないというリスクがあります。 Dockerfileにコンテナに必要な ミドルウェア 、アプリケーション、 ディレクト リ構成、各種設定などを記載してコード化することで、必要な情報の整理ができ、ホストOS上に不要な ミドルウェア 、アプリケーションなどインストールする必要もなくなります。 また、作成したDockerfileを元にDockerコンテナ上で RPM を作成すれば、毎回新しい環境で RPM が作成されることになり、以前とは同じ RPM が作成できないというリスクがなくなります。 Docker環境構築 ※以降からハンズオン形式での説明となります。 ・CentOS8をインストールした 仮想マシン を用意 [ root@rpm-test-server ~ ] # cat /etc/redhat-release CentOS Linux release 8 . 1 . 1911 ( Core ) 必要な ミドルウェア インストール ・dnfコマンドを使用して、ホストOSに必要な ミドルウェア をインストールします。 [ root@rpm-test-server ~ ] # dnf install -y yum-utils device-mapper-persistent-data lvm2 wget mock CentOS-8 - AppStream 7 . 9 kB/s | 4 . 3 kB 00:00 CentOS-8 - AppStream 3 . 6 MB/s | 9 . 3 MB 00:02 CentOS-8 - Base 6 . 1 kB/s | 3 . 9 kB 00:00 CentOS-8 - Base 5 . 3 MB/s | 7 . 5 MB 00:01 CentOS-8 - Extras 3 . 0 kB/s | 1 . 5 kB 00:00 CentOS-8 - Extras ~~~~~~~~~~省略~~~~~~~~~~ 完了しました! ・Docker公式ページを参照する リポジトリ を設定します。 [ root@rpm-test-server ~ ] # dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo repo の追加: https://download.docker.com/linux/centos/docker-ce.repo ・ リポジトリ のリストに、docker-ce-stable が追加されていることを確認する。 [ root@rpm-test-server Openssl ] # dnf repolist repo id repo の名前 AppStream CentOS-8 - AppStream BaseOS CentOS-8 - Base docker-ce-stable Docker CE Stable - x86_64 extras CentOS-8 - Extras DockerCEのインストール ・dnfコマンドを使用して、ホストOSにDockerCEをインストールします。 [ root@rpm-test-server ~ ] # dnf install -y docker-ce docker-ce-cli containerd.io Docker CE Stable - x86_64 221 kB/s | 3 . 5 kB 00:00 依存関係が解決しました。 ~~~~~~~~~~省略~~~~~~~~~~ 完了しました! Docker起動及び、 自動起動 設定 ・systemctlコマンドにて、Dockerサービスを起動させます。 [ root@rpm-test-server ~ ] # systemctl start docker ・Dockerサービスが起動していることを確認する。 [ root@rpm-test-server ~ ] # systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded ( /usr/lib/systemd/system/docker.service ; enabled ; vendor preset: disabled ) Active: active ( running ) since Fri 2021-10-15 21:40:16 JST; 34s ago Docs: https://docs.docker.com Main PID: 12645 ( dockerd ) Tasks: 8 Memory: 43 .0M CGroup: /system.slice/docker.service mq12645 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 10 月 15 21:40:12 rpm-test-server.mdomain dockerd [ 12645 ] : time=" 2021-10-15T21:40:12.977524850+09:00 " level =info msg = " Loading containers: start. " 10 月 15 21:40:15 rpm-test-server.mdomain dockerd [ 12645 ] : time=" 2021-10-15T21:40:15.411238922+09:00 " level =info msg = " Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferre> 10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:15. 411780590 +09:00 " level=info msg= " failed to read ipv6 net.ipv6.conf. < bridge > .accept_ra " bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra 10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:15. 411800783 +09:00 " level=info msg= " failed to read ipv6 net.ipv6.conf. < bridge > .accept_ra " bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 095902384 +09:00 " level=info msg= " Firewalld: interface docker0 already part of docker zone, returning " 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 247442276 +09:00 " level=info msg= " Loading containers: done . " 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 335702315 +09:00 " level=info msg= " Docker daemon" commit=79ea9d3 graphdriver(s)=overlay2 version=20.10.9 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 336171122 +09:00 " level=info msg= " Daemon has completed initialization " 10月 15 21:40:16 rpm-test-server.mdomain systemd[1]: Started Docker Application Container Engine. 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 381474167 +09:00 " level=info msg= " API listen on /var/run/docker.sock " ・Dockerサービスの 自動起動 設定を行う。 [ root@rpm-test-server ~ ] # systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. ・Dockerサービスの 自動起動 設定の確認を行う。(enableになっていること) [ root@rpm-test-server ~ ] # systemctl is-enabled docker enabled ・インストールしたDockerのバージョンを確認する。 [ root@rpm-test-server ~ ] # docker --version Docker version 20 . 10 . 9 , build c2ea9bc RPM 作成用Dockerベースイメージ作成 ・mkdirコマンドにて、 ディレクト リを作成する。 [ root@rpm-test-server ~ ] # mkdir -p /root/RPM/ { Baseimage,Openssl } ・Baseimage、Openssl ディレクト リが作成されていることを確認する。 [ root@rpm-test-server ~ ] # ls -l /root/RPM/ 合計 0 drwxr-xr-x. 2 root root 6 10 月 15 22:57 Baseimage drwxr-xr-x. 2 root root 6 10 月 16 01:41 Openssl ・Baseimage ディレクト リに移動する。 [ root@rpm-test-server ~ ] # cd /root/RPM/Baseimage/ Dockerfile作成 ・viコマンドにて、Dockerfileの作成を行います。 [ root@rpm-test-server Baseimage ] # vi Dockerfile FROM centos:8 # 必要なパッケージ、フォルダなど RUN yum install gcc gcc-c++ make autoconf automake rpm-build wget -y RUN mkdir -p /root/rpmbuild/ { SPECS,SOURCES } Dockerベースイメージ作成用 スクリプト 作成 ・viコマンドにて、Dockerベースイメージ作成用 スクリプト の作成を行います。 [ root@rpm-test-server Baseimage ] # vi base.sh VERSION = ' 8 ' NAME_RPM = ' rpmbuild_base ' docker build -t $NAME_RPM : $VERSION . Dockerベースイメージ作成 スクリプト 実行 ・作成したDockerベースイメージ作成 スクリプト を実行します。 [ root@rpm-test-server Baseimage ] # sh base.sh Sending build context to Docker daemon 3 .072kB Step 1 / 3 : FROM centos:8 8: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:8 ---> 5d0da3dc9764 Step 2 / 3 : RUN yum install gcc gcc -c ++ make autoconf automake rpm-build wget -y ---> Running in fbc9dabbe91b ~~~~~~~~~~省略~~~~~~~~~~ Step 3 / 3 : RUN mkdir -p /root/rpmbuild/ { SPECS,SOURCES } ---> Running in da70aa6d2f3b Removing intermediate container da70aa6d2f3b ---> 47940803c713 Successfully built 47940803c713 Successfully tagged rpmbuild_base:8 Dockerイメージが作成されているか確認 ・REPOSITORY欄にrpmbuild_baseが作成されていることを確認する。 [ root@rpm-test-server Baseimage ] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE rpmbuild_base 8 47940803c713 38 seconds ago 511MB centos 8 5d0da3dc9764 4 weeks ago 231MB [ root@rpm-test-server Baseimage ] # Dockerコンテナ上で、 SRPM (Openssl)からビルドを実行 ・Openssl ディレクト リに移動 [ root@rpm-test-server ~ ] # cd /root/RPM/Openssl/ Dockerfile作成 ・viコマンドにて、Dockerfileの作成を行います。 [ root@rpm-test-server Openssl ] # vi Dockerfile # ベースイメージ FROM rpmbuild_base:8 # 変数 ARG URL_SOURCE0 = " https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm " # ディレクトリ移動 WORKDIR /root/rpmbuild/SOURCES/ # Openssl srpmダウンロード RUN wget $URL_SOURCE0 # ユーザー作成 RUN useradd -s /sbin/nologin mockbuild # 必要なパッケージインストール RUN dnf -y --nogpgcheck install lksctp-tools-devel perl zlib-devel krb5-devel # Openssl srpmインストール RUN rpm -ivf openssl-1. 1 .1g-15.el8_3.src. rpm # ディレクトリ移動 WORKDIR /root/rpmbuild/SPECS/ # srpmからOpensslをビルド RUN rpmbuild -bb openssl.spec # Dockerコンテナ上で、srpmから作成されたOpensslインストールテスト実施 RUN rpm -ivh --force --nodeps --test /root/rpmbuild/RPMS/x86_64/*. rpm # Dockerコンテナ上で、srpmから作成されたOpensslインストール実施 RUN rpm -ivh --force --nodeps /root/rpmbuild/RPMS/x86_64/*. rpm vi コマンドの使い方は、以下記事もご参考ください! ・ vi コマンド【使い方まとめ】 - RAKUS Developers Blog | ラクス エンジニアブログ SRPM ビルド スクリプト 作成 ・viコマンドにて、 SRPM ビルドイメージ作成用 スクリプト の作成を行います。 [ root@rpm-test-server Openssl ] # vi rpmbuild.sh # 変数 NAME_RPM = ' openssl ' VERSION = ' 1.1.1g ' # ビルドされたrpmを配置する際のディレクトリ作成 mkdir -p /tmp/create-rpmbuild/ # Openssl作成用Dockerイメージ作成 docker build -t $NAME_RPM :latest . # コンテナ終了時にコンテナ自動的に削除 docker run --rm --name $NAME_RPM -itd $NAME_RPM sh # コンテナ上に作成されたRPMをホストOSに状にコピー docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-libs- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-devel- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-static- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-devel- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ # コンテナ停止 docker stop ${NAME_RPM} # Openssl用Dockerイメージ削除 docker rmi ${NAME_RPM} :latest SRPM (Openssl)ビルド スクリプト 実行 ・ SRPM からOpensslの RPM をビルドする スクリプト を実行する。 [ root@rpm-test-server Openssl ] # sh rpmbuild.sh Sending build context to Docker daemon 4 .096kB Step 1 / 11 : FROM rpmbuild_base:8 ---> 47940803c713 Step 2 / 11 : ARG URL_SOURCE0 = " https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm " ---> Using cache ---> 9c6a07f70f2c Step 3 / 11 : WORKDIR /root/rpmbuild/SOURCES/ ---> Using cache ---> 91b3bef3ec6f Step 4 / 11 : RUN wget $URL_SOURCE0 ---> Using cache ---> 2318dc6d3c4a Step 5 / 11 : RUN useradd -s /sbin/nologin mockbuild ---> Using cache ---> 8e57c50993a5 ~~~~~~~~~~省略~~~~~~~~~~ Removing intermediate container 95c6bb93b199 ---> 538078ef2772 Successfully built 538078ef2772 Successfully tagged openssl:latest 3479522ed3d3d981faef54ec5e9a0e831984431377bc9a8cf9b09addb321ff61 openssl Untagged: openssl:latest Deleted: sha256:538078ef2772180b5cc0650f8cecd80474c29a1790991298d2ab05636825279a Deleted: sha256:04c421d5a98c31c6d70ab035da0c964a98d1e54ac679d1604fe8d0e03a076850 Deleted: sha256:013c357eb7ca648af3ad90df4b03a9ada73c11b1f5d32f2286eeed5d4d87831b Deleted: sha256:692bf040e3880686d38953b2744975103dbe0e1970d159bb7d77dfb4faa44cb6 Deleted: sha256:52c42e62f265da49f619d83d2bce9bcc56a38813370715fc18dab699b96e49e4 Deleted: sha256:67025404f47b7ceece317a15d542f7fb7c8caa1053dcbc84512f43eb8d6f8d2c Deleted: sha256:309dc603c2bf6a08897a2b64b758618d2056dc9ef57545e0f9f506acbeb69162 Deleted: sha256:b5e761f711bd787c0ad14fbed4233e6ae6c43f88c9ebe435ec454964e4669060 Deleted: sha256:8d61bbfdc7afa30f88cf2d09ac28e1c7566975d7971b7acbee2e88945521608a Deleted: sha256:419e3d452135275ad35b0f9bba27fc63854a5388e88e49e05ab255e291ad41f7 Deleted: sha256:20d4d5a2b412e5e524a660dcb348ca0c688f7ff9d97ad6f3c36cd21eaa835b35 Deleted: sha256:0c140ce4025c8d1a5fdb6f1124915d8cddea89ddaf5febbb485794c9308c7a1c Deleted: sha256:1fab17399235d6ed8d1c447c9b0ed6419579b5c014c06ed2834c00dfc72a4220 Deleted: sha256:3b9e3b2a67519fb7fec632ea2fd4183f115e7f94ff26634abbee2ceeffa59244 Deleted: sha256:c9b708f383b8f88a7febd8db97608dc7b25abb388a30873233616c49ff77a544 Deleted: sha256:6a1390ee9ac3c3b59ff887240ef0f4d3e18dd7da295c580d3095bea1813baace Deleted: sha256:898ff5c05d6799e520cf185a4ccfc7c049fe5813f1cb6721f96a64bee8718db5 RPM が作成されているか確認する ・Dockerコンテナ上で、Opensslの RPM が作成され、ホストOSに RPM がコピーされていることを確認 [ root@rpm-test-server Openssl ] # ls -l /tmp/create-rpmbuild/ 合計 6500 -rw-r--r--. 1 root root 722616 10 月 16 03:39 openssl-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 2427736 10 月 16 03:39 openssl-devel-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 1532836 10 月 16 03:39 openssl-libs-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 1963936 10 月 16 03:39 openssl-static-1. 1 .1g-15.el8.x86_64. rpm 最後に いかがでしたでしょうか。 今回はDockerの基本的な説明を交えながら、ハンズオン形式でCentOS8環境にDocker環境の構築を行いDockerfileを元に Dockerイメージ作成~Dockerコンテナ上で、 SRPM からOpensslの RPM の作成を行いました。 この記事がCentOS8環境でDockerを使おうとしているエンジニアの助けとなれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
はじめに 皆様こんにちは。インフラ開発課でインフラエンジニアとして勤務しておりますryskwです。 わたしはプログラムなどまったくの未経験で ラク スに採用していただきましたが、最近になってエンジニアであればやはり何かプログラミング的な学習をしたいと思っているところです。 せっかくなので課内で扱う方も多い Python をやってみたいと思い色々と書籍を読み始めたりしているので、今回は Python に限らず スクリプト を組むうえでも使用する機会の多いであろうif文について 、自己学習もかねてまとめていきたいと思います。 そのため本記事は Python を最近触り始めたばかりの人 が読んでいただくことを想定しております。 目次 はじめに 目次 Pythonとは Python if文の書式 Python if文で条件式で使用する演算子と注意点 Python if文で条件文を追加したいとき おまけ 最後に Python とは Python をざっくりと語るのであれば、 プログラミング言語 の中でも少ない ソースコード でわかりやすいコードが書けることから、プログラミング教育や初心者向けの プログラミング言語 として多く利用されていることなどが特徴としてあげられることが多いと思います。作成したコードを コンパイル する作業も不要であり、エラーがあったとしても確認が容易であることもプログラミング初心者にとってはとっつきやすい点の一つになるかと思います。 個人的に Python でできることの中でも特に興味があることとしては、 機械学習 や ディープラーニング などの分野で分析ツールの作成において Python が利用されていることにあります。 Python には開発者向けに便利なライブラリがたくさん公開されているので、慣れてくるとやりたいことがなんでもできるようになるんじゃないか、というプログラミングに対してふわっとした期待感が持てます。 Python if文の書式 それではまずは Python でのif文について簡単に説明します。 Python に限りませんが、if文は条件によってその後の処理を行うかどうかプログラム内で分岐処理を行いたいときに使用する構文です。 わかりやすく表現するのであれば、「もし○○のときは××する。」といった具合ですね。 if文では、条件式(条件として実行した処理)の結果がTrueかFalseで判断し、Trueの場合に続く処理を実行します。 たとえば、 Python のコードの中でnumberという変数を使用し、条件としてその中に代入された数字が3よりも大きい場合に「3より大きいです」と表示させるには、以下のように記述します。 $ cat test.py number = 5 if number > 3 : print ( '3より大きいです' ) $ python3 test.py 3 より大きいです $ ※ Python if文の書式において、printの処理の箇所でインデントを下げているのは、 「ここは Python のコードの中でif文で条件が分かれた後の処理ですよ」ということが見た目にわかるだけでなく、 Python がコードと処理を正しく認識するためにも必要です。 インデントがおかしいと Python プログラム実行時にエラーが表示されてしまいます。 試しにif文の条件分岐後のprint処理をインデントを下げずに記述して Python を実行してみると、以下のようなエラーが表示されました。 $ cat test_error.py number = 5 if number > 3 : print ( '3より大きいです' ) $ python3 test_error.py File "test_error.py" , line 4 print ( '3より大きいです' ) ^ IndentationError : expected an indented block $ ちなみに Python においては、if文などでインデントを下げる場合は一般的に半角スペース4つ分とするようです。 もしif文の条件との比較の結果、Falseだった(条件に当てはまらなかった)場合には何も処理が行われません。 先ほどよりnumberに代入する値を小さくしてみましょう。 $ cat test_false.py number = 1 if number > 3 : print ( '3より大きいです' ) $ python3 test_false.py $ この場合では、numberという変数に入っている1が、if文の条件で比較対象となった3より小さかったために Python を実行しても結果に何も表示されませんでした。 Python if文で条件式で使用する 演算子 と注意点 演算子 if文での条件式では、数字や文字列の一致、不一致などによって判断させます。 その際、条件比較するために使用する代表的な 演算子 は以下のようなものがあります。 記号 内容 例 == 左辺と右辺が等しければTrueを返す 1 == 1 != 左辺と右辺が等しくなければTrueを返す 1 != 2 < 左辺よりも右辺のほうが大きければTrueを返す 1 < 2 > 左辺が右辺よりも大きければTrueを返す 2 > 1 <= 左辺が右辺以下ならばTrueを返す 1 <= 2 >= 左辺が右辺以上ならばTrueを返す 2 >= 1 また、他にも以下のような比較 演算子 が Python if文では使用できます。参考にしてみてください。 記号 内容 例 is 2つのオブジェクトが同一であればTrueを返す 1 is 1 is not 2つのオブジェクトが同一でなければTrueを返す 1 is not '1' 注意点 Python if文で比較を行う際には、比較するオブジェクトが数字か、文字列なのかなど、同じオブジェクト同士での比較になっているか注意が必要です。 Python では整数のオブジェクトにはint型、文字列にはstr型、となっています。 if文で比較する際にはこの型が一致していなければ Python は正しくプログラムを動かしてくれません。 もしif文で比較したい型が条件の前後で異なっていた場合、 Python はエラーを表示します。 試しに、変数numberに文字列としての5を代入し、if文では整数の3と比較させてみましょう。 $ cat test_str_err.py number = '5' if number > 3 : print ( '3より大きいです' ) $ python3 test_str_err.py Traceback (most recent call last): File "test_str_err.py" , line 3 , in <module> if number > 3 : TypeError : '>' not supported between instances of 'str' and 'int' $ このような場合は、if文の条件式で比較したい対象を前述したint型、str型、といった型で明示的に指定してあげることもできます。 $ cat test_int.py number = '5' if int (number) > 3 : print ( '3より大きいです' ) $ python3 test_int.py 3 より大きいです $ Python if文で条件文を追加したいとき Python if文の比較結果がFalseだったときにも処理を行いたいとき if文では比較の結果がTrueだったときに処理を行う構文になっておりますが、もし比較の結果がFalseだったときにも何か処理を実行したい場合があるかもしれません。 そんなときはif文にelseの処理を追加することで対応が可能です。 $ cat test_if_else.py number = 5 if number > 4 : print ( '4より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_else.py 4 より大きいです $ 上記の場合では、変数numberが5であり条件の4よりも大きいため、一つ目のブロックでif文の結果でTrueが返ります。 よってif文の実行結果として出力されるのは「4より大きいです」となりました。 ところが、変数numberが3であった場合はどうでしょうか。 その場合、一つ目のif文で比較された結果、Falseが返ります。 $ cat test_if_else.py number = 3 if number > 4 : print ( '4より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_else.py 4 以下です $ Falseが返ると、「そうでない場合は」という条件であるelseでの処理になるため、 Python の処理を実行すると結果は「4以下です」となりました。 Python if文で条件を複数設定したいとき また、 Python のif文で条件を分岐したあと、さらに条件を追加して処理を分岐したい、と思うことがあるかもしれません。 「もし○○のときは××する。もし★★のときは■■する。そうでないときは▲▲する。」といった具合に、条件を増やして分岐先の処理を増やしたいときには、「if elif else」構文で対応が可能です。 以下はif文の条件を3つにした場合の例です。 $ cat test_if_elif_else.py number = 4 if number > 10 : print ( '10より大きいです' ) elif number > 5 : print ( '5より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_elif_else.py 4 以下です $ また、if文の中でさらにif文によって条件分岐を行いたいときもあるかと思います。 そういった場合では、インデントをさらに一つ下げることでif文の処理を継続することが可能です。 (if文のネスト( 入れ子 )構造と呼びます。) $ cat test_if_if.py number = 10 if number > 4 : if number <= 8 : print ( '8以上です' ) else : print ( '4より大きく8未満です' ) else : print ( '4未満です' ) $ python3 test_if_if.py 4 より大きく 8 未満です $ また、 入れ子 構造になっているif文の比較を「and」や「or」を用いて書くこともできます。 日本語で言うところの「○○かつ■■」や「××または△△」といった条件のことを指す、といえば少しわかりやすいかもしれません。 一つ前の Python 実行例の中のif文をandで書きなおすと以下のようになります。 $ cat test_and.py number = 10 if number > 4 and number <= 8 : print ( '4より大きく8以下です' ) elif number > 4 and number > 9 : print ( '9より大きいです' ) else : print ( '4未満です' ) $ python3 test_and.py 9 より大きいです $ おまけ 最後に、 Python のfor文とif文とを組み合わせることで、「同じ処理を繰り返して、特定の回数以上処理を繰り返したらそこで処理を終了する」というコードを書いてみたいと思います。 for文ではリスト内のすべての要素に対して繰り返し処理を実行したい場合などに便利です。 今回は、1から10の数字をfor文によって次々と変数numberに代入していき、「もし繰り返しが5回目になったら処理を中断する」処理にしてみます。 $ cat test_if_for.py for number in range ( 1 , 10 ): print ( '{}回目の処理です' .format(number)) if number >= 5 : print ( '5回目の処理になったので処理を中断します' ) break $ python3 test_if_for.py 1 回目の処理です 2 回目の処理です 3 回目の処理です 4 回目の処理です 5 回目の処理です 5 回目の処理になったので処理を中断します $ 上記では、 Python のfor文を利用して処理の回数を表示するのを繰り返しており、条件として繰り返しの回数(変数number)が5以上となったときに、if文の条件分岐によって処理が終了するようにコードが記載されています。 そのため、「5回目の処理です」と出力した後のif文の分岐で条件に一致したため「5回目なので処理を中断します」と出力され、 Python の実行が完了しました。 最後に いかがだったでしょうか。 Python は書式さえ覚えることができれば比較的に簡単にプログラムができるんじゃないかと思います。 Python if文をいくつか組み合わせるだけでも、やりたいことの実現も少し見えてくるのではないでしょうか。 私もまだ勉強中の身ではありますが、慣れてきたらサーバのログ分析ツールなどを Python で作ってみたいと考えています。 ご覧いただきありがとうございました。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
初めまして。 ラク スでインフラを担当していますru369と申します。 今回は 冗長化 についてご参考になればいいなと思い、本記事にまとめさせていただきました。 ▼まずは冗長化の意味から! ▼keepalivedを使って冗長化 サーバの情報 諸々インストール 冗長化の確認等に利用するシェルスクリプト3つ keepalivedの設定ファイル keepalivedを起動と冗長化の状態確認 ▼動作テスト 1.MASTER側のkeepalived/nginxを停止したらBACKUP側にVirtual IPが付与され冗長化を確認できるか 2.MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され冗長化を確認できるか 3.メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり冗長化を確認できるか ▼まとめ ▼まずは 冗長化 の意味から! システムの一部に何らかの障害が発生した場合に備えて、 障害発生後でもシステム全体の機能を維持し続けられるように、 予備装置を平常時からバックアップとして配置し運用しておくこと 引用元: wikipedia 簡単に言うと【継続したサービス提供のために本稼働サーバとは別にもう1台備えておく= 冗長化 】ということですね。 今回はnginxが動いているサーバの 冗長化 を試みます。 冗長化 には keepalived を使ってみたいと思います。 ▼ keepalived を使って 冗長化 サーバの情報 テスト1号機【MASTER】 172.20.100.95 テスト2号機【BACKUP】 172.20.100.96 Virtual IPaddress(冗長化用) 172.20.100.98 OS Centos 7.9 ※selinux、firewalldは無効化してます 諸々インストール 〇 keepalived yum パッケージで keepalived は提供されているのでサクッとインストール # yum -y install keepalived 〇nginxインストール&起動、確認 nginxのyumリポジトリを追加 /etc/yum.repos.d/nginx.repoに以下の内容を記述 ****************************** [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 ****************************** # yum install -y nginx # systemctl start nginx 冗長化 の確認等に利用する シェルスクリプト 3つ check_test1.sh nginxサービスの起動/停止状況をチェックする スクリプト check_test2.sh nginxサービスのプロセスの状態をチェックする スクリプト check_test3.sh メンテナンスモードかどうかをチェックする スクリプト keepalived の設定ファイル ◇テスト1号機【MASTER】側 /etc/ keepalived / keepalived .conf ! Configuration File for keepalived global_defs { } vrrp_script check_test { script "/etc/keepalived/check_test1.sh" interval 2 fall 2 rise 2 } vrrp_script check_test_processes { script "/etc/keepalived/check_test2.sh" interval 2 fall 2 rise 2 } vrrp_script check_test_mode { script "/etc/keepalived/check_test3.sh" interval 2 weight 50 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 virtual_ipaddress { 172.20.100.98 } track_script { check_test check_test_processes maintenance_mode } } ◇テスト2号機【BACKUP】側 ※MASTER側と異なるところのみ抜粋 priority 100 keepalived を起動と 冗長化 の状態確認 # systemctl start keepalived 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 サーバ間で共有するVirtual IPaddress 172.20.100.98 がMASTER側に付与されて 冗長化 されていそうな感じです。 動作テストで 冗長化 されているかを確認していきたいと思います。 ▼動作テスト 以下のパターンで 冗長化 の動作テストしていきます。 MASTER側の keepalived /nginxを停止したらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり 冗長化 を確認できるか 1.MASTER側の keepalived /nginxを停止したらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか 【MASTER】 # systemctl stop keepalived # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 Virtual IPaddressがBACKUP側に移動して 冗長化 を確認できました。 nginx停止の場合は以下の通り # systemctl stop nginx # systemctl is-active nginx inactive ★参考までに切り替わっている最中に ping 飛ばしてみました。 # ping 172.20.100.98 64 bytes from 172.20.100.98: icmp_seq=9 ttl=64 time=0.405 ms 64 bytes from 172.20.100.98: icmp_seq=10 ttl=64 time=0.412 ms 64 bytes from 172.20.100.98: icmp_seq=12 ttl=64 time=2.18 ms  ★ここで切り替わった 64 bytes from 172.20.100.98: icmp_seq=13 ttl=64 time=0.288 ms 64 bytes from 172.20.100.98: icmp_seq=14 ttl=64 time=0.314 ms 2.MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか MASTER側のnginxにSIGSTOPを送信して、nginxを停止状態とする 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 # ps -C nginx -o comm,command,pid,state COMMAND COMMAND PID S nginx nginx: master process /usr/ 114281 S nginx nginx: worker process 114282 S # pkill -SIGSTOP nginx  ★ハングアップさせた # ps -C nginx -o comm,command,pid,state COMMAND COMMAND PID S nginx nginx: master process /usr/ 114281 T nginx nginx: worker process 114282 T # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 こちらのパターンでもVirtual IPaddressがBACKUP側に移動して 冗長化 を確認できました。 3.メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり 冗長化 を確認できるか /etc/keepalived/maintenance というファイルがあれば、priority値が50下がり、MASTERとBACKUPが入れ替わる想定 〇メンテナンス用ファイル設置前後でのpriority値の変化 MASTER BACKUP 設置前のpriority値 1号機側:101 2号機側:100 設置後のpriority値 1号機側:51 2号機側:100  ⇒設置後は2号機側(もとBACKUP側)のpriority値が高くなるのでMASTERとして昇格する。 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 # touch /etc/keepalived/maintenance # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 ★このままBACKUP側にメンテナンス用のファイルを設置してみると元に戻る想定 元MASTER 元BACKUP 2号機側への設置前 priority値 1号機側:51 2号機側:100 2号機側への設置後 priority値 1号機側:51 2号機側:50 【BACKUP】 # touch /etc/keepalived/maintenance # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 想定通りMASTER/BACKUPが入れ替わり 冗長化 を確認できました! 冗長化 しているとメンテナンスするとき結構便利な印象です。 冗長化 、一考の余地あり...。 ▼まとめ 今回の 冗長化 は明示的にMASTER,BACKUPを設定してみましたが、confのstateをどちらもBACKUPにすることでフェイルバックを防ぐこともできます。 また、 keepalived では 冗長化 の他にconfでnotification_emailを使ってアラート通知を飛ばしてみたり、notifyを利用したステータスチェックもできるみたいです。 色々と設定できそうなことがあるので運用状況にあったものを 冗長化 する際に検討する必要がありそうです。 この記事が少しでも皆様の幸せになることを願って。 ※参考にしたページ https://weblabo.oscasierra.net/nginx-centos7-install/ https://qiita.com/hana_shin/items/bda169d8d24f5954a992 https://mseeeen.msen.jp/build-cluster-with-keepalived-on-centos-7/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
はじめに 皆さん初めましてmonga3です。 今回は Linux 上で文字列を処理することに便利な sed コマンド について紹介していきます。 sed コマンドの基本から実務での使用方法を交えて説明します。 Linux の理解をより深めたい方へ以下関連おすすめブログ ・ ls コマンド 【使い方 まとめ】 ・ find コマンド 【使い方 まとめ】 ・ sed コマンド【使い方 まとめ】 ・ vi コマンド【使い方まとめ】 ・ よく使うLinuxコマンド一覧【最新版】 ・ Linuxのファイル操作でよく使うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~ ・ 【Linux】今振り返りたい、プロセスって何? 目次 はじめに 目次 sed コマンドとは 使い方 コマンド オプション アドレス 基本的な使い方 応用編 Linuxコマンド おすすめ書籍 sed コマンド まとめ sed コマンドとは 「stream editor」の略称で、指定したファイルをコマンドに従って処理することが出来る。 入力を行単位で読み取り、テキスト変換などの編集をおこない行単位で出力する。 正規表現 に対応している。 使い方 sed [オプション] コマンド 入力ファイル名 コマンド どういう処理をしたいかをコマンドで指定します。 処理内容の出力、削除、文字列の追加、置換などの処理を行えるコマンドが用意されています。 コマンド 説明 [=] 現在の行番号を出力します。 [#] コメント [a 文字列] 指定した位置の後ろに文字列を追加します。(改行する場合は改行前の文字列に[/]を付ける。) [i 文字列] 指定した位置の後ろにテキストを挿入します。(改行する場合は改行前の文字列に[/]を付ける。) [c 文字列] 選択した行をテキストに置き換えます。(改行する場合は改行前の文字列に[/]を付ける。 [q] 入力を中断し、それ以上処理を行わず終了します。(※未出力分があれば出力してから終了します。) [Q] 入力、出力をせずに終了します。 [d] 指定した行を削除します。 [l 文字数] 指定した文字数で改行します。 [p] 処理した内容を出力します。-n オプションと組み合わせて使うことがあります。 [P] 処理した内容を出力します。 [r ファイル名] ファイルを先頭に追加します。 [s/置換前文字列/置換後文字列/] (置換前文字列)で指定した文字列にマッチした部分を置換後文字列へ置き換えます。また複数マッチした場合は先頭のみ置換を行い、対象全て置換を行う場合は[s/置換前/置換後/g]のように[-g]オプションを併用します。 [y/元の文字列/対象文字列/] (元の文字列)のものを(対象文字列)の同じ位置に存在する文字列に置換します。(※[tr]コマンドのように使用可能です。) オプション コマンド実行時のオプションを指定できます。 オプション 説明 [-e( スクリプト )] スクリプト をコマンドに追加します。複数指定すれば、複数回のコマンドを実行できます。 [-E] 拡張正規表現 を利用する時に使用します。 [-f(ファイル名)] スクリプト が記述されているファイルを指定します。ファイルに記載されているコマンドを実行することが出来ます。 [-i] 直接ファイルを編集します。 [-i(拡張子)] ファイルを直接編集して、指定した拡張子でバックアップを行います。 [-n] 出力コマンドのみ出力します。 [-l (文字数)] lコマンドの出力行を折り返す長さを指定します。 [-r] 拡張正規表現 を利用する時に使用します。(Eと同じ) アドレス 特定の行だけを処理したい場合は、コマンドの前に処理対象の位置を指定します。 これをアドレスといいます。アドレスは数字と「$」、 正規表現 が使用できます。 アドレスの後に「!」を付けると、アドレスで指定した意外という意味になります。 アドレス 説明 [数字] 行番号として認識されます。 [$] 最終行として認識されます。 [/ 正規表現 /] 正規表現 にマッチした行をコマンド処理します。 [開始行,終了行] 開始行から終了行を指定できます。 [開始行˜数字] 開始行から処理を開始して、数字で指定した間隔を処理の対象行とします。「10˜4」とした場合は10行目、14行目、18行目と4行間隔になります。 [アドレス,+数字] アドレスで指定した行の次から数字で指定した行を対象行として処理します。「/ 正規表現 /,+4」 正規表現 にマッチする行から4行分が処理対象となります。 基本的な使い方 ここでは sed コマンドの使い方を説明します。 コマンド、オプション、アドレスを組み合わせることで以下のテキスト編集が出来ます。 sample.txtというファイルを sed コマンドで編集するという想定で説明します。 条件に一致した行で最初の箇所を置換する 小文字のrakusを大文字のRAKUSに置換します。 sed -e ' s/rakus/RAKUS/ ' sample.txt #例:sample.txt 1.rakus rakus 2.rakus # 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。 # 1行目の2つ目の「rakus」は変換されません。 1.RAKUS rakus 2.RAKUS 条件に一致する全ての箇所を置換する gを付けることで条件に一致する全て箇所の「rakus」を「RAKUS」に置換します。 sed -e ' s/rakus/RAKUS/g ' sample.txt #例:sample.txt 1.rakus rakus 2.rakus # 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。 # 条件に一致する全て箇所の「rakus」が変換されます。 1.RAKUS RAKUS 2.RAKUS 空白(半角スペース)をタブに置換 編集したいファイルの空白(半角スペース)をすべて削除します。 「\t」は 正規表現 です。 sed -i " s/ / \t /g " sample.txt 空白(半角スペース)を削除 編集したいファイルの空白(半角スペース)をすべて削除します。 sed -i " s/ //g " sample.txt 空白行を削除 正規表現 の「^$」と削除コマンドの「d」使用します。 sed -i ' /^$/d ' sample.txt 連続するスペースまたはタブをスペースに全て置換 sed -E ' s/[\t ]+/ /g ' アドレスを指定して、指定行を削除 5行目を指定して削除します。 sed -e 5d 正規表現 にマッチする行のみ出力 sed -n -e /正規表現/p 行番号で範囲を指定して抽出 1行目から5行目を範囲指定しています。 sed -n -e 1 ,5p sample.txt 行番号で範囲を指定して削除 1行目から5行目を範囲指定しています。 sed -e ' 1,5d ' sample.txt 編集するファイルの指定方法 ファイル編集の方法は以下の3つあります。 # 指定した入力ファイルを直接編集します。 sed -i " s/ //g " sample.txt # 入力ファイルを直接編集しないで、編集結果を別ファイルとして出力します。 # 入力ファイル名を「対象ファイル名 > 出力ファイル名」と指定します。 sed -e " s/ //g " sample.txt > sample_2.txt # 実行結果 sample.txt #こちらのファイルは編集されません。 sample2.txt #コマンド実行を指定したファイル名で作成します。 # バックアップファイルを作成して、指定したファイルを編集する。 # オプションの「-i」 の後ろに「.bak」を付けると、拡張子が「.bak」のバックアップファイルを作成してくれます。 sed -i .bak " s/ //g " sample.txt # 実行結果 sample.txt #こちらのファイルを編集します。 sample.txt.bak #編集前のファイルのバックアップを作成します。 応用編 この応用編では sed コマンドを他のコマンドと組み合わせて使用する方法を説明します。 他のコマンドを組み合わせることで、多様なテキストファイルの編集を行うことが出来ます。 ファイルを参照するcatコマンドを使用して、文字列を置換した部分の行のみ出力する cat sample.properties | sed -n s/rakus/Rakus/p ファイルや ディレクト リを検索するfind コマンドを組み合わせて、一致する条件に一致するファイルの envファイルの5行目に記述されている「 http://localhost 」を「 http://localhost:8080 」に変更する find ./ -type f -name *.env | xargs sed -i -e ' 5s|http://localhost|http://localhost:8080| ' 置換したあとに、キーでソートする 「|」をタブに置換しています。 その後にsortコマンドで行をソートしています。 「 > sample_2. csv 」とすることで、元ファイルを編集せずに結果を「sample_2. csv 」として出力しています。 sed -e " s/|/ \t /g " sample_1.csv | sort -t $' \t ' -k 1 > sample_2.csv Linux コマンド おすすめ書籍 [改訂第3版]Linuxコマンドポケットリファレンス Linux 操作に必要なコマンドを収録したポケットリファレンス LinuxコマンドABCリファレンス 開発現場で使用されるコマンドを厳選し収録したコマンドリファレンス sed & awkプログラミング 改訂版 sed と awk に焦点を当てた解説書で基本動作から スクリプト の書き方までを丁寧に解説 正規表現 についての解説も充実している sed コマンド まとめ 今回は sed コマンドについて使い方をまとめました。 アドレス、コマンド、オプションと覚えることは複数あり大変ですが、テキストファイルの編集作業をやる時は手作業で1ファイルずつやるより、 sed コマンドを使用した方が正確性が上がるので、機会があれば試してください。 他のコマンドと組み合わせることで、テキストファイルの編集、指定したキーでのソート、ファイルの結合などができるようになります。 これらの一連のコマンドを シェルスクリプト にすれば、さらに利便性が上がると思います。 手作業でファイル編集をやるには、少し大変と思った時には sed コマンドでの編集を検討してみてください。 Linux コマンドの一つ、 awk コマンドについて以下の記事でまとめられているので、ぜひ参照してください。 初心者のためのawkコマンド - RAKUS Developers Blog | ラクス エンジニアブログ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
目次 はじめに AWSとは AWSの主要サービス 環境準備 Webサーバーの構築 動作確認 終わりに はじめに 初めましてこんにちは!新卒1年目のkirrksです。今回は、一度は耳にしたことがある クラウド サービス「 AWS 」に フォーカスし、Webサーバーの構築を通して AWS の主要サービスはそれぞれどのような使い方をするのかをざっく りと学べる内容となっております。 「 AWS ってどんなのも?」「 AWS を利用してサーバ構築をしてみたい」 という 方々のお力になれればと思います。今回は初めて AWS に触れる方向けの内容となっておりますので、「Webサーバ ーの構築方法を知りたい!」という方は目次から飛んでいただければと思います。 AWS とは AWS ( Amazon Web Services )とは クラウドコンピューティング サービスの一つです。 クラウドコンピューティング サービスを簡単に言えば、サーバーやネットワークなどをインターネット経由で貸してくれるサービスで、いつで もどこからでも始めることができます。 Amazon S3 や Amazon VPC という言葉を耳にしたことがあるのではないで しょうか?これらは AWS が提供しているサービスの名前です。 AWS ではさまざまなサービスを組みあわせることによって、あらゆるアプリケーションやインフラを実現することができます。また、バラバラの事業者からそれぞれ借りなければならなかったインフラを、一括で借りれること、OSやWebサーバー、データベースサーバーなどに必要なソフトウェアまで丸ごと手配することができます。 AWS の主要なサービについて ここでは AWS でよく使われる主要サービスについて、特徴や利用用途などを踏まえながら紹介していきます。 Amazon VPC Amazon VPC ( Amazon Virtual Private Cloud)とは、 AWS の提供する AWS アカウント専用の仮想ネットワークです。ネット ワークやサブネットの範囲、ルートテーブルやネットワーク ゲートウェイ の設定など、仮想ネットワーキング環境を設定できます。 Amazon EC2 Amazon EC2 ( Amazon Clastic Compute Cloud)とは、 AWS 上でコンピューティング キャパシティー を提供するサービスです。 サーバに必要なものを一式で借りることができます。 Amazon S3 Amazon S3 ( Amazon Simple Storage Service)とは、 AWS 上でデータをオブジェクト単位で管理する形式のオブジェクトストレージ サービスです。大きな特徴としては、多機能であることです。誰でも簡単に利用できるようさまざまな機能が用意されています。 Amazon RDS Amazon RDS( Amazon Relational Database Service)とは、 AWS 上でリレーショナルデータベースである6種類の製品を、最適な動作条件で利用できるサービスです。具体的には Amazon Aurora 、 PostgreSQL 、 MySQL 、 MariaDB 、 Oracle Database、 SQL Server に対応しています。 Amazon Route53 Amazon Route53とは、 AWS 上の DNS ( ドメイン ネームサービス)です。 DNS とは Webブラウザ に入力したURLを「 IPアドレス 」変換する 仕組みです。これを名前解決といいます。 ELB ELB(Elastic Load Balancing)とは AWS が提供する ロードバランサー です。 ロードバランサー とは、サーバーに集中するアクセス( トラフィック ) を、複数のサーバやネットワークに振り分けるしくみです。1つのサーバにかかる負荷を分散させるので、負荷分散装置ともいいます。 CloudWatch CloudWatch( Amazon Cloud Watch )とは、 AWS 内部のリソースを監視するためのツールです。基本的に無料で利用することができます。 また、マネージドサービスとして動作しているため、CloudWatch自身を監視する必要はありません。 Billing and Cost Management Billing and Cost Managementとは、 AWS 料金見積ツールで、見積もりや予算に関連する機能を提供しています。 AWS のアカウントの作成や ログインは不要で、誰でも無料で利用することができます。 環境準備 では実際に AWS のサービスを利用してWebサーバーを構築するための準備を行っていきます。 AWS 登録 以下のリンクから AWS への登録をお願いします。 AWS にログインする際は、ルートユーザーではなく、IAMユーザでログインしましょう。 aws.amazon.com Webサーバーの構築 ではこれから AWS 上にWebサーバの構築を行っていきます。 手順としては以下のようになります。 仮想ネットワーク作成(AWS) VPC作成 サブネット作成 インターネットゲートウェイ作成 ルートテーブル作成 セキュリティグループ作成 Webサーバーを用意 (AWS) キーペア作成 EC2インスタンス作成 SSH接続 Apacheインストール HTMLファイル配置 ロードバランサーを用意(AWS) ターゲットグループ作成 ロードバランサー作成 独自ドメインとDNSを用意(AWS) ドメイン名取得 パブリックDNSにリソース追加 SSLサーバー証明書を発行 1. 仮想ネットワーク作成( AWS ) ここから AWS のリソースを作成していきます。 まず、インフラの管理者が自由に様々なサービスを構築できるよう AWS 上に仮想ネットワーク作成します。 1-1. VPC 作成 それでは、 AWS マネジメントコンソールから VPC を作成していきます。 まず、 AWS コンソール画面の左上にある「サービス」メニューから、 VPC ダッシュ ボードを開き、[ VPC を作成]をクリックします。 「 VPC 作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[ VPC を作成]をクリックします。 これで VPC が作成されました。 1-2. サブネット作成 今回は 冗長化 のために2つのwebサーバを AWS 上に構築予定なので、 アベイラビリティ ーゾーンとパブリックサブネットも2つ作成していきます。 作成するサブネットの情報は以下のようになっています。 パブリックサブネット1 VPC ID : VPCのID サブネット名 : web-test-subnet-public01 アベイラビリティーゾーン : ap-northeast-1a IPv4 CIDRブロック : 10.0.0.0/20 パブリックサブネット2 VPC ID : VPCのID サブネット名 : web-test-subnet-public02 アベイラビリティーゾーン : ap-northeast-1c IPv4 CIDRブロック : 10.0.16.0/20 それでは、 AWS マネジメントコンソールからサブネットを作成していきます。 VPC の ダッシュ ボードから「サブネット」を開き、[サブネットを作成]をクリックします。 「サブネット作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[サブネットを作成]をクリックします。 これでパブリックサブネット1が作成されました。 同じ手順でパブリックサブネット2の作成も行ってください。 2つのサブネットが作成されているのを確認します。 1-3. インターネット ゲートウェイ 作成 ここではインターネットと VPC 内のリソースが相互に通信するために、インターネット ゲートウェイ を作成します。 それでは、 AWS マネジメントコンソールから AWS 上にインターネット ゲートウェイ を作成していきます。 VPC の ダッシュ ボードから「インターネット ゲートウェイ 」を開き、[インターネット ゲートウェイ の作成]をクリックします。 「インターネット ゲートウェイ 作成」画面が表示されるので、以下のように入力します。 入力/選択が終わったら、一番下の[インターネット ゲートウェイ を作成]をクリックします。 これでインターネット ゲートウェイ が作成されました。 次に作成したインターネット ゲートウェイ を VPC にアタッチします。 作成したインターネット ゲートウェイ の右側にある「アクション▼」から「 VPC にアタッチ」を選択します。 次にアタッチする VPC を選択します。 選択が終わったら、[インターネット ゲートウェイ のアタッチ]をクリックします。 これでインターネット ゲートウェイ が VPC にアタッチされました。 1-4. ルートテーブル作成 ここでは AWS 上のサブネット間通信経路を設定するために、ルートテーブルを作成します。 作成するパブリックサブネット用ルートテーブルの情報は以下のようになっています。 名前タグ : web-test-rt-public VPC : 先ほど作成したもの それでは、 AWS マネジメントコンソールからルートテーブルを作成していきます。 VPC の ダッシュ ボードから「ルートテーブル」を開き、[ルートテーブルを作成]をクリックします。 以下のように設定が終わったら、[作成]をクリックします。 これでパブリックサブネット用ルートテーブルが作成されました。 次にルートテーブルの設定を行います。 作成したルートテーブルにチェックをし、「ルート」タブを選択して[ルートの編集]をクリックします。 「ルートの編集」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[変更の保存]をクリックします。 次にルートテーブルが属するサブネットを指定します。 「サブネットの関連付け」タブを選択して、「サブネットの関連付けの編集」をクリックします。 以下のように関連付けるサブネットにチェックを入れたら、[保存]をクリックします。 これでパブリックサブネット用ルートテーブルが完成しました。 1-5. セキュリティグループ作成 ここでは外部からのアクセスに制限をつけるために、 AWS 上にセキュリティグループを作成します。 作成するセキュリティグループの情報は以下のようになっています。 セキュリティグループ名 : wet-test-sg-elb 説明 : for load balancer VPC : 先ほど作成したVPC インバウンドルール : (タイプ)HTTP (ソース)0.0.0.0/0 (タイプ)HTTPS (ソース)0.0.0.0/0 (タイプ)SSH (ソース)マイIP それでは、 AWS マネジメントコンソールからセキュリティグループを作成していきます。 VPC の ダッシュ ボードから「セキュリティグループ」を開き、[セキュリティグループを作成]をクリックします。 「セキュリティグループ作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[セキュリティグループを作成]をクリックします。 これでセキュリティグループが作成されました。 以上で仮想ネットワーク作成が完了しました。 2. Webサーバーを用意 ( AWS ) ここではブラウザからリク エス トを受けて、Webページを返すために AWS 上にWebサーバを作成します。 2-1. キーペア作成 まず、 SSH 接続を行うときに必要となるキーペアの作成をします。 それでは、 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「キーペア」の画面を開き、[キーペアを作成]をクリックします。 「キーペア作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[キーペアを作成]をクリックします。 これでキーペアが作成されました。そのときキーペアがタウンロードされているのを確認してください。 2-2. EC2 インスタンス 作成 次に、 AWS マネジメントコンソールからEC2( インスタンス )を作成していきます。 まず、 AWS コンソール画面の左上にあるサービスメニューから、EC2の ダッシュ ボードを開きます。 そこから「 インスタンス を起動」をクリックします。 「ステップ1: Amazon マシンイメージ(AMI)」という画面が表示されます。 ここでは「 Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。 「ステップ2: インスタンス タイプの選択」という画面が表示されます。 今回は無料枠対象の「t2.micro」を選択し、[次のステップ]をクリックします。 「ステップ3: インスタンス の詳細の設定」という画面が表示されます。 以下のように入力/選択します。 ネットワークでは先ほど VPC 作成時に一緒に作成したものを選択してください。 自動割り当てパブリックIPも有効に変更してください。 その他の設定に関しては、今回は変更せず、[次のステップ]をクリックします。 「ステップ4:ストレージの追加」という画面が表示されます。 今回はデフォルトのままで問題ないので、[次のステップ]をクリックします。 「ステップ5:タグの追加」という画面が表示されます。 「タグの追加」をし、[次のステップ]をクリックします。 「ステップ6:セキュリティグループの設定」という画面が表示されます。 [既存のセキュリティグループ]を選択し、先ほど作成したセキュリティグループにチェックを入れ、[確認と作成]をクリックします。 「ステップ7: インスタンス 作成の確認」という画面が表示されます。 内容に誤りがないことを確認後、[起動]をクリックします。 SSH 接続の際に使用する、キー選択画面が表示されます。 先ほど作成したキーペアを選択/チェックし、[ インスタンス の作成]をクリックします。 これでWebサーバー用の インスタンス が AWS 上に作成されました。 Webサーバーは AWS 上に2つ作成するので、2つ目(web-test-02)も同じ手順で作成してください。 2-3. SSH 接続 ここではWebサーバ用 インスタンス に SSH 接続を行います。 今回はログインユーザ名を「ec2-user」とする必要があるので注意してください。(rootユーザではログインできません) また、ダウンロードしたキーペアを登録します。(キーがないとログインできません) 以下のように接続できれば成功です。 2-4. Apache インストール SSH 接続することができたので、ここではWebサーバに ミドルウェア 「 Apache 」をインストールしていきます。 まず、ユーザをrootに切り替えます。 #sudo su - ミドルウェア アップデートをして 脆弱性 の排除を行います。 # yum check-update # yum upgrade Apache をインストールします。 # yum install httpd Apache を 自動起動 する設定に変更しておきます。 enabledになっていれば 自動起動 設定になっています。 # systemctl enable httpd.service # systemctl list-unit-files | grep httpd.service Apache を起動してステータスを確認します。 Activeがactive(runing)になっていれば、起動しています。 # systemctl start httpd.service # systemctl status httpd.service 2-5. HTMLファイル配置 こちらのコマンドで最初に表示されるwebページのファイルを作成します。 # 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の作成・配置が完了しました。 3. ロードバランサー を用意( AWS ) ここではWebサーバに対するリク エス トの分散と SSL 処理を実現するために AWS 上に ロードバランサー を作成します。 3-1. ターゲットグループ作成 まず、 AWS 上で ロードバランサー からWebサーバにアクセスするときに関係する設定を行うターゲットグループの作成をします。 それでは、 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「ターゲットグループ」の画面を開き、[Create target group]をクリックします。 「ターゲットグループ作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[Next]をクリックします。 「ターゲット登録」画面が表示されるので、作成したEC2にチェックをいれ、「Include as pending below」をクリックします。 すると、登録済みターゲットに インスタンス が追加されます。 (先ほど作成した2つ目の インスタンス も追加してください) 正しく追加したら、[Create target group]をクリックします。 これでターゲットグループが作成されました。 3-2. ロードバランサー 作成 ターゲットグループが作成できたので、 ロードバランサー の作成をします。 EC2の ダッシュ ボードから「 ロードバランサー 」を開き、[ ロードバランサー の作成]をクリックします。 ロードバランサー の種類選択画面が表示されます。 ここではHTTP/ HTTPS 通信に特化した ロードバランサー を選択するために、Application Load Balancer の[Create]をクリックします。 「 ロードバランサー 作成」画面が表示されるので、以下のように入力/選択します。 サブネットには先ほど作成した2つを選択します。 セキュリティグループには先ほど作成したものを追加します。 ターゲットグループには先ほど作成したものを選択します。 概要が間違っていなければ、[Create load balancer]をクリックします。 これで ロードバランサー が作成されました。 4. 独自ドメイン と DNS を用意( AWS ) ここでは AWS 上で IPアドレス を人間にわかりやすい表現にした ドメイン 名の作成、暗号化された通信( HTTPS )を行うための SSL証明書 を発行していきます。 4- 1. ドメイン 名取得 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、Route53の ダッシュ ボードを開きます。 そこから「登録 ドメイン 」の画面を開き、[ ドメイン の登録]をクリックします。 次に ドメイン 名を選択します。 AWS で ドメイン 名を選択するときは、固有の名称+ トップレベルドメイン ( TLD )という組み合わせになります。 今回は以下のような ドメイン を取得します。 チェックをクリックし、指定した ドメイン が取得可能であれば、[カートに入れる]をクリックし、最後に[続行]をクリックします。 次に、 ドメイン の連絡先を登録します。 「プライバシーの保護」を有効化することによって、本来公開される連絡先の情報を非公開にできるので、忘れないようにしてください。 入力に誤りがないことを確認後、[続行]をクリックします。 初めて AWS で ドメイン を取得する場合、以下のダイアログが表示されることがあるので、[同意します]をクリックします。 最後に連絡先の詳細の確認画面が表示されるので、以下のように設定後、[注文を完了]をクリックします。 ドメイン の取得が完了するまでは、注文した ドメイン はRoute53の ダッシュ ボードの「保留中のリク エス ト」で確認できます。 購入手続きが完了すると、Route53の ダッシュ ボードの「登録済み ドメイン 」で確認できます。 4-2. パブリック DNS にリソース追加 Route53経由で ドメイン を取得すると、自動的に取得した ドメイン を管理するパブリック DNS が作成されます。 ここではパブリック DNS に、外部から直接アクセスされるリソース情報( ロードバランサー )を追加します。 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、Route53の ダッシュ ボードを開きます。 そこから「ホストゾーン」の画面を開き、 ドメイン の選択後、[詳細を表示]をクリックします。 「ホストゾーン」の詳細画面が表示されるので、[レコードを作成]をクリックします。 まず、追加するルーティングポリシーを以下のように選択し、[次へ]をクリックします。 次にレコード設定画面が表示されるので、[シンプルなレコードを定義]をクリックします。 「シンプルなレコードを定義」という画面が表示されるので、以下のように入力します。 ここでは先ほど作成した ロードバランサー を選択しています。 設定が終わったので、[レコードを作成]をクリックします。 これで ロードバランサー の情報をパブリック DNS に追加できました。 4- 3. SSLサーバー証明書 を発行 最後に SSL証明書 を発行します。 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、 AWS Certificate Managerの ダッシュ ボードを開きます。 そこから「証明書のプロビジョニング」の[今すぐ始める]をクリックします。 次に取得する SSLサーバー証明書 の種類を選択します。 ここではインターネットで公開する ドメイン のため、「パブリック証明書のリク エス ト」をチェックし、[証明書のリク エス ト]をクリックします。 次に、証明書で証明する ドメイン 名を指定します。ここで注意することとして、証明する ドメイン は、実際にブラウザで入力する ドメイン ( FQDN )です。 先ほどホストゾーンに登録した ロードバランサー の名前を追加し、[次へ]をクリックします。 次に ドメイン の検証方法を指定します。 これは AWS がどのように ドメイン の申請者を検証するかということです。 今回はRoute53を使って DNS サーバを作成しているので、「 DNS の検証」を選択して[次へ]をクリックします。 タグは、追加する必要がないので、そのまま[確認]をクリックします。 最後に入力の確認を行い、誤りがなければ[確定とリク エス ト]をクリックします。 「 DNS の検証」を選択したので、具体的な検証方法が表示されます。 Route53の場合は「Route53でのレコードの作成」が用意されているので、こちらをクリックします。 Route53に対する設定内容がダイアログで表示されるので、問題がなければ[作成]をクリックします。 これで SSL証明書 の申請が終了しました。しばらくは「状況」欄に「検証中」と表示されますが、約5~10分で「発行済み」なります。 次に AWS 上で発行した SSLサーバー証明書 を使って、 HTTPS で待ち受けをするリスナーを ロードバランサー に追加します。 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「 ロードバランサー 」の画面を開き、先ほど作成した ロードバランサー を選択します。 そして「リスナー」タブを選択し、[リスナーの追加]をクリックします。 次にリスナーの設定を以下のようにします。 すべての設定が終わったら、[リスナーの追加]をクリックします。 これでリスナーの追加が完了しました。 動作確認 最後にwebページが正常に表示されるか確認します。 URL入力欄に「 https ://{作成した FQDN }」を入力します。 無事表示されました! 終わりに 長くなりましたが、簡単に AWS 上でWebサーバの構築・Webページの公開ができたのではないでしょうか。 今回はシンプルに AWS でwebサーバを作成しましたが、 ・プライベートサブネット ・NAT ゲートウェイ ・踏み台サーバー ・RDS ・S3 など、よりセキュリ ティー を高めたり、拡張したりすることも AWS ではできます。 AWS では他にも様々なことが出来るので、興味がある方はぜひ挑戦してみてください。 参考文献 中垣健志(2021)「 AWS ではじめるインフラ構築入門」 翔泳社 小笠原種高(2021)「 AWS のしくみと技術がしっくりわかる教科書」技術評論家者 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
皆さん、初めまして、 ラク スでインフラを担当している鈴木(y-suzukikun)と申します。 突然ですが、現在私が担当しているサービスでは、多くの物理サーバを利用しており 今回ご紹介する、 RAID (レイド) により有事の際の耐障害性、システムの信頼性向上を高めています。 既にご存じの方も多い技術かと思いますが、簡単な記事にまとめましたので最後までお読みいただけましたら幸いです。 目次 目次 1.「RAID(レイド)」とは? 2. RAIDの意味 3. RAIDの主な目的など 4.「RAID(レイド)の種類」について 5. 「各RAID(レイド)」仕組みについて 5-1.「RAID0(レイドゼロ)」について 5-2. RAID1(レイドワン) 5-3. RAID2(レイドツー) 5-4. RAID3(レイドスリー) 5-5. RAID4(レイドフォー) 5-6. RAID5(レイドファイブ) 5-7. RAID6(レイドシックス) 5-8. RAID10(レイドイチゼロ) 6. RAID構築時の注意点 7. まとめ 1.「 RAID (レイド)」とは? RAID は(大まかに説明すると)図のように複数のHDD(ハードディスク)を一つのドライブのように認識させるものになります。 RAID のイメージ図 2. RAID の意味 RAID はRedundant Array of Independent Diskの略号となります。 正確には複数のディスクにデータを分散し冗長性デ-タを付加して格納し、ディスク障害のときにユーザデータの再生を可能とするディスクアレイの事を指します。1987年 カリフォルニア大学バークレイ校において論文化されました。(デビット.A.パターソン、ガース ギブソン 、ランディカッツ教授にて) 論文は「A Case for Redundant Arrays of Inexpensive Disks」となります。 Google 検索で確認できますのでご興味のある方は調べてみてください。 3. RAID の主な目的など HDD(ハードディスク)障害時のデータ復旧(信頼性の向上) 複数のHDD(ハードディスク)への分散書込みによる書込・読込の高速化 などなど。※ RAID の種類、目的や構成によって若干異なります。 4.「 RAID (レイド)の種類」について RAID には目的別に機能の異なる「モード」が存在します。 RAID0(ストライピング) RAID1( ミラーリング ) RAID2(ストライピング・ハミングコード) RAID3(ストライピング・ パリティ コード) RAID4(独立R/Wアクセス・ パリティ ディスク固定) RAID5(独立R/Wアクセス・ パリティ ディスク分散) RAID6(独立R/Wアクセス・ パリティ ディスク分散(2台)) RAID10(1+0)( ミラーリング +ストライピング) 5. 「各 RAID (レイド)」仕組みについて 5-1.「RAID0(レイドゼロ)」について RAID0(レイドゼロ)は、データを複数のHDDにある程度まとまった形(ブロック単位)に分割して配置する事で読み込み/書込み速度を向上させる技術です。(データの取り出し、保存のイメージは図のとおりです。) 例えば、データAはHDD1、データBはHDD2のようにデータを同時に複数のHDDに書込み可能な為、HDDが単体1台構成の時よりも高速に動作する事が出来ます。このため、データ使用効率は他 RAID の中で最も良くなります。 しかし、耐障害性(冗長性)が無いため、1台のHDDが故障してしまうと、故障したHDDに保存してあるデータが失われます。 また、RAID0は一般的にストライピングとも呼ばれます。 RAID0_before RAID0_after 5-2. RAID1(レイドワン) RAID1(レイドワン)は、同じデータを複数のHDDに格納する技術です。(データの取り出し、保存のイメージは図のとおりです。) 図のようにAからFまでのデータがある場合、HDD1に格納したデータと同じものをHDD2にも格納します。 この為、もしHDD1が故障しても、HDD2に同じデータが残るため片方のHDDに障害が発生してもデータが保たれます。 しかし、RAID0のような分散型書込みではない為、書き込み読込みに対する動作は高速ではありません。 RAID1は ミラーリング とも呼ばれ、最低2台のHDDから構成する事が可能です。 RAID1_before RAID1_after 5-3. RAID2(レイドツー) RAID2(レイドツー)は、データの分散格納と誤り補正(ハミングコード)を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) データとは別にハミングコードという情報を別のHDDに格納し信頼性を保ちます。 図のように最低5台のHDDから構成可能です。 RAID2ではデータの格納されているHDD1が故障しても、HDD3からHDD5にハミングコードが残る為、データの復旧が可能となります。データ格納用2台のHDDに対して、最低3台のハミングコード用のHDDが必要になるためコストが掛かります。このため、実際の運用ではあまり使われていないのが現状です。 RAID2_before RAID2_after 5-4. RAID3(レイドスリー) RAID3(レイドスリー)は、データの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID3は最低3台(データ用2台、 パリティ 用1台)のHDDがあれば構成可能です。 データはビット(bit)又はバイト(byte)単位で分割してHDDに書込み、 パリティ は別のHDDに格納する事でデータ復旧を可能としています。 RAID2では、誤り補正の為に3台のHDDが必要でしたが、RAID3の場合は、 パリティ を使う場合は1台のHDDで済みます。 RAID3_before RAID3_after 5-5. RAID4(レイドフォー) RAID4(レイドフォー)も、RAID3と同じくデータの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID4も、RAID3と同じく、最小3台(データ用2台、 パリティ 用1台)のHDDがあれば構成可能です。 RAID3と異なり、RAID4はデータはブロック単位に分割する事でより効率よくなるように設計されています。 RAID4は、読み出しは高速になりますが、書き込みは パリティ 用HDDにアクセスが集中するため遅くなります。 RAID4_before RAID4_after 5-6. RAID5(レイドファイブ) RAID5(レイドファイブ)も、RAID3と同じくデータの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID5は最低3台のHDDから構成する事が可能で、図の構成の場合、HDD1台の故障まで耐えることが可能となります。 RAID5はRAID4と同じように パリティ を使用しますが、データを複数組み合わせて パリティ を作成し、複数のHDDに分散させることで、データの信頼性を保ちます。また、RAID4で固定していた パリティ をブロック単位にすることで、 パリティ 用HDDへのアクセス集中を防ぎRAID4よりパフォーマンスを向上させています。 RAID5_before RAID5_after 5-7. RAID6(レイドシックス) RAID6(レイドシックス)は、 パリティ (誤り訂正)について、二重書き込みを行うことで、耐障害性をRAID5より大幅に高めた構成となっています。(データの取り出し、保存のイメージは図のとおりです。) 動作上の仕様はRAID5とほぼ同じになります。RAID6は最小4台のHDDから構成する事が可能で、図の構成の場合、同時にHDD2台の故障まで耐えることが可能です。 RAID6_before RAID6_after 5-8. RAID10(レイドイチゼロ) RAID10はRAID1「 ミラーリング 」の構成をさらにRAID0「ストライピング」で掛け合わせた構成となります。(データの取り出し、保存のイメージは図のとおりです。) 高速化を実現するRAID0と、耐障害性のあるRAID1を組み合わせることで高速化で耐障害性を高めています。 RAID10は最低4台のHDDから構成する事が可能で、RAID1同様に利用可能容量は総ハードディスク容量の半分となります。図の構成の場合、HDD1台の故障まで耐えることが可能となります。 RAID10とは逆のRAID01と言うものもありますが、今回は割愛します。 RAID10_before RAID10_after 6. RAID 構築時の注意点 RAID 構築時の注意点として一般的なものは下記になります。構築時の参考にして頂けると幸いです。 RAID コントローラが構築したい RAID 対応しているか。 HDDの容量、速度が同じか。(原則として速度、容量は合わせた方がベター) RAID のパフォーマンスは遅いHDDに引っ張られる。 7. まとめ 最後に簡単ですが、各 RAID の特徴をまとめると次のようになります。 RAID2からRAID4は、世の中に広く普及はしていない為、 RAID を使用する際はRAID2からRAID4以外をご利用される事をお勧めいたします。 RAID0 RAID1 RAID2 RAID3 RAID4 RAID5 RAID6 RAID10 耐障害性 なし ◎ ◎ 〇 〇 〇 ◎ 〇 初期導入コスト 小 中 大 中 中 中 大 大 HDD性能 読込み ◎ 〇 × 〇 〇 ◎ ◎ ◎ 書込み ◎ 〇 × 〇 △ △ △ 〇 必要なディスク台数 2台以上 2台以上 5台以上 3台以上 3台以上 3台以上 4台以上 4台以上 ディスク容量の利用効率 (n:ディスク台数) 100% 50% (n-2)/n% (n-1)/n% (n-1)/n% (n-1)/n% (n-2)/n% 50% 許容される障害台数 (n:ディスク台数) なし 1 2 1 1 1 2 2 ※同一セットのHDDが故障しない場合 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
Photo by Renée French Go言語入門 こんにちは rsrks です。 今回は最近エンジニアの中で人気が高まってきているGo言語についての入門記事になります。 Go言語は2009年に Google が開発した言語で、構文などは C言語 の特徴を継承しています。 文法がシンプルなため比較的コードが書きやすく学習しやすいことや、実行速度が早く大規模なシステムや大量のデータを扱うことが求められるIT業界の現状にマッチした言語になっているため人気が高いです。 この記事ではGo言語の特徴について説明した後に、 Go言語プログラミングにおける基礎 と、 Windows を用いた環境構築とコーディング を行っていきます。 Go言語入門 Go言語の特徴 基本的な構文 環境構築 コーディング (HelloWorld の出力) 最後に Go言語の特徴 文法がシンプル 静的型付け言語 堅牢なプログラムが作成できる ガベージコレクション による自動的なメモリ管理 メモリ安全性を持っている 高速な処理が得意 コンパイル 言語なため実行速度が高速 並列処理 gouroutine: スレッド channnel: 関数間での値の送受信 以上の2つを用いることで並列処理が実現できる 基本的な構文 次に、Go言語の基本的な構文と特徴について見ていきましょう。 変数宣言 まずはGo言語における変数宣言についてです。 Go言語は静的型付け言語であるため、全ての変数が何らかの型を持っています。 そのため型関係の誤りなどは コンパイル 時に検出することができ、堅牢なシステムの構築につながっています。 基本的な宣言は以下のように行います。 // variablename: 変数名 // tyte: 変数の型 var variableName type では変数宣言の種類について見ていきましょう。 // hoge という変数名を定義. // 変数の型は int var hoge int // 定義と同時に初期化 var hoge int = 1 ; // 複数の変数を定義 // 型は全て共通 var hoge, fuga int // 定義と同時に初期化(多重代入) // 変数ごとの値を初期化する var hoge, fuga int = 1 , 2 ; ちなみに宣言では以下のような省略記法も存在します。 // := が var と type の役割を担う // 変数の型はコンパイル時に決定される hoge := 1 これは非常に便利な書き方なので使いたいシーンは多いと思います。 一方で、この書き方は関数の外で使用するとエラーが出るためそこだけは注意が必要です。 グローバル変数 を宣言する際は必ず var を付けるようにしましょう。 ※基本データ型 以下に変数宣言に用いる型の中から、基本データ型の型名と取りうる範囲を表にまとめました。 おおむね他の言語と同じ型が存在します。 論理値型 型 取りうる値 bool true, false 数値型 符号付整数型: int 符号なし整数型: unit 型 取りうる値 int8 -128 ~ 127 int16 -32768 ~ 32767 int32 -2147483648 ~ 2147483647 int64 -9223372036854775808 ~ 9223372036854775807 int 32bit または 64bit (環境依存) unit8 0 ~ 255 unit16 0 ~ 65535 unit32 0 ~ 4294967295 unit64 0 ~ 18446744073709551615 unit 32bit または 64bit (環境依存) 浮動小数 点型 型 取りうる値 float32 32ビット 浮動小数 点 float64 64ビット 浮動小数 点 ※ double型は存在しない。 float64 がdouble型と同じ倍精度 浮動小数点数 にあたる 文字列型 型 取りうる値 string 文字列 制御文 (if, for) では次にif, forによる制御文の記述の仕方を説明します。 これらはプログラミングにおいて非常に重要な概念なのでしっかり覚える必要があります。 まずはif文の基本的な書き方を見ていきましょう。 // if, else if, else を用いる var hoge int = 10 if hoge < 0 { fmt.Println( "hogeは負の値です" ) } else if hoge < 10 { fmt.Println( "hogeは10未満です" ) } else { fmt.Println( "hogeは10以上です" ) } // ifの中にifを書くことも出来ます if hoge < 10 { fmt.Println( "hogeは10未満です" ) if hoge < 0 { fmt.Println( "hogeは負の値です" ) } } 次にGo言語の特徴的なif文の書き方を紹介します。 Go言語ではif文の中で変数を宣言し利用することが出来ます。 // hogeの値を取得して表示しています // なお、この変数はこのif文の中のみで有効なので注意 if hoge := getHoge(); hoge < 0 { fmt.Println( "hogeは負の値です" ) } else { fmt.Println( "hogeは正の値です" ) } ちなみに、比較 演算子 ・論理 演算子 には以下のようなものがあります。 ここは一般的な プログラミング言語 と同様です。 比較 演算子 意味 a == b aとbが等しい a != b aとbが等しくない a > b aがbよりも大きい a >= b aがb以上 論理 演算子 意味 a && b aとbが両方とも真のなら a || b aまたはbが真なら !a aが偽の場合に真 次にfor文によるループの記述について見ていきましょう。 なお、Go言語には C言語 や Java などに存在する while文は存在しません 。 なのでループの記述は全てforを使用します。 // for 初期値; 条件式; 変化式 for i := 0 ; i < 10 ; i++ { // 処理を記述 } // 変数宣言での多重代入を用いることで複数の宣言を使ったループが可能 for i, j := 0 , 1 ; i > 9 && j > 10 ; i, j = i+ 1 , j+ 1 { fmt.Printf( "i: %d, j: %d" , i, j) } continue や break を使ってループを制御することも可能です。 for i := 0 ; i < 10 ; i++ { // iが偶数の場合 if i % 2 == 0 { // ここでforの先頭に戻る continue } // 奇数のみ表示される fmt.Printf( "i: %d" , i) } for i := 0 ; i < 10 ; i++ { if i == 5 { // for文から出る break } } また、先ほどwhileは存在しないというお話をしましたが、プログラミングをしているとどうしてもwhile文のようなループを使いたい時がくるかもしれません。 その場合はforを以下のように記述することでwhile文のようなループを作成出来ます。 count := 0 for count < 10 { fmt.Printf( "count: %d" , count) count += 1 } 0123456789 最後に、for文を使う際に、配列の中身をループさせたいと思うときがあると思います。 そのような場合Go言語では以下のような記述を行います。 for i, str := range [] string { "one" , "two" , "three" } { fmt.Println( "%d個目: %d" , i, str) } one two three 関数 ここからは関数について見ていきましょう。 基本的な宣言は以下のように行います。 // funcの後に関数名を書く // 引数は () で指定を行う // 引数の後に戻り値の型を記述 func functionName(variableName type ) ( type ) { return output; } またGo言語では以下のように複数の戻り値を設定することができます。 これはGo言語の特徴的な性質の一つです。 あまり馴染みがないと思いますが、使いこなせば非常に便利な機能になっています。 // 以下のように複数の戻り値を設定することが出来ます。 func functionName(valiableName1 type1, valiableName2 type2) (type1, type2) { return output1, output2; } // 使用例 func calc(a int , b int ) ( int , int ) { return a+b, a-b; } func main() { var a int = 2 ; var b int = 3 ; add, minus := calc(a, b); fmt.Println( "add: %d" , add) fmt.Println( "minus: %d" , minus) } add: 5 minus: -1 また、戻り値が多くなった場合は以下のように戻り値を名前付きで設定することも可能です。 // 戻り値に名前を付けられます // また、引数、戻り値の型が同じなら (a, b int) のようにまとめて記述できます func calc(a, b int ) (add, minus, multi, div int ) { add = a+b minus = a-b multi = a*b div = a/b return } 構造体 次に構造体の話をしていきます。 Go言語には、いわゆる オブジェクト指向 のクラスというものが存在しません。 その代わりとして構造体というデータ型があり、複数の変数やメソッドを格納することが出来ます。 基本的な宣言は以下のように行います。 // このように変数を格納できます type structName struct { variableName1 type1 variableName2 type2 } // メソッドは以下のように定義します // func(レシーバ 型) 関数名() 戻り値の型 {処理} func (receiver structName) functionName() outputType { return variableName1; } メソッドの定義でレシーバを付けるというところに注意が必要です。 レシーバを付けないとただの関数になってしまうので忘れないようにしましょう。 使用例 type Animal struct { name string cry string } func (animal Animal) about() string { return name + "の鳴き声: " + cry } func main() { // 構造体の宣言 var dog Animal // 変数の初期化は全部で3通りあります // 特にこれを使うべきという決まりは無いので開発方針に合わせて使い分ければOK // 1. ドット(.)でのアクセス dog.name = "犬" dog.cry = "わんわん" // 2. {} で値を渡す dog := { "犬" , "わんわん" } // 3. コロン(:) で指定 // 引数名を指定するため分かりやすい dog = Animal{name: "犬" , cry: "わんわん" } // メソッドへのアクセスはドット(.)で行います fmt.Println(dog.about()) } 犬の鳴き声: わんわん 環境構築 ここからはGo言語で開発をするための環境構築を行っていこうと思います。 使用するOS: Windows 10 Go言語のインストール まずはGo言語の SDK をダウンロードして行きましょう。 ダウンロードページ から windows 用の SDK をダウンロードしていきます。 https://golang.org/dl/ 以下の画像の赤枠で囲った windows を選択してください。 Go言語ダウンロードページ ダウンロードが終了したらセットアップウィザードを起動しインストールを行っていきます。 ここから環境構築を対話的に行っていきますが、あまり選択することは無いのでサクサク進んでいきましょう。 セットアップウィザードの起動 Nextを押下 ライセンス確認 内容を確認し、問題がなければNextを押下 インストールフォルダ指定 特にこだわりが無ければ変更せずNextを押下 インストール開始 Installを押下。インストールには少し時間がかかります インストール終了 Finishを押下して、インストール終了 さてここまででインストールが終了しました。 インストールした段階で 環境変数 に GOPATH というインストールしたフォルダへのパスが追加されていると思います。 環境変数 を確認したい場合は コマンドプロンプト で go env というコマンドを入力することで一覧が確認できます。 では、Go言語がインストールされているか コマンドプロンプト で確認してみましょう。 インストールが成功していれば以下のように go version と入力することでGo言語のバージョンが出てきます。 Goインストール確認 コーディング (HelloWorldの出力) それでは最後に簡単なコーディングを行っていきましょう。 ここではプログラミングではおなじみの Hello World の出力を行っていきます。 任意のフォルダに以下のような内容でファイルを作成します。 main関数の中で文字列を出力しているだけなので上記の基本的な構文を見ていただいた方には簡単だと思います。 package main import "fmt" func main() { fmt.Printf( "Hello world" ) } ではこちらを実行していきましょう。 go run というコマンドを走らせることでGoプログラムの コンパイル と実行を行うことが出来ます。 以下のように出力されれば成功です。 実行結果 最後に いかがでしたでしょうか。 今回Go言語の基本的な構文を紹介しましたが、全てを紹介できたわけではありません。 Go言語を用いてアプリケーションを作ろうと思うとさらに広く深い知識が必要になってきます。 まずは、この記事でGo言語の学習のためのモチベーションにつながれば嬉しいです。 他にもGo言語には goroutine と channel を用いた並列処理などの強みがあるので、今後機会があれば書きたいと思います。 参考文献 Build Web Application Golang Go言語:文法基礎まとめ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
【Git入門】git stashで作業を便利に退避する はじめに こんにちは、tuq376sです。 今回はGitで管理している ディレクト リでの作業をちょこっと中断したい場合に便利な git stash コマンドについて、 基本と便利なオプションの使い方を中心に紹介していきたいと思います。 Gitの使い方、git commitの取り消し方、git cloneを知りたい方は以下ブログもご一読ください ・ 【超入門】初心者のためのGitとGitHubの使い方 - RAKUS Developers Blog | ラクス エンジニアブログ ・ 【Git入門】git commitを取り消したい、元に戻す方法まとめ - RAKUS Developers Blog | ラクス エンジニアブログ ・ 【Git入門】git cloneで既存リポジトリをクローンしよう! - RAKUS Developers Blog | ラクス エンジニアブログ 目次 はじめに 目次 git stashの基本的な使い方 作業を退避する 退避した作業一覧を確認する 退避した作業を戻す git stashのいろいろな退避の仕方 名前を付けて退避する ステージングを維持したまま退避する 追跡されていないファイルの退避する 退避した作業の確認 退避した作業の削除 おわりに git stash の基本的な使い方 まずは、基本的な操作から。 作業を退避する 現在の変更作業を退避するには以下のコマンドを使います。 git stash save このコマンドにより、ワーキングとステージングにある作業を退避することができます。 save 部分は省略し git stash のみでも実行可能です。 退避した作業一覧を確認する 次に退避した作業の一覧を確認しましょう。 git stash list 実行すると、これまで退避したものを一覧で見ることができます。 並び順は git log と同じように上に表示されるものほど新しいものです。 $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt # 一番最近退避された作業内容 stash@{1}: WIP on master: f0d73fe added readme stash@{2}: WIP on master: 3faa214 feat readme 退避した作業を戻す では、退避した作業を戻していきましょう。 作業を戻すコマンドは以下の2つがあります。 git stash apply git stash pop どちらも実行することで退避した作業一覧の一番新しいものを戻すことができます。 apply であれば退避一覧から該当の作業を削除しませんが、 pop であれば戻した作業が退避一覧から削除されるという違いがあります。 また、 apply と pop どちらのコマンドでも以下のように指定することで git stash list で確認できる任意の退避作業を戻すことができます。 $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt stash@{1}: WIP on master: f0d73fe added readme $ git stash pop stash@{1} # 戻したい作業を指定 On branch master (中略) Dropped stash@{1} (aa9b3a02231103600f1e622beb30118b28b202d3) $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt 以上を覚えておけば、 git stash コマンドは問題なく使うことはできるかと思います。 けれどもっと便利な使い方もありますので、次はそちらを紹介していきます。 git stash のいろいろな退避の仕方 名前を付けて退避する git stash list で確認できる一覧は、ぱっと見でどの作業内容を保存したものかがわかりづらいです。 そこで、退避時に名前を付けて一覧をわかりやすくしてみたいと思います。 $ git stash save "test_stash" # 名前を付けて作業を保存 Saved working directory and index state On master: test_stash $ git stash list stash@{0}: On master: test_stash # 名前を付けて保存した作業 stash@{1}: WIP on master: f0d73fe added readme # 名前を付けず保存した作業 上記のように git stash save の後ろに名前を指定することで、一覧から参照することができます。 ただし、名前を指定する場合は save を省略できないことに注意です。 ステージングを維持したまま退避する git stash を実行するとワーキングとステージングにある作業を退避することができますが、 そのまま作業を戻すと、ステージングにあった変更もワーキングに戻ってしまいます。 ステージング状態を維持したままにするためには、戻す際にオプションを指定します。 git stash pop --index もちろん apply でも同じようにステージングの状態を維持することができます。 $ git status On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: readme.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.txt $ git stash $ git stash apply --index # ステージングを維持したまま作業を戻す On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) modified: readme.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: index.txt 追跡されていないファイルの退避する 追跡されていない状態のものについては git stash の実行では退避されません。 新規作成したファイル等の追跡されていないものも含めて退避するには、以下のようにオプションを指定する必要があります。 git stash -u 退避した追跡されていないファイルは、戻すと再び追跡されていないファイルとなります。 $ git status On branch master Your branch is up to date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) test.txt nothing added to commit but untracked files present (use "git add" to track) $ git stash -u # 追跡されていないファイルを含めて退避 Saved working directory and index state WIP on master: f0d73fe added readme $ git status # 追跡されていないファイルも退避されている On branch public_batch_data_acquisition nothing to commit, working tree clean $ git stash pop (中略) Untracked files: (use "git add <file>..." to include in what will be committed) test.txt nothing added to commit but untracked files present (use "git add" to track) 退避した作業の確認 退避した作業の一覧は git stash list で確認することはできますが、各作業の詳細を確認するには以下のコマンドを用います。 git stash show [確認したい作業] 明示的に指定がなければ最新のものについて、指定があればその作業の詳細を確認できます。 $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt stash@{1}: WIP on master: f0d73fe added readme $ git stash show # stash@{0}の詳細を表示 index.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) $ git stash show stash@{1} # stash@{1}の詳細を表示 readme.md | 6 +++--- 1 file changed, 3 insertion(+), 3 deletion(-) また、 diff コマンドのように確認したい場合は以下のオプションを付与します。 git stash show -p [確認したい作業] 退避した作業の削除 一時的な作業退避と言っても、退避した作業が最終的に不要になったりすることもあるかと思います。 そのような場合もコマンドで退避した作業の削除が可能です。 まず、一覧にあるものすべてを削除したい場合は以下を指定します。 git stash clear そして、一覧から1件ずつ削除したい場合は、以下のコマンドから行えます。 git stash drop [削除したい作業] 削除したい作業を指定しない場合は一番新しいものが削除されます。 $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt stash@{1}: WIP on master: f0d73fe added readme stash@{2}: WIP on master: 3faa214 feat readme $ git stash drop stash@{2} # 作業を指定して削除 Dropped stash@{2} (af801de83b4f3f5ad60b11faa8a77021d962f18d) $ git stash list stash@{0}: WIP on master: 36af2d1 added index.txt stash@{1}: WIP on master: f0d73fe added readme $ git stash drop # 作業を指定せず削除 Dropped refs/stash@{0} (4ce005a5c0489fc31008e28b6f64ebcd3d008f52) $ git stash list stash@{0}: WIP on master: f0d73fe added readme おわりに Gitの操作は日常的に行うものの、なんだかんだと自分は基本的な使い方しかしていないので、 今回はもう少し便利な使い方を覚えようと、 git stash に焦点を当ててみました。 読んでいただいた方に1つでも、へぇと思っていただけるものがあれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに 技術広報の yayawowo です。 いつも ラク スのエンジニアブログをお読みいただき、ありがとうございます。 また、別途開催しているエンジニアイベントへのご参加も誠にありがとうございます。 今回も大盛況となりました、 『【 ラク スMeetup】大規模 SaaS のフロントエンド開発/レガシー改善、Vue.js、マルチブラウザ対応』 の発表内容についてご紹介します。 rakus.connpass.com はじめに イベントテーマ概要 発表の紹介 20年物プロダクトのフロントエンドを改善するための取り組み チャットボットシステムのスマートフォン対応について チーム開発におけるコンポーネントシステムの問題と解決施策 おわりに イベントテーマ概要 10月開催の ラク スMeetupのテーマは、 『フロントエンド』 ! 大規模 SaaS の開発に携わるフロントエンド技術の取り組みを、以下プロダクト開発の最前線で活躍しているエンジニアがご紹介しました。 MailDealer チャットディーラー 楽楽勤怠 20年以上と息の長いサービスや、リリースしたばかりの新サービスが抱える課題や教訓を発信し、 SaaS 開発に携わる方やフロントエンド技術にご興味をお持ちの方の一助となれば幸いです。 発表の紹介 それではここから各発表内容と資料を共有させていただきます! 20年物プロダクトのフロントエンドを改善するための取り組み まずは、MailDealerのフロントエンドを担当している松本の発表です。 担当しているMailDealerは、 ラク スで20年以上開発が続いているプロダクトになります。 長年多くの利用者に使われ続けるプロダクトのため、時代やニーズに合わせ追加機能開発をしてきました。 そのために、プロダクトコードには古い技術が使われている箇所が散見されています。 特にフロントエンドに関しては、これまで専任の担当者をつけていなかった経緯もあり、技術の最新化が後回しになっていました。 今回は、 20年もののプロダクトであるが故に見えてきた、フロントエンドの課題 現在進めている、課題解決に向けた取り組み フロントエンドチームとしての今後の展望 の3点についてご紹介しました。 speakerdeck.com チャットボットシステムの スマートフォン 対応について 続きまして、チャットディーラーのフロントエンドを担当している酒井の発表になります。 スマートフォン の普及により、今やパソコンより スマートフォン でWEBページを閲覧することが多くなっており、WEBシステムを作成する中で スマホ 対応は避けては通れないものになってきています。 サポートチャットボットを提供するサービス『ChatDealer』でも スマートフォン 対応を行う必要があり、サービス立ち上げ時に行った、 スマートフォン 対応の手法 について共有させていただきました。 また、 実際に開発・運用するなかで発生した課題の共有や、品質担保するために行っている施策等について も合わせてご紹介させていただきました。 speakerdeck.com チーム開発における コンポーネント システムの問題と解決施策 最後は楽楽勤怠から中田が発表しました。 楽楽勤怠は去年リリースされた社内でも新しい方のプロダクトで、フロントエンドの開発ではVue.jsや コンポーネント システムを採用しています。 しかしプロダクト・チームがスケールするとともに数々の問題が表出してきました。 今回は コンポーネント 周りの問題に焦点をあて どういった コンポーネント があるかわからず、重複した コンポーネント が作られる 利用できそうな コンポーネント があるがどういった機能があるのか、または使い方がわからない の解消に向けた施策について発表しました。 speakerdeck.com おわりに 大規模 SaaS のフロンエンド開発はいかがでしょうか? ラク スのフロントエンドチームの最新体制や取り組みや、チャットディーラーの スマホ 課題、楽楽勤怠の コンポーネント 周りの課題について共有させていただきました。 また、イベント中に参加者の皆様からもご意見をいただき、大変有意義な時間になりました。 改めてとなりますが、当社エンジニア3名の発表が SaaS 開発に携わる方やフロントエンド技術にご興味をお持ちの方の一助となれば幸いです。 次回の ラク スMeetupは、 『生産性向上』 をテーマに開催予定です。 イベントページはこちらになります! 急成長SaaSの生産性向上戦略/オフショア、SRE、属人化対策 - connpass 皆様のご参加、お待ちしております! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは!フロントエンドエンジニアの松本です。 私が担当するプロダクトは今年で20年に到達し、ご長寿プロダクトとなりました。 息の長いプロダクトにはレガシー化が付き物でありますが、レガシー化を進めないためにも、日々技術を最新化するための リファクタリング が必要です。 今回は、品質を担保しつつ安全に リファクタリング を進めるために、 ビジュアル リグレッション テストを試験導入 してみました。想像以上に導入が簡単だったので導入方法の紹介と、苦労した点、導入してよかった点について紹介します。 ビジュアルリグレッションテストとは 試験導入の経緯 今回使用したライブラリ 導入方法 Playwrightの導入 reg-suitの導入 テストの流れについて 苦労した点 導入して良かった点 ビジュアル リグレッション テストとは ビジュアル リグレッション テストは、画面に表示されたページや要素が期待通りに表示されているかを、 修正前後の画像比較で検証するテスト です。 図のように、テキスト色をはじめとするスタイルや、要素の配置やサイズといったレイアウトの差分を検出できます。 また、ビジュアル リグレッション テストでは以下の観点の検証が可能です。 スタイルやレイアウトが期待通り表示されているか 画像や埋め込みiframeがリンク切れしていないか 400エラーや500エラーなど、予期せぬエラー画面が表示されていないか 試験導入の経緯 開発案件で、見た目に変化を与えない系の リファクタリング を実施しました。(例: JavaScript ライブラリのバージョンアップ対応) 見た目が変わっていないことを担保するテスト方法の1つとして、「修正前の画面と、修正後の画面を目視でチェックしていく」方法があります。 リファクタリング 件数が少ない場合にはこちらの方法を採用しても良いのですが、 今回は リファクタリング 件数が多い且つ、 クロスブラウザ でのテストが必須なので、テスト 工数 の見積もりが大きくなった また、目視でのチェックは精度にバラつきが出る(件数も多いので人的エラーをゼロにする自信がなかった) よって、目視でのチェックは断念しました。 そこで、ビジュアル リグレッション テストならこれらの課題を解決できそうだと踏み、試験導入に至りました。続いて、実際に使用したライブラリを紹介します。 今回使用したライブラリ 今回は2つのNode.jsライブラリを使用しました。 画面の スクリーンショット を収録するために Playwright 、収録した スクリーンショット を比較するために reg-suit を使用します。 Playwright ヘッドレスブラウザをNode.jsで操作ができるライブラリ ブラウザの自動操作や、 スクリーンショット の収録等が可能 対応ブラウザは Chromium 、 Firefox 、 Webkit reg-suit ビジュアル リグレッション テストのテスティングライブラリ 修正前後の画像を比較し、差分結果をHTMLレポートとして出力 外部 クラウド ストレージへの画像保存も可能 ※今回はこの件には触れません reg-suitは CLI なので、ローカルマシンやCI上での実行が可能 ※今回はこの件には触れません 導入方法 Playwrightの導入 まずは画面の スクリーンショット を収録するライブラリPlaywrightをインストールします。 テストプロジェクト上に移動して、以下npmコマンドを実行します。 $ npm i -D playwright Playwrightと、 Chromium ・ Firefox ・ WebKit の ブラウザー バイナリがインストールされます。 reg-suitの導入 次に修正前後の画像を比較して、検証レポートを出力するライブラリreg-suitをインストールします。 テストプロジェクト上に移動して、以下npmコマンドを実行します。 $ npm i -D reg-suit インストールが完了したら、reg-suitの初期設定をするために以下のコマンドを実行します。 いくつか任意設定がありますので、プロジェクトの要件に合わせて適宜入力してください。 今回の試験導入段階ではCIや クラウド ストレージとの連携はせずに、ローカル上でのテスト実行を想定しているので、 プラグイン の導入は見送りました。 $ npx reg-suit init 任意設定を表示する▼ ? Plugin(s) to install (bold: recommended) (Press <space> to select, <a> to toggle all, <i> to invert selection) ※インストール時に合わせて導入したいプラグインがあれば選択してください ( ) reg- keygen - git - hash - plugin : Detect the snapshot key to be compare with using Git hash . ( ) reg- notify - github - plugin : Notify reg- suit result to GitHub repository ( ) reg- publish - s3 - plugin : Fetch and publish snapshot images to AWS S3 . ( ) reg- notify - chatwork - plugin : Notify reg- suit result to Chatwork channel . ( ) reg- notify - github - with - api - plugin : Notify reg- suit result to GHE repository using API ( ) reg- notify - gitlab - plugin : Notify reg- suit result to GitLab repository ( ) reg- notify - slack - plugin : Notify reg- suit result to Slack channel . ? Working directory of reg-suit. [.reg] ※作業用ディレクトリの名前を入力してください(デフォルト: .reg ) ? Directory contains actual images. [directory_contains_actual_images] ※比較先の画像を格納するディレクトリ名を入力してください(デフォルト:directory_contains_actual_images) ? Threshold, ranges from 0 to 1. Smaller value makes the comparison more sensitive.[0] ※比較判定に用いる閾値を 0 ~ 1 の間で設定してください。 0 に近いほど、判定が厳しくなります(デフォルト: 0 ) ? Update configuration file Yes(デフォルト:Yes) ※設定ファイルを更新しますか? ? Copy sample images to working dir Yes(デフォルト:Yes) ※作業用ディレクトリにサンプル画像を配置しますか?(Yes) テストの流れについて 今回はこのような流れでテストを進めてみました。 ブラウザ自動操作& スクリーンショット 収録コードの作成 Node.jsの実行ファイルを作成する Playwrightには ブラウザでURLへアクセス したり、 スクリーンショットを収録 する API が用意されているので、対象画面の スクリーンショット 収録までを自動化する サンプルコード const playwright = require( 'playwright' ); (async () => { for ( const browserType of [ 'chromium' , 'firefox' , 'webkit' ] ) { // 確認対象のブラウザリスト const browser = await playwright [ browserType ] .launch(); const context = await browser.newContext(); const page = await context.newPage(); await page. goto ( 'https://example.com' ); // 試験対象ページへアクセス await page.screenshot( { path: `example-$ { browserType } .png` } ); // スクリーンショットを収録 await browser.close(); // ブラウザを閉じる } } )(); 修正前の スクリーンショット 収録 1で作成したファイルをNode.jsで実行する リファクタリング 実施 ソースコード を修正する 修正後の スクリーンショット 収録 1で作成したファイルをNode.jsで実行する 画像比較&レポート確認 2・4 で収録したファイルを所定の ディレクト リへ配置する npx reg-suit run で画像比較を実行する 出力された検証結果レポートを確認する 苦労した点 Playwrightのコード作成において、いくつかハマりポイントがありました。 iframe内のコンテンツが表示されたら○○する 冒頭で述べたように息の長いプロダクトなので、古代から愛されているiframeが現役で頑張っています。「特定のページが表示されたら スクリーンショット を収録する」処理を書き、いざ実行してみるとiframe内のコンテンツが表示されないまま、 スクリーンショット が収録される罠にハマりました。Playwrightには iframeの読み込みが完了まで待機するAPI が用意されているので、そちらを用いることで回避できました。 iframeに限らず、 JavaScript で動的に表示されたコンテンツを収録したいケースも、 要素が表示されるまで待機するAPI を使用することで、期待した スクリーンショット が収録できます。 一部ブラウザで処理途中に タイムアウト が発生する 本件は Firefox において「画面ポップアップすると タイムアウト が発生して後続処理が実行されない」という問題でしたが、調査を続けるとPlaywrightのバグであることがわかりました。 Playwrightは絶賛開発が続いているライブラリなので、バグの改善を待つか、別の実装方法がないかを検討するなど、バグを把握しつつ上手く付き合っていく必要があります。 導入して良かった点 効果について 比較対象として目視によるテストを一部実施し、ビジュアル リグレッション テストとのテスト 工数 の比較をしてみました。試験導入段階ではありますが、 目視テストと比較すると2~3割程度のテスト 工数 を削減 できる見込みです。 Playwright API の慣れや、テストユーティリティに共通処理を肥やしていく等、コードを作りこむほどテスト 工数 の削減率は向上していくと思います。 テストの精度について 目視によるテストの場合は、実施者によってはどうしても精度にバラつきが出てしまいますが、reg-suitで 機械的 な判定をすることで、 毎回同じ精度で比較できるので安心・安全 にテストが可能です。 また、 ↑のレポートサンプル のように、見やすい形式でレポート出力されるので、比較結果の確認もスムーズでした。同時に、 エビデンス を確保できるのも便利です。 スクリーンショット を安定的に収録できるまでは若干の苦労はありましたが、導入は非常にお手軽なので、ビジュアル リグレッション テストを検討中の方は是非お試しください。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは。初めましてインフラエンジニアをしていますmoja_chiroです。 今回初めて投稿します。初回ということもありサービスのベースとなっているハイパーコンバージドインフラスト ラク チャ(HCI)の概要と事例を少しご紹介したいと思います。 ・ハイパーコンバージドインフラストラクチャ(HCI)について書く事になったきっかけ ・参考文献 ・ハイパーコンバージドインフラストラクチャ(HCI)とは ・自分流「HCI」とは ・3層構造のインフラストラクチャ ・従来型3層構造の課題について ・HCIのメリット ・シンプルな構成 ・統合管理ツール ・拡張の容易さ ・HCIシステム 〇Nutanix 〇Dell EMC VxRail 〇HPE Hyper Converged ・HCIを利用することで解決できる課題 ・ITインフラストラクチャに求められる課題 ・現状と今後 ・ハイパーコンバージドインフラスト ラク チャ(HCI)について書く事になったきっかけ インフラエンジニアとして働いてきましたが、当社のサービスを支える仮想基盤のテク ノロ ジー であるハイパーコンバージドインフラスト ラク チャ(HCI)の概要部分について改めて学習し直しました。 比較的規模の小さなシステムの仮想基盤として導入するには、ハードルが高いというイメージを持ってしまうHCIですが、私自身がHCIを使用した仮想基盤の運用チームのメンバーとなり、自分自身の学習のために概念とメリットを纏めたいと思います。 深まった知識をもとに運用業務や今後ますます発展していくHCIの分野に着いて行けるエンジニアを目指します。 今回の記事は以下の書籍をもとにまとめました。 ・参考文献 発行所:株式会社 翔泳社 著者: ソフトバンク コマース&サービス株式会社 Nutanix Hyper Converged Infrastructure入門 www.seshop.com ・ハイパーコンバージドインフラスト ラク チャ(HCI)とは 言葉の意味を正しく把握するために ウィキペディア で確認すると、 ウィキペディア には以下のように記載されています。 コンピュータシステムにおける計算機能、ネットワーク機能、ストレージ機能といった基盤機能を、仮想化機能と標準的なハードウェアだけを用いて実装し、水平スケールを容易にしたシステム アーキテクチャ 、あるいはこの アーキテクチャ を採用した アプライアンス 製品群の名称。 引用元: Wikipedia 記載されている言葉をもとに自分流に「HCI」を表現してみました。 ・自分流「HCI」とは 従来型の仮想基盤を構築するためには、3つのハードウェア(サーバ(CPU、メモリ)、ストレージ、それらを繋ぐネットワーク機器)が必要でした。リソース管理やストレージの分散処理をソフトウェアに置き換えることにより、複数のサーバを並べるだけで仮想基盤の構築が可能となり、ストレージやネットワーク機能をサーバ内で完結させることが可能なシステム アーキテクチャ 。 この構成により、サーバを追加していくことで仮想基盤全体のリソース拡張を行えるシステムがHCIであると考えます。 今まで個別の機器を使用して構築していた仮想基盤が、ソフトウェアとサーバで構築することにより柔軟でシンプルな構成で実現できるプラットフォームである。 というものがハイパーコンバージドインフラスト ラク チャ(HCI)だと理解しました。 ・3層構造のインフラスト ラク チャ 3層構造とは、従来型のシステム基盤とHCIの構成を比較する際に従来型のシステム基盤のことをさす表現で、3層構造の3層とは、次の3つの機器をさしています。 コンピュータノード  ・・・演算を提供するCPU、メモリを実装したコンピュータノード SAN  ・・・ストレージエリアネットワーク(Storage Area Network)     コンピュータノードと共有ストレージを接続する高速なネットワーク 共有ストレージ  ・・・データを蓄積し、 冗長化 されたコンピュータノードへ保存領域を提供する専用共有ストレージ 3層構造イメージ図 ・従来型3層構造の課題について 過不足や偏りがあると思いますが、様々な視点で考えられる課題を上げてみます。 大きく次の3点が考えられます。 高い技術力が求められる機器を複数使用して構築されているため、エンジニアには高度なスキルが必要になる。 多種多様な機器で構成されているため、管理が複雑になり運用コストも高くなってしまう。 共有ストレージのストレージコントローラの性能に依存してしまう。 ・HCIのメリット HCIを利用するメリットとしては次の3点があります。 シンプルな構成 統合管理ツール 拡張の容易さ ・シンプルな構成 HCIは共有ストレージを持たないシンプルな構成となっております。 HCIの構成を管理するシステムが各ノードを検出し、必要な クラスタ ーを構成するとともに、共通基盤として必要なストレージやネットワークをソフトウェア的に管理、提供することが可能です。 ストレージは、 分散ファイルシステム を利用したソフトウェアストレージとして各ノードにまたがり、全体をストレージ空間としてコンピュータリソースとハイパーバイザーに提供しています。 その結果、3層構造で必要だったSANと共有ストレージが不要となり、システム全体がスリム化され、管理・運用コストを低減させることが可能です。 ・統合管理ツール HCIを一元管理できるツールで、リソースの追加やストレージの拡張、ネットワークの基盤を提供しています。 ノード追加、ストレージの拡張などのシステム変更に伴うメンテナンス時間はなく、統合管理ツールから数クリックで作業を終了させることが可能です。 また、HCIで動作する仮想基盤を監視し、利用状況に応じてコンピュータリソースを再配置し、システム全体のリソース利用効率を自動的に管理します。 ・拡張の容易さ リソース不足が予想される場合、システムの拡張やシステムリソースの追加が必要になった場合は、構成するノードを要求量に応じて適宜追加可能です。 ITシステム基盤をシステムの成長と要求に合わせて投入することが可能なため、新たにシステムを導入するための初期検討の 工数 の削減に繋がります。 初期はオーバースペック気味になりがちですが、初期導入機器を選定することなく構成できるため、初期コストの圧縮も可能となります。   ・HCIシステム HCI イメージ図 次に主なHCI製品を挙げます。 HCI 提供メーカー ハイパーバイザー Nutanix Nutanix AHV( KVM )、vSphere、 Hyper-V Dell EMC VxRail Dell EMC vSphere HPE Hyper Converged HPE( Hewlett Packard Enterprise) vSphere、 Hyper-V HCIは各社独自の特徴があり、以下のようなシステムが提供されています。 〇Nutanix インターネットサービス基盤を支えるWebテク ノロ ジー をオンプレミスで具現化することを目指して開発されたHCIです。 ソフトウェアデファインドされた アーキテクチャ は理論上無制限に拡張可能で、Nutanix社が自社開発したハイパーバイザーAHV(Acropolis Hypervisor)のほか、 VMware vSphere や Microsoft Hyper-V などの実装が可能となっています。 Nutanix社のハイパーコンバージド インフラストラクチャー (HCI)のページ Acropolis (AOS): ソフトウェア定義ストレージソリューション| Nutanix 〇 Dell EMC VxRail VMware 社のハイパーバイザーvSphereをコアテク ノロ ジー に発展したHCIです。ハードウェアを統合管理するマネジメント機能、ソフトウェアデファインドストレージのvSANを標準搭載し、 VMware 社のソフトウェア思想を具現化しています。 DELL Technoloriesのハイパーコンバージド インフラストラクチャー (HCI)のページ VxRailハイパーコンバージド インフラストラクチャ アプライアンス | Dell Technologies Japan 〇HPE Hyper Converged ソフトウェアデファインドストレージ(Software Defind Strage:SDS)製品であるHPE Store Virtual VSAをコアテク ノロ ジー に発展したHCIです。定評のあるハードウェア基盤、管理ソフトウェアとともにvSphereなどのハイパーバイザーを実装可能で、統合管理されたシステムを実現しています。 HPE社のハイパーコンバージド インフラストラクチャー (HCI)のページ ハイパーコンバージド インフラストラクチャ(HCI) | HPE 日本 ・HCIを利用することで解決できる課題 従来の3層構造が持っていた課題とHCIを導入することで得られる機能と利点について比較します。 項目 3層構造 HCI 構成の自由度 あり 製品により異なる 共有ストレージアレイ 必要 不要 システム構成 複雑 シンプル 事前検証済み構成 一部あり 全て検証済 設計・展開 長期間のプロジェクト 迅速に展開 システム成長設計 スケールアップ スケールアウト 対障害性設計 複雑 容易 運用の専門性 高い専門性 適度な専門性 統合管理 別途必要 標準提供 この中で、日々運用を行っている立場として、メリットとして感じられる項目は次の4点が挙げられます。 ① システム構成:シンプル  ・・・サーバのハードウェアを揃えることで、大きな違いもなくリソースの把握ができます。 ② 対障害性設計:容易  ・・・データ 冗長化 を実現していることにより、 クラスタ ーの障害設計が容易にできます。     また、サービスの稼働に影響を出さずに、復旧作業を簡単に行うことが可能です。 ③ 運用の専門性: 高い専門性  ・・・シンプルな構成で構築できているため、複数の専門的知識が不要となり運用コストを抑えられています。 ④ 統合管理:標準提供  ・・・統合管理ツールが標準で提供されています。     この統合管理ツールでは、シンプルにサーバ、ネットワーク、ストレージの設定や状態監視も可能です。     また、 仮想マシン の作成、バックアップ等運用に必要な管理や作業が一元的に可能です。 ・ITインフラスト ラク チャに求められる課題 よリ早く必要な実行環境が入手できること 必要なリソースを必要なコストで入手できること 不要なコストがかからず容易に管理できること パブリッククラウド を利用してITインフラスト ラク チャを導入することが多くなってきているが、まだハードウェアを所有したオンプレミスの環境も多く存在しています。 パブリッククラウド は目的に応じて必要なリソースをリソースの重要度に応じたコストで迅速に入手できるというメリットがあります。このような利便性はオンプレミス環境のITインフラスト ラク チャでも同様に必要とされ、 プライベートクラウド という形で徐々に導入されています。 プライベートクラウド の課題は、需要増に合わせた拡張性で、システム導入時に想定された処理量を超えた場合に柔軟に対応できるシステム拡張性が従来のシステム基盤には不足していました。 これらの課題にもHCIは十分に応えることができます。HCIはITインフラスト ラク チャのあり方を大きく変え、新たな クラウド 環境へのステップも提供しています。 ・現状と今後 当社の SaaS サービスの中でもこれらのハイパーコンバージド インフラストラクチャー (HCI)を使用した仮想基盤を導入しています。 複数台のサーバを使用したスケールアウトも短期間で完了でき、業務への インパク トもなくサービスインさせることが可能となっています。 また、メンテナンス作業の時においてもデータ 冗長化 の仕組みを利用することで、サービス停止を伴わずに作業を行う事も可能です。 そのため、チームメンバーの稼働 工数 を最小限に押さえることができます。 データの 冗長化 の仕組みである、 レプリケーション ファクターの仕組みについては、改めて勉強していきたいと考えています。 これらの実体験から、HCIの柔軟性や将来性を感じながら運用を行っています。 ITインフラスト ラク チャに求められる課題を解決できるHCIを導入することで、圧縮できた稼働 工数 から新たな課題を解決していき、改善を進めていきたいです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
皆様こんにちは。インフラエンジニアのryuhei55225です! 学生時代は微生物の研究をしておりましたが、新しいことをやりたいと思い2019年に ラク スに新卒入社し、現在は楽楽精算のインフラ基盤運用から各種デプロイまでを担当しております。 特技は野球とサッカーです。 球技なら何でも得意です。(ということにしておきます。) IT技術 を勉強し始めたのは ラク スに入社してからなので、インフラエンジニア歴は約2年半になります。 今回はそんな私でも使うことが可能な、 Kibana に関してです。 今回の記事では「Kibana入門」ということで、 Linux 上にKibana+Logstash+ElasticsearchをインストールしてKibanaが使用出来るまでの手順を紹介したいと思います! ※Logstashはおまけです、Logstashの詳細な使い方については次回以降記載します。 今回使用するサービスについて Elasticsearch Kibana Logstash やりたいこと 構築した環境 構築手順 OSインストール いつものやつ(RPMの最新化) Kibana,Logstash,Elasticsearchのインストール Elasticsearchの起動 Kibanaのサービス起動 Logstashのサービス起動 Kibanaでグラフの作成 今回使用するサービスについて まずは、ざっくりKibana,Logstash,Elasticsearchについて説明していきます。 これらは、どれもElastic社によるサービスで、無償でも使うことが可能なサービスとなっております。 ということで、各サービスについてもう少し詳しく紹介していきます。 Elasticsearch Elasticsearchは、様々な ユースケース を解決する分散型RESTful検索/分析エンジンです。 データを一元的に格納することで、超高速検索や、関連性の細かな調整、パワフルな分析が大規模に、 手軽に実行可能になります。 https://www.elastic.co/jp/elasticsearch/ Elasticsearchは、分散型で無料かつオープンな検索・分析エンジンです。 テキスト、数値、 地理空間情報 を含むあらゆる種類のデータに、そして構造化データと非構造化データの双方に対応しています。 Apache Lucene をベースに開発されたElasticsearchは、2010年にElasticsearch N.V.(Elasticの前身となる企業)がはじめてリリースしました。 シンプルな REST API や分散設計、スピードとスケールの優位性で広く浸透したElasticsearchは、現在もElastic Stackの中核となるプロダクトです。 Elastic Stackはデータ投入からエンリッチメント、保管、分析、可視化までを実現する無料かつオープンなツール群です。 Elasticsearch、Logstash、Kibanaの頭文字をとった"ELK Stack"の愛称でも知られています。 Kibana Kibanaは無料かつオープンな ユーザーインターフェイス です。 Elasticsearchデータを可視化したり、Elastic Stackを制御することができます。 https://www.elastic.co/jp/kibana/ Kibanaは無料かつオープンなフロントエンドアプリです。 Elastic Stackを統括して管理し、Elasticsearchでインデックスされたデータに、検索と可視化の機能を提供します。 一般的には“Elastic Stackで使えるチャート作成ツール”として知られています。 一方で、KibanaはElastic Stack(Elasticsearch、Logstash、Kibanaの頭文字から以前は“ELK”と呼ばれることもありました) クラスタ ーの監視や管理、保護のための ユーザーインターフェース として、さらに、Elastic Stackに搭載されている各種ソリューションの一元的なハブとしても活躍します。 2013年にElasticsearchコミュニティで誕生して以来、KibanaはElastic Stackの開かれた窓として、多くのユーザーと組織にポータルとしての機能を提供しつづけています。 Logstash Logstashは、無料かつオープンのサーバーサイドデータ処理パイプラインです。膨大な数のソースからデータを取り込み、変換して、好みの格納庫(スタッシュ)に送信します。 https://www.elastic.co/jp/logstash/ Logstashは、リアルタイムのパイプライン機能を備えた オープンソース のデータ収集エンジンです。 Logstashは、異なるデータソースのデータを動的に統合し、そのデータを選択した出力先に合わせます。 多様で高度なダウンストリーム分析と可視化の事例向けにすべてのデータをクレンジングし、誰でも使えるようにします。 本来、Logstashはログ収集における革新を牽引していますが、その機能はその事例に留まりません。 収集プロセスをさらにシンプルにする多数のネイティブコーディックにより、数多くのinput、filter、 およびoutputの プラグイン であらゆる種類のイベントを整形し変換することができます。 Logstashは、大量かつ多様なデータを利用して、分析を促進します。 やりたいこと ということで、今回は上記のサービスが利用可能なサーバを構築していきたいと思います。 以下のように、外部サーバから観覧可能なKibanaサーバを構築します。 そして、簡単な CSV 形式のデータをグラフ化してみたいと思います。 構築した環境 CentOS 7(minimalインストール) Elascticsearch 7.13.4 Kibana 7.13.4 Logstash 7.13.4 java -1.8.0 ※Elastic製品のバージョンは揃えております。(2021年10月時点では、7.15.0まで出ているようです。) ▼今回の仮想サーバスペック CPU:2コア メモリ:4GB HD:20GB 構築手順 さあ、これから実際にサーバの構築をしていきたいと思います。 今回は初歩的なOSインストールから実施しておりますので、分かる方はインストール手順までスキップして下さい。 OSインストール CentOS7をインストールし初期設定をする (1)ホスト名設定 (2) IPアドレス 設定(DefaultGatewayなどを含む) (3) DNS 設定 (4)NTP設定 等々、構築する環境に合わせて設定していきます。 いつものやつ( RPM の最新化) # yum update -y # reboot Kibanaを使用するにあたって、minimalインストールした際の RPM のバージョンは何でも問題ないので、 とりあえず、最新バージョンに上げておきましょう。 Kibana,Logstash,Elasticsearchのインストール まずは、公式サイトよりモジュールを取ってきます。 サービスのインストール方法は様々ありますが、今回は RPM をサーバに直接配置してlocalインストールする方法で実施しました。 ※ yum コマンドを使用することで コンパイル 等を意識せず、サーバから直接外部ネットワークに出る必要もないので、最も簡単だと思います。 今回利用した RPM https://artifacts.elastic.co/downloads/kibana/kibana-7.13.4-x86_64.rpm https://artifacts.elastic.co/downloads/logstash/logstash-7.13.4-x86_64.rpm https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.13.4-x86_64.rpm ※バージョンについては、最新バージョンで試すのもありかと思います。 (1)上記 rpm をダウンロードしてサーバの/tmpに配置する (2) yum installする #yum localinstall /tmp/kibana-7.13.4-x86_64.rpm #yum localinstall /tmp/logstash-7.13.4-x86_64.rpm #yum localinstall /tmp/elasticsearch-7.13.4-x86_64.rpm Elasticsearchの起動 では、実際にインストールしたサービスを起動していきたいと思います。 ただ、そのまま起動しても上手く起動しないサービスもありますので、少し設定を確認しながら起動していきます。 ということで、まずはデータを格納して検索するためのElasticsearchを起動していきます。 (1) Java のインストール Elasticsearchの起動には java が必要になってきますので、まずは java をインストールします。 ※Elasticsearchサービス内の java を使用して(デフォルト)起動することも出来ますが、チューニング等はしずらいので、openJDKをインストールしておきます。 # yum install java-1.8.0-openjdk (2) Java の 環境変数 設定 インストールした java に合わせて、設定ファイルのパスを修正します。 # vim /etc/sysconfig/elasticsearch 以下に修正 --------------------------------------- ES_JAVA_HOME=/usr/lib/jvm/jre --------------------------------------- (3) スワップ の無効化 ElasticSearchは公式で「起動時にメモリを確保し、 スワップ しないようにする」という設定が推奨されています。 ということで、systemdの起動ファイルを少し修正します。 # vim /usr/lib/systemd/system/elasticsearch.service [Service]セッションに以下を記載する ---------------------------------------- LimitMEMLOCK=infinity ---------------------------------------- # systemctl daemon-reload 合わせて、 yaml ファイルも修正します。 # vim /etc/elasticsearch/elasticsearch.yml 以下のコメントアウトを外します。 ---------------------------------------- bootstrap.memory_lock: true ---------------------------------------- 以下のコマンドを実行して、「"mlockall" : true」となっていれば設定が反映されております。 ※サービス起動後に確認 # curl http://localhost:9200/_nodes/process?pretty (4)外部サーバからのアクセス許可設定 デフォルトの設定では、Elasticsearchを起動しても外部サーバから 検索エンジン を使用することが出来ません。 そのため、以下の yaml ファイルを編集して、外部サーバからのアクセスを許可します。 # vim /etc/elasticsearch/elasticsearch.yml 以下のパラメータになるよう修正します。 ---------------------------------------- network.host: 0 discovery.seed_hosts: ["サーバのIPアドレスを記載"] cluster.initial_master_nodes: ["サーバのIPアドレスを記載"] ---------------------------------------- (5)Elasticsearchサービスの起動 サービスの起動と 自動起動 設定を追加します。 # systemctl start elasticsearch.service # systemctl enable elasticsearch.service ここまでやれば、ブラウザから「http://設定した IPアドレス :9200/」でElasticsearchの情報が観覧可能となります。 ※Elasticsearchの情報は JSON 形式での応答となります。 Kibanaのサービス起動 続いてKibanaサービスの起動です。 (1)外部サーバからのアクセス許可設定 Elasticsearchと同様に設定ファイルを編集します。 # vim /etc/kibana/kibana.yml 以下のパラメータになるよう修正します。 ---------------------------------------- server.host: 0.0.0.0 ---------------------------------------- (2)Kibanaサービスの起動 サービスの起動と 自動起動 設定を追加します。 # systemctl start kibana.service # systemctl enable kibana.service これで、「http://サーバの IPアドレス :5601/」でkibanaのホーム画面が観覧可能となります。 この時点で手動でデータを入れたり、検索出来たります。 ※楽楽メモ ブラウザでポート番号を意識したくない人は apache をインストールし下記proxy設定をいれておくと便利です。 ---------------------------------------- ProxyPass / http://localhost:5601/ ---------------------------------------- Logstashのサービス起動 (1)設定ファイルの作成 /etc/logstash/conf.d/ 下にインデックスを作成するための設定ファイルを作成します。 今回は、 CSV ファイルからインデックスを作成する設定ファイルを作成しました。 ※詳細は次回以降説明します。 # cat /etc/logstash/conf.d/csv-test.conf input { file { path => "/data/rakuraku_test.csv" start_position => "beginning" type => "csv-test-analyze" } } filter { if [type] == "csv-test-analyze" { csv { columns => [ "date" , "text" , "number" ] separator => "," } date { match => [ "date" , "YYYY/MM/dd HH:mm:ss" ] } mutate { convert => { "number" => "float" } } } } output { if [type] == "csv-test-analyze" { elasticsearch { hosts => ["localhost:9200"] index => "%{type}" } } } (2) CSV ファイルの作成 次に実際にLogstashで読み込むための CSV ファイルを作成します。 (1)の設定ファイルで指定した「/data/rakuraku_test. csv 」に以下のようなデータを記載します。 # cat /data/rakuraku_test.csv 2021/09/05 09:00:00,test-data1,2 2021/09/05 09:00:00,test-data2,5 2021/09/12 09:00:00,test-data1,4 2021/09/12 09:00:00,test-data2,7 2021/09/19 09:00:00,test-data1,8 2021/09/19 09:00:00,test-data2,9 2021/09/26 09:00:00,test-data1,18 2021/09/26 09:00:00,test-data2,11 (2)Logstashサービスの起動 サービスの起動と 自動起動 設定を追加します。 # systemctl start logstash.service # systemctl enable logstash.service →Logstashを起動した時点で、新しく「 csv -test-analyze」というインデックスが作成されて、 CSV ファイルに記載したデータが、このインデックスにインポートされます。 今回の検証ではLogstashを利用して実データをインポートすることになります。 ただ、手動で JSON 形式で入れるなど、Elasticsearchにデータを入れる方法はいろいろあります。 Kibanaでグラフの作成 今回は文字数の関係上、グラフを作成する手順については割愛させて頂きますが、上記手順で作成した「 csv -test-analyze」インデックスをグラフ化することで以下のようなグラフを表示することが出来ます。 ※こちらの手順にもついても次回のブログで記載させて頂きます。 ということで、お疲れ様でした!これでKibanaでのグラフの表示が出来ました! 今回はシンプルなデータのためKibanaのメリットを感じにくい内容となっておりますが、データが複雑になればなるほど、Kibanaで出来ることは増えていきますので、ぜひ皆さん試してください!! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
ラク スの配配メールの開発・運用に従事しているJazumaです。 2021/10/02 (土) 10/03 (日)に PHPカンファレンス 2021がオンライン開催されました。 このイベントは 日本PHPユーザ会 が開催しているイベントで、2000人以上が参加しました。 ラク スはスポンサーとして協賛させて頂いています。 phpcon.php.gr.jp 弊社からも3人が登壇し、多数の PHP エンジニアが参加いたしました。 今回は参加者から集めたレポートをご紹介させていただきます。 ではご覧ください。 10/2(土) 1日目 PHPの今とこれから2021 PHPにおけるコーディング規約と自動整形 13年物プロダクトの監視を起点とした改善活動 独自フレームワークPHPアプリケーションの改善戦略 10/3(日) 2日目 配列、ジェネリクス、PHPで書けない型 SVG画像をPHPで生成しよう What is new in PHP 8 巨大なモノリスの静的解析をレベルMaxにする方法 続) 改善失敗から学ぶ、レガシープロダクトに立ち向かうチーム作り いよいよ開始!徳丸実務試験、PHP8上級試験の模擬問題解説 OpenAPI × LaravelでAPI開発を各段に便利にする方法 PHPで書いて覚える非同期処理 【IMO】コードレビューって難しいよね サービス運用エンジニアによるPHP8バージョンアップ奮闘記 抽象のはしごの上手な登り方~使いやすい汎用ライブラリを作るために~ 弊社の登壇セッションのご紹介 レガシーシステムにおけるPHP8バージョンアップのアプリ対応記録 20年モノの巨大Webサービスの開発継続戦略 - ミドルウェアのバージョンアップとの向き合い方 技術コミュニティ運営戦線〜継続して勉強会を運営するために〜 まとめ 10/2(土) 1日目 1日目は11:00からキーノートがあり、午後から4トラック並行でセッションが行われました。 fortee.jp PHP の今とこれから2021 report by id:radiocat PHP ユーザー会の廣川氏によって「 PHP の今とこれから」が語られる、 PHPカンファレンス ではおなじみのキーノートです。 PHPの今とこれから2021 from Rui Hirokawa www.slideshare.net まず冒頭ではサーバーサイドの プログラミング言語 でシェア8割弱で、 Wordpress を中心に広く使われていることが紹介されました。そして PHP のバージョンアップの歴史をおさらいしたあと、今年の11/25にリリース予定の最新バージョンPHP8.1の機能が紹介されました。まずは、簡易的な並列処理が実現できるFiberが紹介されました。 一般の開発者向けではありませんが、エキスパートな参加者からは注目されているようでした。次に列挙型( enum )、交差型、never型、readonly、finalクラス定数といった、コードの可視性やメンテナンス性の向上につながる期待のある機能が紹介され、参加者からは  「安全になる」  「書きやすくなる」  「PHPDocが不要になるかも」 といった声があがっていました。 最後に、 PHP の将来については、従来の C言語 ではなく PHP そのもので記述できるようになる PHP エクステンション( FFI )と、 機械学習 ・AIの実装が実現に向けて動いていることが紹介されました。これらについても多くの参加者から期待の声があがっていました。 PHP におけるコーディング規約と自動整形 report by id:hirobex GMOインターネットグループ の橋口巧さんによるセッションです。 youtu.be コーディング規約の必要性から始まり、 PHP Standards Recommendations、通称PSRの紹介です。 PSRに沿った形に整形してくれるツールである PHS CS Fixer と PHP _CodeSniffer の動作を実演を交えながら紹介してくださりました。 13年物プロダクトの監視を起点とした改善活動 report by id:Jazuma Hamee株式会社 日野陽平さん 大島淳司さんによるセッションです。 speakerdeck.com Hameeで開発されている ネクス トエンジンはEC運営を支援するサービスです。 2007年提供開始以来長くユーザに利用され続けてきましたが、課題も蓄積されていました。 特定機能で問題が起きた時にエラーメールが送信される仕組みで監視されていたため、ユーザからの問い合わせで初めて障害が検知される・対応要否が判断しづらいという課題がありました。 課題の改善にあたってまずは 「エラーやログが1か所に集計、緊急度の高いもの・低いものに分類されてSlackに通知される」 という理想の状態が定義されます。 その上で2つのアプローチで課題の改善が進められました。 1. 監視ツールとしてDATADOGを採用 DATADOGとは システム・アプリケーション横断で監視可能な監視プラットフォーム。 AWS との連携が可能・アラート機能が高性能 社内に経験者がいる、UIが優れているといったことが採用理由となりました。 メンバー間で認識を統一し、「ユーザの業務に支障が出ているもの」を緊急度が高いものと定義してSlackのAlertチャンネルに通知される仕組みが構築されます。 この取り組みにより、障害検知早期化・ユーザからの問い合わせ起因のバグが減るという成果が得られました。 2. パフォーマンス定点観測会 パフォーマンス定点観測会 パフォーマンスの問題点を確認する週次 MTG 。SREのみで実施していたものをアプリケーション開発チームでも導入 ユーザの業務への影響を最優先事項とする(ユーザ思考)・手作業を減らすといった心得のもと、改善が図られました。 この取り組みは、ログレベルの適性化(不要なログをAlertしないように修正)・ユーザの操作ミス発見などの成果につながりました。 独自 フレームワーク PHP アプリケーションの改善戦略 report by id:hirobex 株式会社ヤプリの田実誠さんによるセッションです。 speakerdeck.com include Orientedな独自 フレームワーク で 親ファイル→子ファイル→孫ファイルのようにincludeリレーが行われており 機能追加、 リファクタリング がしづらい 冗長な重複コードがあり共通処理を入れにくい ログレベルが入っておらず、監視やトレースがしづらい といった課題を抱えていたサーバーを解決した手法を紹介してくださりました。 解決方法 自動テスト 実サーバーを立ち上げた API テスト auto_prepend_fileによるモックと カバレッジ 取得 静的解析導入 PHPStanの導入 PHPDocによる型情報の付与 PHPStan x PHPDocで本体より強力型付けが付与できる 重複コード 定義した関数ファイルをincludeやrequireして読み込んでいたのを、autoload化 静的解析導入後にやったので安心して リファクタリング curl 関数メインのHTTPリク エス トをGuzzleにより共 通化 ロギング error_log()関数でロギングしていたのをMonologによるロギング共 通化 プロダクトをより良くしていくためには、オーナーシップを持って改善に取り組んでいくことが大事だと述べられていました。 10/3(日) 2日目 2日目は10:00から4トラックでセッションが開始されました。17:00からは恒例の大LT大会も開催されて2日間のイベントが締めくくられました。 fortee.jp 配列、 ジェネリクス 、 PHP で書けない型 report by id:radiocat 技術誌で PHP の記事を担当されているうさみさんによる PHP の型についての講義的な発表でした。 youtu.be PHP に型が取り入れられてきた歴史的背景から基礎的な知識と実装方法、実践的なライブコーディング、Discordで参加者と対話しながら最後はスライドもライブで作りながら発表されるという、臨場感のある密度の濃い発表でした。もともと動的型付け言語の PHP も最新のPHP8ではしっかり型を扱うことができるようになってきています。 実行時に起きる事故を防ぐためにしっかり型宣言して品質を保つためのコードの書き方と、型注釈を入れることでPHPStanによる静的解析などの事前のチェックで回避する手法をバランスよく扱って棲み分けていく考え方を学ぶことができる内容でした。 SVG 画像を PHP で生成しよう report by id:ryo479 SVG 画像編集の Webサービス 開発・運営経験をお持ちのmotookaさんによるセッションです。 youtu.be 以下の項目について解説して下さっています。 SVG とは? 何が嬉しいの? PHP で SVG を書く方法 ラスタライズする SVG とは何か?についてから解説されているため、普段 SVG に馴染みのない方でも理解しやすい内容です。 また、 SVG 画像のメリット・デメリットや使用例についても解説されているため、実際に使用するイメージを持ちやすく、開発に SVG を取り入れてみたくなる内容でした。 「 PHP で SVG を書く方法」では、簡単なコードを使用して SVG 画像の動的な生成を実演されており、実装における注意点についても解説されています。 また、 ソースコード は github で公開して下さっているようです。 What is new in PHP 8 report by id:ryo479 Remote Dev ForceのCTO、Joshua Copeland さんによるセッションです。 youtu.be PHP8で新しく備わった機能について、コードを交えてスライドで分かりやすく解説して下さっています。 特に以下の8つの大きなアップグレードについては詳しく解説されています。 The JIT Compiler Attributes Named Arguments Match Expression Throw expression static Return Type Union Types mixed type これからPHP8で開発を行うエンジニアにとっては非常に役に立つ、実践的な内容でした。 巨大な モノリス の静的解析をレベルMaxにする方法 report by id:hirobex 株式会社ホワイトプラスの古賀敦士さんによるセッションです。 speakerdeck.com 低いレベルで運用されていたPHPStanの静的解析レベルを上げていく取り組みについて紹介してくださりました。 はじめに、一度にすべてのモジュールの解析レベルを上げていくのは難しいため モジュール毎に設定したレベルで静的解析を行えるようにPHPStanの実 行基 盤を整えたそうです。 その後、解決できそうなデッドコードは削除したり、型宣言など対応に時間がかかりすぎるものはBaselineでエラーをまとめて無視して一旦レベルを上げるという手法でレベルをMaxにしたそうです。 また、付録としてレベル上げのロードマップやレベル別のルールについての資料も載せてくださっています! 続) 改善失敗から学ぶ、レガシープロダクトに立ち向かうチーム作り report by id:Jazuma サイボウズ 株式会社 中田 雄大 さんによるセッションです。 youtu.be Garoon(20年目・PHP7.4・テーブル数850(!))というプロジェクトの改善記録を披露していただきました。 実施した施策 1. Controlloer改善 ○ 改善前の問題 リク エス トパラメータに配列ベースでアクセスしている 手動で型変換をしている クラス同士が密結合で再利用しづらい ControllerでViewを生成している → ユニットテスト が書けない ・保守性が低い ○ 実施したこと リク エス トの取り扱いやレスポンスデータ取り扱いを標準化する基底クラス作成 View描画用のクラスを追加し、描画処理を隔離 DIコンテナ導入: 環境別の依存性注入や処理を制御 →冗長なコードが削除され、 ユニットテスト が書けるように 2. フロントエンド改善 ○実行したこと ES2015 / TS以降 レガシーなコードの改善 スパゲッティコード なくす 不明確な階層構造脱却 インラインJSを抜きだす リファクタリング 後に ユニットテスト 実装 ReactJS導入 改善により得られた知見 自動テスト( ユニットテスト だけでなく、E2Eテストも含む)が重要 改善にあたっての課題 新機能の実装と改善を両方やる 工数 が確保しづらい 改善タスクの粒度が大きく、着地点が見えない 他のメンバーがやっている改善が分からない(何をやっているか・何のためにやっているか) これらの課題から「チームとして改善を継続していくための仕組みが必要」という教訓が得られました。 改善継続のために、 進捗状況を共有するためのミーティングをする・割り込みタスクの対応ルールを決める といった仕組みができました。 改善を続けるためには技術的な取り組みだけでなく、チームビルディングとしての取り組みも必要だと思いました。 いよいよ開始!徳丸実務試験、PHP8上級試験の模擬問題解説 report by id:kuwa_38 youtu.be セッション概要: 吉政さんからのPHP8上級試験と徳丸実務試験の概要説明、特典が紹介されました。 徳丸さんから徳丸実務試験の模擬問題2問とその解説が行われました。 古圧さんからPHP8上級試験の模擬問題2問とその解説が行われました。 模擬問題の概要: 徳丸さんから出題 1問目:認証にBearer トーク ンを使うウェブ API 呼び出しにおいて、 JavaScript 側、 API サーバー側で必要なプロパティ、ヘッダを問う問題 2問目: PHP の API のコード例が表示され、 クロスサイトスクリプティング ( XSS )について正しい記述を選択する問題 古圧さんからの出題 1問目:クラスの継承やトレイトの正否を問う問題 2問目:PHP8への移行に関する問題として、名前付き引数やnullsafe 演算子 、match式について正否を問う問題 視聴後の所感: 大まかには知っているものの「あれ?どうだっけ」という問題や選択肢もあり、知識の再確認や学習にはよいと感じました。 API のプロパティやヘッダ、 XSS などの 脆弱性 、 php の性質やphp8への移行に伴う変更や新機能など、興味がある方は アーカイブ から一度見て頂ければと思います。 OpenAPI × Laravelで API 開発を各段に便利にする方法 report by id:Jazuma 株式会社ゆめみ 皆川泰陽さんによるセッションです。 youtu.be OpenAPI仕様書を"半"自動生成する OpenAPI仕様書を API テストのAssertに使う OpenAPIを案件で使った感想 という内容の発表でした。 ○ openAPI仕様書"半"自動生成 半自動生成と GUI ツーるはどっこいどっこい キー名やコメントが統一された実装であれば半自動生成は便利 laravel-openapiはまだ成長中の OSS なのでない内部実装を読んでいる人が欲しい ○ API テストのAssert 使わない理由が無いほど便利 assertの量が減るのが便利 先にopenAPI仕様書がある場合でも使える 仕様書に不備があると困る OpenAPI仕様書の半自動生成はまだまだ発展途上・OpenAPI仕様書を使うことは現時点でもメリットが大きい、というのが現状のようです。 PHP で書いて覚える非同期処理 report by id:radiocat speakerdeck.com PHP8.1から非同期処理が書けるようになったことを踏まえて非同期処理の概念を理解し、今後の活用に向けて実装イメージと技術動向をおさえたい人のためのセッションです。 JavaScript のようなUIを扱う処理では非同期処理が主流となっています。一方で PHP のようなバックエンド処理ではデータの整合性を維持するために同期処理が一般的です。 PHP での非同期処理の主な使い方としてIO処理が考えられます。その中でも今回は以下の3つのIOモデルについて PHP の実装イメージを交えて解説されました。 ブロッキング IO ノン ブロッキング IO IO多重化 PHP8.1で実現できる非同期処理はまだまだほんの一部で、一般開発者が扱える機能ではなさそうです。ただ、 Xdebug が動くことによって デバッグ しやすくなるというメリットはありそうなので、将来の活用にそなえて非同期処理を勉強しておきたい人には参考になる情報がスライドで多数紹介されています。 【IMO】コードレビューって難しいよね report by id:tsudachantan speakerdeck.com コードレビューを効果的に実施するにあたり、コードレビューに対する苦手意識をなくしていこう!というセッションです。 苦手意識の原因として、他のメンバーよりも時間がかかる、コードの改善提案の回数が少ない、違和感があっても改善案までコメントできない、そもそも自分の理解力の問題のような気がする…などなど コードレビューに自信がないという悩みを解決するため、体験談を踏まえて克服への道 のりを お話していただけました! 個人的に共感できる悩みばかりで大変ためになりました。 実際にコードレビューでの改善提案が多い方の意見を踏まえ、すぐに実践できる観点をたくさん解説していただけました。 自分ならこう実装すると答え合わせする 可能な限りコードジャンプする 自分の理解が合っているか確認するためのコメント 実装に疑問があれば デバッグ する といった風に、疑問点をなくして自信がない状態を抜け出すための具体的なヒントを頂けました。 「効果的なコードレビューがチームの成熟度やプロダクトの品質に影響を及ぼすといっても過言ではない」とおっしゃられていました。 このセッションを踏まえて今後のコードレビューに取り組んで、苦手意識を克服していきたいです。 サービス運用エンジニアによるPHP8バージョンアップ奮闘記 report by id:richardwagner youtu.be 弊社と同様にPHP8へのバージョンアップに取り組まれたヒエ イカ ザトさんのセッションでした。 弊社でもかなり苦しめられたバージョンアップ、いったいどのように取り組まれたのだろう?と興味津々で聴講させてもらいました。 弊社と共通する事例もありつつ、具体的なアプローチ方法まで踏み込んだ充実したセッションでした。 予定よりも少ない 工数 (予想:3か月⇒実際:2.5か月)で完了された技術力はさすがと感じました。 以下、「なるほど!」と感じ入ったポイントです。 Dockerなどを駆使してローカル検証しておくと、後から本格検証するのが楽 PHP のバージョンアップと技術的負債の返済を同時にやりすぎると、バグったときに切り分けが大変になるので注意 バージョンアップは怠ると後が大変 こまめなバージョンアップそれ自体を組織の文化・体質にしてしまうのがよい 製品ロードマップにあらかじめ組み込んでおくと、ビジネスサイドとの合意が取りやすい チームで担当を回す(属人化排除大切!) 抽象のはしごの上手な登り方~使いやすい汎用ライブラリを作るために~ report by id:richardwagner youtu.be PHP によるログ実装を題材にした抽象的プログラミングについてのセッションでした。 「抽象度は高ければいいというものではない。」という提言は、ともすれば理想に走ってしまいがちな私たちエンジニアの視点に警鐘をならしてくれました。 どの程度まで抽象化したらいいのかという「正解」について迷うことは確かに多く、その際に考える際の一つのヒントになりそうです。 抽象度は「はしご」で表現しやすい。そのままの姿勢で、ちょっと上る/下りるの微調整が簡単 抽象度は高ければいいというものではない。抽象度は必要十分なレベルにする ブログや登壇は抽象度を上げるうえでよい訓練になる 弊社の登壇セッションのご紹介 ここからは弊社から登壇させて頂いたセッションの内容をご紹介します。 レガシーシステム におけるPHP8バージョンアップのアプリ対応記録 youtu.be speakerdeck.com 弊社の楽楽販売の開発チームからPHP8へのバージョンアップの取り組みついて発表しました。 今年EOLを迎える7.3からのバージョンアップのため開発期間が限られた中で、下位互換のない変更点が多く存在しているという難易度の高い状態でした。特に影響の大きい変更点は次の2つです。 緩やかな比較 演算子 の挙動変更 警告レベルの変更 前者は == の比較結果が変更になるパターンに絞って影響箇所を洗い出してコードを修正し、後者はまず影響箇所を動作させてログを出力してエラー担った箇所に絞って修正しました。いずれも膨大な影響範囲から重大な問題箇所に絞って対策を行っています。それでも前回のバージョンアップの2倍以上のコストがかかったとのことで、今後に向けては普段からの静的な型を意識した実装とこまめな リファクタリング が重要であると締めくくりました。 20年モノの巨大 Webサービス の開発継続戦略 - ミドルウェア のバージョンアップとの向き合い方 youtu.be speakerdeck.com 弊社の最長寿サービスであるメールディーラー開発チームからレガシーなサービスにおける ミドルウェア のバージョンアップへの向き合い方について発表しました。 我々はなぜ長い年月をかけて開発を続けているのかというと、ユーザーにとって価値があるビジネスの一部だからです。ところが リファクタリング などの改善はすぐにコストが回収できず新しい価値を生み出しにくいため取り組みづらさがあります。一方で ミドルウェア のバージョンアップは実施しなければ明確に価値が下がるため実施せざるを得ません。 とりあえずサービスを継続し生き続けるために最小限のコストでバージョンアップをやりきろうというのが今回の発表で紹介された戦略でした。 技術コミュニティ運営戦線〜継続して勉強会を運営するために〜 youtu.be speakerdeck.com 弊社で毎月1回開催している PHP TechCafeの運営メンバーが技術コミュニティの運営について発表しました。 社内のもくもく勉強会を社外にも発展させていく中で、エンジニア同士の交流を広げるために弊社の技術領域である PHP をテーマに据えて関西で一番盛り上がる PHP コミュニティを目指して試行錯誤してきました。毎月開催のコミュニティを継続させるためには省力化が大事です。主催者だけが頑張りすぎては続かないので、参加者や社内のメンバーを巻き込んでコンテンツを作っています。そうやってコミュニティを運営していくモチベーションはどこにあるのかというと、結局は「やりたいから、やる」ということです。 コミュニティを運営していく熱意を持ちつつ、一人で抱え込まずにテーマや目的に沿って周りを巻き込みながら運営するのが継続のポイントであるという話でした。 まとめ レガシーシステム の改善から最新技術の導入事例に至るまでバリエーション豊かな発表内容でした。 参加のハードルが低いのがオンラインイベントの大きなメリットだと思うので、オフラインイベントが開催できるようになってもオンライン参加もできるような体制が続いてほしいと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
PHP 入門者・プログラミング初心者向けに PHP でforeach構文の使い方を解説します。foreach構文は、配列の要素の数だけ繰り返し処理を行います。 foreachの基本的な解説 から、 連想配列 での使い方 、 繰り返しの途中で処理をスキップする方法 、おまけとして foreachに代わる、スマートに書ける PHP のメソッドの紹介 をします。 目次 目次 foreach構文とは foreach構文を実際に使ってみよう 連想配列での使いかた ループの途中で処理をスキップする方法 while構文やfor構文との違い foreachに代わるループ構文 foreach構文とは foreach文 は 配列に含まれる要素の値をループで順番に取り出して処理 したい場合に便利な繰り返し構文です。 配列は複数のデータをまとめて格納できる変数です。 ※配列については下記ページでわかりやすい解説があります。 PHPの配列機能のまとめ - RAKUS Developers Blog | ラクス エンジニアブログ 繰り返しの処理 を行う他の構文は、 PHP ではfor文やwhile文などがあります が、 foreach構文は繰り返しを終了する条件を記述する必要がなく 、それらに比べて簡潔に記述できます。 foreachは配列の要素の数だけ繰り返し処理を実行したら、ループが終了する という特徴があります。 foreach構文を実際に使ってみよう 構造は次のようになっています。 foreach (要素を取り出す配列 as 配列から取り出した要素を格納する変数){ 実行する処理※配列から取り出した要素を格納する変数が使用できる; } 要素を取り出す配列 :ループで順番に中身が取り出される配列です。その配列の要素の数だけループが繰り返されます。 配列から取り出した要素を格納する変数 :ループ1回で配列内にある1つの要素がこの変数に代入されます。毎ループ同じ名前の変数に、配列の中の1つの要素が格納されます。 サンプルプログラムで具体的に動きを見てみましょう <?php $ animalList = [ "犬" , "猫" , "うさぎ" ] ; foreach ( $ animalList as $ animal ){ print $ animal . "<br>" ; } ?> このときの出力結果は下記のようになります。 犬 猫 うさぎ 先ほどの処理の流れは以下の通りです。 1. 「$animalList」配列に「犬」「猫」「うさぎ」を代入 ---ループ開始(「犬」、「猫」、「うさぎ」の合計3回繰り返す)---  -ループ1回目-  2. foreach文冒頭で「$animalList」から「犬」を取り出し「$animal」に代入  3. 「print $animal;」で「犬」を出力  -ループ2回目-  4. foreach文冒頭で「$animalList」から「猫」を取り出し「$animal」に代入  5. 「print $animal;」で「猫」を出力  -ループ3回目-  6. foreach文冒頭で「$animalList」から「うさぎ」を取り出し「$animal」に代入  7. 「print $animal;」で「うさぎ」を出力 ---ループ終了--- 使用時の注意 PHP は変数の有効範囲である スコープが他言語と異なることがあり 、その影響でハマるケースもあります。 PHP には 条件分岐内やループ内の ブロックス コープがない ため、上の例では$animalはループを抜けた後でも値が入ったままです。 ループ内でセットした変数についても同様に、ループを抜けた後でも値が入っています。 他の言語とは異なる動きになるため、注意が必要です。 参考: スコープ - Wikipedia 参考: PHP: 変数のスコープ - Manual 連想配列 での使いかた 上記では一次配列を基にループをさせていましたが、 連想配列 でも同じくforeach構文を使用できます。 連想配列 は、下記のように キーと値のペア(キーバリューストア)が格納されています。 $animalList = ["dog" => "犬", "cat" => "猫"] この場合、 キー は「dog」「cat」、 値 は「犬」「猫」となります。 サンプル <?php $ animalList = [ "dog" => "犬" , "cat" => "猫" , "rabbit" => "うさぎ" ] ; foreach ( $ animalList as $ key => $ value ) { print $ key . "は" . $ value . "という意味です<br>" ; } ?> こちらを実行してみると、以下のような結果となります。 dogは犬という意味です catは猫という意味です rabbitはうさぎという意味です ループの途中で処理をスキップする方法 foreach等 の繰り返し処理の途中で、 その繰り返しを抜けたり 、 その回の繰り返しを飛ばして次の繰り返しを行ったりしたいとき があります。 「繰り返しを抜ける」 というのは、例えば、配列の中に"dog"という文字列が1つあり、それを 検索したい場合 です。 "dog"が見つかったら目的を果たしたことになり、 それ以降の繰り返し処理の中での検索は意味がない ので、その ループ自体を抜けたほうが高速で低負荷な処理 が実現できます。 「その回の繰り返しを飛ばして次の繰り返しを行う」 というのは、保存処理で一例を挙げると、 値が入っている場合は保存 して、 値が入っていない場合は保存しない といった場合です。 値が入っていない場合は、保存をする必要がない ため、 現在のループをスキップして次のループに移行した方が不要な処理を行わなくて済みます。 そんな時に使えるのが break文 と continue文 です。 break文 は、繰り返し処理を中断し、 繰り返しの中から抜けます。 continue文 はその回の 処理を飛ばし、次の繰り返し処理へと進めます。 break文 や continue文 は、 foreachだけでなく 、whileやfor等の 他のループでも使用できます。 それでは、実際に動きを見てみましょう。 continue文 foreach ( $fruits as $fruit ) { // 処理A contiue; // 処理B } 処理の流れ :foreach開始 → 処理A → continue (その回のループをスキップ) → 処理A → continue.... この例では 処理Bはスキップ されて、次のループで処理Aを実行します。 break文 foreach ( $fruits as $fruit ) { // 処理A break; // 処理B } // 処理C 処理の流れ :foreach開始 → 処理A → break (ループ自体を抜ける) → 処理C 処理Aの直後に 繰り返し処理を抜けて(終了して) 、処理Cを実行します。 while構文やfor構文との違い foreach はわかったけど、 他の繰り返し構文のwhile文やfor文とはどうちがうの? と思われるかもしれません。 ここでは foreach と while、forを比較 して、 どういう場面で使いやすいのか という解説をしていきます。 これから、同じ結果を出力するコードをforeach、while、forで書き換えてみます。 まずはforeachから foreach <?php $ animalList = [ "犬" , "猫" , "うさぎ" ] ; foreach ( $ animalList as $ animal ){ print $ animal . "<br>" ; } ?> while <?php $ animalList = [ "犬" , "猫" , "うさぎ" ] ; $ animalNum = 3 ; //count()などを使って配列の要素数を数えたほうが変更に強いプログラムになります $ index = 0 ; while ( $ index !== $ animalNum ) { print $ animalList [ $ index ] . "<br>" ; $ index ++ ; } ?> for <?php $ animalList = [ "犬" , "猫" , "うさぎ" ] ; $ animalNum = 2 ; //count()などを使って配列の要素数を数えたほうが変更に強いプログラムになります for ( $ index = 0 ; $ index <= $ animalNum ; $ index ++ ) { print $ animalList [ $ index ] . "<br>" ; } ?> 結果 犬 猫 うさぎ 各繰り返しの構文の特徴をまとめると以下のようになります。繰り返し処理を行うときの参考にしてください。 構文 処理に適している条件 特徴 foreahc 配列の全ての要素に対して繰り返し処理を行いたい。 条件式を意識しなくても繰り返し処理ができる。 while 指定した条件の間は、繰り返し処理を行いたい。 条件式のみで繰り返しができるので、フラグで繰り返し処理を管理する場合は向いている。 for 初期値、条件、増減式を指し、指定した条件になるまで繰り返したいとき。 繰り返しの条件を1行で定義できるので、可読性が高い。配列を使わない繰り返し処理に向いている。 ここまで foreach構文 を中心に繰り返し処理をみてきましたが、 それぞれ得意なことが異なります。 目的に合った構文を使えるようになるとコーディングが楽になります。 繰り返し処理は PHP に限らずプログラム初心者のうちはつまずきやすい箇所なので、最初は画面に要素やキーを出力しながら デバッグ を行うとわかりやすいです。 参考: PHP: while - Manual 参考: PHP: for - Manual foreachに代わるループ構文 foreach で繰り返し処理をさせて、その中で任意の処理を書いていくというのはよくあることです。 ですが、実は PHP には標準関数 として、 便利に配列を処理するarray系の関数 が用意されています。 array_xxxx の形の array系関数 を使うことで、 foreach で任意の処理を書いていくのと比べると 「記述量が減る」「高速処理」「バグの発生を防げる」 というメリットがあります。 開発をする上で、配列の処理をスマートに書けると 大幅な業務効率アップに繋がる でしょう。 知っているだけで大きな強みになります。今後のためにも、 ループの中で配列を扱うときには、一度調べてみることをお勧めします。 今回はたくさんある中から一例をご紹介しますが、他にもたくさん便利なメソッドがあります。 是非 foreach以外の配列ループの世界 にも飛び込んでみてください。 参考: PHP: 配列 関数 - Manual 配列の中の数値の合計値を返してくれる array_sum() //この配列の合計が欲しい場合 $ary = [100, 200, 300]; foreachの場合 $sum = 0; foreach($ary as $num){ $sum += $num; } echo $sum; //出力: 600 array_sumの場合 $sum = array_sum($ary); echo $sum; //出力: 600 4行が1行になりました。 重複を排除した配列を返してくれる array_unique() //この配列を ["a", "b", "c"] にしたい場合 $ary = ["a", "b", "a", "c"]; foreachの場合 $uniq_ary = array(); foreach($ary as $str){ if(!in_array($str, $uniq_ary)){ $uniq_ary[] = $str; } } var_export($uniq_ary); array_uniq()の場合 $uniq_ary = array_unique($ary); var_export($uniq_ary); 6行が1行になりました。 今回は PHP のforeachの基礎の解説から、発展形のarray系関数を紹介しました。 「配列を制する者はプログラミングを制する」というエンジニア界隈のことわざがあります。 皆さんも、 PHP のforeachを使いこなし、配列マスターを目指しましょう。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは、株式会社 ラク スで先行技術検証を行っている技術推進課の @t_okkan です。 技術推進課では、新サービス立ち上げ時の開発速度アップを目的に、現在 ラク スでは採用されていない新しい技術の検証を行う、技術推進プロジェクトがあります。 今回はその技術推進プロジェクトで、ドキュメントDBであるMongoDBについて検証を行いましたので、その結果の報告を行います。 なお、別テーマの取り組みや、過去の取り組みに関しては、こちらからご覧ください。 tech-blog.rakus.co.jp ドキュメントDB MongoDB トランザクション WiredTigerストレージエンジン 水平方向と垂直方向へのスケーリング Aggregation Pipline MongDBのスキーマ設計 PostgreSQLのjson型、jsonb型との比較 Javaアプリケーションでの実装例 MongoDBとの接続 定義情報のCRUD処理 RDBとMongoDBのトランザクション まとめ ドキュメントDB ドキュメントDBとは、半構造データを管理するNoSQLなデータベースです。半構造データとは、ある程度データ構造が決まっているが構造が柔軟に変更できる、もしくは変更されるデータのことで、 JSON や XML 形式で表されます。 ドキュメントDBの特徴としては以下のようなことが挙げられます。 スキーマ レスで動的なデータを保存できる 膨大なデータを高速に処理することができる アプリケーションとデータベースの インピーダンス ミスマッチを解消できる リレーショナルデータベースとドキュメントDBなどの非リレーショナルデータベースを併用し、データの特性ごとに適材適所のデータベースを利用する考え方をポリグロット・パーシステンス(複数モデルによる永続化)と呼びます。 今回はドキュメントDBの製品であるMongoDBについて調査し、実際にポリグロット・パーシステンスを実装してみました。 MongoDB MongoDB Incが開発とサポートをしているドキュメントDBです。データをBSONという JSON のバイナリ版の形式で保存することができます。 CouchDB やRavenDBといった、同じドキュメントDBの中では最も人気のあるデータベースとなっています。 それではMongoDBの基礎的な機能などについて説明します。 トランザクション MongoDBではバージョン4.0からマルチドキュメントACID トランザクション をサポートしています。(レプリカセット構成でWidredTiger利用時)デーベース、コレクション、ドキュメント単位から トランザクション を開始できます。以下のような トランザクション レベルが提供されています。 書き込みレベル w:1 :プライマリにコミットされるとコミット完了とする w:"majority" :レプリカセットの 過半数 にコミットされると完了とする 読み込みレベル local :プライマリの最新データを取得する majority :書き込みレベルが w:"majority" の場合、レプリカセットの 過半数 にコミットされているデータを取得する snapshot :レプリカセットの 過半数 で反映されているデータから取得する docs.mongodb.com WiredTigerストレージエンジン バージョン3.2からMongoDBのストレージエンジンのデフォルトがWiredTigerに変更されています。 WiredTigerはMVCC アーキテクチャ を採用しており、ドキュメントの書き込みの同時実行が可能になります。 これまでのMMAPv1と比べ、メモリ制限や、データとインデックスの圧縮が可能になっています。 WiredTigerの詳しい動作の説明はこちらのスライドで詳しく説明されています。 WiredTigerを詳しく説明 from Tetsutaro Watanabe www.slideshare.net 水平方向と垂直方向へのスケーリング MongoDBではシャーディングと レプリケーション を組み合わせた、シャードレプリカを構築することで水平方向と垂直方向のスケーリングを行うことができます。これにより、性能と可用性の両面を向上させることができます。 gihyo.jp Aggregation Pipline 1つのコレクション内の複数のドキュメントをグループ化し、複数の処理を実行するパイプラインを実装することができます。データのフィルターや集約、ソート、変換などが可能となります。 SQL の group by や sum 関数といった処理を再現することができます。 docs.mongodb.com MongDBの スキーマ 設計 MongoDBのドキュメントの スキーマ を設計するには、ドキュメントに対するアクセスパターンとクエリを理解する必要があるとされています。WiredTigerのメモリに検索結果をキャッシュするため、必要のないデータをクエリするとメモリの無駄遣いになってしまいます。 そこでMongoDBでは、 スキーマ 設計パターンが提供されており、データの特性やアクセスパターンから最適な設計パターンを選択することが推奨されています。 www.mongodb.com Polymorphic patter ・ Attribute pattern ・ Subset patter の設計パターンが参考になるのではないかと思います。 PostgreSQL の json 型、jsonb型との比較 PostgreSQL では9.2から json 型が、9.4から JSON 形式のデータをバイナリ解析して保存するjsonb型が提供されています。 そのため、 PostgreSQL でも動的なカラムの増減に対応することができます。 以下、MongoDBと PostgreSQL の json 型とjsonb型について比較しました。 比較項目 PostgreSQL json 型 PostgreSQL jsob型 MongoDB インデックスの設定 不可 可能 可能 トランザクション 対応 対応 対応 データ型 JSON型 に準拠 一部のデータ型に 制限あり BSON型 に準拠 全文検索 対応 対応 日本語未対応 MongoDBは PostgreSQL の JSON 型と比べ、豊富なデータ型に対応しています。しかし、MongoDBは日本語での 全文検索 に対応していません。(他の言語には対応) Java アプリケーションでの実装例 今回は以下のようなマスターデータをリレーショナルDB( PostgreSQL )に、カスタム項目などのユーザーごとに動的に変更される定義情報をMongoDBに登録するポリグロット・パーシステンスなシステムを実装してみました。 MongoDBの Java Driverは以下のように build.gradle に設定しています。 dependencies { implementation group: 'org.mongodb', name: 'mongodb-driver-sync', version: '4.2.3' } MongoDBとの接続 Java アプリケーションからMongoDBへ接続するには、 RDB 同様にURLを利用して接続します。 レプリカ構成のMongoDBを利用している場合は、メンバーのホスト名とレプリカセット名を指定して接続します。 MongoClient mongoClient = MongoClients.create( "mongodb://ユーザー名:パスワード@ホスト名" ); // レプリカ構成の場合 MongoClient mongoClient = MongoClients.create( "mongodb://ユーザー名:パスワード@プライマリホスト,セカンダリホスト,ターシャリホスト?replicaSet=レプリカ名" ); 定義情報の CRUD 処理 Java アプリケーションからの CRUD 処理の一例を紹介します。前提条件としてユーザーの定義情報は Map<String, Object> 型のデータとしてやりとりされる前提とします。 // 定義情報 Map<String, Object> property1 = new HashMap<>(){ { put( "設定1" , "オプション1" ); put( "設定2" , 3 ); put( "設定3" , true ); } }; Map<String, Object> property2 = new HashMap<>(){ { put( "設定1" , 1 ); put( "設定4" , false ); put( "設定5" , "オプション5" ); } }; // コレクションの取得 MongoCollection<Document> collection = mongoClient.getDatabase( "データベース名" ).getCollection( "コレクション名" ); // ユーザーの定義項目の登録 Document registorData = new Document(); property1.entrySet().stream().forEach(e -> registorData.append(e.getKey(), e.getValue())); registorData.append( "userId" , "user1" ); collection.insertOne(registorData); // ユーザーの定義項目の検索 Document query = new Document( "userId" , "user1" ); Document result = collection.find(query).first(); // ユーザーの定義項目の更新(上書き + 追記) Document query = new Document( "userId" , "user1" ); Document updateData = new Document(); property2.entrySet().stream().forEach(e -> updateData.append(e.getKey(), e.getValue())); collection.updateOne(query, new Document( "$set" , updateData)); // ユーザーの定義項目の削除 Document query = new Document( "userId" , "user1" ); DeleteResult deleteResult = collection.deleteMany(query); その他、 CRUD 処理については以下の チュートリアル で詳しい実装例が紹介されています。 mongodb.github.io RDB とMongoDBの トランザクション MongoDBでの トランザクション の実装は以下のようになります。 ClinetSession の startTransaction メソッドで トランザクション 開始 ClinetSession の close メソッドで トランザクション を終了 MongoDBの処理に失敗すると MongoCommandException がthrowされるのでcatch節で ClinetSession の abortTransaction メソッドを実行しロールバッ // MongoCommandExceptionをロールバック対象の例外に設定 @Transactional(rollbackOn = MongoCommandException.class) public void transactionA() throws MongoCommandException { // MongoDB Sessionの取得 ClientSession session = mongoClient.startSession(); try { // MongoDB トランザクションの開始 session.startTransaction(); // PostgreSQLの処理 // MongoDBの処理 } catch (MongoCommandException e) { // ロールバック処理 session.abortTransaction(); throw e; } finally { // MongoDB トランザクションクローズ session.close(); } } 今回のようにマスターデータは RDB に設定情報はMongoDBに保存されている場合、マスターデータを変更した場合にMongoDBのデータも変更する可能性が出てきます。 上記の実装のように、 PostgreSQL の トランザクション 処理の中にMongoDBの トランザクション 処理を実装することで、どちらかのデータ保存に失敗した場合、両方のDBを ロールバック することができるようになります。 まとめ MongoDBの機能の解説と Java アプリケーションでのサンプルについて解説しました。 日本語での 全文検索 に対応していないものの、 トランザクション への対応など豊富な機能が提供されており、 データ形式 によってはMongoDBが最適解となることもあるのではないでしょうか。 もしMongoDBの導入を検討されている方がいましたら参考にしていただければと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに まずはwebpack esbuild swc Snowpack Vite まとめ はじめに こんにちは。フロントエンドチームの岡山です。 私の担当するプロジェクトでは現在Vue2を使っており、webpack(vue- cli )を使ってビルドを行っています。 webpack自体は非常に有用なツールではありますが、あえて不満を挙げるならビルドが遅いことでしょう。 キャッシュや処理の並列化など、高速化のためにビルド設定の最適化を行ってはいますがそれでも遅いです。 小さいプロジェクトでは気にならなくても、大きくなるとともにこの問題が顕在化し、無視できなくなるかもしれません。 この記事では高速なビルドを可能にする新興勢力をいくつかご紹介します。 まずはwebpack 比較対象がないと評価しにくいので、最初にwebpack5 + ts-loaderを使います。 React + TypeScript + Material UIで作られた サンプルプロジェクト をビルドしてみます。 TypeScriptの型チェックは fork-ts-checker-webpack-plugin を使って別プロセスで行うようにします。 // webpack.config.js const path = require( 'path' ) const ForkTsCheckerWebpackPlugin = require( 'fork-ts-checker-webpack-plugin' ) const loaders = { ts: 'ts-loader' } const loaderOptions = { ts: { transpileOnly: true } } module.exports = (env = {} ) => ( { mode: process.env.NODE_ENV, entry: './src/index.tsx' , output: { filename: 'index.js' , path: path.resolve(__dirname, 'dist' ), } , module: { rules: [ { test: /\.tsx?$/ , use: { loader: loaders [ env.loader ] , options: loaderOptions [ env.loader ] } , exclude: /node_modules/ , } , ] , } , resolve: { extensions: [ '.tsx' , '.ts' , '.js' ] , } , plugins: [ env.tscheck == 'yes' ? new ForkTsCheckerWebpackPlugin() : false ] .filter( Boolean ), } ) // package.json " scripts ": { " build:webpack-ts ": " webpack --progress --env loader=ts ", " build:webpack-ts-tscheck ": " webpack --progress --env loader=ts tscheck=yes " , } 結果は以下の通りでした。 後で紹介するesbuildとswcは型チェックを行わないため、型チェックを行わない場合も計測しておきました。 型チェック time あり ~10s なし ~4.5s esbuild esbuild はGoで実装された JavaScript /TypeScriptのビルドツールです。 トランスパイルからバンドル、ミニファイまでやってくれます。そして圧倒的な速さを誇ります。 公式ドキュメントによるとその速さはwebpackやRollupの数十倍。 これまでビルドに1分かかっていた場合、これが1秒くらいになる計算です。圧倒的です。 また、esbuildには プラグイン が利用可能なため、ビルドプロセスの様々な部分に処理を追加することが可能です。 しかし 既存のプラグイン はまだ充実していないため、必要に応じて自作する必要があるかもしれません。 詳しくは こちら を参照ください。 それでは実際にesbuildを使って同じプロジェクトをビルドしてみます。 $ npm i --save-dev esbuild // build.js const { build } = require( "esbuild" ); build( { define: { "process.env.NODE_ENV" : process.env.NODE_ENV } , target: "es2015" , platform: "browser" , entryPoints: [ "src/index.tsx" ] , outdir: "dist" , bundle: true , minify: !process.env.NODE_ENV, sourcemap: process.env.NODE_ENV } ) . catch (() => process.exit(1)) // package.json " scripts ": { " build:esbuild ": " set NODE_ENV= \" development \" && node ./build.js " , } ビルドにかかった時間は ~0.8s ほどになりました。 速いです。数十倍とまでは行きませんでしたが、4.5秒と1秒以下は体感でも結構違います。 とまぁ速いのはわかりましたが、プロダクトへの導入には懸念があります。 公式も言っている通り 、現状v1.0.0に到達していないesbuildはproduction-readyではありません。 そこでwebpackプロジェクトにも比較的気軽に導入できる、 esbuild-loader を使ってみることにします。 これはts-loaderやbabel-loaderの代替となるローダーです。webpackでのビルドでもesbuildの一部をお手軽に利用することができます。 $ npm i --save-dev esbuild-loader // webpack.config.js ... const loaders = { esbuild: 'esbuild-loader' } const loaderOptions = { esbuild: { loader: 'tsx' , target: 'es2015' } , } ... // package.json " scripts ": { " build:webpack-esbuild ": " webpack --progress --env loader=esbuild " , } ts-loaderからesbuild-loaderを使うようにするとビルド時間は ~4.2s ほどでした。 若干速くなった...でしょうか。おそらくesbuild-loaderの導入を検討している方のほとんどはビルド時間の高速化を目的としていると思います。一概には言えませんが、esbuild-loaderの導入だけでは大きな改善は難しいかもしれません。 swc swc は Next.js v11にも組み込まれた JavaScript /TypeScriptトランスパイラです。 こちらはRustで実装されています。swc単体ではバンドラーとしての機能は持っておらず、バンドルするには spack 等を利用する必要があります。 esbuildと同じようにswcにもwebpackで使用可能なローダー swc-loader があったのでこちらを使ってみました。 $ npm i --save-dev @swc/core swc-loader // webpack.config.js ... const loaders = { swc: 'swc-loader' } const loaderOptions = { swc: { sync: true , jsc: { parser: { syntax: "typescript" , tsx : true } } } } ... // package.json " scripts ": { " build:webpack-swc ": " webpack --progress --env loader=swc " , } ビルドにかかった時間は ~4.1s ほどでした。esbuild-loaderと同じような感じですね。 Snowpack Snowpack もwebpackやParcelなどのバンドラーの代替手段として登場しました。 webpackなどの従来のビルドツールは1つのファイルを保存するたびに、アプリケーション全体を再構築してバンドルする必要がありました。 ここでSnowpackは(開発時には)もはやバンドルをしないというアプローチをとりました。 JavaScript のESMを活用することで開発中はバンドルせずに各ファイルを都度読み込みます。これにより、大規模なプロジェクトでも高速に開発サーバを起動することが可能になります。 各ファイルは一度だけビルドされ、キャッシュされます。ファイルが変更されるとそのファイルのみビルドするため、差分更新も一瞬で完了します。 また、Snowpackには先ほどご紹介したesbuildが組み込まれているため、本番ビルド時にesbuildを使ってバンドルすることができます。 ただし、esbuildは先述の通り成熟していないという理由で webpackプラグインを使用することが推奨されています (Rollup プラグイン もあります)。 開発者としては頻繁に行われる開発時のビルド時間が短縮されると特にうれしいため、開発者体験の向上とプロダクトへの導入しやすさの両方を実現していると言えます。 $ npm install --save-dev snowpack @snowpack/plugin-webpack // snowpack.config.js module.exports = { mount: { public : { url: '/' , static : true } , src: '/dist' } , plugins: [ [ '@snowpack/plugin-webpack' , ] ] } // package.json " scripts ": { " start ": " snowpack dev ", " build ": " snowpack build " } 実際にビルドしてみると、開発サーバーが ~1s ほどで起動します。噂通りの速さですね。差分更新なんかは一瞬です。 Vite Vite もSnowpackと非常に似た目的を持ったNo-bundleツールです。 依存関係の事前バンドルにはesbuildを、本番ビルドではRollupを使用します。 $ npm install --save-dev vite @vitejs/plugin-react-refresh // vite.config.ts import { defineConfig } from 'vite' import reactRefresh from '@vitejs/plugin-react-refresh' import path from 'path' export default defineConfig( { root: './' , plugins: [ reactRefresh() ] , resolve: { alias: { '@/' : path.join(__dirname, './src/' ), } , } , } ) // package.json " scripts ": { " start ": " vite ", " build ": " vite build " } Snowpackと同様、開発サーバーが ~1s ほどで起動しました。 まとめ esbuildはトランスパイルもバンドルも高速に動作します。この速さに慣れたらwebpackには戻りたくなくなります。 が、様々な プラグイン を使ったある程度の規模のwebpackプロジェクトをesbuildに置き換えするのは現実的に難しい点もあるでしょう。 swcも高速ではありますが、プロダクトで採用するにはspackが発展途上過ぎるなという印象を感じました。ただ、Next.jsやDenoでは内部で使われているため、開発者は意識しなくてもその恩恵を受けられるようになっています。 SnowpackとViteは高速な開発ビルドによる開発者体験の向上と、安定したwebpackやRollupによる本番ビルドを兼ね備えたツールです。 私が所属するチームではVue2を使っているので、Vue3に上げるタイミングに合わせてViteの導入もできればなーと思っています。 ここでは紹介しきれなかったものもあるので、皆さんもぜひ様々なビルドツールを調べてお試しになってみてはいかがでしょうか。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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 )です。 ラク スの開発部ではこれまで社内で利用していなかった技術要素を自社の開発に適合するか検証し、ビジネス要求に対して迅速に応えられるようにそなえる 「技術推進プロジェクト」 というプロジェクトがあります。 2021年度は通年で「ユーザー認証」について取り組んでいるので、途中ではありますが紹介したいと思います。 ■ 昔ながらの認証 設計概要 クレデンシャル情報の保持 認証処理 問題点 ■ 用語解説 ■ 認証に関する仕様 OpenID Connect OpenID ConnectとOAuth2.0の違い OpenID ConnectとSAMLの違い FIDO 2.0 OpenID ConnectとFIDO2.0の位置関係 FIDO2.0の対応状況 ■ 認証サーバーソフトウェア ■ まとめ・下半期の予定 ■ 昔ながらの認証 設計概要 まずは古き良き時代の認証ですが、定番の設計としては以下の様なものではないでしょうか。 クレデンシャル情報の保持 IDとパスワードを入力 場合によっては秘密の質問を追加で設定 本質的にはIDとパスワードが2セットあるのと同じ サーバーサイドでパスワードを非可逆変換した文字列を保持 ハッシュ関数 を使うのが一般的 認証処理 ユーザーが入力したIDとパスワードをサーバーに送信 サーバーサイドでパスワードを同じ ハッシュ関数 で変換 IDと、パスワードを変換した文字列同士を比較して一致すれば認証成功 問題点 で、こういったIDとパスワードだけの認証が問題視され始めています。 news.mynavi.jp よくある記事ですが、ユーザーがパスワードを決める以上 パスワード自体に 脆弱性 がある ということなのだと思います。 流石にこのレベルのパスワードは「英数大文字小文字」に加えて「記号を含むこと」くらいの制限かけていれば避けられますが、ターゲットのユーザー層の想定 リテラシ レベルによっては記号入力を必須にできない場合もあると思いますし、本質的にな解決ではないでしょう。 関連して、海外の調査会社もこの様な記事で 多要素認証市場が年平均15%成長する としています。 www.grandviewresearch.com ■ 用語解説 「多要素認証」 というワードが出てきましたが、認証の話題では間違って言葉を使っている人も結構います。なのでまずは主だった用語をおさらいしていきたいと思います。 最初は定番ですが「認証」と「認可」の違いから。 認証 認可 ユーザーが 「誰」 であるか確認すること ユーザーが 「何を出来る」 か権限を与えること 次に「多要素認証」と「多段認証」の違い……と言いたいところですが、その前提として認証に用いる情報の分類を先に説明します。 知識情報(知識要素) 所持情報(所持要素) 生体情報(生体要素) 概要 ユーザーが知っている情報 ユーザーが持っている物の情報 ユーザーが自身の情報 例 パスワード、秘密の質問、 Android のロックパターン PC、 スマホ 、USBセキュリティキー 指紋、網膜、声紋、歩行パターン、タイピングの癖 これらの認証に用いる情報のことを「クレデンシャル情報」といいます。 そして、これらを前提として 多要素認証 上記3種類の情報から2種類以上を組み合わせた認証のこと 必然的に多段認証となる 多段認証 上記3種類の情報によらず、2種類の認証を組み合わせた認証のこと 「パスワード」+「秘密の質問」はどちらも知識情報だが、多段認証となる 関係性としてはこんなイメージです。 ただ、紛らわしい用語といして「パスワードレス認証」があります。おそらく原義的な意味では「知識情報以外による認証」という意味だったと思うのですが、今日では実質的に多要素認証を指している様です。注意しなければいけないのは 「パスワードレス認証=生体認証(生体情報を用いた認証)」とは限らない ということです。 ■ 認証に関する仕様 認証に関連する仕様としては OAuth 2.0 SAML OpenID Connect FIDO 2.0 といろいろありますが、 既存環境との互換性などの考慮が不要であれば 現状では OpenID Connect と必要に応じて FIDO 2.0 の組み合わせが無難だと判断しています。判断した理由と併せて、それぞれの比較検討をまとめてみます。 OpenID Connect OpenID Foundation によって規定されている認証認可に関する仕様です。 OpenID と OpenID Connectは別物なので注意、略す場合はOIDCと略すのが一般的です。 ざっくりいうと既存の仕様を統合して規定された仕様になります。詳細は OpenID Foundation Japan 工藤氏のスライド(各仕様との関係性については33スライド目)が詳しいです。 なぜOpenID Connectが必要となったのか、その歴史的背景 from Tatsuo Kudo OpenID ConnectとOAuth2.0の違い 先述のスライドにある様に OpenID ConnectはOAuth 2.0を拡張した仕様でもあります。OAuth 2.0の挙動である サーバーに認可コードをリク エス ト 認可コードを取得 認可コードを用いて、サーバーにアクセス トーク ンをリク エス ト アクセス トーク ンを取得 という挙動は OpenID Connectにも仕様として含まれています。さらに OpenID Connectではさらに サーバーに認可コードをリク エス ト 認可コードと ID トーク ン を取得 認可コードを用いて、サーバーにアクセス トーク ンをリク エス ト アクセス トーク ンと ID トーク ン を取得 という挙動も規定されています(選択可、 OpenID Connectを利用する場合はID トーク ンを使う方が一般的だと思います)。 ID トーク ンには 「誰」が認証されたか 「どのサーバー」で認証されたか 「いつ」認証されたか 「どの様な基準」で認証されたか 認証されたユーザーの「属性情報(姓名、メールアドレスなど)」 が含まれています。 OAuth 2.0は「認可の仕様であって認証の仕様ではない」と言われますが、OAuth 2.0ではID トーク ンは規定されていないので 「誰についての認可コードなのか」はわからない (OAuth 2.0の外で認証は行う前提)のです。 この辺りの挙動の説明については Authlete 川崎氏の動画解説が詳しいです。 ID トーク ンについては同氏のQiita記事も併せて確認すると良いでしょう。 qiita.com OpenID Connectと SAML の違い シングルサインオン (SSO)を実現する仕様として SAML がよく使われますが、 OpenID Connectでも実現でき近年は Google や Facebook , GitHub など着々と OpenID Connect でのSSOに対応するサービスが増えてきました。 前述の通り OpenID Connect は SAML の流れも組んでいますが、 SAML はその生い立ちから社内ネットワーク 1 での利用を想定しています。そのため SAML での認証処理はユーザーの同意を必要とせずに処理することができます。認証処理は信頼されているサービスで行われるという前提です。 社内サービスの間でのみ用いられる場合であれば問題ありませんが、社外のサービスとの間でもSSOするのであればユーザーの同意処理は挟みたいところです。 あとは実装者の観点でいくと SAML が XML ベースの通信フォーマットなのに対して、 OpenID Connectは JSON ベースの通信フォーマットとなります。 FIDO 2.0 FIDO Alliance によって規定されているパスワードレスに関する仕様。 FIDO 1.0ではFIDO UAF, FIDO U2Fという2つの仕様から構成されていましたが、それぞれ Paypal と Google が推進していて、さらに Apple が別仕様としてTouchIDを推進するという分断状態だったようです。そしてこの状況を解決するためにFIDO U2Fをベースとして、FIDO 2.0が規定されました。 FIDO 2.0は大きく2つの仕様によって構成されています。 WebAuthn CTAP2 サーバーとクライアント間の 通信プロトコル 。 W3C に提案され RFC として標準化。 クライアントと認証デ バイス 間の 通信プロトコル 。FIDO Allianceにより規定。 特徴としては、FIDO 2.0ではサーバーとクライアントの間で クレデンシャル情報を直接通信することがないこと です。FIDO 2.0ではクライアントサイドで 認証処理を行なった結果のみ をサーバーに送信します。これにより通信経路からのクレデンシャル情報の流出を避けることができます。 ちなみにFIDO U2Fが改名されてCTAP1となっています。 OpenID ConnectとFIDO2.0の位置関係 OpenID ConnectとFIDO 2.0の関係は以下の様になっています。 OpenID Connectはサービス間(サーバー間)での認証 プロトコル 2 、FIDO2.0はサーバーとクライアントの間で認証情報をやり取りするWebAuthnとクライアントと認証デ バイス の間で認証処理を行うCTAP2となります。 FIDO2.0の対応状況 FIDO 2.0はクライアントサイドで動作するため対応するOSとブラウザが必要になります。2021/10現在では主な環境では対応済みです。 OS Windows 10 Version 1903以降 macOS Big Sur以降 Android 7.0以降 iOS /iPadOS 14以降 ブラウザ Google Chrome Mozilla Firefox Microsoft Edge Apple Safari ■ 認証サーバーソフトウェア OpenID ConnectやFIDO 2.0はそれぞれ多くの仕様によって詳細が規定されています。これらをゼロから実装するのはサービスの開発効率として非現実的です 3 。 認証サーバーとして利用できる ミドルウェア として OpenAM と Keycloak があります。どちらも OSS ですが概要を調べてKeycloakを試すことにしました。 OpenAM Sun社の商用製品 OpenSSO が起源 ForgeRock社とOpensource Solution Technology社がフォークして OSS 化 先発なこともありシェア的にはKeycloakよりも多い様子 Keycloak コミュニティベースの OSS で比較的後発 国内では NRI が積極的に情報発信し、保守ベンダにもなっている OpenAMとKeycloakの比較については NRI 和田氏の以下スライドが詳しいです。タイトルでは翻訳プロジェクトの紹介となっていますが、前半部分はOpenAMからKeycloakへの移行プロジェクトについて書かれています。 Keycloakの実際・翻訳プロジェクト紹介 from Hiroyuki Wada ■ まとめ・下半期の予定 さてここまで2021年上半期で調査検討した内容をまとめました。引き続き下半期では以下のような検証を行っていこうと考えています。 実際に検証用のシステムを構築して運用を想定した検証 Keycloakはどの程度サーバースペック要求するのか検証 Keycloakでのユーザー属性情報の管理はできるのか、ユーザー属性に独自項目の追加はできるのか クライアント側の認証手法によって挙動や運用に差異が出ないか それではまた下半期末に検証の結果をまとめたいと思います。 認証技術の調査や選定を行なっている方の助けになれれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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年半、技術広報に力を入れ、会社の技術的な取り組みの発信を行ってきました。 ちょうど2021年8月末に エンジニア・デザイナー採用サイト の技術コンテンツを強化してリニューアルしたタイミングでもあり、 ここまでの取り組みを振り返ってみたいと思います。 ラクスの技術広報について 取り組みのきっかけ ゴールの考え方 やってきたこと 採用Webサイトを技術情報のハブにアップデート 外部イベント登壇 エンジニア登壇実績のご紹介(一部) 主催イベント 10月の技術イベントのご案内 社内登壇メンバーのスライド、動画も公開 テックブログ まとめ そして最後に宣伝 ラク スの技術広報について 皆様の会社には「技術広報」を担当されている方はいらっしゃいますか? 担当領域こそ各社それぞれかと思いますが、技術広報の仕事は 「エンジニアやデザイナーに対する、専門領域の情報提供を通じた マーケティング 」 といえると思います。 具体的活動内容は メディア戦略・運用(テックブログ、自社サイト) 外部イベント登壇 自社のイベント主催 などが挙げられ、 ラク スも上記を中心としています。 技術広報活動はエンジニア、採用、 マーケティング 各部門との幅広い調整が必要な他、技術の理解や興味関心も求められます。したがって、技術広報活動を現場エンジニアが担当するケース、しないケースでメリット/デメリットがあります。その点当社では「技術広報と兼務のエンジニア」はおらず、専任体制となっています。 それにより、スピーディな部門間調整やエンジニア登壇のコーディネートやサポート、広報活動量を確保しようとしています。現場感覚の裏付けは開発チームのエンジニアとしっかり協力して担保しているほか、技術広報チームにもSE出身者がいて、その経験を活かしています。 取り組みのきっかけ ラク ス開発本部のビジョンは 「日本を代表する SaaS エンジニア集団になる」 です。展開中のプロダクトが成長中で、 一人でも多くのエンジニア、デザイナーの方に仲間に加わっていただきたい と日々思っています。一方で、 ラク スが提供するのはBtoBの業務効率化/付加価値向上プロダクトです。普段会社の経費精算や勤怠打刻などで使うなど、日常接点のないエンジニアに対しては 社名認知率が上がらない という課題がありました。そこで、開発本部からの技術情報発信を増やすべきという方向性からスタートしました。 ゴールの考え方 そこで認知率向上を目標にして、下記メインで活動を行うことにしました。 エンジニア・デザイナー採用Webサイト 外部イベント登壇 主催イベント テックブログ ここで技術広報の貢献をどう定義、計測するかについては、各社個性が出るところではないかと思います。 ①定性指標・ 定量 指標、②プロセス指標・結果指標の組み合わせ で設計するケースが多いのではないでしょうか。 ラク スはといえば、 技術広報自身が開発組織の成長に主体的に貢献する意識を持つため、 定量 的なKPI、結果指標への力点が大きい ように思います。 もっとも本記事を読んでいただいている方のフェーズによっては、データが存在しないとか、アウトプットする文化がないというケースもあると思います。その場合は記事投稿数などのプロセス指標を一旦重視していくのも手かもしれません。KPIの数値は最初から完璧なものではないので、スモールスタートで随時見直していく可能性はあります。これらを開発マネジメント層と合意を取ったうえで、アウトプットの強化が始まりました。以降に実際の取り組みをご紹介します。 やってきたこと 採用Webサイトを技術情報のハブにアップデート エンジニア・デザイナー採用Webサイト 自体は過去の早い段階でリリースしていました。 ただ、当社の技術的な取り組みを知っていただくために、これまでのエンジニアの活動を一挙に見られるコンテンツが欠かせず、それはまだまだ不十分と考えていました。 そんな「技術情報のハブを作りたい!」という思いをもとに8月末にリリースしたのが、こちらのコンテンツです! TECH INFO(技術・デザイン情報): スペシャ リストが最前線で取り組む実務課題インタビュー career-recruit.rakus.co.jp MEDIA(メディア掲載): 外部メディアに掲載されたエンジニアインタビュー career-recruit.rakus.co.jp SLIDE(資料):自社イベントへの登壇資料(後述) career-recruit.rakus.co.jp VIDEO(動画):自社イベントの動画 アーカイブ (後述) career-recruit.rakus.co.jp SPONSOR(協賛実績):外部イベントの協賛実績(後述) career-recruit.rakus.co.jp つい最近リリースしたばかりなのでこれからのコンテンツですが、いろいろな視点から当社のエンジニアの活動を知っていただけるような企画を進めていきます。 外部イベント登壇 昨年、今年はコロナの影響で外部イベント全体も影響を受けてしまいましたが、当社技術スタックや開発スタイルに関わるカンファレンスを中心に継続的に協賛を行っています。技術広報はイベントの検討や登壇のコーディネートなどを行っています。過去のイベント協賛実績は こちら にまとめていますので、ご覧ください。 エンジニア登壇実績のご紹介(一部) 2021/6/25 Scrum Fest Osaka 2021 経験ゼロからはじめる!10年以上続くプロダクトのアウトカム創出戦略 2020/12/12 PHPカンファレンス 2020 レガシーシステムに自動テストを導入する第一歩 2020/8/27 Developers Summit 2020 KANSAI 関西的なノリで変化の波をノリこなすチームの取り組み 2020/6/26 Scrum Fest Osaka 2020 スクラムちゃうがなと言われてもやってみぃひん? 2020/5/20 Agile Japan 2020 「中小企業のエンジニアチームを”楽”にする」を目指す組織マネジメントの変わる勇気と変えない勇気 主催イベント Rakus MeetUpやLT会、TechCafeなど、各種コンセプトでイベントを年50回強開催しています。これらは主に connpass で展開しています。技術広報は企画立案や年間スケジュールの策定、ご登壇者様への各種ご依頼・連絡、司会・運営にかかわっています。年間計画は関係者がいつでも見られるようになっているほか、登壇に関する困りごとなどがないか技術広報が主体的かつ気軽にコミュニケーションする工夫もしています。 connpass開催のイベントの例 大変有難く嬉しいことに、フロントエンド、UI/UX、自動化、リーダブルコードなど、オンラインになっても回を重ね、多くの方にご視聴いただけるシリーズとなりました。connpassのメンバー登録いただいている方は6,000名に近づき、イベントには延べ7,000名弱もの方にご参加いただくまでに成長しました。これらのイベントは多数の登壇者様のお力添えあってこそ実現できております。この場を借りて改めて厚く御礼申し上げます。 10月の技術イベントのご案内 例えば、下記のようなテーマで定期開催しております。ご興味をお持ちいただけるものがございましたら、是非ご視聴ください! 10/6開催 大規模SaaSのフロントエンド開発/レガシー改善、Vue.js、マルチブラウザ対応 10/13開催 PHPerのための「Laravel 入門を語り合う」PHP TechCafe 10/20開催 UI/UXデザイナーLT会 - vol.5 10/27開催 エンジニアの勉強法ハックLT- vol.6 社内登壇メンバーのスライド、動画も公開 コロナの影響でなかなかオフィスにお越しいただいての開催ができないのですが、逆にオンラインの良さを生かして、リニューアルしたサイトで過去のRakus MeetUpでの当社エンジニアの トーク やスライドを公開することにしました。今後も随時追加していきますので、是非見てみてください。 登壇動画一覧はこちら Rakus MeetUp スライド一覧はこちら 是非ご覧ください! テックブログ このテックブログは2017年から運営していますが、技術広報は直近ではブログのテーマ策定や構成設定のサポート、一部記事執筆やKPIの運営を行っています。 主催イベントでの話は実務から得られた 中長期的な課題 が多いのですが、こちらは最近のエンジニア界隈での技術的なTipsも多くなっています。 まとめ 以上、駆け足ではありますが ラク スでの技術広報活動のご紹介でした。実際に活動を行ってみて、 定量 的なKPIで見てもより多くの方に当社の名前や技術的な取り組みを認知していただけ始めているという実感がでてきました。採用説明会でも、技術イベントに参加して当社のことを知ったという方がいらっしゃいました。 もちろん、まだまだ改善すべき点はあります。一層満足いただけるコンテンツ・体験をご提供し、さらには「ともに ラク スで働く仲間」という選択肢を検討していただくために、地道な努力を続けていきたいと思います。   簡単ではありましたが、 ラク スの「技術広報」という存在について知っていただけましたなら何よりです。それではまた、イベント等でお会いできることを楽しみにしております! そして最後に宣伝 ラク スでは 一緒に技術広報を盛り上げていただける方もお待ちしています ! 技術コミュニティが大好きかつ、仮説を追いながら広報観点で開発組織・事業成長に取り組んでみたいという方!是非こちらまでお気軽にご連絡ください↓↓ forms.gle お待ちしております! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/
アバター
こんにちは この記事ではLaravelの環境構築を行い、ごくシンプルなWebAPIを作成します。 Larevelはバックエンドのロジックから画面の描画まで行うことができますが、今回は画面の開発は行わず API の開発のみを行います。 バックエンドを API として開発することで、外部アプリケーションと連携することができる・ フロントエンドと 疎結合 になり保守性が高くなる・フロントエンドと並行して開発することができるといった恩恵を享受することができます。 Laravelは MVC モデルに準じた フレームワーク ですが、 API を開発する際は画面(View)が不要になります。したがってこの記事ではModelとControllerのみを作成します。 環境・MWのバージョン 作業手順 1. Laravelの環境構築 2. LaravelでAPIを作成・動作確認 ※ Laravel8 ではこの記法が使えません。Laravel8で開発をする際はご注意ください。 create メソッド indexメソッド show メソッド update メソッド delete メソッド 3. PostmanでLaravelで作成したAPIの動作確認 終わりに 環境・MWのバージョン Ubuntu 20.04 PHP 8.0.10 Laravel 6.20.34 sqlite3 ※ 2021年9月現在Laravelはバージョン8系までリリースされていますが、LTSはバージョン6系です。また、リリースから一定期間が経過しており動作が安定している・ 日本語情報が充実しているというメリットがあるのでLaravel 6系を採用しています。 作業手順 Laravelの環境構築 Laravelで API を作成 PostmanでLaravelで作成した API の動作確認 1. Laravelの環境構築 ① PHP およびLaravelの動作に必要なパッケージのインストール 以下のコマンドを実行します。 sudo apt-get update apt install -y software-properties-common add-apt-repository -y ppa:ondrej/php apt-get update # Laravelの動作に必要なパッケージおよびsqliteをインストール apt install -y php8.0 sqlite3 php8.0-bcmath php8.0-mbstring php8.0-xml php8.0-zip php8.0-sqlite コマンド実行後、 PHP とLaravel稼働用の各種パッケージが正常にインストールされていることを確認します。 $ php -v PHP 8.0.10 (cli) (built: Aug 26 2021 15:50:07) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.10, Copyright (c) Zend Technologies with Zend OPcache v8.0.10, Copyright (c), by Zend Technologies $ php -m [PHP Modules] . . . . (長いので省略します) ② Composer のインストール・Laravel プロジェクトの作成 composerをインストールするために以下のコマンドを実行します。 php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" php composer-setup.php php -r "unlink('composer-setup.php');" sudo mv composer.phar /usr/local/bin/composer composerがインストールされていることを確認します。 $ composer -v ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.8 2021-09-15 13:55:14 続いて、Laravelプロジェクトを格納する ディレクト リを作成してその ディレクト リ内でLaravelのプロジェクトを作成します。 $ mkdir /usr/local/project cd /usr/local/project composer create-project --prefer-dist laravel/laravel blog "6.*" ※ "6.*" のように数字を設定することで利用するLaravelのバージョンを指定することができます。 コマンド実行後、Laravelのプロジェクトが作業 ディレクト リにできています。 Laravelプロジェクトの ディレクト リに移動してサーバを起動します。 $ cd /usr/local/project/blog php artisan serve Laravel development server started: http://127.0.0.1:8000 [Tue Sep 21 23:02:11 2021] PHP 8.0.10 Development Server (http://127.0.0.1:8000) started URLにアクセスしてLaravelの初期画面が表示されれば環境構築は完了です。 2. Laravelで API を作成・動作確認 次にLaravelで API を作成します。 API の要件は以下の通りです。 タイトルと本文を投稿する(Create) 投稿一覧を表示する(Read) 指定したidの投稿を表示する(Read) 投稿を編集する(Update) 投稿を削除する(Delete) では作業に移ります。 ⑴ データベース設定 Laravelはデフォルトでは mysql を使用するように設定されていますが、今回はより手軽に使える sqlite を使用します。 ・ データベース用ファイルを作成 $ touch database/database.sqlite ・ 設定ファイルの変更 変更前 # Laravelのデフォルト設定 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= 変更後 DB_CONNECTION=sqlite ・ マイグレーション ファイルの作成 テーブル作成用の マイグレーション ファイルを作成します。 $ php artisan make:migration craete_posts_table マイグレーション ファイルを下記のように変更して、テーブルを作成します。 # 変更箇所のみ記載 public function up() { Schema::create('posts', function (Blueprint $table) { $table- > increments('id'); $table- > string('title'); $table- > string('content'); $table- > timestamps(); }); } $ php artisan migration コマンドを実行してエラーが表示されなければ成功です。 ・ モデルクラス作成 続いてモデルクラスを作成します。 Laravelはモデルクラスに ビジネスロジック を配置することが多いですが、今回はコードの量自体が少ないのでほとんど使いません。 $ php artisan make:model Post <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { // fillableに指定したプロパティは入力可能になる protected $ fillable = [ 'title' , 'content' , ] ; } ・ ルーティングの設定 Laravelのルーティングは`通常``route/web. php に定義しますが、APIは route/ api . php ```に定義します。 api . php にルーティングを定義すると、URLのはじめに/ api が自動的につきます。 (例: '/ hoge /fuga' と定義すると実際のエンドポイントは'/ api / hoge /fuge' になります。) API のURL設計もサポートする親切さがLaravelの魅力の1つだと思いました。 Route::middleware(['middleware' = > 'api'])- > group(function () { # 投稿作成 Route::post('/posts/create', 'PostController@create'); # 投稿一覧表示 Route::get('/posts', 'PostController@index'); # 投稿表示 Route::get('/posts/{id}', 'PostController@show'); # 投稿編集 Route::patch('/posts/update/{id}' , 'PostController@update'); # 投稿削除 Route::delete('/posts/{id}', 'PostController@delete'); }); ※ Laravel8 ではこの記法が使えません。Laravel8で開発をする際はご注意ください。 このルーティングにより、 ・ http://127.0.0.1:8000/api/posts へのGETリク エス トはPostController に定義されているindex メソッドで処理 ・ http://127.0.0.1:8000/api/posts/create へのPOSTリク エス トはPostControllerに定義されているcreateメソッドで処理 されるようになります。 GETメソッドとPOSTメソッドは広く使われているHTTPメソッドですので特に説明は不要かと思います。 PATCHメソッドはリソースの一部を変更するためのメソッドです。 DELETEメソッドは読んで字のごとくリソースを削除するメソッドです。 PATCHメソッドやDELETEメソッドではなく、POSTメソッドで実装しても問題ありませんが、PATCHやDELETEを使用する方がそのリソースが何をするかが明確に なるのでより望ましいと思います。 ルーティングが設定できたので次はコントローラを作成します。 ・ コントローラの作成 コントローラはViewからリク エス トを受けてModelにデータを渡します。 まず、以下のコマンドでコントロー ラク ラスを作成します。 php artisan make:controller PostController PostContoroller. php を以下のように変更します。 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Post; class PostController extends Controller { # 投稿作成 public function create ( Request $ request ) { $ post = new Post () ; $ post -> title = $ request -> input ( 'title' ) ; $ post -> content = $ request -> input ( 'content' ) ; $ post -> created_at = now () ; $ post -> updated_at = now () ; $ post -> save () ; return response () -> json ( Post :: all ()) ; } # 全件取得 public function index () { $ posts = Post :: all () ; return response () -> json ( $ posts ) ; } # 投稿表示 public function show ( Int $ id ) { $ post = Post :: find ( $ id ) ; return response () -> json ( $ post ) ; } # 投稿編集 public function update ( Int $ id , Request $ request ) { $ post = Post :: find ( $ id ) ; $ post -> title = $ request -> input ( 'title' ) ; $ post -> content = $ request -> input ( 'content' ) ; $ post -> updated_at = now () ; $ post -> save () ; return response () -> json ( $ post ) ; } # 投稿削除 public function delete ( Int $ id ) { $ post = Post :: find ( $ id ) -> delete () ; return response () -> json ( Post :: all ()) ; } } create メソッド Laravelが MVC モデルに準拠した フレームワーク であるのを考えると、リク エス トを受け取る・受け取ったデータをDBに保存するといった処理はモデルクラスやサービスクラスに記載すべきですが、今回はお試しということで直接コントロー ラク ラスに書きます。 また、リク エス トパラメータの入力値チェックやエラーハンドリングも今回は省略します。 リク エス トで送られてきた投稿をPostテーブルに保存し、indexメソッドと同じように投稿一覧を json 形式で返します。 Laravelで json をリク エス トを受け取る際には特に特別な下処理は必要ありません。 リク エス トパラメータの Content-Type ヘッダを application/json と指定し、 json を送ればinputメソッドでその値を取得することができます。 indexメソッド 投稿一覧を json 形式でレスポンスとして返します。 json ()メソッドはLaravelで用意されているメソッドです。 引数に配列を渡すと自動的に json に変換してくれます。 (第二引数にレスポンスの ステータスコード を、第三引数にContent-Typeヘッダを指定することもできます。省略した場合はそれぞれ200 , application/ json がデフォルトでセットされます。) show メソッド Post::find() メソッドは引数に渡したidで投稿を検索します。 (idしか渡すことができないことに注意してください。 id以外のカラムで検索する際はwhere メソッドを使用します。) update メソッド findメソッドで変更対象の投稿を検索し、プロパティの値にリク エス トパラメータを代入します。 delete メソッド deleteメソッドで指定したリソースを削除します。 レスポンスをどのようなものにするかは選択の余地があると思いますが、今回は対象の投稿が正常に削除されたことを確認しやすいように 投稿一覧を返すようにします。 3. PostmanでLaravelで作成した API の動作確認 API の動作確認を行います。 curl コマンドでLaravelのサーバにリク エス トを送っても良いですがパラメータを指定するのがやや面倒です。 そこで、 API の動作確認ツールPostmanを使用します。 www.postman.com Postmanを動かすまでの手順はこちらの記事に分かりやすく記載されています。 www.tairaengineer-note.com 試しにLaravelで作成した投稿作成 API にリク エス トを送ってみます。 画像のようにHTTPメソッド・エンドポイント・リク エス トパラメータを指定してSendボタンを押します。 レスポンスが正常に返ってきていれば成功です。 続いて先ほど作成した投稿を取得します。 投稿表示 API はGETメソッドでリク エス トを送ります。 投稿が表示されています。 終わりに 今回はLaravelでWebAPIを作成しました。 フルスタックフレームワーク というイメージの強いLaravelでしたが、WebAPIも特に苦心せず作成することができました。( API の開発にLaravelを採用すべきなのかという問題はあると思いますが...) 個人的な感想としては api . php にルーティングを定義することでURLに/ api を付与してくれる機能が良いと思いました。 Laravelのような高性能な フレームワーク を使うと自然とセオリーに沿った設計になりやすいです。 皆さんもWebアプリケーションだけではなく、WebAPIの開発にもLaravel を利用してみてはいかがでしょうか。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター