洪 民憙 (Hong Minhee)'s avatar

洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · 870 following · 1067 followers

An intersectionalist, feminist, and socialist guy living in Seoul (UTC+09:00). @tokolovesme's spouse. Who's behind @fedify, @hollo, and @botkit. Write some free software in , , , & . They/them.

서울에 사는 交叉女性主義者이자 社會主義者. 金剛兔(@tokolovesme)의 配偶者. @fedify, @hollo, @botkit 메인테이너. , , , 等으로 自由 소프트웨어 만듦.

()

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

Hello, I'm an open source software engineer in my late 30s living in , , and an avid advocate of and the .

I'm the creator of @fedify, an server framework in , @hollo, an ActivityPub-enabled microblogging software for single users, and @botkit, a simple ActivityPub bot framework.

I'm also very interested in East Asian languages (so-called ) and . Feel free to talk to me in , (), or (), or even in Literary Chinese (, )!

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

安寧(안녕)하세요, 저는 서울에 살고 있는 30() 後半(후반) 오픈 소스 소프트웨어 엔지니어이며, 自由(자유)·오픈 소스 소프트웨어와 聯合宇宙(연합우주)(fediverse)의 熱烈(열렬)支持者(지지자)입니다.

저는 TypeScript() ActivityPub 서버 프레임워크인 @fedify 프로젝트와 싱글 유저() ActivityPub 마이크로블로그인 @hollo 프로젝트와 ActivityPub 봇 프레임워크인 @botkit 프로젝트의 製作者(제작자)이기도 합니다.

저는 ()아시아 言語(언어)(이른바 )와 유니코드에도 關心(관심)이 많습니다. 聯合宇宙(연합우주)에서는 國漢文混用體(국한문 혼용체)를 쓰고 있어요! 제게 韓國語(한국어)英語(영어), 日本語(일본어)로 말을 걸어주세요. (아니면, 漢文(한문)으로도!)

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

こんにちは、私はソウルに住んでいる30代後半のオープンソースソフトウェアエンジニアで、自由・オープンソースソフトウェアとフェディバースの熱烈な支持者です。名前は洪 民憙ホン・ミンヒです。

私はTypeScript用のActivityPubサーバーフレームワークである「@fedify」と、ActivityPubをサポートする1人用マイクロブログである 「@hollo」と、ActivityPubのボットを作成する為のシンプルなフレームワークである「@botkit」の作者でもあります。

私は東アジア言語(いわゆるCJK)とUnicodeにも興味が多いです。日本語、英語、韓国語で話しかけてください。(または、漢文でも!)

Fedify: an ActivityPub server framework's avatar
Fedify: an ActivityPub server framework

@fedify@hollo.social

📣 Exciting news! Fedify CLI is now available via Homebrew!

If you're using on macOS or on Linux, you can now install our CLI toolchain with a simple command:

brew install fedify

This makes it even easier to get started with building your federated server app. Try it out and let us know what you think!

juxtapose's avatar
juxtapose

@xt@hackers.pub · Reply to KAGAMI🏳️‍🌈🏳️‍⚧️'s post

@saschanaz 그게 제일 바람직하다는 것에 저도 동의해요. 다만 현실적으로는 아무래도 DB라든지 MQ라든지 이것저것 같이 띄워야 하다 보니, 서비스 운영을 하려다 보면 그런 전체 형상 관리를 위한 추상화 계층이 있기는 있어야 하는 것 같아요. 물론 도커 컴포즈를 안 쓰고 앤서블로 그런 모든 것을 관리할 수도 있고, 아예 닉스나 닉스오에스를 써서 더 아름답게 할 수도 있겠습니다만... 도커 컴포즈 정도면 타협 가능한 것으로...

XiNiHa's avatar
XiNiHa

@xiniha@hackers.pub

개인적으로 쿠버네티스를 편하게 쓰기 위한 공부를 어느 정도 마친 상태에서 보면 "아 이거 쿠버 하나만 떠 있으면 편하게 이것저것 띄우고 할 수 있는데 괜히 귀찮게 세팅해야 하네"라는 생각이 들기도 하지만 😅 쿠버네티스 잘 모르는 상태에서는 참 막막하겠다 싶긴 합니다....



RE: https://hackers.pub/@xt/01961970-a29f-78ff-baaf-1db2056a78e1

juxtapose's avatar
juxtapose

@xt@hackers.pub

저, 저도 90% 이상의 경우 도커 컴포즈 정도가 적당한 추상화 수준이라고 생각해요...

실제로 쿠버네티스 쓰는 팀에서 일해 본 경험도 그렇고, 주변 이야기 들어 봐도 그렇고, 도입하면 도입한 것으로 인해 증가하는 엔지니어링 코스트가 분명히 있다는 점은 누구도 부인하지 않는 것 같은데요. 쿠버네티스를 제대로 쓰는 것 자체도 배워야 할 것도 많고, 엔지니어가 유능해야 하고, 망치도 들여야 하고... 웬만하면 전담할 팀이 필요하지 않나 싶어요. (전담할 '사람' 한 명으로 때우기에는, 그 사람 휴가 가면 일이 마비되니까.)

엔지니어만 100명이 넘는 곳이라면 확실히 도입의 이득이 더 크겠지만, 반대로 혼자 하는 프로젝트라면 도무지 수지타산이 안 나올 것이라고 생각합니다. 따라서 쟁점은 그 손익분기점이 어디냐일 텐데... "대부분의" 서비스는 대성공하기 전까지는 도입 안 해도 되지 않나, 조심스럽게 말씀드려 봅니다. 즉 쿠버네티스가 푸는 문제는 마세라티 문제인 것이죠...

특히 클라우드 남의 컴퓨터 를 쓰지 않고 베어메탈 쓰는 경우는 더더욱...



RE: https://hackers.pub/@hongminhee/019618b4-4aa4-7a20-8e02-cd9fed50caae

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

