안경잡이개발자

728x90
반응형

  얼굴 성별 분류(face gender classification) 데이터셋은 캐글(Kaggle)에서 다운로드 가능하다.

 

  ▶ 학습 데이터셋 개수: 남성/여성 각각 23,000개씩

  ▶ 평가 데이터셋 개수: 남성/여성 각각 5,500개씩

 

  실제 용량은 약 280MB 정도이며, 전체 데이터셋에 포함된 이미지는 60,000개가 조금 안 된다. 각각 이미지 크기는 실제로 열어 보면 약 100 X 100 정도의 해상도(resolution)로 구성된 것을 알 수 있다.

 

  ※ 얼굴 성별 분류 데이터셋: www.kaggle.com/cashutosh/gender-classification-dataset

 

Gender Classification Dataset

Male Female image dataset

www.kaggle.com

 

  접속 이후에 [Download] 버튼을 눌러서 다운로드를 진행할 수 있다.

 

728x90
반응형

728x90
반응형

  CelebA 데이터셋은 대표적인 얼굴(face) 데이터셋이다. 이때 CelebA 데이터셋은 약 200,000개 정도의 얼굴 이미지로 구성된다. 기본적으로 10,000명가량의 사람이 포함되어 있다. 즉, 한 명당 20장 정도의 이미지가 있다고 보면 된다. 각 이미지는 178 x 218 해상도로 존재한다.

 

  각 얼굴에 대해서는 40개의 이진 레이블(binary label)이 있다. 이때 각 얼굴에 대하여 다음과 같은 레이블이 각각 0 혹은 1의 값으로 붙어있다. 확인해 보면 젊은(young), 남성(male), 대머리(bald) 등의 예시가 붙어 있다.

 

  예를 들어 데이터셋 중에서 000025.jpg 사진은 다음과 같다.

 

 

  이 사진에 붙어 있는 레이블을 간단히 확인해 보면 다음과 같은 것을 알 수 있다.

 

대머리(Bale): -1, 큰 코(Big_Nose): 1, 남자(Male): 1, 웃는(Smiling): -1, 젊은(Young): 1

 

  캐글(Kaggle) 사이트에 방문해서 다운로드할 수 있다.

 

  ▶ CelebA 데이터셋: www.kaggle.com/jessicali9530/celeba-dataset

 

CelebFaces Attributes (CelebA) Dataset

Over 200k images of celebrities with 40 binary attribute annotations

www.kaggle.com

 

  사이트에 방문한 뒤에 [Download] 버튼을 누르면 다운로드할 수 있다.

 

 

  용량은 대략 1.4 GB 정도다.

 

728x90
반응형

728x90
반응형

  ResNet과 같이 배치 정규화(batch normalization)를 포함하고 있는 네트워크를 특징 추출기(feature extractor)로 사용할 때 유의해야 할 점이 있다. 별로 중요하지 않은 것처럼 보여도, 실제로 모델을 만드는 입장에서 제대로 이해하고 있지 않으면 많이 헤맬 수 있는 부분이다.

 

  1. 학습 모드(training mode)와 평가 모드(evaluation mode)일 때 추출되는 특징 맵(feature map)이 다르다는 점

 

  기본적으로 배치 정규화는 학습 시 사용하는 파라미터와 평가 시 사용하는 파라미터가 다르게 적용된다. 따라서 만약 batch normalization을 포함한 네트워크를 feature extractor로 사용하고자 한다면, 같은 이미지에 대해 매번 동일한 특징 맵이 추출될 수 있도록 하기 위해 항상 train() 모드로 사용하거나 항상 eval() 모드로 사용하는 식으로 일관적일 필요가 있다. 일반적인 목적의 특징 추출기로 사용한다면 eval() 모드로만 사용하는 것을 추천한다. (학습할 때 train(), 평가할 때 eval()을 사용하는 것도 일반적인 분류 모델 학습 목적이라면 성능에 문제가 없다.)

 

  전이 학습(transfer learning)을 수행할 때 ResNet 기반의 고정된 특징 추출기가 필요하다면, conv 레이어 부분을 eval() 모드로 사용하면 된다. 만약 이를 지키지 않고 일관적이지 않게 train()과 eval()을 번갈아 호출하게 된다면, 동일한 이미지에 대하여 추출되는 feature maps이 매번 다른 값을 가질 수 있다. 앞서 언급했듯이 일반적인 분류 문제에서는 이게 큰 이슈가 되지 않는다. 다만 동일 이미지에 대한 feature maps가 항상 같아야 되는 경우에는 문제가 된다.

 

  2. 다른 네트워크를 포함한 네트워크에서 train()이나 eval()을 사용하는 경우

 

  필요한 경우 특징 추출기(feature extractor)를 포함한 하나의 네트워크 자체를 새롭게 정의할 수 있다. 이는 학습 코드 구현상의 편리성을 주는 경우가 많기 때문에, 종종 볼 수 있는 코드 유형이다. 예를 들어 ResNet18 모델의 앞부분은 고정한(fixed) 상태로 뒤쪽 FC 레이어만 새롭게 교체하여 학습하는 전이 학습(transfer learning) 방법을 사용할 수 있다. 소스코드 예시는 다음과 같다.

 

