기록 저장소

개인 블로그입니다. 내용에 잘못된 부분은 정정 요청하시면 반영하겠습니다.

블로그를 새단장 했습니다

기술 글을 정리해 두던 이 공간을 오랜만에 손봤습니다. 앞으로는 개발하며 배운 것들을 기록하는 동시에, 가끔은 이렇게 소소한 일상도 함께 남겨보려고 합니다. 바뀐 점 디자인 정리 — 카드형 목록, 부드러운 애니메이션, 다크모드 대응 방문자 통계 — 어떤 글이 도움이 되는지 살펴보려 합니다 일상 카테고리 추가 — 기술 외의 이야기는 여기에 모아둡니다 기술 글이 주가 되겠지만, 이 카테고리에서는 조금 더 편하게 써보겠습니다. 🙂

July 9, 2026 · 1 min · 페이퍼

아카이브유틸리티 동작 안되는 현상

맥북에어 m2에서 겪었던 현상. 아카이브 유틸리티 동작이 안되는 현상 왜 그러는지는 모르겠지만, zip을 클릭했을때 압축이 안풀리는 현상이 있었다 이유를 보니 숫자가 앞에 있었다. 1_test.zip 압축이 풀리지 않음 test.zip 압축풀림 이름을 변경하니 더블클릭으로 압축이 풀렸다. 1_test.zip 압축풀기 메뉴를 눌러 폴더 선택을 직접 하면 풀린다. 연속 압축으로 인식한걸까

April 8, 2023 · 1 min · 페이퍼

golang profiler 사용

http prof 를 이용해 프로파일 한다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import ( "net/http" _ "net/http/pprof" ) func main() { go func() { log.Println(http.ListenAndServe("0.0.0.0:6060", nil)) }() ... do somthing ... } cpu profile (30초동안 데이터를 모은다) 1 go tool pprof http://xxxx:6060/debug/pprof/profile heap memory (현재 메모리 정보를 반환한다) 1 go tool pprof http://xxxx:6060/debug/pprof/heap heap 을 실행하면 아래와 같이 command line (pprof)가 나오는데 프로파일 명령을 넣으면 된다. 가령 web 을 치면 윈도우에 경우 web 브라우저에 메모리 Map이 나온다 1 2 3 4 5 6 7 8 Fetching profile over HTTP from http://xxxx:6060/debug/pprof/heap Saved profile in C:\Users\Paper\pprof\pprof.xxxx.alloc_objects.alloc_space.inuse_objects.inuse_space.013.pb.gz File: xxxx Build ID: 8028feec58a6d0902dc3f3c6e08c6ce789b01028 Type: inuse_space Time: Apr 3, 2022 at 12:17pm (KST) Entering interactive mode (type "help" for commands, "o" for options) (pprof) web web 명령을 사용하려면 Graphviz 라는 프로그램을 설치해놔야 한다. Graphviz

March 28, 2022 · 1 min · 페이퍼

kubernetes cert-manager

kubernetes 에서 ingress 상에서 https를 서비스하는데 지원을 해주는 좋은.. 모듈 cert manager 설치 (1) 참고 https://cert-manager.io/docs/installation/kubernetes/ 1 2 kubectl create namespace cert-manager kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.1/cert-manager.yaml cert manager 설치 (with helm) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 $ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.13.1/deploy/manifests/00-crds.yaml $ kubectl create namespace cert-manager $ helm repo add jetstack https://charts.jetstack.io $ helm repo update # Helm v3+ $ helm install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version v0.13.1 # Helm v2 $ helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.13.1 \ jetstack/cert-manager 설치 확인 1 kubectl get pods --namespace cert-manager 사실 내용 자체는 https://cert-manager.io/docs/installation/kubernetes/ 사이트를 보고 그대로 따라했다. 중요한건 staging 과 prod가 나뉘어 있다는거고, Issuer 와 ClusterIssuer 가 구분되어 있다는건데 Issuer는 namespace간 발급이 안되므로, 가능하면 ClusterIssuer를 사용하자 staging 는 환경 테스트에만 사용하고, 성공하면 prod로 바꾸어서 실제 인증서를 발급받아야 한다. cert manager issuser example email: test@test.com 부분을 실제 email로 교체하라 다른 부분은 건들 부분이 크게 없다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: # The ACME server URL server: https://acme-staging-v02.api.letsencrypt.org/directory # Email address used for ACME registration email: test@test.com # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-staging # Enable the HTTP-01 challenge provider solvers: # An empty 'selector' means that this solver matches all domains - selector: {} http01: ingress: class: nginx --- apiVersion: cert-manager.io/v1alpha2 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: # The ACME server URL server: https://acme-v02.api.letsencrypt.org/directory # Email address used for ACME registration email: test@test.com # Name of a secret used to store the ACME account private key privateKeySecretRef: name: letsencrypt-prod # Enable the HTTP-01 challenge provider solvers: - http01: ingress: class: nginx kubernetes-dashboard에 적용 www.test.com; 부분을 원하는 도메인으로 바꾼다. 발급 테스트가 완료되면 cert-manager.io/cluster-issuer: "letsencrypt-staging" ...

