Posts

Guava Cache 제대로 사용하기

Google Guava Cache는 캐시를 쉽게 사용할 수 있도록 다양한 기능을 제공한다. 간단한 코드로 캐시 크기, 캐시 시간, 데이터 로딩 방법, 데이터 리프레시 방법 등을 제어할 수 있다. 회사에서도 성능 향상을 위해 Guava 캐시가 널리 사용하고 있는데, 최근 캐시 관련 코드를 보다가 이상한 점을 발견했다.

Read more...

프로젝트 오일러 20

100! 의 자릿수를 모두 더하면?

문제 자세히 보기: [국어] [영어]

100!은 150자리가 넘는 매우 큰 수라 기본 데이터 타입으로는 이 문제를 해결할 수 없다. 물론 BigInt를 사용하면 아주 쉽게 문제를 풀 수 있다. 문제 16, 문제 13에서 썼던 방법을 응용하면 BigInt를 사용하지 않고 문제를 풀 수 있다.

Read more...

프로젝트 오일러 19

20세기에서, 매월 1일이 일요일인 경우는 몇 번?

문제 자세히 보기: [국어] [영어]

Java에서 제공하는 Calendar를 사용하면 쉽게 답을 구할 수 있다. 그러나 Calender는 가변객체(mutable object)인데다 클래스도 잘못 설계되어 있어 코드 모양이 어그러진다. Java 8부터는 거지 같은 Calendar 대신 LocalDate를 사용할 수 있다. LocalDate는 값 객체로 Clojure에서 사용해도 코드가 어그러지지 않는다. 조금 더 생각하면 라이브러리의 도움을 받지 않고도 풀 수 있다.

Read more...

프로젝트 오일러 18

삼각형을 따라 내려가면서 합이 최대가 되는 경로 찾기

문제 자세히 보기: [국어] [영어]

문제를 언듯 보면 합이 최대가 되는 경로를 찾아야 할 것 같지만, 명시적으로 경로를 구하지 않더라도 경로의 합이 최대가 되는 값을 찾을 수 있다.

Read more...

과도한 로깅

과유불급(過猶不及)
정도를 지나침은 미치지 못함과 같다
- 논어(論語) 선진편(先進篇)

방문자가 매우 많은 사이트에서 애플리케이션을 배포하는 작업은 부담이 크다. 다행히 애플리케이션 서버를 여러 대 두기 때문에 서버 한 대가 잘못되더라도 사이트 전면 장애가 발생하지는 않는다. 새로운 코드를 배포할 때는 항상 서버 한 대에 먼저 배포해 놓고 일정 시간 동안 모니터링 한다. 문제가 없는 경우에는 전체 서버로 배포하고, 로그에 예외나 에러가 표시되면 즉시 롤백한다.

Read more...

tail은 이제 그만

서버에서 로그 파일을 모니터링 할 때 보통 tail -f를 사용한다. 그런데 최근 더 좋은 방법을 알게 되었다. 바로 less +F를 사용하는 것이다. tail -f를 사용할 때 파일에서 어떤 내용을 찾고 싶을 때는 흔히 다음 두 방법을 사용한다.

Read more...

프로젝트 오일러 17

1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는?

문제 자세히 보기: [국어] [영어]

별로 어려운 문제는 아니다. 다음과 같은 절차로 풀 수 있다.

  1. 숫자를 입력하면 그 수에 대한 영어 문자열을 리턴하는 함수를 작성한 다음
  2. 이 함수를 이용해 1~1000을 영어 문자열로 매핑
  3. 문자열을 모두 연결해 문자열에서 공백과 하이픈('-')을 제거
  4. 3에서 구한 문자열의 길이 계산

즉 주어진 숫자를 문자열로 바꾸는 함수를 구현하면 문제를 간단히 풀 수 있다.

Read more...

Sitemap 생성기

블로그를 정적 사이트 생성기로 만들어 GitHub에 처음 올렸을 때가 생각난다. 그전에 사용했던 티스토리나 블로거에서는 글을 올리고 별다른 작업을 하지 않아도 일정 시간이 지난 후 구글에서 검색이 되었다. 그래서 GitHub 페이지로 블로그를 옮긴 다음에도 언제쯤 구글에서 검색이 될까 마냥 기다렸다.

Read more...

프로젝트 오일러 16

2^{1000} 의 각 자릿수를 모두 더하면?

문제 자세히 보기: [국어] [영어]

2^{1000} 은 300자리가 넘는 매우 큰 수다. int, long과 같은 기본 데이터 타입에는 이렇게 큰 수를 담을 수 없다. double 10^{308} 이상의 매우 큰 수를 표현할 수 있지만 유효자릿수가 15~17자리여서 2^{1000} 의 모든 자릿수를 담을 수 없다.

Read more...

statement와 expression

언젠가 동료 한 명이 'statement와 expression의 차이가 뭔지 아냐?'고 물어본 적이 있다. 프로그래밍 책에서 자주 접했던 용어지만 명확히 답할 수 없었다. statement는 명령문이고 expression은 표현식인데...

Read more...