2016년 11월 30일 수요일

[javascript] get parameter from url

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = null;
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                return arrParamValues[i];
            }
        }
        return null;
    } else {
     return null;
    }
}

2016년 11월 16일 수요일

라즈베리파이3 (raspberry pi 3) 및 적외선 카메라 개봉기

개인적으로 집에서 컨텐츠를 만들기 위해서

그동안 눈 여겨보던 라즈베리파이를 구입하게 되었습니다.

어떤 키트를 살까? 어떤 모듈을 살까? 하고

몇일 고민한 끝에 라즈베리파이 키트를 구입하였습니다.

모델은 라즈베리파이3 이며

랜선, Micro SD카드, SD카드 리더기, HDMI 케이블, 어댑터, 

투명 케이스, 키트보관함 구성으로 구입하였습니다.





택배를 받았을 때 구성품 모습입니다.

1차적으로는 테스트 및 주요 기능 여부 확인을 위해

적외선 카메라 모듈 및 적외선 LED를

같이 구매하였습니다.

적외선 카메라 모듈의 경우 적외선 LED를 켜지 않을 경우

주간 카메라로 사용이 가능합니다.

일반 카메라, 적외선 카메라를 따로 구입하지 않으셔도 됩니다.


적외선 카메라 모듈 및 적외선 LED 모습입니다.

다음 포스팅은 라즈베리파이 구동 및 

카메라 테스트를 진행하겠습니다.




2016년 7월 12일 화요일

VisualVM jstatd

./rmiregistry 1099

./jstatd -p 1099  -J-Djava.security.policy=tools.policy -J-Djava.rmi.server.hostname=10.10.0.0

2016년 7월 11일 월요일

elasticsearch search query


GET _search
{
  
  "query": {
    "bool": {
      "must" : [
        { 
          "exists": { 
            "field": "exception.exception_class" 
          }
        },
        
        {
          "match": {
            "level": {
              "query" : "INFO"
            }
          }
        },
               
        {
          "range": {
            "@timestamp" : {
              "gte" : "now-1h",
              "lte" : "now",
              "time_zone": "+09:00"
            }
          }
        }
        
        
      ]
    }
  }
}

2016년 7월 6일 수요일

logstash output index naming daily

기존의 log4j 로그를 logstash를 이용하여 elasticsearch에 Indexing 하는 작업을 진행 하던 중 Index를 일별로 나누어서 관리를 하기 위해서 log-YYYY-MM-dd 형식으로 쌓기로 결정을 하게 되었음.

우선 아래의 depandency를 추가하여 기존 log4j 로그를 json형식으로 쌓이도록 하였음.

 net.logstash.log4j
 jsonevent-layout
 1.7

json형식으로 쌓인 로그를 아래와 같이 설정을 하였음

input {
  file {
    path => "/*"
    start_position => "beginning"
    type => "log4j-json"
    codec => json
  }
}

output {
  elasticsearch {
    index => "log-%{+YYYY-MM-dd}"
  }
}

위와 같이 설정을 하게 될 경우 logstash에서 output되는 current_time이 인덱스 명으로 사용이 되어 일 별 인덱스 생성이 가능하였다.

만약 실시간으로 로그를 전송하는 경우가 아니라 주기적으로 로그를 전송하게 된다면 index명에 들어가는 일자가 맞는 것일까?
로그가 실제로 쌓인 시간을 인덱스 날짜로 사용을 할 필요가 생겨 구글링을 통하여 아래와 같이 설정을 하였음

input {
  file {
    path => "/*"
    start_position => "beginning"
    type => "log4j-json"
    codec => json
  }
}

filter {
  ruby {
    code => "event['index_day'] = Time.at(event['@timestamp'].to_i).strftime('%Y-%m-%d')"
  }
}

output {
  elasticsearch {
    index => "log-%{index_day}"
  }
}

필터를 통하여 index_day라는 키에 @timestamp 값을 원하는 포맷으로 변경 한 값을 주어 index명에서 사용을 함으로서

로그에 있는 시간을 기준으로 index 설정이 가능해졌다.


====== 추가 ======

@timestame의 경우 한국 시간으로 표시 되지 않고 09:00 시간을 뺀 시간을 알려주고 있어 index명에서 한국 기준이 아닌 경우가 있어 아래와 같이 수정하여 해결함

code => "event['index_day'] = Time.at(event['@timestamp'].to_i).localtime.strftime('%Y-%m-%d')"


2016년 6월 27일 월요일

spring 4.x + jackson json response

Spring버전을 3.x 에서 4.x로 버전을 올리면서 발생 한 이슈 가운데 한가지로
@ResponseBody를 이용하여 rest api 결과를 돌려주고 있었는데
JSON으로 잘 뽑히던 부분이 XML로  뽑히는 현상이 발생하여
구글링하여 아래와 같이 수정하였음



  com.fasterxml.jackson.core
  jackson-core
  2.7.3



  com.fasterxml.jackson.core
  jackson-databind
  2.7.3


