무한 정보 세상 헤쳐나가기
레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시
레이블이 개발인 게시물을 표시합니다. 모든 게시물 표시

jQuery 플러그인 zTree 옵션 적용하는 방법

web 프론트 작업 중 트리 구조가 필요하게 되었습니다.

조사해보니 기능도 많고 쓸만한 jQuery 플러그인 중에 zTree가 가장 눈에 띕니다.

사용법을 정리하려 했는데 공식사이트에 잘 설명되어 있어 기초적인 적용방법은 필요없을 듯 하고 노하우 비슷한 내용을 정리해 봅니다.

공식 사이트

http://www.treejs.cn/v3/main.php#_zTreeInfo

공식 사이트의 메뉴는 크게 다음과 같이 되어 있습니다.

  • Home
  • Demo
  • API Document
  • Guide
  • Donate
  • Download (github 링크)

시작하기

zTree를 일단 시작하려면 사이트 메뉴 중 Guide에 있는 "Getting Started Guide"를 보시면 금방 시작할 수 있습니다.

옵션 적용하기

하지만, zTree를 입맛에 맞게 사용하려면 많은 옵션들을 설정해야 하는데 처음부터 API 문서를 보게 되면 머리가 아파집니다.

저의 경우 일단 Demo 를 통해서 필요한 기능을 확인 후(데모가 잘 되어 있습니다) 필요한 기능이 있는 데모가 나타나면 해당 페이지에 File Path 를 확인합니다.

이 File Path의 의미는 gitHub의 Demo 폴더에 들어 있는 파일의 위치를 알려주는 것이므로 gitHub로 들어가 소스를 확인합니다.(처음에는 이것을 몰라 시간이 많이 걸렸습니다)

소스를 통해 옵션이 확인되면 이때 API Document를 통해 해당 옵션의 정확한 기능을 확인하여 적용하면 되겠습니다.

zTree 공식 GitHub

https://github.com/zTree/zTree_v3


JAVA List 타입 생성시 warning 처리하기

일전에 HashMap 사용시 warning에 대한 처리방법을 정리했는데

다시 List 를 사용하다 보니 같은 warning이 발생하여 warning의 의미에 대해 정리합니다.

일단, List 자료형을 사용할 때 아래와 같이 사용하면

List list = new ArrayList();

다음과 같은 warning을 보게 됩니다.

- ArrayList is a raw type. References to generic type ArrayList<e> should be parameterized
- List is a raw type. References to generic type List<e> should be parameterized


이 경고의 의미는 "List에 사용할 객체 타입이 정해지지 않았다" 입니다.

사용할 객체 타입을 정하지 않았기 때문에 여러 종류의 객체를 담을 수 있게 되고, 여러 종류의 객체를 담았기 때문에 데이터를 가져올 때 타입을 일일이 확인해야 합니다.

따라서, List에 저장할 데이터의 종류가 정해져 있다면 List을 생성할 때 사용하려는 객체의 종류를 명시하는 것이 안전한 방법입니다.

다음과 같이 사용하면 정의가 명확해지고 warning은 사라지게 됩니다.

List<object> list = new ArrayList<object>();

JAVA HashMap 사용시 warning 처리하기

JAVA HashMap 사용시 warning 처리하기

JAVA 에서 Hashmap을 아래와 같이 사용하면

HashMap<String, Object> list1 = new HashMap();

다음과 같은 warning을 만나게 됩니다.

- Type safety: The expression of type HashMap needs unchecked conversion to conform to HashMap<String,Object>
- HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized

다음과 같이 사용하면 warning이 없어지는데... 일단 정리하고 정확한 이유는 따로 정리해보겠습니다.

warning 이유 정리

HashMap<String, Object> list1 = new HashMap<String, Object>();


Logstash 에서 timezone 적용하여 elasticsearch index 만드는 방법 정리

logstash에서 index를 생성할때 날짜처리는 일반적으로 다음과 같습니다.

output {
  elasticsearch {
    hosts => ["xxx.xxx.xxx.xxx"]
    index => "indexName.%{+YYMMDD}"
  }
}

이렇게 처리된 날짜는 모두 UTC 날짜가 생성됩니다.

모든 날짜 처리를 UTC로 한다면 문제 없겠지만(구글링 결과 대부분 UTC로 처리하고 사용하는 곳에서 timezone 처리를 하는것을 추천) 다른 로직에서 timezone을 적용하여 처리하는 부분이 있다면 이슈가 발생할 수 있습니다.