Hackers' Pub의 에모지 반응 기능은 Mastodon의 좋아요, Misskey 계열, Pleroma 계열, kmyblue 및 Fedibird의 에모지 반응 기능과 호환됩니다. 기술적으로는 기본 에모지인 ❤️는 Like 액티비티로 표현되며 그 외 나머지 에모지는 EmojiReact 액티비티로 표현됩니다. Mastodon, kmyblue, Fedibird의 좋아요는 ❤️ 에모지 반응으로 변환됩니다 (Misskey의 동작과 유사). 또한, Misskey 계열과 달리 한 사람이 한 콘텐츠에 여러 에모지 반응을 남길 수도 있습니다 (Pleroma 계열의 동작과 유사). Hackers' Pub 사용자가 남길 수 있는 에모지 반응은 ❤️, 🎉, 😂, 😲, 🤔, 😢, 👀 이렇게 7종이며, 그 외의 에모지 및 커스텀 에모지는 보낼 수는 없고 받는 것만 됩니다.

KAGAMI🏳️‍🌈🏳️‍⚧️'s avatar
KAGAMI🏳️‍🌈🏳️‍⚧️

@saschanaz@sekai.social

스레드 연합은 있는둥 마는둥 해서 존재감이 없음
연합우주가 스레드한테 잡아먹히니 마니 말이 많았고 나도 걱정했는데 이거 뭐 존재감이 하나도 없으니

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

에모지 반응 기능이 배포되었습니다. 당분간 버그가 좀 있을 수도 있지만 양해 바랍니다. 전 이제 차단을 구현하러 가겠습니다…

Ailrun's avatar
Ailrun

@ailrun@hackers.pub

같은 것과 같지 않은 것

국밥 두 그릇의 가격이 얼마인가? KTX의 속력이 몇 KM인가? 내일 기온은 몇 도인가? 일상에서 묻는 이런 질문은 항상 같음의 개념을 암시적으로 사용하고 있다. 앞의 예시를 보다 명시적으로 바꾼다면 아래와 같이 (다소 어색하게) 말할 수 있다.

  • 국밥 두 그릇의 가격은 몇 원과 같은가?
  • KTX의 속력은 몇 KM와 같은가?
  • 내일 기온은 몇 도와 같은가?

이런 질문들의 추상화인 이론들은 자연스럽게 언제 무엇과 무엇이 같은지에 대해서 답하는 데에 초점을 맞추게 된다. 예를 들면

  • x2+x+1=0x^2 + x + 1 = 0의 실수 해의 갯수는 0과 같다.
  • 물 분자 내의 수소-산소 연결 사이의 각도는 104.5도와 같다.
  • 합병 정렬의 시간 복잡도는 O(nlogn)O(n\log{n})같다.

등이 있다. 이렇게 어떤 두 대상이 같은지에 대해서 이야기를 하다보면 반대로 어떤 두 대상이 같지 않은지에 대해서도 이야기하게 된다. 즉,

  • x+4x + 422로 나눈 나머지는 x+1x + 122로 나눈 나머지와 같지 않다.
  • 연결 리스트(Linked List)와 배열(Array)은 같지 않다.
  • 함수 λ xx\lambda\ x \to x와 정수 55같지 않다.

같은 것과 판정 문제(Decision Problem)

이제 컴퓨터 과학(Computer Science)과 프로그래밍(Programming)에 있어 자연스러운 의문은 "두 대상이 같은지 아닌지와 같은 답을 주는 알고리즘(Algorithm)이 있나?"일 것이다. 다시 말해서 두 대상 aabb를 입력으로 주었을 때

  • 알고리즘이 참 값(True\mathtt{True})을 준다면 aabb가 같고
  • 알고리즘이 거짓 값(False\mathtt{False})을 준다면 aabb가 같지 않은

알고리즘이 있는지 물어볼 수 있다. 이런 어떤 명제가 참인지 거짓인지 판정하는 알고리즘의 존재 여부에 대한 질문을 "판정 문제"("Decision Problem")라고 하며, 명제 PP에 대한 판정 문제에서 설명하는 알고리즘이 존재한다면 "PP는 판정 가능하다"("PP is decidable")고 한다. 즉, 앞의 질문은 "임의의 aabb에 대해 aabb가 같은지 판정 가능한가?"라는 질문과 같은 의미라고 할 수 있다.

이 질문에 대한 대답은 당연하게도 어떤 대상을 어떻게 비교하는지에 따라 달라진다. 예를 들어 우리가 32 비트(bit) 정수에 대해서만 이야기하고 있다면 "임의의 32 비트 정수 aabb에 대해 aabb가 각 비트별로 같은지 판정 가능한가?"라는 질문에 대한 답은 "그렇다"이다. 반면 우리가 비슷한 질문을 자연수를 받아 자연수를 내놓는 임의의 함수에 대해 던진다면 답은 "아니다"가 된다.[1]

그렇다면 어떤 대상의 어떤 비교에 대해 판정 문제를 물어보아야할까? 프로그래머(Programmer)로서 명백한 대답은 두 프로그램(Program)이 실행 결과에 있어서 같은지 보는 것일 것이다. 그러나 앞서 자연수를 받아 자연수를 내놓는 함수에 대해 말했던 것과 비슷하게 두 프로그램의 실행 결과를 완벽하게 비교하는 알고리즘은 존재하지않는다. 이는 우리가 두 프로그램의 같음을 판정하고 싶다면 그 같음을 비교하는 방법에 제약을 두어야 함을 말한다. 여기서는 다음의 두 제약을 대표로 설명할 것이다.

  1. 문법적 비교(Syntactic Comparison)
  2. β\beta 동등성 (β-η\beta\text{-}\eta Equivalence)

1. 문법적 비교(Syntactic Comparison)

이 방법은 말 그대로 두 프로그램이 문법 수준에서 같은지를 보는 것이다. 예를 들어 다음의 두 JavaScript 프로그램은 문법적으로 같은 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x  =  5;
console.log( x );

공백문자의 사용에서 차이가 있으나, 그 외의 문법 요소는 모두 동일함에 유의하자. 반면 다음의 두 JavaScript 프로그램은 동일한 행동을 하지만 문법적으로는 다른 프로그램이다.

// 1번 프로그램
let x = 5;
console.log(x);

// 2번 프로그램
let x = 3 + 2;
console.log(x);

