페이지

2013년 4월 29일 월요일

[라이브러리] 하나의 16진 문자를 정수로 변환하기


문자열을 숫자로 바꾸어 주는 C 표준 API는 있지만, 하나의 문자를 숫자로 바꾸어 주는 API는 없는 것 같다. 그래서 아래와 같이 문자를 정수로 바꾸어 주는 함수를 두 가지 방식으로 구현해 보았다.

#include <stdio.h>
#include <string.h>

int ctoi_v1(char c)
{
if (c >= '0' && c <= '9')
{
return (c - '0');
else if (c >= 'A' && c <= 'F')
{
return (c - 'A' + 0x0A);
}
else if (c >= 'a' && c <= 'f')
{
return (c - 'a' + 0x0A);
}
else
{
return -1;
}
}

int ctoi_v2(char c)
{
switch (c)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 0x0a;
case 'B': return 0x0b;
case 'C': return 0x0c;
case 'D': return 0x0d;
case 'E': return 0x0e;
case 'F': return 0x0f;
case 'a': return 0x0a;
case 'b': return 0x0b;
case 'c': return 0x0c;
case 'd': return 0x0d;
case 'e': return 0x0e;
case 'f': return 0x0f;
default: return -1;
}
}

int main(int argc, char **argv)
{
int val = -1;

if (argc != 2)
{
printf("usage: ctoi <char>\n");
return -1;
}

if (strlen(argv[1]) != 1)
{
printf("error: only one-character argument is allowed\n");
return -1;
}

val = ctoi_v2(argv[1][0]);

if (val != -1)
{
printf("%s --> 0x%02x (%d)\n", argv[1], val, val);
}
else
{
printf("%s --> non numeric character\n", argv[1]);
}

return 0;
}

2013년 4월 28일 일요일

GIT과 함께 vimdiff 편리하게 사용하기


GIT으로 관리하고 있는 소프트웨어 프로젝트에서 수정한 파일들을 마지막으로 commit한  파일들과 비교하여 수정 내용을 간단히 확인하고자 할 때에는 아래 명령을 사용할 수 있다.

    $ git diff

하지만 수정한 내용이 많거나, 비교를 하면서 편집을 계속하고자 한다면 아래의 명령을 사용하는 것이 더욱 편리하다.

    $ git difftool -y -t vimdiff

위 명령을 실행하면 여러 종류의 비교 도구 중 하나인 vimdiff로 수정 내용을 보여 줄 것이다. vimdiff 창에서 수정 내용을 확인하고 편집을 하는데 편리하게 사용할 수 있는 명령들을 정리해 보았다.

1. 윈도우간 이동

    CTRL-W w : 다음 윈도우로 이동
    CTRL-W h : 왼쪽 윈도우로 이동
    CTRL-W j : 아래쪽 윈도우로 이동
    CTRL-W k : 위쪽 윈도우로 이동
    CTRL-W l : 오른쪽 윈도우로 이동

2. 윈도우 위치 옮기기

    CTRL-W H : 왼쪽으로 옮기기
    CTRL-W J : 아래쪽으로 옮기기
    CTRL-W K : 위쪽으로 옮기기
    CTRL-W L : 오른쪽으로 옮기기

  수직 분할 상태에서 윈도우를 상하로 이동시키면 수평 분할로 바뀐다. 

3. 폴더 열기 및 접기

  폴더 표시 (+, -)가 있는 행에서 아래 문자를 치면 폴더가 열리고 접힌다.

    zo : 폴더 열기
    zc : 폴더 접기

  모든 폴더를 한꺼번에 열거나 접을 수도 있다.

    zr : 모든 폴더 열기
    zm :  모든 폴더 접기

