Zookeeper

분산 클러스터를 관리해주는 코디네이터 역할(Kafka Server 조율)


시스템에서 반드시 홀수로 구성 해야 한다.

서버 5대가 구동 중에 2대가 죽었을 때, 관리자가 죽었던 서버를 다시 살리고 데이터 변경 요청이 들어올 경우데이터 일관성을 위해서 과반수 투표를 하게 된다.

올바른 데이터가 무엇인지 판단하기 위해서 3:2로 비교하고 과반수인 3쪽의 서버의 데이터를 업데이트하게 된다.


하지만 짝수일 경우에는 2:2또는 1:1로 과반수 라는 게 없이 똑같아져서 문제가 발생한다.

반대로 3대가 죽었을 경우, 투표를 하게 되면 죽은 서버가 과반수가 되어 올바르지 않은 데이터를 옳다고 판단하게 된다.

그래서 절반 이상이 죽으면 데이터의 불일치성을 막기 위해서 zookeeperKafka 서버를 중단하게 된다.

'IT&Programming' 카테고리의 다른 글

zookeeper(주키퍼)  (0) 2018.09.30
maven 환경변수 에러 해결  (0) 2018.05.04
Geometry 공간 연산  (0) 2018.04.18
Android Studio 3.1.1 Gradle Warning  (0) 2018.04.18
PROJ.4 API Summary  (0) 2018.03.12
bash 쉘 스크립트에서 파일을 라인 단위로 입력 받기  (0) 2018.03.12



Maven 환경변수 에러



GeoServer의 소스를 받아서 maven으로 빌드하고 디버깅 하기 위해

maven을 받아서 압축을 풀고 잘 설치되었나 확인하기위해서 명령어 mvn -v를 입력했다.

환경 변수에서 JAVA_HOME을 JRE가 아닌 JDK로 하라며 에러가 발생했다.


1
2
3
4
5
The JAVA_HOME environment variable is not defined correctly
 
This environment variable is needed to run this program
 
NB: JAVA_HOME should point to a JDK not a JRE
cs


이 에러가 계속 나와서 maven을 사용할수 없었다.

물론 고급 시스템 설정 - 환경변수 에 있는 사용자 변수, 시스템 변수는 JAVA_HOME과 PATH 모두 제대로 되어 있었다.


Solution


cmd에서 명령어를 통해 JAVA_HOME을 다시 셋팅 해줘야 했다. 


1
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144
cs


위의 명령어를 실행하고 나서 mvn -v을 치니 똭!! 해결되었다.

자신의 PC에 JAVA JDK가 설치 된 위치로 명령어 입력한다. (jdk 뒤의 숫자는 현재 자신의 JDK버전에 맞게 입력)

이제 maven을 이용해서 라이브러리를 관리하고 빌드 할 수 있었다.


하지만! 


컴퓨터를 재부팅하고 cmd에서  mvn -v를 입력하자 똑같은 에러가 또 발생했다.

다시 한번 같은 명령어를 입력하고


1
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_144
cs

mvn -v 를 치니 정상적으로 나왔다. 

매번 이짓을 반복해야지 maven을 사용할수 있다.

왜 그런지 이유는 잘 모르겠다 JAVA_HOME과 maven의 path가 불완전한건가?? 

path 변수가 사라져서 그렇다.

path값을 영구 설정하기 위해서는 "내컴퓨터" -> 고급설정 -> 환경변수 -> PATH값에 결로를 추가해준다.




JAVA가 유용한 언어이긴 한데 window에서 사용할때 path 설정이 참 귀찮다고 생각이 든다.


환경 변수 설정 해보면 별거 아닌데 자바 관련 톰캣이며 메이븐까지 처음 설치할때 검색해고 

가이드를 따라 설정하고 나면 그 이후에는 신경쓰지 않게 된다.


그래서 새로 설정하거나 에러가 발생하거나 버전을 올려서 설정을 바꿔야 할때면 기억이 가물가물 해져서 헤매는것 같다.

원리는 간단하게 HOME은 메인 폴더로 path는 메인 폴더안에 bin폴더를 가리키면 되는것인데 

왜 자바만 이런 환경변수 설정을 하는건지 ... 


아무튼 GeoServer에서 maven을 사용해서 빌드 하는 명령어는 아래 링크를 참조하면 된다. 


https://maven.apache.org/install.html

http://docs.geoserver.org/latest/en/developer/maven-guide/index.html



'IT&Programming' 카테고리의 다른 글

zookeeper(주키퍼)  (0) 2018.09.30
maven 환경변수 에러 해결  (0) 2018.05.04
Geometry 공간 연산  (0) 2018.04.18
Android Studio 3.1.1 Gradle Warning  (0) 2018.04.18
PROJ.4 API Summary  (0) 2018.03.12
bash 쉘 스크립트에서 파일을 라인 단위로 입력 받기  (0) 2018.03.12

Geometry 공간 연산

공간 연산자는 피처의 도형(geometry) 속성에 대한 조건을 설정하는데 사용된다.


