안경잡이개발자

728x90
반응형

  최근에 방송을 할 때, 전화 상담 콘텐츠를 진행하고 있다. 다만 핸드폰 번호를 공개할 수는 없다 보니까, 카카오톡 계정을 하나 더 만들어서 보이스톡을 통해서 전화 상담 콘텐츠를 진행하는 것이 편한 것 같다.

 

※ 가상 번호 생성하기 ※

 

  카카오톡과 같은 메신저 애플리케이션을 여러 계정으로 사용하기 위해서는, 여러 개의 전화번호가 필요한 경우가 많다. 그래서 통신사에서 2개의 번호를 이용하도록 해주는 서비스를 이용할 수도 있다. 하지만 그것보다는 가상 번호를 이용하는 게 더 편하기 때문에, 나는 가상 번호를 이용해보았다.

 

  가상 번호를 생성해주는 서비스는 다양하다. 대표적으로 텍스트나우(Textnow)와 같은 서비스가 있다. 텍스트나우를 설치한 뒤에 회원가입 후에 로그인을 해보았다. 화면은 다음과 같은데, 로그인 이후에 가상 핸드폰 번호를 받을 수 있다.

 

 

  가상 번호를 만들 때는, 미국 뉴욕(New York) 주에 속한 585를 지역 코드로 사용하는 것이 좋은 것 같다.

 

 

  위와 같이 [Continue] 버튼을 누르면 가상 번호를 발급받을 수 있다.

 

※ 핸드폰으로 카카오톡 앱 2개 사용하기 ※

 

  이제 발급 받은 번호를 이용해서, 카카오톡 계정을 생성할 수 있다. 추가적으로 알면 좋은 점은, 안드로이드 스마트폰에서는 동일한 메신저 앱을 2개로 늘려서 동시에 사용할 수 있도록 기능을 지원해주고 있다는 점이다. 안드로이드 스마트폰의 [설정] 창에서 [유용한 기능] 탭으로 이동해보자.

 

 

  그러면 다음과 같이 [듀얼 메신저] 항목을 클릭하여 메신저 애플리케이션 중에서 듀얼 메신저를 지원하는 애플리케이션들을 확인할 수 있다.

 

 

  결과적으로 카카오톡 애플리케이션을 두 번째 계정으로 이용할 수 있다. 이제 이 듀얼 메신저 카카오톡을 실행하여 가상 번호를 이용해 회원가입을 진행하면 된다.

 

 

※ 카카오톡 계정의 전화번호 변경하기 ※

 

  또한 기본적으로 가상 전화번호는 시간이 지나면, 사용이 불가능해지는 경우가 많다. 따라서 카카오톡 계정의 [프로필 관리] 창에서 전화번호를 변경할 수 있다. 프로필 관리 창에서 [전화번호] 탭을 클릭해보자.

 

 

  [전화번호 변경] 버튼을 눌러서 전화번호를 변경할 수 있다.

 

 

  텍스트나우(Textnow)를 통해 새롭게 발급 받은 전화번호를 입력하여 인증하면, 성공적으로 전화번호가 변경된다.

 

 

  이 방법을 이용하면 가상 번호로 만든 2번째 카카오톡 계정의 번호를 또 다른 가상 번호로 변경할 수 있기 때문에, 가상 번호 기간이 만료되었을 때 번호를 교체할 수 있다.

728x90
반응형

728x90
반응형

  윈도우 10(Windows 10)에서 크롬(Chrome) 브라우저를 이용하면 종종 느리게 동작하는 경우가 있다. 이럴 때는 공통적으로 해보면 좋은 해결 방법들이 있다. 물론 느리게 동작하는 데에는 다양한 이유가 있을 수 있는데, 일반적으로 다음의 방법들을 이용해 보면 거의 해결된다.

 

※ 공통적인 해결 방법 ※

 

  크롬(Chrome)은 chrome://flags 경로로 들어가면, 실험적인 기능에 대한 사용 여부를 설정할 수 있다.

 

 

  여기에서 기본적으로 설정을 기본 설정(Default)으로 변경할 수 있다. [Reset all to default]를 눌러서 적용할 수 있다.

 

 

  이후에 Experimental QUIC protocol 기능을 [Disabled]로 설정하자.

 

 

  또한 크롬(Chrome) 브라우저에서는 chrome://settings 경로로 이동하여 브라우저 [설정] 창으로 이동할 수 있다.

 

 

  이제 [설정을 기본값으로 복원]을 눌러서 모든 설정 값을 기본 설정으로 변경하자.

 

 

  다음과 같이 [설정 초기화]를 눌러서 초기화를 진행하면 된다.

 

 

  또한 [가능한 경우 하드웨어 가속 사용] 기능을 꺼준다.

 

 

