洪 民憙 (Hong Minhee)
hongminhee.hackers.pub.ap.brid.gy
洪 民憙 (Hong Minhee)
@hongminhee.hackers.pub.ap.brid.gy
Hi, I'm who's behind Fedify, Hollo, BotKit, and this website, Hackers' Pub! My main account is at @hongminhee.

Fedify, Hollo, BotKit, 그리고 보고 계신 이 […]

🌉 bridged from https://hackers.pub/@hongminhee on the fediverse by https://fed.brid.gy/
Reposted by 洪 民憙 (Hong Minhee)
이게 금방 매진이 되려고 하네......
## Hackers Public @ Seoul 송년회 ---- 2025년의 마지막을 해커들과 함께해요.

Hackers' Public @ Seoul 송년 네트워킹 밋업은 발표보다 대화, 형식보다 연결을 중심으로 진행됩니다. 라이트닝 토크도 지원받습니다. 만들었던 것·배운 것·고민했던 이야기를 자유롭게 얘기해보도록 해요.

많은 관심 부탁드립니다~

* 🗓 12/21(일) 14:30~18:30
* 🎤 라이트닝 토크 5분 자유 참여
* 📌 1차 모집: 11.26~12.5 (회원 대상)
* 신청하기 👉 […]
Original post on hackers.pub
hackers.pub
November 28, 2025 at 10:31 AM
Reposted by 洪 民憙 (Hong Minhee)
아무래도 來年(내년)에는 海外(해외) 컨퍼런스에 많이 參加(참가)하게 될 것 같다. 一旦(일단) 只今(지금) 생각나는 것만으로도 네 個(개)나 있음:

* FOSDEM 2026 (브뤼셀)
* FediCon 2026 (밴쿠버)
* COSCUP 2026 (臺北(타이베이))
* TSKaigi 2026 (東京(도쿄))

November 28, 2025 at 7:40 AM
Reposted by 洪 民憙 (Hong Minhee)
Update: I just submitted a talk proposal to the Social Web Devroom at @fosdem— _Fedify: Type-safe ActivityPub for TypeScript_. Guess I'm flying to Brussels after all. 😅
November 28, 2025 at 4:18 AM
자면서 @fosdem 2026 가는 꿈을 꿨다… 이건 가라는 계시인가…!?
November 28, 2025 at 2:27 AM
Reposted by 洪 民憙 (Hong Minhee)
오늘 코딩(유의어: 클로드 갈구기)는 여기서 포기
사유:
November 27, 2025 at 9:27 AM
공식 Mastodon 계정도 있네요: @unison.

RE: https://sns.lemondouble.com/notes/afkf8n8q9a
sns.lemondouble.com
November 27, 2025 at 3:27 AM
그나저나 GeekNews 댓글 란은 언제 봐도 저질이구먼.

