Profile img

박준규

@curry@hackers.pub · 314 following · 168 followers

darcs hub
hub.darcs.net/vincent
Hackage
hackage.haskell.org/user/JoonkyuPark

오늘 읽을 챕터 제목은 ‘스트리밍(Streaming)’이다. 서두에 이런 말이 나온다.

No one ever steps in the same stream twice, for it is not the same stream and they are not the same person.

ChatGPT에게 저게 유명한 말인지 물었더니 다음과 같이 대답했다.

https://chatgpt.com/share/6800e63e-07b4-800c-b32b-fef1723ef5c5

“판타 레이”가 여기서 나온 말이구나. 나는 이 말을 웹툰 “덴마”에서 처음 봤다. 무슨 뜻인지도 모르고 봤네.

1
2

책 한 챕터 다 읽었다. stm 패키지에서 제공하는 기능이 많지만 여기서는 TVar만 쓸 줄 알면 돼서 분량이 많지 않네. 다음과 같은 형식으로 웹사이트 방문자 카운터를 구현할 수 있다.

countingServer :: IO ()
countingServer = do
  hitCounter <- atomically (newTVar @Natural 0)
  serve @IO HostAny "8000" \(s, _) -> do
    count <- atomically (increment hitCounter)
    sendResponse s (textOk (countHelloText count))

increment :: TVar Natural -> STM Natural
increment hitCounter = do
  oldCount <- readTVar hitCounter
  let newCount = oldCount + 1
  writeTVar hitCounter newCount
  return newCount
2
0
0

놀라서 전파하긴 했는데 살펴보니 어떤 분은 ‘아직 모른다’라고 하시는 분도 있네요. 구체적이고 정확한 후속 보도를 아시는 분은 공유를 부탁드립니다. 저도 확인해보겠습니다.

3

놀라서 전파하긴 했는데 살펴보니 어떤 분은 ‘아직 모른다’라고 하시는 분도 있네요. 구체적이고 정확한 후속 보도를 아시는 분은 공유를 부탁드립니다. 저도 확인해보겠습니다.

1
2

@bglbgl gwyng 이게 생각해보니 ‘문법이 복잡하다’, ‘문법 요소가 적다’라는 표현이 구체적이지 않은 것 같습니다. 갑자기 언어 확장이 떠오르면서 ‘문법 안 복잡한 거 맞나?’ 싶네요. 그래서 표현을 좀 바꾸면 저는 사전에 정의된 키워드가 적을 수록 좋다고 생각합니다.

0
1

하스켈에서 $가 infix operator가 아니라 문법 요소여야 한다는 얘기에는 동의하는 사람들이 꽤 있다. 근데 1 + $ 2 + 31 + (2 + 3)으로 변환되어야 한다고 하면 다들 싫어한다ㅋㅋ 근데 나는 저것도 좋다고 본다.

2
1
1
1
2

하스켈 코드 포매터 stylish-haskell을 잘 쓰고 있습니다. Vim에서 :%!stylish-haskell이라고 입력하는 방식으로 사용하는데요, 코드에 문제가 있을 경우 코드 전체가 지워지고 다음과 같은 문자열로 대체됩니다.

<string>:1:18: error: [GHC-58481] parse error on input `!'

Vim에서 작업 중이므로 단순히 u를 눌러서 취소하면 되긴 합니다만 혹시 다른 방법이 있을까요?

하스켈 코드 포매터 stylish-haskell을 잘 쓰고 있습니다. Vim에서 :%!stylish-haskell이라고 입력하는 방식으로 사용하는데요, 코드에 문제가 있을 경우 코드 전체가 지워지고 다음과 같은 문자열로 대체됩니다.

<string>:1:18: error: [GHC-58481] parse error on input `!'

Vim에서 작업 중이므로 단순히 u를 눌러서 취소하면 되긴 합니다만 혹시 다른 방법이 있을까요?

0
curl --http1.1 --dump-header - http://localhost:8000
  • --http1.1처럼 버전을 정할 수 있다.
  • --dump-header <filename>으로 헤더를 파일로 저장할 수 있는데 파일 이름 대신 -를 적으면 헤더를 화면에 출력한다.
