The procedure to install Kubernetes on Rocky Linux (or CentOS).

1. Stop firewalld service and Time synchronization

# firewalld 서비스 중지
sudo systemctl stop firewalld

# firewalld 서비스 자동 실행 중지
sudo systemctl disable firewalld

# 표준 시간대 설정 (서울)
sudo timedatectl set-timezone Asia/Seoul

# chrony 설치 및 NTP 동기화 활성화
sudo dnf install -y chrony
sudo systemctl enable --now chronyd

# 동기화 상태 확인
chronyc tracking
chronyc sources -v

2. swap 기능 비활성화

# swap 끄기
sudo swapoff -a

# swap 자동 마운트 끄기
sudo vi /etc/fstab
# /swap 라인 주석 처리

3. containerd(docker) 설치

# 패키지 업데이트
sudo yum update -y
# 필수 패키지 설치
sudo yum install -y yum-utils iproute-tc
# docker 저장소 추가
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# containerd 설치
sudo yum install containerd.io.x86_64 -y 
# containerd 자동 시작하도록 설정
sudo systemctl enable --now containerd
# containerd 설정 파일 생성
sudo bash -c "containerd config default > /etc/containerd/config.toml"
# Cgroup을 Systemd를 통해 관리하도록 설정
sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml

4. 쿠버네티스 설치

# kubernetes 저장소 설정
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

참고링크 : install-kubeadm

# SELinux 를 permissive mode로 변경
# 즉시 변경 (재부팅시 적용 X)
sudo setenforce 0    

# 설정 파일 수정 (재부팅 후 적용)
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# kubelet kubeadm kubectl 설치
sudo yum install kubelet kubeadm kubectl --disableexcludes=kubernetes -y

# kubelet 자동 시작하도록 설정
sudo systemctl enable --now kubelet
# net.ipv4.ip_forward=1 로 설정
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

# bridge 모듈 로드
sudo modprobe br_netfilter

# net.bridge.bridge-nf-call-iptables = 1 로 설정
echo "net.bridge.bridge-nf-call-iptables = 1" | sudo tee -a /etc/sysctl.conf

# 변경 사항 적용
sudo sysctl -p
# containerd 재시작
sudo systemctl restart containerd

5. kubeadm init (master node)

sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address 192.168.1.71

[조금 기다리다 보면 ....]
[앞부분 생략]
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.71:6443 --token fx8wwi.h1sg517qd62hft7e \
        --discovery-token-ca-cert-hash sha256:62133cfdf41b98d1f45d0a42a9f72af146b632c50c0bda7044461f7e41c1cc1c
# 인증 정보 복사 (위에서 제시한 가이드)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# calico 설치 (network cni 플러그인 중 하나)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/master/manifests/tigera-operator.yaml

# custom-resources.yaml 파일은 수정이 필요해서 다운로드 먼저
curl -O https://raw.githubusercontent.com/projectcalico/calico/master/manifests/custom-resources.yaml

# custom-resoures.yaml 편집
vi custom-resources.yaml     #cidr 정보를 변경 (-> 10.10.0.0/16)

# 설치
kubectl apply -f custom-resources.yaml

참고링크 : calico 설치가이드

# /etc/resolve.conf 소프트 링크 (혹은 copy) (master node)
# 쿠버네티스 dns 질의 시 /run/systemd/resolve/resolv.conf 파일을 참조 함
sudo mkdir -p /run/systemd/resolve 
sudo ln -s /etc/resolv.conf /run/systemd/resolve/resolv.conf


# 설치 확인하기 
kubectl get pods -A

[STATUS : All Pending --> All Running]

  • 추후 worker를 추가할 경우 유효기간 경과(24시간)로 인해 token 발행 및 해쉬값 확인이 필요함.   worker 바로 연결 시에는 아래 단계 생략 하고 “5. kubeadm init (master node) 단계”에서 복사해둔 kubeadm join 문 사용.
