jdk7 바낀것

java 2009. 10. 8. 10:08

Java(JDK) 7 특징

the proposed features in Java 7

1. Improved Type Inference for Generic Instance Creation
 - 단순해진 Generics
이전 : 
Map<String, List<String>> anagrams = new HashMap<String, List<String>>();
JDK7 :
Map<String, List<String>> anagrams = new HashMap<>();
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000009.html

2. Language support for collections
 - Java 코드의 사이즈를 줄여주고, 가독성을 높여줌
이전 :
final List<Integer> piDigits =
Collections.unmodifiableList(Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9 ));
JDK7 :
final List<Integer> piDigits = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 9];
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001193.html

3. Automatic Resource Management
 - exception handling을 줄여줌
 - C++’s RAII과 C#’s using에 대응하기 위함
이전 :
static String readFirstLineFromFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}
JDK7 :
static String readFirstLineFromFile2(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
return br.readLine();
}
}
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000011.html

4. Added binary integer literals
 - Integer Literal에 Binary Integer Literal이 추가됨
BinaryIntegerLiteral:
BinaryNumeral IntegerTypeSuffix_opt
BinaryNumeral:
0 b BinaryDigits
0 B BinaryDigits
BinaryDigits:
BinaryDigit
BinaryDigit BinaryDigits
BinaryDigit: one of
0 1
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000929.html

5. String literals in switch statements
 - 스위치문에 문자열 사용 가능
JDK7 :
String s = "first";
switch(s) {
case "first":
processFirst(s);
case "second":
case "third":
processThird(s);
break;
case "fourth":
processFourth(s);
default:
processDefault(s);
break;
}
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000001.html

6. Simplified Varargs Method Invocation
 - 컴파일 경고에서 메소드 선언 경고로 이동함
이전 :
static <T> List<T> asList(T... elements) { ... }
static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
*// Warning: **"uses unchecked or unsafe operations"*
return asList(a, b, c);
}
JDK7 :
*// Warning: **"enables unsafe generic array creation"*
static <T> List<T> asList(T... elements) { ... }

static List<Callable<String>> stringFactories() {
Callable<String> a, b, c;
...
return asList(a, b, c);
}
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000217.html

7. Enhanced null handling
 - Null-ignore invocation, Null-safe types
이전 :
String str = getStringMayBeNull();
str = (str == null ? "" : str);
JDK7 :
String str = getStringMayBeNull() ?: "";
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/000217.html

8. Enum Comparisons
 - Enum에서 range(<, > 등) 연산 가능
이전 :
if(rank1.compareTo(rank2) < 0) ...
if(rank1.ordinal() < rank2.ordinal()) ...
JDK7 :
if(rank1 < rank2) ...
9. Chained Invocation
 - 체인형식으로 메소드 호출 가능
이전 :
DrinkBuilder margarita = new DrinkBuilder();
margarita.add("tequila");
margarita.add("orange liqueur");
margarita.add("lime juice");
margarita.withRocks();
margarita.withSalt();
Drink drink = margarita.drink();
JDK7 :
Drink margarita = new DrinkBuilder()
.add(“tequila”)
.add(“orange liqueur”)
.add(“lime juice”)
.withRocks()
.withSalt()
.drink();
10. Extension Methods
 - static import 확장
이전 :
List list = new ArrayList();
...
Collections.sort(list);
list.sort();
JDK7 :
import static java.util.Collections.sort;
List list = new ArrayList();
...
list.sort();
 - 레퍼런스 : http://www.javac.info/ExtensionMethods.html

11. Improved Exception Handling
 - 두개이상의 catch문 가능
 - catch문에서 rethrow가능
JDK7 : catch multiple exceptions
try {
return klass.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
throw new AssertionError(e);
}
JDK7 : rethrow exceptions
try {
doable.doIt();
} catch (final Throwable ex) {
logger.log(ex);

// surrounding method can declare only checked thrown by doIt()
throw ex;
}
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-February/000003.html

12. Language support for JSR 292
 - 다이나믹 타입 지원(java.dyn.Dynamic)
JDK7 :
Dynamic x = (any type of expression can go here);
Object y = x.foo("ABC").bar(42).baz();
 - 레퍼런스 : http://mail.openjdk.java.net/pipermail/coin-dev/2009-March/001131.html
