Profile img

박준규

@curry@hackers.pub · 304 following · 156 followers

darcs hub
hub.darcs.net/vincent
Hackage
hackage.haskell.org/user/JoonkyuPark
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대 후반, 기혼, 자녀는 셋(둘째와 셋째는 쌍둥이) 있습니다. 경기도에 살고 있습니다.
17

해커즈 퍼브에 사람이 많아져서 더 이상 일일히 모든 사람을 내 홀로(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

엔드포인트 솔루션이나 네트워크 장비를 운영하다 보면 그 솔루션 본연의 역할을 지고지순(?) 하게 지키기보다는 뭔가 민원을 해결하는 예외 처리에 리소스를 투입할 때가 많은데 그럴 때마다 뭔가 법을 어긴 것 같고 마음이 안 좋다.

7
1
9

책 읽다가 생소한 게 나와서 적어 본다.

패키지 attoparsec에 있는 함수 parseOnly는 청크 한 개만 다룰 수 있고 나머지 청크는 버린다. 이러면 스트림 데이터를 읽을 수가 없다. 이때 모듈 Data.Attoparsec.ByteString.Run에 있는 다음 도구를 사용하면 된다.

parseAndRestore :: Monad m =>
  RestorableInput m ByteString -> Parser a -> m (Either ParseError a)
data RestorbleInput m i = RestorableInput
  (m i)       -- ^ Get the next chunk of input, or an empty string if there is no more
  (i -> m ()) -- ^ Push a nonempty chunk of input back to the input stream
newRestorableIO
  :: IO i  -- ^ Get the next chunk of input, or an empty string if there is no more
  -> IO (RestorableInput IO i)

RestorableInput IO ByteStringByteString 청크 스트림을 표현한다. 이게 일종의 가변 상태를 가지고 있다. 이 가변 상태가 있기 때문에 앞에서 읽었지만 소모되지 않은 청크를 버리지 않고 입력에 다시 넣는 방식을 쓰는 것 같다.

이런 방식을 Incremental parsing이라고 하는 것 같다.

5
5
2
2

책 제목에 포함되어 있는 단어이자 패키지 이름인 pipes가 도대체 뭐하는 건지 감이 안 잡혔는데 드디어 해당 챕터에 돌입했다. 대충 보니 스트리밍 데이터를 처리하는 패키지인 것 같다. 라이브러리 제작자가 가브리엘라 님이라니!

‘스트리밍’이라는 단어를 많이 들어보고 많이 써왔는데 정확한 의미는 뭔지 몰랐다. 스트리밍은 큰 데이터를 잘라서 전달하는 것을 의미하는 것 같다.

https://hackage.haskell.org/package/pipes

2
2

책에 나온 예제를 따라 하는데 결과가 책과 달라 이상했다. 코드를 한참 보다가 결국 원인을 찾았다. if 분기의 결과를 반대로 적었던 것이다.

repeatUntil
  :: Monad m
  => m chunk
  -> (chunk -> Bool)
  -> (chunk -> m ())
  -> m ()
repeatUntil getChunk isEnd f =
  repeatUntilNothing getChunkMaybe f
  where
    getChunkMaybe = do
      chunk <- getChunk
      if isEnd chunk
        then return (Just chunk)
        else return Nothing

청크가 없으면 Nothing을 리턴해야 하는데 반대로 적어버린 것이다. 덕분에 시간이 모자라서 남은 연습 문제 하나는 내일로 미뤄야겠다.

5

오늘 읽을 챕터 제목은 ‘스트리밍(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

책 한 챕터 다 읽었다. 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