Profile img

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

Fedify, Hollo, BotKit, 그리고 보고 계신 이 사이트 Hackers' Pub을 만들고 있습니다. 제 메인 계정은: @hongminhee洪 民憙 (Hong Minhee) :nonbinary:.

FedifyHolloBotKit、そしてこのサイト、Hackers' Pubを作っています。私のメインアカウントは「@hongminhee洪 民憙 (Hong Minhee) :nonbinary:」に。

Website
hongminhee.org
GitHub
@dahlia
Hollo
@hongminhee@hollo.social
DEV
@hongminhee
velog
@hongminhee
Qiita
@hongminhee
Zenn
@hongminhee
Matrix
@hongminhee:matrix.org
X
@hongminhee
3
2
11
1
1

아 즐거운 소식이다...

원문: https://lwn.net/SubscriberLink/1032604/73596e0c3ed1945a/ 번역 요약: https://news.hada.io/topic?id=22540

너무 좋은 소식이다. ArchLinux의 위키가 하던 방식을 Debian에서도 하겠다는 소식... 나같은 경우에도, ArchLinux를 만나고 난뒤부터는 Linux 에 관련된 어플리케이션 명령어를 ArchLinux 위키에서 찾아보고 어떤게 있는지 많은 것들을 공부했었는데... 그 와 비슷한 위키를 Debain 위키에서도 적용을 해 나가겠다는 것은 Debain이 가지고 있는 패키지들의 사용법을 한곳으로 모으는 좋은 글 집합체가 되길 바란다. 한국어 번역은 AI가 잘해줄꺼야 :) 사람이 번역안해도 되겠지뭐... :)

6

개방형 오피스가 코딩의 생산성을 저하시키는 일종의 또 다른 ADHD 상태를 만든다는 글이 올라왔다. 이에 대해 어느 정도는 그럴 수 있지 하고 생각하면서도 많은 부분에 대해 동의하지 않는데... 사무실 내의 소리나 환경적 문제를 제외하면 Slack 등의 업무용 메신저나 메일 등의 알림은 집에서도 사무실에서도 똑같이 발생한다. 내가 업무 시간 중 일정 시간 안에 답하면 되는 것이기 때문에 알림 설정을 미리 해두지 않으면 결국 어디서 일하던간에 알림으로 인한 스트레스나 방해는 똑같이 받게 된다는 점이다. 또한 사무실 내의 다른 소리나 시각적 문제로 집중력을 떨어트릴 수 있다. 근데 이것도 잘 생각해보면 집에서도 가족이나 동거인, 키우는 동물 등이 있다면 똑같이 발생할 수 있는 문제가 아닐까.

결국은 어디에서 일하던간에 본인이 편안한 환경을 만들고 생산성을 유지하기 위한 환경을 조성하고 관리할 필요가 있다. 다만 이 글은 본인의 생산성을 환경에 따라 측정해서 자신만의 데이터를 뽑아낸게 굉장히 의미있다. 아마 제품의 홍보 목적도 겸하는 것이 되겠지만 말이다.

https://floustate.com/blog/open-office-secondhand-adhd

8
4

조만간 Hackers' Pub 티셔츠를 제작하려고 합니다. 가격이 얼마가 될 지는 모르겠는데 마플 기준으로는 1만원–2만원 사이 정도 될 것 같군요. 관심 있으신 분 계신가요?

16
6
4
3
5
4
0
2
5
2
1
4
4
4
5
4
2
4

유시지(usage) 출력까지는 어떻게 구현 했다. 그런데 이건 쉬운 문제고, 도움말이 정말 어려운 문제인데…

optique <main?> $ deno run example.ts 
Usage: example.ts one [-a/--allow] -v/--value INTEGER ARG
       example.ts two [-f/--foo] -b/--bar VALUE
       example.ts three [-d/--deny] -t/--test INTEGER [-z/--baz] -q/--qux QUX
       example.ts nest foo [-a/--allow] -v/--value INTEGER ARG
       example.ts nest bar [-f/--foo] -b/--bar VALUE
Error: No parser matched.
2
2
4
4
2
3
2
4

news.hada.io/topic?id=22140

이 글에서 "switch network 쓰지 말고 hash map 쓰세요 그쪽이 더 빠릅니다" 해서 정말 그런가? 했는데 그런듯 하다.

지금 진행하던 개인 프로젝트의 디버깅을 찍어보는데 특정 토큰/명령어에 대해서 한 조각씩 들어오는 것에 대해 분기 네트워크를 타면 CPU의 분기예측 캐시가 제대로 쌓이질 않아서 case문 내의 모든 case를 중구난방으로 분기하면서 모두 체크하고 있다. (예를 들어 TOKEN_DEFINE을 찾기 위해서 ase TOKEN_BRACKET_OPEN.. case TOKEN_ALLOCATE... case TOKEN_EQUAL.... 같이 전부 중구난방으로 점프해가며 하나씩 체크한다. O(n)과 같은 최악의 케이스는 아니지만 10개의 케이스가 있으면 적어도 5개는 검색해버리는 짓을 벌임)

