chevron_left

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

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

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

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

2023/01/11

  • 明日から使えるgRPC入門

    業務でgRPCを使う機会があるのですが、個人で軽く触ったことがある程度で正しく理解できているか不安だったので、改めてインプットし直しました。この記事はさくらインターネットさんが公開されている記事から特に重要だと感じた箇所を抽出して、自身の備忘録として短くまとめたものです。 knowledge.sakura.ad.jp 実は前回も読んでいるはずなのですが、頭から抜けている箇所が多くありました...。 そもそもRPCって何 RPCとは通信プロトコルの1つで「遠隔手続き呼び出し」と訳せるようにクライント・サーバーモデルであり、どこかにあるサーバーに定義された関数をクライアントが呼び出すことで実現され…

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

    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には長澤まさみさんやガンダムにシャア・アズナブルが起用されており気合いを感じます。 エンジニアの採用は「コグナビ」 株式会社フォーラムエンジニアリング コグナビの特徴としてスキルツリーによるマッチングというコンセプトがあり、自身が入力したスキルをツリー化してくれます。一…

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

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

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

商用