Profile img

Lee Dogeon

@moreal@hackers.pub · 102 following · 86 followers

어느 한 개발자입니다.

GitHub
@moreal
3

Claude Code를 사용하다가 마크다운에서 [Link Name](link) 같이 표기하면 Link Name 으로 렌더링 되는 것처럼 클릭 가능한 링크를 보여줘서 이게 뭐지해서 찾아보니 OSC 8[1] 이라는 것이 있다고 한다. 지원하나 해서 찾아보니 Optique의 url()[2] 도 이를 지원한다고 한다.


  1. https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda ↩︎

  2. https://optique.dev/concepts/messages#urls ↩︎

1
3
1

아직 배포는 못 했는데 개밥먹기 싸이클(?) 한 번 돌아본 것 같다. Slidev 버그(?) 디버깅 하는데 시간을 좀 썼고.. 나중에 진짜 발표할 일 생기면 쓰면서 개밥먹기 더 해봐야지.

2

지금 해보고 있는 작업 과정에서 optique, optparse-applicative 같은 류의 커맨드라인 파서의 (개인적으로) 신기한 점을 알게 되었다. --server 가 있을 때 --server-port 도 함께 require할 수 있게 의존 관계를 표현할 수 있다, 같은 느낌에서 "와" 였었는데 오늘 알게 된 것은 같은 옵션을 상황에 따라 다르게 쓸 수 있다는 점이었다.

예를 들자면 --server가 있을 때 -P의 의미가 --port의 short option이라고 할 때 --server가 없을 때 -P의 의미가 --program[1]의 short option이 될 수도 있다. 이렇게 -P가 여러 의미를 가지게 되는 것이 좋은가 같은 이야기와 별개로 신기했다.


  1. p로 시작하는 더 좋은 옵션이 당장 생각 안 나서 --program이라 하였다 ↩︎

3
0

음 조금 보니까 나머지는 다 dl.deno.land (Google IP, 아마 GCP?) 에서 가져오는데 버전 목록만 deno.com (Deno Deploy)에서 가져와서 Deno Deploy에 문제가 생기면 setup-deno 가 모두 실패한다. 이거 deno.com/versions.jsondl.deno.land/versions.json 로 옮기면 안 되려나... 는 다음에 또 장애 생기면 이슈 만들어야겠다

1

Secretive(혹은 1Password)로 SSH 키를 관리하는데 Touch ID로 인증을 해야하다 보니 노트북 저 멀리에 두고 모니터와 별도 키보드를 쓰는 상황에서 팔을 쭉 뻗어 Touch ID에 손가락을 올리는 것이 여간 불편한 것이 아니었다. 예전에 Apple Watch로 인증이 되고 그랬다고 했던 기억이 나서 오늘에서야 써보는 데 팔을 뻗지 않아도 되서 매우 편하다 :D

1
3
2

최근에 Manim-community 들어갔다가 GitHub에 있던 저장소가 Codeberg로 가게 된 걸 알게 되었는데 (지금은 또 GitHub에 돌아와있다) 그때 홈페이지에 How my GitHub Pages got Hacked 라는 글과 함께 해당 사실을 알리고 있었다[1]. 오늘 아마 이와 같은 내용으로 도메인을 뺏기는(?) 현상을 주변에서 봐서 verified domain들을 등록해놓았다.


  1. 당시 아카이브: https://web.archive.org/web/20251229233759/https://www.manim.community/ ↩︎

4

오늘은 고등학교 때 만들다 말았던 라이브러리를 얼추 마무리 지었다. Claude랑 같이 스펙 문서 만들고, 이를 바탕으로 작업하도록 했다. 당시에 하라는 FAT 덤프 파싱은 안 하고 Python에서 편하게 파싱하고 싶어서 만들기 시작했던 라이브러리고 취업하게 되서 이후로 안 봤었는데, Claude Code 덕분에 이제는 보내줄(?) 수 있을 것 같다.

근데 당시에 파서 콤비네이터를 몰랐어서 그랬고 지금은 파서 콤비네이터를 쓸 것 같다. 그리고 오늘 작업하면서 보게 된 건데 비슷한(?) 느낌으로 construct[1] 라는 라이브러리의 존재도 알게 되었다.