위상 연산자(Topological Operators)

8개의 위상 연산자들을 이용한 공간 질의 수행
  • Intersects - 2개의 공간 객체가 교차 하는지 검사
  • Disjoint - 2개의 공간 객체에 공통 요소가 없는지 검사
  • Contains - 공간 객체가 다른 객체를 포함 하는지 검사
  • Within - 공간 객체가 다른 객체 내부에 있는지 검사
  • Touches - 2개의 공간 객체가 맞닿아 있는지 검사
  • Crosses - 2개의 공간 객체가 서로 횡단하는지 검사
  • Overlaps - 2개의 공간 객체가 서로 겹치는지 검사
  • Equals - 2개의 공간 객체가 위상적으로 동일한지 검사


'IT&Programming' 카테고리의 다른 글

zookeeper(주키퍼)  (0) 2018.09.30
maven 환경변수 에러 해결  (0) 2018.05.04
Geometry 공간 연산  (0) 2018.04.18
Android Studio 3.1.1 Gradle Warning  (0) 2018.04.18
PROJ.4 API Summary  (0) 2018.03.12
bash 쉘 스크립트에서 파일을 라인 단위로 입력 받기  (0) 2018.03.12

Android studio Build.gradle Warning 해결



안드로이드 스튜디오에서 새로운 
업데이트가 나와서 바로 진행했다.

하지만 업데이트 후 gradle버전이 3.1.1로 업데이트 되고 2가지 warning에러가 발생했다.


두가지 모두 build.gradle (Module: app) 에서 발생한 경고(warning) 였다.


그 해결 방법을 정리해본다.

첫번째 Warning

Warning:Configuration 'compile' is obsolete and has been replaced with 'implementation'.
It will be removed at the end of 2018

이건 build.gradle 에서 dependencies 부분에 있는 모든 compile implementation으로 변환하여 해결 했다.


dependencies {

compile fileTree ->  implementation fileTree 

compile -> implementation 

}

그냥 모든 compile을 implementation로 치환 해주면 해결


두번째 Warning은

The SourceSet 'instrumentTest' is not recognized by the Android Gradle Plugin. Perhaps you misspelled something?


이건 instrumentTest.setRoots('tests') 부분을  androidTest.setRoots('tests') 로 변환하여 해결 했다.


업그레이드 하면서 build.gradle 새 버전부터 instrumentTest는 더이상 사용되지 않으면서 androidTest로 수정하여야 했다.


instrumentTest를 찾아서 androidTest로 치환 하여 해결, 딱 하나 뿐이었다.


결론 : stackoverflow 만세!



reference

 https://stackoverflow.com/questions/48462550/android-studio-build-gradle-warning-message

https://stackoverflow.com/questions/49511200/the-sourceset-instrumenttest-is-not-recognized-by-the-android-gradle-plugin


PROJ.4 Summary


API Functions

pj_transform

- 원본 좌표계에서 대상 좌표계로 x, y, z 점을 변환 해준다. 좌표 값은 decimal degrees가 아닌 radians 단위로만 전달 받을 수 있다.

  성공시 0을 반환한다. 

  • srcdefn: source(입력) 좌표계

  • dstdefn: destination(출력) 좌표계

  • point_count: 처리할 point의 수 (x, y, z 배열의 크기)

  • point_offset: x, y, z, 배열 내에서 value to value의 step size 

  • x, y, z: 입력으로 전달 된 X, Y, Z 좌표 값(Z는 선택적으로 NULL을 사용할 수 있음)

1
2
int pj_transform( projPJ srcdefn, projPJ dstdefn, long point_count, int point_offset,
                  double *x, double *y, double *z );
cs


pj_init_plus

- 좌표계 정의의 문자열 표현(proj.4인자)을 다른 API함수와 함께 사용하기에 적합한 projPJ객체로 변환한다.

  실패하면 NULL을 반환한다.


1
projPJ pj_init_plus(const char *definition);
cs


pj_free

- pj와 관련된 모든 자원 할당 해제


1
void pj_free( projPJ pj );
cs


pj_is_latlong

- 전달된 좌표계가 geographic(위도, 경도)일 경우 true 반환


1
int pj_is_latlong( projPJ pj);
cs


pj_is_geocent

- 좌표계가 geocentric(지구 중심)일 경우 true 반환

1
int pj_is_geocent( projPJ pj );
cs


RAD_TO_DEG, DEG_TO_RAD

- Radian to Degree, Degree to Radian

   pj_transform 함수는 좌표값을 radian 단위로만 input/output 하기 때문에 단위 변환시 사용 


1
2
#define RAD_TO_DEG    57.295779513082321
#define DEG_TO_RAD   .017453292519943296
cs


 Example

다음은 decimal degrees인 위도와 경도 값을 받아서 WGS84 타원체, WGS84 데이텀으로 UTM 투영하여 UTM51N(EPSG 32651) 좌표 값으로 변환해 주는 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <proj_api.h>
 
