やわらかテック

興味のあること。業務を通して得られた発見。個人的に試してみたことをアウトプットしています🍵

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

PostgreSQLでboolean型のカラムを持つレコードを取得するとt, fとなる

Rubyでpg gemを使って、postgresqlに接続してクエリの実行結果を見ていたところ、boolean型のカラムの戻り値がTRUEの場合にt、FALSEの場合にfとなる現象を確認しました。 CREATE TABLE test1 (a boolean, b text); INSERT INTO test1 VALUES (TRUE, 'sic est…

binding.irbでdebugコマンドが使えないのはirbのバージョンが古いため

僕はRubyで何かしら開発をする時にbinding.pryというデバッグツールを愛用してきました。 Rubyを書き始めたのが確か、2.3系の頃で当時からbinding.pryは非常に人気のデバッグツールでした。 しかし、Rubyのバージョンアップにつれてbinding.irbが標準gemとな…

ファイルをオープン(open)したらクローズ(close)しないといけない理由について

僕がプログラミングを始めたばかりの頃、よく「ファイルをクローズし忘れてるよ」と指摘されていました。 当時は「ファイルはオープンしたらクローズするもの...」と反射的にファイルをクローズするようにしていました。しかし、今になって思うと「なぜオー…

【Ruby】なぜeach関数よりもfor inが遅いのか

先日、以下の記事を公開しました。 www.okb-shelf.work Rubyで配列からハッシュを作る際に、どの方法が一番パフォーマンスが良いのかを計測したのですが、過去にJavaScriptで似たような計測をした時はシンプルなfor文が最速だったので、Rubyでも同じような結…

【Ruby】配列からハッシュを生成する4つの方法と速度比較

Rubyで開発をしていると配列からハッシュ(連想配列)を生成するコードを書くことがあります。 個人的にはreduce関数を使ってバシッと書くのが気持ちよくて好きなのですが、最近、人によってこの処理の書き方が違うことに気づきました。 4つの書き方 僕が個人…

Elm Architectureに感銘を受けた

最近、Elmを学びはじめました。 Elmの存在は元から認知していて、Haskellに似た文法を持つ関数型言語にカテゴリーされる言語だそうで、そんな言語でフロントエンドが作れるとのこと...で非常に興味がありました。また、個人でアプリケーションを作るにあたっ…

あなたのチームに悪者はいない。だから対話が必要なんだ

チームの人数がだんだんと増えてきてポジションが明確化されて来た今、「対話が必要だ...」と思わされる日々を過ごしています。 何年も前に「ポジションは役割に過ぎない」という記事が話題になりました。当時、ポジションというのは上下関係を構築するもの…

第8波にてはじめてコロナになりました

しばらく更新が止まってしまい申し訳ありません。 事後報告になりますが、コロナウイルスに感染して5日間ほど寝込んでいました。とても記事を書ける状態ではありませんでした。まさかのGW真っ最中での感染...によって、全ての予定が吹き飛びました。 軽い旅…

「アジャイルなチームをつくるふりかえりガイドブック」のすすめ

いつものように書店を徘徊していると、良さげな本を発見。 同じシリーズの書籍である「SCRUM BOOT CAMP THE BOOK」を過去に読んだことがあったので「この表紙は!」と思い気づいたら購入していました。はい、いつもの衝動買いです。自分は書店で紙媒体のもの…

無知であることを体験することの重要さ

最近、みなさんは全くやったことがない・知識がなかったことを新しく始めたりされているでしょうか。 僕は先日、同居人と人生ではじめてのキャンプに行きました。 といっても、テントin寝袋で泊まるような立派なものではなく、タープを立てて簡単な食事をし…

何気ない一言は人を変えることがある

よく「人を変えることはできない」という意見を耳にします。 この意見に対しては自分も完全同意で、人を変えることへ労力をかけるのであれば、悲しきかな自分を取り巻く環境を変えてしまった方が圧倒的に簡単でコスパが良いです。 しかし、その一方で「人を…

Rspec+Railsを使ったconcernの単体テストの書き方

Railsの開発にてmodelやcontrollerの共通処理をconcernとして切り出すことはよくあるパターンです。 modelやcontrollerはクラス(class)として表現するものの、concernはActiveSupport::Concernをextendしたモジュール(module)として定義する必要があります。…

部活動という構造が権限委譲の素晴らしいモデルなのではないか

最近は社内の輪読会で「エンジニア組織論への招待」を読んでいます。 著者の広木さんが書かれた素晴らしい内容に影響されて、組織構造について考える時間がとても増えました。 エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリ…

Class.new内部の関数定義へ変数を受け渡す方法について

Rspecでモックを作りたくて動的なクラスをClass.newで生成していた時のことです。 関数で受け取った配列を.mapで処理していたところ、do |student|で定義したブロック変数がClass.new内部に定義した関数のスコープ外になるという現象に遭遇しました。 def cr…

日本(Asia/Tokyo)の今日の日付をelixirで取得する

何回も書く機会があるので、まとめておこうと思います。 何も外部ライブラリをインストールしていない状態ではEtc/UTC以外のタイムゾーンを使用することができません。自分のようにAsia/Tokyoを使いたい人はTzdataやTimexといった外部ライブラリをインストー…

卒論の時に作ったアプリケーションのアーキテクチャを考え直してみた

僕は卒論でVB.netを使って「センサーで計測したひずみ値を描画・記録するアプリケーションの作成」を行いました。学部では土木・建築を専攻しましたが、先生が「プログラミングを極めたい」という僕の気持ちを汲んでくれたことを今でも感謝しています。目的…

コードを書かない日があってもいいんじゃないかと思った話

最近のことですが、コードを全く書かない・書こうと思わない日がやってくることに気づきました。 新卒で現職に就いてからこんなことを感じたことはほとんどなかったので、自分でも驚いていますし、本当にショックです。ついに自分にも無気力期間がやってきて…

無名ブロック(anonymous block)によってRuboCopがコケるようになった

2023年3月31日をもってRuby2.7がEOL(EndOfLife)となりました。安らかにお眠りください...🪦 Ruby | endoflife.date 業務でRubyを触り始めたのが、ちょうど2.3~2.7系の時だったので感慨深いものがあります。 Ruby2.7のEOLに伴って、プロダクトのレポジトリ内でR…

技術ブログを始めて5年目に突入して思うこと

はてなブログから素敵なメールが届きました。なんとブログを開設してから早くも4年が経過したそうです。 開設したのは学部を卒業して新卒になる前の2019年3月のこと。 当時の僕は、インターンからアルバイトを経てすでにエンジニアとして業務経験を積…

「夜と霧」を読んで「人はなぜ生きるのか」には答えがないことが分かった

最近は技術書だけではなく、さまざまな書籍を読むようになりました。 今回はヴィクトール・E・フランクル著の「夜と霧」を読みました。今更、自分が紹介するまでもなく名著して語り継がれている書籍です。著者のフランクルが第二次世界大戦渦にて、ユダヤ人…

mastdonからServiceクラスの作り方を学ぶ

みなさんはRailsの開発にて、サービスクラス(ServiceObject)を使っているでしょうか。 モデルやコントローラーがファットになるのを防ぐために導入される設計方法で、ドメイン知識におけるサービス(eg: 商品の購入処理)の一連の処理をまとめたクラスを作成す…

トランザクションがあれば安心ではないのでRailsでもロックをかけたい

Railsでトランザクションを扱いたい時はActiveRecordに実装されたtransactionメソッドを呼び出します。 ActiveRecord::Base::transaction do : end 今までRailsでトランザクションのブロックを宣言した時は、他のトランザクションからデータの取得、更新は出…

ミヒャイル・エンデ作のモモは現代の大人こそ読むべき本だった

昨日、ミヒャイル・エンデ作の「モモ」という書籍を読了しました。 この本は児童文学として書かれているので、普段の自分とは縁もゆかりもない書籍です。一週間前にアップロードされたアバタローさんの解説動画を見て「何だこの本は...面白そう」と思い、い…

Railsのマイグレーションファイルでt.stringを使うときはlimitを指定してほしい

Railsではマイグレーションファイルを作成してマイグレートを実行することで、テーブルが作成されます。 非常に便利で手軽にテーブルの定義・作成ができるのですが、マイグレートされた結果、どのような型が選択されるのかが隠蔽化されるという問題があると…

【書評】単体テストの考え方 / 使い方 を読了しました

2022/12/28に「Manning Publishing: Unit Testing Principles, Practices, and Patterns」の翻訳書である「単体テストの考え方/使い方」という書籍が発売されました。買うか迷っていたのですが、TDD(テスト駆動開発)で有名なt_wadaさんがツイートされている…

小さな声で話し出すことがリモートワークのミーティングを加速させた

日々のリモートワークでミーティングをしていると、相手と同時のタイミングで話し始めてしまうことがよくあります。特に自分から話を振ってから、返答を待ってる間に何かを追加で自分が話し出した時なんかひどいもので、せっかく相手が話しだしてくれたのに…

中間テーブルには複合インデックスと単一インデックスどちらを作成すれば良いのか

データベースの設計において正規化の結果、中間テーブルを作ることがよくあると思います。 以下のようなテーブル群があったとします。登録されたユーザーと登録された商品を誰が出品した商品なのかを中間テーブルへ記録しています。 users products user_pro…

Rubyで巨大な配列を扱う時はEnumeratorを使うのが良さそう

先日、Rubyで巨大な配列(Array)を扱うことがありました。 気になるのは巨大な配列を宣言したときのメモリ使用量です。試しに、要素数が10,000個の配列を宣言してみると89,712Byteほどメモリを使用していることが分かります。 require 'objspace' # memsize_o…

オレオレRspecを自作して覚えるRubyのブロック引数について

Rubyのブロック引数についてご存じでしょうか。 非常に便利な機能で皆さんもよく使っている、正確にはブロック引数に対してブロックを渡していますが、ブロック引数を定義する機会がほとんどない方も多いでしょう。 例: eachの場合 # do以降の処理がブロック…

【Ruby】boolean型の値を渡すだけの関数にはキーワード引数を付与してあげよう

ある日のこと。Rubyのコードを読んでいるとboolean型の値が引数となる関数の呼び出し処理を見て「なんじゃこりゃ...」という気持ちになりました。簡単な例を紹介します。 def say_hello(is_morning) if is_morning puts 'おはようございます' else puts 'こ…