안경잡이개발자

728x90
반응형

  MIRFLICKR 데이터셋은 플리커(Flickr)에서 크롤링한 이미지를 모아 놓은 데이터셋입니다. 내부적으로 people, sky, street, dog 등의 다양한 태그(tag)를 가지고 있습니다. 공식 사이트에 따르면 이미지당 평균 태그의 수는 8.94개라고 합니다. 데이터셋을 다운로드하기 위해서는 아래의 사이트로 가면 됩니다.

 

  ▶ MIRFLICKR 데이터셋 다운로드: press.liacs.nl/mirflickr/mirdownload.html

 

  MIRFLICKR 데이터셋을 다운로드할 수 있습니다. 1M 버전과 25K 버전이 있는데, 일반적으로 가볍게 실험하기 위한 목적으로는 25K 데이터셋을 많이 사용합니다.

 

 

  다운로드를 완료한 뒤에 사진을 열어보면 대략 다음과 같은 형태의 사진들이 있습니다.

 

 

  25K 버전의 데이터셋은 내부적으로 25,000개의 이미지를 포함하고 있습니다. 압축 파일 크기는 2.85GB이며 해상도가 큰 이미지도 많이 포함하고 있기 때문에, 어느 정도 규모가 있는 네트워크를 학습시키기 위한 목적으로도 효과적으로 사용할 수 있습니다.

728x90
반응형

728x90
반응형

  필자의 경우 최근에 유튜브 채널에서 광고성 댓글 테러를 당했다. 수천 개의 광고성 댓글이 모든 영상에 걸쳐 달리게 된 것이다. 따라서 자동화 프로그램을 만들어 광고성 댓글을 스팸 댓글로 처리하고자 한다. 기본적으로 YouTube API는 국르 클라우드 플랫폼(Google Cloud Platform)을 이용하여 다룰 수 있다.

 

  광고성 댓글로는 다음과 같은 것들이 있다. 상당히 스트레스다.

 

 

구글 클라우드 플랫폼(Google Cloud Platform)에서 새 프로젝트 만들기

 

  구글 클라우드 플랫폼 링크: console.cloud.google.com/

 

  YouTube Data API를 사용하기 위해 가장 먼저 구글 클라우드 플랫폼에서 새 프로젝트를 생성해 보자.

 

 

▶ YouTube DATA API v3 사용 설정하기

 

  구글 클라우드 플랫폼은 매우 많은 수의 API를 제공한다. 따라서 프로젝트를 생성한 이후에는 YouTube Data API를 검색하여 이를 [사용] 설정할 필요가 있다.

 

 

▶ 사용자 인증 정보 만들기

 

  파이썬(Python) 등의 프로그램 환경에서 API를 호출해 사용하기 위해서는 사용자 인증을 수행해야 한다. 따라서 [사용자 인증 정보 만들기] 버튼을 눌러 인증 정보를 만들어 보자.

 

 

  다음과 같이 사용자 인증 정보를 추가할 수 있다. 필자의 경우 파이썬(Python) 프로그램으로 API를 호출할 것이다. 따라서 [기타 UI]를 선택한 뒤에 액세스할 데이터로는 [사용자 데이터]를 선택한다. 즉 파이썬 프로그램을 사용하는 사용자가 먼저 인증을 수행하고, 파이썬 프로그램은 액세스 토큰(access token)을 얻어 해당 사용자의 유튜브 채널 데이터를 처리할 수 있게 된다.

 

 