class StudentNetwork(nn.Module):
    def __init__(self):
        super(StudentNetwork, self).__init__()

        self.feature_extractor = nn.Sequential(*list(models.resnet18(pretrained=True).children())[:-1]).eval()
        self.fc = nn.Linear(512, 2) # binary classification (num_of_class == 2)

        # fix the pre-trained network
        for param in self.feature_extractor.parameters():
            param.requires_grad = False

    def forward(self, images):
        features = self.feature_extractor(images)
        x = torch.flatten(features, 1)
        outputs = self.fc(x)
        return features, outputs

 

  만약 위와 같이 모델을 정의했다면, 특징 추출기(feature extractor)는 항상 eval() 모드로 수행되는 것이다. 따라서 StudentNetwork 클래스의 인스턴스에 대하여 별도로 train()이나 eval()을 호출할 필요가 없다. 그냥 학습 단계든 평가 단계든 그 단계(phase)에 상관없이 그대로 사용하면 된다. 그러면 동일한 이미지에 대하여 항상 같은 features가 반환된다.

 

  위와 같이 ResNet 기반의 특징 추출기를 내부적으로 포함하고 있는 하나의 모델 인스턴스 model을 초기화한 경우를 생각해보자. 만약에 이때 model.train()을 호출하면 내부에 포함된 ResNet에 대해서도 학습 모드(train mode)가 적용되기 때문에, 의도치 않게 특징 추출기에 영향을 미칠 수 있다. 이 경우 동일한 이미지에 대하여 forward()의 결과인 features 텐서 값이 변경될 수 있는 것이다. 이 부분은 특히나 실수하기 쉬운 부분이므로 유의하자. 

 

  [참고] PyTorch에서 모델을 초기화하면 기본 설정으로 requires_grad 값이 True가 된다. (이는 사전 학습된 네트워크를 불러올 때에도 마찬가지다!) 따라서 별도로 명시하지 않는다면 자동으로 기울기(gradient)를 추적하기 때문에, 학습하지 않고자 하는 레이어에 대해서는 requires_grad 값을 명시적으로 False로 설정할 필요가 있다.

728x90
반응형

728x90
반응형

  파이토치(PyTorch)의 공식 문서에서 전이 학습(transfer learning)에 관해 설명하고 있는 문서는 다음과 같다.

 

  ▶ PyTorch Transfer Learningpytorch.org/tutorials/beginner/transfer_learning_tutorial.html

 

Transfer Learning for Computer Vision Tutorial — PyTorch Tutorials 1.7.1 documentation

Note Click here to download the full example code Transfer Learning for Computer Vision Tutorial Author: Sasank Chilamkurthy In this tutorial, you will learn how to train a convolutional neural network for image classification using transfer learning. You

pytorch.org

  공식 문서에서는 전이 학습(transfer learning)의 대표적인 두 가지 시나리오를 언급한다.

 

  1. 전체 네트워크를 fine-tuning 하는 방식

  2. 사전학습된(pre-trained) 네트워크를 고정된 특징 추출기(fixed feature extractor)로 사용하는 방식

 

  여기에서 1번과 2번의 실제 구현상의 차이점은 사전학습된 네트워크에 대하여 다음의 코드 부분을 넣느냐 마느냐이다. 아래 코드는 사전학습된(pre-trained) 네트워크의 가중치를 고정할 때 사용하는 코드이다.

 

