안경잡이개발자

728x90
반응형

  라즈베리파이(Raspberry Pi) Zero W가성비가 매우 뛰어난 소형 보드로 유명합니다. 저는 현재 참여하고 있는 프로젝트에서 라즈베리파이를 사용해야 해서 이 모델을 골라 사용하고 있습니다. Raspberry Pi Zero W는 다음과 같이 생겼습니다. SD 카드에 라즈베리파이 운영체제(OS)를 설치한 뒤에 라즈베리파이에 꽂아서 부팅하면 됩니다.

 

 

※ 스펙(Specification) 소개 ※

  ▶ 802.11 b/g/n wireless LAN: 와이파이(Wi-Fi)를 사용할 수 있습니다.
  ▶ 블루투스(Bluetooth)
  ▶ 1GHz, single-core CPU: 다른 소형 보드와 비교했을 때, 가격 대비 괜찮은 성능의 CPU가 탑재되어 있습니다.
  ▶ 512MB RAM: 간단한 웹 서버를 올릴 수도 있는 크기의 메모리(RAM)입니다. 
  ▶ USB OTG: USB 디바이스 기능을 지원합니다. (라즈베리파이를 이용한 마우스, 키보드 개발 등이 가능)
  ▶ Micro USB Power: 충전 목적의 포트입니다. 다만 전원용 USB의 전압(voltage)은 반드시 5-5.25V 사이가 되어야 합니다.  일반적인 USB 충전기의 경우 5V 전압이므로, 그냥 편의점에서 파는 마이크로 USB를 꽂아 쓰면 됩니다.
  ▶ CSI Camera Connector: CSI 포트가 존재하므로 라즈베리파이 카메라 모듈을 사용할 수 있습니다. IoT 사물 인식 기기, CCTV 기기 등을 개발할 때 효과적으로 사용됩니다.

 

※ 라즈베리파이의 일반적인 사용 형태 ※

 

  참고로 Raspberry Pi Zero W의 경우 헤드리스(headless) 서버 설정이 가능하기 때문에, 사실 Mini HDMI 케이블을 구매하지 않아도 간단히 서버로 사용이 가능합니다. 아마 단순히 라즈베리파이를 간단한 서버용으로 사용하시는 분들은 다음과 같은 형태로 사용하실 겁니다. SD카드에 우분투(Ubuntu)를 구워 넣고, 마이크로 USB로 전원을 공급하고 있는 모습입니다. 라즈베리파이 OS의 경우에 SSH 접속을 지원하기 때문에, SSH를 열어 놓고 외부에서 접속해 사용하는 방식으로 편하게 사용할 수 있습니다.

 

 

※ Raspberry Pi Zero W 구매 방법 ※

 

  Raspberry Pi Zero W는 Amazon이나 Canakit과 같은 사이트를 통해 구매할 수 있습니다. 또한 일반적인 경우 보드(Board)만 구매하는 경우에는 1개씩만 구매할 수 있도록 하는 경우가 많습니다. 사실 10달러($)에 이 정도의 보드를 살 수 있다는 것 자체가 매우 좋은 조건이긴 합니다.

 

 

  참고로 스타터 키트(Starter Kit)의 경우 다음과 같은 구성을 가지고 있습니다. 확인해 보시면 Mini HDMI 어댑터(adapter)와 USB OTG 케이블(cable)을 가지고 있습니다. 이걸로 모니터와 마우스를 연결할 수 있기 때문에, 헤드리스(headless) 서버가 아니라 하나의 고유한 컴퓨터처럼 라즈베리 파이를 이용하고 싶으신 분들은 스타터 키트를 구매하시는 것이 편할 수 있습니다.

 

 

※ 라즈비안(Raspbian) OS 설치하기 ※

 

  라즈베리파이는 기본적으로 SD 카드를 꽂을 공간을 가지고 있습니다. 따라서 SD 카드에 운영체제(OS)를 설치하면 됩니다. 가장 대표적인 운영체제로 라즈비안(Raspbian) OS를 설치할 수 있습니다.

 

▶ 라즈비안(Raspbian) 운영체제 설치 경로https://www.raspberrypi.org/downloads/raspbian/

 

Download Raspberry Pi OS for Raspberry Pi

Raspberry Pi OS (previously called Raspbian) is the Foundation's official supported operating system. Install it with NOOBS or download the image below.

www.raspberrypi.org

 

  다음과 같이 최소한의 정보만 담은 Lite 버전으로 OS를 설치하여 사용할 수 있습니다. [Download ZIP] 버튼을 눌러  다운로드를 진행합니다. 대개 3분~5분 정도면 다운로드가 완료되며, 압축된 파일은 500MB가 안 되지만 실제 이미지(image) 파일은 2GB 정도입니다.

 

 

