박준규
@curry@hackers.pub · 320 following · 175 followers
darcs hub
- hub.darcs.net/vincent
Hackage
- hackage.haskell.org/user/JoonkyuPark
연합우주라는 번역은 어느 분이 처음 하셨나요? 엄청난 초월 번역인 것 같습니다. 한편 Gemini 프로토콜을 통해 제공되는 모든 파일의 전체 모음을 Geminispace라고 부르는데 어떻게 번역하는 게 좋을까요?
hocket이라고 지어야...
gemini://에서는 인라인 링크도 인라인 코드 블록도 안 되는데 이게 읽기를 방해하지 않는다는 점이 좋다. goto 없는 마크다운이라고나 할까?
GBIC에
- 1310 nm라고 적혀 있으면 싱글이고
- 850 nm라고 적혀 있으면 멀티라고 한다.
광케이블의 직경을 의미하는데 단위는 나노미터이다. ... 인 줄 알았는데 찾아보니까 아니네. 직경이 아니라 파장이네.
Vim에서 Quickfix List라는 걸 처음 알게 되었다.
기존 코딩 흐름은
이랬는데 Quickfix List를 이용하면
이렇게 Vim을 나가지 않고도 빌드 결과를 확인하고 에러가 발생하면 그곳으로 바로 점프할 수 있다!
.vimrc에 이렇게만 적으면 된다.
set makeprg=cabal\ build
하스켈을 금지한다!
하스켈에서 다음과 같은 에러를 만날 경우에
withFile: resource busy (file is locked)
readFile 대신 readFile'을 써보셔요!
readFile은 lazy 버전이고readFile'은 strict 버전입니다!
System.IO 모듈 문서에 다음과 같은 설명이 있습니다.
경고:
readFile연산은 파일의 전체 내용을 모두 소비할 때까지 그 파일에 대해 부분적으로 닫힌(semi-closed) 핸들을 유지한다. 따라서 이전에readFile로 연 파일에 대해(writeFile등을 사용하여) 쓰기를 시도하면, 일반적으로isAlreadyInUseError오류와 함께 실패하게 된다.
liftIO에서 liftIO를 설명하면 재밌을 것 같은데 그러려면 모나드 트랜스포머를 설명해야 하고 그러려면 모나드를 설명해야 하고...
하스켈에서 레코드 타입을 json으로 인코딩할 때 타입이 Maybe인 필드의 값이 Nothing이면 그 타입의 값은 null로 변환된다.(deriving Generic 했다면)
이때 null이 아니라 해당 필드 자체를 포함하지 않게 하려면 다음과 같이 하면 된다.
{-# LANGUAGE TemplateHaskell #-}
import Data.Aeson.TH
data Foo = ...
deriveJSON defaultOptions { omitNothingFields = True } ''Foo
위와 같이 deriveJSON 했다면 기존에 선언했던 아래 구문은 지워야 한다.
instance FromJSON Foo
instnace ToJSON Foo
하스켈에서 Either a b의 ToJSON 인스턴스 구현이 약간 애매하다.
json 객체의 키 값으로 "Left"나 "Right"를 넣는 것 같다. 그런 방식으로 사용하는 사람은 거의 없을 것 같은데... 아무튼 그래서 newtype은 쓰지 않고 인스턴스를 오버라이딩 하고 싶은데 대충 찾아보면 인터넷이나 LLM의 첫번째 대답은 OverlappingInstances 확장을 쓰라고 안내하는데 이건 deprecated 됐다. 대신 다음과 같은 프라그마(pragma)를 쓰면 된다.
OVERLAPPINGOVERLAPPABLEOVERLAPS
프라그마는 확장과 다른데 확장은 확장을 적은 파일 전체에 적용되지만 프라그마는 해당 인스턴스에만 적용된다.
다음과 같이 사용한다.
instance {-# OVERLAPPING #-} ToJSON a => ToJSON (Either Foo a) where
toJSON = ...
이렇게 하면 고아[1]를 만들었다며 컴파일러가 내 인성을 비난하겠지만 Either a b를 통째로 오버라이딩 한 것도 아니고 별로 문제가 될 것 같진 않다.
하스켈에서 타입이나 클래스가 정의된 모듈이 아닌 곳에 인스턴스를 선언할 때 그 인스턴스를 Orphan(고아) 인스턴스라고 한다. ↩︎
- 하스켈 리포트: WellTyped에서 작성한 하스켈 생태계 활동 보고서
- 언어 서버: HLS(Haskell Language Server)
- 번역 링크: https://rosettalens.com/s/ko/haskell-ecosystem-report-june-august-2025
lens라이브러리의 타입들은optics(광학기구)라고 불립니다. 여기에는Prism,Lens,Iso,Traversal,Fold,Getter,Setter같은 것들이 포함됩니다. 이 이름들 중 일부는 빛의 굴절에 대한 말장난에서 비롯되었습니다. 예를 들어, 렌즈(lens)는 망원경이 풍경의 작은 일부를 시야 가득히 채워 보이게 해주는 것이고, 프리즘(prism)은 흰빛을 분리하여 그 구성 색들을 드러내 줍니다. 어느 정도는 은유가 담겨 있지만, 이런 이름들은 깨달음을 주기보다는 귀여운 쪽에 가깝습니다. 따라서 이름 자체에 너무 깊이 집중하는 것은 권하지 않습니다.
— 《Finding Success (and Failure) in Haskell》, 158쪽
이거 위험하지 않나... 관리 주체가 어딜까? 경찰이 하나?
너무 이른 시점에 일반화를 걱정하는 것은 위험할 수 있습니다. 자신이 코드를 작성하든 다른 사람의 코드를 이해하려 하든, 우리는 이 책에서 취한 접근 방식을 따를 것을 권장합니다. 즉, 일반적인 것부터 시작하지 말고 구체적인 예시부터 시작하세요. 그런 다음 그들이 어떤 측면을 공유하는지 관찰하세요. 학습자로서 이러한 순서는 더 쉬운 구체적인 예시를 토대로 더 어려운 추상적 개념을 이해할 기회를 더 많이 제공합니다. 저자로서 이러한 순서는 더 추상적인 발상이 타당성을 갖고 목적을 지닐 수 있도록 도와줍니다.
— 《Finding Success (and Failure) in Haskell》, 149쪽
하스켈은 이렇게 씁니다! 참 쉽죠!
main = do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Hello, " ++ name)
Either 씁시다. 너무 편합니다.
해커즈 퍼브 게시글에 이미지를 업로드하려면 어떻게 하나요?
git-annex 좀 설치해보려고 했더니 가는 날이 장날이라고 우분투 저장소가 점검 중인 것 같다. 그래, 나는 하스켈러이니까 그냥 빌드하자. https://status.canonical.com/
댓글에 하스켈 욕이 보여서 마음이 안 좋다. 나는 대용량 파일을 다루지는 않지만 한국의 회사원이라 평문이 아닌 문서를 많이 다룬다.(hwp, xlsx 등) 윈도우 다운로드 폴더에 몇 번이고 받은 중복 파일들을 어떻게 다루면 좋을지 고민 중이었는데 git-annex를 써봐야겠다!
작년에 어떤 커뮤니티에 계엄 소식을 전했는데 “여기서 정치적인 발언은 하지 말아주세요.” 라는 말을 들었다.
GHCup 오랜만에 다시 설치하는데 못보던 게 생겼다.
GHCup provides different binary distribution "channels". These are collections of tools
and may differ in purpose and philosophy. First, we select the base channel.
[S] Skip [D] Default (GHCup maintained) [V] Vanilla (Upstream maintained) [?] Help (default is "Skip").
GHCup 설치할 때마다 나오는 메시지인데 어디 기록할 곳이 없어서 여기에 적음.
System requirements
Note: You need the following packages: curl g++ gcc gmp make ncurses realpath xz-utils pkg-config. Consult your distro documentation on the exact names of those packages.
남는 노트북에 NixOS 설치하고 tailscaled 깔았다. 노트북 덮개를 덮어도 절전 모드가 되지 않게 설정하려고 삽질을 조금 했는데 결론은 다음과 같이 하면 된다.
먼저 /etc/nixos/configuation.nix에 다음과 같은 내용을 적는다.
services.logind.extraConfig = ''
HandleLidSwitch=ignore
HandleLidSwitchExternalPower=ignore
HandleLidSwitchDocked=ignore
IdleAction=ignore
IdleActionSec=0
'';
터미널에 다음과 같이 입력한다.
sudo nixos-rebuild switch
sudo systemctl restart systemd-logind
고작 노트북 한 대인데 전기비 많이 나오진 않겠지?
const light = 300000
@strikefreedom권용현 어서 오세요! 아이디는 건담 기체 이름인가요!
오오, 여기 하스켈 글도 많아! https://zenn.dev/topics/haskell
회사 근처 알라딘에 가서 다음과 같이 책 두 권을 샀습니다.
- 로버트 A. 하인라인, 안정희, 《달은 무자비한 밤의 여왕》
- 앤디 위어, 남명성, 《아르테미스》
웹핑거 사이트에 하스켈 클라이언트 링크를 추가하는 PR을 제출했다. PR은 바로 머지(merge) 되었는데 배포에 이슈가 있어서 아직 사이트에 반영되지는 않았다.
하스켈북의 저자에게 다음 책이 언제 나오냐고 물었더니 아이 넷 육아를 하느라 바빠서 계획이 없다고 한다. 아이가 넷이라니!(아이가 셋인 사람이 하는 소리) https://x.com/theodorvaryag/status/1933303607362715941
- 중국어를 전공했습니다.
- 전역하자마자(금요일 전역, 월요일 출근) 강원도에서 제약 영업을 1년 4개월 정도 했습니다.
- 컴퓨터 학원을 1년 정도 다니면서 정보보안 스터디를 했습니다.
- 이때 Python, C, Java순으로 프로그래밍을 처음 접했습니다.
- 정보보안 관제 회사에서 고객사에 파견 나가 악성코드 대응 업무를 4년 정도 했습니다.
- 이때 개발자가 되고 싶어서 C++ 코리아 스터디에 몇 번 참석했는데 여기서 운명의 ‘모나드’라는 단어를 처음 접하고 하스켈 공부를 시작했습니다.
- 기업에서 정보보안 담당자 7년 차로 일하고 있습니다.
- 코딩은 취미로 하거나 혼자만 하는 소소한 업무 자동화에 활용하고 있습니다.
- 풀타임 개발자와 오픈소스 메인테이너의 삶을 동경하고 있습니다.
- 주로 Windows에서 Putty로(80x24, Consolas) 리눅스 서버에 붙어서 Vim을 사용합니다. Visual Studio Code를 잠깐 써봤는데 다시 Putty로 돌아왔습니다.
- 집에서는 몇 년 전 중고로 산 MacBook Air M1을 사용하고 있습니다.
- 회사에서는 몇 년 전 중고로 산 HHKB를 씁니다.
- 30대 후반, 기혼, 자녀는 셋(둘째와 셋째는 쌍둥이) 있습니다. 경기도에 살고 있습니다.
해커즈 퍼브에 사람이 많아져서 더 이상 일일히 모든 사람을 내 홀로(Hollo) 계정에서 팔로우 할 수 없게 됐다. 마침 레일웨이 구독 비용도 생각보다 많이 나와서 구독을 해지했다. 최소 비용 5 달러는 이미 결제했기 때문에 6월 22일까지는 계정을 유지할 수 있을 것 같은데 그 전에 백업을 잊지 않고 해야겠다.(글이 많진 않지만 그냥 없애기는 아쉽다.) 서비스 종료된 인스턴스의 핸들을 멘션하면 무슨 일이 벌어질까? 발신자 인스턴스에만 글이 남게 되는 걸까?

