안경잡이개발자

728x90
반응형

  컨퍼런스에 참여하거나 여행을 갈 때 사용할 수 있는 숙소 예약 사이트/어플은 매우 많습니다. 저는 호텔스컴바인(Hotelscombined)이 편해서 이걸 자주 사용합니다. 호텔스컴바인의 기능 중에서 가장 좋은 것은 큰 지도에서 전체 숙박 업소를 요약해서 보여준다는 것입니다. 참고로 이 글은 절대 광고글은 아니고, 그냥 맨날 숙박 업소 예약할 때마다 까먹어서 안 까먹으려고 남겨 놓는 글입니다...

 

  사이트에 접속한 뒤에 다음과 같이 여행 목적지와 일자를 적어 검색합니다.

 

  이후에 다음과 같이 [지도 열기] 버튼을 눌러서 지도를 확인할 수 있습니다. 저는 얘가 핵심적인 기능이라고 생각합니다.

 

 

  바로 아래의 지도가 제가 호텔스컴바인을 가장 좋아하는 이유입니다. 바로 왼쪽에서 호텔 등급을 설정할 수 있고 가격 범위를 설정할 수 있습니다. 저는 가리지 않고 잠을 자는 편이라서 다음과 같이 가장 싼 호텔을 선택하는 편입니다. 가장 싼 호텔은 당연히 일정에 따라서 바뀔 수 있는 부분이며 저는 그냥 대충 제일 싼 곳에서 잡니다.

 

  대충 3박에 9만 원에 잘 수 있다는 곳을 찾아서, 이걸로 예약하려고 합니다.

 

 

  이제 다음과 같이 원하는 예약 사이트를 이용해 예약하면 됩니다. 저는 아고다(Agoda) 예약 사이트를 이용해서 [바로 예약]을 진행했습니다.

 

 

  이후에 예약 사이트로 이동되는데, 이제 다음과 같이 호텔의 이름을 클릭해서 들어가면 됩니다.

 

 

  이후에 [지금 예약하기] 버튼을 눌러서 예약을 진행하시면 됩니다. 예약 페이지에서는 상세하게 3박 4일이라는 정보가 안 나오지만, 버튼을 눌러서 페이지를 이동하면 상세 정보가 나옵니다.

 

 

  이제 기본적인 정보를 입력하면 됩니다. 예약 정보가 이메일을 통해서 전달되므로, 이메일 정보는 정확히 입력해야 합니다. 근데 저는 기본 언어를 한국어로 선택하여 쭉 사이트를 이용했는데... 영문 이름을 입력하라는 점이 특이하네요.

 

 

  이어서 [마지막 단계로 이동하기] 버튼을 누르시면 됩니다.

 

 

  이제 결제 방법을 선택해서 결제를 진행할 수 있습니다. 저는 페이팔(PayPal)을 이용해 결제를 진행했습니다.

 

 

  결제가 완료되면 다음과 같이 메일로 예약 확정 메일이 옵니다. 이제 [예약 관리하기] 버튼을 누르면 상세 예약 정보를 확인할 수 있습니다.

 

 

  그러면 다음과 같이 상세 예약 정보를 확인할 수 있습니다. 이제 실제로 당일날 호텔에 방문해서 예약된 이름을 말하면 호텔방에 입장할 수 있습니다.

 

728x90
반응형

728x90
반응형

  랜덤 추첨을 해야 할 때 아래 사이트를 유용하게 사용할 수 있습니다. 말 그대로 랜덤한 여러 개의 입력을 넣은 뒤에, 몇 개를 랜덤하게 뽑은 결과를 알려주는 간단한 웹 사이트입니다.

 

  ▶ Pick a Random Item: https://onlinerandomtools.com/pick-random-item

 

Pick a Random Item - Online Random Tools

Simple, free and easy to use online tool that picks a random item. No ads, popups or nonsense, just an item picker. Load your items, get a random item.

onlinerandomtools.com

 

  웹 사이트에 접속하신 뒤에 다음과 같이 items에 여러 개의 입력을 넣을 수 있습니다. 이후에 random item picker options에서 몇 개를 뽑을 지 수치를 적을 수 있습니다. 저는 다음과 같이 10개의 입력을 넣은 뒤에, 5개를 뽑도록 설정했습니다.

 

 

  다만 이 사이트는 치명적인 단점이 있습니다. 웹 브라우저를 확대하면 결과(picked) 부분이 변경될 수 있다는 점입니다. 저는 그래서 이 사이트를 온라인 라이브 추첨을 진행할 때 가끔씩 이용합니다.

