動かざることバグの如し

近づきたいよ 君の理想に

JavaScriptでパスワード生成するときはMath.random()を使うな

パスワード生成するメソッド

指定した桁数のパスワードを生成するメソッドをTypeScriptで実装した。

別にjsでも動くと思う

export const generatePassword = (length: number): string => {
  const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let password = '';
  for (let i = 0; i < length; i++) {
    const randomIndex = Math.floor(Math.random() * characters.length);
    password += characters[randomIndex];
  }
  return password;
};

console.log(generatePassword(8));

動作としては問題ないのだが、何回か実行しているとどうも同じ文字が連続して生成される気がする。

❯ bun index.ts
2xdd87lv
❯ bun index.ts
qeezy2ew

でChatGPTに聞いたら案の定 Math.random()を使うのは良くないらしい

代わりにCrypto.getRandomValues()使えと言われたので書き直してもらった

export const generatePassword = (length: number): string => {
  const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
  let password = '';
  const randomValues = new Uint32Array(length);
  crypto.getRandomValues(randomValues);
  for (let i = 0; i < length; i++) {
    const randomIndex = randomValues[i] % characters.length;
    password += characters[randomIndex];
  }
  return password;
};
  • const randomValues = new Uint32Array(length);
    • Uint32Arrayは、符号なし32ビット整数の配列を作成します。
    • lengthは配列の長さで、ここではパスワードの長さに相当します。
    • この行は、ランダムな値を格納するための空の配列を作成します。
  • crypto.getRandomValues(randomValues);
    • cryptoは、暗号化操作のためのグローバルオブジェクトです。
    • getRandomValuesメソッドは、引数として渡された配列を、暗号学的に安全なランダムな値で埋めます。
    • この行は、randomValues配列をランダムな数値で満たすために使用されます。

よさそう

❯ bun index.ts
n4je65la

てかググってたらもっとスマートに実装してる人いたわ

export const generatePassword = (length: number): string => {
  const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
  return Array.from(crypto.getRandomValues(new Uint32Array(length)))
    .map(value => characters[value % characters.length])
    .join('');
};

参考リンク

Dockerで標準出力にログ吐くsquid

環境

やりたいこと

かつてDockerでsquid実装した記事書いた

dockerでsquidプロキシサーバーを構築する - 動かざることバグの如し

あれから5年色々変わって動かなくなってたので再実装

FROM ubuntu:24.04

ENV TZ=Asia/Tokyo
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && \
    apt-get install -y squid && \
    rm -rf /var/lib/apt/lists/*

squid.conf

logfile_rotate 0
cache_log stdio:/dev/tty
access_log stdio:/dev/tty
cache_store_log none
# cache_store_log stdio:/dev/tty

で必ずdocker-compose.yml起動時には ttyをtrueにする必要がある。

command: squid -N
tty: true

実際に動かすのは https://github.com/thr3a/docker-build-station/tree/master/squid 参照

Nextjsで複数台にデプロイするとJSが404エラーになる問題

環境

  • Nextjs 14

Nextjs複数台に同時にデプロイできない問題

Nextjsを使用している際に、複数のサーバーに同時にデプロイしようとすると問題が発生することがある。

具体的には、ビルドIDが各サーバーで異なるため、JSのURLが変わってしまう。よってブラウザを何回かリロードしているとJSが404でエラーになる。

これは、NextjsがデフォルトでランダムなビルドIDを生成するためであり、複数のサーバー間でビルドIDを統一しないと、クライアントサイドでのキャッシュの不整合など、予期せぬ問題が発生することがある。

この問題は、特に大規模なアプリケーションや高可用性を求める環境で顕著になり、デプロイの効率性やアプリケーションの安定性に影響を与える。

解決策

next.config.jsに以下のようにgenerateBuildIdを追記する。いわゆるhashシード的なもので、ここでは「my-build-id」と固定の文字列だが運用する場合はgitハッシュがベストだろう。

module.exports = {
  generateBuildId: async () => {
    // You can, for example, get the latest git commit hash here
    return 'my-build-id'
  },
}

参考リンク

赤本名言

赤本名言

2017年の赤本が名言だったのでメモ

はしがき

大学入試の季節が近づいてきた。寒い雪の日の朝、電車の中で受験生と思しき若者が単語帳を開いているのを見るにつけ、もうかれこれ数十年前になるが、かって自分自身が受験生だった時の姿を重ねてしまう。

高校三年生の冬、受験に失敗した。後で振り返ると、漫然と塾や予備校に通い、基礎もできていないのにレベルの高い参考書に手を出し、やった気になっていた。実際はたいして勉強していないのに根拠のない自信と慢心があって、案の定それはもろくも打ち砕かれた。大学で何をやりたいのかさえはっきりしないまま、よく考えずに志望校を決めていた。

浪人して改めて自分を見つめ直し、多くの本を読んだ。1年間の計画をしっかりと自分で組み立てたいと考え、自宅浪人の道を選んだが、思い返せば、悶々ともがき苦しみ、天井を眺めてはのたうち回るような日々であった。自分を見失い、自堕落な毎日をすごすこともあったが、試行錯誤の中でなんとか目標を見定め、少しずつ自分のペースをつかめるようになっていった。

受験当日のことはほとんど覚えていないが、手応えはあったものの、自信があるというわけではなかった。合格発表の日もすぐに見に行く勇気がなく、行ったときには既に掲示板のまわりは閑散としていたが、しばらくその場にたちつくして離れることができなかった。

大学受験はあくまでも人生における通過点にすぎず、それ自体が目的ではないのだが、受験を通して身についたこと、学んだことはもちろん、様々な努力と試行錯誤重ねた経験は、将来なんらかの形で人生の支えとなるかもしれない。雪の日に受験生を見かけるたびに、もう一度やり直せと言われてもできないような濃密な日々を懐かしくおもいだすのである。

最後になったが、家族や友人など、支えてくれる周囲の人たちへの感謝を忘れず、受験本番で持てる力を存分に発揮できるよう健康管理にも十分に注意し、見事合格の栄冠を勝ち取られることを願ってやまない。

編者しるす

picture 0