4. 수정한 곳으로 이동하기

    ]c : 다음 수정 부분으로 이동
    [c : 이전 수정 부분으로 이동

  앞에 숫자를 덧붙이면 여러 부분을 건너 뛰어서 이동할 수 있다.

5. 수정 내용 제거하기

  편집을 계속할 때 차이에 대한 하이라이트가 반영되지 않는 경우도 존재한다. 이 때는 아래 명령을 실행하여 하이라이트를 갱신할 수 있다.

    :diffupdate

  수정한 내용 중 일부를 제거하고자 한다면 아래 두 가지 명령 중 하나를 사용하면 된다.

    dp : 차이나는 부분의 원본 파일에서 원본 내용을 수정 파일에 적용 (diff put)
    do : 차이나는 부분의 수정 파일에서 원본 내용을 수정 파일에 적용 (diff obtain)

SSH로 암호 입력하지 않고 로그인하기


암호를 입력하지 않고 SSH로 서버에 로그인하는 방식은 접속해야 할 서버가 많아서 일일이 암호를 지정하고 기억하는 것이 수월하지 않을 때, 또는 스크립트로 작업을 하는데 사용자가 일일이 암호를 입력해야 하는 상황을 피하고자 할 때 편리하다.

이 글은 클라이언트, 서버 모두 OpenSSH를 사용하고 있고, 아래와 같은 계정을 가지고 있다고 가정하였다.

    클라이언트 컴퓨터에서 사용자 계정

      - 사용자 아이디: myid_client
      - 홈 디렉토리: /home/myid_client

    서버 컴퓨터에서 사용자 계정

      - 사용자 아이디: myid_server
      - 홈 디렉토리: /home/myid_server

1. 클라이언트, 서버 설정하기

1) 클라이언트 컴퓨터에서 SSH 키 생성하기

클라이언트 컴퓨터의 myid_client 계정에서 ssh-keygen 명령을 실행하면 아래와 같이 키를 저장할 파일 이름과 암호를 지정하라는 프롬프트가 세 번 뜰 것이다. 세 번 모두 그냥 엔터 키를 치면 나중에 로그인시 암호를 요구하지 않는 방식으로 기본 파일 이름을 사용하여 키를 저장한다.

    $ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/myid_client/.ssh/id_rsa):
    Created directory '/home/myid_client/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/myid_client/.ssh/id_rsa.
    Your public key has been saved in /home/myid_client/.ssh/id_rsa.pub.

myid_client의 홈 디렉토리에 .ssh 디렉토리가 생기고 그 아래에 다음과 같이 두 개의 파일이 생성된다.

    id_rsa
    id_rsa.pub

id_rsa 파일은 개인 키를 담고 있고, id_rsa.pub 파일은 공개 키를 담고 있다.

2) 서버 컴퓨터에서 ssh-keygen 실행하기

서버 컴퓨터의 myid_server 계정에서 ssh-keygen을 실행한다. 이 과정은 1)번 과정과 동일하다.

    $ ssh-keygen -t rsa

하지만 여기서는 두 개의 키 파일을 사용하기 위해서 ssh-keygen을 실행한 것은 아니고, .ssh 디렉토리를 만들기 위해서이다. ssh-keygen을 사용하지 않고 직접 .ssh 디렉토리를 만들 수도 있는데, 이 때는 아래와 같이 접근 권한을 사용자로 제한해 주어야 한다.

    $ chmod 700 .ssh

3) 클라이언트 컴퓨터의 공개 키를 서버 컴퓨터에 복사하기

서버의 myid_server 계정으로 로그인시 서버 컴퓨터의 SSH 데몬은 아래 파일에서 클라이언트 컴퓨터의 공개 키가 저장되어 있는지 확인한다.

    /home/myid_server/.ssh/authorized_keys

.ssh 디렉토리에 authorized_keys 파일이 없는 경우에는 아래와 같이 생성하고 사용자만 접근할 수 있도록 접근 권한을 바꾸어 준다.

    $ touch authorized_keys
    $ chmod 600 authorized_keys

그리고 클라이언트 컴퓨터의 id_rsa.pub 파일 내용을 복사해서 서버 컴퓨터의 myid_server 계정이 가지고 있는 authorized_keys 파일에 한 줄로 추가한다.

2. 클라이언트 컴퓨터에서 SSH로 로그인하기

    $ ssh myid_server@server_addr

암호를 입력하라는 프롬프트가 뜨지 않고 곧바로 서버 컴퓨터의 myid_server 계정으로 로그인하면 성공적으로 설정을 마친 것이다.

3. 참고 사항

3.1 서버 계정을 지정하지 않고 접속

아래와 같이 서버 컴퓨터의 계정을 지정하지 않고 접속을 시도하면 OpenSSH는 클라이언트 컴퓨터에 로그인한 계정의 이름을 사용한다.

    $ ssh server_addr

즉, 클라이언트 컴퓨터에 myid_client로 로그인한 상태라면 위의 명령은 아래와 동일하다.

    $ ssh myid_client@server_addr

