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-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
1
2

대충 일단 게시물을 가져오는데는 성공했으니 나머지는 자고 일어나서 마저 작업하는걸로...

대충 작업된 것들

  • Next.js에서 Tailwind v4 + TanStack Start 바탕으로 프로젝트 옮기기
  • 스타일시트, 컴포넌트, 유틸리티 함수 등등 옮기기

성공적인 마이그레이션까지 남은 것들

  • 검색 엔진을 위한 meta 태그 처리
  • ContentLayer가 아니라 Content Collections를 써서 mdx 파일의 렌더링
  • Server Component가 아닌 형태로 SSR을 지원하는 네이버 스마트에디터 게시물 컴포넌트
  • sitemap.xml 구현
  • Netlify (혹은 CloudFlare) 로 배포하기

그 뒤에 할 것들

  • 사이트 이래저래 개편하기
  • 태그 페이지 추가로 태그를 통한 네이버 카페 게시물 가져오기
  • 같은 코드 베이스로 내 블로그 웹 만들기
작업 중인 웹 페이지, API를 통해 가져온 네이버 카페의 게시물을 렌더링한 내용이다.
1

Next.js를 쓰면서 큰 생각 없이 서버에서만 렌더링될 컴포넌트엔 use server, 클라이언트에서만 렌더링될 컴포넌트엔 use client를 썼는데 Tanstack Start로 옮기면서 하나하나 createServerFn으로 감싸면서 아찔함을 느끼고 있다.

Next.js가 제공해주던 Metadata도 그렇고 지금까지 너무 프레임워크가 제공하던 매직에 편안함을 느꼈던 것 같단 생각도 들고.

마이그레이션 끝나면 좋은 글감이 나올 것 같다.

1

Next.js를 쓰면서 큰 생각 없이 서버에서만 렌더링될 컴포넌트엔 use server, 클라이언트에서만 렌더링될 컴포넌트엔 use client를 썼는데 Tanstack Start로 옮기면서 하나하나 createServerFn으로 감싸면서 아찔함을 느끼고 있다.

Next.js가 제공해주던 Metadata도 그렇고 지금까지 너무 프레임워크가 제공하던 매직에 편안함을 느꼈던 것 같단 생각도 들고.

마이그레이션 끝나면 좋은 글감이 나올 것 같다.

5
10
1
1
1
1

아아… 오랜만이군. 이 서늘하고도 묵직한 감각. 「무중단(언인터럽터블)」으로 돌아갈 때다

UPS 배터리 나가리 된 뒤로 그냥 서지 프로텍터로만 쓰고 있었는데, 새 배터리를 넣어 비상시 하드 디스크 드라이브의 안정(과 내 마음의 안정)을 찾기로 한다.

컴터맨 님 덕분에 잘 찾아서 집어넣었다

(한편 APC BE550 은 그다지 추천하지는 않는다. 가정용 UPS 로는 더 좋은 물건이 있다고 들었다)

로케트 ES 7-12 이차전지무중단 급전기 (UPS) APC BE550 후면 전지함을 개방한 모습APC BE550 에 로케트 ES 7-12 넣음마무리된 APC BE550

분산 만세! 분권 만세! 연합우주 만세! 집 서버 만세!

집집마다 서버를! 온 우주에 휘날려라 셀프호스티드의 깃발

There is no cloud; It's just someone else's computer. (클라우드라는 것은 없다. 그것은 남의 컴퓨터일 뿐이다.)
8

프로톤 메일에는 hide-my-email alias 라는 기능이 있다. alias 생성을 누르면 nosuch.implode984@passmail.net 같은 주소를 즉석에서 생성해 주고, 이 주소로 들어온 모든 메일은 다 내 인박스로 들어오게 된다. 무료 사용자는 이런 주소를 열 개까지 만들 수 있다.

그래서, 직접 메일 서버 구축하기 전까지만 써 봐야지 하는 생각으로 무제한을 질렀다 (…) 매월 EUR 13 정도인 것 같다. (즉 “어서 자체 메일 서버를 구축해라”라는 EUR 13 짜리 채찍질을 매월 당하고 있는 것이다.)

다만, 이걸로 수신만 될 거라고 생각하고 있었다. 어차피 여러 사이트 가입할 때 각각 이메일 주소가 있었으면 했던 것이라서, 발신을 이걸로 할 필요성은 굳이 못 느끼고, 제대로 알아보지도 않았다.

