2014년 5월 20일 화요일

language - Scala

Scala

http://www.scala-lang.org/

특징
  • 객체지향 프로그래밍언어와 함수형 프로그래밍 언어의 장점을 결합
  • 자바가상머신(JVM)에서 동작
  • 보다 간결한 코딩
  • 자바 라이브러리 사용가능 및 상호연계
  • 병행프로그램 작성 수월

관련 책소개

스칼라 프로그래밍(쉽게 배워서 빨리 써먹는)

http://book.naver.com/bookdb/book_detail.nhn?bid=7188923

폴리글랏 프로그래밍

http://book.naver.com/bookdb/book_detail.nhn?bid=7440444

2014년 5월 12일 월요일

language - java 8

java 8

 Java 8 (JSR-337)은 새로운 기능과 향상된 기능 및 버그 픽스가 포함되어 Java 프로그램 개발 및 실행의 효율을 높여주는 최신 Java 릴리스.


java 8의 특징적 변화

1. Jigsaw
 자바 응용프로그램과 자바 플랫폼을 위한 모듈화 기능을 대비할 수 있다. (향후 지원)

2. Nashorn JavaScript Engine
 VM에서 경량화된 고성능의 JavaScript 엔진 내장

3. Autoconf-Based Build System
 빌드 속도 향상을 위해 ./configure-style의 autoconf 빌드시스템 지원(소개? : 미지원?)

4. JavaFX
 RIA(Rich Internet Application)를 위한 그래픽과 미디어 통합 패키지로서 개발되었지만 Swing GUI을 대체하기 위해 지속적으로 개발되어 Java 8의 기본 GUI로 자리매김.

5. Mission Control / Flight Recoder
 Oracle JRocket JVM에서 제공하는 기능을 지원

6. Lambda
 멀티코어 응용프로그램을 작성할때 보다 쉽고 간결하게 작성할 수 있다.

7. Default Methods for Interface (Extension Methods)
 다중 상속에 대한 프로그래밍 모델 제공

8. Annotation on Types
 Annotation을 method의 parameter의 type에도 적용 지원

9. Generalized Target-Type Inference
 Generic 사용성 개선

10. Access To Parameter Names at Runtime
 method, constructor의 parameter의 name을 runtime 시점에 획득가능

11. Remove the Annotation-Processing Tool (apt)
 apt 관련 tool, API, docs 제거됨

15. Bulk Data Operations for Collections
 Java를 위한 Filter, Map, Reduce를 제공

16. Parallel Array Sorting
 멀티코어를 활용하는 sorting 기능 제공

17. Date and Time API
 새로운 Date, Time, Calendar API 추가

18. JDBC 4.2 지원
 사용성과 이식성 향상

19. Base64 Encoding and Decoding
 Base64 기본 API에 추가됨

20. Reduced core-library memory usage
 메모리 사용량 감소

21. Statically Linked JNI Libraries
 Embedded Application을 위한 JNI 라이브러리의 정적 링크

22. Locale Data Packing
 CLDR(Common Locale Data Repository) 지원

23. Unicode 6.2
 Unicode 6.2 지원

24. Enhanced Certificate Revocation-Checking API
 인증서버 연결관련 확장된 기능 제공

25. HTTP URL Permission
 URL 기반 네트워크 퍼미션 추가

26. Launch JavaFX Application
 Command line에서 JavaFX 어플리케이션 실행기능 제공

27. Remove The Permanent Generation
 Hotspot VM에서 Permanent Generation이 제거되었다.

28. Small VM
 3Mbytes 미만의 경량의 VM 구성 가능

29. Compact Profiles
 경량 디바이스에서 배포되고 실행될 어플을 위해 Java SE Spec의 서브 프로파일을 정의함

30. Reduce class Metadata Footprint
 경량 디바이스에서 성능 향상을 위해 class의 metadata memory footprint를 줄임

31. Leverage CPU Instructions for AES Cryptography
 불필요한 AES key의 재확장을 피하고 가용할 경우 x86 CPU의 AES 명령셋을 사용하여 성능을 향상시킴

32. Mechanical Checking of Caller-Sensitive Methods
 JDK의 메소드 핸들링의 보안성을 향상시킴

33. Charset Implementation Improvements
 Chartset 성능 향상

34. JAXP 1.5
 JAXP 1.5로 버전업

...


eclipse에서 java 8 사용하기

현재 eclipse 릴리즈 버전인 Kepler 까지는 java 8을 지원하지 않습니다.
그래서 해당 java 8에서 제공하는 특징을 사용하기 위해서는 java 8을 위한 eclipse plugin을 설치해야 합니다.

1. eclipse의 메뉴에서 Help ==> Eclipse Marketplace 선택

2. Search에서 "java 8"로 검색하여 "Java 8 Support for Eclipse ..." 를 설치

3. Project의 JRE System Library에서 JavaSE1-8로 변경


build tool - Gradle

Build tools
  • Ant
  • Maven
  • Ivy
  • Gradle
  • ...
Gradle
  • Groovy 기반 DSL(Domain Specific Language) 채용
  • 선언적 언어의 특징을 제공
  • 멀티 프로젝트 관리가 쉬움
  • Gradle Wrapper를 이용하여 Gradle이 설치되지 않은 환경에서도 빌드 가능
참고 URL - http://www.gradle.org, http://kwonnam.pe.kr/wiki/gradle

Groovy
  • 타입이 유연하고  간결한 동적 객체지향 프로그래밍 언어
  • 자바, 루비, 스몰토크, 파이썬 언어에서 영향을 받음
  • 자바와 상호 연동
  • 클로저(List Processing Programming) 지원
참고 URL - http://groovy.codehaus.org, http://groovy.codehaus.org/Korean+Home

