Hisakeyのブログ

エンジニアが色々呟くブログです。

2025-01-01から1年間の記事一覧

【柏rb】第15回 ワイガヤグループワーク会に参加しました!

はじめに 柏rbは、2024年に千葉県柏市で誕生した地域コミュニティです。 言語や経験を問わず、どなたでもウェルカムな場となっています 定期的に開催していますので、ぜひ気軽に覗いてみてください [https://kashiwarb.connpass.com/:embed:cite] 今回の取…

Ruby/Railsのメモ化について、詳しく調べてみた。

はじめに この記事では、Ruby/Railsのメモ化 をハンズオンで確認します。 「メモ化をすると内部で何が起きるのか?」という疑問に対して、低レイヤ(参照・割り当て・GC)の視点で手を動かして確かめます。 背景・動機 Rails で I/O(DB/HTTP)を伴う処理に…

Rails:非カラム属性(attribute)にenumを使う方法 ― 仕組みと実例

はじめに Rails 7.1.2 で 非カラム属性(non-column-backed attribute)に対して enum を再び使えるようになりました。ところが、この変更はブログ等であまり解説されておらず、理解に時間がかかったため、自分用の整理も兼ねて記事化します。 単なる使い方…

さくらVPSにVite + ReactをNginxでデプロイしてみた

はじめに 今回の記事は、さくらVPSのようなIaaSを使って「サーバー構築からデプロイまで一から理解したい」 という思いから書いています。 普段はPaaSやホスティングを使えば簡単にWebアプリを公開できますが、あえてIaaSを選んで「サーバーの中で何が起きて…

【柏rb】第14回 ワイガヤグループワーク会

はじめに 柏rbは、2024年に千葉県柏市で誕生した地域コミュニティです。 言語や経験を問わず、どなたでもウェルカムな場となっています 定期的に開催していますので、ぜひ気軽に覗いてみてください kashiwarb.connpass.com 今回の内容 テーマごとにチーム…

後編:【Rails失敗談】has_oneをオーバーライドした結果、バリデーションを追加したら、全テストが失敗した

はじめに Railsのhas_oneやhas_manyといったアソシエーションは、モデル同士の関連を簡単に扱える強力な仕組みです。しかし、このアソシエーションメソッドを安易にオーバーライドすると、思わぬ副作用が発生し、予期しないオブジェクト生成やテスト失敗の原…

前編:【Rails失敗談】アソシエーションを不用意にオーバーライドしてはいけない理由と安全な代替案

はじめに Railsのhas_oneやhas_manyといったアソシエーションは、モデル同士の関連を簡単に扱える強力な仕組みです。 しかし、このアソシエーションメソッドを安易にオーバーライドすると、思わぬ副作用が発生し、予期しないオブジェクト生成やテスト失敗の…

【柏rb】第13回「こんな勉強会やっていきたい」を共有&議論するワークショップに参加しました!

はじめに 柏rbは、2024年に千葉県柏市で誕生した地域コミュニティです。 言語や経験を問わず、どなたでもウェルカムな場となっています 定期的に開催していますので、ぜひ気軽に覗いてみてください kashiwarb.connpass.com 今回の内容 どんな勉強していく…

React(JavaScript)で複数ファイルを安全に一括ダウンロードする実装

はじめに 複数ファイルをまとめてダウンロードしたい場面は、ファイル管理系のアプリやエクスポート処理でよくあります。 ただし React でこれを実現しようとすると、await や setTimeout に頼った実装では、ファイルサイズやネットワーク速度によって動作が…

ラズパイで理解する systemd とは 〜起動時に Python スクリプトを自動実行する〜

はじめに この記事では、Raspberry Pi(ラズパイ)などの Linux 環境で、電源ON時に Python スクリプトを自動実行する方法を紹介します。 Linux には cron などの自動実行手段がありますが、「起動時に一度だけ実行したい」といった用途には systemd が使え…

「はじめてのAST」〜parserとRubocopで構文木を学ぶ〜

はじめに ASTとはなにかというものを、簡単なコードを書きながら理解していく記事です。 今回は、parser を用いて Ruby のコードから AST(Abstract Syntax Tree)の構造を確認し、さらに Rubocop で簡単なカスタムCopを作成して、理解を深めてみました。 背…

エンジニア快適環境への旅【Part3】3年目までに買った周辺機器たちの話

はじめに 前回までのブログ hisakit.hatenablog.com hisakit.hatenablog.com 今回は「意外と使えた小物」と「結局使わなくなったもの」を特集してお届けします。 身の回りの整理や作業環境を整えていると、「ちょっと便利そう」と思ってつい買ってしまうこと…

TypeScriptのユニオン型で「登録か更新か」を型安全に判別する

はじめに TypeScript の discriminated union(判別可能なユニオン型)を導入することで、条件分岐をより安全かつ明示的に記述できるようになったことに気づいたので、それを共有します。 背景・動機 実務で、ユーザー情報の「登録」と「更新」を同じフォー…

エンジニア快適環境への旅【Part2】3年目までに買った周辺機器たちの話

はじめに 前回のブログは、こちらをご覧ください。 今回取り上げる周辺機器は、 デスク チェア の2つです。 背景・動機 前回も書きましたが、PC1台で始めたエンジニアライフ。 最初はそれでも問題なかったのですが、長時間デスクワークが続くと「もうちょっ…

エンジニア快適環境への旅【Part1】3年目までに買った周辺機器たちの話

はじめに エンジニアとして働き始めてから、気づけば2年が経ちました。 日々の開発の中で「もう少し快適に作業できたらなぁ」と感じる場面が増えてきて、少しずつ作業環境を整えてきました。 今回は、そんな中で実際に導入して「これは買ってよかった!」と…

ネストされたトランザクションを避けるためにブロックを使ったが、可読性が悪くなった

はじめに Railsでビジネスロジックをサービスクラスに切り出すことはよくあると思います。 中でも「データを更新して状態を進める」ような処理では、ApplicationRecord.transaction を使って整合性を保つことが多いと思います。 今回は、あるサービスが内部…

【柏rb】第12回:生活発表会 & 1年ふりかえり会の振り返り

はじめに 柏rbは、2024年に千葉県柏市で誕生した地域コミュニティです。 言語や経験に関係なく、どなたでもウェルカムな場となっています 定期的に開催していますので、ぜひ気軽に覗いてみてください kashiwarb.connpass.com 昨年、子どもが生まれ、参加…

ラズパイで理解するLinuxのcronとは

はじめに Raspberry Pi(ラズパイ)を使い、Linuxの基礎知識を学習中です。 今回は、ラズパイのスクリプトを自動で定期実行できないかと思い、そんなときに使えるLinuxの機能「cron(クーロン)」を紹介します。 今回は、自分で初めてcronを使って「毎日定期…

Slackに記事作成する通知Botに新機能を追加してみた!

はじめに hisakit.hatenablog.com 今回は、上記記事のBotに新機能を実装した話です 背景・動機 記事作成通知するBotを作成した結果、毎週のように通知されるようになりました。 そのおかげで、記事を毎週書くというプレッシャーがかかるようになったのですが…

wrap_parameters というRails機能を知らずに、フロントエンドと異なるインターフェイスでも動いてしまった話

はじめに Rails API を使っていると便利な仕組みも多い一方、気づきにくい落とし穴もあります。 今回はwrap_parametersのいうRailsが用意している機能についてです 背景・動機 フロントエンドから以下のような JSON が送られてきたのですが: { "name": "Ali…

GitHub Issues × Slack Bot でブログ作成通知するbotを作ってみました

はじめに 特に「ネタはあるけど、なかなか書き出せない」「つい忘れてしまう」… そんな課題を解決するために、Slackで自分に向けて「書いてください」とリマインドしてくれるBotを作りました。 そして、ブログネタは GitHub Issues で管理して、毎週Slackに…

ActiveRecordの例外を明確に分けるために validate!を使ってみる

今まで、何気なく使っていた save! メソッドですが、どんな例外を返しているのかあまり意識していませんでいた。 今回は、どのような例外を返しているのか調べ、追加でvalidate!についても調べて見ました。 save! メソッドの例外 以下のような例外が発生しま…

saveメソッドとupdateメソッドの何が違うの?

Railsの開発でよく使う save と update。 どちらも「レコードを保存する」ためのメソッドですが、どのように実装されていて、どんな違いがあるのか?を意識してませんでした。 ActiveRecordのソースコードを参考に save と update の内部処理を比較し、何が…

reloadメソッドに沼りました。

はじめに Rails のコントローラーで User に紐づく全てのアソシエーションを preload して、N+1 を解消しようとしました。 user = User.preload(:posts, :comments).find(params[:id]) SQL のログを確認すると、 preload によって関連データがまとめて取得さ…

Railsにおけるパラメータ不足を考慮する

はじめに Railsのコントローラでは、リクエストパラメータを params から取得します。しかし、パラメータが必ず送られてくるとは限らず、不足している場合に適切な処理をしなければエラーや予期しない動作になります。 特に、外部に公開しているAPIでは、ク…

第8回 柏rbに参加してきました!

OSS Gate風 OSS と仲良くなるためのワークショップ 第8回 柏.rb に参加してきました!今回のテーマは OSS Gate風 OSS と仲良くなるためのワークショップ でした。 やったこと まず、ターゲットにするOSSを出し合い、チームで作業を進めることになりました。 …

RSpecのlet, let!, before の違いと使いどころ

はじめに RSpec でテストを書く際に、データの準備方法として let, let!, before があります。 これらの使い分けを明確に理解していないと、意図しない動作をしてしまうことがあります。それぞれの使い方を記事にしてみました! 1. let と let! の違い RSpec…

Railsの遅延実行を理解して、無駄なクエリを防ぐ

はじめに RailsのActiveRecordは、データベースとのやり取りを簡単にする強力なツールですが、遅延実行という仕組みを正しく理解していないと、無駄なクエリが発生します。 遅延実行と即時実行の違いを明確にすることで、無駄なクエリを発生させないようにす…

Axiosの挙動: undefinedのパラメータについて

1. Axiosの特徴的な挙動 JavaScript の HTTP クライアントライブラリである axios には、リクエスト時に undefined の値を持つキーが削除されるという特徴があります。この仕様を利用すると、フロントエンド側で特定の条件に応じてパラメータを送信しないよ…