2017년 12월 27일 수요일

Guava와 Java 8

# 과제도 끝났고, 모르던거 살펴보는 중인데.. 아. 부끄러움은 나의 몫이다. Java 8 버전을 쓰고 있지만 정작 편의상 버전만 올렸을 뿐이지 뭐가 어떻게 바뀌었는지 전혀 따라가지 못했다.

# Guava는 JDK에서 제공되지 않는 자주 쓸법한 기능들을 대신 지원해주는 라이브러리이다. 그런데 Java가 8로 업데이트 되면서 Guava에서 제공하던 기능을 유사하게 제공하게 됨에따라 역할이 다소 모호해졌다. (그렇지만 라이브러리 대신 JDK를 써야할 의무는 없고, 모두가 Java 8을 쓰는 것도 아니다.)


Java 8 LocalDate
: 낮은 버전의 Java를 사용해보면 날짜 관련 기능이 굉장히 불편하다 느낄 수 밖에 없는데 Java 8에서 비약적으로 개선되었다. LocalDate, LocalDateTime, LocalTime이 그것이다.
Date, DateTime, Time 버전이 각각 있고, 메서드는 거의 동일하다.

LocalDate day = LocalDate.of(2017, 12, 28);
LocalDate.now(); // ,... LocalDateTime, LocalTime
LocalDate.of(2017, 12, 28).format(DateTimeFormatter.BASIC_ISO_DATE); // 20171228
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));


Guava Strings
: C#에서 자주쓰는 isNullOrEmpty가 참 반갑다.

Strings.isNullOrEmpty(s);
Strings.nullToEmpty(s);
Strings.repeat("-", 70);


Guava Joiner
List<String> parts = ,...
Joiner.on(", ").skipNulls().join(parts);


Guava MapSplitter
MapSplitter splitter = Splitter.on(" ").withKeyValueSeparator(":");
splitter.split("a:1 b:2"); // => Map {a=1, b=2}


Guava Iterable
Iterable<Person> adults = Iterables.filter(persions,
new Predicate<Person>() {
@Override
public boolean apply(Person p) {
return p.getAge() >= 18;
}
});
List<String> names = Lists.newArrayList(Iterables.transform(adults,
new Function<Person, String>() {
@Override
public String apply(Person p) {
return p.getName();
}
}));


Guava FluentIterable
FluentIterable.from(persons)
.filter(new Predicate<Person>() {
@Override
public boolean apply(Person p) {
return p.getAge() >= 18;
}
})
.transform(new Function<Person, String>() {
@Override
public String apply(Person p) {
return p.getName();
}
})
.toList();


Java 8 Lambdas
: 반갑다 람다 :D

Predicate<Person> predicate = p -> p.getAge() >= 18;
Comparator<Person> comparator = (a, b) -> a.getName().compareTo(b.getName());
Runnable runnable = () -> ...;


Guava & Java 8
FluentIterable.from(persons)
.filter((Person p) -> p.getAge() >= 18)
.transform((Person p) -> p.getName())
.toList();
#Eclipse: Quick Fix (Ctrl + 1) -> Convert to lambda expression


Java 8 Streams
: 일반적인 loop 구문과 비교했을 때, 빠르게 동작하진 않는 것 같다. 병렬 버전의 parallelstream도 있다.

persons.stream()
.filter(p -> p.getAge() >= 18)
.map(p -> p.getName())
.collect(Collectors.toList());

List<String> parts = ...;
parts.stream().collect(Collectors.joining(", "));

Map<Integer, List<Person>> personByAge = persons.stream()
.collect(Collectors.groupingBy(p -> p.getAge()));

Double averageAge = persons.stream()
.collect(Collectors.averagingInt(p -> p.getAge()));


Guava Comparing
Ordering.natural()
.onResultOf(new Function<Person, String>() {
public String apply(Person input) {
return input.getName();
}
})
.compound(Ordering.natural()
.onResultOf(new Function<Person, Integer>() {
public Integer apply(Person input) {
return input.getAge();
}
}));


Java8 Comparing
Comparator.comparing(Person::getName)
.thenComparing(Person::getAge);