Posted by 복태아빠
,

2009/04/07 16:59

복사 http://blog.naver.com/vijaru777/130045619812

프로젝트를 하다보면 데이터를 엑셀로 출력해 달라는 요구가 빈번히 발생한다.
간단하게 CSV 파일로 출력할 수도 있으며 Excel이 HTML 형태의 문서양식도 지원하기에
HTML로 작성하고 mine type만 살짝 바꿔주어 엑셀로 읽을 수 있도록 하는 방법이 있다.

물론 CSV로 요구사항을 충분히 만족시킬 수 있을 경우도 있으나 고품질의 엑셀 양식을 요구할 경우 위 두 방법은 웬지 부족함이 있다. 이럴 경우 엑셀 포맷으로 출력할 필요가 있는데 여러가지 솔루션이 있어 어렵지 않게
해결할 수 있는 부분이지만 매번 어떻게 처리할 지 고민을 한다. 여러가지 방법을 사용해 본 후 가장 나은 방법을 추천해 본다.

솔루션 찾기

Java로 엑셀을 다루기 위한 방법은 여러가지 있으며 대표적인 것 3가지만 살펴본다.
Java Excel API은 개발자가 엑셀 스프레드시트를 동적으로 읽고, 쓰고 수정할 수 있도록 하는 성숙한 오픈소스 java API이다. Java 개발자는 간단한 API를 이용하여 엑셀 스프레드시트를 읽고, 수정하고 쓸 수 있다.

장점은 이 패키지는 다른 패키지를 필요로 하지 않고 현재버전(2.6.9.1)의 jar 파일의 크기가 709KB로 부담없이 쓸 수 있다는 것이다. 비교적 간단한 AP를 제공하나 엑셀의 차트나 그래프 매크로 정보를 생성할 수는 없으며 시트에 PNG 이미지만 추가할 수 있다.

POI는 Microsoft의 OLE 2 컴포넌트 문서 포맷을 다루기 위한 프로젝트이다. 따라서 POI에는 엑셀 뿐만 아니라 워드문서를 다루는 API 도 제공하고 몇가지 모듈로 나누어져 있다.
이중 HSSF 가 엑셀 파일 포맷을 다루기 위한 자바구현체이다. 오래되었고 다른 것 보다 큰 이상을 가지고 출발한 프로젝트라 다양한 API를 제공한다.

apache 재단에서 진행되는 프로젝트이며 POI 패키지는 여러개의 다른 패키지(commons, log4j 같은..)를 필요로 한다. 풍부한 API를 제공하는 대신에 사용하기 번거로운 점이 있으며 많은 패키지를 필요로 한다는 부담이 있다.

jXLS은 엑셀파일 포맷의 템플릿을 이용하여 엑셀 파일을 손쉽게 생성하기 위한 패키지이다. 또한 XML 설정 파일을 통해 엑셀파일의 데이터를 Java 객체로 읽는 장치도 제공한다.

사실 jXLS은 Javarta POI 패키지를 기반으로 동작한다. 따라서 jXLS을 사용하기 위해서는 POI가 사용하는 많은 다른 패키지를 필요로 한다.

반면 jXLS 자체는 매우 작으며 복잡한 보고서 생성이나 일정한 양식의 엑셀 데이터를 규칙에 따라 읽게 한다는 뚜렷한 목적이 있어 범용성은 약간 떨어지더라도 대부분의 엑셀 관련 작업에 훌륭한 솔루션이 될 수 있다.

우리는 jXLS을 이용하여 위 문제를 풀어본다.

jXLS 맛보기

jXLS은 템플릿을 기반으로 최종 엑셀파일을 생성한다.
JSP나 Velocity 또는 Freemarker 같이 템플릿을 만들고 출력할 데이터를 템플릿을 이용하여 변환하면 템플릿 모양대로 최종결과물이 생성하는 구조다.
여기서 jXLS은 템플릿으로 엑셀파일을 그대로 쓰며 따라서 템플릿 작성이 매우 쉽다. 또한 엑셀 파일을 그대로 사용하므로 엑셀의 서식과 차트등 엑셀 파일의 대부분의 기능을 그대로 사용할 수 있다.