※ SD 카드에 라즈비안(Raspbian) OS 굽기 ※

 

  라즈비안(Raspbian)을 OS에 굽기 위해서는 플래시(Flash) 프로그램을 사용할 수 있습니다.

 

  ▶ Etcher 설치 경로: www.balena.io/etcher/

 

  자신의 운영체제에 맞는 설치 프로그램을 받아서 설치를 진행하시면 됩니다. 저는 다음과 같이 윈도우(Windows) 운영체제에 맞는 프로그램을 설치했습니다.

 

 

  이어서 설치를 진행하시면 됩니다.

 

 

  이후에 Etcher 프로그램을 이용하여 라즈베리파이 이미지 파일을 선택하고, 플래시(flash)를 진행하면 됩니다. 이를 위해 SD 카드 어댑터(adapter)를 이용하여 PC에 SD 카드를 연결해야 합니다. 일반적인 컴퓨터나 노트북은 SD 카드 어댑터를 이용해 SD 카드를 연결하게 되어 있습니다.

 

 

  Etcher 프로그램을 실행하여 [Flash from file]을 눌러 라즈베리파이 이미지를 선택합니다.

 

 

  그리고 [Selected target] 버튼을 눌러 SD 카드를 선택하고 플래시(flash) 버튼을 누릅니다.

 

 

  플래시(flash) 작업이 완료되면 SD 카드에 라즈베리파이 OS가 설치가 완료됩니다.

 

 

  이제 완료되면 부트 폴더를 확인할 수 있습니다. 윈도우(Windows) 운영체제에서는 부트 폴더가 자동으로 마운트 되며, 용량이 256MB라고 나오네요. 이제 이러한 부트 폴더에 환경 설정 파일을 넣어서 라즈베리파이가 특정 환경에 맞게 부팅되도록 만들 수 있습니다.

 

 

※ 헤드리스(headless) 서버로 사용하기 ※

 

  Mini HDMI 케이블과 USB OTG 케이블을 가지고 있으신 분들은 직접 모니터와 키보드를 연결하여 사용할 수 있습니다. 다만 그러한 케이블이 없다면 SSH로 라즈베리파이에 접속하여 사용할 수 있습니다. 라즈베리파이에 SSH로 접속하기 위해서는 가장 먼저 boot 폴더에 ssh라는 이름의 파일을 만들어 주어야 합니다. 이로써 라즈베리파이가 부팅될 때 SSH 포트가 열리게 됩니다.

 

 

  또한 라즈베리파이 Zero W가 와이파이(Wi-Fi)를 사용할 수 있도록 하기 위해 와이파이 정보를 기재할 필요가 있습니다. 이를 위해 wpa_supplicant.conf 파일을 생성한 뒤에 메모장으로 열어 내용을 기입합시다. 윈도우(Windows) 운영체제의 경우 단순히 워드패드메모장으로 열어 쓰시면 됩니다.

 

 

  바로 다음의 형식에 맞게 와이파이(Wi-Fi) 정보를 기입하시면 됩니다. 참고로 netsh 명령어를 이용하면 현재 내 컴퓨터나 노트북에 저장되어 있는 와이파이 비밀번호 정보를 알아낼 수 있습니다.

 

country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="SSID"
    psk="비밀번호"
    key_mgmt=WPA-PSK
}

 

  결과적으로 컴퓨터에서 SD 카드를 제거한 뒤에 라즈베리파이에 꽂아서 부팅하시면 됩니다. 파워(power) 케이블을 연결하면 자동으로 부팅이 진행됩니다. 이후에 SSH로 접속하여 사용하면 됩니다. 접속하고자 하는 컴퓨터와 라즈베리파이를 동일 아이피 대역에 둔 뒤에 Advanced IP Scanner와 같은 프로그램을 이용해 라즈베리파이의 IP 주소를 찾아서 접속하면 됩니다. Putty나 XShell 같은 프로그램을 이용해 접속하면 됩니다. 예를 들어 라즈베리파이의 IP 주소가 192.168.43.78로 나온다면 다음과 같이 입력하여 접속할 수 있습니다.

 

 

  기본 설정 그대로 이용할 때 SSH 접속 시 아이디pi이며, 비밀번호raspberry입니다.

 

 

  참고로 WiFi 관련 설정 파일은 SSH 접속 이후에 /etc/wpa_supplicant/wpa_supplicant.conf 파일에서 확인할 수 있습니다. 또한 실제 IP 주소는 ifconfig wlan0 커맨드를 입력해 확인하실 수 있습니다.

 

※ 로컬 SSH로 Raspberry Pi 접속하기 ※

 

  기본적으로 마찬가지로 boot 폴더에 ssh라는 이름의 파일을 생성해 준 뒤에, Raspberry Pi에 SD 카드를 꽂습니다. 그리고 Raspberry Pi 데이터 케이블을 PC에 연결합니다. putty와 같은 유틸리티를 활용하여 pi@raspberrypi.local에 접속합니다.

 

 

  접속이 된다면 성공입니다.

 

※ Serial Gadget을 이용해 Raspberry Pi 접속하기 ※

 

  소정의 이유로 현재 와이파이를 사용할 수 없는 상황일 수 있습니다. 혹은 무선 네트워크의 속도가 너무 느려서 접속이 어려울 수도 있습니다. 이럴 때는 USB OTG 기능을 이용하여 Raspberry Pi에 접속할 수 있습니다. 마찬가지로 SD 카드를 호스트 PC에 연결합니다. 그리고 /boot/config.txt 파일의 마지막 줄에 다음을 추가합니다.

 

dtoverlay=dwc2

 

  이후에 cmdline.txt를 열어서 rootwait 다음 부분에 한 칸(space bar)을 띄고 다음과 같이 작성합니다. g_serial 모듈을 로드(load) 함으로써 Serial 가젯(gadget)을 활성화할 수 있습니다.

 