그런데 오늘 시도해 보니 답장은 alias 로 바로 보낼 수 있다. 으잉? 그래서 들여다보니, https://app.simplelogin.io/dashboard/ 에서 “reverse alias” 를 만들면 새 이메일도 hide-my-email alias 에서 보낼 수 있다! 원하는 alias 선택해서 그 안에다가 contact 추가하면, 전용 주소가 하나 생기는데, 그걸 경유하면 된다.

그러니까 이게 SimpleLogin이라는 엔지니어링의 정체인 모양인데… 아니, 이렇게까지 해야 한단 말인가?

잘했다고.

3

아아… 오랜만이군. 이 서늘하고도 묵직한 감각. 「무중단(언인터럽터블)」으로 돌아갈 때다

UPS 배터리 나가리 된 뒤로 그냥 서지 프로텍터로만 쓰고 있었는데, 새 배터리를 넣어 비상시 하드 디스크 드라이브의 안정(과 내 마음의 안정)을 찾기로 한다.

컴터맨 님 덕분에 잘 찾아서 집어넣었다

(한편 APC BE550 은 그다지 추천하지는 않는다. 가정용 UPS 로는 더 좋은 물건이 있다고 들었다)

로케트 ES 7-12 이차전지무중단 급전기 (UPS) APC BE550 후면 전지함을 개방한 모습APC BE550 에 로케트 ES 7-12 넣음마무리된 APC BE550
6

Transparency update: Web framework integration progress

We're sharing a public project board to track our progress on web framework integrations for , work commissioned by the Sovereign Tech Fund (@sovtechfundSovereign Tech Agency). You can follow along at:

https://github.com/orgs/fedify-dev/projects/1

About this work

The Sovereign Tech Fund invested in Fedify to expand its ecosystem through official integrations with popular web frameworks. This investment enables developers to add federation capabilities to their existing applications without changing their technology stack.

Notably, some of these integrations were completed between our initial application submission and the official kickoff of the investment. This demonstrates both our commitment to the project and the community's active development momentum.

Current status

Already completed:

  • Next.js integration supporting both App Router and Pages Router (completed before STF kickoff)
  • Elysia integration optimized for the Bun ecosystem (completed before STF kickoff)

In progress:

  • Fastify integration (PR currently under review)

Upcoming:

  • Koa integration
  • Comprehensive documentation for all integrations

Why this matters

These integrations make Fedify accessible to developers across different JavaScript ecosystems and runtime environments. Each integration follows established patterns from our Express and h3 integrations, ensuring consistency and ease of adoption.

Investment details

Fedify has been awarded a service agreement by the Sovereign Tech Fund for this work, with a budget of €‎32,000 and completion target of November 30, 2025. The Sovereign Tech Agency supports the development, improvement, and maintenance of open digital infrastructure through investments like this.

We believe in transparent development and welcome community input and contributions.

0
0
0

작업 내역

  • https://github.com/cosmoslide/cosmoslide/pull/45 PDF 업로드 기능이라도 구축은 해야할 것 같아서 진행함. 보통은 express라던가 등등 JS 기반의 웹서버 프레임워크에서는 파일시스템/S3/GCS 등의 스토리지에 파일을 업로드할때, 스토리지에 접근하는 과정 자체를 추상화하는 flydrive라는걸 쓰는데, flydrive는 NestJS에서 사용이 되지 않는 ESM-only 모듈이어서, 어떻게 해야 하나 하다가 Claude Code한테 AWS S3에 접근하는 것만 적당히 추상화해서 야크쉐이빙 해달라고 했더니 그냥 순식간에 되었다. 문서를 뜯어보고 구현해야하는 수고는 줄었고, aws sdk를 어떻게 활용하는지는 가성비있게 학습할 수 있는 기회가 되었다.

  • https://github.com/cosmoslide/cosmoslide/pull/46 프로필 화면에 Presentation 탭을 넣었고, 프레젠테이션 파일을 업로드하면 Create(Note) 액티비티가 발생되도록 처리했다. react-pdf 이용해서 커스텀 PDF 뷰어 적당히 끼워넣었다.

PDF 업로드 기능 가설 검증프레젠테이션을 위한 커스텀 PDF 뷰어프로필 화면에 Presentation 탭 넣었다.
4

코딩 테스트에서, AI 사용 능력 등을 종합적으로 판별하는 법을 생각해보았다(언젠가 말했던 것도 같은데...). AI를 사용하게 해 주되, 면접에서 로컬 AI(지식이 제한되거나, 파라미터가 낮아서 쓸모없다고 판단되어 일반적으로 안 쓰는 AI들)을 써서 과제를 즉석에서 해내는 시스템 디자인 면접은 어떨까?