RE: https://sns.lemondouble.com/notes/afkajq0w8s
sns.lemondouble.com
November 27, 2025 at 2:44 AM
Reposted by 洪 民憙 (Hong Minhee)
GitHub Action Rerunner
# GitHub Action Rerunner 사용해보기 실패한 GitHub Actions를 팀원들이 직접 재실행할 수 있도록 권한을 위임하는 웹 애플리케이션입니다. ## 🎯 왜 만들었나요? GitHub Actions가 실패했을 때, 재실행하려면 해당 레포지토리에 대한 Write 권한이 필요합니다. 하지만 보안상의 이유로 모든 팀원에게 Write 권한을 주기는 어렵습니다. **GitHub Action Rerunner** 는 이 문제를 해결합니다. 레포지토리 소유자가 토큰을 등록하면, 팀원들은 **자신에게 할당된 PR** 의 실패한 Action만 재실행해 레포지토리에 대한 직접적인 권한 없이도 CI/CD를 다시 돌릴 수 있습니다! ## ✨ 주요 기능 ### 레포지토리 소유자 (Owner) * 📦 개인 및 조직 레포지토리 등록 * 🔑 GitHub Personal Access Token 등록 (암호화 저장) * 🔗 공유 가능한 고유 링크 생성 * 👀 모든 실패한 PR 확인 및 재실행 * ⚙️ 레포지토리 설정 관리 ### 팀원 (Assignee) * 📋 자신에게 할당된 PR 목록 확인 * 🔄 실패한 GitHub Action 원클릭 재실행 * 📊 워크플로우 상태 실시간 확인 ### 계정 관리 * 🔐 GitHub OAuth 로그인 * 👥 여러 GitHub 계정 연동 지원 * 🔀 계정 간 쉬운 전환 ## 🛠 기술 스택 * **Frontend** : Next.js 16 (App Router), React 19, Tailwind CSS 4 * **Backend** : Next.js API Routes * **Authentication** : NextAuth.js v5 (GitHub OAuth) * **Database** : PostgreSQL + Prisma ORM * **GitHub API** : Octokit ## 🚀 직접 배포하기 현재 프로젝트는 이미 배포되어 있으나, 민감한 토큰을 다루기 때문에 직접 배포하시고 싶다면 아래 가이드를 참고하세요. ### 1. 환경 변수 설정 `.env` 파일을 생성하고 다음 값을 설정하세요: # DB (PostgreSQL) DATABASE_URL="postgresql://..." DIRECT_URL="postgresql://..." # NextAuth.js AUTH_SECRET="use `npx auth secret`" AUTH_GITHUB_ID="your-github-oauth-app-id" AUTH_GITHUB_SECRET="your-github-oauth-app-secret" # Token Encryption (32자) ENCRYPTION_KEY="your-32-character-encryption-key" ### 2. GitHub OAuth App 생성 1. GitHub Developer Settings에서 OAuth App 생성 2. **Authorization callback URL** : `http://localhost:3000/api/auth/callback/github` 3. Client ID와 Client Secret을 환경 변수에 설정 ### 3. 개발 서버 실행 # 의존성 설치 pnpm install # Prisma 클라이언트 생성 npx prisma generate # 데이터베이스 마이그레이션 npx prisma migrate dev # 개발 서버 실행 pnpm dev http://localhost:3000에서 확인하세요. ## 📖 사용 방법 ### 레포지토리 등록 (소유자) 1. GitHub으로 로그인 2. 대시보드 → 레포지토리 등록 3. 등록할 레포지토리 선택 4. 설정 페이지에서 Personal Access Token 등록 * Token에 `repo` 및 `actions` 권한 필요 5. 생성된 링크를 팀원들과 공유 ### Action 재실행 (팀원) 1. 공유받은 링크로 접속 2. GitHub으로 로그인 3. 자신에게 할당된 PR 목록 확인 4. 실패한 워크플로우 옆 "Rerun" 버튼 클릭 ## 🔒 보안 * Personal Access Token은 AES-256-GCM으로 암호화되어 저장됩니다. * 팀원은 자신에게 할당된 PR의 Action만 재실행할 수 있습니다. * 모든 API 요청은 세션 기반 인증을 거칩니다.
hackers.pub
November 26, 2025 at 7:58 AM
Reposted by 洪 民憙 (Hong Minhee)
## Hackers Public @ Seoul 송년회 ---- 2025년의 마지막을 해커들과 함께해요.

Hackers' Public @ Seoul 송년 네트워킹 밋업은 발표보다 대화, 형식보다 연결을 중심으로 진행됩니다. 라이트닝 토크도 지원받습니다. 만들었던 것·배운 것·고민했던 이야기를 자유롭게 얘기해보도록 해요.

많은 관심 부탁드립니다~

