월별 글 목록: 2009년 10월월

sjava-config 1.3

ConfigHandler 클래스의 생성자를 수정했습니다.
그리고, getValue에서 조건에 부합하는지에 대한 여부를 Specification Pattern을 사용했습니다. 사용법은 사용 가이드를 참고하세요.

바이너리 & 소스
cfile24.uf.177A531C4AE1696462D727.zipcfile5.uf.1859711C4AE169658DB286.zip

지메일(GMail)을 사용해서 메일보내기

지메일(GMail)을 사용해서 메일을 보내는 예제이다.

package net.sjava.email.test;
import java.security.Security;
import java.security.Security; 
import java.util.Date; 
import java.util.Properties;   
 
import javax.mail.Authenticator; 
import javax.mail.Message; 
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage;  

public class GMailSenderTest {

    private static final String SSLFACTORY = “javax.net.ssl.SSLSocketFactory”;
    private static final String USERID = “id@gmail.com”; 
    private static final String PASSWORD = “pw”; 
    private static Properties properties = System.getProperties();
    
    static {
        properties.setProperty(“mail.smtp.host”, “smtp.gmail.com”); 
        properties.setProperty(“mail.smtp.socketFactory.class”, SSLFACTORY); 
        properties.setProperty(“mail.smtp.socketFactory.fallback”, “false”); 
        properties.setProperty(“mail.smtp.port”, “465″); 
        properties.setProperty(“mail.smtp.socketFactory.port”, “465″); 
        properties.put(“mail.smtp.auth”, “true”); 
    }
    
    //
    public Message getMessage(Session session, String to, String title, String content) throws MessagingException {
        Message msg = new MimeMessage(session);     
        msg.setFrom(new InternetAddress(to)); 
        msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); 
        msg.setSubject(title); 
        msg.setText(content); 
        msg.setSentDate(new Date()); 
        
        return msg;
    }
    
    //
    public void send(String to, String title, String content) {
        
        try {
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());            
            Session session = Session.getDefaultInstance(properties, new Authenticator() { 
                protected PasswordAuthentication getPasswordAuthentication() { 
                    return new PasswordAuthentication(USERID, PASSWORD); 
                } 
            });            
            Transport.send(this.getMessage(session, to, title, content));
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        GMailSenderTest sender = new GMailSenderTest();
        sender.send(“skidboy@daum.net”, “헐”, “내용”);
    }
}

java synchronized keyword는 객체에 대한 lock 이죠??

흠..
며칠전에 회사에서 synchronized keyword로 얘기를 하다가 그냥 말았다..
메쏘드(임계영역)만 lock이 걸리는 형태로 알고 있으셔서 흠..

아래 코드를 돌려보자..
아래와 같은 메세지를 뿌려준다.. 즉, 아래 코드의 singleton 객체에 대한 락은 묵시적으로 Monitor객체를 취득하고 메쏘드를 빠져나가면 반환하는 구조로 되어 있는데 말이다..

따라서, 메쏘드 01에 진입을 하게 되면, 02는 01이 완료될때까지 대기를 하다가 01이 완료되면 02메쏘드가 불리게 되는 그런 구조이다..

print01 call
print01 진입
print02 call
print01
print02 진입
print02

package net.sjava.test.sync;

public class SyncTestMain {
   
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new Thread(){
            public void run() {
                SingleTon instance = SingleTon.getInstance();
                System.out.println(“print01 call”);
                instance.print01();           
            }
        }.start();
       
        new Thread(){
            public void run() {
                SingleTon instance = SingleTon.getInstance();
                System.out.println(“print02 call”);
                instance.print02();           
            }
        }.start();
   
    }
}

package net.sjava.test.sync;

public class SingleTon {

    private static SingleTon instance = new SingleTon();
   
    private SingleTon() {
       
    }
   
    public static SingleTon getInstance() {
        return instance;
    }
   
    public synchronized void print01() {
        System.out.println(“print01 진입”);
        try {
            Thread.sleep(5000);
            System.out.println(“print01”);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    public synchronized void print02() {   
        System.out.println(“print02 진입”);
        try {
            Thread.sleep(1000);
            System.out.println(“print02”);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}

* reference
 – http://iilii.egloos.com/4071694

cmd로 파일을 복사하는 script

윈도우에서 간혹 다량의 다른 위치에 복사를 한다든지, UNC경로로 다른 서버에 파일을 배포할 이슈가 있습니다.
그때 아래의 코드를 약간 수정해서 사용하시면 아주 쉽게 복사를 할 수 있습니다. ^^

@echo off

set date_var=%date%
set time_var=%time%
set from_file_name=C:\cmd-test\a\*.*
set to_file_base=C:\cmd-test\
set to_file_detail=\a\
set /a server_count=25
set result_file=copy_result.txt

echo ================== update start ======================= >> %result_file%
echo %date_var% %time_var% >> update_result.txt

for /l %%i in (1,1, %server_count%) do (
 call :copy %%i
)

echo ================== copy ended ======================= >> %result_file%
echo %date_var% %time_var% >> update_result.txt
echo ================== update ended ======================= >> %result_file%
goto :EOF

:copy
setlocal
set /a rec_var=%1%
set rec_str_var=0%1%
if %rec_var% lss 10 (set rec_str_var=0%rec_var%) else (set rec_str_var=%rec_var%)
set to_full_file_name=%to_file_base%%rec_str_var%%to_file_detail%
echo %to_full_file_name%
xcopy %from_file_name% %to_full_file_name% /e /c /y /i /r /f >> %result_file%
endlocal
goto :EOF