간단한 예제로 설명을 한다.
Java 객체
출력할 데이터를 만든다. 아래는 Customer 클래스를 예로 사용했지만 Map도 지원한다. 각 속성에 대한 getter, setter는 존재해야 한다.
public class Customer {
    private Long no;
    private String name;
    private String cellphone;
    private String email;
    public Long getNo() {
        return no;
    }
    ...
}


변환
출력한 데이터를 만든 후 엑셀템플릿과 출력할 데이터 (Java 빈)을 이용하여 변환한다.
        // 출력할 객체를 만든다.
        List<Customer> customers = new ArrayList<Customer>();
        Customer customer = new Customer();
        customer.setNo(1L);
        ...
        customers.add(customer);
        ...
       
        Map<String, Object> beans = new HashMap<String, Object>();
        beans.put("customers", customers);
        XLSTransformer transformer = new XLSTransformer();
        transformer.transformXLS("엑셀템플릿파일이름.xls", beans, "엑셀결과파일이름.xls");


엑셀템플릿
엑셀파일로 다음과 같이 작성한다. 중간에 ${..}로 들어갈 곳은 데이터가 치환되는 부분이다. 위의 경우 "엑셀템플릿파일이름.xls" 파일을 아래와 같이 생성한다.

이제 프로그램을 구동하면 자바객체를 이용하여 엑셀파일을 생성할 것이다.

태그 사용하기
좀 더 세밀한 제어를 위해 jXLS은 여러가지 태그를 제공한다. 위의 예제를 태그로 변경하면 다음과 같다.

jXLS의 자세한 사용법은 jXLS 홈페이지를 참조한다.


웹환경 실전에서

우리는 경우에 따라 고객목록을 HTML로 출력하거나 엑셀파일로 다운로드할 것이다. 즉 동일한 데이터가 경우에 따라 표현하는 방법 만 달리하는 경우에 해당한다.
이런 요구사항은 흔히 발생하고 이런 경우 MVC 모델을 응용한 아키텍처를 많이 사용한다.
MVC(Model View Controller) 모델은 많이 들어보았을 것이다. 여기서 우리는 Model과 View를 분리하는 작업을 할 것이다. 위의 경우 Model은 Customer 클래스에 해당하고 View는 엑셀파일에 해당할 것이다.



Struts2 Result 구현
위 구현을 위해 우리는 Struts2를 사용할 것이다. Struts2는 가장 많이 사용하는 프레임워크로 Struts 1에 비해 구조가 많이 개선되었다. 위의 목적을 달성하기 위해 우리는 데이터를 엑셀로 만드는 Result Type만 구현하여 Struts2 프레임워크에 붙여(플러그인)주기만 하면 된다.


Excel Result Type 만들기
Struts2에 새로운 Result Type을 만들기 위해서는 com.opensymphony.xwork2.Result를 구현하면 된다.

엑셀로 변환하기 위해 필요한 정보는 엑셀 템플릿, 엑셀에 출력할 객체들 그리고 다운로드받을 파일이름 정도일 것이다. 이것들을 이용하여 변환을 한다.

JXLSResult.java
아래는 본인이 사용하는 Struts2 엑셀 result tyup 클래스이다.
(아래 소스의 저작권은 넥스트리소프트에 있습니다. 참조하여 사용하는 것은 문제가 없으나 저작권은 반드시 명시하여 주시기 바랍니다.)

public class JXLSResult implements Result {
    /** 엑셀 템플릿 */
    private String template;
    /** 엑셀에 출력할 객체들 */
    private String beans;
    /** 파일이름을 얻어올 키값 */
    private String filenameKey = "filename";