* 🗓 12/21(일) 14:30~18:30
* 🎤 라이트닝 토크 5분 자유 참여
* 📌 1차 모집: 11.26~12.5 (회원 대상)
* 신청하기 👉 […]
Original post on hackers.pub
hackers.pub
November 26, 2025 at 6:21 AM
Reposted by 洪 民憙 (Hong Minhee)
Optique 0.7.0: Smarter error messages and validation library integrations
We're thrilled to announce Optique 0.7.0, a release focused on developer experience improvements and expanding Optique's ecosystem with validation library integrations. Optique is a type-safe, combinatorial CLI argument parser for TypeScript. Unlike traditional CLI libraries that rely on configuration objects, Optique lets you compose parsers from small, reusable functions—bringing the same functional composition patterns that make Zod powerful to CLI development. If you're new to Optique, check out _Why Optique?_ to learn how this approach unlocks possibilities that configuration-based libraries simply can't match. This release introduces automatic “Did you mean?” suggestions for typos, seamless integration with Zod and Valibot validation libraries, duplicate option name detection for catching configuration bugs early, and context-aware error messages that help users understand exactly what went wrong. ## “Did you mean?”: Automatic typo suggestions We've all been there: you type `--verbos` instead of `--verbose`, and the CLI responds with an unhelpful “unknown option” error. Optique 0.7.0 changes this by automatically suggesting similar options when users make typos: const parser = object({ verbose: option("-v", "--verbose"), version: option("--version"), }); // User types: --verbos (typo) const result = parse(parser, ["--verbos"]); // Error: Unexpected option or argument: --verbos. // // Did you mean one of these? // --verbose // --version The suggestion system uses Levenshtein distance to find similar names, suggesting up to 3 alternatives when the edit distance is within a reasonable threshold. Suggestions work automatically for both option names and subcommand names across all parser types—`option()`, `flag()`, `command()`, `object()`, `or()`, and `longestMatch()`. See the automatic suggestions documentation for more details. ### Customizing suggestions You can customize how suggestions are formatted or disable them entirely through the `errors` option: // Custom suggestion format for option/flag parsers const portOption = option("--port", integer(), { errors: { noMatch: (invalidOption, suggestions) => suggestions.length > 0 ? message`Unknown option ${invalidOption}. Try: ${values(suggestions)}` : message`Unknown option ${invalidOption}.` } }); // Custom suggestion format for combinators const config = object({ host: option("--host", string()), port: option("--port", integer()) }, { errors: { suggestions: (suggestions) => suggestions.length > 0 ? message`Available options: ${values(suggestions)}` : [] } }); ## Zod and Valibot integrations Two new packages join the Optique family, bringing powerful validation capabilities from the TypeScript ecosystem to your CLI parsers. ### @optique/zod The new `@optique/zod` package lets you use Zod schemas directly as value parsers: import { option, object } from "@optique/core"; import { zod } from "@optique/zod"; import { z } from "zod"; const parser = object({ email: option("--email", zod(z.string().email())), port: option("--port", zod(z.coerce.number().int().min(1).max(65535))), format: option("--format", zod(z.enum(["json", "yaml", "xml"]))), }); The package supports both Zod v3.25.0+ and v4.0.0+, with automatic error formatting that integrates seamlessly with Optique's message system. See the Zod integration guide for complete usage examples. ### @optique/valibot For those who prefer a lighter bundle, `@optique/valibot` integrates with Valibot—a validation library with a significantly smaller footprint (~10KB vs Zod's ~52KB): import { option, object } from "@optique/core"; import { valibot } from "@optique/valibot"; import * as v from "valibot"; const parser = object({ email: option("--email", valibot(v.pipe(v.string(), v.email()))), port: option("--port", valibot(v.pipe( v.string(), v.transform(Number), v.integer(), v.minValue(1), v.maxValue(65535) ))), }); Both packages support custom error messages through their respective error handler options (`zodError` and `valibotError`), giving you full control over how validation failures are presented to users. See the Valibot integration guide for complete usage examples. ## Duplicate option name detection A common source of bugs in CLI applications is accidentally using the same option name in multiple places. Previously, this would silently cause ambiguous parsing where the first matching parser consumed the option. Optique 0.7.0 now validates option names at parse time and fails with a clear error message when duplicates are detected: const parser = object({ input: option("-i", "--input", string()), interactive: option("-i", "--interactive"), // Oops! -i is already used }); // Error: Duplicate option name -i found in fields: input, interactive. // Each option name must be unique within a parser combinator. This validation applies to `object()`, `tuple()`, `merge()`, and `group()` combinators. The `or()` combinator continues to allow duplicate option names since its branches are mutually exclusive. See the duplicate detection documentation for more details. If you have a legitimate use case for duplicate option names, you can opt out with `allowDuplicates: true`: const parser = object({ input: option("-i", "--input", string()), interactive: option("-i", "--interactive"), }, { allowDuplicates: true }); ## Context-aware error messages Error messages from combinators are now smarter about what they report. Instead of generic "No matching option or command found" messages, Optique now analyzes what the parser expects and provides specific feedback: // When only arguments are expected const parser1 = or(argument(string()), argument(integer())); // Error: Missing required argument. // When only commands are expected const parser2 = or(command("add", addParser), command("remove", removeParser)); // Error: No matching command found. // When both options and arguments are expected const parser3 = object({ port: option("--port", integer()), file: argument(string()), }); // Error: No matching option or argument found. ### Dynamic error messages with `NoMatchContext` For applications that need internationalization or context-specific messaging, the `errors.noMatch` option now accepts a function that receives a `NoMatchContext` object: const parser = or( command("add", addParser), command("remove", removeParser), { errors: { noMatch: ({ hasOptions, hasCommands, hasArguments }) => { if (hasCommands && !hasOptions && !hasArguments) { return message`일치하는 명령을 찾을 수 없습니다.`; // Korean } return message`잘못된 입력입니다.`; } } } ); ## Shell completion naming conventions The `run()` function now supports configuring whether shell completions use singular or plural naming conventions: run(parser, { completion: { name: "plural", // Uses "completions" and "--completions" } }); // Or for singular only run(parser, { completion: { name: "singular", // Uses "completion" and "--completion" } }); The default `"both"` accepts either form, maintaining backward compatibility while letting you enforce a consistent style in your CLI. ## Additional improvements * **Line break handling** : `formatMessage()` now distinguishes between soft breaks (single `\n`, converted to spaces) and hard breaks (double `\n\n`, creating paragraph separations), improving multi-line error message formatting. * **New utility functions** : Added `extractOptionNames()` and `extractArgumentMetavars()` to the `@optique/core/usage` module for programmatic access to parser metadata. ## Installation deno add --jsr @optique/core @optique/run npm add @optique/core @optique/run pnpm add @optique/core @optique/run yarn add @optique/core @optique/run bun add @optique/core @optique/run For validation library integrations: # Zod integration deno add jsr:@optique/zod # Deno npm add @optique/zod # npm/pnpm/yarn/bun # Valibot integration deno add jsr:@optique/valibot # Deno npm add @optique/valibot # npm/pnpm/yarn/bun ## Looking forward This release represents our commitment to making CLI development in TypeScript as smooth as possible. The “Did you mean?” suggestions and validation library integrations were among the most requested features, and we're excited to see how they improve your CLI applications. For detailed documentation and examples, visit the Optique documentation. We welcome your feedback and contributions on GitHub!
hackers.pub
November 25, 2025 at 3:06 PM
Optique 0.7.0: Smarter error messages and validation library integrations
We're thrilled to announce Optique 0.7.0, a release focused on developer experience improvements and expanding Optique's ecosystem with validation library integrations. Optique is a type-safe, combinatorial CLI argument parser for TypeScript. Unlike traditional CLI libraries that rely on configuration objects, Optique lets you compose parsers from small, reusable functions—bringing the same functional composition patterns that make Zod powerful to CLI development. If you're new to Optique, check out _Why Optique?_ to learn how this approach unlocks possibilities that configuration-based libraries simply can't match. This release introduces automatic “Did you mean?” suggestions for typos, seamless integration with Zod and Valibot validation libraries, duplicate option name detection for catching configuration bugs early, and context-aware error messages that help users understand exactly what went wrong. ## “Did you mean?”: Automatic typo suggestions We've all been there: you type `--verbos` instead of `--verbose`, and the CLI responds with an unhelpful “unknown option” error. Optique 0.7.0 changes this by automatically suggesting similar options when users make typos: const parser = object({ verbose: option("-v", "--verbose"), version: option("--version"), }); // User types: --verbos (typo) const result = parse(parser, ["--verbos"]); // Error: Unexpected option or argument: --verbos. // // Did you mean one of these? // --verbose // --version The suggestion system uses Levenshtein distance to find similar names, suggesting up to 3 alternatives when the edit distance is within a reasonable threshold. Suggestions work automatically for both option names and subcommand names across all parser types—`option()`, `flag()`, `command()`, `object()`, `or()`, and `longestMatch()`. See the automatic suggestions documentation for more details. ### Customizing suggestions You can customize how suggestions are formatted or disable them entirely through the `errors` option: // Custom suggestion format for option/flag parsers const portOption = option("--port", integer(), { errors: { noMatch: (invalidOption, suggestions) => suggestions.length > 0 ? message`Unknown option ${invalidOption}. Try: ${values(suggestions)}` : message`Unknown option ${invalidOption}.` } }); // Custom suggestion format for combinators const config = object({ host: option("--host", string()), port: option("--port", integer()) }, { errors: { suggestions: (suggestions) => suggestions.length > 0 ? message`Available options: ${values(suggestions)}` : [] } }); ## Zod and Valibot integrations Two new packages join the Optique family, bringing powerful validation capabilities from the TypeScript ecosystem to your CLI parsers. ### @optique/zod The new `@optique/zod` package lets you use Zod schemas directly as value parsers: import { option, object } from "@optique/core"; import { zod } from "@optique/zod"; import { z } from "zod"; const parser = object({ email: option("--email", zod(z.string().email())), port: option("--port", zod(z.coerce.number().int().min(1).max(65535))), format: option("--format", zod(z.enum(["json", "yaml", "xml"]))), }); The package supports both Zod v3.25.0+ and v4.0.0+, with automatic error formatting that integrates seamlessly with Optique's message system. See the Zod integration guide for complete usage examples. ### @optique/valibot For those who prefer a lighter bundle, `@optique/valibot` integrates with Valibot—a validation library with a significantly smaller footprint (~10KB vs Zod's ~52KB): import { option, object } from "@optique/core"; import { valibot } from "@optique/valibot"; import * as v from "valibot"; const parser = object({ email: option("--email", valibot(v.pipe(v.string(), v.email()))), port: option("--port", valibot(v.pipe( v.string(), v.transform(Number), v.integer(), v.minValue(1), v.maxValue(65535) ))), }); Both packages support custom error messages through their respective error handler options (`zodError` and `valibotError`), giving you full control over how validation failures are presented to users. See the Valibot integration guide for complete usage examples. ## Duplicate option name detection A common source of bugs in CLI applications is accidentally using the same option name in multiple places. Previously, this would silently cause ambiguous parsing where the first matching parser consumed the option. Optique 0.7.0 now validates option names at parse time and fails with a clear error message when duplicates are detected: const parser = object({ input: option("-i", "--input", string()), interactive: option("-i", "--interactive"), // Oops! -i is already used }); // Error: Duplicate option name -i found in fields: input, interactive. // Each option name must be unique within a parser combinator. This validation applies to `object()`, `tuple()`, `merge()`, and `group()` combinators. The `or()` combinator continues to allow duplicate option names since its branches are mutually exclusive. See the duplicate detection documentation for more details. If you have a legitimate use case for duplicate option names, you can opt out with `allowDuplicates: true`: const parser = object({ input: option("-i", "--input", string()), interactive: option("-i", "--interactive"), }, { allowDuplicates: true }); ## Context-aware error messages Error messages from combinators are now smarter about what they report. Instead of generic "No matching option or command found" messages, Optique now analyzes what the parser expects and provides specific feedback: // When only arguments are expected const parser1 = or(argument(string()), argument(integer())); // Error: Missing required argument. // When only commands are expected const parser2 = or(command("add", addParser), command("remove", removeParser)); // Error: No matching command found. // When both options and arguments are expected const parser3 = object({ port: option("--port", integer()), file: argument(string()), }); // Error: No matching option or argument found. ### Dynamic error messages with `NoMatchContext` For applications that need internationalization or context-specific messaging, the `errors.noMatch` option now accepts a function that receives a `NoMatchContext` object: const parser = or( command("add", addParser), command("remove", removeParser), { errors: { noMatch: ({ hasOptions, hasCommands, hasArguments }) => { if (hasCommands && !hasOptions && !hasArguments) { return message`일치하는 명령을 찾을 수 없습니다.`; // Korean } return message`잘못된 입력입니다.`; } } } ); ## Shell completion naming conventions The `run()` function now supports configuring whether shell completions use singular or plural naming conventions: run(parser, { completion: { name: "plural", // Uses "completions" and "--completions" } }); // Or for singular only run(parser, { completion: { name: "singular", // Uses "completion" and "--completion" } }); The default `"both"` accepts either form, maintaining backward compatibility while letting you enforce a consistent style in your CLI. ## Additional improvements * **Line break handling** : `formatMessage()` now distinguishes between soft breaks (single `\n`, converted to spaces) and hard breaks (double `\n\n`, creating paragraph separations), improving multi-line error message formatting. * **New utility functions** : Added `extractOptionNames()` and `extractArgumentMetavars()` to the `@optique/core/usage` module for programmatic access to parser metadata. ## Installation deno add --jsr @optique/core @optique/run npm add @optique/core @optique/run pnpm add @optique/core @optique/run yarn add @optique/core @optique/run bun add @optique/core @optique/run For validation library integrations: # Zod integration deno add jsr:@optique/zod # Deno npm add @optique/zod # npm/pnpm/yarn/bun # Valibot integration deno add jsr:@optique/valibot # Deno npm add @optique/valibot # npm/pnpm/yarn/bun ## Looking forward This release represents our commitment to making CLI development in TypeScript as smooth as possible. The “Did you mean?” suggestions and validation library integrations were among the most requested features, and we're excited to see how they improve your CLI applications. For detailed documentation and examples, visit the Optique documentation. We welcome your feedback and contributions on GitHub!
hackers.pub
November 25, 2025 at 3:06 PM
Reposted by 洪 民憙 (Hong Minhee)
C++ rant만으로 2시간 분량을 채울 수 있다는 게 놀랍다 (CW: AI 삽화) https://youtu.be/7fGB-hjc2Gc
November 25, 2025 at 1:48 PM
フェディバースのアドベントカレンダー、去年も参加したんだ。今年も参加しなきゃ!
Fediverseのアドベントカレンダー、2025年も会場をご用意しています。

