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

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

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

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

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

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

DB에서 SQL로 조인하는 것처럼 하고 싶은 것이죠.

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

조건

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

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

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

파일을 리눅스나 유닉스에서 생성했다면 문제가 없겠지만 윈도우에서 생성했거나 외부에서 가져왔을 때 텍스트 파일의 ㅈ

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

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

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

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

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

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

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

-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입니다.

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


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

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

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

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

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

데이터 과학자가 되기 위해서 반드시 배워야 하는 것

데이터과학자가 되기 위해서 필요한 것들이라는 주제로 포스트를 몇개 작성하였었지만 더 간략한 것을 원하는 분들이 많다는 것을 알았습니다.

간단하게 말하면 지금은 아래의 4가지입니다.

  1. SQL
  2. R 또는 Python 언어
  3. Linux (리눅스)
  4. Algebra (수학)

여기에서 SQL, R, Python, Linux는 다해서 1 ~ 2년 배운다면 기초적인 일을 할 수는 있습니다. 그게 그렇게나 오래 걸리나? 라고 생각하실 지 모르겠지만 그렇게 만만한 것들 아닙니다.

SQL은 책 보고 SQLd 자격증 준비하면서 같이 공부하세요.

R, Python은 책 읽고 인터넷 강좌 들으세요. 그리고 코드 따라하기를 여러 번 해보세요.

Linux도 책 사서 보거나 인터넷 자료 뒤져 보시고, 인터넷 강좌 보고 그 후에 연습을 하면 됩니다.

문제는 수학입니다. 수학은 선형대수학, 미적분, 미방까지 해야 하고 논리적 사고방식과 숫자를 다루는 연습까지 되야 하기 때문에 속성으로 훈련이 안됩니다.

그리고 결국 나중에 좋은 기계학습모델을 만들거나 좋은 수리 모형을 만들 수 없게 되고 역량이 떨어지게 됩니다. 결국 본인의 몸값도 높일 수 없게 됩니다. 인터넷 강의 들으면서 날마다 무지막지하게 공부하시면 됩니다.

물론 수학을 원래 잘하는 분들은 괜찮겠습니다만 그런 분들 별로 없습니다.

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

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

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

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

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

python tensorflow 에러 get_config

Python 노트북에서 Keras, Tensorflow로 작업을 하다가 패키지를 업데이트하거나 해서 GPU 설정을 잘못하면 다음가 같은 에러가 납니다.

해결책은 그냥 tensorflow gpu 버전을 같이 설치해 주면 됩니다.

기계학습(ML), AI, 딥러닝(Deep Learning)의 차이점

기계학습, AI, 딥러닝을 구별하려면 알고리즘의 히스토리를 알아야 하기 때문에 공부하지 않고 직관적으로 이해하기 어렵습니다.

기계학습 Machine Learning

기계학습, Machine Learning, 머신러닝, ML 이라는 용어로 통용됩니다.

기계를 학습시켜서 반복적인 작업을 하게 만드는 것을 기계학습이라고 합니다. 이 때 학습이라는 것은 데이터를 넣고 데이터에 있는 패턴을 알아내서 패턴으로 부터 규칙이나 사실을 알아내고 그것을 그대로 다시 활용하는 것을 말합니다.

여기에서 데이터는 결국 숫자들의 뭉치이고 패턴이라는 규칙도 결국 숫자들입니다.

패턴을 어떻게 알아내느냐는 여러가지 방법이 있습니다. 통계학자들이 만들어낸 통계적인 알고리즘, 수학자들이 만들어낸 수학적인 알고리즘 등이고 이것들을 활용해서 만든 SVM, Decision Tree, Logistic Regression, Neural Network 등과 같은 오래된 유명한 알고리즘들이 있습니다.

이 중에 Neural Network (인공신경망, 뉴럴네트워크, NN)이라는 것이 있는데 이것과 SVM과 같은 고차원 문제를 다루는 몇가지 수학적인 알고리즘 따로 구분해서 따서 AI라고 따로 분리합니다.

그리고 인공지능이라는 쪽으로 협소하게 구분해서 AI라고 합니다.

인공지능 AI

인간의 뇌를 모방한 후 알아서 스스로 작동하게 하는 모든 것을 AI라고 합니다. 게임할 때 사람과 싸우는 가상의 존재들도 AI라고 부릅니다. AI는 기본적으로 알고리즘을 이용해 만든 소프트웨어와 데이터 뭉치들입니다. 앞서 설명한 기계학습의 일종입니다.

뉴럴네트워크, Neural Network, 인공신경망