modules-load=dwc2,g_serial

 

  cmdline.txt의 예시는 다음과 같습니다. 대략 다음과 같이 작성되었는지 확인합니다. 참고로 아래 커맨드는 사용하고 있는 장치마다 조금씩 다를 수 있으며, 필자의 경우 단순히 rootwait 다음에 모듈을 로드하는 내용만 추가했습니다.

 

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_serial quiet init=/usr/lib/raspi-config/init_resize.sh

 

  이제 라즈베리파이를 실행하면 호스트(host) PC에 연결했을 때 정상적으로 COM 포트로 인식하는 것을 알 수 있습니다. 이후에 systemctl 명령어를 이용해 Serial 포트 기능을 활성화해 준 뒤에, 재부팅하고 호스트(host) PC에서 Raspberry Pi에 USB 시리얼로 접속하면 됩니다.

 

※ Raspberry Pi 고정 IP 이용하기 ※

 

  초기 세팅이 끝나고 나면 고정 IP를 이용하는 것이 편합니다. 이를 위해 Raspbery Pi에 접속하여 가장 먼저 DHCPCD가 동작하고 있는지 서비스(service) 상태를 확인합니다.

 

sudo service dhcpcd status

 

  정상적으로 동작하고 있다면, /etc/dhcpcd.conf 파일을 수정합니다. 가장 아랫줄에 다음과 같은 내용을 추가하면 됩니다. 필자의 경우 무선 네트워크를 사용하므로 wlan0으로 설정했습니다.

 

interface wlan0

static ip_address=192.168.0.177/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8

 

  이때 네트워크 환경에 따라서 domain_name_server를 자신의 회사/학교에서 제공하는 IP로 설정해야 할 필요가 있습니다. 필자의 경우 8.8.8.8만 설정했을 때 네트워크가 정상적으로 동작하지 않았습니다. 아무튼 설정 이후에는 재부팅하여 ifconfig를 입력하여 정상적으로 IP가 변경되었는지 확인합니다.

728x90
반응형

728x90
반응형

  Teensy나 라즈베리파이(Raspberry Pi)와 같은 USB 장치에서 별도의 외부 파워(external power)를 이용하는 경우, USB 케이블에서는 전원이 공급되지 않도록 할 필요가 있습니다. 더욱 구체적인 예로 USB OTG 기능(USB 장치 개발 목적)을 이용하여 라즈베리파이를 Mass Storage Class(MSC)로 동작하도록 만들 때 외부 파워를 이용할 수 있는데, 이럴 때는 USB OTG 케이블에서는 전원이 공급되지 않도록 해야 합니다. 그렇지 않으면 디바이스가 고장 날 수 있습니다.

  실제로 USB 개발용 보드를 구매할 때 다음과 같은 경고 문구가 적혀 있는 것을 볼 수 있습니다.


  "WARNING: Reverse polarity power or greater than 6 volts can damage Teensy."

 

  이처럼 소형 보드에서 USB 케이블을 두 개 연결하는 상황(혹은 외부 파워와 USB OTG를 이용하는 상황)에서 우리의 USB 보드를 고장 내지 않기 위한 가장 간단한 방법은 데이터 전송을 위한 USB 케이블에 대하여 빨간색 선(+5V power line)을 잘라서 사용하는 것입니다. 가장 일반적인 형태의 USB 마이크로 케이블은 Standard A를 따르는데요. 바로 다음과 같은 형태로 4개의 선을 이용합니다.

 

 

  각각의 선은 표준에 따라서 그 용도가 정해집니다. 여기에서 빨간색 선+5V 전원 공급용 선입니다.

 


  실제로 선을 자를 때는 가능하면 다음과 같이 선의 방향에 따라서 세로로 칼을 그어 피복을 벗기는 것이 깔끔합니다.

 

  참고로 제 USB 케이블과 같이 일부 USB 케이블에서는 전력 손실 방지 목적으로 알루미늄 실드(foil shield)로 덮여 있는 경우가 있습니다. 혹시 자신이 구매한 USB 케이블에 은박지처럼 생긴 이 알루미늄 실드가 있으면, 마찬가지로 조심히 잘라주세요. 잘못 자르면 안쪽에 있는 케이블까지 잘리게 되면 번거로울 수 있습니다.

 

 

  이렇게 작은 선을 자를 때는 니퍼(nipper)를 이용하면 깔끔하게 자를 수 있습니다. 저는 다음과 같이 빨간색 라인을 제거했습니다.

 

 

  이후에 절연 테이프(이른바 검은 테이프)를 이용해 감싸면 됩니다. 절연 테이프란 이처럼 피복이 벗겨진 부분을 다시 감싸고자 할 때 사용하는 테이프를 말합니다. 결과적으로 USB 데이터 전송 목적(data-only) 케이블이 만들어졌습니다.

 

 

    저는 라즈베리파이(Raspberry Pi) Zero W 모델을 사용하는데, 다음과 같이 USB OTG 포트(port)에 data-only 케이블을 연결하여 사용하고 있습니다. 이렇게 하게 되면 전원이 중복되어 공급되지 않고 안전하게 USB 보드 개발을 진행할 수 있습니다.

 

728x90
반응형

