게시글에 목차가 추가되었습니다. 게시글 안에 소제목이 있을 경우에는 목차가 보이게 됩니다. 가로로 넓은 화면에서는 오른쪽에 보이고, 모바일 환경처럼 가로로 좁은 화면에서는 제목 아래 본문 위에 보이게 됩니다.

Jaeyeol Lee
@kodingwarrior@hackers.pub · 238 following · 158 followers
Neovim Super villain. 풀스택 엔지니어 내지는 프로덕트 엔지니어라고 스스로를 소개하지만 사실상 잡부를 담당하는 사람. CLI 도구를 만드는 것에 관심이 많습니다.
Hackers' Pub에서는 자발적으로 바이럴을 담당하고 있는 사람. Hackers' Pub의 무궁무진한 발전 가능성을 믿습니다.
그 외에도 개발자 커뮤니티 생태계에 다양한 시도들을 합니다. 지금은 https://vim.kr / https://fedidev.kr 디스코드 운영 중
Github
- @malkoG
Blog
- kodingwarrior.github.io
mastodon
- @kodingwarrior@silicon.moe
Jaeyeol Lee shared the below article:
거꾸로 상태 모나드로 강화 학습 하기 (1/2)

bgl gwyng @bgl@hackers.pub
기계 학습을 전혀 모르고 살면 안 되겠다 싶어, 얼마전부터 하스켈로 공부하기 시작했다.
Hasktorch라고 하스켈용 Torch 바인딩을 사용한다. 이전에 도전했을땐 MNIST까지 하고 다음에 뭘 해야할지 모르겠어서 그만뒀는데, 이번엔 강화 학습으로 이어나가 보기로 했다.
강화 학습은 주어진 환경에서 보상을 최대화하는 에이전트를 학습시키는 것으로, 데이터가 필요없다는게 장점이다. 대신 환경을 만들어야 하는데, 간단한 게임도 환경이 될 수 있다. 게임 만들기는 데이터 모으기와 달리 즐거운 일이니 마다할 필요가 없다.
첫번째로 도전으로 스네이크 게임을 골랐는데, 다들 한번쯤은 해봤을 것이다. 뱀을 조종해 먹이를 최대한 많이 먹으면 되는데, 뱀의 머리가 벽이나 아니면 자기 몸통에 부딪히면 죽는다.
여차여차 학습시켜서 이정도까지 하는데에는 성공했다.
강화 학습 지식이 일천해서 게임을 클리어하는 수준까지는 못 만들겠다. 이 글은 학습을 잘 시키는 방법이 아니라, 강화학습 코드를 어떻게 잘 짜느냐에 대한 것이다.
일단 강화 학습이란걸 형식화 해보자. 앞서 언급한 환경과 에이전트란 단어를 어떻게 정의할수 있을까?
먼저 에이전트의 정의는 이렇다.
type Agent = Observation -> Action
관측 Observation 에 따라 행동 Action 을 선택한다. 나는 눈앞에 콜라가 보이면 마신다.
환경은 에이전트를 실행하는 무언가이다. 일상적인 표현으로 쓰자면, 에이전트를 둘러싼 무언가이다.
runAgent :: Agent -> [Action]
이 runAgent
함수가 환경의 역할을 수행한다. Agent
를 인자로 받아 죽을 때까지 선택한 행동들을 반환한다.
그런데 이건 너무 외연적인 정의고, 환경과 에이전트가 보통 만족할만한 조건을 나열해보자면 이렇다.
- 환경은 상태를 가지고 있고 시간이 지남에 따라 변경된다
- 상태는 에이전트가 무엇을 관측할지를 결정한다
- 에이전트의 행동은 다음 상태에 영향을 끼친다
이 조건들을 바탕으로 환경을 좀더 구체적으로 정의하면 다음과 같다.
class Environment e where
type State e
type Observation e
type Action e
update :: (State e, Action e) -> State e -- 조건 1, 3
observe :: State e -> Observation e -- 조건 2
스네이크 게임에서 상태는 뱀의 모양과 먹이의 위치, 관측은 상태와 같고(플레이어는 전체 게임 화면을 볼 수 있다), 행동은 좌회전과 우회전이 된다.
그런데 뱀이 아무렇게나 좌회전 우회전 한다고 박수 쳐줄순 없고, 우리는 얘한테 바라는 게 있다. 죽지않고 더 많은 먹이를 먹어야 한다. 이를 위해 뱀이 제때 방향을 바꿔서 먹이를 지나치지 않고 먹으면 잘 했다고 보상을 주자. 그러면 뱀은 보상을 더 많이 받을 방법을 학습한다.
type RewardFunction = (Observation, Action) -> Float
보상 함수는 관측와 행동에 따라 보상을 결정한다. 가령 뱀이 먹이 하나를 냠냠하면 보상을 1 주면 된다. 지나쳐버리면 0점이고, 죽었을 때는 -1점을 줄 수도 있다. 당근과 채찍이라 생각하고 정의하면 된다. 또, 보상은 더해서 누적이 되어야 하므로 대충 Float
으로 고른다.
학습을 시키려면 보상을 계산해야하고, 그러기 위해 관측과 행동을 짝지어야한다.
trainAgent :: Agent -> [(Observation, Action)]
runAgent
와 달리 Observation
도 포함되어 있다. 이때 [(Observation, Action)]
을 에피소드 Episode 라고 한다. 에피소드로부터 보상을 구하자.
rewards = fmap (uncurry rewardFn) (trainAgent agent)
rewardFn :: RewardFunction
agent :: Agent
...해치웠나?
에피소드가 어떻게 기록될지를 살펴보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 🍎 | 🍎 | 🍎 | 💀 |
위의 rewards
의 값이 이런 의미일거라고 보인다. 실제로 Float
값을 표시해보자.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 |
혹시 이상한 걸 찾으셨나요?
이런식으로 보상하는게 틀린 건 아니다. 다만 에이전트가 장기적인 계획을 세우도록 학습시키지 못한다. 먹이를 먹는 순간에만 보상을 받기 때문에, 멀리 떨어진 먹이를 향해 다가가게끔 유도할 수가 없다. 이를 해결하려면 보상을 뒤에서부터 누적시켜야 한다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 3 | 3 | 3 | 2 | 2 | 2 | 1 | 0 | 0 | 0 |
rewards = scanr (+) 0 (fmap (uncurry rewardFn) (trainAgent agent))
코딩 테스트용 코드를 짜야할것 같은 느낌이 들었는데, 다행히 scanr
함수 덕분에 쉽게 해결했다.
좀더 개선해볼까.
지금의 보상 체계에서 에이전트는 먼 미래를 고려하며 선택하는 것을 배울 수 있다. 그런데, 사실 뱀이 맨 처음에 좌회전을 하던 우회전을 하던, 죽기 전까지 먹이를 총 몇개 먹는지에 엄청난 영향을 끼칠거 같진 않다. 어떤 시점에서의 선택의 영향은 시간이 지날 수록 점점 희미해진다. 이 점을 반영해서 뱀이 잘못된 편견을 갖지 않도록 도와주자. 미래의 보상을 누적하되, 감쇠율 0.9를 적용하는 것이다.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
행동 | → | ↓ | → | ↓ | ← | ↑ | → | ↓ | ← | ↓ |
보상 | 1.93 | 2.15 | 2.39 | 1.54 | 1.71 | 1.90 | 1.00 | 0.00 | 0.00 | 0.00 |
rewards = scanr (\x y -> x + 0.9 * y) 0 (fmap (uncurry rewardFn) (trainAgent agent))
이제 나머지는 GPU한테 맡기면 된다. 조금만 기다리면 위의 동영상에서처럼 움직이는 뱀을 볼 수 있다.
여기서 GPU를 100장 더 사서 뱀 대신에 좀더 우리 삶에 도움되는 에이전트를 학습시킨다면, 그걸 10년전에 했으면, 난 지금 부자가 되어있을지도 모르겠다. 하지만 기회는 이미 떠났고, 난 지금 돈은 없지만 대신 시간은 많다. 그 시간을, 지금의 그럭저럭 볼만한 코드를 쥐꼬리만큼 개선하는데 낭비해보려 한다.
지금 코드에서 뭐가 마음에 안드냐면,
-
보상이 사실 서로 다른 두 개를 가리킨다
먹이를 먹자마자 즉각적으로 주는 보상과, 그것을 누적한 보상, 이렇게 두 개가 있다. 실제로 학습에 사용하는 것은 후자이다. 그런데 막상 보상 함수의 정의는 전자에 대한 것이다. 이는 보상 함수를 계산할 때 미래에 어떤 일이 일어나는지 알수가 없어서 그렇다. 정의를 두 개로 나눈 이유가 의미를 명쾌하게 하기 위해서가 아니라, 그냥 한번에 계산을 할수 없기 때문이다.
-
환경의 정의
위에서 살펴본
runAgent
의 정의가 일견 우아해보일 수 있다. 문제는 그 정의는 환경과 에이전트가 모두 순수 함수일 것을 강요한다는 것이다.Environment
의 정의도 마찬가지다.환경과 에이전트는 각자의 부수효과 Side effect 를 가질 수 있어야 한다. 가령 온라인 게임을 환경으로 삼는다면, 환경은 네트워킹을 할 수 있어야 한다. 또, 에이전트는 매번 똑같은 선택이 아닌 확률적 선택을 하고 싶을텐데, 이는 순수 함수로써는 불가능하다.
그러면 부수효과를 허용하면 되는거 아냐?
맞다. 나처럼 시간이 많다면 직접 해보는 것도 나쁘지 않다. 하지만 정의가 점점 지저분해지는 것을 보게될 것이고...
시간을 아껴주기 위해 정답을 알려주겠다. 환경은 에이전트가 실행될 수 있는 모나드여야 한다. 딱 거기까지여야 한다. 환경과 에이전트 사이에 그 이상의 관계는 부적절하다.
글이 생각했던 것보다 길어져버려서, 오늘은 여기까지 해야겠다. 이어지는 글에서 거꾸로 상태 모나드가 이걸 어떻게 해결하는지 소개한다.
사실 아까 환경이니 에이전트니 어쩌고 할때부터, 진작에 강화 학습을 마스터한 학생들이 이미 다 아는 내용에 지겨워 졸기 시작하는게 보였다.
다음 수업은 재밌을테니, 대신 그때까지 모나드를 배워오세요.
저… 제가 아마도 해커스펍 개발자분보다도해커스펍 서버와 가장 가까이서(2미터 거리) 쓰고 있는 유저인데…
느려요.
RE: https://hackers.pub/@hongminhee/0195d567-06d6-7437-a4eb-cf567adf9714
해커스펍의 정체… (거대토끼의 맥미니 위에서 돌아가고 있습니다.)
Building a Linux Container Runtime from Scratch
Link: https://edera.dev/stories/styrolite
Discussion: https://news.ycombinator.com/item?id=43486997
@basix 바식스 님 어서 오세요!
Jaeyeol Lee shared the below article:
복잡한 코드를 단순하게 줄여나갈 수록 발생하는 버그의 빈도나 심각도가 점진적으로 올라가는 경향이 있다고 느낀다

