인기 글
안녕하세요. 저는 게임을 좋아하는 백엔드 개발자로서, 줄곧 맥북과 윈도우 데스크탑을 함께 사용하고 싶은 욕구가 있었습니다.그리고, 최근에 꽤나 만족스러운 퀄리티로 이 둘을 모두 사용하는 데스크셋업을 완료하여 공유합니다. 책상위에는 클램쉘모드의 맥북이, 아래에는 윈도우 데스크탑이 놓인 모습입니다.선을 꼽았다뺐다 할 필요 없이, 두 pc가 모니터 2개와 마우스, 키보드 등을 공유하고 있습니다.또한 리모콘으로 두 pc를 왔다갔다 할 수 있습니다.맥과 윈도우를 왔다갔다아래는 장치들의 연결 다이어그램입니다. 그림 속 kvm 스위치는 입출력 장치들과 두 pc를 분기하는 역할을 합니다. 이 스위치 덕에 두 pc를 자유롭게 오갈 수 있습니다.도킹스테이션은 전원과 온갖 케이블을 하나의 c-type 케이블로 묶어주는 역할..
약 한 달간 Cursor AI를 사용해보았습니다. 간단한 React 웹 페이지와 NestJS CRUD 서버, 그리고 React-Native 앱의 거의 개발 착수 단계에 사용하였습니다. 결론부터 말하자면, 새로운 프로젝트를 시작할 때에 있어서는 너무나도 편리하고, 압도적으로 생산성을 늘려줄 수 있는 도구라고 느꼈습니다. Gpt나 Github Copilot을 처음 경험했을 때보다도 큰 충격을 준 도구였습니다. 이 글에서는 Cursor AI에 대한 간단한 소개와 느낀 점들을 다룹니다. Cursor AI란Cursor AI는 VScode의 포크 프로젝트이며, 갖가지 AI 기능이 탑재되어 있습니다. 제가 주로 사용한 기능들은 아래와 같습니다.Tab - line 수정 제안코드를 작성하다보면 Cursor가 특정 라인의..
결론부터 적자면 주민등록등본을 내니까 성공했다.Google 플레이스토어에 내가 만든 앱을 업로드하려면, 개발자 계정을 추가해야한다.일단 개발자 계정을 생성하는데에 25달러를 요구했고(하필 환율도 높을 때...), 주소지 입력, 결제계정 생성 등 꽤나 답답한 과정을 거친 후에 도착하는 최종관문이 바로 "본인인증"이다. 이 본인인증이 답답한 이유는 아래와 같다. 1. 실제 거주지의 전기/수도 요금 명세서나 은행 명세서 등의 서류를 요구한다.2. 캡쳐/스크린샷이면 안된다.3. 서류에 반드시 실제 본인의 이름과 주소지가 들어가 있어야한다.4. 90일 이내여야 한다.5. 아마 사람이 직접 승인하는 구조라, 근무일에만 승인된다. 처음에는 대충 되겠지 생각하고, 도시가스 명세서 화면을 캡쳐해서 보냈는데, 반려당했다...
https://junbyeol.tistory.com/4 윈도우 PC와 맥북을 듀얼모니터로 함께 사용하기안녕하세요. 저는 게임을 좋아하는 백엔드 개발자로서, 줄곧 맥북과 윈도우 데스크탑을 함께 사용하고 싶은 욕구가 있었습니다.그리고, 최근에 꽤나 만족스러운 퀄리티로 이 둘을 모두 사용하junbyeol.tistory.com위 글을 작성한지 2년이 지난 지금 제 책상 상태를 공개합니다.2년 사이에 이사를 하여, 컴퓨터 책상 배경이 달라졌고, 깔끔헀던 선정리가 다시 엉망으로 돌아갔습니다. 이것들은 논외로 하고, 다른 변경점들을 소개합니다.모니터암과 모니터 받침대원래는 카멜마운트의 듀얼모니터암 제품을 사용하고 있었는데, 지금은 사용하고 있지 않습니다. 제가 모니터암을 쓰면서 기대했던 효과는 이런 것이었습니다.모니..
· 토막글
oh-my-zsh은 멍청하고 입력이 불편한 터미널을 아주 똑똑하게 만들 수 있는 툴입니다. 맥북을 처음 구매했다면, 거의 필수로 깔아야하는 툴입니다. 설치 sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" 위 커맨드만 터미널에 입력해주면 설치는 끝입니다. oh-my-zsh는 기본적으로 온갖 alias를 제공합니다. alias를 터미널에 입력하여 어떤 alias가 가능한지 리스트를 볼 수 있습니다. 저는 alias 를 많이 사용하지는 않으나, 홈으로 바로 이동시켜주는 ~ 와 현재 경로의 모든 파일을 보여주는 ls -al의 alias인 la를 가장 많이 사용하는 것 같습니다. oh-my-..
전체 보기
"바이브 코딩"이라는 단어와 함께 MCP에 대한 관심이 뜨겁습니다. Cursor AI라는 코드 에디터는 LLM이 직접 로컬 프로젝트 파일들을 직접 수정하고 코드를 작성하며 바이브 코딩을 가능케 합니다(Cursor AI에 대해서는 이 글을 참고하세요). 그러나, LLM은 간혹 '할루시네이션' 문제를 일으키거나, 잘못된/버그가 있는 코드를 생성하거나, 최신 정보를 알지 못하여 낡은 답변을 내놓는 등의 한계를 보여줍니다. MCP는 이런 한계점들을 돌파할 수 있도록 LLM에게 쥐어줄 수 있는 도구와 같습니다. 이 글에서는 MCP가 무엇인지와 Cursor AI에서 어떻게 설정할 수 있는지를 소개합니다MCP란?MCP(Model Context Protocol)는 LLM과 외부의 도구를 연결하는 방법에 대한 규약입니다..
저는 지난 봄학기 어느 전공과목에서, OCaml이라는 언어를 이용하여 과제를 해야했습니다. 당연히 이전까지 OCaml을 몰랐고, 딱 과제를 하는데에 지장없는 수준의 실력을 갖게 된 것 같습니다. OCaml의 모든 것을 알고싶지는 않지만, 당장 OCaml로 뭔가를 해야하는 누군가에게 이 글이 도움이 되기를 바라며 작성해봅니다. 저도 절대 OCaml의 전문가가 아님을 다시 한 번 밝힙니다. 여기 코드들을 VSCode에서 실행해보고 싶으시면, 이 익스텐션을 설치하시면 됩니다.OCaml의 컨셉과 문법함수형 프로그래밍OCaml은 철저히 함수형 프로그래밍 언어입니다. 함수형 프로그래밍이 무엇인지도 익숙치 않을 독자를 위해 간단히 예를 들어 보겠습니다. 보통 일반적인 C나 python등 우리에게 익숙한 명령형 프로..
이번 학기 전공 과목에서 과제를 디버깅하기 위해 설정해 둔 VSCode의 GDB 설정 파일들을 공유합니다(Cursor AI에서도 당연히 동작합니다). 과제는 C 언어로 작성해야 했으며, 미리 정의된 Makefile을 통해 코드의 빌드, 테스트, 클린 작업이 가능했습니다. Makefile 구성은 대략 아래와 같았습니다. program.c 파일과 관련 헤더 파일들을 하나의 목적 파일(program.o)로 컴파일한 후, 이를 실행 파일로 빌드하는 방식입니다. 특별히 주의할 점은, gcc 명령어를 실행할 때 "-g" 옵션을 넘겨주어야 디버깅가능한 파일로 빌드됩니다. 또, "-O2" 등의 옵션은 디버깅 시에 일부 값을 필터링할 수 있으니 디버깅 목적으로는 사용하지 않아야 합니다.HEADERS = program.h..
5.1 Introduction책꽂이에서 매번 책을 찾아 읽는것보다는, 많이 읽는 책을 책상 위에 두면 시간을 절약할 수 있다. 우리가 필요한 정보는 모든 책에 균등하게 분포되어있지 않기 때문이다. 프로그램 또한, 필요한 코드와 데이터가 균등하게 분포되어 있지 않다. 비슷한 방법으로, 프로그램에게 우리의 메모리가 더 빨라진듯한 환상을 느끼게 해줄 수 있다. 하지만, 빠르면서 큰 메모리는 존재할 수 없다. 책꽂이를 책상위에 얹을수는 없기 때문이다.프로그램의 실행은 지역성의 원리(principle of locality)를 따른다. 프로그램은 시간적/공간적으로 이미 참조한 데이터와 가까운 데이터를 다시 참조할 것이라는 의미이다. 구체적으로 설명하자면, 지역성에는 두 가지 종류가 있다.시간적 지역성(Tempora..
4.1 Introduction이 챕터는 프로세스의 구현방법에 대해서 다룬다. 아주 추상화/단순화된 관점에서부터 datapath를 만들고 간단한 버전의 MIPS를 구현하기에 이른다. 또한, 현실 세계에서 x86같은 복잡한 ISA 구현에 필수적인, 병렬적인(pipelined) 구현 방법 또한 다룬다.우리는 일부 정수 인스트럭션이나, 부동 소수점 인스트럭션 등을 제외하고 아래의 3종류로 분류되는, 간단한 MIPS 인스트럭션들만을 구현할 것이다.메모리 참조 인스터럭션: lw(load word), sw(store word)산수연산 인스트럭션: add, sub, AND, OR, slt브랜치 인스트럭션: beq(branch equal), j(jump)큰 그림모든 인스터럭션은 아래의 두 과정을 거친다.Program C..
15장과 16장은 쿼리 처리를 다룬다. SQL은 쿼리를 매우 높은 수준에서 표현하기 때문에, 쿼리 프로세서는 쿼리를 단순히 실행만 하기 보다, 어떻게 실행할지 고민하여 실행 효율을 높여야 한다. 15장에서는 쿼리 실행, 16장에서는 쿼리 컴파일에 집중한다.쿼리 컴파일 단계는 세 가지 단계로 나뉜다.파싱(parsing): 쿼리로부터 맥락 트리(parse treee)를 만듦논리적 계획 생성(Logical Plan Generation): 맥락 트리로부터 논리적 계획(보통 대수적 표현)을 생성한다. 실행시간을 최소화 하기 위해, 동등하지만 더 효율적인 계획으로 변경한다.물리적 계획 생성(Phyisical Plan Generation): 논리적 계획을 물리적 계획으로 변경한다.2번과 3번 단계를 흔히 쿼리 옵티마..
SELECT * FROM R이라는 쿼리를 실행 하기 위해서 어떻게 해야할까? 저장소의 모든 블럭을 검사해야한다면, 너무 비효율적이다. 일부 블록과 실린더를 따로 R을 위해 예약할 수도 있지만, 여전히 비효율적이다.인덱스는 하나 이상의 필드 값을 받아서, 그 값을 가진 레코드를 빠르게 찾을 수 있게 해주는 자료구조다. 인덱스를 사용하면 전체 레코드 중 일부만 보고, 원하는 레코드를 모두 찾을 수 있다. 인덱스가 기반하는 필드를 검색 키(search key)라고 한다.이 챕터에는 가장 흔한 형태의 인덱스를 다룬다. B-tree 이다. 또 다른 중요한 인덱스 구조인 2차 저장소의 해시 테이블도 다룬다. 마지막으로, 다차원의 데이터를 다루기 위해 디자인 된 인덱스 구조도 다룬다. 이 이덱스 구조들은 여러 값이나..
데이터베이스는 항상 디스크 등의 대용량의 데이터를 저장하는 2차 저장소를 갖습니다. 이 챕터에서는 전통적인 컴퓨터가 어떻게 스토리지를 관리하는지 요약합니다. 또, 릴레이션의 튜플들을 어떻게 저장하는지 다룹니다.13.1 메모리 계층(The Memory Hierarchy)컴퓨터 속 메모리 계층을 시작으로 챕터를 시작해봅시다. 메모리를 저장하는 부품들은 7종류로 나뉩니다. 크기와 접근 속도가 모두 다르며, 크기가 작을수록 접근속도는 빠르고, 바이트 당 가격도 올라갑니다.캐시(Cache): 내장 캐시(On-board cache)는 프로세서 그 자체 안에 포함되어 있고, 추가적인 level-2 캐시는 다른 칩에 포함됩니다. 프로세서가 요구하는 데이터는 메인 메모리에서 캐시로 옮겨져서, 몇 나노초 안에 데이터를 프..
SQL은 관계형 데이터베이스에서 널리 쓰이는 쿼리언어이다. SQL은 쿼리의 기능 뿐 아니라 데이터를 수정하는 DML(Data Manipulation Language)의 기능과 스키마를 정의하는 DDL(Data Definition Language)의 기능도 갖는다.SQL도 다양한 버전이 있다. ANSI, SQL-92(SQL2, SQL:1992), SQL-99(SQL3, SQL:1999), SQL:2023 등이다. 이 글에서 다루는 것은 SQL-92이다.6.1 Simple Queries in SQLSELECT, FROM, WHERE을 가지고 기초적인 쿼리를 할 수 있다. 관계대수(relational algebra)로 치자면, SELECT는 사영(projection) 조건, WHERE은 선택(selection..
긱뉴스에 소개된 크롬 익스텐션, KoreaDropdown 이다.드롭다운 메뉴에서 한국을 찾기 어려운, 많은 사람들이 공감할 만한 경험을 재치 있게 해결해주는 간단하지만 인상적인 익스텐션이다. 특히 인상 깊었던 점 몇 가지를 적어본다.크롬 익스텐션의 랜딩 페이지작은 규모의 익스텐션임에도 별도의 랜딩 페이지를 제공한다는 점이 제품의 완성도를 한층 끌어올린 느낌이었다. 이 익스텐션이 무엇을 하는지 바로 보여주고, 사용자가 체험해볼 수 있도록 한 뒤 "지금 무료로 설치하기" 버튼을 통해 크롬 웹스토어로 자연스럽게 연결되는 플로우가 인상적이었다. 수직 플렉스박스 구조로 구성된 랜딩 화면에는 자주 묻는 질문과 후원 링크까지 포함되어 있다.익스텐션 자체의 재치드롭다운 메뉴에서 한국이 "South Korea", "Ko..
https://junbyeol.tistory.com/4 윈도우 PC와 맥북을 듀얼모니터로 함께 사용하기안녕하세요. 저는 게임을 좋아하는 백엔드 개발자로서, 줄곧 맥북과 윈도우 데스크탑을 함께 사용하고 싶은 욕구가 있었습니다.그리고, 최근에 꽤나 만족스러운 퀄리티로 이 둘을 모두 사용하junbyeol.tistory.com위 글을 작성한지 2년이 지난 지금 제 책상 상태를 공개합니다.2년 사이에 이사를 하여, 컴퓨터 책상 배경이 달라졌고, 깔끔헀던 선정리가 다시 엉망으로 돌아갔습니다. 이것들은 논외로 하고, 다른 변경점들을 소개합니다.모니터암과 모니터 받침대원래는 카멜마운트의 듀얼모니터암 제품을 사용하고 있었는데, 지금은 사용하고 있지 않습니다. 제가 모니터암을 쓰면서 기대했던 효과는 이런 것이었습니다.모니..
웹사이트들을 돌아다니다보면, 내린만큼 화면이 스크롤 되는 것이 아니라 특정구간마다 탁탁 걸리면서 정지하는 스크롤을 이용한 사이트들이 많이 보인다. 이 사이트는 스크롤을 내릴때마다 화면 전체의 배경색이 바뀌면서 극적인 효과를 준다. 눈으로 보면 쉽지만, 말로 설명하자면 어려운 이런 스크롤 방식을 "scroll snap"이라고 부른다.Scroll SnapCSS의 scroll-snap-type을 이용해서 구현된다. 스크롤이 멈출 수 있는 지점을 지정하는 것이다. 이 멈춤 지점을 앵커(anchor)라고 부른다. 예를 들어, tailwind 에서는 가로로 이미지를 스크롤하는 예시를 보여준다.비슷한 용어로 "Full Page Scroll"이라는 표현이 있다. 이는 scroll snap을 활용해 구현되며, 페페이지 ..
이 챕터는 두개의 추상적인 언어를 다룬다. 하나는 대수적(algebraic)인것, 하나는 논리적인것(logic-based)이다.대수적인 것은 챕터2에서 다룬 관계대수학과 같지만, 그 범위를 확장할 것이다. 챕터2에서는 집합에 대해서 연산했다면, 이 챕터에서는 중복을 허용한 Bags로 연산할 것이다. 논리적인 언어는 데이터로그(Datalog)라고 부른다. 우리는 원하는 결과를 구하는 알고리즘을 찾기보다, 우리가 원하는 쿼리를 표현하는데에 집중할 수 있다.5.1 Relational Operations on Bags말했듯이 Bags는 집합에서 같은 튜플의 중복을 허용한 것이다. 왜 Bags를 사용할까? 두 릴레이션의 합집합을 구할때, 중복되는 원소를 제거하는 연산을 하지 않아도 된다. 그저 두 릴레이션을 복사..
이 글은 DATABASE SYSTEMS:The Complete Book(2nd Edition, Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom)의 Chapter4: High-Level Database Model의 4.1~4.6절을 요약/재구성한 글입니다.현실의 정보들을 데이터베이스에 담으려고 하면, 어떤 정보를 어느 릴레이션에 담고, 서로 어떻게 참조 관계를 구성할지 고민이 될 수 있다. 데이터베이스 디자인을 관계형 모델(Relational model)을 이용해서 바로 접근할 수도 있지만, 그것을 추상화하는 한단계 높은 레벨의 모델을 사용할 것이다.4.1 The Entity/Relationship ModelE/R Model은 데이터 구조를 시각적으로 표..
이 글은 DATABASE SYSTEMS:The Complete Book(2nd Edition, Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom)의 Chapter3: Design Theory for Relational Databases를 요약/재구성한 글입니다.스키마 설계 단계에서, 초안으로 나온 스키마는 개선의 여지가 많다. 제거해야 할 스키마의 중복(redundancy)이 대표적이다. 이런 관게형 데이터베이스의 이상(Anomalies)들을 쉽게 설명하기 위하여, 의존성(dependencies)이라는 개념은 좋은 수단이다.우리는 함수의존성(FD, functional dependencies)의 아이디어부터 시작해서, 정규화(normalization)와 다..
이 글은 DATABASE SYSTEMS:The Complete Book(2nd Edition, Hector Garcia-Molina, Jeffrey D. Ullman, Jennifer Widom)의 Chapter2: Relational Database Modeling를 요약/재구성한 글입니다.2.1 데이터 모델 개요(An Overview Of Data Models)데이터 모델이란 무엇인가? 이것을 정의하기에 앞서, 데이터 모델을 정의하는 세가지 관점을 소개한다.첫째, 데이터의 구조(structure of data): 프로그래밍 언어의 배열, 객체 같은 것과 유사하다. 그러나, 데이터베이스에서 얘기하는 데이터의 구조는 그것보다는 상위 계층에서 일어나는 일이다. 그래서, 물리적 모델(physical mode..
· 토막글
새로운 터미널 환경에서 새로운 레포지토리(repository)라도 클론(clone)받으려고 하면 인증이 참 귀찮다. 웹에서 쓰는 비밀번호를 입력하면, 아래의 이미지처럼 비밀번호 인증(Password Authentication)이 종료되었다는 오류로 실패하게 되기 떄문이다. 따로 깃헙의 개인 액세스 토큰(Personal Access Token)을 발급받거나, SSH key를 생성해야 하는데, 토큰의 권한도 관리해줘야하고, 여러모로 복잡하다.  그래서 나는 Github CLI로 로그인하는 방법을 선호한다. Github CLI를 이용하면 여러가지 편리한 방법으로 터미널에서 로그인을 할 수 있다.brew install gh // macOSapt install gh // Linuxgh auth login이 대화형..
이 글은 Discrete Mathematics and its Applications by Kenneth H. Rosen, 8th Edition의 1.1~1.3 절을 재구성한 내용입니다. 이 글은 LaTeX 수식이 포함되어 있습니다. $\sum$  명제(Proposition)참/거짓을 판단할 수 있는 평서문(Declarative sentence) "x+5=10"은 명제가 아니다.  x의 값에 따라 참/거짓이 달라지므로, 문장만으로, 진위를 판단할 수 없기 때문이다. 나중에 다루지만, 이 문장은 predicate라고 할 수 있다. 명제를 부정(Negation)하면 새로운 명제를 만들 수 있다. 혹은, 두개 이상의 명제를 합쳐서 하나의 새로운 명제(compound proposition)를 만들 수 있다. 이 ..
이 글은 Computer Organization And Design: The Hardware/Software Interface, David A. Patterson and John L Hennessy 6th edition 중, Appdendix C: The Basics of Logic Design의 C.2~C.3를 읽고 재구성한 글입니다. 이 글 속의 이미지들도 이 책의 이미지를 사용했습니다. 이 글은 LateX 수식이 포함되어 있습니다. $ \sum $ ">이 글은 LateX 수식이 포함되어 있습니다. $ \sum $   컴퓨터 세상의 신호는 디지털(Digital)로 통한다. 디지털은 모든 신호를 두 가지로 표현한다. True, 1, asserted 등으로 표현하는 신호와 false, 0, deasser..
컴퓨터 보안의 속성은 CIA triad 와 AAA triad로 설명할 수 있다. CIA triad는 Confientiality(기밀성), Integrity(무결성), Availability(가용성), AAA triad는 Assurance(보장성), Authenticity(진위여부), Anonymity(익명성) 을 포함한다.*CIA triad이 3가지 속성을 잘 갖춘 서비스가 보안이 튼튼한 서비스라고 할 수 있다. Confidentiality(기밀성) 인증되지 않은 사람이 데이터를 읽지 못하게 해야함을 의미한다. 기밀성은 3가지 방법으로 구현될 수 있다. 첫째로 암호화(Encryption)는 대칭/비대칭 키를 이용하여 데이터의 내용을 숨긴다. 둘째로 인증(Authentication)은 유저의 신원을 확..
· 토막글
게시글 작성 화면을 구현하려면, WYSIWYG 에디터를 사용하게 된다. ChatGPT의 추천으로 나는 TinyMCE라는 에디터를 선택했다. 이 에디터를 이용해 게시판 작성 화면을 구현하면서, 이미지와 파일을 다루는 방법에 대해 내가 작업한 내용을 이 글에서 소개한다. 나도 대부분의 코드 작성을 claude-3.5-sonnet(cursor AI)이라는 친구에게 맡기고, 이후 생긴 버그들을 디버깅한 정도라, 코드에는 개선의 여지가 더 많을 수 있다. 1. 사진/파일 업로드 하기문제상황TinyMCE의 이미지업로더(ImageUploadPicker)와 파일업로더(FileUploadPicker) 기능을 활용하고자 한다면, 이미지/파일을 어딘가에 업로드하고, 그 업로드된 URL을 반환해주는 핸들러 함수가 필요하다. ..
준별
준별개발