카테고리 보관물: 미분류

R언어 Windows에서 한글 메세지가 깨져 보일때

R과 Rstudio를 Windows에서 사용하다보면 한글로 나와야 할 메세지가 깨져 보일 때가 있습니다. 특히 에러메시지나 경고메세지가 보일 때 그렇습니다.

아래 그림에서 보이는 것 처럼 마름모꼴 도형으로 깨져 보입니다.

언어설정을 영어로 변경한다

언어 설정을 영어로 변경하면 영어로는 메세지를 볼 수 있습니다.

Sys.setenv(LANG = "en_US.UTF-8")

윈도우에서 경고 메세지를 한글로 보는 방법은 없다

깨진것을 고쳐서 한글로 보는 방법은 아직 없습니다. 영어로 바꿔서 봐야 합니다. 다음과 같이 모든 메세지를 영어로 변경해주면 됩니다.

원인은 R이 UTF-8을 쓰고 Windows가 euc-kr을 쓰기 때문이다

R은 멀티바이트 언어 즉, 로마 알파벳 계열을 사용하지 않는 언어인 한국어, 중국어, 일본어같은 것을 표현할 때 메세지를 모두 UTF-8을 사용하는데 윈도우는 내부에서 UTF-8을 처리할 수는 있지만 화면에 표현할 때는 무조건 euc-kr를 사용합니다. 애플리케이션에 따라서는 이 문제를 해결한 것들이 있지만 Rstudio는 그 처리를 해주지 않습니다.

그래서 영어로 봐야 합니다.

리눅스 E: Sub-process /usr/bin/dpkg returned an error code (1)

apt를 사용하다보면 에러 메세지가 보일 때가 있습니다.

E: Sub-process /usr/bin/dpkg returned an error code (1)

무슨 종류의 에러인지 메세지만 보고 알기 어려워 해결법 찾기가 어렵지만 알고보면 간단합니다.

설치한 패키지의 의존성이 파손된 것입니다.

다음의 명령으로 의존성 문제가 생긴 것을 해결해주면 됩니다.