アドベントカレンダーはキリストの降誕祭・待降節に由来するもので、

12月1日(クリスマスの4つ前の日曜日)〜12月24日、毎日印をつけたり、毎週キャンドルを灯しながら数えていく習慣がありまして、

クリスマスを待つ子供達に、お菓子やおもちゃが入った扉がついているカレンダーがつくられ、毎日ひとつずつ開けていく習慣が根付いています。

大人向けの、紅茶とか化粧品の入ったカレンダーも、だいぶメジャーになってきましたよね。

で、これになぞらえ […]

[Original post on fedibird.com]
November 25, 2025 at 12:57 PM
Reposted by 洪 民憙 (Hong Minhee)
Fediverseのアドベントカレンダー、2025年も会場をご用意しています。

アドベントカレンダーはキリストの降誕祭・待降節に由来するもので、

12月1日(クリスマスの4つ前の日曜日)〜12月24日、毎日印をつけたり、毎週キャンドルを灯しながら数えていく習慣がありまして、

クリスマスを待つ子供達に、お菓子やおもちゃが入った扉がついているカレンダーがつくられ、毎日ひとつずつ開けていく習慣が根付いています。

大人向けの、紅茶とか化粧品の入ったカレンダーも、だいぶメジャーになってきましたよね。

で、これになぞらえ […]