참고)
 Grails - Ruby on Rails를 Groovy용으로 개발한 웹 개발 프레임워크


eclipse에서 android project를 Gradle로 빌드/배포

1. 적용방안
  • Gradle Project로 전환하여 사용하기
    •  Gradle IDE plugin 3.5 버전을 설치하여 테스트한 결과 plugin 버그인지 안드로이드 프로젝트로 세팅된 정보에 문제가 생긴다.
    •  eclipse에 완전히 통합된 느낌이 없다.
    •  개발환경에서는 오히려 불편한점이 더 많다.
  • Gradle 세팅파일만 추가하여 배포시에만 Gradle 사용하기
    • 기존 안드로이드 프로젝트에 아무런 영향을 미치지 않는다.
    •  IDE에 영향을 받지 않는다.
  ==> Eclipse에서 Android Project를 Gradle Project로 전환하여 개발하는것은 다소 문제가 있어 보여 두번째 방안으로 적용하는 방법을 설명하였다.


2. Gradle 설치
  • http://www.gradle.org 에서 다운로드 후 압축해제
  • 해당 경로로 GRADLE_HOME 환경변수 추가
  • 해당 경로의 bin 디렉토리를 PATH 환경변수에 추가
3. Eclipse에 Gradle plugin 설치
  • Eclipse 메뉴의 Help >> Eclipse Marketplace 에서 gradle 로 검색
  • Gradle 설정파일 편집기인 Minimalist Gradle Editor 설치
  • Gradle Integration for Eclipse 설치

4. 기존 Android Project에 gradle 적용하기

 1) 단일 프로젝트 구조

  (1) Gradle에 Android SDK 경로 설정
  • 프로젝트 홈 디렉토리에 "sdk.dir" 이름으로 Android SDK Home 경로가 설정된local.properties를 추가
  • 또는 ANDROID_HOME  환경변수 추가

  (2) 프로젝트 홈 디렉토리에 build.gradle 파일 생성
  • 직접 파일을 생성하여 Gradle을 작성할 수 있다.
  • 프로젝트 Export 기능에서 제공하는 "Generate Gradle build files" 기능을 사용하여 손쉽게 작성할 수 있다.
 ==> Eclipse에서 제공하는 "Generate Gradle build files" 기능으로 생성된 build.gradle 파일을 수정하여 사용하는것이 효과적이다.

  (3) build.gradle 파일 수정
  • lint 에러가 발생할 경우 build가 중단되는 문제
 ==> android { ... } 안에 다음 항목 추가
    lintOptions {
        abortOnError false
    }
  • java 소스파일에 입력된 한글이 깨지는 문제
 ==> android { ... } 안에 다음 항목 추가
    compileOptions.encoding = '인코딩문자열'

==> 인코딩문자열은 java 소스파일과 같은 인코딩으로


 2) 복수 프로젝트 구조

  (1) Gradle에 Android SDK 경로 설정

 ==> 단일 프로젝트와 동일

  (2) 프로젝트 홈 디렉토리에 build.gradle 파일 생성
  • 직접 파일을 생성할 경우 프로젝트별로 각각 Gradle 파일을 생성해야 한다.
  • 프로젝트 Export 기능에서 제공하는 "Generate Gradle build files" 기능을 사용하여 생성시 메인 프로젝트만 선택하면 메인 프로젝트에서 참조하는 android library project를 자동으로 인지하여 선택하게 하며 참조된 프로젝트들 각각에 build.gradle 파일을 생성한다.

  (3) 메인 프로젝트 홈 디렉토리에 settings.gradle 파일 생성
  • android library project를 사용하는 복수 프로젝트 구조에서는 사용하는 library 프로젝트를 include하여야 한다. 해당 기능은 Eclipse Export 기능에서 생성되지 않는다.
  • eclipse에서 사용하는 프로젝트 방식에서는 메인 프로젝트와 라이브러리 프로젝트가 모두 workspace 하위에 동일한 레벨의 경로에 위치한다. 이럴 경우 gradle에서는 라이브러리 프로젝트를 못 찾는 문제가 발생하며 이를 해결하기 위해 "projectDir"로 프로젝트 홈 경로를 지정해주어야 한다.
 ==> 프로젝트 디렉토리 구조
 - workspace
     - MainProject
     - LibProject1
     - LibProject2

==> setting.properties 설정 예
 include ':LibProject1', ':LibProject2'
 project(':LibProject1').projectDir = new File("../LibProject1");
 project(':LibProject2').projectDir = new File("../LibProject2");

 5. 빌드 및 기타 기능 추가

 1) 빌드
  • 메인 프로젝트 홈 디렉토리에서 gradle [task 이름]형식으로 빌드
 ==> gradle build
 ==> gradle clean build
 ==> gradle build --daemon

 2) signed apk 설정
  • 메인 프로젝트의 build.gradle에 signing 설정 추가
 ==> android { ... } 안에 다음 항목 추가 : keystore경로는 keystore파일의 실제 경로를 프로젝트 홈 기준 상대경로로 지정하고 별칭은 프로젝트 영문이름을 사용


     signingConfigs {
          release {
              storeFile file("keystore경로")
              storePassword "notYourRealPassword"
              keyAlias "별칭"
              keyPassword "notYourRealPassword"
         }
     }
     
     buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }


 ==> password 입력 task 추가


task askForPasswords << {
    def storePw = new String(System.console().readPassword("Keystore password: "))
    def keyPw  = new String(System.console().readPassword("Key password: "))

    android.signingConfigs.release.storePassword = storePw
    android.signingConfigs.release.keyPassword = keyPw
}

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.equals("packageRelease")) {
        theTask.dependsOn "askForPasswords"
    }
}