두 프로그램 모두 x5라는 값을 할당하고 5를 콘솔에 출력하나, 첫번째 프로그램은 = 5;를, 두번째 프로그램은 = 3 + 2을 사용하여 5를 할당하고 있기 때문에 문법적으로 다르다.

문법적 비교는 이렇게 문법만 보고서 쉽게 판정할 수 있다는 장점이 있으나, 두번째 예시처럼 쉽게 같은 행동을 함을 이해할 수 있는 프로그램에 대해서도 "같지 않음"이라는 결과를 준다는 단점을 가진다. 혹자는

3 + 2같은 계산은 그냥 한 다음에 비교하면 안돼? 컴파일러(Compiler)도 상수 전파(Constant Propagation) 최적화라던지로 3 + 25로 바꾸잖아?

라는 생각을 할 수도 있을 것이다. 이 제안을 반영한 방법이 바로 β-η\beta\text{-}\eta 동등성이다.

2. β\beta 동등성

바로 앞의 소절에서 단순 계산의 추가에 의해 같음같지 않음으로 변하는 것을 보았다. 이런 상황을 피하기 위해서는 같음을 평가할 때 프로그램의 실행을 고려하도록 만들어야 한다. 가장 대표적인, 대부분의 프로그래밍 언어(Programming Language)에 존재하는 프로그램의 실행은 함수 호출이다. 따라서 함수 호출을 고려한 같음의 비교는 f(c)와 함수 f의 몸체 b 안에서 인자 xc로 치환한 것을 같다고 취급해야한다. 예를 들어

let f = (x) => x + 3;

이 있다면, f(5)5 + 3 혹은 8을 같은 프로그램으로 취급해야한다. 이 비교 방법의 큰 문제는 함수가 종료하는지 알지 못한다는 것이다. 두 프로그램 ab를 비교하는데, a가 종료하지 않는 함수 l을 호출한다면, 이 알고리즘은 "같음"이나 "같지 않음"이라는 결과를 낼 수조차 없다. 즉, 올바른 판정법이 될 수 없ㅏ.

더 심각한 문제는 아직 값을 모르는 변수가 있는 "열린 프로그램"("Open Program")에 대해서도 이런 계산을 고려해야한다는 것이다. 다음의 JavaScript 예시를 보자.

let g = (x) => f(x) + 3;
let h = (x) => (x + 3) + 3;

gh는 같은 프로그램일까? 우리가 gh가 같은 프로그램이기를 원한다면 f(x)x + 3을 같은 프로그램으로 보아야한다. 대부분의 프로그램은 함수 안에서 쓰여지기 때문에 프로그램의 비교는 거의 항상 gh 같은 열린 프로그램들의 비교이다. 따라서 gh를 다른 프로그램으로 본다면 계산을 실행하여 두 프로그램을 비교하는 의미가 퇴색되고 만다. 따라서 우리는 x와 같이 값이 정해지지 않은 변수가 있을 때에도 f(x)을 호출하여 비교해야만 한다. 따라서 우리는 단순히 모든 함수가 종료하는지 여부를 떠나서, 함수의 몸체에 등장하는 모든 부속 프로그램(Sub-program)이 종료하는지 아닌지를 따져야만 한다.

이런 강한 제약조건으로 인해 β\beta 동등성을 통해서 프로그램 비교의 판정 문제를 해결 가능한 곳은 매우 제한적이지만, β\beta 동등성이 매우 유용한 한가지 경우가 있다. 바로 의존 형이론(Dependent Type Theory)의 형검사(Type Checking)이다.

의존 형이론과 형의 같음

의존 형이론은 형(Type)에 임의의 프로그램을 포함할 수 있도록 하는 형이론(Type Theory)의 한 종류이다. 예를 들어 명시적인 길이(n)를 포함한 벡터(Vector) 형Vector n Int과 같이 쓸 수 있다. 이 형은 n개의 Int값을 가진 벡터를 표현하는 형이다. 이제 append라는 두 벡터를 하나로 연결하는 함수를 만든다고 해보자. 대략 다음과 같은 형을 쓸 수 있을 것이다.

append : Vector n a -> Vector m a -> Vector (n + m) a

즉, append는 길이 n짜리 a 형의 벡터와 길이 m짜리 a 형의 벡터를 합쳐서 길이 n + m짜리 a 형의 벡터를 만드는 함수이다. 이 함수를 사용해서 길이 5의 벡터를 길이 2와 길이 3짜리 벡터 x, y로부터 만들고 싶다고 하자.

append x y : Vector (2 + 3) a

안타깝게도 우리는 길이 2 + 3짜리 벡터를 얻었지, 길이 5짜리 벡터를 얻진 못했다. 여기서 앞서의 질문이 다시 돌아온다.

아니, 2 + 35로 계산하면 되잖아?"

그렇다. 이런 의존 형에 β\beta 동등성을 적용하면 우리가 원하는 형을 바로 얻어낼 수 있다. Vector (2 + 3) aVector 5 a같은 형이기 때문이다. 더욱이, 의존 형의 경우 종료하지 않는 부속 프로그램이 잘못된 형을 줄 수 있기 때문에 많은 경우 종료하지 않는 부속 프로그램을 어차피 포함하지 않는다. 다시 말해, 앞서 말한 제약 조건 즉 모든 부속 프로그램이 종료해야만 한다는 제약조건은 의존 형의 경우 상대적으로 훨씬 덜 심각한 제약조건이 되는 것이다.

이런 의존 형에 있어서의 β\beta 동등성 검사를 "변환 검사"("Conversion Check")라고 하며, 두 형이 β\beta 동등일 경우 이 두 형이 서로 "변환 가능하다"("Convertible")라고 한다. 이 변환 검사는 의존 형이론 구현에 있어서 가장 핵심인 기능 중 하나이며, 가장 잦은 버그를 부르는 기능 중 하나이기도 하다.

마치며