pom.xml에 위의 라이브러리를 추가하고 기존의 jackson 라이브러리를 제거하였음

  
    
      
        
          text/html;charset=UTF-8
          application/json;charset=UTF-8
        
      
      
    
  


spring-mvc에 위의 annotation-driven을 추가하여 해결하였음

2016년 6월 23일 목요일

Redis 런타임 시 Replication (Master/Slave) 변경

Redis 운영 중 하드웨어 작업으로 인해 Master / Slave 를 변경 해야하는 이슈가 발생하여 아래와 같이 처리하였음

requirepassword 는 설정하지 않아 패스워드 없이 진행하였음

- 구성 -
S1 : Master
S2 : Slave

1. S1 부터 작업을 하게 되어 S2 를 Master로 변경하였음

# redis-cli slaveof no one


2. S1 작업 완료 후 S1을 S2의 Slave로 변경

# redis-cli slaveof xxx.xxx.xxx.xxx(s2) 6379
# redis-cli config set repl-ping-slave-period 10
# redis-cli config set repl-timeout 60

3. info로 확인하면서 동기화가 다되었을 경우 S1을 다시 Master로 변경하였음

# redis-cli slaveof no one

4. S2 작업 완료 후 S2를 S1의 Slave로 변경

# redis-cli slaveof xxx.xxx.xxx.xxx(s1) 6379
# redis-cli config set repl-ping-slave-period 10
# redis-cli config set repl-timeout 60

5. info로 확인하면서 동기화가 잘되는지 확인하고 종료 하였음

처음 해보는 작업이라 인터넷으로 검색 후 진행하였음

2016년 6월 22일 수요일

linux 디렉토리 용량 확인 du

1. 지정한 디렉토리에 존재하는 모든 파일의 용량을 표시
# du /etc

2. 지정한 디렉토리에 존재하는 모든 파일을 포함 한 용량을 표시
# du -s /etc

3. 2번의 결과에 읽기 쉽게 용량 단위를 붙여서 표시 (human-readable : 여기저기 많이 쓰임)
# du -sh /etc

2016년 6월 17일 금요일

[CSS] number input arrow hide

number 타입 input의 상하 화살표를 숨기는 CSS
input[type=number]::-webkit-inner-spin-button, 
input[type=number]::-webkit-outer-spin-button { 
  -webkit-appearance: none; 
  margin: 0; 
}

2016년 5월 13일 금요일

[Java/Javascript] URL 파라매터 GET 으로 전송시 한글 깨짐 현상

GET 방식으로 URL 파라매터를 넘길 때 한글이 깨지는 현상이 발생 할 때 아래와 같이 처리하면 된다.


var url = "./test.do?name="+encodeURI(encodeURIComponent("한글"));
location.href = url;

인코딩하여 넘긴 파라매터를 JAVA에서 받아서 아래와 같이 디코딩 하여 사용하면 된다.

String name = URLDecoder.decode(request.getParameter("name"),"UTF-8");

2016년 5월 4일 수요일

[Spring] error-page 설정 (web.xml)

웹 어플리케이션 개발 시 http error 발생 시 tomcat의 기본 페이지를 원하는 페이지로 변경하기 위해서는 web.xml에 아래와 같이 설정하면 된다.

    404
    /error.jsp

원하는 error-code 에 따른 페이지를 설정 할 수 있다.

[java] Collections.sort Asc/Desc

/** Ascending **/
static class AscCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getXXX().compareTo(arg1.getXXX());
    }
}
/** Descending **/
static class DescCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg1.getXXX().compareTo(arg0.getXXX());
    }
} 
/** Ascending **/
static class AscCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getNo() < arg1.getNo() ? -1 : arg0.getNo() > arg1.getNo() ? 1:0;
    }
}
/** Descending **/
static class DescCompare implements Comparator {
    @Override
    public int compare(T arg0, T arg1) {
        // TODO Auto-generated method stub
        return arg0.getNo() > arg1.getNo() ? -1 : arg0.getNo() < arg1.getNo() ? 1:0; 
    } 
}

[JSTL] Get collection's length

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

${fn:length(list)}

2016년 4월 29일 금요일

java generic 제네릭 타입

1. 제네릭 클래스
public class ArrayList<E> extends AbstractList<E> implements List<E> ...{ 
public boolean add(E o)
}
E(Element): 컬렉션에 저장하고 컬렉션에서 리턴할 원소의 유형 ex) String, int, ...
클래스 생성시 설정해준 E 값으로 클래스 안에서 사용 
ex) ArrayList<String> a = new ArrayList<String>;
2. 제네릭 메소드
     
2.1 public <T extends Animal> void takeThing(ArrayList<T> list) 
- Animal 클래스의 확장(extends)이나 구현(implements)만 객체로 받을 수 있다.
- public void takeThing(ArrayList<Animal> list) 과 다른 점은 이 메소드의 list 파라미터는
ArrayList<Animal> 만 가능하다 하지만 위의 경우 ArrayList<Animal> 뿐만아니라 
Animal 클래스를 상속한 ArrayList<Dog>, ArrayList<Cat> 등도 다 가능하다.  
     2.2 public static <T extends Comparable<? super T>> void sort(List<T> list)