※ 윈도우 업데이트 이후에 ERR_TIMED_OUT 오류 ※

 

  윈도우 10 (Windows 10) 이용자의 경우, 윈도우 업데이트 이후에 크롬을 실행하면 ERR_TIMED_OUT 오류가 나오며 접속이 안 되는 경우가 있다. 이는 윈도우 시스템 서비스 관련 이슈로 알려져 있다.

 

 

  다음과 같이 작업 관리자를 실행한 뒤에, [서비스] 탭으로 이동하여 [Cryptographic Services]가 존재하는지 확인한다. 존재한다면, 우클릭 이후에 [서비스 열기]를 눌러서 서비스 창을 열 수 있다.

 

 

  서비스(Services) 창이 켜지면 [Cryptographic Services]를 찾아서 우클릭하여 [속성(R)] 창을 열어준다.

 

 

  이 때 [로그온] 탭으로 이동하여 [로컬 시스템 계정]란에서 [서비스와 데스크톱 상호 작용 허용]을 눌러주면 된다.

 

 

  그리고 해당 서비스를 [다시 시작]해주면 된다.

 

 

이제 크롬이 다시 예전처럼 빠르게 동작하는 것을 확인할 수 있다.

728x90
반응형

728x90
반응형

  최근 코로나19(COVID-19)로 인하여 국가적인 재난 상황입니다. 그래서 경기도에서는 2020년 4월부터 7월까지 경기도민들에게 경기도 재난기본소득을 달마다 지급합니다. 신청은 경기지역화폐 사이트에서 진행할 수 있습니다.

 

  ▶ 경기지역화폐 사이트: http://www.gmoney.or.kr/

 

  웹 사이트에 방문한 뒤에 [재난기본소득 신청] 버튼을 클릭합니다.

 

 

  이후에 [온라인 신청]을 눌러서 온라인으로 신청을 진행할 수 있습니다.

 

 

  약관에 동의합니다.

 

 

  이후에 경기도 내에서의 시군을 선택합니다. 이후에 카드 번호를 입력해야 하는데, 저는 경기지역화폐카드를 신청해서 수령을 한 상태이기 때문에 해당 카드 번호를 입력했습니다.

 

 

  이후에 다음과 같이 관할주민센터 동명, 세대주 성명, 세대주와의 관계를 입력해야 합니다. 세대주와의 관계를 입력할 때는 세대주를 기준으로 입력하므로, 세대주가 부모님이라면 본인을 '자녀'라고 넣으셔야 합니다.

 

 

  조회가 완료되면 다음과 같이 최종적으로 [신청 완료]를 진행하실 수 있습니다.

 

728x90
반응형

728x90
반응형

  윈도우(Windows) 환경에서 GNU Make를 설치하여 이용하는 방법은 매우 간단합니다.

 

  ▶ 설치 경로: http://gnuwin32.sourceforge.net/packages/make.htm

 

  다음과 같이 소스코드 없이 바로 설치할 수 있는 설치 파일을 받기 위해 [Setup] 링크를 누릅니다.

 

 

  바로 설치 프로그램을 실행하여 설치를 진행할 수 있습니다. 기본 설정 그대로 [Next] 버튼만 누르셔도 정상적으로 설치됩니다.

 

 

 

 

  설치가 완료된 이후에는 C 드라이브 내 GnuWin32가 설치된 폴더를 찾아주세요. 여기에서 bin 폴더의 위치를 환경 변수로 등록해주셔야, make.exe 파일을 사용할 수 있게 됩니다.

 

 

  다음과 같이 시스템 변수 중에서 'Path'에 넣어 주시면 됩니다.

 

 

  이후에 다음과 같이 명령 프롬프트(CMD)에서 make -v 명령을 입력했을 때, 버전 정보가 출력이 되면 정상적으로 설치가 완료된 겁니다.

 

728x90
반응형