Guava I/O
List<String> line = Files.readLines(new File(...), Charsets.UTF_8);
Files.copy(new File(...), new File(...));
FluentIterable<File> traversal = Files.fileTreeTraverser().postOrderTraversal(new File("dir"));


Guava Stopwatch
Stopwatch stopwatch = Stopwatch.createStarted();
...
logger.info("Elapsed: " + stopwatch);


Guava Math
IntMath.checkedPow(2, 10); // => 1024
IntMath.divide(7, 2, RoundingMode.HALF_UP); // => 4

출처: https://github.com/robinst/guava-java8-presentation

2017년 12월 17일 일요일

제10회 코리아 DATA 테크 세미나

4차산업혁명시대 산업별 데이터 활용 전략 및 성공사례

일시: 2017년 12월 14일(목) 14:00 - 17:00
장소: 과학기술회관 대회의실

01 데이터로 달리는 자동차
- 자동차의 진화
- 자동차 내부 데이터 활용
- 자동차 주변 환경 데이터 활용
- 운전자와 이용자 데이터 활용
# 순수 기계 > 전기의 이용 > 전자 부품 도입 > 제어 컴퓨터의 사용 > 소프트웨어 발전 > 인지 센서의 발전 > 인공지능.
# 인간 편의를 극대화 하는 방향으로 발전 중.
# Tesla Autopilot > Strike Out System > Nvidia Drive PX2

02 데이터 기반의 스마트 팩토리
- Industry 4.0과 Data 분석
- 선진사 Case Study
- 두산 중공업 Data 분석 추진 방향
- 중공업 Data 분석 사례
- Wrap up
# 기계 > 에너지 > 컴퓨터 > 데이터 + 분석.
# 3 Keywords. > Hyper-Connected; 정보를 제공 및 생산, Hyper-Intelligent; 정보를 분석해 일정한 패턴을 파악, Predictivility; 분석 결과를 통해 인간과 기계의 행동을 예측.
# 두산중공업에선 데이터 분석에 대한 조직의 변화 관리 / 교육을 수행하고 있음. > 자체 공장을 보유하고 있고, 작은 개선이더라도 효과가 큰 업종이라 가능한 것으로 보임.
# 사례에서 특이점은 없음. 여러 참여자의 협업이 중요. 경험상 3Cycle 정도의 순환이 일어난 다음에 성공을 거두는 사례가 많았다고 함. 

03 빅데이터 분석 기반의 소비자 행동 예측
- 예측의 개념과 범위
- 금융 산업의 주요 이슈
- 예측 관련 이론과 시사점
- 금융산업의 예측과 적용 사례
# 금융회사 경쟁력 4대 요소. 인재, 기술, 프로세스, 데이터. 그 중 '데이터'는 그동안 가장 활용되지 못햇던 부분.
# 데이터는 변하지 않는 요소. 지속 가능한 가치.
# 요건 정의가 중요하다고 판단됨. 예를 들어 '이탈 고객'의 수를 예측 해야 한다고 할 때. '이탈'에 대한 정의는 하기 나름이므로.
# What > How > Why 순으로 업무를 진행할 것이 아니라
Why > How > What으로 진행하는 것이 옳다고 생각함.
# 저이용&고충성 > 고객 관리, 고이용&고충성 > 이탈 방지, 저이용&저충성 > Up Selling, 고이용&저충성 > 핵심 Target

04 데이터 공유에서 증거공유로 : 글로벌 10억명 임상의료데이터 공급망
- 데이터 공유 vs 증거공유
- 분산연구망
- 공통데이터모델(CDM)과 오픈이노베이션
- 오딧세이 컨소시엄 국내외 현황
# 의료 데이터 연구 쪽에서 굉장히 유명하신 분이신듯. (박래웅 교수님)
# 다기관 데이터 결합에서 기술적, 법적 문제보다 데이터 공유에 대한 두려움, 데이터를 공유하고 싶지 않아 하는 '인간본성 문제'의 걸림돌이 컸음.
# 다기관 임상자료 수집/통합의 어려움. > 데이터를 공유하지 않고 증거를 공유함으로써 문제를 해결.
# ami.ajou.ac.kr:8080