DevEnjoy

One Step Closer

Month: 7월 2016

jenkins에서 maven build시 unmappable character for encoding ASCII 에러

2016년 7월 29일 by YongPwi Leave a Comment

jenkins 상에서 maven build 설정 중 error 발생,,,

maven 사용하여 build는 처음이라 삽질 좀 했다,,,

1. build file name
build file name에 버전 정보를 삭제하고 싶은 경우 하단 코드 참고

pom.xml에 설정해주면 된다.

1
2
3
4
5
6
7
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <artifactId>yongpwi</artifactId>
   <build>
      <finalName>${project.artifactId}</finalName>
   </build>
</project>

2. jenkins build시 unmappable character for encoding ASCII error

요건 좀 삽질 했는데,,,

역시나 찾아보니 답은 있음,,,

pom.xml plugin에 encoding 설정을 해주면 해결 가능!

1
2
3
4
5
6
7
8
9
<plugins>
   <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <configuration>
         <encoding>UTF-8</encoding>
      </configuration>
    </plugin>
</plugins>
Posted in: Java, Programing Tagged: JAVA, jenkins, maven

OS X에서 APP 아이콘 변경

2016년 7월 26일 by YongPwi 1 Comment

OS X 아이콘 변경하게 되면 캐시 때문에 잘 적용이 안된다.

그래서 삽질을 좀 했다…

엄한놈 지우고,,, 엄한 경로에 아이콘 파일넣고,,,

일반적인 아이콘 변경 방법,,,

finder에서 앱 선택 후 마우스 오른쪽 버튼 클릭,,,

그리고 패키지 내용 보기

ScreenShot 163

Contents/Resources/App name.icns

상위 경로에 아이콘 파일이 일반적으로 존재,,,

저 경로에 바꾸고 싶은 아이콘으로 덮어씌우기 하면 된다,,,

혹시 모르니 작업전에 원본 백업은 필수,,,

그리고서 확인하면 적용이 안된다,,,

이럴경우 캐쉬날리는 작업을 해주면 확인 가능

1
2
3
touch /Applications/App.app
touch /Applications/App.app/Contents/Info.plist
killall Dock
Posted in: OS X, Talk Tagged: APP, icon, OS X

2016 Google I/O Keynote 정리

