Search

JavaMail 사용시 501 Syntax error 해결방법

Java/오류해결 2012. 5. 2. 15:00 Posted by 퓨어레드

모든 501 에러 처리 방법은 아니다. Exception 이 아래와 같이

 

javax.mail.MessagingException: 501 Syntax error

 

at com.sun.mail.smtp.SMTPTransport.issueCommand(SMTPTransport.java:1363)
at com.sun.mail.smtp.SMTPTransport.helo(SMTPTransport.java:838)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:375)

 

 

떨어졌을때 해결방법

 

이 문제는 평소에 잘 되던 시스템에서 타 시스템으로 갔을 때 아주 간혹 생기는 문제 -_-;;;;;;;;; 인데;;

완전 초난감 했던 문제이다.. ㅠㅠ... 결국 외국 사이트를 뒤지고 뒤져도.. 원인을 찾을 수 없었는데 ㅠㅠ;;

그나마 검색 신공을 이용하여... SMTPTransport 에 해당 하사는 소스를 찾게 되었다..

 

문제의 부분을 보면

 

private void helo(String domain) throws MessagingException {
	if (domain != null)
		issueCommand("HELO " + domain, 250);
	else
		issueCommand("HELO", 250);
}

 

바로!! 838 라인 때문에 생기는 문제이다.. 다시 말해 SMTP 명령어를 HELO 만 쓰면 501 Syntax 에러가 발생하고

HELO HIHI 이렇게만 써줘도 에러가 안나는데.. 838번 라인을 타게 되는 이유는 domain 이 셋팅이 안되서 였다..!!! 두둥 -_-

이걸 알아내느라 안되는 영어로 외국사이트 까지 뒤진 내가 신기하다.. ㅋㅋ 암튼 해결방법은!!

 

이 문제가 발생했다면.. 가장 먼저 의심해볼것이 바로 컴퓨터 이름이 없거나.. 한글이 섞여있는지 확인한다 ㅠㅠ

 

그렇다.. ㅠㅠ 문제는 컴퓨터 이름이 한글이여서 생긴 문제인것이였다!!!!!!!!!! 두둥.. 코드엔 전혀 문제가 없었던... 것...............

완전.................... 개삽질............ -_- 암튼.. 컴퓨터 이름을 바꾸지 않아도 해결할수 있는 방법도 있다.

 

javamail 관련 property 설정시 mail.smtp.localhost 부분을 추가하는것이다.

 

Properties props = new Properties ();
props.put ("mail.smtp.host", smtpServerAddr);
props.put ("mail.smtp.localhost", smtpServerAddr);
props.put ("mail.debug", "true");
props.put ("mail.smtp.auth", "true");

session = Session.getInstance (props, null);

 

 

 

이러면 해결 된다......................................................................................................................................

사는게 다 그렇지뭐 -_- ㅠㅠ

 

'Java > 오류해결' 카테고리의 다른 글

JavaMail 로 Gmail 보내기  (0) 2016.05.03

Java.. 레이블된 break, continue

Java/기본 2012. 4. 18. 12:29 Posted by 퓨어레드

레이블된 문장

 

processWork:
{
     // 중첩 For 가 있을때 자신의 for 문이 break 되지 않고 processWork 의 끝부분으로 이동
     break processWork;
 
     // 중첩 For 가 있을때 자신의 for 문이 continue 되지 않고 processWork 의 시작부분으로 이동
     continue processWork;
}

 

하지만 자주 사용하면 안될듯 한 코드이긴하다

 

'Java > 기본' 카테고리의 다른 글

XML 암호화 관련 링크  (0) 2013.01.03
String 형 Date 형으로 파싱하기.  (0) 2012.10.30
현재 사용하는 OS 이름 가져오기  (0) 2012.04.18
ByteStream  (0) 2012.04.18
Method 동적 호출  (0) 2012.04.18

현재 사용하는 OS 이름 가져오기

Java/기본 2012. 4. 18. 12:27 Posted by 퓨어레드