# token 재발행 (Master node after 24 hours)
kubeadm token create
[token #1]
# token 해쉬값 확인하기 (Master node after 24 hours)
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
[token #2]

6. kubeadm join (worker Node)

“5. kubeadm init (master node) 단계”에서 복사해둔 kubeadm join 문 사용.
# kubeadm join (worker node) (node 추가하기)
sudo kubeadm join 192.168.1.71:6443 --token [token #1] \
        --discovery-token-ca-cert-hash sha256:[token #2]
# master node의 config 파일 복사 (worker node) 
mkdir -p $HOME/.kube

scp totoli@192.168.1.71:/home/totoli/.kube/config /home/totoli/.kube

sudo chown $(id -u):$(id -g) $HOME/.kube/config

7. hosts 편집 (all node)

# hostname추가
hostnamectl set-hostname k8s-master

# /etc/hosts 추가

sudo echo "192.168.1.71 k8s-master" >> /etc/hosts
sudo echo "192.168.1.72 k8s-worker1" >> /etc/hosts
sudo echo "192.168.1.73 k8s-worker2" >> /etc/hosts
sudo echo "192.168.1.74 k8s-worker3" >> /etc/hosts

127.0.1.1 k8s-worker3 <----- 필요 시 sudo vi /etc/hosts
# master & workers node 연결 확인
kubectl get nodes

8. Matal LoadBalancer 설치

# MetalLB Manifest 적용
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml 

#MetalLB Pod 확인
kubectl -n metallb-system get pods

#모두 Running 상태면 OK.
# IPAddressPool & L2Advertisement 설정
 # 예시: 192.168.1.240 ~ 192.168.1.250 구간을 외부 IP 대역으로 사용

cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.240-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default-adv
namespace: metallb-system
spec:
ipAddressPools:
- default-pool
EOF

# 정상 설치 확인
kubectl -n metallb-system get ipaddresspool,l2advertisement
kubectl -n metallb-system get pods

9. Portainer Environments 연결

# Portainer 이름영역 생성
kubectl create namespace portainer

#Portainer agent 설치 (portainer-agent-k8s-lb manifest 적용)
kubectl apply -n portainer -f https://downloads.portainer.io/ce2-33/portainer-agent-k8s-lb.yaml

#위 YAML은 자동으로 LoadBalancer 서비스를 생성하므로 MetalLB가 설치되어 있다면 자동으로 IP를 할당받음.

# 서비스 확인
kubectl -n portainer get svc
kubectl -n portainer get pods -o wide
# Portainer UI에서 Agent 연결
> 좌측 메뉴 → Environments → Add Environment
> Kubernetes Agent 선택
> 주소 입력: 192.168.1.240:9001

10. LoadBalancer controller 고정 IP 설정

# Agent 서비스에 고정 IP(192.168.1.240) 지정함
kubectl -n portainer patch svc portainer-agent -p '{"spec":{"type":"LoadBalancer","loadBalancerIP":"192.168.1.240"}}'
# 최종 확인 
kubectl -n metallb-system get ipaddresspool,l2advertisement
kubectl -n portainer get pods -o wide
kubectl -n portainer describe svc portainer-agent

11. Kubernetics-dashboard 설치 및 LoadBalancer 연결 설정

# 쿠버네티스 대시보드 배포
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

# 설치확인
kubectl -n kubernetes-dashboard get pods -o wide

# Running 상태가 되면 성공
# 접근용 계정(ServiceAccount) 및 ClusterRole 생성
cat <<EOF | tee dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: totoli
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: totoli
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: totoli
namespace: kubernetes-dashboard
EOF

# 관리자 유저 생성
kubectl apply -f dashboard-adminuser.yaml
# 계정 인증 토큰 발급
kubectl -n kubernetes-dashboard create token totoli

12. MetalLB를 통한 외부 접근 연결

# kubernetes-dashboard 서비스 타입을 LoadBalancer로 변경.
kubectl -n kubernetes-dashboard patch svc kubernetes-dashboard -p '{
"spec": {
"type": "LoadBalancer",
"loadBalancerIP": "192.168.1.241"
}
}'
# 정상 설치 시 환경 값 요약

clear
echo "=== Portainer Agent ==="
kubectl -n portainer get svc portainer-agent -o wide
echo
echo "=== Dashboard ==="
kubectl -n kubernetes-dashboard get svc kubernetes-dashboard -o wide
echo
echo "=== ServiceAccount totoli ==="
kubectl get clusterrolebinding | grep totoli

# Portainer Agent 192.168.1.240:9001
# Dashboard 192.168.1.241 (MetalLB)
# ServiceAccount totoli (cluster-admin)
# Token 재발급 kubectl -n kubernetes-dashboard create token totoli

13. Kubernetics-dashboard Skip-Login 활성화 (Option)

# 컨테이너 args에 --enable-skip-login 추가
kubectl -n kubernetes-dashboard patch deployment kubernetes-dashboard \
--type=json \
-p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--enable-skip-login"}]'
# 기본은 대시보드의 SA(kubernetes-dashboard) 권한으로 동작함 → 권한이 제한적임
# 관리자처럼 쓰려면 아래처럼 cluster-admin 부여함(보안 주의)
kubectl create clusterrolebinding kubernetes-dashboard-admin \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:kubernetes-dashboard
# 되돌리기(롤백)
# 플래그 제거
kubectl -n kubernetes-dashboard patch deployment kubernetes-dashboard \
--type=json \
-p='[{"op":"remove","path":"/spec/template/spec/containers/0/args"}]'

# 또는 kubectl edit로 args에서 --enable-skip-login만 삭제

# 과권한 바인딩 제거(만약 부여했으면)
kubectl delete clusterrolebinding kubernetes-dashboard-admin

14. Autoscaling policy defined. (Option)

metrics-server 설치
# 마스터 노드에서 다음 명령만 실행하면 됨
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# metrics-server에 TLS 완화 옵션 추가
kubectl -n kube-system patch deploy metrics-server --type='json' -p='[
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"},
{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-preferred-address-types=InternalIP,Hostname,ExternalIP"}
]'
# 롤아웃 완료 확인
kubectl -n kube-system rollout status deploy/metrics-server

#deployment "metrics-server" successfully rolled out 결과나오면 OK

# 배포 상태 확인
kubectl -n kube-system get pods -l k8s-app=metrics-server

# API 서비스 등록 확인
kubectl get apiservices | grep metrics

# v1beta1.metrics.k8s.io 가 True 상태여야 함.

kubectl top nodes

# cpu 사용률과 memory 사용률 표출여부 확인하면 완료

 

 

[DB Modeling] ERwin Data Modeler 사용법

1. ERwin 사용하기

1. 새 파일 만들기

2. 특성 바꾸기

1) 파일 이름 설정하기

2)Notation에서 표기방식 IE로 설정하기

3. 엔티티 만들기

– Enter: 이름/기본키/속성에서 빠져나가기

-Tab : 다음으로 넘어가기

– 더블클릭: 편집

– F2 : 속성 이름 바꾸기

4. 각 속성의 자료형 설정하기(도메인)

– 아래 예시에서는 이미 모든 속성을 만들었지만 오른쪽 클릭->Attribute에서 새로운 속성을 만들 수 도 있다.

– 이렇게 새로운 속성을 만들면서 자료형을 지정할 수 도 있고, tab키를 이용해 엔티티를 만들 때 속성명을 모두 지정한 뒤

   attribute 창에서 Domain을 지정할 수 도 있다.

– 도메인(Domain) : 속성의 값, 타입, 제약사항등에 대한 값의 범위

 -모든 속성에 그 특성에 맞게 자료형을 지정해준다.

5. 식별관계, 비식별 관계

– 식별 관계(Identifying Relationship): 부모 테이블의 기본키가 자식 테이블의 기본키 혹은 후보키 그룹의 구성원으로 전이되는 것 -> (부모테이블) 사원 엔티티, (자식테이블) 신체정보 엔티티

– 비식별 관계(Not Identifying Relationship): 부모 테이브릥 기본키가 자식 테이블의 일반 칼럼으로 전이되는 것

-> (부모테이블) 부서 엔티티, (자식테이블) 사원 엔티티

 

  • 관계에 대한 옵션 설정: 부서 테이블과 사원 테이블 간의 관계선을 선택한 후 오른쪽 클릭해서 Relationship Properties 메뉴 선택
  • Verb Phrase에서 각 관계에 대한 설명을 입력한다
  • Relationship Type은 부서 테이블과 사원 테이블의 관계 유형이 비식별 관계이므로 Non-Identifying이 선택되었다.
  • 관계 옵션을 설정한 뒤 바탕화면에서 오른쪽 버튼을 누르면 뜨는 팝업 메뉴의 Relationship Display로 설정

6. 다 대 다 관계 정의

1) 다 대 다 관계는 부모자식 관계가 아니므로 순서에 상관없이 ER-Win Toolbox에서 다 대 다 관계선을 선택하여 연결

2) 다대다 관계를 1 대 다 관계로 바꾸기 위해서는 관계선에서 오른쪽 클릭 후  팝업 메뉴에서 ‘Create Association Entity’를 선택하거나 다 대 다 관계선을 선택한 후 ‘ERWin Transform Toolbar’에서 ‘Many to Many Transform’버튼을 클릭하면 마법사가 나타난다.

3) 다음 버튼을 누르면 새롭게 추가될 교차 실체의 실 체명을 정의하는 대화상자가 나온다. 여기서 Entity Name에 ‘입고’라고 정의한후 다음 버튼을 선택한다.

 

4) Transform Name을 정의하는 대화상자가 나타나면 기본값으로 설정한 뒤 다음 버튼을 누른다

5) 현재 작업에 대한 정보가 나오면 마침 버튼 을 누르고 작업을 완료한다.

  • 공급업체/상품 테이블의 다대다 관계가 해소되어 교차 실체가 정의(입고)된 모습

 

  • 상품/회원 테이블간의 다 대 다 관계가 해소되어 판매엔티티를 정의한 모습
  • 모든 관계선을 차례대로 선택한 후 오른쪽 버튼의 ‘Relationship Properties..’메뉴를 선택한 후 Relationships대화상자에서 ‘Non-Indentifying’옵션 과 ‘No Nulls’옵션을 선택한다.
  • 입고/판매 테이블의 속성들을 추가하여 다이어그램을 완성한다

7. 재귀적 관계 정의(순환관계, Recursive Relationship)

