What is Hackers' Pub?

Hackers' Pub is a place for software engineers to share their knowledge and experience with each other. It's also an ActivityPub-enabled social network, so you can follow your favorite hackers in the fediverse and get their latest posts in your feed.

0
1
1

🍝 저의 주님, 날아다니는 스파게티 괴물 님, 저를 보호하시어 살펴주소서.
😋 어서 구원하시어 혼자 내버려 두지 마소서.

🍝 날아다니는 스파게티 괴물 님께서 여러분과 함께.
😋 또한 주교의 면발과 함께 하소서.
🍝 기도합시다.
지극히 선하신 스파게티 괴물 님, 사람들이 더욱더 완전한 것을 이루기 위해서 서로 협조하여 일하게 해주셨으니,
저희 기도를 들으시고 저희가 항상 우정을 품고, 모든 이들을 위한 박애로 끊임없이 일하게 하소서.

"3. 주님의 미트볼 위에 저희의 집중을 놓게 하시어, 산만한 세상 속에서도 흔들림 없게 하소서."

🍝 날아다니는 스파게티 괴물 님께서 여러분과 함께.
😋 또한 주교의 면발과 함께 하소서.
🍝 전능하신 스파게티 괴물 님, 미트볼🧆과 소스🥫와 성면🍝께서는 여기 모인 모든 이에게 강복하소서.
😋 라-멘 🍜.

🍝 날아다니는 스파게티 괴물 님을 찬미합시다.
😋 주님 감사합니다.

2025-12-09T14:00:45+09:00


0
1
0
0
0

Interesting tinnitus problems: I saw my wife checking for the source of a noise, and that was my cue that the new high-pitch whining in the room was a real sound other people could hear and not just something in my head

0
0
0
0
1
0

사실 좀만 생각해보면 어쩌면 당연한게 지옥으로 가는 길이 선의로 포장되어 있음 → 지옥으로 꼬셔서 악의 구렁텅이에 빠뜨려야 하기 때문에 선의로 포장됨 지옥에서 나오는 길도 선의로 포장되어 있는 것 아닐까? → 어떻게든 끄집어내서 갱생시켜야하기 때문에 선의로 포장할수밖에 없음

RE: https://bsky.app/profile/did:plc:ijc4yb24tysgjiaiib2ldgyk/post/3m7jofm2ruk23

0

'보험금을 노린 과잉 진료' '초등학생 학부모들조차 경쟁적으로 아이들에게 수액 주사를 맞출 정도' 다른것도 아니고 독감에서 비급여 주사제는 페라미플루일건데, 그걸 실비처리 안하고 걍 다 돈 내야 하는게 맞다고? 독감 유행이 심한 상황에서 경쟁적이요? ... 아 예. 애 키우는 부모가 다 죄인입니다. 앞으로 저출생의 ㅈ자라도 꺼내면 서울경제 네놈 새끼들은 진짜 머리를 깨서라도 쳐죽일거에요

과잉 진료에···독감 수액주사 실손보험금 3.3배 폭증

0

그거 아십니까?
배민원(한집배달)은 최대 조리시간이 30분입니다
그 이상 설정이 안됨
님이 만약에 막 스무디 이런걸 10잔 넘게 주문하면 모두가 불행해진다는 사실!
기사님:30분 안에 된다면서요
님:30분 안에 된다면서요
알바: :jokebear_sobbing:
오래 걸릴 것 같은 주문은 일반배달로 시켜주십시오 감사합니다
이상 3시간동안 물도 못 마시고 일한 알바 씀

0
0
1
0
0
0

연말이죠, 구글의 "올해의 검색"이 나올 시기입니다. 언제부터인가 딱히 구글의 올해의 검색이 기대가 안되는데, 올해는 타의 추종을 불허하고 형편없기로는 최고네요. 인간 도살장이 되어버린 가자지구에는 0.01프레임도 허용치 않으면서 인류애라던가 슬픔이라던가 회복이라던가 그런걸 말할 수 있나 싶구요. 안나오진 않을거라고 생각했지만 배경음악으로 케데헌 골든을 깔아놓으니 참, 이게 뭔가 싶은겁니다. youtu.be/Vv_sjpclsZ8?...

2025 — Year in Search

