chevron_left

メインカテゴリーを選択しなおす

cancel
やわらかテック https://www.okb-shelf.work/

リモートワークでWEBエンジニアをしています。 自称ミニマリストが配線と戦いつつ、快適なデスク環境を目指し「これは買うしかない」と思ったオススメのガジェットなどを紹介中。 エンジニア教育やプログラミング言語に関する内容も。

ぎょうざ
フォロー
住所
未設定
出身
未設定
ブログ村参加

2023/01/11

arrow_drop_down
  • 【書評】データ指向アプリケーションデザインを読了して見える世界

    1ヶ月ほど読み進めていた「データ指向アプリケーションデザイン」を読了しました。 オライリーから出版されている本の中でも、かなり分厚い部類の書籍だったのと、章ごとの情報量が凄かったので結構、時間がかかってしまいました。 データ指向アプリケーションデザイン ―信頼性、拡張性、保守性の高い分散システム設計の原理作者:Martin KleppmannオライリージャパンAmazon 個人的には難易度の高い書籍だと思うのですが、それでも多くの方からオススメされてきた書籍でもあります。 今まで読んでは飽き...読んでは飽き...を繰り返していましたが、ようやく一貫して読了したので簡単に書評を書いてみたいと思…

  • SELECTの結果から複数のデータを複数INSERTする

    SQLで初期データを作成したいというのは、よくあるケースかなと思います。 例えば全ての企業(companies)に対して初期ユーザー(users)を1件登録する必要があるとします。企業とユーザーは1対多の関係にあり、以下のようにINSERTとSELECTを組み合わせることで簡単に全ての企業に対して初期ユーザーの追加が完了します。 企業一覧 postgres=# SELECT * FROM companies; id name ----+------ 1 A社 2 B社 3 C社 (3 rows) 各企業に初期ユーザーを追加 INSERT INTO users (name, co…

  • AWS クラウドプラクティショナー(CLF-C02)に合格しました

    先日、AWS公式が開催しているAWS Certified Cloud Practitioner(CLF-C02)に合格しました。 学習期間は1週間ほど。市販のテキストを読みつつ、無料で問題を解くことができるサイトを利用させて頂きました。 AWSに関しては多少の知識はあれど、実務で使ったことはほとんどありません。 というのも自分が所属する企業ではGCPをメインに使っているため、AWSを本格的に使う機会がありませんでした。大学生の時にアカウントだけは作っていて知らぬ間に無料枠を食い潰していたようです。もったいない...。 ただ、GCPとAWSで似たサービスや概念が多くあったので、スムーズに理解する…

  • 2023年度のブログ活動の振り返り

    あっという間に今年も残り数時間で終わろうとしていますね。 今年度もありがとうございました。今年は多くの方に記事を読んで頂けて嬉しい限りです。 実は報告などはしていなかったのですが、2023年はある目標を立ててブログ(アウトプット)を続けてきました。 もしかしたら、勘付いている方もいるかもしれませんが、その目標とは「毎月10記事以上の記事を1年、投稿し続ける」というものです。 ブログ上部の「運営者について」に月毎の投稿数が分かる情報を表示するようにしているのですが、2023年は全ての月で10記事以上の記事を投稿し続けて、12月度はすでに9件の記事を公開しており、この記事が10個目の記事になります…

  • 2023年度のブログ活動の振り返り

    あっという間に今年も残り数時間で終わろうとしていますね。 今年度もありがとうございました。今年は多くの方に記事を読んで頂けて嬉しい限りです。 実は報告などはしていなかったのですが、2023年はある目標を立ててブログ(アウトプット)を続けてきました。 もしかしたら、勘付いている方もいるかもしれませんが、その目標とは「毎月10記事以上の記事を1年、投稿し続ける」というものです。 ブログ上部の「運営者について」に月毎の投稿数が分かる情報を表示するようにしているのですが、2023年は全ての月で10記事以上の記事を投稿し続けて、12月度はすでに9件の記事を公開しており、この記事が10個目の記事になります…

  • 2023年度のブログ活動の振り返り

    あっという間に今年も残り数時間で終わろうとしていますね。 今年度もありがとうございました。今年は多くの方に記事を読んで頂けて嬉しい限りです。 実は報告などはしていなかったのですが、2023年はある目標を立ててブログ(アウトプット)を続けてきました。 もしかしたら、勘付いている方もいるかもしれませんが、その目標とは「毎月10記事以上の記事を1年、投稿し続ける」というものです。 ブログ上部の「運営者について」に月毎の投稿数が分かる情報を表示するようにしているのですが、2023年は全ての月で10記事以上の記事を投稿し続けて、12月度はすでに9件の記事を公開しており、この記事が10個目の記事になります…

  • 2023年に読んで良かった本

    気づいたらクリスマスが終わっていました。本当に早いですね...。 前回、公開した「2023年に買って良かったもの」に引き続き、年末恒例の「~年に読んで良かった本」についても紹介していきたいと思います。 www.okb-shelf.work 買って使ってみて本当に良かった...と感じたものだけを紹介しているので、ぜひ合わせて読んでみてください。 今年はアウトプットをメインに活動したこともあって、昨年度と比べるとあまり本を読むことができませんでしたが、それでも何冊か衝撃・感銘を受けた書籍がありました。なんだかんだで新しい知識を得ることができる読書が好きで、気づいた時には書店に行ってしまいます。学生…

  • 今更ながらMATERIALIZED VIEW(マテリアライズドビュー)について学ぶ

    アプリケーションにおいて高負荷になりやすい処理の一つにレポート・データ集計があります。 リアルタイム性が求められる場合もあれば、ある時点までに集計されたデータを見れればOKなど、要件はさまざまですが、一般的にはデータベースに対して複雑なクエリや複数テーブルに対しての結合を行う必要があります。そのためデータ量に依存しやすく、リリース当初は問題なくレポートが見れていたのに、サービスの運用期間が長くなるとレポートが見えなくなったという話をよく聞きます。 この問題への対処方法の1つとして、データのキャッシュ化が挙げられます。 リアルタイム性は失われてしまいますが、ある時点までの集計がされているデータを…

  • 2023年に買って良かったもの

    早いもので2023年も終わろうとしています。 いやー、今年もあっという間でしたね。今年もたくさん記事を書いてきましたが、どうでしたでしょうか。 読者の皆さんをはじめ、僕の記事を読んでくださる方には頭が上がりません。本当にいつもありがとうございます。年末なので毎年恒例(?)の「〜年に買って良かったもの」の記事を書きたいと思います。 自称ミニマリストなんですが、なんだかんだで色々と買ってしまいました。 新居に引っ越して今年で2年経つのですが、長く住んでいるとモノが悪くなってきたり「うーん、何か違うなぁ...」と目につくものが続々と現れる一年間でした。 ということで、2023年に買って良かったと感じ…

  • NULL値が含まれるカラムにインデックスは有効なのか

    データベースで0対Nのモデルを表現する際に、よく外部キー制約とNULL許容の制約を定義することがあります。 値は特定のテーブルのIDもしくはNULLのどちらかを持つことになります。これを出版社(publishers)と書籍(books)のモデルをテーブルに落とし込んでみると以下のようになります。 基本的に書籍は出版社から出版されてbooksテーブルのレコードはpublisher_idで紐付けられますが、個人出版・データベースに登録されていない出版社から出版された書籍はpublisher_idにNULLを持つこととします。別途、個人か企業による出版かのカラムを持たせたり...と考えられることはあ…

  • Ruby3.4で追加されるブロックパラメーター"it"について

    先週、届いたRuby Weeklyに面白そうなトピックが紹介されていました。 Ruby 3.4 Will Have 'it' — There’s never been any doubt: Ruby has it. But now as well as the ‘it’ factor, it really will have it. Confused? it is a nicer looking shortcut to the first parameter in a block (a la _1) – e.g. arr.each { puts it }. Ruby 3.3 will warn…

  • データベースにおけるJSON型のカラムの使い所

    最近、データベースのテーブル設計を担当したり、既存のテーブル設計を見ることが多いです。 テーブルの設計書を見てみるとJSON型が指定されているカラムが目につくことがあります。既存のテーブルでもJSON型が使われている箇所がありました。 「json型を使うな!」というわけではありませんが、前から何度も言っているように設計やアーキテクチャというのは常にトレードオフです。JSON型のカラムについても同様にメリット・デメリットがあります。 今回はRDBにおいてJSON型を使っても良いケース、避けるべきケースについて個人的な所感を書いてみたいと思います。なお、今回の内容はSQLアンチパターンでも紹介され…

  • HonoのNode.jsランタイムにマージされた神PRを見てみる

    先日、Twitterにて素晴らしいツイートを見かけました。 うおおお。@usualoma さんの神PRをマージしたぞ。これでHonoがNode.js上で3倍近く速くなった!これはFastifyよりかは少し遅いけど、他のフレームワークと比べると十分速いレベルで、Node.jsの世界においてもHonoは第一選択肢に入ってもいい存在になった。https://t.co/mcAmUsQcUZ pic.twitter.com/pZiKy913rv— Yusuke Wada (@yusukebe) 2023年11月27日 このツイートはHono製作者のYusuke Wadaさんのもので、どうやらNode.j…

  • エアコンの分解洗浄をして内部の汚さに衝撃を受けた

    ある日のこと、ポストに「エアコンの分解洗浄しませんか?」という旨のチラシが入っていました。 今までこういったチラシが入っていたことはなくて、どうもエリアを移動しながら洗浄を行なっているようで、今回、たまたま自分の住んでいる場所が洗浄エリアになったようです。 エアコンの掃除はフィルターを夏と冬、エアコン初稼働の前に簡単に掃除するぐらいで、内部の洗浄までは行なったことがありません。 ただ吹き出し口から内部を覗いてみると、黒くなったホコリが気になります。 とはいえ、手が届かない上に賃貸に付属しているエアコンなので、壊してしまったらどうしよう...と思うと怖くてエアコン内部の洗浄には手が出ませんでした…

  • 中間テーブルへのデータ更新(削除・追加)を効率的に行う方法

    以下のようなテーブルがあったとします。 ユーザーは記事(posts)に対して、自由にタグ(tags)を設定することが可能です。 記事とタグは多対多の関係にあるため、中間テーブル(post_tags)にて記事へ設定したタグの一覧を管理しています。 仕様上、ユーザーは記事に設定したタグを自由に付け外しできます。 既存のある記事にタグA・Bが設定されている状態で、新たにユーザーがタグBを外して、タグCを設定したとします。最終的に中間テーブルには記事とタグA・Cが紐付くデータが残ります。 この場合、中間テーブルのデータ更新のアプローチには大きく2つのアイディアが考えられます。 全てのデータを一度、削除…

  • Cloud Run上でのexpressとhonoのパフォーマンス比較

    最近、JavaScript界隈の盛り上がりがすごいですね。 zigで作られたJavaScriptのランタイムであるbunは、その便利さ・パフォーマンスの良さから驚くような勢いで広まっています。その一方で新たな軽量WEBフレームワークhonoも非常に注目されています。 honoもbun同様にパフォーマンスが良く、エッジサーバーでの実行を想定しているようで非常に軽量です。Cloudflare Workersを筆頭に、さまざまなランタイム上での動作をサポートしておりbunも対象です。 github.com 話は少し変わりますが、自分はJavaScript(Node.js)でマイクロサービスを作る際は…

  • 毎朝、味噌汁を飲んでます(一汁一菜でよいという提案...を読んで)

    少し前から、ずっと調子が良かった肌が荒れてしまいました。 元々、敏感肌で弱いアトピー持ちで季節の変わり目や花粉が飛ぶ季節になると、肌が荒れることがあったのですが、今年は今まで以上に肌の調子が悪くなりました。さまざまな要因があるため「これが原因だ...」という断定は難しいのですが、原因の一つに食事があるのではないかと感じていました。 意外にも自炊はしっかりとしていて、カップラーメンや冷凍食品を口にする機会はほとんどありません。 ただ、朝ごはんだけは時間の都合でトースト1枚にジャムやマーガリンを塗って食べるというスタイルなのですが、どうもトーストやマーガリンに含まれる「トランス脂肪酸」が肌の調子を…

  • サブクエリとLEFT JOINのパフォーマンス比較(集計編)

    業務で集計処理を書く予定があるのですが、サブクエリとLEFT JOINのどちらを使って集計した方が良いのかを判断できませんでした。もちろん、データ量やデータ特性、トレードオフなどを踏まえて判断する必要がありますが、今後、同じような場面に遭遇した際にデファクトスタンダートとなるのはどちらかなのかをハッキリとさせておきたいです。 世の中には「推測するな。計測せよ」という言葉があるので、実際にサブクエリとLEFT JOINでそれぞれ集計処理を計測してみました。 結果的に今回のパターンではLEFT JOINの方がパフォーマンスが良かったです。 では、詳しく紹介していきます。 テーブル定義 以下のような…

  • 今更ながらHTTPのRFC(Status Code Definitions)を読んでみる

    みなさんはRFC読んでますか...🤔 自分は普段、ガッツリと読む機会はないのですが、新しいプロトコルを触るような場合に読んだことがある程度です。 過去にWebSocketを使ってSlackライクなチャットアプリを作ったことがあるのですが、その際にWebSocketのRFCを読んだことを覚えています。 しかし、WEB開発において最も使用しているであろうHTTPプロトコルのRFCを読んだことはありませんでした。 直近でいくらかAPIを設計する予定があって「良い機会だな...」と思うので、HTTPのRFCを読んでみようと思います。 といっても、文量が多いため、まずはステータスに関する項目(Statu…

  • サブクエリとLEFT JOIN

    テーブル定義 以下のようなテーブルがあったとします。 ユーザーはポストを任意の数だけ投稿できるように、中間テーブルuser_postsを定義しています。 PRIMARY KEYの設定のよる自動で作成されるインデックス以外にpostsテーブルにはpost_idとstatusの複合インデックスを定義しています。 これはpost_idとstatusによる絞り込みが同時にされることを想定しているため、一般的なアプリケーションでも同じようなインデックスが作成されるだろう...という仮定を元に定義しました。 今回、検証するのは「ユーザーごとに各ステータスのポスト数をカウントする」という集計処理です。 po…

  • sequelizeで全テーブルに対してTRUNCATEを実行する

    業務でsequelizeというNode.js製のORMマッパーを触る機会がありました。 単体テストを実行する度に、データベース(MySQL)のテーブルをクリア(全削除)するために制約を無視してTRUNCATEを全テーブルに対して実行したいのですがsequelizeでは対応するメソッドは提供されていませんでした。 // 外部キー制約のあるデータが存在しているとエラーになる await sequelize.truncate({ cascade: true, restartIdentity: true }); // テーブルに対応するモデル1つずつに対して実行する必要がある await User.d…

  • 【コピペでOK】はてなブログでソーシャルボタン一覧に「読者になる」を追加する

    前回の記事でブログのデザインを一新したとお伝えしました。 その対応の一部として、はてなブログの「読者になる」ボタンをソーシャルボタンの一覧に表示するという対応を行なっています。 この位置を採用したのは、記事を読み終えた後にアクションを行うボタン群をまとめて表示したかったからです。 合わせてボタンは独自にカスタムしたものを採用しています。 というのも、はてなブログが提供している「読者になる」ボタンは何とも言えないデザインかつiframeのためサイズ調整などが難しいです。 さらにボタン右側には読者数が表示されるのですが都度、データを取得しているようで表示まで時間がかかってしまいます。ユーザーが「こ…

  • Rubyの新たなテストフレームワークtldrの紹介

    またもやRuby Weeklyで面白そうなgemが紹介されていました。 Ruby製の新たなテストフレームワークtldrというものです。すでにRspecやMinitestが人気を博している中、なぜ新しいテストフレームワークの実装を始めたのでしょうか。気になったので色々と調べつつ、試してみました。 なお、本記事で引用している内容は全て「The TLDR on Ruby's new TLDR testing framework」からの引用です。 tldrの作者であるジャスティンさんが投稿している内容なので、ぜひ合わせてご覧ください。 blog.testdouble.com tldrのコンセプト TL…

  • ミノウラ DS-2200が自転車縦置きの夢を叶えてくれた

    移動手段として自転車(シクロクロス)を使っているのですが、防犯の都合で室内で保管しています。 ただ、部屋に自転車を置いてみると、その存在感には驚かされます。 思っているよりも大きいのと、部屋の面接をかなり占有してしまいます。結果的に「自転車、邪魔やな〜」と思ってしまう時がありました。 以前から「自転車を縦置きできないものかな...」と検討していました。 ただスタンドの頑丈・安定さ、シクロクロスでも問題ないのか、キャリアが付いていても縦置き可能なのか...と懸念点がいくつかありました。ただ、悩んでいても何も始まらないなと思い立って、この度、ミノウラのDS-2200という縦置き可能なスタンドを購入…

  • 弊社の技術ブログに「Rubyで簡単なCSVパーサーを作ってみる」を投稿しました

    先日、ヘイシャの技術ブログに記事を投稿しました。 簡単に内容を紹介すると、RubyでCSVファイルをパースして標準ライブラリcsvが提供しているCSV.readと同じように最終的に二次元配列に変換する処理系をフルスクラッチで実装するというものです。コードは最終的には50行程度で、簡単なCSVパーサーが完成します。簡単のためオプションには対応していないです。 techlog.n2i.jp 投稿した記事内・過去の記事でも触れていますが、Rui Ueyamaさんの低レイヤを知りたい人のためのCコンパイラ作成入門に感銘を受けており、CSVパーサーの処理系はCコンパイラの処理系に似たような感じになりまし…

  • ブログのデザインを一新しました

    すでにお気づきの方もいるかもしれませんが、ブログのデザインを一新しました。 元々はEpicというテーマを使っていたのですが、悩みに悩んだ結果、新しくkewpiedesignさんが公開されているgrayにテーマを変更しました。 今回、テーマを変更するにあたってシンプルな 1 カラムのテーマに対象に絞りました。 従来のデザインはさまざまなコンテンツが左右・ページの下部に配置されており、ユーザーに対して、さまざまな行動を期待していました。自分としてはブログ内の動線を増やした方がPV数・ページ回遊性が向上するため嬉しいのですが、結果的にコンテンツがごちゃごちゃしていて、読むことに集中できないのではない…

  • RubyでGUIが触れるglimmer-dsl-libuiの紹介と内部実装について

    先日、SubscribeしているRuby Weeklyからメールが届きました。 何やらRubyでGUIが触れる「glimmer-dsl-libui」たる、とても面白そうなgemが紹介されていました。 このgemは福岡Ruby2022でスペシャルアワードを受賞しており、とても注目されているgemのようです。 github.com GUIを触ろうと思うと、低レイヤーが扱える言語が対象に上がるイメージがありますが、何とRubyでGUIが作れてしまう...というのが驚きです。 どんなgemなのか気になったので少し触ってみました。 gemのインストールのみでGUIが作れる 何よりも驚いたのがglimme…

  • 知ってるようで知らない$PATHについて調べてみた

    プログラミングを始めたばかりの頃、Python3をインストールするべく環境構築に取り組んでいました。 その際によく見かけたのは「パス($PATH)を通す」という言葉です。当時の自分には何のことだか全く分からず「なんでプログラミングのインストールにバスケじゃあるまいし、パスが必要なんだろう...」と思ったものです。 今になっては、なぜパスを通す必要があるのか理解しているつもりです。 しかし、実際にどのように環境変数$PATHが使われているのかまでは知りません。 何かしらのコマンドをインストールする際にどうしても流れ作業的に$PATHを通しているので、あまり深く考えたことがありませんでした。 今回…

  • RubyでgRPCをサクッと試してみた

    最近はマイクロサービスを検討することが多いです。 マイクロサービスにおいて、よく問題となるのはサービス同士のやりとりをどのように行うかです。オーソドックスな選択肢としてはAPIを作成してHTTP通信で呼び出すという方法が候補に上がりますが、リクエスト数・量が増えてくれば、通信のオーバーヘッド、データ効率といった点で苦しくなってきます。 次に選択肢に上がるのはRPC、近年だとHTTP2を使用するgRPCでしょうか。 HTTP通信と比べると通信のオーバーヘッドも少なく、データ効率が良いため頻繁にやりとりが必要となるマイクロサービスとの相性が良いとされています。ただ、RubyでgRPCを使う...と…

  • 今更ながら「オブジェクト指向でなぜ作るのか」を読んだ

    今年は昨年度と比べるとあまり技術書を読んでいませんでした。 というのも今年はとにかくコードを書くこと、実装をすることに重きを置いていたからです。ただ、最近、活字が頭にスッ...と入ってこないのを自覚しており、読書リハビリしないとダメだなと思っていました。 そんな中、いつものように書店を徘徊していると名著「オブジェクト指向でなぜ作るのか」と目が合いました。 オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識作者:平澤 章日経BPAmazon 何か運命的なものを感じたので、即購入しました。 しばらく積読していたのですが、先日から読み始めた所、内容が面白く…

  • MarkdownパーサーをWeb Assemblyにして公開しました

    先日、以下の記事を公開しました。 タイトルの通り、Golangを使ってMarkdownをHtmlに変換するパーサーを作ってみたよ〜という記事です。 www.okb-shelf.work ただモノを作ったのに公開しないのはもったいないな...と思ったのでGolangのコードをWeb Assemblyに変換して、github pagesにデプロイしました。今回は、デプロイしたモノの紹介とWeb Assemblyを選択した理由について書きたいと思います。 公開したもの 作りは非常にシンプルで画面上部にMarkdownを記述するテキストエリアがあります。 ここへMarkdown形式のテキストを記入して…

  • Markdownをhtmlに変換するパーサーを作った

    最近はパーサーの実装にハマっており、直近だとRubyでJSONパーサー(json形式のテキストをRubyのハッシュに変換)を作りました。 www.okb-shelf.work 少し間が空いてしまいましたが、今回はMarkdown形式のテキストをhtmlに変換するパーサーを作ってみました。 本当はもっと早く記事にできる予定だったのですが、実装にかなり手間取っていました。3日もあれば完成するだろう...と思っていたものの、結果的に2週間もかかってしまいました。 今までRubyを使って実装してきましたが、今回は気分転換のためにGolangを選択しました。 久しぶりにGolangをゴリゴリと書けたので…

  • Rails7.10にて提案した内容がリリースされた

    少し前にはなりますが、RailsのDiscussionに問題提起を行いました。 その後、Discussionで「Issueを作成して良いよ〜」とお許しを頂いたのでIssueを作成した所、修正PRが作成されてマージされるという...とんでもない出来事がありました。 www.okb-shelf.work とはいえマージされたものの、リリースはされていませんでした。 いつリリースされるのかな...と思い最新のRails7.10のリリースノートを見ていたら、なんと対応がリリースされていました! 変更について リリースノートを見ながらコードの差分を確認してみました。 Rails7.0.8の時点では、該当…

  • PNGファイルの中身(バイナリー)を覗いてみる

    みなさんはバイナリデータの中身を覗いたことがありますか。 僕は普段、WEBアプリケーションの開発に携わっているのですが、どうしてもこういった領域とは接点がありません。一度、WireSharkというアプリケーションを使って自身のPCから外部に送信されているパケット(バイナリデータ)の中身を覗いたことがあるぐらいです。 先日、システムコールを使ってTCPサーバーを実装したように、最近は触れたことのない領域にトライしています。 今回はPNGファイルを読み込んで、中身を覗いてみたいと思います。 具体的にはPNGファイルを指定バイトずつ読み込んで、どんな値が指定されているのかを確認していきます。 PNG…

  • 無印良品の白桃グリーンティーが廃盤になっていた

    無印良品から発売されている「白桃グリーンティー」が好きでよく飲んでいました。 ところが先日、白桃グリーンティーのストックがなくなってしまったので、無印に買いに行くと...なんと白桃グリーンティーがどこにもありません。 無印は突然、商品を廃盤・パッケージチェンジすることがあります。 もしかしたら白桃グリーンティーが廃盤になってしまったのかもしれません...。

  • TCP経由で音声(mp3)を配信してクライアントで再生させてみた

    以前、システムコールを利用して簡単なTCPサーバーを実装しました。 www.okb-shelf.work hello worldという文字列が返るだけのジンプルな実装になっていましたが、他にも音声や動画といったデータをTCPを通じて送れるのか気になりました(...送れると思います)。 現代ではYouTubeやSpotifyといった音声・動画を配信するサービスが多くなりましたが、同じようなことが自分の実装で可能なのでしょうか。 今回は実装したTCPサーバーを拡張して音声ファイルを配信してみようと思います。 できたもの コード量が増えてきたのでGithubにて公開しました。 前回と同じようにサーバ…

  • 【OBSで使用可能】スプラトゥーン3の武器をランダムで表示するサービスを公開しました

    最近、Twitchでスプラトゥーン3のプレイを配信しています。 その中でただプレイするだけだと面白くないので、武器をランダムで選択してバンカラマッチ(対戦)できたら面白いかも...と思ったのですが、配信でいい感じに使える武器をランダムに選択してくれるサービス・ツールを見つけることができませんでした。 どうしようか...と思っていたのですが「無いのなら自分で作れば良いじゃない」と思い立って、スプラトゥーン3の武器をランダムに選択するサービスを作成して公開しました。 okabe-yuya.github.io 使い方 操作はとてもシンプルで、画面下に表示されるスタートを押すのみです。 現時点(202…

  • 【はじめてのシステムコール】ソケットでTCPサーバーを実装する

    みなさんはシステムコールについてご存知でしょうか。 システムコールを一言で説明すると、OSのサービスを利用する際に呼び出しされる機構のことです。 普段、WEBアプリケーションの開発をしている自分にとってシステムコールは、あまり馴染みのあるものではありません。しかし、システムコールを自分で直接、呼び出していないだけで、ファイル操作やディレクトリ変更(cd)を行うと裏側ではシステムコールが発行されています。 なので遠いような...近いような...不思議な存在なわけです。 今まで明示的にシステムコールを呼び出したことがなかったので、今回はシステムコールを使って簡単なTCPサーバーを実装してみたいと思…

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

    僕がプログラミングを始めたばかりの頃はPythonを使って、データ処理・分析、機械学習といった内容に取り組んでいました。 当時、業務(アルバイト)ではCSVファイルをpandasで読み込んで、前処理をしてmatplotlibを使ってグラフを描画して...というサイクルをひたすらに繰り返していたものです。 そのおかげもあって「データ処理からのグラフ描画」というフローは、一般的なWEBアプリケーションの開発を担当しているエンジニアの方と比べると、少しばかり自信があります。 現在では、機械学習の領域から離れたということもあって、以前のような業務をすることはなくなりWEBアプリケーションの開発がメイン…

  • Elixirでシンプルなロードバランサーを実装してみた

    先日、Twitterを見ていると面白そうな記事が紹介されていました。 少し古い記事ですが、シンプルなロードバランサーをRustで実装してみたとのこと。凄いですね...。 qiita.com ロードバランサーと聞くと何やら難しそうなイメージがありますが、記事内で実装されているのは2種類のヘルスチェックを行うという非常にシンプルな仕様となっていました。 「これなら自分でも作れるかも...」と恐縮ながら、感じたので作ってみました。 記事ではRustが採用されているのですが、状態管理の排他制御にMutexを使用していますが、排他制御をあまり考えたくないのでElixirを採用しました。 また書き慣れてい…

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

    先日、Rails製のアプリケーションのパフォーマンス検証をする機会がありました。 計測したいのはメモリ使用量と実行時間の2つです。後者の実行時間に関してはRubyが標準ライブラリとして提供しているbenchmarkを使えば事足りますが、前者のメモリ使用量となるとRubyでは計測する方法が限られてきます。 どうしたものかな...と調べていたところ、以下の記事を発見しました。 nishinatoshiharu.com Rubyでメモリ使用量を計測する2つの方法が紹介されています。 ObjectSpace.memsize_of_all: Rubyオブジェクトが使用するメモリの総量 rss: OSの1…

  • ロジクールのイェティXはとんでもない高性能マイクだった

    一週間前にロジクールのBlue Yeti Xというマイクを購入しました。 今まで通話にはiPhoneに付属してくるイヤホンマイクをずっと愛用しており、音質には全くこだわりがありませんでした。むしろ、iPhone付属のイヤホンマイクで十分だと思っています。 ただリモートワークでの音質向上、今後、ライブ配信なんかもしてみたいなぁ...と思い高音質のマイクを探していたところ、多くの方がオススメしており、レビューの評価も良いロジクールのBlue Yeti Xを選択しました。 元々はBlue Yetiを購入する予定だったのですが、最終的にはBlue Yeti Xを購入することにしました。 ロジクール G…

  • RubyでJSONパーサーを作ってみた

    最近、パーサーを実装したい欲が高まっています。 というのもRui Ueyamaさんの「低レイヤを知りたい人のためのCコンパイラ作成入門」を読み進めて、再帰下降構文解析をはじめとしてパワフルな実装に非常に魅力を感じているからです。 資料に合わせてCコンパイラを作るのは楽しいですが、どうしても写経になってしまうため、何か自分でパーサーを作りたいと思っていました。 先日はbullet.logをパースするgemを作成してリリースしましたが、あっさりと作れてしまったので、もう少し難易度の高いテーマを探していました。 www.okb-shelf.work どういうわけか「JSONファイルがいいんじゃ...…

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

    先日、弊社の技術ブログに久しぶりに記事を投稿しました。 内容としてはOSSのコードを初めて読む人に向けて、どのような流れでコードを読んでいくのかを実際のOSS(gimei)を用いて紹介していくという記事です。 techlog.n2i.jp 本当は自分のブログに投稿したかった内容です。 とはいえ、チームのメンバーに「OSSのコードを読み始めるきっかけになってほしい」という思いで投稿しました。 ...というのも以前から、以下のような話をチームのメンバーから聞いていたからです。 OSSのコードを読んでみたい 実際に読むとなるとハードルが高くて、何からやればいいのか分からない コード量が多すぎてどこか…

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

    業務中に以前、自分が書いた記事を読み返す機会がありました。 www.okb-shelf.work JOINを使っているSQLを高速化できないかと思って新規インデックスの作成を検討をしていました。 ただし、過去の記事にも書いた通り「結合述語にインデックスを作成しても、ハッシュ結合のパフォーマンスは良くならない」という事実があります。 ただ、前回は知識として「そうなんだ」という理解をしたものの、実際にインデックスを作成前後で、JOINのパフォーマンスが変化しないことを確認までしていませんでした。自分の理解をより深めるために実際に計測してみたいと思います。 サンプルデータについて 以下2つのテーブル…

  • sidekiq.ymlファイルの文字列に環境変数を埋め込む

    sidekiq.ymlではERBがサポートされており、環境変数を指定することが可能です。 よく環境変数が使われるのは、並行度(concurrency)の値やタイムアウトの秒数などでしょうか。 :concurrency: <%= ENV.fetch('SIDEKIQ_CONCURRENCY', 10) %> こんな感じでsidekiq.yml内で、環境変数を扱うのは非常に簡単です。 ですが、文字列(値)に環境変数を埋め込むにはどうすれば良いのでしょうか。 今回、自分がやりたかったのはcronの設定値の実行間隔(分)の部分だけを環境変数から指定するというものです。 # 30...の箇所を環境変数か…

  • Jupyter NotebookでRubyを実行する

    少し前のRubyWeeklyの中に、非常に面白そうな記事が記載されていました。 nithinbekal.com Jupiter Notebook上でRubyのコードが実行する方法が紹介されていました。 計算領域で強いJuliaが、Jupyter Notebookで実行可能というのは前々から把握していたのですが、まさかRubyがJupyter Notebook上で実行できるとは...。 使用したい場面があるのか全く分かりませんが、面白そうなので試してみます。 実行環境の用意 色々とインストールするのが手間なので、Docker上で完結するようにしました。 docker compose upを実行す…

  • スプラトゥーンにおける自責と他責

    最近はスプラトゥーン3にハマっていて毎日、1時間ぐらいコンスタントにプレイしています。 一人でやることも多いのですが、同居人と一緒にプレイすることもあります。過去作と比べるとラグがひどかったり...と賛否両論あるようですが、個人的にはとても楽しくプレイしています。 わかばシューターで塗りまくって盤面をコントロールするのが楽しいです。 しかし、ゲーム自体は面白いのですが、思うように試合に勝つことができないと「味方弱すぎる!」とイライラしまうことがあります。 ひどい時には声にだしてしまうことも。そんな自分のイライラっぷりを見て同居人からは「味方に優しくしてあげて」と怒られてしまいました。 なぜ勝て…

  • 【書評】ソフトウェアアーキテクチャの基礎はアーキテクト最初の一冊にピッタリ

    先日、オライリーより出版されている「ソフトウェアアーキテクチャの基礎」を読了しました。 ページ数はそこそこの書籍でしたが、少しずつ少しずつ...読み進めて約1ヶ月で読了することができました。 ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ作者:Mark Richards,Neal FordオライリージャパンAmazon 今回は「ソフトウェアアーキテクチャの基礎」についての書評を簡単にまとめてみたいと思います。 この書籍の内容を一言で紹介するならば「アーキテクチャとは常にトレードオフであるものを理解せよ」といった感じでした。 全てはトレードオフ 僕自身はアーキテクト…

  • bulletのログファイルをパースするgemをリリースしました

    ActiveRecord上のN+1問題を検知するbulletというgemがあります。 bulletを仕込んでおく事でbullet.logファイルに該当箇所でN+1問題が発生している旨のログが出力されるようになります。どんな対応をすれば良いかまで提案してくれる...非常に賢いですね。 2023-08-15 15:20:31[WARN] user: okabe GET /api/v1/products/tags USE eager loading detected Product => [:product_tags] Add to your query: .includes([:product_t…

  • ピュアなRubyだけで複数のLoggerに出力する

    RubyにはLoggerクラスが組み込みライブラリとして提供されていて、ログをいい感じに出力することができます。 しかし、複数のロガーに対してログを出力することはLoggerクラスだけでは出来ません。RailsであればActiveSupport::Logger.broadcastが使えるそうですが、ピュアなRubyでも同じことがやりたいです。 blog.takady.net 利用シーンとしてはライブラリや自作gemを想定しています。 またピュアなRubyだけで実装することで配布時のファイルサイズを削減することが可能です。 できたもの ということで...複数ロガーを管理するクラスを定義しました。…

  • Rubyにおける並行処理と使い分けについて

    Rubyで並行処理をしたい場合、いくつか選択肢が考えられます。 自分がパッっと思いつくものを列挙しただけでも、これだけの選択肢が出てきました。 Thread Process Fiber Async Ractor Concurrent Ruby 単一サーバーにおける並行処理では基本的にはスレッドかプロセスを使う方法が一般的かと思いますが、これだけ選択肢を出されてしまうと一体、何を使えば良いのか分からなくなってしまいます。事実、僕もRailsで並行処理をするようなケースでは毎回、調べては選定をしています。 自分のためにもそれぞれの特徴とどのようなケースで使用するのが良いかを簡単にまとめてみました。…

  • 書籍「君たちはどう生きるか」は子供に読んでほしい本だった

    先日、スタジオジブリ最新作の「君たちはどう生きるか」を見てきました。 映画の感想については賛否両論あるようですが、僕の感想としてはポニョやハウルのようなストーリー面での楽しさはないものの、さまざまな謎や問いが劇中でされており「君はどう思う?」と感じました。これが面白いという感覚なのかは分からないです。 本作のタイトルとなった吉野源三郎さんの「君たちはどう生きるか」が気になったので読んでみました。 元より劇中に著書が描写されるシーンがあるものの、映画のストーリーと書籍の内容は全く異なっていました。自分にはなぜタイトルを拝借したいのか全く分かりかねますが、宮崎駿が幼少期に「君たちはどう生きるか」を…

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

    Rails製のアプリケーションのコントローラーの単体テストを見ていると内部で使用しているクラスやモジュールの観点・パターンまでを網羅したファットな単体テストが書かれているものを見かけます。しかしながらコントローラーの単体テストはあくまでコントローラーの責務について注目して書かれるべきであって、内部で使用しているクラスやモジュールの観点・パターンにまで踏み込む必要はありません。 ではコントローラーの単体テストで内部で使用しているクラス・モジュールがある場合に、どのように単体テストを書けば良いのでしょうか。 自分がよくやるのは、呼び出し時の引数を確認するという方法です。 サンプルコード 以下のよう…

  • 【ええな〜コード】irbから定義された関数のソースコードを表示する

    irbの実行環境から定義されている関数のソースコードが見たいなぁ...と思いMethodクラスのドキュメントを眺めていたのですが、そのようなメソッドは提供されていませんでした。代わりではありませんがsource_locationたる関数が定義されているファイル名と定義された箇所の行数を配列で返すメソッドを発見しました。 上手くソースコードを出力できないかと試していた所、すでに実現しているgemを発見してしまいました。 github.com 実はpryでソースコードを表示するために、このmethod_sourceが使われているそうです。 初版のリリースが13年前ですが、保守されており現行のRub…

  • Rubyにおけるカリー化(Method.curry)と関数合成(<<)

    RubyのMethodクラスの公式ドキュメントを読んでいた所、面白いメソッドを発見しました。 なんとメソッドをカリー化してProcにした値を返してくれるcurryというメソッドがありました。 Rubyではカリー化が簡単には出来ないと思っていたのですが、こんなメソッドが提供されていたとは...。 docs.ruby-lang.org カリー化は可能だが、関数からProcを返すようにする必要があり面倒... class Sample def self.add(n) Proc.new { m n + m } end end f = Sample.add(1) puts f.class # Pro…

  • OpenStructの存在に気づいた時にはすでに非推奨だった

    Rubyを業務で書き始めて3年目になりますが、まだまだ知らないことばかりだなぁと思わされます。 先々週に届いたRubyWeeklyに構造体(struct)について解説している記事が紹介されており、気になったので記事を読んでみるとOpenStructという自分が全く知らない構造体が登場しているではありませんか。 要素(フィールド)を動的に追加・削除することが可能という点でOpenStructは通常の構造体とは異なっています。 通常の構造体 Address = Struct.new(:city) address = Address.new("gifu") address.city = "nagoy…

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

    ある日のこと、業務中にチームメンバーから非常に面白い質問がありました。 「インスタンス作成時の値によって関数の定義を変えることって可能ですかね?」 ...とのことです。 どういうことかをもう少し詳しく聞いてみると、以下のようなイメージを持っているようでした。 class Sample def initialize(kind) end end # kindがfooだったら Sample.new(:foo).func(:hello) # kindがbarだったら Sample.new(:bar).func(:hello, :world) これをやりたい理由としては、kind: fooの時にはfun…

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

    いつものようにプロダクトのコードを読んでいた時のことです。 コード内に「Aを変更したらBも変更してね」という旨のコメントがいくつか記載されていることに気づきました。 def do_something # ここを変更したらlibのdo_somethingも変更すること : end このコメントに対して個人的にモヤッ...と感じる部分があるので、自分の考えをまとめてみたいと思います。

  • RuboCopに勝手にオレオレCopを実装してみる

    前回、RuboCopの処理を追いかけました。 長い旅になりましたが、なんとかRuboCopのコマンドが実行されてから画面に結果が出力されるまでの流れを完全に理解しました。せっかくコードを読んだわけなので何かしらの変更が出来ないか試してみたいと思います。 以前、知人からRuboCopにはカスタムCopを設定できるという話を聞いたので、カスタムCopならぬ本体へのCopの追加をやってみました。 今回、追加するCopは「変数名にpが使われている際に警告を出力する」という非常に簡単なものです。 Rubyでは標準出力を行うpという関数が用意されています。 そのためp = ...という変数宣言があると、出…

  • Rubyの出力関数(p pp puts print printf)の違い

    Rubyには標準出力するための関数が複数、用意されています。 今更感はありますが、自分が把握しているだけでも5つも関数がなり、一体、何が違うのやら...。 puts p pp print printf それぞれの出力結果を見比べながら、どのように使い分けるべきかを考察してみたいと思います。 puts 最もよく使われている標準出力がputsではないでしょうか。 putsは指定された値を出力しつつ、改行(\n)を出力してくれます。またドキュメントを見て分かるようにputsは引数を複数(*args)、指定することが可能です。 puts "hello" # hello puts "hello", "w…

  • Rubyのバージョンアップによってエラーが発生するようになった

    バージョンアップによって既存コードが動かなくなる(エラーになる)という現象に初めて遭遇しました。 話には聞くものの、経験したことがなかったので「本当にあるんだ...」と謎に嬉しい気持ちになりました。 バージョンアップをしたのはRuby本体のバージョンです。 元々はRuby2.7系だったものを、少し前にRuby3.1系にバージョンアップしました。しかし、バージョンアップをした当時、エラーが発生するようになっていることには気づいておらず、先日、エラーログの調査する中でようやく気づきました。幸か不幸かあまり使われていない機能だったため、エラーログがほとんど出ていなかったのです。 該当のメソッド エラ…

  • 【Part2 / 2】RuboCopの結果が出力されるまでの実装を追ってみる

    ※この記事はRuboCopの内部実装を読んでみるシリーズの第2記事です。 前回の記事でターミナルでrubocopコマンドを実行するとRuboCop::CLIクラスのrunが呼び出されて、紆余曲折あって各Copのチェックがコールバックとして呼び出されていることが判明しました。そのまま処理を追いたかったのですが、記事が長くなり過ぎたので2つに分割しました。本稿を読んで頂くにあたって前回の記事の内容が深く関わってくるので、ぜひ前回の記事もご覧ください。 [TODO: ここに記事のURLはる] 今回はCopのコールバックが実行されてから結果が画面(ターミナル)に出力されるまでを追っていきます。 Cop…

  • 【Part1 / 2】RuboCopの結果が出力されるまでの実装を追ってみる

    ※この記事はRuboCopの内部実装を読んでみるシリーズの第1記事です。 ある日のこと、いつものようにRuboCopに怒られた際に「RuboCopってどうやって作られてるのかな...」と唐突に気になってしまったのでコードを読んでみることにしました。最初は数日あれば終わるかなと思って始めたのですが、甘かったです...。気づけば二週間も時間が過ぎていました。 全てを詳細に紹介することは情報量の都合上、厳しいのでコアの部分を中心に紹介します。 途中、処理が飛んだりしますが気になった方はぜひ自分でコードを読んでみてください。RuboCopのコードを読むに当たってローカル環境でbinding.irbを仕…

  • RubyでArrayクラスを継承させると面白いことが起きる

    後に改めて記事を書きますが、最近はRubocopのコードを読み進めています。 そんな中で「面白いなぁ...」と感じたコードがあったので紹介がてら動作を確認してみたい思います。 なんと定義されたクラスがArrayクラスを継承させているではありませんか。 module RuboCop module Formatter # Arrayクラスを継承させている! class FormatterSet < Array : end end end rubocop/formatter/formatter_set.rb#L10 FormatterSetクラスは別ファイルに定義された、様々なFormatter(結…

  • Ruby東海 第79回 勉強会に参加してきました

    昨日、Ruby東海 第79回 勉強会に参加させて頂きました。 主催者・参加者のみなさん、お疲れ様でした。非常に楽しい時間を過ごさせて頂きました。 rubytokai.doorkeeper.jp オフラインの勉強会に最後に行ったのが、コロナウイルスが流行り出す前だったので実に約3年ぶりの参加でした。 会場が弥生株式会社さんのセミナールーム(木曽川)で、なんと過去に清流elixirの勉強会を開催していた頃に一度、利用させて頂いたことがあります。その節は本当にありがとうございました。 あの頃から木曽川が何も変わっていたなかったので、岐阜出身の自分は謎に安心しました。 簡単に参加レポートを書いていこう…

  • ステータスを返すだけのAPIをほぼ無料・爆速でCloud Runに作成する

    ただスタータスを返すだけのAPIが別のホストに必要になったので作ってみました。 多くのケースではPrismでモックサーバーを立てれば十分ですが、ヘッダーにPreferの指定ができない上に固定のステータスが返ってくれば良いだけだったので自分で作ることにしました。 stoplight.io 今回はGoogleCloudPlatform(GCP)のCloud Runにgoで作った簡易なサーバーをデプロイするという選択をしました。Cloud Runは従量課金制ですが、呼び出す回数が少ないので無料枠に収まる想定です。また実装にgoを選定したのは、この手のミニマムのサーバーを作るのが楽だからです。 ソース…

  • gemにbinding.irbを仕込んでデバッグする方法

    OSSのコードを読むときは基本的にgithub.devを使っていますが、最近、限界を感じています。 というのも巨大なコードベースを持つOSSの場合は処理を追うだけで大変です。その上、この変数には〇〇クラスのインスタンスが...。この関数の引数には△△が指定されて...と自分の脳(揮発性メモリ)では非常に辛い作業です。 最近はrubocopのコードを読んでいるのですが、何度も「ローカル環境で実行できればなぁ...」と感じていました。 そんな中、技術書典で「Rails のコードを読む」という書籍を購入して読み進めていると、ローカルでRailsにbinding.irbを仕込んでデバッグする方法が紹介…

  • ChatGPTがついた嘘をはじめて見抜けなかった

    以前より「嘘は嘘であると見抜ける人でないと(ChatGPTを使うのは)難しい」と言われています。 例えば「スラムダンクはサッカー漫画です」というような、明らかな嘘であれば簡単に見抜くことが出来ることができますが、微妙な嘘の場合はどうでしょうか。 先日、業務中にChatGPT(バージョンは3.5)に「Rubyで配列がソート済みかどうか判定したい」という旨の質問をした所、以下の答えが返ってきました。 ChatGPT: Rubyで配列がソートされているかどうかを判定するには、Arrayクラスのsorted?メソッドを使用することができます。 ( ´ω` )…ChatGPTは賢いなぁ sorted?と…

  • 話題のコグナビ転職(cognavi)を使ってみた感想

    よく「エンジニア」というキーワードと関連して検索されている単語をGoogle広告で見ています。 最近「コグナビ」というキーワードが頻出していることに気づきました。「コグナビって何だろう?」と気になったので調べてみると、2019年頃にリリースされたエンジニアをメインターゲットにした主に理工系向けの新卒・転職サービスでした。LPには長澤まさみさんやガンダムにシャア・アズナブルが起用されており気合いを感じます。 エンジニアの採用は「コグナビ」 株式会社フォーラムエンジニアリング コグナビの特徴としてスキルツリーによるマッチングというコンセプトがあり、自身が入力したスキルをツリー化してくれます。一…

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

    先日、しばらく積読してしていた「達人プログラマー 第2版」を読了しました。 達人プログラマー(第2版) 熟達に向けたあなたの旅 Ohmsha この書籍について改めて自分が語る必要がないぐらい有名な書籍で、著者は伝説のプラグラマーであるDave Thomas(デイブ・トーマス)とAndrew Hunt(アンドリュー・ハント)の二人です。何よりも驚くべきなのは「達人プログラマー(The Pragmatic Programmer)」は20年も前に書かれた書籍であるという点です。 現在では第2版が発売されているわけですが、その原型は20年前に作られました。現在も多くのエンジニア・プログラマーに支持…

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

    先日、Rubyで文字列を指定数分だけ繰り返す処理を書いていた所、面白い現象に遭遇しました。 文字列を繰り返すために*を使ったのですが「文字列 * 数値」の場合はエラーが発生せずに望み通りの値が返るものの、順序を逆にして「数値 * 文字列」とするとエラーが発生します。 puts "s" * 5 # sssss puts 5 * "s" # Main.rb:3:in `*': String can't be coerced into Integer (TypeError) # from Main.rb:3:in `<main>' どちらの呼び出し方でもエラーが発生せずに使えると思っていたのですが、…

  • 【ええな〜コード】フェイクデータ作成gemのfakerはどのようにして作られているのか

    僕は技術のキャッチアップのために、定期的にgithubのトレンドを見ています。 最近、Rubyのカテゴリで「faker」という昔から使われているフェイクデータを作成するgemがよくトレンドに上がっており、リリースも今現在(2023年6月)も活発にされているようです。 github.com fakerのようなフェイクデータの作成を行うライブラリは様々な言語で公開されており、単体テストを書く際に重宝しています。ユーザー名やメールアドレスを作成してもらえるのでデータの用意が非常に楽になります。fakerの存在自体は前から知っていたのですが、どのように実装されているのか、裏側で何が処理されているのかま…

  • RailsにIssueを立てたらPRが作成されてマージされた

    とんでもないことが起こりました。まじでやばいです。 前回の記事で共有したように「RailsのgithubにIssueとして気軽に立てて良いよ〜」という旨の返信をJean Boussierさんから頂いたので、RailsのIssueを作成してから3日ほど経過しました。 www.okb-shelf.work しばらく何も反応がなかったので「やっぱりダメかぁ...」と思っていたところ、事態が急変したのです。 対応のPRが作成・マージされた なんとJean Boussierさん自ら対応のPRを作成してくれました。 github.com 元々はRailsの起動に影響がないように警告のログを出すという対応を…

  • リモートワーカーがジムに通って筋トレを始めたら生活の質が上がった

    早いものでリモートワークが始まって3年になります。 リモートワークが始まる以前は当然ですが毎日、オフィスに出勤していました。特に駅までの片道30分の自転車移動が大変だったのですが、今になって思うと非常に良い運動習慣になっていましたし、大学生の頃からずっと駅まで自転車で行っていたので寂しさもあります。 しかし、リモートワークになったことで自転車通勤をする必要がなくなり、圧倒的に運動不足になってしまいました。ありがたいことにまだ若いので、それほど健康に害を感じることはなかったのですが、寝起きに腰が痛い時があるという現象に遭遇するようになりました。 最初は「マットレスのせいかな?」と思っていたのです…

  • Rails Discussionに投稿したら返信が来てgithubにIssueを作成した

    早いもので一年も折り返し...。東海地方もいよいよ梅雨入りしてジメジメした季節になりました。 先日、cache_storeの設定に環境変数を指定してInterger型に変換しないと、キャッシュの書き込み時にエラーが出るという現象を確認しました。この振る舞いに疑問を感じたので、RailsのコントリビュートガイドにならってRails Discussionに投稿をしてみました。 詳細は前回の記事をご覧ください。 www.okb-shelf.work ぶっちゃけ、反応ないんだろうなぁ〜と諦めていた部分はあったのですが、なんと嬉しいことに素晴らしいアイディアと共に返信を頂くことが出来ました。 返信が来た…

  • Rails Discussionに投稿をしてみた

    「今年こそは...今年こそは...OSSに貢献するぞ...!」と思い気づけはや3年。 気持ちだけが先行して何をしたら良いのか分からず。結局、それらしいことは何もしていませんでした。 ですが、先日開催されたRubykaigi2023(コロナになって行けなかったけど)へ参加した方のツイートや、参加レポートを見て何かOSSに貢献できればなぁ...と改めて感じました。 product.st.inc 言ってみれば業務でよく書くRubyもRailsも誰かが日夜、メンテナンスしてくださっているお陰で僕は飯が食べられています。本当に感謝しかありません。よく「〇〇言語はイケてない」だの「gemがメンテナンスされ…

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

    最近はチームビルディングについて思い悩まされる日々を過ごしています。僕は過去に外部メンターの方からマネジメントにおいて重要なのは「ティーチングとコーチングの違いを理解すること」だと教えて頂きました。 www.okb-shelf.work 当時は教育を担当しているエンジニアの方に言語の文法や仕様についてなど、今よりも低い視座で経験を積んでいました。しかし、時が立ってメンバーが成熟したことで、文法や仕様について僕がとやかく言うことはなくなり、より組織構成やチームビルディングといった視座の高い課題に取り組めるようになりました。 今になって思うと、当時の僕はティーチングとコーチングの違いについて認識し…

  • 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'); INSERT INTO test1 VALUES (FALSE, 'non est'); SELECT * FROM test1; a b ---+--------- t sic est f non est 最初はpg側で…

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

    僕はRubyで何かしら開発をする時にbinding.pryというデバッグツールを愛用してきました。 Rubyを書き始めたのが確か、2.3系の頃で当時からbinding.pryは非常に人気のデバッグツールでした。 しかし、Rubyのバージョンアップにつれてbinding.irbが標準gemとなりインストールをしなくても使用可能になったため、最近はbinding.irbを使うようになりました。 しかし、なぜかコード中にbinding.irbと挿入してIRBは立ち上がるものの、debugと入力してもエラーが表示され、デバッグ画面に遷移できませんでした。しかし、プライベートで使っているPCではdebu…

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

    僕がプログラミングを始めたばかりの頃、よく「ファイルをクローズし忘れてるよ」と指摘されていました。 当時は「ファイルはオープンしたらクローズするもの...」と反射的にファイルをクローズするようにしていました。しかし、今になって思うと「なぜオープンしたファイルをクローズしなければならないのか」を疑問に思うべきでした。 実を言うと、未だにファイルをオープンしたらクローズしなければならない理由をハッキリと理解していません。メモリの使用量が増えるから...という何となく...の理解をしています。今回はオープンしたファイルはなぜクローズしなければならないのか調べてみました。

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

    先日、以下の記事を公開しました。 www.okb-shelf.work Rubyで配列からハッシュを作る際に、どの方法が一番パフォーマンスが良いのかを計測したのですが、過去にJavaScriptで似たような計測をした時はシンプルなfor文が最速だったので、Rubyでも同じような結果になると思っていたらfor inが最も遅く、each関数が最も速いという結果になりました。 一体、なぜこのような結果になるのか。Rubyの深い部分まで把握する必要がありそうだと判断し、前回の記事では調査を行わなかったのですが、今回はその謎に迫ってみたいと思います。 そもそもRubyにはfor文がない この記事を書く前…

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

    Rubyで開発をしていると配列からハッシュ(連想配列)を生成するコードを書くことがあります。 個人的にはreduce関数を使ってバシッと書くのが気持ちよくて好きなのですが、最近、人によってこの処理の書き方が違うことに気づきました。 4つの書き方 僕が個人的に観測しているのは以下の4つの書き方(方法)です。 for文を使った方法 each関数を使った方法 each_with_object関数を使った方法 reduce関数を使った方法 それぞれ、簡単なコードを再現してみました。 処理は非常にシンプルで配列の各要素を文字列にした値をハッシュのキーとし、各要素を2倍にした値をバリューとします。

  • Elm Architectureに感銘を受けた

    最近、Elmを学びはじめました。 Elmの存在は元から認知していて、Haskellに似た文法を持つ関数型言語にカテゴリーされる言語だそうで、そんな言語でフロントエンドが作れるとのこと...で非常に興味がありました。また、個人でアプリケーションを作るにあたってフロントエンドの開発は避けて通ることが難しいです。現時点で一番の選択肢として考えられるのはReact.jsですが、業務で散々書いたので個人的にはもういいかなと感じています。何か新しいことをやりたいなぁ...と思っていたので、Elmを選択しました。 ellie-app.com 一週間ほどElmを学んで簡単なTodoアプリまで作ることができたの…

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

    チームの人数がだんだんと増えてきてポジションが明確化されて来た今、「対話が必要だ...」と思わされる日々を過ごしています。 何年も前に「ポジションは役割に過ぎない」という記事が話題になりました。当時、ポジションというのは上下関係を構築するものだと思っていたのですが、記事の通りポジションは役割でしかなく、人と人の間に上下関係を構築するものではないという学びがありました。 logmi.jp ポジションの明確化による副作用 しかし、ポジションが明確化されてくると上下関係に近いものが生まれます。 開発組織においてよく発生するのが発注者と受注者という関係です。テックリードや技術責任者が技術決定や設計を行…

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

    しばらく更新が止まってしまい申し訳ありません。 事後報告になりますが、コロナウイルスに感染して5日間ほど寝込んでいました。とても記事を書ける状態ではありませんでした。まさかのGW真っ最中での感染...によって、全ての予定が吹き飛びました。 軽い旅行に出かけたのですが、出先で拾ってしまったのでしょうか。 マスクは常に付けていましたし、アルコール消毒は欠かさないようにしていました。また、ワクチンも4回接種済みで感染対策を怠っていたわけではないと思うので、感染力の高さには驚かされます。 人によって症状の違いがあるそうで、自分の場合は熱は38.7度まで出たのですが、体のだるさ・しんどさはそれほどありま…

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

    いつものように書店を徘徊していると、良さげな本を発見。 同じシリーズの書籍である「SCRUM BOOT CAMP THE BOOK」を過去に読んだことがあったので「この表紙は!」と思い気づいたら購入していました。はい、いつもの衝動買いです。自分は書店で紙媒体のものを購入したのですが、なんと今、電子書籍版がセールで2023/05/12まで半額で購入可能なようです。 アジャイルなチームをつくる ふりかえりガイドブック 始め方・ふりかえりの型・手法・マインドセット作者:森 一樹翔泳社Amazon 内容は一言で言えば、アジャイルを目指すチームは一度は目を通した方が良いと感じるものでした。

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

    最近、みなさんは全くやったことがない・知識がなかったことを新しく始めたりされているでしょうか。 僕は先日、同居人と人生ではじめてのキャンプに行きました。 といっても、テントin寝袋で泊まるような立派なものではなく、タープを立てて簡単な食事をしながらのんびりした時間を過ごすデイキャンプを行いました。今の時期は暖かくて本当にキャンプ日和だなぁと思います。 キャンプをはじめた理由 突然、キャンプを始めた理由としては、お互いエンジニアかつリモートワークでずっと家にこもっており「何か自然を感じられることがしたいね〜」と考えた結果、「キャンプが良いんじゃないか?」と決定したからです。 防災用品を揃えたいと…

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

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

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

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

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

    最近は社内の輪読会で「エンジニア組織論への招待」を読んでいます。 著者の広木さんが書かれた素晴らしい内容に影響されて、組織構造について考える時間がとても増えました。 エンジニアリング組織論への招待 ~不確実性に向き合う思考と組織のリファクタリング作者:広木 大地技術評論社Amazon 僕の悩みの大変を占めているのは「権限委譲」の問題についてです。 中心となって動いてきたメンバーから新しく入ったメンバーや新人たちに、業務やポジションを委譲していくのは勇気のいることですし、委譲した結果、上手くいくのかはやってみないと本当に分かりません。後に適性がないこと分かった...なんてのはよくある話です。 し…

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

    Rspecでモックを作りたくて動的なクラスをClass.newで生成していた時のことです。 関数で受け取った配列を.mapで処理していたところ、do student で定義したブロック変数がClass.new内部に定義した関数のスコープ外になるという現象に遭遇しました。 def create_students(students) students.map do student Class.new do def studnet_info puts "生徒名: #{student}" end end end.new end student_classes = create_students(…

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

    何回も書く機会があるので、まとめておこうと思います。 何も外部ライブラリをインストールしていない状態ではEtc/UTC以外のタイムゾーンを使用することができません。自分のようにAsia/Tokyoを使いたい人はTzdataやTimexといった外部ライブラリをインストールする必要があります。 elixirschool.com 現在の日付を取得する関数(Date.utc_today())が標準ライブラリとして実装されていますが、当然ながらUTCタイムゾーンでの現在日しか取得することができません。 iex(8)> Date.utc_today() ~D[2023-04-09] hexdocs.pm …

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

    僕は卒論でVB.netを使って「センサーで計測したひずみ値を描画・記録するアプリケーションの作成」を行いました。学部では土木・建築を専攻しましたが、先生が「プログラミングを極めたい」という僕の気持ちを汲んでくれたことを今でも感謝しています。目的を持ってプログラムを書くことがとても楽しかったです。 ただ、当時の自分には設計や責務を分けるという考えはなかったので、今になって思うと完成したプログラムはひどいものだったと思います。卒業後、あのアプリケーションが保守されているのかは分かりませんが「今の自分が同じアプリケーションを作るならどう作るかな?」と考えてみました。当時の問題を振り返りながら、アプリ…

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

    最近のことですが、コードを全く書かない・書こうと思わない日がやってくることに気づきました。 新卒で現職に就いてからこんなことを感じたことはほとんどなかったので、自分でも驚いていますし、本当にショックです。ついに自分にも無気力期間がやってきてしまったか...と現実を受け止めつつ、なぜそうなってしまったのか振り返ってみようと思います。 そして「コードを書かない?そんな日があってもいいじゃない」という言葉を自分に送りたいと思います。 なぜコードを全く書かない・書こうと思わない日がやってくるのか 僕は大学3年生の時からプログラミングを書き始めました。 少しでも早くスキルを身につけて先輩たちに追いつきた…

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

    2023年3月31日をもってRuby2.7がEOL(EndOfLife)となりました。安らかにお眠りください...🪦 Ruby endoflife.date 業務でRubyを触り始めたのが、ちょうど2.7系の時だったので感慨深いものがあります。 Ruby2.7のEOLに伴って、プロダクトのレポジトリ内でRuby2.7に関連する記載がある箇所がないかと調べていたところ、RuboCopのTargetRubyVersionが2.7となっていることを発見しました。Ruby自体は3.1.2を使っていたので、単純な「対応忘れかな」と思いTargetRubyVersionを3.1.2に更新したところ、以…

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

    はてなブログから素敵なメールが届きました。なんとブログを開設してから早くも4年が経過したそうです。 開設したのは学部を卒業して新卒になる前の2019年3月のこと。 当時の僕は、インターンからアルバイトを経てすでにエンジニアとして業務経験を積ませて頂いていたものの、非常に劣等感を感じていました。特に勉強会でマサカリを投げられてショックを受けたことは今でも忘れられません。 ある日のこと、まつもとゆきひろ(Matz)さんの言葉から感銘を受けて「アウトプットで差別化して強いエンジニアになるぞ!」と思い立ち、はてなブログを開設しました。 インプットは必要、でも差別化要因にならない しかし、アウトプットす…

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

    最近は技術書だけではなく、さまざまな書籍を読むようになりました。 今回はヴィクトール・E・フランクル著の「夜と霧」を読みました。今更、自分が紹介するまでもなく名著して語り継がれている書籍です。著者のフランクルが第二次世界大戦渦にて、ユダヤ人してアウシュヴィッツに収容された経験を元に「人間とは何か」というテーマとなっています。 夜と霧 新版作者:ヴィクトール・E・フランクルみすず書房Amazon フランクルは精神科医であり、心理学の分野では「ロゴセラピー」という心理療法を確立しました。 簡単にいうと「なぜ生きるのか」という理由を充実させることで、メンタルや心の病の解消を目指すという療法だそうです…

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

    みなさんはRailsの開発にて、サービスクラス(ServiceObject)を使っているでしょうか。 モデルやコントローラーがファットになるのを防ぐために導入される設計方法で、ドメイン知識におけるサービス(eg: 商品の購入処理)の一連の処理をまとめたクラスを作成することで、可用性が高くテストがしやすいコードを書くことが可能です。 techracho.bpsinc.jp 特にRailsではActiveRecordの便利さゆえにコントローラーやモデルに処理をゴリゴリと書いてしまいがち。しかし、何も考えずにサービスクラスを無秩序に作ってしまうと逆に保守性が悪い状態になってしまいます。 自分が書いた…

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

    Railsでトランザクションを扱いたい時はActiveRecordに実装されたtransactionメソッドを呼び出します。 ActiveRecord::Base::transaction do : end 今までRailsでトランザクションのブロックを宣言した時は、他のトランザクションからデータの取得、更新は出来ないと思っていましたが、先日、勘違いであることに気づきました。更新はトランザクションの待機によってすぐには実行されませんが、データの取得は可能です。取得もさせたくないのであれば排他制御を行い明示的にロックの宣言をする必要があります。 トランザクションのブロックを宣言しただけでは、他の…

arrow_drop_down

ブログリーダー」を活用して、ぎょうざさんをフォローしませんか?

ハンドル名
ぎょうざさん
ブログタイトル
やわらかテック
フォロー
やわらかテック

にほんブログ村 カテゴリー一覧

商用