– 비식별 관계선을 이용하여 자기 자신과 관계를 맺는 재귀적 관계를 정의한다.

– 동일한 PK를 가진 테이블을 별도로 분리하는 복합형(다중Entity)과 Entity타입 내에서 자기자신을 참조하는 통합형(단일 Entity)으로 나뉜다.

  • Rolename 정의 ⇒ Relationships 대화상자에서 Rolename 탭을 선택한 후 Rolename입력상자에 ‘직속상사번호’를    기술 (‘직속상사번호’라는 속성이 FK로 전이됨)

 

8. 슈퍼타입과 서브타입

  • 슈퍼타입 엔티티란 상호 배타적인 더 작은 그룹으로 분할되는 엔티티를 의미한다
  • 슈퍼타입 내의 분해된 그룹을 서브타입 엔티티라고 한다
  • 하나의 엔티티에서 배타적인 관계를 파악하고 이를 각각의 실체로 정의하고자 했을 때 각각의 실체에 공통되는 속성들을 모아놓은 엔티티를 슈퍼타입으로 개별적인 속성들을 따로 분리해서 각각의 서브타입으로 정의할 수 있다.
  • 예를 들어 아래 그림과 같이 사원 엔티티가 있다고 하면, 한 회사에는 정규직 사원과 임시직 사원이 있을 수 있다. 일반적으로 정규직 사원은 연봉으로 임시직 사원 은 월급이나 수당으로 급여내역이 정의되므로 하나의 레코드에 입력될 경우 정규직은 월급과 수당에, 임시직은 연봉에 Null 값이 입력될 것이다.

1) 우선 아래와 같이 사원, 정규직, 임시직 엔티티를 만든다.

2) 슈퍼타입과 서브타입에 관한 정의는 ERWin Roolbox의 ‘Exclusive sub-category’버튼을 이용 한다.

3) ‘Exclusive sub-category’ 버튼을 선택하고 슈퍼타입을 먼저 선택한 후 서브타입 중에 하나인 정규직 엔티티를 선택하면 다음과 같은 모습이 된다

4) 슈퍼타입과 서브타입의 관계 설정은 Exclusive-sub Category 버튼을 누른 상태로 중간에 있는 교차점을 선택한 후 임시직 엔티티를 선택하면 다음과 같이 슈퍼타입과 서브타입의 관계가 형성된다

 

Leopold FC660C Bluetooth (BLE660C) Connection Settings

블루투스 페어링

Bluetooth가 연결되지 않고 검색 가능한 경우 페어링할 수 있습니다. 주로 이 섹션을 참조하세요:

BLE 시리즈

문제가 있는 경우 이 지침을 사용하여 문제 해결을 수행하십시오: BLE 문제 해결

하드웨어 스위치

원래 딥 스위치 위치에는 푸시 스위치가 있습니다. 이것은 컨트롤러의 유일한 스위치입니다.

주목:

  • 이 스위치는 누르면 꺼지고, 올리면 켜집니다.
  • 이 스위치의 기능은 블루투스가 아니라 배터리 전원 공급을 켜거나 끄는 것입니다.
  • 따라서 이 스위치가 꺼져 있을 때에도 USB 케이블을 연결하면 USB가 전원이므로 Bluetooth가 계속 작동할 수 있습니다.

블루투스를 끄고 싶으시다면 블루투스 스위치 및 연결 상태를 참고하세요.

힌트

  • 이 소프트웨어 스위치는 USB만 또는 일시적으로 사용하는 사람들을 위해 **Bluetooth 기능**을 완전히 끄도록 설계되었습니다. 이 스위치가 꺼져 있는 동안 물리적 전원 스위치를 끄는 것이 좋습니다.
  • 이 기능은 에너지를 절약하기 위해 매일 Bluetooth를 끄도록 설계된 것이 아닙니다. BLE660C/BLE980C는 잠금 모드보다 이 기능을 사용하여 대기 모드에서 훨씬 더 많은 전력을 소모합니다.

배터리 충전

충전 포트와 데이터 포트는 모두 컨트롤러의 USB 포트입니다.

충전에는 PC의 USB 포트나 5V 충전기를 사용하는 것이 좋습니다.

  • 부적절한 충전(6V 이상)은 충전 IC를 파손할 수 있습니다. 고전력 충전기를 사용해도 기본 충전 전류가 약 450mA로 제한되어 충전 속도가 빨라지지 않습니다.
  • 충전에는 5V 이하의 충전기를 사용하세요. 전원 공급 장치 또는 다른 충전기가 있는 HUB의 일부 U 포트는 5V보다 높을 수 있습니다.
  • 장시간 플러그를 꽂아 사용할 경우, 배터리를 뽑아두거나 적어도 배터리 스위치를 끄는 것이 좋습니다.

충전 표시등은 전원 버튼 아래에 있는 빨간색(또는 파란색) LED입니다. 아래에서 볼 수 있습니다. 세 가지 상태가 있습니다. v2.3 버전에서는 충전 표시등이 제거되었지만 배터리 수준을 x1%로 표시하여 여전히 충전 중임을 판단할 수 있습니다.

충전 LED 상태 의미
밝기가 낮거나 깜박임 비정상(배터리가 없거나 배터리에 문제가 있음)
높은 밝기 충전 중
꺼짐 또는 매우 낮은 밝기 배터리가 완전히 충전되었습니다

win10 1809 이상에서는 배터리 백분율 표시가 지원됩니다. 정확하지 않으며 참조용일 뿐입니다(특히 충전 중에 표시되는 오류가 더 큽니다). 10%마다 수준이고 가장 높은 것은 90%입니다. 또한, 충전 중에는 백분율이 x1%로 표시되며 다음 그림과 같이 충전하지 않을 때보다 1% 더 높습니다.

완전히 충전되면 충전 표시등이 꺼지거나 밝기가 매우 낮아질 수 있습니다.

Mac은 타사 Bluetooth 장치의 배터리 서비스를 차단했습니다. 따라서 배터리 수준을 알고 싶다면 Output Battery Percetage as Text 기능(BLE660C/BLE980C의 기본 단축키는 Fn+E)을 사용할 수 있습니다. 충전 및 배터리 정보

키맵 편집 및 펌웨어 재플래시

웹사이트 https://ydkb.io를 열고 키보드 BLE660C 또는 BLE980C를 선택한 다음 [대용량 저장 장치 부트로더(U 디스크 모드)](부트로더/msd-부트로더) 페이지에 플래싱 방법이 있습니다. 키 편집기에 대한 설명은 이 문서의 다른 부분을 참조하세요.

케이블을 삽입하여 점멸 모드로 들어가려면 왼쪽 위 키(일반적으로 ESC)를 누르는 것 외에도 LED와 기능을 사용할 수 있습니다 Reset실수 로 누르는 것을 방지하기 위해 <kbd>LCtrl을 누른 상태에서 이 키를 누르면 됩니다. 이렇게 하면 플러그 Reset를 뽑았다가 다시 꽂지 않고도 바로 점멸 모드로 전환할 수 있습니다.

지표 및 전력 절약