0
1
0
1
@StellarMiut@g0v.social流浪貓 :verified: 從Steam的討論看起來,是歷史遺留問題
https://steamcommunity.com/app/221040/discussions/0/601912617062105278/

遊戲可能是使用DirectX 9開發,但是Windows11沒有預先安裝DX9,而遊戲當年發售的時間只支援最高1080P的解析度,現在一堆人用超寬與高解析螢幕。

為什麼在Linux上頭能跑…Steam Proton的設計預先排除了各種相容性問題,並且持續修正,但是Capcom與微軟缺乏這種動機。
0

Released Optique 0.8.0, a type-safe CLI parser for TypeScript. This version adds conditional() for branching based on a discriminator option, passThrough() for forwarding unknown options to underlying tools, and a new @optique/logtape package for configuring LogTape via CLI.

Optique 0.8.0: Conditional par...

0
0
0

그거 아십니까?
배민원(한집배달)은 최대 조리시간이 30분입니다
그 이상 설정이 안됨
님이 만약에 막 스무디 이런걸 10잔 넘게 주문하면 모두가 불행해진다는 사실!
기사님:30분 안에 된다면서요
님:30분 안에 된다면서요
알바: :jokebear_sobbing:
오래 걸릴 것 같은 주문은 일반배달로 시켜주십시오 감사합니다
이상 3시간동안 물도 못 마시고 일한 알바 씀

0
0
1

Released Optique 0.8.0, a type-safe CLI parser for TypeScript.

This version adds conditional() for branching based on a discriminator option, passThrough() for forwarding unknown options to underlying tools, and a new @optique/logtape package for configuring LogTape via CLI.

https://hackers.pub/@hongminhee/2025/optique-080

4

It's not finished yet, but I wanted to show it very much. I guess racing game in ? Not exactly racing, but anyway, cars.

You will also need to pick up gasoline, which will constantly run out

(and I know it does not fit but some of my rough wip music stuff playing in background. Well let's say the driver has very high stakes, so it's a very dramatic moment)

0
0
0
0
0
0

洪 民憙 (Hong Minhee) :nonbinary: shared the below article:

Optique 0.8.0: Conditional parsing, pass-through options, and LogTape integration

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

We're excited to announce Optique 0.8.0! This release introduces powerful new features for building sophisticated CLI applications: the conditional() combinator for discriminated union patterns, the passThrough() parser for wrapper tools, and the new @optique/logtape package for seamless logging configuration.

Optique is a type-safe combinatorial CLI parser for TypeScript, providing a functional approach to building command-line interfaces with composable parsers and full type inference.

New conditional parsing with conditional()

Ever needed to enable different sets of options based on a discriminator value? The new conditional() combinator makes this pattern first-class. It creates discriminated unions where certain options only become valid when a specific discriminator value is selected.

import { conditional, object } from "@optique/core/constructs";
import { option } from "@optique/core/primitives";
import { choice, string } from "@optique/core/valueparser";

const parser = conditional(
  option("--reporter", choice(["console", "junit", "html"])),
  {
    console: object({}),
    junit: object({ outputFile: option("--output-file", string()) }),
    html: object({ outputFile: option("--output-file", string()) }),
  }
);
// Result type: ["console", {}] | ["junit", { outputFile: string }] | ...

Key features:

  • Explicit discriminator option determines which branch is selected
  • Tuple result [discriminator, branchValue] for clear type narrowing
  • Optional default branch for when discriminator is not provided
  • Clear error messages indicating which options are required for each discriminator value

The conditional() parser provides a more structured alternative to or() for discriminated union patterns. Use it when you have an explicit discriminator option that determines which set of options is valid.

See the conditional() documentation for more details and examples.

Pass-through options with passThrough()

Building wrapper CLI tools that need to forward unrecognized options to an underlying tool? The new passThrough() parser enables legitimate wrapper/proxy patterns by capturing unknown options without validation errors.

import { object } from "@optique/core/constructs";
import { option, passThrough } from "@optique/core/primitives";

const parser = object({
  debug: option("--debug"),
  extra: passThrough(),
});

// mycli --debug --foo=bar --baz=qux
// → { debug: true, extra: ["--foo=bar", "--baz=qux"] }

Key features:

  • Three capture formats: "equalsOnly" (default, safest), "nextToken" (captures --opt val pairs), and "greedy" (captures all remaining tokens)
  • Lowest priority (−10) ensures explicit parsers always match first
  • Respects -- options terminator in "equalsOnly" and "nextToken" modes
  • Works seamlessly with object(), subcommands, and other combinators

