달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2012. 5. 30. 19:20

[ java ] javax.mail 참조 용 용-ILE/LANG-JAVA(JSP)2012. 5. 30. 19:20

suite.tistory.com 2012.05 fs

maven jar 파일 다운로드 설정

~~~~~~~~~~~~~~ pom.xml ~~~~~~~~~~~~~~~~~~~~~~~~~~~~

<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.2</version>
</dependency>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


  try {

   Properties props = new Properties();

   props.put("mail.transport.protocol", "smtp");

   props.put("mail.smtp.host", get("SMTP_HOST"));

   // props.put("mail.smtp.port", "25"); 안하면 기본 25번

   Session session = Session.getInstance(props);

   MimeMessage message = new MimeMessage(session);

   // ex ) format :fs<fs@naver.com>"
   int pos = senderEmail.indexOf("<");
   String senderName = "";
   if (pos != -1) {
    senderName = senderEmail.substring(0, pos);
    senderEmail = senderEmail.substring(pos);
    senderEmail = senderEmail.replaceAll("<|>", "");
   }
   message.setFrom(new InternetAddress(senderEmail, senderName));

   // ex ) format :"fs<fs@daum.net>"
   String recvName = "";
   pos = recvAddr.indexOf("<");
   if (pos != -1) {
    recvName = recvAddr.substring(0, pos);
    recvAddr = recvAddr.substring(pos);
    recvAddr = recvAddr.replaceAll("<|>", "");
   }
   message.addRecipient(Message.RecipientType.TO, new InternetAddress(recvAddr, recvName));

   message.setSubject(title);

   message.setContent(contentBody, "text/html; charset=UTF-8");

   Transport.send(message);

  } catch (Exception e) {
      LOG.error(" #[FAIL]sendBySmtp: 메일 발송 오류 발생:" + e.toString());
  }

 

 

:
Posted by mastar
2012. 3. 30. 18:06

[ QMAIL ] qmail 로그 통계 bash로 ~ 용-ILE/SH/BASH/CSH2012. 3. 30. 18:06

 http://suite.tistory.com 2012.04

qmail 의 로그 통계를 보여주는 주는게 검색을 해보면  

* qmailmrtg   http://www.inter7.com/index.php?page=qmailmrtg7 

 

 