[Original post on fedibird.com]
November 25, 2025 at 11:59 AM
MoonBit 프로그래밍 언어(@moonbitlang)를 써보고 싶은데, 뭘 만들어 볼까나…?
November 25, 2025 at 9:21 AM
Reposted by 洪 民憙 (Hong Minhee)
https://eatchangmyeong.github.io/2022/04/22/interest-driven-mu-recursive-functions.html 이 글을 재작성하고 싶은데 예시로 뭘 들어야 될지 모르겠다..... μ를 반드시 써야 되고 구현 난이도가 적당한 거였으면 좋겠는데 생각나는 게 너무 어려운 것밖에 없다
흥미 위주로 알아보는 μ-재귀 함수
잇창명 개발 블로그
eatchangmyeong.github.io
November 22, 2025 at 4:58 PM
Reposted by 洪 民憙 (Hong Minhee)
https://developer.mozilla.org/en-US/blog/image-formats-codecs-compression-tools/

모질라 개발자가 작성한 jpeg, avif 비교 기사. 모질라는 mozjpeg으로 이미지 파일 최적화에 기여해왔고 jpeg를 다룬 경험이 많은 곳. 결론은 고화질에서는 큰 이득이 없지만 저-중화질에서는 유리하다고.

개인적 경험으로는, 최신 AOM 코덱 기준 인코딩 시간이 jpeg보다는 느리지만 실사용에 방해될 정도는 아니었고, 내가 쓰는 (상당히 고화질) 기준으로 2MP […]
Original post on hl.pkgu.net
hl.pkgu.net
November 22, 2025 at 11:43 AM
후쿠오카 여행 이틀째. 일을 좀 보려고 후쿠오카시 적련와(赤煉瓦) 문화관 건물을 쓰는 엔지니어 카페에 왔다. 굉장히 운치 있는 공간.
今日はちょっと仕事しにエンジニアカフェに来た。福岡市赤煉瓦文化館の建物を使ってるから、趣があっていい感じ。
November 22, 2025 at 4:06 AM
Reposted by 洪 民憙 (Hong Minhee)
하스켈 소켓 통신 라이브러리 이름을 rocket 이라고 지으면 상도덕에 어긋나나?
November 20, 2025 at 7:42 PM
Reposted by 洪 民憙 (Hong Minhee)
Update: Just added automatic metavar inference!

