Functional Programming in Java 8 책의 6장에 Lambda를 이용하여 Lazy Initialization을 하는 방법이 나온다.

이 예제는 Heavy 객체의 생성을 Supplier 인터페이스를 이용해서 사용할 시점까지 지연시키는 예제다.

하지만 이 예제는 Heavy 클래스가 아닌 또 다른 heavy한 객체를 생성해야 할 때 매번 해당 클래스에 대한 HeavyInstanceHolder 클래스를 만들어 주어햐 하는 단점이 있다.

Jake라는 분이 이를 해결한 방법 Blog로 정리해 놓았다. 요점은 Heavy 클래스를 Lazy로 생성하는 부분을 T 형 타입으로 받아서 처리하면 된다.
그런데 synchronized 키워드를 붙여 thread-safe 하게 처리한 부분이 좀 이상해서 github을 따라 갔더니 코드가 조금 변경되어 있다.

해당 github 소스:

- test용 main 클래스
- Lazy Initialization 구현 클래스


하지만 여전히 문제가 있다. main 클래스에서 Heavy 객체를 생성하는 게 잘 표현되어 있지 않다!! Venkat(책 저자)의 의도가 드러나게 다시 바꿔보자.


먼저 초기화에 시간이 오래 걸리는 Heavy 클래스가 있다.


이 놈을 여러번 생성하는 테스트 클래스다. 2개의 쓰레드에서 Heavy 객체를 동시에 생성해 보자. 그리고 생성 후 Heavy 객체의 메소드를 호출해서 2번째 쓰레드가 같은 객체를 또 생성하지는 않는지, 지연 생성이 완료될 때까지 기다리고 있는 지도 확인 해 보자.


LazilyInstantiate 클래스다. Supplier를 이용해서 Heavy 생성 시점을 지연시키고, 한 번 생성된 객체는 재활용한다.


Main을 실행한 결과

Main start
Thread1 run
Main end
Thread2 run
Heavy Initiation started from Thread1
Heavy Initiation ended from Thread1
1
2


이제 Main 함수에서 Heavy 객체 외에 다른 객체(Heavy2)의 생성을 지연시키고 싶다면, 이렇게만 하면 된다.


저작자 표시 비영리 변경 금지
신고

Files 클래스에는 Java 8에서 추가된 find라는 메소드가 있다.

Funtional Programmin in Java 8 책의 3장에 ListSubDir.java 예제가 있는데,  해당 디렉토리의 하부 디렉토리까지만 가져오므로 완전한 예가 아니다.

find를 이용해서 어떤 디렉토리에 존재하는 모든 파일을 가져오도록 Stream API를 이용하여 작성해 보자.

Path start = Paths.get(".");

int maxDepth = 5; // Integer.MAX_VALUE로 하면 모든 파일을 가져올 수 있다

Files.find(start, maxDepth, (path, attr) -> true)

        .forEach(System.out::println);

만약 어떤 특정 파일 속성을 가지는 파일만 가져오고 싶다면 find의 3번째 인자를 수정하면 된다.

예를 들어 .java파일만 찾고 싶다면

(path, attr) -> path.toString().endsWith(".java")

이렇게 바꿔주면 된다.

저작자 표시 비영리 동일 조건 변경 허락
신고


저작자 표시 비영리 동일 조건 변경 허락
신고


Windows 7에서는 재부팅 전 설정해 둔 네트워크 드라이브 연결이 자꾸 끊어진다.

이렇게 해결하자!!


출처: http://mosei.tistory.com/entry/Win7네트워크-드라이브-자동연결




1. 메모장에 아래 내용을 작성한 후, netstart.bat 라는 이름으로 (확장자는 bat 또는 cmd 여야 함) 저장한다. (빨간색 글씨만 각 정보에 맞게 수정해서 적어주고 검정색 글씨는 그대로 복사해서 쓰면 된다.)


set USER=아이디

set PASSWD=비밀번호

net use Z: http://file.domain.co.kr:5005 %PASSWD% /user:%USER% /persistent:no