표시기의 일반적인 기능은 LEDMAP 으로 정의할 수 있습니다 . 표시기는 키보드가 작동 중일 때만 켜지고 절전 모드는 아닙니다. 표시기를 계속 켜두는 기능으로 설정하지 않는 것이 좋습니다. 그러면 전력 소모가 증가하고 배터리 수명이 크게 줄어들 수 있습니다.

블루투스 모드에서 주의 사항

  • 블루투스 모드에서는 Num, Caps, Scroll Lock 표시등이 블루투스 모드의 OS 상태와 동기화되지 않습니다.
  • 블루투스 모드에서는 누르면 켜지거나 꺼집니다. USB 모드에서는 동기화됩니다.
  • 한 지표가 동기화되지 않은 경우 Shift + Capslock과 같은 Shift + KEY를 사용할 수 있습니다. 이런 식으로 CapsLock은 적용되지만 지표는 변경되지 않습니다.
  • 블루투스 모드에서 이 기능을 적절히 사용하면 표시등을 반대로 바꿀 수 있습니다. 예를 들어, Num Lock이 켜져 있을 때 Num Lock 표시등을 끄고 꺼져 있을 때 표시등을 켜면 전력을 절약할 수 있습니다.

LEDMAP 설정 외에도 몇 가지 특수 기능이 있습니다.

상태 또는 작업 BLE660C LED 표시 방식
플래시 모드(대기) 두 개의 표시등이 함께 깜박이거나 번갈아 깜박이며 절대 꺼지지 않습니다. 660C의 무소음 버전은 전면에 표시등이 하나뿐입니다.
플래시 모드(데이터 쓰기) 위의 내용을 토대로 Caps 표시등이 빠르게 깜빡입니다.
시작시 블루투스가 연결되지 않음 상태 표시 두 개의 표시등이 깜박이며 연결되지 않은 경우 약 15초 후에 깜박임이 멈춥니다.
시작 시 블루투스가 연결됨. 상태 표시 두 표시등이 동시에 느리게 깜박입니다. 켜지는 시간은 꺼지는 시간보다 훨씬 깁니다.
LShiftRShift+를 누르세요s 위와 같이 Bluetooth 연결 상태를 표시합니다.
수동으로 잠금 모드로 들어가기 두 개의 표시등이 동시에 켜진 후 Scroll 표시등, Caps 표시등 순으로 꺼집니다.
2단계 에너지 절약 또는 잠금 모드에서 깨어나기 두 개의 표시등이 동시에 켜진 후 Bluetooth 연결 상태를 나타내기 시작합니다.
배터리 부족 알림 키보드를 사용할 때는 두 개의 표시등이 동시에 깜박입니다. 에너지를 절약할 때는 깜박이지 않습니다. 2~3일은 여전히 ​​사용할 수 있습니다.
배터리가 매우 부족하다는 메시지 키보드를 사용할 때 두 개의 표시등이 동시에 빠르게 깜박입니다. 에너지를 절약할 때는 깜박이지 않습니다. 가능한 한 빨리 충전하는 것이 좋습니다.

BLE980C의 경우, 설명의 편의를 위해 전면의 3개 표시등을 왼쪽에서 오른쪽으로 LED1 LED2 LED3으로 표시하였습니다.

상태 또는 작업 BLE980C LED 표시 방식
점멸 모드(유휴) 3개의 표시등이 함께 깜박이거나 교대로 깜박이며 항상 켜져 있습니다.
플래시 모드(데이터 쓰기) 위 내용을 기준으로 LED3가 빠르게 깜박입니다.
시작 시 Bluetooth 연결 해제 상태 표시 LED3가 깜박이며, 연결되지 않은 경우 약 15초 후에 깜박임이 멈춥니다.
시작 시 Bluetooth 연결 상태 표시기 LED2와 LED3이 동시에 느리게 깜박입니다. 켜지는 시간은 꺼지는 시간보다 훨씬 깁니다.
LShiftRShift+를 누르세요s 위와 같이 Bluetooth 연결 상태를 표시합니다.
수동으로 잠금 모드로 들어가기 3개의 조명이 동시에 켜지고 LED3 LED2 LED1 순으로 꺼집니다.
2단계 에너지 절약 또는 잠금 모드에서 깨우기 3개의 표시등이 동시에 켜지고 블루투스 연결 상태를 나타내기 시작합니다.
배터리 부족 알림 키보드를 사용할 때는 세 개의 불빛이 동시에 깜빡인다. 에너지를 절약할 때는 깜빡이지 않는다. 2~3일은 쓸 수 있다.
배터리 매우 부족 알림 키보드를 사용할 때 세 개의 표시등이 동시에 빠르게 깜박입니다. 에너지를 절약할 때는 깜박이지 않습니다. 가능한 한 빨리 충전하는 것이 좋습니다.

힌트

  • 배터리 부족 프롬프트는 가장 높은 우선순위를 갖습니다. 배터리가 부족하면 항상 다른 것을 표시하고 덮습니다.
  • FC660C의 무소음 버전에는 스크롤 표시기가 없으므로 Caps 표시기를 보고 판단하세요.

그 다음은 절전 모드에 대해서입니다.

  1. 키보드가 아무 키도 누르지 않고 3초 동안 유휴 상태가 되면 일반 절전 모드로 들어갑니다. 이 모드에서는 30ms마다 매트릭스가 스캔됩니다. 아무 키나 누르면 일반 절전 모드에서 빠져나갑니다.
  2. 키보드의 블루투스가 90초 동안 연결되지 않거나 2.5시간 이상 사용하지 않으면 블루투스가 꺼지고 심층 절전 모드로 전환됩니다. 아무 키나 3~5초 동안 길게 눌러 깨우세요.
  3. 잠금 모드를 사용하면 키보드가 바로 심층 절전 모드로 전환됩니다. 2와의 차이점은 이 방법으로 F와 J만 3~5초 동안 함께 눌러서 깨울 수 있다는 것입니다.

심층 절전 모드의 전력 소모는 매우 낮습니다. 일상적으로 사용하는 경우 전원 스위치를 끌 필요가 없으며 키보드를 그대로 두고 절전 모드로 전환하면 됩니다. 가방에 넣어 가지고 다니려면 잠금 모드로 전환하여 예기치 않게 깨어나는 것을 방지하는 것이 좋습니다.

다음 GIF는 배터리가 부족할 때의 효과를 보여줍니다.

예외 처리

키 누름 오류 트리거 또는 무작위 트리거가 있는 경우. 타오바오 링크에서 제공하는 설치 지침에 따라 배터리가 hhkb 상단 키보드 회로 보드에서 절연되어 있는지 확인하십시오.

작업 중에 문제가 발생하면 가장 빠른 방법은 USB 케이블을 다시 연결하거나 키보드 전원 스위치를 껐다가 다시 켜서 제대로 작동하는지 확인하는 것입니다.

그리고 BLE 문제 해결 을 참조하세요 . 다른 버그가 있으면 이메일로 알려주세요.

하드웨어 버전의 차이점

나중에 다른 사람들이 볼 수 있도록 판매된 하드웨어 버전 간의 차이점을 기록해 두세요.

v2.3:메인 컨트롤 atmega32u4의 패키지를 변경했습니다. 일부 커패시터와 저항의 패키지를 변경했습니다(0805 -> 0603). 컨트롤러의 충전 표시등을 제거했습니다.