728x90
반응형

728x90
반응형

  저는 동영상 썸네일을 만들 때 포토샵(Photoshop)을 쓰는게 귀찮아서 그냥 파워포인트(PowerPoint)를 이용하여 썸네일을 제작합니다. 제가 만든 썸네일 예시는 다음과 같습니다. 저는 썸네일을 만드는 게 너무 귀찮아서 진짜 빠르게 만드는 방법을 찾다가 이러한 방법을 이용하게 되었습니다.

 

  ※ 파워포인트로 1분만에 만든 썸네일 예시들 ※

 

 

 

※ 파워포인트로 사진(이미지)을 원하는 모양(형태)으로 자르기 ※

 

  파워포인트(PowerPoint)를 이용해서도 사진(이미지)를 원하는 모양으로 잘라 사용할 수 있습니다. 간단하게 실습을 해보겠습니다. 예를 들어 동영상 내용 중에 일부를 캡처한 것은 다음과 같습니다.

 

 

  이제 여기에서 얼굴만 따내기 위해 파워포인트로 그냥 붙여넣기를 합니다.

 

 

  붙여넣기 이후에는 [삽입] - [도형] - [자유형]을 누릅니다.

 

 

  이후에 사람이 존재하는 부분의 외곽을 자유형으로 따냅니다. 다음과 같이 대충 따낼 수 있습니다.

 

 

  이제 원래 사진이 우리가 방금 그린 도형과 동일한 크기가 될 수 있도록 [자르기]를 수행합니다.

 

 

  잘라낸 원본 사진은 [그림으로 저장(S)]을 진행합니다.

 

 

  이제 다시 도형을 우클릭하여 [도형 서식(O)]을 확인하여 [그림 또는 질감 채우기(P)]를 클릭합니다.

 

 

  이제 [파일(F)]을 클릭하여 잘라낸 원래 이미지를 선택합니다. 그러면 다음과 같이 해당 도형의 형태에 맞게 원본 이미지가 삽입됩니다.

 

 

  이제 다음과 같이 사각형 도구를 이용해 배경색이 들어간 것처럼 넣을 수 있습니다.

 

 

  이제 글씨를 입혀서 썸네일을 채울 수 있습니다. 저는 개인적으로 무료 폰트로 [Tmon 몬소리체]를 이용하는 편입니다. 글씨의 경우 텍스트 옵션에서 [실선]으로 2pt 정도를 주면 강조하는 느낌을 낼 수 있습니다.

 

 

  이후에 [파일] - [다른 이름으로 저장] - [PNG 형식]으로 저장을 해주시면 됩니다.

 

 

 

728x90
반응형

728x90
반응형

▶ 순열 소스코드 예제

 

  n개에서 순서를 고려하여 r개를 뽑아 나열하는 모든 순열을 구하는 소스코드는 다음과 같습니다.

 

import java.util.*;

class Permutation {
    private int n;
    private int r;
    private int[] now; // 현재 순열
    private ArrayList<ArrayList<Integer>> result; // 모든 순열

    public ArrayList<ArrayList<Integer>> getResult() {
        return result;
    }

    public Permutation(int n, int r) {
        this.n = n;
        this.r = r;
        this.now = new int[r];
        this.result = new ArrayList<ArrayList<Integer>>();
    }

    public void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public void permutation(int[] arr, int depth) {
        // 현재 순열의 길이가 r일 때 결과 저장
        if (depth == r) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = 0; i < now.length; i++) {
                temp.add(now[i]);
            }
            result.add(temp);
            return;
        }
        for (int i = depth; i < n; i++) {
            swap(arr, i, depth);
            now[depth] = arr[depth];
            permutation(arr, depth + 1);
            swap(arr, i, depth);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        int r = 3;

        Permutation perm = new Permutation(arr.length, r);
        perm.permutation(arr, 0);
        ArrayList<ArrayList<Integer>> result = perm.getResult();

        System.out.println("모든 순열의 수: " + result.size());
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}

 

  {1, 3, 5, 7, 9}에서 3개를 뽑는 모든 순열은 다음과 같습니다.

 

 

 