- sort 메서드의 파라미터 List의 인자가 Comparable 클래스 유형이여야 한다.
- <? super T> 이건 Comparable의 유형 매개 변수가 T 또는 T의 상위 유형이어야 한다는 것 

string vs stringbuilder vs stringbuffer

String
String 값의 비교(==, equals, compareTo, Collator 클래스)
1. ==                        -> 값과 상관없이 같은 오브젝트인지 확인
2. equals                    -> 값이 같은지 확인
3. compareTo              -> int 값 반환 (같으면 0 다르면 크기에 따라 음수와 양수로 나누어짐)
4. Collator클래스          -> 자연어를 비교하여 순서 매길 때

StringBuffer       vs        StringBuilder
스레드  안전                          단일 스레드에서만 보장
속도  String보다 완전빠름        StringBuffer보다 좀 더 빠름
메모리  String보다 완전적음       StringBuffer와 같음

이유 = String의 경우 + 연산을 할때마다 세로운 주소지에 더해진 String 값을 저장한다. 하지만 StringBuffer와 StringBuilder의 경우 처음 주소지에 값만 추가된다.새로 메모리를 할당하고 값을 옮겨갈 필요가 없다.

비교
- String은 짧은 문자열을 더할 경우 사용한다.
- StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 몰르 경우 사용하면 된다.
- StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다.

생성자
- StringBuffer()                            => 기본 용량 16개의 char 이다.
- StringBuffer(CharSequence seq)  => CharSequence는 CharBuffer, String, StringBuffer, StringBuilder의 인터페이스이며 생성된 StringBuffer는 실재로 seq에 대한 값을 갖는다.
- StringBuffer(int capacity)               => capacity = 용량
- StringBuffer(String str)                  => str 값을 갖는 StringBuffer 생성

java collection

Collection
동기화= 다중 스레드에서 데이터 처리를 보장
동기화되어 있는 클래스는 Vector와 Hashtable 밖에 없지만 다음과 같이해서 동기화 처리가 된다.
Set s = Collections.synchronizedSet(new HashSet(…));

블로킹 큐= 크기가 정해져있는 큐에 공간이 더이상 없을때, 공간이 생길때까지 대기
Set
속도: TreeSet < HashSet < LinkedHashSet (많이 차이 없음)
List
속도: ArrayList < LinkedList  < Vector (별 차이 없지만 LinkedList에서 값을 가져올때 poll대신 get을 사용하면 많이 느려진다.)
Map
속도: TreeMap >> HashMap > HashTable > LinkedHashMap (TreeMap 이 좀 느리고 나머지는 비슷)

사실 모두 속도가 비슷해서 어떤걸 사용해도 별 상관없다 하지만 안정적인걸 봤을때 Sun이 선정한 인터페이스별 클래스는 다음과 같다.
Set -> HashSet
List -> ArrayList
Map -> HashMap
Queue -> LinkedList

get client ip address with spring + resteasy

public void test(@Context ChannelHandlerContext ctx) {
    InetSocketAddress socketAddress = (InetSocketAddress) ctx.channel().remoteAddress();
    InetAddress inetaddress = socketAddress.getAddress();
    String ipAddress = inetaddress.getHostAddress(); // IP address of client
}

2016년 4월 27일 수요일

2016년 4월 26일 화요일

jQuery Attribute Starts/Ends With Selector

Starts With Selector



$('input[name^="apple"');

Ends With Selector



$('input[name$="apple"');

안드로이드 Unique ID 생성하기

public static String getDeviceUUID(final Context context) {
    final SharedPreferencesCache cache = Session.getAppCache();
    final String id = cache.getString(PROPERTY_DEVICE_ID);
 
    UUID uuid = null;
    if (id != null) {
        uuid = UUID.fromString(id);
    } else {
        final String androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
        try {
            if (!"9774d56d682e549c".equals(androidId)) {
                uuid = UUID.nameUUIDFromBytes(androidId.getBytes("utf8"));
            } else {
                final String deviceId = ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
                uuid = deviceId != null ? UUID.nameUUIDFromBytes(deviceId.getBytes("utf8")) : UUID.randomUUID();
            }
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
 
        Bundle bundle = new Bundle();
        bundle.putString(PROPERTY_DEVICE_ID, uuid.toString());
        cache.save(bundle);
    }
 
    return uuid.toString();
}

언제까지의 개인정보처리방침

1. 개인정보의 처리 목적 언제까지 은(는) 다음의 목적을 위하여 개인정보를 처리하고 있으며, 다음의 목적 이외의 용도로는 이용하지 않습니다. - 고객 가입의사 확인, 고객에 대한 서비스 제공에 따른 본인 식별.인증, 회원자격 유지.관리, 물품 또는...