2016년 7월 18일 by YongPwi Leave a Comment
  • 구글플레이를 통해 설치 된 안드로이드 앱 650억개
  • 구글 어시스턴트
    • 개개인 맞춤형 구글 목표
    • 인공지능 자연어 처리 기술, 기계학습등 활용
    • 대화형 음성지원 앱
    • 인물 검색, 영화 예매등 가능
    • 스마트폰, 태블릿, 안드로이드웨어 모두 이용
  • 구글 홈
    • 생활에 접목시킨 기기
    • 구글나우 처럼 음성인식하여 정보 얻을수 있음
    • ‘헤이 구글’을 통해 일정, 메모 등록 및 구글 홈에 연결된 기기 제어 가능
    • 아마존 에코(음성인식 스피커) 대응
  • 알로, 듀오
    • 알로 : 구글 어시스턴트가 포함된 메세징 앱
      • 지난 대화 기반으로 보낼 답변 제안
      • 대화 중 언제든지 채팅봇을 통해 검색결과, 영화 상영 정보 등을 지원 받을 수 있음
    • 듀오 : 고성능 영상통화 앱
      • 발신시 발신자 실시간 영상이 상대방에게 전달, 연결전에 영상 확인 가능(노크노크 기능)
      • 낮은 회선 품질 상태에서도 이용 가능
      • 웹RTC(WebRTC)와 큐익(QUIC) 프로토콜을 지원
      • 통화는 암호화 하여 개인 정보 보호
      • 두 서비스 모두 전화번호 기반 동작, 크로스플랫폼 지원
  • 안드로이드
    • 퍼포먼스(성능) 향상 : 3D 그래픽 API인 Vulkan(벌칸) 통한 게임 성능 향상
    • JIT 컴파일러 적용으로 75% 빠르게 앱 설치
    • 컴파일된 코드 크기 50% 줄어듬
    • 보안 : 저장소 권한 전체가 아닌 특정 폴더 부여 가능
    • 구글플레이에서 앱 게시 전 보안검사 진행 전세계적으로 매일 80억 개 검사
    • 운영체제 : 멀티윈도우 추가
    • 알림카드에서 답장 가능
    • 알림 중요도 추가
    • N으로 시작하는 과자 코드명 모집
  • VR
    • 데이드림 VR 플랫폼 공개
    • 차후 데이드림용 헤드셋, 컨트롤러 출시 예정
    • 가상현실 전용 구글플레이도 개발 중
    • 데이드림레디(daydream-ready) 가상현실 지원 스마트폰 개발중
    • 안드로이드 N 가상현실 모드 탑재
    • 가상현실 모드
    • 헤드트래킹 지원
    • 3D 오디오, 그래픽 지원
    • 대기시간 감소(오큘러스리프트와 동일하게 20ms 이하로 억제), 가상현실 시스템용 UI 포함(가상현실 콘텐츠 체험중전화 이메일 알림 표시)
  • 안드로이드웨어(스마트워치 운영체제)
    • 2년만에 대형 업데이트
    • 2.0 업데이트 이후 스마트폰 없이 안드로이드웨어 독자 사용 가능한 앱 등장 예정
    • 알림 구글 클라우드 메시징, 어카운트매니저 직접 받음
    • UI 개선(새로운 알림기능, 앱 실행기, 새로운 시계 페이스 추가 등)
    • Data Saver : 이동통신 네트워크 데이터 사용량 줄여줌
    • 백그라운드 데이터 사용 중지, 스트리밍 비트레이트 제한, 이미지 품질 감소, 캐싱지연 등 방식 사용
    • 사용자가 어플별 예외 처리하여 백그라운드 데이터 사용 허가
    • JAVA 8 지원
  • 인스턴트 앱
    • 앱 설치하지 않고 앱 일부 실행 가능한 인스턴트 앱
  • 파이어베이스(2.0)
    • 업데이트 이전에는 실시간 DB, 사용자 인증, 호스팅 서비스
    • 통계, 분석, 푸시, 테스트등이 가능한 종합 솔루션
    • 앱 위한 백엔드 서비스
    • 분석기능 초점(앱 사용자 행동 분석하여 앱 활용도 높이고 수익성 극대화)
    • 분석기능은 무료
    • 구글 클라우드 메시징과 통합하여 파이어베이스 클라우드 메시징(FCM) 서비스(무료)
  • 안드로이드 스튜디오
    • 2.2 버전 발표
    • 에뮬레이터 속도 2.1보다 3배 빨라짐
    • 빌드 속도 고속화, 테스트 리코딩 기능(개발자가 앱 체크하는 동시 자동 테스트 보고서 생성) 추가
    • 새로운 레이아웃 디자이너 탑재
    • 안드로이드 N 지원
    • 현재 구글플레이 등록 앱 92% 안드로이드 스튜디오 이용 개발
  • 안드로이드 오토
    • 구글이 인수한 소셜 네비게이션 서비스 웨이즈 기본 탑재
    • USB 연결만 가능했지만 이제는 wi-fi로 차와 핸드폰 연결 가능
    • 최신 자동차가 아니더라도 스마트폰 화면을 이용해서 사용 가능
  • 아라
    • 조립식이 아닌 모듈러 스마트폰으로 변경
  • TPU
    • 머신러닝에 특화된 커스텀 하드웨어
    • tensorflow(인공 지능을 위한 기계 학습 라이브러리)에 최적화
      • 데이터 플로우 그래프를 통한 풍부한 표현력
      • 코드 수정 없이 CPU/GPU 모드로 동작
      • 아이디어 테스트에서 서비스 단계까지 이용 가능
      • 계산 구조와 목표 함수만 정의하면 자동으로 미분 계산을 처리
      • Python/C++를 지원하며, SWIG를 통해 다양한 언어 지원 가능
    • 계산 정밀도는 일반 프로세서 보다 떨어지지만 머신 러닝엔 최적, 트랜지스터 활용율 극대화
    • 기존 컴퓨터 칩보다 10배 높은 전력 효율
    • 알파고에도 TPU 들어감
  • tango
    • 4년간 비밀리에 추진
    • 특수 카메라를 사용해 실제 공간을 실시간 3D영상으로 구현
    • 공간 측량, 직선, 대각선 가능, 사물이 아닌 일반 벽면, 바닥, 천장 작동
    • 구입하고 싶은 가구를 실제 공간에 가상으로 배치 가능