인공신경망은 인간의 뇌구조를 모방한 것인데 임의로 만들어 놓은 많은 숫자들과 함수들을 배열해 놓고 데이터를 흘려 보내서 이 숫자들을 데이터의 규칙에 맞는 최적으로 숫자로 맞추게 됩니다.

그리고 이 숫자들을 나중에 활용할 때 씁니다.

흔히 예로 많이 쓰는 고양이 사진과 멍멍이 사진을 구분하게 만드는 것도 마찬가지입니다. 사진을 넣으면 사진을 조각내서 색생과 밝기 같은 것을 숫자들로 만들고 이 숫자들을 뉴럴네트워크라는 수학적인 모델에 무수히 많이 반복해서 흘려 넣습니다. 그러면 뉴럴네트워크 내에서 고양이 사진과 개 사진을 구별할 수 있는 숫자 뭉치가 나옵니다.

딥러닝, Deep Learning

뉴럴네트워크가 다 좋은데 2가지 큰 문제가 있었습니다.

첫번째, 연산을 너무 많이 한다는 것. 그러니까 CPU와 메모리를 너무 많이 쓰고 시간도 오래 걸립니다.

두번째, 숫자를 만들어 내는 층을 많이 만들면 모델이 엉망이 된다는 것입니다. 은닉레이어라고 하는데 이 층을 많이 만들 수 없었습니다.

그런데 2010년 전후로 이 알고리즘이 대격변이 일어납니다. 알고리즘의 결함을 크게 개선했고 GPU와 같은 하드웨어의 급속적인 발전으로 이 숫자 뭉치를 만들어내는 층을 더 깊게 할 수 있고 더 많이 더 빠르게 할 수 있게 되었습니다.

그 뒤 이 숫자를 찾아내는 층이 더 깊어졌고 알고리즘으로 만들어낸 모델들의 정확도가 비약적으로 높아졌습니다.

이것을 딥러닝, 심층학습이라고 부릅니다.

현재의 대세는 딥러닝

데이터와 GPU가 많다면 현재는 가장 정확한 것은 딥러닝입니다.

인공지능, 자율주행, 가상현실, 게임, 대부분의 영역에서 덥러닝은 가장 활발하며 아직도 급속도로 발전하고 있습니다.

딥러닝은 뉴럴네트워크의 개선형이며 딥러닝을 만든 사람이 뉴럴네트워크의 이미지가 너무 안좋아서 다른 이름을으로 불리길 원했을 뿐 실제로는 같은 계열입니다.

하지만 여전히 많은 부분에서 전통적인 ML 기술도 쓰이고 있고 여전히 유용합니다. 예를 들어 사람의 신용평가와 같은 기계학습 모델에 딥러녕을 쓸 필요도 없고 잘 되지도 않습니다. 데이터가 충분하지 않기 때문에 이런 것은 데이터가 부족해도 잘 돌아가는 융통성있는 알고리즘이 필요하기 때문입니다.

어쨌든 경우에 따라 ML도 하고 AI도 하게 되는데 그래서 이런류의 기술을 ML/AI 라고 합쳐서 많이 부릅니다.

Ubuntu 패키지 업데이트 에러: dpkg: error processing package update-notifier-common (–configure):

Ubuntu에서 패키지를 업데이트 하는 도중에 다음과 같은 에러 메시지를 보는 경우가 있습니다.

잘 복구가 되지 않는데요.

여러가지 방법을 써봤지만 가장 확실한 것은 다음과 같이 하는 것입니다.

Python Torch로 CUDA , GPU 사용가능 여부 확인하기

GPU를 사용하기 위해서는 드라이버를 설치하고 몇가지 작업을 해줘야 합니다.

Python에서 GPU를 쓸 수 있게 되어 있는지 아닌지 확인할 때 pytorch를 쓴다면 다음과 같이 하면 됩니다.

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

Gensim 사용 오류 – ValueError: numpy.ndarray size changed, may indicate binary incompatibility. Expected 88 from C header, got 80 from PyObject

오랜만에 Gensim을 설치해서 사용하려고하니 오류가 나옵니다.

number의 ndarray 사이즈가 바뀌었다는 오류메세지인데 해결책은 간단합니다.

numpy를 다시 설치하면 됩니다.

추가로

numpy는 매우 중요한 패키지이기 때문에 가능하면 최신으로 유지하는 것이 좋습니다. 하지만 일부 ML/AI 패키지들이 numpy 구버전을 요구하는 경우가 있습니다.

이런 경우는 뚜렷한 해결책은 없습니다. 그냥 낮은 버전의 numpy를 사용하는 패키지를 제거하는 것이 좋습니다.