main(int argc, char **argv) {
    projPJ pj_merc, pj_latlong;
    double x, y;
 
    if(!(pj_merc = pj_inti_plus("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")) )
        exit(1);
    if(!(pj_latlong = pj_init_plus("+proj=utm +zone=51 +ellps=WGS84 +datum=WGS84 +units=m +no_defs")) )
        exit(1);
    while(scanf("%lf %lf"&x, &y) == 2){
        x *= DEG_TO_RAD;
        y *= DEG_TO_RAD;
        p = pj_transform(pj_latlong, pj_merc, 11&x, &y, NULL );
        printf("%.2f\t%.2f\n", x, y);
    }
    exit(0);
}
cs


bash 쉘 스크립트에서 파일을 라인 단위로 입력 받기

text.txt라는 텍스트 파일을 읽어 라인 단위를 $line으로 입력 받는 스크립트이다.


1
2
3
4
5
6
7
#!/bin/bash
 
while read line
do
      echo $line
 
done < text.txt
cs



1
2
3
4
5
6
7
#!/bin/bash
 
exec  < text.txt
while read line
do
    echo $line
done 
cs


PROJ.4 visual studio 2010 라이브러리 추가 




PROJ.4 란?


PROJ is a standard UNIX filter function which converts geographic longitude and latitude coordinates into cartesian coordinates (and vice versa), and it is a C API for software developers to include coordinate transformation in their own software.

C API, 지리적 경위도 좌표계를 직교 좌표계로 변환 하는 UNIX 함수


1. PROJ.4_5.0.0(2018.03 기준) Releases를 다운 받는다. 

https://github.com/OSGeo/proj.4/releases


본인이 원하는 파일로 선택해서 다운로드 받으면 된다.



2. 다운 받은 압축 파일 해제


3. Visual Studio 실행 -> 도구(Tool) -> Visual Studio 명령 프롬프트(C) 실행 

(x86/x64) 32비트인지 64비트인지 확인 필수




4. 명령 프롬프트(Command Prompt)에서 다운 받은 proj-5.0.0의 압축 해체 폴더로 들어간다.




5. 아래의 명령어를 실행 한다.(READ ME 참조)


1
2
nmake /f makefile.vc
nmake /f makefile.vc install-all
cs

다운 받은 Releases 파일 안에 READ ME에 나와 있음




6. 위의 두 명령어를 모두 실행하고나면 C:\PROJ 폴더가 생성되고 그안에 bin, include, lib, share, test 폴더가 생성된다.




7. 프로젝트를 우클릭하여 속성 -> VC++ 디렉터리 탭을 선택한다.




7-1. 포함 디렉터리(Include Directories)





7-2. 라이브러리 디렉터리(Library Directories)




8. 그대로 링커 탭으로 이동 -> 입력 -> 추가 종속성(Additional Dependencies)에 proj.libproj_i.lib를 추가로 적어준다.




9. 예제 코드를 수행하여 라이브러리가 적용 되었는지 체크한다. 

https://github.com/OSGeo/proj.4/wiki/ProjAPI


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <proj_api.h>
void main(int argc, char **argv) {
    projPJ pj_merc, pj_latlong;
    double x, y;
    if (!(pj_merc = pj_init_plus("+proj=merc +ellps=clrk66 +lat_ts=33")))
        exit(1);
    if (!(pj_latlong = pj_init_plus("+proj=latlong +ellps=clrk66")))
        exit(1);
    while (scanf_s("%lf %lf"&x, &y) == 2) {
        x *= DEG_TO_RAD;
        y *= DEG_TO_RAD;
        int p = pj_transform(pj_latlong, pj_merc, 11&x, &y, NULL);
        printf("%.2f\t%.2f\n", x, y);
    }
    exit(0);
}
cs


완료




유닉스/리눅스에서 빌드하는 법은 다운 받은 Releases 안에 READ ME를 참조한다.

네비게이션의 교통 정보에서 나오는 유고 정보란?


유고정보 (Road Event Information)

도로의 사고 정보 또는 도로 통제 정보를 확인 할 수 있는 서비스


도로 위에서 갑작스러운 사고로 인해 정체 현상이 생기는 일을 말하며 

교통사고, 행사, 재난, 도로공사 등의 돌발상황정보라고 한다.

유고정보를 확인해 해당 지점을 우회 할 수 있다.


'IT&Programming' 카테고리의 다른 글

bash 쉘 스크립트에서 파일을 라인 단위로 입력 받기  (0) 2018.03.12
Visual studio 에 PROJ.4 라이브러리 추가하기  (0) 2018.03.05
유고 정보란?  (1) 2018.02.26
함수의 시그니처  (0) 2018.01.31
좌표계(Coordinate System)  (0) 2018.01.22
API란  (0) 2018.01.03
  1. Favicon of http://goodtogreate.tistory.com JAYNUX 2018.03.04 21:47 신고

    간바리마스 아사쿠라윤

+ Recent posts