'자바'에 해당되는 글 6건

  1. 2008.12.16 정상의 자바 개발자가 학생에게 주는 조언 by 지영아빠
  2. 2008.11.25 Sorting Algorithms Demonstration in Java by 지영아빠
  3. 2008.10.24 MalformedInputException in depth by 지영아빠
  4. 2008.10.23 findclass (jar 파일 내의 class를 찾아서 알려주는 utility) by 지영아빠
  5. 2008.10.23 Too many open files 에러 by 지영아빠
  6. 2008.10.21 [리뷰]자바 이론과 실습: 제네릭스 해부, Part 1 by 지영아빠
Top Java Developers Offer Advice to Students

괜찮은 interview자료가 있어서 소개해 드립니다.
자바계의 유명한 분들이 학생들에게 전해주는 조언입니다. 짧지만 유익한 내용으로 가득차 있네요..

참고가 되시기를.

1. 조슈아 블록: 많은 코드를 작성하세요

2. 토르 노비: 당신의 툴 사용법을 배우세요.

3. 쳇하세: 하나의 메써드에 전체 기능을 넣지 마세요.

4. 빈 갈브레이트: 전문가와 교류하세요

5. 마소드 마타자비: 시작은 쉽게하고 배움을 지속하세요.

6. 렉하번 시리니바스: 압도당하지 마세요

7. 케이 홀츠만: 처음에 허둥대지 마세요.

8. 아런 굽타: 다른 통합개발툴을 이용해 보세요

9. 릭 카텔: 좋은 기술은 단지 10%만 성공합니다.

10. 이척문: 당신이 즉시 필요로 하는 분야를 선택하세요

11. 톰 볼: 프로그래밍은 아직까지 숙련직업입니다.


저작자 표시
신고
Posted by 지영아빠
좋은 자료가 있어 스크랩합니다.

자바로 된 각종 정렬알고리즘을 일목요연하게 보여줍니다.
아래 정렬 알고리즘만 알고 있으면 정렬관련문제는 거의 다 해결 할 수 있습니다.



알고리즘 첨부: 

Sorting Algorithms Demonstration in Java






저작자 표시
신고
Posted by 지영아빠
MalformedInputException에 대해서 궁금하신게 많은것 같아 자료를 조금더 보강해 봤습니다. MalformedInputException이 발생하는 것은 encoding에 맞지 않는 byte가 들어왔을때 발생합니다.

 sun.io.MalformedInputException
    at sun.io.ByteToCharUTF8.convert(ByteToCharUTF8.java:262)
    at sun.nio.cs.StreamDecoder$ConverterSD.convertInto(StreamDecoder.java:314)
    at sun.nio.cs.StreamDecoder$ConverterSD.implRead(StreamDecoder.java:364)
    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:250)
    at java.io.InputStreamReader.read(InputStreamReader.java:212)
    at java.io.BufferedReader.fill(BufferedReader.java:157)
    at java.io.BufferedReader.read1(BufferedReader.java:208)
    at java.io.BufferedReader.read(BufferedReader.java:282)
    at java.io.Reader.read(Reader.java:143)

이런 Exception이 발생한 경우에 ByteToCharUTF8 소스를 찾아보면 다음과 같이 되어있습니다.

소스: ByteToCharUTF8

UTF-8을 예를 들어 설명하겠습니다.

UTF-8은 기존 unicode의 단점인 속도문제를 개선하기 위해서 만들어진 인코딩 방식으로 Unicode에서 정의된 문자를 1~4byte의 가변으로 처리하는 것입니다.

코드 범위
(십육진법)
UTF-16BE 표현
(이진법)
UTF-8 표현
(이진법)
설명
000000-00007F 00000000 0xxxxxxx 0xxxxxxx ASCII와 동일한 범위
000080-0007FF 00000xxx xxxxxxxx 110xxxxx 10xxxxxx 첫 바이트는 110 또는 1110으로 시작하고, 나머지 바이트들은 10으로 시작함
000800-00FFFF xxxxxxxx xxxxxxxx 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 110110yy yyxxxxxx 110111xx xxxxxxxx 11110zzz 10zzxxxx 10xxxxxx 10xxxxxx UTF-16 서로게이트 쌍 영역 (yyyy = zzzzz - 1). UTF-8로 표시된 비트 패턴은 실제 코드 포인트와 동일하다.


영어의 경우에는 u0000~u007F영역으로 ASCII와 동일한 값을 갖습니다. 1byte로 표시됩니다. 한글의 경우에는 u0800~uFFFF영역으로 표시되기 때문에 UTF-8에서는 3byte로 표시됩니다.
예를들어 '김' 이란 글자는 UTF-8에서는 EA B9 80으로 표시가 됩니다. 2진수로 변환하면
11101010 10111001 10000000 이렇게 표시됩니다.

