본문 바로가기

Old Posts226

[Linux] 빈 RPM 패키지 만드는 방법 리눅스 서버를 운영하다보면 빈 RPM 패키지를 만들어 설치해야할 때가 있다. 특정 소프트웨어를 Makefile로 직접 빌드해 설치하는 경우 서버에는 소프트웨어가 설치되지만 rpmdb에는 패키지 정보가 추가되지 않는다. 소프트웨어를 사용할 수는 있지만 rpm을 통해 설치하지 않아서 의존성 체크는 계속 실패하게 된다. 이 경우 빈 rpm 패키지를 만들어 설치하는 식으로 rpm의 의존성 체크를 우회할 수 있다. 예를 들어 python 패키지는 특정 버전 이후부터 python2와 python3로 패키지 이름이 변경되었다. 오래된 버전의 운영체제에서 동작하던 소프트웨어 중에는 python 이라는 이름의 패키지에 의존성이 걸려있는 경우가 있다. python2, python3가 설치되어 있고 alias도 되어 있어 .. 2023. 8. 10.
[Java] NavigableSet 사용법 및 예제 Java의 NavigableSet 인터페이스는 SortedSet을 상속하는 인터페이스다. Set 인터페이스를 상속한 SortedSet 인터페이스를 상속하고 있기 때문에 NavigableSet 인터페이스를 구현하기 위해서는 Set, SortedSet의 메소드들도 구현해야한다. NavigableSet 이름에서 알 수 있듯이 NavigableSet은 저장되는 엘리먼트들에 Navigation 기능을 더한다. NavigableSet의 JavaDocs를 보면 다음과 같은 설명이 있다. A SortedSet extended with navigation methods reporting closest matches for given search targets. NavigableSet은 SortedSet을 상속하기 때문에.. 2023. 5. 25.
[Java] SortedSet 사용법 및 예제 자바에서 Set은 엘리먼트들의 중복을 제거하기위해 사용된다. 대표적인 구현체로 HashSet이 많이 사용된다. HashSet의 경우 담고 있는 엘리먼트들의 해시 값에 따라 무작위 순서로 순회하게 된다. 반면 SortedSet의 경우 중복을 제거하면서 엘리먼트들의 저장되는 순서를 관리할 수 있다. SortedSet은 이 순서에 따라 엘리먼트들을 순회하게 된다. SortedSet 이름에서 알 수 있듯이 SortedSet은 엘리먼트들을 정렬된 순서로 저장한다. 저장되는 엘리먼트가 Comparable 인터페이스를 구현하고 있다면 compare() 메소드의 로직을 이용하게 되며, SortedSet의 구현체를 생성할 때 Comparator 클래스를 넘겨 엘리먼트들의 대소 비교에 사용할 수 있다. SortedSet은.. 2023. 5. 25.
[Java] NavigableMap 사용법 및 예제 Java NavigableMap 인터페이스는 SortedMap을 상속하는 인터페이스다. Map 인터페이스를 상속한 SortedMap 인터페이스를 상속하고 있기 때문에 Map, SortedMap에 정의되어 있는 메소드를 정의해야한다. NavigableMap NavigableMap은 저장된 Key-Value 엔트리에 Navigation 기능을 더해주고 있다. 즉, SortedMap이므로 Key-Value 엔트리가 정렬된 상태로 저장된다. 여기에 찾고자 하는 Key 값에 가장 가까운 엔트리를 찾는 Navigation 메소드가 추가되었다. NavigableMap의 JavaDocs를 보면 다음과 같이 설명되어 있다. A SortedMap extended with navigation methods returning.. 2023. 5. 25.
[Java] SortedMap 사용법 및 예제 자바에서 Map 인터페이스는 Key와 Value 쌍을 저장하기 위해 사용된다. Map 인터페이스를 상속하여 정의된 SortedMap은 Key와 Value 쌍을 순서를 유지하면서 저장한다. SortedMap Map 인터페이스를 상속하는 SortedMap은 Key-Value 쌍을 정렬된 순서대로 저장한다. Map 인터페이스에서 정의하는 것처럼 Key를 통해 Value를 얻어올 수 있으며, 동시에 정렬된 순서대로 Key-Value 쌍을 순회할 수도 있다. Map에 저장되는 데이터를 순서대로 접근하고 싶은 경우 사용하면 좋다. SortedMap에 저장되는 Key-Value는 Key값의 Natural Order에 맞게 저장된다. Key 클래스가 Comparable 인터페이스를 구현하도록하거나 SortedMap의 .. 2023. 5. 24.
[Java] DelayQueue 사용법 및 예제 자바의 DelayQueue는 java.util.concurrent 패키지에 들어있는 클래스로 AbstractQueue를 상속받고 있으며 BlockingQueue 인터페이스를 구현한다. DelayQueue는 엘리먼트의 딜레이 시간을 기반으로 동작하는 Priority Queue라고 생각하면 된다. 즉 엘리먼트들이 Delay 시간을 기준으로 정렬되어 가장 빨리 딜레이 시간이 끝나는 엘리먼트가 큐의 헤드쪽에 위치한다. 큐에서 엘리먼트를 꺼낼 때, 엘리먼트의 딜레이 시간이 지나지 않았다면 소비할 수 없다. 이후 딜레이 시간이 0보다 작은 숫자가 리턴되면 그 때서야 엘리먼트를 꺼내 쓸 수 있다. DelayQueue 클래스 DelayQueue는 다음과 같은 상속 구조를 가지고 있다. public class Delay.. 2023. 5. 1.
Apple M1 Pro 맥북에 JDK 1.8 설치하기 M1 Pro 맥북에 개발환경을 설치했다. 자바 환경을 설치해야하는데, Oracle JDK는 라이센스 문제가 있어서 사용하지 않는 것으로 가이드되고 있어 OpenJDK를 설치하기로 했다. OpenJDK에도 여러가지 선택지가 있는데 서버환경에서 많이 사용되고 있는 AdoptOpenJDK를 사용하려고 찾아봤더니 애플 실리콘인 M1 Pro의 아키텍처인 arm 아키텍처를 지원하는 JDK는 제공되지 않는 것 같았다. 다른 OpenJDK의 경우 최신 버전은 arm 아키텍처를 지원하지만 내가 써야하는 1.8 버전은 지원되지 않는 경우가 많았다. Azul Zulu 찾아보니 Azul에서 제공하는 Zulu라는 OpenJDK가 있었다. https://www.azul.com/downloads/?package=jdk 로 접속한다.. 2023. 3. 12.
[Linux] SSH 연결 최적화 - ControlMaster, ControlPath, ControlPersist 설정 클러스터를 운영하는 경우 운영 서버로 ssh 접속을 해야하는 경우가 있다. 이 때, 환경설정에 따라 아이디, 비밀번호 이외에 추가로 OTP 등의 인증을 요구하는 경우가 있다. 하루에 한번 업무차 접속하는 경우라면 상관없지만 빈번하게 새로운 ssh 연결을 생성해야하는 경우라면 매번 해야하는 ID, Password, OTP 등의 절차가 매우 번거로울 수 있다. 이 때, ControlMaster, ControlPath, ControlPersist 설정을 해두면 번거로움을 어느정도 해소할 수 있다. ssh 설정 ~/.ssh/config 파일을 열고 다음 설정을 추가하자. Host server HostName my.host.com User myUserId ControlMaster auto ControlPath ~.. 2023. 1. 4.
[Bash] 문자열 비교 방법 리눅스 Bash 스크립트에서 문자열을 비교하고, 문자열을 자르는 방법에 대해서 알아보자. 문자열 비교 - 같은지 확인 Bash 스크립트에서 두 문자열을 == 연산으로 비교할 수 있다. #!/bin/bash str1="Hello" str2="hello" if [ $str1 == $str2 ];then echo "Equal" else echo "Not equal" fi 이 스크립트를 실행하면 다음과 같은 출력을 얻게 된다. $ ./test.sh Not equal 단순히 == 연산으로 두 문자열을 비교할 경우, 둘 중 하나가 빈 문자열일 때 에러가 발생한다. 예를 들어 #!/bin/bash str1="Hello" str2="" if [ $str1 == $str2 ];then echo "Equal" else e.. 2022. 12. 2.