Profile img

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

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

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

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

하스켈에서 레코드 타입을 json으로 인코딩할 때 타입이 Maybe인 필드의 값이 Nothing이면 그 타입의 값은 null로 변환된다.(deriving Generic 했다면)

이때 null이 아니라 해당 필드 자체를 포함하지 않게 하려면 다음과 같이 하면 된다.

{-# LANGUAGE TemplateHaskell #-}

import Data.Aeson.TH

data Foo = ...

deriveJSON defaultOptions { omitNothingFields = True } ''Foo

위와 같이 deriveJSON 했다면 기존에 선언했던 아래 구문은 지워야 한다.

instance FromJSON Foo
instnace ToJSON Foo
3

작업일지 251012

이번에는 Announce 액티비티 지원하는 작업을 진행 중인데, 해커스펍이 어떻게 구현되어 있는지 하나하나 뜯어보면서 작업 중이다. 고려해야 할 사항이 몇 가지 있는데... 당장은 쉬운 것 순서대로 작업할 것들을 정리하고 있다.

  • Phase 1 : 내가 팔로하고 있는 원격 계정에서 전달되는 Announce 액티비티를 인박스에서 수신하는 과정을 핸들링한다. (원격에서는 followers에 cc 걸어서 Announce 액티비티를 전송하기 때문)
  • Phase 2 : 나를 팔로하고 있는 로컬 인스턴스 계정의 글을 재공유하는 매커니즘을 구현한다.
  • Phase 3 : 나를 팔로하고 있는 원격 계정의 inbox에 Announce 액티비티를 전달하는 매커니즘을 구현한다.

지금은 Phase 1에 신경쓰고 있는 상황. 허나, Phase 1을 작업하고 있는 과정에서 병목이 생겼다. 다행히 해결했다만.

Follow 액티비티가 언제부턴가 전송이 안되고 있어서 왜 그런가 했는데, 프로덕션 배포하는 과정에서 federation 옵션을 바꾼게 화근이 되었음. 백엔드와 프론트엔드가 하나로 합쳐져있을때는 origin 옵션에 URL 하나만 걸어두면 그만인데, 백엔드/프론트엔드 나눠놓은 상황에서는 프론트전용 URL(webOrigin)/백엔드전용 도메인(handleHost) 각각 분리를 해야했음. 그와 관련된 패치를 어제 했었던 것으로 기억한다.

변경사항이 있었다는걸 까먹은 상태에서, 로컬환경에서 원격 인스턴스에 Follow 액티비티가 왜 Unauthorized 에러가 뜨면서 전송이 되지 않았나했는데... 역시 이런 맥락이 있었던 것. 즉, handleHost(백엔드쪽 도메인)은 Tailscale에서 생성한 URL로 들어가는 반면, webOrigin은 localhost로 설정이 되어 있었기 때문에 서명하는 과정에서 오류가 발생한 것임. NODE_ENV 환경변수가 development 인 경우에만 webOrigin/handleHost를 같은값을 쓰는 걸로 임시방편으로 처리함. 관련 코드

4

TIL:

Zed로 Xcode Swift 프로젝트 셋팅하기

xcode-build-server와 Swift의 sourcekit-lsp 덕분에 느려터진 Xcode 대신 Zed나 다른 LSP를 이용할 수 있는 에디터에서 Xcode Swift 프로젝트를 셋팅해서 쓸 수 있다. [참고한 문서]

iOS 26의 Slider step 이슈

iOS 26는 버그가 많은데, 26.0.1이 되어서도 SwiftUI Slider에서 step값을 지정했을 때 Slider가 step값을 무시하는 버그가 있다. [Workaround]가 있는데 이렇게 땜빵식으로 해결해야한다는게 참...

LSP 설정을 통해 Swift 프로젝트에서 자동 완성을 띄울 수 있다.

TIL:

Zed로 Xcode Swift 프로젝트 셋팅하기

xcode-build-server와 Swift의 sourcekit-lsp 덕분에 느려터진 Xcode 대신 Zed나 다른 LSP를 이용할 수 있는 에디터에서 Xcode Swift 프로젝트를 셋팅해서 쓸 수 있다. [참고한 문서]

iOS 26의 Slider step 이슈

iOS 26는 버그가 많은데, 26.0.1이 되어서도 SwiftUI Slider에서 step값을 지정했을 때 Slider가 step값을 무시하는 버그가 있다. [Workaround]가 있는데 이렇게 땜빵식으로 해결해야한다는게 참...

LSP 설정을 통해 Swift 프로젝트에서 자동 완성을 띄울 수 있다.
6
4

하스켈에서 Either a bToJSON 인스턴스 구현이 약간 애매하다.

json 객체의 키 값으로 "Left""Right"를 넣는 것 같다. 그런 방식으로 사용하는 사람은 거의 없을 것 같은데... 아무튼 그래서 newtype은 쓰지 않고 인스턴스를 오버라이딩 하고 싶은데 대충 찾아보면 인터넷이나 LLM의 첫번째 대답은 OverlappingInstances 확장을 쓰라고 안내하는데 이건 deprecated 됐다. 대신 다음과 같은 프라그마(pragma)를 쓰면 된다.

  • OVERLAPPING
  • OVERLAPPABLE
  • OVERLAPS

프라그마는 확장과 다른데 확장은 확장을 적은 파일 전체에 적용되지만 프라그마는 해당 인스턴스에만 적용된다.

다음과 같이 사용한다.

instance {-# OVERLAPPING #-} ToJSON a => ToJSON (Either Foo a) where
  toJSON = ...

이렇게 하면 고아[1]를 만들었다며 컴파일러가 내 인성을 비난하겠지만 Either a b를 통째로 오버라이딩 한 것도 아니고 별로 문제가 될 것 같진 않다.


  1. 하스켈에서 타입이나 클래스가 정의된 모듈이 아닌 곳에 인스턴스를 선언할 때 그 인스턴스를 Orphan(고아) 인스턴스라고 한다. ↩︎

6
2

마스토돈 스타일의 새로운 커뮤 플랫폼, 커뮹! 을 런칭합니다. 기성 소셜 플랫폼들을 커뮤 운영 방식에 끼워 맞추던 불편함을 해소하고자 시작된 프로젝트입니다. 당초 예상했던 것보다 뜨거운 관심에, 계획보다 빠르게 출시하게 되었습니다. 많은 응원과 관심 부탁드립니다. commu.ng

3
0
0

🪒 야크 셰이빙: 새로운 오픈소스의 원동력
작은 불편함에서 시작된 수많은 프로젝트, 그 연결의 힘은?

야크 셰이빙: 새로운 오픈소스의 원동력
홍민희 (자유·오픈소스 소프트웨어 개발자)

연사 2025.fossforall.org/speakers/
티켓 event-us.kr/fossforall/event/1

1

NAS 에서 aria2c 2025-10-01-raspios-trixie-arm64-lite.img.xz.torrent 했더니 순식간에 다운로드가 된 것은 좋은데, 그대로 꺼 버리기에는 커뮤니티에 미안한 생각이 들어서, 그냥 켜 두었다. 하지만 며칠째 켜 두어도 SEED(0.9) 정도에서 별로 올라가지 않는다… ㅋㅋㅋ 아무래도 제대로 된 디먼을 설정해 둬야겠다. 상부상조에 동참하기…

2
1

TIL: Use install to create the directory layout on GNU/Linux.

Suppose you need to create a file at a nested path like /etc/systemd/zram-generator.conf.d/10-writeback.conf. (Happens all the time.)

That means you need to create the parent directories recursively as needed. The portable, POSIX way would be:

mkdir -p "$(dirname /etc/some/deep/path/to/your/file)" && : > /etc/some/deep/path/to/your/file

Eeek!

But install can come handy. Originally it's about copying the files from one directory to another. So install SOURCE DEST copies files in SOURCE to DEST. But there's -D option:

-D: create all leading components of DEST except the last, or all components of --target-directory, then copy SOURCE to DEST

Together with a good default mod (-m 0644), you can:

install -m 0644 -D /dev/null /etc/some/deep/path/to/your/file

...And it works! Far more memorable, plus it works nicely with Fish's powerful history autocompletion. No need to add a custom function or script.

The -D option is GNU/Linux only. On other systems like macOS, you will have to:

install -d "$(dirname /path/to/file)" && install -m 0644 /dev/null /path/to/file

But this would be worse than the mkdir -p circus above.

1
5
1
2

For the servers I own and manage, I'd chsh to Fish. That alone eased the whole sysadmin thing a lot.

But today, configuring a new server, I'm trying out a new approach: Don't chsh, but always SHELL=/usr/bin/fish tmux whenever I do stuff manually via SSH.

I'm expecting two advantages: Scripts that expect Bash will have less chance of breakage, and it will remind me to never start anything outside of Tmux.

So far this seems to be working.

1

잘 알려지지 않은 부분인데, Windows에서도 온디바이스 AI를 지원합니다. 최근에 Windows 노트북 중에 Copilot+ 인증을 받은 노트북들은 단순히 마케팅 수사가 아니라 온디바이스 AI 구동을 위한 NPU를 탑재하고 있는데, 혹시 이런 디바이스를 가지고 계시다면 AI Dev 갤러리 앱을 받아서 테스트해보시면 재미있는 장면이 많이 나올겁니다.

또한 AI Dev 갤러리 앱을 이용하여 곧바로 샘플 코드를 담은 샘플 프로젝트를 동적으로 생성해주는 기능이 있으니 살펴보시면 재미있는 부분이 많을 것입니다. :-D

https://apps.microsoft.com/detail/9N9PN1MM3BD5?hl=neutral&gl=KR&ocid=pdpshare

2

오늘에야 안 건데 닌텐도 스위치는 5GHz 대역 와이파이를 쓰려면 공유기 설정에서 채널을 100 아래로 설정해야 한다더라. 그래서 34 채널로 설정해봤더니 정말로 되긴 했다. 근데 방에서 신호가 끊기는 증상이 생기기 시작해서 포기하고 다시 149 채널로 도망옴. 다른 설정은 다 같고 34 채널은 주파수도 낮고 겹치는 신호도 오히려 적은데 왜 끊기는 걸까...

2

Exciting news for developers! We've just landed a major milestone for Fedify 2.0—the now runs natively on .js and , not just (#456). If you install @fedify/cli@2.0.0-dev.1761 from npm, you'll get actual JavaScript that executes directly in your runtime, no more pre-compiled binaries from deno compile. This is part of our broader transition to Optique, a new cross-runtime CLI framework we've developed specifically for Fedify's needs (#374).

This change means a more natural development experience regardless of your runtime preference. Node.js developers can now run the CLI tools directly through their familiar ecosystem, and the same goes for Bun users. While Fedify 2.0 isn't released yet, we're excited to share this progress with the community—feel free to try out the dev version and let us know how it works for you!

2
0
0

https://github.com/be5invis/Sarasa-Gothic

터미널/에디터용 고정폭 폰트를 찾는다면 Sarasa Term K를 추천합니다. 이쪽도 한중일 폰트를 모두 지원합니다. Noto Sans Mono CJK도 좋지만 폰트 미세 조정이 안 되는 환경에서 Sarasa Term이 좀더 정확하게 렌더링됩니다. 영문과 한글만 쓰면 네이버의 D2Coding도 훌륭하지만 이쪽은 가나, 한자 지원이 약하죠.

2
2
3
1

JSON-LDへの愚痴

次のような未知のJSONがソフトウェアに与えられたとき、

{
  "name": "Alice"
}

ソフトウェアは
"Alice"という値がなんであるかを識別することはできません。よって、nameという文字列キーの代わりに事前に定義された識別子を用いることにしましょう。例えば:
{
  "http://xmlns.com/foaf/0.1/name": "Alice"
}

(URLとして解釈可能な文字列ではありますが、これはたまたまです。URLとして機能するわけではありません。便宜上このような文字列を使っているというだけ。
ですのでそのURLのドメインが悪意ある第三者によって詐欺サイトにリダイレクトするようになっていても、JSON-LD的には問題ありません!

ここで、互換性のため
@contextというものを考えたいと思います。これを使って次のように書くと、
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name"
  },
  "name": "Alice"
}

@contextを無視するだけで、従来のソフトウェアは今まで通りにJSONを扱うことができます。これがJSON-LDの基本的なコンセプトです。

ちなみに
@contextではあらゆる識別子をあらゆる文字列へマッピングできます。よって、ソフトウェアは次の2種類のJSON-LDを同じように解釈する必要がありますね!
{
  "@context": {
    "name": "http://xmlns.com/foaf/0.1/name"
  },
  "name": "Alice"
}
{
  "@context": {
    "名前": "http://xmlns.com/foaf/0.1/name"
  },
  "名前": "Alice"
}

ではここでさらなる抽象化を考えてみましょう。次のようにすると、与えられたJSON-LDが人物の情報であることを表すことができます。
{
  "@context": "https://json-ld.org/contexts/person.jsonld",
  "name": "Alice"
}

コンテキストは複数指定することもできますし、従来の辞書型と混ぜることもできます。さらに、あるコンテキストで定義されたキーに別名を付けて使うこともできます。
{
  "@context": [
    "https://example.com/foo",
    "https://example.com/bar",
    {
      "buz": "https://example.com/buz",
      "qux": "buz:qux"
    }
  ]
}

そうそう、クラス定義というものもあります。次の例における
"Object"という文字列値は、Activity Vocabulary(ActiviyPubを構成する仕様の一つ)におけるObjectというクラスであることを示すものです。
{
  "@context": "https://www.w3.org/ns/activitystreams",
  "type": "Object",
  "id": "http://www.test.example/object/1",
  "name": "A Simple, non-specific object"
}

Objectという文字列がキーとして使われることがないことはJSON-LDからは読み取れませんが、まあなんとかしてください!

ちなみにMisskeyが送信するJSONに付与する
@contextは次の通り。つまり、このコンテキストを理解できるソフトウェアを作れば、Misskeyと連携することができるということです。
{
	"@context": [
		"https://www.w3.org/ns/activitystreams",
		"https://w3id.org/security/v1",
		{
			"Key": "sec:Key",
			"manuallyApprovesFollowers": "as:manuallyApprovesFollowers",
			"sensitive": "as:sensitive",
			"Hashtag": "as:Hashtag",
			"quoteUrl": "as:quoteUrl",
			"toot": "http://joinmastodon.org/ns#",
			"Emoji": "toot:Emoji",
			"featured": "toot:featured",
			"discoverable": "toot:discoverable",
			"schema": "http://schema.org#",
			"PropertyValue": "schema:PropertyValue",
			"value": "schema:value",
			"misskey": "https://misskey-hub.net/ns#",
			"_misskey_content": "misskey:_misskey_content",
			"_misskey_quote": "misskey:_misskey_quote",
			"_misskey_reaction": "misskey:_misskey_reaction",
			"_misskey_votes": "misskey:_misskey_votes",
			"_misskey_summary": "misskey:_misskey_summary",
			"isCat": "misskey:isCat",
			"vcard": "http://www.w3.org/2006/vcard/ns#"
		}
	]
}

(ですがMisskeyは受信したJSON-LDをただのJSONとして解釈し、
@contextの内容は関知しません。)

そもそも情報交換用のサーバ間APIでJSON-LDのような柔軟で既存のJSON構造を壊さずに導入できる仕様を使う必要はないかもしれませんが……まあ細かいことは気にしない!

それでは、楽しいActivityPubサーバ開発を!!!

2

개발일지 251008

k8s로 배포할까 했는데, 다들 뜯어말리기도 했고 claude code로 바이브코딩한거 부채청산할 자신도 없어서 그냥 docker compose에다가 리버스프록시는 caddy로 물려서 올리는 중...... 근데, 라우터 설정하는 부분이 병목인데(집에서 세팅해야함) 당장은 못하는 관계로 다른 기능을 붙이는데 집중하고자 한다.

어드민 페이지랑 메일링 서비스 연동 게섯거라...

5
3
0
1
3

대만의 COSCUP, 벨기에의 FOSDEM에 이어, 국내에서도 개인 및 소규모 오픈 소스 프로젝트를 위한 FOSS for All 컨퍼런스가 드디어 열립니다! 🇰🇷

오는 11월 8일(토), 광운대학교에서 개최되며 저도 이번 행사에서 발표자로 참여하게 되었습니다.

🗣️ 발표 주제: “식탁보 프로젝트 다섯돌, 바뀐 것과 바뀌지 않은 것”

식탁보 프로젝트가 세상에 나온 지 벌써 5년이 되었네요. 처음엔 AI가 없던 시대에 시작했지만, 이제는 AI가 세상을 바꾸고 있고, 식탁보도 그 여정 위에 있습니다.

다섯 해 동안의 변화와, 여전히 지켜온 가치들에 대해 진솔하게 이야기 나누려 합니다.

오픈 소스, 기술, 그리고 커뮤니티를 사랑하는 분들이라면 꼭 한 번 참석해보세요!

👉 참가 신청: https://event-us.kr/fossforall/event/110400

현장에서 함께 이야기 나눌 수 있기를 바랍니다. 🙌

식탁보 프로젝트 다섯돌: 바뀐 것과 바뀌지 않은 것 포스터 이미지 (FOSS for All 2025 행사 홍보 카드)
3

근데 왼쪽 같은 생각 들 때는 걍 무지성 딸깍이 누르는 것도 의외로 도움이 되긴 하는 듯...
당장 결과물 안 나와서 우울감에 빠져있을 때는 AI든 뭐든 써서 뭐라도 만들어내서 자기효능감 떡락 악순환에서 탈출하는 게 큰 도움이 됨

5
2
3

LLM들은 왜 해마 이모지에서 이상 행동을 보일까?
------------------------------
- 최신
LLM 들이 *실제로 존재하지 않는 해마 이모지* 를 100% 확신하며 존재한다고 답변하고, 이를 출력하려다 잘못된 이모지를 반복 생성하는 현상이 발생
- 모델은 "해마 + 이모지" 개념의 *잔차 표현(residual representation)* 을 구축하려 하지만, 실제로 해당 토큰이 존재하지 않아
lm_head가 유사한 다…
------------------------------
https://news.hada.io/topic?id=23487&utm_source=googlechat&utm_medium=bot&utm_campaign=1834

1

So in order to grow the team, I’m thrilled to announce AltStore has received an investment of $6 million USD from @cpaikChris Paik! Chris was an early investor in Patreon & Twitch, and we’ve been close ever since he sideloaded the manga reader Paperback with AltStore years ago

Additionally, Flipboard CEO @mikeMike McCue will also be joining our Board of Directors! Mike’s experience with Flipboard & @surf will be invaluable as we expand to the Fediverse, and I couldn’t be happier to have both him + Chris on board

While this solves our problems, we are far from the only Fediverse project that could use some funding and we want to support the growth of the entire ecosystem.

So to give back to the open social web, we’re also donating $500,000 total to these incredible Fediverse-related projects 🎉

@Mastodon
@ivoryIvory by Tapbots :emoji_wink:
Tapestry by @IconfactoryThe Iconfactory
@mstdnMstdn.Social :mastodon:
@bsky.brid.gyBridgy Fed for Bluesky
@peertube
@bookwyrm
@akkomaakkoma stuff
@fedifyFedify: ActivityPub server framework

The Fediverse as we know it would not exist without them, so please check them out!

1
0
1

Announcement: AltStore becomes a financial contributor to Fedify

We're thrilled to announce that AltStore has become a financial contributor to Fedify! This generous support comes as part of AltStore's broader commitment to strengthening the open social web ecosystem, as they prepare to become the world's first federated app store. Their investment in Fedify and other fediverse projects demonstrates a shared vision for building a more open, interoperable digital future.

AltStore's journey into the fediverse represents a groundbreaking approach to app distribution—connecting their alternative app marketplace with the open social web through ActivityPub. As pioneers who have already pushed Apple to change App Store policies twice in their first year, AltStore understands the transformative power of open protocols and decentralized systems. Their support will help Fedify continue developing robust tools and libraries that make it easier for developers to build federated applications. We're deeply grateful for AltStore's trust in our project and look forward to seeing how their innovative federated app store will reshape mobile app distribution while strengthening the entire fediverse ecosystem.

https://rileytestut.com/blog/2025/10/07/evolving-altstore-pal/

Email notification from Open Collective showing AltStore has become a new financial contributor to Fedify as a corporate sponsor with a $500.00 monthly contribution. The email includes the Open Collective logo, information about AltStore with a link to their Open Collective page, and details about the sponsorship tier and amount.
4
1
0

마이그레이션을 위해 각 페이지들은 TanStack Start/Router에 맞게 다 작업했고, SEO를 위해 만든 웹 페이지기도 하니 이제 렌더링된 페이지의 meta 태그랑 sitemap.xml를 작업이 남은 상황이다.

Next.js는 검색엔진 최적화나 페이지의 메타데이터를 예쁘게 정리해둔 타입에 맞게 담아주면 정말 알잘딱깔센하게 <head> 태그 안에 담아주는데[1], TanStack Start에서는 아래와 같이 직접 meta 태그나 link 태그 등을 하나하나 직접 빚어내야한다.

export const Route = createFileRoute("/articles/$articleId")({
  loader: ({ params: { articleId } }) => fetchArticle({ data: { articleId } }),
  head: (ctx) => {
    // NOTE: 적당히 생략
    return {
      meta: [
        { name: "title", content: title },
        { name: "description", content: description },
        { name: "keywords", content: keywords },
        { name: "og:title", content: title },
        { name: "og:type", content: "article" },
        { name: "og:author", content: post.author.nick },
        { name: "og:image", content: "/ci/logo.svg" },
        { name: "og:url", content: fullUrl },
        { name: "og:description", content: description },
        { name: "og:locale", content: "ko_KR" },
        { name: "og:site_name", content: defaultTitle },
      ],
    };
  },
  component: RouteComponent,
});

그러면 Next.js는 어떻게 각 페이지 컴포넌트 모듈에서 async function generateMetadata() 함수나 metadata 객체를 읽어서 어떻게 처리할까? 궁금해져서 찾아보았다.

Next.js 코드 속 src/lib/metadata에서는 모듈에 있는 메타데이터 정의를 읽고 generateMetadata()면 실행해서 resolve하는 resolve-metadata.ts부터, metadata.tsx를 통해 어떻게 Metadata 타입을 가지고 OpenGraph, Apple, Twitter를 비롯해 각 타입에 맞는 <meta> 태그를 만들어주는지 알 수 있다. OpenGraph라던가 각 세부 항목에 대해선 generate/opengraph.tsx 파일 등을 보면 이해할 수 있다.

이 방식이 꽤 괜찮게 느껴져서 자고 일어나선 해당 코드를 차용해서 새 코드베이스에서도 그대로 활용할 수 있게 만들어보려고 한다.


  1. https://nextjs.org/docs/app/getting-started/metadata-and-og-images ↩︎

4
3

I love DFRobot's CM4 Router Board hardware. I can't find anything to complain about. The closest thing would be that the sysfs LED control at /sys/class/leds/PWR/trigger doesn't work. The PWR LED is always on. (Controlling ACT works perfectly well.) So you can see how insignificant it is. In other words, I love my router.

1
6
1

OpenSSH 10.1 에서 새로운 ssh-config 옵션 RefuseConnection 이 추가되었다고 한다.

ssh(1): add an ssh_config(5) RefuseConnection option that, when encountered while processing an active section in a configuration, terminates ssh(1) with an error message that contains the argument to the option.

This may be useful for expressing reminders or warnings in config files, for example:

  Match host foo
           RefuseConnection "foo is deprecated, use splork instead"

-- https://www.openssh.com/releasenotes.html#10.1p1

아니… 그것 참… 유용한 듯하면서도… 그것 참…

2

우와 오랜만에 보는 규칙기반 전문가 시스템이당...다른 분야는 깜냥이 없다시피해서 모르겠지만 언어학, 특히 통사론 및 전산심리언어학(Computational Psycholinguistics)쪽은 내가 마지막으로 연구덕질 했을 때 시점 기준으로 봤을 때 많이들 연구되는 문법이론이랑 모델들 중 거의 대부분이 규칙 기반이었다. 예컨대 통사론의 경우 생성문법쪽에선 넓게 말하면 CFG를 자연어쪽에 적용될 수 있게끔 확장 및 변형시켜서 이론화 시킨 거고, 그걸 기반으로 해서 규칙들 만들어서 코퍼스에다가 POS 태깅 학습 시키고 그러곤 함..전산심리언어학쪽에선 꽤나 자주 봤었던 모델이 ACT-R이라 해서 닝겐의 인지과정, 특히 작업 및 장기기억에 포커스를 맞춰서 구현한 인지아키텍처가 하나 있는데 이거 갖고 닝겐의 언어처리를 시뮬레이션한 거랑 실제로 사람 대상으로 해서 얻은 행동반응 데이터를 비교해서 연구하는 게 있었음..그리고 이것 또한 규칙기반 시스템이다.

물론 LLM이 나오고나서부턴 관심이 많이들 바뀌었지만..discussion에 달린 댓글에도 적혀있듯 이런 규칙기반 시스템의 이점은 모델이 '왜' 이런 결정을 했고 맛이 갔는지(?) 잘 알 수 있다는 건데, 효율적으로 잘 돌아가는 것도 중요하지만 그만큼 '왜' 그러한 방식으로 돌아가는 것 또한 중요하게 여기는 연구자들한텐 확실히 이 시스템이 LLM에 비하면 이해하고 설명하기 용이하긴 하다. 물론 LLM도 비슷하게 interpretability라는 활발한 분야가 있고 나도 대학원 다닐 때 그 쪽으로 연구했지만 확실히 규칙기반 모델 갖고 쓴 논문들이 이해하기도 쉽고 깔끔해서 좋긴 했었음...하지만 그런 논문들을 읽을 때 마다 동시에 모델이 깔고 있는 가정과 rationale에 종속되어버린 채 결과를 해석할 수도 있다는 생각도 떠오르면서 어찌보면 LLM이 그런 면에선 좀 더 제한이 덜 하지 않을까한 생각도 했었다. 여튼 오랜만에 규칙기반 시스템 보니깐 반가워서 써봤습니다.

3
1
0
0
1
2

I recorded a one hour video of me implementing a thing for one of our code bases with codex and claude. It might be boring in the first 15 minutes, but I went through most of it. youtube.com/watch?v=X8M6U3QiC8Q

1
2