2017년 10월 24일 화요일

Webdriver file attach


https://stackoverflow.com/questions/16896685/how-to-upload-file-using-selenium-webdriver-in-java



    upload.click();

    //put path to your image in a clipboard
    StringSelection ss = new StringSelection("C:\\IMG_3827.JPG");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    //imitate mouse events like ENTER, CTRL+C, CTRL+V
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
    robot.keyPress(KeyEvent.VK_CONTROL);
    //open upload window
    upload.click();

    //put path to your image in a clipboard
    StringSelection ss = new StringSelection("C:\\IMG_3827.JPG");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    //imitate mouse events like ENTER, CTRL+C, CTRL+V
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);
    robot.keyPress(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_V);
    robot.keyRelease(KeyEvent.VK_CONTROL);
    robot.keyPress(KeyEvent.VK_ENTER);
    robot.keyRelease(KeyEvent.VK_ENTER);

2017년 10월 10일 화요일

java access parent class private variable

https://stackoverflow.com/questions/822648/accessing-private-instance-variables-of-parent-from-child-class

No, not according to the java language specification, 3rd edition:
6.6.8 Example: private Fields, Methods, and Constructors
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.
But regardless of this language restriction, you can access private fields through reflection:
Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);






spring mybatis dynamic rest endpoint

ui like swager

and db mybatis

concept : ioc , di ,

https://blog.dylants.com/2013/09/23/spring-data-rest-with-xml-less-configuration/

동적으로 restapi endpoint 를 생성

타켓은 db, or traction

요구 사항
--------------------------------------------
입력 항목 체크
쿼리항목 반영
결과 값

초기 : 첫술에 배 부르랴

http://stackoverflow.com/questions/28874135/dynamic-spring-data-jpa-repository-query-with-arbitrary-and-clauses

무엇이 효율적이고 다인가를 찾아야지

개념
service 구성
endpoint 생성

입력 항목 생성
디비 쿼리 생성
실행 결과 후처리
json 응답

서비스의 구성이 저장 된후 반영 버튼을 누를 경우 반영,
반영 결과를 revert 하는 기능

// jqwidget 이나 webpoent 의 컬럼 오더 반영


http://stackoverflow.com/questions/6514876/most-effecient-conversion-of-resultset-to-json

sql data mapper




quartz 사용 하기

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html

프로젝트 만들고 , lib 안에 다운로드 받은 jar 들 복사 후 QuartzTest.java 생성

1. 샘플

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}
}

=======================================================
log4j.properties 생성
=======================================================

# Set root logger level to DEBUG and its only appender to A1.
log4j.rootLogger=DEBUG, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n


=======================================================
실행결과
=======================================================
0    [main] INFO  org.quartz.impl.StdSchedulerFactory  - Using default implementation for ThreadExecutor
6    [main] INFO  org.quartz.simpl.SimpleThreadPool  - Job execution threads will use class loader of thread: main
28   [main] INFO  org.quartz.core.SchedulerSignalerImpl  - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
28   [main] INFO  org.quartz.core.QuartzScheduler  - Quartz Scheduler v.2.2.3 created.
30   [main] INFO  org.quartz.simpl.RAMJobStore  - RAMJobStore initialized.
31   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler meta-data: Quartz Scheduler (v2.2.3) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

31   [main] INFO  org.quartz.impl.StdSchedulerFactory  - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
31   [main] INFO  org.quartz.impl.StdSchedulerFactory  - Quartz scheduler version: 2.2.3
32   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
33   [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.core.QuartzSchedulerThread  - batch acquisition of 0 triggers
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
33   [main] DEBUG org.quartz.simpl.SimpleThreadPool  - Shutting down threadpool...
33   [main] DEBUG org.quartz.simpl.SimpleThreadPool  - Shutdown of threadpool complete.
33   [main] INFO  org.quartz.core.QuartzScheduler  - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
508  [DefaultQuartzScheduler_Worker-4] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-1] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
509  [DefaultQuartzScheduler_Worker-8] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
509  [DefaultQuartzScheduler_Worker-7] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
508  [DefaultQuartzScheduler_Worker-2] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-9] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-10] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-5] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.
515  [DefaultQuartzScheduler_Worker-6] DEBUG org.quartz.simpl.SimpleThreadPool  - WorkerThread is shut down.

2. Hello Job Test

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;

import org.quartz.JobBuilder;
import org.quartz.JobDetail;

import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

JobDetail job = newJob(HelloJob.class)
     .withIdentity("job1", "group1")
     .build();

// Trigger the job to run now, and then repeat every 40 seconds
 Trigger trigger = newTrigger()
     .withIdentity("trigger1", "group1")
     .startNow()
           .withSchedule(simpleSchedule()
             .withIntervalInSeconds(5)
             .repeatForever())            
     .build();

 // Tell quartz to schedule the job using our trigger
 scheduler.scheduleJob(job, trigger);


// scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}


}
=========================================================
HelloJob.java
=========================================================
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job{

Logger logger = Logger.getLogger(HelloJob.class);

@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {

logger.debug("HelloJob executed");
}

}
========================================================

