やわらかテック

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

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

みなさんはバイナリデータの中身を覗いたことがありますか。 僕は普段、WEBアプリケーションの開発に携わっているのですが、どうしてもこういった領域とは接点がありません。一度、WireSharkというアプリケーションを使って自身のPCから外部に送信されている…

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

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

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

以前、システムコールを利用して簡単なTCPサーバーを実装しました。 www.okb-shelf.work hello worldという文字列が返るだけのジンプルな実装になっていましたが、他にも音声や動画といったデータをTCPを通じて送れるのか気になりました(...送れると思います…

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

最近、Twitchでスプラトゥーン3のプレイを配信しています。 その中でただプレイするだけだと面白くないので、武器をランダムで選択してバンカラマッチ(対戦)できたら面白いかも...と思ったのですが、配信でいい感じに使える武器をランダムに選択してくれるサ…

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

みなさんはシステムコールについてご存知でしょうか。 システムコールを一言で説明すると、OSのサービスを利用する際に呼び出しされる機構のことです。 普段、WEBアプリケーションの開発をしている自分にとってシステムコールは、あまり馴染みのあるものでは…

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

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

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

先日、Twitterを見ていると面白そうな記事が紹介されていました。 少し古い記事ですが、シンプルなロードバランサーをRustで実装してみたとのこと。凄いですね...。 qiita.com ロードバランサーと聞くと何やら難しそうなイメージがありますが、記事内で実装…

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

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

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

一週間前にロジクールのBlue Yeti Xというマイクを購入しました。 今まで通話にはiPhoneに付属してくるイヤホンマイクをずっと愛用しており、音質には全くこだわりがありませんでした。むしろ、iPhone付属のイヤホンマイクで十分だと思っています。 ただリモ…

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

最近、パーサーを実装したい欲が高まっています。 というのもRui Ueyamaさんの「低レイヤを知りたい人のためのCコンパイラ作成入門」を読み進めて、再帰下降構文解析をはじめとしてパワフルな実装に非常に魅力を感じているからです。 資料に合わせてCコンパ…

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

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

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

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

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

sidekiq.ymlではERBがサポートされており、環境変数を指定することが可能です。 よく環境変数が使われるのは、並行度(concurrency)の値やタイムアウトの秒数などでしょうか。 :concurrency: <%= ENV.fetch('SIDEKIQ_CONCURRENCY', 10) %> こんな感じでsideki…

Jupyter NotebookでRubyを実行する

少し前のRubyWeeklyの中に、非常に面白そうな記事が記載されていました。 nithinbekal.com Jupiter Notebook上でRubyのコードが実行する方法が紹介されていました。 計算領域で強いJuliaが、Jupyter Notebookで実行可能というのは前々から把握していたのです…

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

最近はスプラトゥーン3にハマっていて毎日、1時間ぐらいコンスタントにプレイしています。 一人でやることも多いのですが、同居人と一緒にプレイすることもあります。過去作と比べるとラグがひどかったり...と賛否両論あるようですが、個人的にはとても楽し…

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

先日、オライリーより出版されている「ソフトウェアアーキテクチャの基礎」を読了しました。 ページ数はそこそこの書籍でしたが、少しずつ少しずつ...読み進めて約1ヶ月で読了することができました。 ソフトウェアアーキテクチャの基礎 ―エンジニアリングに…

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

ActiveRecord上のN+1問題を検知するbulletというgemがあります。 bulletを仕込んでおく事でbullet.logファイルに該当箇所でN+1問題が発生している旨のログが出力されるようになります。どんな対応をすれば良いかまで提案してくれる...非常に賢いですね。 202…

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

RubyにはLoggerクラスが組み込みライブラリとして提供されていて、ログをいい感じに出力することができます。 しかし、複数のロガーに対してログを出力することはLoggerクラスだけでは出来ません。RailsであればActiveSupport::Logger.broadcastが使えるそう…

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

Rubyで並行処理をしたい場合、いくつか選択肢が考えられます。 自分がパッっと思いつくものを列挙しただけでも、これだけの選択肢が出てきました。 Thread Process Fiber Async Ractor Concurrent Ruby 単一サーバーにおける並行処理では基本的にはスレッド…

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

先日、スタジオジブリ最新作の「君たちはどう生きるか」を見てきました。 映画の感想については賛否両論あるようですが、僕の感想としてはポニョやハウルのようなストーリー面での楽しさはないものの、さまざまな謎や問いが劇中でされており「君はどう思う?…

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

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

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

irbの実行環境から定義されている関数のソースコードが見たいなぁ...と思いMethodクラスのドキュメントを眺めていたのですが、そのようなメソッドは提供されていませんでした。代わりではありませんがsource_locationたる関数が定義されているファイル名と定…

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

RubyのMethodクラスの公式ドキュメントを読んでいた所、面白いメソッドを発見しました。 なんとメソッドをカリー化してProcにした値を返してくれるcurryというメソッドがありました。 Rubyではカリー化が簡単には出来ないと思っていたのですが、こんなメソッ…

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

Rubyを業務で書き始めて3年目になりますが、まだまだ知らないことばかりだなぁと思わされます。 先々週に届いたRubyWeeklyに構造体(struct)について解説している記事が紹介されており、気になったので記事を読んでみるとOpenStructという自分が全く知らない…

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

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

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

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

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

前回、RuboCopの処理を追いかけました。 長い旅になりましたが、なんとかRuboCopのコマンドが実行されてから画面に結果が出力されるまでの流れを完全に理解しました。せっかくコードを読んだわけなので何かしらの変更が出来ないか試してみたいと思います。 …

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

Rubyには標準出力するための関数が複数、用意されています。 今更感はありますが、自分が把握しているだけでも5つも関数がなり、一体、何が違うのやら...。 puts p pp print printf それぞれの出力結果を見比べながら、どのように使い分けるべきかを考察して…

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

バージョンアップによって既存コードが動かなくなる(エラーになる)という現象に初めて遭遇しました。 話には聞くものの、経験したことがなかったので「本当にあるんだ...」と謎に嬉しい気持ちになりました。 バージョンアップをしたのはRuby本体のバージョン…

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

※この記事はRuboCopの内部実装を読んでみるシリーズの第2記事です。 前回の記事でターミナルでrubocopコマンドを実行するとRuboCop::CLIクラスのrunが呼び出されて、紆余曲折あって各Copのチェックがコールバックとして呼び出されていることが判明しました。…