2010/07/07 17:37 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

Timer와 TimerTask 클래스를 이용하여 주기적으로 실행되는 프로그램을 개발할 수 있다.
주기적으로 프로세스를 체크하는 프로그램을 만들 경우에 사용된다.
사용법은 무지 간단하다.

아래 소스는 2초에 한번씩 TimeRun을 실행하는 소스이다.

TimerTest.java

import java.util.Calendar;
import java.util.Timer;
public class TimerTest {
 public static void main(String[] args){
  Timer timer = new Timer();
  Calendar date = Calendar.getInstance();
  timer.schedule(new TimeRun(), date.getTime(), 2 * 1000);
 } 
}



주기적으로 실행하려는 작업을 TimeRun에 코딩하면된다.(TimerTask를 상속)

TimeRun.java

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask;

public class TimeRun extends TimerTask {
 public void run(){
  Calendar cal = Calendar.getInstance();
  SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");       
  String timestamp = formatter.format(cal.getTime());

  System.out.println("["+timestamp+"] TimeRun Test");
 }
}



결과값을 보면은 2초에 한번씩 실행됨을 알 수 있다.
[2010-07-07 17:29:55,593] TimeRun Test
[2010-07-07 17:29:57,593] TimeRun Test
[2010-07-07 17:29:59,593] TimeRun Test
[2010-07-07 17:30:01,593] TimeRun Test
[2010-07-07 17:30:03,593] TimeRun Test
[2010-07-07 17:30:05,593] TimeRun Test
[2010-07-07 17:30:07,593] TimeRun Test
[2010-07-07 17:30:09,593] TimeRun Test
[2010-07-07 17:30:11,593] TimeRun Test
[2010-07-07 17:30:13,593] TimeRun Test
[2010-07-07 17:30:15,593] TimeRun Test




저작자 표시

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

