안경잡이개발자

728x90
반응형

  포항공대에서 학생회관이나 지곡회관의 회의실을 예약할 때는 POPO를 사용할 수 있다. 나는 포항공대에서 2년을 있었는데, 연구실에만 있다 보니까 회의실 예약하는 방법도 모르고 있었다. 학생회관 대회의실을 포함하여 다양한 회의실에 대하여 경우 동아리 활동을 하지 않는 일반적인 학생들도 예약할 수 있는 것으로 보인다.

 

  ▶ POPO 사이트: http://popo.postech.ac.kr/

 

POPO - 포포

POstenchian's POrtal, POPO 입니다!

popo.postech.ac.kr

 

  접속한 뒤에 로그인한다. 그리고 [장소 예약] 버튼을 눌러 예약 페이지로 들어갈 수 있다.

 

 

  이후에 원하는 장소를 골라 [예약하기] 버튼을 누른다.

 

 

  원하는 날짜와 시간을 설정하여 [예약]을 진행하면 된다.

 

728x90
반응형

Comment +0

728x90
반응형

  PyTorch에서는 ImageFolder 라이브러리를 제공하는데, 다음과 같이 계층적인 폴더 구조에서 데이터셋을 불러올 때 사용할 수 있다. 다음과 같이 각 이미지들이 각 클래스명(class name)을 갖는 폴더 안에 들어가 있는 구조라면, ImageFolder 라이브러리를 이용해 바로 불러올 수 있다.

 

dataset/
    class 0/
        0.jpg
        1.jpg
        ...
    class 1/
        0.jpg
        1.jpg
        ...
    ...
    class 9/
        0.jpg
        1.jpg
        ...


  이러한 ImageFolder 형식을 가지고 있지 않은 데이터셋 예제를 불러와서, ImageFolder 형식에 맞게 변형해 보겠다. 한 번 다음의 데이터셋 예제를 확인해 보자.

 

  ▶ Scene Classification Dataset 예제https://github.com/ndb796/Scene-Classification-Dataset

 

GitHub - ndb796/Scene-Classification-Dataset

Contribute to ndb796/Scene-Classification-Dataset development by creating an account on GitHub.

github.com

 

  기본적으로 Scene Classification Dataset은 25,000개가량의 다양한 자연 경치(scene) 이미지로 구성되어 있다. 이때 각 이미지에 대하여 카테고리(category) 정보가 주어진다. 먼저 다음과 같은 코드로 전체 이미지 데이터를 다운로드한다.

 

# 깃허브에서 데이터셋 다운로드하기
!git clone https://github.com/ndb796/Scene-Classification-Dataset
# 폴더 안으로 이동
%cd Scene-Classification-Dataset

 

  이때 데이터셋 폴더 구성은 다음과 같다.

 

Dataset/
    train-scene classification/
        train/ # 전체 이미지가 담긴 폴더입니다.
            0.jpg
            1.jpg
            2.jpg
            ...
            24333.jpg
            24334.jpg
        train.csv # 학습 이미지마다 클래스(class) 정보가 포함되어 있습니다.
    test_WyRytb0.csv # 최종 테스트(test) 이미지의 번호를 포함하며, 본 실습에서 사용하지 않습니다.

 

 

  장면(scene) 데이터셋은 정확히 24,335개의 다양한 자연 경치(scene) 이미지로 구성되어 있다. 이때 각 이미지는 150 X 150 크기를 가진다. 또한, 총 6개의 클래스(class)로 구성된다. 전체 클래스 목록은 다음과 같다.

 

    0. 빌딩(buildings)
    1. 숲(forests)
    2. 빙하(glacier)
    3. 산(mountains)
    4. 바다(sea)
    5. 거리(street)

 

  이때 다음과 같은 방법으로 학습 이미지의 개수를 확인할 수 있다. 구체적으로 os 라이브러리의 os.listdir()를 이용하여 이미지 폴더에 존재하는 파일 이름을 확인할 수 있다. 예를 들어 다음과 같은 코드로 이미지의 개수를 확인할 수 있다.

 

import os
import pandas as pd


path = 'train-scene classification/'

# 전체 이미지 개수 출력하기
file_list = os.listdir(path + 'train/')
print('전체 이미지의 개수:', len(file_list))

# 학습 이미지 확인하기
dataset = pd.read_csv(path + 'train.csv')
print('학습 이미지의 개수:', len(dataset))
print('학습 이미지별 클래스 정보')
dataset.head()

 

 

  실행 결과는 다음과 같다.

 

 

  이때 클래스별 학습 이미지의 개수를 구하고자 한다면 다음과 같이 할 수 있다.

 

import matplotlib.pyplot as plt
import seaborn as sns

plt.rcParams['figure.figsize'] = (8.0, 6.0) # 그림의 기본 크기 설정

