apache홈페이지에 가면 commons에 net라는 프로젝트가 있습니다. 이걸 이용하면 메일프로그램도 만들고, ftp프로그램도 만들고 다 손쉽게 만들 수 있을 것 같더군요.

  • FTP
  • NNTP
  • SMTP
  • POP3
  • Telnet
  • TFTP
  • Finger
  • Whois
  • rexec/rcmd/rlogin
  • Time (rdate) and Daytime
  • Echo
  • Discard
  • NTP/SNTP

아는 건 몇 개 없네-_-; Telnet도 된다는 건 CRT같은 것도 만들 수 있는건가...
어쨌든, ftp접속해서 리스트를 받아오는 프로그램을 작성해봅시다.
우선 준비물은 commons-net-1.4.1.jar과 jakarta-oro-2.0.8.jar 입니다.
commons-net.1.4.1.jar는 http://commons.apache.org/downloads/download_net.cgi
jakarta-oro-2.0.8.jar는 http://jakarta.apache.org/site/downloads/downloads_oro.cgi

SFTP는 안됩니다. SFTP는 SFTP를 지원하는 다른 라이브러리가 있더라구요. 고걸 사용해야해요.
[code]
package com.mudchobo.ftptest;

import java.io.IOException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;

public class FtpTest
{
    public static void main(String[] args) throws IOException
    {
        FTPClient client = new FTPClient();
        client.setControlEncoding("euc-kr"); // 한글 encoding....
       
        FTPClientConfig config = new FTPClientConfig();
        config.setDefaultDateFormatStr("yyyy년 M월 d일");
        config.setRecentDateFormatStr("M월 d일 HH:mm");
        client.configure(config);

        client.connect("접속할 ip or 도메인");
        client.login("아이디", "비밀번호");
       
        FTPFile[] files =
            client.listFiles("리스트를 가져올 경로");
       
        for (int i=0; i<files.length; i++)
        {
            FTPFile file = files[i];
            System.out.println("파일이름: " + file.getName() + " 사이즈 : " + file.getSize());
        }
       
        client.logout();
       
        if (client.isConnected())
        {
            client.disconnect();
        }
    }
}
[/code]
여기서 주의할 점은 config에서 DefaultDateFormatStr이랑 RecentDateFormatStr을 설정 안하면 리스트로 못 받아오더라구요. 저걸 설정할 때 ftp버전 마다 다 틀려서 다르게 설정 해야합니다. 우선 FTP에 접속을 해서 최근꺼랑 기본꺼랑 어떻게 나오는지 확인 후 거기에 맞춰야 합니다.

시작 -> 실행 -> cmd 치시고,
ftp 접속할 주소 [엔터]
아이디 [엔터]
비밀번호 [엔터]
dir 치시면 어떻게 나오는지 다 나옵니다.
저같은 경우 이렇게 나옵니다.
-rw-r--r--   1 daewoo   dba         3486  7월  1일  13:38 .cshrc
drwxr-xr-x  11 daewoo   dba          512 2002년  1월  3일 .dt
저거에 맞춰서 config설정해주시면 돼요.

실행해보면 이렇게 돼요.

파일이름: . 사이즈 : 512
파일이름: .. 사이즈 : 512
파일이름: MSG 사이즈 : 512
파일이름: RSTA 사이즈 : 1296
파일이름: RSUM 사이즈 : 1296
파일이름: SERR 사이즈 : 162
파일이름: SRET 사이즈 : 162
파일이름: SSTA 사이즈 : 162
파일이름: SSUM 사이즈 : 729
파일이름: SSUM_REPORT 사이즈 : 1948
파일이름: TPRR 사이즈 : 162
파일이름: URET 사이즈 : 162
파일이름: bin 사이즈 : 512
파일이름: data 사이즈 : 512
파일이름: src 사이즈 : 512
파일이름: ssta 사이즈 : 162
파일이름: trace 사이즈 : 1024

파일 받고, 올리고 하는 건, api참조!

FTP로 접속해서 파일 송수신하는 프로그램을 개발해야해서 포스팅!



 
Posted by 머드초보
,
 
Thread로 삽질을 하다가.....
알게 된....

우선 httpClient를 이용해서 웹스크래핑을 하는데요. Thread를 이용해서 5개정도 만들어서 5개를 스크래핑 시키면 더 빠르더라구요-_-; 그래서 Thread로 삽질을 하게 되었는데!