[java] Timer  (0) 2010/07/07
[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
posted by 조금까칠한남자
2010/03/22 11:25 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

오호~ 이쁘네요 ㅎ

sip programming을 위해 어쩔수 없이 6.8로 업그레이드!!

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

[java] Timer  (0) 2010/07/07
[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
posted by 조금까칠한남자
2010/03/15 10:19 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

OCX는 뭐다냐~ ㅎㅎ

 

Terms :

OCX[오씨엑스]란 하나의 객체 연결 및 포함(OLE) 맞춤형 컨트롤로, 마이크로소프트 윈도우에서 수행되는 응용프로 그램에서 사용되기 위해 만들어질 수 있는 특수목적 프로그램이다. OCX는 윈도우 크기 조정이나 스크롤바의 움직임 등을 처리하는 기능을 제공한다. 보통 윈도우95 이상의 운영체계를 사용하는 경우, Windows 디렉토리에 OCX라는 확장자를 가진 파일들이 많이 있다.

OLE는 문자, 그림, 소리, 동영상 등 여러가지 종류의 정보 양식을 가지고 있는 복합 문서를 지원하기 위해 설계되었다. 윈도우 데스크탑, 즉 바탕화면은 복합 문서의 대표적인 예이며, 마이크로소프트는 이를 구축하기 위해 OLE를 사용하였다. OLE와 COM(OLE를 계승하는 더욱 일반적인 개념)은 임의의 언어로 작성되어 시스템 내의 어떠한 애플리케이션에서라도 동적으로 사용될 수 있는 플러그 앤 플레이 프로그램 개발을 지원한다. 이러한 프로그램이 컴 포넌트이고, 이들이 수행되는 애플리케이션을 컨테이너라 한다. 이런 컴포넌트 기반의 애플리케이션 개발을 통해 개발 기간 단축과 프로그램 성능과 품질을 향상시킬 수 있다. 파워빌더, MS Access 같은 윈도우95와 NT 애플리케이션 개발 프로그램은 OCX의 장점을 취하고 있다.

마이크로소프트는 이제 OCX를 ActiveX control이라 부른다. OCX나 ActiveX control은 실제로 DLL 형태로 구현된다 (DLL은 수많은 애플리케이션에서 사용될 서브 프로그램으로 생각할 수 있다. 각각의 애플리케이션 프로그램은 DLL 또는 OCX/ActiveX control 객체에 대해 컨테이너가 된다). 비주얼베이직과 C++은 OCX와 ActiveX control을 만들기 위해 많이 사용된다.

내용 출처 : http://www.terms.co.kr/OCX.htm


OCX란 컴포넌트 라이브러리 입니다. ActiveX Control의 형태이지요. 이것이 발달한 형태가 COM이라는 것이 있습니다. 이것은 DLL또는 EXE형태로 생성이 됩니다. VB나 VC++에서 컴포넌트추가하기 작업을 보면 이런한 형태들의 라이 브러리들이 등록된 것을 볼수있습니다. 그러나 일반 DLL들은 여기에서 볼수가 없지요. 큰차이점은 여기에 있다고 봅니다. OCX나 COM은 레이스트리에 등록되어 이것을 필요로 하는 프로젝트에서 그냥 추가해서 사용할수가 있습니다. Local뿐만아니라 원격으로 사용도 가능하지요. (이것이 OCX도 되는지모름..)
그러나 일반 DLL은 자신에 시스템에 존재해야만 하고 필요할때는 프로그램내에서 위치지정도 해줘야 합니다. 그리고 Function구조로 되어 있어서 특별난 구현 없이는 DLL에서 선언된 함수만을 단순히 로딩해서 사용하는 형태이지요. OCX는 DLL처럼 단순 함수구조도 될수 있지만 강력한 컨트롤을 생성만들어 낼수도 있습니다. 이렇게 만들어낸 컴포넌트는 일반 프로그램뿐만아니라 웹에서도 같은 방식으로 불러다 사용할수 있는 장점이 있습니다. 이 밖에도 많은 호환성을 자랑합니다. OCX를 좀더 발전시킨 COM은 현재 윈도우의 지지 기반이기도 합니다.
익스플러러의 실행화일을 확인해 보시면 그용량이 상당히 작다는 것을 아실수 있을겁니다. 이유는 내부의 모듈 컴포넌트들이 COM형태로 구현되어 있고 이것을 불러다 사용하는 구조이기 때문에 익스플러러 자체는 껍데기에 불과하다고 봅니다.

내용출처 :  http://kr.ks.yahoo.com/service/ques_reply/ques_view.html?dnum=JAIAB&qnum=126822&start=150



http://danadler.com/jacob/

검색을 하다보니 jacob에 대한 언급이 많이 있더군요.

 

What is JACOB?

JACOB is a JAVA-COM Bridge that allows you to call COM Automation components from Java. It uses JNI to make native calls into the COM and Win32 libraries. The JACOB project started in 1999 and is being actively used by thousands of developers worldwide. As an open-source project, it has benefitted from the combined experience of these users, many of whom have made modifications to the code and submitted them back for inclusion in the project.

The JACOB project has moved to Sourceforge.net. Verion 1.14.3 is now available at Sourceforge.

 

 

private static ActiveXComponent myComponent;
private static Dispatch myObject;

MyComponent = new ActiveXComponent("clsid:XXXXXXXX");
MyObject = MyComponent.getObject();

//For setting and requesting properties
Dispatch.put( myObject, "Property", new Variant( new Integer (1024)));
//Now I want to check the set parameter
Variant vResultmine = Dispatch.call( myObject, "Property");
System.out.println("Property "+vResultmine.toString());

//This line makes "IOvar" to be a read-write String variable (the OCX will be able to put data on it)
Variant IOvar = new Variant(new String(""), true); //false will is used by default, in this case variables can not be written

//Next we invoke the method. In this case the method needs 2 String parameters and puts the result on a third variable (IOvariable)
Variant vResult = Dispatch.call(myObject, "Method",
new Variant((String)"first_parameter"),
new Variant(("second_parameter")),
IOvar);

//Now I print the obtained value
TheIOvar=IOvar.toString();
System.out.println("TheIOvar "+TheIOvar);



참고사이트 :

http://forums.sun.com/thread.jspa?threadID=5331361

http://www.nevaobject.com/_docs/_coroutine/coroutine.htm



또 다른 소스..


System.runFinalizersOnExit(true);

ActiveXComponent xl = new ActiveXComponent("Excel.Application");
System.out.println("version="+xl.getProperty("Version"));
Object xlo = xl.getObject();
System.out.println("version="+Dispatch.get(xlo, "Version"));

Dispatch.put(xlo, "Visible", new Variant(true));

Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
Dispatch workbook = Dispatch.call(workbooks, "Open", "test.xls").toDispatch();
Dispatch sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();

Dispatch cell = Dispatch.invoke(sheet,"Range",Dispatch.Get,new Object[] {"A1:D1000"},
new int[1]).toDispatch();
SafeArray sa = Dispatch.get(cell,"Value").toSafeArray();
System.out.println("sa: dim="+sa.getNumDim());
System.out.println("sa: start row="+sa.getLBound(1));
System.out.println("sa: start col="+sa.getLBound(2));
System.out.println("sa: end row="+sa.getUBound(1));
System.out.println("sa: end col="+sa.getUBound(2));
for(int i=1; i < 1000; i++)
{
    for (int j = 1 ; j < 4 ; j++ ) {
        System.out.println(i+" "+j+" " +sa.getString(i,j));
    }
}
Dispatch a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
        new Object[] {"A1"},
        new int[1]).toDispatch();
Dispatch.put(a1, "Value", "123.456");
Dispatch a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
        new Object[] {"A2"},
        new int[1]).toDispatch();