▶ 조합 소스코드 예제

 

  n개에서 순서를 고려하지 않고 r개를 뽑아 나열하는 모든 조합을 구하는 소스코드는 다음과 같습니다.

 

import java.util.*;

class Combination {
    private int n;
    private int r;
    private int[] now; // 현재 조합
    private ArrayList<ArrayList<Integer>> result; // 모든 조합

    public ArrayList<ArrayList<Integer>> getResult() {
        return result;
    }

    public Combination(int n, int r) {
        this.n = n;
        this.r = r;
        this.now = new int[r];
        this.result = new ArrayList<ArrayList<Integer>>();
    }

    public void combination(int[] arr, int depth, int index, int target) {
        if (depth == r) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int i = 0; i < now.length; i++) {
                temp.add(arr[now[i]]);
            }
            result.add(temp);
            return;
        }
        if (target == n) return;
        now[index] = target;
        combination(arr, depth + 1, index + 1, target + 1);
        combination(arr, depth, index, target + 1);
    }
}

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        int r = 3;

        Combination comb = new Combination(arr.length, r);
        comb.combination(arr, 0, 0, 0);
        ArrayList<ArrayList<Integer>> result = comb.getResult();

        System.out.println("모든 조합의 수: " + result.size());
        for (int i = 0; i < result.size(); i++) {
            for (int j = 0; j < result.get(i).size(); j++) {
                System.out.print(result.get(i).get(j) + " ");
            }
            System.out.println();
        }
    }
}

 

  {1, 3, 5, 7, 9}에서 3개를 뽑는 모든 조합은 다음과 같습니다.

 

728x90
반응형

728x90
반응형

  리눅스에서 GCC 버전을 확인하는 명령어는 다음과 같습니다.

 

gcc --version

 

  명령어를 실행하면 다음과 같이 GCC 버전이 출력됩니다. 저는 Ubuntu 16.04 버전을 사용하고 있는데, GCC 버전이 5.4인 것을 확인할 수 있습니다.

 

 

  참고로 GCC 5.4 버전의 경우 C언어에서는 std=gnu11을 사용하고, C++에서는 std=gnu++98을 사용하고 있습니다. 그리고 GCC 6.3.1부터 10.1.0 버전까지C언어에서는 std=gnu11을 사용하고, C++에서는 std=gnu++14를 사용하고 있습니다. gcc를 사용할 때 standard 값을 명시하지 않으면 기본 값(default)로 이러한 값들이 들어가게 되는 것입니다.

 

  혹은 C 표준 버전을 직접 확인하고 싶을 때 다음의 코드를 이용할 수도 있습니다.

 

#include <stdio.h>

int main() {
    printf("__STDC_VERSION__ = %ld\n", __STDC_VERSION__);
    return 0;
}

 

  실행을 하면 버전(Version) 날짜가 출력되는데, 날짜에 따른 버전은 다음과 같습니다.

 

  * gnu99 = 199901

  * gnu11 = 201112

  * gnu17 = 201710

  * c99 = 199901

  * c11 = 201112

  * c17 = 201710

728x90
반응형

728x90
반응형

  깃허브 저장소(Repository)는 모든 사람에게 공개되는 Public과 원하는 사람에게만 공개되는 Private 설정이 모두 가능합니다. 또한 Public으로 공개된 내용은 Private으로 다시 바꿀 수 있고, 반대로 Private이었던 저장소를 다시 Public으로 바꾸는 것도 가능합니다.

 

  이를 설정하기 위해서는 깃허브 저장소에서 [Settings] 탭으로 이동하시면 됩니다.

 

 

  [Settings] 탭에서 아래로 쭉 내려 보시면 다음과 같이 [Danger Zone] [Change Visibility] 버튼이 있습니다. 이를 클릭해서 해당 저장소가 외부에 보일지 안 보일지를 설정할 수 있습니다.

 

 

  이제 여기에서 현재 저장소의 설정에 따라서 Public ↔ Private 서로 변경이 가능합니다. 예를 들어 Public 상태에서 Private으로 변경하는 경우에는 다음과 같이 설정할 수 있습니다. 참고로 Public 상태에서 Private으로 바꾸게 되면, 당연히 현재 저장소에 달려 있던 별점(Star)을 포함해 각종 정보가 사라지게 됩니다.

 

 

  또한 Private 상태에서 다시 Public 상태로 바꾸는 것 또한 가능합니다.

 

 

  참고로 Private 상태에서 Public 상태로 바꿀 때에는 당연히 저장소의 모든 코드가 외부로 공개되며, 누구나 자신의 코드에 접근하여 포크(Fork)를 진행할 수 있다는 점을 감안해야 합니다. 나중에 다시 Private으로 바꾼다고 하더라도 일단 다른 사람이 제 코드를 이미 모두 가지고 있을 수도 있다고 보아야 하는 겁니다.

 

