박준규

@curry@hackers.pub · 271 following · 128 followers

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

박준규 shared the below article:

힙스택 보존 법칙

RanolP @ranolp@hackers.pub

이 글에서는 프로젝트 진행 시 기술 스택 선정에 대한 경험적 법칙인 "힙스택 보존 법칙"을 소개하며, 힙한 기술 스택을 과도하게 선택할 경우 프로젝트가 산으로 갈 수 있음을 경고합니다. 저자는 신기술 도입 시 발생하는 호환성 문제와 그로 인한 추가 작업의 부담을 설명하며, 커뮤니티가 크고 성숙한 기술의 중요성을 강조합니다. 힙한 기술을 사용하더라도 프로젝트를 성공적으로 이끌 수 있는 두 가지 조건, 즉 기술의 안정성과 개발자의 숙련도를 제시하며, 힙스택을 사용하기 전에 충분한 학습과 경험을 통해 기술적 내성을 길러야 함을 역설합니다. 이 글은 기술 스택 선택의 중요성과 개발자의 역량 강화 필요성을 동시에 강조하며, 균형 잡힌 기술 스택 선택이 프로젝트 성공에 미치는 영향을 시사합니다.

Read more →
13
1
1

2020년의 하스켈에 대한 내 생각

박준규 @curry@hackers.pub

이 글은 하스켈이 30주년을 맞이한 2020년, 하스켈의 발전 방향에 대한 개인적인 생각을 담고 있습니다. 저자는 하스켈이 프로그래밍 언어 연구와 실제 애플리케이션 개발이라는 두 가지 목표를 동시에 추구해왔지만, 이제는 소프트웨어 개발자에게 유용한 기능에 집중해야 한다고 주장합니다. 특히 복잡한 타입 시스템보다는 사용자 편의성을 높이는 방향으로 개선되어야 한다고 강조하며, 제네릭스 활용과 유용한 확장 기능 활성화를 예시로 제시합니다. 또한, 애플리케이션 아키텍처 측면에서 의존성 주입 컨테이너를 활용한 단순한 구조를 제안하며, 타입 안정성을 약간 희생하더라도 테스트를 통해 충분히 보완할 수 있다고 말합니다. 결국, 저자는 "심플 하스켈" 또는 "지루한 하스켈"을 통해 얻을 수 있는 코드의 명확성과 개발의 즐거움을 강조하며, 하스켈 커뮤니티가 초보자에게 더 쉽게 다가갈 수 있도록 노력해야 한다고 역설합니다. 이 글은 복잡한 이론적 탐구보다는 실용적인 개발에 초점을 맞춘 하스켈의 미래를 제시하며, 독자에게 균형 잡힌 시각을 제공합니다.

Read more →
12
5
0

안녕하세요! Jeju.Social은 소셜 미디어 프로젝트로 만들어졌습니다. 제주의 친구, 가족, 기업이 안전하게 사진과 정보를 공유할 수 있는 온라인 커뮤니티입니다.

Hello! Jeju.Social was created as a social media project. It is an online community where friends, family, and businesses in Jeju can share photos and information safely. English friendly.

1
0

@hongminhee洪 民憙 (Hong Minhee) @bglbgl gwyng 지나가다 관심 있는 주제가 보여 의견을 드려보아요. 사실 전문가가 전문성을 발휘하는 데에는 암묵지가 많아도 문제가 없는데, 전문성을 남에게 설명하거나 교육해야 할 때에는 어려움을 크게 높이는 요소가 됩니다. 그래서 홍님이 말씀하신 암묵지를 이끌어내는 전문가들은 인지 작업 분석(CTA) 같은 기법을 사용하기도 하는데요. bgl 님이 멘토링을 하고 계신다는 걸 보면 이미 어떤 식으로든 교육을 위해 암묵지를 많은 부분 명시지화 하셨을 것 같기도 해요. 물론 홍님 말대로 암묵지는 암묵지인 것일 수도 있겠지만요. 😅