▶ OAuth 동의 화면 설정

 

  이어서 자신이 작성할 프로그램에서 특정한 사용자의 데이터에 접근하는 것이므로, 그 사용자(client)에게 권한을 요청하는 동의 화면을 만들어야 한다. 흔히 [구글 계정으로 로그인]과 같은 기능에서 동의 화면이 나오는 것을 떠올리면 된다.

 

 

   동의 화면 설정을 할 때는 사용자(user) 타입을 설정할 수 있는데, 필자의 경우 스스로 개인 유튜브 채널의 댓글을 관리하기 위해 사용할 것이다. 그래도 [외부]를 선택하는데, 필자의 경우 G Suite 사용자가 아니기 때문이다.

 

 

  이제 OAuth 동의 화면에 대한 설정을 진행하자.

 

 

  이제 권한을 요청할 범위를 선택한다. 필자는 유튜버의 댓글에 접근(access)할 필요가 있다. 따라서 [범위 추가 또는 삭제] 버튼을 눌러 범위를 설정할 수 있도록 한다.

 

 

  유튜브 채널 댓글 관리를 위해 YouTube Data API에서 YouTube 댓글 관련 범위를 선택한다. 구체적으로 youtube.force-ssl을 이용하면 된다.

 

 

  테스트 사용자의 경우 혼자 사용하고 테스트할 것이므로 나 자신을 추가한다. [ADD USERS]를 누른 뒤에 구글 이메일을 입력하고 저장하면 된다.

 

 

클라이언트 ID 생성 및 사용자 인증 정보 다운로드 

 

  이제 실질적으로 OAuth 2.0 클라이언트를 생성한다.

 

 

  이제 [다운로드] 버튼을 눌러 생성된 사용자 인증 정보를 다운로드한다.

 

 

  참고로 여기에서 OAuth 2.0 클라이언트(client)란 개발자가 작성한 소프트웨어를 말한다. 파이썬으로 동작하는 프로그램이 있을 때, 이 프로그램은 '자원 소유자(resource owner) = 유튜버'의 자원에 접근하기 위해 구글 서버(server)에 요청을 보내는 클라이언트라고 볼 수 있기 때문이다.

 

▶ Client Secret 다운로드

 

  결과적으로 Client Secret 파일을 다운로드하면 된다. 이는 개발자를 위한 .json 환경 설정 파일이다. 자신이 작성한 프로그램에서 OAuth 2.0 기능을 사용한다면, 이러한 .json 파일을 이용해 구글 API 서버에 접근할 수 있는 것이다. 당연히 다른 사람에게 유출되지 않도록 조심히 다루어야 한다.

 

 

▶ 소스코드 작성을 위해 참고할 문서

 

  1. YouTube Data API 댓글(comment) 문서 링크: developers.google.com/youtube/v3/docs/comments

 

  가장 좋은 것은 일단 공식 문서를 읽어보는 것이다. 상당히 내용이 잘 정리되어 있다. 특히 [Try this API] 창을 이용하여 API를 이용해 볼 수 있다. 예를 들어 댓글을 관리하기 위한 API 중 하나인 setModerationStatus()를 이용한다고 해보자. 이때 댓글 ID를 설정한 뒤에, 해당 댓글을 작성한 사람을 차단(ban)하는 등의 작업이 가능하다.

 

 

  참고로 [SHOW CODE] 버튼을 누르면 해당 API를 특정 프로그래밍 언어로 어떻게 이용할 수 있는지 자세한 코드 정보가 같이 나온다.

 

 

  2. YouTube 파이썬 API 공식 코드: github.com/youtube/api-samples/tree/master/python

 

  파이썬 사용자를 위한 YouTube Data API의 공식 코드를 확인할 수 있다. 예를 들어 API를 이용해 댓글을 관리하고자 할 때는 [Create and manage comments] 링크에 들어가 예제를 확인해 볼 수 있다.

 

 

▶ 소스코드 작성하기

 

  아래 깃허브에 필자가 작성한 코드 예시가 있다. 자신의 필요에 따라서 코드를 변경하여 사용하면 된다.

 

  github.com/ndb796/Management-Programs-for-YouTuber

728x90
반응형

728x90
반응형

  Google Cloud Platform의 경우 프로젝트 할당량이 정해져 있다. 일반적인 개발자의 경우 프로젝트(project)의 수 자체가 많지 않으므로 문제가 없지만, 프로젝트를 많이 운영하는 회사의 경우에는 GCP 프로젝트의 수를 많이 만들 필요가 있다. 예를 들어 다음과 같이 할당량이 부족하므로 할당량 증가를 요청하라는 메시지가 나오는 것을 알 수 있다.

 

  이때는 [MANAGE QUOTAS(할당량 관리)] 버튼을 눌러 할당량을 관리할 수 있다.

 

 

  결과적으로 다음과 같은 형태의 양식을 작성한 뒤에 제출하면 된다.

 

 