728x90
반응형

  우분투(Ubuntu)에서 윈도우(Windows)에서 실행이 가능한 실행 파일을 만들기 위해서는 mingw를 설치할 필요가 있다. 사실 윈도우(Windws)에서 MinGW를 설치해서 직접 컴파일할 수도 있는데, 그것보다는 그냥 리눅스(Linux)에서 윈도우용 실행 파일을 크로스 컴파일하는 것이 편한 경우가 많다. 이를 위해 리눅스에 mingw를 설치하자.

 

  sudo apt-get install mingw-w64

  sudo apt-get install gcc-mingw-w64

 

  이러한 mingw의 컴파일러는 다음과 같다. Makefile을 작업할 때는 컴파일러(Compiler)를 다음과 같이 정의해주어야 한다.

 

  COMPILER = i686-w64-mingw32-gcc

 

  또한 우분투(Ubuntu) 환경에서 mingw를 설치한 경우, 윈도우(Windows)에서 mingw를 설치한 것과는 다르게 라이브러리를 불러오는 경우가 있다. 예를 들어 헤더 파일로 라이브러리를 불러올 때 ddk/hidclass.h에서 불러오지 않고, hidclass.h의 위치에서 바로 불러온다. 물론 이는 컴파일 과정에서 오류가 발생하면 하나씩 바꾸면서 작업해 줄 수 있다.

728x90
반응형

728x90
반응형

  Oracle VM VirtualBox를 이용할 때, 게스트(Guest) OS 쪽에서 USB를 사용해야 할 일이 있다. 예를 들어 공인인증서를 게스트 OS에서 사용해야 하는 경우, 혹은 USB Device 관련 개발을 진행할 때가 이에 해당한다. 이 과정은 매우 간단하다. [장치] - [USB]에 들어가서 호스트(Host) OS에서 인식하고 있는 USB 중 하나를 선택해주면 된다.

 

 

  이후에 다음과 같이 게스트 OS 쪽에서 정상적으로 USB를 인식하는 것을 확인할 수 있다.

 

 

  참고로 리눅스 OS에서는 알 수 없는 장치(Unknown Devices)에 접근하려면 루트(Root) 권한이 필요하다. 따라서 알려지지 않은 HID USB 기기에 접근하는 코드를 실행하려는 경우에는 루트 권한으로 실행해야 한다.

728x90
반응형

728x90
반응형

  가상 머신(Virtual Machine) 기능을 이용하기 위해 많이 사용하는 소프트웨어 중 하나가 Oracle VM Virtual Box입니다. 이 때 호스트(Host) OS와 게스트(Guest) OS 간에 파일을 주고 받기 위해서 [공유 폴더]를 설정할 수 있습니다. [장치] - [공유 폴더] - [공유 폴더 설정]에 들어가서 공유 폴더를 설정할 수 있습니다.

 

  (본 게시글은 호스트(Host)가 윈도우(Windows) 10이고, 게스트(Guest)가 Ubuntu 16.04인 상황에서 작성된 글입니다.)

 

 

  [공유 폴더] 설정을 할 때, 처음에는 다음과 같이 내용이 비어있을 겁니다. 오른쪽 위의 [+] 버튼을 눌러서 추가를 진행하시면 됩니다.

 

 

  이 때 호스트(Host) OS에서 공유 폴더 전용으로 하나의 폴더를 생성해 주시고, 이를 [폴더 경로]에 넣어줍시다. 이렇게 해서 [확인] 버튼을 눌러 만들어 주겠습니다.

 

 

  이후에 게스트(Guest) OS인 Ubuntu 16.04에서 다음과 같이 해줍니다.

 

  ▶ sudo mkdir /mnt/share: 게스트(Guest) 입장에서 사용할 공유 폴더 경로

  ▶ sudo mount -t vboxsf (공유 폴더 이름) /mnt/share: 마운트 진행하기

 

  명령을 수행한 뒤에는 두 OS가 성공적으로 폴더를 공유하고 있는 것을 확인할 수 있습니다.

 

 

※ 참고 사항 ※

 

  가상 머신의 전원을 껐다가 다시 키면 마운트가 해제될 수 있습니다. 그런 경우에는 다시 마운트를 수행해 주시면 됩니다. 참고로 해당 폴더에 들어가 있는 상태에서 마운트를 하면 즉시 반영이 안 될 수 있으므로, 해당 폴더를 나왔다가 다시 들어가 보시면 공유 폴더 기능이 정상적으로 반영됩니다.

 

 

728x90
반응형

728x90
반응형

  리눅스에서 usb.h 헤더 파일을 사용해야 할 때가 있다. 하지만 usb.h가 설치되어 있지 않을 때는 다음과 같은 오류 메시지를 확인하게 될 수 있다.

 

  fatal error: usb.h: No such file or directory

 

  이는 usb 개발용 라이브러리를 설치하면 해결된다.

 

  sudo apt-get install libusb-dev

728x90
반응형

