chevron_left

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

cancel
Memo: https://burion.net/

本の感想や、面白かったこと、勉強になったことやその他どうでもいいことを残そうとしているやつによって、アイデアや気づきとかが雑に書き殴られる。

buri
フォロー
住所
未設定
出身
未設定
ブログ村参加

2023/03/28

arrow_drop_down
  • 非同期なオンライン上で安全に振れる冪等なサイコロを作ってみた

    非同期なオンラインで平等に当番を決めたいというときありませんか? リモートワークで面倒だけどやらないといけない単純作業が発生した際に、最初に気づいた人がやるのだと偏りが出て不平等じゃない?という声があってサイコロを降ってみたらどうか?となった。 オンラインの場合は適当なサイコロを振るサイトを開いて結果をスクショすれば十分ではあるが、プログラマーというものそんなの何回も振り直せばインチキができるじゃないかという発想になる。(別に同僚を信頼してないわけじゃないんだけども) そうであれば非同期でもオンライン上でもインチキができない仕組みのサイコロを用意すればいいじゃない。ということで生まれたのがハッ…

  • Unity: ubuntu 22.04 で my asset のダウンロードができない

    OS: Ubuntu 22.04.4 LTS Unity: 2022.3.25f1 LTS こういう環境で、アセットストアで無料で登録したアセットをダウンロードしようとしたら、The download could not be completed. See details in console. と出てきてダウンロードが一向に進まなくなった。 console を見ろとあるので Window > General > Console を開くと、My Assets がおかしいので確認してくれというエラーだった。 [Package Manager Window] The Assets Cache lo…

  • 虫のような人工生命を観察する生態系シミュレーションゲームを作ってみた

    【The Garden】このガーデンには虫のような人工生命(強化学習AI)がくらしています。そんな虫たちをただじっくりと観察するだけの生態系シミュレーションゲームです。

  • MD5 を衝突させてみる(HashClash)

    MD5 (Message Digest 5) は暗号学的ハッシュ関数で、電子署名やパスワードのハッシュ化のような暗号的な用途に利用されていた(が、今は暗号用途で使ってはいけない)。 暗号学的ハッシュ関数はこの性質を満たさなければいけないとされている。 一方向性: ハッシュ値から元の値の復元が困難である 第二現像困難性: あるハッシュ値があったとき、それと同じハッシュ値となる入力値(元の値でなくて良い)を求めるのが困難である 衝突困難性: 同じハッシュ値になる任意の入力値を求めることが困難である ハッシュ関数の品質として通常利用時に偶然衝突する確率が非常に低いことはもちろん、悪意を持って衝突しよ…

  • 2D空間のある範囲にあるオブジェクトを高速に取得したい

    趣味で開発しているシミュレーションゲーム的なもので当たり判定っぽいものが必要になった。 ゲームでは何匹もの虫がいる。虫1匹毎に周囲の情報を集めてそれを Neural Network のモデルに渡してから次の移動方向を決定する...、みたいな流れになっている。(詳細は省く) その際に周囲にいる自分以外の虫の情報が必要になる。例えば画像のような状態で赤い虫が行動する場合、赤い虫から数px(ピンクの範囲)に存在する虫 4, 5, 6 を取得したい。 単純な実装 単純には以下のように実装できる。 しかしこの方法では虫の数に比例して計算量が増加する。実際、虫が数百〜数千程まで増えるとパフォーマンスが問題…

  • docker build の RUN npm ci が進まなくなり network read ETIMEDOUT が出た

    ミニPC vs ラズパイ 最近ミニPCを買いました。趣味で CPUをそこそこ使う処理を一日中動かしたいなぁという状況になったのですが VPS だと費用がバカにならないので自宅サーバーとして手頃なミニPCにしてみました。 TRIGKEY 製の安価な物で、CPUコアが8個もついてるのにこの大きさでこのお値段。消費電力も 5~40w 位と今の所はなかなかいい感じ。まだ触り初めて数日だけど。 ミニPC Ryzen 7 TRIGKEY Speed S5 Pro R7-5700U(8コア16スレッド, 最大4.3 GHz) 16G DDR4 500G M.2 NVME SSD 高性能小型PC, WIFI …

  • 実際に疑似乱数生成器(xorshift)の次の出力を予測する

    1年以上昔にこんな記事を書いた。 burion.net 久しぶりに読み返してみると、疑似乱数が決定的・周期的なことまではなんとなく示せているものの具体的な予測方法は全然書いてないじゃん!!!と内なる声に突っ込まれた。「予測できるか試したい」なんてタイトル掲げておいて、なんて中途半端な奴なんだ。 多分このときは周期性を実験するところで気力が尽きたのかもしれない、許してあげましょう。 そういうわけで今回こそは実際に予測してみようと思う。 xorshift 32bit 今回は python を使いたかったので前の記事で使った疑似乱数生成器を移植した。 また、今回出力は self.s をそのまま使わず…

  • UUID の謎。なぜ 8-4-4-4-12 に区切られているんだろう?

    UUID が16進数がハイフンで分けられた特徴的なフォーマットをしているのはなぜだろう?

  • Tensorflow.js の学習時(fit)に出てくるログを無効化したい

    デフォルトで tensorflow の model.fit() を実行すると以下のようなログが出てくる。見たいログが埋もれてしまい邪魔なので消そうと思ったがすぐ見つからなかったので残しておく。 Epoch 1 / 8 31ms 122us/step - loss=0.150 verbose (ModelLoggingVerbosity) Verbosity level. Expected to be 0, 1, or 2. Default: 1. 0 - No printed message during fit() call. 1 - In Node.js (tfjs-node), prin…

  • 乱数生成器の気持ちになって、キーボードをたたきまくるゲームを作ってみた

    誰しも一度くらいは、乱数生成器を疑似体験1してみたいと思ったことがあるのではないでしょうか? あなたは乱数が好きですか?私はどちらかと言えば好きよりの人間です。どれくらいかと言えば、三度は思うほどに。飯の代わりになるほどに。 乱数を疑似体験したい、すべての人に贈るゲームを作ってみました。 あなたは乱数生成器ですか? あなたは乱数生成器ですか? この記事を読んでいるほとんどの人は、乱数生成器ではないかもしれない。しかし、自分を乱数生成器だと主張する人が現れるかもしれない。そんな時にランダムにキーボードを叩かせて、その結果が非常にランダムだった場合、その人は乱数生成器といっても過言ではないだろう。…

  • 強化学習の仕組みに興味はあるが、数学が苦手な人に向けてQ学習(TD法)を解説したい

    自分の勉強を兼ねて、数学や数式をなるべく使わずに半年前の俺に話すならこんな感じかな~と強化学習のアプローチについて頑張って説明してようと思う。

  • XSS対策はエスケープ(サニタイズ)だけでは十分ではない

    XSS は Web サイトの代表的な脆弱性で対策は意外と簡単じゃなかったりする。エスケープだけでは防ぎきれないケースが面白かったのでまとめてみる。

  • 失敗した場合に安全に処理を中断するためのbash内での環境変数export方法(ShellCheck に教えてもらう)

    例えば以下のようなスクリプトがあって、その結果を bash 内で実行し標準出力を環境変数として export したい。しかも、そのスクリプトは失敗する可能性があると仮定する(インターネット接続が必要なのに繋がってない環境で実行された。設定ミスによって権限が足りてない。単純なバグ...など)。 これがビルドやデプロイのために実行されるコードだった場合(例えば Docker の entrypoint )、実行に失敗した瞬間に安全のため処理を中断させたい。必要な環境変数を設定し損ねたアプリケーションは正常に動くとは全く期待できないし、想定してない動作をする恐れもあるため。 import sys # …

  • node-postgres の query_timeout でタイムアウトした後、DB のプロセスが残り続ける。

    Node.js で PostgreSQL にアクセスするために node-postgres を使っている。設定で query_timeout を設定すると、実行時間が長いクエリをタイムアウトさせることができる。 しかし、タイムアウト後に DB 内のプロセスが残ったままになってリソースを圧迫し続けた。

  • PythonのJinjaを使って環境毎の設定をシンプルに管理したい

    ある OSS を使いたい。そして、テスト環境と本番環境ではもちろん異なる config ファイルを使う必要がある。 そういった状況での一番単純な方法として、test-config.yaml, prod-config.yaml のように環境毎の設定ファイルを作ることがまず思い浮かぶが、以下のようなデメリットがあると思う。 (環境間で共通の)設定を変えたい時に、両方のファイルを変更する必要があって面倒くさい 手動で変更すると打ち間違えや変更漏れによって異なる設定になってしまう恐れがある 意図しない差があるとテスト環境はうまく動くが本番環境で壊れるようなことが起きる そこで、環境が複数あっても基本的…

  • ブラウザで Tensorflow.js を動かすと GPU メモリが増加し続けてクラッシュした

    Tensorflor.js をブラウザで動かし、モデルをループで推論(predict)させていると GPU のメモリがジワジワと増え続け最終的にクラッシュしてしまうという現象があった。結論としては tf.Tensor オブジェクトは状況によっては(WebGL バックエンドが自動的に選択された場合) GC されない仕様になっており、リソースの明示的な開放が必要だった。 記事末リンクの、メモリ管理で説明されている tf.tidy を嚙ませてあげることでメモリリークが解消した。 ちなみに、WebGL バックエンドはブラウザでの実行時に選択されるらしい。現在使われているバックエンドはこのメソッドで取得…

  • N番煎じでも CSRF を説明したい

    Web アプリケーションの脆弱性、特に有名なものに3つあるが CSRF だけはピンと来なかった。色々調べて理解できたのでまとめてみる。 XSS SQL Injection CSRF CSRF の脆弱性 CSRF (Cross-Site Request Forgeries)脆弱性があると、利用しているサイトのユーザーに攻撃者が望む操作をさせることができる。 例えば、Aさんはあるショッピングサイトを利用しているとする。Aさんがパスワードを変更する場合はパスワード変更画面にアクセスしてそこで新しいパスワードを入力し変更ボタンを押す。 実際に行われることを細かく書くと以下のようになる。 Aさんのブラウ…

  • 1月から12月までの英語を覚えたい

    私は、1月~12月までの英語名 January ~ December を覚えるのが苦手です。 なぜ 1~12 の数字にこのような無規則な文字列が対応しているのか、そして学校や私生活ではなぜその順番を覚えること必要とされるのかが理解できません(意地が悪いのだとしか思えない!!)。 不幸なことにプログラミングでは「日付や時刻」を扱うことが多く、毎日のように目にするかもしれません。 1月 January 2月 February 3月 March 4月 April 5月 May 6月 June 7月 July 8月 August 9月 September 10月 October 11月 Novembe…

  • RxjsのSubjectを活用したNode.jsプログラムの依存関係制御

    Node.js で依存関係をうまく制御するために、Pub/Sub パターンを使いたかった。調べて見つけた Rxjs の Subject を利用することで上手く実装できたと思う。Pub/Sub を使うと何が嬉しいのかと、Subject を使った実装をまとめてみる。 例には以下の FizzBuzz クラスを使う。300ms ごとに 1~15までカウントアップして、Fizz Buzz が表示されるだけ。 そして、このクラスに対して Fizz が表示される回数を数える ことを考えてみる。 class FizzBuzz { static async run(): Promise<void>{ const…

  • @golevelup/nestjs-rabbitmq で実装した consumer が queue を消化できなくなった

    このライブラリで作成した consumer が queue を消化できなくなり、メモリ使用率がじわじわと上昇し(300MB/8h 位の速度) OOM で停止してしまった。 RabbitMQ の GUI やサーバーのメトリクスを見ると以下のような状況になっていた。 起動しているすべての consumer が Unacked メッセージを持った状態で止まっている Redelivered が 1,000~2,000/s になっている RabbitMQ ・ consumer 間のネットワーク通信量が大きく上がった github.com 原因 JSON として不正なメッセージを consumer が受け…

  • docker container のとめかた

    このような Dockerfile を $docker build . -t webapp:latest でビルドした後、$ docker run webapp:latest でコンテナを立ち上げることができる。 # Dockerfile FROM python WORKDIR /app COPY . /app RUN pip install flask ENTRYPOINT ["bash", "entorypoint.sh"] # entorypoint.sh echo "Starting server..." python3 webapp.py # webapp.py from flask …

  • JavaScript のテストフレームワーク Jest でテスト網羅率(カバレッジ)を計測したい

    Jest は Meta(元 Facebook) が保守している、JavaScript のテスティングフレームワーク、らしい。Jest を使うと、コード網羅率(カバレッジ)を簡単に計測できる。 カバレッジを計測することで、テストが不足しているコードが検知できるようになって嬉しくなる。 jestjs.io コードは長いので隠しとく テスト対象 // add.ts export function add(a: number, b: number): number { const res = a + b; return res; } // isEven.ts export function isEve…

  • UUID v4 はなぜ暗号的に安全な乱数が使われているんだろう?

    UUID は分散システムで一意な Identifier として使えること(= 衝突しない前提で使える)を目的にした ID で、その version 4 はランダムに作るやつ。 この前ふと、uuid v4 をパスワードのような使い方をしていいのか?が気になって調べてみた。 Secure - Cryptographically-strong random values Node.js を良く触るが uuid モジュールでは、暗号学的に安全なランダムを使ってるよう。 ちなみに、version 7未満では Math.random() が使われることがあり、暗号的に安全じゃないかもしれないらしい(Mat…

  • JavaScriptのProxyを使って、サードパーティーのクラスを書き換えずにログを出力したい

    以下のようなサードパーティのクラスがあって、メソッドに渡された引数や結果をログに残すためにインターセプトしたい。 自分らが管理しているクラスなら、デコレーターを作るのがいいと思うが、サードパーティーのクラスを書き換えるのはちょっと嫌だ(保守性の低下や動作が壊れるリスク的な観点で)。 またクラス構造がネスト・継承されている場合、デコレーターが複雑になり保守もしにくくなりそうだなーと思っていた。 // thirdPartyClass.ts interface Data { [Key: string]: number; } export class ThirdPartyClass { private…

  • JavaScript でクラスのメソッド名を取得する方法 - プロトタイプチェーンを利用して列挙不可能プロパティを取得する

    Object.getPrototypeOf() でプロトタイプにアクセスし、そこから Object.getOwnPropertyNames() で得られる。 Object.getOwnPropertyNames()は列挙不可能プロパティも取得できるという特性を持っているので取得が可能になる。

  • 保守性のためのコード設計の原則、DRY原則と直行性を考えてみる

    > 良い設計は悪い設計よりも変更しやすい。第2章の初めの Tips である。確かにその通りだとおもう。良い設計とは?と聞かれるとパッと答えるのは難しいが「悪い設計とは?」と聞かれたときには以下のようなものが思い浮かぶ。

  • TypeScript で stripe-node API のレスポンスから requestId や statusCode を取得したい

    TypeScript + stripe-node で API の requestId や statusCode 等を取得したい時、API の返り値の lastResponse から得られる。しかし、 Property 'lastResponse' does not exist on type 'Session'. と TypeScript に怒られることがある。 var customer = await stripe.customers.create(); console.log(customer.lastResponse.requestId); // Type Error ! 結論 実は l…

  • 疑似乱数(xorshift)の内部状態と生成される数値の関係について考えてみる

    ※細かく調べたり検証を行ったわけではないので、話半分に見てください 以下の記事で疑似乱数(xorshift)について考えていた時にある疑問が浮かんだので、それについて書いてみる。 buri83.hateblo.jp 実験のしやすさのため、周期が 216 - 1 の xorshift を準備する。このアルゴリズムで乱数を生成するときは内部状態 xs にゴニョゴニョと操作をしたものを返す。そしてその出力はそのまま次の内部状態になる。 当然だが xs が同じ場合、生成される乱数は同じになる。 unsigned short xs = 17; unsigned short xor16(){ xs ^= …

  • 疑似乱数は本当に予測できるのか試したい

    世の中には2種類の人間がいる... という文句、妙に説得力がありそうで、この後主語もスケールも大きい名言が続きそうなやつ。 人間だけではなく疑似乱数についても、2種類に分けられるらしい。 「世の中には2種類の疑似乱数がある、次の出力を予測できるか出来ないかのどちらかだ」 1 あるサイトに登録したときメールで、https://example.com/register/?token=blquu5jrdrmd のようなユーザー認証用のリンクが送られてくることがある。通常、token にはその人以外が知りえない(総当りしようとすると数年〜数千年位じゃ終わらない)ようなランダムな文字が渡されている。なの…

  • 変数の知識の重複による不整合を防ぎたい(DRY原則とオブジェクト指向)

    オブジェクト内で同じ意味を持つ変数が複数存在する場合(つまり、DRY な状態になっていない)、不整合が発生する可能性がある。 例えば、注文を表す Order と、商品を表す Item を考えてみる。Order は複数の Item オブジェクトをまとめる役割である。Item にはそれぞれ商品の名前と価格を持っている。更に、Order クラスには合計金額を持たせたい。この場合、以下のように書けると思う。(アクセス修飾子は適当気味) また、sum(), printOrder() は本質的にはどうでもいい関数なので、これ以降は省略する。 // 合計を計算する(以後省略) function sum(nu…

arrow_drop_down

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

ハンドル名
buriさん
ブログタイトル
Memo:
フォロー
Memo:

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

商用