작성할 내용은 다음과 같다.

1. 이름: 본인의 이름을 넣는다.
2. 회사 혹은 웹사이트 이름: 옵션이므로 넣지 않아도 된다.
3. 이메일 주소: 요청(request)을 작성하고 있는 구글 계정을 넣는다.
4. 추가로 필요한 프로젝트의 수: 필요한 프로젝트의 수를 넣는다. 50개 이하라면 별다른 이유를 작성하지 않아도 된다.
5. 새로운 프로젝트에서 사용할 서비스의 종류
6. 필요한 이유: 필자의 경우 '교육용 비디오'를 만들기 위한 목적이라고 썼다.

 

예시) I need more project quotas to make educational videos for developers.

728x90
반응형

728x90
반응형

  단순히 비밀번호를 입력하여 접속하지 않고 SSH Key를 이용하여 서버에 접속하는 방법이 있다. 서버(server)에서 SSH Key를 만들고 세팅하는 방법은 간단하다. 단순히 ssh-keygen을 입력하면 된다. 이후에 엔터(enter)를 반복하면 자신의 홈 디렉터리(home directory)의 .ssh 경로에 개인키와 공개키 파일이 저장된다.

 

 

  다음과 같이 .ssh 디렉터리에 가보면 세 가지 파일이 존재한다.

 

  ▶ id_rsa: 개인키(private key)이며 접속하고자 하는 클라이언트(client)가 가지고 있는다.

  ▶ id_rsa.pub: 공개키(public key)이며 서버(server)가 가지고 있는다.

  ▶ authorized_keys: 서버가 접속을 허용할 공개키(public key) 리스트다.

 

 

  따라서 가장 먼저 서버는 id_rsa.pub에 적혀있는 공개키 데이터를 authorized_keys에 작성한다. 이후에 클라이언트(client)가 접속할 때는 id_rsa를 이용하여 서버에 접속하면 접속에 성공할 수 있다. 실제로 접속할 때의 명령어는 다음과 같다.

 

ssh -i {개인키 경로} {사용자명}@{서버 주소}
728x90
반응형

728x90
반응형

우분투(Ubuntu) 서버(Server) OS의 IP를 변경하기 위해서는 /etc/network/interfaces를 수정하면 된다. 대략 다음과 같은 형태로 사용한다. (참고로 우분투 테스크톱 버전에서는 네트워크 매니저 패키지가 가장 우선순위가 높기 때문에, 데스크톱 버전을 쓰고 있다면 그냥 네트워크 매니저를 건드리면 된다.)

 

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp3s0
iface enp3s0 inet static
        address {사용할 IP 주소}
        netmask {네트워크 마스크 주소}
        gateway {게이트웨이 주소}
        dns-nameservers {사용할 DNS 서버 주소 1} {사용할 DNS 서버 주소 2}

 

설정을 변경한 뒤에는 다음과 같이 네트워크 서비스(service)를 재시작하여 변경된 네트워크 설정을 반영한다.

 

systemctl restart networking.service

 

이후에 ifconfig 명령어를 이용하여 아이피(IP)가 변경되었는지 확인한다. 만약 변경되지 않았다면 재부팅을 진행한 뒤에 다시 확인해보자.

 

[ 참고 ]

 

고정 IP 설정을 위해서는 /etc/network/interfaces를 다음과 같은 형태로 수정한다.

 

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp3s0
iface enp3s0 inet dhcp

 

728x90
반응형

728x90
반응형

※ 리눅스(Linux) 커널 소스코드 다운로드 ※

 

우분투는 전형적인 데비안 리눅스 기반의 운영체제다. 가장 먼저 리눅스 커널 소스코드를 다운로드받는다. 버전별로 리눅스 커널 소스코드를 업로드해 놓은 사이트가 존재하는데, 아래 사이트에 접속하여 자신에게 필요한 버전의 소스코드를 받을 수 있다.

 

  ▶ 전체 커널 소스코드 목록: mirrors.edge.kernel.org/pub/linux/kernel/

 

필자의 경우 리눅스 5.8.7 커널 이미지를 다운로드받았다. 간단히 wget 명령어를 이용해 다운로드할 수 있다.

 

!wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.8.7.tar.gz

 

다운로드를 완료하면 .tar 확장자의 압축 파일이 생긴다. 다음의 명령을 이용하여 압축을 해제하자.

 

tar xvf linux-5.8.7.tar.gz

 

이후에 다음과 같이 리눅스(Linux) 소스코드 폴더로 이동하면 된다. 여기에 전체 커널 코드가 있다.

 

 

※ 환경설정(configuration) 파일 준비하기 ※


커널 디렉터리 내부에 들어온 뒤에는 가장 먼저 .config 파일을 생성해야 한다. 이는 커널 환경설정 파일이다. 이때 간단히 현재 자신의 커널 설정을 그대로 옮겨올 수 있다. 만약 컴파일을 진행하는 컴퓨터의 커널 설정을 그대로 적용하고자 한다면 마음과 같은 형태의 코드를 사용한다.

 

sudo cp /boot/config-{커널 버전} ./.config

 

필자는 아래와 같이 명령어를 입력하여 실행했다.

 

 

※ 커널 컴파일(Compile) 준비하기 ※

 

이어서 리눅스 커널을 컴파일하기 위해 필요한 패키지들을 설치한다. 아래 명령어는 필수 패키지 설치를 위해 일반적으로 많이 사용되는 명령어다. 가능하다면 필요하지 않은 패키지는 설치하지 않고, 패키지가 없다는 오류 메시지가 나오면 그때마다 패키지를 설치하는 방법으로 진행해도 된다.

sudo apt-get install build-essential libncurses5 libncurses5-dev bison flex libssl-dev libelf-dev bin86 kernel-package

 

※ 커널 컴파일(Compile) ※

 

컴파일 및 빌드는 생각보다 간단하다. 커널 소스코드를 수정한 뒤에 make를 입력하여 컴파일을 진행하면 된다. 이때 컴파일 속도를 빠르게 만드는 옵션을 사용할 수 있다. 이를 위해 가장 먼저 nproc 명령어를 이용하여 컴파일을 수행하는 컴퓨터의 프로세서(processor) 개수를 구하자.

 

 

필자의 경우 8코어 CPU를 사용하고 있기 때문에, -j8 옵션을 사용하겠다. 더불어 데비안 패키지(Debian Package) 형태로 빌드를 진행하겠다. 참고로 데비안 패키지는 .deb 확장자를 가지며, 비유하자면 윈도우에서의 .exe나 .msi와 같은 확장자를 가지는 프로그램 설치용 소프트웨어와 유사한 기능을 제공한다.

 

make -j8 bindeb-pkg

 

커널 컴파일을 진행해보자. 일반적인 PC에서 컴파일 명령어를 입력하면 1시간 이상의 시간이 소요될 수 있다. 대신에 한 번 컴파일했다면 그다음부터는 소스코드를 조금씩 수정해도 비교적 금방 컴파일이 완료될 것이다.

 

 

다음의 사진과 같이 매우 많은 소스코드를 컴파일하게 되는 것을 알 수 있다.

 

 

컴파일이 완료되고 .deb 패키지들이 생겼다.

 

 

대략 다음과 같은 형태의 데비안 패키지들을 얻었다면 성공이다.

 

linux-headers-5.8.7_5.8.7-4_amd64.deb
linux-image-5.8.7_5.8.7-4_amd64.deb
linux-libc-dev_5.8.7-4_amd64.deb

 

※ 패키지 옮기기 ※

 

필자의 경우에는 컴파일을 수행한 컴퓨터가 아닌 다른 컴퓨터의 커널을 업데이트할 것이다. 따라서 일단 데비안 패키지를 커널을 업데이트할 컴퓨터의 저장장치로 옮기면 된다.

 

그러므로 일단 커널을 업데이트할 저장장치를 연결한 뒤에 마운트를 진행한다.

 

mkdir -p mnt/fat32
mkdir -p mnt/ext4
sudo mount {블록 디바이스} mnt/fat32
sudo mount {블록 디바이스} mnt/ext4

 

 

이제 cp 명령어를 이용하여 .deb 파일을 옮긴다.

 