이 글에서는 같음과 같지 않음의 판정 문제에 대해 간략히 설명하고 프로그램의 같음을 판정하는 법에 대해서 단순화하여 다루어보았다. 구체적으로는 문법 기반의 비교와 β\beta 동등성을 통한 비교로 프로그램의 같음을 판정하는 법을 알아보았고, 이 중 β\beta 동등성이 적용되는 가장 중요한 예시인 의존 형이론을 β\beta 동등성을 중점으로 짤막하게 설명하였다. 마지막 문단에서 언급했듯 의존 형이론의 구현에 있어서 β\beta 동등성을 올바르게 구현하는 것은 가장 중요한 작업 중 하나이기에, 최근 연구들은 β\beta 동등성의 구현 자체를 의존 형이론 안에서 함으로서 검증된 β\beta 동등성의 구현을 하기 시작하고 있다. 이 글이 같음과 같지 않음과 판정 문제 그리고 β\beta 동등성에 있어 유용한 설명을 내놓았기를 바라며 이만 줄이도록 하겠다.


  1. 두 함수가 같다라고 보는 방법에 따라 다르나, 두 함수가 항상 같은 값을 가진다면 같다고 하자. 이때 함수의 판정 문제는 정지 문제(Halting Problem)와 동일하다. 임의의 튜링 기계(Turing Machine) ff가 입력 nn을 받았을 때 종료하면 g(n)=1g(n) = 1, 아니면 g(n)=0g(n) = 0이라고 하면 이 함수 gg와 상수 함수 c(n)=1c(n) = 1가 같은 함수임을 보이는 것은 ff가 항상 종료한다는 것을 보이는 것과 동등하다. ↩︎

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

생각해 보니 정작 저도 어제 飮食(음식) 사진 올릴 때 프로틴이 들어있는데도 CW도 () 태그도 달지 않았기 때문에 堂堂(당당)하게 말할 처지는 못 됩니다만… @97X10X23 님이 쓰신 引用(인용)한 글同感(동감)합니다.

크게 세 가치 側面(측면)에서 이야기해보고 싶은데요.

  1. ()@saschanaz 님이 付託(부탁)하신 건 肉食(육식) 寫眞(사진)에 CW를 걸어달라는 것까지도 아니고, 필터링할 수 있게끔 通用(통용)되는 해시태그가 있었으면 한다는 말씀이셨는데요… 이게 어쩌다 肉食(육식) 寫眞(사진)에 CW 달아야 한다는 「無理(무리)한」 主張(주장)으로 歪曲(왜곡)되었는지 모르겠습니다. (事實(사실) 왜 그런지 알 것도 같지만요.)

  2. 비건이라는 運動(운동)同意(동의)를 하든 안 하든, 맞팔한 사이에 비건이 있다면 肉食(육식) 寫眞(사진)을 올릴 때 苦悶(고민)하는 程度(정도)配慮(배려)는 그냥 사람과 사람 사이에서 얼마든지 할 수 있는 일 아닐까 싶습니다.

  3. 肉食(육식) 寫眞(사진)까지 CW 걸어야 하냐」라는 꽤나 恣意的(자의적)인 「常識(상식)」(제가 정말 안 좋아하는 單語(단어)인데요… 이를테면 어떤 사람들에겐 트랜스젠더나 同性愛(동성애)常識(상식) 밖의 일이기 때문이죠)에 依據(의거)한 이야기를 하시는 분들도 많이 보였는데요. 그렇게 치면 韓國(한국)의 어떤 커뮤니티들은 그들의 「常識(상식)」에 依據(의거)하여 反女性主義的(반여성주의적) 主張(주장)橫行(횡행)하고 多分(다분)極右的(극우적)主張(주장)들도 便()하게 올리고 한단 말이죠. 애當初(당초) 「몇 안 되는 사람들까지 配慮(배려)해야 하냐」라는 말 自體(자체)暴力的(폭력적)이라는 認知(인지)를 한다면 그렇게 말할 수 없지 않을까 합니다. 비록 비건이 아니더라도요. (이를테면, 저는 비건이 아닙니다. 어제도 肉食(육식)을 했고요.)

유엔's avatar
유엔

@97X10X23@town.voyager.blue

논비건식에 CW를 달아야 하는 이유

* 최근 CW에 대한 피로도를 느끼는 플로우에 고민하다가 한 번 써봅니다. 출근길에 쓴 거라 많이 축약된 내용입니다.

일단 저는 비건인이 비건을 하는 게 단순히 고기를 먹지 "못해서"가 아니라는 지점이 CW를 걸어야 하는 거라고 보거든요
이거에 대해서 뭐 피곤하다거나 그런거 그럴 수 있다고 생각해요 저라고 매번 뮤트단어쓰고 쿠션 이중삼중으로 하는게 편하겠습니까? 어찌되었건 게시물 하나 올리는데에 다른 게시물에 비해 노력이 드는데
하지만 '그런 노력을 들여서까지 게시물을 올려야 하는가', '그럼으로써 논비건식을 남들에게 노출하고 논비건식을 접한 타인이 동물착취와 폭력을 연상케 해야하는가', 그리고 그 '논비건식을 타인도 섭취하고 싶게끔 해야하는가' 이런 고민을 한 번 거치게 할 수 있는 장치라고도 생각해요

논비건식은 단순히 선택의 영역이고 개인의 신념이기 때문에(사실 이보다는 호불호의 영역으로 보는 것 같지만) 강요해선 안 된다
맞는 말이죠. 하지만 당신께서 그렇게 생각할 수 있는 것 자체가 육식(그로 인해 발생하는 착취와 폭력의 현장)에 익숙하고 무디다는 증거고, 그런 의견이 주류가 되어 인정받을 수 있다는 사실 자체가 기울어진 운동장임을 증명하는 꼴입니다
이게 다른 종류의 CW는 잘 사용하는 사람이 논비건식에서만 그런다면 더 그렇죠

물론, 그럼에도 피로감을 느낀다는 의견에 공감하고 이해할 수 있습니다. 현대인으로서 내가 살아숨쉬는 모든 행위가 누군가를 착취하는 구조이니 얼마나 피곤합니까. 도덕적으로 옳은 삶을 지향한다는 건 참 쉽지 않아요
그러나 CW를 걸어야 하는 피로감에 오히려 반발감을 느끼거나 불쾌하다면 자신이 어떤 말을 하고 있는 건지에 대한 정확한 인지는 해야한다고 봅니다. 인지를 하는 상태에서 자신이 그렇게 판단한다면 어쩔 수 없는 거고, 그게 괜찮은 사람들끼리 모이고 아닌 사람들은 떠나는 수밖에 없는 거죠