MRTG(http://oss.oetiker.ch/mrtg/) 를 이용하는걸로 생짜 html 으로

5분주기 하루 일주일 이런씩으로 흐름정도는 볼수있는데

상세한 수치를 보기는 어려움 1분단위로 할려면

http://www.loplop.net/projects/1minMRTG/ 있는데 잘안되서 안해봄


MRTG  만드신분이 1분단위로 더 자세하게 그래프를 보고싶다면

RRDTOOL 를 사용하라고 하는데 http://oss.oetiker.ch/rrdtool/

설치또 해야하고 무엇보다도 아파치에 PHP 모듈 연동도 들어가야해서 안해봄~

암튼 그래프로 흐름 보기로는 좋다!

 

- qmailanalog http://cr.yp.to/qmailanalog.html 

qmail 을 만드신 DJB(http://cr.yp.to/djb.html) 아저씨가 만든거 같은데 

구글링 해보니 matchup , multilog  관련해서 이슈도있고 

뭔가 해주는것같구 번거로운것같아 사용안함

 

~~~~  bash 스크립트로 수신량 보기 ~~~~~~


※ 통계 분석에서 제일 좋은건

smtp current 로그파일을 파싱해서 DB에 넣고 지지고 볶고 하는게 제일 좋겠지만 

걍 스크립트로 콘솔 인터페이스로  작성해봄


※ current time 데이터 변환


tstamp2ymdt.awk

qmail로그를  multilog로 찍고 있다면 ($ps -ef |grep multilog)

시간 포멧이 "@400000004f750c03278b96ac"   이런 스타일이고

이걸 사람이 알아볼수 있게 tai64nlocal (http://cr.yp.to/daemontools/tai64nlocal.html)

실행 파일을 이용하면  ISO format: YYYY-MM-DD HH:MM:SS.SSSSSSSSS 으로 변경해줌

ex) $) cat /var/log/qmail/smtpd/current | tai64nlocal

- awk로 시간 계산 가능하도록  YYYY-MM-DD HH:MM -> YYYYMMDDHHMM  으로 변경

~~~~~~~~~~~ tstamp2ymdt.awk ~~~~~~~~~~~~~~~~    

BEGIN { }

{

    start_day=$1;
    start_time=$2;
    gsub("-", "", start_day);
    gsub(":", "", start_time);
    start_dt=start_day""start_time;
    start_dt=substr(start_dt, 0, 12);

    print start_dt"|"$0;

}
END {}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

실행 스크립트  파일   stat.sh   

stat.sh

~~~~~~~~~~~~~~~~ stat.sh  ~~~~~~~~~~~~~~~~~~~~~~~~~

....

 "11")
            IFS=$'\n'
            log_file="/var/log/qmail/smtpd/current"
            ago_minute=5
            sleep_second=`expr $ago_minute \* 60`

            while [ 1 -eq 1 ];do

                    minutes_ago_datetime=`date -d "-$ago_minute minutes"  +%Y%m%d%H%M`
                    current_datetime=`date +%Y%m%d%H%M`
                    echo "minutes_ago_datetime:$minutes_ago_datetime"
                    echo "current_datetime:$current_datetime"

                    data_str=`cat $log_file  | tai64nlocal | awk -f tstamp2ymdt.awk`
                    tmp_real_file="tmpstat_realtime.file"
                    echo "" > $tmp_real_file
                    for line in $data_str
                    do
                        #datetime=`expr substr  $line 1 12`
                        datetime=${line:0:12}
                        if [ $datetime -ge $minutes_ago_datetime ] && [ $datetime -le $current_datetime ]; then
                            echo $line >> $tmp_real_file
                        fi
                    done

                    echo "start_dt:$minutes_ago_datetime,end_dt:$current_datetime"
                    check_cnt=`grep -c " ok " $tmp_real_file`
                    echo "[REALTIME-SMTP] allow average $ago_minute minutes :$check_cnt";
                    per_cnt=0
                    if [ $check_cnt -gt 0 ] ; then
                        per_cnt=`echo "scale=3; $check_cnt / $sleep_second"|bc`
                    fi
                    echo "[REALTIME-SMTP] allow per seconds: $per_cnt"
                    echo "[uptime]"`uptime`
                    sleep $ago_minute
                    echo ""
            done

....

5분 단위로 수신량 / 초당 수신량 보기 결과  : UX는 안좋다 달력도 없고 ~.~

 


 

  * 유의할 점은  multilog로 current 로그 최대 사이즈는 16메가 정도이기 때문에 고려 필요

 

P.S Note shell script

 

tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

sudo find mqueue/ | xargs sudo rm

5초마다 내 컴퓨터의 특정 포트에 연결된 목록의 갯수 보기
watch -n 5 -d 'netstat -an | grep "포트번호" | grep "ESTA" | wc -l'

# tcpdump -i eth0 tcp port 80 -w tcpdump.log -s 1500
# tcpdump -Xqnr tcpdump.log

/var/qmail/bin/watch -d -n1 ./qmail-qstat

QMAILQUEUE=/var/qmail/bin/simscan SIMSCAN_DEBUG=5 /var/qmail/bin/qmail-inject test@spam.test < spy.sample

nslookup 175.254.193.211.sbl-xbl.spamhaus.org

TCPREMOTEIP=211.193.254.175 rblsmtpd -r sbl-xbl.spamhaus.org /var/qmail/bin/qmail-smtpd

cat /var/log/qmail/smtpd/current|tai64nlocal

 

find . -ctime -1 | xargs rm -f #  rm -f 파일수 많아서 못지울때나~

 