Posted in: Programing, Talk Tagged: Google, I/O, keynote

Object Oriented Programming SOLID

2016년 7월 7일 by YongPwi Leave a Comment

기초 공부를 생각하다 문뜩,,,

명확하게 모르는것 같아서 정리,,,

1. Single Responsibility Principle(단일 책임 원칙)

객체는 단 하나의 책임만 가져야 한다.

잘못된 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Text {
    String text;
    String author;
    int length;
 
    String getText() { ... }
    void setText(String s) { ... }
    String getAuthor() { ... }
    void setAuthor(String s) { ... }
    int getLength() { ... }
    void setLength(int k) { ... }
 
    /*methods that change the text*/
    void allLettersToUpperCase() { ... }
    void findSubTextAndDelete(String s) { ... }
 
    /*method for formatting output*/
    void printText() { ... }
}

Text class는 text를 출력하는 처리를 하고 있다. 하지만 출력 기능에 대한 변화가 이루어 지게 된다면 Text class는 계속하여 변경 되어야 한다.
Text class는 다른 역할을 하는 코드들과 결합 관계를 가지게 된다는 뜻
출력 기능을 제거하고 다른 class에서 해당 기능을 처리 하도록 하자.

수정 예

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Text {
    String text;
    String author;
    int length;
 
    String getText() { ... }
    void setText(String s) { ... }
    String getAuthor() { ... }
    void setAuthor(String s) { ... }
    int getLength() { ... }
    void setLength(int k) { ... }
 
    /*methods that change the text*/
    void allLettersToUpperCase() { ... }
    void findSubTextAndDelete(String s) { ... }
 
    /*method for formatting output*/
    void printText() { ... }
}

class Print {
    Text text;
 
    Printer(Text t) {
       this.text = t;
    }
 
    void printText() { ... }
}

2. Open / Closed(개방 폐쇠 원칙)

특정 클래스는 그 클래스를 수정하지 않으면서 확장(extension) 가능해야 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class FacebookUser{
 
    public boolean isValidUser() {
        System.out.println("FacebookUser: valid user...");
        /*Logic to valid user*/
        return true;
    }
}

// UserRegisterManager class에 addUser(TwitterUser user) method가 추가될때 추가 되어야 하는 class
//public class TwitterUser{
//
//    public boolean isValidUser() {
//        System.out.println("FacebookUser: valid user...");
//        /*Logic to valid user*/
//        return true;
//    }
//}

public class UserRegisterManager {
 
    public void addUser (FacebookUser user) {
        if(user.isValidUser()) {
            System.out.println("UserRegisterManager: valid user.");
        }
    }

    // 추가 되는 method
    public void addUser (TwitterUser user) {
        if(user.isValidUser()) {
            System.out.println("UserRegisterManager: valid user.");
        }
    }
}

UserRegisterManager class에 addUser (TwitterUser user) method가 추가되어야 한다고 가정한다.
새로운 기능에 대한 지원을 추가하기 위해 클래스를 수정해야합니다. 사실, 우리는 우리가 ClaimApprovalManager 클래스를 수정 할 때 이미 쓴 첫 번째 인스턴스에 개방 폐쇄 원칙을 위반했다. 변화가 많은 시스템일 경우 변경에 주의를 기울어야 할 부분이 많아진다.
응용 프로그램이 취약하고 확장하는 비용 발생하며 오류가 발생할 확률이 높아진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public abstract class User {
    public abstract boolean isValidUser();
}

public class FacebookUser extends User{
    public boolean isValidUser(){
        System.out.println("FacebookUser: valid user...");
        /*Logic to valid user*/
        return true;
    }
 
}

public class TwitterUser extends User{
    public boolean isValidUser(){
        System.out.println("TwitterUser: valid user...");
        /*Logic to valid user*/
        return true;
    }
 
}

public class UserRegisterManager {
    public void processClaim(User user){
        if(user.isValidUser()){
            System.out.println("UserRegisterManager: valid user");
        }
    }
 
}

3. 리스코프 치환 원칙(Liskov Substitution Principle)

서브타입은 언제나 자신이 기반타입 (base type)으로 교체할 수 있어야 한다.