VirtualBox에서 Ubuntu (64 bit) 설치하기


* 설치 환경: Windows 7

1. 설치하기

    1.1 VirtualBox 설치 프로그램 다운로드

        1) 다운로드 사이트
            https://www.virtualbox.org/wiki/Downloads
            * 다운로드 링크
                VirtualBox platform packages.
                    VirtualBox 4.1.18 for Windows hosts -> x86/amd64
        2) 설치 프로그램    
            VirtualBox-4.1.18-78361-Win.exe
        
    1.2 Ubuntu 설치 프로그램 다운로드
    
        1) 다운로드 사이트
            http://www.ubuntu.com/download/desktop
            * 선택 사항
                64 bit
        2) 설치 프로그램
            ubuntu-12.04-desktop-amd64.iso
            
    1.3 가상 머신 만들기
        
        1) Oracle VM VirtualBox 관리자 실행
        2) "새로 만들기" 버튼 클릭
        3) 가상 머신 이름과 운영체제 종류:
            - 이름: Ubuntu_64
            - 운영체제 종류:
                * 운영체제: Linux
                * 버전: Ubuntu (64 bit)
        4) 메모리: 1024 MB
        5) 가상 하드디스크: "부팅 하드디스크" 체크, 새 가상 디스크 만들기
        6) 가상 디스크 파일 형식: VDI (VirtualBox 디스크 이미지)
        7) 가상 디스크 저장소 설정: 고정 크기
        8) 가상 디스크 파일 위치와 크기:
            - 위치: D:\VirtualBox VMs\Ubuntu_64\Ubuntu_64.vdi
            - 크기: 32.00 GB
            * Android 소스를 받기에는 16 GB가 넉넉하지 않다.
        9) 새 가상 디스크 만들기 대화 상자의 요약 화면
            - "만들기" 버튼 클릭
            - 가상 디스크 만들기 진행 상태가 표시된다.
            - 진행이 끝나면 요약 화면에서 다시 "만들기" 버튼을 클릭해야 가상 디스크 파일이 생성된다.
            
    1.4 Ubuntu 설치하기
    
        1) Oracle VM VirtualBox 관리자 실행
        2) 가상 머신 "Ubuntu_64"를 선택하고 "시작" 버튼 클릭
        3) 설치 미디어 선택:
            - 미디어 원본: ubuntu-12.04-desktop-amd64.iso
        4) "시작" 버튼 클릭
        
        Ubuntu_64를 위한 Oracle VM VirtualBox 화면이 뜬다.
        
        5) Ubuntu Install Welcome 화면에서 "Install Ubuntu" 클릭
        6) Installation type: Erase disk and install Ubuntu
        7) "Install Now" 버튼 클릭
        8) 설치가 끝나면 "Restart Now" 버튼 클릭
        
        * VT-x/AMD-V 기능과 관련하여 CPU 인식에 문제가 생긴다면 해당 컴퓨터의
          Virtualization Technology 기능이 꺼져 있을 가능성이 높다. 이 경우에는 
          BIOS 설정에서 Virtualization Technology 기능을 활성화시킨 후 다시 Ubuntu 설치를
          시작한다.
    
2. 설정하기

    2.1 네트워크
    
        1) Oracle VM VirtualBox 관리자 실행
        2) 가상 머신 "Ubuntu_64"를 선택하고 "설정" 버튼 클릭
        3) 네크워크 어댑터:
            - 다음에 연결됨: 브리지 어댑터
            - 이름: 목록 중에서 현재 사용 중인 어댑터를 선택
    
    2.2 공유 폴더
    
        * 공유 폴더 기능을 사용하기 위해서는 "게스트 확장"을 설치해야 한다. 게스트 확장은 여러 가지 기능을 제공하는데, 그 중의 하나는 호스트와 클립보드를 공유하는 기능이다.
    
        1) Oracle VM VirtualBox 관리자 실행
        2) 가상 머신 "Ubuntu_64"를 선택하고 "설정" 버튼 클릭
        3) 공유 폴더: 새 공유 폴더 추가
            - 폴더 경로: D:\VirtualBox VMs\Ubuntu_64\shared
            - 폴더 이름: vbox_ubuntu64_shared
            - 선택: 자동 마운트, 항상 사용하기
        4) 게스트 확장 설치
            - Ubuntu_64 - Oracle VM VirtualBox의 "장치 - 게스트 확장 설치" 메뉴 선택
            - "VBOXADDITIONS_4.1.18_78361" 팝업 상자에서 "Run" 버튼 클릭
            - 설치가 끝나면 VM을 다시 시작해야 게스트 확장이 적용된다.
        5) 사용자 계정에 vboxsf 그룹 추가
            $ sudo usermod -a -G vboxsf <username>
        6) 다시 로그인하여 공유 폴더 접근
            - Ubuntu에서 공유 폴더 위치: /media/sf_vbox_ubuntu64_shared

