Category Archives: NOTE

리눅스 민트19 tara 한글nimf 설치

다른거 몇개 해봤는데 hangul은 잘 되는데 wayland프로그램에서 한글이 안써진다.(gui : kde, gnome, xorg, wayland)

vscode라던가..

fxitx는뭔가 안되는데.. nabi, 등등 다른거 다조금씩 오류가 있어서.. 수정안되고 있는 것 같다.

그냥 쓰던 nimf 설치

https://launchpad.net/~hodong

개발자분이 ppa달아놓으셨나보다.

자세한건 잘 모르고 그냥 이걸로 설치

sudo apt install nimf*

메뉴 >> languages >> 두번째텝Input methods >> nimf 선택

버전에 따라 조금씩 다를 수 있는데 대강 이 프로세스를 따른다.

MSA 에서 GW의 역할 아키텍처

Microservice-Architecture-API-Gateway-Consideration.pdf 에서 보고
https://www.globallogic.com/wp-content/uploads/2017/08/Microservice-Architecture-API-Gateway-Considerations.pdf

구조

PDF에서 그림참고
client가 oauth2로 auth server에서 accesstoken을 얻어서 gw에 접근.
gw에서는 auth server에 accesstoken 검증받고 jwt토큰발급
jwt토큰이용 내부 MS에 접근

내가 생각하고 있던 jwt의 용법과 조금 달라서… 잘못알고 있었다고 봐야될까
외부의 앱에서도 jwt토큰을 사용하려고 했는데.. 시간제한걸고 해서
생각 해보니 이렇게 하면 access token하고 다를게 없는 것 같다.
이 문서에 있는 방법이 더 좋아보인다. jwt는 신뢰할 수 있는 서버간 통신용
배포시점에서 api 버전별로 jwt 토큰 secret을 공유해줘야할 것 같다.

DDOS방어

  • 접근횟수 제어: 세번이상때리는놈 막아버린다던가
  • 커넥션 제한: 서비스 종류에따라 다르겠지만 api를 100개씩 호출하는거 금지
  • 느린커넥션 제한: 소켓 열어놓고 안닫고 도망가는 경우가 많은데 이런거 강제종류 30초
  • IPBlockList/WhiteList
  • 요청 거부: User-Agent 헤더 들고오는놈, referret 헤더 들고오는놈, header에 값 잔뜩 달고오는놈 

Secure Communication

내부 rest api도 https사용
private 서브넷 이용
안될경우 token인증??

서비스 등록과 서비스 찾기

Service Registry

MS instance가 실행될 때 자동등록. eureka

Service Discovery

api gateway에서 eureka에 접근해서 찾기
ribbon으로 부하조절

Orchestration

MS가 MS를 요청하는 경우를 말하는건가?
바로 요청할지 GW를 거칠지? 그림은 좀 다른데?

  1. Client – GW – MS – MS
    1. Client – GW- MS – GW – MS
  2. Client – GW -MS

1번은 내부에서 내부를 중복호출하는경우. 1-1도 같은구조로 봐야할 것 같다
2번은 1단계 호출만 존재

Monitoring

MSA는 모니터링이 없으면 오류가 어디서 났는지 알기 힘들다.
각 서비스별 로그수집, 헬스체크가 필수

Health Monitoring

서버 죽었나 살았나

Traffic and Data Monitoring

데이터 네트워크 사용량??

Load Balancing and Scaling

API GW로 L.B.를 달아준다. 끝?
롤링배포하라구?

High Availablility and Failover

stateless – nosession

시스템 트레이딩 – 시계열 데이터 TimeSeries Data 저장

데이터 분석 – 옛날

시계열 데이터 저장

예전에는 증권데이터를 저장할 마땅한 방법이 없었다.

처음에는 MS SQL에 저장을 했었는데… 젠장. 다음날까지 insert를 하고 있다.
트랜잭션, 벌크인서트 쿼리, 인덱스변경 여러가지 해 봤지만… 별 차이는 없었다.
이 때 처음 알게 됐다. 디비에 파일을 넣는게 바로바로 쏙쏙 들어가는게 아니군.