LSP란 상위형 P가 있고 이걸 확장하는 하위형 C가 있을 때 P를 C로 치환할 수 있어야 한다 는 말이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class TransportationDevice {
   String name;
   String getName() { ... }
   void setName(String n) { ... }
 
   double speed;
   double getSpeed() { ... }
   void setSpeed(double d) { ... }
   
   Engine engine;
   Engine getEngine() { ... }
   void setEngine(Engine e) { ... }
 
   void startEngine() { ... }
}

class Car extends TransportationDevice {
   @Override
   void startEngine() { ... }
}

상위 코드는 문제가 없다. 자동차는 확실히 운송장치이며, 여기에 우리는 슈퍼 클래스의 startEngine() method를 override 하였다.

다른 운송장치를 추가 해보도록 하자.

1
2
3
4
class Bicycle extends TransportationDevice {
   @Override
   void startEngine() /*problem!*/
}

추가한 운송장치를 보면 자전거는 엔진을 가지고 있지 않으며 엔진을 시작 할 수 없다.

수정을 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class TransportationDevice {
   String name;
   String getName() { ... }
   void setName(String n) { ... }
 
   double speed;
   double getSpeed() { ... }
   void setSpeed(double d) { ... }

   //engine 관련 정보 삭제
}

class DevicesWithoutEngines extends TransportationDevice {  
   void startMoving() { ... }
}

class DevicesWithEngines extends TransportationDevice {  
   Engine engine;
   Engine getEngine() { ... }
   void setEngine(Engine e) { ... }
 
   void startEngine() { ... }
}

class Car extends DevicesWithEngines {
   @Override
   void startEngine() { ... }
}

class Bicycle extends DevicesWithoutEngines {
   @Override
   void startMoving() { ... }
}

4.Interface Segregation Principle(인터페이스 분리 원칙)
client는 자신이 사용하는 interface의 변경으로 자신을 변경하는 것은 용납하지만 자신과 관련되지 않는 interface의 변화로 인해 자신이 변하는 것은 용납해서는 안된다.
하나의 일반적인 interface 보다 구체적인 여러 개의 Interface가 낫다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public interface Toy {
    void setPrice(double price);
    void setColor(String color);
    void move();
    void fly();
}

public class ToyHouse implements Toy {
    double price;
    String color;
   
    @Override
    public void setPrice(double price) {
        this.price = price;
    }
   
    @Override
    public void setColor(String color) {
        this.color=color;
    }
   
    @Override
    public void move(){}
    @Override
    public void fly(){}    
}

상위 코드를 보면 Toy interface를 상속받은 ToyHouse는 move(), fly() methode를 사용하지 않아도 구현해야만 한다.
이러한 위반은 코드의 가독성과 개발자를 혼란스럽게 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
public interface Toy {
     void setPrice(double price);
     void setColor(String color);
}

// interface를 작게 분리한다.
public interface Movable {
    void move();
}

public interface Flyable {
    void fly();
}