728x90
반응형

  Teensy 3.6을 포함해 일부 Teensy Board들은 SD Card 슬롯(Slot)이 존재합니다. 따라서 Host PC와 데이터를 주고 받으면서, SD Card에 파일을 저장하는 등의 작업이 가능합니다. Teensyduino에서 기본적으로 제공되는 예시들을 확인할 수 있습니다.


  일단 아래의 모든 예시들을 실행할 때는 chipSelect 변수의 값을 자신이 사용하고 있는 Teensy의 버전에 맞게 설정해야 합니다. 저는 Teensy 3.6 버전을 이용하고 있기 때문에, chipSelect 변수의 값을 BUILTIN_SDCARD로 설정했습니다.

 

※ SD 카드(Card) 정보 출력하기 ※

 

  [예제] - [SD] - [CardInfo]를 들어가면 SD 카드의 정보를 출력하는 예제를 실행할 수 있습니다.

 

 

  이 예제는 단순히 카드 정보를 출력하는 예시입니다. 대략 다음과 같이 내용이 출력됩니다. 다만 예제 소스코드를 확인해 보시면, Volume Size만을 출력해주는 것이 아니라 루트 폴더에서의 전체 폴더 및 파일 목록까지 함께 보여주는 것을 알 수 있습니다.

 

 

※ SD 카드(Card)의 파일 리스트 읽어오기 ※

 

  [예제] - [SD] - [listfiles]에 들어가면 카드에 포함된 파일 목록을 출력하는 예제를 실행할 수 있습니다. 이 내용은 위의 예제에서 출력되는 내용과 비슷해 보이지만, 실제 구현상에서는 File 객체를 이용하여 파일을 openNextFile() 함수를 이용해 파일에 하나씩 접근하여 정보를 출력한다는 점이 특징입니다.

 

 

  출력된 결과는 다음과 같습니다.

 

 

※ SD 카드(Card)에서 파일의 데이터를 읽고 데이터 쓰기 ※

 

  [예제] - [SD] - [ReadWrite]에 들어가면 하나의 파일을 만들고 내용을 추가한 뒤에, 출력하는 예제를 실행할 수 있습니다. 소스코드를 확인해 보시면 SD Card 내부에서 "test.txt"라는 이름의 파일을 연 뒤에 여기에 특정한 문자열을 내용으로 기입하고, 이를 저장하는 것을 알 수 있습니다. 그리고 그렇게 저장된 내용을 다시 출력해보며 확인합니다.

 

 

※ Raw HID를 통해 받은 데이터를 SD 카드(Card)에 저장하기 ※

 

  이제 Raw HID를 통해서 Host PC로부터 받은 데이터를 Guest Device의 SD Card에 작성하는 예시를 다루어 보겠습니다. Host PC 전용 프로그램은 아래 경로에서 다운로드 받아서 그대로 이용하실 수 있습니다.

 

  ▶ Teensy 공식 홈페이지: https://www.pjrc.com/teensy/rawhid.html

  Guest Device인 Teensy 3.6의 소스코드는 다음과 같이 작성할 수 있습니다. 소스코드를 확인해 보시면, 먼저 SD Card 내부에 example.txt 파일을 생성하는 것을 알 수 있습니다. 이후에 Host PC로부터 한 문자씩 전달 받는 데이터를 example.txt에 쓰게 됩니다. 만약에 전달 받은 문자가 'q'라면 데이터를 전달 받는 것을 멈추고, example.txt 파일을 읽어서 입력되었던 문자들을 시리얼 통신을 통해 출력합니다.

 

#include <SD.h>
#include <SPI.h>

File myFile;
const int chipSelect = BUILTIN_SDCARD;

void setup() {
  Serial.begin(9600);
  while (!Serial) ;
  Serial.println("RawHID Example");

  // Initialize SD card.
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  // Remove and recreate example.txt file.
  SD.remove("example.txt");
  Serial.println("Creating example.txt...");
  myFile = SD.open("example.txt", FILE_WRITE);
}

// RawHID packets are always 64 bytes.
byte buffer[64];
elapsedMillis msUntilNextSend;
unsigned int packetCount = 0;

void loop() {
  int n;
  n = RawHID.recv(buffer, 0);
  if (n > 0) {
    if (buffer[0] == 'q') {
      if (myFile) {
        Serial.println("Quit!");
        myFile.close();
        // If the file is available, print it's data.
        Serial.println("File contents are:");
        File dataFile = SD.open("example.txt");
        if (dataFile) {
          while (dataFile.available()) {
            Serial.write(dataFile.read());
          }
          dataFile.close();
        }  
        // If the file isn't open, pop up an error.
        else {
          Serial.println("error opening example.txt");
        } 
      }
      return;
    } else {
      if (myFile) {
        Serial.print("Received packet, first char: ");
        Serial.println((char)buffer[0]);
        myFile.println((char)buffer[0]);
      }
    }
  }
}

 

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

 

 