v2.2:v2.1 기반으로, LWinLAlt+를 사용하여 RestBluetooth를 재설정할 수 있습니다.

v2.1:v2.0을 기반으로, 블루투스를 재설정하기 위한 단락 회로를 용이하게 하기 위해 두 개의 구멍이 추가되었습니다. 그리고 외부 크리스털 발진기 대신 MCU의 내장 발진기를 사용합니다.

The end of Kubernetes version 1.23 – Ubuntu kubernetes apt install error

2024년 3월 초, docker가 익숙해서 끝까지 버티고 있던 kubernetes v1.23.x 개발 환경 설치에 돌연 문제가 생겼다. Ubuntu에서 kubeadm, kubelet, kubectl 등을 apt로 설치할 수 없게 된 것이다. 원인과 해결 방법에 대해 알아보자.

Kubernetes apt install 에러 현상과 원인

K8s 설치 시 어떤 현상이 발생하는가?

2024년 3월 초부터 ubuntu에 apt install 명령어를 통해 kubeadm, kubelet, kubectl이 설치되지 않는다. 기존 사용하던 개발 환경은 다음과 같다.

OS: jharoian3/ubuntu-22.04-arm64
Kubernetes: 1.23.6-00
Docker: 5:24.0.6-1~ubuntu.22.04~jammy

설치를 위한 명령어는 다음과 같이 사용하고 있었다.

curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt -y install kubelet="$KUBERNETES_VERSION" kubectl="$KUBERNETES_VERSION" kubeadm="$KUBERNETES_VERSION"

위 명령어를 통해 kubernetes 설치를 진행하면, 다음과 같은 에러 메시지를 확인할 수 있다.

master: deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main
master: Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease
master: Hit:3 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
master: Ign:2 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
master: Hit:4 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease
master: Err:5 https://packages.cloud.google.com/apt kubernetes-xenial Release
master:   404  Not Found [IP: 142.250.76.142 443]
master: Hit:6 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease
master: Get:7 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [110 kB]
master: Reading package lists...
master: E: The repository 'https://apt.kubernetes.io kubernetes-xenial Release' does not have a Release file.
master: 
master: WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
master: 
master: Reading package lists...
master: Building dependency tree...
master: Reading state information...
master: E: Unable to locate package kubelet
master: E: Unable to locate package kubectl
master: E: Unable to locate package kubeadm

원인은 package repository에 있다!

위의 에러 메시지를 살펴보면, kubernetes 관련 package 목록을 가져오기 위해 package repository에 접속을 하는데, 404 에러가 발생하고 있음을 알 수 있다. 최근까지 잘 되던 것이 갑자기 되지 않으니까 당황스럽다. 원인은 외부에 있음을 직감하고, kubernetes 공식 문서들을 샅샅이 뒤져보았다.

아니나 다를까, package repository가 대체된다는 안내사항이 있었다. 해당 글에서는 다음과 같이 안내하고 있다.

On behalf of Kubernetes SIG Release, I am very excited to introduce the Kubernetes community-owned software repositories for Debian and RPM packages: pkgs.k8s.io! The new package repositories are replacement for the Google-hosted package repositories (apt.kubernetes.io and yum.kubernetes.io) that we’ve been using since Kubernetes v1.5.

ℹ️ Update (January 12, 2024): the legacy Google-hosted repositories are going away in January 2024. Check out the deprecation announcement for more details about this change.

기존 사용하던 package repository가 2024년 1월부터 아예 사라질 것이라고 되어 있는데, 3월까지 잘 사용한 것도 기적이었던 것이다. 평소 부지런하게 follow up하지 않았던 스스로를 반성하게 된다.

Package repository 관련 문제 해결 방법

Package repository deprecation에 대응하기

안내사항에 따르면, 다음과 같이 package repository를 변경한 후 apt install을 진행하면 된다.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.23/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.23/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

그런데, 이렇게 변경 후 테스트해도 여전히 다음과 같은 에러가 발생한다.

master: Reading package lists...
master: E: Failed to fetch https://pkgs.k8s.io/core:/stable:/v1.23/deb/InRelease  403  Forbidden [IP: 54.192.175.103 443]
master: E: The repository 'https://pkgs.k8s.io/core:/stable:/v1.23/deb  InRelease' is not signed.

한 걸음 나아가긴 했다. 404 Not Found 에러 대신 403 Forbidden 에러가 발생하는 것으로 보아, 적어도 새로운 package repository는 서비스를 하고 있긴 하다는 것을 확인할 수 있다. 그렇다면, 왜 이런 현상이 발생하는 것일까? 이 문제에 대한 원인도 앞서 언급한 안내 글에서 찾을 수 있었다.

The new Kubernetes package repositories contain packages beginning with those Kubernetes versions that were still under support when the community took over the package builds. This means that the new package repositories have Linux packages for all Kubernetes releases starting with v1.24.0.

새로운 package repository는 v1.24.0 이상의 kubernetes만 제공한다는 것이다. 결국, kubernetes의 버전을 올려야 한다.

Docker를 버린 kubernetes v1.24로의 여정

Kubernetes v1.23.x와 v1.24.x 사이에는 큰 차이점이 존재한다. Kubernetes v1.24.0부터는 docker를 버렸다는 것이다. 공식 문서의 내용을 간단히 요약하면 다음과 같다.

  • 1.24 버전 이전에는 docker라는 specific한 CRI를 사용하고 있었다.
  • Kubernetes에서 docker 외에도 다양한 CRI를 지원하기 위해, CRI standard라는 것을 만들었다.
  • Docker는 CRI standard를 따르지 않고 있다.
  • Kubernetes는 docker 지원을 위해 dockershim이라는 코드를 만들어서 제공했다.
  • Kubernetes 개발 참여자들이 docker라는 특수 CRI를 위해 별도로 시간을 할애하는 것이 부담스럽다.
  • Kubernetes v1.24부터 dockershim 지원 안하기로 했다.

실제로, kubernetes v1.24 버전을 설치할 때 docker를 사용하려고 하면, 다음과 같은 에러를 만날 수 있다.

