카테고리 보관물: 5. 토이프로젝트

간단한 연습용 프로젝트입니다.

밥약 (3)

에브리타임에서 시간표를 불러오는 알고리즘을 조금 개선 하였습니다.

파이썬으로 제작하였고 먼저 에브리타임의 시간표를 XML 형식으로 파싱해주는 코드는 다음과 같습니다.

def get_timetable(path):
    xml = requests.post(
        "https://api.everytime.kr/find/timetable/table/friend",
        data={
            "identifier": path,
            "friendInfo": 'true'
        },
        headers={
            "Accept": "*/*",
            "Connection": "keep-alive",
            "Pragma": "no-cache",
            "Cache-Control": "no-cache",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Host": "api.everytime.kr",
            "Origin": "https://everytime.kr",
            "Referer": "https://everytime.kr/",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
        }).text
    soup = BeautifulSoup(xml, 'lxml')
    data_list = soup.find_all('data')
    return data_list

Request 를 이용하여 에브리타임 API에 요청하면 에브리타임의 시간표 URL 에서 시간표만 반환합니다. 반환된 시간에서 시간 정보만 가져올 수 있도록 다시 리스트로 반환 하여 temp 리스트에 넣어둡니다.

def extract_time_data(data_list):
    for i in data_list:
    return time_list.append([int(i['day']),int(i['starttime']),int(i['endtime'])])

반환된 시간표 정보들을 이용하여 빈 시간을 가져 와야 함으로 빈 배열을 생성하여 임시로 지정합니다.

TIME_TABLE_ARRAY = [[0 for i in range(0,288)] for i in range(0,5)]

빈 배열의 시간표와 추출한 시간표를 이용하여 빈 배열에 시간표 시간을 추가하여 빈 시간을 확인할 수 있도록 합니다.

for time in time_list:
    for i in time:
        for y in range(i[1], i[2]):
            TIME_TABLE_ARRAY[i[0]][y] += 1

TABLE_ARRAY 배열에서 0이면 서로의 시간이 빈 시간이며 1 이상이면 겹치는 시간 입니다. 전체적으로 시간을 반환하는 코드는 아래와 같습니다.

def extract_time_data(data_list):
    for i in data_list:
    return time_list.append([int(i['day']),int(i['starttime']),int(i['endtime'])])

def get_timetable(path):
    xml = requests.post(
        "https://api.everytime.kr/find/timetable/table/friend",
        data={
            "identifier": path,
            "friendInfo": 'true'
        },
        headers={
            "Accept": "*/*",
            "Connection": "keep-alive",
            "Pragma": "no-cache",
            "Cache-Control": "no-cache",
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Host": "api.everytime.kr",
            "Origin": "https://everytime.kr",
            "Referer": "https://everytime.kr/",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36"
        }).text
    soup = BeautifulSoup(xml, 'lxml')
    data_list = soup.find_all('data')
    return data_list

time_list = []
table_id_list = ['','',''] 
for table_id in table_id_list:
    time_list.append(extract_time_data(get_timetable(table_id)))

TIME_TABLE_ARRAY= [[0 for i in range(0,288)] for i in range(0,5)]

for time in time_list:
    for i in time:
        for y in range(i[1], i[2]):
            TIME_TABLE_ARRAY[i[0]][y] += 1

for day in range(5):
    test = TIME_TABLE_ARRAY[day][108:216] # 09:00 ~ 18:00
    empty_time = []
    for index, value in enumerate(test):
        if value < 1:
            empty_time.append(index)

    increment = 5
    idx = empty_time[0]
    result = []
    for i in range(0, len(empty_time) - 1):
        if empty_time[i+1] - empty_time[i] == 1:
            increment += 5
        else:
            result.append([idx, increment])
            increment = 5
            idx = empty_time[i+1]
    result.append([idx, increment])

중간에 의미없는 리스트 배열이 있는거 같아 다음주는 조금더 개선해 보고자 합니다.

안건우 선생님 헬프 개선 “해줘”

시외/고속 버스 AppleWallet Pass 제작

AppleWallet의 Pass 기능을 이용하여 승차권을 만들어보려고 합니다.