3

박준규 shared the below article:

나만의 연합우주 마이크로블로그 만들기

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

이 튜토리얼은 Fedify를 사용하여 ActivityPub 프로토콜을 구현하는 마이크로블로그를 만드는 과정을 안내합니다. Fedify는 연합 서버 앱 개발의 복잡성을 줄이고, 개발자가 비즈니스 로직에 집중할 수 있도록 돕는 TypeScript 라이브러리입니다. 튜토리얼에서는 Node.js, npm, Hono 등의 개발 환경을 설정하고, SQLite 데이터베이스를 구축하여 계정 생성, 프로필 페이지, 액터 구현, 암호 키 관리, 팔로우 기능, 게시물 작성 및 타임라인 구현 등 마이크로블로그의 핵심 기능을 단계별로 구현합니다. 특히 ActivityPub.Academy 서버를 활용하여 실제 연합우주 환경에서의 연동을 테스트하고, Mastodon과의 호환성을 확인합니다. 마지막으로, 보안 및 기능 개선을 위한 추가 과제를 제시하며, 독자가 프로젝트를 확장할 수 있도록 안내합니다. 이 튜토리얼을 통해 독자는 Fedify를 활용하여 ActivityPub 기반의 분산 소셜 네트워크 서비스를 구축하는 기본적인 이해를 얻을 수 있습니다.

Read more →
4

OX 테스트 당신은 책중독자인가?

박준규 @curry@hackers.pub

이 글은 톰 라비의 《어느 책중독자의 고백》을 인용하여 독자가 스스로를 "책중독자"로 진단해볼 수 있는 간단한 OX 테스트를 제공합니다. 모르고 같은 책을 두 번 산 적이 있는지, 표지 디자인만 보고 책을 구매한 적이 있는지 등 10가지 질문을 통해 독자 스스로가 책에 대한 애정을 어느 정도 가지고 있는지 되돌아보게 합니다. 이 테스트는 가벼운 마음으로 자신의 독서 습관을 재미있게 평가해보고, 책에 대한 애정을 다시 한번 확인하는 계기를 마련해줍니다.

Read more →
5
3
3

박준규 shared the below article:

How to pass the invisible

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub

This post explores the enduring challenge in software programming of how to pass invisible contextual information, such as loggers or request contexts, through applications without cumbersome explicit parameter passing. It examines various approaches throughout history, including dynamic scoping, aspect-oriented programming (AOP), context variables, monads, and effect systems. Each method offers a unique solution, from the simplicity of dynamic scoping in early Lisp to the modularity of AOP and the type-safe encoding of effects in modern functional programming. The post highlights the trade-offs of each approach, such as the unpredictability of dynamic scoping or the complexity of monad transformers. It also touches on how context variables are used in modern asynchronous and parallel programming, as well as in UI frameworks like React. The author concludes by noting that the art of passing the invisible is an eternal theme in software programming, and this post provides valuable insights into the evolution and future directions of this critical aspect of software architecture.

Read more →
11
1
0
9
6

뭔가를 잘 설명하는 방법에 대해 생각해봤는데. 일단 내가 어떤 내용을 말하고 싶은 욕구를 참아내야다. 어떤 재치있는 비유를 꼭 써야겠다거나, 아니면 '통찰'을 전달하고 싶다거나.

대신 상대방의 무지에 공감해야한다. 그 무지란게, 많은 경우 진짜 멍청해서 그런게 아니라, 대충 얼개는 파악하고 있음에도 뜬금없는 부분에서 뜬금없는 오해를 하고 있어서 완전한 이해를 막는다거나 하는 경우가 많다. 그래서 그 귀여운 멍청을 함께 디버깅해야한다. 요게 지식뿐만 아니라 공감능력이 필요한 부분.

6

