Search Result: とき

Expressに22個以上の要素の配列クエリを渡すときは気をつける

…、[] を含むキーのときに配列として扱おうとするが、そのindexの大きさによって結果がarrayではなくobjectになったりする、というもの。 その境界のdefault値が20なので、順番にindexをつけているとuris[0]=...&urls[1]=...&uris[20]=... という 21個までなら問題ないが 22個になると突然objectとして扱われるようになってしまう、と。 www.npmjs.com 確かにindex指定したものを読んでくれるのは便利だが……

Rustのserdeで、データフォーマットによって異なる型にserialize/deserializeする

…分で実装すると、そのときに引数に含まれる serializer や deserializer に対して .is_human_readable() というメソッドを呼ぶことで一つ情報を得られる。 これは serde_json を使っていると true になり、 serde_ipld_dagcbor を使っていると基本的には false になるので、以下のように分岐させることで統一した CidLink で両方のデータフォーマットを扱うことができる。 #[derive(Debug)…

Cloudflare Workersで、自分のはてブをBlueskyに流す

…32 targetのときだけこれを追加する形に変更した。他のtargetの場合は何も影響を受けない。 #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] あとは atrium-xrpc-client という専用の非同期HTTP Clientを幾つか提供していたが、それらは reqwest backendのもの以…

自動でtokenをrefreshして再送するRustの非同期HTTP Client

…ed のエラーだったときのみそれを検出してtokenをrefreshして同じ内容のリクエストを再送する。最初のリクエストが成功していた場合はそのままそのレスポンスを返す。 という動き。 ATriumでの実装 で、これと同様の仕組みを持つ AtpAgent をATriumでも実装しようと考えた。 XrpcClient trait ATriumでは、AT ProtocolのXRPCリクエストを送るための XrpcClient というtraitを定義している。 #[async_tr…

PentominoをBitboardを使って解く

