2023/08/01
はじめに
2022年度の大学のプロジェクトで(今更すぎる)手書き風の画像を生成するWebサービスを開発したのでそれについての話です。
リンク
tegaki.fun
サービスのURL
nkmr-lab/average-character-cloud-backend
バックエンドのリポジトリ
nkmr-lab/average-character-cloud-frontend
フロントエンドのリポジトリ
nkmr-lab/average-figure-drawer
平均手書き文字(手書き文字の合成文字)を生成するライブラリのリポジトリ。研究室で数年前に作られた物をTypeScript化(不完全)するなどしただけで、上2つと違って1人で書いたわけではない。
サービスの概要
下の画像のように、上のテキスト欄に文字列を入力すると、その文字列に対応する手書き風の画像を生成してくれます。背景画像はユーザが用意してきて、それに合わせて文字サイズや書字方向、行間字間などを設定する仕様です。各文字は、ユーザが登録した手書き文字を複数組み合わせて平均手書き文字とい
2022/08/13
はじめに
8/8から8/12に行われたセキュリティキャンプ2022のデータベースゼミに参加してきました. このゼミでは, データベースの中でもトランザクションを中心に学び, 実装しました. 講師の星野さん(@starpoz), ありがとうございました.
講義資料
ゼミの講義資料がGitHubで公開されたので貼っておきます. Releaseページからpdfをダウンロードできます.
https://github.com/starpos/develop-transaction-system
作ったもの
Rust製のサーバクライアントモデルのkvsです.
リポジトリ: https://github.com/kgtkr/tkvs公開サーバ: https://tkvs.kgtkr.net
サーバはgrpcを使っているのでgrpcurlからも使えますが, セッションのTTL管理やbase64エンコードが大変なのでリポジトリに入っているcliクライアントを使った方が便利です.
cliクライアントでの使用例
$ tkvs-client https
2022/04/04
実装したもの
https://github.com/kgtkr/wjit
$ cat ./sample.wjit
func main() {
var x = fib(10) in
println(x);
func_a(10);
println(is_prime(3));
println(is_prime(4));
println(is_prime(5));
println(is_prime(6));
}
func fib(n) {
if (n < 2) {
n;
} else {
fib(n - 1) + fib(n - 2);
};
}
func func_a(x) {
println(x);
if (x <= 0) {
x;
} else {
func_b(x - 1);
};
}
func func_b(x) {
println(x);
2019/12/09
Rustにはcatch_unwindという関数がありpanicをキャッチすることが出来ます。
Rustのパニック機構 - 簡潔なQ
しかしここから得られるエラー情報がかなり少ないです。キャッチして得られるResultのError型はBox<dyn Any>みたいな型ですが、これがほとんどStringまたは&strとなっており(今の所他の型を見ていませんが詳しい方教えて下さい)、確認した所スタックトレース情報やパニックが発生したソースの位置情報は入っていませんでした。例えば以下のコードはpanic testと出力します。
if let Err(e) = panic::catch_unwind(move || {
panic!("panic test");
}) {
println!("{}", any_to_string(&*e));
}
fn any_to_string(any: &dyn std::any::Any) -> String {
if let Some(s) = any.downcast_ref::<S
2018/08/30
競プロで標準入力のパースがめんどうだったのでマクロ作りました。
AtCoderのRust(1.15.1)でテスト済みです。
ソースコード
https://github.com/kgtkr/procon-lib-rs/blob/master/src/parser.rs
使い方
事前準備
標準入力を全て読み込む
let text = {
let mut s = String::new();
io::stdin().read_to_string(&mut s).unwrap();
s
};
例
入力値
5
10 20
1 a
2 b
3 c
4 d
5 e
1 2 3 4 5
input!(text=>
(n:usize)
(a:i64 b:i64)
{n;list:(i64,#)}
(arr:[i64])
);
assert_eq!(n, 5);
assert_eq!(a, 10);
assert_eq!(b, 20);
assert_eq!(list, vec![(1,"a"