이에 대하여 해당 행위에 대하여 비판하는 분위기가 도는 걸 넘어서서 "너는 왜 CW를 걸지 않느냐"며 개인에게 불링을 하는 걸로 이어지는 걸 저는 반대합니다 어떤 이유에서든 개인과 개인이 논쟁하는 게 아니라(이건 어쩔 수 없는 영역인 거 아시죠?) 개인과 다수가 싸우는 형태가 되어선 안 되니까요

더불어, 제가 비건식 가장 열심히 섭취 할 때 경험으로 뮤단이 해결방안이 될 수 없는게
논비건식 사진은 뮤트가 안 돼요 그리고 논비건식은 보통 사진만 올리는 경우가 많고 게시하는 말도 다 달라서 뮤트단어로 해결해라는 전혀 도움이 안되고 해결방안이 못 됩니다

유엔's avatar
유엔

@97X10X23@town.voyager.blue

논비건식에 CW를 달아야 하는 이유

* 최근 CW에 대한 피로도를 느끼는 플로우에 고민하다가 한 번 써봅니다. 출근길에 쓴 거라 많이 축약된 내용입니다.

일단 저는 비건인이 비건을 하는 게 단순히 고기를 먹지 "못해서"가 아니라는 지점이 CW를 걸어야 하는 거라고 보거든요
이거에 대해서 뭐 피곤하다거나 그런거 그럴 수 있다고 생각해요 저라고 매번 뮤트단어쓰고 쿠션 이중삼중으로 하는게 편하겠습니까? 어찌되었건 게시물 하나 올리는데에 다른 게시물에 비해 노력이 드는데
하지만 '그런 노력을 들여서까지 게시물을 올려야 하는가', '그럼으로써 논비건식을 남들에게 노출하고 논비건식을 접한 타인이 동물착취와 폭력을 연상케 해야하는가', 그리고 그 '논비건식을 타인도 섭취하고 싶게끔 해야하는가' 이런 고민을 한 번 거치게 할 수 있는 장치라고도 생각해요

논비건식은 단순히 선택의 영역이고 개인의 신념이기 때문에(사실 이보다는 호불호의 영역으로 보는 것 같지만) 강요해선 안 된다
맞는 말이죠. 하지만 당신께서 그렇게 생각할 수 있는 것 자체가 육식(그로 인해 발생하는 착취와 폭력의 현장)에 익숙하고 무디다는 증거고, 그런 의견이 주류가 되어 인정받을 수 있다는 사실 자체가 기울어진 운동장임을 증명하는 꼴입니다
이게 다른 종류의 CW는 잘 사용하는 사람이 논비건식에서만 그런다면 더 그렇죠

물론, 그럼에도 피로감을 느낀다는 의견에 공감하고 이해할 수 있습니다. 현대인으로서 내가 살아숨쉬는 모든 행위가 누군가를 착취하는 구조이니 얼마나 피곤합니까. 도덕적으로 옳은 삶을 지향한다는 건 참 쉽지 않아요
그러나 CW를 걸어야 하는 피로감에 오히려 반발감을 느끼거나 불쾌하다면 자신이 어떤 말을 하고 있는 건지에 대한 정확한 인지는 해야한다고 봅니다. 인지를 하는 상태에서 자신이 그렇게 판단한다면 어쩔 수 없는 거고, 그게 괜찮은 사람들끼리 모이고 아닌 사람들은 떠나는 수밖에 없는 거죠

이에 대하여 해당 행위에 대하여 비판하는 분위기가 도는 걸 넘어서서 "너는 왜 CW를 걸지 않느냐"며 개인에게 불링을 하는 걸로 이어지는 걸 저는 반대합니다 어떤 이유에서든 개인과 개인이 논쟁하는 게 아니라(이건 어쩔 수 없는 영역인 거 아시죠?) 개인과 다수가 싸우는 형태가 되어선 안 되니까요

더불어, 제가 비건식 가장 열심히 섭취 할 때 경험으로 뮤단이 해결방안이 될 수 없는게
논비건식 사진은 뮤트가 안 돼요 그리고 논비건식은 보통 사진만 올리는 경우가 많고 게시하는 말도 다 달라서 뮤트단어로 해결해라는 전혀 도움이 안되고 해결방안이 못 됩니다

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to ꧁ wakest ꧂'s post

@liaizon Oh, also there are another terms like 現實 (hyeonsil; “reality”) or 現生 (hyeonsaeng; “real life”) in Korean.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to ꧁ wakest ꧂'s post

@liaizon There are terms like 온 (on) and 오프 (opeu) which are derived from English online and offline, but no exactly same word like meatspace in Korean as far as I know.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

오늘 저녁은 동네에 있는 다이닝 바 ()&()에서.

六饌
ALT text details六饌
부야베스
ALT text details부야베스
하얀 비빔밥과 바지락 국물
ALT text details하얀 비빔밥과 바지락 국물
웨스턴 肉膾
ALT text details웨스턴 肉膾
스모키 새우쌈
ALT text details스모키 새우쌈
컬리플라워
ALT text details컬리플라워
아귀와 靑梗菜
ALT text details아귀와 靑梗菜
누룩三겹살, 막걸리치킨, 韓牛 三角살
ALT text details누룩三겹살, 막걸리치킨, 韓牛 三角살
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