May 13, 2020 · 4 min · 페이퍼

kubernetes glusterfs 연동

glusterfs-kubernetes 설치 시도 중 gluster-kubernetes/deploy/gk-deploy 파일을 열어서 아래 라인을 고쳐야 한다 (kubectl에 없어진 인자값을 쓴다) 1 2 3 # deprecated "--show-all" parameter #heketi_pod=$(${CLI} get pod --no-headers --show-all --selector="heketi" | awk '{print $1}') heketi_pod=$(${CLI} get pod --no-headers --selector="heketi" | awk '{print $1}') 1 2 3 4 5 6 7 8 9 # daemonset을 설치하기 위해 # 노드별로 아래 경로를 비워야함 rm -rf /var/lib/misc/glusterfsd /var/lib/glusterd /var/log/glusterfs /etc/glusterfs /var/lib/heketi #uninstall ./gk-deploy -g --user-key userkey --admin-key adminkey -n glusterfs --abort #install ./gk-deploy -g --user-key userkey --admin-key adminkey -n glusterfs 신규 glusterfs 노드가 추가될때 topology.json을 수정하고 1 heketi-cli topology load --json=to.json --user admin --secret adminkey 1 2 디스크 확인 lsblk lvm 관련 도움말 ...

May 13, 2020 · 4 min · 페이퍼

kubernetes ingress - 특정 url로 proxy 걸기