728x90
반응형

728x90
반응형

  파워포인트(PowerPoint)는 기본적으로 발표 녹화(음성 녹음) 기능을 제공합니다. 그래서 사실 별도의 녹화 프로그램이 없어도 발표를 녹화할 수 있습니다. 방법은 매우 간단합니다.

 

  ※ PPT 발표 녹화 방법 ※

 

  일단 녹화 방법은 [슬라이드 쇼] - [슬라이드 쇼 녹화] - [처음부터 녹음 시작]에 들어가셔서 녹음을 진행할 수 있습니다. 참고로 동영상 저장 될 때 녹음을 하지 않은 슬라이드에 대해서도 저장이 되기 때문에, 녹화하시기 전에 PPT 파일 복사하셔서 먼저 자기 부분 아닌 다른 슬라이드는 지워주는 게 간단한 방법입니다.

 

 

  녹화를 진행할 때는 어디까지 녹화를 진행할 지 설정할 수 있습니다. 다음과 같이 두 개 모두 체크해서 녹화를 진행하는 것이 일반적입니다.

 

 

  녹화가 진행될 때는 왼쪽 상단에 녹화가 어떻게 이루어지고 있는지를 확인할 수 있습니다.

 

 

  녹화가 끝나고 나면 녹화가 된 부분에 대해서는 오른쪽 아래에 [스피커] 표시가 되는 것을 확인할 수 있습니다. 정상적으로 녹음이 이루어졌다는 의미로 보시면 되겠습니다.

 

 

※ PPT 발표 영상 저장하기 ※

 

  녹음 끝나고 난 뒤에는 [파일] - [내보내기] - [비디오 만들기] 탭에서 [비디오 만들기]를 눌러서 동영상을 내보내기 할 수 있습니다.

 

  이 때 발표 PPT 해상도에 맞게 저장될 영상의 해상도를 설정할 수 있으며 [기록된 시간 및 설명 사용]으로 설정을 해주세요. 그러면 자기가 녹화를 진행한 부분에 대해서는 그 내용으로 기록됩니다. 만약 녹음을 진행하지 않은 슬라이드가 있다면, 그 슬라이드에 대해서는 그냥 소리가 빈 영상이 들어가게 됩니다.

 

728x90
반응형

728x90
반응형

  초당 비트 수(Bit Per Second, BPS)1초에 전송할 수 있는 비트의 수를 의미합니다. 예를 들어 500 BPS라면, 초당 500개의 비트를 전송할 수 있다는 의미입니다. 보 레이트(Baud Rate)1초에 전송할 수 있는 의미 있는 정보의 수를 의미합니다. 예를 들어 의미 있는 정보의 단위를 32비트라고 규정할 때, 보 레이트가 500이라면 초당 16,000개의 비트를 전송한다는 의미가 될 것입니다. 다른 예시로 정보의 단위를 1비트라고 할 때, 보 레이트는 BPS와 동일할 것입니다.

 

  기본적으로 Serial 통신을 할 때는 보 레이트(Baud Rate)를 맞추어 통신을 진행합니다. 아두이노는 UART를 이용하여 하드웨어 시리얼과 소프트웨어 시리얼을 지원합니다. 하드웨어 시리얼은 하드웨어적으로 지원하는 RX, TX 핀을 이용하는 방식입니다. 혹은 가상 COM 포트 기능을 이용하여 USB 포트로 시리얼 통신이 가능할 수도 있습니다. 일반적으로 시리얼 통신을 할 때는 Serial.print()와 같은 함수를 이용하고, 하드웨어 시리얼은 Serial1, Serial2과 같은 형태의 라이브러리를 사용합니다.

 

  한 번 다음과 같이 가장 기본적인 아두이노 예제 소스코드를 작성해 봅시다. Serial.read() 함수를 이용하여 한 바이트(Byte)씩 입력을 받을 수 있습니다. 간단한 에코(Echo) 프로그램은 다음과 같습니다.

 

※ 아두이노 시리얼 통신 예제 소스코드 ※

 