Dispatch.put(a2, "Formula", "=A1*2");
Dispatch.call(workbook, "Close");
xl.invoke("Quit", new Variant[] {});
xl.release();


내용출처 : http://blog.naver.com/iamteri?Redirect=Log&logNo=140018821191


 

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class Word{
    String strDir = "c:jacob_1.9";
    String strInputDoc = strDir + "file_in.doc";
    String strOutputDoc = strDir + "file_out.doc";
    String strOldText ="[label:import:1]";
    String strNewText ="I am some horribly long sentence, so long that [insert anything]";
   
    boolean isVisible = true;
    boolean isSaveOnExit = true;
   
    public Word(){
        ActiveXComponent oWord = new ActiveXComponent("Word.Application");
        oWord.setProperty("Visible", new Variant(isVisible));
        Dispatch oDocuments = oWord.getProperty("Documnets").toDispatch();
        Dispatch oDocument = Dispatch.call(oDocuments, "Open", strInputDoc).toDispatch();
        Dispatch oSelection = oWord.getProperty("Selection").toDispatch();
       
        Dispatch oFind = oWord.call(oSelection, "Find").toDispatch();
        Dispatch.put(oFind, "Text", strOldText);
        Dispatch.call(oFind, "Execute");
        Dispatch.put(oSelection, "Text", strNewText);
        Dispatch.call(oSelection, "MoveDown");
        Dispatch.put(oSelection, "Text", "nSo we got the next line including BR.n");
       
        Dispatch oFont = Dispatch.get(oSelection, "Font").toDispatch();
        Dispatch.put(oFont, "Bold", "1");
        Dispatch.put(oFont,"Italic", "1");
        Dispatch.put(oFont, "Underline", "0");
       
        Dispatch oAlign = Dispatch.get(oSelection, "ParagraphFormat").toDispatch();
        Dispatch.put(oAlign, "Alignment", "3");
       
        Dispatch oWordBasic = (Dispatch) Dispatch.call(oWord, "WordBasic").getDispatch();
        Dispatch.call(oWordBasic, "FileSaveAs", strOutputDoc);
        Dispatch.call(oDocument, "Close", new Variant(isSaveOnExit));
        oWord.invoke("Quit", new Variant[0]);
    }
   
    public static void main(String[] args){
        Word word = new Word();
    }
}


내용 출처 : http://blog.naver.com/seigi_h?Redirect=Log&logNo=140035596122


이 정도면 응용해서 할 수 있을듯합니다. :")

그래도 일단 해봐야죠??

 

 

기타 소스 :  이건 뭔지 잘..


import com.jniwrapper.win32.com.types.CLSID;
import com.jniwrapper.win32.automation.OleContainer;
import com.jniwrapper.win32.automation.Automation;
import com.jniwrapper.win32.automation.types.Variant;
import com.jniwrapper.win32.ole.types.OleVerbs;
 
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
 
public class Test extends JFrame
{
    private static final long serialVersionUID = 1L;
 
    public static final CLSID CLASS_ID = CLSID.create("{135CB56E-FDB4-43B6-A386-CD0C15295C07}");
    Container contentPane = getContentPane();
    final OleContainer oleContainer = new OleContainer();
 
    public Test()
    {
        super("OcxPanel");
    }
 
    public void init() throws InvocationTargetException, InterruptedException
    {
 
        JPanel activeXPanel = new JPanel();
        oleContainer.createObject(CLASS_ID);
        oleContainer.setSize(600, 400);
        // Vadim.Ridosh Here I wrapped doOpen call to invoke it in the same OleMessageLoop with oleContainer
        oleContainer.getOleMessageLoop().doInvokeAndWait(new Runnable()
        {
            public void run()
            {
                doOpen();
            }
        });
        activeXPanel.add(oleContainer);
        contentPane.add(activeXPanel);
 
        addWindowListener(new WindowAdapter()
        {
            // @Override
            public void windowOpened(WindowEvent e)
            {
                oleContainer.doVerb(OleVerbs.INPLACEACTIVATE);
            }
        });
    }
 