# 각 클래스별 개수 출력
print('클래스 0의 개수:', len(dataset[dataset.label == 0]))
print('클래스 1의 개수:', len(dataset[dataset.label == 1]))
print('클래스 2의 개수:', len(dataset[dataset.label == 2]))
print('클래스 3의 개수:', len(dataset[dataset.label == 3]))
print('클래스 4의 개수:', len(dataset[dataset.label == 4]))
print('클래스 5의 개수:', len(dataset[dataset.label == 5]))

# 각 클래스에 따른 학습 이미지의 개수를 출력하기
fig, ax = plt.subplots(figsize = (10, 4)) # 그림 크기 설정
sns.countplot(x ='label', data=dataset)
plt.xlabel("Class Label")
plt.ylabel("Number of Samples")
plt.show()

 

  실행 결과는 다음과 같다.

 

 

  이때 특정한 이미지를 불러와 화면에 출력하고자 한다면 다음과 같이 할 수 있다. 아래 코드는 첫 번째 이미지를 불러와 화면에 출력하는 코드다.

 

from skimage.transform import resize
from PIL import Image
import numpy as np


img = Image.open(path + 'train/' + file_list[0])
img = np.asarray(img)
img = resize(img, (64, 64, 3))
print('이미지의 해상도:', img.shape)

# 이미지 출력하기
plt.imshow(img)
plt.show()

 

  실행 결과는 다음과 같다.

 

 

  이어서 학습/검증 데이터셋을 나눌 수 있다. 이때 간단히 sklearn 라이브러리 train_test_split()을 이용하면 된다. 예를 들어 학습 이미지 데이터를 8:2 비율로 학습(training)과 검증(validation)으로 나누는 예제는 다음과 같다.

 

from sklearn.model_selection import train_test_split


train_dataset, val_dataset = train_test_split(dataset, test_size=0.2)

print('학습 데이터셋 크기:', len(train_dataset))
print('검증 데이터셋 크기:', len(val_dataset))

 

  실행 결과는 다음과 같다. 이제 결과적으로 데이터셋이 나누어진 것이다.

 

 

  이제 나누어진 데이터셋을 적절한 폴더에 저장하기 위해 다음과 같이 먼저 폴더를 만든다. 클래스 개수가 6개뿐이므로, 간단히 다음과 같이 모든 폴더를 만들 수 있다.

 

!mkdir Scene-Classification-Dataset-Split
!mkdir Scene-Classification-Dataset-Split/train
!mkdir Scene-Classification-Dataset-Split/train/buildings
!mkdir Scene-Classification-Dataset-Split/train/forests
!mkdir Scene-Classification-Dataset-Split/train/glacier
!mkdir Scene-Classification-Dataset-Split/train/mountains
!mkdir Scene-Classification-Dataset-Split/train/sea
!mkdir Scene-Classification-Dataset-Split/train/street
!mkdir Scene-Classification-Dataset-Split/val
!mkdir Scene-Classification-Dataset-Split/val/buildings
!mkdir Scene-Classification-Dataset-Split/val/forests
!mkdir Scene-Classification-Dataset-Split/val/glacier
!mkdir Scene-Classification-Dataset-Split/val/mountains
!mkdir Scene-Classification-Dataset-Split/val/sea
!mkdir Scene-Classification-Dataset-Split/val/street

 

  실행하면 다음과 같이 전체 폴더가 구성되는 것을 확인할 수 있다.

 

 

  이제 ImageFolder 형식에 맞게 이미지를 저장해보자. 모든 이미지는 (64 X 64 X 3) 형식으로 resize하여 저장한다.

 

import time


classes = ['buildings', 'forests', 'glacier', 'mountains', 'sea', 'street']

######### 학습 데이터셋 #########
start_time = time.time() # 시작 시간

# 데이터 정보를 하나씩 확인하며
for index, row in train_dataset.iterrows():
    # 이미지 정보를 배열에 담기
    img = Image.open(path + 'train/' + row['image_name'])
    img = np.asarray(img)
    img = resize(img, (64, 64, 3))
    img = Image.fromarray((img * 255).astype(np.uint8))
    saved = 'Scene-Classification-Dataset-Split/train/' + classes[row['label']] + '/' + str(index) + '.png'
    img.save(saved, 'PNG')

print("소요된 시간(초 단위):", time.time() - start_time) # 실행 시간

######### 검증 데이터셋 #########
start_time = time.time() # 시작 시간

# 데이터 정보를 하나씩 확인하며
for index, row in val_dataset.iterrows():
    # 이미지 정보를 배열에 담기
    img = Image.open(path + 'train/' + row['image_name'])
    img = np.asarray(img)
    img = resize(img, (64, 64, 3))
    img = Image.fromarray((img * 255).astype(np.uint8))
    saved = 'Scene-Classification-Dataset-Split/val/' + classes[row['label']] + '/' + str(index) + '.png'
    img.save(saved, 'PNG')

