コードレビューについて考える
こんにちは。浅野です。 私ごとですが、最近入籍しました。苗字が変わりましたが、旧姓はエイリアスとして残り続けているので、このまま「浅野」と名乗り続けていきます。 さて、今回のテーマは「コードレビュー」です。コードレビューにまつわる問題について考え、解決手段の1つとしてGitHubの機能を紹介したいと思います。 コードレビューにまつわる問題 みなさん、コードレビューしていますか? レビューって結構大変ですよね。忙しい時や自分の作業に集中したい時は、ついついなおざりになってしまうこともあるのではないでしょうか? 私の肌感覚ですが、以下はどの開発チームでもよくある問題なのではないかと思います。 レビュー依頼溜まりすぎ問題 レビュアー固定化問題 それぞれ補足します。 レビュー依頼溜まりすぎ問題 あるあるとして、結構共感してもらえると思います。いや〜、本当にレビュー依頼っていつの間にか溜まっているんですよね。 やりがちではあるものの、単純にチームの開発スピードを低下させるので良くないです。1つのプルリクエスト(以下、PR)がマージされないことで、他の作業に影響が出て、前に進めなくなってしまう、なんてことにもなりかねません。 レビュアー固定化問題 これもあるあるですよね、きっと。レビューを後回しにする → 他の人がレビューしてくれる、というサイクルを繰り返していると、毎回同じ人がレビューしているという事態になりかねません。 これの何がまずいかって、ナレッジが共有されないことだと思います。コードレビューをしていると、さまざまな発見があります。そういった知見が共有されないままだと、チーム全体としてのコードの質が向上しません。 原因 こうした問題は、どうして発生してしまうのでしょうか。私の所感ですが、こんな個人の気持ちが影響しているように思います。 「自分がやらなくても、誰かやってくれるでしょ!!」 ああ、よくない!よくない!でも、つい思ってしまう!! 特にレビュアーにアサインされている人が多いと、甘えがちになってしまうかもしれません。 改善策 GitHubには、レビュアー自動割り当て機能というのがあります。現在所属しているチームで最近導入されたのですが、上記の問題へのアプローチとしてとても良いと思いました。 レビュアー自動割り当て機能の概要 毎回レビュアーを自動で設定してくれる機能です。レビュアーの人数も指定できます。 自動割り当てのアルゴリズムは、ラウンドロビンとロードバランスの2つから選べます。ラウンドロビンは順番に割り当てていくのに対し、ロードバランスは30日間で同数となるようです。 期待する効果 レビュアーの人数が減ることで、「自分がレビューしなければいけない」という状況が強制的に生まれます。その結果、レビュアーの当事者意識が高まりそうです。また、レビュイーの立場としても「誰かレビューしてください」ではなく、「◯◯さんとXXさん、レビューしてください」と言えるので、より早くレビューしてもらえそうな気がします。 加えて自動でレビュアーが決められるので、誰に依頼するか悩まずに済む点も良いです。 導入方法 ざっくりですが、大きく2つの手順が必要です。 Teamの作成 自動割り当ての設定 詳細は、ドキュメントで確認してください。 使用方法 PRのレビュアーに、作成したTeamを指定してください。するとTeam内のランダムで選ばれた人が、レビュアーにアサインされます。 副次的効果 今まではチーム全員をレビュアーとしてアサインしていたので、一人ひとり探すのが手間でした。この機能を使うと、ワンクリックで終わるので楽チンです。 最後に この機能を使うようになって間もないので、正直なところどれほど効果があるのかは分かりません。それでも、メンバーの意識を変えやすくする機能ではあると思っています。
RubyWorld Conference 2022に参加してきました!!
みなさん、こんにちは。 小林です。 11/10〜11/11に開催されたRubyWorld Conference 2022に参加してきました。3年ぶりのリアル開催です!! 私はRuby関連のイベントへの参加自体が初になりますので、その様子をブログにまとめてみました。 1日目のMatzの講演では、Rubyに対する批評にユーモアを交えながらコメントすることから始まり、Rubyの向かう先、Ruby3.2の内容と、とても興味深い内容でした。 要約しますと、充電しておくことはとても重要だということです!! Matzの講演の後は、皆で八雲庵にお蕎麦を食べに行きました。 WYRDのお決まりのお店らしく、私は鴨南蛮そばと割子そばを食べましたが、とても美味しかったです。 昼食後は会場に戻り、Matzにご挨拶をさせていただきました。 名刺交換し、写真を撮り、サインまでいただき。いや〜、緊張しました。。。 2日目の最初はAaronの講演から始まりました。 導入部分の話ですが、JavaとRubyを比較していた際に、もともと私がJavaを主言語としていたこともあり、Rubyの良さが改めて理解できた気がします。 わかったよ!! Rubyの良さが!「言葉」ではなく「心」で理解できた! ノベルティもしっかり配ることができました。(MatzにもAaronにもお渡しできました!!) 縁結びのお守りですが、実は秘密が・・・ 気になる人は、ぜひこちらの記事をご覧になってください。 RubyWorld Conference 2022も無事に終了し、WYRD以外のRuby業界の方々とお話しすることができ、とても勉強になりました。 土曜日は皆で観光に行きました。当然、松江城にも行きました。 松江城に行くために、松江に来たと言っても過言ではありません。 松江城は現存十二天守にして国宝というとても貴重な史跡なので、松江に訪れた際には、ぜひ併せて訪れていただきたい場所です。 長くなりましたが、これにて筆を置かせていただきたいと思います。
RubyWorld Conference 2022 記念ノベルティ『縁結び』
『縁結び』について 2019年以来のオフライン開催を記念し、コロナ禍を乗り越えて新しい<縁>が結ばれることを期待してノベルティ『縁結び』を配布します。 使用方法 神社で手に入る他の御守りと同じです。常に身につけるようにしていれば問題ありません。 持ち歩くのが難しい場合は、引き出しに片付けず目の届く明るいところに飾ってください。 『縁結び』の中には 《願い札》 と 《ルビーの原石》 が入っております。原石はとても小さいので画像は割愛します、また扱いにはご注意ください。 《願い札》 にはお願い事を書いて袋に入れて大切に保管してください。 《ルビーの原石》 はプログラミング言語Rubyに因んだパワーストーンとして同梱しましたので願掛けにお使いください。 デザインについて 宝石はRuby、星の数はVer3、金と銀の星はRuby技術者認定試験に因んでおります。 弊社デザイン部および全社員の意見を取り入れた渾身の作です。 入手方法 RubyWorld Conference 2022 の開催期間2022年11月10日(木)・11日(金)に島根県立産業交流会館 「くにびきメッセ」国際会議場(3F)の入口近くのスポンサー広報配布物エリア、または当日会場でカンファレンス参加中の弊社社員にお申し付けください。数に限りがありますので、なくなり次第終了となります。
EC2内のログファイルをCloudWatchログに出力する
こんにちは。小林です。 今年の夏は気温が高く、過ごしづらかったですが(毎年思う)、それも終わり、ブログの執筆が捗る涼しい季節となってきました。 それでは今回の内容ですが、 タイトルの通り「EC2(AmazonLinux2)内のログファイルをCloudWatchログに出力する」方法を紹介します。 ※EC2やIAM、CloudWatchに関する基本的なことは理解している前提とします。 はじめに もともと、EC2インスタンス内に出力されているログファイルを日に一度S3にアップロードをしていたのですが、ログ内に特定の文字列が出力された場合に通知をしたくなったことが事の発端です。 問題点 現状では以下の問題があります。 日に一度のアップロードのため、リアルタイムでの検知ができない (仮に1秒ごとにファイルをアップロードしたとしても)S3に格納されたファイルを解析する必要があり、手間がかかる 解決策 色々調べたところ、CloudWatchエージェントというものを使用して、CloudWatchログに出力することができる、ということがわかりました。 CloudWatchログに出力することができるのであれば、CloudWatchアラームにて文字列を検知すればよいので、かなり楽に実現することができます。 ※CloudWatchログに出力するところまでとし、アラーム通知の設定に関しては割愛します。 CloudWatchエージェント CloudWatchエージェントとは 統合 CloudWatch エージェントを使用すると、以下のことを実行できます。 オペレーティングシステム全体で Amazon EC2 インスタンスから内部システムレベルのメトリクスを収集します。このメトリクスには、EC2 インスタンスのメトリクスに加えて、ゲスト内メトリクスを含めることができます。収集することができる追加のメトリクスについては、「CloudWatch エージェントにより収集されるメトリクス」を参照してください。 オンプレミスサーバーからシステムレベルのメトリクスを収集します。これには、ハイブリッド環境のサーバーや によって管理されていないサーバーも含まれる可能性がありますAWS カスタムメトリクスは、StatsD および collectd プロトコルを使用して、アプリケーションまたはサービスから取得します。StatsD は、Linux サーバーと、Windows Server を実行するサーバーの両方でサポートされています。collectd は、Linux サーバーでのみサポートされています。 Linux または Windows Server を実行している Amazon EC2 インスタンスおよびオンプレミスサーバーから、ログを収集します。 引用:CloudWatch エージェントを使用した Amazon EC2 Instances インスタンスとオンプレミスサーバーからのメトリクスとログの収集 要するに、 EC2インスタンスやオンプレミスのサーバからログやメトリクスを取得し、CloudWatchに出力することができる ということになります。 インストール方法 既にパッケージが用意されているため、以下のコマンドで簡単にインストールできます。 sudo yum install amazon-cloudwatch-agent /opt/aws/amazon-cloudwatch-agent/にインストールされます。 IAMポリシー AWSが以下のポリシーを用意しているため、対象のインスタンスに設定しているIAMロールに紐づけてください。 CloudWatchAgentServerPolicy 設定ファイル NGINXのアクセスログとエラーログをCloudWatchログに出力するために、必要最低限の設定を作成しましたので、それをベースに解説します。 ファイルの形式はJSON形式です。 セクション 項目 概要 agent region 送信先のリージョンを指定。(EC2の場合)デフォルトはそのEC2インスタンスが存在するリージョン run_as_user 実行ユーザ。デフォルトはrootユーザ logs log_stream_name collect_list内にてログストリーム名が指定されなかった場合のデフォルト値を指定。必須項目 force_flush_interval ログをCloudWatchに出力するまでの最大秒数。バッファ内に溜めているログのサイズが1MBに達すると強制的に送信。デフォルト値は60(秒) logs_collected files 収集するログの情報を指定。collect_listの配列 collect_list log_group_name 出力するロググループ名 log_stream_name 出力するログストリーム名 file_path 対象のログファイル名 timezone CloudWatchログに表示するタイムスタンプのタイムゾーンを指定。デフォルトはUTC timestamp_format CloudWatchログに表示するタイムスタンプのフォーマット { "agent": { "region": "us-west-2", "run_as_user": "root" }, "logs": { "log_stream_name": "{instance_id}", "force_flush_interval": 5, "logs_collected": { "files": { "collect_list": [ { "log_group_name": "/ec2/output_log_in_ec2_to_cloudwatch", "log_stream_name": "{instance_id}_access", "file_path": "/var/log/nginx/access.log", "timezone": "UTC", "timestamp_format": "%Y/%m/%d %H:%M:%S" }, { "log_group_name": "/ec2/output_log_in_ec2_to_cloudwatch", "log_stream_name": "{instance_id}_error", "file_path": "/var/log/nginx/error.log", "timezone": "UTC", "timestamp_format": "%Y/%m/%d %H:%M:%S" } ] } } } } 起動方法 以下のコマンドで起動します。 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \ -a fetch-config \ -m ec2 \ -s \ -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/amazon-cloudwatch-agent.json オプションはそれぞれ以下のようになっています。 a・・・最新の設定ファイルをロード -a fetch-config・・・ -cオプションか-oオプション、もしくはその両方を指定 m・・・起動するサーバの種別(EC2/オンプレミス)を指定 -m ec2・・・EC2を指定 s・・・起動 c・・・設定ファイルの指定 -c file:configuration_file_path・・・ローカルに配置されたファイルを指定 詳細や上記以外のオプションは--helpオプションにて確認ができます。 上記のコマンドを1度実行したあとは、systemctlコマンドにて起動停止を行うことができます。 補足 amazon-cloudwatch-agent-ctlコマンドを使用して起動した後に、設定ファイルに誤りを見つけ、修正しました。 しかし、systemctlコマンドを使用して、再起動をしたところ、修正内容が反映されていませんでした。 色々と調べていくと、-cオプションにて指定したJSONファイルを以下のTOMLファイルに一度変換してから、読み込まれているということがわかりました。 /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml 設定ファイル(JSON)を編集しても、エージェントが読み込む設定ファイル(TOML)には反映されないため、いくら再起動しても設定が反映されないということです。 設定を変更した後には、必ずamazon-cloudwatch-agent-ctlコマンドを実行する必要があります。 起動結果 以下のように、NGINXにて出力されているログファイルの内容をCloudWatchログに出力ができるようになりました。 あとは、CloudWatchアラームにてアラーム設定をするだけで、通知をすることも可能になります。 おまけ そういえば、みなさんはサーバの性能に関する状態を確認するのにCloudWatchを使用したことがあると思います。(ありますよね?) しかし、(例えば)メモリ使用率のメトリクスは存在しないですよね?結構大事な項目だと思うのですが、、、 CloudWatchエージェントを使用するとこれらの値も取れるらしいです。 次回はこれをネタにブログを書こうと思います。 参考 CloudWatch エージェントを使用した Amazon EC2 Instances インスタンスとオンプレミスサーバーからのメトリクスとログの収集 CloudWatch エージェントのインストール CloudWatch エージェント設定ファイルを手動で作成または編集する
俺の MacBook セットアップ 2022
最近、故障や働く現場が変わってMacをセットアップすることが多くなったので折角なので備忘録として設定内容を残そうかと思います。 環境 キーボード配列: US 言語設定: en スクリーンショットの言語設定は英語ですが説明時には日本語で説明します。 方針 macOS を利用してる場合は通常 Time Machine を使ってバックアップや MacBook 買い替え時の移行をするが Time Machine は使用しない。 代わりに必要なものはクラウドで管理するようにする。 Xcode や Homebrew 等が必要なツールはキリがないので今回は紹介しません。 スクリーンショットの保存先の変更 スクリーンショットはデフォルトではデスクトップに保存されます。個人的には画像はPictures以下に配置してほしいので ~/Pictures/Screenshots にスクリーンショットの画像や動画を保存するようにしています。 方法は以下のコマンドを実行して、反映するために option + command + escから Finder を再起動します。 mkdir ~/Pictures/Screenshots defaults write com.apple.screencapture location ~/Pictures/Screenshots 調べて初めて知ったのですが、ショートカットからでも設定が可能なようです。 Macでスクリーンショットの保存先を変更する方法 | ライフハッカー[日本版] キーボード入力 キーリピート デフォルトの設定ではaを長押しすると発音記号等が入力できるようになっています。 これをオフにするためにはターミナルで以下のコマンドで設定を変更します。変更後は再起動すると長押しをしても発音記号等の入力ではなく、キーをリピートしてくれます。 defaults write -g ApplePressAndHoldEnabled -bool false さらにリピートの速度の変更は システム環境設定 (System Preferences) の キーボード から設定できます。最速最短だと早すぎるのでその一段階下の値に設定しています。 ダブルクォート、シングルクォートの入力 デフォルトではダブルクォートやシングルクォートで囲むと終端のクォートが別の文字コードのクォートに変換されて入力されるのでコーディングしてる際はとても不便なのでオフにします。 システム環境設定 から キーボード を開き、ユーザ辞書 タブを選択します。 スマート引用符とスマートダッシュを使用 (Use smart quotes and dashes) のチェックを外します。 続いてクォートを始端と同じ終端のものを選択します。見た目は然程変わりませんがセレクトメニューの一番下です。 トラックパッド クリック デフォルトだと、クリックの動作は少し押し込む必要があるので、これを軽くタップするだけでクリックできるように変更します。 システム環境設定 から トラックパッド を開き、 ポイントとクリック タブを選択し タップでクリック にチェックを入れます。 ドラッグ ドラッグする時デフォルトだと押し続けてドラッグするので、これも設定を変更して、軽いタップとカーソルの移動だけでドラッグをできるようにします。 システム環境設定 から アクセスビリティ の ポインタコントロール を選択して、 トラックパッドオプション を開き ドラッグを有効にする をチェックし ドラッグロックなし を選択します。 USキーボードでキーを押しっぱなしでa… - Apple コミュニティ スクリーンセーバーとスクリーンロック 自社でもなるべく離席する際はホットコーナーを使ってスクリーンロックをしています。設定方法は システム環境設定 から デスクトップとスクリーンセーバ を開いて スクリーンセーバ タブの左下から ホットコーナ の設定で 画面のロック ズーム 画面共有等で一部を拡大したい時は control とトラックパッドのジェスチャーで拡大しています。この設定は システム環境設定 から アクセスビリティ の ズーム機能 から スクロールジェスチャと修飾キーを使ってズーム (Use scroll gesture with modifier keys to zoom) にチェックを入れると使えます。 SSH -C はコメントで自分の場合は習慣的に $MAIL/$HOSTNAME のようなフォーマットにしています. ssh-keygen -t ed25519 -C "your_email@example.com:mbpa2251" ssh-add -K vi ~/.ssh/config chmod 600 ~/.ssh/config ~/.ssh/config の内容は以下のようにします。 Host * UseKeychain yes AddKeysToAgent yes # Host foo # HostName 111.111.111.1111 # Port 1111 # User user_name # IdentityFile ~/.ssh/id_rsa # ForwardAgent yes 新しい SSH キーを生成して ssh-agent に追加する - GitHub Docs ファイル等の管理 普段作業している時はなるべくクラウドに同期するようにしています。普段から同期しておけば外部デバイスを使って Time Machine を使う必要がなくなります。 ここでは自分が使ってるものだけ紹介しておきます。 iCloud macOS を使ってる人ならほぼ利用していると思いますが、iOS等と同期ができるのは非常に便利です。 1Password を使ってパスワードやMFAを管理 iCloudでもパスワード管理等はできるのですが、1Passwordの方が細かいところに手が届く感じなので使っています。 会社で1Passwordを利用していて、ビジネスプランの場合はファミリープランが無料で利用できるので、個人的なものはファミリープランの自分のアカウントで管理しています。 MFAに関して以前はパスワードとMFAは別に管理したくてAuthyを利用していましたが 最近は 1Password で積極的に管理するようにしています。理由は将来的にはパスワードレスな世の中になるので 1Password 自体はパスワード管理というより本人認証のツールへと移行していくらしいので、それならMFAも1Passwordに寄せても良いと判断しました。 パスワードマネージャのLastPassと1Passwordが相次いでFIDO/WebAuthnへの対応を発表。パスワードレスの時代にパスワードマネージャの存在意義はどうなるのか? - Publickey Github プライベートでもGithubを使っていているので、なるべくコード等はコミットするようにしています。 AWS S3 多少大きめのファイルで長期間保存しておきたいものはS3を使っています。Glacier とか使えば結構安く使えるのと、AWS はよく使ってて慣れてるのでS3を選択しています。 アプリのクラウドストレージを使う 最近、使い出したCADのFusion360はアカウントを登録しておけば、Fusion360のクラウドストレージにデータが保存されます。 同様に VSCode で Microsoft か Github アカウントに紐付けして、設定を同期しておきます。 Chromeの設定同期もGoogleのアカウントに紐付けしておけば拡張機能等が同期されます。 最近のアプリは結構同期されることがあるので別途設定ファイルを管理する必要がなくて簡単です。 その他SNS等 写真や動画等は、秘密にしたいようなものもほぼ無いので、 Instagram や YouTube にアップロードしています。 今回のセットアップでは使わなかった設定 今回のセットアップでは、今のところ必要性が感じなかったが、以前は設定していたものがあるので、こちらも紹介だけですが残しておきます。 CLI の sudo から TouchID をできるようにする 最近は全然使ってないですが、以前は sudo を頻繁に使うことがあったので TouchID から使えるようにしていました。 DevelopersIO の記事に設定方法がまとめられているので、必要があれば設定しようと思います。 MacのTerminalでsudo実行時にタッチIDを使用する方法 | DevelopersIO