자신의 사용하는 운영체제를 알아낼 필요가 있을 때가 있습니다.
그럴 경우 아래와 같은 간단한 코드로서 쉽게 알아낼 수 있습니다.

System클래스의 getProperty()메소드에 os.name이라는 인자를 주면 문자열로 운영체제를 리턴합니다.

String osName = System.getProperty("os.name");
System.out.println (osName);

'Java > 기본' 카테고리의 다른 글

String 형 Date 형으로 파싱하기.  (0) 2012.10.30
Java.. 레이블된 break, continue  (0) 2012.04.18
ByteStream  (0) 2012.04.18
Method 동적 호출  (0) 2012.04.18
자바 타이머 기능  (0) 2012.04.18

ByteStream

Java/기본 2012. 4. 18. 12:26 Posted by 퓨어레드

ByteStream 쓰는 예제 - 다른 블로그에서 가지고 온것 같았는데 출처를 잊어버렸습니다. 혹시라도

문제가 될시에는 댓글 달아주시면 삭제하겠습니다.

 

/*
* IO Stream - byte streamming
-> byte방식으로 전송하는 객체
InputStream -> Application -> OutputStream

1. File Stream
1) File로 기록하는 방법
Application -> OutputStream -> File
2) File에 기록된 데이터를 응용프로그램으로 가져오는 방법
File -> InputStream -> Application
*/

import java.io.*;

class _FileInputStream 
{
	public String getMessage()
	{
		BufferedReader in;
		String msg = "";
		System.out.print("\nInput Message?");

		try
		{
			in = new BufferedReader(new InputStreamReader(System.in));
			msg = in.readLine();
			in.close();
		}
		catch(IOException ie){}

		return msg;
	}

	/*File에 데이터를 기록하는 부분*/    
	public boolean fileWrite(String data)
	{
		OutputStream os = null;
		boolean sw = false;
		try
		{
			os = new FileOutputStream("a.txt");
			os.write(data.getBytes());
			os.close();
			sw = true;
		}
		catch(IOException ie){}

		return sw;
	}
}

class _FileOutputStream 
{

	/*기록된 파일에서 데이터를 읽는 방법*/
	public String fileRead(String file)
	{
		InputStream is = null;
		String msg = "";
		try
		{
			is = new FileInputStream(file);
			byte b[] = new byte[1024];

			while(is.read(b) != -1)
			{
				msg += new String(b);
			}

			is.close();
		}
		catch(IOException e){}

		return msg;
	}
}

public class ByteStreamExam 
{
	public void write()
	{
		_FileInputStream fs = new _FileInputStream();

		if(fs.fileWrite(fs.getMessage()))
			System.out.println("a.txt로 기록되었습니다.");
		else
			System.out.println("a.txt에 기록을 실패하였습니다.");
	}

	public void read()
	{
		_FileOutputStream fos = new _FileOutputStream();
		System.out.println(fos.fileRead("a.txt"));  
	}

	public static void main(String[]args)
	{
		//new ByteStreamExam().write();
		new ByteStreamExam().read();
	}
} 

'Java > 기본' 카테고리의 다른 글

Java.. 레이블된 break, continue  (0) 2012.04.18
현재 사용하는 OS 이름 가져오기  (0) 2012.04.18
Method 동적 호출  (0) 2012.04.18
자바 타이머 기능  (0) 2012.04.18
Java Generic  (0) 2012.04.18

Method 동적 호출

Java/기본 2012. 4. 18. 12:21 Posted by 퓨어레드

메서드를 런타임시에 호출한다.

 

Class<?>[] argType = new Class[1];

argType[0] = G2ModelMap.class;
StringBuffer returnBuf = null;

try
{
	Method oneDataMethod = CommonGetOneDataBiz.class.getMethod (getName, argType);

	Object [] argData = new Object[1];

	argData[0] = rm;

	returnBuf = (StringBuffer) oneDataMethod.invoke (this, argData);
}
catch (Exception ex)
{
	ex.printStackTrace ();
}

 