인터페이스를 작게 분리 하였으면 각 필요한 class의 기능들을 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ToyHouse implements Toy {
    double price;
    String color;
 
    @Override
    public void setPrice(double price) {
 
        this.price = price;
    }
    @Override
    public void setColor(String color) {
 
        this.color=color;
    }
    @Override
    public String toString(){
        return "ToyHouse: Toy house- Price: "+price+" Color: "+color;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class ToyPlane implements Toy, Movable, Flyable {
    double price;
    String color;
 
    @Override
    public void setPrice(double price) {
        this.price = price;
    }
 
    @Override
    public void setColor(String color) {
        this.color=color;
    }
    @Override
    public void move(){
 
        System.out.println("ToyPlane: Start moving plane.");
    }
    @Override
    public void fly(){
 
        System.out.println("ToyPlane: Start flying plane.");
    }
    @Override
    public String toString(){
        return "ToyPlane: Moveable and flyable toy plane- Price: "+price+" Color: "+color;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class ToyBuilder {
    public static ToyHouse buildToyHouse(){
        ToyHouse toyHouse=new ToyHouse();
        toyHouse.setPrice(15.00);
        toyHouse.setColor("green");
        return toyHouse;
        }
    public static ToyCar buildToyCar(){
        ToyCar toyCar=new ToyCar();
        toyCar.setPrice(25.00);
        toyCar.setColor("red");
        toyCar.move();
        return toyCar;
    }
    public static ToyPlane buildToyPlane(){
        ToyPlane toyPlane=new ToyPlane();
        toyPlane.setPrice(125.00);
        toyPlane.setColor("white");
        toyPlane.move();
        toyPlane.fly();
        return toyPlane;
    }
}

5.Dependency Inversion Principle(의존 역전 원칙)

구현 클래스가 아닌 인터페이스 타입을 사용하라는 규칙이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class LightBulb {
    public void turnOn() {
        System.out.println("LightBulb: Bulb turned on...");
    }
    public void turnOff() {
        System.out.println("LightBulb: Bulb turned off...");
    }
}

public class ElectricPowerSwitch {
    public LightBulb lightBulb;
    public boolean on;
    public ElectricPowerSwitch(LightBulb lightBulb) {
        this.lightBulb = lightBulb;
        this.on = false;
    }
    public boolean isOn() {
        return this.on;
    }
    public void press(){
        boolean checkOn = isOn();
        if (checkOn) {
            lightBulb.turnOff();
            this.on = false;
        } else {
            lightBulb.turnOn();
            this.on = true;
        }
 
    }
}

상위 코드에서 ElectricPowerSwitch class에 LightBulb class의 참조 필드를 사용하였다. ElectricPowerSwitch 생성자에서 lightBulb 객체를 생성하고 필드에 할당한다. 그 다음 ElectricPowerSwitch의 상태를 반환하는 isOn() method를 사용하였다. press() method에 state를 기준으로 turnOn() 및 turnOff() method를 호출한다.
상위 코드로 우리는 switch를 끄고 켤수 있다. 그러나 고레벨에 있는 ElectricPowerSwitch class는 저레벨의 LightBulb class를 직접 참조한다. 고레벨과 저레벨의 차이는 여러가지 일을 복합적으로 한다면 고레벨(ex:파일을 불러와 암호화 여부를 확인하고 backup 폴더에 저장하고 경로를 json으로 전달 해준다.), 저레벨은 단순한 기능만을 한다(ex:파일에서 바이트 데이터를 읽어온다.)

문제를 해결하기 위해서 인터페이스를 만들고 ElectricPowerSwitch, LightBulb classes를 구현한다.

1
2
3
4
5
6
7
8
9
public interface Switch {
    boolean isOn();
    void press();
}

public interface Switchable {
    void turnOn();
    void turnOff();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class ElectricPowerSwitch implements Switch {
    public Switchable client;
    public boolean on;
    public ElectricPowerSwitch(Switchable client) {
        this.client = client;
        this.on = false;
    }
    public boolean isOn() {
        return this.on;
    }
   public void press(){
       boolean checkOn = isOn();
       if (checkOn) {
           client.turnOff();
           this.on = false;
       } else {
             client.turnOn();
             this.on = true;
       }
 
   }
}
1
2
3
4
5
6
7
8
9
10
11
public class LightBulb implements Switchable {
    @Override
    public void turnOn() {
        System.out.println("LightBulb: Bulb turned on...");
    }
 
    @Override
    public void turnOff() {
        System.out.println("LightBulb: Bulb turned off...");
    }
}
1
2
3
4
5
6
7
8
9
10
11
public class Fan implements Switchable {
    @Override
    public void turnOn() {
        System.out.println("Fan: Fan turned on...");
    }
 
    @Override
    public void turnOff() {
        System.out.println("Fan: Fan turned off...");
    }
}

Single Responsibility Prinsciple

Open / Closed

Liskov Substitution Principle

Interface Segregation Principle

Dependency Inversion Principle

Posted in: Java, Programing Tagged: JAVA, OOP, SOLID

Calendar

7월 2016
일 월 화 수 목 금 토
« 6월   11월 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Recent Posts

  • ubuntu bastion 설정
  • Spring Boot properties 암호화
  • Git Repository Bitbucket과 Issue Tracker Redmine 연동 설정
  • Spring Security 동일 session 제어
  • Spring @Mock, @Mockbean, @InjectMock

Recent Comments

  • pzotov (Ubuntu 14.04에서 Sonarqube 6.7.1 service 등록)
  • cours de theatre paris (AWS ELB와 Auto Scaling 연동, nginx)
  • bayern munich (IntelliJ EAP Font rendering)
  • camiseta del chelsea (OS X에서 APP 아이콘 변경)
  • cheap football shirts replica (jQuery Ajax에서 json Array 직렬화)

Copyright © [the-year] [site-link].

Powered by [wp-link] and [theme-link].