해외같은 경우는 특히 이게 잘 되어있는데 국내는 항공사도 일부만 지원하고 버스같은 경우는 아예 없는 듯 하여 기획하여 만들어보려고 합니다.

방식은 시외버스 기준으로 현재 시외버스티머니, 버스타고, 카카오T 에서 승차권 발행이 되는거로 알고있는데 여기서 QR과 탑승정보가 나온 화면을 캡쳐(저장)하면 그걸 기반으로 Pass를 생성해주려 합니다

이런 느낌으로 될듯

디지털액자 (2)

먼저 하드웨어 세팅을 해 봅시다. 준비물은 다음과 같습니다.

  1. 남는? TV 또는 모니터
  2. 우분투가 올라가는 업보드/라즈베리파이/미니PC
  3. OS 설치용 USB 1개
  4. 유선 키보드, 마우스
  5. HDMI 케이블 1개

라즈베리파이는 라즈비안도 가능할 수 있습니다. 일단 크로미움이 깔리고 UI가 잘 뜨면 됩니다. 키보드/마우스는 무선이라도 블루투스가 아닌 unifying 수신기가 달린 제품이면 상관 없습니다.

우분투 버전은 Desktop 버전을 설치했습니다. 사용 이유는 일단 UI 가 설치되어 있어 구성의 편리함이 있을 것 같았습니다.

우선 우분투를 설치 안내에 따라 설치합니다. 그리고 kiosk 라는 사용자를 하나 만듭니다. 나중 관리를 위해 메인 계정은 살려두고 kiosk 로 자동 로그온이 되도록 할 겁니다.

우선 패키지를 업데이트 하고 몇개를 새로 설치할 겁니다. unclutter 패키지는 일정 시간이 지나면 마우스를 숨겨주는 패키지입니다.

sudo -s
apt update  && apt upgrade -y && apt install -y chromium-browser unclutter

그리고 자동 로그인을 위해 /etc/gdm3/custom.conf 파일을 편집합니다. gdm3 는 디스플레이 매니저 이름이며 다른 디스플레이 매니저를 쓴다면(lightdm 등) 그 설정 파일을 수정해주면 됩니다.

[daemon]
AutomaticLoginEnable=true # <-- 여기
AutomaticLogin=kiosk # <-- 여기

그리고 kiosk 홈 디렉토리에 chromium 을 실행하는 스크립트를 하나 만듭니다. kiosk.sh

#!/bin/bash

# Run this script in display 0 - the monitor
export DISPLAY=:0

# Hide the mouse from the display
unclutter &

# If Chromium crashes (usually due to rebooting), clear the crash #flag so we don't have the annoying warning bar
sed -i 's/"exited_cleanly":false/"exited_cleanly":true/' /home/kiosk/.config/chromium/Default/Preferences
sed -i 's/"exit_type":"Crashed"/"exit_type":"Normal"/' /home/kiosk/.config/chromium/Default/Preferences

# Run Chromium and open tabs
/usr/bin/chromium-browser --window-size=1920,1080 --kiosk --incognito --window-position=0,0 http://URL &

크로미움에는 키오스크 모드가 있습니다. 맥도날드 같은 곳에 설치된 키오스크 를 의미합니다. 전체 화면으로 실행되며 개발자 모드 비활성화, 알림 억제 등의 효과가 있습니다. 키오스크 모드라고 해서 어떤 동작을 해야 한다 라는게 명세되어 있지는 않고 각 브라우저마다 동작이 다 다릅니다. 일단 지금 상황에서는 전체화면으로 실행되고 주소 바만 없으면 되므로 키오스크 플래그를 줘서 실행합니다.

그리고 방문 기록 등 쓰레기 파일을 남기고 싶지 않으므로 incognito(private mode) 플래그를 줘서 실행합니다. URL 칸에는 URL 을 입력하면 됩니다.

다음은 kiosk.sh 를 자동 실행하게 하는 파일을 작성합니다. 디스플레이 매니저마다 설정이 다를 수 있습니다. home/kiosk/.config/ 아래에 autostart 디렉토리를 만들어 줍니다. 그리고 kiosk.desktop 를 파일을 만들고 편집합니다.