'Java > 기본' 카테고리의 다른 글

Java.. 레이블된 break, continue  (0) 2012.04.18
현재 사용하는 OS 이름 가져오기  (0) 2012.04.18
ByteStream  (0) 2012.04.18
자바 타이머 기능  (0) 2012.04.18
Java Generic  (0) 2012.04.18

자바 타이머 기능

Java/기본 2012. 4. 18. 12:19 Posted by 퓨어레드

자바 타이머 기능..

 

public class A
{
	public void init ()
	{
		final Timer timer = new Timer ();

		timer.schedule (new TimerTask () 
		{
			public void run ()
			{
				close ();
				timer.cancel ();
			}
		}, 5000);
	}

	public void close ()
	{
	// 
	}
}

 

'Java > 기본' 카테고리의 다른 글

Java.. 레이블된 break, continue  (0) 2012.04.18
현재 사용하는 OS 이름 가져오기  (0) 2012.04.18
ByteStream  (0) 2012.04.18
Method 동적 호출  (0) 2012.04.18
Java Generic  (0) 2012.04.18

EL

Java/JSP 2012. 4. 18. 11:37 Posted by 퓨어레드

EL (Expression Language)

-       개발팀 남한희 대리

1.     EL 이란?

A.     JSP 2.0 스펙 2.0 부터 추가된 표현식 언이이다.

B.      JSP 파일안에 있는 자바 코드를 간결하게 표현하는 표현언어

2.     EL 표현식

A.     ${person.name}

B.      EL 앞부분은 EL 내장 객체 또는 속성이 온다.

C.      EL 내장 객체
- pageScope, requestScope, sessionScope, applicationScope, param, paramValues,
 header, headerValues, cookie, initParam, pageContext
속성은 page, request, session, application 에 바인딩된 속성값..

3.     도트 연산자 사용하기

A.     첫번째 변수 다음의 도트 (.) 은 첫번째 변수가 맵이면 맵의 키이고 자바 빈이면 프로퍼티임

B.      도트 (.) 다음엔 문자, _, $로 시작해야 함

C.      두번째 글자부턴 숫자를 써도 괜찮음, 자바 예약어 안됨 (return 같은것)

4.     [] 연산자

A.     ${person["name"]} ${person.name} 과 같음

B.      도트(.) 연산자는 연산자 왼쪽에 맵이나 빈 밖에 올수가 없음

C.      [] 연산자는 배열이나 리스트도 올수 있음

D.     배열 접근 ${arrayData[0]} 식으로 접근 가능

E.      Map 접근시 ${mapData["key"]} 식으로 접근 가능

F.      [] 연산자 안에 따움표가 붙지 않는 형태의 문자열이 들어오면 문자열에 해당하는 속성을
바인딩한다.

5.     param, paramValues 내장 객체 : Get 이나 Post 로 쏜 데이터에 접근한다.

A.     ${param.name}, ${param.empID}

B.      paramValues 는 배열 형태의 값에 접근한다.

C.      ${paramValues.food[0]}

6.     header 내장 객체 - HTTP 해더 데이터에 접근한다.

A.     ${header.host}, ${header.userAgent} ..


 

 

7.     EL 내장객체 requestScope request 객체는 다름

A.     requestScope request 객체가 아닌 속성을 가져오기 위해 사용

B.      request 정보는 pageContext 를 통해서 접근 가능

C.      request 객체 자체가 Bean 형태가 아니기 때문에 Bean 형태의 접근을 위해
pageContext.request
를 통하여 접근함

8.     기타 내장 객체는 상황에 맞게 사용!!

9.     EL 에서도 연산자 사용이 가능

A.     +, -, *, / (또는 div), % (또는 mod)

B.      && (또는 and), || (또는 or), ! 또는 (not)

C.      == (또는 eq), != (또는 ne), < (또는 lt), > (또는 gt), <= (또는 le), >= (또는 ge)

10.   include 지시다

A.     <%@ include file="파일명" %>

B.      include 내용이 원 소스에 완전히 박혀 버린다.

