try (InputStream in) {

 in.read(buff);

// auto autocloseable 이 호출된다. - finally 에서 닫을 필요가 없다.

catch (Exception e) {

  e.getMessage();

}


'java' 카테고리의 다른 글

Java 8 신기능 정리 - Lambda Expression  (0) 2014.07.01
Java7 의 신기능 정리  (0) 2014.07.01
코드 품질 관리  (0) 2014.04.17
Java Apn 샘플코드  (0) 2014.04.14
if 비교 연산자 우선순위  (0) 2014.04.01

Singleton Pattern

 - 유일한 시스템 컴 포넌트를 선언

1. 드래코니언 동기화 

 - 성능적으로 이슈

 - 멀티쓰레드 이슈

2. 더블 락킹 (Double Locking)

 - 성능적으로 이슈 (1.5이하에서 사용)

3. Singleton Holder

 - 1.5 이상. 

4. 한정적 메모리의 Singleton - WeakReference

 - VM이 한정적일때 사용

 - 가비지 콜렉터의 대상이 됨.

5. Enum을 이용한 생성 (가장 추천)

  1. enum Singleton {
  2.         // Thread Safe 하다. 하나만 있음을 보장한다.
  3.         // Serialization 에서도 안전하다.
  4.         // Reflection 에 대해서도 보장한다.
  5.         // - Effective Java 에 소개.
  6.         // - 유럽에서 사용한다.
  7.         // - 많이 알려지지 않았지만 Java언어에서 보장하는 좋은 방법
  8.         INSTANCE;
  9.        
  10.         public Singleton getInstance() {
  11.                 return INSTANCE;
  12.         }
  13. }


  1. // Singleton
  2. // 유일한 시스템 컴포넌트를 설계할 때 사용.
  3. class CursorOld {
  4.         // DCL.
  5.         private static volatile CursorOld INSTANCE = null; // 두개이상 존재 가능성이 있으므로 volatile 선언
  6.  
  7.         private CursorOld() {
  8.  
  9.         }
  10.  
  11.         // public static Cursor getInstance() {
  12.         // 1. Draconian 동기화 // 성능적으로 이슈가 있다.
  13.         // public static synchronized Cursor getInstance() {
  14.         // 2. Double checked locking
  15.         // 성능적으로 떨어짐 (1.5 이하)
  16.         public static CursorOld getInstance() {
  17.                 if (INSTANCE == null) {
  18.                         // 멀티쓰레드 안정성이 없다.
  19.                         synchronized (CursorOld.class) { //성능 이슈를 발생
  20.                                 if (INSTANCE == null) {
  21.                                         INSTANCE = new CursorOld();
  22.                                 }
  23.                         }
  24.                 }
  25.                 return INSTANCE;
  26.         }
  27. }
  28.  
  29. // 사용되지 않을 수도 있다. 시작부터 끝까지 존재한다.
  30. // lazy initialize 가 필요할 수도있다. 성능적으로 도움
  31.  
  32. // for jdk 1.5 이상.
  33. class Cursor {
  34.         // 만들면서 초기화.
  35.         public static final Cursor INSTANCE = new Cursor();
  36.  
  37.         // 1. public
  38.         private Cursor() {
  39.         }
  40.  
  41.         // 2. static factory method
  42.         public static Cursor getInstance() { // 메소드로 접근해도 느리지 않다.
  43.                 return INSTANCE;
  44.         }
  45. }
  46.  
  47. // Initialization On Demand Holder Idiom
  48. // lazy initialize.
  49. class SingletonHolder {
  50.         private SingletonHolder() {
  51.  
  52.         }
  53.  
  54.         private static class SingleHolder {
  55.                 private static final SingletonHolder INSTANCE = new SingletonHolder();
  56.         }
  57.  
  58.         // 내부적으로 인스턴스가 호출될때 처음 접근, 그때 생성을 보장
  59.         public static SingletonHolder getInstance() {
  60.                 return SingleHolder.INSTANCE;
  61.         }
  62. }
  63.  
  64. // weak reference를 통한 해제 가능한 Singleton
  65. // JavaVM이 한정된 메모리를 가지고 있을 때 유용하다.
  66. //메모리 부족시 지웠다가 없으면 다시 생성
  67. // for android
  68. class Singleton {
  69.         static private WeakReference<Singleton> singleton;
  70.        
  71.         public Singleton getInstance() {
  72.                 Singleton m = singleton.get();
  73.                 if(!= null) {
  74.                         return m;
  75.                 }
  76.                 synchronized (Singleton.class) {
  77.                         m = singleton.get();
  78.                         if(!= null) {
  79.                                 return m;
  80.                         }
  81.                         m = new Singleton();
  82.                         singleton = new WeakReference<Singleton>(m);
  83.                        
  84.                 }
  85.                 return m;
  86.         }
  87. }


'java > design_pattern' 카테고리의 다른 글

Template Method Pattern  (0) 2014.06.27
Adapter 패턴  (0) 2014.06.27
Design Pattern 기본 원칙  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17
Java Beans Pattern  (0) 2014.06.17

OCP (Open-Close Principle)

수정에는 닫혀있음, 확장에는 열려있음

 - 인터페이스 기반으로 설계

SRP (Single Responsibility Principle)

단일책임의 법칙

 - 하나의 클래스가 하나 이상의 책임을 맡게되면 결합도가 커진다.

DIP (Dependency Inversion Principle)

의존관계 역전의 법칙

 - 구체클래스에 의존하지 말고 인터페이스에 의존

 -- ISP (Interface Segregation Principle)

 -- 인터페이스 분리의 법칙

LSP (Liskov's Substitution Principle)

리스코프의 치환 법칙

  -- 공통의 기능을 상속을 받아 필요한 기능은 치환

'java > design_pattern' 카테고리의 다른 글

Adapter 패턴  (0) 2014.06.27
Java Singleton 선언하는법  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17
Java Beans Pattern  (0) 2014.06.17
Telescoping Pattern  (0) 2014.06.17

장점

 - 코드의 가독성이 높다.

 - 생성하는 객체를 불변객체로 만들기 쉽다.

단점

 - 빌더의 생성비용이 소모된다.

 


이클립스에는 빌더를 따로 추가해주는 자동 생성 툴은 없다. 코드 작성이 까다롭다.

생성자에 필수 값을 넣고 빌더에 Optional한 값을 넣자.


  1. class NutiritionFactsBuilder {
  2.         private final int servingSize;
  3.         private final int servings;
  4.  
  5.         // optional
  6.         private final int calories;
  7.         private final int fat;
  8.         private final int sodium;
  9.         private final int carbohydrate;
  10.  
  11.         private NutiritionFactsBuilder(Builder builder) {
  12.                 servingSize = builder.servingSize;
  13.                 servings = builder.servings;
  14.                 calories = builder.calories;
  15.                 fat = builder.fat;
  16.                 sodium = builder.sodium;
  17.                 carbohydrate = builder.carbohydrate;
  18.         }
  19.  
  20.         @Override
  21.         public String toString() {
  22.                 return "NutiritionFactsBuilder [servingSize=" + servingSize
  23.                                 + ", servings=" + servings + ", calories=" + calories
  24.                                 + ", fat=" + fat + ", sodium=" + sodium + ", carbohydrate="
  25.                                 + carbohydrate + "]";
  26.         }
  27.  
  28.         public static class Builder {
  29.                 private final int servingSize;
  30.                 private final int servings;
  31.  
  32.                 // optional
  33.                 private int calories = 0;
  34.                 private int fat = 0;
  35.                 private int sodium = 0;
  36.                 private int carbohydrate = 0;
  37.  
  38.                 public Builder(int servingSize, int servings) {
  39.                         this.servingSize = servingSize;
  40.                         this.servings = servings;
  41.                 }
  42.  
  43.                 public Builder calories(int value) {
  44.                         calories = value;
  45.                         return this; // 체이닝 기법을 사용하기 위함.
  46.                 }
  47.  
  48.                 public Builder fat(int value) {
  49.                         fat = value;
  50.                         return this;
  51.                 }
  52.  
  53.                 public Builder sodium(int value) {
  54.                         sodium = value;
  55.                         return this;
  56.                 }
  57.  
  58.                 public Builder carbohydrate(int value) {
  59.                         carbohydrate = value;
  60.                         return this;
  61.                 }
  62.  
  63.                 public NutiritionFactsBuilder build() {
  64.                         return new NutiritionFactsBuilder(this);
  65.                 }
  66.  
  67.         }
  68. }
  69.  
  70. public class Ex3 {
  71.         public static void main(String... args) {
  72.                 NutiritionFactsBuilder obj = new NutiritionFactsBuilder.Builder(100,
  73.                                 200).calories(10).carbohydrate(300).fat(10).build();
  74.                 System.out.println(obj.toString());
  75.         }
  76. }


'java > design_pattern' 카테고리의 다른 글

Java Singleton 선언하는법  (0) 2014.06.18
Design Pattern 기본 원칙  (0) 2014.06.18
Java Beans Pattern  (0) 2014.06.17
Telescoping Pattern  (0) 2014.06.17
프론트 컨트롤러 패턴  (0) 2013.05.07

장점

 - 명료하다.

 - 이해하기가 쉽다.

단점

 - 객체가 불완전한 상태로 생성될 수 있다.

 - 멀티쓰레드 사용 시 불완전한 객체의 이슈가 발생할 수 있다.

 

set들의 향연을 보다보면 실수가 생길법도 하다.

가급적 지양하자.


  1. class NutiritionFactsBeans {
  2.         private int servingSize;
  3.         private int servings;
  4.  
  5.         // optional
  6.         private int calories;
  7.         private int fat;
  8.         private int sodium;
  9.         private int carbohydrate;
  10.        
  11.         public void setServingSize(int servingSize) {
  12.                 this.servingSize = servingSize;
  13.         }
  14.         public void setServings(int servings) {
  15.                 this.servings = servings;
  16.         }
  17.         public void setCalories(int calories) {
  18.                 this.calories = calories;
  19.         }
  20.         public void setFat(int fat) {
  21.                 this.fat = fat;
  22.         }
  23.         public void setSodium(int sodium) {
  24.                 this.sodium = sodium;
  25.         }
  26.         public void setCarbohydrate(int carbohydrate) {
  27.                 this.carbohydrate = carbohydrate;
  28.         }
  29.         @Override
  30.         public String toString() {
  31.                 return "NutiritionFactsBeans [servingSize=" + servingSize
  32.                                 + ", servings=" + servings + ", calories=" + calories
  33.                                 + ", fat=" + fat + ", sodium=" + sodium + ", carbohydrate="
  34.                                 + carbohydrate + "]";
  35.         }
  36.        
  37. }
  38.  
  39. public class Ex2 {
  40.         public static void main(String... args) {
  41.                 NutiritionFactsBeans cola = new NutiritionFactsBeans();
  42.                 cola.setCalories(240);
  43.                 cola.setCarbohydrate(100);
  44.                 cola.setFat(10);
  45.                 cola.setServings(11);
  46.                 cola.setServingSize(99);
  47.                 cola.setSodium(20);
  48.                 System.out.println(cola.toString());
  49.         }
  50. }


'java > design_pattern' 카테고리의 다른 글

Design Pattern 기본 원칙  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17
Telescoping Pattern  (0) 2014.06.17
프론트 컨트롤러 패턴  (0) 2013.05.07
디자인패턴 개인 메모.  (0) 2012.03.29
장점
 - 생성에 대한 일관성을 유지한다.
단점
 - 가독성이 좋지않다.
 - 런타임 오류가 발생할 수 있다. (에러잡기가 어렵다.)

생성자에 딸린 몇개씩 추가되는 인자들을 확인하자.
3~4개정도는 쉽게 만들 수 있지만
그 이상 시 순서와 채워넣는 인자를 잘못넣어 실수가 발생할 수 있다.
 
  1. class NutiritionFacts {
  2.         private final int servingSize;
  3.         private final int servings;
  4.  
  5.         // optional
  6.         private final int calories;
  7.         private final int fat;
  8.         private final int sodium;
  9.         private final int carbohydrate;
  10.  
  11.         public NutiritionFacts(int servingSize, int servings, int calories,
  12.                         int fat, int sodium, int carbohydrate) {
  13.                 this.servingSize = servingSize;
  14.                 this.servings = servings;
  15.                 this.calories = calories;
  16.                 this.fat = fat;
  17.                 this.sodium = sodium;
  18.                 this.carbohydrate = carbohydrate;
  19.         }
  20.  
  21.         public NutiritionFacts(int servingSize, int servings) {
  22.                 this(servingSize, servings, 0000);
  23.         }
  24.  
  25.         public NutiritionFacts(int servingSize, int servings, int calories) {
  26.                 this(servingSize, servings, calories, 000);
  27.         }
  28.  
  29.         public NutiritionFacts(int servingSize, int servings, int calories, int fat) {
  30.                 this(servingSize, servings, calories, fat, 00);
  31.         }
  32.  
  33.         public NutiritionFacts(int servingSize, int servings, int calories,
  34.                         int fat, int sodium) {
  35.                 this(servingSize, servings, calories, fat, sodium, 0);
  36.         }
  37.  
  38.         @Override
  39.         public String toString() {
  40.                 return "NutiritionFacts [servingSize=" + servingSize + ", servings="
  41.                                 + servings + ", calories=" + calories + ", fat=" + fat
  42.                                 + ", sodium=" + sodium + ", carbohydrate=" + carbohydrate + "]";
  43.         }
  44. }


'java > design_pattern' 카테고리의 다른 글

Design Pattern 기본 원칙  (0) 2014.06.18
Builder Pattern  (0) 2014.06.17
Java Beans Pattern  (0) 2014.06.17
프론트 컨트롤러 패턴  (0) 2013.05.07
디자인패턴 개인 메모.  (0) 2012.03.29

API Key와 Registraion Id가 정확한지 테스트를 하기 위한 테스트 쉘 스크립트.

응답 값을 확인


#!/bin/bash


api_key=$1

reg_id=$2

echo "api_key= $1"

echo "reg_id= $2"


curl --header "Authorization: key=$api_key" --header Content-Type:"application/json" https://android.googleapis.com/gcm/send  -d "{\"registration_ids\":[\"$reg_id\"],\"data\":{\"code\":123}}"

echo


'java > test' 카테고리의 다른 글

JMeter 테스트 생성  (0) 2014.08.19
jmeter 테스트 - JavaRequest, Remote Start  (0) 2013.04.15
jmeter 테스트 - 생성  (0) 2013.04.15



출처: http://www.slideshare.net/sunhyouplee/c-33426459

C++ 코드 품질 관리 비법

(C++기준 이나 모든 코드에 통용된다고 생각됨)


괄호는 개인적 리뷰이다.

Legible

 - 보기 좋은 코드

(좋은 설계가 좋은 코드를 만든다.)

 - 템플릿을 준수하고 도구를 사용하자 

(Google Code Template, PMD 등)

Flexible

 - 유연한 코드

(설계구조 파악, 코드 사용 패턴 파악)

Testable

 - 테스트하기 쉬운 코드

(TDD(Test Driven Development) 기반으로 제작하면 좋지만 적어도 테스트 코드는 작성하며 진행하자.)

Economic

 - 컴퓨터 자원을 아끼자

(무분별한 for문, 재귀문, 닫지않은 Stream 등 GC가 지원하지 않는 자원반환. 특히 재귀함수는 조심에 조심을 기울이자. 무한루프에 잘 빠진다.)

Compliant

 - 다양한 의미가 있으나 의견 일치 정도로..

(기능 구현 시 코드에 푹 빠지게 되면 완성품이 나왔을때 엉뚱한 결과물에 의문에 빠지는 수가 생긴다. 끊임없이 의견을 나누어 상대방의 생각과 내 생각을 동기화(Sync) 하자.)

'java' 카테고리의 다른 글

Java7 의 신기능 정리  (0) 2014.07.01
Java 7 try catch 문법. autocloseable  (0) 2014.06.20
Java Apn 샘플코드  (0) 2014.04.14
if 비교 연산자 우선순위  (0) 2014.04.01
abstract 와 interface 차이  (0) 2014.03.26

Javapns를 사용한 apn 샘플코드

1. deviceToken을 하나씩 활용했는데 list로 활용하는게 좀더 실용적이다.

2. advanced payload를 활용함. 기존 Push 보다 좀더 기능성이 좋다. 

3. 전송 실패시 exception이 잡히지 않는다. 별도로 처리가 필요함.


@Service

@Scope("singleton")

public class ApnConnector {

    @Value("${apn.cert.path}") //인증서 경로

    private String apnCertPath;

    @Value("${apn.cert.password}") //인증서 패스워드

    private String apnCertPassword;


    private Logger logger = LoggerFactory.getLogger(getClass());


    public boolean sendMessage(String deviceToken, String locKey, List<String> args, String customMessage) throws Exception {

        try {

            PushNotificationPayload adPayload = PushNotificationPayload.complex();

            adPayload.addCustomAlertLocKey(locKey);

            adPayload.addCustomAlertLocArgs(args);

            adPayload.addCustomDictionary("msg", customMessage);

            PushedNotifications noti = Push.payload(adPayload, apnCertPath, apnCertPassword, false, new String[] {deviceToken});

            logger.debug("sendMessage success : " + noti.getSuccessfulNotifications().size());

            logger.debug("sendMessage fail : " + noti.getFailedNotifications().size());

        } catch (CommunicationException | KeystoreException e) {

            logger.error("sendMessage faild. :" + e.getMessage());

            throw new Exception();

        } catch (Exception e) {

            logger.error("sendMessage faild. :" + e.getMessage());

            throw new Exception();

        }

        return true;

    }


}



'java' 카테고리의 다른 글

Java 7 try catch 문법. autocloseable  (0) 2014.06.20
코드 품질 관리  (0) 2014.04.17
if 비교 연산자 우선순위  (0) 2014.04.01
abstract 와 interface 차이  (0) 2014.03.26
객체를 인자로 보내서 값을 설정하는것  (0) 2014.03.18

설치에 애먹었던 ipython notebook 로그


1. python 설치

https://www.python.org/download/


2. 시스템 환경변수 path에 설치경로 추가

C:\Python27;C:\Python27\Scripts;C:\Python27\Lib\site-packages


3. get-pip 설치

https://raw.github.com/pypa/pip/master/contrib/get-pip.py

(다운로드 또는 복사 후 파일 생성 후 해당경로에서)

>python get-pip.py


4. 설치한 pip를 활용한 스크립트 설치

pip install distribute

pip install pyreadline

pip install ipython

여기까지는 ipython을 실행시키기 위한 설치

아래는 notebook설치를 위한 스크립트

pip install pyzmq

pip install jinja2

pip install tornado



5. ascii 코드 에러를 발생시키는 요인 차단

C:\Python27\Lib\mimetypes.py

248라인 변경

except (UnicodeEncodeError, UnicodeDecodeError):


+ Recent posts