R에서 rJava 사용하기 위한 설치 진행

동시출현 단어에 대한 분석이 필요하여, 검색을 해보았다. R언에에서 간단하게 함수 호출로 처리가 가능하다는 것을 확인하였다.

R 설치 하기

How To Install R on Ubuntu 18.04 를 참조해서 R을 설치 했다 명령어를 따라만 해도 쉽게 설치가 된다.

# 서버 키값 추가
$> sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

# repository 추가
$> sudo add-apt-repository 'deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/'

$> sudo apt update

# R 설치
$> sudo apt install r-base

# R Command 접근
$> sudo -i R

필요 모듈 설치

네이버 블로그로 동시출현단어 분석 (co-occurence network anlysis)에서 힌트를 얻어서 R을 한번 진행하려고 하였는데, KoNLP 모듈의 설치에서 rJava를 설치하라는 문구를 만나며 맨붕에 빠지게 되었다.

JAVA 설치

처음 실패를 계기로 구글링을 하여 다음의 해결책을 찾게 되었다.
준비해야 할 것이 몇개 있는데 큰 예로 JDK 10, 11로는 실패 하였다.

그래서 JDK 8을 기반으로 진행하였다.
JDK8 설치는 How to Install Oracle Java JDK 8 / 10 in Ubuntu 18.04 를 참고하여 처리 하였다.

# repostiroy 추가 
$> sudo add-apt-repository ppa:webupd8team/java

# java8 설치
$> sudo apt-get install oracle-java8-installer

# java8을 기본으로 사용하도록 설정
$> sudo apt-get install oracle-java8-set-default

rJava 설치

설치를 하려고 하면 많은 오류를 확인 할수 있다.

Compiling rJava macOS, java8를 참고하여 설치를 하면된다.

#java config 재설정
$> sudo R CMD javareconf

# R Command 진입
$> sudo R
# rJava 설치 (특정 위치에서 - jdk8과 궁합이 맞는 패키지인듯)
R> install.packages("https://cran.r-project.org/src/contrib/Archive/rJava/rJava_0.9-9.tar.gz")

R에서 필요한 모듈 추가

이후 다른 패키지를 설치하기 위해서 다음 모듈을 설치해 두는 것이 좋다.

$> sudo apt-get install libcurl4-openssl-dev libssl-dev libxml2-dev

이후 필요한 패키지를 설치하면 문제 없이 설치 된다.

동시 출현 단어 분석 매트릭스

.R 스크립트를 인자와 함께 실행를 참고 하여 R 실행 파일을 만들고 실행을 하면 원하는 결과를 확인 가능하다.

#! /usr/bin/env Rscript

library(rvest)
library(KoNLP)
library(stringr)
library(tm)
library(qgraph)
library(dplyr)
library(networkD3)

useNIADic()

keyword <- "텍스트+분석"
url <- paste0("https://search.naver.com/search.naver?where=post&sm=tab_pge&query=", keyword, "&st=sim&date_option=0&date_from=&date_to=&dup_remove=1&post_blogurl=&post_blogurl_without=&srchby=all&nso=&ie=utf8&start=")
searching <- c()

for(page in seq(1, 100, by=10)) {
  page_url <- paste0(url, page)
  result <- read_html(page_url) %>%
    html_nodes(css='.sh_blog_passage') %>%
    html_text()
  # result <- iconv(result, "UTF-8", "CP949") # 윈도우의 경우, R 작업환경에 맞춰 CP949로 변경할 필요가 있습니다.
  searching <- c(searching, result)
  Sys.sleep(runif(1, 0, 1))
}

ko_words <- function(doc) {
  d <- as.character(doc)
  pos <- unlist(SimplePos22(d))

  extracted <- str_match(pos, '([가-힣]+)/[NP][A-Z]')

  keyword <- extracted[, 2]
  keyword[!is.na(keyword)]
}

texts <- searching %>%
  str_replace_all(pattern="\r", replacement="") %>%
  str_replace_all(pattern="\n", replacement=" ") %>%
  str_replace_all(pattern="[[:punct:]]", replacement=" ") %>%
  str_replace_all(pattern="[ㄱ-ㅎㅏ-ㅣ]+", replacement="") %>%
  str_replace_all(pattern="/", replacement=" ") %>%
  str_trim(side="both")

texts <- texts[texts != ""]

pos <- Map(ko_words, texts)