728x90
반응형

  흔히 깃허브(GitHub)에 올라와 있는 다양한 프로젝트에서는 별도의 main.py 소스코드를 정의한 뒤에 인자(argument)를 넘겨 주어서 프로그램을 실행하는 방식을 많이 사용합니다. 이것이 가장 전통적인 방법이기도 하며, 실제로 코드를 이용하는 사람 입장에서는 소스코드를 다운로드 한 뒤에 인자 값과 함께 코드를 실행해야 합니다. 예를 들어 StarGAN공식 GitHub에 적혀 있는 내용을 가져오면 다음과 같습니다.

 

  main.py 코드를 실행하기 위해 매우 많은 인자(argument) 값을 넘겨주어야 오류 없이 실행됩니다.

 

 

  다만 Google Colab과 같이 주피터(Jupyter) 환경에서 직접 main.py의 코드를 수정하면서 실행해보고 싶은 사람은 어떻게 할 수 있을까요? 이럴 때 효과적으로 사용할 수 있는 라이브러리가 SimpleNamespace입니다. SimpleNamespace는 Python 3.3 버전에서 새롭게 표준 라이브러리로 추가되었습니다.

 

  대략 다음과 같이 사용하면 됩니다.

 

# args와 동일한 형태의 데이터 인자를 넘기기 위한 테크닉
from types import SimpleNamespace

args = SimpleNamespace()

args.dataset = "CelebA"
args.selected_attrs = ["Black_Hair", "Blond_Hair", "Brown_Hair", "Male", "Young"]
args.model_save_dir = "stargan_celeba_256/models"
args.num_workers = 1
args.mode = "test"

print("데이터셋:", args.dataset)
print("전체 인자 값:", args)

 

  실행 결과는 다음과 같습니다.

 

728x90
반응형

728x90
반응형

  커널(Kernel)운영체제(OS)에서 가장 코어(핵심) 파트에 해당합니다. 커널은 컴퓨터의 각종 드라이버, 메모리, 프로세스 등을 관리하는 역할을 수행합니다. 일반적으로 배포판으로 제공되는 커널은 이미 일반적인 많은 기능을 포함하고 있기 때문에 일반적인 리눅스 OS 사용자는 커널을 직접 컴파일할 필요가 없습니다.

 

  그래서 어떤 하드웨어를 사용할 때, 우리는 적절한 커널 이미지가 존재하는지 먼저 찾아본 뒤에 이를 그대로 이용합니다. 예를 들어 라즈베리파이(Raspberry Pi)Debian 기반의 OS를 사용할 수 있는데, 라즈베리파이의 부품과 적절히 호환될 수 있는 형태로 커널이 제공됩니다. 정확히는 라즈비안(Raspbian)이라는 이름의 별도의 라즈베리 파이 버전의 OS를 사용하면 됩니다.

 

  하지만 기본적인 커널에서 제공하지 않는 기능을 사용하고 싶을 때나 컴퓨터 부품과 관련하여 바뀐 부분이 있을 때 커널을 변경하여 컴파일해 볼 필요가 있습니다. 혹은 현재 보드에서는 필요 없는 드라이버를 지워서 커널을 최적화하여 부팅 시간을 빠르게 설정할 수 있습니다. 예를 들어 특정한 하드웨어를 관리하기 위한 디바이스 드라이버(device driver)를 작성할 때 커널 모듈 형태로 작성할 수 있습니다. 커널을 변경하기 위한 가장 첫 번째 단계는 커널 소스 코드를 직접 컴파일해 보는 것입니다.

※ 커널의 주요 디렉토리 ※

  ▶ linux/kernel: 커널 핵심 소스 코드

  ▶ linux/include: 커널 소스 코드의 헤더 파일
  ▶ linux/lib: 커널 내부에서 사용되는 함수 라이브러리
  ▶ linux/drivers: 하드웨어 관리 목적의 디바이스 드라이버

 

  기본적으로 최신 버전의 리눅스 커널은 www.kernel.org 경로에서 받을 수 있습니다. 당연히 커널을 컴파일하기 위해서는 컴파일하고자 하는 소스 코드가 필요하기 때문에 이는 기본적인 과정입니다. 2019년 11월 25일에 리눅스 커널(Linux Kernel) 5.4 버전이 출시되었습니다. 2020년 10월 기준으로 Raspberry Pi의 리눅스 커널 기본 버전도 5.4 버전입니다.

 

  라즈비안(Raspbian) 커널(Kernel) 빌드 가이드라인을 보면서 그대로 따라 진행하면 큰 문제 없이 진행할 수 있습니다. 저는 이 중에서 크로스 컴파일(cross compile) 방식을 이용해 실습을 진행했습니다.

 

※ Raspberry Pi 커널 크로스 컴파일 방법

  일반적으로 크로스 컴파일(cross compile)특정한 OS에서 컴파일한 프로그램이 다른 OS에서 돌아가도록 하는 것을 의미합니다. Raspbian은 Ubuntu와 같은 일반적인 리눅스 OS와는 차이가 있습니다. 따라서 Ubuntu OS에서 Raspbian을 컴파일하는 것을 의미한다. 외부 리눅스(Linux) OS 기반의 컴퓨터를 하나 준비합니. 아무튼 별도의 호스트(Host) PC에서 커널을 빌드한 뒤에 Raspberry Pi에 업로드하면 됩니다.

1. 관련 종속성(Dependencies) 및 툴체인(Toolchain) 설치하기

 

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

 

  제 Ubuntu 컴퓨터에는 관련 종속성 라이브러리가 이미 설치되어 있는 상황이라서 다음과 같이 나옵니다.

 

 