This feature is designed for building Docker-like CLIs, build tool wrappers, or any tool that proxies commands to another process.

See the passThrough() documentation for usage patterns and best practices.

LogTape logging integration

The new @optique/logtape package provides seamless integration with LogTape, enabling you to configure logging through command-line arguments with various parsing strategies.

# Deno
deno add --jsr @optique/logtape @logtape/logtape

# npm
npm add @optique/logtape @logtape/logtape

Quick start with the loggingOptions() preset:

import { loggingOptions, createLoggingConfig } from "@optique/logtape";
import { object } from "@optique/core/constructs";
import { parse } from "@optique/core/parser";
import { configure } from "@logtape/logtape";

const parser = object({
  logging: loggingOptions({ level: "verbosity" }),
});

const args = ["-vv", "--log-output=-"];
const result = parse(parser, args);
if (result.success) {
  const config = await createLoggingConfig(result.value.logging);
  await configure(config);
}

The package offers multiple approaches to control log verbosity:

  • verbosity() parser: The classic -v/-vv/-vvv pattern where each flag increases verbosity (no flags → "warning", -v"info", -vv"debug", -vvv"trace")
  • debug() parser: Simple --debug/-d flag that toggles between normal and debug levels
  • logLevel() value parser: Explicit --log-level=debug option for direct level selection
  • logOutput() parser: Log output destination with - for console or file path for file output

See the LogTape integration documentation for complete examples and configuration options.

Bug fix: negative integers now accepted

Fixed an issue where the integer() value parser rejected negative integers when using type: "number". The regex pattern has been updated from /^\d+$/ to /^-?\d+$/ to correctly handle values like -42. Note that type: "bigint" already accepted negative integers, so this change brings consistency between the two types.

Installation

# Deno
deno add jsr:@optique/core

# npm
npm add @optique/core

# pnpm
pnpm add @optique/core

# Yarn
yarn add @optique/core

# Bun
bun add @optique/core

For the LogTape integration:

# Deno
deno add --jsr @optique/logtape @logtape/logtape

# npm
npm add @optique/logtape @logtape/logtape

# pnpm
pnpm add @optique/logtape @logtape/logtape

# Yarn
yarn add @optique/logtape @logtape/logtape

# Bun
bun add @optique/logtape @logtape/logtape

Looking forward

Optique 0.8.0 continues our focus on making CLI development more expressive and type-safe. The conditional() combinator brings discriminated union patterns to the forefront, passThrough() enables new wrapper tool use cases, and the LogTape integration makes logging configuration a breeze.

As always, all new features maintain full backward compatibility—your existing parsers continue to work unchanged.

We're grateful to the community for feedback and suggestions. If you have ideas for future improvements or encounter any issues, please let us know through GitHub Issues. For more information about Optique and its features, visit the documentation or check out the full changelog.

Read more →
5

uspol (ambient)

wonder how building security and riot control guidelines have changed in the wake of 6 Jan 2021

this thought brought to you by watching footage of the rioters trying to smash out glass in the Capitol and realizing that somewhere, someone had to have pointed at some of that footage and said: "see? you never fucking know. made it hardened, just in case."

0

Optique 0.8.0: Conditional parsing, pass-through options, and LogTape integration

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

We're excited to announce Optique 0.8.0! This release introduces powerful new features for building sophisticated CLI applications: the conditional() combinator for discriminated union patterns, the passThrough() parser for wrapper tools, and the new @optique/logtape package for seamless logging configuration.

Optique is a type-safe combinatorial CLI parser for TypeScript, providing a functional approach to building command-line interfaces with composable parsers and full type inference.

New conditional parsing with conditional()

Ever needed to enable different sets of options based on a discriminator value? The new conditional() combinator makes this pattern first-class. It creates discriminated unions where certain options only become valid when a specific discriminator value is selected.

import { conditional, object } from "@optique/core/constructs";
import { option } from "@optique/core/primitives";
import { choice, string } from "@optique/core/valueparser";

const parser = conditional(
  option("--reporter", choice(["console", "junit", "html"])),
  {
    console: object({}),
    junit: object({ outputFile: option("--output-file", string()) }),
    html: object({ outputFile: option("--output-file", string()) }),
  }
);
// Result type: ["console", {}] | ["junit", { outputFile: string }] | ...

