CentOS 7에서 Python 3.10 이상 버전 사용하기 전 OpenSSL 1.1.1을 RPM으로 설치하는 방법

PEP644 문서에는 Python 3.10 이상부터 OpenSSL 1.1.1 이상을 요구하고 있습니다.

PEP 644 — Require OpenSSL 1.1.1 or newer 

https://peps.python.org/pep-0644/

 

PEP 644 – Require OpenSSL 1.1.1 or newer | peps.python.org

PEP 644 – Require OpenSSL 1.1.1 or newer PEP 644 Title Require OpenSSL 1.1.1 or newer Author Christian Heimes BDFL-Delegate n/a Discussions-To https://discuss.python.org/t/pep-644-require-openssl-1-1-or-newer/5584 Status Final Type Standards Track Create

peps.python.org

 

그러나, 여러 대기업, 관공서등에서 CentOS 7을 아직도 많이 사용을 하고 있고, CentOS 7은 OpenSSL 1.1.1이 아닌 OpenSSL 1.0.2가 설치되어있습니다.

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

CentOS 7에서 Python 3.10을 사용하고 싶은데, OpenSSL 1.1.1이 설치가 되지 않아 소스 컴파일하여 사용해야 하나 이런 고민을 많이 했습니다.

그러나, 일본의 파이썬 개발자가 공유한 글을 보고, CentOS 7에서 OpenSSL 1.1.1을 소스 컴파일이 아닌 RPM설치로도 가능하다는 걸 알게 되었습니다.

아래는 일본 파이썬 개발자가 작성한 글 “Python 3.10の新機能(その8) OpenSSL 1.1.1が必須に”[번역: Python 3.10의 신기능(8번째 부분) OpenSSL 1.1.1이 필수임] 입니다.

 

Python 3.10の新機能(その8) OpenSSL 1.1.1が必須に - python.jp

Pythonでは、https通信やメッセージダイジェストの作成などの暗号関連機能に、OpenSSLを利用しています。 これまで、Pythonでは OpenSSL のVersion 1.0.2以降が利用可能でしたが、Python 3.10からは、OpenSS

www.python.jp

여기에서는 CentOS 7에서 OpenSSL1.1.1을 설치하려면 Fedora Project에서 제공하는 EPEL(Extra Packages for Enterprise Linux) 저장소를 추가하여 설치하면 된다고 하더군요.

다음의 명령어로 CentOS 7에서 OpenSSL1.1.1을 설치할 수 있습니다.

yum install epel-release
yum install openssl11 openssl11-devel

OpenSSL1.1.1 설치가 끝나면 아래의 명령어로 확인 가능합니다

$ openssl11 version 
OpenSSL 1.1.1k  FIPS 25 Mar 2021

pyenv로 설치 시 아래와 같이 환경변수를 지정해야 CentOS 7에서 Python을 설치할 수 있습니다

export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
pyenv install 3.10.4

만약, Python을 소스 빌드로 설치하려면 아래와 같이 명령어를 입력하면 됩니다.

yum install epel-release
yum install openssl11 openssl11-devel
export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
./configure
make
sudo make install

여담으로, 3월 24일에 예정된 일정 이전에 Python 3.10.4 및 3.9.12 버전이 출시되었다고 글이 공개되었습니다.

Python 3.10.4 and 3.9.12 are now available out of schedule

https://blog.python.org/2022/03/python-3104-and-3912-are-now-available.html

 

Python Insider: Python 3.10.4 and 3.9.12 are now available out of schedule

Did anybody say cursed releases? Well, it turns out that 3.10.3 and 3.9.11 both shipped a regression which caused those versions not to build on Red Hat Enterprise Linux 6. While this 11-year-old version is now out of maintenance support, it’s still used

blog.python.org

글 내용을 보면, “Red Hat Enterprise Linux 6”에서 Python3.10.3 및 3.9.11 버전이 빌드가 되지 않는 문제 때문이라고 하더군요. RHEL(Red Hat Enterprise Linux) 6은 11년 전에 출시되었고, 이제는 유지보수 지원이 끝났습니다만, 많은 사무 업무분야에서 여전히 많이 사용되고 있다고 합니다. 게다가 자체 manylinux2010 이미지는 CentOS 6을 기반으로 합니다….

아직도 RHEL 6/Cent OS6기반으로 이미지를 사용하는 경우도 많군요

 

보안 이슈때문에 라이브러리를 새로 바꿔줘야 하는데 Legacy(낡은 것)를 뺄 수가 없으니, 버리는 것이 쉽지 않다는 걸, CentOS 7에서 Python 3.10(지금 기준 — 3.10.4)을 설치하며 알게 되었습니다.

ps.CentOS 7에서 pyenv 로 3.11-dev설치할때도, OpenSSL1.1.1에 대한 환경변수 설정 후에 설치를 해야 정상 설치 됩니다.

export CFLAGS=$(pkg-config --cflags openssl11)
export LDFLAGS=$(pkg-config --libs openssl11)
pyenv install 3.11-dev

참고: PEP(Python Enhancement Proposal)는 “파이썬 언어의 개선된 제안”으로 번역하며, 파이썬 커뮤니티에서 수많은 사람들이 의견을 내고 토론하고 발전하며 논의된 주제를 PEP(Python Enhancement Proposal)로 문서화를 하였습니다 

출처: https://wikidocs.net/21733

 

 

1) PEP

## PEP 파이썬 창시자 귀도를 중심으로 수많은 사람들이 기여해서 발전해온 언어입니다. 귀도라는 최종 결정권자 혹은 그리고 결정을 하는데 가장 큰 영향력을 끼치는 독재 ...

wikidocs.net

 

Buy me a coffeeBuy me a coffee

gnome-builder에서 gnome SDK, Platform등이 설치 안될때

Flatpak 설치 확인후, Flatpak에서 직접 org.gnome.Sdk, org.gnome.Platform 런타임 을 설치해본다.

$ flatpak install org.gnome.Platform
$ flatpak install org.gnome.Sdk     
Buy me a coffeeBuy me a coffee

이번에 오픈수세(openSUSE)에서 Visual Studio Code를 설치해보았습니다.

참고
Visual Studio Code on Linux