이제 Python을 잘 안 쓰고, 원래 시작점이었던 포렌식도 안 하니까 쓸 일은 없겠지만 그래도 당시 2019년 Hacktoberfest 시기에 필드 추가 기여도 받아보고 좋은 기억의 라이브러리였다.

https://github.com/moreal/pystructs/


  1. https://github.com/construct/construct ↩︎

5

Optique 문서를 보다가 argument ordering 파트에서 프로퍼티가 나타난(? appear) 순서대로 파서가 동작(? consume)한다고 되어 있어서 Object 타입인데 이게 작성한 순서대로 Object.entries() 같은 곳에서 순회되기를 기대할 수 있나 의문이 들었다(Object가 Map같은 거라고 생각했어서).

아래와 같이 타고 가면:

  1. 20.1.2.5 Object.entries ( O ) (User call)
  2. 7.3.23 EnumerableOwnProperties ( O, kind ) (called by 2. Let entryList be ? EnumerableOwnProperties(obj, key+value).
  3. 10.1.11 [[OwnPropertyKeys]] ( ) (called by 1. Let ownKeys be ? O.[[OwnPropertyKeys]]().)
  4. 10.1.11.1 OrdinaryOwnPropertyKeys ( O ) (called by 1. Return OrdinaryOwnPropertyKeys(O).)

아래와 같은 대목을 만나는데:

  1. Let keys be a new empty List.
  2. For each own property key P of O such that P is an array index, in ascending numeric index order, do
    1. Append P to keys.
  3. For each own property key P of O such that P is a String and P is not an array index, in ascending chronological order of property creation, do
    1. Append P to keys.
  4. For each own property key P of O such that P is a Symbol, in ascending chronological order of property creation, do
    1. Append P to keys.
  5. Return keys.

만약 key가 array index가 아닌 문자열 혹은 Symbol이라면 프로퍼티 생성 발생의 오름차순 순서(? ascending chronological order of property creation)대로 순회(?)해야한다고 적혀있다.

아마.. 잘 못 찾아서 못 본 걸수도 있지만 chronological이나 creation 같이 검색했을때 스펙에서 이를 다루는 방법을 정의하지는 않는 것 같았다. 예를 들어, PropertyDescriptor이 auto increment 되는 고유 ID를 갖고 있어야 하고 이를 통해 정렬해야한다, 거나?

실제 구현을 보고 싶어서 GitHub에 있는 V8 미러로 가서 보니 key들을 OrderedHashSet으로 갖고 있는 듯 했다. 생각해보니 그러면 되네, 싶어서 더는 안 찾아봤다.

암튼 Optique 문서대로 생성 순서대로 동작할 것 같다!

3
2
2

그젠가 Hashnode as Headless CMS 글 보고 Ampcode로 바이브 코딩 해봤습니다. 글 목록이랑 태그 목록은 물론, 글 보여주는 부분에서는 리액션도 보여주고 번역된 버전이 있다면 볼 수 있도록 하였습니다.

https://moreal.github.io/hackerspub-astro-template/

Hackers' Pub 로컬 서버에 붙어서 빌드하고 수동으로 gh-pages에 배포했고, hackers.pub 에서 데이터를 가져다 쓰려면 올려놓은 GraphQL 관련 PR들이 반영되어야 합니다.

https://moreal.github.io/hackerspub-astro-template/posts/2025/article-c/ 의 스크린샷입니다. 마크다운 렌더링 테스트용 글이 적혀있습니다.
3
4
0
0

Permission sets in config 필요하다고 생각했는데 나왔구나!

1
4
2

ast-grep 알듯 모를듯.. 아래같이 하면 innerHTML prop를 넘겨주고, 여닫는 사이에 내용은 없지만 self-closing 안 하는 케이스들을 잡을 수 있겠다.

id: innerhtml-not-self-closed
language: tsx
severity: error
rule:
  all:
  - kind: jsx_element
    pattern: <$TAG $$$ARGS></$TAG>
    all:
    - has:
        kind: jsx_opening_element
        has:
          kind: jsx_attribute
          regex: innerHTML
    - has:
        kind: jsx_closing_element
fix: "<$TAG $$$ARGS />"
1

&curren 같은 텍스트가 있는 부분이 ¤로 보이는 게 이상해서 보니 찾아보니 &curren; 라는 HTML character reference가 있다. 그래서 오.. 하다가 뒤에 세미콜론이 붙지도 않는데 왜 그러지 의문이 남았는데, HTML 스펙 문서로 가서 보니까 세미콜론이 없는 버전(&curren)도 있다(??). 아마 이 스펙을 충실히 구현해서 그렇게 표시되는 듯 하다. 보여주는 쪽에서 code 태그로 감싸지 않아서 그런 것 아닐까..

별개로 세미콜론 없는 버전은 CommonMark 플레이그라운드에서 해볼때 동작하지 않는데 CommonMark 스펙이거나 버그일 것 같다.

4
5

끝자락에 나오는 Matt Parsons가 작성한 Junior Code를 장려하는 글은 아마 이거인 것 같다. 가상의 이야기(?) 파트가 웃기다 😂

https://www.parsonsmatt.org/2019/12/26/write_junior_code.html

Boss: You’re going to be allowed to make a new project in whatever language you want. Even Haskell.

Employee: Oh yeah!! Time to write FANCY HASKELL!!

Employee writes a ton of really fancy Haskell, delivers fantastically and in about 1000 lines of code. Everyone is very impressed. The project grows in scope.

Boss: It’s time to hire another Haskeller. What are the job requirements?

Employee: Oh, they’ll need to know type-level programming, lenses, servant, Generics, monad transformers, mtl, and advanced multithreading in order to be productive anytime soon.
4
9

macOS에서는 Xcode에서 git을 함께 주지만 brew install git으로 별도로 설치해서 사용해야 한다. 왜냐하면 Git 취약점 최신 패치버전은 2.50.1인데 Xcode git 버전은 2.39.5 버전이다 😱 (다른 패치버전들도 있는데 2.43 및 이후 버전들만 관리 중인가 보다[1])

https://github.blog/open-source/git/git-security-vulnerabilities-announced-6/


  1. https://lore.kernel.org/git/xmqq5xg2wrd1.fsf@gitster.g/ ↩︎

2

아마 폰트에 없어서인지 다 네모 박스로 표시되는구나 했는데, 자세히 보니 네모 박스 안에 16진수 값으로 표시해 주고 있었네 👀 이게 어떻게 이렇게 되지 했는데 렌더링 해주는 쪽 재량이라는 듯 하다. Chrome (그리고 Electron) 은 그냥 네모로 보인다.

폰트가 없어 렌더링 되지 않는 글자의 스크린샷입니다. 원본 한자 대신 네모 박스로 표시되고 있으나 안에 16진수 코드가 적혀있습니다. Firefox에서 렌더링된 결과입니다.
2

최신 Unicode Han Database 중 숫자 표현을 보면 아래 라인이 포함되어 있다. 근데 저 유니코드를 검색해보니 가 나오고 이는 두번째 값인 1000000000000 이 맞는 값인 것 같은데

U+5146	kPrimaryNumeric	1000000 1000000000000

kPrimaryNumeric 속성 설명에 의하면 첫 번째 값이 가장 일반적인 것으로 취급되는 것이 맞다는 것 같아서 의문이 들었다 🤔

If an ideograph has more than one numeric value, the first one is to be considered the most common one, and that first value is used for the Numeric_Value property of the ideograph.

Claude에게 물어보니 지역적이거나 역사적인 이유가 있을 것이라 해서 중국에서 다르게 쓰나 싶었는데, 위키백과 문서들을 참고하니 의 의미가 시대에 따라 달라져 왔기도 했고, 표기법(셈법?)에 따라 또 다른 듯 하다. 지금 사용하는 단위마다 10000배씩 변화하는 방식은 만진법이라고 하는 것 같다.

3
0

"대안: 의도를 선언하기" 부분이 아하 모먼트였습니다. 🤯

1
3