corpus <- Corpus(VectorSource(pos))
stopWord <- c("텍스트", "분석")
tdm <- TermDocumentMatrix(corpus, control=list(
  removePunctuation=TRUE, stopwords=stopWord,
  removeNumbers=TRUE, wordLengths=c(4, 10), weighting=weightBin))
tdm.matrix <- as.matrix(tdm)

word.count <- rowSums(tdm.matrix)
word.order <- order(word.count, decreasing=TRUE)
freq.words <- tdm.matrix[word.order[1:30], ]

co.matrix <- freq.words %*% t(freq.words)
print(co.matrix)

결과는 다음과 같이 표기 된다.

         Terms
Terms     데이터 c텍스트 분석하 통하 방법 마이닝 위하 기법 과정 가지 전처리
  데이터      26       4      5    5    6      1    3    3    3    2      3
  c텍스트      4      13      2    2    3      2    2    0    2    2      1
  분석하       5       2     11    2    3      1    2    1    0    1      0
  통하         5       2      2   11    2      1    1    2    0    0      0
  방법         6       3      3    2   10      1    0    2    1    1      1
  마이닝       1       2      1    1    1     10    1    1    1    0      0
  위하         3       2      2    1    0      1    9    1    1    0      1
  기법         3       0      1    2    2      1    1    7    0    0      1
  과정         3       2      0    0    1      1    1    0    7    0      3
  가지         2       2      1    0    1      0    0    0    0    6      0
  전처리       3       1      0    0    1      0    1    1    3    0      6
  활용         3       1      1    2    2      2    0    2    1    1      0
  대하         1       0      1    1    0      0    0    1    0    2      0
  아니         4       0      0    1    0      0    0    1    0    0      0
  요소         1       1      2    0    1      2    1    2    0    0      1
  내용         1       0      0    2    1      1    0    2    0    0      0
  수집         3       1      0    0    0      1    1    0    1    0      1
  의미         0       2      0    2    0      0    0    1    1    0      1
  철학         0       1      0    0    0      0    0    0    1    1      0
  텍스         1       2      0    0    1      0    0    0    1    1      1
  단어         0       0      0    0    0      1    0    0    0    0      1
  형태소       1       1      1    0    0      0    2    0    0    0      0
  형태         0       0      0    1    1      0    0    0    0    0      0
  단위         1       1      0    0    0      1    1    1    1    0      1
  연구         1       0      0    0    1      3    0    1    1    0      0
  결과         1       1      0    0    0      1    0    0    0    0      0
  사람         2       1      1    0    1      0    0    0    0    1      0
  주제         1       1      0    2    0      0    0    0    0    1      0
  작업         0       0      1    0    1      0    1    0    1    0      1
  c데이터      2       0      0    0    0      0    0    0    1    0      0
         Terms
Terms     활용 대하 아니 요소 내용 수집 의미 철학 텍스 단어 형태소 형태 단위
  데이터     3    1    4    1    1    3    0    0    1    0      1    0    1
  c텍스트    1    0    0    1    0    1    2    1    2    0      1    0    1
  분석하     1    1    0    2    0    0    0    0    0    0      1    0    0
  통하       2    1    1    0    2    0    2    0    0    0      0    1    0
  방법       2    0    0    1    1    0    0    0    1    0      0    1    0
  마이닝     2    0    0    2    1    1    0    0    0    1      0    0    1
  위하       0    0    0    1    0    1    0    0    0    0      2    0    1
  기법       2    1    1    2    2    0    1    0    0    0      0    0    1
  과정       1    0    0    0    0    1    1    1    1    0      0    0    1
  가지       1    2    0    0    0    0    0    1    1    0      0    0    0
  전처리     0    0    0    1    0    1    1    0    1    1      0    0    1
  활용       6    1    1    0    2    2    0    0    0    0      0    0    0
  대하       1    6    1    1    1    0    0    1    0    0      0    0    0
  아니       1    1    6    0    1    0    0    0    0    0      0    0    0
  요소       0    1    0    5    0    0    0    0    0    0      0    0    1
  내용       2    1    1    0    5    1    0    0    0    0      0    1    0
  수집       2    0    0    0    1    5    0    0    0    0      0    0    0
  의미       0    0    0    0    0    0    5    0    0    0      0    0    1
  철학       0    1    0    0    0    0    0    5    1    0      0    0    0
  텍스       0    0    0    0    0    0    0    1    4    1      0    0    0
  단어       0    0    0    0    0    0    0    0    1    4      1    0    0
  형태소     0    0    0    0    0    0    0    0    0    1      4    1    1
  형태       0    0    0    0    1    0    0    0    0    0      1    4    0
  단위       0    0    0    1    0    0    1    0    0    0      1    0    4
  연구       1    0    0    1    0    0    0    0    0    0      0    0    1
  결과       1    0    0    0    1    2    0    0    0    0      0    0    0
  사람       0    1    0    0    0    0    0    0    0    0      0    0    0
  주제       0    1    0    0    0    0    1    0    0    0      0    0    0
  작업       0    0    0    1    0    0    1    0    0    0      0    0    1
  c데이터    0    0    0    0    0    1    0    0    0    0      0    0    0
         Terms