설치 하기

SNAP으로 설치하기

Snapcraft의 'Visual Studio Code'

위 링크로 확인하면 됩니다.

openSUSE에서 설치하기

다음의 명령어와 스크립트로 키(Key)와 저장소(Repository)를 등록합니다.

sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ntype=rpm-md\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/zypp/repos.d/vscode.repo'

그 다음, 저장소(repository)를 새로 고칩니다.

sudo zypper refresh

저장소(repository)를 새로 고침하면, Visual Studio Code를 설치합니다.

sudo zypper install code

설치 결과

openSUSE에서 잘 돌아감을 확인

Buy me a coffeeBuy me a coffee

이번에 한성컴퓨터에서 나온 TFG7475H(GK7NPFR)를 구입하였습니다.

이 랩탑은 중국의 칭화통팡(淸華同方, 한국한자음: 청화동방, 중국어음: 칭화통팡, 중국어(번체)표기: 清華同方, 중국어(간체)표기: 清华同方 중국어: Qīnghuá tóngfāng, 영어표기: Tsinghua Tongfang)의 베어본으로 만들어졌습니다.

아래는 칭화통팡에서 제조한 15인치 'GK5N--O' 및 17인치 'GK7N--R' 시리즈의 전세계 출시될때의 이름을 정리한 목록입니다.

www.reddit.com/r/AMDLaptops/comments/himoym/all_of_the_vendors_that_are_offering_the_tongfang/

 

All of the Vendors that are offering the Tongfang GK5N--O and the GK7N--R

Tongfang is a Chinese ODM (Original Design Manufacturer) that sells their laptop designs to vendors around the world, so far they have released 2...

www.reddit.com

저는 이 중 'GK7NPFR' 모델 기반의 한성컴퓨터의 TFG7475H를 구매하였습니다.

이 노트북에는 CPU로 8코어 16쓰레드의 AMD Ryzen Renoir 4800H를 사용하였고, GPU로는 Nvidia GTX 1650 Ti를 사용하여 CUDA연산을 할 수 있습니다.

이번에 재택근무 이슈가 있다보니, 노트북을 뭘로 살까 고민하다 CPU 성능이 우수하면서 GPU가 들어간 노트북을 사용해보게되었습니다! 원래는 이 모델보다 GPU상위 모델(Nvidia RTX 2060)이 달린 TFG7476H를 사용하려고 했으나, 이미 인기가 많아 매진되어 구매 수령을 하려면 9월말까지 기다려야 한다고 하였습니다. 그래서 급하게 필요한지라 얼른 구할 수 있는 TFG7475H(GTX 1650Ti)를 구입하였습니다.

TFG7475H에 오픈수세(openSUSE) 리눅스와 KDE Plasma를 설치 하였습니다. 시스템 정보를 보니 CPU: AMD Ryzen 7 4800H와 GPU: GTX 1650 Ti가 보임을 확인할 수 있습니다.

아래는 오픈수세(openSUSE) 리눅스 설치 화면입니다.

설치가 완료되었습니다.

처음에, 리눅스 설치를 해보니 노트북 LCD엔 출력이 제대로 동작하니, 정상적으로 설치했다 좋아했습니다.
그러나, HDMI로 24인치 모니터를 노트북에 연결해보니 외장모니터 연결은 안되는 문제가 있습니다.

이 한성 TFG7475H의 그래픽스관련으로 리눅스에서 설치를 해보니 노트북의 LCD 화면은 AMD Radeon 내장 그래픽에서 출력되고, 외장화면(HDMI, miniDP 연결)은 Nvidia GTX 1650 Ti에서 출력되더군요.

그래서, Nvidia 드라이버를 설치 후, openSUSE의 SUSE Prime 설치해야 노트북 내장 화면(LCD)및 외장화면 (HDMI, miniDP)동시 출력이 가능합니다.(Nvidia 모듈 설치후에 외장모니터만 화면 출력되고, 노트북 LCD가 안나오는 현상 겪으면 멘붕합니다 ㅋㅋㅋㅋㅋㅋㅋ ㅠㅠㅠㅠ )

en.opensuse.org/SDB:NVIDIA_drivers

en.opensuse.org/SDB:NVIDIA_SUSE_Prime

en.opensuse.org/SDB:AMDGPU

위의 3가지 내용을 참조하여, Nvidia, AMD 내장 그래픽 모두 나올 수 있게 삽질을 해야합니다.

(해당 내용은 우분투등 대부분의 배포판에서 에서도 동일한 현상이 일어날 것입니다.)

아래는, 오픈수세 리눅스에서 리브레오피스(LibreOffice) 소스코드를 빌드할때 화면입니다.

오픈수세(openSUSE)에서 리브레오피스(LibreOffice) 빌드중

이제, 리눅스가 잘 돌아가는 걸 확인하였으면, tensorslow-gpu를 사용할 수 있게 설정해야합니다.

엔비디아(Nvidia)사이트 들어가서 CUDA Toolkit 11.0 를 설치하면 됩니다

developer.nvidia.com/cuda-downloads

 

CUDA Toolkit 11.0 Update 1 Downloads

Select Target Platform Click on the green buttons that describe your target platform. Only supported platforms will be shown. By downloading and using the software, you agree to fully comply with the terms and conditions of the CUDA EULA. Operating System

developer.nvidia.com

 

저는 오픈수세(openSUSE)를 사용하기 때문에, CUDA Toolkit을 openSUSE기반으로 받아서 설치했습니다.

그리고, cuDNN은 아래 링크에서 rpm파일을 다운로드 받아서 설치

developer.download.nvidia.com/compute/machine-learning/repos/rhel8/x86_64/

 

Index of /compute/machine-learning/repos/rhel8/x86_64

 

developer.download.nvidia.com

libcudnn8-8.0.3.33-1.cuda11.0.x86_64.rpmlibcudnn8-devel-8.0.3.33-1.cuda11.0.x86_64.rpm, nvidia-machine-learning-repo-rhel8-1.0.0-1.x86_64.rpm를 다운로드 받아서 설치하였습니다.