./qmail-remove -p spamtest  # 큐에서 spamtest 들어간 파일 리스트만 출력

 ./qmail-remove -p spamtest -r # 큐에서 spamtest 들어간 파일을 /var/qmail/queue/yanked 디렉토리로 이동

./qmail-remove -p spamtest -d # 큐에서 spamtest 들어간 파일을 백업하지 않고 영구 삭제

 

 

 

 

 

 


 

:
Posted by mastar

http://suite.tistory.com 2012.03

1. clamav 연동  


simscan 설치할때 인터넷  http://www.qmailwiki.org/Simscan/README 보고 설치시

configure 를 나는

$ ./configure --enable-user=simscan --enable-received=y --enable-attach=y --enable-clamav=y --enable-custom-smtp-reject=y 이렇게 주고 컴파일해서 설치 하고 나서 

clamav 잘되는지 해보니 에러 발생!~~  에러내용은


"simscan: clamdscan: /var/qmail/simscan/1332399138.49738.5987: lstat() failed: Permission denied. ERROR"


이런 디렉토리 접근 퍼미션 문제였는데 clamav 설치방법도 여러가지이고 암튼 구글링해보면

chown 등으로  simscan 폴더를 줘야한다 글이 많은데

내경우는 clamav 설정 파일 기존에 qmail-scanner와 연동 되었던 clamav의 설정파일 

/usr/local/etc/clamd.conf  파일에서 User , LocalSocketGroup 값을

simscan 설치 계정의 소유자와 그룹권한으로 변경후 lstat 오류 사라짐 (/etc/password)

ex) LocalSocketGroup qmail  .... User simscan 


2. 첨부파일만 추출해서 별도의 바이러스 체크시 simscan 에서 체크시 추가/수정해본거


2-1 . 첨부파일이 zip 압축경우 한번 풀기 (clamav 의 clamdscan 은 자동으로 해줌 ~.~)

    int run_unzip()
{
    DIR *mydir_unzip;
    struct dirent *mydirent;
    char fileNameBuf[256]={'\0',};
    int i=0;

    mydir_unzip = opendir( ATTACH_DIR );
    if ( mydir_unzip==NULL) {
        return -1;
    }
    for(i=0; (mydirent=readdir(mydir_unzip))!=NULL; i++) {
        strcpy(fileNameBuf,mydirent->d_name);
        lowerit(fileNameBuf);
        if ( str_rstr(fileNameBuf,".zip") == 0 ) {
            if ( DebugFlag > 3 ) {
                 fprintf(stderr, "Exist zip file [%s]\n",mydirent->d_name);
            }
            unzipFile(mydirent->d_name, ".");
        }
    }
    closedir(mydir_unzip);

    return 0;

}

unzipFile() 함수는 http://www.zlib.net/ 여기서받은 소스 코드에서 압축을 푸는 바이러리

/zlib-1.2.5/contrib/minizip/miniunz.c 함수에서 main() 을 unzipfile() 변경해서 호출 사용


2-2 int check_attach() 기존 함수 수정 


첨부파일은 int run_ripmime() 에서 이미 ripmime 으로  /var/qmail/simscan 디렉토리에 만들어줌