    public void execute(ActionInvocation invocation) throws Exception {
        ActionContext actionContext = invocation.getInvocationContext();
        ServletContext context
            = (ServletContext) actionContext.get(StrutsStatics.SERVLET_CONTEXT);
        HttpServletResponse response
            = (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE);
        // 출력할 bean들을 만든다.
        Map<String, Object> beanParams = new HashMap<String, Object>();
        String[] beanNames = splitBeans();
        for (String beanName : beanNames) {
            beanParams.put(beanName, invocation.getStack().findValue(beanName));
        }
        XLSTransformer transformer = new XLSTransformer();
        InputStream is = null;
        HSSFWorkbook workbook;
        String finalTemplate = TextParseUtil.translateVariables(this.template, invocation.getStack());
        try {
            is = readTemplate(finalTemplate, context);
            workbook = transformer.transformXLS(is, beanParams);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    // 무시
                }
            }
        }
        String filename = invocation.getStack().findString(filenameKey);
        if (filename == null)
            filename = "기본파일이름";
        writeWorkbook(filename, response, workbook);
    }
    /** 엑셀에 출력할 객체이름(key)들을 분리한다. */
    private String[] splitBeans() {
        return this.beans.split(",");
    }
    /** 엑셀 결과를 출력한다. */
    private void writeWorkbook(
        String filename, HttpServletResponse response, HSSFWorkbook workbook)
        throws IOException {
        response.setHeader(
            "Content-disposition", "attachment;filename=" + encodeFileName(filename + ".xls"));
        response.setContentType(FileServerUtil.getContentTypeOfFile("xls"));
        workbook.write(response.getOutputStream());
    }
    /** 파일이름 인코딩 */
    private String encodeFileName(String filename) {
        try {
            return URLEncoder.encode(filename, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e.getMessage, e);
        }
    }
    /** 엑셀 템플릿을 읽는다. */
    private InputStream readTemplate(
        String finalTemplate, ServletContext context) throws FileNotFoundException {
        String templateFilePath = context.getRealPath(finalTemplate);
        return new FileInputStream(templateFilePath);
    }
    /**
     * @param template 엑셀 템플릿
     */
    public void setTemplate(String template) {
        this.template = template;
    }
    /**
     * @param beans 엑셀에 출력할 객체들
     */
    public void setBeans(String beans) {
        this.beans = beans;
    }
    /**
     * @param filenameKey 파일이름을 얻어올 키값
     */
    public void setFilenameKey(String filenameKey) {
        this.filenameKey = filenameKey;
    }
}



Struts2에 Result Type 추가
struts.xml 에 구현한 result typ을 추가한다. 상세한 result type 구현 및 추가방법은 struts 사이트를 참조한다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
 ...
 <package name="my-default" extends="struts-default">
  <result-types>
   <result-type name="excel" class="com.nextree.fw.commonweb.struts.result.JXLSResult" />
  </result-types>
 ...
 </package>
</struts>



Controller 작성
Struts2의 Action을 controller로 사용하겠다. 아래와 같이 Action을 만든다. 참고로 struts2는 POJO를 그대로 Action으로 사용할 수 있다. 자세한 Struts2 Action 작성방법은 Struts2 site를 참조한다.
public class CustomerListController {
    /** 반환할 값 */
    private List<Customer> customers;

    public String execute() {
        ....
        this.customers = ....;   // 여기서 출력해야 할 데이터를 조회한다.
        return Action.SUCCESS;
    }
    /* 출력할 값의 getter 메소드를 반드시 제공한다. */
    public List<Customer> getCustomers() {
        return new JSONResult(this.zipCodeList);
    }
    /* 위 Excel Result type의 경우 file이름을 controller에서 가져오게 되어 있다. */
    public String getFilename() {
        return "고객목록";
    }
}


Action 정의
Struts2 의 struts.xml에 action을 정의한다. 우리는 excel로 다운로드하기에 앞에 설치한 excel result type을 사용한다.
 
...
<package name="mypackage" namespace="/mypackage" extends="my-default">
  <action name="customers" class="test.CustomerListController" method="execute">
   <result type="excel">
    <param name="template">/customer/CustomerList.xls</param>
    <param name="beans">customers</param>
    <param name="filenameKey">filename</param>
   </result>
  </action>
...

이제 http://hostname:port/context/mypackage/customers.do 로 접속하면 Excel 파일을 다운로드 할 것이다.

결론
위의 방법을 사용하면 그냥 JSP 작성하듯이 엑셀양식을 작성하여 엑셀을 다운로드하는 기능을 구현하기가 매우 쉽다.
엑셀을 그대로 사용하기 때문에 엑셀에 화려한 서식뿐만 아니라 차트나 수식등을 넣을 수도 있어 고품질의 엑셀파일을 만들 수 있다.
 
- 출처 : http://greatkim91.tistory.com/tag/Excel