이 경우, 다음과 같은 filter를 사용하여 처리하면 시스템에 설정된 timezone을 따라 날짜를 설정할 수 있습니다.

filter {
  ruby {
        init => "require 'time'"
        code => "event.set('indexDate', Time.now.utc.getlocal.strftime('%Y%m%d'))"
    }
}

output {
  elasticsearch {
    hosts => ["xxx.xxx.xxx.xxx"]
    index => "indexName.%{indexDate}"
  }
}

Elasticsearch에 은전한닢(mecab) 설치 하기

Elasticsearch에 은전한닢(mecab) 설치 하기

Elasticsearch에서 한글 검색을 공식 지원하지 않기 때문에 한글형태소 분석기를 붙여야 한다.

한글형태소 분석기도 종류가 많겠지만 엘라스틱서치에는 은전한닢이 많이 사용되는 것으로 보인다.

따라서, 은전한닢을 설치하보고 방법을 정리해 본다.

전체 설치내용 리스트

설치

mecab-ko 사이트 : https://bitbucket.org/eunjeon/mecab-ko/overview

mecab-ko-dic 사이트 : https://bitbucket.org/eunjeon/mecab-ko-dic/overview

은전한닢(mecab-ko) 설치

의존성 설치

$ yum install make automake perl gcc gcc-c++

mecab-ko 다운로드

$ cd /opt
$ wget https://bitbucket.org/eunjeon/mecab-ko/downloads/mecab-0.996-ko-0.9.2.tar.gz
$ tar xvf mecab-0.996-ko-0.9.2.tar.gz

빌드 및 설치

$ cd /opt/mecab-0.996-ko-0.9.2
$ ./configure
$ make
$ make check
$ make install
$ ldconfig

사전 설치(mecab-ko-dic)

mecab-ko-dic 다운로드

$ cd /opt
$ wget https://bitbucket.org/eunjeon/mecab-ko-dic/downloads/mecab-ko-dic-2.0.1-20150920.tar.gz
$ tar xvf mecab-ko-dic-2.0.1-20150920.tar.gz

빌드 및 설치

$ cd /opt/mecab-ko-dic-2.0.1-20150920
$ ./autogen.sh
$ ./configure
$ make
$ make install

테스트

$ mecab -d /usr/local/lib/mecab/dic/mecab-ko-dic
문장 입력

mecab-java 설치

환경 변수 설정

$ export JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8

mecab-java 다운로드

$ cd /opt
$ wget https://mecab.googlecode.com/files/mecab-java-0.996.tar.gz
$ tar xvf mecab-java-0.996.tar.gz

빌드 및 설치

$ cd /opt/mecab-java-0.996
$ sed -i 's|/usr/lib/jvm/java-6-openjdk/include|/usr/lib/jvm/java-8-oracle/include|' Makefile
$ make

빌드된 파일 이동(elasticsearch 실행시 참조해주어야 함)

$ cp libMeCab.so /usr/local/lib

mecab elasticsearch 플러그인 설치

elasticsearch 플러그인은 elasticsearch 버전과 플러그인 버전이 맞아야 제대로 설치가 되는데, 현시점에서 elasticsearch 버전은 5.1.2, 플러그인 최신 버전은 5.1.1 로 설치가 되지 않았다.

일단 5.1.1 플러그인을 받아 압축해제하여 plugin-descriptor.properties 파일의 elasticsearch 버전을 수정후 재압축해서 사용하였다.

$ ./elasticsearch-plugin install file:///elasticsearch-mecab/elasticsearch-analysis-mecab-ko-5.1.1.0.zip
-> Downloading file:///elasticsearch-mecab/elasticsearch-analysis-mecab-ko-5.1.1.0.zip
[=================================================] 100%??
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: plugin requires additional permissions     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission loadLibrary.MeCab
See http://docs.oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissions allow and the associated risks.

Continue with installation? [y/N]y
-> Installed elasticsearch-analysis-mecab-ko
[root@94150aea3fdd bin]#

환경변수 추가

elasticsearch 실행하는 계정으로 로그인

$ vi .bash_profile
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

$ source .bash_profile

테스트

한글형태소 분석이 되었을 때와 되지 않았을 때를 비교는 다음과 같이 하면 된다.

  • 한글형태소 분석이 안된 경우
curl -XGET http://localhost:9200/_analyze -d '아버지가 방에 들어간다.'
  • 한글형태소 분석이 된 경우