주말에 했던 〈국한문혼용체에서 Hollo까지〉의 발표에서 대강:

  1. 연합우주에서도 국한문혼용체로 글을 쓰는데 사람들이 읽기 쉽게 한글 독음을 <ruby> 태그로 달고 싶다!
  2. Mastodon에 패치를 할 수는 있지만 업스트림에 받아들여질 리가 없으니 패치된 Mastodon 서버를 직접 운영할 수 밖에 없다.
  3. 혼자 쓰자고 Mastodon 서버를 운영하려니 비용이 크다. 가벼운 ActivityPub 서버 구현을 만들어야겠다.
  4. ActivityPub 서버 구현을 바닥부터 하자니 할 일이 너무 많다. ActivityPub 프레임워크를 만들어야겠다. → Fedify
  5. Fedify를 만들었으니 일인 사용자용 ActivityPub 서버를 구현하자. → Hollo
  6. Hollo를 만들었으니 Seonbi를 연동하자.
  7. Seonbi를 연동하여 한자어에 한글 독음이 <ruby>로 달게 했으나 Mastodon과 Misskey에서 <ruby> 태그를 지원 안 한다.
  8. Mastodon 쪽에 이슈를 만들고 연합우주에서 홍보하여 결국 패치됨. Mastodon에서도 <ruby> 지원!
  9. Misskey 쪽에 패치를 보내서 결국 Misskey에서도 <ruby> 지원!
  10. 행복한 국한문혼용 생활.

이상과 같은 이야기를 했더니, “야크 셰이빙이 엄청나다”라는 의견을 들었다.



RE: https://hackers.pub/@hongminhee/019603e0-33ef-700f-90f4-153c8c995135

:yuri: :yurigarden: :garden: 쯔방's avatar
:yuri: :yurigarden: :garden: 쯔방

@pbzweihander@yuri.garden · Reply to :yuri: :yurigarden: :garden: 쯔방's post

그리고 에모지 vs 이모지 는 규범주의뿐만이 아니라 언어의... ethnicity 라고 표현해야하나..? 와도 관련이 있습니다
에모지 는 원래 일본어입니다. 그림문자인 에모지에서 왔으니까 에모지라는 것이죠.
이걸 서양권에서 이모지라고 발음한다고 우리도 이모지라고 부르면 원어를 존중하지 않는 꼴이 됩니다
세인트 피터스버그, 워쏘우, 조안 오브 아크 등등의 예시가 있습니다
미국/영국인이 그렇게 부르는 것은 이해할 수 있지만 우리가 그걸 따라갈 필요는 없잖아요?

juxtapose's avatar
juxtapose

@xt@hackers.pub

간혹 "이모지"가 아니라 "에모지"라고 쓰는 이유에 대한 질문을 받습니다. 여기다 써 두면 앞으로 링크만 던지면 되겠지?

요약: 에모지라서 에모지라고 씁니다.

"이모지"라는 표기는 아마도 "emoji"가 "emotion"이나 "emoticon"과 관련이 있다고 생각해서 나오는 것으로 보이는데요. "emoji"와 "emoticon"은 가짜동족어(false cognate)입니다. "emoji"는 일본어 絵文字(에모지)를 영어에서 그대로 받아들여 쓰고 있는 것입니다. 심지어 구성원리도 에모+지가 아니고 에+모지(絵+文字)입니다. "emotion"과 유사해 보이는 것은 순전히 우연일 뿐, 계통적으로 전혀 아무 상관이 없습니다. "이모티콘"과 "이미지"의 합성어가 아닙니다. (그랬으면 "-ji"가 아니라 "-ge"였겠죠.)

그리고 그렇기 때문에 에모지를 에모지로 표기할 실익이 생깁니다. :), ¯\_(ツ)_/¯, ^_^ 등은 이모티콘입니다. 반면 😂는 명확히 에모지입니다.

프로그래머에게 이건 정말 중요한 구분입니다. "이모티콘을 잘 표현하는 시스템"과 "에모지를 잘 표현하는 시스템"은 전혀 다른 과제이기 때문입니다. 에모지는 "그림 문자"라는 원래 뜻 그대로, 어떤 문자 집합(예를 들어 유니코드)에서 그림 문자가 "따로 있는" 것입니다. 내부 표현이야 어떻든, 적어도 최종 렌더링에서는 별도의 글리프가 할당되는 것이 에모지입니다. "무엇이 에모지이고 무엇이 에모지가 아닌가"는 상대적으로 명확합니다(문자 집합에 규정되어 있으니까).

반면 이모티콘은 "무엇이 이모티콘인가?"부터 불명확합니다. 우선 대부분의 이모티콘은 이모티콘이 아닌 문자를 조합하여 이모티콘이 만들어지는 형식입니다. 예를 들어 쌍점(:)이나 닫는 괄호())는 그 자체로는 이모티콘이 아니지만 합쳐 놓으면 :) 이모티콘이 됩니다. 하지만 조합에 새로운 의미를 부여했다고 해서 다 이모티콘이라고 부르지도 않습니다. -_- 같은 것은 대다수가 이모티콘으로 인정하지만, -> 같은 것은 이모티콘이라고 부르지 않는 경향이 있습니다.

- 문자와 > 문자에는 화살표라는 의미가 없기 때문에, -> 조합과 화살표의 시각적 유사성에 기대어 화살표라는 새로운 의미로 "오용"한 것은 이모티콘의 구성 원리에 해당합니다. 하지만 화살표는 인간의 특정한 정서(emotion)에 대응하지 않으므로 이모티콘이라고는 잘 부르지 않습니다. 그렇다고 얼굴 표정을 나타내야만 이모티콘인가 하면 그렇지도 않습니다. orz 같은 것은 이모티콘으로 간주하는 경향이 있어 보입니다. 오징어를 나타내는 <:=는 이모티콘인가? 이모티콘이 맞다면, 왜 ->는 이모티콘이 아니고 <:=는 이모티콘인가? 알 수 없습니다. ㅋㅋㅠㅠ는 둘 다 정서를 나타내는데, ㅠㅠ만이 아이콘적 성질을 가지므로 이모티콘이고 는 이모티콘이 아닌가? 알 수 없습니다. 만약 만 이모티콘이 아니라고 한다면, ㅋ큐ㅠ 에서 는 이모티콘인가 아닌가?? 알 수 없습니다. 이 알 수 없음은 이모티콘의 생래적 성질입니다. 어쩔 수 없죠.

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

【拡散希望】

Hackers' Pub(ハッカーズ・パブ)は現在開発中の、ソフトウェアエンジニアと技術愛好家の為のActivityPub対応ソーシャルネットワークです。現在は韓国語中心のコミュニティが形成されていますが、日本のエンジニアの方々にも参加していただきたいと考えています。