※ 특정한 파일의 Byte Stream 읽어서 그대로 출력하기 ※

 

  특정한 파일을 열어서 내부에 적힌 데이터를 읽어서 Byte Stream 형태 그대로 출력하는 예제는 다음과 같습니다. 이 코드는 제가 개인적으로 많이 쓰는 코드입니다.

 

#include <SD.h>
#include <SPI.h>
#define BUFFER_SIZE 64 // 버퍼 사이즈

File myFile;

byte buffer[BUFFER_SIZE];
const int chipSelect = BUILTIN_SDCARD;

void setup() {
  Serial.begin(9600);
  while (!Serial);
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    return;
  }
  delay(1000);
  myFile = SD.open("example.dat", FILE_READ);
  uint64_t fileSize = myFile.size();
  if (myFile) {
    while (true) {
      // 전달 받을 데이터의 크기(버퍼 크기보다 덜 남은 경우 남은 크기만 저장)
      int length = (fileSize < BUFFER_SIZE)? fileSize : BUFFER_SIZE;
      // 전달 받은 내용 그냥 Serial 통신으로 출력
      myFile.read(buffer, length);
      fileSize -= length;
      for (int i = 0; i < length; i++) {
        Serial.print(buffer[i]);
        Serial.print(" ");
        if ((i + 1) % 8 == 0) Serial.println();
      }
      // 크기만큼 다 출력한 경우 파일 객체 닫기
      if (fileSize <= 0) {
        break;
      }
    }
    myFile.close();
  }
}

void loop() {
  
}

 

  실행을 해보시면 다음과 같은 시리얼 출력 결과를 확인할 수 있습니다. (한 줄에 8바이트씩 출력합니다.)

 

728x90
반응형

728x90
반응형

  최근 Teensy Board는 개발 과정에 있어서 아두이노(Arduino) IDE를 사용합니다. 이처럼 아두이노 기반의 Teensy 개발 환경을 Teensyduino라고 합니다. Teensy를 이용하면 Raw HID 데이터 송수신과 같은 같은 기능을 손쉽게 이용할 수 있습니다. 만약 Teensyduino가 설치되어 있지 않다면 다음의 경로를 통해서 설치할 수 있습니다.

 

  ▶ Teensy 프로젝트 시작: https://ndb796.tistory.com/353

 

Teensy 프로젝트 시작하기

Teensy는 Teensyduino를 이용하여, 아두이노 IDE 상에서 프로그램을 작성할 수 있도록 지원하고 있습니다. 기본적으로 HalfKay 부트로더(Bootloader)가 동작하고 있을 때, Teensy Loader 프로그램이 Teensy Board..

ndb796.tistory.com

 

  기본적인 Raw HID 소스코드는 [예제] - [Teensy] - [USB Raw HID] - [Basic]으로 가면 됩니다.

 

 

  그러면 다음과 같은 기본적인 소스코드가 나옵니다. USB Type을 [Raw HID]로 설정한 뒤에, 컴파일을 진행하고 업로드(Upload)를 수행하면 됩니다.

 

 

  업로드를 진행하고, 시리얼 모니터(Serial Monitor)를 실행하면 다음과 같이 호스트(Host) PC로 데이터를 보내는 것을 확인할 수 있습니다.

 

 

  그러면 이제 호스트(Host) PC에서도 적절한 프로그램을 실행하여, USB와 통신할 수 있어야 합니다. 현재 예제는 기본적인 Raw HID 예제이며, Teensy 공식 홈페이지에서 Host PC 전용 프로그램도 제공하고 있습니다. 다음의 경로에서 다운로드를 받을 수 있습니다.

 

  ▶ Teensy 공식 홈페이지: https://www.pjrc.com/teensy/rawhid.html

 

 

  결과적으로 Teensy를 연결한 상태에서 Raw HID Host 전용 프로그램을 실행하면 다음과 같이 데이터를 받아오는 것을 알 수 있습니다.

 

 

  또한 Host PC 쪽에서도 입력을 수행하면 그 데이터가 Teensy Device 쪽으로도 전송되는 것을 확인할 수 있습니다. 이처럼 Host PC와 데이터를 주고 받으면서, 원하는 데이터가 왔을 때 특정한 작업을 수행하는 등의 처리가 가능합니다.

 

 

  Teensy를 더 자유롭게 이용하기 위해서 SD 카드(Card) 예제와 합쳐서 사용해보는 등의 기능도 구현을 해보면 좋을 것 같네요. 이후 게시글에서 다루어 보겠습니다.

728x90
반응형