int detect_attach(char *directory)
{
    struct stat stbuf;
    DIR *mydir;
    struct dirent *mydirent;
    char paramDir[256]={'\0'};
    char bufMD5[33]={'\0',};
    char tmpFileName[256]={'\0',};
    int len=0;
    const int TEMP_FILE_LEN = strlen(OUTLOOK_TEMP_NAME) + 1; // ex) textfile0 , textfile1 ...
    char scan_sql[256]={'\0'};

    mydir = opendir(directory);
    if ( mydir==NULL){
        return -1;
    }

    while((mydirent=readdir(mydir))!=NULL) {
        /* skip . and .. */
        if (  mydirent->d_name[0] == '.' &&
            (mydirent->d_name[1] == '.' || mydirent->d_name[1] == 0) ) {
            continue;
        }
        // get subdirectory
        lstat(mydirent->d_name, &stbuf);
        if( S_ISDIR(stbuf.st_mode)) {
            sprintf(paramDir, "%s/%s", directory, mydirent->d_name);
            detect_attach(paramDir); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로 
            continue;
        }

        // skip.. simscan temp file
        if( strstr(mydirent->d_name,PREFIX_MSG) || strstr(mydirent->d_name,PREFIX_ADDR)){
            if ( DebugFlag > 5 ) {
                fprintf(stderr, "simscan: skip [%s] or [%s] file [%s]\n",PREFIX_MSG, PREFIX_ADDR, mydirent->d_name);
            }
            continue;

        }
        if ( DebugFlag > 5 ) fprintf(stderr, "simscan: checking attachment [%s/%s] \n", directory, mydirent->d_name);

 
         getMD5(mydirent->d_name, bufMD5); // 첨부파일에서 MD5 추출 

         sprintf(scan_sql,"SELECT hash FROM VIRUS_TABLE  WHERE hash='%s'",bufMD5);

          ... .... ... ... 
                if( isMalwareByDB(scan_sql) > 0 ){
                    if ( DebugFlag > 1 ){
                       fprintf(stderr, "[Malware] MailFrom:<%s>, RcptTo:<%s>, FileName %s , MD5:%s\n", MailFrom, RcptTo[0], mydirent->d_name, bufMD5);
                    }
                    strncpy(AttachName, mydirent->d_name, sizeof(AttachName)-1);
                    closedir(mydir);
                    return -1;
                }
    }
    closedir(mydir);
    return 0;
}

~~~~~~~~~~~~~~~ simscan.c ~~~~~~~~~~~~~~~~~~~~~~~~

 // extract zip (one time);
  run_unzip();
  detect_attach( ATTACH_DIR ); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

뭐 이런식으로 하면 메일내에 첨부파일을 clamav 외 다른 안티바이러스 등과 연동하기 쉽다 MD5 추출 또는 SHA1 으로 추출등 인터넷에서 구글링해서 붙이면됨!~
 

 

:
Posted by mastar

http://suite.tistory.com 2012.03

먼저 용어 정리

qmail 처음 사용해보니 여러 인터넷 글에 보면 설치 번거롭고  별별 연동 모듈이 나온다

clamav , qmail-scanner ,  ripmime, rblsmtpd  , simscan  , vpopmail ,  maildrop , knetqmail,ripmime, qmailadmin , spamassassin  ....

1. clamav ? 오픈소스 안티바이러스 제품  http://www.clamav.com    윈도우/리눅스 모두 있음
               *  2012.03 기준 110만건 (clamscan 실행하면 나옴)

2. qmail-scanner?  qmail 도식화에서 qmail-smptd -> qmail-queue  중간에서 삽입하여 clamav 를 연동 시켜주는
                     perl로 작성된 스크립트 모듈 (clamav만 연동하는건아니고 스팸어세씬등 여러가지 스팸모듈과 연동 가능)
3. rblsmtpd? RBL 을 처리해주는 데몬 rbl(real-time blocking list) 발신지 IP가 스팸 IP로 등록된경우 TCPSERVER 단에서 deny 시켜버림 (spamhaus.org,spamlist.or.kr ... 오픈해주는 곳이 있음)

4. simscan? qmail-scanner 가 perl 버전이라면 이건 C 버전임  소스도 오히려 perl 보다 간단?해 보임 그래서 이걸 사용함

5. vpopmail ? MDA에서 사용하는 모듈로 sendmail 경우 메일 생성할려면 실제 리눅스 계정을 생성?했던것 같은데 
                    vpopmail을 qmail과 연동하면  리눅스 게정 만들 필요없이 가상계정 또는 도메인을 걍 만들어 사용 가능 기타 검색해보면 여러가지 장점이 나옴