cp linux-headers-5.8.7_5.8.7-4_amd64.deb mnt/ext4/home/
cp linux-image-5.8.7_5.8.7-4_amd64.deb mnt/ext4/home/
cp linux-libc-dev_5.8.7-4_amd64.deb mnt/ext4/home/

 

패키지(package) 파일을 모두 옮겼다면 마운트를 해제하면 된다.

 

sync
sudo umount mnt/fat32
sudo umount mnt/ext4
rm -rf mnt/

 

 

※ 커널 업데이트 ※

 

모든 .deb 파일을 옮겼다면, 커널을 업데이트할 컴퓨터를 실행한 뒤에 dpkg 명령어를 이용하여 패키지를 설치한다.

 

sudo dpkg -i linux-headers-5.8.7_5.8.7-4_amd64.deb
sudo dpkg -i linux-image-5.8.7_5.8.7-4_amd64.deb
sudo dpkg -i linux-libc-dev_5.8.7-4_amd64.deb

 

설치가 완료되었다면 재부팅한다.

 

sudo reboot

 

 

※ 참고사항 ※

 

커널이 정상적으로 업데이트되었는지 확인하기 위해 커널 정보를 출력할 수 있다.

 

cat /proc/version

 

728x90
반응형

728x90
반응형

이 포스팅에는 부정확한 내용이 존재할 수 있습니다. Disk Identifier를 잘못 건드리면 파일 시스템에 문제가 생겨 부팅 자체에 실패할 수 있으며, 본 블로그의 글을 따라 하여 발생하는 문제에 대한 책임은 지지 않습니다.

 

※ 문제 상황 ※

 

  우리는 dd와 같은 명령어를 이용해 특정 디스크 내용 전체를 다른 디스크로 복제할 수 있다. 다만 이때 기본적으로 디스크(disk)의 식별자(identifier)도 복제된다. 만약 원본 디스크와 복제된 디스크를 둘 다 하나의 컴퓨터에 연결하여 부팅하게 되면 어떤 문제가 발생할 수 있을까? 다시 말해 디스크 식별자(disk identifier)가 완전히 동일한 두 개의 장치가 있을 때 부팅을 시도하는 것이다.

 

  이렇게 하면 UEFI를 위한 GPT가 올라가 있는 파티션Linux OS가 올라가 있는 파티션서로 다른 디스크(저장장치)로부터 인식하게 되는 문제가 발생할 수 있다.

 

  아래 그림은 SD 카드(mmcblk2)에 있는 디스크와 USB(sda)에 있는 디스크가 완전히 동일한 상황에서 부팅을 한 결과다. 분명히 SD 카드로 부팅을 시도했지만, GPT 부분만 정상적으로 SD 카드에 있는 파티션을 통해 인식했다. 실제로 리눅스(Linux) 파일 시스템에 대해서는 USB에 있는 파티션을 이용해 부팅을 진행한 것이다.

 

  즉, SD 카드로 부팅을 했는데 정작 USB에 있는 OS를 불러와 사용하고 있는 것이다. 디스크의 식별자가 동일하기 때문에 발생하는 문제다.

 

 

  만약에 SD 카드만 꽂혀 있거나, USB만 꽂혀 있는 경우에서는 당연히 정상적으로 하나의 디스크만 사용하여 부팅을 진행할 수 있다. 하지만 이처럼 동일한 식별자(identifier)를 가지는 두 개의 디스크가 동시에 꽂혀 있다면 OS를 부팅하는 과정에서 문제가 발생할 수 있다.

 

※ 문제의 원인 ※

 

  이러한 문제는 왜 발생하는 걸까? 앞서 말했듯이 디스크의 식별자가 동일하기 때문이다. 특히 GPT에 있는 GRUB과 관련이 있다. GRUB은 부트로더(bootloader)로서 불러올 OS가 존재하는 저장장치에 대한 정보를 환경설정 파일 형태로 미리 가지고 있을 수 있다.

 

  SD 카드로 부팅을 진행하게 되면, GPT 영역을 참조하여 미리 정해진 OS 파티션의 디스크로 실제 부팅을 진행한다. 이때 디스크 UUID가 중복되는 경우에는 UEFI 레벨에서 부팅하기로 설정한 저장장치(SD 카드)가 아닌 (USB와 같은) 다른 저장장치를 이용해 부팅을 진행할 수 있다는 것이다.

 