파일에 저장을 해 봤다.
2018/10/12/000060.dat 이렇게계층형으로 저장을 했는데 이게 관리가 힘들다. 검색도 힘들고… 순차적으로 로딩만 하면 되는데

시계열 데이터 분석

실시간 데이터를 분석할 방법은 많이 보였다.

당시 Marketcetera, Streambase, Esper 등의 CEP툴들.. RuleEngine.

근데 뭐.. 저장할 방법이 없으니 쓸모가 없었다. 이것들도 딱히 쓰기 좋게 잘 나와 있지도 않았고

그래서 뭔가를 만들었나?

아니. 그냥 몇년 기다렸다.

그랬더니 역시 뭔가 나왔다.

데이터 분석 – 최근

Hadoop, HDFS, Hbase 하둡이 나오고 막 발전하기 시작하더니

Spark, Storm, Cassandra, OpenTSDB, Prometheus 등 다양한 방법이 나오기 시작했다.

Minio, Ceph, …

다양한게 나왔는데.. 너무 난립 해 있어서 오히려 머리가 아플 지경이다.

한개가 압도적으로 좋으면고민도 안 할텐데

배치분석 : Map Reduce, Spark

실시간 분석 : Storm, Spark

컬럼디비 : Cassandra, HBase

시계열디비 : OpenTSDB, Prometheus, InfluxDB, vaultaire, Riak, Whisper(graphite)

파일저장소 : minio, HDFS, ceph

로그 수집 : Fluentd, Flume, Logstash, Scribe

MQ : RabbitMQ, Kafka

기타 : ZooKeeper

이 중에서 한개만 고르면 땡인 것도 아니다. 이것들끼리 의존관계가 얽혀서…

고민되는 부분

ceph를 쓰면 vaultaire와 hadoop, hbase의 backend로도 쓸 수 있다.
비공식 플러그인 지원이라서 좀 문제가 발생할 가능성도 있다.
로그저장. 파일저장도 할 수 있고.
설치가 쉽진 않다.
hdfs보다 좀 더 활발하게 사용되는 것 같기도 하고…

hdfs를 쓰면 hbase, opentsdb, map reduct … 이렇게 자연스럽게 연결. 
레퍼런스가 많다.

aws, gcp를 써도 되지만… 월비용 10만원을 넘을 때 까지는 집에서 운영하고싶은 생각에..

지금 중학생이면 얼마나 좋을까…

사용기술 선정

Spark – 배치분석, 머신러닝돌리기 좋고 호환이 잘된다. 레퍼런스도 많다.
Storm – 실시간 분석, 스파크는 완전실시간이 아닌 마이크로 배치. 조금 다르다. 일단 사용 후 필요한지 검증.
HDFS – 오브젝트저장소, 호환성이 좋다. 성능도 나쁘지 않다.
HBase – 컬럼DB, HDFS를 백엔드로 사용한다. ceph를 쓸 수도 있지만 기본옵션으로 쓰는게 속편하다.
OpenTDSB – 백엔드 저장소로 Cassandra, HBase, GoogleBigtable을 사용.
Fluentd – 로그수집, 가볍고 간단하다.
Kafka – MQ. RabbitMQ도 나쁘진 않지만.. 하둡 쓸 때는 Kafka 쓰는거다. 분산형으로 사용하기 더 좋다는 결과를 본 것 같다. 호환성은 RabbitMQ가 더 좋았던 것 같은데..
Minio – 파일저장소. 오브젝트는 제외. 파일 저장소로 사용.

ㅃㄲ(빅)데이터는 마케팅 용어다

씨잇팔 삑데이터 더럽게 좋아하네

빅데이터 국비교육 과정이고 빅데이터 젛문가고 삑떼이터 분석이고

여기저기 빅데이터 엄청 들먹인다.

토끼뉴스 빅데이터 분석이니 트위터 빅데이터 분석이니

뉴스 중간에도 어디선가 빅데이터 분석을 했다고 하고

빅데이터 전문가라는 사람이 나와서 뭔 설명을 해준다