…る問題、となる。このときの解は 65 通りになる、とのこと。 探索アルゴリズムと実装 ということで、この問題を解くプログラムをRustで書いてみた。 計算量概算 まず、どれくらいの計算量がかかるのかを概算してみる。 ピースは12種類だが、反転と 90°, 180°, 270°の回転を考えると、それぞれに対し8通りの置き方がある。 12種類のピースの中から未使用のものを順番に選び 選んだものに対して8通りの反転/回転のどれかを選び 可能であれば(既に置かれている他のピースとぶつ…

AT Protocol(Bluesky)のためのRustライブラリを作った

…Lexicon解析のとき同様に $type tagで判別して振り分けるようにする必要があった。 とりあえず正しいコードとして生成されているかどうかは cargo build で確認できて 通ればまぁ動くだろう、という判断ができて便利だった。 API設計 型の定義だけならまだラクだが、Lexiconには query もしくは procedure のXRPCリクエストの定義が含まれる。 これは関数の実装を提供することになるが、そのためにはHTTP requestを実行するためのc…

40歳から始める関数型言語、OCaml

…ドの補完をしてもらうときに、関数のシグネチャの情報はわりと重要だと思っていて。 「こういう名前の関数でこの型のこの名前の引数を受け取って、この型の値を返す」という情報が書いてあると当然補完も正確になりやすいだろう、と。 一方でOCamlは型推論が強力なので、型はあるもののtype annotationを書く必要が殆どなく、またちょっとした処理は無名関数を書くことが多いし、そうでなくとも let rec loop acc x = ... とか let f x y = ... と…

Advent of Code 2022 を完走した

…ので、もうちょっと同じ問題に取り組んだ人達でわちゃわちゃと「ここが難しかった」「これはこんな手法があって」「こんな書き方もあって」など議論できると嬉しい…。 それはRedditで英語で頑張れば良いのだろうけど、ともかくもう少し日本語圏の開発者の間でも流行って仲間が増えてくれるといいな、と思っている。 という想いもあり、2020のときにもやったけど 日本語の解説本を書いてみている。 github.com まだ半分もいってないけど… 少しでも多くのプログラマの人たちに届くといいな

2023パズル をRustで解いてみる

…ら条件を満たしているときだけ操作するようにする。 様々な実装が試せるように Trait を定義。 trait Rpn { fn traverse( &mut self, expr: &mut Vec<ExpressionElement>, (i, j): (usize, usize), results: &mut Vec<Vec<ExpressionElement>>, ) { if i == j + 1 && self.get(i).is_none() { if self.…

Rubyでバイナリデータに対するrindex検索の挙動でハマったので調べたことメモ

…バイナリデータを扱うときには必ずEncodingを ASCII-8BIT に指定しておくこと! きっかけ roo というgem (記事時点で 2.9.0)を使って、Excelファイルを開こうとした。 require 'roo' p Roo::Excelx.new("hoge.xlsx") これは問題ないが、 #initialize の引数は file_or_strem ということでファイルを open したものを渡しても良いはず、と require 'roo' File.op…

spherical linear interpolation(slerp)によるlatent spaceでのnoise補間

…GAN で遊んでいたときにちょっとそういう話題を聞いたことがあったような気もする…。 arxiv.org しかしこれによって Gaussian noise として分散を保ったまま変化させられる、ことになるのか…? 数学的なことはちょっとよく分からない。 まぁ球面上を角度だけ変えて動いていると考えればノルムが変化しないから大丈夫なのかな??くらいの感覚でしかない…。 実際にこれを使って補間していったときにどのような変化になるか、前回の記事で書いていた sqrt を使うものと上述…

Stable Diffusionでmorphing

…。 prompt のときと同じように変化させていけば良いだけ、と思ったが そうはいかない。実際やってみると中間点あたりはボヤけた画像になってしまうようだ。 最初 何故だろう…?と思ったが どうやらこの noise は "Gaussian noise" であることが重要で、標準正規分布として になっていなければならない、ということらしい。 単純に v0 * (1.0 - x) + v1 * x のように単純な線形結合で変化させていくと、中心に近づくにつれてその標準偏差は小さくな…

Slackの家庭内日記をはてなブログに同期していく

…に同期されるようになってくれるはず。 書くときはSlackに書き続け、90日以上前のものは調べたり検索したりできなくなるけど そのときはブログの方で検索すればもっと昔まで遡ることができる、という運用。 まとめ まだ完全に同期に成功しているわけではないけど、この運用でしばらくやってみる予定。そもそも家庭内の日記がどこまで続くか…という問題もあるけど。まぁ夫婦ともに3年くらい続いているわけだし しばらくは続くんじゃないかな? 子育てで大変な日々も数年後には笑って読み返せるといいな

Rustで将棋棋譜変換ライブラリを作った

…表記だけを取り上げたときに「どの駒が」「どこから動いて」「どうなったか」などの情報をすべて知ることは出来ない。直前の指し手や現在の盤面の情報がないと分からないものが多かったりする。 そこで、json-kifu-formatという形式が提案されて公開されている。 github.com READMEに書かれている通り、各指し手について必要な情報をすべて含めたJSON形式で表現し、また分岐にも対応している。 例: { "header": { "先手": "na2hiro", "後手…

SIMDによる将棋Bitboard計算の高速化

…imd など指定したときのみ有効になり、これが指定されなかったり 対応する実装が存在していない場合は、SIMDを使わない shogi_core::Bitboard を使用する実装にfallbackするようにしている。 x86_64 まずはx86_64のものを実装した。128bitレジスタを利用するSSE命令をメインに、一部でAVX2を使用して256bitレジスタでの計算も行っている。 use std::arch::x86_64; pub(crate) struct Bitbo…

Bitboardでleading/trailing zerosを使って飛び駒の利きを求める

…ことで最初に呼ばれたときにだけ初期化の計算する方式をとっている。 後者について。 前述の通り、一直線に並んでいる香車のような動きなら全体をshiftすることで簡単にindexを計算できるが、横や斜めの動きに関しては注目すべきbitが飛び飛びになるので同じようにはできない。 何とかして対象となるmaskの位置のbitだけの値をかき集めてきて数値を得たい。 .##.#.#. ##.#.#.# | occupancy ..#..#.. #..#..#. | mask ( 1 0 1…

Rust+WASMでつくる、ブラウザ上で動く詰将棋Solver

…もないので普通に使うときには std::time::Instant::now() を使いたい…。 こういうケースのために instant crate というものが存在していて、通常のbuildでは std::time::Instant として動作しつつ、wasm-bindgen featureを指定して.wasmをbuildする場合には performance.now() を使うようにしてくれる、らしい。 これだけの対応で無事にWebAssembly化に成功した。 将棋Pla…

Rustで将棋合法手生成、速度改善

…れぞれを移動元としたときの移動先候補を列挙し、それらから自軍駒の位置を除外(既に自軍駒のある位置には移動できない)」となるが、歩兵の場合は「駒の居る位置のbbを1つだけシフトして、自軍駒の位置を除外」で一気に移動先候補が求まり、そこから逆算で移動元を求める方が効率が良い。 縦型Bitboardならではの方法で、64bit整数2つを繋げてshiftするのは面倒だが正しい盤面であればそもそも境界の場所には歩は居ないはずなのでそこは無視してそれぞれ独立してshiftしてしまえば良い…

Rustでつくる もう一つの将棋ライブラリ

…棋Solverを作るときもこういった方法で合法手を生成していた(詰将棋の場合は攻方のときに王手かける必要があるのでそのチェックも必要になるが)。 shogi ライブラリはBitboardを使った実装で非常に速いのだけど、それでもまったく問題ないわけではない。 perft 局面探索の確認と測定に使えるものとして、 perft というものがある。 ある局面から指定した深さまで局面を探索していくと全部で幾つの局面が現れるか、を数え上げる。「手順違いで同一局面に合流」などは考慮せず、…

Rustでつくる詰将棋Solver その後

…面に戻ってくる。このとき この局面の証明数・反証数がともに ∞-1 という値でハッシュテーブルに保存されているので、ループ内での証明数の最小値と反証数の総和がともに ∞-1 になる。これによっておかしな結果になってしまっているようだったので、反証数の和が ∞-1 以上だった場合は証明数の和を強制的に 0 にすることで解決した。 Issue: Cannot solve · Issue #7 · sugyan/tsumeshogi-solver · GitHub 打ち歩詰めの誤判…

Rustでつくる詰将棋Solver

…なる。 Goで作ったときは愚直にif文for文まみれで自作して使っていて、当然ながら速度も出なかった。 RustではBitboardベースの優れたライブラリが既に作られ公開されているので、これを使うことにした。 https://crates.io/crates/shogi github.com 実装に必要なもの さて、df-pnアルゴリズムは簡単にいうと「root node (初期盤面) から合法手で辿れる child nodes についてそれぞれ(証明数, 反証数) のペア…

ISUCON11予選のNode.js実装を書いた

…の実装を手伝っているときに、benchmarkerを走らせていると何故か予期せぬところで 401 を返していてチェックが失敗するという現象が起きていた。 401 ってことはcookie-sessionまわりだよな〜 でも特に変なところとか無いはずだしな〜 と id:kfly8 氏と一緒に見ていて、ところで Plack::Middleware::Session::Cookie の secret は "tagomoris" とかじゃなくて 今回は "isucondition" (…

StyleGAN2で属性を指定して顔画像を生成する

…の顔画像を生成 このとき、生成結果とともに dlatents の値もペアで保存しておく 生成結果の画像すべてに対し、顔画像の属性を推定する 推定結果の上位(または下位)数%を抽出し、それらを生成した dlatents たちの平均をとる 例えば表情に関する属性の場合、各生成結果の画像の「笑顔度」のようなものを機械的に推定し(もちろん手動で判別しても良いが、めちゃめちゃ高コストなので機械にやってもらいたい)、それが高scoreになっているものだけを集めて それらを生成した dla…

N番目の素数を求める

…数を求めたい」というときに limitを幾つに設定して篩にかけていけばN番目までの素数を導き出せるかが不明なので、前述の実装だと limit = 1000 から始めて素数列を列挙し、N個に満たなければ limit を倍々にしていってN番目が求められるまで繰り返していっている。 10,000番目を求めるためには limitが128000になるまで8回、100,000番目を求めるためにはlimitが2048000になるまで12回、list_primesを呼び出して毎回同じような篩…

顔画像生成のためのデータセットを厳選する

…れてしまう。こういうときは HSV色空間で判定するのが良いらしい。Hueで赤色周辺の値で絞り、Saturation, Valueはそれなりの閾値を設けておく。その範囲内であれば「赤っぽい」といった判定ができるようだ。 import cv2 import numpy as np mouth = img[ymin:ymax, xmin:xmax, :] hsv = cv2.cvtColor(mouth, cv2.COLOR_BGR2HSV) mask = sum( [ cv2.i…

ISUCON10 予選敗退した

…が遅かったりハマったときに無駄にハマり続けて時間を浪費してしまっていた、というのはある。 ここは日々の鍛錬でどうにかしていくしかない。 感想 一人自宅からリモート参加というのは初挑戦だったけど、そこはそれほど苦にはならない程度に出来たかな、と思うので それは良かったと思う。 とはいえ理想としてはチーム全員集まってワイワイやれた方が楽しいとは思うけども。 来年はどうなるかな〜。 運営の皆様は今回も準備や当日の進行が大変そうではありましたが 取り組み甲斐のある面白い問題を出してい…

StyleGAN2学習済みモデルを使ったmorphing、latent spaceの探求

… 256x256 のときの数値で upsample の layer 数が増えるとまた 16 や 18 に変化したりする、のかな。) で、この Disentangled latents と呼ばれる出力が、後段の synthesis network への入力に使われ、実際の画像の合成が行われる、ということになる。 dlatents_in と呼ばれるこの値が 画像生成のための入力としてはより直接的なものになるのかもしれない。 ザックリした理解では、 synthesis networ…

StyleGAN2による画像生成をCPU環境/TensorFlow.jsで動かす

…これも NCHW のときと NHWC のときで扱いが変わるものらしい。 この strides と前述の output_shape については upfirdn_2d.upsample_conv_2d() に分岐が書かれている。 upfirdn_2d.py 抜粋: # Determine data dimensions. if data_format == 'NCHW': stride = [1, 1, factor, factor] output_shape = [_shape…

顔画像生成のためのデータセットを作る

…検出を試みる。 このとき、 fhog_object_detector.run(image, upsample_num_times, adjust_threshold) のAPIで検出をかけることで、その検出結果の confidence score も取得できるので それらを含めて全パターンの結果を集める。 http://dlib.net/python/index.html#dlib.fhog_object_detector.run 手元で試した限りでは -48° 〜 +48°…

Advent of Code 2019 に挑戦している

…いて、スッキリ解けたときの爽快感がすごい。 あと特徴として、毎回恒例なのか今年のが特別なのかは知らないけど シリーズものになっている問題もある。 奇数日は IntCode という 整数値列を使ったレジスタマシンのようなものを使用することになり、このインタプリタを実装する問題が day5, day7, day9 あたりで出されている。このへんは順番にやっていないと解けない。 でも ちゃんと動かせると迷路を出現させたりブロック崩しのゲームが動いたりして、これは感動した I've …