3. JOB 에 DATA 넘기기

================================================
QuartzTest.java
================================================
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.*;
import static org.quartz.TriggerBuilder.*;
import org.quartz.JobDetail;
import static org.quartz.SimpleScheduleBuilder.*;

public class QuartzTest {

public static void main(String[] args) {

try {
// Grab the Scheduler instance from the Factory
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

// and start it off
scheduler.start();

JobDetail job = newJob(HelloJob.class)
     .withIdentity("job1", "group1")
     .usingJobData("jobSays", "Hello World!")
     .usingJobData("myFloatValue", 3.141f)
     .build();

// Trigger the job to run now, and then repeat every 40 seconds
 Trigger trigger = newTrigger()
     .withIdentity("trigger1", "group1")
     .startNow()
           .withSchedule(simpleSchedule()
             .withIntervalInSeconds(5)
             .repeatForever())            
     .build();

 // Tell quartz to schedule the job using our trigger
 scheduler.scheduleJob(job, trigger);


// scheduler.shutdown();

} catch (SchedulerException se) {
se.printStackTrace();
}
}


}
=========================================================
HelloJob.java
=========================================================
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

public class HelloJob implements Job {

Logger logger = Logger.getLogger(HelloJob.class);

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {

logger.debug("HelloJob executed");
JobKey key = context.getJobDetail().getKey();

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");

logger.debug("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);
}

}



4. 스프링 부트에 적용 하기 


스프링이 로드 된 다음에 실행 하려면
Scheduler 를 만들고 ApplicationListener 를 구현 해 주면 된다.

public class SchedulerClass implements ApplicationListener<ContextRefreshedEvent>{

    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent ) {
             // do what you want - you can use all spring beans (this is the difference between init-method and @PostConstructor where you can't)
             // this class can be annotated as spring service, and you can use @Autowired in it

    }
}

5. 리스팅 jobs


for (String groupName : scheduler.getJobGroupNames()) {

for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {

String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();

// get job's trigger
List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
Date nextFireTime = triggers.get(0).getNextFireTime();

System.out.println("[jobName] : " + jobName + " [groupName] : " + jobGroup + " - " + nextFireTime);

}

}

6.  maven 통합

<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.3.0</version>
</dependency>


7. 스프링 부트 통합

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.3.0</version>
    </dependency>
</dependencies>

8. 데이터 베이스 연동









spring mybatis log 설정

스프링 설정을 application.property 파일이 아닌 application.yml 을 사용 하는 구조에서 로그 자료 이다.

=====================================
= application.yml
=====================================
logging:
  level:
    org:
      mybatis: DEBUG
    kr:
      co:
         company:
           project: TRACE

위 설정으로 로그를 보면 보이긴 하지만 PREPARE STATEMENT 와 컬럼이 각각 출력 되어
디버깅에 무지 않좋다.

<!-- https://mvnrepository.com/artifact/org.lazyluke/log4jdbc-remix -->
<dependency>
    <groupId>org.lazyluke</groupId>
    <artifactId>log4jdbc-remix</artifactId>
    <version>0.2.7</version>
</dependency>


http://addio3305.tistory.com/66 설명에는 context-datasource.xml을 수정이 기술 되어 있다.

http://www.programcreek.com/java-api-examples/index.php?api=net.sf.log4jdbc.Log4jdbcProxyDataSource 프로그램 방식으로 dataSource 생성


@Bean public DataSource dataSource(){
  Log4JdbcCustomFormatter formatter=new Log4JdbcCustomFormatter();
  formatter.setLoggingType(LoggingType.MULTI_LINE);
  formatter.setSqlPrefix("SQL:\r");
  EmbeddedDatabase embeddedDatabase=new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
  Log4jdbcProxyDataSource dataSource=new Log4jdbcProxyDataSource(embeddedDatabase);
  dataSource.setLogFormatter(formatter);
  return dataSource;
}

쓸려고 다 찾았으나.. 

log4jdbc-log4j2 요거 쓰라는 이야기

https://code.google.com/archive/p/log4jdbc-log4j2/downloads


hdfs get active name node

when programming out of hadoop cluster ,
if name-node is standby, connecting hdfs and any command fails.

http://{0}:{1}/jmx?qry=Hadoop:service=NameNode,name=NameNodeStatus

