Posts

if, cond, condp, case

흔히 접하는 프로그래밍 언어에는 if~else if가 연달아 나온다고 해서 코드 모양이 이상해지지는 않는다. 다음 Java 코드와 같이 그냥 순서대로 쓰면 되고 코드를 읽는 것도 어렵지 않다.

Read more...

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...