for param in model_conv.parameters():
    param.requires_grad = False

 

  만약 2번 방식(fixed feature extractor)대로 사전학습된 네트워크의 가중치를 특징 추출기로 고정한다면, 뒤쪽에 있는 FC 레이어만 업데이트가 될 것이다. 또한 이 경우에는 앞쪽 레이어에 대한 기울기(gradient)를 계산하지 않아도 되기 때문에 학습 속도가 빨라진다. 참고로 2번의 방식을 사용하는 경우 optimizer에서는 FC 레이어의 파라미터에 대해서만 업데이트한다고 명시해야 한다. (optimizer는 계산된 기울기(gradient)를 이용해 업데이트(update)를 수행한다.)

 

  [참고 1] requires_grad를 False로 설정한 레이어에 대하여 optimizer에서 업데이트를 하겠다고 명시하더라도, 어차피 구해진 gradient 값 자체가 없기 때문에 업데이트가 수행되지 않기는 한다.

 

  [참고 2] PyTorch에서 모델을 초기화하면 기본 설정으로 requires_grad 값이 True가 된다. (이는 사전 학습된 네트워크를 불러올 때에도 마찬가지다!) 따라서 별도로 명시하지 않는다면 자동으로 기울기(gradient)를 추적하기 때문에, 학습하지 않고자 하는 레이어에 대해서는 requires_grad 값을 명시적으로 False로 설정할 필요가 있다.

 

  다만 공식 문서에서는 간단한 이진 분류(binary classification) 예시를 들고 있기 때문에 1번과 2번의 성능 차이가 크게 나지 않으며, 디테일한 하이퍼 파라미터 세팅을 하지 않아도 높은 성능이 나온다. 하지만 실제로 CIFAR-10과 같이 클래스의 개수가 많은 데이터셋을 이용하는 경우에는 성능 차이가 크게 날 수 있다.

 

  필자의 경우 클래스가 3개인 경우, 클래스가 10개인 경우에 대하여 학습을 진행해 보았다. 이때 2번 방법대로 마지막 FC 레이어만 학습하도록 한 경우에는 학습이 정상적으로 수행되지 않았다. 하이퍼 파라미터 세팅에 많은 신경을 써야 하는 것으로 보인다. 따라서 클래스의 개수가 많은 상황에서 빠르게 높은 정확도(high accuracy)를 얻고 싶다면 1번의 방법대로 앞쪽 네트워크를 고정하지 않고 전체 네트워크를 fine-tuning 하는 것이 유리할 수 있다.

 

  예를 들어 필자의 경우 CIFAR-10에 대하여 전이 학습(transfer learning)을 수행한 경험이 있는데, 다른 코드 부분은 완전히 동일하게 유지한 상태로 한 번은 다음과 같은 코드를 사용했다.

 

net = torchvision.models.resnet18(pretrained=True)

# 마지막 레이어의 차원을 10차원으로 조절
num_features = net.fc.in_features
net.fc = nn.Linear(num_features, 10)
net = net.to(device)

 

  그리고 한 번은 다음과 같은 코드를 사용했다.

 

net = torchvision.models.resnet18(pretrained=True)
for param in net.parameters():
    param.requires_grad = False

# 마지막 레이어의 차원을 10차원으로 조절
num_features = net.fc.in_features
net.fc = nn.Linear(num_features, 10)
net = net.to(device)

 

  첫째 경우(fine-tuning)에는 한 번의 epoch만으로 순식간에 94% 정도의 test accuracy를 얻을 수 있었지만, 둘째 경우(fixed feature extractor)에는 여러 번의 epoch을 반복해도 90% 이상의 성능은 얻을 수 없었다. 다시 말해 2번 방법이 학습 속도 측면에서 유리할 수 있으나, 클래스가 많은 상황에서는 성능이 낮게 나오는 문제가 발생할 수 있다.

 

  [참고] 이 문제는 해외 기술 블로그에서도 자주 다루어지고 있는 내용이다. 정리하자면 다음과 같다.

 

  ① Frozen: 앞쪽의 특징 추출기(feature extractor)에 대하여 역전파를 수행하지 않는 방법이다. 일반적으로 목표 작업(target task)의 레이블(label) 수가 적고 오버피팅(overfitting)을 예방하기 위한 목적으로 사용된다.

  ② Fine-tuning: 앞쪽의 특징 추출기(feature extractor)에 대하여 역전파를 수행하는 방법이다. 일반적으로 목표 작업(target task)의 레이블(label) 수가 많을 때 사용한다.

728x90
반응형