sudo rm /var/lib/dpkg/info/*
sudo dpkg --configure -a
sudo apt update -y

리눅스에서 두 CSV파일을 컬럼으로 조인하기 – Joining two text files based on a specific column

리눅스에서 텍스트파일 조인하기

리눅스 코맨드로 csv 2개를 결합하는데 특정 컬럼의 값을 기준으로 조인해서 붙이고 싶을 때가 있습니다.

DB에서 SQL로 조인하는 것처럼 하는 것 말입니다.

리눅스에서 이런 것은 오래전부터 당연히 되지만 명령이 복잡하고 선행 조건이 있습니다. 그래서 외우기 보다는 된다는 것만 알고 스니펫을 적어 두고 찾아서 쓰는 것이 더 편할 수 있습니다.

자세히 봐놓지 않으면 무척 헷갈리고 실제로 해보면 잘 안되기 때문에 천천히 읽어보시기 바랍니다.

조건

언어 설정을 한국어/한글로 바꾸기

우선 파일 안에 한글이 있고 조인을 할 컬럼에 한글이 포함되어 있다면 현재 환경의 언어 설정을 한글로 지정해줍니다. 조인할 파일에 한글이 아예 없으면 안 해도 됩니다.

export LC_ALL="ko_KR.utf8"

파일의 줄바꿈을 CRLF에서 LF로바꾸기

파일을 리눅스나 유닉스에서 생성했다면 문제가 없겠지만 윈도우에서 생성했거나 외부에서 가져왔을 때 텍스트 파일의 줄바꿈 문자를 바꿔줘야합니다.

조인할 두 파일에서 조인에 사용할 컬럼은 모두 정렬되어 있어야합니다. 그것은 명령에서 처리하면 됩니다.

우선 전체 코드는 다음과 같습니다.

#!/bin/bash

# 환경에 언어를 설정하기. 한글 소팅 때문)
$ export LC_COLLATE="ko_KR.utf8"

# 내용 확인
$ cat 1.txt

# 1       홍길동
# 2       전우치
# 4       변학도
# 3       이몽룡
# 5       성춘향

# 내용 확인
$ cat 2.txt

# 성춘향  18세
# 이몽룡  19세
# 전우치  20세

# 결합하기
$ join -t $'\t' -1 2 -2 1 -o 1.1,1.2,2.2 -a1 <(sort -k 2 1.txt | tr -d '\015') <(sort -k 1 2.txt | tr -d '\015') | sort -k 1

# 1       홍길동
# 2       전우치  20세
# 3       이몽룡  19세
# 4       변학도
# 5       성춘향  18세

1.txt는 탭으로 2개의 컬럼이 구분된 파일이고 1번 컬럼은 번호, 2번 컬럼은 사람의 이름입니다.

2.txt는 탭으로 2개의 컬럼이 구분된 파일이고 1번 컬럼은 이름, 2번 컬럼은 나이입니다.

여기에서 하려는 것은 1번의 이름과 2번의 이름을 결합한 다음 1.txt 파일에 컬럼에 나이 컬럼을 하나 추가해서 붙이는 것입니다.

위의 코드에서 마지막 결과물처럼 만들려는 것입니다.

명령어는 아래와 같은데 복잡하므로 분해해서 설명합니다.

join -t $'\t' -1 2 -2 1 -o 1.1,1.2,2.2 -a1 <(sort -k 2 1.txt) <(sort -k 1 2.txt) | sort -k 1

-t $’\t’ : 구분자를 탭으로 하겠다는 것입니다. join 명령어는 구분자를 단일문자만 받기 때문에 \t를 쓰려면 저렇게 앞에 $를 쓰고 따옴표로 둘러싸줘야 합니다.

-1 2 : 이것은 1번 파일에서는 2번째 컬럼을 기준 키로 쓰겠다는 뜻입니다.

-2 1 : 2번 파일에서는 1번째 컬럼을 기준 키로 쓰겠다는 것입니다.

-o 1.1,1.2,2.2 : 출력을 할 때 1.1 (1번째 파일의 1번 컬럼), 1.2 (1번째 파일의 2번 컬럼), 2.2 (2번째 파일의 2번 컬럼)입니다. 콤마로 출력할 컬럼을 구분하고 마침표로 파일 순번과 컬럼 순번을 입력하는 것입니다.

-a1 : 1번 파일을 기준으로 그 다음의 파일을 붙이라는 뜻입니다. 이것을 안 쓰면 결합할 파일에서 출력할 때 키가 겹치는 것만 남습니다. SQL에서는 이너조인(inner join)과 같이 됩니다. 이 옵션을 빼고 실행해 보시면 차이를 금방 알 수 있습니다.

<(sort -k 2 1.txt) : 1번 파일을 컬럼 2번을 기준으로 정렬하라는 것인데 <를 앞에 붙이고 소괄호로 둘러싼 것은 정렬된 파일을 미리 만들지 않고 동적으로 정렬하기 위한 것입니다.

<(sort -k 2 1.txt) : 위에서 설명했습니다.

sort -k 1 : 결과물을 다시 1번 컬럼을 기준으로 정렬합니다.

리눅스에서 한글 파일 정렬이 안될 때 – Sorting Korean text file on Linux

다음과 같은 파일이 있습니다.

파일이름은 test.txt입니다.

1       홍길동
2       전우치
4       변학도
3       이몽룡
5       성춘향

이렇게 하면 2번째 커럼으로 소팅이 되야 합니다.

sort -k 2 test.txt


그런데 이렇게 해도 소팅이 안되고 순서가 정렬이 안되는 경우가 있습니다.

LC_COLLATE나 LC_ALL 환경변수에 한글을 지정해 줘야 합니다.

$ export LC_COLLATE="ko_KR.utf8"
# 또는
$ export LC_ALL="ko_KR.utf8"

위의 명령으로 리눅스 환경의 언어셋을 변경하면 소팅이 되는데 에러 메세지가 나올 수 있습니다.

-bash: warning: setlocale: LC_COLLATE: cannot change locale (ko_KR.utf8): No such file or directory

이 에러가 나오는 것은 언어패이 설치가 되어 있지 않기 때문입니다. 그럴 때는 이렇게 해줍니다.

# CentOs나 Redhat 리눅스 계열
$ sudo apt install language-pack-ko

# Ubuntu 우분투 계열
$ sudo yum install glibc-langpack-ko

그 뒤에 다시 sort 코맨드로 정렬을 해보면 잘 됩니다.

$ sort -k 2 1.txt

4       변학도
5       성춘향
3       이몽룡
2       전우치
1       홍길동

각종 AI 프레임워크 별로 GPU 사용 가능 확인하기

Tensorflow, Keras, Torch에서 각 버전과 GPU를 사용할 수 있는지를 알아내는 코드입니다.

GPU가 장착된 서버 또는 데스크탑에서도 Nvidia 드라이버와 CUDA를 제대로 설치하지 않아서 사용을 못하는 경우가 많습니다.

GPU가 있고 또 사용할 일이 있을 것 같다면 확인을 하고 시작하는 것이 좋습니다.

# 립러링 프레임워크들의 버전과 GPU 확인

# 1. Tensorflow
import tensorflow as tf
print("Tensorflow version: {}".format(tf.__version__))
print("Tensorflow GPUs: {}".format(tf.test.is_gpu_available(
    cuda_only=False,
    min_cuda_compute_capability=None
)))
from tensorflow.python.client import device_lib
print("Tensorflow device list: {}".format(device_lib.list_local_devices()))

# 2. Keras
from keras import backend as K
import keras
print("Keras version: {}".format(keras.__version__))
print("Keras GPUs: {}".format(K._get_available_gpus()))

# 3. PyTorch
import torch
print("Torch device count: {}".format(torch.cuda.device_count()))
print("Torch device name: {}".format(torch.cuda.get_device_name(0)))
print("Torch CUDA is available: {}".format(torch.cuda.is_available()))

결과는 이런 식으로 나옵니다.

Tensorflow version: 2.6.0
Tensorflow GPUs: True
Keras version: 2.6.0
Keras GPUs: ['/device:GPU:0', '/device:GPU:1']
Torch device count: 2
Torch device name: NVIDIA GeForce RTX 3080
Torch CUDA is available: True