전체 글
Happy Hacking!
-
부동소수점을 이해하려면 우선 디지털과 아날로그의 차이부터 이해해야 한다. 우리가 살고 있는 아날로그 세상의 수는 연속적(sequential)하지만, 디지털 세계의 수는 이산적(discrete)이다. 여기서 연속적이라는 의미는 값이 딱 나눠떨어지는 것이 아니라 무한대의 소수가 존재할 수 있다는 의미이다. 예를 들어 0.111011101110...과 같은 수가 존재할 수 있다. 이산적이라는 것은 손가락 하나, 둘과 같이 연속적인 것이 아닌 딱딱 떨어지는 수들이 존재함을 의미한다. 디지털 세계는 우리가 모두 알다시피 0과 1로 이루어져 있다. 따라서 디지털 세계에서 아날로그의 소수를 표현하기 위해 노력들을 해왔는데, 그중 하나가 IEEE 754다. 이는 부동소수점(floating point)을 정의한 표준이다..
부동소수점의 한계와 BigDecimal부동소수점을 이해하려면 우선 디지털과 아날로그의 차이부터 이해해야 한다. 우리가 살고 있는 아날로그 세상의 수는 연속적(sequential)하지만, 디지털 세계의 수는 이산적(discrete)이다. 여기서 연속적이라는 의미는 값이 딱 나눠떨어지는 것이 아니라 무한대의 소수가 존재할 수 있다는 의미이다. 예를 들어 0.111011101110...과 같은 수가 존재할 수 있다. 이산적이라는 것은 손가락 하나, 둘과 같이 연속적인 것이 아닌 딱딱 떨어지는 수들이 존재함을 의미한다. 디지털 세계는 우리가 모두 알다시피 0과 1로 이루어져 있다. 따라서 디지털 세계에서 아날로그의 소수를 표현하기 위해 노력들을 해왔는데, 그중 하나가 IEEE 754다. 이는 부동소수점(floating point)을 정의한 표준이다..
2023.11.08 -
p.7 우리가 어떤 현상을 인식했을 때 문제가 있다고 생각하는 이유는 그것이 '우리가 바라는 것'에 비해 무언가 부족하기 때문이다. 문제 해결사의 일은 어떤 형태로든 그 차이를 제거할 수 있는 방법을 찾아내는 것이며, 그 첫 단계는 불만족한 현상을 해결 가능한 형태의 문제로 표현하는 것이다. p. 21 실제로 자연스러운 일상의 문제를 단 한가지로 완벽하고 명백하게 정의하는 것은 불가능하다. 또 문제에 대한 어떤 공통된 이해 없이 나온 해결안은 여지없이 '엉뚱한' 문제에 대한 해결안이 되고 만다. ... 누구의 문제인가? ... 당신 문제의 본질은 무엇인가? p. 55 해결책이 있다고 해서 문제가 정의됐다고 보지 말라. 특히 그것이 당신 자신만의 해결안일 경우에는 더욱. p. 61 정확히 정의 내렸다고 결..
대체 뭐가 문제야p.7 우리가 어떤 현상을 인식했을 때 문제가 있다고 생각하는 이유는 그것이 '우리가 바라는 것'에 비해 무언가 부족하기 때문이다. 문제 해결사의 일은 어떤 형태로든 그 차이를 제거할 수 있는 방법을 찾아내는 것이며, 그 첫 단계는 불만족한 현상을 해결 가능한 형태의 문제로 표현하는 것이다. p. 21 실제로 자연스러운 일상의 문제를 단 한가지로 완벽하고 명백하게 정의하는 것은 불가능하다. 또 문제에 대한 어떤 공통된 이해 없이 나온 해결안은 여지없이 '엉뚱한' 문제에 대한 해결안이 되고 만다. ... 누구의 문제인가? ... 당신 문제의 본질은 무엇인가? p. 55 해결책이 있다고 해서 문제가 정의됐다고 보지 말라. 특히 그것이 당신 자신만의 해결안일 경우에는 더욱. p. 61 정확히 정의 내렸다고 결..
2023.11.07 -
"스프링 입문을 위한 자바 객체 지향의 원리와 이해"라는 책을 읽다가 내가 동적 로딩에 대해서 잘못 알고 있었음을 알게 되었다. 다음과 같은 소스코드가 있다. public class A { public static void main(String[] args) { System.out.println("main"); System.out.println(B.value); } } class B { static int value = 0; static { System.out.println("B"); } } 위와 같은 코드를 실행하면, 나는 B -> main -> 0이 호출될 것이라고 생각했으나, 정답은 main -> B -> 0 순으로 호출된다. 처음에는 그 이유가 Java의 동적 로딩(Dynamic loading) ..
static 영역은 동적 로딩 과정에서 초기화되지 않는다"스프링 입문을 위한 자바 객체 지향의 원리와 이해"라는 책을 읽다가 내가 동적 로딩에 대해서 잘못 알고 있었음을 알게 되었다. 다음과 같은 소스코드가 있다. public class A { public static void main(String[] args) { System.out.println("main"); System.out.println(B.value); } } class B { static int value = 0; static { System.out.println("B"); } } 위와 같은 코드를 실행하면, 나는 B -> main -> 0이 호출될 것이라고 생각했으나, 정답은 main -> B -> 0 순으로 호출된다. 처음에는 그 이유가 Java의 동적 로딩(Dynamic loading) ..
2023.11.01 -
주의! 이 글은 정답이 아닌, 제가 이해한 내용을 바탕으로 글을 작성했습니다. 틀린 내용이 있을 확률이 높으며, 문제가 되는 내용이 있으면 얼마든지 지적해 주시면 감사하겠습니다! 현재 풀고 있는 과제에서 COUNT 쿼리를 최적화할 필요가 있어 조사를 하다가 이런 글을 발견했다. https://m.blog.naver.com/birdparang/221574304831 이 글에서는 다음과 같은 Stack Overflow의 질문에 대한 풀이를 해주는데, 일단 질문을 보자 https://stackoverflow.com/questions/511820/select-count-is-slow-even-with-where-clause 질문의 요는 pk를 활용해 (cluster) index를 태워 count 쿼리를 날리는데..
InnoDB에서 clustred-index 기반 COUNT 쿼리의 Disk I/O 줄이기주의! 이 글은 정답이 아닌, 제가 이해한 내용을 바탕으로 글을 작성했습니다. 틀린 내용이 있을 확률이 높으며, 문제가 되는 내용이 있으면 얼마든지 지적해 주시면 감사하겠습니다! 현재 풀고 있는 과제에서 COUNT 쿼리를 최적화할 필요가 있어 조사를 하다가 이런 글을 발견했다. https://m.blog.naver.com/birdparang/221574304831 이 글에서는 다음과 같은 Stack Overflow의 질문에 대한 풀이를 해주는데, 일단 질문을 보자 https://stackoverflow.com/questions/511820/select-count-is-slow-even-with-where-clause 질문의 요는 pk를 활용해 (cluster) index를 태워 count 쿼리를 날리는데..
2023.10.16 -
최근 사이드 프로젝트 서버가 유난히 자주 죽어 몇가지 처리를 해주었다. 그 과정에서 처리한 방법과 느낀 점들을 몇가지 정리해 보았다. 일단 로그를 읽어 문제를 살펴보니, Jackson에서 문제가 발생하는 듯 싶었다. 로그는 다음과 같다. ```json [2023-09-28 04:58:17:441494769] ^[[32m[reactor-http-epoll-2]^[[0;39m ^[[31mWARN ^[[0;39m ^[[1;37m[io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught:^[[33m311^[[0;39m]^[[0;39m - An exception 'java.lang.OutOfMemoryError: Java heap space' [e..
사이드 프로젝트 서버 OOM 문제 삽질한 내용들최근 사이드 프로젝트 서버가 유난히 자주 죽어 몇가지 처리를 해주었다. 그 과정에서 처리한 방법과 느낀 점들을 몇가지 정리해 보았다. 일단 로그를 읽어 문제를 살펴보니, Jackson에서 문제가 발생하는 듯 싶었다. 로그는 다음과 같다. ```json [2023-09-28 04:58:17:441494769] ^[[32m[reactor-http-epoll-2]^[[0;39m ^[[31mWARN ^[[0;39m ^[[1;37m[io.netty.channel.AbstractChannelHandlerContext.invokeExceptionCaught:^[[33m311^[[0;39m]^[[0;39m - An exception 'java.lang.OutOfMemoryError: Java heap space' [e..
2023.10.15 -
WAN에서 내 컴퓨터로 요청을 보낼 때는 내 컴퓨터가 사용하는 공유기의 Public IP로 접근하게 된다. 여기서 궁금증이 들었다. 만약 공유기 내에 있는 여러 머신들이 같은 포트의 애플리케이션을 열어놓게 된다면, 공유기에서는 내 컴퓨터가 외부에서 요청한 서버인 것을 어떻게 알아차릴 수 있을까? 답은 포트 포워딩(Port Forwarding)이다. 공유기는 사실 모든 머신들의 포트를 외부로 열어주지 않는다. 포트 포워딩이라는 설정이 되어야만 private network에 존재하는 특정 호스트의 특정 애플리케이션을 열어준다. 즉, 외부에서 어디로 접속하면 어떤 머신의 어떤 포트로 연결할지 매핑해 주는 역할이라고 볼 수 있다. private ip의 경우 외부에서 접근할 수 없기 때문에 외부에서 접근하려면 이..
WAN에서 한 private network에 접근하는 방법WAN에서 내 컴퓨터로 요청을 보낼 때는 내 컴퓨터가 사용하는 공유기의 Public IP로 접근하게 된다. 여기서 궁금증이 들었다. 만약 공유기 내에 있는 여러 머신들이 같은 포트의 애플리케이션을 열어놓게 된다면, 공유기에서는 내 컴퓨터가 외부에서 요청한 서버인 것을 어떻게 알아차릴 수 있을까? 답은 포트 포워딩(Port Forwarding)이다. 공유기는 사실 모든 머신들의 포트를 외부로 열어주지 않는다. 포트 포워딩이라는 설정이 되어야만 private network에 존재하는 특정 호스트의 특정 애플리케이션을 열어준다. 즉, 외부에서 어디로 접속하면 어떤 머신의 어떤 포트로 연결할지 매핑해 주는 역할이라고 볼 수 있다. private ip의 경우 외부에서 접근할 수 없기 때문에 외부에서 접근하려면 이..
2023.09.18