Stable Diffusion デスクトップアプリ「Sodalite」を開発した
Stable Diffusion で画像を生成する方法は数多くありますが、Web UI 系のツールは Python 環境の構築や依存関係の管理が煩雑になりやすいです。
もっと手軽に、インストーラーをダウンロードするだけで使えるデスクトップアプリが欲しくなり、Sodalite を一から開発しました。
Stable Diffusion で画像を生成する方法は数多くありますが、Web UI 系のツールは Python 環境の構築や依存関係の管理が煩雑になりやすいです。
もっと手軽に、インストーラーをダウンロードするだけで使えるデスクトップアプリが欲しくなり、Sodalite を一から開発しました。
byte[] Encoding.UTF8.GetBytes(string)MD5 MD5.create()byte[] md5.ComputeHash(byte[])string str2MD5(string src)
{
byte[] srcBytes = Encoding.UTF8.GetBytes(src);
string MD5src;
using (MD5 md5 = MD5.Create())
{
byte[] MD5srcBytes = md5.ComputeHash(srcBytes);
StringBuilder sb = new();
for (int i = 0; i < MD5srcBytes.Length; i++)
sb.Append(MD5srcBytes[i].ToString("x2"));
MD5src = sb.ToString();
}
return MD5src;
}
行数・列数、数値の入るメモリを構造体でまとめると扱いやすい。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
float *data;
int col_size;
int row_size;
} Mat;
void MatInit(Mat *mat, int row_size, int col_size) {
mat->row_size = row_size;
mat->col_size = col_size;
mat->data = (float *)calloc(row_size * col_size, sizeof(float));
}
float *MatAt(Mat *mat, int i, int j) {
return mat->data + i * mat->col_size + j;
}
void MatFree(Mat *mat) { free(mat->data); }
int main(void) {
Mat mat;
MatInit(&mat, 30, 5); // 30 行 5 列 の行列を初期化
*MatAt(&mat, 0, 0) = 50; // 行 0 列 0 に 50 を代入
printf("%f\n", *MatAt(&mat, 0, 0)); // 行 0, 列 0 の数値を表示
MatFree(&mat);
return 0;
}
DLL の作成と C のコンパイルのメモ
// gcd.c
int gcd(int a, int b){
return !b ? a : gcd(b, a % b);
}
// gcd.h
#ifndef TEST_H
#define TEST_H
int gcd(int a, int b);
#endif
#include <stdio.h>
#include "gcd.h"
int main(void){
printf("%d\n", gcd(24, 36));
}
gcc gcd.c -shared -o gcd.dll
gcc main.c -lgcd -L.