[Desktop Entry]
Type=Application
Name=Kiosk
Exec=/home/kiosk/kiosk.sh
X-GNOME-Autostart-enabled=true
StartupNotify=true
Terminal=false
kiosk 모드 작동 영상(타임랩스)

다음은 디스플레이에 표시될 웹 서버를 작성하도록 하겠습니다.

밥약 (2)

에브리타임 시간표를 기반으로 여러 시간표를 비교해서 공강 시간을 알려주는 프로젝트입니다.

지난 게시글에서 밥약을 만들기 위해서 “시간표 비교 알고리즘(공강 시간 반환)”을 해결해야 한다고 하였습니다.

파이썬 Request 라이브러리를 이용하여 에브리타임 시간표를 파싱 하고 BeautifulSoup를 이용하여 원하는 시간표 값을 파싱 하였습니다.

시간표 비교를 위해 빈 배열의 시간을 만들고 파싱한 시간표를 대입하여 공강 시간을 추출하였습니다.

현재 기능적으로 공강 시간은 추출되나 효율적인 코드 제작을 위해 검토하고 개선할 계획입니다. 이후 카카오톡에 적용하여 시범 서비스할 예정입니다.

밥약 (1)

에브리타임 시간표를 기반으로 여러 시간표를 비교해서 공강 시간을 알려주는 프로젝트 입니다.

대학생활에서는 사람들마다 다 다른 시간표로 대학생활을 하고 있습니다. 그래서 서로 점심을 먹거나 약속을 잡을때 시간잡기가 어렵습니다. 파이썬 공부를 위해 에브리타임 시간표를 분석하여 서로의 공강시간을 알려주는 프로젝트를 진행 하고자 합니다.

구상하고 있는 밥약의 기능은 다음과 같습니다..

  1. 로그인 기능으로 자신의 시간표를 저장해야함
  2. 비로그인 기능으로 단순 시간표 기능 제공
  3. 여러명의 시간표를 넣어 공강시간을 표시
  4. 비교 기록 저장

현재 에브리타임 시간표를 파싱하는 기능은 제작하였습니다. 하지만 밥약을 만들기 위해서 해결해야 할 가장 큰 문제가 있습니다.

  1. 시간표 비교 알고리즘(공강 시간 반환)

일단 시작하는 단계이니 조금더 정리하여 다뤄보도록 하겠습니다.

토이프로젝트 디지털액자 (1)

원룸에 기본 옵션으로 있는 TV를 다양한 정보가 담긴 디지털 액자?로 만드는 프로젝트입니다.

자취를 하면 원룸에 옵션으로 딸려오는 TV가 있는데요. 이건 화질도 좋지 못하고 공간만 잔뜩 차지합니다. 개인적으로 TV를 자주 보지 않기 때문에 무관심으로 1년을 지낼 수도 있지만 마침 눈에 잘 밟히는 자리에 있기에 어떻게든 활용해 보려 합니다.

일단 구상하고 있는 액자 기능은 다음과 같습니다.

  1. 오전 6시에 자동으로 켜져야 함
  2. 오후 9시에 자동으로 꺼져야 함
  3. 주간 날씨와 평균 기온 표시
  4. 시간별 경산시 기온 표시
  5. 회사 이메일 / 개인 이메일 안 읽은 개수 표시
  6. 주간 일정 표시

그리고 준비물은 아래와 같습니다

  1. TV
  2. 미니 PC(라즈베리파이 같은)
  3. 리모컨 전파 발신기(?)

티비를 켜고 끄기 위해서 3번이 필요할 것 같습니다. 아니면 IoT 콘센트 등으로 전원을 내리는 방법이 있는데 다시 켰을 때 TV가 잘 켜질지는 미지수입니다.

그리고 디지털 액자를 만들기 위해 해결해야 할 문제입니다.

  1. 디스플레이 되는 웹 서버
  2. 여러 데이터 소스에서 데이터 조회 및 가공
  3. 미니 PC를 부팅했을 때 자동으로 웹 페이지 띄우기
  4. 시간에 맞춰 TV ON/OFF 신호 송신

일단 계획은 이렇게 잡고 미니 PC부터 다뤄보도록 하겠습니다.