2. 32-bit 커널을 위해 32-bit 툴체인을 설치하기

  라즈비안(Raspbian) OS의 경우 기본적으로 32-bit입니다. 따라서 본 예시에서도 32-bit을 이용하겠습니다.

 

sudo apt install crossbuild-essential-armhf

 

  32-bit 툴체인도 이미 설치가 되어있어서 다음과 같이 나오는 것을 확인할 수 있습니다.

 

 

3. 소스 코드 다운로드 받기

 

  이제 라즈비안(Raspbian) OS 소스 코드를 다운로드 받겠습니다.

 

git clone --depth=1 https://github.com/raspberrypi/linux

 

  소스 코드를 확인해 보면 기본적으로 일반적인 Linux와 매우 유사한 구조를 가지고 있습니다. 마찬가지로 kernel 디렉토리, drivers 디렉토리, security 디렉토리 등이 있습니다.

 

 

  실제로 각각의 디렉토리를 직접 확인해 보실 수 있습니다. 예를 들어 각종 드라이버(driver) 관련 소스코드를 확인하고 싶다면 다음의 경로에 들어가시면 됩니다.

 

 

  저는 여기에서 제가 만든 커널이 정상적으로 동작하는지 확인하기 위해 드라이버 코드를 아주 조금 바꾸어 보겠습니다. drivers/usb/gadget/function/f_mass_storage.c는 Mass Stoarge 기능(function)을 위한 소스코드 구현부입니다. 저는 다음과 같이 printk() 명령을 이용하여 간단한 로그를 남길 수 있도록 했습니다.

 

 

4. 소스코드 빌드하기

  Raspberry Pi Zero W의 경우 다음과 같은 명령어로 config 파일을 만들 수 있습니다. 

 

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

 

 

  이후에 실제로 환경설정 파일을 토대로 빌드를 진행합니다. 말 그대로 커널 소스코드를 새롭게 빌드할 수 있는 것입니다. 예를 들어 우리가 직접 새로운 드라이버를 작성하고 싶다면, 드라이버 쪽 코드를 고친 뒤에 커널 소스코드를 빌드하면 그 내용이 적용되는 것입니다.

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

 

  명령어를 입력하면 다음과 같이 실질적으로 빌드가 진행됩니다. 컴퓨터의 성능마다 다를 수 있지만 수십 분 정도의 시간이 소요될 수 있습니다. 한 번 빌드를 수행한 뒤에 코드를 고치고 다시 빌드하는 경우에는 빠릅니다.

 

 

5. SD 카드에 인스톨하기

  커널을 빌드한 후에는 현재 가지고 있는 라즈베리파이(Raspberry Pi)커널을 복사해 모듈을 설치해야 합니다. 일반적으로 Raspberry Pi OS가 설치되어 있는 SD Card를 넣으면 다음과 같은 형태가 됩니다. sdb1FAT 파티션, sdb2ext4 파일시스템(root) 파티션을 의미합니다.

 

sdb
    sdb1
    sdb2

 

  실제 디바이스 이름은 fdisk -l 명령을 이용하여 확인할 수 있도록 합니다.

 

 

  확인해보니 제 SD 카드는 sde라는 이름을 가지네요. 따라서 차례대로 FAT과 ext4 파티션을 각각 마운트합니다.

 

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sde1 mnt/fat32
sudo mount /dev/sde2 mnt/ext4

 

  다음과 같이 별도로 mnt 라는 이름의 폴더를 만들어서 마운트를 진행할 수 있습니다.

 

 

  이후에 df -h 명령을 이용해 용량이 충분한지 체크를 진행해 보겠습니다. 용량은 충분하네요.

 

 

  이제 커널 모듈SD 카드에 설치하면 됩니다. (32-bit) 여기에서 나오는 modules_install은 말 그대로 커널 모듈을 설치하는 명령입니다.

 

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

 

  만들어진 커널 이미지를 SD 카드에 복사할 겁니다. 아무래도 커널 이미지가 정상적으로 동작하지 않을 수도 있으므로 현재 존재하는 커널 이미지를 미리 백업해 둘 필요가 있습니다. (32-bit 기준)

 

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img

 

  주피터 노트북의 경우 환경 변수가 제대로 동작하지 않을 수 있습니다.

 

 

  이후에 SD 카드의 mnt 폴더로 만들어진 커널 이미지를 옮깁니다.

 

sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

 

 

  이후에 언마운트를 진행합니다.

sudo umount mnt/fat32 
sudo umount mnt/ext4

 

 

  이제 SD 카드를 뽑은 뒤에 Raspberry Pi에 꽂아서 부팅합니다. 저는 부팅 이후에 Multi Gadget Driver를 사용하도록 하고, Mass Storage 기능을 활성화하도록 설정했습니다. 이후에 dmesg를 입력했을 때 다음과 같이 로그(log)가 찍혀 있는 것을 확인할 수 있었습니다. 다시 말해 정상적으로 커널 컴파일 및 업로드 완료 된 것입니다.

 

 

※ 커널 소스코드 수정 이후에 다시 빌드하는 방법 ※

 

  결과적으로 커널 소스코드를 수정한 뒤에, 다시 빌드하는 명령어를 요약하자면 다음과 같습니다.

 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs -j8

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sde1 mnt/fat32
sudo mount /dev/sde2 mnt/ext4

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
sudo cp mnt/fat32/kernel.img mnt/fat32/kernel-backup.img