Terms     연구 결과 사람 주제 작업 c데이터
  데이터     1    1    2    1    0       2
  c텍스트    0    1    1    1    0       0
  분석하     0    0    1    0    1       0
  통하       0    0    0    2    0       0
  방법       1    0    1    0    1       0
  마이닝     3    1    0    0    0       0
  위하       0    0    0    0    1       0
  기법       1    0    0    0    0       0
  과정       1    0    0    0    1       1
  가지       0    0    1    1    0       0
  전처리     0    0    0    0    1       0
  활용       1    1    0    0    0       0
  대하       0    0    1    1    0       0
  아니       0    0    0    0    0       0
  요소       1    0    0    0    1       0
  내용       0    1    0    0    0       0
  수집       0    2    0    0    0       1
  의미       0    0    0    1    1       0
  철학       0    0    0    0    0       0
  텍스       0    0    0    0    0       0
  단어       0    0    0    0    0       0
  형태소     0    0    0    0    0       0
  형태       0    0    0    0    0       0
  단위       1    0    0    0    1       0
  연구       4    0    0    0    0       0
  결과       0    4    0    0    0       1
  사람       0    0    4    1    0       0
  주제       0    0    1    4    0       0
  작업       0    0    0    0    4       0
  c데이터    0    1    0    0    0       4

참조 링크

Posted by lahuman

댓글을 달아 주세요

Maven을 이용한 Springboot 프로젝트 repackage 하기

다른 분이 작성한 Springboot 프로젝트를 패키징하게 되었다.

해당 프로젝트는 maven으로 되어 있었기에 큰 문제가 없을꺼라 생각했다.

내 업무 환경은 JDK 12가 설치되어 있었는데, spring-repackage를 하면 다음과 같은 오류가 발생하였다.

ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.6:jar (default-jar) on project my-test-utils: Execution default-jar of goal org.apache.maven.plugins:maven-jar-plugin:2.6:jar failed: An API incompatibility was encountered while executing org.apache.maven.plugins:maven-jar-plugin:2.6:jar: java.lang.ExceptionInInitializerError: null
[ERROR] -----------------------------------------------------
[ERROR] realm =    plugin>org.apache.maven.plugins:maven-jar-plugin:2.6

에러 발생의 원인은 maven-plugin 버전 문제로, 다음과 같이 pom.xml에 추가 하면 된다.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
        </plugin>
    </plugins>
</build>

추가로 다음과 같은 오류가 발생하면,

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.21.RELEASE:repackage (default-cli) on project lahuman: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:1.5.21.RELEASE:repackage failed: Source file must be provided -> [Help 1]

Maven 배포시 Local Jar 파일과 함께 하기!내용과 같이 spring:repackage에 -U 옵션을 추가하면 해결 된다.

오랜만에 JAVA 보는듯 하다. 요즘은 개인 프로젝트도 그냥 NODE로 개발 하게 된다.

참고자료

Posted by lahuman

댓글을 달아 주세요

Maven을 이용한 Springboot 프로젝트 repackage 하기

다른 분이 작성한 Springboot 프로젝트를 패키징하게 되었다.

해당 프로젝트는 maven으로 되어 있었기에 큰 문제가 없을꺼라 생각했다.

내 업무 환경은 JDK 12가 설치되어 있었는데, spring-repackage를 하면 다음과 같은 오류가 발생하였다.

ERROR] Failed to execute goal org.apache.maven.plugins:maven-jar-plugin:2.6:jar (default-jar) on project my-test-utils: Execution default-jar of goal org.apache.maven.plugins:maven-jar-plugin:2.6:jar failed: An API incompatibility was encountered while executing org.apache.maven.plugins:maven-jar-plugin:2.6:jar: java.lang.ExceptionInInitializerError: null
[ERROR] -----------------------------------------------------
[ERROR] realm =    plugin>org.apache.maven.plugins:maven-jar-plugin:2.6