6. maildrop? 사용하지 않아서 잘모르지만 MDA단에서 스팸 처리 용도가능한것으로 보임  "실제 사용안해봄"
7. spamassassin? qmail-scanner , simscan 과 연동해서 스팸처리하는데 이건 메일 내용(스트링)을 가지고 스팸처리 하는 모듈 (ex) 메일 제목에 "광고" 등 실제 "사용안해봄"

8.qmailadmin? 웹환경에서 계정을 생성하고 관리등 해주는 모듈 인데  "실제 사용안해봄"

9.knetqmail? netqmail? kldp.net 그룹에서 QMAIL과 각종 모듈 설치가 번거로우니 잘 팩키지해준 이름 현재 1.0.6 까지인데 
    rpm버전이( http://mail.linuxstudy.pe.kr/download/) 가있어 rpm 버전으로 설치 했는데 잘됨 (qmail+vpopmail) 

* http://mail.linuxstudy.pe.kr/http://qmail.kldp.net 고맙습니다.

10.ripmime? 메일 mime을 이 바이러리를 수행하면 첨부파일이 뚝 떨어짐 http://www.pldaniels.com/ripmime/

*  첨부파일을 스팸 처리시 QMAIL에서 qmail-queue 오기전에 simscan 모듈 있음   http://www.inter7.com/?page=simscan 
    qmail 패치된버전임 : http://www.qmail.org/qmailqueue-patch  knetqmail 이라면 이미 되어있음 





* 원본 qmail architecture
 http://www.nrg4u.com/qmail/the-big-qmail-picture-103-a4.pdf

 

:
Posted by mastar

suite.tistory.com 2011.11

OOP는 알고있는데 OOD는 이번에 처음 들어봤다!!  ^^;

Object-Oriented Design 에 5대 원칙

S.O.L.I.D

1.SRP 2.OCP 3.LSP  4.ISP 5.DIP

그중에 2가지만 study~ 

1. Liskov Substitution Principle  리스코프 교체 원칙

정의 : 서브타입은 언제나 자신이 기반타입 (base type)으로 교체할 수 있어야 한다
    (부모클래스가 사용되는곳에 자식클래스로 치환 해도 무방해야함)


아래 코드를 보면 modify 와 printList 모두 타입을 LinkedList 받았다가  속도나 기타 구현방식에 따라 LinkedList 부모클래스를 상속받은 ArrayList 나 HashSet를 사용할려면 그대로 대체해서 쓸수없고 기반 소스를 다고쳐야함
~~~~~~~~~~~~~~~~~~~~~~~~~~ LinkedList  종속적 ~~~~~~~~~~~~~~~~~~~~~~~~~~
import java.util.LinkedList;

public class ExampleLSP2 {

 void modify(LinkedList<String> list) {
  list.add("1");
  // list.add(…);
  //doSomethingWith(list);
  list.add("2");
  printList(list);
 }

 void printList(LinkedList<String> list) {
  for (int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i));
  }
 }

 public static void main(String[] args) {
  LinkedList<String> list = new LinkedList<String>();
  ExampleLSP2 ex2 = new ExampleLSP2();

  ex2.modify(list);
 }
}

기반 소스를 안고치고 생성하는 객체만 생성해서 사용할수 있게 만든다면 아래 처럼 코딩을 할수 있다!
* 단 자식 클랙스 고유의 기능을 사용하지 않을경우

~~~~~~~~~ Collection 부모클래스가 사용되는곳에 자식클래스로 치환 해도 무방 ~~~~~~~~~~~~~~~~~

import java.util.*;

public class ExampleLSP3 {

 void modify(Collection<String> list) {
  list.add("1");
  // list.add(…);
  //doSomethingWith(list);
  list.add("2");
  printList(list);
 }

 void printList(Collection<String> list) {
  System.out.println(list.toString());
 }

