Kgtkr's Blog
Profile image
Web Developer.
RSS
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);
2022/03/27
ブログをNext.jsに移行した 今までGatsbyで作っていたブログをNext.jsに移行しました. 動機 Gatsbyの依存関係を久しぶりに更新しようと思ったら新しいメジャーリリースが出ていたり, 大量のプラグインを入れていたことが原因で移行が大変そうだったというのが動機です. Gatsbyはデータの処理にGraphQLを多用しているところなどあまり好きになれない部分があり使うのをやめたいと前から思っていました. またNext.jsはこれだけ有名なフレームワークなのに今まで一度も触ったことがなかったので使ってみることにしました. Reactやunified周りはそこそこ触ったことがあったので, 移行は比較的やりやすかったです. 大きな変更点 Gatsbyで動かしていた時はGitHubにpushしたらNetlifyでビルドが走りデプロイされるというよくあるお手軽構成でした. 今回は, 最近自宅k8sクラスタを立てて, argocdなどを導入したことでGitHubにpushしたらGitHubのWebUIをポチポチするだけでデプロイができ
2022/02/10
はじめに sqldefという目標とするスキーマを書くと, DBに接続して現在のスキーマと比較し, DBのスキーマが現在のスキーマに一致するように CREATE TABLE や ALTER TABLE などを実行してくれるGo製のcliツールがあります. 詳細はGitHubや作者のブログを見てください. これを使うことでスキーマファイルを1つリポジトリに置いておけばいいので, マイグレーションコードを手書きした時の, DBのスキーマの全体像が分かりにくいという問題が解決します. しかし個人的にはマイグレーションコードはリポジトリにコミットして, それを実行したいです. そこで今回はsqldefをマイグレーションコード生成ツールとして使ってみます. 簡単にいうとprisma.jsのmigrate機能のような使い方です(ドキュメント). prisma.jsは独自のDSLでDBのスキーマを定義し, それをDBのスキーマと比較し, マイグレーションコードを生成してくれます. しかし, 独自DSLを使う必要があり, ライブラリ依存です. 今回の方法は,
2021/11/06
実装したもの シンタックスハイライト、エラー報告、補完、フォーマットができるProcessingのLanguage ServerとVSCodeの拡張機能を実装しました。 リポジトリ https://github.com/kgtkr/processing-language-serverhttps://github.com/kgtkr/processing-language-server-vscode インストール 以下のリンクからインストールしてProcessing(現在4のbeta1とbeta2にしか対応していません)のパスを設定すれば使えます。設定した後に再起動すると自動でLanguage Serverがダウンロードされます。そのあともう一回くらい再起動が必要かもしれません(ここらへんは動作が不安定なので改善が必要ですね)。 https://marketplace.visualstudio.com/items?itemName=kgtkr.processing-language-server-vscode 作った動機 弊学科の授業で
2021/09/22
プログラミング言語の基礎概念を読んで実装したのでメモ。OCaml実装。間違っているところがあったら指摘して下さると助かります。 作ったもの コードを入力すると型推論結果を返すプログラムです。型チェック失敗時のエラーメッセージは未実装です。 例 関数合成する compose 関数を例にします。 let compose = fun f -> fun g -> fun x -> f (g x) in compose ↓ (let {3: {'2,'3,'4}(('3 -> '4) -> (('2 -> '3) -> ('2 -> '4)))} = (fun {0: {}('3 -> '4)} -> (fun {1: {}('2 -> '3)} -> (fun {2: {}'2} -> ({0}: ('3 -> '4) ({1}: ('2 -> '3) {2}: '2): '3): '4): ('2 -> '4)): (('2 -> '3) -> ('2 -> '4))): (('3 -> '4) -> (('2 -> '3) -> ('2 -
2020/09/16
対象読者 明大FMSのEP演習という授業で発表した内容の補足資料なので、同大の同級生を対象読者に基本的なところから解説しています。言語実装をしたことある人にとっては知っている話が多いかと思います。 ソースコード https://github.com/kgtkr/BarrageLCL ドキュメントもここにあります。今回はd8d1412をベースに解説していきます。 BarrageLCLの概要 Processing製の3D弾幕生成ライブコーディング言語です。実行環境だけでなく、編集環境も用意されています。自作言語×自作エディタですね。 以下のコードを見てください。 このコードは毎秒15回、初速度を (100cos(0.2i), 100sin(0.2i), 200sin(0.1i)) に、色を赤に設定して弾を発射するというコードです。i は何回目の実行かを表す変数です。 すると以下のように弾が発射されます。 なぜこれを? EP演習第一回のオープニングパフォーマンスで見たライブコーディング言語が面白かったことと、夏休みのEP演習で3D空
2020/09/02
初めに TypeScriptの型システムはチューリング完全なので何でも計算できます。 例えば繰り返し。 type Repeat<T, N extends number, R extends any[] = []> = R["length"] extends N ? R : Repeat<T, N, [T, ...R]>; // type A = ["x", "x", "x", "x", "x", "x", "x", "x", "x", "x"] type A = Repeat<"x", 10>; わーい。ちょっと数増やすか… // error TS2589: Type instantiation is excessively deep and possibly infinite. type A = Repeat<"x", 100>; あれ?(つらい) 再帰制限解除したいですね。しましょう。 注意 当然ですがプロダクトで使うことは想定していません、やめましょう。 バージョンなど typescript@4.1.0-dev.
2020/05/11
問題 https://atcoder.jp/contests/abc167/tasks/abc167_c 解法 解法としては各本を買う/買わないで全探索するとO(M2^N)で解けます。 C_n A_n_mは型としては[(Int, [Int])]になります。各要素の(Int, [Int])は単位元を(0, 要素が0の無限リスト)、演算をfstは足す、sndはzipして各要素を足すとするとモノイドになりそうですし問題を解くのに使えそうです。このようになる(Int, [Int])のnewtypeは(Sum Int, Ap ZipList (Sum Int))になります。ApはApplicative fとMonoid aからMonoid (f a)を作るnewtypeです。ZipListはpureをrepeat x、liftA2をzipして関数適用というApplicative実装を持つListのnewtypeなのでApと組み合わせると欲しいMonoidが得られます。 ところでnewtypeの変換にはcoerceという関数が便利です。安全に変換できる