에러 발생의 원인은 maven-plugin 버전 문제로, 다음과 같이 pom.xml에 추가 하면 된다.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
        </plugin>
    </plugins>
</build>

추가로 다음과 같은 오류가 발생하면,

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.21.RELEASE:repackage (default-cli) on project lahuman: Execution default-cli of goal org.springframework.boot:spring-boot-maven-plugin:1.5.21.RELEASE:repackage failed: Source file must be provided -> [Help 1]

Maven 배포시 Local Jar 파일과 함께 하기!내용과 같이 spring:repackage에 -U 옵션을 추가하면 해결 된다.

오랜만에 JAVA 보는듯 하다. 요즘은 개인 프로젝트도 그냥 NODE로 개발 하게 된다.

참고자료

Posted by lahuman

댓글을 달아 주세요

Eclipse와 JDK9에서 @PostConstruct 어노테이션 오류

오랜만에 Eclipse를 띄어서 이전 프로젝트를 확인 하는데 @PostConstruct 어노테이션을 찾을 수 없다는 오류가 보였다.

따로 변경한 것은 JDK 버젼을 8에서 9로 업그레이드 한거 말곤 없었다.

검색을 해보니 해당 문제에 대한 해결책이 있었다.

eclipse.ini 파일에 –add-modules=java.se.ee 옵션을 추가 하면 된다.

-vmargs
--add-modules=java.se.ee
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m

JDK9이 아직 안정화가 안된건지, 여러 모듈에서 오류가 발생한다.

참고 자료


Posted by lahuman

댓글을 달아 주세요

데이터 베이스 테이블 복사 기능 만들기

DBeaver와 같은 DB TOOL을 사용하지 않고 다른 위치의 DB 간의 테이블 복제하는 프로그램이 필요하여 간단하게 만들었다.

프로그램은 아주 단순 한다. 원본 테이블의 Select Query와 타켓 테이블의 Insert Query를 기준으로 마이그레이션을 진행한다.

소스 보기

준비 사항

  • Gradle
  • JDK 1.8

사용법

lahuman.Migration 파일의 10번째 라인과 11번째 라인의 DB 접속 정보를 입력 한다.

//Line 10~11
Connection originalDB = DriverManager.getConnection("URL", "ID", "PW"); //원본 DBMS
Connection targetDB = DriverManager.getConnection("URL", "ID", "PW"); //복제예정 DBMS

lahuman.Migration 파일의 13번째 라인의 SQL을 작성한다. 이때 작성하는 SELECT SQL과 INSERT SQL의 Column 순서는 맞아야 한다.

//LINE 13
copyTableUsingSQL(originalDB, targetDB, "select A, B, C from T1", "insert into T2(A,B,C)values(?,?,?)");

단순하게 만들어서 그런지 쉽게 사용할 수 있다.



Posted by lahuman

댓글을 달아 주세요

예전에는 책을 구매 하기 전에 보통은 서점을 가서 책을 보고 구매를 진행 하였지만, 최근에는 도서관에 책을 희망 자료로 요청 하고 한달 정도 있다가 빌려서 본 후 구매를 진행한다. 한달에 총 25권까지 신청 할 수 있는데, 이를 하나하나 손으로 등록하기엔 너무 많은 시간과 노력이 필요하다. 이에 도서 목록을 가지고 자동으로 등록하는 프로그램을 만든다.

프로그램 설계

부천 시립 도서관에서 한달에 요청 할 수 있는 도서는 다음과 같다.

  • 상동, 심곡, 꿈빛, 책마루, 송내도서관 : 1인당 월 5권
  • 원미, 북부, 한울빛, 꿈여울도서관 : 1인당 월 20권

이에 도서 목록을 다음과 같이 TXT 파일로 작성하연 자동으로 등록 하도록 한다.

도서목록 파일 내용 샘플

도서관코드|도서명
AA|즐거운하루
AB|자동책등록프로그램

도서관 코드

도서관코드도서관명비고
AA상동월5권
AB원미월20권
AC삼곡월5권
AD북부월20권
AE꿈빛월5권
AF책마루월5권
AG한울빛월20권
AH꿈여울월20권
AI송내월5권
AK도당월20권

프로세스 순서도

프로세스 순서도

Notice

License

희망 도서 자동 등록 프로그램은 open source 프로그램으로 MIT 라이선스를 따릅니다.

This Request book apply is free and open source software, distributed under the MIT License. So feel free to use this program on your project without linking back to me or including a disclaimer.



Posted by lahuman