The help text now gets smarter labels based on your Zod schema:

* `z.string().email()` → `EMAIL`
* `z.coerce.number().int()` → `INTEGER`
* `z.enum([…])` → `CHOICE`

No manual configuration needed […]
Original post on hollo.social
hollo.social
November 19, 2025 at 1:26 AM
Google Antigravity가 궁금해서 한 번 설치해 보았는데 (다행히 Debin/RedHat 패키징이 되어 있었다), 이상하게 캡처된 화면처럼 우측 에이전트 윈도가 로딩 상태로 멈춰 있어서 정작 가장 중요한 에이전트 기능을 쓸 수가 없다…
November 19, 2025 at 12:47 AM
Reposted by 洪 民憙 (Hong Minhee)
Optique 0.7.0 will support Zod schemas as value parsers.

Seemed like a natural fit—same validation logic for both CLI and app code.

https://github.com/dahlia/optique/issues/39
@optique/zod package for Zod schema integration · Issue #39 · dahlia/optique
Summary Add a new @optique/zod package that provides seamless integration between Optique and Zod schemas, enabling users to leverage Zod's powerful validation capabilities for CLI argument parsing...
github.com
November 18, 2025 at 3:35 PM
Reposted by 洪 民憙 (Hong Minhee)
LaTeX을 라텏으로 쓰는 사람
November 18, 2025 at 9:21 AM
Reposted by 洪 民憙 (Hong Minhee)
If you're a software developer and need to create a presentation with a lot of code, I highly recommend you consider Slidev (by @antfu.me). Especially if you need to include TypeScript code!

Slidev is web-based presentation software made for software developers. It offers a wide variety of ways […]
Original post on hollo.social
hollo.social
November 18, 2025 at 6:54 AM
`GROUP BY ALL` 이거 들어오면 되게 편할 듯…

RE: https://mastodon.social/@lobsters/115561759382271296
mastodon.social
November 17, 2025 at 9:01 AM