Hackers' Pubは短文の投稿[1]と長文の記事[2]の両方をサポートしています。日常的な会話や簡単な質問は短文投稿で、詳細な技術解説やチュートリアルなどは長文記事で表現できます。QiitaやZennのような技術ブログ機能と、MastodonやMisskeyのようなタイムライン機能を兼ね備えた一つのプラットフォームで、両方の利点を享受できます。何よりもActivityPubプロトコルに対応している為、Mastodon、Misskey、Akkoma等と連携可能です。(このアカウントもHackers' Pubから投稿しています!)

技術的な特徴として、拡張Markdownによるテーブル脚注警告ボックスダイアグラム数式などの多様な記法をサポートし、構文ハイライト行ハイライト、差分表示などの強力なコードブロック機能も備えています。また、様々な言語での投稿が可能で、将来的には自動翻訳機能も予定しています。

Hackers' PubはAGPL-3.0ライセンスの下で開発されているオープンソースプロジェクトです。コードの貢献や機能提案も歓迎しています。

現在はまだ開発段階のため招待制となっています。Hackers' Pubに興味がある方は、DMや返信でメールアドレスをお知らせいただければ、招待状をお送りします。技術コミュニティの一員として、ぜひご参加をお待ちしております。よろしくお願いいたします。


  1. 「投稿」はActivityPubのNoteオブジェクトタイプに対応しています。 ↩︎

  2. 「記事」はActivityPubのArticleオブジェクトタイプに対応しています。 ↩︎

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

In addition to Date, which has millisecond precision, I hope that Drizzle ORM also supports Temporal.Instant, which has nanosecond precision. 😢

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hackers.pub

Hackers' Pub에 리액션 기능 만들고 있는데, 선택 가능한 에모지 세트를 이 정도로 대충 정해봤습니다. 더하거나 뺄 게 있을까요? 그리고 5 종류인 게 많다고 보시나요 적다고 보시나요?

const REACTION_EMOJIS = ["❤️", "😕", "😮", "🤔", "👀"];
const DEFAULT_REACTION_EMOJI = REACTION_EMOJIS[0];
ALT text detailsconst REACTION_EMOJIS = ["❤️", "😕", "😮", "🤔", "👀"]; const DEFAULT_REACTION_EMOJI = REACTION_EMOJIS[0];
洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 박준규's post

@curry 홈 서버가 아직 널널해서 서비스만 더 추가하는 식으로… ㅎㅎㅎ

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 洪 民憙 (Hong Minhee)'s post

翻譯機(번역기)랑 글쓰기 앱 만들어 보고 싶음…

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

이미 벌려 둔 일이 많은데도 일을 더 벌리고 싶다… 봄이라 그런가?

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social · Reply to 🦊's post

@root 그래도 대체로 알아들을 수 있답니다. ㅎㅎ

洪 民憙 (Hong Minhee)'s avatar
洪 民憙 (Hong Minhee)

@hongminhee@hollo.social

「刺繍」の旧字体ですね。

https://mean.engineer/@indutny/114288786976630444

Fedor Indutny's avatar
Fedor Indutny

@indutny@mean.engineer

やばい😨漢字ですよ!辞書でも検索できませんそうです。

助けてくれて…🥲

わからない漢字
ALT text detailsわからない漢字
lionhairdino's avatar
lionhairdino

@lionhairdino@hackers.pub

NixOS.kr 디스코드에 올렸는데, 다른 분들의 의견을 들어보려고 해커스펍에도 올립니다. 닉스 경험이 많지 않은 사람의 글이니, 정확하지 않을 수 있습니다. 틀린 곳이 있으면 바로 알려주세요.

※ 닉스를 처음 접하는 분들이나, 닉스로 실용적인 업무를 하시는데 문제가 없는 분들한테는 적당한 글은 아닙니다. 서두에 읽으면 도움이 될만한 분들을 추려서 알려 드리려고 하니, 의외로 필요한 분들이 없겠습니다. 실무자들은 이렇게까지 파고들며 알 필요 없고, 닉스 개발자들이야 당연히 아는 내용일테고, 입문자 분들도 역시 이런 내용으로 어렵다는 인식을 갖고 시작할 필요는 없으니까요. 그럼 남은 건 하나네요. mkDerivation 동작을 이미 아는 분들의 킬링 타임용이 되겠습니다.


외국어를 익힐 때, 문법없이 실전과 부딪히며 배우는 방법이 더 좋기는 한데, 가끔은 문법을 따로 보기 전엔 넘기 힘든 것들이 있습니다. 닉스란 외국어를 익히는데도 실제 설정 파일을 많이 보는 것이 우선이지만, 가끔 "문법"을 짚고 넘어가면 도움이 되는 것들이 있습니다.

닉스 알약 (제목이 재밌네요. 알약) 글을 보면 mkDerivation속성 집합을 받아, 거기에 stdenv 등 기본적인 것을 추가한 속성 집합을 만들어 derivaition 함수에 넘기는 간단한 래핑 함수임을 직관적으로 잘 설명하고 있습니다.

그런데, 실제 사용 예시들을 만나면, mkDerivation에 속성 집합을 넘기지 않고, attr: {...} 형태의 함수를 넘기는 경우를 더 자주 만납니다. 그래서, 왜 그러는지 실제 구현 코드를 보고 이유를 찾아 봤습니다.

  mkDerivation =
    fnOrAttrs:
    if builtins.isFunction fnOrAttrs then
      makeDerivationExtensible fnOrAttrs
    else
      makeDerivationExtensibleConst fnOrAttrs;

mkDerivation정의를 보면 인자로 함수를 받았느냐 아니냐에 따른 동작을 분기합니다. 단순히, stdenv에서 가져온 속성들을 추가한다면, 함수를 인자로 받지 않아도 속성 집합을 병합해주는 //의 동작만 있어도 충분합니다.

{ a = 1; } // { b = stdenv.XXX; }

하지만, 함수로 받는 이유를 찾으면, 코드가 단순하지 않습니다. 아래는 함수를 받을 때 동작하는 실제 구현 일부를 가져 왔습니다.