※ UUID 확인해 보기 ※

 

  이러한 문제를 해결하기 위해 하나의 디스크의 UUID를 변경하는 시도를 해보자. 그러기 전에 가장 먼저 blkid 명령어를 이용하여 UUID를 포함한 구체적인 저장장치 정보를 확인할 수 있다. (sudo blkid | grep UUID) 확인해 보면 sda와 mmcblk2p의 UUID가 정확히 동일한 것을 알 수 있다. 이러한 상황에서는 문제가 발생할 수 있는 것이다.

 

 

※ 해결 과정 ※

 

  문제를 해결하기까지 시도한 내용에 대하여 차근차근 명시하겠다.

 

[과정 1] tune2fs 명령어를 이용한 ext4 파티션 UUID 변경

 

  먼저 tune2fs에 대하여 알아보자. tune2fs는 리눅스 파일시스템의 다양한 변수 값을 바꿀 수 있도록 도와주는 명령어다. 한 번 OS가 존재하는 ext4 형식에 해당하는 /dev/mmcblk2p2 디바이스의 UUID를 변경해보겠다.

 

 

  성공적으로 변경된 것을 확인할 수 있다. /dev/mmcblk2p2의 UUID 부분이 새로운 값으로 변경되었다.

 

 

  이는 ext4 형식의 파일 시스템의 UUID를 변경하는 전형적인 방법이다. 또한, 이처럼 UUID를 변경하는 경우에는 fstab에서 이전 UUID 레이블(label) 정보를 가지고 있는지 확인할 필요가 있다. 따라서 UUID를 변경한 장치를 마운트한 뒤에 해당 UUID가 변경된 디바이스 내부의 /etc/fstab 파일을 열어서 ext4에 해당하는 UUID 값을 변경된 값에 맞게 수정해준다.

 

  이때 fstab파일시스템 정보를 담고 있는 설정 파일이다. 그러므로 부팅 시 UUID가 잘못 기록되어 있으면 grub까지만 진입하게 되며 OS를 정상적으로 부팅할 수 없게 된다.

 

 

  다만 여기까지 한다고 하더라도 재부팅을 진행했을 때 grub 단계에서 오류가 발생하고 OS 부팅으로 넘어가지 못하는 문제가 발생할 수 있다. 특히 필자의 경우 UUID를 바꾼 디바이스를 그 자체로 저장장치로 사용해야 하기 때문에 grub 단계에서 넘어가지 못하면 의미가 없었다.

 

[과정 2] grub.cfg 파일 수정

 

  말했듯이 fstab을 변경했다고 해도 여전히 grub 단계에서 다른 장치로 부팅을 시도하기 때문에, SD 카드로 부팅을 하였을 때 (USB 장치에서 OS를 불러오거나 하는) 오류가 발생할 수 있다. 따라서 grub 환경설정(configuration) 파일을 수정할 필요가 있다. 따라서 마찬가지로 UUID를 변경한 디바이스(device)를 마운트한 뒤에 /boot/grub/grub.cfg 파일을 수정한다.

 

  참고로 vi 에디터(editor)를 사용하면 다음과 같은 형식의 명령어를 이용해 문서 전체에서 특정 문자열을 다른 문자열로 바꿀 수 있다.

:%s/{변경할 문자열}/{변경 이후 문자열}/g


  필자는 다음과 같이 입력하여 일괄적으로 UUID를 변경했다.

:%s/6355c332-3454-4cbd-9a91-f4100bac43bf/fe0f0275-24f3-4a5c-8551-80ec4fa8cae7/g

 

  변경 결과는 다음과 같다. 이제 문서를 저장하고 나온다.

 

 