print("소요된 시간(초 단위):", time.time() - start_time) # 실행 시간

 

  이후에 만들어진 폴더를 압축(.zip)하여 저장한다.

 

!zip -r Scene-Classification-Dataset-Split.zip ./Scene-Classification-Dataset-Split/*
728x90
반응형

Comment +0

728x90
반응형

  저는 Adobe Acrobat Pro DC를 이용하고 있습니다. 자신이 수정하고자 하는 PDF 파일을 Adobe Acrobat Pro DC를 이용해 PDF 파일을 열어줍니다. 저는 간단히 강의 자료를 열어 주었으며, 이후에 [페이지 구성] 버튼을 눌러줍니다.

 

 

  [페이지 구성]을 연 뒤에는 다음과 같이 자신이 원하는 페이지를 선택하여 삽입, 추출, 교체, 삭제 등의 작업을 수행할 수 있습니다.

 

 

  PDF 파일의 수정이 완료되면 다음과 같이 [파일] - [다른 이름으로 저장]을 눌러 저장할 수 있습니다.

 

728x90
반응형

Comment +0

728x90
반응형

  세 개의 릴레이션이 있는 상황을 가정합시다. 실습으로 다루고자 하는 데이터베이스사원(Employee), 회사(Company), 소속(Affiliation) 세 가지 테이블로 구성됩니다. 그 세부적인 정보는 다음과 같습니다.

 

※ 사원(Employee) 릴레이션 ※

 

  사원의 이름, 거주 도시 정보를 포함하고 있습니다.

 

Employee_ID Employee_Name Employee_City
1 Seo 청주
2 Chung 서울
3 Lee 인천
4 Kim 대전
5 Park 서울
6 Moon 서울

 

※ 회사(Company) 릴레이션 ※

 

  회사의 이름, 회사가 위치한 도시 정보를 포함하고 있습니다.

 

Company_Name Company_City
SK 인천
LG 청주
삼성 서울

 

※ 소속(Affiliation) 릴레이션 ※

 

  사원의 번호, 회사의 이름, 연봉 정보를 포함하고 있습니다. 즉, 어떠한 사원이 어떠한 회사에서 일을 하고 있는지에 대한 정보를 담고 있습니다.

 

Employee_ID Company_Name Pay
1 SK 10000
2 LG 900
3 삼성 30000
4 삼성 50000
5 삼성 100
6 LG 200

 

※ 데이터베이스 구축하기 ※

 

  다음과 같이 데이터베이스를 생성하고, 테이블을 구축하여 기본적인 데이터를 삽입할 수 있습니다.

 

/* 사원(Employee) 테이블 */
CREATE TABLE Employee(
    Employee_ID INT PRIMARY KEY,
    Employee_Name TEXT,
    Employee_City TEXT
);

INSERT INTO Employee VALUES (1, 'Seo', '청주');
INSERT INTO Employee VALUES (2, 'Chung', '서울');
INSERT INTO Employee VALUES (3, 'Lee', '인천');
INSERT INTO Employee VALUES (4, 'Kim', '대전');
INSERT INTO Employee VALUES (5, 'Park', '서울');
INSERT INTO Employee VALUES (6, 'Moon', '서울');

/* 회사(Company) 테이블 */
CREATE TABLE Company(
    Company_Name TEXT PRIMARY KEY,
    Company_City TEXT
);

INSERT INTO Company VALUES ('SK', '인천');
INSERT INTO Company VALUES ('LG', '청주');
INSERT INTO Company VALUES ('삼성', '서울');

/* 소속(Affiliation) 테이블 */
CREATE TABLE Affiliation(
    Employee_ID INT,
    Company_Name TEXT,
    Pay INT
);

INSERT INTO Affiliation VALUES (1, 'SK', 10000);
INSERT INTO Affiliation VALUES (2, 'LG', 900);
INSERT INTO Affiliation VALUES (3, '삼성', 30000);
INSERT INTO Affiliation VALUES (4, '삼성', 50000);
INSERT INTO Affiliation VALUES (5, '삼성', 100);
INSERT INTO Affiliation VALUES (6, 'LG', 200);

 

Q1. 회사명이 'LG'인 회사에서 일하는 모든 사원의 이름과 거주하는 도시들을 출력합니다.

SELECT e.Employee_Name, e.Employee_City
    FROM Employee as e, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND a.Company_Name = "LG";

 

Q2. 소속한 회사가 위치한 도시와 다른 도시에 거주하는 모든 사원의 이름, 소속 회사 이름, 소속 회사의 도시, 사원이 거주하는 도시를 출력합니다.

SELECT e.Employee_Name, c.Company_Name, c.Company_City, e.Employee_City
    FROM Employee as e, Company as c, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND c.Company_Name == a.Company_Name
        AND e.Employee_City != c.Company_City;

 

Q3. 각 회사별로 회사 이름과 사원의 수, 평균 월급을 출력합니다.

 

  간단한 버전은 다음과 같습니다.