    private void doOpen()
    {
        String m_strAppID = "KJ01";
        String m_strSiteNO = "999999";
        String m_strOperID = "3333";
        String m_strDateTime = "20090612";
        String m_strIP = "22.5.232.93";
        String m_strPort = "8026";
        String Pri = "7777";
        String ScanAttri = "0";
        String DocID = "1158447027777KJ01999999090713691";
 
        Variant[] variants = new Variant[]{
                new Variant(m_strAppID),
                new Variant(m_strSiteNO),
                new Variant(m_strOperID),
                new Variant(m_strDateTime),
                new Variant(m_strIP),
                new Variant(m_strPort),
                new Variant(Pri),
                new Variant(ScanAttri),
                new Variant(DocID)
        };
        try
        {
            // Vadim.Ridosh: coInitialize is not required here. Now doOpen executed in OleMessageLoop,
            // OleMessageLoop initialize OLE automatically
            // ComFunctions.coInitialize();
 
            // Vadim.Ridosh: Object you want to call was already created in oleContainer.createObject(CLASS_ID)
            // So, we don't need to create it second time. Let's use already created object instead:
            // IUnknownImpl dispatchable = new IUnknownImpl(CLASS_ID, ClsCtx.INPROC_SERVER);   //get an error
            Automation automation = new Automation(oleContainer.getOleObject());
            automation.invoke("InitScanWnd", variants);
 
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
 
    public static void main(String[] args) throws InvocationTargetException, InterruptedException
    {
        Test sample = new Test();
        sample.init();
        sample.setVisible(true);
    }
}
 



 

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

[java] Timer  (0) 2010/07/07
[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
posted by 조금까칠한남자
TAG jacob, Java, JNI, ocx
2010/03/04 12:36 CodeIN/HTML5
크리에이티브 커먼즈 라이선스
Creative Commons License

또 본의아니게 html5를 봐야할 일이 생겼습니다 ㅠㅠ

그래서 이래 저래 검색을 하는데... 흠...

당췌 뭘 봐야할지 모르겠네요 ㅎ

검색을 해도 그닥 많은 내용들이 나오지 않습니다. 혹시 html5를 공부할 만한 괜찮은 사이트 알고 계시면 링크 부탁드리겠습니다.

일단은 간단하게 audio와 video element를 사용하는 방법에 대하여 설명하고 있는 사이트 링크 걸어둡니다.

 

Firefox 3.5 introduced support for the HTML 5 audio  and video  elements, offering the ability to easily embed media into HTML documents.  Currently, Ogg Theora, Ogg Vorbis, and WAV format media is supported.

https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox

 

<video src="http://v2v.cc/~j/theora_testsuite/320x240.ogg" controls>  

  Your browser does not support the <code>video</code> element.  

</video> 

 

간략한 사용방법이 나와 있는데 ㅎ

에잇 저는 안되네요 ㅎㅎ

 

'CodeIN > HTML5' 카테고리의 다른 글

[html5] Using audio and video in Firefox  (2) 2010/03/04
posted by 조금까칠한남자
2010/02/01 23:53 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License
이번에는 업무에 필요한 간단한 유틸을 만들어봤습니다.
유틸의 기능은 제가 음성 파일로 만들고 싶은 내용을 입력하면 음성 파일로 만들어 주는 것 입니다.
간단히 설명하면 "안녕하세요. 김태정입니다."라고 text를 입력하고 버튼을 누르면 어떤 wav파일이 생성되는데, 이 wav 파일을 play하면은 "안녕하세요. 김태정입니다."라는 소리가 나옵니다.
(참고, 반드시 TTS 서버(Text to Speech 텍스트 음성 변환) 가 있어야 합니다.)


아래 이미지는 실행시 모습입니다.
Version 1기능 - "안녕하세요. 김태정입니다." 를 입력하고 Create.
Version 2기능 - "Open Excel File" 버튼을 누르고 Excel파일을 선택. 그리고 Create 버튼 클릭.


오늘 release된 버전은 second버전 입니다. release라고 하니 또 거창하네요 ㅎㅎ
저한테만 release된 것입니다. ㅎㅎ

version 1의 기능은 음성파일로 만들어 주고 싶은 text를 입력하면 이것을 wav 파일로 만들어 주는 것입니다. "Create" 버튼을 누르면 TTS서버에게 요청하면 wav 파일이 생성되는 것입니다.
결론 적으로 TTS 서버가 꼭 있어야 한다는 ^__________^

version 2의 기능은 version 1의 기능을 보완하였습니다.
수 십 또는 수 백개의 text들을 일일이 치면서 만들기 번거로우므로 Excel 파일에 wav 파일명과 text를 아래 이미지와 같이 써 넣으면 이 Excel 파일을 읽어서 wav파일들을 생성해주는 기능을 추가하였습니다.



프로그램을 실행하면 c0001.wav 파일이 생성되고
이 c0001.wav파일을 play하면은 "안녕하세요. 이것은 테스트 입니다. 123" 하고 소리가 나오게 되는거져. 이런식으로 c0018.wav까지 생성합니다.

아래는 실행시 실제적으로 생성된 파일들입니다.



그러기 위해서는 Java에서 Excel 파일을 읽는 기능을 사용해야합니다.
(XLS파일을 읽는 법과 XLSX파일을 읽는 법이 다릅니다. )
또 공부를 ㅎㅎ

참고 사이트 : 검색 사이트에서 "POI 를 이용한 Excel 문서 처리 맛보기 Quick Guide" 로 검색

아래 링크를 클릭해서 최신 버전의 Apache POI를 다운 받으세요. 현재 lastest stable release version은 3.6입니다. 
http://poi.apache.org/download.html

필요한 jar파일
- poi-3.6-20091214.jar
- ooxml-lib 하위 디렉토리에 있는 jar파일들

아래는 소스는 확장자가 .xls 인 파일을 읽는 소스입니다.
MS.2007이상 버전의 Excel파일(.xlsx)은 읽지 못합니다.
private void readExcelXLS(String filePath){
        FileInputStream fis = null;
        POIFSFileSystem fs = null;
        HSSFWorkbook wb = null;       
        int sheets = 0;
        try {
            // Excel 파일 읽어 오기
            fis = new FileInputStream(filePath);
            fs = new POIFSFileSystem(fis);
            wb = new HSSFWorkbook(fs);
            // 워크북 오브젝트의 취득
            sheets = wb.getNumberOfSheets();
           
            for(int sheetIndex=0;sheetIndex < sheets;sheetIndex++){
                //워크북에서 sheetIndex번째 sheet를 가지고 옵니다.
                HSSFSheet sheet = wb.getSheetAt(sheetIendx);
                int firstRow = sheet.getFirstRowNum();
                int lastRow = sheet.getLastRowNum();
               
                // 행 별로 데이터를 취득
                for(int rowIndex=firstRow ; rowIndex <= lastRow ; rowIndex++){
                    //sheet로부터 row를 하나씩 얻어옴
                    Row row = sheet.getRow(rowIndex);

                    //행에 데이터가 없는 경우
                    if(row==null){
                        continue;
                    }
                   
                    //저는 각 row에서 첫번째(0)와 두번째(1) cell 값만 필요해서 아래와 같이
                    //사용하였습니다. 각자 맞게 응용하여 사용하세요.
                    Cell waveFile = row.getCell(0);
                    Cell contents = row.getCell(1);
                    
                    //각 cell로부터 string 값을 가지고 온다.
                    String wave = waveFile.getRichStringCellValue().getString();;
                    String data = contents.getRichStringCellValue().getString();

                    int ret = 0;
                    ret = tt.request(data, null, wave, null);
                    //저는 Swing을 이용해서 결과 값을 jTextAreaResult에 append.
                    if(ret != 1){
                        jTextAreaResult.append("[TTS메세지] "+tt.getResultMsg()+"\n");
                    }else{
                       //jTextAreaResult.append("[파일경로] "+tt.getWavePath()+"\n");
                       jTextAreaResult.append("["+wave +"]["+data+"]\n");
                    }
                    Thread.sleep(1000);
                }
            }           
         } catch (InterruptedException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                fis.close();
            } catch (IOException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
            return;
    }


이번에는 MS.2007이상 버전의 Excel파일(.xlsx)파일을 읽는 소스입니다.
아래 소스는 설명하지 않겠습니다. xls를 읽는 소스와 비슷합니다.
private void readExcelXLSX(String filePath){
        File file = new File(filePath);      
        FileInputStream fis = null;       
        XSSFWorkbook xb = null;
        XSSFExcelExtractor extractor = null;       
        int sheets = 0;
        try {
           
            // Excel 파일 읽어 오기
            fis = new FileInputStream(file);           
            xb = new XSSFWorkbook(filePath);           
           
            extractor = new XSSFExcelExtractor(xb);
            extractor.setFormulasNotResults(true);
            extractor.setIncludeSheetNames(false);

            //System.out.println(" - : " + extractor.getText());

            // Getting cell contents
                for( int i=0 ; i<xb.getNumberOfSheets(); i++) {
                    XSSFSheet x = xb.getSheetAt(i);
                    int firstRow = x.getFirstRowNum();
                    int lastRow = x.getLastRowNum();
                    for(int r=firstRow ; r <= lastRow; r++){
                        Row row = x.getRow(r);
                        Cell waveFile = row.getCell(0);
                        Cell contents = row.getCell(1);
                        String wave = waveFile.getRichStringCellValue().getString();
                        String data = contents.getRichStringCellValue().getString();
                        int ret = 0;
                        ret = tt.request(data, null, wave, null);
                        if(ret != 1){
                            jTextAreaResult.append("[TTS메세지] "+tt.getResultMsg()+"\n");
                        }else{
                           //jTextAreaResult.append("[파일경로] "+tt.getWavePath()+"\n");
                           jTextAreaResult.append("["+wave +"]["+data+"]\n");
                        }
                        Thread.sleep(1000);    
                    }
                }
             } catch (InterruptedException ex) {
            Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileNotFoundException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
            } finally {
                try {
                    fis.close();                   
                } catch (IOException ex) {
                    Logger.getLogger(HKTTSView.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            return;
        }



개발하면서 아쉬웠던 점은 시간이 없어서 필요한 기능만 구현했다는 점, 그리하여 딱 위 형태의 엑셀만 읽어서 wav파일을 생성할 수 있다는 것입니다.
나중에는 column값 2개를 받아서 설정된 column만 읽어서 wav파일을 생성하게끔 하고 싶군요 :")



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

[netbeans] NetBeans IDE 6.8  (0) 2010/03/22
[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
posted by 조금까칠한남자
TAG Excel, Java, xls, xlsx
2009/12/19 21:52 CodeIN/Web
크리에이티브 커먼즈 라이선스
Creative Commons License

 

예전에 xx생명 프로젝트를 진행하면서 XChart를 사용했던 적이 있는데, 상용 chart임에도 visual이 제가 보기에는 별로 였습니다. 그래서 상용버전을 제외하고 다른 chart를 검색했는데, 정말 맘에 드는 Chart가 있더군요. GPL라이센스로 배포.

 

OpenFlashChart에 대한 설명은 아래 링크에 자세히 되어 있으므로, 링크로 대체하겠습니다.

 

OpenFlashChart에 대한 자세한 설명

 

제가 아래 소스를 어디서 찾았는데, 링크가... ㅠㅡ (죄송)

아래 소스를 body에 넣어주면 되더라고요.

그냥 되기는 합니다. ㅎ

좀 더 쉽게 사용하는 방법을 찾아야 하는데 ㅎㅎ

<div id="flashcontent5">Now loading...</div>

 

<script type="text/javascript" src="http://service.cafen.net/?api=chart"></script>
   <script type="text/javascript">
    var bar_red = new bar_3d( 75, '#D54C78' );
    bar_red.key( '2008', 12 );

    // add random height bars:
    for(var i=0; i<12; i++ )
     bar_red.data.push(rand(20000,50000));

    //
   // create a 2nd set of bars:
   //
   var bar_blue = new bar_3d( 75, '#3334AD' );
   bar_blue.key( '2009', 12 );

   // add random height bars:
   for(var i=0; i<12; i++ )
     bar_blue.data.push(rand(20000,50000));

   // create the graph object:
   var g = new graph(800, 200);
   g.title( 'VPLook Monthly', '{font-size:15px; color: #FFFFFF; margin: 5px; background-color: #505050; padding:5px; padding-left: 20px; padding-right: 20px;}' );

   //g.set_data( $data_1 );
   //g.bar_3D( 75, '#D54C78', '2006', 10 );

   //g.set_data( $data_2 );
   //g.bar_3D( 75, '#3334AD', '2007', 10 );

   g.data_sets.push(bar_red);
   g.data_sets.push(bar_blue);

   g.set_x_axis_3d( 12 );
   g.x_axis_colour( '#909090', '#ADB5C7' );
   g.y_axis_colour( '#909090', '#ADB5C7' );

   g.set_x_labels( [ 'January','February','March','April','May','June','July','August','September','October','November','December' ] );
   g.set_y_min(0);
   g.set_y_max( 50000 );
   g.y_label_steps( 5 );
   g.set_y_legend( 'Monthly', 12, '#736AFF' );

   g.render('flashcontent5');
   </script>

 

결과물 :

 

JSP환경에서 사용하는 방법은 아래 링크에 잘 설명이 되어 있습니다.

저도 이거 보면서 또 이것 저것 해봐야겠네요 ㅎ

http://cafe.naver.com/buldon.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=407

 

'CodeIN > Web' 카테고리의 다른 글

[opensource] OpenFlashChart 사용하기  (6) 2009/12/19
X internet 이란  (0) 2009/03/26
[java/jsp]한글 깨짐  (0) 2009/03/19
[javascript] contentEditable  (0) 2009/03/10
[javascript]submit()  (0) 2009/03/10
[jsp]forward  (0) 2009/03/08
posted by 조금까칠한남자
2009/12/19 21:52 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

 

Log4j를 이용해서 package별로 로그를 남기려고 하는데, 이상한 사이트 보고 따라하다가 고생만 했습니다. ㅎ

 

아래 사이트에 굉장히 자세히 설명이 되어 있습니다. 꼭 읽어보시길 바랍니다.

http://kjunine.net/tag/log4j.properties

 

아래 설정은 위 링크 설명을 보면서 작성하였습니다.

아래 설정을 적용하여 테스트 해보시면 아시겠지만, package별로 로그를 쌓으실 수 있습니다.

 

제가 사용하려는 package는 다음과 같습니다.

테스트를 위해서 com.factory.vp.ctmp 패키지에 3개의 class를 만들어 두었습니다.

com.factory.vp.ctmp.CTMP;
com.factory.vp.ctmp.FROMCTMP;
com.factory.vp.ctmp.TOCTMP;
com.factory.vp.fod.FOD;
com.factory.vp.host.HOST;

 

아래 설정에 대한 설명은 링크를 참고하세요.

http://kjunine.net/tag/log4j.properties

log4j.debug=false

log4j.rootLogger=INFO
log4j.logger.com.factory.vp.ctmp=INFO, CTMP
log4j.logger.com.factory.vp.fod=INFO, FOD
log4j.logger.com.factory.vp.host=INFO, HOST


# CTMP
log4j.appender.CTMP=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CTMP.Threshold=INFO
log4j.appender.CTMP.File=
/app/logs/CTMP.log
log4j.appender.CTMP.layout=org.apache.log4j.PatternLayout
log4j.appender.CTMP.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

# FOD
log4j.appender.FOD=org.apache.log4j.DailyRollingFileAppender
log4j.appender.FOD.Threshold=INFO
log4j.appender.FOD.File=
/app/logs/FOD.log
log4j.appender.FOD.layout=org.apache.log4j.PatternLayout
log4j.appender.FOD.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

# HOST
log4j.appender.HOST=org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST.Threshold=INFO
log4j.appender.HOST.File=
/app/logs/HOST.log
log4j.appender.HOST.layout=org.apache.log4j.PatternLayout
log4j.appender.HOST.layout.ConversionPattern=[%-10c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

 

 

DatePattern옵션은 아래 링크를 참고하세요.

[log4j] DailyRollingFileAppender의 DatePattern 옵션

 

각 CTMP.java, FOD.java, HOST.java 클래스에는 간단하게 log.info()를 이용해서 메시지만 찍어 주었습니다. 결과물은 다음과 같습니다.

일단 설정한 /app/logs 디렉토리 밑에 CTMP.log, FOD.log, HOST.log 파일이 생성됩니다.

 

 

파일을 열어보면은

com.factory.vp.CTMP패키지에 있는 CTMP.java, FROMCTMP.java, TOCTMP.java 에 관련된 로그만 찍혀있습니다.

 

com.factory.vp.FOD패키지에 있는 FOD.java

 

com.factory.vp.HOST패키지에 있는 HOST.java

 

이런식으로 패키지별로 로그를 남길 수 있습니다.

 

 

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

[java] How to use OCX in JAVA  (0) 2010/03/15
[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
posted by 조금까칠한남자
2009/12/19 21:51 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

으.. 역시나 한글은 문제를 일으키는구나... ㅎ


전문 통신할 때는 약속된 길이 만큼 정확하게 보내줘야 합니다. 그렇지 않으면... 항상 문제를 일으키고는 하죠..  뭐 한글이 문제는 아니지만요 ㅎ

보통 format을 맞추는 가장 쉬운 방법은 다음아래와 같습니다.

String.format("%-200s", communication);
communication의 원래 값 포함해서 Length가 200인 String을 return한다.

물론 String.format이 이런 식으로 원하는 Length만큼 format을 만들어 주기는 하지만 원래 목적은 이런게 아닌듯 싶다. 하지만 전문 통신할 때 이렇게 사용하면 굉장히 편리하다.

아래는 전문 통신하기 위해서 String length 100을 만들어 주는 소스이다.
sendMessage =
   String.format("%-12s", a) +
   String.format("%-6s", b)+
   String.format("%-22s", c) +
   String.format("%-60s", d);

이렇게 하면은 정확히 String length 100으로 보내게 된다.



하지만 어제 문제가 일어 났던 이유는 한글 사용 때문이며, 서버측이 c언어라서 문제가 발생했다.

String a = "김태정";
System.out.println(a.length);                          <- String length 3
System.out.println(a.getBytes().length);        <-  byte length 6
 
실행결과
3
6

문제가 일어난 원인은 위 소스와 같다.
한글은 2bytes 이므로 String length를 체크하게 되면은 "김태정"의 length는 3이 되지만, c언어에는 String이 없으므로 6이 된다.




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

[java] Excel 파일 읽기 xls, xlsx  (9) 2010/02/01
[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
[log4j] log4j.properties 설정  (0) 2009/12/11
posted by 조금까칠한남자
2009/12/13 01:47 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License
org.apache.log4j.HTMLLayout 을 이용하면 이미지와 같은 결과를 얻을 수 있습니다.

# HTML Appender
log4j.appender.CTMP=org.apache.log4j.DailyRollingFileAppender
log4j.appender.CTMP.Threshold=INFO
log4j.appender.CTMP.File=/app/logs/CTMP.html
log4j.appender.CTMP.layout=org.apache.log4j.HTMLLayout
log4j.appender.CTMP.layout.LocationInfo=true
log4j.appender.CTMP.layout.Title=CTMP Log
log4j.appender.CTMP.ImmediateFlush=true



Log4j 결과


Log4j가 생성한 로그 실제 로그입니다. 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>CTMP Log</title>
<style type="text/css">
<!--
body, table {font-family: arial,sans-serif; font-size: x-small;}
th {background: #336699; color: #FFFFFF; text-align: left;}
-->
</style>
</head>
<body bgcolor="#FFFFFF" topmargin="6" leftmargin="6">
<hr size="1" noshade>
Log session start time Sun Dec 13 01:59:54 KST 2009<br>
<br>
<table cellspacing="0" cellpadding="4" border="1" bordercolor="#224466" width="100%">
<tr>
<th>Time</th>
<th>Thread</th>
<th>Level</th>
<th>Category</th>
<th>File:Line</th>
<th>Message</th>
</tr>
.....
.....
.....

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

[log4j] package 별로 로그 남기기  (1) 2009/12/19
[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
[log4j] log4j.properties 설정  (0) 2009/12/11
[eclipse] JAVA 역컴파일 jad  (2) 2009/11/26
posted by 조금까칠한남자
TAG HTML, log4j, table
2009/12/12 03:53 CodeIN/Java
크리에이티브 커먼즈 라이선스
Creative Commons License

 

이번에 프로젝트를 하면서 느낀 것 중에 하나는 로그를 마구잡이로 남겼다는 문제가... 쿨럭...

그래서 이번에 로그 표준화 작업도 할 겸해서 이것 저것 테스트를 해보았습니다.


"기본 패턴" 부터 하나씩 변경하면서 테스트를 했기 때문에 차이점은 위에 것이랑 비교해 보시면 쉽게 아실 수 있으실 것 입니다.

 

계속적으로 추가할 예정입니다. ㅎㅎ

일단 이것부터 ㅎㅎ

- 기본 패턴

ConversionPattern :
log4j.appender.CONSOLE.layout.ConversionPattern=
[%c][%d][%p][%m]%n

Result :
[com.factory.vp.host.HOST][2009-12-11 14:14:37,046][INFO][info message]

- 일정한 길이로 출력하도록 설정하기
ConversionPattern :
log4j.appender.CONSOLE.layout.ConversionPattern=
[%-30c][%d][%p][%m]%n

Result :
[com.factory.vp.host.HOST       ][2009-12-11 14:16:56,718][INFO][info message]

 

- 날짜 format 정하기

ConversionPattern :
log4j.appender.CONSOLE.layout.ConversionPattern=
[%-30c][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

Result :
[com.factory.vp.host.HOST       ][2009-12-11 14:23:59][INFO][info message]

 

- 클래스 이름 가져오기

ConversionPattern :
log4j.appender.CONSOLE.layout.ConversionPattern=
[%-30c{1}][%d{yyyy-MM-dd HH:mm:ss}][%p][%m]%n

Result :
[HOST                          ][2009-12-11 14:25:12][INFO][info message]




 

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

[java] String format 그리고 한글  (0) 2009/12/19
[log4j] Log4j HTML TABLE  (0) 2009/12/13
[log4j] ConversionPattern  (0) 2009/12/12
[log4j] log4j.properties 설정  (0) 2009/12/11
[eclipse] JAVA 역컴파일 jad  (2) 2009/11/26
[network] TCP/IP Socket 프로그램 구현시 고려사항  (0) 2009/11/26
posted by 조금까칠한남자
prev 1 2 3 4 5 ... 20 next