Skip to content

Instantly share code, notes, and snippets.

View kawasima's full-sized avatar

Yoshitaka Kawashima kawasima

View GitHub Profile
@kawasima
kawasima / account.sou
Created August 31, 2026 05:59
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 https://speakerdeck.com/shimashima35/beyond-unit-testing-practical-java-development-techniques-for-organizing-requirements-and-specifications をSoutherで書いた場合
module example.account
// アカウントとログインの仕様を、書いてあるとおりに写したもの。
//
// 3.1 ログイン
// ユーザーはメールアドレスとパスワードを入力してログインを行う。
// 入力されたパスワードが正しい場合はログインを許可する。
// ログインに失敗した場合、失敗回数をカウントする。
// 3回を超えた場合、アカウントはロック状態となりログインができなくなる。
// 3.2 アカウントの認証
@kawasima
kawasima / 共通.examples.sou
Last active August 23, 2026 14:32
介護報酬の算定構造(指定居宅サービス)を Souther で写したもの — 元資料: 厚生労働省「介護報酬の算定構造」令和3年4月施行 Ⅰ章 https://www.wam.go.jp/gyoseiShiryou-files/documents/2022/0322211552821/202203a.pdf
examples for kaigo.共通
// 表の各セルと、行だけが名指す値。モデル本体と分けてある。
example 記号を適用する
| "+○○単位は所定単位数に足す" : (単位数(250), 単位加算 { 単位 = 単位数(100) }) -> 単位数(350)
| "-○○単位は所定単位数から引く" : (単位数(766), 単位減算 { 単位 = 単位数(94) }) -> 単位数(672)
| "×○○/100は所定単位数に率を掛ける" : (単位数(250), 割合乗算 { 分子 = 90, 分母 = 100 }) -> 単位数(225)
| "+○○/100は所定単位数に率の分を足す" : (単位数(250), 割合加算 { 分子 = 25, 分母 = 100 }) -> 単位数(313)
| "×200/100は倍にする" : (単位数(396), 割合乗算 { 分子 = 200, 分母 = 100 }) -> 単位数(792)
import static net.unit8.raoh.json.JsonDecoders.*;
JsonDecoder<Quantity> quantityDec =
int_().min(1).map(Quantity::new);
JsonDecoder<ShippingAddress> addressDec =
field("shippingAddress",
string().nonBlank().map(ShippingAddress::new));
// ProductRepositoryを受け取り、flatMapで存在チェックまで行う
@kawasima
kawasima / send-claude.zsh
Last active February 26, 2026 09:25
AIへの指示っぽいものはClaude codeに送る
typeset -g AI_JP_RATIO_THRESHOLD=0.35
typeset -g AI_MIN_LEN=6
_ai_jp_len() {
local s="$1"
local jp_only
jp_only=$(print -r -- "$s" | perl -CS -pe 's/[^\p{Hiragana}\p{Katakana}\p{Han}]//g')
echo ${#jp_only}
}
@kawasima
kawasima / sevens.ts
Created March 26, 2024 12:56
7並べのモデル Domain Modeling Made Functional風味
import z from "zod";
const Suit = z.enum(["Spade", "Heart", "Diamond", "Club"]);
const Rank = z.enum(["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]);
const Card = z.object({
suit: Suit,
rank: Rank,
});
type Card = z.infer<typeof Card>;
// 手札
import { match } from "ts-pattern";
import z from "zod";
const Station = z.object({
name: z.string()
})
const Time = z.object({
hour: z.number().int().min(0).max(12),
minute: z.number().int().min(0).max(59),
})
@kawasima
kawasima / MethodSecurityMinimal.java
Last active February 1, 2023 13:50
ミニマルなSpring SecurityのMethod Security
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.config.AopConfigUtils;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.authorization.AuthorizationManager;
import org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor;
import org.springframework.security.authorization.method.PreAuthorizeAuthorizationManager;
/*
* ------------------------------------------------------------
* "THE YAKINIKUWARE LICENSE" (Revision 42):
* <author> wrote this code. As long as you retain this
* notice, you can do whatever you want with this stuff. If we
* meet someday, and you think this stuff is worth it, you can
* treat me grilled meat in return.
* ------------------------------------------------------------
*/
@kawasima
kawasima / postmortem.md
Created November 14, 2022 04:33
The template of the postmortem

タイトル

(概要)

問題発生期間

(あればタイムラインを書く)

トリガー

import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationConfig;
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
import com.fasterxml.jackson.databind.introspect.ClassIntrospector;
import java.util.LinkedHashMap;
import java.util.Map;