SELECT a.Company_Name, COUNT(a.Employee_ID), AVG(a.Pay)
    FROM Affiliation as a
    GROUP BY a.Company_Name;

  조금 더 어렵게 작성 소스코드 버전은 다음과 같습니다.

SELECT c.Company_Name, COUNT(e.Employee_ID), AVG(a.Pay)
    FROM Employee as e, Company as c, Affiliation as a
    WHERE e.Employee_ID == a.Employee_ID
        AND c.Company_Name == a.Company_Name
    GROUP BY a.Company_Name;

 

Q4. 각 회사별로 소속 사원들의 평균 월급보다 높은 월급을 받는 종업원들의 사원의 번호, 회사 이름, 월 급여, 해당 회사의 평균 월급을 출력합니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay, c_sum.Pay
    FROM Affiliation as a, (SELECT t.Company_Name, AVG(t.Pay) as Pay FROM Affiliation as t GROUP BY t.Company_Name) as c_sum
    WHERE a.Company_Name == c_sum.Company_Name
        AND a.Pay > c_sum.Pay;

 

Q5. 'LG'의 (하나 혹은 여러) 사원보다 월급을 많이 받는 모든 사원들의 사원의 번호, 회사 이름, 월 급여를 출력합니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay
    FROM Affiliation as a, (SELECT MIN(t.Pay) as Pay FROM Affiliation as t WHERE t.Company_Name == "LG") as c_sum
    WHERE a.Pay > c_sum.Pay;

혹은 다음과 같이 할 수 있습니다.

SELECT a.Employee_ID, a.Company_Name, a.Pay
    FROM Affiliation as a
    WHERE a.Pay > (SELECT MIN(t.Pay) as Pay FROM Affiliation as t WHERE t.Company_Name == "LG");

728x90
반응형

Comment +0

728x90
반응형

  네이버에 "주식 거래 시간"을 검색하면 다음과 같은 정보가 나온다.

 

 

  위 표에 나와 있듯이 국내 주식 매매 거래 시간의 정규시간09:00~15:30이다.

 

  기본적으로 해당 날짜에 형성된 종가의 위아래로 10% 이내의 가격을 [시간 외 단일가]라고 한다. 장이 마감한 이후에도 이러한 [시간 외 단일가]16:00~18:00 사이에 거래할 수 있다. 이때 16:00~18:00 사이에서 매 10분마다 1번씩 거래가 체결된다. 예를 들어 16:00~16:10까지의 주문을 모아서 16:10에 체결을 진행하고, 또 16:10~16:20까지의 주문을 모아서 16:20에 체결을 진행하는 방식이다.

  그래서 16:00 시간대 이후라고 해도 갑자기 호재가 터지는 경우에는 매수 주문이 많아져서, 시간 외 상한가에 도달하는 경우도 있다. 이런 경우에는 시간 외 상한가다음날 종목 시세에 영향을 미쳐서, 장 시작과 동시에 상승장이 시작되기도 한다.

 

※ 키움증권 웹 사이트(웹 트레이딩, WTS)을 이용해 시외가 보는 방법 ※

 

  시외가를 보는 방법은 간단하다. 먼저 키움증권 웹 사이트에 로그인하자. 이후에 [주식주문(웹트레이딩)] 버튼을 누른다.

 

  이후에 원하는 종목을 선택한 뒤에 오른쪽 위에 있는 [시간 외 단일가] 버튼을 누른다. 예를 들어 필자는 HMM을 종목으로 선택했으며, [시간 외 단일가]를 확인한 결과 43,050원으로 가격이 형성된 것을 확인할 수 있었다.

 

728x90
반응형

Comment +0

728x90
반응형

  DB Browser for SQLite (DB4S)SQLite과 호환되는 데이터베이스 설계 및 수정 소프트웨어입니다. 웹 사이트에 방문한 뒤에 간단하게 설치하여 곧바로 사용할 수 있습니다. DB4S는 다음의 웹 사이트에 방문하여 상세한 정보를 확인할 수 있습니다.

 

  ▶ DB Browser for SQLite 공식 홈페이지: https://sqlitebrowser.org/

 

  DB4S 공식 페이지에 접속한 뒤에 [Download] 페이지로 이동하면 다음과 같은 화면을 확인할 수 있습니다. 자신의 운영체제에 맞는 설치 프로그램을 다운로드받으면 됩니다. 저는 윈도우(Windows) 운영체제에 맞는 64-bit 버전의 프로그램을 다운로드했습니다.

 

 

  설치 프로그램을 실행하여, 가장 먼저 라이센스에 동의하고 설치를 진행합니다.

 

 

  다음과 같이 설정을 진행합니다.

 

 

  이후에 설치(install)를 진행하면 됩니다. 설치 이후에는 실행 프로그램을 실행하여 열 수 있습니다.

 

 

