TECH PLAY

株式会社ラクス

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

935

こんにちは。開発エンジニアの沼本です。 みなさんはWeb API についてよくご存じでしょうか? 私はこれまでエンジニアとしていくつかのサービス開発に携わってきましたが、Web API と接する機会が非常に増えてきていると感じています。 今回はWeb API について基本的な概念をおさらいし、 PHP を使用してWeb API の開発入門をまとめたいと思います。 Web APIとは Web APIを使ってみる Web APIの開発 作成するもの 言語 エンドポイント(URI) レスポンスデータ データフォーマット ステータスコード エラー表示 セキュリティ 実装 動作確認 おわりに Web API とは そもそもWeb API とはいったい何なのでしょうか。 専門的に言うと、Web API とは「HTTP プロトコル を用いてネットワーク越しに呼び出す API 」のことです。 ( API とは「 Application Programming Interface 」の略で、「ソフトウェア コンポーネント 同士が互いに情報をやりとりするのに使用するインタフェースの仕様」のこと) この説明だとピンとこない方もいるかもしれません。 より簡単に一言で言ってしまうと、Web API とは「 URI にアクセスすることで、特定の情報の取得・操作ができるシステム」のことです。 Web API を使ってみる ここではWeb API の理解を深めるため、実際にWeb API を利用してみます。 世の中には数多くのWeb API が公開されていますが、今回は ビットコイン の販売価格を取得できる API を利用してみたいと思います。 bitflyer.com 以下の URI にアクセスしてみて下さい。 https://bitflyer.jp/api/echo/price コマンドライン だとこうです。 curl -X GET 'https://bitflyer.jp/api/echo/price' すると以下のような ビットコイン の価格情報が取得できると思います。 {"ask":4519932.0,"bid":4256241.000000000000,"mid":4388086.500000000000} (ask: bitFlyer の1BTC販売価格、bid: bitFlyer の1BTC買取価格、mid: 仲値) URI にアクセス(リク エス トを送信する)だけで簡単に ビットコイン の価格情報を取得することができました。 例えば、自分の開発しているサービス内でこのWeb API を利用することで、開発コストを抑えつつ ビットコイン 価格の情報を利用した機能を作成することができます。 Web API の開発 今回はWeb API 開発の入門ということで、簡単なWeb API を作成してみます。 作成するもの リク エス トを送ると、登録してあるユーザーを取得できるWeb API を作成します。 ユーザーの一覧を取得できるだけでなく、IDをパラメータとして送ることで、特定のユーザーを取得できるようにします。 本来であればDBにユーザーデータを持たせ、新規登録・更新・削除などもできるようにしますが、今回は簡略化のために省きます。 ユーザーのデータはあらかじめ配列で持たせておくことにします。 言語 Web API を開発するにあたり、スタンダードとなっている言語は特にありません。 今回は私が普段の開発で使用しており、使用者数も多い PHP を使います。 エンドポイント( URI ) Web API は URI にリク エス トを送ることで、データの取得や操作を行います。 そのため、簡潔で、どのような機能を持つのかが分かりやすい URI を設計することが重要です。 一般的に重要だとされる点は以下のようなことです。 短く入力しやすい URI 人間が読んで理解できる URI 大文字小文字が混在していない URI 改造しやすい URI サーバ側の アーキテクチャ が反映されていない URI ルールが統一された URI 今回は以下のように設計します。 本来は URI に拡張子を含めるのはよくありませんが(サーバー側の アーキテクチャ が反映されているため)、今回は簡略化のため表示したままとしています。 目的 エンドポイント HTTPメソッド ユーザーの一覧取得 http://localhost/api/users.php GET 特定のユーザーの情報の取得 http://localhost/api/users.php?id=X GET 今回は実装しませんが、ユーザーの新規登録・更新・削除を行う場合は以下のようになるはずです。 目的 エンドポイント HTTPメソッド ユーザーの新規登録 http://localhost/api/users.php POST ユーザーの情報の更新 http://localhost/api/users.php?id=X PUT/PATCH ユーザーの情報の削除 http://localhost/api/users.php?id=X DELETE HTTPメソッドについて簡単に説明しておきます。 HTTPメソッドとは、HTTPでのアクセス時に指定するもので、GETやPOSTなどが有名です。 URI とHTTPメソッドの関係は、「操作する対象」と「操作方法」の関係にあります。 以下に一覧を示しておきます。 HTTPメソッド名 説明 GET 情報の取得 POST 情報の新規登録 PUT 既存の情報の更新 DELETE 情報の削除 PATCH 情報の一部変更 HEAD 情報のメタ情報の取得 レスポンスデータ Web API の URI にリク エス トを送ると、その結果(レスポンスデータ)が返ってきます。 Web API のレスポンスは他の開発者が利用することが前提なので、なるべくプログラム内部で利用しやすい形式にすることが望ましいです。 データフォーマット まず最初に、レスポンスデータをどのようなデータフォーマットで返すのかを考える必要があります。 現在、Web API で利用されている主なデータフォーマットは大きく分けて以下の2つです。 JSON XML かつては XML がよく使用されていましたが、現在は JSON 形式で返すのが主流になっています。 今回もレスポンスデータは JSON で返すこととします。 { "status": "OK", "users": [ { "name": "yamada", "age": 20 }, { "name": "suzuki", "age": 25 }, { "name": "matsuda", "age": 30 } ] } ステータスコード レスポンスを返す際には、適切な ステータスコード を返します。 ステータスコード とは、「200」や「404」など3桁の数字で表され、HTTPレスポンスヘッダの先頭行に記載されています。 「200 OK」や「 404 Not Found 」などはブラウザ画面にも表示されるため有名です。 以下に ステータスコード の分類を示しておきます。 ステータスコード 意味 100番台 情報 200番台 成功 300番台 リダイレクト 400番台 クライアントサイドに起因するエラー 500番台 サーバーサイドに起因するエラー エラー表示 Web API は様々な要因でエラーを返す可能性があります。 エラーを返す際には ステータスコード を付与しますが、それだけでは不十分です。 Web API を利用している側が、なぜエラーになったのかを具体的に分かるようにしておきます。 エラーを返す際にはエラーの詳細について、レスポンスボディに含めて返すのが一般的ですので今回もそのようにします。 { "status": "NG", "message": "Invalid parameter" } セキュリティ 今回は入門の記事ということで実装は行いませんが、Web API 開発に置いてセキュリティ対策に気を配ることは重要です。 特に機密情報などを扱っている場合、悪意のある利用者から情報を保護するための対策を行っておかなければ大事故に繋がりかねません。 本格的なWeb API の開発・公開を考えておられる方は、別途セキュリティについての情報を確認することをおすすめします。 実装 実装方法は様々ありますが、今回は api ディレクト リ以下にusers. php というファイルを作成し、リク エス トを受けるようにします。 users. php でリク エス トを受けた後はサービスクラスに処理を投げ、返ってきた結果をレスポンスとして返すことにします。 users. php <?php namespace api; require('UsersApiService.php'); $usersApiService = new UsersApiService(); if (isset($_GET["id"])) { // IDの指定がある場合 list($statusCode, $res) = $usersApiService->getUser($_GET["id"]); } else { //IDの指定がない場合 list($statusCode, $res) = $usersApiService->getUserList(); } // 文字コード設定 header('Content-Type: application/json; charset=UTF-8'); // HTTPステータスコード設定 http_response_code($statusCode); // レスポンスをJSON形式で返す print json_encode($res, JSON_PRETTY_PRINT); UsersApiService. php <?php namespace api; class UsersApiService { private $userList = [ ["name" => "yamada", "age" => 20], ["name" => "suzuki", "age" => 25], ["name" => "matsuda", "age" => 30] ]; private $statusCode = 200; private $res = []; /** * ユーザーのリストを取得する * * @return array httpステータスコード,ユーザーのリスト */ public function getUserList() { try { // 全てのUserリストを返す $this->res["status"] = "OK"; $this->res["users"] = $this->userList; } catch (Exception $e) { $this->statusCode = 500; $this->res["status"] = "NG"; $this->res["message"] = $e->getMessage(); } return [$this->statusCode, $this->res]; } /** * 特定のユーザーを取得する * * @return array httpステータスコード,ユーザーのリスト */ public function getUser($userId) { try { if ($this->validate($userId)) { // IDで指定されたユーザーを返す $this->res["status"] = "OK"; $this->res["users"] = $this->userList[$userId]; } } catch (Exception $e) { $this->statusCode = 500; $this->res["status"] = "NG"; $this->res["message"] = $e->getMessage(); } return [$this->statusCode, $this->res]; } /** * パラメーターのバリデーション * * @param int ユーザーID * @return boolean バリデーション結果 */ private function validate($userId) { if (preg_match('/[^0-9]/', $userId)) { // パラメーターが不正だった場合 $this->statusCode = 400; $this->res["status"] = "NG"; $this->res["message"] = 'Invalid parameter'; return false; } elseif (!isset($this->userList[$userId])) { // 指定されたユーザーが見つからなかった場合 $this->statusCode = 404; $this->res["status"] = "NG"; $this->res["message"] = 'User not found'; return false; } return true; } } 動作確認 ちゃんと動くか確認しておきます。 ユーザー一覧の取得 http://localhost/api/users.php { "status": "OK", "users": [ { "name": "yamada", "age": 20 }, { "name": "suzuki", "age": 25 }, { "name": "matsuda", "age": 30 } ] } 特定のユーザーの取得 http://localhost/api/users.php?id=2 { "status": "OK", "users": { "name": "matsuda", "age": 30 } } パラメータのフォーマットが不正な場合 http://localhost/api/users.php?id=a { "status": "NG", "message": "Invalid parameter" } ユーザーが存在しない場合 http://localhost/api/users.php?id=99 { "status": "NG", "message": "User not found" } おわりに 今回は入門として簡単なWeb API を作成してみました。 実際に本格的な実装を行う場合は、今回書いた以外にも様々な考慮が必要になります。 今回を機に、さらにWeb API についての知識を深めていきたいと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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 commit を取り消したい、元に戻す方法 はじめに こんにちは、新卒2年目のtsudachantanです。 チーム開発にとっても便利な バージョン管理システム 「 Git 」……ですが、 「add して commit して pushして…」そこまではわかるけど、それ以外はいまいちわからない。 そんな状況の、Gitを使い始めたばかりの方が一番最初につまづくのは「commitの取り消し方」ではないでしょうか。 各コマンドがどのような動きをしているのか把握しないまま操作をすると 業務を行う上で、チームの開発ではなおさら支障をきたしかねません。 そこで、初心者の私が混乱しがちだった、「間違えて git commit してしまった場合」の対処法について、 自分自身の学習を兼ねて、Gitに慣れていない方に向けて簡単に説明していきたいと思います。 コミットの修正によく利用するGitコマンドをシーン別に分けて紹介し、それぞれのコマンドでできることをまとめました。 困ったときの参考になると幸いです。 git commit を元に戻すための複数の方法とそれぞれの取り消し方のメリット・デメリットを挙げていくので、 状況に応じて活用してみてください。 Git、git stash、git cloneのやり方を知りたい方は以下ブログもご一読ください。 ・ 【超入門】初心者のためのGitとGitHubの使い方 - RAKUS Developers Blog | ラクス エンジニアブログ ・ 【Git入門】git stashで作業を便利に退避する - RAKUS Developers Blog | ラクス エンジニアブログ ・ 【Git入門】git cloneで既存リポジトリをクローンしよう! - RAKUS Developers Blog | ラクス エンジニアブログ 目次 はじめに 目次 「reset」でコミットを取り消してなかったことする resetのオプション メリット 注意点 「git reflog」で「reset」を取り消す 「revert」でコミットを打ち消す メリット 注意点 「--amend」で直前のコミットを上書き修正する 「直近のコミットメッセージを変更したい」 「コミットの内容を追加したい」 メリット 注意点 現在の状態を確認しよう おわりに 「reset」でコミットを取り消してなかったことする $ git reset [打ち消したいコミットID] git reset を使用すると、特定の時点までファイルを巻き戻すことができます。 ※まだリモー トリポジ トリに push していない場合にのみ使用してください git reset には3種類のオプションがあります。 どのオプションを選ぶかで結果が大きく変わるので、しっかり確認しておきましょう。 resetのオプション git reset --soft   commit のみ取り消し (HEADの位置のみ修正される)  このコマンドを実行すると、まさに「コミットをする直前」の状態に戻ります。  作業 ディレクト リとステージングエリアはそのままです。  まとめてコミットしたかったのに1つしかコミットしていなかった、  まだ作業中なのにコミットしてしまった。といった場合に便利です。   git reset --mixed もしくはオプションなし   commit と add の取り消し(HEADの位置・インデックスが修正される)  HEADと一緒にステージが巻き戻ります。   git add でステージしたけど、やっぱり戻したい。というときに便利です。  作業 ディレクト リのファイルは消えません。 git reset --hard  全部を取り消し(HEADの位置・インデックス・ワーキングツリーが修正される)  もっとも強力なオプションです。  ステージングエリアにも作業 ディレクト リにも残したくないといった場合に使用します。 メリット git reset を使用すると、誤ったコミット自体を削除出来るのでコミットログが見やすくなります。 また、HEADの位置を大幅に移動することができます。 注意点 git reset は「commit を取り消した」というコミット履歴が残りません。 そのため、リモー トリポジ トリで公開されているコミットに対して行うと、不整合が発生してしまいます。 コミットそのものを削除してしまうので、既に他の誰かがコミットを重ねているときに reset してしまうと、 存在するはずの親コミットがなくなってしまいます。 そのため、他のメンバーが push できなくなります。 commit の実行後に push した場合は使用せず、 ローカルな変更を取り消して元に戻したいときに限って、使用するようにしましょう。 「git reflog」で「reset」を取り消す 間違えて git reset --hard して必要なコミットを消してしまった場合は git reflog を使いましょう。 $ git reset --hard HEAD^ # 間違えてresetしてしまった! $ git reflog 04f11b7 HEAD@{0}: reset: moving to 04f11b7 0208e28 HEAD@{1}: merge develop: Merge made by the 'recursive' strategy. 6908c20 HEAD@{2}: checkout: moving from develop to master git reflog を使用すると過去の操作履歴(HEADの動き)を確認することができます。 具体的には コミット関連( commit 、 merge 、 pull 、 revert など) ブランチの切り替え( check out ) 履歴の書き換え( reset 、 rebase など) の3点です。 git reflog でミスした時点を数えたら、 git reset で戻したい場所を指定して戻します。 $ git reset --hard HEAD@{1} reset を reset で元に戻すことができます。 手順をまとめると、 1. git reflog で操作履歴を見る 2.戻りたい地点の数字を指定して git reset する 以上で間違えた reset を元に戻すことができます。 「revert」でコミットを打ち消す おすすめの方法は git revert を使って元に戻す方法です。 $git revert [打ち消したいコミットID] revert は指定したコミットと逆の内容をコミットしてくれます。 ちなみに revert は「元に戻す」という意味です。 revert を使うには、打ち消したいコミットの ハッシュ値 を探す必要があります。 git log コマンドを使用して該当コミットの ハッシュ値 を調べましょう。 git revert で指定したコミット時点の状態まで作業ツリーを戻します。 また、 git revert を使用してもコミットはなかったことにならず、「逆向きのコミット」の履歴が残ります。 つまり、歴史を改変することなく、新しく「 revert したコミット」が追加されるので、 push した後でも安心して使用できます。 もし間違えて revert したとしても、もう一度 revert し直せば問題ありません。 メリット revert は push 済みのコミットを打ち消したいときに便利です。 push 済のコミットの上に、新しいコミットを乗せる形でコミットを元に戻すことができるからです。 コミット自体を削除するわけではないので、安全にコミットを元に戻すことができます。 また、誤った履歴も残っているので、 revert 自体の取り消しも簡単に行うことができます。 チーム開発をしている場合は reset よりも revert の方が好ましいでしょう。 注意点 誤った履歴が残ってしまうので、コミットログが複雑になり見づらくなります。 「--amend」で直前のコミットを上書き修正する git commit --amend 「単に直近のコミットメッセージを変更したい」 「コミット内容を後から追加したい」 上記の場合には --amend オプションが便利です。   ※まだリモー トリポジ トリに push していない場合にのみ使用してください。 「直近のコミットメッセージを変更したい」 --amend オプションを追加してコミットします。 実行すると テキストエディタ が開きます。 変更したい箇所を修正してエディタを終了すると、 直近のコミットメッセージをそれで置き換えることができます。 「コミットの内容を追加したい」 コミットしたあとで、そこにさらにファイルを追加したり変更したりしたくなった場合にも、 手順は基本的には同じです。 ファイルを編集して git add したりし、ステージングエリアをお好みの状態にしたら、 続いて git commit --amend を実行します。 メリット コミットを増やさず修正できるので、コミットログが複雑になりません。 注意点 コミットに追加することはできますが、削除することはできません。 直前のコミットではなく、さらに歴史をさかのぼったコミットを変更したい場合は git rebase を使用する必要があります。 push したコミットに対して使用すると、同じ変更が別のバージョンで見えてしまうことになり、 チームの混乱を招くので注意しましょう。 詳しくは こちらの記事 をご覧ください。 現在の状態を確認しよう 間違ったコミットを防ぐためにも、自身の編集が完了したらコミットの前に現在の状態を確認しましょう。 コミット前だけでなく、コミットの修正後にも想定通りの修正が行えているか確認するとよいでしょう。 git status  現在の状態を表示します。変更があったファイルを確認することができます。 git diff  ソース内でどのような変更があったのか、差分を確認することができます。 git log  コミット履歴を確認することができます。 困ったときには、現状を把握するためにまずログやステータスを確認しましょう。 おわりに git commit の取り消し、元に戻す方法について紹介しました。 コミットに対するそれぞれのコマンドの働き方のイメージが掴めたでしょうか。 不慣れなうちは自分がどのような操作を行っているのかを、都度確認しながら利用していくのが良いと思います。 チーム開発をしている場合は、それぞれのコマンドの利用にいっそう注意が必要です。 もしコミットを間違えてしまっても、慌てずに状況に応じたコミットの取り消し方法を選んで、 後から見た人がわかりやすい commit を意識して開発していきましょう。 今回紹介した基本的な内容から、より理解を深めていっていただければ幸いです。 それでは!     エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは。インフラエンジニアをしていますknmriiです。 今回は bash の シェルスクリプト について、基本的な書き方やよく使うコマンドなどを紹介していきます。 bash でのプログラミングを学び始めた方や、インフラエンジニアになりたての方のご参考になりましたら幸いです。 また、普段は別の言語に触れられている方についてもサーバサイドではこのような bash の スクリプト が動いていることが多いですので 参考までに一読していただければと思います。 目次 目次 bash・シェルスクリプトとは bashを用いたシェルスクリプトの書き方 シバン シェバング(Shebang) コメント 変数の定義 変数に値を代入する 変数にスペース等が入った文字列を代入する 変数にコマンドの実行結果を代入する スクリプト実行時の引数を変数に代入する 配列の定義 先頭の内容を参照する 任意の配列番号の内容の参照する 配列の内容を全て参照する for文 指定回数を繰り返したい場合 配列の要素数だけ繰り返したい場合 while文 一般的なwhile文 readコマンドを使用したwhile文 if文 case文 終わりに bash ・ シェルスクリプト とは そもそも bash シェルスクリプト とは何ぞやという話からさせて頂きます。 bash bash とは、多くの UNIX系OS で標準的に用いられるシェルプログラムの一つ。標準の実行プログラムファイル名(コマンド名)は「 bash 」だが、「sh」が指定された場合も起動するよう シンボリックリンク が置かれることが多い。 IT用語辞典 e-words bash より引用 シェルスクリプト シェルスクリプト とは、OS( オペレーティングシステム )を操作するためのシェル上で実行できる簡易な プログラミング言語 ( スクリプト言語 )。また、そのような言語によって書かれた、複数のOSコマンドや制御文などを組み合わせた簡易なプログラム。一般的には UNIX系OS のシェルで実行できるものを指す。 IT用語辞典 e-words シェルスクリプト より引用 調べてみたところ上記のような解説がありましたが、入門者にとってはかなり難しく感じると思いますので簡単に言い換えてみるとこのようになります。 bash → Unix 系( Linux 含む)のOSでユーザがコマンドを入力し、それに応じてシステムが処理をしたり応答を返すための仲介をするプログラム(シェル)の一種。 シェルスクリプト → コマンドを組み合わせた簡易的な プログラミング言語 。 bash を用いた シェルスクリプト の書き方 ここからは実際の bash を用いた シェルスクリプト の書き方を紹介します。 シバン シェバング( Shebang ) シェルスクリプト の1行目によく記載されている以下のようなものをシバン シェバング( Shebang )と呼びます。 実行する シェルスクリプト の インタプリタ を指定しています。 シバンを以下のように記載することで、 シェルスクリプト が bash を使用して実行されるようになります。 ついつい忘れがちな1行かもしれませんが、 bash にしかない機能を使用したい場合に、この記載がないと意図したように動かない可能性があります。 bash を用いた シェルスクリプト を作成する際には必ず書くようにしましょう。 #!/bin/bash また、記載するパスを #!/bin/sh としても大抵の場合 /bin/sh は /bin/bash の シンボリックリンク となっているため、動作はしますが一部挙動が変化するようです。 #!/bin/sh 参考:「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 /bin/sh コメント bash の スクリプト 内にコメントを残したい場合には、行の先頭に # を付けましょう。 〇 スクリプト #!/bin/bash # echo "bashでこの行はコメントです" echo " bashでこの行はコメントではありません " 〇実行結果 bashでこの行はコメントではありません 変数の定義 bash での変数は 変数名 と 値 を = でつなげることで定義することができます。 一般的には、変数と定義する際に初期値の代入をすることが多いです。 この際に、 java でいう int や String のような型を指定する必要はありません。 ただし、基本的に bash では変数に代入された値の全てが文字列として扱われます。 また、 = の前後にスペースを入れるとエラーとなりますのでご注意ください。 変数の内容は echo $変数 とすることで出力することができます。 変数に値を代入する bash では変数と値を = で接続するだけで代入が可能です。 〇 スクリプト #!/bin/bash NUM = 8 MESSAGE =Hello_bash echo $NUM echo $MESSAGE 〇実行結果 8 Hello_bash 変数にスペース等が入った文字列を代入する bash では、ダブルクオーテーションで値を囲むとスペースが入った文字列も変数に代入することが可能です。 〇 スクリプト #!/bin/bash MESSAGE = " Hello bash " 〇実行結果 Hello bash <注意点> スペースが入った文字列をダブルクオーテーションで囲まずに代入すると、 bash のルール的にスペース以降の文字列が別コマンドとして認識されてしまいます。 変数にコマンドの実行結果を代入する bash にてコマンドの実行結果を変数に代入したい場面が非常に多いです。 そのような場合は、バッククオートでコマンドを囲みます。 #!/bin/bash HOSTNAME = `hostname` echo $HOSTNAME testhost001 スクリプト 実行時の引数を変数に代入する bash の スクリプト を実行する際、引数を渡すことができます。 一般的な引数は、一度変数に格納して スクリプト 内で使用することが多いです。 また、引数は ${1} ${2} のように、渡した順番を指定して呼び出すことも可能です。 〇 スクリプト #!/bin/bash NUM = ${1} STRING = ${2} echo " 引数1は ${NUM} です " echo " 引数2は ${STRING} です " 〇実行結果 $ sh test.sh 1 bash 引数1は1です 引数2はbashです 配列の定義 bash にて配列の定義をする場合は、変数と同様に 配列名 と 配列 を = でつなげます。 この際、配列に関しては (A B C) のようにかっこで囲み値ごとにスペースを入れます。 #!/bin/bash ARRAY = ( 0 1 2 3 4 5 ) bash で配列の中身を参照するには、以下のようにします。 先頭の内容を参照する 〇 スクリプト #!/bin/bash ARRAY = ( 0 1 2 3 4 5 ) echo $ARRAY 〇実行結果 0 任意の配列番号の内容の参照する 〇 スクリプト #!/bin/bash ARRAY = ( 0 1 2 3 4 5 ) echo " ${ARRAY[ 1 ]} " 〇実行結果 1 配列の内容を全て参照する 〇 スクリプト #!/bin/bash ARRAY = ( 0 1 2 3 4 5 ) echo " ${ARRAY[ @ ]} " 〇実行結果 0 1 2 3 4 5 for文 指定回数を繰り返したい場合 bash でのfor文は以下のようにします。 seq コマンドを使用することで指定の回数を繰り返すことが可能です。 〇 スクリプト #!/bin/bash for i in `seq 0 5 ` do echo $i done 〇実行結果 0 1 2 3 4 5 配列の要 素数 だけ繰り返したい場合 配列の中身を順番に取り出したいケースはかなり多いと思います。 そのような場合、 bash では以下のようにするとfor文で全て取り出せます。 〇 スクリプト #!/bin/bash ARRAY = ( January February March April May June July August September October November December ) for i in ${ARRAY[ @ ]} do echo $i done 〇実行結果 January February March April May June July August September October November December while文 一般的なwhile文 bash での一般的なwhile文は以下のように記載できます。 [] で囲まれている部分については、testコマンドが実行されているのですが、testコマンドについてはif文の項目で解説しようと思います。 〇 スクリプト #!/bin/bash count = 0 while [ $count -lt 5 ] do count = $(( ++count )) echo $count done 〇実行結果 test.txt 1 2 3 4 5 readコマンドを使用したwhile文 テキストファイルの全ての行に対して処理をしたいことが度々あります。 そのような場合に使用するのが、readコマンドを使用したwhile文です。 〇サンプルファイル January February March April May June July August September October November December 〇 スクリプト #!/bin/bash while read line do echo $line done < test .txt 〇実行結果 January February March April May June July August September October November December if文 bash で特定の条件で処理を分岐させたい場合には、if文を使用します。 bash でのif文の多くはtestコマンドを使用します。 また、testコマンドを使用したif文はこのように記載します。 if [ 条件 1 ]; then 処理 1 ## 条件1が真であれば処理1が実行される elif [ 条件 2 ]; then 処理 2 ## 条件を複数使用したい場合は elif を使用する ## 条件2が真であれば処理2が実行される else 処理 3 ## 条件1 2 がどちらでも真でなければ処理3が実行される fi 上記のように [] を使用してその中に条件を記載するのですが、その記載方法は test コマンドに準じています。 testコマンドにて使用できるパラメータの一例として、以下のようなものがあります。 項目 例 説明 -e [ -e /tmp/testfile ] testfileが存在していれば真 -f [ -e /tmp/testfile ] testfile存在していて通常ファイルであれば真 -d [ -d /tmp/testdir] testdirが存在していて ディレクト リであれば真 -z [ -z 文字列 ] 文字列の長さが0であれば真 -n [ -n 文字列 ] 文字列の長さが0でなければ真 -eq [ 数値1 -eq 数値2 ] 数値1と数値2が等しければ真(=) -ne [ 数値1 -ne 数値2 ] 数値1と数値2が等しければ真(!=) -gt [ 数値1 -gt 数値2 ] 数値1が数値2より大きければ真(>) -ge [ 数値1 -ge 数値2 ] 数値1が数値2以上であれば真(>=) -lt [ 数値1 -lt 数値2 ] 数値1が数値2より小さければ真(<) -le [ 数値1 -le 数値2 ] 数値1が数値2以下であれば真(<=) = [ 文字列1 = 文字列2 ] 文字列1と文字列2が等しければ真 != [ 文字列1 != 文字列2 ] 文字列1と文字列2が等しくなければ真 if文の使用例としてのサンプルは以下です。 〇 スクリプト #!/bin/bash NUMS = ( 1 2 3 4 5 6 7 8 9 10 ) STRINGS = ( January February March April May June July August September October November December ) echo " ===========TEST1=========== " for num in ${NUMS[ @ ]} do if [ $num -gt 5 ]; then echo " $num は5より大きいです。 " else echo " $num は5以下です。 " fi done echo " ===========TEST2=========== " for num in ${NUMS[ @ ]} do if [ $num -le 5 ]; then echo " $num は5以下です。 " else echo " $num は5より大きいです。 " fi done echo " ===========TEST3=========== " for str in ${STRINGS[ @ ]} do if [ $str = "January" ];then echo " $str は1月です " touch /tmp/jaunary.txt else echo " $str は1月ではありません。 " fi done echo " =========================== " 〇実行結果 ===========TEST1=========== 1は5以下です。 2は5以下です。 3は5以下です。 4は5以下です。 5は5以下です。 6は5より大きいです。 7は5より大きいです。 8は5より大きいです。 9は5より大きいです。 10は5より大きいです。 ===========TEST2=========== 1は5以下です。 2は5以下です。 3は5以下です。 4は5以下です。 5は5以下です。 6は5より大きいです。 7は5より大きいです。 8は5より大きいです。 9は5より大きいです。 10は5より大きいです。 ===========TEST3=========== January は1月です February は1月ではありません。 March は1月ではありません。 April は1月ではありません。 May は1月ではありません。 June は1月ではありません。 July は1月ではありません。 August は1月ではありません。 September は1月ではありません。 October は1月ではありません。 November は1月ではありません。 December は1月ではありません。 =========================== case文 bash にて特定の条件で処理を分岐させたい場合には、if文ではなくcase文を使用することもできます。 条件分岐が多い場合はこちらの方が便利ですね。 case 値 in 値1 ) 処理1 ;; 値2 ) 処理2 ;; 値3 ) 処理3 ;; * ) 処理4 # 処理1~3のどれとも一致しなかった場合は処理4が実行される esac 使用例としては以下のような感じです。 〇 スクリプト #!/bin/bash STRINGS = ( January February March April May June July August September October November December ) for str in ${STRINGS[ @ ]} do case $str in January ) echo " $str は1月です " ;; February ) echo " $str は2月です " ;; March ) echo " $str は3月です " ;; * ) echo " $str は1~3月ではありません " esac done 〇実行結果 January は1月です February は2月です March は3月です April は1~3月ではありません May は1~3月ではありません June は1~3月ではありません July は1~3月ではありません August は1~3月ではありません September は1~3月ではありません October は1~3月ではありません November は1~3月ではありません December は1~3月ではありません 終わりに 今回は bash による シェルスクリプト の基本的な書き方や、構文についてを紹介しました。 ほかの言語を学習してから bash を使おうとしたり、始めてプログラミングに触れる方にとって戸惑うことも多いかと思いますが、少しでもご参考になれば幸いです。   エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに こんにちは。フロントエンドチーム新卒2年目のhy094です。 Reactでよく使用するJSX。 使ってみると便利なのですが、最初は「 JavaScript 内にHTML?」と混乱の原因になっていると思います。 また、その構文から違和感や気持ち悪さを感じる方もいると聞きます。 そこで、今回はReactで使用するJSXについてまとめます。 少しでも混乱や違和感の解消ができたら幸いです。 目次 はじめに 目次 JSXとは? JSXの記法 JavaScript式を埋め込む コメントアウト タグが空の場合 フラグメント HTMLとの属性の差異 おわりに 参考文献 JSXとは? 一言で表すと「 JavaScript 内でHTMLっぽい表現をする Javascript の拡張構文」です。 具体的には以下のような形です。 const element = ( <h1 className= "greeting" > Hello, world! </h1> ); ※ React公式サイト より引用 JavaScript の変数宣言にHTMLタグが代入されているように見え、違和感を感じる方もいるかもしれません。 上記の通り拡張構文ですので上の式は以下の式に コンパイル されます。 const element = React.createElement( 'h1' , { className: 'greeting' } , 'Hello, world!' ); ※ React公式サイト より引用 ここまで見て「もしやJSXなくてもReact書けるのでは・・・?」と思った方、正解です。書けます。 ただ、 React.createElement で毎回書くのは非常に手間でコードも煩雑になるため、JSXを利用することを個人的にはお勧めします。 それでもJSXは使いたくない・・という方は 公式サイト - JSX なしで React を使う を参照してください。 JSXの記法 ここからは、JSXの記法についてまとめます。 JavaScript 式を埋め込む JSX内に {} で囲むことで JavaScript の式を埋め込むことができます。 const fruit = 'りんご' ; const price = 100; const quantity = 5; const element = <h1> { fruit } を { quantity } 個買うと { price * quantity } 円です</h1>; ReactDOM.render( element, document .getElementById( 'root' ) ); もちろん関数も利用可能です。 function formatName(user) { return user.firstName + ' ' + user.lastName; } const user = { firstName: 'Harper' , lastName: 'Perez' } ; const element = ( <h1> Hello, { formatName(user) } ! </h1> ); ReactDOM.render( element, document .getElementById( 'root' ) ); ※ React公式サイト より引用 コメントアウト JSX内ではHTML形式でのコメントは利用できません。 代わりに、 JavaScript の式を埋め込んだものと同じ {} 内に JavaScript の コメントアウト を記述します。 const user = 'admin' ; const element = ( <div> { /* コメント */ } { /*  複数行コメントA  複数行コメントB */ } { //コメント user } </div> ); 最後の例は改行しないと } も コメントアウト されてしまい、エラーとなるので改行はお忘れなく。 タグが空の場合 タグが空の場合は /> で閉じます。 例えば、HTMLで改行タグは <br> ですが、JSXでは <br /> にしないとNGです。 <div> こんにちは <br /> <img src= "example.gif" /> </div> フラグメント JSXは親要素を1つしか持つことができません。 例えば、以下のようなものはエラーとなります。 const error = ( <div> hoge </div> <div> fuga </div>); 簡単な解決方法として、全体をさらに親要素で囲ってしまうというものがあります。 const success = ( <div> <div> hoge </div> <div> fuga </div> </div>); ただ、この方法だと不要なdivがDOMに追加されてしまいます。 この問題は、フラグメント( React.Fragment )を利用することで解決できます。 const fragment = ( <React.Fragment> <div> hoge </div> <div> fuga </div> </React.Fragment>); React.Fragment だと少し長いので、短縮記法も用意されています。 <> , </> です。 const shrotFragment = ( <> <div> hoge </div> <div> fuga </div> </>); 一見空タグにしか見えませんが、 React.Fragment と同等のフラグメントとして認識されます。 Reactで頻出する記法ですので、覚えておいて損はないと思います。 HTMLとの属性の差異 JSXはあくまでも JavaScript なので、 HTMLの属性はキャメルケースで書きますし、 JavaScript の 予約語 (classなど)は属性として使えません。 以下は一例です。 <> { /* class属性 -> className */ } <div className= "hoge" > { /* for属性 -> htmlFor */ } <label htmlFor= "fuga" >Hello</label> { /* tabindex属性 -> tabIndex */ } <div tabIndex= "0" >World</div> </div> </> おわりに 今回はJSXについてまとめました。 JSXは React.createElement を見やすく書く記法です。 また、 React.createElement に コンパイル されるので import React from "react"; が必要になるわけです。 JSXはReactの土台なので、初学者の内に抑えておくと後がスムーズになると思います。 参考文献のほか、紹介しているサイトは少なくないのでぜひ他にも調べてみてください。 それでは、ご覧いただきありがとうございました! 参考文献 https://ja.reactjs.org/docs/introducing-jsx.html https://ja.reactjs.org/docs/jsx-in-depth.html https://ja.reactjs.org/docs/fragments.html#short-syntax https://ja.reactjs.org/docs/faq-build.html#gatsby-focus-wrapper https://qiita.com/nabepon/items/87bb3b4f1e7bfa342489 https://www.to-r.net/media/react-tutorial04/ https://note.com/erukiti/n/n6f673021469e エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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です。 いつも ラク スのエンジニアブログをお読みいただき、またエンジニアイベントへのご参加、ありがとうございます。 今回は、弊社が主催しているイベントの中でも人気の高い「プロジェクトマネジメント Tips LT会」について、まとめさせていただきました! はじめに イベント概要 発表タイトル一覧 発表の紹介 No1. SaaS開発と受託開発におけるプロジェクトマネジメントの違い No4. プロジェクトメンバーのモチベーション No6. メンバーと一緒に進めるマネジメントの学び方と伝え方 当日の様子 おわりに イベント概要 イベント内容 プロジェクトマネジメント をテーマにしたLT会 開催日: 2021/05/12(水) 19:00-21:30 イベントページ rakus.connpass.com 弊社主催イベントでは、LT(ライトニング トーク )形式を採用しております。 LTとは? Lightning Talks(ライトニング トーク )の略 "Lightning"は英語で"稲妻"という意味 つまり 「短いプレゼンテーション」 発表タイトル一覧 今回、LT会に参加された方々の発表タイトルは以下の通りです。 No. 登壇者 タイトル 1 komik さん SaaS 開発と受託開発におけるプロジェクトマネジメントの違い 2 Pep299 さん プレイングマネージャー の葛藤 3 ヒグ! さん 社会人2年目のエンジニアがPMになるとき 4 moriyama_jun さん プロジェクトメンバーのモチベーション 5 面川泰明 さん 性格診断と価値観分析ではじめる1on1 6 Mazawa_Hajime さん メンバーと一緒に進めるマネジメントの学び方と伝え方 7 白柳隆司 さん 「終わらせる」から考えるマネジメント 8 Hiroki_Hachisuka さん あなたはPO?PM?PdM?PjM? 9 sakamoto-k さん アジャイル なチームへの道 はじめの一歩 10 ShoheiKun さん メンバーに任せることについて 11 Cat_Maru さん プロジェクト管理失敗点からの学びTips(仮) 発表の紹介 LT会には、弊社の開発組織からマネージャー3名が登壇しました。 本記事では、その3名の発表内容をご紹介します。 No1. SaaS 開発と受託開発におけるプロジェクトマネジメントの違い speakerdeck.com 現場での開発経験が長い分技術力を背景にしたマネジメントが得意で、困難な状況下でもやりぬく達成志向性が強い、 ラク ス開発マネージャーの発表です。 SaaS 開発と受託開発におけるプロジェクトマネジメントの違いを「品質・コスト・タイム」の観点で分かりやすく解説いただきました。 1本目の発表でしたが、参加者からも共感の声が多く、とても盛り上がっておりました。 No4. プロジェクトメンバーのモチベーション speakerdeck.com 続きまして、テレビCMでも目にする楽楽精算から開発マネージャーの発表です。 メンバーのモチベーションをマネジメントするにあたり、1on1や定期的な面談の場で「幸福度」の点数とその理由を問うとのこと。 参加者からも「これは良い問い」、「大事なのは満点とのギャップと理由」な どコメントが多くよせられました。 No6. メンバーと一緒に進めるマネジメントの学び方と伝え方 speakerdeck.com 最後は、 ラク スのエンジニア リングマ ネージャーからの発表です。 マネージャーとして取り組んでいる工夫をご紹介しました。 共感 業務ではなく研修としてやってみる(時間を分ける) 学ぶ、真似る オレオレ経験より有名書籍のべスプラを紹介してみる 自己達成感 教わる側が話す、当てはめるなど、アクティブラーニングで試す 発表を聞かれた参加者からは、有名書籍をまとめた以下記事に対し、関心が高まっておりました。 tech-blog.rakus.co.jp 当日の様子 Togetterで、当日の様子をまとめております。 雰囲気を見たいという方は、以下をご確認ください。 togetter.com おわりに 本記事では、弊社開発マネジャー達の発表内容をご紹介させていただきました。 他の方の発表資料を見たい!という方は、以下イベントページから、ご確認ください。 rakus.connpass.com プロジェクトマネジメント Tips LT会は、2021年度中にvo3を開催する予定です。 もし、本記事をお読みいただき、興味関心が湧きましたら是非次回イベントに参加/登壇申し込みいただけますと幸いです。 ラク スでは、毎週LT会や勉強会のイベントを開催しております。 我々の取り組みが、皆さまにとって新しい気づきや成長につながる機会となっていますと嬉しい限りです。 今後ともよろしくお願いいたします。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは、株式会社 ラク スで先行技術検証を行っている技術推進課の @t_okkan です。 今回はFlutterの静的解析を紹介します。 Flutterは Dart で実装しているため、静的解析も Dart の仕組みを利用します。 Dart は静的型付け言語と動的型付け言語のどちらにも対応しているため、型チェックが比較的ゆるい プログラミング言語 です。 そのため、静的解析のルールを定めることで型チェックを厳密にしたり、コードのバグを未然に防ぐことが必要になります。 また、 ソースコード に強制的に統一されたコーディングスタイルを適用できます。 Flutterの静的解析の仕組みからできることを紹介しています。 Flutterの静的解析の構成要素 静的解析の導入 includeの設定 analyzerの設定 厳密な型チェックを有効にする 一部のファイルを解析の対象から除外する 特定のルールをプロジェクトで無効にする 解析のルールの重要度を変更する linterの設定 ファイルや特定のコードを静的解析の対象から除外する 静的解析の実行 エディタで静的解析を有効にする コマンドラインで静的解析を実行する まとめ Flutterの静的解析の構成要素 Flutterの実装言語である Dart の静的解析はAnalyzerとLinterから構成されます。 Analyzer ソースコード に Dartの言語仕様 で指定されているエラーや警告などの 潜在的 なバグがないかを解析します。 Linter ソースコード が Dartのスタイルガイドライン や設定した他の ガイドライン に準拠しているかを解析します。 Flutterではこの Dart の静的解析の仕組みを利用して、 ソースコード の静的解析を行います。 静的解析の導入 Flutterのプロジェクトに静的解析を導入するには、 analysis_optins.yaml ファイルを pubsepc.yaml ファイルと同じ ディレクト リに配置します。 ./ sample |- android |- ios |- lib | |- main.dart |- analysis_options.yaml ← ファイルを追加 |- pubspec.yaml Flutterの新規プロジェクトを作成した時に、プロジェクトのルートに analysis_options.yaml ファイルを追加することをお勧めします。 analysis_options.yaml は以下のような実装になります。 include : package:pedantic/analysis_options.yaml analyzer : exclude : [ build/** ] strong-mode : implicit-casts : false linter : rules : - camel_case_types analysis_options.yaml では以下の設定が可能です。 inculde 他の analysis_options.yaml ファイルを取り込むことで、定義されている静的解析のルールを取り込む。 analyzer Analyzerや静的解析全体のカスタマイズを設定する。 linter Linterのルールをカスタマイズを設定する。 それぞれの設定でできることを詳しく説明していきます。 includeの設定 include にはすでに定義済みの外部の analysis_options.yaml ファイルをプロジェクトに取り込むことができます。 これにより静的解析を手軽に導入することができます。 また、 analyzer や linter を独自で設定して1から静的解析のルールを構築することも可能ですが、Flutterの プラグイン として定義済みのルールを適用することができます。 主な プラグイン には以下のようなものがあります。 effective_ dart Dart を効率的に実装するために定めたルールである Effective Dart に準拠したLinterのルールを適用できる。 pub.dev lint effective_dart プラグイン と同様にEffective Dart に準拠したLinterのルールを適用できる。 pub.dev pedantic Google が内部で使用している静的解析のルールを取り込むことができる。Flutter SDK を実装するプロジェクトで利用されているルール。Effective Dart よりもより厳密なルールが設定がされている。 pub.dev それぞれの プラグイン の リポジトリ の analysis_options.yaml から、どのようなルールが設定されているのか確認できます。 静的解析の プラグイン を導入する場合は、 pubspec.yaml に プラグイン を追加し、 analysis_options.yaml の include に プラグイン で定義されている analysis_options.yaml を設定します。 例えば、 pedantic を導入する場合は以下のようになります。 pubspec. yaml dev_dependencies : flutter_test : sdk : flutter # プラグインを追加 pedantic : ^1.11.0 analysis_options. yaml # pedanticのanalysis_options.yamlを設定 include : package:pedantic/analysis_options.yaml analyzerの設定 analyzer では Dart の型システムのカスタマイズや、静的解析を適用する範囲の設定などができます。 厳密な型チェックを有効にする Dart は部分的に動的片付け言語になるため、デフォルトでは暗黙的型変換が有効であったり、比較的ゆるめの型チェックになります。 Dart のデフォルトの型チェックよりも厳密な型チェックが必要な場合は、 analyzer のオプションで strong-mode を指定することで有効にできます。 strong-mode では以下のような設定が可能です。 implicit-casts false にすることで暗黙的型変換の実装を禁止できます。 implicit-dynamic false にすることで動的な型宣言で使用する dynamic 型の使用を禁止できます。 analysis_options.yaml は以下のように設定します。 analyzer : strong-mode : implicit-casts : false implicit-dynamic : false コンパイル 時の型チェックが厳密になり、より堅牢なコードになるので、できるだけ厳密な型チェックは有効にすることをおすすめします。 一部のファイルを解析の対象から除外する Flutterの実装をしていると、immutableなクラスを自動生成する freezed パッケージなどで自動生成されたファイルは、静的解析の対象から除外したい場合があります。 また、一部のファイルを解析から除外したい場合は、 analyzer のオプションの exclude に除外するファイルを設定できます。 以下に analysis_options.yaml の設定の一例を載せておきます。 analyzer : exclude : # ファイルを直接指定 - lib/client.dart # フォルダ内の特定の拡張子を指定 - lib/data/model/*.freezed.dart # フォルダ内の全てのファイルを指定 - test/_data/** 特定のルールをプロジェクトで無効にする 前述した静的解析用の プラグイン を導入した際に、特定のルールだけは無効にしたい場合があります。 特定のルールをプロジェクトで無効にするには、 analyzer のオプションの errors に設定し、 errors のオプションに無視したいルール名、 ignore を設定すると、プロジェクト全体で指定したルールを無効にできます。 なお、AnalyzerとLinterのどちらのルールも無効にできます。 参考として、以下に analysis_options.yaml 設定の一例を載せておきます。 analyzer : errors : # ルール名:ignore # Analyzerの無効化:TODO表記を無視する todo : ignore # Linterの無効化 avoid_empty_else : ignore 解析のルールの重要度を変更する Flutterの静的解析には info 、 warning 、 error の3種類の重要度があります。 info と warning :静的解析には失敗しないが、警告されるレベル error :違反していると静的解析が失敗するレベル Flutterの静的解析では、特定の解析ルールの重要度をプロジェクト全体で変更することができます。 例えば、Linterルールはデフォルトで info レベルに設定されていますが、 warning や error レベルに引き上げることが可能です。 重要度を変更するには analyzer の errors オプションに、変更したいルール名と重要度( info 、 warning 、 error )を設定します。 以下に、 analysis_options.yaml 設定の一例を載せておきます。 analyzer : errors : # ルール名:重要度(info、warning、error) # Analyzerの変更:returnの省略を警告する missing_return : warning # Linterの変更 prefer_contains : error linterの設定 プラグイン である pedantic や effective_dart を導入することで、Linterを手軽に設定できましたが、もちろん開発者が個別でLinterをカスタマイズすることも可能です。 カスタマイズする項目を linter の rules に設定します。 Linterで設定できるルールの一覧は、以下で公開されています。 dart-lang.github.io pedantic と effective_dart 、Flutterでデフォルトで適用されている設定はそれぞれマークされており、設定されているルールを上書きして無効にすることもできます。 例えば、ローカル変数で 型推論 を使用するようにします。 omit_local_variable_types を無効にする場合は、以下のように false を設定します。 include : package:pedantic/analysis_options.yaml linter : rules : omit_local_variable_types : false ファイルや特定のコードを静的解析の対象から除外する analyzer の設定で、特定のファイルを静的解析の対象から除外することができました。 それに加え、 ソースコード の特定の1行だけ特別に静的解析の対象から除外することができます。 また、ファイル内にそのファイルを静的解析の対象から除外する設定ができます。 1行のコードで特定のルールを除外する 特定の1行のコードでルールを除外するにはコードの1行上に ignore: linterのルール を コメントアウト で追加します。複数のルールを除外する場合はコンマ区切りで指定します。 // ignore: linterのルール名 // 以下実装例 class Point { int x, y; // ignore: empty_constructor_bodies Point ( this .x, this .y) {} // 空のコンストラクタが警告されない } ファイル内で特定のルールを除外する ファイル内で特定のルールが適用されないように設定できます。ファイルのどこか(できればパッケージのimportの直下)に ignore_for_file: linterのルール を コメントアウト で追加します。複数のルールを除外する場合はコンマ区切りで指定します。 // ignore_for_file: linterのルール名 // 以下実装例 // ignore_for_file: omit_local_variable_types, empty_constructor_bodies class Point { int x, y; Point ( this .x, this .y) {} // 空のコンストラクタが警告されない } 静的解析の実行 静的解析を実行する方法には、エディタで実行する方法と、 コマンドライン で実行する方法があります。 静的解析の実行については、Flutterの リポジトリ の Wiki に詳しく記載されていますので、合わせてご確認ください。 github.com エディタで静的解析を有効にする Flutterの開発に対応しているエディタや IDE を使用している場合、各環境のFlutterと Dart の拡張 プラグイン をインストールしていればプロジェクトの analysis_options.yaml を認識して、ファイル保存時などおいて、自動で静的解析を実行します。 各エディタのセットアップ方法は、以下に紹介されています。 手順に沿って拡張 プラグイン をインストールしてください。 flutter.dev コマンドライン で静的解析を実行する コマンドライン からでも静的解析を実行できます。 プロジェクトのルートで flutter analyze を実行します。 $ flutter analyze Analyzing flutter_analyzer... info • Avoid types as parameter names • lib/main.dart:39:16 • avoid_types_as_parameter_names 1 issue found. (ran in 4.2s) まとめ Flutterの静的解析についてまとめました。 Lintルールなど設定値が多く、いきなり一つ一つを自分で設定するのハードルが高いかと思います。 ですのでまずは、 pedantic や effective_dart などの プラグイン を導入することをお勧めします。 また、別の方法としてはFlutterの リポジトリ にある analysis_options.yaml ファイルをコピーする方法もお勧めです。 あとは、 Effective Dart をしっかり読み、Flutterの実装を進めて気になることがあれば個別でルールを追加していくと良いかと思います。 そして、ある程度ルールが固まってきたらテンプレート化し、複数のプロジェクトで使いまわせるようになるかと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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です。 Google スプレッドシート を皆様ご存じでしょうか? 「あー、 Google 版 Excel かな?」と思う方もいると思いますが、実は Microsoft 社の Excel と違いが多くあります。 今回は、初心者の方向けに Google スプレッドシート の使い方 や、ビジネスシーンで多く利用されている Microsoft 社の Excel との違い などをご紹介します。 また、このブログをご確認いただくことで、 Google スプレッドシート の理解を深めていただき、業務効率を上げていきましょう。 なお、 Excel 初心者の方向けに「 Excel(エクセル) IF関数 使い方【まとめ】 」もございますので、是非ご参考ください。 はじめに Google スプレッドシートとは Google スプレッドシートの使い方 Google スプレッドシートとExcelの違いと特徴 Google スプレッドシートのインストール有無 編集方法 保存方法 処理スピード Google スプレッドシートの関数 代表的な関数 便利な関数 おすすめ関数 Google スプレッドシートのマクロ マクロの記憶 マクロの実行 マクロの確認 マクロの編集 Google スプレッドシート 使い方 まとめ Google スプレッドシート とは まず初めに、 Google スプレッドシート とは何なのかを簡単にお話しさせていただきます。 Google スプレッドシート とは、 ググる でお馴染の 検索エンジン Google が提供している 表計算 ソフトのことです。 後程詳しくご説明しますが、ソフトをパソコンにインストールする必要がなく、インターネットを介して使用するWebアプリケーションの一種です。 Google スプレッドシート を使うにあたり、ずばり必要なものは「 Google アカウント 」だけになります。 よって、誰でも簡単に利用することができる優れものです。 また、費用も一切かからず、 無料で利用 できます。 この通り、メリットがいっぱいに見える Google スプレッドシート ですが、本当にそうなの?と、疑問に思われた方も多いはずです。 その疑問を解消すべく、 Google スプレッドシート と Excel の比較をして確認していきましょう。 Google スプレッドシート の使い方 では、早速 スプレッドシート を作っていこうと思うのですが、まずは Google アカウントの作成が必要です。 Google アカウントを作成するにあたり、費用はかかりませんのでご安心を。 Google アカウント作成方法 Google アカウント作成ページにアクセス 氏名・パスワードを入力 画面の指示通りに進む Google アカウント作成完了 とても簡単な作業で、数分で完了できるかと思います。 Google スプレッドシート と Excel の違いと特徴 Excel と見た目はほぼ変わりません。 Google アカウント作成後、ログインして スプレッドシート をご確認ください。 では、 Google スプレッドシート と Excel では何が異なるのかをご説明します。 Google スプレッドシート のインストール有無 比較 Google スプレッドシート Excel インストール有無 × ○ Google スプレッドシート と Excel との大きな違いは、インストールの有無です。 Google スプレッドシート は、WEB上のアプリケーションであるため、パソコンや スマホ への インストール作業は不要 です。 要するに、ブラウザとインターネット環境が整っていれば、パソコンや スマホ 、 タブレット からも編集や閲覧ができます。 Google アカウントをお持ちであれば、どこにいても スプレッドシート を利用することができます。 Excel は、パソコンや スマホ にアプリケーションのインストールが必要です。 アプリケーションのインストールをするにしても、 サブスクリプション サービスを契約しなくてはならず、コストと手間を考えると Google スプレッドシート のが断然便利です。 編集方法 比較 Google スプレッドシート Excel 複数人での同時編集有無 ○ ○ Google スプレッドシート は、 複数人による同時編集が可能 です。 1つの スプレッドシート を複数人で同時に編集することができ、変更履歴も自動で取ってくれますので、作業効率が格段に上がります。 また同時編集をするには、 スプレッドシート 毎にアクセス制限の設定を行う必要がありますので、ご注意ください。 Excel は、ファイルを共有設定しておくことで同時編集は可能です。 では何が異なるのか疑問ですよね? Google スプレッドシート は、同時編集だけでなく、リアルタイムで編集している人の編集箇所を表示してくれる機能や、同時編集者とのチャット機能があります。 そのため、同時編集をしている上でのミス(同じ箇所を編集したり、他の人が編集した箇所を間違って削除)が軽減されます。 Google スプレッドシート と Excel ともに、複数人での同時編集ができますが、上記の通りの編集方法の違いを確認した上で、どちらを利用するか決めても良いと思います。 保存方法 比較 Google スプレッドシート Excel 自動保存有無 ○ × 変更履歴保存有無 ○ △ Google スプレッドシート は、シート上で1つでも編集を加えると、その変更内容を自動保存してくれます。 そのため、手動で保存をする必要がありません。 また、変更履歴を自動保存してくれますので、前バージョンの確認や、データの復元もできます。 Excel のように、毎回保存ボタンを押す必要がありません。 処理スピード 比較 Google スプレッドシート Excel 複雑な計算無:処理スピード ○ ○ 複雑な計算有:処理スピード × ○ Google スプレッドシート はWebアプリケーションであるため、 Google のサーバー上でプログラムが稼働しております。 そのため、PCや スマホ にアプリケーションをインストールしている Excel と比較すると、関数を利用した計算や大量データの処理を行う場合は、処理スピードが落ちてしまいます。 複雑な計算であれば、 Excel と大して変わりはありませんが、PCや スマホ に負荷のかかるような処理を行う際は、 Google スプレッドシート よりも Excel のほうが適していますね。 Google スプレッドシート の関数 Excel と同様、 Google スプレッドシート でも関数を利用できます。 Google スプレッドシート で利用できる全関数リストは、以下の公式ページが一番わかりやすくまとまっていますのでそちらをご確認ください。 support.google.com いくつかの関数を抜粋し、私の方でもまとめてみましたのでご参考いただけますと幸いです。 代表的な関数 関数名 構文 説明 SUM SUM(値1, 値2) 一連の数値またはセルの合計を返す。 AVERAGE AVERAGE(値1, 値2) デー タセット 内の値の平均値を返す。 MAX MAX(値1, 値2) 数値のデー タセット における最大値を返す。 MIN MIN(値1, 値2) 数値のデー タセット における最小値を返す。 MEDIAN MEDIAN(値1, 値2) 数値のデー タセット における中央値を返す。 便利な関数 関数名 構文 説明 COUNTIF COUNTIF(範囲, 条件) 範囲内で条件に一致する要素の個数を返す。 SUMIFS SUMIF(範囲, 条件, 合計範囲) 範囲内の条件に一致するセルの合計を返す。 AVERAGEIF AVERAGEIF(条件範囲, 条件, [平均範囲]) 条件に基づいて範囲の平均値を返す。 MAXIFS MAXIFS(範囲, 条件範囲1, 条件1, [条件範囲2, 条件2], …) セル範囲を一連の条件で絞り込み、その最大値を返す。 MINIFS MINIFS(範囲, 条件範囲1, 条件1, [条件範囲2, 条件2], …) セル範囲を一連の条件で絞り込み、その最小値を返す。 おすすめ関数 関数名 構文 説明 UNIQUE UNIQUE(範囲) 重複する行を破棄して、指定したソース範囲内の一意の行を返す。行はソース範囲内の先頭から順に返す。 SPLIT SPLIT(テキスト, 区切り文字, [各文字での分割], [空のテキストを削除]) 指定した文字または文字列の前後でテキストを分割し、各部分を同じ行の別のセルに表示する。 CONCATENATE CONCATENATE(文字列1, 文字列2) 文字列を別の文字列に結合する。 JOIN JOIN(区切り文字, 値または配列1, 値または配列2) 指定した区切り文字を使用して、1 つ以上の 1 次元配列の要素を結合する。 TEXTJOIN TEXTJOIN(区切り文字, 空のセルを無視, テキスト1, [テキスト2], …) 複数の文字列または配列からのテキストを結合し、異なるテキスト間に指定された区切り文字を挿入する。 Google スプレッドシート のマクロ Google スプレッドシート には Excel と同様、マクロ機能があります。 VBA の代わりに Google Apps Scriptを使うことで、マクロの編集や、ユーザー操作を記録してマクロを作成することも可能です。 今回は、 Google スプレッドシート でのマクロの使い方についてご紹介いたします。 マクロの記憶 1. 新規の スプレッドシート を開く。 2. セルA1に「テスト」と入力する。 3. ユーザ操作を「Apps Script 1 」の スクリプト として記録する。 [ツール]→[マクロ]→[マクロの記録]を選択する。 4. 下部に「新しいマクロを記録しています」のバーが現れたことを確認し、ユーザー操作の記録を開始する。 絶対参照:マクロの適用時、記録時と同じセルを使用する設定 相対参照:マクロの適用時、選択中のセルを使用する設定 ※今回は、絶対参照を例として使います。 5. 「テスト」を太字に変更する。 6. 「テスト」のフォントの色を変更する。 7. マクロの記録を停止する。 下部バーの「保存」を押下 8. マクロ名とショートカットキーを設定し、保存する。 マクロ名:「マクロ_テスト1」 ショートカットキー Windows :[ctrl]+[alt]+[Shift]+[1] MAC :[command]+[option]+[Shift]+[1] 9. 以下のメッセージが表示されることを確認する。 マクロの実行 1. セルA1に「こんにちは」と入力し、書式設定をリセットする。 書式設定をクリア:ショートカットキー Ctrl+\ 2. 先ほど作成した「マクロ_テスト1」を実行する。 スクリプト 実行の承認を行う。 ※初めてマクロを実行する場合のみ [続行]を押下する。 アカウントの紐づける。 アカウントへのアクセスを許可する。 「マクロ_テスト1」を実行する。 ショートカットキーで実行する。 マクロ実行後、書式が変更される。 マクロの確認 1. 登録したマクロを確認する。 [ツール]→[マクロ]→[マクロを管理] 2. 登録したマクロの一覧が表示される。 マクロの編集 1. 登録したマクロ一覧を開く。 [ツール]→[マクロ]→[マクロを管理]を選択する。 2. 修正するマクロの[︙]を選択する。 3. [ スクリプト を編集]を押下する。 4. Google Apps Scriptのエディタを開き、コードを編集する。 Google Apps Scriptのエディタ画面が開く。 マクロの修正を行う。 修正内容 マクロ実行セル:A1→C1 フォントの書式:太字(bold)→斜体(italic) フォントの色 :赤(#ff0000)→黄緑(#00ff00) 修正したマクロの保存する。 [command]+[s]で保存する。 5. 修正したマクロの実行 「マクロ_テスト1」を実行する。 ショートカットキーで実行する。 マクロ実行後、書式が変更される。 以上、マクロの作成~実行までの流れでした。 今回、 Google Apps Scriptのご紹介をさせていただきましたが、とても便利だと思いませんか? ビジネスシーンでも多く利用されるマクロ機能ですが、 Google Apps Scriptと合わせることでより便利になることを実感できるのではないでしょうか。 Google Apps Scriptは覚えておいて損はありません。 私はもっと業務効率を上げれるような仕組みが作れれば良いな、と思っていますので引き続き学習をしたいと思いました。 Google スプレッドシート 使い方 まとめ 今回は Google スプレッドシート の活用法について、 Excel と比較をしながらご紹介させていただきました。 ラク スに入社してから本格的に Google スプレッドシート を利用していますが、率直に とても便利 です! また、今回本ブログとして活用法をまとめたことで、もっと効率的な利用方法があることを学びなおしました。 特にマクロ機能は、すぐにでも業務に取り入れようと思っております。 最後にはなりますが、本内容が1つでも皆様のお役に立てていれば幸いです! 今後とも、 ラク スを宜しくお願い致します。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com Apps Script ↩
アバター
こんにちは。エンジニアのrs_shoです。 投稿は5回目になります。今回は初心者向けの SQL について説明しようと思います。 はじめに SQLとは 各SQLの命令文 データの検索(閲覧) SELECT文の書き方 SELECT文の使用方法 データの登録(挿入) INSERT文の書き方 INSERT文の使用方法 データの更新(編集) UPDATE文の書き方 UPDATE文の使用方法 データの削除 DELETE文の書き方 DELETE文の使用方法 条件指定 WHERE句の書き方 WHERE句の使用方法 SELECT文のWHERE句の使い方 UPDATE文のWHERE句の使い方 DELETE文のWHERE句の使い方 まとめ 参考文献 ◆ 関連記事 ・ 【SQL入門】INSERT まとめ ・ 【SQL入門】UPDATE まとめ ・ 【SQL入門】DISTINCT 使い方 ・ RDBMSとDBMSについて【初心者向け】 ・ 【RDBMS】PostgreSQLインストール・コマンド入門編 はじめに この記事では SQL を学び始めの方向けに、 SQL 文の書き方やどういった役割があるかを主に説明しています。 初心者の方に限らず、これどう書くっけ?ってなった人や、初心に帰って1から勉強している方の手助けにもなれましたら幸いです。 SQL とは SQL について軽く説明します。 SQL とはデータベース言語と言われるもので、 データを検索(閲覧)、追加(保存)、更新、削除などを行うことができる言語です。 各 SQL の命令文 データの検索(閲覧) データの検索(閲覧)はSELECT文を使用します。SELECTは「選択する」という意味になるので、 欲しいデータを選択(抽出)するという単語の意味と一緒に覚えていただければ良いと思います。 SELECT文の書き方 SELECT文は以下のように記述します。 SELECT [カラム 1 ], [カラム 2 ], ... FROM [テーブル名]; SELECT文の使用方法 SELECT文の使用例は以下です。 抽出対象のテーブル 社員テーブル(employee) employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 全件検索を行う SQL (テーブルのすべてのデータを抽出) SELECT employee_id, employee_name, age FROM employee; 全件検索 SQL で抽出できる社員の結果 employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 また、上記の SQL では カラム名 を指定していますが、 カラム名 を指定せず、すべてのカラムを検索(抽出)する方法があります。 カラム名 が多く列挙するのが大変、 カラム名 をぱっと思い出せない場合に有効です。 全件検索を行う SQL (テーブルのすべてのデータを抽出, カラムは指定しない) SELECT * FROM employee; 全件検索 SQL (カラム指定なし)で抽出できる社員の結果 employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 データの登録(挿入) データの登録(挿入)はINSERT文を使用します。INSERTは「挿入する」という意味になるので、 こちらもSELECT文同様に単語の意味と一緒に覚えると覚えやすいと思います。 INSERT文の書き方 INSERT文は以下のように記述します。 INSERT INTO [テーブル名] ([カラム 1 ], [カラム 2 ], ...) VALUES ([カラム 1 にいれる値], [カラム 2 にいれる値], ...); INSERT文の使用方法 INSERT文の使用例は以下です。 挿入対象のテーブル 社員テーブル(employee) employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 社員コード 00004 , 社員名 楽楽三郎 , 年齢 22歳 のデータを登録する SQL (挿入) INSERT INTO employee (employee_id, employee_name, age) VALUES ( ' 00004 ' , ' 楽楽三郎 ' , 22 ); データ挿入 SQL で1件挿入した社員テーブルのデータ employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 00004 楽楽三郎 22 また、複数データを1つの SQL 文で一括で登録することも可能です。 書き方としてはVALUESのカッコをカンマで区切って複数記載します。 社員コード 00004 , 社員名 楽楽三郎 , 年齢 22歳 と、 社員コード 00006 , 社員名 楽楽部長 , 年齢 31歳 のデータを登録する SQL (挿入) INSERT INTO employee (employee_id, employee_name, age) VALUES ( ' 00004 ' , ' 楽楽三郎 ' , 22 ), ( ' 00006 ' , ' 楽楽部長 ' , 31 ); データ挿入 SQL で2件挿入した社員テーブルのデータ employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 00004 楽楽三郎 22 00006 楽楽部長 31 SELECT文の * のように、 カラム名 を指定せずに登録することも可能です。 書き方としてはINTO [テーブル名] の後に カラム名 をカッコに列挙する箇所を記載しないようにするだけです。 ( ※意図しないカラムにデータが入ることを防ぐために、INSERTではカラムを指定することを強くオススメします! ) 社員コード 00004 , 社員名 楽楽三郎 , 年齢 22歳 のデータを登録する SQL (挿入) INSERT INTO employee VALUES ( ' 00004 ' , ' 楽楽三郎 ' , 22 ); データ挿入 SQL (カラム指定なし)で1件挿入した社員テーブルのデータ employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 00004 楽楽三郎 22 データの更新(編集) データの更新(編集)はUPDATE文を使用します。UPDATEも「更新する」という意味になるので、 こちらも他の SQL の命令文同様に単語の意味と一緒に覚えてください! UPDATE文の書き方 UPDATE文は以下のように記述します。 UPDATE [テーブル名] SET [カラム 1 ] = [値], [カラム 2 ] = [値], ...; UPDATE文の使用方法 UPDATE文の使用例は以下です。 更新対象のテーブル 社員テーブル(employee) employee_id employee_name age employment_status 00001 楽楽太郎 30 正社員 00002 楽楽次郎 24 正社員 00003 楽楽花子 22 契約社員 社員全員の雇用形態を正社員に更新する SQL (編集) UPDATE employee employment_status = ' 正社員 ' ; データ更新 SQL で更新した社員テーブルのデータ employee_id employee_name age employment_status 00001 楽楽太郎 30 正社員 00002 楽楽次郎 24 正社員 00003 楽楽花子 22 正社員 UPDATE文はSET後に記載されたカラムのみを更新するため、更新したくないカラムがある場合は記載しないようにしてください。 また、UPDATE文は条件指定をしない場合、テーブル全体に更新がかかってしまうため、 特定のデータのみ更新したい場合は、後述する WHERE句 についての説明をご確認ください。 (※(厳密に言うと方法はありますが) カラム名 は必ず指定する必要があるので、SELECT文やINSERT文の SQL のように省略はできません) データの削除 データの削除はDELETE文を使用します。DELETEは「削除する」という意味なので、 こちらも他の SQL の命令文同様、単語の意味と一緒に覚えてください! DELETE文の書き方 DELETE文は以下のように記述します。 DELETE FROM [テーブル名]; DELETE文の使用方法 DELETE文の使用例は以下です。 削除対象のテーブル 社員テーブル(employee) employee_id employee_name age 00001 楽楽太郎 30 00002 楽楽次郎 24 00003 楽楽花子 22 社員テーブルのデータを全削除する SQL DELETE FROM employee; データ削除 SQL で削除した社員テーブルのデータ employee_id employee_name age DELETE文はUPDATE文同様、そのまま実行するだけではテーブルの全データを削除してしまうため、 特定のデータだけを削除したい場合は、後述する WHERE句 についての説明をご確認ください。 条件指定 SELECT, UPDATE, DELETEは、条件を満たすデータにのみ実行したくなることが多々あります。 そういった時には SQL のWHERE句と呼ばれるものを使用します。 WHERE句の書き方 WHERE句は以下のように記述します。 {SQLの命令文} WHERE [カラム 1 ] = [値]; WHERE句は条件指定でデータを選択することができます。 上記で記載した比較 演算子 = 以外にも、様々な 演算子 を使用することができます。 演算子 の記号 意味 用途 = 等しい 記載した値と等しいデータにのみ <= 以下 記載した値以下のデータにのみ >= 以上 記載した値以上のデータにのみ < より小さい(未満) 記載した値より小さい値のデータにのみ > より大きい 記載した値より大きい値のデータのみ WHERE句の使用方法 WHERE句の使用例は以下です。 操作対象のテーブル 社員テーブル(employee) employee_id employee_name age employment_status 00001 楽楽太郎 30 正社員 00002 楽楽次郎 24 正社員 00003 楽楽花子 22 契約社員 SELECT文のWHERE句の使い方 SELECT文(employee_idが 00002 と等しいデータのみ抽出する SQL ) SELECT employee_id, employee_name, age FROM employee WHERE employee_id = ' 00002 ' ; employee_idが 00002 と等しいデータの抽出結果 employee_id employee_name age employment_status 00002 楽楽次郎 24 正社員 SELECT文(ageが24歳以下のデータのみ抽出する SQL ) SELECT employee_id, employee_name, age FROM employee WHERE age <= 24 ; ageが24歳以下のデータの抽出結果 employee_id employee_name age employment_status 00002 楽楽次郎 24 正社員 00003 楽楽花子 22 契約社員 UPDATE文のWHERE句の使い方 UPDATE文(ageが24歳以上のデータのみ管理職に更新) UPDATE employee employment_status = ' 管理職 ' WHERE age >= 24 ; ageが24歳のデータを管理職に更新したテーブルのデータ employee_id employee_name age employment_status 00001 楽楽太郎 30 管理職 00002 楽楽次郎 24 管理職 00003 楽楽花子 22 契約社員 DELETE文のWHERE句の使い方 DELETE文(employment_statusが 契約社員 の人のみ削除) DELETE FROM employee WHERE employment_status = ' 契約社員 ' ; employee_statusが 契約社員 のデータを削除したテーブルのデータ employee_id employee_name age employment_status 00001 楽楽太郎 30 正社員 00002 楽楽次郎 24 正社員 まとめ いかがだったでしょうか。久しぶりに事細かく SQL について書いたので、僕自身も勉強になりました。 初めて SQL を触る方、まだ使い方に慣れていない方など、これから SQL を学んでいく人の手助けになりましたら幸いです。 参考文献 SQLをはじめよう - 初心者でもわかる、構文とデータ取得の基本 SQLの基本を覚える【初心者向け】 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは。楽楽勤怠バックエンドチームの mako _makokです。 皆様はSlack アプリを開発されるときはどうやって開発されていますか? Hubotでしょうか?それともHttp Clientから直で叩いていますか? 今回はSlack API を簡単に使え、爆速でSlack アプリを開発するための フレームワーク Bolt のご紹介をさせていただきます。 Boltとは JavaScript Java Python スラッシュコマンドについて スラッシュコマンドの概要 スラッシュコマンドを登録する Boltを使う Slack API を叩いてみる スラッシュコマンドを作る レシーバーの作成 スラッシュコマンドのアクションを作成する 余談: Block Kit まとめ おまけ 参考 Boltとは Slack API チーム謹製のSlack API Client + スラッシュコマンド用のレシーバを兼ね備えた、Slack アプリ開発 用の フレームワーク です。 現時点では JavaScript (TypeScript), Java , Python の SDK が配布されています。 オープンソース で開発されていおり、 リポジトリ はそれぞれ以下です。 JavaScript 主にTypeScriptで開発されています。 型フレンドリーにSlack API を使用することができます。 github.com Java kotlin用のextensionやSpring BootやKtorなど Java , KotlinのWeb Frameworkへのextensionやサンプルなども豊富にあります。 github.com Python type hintフレンドリーな開発ができます。 一部独自のアプローチでSlack アプリが抱える問題を解決したりしています。 github.com どの言語でも細かな差はありますが、基本的なインターフェースは同じなので自身の好きな言語を選択してください。 今回は bolt-js を使用して解説していこうと思います。 スラッシュコマンドについて Boltの説明に入る前に、スラッシュコマンドについて説明します。 スラッシュコマンドは、Slack上で /foo のようにし、それをトリガーとして様々なアクションを行うことができます。 もし既にSlackをインストールしてあるのであれば、 / と入力してみてください。 デフォルトで登録されているいくつかのスラッシュコマンドが一覧表示されます。 続けて /remind と入力してみると、リマインダー登録用のモーダルが表示されると思います。 スラッシュコマンドの概要 スラッシュコマンドを簡略化すると、以下のように動いています。 スラッシュコマンドを入力すると、指定したエンドポイントにSlackからHttp Requestが送られてきます。 スラッシュコマンドを登録する スラッシュコマンドは https://api.slack.com/apps/{app_id}/slash-commands にアクセスし、 Create New Command を押すと以下の画面が出てきます。 Commandに登録したいスラッシュコマンド、Request URLにSlackからのリク エス トを受け取るエンドポイントを設定します。 Boltを使う Slack API を使うために、Boltの初期化をしていきます。 今回は bolt-js を利用するので、npmでインストールします。 プロジェクトを作成し、 npm install @slack/bolt とするだけでインストールが完了します。 TypeScriptはお好みで入れてください。 最初にAppを インスタンス 化します。 import { App } from '@slack/bolt' const app = new App ( { token: process .env.SLACK_BOT_TOKEN , signingSecret: process .env.SLACK_SIGNING_SECRET , } ) (async () => { // Start your app await app.start ( process .env.PORT || 3000 ); console .log ( '⚡️ Bolt app is running!' ); } )(); tokenとsingleSecretは以下から取得することができます。 singleSecret https://api.slack.com/apps/{app_id} token https://api.slack.com/apps/{app_id} Slack API を叩いてみる Boltの初期化は完了したので、実際にSlack API を叩いていきます。 以下は chat.postMessage を叩いて、チームメンバーが参加したらメッセージを送信するサンプルです。 app.event ( 'team_join' , async ( { event , client } ) => { try { await client.chat.postMessage ( { channel: 'foo' , text: `いらっしゃい、<@ ${ event.user.id } >! 🎉` , } ) } catch ( error ) { console .error ( error ) } } ) 第一引数にイベント名、第二引数にリスナーを設定します。 リスナーのclientは認証済みのものが渡されるので、すぐにSlack API を叩くことができます。 また、リスナーを介さずSlack API を叩くことも可能です。 App自体が WebClient を持っているので、tokenを都度渡して実行します。 await app.client.chat.postMessage ( { token: process .env.SLACK_BOT_TOKEN , channel: 'foo' , text: `いらっしゃい、<@ ${ event.user.id } >! 🎉` , } ) さらに、BoltにはSlack API を更に簡単に扱うためのユーティリティが用意されています。 例えば、更に簡単に chat.postMessage を実行できる say() 関数などがあります。 以下は「おはよう」というメッセージに反応して、「今日もいい天気!」と返す スクリプト です。 app.message ( 'おはよう' , async ( { message , say } ) => { await say ( `今日もいい天気!` ); } ); say() 関数はチャンネルが特定できるイベントであれば、使用することができます。 スラッシュコマンドを作る Boltでは簡単にスラッシュコマンドを作ることができます。 レシーバーの作成 Slackからのリク エス トを受け取ってレスポンスを返すレシーバー、以下のように設定します。 import { App , ExpressReceiver } from '@slack/bolt' export const expressReceiver = new ExpressReceiver ( { signingSecret: process .env.SLACK_SIGNING_SECRET , endpoints: '/events' } ) export const app = new App ( { receiver: expressReceiver , token: process .env.SLACK_BOT_TOKEN } ) ExpressReceiver を App に渡すだけで、簡単にレシーバーの設定をすることができます。 エンドポイントは /events と記載してありますが、実際のルーティングは /slack/events となるので注意してください。 このエンドポイントを「スラッシュコマンドについて」で紹介した、Request URLに設定して準備完了です。 スラッシュコマンドのアクションを作成する スラッシュコマンドを入力されたときのアクションを書いていきます。 今回は /register-word というスラッシュコマンドが入力されると、モーダルが開き、情報を入力してsubmitすると入力された内容が送信され、それを受けとるサンプルです。 const close: PlainTextElement = { type : 'plain_text' , text: 'キャンセル' } const submit: PlainTextElement = { type : 'plain_text' , text: '登録' } function buildBlocks () : KnownBlock [] { const keywordInput: InputBlock = { type : 'input' , block_id: 'keyword' , label: { type : 'plain_text' , text: '検索ワード' , } , element: { type : 'plain_text_input' , action_id: 'keyword_input' , } , } // ... return [ keywordInput ] } const VIEW_ID = 'dialog_1' export const register = ( app: App ) => { app.command ( '/register-word' , async ( { ack , body , context , command } ) => { await ack () try { await app.client.views.open ( { token: context.botToken , trigger_id: body.trigger_id , view: { type : 'modal' , callback_id: VIEW_ID , title: { type : 'plain_text' , text: '検索ワードの登録' , } , blocks: buildBlocks (), private_metadata: command.channel_id , close , submit } , } ) } catch ( err ) { console .error ( err ) } } ) app.view ( VIEW_ID , async ( { ack , view , context , body } ) => { await ack () const values = view.state.values const keyword = values.keyword.keyword_input.value // ... } ) } まず app.command でスラッシュコマンドを待機します。 app.command ( '/register-word' , async ( { ack , body , context , command } ) => { } 最初に ack() 関数を実行します。 この関数はSlackに対して即座にレスポンスを返すことができます。 スラッシュコマンドは3秒以内にレスポンスを返さないといけないというルールがあるので、まずはレスポンスを返します。 後続の処理は非同期で実行されます。 await ack () スラッシュコマンドを受け取ったら views.open を叩きます。 この API では Block Kit で作成されたViewを表示することができます。 submitに登録されているオブジェクトがクリックされると実際にsubmitされます。 submitされたフォームのデータは app.view で受け取ることができます。 app.view ( VIEW_ID , async ( { ack , view , context , body } ) => { await ack () const values = view.state.values const keyword = values.keyword.keyword_input.value // ... } ) views.open で設定された callback_id を検知して発火します。 フォームの中身は view.state.values の中にあります。 values以下のオブジェクト構造は views.open で使用しているBlock Kit内で決めることができます。 const keywordInput: InputBlock = { type : 'input' , block_id: 'keyword' , label: { type : 'plain_text' , text: '検索ワード' , } , element: { type : 'plain_text_input' , // action_idがvalues以下のプロパティとなる action_id: 'keyword_input' , } , } 余談: Block Kit Block Kitを利用することで、複雑なUIを表現する事ができます。 Block Kitについては公式のドキュメントがわかりやすいです。 api.slack.com また、 Block Kit Builder というツールもあり、プレビューしながらUIを構築することが可能です。 まとめ 今回はBoltについて紹介させていただきました。 今回紹介しきれなかった機能もたくさんあるので、みなさんもぜひ触ってみてSlackアプリを作ってみてください。 改めて、Boltのメリットをまとめます。 Slack API チームがメンテナンスしているので、信頼性が高い 型安全にSlack API を扱うことができる Slack API を簡単に使うための便利なユーティリティ スラッシュコマンド用のレシーバーを簡単に生成できる おまけ Bolt + Firestore + Cloud Functions 成果物として、スラッシュコマンドからワード登録モーダルを開き、毎朝バッチで勉強会情報を通知してくれるサンプルを作ってみました。 よろしければ参考にしてみてください。 github.com 参考 Bolt入門ガイド( https://slack.dev/bolt-js/ja-jp/tutorial/getting-started ) Slack API ( https://api.slack.com/apis ) Bolt for JavaScript を使った Slack アプリ開発 で知っておくと捗る 7 つのこと( https://qiita.com/seratch/items/dcedc7476eac5f681d30 ) ※冒頭画像のSlackロゴは、 公式サイト で配布されているものを使用しております。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
Rust入門 こんにちは高照です。 今回はここ数年で急成長を遂げたRustという プログラミング言語 を勉強しましたので記事にしました。 本記事では Rustについての解説 と プログラミングのはじめ方 、 基本的なプログラムの記法 をまとめます。 Rust入門 Rustとは Rustの魅力 環境構築 プロジェクトの作成とHello, World! コーディング 最後に Rustとは Rustは Mozilla 社が支援する オープンソース の プログラミング言語 です。 また、2016〜2019年で Stack Overflow Developer Survey で「最も愛されている プログラミング言語 」で一位を獲得し続けていた言語で初めにも記述したように急成長を遂げました。しかしながら、学習難易度が高い言語とも言われていて今後の学習のしやすさが課題となってきます。 Rustの魅力 Rustの魅力的なポイントとして以下の6つを上げることができます。 実行速度の速さ モダンな文法 OSからWebアプリケーションまでカバー ツール群の充実性 強力な安全性 エディションによって互換性を担保 これらの魅力を少し解説していこうと思います。 1. 実行速度の速さ Rustはプログラムの実行速度を重視した言語で、 競技プログラミング でも使用されている C言語 にも匹敵する実行速度を出すことができます。 この理由として以下のような要因が考えられます。 機械語 に コンパイル される ガベージコレクション を持たない ゼロコスト抽象化の追求 機械語 に コンパイル される Java や Python などは、独自の 仮想マシン 上でコードを実行することで様々なプラットフォームでもコードを実行することができるようになるという利点があります。一方、実行には 仮想マシン を介す必要があるため速度においては不利と言えます。 Rustは 仮想マシン を使用せず直接 機械語 に コンパイル できるためこれらの問題での速度低下は起きません。 ガベージコレクション を持たない 自動で使用したメモリを開放する機能である ガベージコレクション を持ちません。 そして、 C言語 や C++ では手動でメモリ管理をする必要もありません。 Rustは 所有権 ・ 借用 ・ ライフタイム というこれまでにない仕組みでメモリを管理されます。 そのため ガベージコレクション や手動のメモリ解放に頼らないため速度と安全性を兼ね備えています。 ゼロコスト抽象化の追求 Java のabstractのような共通部分を抜き出す固有の処理は、抽象化する処理をRustではコストを払うことなく使用することができます。この抽象化は大規模なプロジェクトを作成するにあたり多様されるため、ゼロコストで抽象化をすることができるというのは処理速度面で大きなアドバンテージだと言えます。 2. モダンな文法 Rustは多くの プログラミング言語 を参考にし、設計されました。 Rustはデフォルトで変数割当は不変となっています。つまり、変数を作成した後に、値を再代入しようとすると コンパイル エラーとなります。例は以下の通りです。 fn main ( ) { // 変数aを宣言し1で初期化する let a = 1 ; // aに2を再代入しようとするとコンパイルエラー a = 2 ; } また、letの後ろにmutをつけることで再代入可能な変数を扱うことができます。 fn main ( ) { // 変数aを宣言し1で初期化する let mut a = 1 ; // aに2を再代入する a = 2 ; } 変数をデフォルトで不変にするメリットは、長いスコープ内で代入を繰り返してしまい、値がどう変化してしまうか把握できなくなってしまうことを防ぐことができます。 また予期しない変数への再代入などにより、バグが発生しづらいコーディングをすることができます。 これ以外にもモダンな文法が含まれていますが、現段階で説明してしまうと非常に難しくなってしまうため割愛いたします。 3. OSからWebアプリケーションまでカバー Rustは システムプロ グラムだけでなく、Webアプリケーションのバックエンド開発を行うことも可能です。 activex -webという フレームワーク が存在し、Node.jsなどの フレームワーク と遜色ない開発が可能です。 4. ツール群の充実性 RustにはCargoというパッケージマネージャ・ビルドツールが存在します。 Cargoはライブラリのインストールやプログラムのビルドを全て行うことができます。 今回、使用するのは以下の3つのコマンドです。 cargo new → プロジェクト作成 cargo check → コンパイル が通るかのチェック cargo run → コンパイル ・実行 また、プログラミングする際に使用するエディタも充実しています。 IntelliJ やCLion、 Visual Studio Code 、 Vim 、 Emacs など多くのエディタで プラグイン が作成されています。 今回、私は Visual Studio Code を使用しコーディングしていきます。 5. 強力な安全性 Rustは メモリ安全ではない操作 や スレッド安全ではない操作 を未然に防ぐように設計されています。 メモリ安全ではない操作 メモリを手動で管理する C言語 や C++ などでは「メモリの開放を忘れてしまう」ことや、「開放したはずのメモリをもう一度開放しようとしてしまう」などの状況を メモリ安全ではない と言います。 「 ガベージコレクション を持たない」の項目でも説明したとおり、Rustでは手動管理ではなく 所有権 ・ 借用 ・ ライフタイム でメモリ管理されることでメモリの安全を保証しています。 スレッド安全ではない操作 2つの並行するスレッドがあると仮定し、それぞれa = 1,b = 2の処理を非同期に行うとします。 a = 1の処理が終わった際にbの値はどうなっているのでしょうか。 答えは 分かりません 。 なぜかというと、a = 1の処理が終了した際に b = 2の処理がまだ終了していない場合も考えられるからです。この状態を スレッド安全ではない と言います。 Rustはこの状態をプログラム上で考慮されているかを厳しくチェックし、スレッド安全であることを保証します。 6. エディションによって互換性を担保 Rustには2015エディションと2018エディションが存在し、相互の互換性が効かない文法が存在します。 しかし、ライブラリ単位ごとならば異なるエディションであっても問題なく使用することができます。 環境構築 では、実際に環境構築しプログラムを作成していきましょう。 今回は Windows 環境にRustをビルドできる環境を作成していきます。 まずは、以下のリンクからRustをダウンロードしインストールします。 www.rust-lang.org OSが32Bitか64Bitを確認しダウンロードしてください。 RustDLページ ダウンロードした rustup-init.exe を起動しインストールを開始します。 起動すると コマンドプロンプト が立ち上がり処理を続けるかを聞かれるため y と入力しEnterを押下します。 RustInstall確認 その後、インストール方法を聞かれますので、デフォルトの 1 と入力しEnterを押下します。 RustInstall項目 以下のように出力されれば、Rustのインストールは完了です。 RustInstall完了 続いてVisual C++ ビルドツールのインストールを行います。 以下より、 Build Tools for Visual Studio 2019 をダウンロードし実行してください。 visualstudio.microsoft.com インストールする項目で C++ Build Tools をチェックし、右下のインストールボタンを押下します。 VS Build Tools 2019 Install お疲れさまでした。 以上でRustの開発環境が整いました。 次節からプロジェクトを作成し、コードを書いてみましょう。 プロジェクトの作成とHello, World! まずはプロジェクトを作成します。 わかり易い場所に作業用のフォルダを作成してください。 その後、 コマンドプロンプト にて以下の例の様に、 cdコマンド を使用し作成したフォルダへ移動してください。 例 ) cd Desktop¥Rust¥Project 移動後、先程説明にも出てきたcargoを以下のように使用します。 cargo new test_rust コマンドを実行後、フォルダ内にtest_rustフォルダが作成されます。 ではそのまま実行してみましょう。 cd test_rust cargo run 実際に実行すると、以下のような結果となり Hello, World! と表示されます。 Rust実行 Rustではプロジェクトを作成した段階で Hello,World! をすることができます。 ではコードの中身を見ていきましょう。 メインコードは test_rust¥src¥main.rs に記述されています。 中身は以下のようになっています。 fn main () { println! ( "Hello, world!" ); } main関数が記述され、関数内で println! メソッドが呼ばれ、その中身が表示されていることが分かります。 ではもう少し本格的にプログラムを作成して見ましょう。 コーディング まずは簡単なRustのプログラムから作成しながら見ていきましょう。 以下プログラムではvalという変数を宣言し、数字の 1234 を格納及び、表示しています。 Rustは 型推論 により自動で変数の型を決めてくれます。 今回は自動で32bitのint型で宣言されますが、明示的に変数の後ろに :i32 と記述することも可能です。 println!内の "{}" にはそれ以降の引数の値が置き換えられ表示されます。 fn main () { let val = 1234 ; println! ( "{}" , val); } fn main () { // 明示的に型の指定もできる let val: i32 = 1234 ; println! ( "{}" , val); } また変数のデータ型以下のようになっています。 型 説明 i8 8bit 符号あり 整数 i16 16bit 符号あり 整数 i32 32bit 符号あり 整数 i64 64bit 符号あり 整数 u8 8bit 符号なし 整数 u16 16bit 符号なし 整数 u32 32bit 符号なし 整数 u64 64bit 符号なし 整数 f32 32bit 浮動少数点数 f64 64bit 浮動少数点数 bool 論理値 char 文字型 当たり前ではありますが、他の言語でもあるものは全て揃っています。 また、他にも文字列型や配列、タプルなども存在します。 では最後にfor文とif文の使用方法を見てみましょう。 以下プログラムは、1~9で偶数の値を表示するプログラムです。 for文:1~9の値を順にxに代入しループします。 if文:xを2で割ったあまりが0かどうかを判定することで偶数であるかを判定し画面表示しています。 fn main () { for x in 1 .. 10 { if x % 2 == 0 { print! ( "{} " , x); } } println! (); } 最後に 一般でも言われている通り、Rustは学習するには難しい言語だと感じましたが、それ以上に魅力もあることを知っていただけましたでしょうか。 また、私の印象としては、処理が高速な C言語 や C++ 寄りでプログラムのモダンな記法は Python やSwiftに似ていると思いました。また、Rustを学ぶ上で C言語 のポインタという概念を学習しておくと、理解しやすいのかなと感じました。ポインタは C言語 の関門とも言われているため、Rustは難しい言語と言われているのでは無いかと思います。(ポインタを理解すると、Rustは割りかしすんなりと理解できるかもしれません。) 今回はあまり突っ込んだプログラムの解説はできませんでしたが、また機会があれば続きを書きたいと思います。 ※冒頭画像のRustロゴは、 公式サイト で配布されているものを使用しております。  また、このロゴはRust財団によって CC-BY の下で配布されています。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは、インフラエンジニアのfro-rivです。 日々業務でたくさんのサーバに SSH 接続をしているわけですが、 ユーザ指定、公開鍵認証、ポート指定、ポート フォワ ーディングなどを管理できる ~/. ssh /config ファイルについて深掘りしてみました。 日頃から多くのサーバに接続をしており、 様々なオプションを付ける+覚える必要があって億劫な思いをしている人には役に立つのではないかと思いますので、 ぜひ目を通してみてください。 ~/.ssh/configってなに? configファイルを書くことで何が楽になるのか configファイルを作ってみよう 準備 パラメータ一覧 パターン別サンプルファイル パターン1:SSH接続するサーバ全体に対してホスト鍵認証でエラーが出ないようにする パターン2:接続先のユーザ名・ポートが違う場合 パターン3:ポートフォワーディングする 最後に 参考文献 ~/. ssh /configってなに? ~/. ssh /config ファイルとは、 SSH クライアント用の設定ファイルです。 このファイルに ホスト名(または IPアドレス ) 、 ユーザ名 、 SSH 接続時のオプション などを記入でき、 configファイルに記載しておくことで SSH 接続を行う際は上記の情報を省略することができます。 configファイルは各ユーザのホーム ディレクト リ配下の .ssh ディレクト リで管理します。 configファイルを書くことで何が楽になるのか 例えば、下の図のような感じで クライアントのrootユーザ から リモートサーバのtestuserに1022番ポートへ公開鍵認証 で SSH 接続する場合 本来は、 ## l→ユーザ名 p→ポート番号 i→クライアントの秘密鍵 ssh ${ホスト名 or IP} -l testuser -p 1022 -i ~/.ssh/id_rsa とコマンド入力しなければなりません。この1台だけならいいですが、これを何台分も覚えるのは... 上の設定を ~/. ssh /config に設定を記述すると、この記述のみで SSH 接続できます↓↓↓ ## "server"の部分は分かりやすい名前に変更可能 ssh server ちなみに、 ~/. ssh /config の記述はこんな感じ ## Host で指定した server という文字でSSH接続できる Host server Hostname ${接続先サーバのホスト名 or IP} User testuser Port 1022 IdentityFile ~/.ssh/id_rsa configファイルを作ってみよう 準備 下をコピペしてください。 ファイルの作成としてはこれで完了です。 次の章でパラメータについて紹介します。 # ユーザのホームディレクトリへ移動 cd ~ # ~/.sshディレクトリを作成(公開鍵認証をしている場合はすでに存在するはず) # ~/.sshディレクトリの権限は700にしておいてください mkdir -p -m 700 .ssh # configファイルを作成(権限はデフォルト644の状態でOK) touch config パラメータ一覧 以下に、よく使用するパラメータを表にまとめました。 下に行くにつれて使用頻度は低くなります。 パラメータ 説明 Host ホスト名 (接続時に使用する名前) Hostname ホスト名 or IPアドレス User ユーザ名 Port ポート (デフォルト: 22) IdentityFile クライアントの 秘密鍵 (デフォルト: ~/. ssh /id_ rsa ) StrictHostKeyChecking サーバのホスト認証鍵を. ssh /known_hostsに追加するか yes, no, ask (デフォルト: ask) no にしておけばfinger printが変わっても SSH 接続をはじかれない UserKnownHostsFile known_hostsファイル (デフォルト: ~/. ssh /known_hosts) ProxyCommand ポート フォワ ードする場合などに使用 使用例: ssh -W %h:%p ${踏み台ホスト名} ※%hは接続ホスト名, %pはポート ConnectionAttempts 接続試行回数 (デフォルト: 1) TCPKeepAlive サーバとの接続を保持 (デフォルト: yes) ServerAliveInterval 何秒間サーバの応答がなければ接続を閉じるか LogLevel ログの出力レベル (以下、右がより詳細) QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2 もっと詳しい設定まで確認したい場合は、日本語版のmanをご覧ください。 ssh_config(5) manページ パターン別サンプルファイル 3パターンの ~/. ssh /config サンプルファイルを用意しましたので、参考にしてみてください。 パターン1: SSH 接続するサーバ全体に対してホスト鍵認証でエラーが出ないようにする 過去に存在していた SSH 接続経験のある IPアドレス やホスト名でサーバを構築しなおした場合、 以下のようなエラーが表示されることがあります。 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. Please contact your system administrator. Add correct host key in /root/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /root/.ssh/known_hosts:XX ECDSA host key for [XXX.XXX.XXX.XXX]:1022 has changed and you have requested strict checking. Host key verification failed. これを回避するために、以下の設定を ~/. ssh /config に追記します。 Hostを "*( アスタリスク )" とすることで全ての SSH 接続に適用されます。 ### UserKnownHostsFile→何らかの拍子にフィンガープリントが変わっても接続がはじかれないようにする ### StrictHostKeyChecking→初回のログイン時も接続の可否を聞かれないようにする Host * StrictHostKeyChecking no UserKnownHostsFile=/dev/null 上記の設定を行うことで、 SSH 接続がホスト鍵認証の段階ではじかれることはなくなります。 新しいサーバに SSH 接続する機会が多い場合、おすすめの設定です。 ※但し、この設定は社内や家庭内などのLAN環境で使用することをお勧めします。  本来、なりすましを防ぐためのチェックのため、インターネットからアクセス可能なサーバには設定しない方がセキュリティ的に安全です。 パターン2:接続先のユーザ名・ポートが違う場合 最初の方の説明でも記載しましたが、以下のような場合です。 root@client.local から testuser@server.local:1022 に接続する場合(公開鍵認証設定済み) ## server という文字でSSH接続する想定 ## IdentityFileはデフォルトで`~/.ssh/id_rsa`なので省略可 Host server Hostname server.local User testuser Port 1022 IdentityFile ~/.ssh/id_rsa この設定をすることで # ssh server とコマンド入力するだけで testuer@server.local:1022 に接続できてしまいます。 パターン3:ポート フォワ ーディングする 先ほどのパターン2で紹介した server.local を中継させて、下の図の様に root@server2.local:22 に SSH 接続をしたいと思います。 ( testuser@server.local の公開鍵は root@server2.local:~/.ssh/authorized_keys に登録済み) ## server.localには server という文字でSSH接続する ## IdentityFileはデフォルトで`~/.ssh/id_rsa`なので省略可 Host server Hostname server.local User testuser Port 1022 IdentityFile ~/.ssh/id_rsa ## server2.localには server2 という文字でSSH接続する ## ProxyCommandオプションにて中継サーバを指定 Host server2 Hostname server2.local User root Port 22 ProxyCommand ssh -W %h:%p server IdentityFile ~/.ssh/id_rsa この設定を追記することで # ssh server2 とコマンド入力するだけで root@server2.local:22 に接続できます。 本来は、 # ssh -o ProxyCommand='ssh -W %h:%p testuser@server.local -p 1022' root@server2.local または # ssh root@172.20.100.137 -L 1022:testuser@172.20.100.128:22 といったように、長々とコマンドを打たなければなりませんが、そんな手間を ~/. ssh /config は解決してくれます。 更に、 scp コマンドでファイル転送をしないといけない場合も大活躍で、 root@client.local と root@server2.local 間でファイル転送を行う場合も scp server2:/tmp/test.file ./ scp ./test.file server2:/tmp/ と表記するだけでOKです。 最後に ~/.ssh/config ファイルを使用して、 SSH 接続を楽にするということでパラメータやパターン別の サンプルファイルを紹介させていただきました。 特に、サーバで SSHD の待ち受けポートを22番以外に設定しているサーバや、 ポート フォワ ーディングが必要なサーバの場合はconfigファイルが役に立つのではないかと思います。 また、 SSH 接続は勿論ですが、個人的にはポート フォワ ーディングしているサーバからSCPでファイル転送を行う際に 一番力を発揮してるなと感じました。 今回はconfigファイルでよく使用する頻度の高いパラメータを中心に紹介しましたが、 気になる方は下の参考文献で紹介しているmanページも確認してみてください。 というわけで、~/. ssh /configファイルで SSH 接続を楽にする方法の紹介でした。 参考文献 ~/. ssh /configについて - Qiita: https://qiita.com/passol78/items/2ad123e39efeb1a5286b . ssh /configファイルで SSH 接続を管理する https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1 ssh を config ファイルで管理して快適にする - WhiteNote https://s10i.me/whitenote/post/42 ssh _config(5) manページ https://nxmnpg.lemoda.net/ja/5/ssh_config ssh (1) - Linux man page https://linux.die.net/man/1/ssh エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは。技術広報の syoneshin です。 今回は当社イベントの中でも人気の高い 『エンジニアの勉強法ハックLT』 でLT発表された資料を、まとめてご紹介します。 ※各イベント詳細は以下 エンジニアの勉強法ハックLT- vol.1 エンジニアの勉強法ハックLT- vol.2 エンジニアの勉強法ハックLT- vol.3 エンジニアの勉強法ハックLT- vol.4 【目次】 日常生活の中にこそエンジニアの勉強はある! 知識を使って知識を増やす投資的勉強法 オンラインでもモブプログラミングを勉強法に取り入れてみる 自分の学習を Output して学習効率を高速にあげる 技術書へのアクセスを劇的に向上させた話 ゲームで学ぶマネジメント 私にとっての学び 面倒臭がりでもキャッチアップしたい- RE:Bot から始めるものぐさ生活 - 3日坊主でも勉強したい 自己学習を支える Inoreader + Notion 1日18時間 勉強する技術 やる気が出ない、そんなとき テスト、テスト、テスト! 振り返りを取り入れ、改善を楽しもう ドラゴン桜から学んだ勉強法 どっちがいいの?本で学ぶ vs Webで学ぶ KPTの空回りを防ぐ! エンジニアリングチーム 立ち上げの取り組み 勉強苦手人間の勉強法 自身の役割/フェーズによって、 効果的な学習法は変わるという話 YouTubeにハマっている若者の勉強法 詰まったときのPEIAサイクル 試行錯誤の勉強法 「〇〇完全に理解したったww」から始めるエンジニア生活 いちばん苦痛だったプログラミング研修を新人研修いちばんの思い出にした話 スキルが浅い中転職活動中にしてきたこと 日常生活の中にこそエンジニアの勉強はある! 発表者: 白栁隆司@エンジニアカウンセラー さん speakerdeck.com 知識を使って知識を増やす投資的勉強法 発表者: UT@TechnicalDonor さん qiita.com オンラインでもモブプログラミングを勉強法に取り入れてみる 発表者: YAMAKAWA, Hiroto さん speakerdeck.com 自分の学習を Output して学習効率を高速にあげる 発表者: @nappa_bebeji さん speakerdeck.com 技術書へのアクセスを劇的に向上させた話 発表者: 写真屋? LTの売人 さん speakerdeck.com ゲームで学ぶマネジメント 発表者: 白栁隆司@エンジニアカウンセラー さん speakerdeck.com 私にとっての学び 発表者: ariaki さん docs.google.com 面倒臭がりでもキャッチアップしたい- RE: Bot から始めるものぐさ生活 - 発表者: MINORU さん 面倒臭がりでもキャッチアップしたい- RE:Bot から始めるものぐさ生活 - from MinoruIto3 www.slideshare.net 3日坊主でも勉強したい 発表者: 脱脂綿/だっしー さん speakerdeck.com 自己学習を支える Inoreader + Notion 発表者: Logy(ロージー) さん speakerdeck.com 1日18時間 勉強する技術 発表者: @chooyan_i18n さん docs.google.com やる気が出ない、そんなとき 発表者: @TSawarabi さん https://speakerdeck.com/sawarabi/studyhacklt-yaruqi-gachu-nai-sonnatoki speakerdeck.com テスト、テスト、テスト! 発表者: @tomokon_0314 さん docs.google.com 振り返りを取り入れ、改善を楽しもう 発表者: @omokawa_yasu さん speakerdeck.com ドラゴン桜 から学んだ勉強法 発表者: @buntafujikawa さん speakerdeck.com どっちがいいの?本で学ぶ vs Webで学ぶ 発表者: 白栁隆司@エンジニアカウンセラー さん speakerdeck.com KPT の空回りを防ぐ! エンジニアリングチーム 立ち上げの取り組み 発表者: @shu038fw さん speakerdeck.com 勉強苦手人間の勉強法 発表者: @nana_csx さん speakerdeck.com 自身の役割/フェーズによって、 効果的な学習法は変わるという話 発表者: @ryu_f_web さん speakerdeck.com YouTube にハマっている若者の勉強法 発表者: @_4geru さん speakerdeck.com 詰まったときのPEIAサイクル 発表者: @d_murakami_0816 さん speakerdeck.com   以降はスピンオフ企画 『 駆け出しエンジニアの勉強法LT会 』 での LT発表資料になります。 試行錯誤の勉強法 発表者: @M_Yamashii さん speakerdeck.com 「〇〇完全に理解したったww」から始めるエンジニア生活 発表者: @ryusa_eng さん speakerdeck.com いちばん苦痛だったプログラミング研修を新人研修いちばんの思い出にした話 発表者: Masuda.S さん speakerdeck.com スキルが浅い中転職活動中にしてきたこと 発表者: @Y0u281 さん speakerdeck.com 以上いかがだったでしょうか? 本記事でご紹介の「エンジニアの勉強法」が皆さまの情報探索の一助となれば幸いです。 よろしければ、当社エンジニアがおすすめする勉強法もご覧ください。 tech-blog.rakus.co.jp また、ゲームや YouTube を利用した勉強ができる環境も整いつつあります。 詳しく知りたい方は以下の記事も ご覧ください。 tech-blog.rakus.co.jp tech-blog.rakus.co.jp 今後も 『エンジニアの勉強法ハックLT』 を定期開催しますので、勉強法を学びたい方・共有したい方は以下Connpassページから ラク ス主催イベントをチェックいただき、ぜひご参加下さい! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
はじめに 初めまして、tomo37kunです。 業務に携わる中でCI/CDの存在を意識することが多くなったので、CI/CDについて正しい知識と理解を得られるように学習を行いました。また、近年、自動化の重要性の高まりや アジャイル 開発の浸透進化といった背景から、実際にCI/CDに対する需要は急速に高まっています。 本記事のCI/CDの学習内容のアウトプットにより、CI/CDについて全く知識がない人でも体系的に理解できる足掛かりになれば幸いです。 はじめに CI/CDとは CI CD つまりCI/CDとは CI/CDのタイプ オンプレミス型 クラウド型 CI/CDが注目されるようになった理由 自動化テストの重要性の高まり アジャイル開発の浸透と進化 自動化できるタスク テスト実行の自動化 リリースの自動化 その他の作業の自動化 CI CD デプロイの自動化によるメリット リスクマネージメント フィードバックを素早く得る まとめ 参考資料 CI/CDとは まずはそれぞれの単語の意味からです。 CI CIとは「Continuous Integration」の略で、「 継続的インテグレーション 」と訳されています。 「インテグレーション」には「統合」の意味があります。 ソフトウェア開発の場合、「統合」の対象は一連の作業(各種作業やテストなど)です。 これでソフトウェアの動作を「継続的」に確認でき、より正確により迅速に開発を進めることが可能になります。 CD CD とは「Continuous Delivery」の略で、「継続的デリバリー」と訳されています。 一般的に「デリバリー」とは何かを届けることですが、この場合は「配信」や「公開」の意味で使われています。 「配信」するものは、開発テスト中のソフトウェア自体です。 なお「Delivery」と同じ頭文字で「Deployment」という用語も、「Continuous Deployment」(継続的デプロイメント)として使われています。 一般的に「デプロイメント」とは「配置」することですが、この場合は何らかのサービスを利用者が使える状態にすることです。 つまりCI/CDとは CI/CDは1つの技術を表すものではありません。 作業から 継続的インテグレーション (CI)および継続的デリバリー・デプロイ(CD)までを、自動化しておくことで、より効率良く迅速で、継続的に実施できるソフトウェア開発の手法のことです。 CI/CDを取り入れることで、バグを素早く発見することができたり、変更を自動でリリースすることができるようになります。 CI/CDのタイプ CI/CDには大きく分けてオンプレミス型と クラウド 型があります。 オンプレミス型としてはJenkins、 クラウド 型としては Travis CIやCircleCIなどが有名です。 オンプレミス型は一般的に拡張性が高い一方、自分たちで構築・運用する管理コストが発生します。 クラウド 型は拡張性が低いですが、サーバーなどを自前で用意する必要がなく、すぐに使い始めることができるのが大きな魅力です。 オンプレミス型 Jenkins Concoures CI Drone( クラウド 型もあり) クラウド 型 Travis CI Circle CI Wercker Codeship AWS CodeBuild GCP Cloud Build クラウド 型のCI/CDサービスである「Circle CI」の無料枠には以下の特性があるため個人開発や試し使いには十分と言えるので興味を持たれた方は試してみるとよいでしょう。 1コンテナのみ(したがって、同時実行ジョブは1つのみ) 1か月あたり1000分のビルド時間まで リポジトリ 数の制限なし ユーザ数の制限なし CI/CDが注目されるようになった理由 CI/CDが注目されるようになった理由としては2つのことが挙げられます。 自動化テストの重要性の高まり アジャイル 開発の浸透と進化 自動化テストの重要性の高まり あらゆる作業がコンピュータに置き換わっている現在、ソフトウェアを使用していない企業や組織はほとんどいないと言っても過言ではないと思われます。 このソフトウェアの普及に伴って、求められる品質も必然的に高くなり、これまで手動で行われていたテストも自動化されるのは当然の流れといえます。 CI/CDを使うと、コードの変更が発生するたびに自動でテストが行われるので、テストの実行忘れや、環境依存のテストを失くすことによる品質向上が狙えます。 ここまでの説明だけだと、CI/CDサービスやCI/CDのツールが自動でテストを作成してくれるように思えるかもしれませんが、そういうわけではありません。 あくまで、実行するテストは自分たちで定義する必要があり、CI/CDは定義したテストを任意のタイミングで実行してくれるだけのものになります。 アジャイル 開発の浸透と進化 アジャイル 開発の浸透と進化もCI/CDの普及を推し進めました。 アジャイル 開発とは小さな変更を積み上げるように加えていくことで、プロダクトを少しずつ開発していく手法のことです。 この手法が実際の開発現場で有効なことが分かり、現在は多くのチームが アジャイル 開発をするようになっています。 アジャイル 開発で最も重要とされていることはスピードです。 より小さな粒度の変更をいかに早くテスト/リリースしてフィードバックを得るかが アジャイル 開発の成功の鍵となりますが、CI/CDを使うことがこれらの実現にマッチしているため、CI/CDの普及につながりました。 そして、近年 アジャイル 開発そのものも進化しています。 Dockerや Kubernetes のコンテナ技術と AWS や GCP などの クラウド 技術が進歩したおかげで、本番環境にコードをデプロイすることは驚くほど簡単になりました。 テストをパスした変更を常にリリースして、バグがあれば ロールバック を行う。 このような作業はもちろん手動でもできますが、CI/CDで自動化することでより効率的にできるようになります。 まとめると、CI/CDを使うとテスト自動化することで品質を高めるだけではなく、その後のリリース作業も自動化することで、より アジャイル な開発ができるようになるということです。 自動化できるタスク CI/CDの本質は自動化にあります。 今まで手動で行っていた作業を自動化することにより開発者は別のタスクに時間を割くことができるようになります。 ここではCI/CDによって自動化できる以下のものについて紹介します。  1. テスト実行の自動化  2. リリースの自動化  3. その他の作業の自動化 テスト実行の自動化 最近のCI/CDサービスやツールは GitHub などの VCS ( バージョン管理システム )サービスと連携しています。 そのため、開発者が変更を加えるたびに、CI/CDが自動でテストを実行してくれます。 また連携するCI/CD上ですべてのテストをパスしないと変更をメインのブランチにマージできないような機能もあります。 これを活用すればテストが失敗したとき、その変更点を作成した開発者に修正を強制できるので、プログラムにおいて、直したはずのバグが復活していたり、前はなかったはずのバグがあったり、実装したはずの機能がなくなっている状態が生まれることを防ぎやすくなります。 リリースの自動化 一般的にリリース作業は運用チームや開発者が手動で行うものだと思われます。 しかし、このリリースを自動化することにより、 工数 の削減だけでなく、ヒューマンエラーを失くすことも可能です。 リリースの自動化にはいくつかのステージがあり、実際のデプロイは手動で行うケースもあれば、CI/CDで一気にデプロイまでするケースもあります。 どちらのケースがいいかは組織やプロダクトの性質ごとに異なるため、一概には言えません。 しかし、デプロイの自動化を行うことで次のようメリットを受けられます。 バグの迅速な修正 リスクマネー ジメント(詳しくは後述) 変更に対するフィードバックを素早く得る(詳しくは後述) 継続的インティグレーションにより、ある変更がテストに通らなかった場合、その変更に問題があったことが瞬時に分かるようになります。 言い返せば、テストをすべてパスした変更はリリースしても安全だということが分かります。 この時注意したいのは、すべてのシナリオに対してテストがあるわけではないですし、仕様バグなどはCI/CDを使っても取り除くことはできません。 その他の作業の自動化 コードの コンパイル 、静的解析、依存関係のアップデートはもちろん、CI/CDを使うことで、さまざまなことを自動化できます。 最近のCI/CDサービスやツールはとても柔軟に作られているので、ほとんどの作業をCI/CD上で自動化できます。 ※ハードウェアに依存する作業などはCI/CDサービスによってはできない場合もあります。  そのため、自動化したいタスクを思いついたときは、まずCI/CDを使えないか検討してみるとよいと思われます。 CI/CDが走るタイミングは以下の通りです。 CI pull-request作成した時 pull-request作成以降にpushした時 定期実行時(cron) CD mergeした時 ブランチによってデプロイ先を変えられる(masterブランチへmergeされたら本番環境、developブランチへmergeされたら検証環境など) 定期実行時(cron) デプロイの自動化によるメリット リスクマネー ジメント 変更Aと変更Bを個別にリリースする場合とAとBの変更をまとめた変更Cをリリースする場合を考えます。 リリースによって問題が発覚した場合、AとBは別に作業を行っているため、「変更Aに問題はなく変更Bに問題があったので、Bのみ対応を行った」というようにそれぞれ個別に対応することが可能です。 一方、変更CはAとBのどちらに問題が潜んでいるかの切り分けが複雑になってしまう可能性ある他、変更範囲が大きいため ロールバック が容易にできない場合があります。 このように リスクマネー ジメントの観点ではAとBを別々にリリースするべきであることが賢明といえます。 CI/CDによる継続的デプロイはこの リスクマネー ジメントを可能とします。 継続的デプロイができるということは、変更の ロールバック も簡単にできるということであり、問題があった変更点を取り消して再度デプロイをすれば、 ロールバック したことになるからです。 上述の リスクマネー ジメントの考えに乗っ取ると重要なのは ロールバック できる単位を小さくすることであると言えます。 継続的デプロイを用いることでこの ロールバック できる単位を刻むことができるのです。 また、 ロールバック による保険があるため、開発者はより挑戦的にコードを書くことができ、開発者の仕事は劇的にやりやすくなることが見込めます。 デプロイの自動化によって変更の粒度を小さくしてバグのリスクを下げることができれば、バグを恐れる必要はありません。 フィードバックを素早く得る ユーザが本当に求めるプロダクトを効率的に開発するには  1. 実用最低限の機能を作る  2. リリースする  3. フィードバックを得る 上記のループを素早く繰り返すことが大切です。 ユーザにとって価値があるかどうかわからない時でも本番環境でテストすることにより、フィードバックを素早く得られます。 「本番環境でテスト」という言葉に身のすくむ思いを抱かれるかもしれませんが、検証段階で必要かどうかを議論するよりも、本番環境で1度リリースし、フィードバックを集めてしまったほうが効率的な場合もあります。 そして、万が一不要な変更だったとしても継続的デプロイにより簡単に ロールバック ができるのです。 そのため、継続デプロイを使うことで本番環境からより早くフィードバックを得ることができるようになるのです。 まとめ CI/CDを使うことでさまざまな作業を自動化できるだけではなく、デプロイと ロールバック を自動化することでより効率的なプロダクト開発ができるようになります。 また、人力で行うテストとは異なり、人間に起因するミスが起きず、品質が担保されるというメリットもあります。 品質を落とさずに、高速な開発、リリースというサイクルを回すためには必須と言えます。 記事の途中でも触れましたが クラウド 型のCI/CDサービスである「Circle CI」では無料枠があり、個人レベルの使用であれば十分に利用できるので、興味を持たれた方はお試しください。 参考資料 【図解】CI/CD とは?非エンジニアの方向けにわかりやすく解説します | カゴヤのサーバー研究室 CI/CDのエキスパートが解説:CI/CDとは何か? なぜ今、必要とされるのか? (1/3):CodeZine(コードジン) いまさらだけどCircleCIに入門したので分かりやすくまとめてみた - Qiita CI/CDとは | ニフクラ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 1. position: static の要素ではz-indexは効かない 2. 基本的にはHTMLの記述順に重なる 3. z-indexを指定した場合は数値の大きいものが上に重なる 4. 親子関係がある要素ではz-indexの数値に関係なく親の上に子が重なる 5. 親階層のz-indexの比較が優先して評価される おわりに はじめに こんにちは、フロントエンドチームの北嶋です。 今回は CSS 初学者がつまずきがちな、 z-index について書きたいと思います。 タイトルの「z-index:0とz-index:100ならどちらが上にくる?」の問いですが え、普通にz-index:100じゃないの?と思った方は残念ながら不正解です。 正解は「場合による」なんですよね。 CSS をしっかり勉強したことがある方なら簡単に分かるとは思いますが どのような場合にz-index:0が勝つのか どのような場合にz-index:100が勝つのか を正しく理解するために、z-index関連のルールを整理していきたいと思います。 1. position: static の要素ではz-indexは効かない 前提として position: static が指定されている要素では、z-indexは無効です。 position: static はデフォルトの値なので、z-indexを有効化するためには、 CSS で要素に position: static 以外を指定してあげる必要があります。 ※2以降で説明する要素には、すべて position: static 以外が指定されていることとします。 2. 基本的にはHTMLの記述順に重なる z-indexに数値の指定がなかった場合は、書いた順に要素は重なって行きます。 z-indexの数値が同じだった場合も、同様の挙動を示します。 See the Pen z-index_sample by hk-rks ( @hk-rks ) on CodePen . 3. z-indexを指定した場合は数値の大きいものが上に重なる こちらは直感的な動きですね。 z-index:100の方がz-index:0よりも数値が大きいので、z-index:100が上に重なってきます。 See the Pen z-index_sample_2 by hk-rks ( @hk-rks ) on CodePen . 4. 親子関係がある要素ではz-indexの数値に関係なく親の上に子が重なる 下のコードでは、z-index:100の親要素と、そこに属するz-index:50とz-index:10の子要素が二つあります。 まず、z-index:100の親要素が数値が一番大きいにも関わらず最も下に配置されていることが分かると思うのですが、これは要素同士に親子関係が形成されているからです。 用語としてはスタックコンテキストというのですが「親をベースとして階層が形成され、その上に子要素集合の階層が形成される」というイメージで理解してもらえればOKです。 子要素同士では同じ階層なので、z-index50がz-index:10よりも大きいので上に重なるという通常のz-indexの動作を示していますね。 See the Pen z-index_sample_1 by hk-rks ( @hk-rks ) on CodePen . 5. 親階層のz-indexの比較が優先して評価される 下のコードでは以下の要素があります。 z-index:100の親要素と、そこに属するz-index:10の子要素 z-index:0の親要素と、そこに属するz-index:20の子要素 注目すべきは、子要素同士ではz-index:10とz-index:20の二つの要素がありますが、z-index:10の方が上に来ている点です。 こちらもスタックコンテキストの考え方を適用すれば理解しやすいのです。 まず親要素同士ではz-index:100とz-index:0の二つの要素があって、z-index:100が上に来ていますね。 この親階層をベースとして、子要素が上に乗っているので z-index:100の上に乗っているz-index:10 z-index:0の上に乗っているz-index:20 では前者の方が上に重なるということになります。 つまり、親階層でのz-indexで負けていたら子要素の方でいくらz-indexを大きくしても上に重なることはできないということですね。 See the Pen WNRmQyr by hk-rks ( @hk-rks ) on CodePen . おわりに ここまで理解できれば、タイトルの問いの答えが「場合による」ことが分かってきたのではないでしょうか? 記事を書いていて、僕自身が初学者の頃にひらすらz-indexを大きくしていた時期が懐かしく思い出しました笑 更に理解を深めたい方は「スタックコンテキスト」で調べると詳しい情報がたくさん出てきますので、ぜひ参考にしてみて下さい。 それでは、ここまで読んでいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 技術広報のyayawowoです。 いつも ラク スのエンジニアブログのご購読、そしてエンジニアイベントへのご参加、ありがとうございます。 ラク スでは、現場最前線のエンジニア達から普段の活動や開発・運用で得た知見などの技術情報をお届けするイベント・・・ 『Meetup』 を年に数回開催しております。 そして、2021年度1発目となる今回のMeetupも大盛況に終わりましたので、その中身についてまとめさせていただきました! はじめに イベントテーマ概要 発表の紹介 Mail Dealerにおけるインフラ基盤の歴史と生産性向上について スモークE2Eテストで20年モノのシステムからバグを燻し出す方法 返したいけど返せない、大きな技術的負債を返すために おわりに イベントテーマ概要 今回は、世の中の多くのエンジニア組織が抱える 『技術的負債』 と、チームの力を最大化するための 『生産性向上』 をテーマとしております。 弊社エンジニアから、以下サービスに関わるこれまでの取り組みと今後の展望について、ご紹介させていただきました! メールディーラー 楽楽販売 発表の紹介 それではここから各発表内容と資料を共有させていただきます! Mail Dealerにおけるインフラ基盤の歴史と生産性向上について 初めに、Mail Dealerのインフラ担当である中井の発表です。 ラク スに入社した当時、Mail Dealerのサーバ台数は現在の半数程度の規模ながら、すべて物理サーバで運用していました。 サービス立ち上げ当初からの機器も手付かずな状態で、様々な問題が顕在化しており、抜本的な改善が急務でした。 それから9年が経過し、現在はオンプレ環境での『オール仮想化』を実現することで、クリアとなった問題もたくさんありますが、新たな課題も生まれています。 今回の発表では、Mail Dealerのインフラ基盤の歴史を振り返りながら、その変化の過程でどのようなポイントに着目して改善を行い、生産性向上に結び付けてきたかを、事例を踏まえてご紹介しました。 MD Infra history from motoharunakai www.slideshare.net スモークE2Eテストで20年モノのシステムからバグを燻し出す方法 次は、Mail Dealerの開発担当である桑原からのご紹介です。 Mail Dealerは約20年続く大きなシステムであり、画面数も機能数も多いため、思いもよらない箇所でバグが発生する恐れがあります。 そのため、品質には特に気を配る必要があります。 しかし品質は上げたい一方でどの組織でもあるように、新規開発に追われ、人と時間が足りない状況が常態化していました。 そんなMail Dealerでは高コストな自動テストではなく、「スモークE2E」という簡易的なE2Eテストを増産する取り組みを始めました。 限られたリソースの中でメンバーを巻き込みながら品質を担保する取り組みについてご紹介しました。 speakerdeck.com 返したいけど返せない、大きな技術的負債を返すために 最後は、リリース13年目となる息の長いサービスである楽楽販売を担当している水間の発表です。 サービスが続くのは嬉しいことですが、いわゆる技術的負債はどうしても蓄積して続けてしまいます。 楽楽販売でも長い間、返したいけど返せない負債がありましたが、その中の一部をついに返済する機会がありました。 一般的に、負債の蓄積は避けがたいものであり、 リファクタリング 等の機会も限られているかと思います。 その中でどう返済チャンスを作っていくべきか、今回の体験を振り返りさせていただきました。 speakerdeck.com おわりに 大規模な SaaS サービス開発と20年以上向き合っている ラク スだからこその発表はどうだったでしょうか。 ラク スの取り組みが、皆さまにとって新しい気づきや成長につながる機会となっていますと幸いです! 今後も ラク スMeetupでは日々のエンジニアの取り組みを発信してまいりますので、次回もぜひご参加いただけますと幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに こんにちは、matsutairaです。僕は普段 Atom という テキストエディタ を使用しており、実用的な プラグイン から面白い プラグイン など必要な プラグイン を入れて作業しています。個人的には、実用的な プラグイン より面白い プラグイン を使うのが好きですが、見つけるのも大変なので自分で プラグイン の作成ができないかと思い作成方法を調べてみました。今回は調べた内容を元に プラグイン の作成を行いたいと思います。 目次 はじめに Atomとは プラグインとは プラグイン作成 パッケージ生成 パッケージ構造 機能作成 おわりに Atom とは そもそも Atom とは、 GitHub が開発した オープンソース の テキストエディタ です。 メリット UIが直観的で使いやすい 無料公開の プラグイン が多数存在し、作業効率アップや息抜きになる プラグイン 同様多数のテーマがあり、カスタマイズ性が高い ショートカットが使いやすい デメリット 起動に多少時間がかかる 動作が重い場合がある とはいえ オープンソース であること、かつデメリットを補えるだけのメリットがあるため、使う価値のある テキストエディタ だと思います。使ったことが無い方はこの機会に是非使ってみてください。 atom.io プラグイン 作成 本題の プラグイン の作成に入ります。今回作成する プラグイン は「入力を検知し何かをする」をコンセプトに作成したいと思います。 パッケージ生成 Atom にはデフォルトでパッケージジェネレータというものが存在しており、 プラグイン の作成に必要なパッケージの雛形を自動で生成してくれます。 メニューバーの[パッケージ]から[パッケージ ジェネレータ]を選択します。まずは雛形を生成してみましょう。 ※コマンドパレット( Ctrl+Shift+P )から「Package Generator: Generate Package」でも生成できます。 保存する場所と名前を入力し[Enter]を押します。 今回は「erai- bot 」という名前で作成します。 生成が完了すると新規でウィンドウが立ち上がります。 たったこれだけで プラグイン の作成に必要な雛形を簡単に作ることができ、デフォルトでこの機能が入っているのはかなりありがたいです。 パッケージ構造 次はパッケージの構造を見てみましょう。 erai-bot ├ keymaps │ └ erai-bot.json ├ lib │ ├ erai-bot-view.js │ └ erai-bot.js ├ menus │ └ erai-bot.json ├ spec │ ├ erai-bot-spec.js │ └ erai-bot-view-spec.js ├ styles │ └ erai-bot.less ├ .gitignore ├ CHANGELOG.md ├ LICENSE.md ├ package.json └ README.md keymaps: キーバインド の定義 lib:機能の定義 menus:メニュー表示の定義 spec:テスト用フォルダ styles: css やlessによるスタイルの定義 package. json :packageの定義を記述 というような構造になっています。今回はkeymaps、libの2つのみを編集していきます。 ※自分で作成する プラグイン は、 C:/Users/~/github/erai-bot 配下に置かれ、同時に C:/Users/~/.atom/packages 配下(インストールした プラグイン が格納される場所)にショートカットが作成されます。 機能作成 それでは実際に機能を作成していきます。 まずは使える AtomAPI を確認しましょう。 数ある API の中から今回は TextEditor という API と NotificationManager を利用します。 NotificationManager:画面右上にメッセージを表示 TextEditor:文字入力検知や文字の自動入力、削除、セーブの検知が可能 この2つの API を基本に作成します。 まずは、生成したままの プラグイン を起動してみます。デフォルトでは Ctrl+Alt+O がショートカットになります。 このままでは、 プラグイン を起動/停止したときに毎回表示されてしまいますし、ON/OFF状態がわかりずらいので右上にメッセージを表示してみます。 以下のように erai-bot.js を編集します。 toggle() { atom.notifications.addInfo( 'ON/OFF' ); // ↓使用しないのでコメントアウトor削除 // console.log('EraiBot was toggled!'); // return ( // this.modalPanel.isVisible() ? // this.modalPanel.hide() : // this.modalPanel.show() // ); } atom .notifications.addInfoを使うことで画面右上にメッセージを表示できます。 nofiticationsの種類は、 * Success * Info * Worning * Error * FatalError の5種類あり、それぞれ種類によって色やアイコンが変わります。optionでアイコンを設定することも可能です。 編集した箇所の反映は Ctrl+S だけではできないので、保存とウィンドウをリロード Ctrl+Shift+F5 をします。 もう一度 プラグイン を起動させてみます。 画面右上にメッセージが表示されるようになりました。しかしこのままだと プラグイン の起動/停止をするごとにメッセージが表示されるので、まだ起動状態かがわかりません。さらに記述していきます。 toggle() { this .active = ! this .active; if ( this .active) { return this .disable(); } else { return this .enable(); } // atom.notifications.addInfo('ON/OFF'); } , enable() { atom.notifications.addInfo( 'えらい!bot起動' ); } , disable() { atom.notifications.addInfo( 'えらい!bot停止' ); } 新たにenable関数とdisable関数を追加しました。これにより プラグイン が起動している状態からは停止→disable関数呼び出し、 プラグイン が停止している状態からは起動→enable関数呼び出しに遷移することが可能となりました。 次は文字を入力するだけで褒められるようにします。 まず、activate関数部分を編集します。ここには プラグイン の読み込み時にロードされる内容を記述します。 activate(state) { this .eraiBotView = new EraiBotView(state.eraiBotViewState); this .modalPanel = atom.workspace.addModalPanel( { item: this .eraiBotView.getElement(), visible: false } ); // 入力検知用 this .editor = atom.workspace.getActiveTextEditor(); this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); // Events subscribed to in atom's system can be easily cleaned up with a CompositeDisposable this .subscriptions = new CompositeDisposable(); // Register command that toggles this view this .subscriptions.add(atom.commands.add( 'atom-workspace' , { 'erai-bot:toggle' : () => this .toggle() } )); } , 次は、enable関数とdisable関数を編集します。 enable() { // 起動時に有効化 this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); atom.notifications.addInfo( 'えらい!bot起動' ); } , disable() { // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } , 次は、onChange関数を作成します。 onChange(input) { atom.notifications.addInfo( '入力できてえらい!' ); } 入力するたびに「入力できてえらい!」と褒められるようになりました。 プラグイン の起動中はエディタ上に変化がある度にメッセージが表示されるので、EnterやSpaceの入力でも褒められます。 また、 onChange(input) { if (input.newText === " \n " ) { atom.notifications.addInfo( 'Enter押せてえらい!' ); } } のようにすることで、Enterの入力のみを検知することも可能です。 ただし、エディタ上へ入力したもののみ検知できるので、CtrlやShitfは検知できないので注意が必要です。 最後に保存するたびに褒められるようにします。 まず、activate関数部分を編集します。 activate(state) { this .eraiBotView = new EraiBotView(state.eraiBotViewState); this .modalPanel = atom.workspace.addModalPanel( { item: this .eraiBotView.getElement(), visible: false } ); // 入力検知用 this .editor = atom.workspace.getActiveTextEditor(); this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); // 保存検知用 this .editorSaveSubscription = this .editor.getBuffer().onDidSave( this .onSave.bind( this )); // Events subscribed to in atom's system can be easily cleaned up with a CompositeDisposable this .subscriptions = new CompositeDisposable(); // Register command that toggles this view this .subscriptions.add(atom.commands.add( 'atom-workspace' , { 'erai-bot:toggle' : () => this .toggle() } )); } , 次は、enable関数とdisable関数を編集します。 enable() { // 起動時に有効化 this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); this .editorSaveSubscription = this .editor.getBuffer().onDidSave( this .onSave.bind( this )); atom.notifications.addInfo( 'えらい!bot起動' ); } , disable() { // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); this .editorSaveSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } , 最後にonSave関数を作成します。 onSave() { atom.notifications.addSuccess( '保存できてえらい!' ); } プラグイン の起動中は保存をするたびに「保存できてえらい!」と褒められるようになりました。 最後にショートカットキーを変えます。変更は keymaps にある erai-bot.json を編集します。 { " atom-workspace ": { " ctrl-alt-q ": " erai-bot:toggle " } } これで Ctrl+Alt+Q で プラグイン の起動/停止ができるようになりました。 一通りの動作はこれで完了ですが、若干物足りないのでさらに機能を追加しましょう。 一定時間入力がない場合にメッセージを表示する設定を入れます。 var timeoutId; // 中略 onChange(input) { // タイマー停止 clearTimeout(timeoutId); atom.notifications.addInfo( '入力できてえらい!' ); this .startTimer(); } , // 中略 disable() { // タイマー停止 clearTimeout(timeoutId); // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); this .editorSaveSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } , // 中略 startTimer() { // 60秒後にメッセージを表示 timeoutId = setTimeout(() => { atom.notifications.addError( '休憩できてえらい!' ); } , 60000); } 某太陽神の名言を表示しつつ、 プラグイン の起動状態を強制的に維持する設定を入れます。 var count = 0; // 中略 disable() { if (count < 1) { // アクティブ状態に強制移行 this .active = ! this .active; count = count + 1; atom.notifications.addError( '諦めんなよ!' ); atom.notifications.addError( '諦めんなよ、お前!!' ); atom.notifications.addError( 'どうしてそこでやめるんだ、そこで!!' ); atom.notifications.addError( 'もう少し頑張ってみろよ!' ); atom.notifications.addError( 'ダメダメダメ!諦めたら!' ); atom.notifications.addError( '周りのこと思えよ、応援してる人たちのこと思ってみろって!' ); atom.notifications.addError( 'あともうちょっとのところなんだから!' ); atom.notifications.addError( '俺だってこのマイナス10度のところ、しじみがトゥルルって頑張ってんだよ!' ); atom.notifications.addError( 'ずっとやってみろ!必ず目標を達成できる!' ); atom.notifications.addError( 'だからこそNever Give Up!!' ); } else { // タイマー停止 clearTimeout(timeoutId); count = 0; // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); this .editorSaveSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } } , 何秒後にメッセージを表示するかとオン状態の維持回数をユーザが設定できるようにします。 config: { "TimeSetting" : { "type" : "integer" , "default" : 60, "description" : "最終入力時間から何秒経過後にコメントを表示するか" } , "CountSetting" : { "type" : "integer" , "default" : 1, "description" : "強制的に機能ON状態を継続する回数" } } , // 中略 disable() { if (count < (atom.config.get(`erai-bot.CountSetting`))) { // アクティブ状態に強制移行 this .active = ! this .active; count = count + 1; atom.notifications.addError( '諦めんなよ!' ); atom.notifications.addError( '諦めんなよ、お前!!' ); atom.notifications.addError( 'どうしてそこでやめるんだ、そこで!!' ); atom.notifications.addError( 'もう少し頑張ってみろよ!' ); atom.notifications.addError( 'ダメダメダメ!諦めたら!' ); atom.notifications.addError( '周りのこと思えよ、応援してる人たちのこと思ってみろって!' ); atom.notifications.addError( 'あともうちょっとのところなんだから!' ); atom.notifications.addError( '俺だってこのマイナス10度のところ、しじみがトゥルルって頑張ってんだよ!' ); atom.notifications.addError( 'ずっとやってみろ!必ず目標を達成できる!' ); atom.notifications.addError( 'だからこそNever Give Up!!' ); } else { // タイマー停止 clearTimeout(timeoutId); count = 0; // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); this .editorSaveSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } } , // 中略 startTimer() { // ユーザ設定から秒数を取得 var time = atom.config.get(`erai-bot.TimeSetting`); timeoutId = setTimeout(() => { atom.notifications.addWarning( '休憩できてえらい!' ); } , time * 1000); } 以上で プラグイン は完成です。 プラグイン のコードは以下に記載しますので、気になった方はこちらを参考に プラグイン の作成に役立ててみてください。 'use babel' ; import EraiBotView from './erai-bot-view' ; import { CompositeDisposable } from 'atom' ; // グローバル変数 var timeoutId; var count = 0; export default { // ユーザ設定用 config: { "TimeSetting" : { "type" : "integer" , "default" : 60, "description" : "最終入力時間から何秒経過後にコメントを表示するか" } , "CountSetting" : { "type" : "integer" , "default" : 1, "description" : "強制的に機能ON状態を継続する回数" } } , eraiBotView: null , modalPanel: null , subscriptions: null , activate(state) { this .eraiBotView = new EraiBotView(state.eraiBotViewState); this .modalPanel = atom.workspace.addModalPanel( { item: this .eraiBotView.getElement(), visible: false } ); // 入力検知用 this .editor = atom.workspace.getActiveTextEditor(); this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); // 保存検知用 this .editorSaveSubscription = this .editor.getBuffer().onDidSave( this .onSave.bind( this )); // Events subscribed to in atom's system can be easily cleaned up with a CompositeDisposable this .subscriptions = new CompositeDisposable(); // Register command that toggles this view this .subscriptions.add(atom.commands.add( 'atom-workspace' , { 'erai-bot:toggle' : () => this .toggle() } )); } , deactivate() { this .modalPanel.destroy(); this .subscriptions.dispose(); this .eraiBotView.destroy(); } , serialize() { return { eraiBotViewState: this .eraiBotView.serialize() } ; } , toggle() { this .active = ! this .active; if ( this .active) { return this .disable(); } else { return this .enable(); } } , enable() { // 起動時に有効化 this .editorChangeSubscription = this .editor.getBuffer().onDidChange( this .onChange.bind( this )); this .editorSaveSubscription = this .editor.getBuffer().onDidSave( this .onSave.bind( this )); atom.notifications.addInfo( 'えらい!bot起動' ); } , disable() { if (count < (atom.config.get(`erai-bot.CountSetting`))) { // アクティブ状態に強制移行 this .active = ! this .active; count = count + 1; atom.notifications.addError( '諦めんなよ!' ); atom.notifications.addError( '諦めんなよ、お前!!' ); atom.notifications.addError( 'どうしてそこでやめるんだ、そこで!!' ); atom.notifications.addError( 'もう少し頑張ってみろよ!' ); atom.notifications.addError( 'ダメダメダメ!諦めたら!' ); atom.notifications.addError( '周りのこと思えよ、応援してる人たちのこと思ってみろって!' ); atom.notifications.addError( 'あともうちょっとのところなんだから!' ); atom.notifications.addError( '俺だってこのマイナス10度のところ、しじみがトゥルルって頑張ってんだよ!' ); atom.notifications.addError( 'ずっとやってみろ!必ず目標を達成できる!' ); atom.notifications.addError( 'だからこそNever Give Up!!' ); } else { // タイマー停止 clearTimeout(timeoutId); count = 0; // disposeで入力検知を停止 this .editorChangeSubscription.dispose(); this .editorSaveSubscription.dispose(); atom.notifications.addInfo( 'えらい!bot停止' ); } } , onChange(input) { // タイマー停止 clearTimeout(timeoutId); atom.notifications.addInfo( '入力できてえらい!' ); // タイマー開始 this .startTimer(); } , onSave() { atom.notifications.addSuccess( '保存できてえらい!' ); } , startTimer() { // ユーザ設定から秒数を取得 var time = atom.config.get(`erai-bot.TimeSetting`); // タイマーのIDを取得しつつタイマー開始 timeoutId = setTimeout(() => { atom.notifications.addWarning( '休憩できてえらい!' ); } , time * 1000); } } ; おわりに プラグイン の作成はそこまで難しいことはなく、 JavaScript の知識さえあれば簡単に作成できました。僕自身 JavaScript の知識はほぼ皆無なので、この程度の プラグイン しか作成できませんでしたが、少しの知識でも プラグイン を作成することができました。個人的には、アニメーションや音等が出るような面白い プラグイン を作成したかったですが、できることはできたかなと思います。 プラグイン の作成自体、試行錯誤を重ねながらだったため、新鮮で勉強にもなりました。より勉強を重ねて自分の納得する プラグイン を作成できればと思います。 皆さんも Atom で自分だけのオリジナル プラグイン を作成してみてはいかがでしょうか。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 技術広報のyayawowoです。 皆さんは、業務中に Excel (エクセル)を利用される機会が多いのではないでしょうか。 Excel (エクセル)には便利な関数がとても多くあります。 今回は、 Excel 初心者向けにビジネスシーンで多く利用されている Excel (エクセル)の中でも、 IF関数 に特化し、使い方をまとめました。 基本的な使い方となりますので、 Excel (エクセル)初心者の方だけでなく、復習をしたい方のご参考になれば幸いです。 はじめに Excel(エクセル)のIF関数とは Excel(エクセル)のIF関数 - 使い方(入門編)- 例題 実践 IF関数と論理式 Excel(エクセル)のIF関数 - 使い方(応用編)- IF関数と複数条件 例題 実践 Excel(エクセル)のIF関数とAND関数・OR関数 IF関数とAND関数 例題 実践 IF関数とOR関数 例題 実践 IF関数と空白(空欄) 例題 実践 IF関数とVLOOKUP関数 例題 実践 まとめ Excel (エクセル)のIF関数とは まず初めに、 Excel (エクセル)のIF関数とはどのようなことができるでしょうか。 簡単にいいますと… IF関数とは 「設定した条件によって、指定された値を返す関数」 のこと Excel (エクセル)のIF関数について、数式を利用した簡単な解説は以下のようになります。 = IF( ① ●●が▲▲だったら【条件】 , ② 設定した値を表示【条件一致】, ③ 設定した値を表示【条件不一致】 ) ①:条件を指定する ②:条件に一致する場合、表示したい値を指定 ③:条件に一致しない場合、表示したい値を指定 では、イメージがついたところでIF関数の使い方に入っていきます。 まずは、入門編からです。 Excel (エクセル)のIF関数 - 使い方(入門編)- 入場料の計算を例題にしていきたいと思います。 例題 入場料が以下条件の動物園があります。 20歳未満の入場料:1,000円 20歳以上の入場料:2,000円 ある旅行会社では、動物園の入場料をまとめるために名簿を作成しました。 各々の入場料がいくらになるか Excel (エクセル)の IF関数 を活用して算出してみましょう! 赤枠箇所の条件を、 以下の通りにすれば良いことがわかります。 = IF( ① 年齢が20歳以上だったら【条件】 , ② 2,000円を表示【条件一致】, ③ 1,000円を表示【条件不一致】 ) この式を使って、 Excel (エクセル)のIF関数の使い方を解説します。 実践 1. 設定した条件に合わせて、 Excel (エクセル)で表を作成します。 2.、 Excel (エクセル)で 作成した表のセルに式を入力します。 D6 に =IF( と入力 Excel (エクセル)が自動で候補の関数を =IF(論理式,[真の場合],[偽の場合]) に式を入力 論理式・・・【条件】 年齢が20歳以上だったら: C6>=20 年齢: C6 20歳以上: >=20 真の場合・・・【条件一致】 2,000円を表示: $C$3 2,000円を手入力しても良いが、汎用的に利用したいため C3 を指定する オートフィルでコピーをした際、セルがずれないように絶対参照 $ で固定する 偽の場合・・【条件不一致】 1,000円を表示: $C$2 1,000円を手入力しても良いが、汎用的に利用したいため C2 を指定する オートフィルでコピーをした際、セルがずれないように絶対参照 $ で固定する ◆式: =IF(C6>=20,$C$3,$C$2) が完成◆ 3. オートフィル 1 で式をコピーします。 D6 に入力した式を D7 、 D8 にもコピーしたいですよね。 そのようなときにオートフィルを利用します。 D6 セルの右下にカーソルをあてる 十字(+)のようなマークがでましたら、クリックしたまま下に引っ張る D7 、 D8 に式がコピーされ、条件通りの値が表示される 20歳以上である ラク ス花子さんと花見 ラク 子さんの入場料が「2,000円」であることがわかります。 Excel (エクセル)のIF関数は覚えてしまえばとても便利な機能です。 様々な場面で活用できるよう、この機会にしっかりと覚えてしまうことをお勧めします。 IF関数と論理式 Excel (エクセル)のIF関数で入力する論理式ですが、 「どのような式にすればいいの?」 「この条件の時、記号は何を使えば・・・」 と、迷われる方もいるかと思います。 以下の通り、少し簡単にまとめましたので、ご参考いただけますと幸いです。 条件 式 C6>20 C6データ(年齢)が20歳より大きい C6>=20 C6データ(年齢)が20歳以上 C6<20 C6データ(年齢)が20歳より小さい(未満) C6<=20 C6データ(年齢)が20歳以下 C6=20 C6データ(年齢)が20歳と等しい(同じ) C6<>20 C6データが20歳と等しくない(異なる) Excel (エクセル)のIF関数 - 使い方(応用編)- Excel (エクセル)のIF関数は、複数の条件を組み合わせて利用することも可能です。 ここからは応用的な使い方について解説をしていきたいと思います。 IF関数と複数条件 応用編では、入門編で扱った例題を再度利用します。 例題 以下の通り入場料の条件を変更しました。 入門編では、「20歳以上」という1つの条件で事足りましたが、そこに以下のような「20歳以上40歳未満」と「40歳以上」の条件が加わった場合はどのようにIF関数の式を作成すれば良いでしょうか。 20歳以上の入場料:1,000円 20歳以上40歳未満の入場料:2,000円 40歳以上の入場料:1,500円 では、複数条件を使った Excel (エクセル)のIF関数について説明していきます。 実践 1. Excel (エクセル)で作成した表のセルに式を入力します。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 20歳未満だったら: C7<20 真の場合・・・【条件一致】 1,000円を表示: $C$ 偽の場合・・【条件不一致】 次の条件:IF関数を追加・・・ (IF(論理式,[真の場合],[偽の場合])) 論理式・・・【条件】 40歳以上だったら: C7>=40 真の場合・・・【条件一致】 1,500円を表示: $C$4 偽の場合・・【条件不一致】 2,000円を表示: $C$3 ◆式: =IF(C7<20,$C$2,IF(C7>=40,$C$4,$C$3)) が完成◆ 2. オートフィルで式をコピーします。 D7 の式をオートフィルを利用して D8~D10 にコピーします。 D7 セルの右下にカーソルをあてる 十字(+)のようなマークがでましたら、クリックしたまま下に引っ張る D8 、 D9 、 D10 に式がコピーされ、条件通りの値が表示される 45歳である楽楽次郎さんの入場料が1,500円であることがわかります。 また、25歳の ラク ス花子さんと20歳の花見 ラク 子さんの入場料は2,000円と正しく算出できています。 このように、条件が複数となった場合でも、 Excel (エクセル)のIF関数を利用して簡単に計算することができますね! Excel (エクセル)のIF関数とAND関数・OR関数 Excel (エクセル)のIF関数ではさらに、より複雑な処理ができます。 次はIF関数と「AND関数(かつ)」と「OR関数(または)」の使い方について説明します。 IF関数とAND関数 例題 以下条件の試験を例題にAND関数の使い方を説明します。 80歳以上:合格 80歳未満:不合格 実践 1. Excel (エクセル)で作成した表のセルに式を入力します。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 午前試験が80点以上かつ、午後試験が80点以上だったら: (C6>=80,D6>=80) 真の場合・・・【条件一致】 合格を表示: $C$2 偽の場合・・【条件不一致】 不合格を表示: $C$3 ◆式: `IF(AND(C6>=80,D6>=80),$C$2,$C$3) が完成◆ 2. オートフィルで式をコピーします。 E6 の式をオートフィルを利用して E7~E9 にコピーします。 E6 セルの右下にカーソルをあてる 十字(+)のようなマークがでましたら、クリックしたまま下に引っ張る E7 、 E8 、 E9 に式がコピーされ、条件通りの値が表示される 今回用意した例題は、「午前試験が80点以上かつ(AND)、午後試験が80点以上」の人だけが合格となります。 表から読み解く通り、合格者は ラク ス太郎さんだけであることがわかります。 合否判定も正しくされていますね。 IF関数とOR関数 例題 次は、以下条件の試験を例題に、OR関数の使い方を説明します。 80歳以上:合格 80歳未満:不合格 実践 1. Excel (エクセル)で作成した表のセルに式を入力します。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 午前試験が80点以上または、午後試験が80点以上だったら: OR(C6>=80,D6,>=80) 真の場合・・・【条件一致】 合格を表示: $C$2 偽の場合・・【条件不一致】 そうでなければ、不合格を表示: $C$3 ◆式: =IF(OR(C6>=80,D6>=80),$C$2,$C$3) が完成◆ 2. オートフィルで式をコピーします。 E6 の式をオートフィルを利用して E7~E9 にコピーします。 E6 セルの右下にカーソルをあてる 十字(+)のようなマークがでましたら、クリックしたまま下に引っ張る E7 、 E8 、 E9 に式がコピーされ、条件通りの値が表示される OR関数の例題は、「午前試験が80点以上または、午後試験が80点以上」の人だけが合格となります。 午前・午後試験の両方とも80点以上がないのは楽楽次郎さんだけですので、IF関数の式が間違っていないことが確認できました。 IF関数と空白(空欄) 例題 例題としてあげていた合否判定ですが、もし合格の人だけを知りたい試験があったとします。 受験者が少ない試験でしたら、今まで通り合格・不合格の表示をしても良いと思うのですが、人数が多い場合はどうでしょうか。 以下のように表示してしまうと少し見にくくなりますよね。 Excel (エクセル)のIF関数では、空白(空欄)を指定することもできますので、次はその説明をしたいと思います。 実践 1. Excel (エクセル)で作成した表のセルに式を入力します。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 点数が80点以上だったら: C6>=80 真の場合・・・【条件一致】 合格を表示: $C$2 偽の場合・・【条件不一致】 空白(空欄)を表示: "" ◆式: =IF(C6>=80,$C$2,"") が完成◆ 2. オートフィルで式をコピーします。 D6 の式をオートフィルを利用して D7~D16 にコピーします。 D6 セルの右下にカーソルをあてる 十字(+)のようなマークがでましたら、クリックしたまま下に引っ張る D7~D16 に式がコピーされ、条件通りの値が表示される どうでしょうか。 合格の人だけをすぐに見つけられる表になりました。 このように、IF関数で空白(空欄)を表示する式を作ることができます。 ちなみにですが、以下の通り論理式に空白(空欄)を指定することもできます。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 点数が空白(空欄)だったら: C6="" 真の場合・・・【条件一致】 不合格を表示: $C$3* 偽の場合・・【条件不一致】 合格を表示: $C$2 ◆式: =IF(C6="",$C$3,$C$2)</span></b> が完成◆ IF関数とVLOOKUP関数 最後は Excel (エクセル)のIF関数とVLOOKUP関数を組み合わせた応用的な使い方を説明します。 まず、VLOOKUP関数を初めて聞く方もいるかと思いますので、簡単にまとめると以下になります。 今回は Excel (エクセル)のIF関数についての説明を中心にしていますので、VLOOKUP関数の使い方は別でご確認いただけますと幸いです。 = VLOOKUP( ① 検索したい値を設定【検索値】 , ② 検索する範囲を設定【範囲】, ③ 設定した範囲の列番号を設定【列番号】, ④ 検索する際の型を設定【検索の型】 ) では、早速例題にうつります。 例題 以下条件に応じて、 E6 セルに入力した人の合否判定を行う表を作成する。 80歳以上:合格 80歳未満:不合格 実践 1. まずVLOOKUP関数で名前に紐づいた点数を検索します。 「=VLOOKUP( 検索値,範囲,列番号,[検索の型] )」の通り、式を埋めていく 検索値 検索したい名前( ラク ス太郎)を指定: E6 範囲 点数表の範囲から検索する: B6:C9 列番号 検索値があれば、指定した範囲の左から2列目の点数を返す: 2 検索の型 ただし、検索値は完全一致で返す: FALSE ◆式: =VLOOKUP(E6,B6:C9,2,FALSE) が完成◆ 以下の通り、名前に紐づいた点数を返すことができましたので、この結果に応じて合否判定もしていきたいと思います。 2. Excel (エクセル)のIF関数を利用して合否判定を行います。 =IF(論理式,[真の場合],[偽の場合]) の通り、式を埋めていく 論理式・・・【条件】 もし検索した点数が80点以上だったら: VLOOKUP(E6,B6:C9,2,FALSE)>=80 真の場合・・・【条件一致】 合格を表示: $C$2 偽の場合・・【条件不一致】 不合格を表示: $C$3 ◆式: =IF(VLOOKUP(E6,B6:C9,2,FALSE)>=80,$C$2,C3) が完成◆ まとめ 今回は Excel (エクセル)のIF関数の入門的な内容から、少し応用的なものまでご紹介しました。 Excel (エクセル)は私だけでなく、皆さんが業務を行う上でも利用機会が多いツールでもあるかと思います。 最近は、 Google の スプレッドシート を利用する方も多いと思いますので次はその内容についてまとめております。 ブログ Google スプレッドシート 使い方 【まとめ】 最後にはなりますが、本内容が1つでも皆様のお役に立てていれば幸いです! Excel (エクセル)のIF関数については以上となりますが、最後に宣伝をさせてください! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com 長々と失礼しました。 今後とも、 ラク スを宜しくお願い致します。 表中のある項目(セル)に特定の値を入力して選択状態にし、そのままマウスなどのドラッグ操作で縦あるいは横に選択領域を広げていくと、新たに選択された項目に次々に連続した値が入力されていく。 ↩
アバター
はじめに こんにちは、楽楽精算の開発に携わっているHiroto-Kitamuraです。 皆さまは、開発にどのような環境( IDE 、エディタ)を使用しているでしょうか? Eclipse に VSCode 、 Emacs に Vim など…個々の使い方によって選択肢は多いですよね。 本記事では、私が職場や家でインストールして使用している IDE の IntelliJ を紹介します。 IntelliJ は機能をフルに使おうとすると有料ですが、私はそれに見合う価値があると考えています。 インストールから日本語化などの簡単な使い方まで解説しているので、気になった方はぜひ最後までお読みください。 はじめに IntelliJとは? 有料版と無料版について インストール手順 Toolboxのインストール IDEのインストール 初期設定 日本語化・プラグイン導入の使い方 ライセンス購入 IntelliJの使い方 プロジェクト作成・プログラム実行 便利なショートカット Git連携の使い方 リポジトリ作成 commit, pushなどの使い方 switch, mergeなどの使い方 Git Bash埋め込み データベース連携の使い方 データベース接続 データベース操作 まとめ IntelliJ とは? IntelliJ (正確には IntelliJ IDEA)は チェコ の JetBrains 社が開発している 統合開発環境 ( IDE )の一つで、 主に JVM 言語( Java , Kotlin, Scala など)及びHTML/ CSS や JavaScript 等フロントエンドで使われる言語、 SQL をサポートしています。 JetBrains社は IntelliJ 以外にも Python や C言語 など使い方の異なる各言語に対応した IDE をそれぞれリリースしており、 これらの IDE と豊富な プラグイン をインストールしてフルに使用することであらゆる言語での開発ができるようになっています。 IDE 名 主なサポート言語 AppCode Objective-C , Swift CLion C, C++ DataGrip SQL 専用 GoLand Go IntelliJ IDEA Java , Kotlin, Scala , Groovy PhpStorm PHP PyCharm Python Rider C# , .NET Framework RubyMine Ruby WebStorm web専用(HTML, JavaScript など) 有料版と無料版について IntelliJ には有料版のUltimateと無料版のCommunity Editionが存在し、使い方によってどちらかをインストールします。 無料版は他の多くの環境と同じく料金がかかりませんが、フロントエンドや SQL 、Webフレームワークのサポートがないため、本格的な開発には向きません。 有料版は個人利用で1年17,200円(初年度・記事作成現在)と決して安くない価格ですので、導入を迷っている方はまず、無料版をインストールして試してみるのも良いでしょう。 また、有料版にも1ヶ月の試用期間がありますので、そちらを試すのも一つの手です。 ちなみに、 IntelliJ Ultimateを含めたJetBrains製 IDE が全部入りになっているAll Products Packというものも存在します。 個別に買い揃えるよりかなり安くなっているので、色々な言語を使いたい方はこちらを購入するのが良いでしょう。 インストール手順 Toolboxのインストール IntelliJ のインストールには、公式サイトから直接 IntelliJ の インストーラ をダウンロードする方法と、JetBrainsの各 IDE をまとめて管理できる Toolbox App からインストールする方法があります。 どちらがよいかは各々のPCの使い方等によって変わってくると思いますが、本記事では IDE のバージョンの管理が簡単で複数の IDE の管理にも便利なToolboxからのインストール方法を解説します。 まず、 こちら からToolboxの公式ページにアクセスし、OSに合わせた拡張子を選択してダウンロードをクリックしてください。 次に、ダウンロードした インストーラ を開き、指示に従ってインストールを行いましょう。 インストールが完了したら、タスクバー右側の通知領域にToolboxアイコンが表示されているかと思います( Windows の場合)。 これをクリックすることで、Toolboxを起動することができます。 表示されていない場合はスタートメニューなどから検索して起動すればOKです。 IDE のインストール Toolboxのインストールが終わったら、前項の方法で起動しましょう。 Toolsタブに表示されている IntelliJ IDEA UltimateかCommunity Editionのどちらかを選択し、インストールをクリックしてください。 私は既に IntelliJ をインストールしているので画像では表示が異なっていますが、本来は他の IDE と同様の表示になります。 インストールが完了したら、Toolsタブ上部・Installed項に表示された IntelliJ をクリックし、起動することができます。 初期設定 IntelliJ のインストール後初回起動時には、初期設定を行う必要があります。 ※私は既に IntelliJ でこの初期設定を完了してしまっているので、以降の一部画像は別のJetBrains製 IDE であるPyCharm, RubyMineをインストールした時のものになります。 やることは IntelliJ とほぼ変わりません。 起動するとまず設定ファイルをインポートするか聞かれるので、他の人や前のPCから設定ファイルを持って来ている人はそのファイルを選択しましょう。 ない人はDo not import settingsを選べばOKです。 次にライセンスの設定です(有料版のみ)。 30日間の無料試用期間があり、Evaluate for free→Evaluateを押すと試用することができます。 後述するライセンス購入を行っている方は、Activate→JB AccountでJetBrainsアカウントのログイン情報を入力するか、Activation codeからライセンスコードを入力してください。 最後にWelcome画面が開きますので、カラーテーマやフォントサイズ、 プラグイン 等の設定を行って最初のプロジェクトを作成すれば初期設定完了となります(これらは後からでも設定できます)。 IntelliJ の画面表示をできるだけ日本語にしたいという方は、ここで次項の日本語化 プラグイン をインストールするのがよいでしょう。 日本語化・ プラグイン 導入の使い方 インストール直後の IntelliJ は表記がすべて英語になっています。 私はこのまま使っているのですが、日本語化したい方も多いのではないでしょうか。 本項では IntelliJ の日本語化の方法とその他 プラグイン のインストール方法を説明します。 先程のWelcome画面でPluginsタブを開き、検索窓にjapaneseと打ち込みましょう。 すると「Japanese Language Pack / 日本語言語パック」という プラグイン が出てくるので、インストールボタンを押します。 他に使い方に合わせて入れたい プラグイン があれば同様にインストールすればOKです。 インストール完了後画面の指示に従ってRestart IDE から IntelliJ を再起動すると、表記がある程度日本語になりました。 完成されたプロジェクトではないので、英語のまま残っているところも多々あります。 プラグイン は IntelliJ のインストール直後だけでなくプロジェクトを作った後でも設定画面で入れることができますし、一度入れた後無効化することもできます。 この場合は画面上部の ツールバー 、File>Settings>Pluginsから設定を行いましょう。 まずは英語で試してみて、読みづらいので日本語にして、でもやっぱり英語に戻して…という使い方も可能です。 この記事では以降日本語化していない環境を前提に説明を進めていきますが、使い方は変わらないので、日本語化をした方は適宜翻訳しながら読み進めてください。 ライセンス購入 有料版の使用には、ライセンス購入が必要となります。 日本の代理店から購入する方法もありますが、ここではJetBrainsから直接購入する方法を紹介します。 まずは、 JetBrains公式サイト から右上のストアをクリックしてください。 IntelliJ のみ使用する場合は IntelliJ IDEA Ultimate、他の全 IDE も使いたい場合はAll Products Packの購入ボタンをクリックし、先に進みましょう。 あとは画面の指示に従って情報を入力し、クレジットカードや デビットカード で支払いを行えば、購入完了です。 この過程でJetBrainsアカウントを作成することになると思います。 Toolboxを開いて右上の歯車アイコンから設定画面に進み、アカウント情報を入力してログインしておくことでライセンスを有効化することができます。 先述した IDE のインストール後初期設定でも有効化できますが、こちらで設定しておくと IntelliJ 以外の IDE をインストールする際にも毎回いちいちアカウント情報を入力する必要がありません。 All Products Packを購入した方にはこちらの設定方法がおすすめです。 IntelliJ の使い方 ここからは、プログラム作成からGitやデータベースの連携まで、 IntelliJ の基本的な使い方・便利機能について説明します。 プロジェクト作成・プログラム実行 IntelliJ のインストールが終わったら、実際にプロジェクトを作ってコードを書いてみましょう。 インストール直後の場合はWelcome画面のProjects>New Project、 既に何らかのプロジェクトを開いている場合は上部 ツールバー のFile>New>Projectから新規プロジェクト作成画面に入ってください。 作るプロジェクトの種類を画面左から選択できますが、今回は基本的な Java プロジェクトを作ることにします。 開発を行うには、 SDK ( JDK 、 Java 開発に必要なツールキット)を選択する必要があります。 既に使いたいバージョンの JDK がPCにある人は表示された候補の中から選ぶか、Add JDK から JDK のフォルダを選択してください。 JDK がない、そもそも JDK って何という方はDownload JDK から使いたい Java バージョンを選んでインストールしましょう。 バージョンがわからなければ11あたりでいいと思います。 次にテンプレートを選ぶ画面に移ります。 チェックを入れると初期パッケージとMainクラスとmainメソッドが作られるので、入れておきましょう。 最後にプロジェクト名(と初期パッケージ)を決めてFinishを押せば、プロジェクトが作成されます。 プロジェクトの画面は下画像のようになっていて、左側にファイル管理、右側にコード、下に実行結果他もろもろが表示されています。 記事内で字が見えづらくならないようにウインドウを縮小しています。普段のコード画面はもっと広いです コードを書いていると自動補完が働きます。 デフォルト設定では特別なショートカットを押さなくとも、入力すると勝手に補完が出てきます。 使い方によると思いますがとても便利です。 大文字小文字の区別をなくすには、File>SettingsのEditor>General>Code CompletionからMatch caseのチェックを外してください。 コードの実行は画面右上などに表示されている右三角ボタンで実行できます。 表示がない場合はmain関数の上で右クリックしてRun Mainを実行すればOKです。 新しくパッケージやクラスなどを作る際は左側のフォルダを右クリック>New(または選んだ状態でalt+insert)で作成しましょう。 このあたりの使い方は Eclipse 等の IDE とほぼ変わらないと思いますが、 IntelliJ ではデフォルトでコードを自動保存してくれる点が大きく異なります。 便利なショートカット IntelliJ には、便利なショートカットが多数存在します。 全ショートカットの一覧は他サイトに譲りますが、ここでは私が普段重宝しているものを紹介しようと思います。 ショートカット 操作 Ctrl+Space 自動補完 Ctrl+Alt+L コードの自動整形 Shift+F6 名称変更 Ctrl+クリック 変数やクラスの宣言場所・使用場所にジャンプ Ctrl+D 行の複製 Ctrl+Y 行の削除(最初に使用した際 Redo と選択) F2 エラーや警告の場所にジャンブ Alt+Enter エラーや警告の修正候補を表示 Shift2回押し クラス・変数・テーブル・設定項目など何でも検索 Ctrl+Shift+F 全ファイル内から grep 検索 Alt+Insert ファイル作成・コンスト ラク タ/getter/setter/toString等の追加 Ctrl+/ 選択行の コメントアウト ※ショートカットはすべて Windows 版です Eclipse などの今使っている環境と、コマンドや使い方が全然違うと思う方もいらっしゃると思います。 こちらに慣れるのもいいですし、File>Settings>Keymapからお使いの環境風に一括で変えたり、1つずつショートカットを自分流にアレンジする使い方もできますよ。 Git連携の使い方 IntelliJ では作ったプロジェクトをGitと連携させると、 GUI でcommitやpush、switchなどを行ったり、ブランチのコミットグラフを図で確認することができるようになります。本項では、このGit連携の基本的な使い方を紹介します。 これらはコマンドで行うことももちろんできますが、ブランチが多くてごちゃごちゃしている場合や、コマンドを叩くより GUI 上で操作したい方におすすめです。 リポジトリ 作成 新しくプロジェクトを作った場合は、画面上部の ツールバー から VCS >Enable Version Control Integrationをクリックしてください。 使う バージョン管理システム の選択肢が出てくるのでGitを選んでOKを押すと、ローカル リポジトリ が作成されます。 既に GitHub などにあるプロジェクトをcloneする場合は、上部 ツールバー でFile>New>Project from Version ControlよりURLの入力や GitHub アカウントへのログインをすることでcloneできます。 commit, pushなどの使い方 ローカル リポジトリ を作ったら、実際にcommitなどの操作を行ってみましょう。 Gitの操作は主に画面右上と画面下部のGitタブ>Logタブ(画像で赤枠で囲まれた部分)で行います。 commitやpushpull、 ロールバック は画面右上のボタンで行います。 commitはチェックボタンです。 差分を見比べながらcommitするファイルを選択する、コミット前に自動整形をする、といった使い方ができるので大変便利です。 ちなみに、差分があるファイルはcommit画面を開かなくてもファイルウインドウやエディタ画面で青く表示されています。 pushは右上向き矢印ボタンで行えますが、 GitHub などのリモー トリポジ トリが必要なので、cloneやgit remoteなどで設定していない場合はpush>Define remoteからリモー トリポジ トリを設定しましょう。 pullは左下向き矢印(Update Project), 未コミット部分の ロールバック はU字矢印ボタンで行うことができます。 switch, mergeなどの使い方 ブランチ関連の操作は画面下部Gitタブで行います。 現在のブランチ名は常に画面右下に表示されています(前項の図参照)。 既存のブランチへのswitchはブランチを右クリック>Checkoutで、新ブランチの作成は派生元のブランチを右クリック>New Branch from Selectedから行いましょう。 簡単な操作は右下のブランチ名クリックから行うこともできます。 mergeはマージ先のブランチにcheckoutした後、マージ元のブランチ右クリック>Merge into Currentから行えます。 ここで紹介した使い方以外にも、様々なGit操作が可能です。 Git Bash 埋め込み 前章ではGitの GUI 操作の使い方について説明しましたが、コマンドで操作を行うGit Bash を IntelliJ に埋め込むことも可能です。 これを使えば、Gitコマンドを使うのにいちいち IntelliJ からウインドウを切り替える必要がありません。 本項で紹介する方法は Windows 用のものとなりますが、他のOSでも似たような使い方でgitが使える端末が埋め込めると思います。 ※Git Bash がPCに入っていない場合は、 IntelliJ への埋め込みの前にGit Bash をインストールしておいてください。 こちら からインストールできます。 まず、上部 ツールバー のFile>Settingsから設定メニューを開き、Tools>Terminalを開きましょう。 そしてShell Pathの欄にGit Bash のインストール ディレクト リのbin\ bash .exeのパスを入力すると(C:\Program Files\Gitあたりにあると思います) 、 IntelliJ 画面下部のTerminalタブでGit Bash を開くことができます。 この状態でGit Bash は使えるのですが、このままだとgit logなどで表示される日本語が正常に表示されず、Gitの使い方によってはとても不便です。 これを解消するためには、Git Bash の設定を変更する必要があります。 まずGit Bash を IntelliJ とは別ウインドウで開き、次の2つのコマンドを実行してください。 $ cd $ vi .bashrc vim が開くので、iボタンで挿入モードに移行した後 export LANG='ja_JP. UTF-8 ' と書き込み、 Escキーで ノーマルモード に移行して:wqと入力して保存します。 その後コマンドで $ source .bashrc を実行した後、 IntelliJ のターミナルを開き直す(Localの横の×ボタンで閉じた後再びTerminalタブを開く)と日本語が表示されているはずです。 データベース連携の使い方 IntelliJ Ultimateをはじめとする有料版JetBrains IDE では、Gitと同じようにデータベースも GUI から操作したり、コンソールを IDE 内で使用することができます。 Webアプリなどデータベースを活用するアプリケーションを開発する際、テーブルの作成やデータの挿入などが IDE 内で簡単に行えるため便利です。 本項では、このデータベース連携の使い方を紹介します。 ※Git Bash と同じくこちらも予め DBMS をインストールする必要があるので、PCに入っていない方はこの項を読む前に何らかの DBMS のインストールをしておいてください。 DBMS のインストール方法や使い方は割愛しますが、例えば PostgreSQL であれば こちら からインストールできます。 データベース接続 まず、画面右端に表示されているDatabaseをクリックしてください。 ない場合は画面端のどこかにあると思います(無料版にはありません)。 データベースのツールウインドウが開くので、+ボタン>Data Sourceから、お使いの DBMS を選択しましょう。 あとは画面の指示に従って JDBC ドライバのインストールや認証情報の入力を行えば、データベースに接続できます。 認証方法など詳しい使い方は DBMS によって異なるので、本記事では紹介しません。各 DBMS の仕様に従ってください。 データベース操作 データベースに接続すると、 SQL を打ち込めるコンソールが開きます。 使い方は概ね他のエディタや コマンドライン と同じですが、書いてある文の中で一部のみ実行といったこともできるので、長い SQL を一度にコピーしてきて少しずつ実行ということも可能です。 コードのエディタと同じくこちらでも強力な補完が自動で働くため、手動で SQL を入力する使い方の場合は非常に便利です。 私が普段使っている PostgreSQL の場合、接続するデータベースや スキーマ をコンソール右上から設定できるので、接続するデータベース クラスタ が同じならいちいちコンソールを開き直したりSET search_pathを入力する必要もありません。 なお、コンソールを閉じてしまった場合には、データベースツールウインドウ上部の SQL ボタンを押すと再度開くことができます。 IntelliJ では、簡単な使い方で GUI でデータベースを操作することも可能です。 データベースツールウインドウにはデータベースが ディレクト リ構造で表示されているので、 右クリックからテーブル作成・削除、 DDL 変更(Modify Table)などを簡単に行うことができます。 また、テーブルをダブルクリックするとそのテーブルに入っているデータが表示されますが、 これはただSELECT文の結果が見られるだけではありません。 画面上部の+-ボタンで行の追加・削除(INSERT・DELETE)ができる他、フィールド(マス)をダブルクリックすれば内容の変更(UPDATE)も可能です。 実際のデータベースへの反映はDB↑ボタンを押してから行われるので、間違って行を消してもボタンを押さなければ問題ありません。 複雑な操作には向きませんが、簡易的なデータの挿入・修正が直感的に行えるのは便利ですね。 まとめ 本記事では IntelliJ のインストール方法・基本的な使い方・便利な機能について紹介してきました。 ここで紹介したのは IntelliJ の機能のごく一部であり、まだまだ色々な使い方が存在します。 私も使い始めて1年も経っていないので、多くの機能を知らないまま使ってきていると思います。 ただ、「こういう機能あったら便利だな」と思って検索すると大体何かしらあるので、 開発時、環境に起因するストレスを感じることはほとんどありません。 個々人の使い方によって合う環境は変わってくると思いますが、 多少お金をかけてでも快適に開発が行いたいという方は、 一度 IntelliJ やJetBrains製 IDE をインストールして試用してみるのも良いのではないでしょうか。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに PHPのソースコードについて 標準関数のソースコードを読むコツ PHP本体のソースコードを読んでみる まとめ はじめに こんにちは。開発エンジニアのシカタです。 今回は PHP の標準関数の読み方について紹介します。 こんな経験をしたことはありませんか? PHP のバージョンアップで挙動が変わった 関数が想定外の値を返してきた 想定外の挙動をしている… リファレンスに書かれていないけど、この引数って使える…? こういうときに、 PHP 本体のコードがどう実装されているのか読むことができればスッキリしそうですよね。 今回、 PHP 本体の ソースコード を読む方法について、具体例を交えて紹介します。 PHP の ソースコード について PHP の ソースコード 自体は C言語 で実装されています。 C言語 と聞くだけでハードルが高く感じるかもしれませんが、標準関数のコードを読んでみる程度であれば意外と雰囲気で読めます。 C言語 の基本的な文法が分かる、雰囲気で上から下へ ソースコード が読むことができれば十分です。 標準関数の ソースコード を読むコツ キーワードは「 PHP _FUNCTION(関数名)」 雰囲気で理解する ある程度納得したらやめておく、適度に追いかける PHP 本体のコア部分は追わない 以上を抑えておけば雰囲気で読むことができます。 PHP 本体の ソースコード を読んでみる 今回はsleep関数のコードを例に追ってみます。 sleep ( int $seconds ) : int https://www.php.net/manual/ja/function.sleep.php この関数の引数が0だったとき、どんな挙動になるのか気にしながら見ていきたいと思います。 まずは ソースコード を入手 php -srcを下記から入手します https://github.com/php/php-src git環境があるならclone、 ソースコード を読みたいだけなのでzipで入手しても良いと思います。 入手した ソースコード を開く 規模のある ソースコード なので、 ソースコード 全体を検索しやすいエディタ、 IDE がオススメです。 今回は VSCode を使います。 「File > Open Folder」で php -srcを開きます。 関数の定義を探す PHP の標準関数は「 PHP _FUNCTION(function_name)」で定義されています。 PHP では、独自の関数(マクロ)を作成することができますが、 こちらでも関数は「 PHP _FUNCTION(function_name)」で定義するものだと説明されています。 関数の定義方法を詳しく知りたい場合には参考になります。 http://php.adamharvey.name/manual/ja/internals2.funcs.php 今回はsleep関数を追ってみるので、 php -srcの中で「 PHP _FUNCTION(sleep)」で検索をしてみます。 下記のようにすぐ見つかります。 関数の中身を読んで見る 上から見ていきます。 まず、「ZEND_XXXX」が出てきますが、ここは PHP のコアなところです。 PHP の 構文解析 や実行エンジンを担っているコアなところは「Zend Engine」と言われています。 PHP の ソースコード 内で出てくる「zend」はコアなところに繋がると思って良いと思います。 そのため、雰囲気で読むだけあればここを追う必要はありません。 ちなみに、ここは「PARSE」や「PARAMETERS、PARAM」と名前が付いたものが呼ばれているぐらいなので 引数を解析しているぐらいの理解で大丈夫だと思います。 その次は、引数が負の値だった場合は、エラー処理をしています。 最後に、「 php _sleep」というマクロが呼ばれてます。 ここを追っていきます。 関数定義を追っていく 「 php _sleep」の定義を探してみます。 2つのマクロ定義が見つかりますが、よくよく見ると windows とそれ以外みたいな分岐があります。 実行環境が windows と Unix 系で違うんだ…ぐらいの理解で大丈夫です。 windows の場合は、さらに「SleepEx」が呼ばれているので、さらに深追いしましょう。 もう一方は、「sleep」なので、ここで C言語 のsleepを叩いているようです。 さらに深追い①( windows の場合の挙動を追う) ここまでと同様に「SleepEx」の定義を探してみます。 しかし、先ほどのマクロ定義のところでしか引っかかりません。 PHP 内の定義されていない場合は、ライブラリまたは C言語 で定義されたものである可能性が高いです。 あとは適当にググってみます。 すると、SleepExはWin32APIで定義されている関数みたいです。 https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleepex windows の場合の挙動なので納得できます。 0秒の場合の挙動についても書かれています。 追うのはここまでにしておきます。 さらに深追い( windows 以外の場合の挙動を追う) C言語 の「sleep」まではたどり着けましたが、そこから先は明記されていませんでした。 https://www.ibm.com/support/knowledgecenter/ja/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rtsle.htm ここから先は C言語 の仕様に依存する部分なので、今日はこのくらいにしておきましょう。 0秒を渡したときは、最終的に C言語 のsleepがいい感じに0秒スリープしてくれる、はずです。 まとめ PHP のコアコードの読み方を解説してみました。 身近な関数の実装であれば、意外と雰囲気だけで読むことはできます。 今回紹介した手順を参考にしていただければ、他の関数でも試してもらえますので、 一度、普段使っている PHP の標準関数の ソースコード を読んでみてはいかがでしょうか。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 背景 Laravelのセッション管理について セッションドライバについて セッションの操作 セッションの共有を検討してみた LaravelでDBを使ってセッション管理する セッション共有の検討 Laravelのカスタムセッションドライバ まとめ はじめに こんにちは、開発エンジニアのシカタです。 今回は、開発を担当するプロダクトで アーキテクチャ を刷新することになり、Laravelの検討したときのお話です。 アーキテクチャ の刷新だけにたくさんの課題がありましたが、その中でも今回はセッションのことについて書きます。 Laravelをやってみようとか、既存プロダクトにLaravelを載せてみたいなーと思ってる人の心に刺されば幸いです。 背景 既存の運用中プロダクトの一部サブシステムを、新 アーキテクチャ で構築し直すプロジェクトがスタートしました。 一気にリリースすると影響が大きすぎるので、一部の機能から徐々にリリースしていく方針です。 現在ノン フレームワーク のため、せっかく新しくするなら フレームワーク を採用したい… ということで、Laravelを検討してみることになりました。 既存プロダクトのノン フレームワーク な世界と、Laravelで新しく作る世界を共存させることを検討する必要があり、 フレームワーク の機能を活用することを目指していますが、たくさんの課題が出てきました。 アーキテクチャ どうしよう… Laravelを活かすにはどういう アーキテクチャ で共存させるのが良いのか… 既存プロダクトとLaravelでどうやってセッション共有しよう… 認証周りとかどうするのが良いんだろう…etc 今回は課題の中からセッションについて取り上げます。 Laravelのセッション管理について まず、Laravelの基本的なセッション管理についてです。 セッションドライバについて Laravelでは、file、 cookie , DBなどでセッション情報を管理することができます。 config/session.php にセッションに関する設定は記載されています。 config/session.php return [ /* |-------------------------------------------------------------------------- | Default Session Driver |-------------------------------------------------------------------------- | | This option controls the default session "driver" that will be used on | requests. By default, we will use the lightweight native driver but | you may specify any of the other wonderful drivers provided here. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "dynamodb", "array" | */ 'driver' = > env('SESSION_DRIVER', 'file'), : : ] セッションの操作 Laravelでセッションの操作を行うには、 Requestインスタンス 、 sessionヘルパ 、 Sessionファサード を使う方法があります。 基本操作に大きな違いはありません。 <?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; class HogeFunction extends Controller { /** * @param Request $request * @return Response */ public function hogee ( Request $ request ) {   /* セッションから1つデータを取得する */ // Requestインスタンス $ value = $ request -> session () -> get ( 'key' ) ; // Sessionヘルパ $ value = session ( 'key' ) ; // Sessionファサード $ value = Session :: get ( 'key' ) ;   /* セッションの値をすべて取得する */ // Requestインスタンス $ values = $ request -> session () -> all () ; // Sessionヘルパ $ values = session () -> all () ; // Sessionファサード $ values = Session :: all () ;   /* セッションに値を保存する */ // Requestインスタンス $ request -> session () -> put ( 'key' , 'value' ) ; // Sessionヘルパ session ([ 'key' => value ]) ; // Sessionファサード Session :: put ( 'key' , 'value' ) ; /* セッションに値を削除する */ // Requestインスタンス $ request -> session () -> forget ( 'key' ) ; // Sessionヘルパ session () -> forget ( 'key' ) ; // Sessionファサード Session :: forget ( 'key' ) ; /* セッション中に値が存在することの確認(existsはnullでもTrueを返す) */ // Requestインスタンス $ request -> session () -> has ( 'key' ) ; $ request -> session () -> exists ( 'key' ) ; // Sessionヘルパ session () -> has ( 'key' ) ; session () -> exists ( 'key' ) ; // Sessionファサード Session :: has ( 'key' ) ; Session :: exists ( 'key' ) ; } } セッションの共有を検討してみた 既存プロダクトとLaravelでセッションを共有させる方法を検討してみました。 既存プロダクトがDBでセッション管理されているため、今回はLaravelでもDBを用いたセッション管理を前提に考えています。 また、既存プロダクトではセッション周りは純粋な PHP で実装していますが、Laravelのセッション周りは独自実装になっています。 どこかで session_start(); しておけばいい感じになるだろう、というわけにはいきません。 この違いも少し厄介なポイントです。 LaravelでDBを使ってセッション管理する LaravelでDBを使いセッション管理する場合は、以下のようなテーブルを作成する必要があります。 Schema::create('sessions', function ($table) { $table- > string('id')- > unique(); $table- > foreignId('user_id')- > nullable(); $table- > string('ip_address', 45)- > nullable(); $table- > text('user_agent')- > nullable(); $table- > text('payload'); $table- > integer('last_activity'); }); 以下のように設定しておくと、セッション管理に使用するテーブルと認識されます。 config/session.php return [ /* |-------------------------------------------------------------------------- | Default Session Driver |-------------------------------------------------------------------------- | | This option controls the default session "driver" that will be used on | requests. By default, we will use the lightweight native driver but | you may specify any of the other wonderful drivers provided here. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "dynamodb", "array" | */ 'driver' = > env('SESSION_DRIVER', 'database'), : : /* |-------------------------------------------------------------------------- | Session Database Table |-------------------------------------------------------------------------- | | When using the "database" session driver, you may specify the table we | should use to manage the sessions. Of course, a sensible default is | provided for you; however, you are free to change this as needed. | */ 'table' = > 'sessions', : : ] セッション共有の検討 既存プロダクトで使用しているテーブルを使用するか、Laravelに合わせたテーブルを使用するのか…他にもいくつか選択肢がありました。 少なくとも、Laravelのセッション機能を活用しようと思うと、 LaravelでDBを使ってセッション管理する際にテーブル定義の通り作成が必要となるようです。 Laravelのセッションが確立するまでの独自実装を追ってみると、以下にたどり付きました。 Illuminate/Session/DatabaseSessionHandler.php ここを見る限りは指定されているテーブル定義前提で動くような実装になっています。 セッション管理のテーブルやセッション周りの実装が似ていれば移行前提で検討できるかもしれませんが、そうでなければ難しいです…。 よって、LaravelデフォルトのDBのセッションドライバのままでは、既存プロダクトとのセッション共存は困難であることがわかりました。 しかし、Laravelにはカスタムセッションドライバという仕組みがあり独自のセッションドライバを実装できます。 Laravelのカスタムセッションドライバ 以下のように、 SessionHandlerInterface を実装することで独自のセッションドライバの作成が可能です。 <?php namespace App\Extensions; class CustomSessionHandler implements \SessionHandlerInterface { // open: ファイルベースでなければ空でOK public function open ( $ savePath , $ sessionName ) {} // openと同様 public function close () {} // セッションの読み込み処理($sessionIdに紐づくセッションデータの取得) public function read ( $ sessionId ) {} // セッションの書き込み処理($sessionIdに紐づく$dataの書き込み) public function write ( $ sessionId , $ data ) {} // セッションの読み込み処理($sessionIdに紐づくセッションデータの削除) public function destroy ( $ sessionId ) {} // セッションの読み込み処理($lifetimeを超えたセッションデータの削除) public function gc ( $ lifetime ) {} } 次に、作成したカスタムセッションドライバの登録方法についてです。 Session ファサード の extend メソッドで登録することができます。 ServiveProvider の boot メソッドで上記メソッドを呼ぶことでカスタムセッションドライバの登録ができます。 既存の AppServiceProvider またはセッション用に作成した ServiceProvider から呼び出します。 下記は ServiceProvider から呼び出す例です。 <?php namespace App\Providers; use App\Extensions\CustomSessionHandler; use Illuminate\Support\Facades\Session; use Illuminate\Support\ServiceProvider; class SessionServiceProvider extends ServiceProvider { /** * 全アプリケーションサービスの登録 * * @return void */ public function register () { // } /** * 全アプリケーションサービスの初期起動 * * @return CustomSessionHandler */ public function boot () { Session :: extend ( 'custom' , function ( $ app ) { // Return implementation of SessionHandlerInterface... return new CustomSessionHandler; }) ; } } 最後に、作成したカスタムセッションドライバを config/session.php で設定すると、使用できるようになります。 config/session.php return [ /* |-------------------------------------------------------------------------- | Default Session Driver |-------------------------------------------------------------------------- | | This option controls the default session "driver" that will be used on | requests. By default, we will use the lightweight native driver but | you may specify any of the other wonderful drivers provided here. | | Supported: "file", "cookie", "database", "apc", | "memcached", "redis", "dynamodb", "array" | */ 'driver' = > env('SESSION_DRIVER', 'custom'), : まとめ Laravelのセッションについてまとめてみました。 既存のプロダクトと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
アバター