void setup() {
    Serial.begin(9600);
}

void loop() {
    int incomingByte;
    if (Serial.available() > 0) {
        incomingByte = Serial.read();
        Serial.print("USB received: ");
        Serial.println(incomingByte, DEC);
    }
}

 

  실제로 위 프로그램을 업로드 한 이후에 시리얼 모니터(Serial Monitor)를 실행하면 다음과 같습니다.

 

 

※ 파이썬으로 호스트(Host) 프로그램 만들기 ※

 

  호스트(Host) 쪽에서 데이터를 보낼 때 별도의 프로그램을 이용할 수도 있습니다. 프로그램은 다음과 같이 작성할 수 있습니다. 프로그래밍 언어는 Python 3.7이며 serial 라이브러리를 이용하면 됩니다.

 

import serial

values = [1, 2, 3, 4, 5, 6, 7, 8, 9]

s = serial.Serial("COM4", 9600)
s.write(b'Hello')
s.write(bytearray(values))

while True:
    data = s.readline()
    print(data)

s.close()

 

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

 

 

  참고로 기본적으로 해당 Serial 포트를 이미 다른 프로세스가 사용 중이라면, 액세스가 거부되었다는 메시지가 출력될 수 있습니다. 오류 메시지는 대략 다음과 같습니다. 아두이노에서 시리얼 모니터가 켜져 있으면 오류가 발생할 수 있습니다.

 

serial.serialutil.SerialException: could not open port 'COM4': PermissionError(13, '액세스가 거부되었습니다.', None, 5)
728x90
반응형

728x90
반응형

  최근에 책을 집필하면서 깃허브에 소스코드를 공개했습니다. 하지만 분명 이 책은 파이썬 책인데, C++ 및 Java 소스코드도 함께 제공하면서 Java의 소스코드가 가장 많은 비중을 차지하게 되었습니다. 이 경우 다음과 같이 저장소의 기본 대표 언어가 Java라고 표시됩니다.

 

 

  대표 언어를 Java가 아닌 Python으로 변경하기 위해서는 어떻게 하면 될까요? 바로 .gitattributes 파일을 만드시면 됩니다. 말 그대로 깃 속성을 관리하는 파일인데요. 이를 추가해서 파일 확장자에 따라서 저장소가 어떻게 인식할 지를 설정할 수 있습니다. 저는 저장소 내에 파이썬, C++, Java 코드만 존재하기 때문에 파이썬만 감지되고 나머지는 무시되도록 하였습니다.

*.py linguist-detectable=true
*.cpp linguist-detectable=false
*.java linguist-detectable=false

 

  다음과 같이 저장소의 루트 경로에 .gitattributes 파일을 생성하여 작성해주면 됩니다.

 

 

  파일을 만든 뒤에는 다음과 같이 정상적으로 대표 언어가 파이썬으로 변경되었습니다.

 

728x90
반응형

728x90
반응형

  윈도우에서 다양한 버전의 파이썬(Python)을 설치하면 다음과 같이 C 드라이브에 설치됩니다. 다만 기본적으로 설치한 뒤에 명령 프롬프트(CMD)에서 python이라고 입력하면 둘 중 하나만 실행됩니다. 그렇다면 윈도우(Windows)에서 두 개의 파이썬 버전을 동시에 이용하기 위해서 어떻게 할 수 있을지 알아보도록 하겠습니다.

 

 

  이때 mklink 명령어를 이용할 수 있습니다. 이는 일종의 바로 가기 링크를 만드는 명령어입니다.

 

※ Python 3 설정 ※

 

  먼저 Python3은 다음과 같이 설정할 수 있습니다.

 

mklink C:\Windows\python3.exe [Python 3이 설치된 경로]
mklink C:\Windows\pip3.exe [Python 3의 PIP가 설치된 경로]

 

  저의 경우 다음과 같이 입력하면 되었습니다.

 

mklink C:\Windows\python3.exe C:\Python37\python.exe
mklink C:\Windows\pip3.exe C:\Python37\Scripts\pip.exe

 

  위와 같이 링크를 만든 뒤에 python3 및 pip3 이라고 명령어를 입력하면 다음과 같이 출력되는 것을 확인할 수 있습니다.

 

 

※ Python 2 설정 ※

 

  Python 2 버전에서도 마찬가지로 진행할 수 있습니다.

 

728x90
반응형