태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.


Effective Java에 나오는 내용이긴 합니다만, 우리가 자주 저지르는 실수가 있습니다.

프로그램을 하다가 보면 자주 난수(Random number)를 발생시켜야 할 때가 있습니다.

아래와 같은 코드를 사용하여 많이 발생을 시키죠.


private static final Random rnd = new Random();

static int random(int n) {
   return Math.abs(rnd.nextInt()) % n;
}


논리적으로는 아무런 문제가 없어 보입니다.

그렇지만 실제적으로 다음과 같은 코드를 사용하여 테스트를 해보도록 합시다.

public static void main(String[] args) {
   int n = 2 * (Integer.MAX_VALUE / 3);
   int low = 0;
   for (int i = 0; i < 1000000; i++)
       if (random(n) < n/2)
           low++;
   System.out.println(low);
}

위의 코드데로라면  100만번 테스트를 해서 기준값보다 작은 수가 나오는 경우는 50% 가깝게 나와야 정상입니다.

그렇지만 실제로 돌려보면 항상 666,666에 가까운 수가 나옵니다.

난수가 제대로 발생하고 있지 않다는 이야기죠.

실제적으로 이런식의 버그는 찾아내기가 쉽지 않습니다.

로직상으로는 아무런 문제가 없기 때문이죠.


따라서 저런 프로그램으로 Load Balancing하거나 데이터를 분산하고 있다면 제대로 처리가 되고 있지 않을 것입니다.

java 1.2부터 추가된 Random.nextInt(int) 를 사용하거나,  apache commons의 RandomUtils.nextInt()를 사용해야 제대로 동작을 합니다.



Posted by Breeze.Kang

댓글을 달아 주세요

Tip2009/02/01 00:12

텍스트 큐브를 사용하기 위하여서는 아파치 웹서버의 mod_rewrite 모듈이 설치되어있어야 합니다.

없어도 되긴 합니다만, 

도메인 아래에 디렉토리 없이 바로 텍스트 큐브를 설치하는 경우에

URL이 http://blog.reeze.com/?/entry/글제목

이런식으로 중간에 /?/ 이 들어가게 됩니다.


mod_rewrite를 설치해주는것이 좋은데요,  이상하게 설치가 되어있는데도 모듈이 없다고 나오는 경우가 있습니다.

이럴때는 다음과 같이 처리를 해줍니다.

setup.php에서   아래 라인을 찾아서 

else{
  $rewrite=0;
  @unlink($filename);
  checkStep(33,false);
  return false;
}

다음과 같이 변경해줍니다.

 else{
  $rewrite=1;
  //@unlink($filename);
  //checkStep(33,false);
  //return false;
  }

이것은 mod_rewrite 를 점검하지 않고 그냥 진행하겠다는 뜻입니다.

이렇게 해서 설치가 완료되었는데도 제대로 동작을 하지 않는 경우도 있습니다.

그럴경우에는 웹서버의 루트 디렉토리에 .htaccess 파일이 제대로 생성되었는지 확인해봅니다.

파일이 없는경우는  아래 내용을 복사해서 .htaccess 파일을 만들어줍니다.


#<IfModule mod_url.c>
#CheckURL Off
#</IfModule>
#SetEnv PRELOAD_CONFIG 1
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(cache)+/+(.+[^/])\.(cache|xml|txt|log)$ - [NC,F,L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(thumbnail)/([0-9]+/.+)$ cache/$1/$2 [L]
RewriteRule ^(.*)$ rewrite.php [L,QSA]


저도 반나절 이것땜에 헤맸네요.

어쨎든 해결은 됐습니다. ㅎㅎ




Posted by Breeze.Kang

댓글을 달아 주세요