2011년 1월 7일 금요일

LinkedHashmap LRU Caching

LinkedHashMap의 생성자 중 LinkedHashMap(int capacity, float loadFactor, boolean accessOrder)가 있다.
capacity는 생성할때 map의 크기를 얼마로 할 것인가가 되고
loadFactor는 capacity의 몇 %가 차게되면 용량을 늘려야 할것인가
마지막 불리언 값은 정렬을 삽입 순서(false)냐 접근 순서(true)냐에 대한 인자이다.

그리고 맵에 put이 호출되면 엔트리를 생성해서 addEntry하게 되고
LinkedHashMap의 addEntry는 마지막에 removeEldestEntry를 호출하고 이 리턴이 true이면 정렬 순서의 첫 값을 삭제한다.

LRU 방식으로 특정한 크기의 자료를 유지하고 싶을때 이를 이용하면 된다.

import java.util.LinkedHashMap;
import java.util.Map;



public class LRUCache<K, V> extends LinkedHashMap<K, V>
{
    private static final long serialVersionUID = 734283243247234L;
    private final int         maxSize_;



    public LRUCache(final int maxSize)
    {
        super((maxSize + 1) * 4 / 3 + 1, .75f, true); // <-- 0.75의 load factor가 매직 넘버처럼 쓰인다.
        this.maxSize_ = maxSize + 1;
    }



    @Override
    protected boolean removeEldestEntry(final Map.Entry<K, V> eldest)
    {
        return this.size() >= this.maxSize_;
    }
}

주의해야 할 점은 capacity의 값이다. capacity의 75%가 차게 되면 capacity의 2배 증가와 re-hashing이 발생한다. max 값으로 크기가 고정 될 것이므로 굳이 용량 증가나 re-hashing을 일으킬 필요가 없으므로
용량을 max값의 4/3 크기로 한다.
또 입력받은 maxSize에 1을 더한 값으로 임계치를 정한 것은 LinkedHashMap에서 size >= threshold 조건에 걸릴때 용량 resize를 하기 때문에 입력 받은 max에 1을 더한 값과 비교하도록 한 것이다.

2010년 12월 7일 화요일

java logging

기본 자바 환경에서 logger를 설정하고 아무리 logger의 level을 변경해봐야 소용없다.
일단 console handler의 레벨이 INFO이기 때문에 console handler의 레벨을 변경해야 하고
console handler를 새로 생성해서 addHandler로 등록해서 사용할 경우 로그가 두번씩 찍히고
logger의 핸들러를 getHandlers로 얻어와 변경하려해도 0개를 리턴한다.



        if (logger.getUseParentHandlers()) {
            Logger parentLogger = logger.getParent();
            Handler[] handlers = parentLogger.getHandlers();
            for (Handler handler : handlers) {
                if (handler instanceof ConsoleHandler)
                    handler.setLevel(Level.ALL);
            }
        }
        else {
            Handler[] handlers = logger.getHandlers();
            for (Handler handler : handlers) {
                if (handler instanceof ConsoleHandler)
                    handler.setLevel(Level.ALL);
            }
        }

제발 내려라

@kennedian3: http://bit.ly/dRZpeZ 집값 바닥론 거짓말에 속지 마라. 오늘자 네이버 부동산
기고문입니다. 그동안 제가 트위터에 접속을 거의 안 했더니 최근 상황에 대한 제 의견이 궁금하다는 분들이 계셨는데, 이 글
읽어보시면 도움될 겁니다


Sent from my iPhone

2010년 12월 6일 월요일

아이폰과 구글 연동

아이폰에서 기본 제공하는 구글 계정 만들기가 아닌 m.google.com/sync에서 알려주는 방식으로 하는 것이 좋음

Sent from my iPhone

2010년 11월 15일 월요일

김 훈, "칼의 노래" 서문

2000년 가을에 나는 다시 초야로 돌아왔다.
나는 정의로운 자들의 세상과 작별하였다. 나는 내 당대의 어떠한 가치도 긍정할 수 없었다. 제군들은 희망의 힘으로 살아 있는가. 그대들과 나누어 가질 희망이나 믿음이 나에게는 없다. 그러므로 그대들과 나는 영원한 남으로서 서로 복되다. 나는 나 자신의 절박한 오류들과 더불어 혼자서 살 것이다.
초야의 저녁들은 헐거웠다. 내 적막은 아주 못 견딜만 하지는 않았다. 그 해 겨울은 추웠고 눈이 많이 내렸다. 마을의 길들은 끊어졌고 인기척이 없었다. 얼어붙은 세상의 빙판 위로 똥차들이 마구 달렸다. 나는 무서워서 겨우내 대문 밖을 나가지 못했다.
나는 인간에 대한 모든 연민을 버리기로 했다. 연민을 버려야만 세상은 보일 듯 싶었다. 연민은 쉽게 버려지지 않았다. 그 해 겨울에 나는 자주 아팠다.

눈이 녹은 뒤 충남 아산 현충사. 이순신 장군의 사당에 여러 번 갔었다. 거기에, 장군의 큰 칼이 걸려 있었다. 차가운 칼이었다. 혼자서 하루종일 장군의 칼을 들여다 보다가 저물어서 돌아왔다.
사랑은 불가능에 대한 사랑일 뿐이라고, 그 칼은 나에게 말해 주었다. 영웅이 아닌 나는 쓸쓸해서 속으로 울었다. 이 가난한 글은 그 칼의 전언에 대한 나의 응답이다.
사랑이여 아득한 적이여. 너의 모든 생명의 함대는 바람 불고 물결 높은 날 내 마지막 바다 노량으로 오라. 오라, 내 거기서 한줄기 일자진(一字陣)으로 적을 맞으리.
다시, 만경강에 바친다.

2010년 10월 27일 수요일

iMovie11에서 Updating Aperture Videos Event가 종료되지 않을때

http://appletoolbox.com/2010/10/imovie-11-stuck-on-updating-aperture-videos-event-fix/
Aperture library에서 우클릭 -> show package contents -> iMovie-Thumbnails와 iLifeShared 폴더 삭제
이제 정상적으로 실행 됨
Aperture에서 thumbnail 재생성이나 원본과 머지 같은 것들을 알려준 넘들 잊지 않겠다.

Blogger에 소스 코드 입력

코드를 변환해 주는 블로그가 있군여.
http://formatmysourcecode.blogspot.com/