728x90
반응형

  간단한 강아지/고양이 분류 데이터셋을 소개한다. 캐글(Kaggle)에 업로드된 데이터셋이며, 강아지와 고양이 사진이 한가득 존재한다. 이진 분류(binary classification) 작업을 수행하기에 적합하다.

 

  학습 데이터와 테스트 데이터는 8:2로 적절하게 구분되어 있다.

 

  1. 학습 데이터: 강아지 4,000장 / 고양이 4,000장

  2. 테스트 데이터: 강아지 1,000장 / 고양이 1,000장

 

  데이터는 다음의 경로에서 다운로드할 수 있다.

 

  ▶ Cat and Dog 데이터셋: www.kaggle.com/tongpython/cat-and-dog

 

Cat and Dog

Cats and Dogs dataset to train a DL model

www.kaggle.com

 

  아래와 같이 [Download] 버튼을 눌러 다운로드하면 된다.

 

 

  예를 들어 학습 데이터셋의 고양이 이미지는 다음과 같이 다양한 해상도와 종류로 존재하는 것을 알 수 있다.

 

728x90
반응형

728x90
반응형

  세계적으로 매우 많은 얼굴 데이터셋이 존재합니다. 오늘은 그중에서 PubFig라는 이름을 가지고 있는 두 개의 데이터셋을 소개하고자 합니다. 바로 PubFig와 PubFig83인데요. 재미있게도 이 두 개의 데이터셋은 이름은 같지만 서로 다른 데이터셋입니다.

 

1. PubFig (Public Figures Face Database)

 

  PubFig 데이터셋은 200명에 대한 총 60,000개의 얼굴 이미지로 구성됩니다. 장면이나 포즈가 통제된(controlled) 상태가 아니고, 완전히 다양한 상황에서의 사진으로 구성되어 있습니다. 그런 측면에서 LFW (Labeled Faces in the Wild) 데이터셋과 유사합니다. 그래도 LFW에 비하면 사람당(클래스당) 이미지가 훨씬 많은 편입니다.

 

  PubFig 데이터셋은 콜롬비아 대학교에서 배포하였으며, 다음의 경로에서 확인 가능합니다.

 

  ▶ 공식 사이트: www.cs.columbia.edu/CAVE/databases/pubfig/

 

Pubfig: Public Figures Face Database

Introduction The PubFig database is a large, real-world face dataset consisting of 58,797 images of 200 people collected from the internet. Unlike most other existing face datasets, these images are taken in completely uncontrolled situations with non-coop

www.cs.columbia.edu

 

  이 데이터셋의 아쉬운 점은 URL 정보만 알려주고, 다운로드는 개발자가 직접하는 방식이라는 점입니다. 특히나 이미 시간이 오래 지나서 접근이 불가능한 이미지 경로가 많습니다. 다음과 같이 직접 URL에 접근해야 합니다.

 

 

2. PubFig83 (A resource for studying face recognition in personal photo collections)

 

  PubFig83 데이터셋은 83명에 대한 만 개가량의 이미지로 구성됩니다. 참고로 PugFig83 데이터셋에 등장하는 사람은 대체로 유명인(celebrity)입니다. 예를 들어 윌 스미스(Will Smith), 휴 잭맨(Hugh Jackman)과 같은 사람의 이미지가 들어 있습니다. 

 

  PubFig83 데이터셋은 하버드 대학교에서 배포하였으며, 다음의 경로에서 확인 가능합니다.

 

  ▶ 공식 사이트: vision.seas.harvard.edu/pubfig83/

 

PubFig83

PubFig83: A resource for studying face recognition in personal photo collections   This is a downloadable dataset of 8300 cropped facial images, made up of 100 images for each of 83 public figures. It was derived from the list of URLs compiled by Neeraj K

vision.seas.harvard.edu

 

  이미지 파일을 다운로드해서 열어 보니 100 x 100 크기로 잘라진(croppe) 이미지 파일 형태로 존재하네요.

 

728x90
반응형

728x90
반응형

  리눅스에서는 USB Gadget 목적으로 사용할 수 있는  usb_f_gser.ko 리눅스 커널 모듈을 제공한다. 이는 단순히 하나의 Bulk Transfer를 기반으로 하는 Interface를 생성할 수 있도록 해준다. 사실 일반적으로 Serial 통신을 사용다고 하면 CDC(Communication Device Class)를 이용하는데, 이러한 CDC는 ACM, OBEX 등 다양한 서브 클래스를 가진다. CDC는 시리얼 통신을 기반으로 동작하는데, 비단 Serial 뿐 아니라 Ethernet 등의 기능도 제공할 수 있도록 한다.

 

  하지만 만약에 그냥 Raw Bulk Transfer를 이용하는 인터페이스를 이용하고자 한다면 기본적인 Serial Function인 usb_f_gser.ko를 이용하면 된다. 예를 들어 자신이 직접 USB 장치를 만들고, 필요하다면 호스트 쪽 드라이버를 직접 작성하고자 한다면 이것이 좋은 선택이 될 수 있다.

 