Visual C++ 2010 Express로 Qt 프로그래밍 시작하기


* PC 운영 체제

    Windows 7 (64비트 운영 체제)

1. 개발 도구 설치
    
    1.1 Visual C++ 2010 Express

        http://www.microsoft.com/visualstudio/eng/downloads#d-2010-express
        
            Visual C++ 2010 Express

    1.2 Qt
    
        http://qt-project.org/downloads
    
            Qt libraries 4.8.3 for Windows (VS 2010, 235 MB)
    
    1.3 참고 사항
    
        - Visual C++ 2008 Express는 Windows 7에 설치되지 않는다.
        - Qt libraries 4.8.3 for Windows는 VS 2012용으로 제공되지 않는다.

2. 환경 변수 설정

    Visual C++ 2010 Express와 Qt 설치 경로를 참조하여 해당 프로그램의 실행 경로를 PATH 변수에 추가해 준다.

        C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
        D:\DevTool\Qt\4.8.3\bin

3. 예제 빌드 및 테스트

    1) Qt 프로젝트 디렉토리 생성
    
        > mkdir example
        > cd example

    2) 소스 파일 hello.cpp 작성
    
        #include <QApplication>
        #include <QTextEdit>

        int main(int argv, char **args)
        {
            QApplication app(argv, args);

            QTextEdit textEdit;
            textEdit.show();

            return app.exec();
        }

    3) qmake를 이용하여 메이크 파일 생성
    
        플랫폼 독립적인 프로젝트 파일(example.pro) 생성
        
            > qmake -project
        
        특정 플랫폼을 위한 메이크 파일 생성
        
            > qmake example.pro
        
        VC를 사용해 프로그램을 빌드하려면
        
            > qmake -tp vc example.pro
            
    4) VC의 nmake로 빌드하기
    
        명령 창에서 아래의 명령을 실행하여 VC 빌드 환경을 설정한다.
        
            > C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat
        
        nmake를 실행하여 빌드한다.
        
            > nmake
    
    5) 응용 프로그램 실행
    
        > debug\example.exe

4. 다국어 지원

    예를 들기 위하여 Qt 프로젝트 파일 이름을 myapp.pro 라고 하자.

    4.1 소스 코드
    
        1) 시스템의 언어로 번역된 문자열을 사용하기 위하여 프로그램의 시작 부분에서 번역기를 지정한다.

            int main(int argc, char *argv[])
            {
                ...
                QApplication app(argc, argv);

                QTranslator appTranslator;
                appTranslator.load("myapp_" + QLocale::system().name());
                app.installTranslator(&appTranslator);
                ...
                return app.exec();
            }

        2) 프로그램 사용자에게 보여 줄 문자열은 tr 매크로를 통해서 지정한다.
            
            QLabel *helloLabel = new QLabel(tr("Hello"));
    
    4.2 번역 파일
    
        1) 지원할 언어의 번역 파일을 아래와 같이 프로젝트 파일에서 지정한다.
        
            TRANSLATIONS = myapp_kr.ts myapp_fr.ts
        
        2) 소스 파일로부터 tr을 통해 지정한 문자열을 찾아서 번역 파일을 만든다.
        
            > lupdate myapp.pro
            
            이 작업을 수행하면 아래 두 파일이 만들어진다.
            
                myapp_kr.ts
                myapp_fr.ts
        
        3) Qt Linguist 프로그램으로 번역할 파일을 열고 번역 작업을 한다.
        
            TS 파일을 열어 지원 언어를 설정하고 번역 작업을 진행한다.
        
        4) 실행 프로그램에 포함될 QM 파일을 만든다.
        
            > lrelease myapp.pro
            
            이 작업을 수행하면 아래 두 파일이 만들어진다.
            
                myapp_kr.qm
                myapp_fr.qm
                
            또는 Qt Linguist 프로그램의 아래 메뉴를 통해서 만들 수도 있다.
            
                파일 -> 배포
        
        5) 빌드하기
        
            빌드를 수행하면 QM 파일을 포함하여 실행 파일을 만들 것이다.
            
        소스 코드에서 문자열을 변경하고 그것을 번역하여 실행 프로그램에서 확인하고자 한다면 2) ~ 4) 단계의 작업을 수행하고 빌드하면 된다.