from stackoverflow ( http://stackoverflow.com/questions/26648214/any-command-to-get-active-namenode-for-nameservice-in-hadoop )

MySQL 이벤트 스케쥴러

MySQL  5.1 이상부터 이벤트 스케쥴러가 구성 되었다.

일별로 돌아가야 되는 배치가 있다.

1. 이벤트 스케쥴러 동작 시키기

먼저 서버 리부팅시 동작 하도록 my.cnf 파일을 수정한다.

my.cnf
============================
event_scheduler = ON

서버를 리부팅 해서 확인 해도 되고, 설정을 해 두었으면
리부팅 없이 설정을 변경 하면 된다.

show variables like 'event%' ;

SET GLOBAL event_scheduler = ON ;
show variables like 'event%' ;


2. 샘플 등록 해 보기

cloudera 개발환경 구축

환경 구성 목표
윈도우 환경에 virtualbox 로
master + namenode + namenode
총 3대의 환경을 구축한다.

이번에 구축할 환경은 cludera 에 impala 를 사용한다. 엄밀히 말하면
하둡에 임팔라를 올린 것이다.

기존의 설명들은 centos 기반의 설명이 많은데, 개인적으로 ubuntu 를
좋아하는 관계로 ubuntu 기반으로 설치를 진행 하려 한다.

처음 환경구축을 위해 검색어는 cludera ubuntu 였는데, ubuntu hadoop 로 해서 찾아보니
더 많은 문서가 있다.


1. 크라우데라 다운로드
https://www.cloudera.com/downloads.html

virtualbox 용으로 다운로드

2. virtualbox 윈도우용 다운로드 설치
https://www.virtualbox.org/wiki/Downloads


참고 : http://ourcstory.tistory.com/171

파일 업로드
http://addio3305.tistory.com/83

업로드 중간에 나감, 확인 안하고 나감, 세션 종료됨,

스프링 + 임팔라 다이렉트 쿼리 + 결과 도출, 조회로그




Data between views in eclipse rcp

ISourceProviderListener



You have the different communication paradigm summarize in the IBM article
  • To make a view capable of listening to selection changes, a view must implement the ISelectionListenerinterface and must register itself with the workbench page
  • Using the IAdaptable interface: A class that implements IAdaptable has the capability to dynamically return certain types of adapters that can then be used to retrieve further information.
  • property change listener paradigm
Regarding the first approach, the article details:









Android ocr

컴퓨터에서 Nox 의 이미지를 가져온다
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png

마우스 액션을 기억 한다

파이썬으로 특정영역을 ocr 하여
텍스트를 가져온다


https://m.blog.naver.com/PostView.nhn?blogId=samsjang&logNo=220694855018&categoryNo=66&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

를 참고 하여 이미지를 해석한다

이미지 클리핑

파이썬으로 윈도우 캡쳐

매크로 레코딩 버튼이벤트 좌표

Read text match image

이미지프로세싱 예제 상세함

https://stackoverflow.com/questions/20427759/image-processing-and-extraction-of-characters


이미지처리 관련 링크

As of OpenCV 3.0 (in active dev), you can use the built-in "scene text" object detection module ~
The text detection is built on these two papers:
Once you've found where the text in the scene is, you can run any sort of standard OCR against those slices (Tesseract OCR is common). And there's now an end-to-end sample in opencv using OpenCV's new interface to Tesseract: 






https://tailstar.net/macro/4055447
매크로 제작관련 링크들


tesseract site
https://github.com/tesseract-ocr/tesseract/wiki
https://github.com/tesseract-ocr/tesseract/wiki/Downloads

binary 형태를 받아볼 수 있음, 이러한 이유 <= 빌드가 필요 없음, image를 이용해 training을 해볼 수 있음, image를 이용해 미리 인식 테스트를 해볼 수 있음

exe파일을 받았습니다.
아래 경로 참고

tesseract-ocr-setup-3.02.02.exe

툴의 사용법
setup으로 설치하면 path까지 자동으로 설치됩니다.

D:\Program Files (x86)\Tesseract-OCR\doc 폴더에 테스트용 이미지가 있습니다.
eurotext.tif, phototest.tif

cmd line에서는 아래와 같이 실행하면 됩니다. 첫번째 인자는 이미지가 되고 두번째 인자는 생성되는 파일입니다.

D:\Program Files (x86)\Tesseract-OCR>tesseract doc\eurotext.tif E:/out
Tesseract Open Source OCR Engine v3.02 with Leptonica


여러 언어를 사용할때는 아래와 같이 + 로 연결해서 -l 옵션을 사용하면 됩니다. It can even be used with multiple languages traineddata at a time eg. English and German:   tesseract myscan.png out -l eng+deu Training 아래 링크 참조 https://github.com/tesseract-ocr/tesseract/wiki/TrainingTesseract 트레이닝은 새로운 언어를 추가하거나 입력되는 인식률을 높이기 위해서 하게됩니다.  위에서 받은 binary가 3.02 라서 다음 링크를 사용해야 합니다. https://github.com/tesseract-ocr/tesseract/wiki/Training-Tesseract-3.00%E2%80%933.02 영어로 된 정확한(동작가능한) 예제를 구하지는 못했습니다. http://blog.secmem.org/489 여기 중간 부분을 보면 training을 어떻게 하면 되는지 정보가 나옵니다. D:\Program Files (x86)\Tesseract-OCR\tesseract-ocr\doc\tesseracticdar2007.pdf 파일을 보면 tesseract 에 대한 원리가 나오는데 읽어봐도 이해하기는 힘드네요.


텐서랙 학습
http://kyubuem.tistory.com/m/53

https://github.com/tesseract-ocr/



eclipse rcp dialog resize

  Dialog 안에 메소드를 만든다. private void autoResize(){     getShell().layout( true, true);     final Point newSize = getShell().computeSize...