TECH PLAY

株式会社ラクス

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

927

技術広報の yayawowo です。 いつも ラク スのエンジニアブログをお読みいただき、ありがとうございます! 今回は、11月に開催した 【ラクスMeetup】急成長SaaSの生産性向上戦略/オフショア、SRE、属人化対策 の発表内容について紹介させていただきます! 本イベントには、当社の中でも特に大型開発の楽楽精算を担当している、開発最前線のエンジニアが2名が登壇しました。 SaaS 開発に携わる方のご参考になれば幸いです! イベントの詳細は以下をご確認ください。 ・ 急成長SaaSの生産性向上戦略/オフショア、SRE、属人化対策 - connpass 発表の紹介 楽楽精算のリリースプロセス最適化 多拠点開発の生産性を飛躍的に向上させるプロジェクト管理手法 おわりに 発表の紹介 それではここから各発表内容と資料を共有させていただきます! 楽楽精算のリリースプロセス最適化 登壇:根井 達規 [担当サービス: 楽楽精算 ] まずは、楽楽精算開発課の根井から「楽楽精算のリリースプロセス最適化」についての発表です! 楽楽精算では開発チームからリリース担当者を選出し、プロダクト全体のスケジュールの策定から本番リリースまでの作業フローをリリース担当者が一括管理することで、開発全体の作業効率化を図りリリースの品質と精度を保ってきました。 本セッションでは、ユーザー数が増加し開発規模も拡大してくなかでの 開発成果物をどのようにして効率よくサービスインするのか リリース担当者の役割 取り組みから見えてきた課題 今後の作業効率化に向けた展望 についてご紹介させていただきました。 speakerdeck.com 多拠点開発の生産性を飛躍的に向上させるプロジェクト管理手法 登壇:樋口 朱理 [担当サービス: 楽楽精算 ] 楽楽精算の開発規模が大きくなり、 ベトナム 拠点でオフショア開発をしています。 言葉の壁、文化の違いで認識齟齬が起きやすい環境下において、多拠点開発における生産性は、多くの方が困っている大きな課題の一つかと思います。 楽楽精算開発が実践している、円滑なプロジェクト進行に欠かせないマネジメントのノウハウ、コミュニケーションのノウハウを楽楽精算の樋口よりご紹介させていただきました! speakerdeck.com おわりに 「【Meetup】急成長 SaaS の生産性向上戦略/オフショア、SRE、属人化対策」はいかがでしたでしょうか? 今回は楽楽精算開発課から2名の現役エンジニアに登壇いただきました。 ラク スのエンジニア自身も生産性の向上に向けたプ ラク ティスに日々取り組んでいます。 是非、楽楽精算の課題や教訓が SaaS 開発に携わる方の一助となれば幸いです。 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
(本記事は2024/6/6時点の情報にアップデートしております) こんにちは、技術広報の yayawowo です。 突然ですが、株式会社 ラク スと聞いて何を思い浮かべますでしょうか? 弊社 ラク スでは、様々なプロダクトを展開していますが正直認知度は低いと思っております。 そこで今回、弊社についてもっともっと知っていただくため・・・ ラク スが展開している全10プロダクト 全10プロダクトの技術スタック インフラ/SRE/デザイナーの技術スタック について、ご紹介させていただきます! SaaS 開発に携わる方、弊社に少しでも興味を持っている方の一助となれば幸いです! ラクスが展開している全10プロダクトとは? バックオフィス向け フロントオフィス向け 10プロダクトの技術スタック 楽楽販売 楽楽精算 楽楽明細 楽楽電子保存 楽楽勤怠 MailDealer 配配メール Curumeru blastmail & blastengine フロントエンドの技術スタック インフラ・SREの技術スタック インフラ SRE デザイナーの利用ツール UIデザイナー エンジニア/デザイナーの募集職種 過去イベント動画をYoutubeで公開中 終わりに ラク スが展開している全10プロダクトとは? まずは、弊社が展開しているプロダクトを一覧で見てましょう。 いくつのプロダクトをご存知でしょうか? バックオフィス向け 名称 主な利用部門 提供機能 リリース年 楽楽販売 複数のスタッフでデータや 情報共有が必要な さまざまな部門 ・販売管理 ・請求管理 ・稟議申請管理  2008年 楽楽精算 交通費精算や経費精算の申請や 支払手続を行う 営業や 経理 部門 ・交通費精算 ・経費、出張精算  2009年 楽楽明細 請求書、支払明細といった 帳票を扱う 営業や 経理 部門 ・帳票:請求書、納品書、支払明細 ・発送方法:WEB、メール添付、郵送、FAX  2013年 楽楽勤怠 打刻や休暇申請を行う 全従業員 と 勤怠の締めを行う 総務人事部門 ・打刻機能 ・打刻修正、休暇、残業などの申請 ・休暇管理 2020年 楽楽電子保存 請求書、支払明細といった 帳票を扱う 営業や 経理 部門 ・帳票の電子保存・一元管理 2022年 フロントオフィス向け 名称 主な利用部門 提供機能 リリース年 MailDealer 複数名のスタッフでメール対応を している カスタマーサポート部門 ・問合せメールの返信状況管理 ・顧客との対応履歴管理 2001年 配配メール 見込客や顧客にメルマガを 配信している 営業や マーケティング 部門 ・大量高速メルマガ配信 ・メルマガ配信の効果測定 ・エラーアドレスのクリーニング 2007年 Curumeru 同じ ・大量高速メルマガ配信 ・メルマガ配信の効果測定 ・エラーアドレスのクリーニング ・メールの承認フロー 2011年 blastmail & blastengine 見込客や顧客にメルマガを 配信している 営業や マーケティング 部門 ・大量高速メルマガ配信 ・メルマガ配信の効果測定 ・エラーアドレスのクリーニング - 3つ以上知っていてる方は、 ラク スマニアと言っても過言ではないですね! 初めて聞いた!という方がおりましたら、是非サイトにいき、ご確認いただけますと幸いです。 10プロダクトの技術スタック では、我々 ラク ス開発本部についてご紹介していきたいと思います。 ラク ス開発本部のミッションは 「日本を代表する SaaS 開発エンジニア集団へ」 を掲げております。 また、弊社はおよそ2年おきに最新プロダクトをリリースしております プロダクトの技術選定は、「ベスト・オブ・ブリード(Best of Breed)」という考えのもとリリース時により良い最適な技術を採用しております。 そのような背景も踏まえ、 ラク ス開発本部にて扱っている10プロダクトの 技術スタック をこれからご紹介していきたいと思います! 楽楽販売 図1:楽楽販売の技術スタック 楽楽販売 は、販売管理・案件管理をはじめとした、あらゆる社内業務をシステム化することができるWebデータベースシステムです。 Excel での業務管理を卒業して、販売管理などの業務を ラク にします。 リリースは2008年10月であり、14年以上続いているプロダクトになります! また、楽楽販売の開発拠点は、 関西 となります。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 PHP MW PostgreSQL 、 Postfix 、 Apache 、Redis FW・ライブラリ Zend Framework 、 jQuery 開発ツール PhpStorm、GitLab、 GitHub Copilot CI・テスト Selenium /Selenide、 PHPUnit 、 JMeter 、Jenkinsm、PHPStan ※2024/6/6時点での情報です。 楽楽販売は、 CRM (BtoB向け)のシステムであり API 連携が多いのが特徴です。 また、お客様がノンコード(UI上)で処理を作成できるといったプロダクト特性があります。 楽楽精算 図2:楽楽精算の技術スタック 楽楽精算 は、経費・交通費・出張費・旅費・交際費など、お金にかかわる全ての処理を一元管理できる クラウド 型の交通費・経費精算システムです。 リリースは、2009年7月で弊社の中でも最も勢いのあるプロダクトであるため、開発規模も最大になります。 開発拠点は、 東京・ ベトナム です。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 Java 、Swift、Kotlin MW PostgreSQL 、 Postfix 、 Apache 、Room FW・ライブラリ Spring Boot、 jQuery 、Retrofit2 開発ツール GitLab、 IntelliJ IDEA、 Xcode 、 Android Studio 、Flyway、 Redmine 、 Github CI・テスト Selenide、Gradle、 JMeter 、 jUnit 、Jenkins、Bitrise ※2024/6/6時点での情報です。 技術の選定の大きな方針としては、保守性の観点で、なるべく普及しているものを選定するようにしています。 また、主要な開発言語は Java 、上記に記載したツールを利用し、開発を行っております。 楽楽明細 図3:楽楽明細の技術スタック 楽楽明細 は、請求書・納品書・支払明細・領収書などをWEB・メール・郵送で自動発行し、 印刷・封入・発送などの帳票発行の手間をゼロにする クラウド サービスです。 リリースは2013年9月、開発拠点は 東京・ ベトナム です。 市場の成熟とともに急激に伸びているプロダクトになります! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 Java 、TypeScript MW PostgreSQL 、 Apache 、 Postfix 、Docker FW・ライブラリ React、Redux、SpringBoot、JasperReports、 Lombok 、Jooq、 jQuery 、GraphQL 開発ツール IntelliJ IDEA、 Redmine 、GitLab、gulp.js、webpack、Storybook CI・テスト Gradle、 JMeter 、 jUnit 、TestCafe、SonarQube、Jenkins、Cypress、Spock ※2024/6/6時点での情報です。 サーバーサイドを Java で、フロントエンドをTypeScriptで構築しています。 サービスローンチから8年を数え、比較的古い アーキテクチャ となっているコア部分と、新しいFWなどを用いた部分とがハイブリッドになっています。 主要な新規機能開発部はサーバーサイドとフロンドを分離されており、SpringBootやReactを用いて開発をしています。 DDDを用いた設計手法の導入、 モノリス から バッチ処理 部分を分離して アーキテクチャ を更新する、オフショア開発をスタートするなど、 サービスの成長に合わせて開発手法や組織を変化させていっています。 ◆ 技術・デザイン情報ページ フロント刷新から設計手法アップデートまでバランス感覚を活かして幅広く推進 | ストーリー | 株式会社ラクス キャリア採用 楽楽電子保存 図4:楽楽電子保存の技術スタック 楽楽明細 は、楽楽明細と連携し、電子発行された請求書・納品書・支払明細・領収書などを 保存・一元管理できるサービスです。 電子帳簿保存法 対応により、ニーズが高まっているプロダクトです! リリースは2022年、開発拠点は 東京・ ベトナム です。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 Java 、TypeScript MW PostgreSQL 、 Apache 、 Tomcat 、 Postfix 、Docker、 Kubernetes FW・ライブラリ React、Redux、MUI、styled-components、Spring Boot、Jooq 開発ツール IntelliJ IDEA、 GitHub 、Vite、Storybook CI・テスト Gradle、 JUnit 、SonarQube、Jenkins、 GitHub Runner、Jest、Cypress、argoCD ※2024/6/6時点での情報です。 楽楽勤怠 図5:楽楽勤怠の技術スタック 楽楽勤怠 は、主に中小企業3,000社超のバックオフィスの効率化を実現した クラウド 型経費精算システム「楽楽精算」の開発・提供で培った様々なノウハウを活用し、勤怠管理業務の効率化を実現する クラウド サービスです。 リリースは2020年10月となります! 主な開発拠点は、 東京・ ベトナム です。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 PHP , JavaScript MW MySQL , Apache FW・ライブラリ Flow, Vue.js 開発ツール GitLab, PhpStorm CI・テスト Selenium , Ansible ※2024/6/6時点での情報です。 ラク ス社内では目新しい技術を多く利用しており、DDDを用いた設計思想を取り入れ、フロントエンドとバックエンドを切り離した開発を行っています。 開発側にPdM相当の人がいるので、開発主導でサービスをブラッシュアップしていけます。 MailDealer 図6:Maildealerの技術スタック MailDealer は、顧客からの問合せメールを共有・一元管理し、メール対応業務を効率化するツールです。 2001年4月にリリースされ、最も古いプロダクトとなります。 主要な開発拠点は 大阪・ ベトナム になりますが、フロントエンドは 東京 と拠点を分けた体制です! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 PHP 、Node.js MW PostgreSQL 、 Apache 、 Postfix FW・ライブラリ Laravel、 jQuery 、CKEditor、Socket.IO、Vue.js 開発ツール PhpStorm、 Redmine 、GitLab、Trello、 GitHub Copilot CI・テスト Selenium /Selenide、 PHPUnit 、Jenkins、Ansible ※2024/6/6時点での情報です。 主要な開発言語は PHP 。 リアルタイム通信部分にはNode.js(+Socket.IO)も利用しています。 20年以上の歴史を持つサービスながら、オフショア開発、 リファクタリング や新技術のハイブリッド導入など新たな領域にもチャレンジし続けているサービスです! 配配メール 図7:配配メールの技術スタック 配配メール は、中小企業の集客・販促活動に携わる方のメール配信業務を支援するメール マーケティング の実践に最適なメール配信サービスです。 リリース日は、2007年5月になります。 なお、MailDealerと同様、開発拠点は 大阪・ ベトナム ですがフロントエンドは 東京 になります! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 PHP MW PostgreSQL 、 Postfix 、Nginx、 Apache 、Redis FW・ライブラリ Slim、 jQuery 、Vue.js 開発ツール PhpStorm、 REDMINE 、GitLab、Docker、 GitHub Copilot CI・テスト Puppeteer、Jenkins、 JMeter 、 PHPUnit 、PHPStan、 PHP _CodeSniffer、PHPDoc、Ansible ※2024/6/6時点での情報です。 開発言語は PHP 、 フレームワーク は国産 OSS を自社拡張したものを採用しています。 大量メール配信による マーケティング ツールのサービス基盤を自社でメンテナンスしながら、初期リリースから15年以上サービスを継続させています。 また、近年需要が高まりつつあるデジタル マーケティング ツールとして、最新のWeb技術も取り入れながら機能強化を続けています。 変化の激しい マーケティング のビジネス領域に適応するため、 アジャイル 開発や プロダクトマネジメント 手法を取り入れることにもチャレンジしています! Curumeru 図8:Curumeruの技術スタック Curumeru は、低コストで導入できる大量メール配信サービスです。 2011年6月にリリースされており、開発拠点はこちらも 大阪・ ベトナム ! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 PHP MW PostgreSQL 、 Postfix 、 Apache FW・ライブラリ jQuery 開発ツール PhpStorm、 REDMINE 、GitLab、 GitHub Copilot CI・テスト Jenkins、Ansible ※2024/6/6時点での情報です。 開発言語は PHP 、 フレームワーク は配配メールのものをベースに構築されています。 配配メールをベースにしつつ、 API 連携やメールリレーなどの大量メール配信機能をより強化した仕組みで構築されています。 初期リリースから約10年間、お客様のシステムのメール配信を支えています。 現在は ベトナム のオフショアチームが中心となって開発しています。 blastmail & blastengine 図10:blastmail & blastengineの技術スタック blastmail と blastengine は、独自開発した配信エンジンと大規模ネットワークにより、280万通/時の超高速配信を実現した クラウド 型メール配信サービスです。 開発拠点は 東京 で、グループ会社である ラク スライト クラウド が扱っているプロダクトになります! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 TypeScript、 JavaScript 、 PHP 、 Java 、Go MW Apache 、nginx、jetty、 PostgreSQL 、MongoDB、RabbitMQ、 Memcached 、 Postfix FW・ライブラリ React、Laravel、 CakePHP 、SpringBoot 開発ツール Docker、GitLab、 Redmine 、StoryBook、OpenAPI、GitBook、Slack、 AWS 、 GitHub Copilot CI・テスト GitLab-CI、Jenkins、SonarQube、Jest、ReactTestingLibrary、cypress、 PHPUnit 、 jUnit ※2024/6/6時点での情報です。 マルチな言語環境、マイクロサービスの最適化を目指して日々邁進中です。 直近ではフロントエンドとバックエンドの分離を進めており、より ユーザビリティ や可搬性の高いシステムとサービス品質の向上を目指しています。 フロントエンドの技術スタック ラク スには各プロダクト開発チームの他に、フロントエンド開発を専門とする「フロントエンド開発課」があります。 楽楽シリーズ・ ラク スシリーズの各 SaaS 製品における新機能追加、パフォーマンス向上、技術的改善や刷新などを行っています。 様々なサービスにおいて活躍できる横断組織として、多様な業務に挑戦しています! ◆ 技術スタック一覧 カテゴリ 内容 使用言語 HTML、 CSS 、 JavaScript 、TypeScript FW・ライブラリ React、MUI、RHF、zod、Tanstack Query、zustand、jotai、axios、Sass、Vite、webpack、ESLint、Prettier、Storybook、msw、Vue.js、Neos Flow、axios、npm、Sass 開発ツール GitLab、 GitHub 、ChatGPT Teams、 GitHub Copilot、 Redmine 、PhpStorm、 VSCode 、Swagger、 Figma CI・テスト GitLab CI、 GitHub Actions、Playwright、Jest、Vitest ※ JSP 、 jQuery は新規で作成しませんが、既存機能の理解や改修を行うことはあります。 ※2024/6/6時点での情報です。 インフラ・SREの技術スタック 前述した10プロダクトを支えているのが、インフラ部門になります。 今回はインフラの技術スタックだけでなく、社内バックオフィス業務の自動化を推進して頂くSREの技術スタックについてもご紹介したいと思います! なお、インフラ部門の開発拠点は 大阪、東京 、SRE部門は 東京 です。 インフラ まずは、インフラの技術スタックをご紹介します。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 Python 、 PHP プラットフォーム On-Premise、 AWS (EC2、ECS、EKS、RDS、S3、Lambda など) ネットワーク Cisco 、 Dell 、Fortinet、F5Networks OS CentOS 、 Amazon Linux 仮想化基盤 VMware 、Nutanix MW MySQL 、 PostgreSQL 、 Apache 、 Tomcat 、Nginx など IaC Ansible、Terraform その他ツール Git、Jenkins、 Selenium 、Rundeck、Serverspec、 GitHub Copilot 運用・監視 Zabbix、Grafana、Prometheus、ElasticStack ※2024/6/6時点での情報です。 9割のサービスリソースをオンプレミスで構築しております。 オンプレミス環境でも自動化など、なるべくソフトウェア視点のアプローチが出来るようにHCIで基盤構築し運用効率化をしています。 今後のアップデートとしては、 クラウド で先行構築した クラウド ネイティブなコンテナ環境やCI/CD環境などをオンプレミス環境にフィードバックし、自動化、自立化を推進しつつもコスト優位性を出せるシステムを構築していきます。 SRE 続いて、SREの技術スタックをご紹介します。 ◆ 技術スタック一覧 カテゴリ 内容 使用言語 Go プラットフォーム On-Premise、 AWS 仮想化基盤 Kubernetes MW PostgreSQL , Amazon Aurora 、Redis, Kafka FW・ライブラリ Gin、gRPC 開発ツール GitHub 、Docker CI/CD GitHub Actions、ArgoCD、Argo Workflows、Argo Event、 Hshicorp Vault IaC Terraform、Helm 運用・監視 Grafana Stack ※2024/6/6時点での情報です。 主にGoを利用しており、一部 Python も併用しています。今後はGoに言語は統一していく予定です。 新しい技術スタック調査などを進めながらノウハウを各サービスへ広めることで、開発部門全体の アーキテクチャ 刷新へ寄与していきます。 デザイナーの利用ツール ラク スはエンジニアだけでなく、デザイナーも10つのプロダクトを支えております。 職種としては、UIデザイナーとなりますのでこちらの利用ツールも紹介していきたいと思います! デザイナーの所属拠点は、 東京 になります。 UIデザイナー ラク スのプロダクトのUIをデザインします!利用ツールは以下の通りです。 ◆ 技術スタック一覧 カテゴリ 内容 デザインツール Figma コミュニケーションツール Mattermost、Zoom、 Google Meet、FigJam ※2024/6/6時点での情報です。 ラク スのデザイナーはバックオフィスをはじめとする、業務システムの管理画面をデザインします。 業務 ドメイン の知識を学びながら、顧客の課題を理解し、業務をデザインの力で解決します。 業務 ドメイン の知識習得や、デザインの勉強会・輪読会などをおこなっています。 エンジニア/デザイナーの募集職種 前述した通り、 ラク スでは全10のプロダクトを扱っており、 「日本を代表する SaaS 開発エンジニア集団へ」 を目指し日々精進しております。 そんな弊社ですが、まだまだ人が足りておりません。 そこで、下記に 各開発拠点ごとの募集職種を関連するプロダクトとともに整理しました! 皆様のご応募、お待ちしております!! 【開発拠点:東京】 カテゴリ 募集職種 関連プロダクト マネジメント エンジニアリングマネージャー 楽楽精算・楽楽明細・楽楽勤怠 エンジニアリングマネージャー/オフショア 〃 開発 サーバサイドエンジニア/Java 楽楽精算・楽楽明細・楽楽勤怠 サーバサイドエンジニア/PHP blastmail・blastengine プロダクトマネージャー 楽楽精算・楽楽明細・楽楽勤怠 プロジェクトマネージャー 楽楽精算・楽楽明細・楽楽勤怠 プロジェクトマネージャー/PHP blastmail・blastengine プロジェクトマネージャー/フロントエンド 楽楽明細・楽楽勤怠・メールディーラー リードエンジニア/フロントエンド 楽楽精算 フロントエンドエンジニア 楽楽明細・楽楽勤怠・メールディーラー iOSエンジニア 楽楽精算 Androidエンジニア 楽楽精算 QAマネージャー 楽楽精算・楽楽明細・楽楽勤怠 QAエンジニア 楽楽精算・楽楽明細・楽楽勤怠 SETエンジニア 楽楽勤怠 PMO/品質管理 プロダクト横断 Webエンジニア プロダクト横断 デザイン デザインマネージャー/プロダクト プロダクト横断 UIデザイナー/アシスタントマネージャー 楽楽精算 UIデザイナー 楽楽明細・楽楽販売・メールディーラー・配配メール UIデザイナー/ポテンシャル採用 楽楽明細・楽楽販売・メールディーラー・配配メール ※2023/5時点での情報です。 【開発拠点:大阪】 カテゴリ 募集職種 関連プロダクト マネジメント エンジニアリングマネージャー 楽楽販売・メールディーラー・配配メール エンジニアリングマネージャー/インフラ 〃 開発 リードエンジニア/PHP 〃 サーバサイドエンジニア/PHP 〃 プロジェクトマネージャー 楽楽販売 プロダクトマネージャー 楽楽販売 ブリッジSE MailDealer インフラ インフラエンジニア メールディーラー・配配メール・楽楽販売・Curumeru ※2023/5時点での情報です。 過去イベント動画を Youtube で公開中 弊社 ラク スでは、毎週技術イベントを開催しております。 現在 Youtube の「 ラク スチャンネル」にて、過去イベントの アーカイブ 動画を公開中です! 各プロダクトの最前線で活躍しているエンジニアたちが、社内の取り組みを発信していますので是非お時間ありましたらご確認ください。 youtube.com なお、最新の アーカイブ 動画は ラク スDevelopers会員(技術イベント時に登録できるメール会員)限定に公開しております。 もし最新 アーカイブ 動画を見てみたい!という方、まずは技術イベントにご参加いただけますと幸いです! ラク スconnpassページ ラクス - connpass 終わりに ラク スの技術スタックにご興味いただけたでしょうか? 弊社の中では大型開発の楽楽精算を初め、様々なプロダクトが存在しております。 本ブログにより、1つでも多くプロダクトの名前を覚えていただけたら幸いです。 また弊社では、前述した通り募集職種が多くあります。 もし、どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っておりますのでお気軽に以下フォームよりお申込みください。 カジュアル面談お申込みフォーム カジュアル面談について | 株式会社ラクス キャリア採用 長くなりましたら、今後とも ラク スエンジニアブログをよろしくお願いします。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは、技術広報の yayawowo です。 「自動化(オートメーション/Automation)」 今、この言葉を聞いて胸がときめいた方に必見です! 当社主催イベントでも人気の高い 「自動化大好きエンジニアLT会」全5開催分の資料をまとめて紹介します! イベント詳細はこちらをご確認ください! ・ 自動化大好きエンジニアLT会 ・ 自動化大好きエンジニアLT会 - vol.2 ・ 自動化大好きエンジニアLT会 - vol.3 ・ 自動化大好きエンジニアLT会 - vol.4 ・ 自動化大好きエンジニアLT会 - vol.5 目次 目次 手動テストやインフラ構築は自動化しよう APIテスト品質を向上させる Datadog Synthetic Monitoring APIテスト自動化とテストピラミッド TestLinkにテスト結果を自動的に登録 Cypressでサクッと始めるE2Eテスト 自動テスト環境を構築_運用するまで Python製BDDツールでテストを自動化してみた ansible_specでテストをする話 SaasサービスのアプリをAnsibleでデプロイしている話 Ansibleの最新の動向を追ってみた ラクス共通Ansibleコードテンプレートを作った話 Rundeckの紹介 Rundeck,Ansibleを利用したImmutable検証環境構築 GitHub ActionsでGASのデプロイを自動化した 10年前に初めてVBAで業務自動化したときの思い出 ルーティンワークがあったら自動化しよう~バッチ処理のスゝメ~ Firebase + Boltで始める自動化のススメ 開発検証環境の自動化 App Store Connect APIキー対応してみた AWS CDK & CodeBuildの活用例とハマりポイント JobArrangerを用いた自動化の話 オートスケールする GitHub Actions セルフホストランナーを構築してる話 terraform plan 結果の検証を自動化するぞ! with Conftest 自動化を習慣化する コーポレートエンジニアがタスク依頼をZapierで自動化した話〜いい自動化のすすめかた〜 SonarCloudをGitHub Actionsで自動化して品質が見えるようになった話 採用強化中の関連職種 終わりに 手動テストやインフラ構築は自動化しよう 発表者: @M_Yamashii さん speakerdeck.com ◆発表内容 ・インフラのコード化を行い、CI/CDパイプラインを構築 ・構築結果  →開発者は GitHub にPush、マージするのみでデプロイまで可能  →テストやインフラ構築に時間を取らず開発に専念可能 API テスト品質を向上させる Datadog Synthetic Monitoring 発表者: gtongy さん docs.google.com ◆発表内容 ・ API テスト自動化するに至った経緯 ・ API テストを自動化した話 コード品質の貯金を今日から始めよう! ・ API テスト自動化によって、実装に当てる時間をまるっと削れる ・ 潜在的 なバグを未然に防げる基盤を作成 ・はじめは愚直。ただ一度設定すれば立派な資産に API テスト自動化とテストピラミッド 発表者: tom_asa さん APIテスト自動化とテストピラミッド from 友隆 浅黄 www.slideshare.net ◆発表内容 ・何のために自動化するのか? ・PC/ スマホ アプリのE2Eテスト自動化の事例 ・テスト範囲を決めUIを通さずに出来ることを考えよう TestLink にテスト結果を自動的に登録 発表者: t_iseki さん speakerdeck.com ◆発表内容 ・ TestLink とは? ・なぜ TestLink ? ・めんどくさいことは機械に!  → REST API を使ってテスト結果を登録 ・ TestLInk での困りごと Cypressでサクッと始めるE2Eテスト 発表者: 片岡 基 さん speakerdeck.com ◆発表内容 ・Cypressとは?  →特徴、インストール&起動~テスト実行方法 ・Cypress Studioとは?  →シナリオ実行~テスト実行方法  →豊富な機能6選 自動テスト環境を構築_運用するまで 発表者: wanko さん speakerdeck.com ◆発表内容 ・アプリとサイトの自動テスト環境をゼロベースで構築した話 ・苦労したこと  ① iOS を動かせるようになるまで苦労した  ②端末の調達やツールの選定を考える必要があった Python 製BDDツールでテストを自動化してみた 発表者: ijikeman さん Python製BDDツールで自動化してみた from KeijiUehata1 www.slideshare.net ◆発表内容 ・BDD(ビヘイビア駆動開発)ツールの特徴 ・サンプルの実行例 ・メンテナンス後の確認結果 ansible_specでテストをする話 発表者: ijikeman さん Ansible specでテストをする話 from KeijiUehata1 www.slideshare.net ◆発表内容 ・ansible_specとは ・Ansibleのインベントリファイルとプレイファイルブックを使用してserverspecを実行 ・ansible_specの改良 ※改良したプログラムは Qiita をご確認ください Saas サービスのアプリをAnsibleでデプロイしている話 発表者: ijikeman さん SaasサービスのアプリをAnsibleでデプロイしている話 from KeijiUehata www.slideshare.net ◆発表内容 ・Ansible Playbookの事例 ・Ansibleのいけてないところ4つ ・おまけ)Ansible非同期処理について Ansibleの最新の動向を追ってみた 発表者: ijikeman さん Ansibleの最近の動向を追ってみた from KeijiUehata1 www.slideshare.net ◆発表内容 ・Ansibleのリリース年表 ・ansible-coreとansible(コミュニティパッケージ)のメンテナンスポリシー ・おまけ) python 、ansible-core、ansibleのバージョンを指定できるDockerfileを作ってみた ラク ス共通Ansibleコードテンプレートを作った話 発表者: ijikeman さん ラクス共通Ansibleコードテンプレートを作った話 from KeijiUehata1 www.slideshare.net ◆発表内容 ・Ansibleテンプレート化した背景 ・Ansibleテンプレート化の事例  →共通処理、 ミドルウェア Rundeckの紹介 発表者: akio_shimonishi さん speakerdeck.com ◆発表内容 ・自動化とは? ・自動化ツール「Rundeck」の紹介 ・サイト更新を自動化した話 Rundeck,Ansibleを利用したImmutable検証環境構築 発表者: NAGAKE さん speakerdeck.com ◆発表内容 ・Immutableとは? ・複数バージョン毎の検証環境を構築した事例  →利用ツール(Rundeck、Ansible、 GitHub 、仮想化基盤) ・困ったこと、まとめ GitHub ActionsでGASのデプロイを自動化した 発表者: shiorin さん Github Actionsで GASのデプロイを自動化した from ShioriSawada www.slideshare.net ◆発表内容 ・ログラスでのGAS活用事例 ・これまでのデプロイ方法と改善点 ・自動化の方法とは? 10年前に初めて VBA で業務自動化したときの思い出 発表者: tsuemura さん speakerdeck.com ◆発表内容 ・データ入力の仕事を VBA で自動化した話 ・ Excel 関数による生成の問題点 ・自動化によって改善したこと ・自動化によって改善しなかった(改悪された)こと ルーティンワークがあったら自動化しよう~ バッチ処理 のスゝメ~ 発表者: 白栁隆司 さん speakerdeck.com ◆発表内容 ・何のために自動化するの? ・自動化の基準とは? ・ バッチ処理 ( Windows )やShell( UNIX 系)の活用方法 ・ バッチ処理 のコツ Firebase + Boltで始める自動化のススメ 発表者: mako_makok さん speakerdeck.com ◆発表内容 ・勉強会情報を毎日通知してくれるSlackアプリを作った話 ・使用ツールの利点、注意点  →Cloud Functions(Firebase)  →Firebase FireStore  →Bolt For JavaScirpt 開発検証環境の自動化 発表者: Takahiro Yamada さん 開発検証環境の自動化@自動化大好きエンジニアLT会 - vol.2 from Takahiro Yamada www.slideshare.net ◆発表内容 ・専有リモート開発環境を構築した話 ・しんどかったところ、手付かずなところ  →URLの正規化  → MySQL の初期化コスト App Store Connect API キー対応してみた 発表者: saten さん speakerdeck.com ◆発表内容 ・ App Store Connectの二段階認証必須で起きた問題 ・ Apple 周りのCI/CD  → App Store Connect API キーで対応 AWS CDK & CodeBuildの活用例とハマりポイント 発表者: yukiarrr さん speakerdeck.com ◆発表内容 ・ AWS CDKとは? ・ AWS CodeBuildとは? ・ AWS CDK & CodeBuildを使いPRごとにレビュー用の環境を構築した話 JobArrangerを用いた自動化の話 発表者: ryuhei55225 さん speakerdeck.com ◆発表内容 ・JobArrangerとは? ・JobArrangerを用いたジョブ管理の仕組み ・JobArrangerの便利機能 ・JobArrangerでの苦労談 オートスケールする GitHub Actions セルフホストランナーを構築してる話 発表者: miyajan さん オートスケールする GitHub Actions セルフホストランナーを構築してる話 from Jumpei Miyata www.slideshare.net ◆発表内容 ・ GitHub Actionsとは? ・実現したいこと、実現方法  →ジョブの実行に合わせてオートスケールするセルフホストランナープールの構築 ・実際に使って分かった辛い点 terraform plan 結果の検証を自動化するぞ! with Conftest 発表者: Futa Hirakoba さん speakerdeck.com ◆発表内容 ・Terraformとは? ・terraform planの結果を自動で検証した話  →背景、テスト方法の事例  →plan結果をconftestで検証 ・Conftestの導入によって期待できること ・Conftestを使ってみての感想 自動化を習慣化する 発表者: yasuhiroki さん speakerdeck.com ◆発表内容 ・自動化を毎日するには?  →自動化のハードルを下げる ・過度な自動化は技術的負債になるのでは?  →そうならない努力は必要である ・技術的負債を残さない努力とは?  →小さく作る、テスト可能にする・・・など ・自動化のネタ探し≒ 言語化 コーポレートエンジニアがタスク依頼をZapierで自動化した話〜いい自動化のすすめかた〜 発表者: kaori_cho さん speakerdeck.com ◆発表内容 ・いい自動化とは、心のハードルを下げてくれるもの ・心のハードルを下げる自動化 3ステップ  ①観察する  ②てんびんにかける  ③お試しする SonarCloudを GitHub Actionsで自動化して品質が見えるようになった話 発表者: yusuke_sasaki さん docs.google.com ◆発表内容 ・SonarCloudとは? ・ GitHub Actionsで自動化する話  →SonarCloud導入は簡単!  →公式が導入手順を示してくれている 採用強化中の関連職種 株式会社 ラク スでは、エンジニアを積極的に募集しております! 現在募集中の関連職種は以下の通りです。 開発拠点 職種 東京 インフラエンジニア/マネージャー(東京) | 株式会社ラクス インフラエンジニア[東京/楽楽明細] | 株式会社ラクス インフラエンジニア[東京/楽楽労務] | 株式会社ラクス SREエンジニア[東京/インフラ] | 株式会社ラクス 大阪 インフラエンジニア/マネージャー・管理職(大阪) | 株式会社ラクス インフラエンジニア(大阪) | 株式会社ラクス ※2021/11/25時点での情報です。 終わりに 自動化大好きエンジニアたちが語る、効率化・品質向上Tipsはいかがでしたか? 自動化に関するTipsが幅広く、イベント終了時は頭がパンパンになりますよ! また、発表者たちの自動化に対する熱量も高いため毎回大盛況のイベントとなっております。 主催側としても大変有難い気持ちでいっぱいです。 最後までお読みいただきありがとうございました! 是非明日から始める、自動化ライフのご一助となれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 多言語対応とは さっそく環境準備から message.propertiesを作成する Configを設定する ResourceBundleMessageSourceを継承した独自クラスを作成する Controllerから作成したMultiMessageSourceを呼び出す 実行してみる まとめ はじめに はじめまして、バックエンドエンジニアのryrkssです。 今回、担当する開発業務にて、 Java の フレームワーク の中でも有名な Spring Framework にあるSpring Bootを使用して、多言語対応しましたのでそのお話をさせていただきたく思います。 多言語対応で調べたときの記事で動的ではない言語対応方法(ユーザの言語設定に左右されない)の記事が多い印象でした。 たしかにサンプルとしてはいいかもしれないんですが、実際のアプリケーションでは 動的に言語を切り替えたい はずです。 それをSpring Boot + Java で実現する1つの方法を記載したいと思います。 今回のゴールはブラウザ設定に応じた言語で Json レスポンスを返却するというところにおきます。 Spring Bootについてはこちらのブログでも紹介されておりますので参考までに。 ・ 【入門】Spring Bootとは~実践まで - RAKUS Developers Blog | ラクス エンジニアブログ 多言語対応とは その名前の通り、様々な言語に対応することです。 ※念のため補足ですが、ここでいう言語は 話し言葉 の言語であり、 プログラミング言語 ではありません。 さっそく環境準備から こちらは本記事の本題ではないので、さくっと説明します。 以下に手順を書いていきますが、皆さんのやりやすい方法で実行環境を作成してください。 Spring Initializrを使ってプロジェクトを作成 依存関係に org.springframework.boot:spring-boot-starter-web を追加 ※ lombok はお好みで。本記事では使用しています。 Controllerとレスポンスオブジェクトを作成 アプリケーションを実行する   Controller @RestController public class MultilingualController { @GetMapping( "/message" ) public ResponseData message() { return new ResponseData( "多言語対応" ); } } レスポンスオブジェクト @Value public class ResponseData { String message; } これでPostmanなどから API を叩けば、以下のような Json 形式でボディレスポンスが返ってくると思います。 レスポンス { " message ": " 多言語対応 " } ただ見ての通り、固定値の 多言語対応 の文字列を返しているだけなので、 当たり前ですが今のままでは他の言語で返してはくれません。 次からいよいよ多言語対応の実装に入っていきましょう! 本題に入るので順序立てて説明していきます。 message.propertiesを作成する 実際に Json へ返すメッセージをpropertiesファイルで定義します。 ※ yaml でも可能ですのでこちらもお好みで。 本記事はpropertiesの例のみ記載しますので、 yaml の場合は適宜変換してお読みください。 Springでメッセージ管理を行いたい場合、基本的に org.springframework.context.MessageSource を使用します。 このクラスをDIし、使用することでpropertiesファイルから指定されたキーに紐づくメッセージが取得できるようになります。 まずはメッセージの出力元となるpropertiesファイルから作成します。 src/main/resources/ に以下2ファイルを配置し、それぞれ key= value の形でメッセージを記載します。 messages_ja.properties (日本語) application.success=成功 application.error=失敗 messages_en.properties (英語) application.success=succeeded application.error=failed デフォルトはmessages.propertiesが使用されますが、 messages_{ロケール}.properties のように末に対応したい言語の ロケール をファイル名に使用することでリク エス トにより使用するmessagesファイルを動的に振り分けることができます。 ※propertiesで用意していない ロケール がリク エス トで飛んできた場合にmessages.propertiesファイルが使用されます。ここでは分かりやすいように ja , en のみの用意で話を進めます。 ここでのポイントはmessagesプロパティ間でのキーは必ず同一にすることです。 MessageSource を使用するとき、propertiesファイルにあるキー名を指定してそれに紐づく Value を取得する動きとなります。 propertiesファイルの書き方は色々あるので気になる方は調べてください。 これで、出力するメッセージの元は作成できました。 続いて MessageSource の設定をConfigファイルに定義していきたいと思います。 Configを設定する xml ベースで設定もできますが、今回は Java ベースで設定を記述していきます。 ※個人的にはJavaConfigの方が分かりやすくて好きです。 ここでは MessageSource のベース設定をしていきます。 @Configuration public class AppConfig { @Bean public MultiMessageSource messageSource() { MultiMessageSource messageSource = new MultiMessageSource(); // ① messageSource.setBasenames( "messages" ); // ② messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name()); // ③ return messageSource; } } ① MessageSource の実装クラス ResourceBundleMessageSource を継承してカスタマイズする独自クラス 簡単に言うとここでリク エス トヘッダーから Accept-Language を読み取り、それに応じたmessages_xx.propertiesの取得結果を返します。 ※詳細は後述します。 ② どのpropertiesファイルを取得対象とするか resources からの 相対パス かつprefix( _ まで)で定義 ※例: resources/sample/messages_ja.properties → sample/messages また、 messageSource.setBasenames("messages", "sample/paths") のように複数定義することも可能となっており、 自由に定義できるのでアプリケーションの設計により柔軟に対応できると思います。 ③ messages.propertiesを解釈する 文字コード をセット ResourceBundleMessageSourceを継承した独自クラスを作成する ここでは実際にリク エス トの情報を元に動的に messages_xx.properties からメッセージを取得する部分を作っていきます。 といってもこちらで実装する部分は少なく、Springに用意されている AcceptHeaderLocaleResolver というクラスが ロケール の判定を行い、returnしている getMessage メソッドで振り分けを担ってくれるので、その設定を定義してあげるくらいの実装になります。 public class MultiMessageSource extends ResourceBundleMessageSource { @Autowired HttpServletRequest request; // ① public String getMessage(String key, Object ... params) { // ② AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver(); // ③ localeResolver.setDefaultLocale(Locale.JAPANESE); // ④ localeResolver.setSupportedLocales(List.of(Locale.JAPANESE, Locale.ENGLISH)); // ⑤ return super .getMessage(key, params, localeResolver.resolveLocale(request)); // ⑥ } } ① HttpServletRequestをDIする 動的にmessages_xx.propertiesを振り分けるための情報のメインがこの中にあります。 このリク エス トヘッダー内の Accept-Language に設定されている値を⑥で出てくる localeResolver.resolveLocale(request) で使用します。 このヘッダーにはブラウザの言語設定の情報が入ってくるので、言語に応じた情報を返却するメインの情報源となります。 ② 呼び出すメソッドを定義 第一引数:messages_xx.propertiesに設定しているキー 第二引数~:messages_xx.propertiesにパラメータを設定している場合に使用 戻り値:Stringで返ります(messages.propertiesの Value 値) ③ 変換のメインクラスとなる AcceptHeaderLocaleResolver の インスタンス 化 ④ デフォルト ロケール を設定 ここで名前の通りデフォルトで使用する言語情報をセットします。 デフォルト ロケール がmessagesの振り分けに使用されるパターンは以下です。 リク エス トヘッダー内の Accept-Language がNULLの場合 後述する SupportedLocales に値がセットされていない場合 リク エス トヘッダーの言語設定と SupportedLocales の値がマッチしない場合 ⑤ サポート ロケール を設定 ここでは作成するアプリケーションがサポートしている言語は何かを明示的に指定します。 ※List型で渡すことに注意してください。 サポート ロケール がmessagesの振り分けに使用されるパターンは以下です。 サポート ロケール とリク エス トヘッダーの言語設定がマッチする場合 ⑥ 親クラス ResourceBundleMessageSource の親の親.... AbstractMessageSource のgetMessageメソッドの結果を返却 第一引数:messages_xx.propertiesに設定しているキー 第二引数~:messages_xx.propertiesにパラメータを設定している場合に使用 第三引数:Locale{ ロケール }を指定 ※こちらを使用してどのmessages_xx.propertiesから Value を引いてくるかを判定します 今回の多言語対応のメインである、第三引数で行っている localeResolver.resolveLocale(request) について説明します。 AcceptHeaderLocaleResolver クラスの resolveLocale メソッドでリク エス トヘッダーに応じた ロケール を取得してくれます。 そのため、 resolveLocale メソッドには引数として HttpServletRequest を渡してあげるだけでいわゆる動的な多言語対応が実現します。 resolveLocale メソッドでやっていることは前述した④、⑤で設定した内容とリク エス トを使用して ロケール 情報を返しています。 ...ただ正直この中身の作りはいまいちな気がしています。。 個人的には想定外の Accept-Language が来たときは一律デフォルト ロケール を設定してくれればいいと思っているのですが、確実に想定外が発生しないような動きにするにはデフォルト ロケール とサポート ロケール を設定する必要があります。 気になる方はそんなに難しいことはしていないので resolveLocale の中身を見てみてください。 また、私が調べてみた限りの情報なので、もしかしたらもっとうまい方法があるかもしれません。 これで多言語対応の内部ロジックは終わりです。 あとはControllerを少し修正して結果を確認してみましょう! Controllerから作成した MultiMessageSource を呼び出す 冒頭で作成したレスポンスをべた書きしている MultilingualController を修正します。 @AllArgsConstructor @RestController public class MultilingualController { private final MultiMessageSource messageSource; // ① @GetMapping( "/message" ) public ResponseData message() { String message = messageSource.getMessage( "application.success" ); // ② return new ResponseData(message); } } ① カスタマイズしたメッセージクラス MultiMessageSource をDIする ② getMessage メソッドをコールし、引数にmessages_xx.propertiesに定義されているキーを渡す  ※ここではキーだけ渡してますが、パラメータを設定している場合はそれも渡すことが可能です。 実行してみる 実際に想定通りの言語で返ってくるか API を実行してみましょう。 Accept-Language=ja(日本語) 指定した通り日本語でメッセージが返ります。 { " message ": " 成功 " } Accept-Language=en(英語) 指定した通り英語でメッセージが返ります。 { " message ": " succeeded " } Accept-Language=de(ドイツ語)-アプリケーションで想定していない 言語コード 存在しない場合デフォルト ロケール で指定した言語でメッセージが返ります。 { " message ": " 成功 " } Accept-Languageヘッダーなし デフォルト ロケール で指定した言語でメッセージが返ります。 { " message ": " 成功 " } まとめ 長々と書いてきましたが、実際にコーディングするのはごくわずかです。 ほとんどはSpringの標準パッケージの中でよしなにやってくれるので非常に簡単に実装できました。 もちろん他にも作りこめば色々できると思います。 また、今回はブラウザの言語設定によってメッセージを切り替える例をご紹介しましたが、 他にもSpringで多言語対応をするやり方は調べれば出てきます。 例えばUI上で言語を選択して切り替えることもSpringの機能を使用して比較的簡単にできるようです。 気になる方は調べてみてください! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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
アバター
こんにちは、tatsumiです。 いきなりですが、 PHP の標準で用意されている関数について、いくつぐらい知っていますか? 私は今まで PHP での開発経験がなく、7月ごろから PHP の勉強を始めたので、正直ほとんど知りません。。。 ただ、実際に PHP の開発に携わるようになって、関数を知っていることの重要性を改めて実感しました。 PHP を始め、どの言語でも言えることですが、 コードを読むのも、コードを書くのも、関数を”知っている”か”知らない”かで大きく変わってきます。 例えば、コードを読む場合、 関数を知っていればある程度スラスラ読めますが、関数を知らないと新たな関数が出てくる度に調べないといけなくなります。 また、コードを書く場合は、 コードを読む場合と同様に関数を知らないと毎回調べることになりますし、 場合によっては標準で用意されている関数を使わずに自力で実装してしまう、というケースもあると思います。 (実際に私も、自力で実装した後に関数が用意されていることを知ってショックを受けた経験が何度かあります。。。) PHP では多くの関数が標準で用意されています。 この記事では、その中でカテゴリ別によく使いそうな PHP の関数をまとめてみました。 PHP を使う際、こういう関数ってないのかなって思った時の参考にしてもらえればと思います。 www.php.net 文字列操作関数 strlen/mb_strlen(文字列の長さを取得) strcmp/strcasecmp(文字列を比較) substr/mb_substr(文字列を取り出す) trim(先頭と末尾の空白を取り除く) substr_replace/preg_replace(文字列を置換) strpos/preg_match(文字列を探す) strstr(指定文字以降の文字列を取得) substr_count(文字列をカウント) str_repeat(文字列の反復) str_pad(文字埋め) explode(文字列を分割) sprintf(フォーマット) 日付と時刻関数 date(現在日付を取得) getdate(日付を配列で取得) checkdate(日付の妥当性をチェック) mktime(指定した日付のタイムスタンプを取得) time(現在時刻を取得) gettimeofday(現在時刻を取得) ファイル操作関数 copy(ファイルをコピーする) fopen(ファイルを開く) fclose(ファイルを閉じる) fgetc(ファイルから1文字取得) fgets/fgetss(ファイルから1行取得) fpassthru(ファイル内容すべてを取得) fread(ファイルから指定した文字数分取得) readfile(ファイルを出力) filesize(ファイルサイズを取得) file_exists(ファイルの存在チェック) 数学関数 abs(絶対値) ceil(端数の切り上げ) floor(端数の切り捨て) max(最大値を取得) min(最小値を取得) 変数操作関数 empty(変数が空かチェック) intval(変数を整数値として取得) strval(変数を文字列として取得) settype(変数を指定した型に変換) gettype(指定した変数の型を取得) 配列関数 array(配列を生成する) list(配列を値を変数に代入する) PHP よく使う関数 まとめ 文字列操作関数 PHP: String 関数 - Manual strlen/mb_strlen(文字列の長さを取得) strlen(文字列) : int 文字列の長さ(バイト数)を取得します。 文字数を取得したい場合は「mb_strlen」関数を使います。 実行結果は以下のようになります。 <?php   strlen ( 'abc' ) --> 3   strlen ( 'あいう' ) --> 6 ?> <?php   mb_strlen ( 'abc' ) --> 3   mb_strlen ( 'あいう' ) --> 3 ?> strcmp/strcasecmp(文字列を比較) strcmp(文字列1, 文字列2) : int PHP で文字列の比較を行います。 比較結果として返される値は以下の通りです。  文字列1 < 文字列2 ⇒ 負の整数  文字列1 > 文字列2 ⇒ 正の整数  文字列1 = 文字列2 ⇒ 0 「strcmp」関数では大文字と小文字は区別されます。もし区別したくない場合は「strcasecmp」関数を使います。 実行結果は以下のようになります。 <?php   strcmp ( 'abc' , 'def' ) --> -197379   strcmp ( 'abc' , 'ABC' ) --> 2105376   strcmp ( 'abc' , 'abc' ) --> 0 ?> <?php   strcasecmp ( 'abc' , 'def' ) --> -3   strcasecmp ( 'abc' , 'ABC' ) --> 0   strcasecmp ( 'abc' , 'abc' ) --> 0 ?> 関数を使わず==や===でも比較することができます。 ただし、それぞれで微妙に比較結果が変わるため、用途に合わせてどれを使うかを検討しましょう。 substr/mb_substr(文字列を取り出す) substr(文字列, 開始位置 [, 文字数]) : string PHP で開始位置から文字数分の文字列を抽出します。 「substr」関数はマルチバイト文字に対応していないため、日本語を用いる場合は「mb_substr」関数を使いましょう。 実行結果は以下のようになります。 <?php   substr ( 'abcde' , 0 ) --> "abcde"   substr ( 'abcde' , 1 ) --> "bcde"   substr ( 'abcde' , 1 , 3 ) --> "bcd" ?> <?php   mb_substr ( 'あいうえお' , 0 ) --> "あいうえお"   mb_substr ( 'あいうえお' , 1 ) --> "いうえお"   mb_substr ( 'あいうえお' , 1 , 3 ) --> "いうえ" ?> 引数の開始位置や文字数に負の数を指定した場合は、末尾からの開始位置、文字数になります。 <?php   substr ( 'abcde' , -3 ) --> "cde"   substr ( 'abcde' , 1 , -1 ) --> "bcd" ?> <?php   mb_substr ( 'あいうえお' , -3 ) --> "うえお"   mb_substr ( 'あいうえお' , 1 , -1 ) --> "いうえ" ?> trim(先頭と末尾の空白を取り除く) trim(文字列 [, 取り除く文字]) : string 文字列の先頭と末尾から、空白文字を取り除きます。 取り除く文字が指定されている場合は、文字列の先頭と末尾から指定された文字を取り除きます。 ※「trim」関数で空白文字と見なされるのは" \t\n\r\0\x0B"なので、タブや改行を含みます。 実行結果は以下のようになります。 <?php   trim ( ' abc ' ) --> "abc"   trim ( ' abc ' , 'x' ) --> " abc "   trim ( 'xxxabcxxx' , 'x' ) --> "abc" ?> PHP では他に、先頭だけを対象にする「ltrim」関数や末尾だけを対象にする「rtrim」関数もあります。 substr_replace/preg_replace(文字列を置換) substr_replace(文字列1, 文字列2, 開始位置 [, 文字数]) : string 文字列1の開始位置以降の文字列を文字列2で置換します。 文字数が指定されている場合は、開始位置から指定された文字数分を置換します。 実行結果は以下のようになります。 <?php   substr_replace ( '1234567890' , '#' , 5 ) --> "12345#"   substr_replace ( '1234567890' , '#' , 5 , 2 ) --> "12345#890" ?> PHP では、引数の開始位置や文字数に負の数を指定した場合は、末尾からの開始位置、文字数になります。 「preg_replace」関数を使うと、 正規表現 を使用した置換が可能です。 preg_replace(検索文字列, 文字列1, 文字列2) 文字列1の中で、検索文字列に合致した文字列を文字列2へ置換します。 検索文字列は、 正規表現 を使った文字列を指定できます。 strpos/preg_match(文字列を探す) strpos(文字列1, 文字列2 [, 検索開始位置]) : int/false 文字列1の中で、文字列2が最初に現れる位置を探します。 文字列2が含まれない場合は、FALSEを返します。 実行結果は以下のようになります。 <?php   strpos ( 'abcdeabcde' , 'c' ) --> 2   strpos ( 'abcdeabcde' , 'f' ) --> FALSE   strpos ( 'abcdeabcde' , 'c' , 3 ) --> 7 ?> 「preg_match」関数を使うと、 正規表現 を使用した検索が可能です。 preg_match(文字列1, 文字列2 [, 配列] [, 動作フラグ] [, 検索開始位置]) : int/false 文字列1の中に文字列2が含まれるかを確認します。 含まれる場合は1、含まれない場合は0を返します。 文字列2には、 正規表現 を使った文字列を指定できます。 strstr(指定文字以降の文字列を取得) strstr(文字列1, 文字列2) : string/false 文字列1の中に文字列2が含まれるかを確認します。 含まれる場合は、文字列2を含んだ文字列の終わりまでを返します。 実行結果は以下のようになります。 <?php   strstr ( 'abcdefg' , 'cd' ) --> "cdefg"   strstr ( 'abcdefg' , 'xyz' ) --> FALSE ?> substr_count(文字列をカウント) substr_count(文字列1, 文字列2) : int 文字列1の中で文字列2の出現回数を返します。 実行結果は以下のようになります。 <?php   substr_count ( 'aabbbcccc' , 'b' ) --> 3   substr_count ( 'aabbbcccc' , 'd' ) --> 0 ?> str_repeat(文字列の反復) str_repeat(文字列, 反復回数) : string 文字列を反復回数分繰り返します。 実行結果は以下のようになります。 <?php   str_repeat ( "abc" , 3 ) --> "abcabcabc" ?> str_pad(文字埋め) str_pad(文字列, 文字列の長さ, 埋める文字, 文字埋めタイプ) : string 文字列の左、右、または両側を文字列の長さに合わせて、埋める文字で埋めます。 埋め込む位置は、文字埋めタイプで指定します。 左埋め:STR_PAD_LEFT、右埋め:STR_PAD_RIGHT、両側埋め:STR_PAD_BOTH 実行結果は以下のようになります。 <?php   str_pad ( "abc" , 8 , "X" , STR_PAD_LEFT ) --> "XXXXXabc"   str_pad ( "abc" , 8 , "X" , STR_PAD_RIGHT ) --> "abcXXXXX"   str_pad ( "abc" , 8 , "X" , STR_PAD_BOTH ) --> "XXabcXXX" ?> PHP では、埋める文字が指定されていない場合は、空白で埋められます。 埋める文字数が埋める文字の長さで均等に分割できない場合は、切り捨てられるので注意。 (マルチバイト文字を使用するときも注意) <?php   str_pad ( "abc" , 5 , "12345" , STR_PAD_LEFT ) --> "12abc"   str_pad ( "abc" , 8 , "あああああ" , STR_PAD_RIGHT ) --> 文字埋め部分が文字化けしてしまう ?> explode(文字列を分割) explode(区切り文字, 文字列 [, 要 素数 ]) : array 文字列を区切り文字で分割します。 要 素数 が指定されている場合は、先頭から要 素数 分を分割し、残りの文字列は配列の最後に格納されて返されます。 実行結果は以下のようになります。 <?php   explode ( " " , "aaa bbb ccc" ) --> [ "aaa" , "bbb" , "ccc" ]   explode ( " " , "aaa bbb ccc" , 2 ) --> [ "aaa" , "bbb ccc" ] ?> PHP では、文字列を分割する関数として「preg_split」関数や「str_split」関数もあります。 「explode」関数が簡単で汎用的に使えますが、用途に応じて PHP の関数を使い分けましょう。 sprintf(フォーマット) sprintf(フォーマット文字列 [, 任意の文字や値...]) : array フォーマット文字列に従い、任意の文字や値を使って文字列を生成します。 実行結果は以下のようになります。 <?php   sprintf ( "今日は%d年%d月%d日です。" , 2021 , 11 , 1 ) --> "今日は2021年11月1日です。" ?> 日付と時刻関数 PHP: 日付・時刻 関数 - Manual date(現在日付を取得) date(フォーマット [, 日時]) : string 現在日時をフォーマットに指定された形式で返します。 日時を指定した場合は、指定した日時をフォーマットに指定された形式で返します。 実行結果は以下のようになります。 <?php   date ( "Y年m月d日 H:i:s" ) --> "2021年11月1日 10:30:00"  ※ 現在日時が返される   date ( "Y年m月d日 H:i:s" , mktime ( 12 , 0 , 0 , 11 , 1 , 2021 )) --> "2021年11月1日 12:00:00" ?> フォーマットで使用できるフォーマット文字は以下のとおりです。 フォーマット文字 意味 a am または pm A AM または PM d 2桁の日付 D 3文字の曜日(Sun~Sat) f 月の英字(フルスペル) h 12時間単位の時間(00~12) H 24時間単位の時間(00~23) g 先頭に0をつけない12時間単位の時間(0~12) G 先頭に0をつけない24時間単位の時間(0~24) i 2桁の分(00~59) j 先頭に0をつけない日付(1~31) l 曜日の英字(フルスペル) L 閏年 は1、それ以外は0 n 先頭に0をつけない月(0~12)) m 2桁のの月(01~12) M 3文字の月(Jan~Dec) s 2桁の秒(00~59) S 英文の序数を表わす接尾語 (th ~ nd) t 指定した月の日数(28~31) U UNIX 時間(1970年1月1日からの秒数) w 数値で示す曜日(0~6) y 西暦(下2桁) Y 西暦(4桁) z その年の1月1日からの通算日 Z タイムゾーン のオフセット秒(-43200~43200) getdate(日付を配列で取得) getdate( [日時] ) : array 指定された日時の日付情報を配列で返します。 日時を指定しない場合は、現在日時の日付情報を配列で返します。 実行結果は以下のようになります。 <?php   $ today = getdate ()   $ today [ "year" ] ---> "2021"   $ today [ "mon" ] ---> "11"   $ today [ "mday" ] ---> "1" ?> 返される配列のキーは以下のとおりです。 配列のキー 値 値の例 seconds 秒 0~59 minutes 分 0~59 hours 時 0~23 mday 月単位の日 1~31 wday 曜日の数値 0(日曜)~6(土曜) mon 月 1~12 year 年 4桁の西暦年数 yday 年単位の日 0~365 weekday 曜日の文字列 Sunday~Saturday month 月の文字列 January~December checkdate(日付の妥当性をチェック) checkdate(月, 日, 年) : bool 指定された日付が妥当かを確認します。 実行結果は以下のようになります。 <?php   checkdate ( 11 , 1 , 2021 ) ---> true   checkdate ( 13 , 1 , 2021 ) ---> false ?> 各パラメータのチェック内容は以下のとおりです。 パラメータ チェック内容 month 1~12の間かどうか day 指定されたmonthの日数の範囲内かどうか。(yearが 閏年 の場合も考慮される) year 1~32767の間かどうか mktime(指定した日付のタイムスタンプを取得) mktime(時, 分, 秒, 月, 日, 年) : int 引数で指定された日付のタイムスタンプを返します。 実行結果は以下のようになります。 <?php   mktime ( 12 , 30 , 30 , 11 , 1 , 2021 ) ---> 1635769830 ?> time(現在時刻を取得) time() : int 現在時刻のタイムスタンプを返します。 実行結果は以下のようになります。 <?php   time () ---> 1636085273 (現在時刻のタイムスタンプ) ?> gettimeofday(現在時刻を取得) gettimeofday() : array 現在時刻情報を配列で返します。 実行結果は以下のようになります。 <?php   $ currentTime = gettimeofday () ;  currentTime [ "sec" ] ---> 1636085273 (現在時刻のタイムスタンプ値) ?> 返される配列のキーは以下のとおりです。 配列のキー 値 sec タイムスタンプ値 usec マイクロ秒の値 minuteswest GMT との差を分で表した値 dsttime サマータイム なら1、そうでない場合は0 ファイル操作関数 PHP: ファイルシステム 関数 - Manual copy(ファイルをコピーする) copy(コピー元のパス, コピー先のパス) : bool コピー元のファイルをコピー先にコピーします。 成功した場合はtrue、失敗した場合はfalseが返されます。 コピー先にファイルが既に存在する場合は上書きされるので注意! サンプルコードは以下のとおりです。 <?php   copy ( "example.txt" , "example.txt.bak" ) ?> fopen(ファイルを開く) fopen(ファイル名, モード) : resource ファイルを指定されたモードで開きます。 ファイル名には、ファイルパスを含んだファイル名を指定します。 サンプルコードは以下のとおりです。 <?php   fopen ( "/home/example/file.txt" , "r" ) ?> モードには以下があります。 モード 意味 ファイル ポインタ ファイルが存在しない場合の挙動 r     読み込みモードで開く                                先頭    エラー r+ 読み込み/書き込みモードで開く 先頭 エラー w 書き込みモードで開く(ファイルの内容をクリア) 先頭 ファイルを新規作成         w+ 読み込み/書き込みモードで開く(ファイルの内容をクリア) 先頭 ファイルを新規作成 a 書き込みモードで開く(ファイルの内容はクリアせず追記) 末尾 ファイルを新規作成 a+ 読み込み/書き込みモードで開く(ファイルの内容はクリアせず追記) 先頭 ファイルを新規作成 x 書き込みモードで開く(ファイルが既に存在している場合はエラー) 先頭 ファイルを新規作成 x+ 読み込み/書き込みモードで開く(ファイルが既に存在している場合はエラー) 先頭 ファイルを新規作成 c 書き込みモードで開く(ファイルの内容はクリアせず先頭から追記) 先頭 ファイルを新規作成 c+ 読み込み/書き込みモードで開く(ファイルの内容はクリアせず先頭から追記) 先頭 ファイルを新規作成 fclose(ファイルを閉じる) fclose(ファイルポインタ) : bool ファイルを閉じます。 成功した場合はture、失敗した場合はfalseを返します。 サンプルコードは以下のとおりです。 <?php   $ file = fopen ( "/home/example/file.txt" , "r" ) ;   fclose ( $ file ) ; ?> fgetc(ファイルから1文字取得) fgetc(ファイルポインタ) : string 指定されたファイルポインタから1文字読み出します。 EOFの場合はfalseを返します。 サンプルコードは以下のとおりです。 <?php   $ file = fopen ( "/home/example/file.txt" , "r" ) ;   fgetc ( $ file ) ; ?> fgets/fgetss(ファイルから1行取得) fgets(ファイルポインタ) : string 指定されたファイルポインタから1行読み出します。 サンプルコードは以下のとおりです。 <?php   $ file = fopen ( "/home/example/file.txt" , "r" ) ;   fgets ( $ file ) ; ?> PHP の「fgetss」関数を使うと、取得した文字列からHTMLタグを取り除いた形の文字列を取得できます。 使い方は「fgets」関数と同様です。 fpassthru(ファイル内容すべてを取得) fpassthru(ファイルポインタ) : int ファイルポインタを EOF まで読み込み、結果を出力バッファに書き出します。 戻り値として、出力した文字数を返します。 この関数を実行後、「fclose」関数を実行しなくてもファイルは自動的に閉じられます。 PHP でファイルの先頭から出力する場合は、当関数を実行する前に「rewind」関数でポインタをリセットしておきましょう。 サンプルコードは以下のとおりです。 <?php   $ file = fopen ( "/home/example/file.txt" , "r" ) ;   fpassthru ( $ file ) ; ?> fread(ファイルから指定した文字数分取得) fread(ファイルポインタ, 取得するバイト数) : string 指定されたファイルポインタから指定されたバイト数分の文字を取得します。 第二引数は、文字数ではなくバイト数なので注意! サンプルコードは以下のとおりです。 <?php   $ file = fopen ( "/home/example/file.txt" , "r" ) ;   fread ( $ file , 10 ) ; ?> 第二引数に「filesize」関数を使ってファイルサイズを指定すると、ファイル全文を取得できます。 readfile(ファイルを出力) readfile(ファイル名) : string ファイルの内容を出力します。 戻り値として、読み込んだバイト数を返します。 サンプルコードは以下のとおりです。 <?php   readfile ( "/home/example/file.txt" ) ; ?> filesize(ファイルサイズを取得) filesize(ファイル名) : int ファイルのサイズを取得します。 サンプルコードは以下のとおりです。 <?php   filesize ( "/home/example/file.txt" ) ; ?> file_exists(ファイルの存在チェック) file_exists(ファイル名) : int ファイルまたは ディレクト リが存在するかどうかを確認します。 存在する場合はtrue、存在しない場合はfalseを返します。 サンプルコードは以下のとおりです。 <?php   file_exists ( "/home/example/file.txt" ) ; ?> 数学関数 PHP: Math - Manual abs(絶対値) abs(数値) : int/float 指定された数値の絶対値を返します。 指定された数値がfloat型であった場合、戻り値の方もfloat型になります。 それ以外の場合はint型が返されます。 実行結果は以下のようになります。 <?php   abs ( 100 ) ---> 100   abs ( -100 ) ---> 100 ?> ceil(端数の切り上げ) ceil(数値) : float 指定された数値から、次に大きい整数を返します。 実行結果は以下のようになります。 <?php   ceil ( 100.1 ) ---> 101   ceil ( -100.1 ) ---> -100 ?> floor(端数の切り捨て) floor(数値) : float 指定された数値を超えない範囲で、最大の整数を返します。 実行結果は以下のようになります。 <?php   floor ( 100 ) ---> 100   floor ( 100.1 ) ---> 100   floor ( -100.1 ) ---> -101 ?> max(最大値を取得) max(比較する値1, 比較する値2 ... ) : mixed 比較する値の中で最大値を返します。 比較する値には、文字列も指定可能です。また、配列で渡すこともできます。 異なる型の値を引数として渡すのはやめましょう 実行結果は以下のようになります。 <?php   max ( 2 , 4 , 6 , 8 , 10 ) ---> 10   $ array = array ( 5 , 8 , 3 , 10 , 1 ) ;   max ( $ array ) ---> 10 ?> min(最小値を取得) min(比較する値1, 比較する値2 ... ) : mixed 比較する値の中で最小値を返します。 比較する値には、文字列も指定可能です。また、配列で渡すこともできます。 異なる型の値を引数として渡すのはやめましょう 実行結果は以下のようになります。 <?php   min ( 2 , 4 , 6 , 8 , 10 ) ---> 2   $ array = array ( 5 , 8 , 3 , 10 , 1 ) ;   min ( $ array ) ---> 1 ?> 変数操作関数 PHP: 変数操作 関数 - Manual empty(変数が空かチェック) empty(変数) : bool 指定された変数が空の場合はtrue、空でない場合はfalseを返します。 「empty」関数の結果一覧 値 結果 $val = 1 false $val = "" true $val = "0" true $val = 0 true $val = NULL true $val true $val = array() true $val = array(1) false intval(変数を整数値として取得) intval(変数, 基数) : int 引数の基数の値を基数とし、変数に指定された値をint型で返します。 基数が0の場合は、変数の値に基づいて基数を判断します。 変数の先頭が"0x"の場合は16進数、"0"の場合は8進数、それ以外の場合は10進数となります。 実行結果は以下のようになります。 <?php   intval ( 123 ) ---> 123   intval ( '123' ) ---> 123   intval ( '+123' ) ---> 123   intval ( '-123' ) ---> -123   intval ( 0123 ) ---> 83   intval ( '0123' ) ---> 123   intval ( 123 , 8 ) ---> 123   intval ( '123' , 8 ) ---> 83   intval ( true ) ---> 1   intval ( false ) ---> 0 ?> PHP でfloat型を扱いたい場合は、変数をfloat値で取得する「floatval」関数もあります。 strval(変数を文字列として取得) strval(変数) : string 変数に指定された値を文字列に変換してstring型で返します。 実行結果は以下のようになります。 <?php   strval ( 123 ) ---> 123 ?> settype(変数を指定した型に変換) settype(変数, 型) : bool 変数の値を指定された型に変換します。 変換に成功した場合はtrue、失敗した場合はfalseを返します。 型に指定できる値 "boolean"/"bool" "integer"/"int" "float"/"double" "string" "array" "object" "null" 実行結果は以下のようになります。 <?php   $ value = 123 ;   settype ( $ value , "bool" ) ---> $ value = 1   settype ( $ value , "int" ) ---> $ value = 123   settype ( $ value , "float" ) ---> $ value = 123   settype ( $ value , "string" ) ---> $ value = 123   settype ( $ value , "array" ) ---> $ value [ 0 ] = 123 ?> gettype(指定した変数の型を取得) gettype(変数) : string 指定された変数の型を返します。 型のチェックには、この関数ではなく「is_*」関数を使いましょう。 返される文字列 "boolean" "integer" "double" (float の場合は、"float" ではなく "double" が返されます) "string" "array" "object" "resource" "resource (closed)" ( PHP 7.2.0 以降) "NULL" "unknown type" 実行結果は以下のようになります。 <?php   $ value = 1 ;   gettype ( $ value ) ---> integer   $ value = 0.2 ;   gettype ( $ value ) ---> double   $ value = NULL ;   gettype ( $ value ) ---> NULL   $ value = 'abc' ;   gettype ( $ value ) ---> string ?> 配列関数 PHP: 配列 関数 - Manual PHP の配列に関しては、別の記事でまとめられていますので、そちらを参考にしてみてください。 PHPの配列機能のまとめ - RAKUS Developers Blog | ラクス エンジニアブログ 本記事では、上記記事で紹介されていない PHP の関数について記載します。 array(配列を生成する) array(値1, 値2, 値3 ...) : array 指定された値を用いて配列を作成します。 引数に指定した値に対して、0から添字が自動的に割り振られます。 値に"index => values"の形式で値を指定することで、 連想配列 を生成できます。 実行結果は以下のようになります。 <?php   $ values = array ( "りんご" , "バナナ" , "いちご" ) ;   $ values [ 0 ] ---> りんご   $ values [ 1 ] ---> バナナ   $ values [ 2 ] ---> いちご   $ values = array ( "a" => "りんご" , "b" => "バナナ" , "c" => "いちご" ) ;   $ values [ "a" ] ---> りんご   $ values [ "b" ] ---> バナナ   $ values [ "c" ] ---> いちご ?> list(配列を値を変数に代入する) list(変数1, 変数2, 変数3 ...) : array 配列の値を変数に代入します。 実行結果は以下のようになります。 <?php   $ values = array ( "りんご" , "バナナ" , "ぶどう" ) ;   list ( $ apple , $ banana , $ grape ) = $ values ;   $ apple ---> りんご   $ banana ---> バナナ   $ grape ---> ぶどう ?> PHP よく使う関数 まとめ 本記事では、 PHP の関数についてまとめてみました。 今回紹介した PHP の関数はごく一部で、 PHP では他にもたくさんの関数が用意されていますので、他にどんな PHP の関数があるのか興味があれば調べてみてください。 PHP でコードを書くときに、そういえばこんな関数あったな、と思い出せるだけでも全然違ってくると思います。 PHP の関数は自分で作成することもできるので、 PHP の標準で用意されていない関数があれば、自分で作ってみましょう。 それでは良き PHP ライフを! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 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 です。 皆さん!2021/11/21(日)に開催した JJUG CCC 2021 Fallに参加されましたでしょうか? 今回は、 弊社エンジニアの登壇資料をまとめ させていただきましたので JJUG に参加した人、参加できなかった人のご参考になれば幸いです! また、ロゴスポンサーとしても協賛させていただいております! 目次 目次 ラクスエンジニアの登壇内容 勤怠管理サービスでの継続的テストの取り組み 変わりゆくAPI連携仕様との付き合い方 協賛内容 終わりに ラク スエンジニアの登壇内容 勤怠管理サービスでの継続的テストの取り組み 発表者: yuya yamaguchi      2021/11/21 10:00〜 Track C (# jjug _ccc_c) Video:40min + Live:10min speakerdeck.com 楽楽勤怠の開発担当である山口さんより、 「勤怠管理サービスでの継続的テストの取り組み」というテーマで発表いただきました。 ◆発表内容まとめ   なぜ継続的テストを進めているのか  1.勤怠管理サービスの特徴  2.QA、SETエンジニアがいない  3.リリースサイクルを短縮したい CIパイプラインへのテストの組み込み  ・CIパイプラインの対象範囲:Spring Boot  ・CIパイプラインへのテストの組み込みで利用したもの  ・4つのステージ構成(code/test/build/deploy) テストの自動化  ・自動化しているテスト( ユニットテスト /パフォーマンステスト/E2Eテスト)  ・パフォーマンステストが自動化される前の問題   1.1つの Jmeter シナリオをテストするのに時間がかかる     →自動化されたので夜間に実施できる   2.手作業が多いので作業ミスが発生する     →Ansibleを実行するのみで発生しにくくなった   3.テスト結果を確認するためのグラフを作るのに大変     →Grafanaが自動的に作成してくれる まとめ  ・Gitlab CI上にテストの組み込み  ・パフォーマンステストの自動化         ↓  継続的にテストをすることができる環境を構築することができた 視聴者からは 「パフォーマンステストの自動化、すごくコストかかってるので自動化したい」 「GitLab→ansibleでターゲットサーバー構築、 JMeter とansibleで負荷サーバーを構築、さらにansibleで負荷テストをキック。ansible強い!」 などといった、コメントが上がりました! 楽楽勤怠開発課では継続的にテストをする環境が構築されたということもあるため、 今後の活動に注目していきたいですね! 登壇者の山口さんが発表内容を詳細にまとめました! 是非以下ブログも合わせてご確認ください。 tech-blog.rakus.co.jp 変わりゆく API 連携仕様との付き合い方 発表者: 太田 拓也      2021/11/21 10:25〜 Track D (# jjug _ccc_d) Video:15min + Live:10min speakerdeck.com 続きまして、楽楽 労務 開発課の太田さんから、 「変わりゆく API 連携仕様との付き合い方」を発表いただきました。 ◆発表内容まとめ   API 連携してますか?  ・ API 連携のメリット   →開発コストの削減  ・ API 連携のデメリット   →連携先システムへの依存 デメリットとどう付き合うか  ・サービス(楽楽 労務 )について   →人事 労務管理 のサービス   → AWS ECS/RDS/S3を作ったシンプル構成  ・モデル   →社内手続きで作られたデータが届出書の作成に使われる   →紙と電子申請のデータは同じデータを元に作成される  ・具体例   ケース1:仕様変更   ケース2:テスト   ケース3:モデルの違い まとめ  ・ API 連携にはメリットもデメリットもある  ・デメリットとうまく付き合うには、以下のような解決策がある   ①値オブジェクト   ②インターフェース+テストの組み合わせ   ③腐敗防止層  ・うまく活用してメリットを享受しよう! API 連携のメリット/デメリットを業務の取り組み事例とともにお話しさせていただきました。 視聴者からも 「 API 連携めちゃくちゃしてます!"障害の影響、仕様変更の影響、テストしづらい"ほんとそうですよね!」 「法改正による API 仕様の変更つらい。」 などといったコメントをいただき、共感を得ておりました! 本内容が、HR Tech系のシステムをご担当されている方にとっての一助となれば幸いです。 また、太田さんが所属する、楽楽 労務 では技術情報の発信も行っております。 詳細は以下リンクよりご確認ください! ◆「技術・デザイン情報」 career-recruit.rakus.co.jp 協賛内容 当社は、2021年5月23日開催した JJUG CCC 2021 Spring に続き、 2021年11月21日開催の JJUG CCC 2021 Fallに ロゴスポンサー として協賛させていただいております! ccc2021fall.java-users.jp 今後も Java 関連の技術や事例を積極的に発信させていただきます! 終わりに 弊社エンジニアの発表はいかがでしたでしょうか? 是非 Java 技術者や、 SaaS 開発に携わるエンジニアの皆様の一助となれば幸いです。 技術発信はこれからも続く・・・ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
技術広報の yayawowo です。 今回は、2021年4月に入社したフレッシュな新人エンジニアの皆さんに 応募きっかけ 入社の決め手 現在の業務内容 ラク スの魅力 今後の展望 などなど、をインタビューしてみました! 是非、新卒入社を検討している学生の皆様に ラク スの魅力が伝われば幸いです。 バックエンドエンジニア後編では、関西開発拠点にある 配配メール 開発課と メールディーラー ・ チャットディーラー 開発課に所属する新人エンジニア2名をご紹介します! 配配メール開発課 森下繁喜さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします メールディーラー・チャットディーラー開発課 廣部知生さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします インターンシップのご案内 終わりに 配配メール開発課 森下繁喜さん 配配メール開発課 森下繁喜さん Q まずは自己紹介をお願いします 名前  :森下繁喜(モリシタ シゲキ) 卒業区分:学部卒 卒業学部:理系 趣味  :サッカー、映画鑑賞、散歩 応募経路: インターンシップ   私は、 ラク スに入社するまでプログラミングはほぼ未経験でした。 大学では、数学を専攻し、専攻内容は数理 ファイナンス です。 就職活動を始めた際も、最初は証券会社や保険会社などの金融業界がメインでしたが、 コロナウイルス の流行がいつまで続くかわからない不安からコロナ禍でも安定的に雇用のあるIT業界に絞り、結果 ラク スに入社。 現在は開発エンジニアとして業務を行っています。 Q ラク スへ応募しようと思ったきっかけは何ですか? 応募のきっかけは、 インターンシップ で アプリ開発 を体験できるからです。 プログラミング未経験で、何から学んでいいかもわからなかったので 手っ取り早く経験を積めると思い応募しました。 Q ラク スへ入社した決め手は何ですか? 入社を決めるのに2つの理由がありました。   ①:内定が出てからどれぐらい内定者に時間を使ってくれるかです。   内定後面談などは、ほかの会社でもありましたが ラク スは内定後面談が一番長く、   開発職、管理職、人事の方と多くのことを話すことができ、安心できました。 ②:私の入社を決める2つの指標の中で一番数値が高かったからです。   指標1は、自社開発であるかです。   自社開発であれば、受託やSESよりも多くの経験を積むことができると考えたからです。   指標2は、「 自己資本 当期純利益 率」「 総資産利益率 」「 流動比率 」「 自己資本比率 」の   4項目で自分の定めた%以上かです。   これらの項目は、会社の安全性と成長性を数値として見れるので活用しました。 Q 現在、どのような業務をされていますか? 私は、配配メールの小規模改修を行っています。 お客様から頂いている問い合わせを基にバグの原因を探し、コードを改修していくことが業務の8割ほどを占めます。 2割に関しては、テストが中心です。 他の社員さんが改修した後のコードを調べてバグがしっかりと直っているの確認します。 こちらも大切な業務であり、なによりプロダクトのコード理解ににも繋がるのでテストを実施していて楽しいです。 Q 入社半年で見えた ラク スの魅力を教えてください 現在魅力に感じていることは、2点あります。 ①:私の成長を考えてくださっていることです。   毎週業務を振り分けていただくのですが、どのようなスキルが今必要なのかを私に合わせて   考えて下さるので、業務を進めていると成長を実感できます。   特に、私が嬉しいのは配属数か月で開発業務に携われることです。   IT業界についてインターネットで調べると、1年目はテストばかり任されると書かれたので   不安でしたが、 ラク スはそのようなことはなかったです。 ②:周りのメンバーがとても親切です。   一年目なので分からないことがほとんどです。   その中で、質問のしやすい環境を整えてくださったり、   意見があるときは1年目など関係なく互いに尊敬し、   話を聞いてくださるので毎日、この課で働くことが楽しいです。 Q 今後の抱負を教えてください 現在課題に感じていることは、Webへの知識が乏しいことです。 私が所属する配配メールは、メールシステムなのでメール プロトコル やWebの仕組みを理解していないとわからないことが多いです。 特にメール プロトコル に関しては、ほぼ無知だったので学習を重点的に行っていきたいです! Q 就活中の学生の方々にメッセージをお願いします 就職活動を行っていると不安が多いと思いますが、何事も楽しむことが一番大切だと思います。 気楽にエンジニアと話せて現場で働くエンジニアの意見を聞ける機会ぐらいだと考えて応募するぐらいでもいいと思います。 また、 ラク スは インターンシップ 採用を行っているので、実際の開発を知れるチャンスだと考え応募してみてはいかがでしょうか? メールディーラー・チャットディーラー開発課 廣部知生さん Q まずは自己紹介をお願いします 名前  :廣部知生(ヒロベ トモキ) 卒業区分:学部卒 卒業学部:理系 趣味  :ゲーム、アニメ 応募経路: インターンシップ   廣部です。 大学では情報学を学んでいました。 好きな開発言語は Python です! Q ラク スへ応募しようと思ったきっかけは何ですか? 近畿圏でIT系の会社を探していたとき、 インターン 参加のオファーが来ました。 インターン に参加して、企業風土が自分にあってそうだと感じたため応募しました。 Q ラク スへ入社した決め手は何ですか? 自社開発でサービスを提供していて、新サービスの開発にも積極的なためです。 Q 現在、どのような業務をされていますか? メール共有管理システムである、メールディーラーの開発に携わっています。 20年もののサービスですが顧客数も多いため、保守的な運用をするのではなく、 積極的な新機能の開発に取り組んでいます。 新人の私は、主にバグ修正や軽微な変更の実装、新機能のテストなどを行っています。 Q 入社半年で見えた ラク スの魅力を教えてください 研修がしっかりしているところです。 入社してから3ヶ月は全体研修、そのあとも配属されたサービスごとに研修があります。 メールディーラーの研修では、実際に業務と同じフロー、同じコードをもとに研修を行うので、 研修終了後も非常にスムーズに業務に携わることができました。 Q 今後の抱負を教えてください 20年もののサービスということもあり、非常に機能が多く、仕様も複雑な箇所があります。 そのため、まずはサービスの全体的な理解を目標にしています! テストやバグ修正を通して、主要な機能は触れたのですが、連携機能などはまだまだです。 Q 就活中の学生の方々にメッセージをお願いします 社会に出てなにがやりたいか、なになら続けられるのかが非常に重要だと思います! インターンシップ のご案内 ラク スでは今年度も インターンシップ を開催しております。 少しでも ラク スに興味が湧いた方は是非お申込みをお願いします! 【RAKUS Tech Lab( インターンシップ )】 https://fresh-recruit.rakus.co.jp/recruit/internship.html 終わりに 関西 後半編では、森下さんと廣部さんにお話を伺いました! 関西開発拠点にはお二人が関わっているプロダクトの他に、 楽楽販売 と 楽楽労務 があります。 もし、関西に在住の学生の方は弊社を就職先の1つとして検討いただけますと幸いです! なお、関東開発拠点でもバックエンドエンジニアが所属しておりますよ。 2021年新人インタビューはまだまだ続きますので、こうご期待! エンジニア新卒採用サイト https://fresh-recruit.rakus.co.jp/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
技術広報の yayawowo です。 今回は、2021年4月に入社したフレッシュな新人エンジニアの皆さんに 応募きっかけ 入社の決め手 現在の業務内容 ラク スの魅力 今後の展望 などなど、をインタビューしてみました! 是非、新卒入社を検討している学生の皆様に ラク スの魅力が伝われば幸いです。 バックエンドエンジニア前編では、関西開発拠点にある 楽楽販売 開発課に所属している新人エンジニア2名をご紹介します! 楽楽販売開発課 堀川慶太さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします 楽楽販売開発課 髙山大貴さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします インターンシップのご案内 終わりに 楽楽販売開発課 堀川慶太さん 楽楽販売開発課 堀川慶太さん Q まずは自己紹介をお願いします 名前  :堀川慶太(ホリカワ ケイタ) 卒業区分:学部卒 卒業学部:理系 趣味  :運動、スポーツ観戦、ゲーム 応募経路: インターンシップ   こんにちは。堀川慶太です! Q ラク スへ応募しようと思ったきっかけは何ですか? 企業側からオファーが来るサイトでオファーが来たためです。 当時は就活にはまっていて、とりあえず片っ端から説明会や面談に参加していました。 自社開発をメインで行っているのも理由の一つです。 Q ラク スへ入社した決め手は何ですか? 以下4点になります。 ・自社開発を行っている ・なんか古臭い大企業は嫌だった(最後まで安定の面などから迷った) ・大阪で働ける ・中小企業のサポートという業務内容が自分のやりたいことに合致した Q 現在、どのような業務をされていますか? 配属後はまず研修を行いました。 それが終了すると、ちょっとしたバグやUIの不具合を修正しながら製品への理解を深めていきました。 現在は新機能の開発をお手伝いさせていただいたり、テストや不具合修正を行っております。 Q 入社半年で見えた ラク スの魅力を教えてください 自身の部署の話にはなりますが、驚くほどいい人しかいません。 怒鳴り散らす人は見たことありませんし、皆さんとても物腰も柔らかいです。 自分のやりたいこともある程度やらせていただけますし、良い会社だと思います。 よく皆さんがイメージをされるような怖い方は、一人もいないので安心して入社していただければと思います。 Q 今後の抱負を教えてください 製品理解を深める! 自分一人で一定レベルの開発まで行えるようになる!! Q 就活中の学生の方々にメッセージをお願いします 就活がんばってください。 東証 一部にも上がりましたし見栄えもいいと思います。 新卒のサポートもどんどん厚くなっています。 結局自分は何がしたいんだってことをもう一回考えて就職先決めていただければと思います。 楽楽販売開発課 髙山大貴さん 楽楽販売開発課 髙山大貴さん Q まずは自己紹介をお願いします 名前  :髙山大貴(タカヤマ ダイキ) 出身  : 長崎県 卒業区分:学部卒 卒業学部:理系 趣味  :映画・海外ドラマ・アニメ鑑賞、散歩、ファッション、ゲーム、読書 応募経路:直接応募   基本的に落ち着いており、温厚な部類の人間です。 どちらかといえばインドアなことが多いです。 大学では組み込み系のプログラミングを中心に学びました。 また、高校時代は工業高校に属しており、 危険物取扱者 乙種4類や 第二種電気工事士 等 あまり同業者が持っていないような資格をいくつか所持しています。 情報系の資格は 基本情報技術者 を取得しています。 そろそろ応用情報取りたいなぁと思っています。 Q ラク スへ応募しようと思ったきっかけは何ですか? 学生時代に ラク ス主催のLT会に参加したことがあり、以前から社名は知っておりました。 応募しようと思ったきっかけは、OpenWorkという会社の口コミを投稿するサイトでたまたま求人を見かけたからです。 Q ラク スへ入社した決め手は何ですか? Web系の開発に興味があったのことと、コロナ禍で SaaS 形態のビジネスの需要が上がっていて会社に勢いがある印象があったので、会社と共に自分も成長していきたいと思い志望しました。 Q 現在、どのような業務をされていますか? 現在は、以下業務を行っています。 ・研修、プロダクト理解、開発演習 ・軽微なUI・バグの修正 ・新規開発機能のテスト・ デバッグ などなど   技術スタックは以下の通りです。 使用言語: PHP 、 jQuery 、JS、HTML 開発で使うツール:Jenkins、sonerCube、GitLab、PhpStorm などなど Q 入社半年で見えた ラク スの魅力を教えてください 周りの社員の方々は業務に積極的で、向上心のある方が多いので、いい刺激になると思います。 質問に対して、回答を教えていただけたり、時には一緒に悩んでいただけたりと優しい方々が多いです。 年功序列 などのマインドもあまりないかなと個人的に思います。 Q 今後の抱負を教えてください アーキテクチャ に関する理解が十分でないので、プロダクト理解を深めることを意識しています。 自分が学んだ知識を溜め込むだけでなく、ブログやLTなどでときにはアウトプットしてみることも意識していきたいです! Q 就活中の学生の方々にメッセージをお願いします 迷ったらとりあえず応募してみてもいいんじゃあないでしょうか。 インターンシップ のご案内 ラク スでは今年度も インターンシップ を開催しております。 少しでも ラク スに興味が湧いた方は是非お申込みをお願いします! 【RAKUS Tech Lab( インターンシップ )】 https://fresh-recruit.rakus.co.jp/recruit/internship.html 終わりに 楽楽販売開発課に所属している堀川さんと、髙山さんにインタビューを行いました! 新人研修終了後、楽楽販売開発課では軽微なUI・バグの修正を行いつつ 製品の理解を深める独自の演習があるようですね。 今後のお二人の活躍に期待です! 次は、バックエンドエンジニア関西 後編でお会いしましょう! エンジニア新卒採用サイト https://fresh-recruit.rakus.co.jp/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
技術広報の yayawowo です。 今回は、2021年4月に入社したフレッシュな新人エンジニアの皆さんに 応募きっかけ 入社の決め手 現在の業務内容 ラク スの魅力 今後の展望 などなど、をインタビューしてみました! 是非、新卒入社を検討している学生の皆様に ラク スの魅力が伝われば幸いです。 インフラエンジニア編では、弊社でインフラ開発課に所属している新人エンジニア1名をご紹介します! 東京インフラ開発3課 橋本海里さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします インターンシップのご案内 終わりに 東京インフラ開発3課 橋本海里さん 東京インフラ開発3課 橋本海里さん Q まずは自己紹介をお願いします 名前  :橋本海里(ハシモト カイリ) 卒業区分:学部卒 卒業学部:文系 趣味  :スポーツ観戦・動画鑑賞・買い物 応募経路:直接応募   橋本です。 大学は文系でしたが、独学でプログラミングを学んでいました。 Q ラク スへ応募しようと思ったきっかけは何ですか? 応募したきっかけは、一度本社に行った際の雰囲気がとても良かったからです。 また、自分が知っている広島の企業がサービスを利用していたのもきっかけの一つです。 Q ラク スへ入社した決め手は何ですか? 以下4点です! ・研修制度がしっかりしていた ・自社開発を行っていた ・会社の雰囲気がよかった ・成長できる環境が整っていると感じた Q 現在、どのような業務をされていますか? 配属後は、インフラに関する研修をメインに行っています。 具体的には、検定の取得( LPIC )や仮想環境に各種サーバーを構築などがあります。 また、月に数回はデータセンターに行き、業務のお手伝いも行っています。 Q 入社半年で見えた ラク スの魅力を教えてください 私が考える魅力は2つあります。 1つ目は、安心して働くことのできる環境が整っている点です。 周りの先輩方はとても優しく、わからないことや困ったことはすぐに質問・相談することができます。 2つ目は、研修が手厚い点です。 インフラでは一年間の研修が用意されているので、安心して一年後、業務に関わることが出来ます。 Q 今後の抱負を教えてください インフラに関する基礎知識を身に着ける! 少しでも早く研修を終わらせ、業務に関わる!! Q 就活中の学生の方々にメッセージをお願いします ラク スはとても働きやすく、成長できる環境があります。 少しでも気になった方は、応募してみてください。 インターンシップ のご案内 ラク スでは今年度も インターンシップ を開催しております。 少しでも ラク スに興味が湧いた方は是非お申込みをお願いします! 【RAKUS Tech Lab( インターンシップ )】 https://fresh-recruit.rakus.co.jp/recruit/internship.html 終わりに 今回は、配属後インフラエンジニアにて働く橋本さんにお話しをお伺いしました! 独学でプログラミングをされ、現在は現場で活躍するインフラエンジニアへと成長し続けております。 弊社は各課によって、配属後の仕事は異なりますが研修制度も整っていますので安心してご入社ください! では、引き続き別の課に配属された新人エンジニアのインタビュー公開をお待ちください! エンジニア新卒採用サイト https://fresh-recruit.rakus.co.jp/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
技術広報の yayawowo です。 今回は、2021年4月に入社したフレッシュな新人エンジニアの皆さんに 応募きっかけ 入社の決め手 現在の業務内容 ラク スの魅力 今後の展望 などなど、をインタビューしてみました! 是非、新卒入社を検討している学生の皆様に ラク スの魅力が伝われば幸いです。 フロントエンジニア編では、弊社でUI開発課に所属している新人エンジニア2名をご紹介します! UI開発課 實久裕大さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします UI開発課 田口真輝さん Q まずは自己紹介をお願いします Q ラクスへ応募しようと思ったきっかけは何ですか? Q ラクスへ入社した決め手は何ですか? Q 現在、どのような業務をされていますか? Q 入社半年で見えたラクスの魅力を教えてください Q 今後の抱負を教えてください Q 就活中の学生の方々にメッセージをお願いします インターンシップのご案内 終わりに UI開発課 實久裕大さん UI開発課 實久裕大さん Q まずは自己紹介をお願いします 名前  :實久裕大(サネヒサ ユウタ) 生年月日:1998年11月19日生まれ 出身  : 新潟県 卒業区分:学部卒 卒業学部:理系 趣味  :筋トレ・ゲーム・旅行・ YouTube 鑑賞 応募経路: インターンシップ   色々な場所を転々として東京に落ち着きました。 大学では情報系を学んでいて、現在はUI開発課のフロントエンドエンジニアとして働いています。 Q ラク スへ応募しようと思ったきっかけは何ですか? 大学3年の夏にサマー インターン や企業説明会に参加していて、その中に ラク スも含まれていました。 インターン の内容が アプリ開発 でしたが、私の学んでいた言語を使っていて興味を持ったのがきっかけです。 Q ラク スへ入社した決め手は何ですか? 周りに干渉されず自由に開発を行いたいと感じていたので自社開発が魅力的でした。 また、 インターン や説明会で会社の雰囲気やオフィスを見れた事も決め手です。 最後は、早期内定だったので比較対象する企業数が少なかったので決めやすかったです。 Q 現在、どのような業務をされていますか? 現在は扱っているプロダクトのバグ修正や新機能の追加がメインの業務です。 また、月に1度はリリースを行なっているので、仕様確認などの会議が多くあります。 割合としては、開発6割会議2割仕様書など作成2割です。 開発ではHTML・ CSS ・ JavaScript を使用し、ユーザーが操作しやすいようにボタンを追加したりプログラムの改善を行なっています。 UI開発課は出来てまだ日が浅いので、新しい取り組み(勉強会)や業務改善作業も行っています。 Q 入社半年で見えた ラク スの魅力を教えてください 規模感としては大手になりますが、自社開発なので新しい機能を考えたり、開発方法を考えたりと挑戦がたくさんできる環境です。 新人でも開発を行えるのでプログラミングスキルを身につける事ができます。 また、リリース時期などを ラク スで決められるので(例外もあります)、 のびのび作業を行えたり、 厳しい場合は作業分担を行うなど、初めて入社する企業としてはいいと思いました。 Q 今後の抱負を教えてください アプリ開発 経験を多く積む事が目標です。 課題としては現在は助けていただきながら業務をしていますが、独力で行えるようになりたいです。 Q 就活中の学生の方々にメッセージをお願いします 自分が何を仕事にしたいのか改めて考えてみてください。 IT業界( ラク ス)の中にも、営業や人事の方もいますし、エンジニアはフロントエンド・バックエンド・インフラと様々な種類があります。 皆様の希望する業務が ラク スで叶えられることを祈っています。 UI開発課 田口真輝さん UI開発課 田口真輝さん Q まずは自己紹介をお願いします 名前  :田口真輝(タグチ マサキ) 卒業区分:院卒 卒業学部:理系 趣味  :野球、ゲーム、アニメ鑑賞 応募経路:直接応募   田口です。 大学では深層学習に関する研究を行っていました。 元々PCやゲームなどのガジェットが好きで、それが講じてプログラミングの道に進みました。 Q ラク スへ応募しようと思ったきっかけは何ですか? 大学の研究室の引継ぎが非常に杜撰で先輩のコードを読み解くのに一ヵ月以上かかり、それを改善するために Wiki を立ち上げたりしている内に業務効率化に興味を持ったのがきっかけです。 Q ラク スへ入社した決め手は何ですか? 業務効率化を行っている企業の中で、最も会社も自分自身も成長出来そうな企業が ラク スだったので、私の中では就職先の選択肢は ラク スほぼ一択でした。 Q 現在、どのような業務をされていますか? 配属後、二ヶ月ほどプロダクトや業務で必要となるエンジニアスキルについて学んだ後、現在は楽楽明細のフロントエンドエンジニアとして働いています。 業務内容としては、Reactを用いてページ画面やページ画面の部品作成を行っています。 Q 入社半年で見えた ラク スの魅力を教えてください 働きやすい環境なのが一番の魅力だと思います。 現在進行形で、配属したばかりでプロダクトに関する知識やコーディングルールが分からず色々とご迷惑をおかけしていますが、チームの方々は一つ一つ丁寧に教えてくださるので、質問や疑問点を遠慮せずに伺うことが出来ています。 Q 今後の抱負を教えてください 現在の課題はフロントエンドに関する知識が圧倒的に不足していることです。 大学時代は アルゴリズム やプログラミングのロジックを学ぶことが多く、フロントエンドには触れたことがほとんどありませんでした。 ですので、今後はフロントエンドスキルを広く深く学び、「私の所属はUI開発課のフロントエンドエンジニアです!」と胸を張って言えるようになりたいです。 Q 就活中の学生の方々にメッセージをお願いします 就職活動は色々な企業を知る良い機会なので、とにかく応募してみるのが良いと思います。 私も業務効率化関連以外の企業を受けて、これまで知らなかった企業や、CM等でよく耳にするような企業の方と話をすることができ、多くの学びを得られました。 これは ラク スについても同様で、直接 ラク スメンバーと話をして初めて知ることは意外と多いと思います。 是非 ラク スを含め、色々な企業に応募してみてください。 インターンシップ のご案内 ラク スでは今年度も インターンシップ を開催しております。 少しでも ラク スに興味が湧いた方は是非是非お申込みをお願いします! 【RAKUS Tech Lab( インターンシップ )】 https://fresh-recruit.rakus.co.jp/recruit/internship.html 終わりに 今回は、配属後フロントエンドエンジニアにて働くお二人にお話しをお伺いしました! 實久さんは インターンシップ 参加経由、田口さんは直接応募と弊社を知ったタイミングは異なりますが日々精進しながら業務を全うしております。 今後も、2021年度に新卒入社したメンバーを今後もご紹介していきますので、ご期待くださいませ。 エンジニア新卒採用サイト https://fresh-recruit.rakus.co.jp/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
こんにちは、技術広報の yayawowo です。 突然ですが、デザイナーの皆さんはデザインの知識をどのように学ばれていますでしょうか? スクール(大学、専門など) 会社、仕事 WEB、オンライン(Udemyなど) など、様々あるかと思います。 とはいえ、日々変わりゆくデザインのトレンドをキャッチアップしていくのは時間と労力が必要ですよね。 そんな方に必見! 弊社にて定期的に開催している、デザイナーによるデザイナーの為のデザインLT大会・・・ 「UI/UXデザイナーLT会」にて発表されたデザインTipsをまとめました ので、ご紹介させていただきます! 記念すべき第一回目のまとめ記事は以下をご確認ください! ・ 【UI/UXデザイナーLT会】を開催しました【登壇者15名御礼】 - RAKUS Developers Blog | ラクス エンジニアブログ 目次 目次 デザイナーとなっておもったこと UI/UXデザイナーになるには UI/UXデザイナーになるには (学習編) 〇〇デザイナーの違い ラジオボタンと初期値と必須マークの考察 設計業務チャレンジ 共創によるサービス創出プロセスについて(デザイン思考をベースに) サービス開発のUXデザインでひと手間加えた話 「デザインは反復である」ということをメンバーに理解してもらっておこう ノンデザイナーズデザイントーク 営業資料におけるデザインの重要性 デザインシステムとは 引き出しを設計することである ぼくのかんがえたさいきょうの地図検索 UI (特許出願中) プログラマが最低限抑えておきたいUI知識3選 取扱説明書制作のプロがkintoneの導入ガイドブックをガチで作ってみた Scalebaseのデザインシステムの取り組み 実践的OOUIデータモデリング ウェブアクセシビリティについて 最近のCSSで作るテーブルレイアウト Homeってなんですの? UI/UXデザイナー、Webデザイナー募集中 終わりに デザイナーとなっておもったこと 発表者: kimukei さん speakerdeck.com デザイナーという職業柄から細かいことを気にしすぎ、その中でも良いデザインと思った主観な視点を紹介いただきました! 例えば、バレンタインや受験時に発売されるお菓子、アイスのパッケージは既存のデザインを活かしつつ、受け取る側のことを考えた新たなデザインの価値をユーザに提供できているといった点です。 ◆発表内容のポイント 「よいデザイン」とは何か? ・ サービス、製品に関わらずそれを見たり、使ったりするユーザが心地よく感じるデザインを提供していくこと ・考えさせないUI  →利用者が当たり前のように使える設計 ・おもてなしのUX  →利用された際に未来のアクションを提示 ・サービスデザイン  →顧客が使いやすいようにデザインする取り組み 最後におすすめの書籍を6冊ご紹介いただいているので、発表資料を是非ご確認ください! UI/UXデザイナーになるには 発表者: kimukei さん speakerdeck.com 元々 Webデザイナー だった経験から、UI/UXデザイナーになるためのノウハウをご紹介していただきました。 今回は「ユーザファースト」に特化してお話しいただいております! ◆発表内容のポイント UI/UXデザイナーになるには ・ユーザーが求めていること、現状を正しく把握する必要 ・ユーザーの声を拾い上げていくことが重要  → UI/UXデザイナーはユーザーの代弁者 ・未来を見据えたUI/UX設計  → ユーザーファーストを意識する UI/UXデザイナーになるには (学習編) 発表者: kimukei さん speakerdeck.com UI/UXデザイナーになるにはの第二弾となる発表です。 1つ前の「ユーザファースト」に続き、今回は「学習」に特化し、おすすめの書籍を15冊ご紹介いただきました! ◆発表内容のポイント UI/UXデザイナーの学習 おすすめ書籍 15選 1. ノンデザイナーでもわかるUX+理論で作るWebデザイン 2. UI/UXデザインの原則 3.  SF映画 で学ぶインターフェースデザイン 4. UI GRAPHICS 5. デザイナーのためのプロトタイピング入門 6. ほんとに使える「 ユーザビリティ 」 7. UIデザイン みんなで考え、 カイゼン する。 8. インタフェースデザインの心理学 9. UXライティングの教科書 ザ・マイクロコピー 10.UXデザインの教科書 11.UXデザインの法則 12.はじめてのUXリサーチ 13.行動を変えるデザイン 14.「ついやってしまう」体験の作り方 15.「ユーザーフレンドリー」全史 〇〇デザイナーの違い 発表者: junyaonoda さん speakerdeck.com いつの間にか増えた○○デザインの種類が多すぎる…という思いから、ざっくりと種類と仕事の違いについて紹介いただきました! 伝える系 広告、パンフレット、コーポレートサイト、LTなど 心に訴える。記憶に残す。 使う系 スマホ アプリ、Webアプリ、 GUI 、 ECサイト など 操作に迷わず目的を達成。新しい体験も。 発表者から伝えたかったことは、以下の通り。 ◆発表内容のポイント 事業会社のBtoB SaaS のUIデザイナーになって感じた5つのこと 1.エンジニアさんが沢山いる 2.担当領域の業務知識の理解が必要 3.顧客の声が直に聞ける 4.様々な部署の人と協力しながら仕事ができる 5.プロダクトの成長にやりがいを感じる ラジオボタン と初期値と必須マークの考察 発表者: junyaonoda さん speakerdeck.com 入力フォームの ラジオボタン には、「必須マーク」は必要なのか? という疑問から発表者が考察を行いました。 発表者としての結論に行きつくため、 ユーザビリティ の専門家である ヤコブ ・ニールセン氏の意見や、優しいチームメンバー相談した経緯もとても参考になります。 ◆発表内容のポイント 結論 ・初期値の設定有無よりも、まずは大前提不可逆なシステムにしないこと ・初期値あり  →システム上で、現在の状態から何かを変化させる機能を持った ラジオボタン は初期値を指定しておく ・初期値なし  →アンケートのようなユーザーが選択肢を単純に選択するだけのものは初期値が入ってなくて良い noteにも内容がまとめられていますので、是非ご確認ください! note.com 設計業務チャレンジ 発表者: junyaonoda さん speakerdeck.com 課題   ・・・デザイナーがサービス開発の上流工程から参画は"これから" ありたい姿・・・プロダクトの成長やUX向上に貢献 上記のような背景から、設計業務へチャレンジした取り組みを発表いただきました! 取組結果としては、目標件数を達成し、効率的&効果的に進めることはできましたが、反省すべき点も多々あったとのことです。 それを踏まえて… ◆発表内容のポイント 設計をやってみての気づき ・担当プロダクトの理解が深まった ・他のプロダクトでも役に立たせることができる ・自分は「こうしたい」と決める意思(勇気)持つこと 今後の活動にも期待しております! 共創によるサービス創出プロセスについて(デザイン思考をベースに) 発表者: growup さん 【登壇用】共創によるサービス創出プロセスについて from 靖正 高橋 www.slideshare.net プロジェクトを進める以下3要素について、ご紹介いただきました! プロセスデザイン ファシリテーション チームワークデザイン 今回メインとなるのは、 プロセスデザイン …課題解決をするために必要な手順になります。 ◆発表内容のポイント ・デザイン思考のメソッドをもとに、プロセスデザインを回す  →メソッド   ・あらゆる人と共創する   ・あらゆる考えを仮想化する   ・創造性を発揮することの必要性を訴える   ・ア イデア に対して批判的な目を持ち、検証(テスト)によって検証する   ・完璧を目指さない、何度も何度でも戻る   ・ア イデア ではなく重要なのは インサイト ファシリテーション とチームワークデザインの詳細は、発表資料をご確認ください! サービス開発のUXデザインでひと手間加えた話 発表者: Emy29 さん speakerdeck.com 発表者は、以下の問題点を感じていました。 ・全体設計を考えながらユーザーが良いと感じるものを作らないといけない ・【課題発見→フロー改善→画面設計】のデザインの流れを可視化したい そこで、既存の手法であるカスタマージャーニーマップとサービスブループリントを組み合わせながら課題から解決策まで書き出せるよう、改善Tipsをご紹介いただきました! ひと手間加えたマップは、発表資料をご確認ください。 ◆発表内容のポイント 改善ポイント ・システム側、画面、フローなど多方面の課題を見つけられる ・課題から解決策までを現状の行動に合わせて俯瞰できる ・解決策の検討がしやすく、優先順位がつけやすい 得た知見 ・案件や状況に合わせて、既存のツールに工夫を加えることでUXデザインのフロー、アウトプットをより良くできる! 「デザインは反復である」ということをメンバーに理解してもらっておこう 発表者: 711fumi さん speakerdeck.com デザイナー以外がイメージする開発の流れは一直線ですが、実際のデザイン工程は「抽象と具体」の反復作業によって完成に近づけています。 その反復作業が、不要な作業や手戻りとして受け止められてしまう場合もあると発表者は語りました。 本発表では、デザイナーである発表者から「認識のずれを無くすためにできること」をまとめとして紹介いただきました! ◆発表内容のポイント ・デザイナーの考え方を共有しておく  →作用工程やUI設計に向けて整理した情報など ・反復を促す「問い」を意識する  →抽象度の高い話を進める場合、具体的な話から進める場合など ・UIデザインは「要件確定後の開発」ではなく「設計」と捉えてもらう  →設計の一工程であり、変更が発生することを理解してもらう ノンデザイナーズデザイン トーク 発表者: くぼたさや さん speakerdeck.com 学習を通した成功体験をサポートするための企画(Learning Xperience)を行っている発表者は、教育システムのオペレーション改善をしています。 この仕事において一番大事なのは、「ユーザー目線第一」とのこと。 その仕事において一番大事と思えることを発表いただきました! ◆発表内容のポイント ・課題の本質を捉えて解決できる仕組みを考えること大事  課題の本質:メモ書き、ブレスト、 ヒアリ ングなど  解決   :ア イデア を出してメリット/デメリットを考える  仕組み  :再現性が高い運用まで考える 営業資料におけるデザインの重要性 発表者: meia-hara さん speakerdeck.com デザインで受け取るイメージがいかに変わるかについて、以下2パターンで検証した結果をご紹介いただきました! ・UI/UXを意識したデザイン ・意識していないデザイン 各デザイン要素の違いは、発表資料をご確認ください。 色、フォント、図、構成に違いがあることが一目でわかります! ◆発表内容のポイント お客様に印象の残る営業資料を作成するには ・UI/UXを意識したデザインをすることが重要である ・検証を通して再確認できた デザインシステムとは 引き出しを設計することである 発表者: ShotaKugawa さん デザインシステムは引き出しを設計することである(20210714イベント発表資料@ラクス株式会社) from Shota Kugawa www.slideshare.net デザインシステムが必要な理由を引き出しを例に、別途 note にてまとめている内容をLT向けに発表いただきました! ◆発表内容のポイント デザインシステム=「引き出し」のデザイン ・component化  →そんな情報が入るのか?を想定する    →「引き出し」に入れるものを想定 「引き出し」のイメージは、発表資料が分かりやすいので是非ご確認ください! ぼくのかんがえたさいきょうの地図検索 UI (特許出願中) 発表者: choo さん docs.google.com 件数を表示する地図検索UIを作りたい!ということで、実際に作成された経緯やサービスのデモを発表いただきました。 ◆発表内容のポイント ・件数を表示する地図検索UIの事例紹介  →件数表示、ヒートマップ、行政区域ごとの色塗り ・個人開発した賃貸検索アプリの発表 発表時にデモいただいた賃貸物件検索サービス Comfyは、物件データの利用特許を得られたなかったため、2021/07に閉鎖したとのことです。 残念です…。 プログラマ が最低限抑えておきたいUI知識3選 発表者: 白栁隆司 さん speakerdeck.com エンジニアである発表者目線で、 プログラマ が抑えておくべきUI知識を発表いただきました! 「"質の良い"仕事のためには、デザインは出来た方良い」という言葉が印象的でした。 ◆発表内容のポイント 1.絶対座標・相対座標  ・絶対座標:画面上の1っ点を原点[0,0]とし、位置変化を扱う  ・相対座標:アイテム間の位置関係で決まる 2.間(空間)  ・情報に適度な間(空間)を作る&省略(間引く)  ・協調なども活用して伝えやすくできる  ・コーディングにも活用できる! 3.視線誘導 Zの法則  ・人間の視線はZ型に動く  ・チラシの多くはこのルール 取扱説明書制作のプロがkintoneの導入ガイドブックをガチで作ってみた 発表者: 情報親方 さん note.com 取扱説明書制作を仕事とされている発表者から、「kintone導入ガイドブック」を作った事例を紹介いただきました! 「kintone導入ガイドブック」作成前は、「はじめてのkintoneガイドブック」という名で様々な課題(コンセプト変更、構成見直しなど)がありました。 課題を解決すべく、 目次をカスタマージャーニーマップ にした内容がとても参考になりました。 ◆発表内容のポイント 目次を カスタマージャーニーマップ に! ・目次構成は「骨組み」 ・全体がわかる、どこを見ればいいかわかる ・ユーザーを最短距離で目的地を誘導 目次を活かたことで、お客様からも評価が高い取扱説明書になったとのことです。 是非皆様も目次を活かした構成にしてみてはいかがでしょうか? Scalebaseのデザインシステムの取り組み 発表者: Tadaking さん speakerdeck.com 発表者が扱っているScalebaseの3つデザインシステムについて発表頂きました! ・zeroheigth ・ Figma ・Storybook ◆発表内容のポイント ・UI コンポーネント を Figma だけでなく、その考えを伝えるためにドキュメント化することが大事 ・作成/保守の作業時間は必要だが、注力すべき所に時間を使うことができるようになり、取り組んで良かった ・発表者の取り組みは以下noteをご参考ください!   Tadaki|note 各デザインシステムの取り組み事例は発表資料をご確認ください。 実践的OOUIデータ モデリング 発表者: codyNog さん speakerdeck.com ・データ モデリング に困っている人 ・OOUI採用して本当にいいのか迷っている人 向けの内容となります! UIから逆算的にデータ モデリング ができる事例と合わせて紹介いただきました。 ◆発表内容のポイント デザイナーがデータモデルをすると ・データ構造がコード上の実装と同期する ・ コンポーネント としても同期する  →共通の世界観で開発サイクルが回る 発表資料の細かい事例(一覧表示UI、詳細表示UIなど)がまとめられておりますので、お時間ある際にご確認ください! ウェブ アクセシビリティ について 発表者: nana さん speakerdeck.com アクセシビリティ とウェブ アクセシビリティ についてご説明頂いた後、具体的な対応策も合わせてご紹介いただきました! 空港と公的機関で実際にあった訴訟例もまとめており、大変興味深い発表となりました。 ◆発表内容のポイント 比較的簡単にできそう&影響が大きいところ ・ コントラ スト  → コントラ ストチェッカーで検索! ・キーボードだけで操作できるようにする ・スクリーンリーダーを考慮する 発表者は、老若男女問わず誰でも使いやすいサイトやアプリが増えてほしく、この題材としたそうです。 この発表を基に、そのようなサービスが増えてくれることを私も願っております! 最近の CSS で作るテーブルレイアウト 発表者: 腹筋ローラーの力を信じろ さん walnut-insect-387.notion.site CSS Gridを使って、テーブルレイアウトをコンテンツ本来の幅とバランスを取りながらコン トロール する方法を発表いただきました! テーブルはユーザーにとっては慣れ親しんだレイアウトになりますが、レイアウトに癖があり、結構難しいものである…確かにそうだなぁと共感しておりました。 ◆発表内容のポイント ・長いコンテンツにレイアウトが振り回されないようになった ・折り返しをいい感じに制御できた ・ CSS Gridは柔軟ですが、落とし穴も  → CSS Gridはすごい!  → Chrome で数万〜数十万セル表示させたらスクロールが壊れた CSS Gridでテーブルを再構築した内容は、添付の資料をご確認ください! とても詳細にまとめてくださっております。 また、発表者から宣伝にはなりますがWebのレイアウトと CSS の可能性を広げる最高の一冊を監訳したそうです! 是非宜しければご確認ください! Every Layout-モジュラーなレスポンシブデザインを実現するCSS設計論 Homeってなんですの? 発表者: DameNianch さん note.com 遺伝子操作を使った アプリ開発 をされている発表者が、以下の遺伝子操作アプリの機能と Twitter の項目を比較し、Homeとは?という疑問を持ったことでこの発表テーマとなったそうです。 ・対象(編集)遺伝子の設定 ・画像の編集 ・編集画像の確認 ・動画の編集 ・編集動画のダウンロード ◆発表内容のポイント 視点の違い ・ユーザー vs 開発者     :HOMEとは?という視点 ・開発者 vs エセデザイナー  :長いテキスト嫌だなぁ、という視点 ・エセデザイナー vs デザイナー:文字は読まず、アイコンを見ているという視点 ・デザイナー vs ユーザー   :文字読まなくても操作できてしまうという視点 開発者とデザイナーとの視点の違いについて、丁寧に考察してくださりました! この結果を踏まえ、発表者はご自身で開発されている遺伝子操作アプリに、今後はアイコンを追加したいとのことです。 UI/UXデザイナー、 Webデザイナー 募集中 株式会社 ラク スでは、デザイナーを積極的に募集しております! 現在募集中の職種は以下の通りです。 職種 UIUXデザイナー/マネージャー(東京) | 株式会社ラクス UIデザイナー(東京) | 株式会社ラクス Webデザイナー(東京) | 株式会社ラクス ※2021/11/18時点での情報です。 また、弊社デザイナーが発信しているnoteも是非ご確認ください! note.com 2021/12/10(金)に開催する、 【ラクス】キャリア座談会 #13 UIデザイナーの仕事紹介 も是非! 終わりに UI/UXデザイナーが語る、デザインTipsはいかがでしたか? 今回、資料を共有いただいた方のみをご紹介させていただきましたが実際はもっと多くの方がデザインTipsをアウトプットする場として、弊社イベントを活用されております。 過去イベント UI/UXデザイナーLT会 UI/UXデザイナーLT会 - vol.2 UI/UXデザイナーLT会 - vol.3 UI/UXデザイナーLT会 - vol.4 UI/UXデザイナーLT会 - vol.5 250名以上の参加申込をいただくほど、大好評のイベントです! 本記事を読んでいただき、本イベントにご興味を持ったデザイナーの皆様は是非、参加/登壇いただけますと幸いです。 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
はじめに 初めましてこんにちは。 ngerukatakataです。 営業上がりの未経験エンジニアとしてそこそこの期間を働いております。 担当する環境も当時の物からかなり様変わりしてしまい、 同じような仕事の仕方はできないものだなぁと感じている今日この頃です。 さて、今回は大きく変わったものの中でこの業界にかかせない 『監視』 について、 お話しさせていただければと思います。 まず先にお伝えしますと、今回お話しする監視ツールは Zabbix についてとなります。 この Zabbix を コマンドライン から操作することのできる Zabbix API の『入門』について お話させていただければと思います。 目次 はじめに 目次 背景 明日の監視生活を【楽】にしよう! Zabbix API とは? Zabbix API 超・入門 Zabbix トークンの取得! Zabbix からグループIDとテンプレートIDの取得! Zabbix へ指定したグループとテンプレートに所属するホストを作成! Zabbix トークンの破棄! まとめ 参考 背景 私が中途社員として入社してサービスに携わってから今にいたるまでで、 私の担当するサービスのインフラ環境は大きく拡大しました。 管理するサーバの台数は数台…せいぜいが十数台といったところから、 今では数百台といったところまで大きくなり、それにともなって運用のコストは肥大化を続けています。 当時は新たにサーバを用意するとなると構築を手作業で実施し監視を追加するには Zabbix を GUI でポチポチと手作業で操作しており、 当然ではありますが一日で構築することのできるサーバ台数は制限されておりました。 しかし、嬉しい悲鳴ではございますがサービスも順調に拡大していき、 最近は一度に作成しなくてはならないサーバ台数も膨れ上がっていき… 手作業なんてのは考えられないものとなりました。 そこで少しずつ運用上の処理の ジョブ化 やインフラ構成の 仮想化 、 そしてさまざまな処理の 自動化 なんてもの( Zabbix ではホストの自動登録)を導入しておりましたが、 監視内容の一部はどうしてもホストの自動登録機能だけでは痒い所に手が届かず、 仕方なく泣きながら手作業を行う… そんな運用になっていました。 1回ごとの作業はわずかな作業とはいえ、台数を重ねると運用的にも心情的にもやっていけるものではなく、 何とかもっと 【楽】 にやれないものか…とたどり着いたのが Zabbix API となります。 明日の監視生活を 【楽】 にしよう! それでは前置きが長くなりましたが早速 Zabbix API について説明をさせていただきます。 Zabbix API とは? 詳細な仕組みついては賢く偉い人がたくさん説明してくれているので… ごくごく簡単に言うと わざわざ GUI で管理画面にアクセスしなくても Zabbix のデータを取得したり、 Zabbix の設定ができるもの! と考えてもらえるとよろしいかと思います! 運用に携わるものの積年の悩みである無限の画面ポチーから解放されるものですね。 Zabbix API 超・入門 それでは実際に私が実施している Zabbix 監視の追加方法について、 実例をもとに説明させていただきます。 今回の実例は、以下に示すように Zabbix トーク ンの取得! Zabbix からグループIDとテンプレートIDの取得! Zabbix へ指定したグループとテンプレートに所属するホストを作成! Zabbix トーク ンの破棄! の流れになっていますので、ごらんの皆様もイメージしやすいかと思います! Zabbix トーク ンの取得! まず Zabbix API を使うには、以下の3つの情報が必要です。 管理画面のアクセスURL 管理ユーザID 管理ユーザパスワード こちらの3つの情報を使って、 Zabbix API とやり取りするための トーク ンを取得することで、 実際に Zabbix のデータを取得したり、 Zabbix へデータを登録できるようになります! では早速 トーク ンを取得してみましょう。 curl -k -s -d ' { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "[管理ユーザID]", "password": "[管理ユーザパスワード]" }, "id": 1, "auth": null } ' -H " Content-Type: application/json-rpc " https:// [ 管理画面のアクセスURL ] /zabbix/api_jsonrpc.php | gawk -F ' " ' ' {print $8} ' このコマンドを実行すると以下のような不思議な文字列が取得できると思います。 これが トーク ンといわれるものです。 9c22b1eade384b1c222e52d0fb4fa303 無事に トーク ンが取得できましたね! それでは実際にこちらの トーク ンを使って Zabbx のデータの取得や Zabbix へのデータの登録を行いましょう! Zabbix からグループIDとテンプレートIDの取得! 実際にホストを登録するにあたって、 事前にホストを所属させたいグループIDとテンプレートIDを調べておきましょう! それでは!先ほど取得した トーク ンを使って実際にグループIDとテンプレートIDを取得してみましょう! まずはグループIDから取得してみましょう。 curl -k -s -d ' { "jsonrpc": "2.0", "method": "hostgroup.get", "params": { "output": "extend", "filter": { "name": [ "[グループの名前]" ] } }, "auth": "[トークン]", "id": 1 } ' -H " Content-Type: application/json-rpc " https:// [ 管理画面のアクセスURL ] /zabbix/api_jsonrpc.php | gawk -F ' " ' ' {print $10} ' このコマンドを実行すると以下のようなIDが取得できると思います。 これが グループID です。 25 続いて、テンプレートIDを取得してみましょう。 curl -k -s -d ' { "jsonrpc": "2.0", "method": "template.get", "params": { "output": "extend", "filter": { "name": [ "[テンプレートの名前]" ] } }, "auth": "[トークン]", "id": 1 } ' -H " Content-Type: application/json-rpc " https:// [ 管理画面のアクセスURL ] /zabbix/api_jsonrpc.php | python -mjson .tool | grep templateid | gawk -F ' " ' ' {print $4} ' このコマンドを実行すると以下のようなIDが取得できると思います。 これが テンプレートID です。 10484 無事にグループIDとテンプレートIDが取得できましたね! それでは次はこちらを使って Zabbix へのデータの登録を行いましょう! Zabbix へ指定したグループとテンプレートに所属するホストを作成! ついに必要な情報が揃いました! それではおまちかね、Zabbix に監視対象ホストの登録を行いましょう! 揃えた情報を利用して、以下のようにコマンドを実施すると…… curl -k -s -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { "host": "[登録したいホスト名]", "interfaces": [ { "type": 1, "main": 1, "useip": 1, "ip": "[監視したいIPアドレス]", "dns": "[登録したいホスト名]", "port": "10050" } ], "groups": [ { "groupid": "[グループID]" } ], "templates": [ { "templateid": "[テンプレートID]" } ], "inventory_mode": 1 }, "auth": "[トークン]", "id": 1 } ' -H " Content-Type: application/json-rpc " https:// [ 管理画面のアクセスURL ] /zabbix/api_jsonrpc.php | python -mjson .tool 無事登録できましたね! これでまとめて一気にホストを登録できますね! スクリプト などに組み込んで一気に登録してあげましょう! Zabbix トーク ンの破棄! 利用の終わった トーク ンはちゃんと破棄しておきましょう。 お片付けは大事です。 curl -k -s -d ' { "jsonrpc": "2.0", "method": "user.logout", "params": [], "id": 4, "auth": "[トークン]" } ' -H " Content-Type: application/json-rpc " https:// [ 管理画面のアクセスURL ] /zabbix/api_jsonrpc.php まとめ さて、実際の流れを通して Zabbix API の使い方の一例としてホストの登録方法についてご案内させていただきました。 単なるホストの登録…だけで言うと自動登録機能を使ったほうがもっと簡単にできますが、 それだけでは痒いところに手が届かないという人や、 Zabbix API を使ってみたいけどどうしたら!?って人が少しでも 【楽】 になれば幸いです。 また過去記事ですが Zabbbix の LLD (ローレベルディスカバリ) についての記事も書いておりますので 良かったらこちらも見ていただけますと幸いです。 ・ ちょっとうれしいZabbixLLDテクニックメモ - RAKUS Developers Blog | ラクス エンジニアブログ 参考 https://www.zabbix.com/documentation/current/manual/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
アバター
みなさん、初めましてmrstsgk_rksです。 今回は、私が開発時に使用している言語「 PHP 」についてまとめました。 最初にPHP8.0の新機能について振り返り、PHP8.1の新機能についてもまとめたいと思います。 PHP8.1の新機能に関しては、リリース日が近づいてきたため、本記事に再度まとめさせていただきました。 最後までお読みいただけましたら幸いです。 目次 目次 PHPについて PHPの概要 PHPは動的型付け言語 PHPは初心者向け 理由1. HTMLとの親和性が強い 理由2. 開発環境が整っている 理由3. WordPressのカスタマイズが可能 PHP8.0 新機能 ユニオン型(UnionTypes) ユニオン型のメリット ユニオン型の注意点 JIT JITコンパイラのメリット JITコンパイラのデメリット 名前付き引数 名前付き引数をのメリット PHP8.1 新機能 列挙型(Enum) 交差型(Intersection Types) 戻り値の型never finalクラス定数 readonlyプロパティ 最後に おすすめの関連ブログ 参考文献 PHP について PHP の概要 PHP は動的型付け言語 動的型付け言語とは、事前に コンパイル を行わず、プログラムの実行時に型をチェックします。 メリットとしては、プログラムの書く量が少なく直感的にコードを書けます。 PHP の他には、 JavaScript や Python などが該当します。 一方、 Java のような静的型付け言語などよりも処理が遅いというデメリットもあります。 PHP は初心者向け 理由1. HTMLとの親和性が強い PHP は、もともと動的にウェブページを作成するために作成された言語であり、 PHP は HTML に直接書き込むことが可能です。 なので、 HTML から学習を始めた方にとっては、 PHP は慣れ親しみやすい言語になると思います。 理由2. 開発環境が整っている PHP を実行するには動作環境が必要ですが、 PHP には環境構築ツールが用意されているので 簡単に PHP の動作環境を用意することが可能です。 ・主な環境構築ツール  1. XAMPP    PHP の動作環境を作成する際に真っ先にあがるツールとして、 XAMPP があります。    XAMPP は、 クロスプラットフォーム であり「 Windows 」、「 Linux 」、「 macOS 」などどのOSでも、動作   させることが可能です。   しかし、 macOS の場合は以下で紹介する「 MAMP 」が使用されることが多いです。  2. MAMP    MAMP もXAMPPと同様に環境開発ツールですが、XAMPPに比べて macOS に特化していることが違いです。 理由3. WordPress のカスタマイズが可能 WordPress はブログやWebサイトを構築する際に利用するソフトウェアのことです。 WordPress のようなソフトウェアのことを CMS ( コンテンツマネジメントシステム )と呼び、 WordPress は世界で最も多く利用されている CMS です。 PHP ができると WordPress をカスタマイズすることが可能です。 PHP はWebアプリケーション以外にも WordPress をカスタマイズできるので他の言語に比べて、 PHP でできることは多いと思います。 以上の3つの理由から PHP は初心者向けと言えるでしょう。 PHP8.0 新機能 PHP8の新機能で私が気になったものをまとめます。 ユニオン型(UnionTypes) ユニオン型(UnionTypes) は2つ以上の型をパイプ記号(|)でつなげて書きます。 PHP8以前のバージョンでは、「パラメータ」や「戻り値」、「プロパティ」の型に対して、単一の型宣言しかできませんでした。またPHP8以前のバージョンでは次の例のように、 ユニオン型 は「PHPDoc」の注釈でのみ指定することが可能でした。 class Hoge {  /**   * @var int|float $hoge   */  private $hoge;  /**  * @param int|float $hoge  */  public function setHoge($hoge) {   $this- > hoge = $hoge;  } } そして、PHP8では ユニオン型 をパイプ記号でつないで T1|T2|... で書けるようになりました。 (下記の例を参照) class Hoge { private int|float $hoge; public function setHoge(int|float $hoge): void { $this- > hoge = $hoge; } } PHP8から ユニオン型 を利用することにより、PHPDocに頼らず多くの情報を関数に定義できます。 ユニオン型のメリット 型をしっかりと適用できるので、ミスを早期に発見できる PHPDocの分量を減らすことできる など PHP8で追加された ユニオン型 にはメリットばかりあるように感じますが、注意点もあります。 ユニオン型の注意点 void はユニオン型の一部として使用できない   void は関数が値を返さないことを意味するので、 int|void のように使用できません。 null許容型(nullable)について  PHP8以前のPHP7.1からサポートされたnull許容型ですが、  ユニオン型と混合して ?int|float などと使用できず、正しくは int|float|null  と書くことができます。以下にnull許容型の例を記載します。 public function huga (?int $huga) {  ・・・ } $hugaでは、int値を指定する、nullを指定する、省略するの3つのどれかを許容できます。 false疑似型について   PHP の関数の多くが、失敗時の戻り値にfalseが設定されている関数が多いので、  false疑似型もサポートされています。  また、null単独では ユニオン型 で使うことができませんが、 false|null と使用することも可能です。 JIT JIT とは、Just-In-Timeの略で、プログラム実行時に事前に用意しておいたコードを保持し、そのコードを使いまわすことで、実効速度などの向上を狙う仕組みのことです。 PHPの概要 でも説明しましたが、 PHP は実行時に コンパイル します。 そこで JIT では、リク エス トが来た ソースコード を読み込み、 PHP を一気にネイティブコードに コンパイル し、さらに コンパイル した結果を次のリク エス トに使いまわすことが可能なので、大幅なパフォーマンスの向上が期待できます。 JIT コンパイラ のメリット PHP アプリケーションコードのパフォーマンス向上 など JIT コンパイラ のデメリット WordPress のパフォーマンスに大きな改善をもたらすことはない 複雑性が増すのでデバックやメンテナンスのコストが増加する可能性がある など 名前付き引数 PHP8新機能紹介の最後は、 名前付き引数 です。 名前付き引数 を使用すると、パラメータの場所ではなく、パラメータ名が参照され関数に引数を渡すことができます。関数に 名前付き引数 を渡すには、その値の前にパラメータ名を加えるだけです。 function sample($testNum1 = 1, $testNum2 = 4) {  ・・・ } また、以下のようなコードはNGです。 function NGSample($testNum1 = $value1, $testNum2 = $value2) {  ・・・ } NGsample 関数のコードでは、パラメータ名を動的に渡すことができないことを意味しています。 名前付き引数をのメリット 名前付き引数 に関しては、メリットのみ記述します。 メリットとして考えられるのは、関数の呼び出しが楽になったということでしょうか。 PHP8以前は、引数の順番を知らないと引数が何を表しているのかがわかりずらかったのですが、PHP8以降はパラメータに名前を使えることによって可読性の向上が期待できます。 PHP8.1 新機能 PHP8.1の新機能で私が気になったものをまとめます。 列挙型( Enum ) PHP8.1でついに 列挙型 が追加されました。 enum Suit { case Hearts; case Diamonds; case Clubs; case Spades; } $val = Suit::Hearts; 列挙型 とは、複数の定数をひとまとめにできる型のことです。 列挙型 を使用することで、同グループの定数をひとまとめにすることができるので、 ソースコード の可読性が向上するでしょう。 また、上の例である Suit列挙型 は Suit::Hearts と書くことによって値にアクセスすることが可能です。 交差型(Intersection Types) PHP8で追加された ユニオン型 が型の和集合(または)を表しますが、PHP8.1で追加された 交差型 は、型の積集合(かつ)を表します。なので 交差型 は & でつなげて表現します。 class Hoge { /**  * 交差型 $hogeはHogeかつFugaである  */  private Hoge & Fuga $hoge; } 戻り値の型never PHP8.1から関数の処理を戻さないことを指定できる戻り値の型 never が追加されます。 function redirect(): never { exit(); } PHP8.1から追加される never は、既存の戻り値の型である void と「関数やメソッドが値を返さないことを保証」することに関しては、似ていますが void が宣言された関数は、明示的な値がなくても返すことができるのに対し、 never が宣言された関数では同じことはできません。 つまり、関数を呼び出した後も PHP の実行が続くことを期待する時は void を使用し、その逆の場合は never を使用します。 finalクラス定数 定数を final として宣言すると定数の値を上書きされないことを保証します。 class Huga {  final public const H = "Huga"; } クラス、メソッド、定数に final を定義できますが、プロパティには定義できないので注意が必要です。 readonlyプロパティ PHP8.1新機能紹介の最後は、 readonlyプロパティ です。 PHP8.1から追加される readonlyプロパティ ですが、上で紹介した finalクラス定数 がプロパティには定義できないという注意点を補完してくれる便利なプロパティです。 readonlyプロパティ は一度初期化した後は、 値が変更できない変数 を作成できます。 class Test { public readonly string $sampleWord; public function __construct (string $sampleWord) { $this- > sampleWord = $sampleWord; } } $test = new Test("hoge"); var_dump($test- > sampleWord); // "hoge" $test- > sampleWord = "fuga"; // Error 上の例では、変数 $sampleWord に readonlyプロパティ が指定されています。 コンスト ラク タでこの変数に初期値が代入されるので、 ”hoge” を指定してオブジェクトを作成することにより、 readonlyプロパティ を指定した変数 $sampleWord にその値が代入されます。 しかし変数に値を代入しようとすると、初期化時ではないためエラーを発生します。 最後に いかがでしたでしょうか。 PHP8とPHP8.1の新機能を一部紹介いたしました。 PHP8とPHP8.1には、まだまだ多くの新機能が追加されていますので、ぜひほかの新機能も調べてみてください。 まずは、この記事を通して PHP に少しでも興味を持っていただければ幸いです。 ご覧いただきありがとうございました。 おすすめの関連ブログ PHP に関連する内容で、別途ブログを作成しております。 是非、ご参考ください! ◆関連ブログ ・ PHP カンファレンス 2021【参加レポート】 ・ PHP8.1 の新機能について語り合う・前編【PHP TechCafe イベントレポート】 ・ PHP8.1 の新機能について語り合う・後編【PHP TechCafe イベントレポート】 参考文献 ・ PHP 8の新機能(新機能、改善点、およびJITコンパイラー) ・ 【PHP8.0】PHP8.0の新機能 ・ PHP 8.1の新機能:機能、変更、改善など ・ 【PHP8.1】PHP8.1の新機能 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに こんにちは C2ZTAk6 です。 今回は初めにDockerについての説明を行ったのち、ハンズオン形式で 「CentOS8環境にDockerインストール~Dockerコンテナ上で、Opensslの SRPM からビルドを行いOpensslの RPM を作成する手順」 を紹介していきたいと思います。 目次 はじめに 目次 Dockerとは Dockerfileとは Dockerイメージとは SRPMとは Dockerコンテナ上でRPMを作成するメリットとは Docker環境構築 必要なミドルウェアインストール DockerCEのインストール Docker起動及び、自動起動設定 RPM作成用Dockerベースイメージ作成 Dockerfile作成 Dockerベースイメージ作成用スクリプト作成 Dockerベースイメージ作成スクリプト実行 Dockerイメージが作成されているか確認 Dockerコンテナ上で、SRPM(Openssl)からビルドを実行 Dockerfile作成 SRPMビルドスクリプト作成 SRPM(Openssl)ビルドスクリプト実行 RPMが作成されているか確認する 最後に Dockerとは 仮想化環境を構築するためのツールとなり、コンテナ型の仮想化プラットフォームと呼ばれております。 具体的には、 Windows 、 Linux のホストマシンなどにコンテナと呼ばれる仮想環境を構築し、 コンテナの中でアプリケーションや ミドルウェア 、OSなどを動かすことが出来るツールとなります。 コンテナ型の仮想プラットフォーム構成イメージ Dockerfileとは Dockerで作成するコンテナイメージを管理するためのファイルです。 Dockerfileに記載する内容は、必要な ミドルウェア 、アプリケーション、 ディレクト リ構成、各種設定などを記載致します。 ・以下は今回の ハンズオンで使用するDockerfile変数の説明 となります。 変数名 説明 FROM ベースイメージを指定します。 ARG ビルド時にDockerに渡す変数を定義します。 WORKDIR 作業用 ディレクト リを定義します。 RUN FROMで記載したベースイメージに対してコマンドを実行することができます。 ※その他Dockerfileの変数を調べたい場合は、 公式ドキュメント をご参照ください。 Dockerイメージとは Dockerコンテナを立ち上げる基になるのがDockerイメージです。 Dockerイメージは、 docker hub というDockerの公式サイトからダウンロードしてくることもできます。 また、自身で作成したDockerfileをbuildすることで、自作のDockerイメージを作成することもできます。 Dockerfileを元にDockerContainer作成までのイメージ SRPM とは SRPM とは、 RPM パッケージを作成する事が出来るソースパッケージとなります。 SRPM には、 ソースコード 、パッチ、作成方法が記載されたspecファイル等が含まれており、 spec ファイルを元にビルド(rpmbuild)を行うと ディストリビューション が配布している RPM パッケージと同等の物を作る事が出来ます。 なお、specファイルに記載されている情報を自分好みに修正することで、 ディレクト リ構成や コンパイル 時のオプションなどを制御することが可能となります。 Dockerコンテナ上で RPM を作成するメリットとは ホストOS上で RPM を作成する場合は、対象の RPM を作成する際に どういった ミドルウェア をインストールしたか どういった設定を行ったのか 後追いでの確認が困難となり、 最悪の場合は、同じSPECファイルを元に RPM を作成しても以前と同じ RPM が作成できないというリスクがあります。 Dockerfileにコンテナに必要な ミドルウェア 、アプリケーション、 ディレクト リ構成、各種設定などを記載してコード化することで、必要な情報の整理ができ、ホストOS上に不要な ミドルウェア 、アプリケーションなどインストールする必要もなくなります。 また、作成したDockerfileを元にDockerコンテナ上で RPM を作成すれば、毎回新しい環境で RPM が作成されることになり、以前とは同じ RPM が作成できないというリスクがなくなります。 Docker環境構築 ※以降からハンズオン形式での説明となります。 ・CentOS8をインストールした 仮想マシン を用意 [ root@rpm-test-server ~ ] # cat /etc/redhat-release CentOS Linux release 8 . 1 . 1911 ( Core ) 必要な ミドルウェア インストール ・dnfコマンドを使用して、ホストOSに必要な ミドルウェア をインストールします。 [ root@rpm-test-server ~ ] # dnf install -y yum-utils device-mapper-persistent-data lvm2 wget mock CentOS-8 - AppStream 7 . 9 kB/s | 4 . 3 kB 00:00 CentOS-8 - AppStream 3 . 6 MB/s | 9 . 3 MB 00:02 CentOS-8 - Base 6 . 1 kB/s | 3 . 9 kB 00:00 CentOS-8 - Base 5 . 3 MB/s | 7 . 5 MB 00:01 CentOS-8 - Extras 3 . 0 kB/s | 1 . 5 kB 00:00 CentOS-8 - Extras ~~~~~~~~~~省略~~~~~~~~~~ 完了しました! ・Docker公式ページを参照する リポジトリ を設定します。 [ root@rpm-test-server ~ ] # dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo repo の追加: https://download.docker.com/linux/centos/docker-ce.repo ・ リポジトリ のリストに、docker-ce-stable が追加されていることを確認する。 [ root@rpm-test-server Openssl ] # dnf repolist repo id repo の名前 AppStream CentOS-8 - AppStream BaseOS CentOS-8 - Base docker-ce-stable Docker CE Stable - x86_64 extras CentOS-8 - Extras DockerCEのインストール ・dnfコマンドを使用して、ホストOSにDockerCEをインストールします。 [ root@rpm-test-server ~ ] # dnf install -y docker-ce docker-ce-cli containerd.io Docker CE Stable - x86_64 221 kB/s | 3 . 5 kB 00:00 依存関係が解決しました。 ~~~~~~~~~~省略~~~~~~~~~~ 完了しました! Docker起動及び、 自動起動 設定 ・systemctlコマンドにて、Dockerサービスを起動させます。 [ root@rpm-test-server ~ ] # systemctl start docker ・Dockerサービスが起動していることを確認する。 [ root@rpm-test-server ~ ] # systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded ( /usr/lib/systemd/system/docker.service ; enabled ; vendor preset: disabled ) Active: active ( running ) since Fri 2021-10-15 21:40:16 JST; 34s ago Docs: https://docs.docker.com Main PID: 12645 ( dockerd ) Tasks: 8 Memory: 43 .0M CGroup: /system.slice/docker.service mq12645 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 10 月 15 21:40:12 rpm-test-server.mdomain dockerd [ 12645 ] : time=" 2021-10-15T21:40:12.977524850+09:00 " level =info msg = " Loading containers: start. " 10 月 15 21:40:15 rpm-test-server.mdomain dockerd [ 12645 ] : time=" 2021-10-15T21:40:15.411238922+09:00 " level =info msg = " Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferre> 10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:15. 411780590 +09:00 " level=info msg= " failed to read ipv6 net.ipv6.conf. < bridge > .accept_ra " bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra 10月 15 21:40:15 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:15. 411800783 +09:00 " level=info msg= " failed to read ipv6 net.ipv6.conf. < bridge > .accept_ra " bridge=docker0 syspath=/proc/sys/net/ipv6/conf/docker0/accept_ra 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 095902384 +09:00 " level=info msg= " Firewalld: interface docker0 already part of docker zone, returning " 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 247442276 +09:00 " level=info msg= " Loading containers: done . " 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 335702315 +09:00 " level=info msg= " Docker daemon" commit=79ea9d3 graphdriver(s)=overlay2 version=20.10.9 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 336171122 +09:00 " level=info msg= " Daemon has completed initialization " 10月 15 21:40:16 rpm-test-server.mdomain systemd[1]: Started Docker Application Container Engine. 10月 15 21:40:16 rpm-test-server.mdomain dockerd[12645]: time= " 2021-10-15T21:40:16. 381474167 +09:00 " level=info msg= " API listen on /var/run/docker.sock " ・Dockerサービスの 自動起動 設定を行う。 [ root@rpm-test-server ~ ] # systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service. ・Dockerサービスの 自動起動 設定の確認を行う。(enableになっていること) [ root@rpm-test-server ~ ] # systemctl is-enabled docker enabled ・インストールしたDockerのバージョンを確認する。 [ root@rpm-test-server ~ ] # docker --version Docker version 20 . 10 . 9 , build c2ea9bc RPM 作成用Dockerベースイメージ作成 ・mkdirコマンドにて、 ディレクト リを作成する。 [ root@rpm-test-server ~ ] # mkdir -p /root/RPM/ { Baseimage,Openssl } ・Baseimage、Openssl ディレクト リが作成されていることを確認する。 [ root@rpm-test-server ~ ] # ls -l /root/RPM/ 合計 0 drwxr-xr-x. 2 root root 6 10 月 15 22:57 Baseimage drwxr-xr-x. 2 root root 6 10 月 16 01:41 Openssl ・Baseimage ディレクト リに移動する。 [ root@rpm-test-server ~ ] # cd /root/RPM/Baseimage/ Dockerfile作成 ・viコマンドにて、Dockerfileの作成を行います。 [ root@rpm-test-server Baseimage ] # vi Dockerfile FROM centos:8 # 必要なパッケージ、フォルダなど RUN yum install gcc gcc-c++ make autoconf automake rpm-build wget -y RUN mkdir -p /root/rpmbuild/ { SPECS,SOURCES } Dockerベースイメージ作成用 スクリプト 作成 ・viコマンドにて、Dockerベースイメージ作成用 スクリプト の作成を行います。 [ root@rpm-test-server Baseimage ] # vi base.sh VERSION = ' 8 ' NAME_RPM = ' rpmbuild_base ' docker build -t $NAME_RPM : $VERSION . Dockerベースイメージ作成 スクリプト 実行 ・作成したDockerベースイメージ作成 スクリプト を実行します。 [ root@rpm-test-server Baseimage ] # sh base.sh Sending build context to Docker daemon 3 .072kB Step 1 / 3 : FROM centos:8 8: Pulling from library/centos a1d0c7532777: Pull complete Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177 Status: Downloaded newer image for centos:8 ---> 5d0da3dc9764 Step 2 / 3 : RUN yum install gcc gcc -c ++ make autoconf automake rpm-build wget -y ---> Running in fbc9dabbe91b ~~~~~~~~~~省略~~~~~~~~~~ Step 3 / 3 : RUN mkdir -p /root/rpmbuild/ { SPECS,SOURCES } ---> Running in da70aa6d2f3b Removing intermediate container da70aa6d2f3b ---> 47940803c713 Successfully built 47940803c713 Successfully tagged rpmbuild_base:8 Dockerイメージが作成されているか確認 ・REPOSITORY欄にrpmbuild_baseが作成されていることを確認する。 [ root@rpm-test-server Baseimage ] # docker images REPOSITORY TAG IMAGE ID CREATED SIZE rpmbuild_base 8 47940803c713 38 seconds ago 511MB centos 8 5d0da3dc9764 4 weeks ago 231MB [ root@rpm-test-server Baseimage ] # Dockerコンテナ上で、 SRPM (Openssl)からビルドを実行 ・Openssl ディレクト リに移動 [ root@rpm-test-server ~ ] # cd /root/RPM/Openssl/ Dockerfile作成 ・viコマンドにて、Dockerfileの作成を行います。 [ root@rpm-test-server Openssl ] # vi Dockerfile # ベースイメージ FROM rpmbuild_base:8 # 変数 ARG URL_SOURCE0 = " https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm " # ディレクトリ移動 WORKDIR /root/rpmbuild/SOURCES/ # Openssl srpmダウンロード RUN wget $URL_SOURCE0 # ユーザー作成 RUN useradd -s /sbin/nologin mockbuild # 必要なパッケージインストール RUN dnf -y --nogpgcheck install lksctp-tools-devel perl zlib-devel krb5-devel # Openssl srpmインストール RUN rpm -ivf openssl-1. 1 .1g-15.el8_3.src. rpm # ディレクトリ移動 WORKDIR /root/rpmbuild/SPECS/ # srpmからOpensslをビルド RUN rpmbuild -bb openssl.spec # Dockerコンテナ上で、srpmから作成されたOpensslインストールテスト実施 RUN rpm -ivh --force --nodeps --test /root/rpmbuild/RPMS/x86_64/*. rpm # Dockerコンテナ上で、srpmから作成されたOpensslインストール実施 RUN rpm -ivh --force --nodeps /root/rpmbuild/RPMS/x86_64/*. rpm vi コマンドの使い方は、以下記事もご参考ください! ・ vi コマンド【使い方まとめ】 - RAKUS Developers Blog | ラクス エンジニアブログ SRPM ビルド スクリプト 作成 ・viコマンドにて、 SRPM ビルドイメージ作成用 スクリプト の作成を行います。 [ root@rpm-test-server Openssl ] # vi rpmbuild.sh # 変数 NAME_RPM = ' openssl ' VERSION = ' 1.1.1g ' # ビルドされたrpmを配置する際のディレクトリ作成 mkdir -p /tmp/create-rpmbuild/ # Openssl作成用Dockerイメージ作成 docker build -t $NAME_RPM :latest . # コンテナ終了時にコンテナ自動的に削除 docker run --rm --name $NAME_RPM -itd $NAME_RPM sh # コンテナ上に作成されたRPMをホストOSに状にコピー docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-libs- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-devel- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-static- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ docker cp ${NAME_RPM} :/root/rpmbuild/RPMS/x86_64/openssl-devel- ${VERSION} -15 .el8.x86_64. rpm /tmp/create-rpmbuild/ # コンテナ停止 docker stop ${NAME_RPM} # Openssl用Dockerイメージ削除 docker rmi ${NAME_RPM} :latest SRPM (Openssl)ビルド スクリプト 実行 ・ SRPM からOpensslの RPM をビルドする スクリプト を実行する。 [ root@rpm-test-server Openssl ] # sh rpmbuild.sh Sending build context to Docker daemon 4 .096kB Step 1 / 11 : FROM rpmbuild_base:8 ---> 47940803c713 Step 2 / 11 : ARG URL_SOURCE0 = " https://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssl-1.1.1g-15.el8_3.src.rpm " ---> Using cache ---> 9c6a07f70f2c Step 3 / 11 : WORKDIR /root/rpmbuild/SOURCES/ ---> Using cache ---> 91b3bef3ec6f Step 4 / 11 : RUN wget $URL_SOURCE0 ---> Using cache ---> 2318dc6d3c4a Step 5 / 11 : RUN useradd -s /sbin/nologin mockbuild ---> Using cache ---> 8e57c50993a5 ~~~~~~~~~~省略~~~~~~~~~~ Removing intermediate container 95c6bb93b199 ---> 538078ef2772 Successfully built 538078ef2772 Successfully tagged openssl:latest 3479522ed3d3d981faef54ec5e9a0e831984431377bc9a8cf9b09addb321ff61 openssl Untagged: openssl:latest Deleted: sha256:538078ef2772180b5cc0650f8cecd80474c29a1790991298d2ab05636825279a Deleted: sha256:04c421d5a98c31c6d70ab035da0c964a98d1e54ac679d1604fe8d0e03a076850 Deleted: sha256:013c357eb7ca648af3ad90df4b03a9ada73c11b1f5d32f2286eeed5d4d87831b Deleted: sha256:692bf040e3880686d38953b2744975103dbe0e1970d159bb7d77dfb4faa44cb6 Deleted: sha256:52c42e62f265da49f619d83d2bce9bcc56a38813370715fc18dab699b96e49e4 Deleted: sha256:67025404f47b7ceece317a15d542f7fb7c8caa1053dcbc84512f43eb8d6f8d2c Deleted: sha256:309dc603c2bf6a08897a2b64b758618d2056dc9ef57545e0f9f506acbeb69162 Deleted: sha256:b5e761f711bd787c0ad14fbed4233e6ae6c43f88c9ebe435ec454964e4669060 Deleted: sha256:8d61bbfdc7afa30f88cf2d09ac28e1c7566975d7971b7acbee2e88945521608a Deleted: sha256:419e3d452135275ad35b0f9bba27fc63854a5388e88e49e05ab255e291ad41f7 Deleted: sha256:20d4d5a2b412e5e524a660dcb348ca0c688f7ff9d97ad6f3c36cd21eaa835b35 Deleted: sha256:0c140ce4025c8d1a5fdb6f1124915d8cddea89ddaf5febbb485794c9308c7a1c Deleted: sha256:1fab17399235d6ed8d1c447c9b0ed6419579b5c014c06ed2834c00dfc72a4220 Deleted: sha256:3b9e3b2a67519fb7fec632ea2fd4183f115e7f94ff26634abbee2ceeffa59244 Deleted: sha256:c9b708f383b8f88a7febd8db97608dc7b25abb388a30873233616c49ff77a544 Deleted: sha256:6a1390ee9ac3c3b59ff887240ef0f4d3e18dd7da295c580d3095bea1813baace Deleted: sha256:898ff5c05d6799e520cf185a4ccfc7c049fe5813f1cb6721f96a64bee8718db5 RPM が作成されているか確認する ・Dockerコンテナ上で、Opensslの RPM が作成され、ホストOSに RPM がコピーされていることを確認 [ root@rpm-test-server Openssl ] # ls -l /tmp/create-rpmbuild/ 合計 6500 -rw-r--r--. 1 root root 722616 10 月 16 03:39 openssl-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 2427736 10 月 16 03:39 openssl-devel-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 1532836 10 月 16 03:39 openssl-libs-1. 1 .1g-15.el8.x86_64. rpm -rw-r--r--. 1 root root 1963936 10 月 16 03:39 openssl-static-1. 1 .1g-15.el8.x86_64. rpm 最後に いかがでしたでしょうか。 今回はDockerの基本的な説明を交えながら、ハンズオン形式でCentOS8環境にDocker環境の構築を行いDockerfileを元に Dockerイメージ作成~Dockerコンテナ上で、 SRPM からOpensslの RPM の作成を行いました。 この記事がCentOS8環境でDockerを使おうとしているエンジニアの助けとなれば幸いです。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに 皆様こんにちは。インフラ開発課でインフラエンジニアとして勤務しておりますryskwです。 わたしはプログラムなどまったくの未経験で ラク スに採用していただきましたが、最近になってエンジニアであればやはり何かプログラミング的な学習をしたいと思っているところです。 せっかくなので課内で扱う方も多い Python をやってみたいと思い色々と書籍を読み始めたりしているので、今回は Python に限らず スクリプト を組むうえでも使用する機会の多いであろうif文について 、自己学習もかねてまとめていきたいと思います。 そのため本記事は Python を最近触り始めたばかりの人 が読んでいただくことを想定しております。 目次 はじめに 目次 Pythonとは Python if文の書式 Python if文で条件式で使用する演算子と注意点 Python if文で条件文を追加したいとき おまけ 最後に Python とは Python をざっくりと語るのであれば、 プログラミング言語 の中でも少ない ソースコード でわかりやすいコードが書けることから、プログラミング教育や初心者向けの プログラミング言語 として多く利用されていることなどが特徴としてあげられることが多いと思います。作成したコードを コンパイル する作業も不要であり、エラーがあったとしても確認が容易であることもプログラミング初心者にとってはとっつきやすい点の一つになるかと思います。 個人的に Python でできることの中でも特に興味があることとしては、 機械学習 や ディープラーニング などの分野で分析ツールの作成において Python が利用されていることにあります。 Python には開発者向けに便利なライブラリがたくさん公開されているので、慣れてくるとやりたいことがなんでもできるようになるんじゃないか、というプログラミングに対してふわっとした期待感が持てます。 Python if文の書式 それではまずは Python でのif文について簡単に説明します。 Python に限りませんが、if文は条件によってその後の処理を行うかどうかプログラム内で分岐処理を行いたいときに使用する構文です。 わかりやすく表現するのであれば、「もし○○のときは××する。」といった具合ですね。 if文では、条件式(条件として実行した処理)の結果がTrueかFalseで判断し、Trueの場合に続く処理を実行します。 たとえば、 Python のコードの中でnumberという変数を使用し、条件としてその中に代入された数字が3よりも大きい場合に「3より大きいです」と表示させるには、以下のように記述します。 $ cat test.py number = 5 if number > 3 : print ( '3より大きいです' ) $ python3 test.py 3 より大きいです $ ※ Python if文の書式において、printの処理の箇所でインデントを下げているのは、 「ここは Python のコードの中でif文で条件が分かれた後の処理ですよ」ということが見た目にわかるだけでなく、 Python がコードと処理を正しく認識するためにも必要です。 インデントがおかしいと Python プログラム実行時にエラーが表示されてしまいます。 試しにif文の条件分岐後のprint処理をインデントを下げずに記述して Python を実行してみると、以下のようなエラーが表示されました。 $ cat test_error.py number = 5 if number > 3 : print ( '3より大きいです' ) $ python3 test_error.py File "test_error.py" , line 4 print ( '3より大きいです' ) ^ IndentationError : expected an indented block $ ちなみに Python においては、if文などでインデントを下げる場合は一般的に半角スペース4つ分とするようです。 もしif文の条件との比較の結果、Falseだった(条件に当てはまらなかった)場合には何も処理が行われません。 先ほどよりnumberに代入する値を小さくしてみましょう。 $ cat test_false.py number = 1 if number > 3 : print ( '3より大きいです' ) $ python3 test_false.py $ この場合では、numberという変数に入っている1が、if文の条件で比較対象となった3より小さかったために Python を実行しても結果に何も表示されませんでした。 Python if文で条件式で使用する 演算子 と注意点 演算子 if文での条件式では、数字や文字列の一致、不一致などによって判断させます。 その際、条件比較するために使用する代表的な 演算子 は以下のようなものがあります。 記号 内容 例 == 左辺と右辺が等しければTrueを返す 1 == 1 != 左辺と右辺が等しくなければTrueを返す 1 != 2 < 左辺よりも右辺のほうが大きければTrueを返す 1 < 2 > 左辺が右辺よりも大きければTrueを返す 2 > 1 <= 左辺が右辺以下ならばTrueを返す 1 <= 2 >= 左辺が右辺以上ならばTrueを返す 2 >= 1 また、他にも以下のような比較 演算子 が Python if文では使用できます。参考にしてみてください。 記号 内容 例 is 2つのオブジェクトが同一であればTrueを返す 1 is 1 is not 2つのオブジェクトが同一でなければTrueを返す 1 is not '1' 注意点 Python if文で比較を行う際には、比較するオブジェクトが数字か、文字列なのかなど、同じオブジェクト同士での比較になっているか注意が必要です。 Python では整数のオブジェクトにはint型、文字列にはstr型、となっています。 if文で比較する際にはこの型が一致していなければ Python は正しくプログラムを動かしてくれません。 もしif文で比較したい型が条件の前後で異なっていた場合、 Python はエラーを表示します。 試しに、変数numberに文字列としての5を代入し、if文では整数の3と比較させてみましょう。 $ cat test_str_err.py number = '5' if number > 3 : print ( '3より大きいです' ) $ python3 test_str_err.py Traceback (most recent call last): File "test_str_err.py" , line 3 , in <module> if number > 3 : TypeError : '>' not supported between instances of 'str' and 'int' $ このような場合は、if文の条件式で比較したい対象を前述したint型、str型、といった型で明示的に指定してあげることもできます。 $ cat test_int.py number = '5' if int (number) > 3 : print ( '3より大きいです' ) $ python3 test_int.py 3 より大きいです $ Python if文で条件文を追加したいとき Python if文の比較結果がFalseだったときにも処理を行いたいとき if文では比較の結果がTrueだったときに処理を行う構文になっておりますが、もし比較の結果がFalseだったときにも何か処理を実行したい場合があるかもしれません。 そんなときはif文にelseの処理を追加することで対応が可能です。 $ cat test_if_else.py number = 5 if number > 4 : print ( '4より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_else.py 4 より大きいです $ 上記の場合では、変数numberが5であり条件の4よりも大きいため、一つ目のブロックでif文の結果でTrueが返ります。 よってif文の実行結果として出力されるのは「4より大きいです」となりました。 ところが、変数numberが3であった場合はどうでしょうか。 その場合、一つ目のif文で比較された結果、Falseが返ります。 $ cat test_if_else.py number = 3 if number > 4 : print ( '4より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_else.py 4 以下です $ Falseが返ると、「そうでない場合は」という条件であるelseでの処理になるため、 Python の処理を実行すると結果は「4以下です」となりました。 Python if文で条件を複数設定したいとき また、 Python のif文で条件を分岐したあと、さらに条件を追加して処理を分岐したい、と思うことがあるかもしれません。 「もし○○のときは××する。もし★★のときは■■する。そうでないときは▲▲する。」といった具合に、条件を増やして分岐先の処理を増やしたいときには、「if elif else」構文で対応が可能です。 以下はif文の条件を3つにした場合の例です。 $ cat test_if_elif_else.py number = 4 if number > 10 : print ( '10より大きいです' ) elif number > 5 : print ( '5より大きいです' ) else : print ( '4以下です' ) $ python3 test_if_elif_else.py 4 以下です $ また、if文の中でさらにif文によって条件分岐を行いたいときもあるかと思います。 そういった場合では、インデントをさらに一つ下げることでif文の処理を継続することが可能です。 (if文のネスト( 入れ子 )構造と呼びます。) $ cat test_if_if.py number = 10 if number > 4 : if number <= 8 : print ( '8以上です' ) else : print ( '4より大きく8未満です' ) else : print ( '4未満です' ) $ python3 test_if_if.py 4 より大きく 8 未満です $ また、 入れ子 構造になっているif文の比較を「and」や「or」を用いて書くこともできます。 日本語で言うところの「○○かつ■■」や「××または△△」といった条件のことを指す、といえば少しわかりやすいかもしれません。 一つ前の Python 実行例の中のif文をandで書きなおすと以下のようになります。 $ cat test_and.py number = 10 if number > 4 and number <= 8 : print ( '4より大きく8以下です' ) elif number > 4 and number > 9 : print ( '9より大きいです' ) else : print ( '4未満です' ) $ python3 test_and.py 9 より大きいです $ おまけ 最後に、 Python のfor文とif文とを組み合わせることで、「同じ処理を繰り返して、特定の回数以上処理を繰り返したらそこで処理を終了する」というコードを書いてみたいと思います。 for文ではリスト内のすべての要素に対して繰り返し処理を実行したい場合などに便利です。 今回は、1から10の数字をfor文によって次々と変数numberに代入していき、「もし繰り返しが5回目になったら処理を中断する」処理にしてみます。 $ cat test_if_for.py for number in range ( 1 , 10 ): print ( '{}回目の処理です' .format(number)) if number >= 5 : print ( '5回目の処理になったので処理を中断します' ) break $ python3 test_if_for.py 1 回目の処理です 2 回目の処理です 3 回目の処理です 4 回目の処理です 5 回目の処理です 5 回目の処理になったので処理を中断します $ 上記では、 Python のfor文を利用して処理の回数を表示するのを繰り返しており、条件として繰り返しの回数(変数number)が5以上となったときに、if文の条件分岐によって処理が終了するようにコードが記載されています。 そのため、「5回目の処理です」と出力した後のif文の分岐で条件に一致したため「5回目なので処理を中断します」と出力され、 Python の実行が完了しました。 最後に いかがだったでしょうか。 Python は書式さえ覚えることができれば比較的に簡単にプログラムができるんじゃないかと思います。 Python if文をいくつか組み合わせるだけでも、やりたいことの実現も少し見えてくるのではないでしょうか。 私もまだ勉強中の身ではありますが、慣れてきたらサーバのログ分析ツールなどを Python で作ってみたいと考えています。 ご覧いただきありがとうございました。 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
初めまして。 ラク スでインフラを担当していますru369と申します。 今回は 冗長化 についてご参考になればいいなと思い、本記事にまとめさせていただきました。 ▼まずは冗長化の意味から! ▼keepalivedを使って冗長化 サーバの情報 諸々インストール 冗長化の確認等に利用するシェルスクリプト3つ keepalivedの設定ファイル keepalivedを起動と冗長化の状態確認 ▼動作テスト 1.MASTER側のkeepalived/nginxを停止したらBACKUP側にVirtual IPが付与され冗長化を確認できるか 2.MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され冗長化を確認できるか 3.メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり冗長化を確認できるか ▼まとめ ▼まずは 冗長化 の意味から! システムの一部に何らかの障害が発生した場合に備えて、 障害発生後でもシステム全体の機能を維持し続けられるように、 予備装置を平常時からバックアップとして配置し運用しておくこと 引用元: wikipedia 簡単に言うと【継続したサービス提供のために本稼働サーバとは別にもう1台備えておく= 冗長化 】ということですね。 今回はnginxが動いているサーバの 冗長化 を試みます。 冗長化 には keepalived を使ってみたいと思います。 ▼ keepalived を使って 冗長化 サーバの情報 テスト1号機【MASTER】 172.20.100.95 テスト2号機【BACKUP】 172.20.100.96 Virtual IPaddress(冗長化用) 172.20.100.98 OS Centos 7.9 ※selinux、firewalldは無効化してます 諸々インストール 〇 keepalived yum パッケージで keepalived は提供されているのでサクッとインストール # yum -y install keepalived 〇nginxインストール&起動、確認 nginxのyumリポジトリを追加 /etc/yum.repos.d/nginx.repoに以下の内容を記述 ****************************** [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 ****************************** # yum install -y nginx # systemctl start nginx 冗長化 の確認等に利用する シェルスクリプト 3つ check_test1.sh nginxサービスの起動/停止状況をチェックする スクリプト check_test2.sh nginxサービスのプロセスの状態をチェックする スクリプト check_test3.sh メンテナンスモードかどうかをチェックする スクリプト keepalived の設定ファイル ◇テスト1号機【MASTER】側 /etc/ keepalived / keepalived .conf ! Configuration File for keepalived global_defs { } vrrp_script check_test { script "/etc/keepalived/check_test1.sh" interval 2 fall 2 rise 2 } vrrp_script check_test_processes { script "/etc/keepalived/check_test2.sh" interval 2 fall 2 rise 2 } vrrp_script check_test_mode { script "/etc/keepalived/check_test3.sh" interval 2 weight 50 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 101 advert_int 1 virtual_ipaddress { 172.20.100.98 } track_script { check_test check_test_processes maintenance_mode } } ◇テスト2号機【BACKUP】側 ※MASTER側と異なるところのみ抜粋 priority 100 keepalived を起動と 冗長化 の状態確認 # systemctl start keepalived 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 サーバ間で共有するVirtual IPaddress 172.20.100.98 がMASTER側に付与されて 冗長化 されていそうな感じです。 動作テストで 冗長化 されているかを確認していきたいと思います。 ▼動作テスト 以下のパターンで 冗長化 の動作テストしていきます。 MASTER側の keepalived /nginxを停止したらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり 冗長化 を確認できるか 1.MASTER側の keepalived /nginxを停止したらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか 【MASTER】 # systemctl stop keepalived # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 Virtual IPaddressがBACKUP側に移動して 冗長化 を確認できました。 nginx停止の場合は以下の通り # systemctl stop nginx # systemctl is-active nginx inactive ★参考までに切り替わっている最中に ping 飛ばしてみました。 # ping 172.20.100.98 64 bytes from 172.20.100.98: icmp_seq=9 ttl=64 time=0.405 ms 64 bytes from 172.20.100.98: icmp_seq=10 ttl=64 time=0.412 ms 64 bytes from 172.20.100.98: icmp_seq=12 ttl=64 time=2.18 ms  ★ここで切り替わった 64 bytes from 172.20.100.98: icmp_seq=13 ttl=64 time=0.288 ms 64 bytes from 172.20.100.98: icmp_seq=14 ttl=64 time=0.314 ms 2.MASTER側のnginxをハングアップさせたらBACKUP側にVirtual IPが付与され 冗長化 を確認できるか MASTER側のnginxにSIGSTOPを送信して、nginxを停止状態とする 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 # ps -C nginx -o comm,command,pid,state COMMAND COMMAND PID S nginx nginx: master process /usr/ 114281 S nginx nginx: worker process 114282 S # pkill -SIGSTOP nginx  ★ハングアップさせた # ps -C nginx -o comm,command,pid,state COMMAND COMMAND PID S nginx nginx: master process /usr/ 114281 T nginx nginx: worker process 114282 T # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 こちらのパターンでもVirtual IPaddressがBACKUP側に移動して 冗長化 を確認できました。 3.メンテナンス用のファイルを設置によってMASTER/BACKUPが入れ替わり 冗長化 を確認できるか /etc/keepalived/maintenance というファイルがあれば、priority値が50下がり、MASTERとBACKUPが入れ替わる想定 〇メンテナンス用ファイル設置前後でのpriority値の変化 MASTER BACKUP 設置前のpriority値 1号機側:101 2号機側:100 設置後のpriority値 1号機側:51 2号機側:100  ⇒設置後は2号機側(もとBACKUP側)のpriority値が高くなるのでMASTERとして昇格する。 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 # touch /etc/keepalived/maintenance # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 【BACKUP】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 ★このままBACKUP側にメンテナンス用のファイルを設置してみると元に戻る想定 元MASTER 元BACKUP 2号機側への設置前 priority値 1号機側:51 2号機側:100 2号機側への設置後 priority値 1号機側:51 2号機側:50 【BACKUP】 # touch /etc/keepalived/maintenance # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.96/16 brd 172.20.255.255 scope global noprefixroute eth0 【MASTER】 # ip a | grep eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 172.20.100.95/16 brd 172.20.255.255 scope global noprefixroute eth0 inet 172.20.100.98/32 scope global eth0 想定通りMASTER/BACKUPが入れ替わり 冗長化 を確認できました! 冗長化 しているとメンテナンスするとき結構便利な印象です。 冗長化 、一考の余地あり...。 ▼まとめ 今回の 冗長化 は明示的にMASTER,BACKUPを設定してみましたが、confのstateをどちらもBACKUPにすることでフェイルバックを防ぐこともできます。 また、 keepalived では 冗長化 の他にconfでnotification_emailを使ってアラート通知を飛ばしてみたり、notifyを利用したステータスチェックもできるみたいです。 色々と設定できそうなことがあるので運用状況にあったものを 冗長化 する際に検討する必要がありそうです。 この記事が少しでも皆様の幸せになることを願って。 ※参考にしたページ https://weblabo.oscasierra.net/nginx-centos7-install/ https://qiita.com/hana_shin/items/bda169d8d24f5954a992 https://mseeeen.msen.jp/build-cluster-with-keepalived-on-centos-7/ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
はじめに 皆さん初めましてmonga3です。 今回は Linux 上で文字列を処理することに便利な sed コマンド について紹介していきます。 sed コマンドの基本から実務での使用方法を交えて説明します。 Linux の理解をより深めたい方へ以下関連おすすめブログ ・ ls コマンド 【使い方 まとめ】 ・ find コマンド 【使い方 まとめ】 ・ sed コマンド【使い方 まとめ】 ・ vi コマンド【使い方まとめ】 ・ よく使うLinuxコマンド一覧【最新版】 ・ Linuxのファイル操作でよく使うLinuxコマンド ・ 初心者のためのawkコマンド ・ 実務で使える!基本的なシェル(Linux)コマンドの話 ~forとsed~ ・ 【Linux】今振り返りたい、プロセスって何? 目次 はじめに 目次 sed コマンドとは 使い方 コマンド オプション アドレス 基本的な使い方 応用編 Linuxコマンド おすすめ書籍 sed コマンド まとめ sed コマンドとは 「stream editor」の略称で、指定したファイルをコマンドに従って処理することが出来る。 入力を行単位で読み取り、テキスト変換などの編集をおこない行単位で出力する。 正規表現 に対応している。 使い方 sed [オプション] コマンド 入力ファイル名 コマンド どういう処理をしたいかをコマンドで指定します。 処理内容の出力、削除、文字列の追加、置換などの処理を行えるコマンドが用意されています。 コマンド 説明 [=] 現在の行番号を出力します。 [#] コメント [a 文字列] 指定した位置の後ろに文字列を追加します。(改行する場合は改行前の文字列に[/]を付ける。) [i 文字列] 指定した位置の後ろにテキストを挿入します。(改行する場合は改行前の文字列に[/]を付ける。) [c 文字列] 選択した行をテキストに置き換えます。(改行する場合は改行前の文字列に[/]を付ける。 [q] 入力を中断し、それ以上処理を行わず終了します。(※未出力分があれば出力してから終了します。) [Q] 入力、出力をせずに終了します。 [d] 指定した行を削除します。 [l 文字数] 指定した文字数で改行します。 [p] 処理した内容を出力します。-n オプションと組み合わせて使うことがあります。 [P] 処理した内容を出力します。 [r ファイル名] ファイルを先頭に追加します。 [s/置換前文字列/置換後文字列/] (置換前文字列)で指定した文字列にマッチした部分を置換後文字列へ置き換えます。また複数マッチした場合は先頭のみ置換を行い、対象全て置換を行う場合は[s/置換前/置換後/g]のように[-g]オプションを併用します。 [y/元の文字列/対象文字列/] (元の文字列)のものを(対象文字列)の同じ位置に存在する文字列に置換します。(※[tr]コマンドのように使用可能です。) オプション コマンド実行時のオプションを指定できます。 オプション 説明 [-e( スクリプト )] スクリプト をコマンドに追加します。複数指定すれば、複数回のコマンドを実行できます。 [-E] 拡張正規表現 を利用する時に使用します。 [-f(ファイル名)] スクリプト が記述されているファイルを指定します。ファイルに記載されているコマンドを実行することが出来ます。 [-i] 直接ファイルを編集します。 [-i(拡張子)] ファイルを直接編集して、指定した拡張子でバックアップを行います。 [-n] 出力コマンドのみ出力します。 [-l (文字数)] lコマンドの出力行を折り返す長さを指定します。 [-r] 拡張正規表現 を利用する時に使用します。(Eと同じ) アドレス 特定の行だけを処理したい場合は、コマンドの前に処理対象の位置を指定します。 これをアドレスといいます。アドレスは数字と「$」、 正規表現 が使用できます。 アドレスの後に「!」を付けると、アドレスで指定した意外という意味になります。 アドレス 説明 [数字] 行番号として認識されます。 [$] 最終行として認識されます。 [/ 正規表現 /] 正規表現 にマッチした行をコマンド処理します。 [開始行,終了行] 開始行から終了行を指定できます。 [開始行˜数字] 開始行から処理を開始して、数字で指定した間隔を処理の対象行とします。「10˜4」とした場合は10行目、14行目、18行目と4行間隔になります。 [アドレス,+数字] アドレスで指定した行の次から数字で指定した行を対象行として処理します。「/ 正規表現 /,+4」 正規表現 にマッチする行から4行分が処理対象となります。 基本的な使い方 ここでは sed コマンドの使い方を説明します。 コマンド、オプション、アドレスを組み合わせることで以下のテキスト編集が出来ます。 sample.txtというファイルを sed コマンドで編集するという想定で説明します。 条件に一致した行で最初の箇所を置換する 小文字のrakusを大文字のRAKUSに置換します。 sed -e ' s/rakus/RAKUS/ ' sample.txt #例:sample.txt 1.rakus rakus 2.rakus # 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。 # 1行目の2つ目の「rakus」は変換されません。 1.RAKUS rakus 2.RAKUS 条件に一致する全ての箇所を置換する gを付けることで条件に一致する全て箇所の「rakus」を「RAKUS」に置換します。 sed -e ' s/rakus/RAKUS/g ' sample.txt #例:sample.txt 1.rakus rakus 2.rakus # 上記のsample.txtのファイルに対して、実行した場合下記のような結果を取得できます。 # 条件に一致する全て箇所の「rakus」が変換されます。 1.RAKUS RAKUS 2.RAKUS 空白(半角スペース)をタブに置換 編集したいファイルの空白(半角スペース)をすべて削除します。 「\t」は 正規表現 です。 sed -i " s/ / \t /g " sample.txt 空白(半角スペース)を削除 編集したいファイルの空白(半角スペース)をすべて削除します。 sed -i " s/ //g " sample.txt 空白行を削除 正規表現 の「^$」と削除コマンドの「d」使用します。 sed -i ' /^$/d ' sample.txt 連続するスペースまたはタブをスペースに全て置換 sed -E ' s/[\t ]+/ /g ' アドレスを指定して、指定行を削除 5行目を指定して削除します。 sed -e 5d 正規表現 にマッチする行のみ出力 sed -n -e /正規表現/p 行番号で範囲を指定して抽出 1行目から5行目を範囲指定しています。 sed -n -e 1 ,5p sample.txt 行番号で範囲を指定して削除 1行目から5行目を範囲指定しています。 sed -e ' 1,5d ' sample.txt 編集するファイルの指定方法 ファイル編集の方法は以下の3つあります。 # 指定した入力ファイルを直接編集します。 sed -i " s/ //g " sample.txt # 入力ファイルを直接編集しないで、編集結果を別ファイルとして出力します。 # 入力ファイル名を「対象ファイル名 > 出力ファイル名」と指定します。 sed -e " s/ //g " sample.txt > sample_2.txt # 実行結果 sample.txt #こちらのファイルは編集されません。 sample2.txt #コマンド実行を指定したファイル名で作成します。 # バックアップファイルを作成して、指定したファイルを編集する。 # オプションの「-i」 の後ろに「.bak」を付けると、拡張子が「.bak」のバックアップファイルを作成してくれます。 sed -i .bak " s/ //g " sample.txt # 実行結果 sample.txt #こちらのファイルを編集します。 sample.txt.bak #編集前のファイルのバックアップを作成します。 応用編 この応用編では sed コマンドを他のコマンドと組み合わせて使用する方法を説明します。 他のコマンドを組み合わせることで、多様なテキストファイルの編集を行うことが出来ます。 ファイルを参照するcatコマンドを使用して、文字列を置換した部分の行のみ出力する cat sample.properties | sed -n s/rakus/Rakus/p ファイルや ディレクト リを検索するfind コマンドを組み合わせて、一致する条件に一致するファイルの envファイルの5行目に記述されている「 http://localhost 」を「 http://localhost:8080 」に変更する find ./ -type f -name *.env | xargs sed -i -e ' 5s|http://localhost|http://localhost:8080| ' 置換したあとに、キーでソートする 「|」をタブに置換しています。 その後にsortコマンドで行をソートしています。 「 > sample_2. csv 」とすることで、元ファイルを編集せずに結果を「sample_2. csv 」として出力しています。 sed -e " s/|/ \t /g " sample_1.csv | sort -t $' \t ' -k 1 > sample_2.csv Linux コマンド おすすめ書籍 [改訂第3版]Linuxコマンドポケットリファレンス Linux 操作に必要なコマンドを収録したポケットリファレンス LinuxコマンドABCリファレンス 開発現場で使用されるコマンドを厳選し収録したコマンドリファレンス sed & awkプログラミング 改訂版 sed と awk に焦点を当てた解説書で基本動作から スクリプト の書き方までを丁寧に解説 正規表現 についての解説も充実している sed コマンド まとめ 今回は sed コマンドについて使い方をまとめました。 アドレス、コマンド、オプションと覚えることは複数あり大変ですが、テキストファイルの編集作業をやる時は手作業で1ファイルずつやるより、 sed コマンドを使用した方が正確性が上がるので、機会があれば試してください。 他のコマンドと組み合わせることで、テキストファイルの編集、指定したキーでのソート、ファイルの結合などができるようになります。 これらの一連のコマンドを シェルスクリプト にすれば、さらに利便性が上がると思います。 手作業でファイル編集をやるには、少し大変と思った時には sed コマンドでの編集を検討してみてください。 Linux コマンドの一つ、 awk コマンドについて以下の記事でまとめられているので、ぜひ参照してください。 初心者のためのawkコマンド - RAKUS Developers Blog | ラクス エンジニアブログ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 https://rakus.hubspotpagebuilder.com/visit_engineer/ rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
目次 はじめに AWSとは AWSの主要サービス 環境準備 Webサーバーの構築 動作確認 終わりに はじめに 初めましてこんにちは!新卒1年目のkirrksです。今回は、一度は耳にしたことがある クラウド サービス「 AWS 」に フォーカスし、Webサーバーの構築を通して AWS の主要サービスはそれぞれどのような使い方をするのかをざっく りと学べる内容となっております。 「 AWS ってどんなのも?」「 AWS を利用してサーバ構築をしてみたい」 という 方々のお力になれればと思います。今回は初めて AWS に触れる方向けの内容となっておりますので、「Webサーバ ーの構築方法を知りたい!」という方は目次から飛んでいただければと思います。 AWS とは AWS ( Amazon Web Services )とは クラウドコンピューティング サービスの一つです。 クラウドコンピューティング サービスを簡単に言えば、サーバーやネットワークなどをインターネット経由で貸してくれるサービスで、いつで もどこからでも始めることができます。 Amazon S3 や Amazon VPC という言葉を耳にしたことがあるのではないで しょうか?これらは AWS が提供しているサービスの名前です。 AWS ではさまざまなサービスを組みあわせることによって、あらゆるアプリケーションやインフラを実現することができます。また、バラバラの事業者からそれぞれ借りなければならなかったインフラを、一括で借りれること、OSやWebサーバー、データベースサーバーなどに必要なソフトウェアまで丸ごと手配することができます。 AWS の主要なサービについて ここでは AWS でよく使われる主要サービスについて、特徴や利用用途などを踏まえながら紹介していきます。 Amazon VPC Amazon VPC ( Amazon Virtual Private Cloud)とは、 AWS の提供する AWS アカウント専用の仮想ネットワークです。ネット ワークやサブネットの範囲、ルートテーブルやネットワーク ゲートウェイ の設定など、仮想ネットワーキング環境を設定できます。 Amazon EC2 Amazon EC2 ( Amazon Clastic Compute Cloud)とは、 AWS 上でコンピューティング キャパシティー を提供するサービスです。 サーバに必要なものを一式で借りることができます。 Amazon S3 Amazon S3 ( Amazon Simple Storage Service)とは、 AWS 上でデータをオブジェクト単位で管理する形式のオブジェクトストレージ サービスです。大きな特徴としては、多機能であることです。誰でも簡単に利用できるようさまざまな機能が用意されています。 Amazon RDS Amazon RDS( Amazon Relational Database Service)とは、 AWS 上でリレーショナルデータベースである6種類の製品を、最適な動作条件で利用できるサービスです。具体的には Amazon Aurora 、 PostgreSQL 、 MySQL 、 MariaDB 、 Oracle Database、 SQL Server に対応しています。 Amazon Route53 Amazon Route53とは、 AWS 上の DNS ( ドメイン ネームサービス)です。 DNS とは Webブラウザ に入力したURLを「 IPアドレス 」変換する 仕組みです。これを名前解決といいます。 ELB ELB(Elastic Load Balancing)とは AWS が提供する ロードバランサー です。 ロードバランサー とは、サーバーに集中するアクセス( トラフィック ) を、複数のサーバやネットワークに振り分けるしくみです。1つのサーバにかかる負荷を分散させるので、負荷分散装置ともいいます。 CloudWatch CloudWatch( Amazon Cloud Watch )とは、 AWS 内部のリソースを監視するためのツールです。基本的に無料で利用することができます。 また、マネージドサービスとして動作しているため、CloudWatch自身を監視する必要はありません。 Billing and Cost Management Billing and Cost Managementとは、 AWS 料金見積ツールで、見積もりや予算に関連する機能を提供しています。 AWS のアカウントの作成や ログインは不要で、誰でも無料で利用することができます。 環境準備 では実際に AWS のサービスを利用してWebサーバーを構築するための準備を行っていきます。 AWS 登録 以下のリンクから AWS への登録をお願いします。 AWS にログインする際は、ルートユーザーではなく、IAMユーザでログインしましょう。 aws.amazon.com Webサーバーの構築 ではこれから AWS 上にWebサーバの構築を行っていきます。 手順としては以下のようになります。 仮想ネットワーク作成(AWS) VPC作成 サブネット作成 インターネットゲートウェイ作成 ルートテーブル作成 セキュリティグループ作成 Webサーバーを用意 (AWS) キーペア作成 EC2インスタンス作成 SSH接続 Apacheインストール HTMLファイル配置 ロードバランサーを用意(AWS) ターゲットグループ作成 ロードバランサー作成 独自ドメインとDNSを用意(AWS) ドメイン名取得 パブリックDNSにリソース追加 SSLサーバー証明書を発行 1. 仮想ネットワーク作成( AWS ) ここから AWS のリソースを作成していきます。 まず、インフラの管理者が自由に様々なサービスを構築できるよう AWS 上に仮想ネットワーク作成します。 1-1. VPC 作成 それでは、 AWS マネジメントコンソールから VPC を作成していきます。 まず、 AWS コンソール画面の左上にある「サービス」メニューから、 VPC ダッシュ ボードを開き、[ VPC を作成]をクリックします。 「 VPC 作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[ VPC を作成]をクリックします。 これで VPC が作成されました。 1-2. サブネット作成 今回は 冗長化 のために2つのwebサーバを AWS 上に構築予定なので、 アベイラビリティ ーゾーンとパブリックサブネットも2つ作成していきます。 作成するサブネットの情報は以下のようになっています。 パブリックサブネット1 VPC ID : VPCのID サブネット名 : web-test-subnet-public01 アベイラビリティーゾーン : ap-northeast-1a IPv4 CIDRブロック : 10.0.0.0/20 パブリックサブネット2 VPC ID : VPCのID サブネット名 : web-test-subnet-public02 アベイラビリティーゾーン : ap-northeast-1c IPv4 CIDRブロック : 10.0.16.0/20 それでは、 AWS マネジメントコンソールからサブネットを作成していきます。 VPC の ダッシュ ボードから「サブネット」を開き、[サブネットを作成]をクリックします。 「サブネット作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[サブネットを作成]をクリックします。 これでパブリックサブネット1が作成されました。 同じ手順でパブリックサブネット2の作成も行ってください。 2つのサブネットが作成されているのを確認します。 1-3. インターネット ゲートウェイ 作成 ここではインターネットと VPC 内のリソースが相互に通信するために、インターネット ゲートウェイ を作成します。 それでは、 AWS マネジメントコンソールから AWS 上にインターネット ゲートウェイ を作成していきます。 VPC の ダッシュ ボードから「インターネット ゲートウェイ 」を開き、[インターネット ゲートウェイ の作成]をクリックします。 「インターネット ゲートウェイ 作成」画面が表示されるので、以下のように入力します。 入力/選択が終わったら、一番下の[インターネット ゲートウェイ を作成]をクリックします。 これでインターネット ゲートウェイ が作成されました。 次に作成したインターネット ゲートウェイ を VPC にアタッチします。 作成したインターネット ゲートウェイ の右側にある「アクション▼」から「 VPC にアタッチ」を選択します。 次にアタッチする VPC を選択します。 選択が終わったら、[インターネット ゲートウェイ のアタッチ]をクリックします。 これでインターネット ゲートウェイ が VPC にアタッチされました。 1-4. ルートテーブル作成 ここでは AWS 上のサブネット間通信経路を設定するために、ルートテーブルを作成します。 作成するパブリックサブネット用ルートテーブルの情報は以下のようになっています。 名前タグ : web-test-rt-public VPC : 先ほど作成したもの それでは、 AWS マネジメントコンソールからルートテーブルを作成していきます。 VPC の ダッシュ ボードから「ルートテーブル」を開き、[ルートテーブルを作成]をクリックします。 以下のように設定が終わったら、[作成]をクリックします。 これでパブリックサブネット用ルートテーブルが作成されました。 次にルートテーブルの設定を行います。 作成したルートテーブルにチェックをし、「ルート」タブを選択して[ルートの編集]をクリックします。 「ルートの編集」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[変更の保存]をクリックします。 次にルートテーブルが属するサブネットを指定します。 「サブネットの関連付け」タブを選択して、「サブネットの関連付けの編集」をクリックします。 以下のように関連付けるサブネットにチェックを入れたら、[保存]をクリックします。 これでパブリックサブネット用ルートテーブルが完成しました。 1-5. セキュリティグループ作成 ここでは外部からのアクセスに制限をつけるために、 AWS 上にセキュリティグループを作成します。 作成するセキュリティグループの情報は以下のようになっています。 セキュリティグループ名 : wet-test-sg-elb 説明 : for load balancer VPC : 先ほど作成したVPC インバウンドルール : (タイプ)HTTP (ソース)0.0.0.0/0 (タイプ)HTTPS (ソース)0.0.0.0/0 (タイプ)SSH (ソース)マイIP それでは、 AWS マネジメントコンソールからセキュリティグループを作成していきます。 VPC の ダッシュ ボードから「セキュリティグループ」を開き、[セキュリティグループを作成]をクリックします。 「セキュリティグループ作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[セキュリティグループを作成]をクリックします。 これでセキュリティグループが作成されました。 以上で仮想ネットワーク作成が完了しました。 2. Webサーバーを用意 ( AWS ) ここではブラウザからリク エス トを受けて、Webページを返すために AWS 上にWebサーバを作成します。 2-1. キーペア作成 まず、 SSH 接続を行うときに必要となるキーペアの作成をします。 それでは、 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「キーペア」の画面を開き、[キーペアを作成]をクリックします。 「キーペア作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[キーペアを作成]をクリックします。 これでキーペアが作成されました。そのときキーペアがタウンロードされているのを確認してください。 2-2. EC2 インスタンス 作成 次に、 AWS マネジメントコンソールからEC2( インスタンス )を作成していきます。 まず、 AWS コンソール画面の左上にあるサービスメニューから、EC2の ダッシュ ボードを開きます。 そこから「 インスタンス を起動」をクリックします。 「ステップ1: Amazon マシンイメージ(AMI)」という画面が表示されます。 ここでは「 Amazon Linux 2 AMI (HVM), SSD Volume Type」を選択します。 「ステップ2: インスタンス タイプの選択」という画面が表示されます。 今回は無料枠対象の「t2.micro」を選択し、[次のステップ]をクリックします。 「ステップ3: インスタンス の詳細の設定」という画面が表示されます。 以下のように入力/選択します。 ネットワークでは先ほど VPC 作成時に一緒に作成したものを選択してください。 自動割り当てパブリックIPも有効に変更してください。 その他の設定に関しては、今回は変更せず、[次のステップ]をクリックします。 「ステップ4:ストレージの追加」という画面が表示されます。 今回はデフォルトのままで問題ないので、[次のステップ]をクリックします。 「ステップ5:タグの追加」という画面が表示されます。 「タグの追加」をし、[次のステップ]をクリックします。 「ステップ6:セキュリティグループの設定」という画面が表示されます。 [既存のセキュリティグループ]を選択し、先ほど作成したセキュリティグループにチェックを入れ、[確認と作成]をクリックします。 「ステップ7: インスタンス 作成の確認」という画面が表示されます。 内容に誤りがないことを確認後、[起動]をクリックします。 SSH 接続の際に使用する、キー選択画面が表示されます。 先ほど作成したキーペアを選択/チェックし、[ インスタンス の作成]をクリックします。 これでWebサーバー用の インスタンス が AWS 上に作成されました。 Webサーバーは AWS 上に2つ作成するので、2つ目(web-test-02)も同じ手順で作成してください。 2-3. SSH 接続 ここではWebサーバ用 インスタンス に SSH 接続を行います。 今回はログインユーザ名を「ec2-user」とする必要があるので注意してください。(rootユーザではログインできません) また、ダウンロードしたキーペアを登録します。(キーがないとログインできません) 以下のように接続できれば成功です。 2-4. Apache インストール SSH 接続することができたので、ここではWebサーバに ミドルウェア 「 Apache 」をインストールしていきます。 まず、ユーザをrootに切り替えます。 #sudo su - ミドルウェア アップデートをして 脆弱性 の排除を行います。 # yum check-update # yum upgrade Apache をインストールします。 # yum install httpd Apache を 自動起動 する設定に変更しておきます。 enabledになっていれば 自動起動 設定になっています。 # systemctl enable httpd.service # systemctl list-unit-files | grep httpd.service Apache を起動してステータスを確認します。 Activeがactive(runing)になっていれば、起動しています。 # systemctl start httpd.service # systemctl status httpd.service 2-5. HTMLファイル配置 こちらのコマンドで最初に表示されるwebページのファイルを作成します。 # vi /var/www/html/index.html 簡単ではありますが、以下のようなHTMLを記載します。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="description" content=""> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>DNS TEST</title> </head> <body> <h1>Successful Access!</h1> </body> </html> これでHTMLの作成・配置が完了しました。 3. ロードバランサー を用意( AWS ) ここではWebサーバに対するリク エス トの分散と SSL 処理を実現するために AWS 上に ロードバランサー を作成します。 3-1. ターゲットグループ作成 まず、 AWS 上で ロードバランサー からWebサーバにアクセスするときに関係する設定を行うターゲットグループの作成をします。 それでは、 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「ターゲットグループ」の画面を開き、[Create target group]をクリックします。 「ターゲットグループ作成」画面が表示されるので、以下のように入力/選択します。 入力/選択が終わったら、一番下の[Next]をクリックします。 「ターゲット登録」画面が表示されるので、作成したEC2にチェックをいれ、「Include as pending below」をクリックします。 すると、登録済みターゲットに インスタンス が追加されます。 (先ほど作成した2つ目の インスタンス も追加してください) 正しく追加したら、[Create target group]をクリックします。 これでターゲットグループが作成されました。 3-2. ロードバランサー 作成 ターゲットグループが作成できたので、 ロードバランサー の作成をします。 EC2の ダッシュ ボードから「 ロードバランサー 」を開き、[ ロードバランサー の作成]をクリックします。 ロードバランサー の種類選択画面が表示されます。 ここではHTTP/ HTTPS 通信に特化した ロードバランサー を選択するために、Application Load Balancer の[Create]をクリックします。 「 ロードバランサー 作成」画面が表示されるので、以下のように入力/選択します。 サブネットには先ほど作成した2つを選択します。 セキュリティグループには先ほど作成したものを追加します。 ターゲットグループには先ほど作成したものを選択します。 概要が間違っていなければ、[Create load balancer]をクリックします。 これで ロードバランサー が作成されました。 4. 独自ドメイン と DNS を用意( AWS ) ここでは AWS 上で IPアドレス を人間にわかりやすい表現にした ドメイン 名の作成、暗号化された通信( HTTPS )を行うための SSL証明書 を発行していきます。 4- 1. ドメイン 名取得 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、Route53の ダッシュ ボードを開きます。 そこから「登録 ドメイン 」の画面を開き、[ ドメイン の登録]をクリックします。 次に ドメイン 名を選択します。 AWS で ドメイン 名を選択するときは、固有の名称+ トップレベルドメイン ( TLD )という組み合わせになります。 今回は以下のような ドメイン を取得します。 チェックをクリックし、指定した ドメイン が取得可能であれば、[カートに入れる]をクリックし、最後に[続行]をクリックします。 次に、 ドメイン の連絡先を登録します。 「プライバシーの保護」を有効化することによって、本来公開される連絡先の情報を非公開にできるので、忘れないようにしてください。 入力に誤りがないことを確認後、[続行]をクリックします。 初めて AWS で ドメイン を取得する場合、以下のダイアログが表示されることがあるので、[同意します]をクリックします。 最後に連絡先の詳細の確認画面が表示されるので、以下のように設定後、[注文を完了]をクリックします。 ドメイン の取得が完了するまでは、注文した ドメイン はRoute53の ダッシュ ボードの「保留中のリク エス ト」で確認できます。 購入手続きが完了すると、Route53の ダッシュ ボードの「登録済み ドメイン 」で確認できます。 4-2. パブリック DNS にリソース追加 Route53経由で ドメイン を取得すると、自動的に取得した ドメイン を管理するパブリック DNS が作成されます。 ここではパブリック DNS に、外部から直接アクセスされるリソース情報( ロードバランサー )を追加します。 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、Route53の ダッシュ ボードを開きます。 そこから「ホストゾーン」の画面を開き、 ドメイン の選択後、[詳細を表示]をクリックします。 「ホストゾーン」の詳細画面が表示されるので、[レコードを作成]をクリックします。 まず、追加するルーティングポリシーを以下のように選択し、[次へ]をクリックします。 次にレコード設定画面が表示されるので、[シンプルなレコードを定義]をクリックします。 「シンプルなレコードを定義」という画面が表示されるので、以下のように入力します。 ここでは先ほど作成した ロードバランサー を選択しています。 設定が終わったので、[レコードを作成]をクリックします。 これで ロードバランサー の情報をパブリック DNS に追加できました。 4- 3. SSLサーバー証明書 を発行 最後に SSL証明書 を発行します。 それでは AWS マネジメントコンソール画面の左上にある「サービス」メニューから、 AWS Certificate Managerの ダッシュ ボードを開きます。 そこから「証明書のプロビジョニング」の[今すぐ始める]をクリックします。 次に取得する SSLサーバー証明書 の種類を選択します。 ここではインターネットで公開する ドメイン のため、「パブリック証明書のリク エス ト」をチェックし、[証明書のリク エス ト]をクリックします。 次に、証明書で証明する ドメイン 名を指定します。ここで注意することとして、証明する ドメイン は、実際にブラウザで入力する ドメイン ( FQDN )です。 先ほどホストゾーンに登録した ロードバランサー の名前を追加し、[次へ]をクリックします。 次に ドメイン の検証方法を指定します。 これは AWS がどのように ドメイン の申請者を検証するかということです。 今回はRoute53を使って DNS サーバを作成しているので、「 DNS の検証」を選択して[次へ]をクリックします。 タグは、追加する必要がないので、そのまま[確認]をクリックします。 最後に入力の確認を行い、誤りがなければ[確定とリク エス ト]をクリックします。 「 DNS の検証」を選択したので、具体的な検証方法が表示されます。 Route53の場合は「Route53でのレコードの作成」が用意されているので、こちらをクリックします。 Route53に対する設定内容がダイアログで表示されるので、問題がなければ[作成]をクリックします。 これで SSL証明書 の申請が終了しました。しばらくは「状況」欄に「検証中」と表示されますが、約5~10分で「発行済み」なります。 次に AWS 上で発行した SSLサーバー証明書 を使って、 HTTPS で待ち受けをするリスナーを ロードバランサー に追加します。 AWS マネジメントコンソール画面の左上にある「サービス」メニューから、EC2 ダッシュ ボードを開きます。 そこから「 ロードバランサー 」の画面を開き、先ほど作成した ロードバランサー を選択します。 そして「リスナー」タブを選択し、[リスナーの追加]をクリックします。 次にリスナーの設定を以下のようにします。 すべての設定が終わったら、[リスナーの追加]をクリックします。 これでリスナーの追加が完了しました。 動作確認 最後にwebページが正常に表示されるか確認します。 URL入力欄に「 https ://{作成した FQDN }」を入力します。 無事表示されました! 終わりに 長くなりましたが、簡単に AWS 上でWebサーバの構築・Webページの公開ができたのではないでしょうか。 今回はシンプルに AWS でwebサーバを作成しましたが、 ・プライベートサブネット ・NAT ゲートウェイ ・踏み台サーバー ・RDS ・S3 など、よりセキュリ ティー を高めたり、拡張したりすることも AWS ではできます。 AWS では他にも様々なことが出来るので、興味がある方はぜひ挑戦してみてください。 参考文献 中垣健志(2021)「 AWS ではじめるインフラ構築入門」 翔泳社 小笠原種高(2021)「 AWS のしくみと技術がしっくりわかる教科書」技術評論家者 エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター
皆さん、初めまして、 ラク スでインフラを担当している鈴木(y-suzukikun)と申します。 突然ですが、現在私が担当しているサービスでは、多くの物理サーバを利用しており 今回ご紹介する、 RAID (レイド) により有事の際の耐障害性、システムの信頼性向上を高めています。 既にご存じの方も多い技術かと思いますが、簡単な記事にまとめましたので最後までお読みいただけましたら幸いです。 目次 目次 1.「RAID(レイド)」とは? 2. RAIDの意味 3. RAIDの主な目的など 4.「RAID(レイド)の種類」について 5. 「各RAID(レイド)」仕組みについて 5-1.「RAID0(レイドゼロ)」について 5-2. RAID1(レイドワン) 5-3. RAID2(レイドツー) 5-4. RAID3(レイドスリー) 5-5. RAID4(レイドフォー) 5-6. RAID5(レイドファイブ) 5-7. RAID6(レイドシックス) 5-8. RAID10(レイドイチゼロ) 6. RAID構築時の注意点 7. まとめ 1.「 RAID (レイド)」とは? RAID は(大まかに説明すると)図のように複数のHDD(ハードディスク)を一つのドライブのように認識させるものになります。 RAID のイメージ図 2. RAID の意味 RAID はRedundant Array of Independent Diskの略号となります。 正確には複数のディスクにデータを分散し冗長性デ-タを付加して格納し、ディスク障害のときにユーザデータの再生を可能とするディスクアレイの事を指します。1987年 カリフォルニア大学バークレイ校において論文化されました。(デビット.A.パターソン、ガース ギブソン 、ランディカッツ教授にて) 論文は「A Case for Redundant Arrays of Inexpensive Disks」となります。 Google 検索で確認できますのでご興味のある方は調べてみてください。 3. RAID の主な目的など HDD(ハードディスク)障害時のデータ復旧(信頼性の向上) 複数のHDD(ハードディスク)への分散書込みによる書込・読込の高速化 などなど。※ RAID の種類、目的や構成によって若干異なります。 4.「 RAID (レイド)の種類」について RAID には目的別に機能の異なる「モード」が存在します。 RAID0(ストライピング) RAID1( ミラーリング ) RAID2(ストライピング・ハミングコード) RAID3(ストライピング・ パリティ コード) RAID4(独立R/Wアクセス・ パリティ ディスク固定) RAID5(独立R/Wアクセス・ パリティ ディスク分散) RAID6(独立R/Wアクセス・ パリティ ディスク分散(2台)) RAID10(1+0)( ミラーリング +ストライピング) 5. 「各 RAID (レイド)」仕組みについて 5-1.「RAID0(レイドゼロ)」について RAID0(レイドゼロ)は、データを複数のHDDにある程度まとまった形(ブロック単位)に分割して配置する事で読み込み/書込み速度を向上させる技術です。(データの取り出し、保存のイメージは図のとおりです。) 例えば、データAはHDD1、データBはHDD2のようにデータを同時に複数のHDDに書込み可能な為、HDDが単体1台構成の時よりも高速に動作する事が出来ます。このため、データ使用効率は他 RAID の中で最も良くなります。 しかし、耐障害性(冗長性)が無いため、1台のHDDが故障してしまうと、故障したHDDに保存してあるデータが失われます。 また、RAID0は一般的にストライピングとも呼ばれます。 RAID0_before RAID0_after 5-2. RAID1(レイドワン) RAID1(レイドワン)は、同じデータを複数のHDDに格納する技術です。(データの取り出し、保存のイメージは図のとおりです。) 図のようにAからFまでのデータがある場合、HDD1に格納したデータと同じものをHDD2にも格納します。 この為、もしHDD1が故障しても、HDD2に同じデータが残るため片方のHDDに障害が発生してもデータが保たれます。 しかし、RAID0のような分散型書込みではない為、書き込み読込みに対する動作は高速ではありません。 RAID1は ミラーリング とも呼ばれ、最低2台のHDDから構成する事が可能です。 RAID1_before RAID1_after 5-3. RAID2(レイドツー) RAID2(レイドツー)は、データの分散格納と誤り補正(ハミングコード)を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) データとは別にハミングコードという情報を別のHDDに格納し信頼性を保ちます。 図のように最低5台のHDDから構成可能です。 RAID2ではデータの格納されているHDD1が故障しても、HDD3からHDD5にハミングコードが残る為、データの復旧が可能となります。データ格納用2台のHDDに対して、最低3台のハミングコード用のHDDが必要になるためコストが掛かります。このため、実際の運用ではあまり使われていないのが現状です。 RAID2_before RAID2_after 5-4. RAID3(レイドスリー) RAID3(レイドスリー)は、データの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID3は最低3台(データ用2台、 パリティ 用1台)のHDDがあれば構成可能です。 データはビット(bit)又はバイト(byte)単位で分割してHDDに書込み、 パリティ は別のHDDに格納する事でデータ復旧を可能としています。 RAID2では、誤り補正の為に3台のHDDが必要でしたが、RAID3の場合は、 パリティ を使う場合は1台のHDDで済みます。 RAID3_before RAID3_after 5-5. RAID4(レイドフォー) RAID4(レイドフォー)も、RAID3と同じくデータの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID4も、RAID3と同じく、最小3台(データ用2台、 パリティ 用1台)のHDDがあれば構成可能です。 RAID3と異なり、RAID4はデータはブロック単位に分割する事でより効率よくなるように設計されています。 RAID4は、読み出しは高速になりますが、書き込みは パリティ 用HDDにアクセスが集中するため遅くなります。 RAID4_before RAID4_after 5-6. RAID5(レイドファイブ) RAID5(レイドファイブ)も、RAID3と同じくデータの分散格納と誤り補正( パリティ )を組み合わせてデータの信頼性を保つ技術です。(データの取り出し、保存のイメージは図のとおりです。) RAID5は最低3台のHDDから構成する事が可能で、図の構成の場合、HDD1台の故障まで耐えることが可能となります。 RAID5はRAID4と同じように パリティ を使用しますが、データを複数組み合わせて パリティ を作成し、複数のHDDに分散させることで、データの信頼性を保ちます。また、RAID4で固定していた パリティ をブロック単位にすることで、 パリティ 用HDDへのアクセス集中を防ぎRAID4よりパフォーマンスを向上させています。 RAID5_before RAID5_after 5-7. RAID6(レイドシックス) RAID6(レイドシックス)は、 パリティ (誤り訂正)について、二重書き込みを行うことで、耐障害性をRAID5より大幅に高めた構成となっています。(データの取り出し、保存のイメージは図のとおりです。) 動作上の仕様はRAID5とほぼ同じになります。RAID6は最小4台のHDDから構成する事が可能で、図の構成の場合、同時にHDD2台の故障まで耐えることが可能です。 RAID6_before RAID6_after 5-8. RAID10(レイドイチゼロ) RAID10はRAID1「 ミラーリング 」の構成をさらにRAID0「ストライピング」で掛け合わせた構成となります。(データの取り出し、保存のイメージは図のとおりです。) 高速化を実現するRAID0と、耐障害性のあるRAID1を組み合わせることで高速化で耐障害性を高めています。 RAID10は最低4台のHDDから構成する事が可能で、RAID1同様に利用可能容量は総ハードディスク容量の半分となります。図の構成の場合、HDD1台の故障まで耐えることが可能となります。 RAID10とは逆のRAID01と言うものもありますが、今回は割愛します。 RAID10_before RAID10_after 6. RAID 構築時の注意点 RAID 構築時の注意点として一般的なものは下記になります。構築時の参考にして頂けると幸いです。 RAID コントローラが構築したい RAID 対応しているか。 HDDの容量、速度が同じか。(原則として速度、容量は合わせた方がベター) RAID のパフォーマンスは遅いHDDに引っ張られる。 7. まとめ 最後に簡単ですが、各 RAID の特徴をまとめると次のようになります。 RAID2からRAID4は、世の中に広く普及はしていない為、 RAID を使用する際はRAID2からRAID4以外をご利用される事をお勧めいたします。 RAID0 RAID1 RAID2 RAID3 RAID4 RAID5 RAID6 RAID10 耐障害性 なし ◎ ◎ 〇 〇 〇 ◎ 〇 初期導入コスト 小 中 大 中 中 中 大 大 HDD性能 読込み ◎ 〇 × 〇 〇 ◎ ◎ ◎ 書込み ◎ 〇 × 〇 △ △ △ 〇 必要なディスク台数 2台以上 2台以上 5台以上 3台以上 3台以上 3台以上 4台以上 4台以上 ディスク容量の利用効率 (n:ディスク台数) 100% 50% (n-2)/n% (n-1)/n% (n-1)/n% (n-1)/n% (n-2)/n% 50% 許容される障害台数 (n:ディスク台数) なし 1 2 1 1 1 2 2 ※同一セットのHDDが故障しない場合 最後までお読みいただきありがとうございました! エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 forms.gle イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com
アバター
Photo by Renée French Go言語入門 こんにちは rsrks です。 今回は最近エンジニアの中で人気が高まってきているGo言語についての入門記事になります。 Go言語は2009年に Google が開発した言語で、構文などは C言語 の特徴を継承しています。 文法がシンプルなため比較的コードが書きやすく学習しやすいことや、実行速度が早く大規模なシステムや大量のデータを扱うことが求められるIT業界の現状にマッチした言語になっているため人気が高いです。 この記事ではGo言語の特徴について説明した後に、 Go言語プログラミングにおける基礎 と、 Windows を用いた環境構築とコーディング を行っていきます。 Go言語入門 Go言語の特徴 基本的な構文 環境構築 コーディング (HelloWorld の出力) 最後に Go言語の特徴 文法がシンプル 静的型付け言語 堅牢なプログラムが作成できる ガベージコレクション による自動的なメモリ管理 メモリ安全性を持っている 高速な処理が得意 コンパイル 言語なため実行速度が高速 並列処理 gouroutine: スレッド channnel: 関数間での値の送受信 以上の2つを用いることで並列処理が実現できる 基本的な構文 次に、Go言語の基本的な構文と特徴について見ていきましょう。 変数宣言 まずはGo言語における変数宣言についてです。 Go言語は静的型付け言語であるため、全ての変数が何らかの型を持っています。 そのため型関係の誤りなどは コンパイル 時に検出することができ、堅牢なシステムの構築につながっています。 基本的な宣言は以下のように行います。 // variablename: 変数名 // tyte: 変数の型 var variableName type では変数宣言の種類について見ていきましょう。 // hoge という変数名を定義. // 変数の型は int var hoge int // 定義と同時に初期化 var hoge int = 1 ; // 複数の変数を定義 // 型は全て共通 var hoge, fuga int // 定義と同時に初期化(多重代入) // 変数ごとの値を初期化する var hoge, fuga int = 1 , 2 ; ちなみに宣言では以下のような省略記法も存在します。 // := が var と type の役割を担う // 変数の型はコンパイル時に決定される hoge := 1 これは非常に便利な書き方なので使いたいシーンは多いと思います。 一方で、この書き方は関数の外で使用するとエラーが出るためそこだけは注意が必要です。 グローバル変数 を宣言する際は必ず var を付けるようにしましょう。 ※基本データ型 以下に変数宣言に用いる型の中から、基本データ型の型名と取りうる範囲を表にまとめました。 おおむね他の言語と同じ型が存在します。 論理値型 型 取りうる値 bool true, false 数値型 符号付整数型: int 符号なし整数型: unit 型 取りうる値 int8 -128 ~ 127 int16 -32768 ~ 32767 int32 -2147483648 ~ 2147483647 int64 -9223372036854775808 ~ 9223372036854775807 int 32bit または 64bit (環境依存) unit8 0 ~ 255 unit16 0 ~ 65535 unit32 0 ~ 4294967295 unit64 0 ~ 18446744073709551615 unit 32bit または 64bit (環境依存) 浮動小数 点型 型 取りうる値 float32 32ビット 浮動小数 点 float64 64ビット 浮動小数 点 ※ double型は存在しない。 float64 がdouble型と同じ倍精度 浮動小数点数 にあたる 文字列型 型 取りうる値 string 文字列 制御文 (if, for) では次にif, forによる制御文の記述の仕方を説明します。 これらはプログラミングにおいて非常に重要な概念なのでしっかり覚える必要があります。 まずはif文の基本的な書き方を見ていきましょう。 // if, else if, else を用いる var hoge int = 10 if hoge < 0 { fmt.Println( "hogeは負の値です" ) } else if hoge < 10 { fmt.Println( "hogeは10未満です" ) } else { fmt.Println( "hogeは10以上です" ) } // ifの中にifを書くことも出来ます if hoge < 10 { fmt.Println( "hogeは10未満です" ) if hoge < 0 { fmt.Println( "hogeは負の値です" ) } } 次にGo言語の特徴的なif文の書き方を紹介します。 Go言語ではif文の中で変数を宣言し利用することが出来ます。 // hogeの値を取得して表示しています // なお、この変数はこのif文の中のみで有効なので注意 if hoge := getHoge(); hoge < 0 { fmt.Println( "hogeは負の値です" ) } else { fmt.Println( "hogeは正の値です" ) } ちなみに、比較 演算子 ・論理 演算子 には以下のようなものがあります。 ここは一般的な プログラミング言語 と同様です。 比較 演算子 意味 a == b aとbが等しい a != b aとbが等しくない a > b aがbよりも大きい a >= b aがb以上 論理 演算子 意味 a && b aとbが両方とも真のなら a || b aまたはbが真なら !a aが偽の場合に真 次にfor文によるループの記述について見ていきましょう。 なお、Go言語には C言語 や Java などに存在する while文は存在しません 。 なのでループの記述は全てforを使用します。 // for 初期値; 条件式; 変化式 for i := 0 ; i < 10 ; i++ { // 処理を記述 } // 変数宣言での多重代入を用いることで複数の宣言を使ったループが可能 for i, j := 0 , 1 ; i > 9 && j > 10 ; i, j = i+ 1 , j+ 1 { fmt.Printf( "i: %d, j: %d" , i, j) } continue や break を使ってループを制御することも可能です。 for i := 0 ; i < 10 ; i++ { // iが偶数の場合 if i % 2 == 0 { // ここでforの先頭に戻る continue } // 奇数のみ表示される fmt.Printf( "i: %d" , i) } for i := 0 ; i < 10 ; i++ { if i == 5 { // for文から出る break } } また、先ほどwhileは存在しないというお話をしましたが、プログラミングをしているとどうしてもwhile文のようなループを使いたい時がくるかもしれません。 その場合はforを以下のように記述することでwhile文のようなループを作成出来ます。 count := 0 for count < 10 { fmt.Printf( "count: %d" , count) count += 1 } 0123456789 最後に、for文を使う際に、配列の中身をループさせたいと思うときがあると思います。 そのような場合Go言語では以下のような記述を行います。 for i, str := range [] string { "one" , "two" , "three" } { fmt.Println( "%d個目: %d" , i, str) } one two three 関数 ここからは関数について見ていきましょう。 基本的な宣言は以下のように行います。 // funcの後に関数名を書く // 引数は () で指定を行う // 引数の後に戻り値の型を記述 func functionName(variableName type ) ( type ) { return output; } またGo言語では以下のように複数の戻り値を設定することができます。 これはGo言語の特徴的な性質の一つです。 あまり馴染みがないと思いますが、使いこなせば非常に便利な機能になっています。 // 以下のように複数の戻り値を設定することが出来ます。 func functionName(valiableName1 type1, valiableName2 type2) (type1, type2) { return output1, output2; } // 使用例 func calc(a int , b int ) ( int , int ) { return a+b, a-b; } func main() { var a int = 2 ; var b int = 3 ; add, minus := calc(a, b); fmt.Println( "add: %d" , add) fmt.Println( "minus: %d" , minus) } add: 5 minus: -1 また、戻り値が多くなった場合は以下のように戻り値を名前付きで設定することも可能です。 // 戻り値に名前を付けられます // また、引数、戻り値の型が同じなら (a, b int) のようにまとめて記述できます func calc(a, b int ) (add, minus, multi, div int ) { add = a+b minus = a-b multi = a*b div = a/b return } 構造体 次に構造体の話をしていきます。 Go言語には、いわゆる オブジェクト指向 のクラスというものが存在しません。 その代わりとして構造体というデータ型があり、複数の変数やメソッドを格納することが出来ます。 基本的な宣言は以下のように行います。 // このように変数を格納できます type structName struct { variableName1 type1 variableName2 type2 } // メソッドは以下のように定義します // func(レシーバ 型) 関数名() 戻り値の型 {処理} func (receiver structName) functionName() outputType { return variableName1; } メソッドの定義でレシーバを付けるというところに注意が必要です。 レシーバを付けないとただの関数になってしまうので忘れないようにしましょう。 使用例 type Animal struct { name string cry string } func (animal Animal) about() string { return name + "の鳴き声: " + cry } func main() { // 構造体の宣言 var dog Animal // 変数の初期化は全部で3通りあります // 特にこれを使うべきという決まりは無いので開発方針に合わせて使い分ければOK // 1. ドット(.)でのアクセス dog.name = "犬" dog.cry = "わんわん" // 2. {} で値を渡す dog := { "犬" , "わんわん" } // 3. コロン(:) で指定 // 引数名を指定するため分かりやすい dog = Animal{name: "犬" , cry: "わんわん" } // メソッドへのアクセスはドット(.)で行います fmt.Println(dog.about()) } 犬の鳴き声: わんわん 環境構築 ここからはGo言語で開発をするための環境構築を行っていこうと思います。 使用するOS: Windows 10 Go言語のインストール まずはGo言語の SDK をダウンロードして行きましょう。 ダウンロードページ から windows 用の SDK をダウンロードしていきます。 https://golang.org/dl/ 以下の画像の赤枠で囲った windows を選択してください。 Go言語ダウンロードページ ダウンロードが終了したらセットアップウィザードを起動しインストールを行っていきます。 ここから環境構築を対話的に行っていきますが、あまり選択することは無いのでサクサク進んでいきましょう。 セットアップウィザードの起動 Nextを押下 ライセンス確認 内容を確認し、問題がなければNextを押下 インストールフォルダ指定 特にこだわりが無ければ変更せずNextを押下 インストール開始 Installを押下。インストールには少し時間がかかります インストール終了 Finishを押下して、インストール終了 さてここまででインストールが終了しました。 インストールした段階で 環境変数 に GOPATH というインストールしたフォルダへのパスが追加されていると思います。 環境変数 を確認したい場合は コマンドプロンプト で go env というコマンドを入力することで一覧が確認できます。 では、Go言語がインストールされているか コマンドプロンプト で確認してみましょう。 インストールが成功していれば以下のように go version と入力することでGo言語のバージョンが出てきます。 Goインストール確認 コーディング (HelloWorldの出力) それでは最後に簡単なコーディングを行っていきましょう。 ここではプログラミングではおなじみの Hello World の出力を行っていきます。 任意のフォルダに以下のような内容でファイルを作成します。 main関数の中で文字列を出力しているだけなので上記の基本的な構文を見ていただいた方には簡単だと思います。 package main import "fmt" func main() { fmt.Printf( "Hello world" ) } ではこちらを実行していきましょう。 go run というコマンドを走らせることでGoプログラムの コンパイル と実行を行うことが出来ます。 以下のように出力されれば成功です。 実行結果 最後に いかがでしたでしょうか。 今回Go言語の基本的な構文を紹介しましたが、全てを紹介できたわけではありません。 Go言語を用いてアプリケーションを作ろうと思うとさらに広く深い知識が必要になってきます。 まずは、この記事でGo言語の学習のためのモチベーションにつながれば嬉しいです。 他にもGo言語には goroutine と channel を用いた並列処理などの強みがあるので、今後機会があれば書きたいと思います。 参考文献 Build Web Application Golang Go言語:文法基礎まとめ エンジニア 中途採用 サイト ラク スでは、エンジニア・デザイナーの 中途採用 を積極的に行っております! ご興味ありましたら是非ご確認をお願いします。 https://career-recruit.rakus.co.jp/career_engineer/ カジュアル面談お申込みフォーム どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。 以下フォームよりお申込みください。 rakus.hubspotpagebuilder.com ラク スDevelopers登録フォーム https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/ イベント情報 会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! ◆TECH PLAY techplay.jp ◆connpass rakus.connpass.com
アバター