master:     [WARNING SystemVerification]: missing optional cgroups: blkio
master: error execution phase preflight: [preflight] Some fatal errors occurred:
master:     [ERROR CRI]: container runtime is not running: output: time="2024-03-05T00:42:52-08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
master: , error: exit status 1
master: [preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
master: To see the stack trace of this error execute with --v=5 or higher
master: failed to load admin kubeconfig: open /root/.kube/config: no such file or directory
master: To see the stack trace of this error execute with --v=5 or higher

눈물과 함께 kubernetes v1.23과 docker와 작별할 시간이다. 앞서 살펴본 package repository 설정 부분에서 버전을 지정해주는 문자열을 변경하자.

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.24/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.24/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

이후 apt-cache policy kubeadm 명령어를 통해 설치 가능한 버전을 조회해보고 apt install을 통해 설치를 진행하면 된다. 이때 주의할 점은, docker가 아니라 containerd를 사용할 것이기 때문에 설치하려는 kubernetes 버전과 호환되는 containerd 버전을 알아보고 미리 설치해두어야 한다는 것이다. Containerd와 kubernetes 버전 호환 관계는 이 문서를 확인하면 된다.

최종적으로 정상화한 개발 환경은 다음과 같다.

OS: jharoian3/ubuntu-22.04-arm64
Kubernetes: 1.24.17-1.1
Containerd: 1.7.0

간단하게 요약하면?

요약 정리

  • 현상: ubuntu에 apt install로 kubernetes를 설치할 때, package list를 불러오는 과정에서 에러 발생
  • 원인: 2024년 초부터 버려진 legacy package repository를 참조하고 있을 가능성 있음
  • 해결책: 새로운 package repository로 변경하면 됨

주의사항

  • 새로운 package repository는 kubernetes v1.24.0 이상만 제공
  • Docker를 쓰고 있었다면, containerd같은 다른 CRI로 변경 필요

ALFA – AWUS036ACS driver install of Kali Linux (v2024.2)

KALI LINUX에서 ALFA – AWUS036ACS 드라이버 설치하는 방법

현재 Kali Linux 최신 버전 2024.2를 사용 중입니다.

  1. 먼저, 클래식 업데이트와 업그레이드부터 시작.
sudo apt update && sudo apt upgrade -y

2. 헤더를 로드하고 다양한 새로운 설정을 구성할 수 있도록 재부팅해 보겠습니다.

reboot

3. 헤더와 드라이버에 필요한 패키지를 설치.

sudo apt install bc mokutil build-essential libelf-dev linux-headers-[uname -r]

4. realtek-rtl88xxau-dkms

sudo apt install realtek-rtl88xxau-dkms

5. 이제 github aircrack-ng에서 필요한 일부 파일을 추출해야 합니다.

(메인 디렉토리에 src와 같은 디렉토리를 생성하여 추가하는 것이 좋습니다.)

mkdir src && cd src

git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git

6. rtl8812au 디렉토리로 cd.

cd rtl*
make
sudo make install

7. 다른 필요한 github 파일을 복제해서 설치.

git clone https://github.com/morrownr/8821au-20210708.git
cd 8821*
sudo ./install-driver.sh

재부팅하면 끝납니다 🙂

/lib/modules/[uname -r]/ -name "88XXau.ko" 를 확인할 수 있습니다.

가상 머신을 사용하는 경우 다음 작업을 잊지 마세요.

(virtualbox의 경우)

  1. VirtualBox 확장팩 설치됨
  2. VirtualBox USB 설정 USB 무선 동글 추가
  3. VirtualBox 네트워크 설정: 브리지 어댑터 > RTL88.. > 모두 허용

[Pot Encoder] How to amplify video volume (make only the sound and voice louder)

동영상의 소리만 크게 만들려면 여러 가지 방법이 있지만 인코딩 프로그램 사용하여 쉽게 영상의 손실
없이 소리만 크게 만들 수 있다. (인코딩 프로그램의 Direct Steram Copy 기능 사용)
다음은 팟인코더(PotEncoder)를 사용하여 동영상의 화질손상 없이 소리만 증폭 시키는 방법을 소개
합니다.

1. 팟인코더를 실행 후 편집할 동영상 파일을 선택한다.

– 파일형식은 Default로 정해져 있으니 변환할 파일의 파일형식과 맞춰주면 좋다.

2. 세부설정 버튼을 클릭한다.

3. 비디오 코덱 변경을 변경한다.

 – 환경설정 -> 인코딩 -> 코덱설정 -> 비디오 코덱 -> Direct Steram Copy  선택

 – Direct Steram Copy은 비디오 코덱을 인코딩하지 않고 바로 복사한다는 의미이다.

   (음성만 수정할 때 주로 사용)

4. 오디오 코덱 볼륨을 조정한다.

 – 환경설정 -> 인코딩 -> 코덱설정 -> 오디오 코덱 -> +버튼 클릭

    -> 노멀라이저(Normalizer) 체크박스 클릭 -> 볼륨조정 -> 확인버튼 클릭

5. 인코딩 시작 버튼을 클릭하여 동영상을 인코딩한다.

How to disable packages from automatically updating in Ubuntu

apt-mark 명령어는 패키지의 속성을 변경하는 데 사용됩니다. 주로 패키지를 hold 상태로 설정하거나 해당 설정을 해제하는 데에 사용됩니다.

1. Hold 설정

지정된 패키지를 현재 설치된 버전으로 고정시키고 업그레이드를 방지합니다

sudo apt-mark hold nginx
$ sudo apt-mark hold nginx
nginx set on hold.

2. Hold 상태 확인

Hold로 설정된 패키지 목록을 확인합니다.

sudo apt-mark showhold
$ sudo apt-mark showhold
nginx

3. Hold 해제

Hold 설정을 해제하여 패키지가 다시 업그레이드될 수 있도록 합니다.

sudo apt-mark unhold nginx
$ sudo apt-mark unhold nginx
Canceled hold on nginx.

4. 자동 설치 설정

패키지를 자동 설치로 표시합니다. 이렇게 하면 해당 패키지는 다른 패키지가 삭제될 때 자동으로 제거되지 않습니다.

sudo apt-mark auto nginx
$ sudo apt-mark auto nginx
nginx set to automatically installed.

5. 자동 설치 해제

패키지를 수동 설치로 표시합니다. 이렇게 하면 해당 패키지는 다른 패키지가 삭제될 때 자동으로 제거되지 않습니다.

sudo apt-mark manual nginx
$ sudo apt-mark manual nginx
nginx set to manually installed.

6. 수동 설치 확인

수동 설치된 패키지 목록을 표시합니다.(특정 패키지가 Hold로 설정되어 있는지 확인합니다.)

apt-mark showmanual
$ sudo apt-mark showmanual
nginx
php8.1
php8.1-cli
php8.1-common
php8.1-fpm
php8.1-gd
php8.1-imagick
php8.1-intl
php8.1-mbstring
php8.1-mongodb
php8.1-mysql
php8.1-rdkafka
php8.1-readline
php8.1-redis
php8.1-xml
php8.1-zip
software-properties-common
sudo apt-mark showmanual | grep nginx
$ sudo apt-mark showmanual | grep nginx
nginx
sudo apt-mark showhold | grep nginx
$ sudo apt-mark showhold | grep nginx

7. 자동 설치 확인

자동 설치된 패키지 목록을 표시합니다.

sudo apt-mark showauto
$ sudo apt-mark showauto
adduser
apache2
apache2-bin
apache2-data
apache2-utils
apt
apt-utils
bzip2
ca-certificates
coreutils
dbus
...
util-linux
uuid-runtime
xdg-user-dirs
xz-utils
zlib1g

8. 도움말 표시

apt-mark 명령어의 도움말을 표시합니다.

sudo apt-mark --help
$ sudo apt-mark --help
apt 2.4.11 (amd64)
Usage: apt-mark [options] {auto|manual} pkg1 [pkg2 ...]

apt-mark is a simple command line interface for marking packages
as manually or automatically installed. It can also be used to
manipulate the dpkg(1) selection states of packages, and to list
all packages with or without a certain marking.

Most used commands:
  auto - Mark the given packages as automatically installed
  manual - Mark the given packages as manually installed
  minimize-manual - Mark all dependencies of meta packages as automatically installed.
  hold - Mark a package as held back
  unhold - Unset a package set as held back
  showauto - Print the list of automatically installed packages
  showmanual - Print the list of manually installed packages
  showhold - Print the list of packages on hold

See apt-mark(8) for more information about the available commands.
Configuration options and syntax is detailed in apt.conf(5).
Information about how to configure sources can be found in sources.list(5).
Package and version choices can be expressed via apt_preferences(5).
Security details are available in apt-secure(8).

How to use Oracle dbms_crypto (crypto package library)

오라클 10g 이상에서 사용할 수 있는 DBMS_CRYPTO 패키지를 이용하여 암호화 하는 방법

  1. DBMS_CRYPTO 패키지 생성

설치 되어 있지 않을 경우 다음의 SQL을 수행해서 패키지를 생성한다.

/$ORACLE_HOME/rdbms/admin/dbmsobtk.sql

/$ORACLE_HOME/rdbms/admin/prvtobtk.plb

두 패키지를 추가하는 방법..

A. 오라클 서버에 sysdba으로 접속.

>sqlplus “/ as sysdba”

B. ‘dbmsobtk.sql’ 파일 실행.

리눅스 : @$ORACLE_HOME/rdbms/admin/dbmsobtk.sql;
윈도우 : @%ORACLE_HOME%/rdbms/admin/dbmsobtk.sql;

C. ‘prvtobtk.plb’ 파일 실행.

리눅스 : @$ORACLE_HOME/rdbms/admin/prvtobtk.plb;
윈도우 : @%ORACLE_HOME%/rdbms/admin/prvtobtk.plb;

D. 추가 후 시스템 계정으로만 사용 가능하기 때문에 권한 변경.

이 경우 모두다 실행 가능하도록 하였지만 필요하다면 특정 계정에만 실행권한 주면됨.

grant execute on dbms_crypto to public;

grant execute on dbms_obfuscation_toolkit to public;

 

# 참고) 콘솔에서 실행 전체 과정.

>sqlplus “/ as sysdba”

SQL>

SQL>  @/oracle/rdbms/admin/dbmsobtk.sql

(중간 생략)

No errors.

Synonym created.

SQL>  @/oracle/rdbms/admin/prvtobtk.plb

(중간 생략)

Package body created.

No errors.

SQL> grant execute on dbms_crypto to public;

Grant succeeded.

SQL> grant execute on dbms_obfuscation_toolkit to public;

Grant succeeded.

 

  1. SYS유저에서 사용할 패키지를 생성 .

테스트에서 사용 할 암호 키 값은 ‘12345678‘을 사용한다.

DOWNLOAD SAMPLE SCRIPT : CRYPTO_PACKAGE_CREATE_SCRIPT

CREATE OR REPLACE PACKAGE PKG_CRYPTO
IS
FUNCTION ENCRYPT(INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2 := ‘12345678’)RETURN RAW;
FUNCTION DECRYPT(INPUT_STRING IN VARCHAR2, KEY_DATA IN VARCHAR2 := ‘12345678’)RETURN VARCHAR2;
END;
CREATE OR REPLACE PACKAGE BODY PKG_CRYPTO
IS
— 에러 발생시에 error code 와 message 를 받기 위한 변수 지정.
SQLERRMSG VARCHAR2(255) ;
SQLERRCDE NUMBER;
— 암호화 함수 선언 key_data 는 입력하지 않을 시에 default 로 12345678 로 지정됨.FUNCTION ENCRYPT(INPUT_STRING IN VARCHAR2
, KEY_DATA IN VARCHAR2 := ‘12345678’
)
RETURN RAW
IS
KEY_DATA_RAW RAW(4000) ;
CONVERTED_RAW RAW(4000) ;
ENCRYPTED_RAW RAW(4000) ;
BEGIN
— 들어온 data 와 암호키를 각각 RAW 로 변환한다.
CONVERTED_RAW := UTL_I18N.STRING_TO_RAW(INPUT_STRING, ‘AL32UTF8’) ;
KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, ‘AL32UTF8’) ;
— DBMS_PKG_CRYPTO.ENCRYPT 로 암호화 하여 encrypted_raw 에 저장.
ENCRYPTED_RAW := DBMS_CRYPTO.ENCRYPT(SRC => CONVERTED_RAW,
— typ 부분만 변경하면 원하는 알고리즘을 사용할 수 있다.
— 단, key value bype 가 다 다르니 확인해야 한다.
TYP => DBMS_CRYPTO.DES_CBC_PKCS5, KEY => KEY_DATA_RAW, IV => NULL) ;
RETURN ENCRYPTED_RAW;
EXCEPTION
WHEN OTHERS THEN
RETURN INPUT_STRING;
END ENCRYPT;FUNCTION DECRYPT(INPUT_STRING IN VARCHAR2
, KEY_DATA IN VARCHAR2 := ‘12345678’
)
RETURN VARCHAR2
IS
CONVERTED_STRING VARCHAR2(4000) ;
KEY_DATA_RAW RAW(4000) ;
DECRYPTED_RAW VARCHAR2(4000) ;
BEGIN
KEY_DATA_RAW := UTL_I18N.STRING_TO_RAW(KEY_DATA, ‘AL32UTF8’) ;
DECRYPTED_RAW := DBMS_CRYPTO.DECRYPT(SRC => INPUT_STRING, TYP => DBMS_CRYPTO.DES_CBC_PKCS5, KEY => KEY_DATA_RAW, IV => NULL) ;
— DBMS_PKG_CRYPTO.DECRYPT 수행 결과 나온 복호화된 raw data 를 varchar2 로 변환하면 끝!
CONVERTED_STRING := UTL_I18N.RAW_TO_CHAR(DECRYPTED_RAW, ‘AL32UTF8’) ;
RETURN CONVERTED_STRING;
EXCEPTION
WHEN OTHERS THEN
RETURN INPUT_STRING;
END DECRYPT;
END;

 

  1. 사용할 유저에게 실행 권한 부여

