TECH PLAY

株式会社ラクス

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

927

技術広報の yayawowo です。 SQL の中でも、良く利用されるUPDATE文ですが、 今回は SQL 入門編としまして、 UPDATE文の基本~応用をご紹介します! ※本説明では、 PostgreSQL 9.6を利用します。 UPDATE 基本編 全レコードの更新 UPDATE文 × WHERE句 UPDATE文 × IN句 UPDATE 応用編 計算式を用いた更新 UPDATE文 × CASE文 別テーブルの値を用いた更新 別テーブルの値を条件にした更新 UPDATE まとめ ◆ 【 SQL 入門】 PostgreSQL 関連記事 ・ 【SQL入門】INSERT まとめ ・ 【SQL入門】DISTINCT 使い方 ・ RDBMSとDBMSについて【初心者向け】 ・ SQLの基本【まとめ】 ・ 【RDBMS】PostgreSQLインストール・コマンド入門編 UPDATE 基本編 UPDATE文とは、「テーブル上の列の値を更新する」際に使用する SQL 文です。 基本編に入る前に、説明時に利用するテーブルを作成します。 「 【SQL入門】DISTINCT 使い方 」でも利用した"動物テーブル"を利用します。 テーブル作成の SQL 文と結果は以下の通りです。 ◆ SQL 文 --テーブル作成SQL文 CREATE TABLE sample_animal ( animal_no integer , animal_name text, animal_breed text, animal_sex text, skill_no integer , skill_name text ); --テストデータ作成SQL文 INSERT INTO sample_animal VALUES ( 1 , ' 犬 ' , ' 柴犬 ' , ' 女 ' , 1 , null ); INSERT INTO sample_animal VALUES ( 2 , ' 犬 ' , ' 柴犬 ' , ' 男 ' , 2 , null ); INSERT INTO sample_animal VALUES ( 3 , ' 犬 ' , ' チワワ ' , ' 男 ' , 1 , null ); INSERT INTO sample_animal VALUES ( 4 , ' 犬 ' , ' プードル ' , ' 女 ' , 3 , null ); INSERT INTO sample_animal VALUES ( 5 , ' 犬 ' , ' ゴールデン ' , ' 男 ' , 2 , null ); INSERT INTO sample_animal VALUES ( 6 , ' 猫 ' , ' マンチカン ' , ' 男 ' , 2 , null ); INSERT INTO sample_animal VALUES ( 7 , ' 猫 ' , ' ペルシャ ' , ' 男 ' , 1 , null ); INSERT INTO sample_animal VALUES ( 8 , ' 猫 ' , ' ペルシャ ' , ' 女 ' , 2 , null ); INSERT INTO sample_animal VALUES ( 9 , ' 猫 ' , ' アメリカンショートヘア ' , ' 男 ' , 3 , null ); INSERT INTO sample_animal VALUES ( 10 , ' 猫 ' , ' ラグドール ' , ' 女 ' , 1 , null ); ◆ 動物テーブル animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null) 2 犬 柴犬 男 2 (null) 3 犬 チワワ 男 1 (null) 4 犬 プードル 女 3 (null) 5 犬 ゴールデン 男 2 (null) 6 猫 マンチカン 男 2 (null) 7 猫 ペルシャ 男 1 (null) 8 猫 ペルシャ 女 2 (null) 9 猫 アメリ カンショートヘア 男 3 (null) 10 猫 ラグドール 女 1 (null) 全レコードの更新 初めに、全レコードをUPDATEする SQL 文を見てみましょう。 ◆ 例題 動物テーブルのanimal_nameを「動物」にUPDATEする ◆ SQL 文 --全レコードをUPDATE UPDATE sample_animal SET animal_name = ' 動物 ' ; ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null) 2 犬 柴犬 男 2 (null) 3 犬 チワワ 男 1 (null) 4 犬 プードル 女 3 (null) 5 犬 ゴールデン 男 2 (null) 6 猫 マンチカン 男 2 (null) 7 猫 ペルシャ 男 1 (null) 8 猫 ペルシャ 女 2 (null) 9 猫 アメリ カンショートヘア 男 3 (null) 10 猫 ラグドール 女 1 (null)  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 動物 柴犬 女 1 (null) 2 動物 柴犬 男 2 (null) 3 動物 チワワ 男 1 (null) 4 動物 プードル 女 3 (null) 5 動物 ゴールデン 男 2 (null) 6 動物 マンチカン 男 2 (null) 7 動物 ペルシャ 男 1 (null) 8 動物 ペルシャ 女 2 (null) 9 動物 アメリ カンショートヘア 男 3 (null) 10 動物 ラグドール 女 1 (null) 全レコードをUPDATEすることは、業務上あまりないかと思います。 今回は、 SQL 文の基本のキということで、ご紹介させていただきました。 UPDATE文 × WHERE句 続いて、WHERE句(条件指定)を用いたUPDATEについて見てみましょう。 ◆ 例題 動物テーブルのanimal _no が「1」の場合、animal_breedを「 土佐犬 」にUPDATEする ◆ SQL 文 --WHERE句を用いたUPDATE UPDATE sample_animal SET animal_breed = ' 土佐犬 ' WHERE animal_no = 1 ; ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null)  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 土佐犬 女 1 (null) UPDATE文 × IN句 前述したWHERE句はUPDATE対象の絞り込み時に利用しますが、限定した値をUPDATEする際はどうすれば良いでしょうか? この際に利用するのがIN句になります。 早速例題と SQL 文、実行結果を見てみましょう。 ◆ 例題 動物テーブルのanimal _no が「2」と「3」の場合、animal_sexを「女」にUPDATEする ◆ SQL 文 --IN句を用いたUPDATE UPDATE sample_animal SET animal_sex = ' 女 ' WHERE animal_no IN ( 2 , 3 ); ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 2 犬 柴犬 男 2 (null) 3 犬 チワワ 男 1 (null)  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 2 犬 柴犬 女 2 (null) 3 犬 チワワ 女 1 (null) 上記のように、UPDATEしたいレコードに共通した条件がない場合にとても便利です。 UPDATE 応用編 では、応用編にうつります。 計算式を用いた更新 値を計算してUPDATEすることができます。 以下例題を見てみましょう。 ◆ 例題 動物テーブルのanimal _no 「1、3、5」に対し、skill _no に1を足す ◆ SQL 文 --skill_noに1を足すUPDATE UPDATE sample_animal SET skill_no = skill_no + 1 WHERE animal_no IN ( 1 , 3 , 5 ); ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null) 3 犬 チワワ 男 1 (null) 5 犬 ゴールデン 男 2 (null)  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 2 (null) 3 犬 チワワ 男 2 (null) 5 犬 ゴールデン 男 3 (null) animal _no が「1、3、5」のskill _no に1が足されました。 UPDATE文 × CASE文 条件分岐を行う際に用いられるCASE文を使い、一気に値をUPDATEすることができます。 ◆ 例題 動物テーブルのskill _no が以下条件の場合、指定したskill_nameでUPDATEする skill _no :1 → skill_name:走る skill _no :2 → skill_name:飛ぶ skill _no :3 → skill_name:泳ぐ 上記以外 → skill_name:なし ◆ SQL 文 --CASE文を用いたUPDATE UPDATE sample_animal SET skill_name = CASE skill_no WHEN 1 THEN ' 走る ' WHEN 2 THEN ' 飛ぶ ' WHEN 3 THEN ' 泳ぐ ' ELSE ' なし ' END ; ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null) 2 犬 柴犬 男 2 (null) 3 犬 チワワ 男 1 (null) 4 犬 プードル 女 3 (null) 5 犬 ゴールデン 男 2 (null) 6 猫 マンチカン 男 2 (null) 7 猫 ペルシャ 男 1 (null) 8 猫 ペルシャ 女 2 (null) 9 猫 アメリ カンショートヘア 男 3 (null) 10 猫 ラグドール 女 1 (null)  👇 animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 走る 2 犬 柴犬 男 2 飛ぶ 3 犬 チワワ 男 1 走る 4 犬 プードル 女 3 泳ぐ 5 犬 ゴールデン 男 2 飛ぶ 6 猫 マンチカン 男 2 飛ぶ 7 猫 ペルシャ 男 1 走る 8 猫 ペルシャ 女 2 飛ぶ 9 猫 アメリ カンショートヘア 男 3 泳ぐ 10 猫 ラグドール 女 1 走る 別テーブルの値を用いた更新 続いて別テーブルの値を使い、動物テーブルをUPDATEする SQL 文をご説明します。 初めに別テーブルとして、スキルテーブルを作成します。 ◆ SQL 文 --テーブル作成SQL文 CREATE TABLE sample_skill ( skill_no integer , skill_name text ); --テストデータ作成SQL文 INSERT INTO sample_skill VALUES ( 1 , ' 走る ' ); INSERT INTO sample_skill VALUES ( 2 , ' 飛ぶ ' ); INSERT INTO sample_skill VALUES ( 3 , ' 泳ぐ ' ); ◆ スキルテーブル skill _no skill_name 1 走る 2 飛ぶ 3 泳ぐ では、スキルテーブルの値を使い、動物テーブルのanimal_skillをUPDATEしてみましょう! ◆ 例題 動物テーブルのskill _no が「1」の場合、スキルテーブルのskill_nameを用いて、動物テーブルのskill_nameをUPDATEする ◆ SQL 文 --別テーブルの値を用いたUPDATE UPDATE sample_animal SET skill_name = ( SELECT sample_skill.skill_name FROM sample_skill WHERE sample_skill.skill_no = 1 ) WHERE skill_no = 1 ; ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 (null) 3 犬 チワワ 男 1 (null) 7 猫 ペルシャ 男 1 (null) 10 猫 ラグドール 女 1 (null) <スキルテーブル> skill _no skill_name 1 走る 2 飛ぶ 3 泳ぐ  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 1 犬 柴犬 女 1 走る 3 犬 チワワ 男 1 走る 7 猫 ペルシャ 男 1 走る 10 猫 ラグドール 女 1 走る 上記の通り、skill_name列がsample_skillテーブルが取得した値でUPDATEされました。 また、このように別テーブルに問い合わせる処理を「副問合せ(サブクエリ)」と言います。 別テーブルの値を条件にした更新 別テーブルの値を条件として、動物テーブルの値をUPDATEします。 ◆ 例題 スキルテーブルのskill_nameを条件とし、動物テーブルのskill_nameをUPDATEする ◆ SQL 文 --別テーブルの値を条件にしたUPDATE UPDATE sample_animal SET skill_name = ' 潜る ' WHERE skill_no IN ( SELECT sample_skill.skill_no FROM sample_skill WHERE sample_skill.skill_name = ' 泳ぐ ' ); ◆ 実行結果 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 4 犬 プードル 女 3 (null) 9 猫 アメリ カンショートヘア 男 3 (null) <スキルテーブル> skill _no skill_name 1 走る 2 飛ぶ 3 泳ぐ  👇 <動物テーブル> animal _no animal_name animal_breed animal_sex skill _no skill_name 4 犬 プードル 女 3 潜る 9 猫 アメリ カンショートヘア 男 3 潜る skill _no が「3」のskill_nameが「潜る」にUPDATEされたことが、実行結果からお分かりいただけるのはないでしょうか。 UPDATE まとめ 「【 SQL 入門】UPDATE まとめ」はいかがでしたでしょうか? 日頃から SQL を使った業務をされている方にとっては、基本的な内容だったかもしれません。 SQL の中でもUPDATE文は簡単な更新作業であれば気軽に使える命令ですが、様々な命令を組み合わせることがあると思います。 SQL 入門の振り返りとして、本記事をご参考いただけますと幸いです! 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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です。 突然ですが、 Google が提唱している「class SRE implements DevOps」の考えを御存知でしょうか? 「class SRE implements DevOps」は「SREはDevOpsというinterfaceの実装である」という意味を表します。 つまり、「DevOps = 思想」という定義に対し、それを具体化し実装したものがSREであるという考えになります。 昨今、注目が集まるSREの考え方を実践していく上で、定義に反する実装を行わないためにも、DevOpsの理解は避けられません。 今回はAzureを使用することで実現できるDevOps環境について調べる中で、DevOpsへの理解を深めてみようという試みです。 そのため、以下の内容に一致するものがあれば、是非一読いただけると嬉しいです。 DevOps・SREの考え方に興味がある Azureで出来ることを知りたい 目次 はじめに 目次 DevOpsとは DevOpsを実行するための5つの方針 組織のサイロの削減 エラーが発生するのを前提とする 段階的に変更する ツールと自動化を活用する 全てを計測する Azure DevOpsとは Azure DevOpsの構成要素 Azure Pipeline(CI/CD/テスト自動化ツール) Azure Boards(進捗管理ツール) Azure Repos(バージョン管理ツール) Azure Test Plans(手動テスト管理ツール) Azure Artifacts(パッケージ管理ツール) Azure DevOpsの利用料金 Azure App Serviceと併用して作る統合的なCI/CD環境 終わりに 予告 参考 DevOpsとは まずは、基本的な「DevOps(デブオプス)」の考え方についてです。 「DevOps」というのは、「Development(開発)」と「Operations(運用)」の略称を組み合わせた造語です。 ソフトウェアの開発担当と、運用担当がお互いに協力し、ソフトウェア、システムのビジネス価値を高め、その価値をエンドユーザーに迅速に届けることでよりよいサービスを作り上げていく思想のことを指します。 開発者/運用者のように分断された関係では、お互いのチームが目指す方向性にズレが生じてしまうという問題が少なからずおこります。 このような問題に対して、DevOpsの考え方を用いることで具体的に次のようなメリットが生まれます。 問題点や修正箇所の把握がしやすい ソースコード の改修などがあった際にデプロイテストが早く行えるため早い段階で問題点を見つけることができる 問題点が見つかった際のフィードバックがスムーズに行える DevOpsを実行するための5つの方針 DevOpsを実行するために必要な要素として、5つの要素が定義されています。 1. 組織のサイロの削減 2. エラーが発生するのを前提とする 3. 段階的に変更する 4. ツールと自動化を活用する 5. 全てを計測する 組織のサイロの削減 サイロとは「独立している」状態のことで、開発側・運用側のチーム同士がうまく連携できていない状態を指します。 お互いの組織に溝があることで生じる弊害を無くすため、DevOpsでは組織のサイロ化の削減を大きな指針のひとつに掲げています。 エラーが発生するのを前提とする いくら要件定義・詳細設計の段階で細かく設計したとしても、必ずシステムのエラーは発生してしまいます。 完璧なシステムはなく、エラーが発生するのを前提としてシステムの開発・運用に取り組むべきであるという考えです。 段階的に変更する 変更によって起こりうるエラーを考慮して、段階的に変更を加えることを推奨する考えです。 段階的な変更をすることにより、新規機能の追加対応、正常状態に戻す ロールバック 作業が迅速に行えるため、改善の速度を飛躍的に伸ばすこと、及びシステムの安定稼働に繋がる考えです。 ツールと自動化を活用する 開発及び運用の効率化という面で、ツールや自動化を活用することは非常に重要であるという考えです。 これは専門性や開発と運用の人的な負荷を低減することに繋がるので、サービスが拡大し、継続すればするほど初期での導入効果は大きくなります。 また、人的なエラーを起こさないための取り組みとしても非常に有効な手段です。 全てを計測する システムの運用ログやエラー検知、パフォーマンス含め、全てのデータを計測して数値化していくことが重要です。 これらのデータを開発と運用が密に運用することにより新規機能の開発やプログラム修正の際に役立つという考えです。 Azure DevOpsとは Azure DevOpsとは、2018/9/10 に Microsoft 社が発表した、DevOpsを実現するために必要なツールが揃っているオールインワンのDevOpsプラットフォームです。 以前は Visual Studio Team Services と呼ばれていたもので、プロジェクト管理、 継続的インテグレーション &デリバリーなど、DevOpsのためのサービス群を提供しており、アプリケーション開発の計画・開発・配信・運用のプロセスをAzure上で実現することが可能です。 通常、DevOpsを実現する環境を用意するとなると自動化・構成管理・ 進捗管理 といった多岐に渡るツールの用意が必要となるため、時間がかかってしまいます。 しかし、Azure DevOpsではこれらのツールが整っているため、スムーズに作業を行うことが可能なプラットフォームとなっています。 Azure DevOpsの構成要素 Azure DevOpsを構成するサービスは下記の通りです。 Azure Pipeline(CI/CD/テスト自動化ツール) Azure Boards( 進捗管理 ツール) Azure Repos(バージョン管理ツール) Azure Test Plans(手動 テスト管理ツール ) Azure Artifacts(パッケージ管理ツール) これらのサービスの全て、もしくは一部を利用することで、Azure上でDevOpsのための環境を構築することができます。 Azure Pipeline(CI/CD/テスト自動化ツール) Azure Pipelineとは、Azure上でアプリケーションのビルド、デプロイ、テストを自動化する 継続的インテグレーション &デリバリー(CI/CD)の機能を提供するツールです。 数多くの言語に対応し、 Kubernetes やDockerなどのコンテナとも連携可能です。 対応言語は、「 Python 」、「 Java 」、「 PHP 」、「 Ruby 」、「 C++ 」、「C」、「.NET」、「Node.js」があります。 Android 、 iOS で使用することもできます。 Azure Boards( 進捗管理 ツール) チームで作業をする際に、どのプロジェクトがどれくらい進行していて、何を作るのか、どのように作るのかという情報はとても大切となってきます。 そのような管理を可能とするのがAzure Boardsとなります。 チームで作業する上で全体の進捗の把握は必須ですが、大きなチームであればあるほど、チーム全体の状況の把握は難しくなります。 このような問題もAzure Boardsを使用すれば可能となります。 Azure Repos(バージョン管理ツール) Azure Reposとは、 ソースコード と成果物の共有とバージョン管理を行うツールです。 Gitベースの リポジトリ を提供しており、使用している 統合開発環境 ( IDE )から、接続・連携も可能なためチームメンバーと変更箇所の共有ができます。 Azure Test Plans(手動 テスト管理ツール ) Azure Test Plansとは、アプリケーションの手動でのテストを管理・支援するためのツールです。 Azure Pipelineが自動テストを支援することに対して、Azure Test Plansでは手動テストを実施する上でのテスト計画・テストケース・テスト結果などを管理する機能を提供します。 テストケースを作成せずに、状況に応じて学習を繰り返す、探索的テストも実行できます。 決められているシナリオ設定の通りにテストを行うシナリオテストも可能です。 リリース後の環境に近い設定でテストを行うことにより、リリース前に欠陥を見つけられるので早期に対応することが可能です。 Azure Artifacts(パッケージ管理ツール) Azure Artifactsは、アプリケーションを配布・公開するために、 ソースコード やライブラリをまとめたパッケージを管理するツールです。 パブリック及びプライベートのソースから「 Maven 」、「npm」、「NuGet」、「 Python 」のパッケージを共有可能です。 小さなチームでも簡単に共有を行うことができます。 また、パッケージを共有し、組み込みのCI/CD、バージョン管理、テストを自動化することが可能です。 Azure DevOpsの利用料金 Azure DevOpsの利用料金プランについては「Basic」と「Basic+Test」の2つのプランが存在し、利用料金と機能が異なっています。 Basicプランの利用料金は5人のユーザーまでは無料となっており、6人目以降の使用は一人当たり$6/月が必要となります。 制限なく利用できるサービスは、Azure Boards、Azure Reposとなっていますが、Azure PipelinesとAzure Artifactsは条件付きでの利用料金が無料となります。 一方、Basic+Testプランの利用料金は、1ユーザー辺り$52/月が必要となりますが、Azure DevOpsの全てのサービスを利用することが可能となっています。 また、このプランは30日間の試用期間が用意されており、無料で試すことも可能です。 Azure DevOps は単体のプラットフォームとして利用しても DevOps のための環境を構築できますが、Azure App Service と連携して利用することで 継続的インテグレーション &デリバ リー環 境(CI/CD 環境)とデプロイ先の環境を簡単に作成することができます。 Azure App Serviceと併用して作る統合的なCI/CD環境 Azure App Service とは、Web アプリケーションの実行環境を、インフラの設定を意識することなく簡単に作成できる Azure のサービスです。 Azure Pipeline と連携させることで、Web アプリケーションのビルド、デプロイ、テストを、アプリケーションの実行環境を含めて自動で生成できるようになります。 Azure Repos を連携させることでバージョン管理も同時に行うことができます。 Azure Test Plans や Azure Boards を組み合わせて、手動テストの管理やタスク・ 進捗管理 と連動した統合的なDevOpsを実現することも可能です。 終わりに 今回は体系的な知識を 仕入 れようということで、Azure DevOpsを使うことでできることについてまとめてみました。 DevOpsを実行するために必要な要素として、定義されている5つの要素を満たすには十分なツールが揃っていると言えるのではないでしょうか? しかし、DevOpsの導入にはこのようなツールだけではなく文化も変えていく姿勢が必要と言われています。 DevOpsを導入しようという組織への取り組みと、ツールや開発手法の変化を並行に行うことにより、よりビジネスの価値を高められるDevOpsの考え方に近づけていくことが出来るでしょう。 予告 今回、実際に「Azure DevOps」を触った内容について触れられておらず百聞は一見に如かずということで 「今のところ他の人と使う予定がないから一人でAzureのDevOps環境を触ってみた」 と題して、Basic+Testプランの無料の試用期間を利用して 各ツールを実際に試した記事を後日投稿させていただければと思います。 参考 Azure DevOpsとは?サービスや料金について – Azure導入開発支援 DevOpsとは?導入するメリットとAzureを活用した環境構築方法を解説 | クラウド導入・システム運用ならアールワークスへ SREとDevOpsの違いはなにか | sreake.com | 株式会社スリーシェイク エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
こんにちは。 ラク ス技術広報の syoneshin です。 今回は、 ラク ス開発本部のエンジニア・デザイナーを対象に、自己研鑽についてのアンケートを実施しました。 「自己研鑽」とは一般的に、 主体的に学んでスキルや専門知識を深め、自身の向上を促すこと を指します。 当社のエンジニア・デザイナーは普段、どのくらい自己研鑽に励んでいるのか、何をしてスキルや知識を磨いているのか等、聞いてみました! 結果、8割以上の方が何かしらの自己研鑽をしていることがわかりましたので、以下共有させていただきます! 自己研鑽をおこなっていますか? 一週間のうち、自己研鑽にかける時間を教えてください。 取り組んでいる自己研鑽の内容はどのようなものですか?≪複数回答可≫ 自己研鑽の目的を教えてください。 これからやってみたい自己研鑽はありますか?(フリーコメント) 技術力UP系 実務に役立つ系 終わりに 実施時期:2022年6月末 有効回答:74名 対象者: ラク ス開発本部 エンジニア・デザイナー 自己研鑽をおこなっていますか? 「はい」が82.4%、「いいえ」が17.6%。 8割以上が何かしらの自己研鑽に励んでいるという結果になりました。 一週間のうち、自己研鑽にかける時間を教えてください。 「2~5時間」「5~10時間」「10時間以上」が、6割強を占めています。 「2~5時間」が42.4%、次に「1~2時間」が25.4%、「5~10時間」が15.3%と、 一週間にきちんと自己研鑽の時間を取っている方が一定数伺えます。 開発メンバーがおすすめする「エンジニアの勉強法」 の記事にも参照している、「IT人材白書2020」アンケートで出ていた数字と比べ、 ラク スのエンジニア・デザイナーは、自己研鑽・自主的な勉強にあてる時間が多いことがわかりました! 取り組んでいる自己研鑽の内容はどのようなものですか?≪複数回答可≫ 「専門書を読む」「ビジネス書」の回答が目立つ結果に。 ラク スには書籍の貸出サポートもありますので、利用されている方も一定数いるということでしょうか。 また、専門書だけでなくビジネス書を読む人が多いのは当社の特徴かもしれません。 その他、3番目に「プログラミング」、「e-learning等の動画視聴」、「語学の勉強」と続きました。 自己研鑽の目的を教えてください。 「現在の業務に活かすため」が50%、続いて「今後のキャリアの選択肢を広げるため」が20%、「新しいことにチャレンジするため」が18.3%という結果になりました。 その他には、「技術の幅が広がることが単純に楽しい」「自身向上のため」「登壇の準備で必要なため」と、自己研鑽に対して前向きな回答が目立ちました。 これからやってみたい自己研鑽はありますか?(フリーコメント) ここまで取り上げたもの以外で、今後挑戦したい自己研鑽についても聞いてみました! 普段から興味のある技術への取り組みのほか、マネジメントの実務力UPに興味を持っている人もいるようです! 技術力UP系 個人開発・ AWS の習熟 新しい プログラミング言語 やMWを利用した開発 自作アプリの制作 Kubernetes のCRD作成、コードリーディング OSS コントリビュート kubernetes , go ARプログラミングの習得 実務に役立つ系 コーチン グ研修受講 MBA などの学位を取得 これらの手段としては、書籍(技術書/Audiobook)はもちろん、社外勉強会参加などの声もありました。 終わりに 今回の質問は以上になります。 ラク スで働くエンジニア・デザイナーについて、少しでもイメージできましたでしょうか? 当社では社員の自己研鑽活動を支援するため、以下のような取組みを実施しております。 当社の自己研鑽支援の事例にご興味ございましたら、ぜひ詳細もご覧いただけると幸いです。 職位・等級別研修の実施 資格取得、書籍購入・貸出のサポート 定期的な社内読書会・LT会の開催 社内でDDD(ドメイン駆動設計)読書会を開催しました Tailwind CSS 社内勉強会【まとめ】 外部イベントへの登壇支援 【イベントレポート】JJUG CCC 2022 Springに登壇・協賛しました! PHPerKaigi 2022【参加レポート】 社外向け勉強会やLT会の主催 ぜひ下記の記事も読んでみてください! ◆ 関連ブログ◆ ・ラクスエンジニア・デザイナーに聞いてみた【休日・休暇の過ごし方】 ・ラクスの福利厚生をご紹介! ・ラクスのSaaSプロダクト紹介【12種類まとめ】 ・【株式会社ラクス】SaaSプロダクト別の技術スタックを一挙公開! ・開発メンバーがおすすめする「エンジニアの勉強法」 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
こんにちは!気づけば ラク ス入社5年目の aa_crying です。 本日は、現在学習中のTypeScriptの基礎についてお話しできればと思います。 現在 ラク ス開発部では、部署間での技術知識共有のためTypeScriptの勉強会(読書会)を開催しています。 TypeScriptを先行して導入した部署から、導入を検討している部署向けに知識を展開することが目的です。 まずは指定されたページを読み、その後に読んで理解した内容やわからなかったことを周りのメンバーと議論する形をとっています。 勉強会で読んでいる書籍はこちらになります。 www.amazon.co.jp 今回は、勉強会で得たTypeScriptの入門知識を皆さんに共有できればと思い、記事にさせていただきました。 アジェンダ は以下の通りです。 TypeScriptとは TypeScriptのインストール トランスパイル TS Playground TypeScript入門 TypeScriptの『型』について 型推論 型ガード 便利だけど使わないほうがよい「any」 補足 「unknown」 おわりに TypeScriptとは TypeScriptは、 Microsoft が開発した JavaScript に静的型付け機能が追加された言語です。 JavaScript とは異なる言語ではなく、型に関すること以外のコードについては通常の JavaScript と同様の構文を使って記述することができます。 TypeScriptは JavaScript の機能をすべて利用できることから、"スーパーセット"と呼ばれます。 型の異なる関数呼び出しや代入を コンパイル 時に検出することによりプログラムの品質を高めることができます。 TypeScriptファイル( .ts)をそのまま実行することはできず、 JavaScript ファイル( .js)に コンパイル する必要があります。 TypeScriptのインストール Node.jsとnpmがインストールされている環境でnpmコマンドでインストールを実施します。 $ npm install -g typescript # Node.js, npmがインストールされていることが前提 $ tsc -v Version 4 . 5 . 4 tsc -v でバージョンが返ってくればインストールは完了です。 指定したバージョンをインストールしたい場合は typescript@4.5.4 のように@の後ろにバージョンを指定してください。 トランスパイル 先ほどもお伝えした通り、TypeScriptファイル( .ts) をそのまま実行することはできず、 JavaScript ファイル( .js)に コンパイル する必要があります。 この作業をトランスパイルと呼びます。 内容としては簡単で、作成したTypeScriptファイル(*.ts)に対して tsc コマンドを実行するだけです。 ディレクト リ直下のすべてに対して実施したい場合は、 *.ts を指定すれば可能です。 $ tsc sample.ts # sample.js ファイルが作られます。 $ tsc *.ts TS Playground ここまでTypeScriptの導入方法・実行方法を記載しましたが、TypeScriptでコードを書いて動作を確認したいだけであれば、 Microsoft が公式ページで公開している「TS Playground」を使用することをお勧めします。 (※トランスパイルも非同期でやってくれ、「.JS」タブで内容を確認できます。) www.typescriptlang.org TypeScript入門 準備が整ったので、入門編開始です。 勉強会(読書会)では、 JavaScript とTypeScriptの違いにフォーカスし型の部分を中心に読んでいるため、TypeScriptの基本的な構文の説明等は省き、型の部分に絞ってお伝えできればと思います。 TypeScriptの『型』について JavaScript では型を事前に宣言することがないので誤った型のデータを関数に渡している場合、実行タイミングになってようやくエラーであることがわかります。 しかし、TypeScriptでは型を宣言するだけではなく事前に コンパイル により型チェックを行うので、型に問題がある場合はコードを動作させる前に問題を把握することができます。 そのため、TypeScriptは「型安全な言語」と呼ばれています。 またエディタによっては型に関する問題がある場合、コードの記述中にエラーメッセージで問題がある箇所を示してくれるのでコード記述中に気付いて修正を行うことができます。 const str: string = "hoge" ; //① const str2 = "hoge" //② 上記①の string の部分は 型注釈 といい、strがstring型であることを示しています。 型注釈は②のように省略することが可能です。 なぜ省略が可能かというと、TypeScriptには 型推論 という機能があるからです。 型推論 TypeScriptには周辺情報や文脈から自動的に型を推測してくれる機能があります。 これを 型推論 と呼びます。 以下に簡単な例を示します。 let x = 100; let str = "aaa" ; x = "bbb" // xはnumber型に推論されるためエラー str = 200 // strはstring型に推論されるためエラー 想定通りに推論してくれることが多いですが、期待している型と違っているケースもあるため、推論された型が想定通りかはチェックする必要があります。 また、関数の戻り値も関数内の文脈から 型推論 してくれます。 function getAddtion(x: number, y: number) { return x + y; } 上記では引数2つの型がnumber型で、それらを足し合わせた結果を返す関数であるため、戻り値もnumber型に推論されます。 以下のように関数内の条件によって戻り値の型が変わる場合は、Union型で推論してくれます。 function numberOrString(x: number) { if (x < 10) { return String (x); } return x; } 推論結果 function numberOrString(x: number): string | number 以上のように便利でコード量も削減できるTypeScriptの 型推論 ですが、 より複雑な関数を書く時は可読性の面でも 型推論 を使わずに型を明記するようにしたほうが良いのかなと個人的には思います。 型ガード 型推論 によって型を判別してくれるのはTypeScriptの便利な機能の1つではありますが、Union型等で2つ以上の型を引数に持つ場合、型の曖昧さは残ります。 これを回避するために、以下のように条件判定で型の絞り込みを行うことが多いです。 このようなコードのことを型ガードと呼びます。 function numCut(num: number | string) { if ( typeof num === "string" ) { return num.charAt(0); } else { return String (num).charAt(0); } } Union型でnumberとstringを引数として受け付けていますが、 charAt() はstringに対してしか使用できないため、型ガードをつけずに return num.charAt(0); だけ記載するとエラーになります。 そのため、 typeof 等を使って処理する型を制限する必要があります。 「この型の時だけこの処理を行う」が実現できるのが、型ガードです。 typeof だとプリミティブ型については判定できますが、オブジェクトはobject型であることまでしか判定ができません。 typeof null の結果がobjectになるという例外的な仕様もあるため要注意です。 (object型:プリミティブ型以外の型は全てobject型に分類される) 便利だけど使わないほうがよい「any」 TypeScriptでは、仕様上定義されてはいますがTypeScriptの型の良さが失われてしまう型や関数が存在するため、その1例を紹介します。 TypeScriptのany型は、どんな型でも代入を許す型です。 プリミティブ型であれオブジェクトであれ何を代入してもエラーになりません。 let value: any; // 以下どれもコンパイルエラーにならない value = 1; value = "string" ; value = false ; 上記の通り型チェックも行われないため、どんな値を入れても コンパイル エラーにはなりません。 また、以下のように引数の型注釈を省略した場合、 型推論 によってanyと判別されるパターンもあります。 toUpperCase() はStringに対して使用できるメソッドですが、name がany型と推論され型チェックを通ってしまっています。 この関数に数値を代入するように記載をしても、any型であるため コンパイル エラーは出ず、実行時エラーとなってしまいます。 function nameToUpper(name) { console.log(name.toUpperCase()); } nameToUpper(12345); このケースは型注釈を省略せずに記載するほか、設定ファイル tsconfig. json にて noImplicitAny: true を設定することで、any型を推論した場合にエラーを表示するようにできるため、設定することをお勧めします。 any型はTypeScriptの特徴である型安全性を度外視した型になるため、書籍でも 『最凶の危険性を誇る機能』 として紹介されており、anyの使用はできるだけ避けるようにとのことです。 しかし、 JavaScript をTypeScriptで書き直す際などはいったんany型で定義して実行できる状態を作ってから型定義していくやり方がよさそうで、本コードとしては残すべきではないにしろ、開発途中では役に立ちそうだなと思いました。 補足 「unknown」 同じくどのような値も代入できる型として、unknown型があります。 unknown型は代入はなんでも可能ですが、メソッドやプロパティを使おうとすると、 Object is of type 'unknown'. というエラー文言が出て使用できません。 function nameToUpper(name: unknown) { console.log(name.toUpperCase()); } nameToUpper(1); こちらはanyを使うより安全ではありますが、メソッドやプロパティを使用できないため扱いづらいという印象が強いです。 おわりに 以上、TypeScriptの入門として主に『型』に関する内容を記載させていただきました。 これからTypeScriptの学習を考えている方の支えになれば幸いです。 勉強会はまだ続いていくので、また機会があれば得た知識を共有できればと思います。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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 です。 今回は、 ラク ス開発本部のエンジニア・デザイナーを対象に、休日・休暇の過ごし方についてアンケートを実施しました。 休日の過ごし方、何をして過ごすのか、理想の長期休暇の過ごし方などお聞きしましたので、 結果を共有させていただきます。 休日に入る前に、休日の予定を立てておく? 休日の過ごし方で、重視するのはどちらですか? 休日の過ごし方はインドア派ですか? アウトドア派ですか? 休日はどんなことをして過ごすことが多いですか?≪複数回答可≫ 理想の長期休暇(GW・夏季休暇・年末年始)の過ごし方を教えてください!(フリーコメント) 終わりに 実施時期:2022年6月末 有効回答:74名 対象者: ラク ス開発本部 エンジニア・デザイナー 休日に入る前に、休日の予定を立てておく? 「予定を立てておくことが多い」41.9%、「あまり予定を立てない」40.5%。 「毎回予定を立てておく」6.8%、「ほとんど予定を立てない」10.8%という結果になりました! 休日の過ごし方で、重視するのはどちらですか? 「心身を休める・リラックス」が55.6%と、半数以上を占める結果となりました。 次に、「楽しむ・盛り上がる」27.8%、「どちらでもない」9.7%。 「その他」には、「子ども次第」「1日の大半は子どもの勉強を見てます」「子どもが家で暇にならないように」「子どもが楽しめるか」など、家族重視の過ごし方をされる方が目立ちました。 休日の過ごし方はインドア派ですか? アウトドア派ですか? インドア派52.7%と、インドア派の方が多い傾向にあるようです。 次いで「どちらでもない」27.0%、「アウトドア派」20.3%という結果になりました。 一緒に暮らすご家族に合わせてという方も多いのかもしれませんね! 休日はどんなことをして過ごすことが多いですか?≪複数回答可≫ 「趣味をする」が最も多く64.9%、次いで「買い物」48.6%、「のんびり過ごす」47.3%という結果になりました! 4番目に多い「家事をする」は45.9%。 また、その他にご記入いただいた方は「子どもと一緒に過ごす」「子どもの学習指導」「子どもの習い事」など、お子様関係の回答がほとんどでした。 インドア派でもアウトドア派でも、充実した休日を過ごされる方が多いようです! 理想の長期休暇(GW・夏季休暇・年末年始)の過ごし方を教えてください!(フリーコメント) 最後に、GW・夏季休暇・年末年始などの長期休暇中の理想の過ごし方を聞きました! ラク スは、GW・夏季休暇・年末年始はもちろん、入社日に15日の有給休暇が支給されるなど、休暇も取りやすい環境です。 帰省 国内旅行 海外旅行 友人と出かける 趣味に没頭する コロナが落ち着いたので、2~3泊程度で妻とバスツアーなどに参加したい。 1回旅行に行って、あとは家でゲームや勉強など 最低1日は出かけずに家でのんびりする日を作る 旅館やホテルに缶詰になって読書・勉強 ご飯作りはお弁当を発注して手を空けて、子どもの教科別学習&課外学習の指導、寝かせてからは自分の趣味で DIY or - プログラム制作。家で過ごしたい。 子供と一緒に過ごす 家族とゆっくり過ごす 溜まっているタスクを消化する 最初と最後はゆっくり過ごす、中頃ぐらいに1泊2日ぐらいの小旅行 ずっとごろごろする 普段の週末と特段変わりない 非日常的なことをする 趣味に没頭し、時間を気にせず眠くなったら寝る サッカー三昧 長期休暇中は完全にオフにしたいと思います。(実際にそうしています。) 登山+プチ旅行 旅行かライブに行きます。 コロナで会えていない人に会いに行きたい ペンギンを眺める 様々な過ごし方をいただきましたが、「旅行」関係がかなり多く(重複した回答が多数ありました)、「帰省」なども目立ちました。 ここ数年旅行や帰省を控えていた方も、折を見て理想の休暇を実現できるといいですね! 終わりに 今回の質問は以上になります。 ラク スで働くエンジニア・デザイナーについて、少しでもイメージできましたでしょうか? 最後までお読みいただきありがとうございました! ◆ 関連ブログも合わせてご確認ください! ラクスの福利厚生をご紹介! ラクスのSaaSプロダクト紹介【12種類まとめ】 【株式会社ラクス】SaaSプロダクト別の技術スタックを一挙公開! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
技術広報の yayawowo です。 皆様、 SQL のDISTINCTはご存知でしょうか? DISTINCTを覚えることにより、 SQL の実行結果がとても見やすくなります! 本記事では、DISTINCTの基本的な使い方、GROUP BYとの違いなどを説明していきたいと思います。 DISTINCTをマスターし、業務効率化を目指しましょう!! ◆ PostgreSQL 関連記事 ・ 【SQL入門】INSERT まとめ ・ 【SQL入門】UPDATE まとめ ・ RDBMSとDBMSについて【初心者向け】 ・ SQLの基本【まとめ】 ・ 【RDBMS】PostgreSQLインストール・コマンド入門編 DISTINCTとは DISTINCTの使い方 DISTINCTの基本的な使い方 レコード単位に重複行をまとめる COUNTと組み合わせる GROUP BYとの違いは? DISTINCT 使い方 まとめ DISTINCTとは DISTINCTとは、 SQL コマンドの一つです。 SELECT文にて出力した実行結果の重複レコードを1つにまとめることができます。 以下、DISTINCTを使った際の実行結果例になります。 DISTINCT 🙅 動物 種類 性別 犬 柴犬 女 犬 柴犬 女 猫 マンチカン 男 DISTINCT 🙆 動物 種類 性別 犬 柴犬 女 猫 マンチカン 男 DISTINCTの使い方 では、DISTINCTの使い方をご説明します。 今回は PostgreSQL 9.6を利用し、ご説明させていただきます。 DISTINCTの基本的な使い方 まず初めに、 DISTINCTの基本的な使い方 についてです。 DISTINCTは、以下のようにSELECT文と組み合わせて使います! SELECT DISTINCT 列名 FROM テーブル名 ; ではまず、サンプルデータの作成をしていきます。 今回は、動物テーブルを使っていきます。 ◆ SQL 文 --テーブル作成 CREATE TABLE sample_animal ( animal_no integer , animal_name text, animal_breed text, animal_sex text ); --テストデータ INSERT INTO sample_animal VALUES ( 1 , ' 犬 ' , ' 柴犬 ' , ' 女 ' ); INSERT INTO sample_animal VALUES ( 2 , ' 犬 ' , ' 柴犬 ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 3 , ' 犬 ' , ' チワワ ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 4 , ' 犬 ' , ' プードル ' , ' 女 ' ); INSERT INTO sample_animal VALUES ( 5 , ' 犬 ' , ' ゴールデン ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 6 , ' 猫 ' , ' マンチカン ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 7 , ' 猫 ' , ' ペルシャ ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 8 , ' 猫 ' , ' ペルシャ ' , ' 女 ' ); INSERT INTO sample_animal VALUES ( 9 , ' 猫 ' , ' アメリカンショートヘア ' , ' 男 ' ); INSERT INTO sample_animal VALUES ( 10 , ' 猫 ' , ' ラグドール ' , ' 女 ' ); 上記 SQL 文により、動物テーブルが完成しました。 SELECT文で中身を見てましょう。 ◆ SQL 文 --全件検索 SELECT * FROM sample_animal ; ◆ 実行結果 animal _no animal_name animal_breed animal_sex 1 犬 柴犬 女 2 犬 柴犬 男 3 犬 チワワ 男 4 犬 プードル 女 5 犬 ゴールデン 男 6 猫 マンチカン 男 7 猫 ペルシャ 男 8 猫 ペルシャ 女 9 猫 アメリ カンショートヘア 男 10 猫 ラグドール 女 では動物テーブルを使い、DISTINCTを使う場合と使わない場合を比較してみたいと思います! 動物名(animal_name)を検索します。 DISTINCT 🙅 ◆ SQL 文 ---動物名(animal_name)の検索 SELECT animal_name FROM sample_animal ; ◆ 実行結果 animal_name 犬 犬 犬 犬 犬 猫 猫 猫 猫 猫 DISTINCT 🙆 ◆ SQL 文 ---動物名(animal_name)の検索 SELECT DISTINCT animal_name FROM sample_animal ; ◆ 実行結果 animal_name 犬 猫 いかがでしょうか? DISTINCTを使うことにより、重複レコードを1つまとめることができました。 動物テーブルにどんな動物がいるのか知りたい際に、とても便利です。 レコード単位に重複行をまとめる DISTINCTはレコード単位に複数行をまとめることもできます。 今回も動物テーブルを使い、DISTINCTを使う場合と使わない場合を比較してみたいと思います! DISTINCT 🙅 ◆ SQL 文 ---動物名(animal_name)、動物種類(animal_breed)の検索 SELECT animal_name,animal_breed FROM sample_animal ; ◆ 実行結果 animal_name animal_breed 犬 柴犬 犬 柴犬 犬 チワワ 犬 プードル 犬 ゴールデン 猫 マンチカン 猫 ペルシャ 猫 ペルシャ 猫 アメリ カンショートヘア 猫 ラグドール DISTINCT 🙆 ◆ SQL 文 ---動物名(animal_name)、動物種類(animal_breed)の検索 SELECT DISTINCT animal_name,animal_breed FROM sample_animal ; ◆ 実行結果 animal_name animal_breed 猫 ラグドール 犬 柴犬 犬 チワワ 猫 ペルシャ 猫 アメリ カンショートヘア 猫 マンチカン 犬 ゴールデン 犬 プードル ※ 並び順についての注意点🚨 DISTINCTを使用する際、内部でソートしてから重複を削除するという処理が働くため並び順がおかしくなります。 もし並び順を整えたい場合は、ORDER BYを使った構文に書き換えてください。 COUNTと組み合わせる 次はひと手間加えて、レコード件数の取得をやってみましょう! レコード件数の取得は、DISTINCTとCOUNTを使って記述します。 まず初めに、 DISTINCTする列が1つの場合にのみ有効な取得方法をご紹介 します。 COUNT 🙅 ◆ SQL 文 ---動物名(animal_name)の検索 SELECT DISTINCT animal_name FROM sample_animal ; ◆ 実行結果 animal_name 犬 猫 COUNT 🙆 ◆ SQL 文 ---出力結果の件数検索 SELECT COUNT ( DISTINCT animal_name) FROM sample_animal ; ◆ 実行結果 count 2 次に、 DISTINCTする列が複数の場合に有効な取得方法をご紹介 します。 動物名(animal_name)と動物種類(animal_breed)の検索を例とします。 CONCATを使い列と列を繋ぎ合わせ、重複レコードを1つにまとめてます。 まずは、COUNTを使わない場合の SQL 文と実行結果を見てみましょう。 COUNT 🙅 ◆ SQL 文 ---CONCATを使った検索 SELECT DISTINCT CONCAT (animal_name,animal_breed) FROM sample_animal ; ◆ 実行結果 count 猫 マンチカン 犬チワワ 犬プードル 猫 アメリ カンショートヘア 犬柴犬 猫 ラグドール 猫 ペルシャ 犬ゴールデン 上記実行結果の通り、動物名(animal_name)と動物種類(animal_breed)が結合され、重複レコードもまとめられた状態で取得されました。 では次に、この取得結果の件数を確認するため、COUNTを使ってみましょう。 COUNT 🙆 ◆ SQL 文 ---出力結果の件数検索 SELECT COUNT ( DISTINCT CONCAT (animal_name,animal_breed) ) FROM sample_animal ; ◆ 実行結果 count 8 出力結果の件数を確認することができました。 GROUP BYとの違いは? DISTINCTと同様、重複レコードを削除する際にGROUP BYを使用するケースもあります。 違いは以下の通りです。 DISTINCT ・・・重複レコードを排除した形で結果を出力 GROUP BY・・・グループにまとめた結果に対し、何らかの処理を加え出力 SQL 文、実行結果の違いも以下にまとめておきます。 DISTINCT 🙆 DISTINCTを使った例は以下の通りです。 ◆ SQL 文 ---DISTINCTを使った検索 SELECT DISTINCT animal_name FROM sample_animal ; ◆ 実行結果 animal_name 犬 猫 GROUP BY 🙆 上記DISTINCTの実行結果と同じ取得も、GROUP BYでできます。 ◆ SQL 文 ---GROUP BYを使った検索 SELECT animal_name FROM sample_animal GROUP BY animal_name ; ◆ 実行結果 animal_name 犬 猫 では、犬と猫のカウントをしたい場合はどうすればよいでしょうか? このように、グループにまとめた結果に対し、何らかの処理を加え出力したい場合はGROUP BYを利用します。 DISTINCTでは、何らかの処理を加えての出力はできません。 ◆ SQL 文 ---GROUP BYを使った出力件数の検索 SELECT animal_name, COUNT (animal_name) FROM sample_animal GROUP BY animal_name ; ◆ 実行結果 animal_name count 犬 5 猫 5 実際、DISTINCTを使う頻度は高くないと思います。 しかしがなら、レコード単位に重複行を簡単にまとめたい!と思った際に簡単に活用することができます。 DISTINCTとGROUP BYのどっちを書けばよいか悩んだ際は、実行計画や実速度を比較して適切な選択をいただけますと幸いです。 DISTINCT 使い方 まとめ DISTINCTの使い方はいかがでしたでしょうか? DISTINCTは、SELECT文を利用する際に重複レコードを1つにまとめることができるため、覚えておくととても便利な構文です。 今回初めて使った方や、使い方を忘れてしまった方にとって、本内容が少しでもご参考となれば幸いです。 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
技術広報の yayawowo です。 いつも ラク スのエンジニアブログをお読みいただき、ありがとうございます! 今年度2回目となる ラク スMeetupは、 『 SaaSプロダクト開発をリードするデザインとフロントエンド 』 でした! テーマは『UIデザインとフロントエンド』です。 当社の現場最前線のエンジニア/デザイナーから普段の活動や開発・運用で得た知見などの技術情報をお届けしました! なお、本イベントは以下のような方にオススメとなっております。 ◆ こんな方にオススメ! ・UIデザインチーム、フロントエンドチームに興味がある方 ・息の長いシステムの リファクタリング を検討している方 ・ビジネスサイドへの提案を始めようとしている方 ・フロントエンド、バックエンド分離を予定している方 ・ SaaS 開発に携わるエンジニア/デザイナーの話が聞きたい 発表の紹介 プロダクトデザイン組織の新しい取り組み 既存システムのフロントエンド・バックエンド分離 7月開催!おすすめ技術イベント ラクスのエンジニア/デザイナーと話をしてみたい方へ 終わりに 発表の紹介 それではここから各発表内容と資料を共有させていただきます! イベントの詳細は以下をご確認ください。 rakus.connpass.com プロダクトデザイン組織の新しい取り組み 登壇:小野田 純也 [所属:プロダクトデザイン課/担当プロダクト: 楽楽電子保存 、 楽楽明細 、 楽楽労務 ] speakerdeck.com 1本目は、小野田さんより『プロダクトデザイン組織の新しい取り組み』をご紹介いただきました! プロダクトデザイン課のミッションである「プロダクト開発の中心となって顧客課題を解決する優れたUXを生み出す」のもと、組織横断チームとして ラク スの様々なプロダクト開発に積極的に関わっています。 以下について、発表いただきました。 プロダクトデザイン課についての紹介(ミッション・ビジョンについても紹介) 新サービス開発における、共通UIライブラリを用いたデザイン作成とFEとの関わり(楽楽電子保存) ペルソナ設定の取り組み(ChatDealer) 改善のためのユーザーインタビュー実施(配配メール ) ◆ ラク スのデザイン情報については、以下をご確認ください! career-recruit.rakus.co.jp 既存システムのフロントエンド・バックエンド分離 登壇:関 淳志 [所属:フロントエンド開発課/担当プロダクト: ChatDealer ] speakerdeck.com 2本目は、フロントエンド開発課の関さんによる発表です。 ChatDealerでは、Laravelを採用しております。 その中でもviewは、フロントエンドとバックエンドのコードが混在し密結合になっており、開発する上で様々な問題が出てきました。 本発表では、それらを改善するべくフロントエンドとバックエンドの ソースコード 分離を行うことを決意し、提案から実装に至るまでの過程についてお話ししました。 フロントエンド/バックエンドを分離しようと考えた経緯 ビジネスサイドへの提案 ソースコード 分離の実施 ソースコード の分離を行い、見えてきた今後の課題  7月開催!おすすめ技術イベント ラク スでは、定期的にエンジニア/デザイナー向けの技術イベントを開催しております。 その中でも7月に開催する、技術イベントをご案内いたします。 ◆ エンジニアの勉強法ハックLT- vol.9 techplay.jp ◆ おすすめの技術書 LT会 - vol.4 techplay.jp ◆ 【 ラク スDev Team Talk 】小さく試して大きく育てるチームづくり techplay.jp ◆ 開発×テスト LT会 - vol.3 techplay.jp ◆ エンジニアリング組織あれこれLT techplay.jp ◆ 【 ラク スDev Team Talk 】急成長プロダクト組織のマネジメント強化 techplay.jp ◆ UI/UXデザイナーLT会 - vol.8 techplay.jp ◆ リファクタリング LT 〜毎日こつこつちょっとずつ〜 techplay.jp 1つでもご興味があるものがございましたら、お気軽にご参加ください! 採用イベントも開催中!こちらも合わせてご確認ください。 ・ 7/22(金) UIデザイナーの仕事紹介/カジュアル説明会 ・ 7/26(火) フロントエンドエンジニアの仕事紹介/カジュアル説明会 ラク スのエンジニア/デザイナーと話をしてみたい方へ 当社では、一緒に働くエンジニア/デザイナーを積極的に募集しております! 現在募集している職種は、以下の通りです。 ◆ UIデザイナー career-recruit.rakus.co.jp career-recruit.rakus.co.jp ◆ Webデザイナー career-recruit.rakus.co.jp ◆ フロントエンドエンジニア career-recruit.rakus.co.jp career-recruit.rakus.co.jp 「まだ応募する段階では…」 という方は、是非 カジュアル面談 もご検討ください! 【こんな方におすすめ】 ポジションが経験にマッチするか確認したい 働き方/環境・体制/事業・プロダクト/文化/制度を詳しく知りたい 応募前に選考の概要を聞きたい(人物像、基準など) エンジニア・デザイナーの人となりを知りたい 以下申込フォームとなります。 rakus.hubspotpagebuilder.com 「イベントで登壇していた●●さんと話してみたい・・・」 などご要望がありましたらその旨をご記入の上、お申込みください! お気軽にどうぞ 😊 終わりに 『 SaaS プロダクト開発をリードするデザインとフロントエンド』はいかがでしたでしょうか? 最前線で活躍しているエンジニア/デザイナーからプロダクトデザイン組織の取り組みや、 フロントエンドとバックエンドの分離体験を発表させていただきました。 SaaS 開発に携わるエンジニア/デザイナーの皆様が、一つでもご参考になる情報がありましたら幸いです。 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
こんなことをお話しします 参加申込方法 ◆TECH PLAY これまでの「組織・チーム作り」発表まとめ ラクスの開発組織戦略 横断チーム立ち上げ 人材育成・学習 こんにちは、技術広報のnobu_msです。 皆様のエンジニア・デザイナー組織では、チームビルディングを行っていますか? 今回 ラク スでは、開発組織(エンジニア・デザイナー)のチーム作り事例を紹介するイベント「 ラク ス Dev Team Talk 」を開催します! こんなことをお話しします プロダクトフェーズにあわせた組織づくり 技術 ブランディング ・コミュニティづくり 開発プロセス や プロダクトマネジメント 育成・オンボーディングの取り組み 成長・学習機会の提供 マネジメントの仕組化 業務効率化 など 参加申込方法 イベントに参加したい!という方は、TECHPLAYからお申込みをお願いします! ◆TECH PLAY ・7/11(月)19:00~ 【 ラク スDev Team Talk 】デザインチーム 業務とマネジメントの「仕組化」をキーワードにデザイン専門組織の取り組みを紹介! techplay.jp ・7/19(火)19:00~ 【 ラク スDev Team Talk 】小さく試して大きく育てるチームづくり 開発プロセス 、エンジニア文化、組織づくりなど、関西発のさまざまな事例を紹介! techplay.jp ・7/25(月)19:00~ 【 ラク スDev Team Talk 】急成長プロダクト組織のマネジメント強化 導入件数年間170%成長の楽楽明細。開発体制強化・組織再編の取り組みを紹介! techplay.jp 各回とも最前線のエンジニア リングマ ネージャー、デザインマネージャーが参加。 さまざまな現在進行形の取り組み事例をざっくばらんにご紹介します。 情報交換、質問、交流機会として是非お気軽にご参加ください! イベントでお会いできることを楽しみにお待ちしております! これまでの「組織・チーム作り」発表まとめ ラク スのイベントでは定期的に、エンジニアやデザイナーが組織戦略やチーム作りをテーマに発表しています! ここではその一部をご紹介します。こちらも是非ご覧ください! ラク スの開発組織戦略 speakerdeck.com speakerdeck.com speakerdeck.com 横断チーム立ち上げ speakerdeck.com speakerdeck.com 人材育成・学習 speakerdeck.com speakerdeck.com エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめまして。 顔の濃さが唯一の アイデンティティ のインフラエンジニア、m_yamaです。 ラク スに入社して1年、関わっている2つのサービスでTerraformをよく触ってるので、まとめてみました。 この記事さえ読めば、きっとあなたもTerraform中級者です。 (ちょっと盛った) (自分が中級者みたいでおこがましい) (精進します) 目次 目次 Terraformとは ざっくり理解するTerraformの全体像 Terraformの参考コード(EC2編) リソースをコード化するメリットって? AnsibleやChef、Puppetとの違い Terraformの使い方 基本的にはこの2つ「plan」「apply」 既存リソースをTerraform管理する「import」 なにをTerraform管理しているかを確認する「state list」 Terraformの3大便利ツール 1. 既存環境を楽にTerraform管理する「Terraformer」 2. GUIでTerraformコードを生成できる「former2」 3. profile変更が楽になる「direnv」 まとめ Terraformとは Terraformは、いわゆる IaC(Infrastracture as Code) を体現するツールの一つで、インフラ環境をコード化できるスグレモノです。 たとえば、複数のEC2を同じ設定で起動する必要があったり、他人が作ったEC2のコピーを作る場合、「 そんなとこ気付かねえよ! 」みたいな、奥底で設定された値を間違えてサーバを作り直す、なんて経験をしたことがあると思います。 (EC2のパブリックIPの自動割り当てにチェックを入れずに作成してしまい、 yum updateができずに泣く泣く作り直す、なんてことは良くあります) EC2のアクションを見ていくと、「 インスタンス の設定」や「セキュリティ」など、ひとつのEC2につき 設定ページへのリンクが32個 もありました。 全部設定する必要はないものの、全部のリソースの全ページを確認してたら日が暮れます。 Terraformでコード化していれば、コマンドぽちでポコポコ同じ設定のEC2が立ち上がるので、同じ設定が簡単に再現できます。 そのほか、 以下のようなメリット があります。 テスト環境・ステージング環境・本番環境など、どれか一つあればほかの環境の構築が簡単 試験的に設定を変更しても、すぐに元に戻せる(性能試験がしやすい) 間違えて削除してしまったリソースを、同じ設定ですぐに復元できる AWS は GUI がガラッと変更されて戸惑いやすいが、コード化されてれば関係ない ※ AWS を例に出していますが、 GCP やAzure、オンプレまでいけちゃうマルチなツールです。 ざっくり理解するTerraformの全体像 Terraformは、EC2などのリソースをコード化して、「 tfstate 」というファイルに反映することでリソースの管理をします。 ※ tfstateファイルはリソースのメタ情報など全てが記載されたファイルなので、ローカルではなく S3などに保管し、さらにバージョニングしておくと安心 です。 Terraformを実行する大まかな流れは以下の通りです。(各Terraformコマンドは後述します) EC2などのリソースをコード化する(*.tfファイルを作成する) コード化したリソースが、 すでにある場合:TerraformimportすることでTerraform管理下に置かれる(tfstateに追記する) ない場合:Terraformapplyすることでリソースを作成し、Terraform管理下に置かれる 以下、リソースを変更する場合は、コードを編集してTerraformplanで確認し、Terraformapplyで反映する(+ tfstateファイルの更新) Terraformの参考コード(EC2編) 参考までに、EC2のTerraformコードを書いてみました。 例えばこの場合、 以下のようなメリット があります。 amiを明記することでバージョンを統一でき、バージョン違いによる微妙な挙動の違いを防げる stagingなど別環境を作る際、PrivateIPの ホスト部 を統一しやすい(IPから中身がイメージしやすくなる) EC2やEBSで忘れがちなタグのNameを設定できる コード化することで、以下のように「あのサーバの設定なんだっけ、どこで設定してたっけ」のような無駄な時間がなくなり、 リソースの管理や開発の効率が高まります 。 resource "aws_instance" "test-server-01-example-co-jp" { ami = "ami-xxxxxx" availability_zone = "ap-northeast-1a" ebs_optimized = true instance_type = "t3.small" monitoring = true key_name = "key-pair-name" subnet_id = aws_subnet.id vpc_security_group_ids = [aws_security_group.test-server-sg.id] private_ip = "10.10.1.5" root_block_device { volume_type = "gp3" volume_size = 100 delete_on_termination = true tags = { Name = "test-server-01.example.co.jp" } } tags = { "Name" = "test-server-01.example.co.jp" } } リソースをコード化するメリットって? リソースをコード化してgitなどでバージョン管理すれば、 レビューで認識齟齬がないことを確認しやすい 同一リソース・別環境の複製(test、staging環境など)が容易 コミットログから過去の変更時期や意図を確認しやすい ブラウザでの操作のように、設定変更ページを探す必要がない 一時的に手動で変更した設定の戻し忘れに気付きやすい(手動変更するなという話ですが) など、メリットがたくさんあります。 AnsibleやChef、Puppetとの違い IaCの文脈で同列に語られがちなAnsible・Chef・Puppetは、 サーバの「中」の設定をコード化するツール になります。 たとえば、OSユーザーの追加だったり失敗すると怖いsudoersとかだったり、Nginxや各種 ミドルウェア などのインストールなどがコード化できます。 Terraformは、サーバそのものや、ネットワーク、ストレージなどの サーバの「外」をコード化するツール なので、TerraformとAnsible等を上手く使い分けることで、環境構築や既存環境の改修がとても楽になります。 ※ Terraformでも、起動時のテンプレートを設定できたりしますが、Ansible等の方が柔軟性が高く使い勝手がいいです。餅は餅屋。 Terraformの使い方 公式サイト からダウンロードして、 GetStarted するだけ。 yum install(apt install)したことがあるなら一瞬です。 ※ 結構バージョンアップが早く、それによる破壊的な変更があったりするので、バージョンや更新情報に気を使う必要はあります。 よく使う、基本的なTerraformコマンドの一部を紹介します。 基本的にはこの2つ「plan」「apply」 一番使うコマンドは、きっと terraform plan だと思います。 コードを編集して、意図した変更になるかを確認するときに使います。 plan で確認した後、実際反映するのは terraform apply コマンドになります。 applyコマンドで 意図せぬ変更をしてしまうと戻せない(作り直す必要がある)場合もある ので、必ずterraform planコマンドを打って確認する必要があります。 既存リソースをTerraform管理する「import」 既存のリソースをTerraformで管理する場合に必要になるのが、 terraform import コマンドです。 たとえば、さきほど紹介したコード化したEC2が存在していて、Terraform管理されていない場合、そのままapplyコマンドを実行すると、その設定のEC2を新規作成しようとします。 importコマンドを実行することでコードとリソースが紐づき、Terraform管理できます。 $ terraform import aws_instance.test-server-01-example-co-jp i-xxxxxxxxxx(インスタンスID) なにをTerraform管理しているかを確認する「state list」 管理するリソースが増えてくると、今Terraformで何を管理しているのかを一覧で見たいタイミングも出てくると思います。 そういったときに、 terraform state list コマンドを使うことで一覧出力できます。 grep で特定のタイプのリソースに絞ったり、全体を俯瞰するときに便利です。 $ terraform state list aws_instance.test-server-01-example-co-jp aws_security_group_rule.test-server-sg aws_vpc.test-01-vpc ... ... Terraformの3大便利ツール Terraformを使い始めて1年ぐらいたち、いろいろ便利なツールも見つけたのでまとめて紹介します。 1. 既存環境を楽にTerraform管理する「Terraformer」 先ほどEC2をコード化しましたが、あれを全部手書きするのはあまり現実的ではありません。 既存リソースをコード化するなら、 Google ( GCP )が開発する Terraformer というツールを使うのが便利です。 以下のようにコマンドを実行すると、既存リソースからコードを作成してくれるので、ほとんど自分でコードを書く必要がありません。 $ terraformer import aws --resources=ec2_instance ... # いろいろ作成される $ ls generated/aws/ec2_instance/ instance.tf outputs.tf provider.tf terraform.tfstate $ cd generated/aws/ec2_instance/ $ terraform init $ terraform plan ※ ↑のように、作成された ディレクト リに移動してTerraform planを実行すると、コード通りのEC2を作成しようとします。 先述した「terraform import」でコードとリソースを紐づけることで、既存のリソースをTerraform管理できます。 2. GUI でTerraformコードを生成できる「former2」 Terraformerは cli での操作なので、慣れない人は使いにくいかもしれません。 そういう方には、 GUI で既存リソースをコード化できる「former2」がおすすめです。 以下の画像のようにリソースを選択でき、Generateボタンを押すだけでまとめてコードを作成できます。 (作成後のコードは載せませんが、↑で書いたようなコードが自動で作成されます) former2.com ブラウザにcredentialsを登録することで、ボタンポチポチで欲しいリソースをコード化できます。 安全性が気になるところですが、 AWS 公式ブログでも以下のように紹介されています。 Former2 is designed never to send these credentials to an external server that isn’t an AWS API endpoint.   引用元: Accelerate infrastructure as code development with open source Former2 ブラウザにcredentialsを登録することに抵抗がある方(ほとんどの人はあると思いますが)は、docker-composeでローカルにホストする方法もあるので、検討してみる価値はあると思います。 dev.classmethod.jp 3. profile変更が楽になる「direnv」 複数サービスのTerraformを管理していると、確認のために実行した aws cli コマンドでprofileの切り替えを忘れて、別のサービスのprofileのまま実行してしまうことがあると思います。 direnvを使うことで、 ディレクト リと AWS PROFILEを紐づけられます。 これにより、 ディレクト リを移動するだけでPROFILEを切り替える ことができ、PROFILEの切り替え忘れを防げます。 github.com 実際に試してみます。 (※ 設定方法は上記の github を参照してください) たとえば、以下のように、複数サービスを管理しているとします。 works ├── serviceA │   └── .envrc └── serviceB ├── .envrc └── .envrc_prod 以下は実際に操作した画面になります。 ※ 前提: direnvを使って、各サービスの ディレクト リで.envrcを作成していること ① serviceA ディレクト リに移動すると、serviceA/.envrcが自動で読み込まれて、 AWS_PROFILE=serviceA-test がセットされます。 ② そこからserviceBに移動すると、serviceB/.envrcが読み込まれ、 AWS_PROFILE=serviceB-test がセットされます。 ③ また、serviceB/.envrc_prodのような本番用のPROFILEファイルを作成し、sourceで明示的に読み込めば、本番用の AWS_PROFILE=serviceB-prod に切り替わります。 基本的にはtest用PROFILE、必要なときのみ本番用PROFILEを読み込む、といった使い方ができて便利です。 (promptが設定されてると、本番系( -prod など)のPROFILE名だと色が変わって、すぐにわかるのもありがたいです) ④ direnvで設定されていない ディレクト リに移動すると、 環境変数 がunsetされるのも安心です。 まとめ Terraformと便利ツールについてまとめてみました。 Terraformを使いこなせれば、リソースの管理がとても楽になるので、まだの方はぜひ試してみてください。 もっと体系的に学びたい、という場合は、以下の書籍がおすすめです。 実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing)) | 野村 友規 | 工学 | Kindleストア | Amazon エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは。 ラク ス技術広報のLandh6です。 今回は、就職活動の上でも社員にとっても重要な、 ラク スの「福利厚生」についてご紹介します! 昨今、 ワークライフバランス やワークスタイルを重視する傾向もあるように思います。 社員が安心して働ける環境、心身の健康、モチベーションやパフォーマンスを維持するうえでも大切な要素の一つです。 ここでは福利厚生を分類、列挙しながら、 ラク スにどのような「福利厚生」があるのか見ていこうと思います。 福利厚生とは 福利厚生は大きく分けると2種類 ラクスの福利厚生紹介 通勤関連 交通費支給 特別休暇関連 入社日に有給付与  シックリーブ  慶弔休暇  ライフサポート ドリンク/スナック/ランチサポート お弁当の注文 ラクスマイル制度 マンスリーシフト タイムリーシフト制度  家族手当 ベビーシッター補助制度 資格取得サポート 書籍購入・貸出サポート 財産形成 従業員持株会 文化・レクリエーション関連 サークル活動補助 コミュニケーションサポート 社員総会 終わりに 福利厚生とは 福利厚生とは、企業が労使関係の安定などの効果を期待して、任意あるいは法的に従業員に提供する諸施策のことです。 従業員やその家族の福祉のために、行われている取り組みを指します。 福利厚生は大きく分けると2種類 法定福利厚生 ……法律によって実施が義務付けられている福利厚生 例えば…健康保険/厚生年金/ 介護保険 /労働保険 など ※必ず導入する必要があります。 法定外福利厚生 ……法律では義務化されておらず、企業が任意で制定している福利厚生 例えば…住宅関連/慶弔関係/医療・健康/ライフサポート 等 ※各企業が自由に設定することが可能なので、法定外福利厚生の種類は多岐にわたります。 ちなみに、福利厚生の対象者は、全ての従業員です。 (2020年4月1日に改正・施行「パートタイム・有期雇用労働法」「労働者派遣法」) ラク スの福利厚生紹介 ということで、ここでは健康保険/厚生年金/ 介護保険 /労働保険等の「法定福利厚生」ではなく、各企業が自由に設定することができる「法定外福利厚生」をご紹介していきます! ラク ス従業員の働きやすさを高めるため、ここ数年どんどん改正されており、今後もよりよい福利厚生にかかる制度の拡充をしていきます。 通勤関連 交通費支給 上限10万円/月 特別休暇関連 ラク スでは、完全 週休二日制 (土・日)となっており、その他祝日、年末年始休暇、夏季休暇があります。 有給休暇消化率は、80%を超えている状態です。 入社日に有給付与  入社と同時に15日の有給休暇が付与される制度です。 シックリーブ  本人や家族が私傷病となった場合最大、5日間の休暇を付与する制度です。 これにより、私傷病への不安のために 年次有給休暇 を一定日数残すことなく計画的な取得を促進します。 慶弔休暇  例:結婚時7日間の休暇付与する制度です。 ライフサポート ドリンク/スナック/ランチサポート リフレッシュをしたいとき、コーヒーや紅茶など約20種類のドリンクを無料で飲むことができます。 また、低価格で購入できるスナックコーナーや、昼食の弁当注文サービスなどがあり、社員に好評です。 お弁当の注文 日替わり弁当を購入することができます。 当日の朝に注文ができるため、その日の気分でお弁当を選ぶことができます。 ※東京のみ ラク スマイル制度 子育て世代のための選択型就労制度です。 保育園の送り迎えに合わせて出勤・退勤時刻を前後にずらしたり、評価基準を時短勤務に合わせたスタイルに変更するなど、 ワークライフバランス に合わせた柔軟な働き方が実現できます。 マンスリーシフト 「1ヶ月単位」で始業時間を選択できる制度です。 始業時刻を8時から10時まで(30分単位5パターン)選択可能です。 タ イムリ ーシフト制度  「1日単位」で始業時間を変更できる制度です。 各自の始業時刻の前後最大1時間(30分単位5パターン)で変更可能です。 家族手当 18歳未満の子どもの人数に応じて支給されます。 子1人3万円/月 子2人5万円/月 子3人6万円/月 ※役職者を除く ベビーシッター補助制度 小学校3年生までのお子様がいる社員を対象に、ベビーシッター利用時に割引が受けられる制度です。 資格取得サポート 業務上必要となる資格を取得する際には、受験費用を会社が補助します。 ※事前承認が必要です。 書籍購入・貸出サポート 業務上必要となる書籍の購入や、社内にある書籍の貸し出しをします。 ※事前承認が必要です。 財産形成 従業員持株会 持株会を通じて自社株を定期的に購入することで社員の資産形成をサポートします。 自社株購入時には奨励金を支給します。 文化・レクリエーション関連 サークル活動補助 ラク ス社員によるサークル活動がさかんに行われています。 サークル活動は、 ワークライフバランス の充実や、社員同士の信頼関係の構築に役立っています。 現在は、20を超えるサークルが各拠点で活動中です。 コミュニケーションサポート 社員同士のコミュニケーションを活性化させて業務の円滑化を図ることを目的に、懇親会費用の補助を行っています。 社員総会 会社全体の動向を知る機会として、各事業の総括や今後のビジョン、戦略などを全社員に共有する場を年に一度設けています。社長賞などの社員表彰も行われます。 終わりに いかがでしたでしょうか? ラク スの福利厚生は、今回挙げたもの以外にも、状況に応じて随時更新されている最中です! 少しでも興味持っていただけましたら、カジュアル面談等も実施しておりますので、ぜひ福利厚生について直接社員に聞いてみてください! 最後までお読みいただきありがとうございました! ◆ 関連ブログ - ラクスのSaaSプロダクト紹介【12種類まとめ】 - 【株式会社ラクス】SaaSプロダクト別の技術スタックを一挙公開! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
初めまして。QA担当のBell_Treeです。 今回は ウォーターフォール モデルについて実体験も交えて説明しようと思います。 はじめに ウォーターフォールモデルとは ウォーターフォールとアジャイルの違い アジャイル開発とは ウォーターフォールとアジャイルの違い ①スケジュール管理のしやすさ ②仕様の柔軟性 ウォーターフォール開発の実体験談 どのような流れでやっていたか 実際の経験を通して 自社サービスと請負案件の違い まとめ はじめに 本記事では ウォーターフォール モデルについて、実体験を交えて説明させていただきます。 あくまで私個人の体験になりますので、全部が全部こういったものではないということはご理解いただけますと幸いです。 ウォーターフォール モデルとは ウォーターフォール モデルについて、簡単に説明させていただきます! ウォーターフォール の開発作業工程は以下の通りです。 1.要求定義(要求仕様)   ↓ 2.外部設計(概要設計)   ↓ 3.内部設計(詳細設計)   ↓ 4.開発(プログラミング)   ↓ 5.テスト   ↓ 6.運用 上記のように各工程を1から順番に上から下へと流れていく様子が"滝"のようであることから、 " ウォーターフォール "と呼ばれています。 ウォーターフォール は基本的に工程を飛ばして開発を進めることはなく、各工程きっちり段階を踏んで次の工程へと進んでいきます。 仕様の考慮漏れなどイレギュラーな事態がない限りは、前の段階へ戻ることはありません。 ウォーターフォール と アジャイル の違い アジャイル 開発とは アジャイルソフトウェア開発 - Wikipedia より一部引用させていただきますと、 アジャイル ソフトウェア開発は人間・迅速さ・顧客・適応性に価値をおくソフトウェア開発である( アジャイル ソフトウェア開発宣言)。 すなわち自己組織的なチームが対話の中で方向性・仮説を見出し、顧客へ価値を素早く届け、実践投入の学びから素早く改善をおこなう在り方に価値を置く。 というような説明がされています。 もう少しざっくり説明すると・・・ 『ユーザーストーリー単位で仕様の調整や実装、テストの実施を柔軟に行っていく開発手法』 になります。 ウォーターフォール と アジャイル の違い ①スケジュール管理のしやすさ ◆ ウォーターフォール ウォーターフォール は、おおよその工程や納期などが決まっているので、納期に合わせてどの工程がいつまでに終わって、この工程はいつまでに始めないと!のような予定が立てやすいのが特徴です。 ◆ アジャイル 開発単位が小さく柔軟に対応できる反面、試行錯誤を繰り返して行うこともあるため、スケジュール管理が難しい部分があります。 ただし、 トレードオフ スライダーにより「品質」「予算」「納期」「スコープ」の優先順位が定まっている場合は、「スコープを調整することによりスケジュール遅延を発生させない」等、定めた指針によって関係者で擦り合わせを行うことができます。 ②仕様の柔軟性 ◆ ウォーターフォール どのような製品にしたいか? 仕様を上流工程の段階で決め、その仕様に則って開発を進めていきます。 そのため、決められた仕様での開発となるため、柔軟性には欠けます。 ◆ アジャイル ある程度の仕様が定まっている状態でも、開発途中などに「やっぱりこっちの方がいいんじゃない?」のような意見があった場合に、より良い方に転換できる柔軟さがあります。 ただし、仕様がコロコロ変わることでドキュメントの最終着地点が曖昧になりやすい面もあります。 【イメージしてみよう】 脈絡もなく、 ウォーターフォール と アジャイル の違いをガ〇ダムのプラモデルで例えてみようと思います。             例えばですが、A君がガ〇ダムのプラモデルを買ったとします。 決められた仕様(=設計書)に沿って組み立てていけば、仕様通りの製品ができあがりますよね? つまり、 ウォーターフォール ガ〇ダムの完成です! 話は変わり、B君、C君、D君によるプラモデル同好会にE君より「こういうコンセプトのガ〇プラを作成して欲しい」と依頼がありました。 B君、C君、D君はコンセプトを基にどのようにしたらクライアントであるE君が満足するか話し合いました。 また、逐一E君に作業進捗を報告し、試作物を見せ、E君からは「こういうのもかっこいいけど、こういう風にしたらよりかっこいいかも!」と意見を貰ったりしました。 そうやって、試行錯誤を繰り返しE君が納得のいく物を作成しました。 「ガ〇プラは自由だ!」と言わんばかりのオリジナルガ〇プラ、 アジャイル ガ〇ダムの完成です! ...イメージできましたでしょうか?(笑) 上記のように決められた仕様で作成するものが ウォーターフォール っぽく、よりこっちの方がかっこいいのではと仕様を変更したりできるのが アジャイル っぽいということを"仕様の柔軟性"の部分に絞ってお伝えしたかったです。 ...というのと、私がただただガ〇プラで例えられないかなと思い付きで書いた次第ですので、超個人的な解釈となります! ◆ 関連ブログ ・ 【アジャイル開発とは】ウォーターフォールとの比較・スクラムから見えてくるもの ウォーターフォール 開発の実体験談 ここからは私が前職で実際に体験してきた ウォーターフォール での開発ってどういう感じなの? などを記載していきたいと思います。 私は前々職で ウォーターフォール 開発を7年、前職で スクラム 開発を2年ほど経験してきました。 今回は前々職での経験を基に記載させていただきます。 どのような流れでやっていたか 主に受託業務を行っている会社に勤めていたため、大まかに下記のような流れでやっていました。 ※記憶が少し曖昧なので、本当に大まかなものとなっております。 ①営業さんから開発チームに見積もりや資料作成の依頼あり→顧客に提出             ↓ ②案件受注             ↓ ③顧客に納品時期確認、見積もりとも照らし合わせながら大まかな WBS を作成  ※要件定義次第では想定外の内容が飛び出してくることもあるので、 WBS のFixは④の後などに設定             ↓ ④顧客と要件定義の MTG を何度か実施し、要件を固める             ↓ ⑤要件定義書を基に設計書を作成             ↓ ⑥設計書を基に開発( 単体テスト 含む)、テスト仕様書を作成             ↓ ⑦ 結合テスト を実施→不具合が出たら修正/修正確認             ↓ ⑧顧客側にて受入試験→不具合が出たら修正/修正確認             ↓ ⑨顧客OKが出たら、必要なドキュメント類をまとめ納品             ↓ ⑩(話があれば)運用保守 実際の経験を通して 【スケジュールについて】 スケジュールを組み、その通りにタスクをこなしていけば、基本的には平和に終われるのが ウォーターフォール の良いところです。しかし、そう簡単には上手くいかない場合もあります... 例えば、機能の実装フェーズにおいて機能の実装が難航した場合にスケジュールに遅れが発生するとします。 そうなると、 結合テスト のフェーズにツケがまわってくるので、かなりせかせかとテスト実施をしないといけないという状況がありました。 また、設計書を基に試験仕様書を作成していたのですが、確認しないといけない項目のボリュームが大きくなり、想定以上の 工数 を要することもありました。 そういった場合は、早めに増員願いをマネージャーなどに相談して対応しておりました。 学びとしては納期はきっちり意識しつつも、余裕をもったスケジュールを組み立てることが大事ですし、アラートは早めにあげられるに越したことはないと思いました。 バッファはなんぼあってもいいですからね(笑) 【要件定義段階にて】 おおよそ、要件定義前の見積もり時に顧客が実現したいことなどの資料があったのですが、要件定義を進めていくうちに新しい情報が出たり、そもそもの実現したいことの難易度が変わったりというのが割とありました。 そのため、要件定義が終わる段階で完全に要件がFixしたら再度見積もりをするのが吉です。 また、スケジュールに関しても大幅に修正が必要な場合は顧客に明確な理由を伝え、リスケすべきです。 でないと、実際に作業が始まった際に地獄がじわじわと広がっていきます...(笑) 自社サービスと請負案件の違い 一つ目は、無理のないスケジュールとなっていることです。 私は弊社の某サービスに関わっているのですが、弊社に入社して実際にリリースまでの流れに携わっての感想が「スケジュールに余裕があるから大変と感じない」というものでした。 ※私個人のタスク量からの個人の感想となります。 ※後述とはなってしまいましたが、私が現在携わっている某サービスは ウォーターフォール モデルにて開発を行っております。 また、作業内容も決まっているため、それに沿って作業を進めていけば、毎回大幅にぶれるということがありません。 二つ目は、融通が利きやすいと思います。 自社サービスですので新規バグではない既存バグが発見された場合、顧客影響が低いものであれば今回リリースするバージョンでは修正せず、後続のバージョンで修正することができるのが請負案件との違いだと思います。 基本的に上流工程での内部調整となりますので、自社内で完結できるのは自社サービスでの開発のメリットかと思います。 まとめ ここまで読んでいただきありがとうございます。 今回は私の経験も交えて、 ウォーターフォール について記述させて頂きました。 大まかに ウォーターフォール がどのようなものなのかを、イメージできるものになっていれば幸いです! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
技術広報の飯野です。 ラク スでは今年4月に11名のエンジニアが新卒入社しました。 入社後2ヶ月半は講師のもとで研修を行い、研修を経た後に配属となります。(今年度の研修はオフラインでの開催となりました!) 6/28に研修の集大成となる「技術研修発表会」が行われましたので、本投稿にて紹介させていただきます。 21新卒が執筆した昨年度の研修内容もよろしければ合わせてご覧ください! - 【2021年】ラクスの新卒エンジニアが新卒研修を振り返ってみた 目次 研修概要 成果発表会 まとめ 研修概要 研修は2022/4/13〜6/28の51日間行われました。 技術基礎研修 サーバーサイド Java Spring boot Thymeleaf フロントエンド HTML CSS JavaScript jQuery Ajax といった技術を通じてWebアプリケーションの構築方法を学習しました。 また、 Linux 、DB、コンピューター、ネットワークの基礎用語、テストの手法等もカリキュラムに組み込まれています。 実務演習 研修で学んだ内容を、個人課題を通してアウトプットしていきます。 確認テスト 毎朝の小テスト、 定期テスト で理解度のチェックを行います。 プロジェクト型研修 ECサイト の構築をチーム開発で行います。(開発期間は6/17〜6/28の8日間) チームでは「必ず一人が一つの役割を持つ」というルールのもと、全員が何かしらのリーダーを担っています。 期間内に作成する機能は以下3つに分類されています。 基本機能 全チーム必ず実装する機能 追加機能 必須ではないが余裕があれば実装してほしい機能 独自機能 他チームとの差別化を図るチーム独自の機能 そして、開発期間終了後に成果発表会として各チーム20分ずつのプレゼンを行いました。 成果発表会 Aチーム、Bチーム、Cチームの3チームに分かれグループ演習が実践されました。 Aチーム まず、Aチームからは「 ラク ラク アロハ 」と名付けた飲食店の ECサイト の発表です。 コンセプト お客様を楽にする お店側も使いやすい を掲げ「両者の要望を叶えられるようなプロダクト」を目指し開発を行いました。 独自機能 お客様視点 購入時にログイン情報からお客様情報を取得してくる(入力のコストを無くす) ショッピングカートアイコンにアイテム数を表示 お店視点 レコメンド機能 管理者機能 基本機能としては存在していなかったが、両者が使いやすいコンセプトを掲げたことで、お店視点の機能を作成 等、コンセプト通りにユーザーがより使いやすい機能が独自に実装されていました。 よかった点 開発初期にコンセプトを決定したことで指針ができ、認識を揃えて開発を進めることができた タスク管理ツールにTrelloを導入し、追加機能がすべて実装できた 1時間半に1回現状報告をする等、困ったことがあったらすぐに共有できる体制にした 反省点 HTMLのフォーマッターを統一しておらず、push時に差分が大量に出てしまった 仕様の確認不足により変更作業が増加してしまった 上記2点のにより、大量のコンフリクトと、他の人の修正に気づかず デグレ を発生させてしまった 質疑応答 「お店側の視点」というア イデア はどうやって出た? まずお店側に使ってもらえないとお客様も使ってもらえないので、お店にも重きを置いた 最初のコンセプト決めの時点でチームで話題に上がった タスクの優先順位はどう決めた? 基本機能>追加機能>独自機能の順番に進めた 簡単な機能順にタスクを並べ、上から順に実装した 技術的に攻めた箇所はどこ? 強いて言うならデザイン モバイルでも使いやすいようにレスポンシブを取り入れたり デザインはどうやって決めた? ユーザーにコストがかからないように 「テーマ=アロハ」なのでテーマカラーを水色にする等、利用者が違和感を抱かないように エディタは人によって変えていた? チームで統一していたが、フロントエンドは VSCode 、バックエンドは STS を採用した Bチーム 続いて、Bチームからは「 ラク ラク coffee 」と名付けたカフェの ECサイト の発表です。 コンセプト お客様視点:欲しい商品がすぐに見つかる ECサイト お店視点 :商品が売れやすい ECサイト を掲げ、こちらもAチームと同様に ECサイト を利用するお客様と、商品を販売するお店の双方を視点に開発が行われました。 独自機能 レビュー機能 注文履歴から商品を5段階で評価できる機能 レコメンド機能 「 協調フィルタリング 」 アルゴリズム を利用し、嗜好の類似しているユーザーに対しパーソナライズされた商品を提示 管理者側分析機能 年代別の売上グラフを表示できる等、商品毎の売上が分析できるようデータを可視化 上記の機能を実装するにあたり大量のデータが必要になり、テストデータの自動生成処理も実装するという独自性も見られました。 ふりかえり トラブルなく開発が行えた 各個人が少し上のレベルのタスクに挑戦できた クラス図の理解を丁寧に行い、基本機能の実装が早く終わった 進捗管理 ツールをうまく活かせなかった 改善点 デフォルトのデザインを使用していたので、独自性を出したい レビュー機能 を管理者分析機能にも活かしたい UX 質疑応答 協調フィルタリング は自分でコードを書いている? Java で独自で実装している レコメンド機能の改善点はどういったところ? データの分母が少ないとレコメンドがうまくいかない よって、お店側の商品をカテゴライズすればもっとレコメンドがうまくいくはず これまでに大量データを扱ったような経験があった?どういった経緯で アルゴリズム を利用した? 大学院でAIを使用していた経緯がある、データを見るのが好きだったことも影響しているかも 他チームは4人だが、人数が少ないハンデはあった? とにかく機能を実装しきるのを目標に頑張った、デザインは後回しになって手が回らなかった できるだけバグを生まないように、開発の指針を初めに決めておいたことで3人でもここまで実装できたと思う Cチーム 最後に、Cチームからはおもちゃの ECサイト の発表です。 コンセプト まず、おもちゃを購入する客層を分類し「孫を持つシニア世代」にターゲットを絞ることに。 ECサイト に馴染みのあるターゲットは既存サイトを使うはず シニア世代にとって、既存の ECサイト は機能が多く使いづらいのではないか? 販売する側もシニア世代に向けた ECサイト を想定していないのではないか? という仮説からシニア世代にとって使いやすく、あらゆる問題を解決に導く「 ラク ラク トイ 」を開発することに決定しました。 独自機能 LINEでのOAuth2認証 商品の絞り込み機能 性別や年齢、予算を入力することでターゲティングされた商品が表示される RESTAPIで実装し、SPAでの表示を可能に また、商品購入フローをヘッダーに表示する等、ターゲットに向け使いやすさを意識したこだわりが見られました。 まとめ コンセプトを明確にしたことで、どういった機能が必要か全員が指針を持って開発が行えた ただ、コンセプト設定に時間がかかり他チームとの進捗の差に焦って開発を急いでしまった 上記によりレビューが甘くなり、終盤に大量のバグが発生 技術だけでなく技術以外でも未熟さを痛感したチーム開発だった 質疑応答 SPAのように作るにあたって(フロントエンドとバックエンドの繋ぎこみで)苦労したことは? フロント側でインタフェースを決めて、フロント側でとにかく頑張ったw ターゲティングが凄い、が、シニア層的には文字が小さい(笑)、文字サイズを選べたりするとよりよい 対象年齢の絞り込みは、どのように実装している? 商品テーブルに対象年齢を持っており、インプットの範囲のデータを表示している 総評 講師より 研修期間中、全員が努力していて、積極的に学ぶ姿勢がありました。 全員が能動的で、学習意欲も高く、定期的なテストの点数も例年と比較し非常に高い結果となりました。 最後のチーム演習では、最初にコンセプトを決めそのコンセプトに沿って機能を考え、スケジュールを立てて開発を行う進め方をしていたチームが多かったです。 そのため、8日間では間に合わないと思われるような機能開発にも着手していました。それもよい経験だったと思います。 また、研修で使用していない技術もふんだんに使用していました。 講師に対してのみならず、同期に対しても気遣い、挨拶ができ、個々のレビューに対してもお礼が言えるといったような、技術だけでなくヒューマンスキルの部分も素晴らしかったです。 総じてレベルの高い形で研修を終えることができたと思います。 とは言え、今回学んだ技術はまだまだ氷山の一角なので、今後も継続した努力に期待しています。 配属先でも間違いなく活躍できると思うので、今回の研修を糧に頑張ってください。 東京開発統括部 統括部長:間澤より 皆さんお疲れ様でした。研修楽しかったですか? 開発は楽しいものです。 開発に限らず、できないことができるようになる経験って楽しいですよね。 仕事もそうです。 ラク スは国内 SaaS のトップを走っている企業です。 たくさんの製品を扱っているのでその楽しさももちろんあるけど、責任もあります。 責任があるからこそ、刺激的な楽しみもあります。 不具合が起きたらめちゃくちゃ焦るけど、皆さんなら絶対に乗り越えられます。 チームで協力することで、楽しく利益を獲得して品質の高いサービスを作っていきましょう。 今回の研修でも、AチームとCチームはコンセプトがしっかりしていて ユーザビリティ が高いサービス、Bチームは技術に特化したりと、それぞれが強みを活かしてよいサービスを生み出しました。 皆さんの力を合わせるとよりよいものが作れるという経験が研修を通して実感できたと思います。 その楽しさを忘れずに、配属先でも頑張ってください。期待しています。 開発本部 本部長:公手より 発表とてもよかったです。 ユーザビリティ 、技術、ターゲットを絞り切る等、各チームの方向性が見られました。 特に、ビジネスはターゲットを絞るのが大事なので、新卒でそういった視野が持てているのは衝撃でした。 今日皆さんに伝えたいことは2点あります。 まず1点目。 エンジニアは積み重ねの職業、日々学習し続けるのが宿命付けられているもの、と思ってください。 業務時間だけコードを書いていれば優れたエンジニアになれるわけではありません。 ラク スのトップエンジニアも、若い頃からも、今も、常に勉強しています。 とは言え、プライベートももちろん大事なので、バランスが大事。 最初は難しいと思うけど、だんだんうまくなっていきます。ぜひ皆さんにも身につけて欲しいです。 次に、2点目。 開発はチームで行うもの。それを忘れないでいてほしいです。 今後楽しいこともたくさんあるけど、苦しいこともたくさんあると思います。 ただ、苦しいことも仲間がいれば必ず乗り切れるので、周りを頼ってチームに相談してほしいです。 管理職も若い頃は、皆さんと同じ。苦しみながらいろいろ乗り越えてきて今があります。 皆さんが今後苦しむであろうことは大体経験しているはずなので、気軽に相談してほしいです。 最後に、僕がずっと言い続けている『楽しい職場を作る』を、ぜひ皆で実現させましょう。 まとめ 新卒エンジニアの成果発表会の様子をまとめさせていただきました。 わたしも実際に発表を見学しましたが、コンセプト決め〜デザイン、実装までの工程を僅か8日間で行ったとはにわかに信じられないほどクオリティの高いWebアプリケーションとなっていました。 コンセプト、独自機能、デザイン、発表内容それぞれにチームのカラーがあり、チームが「掛け算」であることを実体験として感じられたことと思います。 今回の経験を活かし、配属先でもチーム力を活かしてぜひ活躍していってほしいです。 また、新卒で入った会社の同期は 一生物 だと思うので、お互いに切磋琢磨しながら高め合ってくれることを期待しています! 最後までお読みいただきありがとうございました。 引き続き、 ラク スをよろしくお願いいたします! エンジニア新卒採用サイト https://fresh-recruit.rakus.co.jp/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
技術広報の yayawowo です。 昨今、ビジネスシーンで 『デザイン思考』 という言葉をよく耳にするようになったのではないでしょうか? では、『デザイン思考』が何なのかを説明できますか? 本記事では、 デザイン思考の基本的や5つのプロセスの説明、おすすめの書籍をご紹介 します! 最後までお読みいただき、『デザイン思考』について詳しくなっていただければ幸いです。 デザイン思考とは なぜ必要なのか デザイン思考 5つのプロセス ① 共感(Empathize) ② 定義(Define) ③ 概念化(Ideate) ④ 試作(Prototype) ⑤ テスト(Test) メリットとは? ユーザーが欲しい!と思える商品開発につながる 多様な意見を受け入れられる アイデア提案の習慣が身につく おすすめ書籍 終わりに ◆ ラク スのデザイン情報は以下をご確認ください! ・ デザイナー情報サイト ・ プロダクトデザイン課 課長note ・ プロダクトデザイン note デザイン思考とは デザイン思考は、人々が持つ本当の問題を解決するための考え方 です。 英語の「Design Thinking」を日本語にしたものであり、「Design」は「設計する」という意味で用いられています。 また、見た目や使い勝手の整理、綺麗な装飾を考え出すだけでなく、利用ユーザーを想定した人間中心の考え方という意味もあります。 なぜ必要なのか ある書籍には以下のように書かれております。 「人」こそがサービスや製品、あるいはシステムの在り方・つくり方に影響を与える、非常に重要な要素となってきたからです。   引用元:実践 スタンフォード 式 デザイン思考 世界一クリエイティブな問題解決 できるビジネスシリーズ     第一章「なぜデザイン思考が必要なのか?」 少し昔までは、新製品が出ればすぐに売れる時代でした。 しかし、近年は時代の変化とともに便利なモノが増え、何か欲しいと思えばすぐにモノが手に入る時代です。 そのため、新製品が出ただけでは、ユーザーはすぐに購入を考えなくなりました。 皆さんはいかがでしょうか? 私の場合、一つモノを買うだけでもネットでの価格比較や口コミを確認、実際に売り物を確認等するため、購入まで時間を要します。 これらの行動は、 自分の感性や感情にぴったりなモノ を選んでいるためだと考えております。 ユーザー視点や行動を受け止めた上でデザイン(設計)していく考え方・・・ デザイン思考は、今のビジネスに必要だと言われています。 デザイン思考 5つのプロセス デザイン思考は、まず 「ペルソナ」 設定を行います。 ペルソナとは、購入対象者やユーザーのことを指し、 年齢 性別 職業 在住場所 などを具体的に決めます。 その後、そのペルソナのビジネス問題を5つのプロセスを経て、解決していきます。 では、デザイン思考の5つのプロセスについてご説明します! ① 共感(Empathize) まず、ペルソナが抱えている問題やニーズを探すため、ユーザーと同じ商品を触ったり、観察したりします。 これにより、実際にその商品がどう使われているのかや、使ってみての所感を理解することができます。 「① 共感」のプロセスで大事なことは、固定概念をなくすことです。 ペルソナ且つ、ユーザーに共感できるほど、しっかりと理解することが大切です! ② 定義(Define) 「② 定義」では、「① 共感」で得られた情報を基に、ユーザーのニーズを定義します。 ニーズは、ユーザーの無意識的な行動や選択の根拠を考えながら、「本当に求めているものは何か?」を具体的に 言語化 していきましょう。 ③ 概念化(Ideate) 「③ 概念化」では、定義したユーザーが求めているニーズを解決するために、 ア イデア やアプローチ方法を話し合います。 「③ 概念化」のプロセスで大事なことは、ずばり質より量です! 代表的な手法の一つである ブレーンストーミング を使ったりして、ア イデア を創出しましょう。 ④ 試作(Prototype) ア イデア を創出したので、次の「④ 試作」では試作品を作っていきます。 試作品であるため、時間やコストを多くかける必要はありません。 一旦形にすることで、それまで見えてこなかった問題や課題を発見しましょう! ⑤ テスト(Test) 「④ 試作」で作成した試作品をユーザーに使ってもらうプロセスが、「⑤ テスト」になります。 試作品をユーザーに試してもらい、定義した課題が解決できるかの確認及び意見を募ります。 その意見を基に試作品のブラッシュアップを重ねることで、ユーザーの満足度が高い製品やサービスの完成を目指していきましょう! メリットとは? デザイン思考がもたらすメリットをご紹介します。 ユーザーが欲しい!と思える商品開発につながる 前述した通り、今の世の中は商品/サービスが数多く存在しています。 そのため、ユーザーの感性や感情にぴったりなモノを開発しなくてはなりません。 デザイン思考では、ユーザー視点の考え方を身につけるため、潜在ニーズに応えられる・・・ ユーザーが欲しい!と思える商品開発に繋げることができます。 多様な意見を受け入れられる ア イデア を創出するにあたり、多様な立場の方に意見を聞きます。 それにより、異なる立場の意見に向き合うことや、お互いの合意形成を図ること等が可能となります。 多様な意見を受け入れることで、商品開発に繋げるだけでなく、自分自身の考え方を変えるメリットがあります。 ア イデア 提案の習慣が身につく デザイン思考では、実現性を問わず幅広いア イデア を募集します。 失敗したらどうしよう…と思う心配もありません。 まずは、多くのア イデア を出すのが第一です。 不安や心配もなく、ア イデア を提案することができるので、自然と習慣化されるメリットがあります。 おすすめ書籍 『まんがでわかるデザイン思考』 「まんがでわかる」シリーズは、初学者におすすめの書籍となっております。 以下3つのプロセスについてが事例を踏まえて、分かりやすく説明してくれている1冊です! ①. 着想: 潜在的 ニーズを見つける ②. 発案:ア イデア を創造・構築・検証する ③. 実現:市場に導入する 『実践 スタンフォード 式 デザイン思考 世界一クリエイティブな問題解決』 デザイン思考を実際に試すことができるのが、本書になります。 「チーム内で1回デザイン思考を実践してみたいな・・・」という方は、是非こちらの1冊をご参考ください! また、著者が スタンフォード大学 d.schoolにて体験した話もあるため、デザイン思考の基本から~実践まで幅広く学ぶことができます。 『デザイン思考が世界を変える: イノベーション を導く新しい考え方』 デザイン コンサルティングファーム の先駆けである、 IDEO の代表者が著者の書籍です。 数多くの企業事例だけでなく、デザイン思考の本質を具体的に紐解いてくれる一冊です。 分量は多めですが、読む価値ありです! 『エンジニアのためのデザイン思考入門』 新製品を世の中に生み出したいと思っているエンジニアや、マネージャー、また人材育成担当者をターゲットに書かれた書籍です。 東京工業大学 エンジニアリングデザインプロジェクトに所属する学生が、デザイン思考のエッセンスを取り入れ、モノづくりを実践し、その学びを得ていく泥臭い過程を学ぶことができる1冊です! 終わりに デザイン思考(デザインシンキング)のまとめは、いかがでしょうか? 最初は、クリエイティブな「デザイン」を想像した方も、デザイン思考とは何なのかを理解することが出来たのではないでしょうか。 ラク スのクリエイティブチームがアウトプットを作る上で意識づけし、取り組んでいる事例が以下の通りです。 ① 認知変容  →アウトプットを作る前にアウトプットを見た人が、どう思い、どういう行動をして欲しいか設定します。 ② 記号として成立しているか    →作成したアウトプットが記号になっているか?   矢印を見たら、その方向に進むんだと理解するように、そのような気持ちや行動をとっているかを確認します。 デザイン思考は、 Apple や Google などのグローバル企業にて早くから積極的に取り入れられております。 是非、まだ取り入れていない方がおりましたら、まずはチーム内から実践してみてください! 改めまして、本内容が前例のない課題や問題に遭遇している方の一助となれば幸いです。 最後までお読みいただきありがとうございました! ◆ 関連ブログ ・ 【2022年最新版】デザインマネージャーが厳選したおすすめUI/UX書籍36選!~これから始める方必見~ ・ 【2021年】 技術書好きプロエンジニア達が紹介する40選 ・ 開発メンバーが選ぶ、おすすめの技術書【2020年度】 ・ UI/UXデザイナー語る、デザイン Tips【20選】 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
皆さんこんにちは!開発エンジニアをしているnkumaです! 最近、業務で Java 配列を見かけたのですが、久しく触っていなかったためにかなりド忘れしていました。 そのため、復習がてら Java 配列についてブログに起こしてみようと発起した次第です。 本記事では、 Java 配列の宣言・代入といった基本から、ソートや要素を増やすなどのちょっとした応用までを紹介 していきます。 Java を学び始めて、「変数、代入の意味は分かるよ!」という方向けの内容です。 「 Java 配列なんて知ってるよ!」という中級者の方も、 応用編 以降はためになると思うので、是非ご一読ください! 構文だけでなく、具体的なコードも併せて記載していますので、すぐにでも使えるようになるかと思います。 ※大半の具体例コードは、以下の配列があることが前提です。 String[] dogs = {"ポチ太郎","ポチ次郎","ポチ三郎","ポチ四郎","ポチ五郎","ポチ六郎","ポチ七郎","ポチ八郎","ポチ九郎","ポチ十郎"}; Java 配列とは Java 配列の特徴 基本編 Java 配列の作り方 宣言・要素数の指定 代入 初期化 Java 配列の中身の使い方 要素の取得 Java 配列 ループのさせ方 応用編 配列をコピーする 要素数の増やし方 配列の全ての要素を指定した値で埋める Java 配列の一歩先へ よりたくさんの情報を扱う「多次元配列」 使い方 要素を後から継ぎ足しできる「List」 使い方 Java 配列とListの違い インデックスに名前をつけられる「Map」 使い方 Java 配列 使い方 まとめ Java 配列とは こんなケースを考えてみてください。 まず、10個の似たような変数を用意します。(①) そして、全ての変数に共通の処理をします。(②) // ①10個の似たような変数を作成 String dog1 = "ポチ太郎" ; String dog2 = "ポチ次郎" ; String dog3 = "ポチ三郎" ; String dog4 = "ポチ四郎" ; String dog5 = "ポチ五郎" ; String dog6 = "ポチ六郎" ; String dog7 = "ポチ七郎" ; String dog8 = "ポチ八郎" ; String dog9 = "ポチ九郎" ; String dog10 = "ポチ十郎" ; // ②全ての変数に共通の処理 dog1 = dog1 + "(犬)" ; dog2 = dog2 + "(犬)" ; dog3 = dog3 + "(犬)" ; dog4 = dog4 + "(犬)" ; dog5 = dog5 + "(犬)" ; dog6 = dog6 + "(犬)" ; dog7 = dog7 + "(犬)" ; dog8 = dog8 + "(犬)" ; dog9 = dog9 + "(犬)" ; dog10 = dog10 + "(犬)" ; とても面倒ですよね…10個なら面倒で済みますが、1000個とかなら到底できそうにないです。 Java 配列はそんな面倒から、ある程度解放してくれます! // ①10個の値が入ったJava 配列を作成 String[] dogs = { "ポチ太郎" , "ポチ次郎" , "ポチ三郎" , "ポチ四郎" , "ポチ五郎" , "ポチ六郎" , "ポチ七郎" , "ポチ八郎" , "ポチ九郎" , "ポチ十郎" }; // ②Java 配列に入った全ての値に同じ処理をする for (String dog : dogs) { dog = dog + "(犬)" ; } 10個の値を一つの変数にまとめることができました! これをループさせることで、一つ一つを手打ちで書かなくても共通処理が書けるようになりました! かなり楽をできるようになったと思います。 10個の値を一つの変数にまとめたように、     Java 配列とは、値を複数保持できる変数のこと です! Java 配列の特徴 Java 配列にはいくつかの特徴があります。 それに伴って、用語があるのでそれらをまず紹介します。 要素 配列の中の値のこと インデックス 要素を呼び出すために順番についている番号札、ラベルみたいなもの 0から始まることに注意! 次に、 Java 配列の持つ主な特徴です。 要素は固定長 = 最初に決めた数以上のものは入れられない! Java 配列には便利なメソッドがいくつもある 配列の中身を並び替えたり、他の配列にコピーしたりできる。 中身のループが簡単! 拡張for文という、中身をループさせるのに特化した記載方法がある。 以降は、 Java 配列の基本的な使い方や応用的な使い方を紹介していきます! 基本編 ここでは、宣言や代入といった初歩的なことを説明いたします。 「そんなの知ってるよ!」という方は、 応用編 からお読みください。 Java 配列の作り方 Java 配列の作り方から説明していきます。 宣言・要 素数 の指定 まずは、変数という受け皿を作ります。 いくつか注意することがあるので気を付けて下さい。 配列変数名には、「複数形」を使うのが一般的 要 素数 の指定は、 1から始まる普通の数字! 後述の呼び出すときに用いる「0から始まるインデックス」とは違うので注意してください! 構文 // Java 配列の宣言 型[] 配列変数名; // 要素数の指定 配列変数名 = new 型[要素数] 具体例コード // Java 配列の宣言 String[] dogs; // いつも通りの型に「[]」をつけるだけ、dogの集合なので「dogs」 // 要素数の指定 dogs = new String[ 10 ]; // 10個の値を入れたかったら、10を指定する 代入 次は、配列の中身を入れていきます。 配列のどこにいれるかを指定するには「インデックス」を使います。 インデックスは 0から始まる ので注意してください! 上述の要 素数 の指定とずれることになります。(要 素数 の指定「10」⇒インデックスの最後「9」) 構文 // Java 配列の代入 配列変数名[インデックス] = 代入する値; 具体例コード System.out.println(dogs[ 0 ]); // 「ポチ太郎」と出力(0から始まるので一番初めの「ポチ太郎」) // Java 配列の代入 dogs[ 0 ] = "タマ太郎" ; System.out.println(dogs[ 1 ]); // 「タマ太郎」と出力 インデックスを指定すれば、最初から入れなければならないというルールはありません。 ちなみに、一度も代入されていないものでもデフォルト値が自動で入っています。 (Stringならnull、intなら0など型によって決まっている) int [] numbers; numbers = new int [ 100 ]; nembers[ 50 ] = 999 ; // 0~49に値は入れていないが問題なし System.out.println(numbers[ 50 ]); // 「999」が出力される System.out.println(numbers[ 10 ]); // 「0」が出力される(一度も代入してないのでデフォルト値) 初期化 Java 配列を作るには、宣言して…要 素数 を指定して…値を代入して…と面倒ですよね…。 ここで便利な記法を紹介します。 宣言と代入を同時に行う「初期化」です! 初期化 = 宣言と代入を同時に行うこと 1文で配列を作成できる! 要 素数 の指定をする必要がない! 代入する値の数で、要 素数 を自動で決まるため 入れる値が決まっているならば、この方法で作るのが一般的ですね。 代入する値はいくつでも可能です。 構文 // Java 配列の初期化 型[] 配列変数名 = {代入する値①, 代入する値②, 代入する値③, ... , 代入する値㊿ }; 具体例コード // Java 配列の初期化 String[] dogs = { "ポチ太郎" , "ポチ次郎" , "ポチ三郎" , "ポチ四郎" , "ポチ五郎" , "ポチ六郎" , "ポチ七郎" , "ポチ八郎" , "ポチ九郎" , "ポチ十郎" }; Java 配列の中身の使い方 要素の取得 Java 配列の中身を取得するには、 インデックス を利用します。 インデックスは 0から始まること に注意です。 2番目に入れた値を取り出すなら「1」、10番目に入れた値を取り出すなら「9」とする必要があります。 取得の仕方がやや違うだけで、普通の変数と同じように利用することができます。 構文 配列変数名[取得したいインデックス] 具体例コード System.out.println(dogs[ 2 ]); // 「ポチ三郎」が出力される System.out.println(dogs[ 8 ]); // 「ポチ九郎」が出力される String HelloDogs = "こんにちは!" + dogs[ 5 ] + "と" + dogs[ 9 ]; System.out.println(dogs[ 8 ]); // 「こんにちは!ポチ六郎とポチ十郎」が出力される Java 配列 ループのさせ方 Java 配列の中身をループさせる代表的な方法「拡張for文」を紹介します。 拡張for文は「foreach文」とも呼ばれます。 大抵のエディタは foreach と打てば、補完機能で拡張for文が出てくると思います。 これは「配列の中身全てを順番に処理する」のに向いています。 forの条件文で型は配列に合わせた型( []を除いた型 )を、宣言する変数名は何でもいいです。 (一般的には配列変数名の単数形です) そこで宣言した変数に、順番に配列の中身が入っていきます。 その変数を利用して、for内部のループして行いたい処理を書きましょう。 配列の中身がなくなったらループは自動的に終了します! 構文 for (型 変数名 : ループしたい配列変数名) { ループして行いたい処理 } 具体例コード for (String dog : dogs) { // 配列はString[]なので型はString dog = dog + "(犬)" // dogに「ポチ太郎、ポチ次郎...」と順番に中身が入っていく } 応用編 配列をコピーする Java 配列を「そのままコピー」するには、 コピー元配列名.clone() メソッドを使います。 対して、「部分的にコピー」したいときには System.arraycopy() メソッドです。 構文 // Java 配列を「そのままコピー」する 型[] コピー先の配列変数名 = コピー元の配列変数名.clone(); // Java 配列の「一部分をコピー」する System.arraycopy(①コピー「元」の配列変数名, ②コピー「元」のコピー開始位置, ③コピー「先」の配列変数名, ④コピー「先」のコピー開始位置, ⑤コピーの個数); 具体例コード // Java 配列を「そのままコピー」する String[] dogs2 = dogs.clone(); System.out.println(dogs[ 1 ] + " | " + dogs2[ 1 ]); //「ポチ太郎 | ポチ太郎」と出力される System.out.println(dogs[ 8 ] + " | " + dogs2[ 8 ]); // 「ポチ七郎 | ポチ七郎」と出力される // Java 配列の「一部分をコピー」する String[] dogs2 = new String[ 5 ]; System.arraycopy(dogs, 5 , dogs2, 0 , 5 ) // ①dogsの②6個目(※インデックスなので0から数える)から、⑤5個を、③dogs2の④1つ目(インデックスなので…以下略)以降にコピーする System.out.println(dogs[ 5 ] + " | " + dogs2[ 0 ]); // 「ポチ六郎 | ポチ六郎」と出力される System.out.println(dogs[ 9 ] + " | " + dogs2[ 4 ]); // 「ポチ十郎 | ポチ十郎」と出力される 要 素数 の増やし方 どうやっても、配列の要 素数 を途中で増やす方法はありません。 ですが、上述の 「部分的にコピーする System.arraycopy() メソッド」を使えば疑似的に要 素数 を増やす ことができます! 「元々の数+増やしたい分」の要 素数 を指定した配列を新しく作成 配列をコピーする ※ 配列.length :その配列の要 素数 を取得(10個の配列なら「10」) 具体例コード // 「元々の数+増やしたい分」の要素数を指定した配列を新しく作成 int count = dogs.length + 10 ; // dogsの要素数 + 10個 = 20個 String[] dogs2 = new String[count]; // 配列をコピーする System.arraycopy(dogs, 0 , dogs2, 0 , dogs.length); // dogsの最初から要素の数だけ、dogs2の最初以降にコピー dogs2[ 15 ] = "ポチ十六郎" ; System.out.println(dogs2[ 5 ]); // 「ポチ六郎」と出力される System.out.println(dogs2[ 15 ]); // 「ポチ十六郎」と出力される 配列の全ての要素を指定した値で埋める Java 配列を指定した値で全て埋めるには、 Arrays.fill() メソッドを利用します。 構文 // Java 配列を指定した値で全て埋める Arrays.fill(配列変数名, 埋める値); 具体例コード String[] animals = new String[ 10 ]; Arrays.fill(animals, "犬" ); System.out.println(animals[ 0 ]); // 「犬」と出力される System.out.println(animals[ 5 ]); // 「犬」と出力される Java 配列の一歩先へ ここでは、配列の派生形・類似的なものを紹介いたします。より高度で実践的です。 どれも詳しく解説するだけで1記事、2記事となってしまうもののため、簡単な説明のみとしています。 触りの部分だけでも勉強になると思うので、「へえ、こんなのがあるんだ。便利そう。」って感覚くらいでお読みください。 そして、興味を持ったなら是非調べてみてください。 よりたくさんの情報を扱う「多次元配列」 多次元配列とは、「配列の中にまた配列を入れたもの」になります。 2次元配列は「配列①の中に配列②が入っているもの」、3次元配列は「配列①の中に、配列③が入っている配列②が入っているもの」です。 2次元配列とかは縦・横のマス目で考えると分かりやすいと思います。 それでもかなり複雑になってしまうので、安易に使うことは避けましょう。 使い方 以下は、2次元配列を例に挙げています。 構文 // 2次元配列の宣言 データ型[][] 配列変数名 = new データ型[要素数①][要素数②]; // 要素数①:いくつ配列を入れるのか // 要素数②:中身の配列の要素数 // 2次元配列の代入 配列変数名[ 0 ][ 0 ] = 代入する値; 配列変数名[ 0 ][ 1 ] = 代入する値; 配列変数名[ 0 ][ 2 ] = 代入する値;   ・・・ 配列変数名[ 1 ][ 0 ] = 代入する値; 配列変数名[ 1 ][ 1 ] = 代入する値; // 2次元配列の取得 System.out.println(配列変数名[ 0 ][ 0 ]); 要素を後から継ぎ足しできる「List」 こちらはかなり便利です! Java 配列と同じ「値のまとまり」ですが、不便だった「後から追加できない」を解消しており、「どんどん追加することができる」という特徴があります。 ちなみに一口にListといっても、要素の取得が早いが挿入や削除が遅い ArrayList 、要素の挿入や削除は早いが取得が遅い LinkedList があります。 使い方 構文 // Listの宣言 List<型> リスト名 = new ArrayList<型>(); // Listに値を追加 リスト名.add(追加する値); // Listの値を書き換える リスト名.set(書き換えたい値のインデックス, 書き換える値); // Listの値を取得する リスト名.get(取得したいインデックス); 具体例コード // Listの宣言 List dogsList<String> = new ArrayList<String>(); // Listに値を追加 dogsList.add( "ポチ太郎" ); dogsList.add( "ポチ次郎" ); dogsList.add( "ポチ三郎" ); // Listの値を書き換える dogsList.set( 2 , "タマ三郎" ); // Listの値を取得する System.out.println(dogsList.get[ 0 ]); // 「ポチ太郎」と出力される System.out.println(dogsList.get[ 2 ]); // 「タマ三郎」と出力される Java 配列とListの違い Listの方が便利そうですが、何でもListを使えばいい訳ではありません。 Listはデータ保持の都合上、「特定のインデックスにアクセスする」場合に時間がかかってしまうなどデメリットもあります。 何も意識せず、とりあえずListを使うのではなく、使い分けを意識しましょう。 意外と Java 配列を使う時には、後から要素を追加したいことが少なかったりします。 以下は Java 配列とListの使い分けです。参考にしていただけると幸いです。 Java 配列 最初の時点で要 素数 が確定している場合 何度もピンポイントな要素にアクセスするような場合 List 要素の入れ替えが多い場合 後から追加する必要がある場合 インデックスに名前をつけられる「Map」 配列やListの要素を取得するときは、インデックスという数字を使っていました。 しかし、実際に利用しようとなるとどこに何が入っているか分かりません。 それぞれの値に数字じゃなくて、「名前が付けられたら分かりやすいのに・・・」と思う場面も多そうです。 ここで紹介するのが「Map」です。 Mapは「インデックスの代わりに名前をつける」ことができます。 インデックスの代わりにつける名前のことを「キー」と呼びます。 また、Mapは通常「HashMap」を使いますが、特徴をもった「LinkedMap」「TreeMap」というのもあります。 使い方 構文 // Mapの宣言 Map<キーの型, 値の型> マップ名 = new HashMap<キーの型, 値の型>(); // Mapの代入 マップ名.put(キー, 値); // Mapの取得 マップ名.get(キー); 具体例コード // Mapの宣言 Map<String, String> dogsMap = new HashMap<String, String>; // Mapの代入 dogsMap.put( "黒犬" , "ポチ太郎" ); dogsMap.put( "白犬" , "ポチ次郎" ); // Mapの取得 System.out.println(dogsMap.get[ "赤い犬" ]); // 「ポチ太郎」と出力される Java 配列 使い方 まとめ 業務で Java 配列を利用することは機会は多くはありません。 ListやMapの方がよく出てくるイメージがあります。 しかし、(特に初心者の方は)おろそかにするわけにはいきません。 Java 配列の考え方を基にすることで、ListやMap、それ以外のことも理解がしやすくなるからです。 また、比較的少ないとはいえ配列を使うこともあります。 ぜひ一度、上述の具体例コードを参考にしながら、ご自身で書いてみてください! ◆ 関連ブログ ・ Java 18 インストールと新機能紹介【最新版】 ・ 【多言語対応】Spring Boot+Java - 動的に言語を切り替る方法 - ・ オブジェクト指向を学ぶためのオブジェクト指向エクササイズ ・ 【入門】Spring Bootとは~実践まで エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
はじめに はじめまして、インフラ担当のfasahikoです。 今回のブログでは、 「Ansibleを利用してZabbixサーバの設定を行う」 をテーマに書きたいと思います。 Zabbixで監視を行っている且つ、Ansibleで設定を管理したい方(かなりピンポイントですが)を対象に、 AnsibleのインストールからZabbixモジュールを利用した設定までをご紹介したいと思います。 日々の運用を楽にするために、少しでもお役に立てれば幸いです。 はじめに 導入のきっかけ Ansibleとは Ansible Zabbixモジュールとは Ansible,Zabbix-apiのインストール Ansible Zabbixモジュールでの自動化 ホスト設定 メンテナンス設定 終わりに 導入のきっかけ 今回ブログテーマのZabbixの設定自動化を導入した背景ですが、現在担当している商材では管理対象サーバが多く、 メンテナンスや構成変更時、新規サーバ構築時などにZabbixの GUI でポチポチと設定を行うことが苦痛に感じたことが発端です。 Zabbixの GUI 操作で行うと1時間かかる設定作業が、Ansibleでの自動化で数分で設定できる ので、運用をかなり楽にすることが出来たと思います。 次項から、今回のテーマであるAnsibleとZabbixモジュールについての概要を紹介します。    Ansibleとは インフラ構成管理ツールとして多く利用されているためご存知の方も多いと思いますが、 Ansibleとはどのようなものなのか簡単におさらいをしておきます。 Ansibleとは Ansibleとは、システム設定やソフトウェアの導入(インストール)などを自動化、効率化する構成管理ツールの一つ。米レッドハット( Red Hat )社が開発・販売しており、 オープンソース ソフトウェアとしても公開されている。                                 IT用語辞典 e-wordsより抜粋 Ansibleは、Playbookというファイル群(ファイルの形式は YAML )に管理対象のサーバ構成を記載していきます。 Ansbileで管理できる設定や対象機器は多岐に渡っており、できないことはほぼないのではと思えるくらい構成管理用のモジュール(機能)が豊富に用意されています。 Ansible Zabbixモジュールとは 次に、Ansible Zabbixモジュールについてです。 AnsibleでZabbix上の設定を管理するためのモジュール群で、設定箇所毎にモジュールが開発されています。 現在、Ansible公式のモジュール一覧を参照すると以下のようなZabbixモジュールが用意されているようです。 ・zabbix_action ・zabbix_group ・zabbix_group_info ・zabbix_host ・zabbix_host_info ・zabbix_hostmacro ・zabbix_maintenance ・zabbix_map ・zabbix_proxy ・zabbix_screen ・zabbix_template 等、詳しくは Ansible公式ドキュメント に載っています。 今回は上記の中から"zabbix_host"モジュール、"zabbix_maintenance"モジュールの実装例について紹介します。 Ansible,Zabbix- api のインストール それでは、実際にAnsibleのインストールからZabbixモジュールの利用までを見ていきたいと思います。 今回はCentOS7の上にAnsibleをインストールします。 以下のコマンドを実行し、Ansible本体とZabbixモジュール利用時に必要となるzabbix- api をインストールします。 $ yum install epel-release $ yum install python-pip $ pip install ansible $ pip install zabbix-api Ansible Zabbixモジュールでの自動化 ホスト設定 Ansibleとzabbix- api のインストールが完了したので、早速Zabbixサーバ上のホスト設定をAnsibleで実行したいと思います。 まずは簡単に、以下のようなコードを作成して設定されるか実際にテストしてみます。 それぞれのパラメータについては公式に解説があります が、以下のような形でそれぞれZabbixサーバのホスト設定に登録するパラメータを記載します。 $ zabbix_host_set.yml - hosts: localhost # Ansible接続先をlocalhostに指定 tasks: - name: Create host on zabbix local_action: # zabbix_hostモジュール利用時はlocal_action: にてローカルでのタスク実行とする module: zabbix_host # 利用モジュールの指定 server_url: "http://192.168.1.10/zabbix" # ZabbixサーバのURL login_user: admin # Zabbixサーバのユーザ login_password: admin # Zabbixサーバのパスワード host_name: "test-vm01.localdomain" # 登録するホスト名 host_groups: # 登録するホストグループ - test link_templates: # ホストに割り当てる監視テンプレート - Template_OS_Linux_Monitor status: enabled # 監視の有効化・無効化の選択 state: present # ホストの設定の有無、『present』はホストを登録、『absent』であれば削除になる interfaces: # 監視対象ホストのインターフェース設定 - type: 1 main: 1 useip: 1 ip: "192.168.1.21" dns: "" port: 10050 設定したいホストの情報を上記の通りPlaybookに記載し、以下コマンドを実行します。 $ ansible-playbook zabbix_host_set.yml コマンドの実行完了後、Zabbixサーバ側を見てみると確かに追加されています。    上記の通り追加はできましたが、このままだとPlaybookに登録対象の設定をベタ書きしており 複数台の登録に対応できないのでもう少しAnsibleの関数を上手く利用できる形にしたいと思います。 以下のような構成でコードを再作成しました。 |-- inventories | `-- hosts |-- roles | `-- zabbix | `-- tasks | `-- host_setting.yml |-- zabbix_host_set.yml それぞれのファイルの中身は以下の通りです。 inventories/hosts 対象はテストサーバとして2台を設定しています。 $ inventories/hosts [test_server] 192.168.1.21 # ホスト名はtest-vm01.localdomain 192.168.1.22 # ホスト名はtest-vm02.localdomain zabbix_host_set.yml 上述のテストではhostsを hosts: localhost としていましたが、 test_serverにAnsibleで接続する形 hosts: test_server に変更し、かつ gather_facts:True として test_serverのサーバ構成情報を取得・利用できるようにしています。 $ zabbix_host_set.yml --- - hosts: test_server gather_facts: True tasks: - include_role: name: zabbix tasks_from: host_setting.yml roles/zabbix/tasks/host_setting.yml 前述の通り gather_facts:True として fact変数 を利用できる形にしていたので、 可変部分のパラメータ設定(host_name,ip)はそのfact変数から取ってこれるようにしています。 (対象サーバの IPアドレス やホスト名はfact変数を利用せず、varsファイル内で変数定義をすべきなのですが、 導入時点では対象サーバ個々の構成管理は出来ていなかったため、実行時に対象サーバに接続し都度取得できるよう以下のようなコードとしました。) $ roles/zabbix/tasks/host_setting.yml --- - name: Create host on Zabbix local_action: module: zabbix_host server_url: "http://192.168.1.10/zabbix" login_user: admin login_password: admin host_name: "{{ ansible_fqdn }}" host_groups: - test link_templates: - Template_OS_Linux_Monitor status: enabled state: present interfaces: - type: 1 main: 1 useip: 1 ip: "{{ ansible_eth0.ipv4.address }}" dns: "" port: 10050 以下のコマンドで実行してみます。 $ ansible-playbook -i inventories/hosts zabbix_host_set.yml Zabbixサーバ側を確認するとホスト名や IPアドレス も誤りなく登録されています。     実際に私が利用したケースでは、Zabbix上のホスト設定の IPアドレス 部分の更新が必要となったため、 上記のようなコードで設定を一括更新しました。 御覧の通り実装はすごく簡単なため、似たような手動の運用がある場合はすぐに切り替えることをお勧めします。 メンテナンス設定 次に簡単ではありますが、メンテナンス設定時に利用するzabbix_maintenanceモジュールについて記載します。 Zabbix上のホストグループ単位でメンテナンス設定を入れる場合は必要性はあまり感じませんが、 特定のホストグループ内の数十台だけにメンテナンス設定したいといった場合 はかなり役立つと思います。 具体的には以下の形でコードを作成しました。 $ add_zabbix_maintenance.yml - hosts: localhost connection: local tasks: - name: Create maintenance Setting connection: local zabbix_maintenance: # 利用モジュールの指定 name: Maintenance for VersionUP # メンテナンスの名前 state: present # メンテナンス設定の有無、『present』は登録、『absent』であれば削除になる collect_data: yes # メンテナンスタイプの『データ収集あり』か『データ収集なし』の設定 minutes: 300 # メンテナンス期間(ここでは設定反映時点から300分間のメンテナンス設定となる) server_url: http://192.168.1.10/zabbix login_user: admin login_password: admin host_names: # メンテナンス設定を行うホスト - test-vm01.localdomain - test-vm02.localdomain メンテナンス設定対象のホスト名を最後のhost_names以下に羅列し、 以下のコマンドを実行します。 $ ansible-playbook add_zabbix_maintenance.yml 実行後、確かに意図した通りのメンテナンス設定が入っており、指定したホストもメンテナンス対象に指定されています。 ただし、実行した時間からメンテナンス設定が開始となります。 この部分についてはメンテナンスの開始・終了時間が指定できればと惜しく思ったところです。 他力本願でお恥ずかしいですが今後のモジュールのメンテナンスに期待したいと思います。     終わりに Ansible Zabbixモジュールを用いたZabbixサーバ上の設定自動化を紹介しました。 Zabbixサーバ設定を自動化するにはZabbixAPIを利用する方法も考えられますが、 API は使い慣れていないけど、Ansibleなら使っているといった方にはこのZabbixモジュールを利用する方が導入しやすいと思います。 今回は設定作業をAnsible Zabbixモジュールで自動化した形ですが、Ansible本来の目的はコードでの構成管理です。 そのため今後は、Zabbixモジュールを用いてZabbixサーバ自体の構成管理を進めていければと考えています。 以上、最後までお読み頂きましてありがとうございました。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
Gitの既存 リポジトリ を使って開発を始めるにあたって、皆さんまずは リポジトリ を複製しますよね? 本投稿では、 git clone コマンドの基本的な使い方〜便利なオプションの紹介 をさせていただきます。 Gitを使い始めたばかりの方から、オプションは使用していなかった!という玄人の方まで、開発する際の参考にしていだければ幸いです。 弊社ブログのGitに関わる関連記事もぜご一読ください! - 【超入門】初心者のためのGitとGitHubの使い方 - 【Git入門】git stashで作業を便利に退避する - 【Git入門】git commitを取り消したい、元に戻す方法まとめ 目次 目次 git cloneって? git cloneの基本的な使い方 別名で保存したい場合 カレントディレクトリ以外に保存したい場合 git cloneのオプション紹介 クローンしたいブランチを指定する クローン時のメッセージを非表示にする originに別名を付ける 指定数のコミットのみを取得する チェックアウトを行わない まとめ   git clone って? git clone とは、 既存の リポジトリ をローカル環境に複製するコマンド のことです。 リポジトリ の場所はリモートでもローカルでも構いません。 Gitでは ソースコード だけでなく、 画像 markdown 等のテキストファイル ER図、 UML 図等の画像を生成するファイル 等、開発に使用するための様々なファイルを格納することが可能です。 ER図、 UML 図等は GitHub やGitLab上で描画できるので、 ソースコード 以外でバージョン管理したいファイルも全て集約することができますね。 git clone の基本的な使い方 $ git clone [リポジトリパス] 上記コマンドにより、指定した リポジトリ をカレント ディレクト リに複製することができます。 指定がない場合は リポジトリ の名前のままでローカルに保存されます。 GitHub の リポジトリ を指定した際の使用例を以下に記します。 $ git clone https://github.com/[ユーザー名]/[リポジトリ名].git private リポジトリ の場合は、 git clone 時にパスワード認証か SSH 公開鍵の設定が必要となります。 別名で保存したい場合 ローカルに保存する際に別名を指定したい場合は、下記のように ディレクト リ名をパスの後ろに記載します。 $ git clone [リポジトリパス] [ディレクトリ名] ディレクト リ名が更新されるだけで、 リポジトリ の内容は変わりません。 カレント ディレクト リ以外に保存したい場合 指定がない場合はカレント ディレクト リに保存されますが、別 ディレクト リの指定も可能です。 $ git clone [リポジトリパス] [パス]/[ディレクトリ名] パスには 絶対パス 、 相対パス どちらでも指定可能です。 git clone のオプション紹介 git clone コマンドには様々なオプションがあります。 オプションは以下コマンドで参照可能です。 $ git help clone コマンドを実行すると、以下のような結果が出力されます。 NAME git-clone - Clone a repository into a new directory SYNOPSIS git clone [--template=<template_directory>] [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [--dissociate] [--separate-git-dir <git dir>] [--depth <depth>] [--[no-]single-branch] [--no-tags] [--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules] [--[no-]remote-submodules] [--jobs <n>] [--sparse] [--filter=<filter>] [--] <repository> [<directory>] DESCRIPTION Clones a repository into a newly created directory, creates remote-tracking branches for each branch in the cloned repository (visible using git branch --remotes), and creates and checks out an initial branch that is forked from the cloned repository’s currently active branch. (中略) OPTIONS -l, --local When the repository to clone from is on a local machine, this flag bypasses the normal "Git aware" transport mechanism and clones the repository by making a copy of HEAD and everything under objects and refs directories. The files under .git/objects/ directory are hardlinked to save space when possible. (後略) コマンドの使い方とオプションに関する説明が詳細に出力されます。 英語が堪能な方はこちらの公式ヘルプだけでなんとでもなりそうですね。 本投稿ではこのオプション群の中からいくつかを抜粋して紹介させていただきます。 オプション ショートオプション 用途 --branch -b クローンしたいブランチを指定する --quiet -q クローン時のメッセージを非表示にする --origin -o origin に別名を付ける --depth 指定数のコミットのみを取得する --no-checkout -n チェックアウトを行わない ※以降の例ではショートオプションをしています。 クローンしたいブランチを指定する git clone コマンドは指定がない場合 main ブランチを取得しますが、特定のブランチを指定したい場合は -b オプションを使用します。 $ git clone -b [指定したいブランチ名] [リポジトリパス] クローンされた リポジトリ で git branch コマンドを実行すると、指定したブランチ名で複製されていることが確認できます。 また、ブランチ名の代わりにタグを指定することも可能です。 クローン時のメッセージを非表示にする git clone コマンドはデフォルトで下記のような進捗状況が出力されるようになっています。 ( --progress オプションと同様の動きをします。) Cloning into 'XXXXX'... remote: Enumerating objects: XXX, done. remote: Counting objects: 100% (XX/XX), done. remote: Compressing objects: 100% (XX/XX), done. remote: Total XXX (delta X), reused XXX (delta X), pack-reused XXXX Receiving objects: 100% (XXX/XXX), XX MiB | XX MiB/s, done. Resolving deltas: 100% (XXX/XXX), done. この進捗状況を非表示にする際には -q オプションを使用します。 $ git clone -q [リポジトリパス] origin に別名を付ける リモー トリポジ トリから git clone をする場合、デフォルトの リポジトリ 名である origin がクローンされます。 #オプション無しで実行した場合 git branch -a * main remotes/origin/HEAD -> origin/main remotes/origin/feature/hogehoge -o オプションを使用することで、 origin 以外の名前を指定することができます。 ( origin とはリモー トリポジ トリのアクセス先に対してデフォルトで付く名称です。) $ git clone -o [指定したいorigin以外の名前] [リポジトリパス] 確認すると、指定した名前でクローンできていることが分かります。 #オプション有りで実行した場合(例では「target」と呼称) git branch -a * main remotes/target/HEAD -> target/main remotes/target/feat/hogehoge また、下記例のように git remote コマンドでもアクセス先を確認することができます。 $ git remote -v 指定数のコミットのみを取得する 開発が進んでくると git clone をするだけで、数分を要するような リポジトリ も出てくると思います。 特定のブランチを指定するオプションも先ほどご紹介しましたが、さらにコミット数を指定することも可能です。 過去分のコミットが不要な場合は、このオプションを使用することで軽量にクローンすることができます。 $ git clone --depth=1 [リポジトリパス] [ブランチ名] 例では「1」を指定して、最新のコミットのみを取得対象としています。 ブランチを指定しない場合は、デフォルトブランチが取得対象となります。 チェックアウトを行わない git clone をデフォルトで実行すると自動的にチェックアウトが行われますが、チェックアウトを行わないことでクローン時のサイズを抑えることができます。 $ git clone --no-checkout [リポジトリパス] チェックアウトが実行されないので、クローン後の ディレクト リには .git のみが作成されます。 $ ls -a . .. .git ちなみに、この空っぽの状態から特定の ディレクト リをチェックアウトするには、 sparse-checkout コマンドを使用します。 $ git sparse-checkout init $ git checkout Your branch is up to date with 'origin/main'. まとめ Git入門ということで、 git clone コマンドの使い方と一部オプションをご紹介しました。 git clone は開発初期に一度実行するきりで使用頻度はあまり高くないと思いますが、オプションを組み合わせることでローカルのサイズを抑えたりデフォルトでは実現できない特別な使い方が可能になるので、よろしかったら参考にしてください。     エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは、技術広報の yoneshin です。 当社が定期開催している『Meetup』 次回は2022/7/6開催 『 SaaS プロダクト開発をリードするデザインとフロントエンド』 と題して 当社 プロダクトデザイナー とフロントエンドエンジニア達が開発事例をご紹介 !! 参加申込方法 イベントに参加したい!という方は、TECHPLAY 又は connpass 経由からお申込みをお願いします! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com 当社取組みやメンバーへの質問、情報交換、交流機会として どなたも是非お気軽にご参加ください! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
技術広報の飯野です。 2022/6/22(水)に開催されましたLTイベント「 potatotips #78 iOS / Android 開発Tips共有会 」に弊社メンバーが登壇しました! 当日の発表内容をまとめさせていただきます。 目次 目次 イベント詳細 ラクスエンジニアの登壇内容 アーキテクチャを明文化して開発に臨んだ話 終わりに イベント詳細 potatotipsは iOS / Android アプリを開発する中で見つけたTipsをLT(Lightning Talk )形式で共有しあう会です。 とあるように「potatotips」は iOS / Android アプリに関連するTipsに特化したLTイベントとなっております。 名前が可愛いLTイベントですよね。 ネーミングセンス勉強になります。 当日のイベントページはこちらです。 potatotips.connpass.com また、当日の発表者一覧は GitHub で確認できます。 github.com ラク スエンジニアの登壇内容 アーキテクチャ を明文化して開発に臨んだ話 弊社からは楽楽精算のモバイル開発でテッ クリード を担う佐藤さんに登壇いただきました。 Android Architecture を明文化して 新規開発に臨んだ話 〜 Architecture を事前準備して臨んだ開発を振り返る 〜 speakerdeck.com 発表で伝えたいこと - 開発開始前に Architecture を明文化して良かったこと&課題となったこと 背景 - ラク スではNative(Kotlin)版とCordova版の2つの Android アプリをリリースしている - Native版はバージョンアップを進めていたが、Cordova版ではタ イムリ ーな対応ができていなかった - CordovaがEOLになった場合はセキュリティリスクが生じる懸念がある - 市場にCordovaエンジニアが少なく、採用も難しい →心機一転Native版に作り替えることに! チームの現状 - チームは若手が中心だったため、基本的方針としてArchitectureを定めることに Architecture選定にあたって - 若手が中心なチームだったため Android の公式Architectureである MVVM Architecture を採用することに 3層レイヤー構造による構成 - プレゼンテーションレイヤー - ドメイン レイヤー - データレイヤー - 上記3層を基本的なレイヤー構造として採用 様々な明文化 - レイヤー毎のパッケージ構成も図と共に明示 - 基本クラスのルールも明文化 開発を進めて感じたこと - チームの基本的な技術力が向上する - 開発中に基本的な アーキテクチャ の議論をすることがない - 責務によりクラスを小さく分けたためテストが書きやすい 課題に感じたこと - パッケージ構造 - 各レイヤー毎の依存性 まとめ - Architectureを明文化すると以下のような恩恵が! - チームの基本的技術の向上→生産性の向上 - 品質の向上 当日の twitter ( #potatotips )では、 Android 公式のArchitectureとかあるのかー Android の アーキテクチャ は、公式の ガイドライン に従うのがベターですよね…! 公式の アーキテクチャ ガイドがあるの、やっぱいいよなあ 明文化大事 久しぶりに Android もやってみたくなってきた!最近ご無沙汰していたからな。予め公式ドキュメントを読み合わせて明文化しておくのは良いですね。 事前に アーキテクチャ を明文化するの、すごいよさそう といったご感想をいただきました! コメントで盛り上げていただいた皆さま、ありがとうございました。 終わりに ラク スでは Android エンジニアの採用を行なっております。 career-recruit.rakus.co.jp また、引き続き外部イベントへの参加も積極的に行ってまいります。 弊社主催のイベントもたくさんご用意しておりますので、ご興味のある方はぜひご覧ください! rakus.connpass.com techplay.jp 皆さま引き続きよろしくお願いいたします! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
こんにちは、技術広報の yayawowo です。 皆さん! 2022年6月19日(日)に開催した JJUG CCC 2022 Spring に参加されましたでしょうか? 今回は、 弊社テッ クリード が発表した内容 をまとめさせていただきましたので 当日 JJUG を視聴できなかった方、視聴したけれど改めてレポートを読みたい!という方のご参考になれば幸いです! 目次 目次 ラクスエンジニアの登壇内容 短納期でローンチした新サービスをJavaで開発した話 協賛内容 終わりに ラク スエンジニアの登壇内容 短納期でローンチした新サービスを Java で開発した話 発表者:a1( @eichisanden )      2022/06/19 10:00〜 Track D (# jjug _ccc_d) Video:40min + Live:10min speakerdeck.com 当社テッ クリード の三田さんより、 『サービス開発の理想と現実・短納期でローンチした新サービスを Java で開発した話』をテーマに登壇いただきました! ◆ 発表内容まとめ   今回開発したサービス「 楽楽電子保存 」について ・電子請求発行システム「 楽楽明細 」で受け取った電子請求書等の帳票を電子保存/一元管理できる無料サービス ・2022年1月からの改正 電子帳簿保存法 の要件にも対応 開発体制 ・既存サービスを開発している2チームが開発 Java のバージョン ・Java11 or Java17 どちらにする? ・Java17を採用 ・Java17の良かった機能について フレームワーク ・Spring Bootを採用 API クライアント ・OKHttp(Retorfit)を採用 マルチテナント構成 ・マルチテナント構成とは? ・単一データベース/共通 スキーマ 方式を採用 セキュリティ ・認証や CSRF チェックはSpring Securityを採用 タイムゾーン 対応 ・Timezoneありきでの実装 フロントエンド ・Reactを採用 ・関連発表内容  ・参考) フロンエンド・バックエンド分離の道のり クラス設計 ・3層 アーキテクチャ ・3層 アーキテクチャ のメリット/デメリット ・オニオン アーキテクチャ を採用 ログ ・ContentCachingRequestWrapper、ContentCachingResponseWrapperを使用 当日 Twitter からは、 「検討と試行錯誤の過程が見て取れて素敵でした!」 「自分が考えていることや参考にしてる書籍もほぼ同じ!自分がこの登壇やりたかった!」 「やはり、事前に社内勉強会などで啓蒙しておくことは重要そうだなぁ。」 などのコメントをいただきました! ありがとうございます。 また、 はてブ のテク ノロ ジー にトレンド入りもし、本発表が SaaS 開発に携わる皆様のお役に立てていることを実感することができました。 協賛内容 ラク スは、2021年11月21日開催した JJUG CCC 2021 Fall に続き、 2021年6月19日開催の JJUG CCC 2022 Springに ロゴスポンサー として協賛させていただいております! ccc2022spring.java-users.jp 今後も Java 関連の技術や事例を積極的に発信させていただきます! 終わりに ラク スのテッ クリード の発表はいかがでしたでしょうか? 是非 Java 技術者や、 SaaS 開発に携わるエンジニアの皆様の一助となれば幸いです。 今後も JJUG CCC Spring/Fallに、積極的に登壇/協賛していきたいと思います! 最後までお読みいただきありがとうございました!! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
はじめに はじめまして。ikedamasa1221です。 私は2021年の末くらいからオフショア開発業務に関わりはじめ、 今年度からブリッジSEとしてオフショア開発業務に従事することになりました。 実はこれまではずっと開発者として機能開発などに携わっており、ブリッジSE業務は初めての経験になります。 時には苦戦しつつ、時には楽しみながら、早く一人前のブリッジSEとして仕事ができるように日々頑張っています。 このように ラク スで初めてオフショア開発に従事したのですが、以前からオフショア開発なるものがあることは見聞きしており、 ネットで記事を見たり経験者に話を聞くなどしてある程度のイメージを持っていました。 しかし『百聞は一見にしかず』という言葉にある通り、イメージと違う印象を受けるような出来事がいくつもありました。 私の経験が、 オフショア開発に興味がある人 これからオフショア開発に従事する人 ブリッジSEの道に進むかどうか迷っている人 の参考になれば幸いです。 あくまで私の個人的な体験談であるため、客観性や正確性に欠く記述が多分に含まれると思いますが、どうかご了承ください。 また本記事は ブリッジSEとしてオフショア開発業務に携わる一個人 としての視点で書かれています。 事業としてオフショア開発に興味がある、またはオフショア開発事業を始めるかどうか検討されている方は、 コチラ を参考にしていただきたいです。 目次 はじめに 目次 オフショア開発とは オフショア開発に従事して感じたギャップ 話す言語の違いについて 慣習や国民性の違いについて 仕事の進め方について 品質について まとめ オフショア開発とは 本題に入る前に、簡単にオフショア開発についてまとめさせていただきます。 オフショア開発とは、 自社で行っていたシステム開発業務の全部または一部を海外の現地法人に委託すること です。 日本よりも人件費が安い海外で システム開発 を行うことにより、コスト削減などが見込めるというメリットがあります。 また日本では、近年の人口減少によって人材不足が深刻化しており、その解消のためにオフショア開発の活用が注目されているという側面もあります。 以前はオフショア開発の委託先として中国が選ばれることが多かったようですが、最近は ベトナム やフィリピンといった東南アジアの国々に人気が集まっているようです。 委託先の国選びにおいては、その国の人件費、教育水準(特にIT教育と言語教育)、国民性などの事情が考慮されることが多いとのことでした。 ラク スもオフショア開発拠点( ラク ス ベトナム )を2014年に新規で立ち上げており、その規模は年々拡大しています。 オフショア開発に従事して感じたギャップ それでは私が初めてオフショア開発に従事して感じた、イメージとの違いやギャップについてお話させていただきたいと思います。 読者のみなさんには、みなさん自身が抱くオフショア開発やブリッジSEの仕事のイメージを思い浮かべながら読んでいただけると嬉しいです。 話す言語の違いについて 以前のイメージ「英語すら十分に話せない自分が仕事の依頼やレビューなんてできるだろうか...?」 ↓ 実際に働いてみて「なんとかなる。でも英語は話せた方が仕事の幅は確実に広がりそう。」 オフショア開発と聞いて最初に思い浮かべるのが話す言語の問題かと思います。 私は今のところ、最低限はどうにかなると感じています。 まずオフショア開発拠点に英語を理解できる方が多く、またチャットなどの文字ベースのコミュニケーションが多いため、英語の読み書きができれば最低限の意思疎通は図ることができると感じています。 特に"書き"の部分が大変ですが、翻訳ツールなどを活用すれば難しい内容や複雑な内容も伝えることができます。 ただし、大学入試程度の読み書きはできた方が良いのではないかと思います。 というのも、翻訳ツールがこちらの意図通りに翻訳してくれない場合があり、そういった誤訳に気づくためです。 (これはツールの問題ではなく元の文章の問題であることが多いで悪しからず。) 加えて、日本語と ベトナム語 の両方を話せる人の存在にも助けられています。 オフショア開発拠点に通訳の方や日本語が話せるエンジニアがいるため、仕事を依頼するときや会議の時に通訳をお願いしています。 しかし日本語が完璧に理解できるというわけではないので、こちらも難しい言葉や独特の言い回しを避けるなど、相手が理解しやすい話し方を行うことが重要になります。 このように最低限の仕事を行うことはできているものの、英語または ベトナム語 を話せた方が仕事の幅は確実に広がると思います。 隣の席のブリッジSEが ベトナム人 の方なのですが、日々の進捗確認や実装方法の相談、成果物レビューのフィードバックを通訳を介さずビデオ通話されているのを見るとその方が確実に仕事が捗るよなぁと思います。 オフショア開発拠点に英語が話せる方も多いと聞いているので、 英会話教室 などに通って勉強しようかと少し真剣に考えはじめているところです。 慣習や国民性の違いについて 以前のイメージ「慣習や国民性の違いで諍いや行き違いが頻発してトラブルが多そう...」 ↓ 実際に働いてみて「相手に配慮することは大変だが、それが信頼関係につながる!」 日本と ベトナム では慣習や国民性が違う点もあり、その違いが原因で失敗したこともあります。 例えば、日本人は直接的な表現よりも間接的または遠回しな表現を好む傾向にあると聞いたことがあります。 ところが ベトナム の方は真逆らしく、私が「○○を参考にして欲しい(○○の通りに実装して欲しいな...)」とコメントしたら全く別の方法で実装されてしまったことが何度かありました。 これは文字通り参考例の一つとして受け取られてしまったようで、私も日本人特有といわれる 空気 の力に頼ったコミュニケーションに慣れていたことを思い知らされました。 (もちろん日本人が相手の場合でも意図が伝わり辛いコメントの仕方なのではないかと反省しています。) 私はこのような地雷を一つずつ踏み抜きながら学んでいる最中なので、ときに疎ましく感じてしまうこともあります。 一方で、私の所属するチームでは週に一回オフショア開発拠点のメンバーに感謝を伝えるという取り組みを行なっています。 これは日本人と真逆で、 ベトナム人 は自分の仕事に自信や誇りを持つ人が多いという国民性の違いに配慮した取り組みです。 この取り組みは評判が良いようで、モチベーションや 帰属意識 の向上に繋がっているという声を聞きます。 このように、相手の慣習や国民性に配慮することは一朝一夕にできないことが多くて大変です。 しかしこちらが配慮すれば仕事もうまく進むようになり、この積み重ねが信頼関係の構築につながっているように感じています。 仕事の進め方について 以前のイメージ「オフショア開発拠点から質問や問い合わせが大量に来て、対応するのがとても大変そう」 ↓ 実際に働いてみて「思ったより質問や相談が来ない!?」 実は私が体験したことの中で、最もギャップを感じたのはこの点です。 オフショア開発先のエンジニアは依頼内容に不明点などがあっても確認せずに開発を進めてしまう方が多い傾向にあるように感じています。 例えば不具合修正の場合、ブリッジSEが依頼内容を整理したドキュメントを作成し、必要があればビデオ通話で内容を説明するなどして修正を依頼します。 このとき依頼ドキュメントの内容に間違いや漏れが出てしまうことがありますが、そういった不明点を確認しないまま仕事を進めてしまう方が多い印象を受けます。 レビューのときに間違いに気付くことができますが、場合によっては手戻りが発生して 工数 が無駄になってしまいます。 この点についてオフショア開発の経験が豊富な方に聞いてみたところ 「不明点を都度確認したり、曖昧な仕様を少しずつ相談して明確化しながら開発を進める人の方が少数だ」 と教えていただいて、とても大きなカルチャーショックを受けました。 もちろん、オフショア開発拠点側から見ると距離的な問題や話す言語の違いによって気軽に質問しづらい環境であることも理由の一つだと思うので一概には言い切れません。 しかし私自身、このギャップを受け止めて仕事のやり方を変えなければ!と思いました。 例えば、下記の点に気をつけながら仕事を依頼できるように心がけています。 依頼前の準備を怠らず、なるべくブリッジSE自身が不明点を解消してから依頼ドキュメントの作成や仕事の依頼を行う 重要な内容は口頭で伝えるだけでなく資料等に記載し、文字ベースの情報を残す 定期的に声をかけるなどして質問しやすい雰囲気を作る 質問は早めに返す(返事が遅ければ質問しても意味がないと思われてしまい、質問してくれないようになってしまうため) 可能であれば中間成果物を提出してもらい、認識齟齬がないか確認しながら仕事を進める 以上のような互いの考えや癖を知ることができれば対策を立てることができ、お互いに気持ちよく仕事ができるようになると考えています。 こういった小さな違いを敏感に感じ取ることも、ブリッジSEに求められる役割の一つであると感じています。 品質について 以前のイメージ「品質が悪く可読性の低いコードばかりでレビューが大変なんじゃないだろうか...?」 ↓ 実際に働いてみて「品質はそれほど悪くないが、保守性や可読性に少々難があるように感じる。」 私のチームでは、オフショア開発先が提出した成果物のレビューは ブリッジSE→日本のエンジニア の順番で行います。 このため、ブリッジSEがありのままの状態の ソースコード をレビューすることになります。 今まで、何回かレビューする機会がありましたが、冒頭の通り品質はそこまで悪くないと感じています。 やはり日本のエンジニアと比べて仕様の理解に差があるためテスト観点の漏れなどが見つかりますが、 主要なケースは一通り網羅されているように感じています。 一方で ソースコード の保守性や可読性には少々難があるように感じています。 例えば 命名 がわかりにくい コメントがあまり書かれていない ネストが深かったり整理しきれてない分岐がある 責務分割の観点から見て適切なクラスに処理が実装されていない 等、様々な指摘が行われます。 やはり話す言語の問題、仕様理解や アーキテクチャ 理解の差、スキルセットの違いなど様々な原因があると思われますが、こういった問題への対応は日本とオフショア開発先の間に立つブリッジSEの重要な役割であると思います。 実際に私の所属するチームでは、英語に訳したレビュー観点一覧を作成したり、オフショア開発先での内部レビューを支援するために日本のエンジニアに聞いたコツやノウハウを共有するなど様々な取り組みを行っています。 こういった取り組みを通して日本とオフショア開発先のエンジニアの両方に貢献できることもブリッジSEの醍醐味ではないかと思います。 まとめ 私自身、初めての経験ということもあり毎日いろんな壁にぶつかっています。 しかしブリッジSEの仕事を経験できたことは非常に幸運だと思っています。 特に話す言語や慣習が違うからこそ、 誰かと一緒に仕事をする上で普遍的に重要なこと が学べているのではないかと考えています。 また自分と文化的な背景が異なる人と働くことということは、それだけで仕事以外でも様々な気づきを得られてなかなかに知的好奇心を刺激されます。 (私もコロナが落ち着いたら ベトナム に行ってみたくなりました。) 以上の内容が、オフショア開発やブリッジSEという仕事に興味を持つきっかけになれば幸いです。 長文になりましたが、最後まで読んでいただき本当にありがとうございました。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター