달력

4

« 2024/4 »

  • 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

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
2010. 1. 27. 21:33

ascii vi 대응표 용-ILE/잡다구리2010. 1. 27. 21:33

ASCII 대응표
10진수 설명 기호
0 NUL [^@]
1 SOH [^A]
2 STX [^B]
3 ETX [^C]
4 EOT [^D]
5 ENQ [^E]
6 ACK [^F]
7 BEL [^G]
8 BS [^H]
11 VT [^K]
12 NP [^L]
13 CR [^M]
14 SO [^N]
15 SI [^O]
16 DLE [^P]
17 DC1 [^Q]
18 DC2 [^R]
19 DC3 [^S]
20 DC4 [^T]
21 NAK [^U]
22 SYN [^V]
23 ETB [^W]
24 SP [^X]
25 EM [^Y]
26 SUB [^Z]
27 ESC [^[]
28 FS [^]
29 GS [^]]
30 RS []
31 US [^_]
127 DEL [^?]

 

:
Posted by mastar

http://suite.tistory.com fs 2010 01

" Begin MIME to CD Conversion / End MIME to CD Conversion "

이런로그 안보고 싶을때

도미노 디렉토리에 notes.ini 아래옵션추가


CONVERTER_LOG_LEVEL=10

출처 링크 : http://documentation.excitor.com/technotes/2408.htm
                http://www-01.ibm.com/support/docview.wss?rs=899&uid=swg21104966

diiop 서버에서 기동 명령어는 > load diiop  ㅋ

국내에서 노츠 자료는 참없군 ~.~

 

:
Posted by mastar

suite.tistory.com fs 2010 01

검색엔진  수집기 만드는중  Notes공부해보니  참 운영하기에는 좋은 개발툴이자 DB 이자 웹서버 인거같다.
다만 검색엔진하고는 연계를 하지말라고 만든것 같기도하고   ~.~

암튼 좋은 링크가있어 올림

원문 URL : http://georgelanglais.blogspot.com/2008/12/notes-domino-backend-api-architecture.html

[BackendArchitecture1.bmp]
                             <착하신 분 잘 만들었음>

결론:  DIIOP는 Domino나 Notes 가 없어도 되지만
          C/C++ 라인은 반드시 Notes나 Domino 가 설치된 서버에서 가능    


참고로 C++ API 샘플도 
원문 링크 : http://www.notes411.com/dominosource/tips.nsf/0/5013A6AF2B2E5F5C802571B8007F4B67!opendocument


샘플 파일 :             


샘플 테스트 결과 클라이언트(Notes)설치된 상태에서 잘됨

:
Posted by mastar

http://suite.tistory.com 2009 12 fs

같은 대역대 있는 윈도우 컴터 공유

사용자 삽입 이미지



이런류에대한 해결방법이 검색해도 잘안보이길래 작성함~~

1. 445번 포트 방화벽 해제 

   대상 ip 192.168.1.2  
  시작->실행 : 
   netsh firewall set portopening TCP 445 ENABLE
   
  출처 : http://www.microsoft.com/korea/technet/prodtechnol/winxppro/maintain/sp2netwk.mspx
 
 포트 확인 :>telnet 193.1.1.2 445  

 2. 이래도 안되면 윈도우에 설치된 방화벽확인

    시작->실행 : wscui.cpl

사용자 삽입 이미지


   실행후 방화벽에 뭔가 설치되었다면 방화벽 해제~~~

 

:
Posted by mastar

http://suite.tistory.com/ 2009 03 fs

리눅스 <-> 윈도우 데이터 공유를
ftp로 하니 넘 불편해서 웹하드를 알아봤다~~
삼바는 일단 탈락~~ 여러가지 이유~~

찾은건 WEBDAV http://webdav.org

웹하드 서버를 리눅스에서는 아파치로 하면되고~
윈도우는 해보지않았지만 서버구성어쩌고 클릭클릭하면 되는것같다!

여기서는 아파치한거만 작성 ~ 루트아닌 일반사용자 계정으로~~~

1. 아파치 dav 모듈은 아파치 2.0 이상이면 기본으로 설치가 되어있다~

   확인 httpd.conf 에서 LoadModule dav_module modules/mod_dav.so  있음된다

2. httpd.conf 작성

  # dav 락파일이름 지정 디렉토리없음 만들어줘야함
  DAVLockDB "/lockdir/DAVLockDB"
  #웹하드 디렉토리 지정~
  <Directory /apache2/webhard>
  DAV On
  AuthName "WebDAV Login"
  AuthType Basic
  # 최소한은 보안 계정과 암호 ~~ webdav가 검색해보니 보안상문제는 많은걸로 보임~
  AuthUserFile /apache2/.htpasswd_fs
  #<LimitExcept GET HEAD OPTIONS>
    require valid-user
  #</LimitExcept>
  Order allow,deny
  Allow from all
 # 파일이 브라우저에서 보이게
 # Options Indexes FollowSymLinks

</Directory> 

3. 암호 파일 생성
   htpasswd  -m -c /apache2/.htpasswd_fs fs

4. 공유 디렉토리 생성및 쓰기 권한
    mkdir -p /apache2/webhard
    chmod 755  /apache2/webhard

5. apachectl restart 아파치 재시작

이렇게 하면 서버 설정 완료~~~

다음 윈도우(비스타)에서 서버 등록은 그림으로

1. 내컴퓨터에서 마우스오른쪽 클릭



2. 클릭클릭~



3. 웹서버 등록 : 위에서 지정한 계정과 암호 입력후 클릭 클릭~~~




끝~~


역시~ 없으면 만들까 생각했는데-.-; 착하신분들이 이미 이런 공유프로그램을 만들어 두었다~~~


 

:
Posted by mastar

http://suite.tistory.com/ fs 2008 09

아래는 vim 6.3 에서 테스트 ~ 전통 vi는 안되는것도 있을수 있음~
 
1. 일단 c 소스상의 함수나 변수 선언들을 파악할수있도록 색인 tags 파일을 만든다~

#> ctags -R * SRC_DIR
이러면 tags 라는 파일이 만들어 지고 이걸
.vimrc 또느 .exrc 파일에 아래와 같이 명시

set tags=/tags파일이있는디렉토리/tags

이렇게 설정후 c 소스 파일을 vi로 열어 함수또는 변수타입에서
 - CTRL + ]  하면 해당하는 선언 파일로 자동이동
 - CTRL + t   하면 원래 위치로 복귀

 참고 : proto type 보기 COMMAND 모드에서 해당위치에서 ]i

2. include 헤더파일 바로 보기 ??   CTRL + wf 

  ex) 소스 include 에서 <stdio.h> 위치에에서 ctrl + wf 하면 화면이 나눠지면서
        바로 확인 가능  


3. 그외 set 으로 해두면 쓸만한거 ~~  .vrimrc 또는 .exrc에 적어둔다

set paste " 마우스로 복사해서 붙일때 계단현상 일어날때~ 방법 1
set noai  " 마우스로 복사해서 붙일때 계단현상 일어날때~  방법 2
set title    " 타이틀에 현재 파일 명시
set autowrite " 파일열러개 열고 :n 하면 자동으로 저장
set ruler   " 우측하단에 현태 커서 줄 ,칸정보 명시 COMMAND 모드에서 ctrl + g 기능이넹
set ic       " 검색시 대소문자 무시
"set nohls   " 검색 / 을 수행하면 검색된 단어 반전을 제거
set hls       " 검색어 반전 적용
"set cindent "C 프로그래밍을 할때 자동 들여 쓰기 ~~ 개인에따라 적용
"map <F9> :w! <CR> :!make <CR> " F9 키 입력시 저장후 make 컴파일 실행 map
"list list    " tab 과 \0 값을 ^l , $ 로 표시


"이전에 읽은 위치에서 커서 시작 아래 두줄 - 방법1
set viminfo='20,\"50  
au BufReadPost * if line("'\"")|execute("normal `\"")|endif

"이전에 읽은 위치에서 커서 시작  - 방법 2
파일 읽은후 COMMAND 모드에서 `"


4. 파일 여러개 편집

vi *.c 후  
:set args 열려있는 파일 표시
:n  다음 파일 자동이동   <- 여기서 set autowrite 이 필요 할수있음
:n <파일이름>  해당하는 파일로 이동
:rew    or :N   vi *.c 해서 읽은 파일 제일 처음위치로 이동

ctrl + ^ 이전 파일로 이동

 

:
Posted by mastar
2008. 5. 23. 11:06

[애니콜] v4900 외부 동영상 용-ILE/잡다구리2008. 5. 23. 11:06

http://suite.tistory.com/

2007 03 fs

첨부 설정된 v4900.vcf :



외부 동영상을 보기위해서는


1. 2년전에 산 핸폰에 v4900  + 만원짜리 1g t flash 메모리


2. 펌웨어 업그레이드  yb?? 어쩌구 정도되야함

    이번에 최신은 YK18 임

    확인은 메뉴->0 -> 비밀번호 6725 -> 3번 버전정보에서 확인



3. vitualdub에 필요한 비디오,오디오 코덱설치 검색하여 구한다. -.-^

          비디오 :XviD-1.0.2-29082004.exe ( http://cafe.naver.com/iriverh300.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=7 )

          오디오: 1128802656_ac3 dts 다운로드.exe (http://blog.paran.com/taginnet/5921824)

                AC3ACM_1.31.zip           (http://file.naver.com/view_ad.php?fnum=113872)

4.  virtuadub을 검색을 통해 설치후(http://file.daum.net/view.php?fnum=64551) 인코딩

     참고 - 확장자 k3g ,mp4는 v4900 은 지원 안함

            - 이미 설정된 파일  파일 : 4900.vcf


한가지 선택 - Xvid MPEG-4 Coder -> Configuration -> Advanced Options... -> Motion 에서
                   Maximum- I-frame interval : 15로 변경
 
 
<참고 출처:http://www.avkorea.co.kr/moFORUMS/moA_DISP.aspx?FRM_ID=22&A_ID=115>

Motion search precision

높은 비트레이트를 적용 시는 5번, 낮은 비트레이트 적용 시 6번을 사용. Quantization type 역시 비트레이트를 낮게 할 때는 H.263, 높게 적용할 때는 MPEG 를 사용

VHQ mode

수치가 올라갈수록 품질이 좋아지지만 인코딩 속도가 느려지므로 최고 3까지가 적당 (보편적으로 1로 세팅)

Maximum I-frame interval

키프레임 간격을 말하며 단위는 프레임입니다. 300 이라면 24프레임 기준으로 최대 12.5초를 의미

Minimum I-frame interval

5정도가 적당

Enable lumi masking

너무 어둡거나 밝거나 해서 식별하기 어려운 장면의 비트를 낮추어 주는 것으로 주로 평균비트를 낮게 해서 만들 경우 적용

Use chroma motion

체크하면 품질은 올라가지만 인코딩 속도가 느려짐

B-frame control

압축률이 올라가지만 재생시 에러가 날 수도 있음

Maximum B-frames

-1로 줄 경우 사용안함으로 설정됨 (디폴트값 사용 권장 )

 
 
5. 동영상 + 자막 
BADAK 바닥 인코딩 프로그램(http://file.daum.net/view.php?fnum=103125)으로 자막을 삽입 한 후
virualdub로 재 인코딩 한다.
참고로 BADAK 설정은 모두 초기화로 하고  반드시 '소리-VBR' 설정은 cbr로 사용한다.
 
음성과 영상 싱크가 맞지 않다면  오디오-인터리빙- 비디오 시작... 의 ms를 조절 해보단 1000ms -> 1초 + ,- 가능
:
Posted by mastar