[과정 3] GPT 파티션의 grub.cfg 수정


  또한 GPT 파티션에도 이전 UUID 값이 기록되어 있는지 확인할 필요가 있다.

 

 

  그래서 필자는 UUID를 변경한 저장장치의 GPT 파티션을 마운트하여 /EFI/ubuntu/grub.cfg를 확인했다. 마찬가지로 여기에서도 UUID에 대한 값이 하드코딩되어 있었다. 그래서 이 값 또한 변경된 UUID가 들어갈 수 있도록 하였다.

 

 

  이제 마운트를 해제하고 재부팅을 진행한다. 그러면 정상적으로 SD 카드로 오류 없이 부팅이 완료된다. 참고로 여기까지의 과정을 수행하여 SD 카드와 USB를 완전히 구분할 수 있게 되었다는 것은, GPT 파티션의 UUID가 같아도 UEFI 레벨에서는 이 두 개를 구분할 수 있다는 의미가 된다.

 

[추가적인 시도] hexedit {/dev/example}

 

  그래도 아직 UEFI 관련 파티션의 UUID는 변경되지 않았다. 그래서 UEFI 파티션의 UUID를 바꾸기 위한 방법을 생각해 보다가 HEX 데이터를 변경하여 수정하는 방법을 진행해 보았다. UUID 값이 "EB93-49AC"라고 되어 있으므로, /를 눌러 "AC4993EB"를 검색했다.

 

 

이후에 해당 내용을 내가 원하는 문자열로 바꾸었다. 간단히 "12123434"로 바꾸어 볼 수 있을 것이다.

 

 

결과적으로 이번 시도에서는 다시 blkid 명령어를 사용했을 때 성공적으로 UUID가 변경된 것을 확인할 수 있었다.

 

 

  다만 이렇게 바꾸고 나서도 UEFI 레벨에서 저장장치의 UUID를 확인할 때는 여전히 변경되기 전의 UUID로 인식되고 있는 것을 알 수 있었다. 다시 말해 이 부분은 해결하지 못했다.

728x90
반응형

728x90
반응형

  장시간 공부 타임랩스 동영상을 찍은 뒤에 동영상의 길이를 압축하여 시간을 줄이고 싶다면 어떻게 하면 될까요? 예를 들어 동영상의 길이가 7시간인 상황에서 동영상을 정확히 3분의 시간으로 압축(빠르게 재생)하고자 하는 경우를 생각해 봅시다. 이는 간단히 생각해 보아도 동영상의 재생 속도가 100배 이상 빨라지는 것과 마찬가지의 효과를 낼 것입니다.

 

 필자는 7시간짜리 타임랩스 영상을 프리미어로 불러왔습니다. 참고로 시간을 압축한 동영상을 제작하고자 하는 경우 원래의 시간이 어느 정도인지 알기 어렵기 때문에 [시간 코드] 효과를 넣어주는 것이 좋습니다. 따라서 [효과] 탭에서 [시간 코드] 효과를 선택해 넣어주겠습니다. 이를 통해 전체 클립의 길이에서 어느 정도까지 재생되었는지 동영상 화면에 출력할 수 있습니다.

 

 

  [시간 코드] 효과를 넣은 뒤에는 화면 내 적절한 위치로 옮겨주시고, 필요하다면 오프셋(offset)을 설정하여 시간 코드의 시작 시각이 00시 00분 00초가 될 수 있도록 합니다.

 

 

  이어서 시간을 압축하고 싶다면 [속도/지속 시간] 란에 들어가서 전체 동영상 속도를 줄이면 됩니다. 프리미어 프로에서는 특정한 비율만큼 속도를 줄일 수도 있으며, 혹은 특정한 길이를 가지도록 알아서 빠르기가 조절되도록 만들 수도 있습니다.

 

 

  필자의 경우 원본 동영상의 길이가 7시간이 넘기 때문에 100배 빠르게 하여 4분가량의 길이로 압축했습니다. 필자가 사용하고 있는 프리미어 프로에서는 최대 100배까지만 빠르게 만들 수 있습니다. (최대 10000%의 속도)

 

 

  필자가 사용하고자 하는 음악 파일은 3분가량이기 때문에, 사실 4분의 길이보다 더 많이 줄여야 합니다. 그러므로 일단 100배까지만 빠르게 설정한 뒤에 동영상을 내보내기 하겠습니다. [내보내기] 창을 열어 다음과 같이 동영상을 만들어 주겠습니다. 필자의 경우 원본 동영상의 길이가 7시간이므로 [내보내기]를 수행하는 데에만 30분가량의 시간이 소요되었습니다.

 

 

  내보내기가 완료되면 빠르게 감기가 완료된 이미지를 다시 프리미어로 불러와, 다시 한번 속도를 빠르게 만들어 음악의 길이와 동일하게 맞추어 주면 됩니다.

 

 

  결과적으로 7시간짜리 동영상을 2분 45초짜리 영상으로 압축(빠르게 감기)한 영상을 제작할 수 있었습니다.

 

 