sudo cp arch/arm/boot/zImage mnt/fat32/kernel.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

sudo umount mnt/fat32 
sudo umount mnt/ext4

sync
sync
728x90
반응형

728x90
반응형

  이미지넷(ImageNet) 데이터셋은 MNIST, CIFAR 데이터셋과 더불어 굉장히 유명한 데이터셋이다. 일반적으로 MNIST나 CIFAR는 아이디어에 대한 검증 목적으로 사용한다. 최신 컴퓨팅 장치를 기준으로 보았을 때 데이터셋 자체가 아주 작기 때문에, 어지간한 크기의 뉴럴 네트워크를 이용해도 학습 과정에서 길어야 하루 이내의 시간이 소요되기 때문이다.

 

  ▶ MNIST: 0부터 9까지의 28 x 28 손글씨 사진을 모은 데이터셋 (학습용: 60,000개 / 테스트용: 10,000)

  ▶ CIFAR-10: 10개의 클래스로 구분된 32 x 32 사물 사진을 모은 데이터셋 (학습용: 50,000개 / 테스트용: 10,000개)

 

  다양한 논문에서는 새로운 아이디어에 대한 검증을 위한 목적으로 간단히 MNIST나 CIFAR-10을 이용하곤 한다. 이때 ImageNet을 학습시키기 버거운 경우 CIFAR-100 정도까지의 데이터셋을 이용할 수도 있다. 실제로 대학원 수업 때 과제 목적으로 가장 많이 사용하는 것도 MNIST나 CIFAR-10이다.

 

  반면에 이미지넷(ImageNet)대표적인 대규모(large-scale) 데이터셋이다. 전체 데이터셋에 포함된 이미지만 해도 1,000만 개가 넘는다. 유명한 Amazon Mechanical Turk 서비스를 이용하여 일일이 사람이 분류한 데이터셋이다. 이 데이터셋은 ILSVRC (ImageNet Large Scale Visual Recognition Challenge)로 잘 알려진 국제 대회에서 사용되는 데이터셋으로도 유명하다. 논문에서 가장 자주 등장하는 데이터셋은 ILSVRC 2012 데이터셋이다. 최신 논문도 대개 ILSVRC 2012를 이용해 학습/평가를 진행한다.

 

  사실 일반적으로 딥러닝에 사용되는 데이터셋은 평가(training) / 검증(validation) / 테스트(test) 데이터셋으로 나누어지는데, ILSVRC 2012는 실제 대회에서 사용되었던 데이터셋이며 테스트 데이터셋은 공개하지 않고 있다. 그래서 대개 논문을 쓰기 위한 목적으로는 평가(training) 데이터셋과 검증(validation) 데이터셋을 사용한다.

 

  이 데이터셋은 1,000개의 클래스로 구성되며 총 백만 개가 넘는 데이터를 포함한다. 약 120만 개는 학습(training)에 쓰고, 5만개는 검증(validation)에 쓴다. 학습 데이터셋 용량은 약 138GB, 검증 데이터셋 용량은 약 6GB이다. 특히 분류(classification) 문제에 관심이 있는 딥러닝 연구자라면 대개 이미지넷 데이터셋을 다운로드하는 편이다. 학습 데이터를 확인해 보면 각 클래스당 약 1,000개가량의 사진으로 구성되어 있다.

 

  전체 레이블(label) 이름을 확인하고 싶다면 다음과 같이 이미지넷(ImageNet) 클래스 정보가 기록되어 있는 JSON 파일을 확인하면 된다. 이 경로에서 전체 레이블 정보를 확인할 수 있다. 실제로 파이썬 프로그램상으로도 이 경로에서 JSON 파일을 받아와 사용하는 식으로 사용하곤 한다.

 

 

  ILSVRC 2012를 다운로드하는 방법은 다양하다. 대표적으로 토렌트(torrent)를 이용해서 받을 수 있다. 다음과 같이 학습 데이터셋과 검증(validation) 데이터셋을 다운로드할 수 있고, 이를 이용해 실험을 진행할 수 있다.

 

 

  예를 들어 Validation Set을 다운로드한다면, 다음과 같이 해당 링크로 접속한 뒤에 [Download] 버튼을 눌러서 토렌트(Torrent) 파일을 다운로드 하면 된다. 컴퓨터에 유토렌트(uTorrent)와 같은 프로그램이 설치되어 있다면, 곧바로 다운로드를 진행할 수 있다.

 

 

  실제로 필자는 adversarial attack 관련 연구를 진행하고 있어서 검증(validation) 데이터셋만 있으면 되는 상황이다. 이럴 때는 ILSVRC 2012 Validation Set을 다운로드받으면 된다. 실제로 토렌트를 이용해 받으면 대략 1MB/s ~ 8MB/s 사이의 속도로 다운로드가 진행된다. 데이터셋의 용량이 크기 때문에 넉넉히 기다리는 것이 좋다.

 

 

  필자는 윈도우 환경에서 다운로드를 진행했다. 검증(validation) 데이터셋을 다운로드한 뒤에는 압축 파일을 확인해 보자. 총 50,000개의 데이터가 존재하는 것을 확인할 수 있다. 확인해 보면 단순히 이미지 파일만 존재하는 것을 알 수 있다. 따라서 약간의 전처리가 필요하다.

 

 

  압축을 풀어보자. 그러면 다음과 같은 전체 검증용 사진을 확인할 수 있다.

 

 

  이미 다른 사람이 검증(validation)용 데이터를 정리하는 방법을 제안하고 있다. 이 경로에서 쉘 스크립트를 다운로드하자. 쉘 스크립트(.sh)를 실행하면 모든 이미지를 폴더별로 정리한다. 가장 먼저 압축 해제한 폴더에 스크립트 파일이 저장될 수 있도록 하자. 필자의 경우 script.sh 라는 이름으로 스크립트 파일을 만들었다. 참고로 윈도우(Windows) OS에서 쉘 스크립트를 실행하려면 bash 모드로 들어간 뒤에 리눅스 명령을 입력하면 된다. 다음과 같이 스크립트를 실행하자. 스크립트를 실행하면 모든 이미지가 처리될 때까지 최대 2시간까지의 시간이 소요될 수 있다.

 

 

  쉘 스크립트가 완전히 실행된 뒤에는 다음과 같이 50,000개의 검증용 데이터셋이 총 1,000개의 클래스(폴더)에 분리되어 저장된다. 폴더 번호가 낮은 것부터 차례대로 인덱스가 부여되는 것이다. 다만 폴더의 이름이 약간 어색하게 느껴질 수 있다. 폴더명에 따른 실제 클래스 이름은 다음의 경로에 기록되어 있다. 실제로 이 JSON 파일을 이용하여 구분할 수 있다. 예를 들어 19번째 폴더인 n01582220 폴더는 까치(magpie)를 의미한다.

 

 

  더불어 혹시나 n으로 시작하지 않는 폴더가 존재한다면 해당 폴더는 제거할 수 있도록 하자. 파이썬 상에서 실제로 학습 및 평가를 진행할 때에도 이러한 폴더 구조를 그대로 따르기 때문에, 규칙에 맞지 않는 폴더가 존재한다면 오류가 발생할 수 있다. 필자의 경우 script.sh 파일이 남아 있어서 이를 삭제했다.

 

 

  또한 참고로 필자의 경우 각 클래스(class)마다 5개의 validation 이미지가 필요했다. 따라서 다음과 같은 코드를 추가적으로 실행했다. 이러한 코드를 실행하면 각 클래스마다 이미지를 5개만 남기고, 폴더명을 차례대로 0부터 999까지 할당해준다.

 

