スミスは浜辺で寿司を食べる

Docker Desktop の Extensions を実装してみよう - kakakakakku blog

Docker Desktop Extensionsて作れるようになってたのか。覚えとこ。

CPU シミュレータを用いて継続的ベンチマークを安定化させる - mizdra's blog

こういう課題にこういう解決があるんだな。そいやCPU本まだ買ってなかったの思い出した。

兼任でもコンバートから通しプレイまで自動化。Jenkinsを中心に構築した『Xenoblade3(ゼノブレイド3)』の自動化の取り組み【CEDEC+KYUSHU 2022】 | ゲームメーカーズ

ゲーム開発の世界は知らんけど、普通にJenkinsとか活用してるのね。ゲーム側がRPCサーバになってリクエストを受け付けるの、公開APIがそんな感じで面白い。

Azure Native New Relic Service: Full stack observability in minutes | Azure Blog and Updates | Microsoft Azure

AzureでNew Relicがマーケットプレイスに来て導入が超簡単になった。 App Servicesでも使えるって書いてるけど、 Manage Azure Native New Relic Service Preview - Azure Native ISV Services | Microsoft Learn によるとまだWindowsだけみたい。 Linuxのコンテナで動かしてるRailsサービスがAzure Monitor, App Insightsだけだと足りなくて、どうにかしたいとは思ってはいるので早いとこ対応してくれ。 個人的にはまたMackerelに戻したい気持ちもあるんだが。 なお裁量(ry

楽しい競技プログラミングの世界 (公開版).pdf - Google ドライブ

きっかけはこれとは関係なかったけど、数日前からAtCoderの過去問をちょっとやってみてる。 目的はこれにある基礎体力作りに相当して、今のところは色付きとか競技性は求めてない。 緩く長く楽しく続けられりゃいいので、F#でお気楽なコード書けててとても良い。


Stable Diffusion WebUIには各種OpenAPIが生えてて好きに使える。 下記はText2Imgで生成した画像にメタデータを埋め込んで保存するメモ。 ちなみにメタデータText2ImgResponseinfo: stringJSONなのでパースして好きに整形することもできるが今回は省略。

open System
open System.IO
open System.Net
open System.Net.Http
open System.Text.Json

type Text2ImgRequest =
    { prompt: string
      negative_prompt: string
      seed: int64
      batch_size: int
      n_iter: int
      steps: int
      cfg_scale: float
      width: int
      height: int
      sampler: string }

type Text2ImgResponse = { images: string list; info: string }

let post host (req: Text2ImgRequest) =
    async {
        use stream = new MemoryStream()

        JsonSerializer.SerializeAsync(stream, req)
        |> Async.AwaitTask
        |> ignore

        stream.Seek(0, SeekOrigin.Begin) |> ignore

        use content = new StreamContent(stream)

        use httpClient = new HttpClient(BaseAddress = host, Timeout = TimeSpan(0, 20, 0))

        use! res =
            httpClient.PostAsync("/sdapi/v1/txt2img", content)
            |> Async.AwaitTask

        match res.StatusCode with
        | HttpStatusCode.OK ->
            use! stream = res.Content.ReadAsStreamAsync() |> Async.AwaitTask

            let! result =
                JsonSerializer
                    .DeserializeAsync<Text2ImgResponse>(stream)
                    .AsTask()
                |> Async.AwaitTask

            return Ok result
        | _ ->
            let! result = res.Content.ReadAsStringAsync() |> Async.AwaitTask
            return Error result
    }


let annotate info image =
    let imageBytes = Convert.FromBase64String(image)
    let infoBytes = Array.zeroCreate<byte> (String.length info * sizeof<char>)
    let fileBytes = Array.zeroCreate<byte> (imageBytes.Length + infoBytes.Length)
    Buffer.BlockCopy(info.ToCharArray(), 0, infoBytes, 0, infoBytes.Length)
    Buffer.BlockCopy(imageBytes, 0, fileBytes, 0, imageBytes.Length)
    Buffer.BlockCopy(infoBytes, 0, fileBytes, imageBytes.Length, infoBytes.Length)
    fileBytes

let save dir req index image =
    async {
        let filename =
            Path.Join(dir, $"{req.sampler}-{req.cfg_scale}-{req.steps}-{req.seed}-{index}.png")

        do!
            File.WriteAllBytesAsync(filename, image)
            |> Async.AwaitTask
    }

let host = Uri "http://localhost:7860"
let dir = "."

let req =
    { prompt = "Will Smith eats sushi at the beach"
      negative_prompt = ""
      seed = Random.Shared.NextInt64()
      batch_size = 1
      n_iter = 1
      steps = 20
      cfg_scale = 11
      width = 512
      height = 512
      sampler = "Euler" }

async {
    let! res = post host req

    match res with
    | Ok res ->
        do!
            res.images
            |> List.map (annotate res.info)
            |> List.mapi (save dir req)
            |> Async.Parallel
            |> Async.Ignore
    | Error error -> printfn "%s" error
}
|> Async.RunSynchronously

ウィル君にっこにこやね😊


積み

まぁチョコ食べることなんて無い。