728x90
반응형

728x90
반응형

  원타임 패드(One-time Pad) 암호 시스템은 간단하면서도 강력한 암호 시스템이다. 메시지를 주고 받는 두 개체가 동일한 패드(pad)를 공유하고 있다면 중간에서 암호화된 메시지를 가로채도 복호화할 수 없다. 여기에서 중요한 점은 평문과 키의 길이는 같다는 것이다. 평문이 256 bits이라면, 키 또한 256 bits이다.

 

  암호화 및 복호화에 사용되는 공식은 다음과 같다.

 

(평문 XOR 키) XOR 키 = 평문

 

  파이썬으로 간단히 구현한 것은 다음과 같다. 아래 예시에 등장한 모든 키(key)와 평문(message)의 길이는 256 bits이다.

 

from binascii import hexlify
import random

letters = '0123456789ABCDEF'

def xor(a, b):
    length = len(a)
    result = []
    for i in range(length):
        now = int(a[i], 16) ^ int(b[i], 16) # letter -> hex -> xor
        result.append(letters[now])
    return result


print("---------- 데이터 생성 및 XOR 연산 테스트 ----------");
a = [random.choice(letters) for i in range(64)] # 256 bits
b = [random.choice(letters) for i in range(64)] # 256 bits

print(f"A = 0x{''.join(a)}") # A 출력
print(f"B = 0x{''.join(b)}") # B 출력
print(f"A xor B = 0x{''.join(xor(a, b))}") # A xor B 출력

# 암호화 함수
def encrypt(message, key):
    encrypted_message = xor(message, key)
    return encrypted_message

# 복호화 함수
def decrypt(encrypted_message, key):
    message = xor(encrypted_message, key)
    return message


print("---------- 사용 예시 1 ----------");
key = [random.choice(letters) for i in range(64)] # 256 bits
message = [random.choice(letters) for i in range(64)] # 256 bits
encrypted_message = encrypt(message, key)
decrypted_message = decrypt(encrypted_message, key)

print(f"Key = 0x{''.join(key)}") # Key 출력
print(f"Message = 0x{''.join(message)}") # Message 출력
print(f"Encrypted Message = 0x{''.join(encrypted_message)}") # 암호화 결과 출력
print(f"Decrypted Message = 0x{''.join(decrypted_message)}") # 복호화 결과 출력

print("---------- 사용 예시 2 ----------");
message = "HELLO APPLE BANANA CARROT DURIAN"
print("문자열 메시지:", message)

message = message.encode()
message = hexlify(message).decode().upper()
encrypted_message = encrypt(message, key)
decrypted_message = decrypt(encrypted_message, key)

print(f"Key = 0x{''.join(key)}") # Key 출력
print(f"Message = 0x{''.join(message)}") # Message 출력
print(f"Encrypted Message = 0x{''.join(encrypted_message)}") # 암호화 결과 출력
print(f"Decrypted Message = 0x{''.join(decrypted_message)}") # 복호화 결과 출력 

result = bytearray.fromhex(''.join(decrypted_message)).decode()
print("복호화된 문자열 메시지:", result)

 

  실행 결과는 다음과 같다.

 

 

  참고로 원타임 패드 암호 시스템은 두 개체가 서로 동일한 패드(pad)를 공유하고 있어야 한다는 점에서 현실적으로 적용하기에 어려운 점이 있다. 그리고 평문과 키의 길이가 동일해야 한다는 특징을 기억할 필요가 있다.

728x90
반응형

728x90
반응형

  윈도우 키 + R을 눌러 [실행] 창을 열고, winver를 입력한다.

 

 

  이후에 다음과 같이 윈도우(Windows) 운영체제의 버전이 나온다.

 

728x90
반응형