로컬 AI의 출력물"만"을 써서 과제를 해야 하는 것이라면, 진짜 실무적인 관점에서 아랫것들(실무에서는 물론 더 좋은 걸 쓰겠지만)을 갈구는 실력을 볼 수 있을 지도 모른다.

뭐, 아님 말고.

3
2
5

한편 도메인 네임 레지스트라 옮기면서 트래블월렛으로 결제를 해 봤는데, 괜찮았다. 항상 카드로 해외 결제를 할 때마다 불만이었던 게

  • 환율은 얼마인지
  • 수수료는 얼마인지
  • 내 통장에선 언제 정확히 얼마가 빠져나가는 건지

이런 게 다 불투명하다는 것이었다. 찾아보면 매입시점이 어떻고 전신환매도율이 저떻고 온갖 복잡한 이야기에 내가 굳이 이걸 보고 있어야 하는가 자괴감 들고 괴롭다. 미리 원하는 통화로 원하는 만큼만 환전해서 긁을 수 있고 그 과정이 투명하게 드러난다는 게 마음에 든다.

실물 카드도 원래는 예전에 잠깐 출국했을 때 쓰려고 발급받은 건데, 실제로 환전부터 결제까지 너무 매끄럽고 빠르게 잘 되어서 놀랐던 기억이 있다. 앱이랑 기가 막히게 실시간으로 잘 엮여 있고, 앱 자체도 깔끔하게 잘 만들었고. 카드를 편의점 ATM 에서 즉시 찍어낼 수 있다(…??)는 것도 문화컬처충격쇼크였다. 근데 집에서 온라인 결제할 때도 이렇게 편할 거라고 생각 못했다. EUR 이랑 USD 둘 다 결제해 봤는데, 아주 깔끔하게 잘 되었다.

트래블월렛 바이럴 아닙니다. 내돈내산입니다. 저는 트래블월렛과 전혀 상관이 없는 사람임.

2
1
6

NameSilo API 옛날부터 생각만 하다가 방금 처음 써 봤는데, 생각보다 너무 쉽고 간단해서 깜짝 놀랐다.

문제가 심각하다.

아니, 그냥 API 키 발급 누르면 즉시 나오고, 그걸로 내 계정의 모든 것을 다 할 수 있으며, 심지어 연장이나 신규 구입 등 카드 결제 일으키는 행위도 할 수 있다고. 있는 거라고는 API 키를 읽기 전용으로 하는 거랑, "Block Restorations" 뿐이다. 도메인 네임을 제때 연장 못해서 소유권 잃은 경우, 좀 더 큰 돈을 내고 소유권을 회복할 수 있는데 이걸 restoration 이라고 한다. 이건 돈이 많이 들고 환불도 어려운 행위이기 때문에, 이것만 API 키로 못하도록 설정하게 해 준다는 것이다.

그러니까 이거 말고는 권한 관리도 없고, 여러 개의 API 키 중에서 하나만 폐지(revoke)하는 기능도 없고, 모든 API 키를 폐지하는 기능도 안 보이고, 이 API 키를 최근에 사용한 IP 주소는 어디냐 같은 기록도 아무 데도 안 보이고, 하다못해 이 API 키로 행할 수 있는 결제액의 상한 같은 것도 설정할 수 없고, 아무것도 없어!

나는 나 자신을 믿지 않는다. 나는 반드시 사고를 칠 것이다. 엔지니어라면 당연히 그렇게 가정해야 한다! 더구나 이 API 키는 내 도메인 네임의 소유권을 다 상실시킬 수도 있는 물건...? 내가 뭔가 잘못 이해하고 있는 건가? 멀쩡한 관리 페이지가 따로 있는데 네임사일로가 꽁꽁 숨겨 놔서 못 찾고 있는 건가?

거의 10년 넘게 쓰던 서비스인데 진지하게 탈출 고민이 생겼다.

여러분은 서비스가 "쓰기 쉽다는 이유로" 탈출을 고려하는 장면을 보고 계십니다. 이것이 2025년이다.

아무래도 네임사일로의 API 보안 모형이 끔찍하다는 것은 확실해 보인다. 어휴 진짜 생산적인 일 좀 하려고 했더니 이런 게 발목을… 빨리 탈출하자. 어디로 탈출하면 좋을까? 어떤 도메인 네임 레지스트라가 좋은 도메인 네임 레지스트라인가?