기본적으로 DBMS_CRYPTO 패키지 권한 만 부여하면 되지만, 혹시 안 될 경우 두 개의 패키지에 대한 사용 권한을 준다.

grant execute on pkg_crypto to USER;

 

  1. 테스트

패키지가 정상적으로 생성되었는지 테스트

SQL> select sys.pkg_crypto.encrypt ( ‘test’ ) from dual ;

A04B686B118AF67B

SQL> select sys.pkg_crypto.decrypt ( ‘A04B686B118AF67B’ ) from dual ;

test

SQL> create table test_crypto (id int , pwd varchar2(64)) ;

SQL> insert into test_crypto values (1, sys.pkg_crypto.encrypt(‘password1’) ) ;

SQL> insert into test_crypto values (2, sys.pkg_crypto.encrypt(‘password2’) ) ;

SQL> commit ;

SQL> select * from test_crypto ;

1        8A65E0E80532B5FADACA597658B8E8E0

2        8A65E0E80532B5FA6635EBCA6EB4D195

SQL> select id , sys.pkg_crypto.decrypt(pwd) from test_crypto ;

1        password1

2        password2

 

  1. 패키지 소스 암호화 (WRAP)

패키지 바디 부분을 SQL 파일로 저장한 후에, 해당 SQL파일을 오라클의 WRAP 명령을 이용하여 소스를 암호화 한다.