[BLE] TI CC2540 Mini DK 사용하기 - KeyFobDemo


1. 문서 및 소프트웨어
    
    1.1 문서
    
        가. Bluetooth Low Energy CC2540/41 Mini Development Kit User's Guide (http://www.ti.com/litv/pdf/swru270c)
            4. Using BTool
            Appendix
        나. CC2540/41 Bluetooth Low Energy Software Developer's Guide (http://www.ti.com/lit/pdf/swru271)
            4. Working with Projects using IAR Embedded Workbench 8.10.4
        다. CC2540 Bluetooth Low Energy Sample Applications Guide (http://www.ti.com/litv/pdf/swru297b)
            9. KeyFobDemo
    
    1.2 소프트웨어

        가. Bluetooth low energy software stack and tools 1.3 (www.ti.com/blestack)
            - KeyFobDemo 애플리케이션과 BTool을 포함하고 있다.
        나. IAR Embedded Workbench for 8051 (http://supp.iar.com/Download/SW/?item=EW8051-EVAL)
            - 30일 평가판 다운로드.
            
2. 빌드 및 다운로드
    
    2.1 빌드
    
        1) IAR Embedded Workbench for 8051을 실행하고 Open -> Workspace... 메뉴를 선택한다.
        2) BLE 소프트웨어 스택의 KeyFobDemo 프로젝트 아래에서 다음 파일을 선택하여 프로젝트를 연다.
            Texas Instruments\BLE-CC254x-1.3\Projects\ble\KeyFob\CC2540DB\KeyFobDemo.eww
        3) 좌측 Workspace 화면에서 KeyFobDemo를 선택하고 마우스 오른쪽 버튼을 누르면 나타나는 팝업 메뉴에서 Rebuild All를 선택한다.
        
    2.2 다운로드
    
        1) KeyFob에 전지를 넣고 CC Debugger와 연결한다.
        2) CC Debugger를 PC에 연결한다.
        3) IAR Embedded Workbench의 Project -> Download and Debug 메뉴를 선택하여 이미지를 KeyFob에 다운로드한다.
    
3. USB 동글과 KeyFob 연결

    1) USB 동글을 PC에 연결한다. 장치 관리자에서 USB 동글의 포트 번호를 확인한다.
    2) BTool을 실행한다. 직렬포트 설정 대화 상자에서 USB 동글의 포트 번호를 지정한다. 다른 항목은 기본으로 설정된 값을 사용한다.
    3) Keyfob의 오른쪽 버튼(B3)을 눌러 Discoverable 모드로 진입한다.
    4) BTool의 Discover/Connect 탭에서 장치 발견 및 연결을 실행한다.
        - 'Discovery' 섹션의 'Scan' 버튼을 누른다. 잠시 후 "Devices Found"의 값이 1로 바뀌는 것을 확인한다.
        - 'Link Control' 섹션의 Slave BDA에서 발견된 장치의 주소를 선택하고 'Establish' 버튼을 누른다. 왼쪽 패널에 "Connection info" 항목이 추가되는 것을 확인한다.

