
박준규
@curry@hackers.pub · 271 following · 128 followers
darcs hub
- hub.darcs.net/vincent
Hackage
- hackage.haskell.org/user/JoonkyuPark
놀라서 전파하긴 했는데 살펴보니 어떤 분은 ‘아직 모른다’라고 하시는 분도 있네요. 구체적이고 정확한 후속 보도를 아시는 분은 공유를 부탁드립니다. 저도 확인해보겠습니다.
@kodingwarriorJaeyeol Lee 방금 배포했습니다. ㅋㅋㅋ
@curry박준규 근데 따지고보면 하스켈도 문법 복잡하죠. 각각 다 역할이 있어서 그렇지만요.
@bglbgl gwyng 이게 생각해보니 ‘문법이 복잡하다’, ‘문법 요소가 적다’라는 표현이 구체적이지 않은 것 같습니다. 갑자기 언어 확장이 떠오르면서 ‘문법 안 복잡한 거 맞나?’ 싶네요. 그래서 표현을 좀 바꾸면 저는 사전에 정의된 키워드가 적을 수록 좋다고 생각합니다.
GHCup에서 GHC의 추천 버전이 9.6.7로 변경되었다. 내 로컬에서 버전 올려도 문제 없으려나!
✗ ghc 9.6.7 recommended,base-4.18.3.0
https://github.com/haskell/ghcup-metadata/pull/304
한편 현재 최신 버전은 9.12.2이다.
✗ ghc 9.12.2 latest,base-4.21.0.0 2025-03-12
하스켈에서 $
가 infix operator가 아니라 문법 요소여야 한다는 얘기에는 동의하는 사람들이 꽤 있다. 근데 1 + $ 2 + 3
도 1 + (2 + 3)
으로 변환되어야 한다고 하면 다들 싫어한다ㅋㅋ 근데 나는 저것도 좋다고 본다.
@bglbgl gwyng 한편 저는 문법 요소가 가능한 적어야 좋다고 생각합니다. 그래서 하스켈을 처음 봤을 때
Bool
이 라이브러리인 게 좋았어요.
data Bool = False | True
@curry박준규
@lionhairdino 종료 코드(Exit code)가 0이 아닐 때는 실패하는 방식이 없나요? Emacs는 그런 식으로 도니 Vim에도 있을법 한데...
@ailrunAilrun (UTC-5/-4)
@lionhairdino Vim에 그런 방식은 없는 것 같습니다. 대신
v:shell_error
를 검사해서 종료 코드가 0이 아닐 때는 명령을 실행하지 않는 코드를 작성하거나 autocmd
를 사용하면 된다고 하네요.(ChatGPT가)
한편 종료 코드를 확인하는 방법을 처음 알았습니다.
echo $?
자기 전에 그래도 한 챕터를 다 읽고 연습 문제까지 풀었다. 다음 챕터부터는 그 유명한 STM을 다룬다!
@curry박준규 보통 HLS에 붙어 있는 것 쓰는데, 그리 단독으로도 쓰는 군요. 근데, 코드를 지운다니 살짝 무서운데요.
@lionhairdino
:%!foo
가 파일의 전체 내용을 foo
의 출력으로 대체하는 방식이다 보니 그런 것 같습니다.
Vim에서 첫 행으로 갈 때 매번 1G
했는데 그냥 gg
하면 된다니!
하스켈 코드 포매터 stylish-haskell
을 잘 쓰고 있습니다. Vim에서 :%!stylish-haskell
이라고 입력하는 방식으로 사용하는데요, 코드에 문제가 있을 경우 코드 전체가 지워지고 다음과 같은 문자열로 대체됩니다.
<string>:1:18: error: [GHC-58481] parse error on input `!'
Vim에서 작업 중이므로 단순히 u
를 눌러서 취소하면 되긴 합니다만 혹시 다른 방법이 있을까요?
패키지 문서를 읽다가 Vim에 :set formatprg
와 gq
라는 게 있다는 걸 알았습니다. 이제 굳이 :%!foo
하지 않아도 되겠어요.
https://github.com/haskell/stylish-haskell?tab=readme-ov-file#vim-integration
하스켈 코드 포매터 stylish-haskell
을 잘 쓰고 있습니다. Vim에서 :%!stylish-haskell
이라고 입력하는 방식으로 사용하는데요, 코드에 문제가 있을 경우 코드 전체가 지워지고 다음과 같은 문자열로 대체됩니다.
<string>:1:18: error: [GHC-58481] parse error on input `!'
Vim에서 작업 중이므로 단순히 u
를 눌러서 취소하면 되긴 합니다만 혹시 다른 방법이 있을까요?
curl --http1.1 --dump-header - http://localhost:8000
--http1.1
처럼 버전을 정할 수 있다.--dump-header <filename>
으로 헤더를 파일로 저장할 수 있는데 파일 이름 대신-
를 적으면 헤더를 화면에 출력한다.
책[1]에서 문자열을 다룰 때 StrictText
와 Builder
의 성능을 비교하는 예제에서 Builder
의 성능이 더 좋다고 설명한다. 그런데 내 PC에서 같은 코드를 실행했는데 결과가 반대로 나왔다. 이상해서 문자열 길이를 늘렸더니 책에서 말한대로 나왔다.
ghci> concatSpeedTest 50000
0.004451s
0.04721s
ghci> concatSpeedTest 500000
0.062405s
0.023449s
ghci> concatSpeedTest 5000000
0.511402s
0.205632s
Chris Martin, Julie Moronuki, 《Sockets and Pipes》 ↩︎
Yacc와 같은 파서 제네레이터에 BNF를 넣으면 파서 코드가 자동으로 생성된다. 그런데 HTTP나 ActivityPub 등의 프로토콜 스펙을 입력으로 넣으면 자동으로 코드를 구현해주는 도구 어디 없나?
오, 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|] <>
| ^^^^^^^^^^^^^^^^
‘아스키 글자가 아닌 것’이라고 적어야 하는데 잘못 적었네.
오, 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|] <>
| ^^^^^^^^^^^^^^^^
HTTP 요청에서 이름과 값의 쌍을 필드(fields)라고 부르는구나!
HTTP를 다룬 RFC 중 2022년에 9110과 9112가 나오면서 1999년에 나온 2616과 2014년에 나온 7230은 쓸모없어졌다고 한다.
책을 읽고 있는데 고퍼(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
디스코드 서버 ‘하스켈 학교’에 오랜만에 뉴비가 오셔서 질문을 해주셨는데 내가 너무 신나서 횡설수설 하는 중⋯
ChatGPT에게 뭐만 물어보면 “좋은 질문이에요!”라고 말하는데 은근히 기분이 좋다.
여러분 darcs pull
한 다음에 바로 darcs revert
하지 마세요! 패치 로그는 남아 있는데 코드만 사라집니다!(너 말고 아무도 darcs 안 쓰니까 괜찮아⋯)
darcs show dependencies
라고 입력하면 다음과 같이 Graphviz DOT 코드를 출력해준다!
(해커즈 퍼브에서는 graphviz를 지원합니다!)
아, 그리고 패치 전달할 때 저장소를 명시하지 않았는데 대충 알아서 해주더라!
darcs show dependencies
라고 입력하면 다음과 같이 Graphviz DOT 코드를 출력해준다!
(해커즈 퍼브에서는 graphviz를 지원합니다!)
darcs pull
또는 darcs push
로 서로 다른 저장소의 패치를 전달하려고 하는데 단일 패치 해시를 지정했는데 darcs가 자꾸 다른 패치를 가져오려고 했다.
‘버그인가⋯ 못쓰겠네⋯ 이래서 사람들이 안 쓰는 건가?’
그런데 ChatGPT에게 물어보니 패치간 의존성이 있기 때문에 그 패치를 먼저 가져오려고 하는 것일 수 있다고 한다. darcs는 어떻게 패치간 의존성을 파악할 수 있는 거지? darcs 의심한 내가 나빠.
아, 그리고 패치 전달할 때 저장소를 명시하지 않았는데 대충 알아서 해주더라!
darcs pull
또는 darcs push
로 서로 다른 저장소의 패치를 전달하려고 하는데 단일 패치 해시를 지정했는데 darcs가 자꾸 다른 패치를 가져오려고 했다.
‘버그인가⋯ 못쓰겠네⋯ 이래서 사람들이 안 쓰는 건가?’
그런데 ChatGPT에게 물어보니 패치간 의존성이 있기 때문에 그 패치를 먼저 가져오려고 하는 것일 수 있다고 한다. darcs는 어떻게 패치간 의존성을 파악할 수 있는 거지? darcs 의심한 내가 나빠.
darcs pull
을 처음으로 해봤다. git에서처럼 뭔가 merge commit을 따로 해야되는 줄 알았는데 패치 자체가 커밋 로그에 바로 기록되더라.
@lionhairdino
@fwangdo 오랜만이네요 반갑습니다
@kodingwarriorJaeyeol Lee 일단 차단 구현하면서 관련 로직도 점검하도록 하겠습니다!
@hongminhee洪 民憙 (Hong Minhee)
@kodingwarriorJaeyeol Lee
버그가 아니라 기능입니다!(아님)
여기에서는 트위터보다 조금 더 편하게 글을 써보려고 합니다. 해커스펍 가입해놓고 글 하나 안 올렸었네요.
메타적인 얘기지만, 저는 오늘 “Kubernetes는 적정 기술인가?”라는 떡밥이 Hackers' Pub 내부적으로 발생했다는 사실이 아주 기쁩니다. 여태까지는 Hackers' Pub 자체에 대한 떡밥이거나, GeekNews나 X에서 넘어온 떡밥이었거든요.
@hongminhee洪 民憙 (Hong Minhee) 그 시작이 바로 이 글이군요. 감사합니다. 우죽 님!
@saschanazKAGAMI🏳️🌈🏳️⚧️ 그게 제일 바람직하다는 것에 저도 동의해요. 다만 현실적으로는 아무래도 DB라든지 MQ라든지 이것저것 같이 띄워야 하다 보니, 서비스 운영을 하려다 보면 그런 전체 형상 관리를 위한 추상화 계층이 있기는 있어야 하는 것 같아요. 물론 도커 컴포즈를 안 쓰고 앤서블로 그런 모든 것을 관리할 수도 있고, 아예 닉스나 닉스오에스를 써서 더 아름답게 할 수도 있겠습니다만... 도커 컴포즈 정도면 타협 가능한 것으로...
@xtjuxtapose
@saschanazKAGAMI🏳️🌈🏳️⚧️ 외쳐요,
nix run
!
에모지 반응 기능이 배포되었습니다. 당분간 버그가 좀 있을 수도 있지만 양해 바랍니다. 전 이제 차단을 구현하러 가겠습니다…
@hongminhee洪 民憙 (Hong Minhee) pub
- ‘좋아요’와 에모지는 다른 거라고 생각했는데 우리인생 계정으로 로그인한 팬피에서 누른 ‘좋아요’가 해커즈 퍼브에서도 보이네요.
- 반면에 팬피에서는 해커즈 퍼브에서 눌린 ‘좋아요’가 안 보입니다.
같은 것과 같지 않은 것에 대해서 짤막한 글을 써 보았습니다. 오랜만에 국어로 쓰는 글이라 잘 읽힐지 모르겠네요.
@ailrunAilrun (UTC-5/-4) 재밌게 잘 읽었습니다. 걱정하신 것과 다르게 저에게는 쓰신 글이 술술(?) 잘 읽혔어요. 이제 다음 글은 Dependent Haskell인가요!
@curry박준규 그렇군요. 저는 기본적으로 "조용히 공개"를 항상 사용할 것 같은데, 기본으로 설정하는 방법이 있으면 좋겠네요.
@ailrunAilrun (UTC-5/-4)
@hongminhee洪 民憙 (Hong Minhee) 말씀하신 그대로 이루어질 것입니다!
@ailrunAilrun (UTC-5/-4) 저도 궁금해서 질문을 했었습니다!
@ailrunAilrun (UTC-5/-4) 저도 제대로 이해했는지 모르겠지만 이런 게 아닐까 합니다.
기능이 여럿 있는데, 그 상세를 잘 모르겠는 것이 많군요. 이를테면 "공개"와 "조용히 공개"의 차이점이 제게는 직관적이지 않네요. 무슨 차이인지 아시는 분이 있다면 알려주시면 감사하겠습니다.
@ailrunAilrun (UTC-5/-4) 저도 궁금해서 질문을 했었습니다!
줄리 모로누키(Julie Moronuki) 님이 원래 언어학을 전공하셔서 그런지 글을 참 잘 쓰시는 것 같고 그 필력으로 하스켈 책을 세 권이나 써주셔서 너무 감사하다. 새로운 콘텐츠를 만들어 주시기를 고대하고 있는데 최근 어떻게 지내시는지 너무 궁금하다.
ChatGPT는 Moronuki가 일본식 성씨일 가능성을 제기했다.
그렇지 않아도 그의 블로그를 보니, 그가 일본에 방문해서 영어를 가르쳤던 경험이, 프로그래밍을 전혀 몰랐던 그로 하여금 하스켈을 대중에게 가르치는 사명을 일깨워준 계기가 된 것 같다.
만약 일본식 성씨가 맞다면 아마도 諸貫라고 쓰는 것 같다.
@ailrunAilrun (UTC-5/-4) 어서오세요. 반갑고 반갑습니다~
@lionhairdino
@ailrunAilrun (UTC-5/-4) 헉, 너무나 반가운 분이 오셨네요!
줄리 모로누키(Julie Moronuki) 님이 원래 언어학을 전공하셔서 그런지 글을 참 잘 쓰시는 것 같고 그 필력으로 하스켈 책을 세 권이나 써주셔서 너무 감사하다. 새로운 콘텐츠를 만들어 주시기를 고대하고 있는데 최근 어떻게 지내시는지 너무 궁금하다.
ChatGPT는 Moronuki가 일본식 성씨일 가능성을 제기했다.
그렇지 않아도 그의 블로그를 보니, 그가 일본에 방문해서 영어를 가르쳤던 경험이, 프로그래밍을 전혀 몰랐던 그로 하여금 하스켈을 대중에게 가르치는 사명을 일깨워준 계기가 된 것 같다.
만약 일본식 성씨가 맞다면 아마도 諸貫라고 쓰는 것 같다.
@arkjunJuntai Park
@xtjuxtapose 혹시 두 분 다 요즘 연합우주에서 세계적으로 화제(?)인 “Fediverse Chick Nicole”한테 DM을 받으셨나요…
@hongminhee洪 民憙 (Hong Minhee)
@arkjunJuntai Park
@xtjuxtapose 앗! 저도 4월 3일에 그분에게 DM을 받았습니다! 유명하신 분인가요?
패키지 저장소를 만지작거리다가 TUF(The Update Framework)라는 개념을 알게 되었다. https://gruuuuu.github.io/security/tuf/
회사에서 쓴 코드를 공개 저장소에 올릴 수는 없어서 hackage-server를 직접 돌려보기로 했다. 빌드할 때 의존성 맞추기가 어려울 것 같아서 속는 셈 치고 Nix를 써봤는데⋯ 한 번에 서버가 에러 없이 실행됐다. 이제 사내에서 하스켈 패키지 관리를 할 수 있다!(그런데 아무도 안 씀⋯)
어라, 그런데 명령줄에서 cabal upload
로 공개 저장소가 아니라 사설(?) 저장소에 업로드하려면 어떻게 해야 하지?
회사에서 쓴 코드를 공개 저장소에 올릴 수는 없어서 hackage-server를 직접 돌려보기로 했다. 빌드할 때 의존성 맞추기가 어려울 것 같아서 속는 셈 치고 Nix를 써봤는데⋯ 한 번에 서버가 에러 없이 실행됐다. 이제 사내에서 하스켈 패키지 관리를 할 수 있다!(그런데 아무도 안 씀⋯)
간혹 "이모지"가 아니라 "에모지"라고 쓰는 이유에 대한 질문을 받습니다. 여기다 써 두면 앞으로 링크만 던지면 되겠지?
요약: 에모지라서 에모지라고 씁니다.
"이모지"라는 표기는 아마도 "emoji"가 "emotion"이나 "emoticon"과 관련이 있다고 생각해서 나오는 것으로 보이는데요. "emoji"와 "emoticon"은 가짜동족어(false cognate)입니다. "emoji"는 일본어 絵文字(에모지)를 영어에서 그대로 받아들여 쓰고 있는 것입니다. 심지어 구성원리도 에모+지가 아니고 에+모지(絵+文字)입니다. "emotion"과 유사해 보이는 것은 순전히 우연일 뿐, 계통적으로 전혀 아무 상관이 없습니다. "이모티콘"과 "이미지"의 합성어가 아닙니다. (그랬으면 "-ji"가 아니라 "-ge"였겠죠.)
그리고 그렇기 때문에 에모지를 에모지로 표기할 실익이 생깁니다. :)
, ¯\_(ツ)_/¯
, ^_^
등은 이모티콘입니다. 반면 😂는 명확히 에모지입니다.
프로그래머에게 이건 정말 중요한 구분입니다. "이모티콘을 잘 표현하는 시스템"과 "에모지를 잘 표현하는 시스템"은 전혀 다른 과제이기 때문입니다. 에모지는 "그림 문자"라는 원래 뜻 그대로, 어떤 문자 집합(예를 들어 유니코드)에서 그림 문자가 "따로 있는" 것입니다. 내부 표현이야 어떻든, 적어도 최종 렌더링에서는 별도의 글리프가 할당되는 것이 에모지입니다. "무엇이 에모지이고 무엇이 에모지가 아닌가"는 상대적으로 명확합니다(문자 집합에 규정되어 있으니까).
반면 이모티콘은 "무엇이 이모티콘인가?"부터 불명확합니다. 우선 대부분의 이모티콘은 이모티콘이 아닌 문자를 조합하여 이모티콘이 만들어지는 형식입니다. 예를 들어 쌍점(:
)이나 닫는 괄호()
)는 그 자체로는 이모티콘이 아니지만 합쳐 놓으면 :)
이모티콘이 됩니다. 하지만 조합에 새로운 의미를 부여했다고 해서 다 이모티콘이라고 부르지도 않습니다. -_-
같은 것은 대다수가 이모티콘으로 인정하지만, ->
같은 것은 이모티콘이라고 부르지 않는 경향이 있습니다.
-
문자와 >
문자에는 화살표라는 의미가 없기 때문에, ->
조합과 화살표의 시각적 유사성에 기대어 화살표라는 새로운 의미로 "오용"한 것은 이모티콘의 구성 원리에 해당합니다. 하지만 화살표는 인간의 특정한 정서(emotion)에 대응하지 않으므로 이모티콘이라고는 잘 부르지 않습니다. 그렇다고 얼굴 표정을 나타내야만 이모티콘인가 하면 그렇지도 않습니다. orz
같은 것은 이모티콘으로 간주하는 경향이 있어 보입니다. 오징어를 나타내는 <:=
는 이모티콘인가? 이모티콘이 맞다면, 왜 ->
는 이모티콘이 아니고 <:=
는 이모티콘인가? 알 수 없습니다. ㅋㅋ
과 ㅠㅠ
는 둘 다 정서를 나타내는데, ㅠㅠ
만이 아이콘적 성질을 가지므로 이모티콘이고 ㅋ
는 이모티콘이 아닌가? 알 수 없습니다. 만약 ㅋ
만 이모티콘이 아니라고 한다면, ㅋ큐ㅠ
에서 큐
는 이모티콘인가 아닌가?? 알 수 없습니다. 이 알 수 없음은 이모티콘의 생래적 성질입니다. 어쩔 수 없죠.
패키지 저장소에 내가 만든 패키지를 업로드해보니까 다음과 같이 코딩말고도 할 게 꽤 많다.
- 저장소 계정 만들고 권한 승인 받기[1]
- 라이브러리 코드에 주석 적기
- 라이선스 정하기
- 소스 코드 저장소 정하기
- 커밋 메시지 적기
- 체인지로그 적기
- 테스트 코드 적기
- 버전 관리하기[^4]
LLM 덕분에 영어로 적어야 하는 문서 대부분은 어렵지 않게 할 수 있었다. LLM 때문에 바보 된다는 말도 많지만 영어 때문에 주저 했던 작업을 쉽게 시작할 수 있었다는 점에서 확실히 진입 장벽은 낮아졌다.
앞으로 더 해볼 일은 특정 배포판에 패키지를 배포하는 일이다. 해키지에서 지원하는 배포판은 다음과 같다.
- Arch
- Debian
- Fedora
- FreeBSD
- LTS
- LTSHaskell
- NixOS
- Stackage
- openSUSE
도전 과제로 위에 적은 모든 배포판에 내가 만든 패키지 배포해보는 것도 재밌겠다. LTS, LTSHaskell은 뭔가 했는데, 스태키지(Stackage)에 패키지 업로드하는 방법을 안내한 문서를 보니까 스태키지의 저장소 종류인 것 같다.
한편 해커즈 퍼브의 홍민희 님도 헤비(?) 하스켈 패키지 업로더이신데 예를 들어 seonbi도 사실 하스켈 패키지이다.
해키지 업로더 계정이 필요하신 분은 나와 홍민희 님을 멘션하면 이미 두 명의 승인은 따 놓은 당상이다.
해키지에서는 가입 후 기존 해키지 업로더 2명의 승인이 필요하다. ↩︎