C.      변수등을 공유해서 사용할수 있다.

11.   <jsp:include> 표준 액션

A.     <jsp:include page="header.jsp" />

B.      include 한 파일의 결과가 소스에 박힌다.

C.      독립된 include 환경을 만들수 있다.

D.     다소 퍼포먼스가 떨어진다.

12.   <jsp:forward> 도 있음~

 

'Java > JSP' 카테고리의 다른 글

fmt:formatDate 쓰기  (0) 2012.11.02
JSTL 에서 List Size 구하기..  (0) 2012.05.03
EL 중 list 데이터 존재 여부 확인  (0) 2012.05.02
No-Cache 설정  (0) 2012.05.02
JSTL (JSP Standard Tag Library) 1차 정리  (0) 2012.04.18

iBatis Cache 모델

Java/iBatis 2012. 4. 18. 11:35 Posted by 퓨어레드

iBatis Cache 모델

-       개발팀 남한희 대리

1.     캐쉬를 왜 사용 하는가

A.     캐쉬를 사용함으로써 중복 쿼리의 속도를 향상시킴

B.      캐쉬를 사용하여 Database 부하를 줄임

 

2.     iBatis 에 캐쉬모델

A.     iBatis 에서의 캐쉬모델은 데이터베이스를 이용하지 않고 읽어들인 쿼리 결과를 메모리에 저장하고 같은 요청이 왔을 때 리턴하는 방식이므로 데이터베이스와 상관없이 동작한다.

B.      그렇다면 캐쉬 모델을 비우는 시점은 어떻게 결정될까?
iBatis
에서는 캐쉬 모델을 비우는 방법을 두가지 설정 할 수 있다.

                         i.         특정 statement 가 실행 될 때..

                        ii.         특정 시간이 초과 되면

                       iii.         특정 사이즈를 초과 하면 (메모리 모델에 따라 결정)

 

3.     캐시 모델 타입의 종류

A.     MEMORY : Heap 메모리에 저장하는 구조

                         i.         캐쉬 데이터가 GC 에게 삭제되는 형태를 결정 할 수 있다.

1.      WEAK : GC 가 메모리 반환이 필요하면 바로 캐쉬 데이터는 삭제된다.

2.      SOFT : GC 에서 메모리가 없어서 반환 요청을 할 때 캐쉬 데이터를 삭제한다.

3.      STRONG : Statement 와 캐쉬 비우는 시간이 되지 않는 이상 GC 에 반환하지 않는다.

B.      LRU : 사용하지 않는 오래된 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

C.      FIFO : 가장 먼저 만들어진 캐쉬부터 삭제 하는 구조

                         i.         Size 라는 값을 설정하여 최대 캐쉬 데이터수를 지정한다.

D.     OSCACHE : Open Symphoy 라는 캐쉬 프레임워크를 사용 하여 캐시를 관리한다.

 

4.     캐시 데이터 처리 방법의 종류

A.     readOnly : 읽기 전용이면 공유 메모리를 리턴한다.

                         i.         False : 읽기 전용이 아니기 때문에 데이터 사용은 복사를 하여야 한다.

B.      serialize : 객체 복사 여부 결정

                         i.         True : 객체를 복사하여 리턴한다.

                        ii.         False : 객체를 복사하지 않고 캐시된 객체 자체를 리턴한다.

C.      readOnly serialize 를 적절히 조합해야 한다.

                         i.         readOnly : true, serialize : false -> 읽기 전용에 객체 자체를 리턴하기 때문에 가장 빠름

                        ii.         readOnly : false, serialize : true ->
객체가 복사되어 리턴하고 리턴된 객체는 쓰기를 할 수 있다.

                       iii.         readOnly : true, serialize : true ->
의미가 없다.

                       iv.         readOnly : false, serialize : false ->
공유된 객체이므로 상당히 위험하다


 

 

 

5.     문법

A.     캐쉬 모델 선언

                         i.         <cacheModel id = “캐시아이디” type=”캐시모델타입” readOnly=”true” serialize=”false”>