※ 데이터베이스 생성하기 ※

 

  [새 데이터베이스] 버튼을 눌러 새로운 데이터베이스를 생성할 수 있습니다.

 

 

  예를 들어 다음과 같이 test.db라는 이름의 데이터베이스를 생성할 수 있습니다.

 

 

  데이터베이스가 생성되면 다음과 같이 [데이터베이스 구조] 탭에서 데이터베이스의 정보를 확인할 수 있습니다.

 

 

  이후에 [SQL 실행] 탭으로 이동하여 자신이 원하는 SQL 쿼리를 입력할 수 있습니다.

 

728x90
반응형

Comment +0

728x90
반응형

  파이썬의 경우 sqlite3표준 라이브러리로 제공하고 있다. 그래서 파이썬을 설치했다면, 별다른 추가 설치 없이 sqlite3을 이용할 수 있다. sqlite3은 다음과 같이 불러 올 수 있다. 참고로 아래 소스코드를 실행하면 '3.21.0'와 같은 SQLite의 버전명이 출력된다. 이것은 파이썬 라이브러리 버전은 아니고, SQLite의 버전으로 이해할 수 있다.

 

import sqlite3


print(sqlite3.sqlite_version)

 

※ 데이터베이스 생성 ※  

 

  데이터베이스를 생성할 때는 간단히 connect() 메서드를 사용하면 된다. 이때 메서드의 인자로 넣은 값이 데이터베이스 파일의 경로가 된다. 예를 들어 'my_database.db'라는 파일을 생성하고자 한다면 다음과 같이 한다. 현재 'my_database.db'라는 데이터베이스 파일이 없기 때문에, 새롭게 생성된 것을 확인할 수 있다.

 

 

※ 테이블 생성 ※

 

  SQL 구문을 이용하기 위해서는 cursor 객체가 필요하다. cursor 객체를 이용하여 실제로 데이터베이스에 테이블(table)을 삽입하거나, 테이블(table)을 조회할 수 있다. 예를 들어 다음의 명령어는 Course(과목)라는 이름의 테이블을 생성한다. 이후에 생성된 테이블 정보를 조회한다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "CREATE TABLE Course (Course_ID int primary key not null, Course_Name text, Course_Date date);"
cursor.execute(SQL)

SQL = "SELECT name FROM sqlite_master WHERE type='table';"
cursor.execute(SQL)
print(cursor.fetchall())

SQL = "SELECT sql FROM sqlite_master WHERE type='table';"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

  실행 결과는 다음과 같다.

 

[('Course',)]
[('CREATE TABLE Course (Course_ID int primary key not null, Course_Name text, Course_Date date)',)]

 

※ 데이터 삽입 ※

 

  데이터를 삽입할 때는 INSERT 구문을 사용한다. 참고로 데이터를 삽입(insert)하는 명령어를 실행한 뒤에 데이터베이스에 반영하기 위해 commit() 메서드를 호출해야 한다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "INSERT INTO Course VALUES(1, 'Algorithm', '2021-03-01');"
cursor.execute(SQL)
SQL = "INSERT INTO Course VALUES(2, 'Data Structure', '2021-03-02');"
cursor.execute(SQL)
SQL = "INSERT INTO Course VALUES(3, 'Computer Architecture', '2021-03-05');"
cursor.execute(SQL)
con.commit()

SQL = "SELECT * FROM Course;"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

  실행 결과는 다음과 같다.

 

[(1, 'Algorithm', '2021-03-01'), (2, 'Data Structure', '2021-03-02'), (3, 'Computer Architecture', '2021-03-05')]

 

※ 데이터 삭제 ※

 

  데이터 삭제는 DELETE 구문을 사용하면 된다. 예를 들어 Course 테이블에 있는 모든 데이터(row)를 삭제하기 위해서는 다음과 같이 하면 된다. INSERT 구문과 마찬가지로 실행 뒤에 commit() 메서드를 이용해 DB에 반영할 수 있다. 위 코드를 실행하면 Course 테이블에 존재하는 모든 데이터가 삭제되기 때문에, 조회 결과가 없다.

 

import sqlite3


con = sqlite3.connect('./my_database.db')

cursor = con.cursor()

SQL = "DELETE FROM Course;"
cursor.execute(SQL)
con.commit()

SQL = "SELECT * FROM Course;"
cursor.execute(SQL)
print(cursor.fetchall())

con.close()

 

 

※ 하나의 테이블로 구성되는 간단한 데이터베이스 연동 프로그램 예시 ※

 

  파이썬에서 SQLite 3 문법을 활용한 간단한 데이터베이스 연동 프로그램은 다음과 같다.

 

import sqlite3

database_name = './my_database.db'

con = sqlite3.connect(database_name)
cursor = con.cursor()
SQL = "CREATE TABLE IF NOT EXISTS Course (Course_ID int primary key not null, Course_Name text, Course_Date date);"
cursor.execute(SQL)
con.close()