2. 폴더옵션에서 숨김 파일, 폴더 및 드라이브 표시 에 체크 후 적용한다.



3. 아래 경로로 들어간 후, 앞서만든 netstart.bat 파일을 넣어준다. 

C:\Users\PC이름\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup




이제 재부팅을 해도 네트워크 드라이브에 자동으로 연결되어있을 것이다.

저작자 표시 비영리 동일 조건 변경 허락
신고


bat 파일로 작업을 할 때 시간이 오래 걸리는 작업을 할 때가 있다. 

예를 들면 바이너리를 HW에 굽는다든지..


이럴 때 msg.bat으로 아래 내용을 저장해 두고,
@echo off
echo msgbox "DONE!!" > msg.vbs
start /wait msg.vbs
del msg.vbs

작업 배치파일 마지막에 호출부를 넣어주자.


@CALL msg.bat


작업이 끝나면 아래와 같은 팝업을 볼 수 있다!!




이제 여러분의 뇌는 걸어둔 작업에 신경을 빼앗기지 않고 멀티태스킹을 할 수 있다. (가령 웹서핑을 한다든지... )

저작자 표시 비영리 동일 조건 변경 허락
신고


문자열 내에서 숫자만 분리하기

String 클래스의 split 함수와 정규표현식을 이용해서 문자열 내에 들어 있는 숫자들만 추려보자. 

자바 소스를 보면 String.split() 메쏘드는 내부적으로 Pattern클래스의 split 메쏘드를 사용한다. 즉, 사용자가 Pattern 클래스를 이용하지 않고 사용하기 편하게 만들어 놓았을 뿐.
    public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
    }

    public String[] split(String regex) {
        return split(regex, 0);
    }

예제 코드를 보자.
    @Test
    public void split() {
        String text = "blah 11 per day 22 abc 33";
        String[] split = text.split("\\D+");
        assertEquals("", split[0]);    // 주의!
        assertEquals("11", split[1]);
        assertEquals("22", split[2]);
        assertEquals("33", split[3]);
    }

정규표현식 \D 는 숫자가 아닌 문자(A non-digit: [^0-9])를 뜻한다. 

(http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html 참고)

따라서 \D+는 숫자가 아닌 문자열들을 토큰으로 스트링을 잘라내게 된다.


주의) split 함수가 리턴하는 문자열 배열의 첫번째 원소의 값은 공백문자("")가 된다. "11"을 만나기 전까지의 문자 "blah "문자를 잘라내고 남는 문자를 배열 요소에 담기 때문.


추가) 마찬가지로 만약 숫자를 제외한 문자들만 뽑아내고 싶다면 \d+ 를 쓰면 된다.


저작자 표시 비영리 변경 금지
신고


세로편집/열편집/컬럼모드: alt + shift + a

대문자 -> 소문자: ctrl + shift + y

소문자->  대문자: ctrl + shift + x


저작자 표시 동일 조건 변경 허락
신고

출처: http://blog.naver.com/hursh1225/40192159662


C:\Windows\System32\libcurl.dll 파일을 삭제

저작자 표시 비영리 동일 조건 변경 허락
신고

테스트 하려는 APK를 일일이 설치하는 것도 일이다.

batch파일로 만들어서 한 방에 설치하자.


dir/d/b/a:-d > list.txt

FOR /F %%i IN (list.txt) DO (adb install %%i)


dir/d/b/a:-d > list.txt ==> 현재 폴더에 있는 파일 목록을 만든다.

FOR /F %%i IN (list.txt) DO (adb install %%i) ==> 목록을 읽어서 설치한다.


list.txt를 만들지 않고 설치하려면,

FOR %%f IN (*.apk) do adb install -rf %%f



저작자 표시 비영리 동일 조건 변경 허락
신고


Advanced(고급) > Configuration(설정) > Auto Detect UTF-8 Files (UTF-8 파일 자동 발견) 옵션을 켜 보자.




저작자 표시 비영리 동일 조건 변경 허락
신고