 public static void main(String[] args) {
  //Collection<String> list = new HashSet<String>();
  Collection<String> list = new ArrayList<String>();
  ExampleLSP3 ex2 = new ExampleLSP3();

  ex2.modify(list);
  Collection<String> list2 = new HashSet<String>();
  ex2.modify(list2);
 }
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2.   Interface Segregation Principle 인터페이스 격리 원칙

정의 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.

ISP_EX.zip

소스를 보면

BadCarOperation.java 에는 전체가 기능이 모여 있고 
BasicCarOperation.java 공통적인 기능 인터페이스
GearboxCarOperation.java , ConditioningCarOperation.java 클라이언트 특성에 따른 별도 구현 

ex) SM3.java : CartType2 클래스를 사용해 에어콘 조정 기능이 있지만
ex) BMW.java : CartType1 클래스를 사용해 에어콘 조정  기능이 없다

OOD 5대원칙 SRP , OCP , ISP , LSP , DIP  수많은 글 읽다 보면  그게 그거 같고 어렵다!  ㅋ 

근데 이거 모른다고 개발못하는건 아니다! 
이미 우리가 경험하면서 쓰고 있는것들 같다~ MVC , IoC, JDBC , 공통적인 기능은 한클래스에 모아 쓰기등 ....




 

:
Posted by mastar
2011. 11. 11. 15:38

putty 내설정 레지스트리 2011. 11. 11. 15:38

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

http://suite.tistory.com 2011.10

static 한 실행파일만 gdb로 디버깅해보다가 
dynamic 실행시 디버깅 방법 구글링좀하고 정리해둠~~
(데몬형태로 so 파일을 활용한 프로그램이  있을경우 디버깅  방법)

그냥 단순 예제로 tail 일경우 실제로는 디버깅할 프로세스명 사용!!!

ex)  특정 로그를 볼때 자주쓰는 tail -f 파일명.log 해두고

$]tail -f   Server.log

먼저 프로세스 번호 찾고
$) ps -ef |grep tail
18588 18560  0 17:20 pts/3    00:00:00 tail -f Server.log
19983 17905  0 18:44 pts/1    00:00:00 grep tail

gdb 실행후 실행프로세 디버깅 시작(attach)
$)gdb  tail
$)attach 18588
또는 한방에 $) gdb tail 18588

아래와같이 참조된 so 가 나오고
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gdb tail 18588
GNU gdb Red Hat Linux (6.3.0.0-1.159.el4rh)
Copyright 2004 Free Software Foundation, Inc.
to program: /usr/bin/tail, process 18588
Reading symbols from /lib/tls/i686/nosegneg/libm.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/nosegneg/libm.so.6
Reading symbols from /lib/tls/i686/nosegneg/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/tls/i686/nosegneg/librt.so.1

...............
Loaded symbols for /lib/tls/i686/nosegneg/libpthread.so.0
0x009af7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 (gdb) b write
Breakpoint 1 at 0xb9c6b0

(gdb) continue

중지하고 다시 설정 할려면

(gdb) ctrl + c 하고 
source.cpp 에 77라인 브레이크 포인트 걸때 
(gdb)  b source.cpp:77
(gdb) continue
다음 n , s , p 등.. 디버깅 수행

뭐 이렇게하면 tail은 단순예이고 실제 개발한 so 파일이나  유지보수를 위해 실행하면서 소스 분석시 활용 가능함


 

 

:
Posted by mastar


http://suite.tistory.com 2011.08 fs

아파치 버전 : 2.2.16

성능 이슈로 css , js 등 압축기능 설정 필요로 기존 아파치에 apxs 로 mod_deflate.so 생성하고
아파치를 시작할때  httpd.conf 아래 같은 오류 메시지  나오는 경우가 있어 해결해볼려고 구글링은 해보았지만
쉽게 답은 찾지 못했고

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$>./apache start
.....  mod_deflate.so: undefined symbol: inflateEnd
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

기존 아파치라 httpd.conf 외 include 로 vhost 설정을 별도로 가지고 있어
별도의 vhost-httpd.conf 에

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LoadModule deflate_module     modules/mod_deflate.so  # 추가 httpd.conf 에서는 삭제  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
설정 적용 하여 해결함


 ~~~~~~~~~~~~~~~~ 압축 설정 적용 값   ~~~~~~~~~~~~~~~~~~~~
 <Location />
            AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css application/javascript application/json
            BrowserMatch ^Mozilla/4 gzip-only-text/html
            BrowserMatch ^Mozilla/4\.0[678] no-gzip
            BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
            BrowserMatch \bMSIE\s6\.0 no-gzip
            SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
            SetEnvIfNoCase x-flash-version ^[0-9] no-gzip dont-vary
            Header append Vary User-Agent env=!dont-vary
        </Location>

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

확인은 FireFox 에서 net 에서 확인하거나 FF에 구글에서 만든 page speed 설치해도 확인 쉽다.
(http://code.google.com/intl/ko-KR/speed/page-speed/docs/using_firefox.html)



* 참고로 정적 파일 css , js ,이미지등  브라우저 캐쉬 기간 설정 1주일
   -> js, css 수정시 적용 안될경우 대비로  배포시 fs.css?2011081314 임의의 파라미터 지정 필요성  
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 LoadModule expires_module    modules/mod_expires.so
        <IfModule mod_expires.c>
                ExpiresActive On

                ExpiresDefault "access plus 1 day"
                ExpiresByType image/gif "access plus 1 weeks"
                ExpiresByType image/png "access plus 1 weeks"
                ExpiresByType image/jpeg "access plus 1 weeks"
                ExpiresByType image/jpg "access plus 1 weeks"
                ExpiresByType text/css "access plus 1 weeks"
                ExpiresByType application/javascript "access plus 1 weeks"
                ExpiresByType application/x-shockwave-flash "access plus 1 weeks"
        </IfModule>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
적용여부는 브라우저 캐시 삭제후 page speed 플러그인으로 쉽게 확인 가능

 

:
Posted by mastar
2011. 6. 18. 18:17

[java] Pascal Triangle by array 용-ILE/LANG-JAVA(JSP)2011. 6. 18. 18:17


fs 2011.06

파스칼 삼각형 상위값 합이 자기 값인거!! 자바 배열로 출력

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

/**
 * <pre>
  * FileName  : pascalTriangle.java
  * Package   :
  * Comment   :
  * </pre>
  *
  * @author   : http://suite.tistory.com/
  * @date     : 2011. 6. 18.
 */
public class pascalTriangle {

 public static void main(String[] args) {
  int HEIGHT = 100;
  final int CNUM = 1;
  long[][] dataArray = new long[HEIGHT][];
  for (int i = 0; i < HEIGHT; i++) {
   int cnt = 0;
   dataArray[i] = new long[i + 1];
   for (int j = 0; j < i + 1; j++) {
    if (cnt == 0 || i == j) {
     dataArray[i][cnt++] = CNUM;
     continue;
    } else {
     long val = dataArray[i - 1][j] + dataArray[i - 1][j - 1]; // 바로 상위 두개 값 합
     dataArray[i][cnt++] = val;

    }
   }
  }
  // print
  for (int k = 0; k < HEIGHT; k++) {
   for (int idx = 0; idx < dataArray[k].length; idx++) {
    System.out.print(dataArray[k][idx] + " ");
   }
   System.out.println();
  }
 }
}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
결과

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
......
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

:
Posted by mastar

http://suite.tistory.com  2011.4

검색해도 해결이 잘안보이길래~ 모든 정답은 아닐수있음

오류 메시지 : --- Cause: org.apache.commons.dbcp.SQLNestedException: Borrow prepareStatement from pool failed

ibatis 로 sqlmap.xml 에서 update 문에 실제 테이블에 없는 필드 지정 과 문법 오류였음 ~.~
  



 

:
Posted by mastar