암호화된 소스를 이용하여 패키지를 생성한다.

패키지 바디 부분을 pkg_crypto.sql 파일로 만든 후에, WRAP 명령을 이용하여 소스 암호화를 진행 한다.

..\client_1\BIN>wrap iname=pkg_crypto.sql oname=pkg_crypto.plb

PL/SQL Wrapper: Release 19c.0- Production on Wed Sep 14 12:59:27 2019

Copyright (c) 1993, 2019, Oracle. All rights reserved.

Processing pkg_crypto.sql to pkg_crypto.plb

pkg_crypto.plb 파일을 실행 시켜도 되고, 메모장으로 열어서 사용하는 툴에 붙여 넣어서 수행 시켜도 됨.

SQL> select text from dba_source where name = ‘PKG_CRYPTO’;

PACKAGE pkg_crypto

IS

FUNCTION encrypt ( input_string IN VARCHAR2 ) RETURN RAW;

FUNCTION decrypt ( input_string IN VARCHAR2 ) RETURN VARCHAR2;

END pkg_crypto;

 

— pkg_crypto.plb 

PACKAGE BODY pkg_crypto wrapped

a000000

34e

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

abcd

b

569 237

ohqkYyNGzuK44ZjD/dc7zE6LBD4wg5VeACDWfC/NR2SlOfdRWqio8BgJ+rTLDeZ0KhuUtwfL

pHsh5UXSmrE5hH7n/MYlulcFuxz+/3JEolt108hdUznBsR865PlC+TBOESlCZ+k6dfP/0AHl

m7ZdffubfOeMEW+6xue2jQP8dS8cEnnuvOBaUG77FS9kmfvhlxjyhQm4lwlnk65byQ4mpm7j

GILd7l4DK2J9rhLoBmcn9GupCftFAI05Ew3eYFuXMfS4NUsCqzdZDLE1ssWoPgFg+nUzSFvF

96FFaMLpCoAYcU9Tq8HdBzHF2Ns/HrqqvzJZx/uPlmo9e4NoSHOonHhr6S2BSS6PXVSXOfeW

dCG489cqwDaf/h2Nxx6WEONFUFoTb7aNG1pvW8Ng5SfDjDYeq4D+lAQA3onCzKeT6/y2hsuA

IJnvdL8FCN3PdeQlz1W8zWexpkBqPyhKvj+RXuuxlTfRnM2voRmdrRch6sSNazdobfnUJOL4

tbN6GdLtMV5ecSORI6U3gkDu9v0wuFojLTjBxLTrCgbIq5AI1x9AOIKC

 

Apache tika를 사용하여 컨텐츠 구문 분석 RESTFul 서버 설치

Java 로 개발된 contents 를 parsing 하는 라이브러리 및 app 으로 command  line 및 GUI 모드로 동작하는 app 와 RESTFul API 로 동작하는 server 가 있습니다.

# 설치

커맨드용 app 는 다음 주소에서 받으면 됩니다.

$ wget http://apache.mirror.cdnetworks.com/tika/tika-app-1.19.jar

standalone 으로 구동하고 RESTFul 로 요청할 수 있는 서버도 있는데 자동화하려면 이게 더 편리하며 아래 주소에서 받으면 됩니다.

$ wget http://apache.mirror.cdnetworks.com/tika/tika-server-1.19.jar

서버로 구동할 경우 처리 결과를 DB 에 남기려면 SQLite JDBC 가 필요하며 아래 라이브러리를 다운받아서 동일한 폴더에 위치시키면 됩니다.

$ wget http://central.maven.org/maven2/org/xerial/sqlite-jdbc/3.23.1/sqlite-jdbc-3.23.1.jar

# 실행

실행은 java -jar 옵션으로 아래처럼 실행하면 됩니다.

App

$ java -jar tika-app-1.19.jar

Server

$ java -jar tika-server-1.19.jar

SQLite JDBC 적용하려면 -cp 옵션을 추가합니다.

$ java -cp . -jar tika-server-1.19.jar

기본 포트는 9998 이며 다른 포트(Ex: 1234)로 구동할 경우 아래와 같이 -p 옵션을 추가합니다.

$ java -cp . -jar tika-server-1.19.jar  -h 0.0.0.0 -p 1234

# 서버 정보

서버로 구동했으면 REST API 로 여러 가지 요청을 할 수 있습니다.

version 확인

$ curl localhost:9998/version

Apache Tika 1.19

detector 확인

$ curl localhost:9998/detectors

# 지원하는 mime type 확인

$ curl localhost:9998/mime-types

# 컨텐츠 parsing

meta 분석

$ curl -T a.pdf localhost:9998/meta

특정 필드가 필요할 경우 url 에 필드명 명시하며 아래는 저자 필드만 추출합니다.

$ curl -T a.pdf localhost:9998/meta/Author
PDF 렌더링 속도를 빠르게 하려면 JDK 8 을 사용하고 JVM 구동시 아래 옵션 추가합니다.
-Dsun.java2d.cmm=sun.java2d.cmm.kcms.KcmsServiceProvider

# 원하는 형식으로 출력

기존 출력은 text/csv 이며 Accept 헤더에 원하는 포맷을 설정해서 호출하면 됩니다.

XML

$ curl -T a.pdf -H "Accept: application/rdf+xml" localhost:9998/meta

아래는 json 형식으로 결과물을 전달 받습니다.

$ curl -T a.pdf -H "Accept: application/json" localhost:9998/meta

JSON 일 경우 개행을 안 해서 보기가 힘드니 jq 로 포맷팅 하면  결과물이 보기 편해집니다.

$ curl -T a.pdf -H "Accept: application/json" localhost:9998/meta | jq .

Example

$ curl -H "Accept: application/json" localhost:9999/meta -T sample.pdf

 $ curl -H "Accept: text/plain" localhost:9999/tika -T sample.pdf

 $ curl -H "Accept: application/json" localhost:9999/rmeta -T sample.pdf

Automatically deleting logs after a certain period of time in Linux

로그 삭제 스크립트 만들기

vi deleteLog.sh

#!/bin/sh

#생성 된지 7일이 지난 로그를 삭제하는 Script
/usr/bin/find /log/ -type f -mtime +7 -exec rm {} +

:wq!

chmod 744 deleteLog.sh

 

type -f 는 파일만 찾는 Option입니다. 디렉토리를 찾기 위해서는 -d 옵션으로 변경해 주시면 됩니다.

-mtime 옵션은 수정된 날짜 시간 기록을 찾는 옵션입니다.

-ctime 옵션은 생성된 날짜 시간 기록을 찾는 옵션입니다.

-atime 옵션은 읽히거나 실행 됐을때의 기록을 찾는 옵션입니다.

날짜 기준 + 를 – 로 바꾸면 현재 날짜 기준 수정된지 7일 이내 파일들을 찾게됩니다.

 

Crontab에 해당 로그 등록하기 

crontab -e

00 00 * * * /install/cron/deleteLog.sh

:wq!

* 매일 정각에 해당 스크립트가 실행 될 수 있도록 Crontab에 등록 해줍니다.