最近、システムの問題に遭遇しました。Ruby Rake タスクとして記述されたバッチ ジョブの一部が重複呼び出しになり、データベースのレコードが重複するか、Slack でアラートが重複するという問題です。これは間違いなくインフラの問題ですが、インフラ側で修正されるまでは、コーディングの観点から対処する方法を見つける必要があります。すべてを可能な限りべき等に書き直すことは選択肢ではなく、アプリケーション レベルの検証やデータベースの一意性制約を強化することも選択肢ではありません。すべてのジョブがべき等になるわけではなく、すべてのジョブがデータベースに書き込むわけでもないからです。さらに、問題は 2 つのスレッドではなく 2 つのプロセスの競合状態によって引き起こされます。調査と実験を行った後、シンプルな分散ロック ソリューションとして Redis
を使用することにしました。これは既にアプリケーションで使用可能で、追加の設定は不要です。また、単一インスタンスであるため、レプリケーション同期の懸念もありません。Redis
はシングル スレッド アーキテクチャであるため、同時にいくつのクライアントが書き込もうとしても、シーケンシャルかつアトミックであることが保証されます。私はこの性質を利用して、直面している問題を解決できると考えました。
tmux はターミナルマルチプレクサです。これは、長時間実行されるタスクをリモート サーバー上でバックグラウンドで実行し、後で結果を確認する必要があるときに非常に便利です。その場合、SSH 接続を常時維持する必要がなく、ネットワーク障害によってタスクが予期せず終了することを心配する必要もありません。ここでは、ほとんどのユースケースを満たす最小限のコマンドのリストを示します。
JDK 11 以降、Java はクラス ファイルにコンパイルする必要なくソース ファイルを直接実行することをサポートしています。これにより、Python、Ruby、Node.js などの動的プログラミング言語で通常行われるように、Java でスクリプトを記述することが可能になります。この投稿は、それを実現する方法の例とクイック リファレンスとして役立ちます。
JSON 形式の API 応答を処理したり、Web サイトに埋め込まれた JavaScript アセットを操作したりするなど、多くの場合、13 桁の長い数字を頻繁に目にします。おそらく、それが new Date().getTime()
などのコードから生成されたエポック タイムスタンプであることはわかっていますが、人間にはそれがどの日付と時刻を表しているかをすぐには判断できません。Epoch Converter という便利な Web サイトがあり、これを人間が読める形式に簡単に変換できますが、開発者にとっては、Web サイトを開くよりもさらに迅速な方法があります。それは、多くのプログラミング言語に付属している インタラクティブ シェル
を使用することです。
Ruby 3.0 には、多くの gem を使用する一般的な Rails アプリにとって大きな問題となるいくつかの重大な変更、特にキーワード引数の動作の重大な変更と URI.escape
メソッドの削除が含まれていました。
従来、ページに CSS を静的に追加する方法は いくつか ありますが、JavaScript では、rel="stylesheet"
と href
を CSS ファイルの場所に設定して link
要素を作成するか、CSS 定義をコンテンツとして含む style
要素を作成することで、動的に追加することもできます。現在は、JavaScript リソースをインポートする方法と同様に、CSS モジュール スクリプト
と呼ばれる機能を使用して、ESM スクリプト タグ内から直接 CSS をインポートする 3 番目の方法があります。
ログ ファイルの解析など、大きなテキスト ファイルを扱う場合、効率とパフォーマンス上の理由から、すべてをメモリに読み込むのではなく、コンテンツを 1 行ずつ読み込み/反復処理することが常に推奨されます。Nodejs では、1 行ずつ読み込む方法は、日常的なユーザーの観点からはハッキーで低レベルすぎるように見えるため、常に面倒でした。ただし、最新バージョンの v18.11.0
にマージされた PR のおかげで、FileHandle.prototype.readLines
が組み込まれ、非常に便利に使用できるようになりました。
Java、Ruby、Python などの他のプログラミング言語には、現在のスレッドの実行を一時停止し、指定された時間後に実行を続行する Thread.sleep()
、sleep
、および time.sleep()
メソッドがあり、ループと一緒に使用すると、たとえば競合状態の問題に対処するのに役立ちます。node.js、および一般的な JavaScript では、シングルスレッド、イベント駆動型、および非同期アーキテクチャの性質上、一時停止して待機する方法はあまり明白ではなく、頻繁に見られるようには見えない場合があります。ただし、特定の状況では wait
と retry
の使用が依然として必要であり、役立つため、nodejs または JavaScript で同様の機能と効果をシミュレートすることができます。
しばらく SSH サーバーとクライアントの間でメッセージが送信されない場合、SSH 接続がすぐに終了すると煩わしくなることがありますが、クライアント側またはサーバー側から長期間または永久に SSH 接続を維持する方法があります。
Nodejs では、ネットワーク経由での転送やディスクからの読み取りなどの非テキスト ファイル (画像など) の IO 操作を処理するときに、コンテンツを stream.Readable
として受け取る可能性が高く、バイト サイズや画像のサイズを計算するなど、メモリ内の完全なデータを処理する前に、stream
を buffer
に保存する必要があります。その方法はいくつかあります。