빅데이터. 이건 그냥 마케팅 용어다.

삑떼이터 용어가 처음 유행한게 2012년경인가?
4차산업혁명이나 유비쿼터스 스마트시티 등등처럼 실체가 불분명한 마케팅 용어에 불과하다.

데이터 분석은 계속 있어왔고 계속 있을건데

빅데이터라는 개념때문에 시대가 갈라지진 않는다. 어차피 데이터 분석 잘 하던 사람은 빅데이터 분석도 잘 한다.

빅데이터 분석 플랫폼/솔루션이 따로 있기는 하지만 어차피 중요한 것은 시스템관리능력과 통계지식 등등이니까 변하는 것은 없다.

약간 다른점

하둡, 카산드라, 스파크 등 분산형 디비/분석툴 등등이 개발됐다. 그 전까지는 슈퍼컴퓨터로 하던 일들..

Clojure 이용한 아무거나 개발

노는김에.. 클로저로 뭘 만들어보려고 하는데..
프레임워크가 필요할 것 같아서

두가지
* http://clojure-liberator.github.io/liberator/
* https://github.com/weavejester/compojure
* https://github.com/cmiles74/bishop
* Luminus – Leiningen
https://stackoverflow.com/questions/26674766/clojure-rest-api-frameworks

클로저는 문법이 희한해서 왠지 해보고 싶지 않나

빌드 툴은 Gradle을 이용. Leiningen이 표준이지만.. 공산당 같은 이름이라 안 쓰기로 했다.
최근 Gradle에서도 Clojure 플러그인이 있으니 그걸 쓰겠다.
IDE는 Intellij에서 할건데 Cursive를 깔면 좋다고 하지만.. 유료라 안깔고 쓸 것 같다.

서버 – Cloud vs IDC

그냥 다 귀찮으니 편하게 쓰고 싶다면 Cloud를 쓰는게 맞다. 서버 조그만거 껐다 켰다 하는 경우에는 Cloud가 가격도 싸고..
그런데 뭔가 조금만 무겁게 돌리려고 하면 Cloud의 GCP기준 2cpu 월3만원 4gb 서버는 좀 버거워 하는게 느껴진다.
Kubernetes가 자동으로 설치되고, Storage(s3, goosto..) 처럼 설치해서 관리하기 매우 난감한 솔루션도 종량제로이용 가능. minio, hdfs등을 설치해서 관리하려면 머리가 아프고 소규모로 쓰는데 이걸 설치하려면 골이 아프다.

서버2개정도로 빡빡하게 돌리려면 IDC
통큰아이 서버 중에 5만원~10만원 정도 하는거 두개쯤 쓰면 된다. 단기계약도 가능.

스케일업다운해가면서 테스트 할거면 Cloud

고정적으로 돌릴거면 IDC 코로케이션
http://www.koreaidc.com/03_colo/colo_type.html
액면가(협의가능) 쿼터렉(20Mbps) 25만, 하프렉(50Mbps) 60만, 풀렉(100Mbps) 110만
LG IDC
http://www.uplus.co.kr/biz/bzid/clct/RetrieveBzIdCoIt.hpi
부가포함 – 쿼터 44만, 하프 75.5만 풀 121만
네트워크나 기타 서비스 가격 차이가 있을 수 있다.
평촌IDC를 쓰면 AWS 다이렉트 연결도 가능.

하이브리드 사용을 하려면 AWS Direct 네트워크 연결이 되는 IDC를 선택하면 된다.

결론은

없지만… 개인적으로는 그냥 로컬서버(집에다가) 두개정도 돌려놓고 개발 하다가 클라우드에 한두개정도 올리고… 클라우드 비용이 100만원을 넘는 시점에 하이브리드 환경을 고려 해 보는게 좋지 않을까

요즘시대에 완전 온프레미스 환경을 구축하는건 좀 비효율적이라고 생각한다. s3와 같은 환경을 직접 구축하는건 … 필요해지는 순간이 오긴할까

Gradle 플러그인 선언 스타일

요즘방법