※ USB Configuration 파일 생성 ※

 

  간단히 USB Configuration 파일을 생성해보자. 단순히 두 개의 Bulk Transfer를 정의한 상태이다. 필자는 /usr/bin/my_usb라는 경로에 해당 설정 파일을 만들었고, chmod 명령어로 실행 권한을 부여했다.

 

#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p my_usb
cd my_usb

# 기본적인 USB 클래스 명시
echo 0x1D6B > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB 2.0

# 내가 만들 USB 장치의 기본적인 이름
mkdir -p strings/0x409
echo "0123456789abcdef" > strings/0x409/serialnumber
echo "Dongbin Na" > strings/0x409/manufacturer
echo "My USB" > strings/0x409/product

# 하나의 Configuration 정보 작성
mkdir -p configs/c.1/strings/0x409
echo "My USB Config 1" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower

################# Bulk Transfer 1 #################
mkdir -p functions/gser.usb0
ln -s functions/gser.usb0 configs/c.1/

################# Bulk Transfer 2 #################
mkdir -p functions/gser.usb1
ln -s functions/gser.usb1 configs/c.1/

# UDC (Usb Device Controller)
ls /sys/class/udc > UDC

 

  이후에 해당 환경 파일을 실행하면, Rapsberry Pi Zero W가 2개의 Bulk Transfer 통신 기능을 가지는 기기로 동작한다. 다만 CDC ACM과 같이 이미 잘 알려진 클래스를 사용하는 것이 아니기 때문에 다음과 같이 "드라이버를 찾을 수 없다"는 메시지가 출력되는 것을 확인할 수 있다.

 

 

  물론 이처럼 드라이버를 찾을 수 없다고 출력이 되더라도 USB Descriptor는 정상적으로 전달이 되기 때문에, 호스트(Host) PC 입장에서는 해당 Bulk Transfer의 엔드포인트(endpoint)에 접근할 수 있다. 실제로 USB Descriptor를 확인할 수 있는 프로그램을 사용하여 정보를 출력하면 다음과 같이 나온다. 이때 윈도우(Windows)의 Thesycon USB Descriptor Dumper를 사용하거나, 우분투(Ubuntu)의 lsusb 명령어를 사용할 수 있다.

 

  확인 결과 2개의 인터페이스(Interface)가 존재하며, 필요한 최소한의 엔드포인트만을 가지고 있는 것을 알 수 있다. 참고로 CDC ACM과 같은 클래스는 단순히 Bulk Transfer만 가지고 있는 것이 아니며, 더 많은 기능을 포함하고 있어서 엔드포인트(endpoint)가 더 많이 붙어 있다.  아무튼 Interface Descriptor를 출력한 결과는 다음과 같다.

 

 

※ Device 프로그램 ※

 

  Device 쪽 프로그램에서는 단순히 데이터를 읽어 올 때는 cat /dev/{장치명}을 하고, 데이터를 출력할 때는 echo를 이용해 /dev/{장치명}에 데이터를 쓰면 된다. 참고로 단순히 데이터를 보내게 되면 개행 문자가 자동으로 치환되어서 raw 데이터가 잘 안 보내질 수 있다. 따라서 다음의 명령어를 먼저 실행해준다.

 

sudo stty -F /dev/ttyGS1 raw
sudo stty -F /dev/ttyGS2 raw

 

  매번 다음의 명령어를 실행해주지 않는다면, 호스트(Host) PC에서 개행문자를 포함할 때에만 정상적으로 데이터가 전송된다. 따라서 이를 참고하자.

728x90
반응형

728x90
반응형

※ 나의 주식 계좌 확인하는 방법 ※

 

  영웅문 HTS를 실행한 뒤에, [주식주문] - [주식종합] 페이지로 이동하면 나의 주식 계좌 목록을 확인할 수 있다. 일반적인 [위탁종합] 계좌인 경우 8자리 계좌번호XXXX-XXXX로 구성된다.

 

 