def insert_course(course_id, course_name, course_date):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "INSERT INTO Course VALUES(?, ?, ?);"
    cursor.execute(SQL, (course_id, course_name, course_date))

    con.commit()
    con.close()


def insert_course_list(course_list):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "INSERT INTO Course VALUES(?, ?, ?);"
    cursor.executemany(SQL, course_list)

    con.commit()
    con.close()


def search_course_by_name(course_name):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course WHERE course_name = ?;"
    cursor.execute(SQL, (course_name, ))

    return cursor.fetchall()


def search_course():
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course;"
    cursor.execute(SQL)

    return cursor.fetchall()


def search_course_order_by_date(limit):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "SELECT * FROM Course ORDER BY date(course_date) ASC Limit ?;"
    cursor.execute(SQL, (limit, ))

    return cursor.fetchall()


def update_course_by_id(course_id, course_name, course_date):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "UPDATE Course SET course_name = ?, course_date = ? WHERE course_id = ?;"
    cursor.execute(SQL, (course_name, course_date, course_id))

    con.commit()
    con.close()


def delete_course_by_id(course_id):
    con = sqlite3.connect(database_name)
    cursor = con.cursor()

    SQL = "DELETE FROM Course WHERE course_id = ?;"
    cursor.execute(SQL, (course_id, ))

    con.commit()
    con.close()


delete_course_by_id(1)
delete_course_by_id(2)
delete_course_by_id(3)
delete_course_by_id(4)
delete_course_by_id(5)
insert_course(1, 'Algorithm', '2021-03-01')
insert_course(2, 'Data Structure', '2021-03-02')
insert_course(3, 'Computer Architecture', '2021-03-05')
course_list = [
    (4, 'Programming Language', '2021-03-04'),
    (5, 'Compiler', '2021-03-01'),
]
insert_course_list(course_list)
print(search_course_by_name('Algorithm'))
update_course_by_id(1, 'Cyber Security', '2021-03-03')
print(search_course())
print(search_course_order_by_date(100))
print(search_course_order_by_date(100)[::-1])

 

  실행 결과는 다음과 같다.

 

[(1, 'Algorithm', '2021-03-01')]
[(1, 'Cyber Security', '2021-03-03'), (2, 'Data Structure', '2021-03-02'), (3, 'Computer Architecture', '2021-03-05'), (4, 'Programming Language', '2021-03-04'), (5, 'Compiler', '2021-03-01')]
[(5, 'Compiler', '2021-03-01'), (2, 'Data Structure', '2021-03-02'), (1, 'Cyber Security', '2021-03-03'), (4, 'Programming Language', '2021-03-04'), (3, 'Computer Architecture', '2021-03-05')]
[(3, 'Computer Architecture', '2021-03-05'), (4, 'Programming Language', '2021-03-04'), (1, 'Cyber Security', '2021-03-03'), (2, 'Data Structure', '2021-03-02'), (5, 'Compiler', '2021-03-01')]

 

※ 날짜 관련 코드 ※

 

  참고로 현재 시각과 같은 날짜 및 시간 데이터가 필요할 때는 다음의 코드를 활용할 수 있다.

 

import sqlite3

database_name = './my_database.db'


con = sqlite3.connect(database_name)
cursor = con.cursor()

# 세계표준시
SQL = "SELECT strftime('%Y-%m-%d %H:%M:%S', 'now');"
cursor.execute(SQL)
print(cursor.fetchall())

# 현지시간
SQL = "SELECT strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime');"
cursor.execute(SQL)
print(cursor.fetchall())

 

  실행 결과는 다음과 같은 형태를 갖는다.

 

[('2021-07-18 12:09:18',)]
[('2021-07-18 21:09:18',)]
728x90
반응형

Comment +0

728x90
반응형

※ 이 글은 그냥 개인적으로 서비스를 사용해 본 후기 및 정보성 글입니다. 미리캔버스로부터 어떠한 지원도 받지 않았으며, 잘못된 정보가 포함되어있을 수 있습니다. ※

 

※ 미리캔버스 소개 ※

 

  ① 취직 및 이직을 준비할 때는 포트폴리오 PPT를 만들어야 하는 경우가 있다. 그리고 ② 대학교나 회사에서 발표할 때 다양한 PPT 양식이 필요한 경우도 많이 있다. 또한 ③ 유튜브 영상을 만들 때 썸네일이 필요한 경우가 많다. 이러한 상황에서 쉽게 사용할 수 있는 서비스로는 [미리캔버스]가 있다. 한 번 사용해 봤는데, 꽤 트렌디한 디자인 템플릿을 제공하고 있길래 리뷰해 보았다.

 

  미리캔버스의 장점은 PPT 설치 없이 단순히 웹 화면에서 PPT를 만들 수 있다는 점이다. 즉, 파워포인트와 같은 프로그램을 설치할 필요 없이, 단순히 웹 브라우저에서 나의 포트폴리오 PPT를 만들거나 썸네일을 만들 수 있다. 미리캔버스는 다음의 웹 사이트에 방문하여 곧바로 사용할 수 있다.

 

  ▶ 미리캔버스 웹 사이트: https://www.miricanvas.com/

 