한글형태소 분석기를 적용하려면 먼저 analyzer 를 설정해 줘야 한다. 자세한 설명은 길어 지므로 다음과 같이 curl을 날린다.

curl -XPUT http://localhost:9200/korean/ -d '{
  "settings" : {
    "index":{
      "analysis":{
        "analyzer":{
          "korean":{
            "type":"custom",
            "tokenizer":"mecab_ko_standard_tokenizer"
          }
        }
      }
    }
  },
  "mappings": {
    "text" : {
      "properties" : {
        "text" : {
          "type" : "string",
          "analyzer": "korean"
        }
      }
    }
  }
}'

확인

curl -XGET http://localhost:9200/korean/_analyze?analyzer=korean -d '아버지가 방에 들어간다'

Elasticsearch head 설치 하기

Elasticsearch head 설치 하기

elasticsearch 설치에 이어 상태를 확인할 수 있는 head 설치 방법을 정리한다.

head는 elasticsearch plugin 으로 인덱스와 샤드, 도큐먼트에 대한 관리, 상태를 점검하고 기본적인 검색 질의 기능을 제공한다.

head로 다음과 같은 일을 할 수 있다.

  • 클러스터 상태 확인과, 인덱스(Index)와 노드(Node) 수준의 작업을 수행
  • 원시 Json 또는 표 형식의 두가지 검색 인터페이스로 클러스터에서 검색 결과 도출

다만, 이 인터페이스로 데이터를 삭제하거나 손상시킬 수 있기 때문에 사용상에 주의가 필요하다.

전체 설치내용 리스트

설치

head 사이트 : https://github.com/mobz/elasticsearch-head

사전에 git, npm, bzip2, grunt의 설치가 되어 있어야 한다.

다운로드

$ git clone git://github.com/mobz/elasticsearch-head.git

빌드 및 설치

$ cd elasticsearch-head
$ npm install

실행

$ grunt server &

브라우저에서 http://localhost:9100/ 로 접속해서 확인할 수 있다.



elasticsearch 설치 및 클러스터링(clustering) 구성 하기

elasticsearch 설치 및 클러스터링(clustering) 구성 하기

프로젝트에 검색 시스템이 필요하여 자료를 조사해보니 다음과 같은 조합으로 많이 사용하는 것 같다.

  • Elasticsearch
  • Elasticsearch-head
  • 은전한닢 (한글형태소 분석기)

검색엔진으로 Elasticsearch를 사용하고, 상태확인을 위한 플러그인으로 head, 은전한닢을 통해 한글형태소 분석을 하여 한글검색을 지원하게 되는 구조인데...

먼저, 엘라스틱서치를 설치하고, 클러스터를 묶는 방법을 정리한다.

전체 설치내용 리스트

설치

공식사이트 설치 가이드 :
https://www.elastic.co/guide/en/elasticsearch/reference/5.1/_installation.html

Elasticsaerch는 JAVA 8 이상에서 동작하므로 미리 JAVA가 설치되어 있어야 한다.

기본적으로 클러스터 묶기 위해서는 서버 3대가 필요하다.
서버가 준비되었다면 각 서버마다 접속하여 다음과 같이 진행한다.

다운로드

$ curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.2.tar.gz
$ tar -xvf elasticsearch-5.1.2.tar.gz

설정파일 수정

$ vi elasticsearch-5.1.2/config/elasticsearch.yml

cluster.name: my-service
node.name: node-1
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["xxx.xxx.xxx.2:9300", "xxx.xxx.xxx.3:9300"]

설명

  • cluster.name : 클러스터 이름을 넣어주면 된다. 모든 노드의 클러스터 이름은 같아야 한다.
  • node.name : node의 이름이다. 각 노드는 이름이 달라야 한다.
  • network.host는 서버 환경에 따라 binding 할 ip넣어 준다.
  • http.cors.enabled: true, http.cors.allow-origin: "*" : head를 사용할 때 크로스도메인 이슈를 회피하기 위해 cors를 설정한다.
  • transport.tcp.port : 클러스터를 연결할 때 사용할 포트를 지정한다. 기본값은 9300이다.
  • discovery.zen.ping.unicast.hosts : 같은 네트워크 상에 있다면 클러스터가 자동으로 연결되는 것으로 알고 있지만, 운영환경을 가정하고 직접 Ip를 넣어서 묶어 준다.

실행

Elasticsearch의 보안정책으로 root로는 실행할 수 없다.
따라서, root 가 아닌 다른 계정을 사용하여 실행해야 한다.