댓글을 달아 주세요

JAVA CODE STYLE GUIDE

코드 스타일 가이드가 있으면 결과적으로 코드의 질이 좋아진다.
(당장은 아니겠지만)

기본적으로 많은 곳에서 사용되는 자바 스타일 가이드는 SUN 의 스타일 가이드이다.

스타일 가이드에서 제시하는 코드 규칙의 중요성을 간략하게 정리하면 다음과 같다.
  • 소프트웨어를 개발하는 일련의 모든 과정에 들어가는 비용 중 80%가 유지보수에 사용된다.
  • 유지보수를 최초 소프트웨어를 개발한 사람이 담당하는 경우가 거의 없다.
  • 코드 규칙을 지키면 다른 개발자가 소스코드를 보았을 때 이른 시간에 이해할 수 있도록 도와준다.

만약 코드 스타일 가이드를 한 번도 읽어 보지 못했다면 SUN 의 스타일 가이드 를 읽어 보길 추천한다. 원본은 영어로 되어 있지만,한국어로 번역된 글도 많고 내용 대부분이 예제 코드로 이루어져 있으므로 문제없이 읽을 수 있을 것이다.

지금부터 소개할 것은 SUN 의 스타일 가이드가 아닌 GOOGLE의 스타일 가이드 이다.

Google java style guide 는 60% 정도는 SUN의 스타일 가이드와 같다.
몇 가지 다른 부분들은 tab 대신 space를 사용하는 것과 column limit 이 80 에서 100으로 더 크게 지정되었다는 부분과 최신 lambda 표기법 등이 있다.

선택의 이유는 SUN 의 스타일 가이드는 근래에 업데이트가 되지 않고 있지만, google의 스타일 가이드는 조금씩 업데이트가 되고 있다.

javaguide.html 파일의 마지막 변경 시점은 29일 전이다 - 2016.08.11 기준)

GOOGLE STYLE GUIDE

기본적으로 개발 도구를 ECLIPSE 을 사용하는 기준으로 기본 코드 컨벤션 설정은 SUN 사의 스타일로 처리 되어 있다.

우선 기본 CODE FORMAT를 Google 의 style로 변경해야 한다.
순서는 다음과 같다.

  1. 구글에서 제공하는 이클립스용 스타일 포맷 을 내려받는다.
  2. ECLIPSE를 실행하고 다음 메뉴로 이동한다.
    • Window > Preference > java > Code Style > Formatter
  3. Import를 선택하고 내려받은 XML 파일을 선택하고 Active Profile을 GoogleStyle로 설정 한다.
  4. Ctrl + Shift + F 를 이용해 소스 코드를 정렬한다.

참고 자료

Eclipse Checkstyle Plugin

코드를 작성하다 보면 스타일 가이드를 지키고 있는지 알 수 없다.
Checkstyle 이라는 프로그램을 이용하여, ant 또는 java 를 이용한 실행으로 잘못된 스타일 가이드를 확인할 수 있지만, 실시간이 아니므로 재작업에 어려움을 느낄 수 있다.

다행이 실시간으로 스타일 가이드를 확인할 수 있는 이클립스 플러그인이 있다.

설치는 다음과 같다.

  • Help > Eclipse Market place에서 CheckStyle로 검색을 하면 CheckStyle Plugin X.X.. 이라는 이름의 플러그인을 설치 하면 된다.
  • 설치가 완료되면 이클립스를 재기동한다.

설치가 끝나면 사용을 하기 위해 간단한 설정을 해야 한다

  1. Window > Preference > Checkstyle 에서 Google Check를 기본값으로 설정하고 저장한다.
  2. 사용할 프로젝트에서 마우스 오른쪽 키 > Properties 또는 Alt + Enter 를 이용해서 설정으로 이동한다.
  3. 왼쪽 트리 메뉴에서 Checkstyle를 선택하고 오른쪽의 Checkstyle active for this project의 체크박스를 체크 한다.
  4. OK 버튼을 누른다.

이후 화면에서 스타일을 지키지 않은 내용을 바로 확인할 수 있다.


MD FILE : 

코드스타일가이드.md



Posted by lahuman

댓글을 달아 주세요

Lambda Basic

function has 4 things

  1. name
  2. parameter list
  3. body
  4. return type
Thread th = new Thread(new Runnable(){
    public void run(){
        Sysout.out.println("In side Thread");
    }
});
th.start();

lambda expression

1. name

  1. parameter list
  2. body

4. return type

Thread th = new Thread(() ->Sysout.out.println("In side Thread"));
th.start();