$ sudo zypper in libcudnn8-8.0.3.33-1.cuda11.0.x86_64.rpm libcudnn8-devel-8.0.3.33-1.cuda11.0.x86_64.rpm nvidia-machine-learning-repo-rhel8-1.0.0-1.x86_64.rpm 

이후 pip으로 tensorflow-gpu를 설치해봅니다.

$ pip3 install tensorflow tensorflow-gpu

라이브러리 설치가 되었으면, 두근두근

tensorflow에서 Nvidia GPU연동이 잘 되는지 테스트를 해봅니다

$ python3 -c 'import tensorflow as tf; print(tf.__version__)'
2020-09-12 03:28:30.666780: W tensorflow/stream_executor/platform/default/dso_loader.cc:59] Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory
2020-09-12 03:28:30.666814: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2.3.0

아, Python의 tensorflow-gpu는 CUDA 10.1 버전을 사용하고 있더군요. CUDA 동적 라이브러리 10.1 버전이 없어서 에러가 났습니다.

해당 내용 검색을 하니, CUDA 10.1버전을 설치하라고 나옵니다

Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or directory #38578

 

Could not load dynamic library 'libcudart.so.10.1'; dlerror: libcudart.so.10.1: cannot open shared object file: No such file or

Debian 10.3 Python 3.8.2 Cuda 10.2 Quadro K5200d drivers 440.82 Tensorflow 2.2.0-rc2 import tensorflow as tf tf.config.list_physical_devices('GPU') 2020-04-15 20:58:07.177217: I tensorflow/...

github.com

추가적으로, 저는 openSUSE Linux에서 CUDA 10.1 버전을 추가 설치하였습니다

$ sudo zypper install cuda-10-1

설치가 완료되면 다시, tensorflow-gpu라이브러리가 정상 작동할수 있게 Nvidia CUDA가 제대로 설치되었는지 확인해봅니다

$ python3 -c 'import tensorflow as tf; print(tf.__version__)'
2020-09-12 03:38:39.770262: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1
2.3.0

드디어, Nvidia CUDA 및 tensorflow 설치, tensorflow-gpu 라이브러리가 정상 작동함을 확인하였습니다.

한성컴퓨터에서 출시된 TFG7475H에서 리눅스 설치하였고 딥러닝, tensorflow, CUDA연산 할수 있게 설정을 하니 가성비가 엄청 좋음을 느꼈습니다.

참고 링크:

intellegibilisverum.tistory.com/entry/%ED%95%9C%EC%84%B1-%EB%85%B8%ED%8A%B8%EB%B6%81%EC%97%90%EC%84%9C-ubuntu-1606-LTS-tensorflowgpu-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0

 

한성 노트북에서 ubuntu 16.06 LTS + tensorflow-gpu 세팅하기

2년전에 한성노트북을 구입했다. 그때 Intel graphic과 nvidia gtx 950m 가 같이 되어 세팅되어 있던 노트북이었는데 그동안 nvidia는 거의 안사용했던거 같다. 그래서 이번에 그것도 사용할 겸 tensorflow-gpu

intellegibilisverum.tistory.com

bcho.tistory.com/1311

 

개발자 코딩 노트북 구입기 (DELL Inspiron 7580) 우분투