0

[1]에서 문자열을 다룰 때 StrictTextBuilder의 성능을 비교하는 예제에서 Builder의 성능이 더 좋다고 설명한다. 그런데 내 PC에서 같은 코드를 실행했는데 결과가 반대로 나왔다. 이상해서 문자열 길이를 늘렸더니 책에서 말한대로 나왔다.

ghci> concatSpeedTest 50000
0.004451s
0.04721s
ghci> concatSpeedTest 500000
0.062405s
0.023449s
ghci> concatSpeedTest 5000000
0.511402s
0.205632s

  1. Chris Martin, Julie Moronuki, 《Sockets and Pipes》 ↩︎

3

Yacc와 같은 파서 제네레이터에 BNF를 넣으면 파서 코드가 자동으로 생성된다. 그런데 HTTP나 ActivityPub 등의 프로토콜 스펙을 입력으로 넣으면 자동으로 코드를 구현해주는 도구 어디 없나?

1

오, Quasi-quotation 신기하다. 문자열 안에 아스키 글자를 넣으면 컴파일 에러가 나네!

library/Book.hs:221:18: error:
    • Must be only ASCII characters.
    • In the quasi-quotation: [A.string|GET ♫ HTTP/1.1|]
    |
221 |   line [A.string|GET ♫ HTTP/1.1|] <>
    |                  ^^^^^^^^^^^^^^^^
0

오, Quasi-quotation 신기하다. 문자열 안에 아스키 글자를 넣으면 컴파일 에러가 나네!

library/Book.hs:221:18: error:
    • Must be only ASCII characters.
    • In the quasi-quotation: [A.string|GET ♫ HTTP/1.1|]
    |
221 |   line [A.string|GET ♫ HTTP/1.1|] <>
    |                  ^^^^^^^^^^^^^^^^
1
0
1

책을 읽고 있는데 고퍼(Gopher)라는 고대의 프로토콜이 나왔다. 책에서 다음과 같이 아직 살아 있을 수 있는 고퍼 서버 목록을 소개한다.

고퍼 서버에 \r\n을 날리면 응답이 오는데 위 세 개 서버에 요청을 날려보니 모두 응답이 온다.

예를 들어 세 번째 고퍼 서버의 응답은 다음과 같다.(스압 주의)