4. Primary Service 확인

    KeyFobDemo 애플리케이션이 제공하는 Primary Service 목록을 알아보도록 하자. BTool의 우측 화면에서 Read / Write 탭을 열고 Characteristic Read 영역에서 아래와 같이 지정한 다음 Read 버튼을 누른다. Primary Service 선언임을 지칭하는 UUID는 0x2800이다.
    
        Sub-Procedure:          Read Using Characteristic UUID
        Characteristic UUID:    00:28
    
    그러면 로그창에 Handle/Data 항목들이 표시될 것이다. Data 항목은 Primary Service로 제공되는 서비스의 UUID이고, Handle 항목은 해당 서비스의 시작 핸들의 값이다.
    
         Handle : 0x0001
         Data : 00:18
         
         Handle : 0x000C
         Data : 01:18
         
         Handle : 0x0010
         Data : 0A:18
         
         Handle : 0x0023
         Data : 03:18
         
         Handle : 0x0026
         Data : 02:18
         
         Handle : 0x0029
         Data : 04:18
         
         Handle : 0x002D
         Data : 0F:18
         
         Handle : 0x0032
         Data : A0:FF
         
         Handle : 0x0045
         Data : E0:FF
         
    Data 항목의 값들이 서비스의 UUID이므로 다음과 같은 Primary Service들이 제공되고 있음을 알 수 있다.
    
        0x1800      Generic Access Profile
        0x1801      Generic Attribute Profile
        0x180A      Device Information
        0x1803      Link Loss
        0x1802      Immediate Alert
        0x1804      Tx Power
        0x180F      Battery Service
        0xFFA0      Accelerometer
        0xFFE0      Simple Keys

5. Link Loss Service
    
    KeyFob이 USB 동글로부터 일정 거리 이상 멀어지면 연결이 끊어질 것이다. 이 때 KeyFob의 버저가 울리고 LED가 깜박이도록 해 보자. 연결이 끊어졌을 때 어떻게 알릴지는 Alert Level의 값에 따라 달라지는데 다음 세 가지 유형 중 하나로 지정할 수 있다.
    
        No Alert        - 장치가 경고를 하지 않는다.
        Mild Alert      - 장치가 경고를 한다.
        High Alert      - 장치가 가능한 가장 강력한 방식으로 경고를 한다.
        
    BTool의 우측 화면에서 Read / Write 탭을 연다.
    
    5.1 현재의 Alert Level 확인
    
        Link Loss Service가 제공하는 Characteristic 선언의 목록을 표시하도록 우측 화면의 Characteristic Read 영역에서 아래와 같이 지정한 다음 Read 버튼을 누른다. Characteristic 선언임을 지칭하는 UUID는 0x2803이고, 검색할 핸들의 범위는 Link Loss Service의 시작 핸들인 0x0023 이후부터 다음 서비스의 시작 핸들인 0x0026 바로 이전으로 지정하였다. 
    
            Sub-Procedure:          Read Using Characteristic UUID
            Characteristic UUID:    03:28
            Start Handle:           0x0024
            End Handle:             0x0025
        
        로그 창에 표시되는 아래의 내용에서 Data 항목은 Link Loss Service가 제공하는 Characteristic에 대한 선언이다.
        
            Handle : 0x0024
            Data : 0A:25:00:06:2A
            
        Data 항목의 첫번째 바이트 0x0A는 해당 Characteristic의 값을 읽거나 쓸 수 있음을 나타낸다. 그 다음 두 바이트 0x0025는 해당 Characteristic의 값을 참조할 때 사용할 핸들값이다. 마지막 두 바이트 0x2A06은 해당 Characteristic이 Alert Level임을 지칭하는 UUID이다.

        따라서 현재의 Alert Level을 읽기 위하여 아래와 같이 핸들값을 지정하고 Read 버튼을 누른다.
        
            Sub-Procedure:                  Read Characteristic Value / Descriptor
            Characteristic Value Handle:    0x0025
        
        그러면 로그 창에 아래와 같이 표시되는데, 0x00은 "No Alert"를 의미한다. 즉 연결이 끊어지더라도 경고음이나 LED로 알리지 않을 것이다.
        
            Value : 00 
        
    5.2 새로운 Alert Level 설정
    
        Alert Level의 값으로 "High Alert"를 설정하기 위하여 우측 화면의 Characteristic Write 영역에서 아래와 같이 지정하고 Write 버튼을 누른다.
        
            Characteristic Value Handle:    0x0025
            Value:                          0x02

    5.3 Link Loss 테스트
    
        KeyFob을 들고 USB 동글로부터 수 미터 이상 이동하면서 버저음이 울리고 LED가 깜박이는지 확인해 본다.

가설 검정 학습 내용 요약

출처: 위키백과 통계적 추론 추론 통계 또는 추론 통계학(inferential statistics)으로 불린다.  기술 통계학(descriptive statistics)과 구별되는 개념 도수 확률(frequency probability)과 사전 확률(...