Whiteship's Note


[BBC News] Baijing hit by record snowfall

모하니?/English : 2010.02.19 22:29


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/01/100104_witn_beijing_snow_page.shtml

오늘은 간만에 친구들과 한잔했더니.. 헤롱 헤롱.. 그래도 외웠다...

Thousands were left stranded for a second day after the cold weather bought severe disruption to transport across the country.

Some 30 highways have closed in the north of China, and in Beijing the city's Capital airport saw 90% of flights canceled or delayed on Sunday. By early Monday around 40% of flights had been disrupted.

In some parts of Beijing, 33cm of snow fell, the heaviest in more then half a century. Voulunteers have taken to the streeets with snow-shovles to clean the drifts. School children saw their New Year holiday extended by the severe weather. Here and in neighbouring Taizian, they were given the day off.

More snow will be expected across the north of China, although Beijing supposed to be remain clean, but temperature in the capital, already at minus 15, could down even more.

틀린건 많은 거 같은데 확인하기가 귀찮구나;;

어쩃거나 외웠다. 장하다. 기선아, 오늘은 걍 자자

top

TAG BBC News

[ClassLoader 퀴즈 3] Whiteship은 Whiteship일까 아닐까?

Java : 2010.02.19 16:46


퀴즈 2번 문제의 정답을 맞추신 분이라면 클래스패스와 클래스로더의 관계에 대해 잘 알고 계신 것 같습니다. temp 폴더는 클래스패스에 들어있지 않다고 했었죠. 따라서 URLClassLoader.loadClass를 실행했을 때 그것의 상위 클래스로더인 AppClassLoader가 읽어오지 못하고 자기 자신이 가져오게 됩니다. 

따라서 결국 제가 원하던대로 whiteshipClass1과 whtieshipClass2는 각각 다른 클래스로더(uCL1, uCL2)들이 가져오게 됐습니다.

이쯤 말씀드렸으니.. 정답은 뭐... 당연한 거니까 패스.

    @Test(expected = ClassCastException.class)
    public void classCastException() throws Exception {
        URL url = new URL("file:C:/intellij9-workspace/springsprout2/temp/");
        URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass1 = uCL1.loadClass("Whiteship");
        Object whiteship1 = whiteshipClass1.newInstance();

        URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass2 = uCL2.loadClass("Whiteship");
        Object whiteship2 = whiteshipClass2.newInstance();

        assertThat(whiteshipClass1, is(not(whiteshipClass2)));
        whiteshipClass1.cast(whiteship2);
    }

이번에는 주관식입니다.

위 테스트는 통과 합니다.왜 통과하는 걸까요? 
즉, 왜 ClassCastException이 발생하는 걸까요?
top


[ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!!

Java : 2010.02.19 16:34


첫번째 문제를 맞추셨다면 클래스로더 계층 구조를 이해하고 있다고 볼 수 있겠습니다. 제가 작성한 코드를
보면 제가 어떤걸 원했는지 짐작하실 수 있을 겁니다.

    @Test
    public void loadLocal() throws Exception {
        URL url = new URL("file:C:/intellij9-workspace/springsprout2/test/sandbox/classloader");
        URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass1 = uCL1.loadClass("sandbox.classloader.Whiteship");

        URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass2 = uCL2.loadClass("sandbox.classloader.Whiteship");

        System.out.println("URLClassLoader1: " + uCL1);
        System.out.println("URLClassLoader2: " + uCL2);
        System.out.println("URLClassLoader1's parent : " + uCL1.getParent());
        System.out.println("URLClassLoader2's parent : " + uCL2.getParent());
        System.out.println("whiteshipClass1 loaded by: " + whiteshipClass1.getClassLoader());
        System.out.println("whiteshipClass2 loaded by: " + whiteshipClass2.getClassLoader());
    }

whiteshipClass1과 whiteshipClass2를 각기 다른 ClassLoader(URLClassLoader)를 사용해서 가져오고 싶었던 겁니다. 하지만 결과는? 두 클래스 모두 uCL1과 uCL2의 상위 클래스로더가 가져왔기 때문에 정답은 5번이며 제가 원하던 대로 동작하지 않았습니다. 좀 더 정확하게 보고 싶으시다면 위와 같이 uCL1과 uCL2의 parent까지 찍어보시면 C3, C4와 같다는 걸 확인할 수 있을 겁니다.

    @Test
    public void load() throws Exception {
        URL url = new URL("file:C:/intellij9-workspace/springsprout2/temp/");
        URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass1 = uCL1.loadClass("Whiteship");

        URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass2 = uCL2.loadClass("Whiteship");

        System.out.println("URLClassLoader1: " + uCL1); // C1
        System.out.println("URLClassLoader2: " + uCL2); // C2
        System.out.println("URLClassLoader1's parent : " + uCL1.getParent()); // C3
        System.out.println("URLClassLoader2's parent : " + uCL2.getParent()); // C4
        System.out.println("whiteshipClass1 loaded by: " + whiteshipClass1.getClassLoader()); // C5
        System.out.println("whiteshipClass2 loaded by: " + whiteshipClass2.getClassLoader()); // C6
    }

자 이번에는 조금 다릅니다. temp라는 폴더는 클래스패스로 잡혀있지 않습니다. 그 안에 Whtieship.java를 넣어뒀고 콘솔에서 컴파일해서 .class 파일을 만들어뒀습니다.

다음 중 참인 것은?
1. C1과 C5가 같다.
2. C2과 C6이 같다.
3. C3과 C5가 같다.
4. C4와 C6이 같다.
5. C3과 C4가 같다.
6. C5와 C6이 같다.

과연 이번에는 내가 원했던 결과를 얻을려나...
정답은 역시 다음 글에서 공개. to be continued~!

top


[ClassLoader 퀴즈 1] Whiteship은 대체 누가 데려온 것일까?

Java : 2010.02.19 14:48


어제 면접 볼 때 받은 질문이기도 하다. 지금 내가 있는 회사에 어떻게 들어가게 됐으며 누가 데려갔고 그 사람을 어떻게 알게 됐느냐는 질문을 받았었다. 당시 난 클래스로더가 떠올랐다. 대체 누가 날 로딩한 걸까. 사부? Toby? 그 둘은 같은 사람일까?

    @Test
    public void appClassLoader() throws Exception {
        URL url = new URL("file:C:/intellij9-workspace/springsprout2/test/sandbox/classloader");
        URLClassLoader uCL1 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass1 = uCL1.loadClass("sandbox.classloader.Whiteship");
       
        URLClassLoader uCL2 = new URLClassLoader(new URL[]{url});
        Class whiteshipClass2 = uCL2.loadClass("sandbox.classloader.Whiteship");
       
        System.out.println("URLClassLoader1: " + uCL1); // C1
        System.out.println("URLClassLoader2: " + uCL2); // C2
        System.out.println("whiteshipClass1 loaded by: " + whiteshipClass1.getClassLoader()); // C3
        System.out.println("whiteshipClass2 loaded by: " + whiteshipClass2.getClassLoader()); // C4
    }

편의상 콘솔에 찍히는 객체 레퍼런스를 C1, C2, C3, C4라고 표기하겠다.
test 이하의 폴더는 현재 클래스패스로 잡혀있는 상태이다.

다음 중 참인 것은?
1. C1과 C3은 같다.
2. C2와 C4는 같다.
3. C1과 C3, C4가 같다.
4. C2와 C3, C4가 같다.
5. C3과 C4는 같다.

정답은 다음 글에서 공개. To be continued!


top


Spring Framework 3.0.1 나왔구나

Spring/3.0 : 2010.02.19 11:52


http://blog.springsource.com/2010/02/18/spring-framework-3-0-1-released/

번역하기는 귀찮아서 짧게 요약만 합니다.

- 의존성 포함한 다운로드까지 제공해달라는 사람들이 좀 있어서 메이븐과 Ivy로 가져온 써드파티 라이브러리들까지 압축한 뭉탱이 파일 다운로드도 제공함.

- 3.0.1에서 새롭게 지원하는 라이브러리: 타일즈 2.2, 하이버네이트 3.5(CR1, JPA 2.0 구현체)

- ApplicationListener 감지 기능 향상: 프록시, 팩토리 메서드, Generic 정보를 확ㄹ용한 이벤트 선언 감지 등

- 포인트컷-기반 프록시, EntityManager 프록시, @Transactional 프록시를 직렬화할 수 있게 되었다. 특히 웹 애플리케이션 환경에서 유용할 듯

- FactroryBean과 HttpMessageConverter 같은 Generic 인터페이스의 Class 매개변수 선언을 좀 더 완하했다.

- JdbcTemplate의 쿼리 메서드에 가변인자를 사용했다.

- 보너스: 스프링의 JSP 태그라이브러리에 <spring:eval> 패그를 추가했다. JSP에서 SpEL 표현식을 사용할 수 있으며 스프링 3.0의 포매팅 시스템을 사용하여 포매팅된 결과를 보여줄 수도 있다. 기본적으로 JSTL의 <c:out>과 <fmt:*> 기능을 통합한 것으로 볼 수 있겠다.


top