import os
import json


def get_list(path):
    return os.listdir(path)


def rename_directory(root_path, directory, targets):
    source = os.path.join(root_path, directory)
    target = os.path.join(root_path, targets[directory])
    os.rename(source, target)


def remove_files(root_path, directory, n_remained):
    files = get_list(os.path.join(root_path, directory))
    files = files[n_remained:]
    for file_name in files:
        os.remove(os.path.join(root_path, directory, file_name))


# Run the program
root_path = './ILSVRC2012_img_val'
with open('./imagenet_class_index.json') as f:
    json_data = json.load(f)
targets = {}
for key in json_data.keys():
    targets[json_data[key][0]] = key

directories = get_list(root_path)
for directory in directories:
    remove_files(root_path, directory, 5)
for directory in directories:
    rename_directory(root_path, directory, targets)

 

  필자는 결과적으로 다음과 같은 데이터를 얻을 수 있었다.

 

728x90
반응형

728x90
반응형

  Xmanager를 사용하고 있는 상황에서 어느 날부터 모르는 임의의 호스트가 연결을 시도한다. 이는 해킹 시도인데, 그냥 인증되지 않은 클라이언트로부터의 연결은 무시하도록 하는 것이 좋다.

 

 

  Xconfig를 실행하여 XDMCP 부분을 더블 클릭한다.

 

 

  이후에 [보안] 탭에서 [허가되지 않은 연결 경고(W)]를 체크 해제하자. 그러면 신뢰할 수 있는 호스트가 아니라면 접근 제어가 작동하는 모든 X 응용프로그램의 접속은 거부된다.

 

 

  ▶ 출처

728x90
반응형

728x90
반응형

  Cisco 회사의 웹엑스(WebEx)화상회의 목적의 소프트웨어다. 화상회의 소프트웨어로 유명한 줌(Zoom)과 자주 비교되는 프로그램이기도 하며, 널리 사용되고 있는 프로그램이다. 필자도 강의 목적으로 웹엑스(WebEx)를 사용해 본 적이 있다. 또한 무료 버전을 사용해도 최대 100명이 참가할 수 있고, 최대 50분 동안 지속이 가능하기 때문에 일반적으로 학생들이 팀 미팅 목적으로도 웹엑스를 매우 효과적으로 사용할 수 있다.

 

  ▶ 웹엑스(WebEx) 다운로드: www.webex.com/downloads.html

 

  웹엑스는 공식 다운로드 사이트에 접속하여 다운로드할 수 있다. 일반적인 경우 웹엑스 미팅(WebEx Meetings) 프로그램을 사용한다. 접속하면 자동으로 자신의 운영체제 맞는 설치 프로그램을 추천해준다. 필자의 경우 윈도우(Windows) 운영체제를 쓰고 있기 때문에, 다음과 같이 [Download for Windows] 버튼이 등장한다. 이를 눌러 다운로드를 진행할 수 있다.

 

 

  설치 프로그램이 실행되면 [다음] 버튼을 눌러서 다운로드를 진행한다.

 

 

    라이센스에 동의하고 넘어간다.

 

 

  이후에 [설치] 버튼을 눌러서 실제로 프로그램 설치를 진행한다.

 

 

  그러면 다음과 같이 실제로 설치가 진행된다.

 

 

  설치가 모두 이루어진 이후에는 [완료] 버튼을 눌러 프로그램을 닫아준다.

 

 

  설치가 끝나면 다음과 같이 로그인 이후에 사용이 가능하다.

 

 