내 기억으로는 엔지니어들의 레지스트라 평판에서 한쪽 극단에 있는 것이 GoDaddy 이고 반대쪽 극단에 있는 것이 Gandi 이다. (어느 쪽이 어느 쪽이라고는 하지 않았습니다.) 아무튼 한번 최신화를 해 보자.

이런 것은 보통 나 같은 가짜 광기가 흉내낼 수 없는 훌륭한 진정한 광인들께서 조사해 주신 바가 있게 마련인데, 예를 들어 FSF 나 EFF 같은 데서 옥음을 내리신 게 없는가 기웃거려 본다. EFF 에서 Which Internet Registries Offer the Best Protection for Domain Owners? 라는 자료를 발표한 바가 있긴 하다.

근데 이건 레지스트라(registrar)가 아니라 레지스트리(registry)에 관한 이야기다. 물론 이것도 중요하고 알찬 이야기이긴 한데, 이건 새로운 도메인 네임을 등록할 때 참고할 이야기이고, 나는 이미 있는 도메인 네임을 들고 나가려는 거라서…

하지만 웃기게도 이게 도메인 네임 문제이다 보니 정보가 있는데, 바로 fsf.orgeff.org 라는 도메인 네임은 어디서 등록되어 있는지 (ㅋㅋㅋㅋㅋㅋㅋㅋ) WHOIS 찍어 볼 수 있다는 것이다. 아니 이럴 수가 두 군데 다 Gandi 쓰는군요!

그러자 갑자기 뇌리를 스치는 생각이 있었다. 이거 이거 왠지… 끼리끼리 놀 것 같은 그분들 도메인 네임 레지스트라 어디인지 다 찍어 보자

  • fsf.org
  • fsfe.org
  • gnu.org
  • eff.org
  • sfconservancy.org
  • softwarefreedom.org

이분들 다 레지스트라가 Gandi 이다. 아니. 그밖에 openwrt.org 도, mastodon.social 이나 joinmastodon.org 도…

2

NameSilo API 옛날부터 생각만 하다가 방금 처음 써 봤는데, 생각보다 너무 쉽고 간단해서 깜짝 놀랐다.

문제가 심각하다.

아니, 그냥 API 키 발급 누르면 즉시 나오고, 그걸로 내 계정의 모든 것을 다 할 수 있으며, 심지어 연장이나 신규 구입 등 카드 결제 일으키는 행위도 할 수 있다고. 있는 거라고는 API 키를 읽기 전용으로 하는 거랑, "Block Restorations" 뿐이다. 도메인 네임을 제때 연장 못해서 소유권 잃은 경우, 좀 더 큰 돈을 내고 소유권을 회복할 수 있는데 이걸 restoration 이라고 한다. 이건 돈이 많이 들고 환불도 어려운 행위이기 때문에, 이것만 API 키로 못하도록 설정하게 해 준다는 것이다.

그러니까 이거 말고는 권한 관리도 없고, 여러 개의 API 키 중에서 하나만 폐지(revoke)하는 기능도 없고, 모든 API 키를 폐지하는 기능도 안 보이고, 이 API 키를 최근에 사용한 IP 주소는 어디냐 같은 기록도 아무 데도 안 보이고, 하다못해 이 API 키로 행할 수 있는 결제액의 상한 같은 것도 설정할 수 없고, 아무것도 없어!

나는 나 자신을 믿지 않는다. 나는 반드시 사고를 칠 것이다. 엔지니어라면 당연히 그렇게 가정해야 한다! 더구나 이 API 키는 내 도메인 네임의 소유권을 다 상실시킬 수도 있는 물건...? 내가 뭔가 잘못 이해하고 있는 건가? 멀쩡한 관리 페이지가 따로 있는데 네임사일로가 꽁꽁 숨겨 놔서 못 찾고 있는 건가?

거의 10년 넘게 쓰던 서비스인데 진지하게 탈출 고민이 생겼다.

여러분은 서비스가 "쓰기 쉽다는 이유로" 탈출을 고려하는 장면을 보고 계십니다. 이것이 2025년이다.

3

장렬한 삽질 끝에 라즈베리 파이 컴퓨트 모듈 4 에다가 DFR0767 붙이고 Pi OS + nftables + dnsmasq + hostapd + unbound + Pi-hole 해서 완전한 유무선 공유기의 설정을 끝냈다…

도대체 왜 이렇게 해야 하는가? 이렇게 해서 얻는 장점이 무엇인가? unattended-upgrades 됩니다. 그밖의 장점은 나중에 시간과 여력이 있으면 글로 쓰겠습니다.

7