오늘 올라온 그알싫 리명박근혜스쿨 댓글공작 3편 말미에 NED(National Endowment for Democracy, 전미 민주주의 기금)이 극우단체로 유입되었을 가능성 이야기가 나옵니다. 아마 99% 맞을겁니다. 왜냐하면 제가 예전에 국민의힘, 당시엔 자유한국당이었죠. 지역 조직에서 미국 정부가 운영하는 인권, 민주주의 등등의 지원 사업에 당원을 동원해서 신청을 넣고, 자금을 받아온다는 실무자의 거의 확실한 증언을 입수한 적이 있기 때문입니다 -_-

1
0

Hackers' Pub에 로그인한 상태에서의 타임라인 구성을 조금 바꿔봤습니다. 기존의 “연합우주” 탭을 “피드”라고 수정했고, “연합우주” 탭과 “Hackers' Pub” 탭은 기본적으로 로그아웃했을 때의 “연합우주” 및 “Hackers' Pub” 탭과 동일한 타임라인이 표시되게 했습니다. 아직 팔로를 많이 하지 않은 분들에게는 “연합우주” 및 “Hackers' Pub” 타입라인이 새로운 콘텐츠를 발견하기 좋은 공간이 될 겁니다.

11
1
5

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

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

그리고 하스켈 클라이언트 예제 코드에 해커즈 퍼브 주소를 은근히 적어 넣었다!(깨알 광고)

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Data.Default
import Web.Finger.Client

query :: Query
query = def { qryTarget = resource }
  where
    resource = ResAccount (Account "curry" "hackers.pub")

main :: IO ()
main = do
  manager <- newManager
  result <- webfinger manager query
  print result
10
5
2
3
1
2

이것은 첫 번째 포스트가 아닙니다.

거짓말입니다. 사실 첫 번째 포스트입니다. 마크다운을 지원하네요.

포스트 언어 설정이 되네요.

설정에 AI 요약 설정이 있던데 그 관련일지, 단순히 같은 언어를 쓰는 사람들끼리 서로 노출시키기 쉽게 하기 위해서인지는 아직 잘 모르겠지만 쓰다 보면 알게 되겠죠.

평소 프로필 설정을 잘 안 하는 편인데

  • 여기선 인원이 많지 않아 서로 알아봐야 할 필요성이 더 높아서
  • 웬만하면 해두는 게 좋겠군요.
  • 뭐라고 쓸지 고민해봐야겠군요. 쓸 말이 많지야 않겠지만...

의외로 수식까지 지원하네요.

eiπ=1e^{i\pi} = -1

iddtψ=Hψi\hbar \frac{d}{dt} \left\vert \psi \right\rangle = H \left\vert \psi \right\rangle

5
0
9
2
3
4
0
5

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

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

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

2

프로그래밍 입문… 저는 AUTOEXEC.BAT을 수정하면서 코딩 비슷한 걸 시작한 것 같아요. 주로 아버지가 짜 둔 MS-DOS 배치 파일을 고치면서 놀았었고, 나중에는 90년대 말에 개인 홈페이지 붐이 오면서 HTML을 다루기도 했습니다. 게시판을 붙이고 싶어서 Perl을 조금 배웠고, 금방 PHP로 넘어가서 제대로 된 프로그래밍을 시작하게 됐네요. (“제대로 된”이라고 하는 이유는 그 전까지는 반복문을 다루지 못했기 때문에.) 그 뒤로 중학생이 된 뒤로는 JavaScript를 배웠고, 고등학생 때는 C/C++와 Python, Ruby 같은 걸 배웠던 것 같습니다.

1

평소에 함수형 언어 매니아들이 주장하는만큼 이펙트를 엄격하게 구분하는게 중요하다곤 생각안했는데, local first 앱을 만들다가 네트워크 요청을 포함한 IO와 그렇지 않은 IO를 구분해야하는 이유를 찾았다. 앱의 초기화 로직에 네트워크 요청이 숨어있으면 API 서버 장애시 앱이 아예 안켜지는 문제가 있다. 방금 이거랑 관련된 버그 찾느라 시간을 많이 썼다.

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