※ 호스트 운영 관련 팁 ※

 

  호스트(Host)는 방을 만들어 운영하는 사람을 의미한다. 호스트 입장에서 방을 개설한 뒤에 미팅을 진행할 때는 몇 가지 알아 두면 좋은 팁이 있다. 미팅이 시작된 이후에 [참가자] 탭에서 [참여시 자동 음소거]에 체크를 진행하는 것이 좋다. (특히 강의 목적으로 사용할 때) 그렇지 않으면 마이크가 있는 사용자들은 자동으로 목소리가 들리게 된다. 그리고 [들어올 때와 나갈 때 발신음]체크 해제를 하도록 하자. 미팅 진행 중에 발신음이 들리면 신경 쓰일 수 있기 때문이다.

 

 

  또한 미팅 진행 중에 화면을 공유하고 싶다면 [공유] 버튼을 눌러서 화면 공유를 진행할 수 있다.

 

 

  이후에 참가자 명단채팅창 내용을 보고 싶다면 오른쪽 아래 버튼을 클릭하면 된다.

 

728x90
반응형

728x90
반응형

  일반적으로 노트북이나 컴퓨터를 이용해 와이파이(WiFi)를 이용하곤 한다. 하지만 예전에 와이파이를 사용할 때 입력했던 비밀번호를 까먹었다면 어떻게 해야 할까? 이번 포스팅에서는 netsh 유틸리티(utility)를 이용해 내 컴퓨터에 저장된 와이파이로부터 비밀번호를 찾는 방법을 알아보자.

 

  윈도우(Windows) 운영체제는 기본적으로 netsh 유틸리티(utility)를 제공한다. 이러한 netsh 명령어를 이용해 네트워크 설정을 변경할 수 있다. 굳이 제어판에 접속하지 않아도 커맨드 명령을 이용해 네트워크 설정이 가능하다는 점은 장점이다. netsh 유틸리티는 현재 컴퓨터나 노트북에 기록되어 있는 와이파이 정보를 보여준다.

 

  CMD에서 netsh wlan show profile을 입력해보자. 참고로 WLAN이란 무선 랜(Wireless LAN)을 의미한다. 다시 말해 현재 저장된 와이파이(WiFi)의 프로필들을 모두 출력하게 된다. 실행 결과는 다음과 같다.

 

 

  이때 SSIDService Set IDentifier의 약자로, 간단히 말하면 와이파이 네트워크의 이름을 의미한다. 자신이 비밀번호를 알고자 하는 와이파이의 SSID를 입력하여 비밀번호를 찾을 수 있다. 명령어는 다음과 같다.

 

  netsh wlan show profile "SSID 이름" key=clear

 

  예를 들어 SSID가 HPC_WLAN이라면 다음 그림과 같이 입력하면 된다.

 

 

  이때 출력되는 정보 중에서 [보안 설정] 탭의 키 콘텐츠 부분에서 비밀번호를 찾을 수 있다.

 

728x90
반응형

728x90
반응형

  백준 사이트에서 문제 난이도 보는 방법은 다음과 같습니다. 먼저 [설정] 탭으로 이동합니다.

 

 

  이후에 [solved.ac] 탭에서 [사용하기] 버튼을 눌러서 백준 온라인 저지에서 문제에 대한 난이도를 바로 확인 가능합니다.

 

 

  이어서 [문제 보기 설정] 탭으로 이동하여 solved.ac 티어란에서 [보기]를 체크하면 됩니다.

 

 

  또한 유저별로 랭킹을 보기 위해서는 solved.ac에 방문하시면 됩니다.

 

 

solved.ac

우리 모두가 만들어가는알고리즘 문제해결 학습의 이정표 solved.ac는 Baekjoon Online Judge 문제들에 태그와 난이도를 붙이는 커뮤니티 프로젝트입니다. 현재 10,475개 문제에 난이도 정보를 제공하고 �

solved.ac

 

  검색 버튼을 누른 뒤에 유저, 문제, 태그 등의 키워드로 검색할 수 있습니다.

 

 

 

  저는 다음과 같이 제가 출제했던 [함께 블록 쌓기] 문제를 검색해 보았습니다.

 

 

  검색 이후에 해당 문제로 들어가서 문제를 확인할 수 있습니다.

 

728x90
반응형

728x90
반응형

피보나치 수: 0 1 1 2 3 5 8 13 21 ...

 

<문제> 피보나치 수가 n 자릿수 이상이 되기 위한 가장 작은 인덱스를 구해보자. 예를 들어 n = 1이면 답은 0이다. n = 2이면 답은 7이다.

 

<답안 예시>

 

def fibonacciIndex(n):
    result = 0
    if n == 1:
        return result

    a = 0
    b = 1
    while a < (10 ** (n - 1)):
        c = a + b
        a = b
        b = c
        result += 1

    return result
728x90
반응형