i	fake	(NULL)	0
i	fake	(NULL)	0
i __  __      _        _____ _ _ _	fake	(NULL)	0
i|  \/  | ___| |_ __ _|  ___(_) | |_ ___ _ __	fake	(NULL)	0
i| |\/| |/ _ \ __/ _` | |_  | | | __/ _ \ '__|	fake	(NULL)	0
i| |  | |  __/ || (_| |  _| | | | ||  __/ |	fake	(NULL)	0
i|_|  |_|\___|\__\__,_|_|   |_|_|\__\___|_|	fake	(NULL)	0
i	fake	(NULL)	0
1MetaFilter	/MetaFilter	gopher.metafilter.com	70
isharing and discussing neat stuff on the web	fake	(NULL)	0
1Ask MetaFilter	/Ask MetaFilter	gopher.metafilter.com	70
iasking questions and getting answers	fake	(NULL)	0
1FanFare	/FanFare	gopher.metafilter.com	70
ipop culture discussion -- TV, movies, podcast, books	fake	(NULL)	0
1Projects	/Projects	gopher.metafilter.com	70
icreative work by MetaFilter community members	fake	(NULL)	0
1Music	/Music	gopher.metafilter.com	70
ioriginal musical and audio recordings by MeFites	fake	(NULL)	0
1Jobs	/Jobs	gopher.metafilter.com	70
iemployment opportunities and member availabilities	fake	(NULL)	0
1IRL	/IRL	gopher.metafilter.com	70
iorganizing meetups and community events in real life	fake	(NULL)	0
1MetaTalk	/MetaTalk	gopher.metafilter.com	70
iwhere the commuity talks about MetaFilter itself	fake	(NULL)	0
1FAQ	/FAQ	gopher.metafilter.com	70
ifrequently asked questions	fake	(NULL)	0
5
6
14
0
0
3
3
0

darcs show dependencies라고 입력하면 다음과 같이 Graphviz DOT 코드를 출력해준다!

%0 1a66e7eb Initial commit f55ce246 Book.hs: Extract file handle allocation into fileResource function f55ce246->1a66e7eb 227e4ff1 feat: Add greeting text file I/O with uppercase printing 227e4ff1->f55ce246 771b32dc Add `repeatUntilIO` helper and use it in `printFileContentsUpperCase2` 771b32dc->227e4ff1

(해커즈 퍼브에서는 graphviz를 지원합니다!)

darcs show dependencies라고 입력하면 다음과 같이 Graphviz DOT 코드를 출력해준다!

%0 1a66e7eb Initial commit f55ce246 Book.hs: Extract file handle allocation into fileResource function f55ce246->1a66e7eb 227e4ff1 feat: Add greeting text file I/O with uppercase printing 227e4ff1->f55ce246 771b32dc Add `repeatUntilIO` helper and use it in `printFileContentsUpperCase2` 771b32dc->227e4ff1

(해커즈 퍼브에서는 graphviz를 지원합니다!)

2

darcs pull 또는 darcs push로 서로 다른 저장소의 패치를 전달하려고 하는데 단일 패치 해시를 지정했는데 darcs가 자꾸 다른 패치를 가져오려고 했다.

‘버그인가⋯ 못쓰겠네⋯ 이래서 사람들이 안 쓰는 건가?’

그런데 ChatGPT에게 물어보니 패치간 의존성이 있기 때문에 그 패치를 먼저 가져오려고 하는 것일 수 있다고 한다. darcs는 어떻게 패치간 의존성을 파악할 수 있는 거지? darcs 의심한 내가 나빠.

0

darcs pull 또는 darcs push로 서로 다른 저장소의 패치를 전달하려고 하는데 단일 패치 해시를 지정했는데 darcs가 자꾸 다른 패치를 가져오려고 했다.

‘버그인가⋯ 못쓰겠네⋯ 이래서 사람들이 안 쓰는 건가?’

그런데 ChatGPT에게 물어보니 패치간 의존성이 있기 때문에 그 패치를 먼저 가져오려고 하는 것일 수 있다고 한다. darcs는 어떻게 패치간 의존성을 파악할 수 있는 거지? darcs 의심한 내가 나빠.

3
4
0
2
1

메타적인 얘기지만, 저는 오늘 “Kubernetes는 적정 기술인가?”라는 떡밥이 Hackers' Pub 내부적으로 발생했다는 사실이 아주 기쁩니다. 여태까지는 Hackers' Pub 자체에 대한 떡밥이거나, GeekNews나 X에서 넘어온 떡밥이었거든요.

1

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

0

같은 것과 같지 않은 것에 대해서 짤막한 글을 써 보았습니다. 오랜만에 국어로 쓰는 글이라 잘 읽힐지 모르겠네요.

0
0
0

기능이 여럿 있는데, 그 상세를 잘 모르겠는 것이 많군요. 이를테면 "공개"와 "조용히 공개"의 차이점이 제게는 직관적이지 않네요. 무슨 차이인지 아시는 분이 있다면 알려주시면 감사하겠습니다.

0

줄리 모로누키(Julie Moronuki) 님이 원래 언어학을 전공하셔서 그런지 글을 참 잘 쓰시는 것 같고 그 필력으로 하스켈 책을 세 권이나 써주셔서 너무 감사하다. 새로운 콘텐츠를 만들어 주시기를 고대하고 있는데 최근 어떻게 지내시는지 너무 궁금하다.

ChatGPT는 Moronuki가 일본식 성씨일 가능성을 제기했다.

그렇지 않아도 그의 블로그를 보니, 그가 일본에 방문해서 영어를 가르쳤던 경험이, 프로그래밍을 전혀 몰랐던 그로 하여금 하스켈을 대중에게 가르치는 사명을 일깨워준 계기가 된 것 같다.

만약 일본식 성씨가 맞다면 아마도 もろぬき라고 쓰는 것 같다.

0