미리캔버스

저작권 걱정 없는 완전 무료 디자인툴 미리캔버스

www.miricanvas.com

 

  접속 이후에는 다음과 같이 [회원가입] 버튼을 눌러서 가입을 진행한다.

 

 

  다음과 같이 간단하게 회원가입을 진행할 수 있다.

 

 

※ 미리캔버스를 이용해 디자인하기 ※

 

  미리캔버스를 이용해 디자인하는 방법은 간단하다. 로그인 이후에 [바로 시작하기] 버튼을 누르면 된다. 혹은 직접 디자인 페이지에 접속하여 프레젠테이션 자료를 제작할 수 있다.

 

  ▶ 미리캔버스 디자인 페이지https://www.miricanvas.com/design

 

미리캔버스

저작권 걱정 없는 완전 무료 디자인툴 미리캔버스

www.miricanvas.com

 

 

  디자인 페이지 접속 이후에는 다음과 같이 [해상도]를 설정한 뒤에 [검색어]를 입력하면 된다. 필자의 경우 [개발자 포트폴리오]라는 내용으로 검색했고, 눈에 띄는 포트폴리오 양식을 하나 선택했다.

 

 

  이후에 [이 템플릿으로 덮어쓰기] 버튼을 누르면 다음과 같이 템플릿을 가져올 수 있다. 가져온 뒤에는 가장 먼저 [제목]을 내가 원하는 내용으로 바꾸어서 작성하면 된다.

 

 

  이후에 자신의 입맛대로 PPT 내용을 바꾸면 된다. 필자의 경우 다음과 같이 첫 번째 페이지두 번째 페이지의 내용을 꾸며 보았다. 글자의 경우 단순히 더블 클릭하여 내용을 수정하면 되고,  이미지의 경우도 내가 원하는 이미지를 페이지 내부로 복사/붙여넣기해서 넣으면 끝이다.

 

 

※ 완성된 디자인(PPT) 다운로드하기 ※

 

  완성된 PPT를 다운로드하는 방법은 간단하다. [다운로드] 버튼을 누르고 [웹용]인지 [인쇄용]인지 원하는 것을 선택하면 된다. 일반적으로 가장 많이 사용되는 설정은 [웹용]으로 다운로드하는 것이다.

 

  ▶ 웹용으로 다운로드

 

  일반적으로 많이 사용되는 것은 [PDF] 형식으로 [고해상도 다운로드]를 하는 것이다. 이때 [고해상도 다운로드]로 다운로드를 하는 것을 추천한다. 빠른 다운로드를 이용하면, 확대했을 때 이미지의 해상도가 깨지는 경우가 있기 때문이다. 또한 [PPT] 형식으로 다운로드하는 것도 많이 사용된다. 이때 [텍스트 편집 가능]으로 선택하면, PPT에 사용되는 텍스트를 편집할 수 있지만, 경우에 따라서 PC에 폰트를 설치할 필요가 있다.

 

 

▶ 인쇄용으로 다운로드

 

  인쇄용으로 다운로드를 진행하면, 고화질 PDF 자료를 얻을 수 있다. 다만 용량이 매우 크기 때문에, 말 그대로 인쇄 목적일 때만 사용하는 것이 좋다. 사실 [웹용]에서 [고해상도 다운로드]를 이용하더라도 충분히 좋은 해상도의 결과물을 다운로드할 수 있기 때문이다.

 

 

※ 참고사항 ※

 

  또한 미리캔버스를 이용해 만든 결과물은 상업적으로 이용할 수 있다고 한다. 다만 이 글을 작성할 시점을 기준으로 몇 가지 저작권 관련 유의사항이 있다. 일반적인 저작권 관련 내용이기도 하므로 꼭 참고하자.

 

  ▶ 미리캔버스 템플릿에서 특정 요소 1개만 사용하는 것은 안 된다. (미리캔버스 PPT에 포함된 특정 그림 하나만 가져가 쓰는 등, PPT 파일에 포함된 요소를 다른 문서에 사용할 수 없다.)

  ▶ 미리캔버스 PPT에 포함되지 않은, 직접 추가한 요소는 본인이 직접 저작권을 확인해야 한다.

  ▶ 미리캔버스에서 만든 자료를 다운로드해 사용할 때는 폰트 저작권을 확인해야 한다. 예를 들어 PPT 양식을 다운로드할 때 [텍스트 편집 가능] 옵션으로 다운로드를 진행하는 경우, PC에 설치된 폰트를 사용하게 된다. 이때 PC에 설치된 폰트의 경우 미리캔버스에서 제공하는 것이 아니므로, 직접 폰트 저작권을 확인해야 한다.

  ▶ 미리캔버스에서 다운로드한 PPT 파일은 공유 및 배포가 불가능하다. 쉽게 말해 그냥 미리캔버스 사이트에서 바로 작업을 한 뒤에 PDF 파일로 내보내기하는 것이 가장 권장된다고 볼 수 있다.

  ▶ 미리캔버스에 포함된 인물 사진은 모델의 명예를 훼손하는 내용에 사용할 수 없다. (인물 사진에는 초상권 및 인격권이라는 것이 별도로 존재하므로, 모델이 불쾌감을 느낄만한 용도로 사용하면 안 된다. 당연하다.)