후반부로 갈수록 캐시가 쌓여서 바로 점프하는 모습은 보이지만 O(1)으로 바로 분기 없이 점프할수 있는 해시맵이 엄청나게 빠른건 사실인듯하다.

재귀하향식 파서로 구현했기 때문에 파서는 어쩔수 없이 switch network를 타버리긴 하지만 case가 극히 적어 분기 점프에 있어 큰 문제는 아니고 최대한 해시 맵 기반으로 짜는 것이 빠르다는 교훈은 얻은듯 하다.

3

밑바닥에서부터 연합우주 서비스를 만들고 있는데, 기능을 만들고 연합우주 연동을 붙이는 방식으로 접근하려니 자꾸 막히는 것 같음. 연합우주에서 어떻게 호환할지 먼저 생각해서 인터페이스를 만들고 거기에 기능을 갖다 붙이는 방식으로 접근해야 한다... 초기 단계는 수제코딩이 불가피한....

3
4
6
3
6

유시지(usage) 출력까지는 어떻게 구현 했다. 그런데 이건 쉬운 문제고, 도움말이 정말 어려운 문제인데…

optique <main?> $ deno run example.ts 
Usage: example.ts one [-a/--allow] -v/--value INTEGER ARG
       example.ts two [-f/--foo] -b/--bar VALUE
       example.ts three [-d/--deny] -t/--test INTEGER [-z/--baz] -q/--qux QUX
       example.ts nest foo [-a/--allow] -v/--value INTEGER ARG
       example.ts nest bar [-f/--foo] -b/--bar VALUE
Error: No parser matched.
2
6
2
2
1

이번 주말........ 파이콘으로 한참 바쁠 예정입니다.....

  • 파이콘 내내 한국 연합우주 개발자 모임 부스 지키기
  • 일요일 파이콘 발표
  • OSTEP xv6 H2 스타트 끊기...
3

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

파서 콤비네이터: 하스켈 초보자를 위한 파싱

박준규 @curry@hackers.pub

이 글은 하스켈 초보자를 위한 파서 컴비네이터에 대한 입문 튜토리얼입니다. 파싱은 프로그래밍에서 흔히 발생하는 작업이지만, 정규 표현식이나 문자열 조작만으로는 복잡한 형식을 다루기 어렵습니다. 저자는 `Text.ParserCombinators.ReadP` 라이브러리를 사용하여 파서 컴비네이터를 소개하고, 이를 통해 더 읽기 쉽고 유지보수가 용이한 파서를 작성할 수 있음을 보여줍니다. METAR 보고서 파싱 예제를 통해 `satisfy`, `many1`, `<|>`, `option` 등의 기본적인 파서 콤비네이터 함수를 설명하고, 펑터와 모나드의 개념을 활용하여 파서를 구성하는 방법을 안내합니다. 또한, 파싱된 데이터의 유효성을 검사하고, 결과를 더 의미 있는 데이터 타입으로 변환하는 방법을 제시합니다. 이 튜토리얼을 통해 독자는 파서 컴비네이터의 기본 원리를 이해하고, 실제 데이터 파싱 작업에 적용할 수 있는 능력을 얻게 됩니다. 마지막으로, 저자는 독자들에게 배운 내용을 바탕으로 전체 METAR 보고서를 파싱하는 라이브러리를 만들어 Hackage에 제출해 볼 것을 권장하며, 파서가 없는 데이터를 만났을 때 `ReadP`를 자신 있게 사용할 수 있기를 바랍니다.

Read more →
11

이제 아래와 같이 CLI 파서를 선언하면:

const parser = or(
  object("Group 1", {
    type: constant("group1"),
    allow: option("-a", "--allow"),
    value: option("-v", "--value", integer()),
    arg: argument(string({ metavar: "ARG" })),
  }),
  object("Group 2", {
    type: constant("group2"),
    foo: option("-f", "--foo"),
    bar: option("-b", "--bar", string({ metavar: "VALUE" })),
  }),
  merge(
    object("Group 3", {
      type: constant("group34"),
      deny: option("-d", "--deny"),
      test: option("-t", "--test", integer()),
    }),
    object("Group 4", {
      baz: option("-z", "--baz"),
      qux: option("-q", "--qux", string({ metavar: "QUX" })),
    }),
  ),
);

InferValue<typeof parser> 타입 함수가 아래와 같은 타입을 반환한다:

const _:
  | {
    readonly type: "group1";
    readonly allow: boolean;
    readonly value: number;
    readonly arg: string;
  }
  | {
    readonly type: "group2";
    readonly foo: boolean;
    readonly bar: string;
  }
  | {
    readonly type: "group34";
    readonly deny: boolean;
    readonly test: number;
    readonly baz: boolean;
    readonly qux: string;
  };

현재 구현한 파서 프리미티브는 option()argument() 두 개, 그리고 파서 컴비네이터는 or(), object(), tuple(), merge(), optional(), multiple() 정도. 그 외에 concat() 같은 것도 구현하고 싶긴 한데, 일단 도움말 먼저 만들어 보자.

1