</cacheModel>

-
기본 적인 캐시모델 선언이다
.

B.      캐시 적용

                         i.         <select id = “selectCategorys” parameterClass=”int” resultClass=”CategoryVo”
cacheModel=”
캐시아이디
”>
</select>

-
캐쉬가 적용되어 같은 요청이 오면 캐쉬에서 데이터가 나간다
.

C.      Flush 적용

                         i.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
</cacheModel>

- insert, update, delete
등이 호출되면 캐쉬가 초기화 된다.

                        ii.         <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushInterval hours=”12” />
</cacheModel>

- 12
시간 마다 캐시를 삭제한다. (hours, minutes, seconds, milliseconds 사용 가능
)


D.     모델 타입 적용

                         i.         MEMORY

1.      메모리는 property 값을 reference-type 을 받는다.

2.      <cacheModel id = “categoryCache” type=”MEMORY” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “reference-type” value = “WEAK” />
</cacheModel>


 

 

                        ii.         LRU

1.      LRU 는 프로퍼티로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”LRU” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
< property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

                       iii.         FIFO

1.      FIFO LRU 와 마찬가지로 size 를 받는다.

2.      <cacheModel id = “categoryCache” type=”FIFO” readOnly=”true” serialize=”false”>
<flushOnExecute statement=”category.insert” />
<flushOnExecute statement=”category.update” />
<flushOnExecute statement=”category.delete” />
<property name = “size” value = “200” />
</cacheModel>

3.      캐시 데이터가 200개가 차면 데이터 삭제가 일어난다. 그렇기에 size 값 설정은 신중하게 하여야 한다.

 

6.     캐시 전략 수립하기

A.     여러 종류의 캐시 레벨이 존재하기 때문에 데이터의 형태에 따라 적절한 캐시 모델을 사용한다.


7.     캐시 모델 직접 제작하기

A.     Com.ibatis.sqlmap.engine.cache.CacheController 인터페이스를 구현하면 자신만의 캐시 엔진을 만들수 있다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis RowHandler  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis RowHandler

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis RowHandler

-       개발팀 남한희 대리

1.     iBatis RowHandler ..

A.     용량 또는 레코드 수가 많은 레코드셋을 처리할수 있는 방법

B.      레코드를 한번에 다 가져오지 않고 레코드 하나하나씩을 핸들러에서 처리하는 방식

C.      iBatis 특성상 Recordset 을 모두 List 에 저장해야 되는 단점을 극복할수 있는 방법

D.     List 에 전부 저장하지 않고 바로바로 처리 하여 메모리를 절약할수 있고 실행 속도 또한 절약 할 수 있다.

 

 

2.     핸들러 만들기

A.     핸들러 클래스는 com.ibatis.sqlmap.client.event.RowHandler 를 구현해야 한다.

B.      RowHandler 인터페이스의 void handleRow (Object valueObject) 를 구현한다.

C.      handleRow 에 넘어오는 valueObject ResultMap 에 해당하는 Class 가 리턴한다.
해당 클래스로 캐스팅하여 데이터를 처리한다.

D.     핸들러 클래스는 생성을 하여 iBatis 에 넘기는 구조이기 때문에 다른 여러 부가적인 처리가 가능하다.


 

3.     핸들러 호출

A.     핸들러 클래스를 생성한 다음 sqlMapClient 함수중 queryWithRowHandler 를 호출한다.

B.      queryWithRowHandler ([Select ID], [Parameter Data], [RowHandler Interface]);

C.      로우 핸들러는 당연히 Select ID 에만 매칭이 된다.

D.     queryWithRowHandler ("res.getsResource", sData, rowHandler);

 

 

4.     스프링에서의 호출

A.     스프링의 getSqlMapClientTemplete () 에는 해당 함수가 없다.

B.      그러기에 getSqlMapClient () 를 호출하여 직접 sqlMapClient 에 접근하여 호출한다.

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis ResultMap 상속  (0) 2012.04.18

