テックブログWizは、最新のIoTやICTサービスをお客様に届ける「ITの総合商社」です。移行してみたインフラこんにちは、インフラエンジニアの赤倉です。昨年末にCentOS8のサポートが終了したばかりですが、CentOS7のサポート期限が2024年6月末に近づいてきています。CentOSの環境は弊社でよく使っているLaravel構成としました。5.7.37Laravelは初期インストール+認証設定まで完了した環境を用意しました。移行ツール今回の移行ではAlamaLinuxから提供されている「Elevate」を使います。手順は公式のクイックスタートガイドを参考にしています。Elevateは他にも下記ディストリビューションへの移行をサポートしています。8移行の流れ最新のCentOSアップデートをインストールして、再起動します。rebootelevate-releaseプロジェクトリポジトリとGPGキーを使用してパッケージをインストールします。http://repo.almalinux.org/elevate/elevate-release-latest-el7.noarch.rpmアップグレードするOSのleappパッケージと移行データをインストールします。leapp-data-almalinux下記のオプションに変更することにより、移行先のディストリビューションを選択できます。leapp-data-almalinuxleapp-data-centosleapp-data-oraclelinuxleapp-data-rockyアップグレード前のチェックを開始します。preupgradeここで移行要件を満たしていない場合は下記のエラーメッセージが出力されます。remediation.レポートファイル(/var/log/leapp/leapp-report.txt)を確認して修正対応します。弊社環境の場合、下記の通り対応しています。accountsshのrootログインを許可する。proceed.CentOS8で廃止されたカーネルモジュールを読み込まないようにする。remediation.公式ガイドに記載のあったコマンドを実行する。remove_pam_pkcs11_module_check.confirm=Trueもう一度アップグレードのチェックコマンドを実行してエラーがないことを確認します。preupgradeアップグレードを開始します。upgrade途中、パッケージ重複エラーでプロセスが終了することがあります。openssl11-libs-1:1.1.1k-2.el7.x86_64その場合は、対象のパッケージを削除して再度アップグレードを開始します。openssl-libs-*弊社環境では約5分でアップグレードが完了しました。その間もWebサービスは継続していました。アップグレード完了後、サーバを再起動します。reboot弊社環境では約15分で再起動が完了しました。AlmaLinuxにアップグレードされていることを確認します。Sphynx)移行後の問題なぜかphp-xmlのみ消えていたので、再度インストールしました。上記の問題を対応すれば、移行後の環境でもLaravelは正常に稼働していました。アップグレード前の問題を修正するのに時間がかかりましたが、思っていたより簡単に移行することができました。サーバの再起動に時間がかかるので実施の際はWebサービスの停止を予定しておく必要はありそうです。読者になるもっと読むコメントを書く2022-02-04継続は力なり!心理的安全性を高めるための取り組み社内活動こんにちは、フロントエンドエンジニアの柳田です。今までは、技術的なインプットが大半を占めていたのですが、半年前くらいから組織づくりについてのインプットを意識して行うようになりました。(技術的インプットが減ってきているので、がんばらないと...!)。最近読んでいる本で、心理的安全性の大切さを改めて感じたので、今回はその本の紹介と、弊社で行っている心理的安全性を高める取り組みをご紹介したいと思います。人を動かすビジネスパーソン必須の心理学』です。組織心理学とは組織のトラブルの原因を突き止め、うまくいっている集団に共通する「リーダーシップ」や「人間関係」を明らかにする学問だそうです。組織とは色んな能力のメンバーが集まっていて、個々のメンバーの能力を最大限に引き出すことはなかなか難しいことです。リモートワークになり、今まで当たり前だった働き方から大きく変わった今、それはより難しくなっています。この本には、組織をまとめるマネジャーの立場の人たちに、組織心理学の観点から組織のパフォーマンスを高めるためヒントが多く書かれてあります。心理的安全性が高いことで組織はどう変わる?この本の中では、心理的安全性とは下記の意味で展開されています。個人がリスクテイクしても大丈夫な職場だと信じているということよく、心理的安全性の意味を「組織のメンバーが仲良しであること」という内容と捉えがちですが、そうではありません。組織のメンバーが「失敗しても大丈夫!」「成功するか不安だけど、何かあったとしても助けてくれる!」と感じられるような環境であることが、本当の心理的安全性なのですね。職場が支援的であること学ぶ姿勢を持った個人や組織であることの3点が影響・関与しており、このような状況が充実した環境になることで、メンバーは「意見を言ってもいいんだ!」「失敗しても良いんだ!」と安心感が生まれ、組織のパフォーマンスの向上につながっていく、といった内容でした。この本を読んで、心理的安全性の大切さを再認識することはできましたが、心理的安全性を良くするための施策を実行しすぐに改善するということは、なかなか難しいものです。弊社には心理的安全性を高くするべく、様々な施策を企画・実行するチームがいるのです。Team】、略してWCTというチームが存在しています。このチームの前衛が、以前このテックブログでも紹介した【雑談会】を行っていた集まりになります。現在は、私を含めた5名で定期的に様々な施策を展開しています。今回は、WCTが定期的行っている施策を一部ご紹介します。Night4月・8月・12月の年3回開催している、クリエイティブチームの交流会になります。全員リモートワークなので、バーチャルオフィスを利用しての開催になります(クリエイティブチームでは普段からバーチャルオフィスを利用して業務を行っています)。多くのメンバーと話をできるように、時間を決めてメンバーをシャッフルしたり、ミニゲームなどを盛り込んで行っています。4月は、新年度で新入社員が入ってくる時期でもありますので、大々的に行います。ちなみに去年は、参加者みんなで同じ食事を食べながらの会でした。Creative毎日業務終了後にオープンする、コミュニケーションの場になります。普段のバーチャルオフィスとは異なる環境で、読書会やもくもく会、期間限定で他事業部も巻き込んで交流会など、雑談してもよし、勉強会してもよし、な自由なスペースとなっています。ウィンセッションウィンセッションは、エンジニアチームで現在試験開催中のものになります。ウィンセッションとは、メンバーのがんばったことを発表しあい、お互いに褒め合う会のことです。月に2回、金曜日の終業時間前に集まり、1週間で取り組んだことやがんばったことを振り返りながら、他メンバーに共有します。今後、クリエイティブチーム全体で開催することを目標としています。最後に皆さん、いかがでしたでしょうか?もちろん、WCTだけでなく各職種チームでも、心理的安全性を高めるための施策を行っています。このような施策は、一度行って終わりではなく、定期的に実行してこそ効果が出てくるものです。ありますが、組織のパフォーマンスを最大化すべく、組織全体で心理的安全性の向上に取り組んでいきたいと思っています。読者になるもっと読むコメントを書く2022-01-25【Laravel】L5-Swaggerを導入しつつBasic認証も設定するLaravelこんにちは、バックエンドエンジニアの中嶋です。昨今のプロダクト開発ではOpenAPIを用いたスキーマ駆動で行うことが多くなってきました。規模や目的によって何を導入すべきか、あるいはスプレッドシートやチャットでの共有で済ませてしまうかは検討が必要ですが、今回はその中の選択肢のひとつとして、LaravelプロジェクトへのL5-Swagger導入とBasic認証の設定について簡単に紹介したいと思います。APIの仕様を記述するフォーマット」で、SwaggerはSmartBear社が提供する「OpenAPIを便利に扱うためのツール」の一つです。Blogざっくり、要は「どんなURIのAPIがあってどんなリクエストとレスポンスなのかを定義したり共有できるもの」と言えましょう。今回紹介するL5-Swaggerは、Swaggerの機能をLaravelプロジェクトで使えるようにしたライブラリです。github.comLaravelのプロジェクトの中でスキーマを定義すれば「/api/documentation」にアクセスすることで以下のようなページが生成&表示でき、APIの実行例を示したりPostmanのように実際にリクエストを送信することもできます。L5-Swaggerの導入ComposerでインストールするLaravelプロジェクトにおいてComposerでインストールします。今回はLaravel8系を使用しています。"darkaonline/l5-swagger"JSONスキーマを作成するスキーマはPHPDocにアノーテーションで記述する方法とJSONファイルを直接記述する方法があります。提供されているサンプルの記法に倣ってController等のPHPDocにアノーテーションを記述していきます。l5-swagger:generateを実行することでSwaggerドキュメントが生成されます。ドキュメント生成については.envファイルに、L5_SWAGGER_GENERATE_ALWAYS=trueを記載すれば、ロードするたびに自動で実行してくれるように設定することもできます。Specificationの記法にて記述していきます。}}JSONで直接定義する場合は特にコマンド実行は不要です。スキーマはブラウザ版のSwaggerEdditerで編集・記述したり、エラーがないかの検証をすることができます。https://editor.swagger.io画面で表示してみるスキーマが作成できたら/api/documentationにアクセスします。プロジェクトにファイルが含まれているので、ローカル環境でも検証サーバーの環境でもアクセスできるのが確認できると思います。開発の初期段階で仮のレスポンスを返すControllerを定義してサーバーに置いておけば、フロントエンドと共有できるモックサーバーとしても使えそうですね。Basic認証を設定する作成したAPIドキュメントは便利に使えるのですが、このままでは世界中にSwaggerドキュメントを公開した状態になってしまうのでBasic認証を設定していきます。LaravelにおいてBasic認証を設定する方法としては、Laravel標準の「auth.basicミドルウェア」を用いる外部ライブラリを用いる独自ミドルウェアを作成するの3つになるかと思います。標準の「auth.basicミドルウェア」はDBを使用する形式であることとフレームワークのAuthライブラリに依存してしまうこと、またBasic認証のために他の外部ライブラリに依存したくないという考えから、今回は独自ミドルウェアを作成して設定していきます。適当な分かりやすい名称でミドルウェアを作成します。OriginalBasicAuthMiddlewareApp/Http/Meddleware配下にファイルが生成されるので、中身を実装していきます。今回の例では実行環境によってenvファイルに定義したユーザー名とパスワードを適用するように設定しています。}}kernel.phpに追記ミドルウェアが作成できたら、kernel.phpにも忘れずに追記して有効にしておきます。今回はルートミドルウェアとして設定します。最後に、適用させたいルートにミドルウェアを適用させます。これにはvendorのconfigファイルをpublishする必要があります。options」の項目に作成したミドルウェアを設定します。〜略〜アクセスしてみる認証を設定した環境においてブラウザアクセスしてみると、きちんとBasic認証を求められるように設定できました。あとはenvファイルに設定したユーザー名とパスワードを入力すればSwaggerドキュメントを表示することができます。まとめ今回はLaravelにおけるL5-Swaggerの導入とBasic認証の設定方法について紹介しました。スキーマの定義方法は、アノーテーションかJSONかymlファイルか、Stoplightを使うか等、日々議論していたりします。チームメンバーとも話し合いながらより良い開発手法を模索していきたいと思います。さいごに..Wizではみんなで良いものを楽しく作るべく、積極的にエンジニアを募集しております。バックエンドこんにちは、Wizプロダクト開発チームの米山です。今回はTDD(テスト駆動開発)の、主にテスト手法について書いてみようと思います。TDDは、弊社の開発手法にも取り入れており、通常のMVCモデルのソースコードの他、PHPUnitで動かすためのテストコードも作成しています。テストコードの書き方は人それぞれなのですが、私が約半年TDDを実践してみて「だいたいこんな感じで良いかな」というようなスタンダードモデルができてきたので紹介したいと思います。setUpBeforeClassとsetupは必ず作成するsetUpBeforeClassは全テストケースで最初に1度だけ、setUpはテストケース毎に動作するメソッドです。私の場合は、public/index.phpで行っている操作(例えば、定数「LARAVEL_START」の定義など)をsetUpBeforeClassで行い、setUpでテストケース実行前にDBクリアを行うなどをしています。$this->clearDB();}メソッド名にケース番号とケース内容を入れてわかりやすくするこの辺は個人のやり方で異なる部分ですが、私の場合は「テストケースがいくつあって、何番目のケースなのか」がわかるよう、テストケースメソッドにはケース番号と確認したいことを入れています。実際のテストコード}こんな感じです。こちらについては、別途「php-code-coverage」というライブラリも併用している関係で、あるコードはどのテストケースで通ったのかを視覚的に確認する時にも有効な手段です。テストデータはFactoryを有効活用するこの記事の執筆時点のLaravelバージョンは8.67なのですが、Laravel8系になってFactoryはクラスとして定義できるようになりました。各Modelクラスに「HasFactory」トレイトをuseすることで使用可能になります。値を自動生成するだけでなく、テストケースによって固定値を入れておきたいケースもあると思います。どちらでも対応できるよう、デフォルトの「definition」とは別にメソッドを作っておきます。}}こうしておけば、引数$attributesに入っているものは固定値を使うことができますし、直接テストには関係ないが、DB上必要な項目はランダムにfakerを使って値を生成できます。TestCaseとTestDataの責務を分けるLaravelのテスト、すなわちPHPUnitには「DataProvider」という機能があります。これを利用すると、テストケースメソッドの開始時にテストデータが入った状態(メソッドの引数にある状態)でテストが開始できます。私は敢えてこれを使わずにコードを書きます。理由はテストケースとテストデータ作成のコードを両方1つのクラスに書き込むことで、コードが肥大化しメンテナンスしづらくなるからです。テストケースにはテストケースだけを書いておく。データ作成は別のところでやる。私はこれをトレイトを使って実現しました。}}というコードにすることができます。「なんで便利な機能(DataProvider)があるのに使わないんだ?」とギモンを持つ方もいるかもしれません。コードを分けることは前述した通り、メンテナンスしやすくすることが目的ですが、トレイトにすることでいくつかのテストで共有して利用することが可能です。上の例では「ItemTestData」というトレイトを使い、テストデータを作成しますが、他のケースでもこの「ItemTestData」を利用したければuseすることで使用可能になります。テストケースごとにDataProviderを書く必要はありません。ここまでのまとめいかがだったでしょうか。テスト駆動開発といっても人によって、あるいは言語によって様々なスタイルがあると思いますが、今回はLaravel(PHPUnit)でのやり方を紹介しました。setUp系のメソッド(初期化処理)は必ず行うテストケースメソッド名はケース番号とやりたいことを書き、わかりやすくするデータ作成はFactory機能を使って柔軟に作成DataProviderではなくtraitを使ってテストデータを作成する1つできれば使いまわして量産することも可能です。参考になれば幸いです。Wizではエンジニアを募集しております。興味のある方、ぜひご覧下さい。ガジェットこんにちは!フロントエンドの松本です。現在、Wizで働くエンジニアチームは殆どが在宅勤務をしております。社内Slackの雑談チャンネルでは、ガジェットやリモート環境をシェアするチャンネルがあったりと、リモート環境のアップデートに力を入れているメンバーも少なくないです。第1弾として、エンジニアの皆様に推しキーボードを教えてもらいました。それではさっそくご紹介します。G512】DSKさん推しポイント光ってるwうるさ過ぎない推しじゃないポイント有線テンキーあり最後にこうやってズラッと並べると購買欲が上がってきてしまいます。打鍵感がいいとコードを書くのが楽しくなりそうですね。Wizではエンジニアを募集しております。Apacheこんにちは。バックエンドエンジニアの河内です。先日、Apacheのログデータの解析結果をレポートするタスクが入ってきました。われわれの業務の大半はプロダクト開発なのですが、その中には、実際に要件を策定しコードを書いていく純粋な開発タスクもあれば、その開発のための技術調査(スクラムであれば「スパイク」でしょうか)もあります。前者はなんとなく工数を把握したうえであとは実装していく...といった感じですが(それでもスケジュール管理は欠かせません)、後者は暗中模索でおこなわなければならないタフなタスクです。それとは別に、開発中の案件とは関係なく不具合などの調査が入ってくることがあるかと思います。なんとなくやることは見えていて、あとはどれだけ速くこなすか...といったタイムトライアル的なタスクです。今回のログデータ解析タスクもそんな分類になるのかな、と思っています。作業概観さて、ログを調べた結果、今回解析が必要なデータは以下の5行と導けました。*1IPアドレスなど、一部の情報は適当にマスクしてます。下記の内容をlogsというファイル名で保存します。Safari/537.36"前回、別のメンバーが同様の対応をおこなったときのフォーマットは以下のとおりだったそうなので、それに従います。iPhoneあとは文字列を拾って特定フォーマットに落とし込めばよいのですが...対象は複数行あります。目で追って手で拾う...というのは不正確ですし疲れるので避けたいです。いうタスクは一回やりおおせても、おかわりとして同じような作業依頼が再びやってくるのが常です。テキストは規則的に並んでいることですし、ちゃちゃっとコードを書くことにします。いうときに自分はrubyを使うことが多いです*2。作業ディレクトリの中は、以下のような感じに配備しました。logsは先ほどの5行のログが書かれたファイルで、処理をおこなうreport.rbがあり、処理後にレポート内容がREPORT.txtに吐き出されるようにします。REPORT.txt(report.rbにより生成される)コードを書いていくログをパースするそれでは、report.rbにコードを書いていきます。Apacheログのパーサーライブラリを使い、以下のように書きました。ログフォーマットは、Apacheのものをそのまま流用できるようです。出力確認endコードで一行目パースしたところで止めてますが、こんな感じで取得できます。されてる方がいらっしゃったので拝借します。出力確認end日時も読みやすくなりました。出力確認endサンプルではIPアドレスが適当ですが、実際のIPでアドレスではホスト名も取得できました。ユーザーエージェントから各種情報を取得するユーザーエージェントはとくに目で見ての作業はめんどうなので、ライブラリに任せましょう。#{user_agent.device.model}"endiPhoneとAndroidのときの表示で違和感があったので、条件分岐してます*3。整形する仕上げに入っていきます。フォーマットに従い出力します(ログ一行ごとのブロックで適当に仕切り線を入れて表示)。"\n"))出力結果は以下のような感じです。iPhoneまとめタイムトライアル的なタスクは、ありもののライブラリや先人のナレッジ、自分の過去のメモを生かしてさくっと解決していく必要があります。一方で、一回だけでなく何度かおかわりが来ることを想定し、再現できるようにしておくとよいのかな、と思います。最後にWizではエンジニアを募集しております。興味のある方、ぜひご覧下さい。careers.012grp.co.jp*1:この行を特定するのにも要件からDBから特定条件でクエリを投げ、得られた日時とログデータのアクセス日時を突合しなければならない...というタスクがありました。*2:みなさんも、手になじんだ言語があるのではないでしょうか。*3:たとえば、iPadなどはなかったので今回は考慮してません。アプリ開発でないので、とりあえず条件を満たして早さ優先。MySqlはじめに皆さんこんにちは、フロントエンドエンジニアのWooです。⚡️🌪バックエンドはexpress(Node.js)を使ってMySqlに接続しクライアント側はNext(react)を使って簡単データベースを作成してみたいと思います。自分の場合はsql文が分からないのではデータベース管理するMySQLWorkbenchを使いました。Webアプリケーションフレームワークです。事実上Node.jsの標準的なWebサーバフレームワークに付けて起動だけ多くの場所で使用されているようです。開発、およびサーバー設定、ユーザー管理、バックアップなどの包括的な管理ツールを提供します。データベース自分の好みで管理ツールを導入しても良いと思います。Pro」と「MySQLWorkbench」どちらかで悩みましたが「MySQLWorkbench」にしました。password三つのテーブルを用意しました。expressnpm初期化の後mysqlとexpressをインストールします。データベースconnectionデータベースのconnection処理が必要です。mysqlをimportして自分はデータベースの情報を返してくれる共通関数して使い回しできるように書いてみました。データベース情報はセキュリティのためenvに書いた方が良いです。ルートにポストする場合「member」のデータベースに格納できるように書いています。上記MySQLWorkbenchから作成したテーブルと繋いでいます。ここまでバックエンドの処理は完了となります。./server.jsこれでAPIの使用が可能になります。ポスト入り口用意nodejs.orgデータベースにPOSTするため簡単なフォーム作成します。SignUpこのようなサブミットフィールドになります。データベース確認MySQLWorkbenchを確認してみたらちゃんとデータは格納されてるのが確認できました。今回のPOST+Nodemailerと組み合わせをして自動返信メール機能を入れても🤔良さそうな気がしました。(1)リンク利用規約/免責事項このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。