ㄹ @disjukr@hackers.pub
<metadata></metadata><style class="style-fonts"> @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAQsABEAAAAADHQAAAPRAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKggCBcAsGAAE2AiQDCAQgBYJeByAMFBsxC1GU7kmc7IuDeIxnknghkogrbGm/yUrQr2+4AWU2eJ7yqver0gMwA3Apn7YXEm9wGAyuCeZhwkEGwsU2dSmhL3X5FByVFyffuXywYwJeQMyQoTnpoLuJgfyOKhWW//9e/Zj7X6bY2GJ5Of9miUZkbxpzAa2CtITVcoaFqhurXC9g/6hepcHKv18JArgBAAIoBEEAF8KEkYqVazbECQPAsgAGzmt9XaZjA4UCpG8i309uOM0ocUCLC1gJ31RzqzSh7De81lD3tfpC92V6W0OWPbuHsqn/gMkGKEADfjQCDQ1MYAikca2hZbFc5pbVCzb8vB95kDr7cavbdIfI1Gb7xRoTVMwDuKHbtE7bj6SaZqVuFbdL27T9qNT9yBLkAJfWdVy700Qx06rdzWzlfbm7EZe4Wu96WLOhOJ9+xPkVXpYdZ+dBjnJAtiBG0prBnHwXk6+L3PLPAT0X1/Eb3arbSwffWdgBpPrxjfrx0gGZA3ZJV1L8fZrrAk8xJCo2CO2ZixRoEyvJBLhi1rEYWk+GQEVlM8HseR1XQ+yb9po9oYNuSUhgByw5kOd7rUXIwJD6XPsIkaA0GKItbxm0g3c5eOCzniQQlKUwZf9fvDcdIiIqhoTElk8ZdIbPORRQsgVfK0DXiIZqoSOt5XsGPeBHDhPM7MTXBdArYqN2OMhu+ZNBX/ibwwMv+/DV0UxgnPUqQOOEIohYFhoABYCRrTcD3dAEblOZSX0myohFy5YFhja87TLxrIwInBvMJuxrci9wXhMDa2+Zt6/KPddJcXOwh93e3mhi+7suFbsqAXNlHk8GrpuUlKXDyXnzxMSG4KglwcHJX1NpDXY/++npl6OSbbpdx9Twl0YtlVflZ2Iof8P3TeMj8t4YVVHP+GzM1oEJF71dano2q9fJYenSwaMG9e/tNXNe+uZqplNblXM9YldoZWfH5iVXzWsss3Cq2VqPvWtz3W6O96scvXR4x/tBTsX+b35Db6vDktwqrvBu41nym3DV7wH3V32NBXiVEjfTem3txl/dD3BCLfD+XpLGtwHp/8+PEVwP6qMX0JL1lfpEYSKxbOl1zznSnEYMZyDZw0Ij+DmrUXiwX6NJN3HfGNbYGMon5GC+D5rqpp0+emqnmwYqaKyT/gbopo/eTDnSZclSQkWddNBJL+1h15QrleWzZQZOGKk8vTtQBf1hqF0GffKmrA1imUE+W34jZCbPy5WmvW4GXiJi8ocV81B9mO9i0MST/Ze5uKKPvoYZdtNFVwP3N1z0RVNNTVXRhMZ1ZPWVqbKfxA4gAvzAJU0KAAAA); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAARQABEAAAAADJAAAAP2AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKghyCDAsGAAE2AiQDCAQgBYJeByAMFBtNC8iO0UvPCUWZcpJwSsfD136v5+7uD5ACBB8XFy6xkIDjW1thm7rqql8boQqoCHVt3s/nZS8DKMXPFFRmSv5168xa0+P+hZV1VjycCp72Cp8q//8vbTB3fppg6WL5OfPORDxCvVJpVjtQBUkIV8NbOmDFEC/6jvqO6lUarPy7KNAGFOUkjJEWg78JtemtagKFAlUFA7fn/CIOkJIkxPXEUJcaiokUDXK44BFWts+VtkLh0Tc8Il41dx1EPwkHrkmox5+GQaqlY4ySIiGjk1igk8QoUBTB0be5CihtdK1eqelEV1kHWNwSQLPf9oCiHp0XqLmHArBDz0EjX10UJwC1iJCHY3lqSZwAokUBqHkmTgDxIvLy4jBvQ1sIRgSR8i6CvKivvYuXhCW+1nd1E5yAeGg8xyEems4xfCGmnY1ujLPjBJBswSRZgmEJ+RYzn4985EycANLFSsSLw+va6tt4P0vzhSymGQZ5+Hd1bfw7lmYwjhNAdklfUt3OOa4LeU42T5KKDWKNzEcqmJBKNoSBC4TQJARbZwUKqKawIMDsaXGYR6D8++0t/wRDo2wIIx6DaQazcQIoFysb2zwszTAYqFTnBVB8rkbBqaFhavm1AllH10swwCgadCZVIQfu/H8L3ps3EyycFTZmld8ukB10pwQXaNGl1ADABxKCuGAgFiw/I5Dd9BAJoQgTQ5UaDvgIQiQXhWgWJX+MQI6lx0mIR4IYr9RE4JrUBJDt1yW9qKqSQQIlwFXcAbTBFZceY7ixnRxzD9kuUf09p+3X1XtPPzkL/sMjlo7W4WH7caplSEU6j4C/72wraRkKPzIQy6tI9J/9OBxy+rT9+HX17q6j4B89ASdPPx+0HrnRTLLHh+3H2/59eAOHT3ct8o2M6KsWD6TTOav/HfJCa+uxj7i3+XXL1qKz4hLxQlFS8xGP+G5rRWK6UaY82PH1m9uTu91nOVhQf/yXKQglF5T/j6g9nvjK/togMmxNN8ZPZSoO3Kmb9BQGOo6/dCks8rXS+gMvNZrnz9prpE/mMpqgEHCreiI2imYF8mDUi4HY+sX63P8Kdf4NHy7/CAXgW0zYobnv1VyZzqsBNEkg+Nlky/8B/fG3U8ENoK78wFrWTemfGcwitS6D7m2NLhCL0ox5Y4U1dPpiTTrUrdkysl2GrTX3mWIN5ufAOZx2Ky3TjtOoRItua6zFWWkFJEW8JElysLp16rZcB2wjqWJZOVliUM7hnd5ep8QaFGvPsLKMJG2QSgzKydIbMZTcLFWcDpx1l0ggflw2jzXAcq/1Ew+uWebjxpVW2ezM6dVn3fbNi15EqrQp1UrM9VZdl6hRF7kQIAgWqPKwAAAA); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAARsABEAAAAADIwAAAQTAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKghiCBQsGAAE2AiQDCAQgBYJeByAMFBtGC8iuA2xwfQMNpVXW2LKcYgxDZLO05aK8Fyc+hxsPfGusPzuYWqWJaSNCpZHJRCohWiZ0a3KX7nVN6/9b93VTqdaYr85fDVpCBv6oBrDsjLWDM86IS2qvtTBxzf9eZnKf73zDDXBtlaIDjhJNng6vUVCiSzjCCEuf2ZUP/iRgK+9/OP/CFQeacLHk/n/35se9f7YJlm4LuLPnv22iKzKzvVBNYrUDVZCEMNo7WMUoRzxfPYPuJgXr71cigAIAASQYhoE8s8zCpmbyyuDLBFIABq6P8XEYQyFhgHCZ2J55AmFBErzBgwtEBWuW9jIrkfQioXNiMwXRA2w6M8GDn++AJNP4h5YtU2RjBBU4lgQyEciwlMGLJIU7k6/eyzTJ+5HPAAYWNShre2cYNuxr9vcMZBovg4KfnvhrgANE6XaaYjWoAQ1ogH2WvwY8QBmKM6OkyiFIksxeIymDPCvXKJNYtr7KKUUgKZT2bFIo71kqScx0NjiFiPHXQLZgZl0K2KHqxaxakvf8a30GOpBLikdRVXGVGszMVElpYqZlUbq6tVZXt6bElhD+GtglZdLvs6ddF3gD6yNlwgaFUiZJT0hZqTssuOKmK5YOYe2rmVBTtjRmL+ZM16zX2se63ZqJRCz4WWKmJdL8NYgDuaVV6WkVQSUskD43PggmAkcGhZEjT1XINDpdAwNMlWFhGZI4hBr8W3hvnk3gcFzwGDfyfIUsoAs1iCBWRXqVAF5KkHFyKJg88kqFrKKrNWigVTV61QFeTzBwRpiYMfJmhWyhWzXYYFdtenWAYOe9AJEvwzQsBQbQYiADuP0UXAAK4C2xZ/aMFplwrGLHy76t50fSqTrEsLM68dW7PbrXzpF7LzxZfnTedf/tmN425CkQgyM72FTTsw+P3lfXFbvu5ZEG7zjbytd1NWa85HJGQOXu8hfk5wNXDP3Xg/d+LThFv9Ne7SxprqtLTv9BIzVNTPGWfyg9rw9MOtgftnfaKPHWjuGGLTsn3sWjOJ2zA8Z1Jqc8rLavjrHu3XM/lz6S6e0Pjo7YNLT+GV3rxJTO8iluL3j231n7+ry6++y0CN73jiNsb8GVAK7SonITDMSGeaU724aXj418JZD5R/g4vDqAn+bOLf9n9I8tkMMABPjT1DN+G+vfXoGbQpPitTabTJIvujELlTGZdq/LtgjHMvwAfd4WbmaSB27DGNrNBZCbzWG3l04TCt7m+2CPbaUGtVaylUpVwalZC1uDeiRUgGDBYqVxWs2pzio4TsIsZN0QQYGApYzp461SNcPCygwNXRK8QSUo6IaIaBQoOVgYf6vYWi9RIr67GF4ogV23tok7Ni+T3N6gUZe/zc2jdfPRix5K8lTJVIlzE6UJMvLM0C8hAwekJtAPAA==); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAR4ABEAAAAADLwAAAQfAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgkiCMQsGAAE2AiQDCAQgBYJeByAMFBtyC8iOwradM1YI0gkehDEKJx6exv137swH0aT6E7SKUIhwKHCoW+rb+ENbqMMVnp/y8t802d3Sq0llTz9bp2Z6nU+fxHxP69MHfDjR/v9f5uDe+dsESxfbv2feNtEVKb2md5AKkhBGw61oQhWjHPEMewbdTQrW369EoAkQSEIINBiigdY388rAUBWUAgNX5/w4NoKCJCHOJboKhEXduhQ1crjgEXYdOJpZCUn7wXQVd650gegeNq7m0cM3TwBSdfqPsS3D5GBGF04k9rwxoEoRk/3g/wVX1+6u3qnW5f3ICsDMHgPTI0fPIPSAMPT/OoO04Wkwlc+c9meAZjBOF9NktHqWgcEMAzQl+DPgZnCGzLlnlFS5Ekwxza6nOAM319TLvHsSbH1RAyWBWIbSoyKWoeyoICcRtbOvgZAYfwb8FowvUAKruGUxawmS9/zrz0Axk4tlzqOoqrhKltLUclIaUQsCTpeXiqrkpTS1QIg/A+Ulg0l3XHS8LlRF5RTJGG6QLGVB0iGUVgquAtxGqZq6EutchoCqksoMZm/k3NMZkoraR5KroEa3cRVcBaIWSJo/A6OZ3NKq9DQRoEGYNP5c32CoMuRMYMpM3G8mkM3pFhIsYSVaaqwVSRw4k/4WvDdvQ7Dl7GDP7NzvIJAd6U4SnKEWneWqAbyWoOP0wEzvfkEgu9BdJbjBXXSTqwfgPQlenDd8mLf7fQWyH91fQgACxQC5BgHH4CGAbD8t6YNKkUECVQEu4TqgCV6zasDHbLKdVlz3WUBTicdnI6+YrAm/8Ei7D6S4I27nG6n9djRVufjE9cnx1jcEqWwrSPPlj7y3gcSMqcf2hZJDx4y33n3odaTmyiyaMqZhV0FyulfHd+1GKJ430GN2Q73jybLCHpQWHHaQ/4jdtkcg2e48kB/aJno8ufglzntbaW9FZVVSxLPMsA9PAgOLtr+I/Zip7P1jF1C+ap93wW6L1AuGHl56h1URqna74tBMn5llJlZW5l1jOzZ+j+vlu0pgyozV/PfuYb/amQJy1sf28/NVP83VW+K1AXU1vK3XWUvjc0dLLXLqKlddAp/OWZs/KuIqbzyeDAqGJMDZcjM7G/wUyEPebwcLTVa1xn01NMkfAa/3v3MD4I2v++b/b4s3/zd3A3USCP4/hapvA9r/X88KbhgtyLehky2k9IUnZpFdkhH3qlrHcaKqHlOeF+bQ5bI5aVExZ3Po4aphc7VrrJM15vvAUaIandrUEJVKVaFBj16iTh2wUAGCBYuVpkGdBu1q4RwWxo+1QwQF7VgZ0+f6pOpByZoMnW0seINsUNAOEdFI4uRiYfzVEvVdIo356WJ4sgS2m/RPPLFnWZDrO3UZthc1adZ3+OhFL8XyVMlUieP6K+cEGVTAazqADrYwLsE0AA==); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAQQABEAAAAADFgAAAO4AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgWSBWgsGAAE2AiQDCAQgBYJeByAMFBsbC1GUDUqH7Odh7IxoGdAyZ+VKI31IG+puNXjodbX387MnouFEl1MRRHRhqES1VKlMtIKOISiD241DCQiDhm2jwug4h/F0czljYSdX3cOj22euhLmER84fKB1c8IKrNX2Z/QvKuEhg43KZ35CxMYpRITpAoVCYRMnYAuuqKkBZq8nI/qhehcHM328JArABAASgIBAIwAofPkRBUUUDFqgAug4wcreUd1uJARQUQExIladIyGJIEWZI4QF2grmKLW4m5xfRR5UT9AkgJ7CyRxU73jwBxaD8BxoDoAAScCERqVxFA1UgmucW6TrL58/dvGjABX/Jg2XGhmLV0FeID6vQ7wpM/oeF7F5aBRoB/MWJ6LEKMiowAq2CjRCIDA76ZBhCLSzdh1oA581e1ODU3XmvQ9haAuGjCwg/oeRw1l06MJetQvYgaipshXm4riZXN3nNv1WosQEiQ7rUIzGZrOQ4ziKCl0tdkksui8xWYbd0p6XbJXVf4GkWQWJih/CAuUmRw8W1lEE4FYZlGMj2QRVQUU5WWTwqg70KU7e7bjKYRSmD4jLOIjurSGNjQN4BGXJY/a5zhEhQGiyibW8zaAfvcvDAZz1JIMihsGT6X3w3HSIiKoaExLZPGXSGzzkUULIFXytA14iGaqEjre17Bj3gRw4TzOzE1wXQK2KjdjjIbvuTQV/4m8MDL/vw1cQYYB77IEBigYIHoetIABQA1Hy2EnSjDTyJkuE484Tf5ramh5g81rocs1ocst7tcNtjscB9g/USz00m68ZGW+G6znOddMGOy9yXBAcrCxu3Ydo4LnlJszd/wmpx0Fo28Wj8j4sxpU9+M9e+5xrm3SWp97uPpC0etX5yQr3BR/ZEJE6cYhE2rW683VRG197ZcNbO7vTaWA/DvhvyT/f61zFWXh4pqealzR72892/TojKtRZ5lvM3pLQ8emCdXG6oaZ1i9rys9AkfYnH0Ubd9xl8La/kV8HTP7yCAD5HBq/WP+q7+kxMBC5QVPjMlpf4dkf7/uU94XjRALmUUGyjKD6GYiHic9Hl3mdNGIlRLIMLzUidwcVmnYMcpnSTK4lV1XGdgBqewmfV50GKkXuON0WukevmaDJpkspHGG0cTL0qsWOkKDOo3aKw+2NMkMLJCnJiwkK5ofm+KfJNQuDeH8QVN7A7xmLAQJ6kV1tLjEgzVZ6Qpt4hqfLc0Hq6DheGmztw6aZ2bq8abYKbpSMONMGX10E1P1FRoUayZxHOlTyBG9RRhI8EPXMAqQyQ=); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAP8ABEAAAAADCgAAAOhAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgTSBNQsGAAE2AiQDCAQgBYJeByAMFBv2ChEVm7/JfibwZHiNAF8Ur3BUq+BQX17m/XLwUO9qvU5ndgfx9SxVHURncF2XBFMJ4ha8Mf2GE5e/OzJuDriphvh1jYEGWBllHwBXlx5m/9IESxfLZX7nIx6hXqk0qx2oguQJo+FmoXDFKEc8zxIduA2s6t+vBAFUBwAEYCAQCKAqqaQi0jLyyghjAgQBwMBxKV+JrVBgYABiWqLRnCI8YIgYpHABB8FMnpNZSZ8bn0g9clowDaJ3snWYKY58/j7ACBlvAEUIMAAJxCERQBwmCjAxEXDjkyAAudzGqxdCxPFHakAkVyMWOVeF2OxqEazWXPXvICKHDolqYESp9PFpvhgW1aCIBrawoxoiojJ82TijxGnoKk952aM8laHGDR/lm40TV+tVoz23tfL5nPHK53dsv49rOQujXbdbVENuQc2k51JOTVhMJ7jEe/4f1VCRXOXLJkVOseMvS7P8PmmuZdsq3X9c5PiP0yzbdaMa+pKupLh4fNJ1gUnRLcQou0GoVHaJBdfzKsmGNk14nuU1dC1RLZAUfTKa2cOycboWy4raa8sa2hYnG9rqJa5lu2lRDRfJLXXS0yzbdqGGF9ewn6tgGQFEKggvEbSMV3iooHGqSpf1YbC37Ld4b9ZAmIwFNrWEdwjaxXs8fAg4X6oh2AgRMwmkNBE+I+gcX/AooeJKqdZgG0TLdNDTTviBoEf8xGOGhZulusJ2uwmQhDFIQgQBEgADADOb7g7kQRP4+0ajxJkbK24lXH5PLLf2ZL5fbcO7xMUve6es7N3y8g0dT1XbtQ+8c6frVbys6iXsF8svVDs1/Mt3rV3guJ3Pb9k5E+UXifPjfm7TZWfDdn7sgazCmMRQKDGv+iXxsVH9pdX/rDi2c03tHV44PGFdZkqvfaF2rx8s/EOrllLD7mYaYkVst7t1qzo1rwIABCBTmwcfMHdorR7/hqvJHwA+2G+NAL6u8fbgm6C5+Z+cDoQxFnj/IEnz3wH1m+8icD3cRJ7glpuG8TNNBSpi7TSveyyWAUiEWQVowUeFURDHS6NBTbRR0gpv2Rw2hphH3VCM+T4ZnPHDp04aPr60f8XoGTPHT52itNdKW211lzZ65OjJI6iudBCR8+20CfLdZUyvz+o/g0PDM5iaV9puEGsT5Nvp1AipZL8OokaMn3WJiFK266aESig/dvbEjTOWuRTt1GnzrcePHTdr+dxFDyp5TmaldJ0F09qo6DYNYjCBT4OWAAAA); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAQAABEAAAAADDQAAAOoAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgUCBRQsGAAE2AiQDCAQgBYJeByAMFBsGC8gepyt6cCTJgI18vrb0D0NcN+91iKiSjdoS803FnNTsZHajTm+qwuDNvd49gIEthEji4fP2ViVWIOuLlVV34SzQIQaejCXOvl/Tk7cJywgHbFx+5l7I2BhDRC4F9ihUlawiXd16QFmrycjeML2Ewfz7loAArAEAQAAcgiAAS168kE1fXA1zPACaBsDI3bS/SJaAAQ4HIDXVNtzJfI1LpqDJA9yIXcUlrw6Z71H6qHSYNgygFUtaebLuwQ2AG7n/AMYEwAEowBlFUg2PgefJePdRTWOVI23ztgln/CUbQOiuQr4MOwlZJKlEm63imQ9ARu/mMBUwGMs1igppDVOBQgXMQpgKHEyvUD99pcFHYjKTCzplpme9bZ0K74cDnffqkqUIpoAWI1PwFkHJlHTuvi5JSg5TQfaQ8nlZghXWt1raFyCv+S9MBRNFTKH+5YYKgzJN1CmZoqQTBJarHCw3KAdFnSBJYSrYWwbSzmSj+33BFdhM0vwOiSoWIG1Jlmt5HwFuk2Wd7CPZF6oEVJ5ZUrF4I/XLVcm08u7hNB9Bh/I+grhK0gmSGKZCiKIZ+VwRqgUpIf6ud/BynpEgSyXXKxxZpWsCdBgSXWnymQwcTftf+G7WItiMA1fquN7jyD49EBAikoRijQGbEFImQy7NXF9w5JJeCajRSGqxtoDtCD0zYJQOrp848kxfBKzYJKtYd2B/vCIAyhzHHfk1FABwAIAHEEAOoAbawIPIOvGxpXzddRVZ7bb6hk3tdNfp+yzlfZ5rr5Ppom/l0r/arvffsMqv7Me33Xdz9VXnadc8gmtqrh3DtD2W1XiU/k1rYoZZJ1remZHDu0+wt+33z6Y8qW0MNBPLcl5Xr7b8FO6t6+KGEyYOpjuGUD7br9ff1LL60Bn+Ei8EWOxIt8g0WYaf/HYY8OAUyUl3i3+OViNMnM+hU5DTmNI7LXap38yt6EsAuLnpvS8APAnxW6Y91YL4v3Q4AHMcACBgktTBfyOq/29De8S8CF6BPqBMx3VvEJDBHD5axgFaM/XokcECQLDbpYlwdtzEsaWaqHDycX7cZGIcx4Sp9XmAgVGboQZpY1QlR60uI4xkNNQQTIxwUaKkEHXp0GWwdrhgYoWyVrTI0A9T+vmLUXKMgIm2HENbTNQOmciwFS2+lWDp5WKFaWc06hYpxs+XzBOVsNVj9MwzR6wLcN1Qw4y3NerRa9TxHTe9lSlmkKcO5fnShiFSX0W/hEhhQyyCEA==); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAQ8ABEAAAAADIgAAAPhAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKghSCAgsGAAE2AiQDCAQgBYJeByAMFBtDC8iOw7jhK61Mllg8cBRB/V639y6lq9CK/nlUoXFdli4cg0JabNRXEo/Q6Bz/XjZZo+BLQS5KpfLWuu2dc7ByzslfoP/g/fs5jczLLxkJbFx/L+9S42sMIY/QojCrkrPTBHaK5ayen5DLqF6lwcq/X4nABBAoQgiM7LKBXejS8oCnAysTDFydeR2bB2yKgvhMlC0EBW9FCQ5kuABWYcvVvb4Q4pbv6Ryzw9QBonvAvEoWtvbZPYDSZfzH4ZYusjMxxxSJEssh6LDRXr43mXDmemv1ctfc+5EtQL2kQXRXtA/D5hA0ZppCg2bvKIjkW7k3DVhFSGvQUFilNw2MSgPW4N40MCvSUUxnXU6RI4FIRCbXkkiHGqtqKZZz4mh9UR1J+CIKcu8NiIK8e5yKI6ydHXUEEeFNA2sLwoqTBMygpsWkyUFu88+bBnZNRRTTJasou4gyaqyxX0O34DjSUmeyioLDGmucILxp4FzSkVRGDRbXBW6C05Awb4NALnOQMkGSlbgjDjeQpDXpSFhLaQyoNC5Fw+zVTGctjRmz2ptGR9waxR1xcRvCGic03jTwa2pukVZjjeMEUIBgOQ28z5XyKCGIiFB4MYOW4KU8ZCDnZHIFG0eBJeP/gvemlQgVpQYzohbenEFb4C15WIE1ZyVWG0DbIuwoe0DEXnicQTvgHXk4gTPnJFYXQLsi3Ch38CDuwnsyaC+8Nw8f8OV8xOoHzP3fEUAaKDZhK5MEBXSQ+AC+QBO8QlYbyxLSbInV/oK72Lj5VuFM58VgVC06KCAXgdH2jnox89+TiYtAB5pNt/OqpuUd7jIZu7SuXp1/OXJMLC4TCKbH82Z1OzfwL4XKQ/l33BcnDy3v+oNu70K2+dtOzua1c/KC7V7/mDBhWoNIcSVpk751rlwRJp7yOcfPbxrLw7lHxWBbWOLL+OO8F1Nlu7d5cY16n87javWMcdatXlk0zjYbS/OfMGnK9oOfQhb+EqeLa6JErjcE3cI8fqH8wp3HYgYmu2qWhv2P3jZ33Y2Pb3yqkEZ94wmZ7wH43fjVCYA/T+cFptcm987f7AQwUBa4/zPxzv+A4v/n84LrQiP5AylsVMoncMUkIufS7V7V94gpOnyg8bDQhblLumKm1aVj5NHOsK7rmyLQM98H7hlUadeiikGuRAXqdOlm0K4NEsiHP3+RNOrUqNOqGg6QIF6sFMAvsMOQbvqgR6IuGKjKoL2E+G8Q8QtKAUIaAZRcLIi3agY9lwghfrYIHsiBpQa9E0/tWubgqnYdBk0NGjTqObr9opciaYroFWJyba06+Km34LaQYAcqECRhAQAAAA==); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAAPcABEAAAAADBAAAAODAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgRyBIQsGAAE2AiQDCAQgBYJeByAMFBviCsieg3HzcaR6hDg+8REeiGxd22NrRzw8LW3vz0yuNFWbS/a67VVeR9g9h0RYhAYbHyXRIDR6/U9d+bTeIwigbyZfB4heB8k6Ym8AqFOY2lwqXSqFsGQowx3B4M293j2AgZXFidf/5P6F/+/Uw/xcp9jYYr2+/C7RCu1JYwONCTSBSlgNdy3gYJUr3ohih7FLHMZXIjACCCQhBIbMi8HO7AkzEKxA0wAj+3O+y3aBIkmIOtX1cEZwX4pA5PAAHkGiu+fRs1Hd/dH9kev/NeQau1q9cfLNE0gtzz8sC0BCxjhDQHuvZVC46HV/NFhl2uDmtZZx/yN7QHWrIT45/YztEJr9n8a1cJYof2vO0GBF5HMtxVozNFRpsM0zNFyRrYwEe5oTJ0guy+tOSTb1tnUqbwIOdD7VJUUWKfezS8rzzNWRMN25LiFKMzSyB/Xm5QuskH819QfIKX8zNKoaTyonTnGmOmqjZeInLWFyTj51ZYqjrlgmFyJDo28ZSOvr3OH3BaZAt0ma3SExnQVITUhZy8dxOCalKdeE3aoDVFld0hYPGgk+zTZO6e5sjOMmOiWOx3FhcmFlaFw1frrjs4SWiwT/u77BKllGAJEK7pcIWsYrAlTQeFWtc9UMZz9+y3ezBsJkLLCp5X6HoF28J8CHgPflGgI2QsRMAilN3J8RdI4vBJRQ8aVca8A2iJbpoKed+weCHvGTgBkWfpbrChy3NiA79yXTWAMZJFDyxC6DI6AsJ6TlQQvk6SNs01HzydLJeDtYyveezH4S1ncY/4xDMx4O3/d7xjb7AGNHkw6OPnpkf9//OfhG93bYFn/IkFU25MxRfczlwf4MPqpu8NGw8fc9FZcaOmlD2FfYU+0Cz9+T8fZvLXCw/1HtS7bEGDzn8UQdCQQI5PmU/8leWUvU3tfgYeMdwJ9fX+IB/nUS9jRJKX/yF2BAAkGu/9dQ/jf9U/kjeOE5d+Sf+DCk9BFJAOB2aAp5+/q9MkQJAW3PS3MYd8ucjOmZsw1ysYybW74bmOgz0sEzV5sF5mrjmq7OLF0WW8K1wHwkT6YcOcpYunToMk87FCP50pFc2WG1jD1/dqk6i3Vpw7CgSnJ2yGTjaq7CVoLS3fJlaOdaeosU8c1KeWIarPZYNnPt4nUBrl9goVX2rh69li723VSUTOAYbTaD56+pZWv10HYkxGACXwQdAA==); } @font-face { font-family: Xiaolai; src: url(data:font/woff2;base64,d09GMgABAAAAAARgABEAAAAADLAAAAQFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbHhweBmAANAgKCY4uERAKgjyCJAsGAAE2AiQDCAQgBYJeByAMFBtlC8geg+NuKcNiiSWmINp9/h4P/7/2+33unYdYMm1mkUxzD3EioVDJ8E0aq0+JP9K/aP2V+fk68/1MyFX0Z0EGS2Tqhdik9dS6wVNPzZN0uNEFQe7//2UO7p2/hResdLH9e+ZtE12R+Vsr1qKlpWoFCmE0VJrleDpHOeIZYcwwdonD+JUIdAACSQiBNsMM0KqtsBKECqhrGHk45y+xGngkCVGmlgpiQziXokkOD0LC1vqxvQYyHxF9VaL8X4JcwuprLnr79ilIjfSMcTwkZHQjBDJzjaPQxfAx/testL95s6Eb/8gKYHaNBem24yhCdxSL/t+yYBk5A1L5alYYC2gWY2urhUFzwljgzLKApskwFohZbGMIP1u5w4fCNKbzGmhswy21DQzXD4vOFzXSVARmoOK4FTNQeUwymZTe3dNIUclhLHD3YNwVmsI23LaatQnymX/DWODNFmCG8C91lDkYp0XPZFooPUliK3O51MFctuhJigpjgX9LkbYmWz3uC0GVP00Kwh2yFUyQJkXTtYoPCddoWk/7UPZSFgE1ZNZZWLxI+FlZ5Czt7jt9SD16jg/pQ1J6krKEsSCaLahwWC1CpQJmxb8bGYQGISeBlEmCL5PIcrpCgRIqWWlS6zI58Of8W/DdvIag5XRwY7rgu0tkD7qnAi/oZS+tGgBvJJg4MzAzB5+UyN50HwW+8JN9teoP+ABCIBeEYBYU/BCJHEoPUxCOCDlcq5HAN+oTAWQtkn6ormWQQIGMErgFbfiuPBtgrKGR62nBuadPkWujuPJRG73bbSNyuW+7JTn99NZpyTJw7jOPSs+zvqzv/V633VuRSz8tI6ag1bpA3U1Pa56Kmx/rNoCzez08mlw/faOb/wuvTlVs7aiy3vgMzgr/a8J6zuHN2vXNP6nMhUXvnuobI6bJUUvXvTyX686ZU3C7XTARk1KNijiaekGUyc0tMyCjlvK3n/qyvBpVlvoWSDWhwmI3N0ltUvIufnJyncBL5B9qEQ4RC7n5XtM4XXlS9ejtFfGS3q/KXQ/DRFsDQrSdeuNfdIhB73uNvhExAo2hPVY9/ywABPJwkJ0zcu1KkfpVKMm/4OnjO18Avs74rf2/Dir+5F4ALRIIcvm/BMX/+vO/4o/gJZyH8mtwQEjprwmrjmEZJOihZqcIUbRi2ovSGbrddCZdKmc2jz5ZjDsbbqizTeY7wLFWtbp1qNWqQo5qjfr0a9WtCxYjXJQoKSwa1YeNTnVohsUKZY1okUiFedv82YAcfTBbm6O7gUXtUIwMG9HiW1mcXi1WmDqtBm6Rx/xiyTxbDhvNBmee27dOcGu3HqPerZq1GDi576bXYoUc7GoQvGh1KVK3EjgjYYIW4hrMAAAAAA==); } @font-face { font-family: Excalifont; src: url(data:font/woff2;base64,d09GMgABAAAAAAHwAA0AAAAABBAAAAGhAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGx4cNAZgADQRCAoALAsGAAE2AiQDCAQgBYMYByAbUwPIrgpscEcPjAqbbfFGeKx5Kz5EU3R4bDzUL93bvX8JXUVSmorE9SJxvRjNeBQOYXEOHSway/n/P+buVKO/qf2JJVWsT8RCwUokBQ4hUxIh0zx2kOoSixA6//37cw+I33LHb5EcSZbiLwn1l1CELdAXC7/Ia2HUcht7no7PES0JadRRYMAoA87WTvMJYgUaIDBgDsM3u00398MKuofDeAnda/+0gQ7Y6yWfIrW+/EzgUNU4x/xDBFjZOqq08QNClf+f6uoSTsInxFsCk8RIVOjgCel8k6AoApMN3NH0cADRkCBBwaAYFwg+3u9CxZ9YxvsDevfuFsDP16+mlcs86JMgeJ5qrXFd4uBUWQ2UIgTSN4QgEQJrAGg7xhNFAl79NkLHN9KIL1S6XlHMGqC2wm7dMgu23Qz1rcxNbG2cBDwYmzpb6Tt4MXZwNLe1QSKCwvXjrIqVu52ZIxIVxBC3KIZJ8px7SJ61Fz2qaMtGEnnLBb26c3cwNzVzQtyGPAgTxsSQgTtKV44c9F0FkZyVFcrjcfBYND7qYmwkiAc0qxEAAA==); }</style><rect x="0" y="0" width="632.0353021317197" height="468.12524655748945" fill="#ffffff"></rect>버그 심각도코드 단순성<mask></mask><mask></mask>
복잡도를 올리는 방향으로는 점진적으로 빈도와 심각도를 낮출 수 있지만 수렴하는 위치가 최적이 아닌 문제가 있고, 복잡도를 낮추는 방향으로 가면 점진적인 접근을 시도하기 어려워서 문제를 해결하기까지의 비용이 쉽게 예상되지 않는 문제가 있다.
회사에서 복잡도를 높이는 방향으로 문제 해결을 요구받는 일이 많은데 최적해로 가길 원하는 엔지니어로서의 자아와 늘 충돌하게 된다.
개인시간을 희생해서 문제를 푸는 데에도 한계가 있고 (풀어서 갖고와도 도입하는데 많은 설득비용을 써야함).. 그냥 회사에서는 자아실현을 포기해야 하는지 싶음.
한국 연합우주 개발자 모임(FediDev KR)은 이름 그대로 한국에서 연합우주(fediverse)와 관계된 개발(프로그래밍 뿐만 아니라 문서화, 번역 등을 포함)을 하는 사람들의 모임입니다. 실제로 Hackers' Pub의 개발 논의도 이 모임에서 처음 나왔었고요. Hackers' Pub을 통해서 ActivityPub이나 연합우주에 관심이 생기셨다면 한 번 참여해 보셔도 좋을 것 같습니다.
참고로 올해에는 아직 개최한 적 없지만 비정기적으로 스프린트 모임도 하고 있습니다. @sprints.fedidev.kr한국 페디버스 개발자 모임 계정을 팔로하시면 스프린트 모임이 열리기 전에 미리 공지를 올릴테니 미리 확인하실 수 있을 거예요.
버그의 입장에서 보면, 개발자가 하는 일이란 하나의 커다란 버그를 여러개의 작은 버그들로 끝없이 바꾸는 작업이다. 언제까지? 사용자 눈에 띄지 않을 때까지.
Jaeyeol Lee shared the below article:
Browser-Native Translation and Language Detection APIs Coming Soon

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
Just reviewed the W3C draft for the Translator and Language Detector APIs. This is genuinely exciting development for web developers.
The proposal would add native browser support for:
- Text translation between languages
- Language detection of arbitrary text
- Both with streaming capabilities
No more relying on third-party translation services or embedding external APIs for basic language operations. All processing happens locally in the browser.
The API design is clean and straightforward:
// Translation example
const translator = await Translator.create({
sourceLanguage: "en",
targetLanguage: "fr"
});
const translatedText = await translator.translate("Hello world");
// Language detection example
const detector = await LanguageDetector.create();
const results = await detector.detect("Hello world");
// Returns array of detected languages with confidence scores
This will be a game-changer for multilingual sites and applications. The browser handles downloading appropriate language models and manages usage quotas.
The spec is still in draft form but shows promising progress toward standardizing these capabilities across browsers. Looking forward to seeing this implemented.
The role of developer skills in agentic coding
Link: https://martinfowler.com/articles/exploring-gen-ai.html#memo-13
Discussion: https://news.ycombinator.com/item?id=43480964
옛날에 만들어놓고 저 혼자는 잘쓰고 있는 React 폼 라이브러리 react-form-mozard를 소개합니다.
폼 중에서 Stepper 또는 Wizard라고 하는, 여러 개의 폼을 순차적으로 합친 형태를 다룰때 씁니다. 그래서 하나의 폼에 대해서는 react-hook-form 등 을 쓰고, 그걸 여러개 조합할땐 react-form-mozard를 활용하면 됩니다.
순차적으로 합친 에서 느낌이 오지요? 모나드가... 그대를 부릅니다...
폼 말고 CLI를 만들때를 잠깐 생각해보죠.
const name = prompt("이름이?")
const age = prompt(`{name} 님, 나이가?`)
if (Number(age) < 20) {
console.info("미성년자는 이용할 수 없습니다")
return
}
const gender = prompt(`{name} 님, 성별이?`)
뭐 이런 흐름을 생각해볼 수 있는데요. 보시면 먼저 받은 입력값에 따라 이후의 메시지나, 제어 흐름이 달라질 수 있습니다. 즉, 모나딕하죠. 근데 이런 평범한 로직을 Stepper/Wizard 에서 짜게되면 코드게 쉽게 더러워 지는걸 알수 있습니다.
react-form-mozard의 step
은 위 예제의 prompt
와 같은 역할을 합니다. 그리고 그걸 Generator 위에 얹으면 모나딕한 폼 합성이 가능해집니다.
단점이라면... 지금은 React랑 강결합 되어 있어, XState 등 다른 상태관리 라이브러리를 같이 쓴다면 연동이 깔끔하지 않을수 있습니다. 근데 평소에 쉽게 겪을 문제는 아니라고 보고, 또 추후에 설계를 수정해서 개선이 가능한 부분입니다.
The role of developer skills in agentic coding
Link: https://martinfowler.com/articles/exploring-gen-ai.html#memo-13
Discussion: https://news.ycombinator.com/item?id=43480964
#neovim 0.11 is out!
- List of notable changes since 0.10: neovim.io/doc/user/new...
- Summary blog post: gpanders.com/blog/whats-n...
- Release binaries: github.com/neovim/neovi...
Thank you all for the support! More things to come in 0.12!
News-0.11 - Neovim docsNeovim
소프트웨어 개발자들이 자주 틀리는 외래어 표기법.
영어 | 틀린 표기 | 올바른 표기 |
---|---|---|
app | 어플 | 앱 |
application | 어플리케이션 | 애플리케이션 |
directory | 디렉토리 | 디렉터리 |
front-end | 프론트엔드 | 프런트엔드 |
message | 메세지 | 메시지 |
method | 메소드 | 메서드 |
release | 릴리즈 | 릴리스 |
repository | 레포지토리 | 리포지터리 |
또 있을까요?
DEI 중에 접근성은 I에 가깝겠지만, 개발자 중에 관심 있는 사람은 적은 듯.
공동 작업을 위한 저장소 계정을 따로 만들고, 개인 계정을 협업자로 등록해서 작업을 하고는 있는데...
- 수집할 정보도 많고,
- 개개인의 관심사도 다르고,
- 각자 사용 가능한 시간도 다를테고,
- 함께 해줬으면 하는 전문가들이 있지만 말 꺼내기도 쉽지 않다.
저변을 넓히고 싶고, 토론의 장도 만들었으면 좋겠고, 하고 싶은 것도 많고. 그러나 나 역시 현생의 문제가 여전하다.
We are thrilled to welcome Echo (@chaosexanimaecho ✨) to the Mastodon core team as our first front-end developer!
Look out for future enhancements to the web user interface and user experience as we expand the range of expertise on the team. 🥳
블루스카이를 연합우주보다 먼저 썼고, 해커뉴스에서 관련 주장에 대해서 꽤 싸우기도 한 입장에서 민희님의 글 〈Bluesky는 X의 훌륭한 대안일 수 있지만, 연합우주의 대안은 아닙니다〉에 대한 반대 의견을 제시하고자 한다. 이 의견이 연합우주에 대한 전면적인 비판이 아니라는 것을 의견을 제시하기에 앞서 확실히 해 둔다(그랬다면 Hackers' Pub에 들어 올 일이 없었겠지).
탈중앙화는 매력적인 개념임이 틀림 없다. 인터넷의 많은 중요한 요소들이 어느 정도 탈중앙화되어 있으므로 탈중앙화가 인터넷의 장점들에 큰 몫을 했다는 생각을 쉬이 할 수 있고, 어느 정도는 그게 사실이기도 하니까. 하지만 엄밀히 말하자면 탈중앙화는 기술적인 특징이지 그 자체로 장점이 아니며, 탈중앙화가 장점으로 작용하려면 연결고리가 필요하다. 이를테면 비트코인을 위시한 암호화폐는 본디 비잔틴 실패까지 대비할 수 있는 강력한 탈중앙화를 장점으로 내세웠으나, 결국 화폐로서 제대로 사용되기 시작하자 현실 경제와의 커플링 때문에 그 "장점"이 크게 희석되고 말았다. 현 시점에서 암호화폐는 무에서 유의 신뢰를 창조하여 신용화폐의 요건을 충족하는 데까지는 성공했고 그것만으로도 역사적인 일이기는 하지만, 그게 탈중앙화랑 무슨 상관이 있느냐 하면 글쎄올시다.
블루스카이가 연합우주보다 덜 탈중앙화되어 있음은 분명하다. 민희님의 글에서 지적되었듯, 블루스카이가 이런 선택을 한 가장 큰 이유는 온전한 소셜 네트워크 기능을 위해 전역 뷰가 필수적으로 필요하다고 보았기 때문이다. 반대로 말하면 연합우주는 더 탈중앙화를 하기 위하여 전역 뷰를 포기했는데, 이 때문에 연합우주에서의 "소셜 네트워크"는 트위터/X와는 구조가 크게 다르다. 노드 규모가 문턱값에 다다르지 못하면 다른 노드에 있는 사용자를 찾아서 팔로해야만 온전한 소셜 네트워크 구성이 가능한데, 연합우주 안에서는 이런 외부 사용자를 찾는 구체적인 방법을 제공하지 않는다. 물론 인터넷과 똑같이 검색 엔진이 존재할 수야 있겠지만, 크롤링으로 인한 부하와 프라이버시에 대한 의견 차이 때문에 현실적으로 작동하는 연합우주 내 검색 엔진은 없다고 알고 있다. 따라서 연합우주에서 소셜 네트워크의 구성은 연합우주 바깥의, 보통은 중앙화되어 있는, 다른 소셜 네트워크(이를테면 현실 인간 관계)를 빌어야만 하는데, 이러면 탈중앙화가 큰 가치가 있을까?
한편으로는 전역 뷰가 소셜 네트워크의 단점이라고 주장할 수 있는 여지도 있다. 트위터/X를 오래 써 본 사람이라면 다 알겠지만 한 무리의 사람들이 다른 의견을 가진 무리와 충돌하는 주된 통로는 검색이나 해시태그를 통한 노출, 즉 전역 뷰이기 때문이다. 그러나 현실의 규모 있는 연합우주 노드들을 살펴 보면 각 노드가 곧 한 무리에 대응하는 식으로 충돌을 미리 회피하는 형태로 구성되지, 딱히 이런 충돌을 막기 위한 접근을 가지고 있는 것은 아니다. 노드 운영자를 위해 차단하는 걸 추천하는 서버 목록 같은 게 돌아다니는 건 연합우주 바깥의 일이지 않는가. 결국 전역 뷰의 역할을 대체하는 소셜 네트워크 바깥의 또 다른 소셜 네트워크가 존재할 것이기에, 우리가 소셜 네트워크를 어떤 이유로든 유용하다고 여긴다면 전역 뷰가 없는 게 장점이 될 수는 없다.
모든 이들이 이런 사고 과정을 가지고 블루스카이나 연합우주를 선택했다고 생각하진 않지만, 적어도 현 시점에서 사용자들은 블루스카이(이 글을 쓰는 시점에서 약 3360만명)를 연합우주(FediDB와 Fediverse.party로부터 추정할 때 최대 1530만명)보다 선호하는 것은 틀림이 없다. 게다가 블루스카이의 규모는 최근 1년 사이에 10배 불어난 것이고, 조금 장애가 있었지만 현재는 잘 동작하는 것으로 보인다. 위의 논의와 결합해 보면, 블루스카이는 정석적인 스케일링에 성공하고 있는 반면 연합우주는 스케일링 문제를 회피하기 위해 온전한 소셜 네트워크의 구성을 포기했다고 볼 수도 있는 대목이다. 블루스카이가 못미더운 부분은 분명히 존재하지만, 연합우주가 더 좋은 소셜 네트워크 경험을 제공한다고 가정하고 블루스카이의 단점을 제시할 수는 없다. 마치 암호화폐를 논할 때 장점만 말할 수 없는 것과 마찬가지로 말이다.
RE: https://hackers.pub/@hongminhee/2025/bluesky-a-good-alternative-to-x-not-to-the-fediverse
한국은행은 여러 지표 및 보고서 등을 구독할 수 있도록 토픽 별 RSS 피드를 제공합니다. 하지만 <
가을별 @gaeulbyul@hackers.pub
내 Hackers' Pub 계정은 좀 더 정보있는 글을 올리는 블로그처럼 운영하면 좋을 거 같다.
그래서 이번 글은 내가 예전에 마스토돈에 공유했던 글 중 파이어폭스에 숨겨진, 그래서 비교적 잘 알려지지 않은 기능을 소개하는 글을 모아보았다. 추가로 아직 공유하지 않았던 기능도 하나 덧붙였다.
주소창에서 쓰는 계산기 및 단위변환
파이어폭스의 about:config
에는 브라우저 설정페이지에선 보이지 않는 각종 실험적인 기능이 숨겨져있기도 하다. 그 중 하나는 주소창에서 사칙연산 수식을 입력하면 드롭다운에 이를 계산한 결과값을 보여주는 계산기 기능인데, 예를 들어 "12 + 12"를 입력하면 24가 아래에 나타난다. 이는 about:config
에서 browser.urlbar.suggest.calculator
를 true
로 설정하고나면 이 기능을 사용할 수 있다.
단위변환 기능도 숨어있는데, 예를 들어 주소창에 "30 cm in inches"를 입력하면 "11.81102362 in" 가 나타난다. 이는 about:config
에서 browser.urlbar.unitConversion.enabled
값을 true
로 설정한 뒤 사용할 수 있다.
설정된 검색엔진에 따라, 저 옵션이 설정하지 않더라도 검색제안을 통해 위와 비슷한 기능을 쓸 수 있기도 한다. (구글이나 빙 등)
페이지내 미디어 모아보기 & 내려받기
보통 웹 페이지에서 이미지를 저장할 땐 마우스 우클릭 메뉴를 사용하거나, 우클릭이 막혀있을 경우 개발자도구를 사용하여 URL을 알아내어 저장한다. 파이어폭스에선 방법이 하나 더 있는데, 바로 페이지 정보를 활용하는 것이다.
이 기능은 Ctrl + I 단축키나 Alt 메뉴 -> 도구 -> 페이지 정보를 통해 들어갈 수 있는데, 여기서 "미디어" 탭에 들어가면 해당 페이지에 들어간 미디어 즉, 이미지와 배경 이미지는 물론, HTML5 오디오나 동영상까지 모두 모아서 보여준다.
게다가 여기에 나타난 파일들은 우클릭/개발자도구 방지같은 방해없이 저장하는 것도 가능하고, 심지어 여러 파일을 선택해서 한꺼번에 저장하는 기능도 있다!
다만, 여러 파일을 저장하는 기능은 이름이 겹치는 파일을 빼먹는 경우가 있어서 이 점이 아쉽다. 또한 이 기능을 가지고 유튜브나 일부 웹툰사이트에선 미디어를 저장할 수 없다. (URL 앞에 blob:
가 붙어있으면 여기서 저장할 수 없는 파일이다.)
이스터에그: 파이어폭스에도 숨겨진 게임이 있다.
크롬에선 인터넷 접속이 안 될 때 공룡이 달리는 게임이 숨어있다. MS에지(Edge)에선 서핑하는 게임이 숨어있고 비발디 브라우저에선 Vivaldia라는 게임이 있다. 파이어폭스에도 이런 숨겨진 게임이 있는데, 주소창 입력으로 진입할 수 있는 타 브라우저들과는 달리 너무 꼭꼭 숨겨서 다른 브라우저에 비해 찾기가 힘들다.
파이어폭스에서 도구모음 사용자지정(Customize toolbar)에 들어간 뒤, 가변 공간(Flexible Space)만 남기고 나머지 항목을 모조리 도구모음이나 더보기 메뉴에 넣으면 아래에 유니콘 에모지 버튼이 생긴다. 이를 누르면 Pong을 90도 돌린거 같은 게임이 나타나며 키보드의 좌우 방향키로 조작하여 플레이할 수 있다.
개발자도구 UI크기 조절
이건 사실 Chromium계 브라우저에서도 있는 기능이다. 개발자나 파워유저의 경우 종종 브라우저의 개발자도구를 사용하기도 하는데, 사람에 따라, 혹은 사용하고 있는 모니터에 따라 개발자도구의 UI나 글자 크기가 너무 작게 느껴질 수도 있다.
그럴 땐 개발자 도구에서 Ctrl + (+ 혹은 -) 단축키를 누르거나 아니면 Ctrl + 마우스 휠을 통해 UI 크기를 조절할 수도 있다.
Jaeyeol Lee shared the below article:
Bluesky는 X의 훌륭한 대안일 수 있지만, 연합우주의 대안은 아닙니다

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
최근 X(구 Twitter)를 떠나는 사람들이 늘면서 Bluesky에 대한 관심이 뜨겁습니다. Bluesky는 깔끔한 인터페이스와 과거 Twitter와 유사한 사용자 경험을 제공하며, 신뢰할 수 있는 이탈(credible exit)이라는 매력적인 개념을 내세워 X의 유력한 대안으로 떠오르고 있습니다. 하지만 Bluesky와 그 기반 프로토콜인 AT Protocol을 연합우주(fediverse)의 대안으로 보기에는 근본적인 차이가 존재합니다. 이 글에서는 Christine Lemmer-Webber 씨(@cwebber)의 날카로운 분석(〈Bluesky는 실제로 얼마나 탈중앙화 되어 있나〉 및 〈답장: 답장: Bluesky와 탈중앙화〉)을 바탕으로, Bryan Newbold 씨(@bnewbold)의 반론(〈Bluesky와 탈중앙화에 대한 답변〉)을 충분히 고려하면서 Bluesky가 어째서 X의 대안은 될 수 있어도 연합우주의 대안은 될 수 없는지 이야기를 풀어볼까 합니다.
메시지 전달 對 공유 힙: 근본적인 설계 차이
Bluesky와 연합우주의 가장 큰 차이점 중 하나는 설계입니다. 연합우주는 이메일이나 XMPP와 유사한 메시지 전달(message passing) 방식을 채택하고 있습니다. 이는 특정 수신자에게 메시지를 직접 전달하는 방식으로, 효율성이 높습니다. 예를 들어, 수많은 서버 중 단 몇 곳의 사용자만 특정 메시지에 관심을 있다면 해당 서버에만 메시지를 전달하면 됩니다. 비유하자면, 철수가 영희에게 편지를 보내려면 직접 영희의 집으로 편지를 보내고, 영희가 회신하고 싶으면 직접 철수에게 회신하는 것과 같은 방식입니다.
반면, Bluesky는 공유 힙(shared heap) 방식을 사용합니다. 이는 메시지를 특정 수신자에게 직접 보내는 대신, 모든 메시지를 중앙의 “릴레이”라는 곳에 저장하고, 관심 있는 사용자가 릴레이에서 자신에게 필요한 정보를 필터링하는 방식입니다. 이는 마치 모든 편지가 하나의 거대한 우체국(릴레이)에 쌓이고, 각자가 이 우체국에 방문하여 자신에게 관련된 편지를 직접 찾아야 하는 것과 같습니다. 이런 방식에서는 메시지가 직접 전달되지 않기 때문에, 답글이 어떤 메시지에 대한 것인지 파악하려면 모든 가능한 메시지를 알고 있어야 합니다.
이 설계는 데이터와 색인을 분리하여 유연성을 제공한다는 주장도 있지만, 필연적으로 대규모 중앙 집권화된 릴레이에 의존하게 되어 탈중앙화의 이상과는 거리가 멀어진다는 한계가 있습니다.
결국 Bluesky가 공유 힙 방식을 채택하고 중앙 집권화된 릴레이에 의존하게 되는 데에는 운영 비용이라는 현실적인 이유가 크게 작용합니다. Christine Lemmer-Webber 씨의 분석에 따르면, Bluesky에서 전체 네트워크 기록을 저장하는 릴레이를 운영하는 데에는 상당한 스토리지를 요구하며, 이는 빠르게 증가하고 있습니다. 2024년 7월에는 약 1TB의 저장 공간이 필요했지만, 불과 4개월 후인 11월에는 약 5TB로 증가했습니다. 상업용 호스팅 서비스 기준으로 이는 연간 수만 달러(약 $55,000)에 달하는 비용이 발생할 수 있습니다.
반면, 연합우주에서는 개인이나 소규모 단체가 Raspberry Pi와 같은 저렴한 장비로도 GoToSocial과 같은 소프트웨어를 실행하여 독립적인 노드를 운영할 수 있습니다. 물론 대규모 연합우주 인스턴스는 더 많은 비용이 들겠지만, Bluesky의 전체 릴레이 운영 비용과는 비교하기 어려울 정도로 저렴합니다. 이처럼 운영 비용의 현격한 차이는 Bluesky가 분산된 구조를 채택하기 어렵게 만들고, 결국 중앙 집권화된 릴레이에 의존하게 만드는 주요 원인이라고 볼 수 있습니다.
전역 뷰에 대한 집착과 중앙 집권화의 심화
Bluesky는 댓글 누락과 같은 문제를 피하기 위해 네트워크 전체의 일관된 전역 뷰를 유지하는 데 집중하는 것으로 보입니다. 이러한 목표는 사용자 경험 측면에서 긍정적일 수 있지만, 필연적으로 중앙 집권화를 야기합니다. 대표적인 예가 차단 목록의 전체 공개입니다. 네트워크 전체의 일관성을 유지하기 위해 누가 누구를 차단했는지 모든 앱뷰가 알아야 하므로, 차단 정보가 공개되는 것입니다.
이는 개인 정보 보호 측면에서 심각한 우려를 낳을 수 있습니다. 단순히 누군가의 게시물을 보고 차단된 사람을 추측하는 것과, 네트워크에 “J. K. Rowling[1]을 차단한 모든 사람”을 직접 질의할 수 있는 것 사이에는 큰 차이가 있습니다. 실제로 ActivityPub 개발 과정에서는 이런 문제를 고려하여 서버 간에 차단 활동을 전달하지 않도록 명시적으로 설계했습니다. 이는 차단한 사람이 차단당한 사람의 보복을 받을 위험을 줄이기 위함입니다.
반면 연합우주에서는 각 서버가 독립적으로 차단 정책을 시행하며, 사용자에게 더 많은 자율성을 제공합니다.
AT Protocol과 개방형 표준으로서의 ActivityPub
연합우주의 핵심 프로토콜인 ActivityPub은 W3C의 채택 권고안으로, 개방형 표준입니다. 이는 누구나 자유롭게 구현하고 사용할 수 있으며, 다양한 소프트웨어 간의 상호 운용성을 보장합니다. 현재 페디버스 커뮤니티는 FEP를 중심으로 활발하게 프로토콜을 개선하고 발전시켜 나가고 있습니다. 반면, Bluesky의 AT Protocol은 아직 특정 사기업에 의해 주도되고 있으며, 개방형 표준으로서의 지위는 아직 확립되지 않았습니다. 이는 페디버스가 가진 확장성과 지속 가능성 측면에서 중요한 차이점이라고 할 수 있습니다.
DM의 중앙화
Bluesky는 콘텐츠 주소 지정이나 이동 가능한 아이덴티티와 같은 탈중앙화 요소를 도입했지만, DM은 완전히 중앙화되어 있습니다. 사용자가 어떤 PDS를 사용하든, 어떤 릴레이를 사용하든 상관없이 모든 DM은 Bluesky 회사를 통해 전송됩니다.
이는 Bluesky가 아직 기능적으로 완전한 Twitter 대체품이 되기 위해 속도를 우선시했다는 증거입니다. Bluesky는 이 DM 시스템이 장기적인 솔루션이 아니라고 밝혔지만, 대부분의 사용자들은 이 사실을 인지하지 못하고 있으며 DM도 AT Protocol의 다른 기능처럼 작동한다고 가정합니다.
이러한 중앙화된 DM 구현은 “신뢰할 수 있는 이탈”이라는 Bluesky의 핵심 가치와도 모순됩니다. 만약 Bluesky社가 적대적인 인수나 정책 변경을 겪게 된다면, 사용자들의 개인 대화는 완전히 회사의 통제 하에 남게 됩니다.
이동 가능한 아이덴티티와 DID: Bluesky 방식의 한계
Bluesky는 이동 가능한 아이덴티티(portable identity)를 핵심적인 장점 중 하나로 내세우며, 이를 위해 DIDs, 즉 분산 식별자를 활용합니다. 이는 사용자가 자신의 계정과 데이터를 다른 플랫폼으로 쉽게 이동할 수 있도록 하는 중요한 기능입니다. 하지만 Christine Lemmer-Webber는 AT Protocol이 채택한 did:web
과 did:plc
방식이 여전히 DNS와 Bluesky社가 관리하는 중앙 집권화된 PLC 레지스트리에 의존하고 있어 완전한 사용자 통제하의 독립적인 아이덴티티를 제공하는지 의문을 제기합니다.
더 놀라운 점은 Bluesky社가 초기에 모든 계정에 대해 동일한 rotationKeys
를 사용했다는 사실입니다. 이는 클라우드 HSM 제품이 키별로 비용을 청구해서 각 사용자에게 고유한 키를 제공하는 것이 금전적으로 비용이 많이 들었기 때문이라고 합니다. 이러한 접근 방식은 DIDs 시스템을 구축하는 근본적인 목표와 모순되는 것으로 보입니다.
중요한 점은 DIDs 기술 자체가 탈중앙화된 아이덴티티를 위한 잠재력을 가지고 있음에도, Bluesky와 AT Protocol이 채택한 특정 방식이 중앙 집권화된 요소에 의존한다는 것입니다. 블록체인 기반의 DIDs와 같은 진정으로 탈중앙화된 방식도 존재하지만, AT Protocol은 비교적 구현이 쉬운 did:web
과 did:plc
를 선택했습니다. 따라서 사용자가 Bluesky 생태계를 벗어나 자신의 아이덴티티를 완전히 독립적으로 관리하고자 할 때 제약이 발생할 수 있습니다.
또한 현재 시스템에서는 Bluesky社가 사용자의 키를 대신 관리하고 있어, 사용자가 현재는 Bluesky社를 신뢰하더라도 미래에 신뢰하지 않게 된 경우에도 여전히 회사에 의존해야 합니다. Bluesky社가 사용자를 대신하여 이동을 수행하도록 신뢰해야 하며, 심지어 Bluesky社가 사용자에게 향후 신원 정보를 제어할 권한을 위임하더라도 Bluesky社는 항상 해당 사용자의 키를 통제할 것입니다.
한편, 연합우주에서는 이미 노마딕 아이덴티티(nomadic identity)라는 개념을 통해 이동 가능한 아이덴티티에 대한 논의와 연구가 활발하게 진행되어 왔습니다. 이는 단순히 계정을 이전하는 것을 넘어, 사용자의 데이터와 관계, 심지어 평판까지도 자유롭게 이동할 수 있도록 하는 더 포괄적인 개념입니다. 《We Distribute》에 실린 기사 〈오, Zot! ActivityPub에 노마딕 아이덴티티가 도입된다〉에 소개된 Zot 프로토콜과 같은 기술은 이미 연합우주 안에서 이러한 노마딕 아이덴티티를 구현하기 위한 메커니즘을 제공하고 있습니다. 또한, FEP-ef61와 같은 제안을 통해 ActivityPub 자체를 개선하여 더 나은 이동 가능한 아이덴티티 기능을 추가하려는 노력도 진행 중입니다.
그래서, 결론은?
결론적으로, Bluesky는 사용자 친화적인 인터페이스와 신뢰할 수 있는 이탈 기능을 통해 X의 훌륭한 대안이 될 수 있습니다. Bluesky는 콘텐츠 주소 지정 방식을 통해 노드가 다운되더라도 콘텐츠가 살아남을 수 있게 하는 등 연합우주가 아직 충분히 활용하지 못하는 몇 가지 강점도 가지고 있습니다.
하지만 중앙 집권화된 설계, 전역 뷰에 대한 집착으로 인한 부작용, 개방형 표준으로서의 한계, DM의 중앙화, 그리고 이동 가능한 아이덴티티 구현의 제한점 등 여러 측면에서 연합우주의 대안으로 보기는 어렵습니다. 연합우주는 메시지 전달 방식의 분산된 아키텍처, 낮은 참여 장벽, 개방형 표준 기반의 활발한 커뮤니티 개발, 그리고 사용자에게 더 많은 자율성과 통제권을 제공하는 철학을 바탕으로 구축된, 근본적으로 다른 종류의 탈중앙화 소셜 네트워크입니다.
또한, Bluesky社가 벤처 캐피털 자금을 확보함에 따라 “조직은 미래의 적이다”라는 그들의 자체 인식에도 불구하고, 투자자 수익과 플랫폼 성장이라는 상업적 압력이 진정한 탈중앙화 추구보다 우선시될 위험이 있습니다. 특히 유료 계정과 광고가 도입되면서 이러한 우려는 더욱 커질 수 있습니다.
따라서 Bluesky는 X를 대체할 수 있을지 모르지만, 연합우주가 제공하는 탈중앙화된 가치와 경험을 대체하기는 어려울 것이라고 생각합니다. 두 시스템은 근본적으로 다른 목표와 설계 철학을 가지고 있으며, 이상적으로는 서로를 보완하는 방향으로 발전해 나갈 수 있을 것입니다.
판타지 소설 시리즈 《해리 포터》의 작가. ↩︎
Theres a new interview with @hongminhee洪 民憙 (Hong Minhee) (of
@fedifyFedify: an ActivityPub server framework,
@hollo, and now #Ghost fame). It's in with Korean subtitles but quite readable with YouTube's autogenerated English subs.
https://www.youtube.com/watch?v=sqxR8zscSDo
https://hollo.social/@hongminhee/0195a85a-6a29-71fa-a60f-3e79c1295b05 #fediverse #fedidev
그동안 동료들한테 Cursor 쓰자고했는데 그들이 오소독스 Emacs 매니아들이란 문제가 있었다.
작년에 Nix로 nvidia gpu 지원까지 포함해서 구축해놓은 k3s 클러스터에다가, 오늘 아침에 1시간만에 aider로 쓸수있게 DeepSeek R1을 띄웠고 한번 써보자고 했다. 최근에 한 것 중 가장 가성비 좋은 작업인듯 하다.
아직 招待制이긴 하지만 Hackers' Pub도 velog의 代案입니다! 게다가 ActivityPub도 支援하기 때문에 Mastodon이나 Misskey 等 다른 聯合宇宙(fediverse)와도 아무 問題 없이 相互 疏通 可能하답니다.
마스토돈이 다른 계정의 팔로잉/팔로워를 잘 보여주는 것도 아니고, 그렇다고 팔로우할만한 계정을 잘 추천해주는 것도 아니라서 꽤 발품을 팔아아 했다. 그래서 '읽기는 트위터에서, 쓰기는 마스토돈에서' 해왔는데, 요즘엔 hackers.pub 덕분에 피드에 읽을거리가 많이 늘어났다.
Vim 컨퍼런스 주최를 위해 사전조사를 하고 있습니다 많관부
Hackers' Pub 쓰고 계신 분들 중에서, 자신의 Hackers' Pub 계정을 연합우주(fediverse)뿐만 아니라 Bluesky에도 노출하고 그쪽 사람들과 교류하고 싶으신 분이 있다면, 상단 검색창에 @bsky.brid.gy@bsky.brid.gy
을 검색하셔서 나오는 프로필을 팔로해 보세요. 그리고 1분 정도 뒤에 Bluesky에서 본인ID.hackers.pub.ap.brid.gy
로 검색하면 본인의 Hackers' Pub 계정이 Bluesky에서도 보이는 걸 확인하실 수 있을 겁니다.
Wow, Zen Browser is great. Much like Arc, but based on Firefox/Gecko rather than Google's Chromium, so that's a huge plus to me.