Key features:

  • Explicit discriminator option determines which branch is selected
  • Tuple result [discriminator, branchValue] for clear type narrowing
  • Optional default branch for when discriminator is not provided
  • Clear error messages indicating which options are required for each discriminator value

The conditional() parser provides a more structured alternative to or() for discriminated union patterns. Use it when you have an explicit discriminator option that determines which set of options is valid.

See the conditional() documentation for more details and examples.

Pass-through options with passThrough()

Building wrapper CLI tools that need to forward unrecognized options to an underlying tool? The new passThrough() parser enables legitimate wrapper/proxy patterns by capturing unknown options without validation errors.

import { object } from "@optique/core/constructs";
import { option, passThrough } from "@optique/core/primitives";

const parser = object({
  debug: option("--debug"),
  extra: passThrough(),
});

// mycli --debug --foo=bar --baz=qux
// → { debug: true, extra: ["--foo=bar", "--baz=qux"] }

Key features:

  • Three capture formats: "equalsOnly" (default, safest), "nextToken" (captures --opt val pairs), and "greedy" (captures all remaining tokens)
  • Lowest priority (−10) ensures explicit parsers always match first
  • Respects -- options terminator in "equalsOnly" and "nextToken" modes
  • Works seamlessly with object(), subcommands, and other combinators

This feature is designed for building Docker-like CLIs, build tool wrappers, or any tool that proxies commands to another process.

See the passThrough() documentation for usage patterns and best practices.

LogTape logging integration

The new @optique/logtape package provides seamless integration with LogTape, enabling you to configure logging through command-line arguments with various parsing strategies.

# Deno
deno add --jsr @optique/logtape @logtape/logtape

# npm
npm add @optique/logtape @logtape/logtape

Quick start with the loggingOptions() preset:

import { loggingOptions, createLoggingConfig } from "@optique/logtape";
import { object } from "@optique/core/constructs";
import { parse } from "@optique/core/parser";
import { configure } from "@logtape/logtape";

const parser = object({
  logging: loggingOptions({ level: "verbosity" }),
});

const args = ["-vv", "--log-output=-"];
const result = parse(parser, args);
if (result.success) {
  const config = await createLoggingConfig(result.value.logging);
  await configure(config);
}

The package offers multiple approaches to control log verbosity:

  • verbosity() parser: The classic -v/-vv/-vvv pattern where each flag increases verbosity (no flags → "warning", -v"info", -vv"debug", -vvv"trace")
  • debug() parser: Simple --debug/-d flag that toggles between normal and debug levels
  • logLevel() value parser: Explicit --log-level=debug option for direct level selection
  • logOutput() parser: Log output destination with - for console or file path for file output

See the LogTape integration documentation for complete examples and configuration options.

Bug fix: negative integers now accepted

Fixed an issue where the integer() value parser rejected negative integers when using type: "number". The regex pattern has been updated from /^\d+$/ to /^-?\d+$/ to correctly handle values like -42. Note that type: "bigint" already accepted negative integers, so this change brings consistency between the two types.

Installation

# Deno
deno add jsr:@optique/core

# npm
npm add @optique/core

# pnpm
pnpm add @optique/core

# Yarn
yarn add @optique/core

# Bun
bun add @optique/core

For the LogTape integration:

# Deno
deno add --jsr @optique/logtape @logtape/logtape

# npm
npm add @optique/logtape @logtape/logtape

# pnpm
pnpm add @optique/logtape @logtape/logtape

# Yarn
yarn add @optique/logtape @logtape/logtape

# Bun
bun add @optique/logtape @logtape/logtape

Looking forward

Optique 0.8.0 continues our focus on making CLI development more expressive and type-safe. The conditional() combinator brings discriminated union patterns to the forefront, passThrough() enables new wrapper tool use cases, and the LogTape integration makes logging configuration a breeze.

As always, all new features maintain full backward compatibility—your existing parsers continue to work unchanged.

We're grateful to the community for feedback and suggestions. If you have ideas for future improvements or encounter any issues, please let us know through GitHub Issues. For more information about Optique and its features, visit the documentation or check out the full changelog.

Read more →
5
1
0
1
2
1
1
1
0
0
0
0
1
0