외부로 ingress를 노출하고 처리하는 서버가 kubernetes 내에 service가 아니라 다른 별도의 서버일 경우에 아래와 같이 proxy_pass를 지정한다. (사실 응용하면 nginx 기능들이 지원하는건 다 될것 같다.) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 kind: Ingress apiVersion: extensions/v1beta1 metadata: name: gitlab.test.com namespace: nginx-ingress annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/proxy-connect-timeout: '3600' nginx.ingress.kubernetes.io/proxy-read-timeout: '3600' nginx.ingress.kubernetes.io/proxy-send-timeout: '3600' nginx.ingress.kubernetes.io/send-timeout: '3600' nginx.ingress.kubernetes.io/server-snippet: | location ~ / { proxy_pass http://10.10.10.101:8084; } spec: rules: - host: gitlab.test.com http: paths: - path: / backend: serviceName: nginx-ingress-default-backend servicePort: 8080 status: loadBalancer: ingress: - {} 위에 serviceName 은 실제로 사용하는 서비스가 아니라 dummy 서비스이다. annotations을 추가하는 이유는 websocket 때문이다.(websocket 안쓰면 없어도 됨) 1 2 3 4 nginx.ingress.kubernetes.io/proxy-connect-timeout: '3600' nginx.ingress.kubernetes.io/proxy-read-timeout: '3600' nginx.ingress.kubernetes.io/proxy-send-timeout: '3600' nginx.ingress.kubernetes.io/send-timeout: '3600'

May 13, 2020 · 1 min · 페이퍼

ssh key를 이용한 로그인

macOS 에서 ssh key를 지정하여 서버로 비밀번호 타이핑 없이 바로 로그인 하게 하자 평소엔 보안때문에 안해놓는다. macOS - 키 생성 1 ssh-keygen -t rsa -C "name" - public key를 조회 1 cat ~/.ssh/id_rsa.pub 대상 Server (CentOS) - public key를 ~/.ssh/authorized_keys 파일에 추가 1 vi ~/.ssh/authorized_keys

August 11, 2016 · 1 min · 페이퍼

redis data type 종류

Redis Data Type 요약 인터넷상에 수많은 좋은 자료가 있음에도 공부 차원에서 정리를 한다 테스트는 redis-cli를 이용해서 하지만 실제 사용은 언어에 맞는 api library를 사용 할듯 개요 http://redis.io/topics/data-types-intro 예제 http://redis.io/topics/data-types Strings value에 문자 숫자 등을 저장한다 저장시 별도로 형이 없다 (숫자 문자 구분이 없음) 숫자도 저장가능 하다 그리고 숫자에 incr, incrby, decr, decrby 같은 atomic counter 연산이 가능 incrby, decrby 는 특정 수를 더하거나 뺄때 사용 incrby "test_strings" 10 처럼 사용 1 2 3 4 5 6 7 8 9 10 # redis-cli 127.0.0.1:6379> set "test_strings" 1 OK 127.0.0.1:6379> get "test_strings" "1" 127.0.0.1:6379> incr "test_strings" (integer) 2 127.0.0.1:6379> get "test_strings" "2" 127.0.0.1:6379> Lists value에 list를 저장한다 lrange: 값을 조회 이때 -1은 모두 가져오라는 뜻 1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> lpush "test_lists" 1 127.0.0.1:6379> lpush test_lists 2 127.0.0.1:6379> lrange test_lists 0 -1 1) "2" 2) "1" 127.0.0.1:6379> rpush test_lists 3 (integer) 3 127.0.0.1:6379> lrange test_lists 0 -1 1) "2" 2) "1" 3) "3" rpop를 이용하여 queue 구현이 가능할꺼 같다 1 2 3 4 5 127.0.0.1:6379> rpop test_lists "3" 127.0.0.1:6379> lrange test_lists 0 -1 1) "2" 2) "1" rbpop을 이용하면 순차적인 분산 작업도 구현 가능할꺼 같다 rpop과 비슷하나 데이타가 없다면 데이타가 들어올때까지 block 상태로 대기한다 Sets value을 set형태로 가지고 있음 list는 중복이 되나 set은 중복이 안됨 1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> sadd test_sets 1 (integer) 1 127.0.0.1:6379> smembers test_sets 1) "1" 127.0.0.1:6379> sadd test_sets 1 2 3 4 (integer) 3 127.0.0.1:6379> smembers test_sets 1) "1" 2) "2" 3) "3" 4) "4" Hashes Hashs key/value 목록을 값으로 가진다 1 2 3 4 5 6 7 8 9 10 11 127.0.0.1:6379> hset htest username hi (integer) 1 127.0.0.1:6379> hset htest userpwd asdf (integer) 1 127.0.0.1:6379> hget htest username "hi" 127.0.0.1:6379> hgetall htest 1) "username" 2) "hi" 3) "userpwd" 4) "asdf" hget시에 값이 없다면 (nil)을 반환 1 2 127.0.0.1:6379> hget htest temp (nil) hashkey에 대한 값을 바꿈 1 2 3 4 5 6 127.0.0.1:6379> hget htest userpwd "asdf" 127.0.0.1:6379> hset htest userpwd 1234 (integer) 0 127.0.0.1:6379> hget htest userpwd "1234" Sorted sets value를 set형태로 가지고 있음 Sets과 마찬가지로 중복은 안됨 score와 함께 저장되며 score를 기준으로 정렬됨 list처럼 사용이 될꺼 같으나 정렬된다는 장점이 있는 것 같다 1 2 3 4 5 6 7 127.0.0.1:6379> zadd test_ssets 1 1 (integer) 1 127.0.0.1:6379> zadd test_ssets 2 2 (integer) 1 127.0.0.1:6379> zrange test_ssets 0 -1 1) "1" 2) "2" score를 문자형으로 쓰면 안된다 1 2 127.0.0.1:6379> zadd test_ssets "a" 2 (error) ERR value is not a valid float 중복이 안되면 동일한 value를 넣으면 기존 데이타의 score를 덮어서 데이타 순서가 바뀐다 1 2 3 4 5 127.0.0.1:6379> zadd test_ssets "0" 2 (integer) 0 127.0.0.1:6379> zrange test_ssets 0 -1 1) "2" 2) "1" Bitmaps bit값을 저장해준다 512MB 용량으로 2^32(42억)개의 bit값들을 저장할 수 있다 boolean 옵션값을 저장하는 용도로 사용하면 좋을거 같다 (회원마다 공지 조회여부 등) 1 2 3 4 5 6 7 8 127.0.0.1:6379> setbit test_bits 0 1 (integer) 0 127.0.0.1:6379> getbit test_bits 0 (integer) 1 127.0.0.1:6379> setbit test_bits 0 0 (integer) 1 127.0.0.1:6379> getbit test_bits 0 (integer) 0

July 27, 2016 · 3 min · 페이퍼

maven에서 gradle로 변환...

gradle설치 (for macOS) 1 brew install gradle 원래 수동으로 설치하는 방법이 있으나.. 나는 위와 같이 자동 설치를 좋아한다 ~~대부분 그렇지 않을까~~~ 수동 설치는 사이트에서 참고하자 https://gradle.org/gradle-download/ pom.xml -> build.gradle로 변환 1 2 # 프로젝트 폴더 (pom.xml이 있는곳) 으로 이동 gradle init --type pom 위와 같이 하면 project name 및 dependencies 등이 gralde용 build script로 변환이 되고 프로젝트가 gradle를 사용가능하도록 설정된다 intelliJ IDEA에서 기존 maven으로 구성된 프로젝트라면 module을 새로 import해야 한다 (그래야 툴에서 인식이 되는듯 하다) 꼭 import할때 build.gralde를 선택하자 ...

July 14, 2016 · 3 min · 페이퍼

fluentd로 로그를 모으기

예전에 flume로 에러 로그들을 모으고 있었는데 fluentd로 갈아타려고 한다. 사실 모으는 목적이 아니라 모니터링이 목적 설치 아래 사이트에 나오는 command만 실행해주면 chkconfig 등록까지 다 해준다. 참고 공식 사이트 http://docs.fluentd.org/articles/install-by-rpm#step-0-before-installation 구성은 flume와 비슷한것 같다 client -> server 구성으로 해놓고 client에서 수집된 로그를 server로 전달. 아래 커맨드 실행 1 curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh 서비스 구동 1 service td-agent start 당연히 service td-agent stop 가 중지다 설정 /etc/td-agent/td-agent.conf 파일이 설정 파일이다 ...

June 22, 2016 · 2 min · 페이퍼