전체 글 63

Java (JVM) 사용 시 Container awareness

출처: Container Awareness Learn the intricate details of how JVM applications see container resources and how it impacts heap, CPU, and threads. spring-gcp.saturnism.me JDK 8u192 (릴리즈 노트 확인 시 2018년 10월 16일 릴리즈) 이전 버전이 설치된 이미지에서는 container에서 cgroup으로 제한된 자원을 정상적으로 인식하지 못하고 host의 전체 자원을 바라보게 된다. 따라서 이후 버전을 사용해야만 kubernetes 등에서 자원에 제한을 주었을 때 jvm이 정상적으로 해당 cgroup 제약을 인식할 수 있고 제한된 자원만을 사용하도록 실행된다.

Programming/Java 2021.04.26

Rancher Logging (Banzai Logging Operator) 사용 시 에러케이스 1) Docker log 파일이 외부 경로를 참조할 때

현재 회사에서 사용하고 있는 노드들의 경우 disk가 여러개 있어서 용량과 속도가 많은 쪽에 docker 파일들을 mount하도록 설정하여 사용하고 있다. 이 경우 Rancher logging - v2.5.0 이전 버전은 Rancher 메뉴 중 tools -> logging 탭의 기능, v2.5.0 이상부터는 banzai cloud의 logging operator - 기능들이 정상적으로 작동하지 않는다. logging daemonset이 작동할 때 기본적으로 /var/log/containers 안에 경로만 mount하기 때문에 로그를 접근하려고 하다가 외부 경로가 mount가 되어 있지 않으니 로그를 읽지 못하는 것. Rancher < v2.5.0 Rancher v2.5.0 이전 버전의 경우 이 경우 l..

Programming/기타 2021.04.17

Streamlit SessionState

이전에 업무에 도움이 되는 간단한 도구를 만들기 위해 R의 Shiny프로젝트를 이용한 적이 있었는데, 분석가분의 R 코드를 재활용하면서 클라이언트 쪽 코드를 개발 안해도 되니 어느 정도 도구의 윤곽이 잡히기 전까지는 유용하게 사용했었던 좋은 기억이 있다. 그래서 이번에는 Streamlit이라는 python용 open source visualization 도구를 사용해 간단한 도구를 만드려고 해보고 있는데 생각보다 UI에 대한 조절 기능이 몇개 없는 것도 불편하지만 특히 reactive 하게 반응하는 UI 컴포넌트들을 다루는게 생각하고 다르게 되어 있어서 배보다 배꼽이 더 큰 상황에 도달했다. 예를 들어, 특정 조건의 데이터를 동적으로 가지고 와 selectbox를 만들고 이 selectbox의 선택을 가..

Programming/Python 2021.04.05

Python elasticsearch에서 custom header 추가하기

Kong Api gateway 뒤에 Elasticsearch를 설정하고 Kong의 key-auth plugin을 이용해서 간단하게 나만 사용할 수 있도록 설정해 사용하려고 했다. 그런데 Kong의 key-auth 플러그인을 사용하면 header나 body에 apikey를 인식할 수 있도록 설정한 key 값(기본: apikey)이 있어야 하는데 python elasticsearch에 해당 설정을 넘겨주는걸 어떻게 해야 할까? 찾다가 과거 github 글을 보고 더 찾아보니 이미 최신 버전(elasticsearch==7.12.0)에서는 custom header를 넘겨줄 수 있도록 구현되어 있었다. from elasticsearch import Elasticsearch es = Elasticsearch(["h..

Programming/Python 2021.03.25

ubuntu 20.04 오른쪽 Alt -> Hangul 만들기

$ sudo vi /usr/share/X11/xkb/keycodes/evdev terminal이 익숙하지 않은 사람이라면 vi 부분에 mousepad(Xfce), gedit(Gnome 베이스) 이나 kate (KDE)와 같은 GUI 툴을 사용해서 파일을 열자. 약 72번 라인 정도 보면 = 108; 라인이 있다. 이걸 // = 108; 로 주석 처리 및 다음과 같이 라인을 추가해 줌: // = 108; = 108; 이런 식으로. HNGL이 한영 버튼을 뜻함. 약 164번 라인 정도 보거나, HNGL을 검색하면 = 130; 라인이 있다. 원래 한글 버튼의 키 코드가 130 인듯. 이것도 마찬가지로, 주석 처리 진행 // = 130; 변경 사항을 저장하고 로그아웃 혹은 재부팅 후 사용하시는 입력기의 설정에서..

Programming/Linux 2021.03.20

P3X Onenote 한글 입력 문제

* 한줄 요약: p3x onenote github에서 AppImage를 받아서 실행하면 정상적으로 한글 입력이 된다. 사용하는 운영체제는 Ubuntu 18.04 LTS 5년정도 전부터 에버노트에서 원노트로 노트류를 변경한 후 계속해서 원노트를 쓰고 있는 중이다. 그래서 원노트는 개발 환경에서 꼭 필요한 도구 중 하나인데 linux용은 microsoft 공식 원노트 앱이 따로 존재하지 않는다. ubuntu repo를 확인하면 onenote-desktop이라는 이름의 앱과 p3x onenote를 확인할 수 있어서 둘 다 설치해봤지만 실행 시 정상적으로 한글 입력이 되지 않았다. snap에 올라와있는 패키지도 마찬가지. 그래서 원노트를 웹 브라우저 사이트에 접속해서 사용하는 형식으로 사용하고 있었는데 저걸 시..

Programming/Linux 2021.03.09

maven-shade-plugin

예전에는 maven-assembly-plugin을 사용해서 uber jar를 만들었는데 최근에 필요해서 다시 검색해 보니 maven-shade-plugin이 더 많이 나오는 것으로 보인다. 기본설정으로 만들어진 uber jar의 경우 spark 에서 사용하려고 할 시 manifest 충돌 관련 보안 에러가 발생해서, 홈페이지에서 제공하는 manifest 제외하는 기본 설정 코드를 기록삼아 올려본다. (링크) org.apache.maven.plugins maven-shade-plugin 3.2.4 package shade junit:junit junit/framework/** org/junit/** org/junit/experimental/** org/junit/runners/** *:* META-INF/..

Programming/Java 2020.11.06

python rocksdb 에서 column family 사용하기

* RocksDB (https://github.com/facebook/rocksdb) * PIP에 등록된 Python-RocksDB (https://github.com/twmht/python-rocksdb) * 예제 코드 (https://github.com/tkyoo/python-rocksdb-columnfamily-example) 현재 (2019년 2월 16일) 파일시스템 기반 KeyValue DB 중 LevelDB, RocksDB 의 차이점 중 하나는 column family 지원 여부이다. pip에 올라와 있는 python-rocksdb 에 방문해서 얻을 수 있는 문서 (https://python-rocksdb.readthedocs.io) 는 이전 버전이라 column family 기능이 컨버팅 되..

Programming/Python 2019.02.16

Vuejs async하게 component import 하기

https://forum.vuejs.org/t/vue2-async-components-examples/2066/4 호환성을 위해 일반적인 방식으로 만들어진 함수 사용 function loadComponent(opts) { var script = document.createElement('script'); opts.onLoad = opts.onLoad || function() {}; opts.onError = opts.onError || function() {}; script.src = opts.path; script.async = true; script.onload = function() { var component = Vue.component(opts.name); if (component) { opts..