やわらかテック

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

開発所感

Pythonでデータ処理・グラフ描画できると業務の幅が広がる

僕がプログラミングを始めたばかりの頃はPythonを使って、データ処理・分析、機械学習といった内容に取り組んでいました。 当時、業務(アルバイト)ではCSVファイルをpandasで読み込んで、前処理をしてmatplotlibを使ってグラフを描画して...というサイクルを…

Rubyでパフォーマンス(メモリ使用量・実行速度)を計測する

先日、Rails製のアプリケーションのパフォーマンス検証をする機会がありました。 計測したいのはメモリ使用量と実行時間の2つです。後者の実行時間に関してはRubyが標準ライブラリとして提供しているbenchmarkを使えば事足りますが、前者のメモリ使用量とな…

弊社の技術ブログに「OSSコードリーディング入門」を投稿しました

先日、弊社の技術ブログに久しぶりに記事を投稿しました。 内容としてはOSSのコードを初めて読む人に向けて、どのような流れでコードを読んでいくのかを実際のOSS(gimei)を用いて紹介していくという記事です。 techlog.n2i.jp 本当は自分のブログに投稿した…

JOIN高速化のためにインデックスを作成しても効果はないのか

業務中に以前、自分が書いた記事を読み返す機会がありました。 www.okb-shelf.work JOINを使っているSQLを高速化できないかと思って新規インデックスの作成を検討をしていました。 ただし、過去の記事にも書いた通り「結合述語にインデックスを作成しても、…

コントローラーの単体テストをファットにしないRspecテストの書き方

Rails製のアプリケーションのコントローラーの単体テストを見ていると内部で使用しているクラスやモジュールの観点・パターンまでを網羅したファットな単体テストが書かれているものを見かけます。しかしながらコントローラーの単体テストはあくまでコントロ…

インスタンス作成時の値によって関数の定義を変える方法

ある日のこと、業務中にチームメンバーから非常に面白い質問がありました。 「インスタンス作成時の値によって関数の定義を変えることって可能ですかね?」 ...とのことです。 どういうことかをもう少し詳しく聞いてみると、以下のようなイメージを持ってい…

「Aを変更したらBも変更してね」コメントはいらない

いつものようにプロダクトのコードを読んでいた時のことです。 コード内に「Aを変更したらBも変更してね」という旨のコメントがいくつか記載されていることに気づきました。 def do_something # ここを変更したらlibのdo_somethingも変更すること : end この…

「達人プログラマー」を読了したら感謝の気持ちに辿り着いた

先日、しばらく積読してしていた「達人プログラマー 第2版」を読了しました。 達人プログラマー(第2版) 熟達に向けたあなたの旅 | Ohmsha この書籍について改めて自分が語る必要がないぐらい有名な書籍で、著者は伝説のプラグラマーであるDave Thomas(デイ…

Rubyで演算子の順序を入れ替えるとエラーになるのはなぜか

先日、Rubyで文字列を指定数分だけ繰り返す処理を書いていた所、面白い現象に遭遇しました。 文字列を繰り返すために*を使ったのですが「文字列 * 数値」の場合はエラーが発生せずに望み通りの値が返るものの、順序を逆にして「数値 * 文字列」とするとエラ…

Rails Discussionに投稿をしてみた

「今年こそは...今年こそは...OSSに貢献するぞ...!」と思い気づけはや3年。 気持ちだけが先行して何をしたら良いのか分からず。結局、それらしいことは何もしていませんでした。 ですが、先日開催されたRubykaigi2023(コロナになって行けなかったけど)へ参…

コーチングがない組織が行き着く先はBADENDでしかない

最近はチームビルディングについて思い悩まされる日々を過ごしています。僕は過去に外部メンターの方からマネジメントにおいて重要なのは「ティーチングとコーチングの違いを理解すること」だと教えて頂きました。 www.okb-shelf.work 当時は教育を担当して…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

僕は卒論で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月のこと。 当時の僕は、インターンからアルバイトを経てすでにエンジニアとして業務経験を積…

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以降の処理がブロック…