iterators

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//external iterators
for(int i = 0; i < numbers.size(); i++){
    System.out.println(numbers.get(i));
}

//external iterators also
for( int e : numbers){
    System.out.println(e);
}

//interal iterators
numbers.forEach(new Consumer<Integer(){
    public void accept(Integer value){
        System.out.println(value);
    }
});

numbers.forEach((Integer value) ->System.out.println(value));

numbers.forEach((value) ->System.out.println(value));

//only for on parameter lambdas
numbers.forEach(value ->System.out.println(value));

numbers.forEach(System.out::println);

//ANTI PATTERN :: DO NOT USE LIKE THIS!
number.forEach(e -> {
...;
...;
...;
return ... need return...;
});

Parameter

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
numbers.stream()
    //.map(e -> String.valueOf(e))
    .map(String::valueOf)
    .forEach(System.out::println);

numbers.stream()
    .map(e -> String.valueOf(e))
    //.map(e -> e.toString())
    .map(String::toString)
    .forEach(System.out::println);

Two parameter

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
System.out.println(
    numbers.stream()
        //.reduce(0, (total, e) -> Integer.sum(total, e)));
        .reduce(0, Integer::sum));
);
System.out.println(
    numbers.stream()
        .map(String::valueOf)
        //.reduce("", (carry, str) -> carry.concat(str)));
        .reduce("", String::concat));
);

Stream

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
//given thevalues, double the even numbers and total.
int result = 0;
for(int e : numbers){
    if(e % 2 == 0){
        result += e*2;
    }
}
System.out.println(result);

System.out.println(
    numbers.stream()
        .filter(e -> e % 2 == 0)
        .mapToInt(e ->e * 2)
        //.reduce(0, Integer::sum));
        .sum();
);

출처


Get a Test of Lambda.md



Posted by lahuman

댓글을 달아 주세요

** 2016-07-08 추가 내용 **

SSL 관련 JAVA 설정이 필요 할때 참조 : https://www.facebook.com/lahuman/posts/1175481055835258



** 기존 내용 **


Jsch 라이브러리를 이용해서 ssh 접속을 문제 없이 하던 중, 갑자기 다음과 같은 오류 메시지를 만나게 될 경우 해결 방법 입니다.


com.jcraft.jsch.JSchException: Session.connect: java.security.NoSuchAlgorithmException: Algorithm DH not available

at com.jcraft.jsch.Session.connect(Session.java:558)



내용인 즉, DH 알고리즘이 없다는 내용이라 해당 알고리즘을 추가를 해야 합니다.



추가를 위해서는 bouncycastle 라이브러리가 필요 합니다.


라이브러리를 추가 하셨다면 jsch 호출 하기전에 Security 에서 제공자를 추가 합니다.


소스 코드는 다음과 같습니다.

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
java.security.KeyPairGenerator.getInstance("DH");
javax.crypto.KeyAgreement.getInstance("DH");


"Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());" 가 없을 경우, 에러가 발생하지만 제공자를 추가 하면 java.security.NoSuchAlgorithmException: Algorithm DH not available 와 같은 오류가 발생하지 않고 연결에도 문제가 없습니다.




Posted by lahuman

댓글을 달아 주세요

[TIP.1]Mybatis XML 에서 JAVA static method 호출 하기

다음과 같은 class가 있을 경우

package kr.pe.lahuman;
public class CallOfMybatis{
    public static final String callStaticMethod(Parameter param ){
        //처리
        reutrn "처리 결과";
    }
}

mybatis XML 에서는 다음과 같이 호출 할 수 있다.

${@kr.pe.lahuman.CallOfMybatis@callStaticMethod(param)}

[TIP.2]Mybatis configuration 에서 TypeAliase 설정하여 여러 VO를 alias 사용하기

특정 패키지를 다음과 같이 설정 하면

<typeAliases>
  <package name="kr.pe.lahuman.vo"/>
</typeAliases>

다음과 같이 XML에서 사용할 수 있다. 주의 할 점은 alias 명은 모두 소문자로 작성 해야 한다.

<select id="getHaveANiceDay" parameterType="sohappyvo" resultType="resultvo" >
select happy, day
from good_day
</select>

MD 파일 : 

Mybatis-TIP.md



Posted by lahuman

댓글을 달아 주세요

  1. lahuman 2016.04.14 07:44 신고  댓글주소  수정/삭제  댓글쓰기

    Inner Class 호출은 Class$innerclass 로 호출합니다.