• Variance (Covariance, Contravariance) – 제너릭 타입

    Variance (Covariance, Contravariance) – 제너릭 타입

    TL;DR 어떤 제너릭 Type<T> 을 사용할 때, 타입 파라메터 T에서 최초에 지정한 타입 T만 받을 수 있으면 invariant Type<T> 에서 타입 T와 T의 서브클래스 까지 받을 수 있으면 covariant 이다. (List<T>를 파라메터로 함수에 List<TSubClass>를 대신 집어 넣을 수 있다.) Type<T> 에서 타입 T와 T의 슈퍼클래스 까지 받을 수 있으면 contravariant 이다. (Func<T>를 파라메터로 함수에 Func<TSuperClass>를…

  • 타입 이야기 (Optional과 Soundness Nullable)

    프로그래밍을 하다 보면 “타입”에 대한 고민을 할 필요가 생긴다. 우리가 자주 볼 수 있는 Int, Char, Float, Double, String 과 같은것이 모두 타입이다. 일반적으로 int형 타입이라고 하면 정수를 -21억~+21억 까지의 수를 저장할 수 있는 타입이다. 라고 이야기 한다. float, double은 부동소수점(실수)를 저장할 수 있는 타입이라고 이야기 한다. 그리고 String을 문자열을 저장할 수 있는 타입 이라고…

  • iptables와 ipset을 이용하여 한국 IP만 허용

    iptables와 ipset을 이용하여 한국 IP만 허용

    ipset을 이용하면 많은 IP들을 효율적으로 iptables로 관리할 수 있다. 한국 IP의 block 수가 많기 때문에 일일이 iptables에 밀어넣는것 보다는 ipset으로 목록을 관리하는것이 좋다. ipset으로 KRNIC IP 목록 추가 KRNIC에서 제공하는 국내 IP 목록을 다운로드 한다 (https://한국인터넷정보센터.한국/jsp/statboard/IPAS/inter/sec/currentV4Addr.jsp) KRNIC는 /24 블록의 갯수로 IP 대역을 표현한다. csv 다운로드 를 통해서 목록을 다운받으면 된다. ipset은 CIDR로 IP 범위를 설정하므로…

  • Ubuntu에서 Anydesk + x11 + intel 그래픽 드라이버 + HDMI 조합일 때 끊김 발생

    Ubuntu에서 Anydesk + x11 + intel 그래픽 드라이버 + HDMI 조합일 때 끊김 발생

    TL;DR /etc/X11/xorg.conf 등, x11 설정 파일 또는 /usr/share/X11/xorg.conf.d/20-intel.conf 등의 파일에 아래와 같은 내용을 붙여 넣고 재부팅 (또는 x11 재시작)을 해본다 문제 해결 과정 Anydesk로 Ubuntu를 원격 제어 시도시 약 2초마다 스터터링이 발생하는 문제가 발견됐다. 영어로 검색해도 “이러한 문제가 있어요” 하는 내용이 끝이고, 이렇다 할 무언가가 나오지 않았다. 그래서 삽질을 시작했다. 우선 Anydesk로 접속할 때만 문제가…

  • Spring Boot 3.0 환경에서 Whatap 연동

    Spring Boot 3.0 환경에서 Whatap 연동

    Kotlin + Spring Boot 3.0 + Java 17 LTS 환경에서 Whatap APM을 연동할 일이 생겼다. 이 글에서는 연동 방법과 몇가지 애먹은 부분을 기술한다. 에이전트 설치 Whatap 공식 문서 곳곳에서 $WHATAP_HOME 라고 되어 있는 것은 .jar 파일이 있는 경로를 말한다. 환경변수로 $WHATAP_HOME를 설정해도 안먹으니까 주의하자. 이후, [whatap의 프로젝트 페이지 – 관리 – 에이전트 설치]를 참고해서 whatap.conf…

  • React – Map등을 이용한 배열 표시 (세미나 자료 #2)

    React – Map등을 이용한 배열 표시 (세미나 자료 #2)

    웹 페이지를 만들다 보면 동일한 구조의 데이터를 다룰 일이 많아진다. 예를 들어, 블로그 글 목록에서는 동일한 구조로 된 내용이 가득하다. 어떤 구조체를 A라고 했을때, [A, A, A, A ···]와 같은 형태로 쭈우우욱 있는것을 배열(또는 목록)이라고 한다. 이 목록을 표시하는 방법을 다루고자 한다. 이 내용은 많은 글에서 다루고 있기 때문에, 핵심적인 내용만 다루려고 한다. JSX 떠올리기…

  • React – 함수 조합으로 만드는 DOM (세미나 자료 #1)

    React – 함수 조합으로 만드는 DOM (세미나 자료 #1)

    필자가 다녔던 학교에서 최근 연락이 왔다. 이제 HTML·JS·CSS를 갓 배운 학우들을 대상으로 React 기초를 알려주면 어떻겠냐는 연락이었다. 다행히 시간도 맞고 해서 1.5주 짜리 세미나를 준비하게 됐다. 세미나에 쓸 내용을 그저 묵히기가 아쉬워서 여기에 같이 기록해 둔다. 내용 인용시 반드시 출처 표기 부탁 드립니다. 우선 JSX를 써보자 백문이 불여일견이다. 우선 React를 이용하여 간단한 글자와 사진을 표시해…

  • SQL Injection에 대한 짧은 글

    SQL Injection에 대한 짧은 글

    저번주 SQL Injection에 대해 남들에게 설명할 기회가 생겼다. 이미 많은 곳에서 SQL injection을 설명하고 있다. 그럼에도 불구하고, 생각보다 잘 알려지지 않은 부분이 있는것 같다. 여기서는 생각 보다 아는 사람이 드문 내용을 끄적여 본다. SQL은 기본적으로 텍스트 형식이다. SQL은 DBMS에 명령을 내리는 텍스트 언어이다. 그러다 보니 복잡한 문법 구조를 가졌다. SQL은 정방향으로 읽어서 처리할 수 있는…

  • 교내 네트워크에 대한 단상

    교내 네트워크에 대한 단상

    필자가 다니던 대학교는 한 IP당 2.5MB/s의 속도 제한이 걸려 있었다. 이 글에서 이 속도 제한을 파훼하기 위해 시도해 봤던 방법들과 짧은 생각을 적어보려 한다. 교내 네트워크 상황 필자가 다니던 학교의 교내 네트워크는 몇가지 특이한 점이 있었다. 즉, 수 많은 컴퓨터가 Full-Duplex 1.2Gbps (2.4Gbps) 회선을 나눠쓰고 있는 상황이다. 규모에 비해 조약한 회선으로 학교 전체를 버텨야 하는…

  • Dart / TypeScript plan

    이 글은 https://herbsutter.com/2023/10/09/my-new-cppcon-talk-is-on-youtube-cooperative-c-evolution-toward-a-typescript-for-c/ 에서 영감을 받있습니다. 브라우저 내에서 사용되기를 원한다는 점에서 Dart와 TypeScript 모두 Javascript 자리를 노리는 언어이다. 두 언어 모두 브라우저 내에서 동작하는 언어를 목표로 한다. 그러면서 기존에 있던 언어인 Javascript의 Type Safety를 비롯한 문제들을 각자의 방법으로 수정했다. JS의 문제를 해결하기 위해 Dart는 새로운 언어를 만들었다. Dart와 JS는 원하는 위치는 같지만 아예 별계의 언어이다.…

  • Oracle Cloud VM NIC (반 가상화 / SR-IOV)

    Oracle Cloud VM NIC (반 가상화 / SR-IOV)

    Oracle Cloud Infrastructure에서 VM을 파서 운영하다 보면 오라클이 엄청 상세한 설정을 제공함을 알 수 있다. 그 중 하나가 VNIC(Virtual NIC)이다. 오라클에서는 VM을 생성할 때 반가상화 NIC와 하드웨어 가속화 NIC중 하나를 선택할 수 있다. 반 가상화 모드(Paravirtualized)는 OpenStack 계열 VM에서 자주 볼 수 있는 VirtIO NIC이고, 하드웨어 가속 NIC는 mellanox의 NIC로 인식되는 장치가 붙는다. 이 두개는…

  • 비밀번호를 사용하지 않는 로그인 방식

    몇년전만 해도 웹 사이트 로그인은 아이디와 비밀번호만을 요구하는 곳이 대부분이었다. 그러나 요즘들어서 다양한 인증 방식을 사용하는 곳이 많아진 것 같다. 2FA 첫번째로는 기본 아이디 + 비밀번호 조합에 추가적인 인증을 붙인 경우이다. 이 경우는 다들 많이 봤을것이다. 주로 이메일이나 문자로 발송된 인증코드나 OTP를 입력하기로 요구 받는다 여기 까지는 서버 어딘가에 비밀번호를 저장해야 한다. 해싱이나 암호화가 되어있다…