728x90
반응형

Comment +0

728x90
반응형

  필자는 구독자 13만 정도의 규모가 작은 유튜브 채널 하나를 운영하고 있다. 가끔 연기 콘텐츠(재미 위주의 개그 영상)를 올리고 있는데, 이러한 경우 배우가 필요하기 때문에 혼자서 영상을 만들기 쉽지 않다. 그래서 주변 친구를 배우로 섭외해야 할 필요가 있다. 사실 본인을 포함해 유튜버들이 간단하게 만드는 짧은 (재미 위주의) 영상들은 퀄리티 욕심이 없는 경우가 많다. 이럴 때는 그냥 간단히 주변 지인과 함께 영상을 촬영하는 것이다. 촬영도 내가 하고, 편집도 내가 하는 방식이다. 이렇게 하면 자유도가 높아서 배우들 의견을 반영하여 촬영을 여러 번 진행하는 것도 가능하다.


1. 지인 및 유튜버

  주변에 알고 있는 지인이나 유튜버 친구에게 연락해서 같이 영상 찍으면 된다. 혹은 주변 친구들한테 물어보면 연극영화과와 같이 관련 학과를 다니고 있는 친구들을 소개받을 수 있다. 동아리 선후배한테 부탁하는 경우도 굉장히 흔하다.

2. 필름메이커스

  단순히 친구를 섭외하는 것이 아니라 배우를 섭외하고 싶다면, 필름메이커스에 접속해서 [배우 프로필] 페이지로 해보자. 배우님들의 프로필이 올라와 있는데, 이메일 주소, 홈페이지나 인스타그램 아이디가 같이 적혀 있는 경우가 많다. 배우 정보 열람 자체는 무료인 것 같다. 개인적으로 메일이나 DM을 보내서 섭외하면 된다.

 

  ▶ 필름메이커스 액터스 커뮤니티 링크: https://www.filmmakers.co.kr/actorsForum

 

필름메이커스 커뮤니티 - 액터스 포럼

한국영화를 만드는 사람들, 스탭과 배우들의 커뮤니티 입니다.

www.filmmakers.co.kr

 

3. 각종 재능 판매 사이트

  크몽과 같은 다양한 재능 판매 사이트에서 직접적으로 자신의 정보를 업로드하고, 활동하고 계시는 배우님들이 계시다. 이런 곳에서 배우를 검색하여 문의 및 섭외하는 방법도 있다.

※ 배우 컨택할 때 ※

  - 만들고자 하는 싶은 영상에 잘 맞는 배우를 섭외해서 (인스타그램이나 이메일 주소)리스트를 정리한다. 차례대로 메일을 보내고, 거절 의사를 받으면 그다음 배우님께 연락하면 된다. 필자의 경우 10명 정도로 리스트를 꾸렸고, 한 분씩 연락 드렸다.
  - 필자의 경우에는 먼 거리까지 불렀던 적이 있어서 섭외 비용을 더 많이 드렸다.

728x90
반응형

Comment +0

728x90
반응형

※ HTS(Home Trading System) 설명 ※

 

  HTS(Home Trading System)집에서 주식 거래를 할 수 있도록 하는 프로그램을 의미한다. 예를 들어 키움증권 영웅문 HTS 같은 프로그램이 있다. 흔히 집에서 전업으로 주식에 투자하는 사람들이 가장 많이 쓰는 프로그램 유형이다.

 

 

※ WTS(Web Trading System) 설명 ※

 

  WTS(Web Trading System)별도의 프로그램 설치 없이 웹 사이트에서 바로 주식을 거래할 수 있는 시스템이다. 사실 주식이나 코인이나 많은 경우에 웹 기반으로 주식을 거래할 수 있도록 하는 경우가 있다. 키움증권도 2021년 7월을 기준으로 웹 트레이딩 시스템(WTS)를 제공하고 있다. 필자의 경우 WTS가 가장 편하다.

 

 

※ MTS(Mobile Trading System) 설명 ※

 

  MTS(Mobile Trading System) 스마트폰 앱 형태로 주식을 거래하는 시스템이다. 예를 들어 키움증권 영웅문S와 같은 앱이 대표적이다.

 

728x90
반응형

Comment +0