Posted by 복태아빠
,


 public void sendMail(MailEty mailEty){
  
  try{
   
//   create some properties and get the default Session
   Properties props = new Properties();
   props.put("mail.smtp.host", mailEty.getSmtphost());

   Session sess = Session.getDefaultInstance(props, null);
   
//   create a message
   Message msg = new MimeMessage(sess);
   
   msg.setFrom(new InternetAddress(mailEty.getFrom()));
   InternetAddress[] address = {new InternetAddress(mailEty.getTo())};
   msg.setRecipients(Message.RecipientType.TO, address);
   msg.setSubject(mailEty.getMailSubject());
   msg.setSentDate(new Date());
   
   
    //
            // This HTML mail have to 2 part, the BODY and the embedded image
            //
            MimeMultipart multipart = new MimeMultipart("related");

            // first part  (the html)
            BodyPart messageBodyPart = new MimeBodyPart();
              
   String htmlText = "<HTML>" +
    "<HEAD><TITLE></TITLE></HEAD>" +
    "<BODY>" +
     "<table><tr><td>"+
     "<br>"+
     "Dear "+mailEty.getName()+",<br>"+
     " <br>"+
     " </td>"+
     "</tr>"+
     "<tr>"+
     " <td width=100%><img src=\"cid:starhublogoimg\"></img></td>"+
     "</tr>"+
     "</table>"+
     "</BODY>" +
    "</HTML>";
   
    messageBodyPart.setContent(htmlText, "text/html");
   
    //add it
          multipart.addBodyPart(messageBodyPart);

         
          // second part (the image)
             messageBodyPart = new MimeBodyPart();
            
             String filePath = mailEty.getPath()+"/images/starhub_mail_logo.gif";
            
             DataSource fds = new FileDataSource(filePath);
             messageBodyPart.setDataHandler(new DataHandler(fds));
             messageBodyPart.setHeader("Content-ID","<starhublogoimg>");

             // add it
             multipart.addBodyPart(messageBodyPart);
   
   //msg.setContent(htmlText,"text/html; charset=euc-kr"); // HTML 형식
         msg.setContent(multipart); // HTML 형식
//   msg.setText(msgText); // TEXT 형식
   Transport.send(msg);
   logger.info(mailEty.getTo()+" mail send!");
            
   
  }catch(MessagingException mex){
   logger.error(mex.getMessage()+"<br>");
   logger.error(mailEty.getSmtphost()+" connected error! \n mail send fail!");
  }
  
  
 }

Posted by 복태아빠
,

1 Apache 2.0

http://httpd.apache.org 에서 : httpd-2.0.63.tar.gz 받아서 푼다.

 

$ tar xvfz : httpd-2.0.63.tar.gz

 

INSTALL 파일을 참고하여 apache를 설치하고 실행한다.

 

$ ./configure --prefix=PREFIX

$ make

$ make install

$ PREFIX/bin/apachectl start

여기서 PREFIX apache가 설치될 디렉토리이다. --prefix=PREFIX를 생략하면 /usr/local/apache2에 설치된다.

 

이하의 설명에서 PREFIX는 아파치가 설치된 디렉토리를 뜻한다.


브라우저를 열고 http://<설치된 IP>/ 입력하였을 때, apache web server가 설치되었다는 메시지가 나오면 성공.

 

아파치 서버를 끝내려면

 

$ PREFIX/bin/apachectl stop

 

2 mod_jk2.so

 

http://jakarta.apache.org 에서 jakarta-tomcat-connectors-jk2-2.0.4-src.tar.gz 를 받아서 푼다.

 

jk/native2/INSTALL.txt를 참고하여 mod_jk2.so를 만든다.

$ ./configure --with-apxs2=PREFIX/bin/apxs

$ make

$ cd ../build/jk2/apache2

$ PREFIX/bin/apxs -n jk2 -i mod_jk2.so

 

[edit]

3 httpd.conf

위에서 만든 mod_jk2.so PREFIX/modules/에 복사한 다음, PREFIX/conf/httpd.conf 에서

#LoadModule foo_module modules/mod_foo.so

와 같은 형식으로 되어 있는 곳을 찾아 그 아래에

LoadModule jk2_module modules/mod_jk2.so

를 추가한다.

 

DocumentRoot "localhost:80"

4 workers2.properties

PREFIX/conf/ workers2.properties를 아래의 내용으로 만들어 저장한다. ( jk/native2/INSTALL.txt 참고 )