iBatis ResultMap 상속

Java/iBatis 2012. 4. 18. 11:34 Posted by 퓨어레드

iBatis ResultMap 상속

-       개발팀 남한희 대리

1.     상속과 구성의 차이점을 명확하게 알자!!

A.     상속은 상위를 포함한 하위 확장 개념

B.      구성은 상위를 내포한 포함 개념 (말이 이상하다 따로 설명해야 할 듯..)


2.     ResultMap 상속의 개념

A.     ResultMap 을 상속하는 개념은 비슷한 기존 ResultMap 에서 확장된 ResultMap 이 있을 경우,  코드량을 줄이고 기존 ResultMap 에서 확장된 ResultMap 을 사용 할 경우 사용함


3.     예시

A.     코멘트, 첨부파일, 도메인 모델 등에서 사용

                         i.         코멘트 : 코멘트의 경우 보통 일련번호, 작성자, 내용 등 많은 내용이 비슷하고 이에 FK만 달라지는 경우가 많다. 이럴 경우 공통 ResultMap 에 들어가는 필드는 테이블에 맞춰주고 달라지는 부분만 상속으로 처리한다. (첨부파일도 마찬가지)

                        ii.         도메인 모델 : 기본 ResultMap 을 만들고 추가되는 Domain 모델이 있다면 이 항목을 기본 ResultMap 을 상속받고 추가되는 Domain 모델을 확장하여 ResultMap 을 구성한다.
도메인 모델에선 상속된 ResultMap 으로 데이터를 주입받아 속도 개선에 도움을 준다
.


4.     문법

A.     상속 받는 ResultMap extends=”상위ResultMapID”

B.      기본 ResultMap
<resultMap class="ResellerVo" id="ResellerRm">
<
result property="resellerID" column="resellerID" jdbcType="VARCHAR" />
</resultMap>

C.      ResultMap 상속
<resultMap class="ResellerDm" id="ResellerDmRm" extends="ResellerRm">
<
result property="companys" column="{resellerID=resellerID}" select="company.getsGwCompany" />
</resultMap>

D.     기타

                         i.         하위 ResultMap  에 들어가는 Vo Class 가 상위 ResultMap 에 들어가는 Vo Class 와 꼭 상속 관계일 필요는 없다. (ResultMap 에서만 상속관계이지 실제 클래스가 상속관계일 필요는 없다는 것)


 

 

iBatis 하위 ResultMap 결정

 

5.     선택 가능한 하위 ResultMap

A.     특정 조건으로 하위 ResultMap 을 결정 할수도 있다.

B.      조건은 상위 ResultMap 에서 결정한다.

C.      특정 컬럼의 값으로 하위 ResultMap 을 결정한다.

6.     문법

A.     <resultMap class="ResellerVo" id="ResellerRm">
<result property="resellerID" column="resellerID" jdbcType="VARCHAR" />         
<result property="resellerName" column="resellerName" jdbcType="VARCHAR" />
<result property="regDate" column="regDate" jdbcType="VARCHAR" />

<discriminator column="TYPE" javaType="string">
<subMap value="Book" resultMap="ResellerRm2" />
<subMap value="News" resultMap="ResellerRm3" />
</discriminator>


</resultMap>

B.      Select 가 된 컬럼중 TYPE 이라는 컬럼의 값이 Book 이면 ResellerRm2 을 선택하고
News
라면 ResellerRm3 를 선택함


C.      하위 Resultmap 을 결정 구분을 사용 할 경우 구분 할 수 있는 컬럼이 있어야 한다.

D.     만약 구분 할 수 있는 컬럼이 없다면 alias 를 이용한다.

                         i.         Select field1, field2, field3, ‘Book’ as TYPE FROM TestTable

 

 

'Java > iBatis' 카테고리의 다른 글

iBatis resultMap 의 select 중 column 을 여러 컬럼을 주고 싶을 때...  (0) 2012.06.13
iBatis Cache 모델  (0) 2012.04.18
iBatis RowHandler  (0) 2012.04.18