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.

洪 民憙 (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
2

지옥으로 가는 길이 자기만을 위한 선의들로 포장되어 있다면, 지옥에서 나오는 길은 타인을 위한 선의들로 포장되어있지 않겠나 생각해봅니다.

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

0
0
0
0

Women in the Third World by Nelly P. Stromquist, 1998

An Encyclopedia of Contemporary Issues

"Provides timely information and insight into the complex issues facing women living in the economically, culturally, and politically diverse Third World. An excellent resource."

"For quick, reliable, coverage of women's issues in developing countries, [this] is a concise reference work written by more than 80 international experts."




0
0
0
0
1
0
2
1
0

I finally got around to reading this and boy is it good:
“If we use 200kW as a baseline and assume all of that power will be fed to GPUs, we'd need a system 12.5 times bigger, i.e., roughly 531 square metres, or about 2.6 times the size of the relevant solar array. This is now going to be a very large satellite, dwarfing the ISS in area, all for the equivalent of three standard server racks on Earth.”

Why training AI in orbit is a non-starter (orbital compute is NOT going to look like the same kinds of use cases we are currently obsessed with on the ground): taranis.ie/datacenters-in-spac

0
0
0

[단독] 김형석, 또 독립기념관서 '예배'…"목사로서 신념 지킬 것" (영상) news.jtbc.co.kr/article/NB12... "그런데 결과 통보 바로 다음날인 6일 토요일. 김 관장은 독립기념관에서 또 예배 행사를 열었습니다. '한국독립운동과 기독교의 만남 개막식'이란 행사였는데 사실상 1시간 짜리 예배였습니다. [내 죄를 씻기 위하여…] 묵도로 시작해 찬송, 기도, 성경 봉독, 특송까지 이어졌습니다. 김형석 관장은 단상에까지 올랐습니다."

[단독] 김형석, 또 독립기념관서 ‘예배’…"목사로서 ...

0
0

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

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

0
2
0
0
0

直近のDID掌握率が0.036%だそうで。直近4.1Mアカウントについてだそうなので、全体では少し変わるかもしれないけど。後からrotation keyを登録するパターンも期待できるわけだし。 https://rob.leaflet.pub/3m7isflo7ls23

0
1

EMAIL WRAPPED 2025

This year, you received too fucking much email!

Number of emails that found you well: zero

Number of emails that you printed, even though you didn't consider the environment: zero

Number of times an "out of office" autoresponder was immediately followed by the person answering your email: all of the times

Your favorite email was: none of them

Next year, you are considering: are there any countries where email is illegal, and what are their immigration laws?

0
0
0
0
0
1

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

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

0
0
0

我有一些很優秀的朋友,他們不覺得自己有那麼優秀,其中有些人甚至有冒牌者症候群。從旁邊看的我,打從心底不理解,他們的成就隨便講出來,都會讓人覺得他們很棒啊,那是很客觀的成就,比如念台大,大家就是會覺得,哇好厲害。

雖然不理解,但我知道他們是真心不覺得自己有多優秀,我就姑且這樣囫圇吞棗的接受了。反觀我自己,我認為幾乎沒有可以講出來讓人覺得很厲害的成就,縱使我的朋友誇獎我、稱讚我的深度(?)或聰明(?),但我總是難以真心接受,無法覺得當之無愧,有時候甚至心想,那是你們誤會了。

這時候就會想,難道我的這些朋友們就是這種感覺嗎?在我看來,他們的優秀就像鮮明的稜角,沒有人看不出來的,他們一個一個的形狀是那麼獨特又出色,幾乎是一望即知,他們自己怎麼看不到呢?
於是我也想道,也許他們看我也是這樣,雖然我沒有可以誇耀的成就,但是說不定,我可以再肯定自己一點吧。

0
0
0
0
1