10분마다 도는 스케쥴러에 의해 실행되는 스케쥴러가 있다고 칩시다. 이 스케쥴러는 10분마다 해당 일을 실행합니다. 그 해당일은 스레드5개를 만들어서 5개를 웹스크래핑하는 겁니다.
이걸 그냥
[code]MyThread thread = new Thread();
thread.start();[/code]
이렇게 5개를 반복해서 넣어버리면......5개가 돌고 있는데 아직 끝나지 않았는데 이 스케쥴러는 다시 또 5개의 스레드를 만들어서 또 실행을 하게 됩니다-_-;
즉, 해당 메소드에서 해당 스레드가 끝날 때 까지 기다려주는 메소드인 것입니다.

[code]logger.info("DailySearch Start!");
        List<ScrapThread> threadList = new ArrayList<ScrapThread>();
       
        int count = bizNoDao.countBizListByStatus("T");
        for (int i=0; i<count / THREAD_SIZE; i++)
        {
            ScrapThread scrapThread = (ScrapThread)
                applicationContext.getBean("scrapThread");
            List<User> list = bizNoDao.selectUserBytStatusAndRow(
                    i * THREAD_SIZE, i * THREAD_SIZE + THREAD_SIZE, "T");
           
            scrapThread.setList(list);
            scrapThread.start();
           
            threadList.add(scrapThread);
        }
       
        for (int i=0; i<threadList.size(); i++)
        {
            try
            {
                threadList.get(i).join();
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        logger.info("DailySearch End!");
[/code]
조낸 귀찮아서 그냥 소스 가져다 붙입니다-_-;
그냥 내용을 보면 ScrapThread라는 놈을 여러개 만들어서 Thrad start시켜놓고, 여러개가 돌게 한다음에 고 아래에서는 해당 스레드를 join을 시킵니다. 그럼 1번스레드가 끝날 때까지 웨이트 하다가 끝나면 다시 2번쓰레드를 join시키고, 그런식으로 다 끝날 때 까지 기다린 다음에 끝내야합니다.

그렇게 되면 이 해당 메소드가 끝나지 않았기 때문에 다 끝나고 난 다음에 DailySearch End라는 말이 호출이 되게 되는 겁니다-_-; join안하면 바로 DailySearch End찍고, 그냥 스케쥴러가 끝이 나는거죠.

이것도 장황하게 포스팅하는 이유는 반나절을 고생해서 입니다-_-;

 
Posted by 머드초보
,
 
이 망할 놈의 오라클은 LIMIT이 지원되지 않습니다.
LIMIT이 얼마나 편한데!!!
오라클에서 LIMIT과 같은 기능이 필요했습니다.

ROWNUM이라는 것을 알게 되었는데, SELECT를 하게 된 결과에 자동으로 처음부터 끝까지 1부터 숫자를 매겨주는 듯했습니다. 아, 그래서 만약에 10번째꺼부터 20번째꺼를 추출해봐야지 라고 이런 쿼리를 날려봤습니다.

[code]SELECT * FROM BIZLIST WHERE ROWNUM >= 10 AND ROWNUM <= 20[/code]
이렇게 하니까 아무것도 안나오더라구요.
이게 안돌아가는 이유는 ROWNUM이라는 놈이 가상 칼럼이랍니다. 그래서 만약 칼럼이 SELECT될 때 10개가 출력되야하는 상황이라면 첫번째꺼 출력하고 ROWNUM을 붙이고, 두번째꺼 출력하고 ROWNUM을 붙이고, 그러다보니 저 조건에 맞지 않게 됩니다.

첫번째 출력될 놈은 ROWNUM이 1인데, 저 조건에 부합하지 않습니다. 그래서 출력이 안되고, 10번째 출력될 놈도 출력하려고 보니 다 조건에 맞지않아요. 그러다보니 차례대로 다 안나옵니다-_-;

즉 조건에 부합한 놈이 출력되고 난다음에 ROWNUM을 붙여줍니다.
그래서 ROWNUM이 10을 1로 바꿔버리면 ROWNUM이 1인놈부터 20개까지는 출력이 되는것이죠.

제가 설명을 좀 못하니 여기를 참조 하세요 ^^
http://www.oracle.com/technology/global/kr/oramag/oracle/06-sep/o56asktom.html

저걸 악(?) 이용하면 LIMIT처럼 구현할 수 있습니다-_-;
[code]SELECT * FROM (SELECT ROWNUM RNUM, BIZLIST.* FROM BIZLIST WHERE STATUS = 'A') A
WHERE A.RNUM BETWEEN 10 AND 20[/code]
쿼리를 잘 보시면 A테이블을 서브쿼리를 날려서 만들어줍니다. 즉 우리가 10~20까지 추출해야할 데이터를 다 추출해서 A라는 테이블을 만듭니다. 여기서 A테이블을 보면 ROWNUM도 칼럼에 추가를 시킵니다. RNUM이라는 이름으로!
그다음 이 추출된 모든 것이 보면 ROWNUM도 다 붙어있습니다. 그래서 이걸 다시 SELECT해서 RNUM이 10과 20사이인 것을 추출하게 하면 되는것이죠.
A테이블에서 WHERE절은 원하는 조건이니 없어도 되는 것이고-_-;
별 것도 아닌데 거창하게 써 놓은 이유는 제가 이것 때문에 반나절을 고생해서 입니다-_-;
아놔....ㅠㅠ

 
Posted by 머드초보
,
 
얼마전 회사에서 라인피드값, 캐리지리턴값 문제가 있어서 그것 때문에 HEX에디터가 필요했습니다.
에디트플러스에서는 HEX에디터가 안되는 것 같아서 울트라 에디트를 설치했습니다.
아놔.....실행할 때마다 돈내노라고 돈독오른 울트라 에디트가 너무 미워서 왠지 공짜 헥스에디터가 있을 것 같아서 찾아보고 있었는데, 매우 쉽게 찾을 수 있었습니다.

Hxd라는 놈인데, 매우 여러가지 기능이 있는 듯 한데, 저는 그냥 Hex로만 보면 되서-_-;
http://www.mh-nexus.de/hxd/

2008년 3월이 마지막 업데이트인 것으로 봐서 꾸준히 업데이트를 하는 듯합니다.
그외에는 어떤 기능이 있는지 모르겠네요.

 
Posted by 머드초보
,
 
기존에 Golden32나 Toad for Oracle을 썼었습니다.
그런데 오라클사에서도 자기들만의 GUI Tools같은 것을 만들었을 것이라는 생각에 찾아보니 Oracle SQL Developer라는 놈이 있더군요.

MySQL에서 제공하는 MySQL Administrator, MySQL Query Browser가 있는데, 자사에서 만드니 더 잘 만드는 것같아요. 뭐 단점이라면 포트가 막혀있는 곳에 접속이 안되는거?-_-; 그럴 땐 phpmyadmin을....-_-;

http://www.oracle.com/technology/software/products/sql/index.html
이곳에서 받을 수 있습니다.

뭐 암튼, 오라클에서 제공하는 SQL Developer라는 놈을 설치해봅시다.
설치랄 것도 없습니다. 그냥 압축풀고 실행하면 됩니다-_-;
JAVA로 만들어져서 JDK가 설치된 피씨거나, JDK가 포함된 버전을 받아서 실행하면 됩니다.

전 JDK가 있어서 없는 버전을 받았습니다. 그러면 처음 실행할 때 java.exe파일이 어디에 있냐고 물어봅니다. 가볍게 설치된 경로를 선택해서 java.exe파일을 선택해줍니다.

File -> New -> Database Connection 하고, 설정에 입력값들이 있는데 맞게 입력합니다.
Username, Password, Hostname, Port 뭐 이런거 입력하고, Save하고, Connect하면 접속이 됩니다.

사용하면서 느낀건데...뭔가 굉장히 불안정해요-_-;
30만건데이터를 파일로 추출하려고 하는데 메모리가 딸려서 다운이 되버렸어요.
지금은 또 그냥 알 수 없이 다운이 됐네요.
아직 좀 더 개선이 필요한 듯 합니다.

가장 맘에 드는 건 sql쿼리 만들 때 개발자들이 좋아라하는 Ctrl + Space를 지원합니다-_-;
사용자 삽입 이미지
또 뭐가 좋은지 확인해봐야지-_-;
 
Posted by 머드초보
,