※ 주식 계좌에 돈 입금하는 방법 ※

 

  키움증권 주식 계좌를 만든 뒤에, 해당 주식 계좌 번호로 돈을 입금하면, 주식 투자를 할 수 있게 된다. 그냥 키움증권 계좌번호로 입금하면 된다. 정확히는 일반적으로 은행 앱에서 키움증권으로 입금할 때는 [증권사] - [키움증권]을 선택한 뒤에 자신의 주식 계좌로 돈을 입금하면 된다. 필자의 경우 NH은행 앱을 이용해 입금했다. 입금을 완료한 뒤에는 영웅문HTS 프로그램에서 [주식주문] - [계좌정보] - [실시간 잔고] 창을 열어 정상적으로 예수금이 입금되었는지 확인할 수 있다. 

 

 

※ 주식 계좌에서 돈 출금하는 방법 ※

 

  개인적으로 영웅문 프로그램은 기능이 너무 많아서 헷갈린다. 주식계좌에 있는 돈을 출금하고 싶은데, 출금 기능을 찾지 못해서 헤맸다. 자신의 주식계좌에 있는 돈을 꺼내고 싶다면 [온라인업무] - [인터넷뱅킹] - [즉시이체출금]으로 들어가면 된다.

 

 

  이후에 받을 계좌번호를 입력하고 [이체실행]을 눌러 이체를 진행하면 된다.

 

 

  (참고) 필자의 경우 딱히 OTP가 필요하거나 그렇지 않았다. [이체실행] 버튼을 누르면 다음과 같이 이체 확인 페이지가 등장하는데, [확인] 버튼을 눌러서 이체를 진행하면 된다.

 

 

  이후에 다음과 같이 인증서 비밀번호를 입력하면 이체가 완료된다.

 

 

  나중에 출금 결과를 조회하고 싶다면 [온라인업무] - [인터넷뱅킹] - [즉시이체출금결과조회]로 들어가면 된다. 여기에서 비밀번호 및 적절한 조회기간을 입력하면 다음과 같이 언제, 어디로, 얼마를 출금했는지 확인할 수 있다. 기본적으로 늦은 저녁에도(정해진 특정 시간대를 제외하고) 출금(이체)이 가능하기 때문에, 사실상 원할 때 출금할 수 있다.

 

728x90
반응형

File Storage Gadget

기타2021. 2. 22. 22:18
728x90
반응형

  FSGFile Storage Gadget의 약자이다. 리눅스(Linux) 기반 장치에서 Mass Storage Gadget(MSG) 클래스의 기능을 제공하기 위해 FSG를 사용할 수 있다.  자세한 내용은 커널 공식 문서를 참고할 수 있다. 기본적으로 FSG는 USB 스펙에서 bulk-in과 bulk-out 엔드포인트를 필요로 하고, 별도의 블록 장치(block device)를 만든 뒤에 이를 특정한 LUN에 적용하여 사용할 수 있다. 이때 LUN(Logical Unit Number)이란 각각의 논리 장치(저장 장치)를 식별하기 위해 사용하는 번호를 의미한다.

 

  기본적으로 Mass Storage Gadget의 구현은 커널의 drivers/usb/gadget/function/f_mass_storage.c에서 확인할 수 있다. (참고: elixir.bootlin.com/linux/latest/source/drivers/usb/gadget/function/f_mass_storage.c) 참고로 여기에서 커널 모듈을 불러오기 위한 파라미터는 fsg_config_from_params 함수 내부에서 확인할 수 있다.

 

  하나의 FSG는 여러 개의 LUN을 가질 수 있으며, 하나의 LUN은 다음과 같이 정의된다.

 

struct fsg_lun_config {
	const char *filename;
	char ro;
	char removable;
	char cdrom;
	char nofua;
	char inquiry_string[INQUIRY_STRING_LEN];
};
728x90
반응형

728x90
반응형

  최근에 스마트폰에 있던 인증서를 PC로 옮겼다. 이때 농협 인터넷 뱅킹을 이용하여 스마트폰의 인증서를 PC로 옮겼다. 이후에 농협 인터넷 뱅킹에서는 공인인증서(공동인증서)를 정상적으로 사용할 수 있었다. 하지만 동일하게 PC에 저장된 인증서를 우체국 인터넷 뱅킹에서 사용하려고 할 때 다음과 같은 오류 메시지가 등장했다.

 

  '암호화용 인증서의 비밀번호가 다릅니다. 복구하시려면 재발급이 필요합니다.'

 

 

  정확한 원인은 알 수 없으나 직접적으로 우체국 뱅킹에서 [인증서 가져오기] 기능을 사용하지 않았기 때문에 그런 것 같다. 하지만 재미있게도 그냥 [확인] 버튼을 눌러서 계속 진행하도록 만들면 정상적으로 로그인되었다.

 

728x90
반응형