$ su - estester
$ cd elasticsearch-5.1.2/bin/
$ ./elasticsearch -d

-d 옵션을 넣으면 데몬으로 실행된다.

클러스터의 정상동작 여부 확인

$ curl http://localhost:9200/cluster/health

클러스터 구성에 문제가 있는 경우 다음 사항을 확인해 본다.

  1. IP, 클러스터 통신 포트 확인. 기본 통신 포트는 9300번
  2. 방화벽에 의해 클러스터 통신 포트가 막혔는지 확인
  3. elasticsearch가 설치된 docker 이미지를 사용하는 경우 data 충돌에 의해 클러스터 구성이 안되는 경우가 있음. 이때는 새로 추가하는 노드의 데이터를 삭제 후 elasticsearch 재시작

정상동작을 확인했다면 한글 검색을 지원하기 위해 은전한닢을 설치해야 한다.

nodejs에서 fs.readFileSync 사용시 발생하는 에러 확인

증상

nodejs 에서 fs.readFileSync 를 사용하는데 계속 에러가 발생

  var fileContents;
  try {
    fileContents = fs.readFileSync('security/key.pem');
  } catch (err) {
    console.log('err=', err);
  }

분석

결국 try catch 로 확인해보니 파일을 찾지 못한다는 에러

err= { Error: ENOENT: no such file or directory, open './index.js'
    at Error (native)
    at Object.fs.openSync (fs.js:640:18)
    at Object.fs.readFileSync (fs.js:508:33)
    at /root/api-server/routes/search.js:621:23
    at Layer.handle [as handle_request] (/root/api-server/node_modules/express/lib/router/layer.js:95:5)
    at next (/root/api-server/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/root/api-server/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/root/api-server/node_modules/express/lib/router/layer.js:95:5)
    at /root/api-server/node_modules/express/lib/router/index.js:277:22
    at Function.process_params (/root/api-server/node_modules/express/lib/router/index.js:330:12) errno: -2, code: 'ENOENT', syscall: 'open', path: './index.js' }

원인

require 할 때는 현재 소스에서 상대경로로 찾지만

var index = require('./routes/index');

fs.readFileSync 에서는 절대경로로 사용해야 하는 것을 보임

fileContents = fs.readFileSync('security/key.pem');

시간이 없어 정확한 테스트는 하지 못하여 100% 장담 못함

APNS, GCM 사용시 방화벽 설정 방법

도메인으로 설정

APNS

  • gateway.push.apple.com 2195
  • feedback.push.apple.com 2196

GCM

  • android.googleapis.com 443,5228,5229,5230

IP로 설정

도메인으로 설정이 되면 좋겠지만 간혹 IP로 방화벽을 설정해야 할 때가 있음. 그럴때는 아래 스펙문서 링크를 참고

APNS

APNS 서버에서는 로드 밸런싱을 사용하기 때문에 사용자의 기기에서 알림을 보낼 때 항상 같은 공용 IP 주소에 연결되지 않습니다. 사용 중인 기기가 Apple에 할당된 전체 17.0.0.0/8 주소 블록에서 이러한 포트에 접근하는 것을 허용하는 것이 가장 좋습니다.

GCM

If your organization has a firewall that restricts the traffic to or from the Internet, you need to configure it to allow connectivity with GCM in order for your GCM client apps to receive messages. The ports to open are: 5228, 5229, and 5230. GCM typically only uses 5228, but it sometimes uses 5229 and 5230. GCM doesn’t provide specific IPs, so you should allow your firewall to accept outgoing connections to all IP addresses contained in the IP blocks listed in Google’s ASN of 15169.

Google’s ASN of 15169 참고 link : https://ipinfo.io/AS15169

  • android.googleapis.com:5228
  • 여유로 5229,5230 포트를 사용
  • 인증 절차로 https(443) 포트를 사용

따라서 무선랜 사용할 경우 내부 방화벽에 차단될 경우 이를 체크 하여야 함



JSON 정렬 해주는 사이트

JSON 데이터 정렬 사이트

restful api 작업을 하다보면 관련 툴들을 사용하게 되는데 결과값으로 나온 json을 확인할 때는 괜찮지만 copy&paste할 때 indentation이 깨지는 일들이 종종 있다.

데이터가 적으면 수작업 하면 되겠지만…. 양이 많을땐 역시 자동이 최고!

jsonformatter

jsbeautifier

HTML 정렬 사이트

tools.arantius.com/tabifier

prettydiff.com