개발자용 노트북 구입기 조대협 (http://bcho.tistory.com) 집에서 개발 공부와, 테스트를 위해서 개인 노트북이 필요했는데, 아무래도 업무와 개인 공부를 분리하는것이 좋을것 같아서, 얼마전 부터 ��

bcho.tistory.com

 

흠 위의 링크에서 한성컴퓨터에 리눅스 설치하면 삽질 엄청해야한다고 하는데, openSUSE 사용하면 그나마 우분투보다 삽질 품이 줄어들듯 합니다.

Buy me a coffeeBuy me a coffee

이번에, AMD Ryzen기반 8 코어 16 스레드 지원 CPU 4800H와 Nvidia GTX1650 Ti가 들어간 새로운 17.3인치 랩탑(한성컴퓨터 TFG7475H)을 저렴하게 구입 후, 기본 OS를 openSUSE로 설치하여 사용하고 있습니다.

남들 많이 사용하는 리눅스 배포판(Linux Distribution)인 우분투(Ubuntu), 데비안(Debian)이나 RPM계열인 페도라(Fedora)대신 오픈수세(openSUSE)를 사용하는 관계로, 남들보다 삽질을 더 하는 듯함. (다행히, 우분투와 다르게 오픈수세는 Nvidia 드라이버를 빨리 설치하는 듯)

한글과컴퓨터에서 공개한 리눅스용 HWP뷰어를 다음의 링크로 설치하려고 했습니다.

한글과컴퓨터 > 고객지원 > 다운로드 https://www.hancom.com/cs_center/csDownload.do

한글과컴퓨터에서 공개한 리눅스용 HWP뷰어의 리눅스용 설치 파일은 페도라(Fedora) 기반의 rpm파일이나 우분투(Ubuntu) 기반인 deb파일로 제공하고 있습니다.

그러나, 당연 오픈수세(openSUSE)용은 한국 사람들이 많이 사용하는 배포판이 아니니, 한글과컴퓨터에서 오픈수세(openSUSE)용을 내놓을 리는 없습니다. 그래서, 오픈수세(openSUSE)와 그나마 친척관계(?)인 페도라 코어(Fedora Core)용 설치파일(rpm)파일을 다운로드 받았습니다.

이제 Fedora용 설치 파일인 RPM파일을 다운로드하면, 설치를 해보죠.

$ rpm -ivh hancomoffice-hwpviewer-Fedora.x86_64.rpm 
오류: Failed dependencies:
        libjavascriptcoregtk-3.0.so.0()(64bit) is needed by hancomoffice-hwpviewer-9.20.0.1575-1.x86_64
        libwebkitgtk-3.0.so.0()(64bit) is needed by hancomoffice-hwpviewer-9.20.0.1575-1.x86_64
        webkitgtk3 >= 1.3.3 is needed by hancomoffice-hwpviewer-9.20.0.1575-1.x86_64

이... RPM의존성 있다고 설치 에러를 뱉습니다. 그럼, 오픈수세(openSUSE)에서 한글(HWP)뷰어 설치를 못하나??? ㅠㅠㅠㅠ

자 각설하고, 오픈수세(openSUSE)에서 어떻게 한글(HWP) 뷰어를 설치해야 하나?

결론을 말하자면, zypper명령어의 옵션을 줘서, 패키지 종속성 확인하면서 강제로 설치하면 됩니다.

$ sudo zypper in hancomoffice-hwpviewer-Fedora.x86_64.rpm 

'packman' 리포지토리 메타 데이터를 검색하는 중 .....................................[완료]
리포지토리 'packman' 캐시 빌드 중 ..................................................[완료]
리포지토리 데이터 로드 중...
설치된 패키지를 읽는 중...
패키지 종속성 확인 중...

문제: webkitgtk3 >= 1.3.3(hancomoffice-hwpviewer-9.20.0.1575-1.x86_64에서 필요)이(가) 제공되지 않습니다.
 솔루션 1: hancomoffice-hwpviewer-9.20.0.1575-1.x86_64 설치 안 함
 솔루션 2: 일부 종속성을 무시하여 hancomoffice-hwpviewer-9.20.0.1575-1.x86_64을(를) 구분합니다.

위의 제안으로부터 하나를 선택하거나 취소 [1/2/c/d/?] (c): 2
종속성을 확인하는 중...
패키지 종속성 확인 중...

다음 새 패키지가 설치됩니다.
  hancomoffice-hwpviewer

1 새로운 꾸러미로 설치.
전체 다운로드 크기: 94.2 MiB. 이미 캐싱됨: 0 B. 작업 후에 211.3 MiB이(가) 추가로
사용됩니다.
계속하시겠습니까? [예/아니오/버전/...? 모든 옵션 표시] (예): 
꾸러미 hancomoffice-hwpviewer-9.20.0.1575-1.x86_64 검색 중
                                                    (1/1),  94.2 MiB (211.3 MiB 압축 풀기)
hancomoffice-hwpviewer-Fedora.x86_64.rpm:
    패키지가 서명되지 않았습니다!

hancomoffice-hwpviewer-9.20.0.1575-1.x86_64 (일반 RPM 파일 캐시): 서명 확인 실패 [6-파일이 서명되지 않음]
중단, 재시도 또는 무시하시겠습니까? [a/r/i] (a): i

파일 충돌 확인: ....................................................................[완료]
(1/1) 설치 중: hancomoffice-hwpviewer-9.20.0.1575-1.x86_64 .........................[완료]
%posttrans 스크립트 실행 중 ........................................................[완료]
$ 

설치가 완료 후, 한글(HWP) 뷰어를 실행하면 아래와 같이 나옵니다.

즉, 한글(HWP) 뷰어는 우분투(Ubuntu), 데비안(Debian)등의 deb기반의 배포판이나, 오픈수세(openSUSE), 페도라 코어(Fedore Core), 센트오에스(CentOS)등의 RPM기반의 배포판이나 현재의 배포판에서 설치 시 의존성 문제가 있으나, dpkgrpm으로 강제로 옵션 줘서 설치하거나, 배포판에서 의존성 관련으로 설치를 도와주는 명령어 입력하여 설치할 수 있습니다.

Buy me a coffeeBuy me a coffee

Windows 10에 WSL2를 설치하고 난 후, 리브레오피스의 소프트웨어 번역을 어떻게 설명을 할까 난관에 빠지게 됩니다.

그냥, "CAT(Computer Aided Translation)도구인 weblate에 번역하세요 하면 성의가 없어 보일것 같이 보여서, 원리에 대하여는 GNU Hello 프로젝트의 예를 들어서 이야기할 예정입니다.

GNU Hello는 hello라고 터미널에서 입력하면 문자열로 영어 설정으로는 Hello, World!, 한국어 설정으로는 안녕하세요, 여러분!을 출력해주는 프로그램입니다.

아래는 GNU Hello 홈페이지 링크입니다.

GNU Hello Project - https://www.gnu.org/software/hello/

여기서 WSL2으로 우분투Ubuntu를 사용해보겠습니다 (저는 개인적으로 오픈수세openSUSE를 사용하지만, 많은 한국의 리눅스 사용자들은 우분투Ubuntu를 사용하니, 많은 이들이 리눅스에서 테스트할 수 있게 우분투 기준으로 설명합니다.)

일단, Ubuntu에서 GNU Hello를 설치해봅니다

$ sudo apt -y install hello

설치가 완료되면, GNU Hello를 실행해봅시다.

$ hello
Hello, world!

여기서, WSL2를 최초로 설치하면 기본이 영어로 되어 있습니다.
동아시아(CJK) 문자가 출력된 번역된 문장을 보려면, 언어팩을 설치해야합니다.

참고, 우분투(Ubuntu) 언어 팩 목록

  • 한국어 언어 팩 language-pack-ko
  • 일본어 언어 팩 language-pack-ja
  • 중국어(간체) 언어팩 language-pack-zh-hans
  • 중국어(번체) 언어팩 language-pack-zh-hant
$ sudo apt -y install language-pack-ko language-pack-ja language-pack-zh-hans language-pack-zh-hant

우분투 및 오픈수세 등 리눅스 배포판에서 언어 설정 패키지를 설치후, 터미널에서 언어 별 환경설정을 하고 실행하면 다음과 같이 나옵니다.

$ LANG=en_US.UTF-8 hello
Hello, world!
$ LANG=ko_KR.UTF-8 hello
안녕하세요, 여러분!
$ LANG=ja_JP.UTF-8 hello
こんにちは、世界!
$ LANG=zh_CN.UTF-8 hello
世界你好!
$ LANG=zh_TW.UTF-8 hello
哈囉,大家好!

자유오픈소스 소프트웨어(FLOSS)의 번역은 po파일의 번역(飜譯, Translation)입니다.

GNU의 gettext 라이브러리를 이용하여 po파일에 들어간 번역문을 출력하는 것입니다.

GNU프로젝트의 하나인 hello는 로케일(Locale)설정에 따라서 로케일에 맞는 po파일 내용을 출력하는 것입니다.

그래서, KDE, GNOME, 리브레오피스등 소프트웨어의 번역은 po파일 내용을 번역하여 보여주는 것이라고 보면 됩니다.

상세한 내용은 아래의 슬라이드쉐어 링크 참조하면 됩니다.

오픈소스 번역 기여하기 v3

https://www.slideshare.net/changwoo/v3-114830838

 

오픈소스 번역 기여하기 v3

오픈소스 번역 기여하기 그놈 3.30 번역 모임 류창우 <cwryu@debian.org></cwryu@debian.org>

www.slideshare.net

 

Buy me a coffeeBuy me a coffee

제가 사용하는 2011년도산 삼성 노트북에는 i7 쿼드코어(Quad core)에 Intel 기본 그래픽 카드에 Nvidia 그래픽카드도 탑재되어 있습니다. 이 노트북은 그 당시에 제일 잘나가던 사양으로 만든 노트북입니다.

이 노트북은 아직도 현역으로 잘 굴릴 만큼, 아직도 성능이 나쁘지 않습니다.

(그 이유는 제가 엄청나게 개조를 했기 때문이죠. 램(RAM)을 4GB에서 16GB로, 하드디스크를 SSD로 교체 등등)

그러나, 오픈수세(openSUSE)를 설치한 제 노트북에 딥러닝을 위한 GPU를 사용하려니 Nvidia드라이버가 활성화가 안되어 있더군요.

이를 계기로, 저는 오픈수세(openSUSE)에서 노트북에 있는 Nvidia 드라이버를 활성화 시켜보겠습니다.

우선 아래 링크의 글을 보고 따라했습니다.

openSUSE Wiki: NVIDIA Drivers

 

SDB:NVIDIA drivers - openSUSE Wiki

Warning: If you plan to replace your card with a more recent one, it's recommended that you uninstall the driver (reverting back to nouveau) before upgrading your hardware. Situation Installing the official NVIDIA drivers using ZYpp (YaST, YaST2, or Zypper

en.opensuse.org

일단 루트(Root)권한으로 들어갑니다.

첫번째로, Nvidia 드라이버 저장소를 오픈수세(openSUSE) 리눅스에 추가합니다.

# zypper addrepo --refresh https://download.nvidia.com/opensuse/tumbleweed NVIDIA
'NVIDIA' 리포지토리 추가 중 ...................................................................................................................................[완료]
'NVIDIA' 리포지토리가 추가되었습니다.

URI            : https://download.nvidia.com/opensuse/tumbleweed
활성화됨       : 예
GPG 확인       : 예
자동 새로 고침 : 예
우선순위       : 99 (기본 우선순위)

저장소는 우선순위가 없습니다. 모든 저장소는 같은 우선순위를 공유합니다.

이후, 설치된 하드웨어의 정보를 다음의 명령어 lspcilscpu로 확인합니다.

비디오카드 정보 확인은 다음의 명렁어 lspci로 확인합니다.

# lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)

CPU아키텍처 정보 확인은 다음의 명령어 lscpu로 확인합니다.

# lscpu | grep Arch   
Architecture:                    x86_64

그리고, 명령어 lspcilscpu를 다음의 명령어 hwinfo로 대체할 수 있습니다.

비디오카드 정보 확인은 다음의 명령으로 확인합니다.

# hwinfo --gfxcard | grep Model
  Model: "nVidia GF119M [GeForce GT 520MX]"
  Model: "Intel 2nd Generation Core Processor Family Integrated Graphics Controller"

CPU아키텍처 정보 확인은 다음의 명령으로 확인합니다.

# hwinfo --arch
Arch: X86_64/grub                                               

정보를 확인하고, 적당한 Nvidia 드라이버 패키지를 찾습니다.

# zypper se x11-video-nvidiaG0*
Retrieving repository 'NVIDIA' metadata --------------------------------------------------------------------------------------------------------------------------[|]

New repository or package signing key received:

  Repository:       NVIDIA
  Key Name:         NVIDIA Corporation <linux-bugs@nvidia.com>
  Key Fingerprint:  9B763D49 D8A5C892 FC178BAC F5113243 C66B6EAE
  Key Created:      Fri Jun 16 01:13:18 2006
  Key Expires:      (does not expire)
  Subkey:           F016EEAA03224CDD 2006-06-16 [does not expire]
  Rpm Name:         gpg-pubkey-c66b6eae-4491871e


Do you want to reject the key, trust temporarily, or trust always? [r/t/a/?] (r): a
Retrieving repository 'NVIDIA' metadata .......................................................................................................................[done]
Building repository 'NVIDIA' cache ............................................................................................................................[done]
Loading repository data...
Reading installed packages...

S | Name                | Summary                                                 | Type
--+---------------------+---------------------------------------------------------+--------
  | x11-video-nvidiaG04 | NVIDIA graphics driver for GeForce 400 series and newer | package
  | x11-video-nvidiaG05 | NVIDIA graphics driver for GeForce 600 series and newer | package

이제, Nvidia 드라이버 패키지를 설치합니다.

# zypper in x11-video-nvidiaG04
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 13 NEW packages are going to be installed:
  Mesa-libGLESv1_CM1 Mesa-libGLESv2-2 libX11-6-32bit libXau6-32bit libXext6-32bit libglvnd-32bit libxcb1-32bit nvidia-computeG04 nvidia-gfxG04-kmp-default
  nvidia-glG04 plasma5-applet-suse-prime suse-prime x11-video-nvidiaG04

The following 4 recommended packages were automatically selected:
  Mesa-libGLESv1_CM1 Mesa-libGLESv2-2 nvidia-glG04 x11-video-nvidiaG04

13 new packages to install.
Overall download size: 79.2 MiB. Already cached: 0 B. After the operation, additional 366.0 MiB will be used.
Continue? [y/n/v/...? shows all options] (y): y
Do you agree with the terms of the license? [yes/no] (no): yes

설치가 완료되었으면 재부팅 합니다.

재부팅 후에도 Intel 그래픽카드로 사용되는걸 확인할 수 있습니다.
openSUSE에서 Nvidia 그래픽카드 사용 활성화를 하려면 아래의 명령어로 활성화합니다

$ sudo prime-select nvidia
Logout to switch graphics

위의 내용처럼 로그아웃을 하고 난 후 새로 로그인 하면 변경되는 걸 확인할 수 있습니다.

ps. 이제 이 노트북으로 Nvidia GPU를 이용한 AI연산, 딥러닝을 사용할수 있다.

Buy me a coffeeBuy me a coffee

우분투(Ubuntu)에서 리브레오피스(LibreOffice)의 소스코드를 빌드할 수 있게 의존성 있는 패키지를 가져오도록 하는 선택하는 옵션으로 의존성있는 패키지 설치를 진행해보았습니다.

$ sudo apt build-dep libreoffice
[sudo] password for ***:
Reading package lists... Done
E: You must put some 'deb-src' URIs in your sources.list

아... deb-src URI가 sources.list에 없다고 sources.listdeb-src를 채워놓으라고 하군요.

그럼, sources.listdeb-src URI를 채워넣어야죠.

sources.list 파일을 수정해봅니다.

$ sudo vi /etc/apt/sources.list

이미 deb-src는 있으나 #으로 주석처리되어 있습니다. 그럼, 저장소 목록에 있는 deb-src 앞의 # 주석을 해제합니다.

그리고, 저장소 목록을 다시 업데이트 합니다.

$ sudo apt update

그리고 다시 아래의 명령어로 libreoffice에 대해 빌드할수 있게 의존성있는 패키지를 설치해봅니다.

$ sudo apt-get build-dep libreoffice
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  acl ant ant-optional autoconf automake autopoint autotools-dev binutils binutils-common binutils-x86-64-linux-gnu
  bison build-essential ca-certificates-java comerr-dev cpp cpp-9 dctrl-tools debhelper default-jdk
  default-jdk-headless default-jre default-jre-headless default-libmysqlclient-dev devscripts dh-apparmor
  dh-autoreconf dh-python dh-strip-nondeterminism doxygen dpkg-dev dwz evolution-data-server-common fakeroot
  firebird-dev firebird3.0-common firebird3.0-common-doc firebird3.0-server-core flex fontforge-common fontforge-nox
  fonts-crosextra-carlito fonts-dejavu fonts-dejavu-extra fonts-liberation2 fonts-urw-base35 g++ g++-9 gcc gcc-9
  gcc-9-base gdb gettext ghostscript gir1.2-atk-1.0 gir1.2-atspi-2.0 gir1.2-camel-1.2 gir1.2-ebackend-1.2
  gir1.2-ebook-1.2 gir1.2-ebookcontacts-1.2 gir1.2-edatabook-1.2 gir1.2-edataserver-1.2 gir1.2-freedesktop
  gir1.2-gdkpixbuf-2.0 gir1.2-gst-plugins-base-1.0 gir1.2-gstreamer-1.0 gir1.2-gtk-3.0 gir1.2-harfbuzz-0.0
  gir1.2-langtag-0.6 gir1.2-pango-1.0 gir1.2-secret-1 gir1.2-soup-2.4 gobject-introspection gperf graphviz
  hyphen-en-us icu-devtools imagemagick imagemagick-6-common imagemagick-6.q16 intltool-debian java-common javahelper
  junit4 krb5-multidev libabw-0.1-1 libabw-dev libamd2 libann0 libapache-pom-java libarchive-zip-perl libasan5
  libassuan-dev libatk-bridge2.0-dev libatk1.0-dev libatomic1 libatspi2.0-dev libavahi-client-dev libavahi-common-dev
  libb-hooks-op-check-perl libbabeltrace1 libbinutils libblas-dev libblas3 libblkid-dev libbluetooth-dev libbluetooth3
  libboost-atomic1.71-dev libboost-atomic1.71.0 libboost-chrono1.71-dev libboost-chrono1.71.0 libboost-date-time-dev
  libboost-date-time1.71-dev libboost-date-time1.71.0 libboost-dev libboost-filesystem-dev libboost-filesystem1.71-dev
  libboost-filesystem1.71.0 libboost-iostreams-dev libboost-iostreams1.71-dev libboost-iostreams1.71.0
  libboost-locale-dev libboost-locale1.71-dev libboost-locale1.71.0 libboost-regex1.71-dev libboost-regex1.71.0
  libboost-serialization1.71-dev libboost-serialization1.71.0 libboost-system1.71-dev libboost-system1.71.0
  libboost-thread1.71-dev libboost-thread1.71.0 libboost1.71-dev libbrotli-dev libbsh-java libbtf1 libc-dev-bin
  libc6-dev libcairo-script-interpreter2 libcairo2-dev libcamd2 libcamel-1.2-62 libcamel1.2-dev libcc1-0 libccolamd2
  libcdr-0.1-1 libcdr-dev libcdt5 libcgraph6 libcholmod3 libclang1-10 libclass-method-modifiers-perl
  libclucene-contribs1v5 libclucene-core1v5 libclucene-dev libcmis-0.5-5v5 libcmis-dev libcolamd2
  libcommons-logging-java libcommons-parent-java libcppunit-1.15-0 libcppunit-dev libcroco3 libcrypt-dev libctf-nobfd0
  libctf0 libcups2-dev libcupsimage2 libcupsimage2-dev libcurl4-gnutls-dev libcxsparse3 libdatrie-dev libdbus-1-dev
  libdconf-dev libdebhelper-perl libdevel-callchecker-perl libdpkg-perl libdw1 libdynaloader-functions-perl
  libe-book-0.1-1 libe-book-dev libebackend-1.2-10 libebackend1.2-dev libebook-1.2-20 libebook-contacts-1.2-3
  libebook-contacts1.2-dev libebook1.2-dev libedata-book-1.2-26 libedata-book1.2-dev libedataserver-1.2-24
  libedataserver1.2-dev libegl-dev libegl1-mesa-dev libel-api-java libemf1 libencode-locale-perl libeot-dev libeot0
  libepoxy-dev libepubgen-0.1-1 libepubgen-dev libetonyek-0.1-1 libetonyek-dev libexif12 libexpat1-dev
  libexttextcat-2.0-0 libexttextcat-data libexttextcat-dev libfakeroot libfbclient2 libffi-dev libfftw3-double3
  libfile-homedir-perl libfile-listing-perl libfile-stripnondeterminism-perl libfile-which-perl libfontconfig1-dev
  libfontforge3 libfreehand-0.1-1 libfreehand-dev libfreetype-dev libfreetype6-dev libfribidi-dev libgcc-9-dev
  libgck-1-0 libgcr-base-3-1 libgcrypt20-dev libgd3 libgdata-common libgdata22 libgdk-pixbuf2.0-dev libgdraw6
  libgfortran5 libgif7 libgirepository1.0-dev libgl-dev libgl1-mesa-dev libgles-dev libgles1 libgles2
  libgles2-mesa-dev libglib2.0-dev libglib2.0-dev-bin libglm-dev libglu1-mesa libglu1-mesa-dev libglvnd-dev libglx-dev
  libgmp-dev libgmpxx4ldbl libgnutls-dane0 libgnutls-openssl27 libgnutls28-dev libgnutlsxx28 libgoa-1.0-0b
  libgoa-1.0-common libgomp1 libgpg-error-dev libgpgme-dev libgpgmepp-dev libgphoto2-6 libgphoto2-port12 libgraphblas3
  libgraphite2-dev libgs9 libgs9-common libgssrpc4 libgstreamer-gl1.0-0 libgstreamer-plugins-base1.0-0
  libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev libgtk-3-dev libgts-0.7-5 libgvc6 libgvpr2 libhamcrest-java
  libharfbuzz-dev libharfbuzz-gobject0 libharfbuzz-icu0 libhsqldb1.8.0-java libhtml-parser-perl libhtml-tagset-perl
  libhtml-tree-perl libhttp-cookies-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl libhunspell-dev
  libhyphen-dev libhyphen0 libib-util libice-dev libicu-dev libidn11 libidn2-dev libieee1284-3 libijs-0.35
  libimport-into-perl libio-html-perl libio-pty-perl libio-socket-ssl-perl libipc-run-perl libisl22 libitm1
  libixion-0.15-0 libjbig-dev libjbig2dec0 libjpeg-dev libjpeg-turbo8-dev libjpeg8-dev libjsp-api-java
  libkadm5clnt-mit11 libkadm5srv-mit11 libkdb5-9 libkf5attica-dev libkf5auth-dev libkf5auth-dev-bin libkf5auth5
  libkf5bookmarks-dev libkf5codecs-dev libkf5completion-dev libkf5config-dev libkf5config-dev-bin
  libkf5configwidgets-dev libkf5coreaddons-dev libkf5coreaddons-dev-bin libkf5dbusaddons-dev libkf5globalaccel-dev
  libkf5guiaddons-dev libkf5i18n-dev libkf5iconthemes-dev libkf5itemviews-dev libkf5jobwidgets-dev libkf5kio-dev
  libkf5kiofilewidgets5 libkf5service-dev libkf5solid-dev libkf5sonnet-dev libkf5sonnet-dev-bin libkf5textwidgets-dev
  libkf5widgetsaddons-dev libkf5windowsystem-dev libkf5xmlgui-dev libklu1 liblab-gamut1 liblangtag-common
  liblangtag-dev liblangtag-gobject0 liblangtag1 liblapack-dev liblapack3 liblcms2-dev libldap2-dev libldl2 libllvm10
  liblpsolve55-dev liblqr-1-0 liblsan0 libltdl-dev liblwp-mediatypes-perl liblwp-protocol-https-perl liblzma-dev
  libmagick++-6.q16-8 libmagickcore-6.q16-6 libmagickwand-6.q16-6 libmdds-dev libmetis5 libmhash2
  libmodule-runtime-perl libmongoose2 libmoo-perl libmount-dev libmpc3 libmspub-0.1-1 libmspub-dev libmwaw-0.3-3
  libmwaw-dev libmysqlclient-dev libmysqlclient21 libmythes-1.2-0 libmythes-dev libneon27-gnutls libneon27-gnutls-dev
  libnet-http-perl libnet-ssleay-perl libnspr4 libnspr4-dev libnss3 libnss3-dev libodbc1 libodfgen-0.1-1 libodfgen-dev
  libopengl-dev libopengl0 libopenjp2-7 liborc-0.4-0 liborc-0.4-dev liborc-0.4-dev-bin liborcus-0.15-0 liborcus-dev
  liborcus-spreadsheet-model-0.15-0 libp11-kit-dev libpagemaker-0.0-0 libpagemaker-dev libpango1.0-dev
  libpangoxft-1.0-0 libpaper1 libparams-classify-perl libpathplan4 libpcre16-3 libpcre2-32-0 libpcre2-dev
  libpcre2-posix2 libpcre3-dev libpcre32-3 libpcrecpp0v5 libpcsclite1 libphonenumber7 libpixman-1-dev libplot2c2
  libpng-dev libpoppler-cpp-dev libpoppler-cpp0v5 libpoppler-dev libpoppler-private-dev libpoppler97 libpq-dev libpq5
  libprotobuf17 libpsl-dev libpstoedit0c2a libpthread-stubs0-dev libpython3-dev libpython3.8-dev libqgpgme7
  libqt5concurrent5 libqt5script5 libqt5scripttools5 libqt5sql5 libqt5x11extras5-dev libquadmath0 libraptor2-0
  libraptor2-dev librasqal3 librasqal3-dev librbio2 librdf0 librdf0-dev librevenge-0.0-0 librevenge-dev
  librole-tiny-perl libsane libsane-common libsane-dev libsecret-1-0 libsecret-1-dev libsecret-common libselinux1-dev
  libsepol1-dev libservlet-api-java libservlet3.1-java libsm-dev libsnmp-base libsnmp35 libsoup2.4-dev libspiro1
  libspqr2 libsqlite3-dev libssl-dev libstdc++-9-dev libstrictures-perl libsub-override-perl libsub-quote-perl
  libsuitesparse-dev libsuitesparseconfig5 libtasn1-6-dev libthai-dev libtiff-dev libtiffxx5 libtimedate-perl
  libtommath1 libtool libtry-tiny-perl libtsan0 libubsan1 libumfpack5 libunbound8 libuninameslist1 liburi-perl
  libvisio-0.1-1 libvisio-dev libvulkan-dev libwayland-bin libwayland-dev libwebpmux3 libwebsocket-api-java
  libwpd-0.10-10 libwpd-dev libwpg-0.3-3 libwpg-dev libwps-0.4-4 libwps-dev libwww-perl libwww-robotrules-perl
  libx11-dev libx11-xcb-dev libxapian30 libxau-dev libxaw7-dev libxcb-icccm4-dev libxcb-render0-dev libxcb-shm0-dev
  libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxft-dev
  libxi-dev libxinerama-dev libxkbcommon-dev libxkbfile-dev libxml2-dev libxml2-utils libxmlsec1-dev libxmlsec1-gcrypt
  libxmlsec1-gnutls libxmlsec1-nss libxmu-dev libxmu-headers libxpm-dev libxrandr-dev libxrender-dev libxslt1-dev
  libxt-dev libxtst-dev libyajl-dev libyajl2 libzip5 linux-libc-dev lp-solve m4 make maven-repo-helper mysql-common
  nettle-dev odbcinst odbcinst1debian2 openjdk-11-jdk openjdk-11-jdk-headless openjdk-11-jre openjdk-11-jre-headless
  pango1.0-tools patchutils perl-openssl-defaults pkg-config po-debconf poppler-data pstoedit python3-dev python3-lxml
  python3-mako python3-markdown python3-packaging python3-pyparsing python3.8-dev qt5-qmake qt5-qmake-bin qtbase5-dev
  qtbase5-dev-tools qtchooser qtscript5-dev rdfind symlinks ucpp unixodbc-dev unzip uuid-dev wayland-protocols wdiff
  x11proto-core-dev x11proto-dev x11proto-input-dev x11proto-randr-dev x11proto-record-dev x11proto-xext-dev
  x11proto-xinerama-dev xorg-sgml-doctools xsltproc xtrans-dev zip zlib1g-dev
0 upgraded, 593 newly installed, 0 to remove and 0 not upgraded.
Need to get 499 MB of archives.
After this operation, 1707 MB of additional disk space will be used.
Do you want to continue? [Y/n]

이제, 리브레오피스(LibreOffice)를 빌드(Build)할 준비가 되었습니다.

Buy me a coffeeBuy me a coffee

이번에 Windows 10에서 공식적으로 WSL2 공개 및 Xwindow를 쉽게 사용할 수 있는 WSL2가 공개되었습니다.

이번 WSL2지원 버전은 Windows 10 Home까지 지원하기때문에 Windows 10 최신 업데이트를 진행하였습니다.

 

만약에, Windows 10 빌드버전이 2004가 나오지 않으면 아래의 링크로 강제 업데이트를 하면 됩니다.

https://www.microsoft.com/ko-kr/software-download/windows10

 

Windows 10 다운로드

Windows 10용 ISO 파일을 다운로드한 경우, 해당 파일은 선택한 위치에 로컬로 저장됩니다.컴퓨터에 타사 DVD 굽기 프로그램이 설치되어 있으며 해당 프로그램을 사용하여 설치 DVD를 만들려는 경우,

www.microsoft.com

 

자, Windows 10 빌드버전 2004로 직접 업데이트 해보았습니다. 

 

다행히, 다른 사람에게 물려받은 2013년도산 HP랩탑은 Windows 10 최신버전 업데이트가 적용가능함을 확인하였습니다.

이제 Windows 10 빌드버전 2004가 적용되었습니다!

설치 완료!

이후, BIOS설정으로 가상화 설정을 하였고, WSL2설치 및 Ubuntu 20.04 LTS를 설치하였습니다

설치는 아래와 같이 진행하였습니다.

docs.microsoft.com/ko-kr/windows/wsl/install-win10

 

Windows 10에 WSL(Linux용 Windows 하위 시스템) 설치

Linux용 Windows 하위 시스템을 Windows 10에 설치하는 방법에 대한 지침입니다.

docs.microsoft.com

설치 후, xming 설치를 하였고, Xwindow 패키지를 설치하여 xeye를 띄워보았습니다.

이제, Windows에서 간단한 Linux개발 및 docker, container, kubernetes 환경설정등 여러가지 작업을 할수 있을 것 같더군요 

참고1. WSL2 소개 영상

WSL2: Code faster on the Windows Subsystem for Linux! | Tabs vs Spaces

www.youtube.com/watch?v=MrZolfGm8Zk

참고2. WSL2 will be generally available in Windows 10, version 2004

devblogs.microsoft.com/commandline/wsl2-will-be-generally-available-in-windows-10-version-2004/

 

WSL2 will be generally available in Windows 10, version 2004 | Windows Command Line

WSL2 will soon be officially available as part of Windows 10, version 2004! As we get ready for general availability, we want to share one additional change: updating how the Linux kernel inside of WSL2 is installed and serviced on your machine.

devblogs.microsoft.com

참고3. What’s new for IT pros in Windows 10, version 2004 

techcommunity.microsoft.com/t5/windows-it-pro-blog/what-s-new-for-it-pros-in-windows-10-version-2004/ba-p/1419764#wsl

 

What’s new for IT pros in Windows 10, version 2004

Windows 10, version 2004, officially known as the Windows 10 May 2020 Update, is now available through Windows Server Update Services (WSUS) and Windows Update for Business, and can be downloaded from Visual Studio Subscriptions, the Software Download Cent

techcommunity.microsoft.com

 

Buy me a coffeeBuy me a coffee

GNOME 프로젝트의 어떤 파일 빌드 중

/home/dhsung/Projects/gnome-hello/configure: line 11964: syntax error near unexpected token `maximum'
/home/dhsung/Projects/gnome-hello/configure: line 11964: `GNOME_COMPILE_WARNINGS(maximum)'

위의 메세지를 띄우며 빌드가 안될때 해결책.
'gnome-common'라이브러리( Common Files to Build GNOME )이 없어서 나오는 문제.

그래서 아래와 같이 'gnome-common'라이브러리를 설치해면 해결됨.

openSUESE에서
sudo zypper install gnome-common

Ubuntu에서
sudo apt install gnome-common

위의 패키지 설치가 끝나면 해결됨.

출처: GNOME_COMPILE_WARNINGS(maximum) – Syntax Error in configure

Buy me a coffeeBuy me a coffee

+ Recent posts