Profile img

박준규

@curry@hackers.pub · 318 following · 169 followers

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

하스켈에서 레코드 타입을 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
3

하스켈에서 Either a bToJSON 인스턴스 구현이 약간 애매하다.

json 객체의 키 값으로 "Left""Right"를 넣는 것 같다. 그런 방식으로 사용하는 사람은 거의 없을 것 같은데... 아무튼 그래서 newtype은 쓰지 않고 인스턴스를 오버라이딩 하고 싶은데 대충 찾아보면 인터넷이나 LLM의 첫번째 대답은 OverlappingInstances 확장을 쓰라고 안내하는데 이건 deprecated 됐다. 대신 다음과 같은 프라그마(pragma)를 쓰면 된다.

  • OVERLAPPING
  • OVERLAPPABLE
  • OVERLAPS

프라그마는 확장과 다른데 확장은 확장을 적은 파일 전체에 적용되지만 프라그마는 해당 인스턴스에만 적용된다.

다음과 같이 사용한다.

instance {-# OVERLAPPING #-} ToJSON a => ToJSON (Either Foo a) where
  toJSON = ...

이렇게 하면 고아[1]를 만들었다며 컴파일러가 내 인성을 비난하겠지만 Either a b를 통째로 오버라이딩 한 것도 아니고 별로 문제가 될 것 같진 않다.


  1. 하스켈에서 타입이나 클래스가 정의된 모듈이 아닌 곳에 인스턴스를 선언할 때 그 인스턴스를 Orphan(고아) 인스턴스라고 한다. ↩︎

6
5
4

lens 라이브러리의 타입들은 optics(광학기구)라고 불립니다. 여기에는 Prism, Lens, Iso, Traversal, Fold, Getter, Setter 같은 것들이 포함됩니다. 이 이름들 중 일부는 빛의 굴절에 대한 말장난에서 비롯되었습니다. 예를 들어, 렌즈(lens)는 망원경이 풍경의 작은 일부를 시야 가득히 채워 보이게 해주는 것이고, 프리즘(prism)은 흰빛을 분리하여 그 구성 색들을 드러내 줍니다. 어느 정도는 은유가 담겨 있지만, 이런 이름들은 깨달음을 주기보다는 귀여운 쪽에 가깝습니다. 따라서 이름 자체에 너무 깊이 집중하는 것은 권하지 않습니다.

— 《Finding Success (and Failure) in Haskell》, 158쪽

6

이거 위험하지 않나... 관리 주체가 어딜까? 경찰이 하나?

3

너무 이른 시점에 일반화를 걱정하는 것은 위험할 수 있습니다. 자신이 코드를 작성하든 다른 사람의 코드를 이해하려 하든, 우리는 이 책에서 취한 접근 방식을 따를 것을 권장합니다. 즉, 일반적인 것부터 시작하지 말고 구체적인 예시부터 시작하세요. 그런 다음 그들이 어떤 측면을 공유하는지 관찰하세요. 학습자로서 이러한 순서는 더 쉬운 구체적인 예시를 토대로 더 어려운 추상적 개념을 이해할 기회를 더 많이 제공합니다. 저자로서 이러한 순서는 더 추상적인 발상이 타당성을 갖고 목적을 지닐 수 있도록 도와줍니다.

— 《Finding Success (and Failure) in Haskell》, 149쪽

6

하스켈은 이렇게 씁니다! 참 쉽죠!

main = do
  putStrLn "What is your name?"
  name <- getLine
  putStrLn ("Hello, " ++ name)
4
2
0

우리의 동료가 돼 주세요 케데헌의 열풍으로 우리나라에서 돈 쓰고 싶어하는 외국인들이 엄청나게 많아지고 있습니다. 전 세계가 우리나라 상대로 몰카 찍는 이 판국에 외국인 결제가 막혀있다는건 말이 안됩니다. 외국인 온라인 결제를 뚫어버리는 토모로우에서 혁신을 함께할 개발자 동료를 모십니다. 1. 무슨 일 하나요? 저희는 국가별로 신분증 데이터베이스… | Chanwoo Lee

우리의 동료가 돼 주세요 케데헌의 열풍으로 우리나라에서 돈 쓰고 싶어하는 외국인들이 엄청나게 많아지고 있습니다. 전 세계가 우리나라 상대로 몰카 찍는 이 판국에 외국인 결제가 막혀있다는건 말이 안됩니다. 외국인 온라인 결제를 뚫어버리는 토모로우에서 혁신을 함께할 개발자 동료를 모십니다. 1. 무슨 일 하나요? 저희는 국가별로 신분증 데이터베이스 접근 권한 계약을 해와서 DB 검증 기반 외국인 신분증 인증 서비스를 만들고 있습니다. 기본 웹서비스, 보안, 결제 시스템, 인증 시스템, DB 설계 및 튜닝 등 꽤 복잡한 시스템을 만들고 있고 그에 비해 기술 부채가 거의 없어서 개발 맛이 정말 좋은 팀입니다. 2. 배울 수 있는게 있을까요? 반 년만에 5배 성장을 이뤄냈고 이제 개발에 집중 투자하고 있습니다. 철저히 문제 해결 중심으로 돌아가기 때문에 다른 조직에서 경험하지 못하는 엄청난 속도감과 성장을 경험할 수 있습니다. 극강의 효율을 추구하는 팀이고, 우아한 코드 작성은 덤입니다. 3. 어떤 사람을 찾고 있나요? 공통 기본 스탯 2가지 - 과몰입, Just do it 정신을 겸비한 하드워커 - 함수형 프로그래밍 경험자 특수 스킬 택 1가지 - 하스켈 프로그래머 - AWS 아키텍트 - 보안 전문가 4. 복지는? - 4대보험 - 아침, 점심 샐러드 도시락, 야근 시 저녁 추가 제공 - 기후동행카드 지원 5. 연봉은? 최대 6,000 내에서 협의합니다. 실력, 마인드셋 등을 고려하여 차등 제안합니다. 압도적인 팀을 만들고 있습니다. 코딩하면서 심장이 뛰는 팀에서 일하고 싶으신 분은 지체없이 메시지 주세요.

kr.linkedin.com

3
4

댓글에 하스켈 욕이 보여서 마음이 안 좋다. 나는 대용량 파일을 다루지는 않지만 한국의 회사원이라 평문이 아닌 문서를 많이 다룬다.(hwp, xlsx 등) 윈도우 다운로드 폴더에 몇 번이고 받은 중복 파일들을 어떻게 다루면 좋을지 고민 중이었는데 git-annex를 써봐야겠다!

4

작년에 어떤 커뮤니티에 계엄 소식을 전했는데 “여기서 정치적인 발언은 하지 말아주세요.” 라는 말을 들었다.

5

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").
4

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.
3

남는 노트북에 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

고작 노트북 한 대인데 전기비 많이 나오진 않겠지?

10
4
0
1

회사 근처 알라딘에 가서 다음과 같이 책 두 권을 샀습니다.

  • 로버트 A. 하인라인, 안정희, 《달은 무자비한 밤의 여왕》
  • 앤디 위어, 남명성, 《아르테미스》
5
5
9

  • 중국어를 전공했습니다.
  • 전역하자마자(금요일 전역, 월요일 출근) 강원도에서 제약 영업을 1년 4개월 정도 했습니다.
  • 컴퓨터 학원을 1년 정도 다니면서 정보보안 스터디를 했습니다.
    • 이때 Python, C, Java순으로 프로그래밍을 처음 접했습니다.
  • 정보보안 관제 회사에서 고객사에 파견 나가 악성코드 대응 업무를 4년 정도 했습니다.
    • 이때 개발자가 되고 싶어서 C++ 코리아 스터디에 몇 번 참석했는데 여기서 운명의 ‘모나드’라는 단어를 처음 접하고 하스켈 공부를 시작했습니다.
  • 기업에서 정보보안 담당자 7년 차로 일하고 있습니다.
    • 코딩은 취미로 하거나 혼자만 하는 소소한 업무 자동화에 활용하고 있습니다.
  • 풀타임 개발자와 오픈소스 메인테이너의 삶을 동경하고 있습니다.
  • 주로 Windows에서 Putty로(80x24, Consolas) 리눅스 서버에 붙어서 Vim을 사용합니다. Visual Studio Code를 잠깐 써봤는데 다시 Putty로 돌아왔습니다.
  • 집에서는 몇 년 전 중고로 산 MacBook Air M1을 사용하고 있습니다.
  • 회사에서는 몇 년 전 중고로 산 HHKB를 씁니다.
  • 30대 후반, 기혼, 자녀는 셋(둘째와 셋째는 쌍둥이) 있습니다. 경기도에 살고 있습니다.
18

해커즈 퍼브에 사람이 많아져서 더 이상 일일히 모든 사람을 내 홀로(Hollo) 계정에서 팔로우 할 수 없게 됐다. 마침 레일웨이 구독 비용도 생각보다 많이 나와서 구독을 해지했다. 최소 비용 5 달러는 이미 결제했기 때문에 6월 22일까지는 계정을 유지할 수 있을 것 같은데 그 전에 백업을 잊지 않고 해야겠다.(글이 많진 않지만 그냥 없애기는 아쉽다.) 서비스 종료된 인스턴스의 핸들을 멘션하면 무슨 일이 벌어질까? 발신자 인스턴스에만 글이 남게 되는 걸까?

2
8
2

‘그냥 tryAny 쓰면 예외는 다 잡을 수 있는 거 아닌가? 왜 ResourceT를 써야 하지?’라고 생각했는데 찾아보니 tryAny로는 비동기 예외를 잡을 수 없다고 한다.

writeGreetingSafeAttempt :: IO ()
writeGreetingSafeAttempt = do
  dir <- getDataDir
  h <- IO.openFile (dir </> "greeting.txt") WriteMode
  _ <- tryAny do
    IO.hPutStrLn h "hello"
    IO.hPutStrLn h "world"
  IO.hClose h
4
4
5

액티비티퍼브에 Place가 있어서 사람들이 위치 공유도 하고 장소에 ‘좋아요’도 누르듯이 Book도 있으면 재밌겠다. 사람들이 좋아하는 책에 ‘좋아요’도 누르고 서로 연결도 시켜주고!

6
3
4
0

저는 소셜 서비스의 핵심이 ‘좋아요(Like)’라고 생각합니다. 저는 제가 페이스북에서 처음으로 ‘좋아요’를 많이 받아서 너무 신났던 감정을 잊을 수 없습니다. 그리고 저는 지금도 ‘좋아요’의 노예⋯(사람들은 그런 너를 관종이라고 부른단다.)

actor가 object를 좋아한다는 의미의 관계를 나타낸 다이어그램. 'actor'와 'object'라는 두 개의 타원형 노드가 있고, 'Like'라는 레이블이 붙은 화살표가 'actor'에서 'object'로 향하고 있습니다.
7
0
3