Whiteship's Note

'2010/02'에 해당되는 글 42건

  1. 2010.02.28 [스프링 3.0] FormattingConversionServiceFactoryBean에 들어있는 Converter와 Formatter (2)
  2. 2010.02.25 [BBC News] Pensioners accused kidnapping
  3. 2010.02.25 [Maven] 빌드 할 떄 특정 폴더 삭제하기 (2)
  4. 2010.02.25 클래스 로더의 loadClass()와 findClass()
  5. 2010.02.24 [MySQL] mysqldump 백업 복구 (2)
  6. 2010.02.23 [BBC News] Golden Glove winners announced
  7. 2010.02.23 자바 클래스로더 입문 퀴즈 정리 (2)
  8. 2010.02.23 [ClassLoader 퀴즈 끝] SpringSprout와 WhiteshipFactory가 참조하는 Whiteship은 누구인가.
  9. 2010.02.23 백기선's 2010 Weekly Report - 2/23 (2)
  10. 2010.02.22 [BBC News] Toyota recall reaches Eupore (2)
  11. 2010.02.22 핸드폰 역발상 (8)
  12. 2010.02.22 [ClassLoader 퀴즈 6] SpringSprout는 과연 Whiteship의 이름을 알 수 있을까? (4)
  13. 2010.02.22 [ClassLoader 퀴즈 5] Whiteship은 언제 로딩 될까? (2)
  14. 2010.02.21 [ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가? (10)
  15. 2010.02.19 [BBC News] Baijing hit by record snowfall (4)
  16. 2010.02.19 [ClassLoader 퀴즈 3] Whiteship은 Whiteship일까 아닐까? (2)
  17. 2010.02.19 [ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!! (5)
  18. 2010.02.19 [ClassLoader 퀴즈 1] Whiteship은 대체 누가 데려온 것일까? (8)
  19. 2010.02.19 Spring Framework 3.0.1 나왔구나
  20. 2010.02.18 [BBC News] Naples pizza protected by EU (5)
  21. 2010.02.18 [스프링 3.0] PropertyEditorRegistry가 이길까 ConversionService가 이길까 (2)
  22. 2010.02.18 [위핏] 나만의 트레이닝 방법
  23. 2010.02.17 [BBC News] Ukraine and Russia argue about spies (2)
  24. 2010.02.17 [Java] ClassLoader API (2)
  25. 2010.02.17 [스프링 3.0 @MVC] 컨트롤러에 스프링 AOP가 적용되지 않는다는건 이제 거짓말
  26. 2010.02.17 목표 실천은 진행 중 (12)
  27. 2010.02.16 [Maven] Exec Maven Plugin 사용하여 자바 프로그램 실행하기 (2)
  28. 2010.02.15 백기선 2010 목표 (12)
  29. 2010.02.12 파이어폭스에서 크롬으로 갈아타기 (4)
  30. 2010.02.11 [SVN] Spring Framework 3.0.0.RELEASE

[스프링 3.0] FormattingConversionServiceFactoryBean에 들어있는 Converter와 Formatter

Spring/3.0 : 2010.02.28 08:47


3.0에 새로 추가된  <mvc:annotation-driven>을 등록할 때 자동으로 등록되는 FormattingConversionServiceFactoryBean이 있을 때 기본으로 사용할 수 있는 Converter와 Formatter를 살펴보겠습니다.

사실 이 클래스는 프로젝트에서 확장할 가능성이 높은 클래스입니다. 사용하는 도메인에 대한 포매터를 제공할 가능성이 높기 떄문이죠. 그렇지 않고 그냥 쓴다는 건... 글쎄요. 스프링의 바인딩 기능을 제대로 활용하지 않고 있는 프로젝트일 가능성이 높습니다. 3.0 이전이었다면 모든 요청에 걸쳐 전역적으로 바인딩에 활용할 녀석을 PropertyEditorRegistrar(PER)를 구현한 클래스를 만들어  ConfigurableWebBindingInitializer에 빈으로 끼워넣었습니다.

그래서인지 <mvc:annotation-driven> 에도 conversion-service 속성을 제공하여 자신이 확장한 FCSFB를 끼워넣을 수 있게 해줍니다.

그런데.. 그냥 기본으로 사용할 때 대체 어떤 것들이 들어있는지는 API에도 명확히 나와있지 않습니다.
A factory for a FormattingConversionService that installs default formatters for common types such as numbers and datetimes.

Subclasses may override installFormatters(FormatterRegistry) to register custom formatters.

숫자나 날짜 같은 흔히 사용하는 타입에 대한 기본 포매터를 설치해준다. 확장할 땐 머시기 메서드를 써라.

흠.. 뭐가 있는지 알아야 쓰지 말입니다. @_@; 그래서 FCSFB 객체를 콘솔에 출력해봤습니다.

ConversionService converters =
    @org.springframework.format.annotation.DateTimeFormat java.lang.Long -> java.lang.String: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b, @org.springframework.format.annotation.NumberFormat java.lang.Long -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.DateTimeFormat java.util.Calendar -> java.lang.String: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b
    @org.springframework.format.annotation.DateTimeFormat java.util.Date -> java.lang.String: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b
    @org.springframework.format.annotation.NumberFormat java.lang.Double -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.NumberFormat java.lang.Float -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.NumberFormat java.lang.Integer -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.NumberFormat java.lang.Short -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.NumberFormat java.math.BigDecimal -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    @org.springframework.format.annotation.NumberFormat java.math.BigInteger -> java.lang.String: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.Character -> java.lang.Number : org.springframework.core.convert.support.CharacterToNumberFactory@69236cd5
    java.lang.Number -> java.lang.Character : org.springframework.core.convert.support.NumberToCharacterConverter@552c8fa8
    java.lang.Number -> java.lang.Number : org.springframework.core.convert.support.NumberToNumberConverterFactory@1cee1ede
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.lang.Long: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b, java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Long: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Calendar: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b
    java.lang.String -> @org.springframework.format.annotation.DateTimeFormat java.util.Date: org.springframework.format.support.FormattingConversionServiceFactoryBean$NoJodaDateTimeFormatAnnotationFormatterFactory@794e113b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Double: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Float: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Integer: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.lang.Short: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigDecimal: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> @org.springframework.format.annotation.NumberFormat java.math.BigInteger: org.springframework.format.number.NumberFormatAnnotationFormatterFactory@47ad6b4b
    java.lang.String -> java.lang.Boolean : org.springframework.core.convert.support.StringToBooleanConverter@4dbb9a58
    java.lang.String -> java.lang.Character : org.springframework.core.convert.support.StringToCharacterConverter@57922f46
    java.lang.String -> java.lang.Enum : org.springframework.core.convert.support.StringToEnumConverterFactory@67dacccc
    java.lang.String -> java.lang.Number : org.springframework.core.convert.support.StringToNumberConverterFactory@3fe2670b
    java.lang.String -> java.util.Locale : org.springframework.core.convert.support.StringToLocaleConverter@28db23f1
    java.lang.String -> java.util.Properties : org.springframework.core.convert.support.PropertiesToStringConverter@14be49e0
    org.springframework.core.convert.support.ArrayToArrayConverter@53f78b68
    org.springframework.core.convert.support.ArrayToCollectionConverter@9ac5f13
    org.springframework.core.convert.support.ArrayToObjectConverter@744d76b4
    org.springframework.core.convert.support.ArrayToStringConverter@1395dd5b
    org.springframework.core.convert.support.CollectionToArrayConverter@5e6214f5
    org.springframework.core.convert.support.CollectionToCollectionConverter@2eb0a3f5
    org.springframework.core.convert.support.CollectionToObjectConverter@4a5f2db0
    org.springframework.core.convert.support.CollectionToStringConverter@4edc41c5
    org.springframework.core.convert.support.IdToEntityConverter@20e183e9, org.springframework.core.convert.support.ObjectToObjectConverter@359b46dc
    org.springframework.core.convert.support.MapToMapConverter@4b14b82b
    org.springframework.core.convert.support.ObjectToArrayConverter@14004204
    org.springframework.core.convert.support.ObjectToCollectionConverter@65493102
    org.springframework.core.convert.support.ObjectToStringConverter@2830ae41
    org.springframework.core.convert.support.StringToArrayConverter@3e5dc994
    org.springframework.core.convert.support.StringToCollectionConverter@58e41bc3

흠.. 저런 것들이 있군요.
저작자 표시
신고
top


[BBC News] Pensioners accused kidnapping

모하니?/English : 2010.02.25 23:45


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/02/100210_witn_pensioners.shtml

오늘은 좀 긴;;;

In Germany, if you think your financial advisor has been giving bad advice and messing up your investments, you can go to the regulators, you can go to the police. But, in Bavaria, one group of pensioners stands accued of employing much more direct method of registering their dissaticfaction. They're on trial for kidnapping their financial advisor and holding him hostage.

Four senior citizens, aged between 63 and 79 had invested nearly three and a half millon dollars to the US market and lost it all in the sub-prime morgage meltdown. They'd conclude that who'd handled the investment should now reimburse them.

According to prosecutors, last summer the pensioner possy plus one accomlice abducted the financial advisor out of his house, tied him, gagged him, put him in a box, and transport him in the boot of a cat 450 killometers to the lakeside retreat.

He claims to have spent four days locked in the celler there and to have been tortured. After agreeing their demands, the prisoner was allowed to sand a fax to Switzland arranging payment. He concealed the prase 'Call the police' in the text and the alram is raised. Soon after, a crack team of commanders came to the recue.

On the opening day of the trial, the 74 year old aged ringleader of the gang avoided using the word 'kidnap'. He said he and his co-defandants had only wanted to treat their guest to a couple of days holiday in Bavaria.


저작자 표시
신고
top

TAG BBC

[Maven] 빌드 할 떄 특정 폴더 삭제하기

Build/Maven : 2010.02.25 18:15


http://maven.apache.org/plugins/maven-clean-plugin/examples/delete_additional_files.html

어헉...

빌드할 때 가끔 pom.xml에서 라이브러리 올렸는데 버전만 다르고 여러 개개 lib 폴더에 들어가는 바람에 에러나 생기는 현상이 종종 있는데;;

그걸 방지하기 위해

            <plugin>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>web/WEB-INF/lib</directory>
                        </fileset>
                        <fileset>
                            <directory>web/WEB-INF/classes</directory>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>

여기서 clasess 폴더는 빠져도 되지만 lib 폴더는 꼭 넣도록 합시다.

저녁 약속을 깜빡하는 바람에 초스피드 블로깅
저작자 표시
신고
top


클래스 로더의 loadClass()와 findClass()

Java : 2010.02.25 13:30


참조: http://onjava.com/pub/a/onjava/2005/01/26/classloading.html?page=1

클래스와 데이타

모든 클래스는 first-class 자바 객체를 통해서 자신의 코드를 참조할 수 있다. 컴파일 할 때 컴파일러가 public static final class 라는 이름의 java.lang.Class 타입 필드를 추가해준다.

일단 한 번 클래스가 JVM으로 로딩되면, 같은 클래스는 다시 로딩 되지 않는다. 여기서 "같은 클래스"란 해당 클래스를 로딩한 클래스로더와 해당 클래스의 풀네임으로 구성된 식별자로 구분한다. 

예를 들어, WhiteshipClassLoader가 로딩한 springsprout 패키지의 Whiteship클래스는 (WhiteshipClassLoader, springsprout, Whiteship) 식별자를 가지게되고, SpringSproutClassLoader가 로딩한 springsprout 패키지의 Whiteship클래스는 (SpringSproutClassLoader, springsprout, Whiteship) 식별자를 가지기 때문에 별개의 클래스로 인식된다는 것이다.

클래스 로더

모든 클래스는 java,lang.ClassLoader의 인스턴스가 로딩한다.

부트스트랩 클래스 로더: java.lang.Object 같은 핵심 자바 클래스를 로딩한다. 런타임 클래스들은 JRE\lib\rt.jar에 들어있다. 접근이 안 됨. sout(String.class.getClassLoader())를 호출하면 null이 나온다. 

확장 클래스 로더: 핵심 자바 런타임 코드 이외의 확장 라이브러리를 java.ext.dirs 속성의 경로에 넣어둘 수 있다. ExtClassLoader는 java.ext.dirs에 위치한 모든 .jar 파일을 로딩한다.

애플리케이션 클래스 로더: AppClassLoader는 java.class.path 시스템 속성에 해당하는 경로의 모든 클래스를 로딩한다.

컨텍스트 클래스 로더: java.lang.Thread는 getContextClassLoader()라는 메서드를 가지고 있다. 이 메서드는 특정 쓰레드에서 사용중인 클래스로더를 반환해준다. 컨텍스트 클래스 로더는 쓰레드를 만들 때 사용한 클래스 로더이며, 기본적으로 parent 쓰레드의 클래스로더가 할당 된다. setContextClassLoader로 변경 가능하다. 

클래스로더 동작 방식

protected synchronized Class<?> loadClass
    (String name, boolean resolve)
    throws ClassNotFoundException{

    // First check if the class is already loaded
    Class c = findLoadedClass(name);
    if (c == null) {
        try {
            if (parent != null) {
                c = parent.loadClass(name, false);
            } else {
                c = findBootstrapClass0(name);
            }
        } catch (ClassNotFoundException e) {
            // If still not found, then invoke
            // findClass to find the class.
            c = findClass(name);
        }
    }
    if (resolve) {
   resolveClass(c);
    }
    return c;
}

java.lang.ClassLoader의 loadClass() 메서드 코드이며 이 클래스를 확장하는 클래스는 findClass()를 재정의하는 것이 기본적이다. java.lang.ClassLoader의 findClass()는 ClassNotFoundException을 던진다.

findClass()를 구현할 떄는 특정 소스에서 바이트 코드를 가져오거나, 소스를 바이트 코드로 생성하거나, BCEL(Byte Code Engineering Library)를 사용할 수도 있다. 암튼.. 그렇게 해서 바이트 코드를 가져온 다음 defineClass() 메서드를 호출해서 byte 배열을 Class 인스턴스로 변환해야 한다. 

defineClass() 메서드 호출이 중요한데, 이 것을 호출한 클래스 로더가 바로 해당 클래스의 defining 클래스 로더가 되는 것이며 이 defining 클래스로더가 다를 경우 다른 클래스로 인식하게 된다. Whiteship.class.getClassLoader()를 실행했을 때 반환되는 클래스 로더가 바로 defining 클래스 로더다.

findClass 구현 예제 코드

    public Class findClass(String name)throws
        ClassNotFoundException{

        byte[] classBytes = findClassBytes(name);
        if (classBytes==null){
            throw new ClassNotFoundException();
        }
        else{
            return defineClass(name, classBytes,
                0, classBytes.length);
        }
    }


저작자 표시
신고
top

Java : 2010.02.25 13:30 Trackback. : Comment.

[MySQL] mysqldump 백업 복구

Linux : 2010.02.24 14:20


참조: http://osguru.tistory.com/entry/MySQL-DB-%EB%B0%B1%EC%97%85-%EB%B0%8F-%EB%B3%B5%EA%B5%AC-mysqldump

백업

mysqldump -u 계정 -p 비번 DB > 백업파일

복구

mysql -u 계정 -p 비번   DB < 백업파일

흠.. 잘하면 외울 수도 있겠구나;;
저작자 표시
신고
top


[BBC News] Golden Glove winners announced

모하니?/English : 2010.02.23 23:15


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/01/100118_witn_golden_globes.shtml

James Cameron, who's spent the past five years working on Avatar, was names the best director. The firm, whitch is on course to become the highest grossing of all time, is now considered to be in poll position.

The Handover, a firm aound a stag party in Las Vegas, won the aword for best comedy. Jeff Bridge, who plays a country music singer of the firm Crazy Heart, was named the best actor. And Marln Streep took the aword for best actress in a comedy for her portlayor of the American TV cheaf, the last Julia Child in Julie and Julia.

The most of celebraties worn ribbons in support of the peoples of Haiti. The TV watchers are encouraging to give money. The organisers of the show, the Holywood Forein Press Association, said they were donating $100,000 to the earthquake relief fund.

오늘은 LinkageError 때문에 녹음과 검사는 생략;;
저작자 표시
신고
top


자바 클래스로더 입문 퀴즈 정리

Java : 2010.02.23 22:30


  1. 21:15:40 [ClassLoader 퀴즈 끝] SpringSprout와 WhiteshipFactory가 참조하는 Whiteship은 누구인가.
  2. 2010/02/22 [ClassLoader 퀴즈 6] SpringSprout는 과연 Whiteship의 이름을 알 수 있을까? (2)
  3. 2010/02/22 [ClassLoader 퀴즈 5] Whiteship은 언제 로딩 될까? (2)
  4. 2010/02/21 [ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가? (9)
  5. 2010/02/19 [ClassLoader 퀴즈 3] Whiteship은 Whiteship일까 아닐까? (2)
  6. 2010/02/19 [ClassLoader 퀴즈 2] Whiteship은 내가 데려왔다!! (5)
  7. 2010/02/19 [ClassLoader 퀴즈 1] Whiteship은 대체 누가 데려온 것일까? (8)

입문 과정 퀴즈를 푸는데 필요한 학습 자료
- ClassLoader APi, 소스 학습
- URLClassLoader API, 소스 학습
- http://docs.jboss.org/jbossas/jboss4guide/r1/html/ch2.chapter.html#d0e2314

과제
- 위 Jboss 문서 2.2.2를 참조하여 클래스 로딩 관련 주요 예외 3종 세트 재현하기
- ClassCastException
- IllegalAccessException
- LinkageError

파이팅입니다.
저작자 표시
신고
top


[ClassLoader 퀴즈 끝] SpringSprout와 WhiteshipFactory가 참조하는 Whiteship은 누구인가.

Java : 2010.02.23 21:15


참조: http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/Class_Loading_and_Types_in_Java-LinkageErrors___Making_Sure_You_Are_Who_You_Say_You_Are.html#LinkageErrors___Making_Sure_You_Are_Who_You_Say_You_Are-Classes_demonstrating_the_need_for_loading_constraints

   @Test
    public void linkageError() throws Exception {
        FlaggedFileUrlClassLoader cl1 = new FlaggedFileUrlClassLoader("C:/intellij9-workspace/springsprout2/temp2/");
        FileUrlClassLoader cl0 = new FileUrlClassLoader("C:/intellij9-workspace/springsprout2/temp/", cl1);
      
        Class springSproutClass = cl0.loadClass("SpringSprout");
        Object springSprout = springSproutClass.newInstance();
        springSprout .getMethod("link").invoke(o1);
    }



public class SpringSprout {

    public void link(){
        System.out.println(Whiteship.class.getClassLoader() + " SpringSprout's Whiteship");
        Whiteship w = WhiteshipFactory.getWhiteship();
    }

}

public class Whiteship{
   
}

public class WhiteshipFactory {

    public static Whiteship getWhiteship(){
        System.out.println(Whiteship.class.getClassLoader() + " WhiteshipFactory's Whiteship");
        return new Whiteship();
    }
}

굵은 글씨 부분에서 아주 기가막힌 일이 벌어지도록 FlaggedFileUrlClassLaoder(FCL)를 만들었고, 그것으로 delegate하여 클래스를 로딩하는 UrlClassLoader(UCL)를 사용하여 SpringSprout 클래스를 로딩했습니다.

(parent 구조)

UCL -> FCL -> null

FCL은 temp2 폴더를 클래스패스로 취하며, UCL은 temp 폴더를 클래스패스로 취하고 있습니다.
temp2에는 SpringSprout가 참조하는 WhiteshipFactory가 들어있고..
temp에는 SpringSprout와 Whiteship이 들어있습니다.

(dependency)

SpringSprout -> WhiteshipFactory, Whiteship
WhiteshipFactoru -> Whiteship

1. SpringSprout는 UCL이 로딩합니다. UCL이 SpringSprout의 Defining CL이 되며, 동시에 Initial CL이 됩니다.

2. SpringSprout의 Defining CL인 UCL이 SpringSprout가 의존하는 WhiteshipFactory와 Whiteship을 로딩합니다.
- 이때 WhiteshipFactory는 UCL의 parent인 FCL의 클래스패스에 있기 때문에 FCL이 최초로 로딩합니다. 따라서 Defining CL는 FCL이 됩니다.
- Whiteship은 UCL의 클래스패스에 있기 떄문에 Defining CL은 UCL입니다.

3. WhiteshipFactory가 의존하는 Whiteship을 로딩합니다.
- 이때 WhiteshipFactory의 defining CL인 FCL이 Whiteship 로딩을 시도하는데 원래대로라면 FCL의 클래스패스에 Whiteship이 없기 때문에 ClassNotFoundException이 나와야 정상이지만 제가 만든 FCL은 자기가 로딩해버립니다. 따라서 WhiteshipFactory가 참조하는 Whiteship의 Defining CL은 FCL입니다.

4. SpringSprout의 link() 메서드를 실행합니다.
- Whiteship(UCL) = Whiteship(FCL) 최종적으로 이런 공식이 되버립니다.
- 이 위험한 순간 레퍼런스를 대입하기 전에.. loader constraint violation이 발동하여 LinkageError를 발생시킵니다.
- Whiteship 타입을 여러 클래스로더에서 안전하게 사용할 수도록 확인해주는 이 에러는 Liang와 Bracha가쓴 논문을 바탕으로 개선되었습니다. JVM 1.1 이하 버전에서는 이런걸 그냥 허용했다고 합니다.

loader constraint violation
- 레퍼런스를 대입하기 전에 해당 타입을 정의한 defining CL들이 다른지 확인하여 다르다면 에러를 발생시켜 줍니다.
- 이때는 initative CL이 다르던 말던 상관없습니다.


LinkageError를 재현해 보느라.. 오늘 하루를 몽땅 소진했습니다.

이번 퀴즈는.. 이 방법 말고 좀 더 간단하게 LinkageError를 재현해주는 분이 맞추시는 겁니다.
부디 나타나 주시길....
저작자 표시
신고
top

Java : 2010.02.23 21:15 Trackback. : Comment.

백기선's 2010 Weekly Report - 2/23

모하니?/Planning : 2010.02.23 05:51



이제 5시에 일어나는데 완전히 적응됐다. 주말에 알람 설정을 잘못해서 6시에 일어났더니 이제는 자다가 알람이 안 울린거 아닌가 하고 3시와 4시에 자동으로 눈이 떠지기도 했다. 하지만 몸이 피곤하긴 하다. 일요일은 보드를 타러가지 못하고 집에서 자고 밥먹고 공부하고 자고 밥먹고 놀고를 반복하며 푹 쉬었다.

그 뒤 하루 계획 짜는 시간은 1시간에서 30분으로 줄였다. 처음에는 5시에 못일어나서 헤롱 헤롱 거릴까봐 일부러 계획 짜는 시간을 넉넉하게 잡았는데 이제는 그럴 필요가 없을 것 같다. 남는 30분 정도는 영어 교재를 읽어야겠다.

번역은 생각보다 진도가 잘 안나갔다. 출근하자마자 보통 퀴즈를 풀거나 학습에 빠지는 바람에 잘 지키지 못했는데 오늘부턴 꼭 2시간 풀타임으로 번역을 하리라. 계획을 작성할 때 2시간 동안 몇 페이지까지 하겠다고 적어둬야겠다.

클래스로더 공부하는 시간과 시큐리티 PPT 만드는 시간을 바꿨다. 좀 더 머리가 잘 돌아갈 때 클래스로더를 공부하고 조금 피곤해지고 집중력이 떨어지는 시간에 시큐리티 PPT를 만드는게 체질에 맞는것 같다.

회사일도 번역만큼 집중이 잘 안 됐다. 잠깐 쉰다는 생각으로 일에도 신경써야겠다. 그런 의미에서 매일 회사일로 진행할 개발 일정을 미리 캘린더에 상세하게 적어두는게 좋겠다.

BBC News는 출퇴근 길 전철에서 풀타임으로 스크립트를 외운다. 덕분에 집에서는 별다른 학습 시간을 투자하지 않고 확인하는 시간만 가진다. 전날 저녁에 리스닝한 스크립트를 외웠는지 적어보고, 아내에게 외워서 낭송한 뒤, 아이팟으로 녹음해서 들어본다. 그리고 다음날 외울 스크립트를 골라서 리스닝을 한다.

운동하기는 잘 진행됐다. 단, 살이 빠지지 않고 오히려 찌고 있다. @_@;; 올라가는 그래프를 보고 있자니 씁쓸하다. 리듬 복싱을 했더니 어깨가 뭉친다. 더 뭉치기 전에 풀어줘야겠다.

책 읽기 시간도 잘 진행되지 않았다. 앞의 일정들이 조금씩 뒤로 밀리는 경향이 많았다. 그래도 잠은 일찍 자야 5시에 일어날 수 있으니 보통 11시 반 ~ 12시 사이에 잠을 잔다. 그러다보니 자연스래 책 읽는 시간이 줄어드는데 아무래도 책도 그날 그날 읽을 곳을 표시해놔야겠다.

전반적으로 세부 일정의 목표가 구체적일 수록 잘 지켜졌다. 회사일과 번역같이 뭉뚱그러진 일정은 잘 지켜지지 않았지만 위핏과 BBC News는 매우 잘 지켜졋다. 클래스로더 학습은 지나치게 많은 시간을 투자했다. 빠져들어서 공부하는게 재미도 있고 성과도 있어서 이부분은 어떻게 해야할지 잘 모르겠다. 한참 집중해서 하고 있는데 시간 됐다고 내팽게칠순 없으니 말이다. 한계점을 설정하고 그 시간 내에서 최대한 집중해서 공부하는 식으로 고쳐나가야겠다.

마지막으로 일정에 가장 큰 영향을 끼치는 변수를 찾았다. 친구들과의 술약속인데 거의 퇴근 이후의 일정을 하나도 하지 못한다. 그렇다고 인연을 끊을 수는 없지 않은가. 많이 봐야 한달에 한번인데 그 정도는 봐주자.

좋아.. 이래저래 planning 끝.
저작자 표시
신고
top

TAG TODO

[BBC News] Toyota recall reaches Eupore

모하니?/English : 2010.02.22 21:23


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/01/100129_witn_toyota_page.shtml

Toyota says the number of vehicles and the models that will be recalled in Europe, is still being investigated. It said in some rare cases the accelerator padal mechanism could become worn and stick while pressed down.

The same problem, which may cause a car to speed out of control, has lad to a recall of 2.3 million vehicles in North Ameria. Sales have been suspended of 8 eight Toyota models there, include the best-selling Carmly. Productions will be stopped for at least a week in company's fatories in the United States and Canada.

In the a seperate move, Toyota is recalling over 5 million vehicles in the United States to change replace accelerators which could become stuck under floor mates mats. Some vehicles are affacted by both problems.

The safety concerns are damaging Toyota's reputation for reliability and quality, whitch helpled it to overtake General Motors to become the world's biggest car maker. In Tokyo the company's shares fell by 3.9% on Thursday on the top of a 4.3% drop on Wednesday.

오늘은 발음한 것도 녹음해서 올려봅니다.
지적해주시면 그저 감사할 따름입니다.





저작자 표시
신고
top


핸드폰 역발상

모하니?/Thinking : 2010.02.22 18:13


요즘 스마트폰이 대세라고 열심히 떠들고 열심히 사고 열심히 개발하는 것 같다. 하지만 난 그 비싼 요금제와 그 많은 기능들이 들어있는 휴대폰은 필요가 없다. 그냥 문자랑 전화만 되면 된다.

나머지 기능들은 핸드폰에게 추가적인 역할만 더해질 뿐이다. 객체-지향 개발자라면 SRP 원칙을 들어봤을 것이다. Single Responsibility Principal 단일책임원칙이다. 지금 나오는 그리고 앞으로 나올 휴대폰들은 이 원칙을 지나치게 위배하게 될 것이다. 복잡해지고 비싸질 것이다.

난 다음에 핸드폰을 사려면 당장 나에게는 필요도 없는 기능과 부품들이 덕지 덕지 붙어있는 비싼 폰을 비싼 약정과 함께 구매해야 할지도 모른다. 그래서 조심해야 한다. 자칫 핸드폰을 던지고 싶은 화가 치밀더라도 꾹 참아야 한다. 그리고 가끔 공짜 폰을 주겠다며 사기치는(달콤한 말로 헛 돈을 뜯어내는) 전화들이 오면 그냥 끊어주는게 시간과 돈을 절약하는 길이다. 세상에 공짜가 어디있냐...

정말 심플한 기능과 부품으로 최소한의 기능만 잘 동작하는 기기를 싼 값에 싼 요금제와 함께 제공해주는 통신사가 있다면.. 그 회사야 말로 "경영혁신"을 했다고 칭찬해주고 싶다.

이상.. 아이팟터치 유저가... ㅋㅋㅋㅋㅋ
저작자 표시
신고
top


[ClassLoader 퀴즈 6] SpringSprout는 과연 Whiteship의 이름을 알 수 있을까?

Java : 2010.02.22 15:15


    @Test
    public void illegalAccessException() throws Exception {
        FileUrlClassLoader fUCL1 = new FileUrlClassLoader(CLASSPATH, null);
        Class whiteshipClass = fUCL1.loadClass(WHITESHIP);
        Object whiteship = whiteshipClass.newInstance();

        System.out.println(this.getClass() + " " + this.getClass().getClassLoader());
        System.out.println(whiteshipClass + " " + whiteshipClass.getClassLoader());

        whiteshipClass.getDeclaredField("name").get(whiteship);
    }

public class Whiteship2 {

    String name = "keesun";
}


이 테스트를 실행한 결과 중 일부는 다음과 같습니다.

class sandbox.classloader.ClassloaderTest sun.misc.Launcher$AppClassLoader@19821f <- CL1
class sandbox.classloader.Whiteship2 ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ<- CL

1. CL의 값은 CL1일까요? 아니면 전혀 다른 값?
2. 그 뒤 코드의 굵은 줄을 실행한 결과는 어찌됐을까요? 무사히 실행하고 keesun을 가져왔을까요? 에러가 났을까요? 에러가 났다면 어떤 에러가 났을까요?


저작자 표시
신고
top


[ClassLoader 퀴즈 5] Whiteship은 언제 로딩 될까?

Java : 2010.02.22 15:07


public class SpringSprout {

    Whiteship2 whiteship;

    public void makeWhiteship(){
        whiteship = new Whiteship2();
    }
}

이런 클래스가 있을 때 SpringSprout가 참조하는 Whiteship2는 과연 언제 클래스로더에 의해 로딩이 될까요? SpringSprout를 로딩할 때? SpringSprout 객체를 생성할 때? Whiteship2 인스턴스를 생성할 때. 이 중 하나가 아닐까요?

   @Test
    public void whenDoseTheDependeciesWillBeLoaded() throws Exception {
        FileUrlClassLoader fUCL1 = new FileUrlClassLoader(WIN_TEMP_CLASSPATH);
        Class springSproutClass1 = fUCL1.loadClass(TEMP_SPRING_SPROUT);
        Object springSprout1 = springSproutClass1.newInstance();

        assertThat(fUCL1.isLoadedClass(TEMP_WHITESHIP), is(B1));

        Object whiteship1 = springSproutClass1.getMethod("makeWhiteship").invoke(springSprout1, null);

        assertThat(fUCL1.isLoadedClass(TEMP_WHITESHIP), is(B2));

        System.out.println(fUCL1.loadClass(TEMP_WHITESHIP).getClassLoader());
        System.out.println(fUCL1.loadClass(TEMP_SPRING_SPROUT).getClassLoader());
    }

그래서 위와 같은 테스트를 만들어봤습니다.
이 테스트가 통과하려면 B1과 B2에는 각각 어떤 값이 들어가야 할까요?

기타 조건은 이전 글과 동일합니다.
저작자 표시
신고
top


[ClassLoader 퀴즈 4] SpringSprout가 알고 있는 Whiteship은 누구인가?

Java : 2010.02.21 21:29


퀴즈 3번을 다시 낸거라 생각히셔도 되겠습니다. 2, 3번을 푸셨다면 이 문제도 역시 간단하게 푸실 수 있을 겁니다.

   @Test
    public void classCastException() throws Exception {
        URLClassLoader uCL1 = new FileUrlClassLoader(TEMP_CLASSPATH);
        Class springSproutClass = uCL1.loadClass(TEMP_SPRING_SPROUT);
        Object springSprout = springSproutClass.newInstance();
        Class whiteshipClass1 = uCL1.loadClass(TEMP_WHITESHIP);
        Object whiteship1 = whiteshipClass1.newInstance();

        URLClassLoader uCL2 = new FileUrlClassLoader(TEMP_CLASSPATH);
        Class whiteshipClass2 = uCL2.loadClass(TEMP_WHITESHIP);
        Object whiteship2 = whiteshipClass2.newInstance();

        Method cast = springSproutClass.getMethod("castWhiteship", Object.class);
        cast.invoke(springSprout, whiteship1); // C1
        cast.invoke(springSprout, whiteship2); // C2
    }

TEMP_CLASSPATH는 이 프로젝트의 기본 클래스패스가 아닙니다.
TEMP_SPRING_SPROUT는 SpringSprout.java 클래스의 이름이고
TEMP_WHITESHIP은 Whiteship.java 클래스의 이름을 줍니다.

SpringSprout 클래스에 있는 castWhiteship 메서드는 다음과 같습니다.

    public void castWhiteship(Object object){
        Whiteship2 whiteship = (Whiteship2)object;
    }

C1에서는 아무 일 없지만 C2에서는 바로 저 부분에서 ClassCastException이 발생하죠. 그 이유는 퀴즈 3에 대한 답으로 성윤군이 달아줬지요.

그럼 이번 문제는 조금 다르게...

public void hi(Whiteship whipteship){
    // 띵까 띵까..
}

SpringSprout에 이런 메서드가 있을 때 저 메서드를 호출할 때 whiteship1와 whiteship2 객체를 각각 전달해 준다면 어떤 일이 벌어질까요?

        Method cast = springSproutClass.getMethod("hi", whiteshipClass1);
        cast.invoke(springSprout, whiteship1); // H1
        cast.invoke(springSprout, whiteship2); // H2


저작자 표시
신고
top


[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


[BBC News] Naples pizza protected by EU

모하니?/English : 2010.02.18 21:12


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/02/100205_witn_pizza.shtml

자 오늘도 어디 외운티좀 내 보실까..

For 25 years pizza makers in Naples have been trying to get their product protected, and now it is, being granted a TSG, or Traditional Specialty Guaranteed label by the EU. The head of the pizza makers' association said the trademark was a great honour. The EU's agriculture commissioner said Naeplizian Neopolitan pizza was now part of Europe's food heritage.

It means that all pizzerias aspiring to supply the real thing are, in future, supposed to be vetted by a special commission that will check standars. They include only use using only San Mazarno tomatoes and fresh buffalo mozallera mozzarella cheese.

The Italian farmers' association says that half of Italy's 25,000 pizzerias currently use the wrong ingredients, like East European's cheese or Ukrainian flour.

Italy now tops the EU chart for products that are protected. It has 180, more then Spain or France. Protected status enables producers to not only boost boast about theri exclucivity but also charge a premium. Now pizza makers from Naples will get their slice of the action.

피자가 아니라 핏짜..
신고
top

TAG 핏짜

[스프링 3.0] PropertyEditorRegistry가 이길까 ConversionService가 이길까

Spring/3.0 : 2010.02.18 17:24


public class Whiteship {

    String name;

    public Whiteship(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


public class SpringSprout {

    private Whiteship whiteship;

    private int num;

    public Whiteship getWhiteship() {
        return whiteship;
    }

    public void setWhiteship(Whiteship whiteship) {
        this.whiteship = whiteship;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

이렇게 두 개의 클래스가 있을 때 Whiteship을 SpringSprout로 주입하는 빈 설정을 다음과 같이 했다.

    <bean class="sandbox.convert.SpringSprout">
        <property name="whiteship" value="keesun"/>
        <property name="num" value="1"/>
    </bean>

동작할까 안할까?

당연히 안한다. Whiteship 타입이 필요한데 keesun이라는 문자열을 던져주다니 장난 하는게냐 라고 예외를 던질꺼다.

하지만 되게 만들 수 있다. 이전까지는 PropertyEditorSupport 클래스를 확장하여 아주 손쉽게 구현할 수 있었다.

public class WhiteshipPE extends PropertyEditorSupport {

    @Override
    public String getAsText() {
        return ((Whiteship)getValue()).getName();
    }

    @Override
    public void setAsText(String name) throws IllegalArgumentException {
        setValue(new Whiteship(name));
    }
}

이런 코드는 특히 MVC에서 바인딩 할때 매우 유용하다. 이걸 안쓰면 request에서 일일히 꺼내서 노가다를 해야하는데 난 절대로 그러고 싶지 않다.

그런데 PE의 문제는 쓰레드-세이프하지 않다는 것이다. 그래서 PE를 등록할 때 조심해야 한다. 특히 전역 변수를 가지는 PE를 싱글톤으로 바인더에 등록해버리지 않았나 조심해야 한다. 반드시 그때 그때 new를 사용해서 등록해 주도록 하고 PE 생성자에 필요한 레퍼런스를 전달해주는게 안전하다. 아마 이 내용도 사부님 책에 들어갈 것 같으니 자세한 내용은 그 책을 참고하도록 하자.

PE의 대안이자 좀 더 범용적인 변환기 역할로 3.0에 도입된 것이 ConversionService이고 ConversionServiceFactoryBean에 Converter, ConveterFacrtory, Formatter 등을 등록해놓고 변환을 부탁할 수 있게 되었다.

public class WhiteshipConverter implements Converter<String, Whiteship> {
    public Whiteship convert(String source) {
        return new Whiteship(source);
    }
}

그런데;; PE와 역할이 중복되는데;;; 둘 다 빈으로 등록해둘수 있다.


    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="propertyEditorRegistrars">
            <bean class="sandbox.convert.CustomPERegister">
            </bean>
        </property>
    </bean>

    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="sandbox.convert.WhiteshipConverter"/>
            </set>
        </property>
    </bean>

결국 문제는 대체 String을 Whiteship으로 바꿔야 할 때 PE를 쓸 것이냐 CS를 쓸 것이냐이다. 무엇을 쓰게 될지... 그게 궁금했었다. 그런데 마침 오늘 사부님이 퀴즈를 냈고;; 난 스케줄을 팽개치고 매달렸다;;

1차 문제 상황

CS와 PE가 등록되어 있을 때 PE가 이겼다.
하지만 난 CS가 이기는 경우를 예제에서 본적이 있었다. 그래서 도무지 납득이 되지 않았고 어떻게 설정해야 가능한지 궁금했다.

CS만 등록했을 땐 CS로 동작했다.
PE만 등록했을 땐 PE로 동작했다.
둘다 등록했을 땐 PE가 동작헀다.

2차 문제 상황

Whiteship만 가지고 테스트를 했었는데 기본 타입도 추가해봤다. int num이 그것이다. 이제 더 큰 문제가 생겼다.
Whiteship만 PE가 이기고 나머지 기본 타입은 CS가 이겼다.
정말 깜놀이었다. 이사실을 발견하지 않았다면 난 그냥 클래스로더를 공부했을 것이다.

어디선가 기본 PE를 덮어쓰거나 없애버린 거 아닌지 궁금했고 소스 코드를 뒤져보기 시작했다.
시간이 손살같이 지난간다.
우울해지기 시작한다.

3차 결론

소스 코드를 뒤적거리다가 ConvertingPropertyEditorAdapter 클래스를 찾았다.
이 클래스는 ConversionService를 사용해서 PE를 노출시켜주는 어댑터다.
겉으로는 PE를 등록한것 같지만 실제로는 ConvesionService를 사용하는 것이다.ㅋ

스프링에서 내부에서 저걸 사용해서 기본 PE들을 등록하도록 바꿨는지는 확인하지 않았다.
왠지 답이 아닌것 같다. OTL..
내가 졌다.

트릭같은 기법을 써서라도 PE를 누르고 아니 속이고 CS가 동작하게 했으니...그만 놓아줄 수 있을 것 같다.
어서 사부님 책이 나와주길....

ps: 위에 나온 코드는 급조한 코드오니 조심할 부분을 건너뛴 곳도 있습니다. 주의하세요.
신고
top


[위핏] 나만의 트레이닝 방법

모하니?/운동해 : 2010.02.18 05:44


http://www.nintendo.co.kr/Wii/software/wiifit/main.php

처음 위핏을 하면 할 수 있는 운동이 몇 개 없다. 어느정도 쉬운 운동과 게임에 시간을 투자해야 새로운 게임이 열리는 형식이다. 처음 하루 이틀은 쉬운 운동과 게임으로도 어느정도 재미(?)를 맛볼 수 있다. 어떤 시스템으로 나를 움직이고 게임에 집중하게 만드는지 파악하는건 굉장히 흥미로운 일이니깐 말이다.

하지만 조금 시간이 지나면 지루해진다. 때로는 게임의 시스템에 맞추려고 하다가 오히려 운동이 되지 않는 경우도 있다. 그럴 땐 점수보다는 운동을 선택해야 하거늘 와이프와 점수 내기가 걸리기라도 하면 운동이고 뭐고 점수가 더 중요하다. ㅋㅋ 그래서일까 운동도 안 되고 지루해져서 다른 게임에 빠져들었다.

뉴 수퍼마리오 브라더스는 정말 꼭 해봐야 하는 게임이라고 추천하고 싶을 정도다. 화면에서 동시에 네명까지 뛰어다니면서 서로 들고 밟고 누르고 날아다닐 수 있는 아이템도, 수영을 잘할 수 있는 아이템도 있어서 굉장히 재미있다. 거기에 난이도 또한 갈수록 높아지면서 .아;;; 갑자기 삼천포로;; 그렇다. 지금 딱 이런 형태로 다른 게임에 빠져들었고 위핏은 나몰라라 침대 및에 누워있었다.

하지만 어제 드디어 위핏 활용 전략을 세웠다.

1. 간단한 요가 2~3개로 몸을 푼다.

http://www.nintendo.co.kr/Wii/tvcm/tvcm_wiifit_v_yoga.php

처음에는 움직이기가 싫고 땀을 빼는게 싫다. 하지만 해야한다. 그럴때 좋은게 요가다. 몸을 스트레칭할 수 있는 요가 위주로 몇 개 하면서 몸을 풀어준다.

2. 유산소 운동으로 땀내기

2-1. 댄스

처음에는 그다지 움직임이 많지 않은 댄스로 시작하지만

2-2. 리듬 복싱

http://www.nintendo.co.kr/Wii/tvcm/tvcm_wiifit_v_rhythmboxing.php

퍽퍽 거리는 손맛이 있어서 은근히 재밌고 주먹을 뻗으면서 운동이 조금 된다.

2-3. 훌라후프

본격적으로 땀이나기 시작한다.
어제는 훌라후프 400개를 넘개 돌려서 1위를 차지했다. 캬캬캬.

3. 근력 운동

3-1. 도전 팔굽혀펴기

가상 트레이너를 상대로 누가더 많이 하나 겨룰 수 있는데;; 뭐.. 말이 겨루는거지 걍 할 때마다 조금씩 해야 하는 갯수가 올라가는 것 같다. 어젠 10개만 해도 내가 이기는거라 이겼는데 지면 어떻게 될지 궁금하다. 10개에서 지면 다음에도 10개겠지 아마.

3-2. 도전 V자 만들기

이게 복부 운동이 조금 된다. 역시 위와 같은 시스템이다.

4. 게임

이정도 하면 30~40분이 된다. 이제 조금 쉬면서 스키점프 같은 게임을 해주면 된다.
와이프 기록이 340이 넘는데 도무지 못 깨겠다.. @_@;; 어떻게 한거람;;; 난 310이 최고..

http://www.nintendo.co.kr/Wii/tvcm/tvcm_wiifit_v_skijump.php

5. 신체측정

http://www.nintendo.co.kr/Wii/software/wiifit/sub01.php

처음 위핏을 시작하면 체중을 제고 표준 체형에 비해 어떤지 측정해준다. 그리고 목표를 정하고 현재 그 목표에 얼마나 다달았는지 측정해주기 시작한다. 내 체중의 변화는 기본이고 내가 매일 운동한 총 시간과 어떤 종류의 운동을 몇 분간 했는지 그래프로 보여준다. 체중을 측정하는 시간이 다르다면 매일 비슷한 시간에 재는 것을 권해주기도 한다.

꾸준히 해보자꾸나~

신고

'모하니? > 운동해' 카테고리의 다른 글

[위핏] 나만의 트레이닝 방법  (0) 2010.02.18
개봉동에서 다시 운동 시작!  (6) 2009.03.05
자전거 타기 시작  (0) 2008.03.21
줄넘기 상황판  (0) 2007.08.02
줄넘기 대만족  (8) 2007.07.25
으윽.. 안돼..  (0) 2007.05.12
top


[BBC News] Ukraine and Russia argue about spies

모하니?/English : 2010.02.17 21:38


http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2010/02/100203_witn_russia_ukraine.shtml

어제 저녁 받아적기를 시작으로 오늘 틈틈히 외운 뉴스.
이따가 와이프가 오면 발표해봐야지... 과연 알아 들어줄까나..
그전에 마무리 삼아 외워서 적어본다.

Ukraine says that the five alleged Russian spies were caught with a camera concealed inside a pen, other espionage equipment and 2000 dollars. a reported deribe a for Ukrainian contact.

The head of Ukraine's security serivce says that the five were trying to obtain military secrets. Four of them have been expelled from Ukrain, while the fifth has been detained.

Russia's security service, the FSB has confiemd the detention, but denied the Ukrainian version of events. The FSB said its actions were a response to the recruitment of Russians by Ukrainian security services.

The mutual recriminations come at a highly sensitive time. Just two weeks ago, Russia sent an ambassador to Ukrain after a five month absence. And on Sunday, Ukrainians will vote in an ellection to choose a successor to the outgoing president Victer Yuchenko.

Mr Yuchenko's time in office has been marked by strained relations with Moskova, and his department was being seen as an opportunity for an improvement in ties beteewn two countries.

정답

Ukraine says that the five alleged Russian spies were caught with a camera concealed inside a pen, other espionage equipment and $2000 - a reported bribe for a Ukrainian contact.
The head of Ukraine's security service says that the five were trying to obtain military secrets. Four of them have been expelled from Ukraine, while the fifth has been detained.

Russia's security service, the FSB, has confirmed the detention, but denied the Ukrainian version of events. The FSB said its actions were a response to the recruitment of Russians by the Ukrainian security services.

The mutual recriminations come at a highly sensitive time. Just two weeks ago, Russia sent an ambassador to Ukraine after a five month absence. And on Sunday, Ukrainians will vote in an election to choose a successor to the outgoing President, Viktor Yushchenko.

Mr Yushchenko's time in office has been marked by strained relations with Moscow, and his departure was being seen as an opportunity for an improvement in ties between the two countries

헐... 쓰면서 외워야겠군;;; 입으로만 외웠더니 쓰기가 안되는구나;
자 이제 위핏이나 해보실까~
신고
top

TAG BBC News

[Java] ClassLoader API

Java : 2010.02.17 18:36


http://java.sun.com/javase/6/docs/api/java/lang/ClassLoader.html

클래스를 로딩하는 책임을 지니고 있는 추상 클래스. 

기본전략: 바이너리 이름(String)을 받아서 파일 이름으로 바꾸고 파일 시스템에서 해당하는 이름의 클래스 파일을 읽어들인다.

위임 모델(delegation model)을 사용하여 클래스와 리소스를 찾는다. 각각의 ClassLoader 인스턴스는 연관된 상위(parent) 클래스 로더를 가지고 있다. 자신이 찾아 보기전에 상위 클래스 로더에 요청하여 먼저 찾아본다. VM 내장 클래스 로더인 "부트스트랩 클래스 로더"는 상위 클래스 로더가 없고 자신이 다른 ClassLoader 인스턴스의 상위가 된다.

보통 JVM은 플랫폼-독립적인 방식으로 로컬 파일 시스템에서 클래스를 읽어들인다. 예를 들어 유닉스 시스템에서 VM은 CLASSPATH 환경 변수에 정의되어 있는 디렉토리에서 클래스를 로딩한다.

하지만 어떤 클래스들은 파일에서 읽어오지 않고 네트워크에서 가져오거나 애플리케이션이 동작하면서 만들어지는 것도 있다. defineClass 메서드는 바이트 배열을 Class 클래스 인스턴스로 변환한다. Class.newInstance를 사용하여 그렇게 새로 정의된 클래스 인스턴스를 만들 수 있다.

클래스로더에 의해 만들어지는 객체의 메소드와 생성자는 다른 클래스를 참조할 수도 있다. 그렇게 참조하는 클래스들을 판단하기 위해 VM은 원래 클래스를 생성한 클래스 로더의 loadClass 메서드를 호출한다.

예를 들어 네트워크 클래스 로더를 만들어 다른 서버에서 클래스 파일을 다운로드 할 수도 있다. 다음은 예제 코드다.

ClassLoader loader = new NetworkClassLoader(host, port);
Object main = loader.loadClass("Main", true).newInstance();

네트워크 클래스 로더는 반드시 findClass와 네트워크에서 클래스를 읽어올 loadClassData를 정의해야한다. 바이트코드를 다운로드 한다음 defineClass를 사용하여 class 인스턴스를 만들어야 한다. 다음은 예제 구현체다.

     class NetworkClassLoader extends ClassLoader {
         String host;
         int port;

         public Class findClass(String name) {
             byte[] b = loadClassData(name);
             return defineClass(name, b, 0, b.length);
         }

         private byte[] loadClassData(String name) {
             // load the class data from the connection
              . . .
         }
     }
 

바이너리 이름

클래스로더에 전달되는 문자열로 표현한 클래스 이름은 다음에 정의된 자바 언어 표준을 따라야 한다.

예)
   "java.lang.String"
   "javax.swing.JSpinner$DefaultEditor"
   "java.security.KeyStore$Builder$FileBuilder$1"
   "java.net.URLClassLoader$3$1"

defineClass

- protected final Class<?> defineClass(String name, byte[] b, int off, int len) throws ClassFormatError

바이트를 Class 클래스의 인스턴스로 변환한다. Class는 resolve를 한 다음에 사용해야 한다. 

loadClass

- public Class<?> loadClass(String name) throws ClassNotFountException

loadClass(naem, false); 호출

- public Class<?> loadClass(String name, boolean resolve) throws ClassNotFountException

기본 동작은 다음과 같다.
1. findLoadedClass(String)을 호출하여 클래스가 이미 로딩되었는지 확인한다.
2. 상위 클래스 로더의 loadClass 메서드를 호출한다. 만약 상위 클래스 로더가 null이면 VM 내장 클래스 로더를 사용한다.
3. findClass(String) 메서드를 사용하여 클래스를 찾는다.

만약에 위 과정을 통해 클래스를 찾은 뒤에 resolve 플래그가 true면 반환받은 Class 객체를 사용하여resolveClass(Class) 메서드를 호출한다.

클래스로더의 하위 클래스들은 이 메서드가 아니라 findClass(String)을 재정의 할 것을 권한다.
(이런걸 지켜야 리스코프 원칙을 지켰다고 하던가...)

findLoadedClass

- protected final Class<?> findLoadedClass(String name)

만약 이 클래스로더가 JVM에 initiating 로더로 기록되어 있다면 name에 해당하는 클래스를 반환한다. 그렇지 않으면 null을 반환한다.

findClass

- protected Class<?> findClass(String name) throws ClassNotFoundException

기본 구현체는 ClassNotFoundException을 던진다. 따라서 클래스 로더를 확장하는 클래스가 이것을 구현하여 delegation 모델을 따르는 구현체를 만드는데 사용해야 한다. loadClass 메서드에서 상위 클래스 로더를 확인 한 뒤에 호출된다.
(그냥 클래스만 찾으면 되지 꼭 delegation 모델을 따라야 하는건가... 사실 loadClass가 public이라 그것도 재정의하면 그만인것을. 강요하려면 하고 말려면 말지 어중간한거 아닌가..)

resolveClass

- protected final void resolveClass(Class<?> c)

해당 클래스를 링크한다. 이 메서드는 클래스 로더가 클래스를 링크할 때 사용된다. 만약 클래스 c가 이미 링크되어 있다면 이 메서드는 그냥 끝난다. 그렇지 않은 경우라면 자바 언어 스팩의 "Execution" 챕터에 기술되어 있는대로 클래스를 링크한다.

링크


링크하기(Linking)란 클래스 또는 인터페이스 타입의 바이너리를 가져와서 JVM의 런타임에 연결하여 실행 할 수 있는 상태로 만드는 것이다. 

링크 과정은 세 가지 세부 활동으로 구성된다: verification, preparation, resolution

링크 활동 구현내용은 달라질 수 있다. 예를 들어 클래스가 사용되는 순간에 개별적으로 클래스나 인터페이스에 있는 심볼릭 레퍼런스를 확정하거나(lazy or late resolution), 검증하고나서 바로 확정할 수도 있다.(static). 즉 어떤 구현체에서는 클래스나 인터페이스를 초기화 한 이후에도 확정(resolution) 프로세스가 계속 될 수 있다는 것이다.

Verification, Preparation, Resolution


Verification: 클래스나 인터페이스의 바이너리가 구조적으로 올바른지 확인한다. 검증에 실패하면 LinkageError의 하위 클래스 중 하나인 VerifyError가 발생한다.

Preparation: 클래스나 인터페이스의 static 필드를 만들고 그런 필드들을 기본 값으로 초기화 하는 과정이 포함된다. 이 과정 중에 JVM 코드를 실행할 필요가 없다. 명시적인 static 필드 initializer는 이 과정이 아니라 initialization 과정에서 실행된다.

Resolution: 심볼릭 레퍼런스는 resolution단계를 지나야지 사용될 수 있다. 심볼릭 레퍼런스가 유효하고 반복적으로 사용되면 다이렉트 레퍼런스로 교체되어 보다 효율적으로 처리된다.

만약 이 단계를 지나다가 IncompatibleClassChangeError를 포함한 이 하위 에러들이 발생할 수 있다. IllegalAccessErrorInstantiationError, NoSuchFieldError, NoSuchMethodError

추가적으로 구현체를 찾을 수 없는 native 메서드를 선언한 클래스에서는 UnsatisfiedLinkError가 발생할 수 있다. 

하악 하악.. 오늘은 여기까지.
신고
top


[스프링 3.0 @MVC] 컨트롤러에 스프링 AOP가 적용되지 않는다는건 이제 거짓말

모하니?/Coding : 2010.02.17 14:49


@MVC를 사용하면 좋은 점 중 하나가 스프링 AOP 적용이 쉽다는 겁니다. 아직도 여러 이유로 이전의 Controller 계층 구조를 이용해서 개발하시는 분들이 많겠지만 @MVC를 사용하시는 분들은 이점을 꼭 알고 계셔야 합니다. 스프링 @MVC도 이제 스프링 AOP가 아주 잘 먹힙니다.

@Controller
public class TestController {

    @RequestMapping("/test")
    @Transactional
    public void test() {
        System.out.println("hi!!!!!!!!!!!!!!!!!!!!!!");
    }

}

하지만 그렇다고 해서 이런 코드를 작성해 달라는 것은 아닙니다. 절대로.. 네버..

어찌됐든 위와 같은 코드도 동작하게 되어있는데 경우에 따라서는 안 될 수도 있습니다. 그런 경우는 스프링 트랜잭션이나 스프링 시큐리티 애노테이션에 문제가 있는것이 아니라 빈설정과 관련이 있을 수가 있으니 빈 설정을 잘 보셔야 합니다.

만약 위와 같은 경우라면.. @Controller 빈이 만들어지는 ApplicationContext와 tx:annotation 머시기가 등록되는 ApplicationContext가 같은지 확인해봐야 합니다.

정말,, 굳이.. 컨트롤러에 AOP를 적용해야 한다면 http://toby.epril.com/?p=934 이 글따라서 DS가 만드는 WebAC 하나로 모두 통합하는 것도 좋겠습니다.
신고
top


목표 실천은 진행 중

모하니?/Planning : 2010.02.17 07:49


목표를 세우고 바로 실천 전략을 세웠다. 마침 좋은 영어 학습 사이트를 알게됐다. 어제 하루 계획대로 해봤더니 한텀이 너무 길어서인지 막판에가서는 다른 일이 많이 하고 싶어지고 집중력이 분산됐다. 그래도 확실하게 딴짓(?)할 시간과 본업에 충실할 시간을 구분했더니 효과는 있었다. 그리고 퇴근 이후의 일정은 예측하기가 힘들었다. 퇴근 길에 서점에 들렸더니 예상보다 2시간 가량이 늦어졌다. 결국 운동과 책읽기 일정은 포기했다.

오늘은 어제 해본 것을 바탕으로 시간을 좀 더 줄였다. 한텀에 최대 2시간이다. 순간 방심하면 한텀이 그냥 날아가버릴 수 있는 그런 시간이다. 긴장하고 집중하기에 적절한 것 같다. 그리고 퇴근 시간을 2시간 정도로 잡았다. 

출퇴근 시간에 진행하는 소소한 공부거리는 생략이다. 보통 GIU를 풀거나 리스닝을 한다. 또는 스터디 관련 자료를 읽는다. 하지만 이런건 계획하기 힘들다 그때그때 지하철 상황에 맞춰서 하는 일이 달라진다. 사람이 많아서 앉을 수 없다면 리스닝만 한다. 앉을 수 있다면 리스닝은 멈추고 GIU를 풀거나 스터디 관련 자료를 본다. 캘린더에 그런것까지 적긴 뭐하다. 생략이다.

앞으로도 계속 변경되겠지만 나는 맨날 계획만 세우는 사람이 아니며 평생을 유치원 수석이나 숙련된 초보로 살고 싶은 생각이 없다는 걸 다짐하기 위해서 스샷을 올려둔다. 

내가 지금 그런 사람이라고 생각하면 한없이 비참하고 몸서리가 쳐진다. 
하지만.. 그말이 나를 아침 일찍 눈뜨게 만들었다. 
이 얼마나 감사하고 유익한가.
달리자.



신고
top


[Maven] Exec Maven Plugin 사용하여 자바 프로그램 실행하기

Build/Maven : 2010.02.16 11:07


참조: http://www.vineetmanohar.com/2009/11/02/3-ways-to-run-java-main-from-maven/

이 플러그인을 사용하기 전까지 주로 사용하던 방법은 main() 메서드를 가지고 있는 자바 파일을 만들지 않고 그냥 테스트 클래스를 만드는 겁니다. 그러면 mvn test를 실행할 때 자동으로 실행되죠ㅋㅋ. 하지만 이 방법은 왠지 편법 같아서 main() 메서드를 가지고 있는 클래스를 실행해볼까 해서 찾아봤더니 exec 플러그인이 있더군요.

http://mojo.codehaus.org/exec-maven-plugin/index.html

1. pom.xml에 플러그인 추가하기

<plugins>
...
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1.1</version>
            </plugin>
...
</plugins>

2. goal

이 플러그인이 제공하는 goal은 세 가지가 있습니다.

exec:exec 외부 프로그램 실행하기
exec:help exec 플러그인 도움말 보기
exec:java 현재 VM에 있는 메인 클래스 실행하기

3. 사용하기

흠.. compile은 별도로 해줘야 하기 때문에 mvn:compile 정도를 한 뒤 mvn:java -Dexec.mainClass="실행할 클래스명"을 할 수도 있지만... 불편하죠;

mvn test만 사용해서 실행하도록 executions를 이용해서 test Phase에 java Goal을 끼워줍니다. 즉 pom.xml에 플러그인 설정을 다음과 같이 해줍니다.

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.1.1</version>
                <executions>
                    <execution>
                        <phase>test</phase>
                        <goals>
                            <goal>java</goal>
                        </goals>
                        <configuration>
                            <mainClass>whiteship.backup.BackupRunner</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

그럼 이제 mvn test을 실행하는 .bat 파일 만들어 놓고 윈도우의 '예약작업'으로 주기적으로 실행하도록 해놓으면 백업 배치 끝!! (리눅스라면 cron으로..블라 블라)

ps1: 어떻게보면 이 방법이 자바 애플리케이션을 서버처럼 띄워서 스케줄링하는 것 보다 시스템도 효율적으로 쓰는 것 같고 간편하네요.

ps2: 특히 윈도우의 예약작업은 리눅스의 cron처럼 공부하지 않아도 쓸 수 있으니.. 이럴 땐 윈도우도 좋네요.
신고
top


백기선 2010 목표

모하니?/Planning : 2010.02.15 21:02


  • IELTS general 6.0
  • Java Persistemce with Hibernate 번역
  • Spring Enterprise Recipe 번역
  • 몸무게 표준체형으로;;
  • 회사 시스템 여름까지 개발
  • 오픈소스 프로젝트 개발
  • 커뮤니티 활동 열심히
흠... ITELTS가 제일 힘들겠군.. 열심히 해야지.

신고

'모하니? > Planning' 카테고리의 다른 글

6월 2일 투표 방법 알아보자  (2) 2010.05.30
토비님 책으로 스프링 3.0 강의합니다.  (4) 2010.05.20
블로깅 계획  (0) 2010.05.06
백기선's 2010 Weekly Report - 2/23  (2) 2010.02.23
목표 실천은 진행 중  (12) 2010.02.17
백기선 2010 목표  (12) 2010.02.15
봄싹 Career Path  (6) 2009.12.17
이번주 토요일 IBM dW "웹 개발 다반사"  (2) 2009.12.03
봄싹을 알리러 갑니다.  (6) 2009.11.24
[Atlassian] 이직 계획  (2) 2009.11.02
[ToDo] 20091016  (0) 2009.10.16
top


파이어폭스에서 크롬으로 갈아타기

Good Tools : 2010.02.12 14:12


인터넷 익스플로러는 IE 전용 사이트를 띄우기 위한 용도일 뿐이고 빠르고 쾌적한 웹 서핑을 하려면 역시 크롬이 짱인 것 같습니다. 웹 서핑 속도가 ㄷㄷㄷ;;;

사실 브라우저를 새로 설치해서 갈아타는건 쉬운데 그동안 파폭에 머물러 있었던 이유는 그놈의 플러그인들... 제가 사용하던 필수 플러그인은 다음과 같습니다.
- 마우스 제스처(마우스로 페이지 이동, 탭 전환, 윈도우 닫기 축소 등등 가능)
- 북마크 동기화(여기 저기 여러 컴터에서도 일관적으로 유지되는 북마크 때문에 웹 서핑이 한결 편합니다.)
- IE 탭(IE 전용 사이트를 잠깐 볼 때 필요합니다. 제대로 쓰려면 그냥 IE를 띄워서 봐야하죠.)

이정도만 지원되면 바로 갈아타려고 했는데.. 크롬도 이미 지원하고 있더라구요. 캬~
사실 뭐 이 정도면 안 갈아탈 이유가 없는듯;
- 마우스 제스처 잘 되지.
- 파폭에 있던 북마크 동기화 플러긴이랑 똑같은게 있어서 그대로 연동되지.
- IE 탭 있지

갈아타기 끝~
신고
top


[SVN] Spring Framework 3.0.0.RELEASE

모하니?/Coding : 2010.02.11 16:07


스프링 프레임워크 SVN: https://src.springframework.org/svn/spring-framework
스프링 프레임워크 3.0.0.RELEASE: tags/spring-framework-3.0.0.RELEASE


좋아 좋아. 인텔리J구나 역시...
신고
top







티스토리 툴바