[channel.socket:<tomcat_ip>:8009]

port=8009

host=<tomcat_ip>

 

[ajp13: <tomcat_ip>:8009]

channel=channel.socket: <tomcat_ip>:8009

 

[uri:user/*]

worker=ajp13: <tomcat_ip>:8009

 

[uri:/mgt/*]

worker=ajp13: <tomcat_ip>:8009

Posted by 복태아빠
,

성능개선

open study 2009. 5. 7. 12:49
Posted by 복태아빠
,

1. Windows : catalina.bat

set CATALINA_OPTS=-Xms512m -Xmx512m

2. ksh/bash : catalina.sh
export CATALINA_OPTS="-Xms512m -Xmx512m"

3. tcsh/csh : catalina.sh
setenv CATALINA_OPTS="-Xms512m -Xmx512m"


Tomcat을 사용하다가 java application 실행 시
java.lang.OutOfMemoryError: Java heap space 에러 생겼을 때 해결방법.


생기는 경우의 수가 많이 있을 것 같지만, 이번에 아래의 스크립트로 해겼되었으므로 적어놔야 겠다.

----

이번 경우는 Confluence Wiki 설치 중, 어느 부분에서 페이지가 넘어가지 못하고 먹통이 되었다가 결국 아래의 에러가 발생했다. 

java.lang.OutOfMemoryError: Java heap space

Confluence Wiki와 같은 Java 어플리케이션은 JVM에서 구동된다. 따라서 시작 시 JVM에서 일정량의 메모리를 할당하여 어플리케이션에서 사용된다. 기본적으로 Java 가상머신은 서버에 얼마나 많은 물리적인 메모리가 설치되있더라도 오직 64MB의 메모리만을 할당된다고 한다.
따라서 Confluence Wiki같은 중간규모 이상의 어플리케이션은 늘리필요가 있다고 한다.

늘리는 방법을 찾느냐 조금 시간이 걸렸다.
Linux, Java, Tomcat에 능통한 사람이면 금방 찾을 수 있지만, 전혀 찾을 수 없었다.
그래서 여기저기 해결방법을 짜집기 하다가 힌트를 얻었고 스크립트를 작성하였다.

** tomcat 5.5 기준임 **

/usr/local/tomcat/bin 에 tomcat.sh를 하나 만들자. (/usr/local/ 는 사람마다 다를 수 있슴)

> cd  /usr/local/tomcat/bin
> vi tomcat5.sh

tomcat5.sh 파일내용

#!/bin/sh
# file:tomcat.sh
CLASSPATH=/usr/java/jdk1.5.0_15/lib
JAVA_HOME=/usr/java/jdk1.5.0_15
CATALINA_OPTS=-Djava.awt.headless=true
JAVA_OPTS=-Xms512m -Xmx512m

export CLASSPATH
export JAVA_HOME
export CATALINA_OPTS
export JAVA_OPTS

case "$1" in
start)
echo "Starting tomcat5..."
/usr/local/tomcat/bin/startup.sh
;;
stop)
echo "Stopping tomcat5..."
/usr/local/tomcat/bin/shutdown.sh
;;
*)
echo "Usage tomcat.sh start/stop"
exit 1;;
esac


tomcat 시작

> tomcat.sh stop
> tomcat.sh start 



flex 와 같은 어플리케이션을 로드 하는 경우에는 permSize 를 설정하는 것이 좋다.
Xms-> 최소 메모리값 , Xmx-> 최대 메모리값 , permSize-> Permanent generation  영역은 객체나, 함수가 차지하는 영역 이고 Xmx 로 설정하는 heap 메모리영역에 포함되지 않는다
export JAVA_OPTS="-Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=128m"
 

Posted by 복태아빠
,

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
<title> new document </title>
</head>
<style type="text/css">
* {margin: 0px; padding: 0px;}
ul, li, dl, dt, dd {list-style: none;}
ul {width: 500px; border-bottom: 2px #000000 solid; overflow: auto; height: 100%;}
ul li { float: left;border: 1px solid #f18;}
ul li img {vertical-align: top;border: 0;}
</style>
<body>
<ul>
 <li><img src="test.gif"  /></li>
 <li><img src="test.gif" /></li>
</ul>
</body>
</html>

* {margin: 0px; padding: 0px;} 가 중요

Posted by 복태아빠
,
Posted by 복태아빠
,

private function sound_id3_read(file:File):void{

var file_Stream:FileStream = new FileStream();
file_Stream.open(file, FileMode.UPDATE);

file_Stream.position = file_Stream.bytesAvailable - 128; // MP3 파일의 비트레이트 값을 빼준다..

textArea.text = "";
var cset:String = "EUC-KR";
if (file_Stream.readMultiByte(3, cset).match(/tag/i)){
textArea.text += '\n Title: '+ file_Stream.readMultiByte(30, cset);
textArea.text += '\n Artist: '+ file_Stream.readMultiByte(30, cset);
textArea.text += '\n Album: '+ file_Stream.readMultiByte(30, cset);
textArea.text += '\n Year: '+ file_Stream.readMultiByte(4, cset);
textArea.text += '\n Comment: '+ file_Stream.readMultiByte(30, cset);
textArea.text += '\n GenreCode: '+ file_Stream.readByte().toString(10);
textArea.text += "\n------------------------------\n";
}   
}

 


출처 - http://cafe.naver.com/flexcomponent/10087

Posted by 복태아빠
,

ArrayCollection 데이터를 xml data로 생성하고 이를 Tree 컴퍼넌트에 물려준다..

-------------------------------------------------------------------------------------------------+

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 applicationComplete="init ()">
 
 <mx:Script>
  <![CDATA[
   import mx.utils.XMLUtil;
   import mx.collections.ArrayCollection;
   var arrData :ArrayCollection = new ArrayCollection([
    {categorycd:"1",parentcd:"0",nm:"그룹홍보",level:"1"},
    {categorycd:"3",parentcd:"0",nm:"SMS발송(old)",level:"1"},
    {categorycd:"5",parentcd:"0",nm:"기타1",level:"1"},
    {categorycd:"2",parentcd:"1",nm:"1234",level:"2"},
    {categorycd:"8",parentcd:"1",nm:"12341",level:"2"},
    {categorycd:"4",parentcd:"3",nm:"그룹관련12",level:"2"},
   ]);
  
   var resultXML :XML = <root categorycd="0" nm="루트" />;
  
   private function init () :void
   {
    convertToXML ( arrData );
   }
  
   private function convertToXML ( arr :ArrayCollection ) :void
   {
    var len :int = arr.length;
    for ( var i:int=0; i<len; i++ )
    {
     insertItem (arr.getItemAt(i).parentcd, toXML(arr.getItemAt(i)), new XMLList(resultXML));
    }
    trace ( resultXML.toXMLString() );
   
    treeMenu.dataProvider = resultXML;
   }
  
   private function insertItem(_parentId : String, _child : XML, _xml :XMLList) : Boolean
   {
      var parentElement : XMLList = findXMLList(_parentId, _xml);
      if (parentElement == null)
         return false;
  
      parentElement.* += _child;
      return true;
   }
  
   private function findXMLList (_id : String, _xml : XMLList) : XMLList
         {
            if (_xml.@categorycd == _id)
               return _xml;
       
            var children : XMLList = _xml.elements ();
            var result : XMLList = null;
          
            for each (var x : XML in children)
            {
               result = arguments.callee (_id, new XMLList(x));
               if (result != null)
                  return result;
            }
       
            return null;
         }
  
   private function toXML ( obj :Object, tagName:String="node" ) :XML
   {
    var return_xml :XML = new XML("<"+tagName+"/>");
    for ( var key:String in obj )
    {
     return_xml.@[key] = obj[key];
    }
    return return_xml;
   }
  
  
  ]]>
 </mx:Script>
 
 <mx:Tree id="treeMenu" width="300" height="100%" labelField="@nm"
  showRoot="false">
 
 </mx:Tree>
 
</mx:Application>

-------------------------------------------------------------------------------------------------+

ArrayCollection 에 들어있는 데이터를 뽑아다가 xml 로 만들어주고
이를 treeMenu.dataProvider = resultXML 로 데이터를 물려주는거다..
하나하나 보면 어려운 부분이 없다..
그냥 재미있길래 ㅎ

출처 - http://cafe.naver.com/flexcomponent/1429
Posted by 복태아빠
,