makeDerivationExtensible =
    rattrs:
    let
      args = rattrs (args // { inherit finalPackage overrideAttrs; });
      ...

전체를 보기 전에 일단 args에서부터 머리가 좀 복잡해집니다. argsargs를 재귀 참조하고 있습니다. 보통 rattrs 매개 변수로는 아래와 같은 함수들이 들어 옵니다.

stdenv.mkDerivation (finalAttrs: {
  pname = "timed";
  version = "3.6.23";
  ...
    tag = finalAttrs.version;
}

(와, 해커스펍은 코드 블록에 ANSI가 먹습니다! 지원하는 곳들이 드문데요.)
코드를 바로 분석하기 전에, 닉스의 재귀 동작을 먼저 보면 좋습니다.

재귀 생각 스트레칭

nix-repl> let r = {a = 1; b = a;}; in r
error: undefined variable 'a'

위 동작은 오류지만, 아래처럼 rec를 넣어주면 가능합니다.

nix-repl> let r = rec {a = 1; b = a;}; in r 
{ a = 1; b = 1; }

rec동작은 Lazy 언어의 fix로 재귀를 구현하는 동작입니다. ※ 참고 Fix 함수

rec를 써서 속성 안에 정의 중인 속성에 접근할 수 있습니다. 그런데, 아래 같이 속성을 r.a 로 접근하면, rec 없이도 가능해집니다.

nix-repl> let r = {a = 1; b = r.a;}; in r
{ a = 1; b = 1; }

닉스 언어의 Lazy한 특성 때문에 가능합니다.

이제, 원래 문제와 비슷한 모양으로 넘어가 보겠습니다. 아래같은 형태로 바로 자기 자신에 재귀적으로 접근하면 무한 재귀 에러가 나지만,

nix-repl> let x = x + 1; in x
       error: infinite recursion encountered

아래처럼 람다 함수에 인자로 넘기면 얘기가 달라집니다.

nix-repl> let args = (attr: {c = 1; b = attr.a + attr.c + 1;}) (args // { a = 1; }); in args
{ b = 3; c = 1; }

여기서 속성b의 정의 동작이 중요합니다. 위 내용을 nix-instantiate로 평가하면,

 nix-instantiate --eval -E 'let args = (attr: {c = 1; b = attr.a + attr.c + 1;}) (args // { a = 1; }); in args'
{ b = <CODE>; c = 1; }

--eval 옵션은 WHNF까지만 평가합니다. <CODE>는 하스켈 문서에서 나오는 <thunk>와 같은, 평가가 아직 이루어지지 않은 상태를 뜻합니다. ※ Nix Evaluation Performance
b는 아직 평가가 되지 않았으니, 에러가 나지 않고, b가 필요한 순간에는 attr.a가 뭔지 알 수 있는 때가 됩니다.

attr: 
  { c = 1; 
    b = attr.a + attr.c + 1;
  }

속성 b아직 알 수 없는, 미래의 attr에 있는 a를 받아 써먹고, 원래는 rec없이 접근하지 못했던, c에도 attr.c로 접근이 가능합니다. (attr.c은 현재 정의하고 있는 속성셋의 c가 아니라, 매개 변수 attr로 들어온 속성셋의 c입니다.)

원래 문제로 다시 설명하면, mkDerivation에 넘기고 있는, 사용자 함수 finalAttrs: { ... }에서, 닉스 시스템이 넣어주는 stdenv 값 같은 것들과 사용자 함수내의 속성들을 섞어서 속성 정의를 할 수 있다는 얘기입니다. 아래처럼 말입니다.

    tag = finalAttrs.version;

뭐하러, 이런 복잡한 개념을 쓰는가 하면, 단순히 속성 추가가 아니라, 기존 속성이 앞으로 추가 될 속성을 기반으로 정의되어야 할 때는 이렇게 해야만 합니다. 함수형 언어에선 자주 보이는, 미래값을 가져다 쓰는 재귀 패턴인데, 저는 아직 그리 익숙하진 않습니다.

kiwiyou's avatar
kiwiyou

@kiwiyou@twt.rs

폐인과 폐인 (*폐인03은 부정적인 뉘앙스가 있는 단어입니다.)

Jaeyeol Lee (a.k.a. kodingwarrior) :vim:'s avatar
Jaeyeol Lee (a.k.a. kodingwarrior) :vim:

@kodingwarrior@silicon.moe

해커스펍에서 리액션 다음으로 지원되는기능은 블락일까 아니면 해시태그일까

Mark Crocker's avatar
Mark Crocker

@mcrocker@indieweb.social

SE Radio 657: Hong Minhee @hongminhee on and the – Software Engineering Radio se-radio.net/2025/02/se-radio-

References, Fedify fedify.dev/ and hollo: Federated single-user microblogging software github.com/fedify-dev/hollo are also interesting.

Juntai Park's avatar
Juntai Park

@arkjun@hackers.pub

앞으로 Hackers'해커스 Pub퍼브에서는 國漢英文混用국한영문혼용으로 글을 올려볼까?

Simon Park's avatar
Simon Park

@parksb@silicon.moe · Reply to Simon Park's post

트위터 봇 만들 때는 스팸짓 좀 해도 어차피 팔로워가 없으면 다른 사람 피드를 가득 채울 일이 없으니 부담도 없었다. 그런데 여기에서는 봇을 조금 잘못 돌리면 연합 타임라인이 순식간에 봇의 스팸글로 가득 차 버린다. 트위터 서버에 비해 영세한 이 서버에 부담을 주지 않아야 한다는 생각도 들고... 아무쪼록 조심해야 할 것 같다.

Simon Park's avatar
Simon Park

@parksb@silicon.moe

BotKit을 이용해 국내외 기술 블로그의 아티클을 업로드하는 'Tech Blog Bot'을 만들었다. 1시간에 한 번씩 구독중인 블로그들의 새 아티클을 확인해 큐에 넣고, 1분에 하나씩 큐의 아티클을 업로드한다. BotKit의 유려함에 첫 번째로 놀랐고, 테스트로 돌려본 봇이 스팸짓을 하는 걸 보면서 두 번째로 놀랐다. techblogbot.parksb.xyz/

← Newer
Older →