아래 소스코드에서 살펴보면, MalformedInputException은 UTF-8형식에 안맞는 byte가 들어왔을때 발생하는 exception입니다.

한글의 경우에는 3byte인 경우만 살펴보면,
 
 if ((byte1 & 0x80) == 0){
outputChar[0] = (char)byte1;
outputSize = 1;
} else if ((byte1 & 0xe0) == 0xc0) {
if (byteOff >= inEnd) {
savedSize = 1;
savedBytes[0] = (byte)byte1;
break;
}
byte2 = input[byteOff++] & 0xff;
if ((byte2 & 0xc0) != 0x80) { ==>
badInputLength = 2;
byteOff += byteOffAdjustment;
throw new MalformedInputException();
}
outputChar[0] = (char)(((byte1 & 0x1f) << 6) | (byte2 & 0x3f));
outputSize = 1;
} else if ((byte1 & 0xf0) == 0xe0){ // 한글
if (byteOff + 1 >= inEnd) {
savedBytes[0] = (byte)byte1;
if (byteOff >= inEnd) {
savedSize = 1;
} else {
savedSize = 2;
savedBytes[1] = (byte)input[byteOff++];
}
break;
}
byte2 = input[byteOff++] & 0xff;
byte3 = input[byteOff++] & 0xff;
if ((byte2 & 0xc0) != 0x80 || (byte3 & 0xc0) != 0x80) {
badInputLength = 3;
byteOff += byteOffAdjustment;
throw new MalformedInputException();
}
outputChar[0] = (char)(((byte1 & 0x0f) << 12)
| ((byte2 & 0x3f) << 6)
| (byte3 & 0x3f));
outputSize = 1;

((byte2 & 0xc0) != 0x80 || (byte3 & 0xc0) != 0x80)  ==> byte2와 byte3가

으로 시작하지 않는 경우에 발생합니다.


첫 바이트가 110으로 시작했지만, 두번째나 세번째 바이트가 10으로 시작하지 않는

경우에 MalformedInputException이 발생합니다.


이 경우에는 input데이터가 이상이 없는지, 혹은 encoding이 잘못되진 않았는지 살펴봐야
하겠습니다.

*참조*
위키피디어 UTF-8
Modified UTF-8
소스: ByteToCharUTF8

신고
Posted by 지영아빠

findclass는 Linux나 Unix쪽에서 자바 개발할때 자주 사용하는 shell입니다.

2011-03-16: 

사용예는 다음과 같습니다.

- "findclass . String" 와 같이 사용하면 현재 폴더의 결과를 표시합니다.

[그림]java 경로에서 String을 찾은 결과



아래는 소스입니다.
#!/bin/sh
# by jenix

if [ $# -ne 2 ]
then
echo "Usage: findclass <target directory> <class name>"
exit
fi

targetDIR="$1"
targetCLASS="$2"
result=

filelist=`ls $targetDIR`

if [ $? -ne 0 ]
then
echo "invalid target directory - fullpath required"
exit
fi

cd $targetDIR

for file in $filelist
do
check=`echo $file | awk '/jar$/'`
if [ -n "$check" ]
then
echo "[searching in $file]"
class=`jar tf $file | grep $targetCLASS`
if [ -n "$class" ]
then
if [ -z "$result" ]
then
resultFS=""
fi
result="${result}${resultFS}${file} ${class}"
resultFS=":"
fi
fi
done

echo "\n*-- RESULT "

IFS=":"

for item in $result
do
echo "$item" | awk 'BEGIN{ FS=" " }{ print " " $1 ": " $2 }'
done


신고
Posted by 지영아빠
다음과 같은 예외 메시지를 발생시킵니다. 소켓과 파일에서 이런 문제가 발생할 수 있습니다.

예외 1
java.net.SocketException: Too many open files

at java.net.PlainSocketImpl.accept(Compiled Code)
at java.net.ServerSocket.implAccept(Compiled Code)
at java.net.ServerSocket.accept(Compiled Code)
at weblogic.t3.srvr.ListenThread.run(Compiled Code)

예외 2

java.io.IOException: Too many open files

at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.(UNIXProcess.java:54)
at java.lang.Runtime.execInternal(Native Method)
at java.lang.Runtime.exec(Runtime.java:551)
at java.lang.Runtime.exec(Runtime.java:477)
at java.lang.Runtime.exec(Runtime.java:443)
...

첫 번째 예외는 오류가 TCP 프로토콜에 영향을 주는 경우에 발생하며 두 번째 예외는 오류가 I/O 동작에 영향을 주는 경우 발생합니다.

두 경우 모두 서버 차단(blocking) 문제를 유발합니다. 아래에서 설명하는 방법으로 문제를 파악하여 해결할 수 있습니다.

Unix와 Linux에서는 스트림을 File로서 처리합니다. 이것은 OS에서 사용할 수 있는 파일디스크립터(fd)의 갯수를 지정하는데, 이것이 작을때 발생합니다.

우선, 엔진에 문제가 없는지 확인합니다. 파일(소켓)을 연 상태에서 닫은게 없는지 확인하고 이상이 없다면, 시스템의 fd의 설정을 확인합니다.

저희는 Unix와 Linux를 주로 사용하기에 이 경우에는 ulimit명령으로 간단히 확인할 수 있습니다. ulimit -a 하면 모든 설정이 나오게 됩니다.

 core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 48743
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 48743
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited


Unix 및 Linux에 모두 파일 디스크립터가 있습니다.  주요한 차이점은 hard limit의 설정, 디폴트값 및 파일 디스크립터의 구성 절차에 있습니다.

Solaris
/usr/bin/ulimit유틸리티를 사용하여 단일 프로세스에 할당하는 파일 디스크립터의 개수를 정의합니다.  최대값은 rlim_fd_max로 정의되며 기본적으로 65,536으로 설정됩니다.  루트 사용자만이 이 커널 값을 수정할 수 있습니다.

Linux

관리자는 다음 예와 같이 etc/security/limits.conf 구성 파일에 파일 디스크립터 제한을 설정할 수 있습니다.
soft nofile 1024
hard nofile 4096

다음 세 행을 /etc/rc.d/rc.local 시작 스크립트에 추가하여 시스템 전체의 파일 디스크립터 제한을 설정할 수도 있습니다.

# Increase system-wide file descriptor limit.
echo 4096 > /proc/sys/fs/file-max
echo 16384 > /proc/sys/fs/inode-max

Windows
파일 디스크립터는 Windows OS에서는 파일 핸들이라고 합니다.  Windows 2000 서버의 경우 열린 파일 핸들 제한은 16,384로 설정되어 있습니다.  이 값은 작업 관리자 성능 요약에서 확인할 수 있습니다.

HP-UX
nfile 을 사용하여 열린 파일의 최대 개수를 정의할 수 있습니다.  이 값은 대개 다음 공식으로 결정됩니다. ((NPROC*2)+1000) 여기서 NPROC는 대개 ((MAXUSERS*5)+64)입니다.  MAXUSERS가 400인 경우 계산 결과는 5128입니다.  대개 이 값을 더 높게 설정합니다.  maxfiles는 프로세스별 소프트 파일 제한이고 maxfiles_lim은 프로세스별 하드 파일 제한입니다.

AIX
파일 디스크립터 제한은 /etc/security/limits파일에 설정되어 있으며 기본값은 2000입니다.  이 제한은 ulimit명령 또는 setrlimit 함수로 변경할 수 있습니다.  최대 크기는 OPEN_MAX 상수로 정의합니다.



*참고*
Too many open files - BEA

신고
Posted by 지영아빠
Brian Goetz가 쓴 이 글은 제가 C++의 제네릭과는 다른 와일드 카드에 대해서 친절히 다루고 있습니다.

Goetz는 알다시피 Java Concurrency in Practice 의 저자입니다.
이 책을 통해서 Concurrent Package의 개념에 대해서 접할 수 있었는데, 선에서 근무하고 있었나 봅니다.

자바 이론과 실습: 제네릭스 해부, Part 1와일드카드의 정의에 대해서 소개하고 있습니다. 제네릭 중 와일드 카드를 어떻게 써야 하고 이것의 문제점과 회피하는 방법에 대해서 친절히 설명해 줍니다.

와일드카드(타입 매개변수가 있을 자리를 대신 차지하는 웃기는 물음표)는 알려지지 않은 타입의 각도에서 타입 제약을 표현하는 수단입니다.

제네릭 클래스 ArrayList에서, ArrayList<?> 타입은 임의의 (참조) 타입 T에 대해 ArrayList<T>의 슈퍼타입(supertype)을 의미한다. 

또한, 타입추론에 대한 설명과 이를 편리하게 사용해줄 팩토리 메소드 패턴에 대해서도 설명하고 있습니다.

자바 제네릭스의 기능을 보다 잘 이해할 수 있었습니다.


신고

'관심분야 > 기타' 카테고리의 다른 글

[리뷰]자바 이론과 실습: 제네릭스 해부, Part 1  (0) 2008.10.21
실버라이트 2.0 RC버전 발표  (0) 2008.09.26
TOPCODER 문제:CaptureThemAll  (0) 2007.05.23
Silverlight관련글  (0) 2007.05.04
Posted by 지영아빠

티스토리 툴바