플러그인 검색 페이지 : https://plugins.gradle.org/
옛날건 properties 파일에 플러그인 버전을 다 설정 해 놨는데 새로운 설정방법으로 하면 값을 가져오지 못한다. 자주 하는건 아니니가 그냥 노가다 표기법 사용.

옛날방법

멀티모듈, 버전 설정파일이 있는 경우 사용

옛날방법은 낭만이 있었는데 요즘건 너무 삭막해

서비스 베이스 프로젝트

뭔가 개발하려면 꼭 필요한 녀석들이 있다.
그리고 한번 개발 해 놓으면 계속 쓸 수도 있고
(나만그런가 싶기도 하지만)

Infra : DB, MQ, MemoryStorage, FileStorage

App : 파일저장, SSO

클라우드로 하면 되는데.. 왠지 클라우드를 쓰기 싫을 때도 있고

그럴 때 필요한 것들

FileStorage

하듭 파일시스템을 써야되나 고민했는데 아마존 S3처럼 쓸 수 있는게 있다고 한다.
minio https://www.minio.io/
https://github.com/minio/minio
fakes3 https://supso.org/projects/fake-s3
https://github.com/jubos/fake-s3

s3 기능을 많이 흉내내서 만들었다고 하는데 안정성은 잘 모르겠지만 남는피씨서버하드에 돌리기 좋아보인다.

Kotlin DSL – BeanDefinitionDSL.kt

코틀린 DSL Bean 선언.

이거 공부 좀 하면 커스텀 빈도 만들 수 있지 않나

샘플코드
https://github.com/sdeleuze/spring-kotlin-functional
가이드 페이지
https://spring.io/blog/2017/08/01/spring-framework-5-kotlin-apis-the-functional-way

한글 번역이나 어설프게 소스코드 붙여놓고 설명하면 더 헷갈릴 것 같다.

이해할 것도 없고 간단하니 그냥 소스 리포지터리 보는게 더 쉬움.

Kotlin에서 slf4j 로거 선언


SLF4J loggers in 3 ways from Kotlin


자바에서 lombok을 쓰면서 고민도 하지 않았던 부분인데… 여기서는 왠지 신경쓰이는 부분.


class SimpleClass {
private val log = LoggerFactory.getLogger(SimpleClass::class.java)
}

이렇게 해야되는데.. 이렇게 매번쓰기 귀찮으니

CoreUtil.kotlin

inline fun logger(): Logger {
return LoggerFactory.getLogger(T::class.java)
}
inline fun logger2(): Logger {
return LoggerFactory.getLogger(MethodHandles.lookup().lookupClass())
}

이걸 선언 해 두고 가져다 쓴다.
오브젝트에 선언하면 스태틱처럼 선언도 가능하지만 클래스 밖에 선언해두면 전역전역펑션으로 선언된다
인라인이 아니었다면… 클래스를 파라미터로 전달했겠지만 이렇게 해서 좀 더 간단해진다.

refied는 여기 참고.
https://medium.com/@joongwon/kotlin-kotlin-%ED%82%A4%EC%9B%8C%EB%93%9C-%EB%B0%8F-%EC%97%B0%EC%82%B0%EC%9E%90-%ED%95%B4%EB%B6%80-part-3-59ff3ed736be

logger2는 댓글에 써 있는 방법.. 좀 더 간단해 보이는데 검증은 필요.

h2. 처리방법 1

companion object 길어서 좀 꼴뵈기 싫다

class MemberService {
companion object {
private val log = logger()
}
}

h2. 처리방법 2

위에다 선언… intellij에서 클래스 표시가 꺼진다. 왠지 기분나쁨

private val log = logger()
class MemberService {
}

h3. 처리방법 3

인터페이스, 앱스트랙트 사용

선언이 좀 성가셔 보이는데 코드가 제일 깔끔해보인다.

매번 호출하는건 아니겠지?


interface Logger {
fun logger() = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger
fun testfun(){
logger().info("aaa")
}
}


abstract class Logger {
val logger: Logger = LoggerFactory.getLogger(this.javaClass)
}

class SimpleClass {
companion object : Logger()
fun testfun(){
logger.info("aaa")
}
}