๐ค ์ฝ๋ก๋ ์ธํํธ ์๋, ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ์์ ์๊ฐ์ ์ ์ ์์๊น์?
โฐ ๊ณ ๋ฑํ๊ต, ์๊ฐ ๊ด๋ฆฌ์ ์ค์์ฑ
์๋
๊น์ง๋ง ํด๋ ์ ๋ ํ๊ต๋ฅผ ๋ค๋๊ณ ์์์ด์. ํ๋ผ๋ ๊ณต๋ถ๋ ์ํ๊ณ ์ฌ๋ฌ๊ฐ์ง ๋ด์ง์ ๋ง์ด ํ์์ฃ .
ํ์ง๋ง ํ๋ฃจ๋ ๊ณ ์ 24์๊ฐ, ์ธ๊ฐ์ด ๋ด์ง์ ํ ์ ์๋ ์๊ฐ์ ํ์ ๋์ด ์์ต๋๋ค. ์ด๋ ์๋ฉด ์๊ฐ ๋ณด์กด์ ๋ฒ์น(Law of conservation of sleep hours)์ ์ํ ๊ฒ์ธ๋ฐ์. ์ธ๊ฐ ์ค์์๋ ๋์ฝํ ํธ์ ์ํ๋ ์ ๋ ๋ฌด์จ ์ผ์ด ์์ด๋ 8์๊ฐ์ ์ฑ์ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฏธ์ธ์ ์ ๊พธ๋ฌ๊ธฐ์ธ ๋ฒ์ด๋๊น์. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ์ฝ๋ฉํ๋ ์๊ฐ์ ๋๋ฆฌ๋ ค๋ฉด ํ๊ต ์์
์๊ฐ์ ์ต๋ํ ํจ์จ์ ์ผ๋ก, ์ฆ ์๋ ๋ฐ ์ฌ์ฉํด์ผ ํ์ต๋๋ค(25%๋ง ์๋ ๋ฐ ์จ๋ 2์๊ฐ์ ๋ฒ ์ ์์ต๋๋ค).
๊ณ ๋ฑํ๊ต 1ํ๋
์ ๋ง์น๋ฉด์ ์ ์๋๋ค๊ป์๋ ์ ๊ฒ ์ด์ 2ํ๋
์ด ๋๋ ์๊ฐ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ผ๋ ๋ชฉํ๋ฅผ ๋ง์์์ ์๊ธฐ๋ผ๋, ์ด... ๋์ถฉ ๋ฉ์ง ๋ง์์ ํด ์ฃผ์
จ์ต๋๋ค. ์ ์๋ ๋ง์์ ์ ๋ฃ๋ ์ฐฉํ ์์ด์ธ ์ ๋ 2020๋
์ด ๋๊ณ ์ผ๋
๋ชฉํ๋ฅผ ์๊ฐ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋ก ์ ํ์ต๋๋ค.
ํ์ง๋ง ์ ๋ฉ์ง ๊ณํ์ ๋ชจ๋ ํ์ด์ง๊ฒ ๋์์ต๋๋ค. ์ฝ๋ก๋ ๋๋ถ์ ์ ํฌ ํ๊ต๋ ์จ๋ผ์ธ์ผ๋ก ๊ฐํ์ ํ๊ฒ ๋๋ฉด์ ๋ง์ด์ฃ . ์ด๋ค ํ๊ต๋ EBS๋ก ์์ ์ฃผ๋ฅด๋ฅต ๋ค์ด๋์ผ๋ฉด ์ถ์ ์ธ์ ๋๊ณ ๊ทธ๋ฌ๊ธฐ๋ ํ๋ค๋ ๊ฒ ๊ฐ์๋ฐ ์์ฝ๊ฒ๋ ์ ํฌ ํ๊ต๋ ์ค(ZOOM)์ ํตํด ์์ ์ด ์ค์๊ฐ์ผ๋ก ์งํ๋์์ต๋๋ค.
์์... ๋ด ์๋ฉด...!
๐ ํ๊ต์์ ์ค์ ์ค.
์ค
์ด๊ฒ ์ค์
๋๋ค. ๋ณด๋ค์ํผ ์จ๋ผ์ธ ํ์ ํ์ ์๋น์ค์ฃ (์์ํ๊ฒ ์ง๋ง ์ ์๋์ ์ ์ธํ๋ฉด ๊ฑฐ์ ์๋ฌด๋ ์นด๋ฉ๋ผ์ ๋ง์ดํฌ๋ฅผ ์ผ์ง ์์ผ๋ ค๊ณ ํฉ๋๋ค. ๋ฌผ๋ก ์ ๋ ์ ์ผฐ์ต๋๋ค. ์ด๊ฑธ ์ ํค๋์);;;
์ ์๋์ด ํ์์ค์ ์ฐ ๋ค์ ๋งํฌ๋ฅผ ๊ณต์ ํด ์ฃผ๋ฉด ํ์๋ค์ด ๋ค์ด๊ฐ์ ๋ง๋๋ ๊ทธ๋ฐ ๊ตฌ์กฐ๋ก ์์
์ด ์ด๋ฃจ์ด์ง๋๋ค. ์๊ฐ๋ณด๋ค ํจ์จ์ ์ด์ฃ ?
๋ฌธ์ ๋ ๊ณผ๋ชฉ๋ง๋ค ์ ์๋์ด ๋ค๋ฅด๋ฏ ์ ์๋๋ง๋ค ์ค ๋งํฌ๊ฐ ๋ฌ๋๋ ๊ฒ์ ์์ต๋๋ค. ์ฆ ํ์๋ค์ ๊ฐ์์ค์ ์ฐพ์๊ฐ๋ฏ์ด ๋งค ์๊ฐ ์์
์ด ์์ํ๊ธฐ ์ ์ ๋ค๋ฅธ ์ ์๋์ ๋งํฌ์ ๋ค์ด๊ฐ์ผ ํ์ฃ .
๋ง์ฝ ์ค๊ฐ์ ์กธ์์ ๋ค์ ์์
์ ๋ค์ด๊ฐ์ง ๋ชปํ๋ฉด ์์
์์ ์ ์ ์ธ์์ฒดํฌ๋ฅผ ํ๋๋ฐ ๊ฑฐ๊ธฐ์ ์๋ ์ฌ๋ ์ฐพ์์ ์น๊ตฌ๋ค์ด ์ ํํด ์ฃผ๊ณ ํ๊ต์์ ์ฐ๋ฝํ๊ณ ๊ทธ๋๋ ์์ผ๋ฉด ์ง๊ฐ ์ฒ๋ฆฌ๋ผ๋ฉฐ ํผ๋ด๊ณ ์๋ด... ์ผ์ผ
๊ทธ๋๋ ์์ผ ๋๋ ์ ์ ์ ๊ฒ ์ฐธ ์ข์ ์น๊ตฌ๋ค์ด ๋ง์๋ค๋ ๊ฒ! ์น๊ตฌ๋ค์ ๊ณ ๋ง์ ๊ณ ์ฌ๋ํ๋ค!!!
๋งจ๋ ์นจ๋์ ๋์์ ์๋ค๊ฐ ๋ณด์ด์คํก ์๋ฆฌ๋ฅผ ๋ฃ๊ณ ์ผ์ด๋์ ๋๋ตํ๊ณ ๋ค์ ๋์ ์๋ค์. ํ์ง๋ง ํ๋ฃจ๋ ์น๊ตฌ๋ค์๊ฒ ๋ฏธ์ํ๊ธฐ๋ ํ๊ณ , ์ด์ ์ ๊ฑฐ๋ผ๋ฉด ๋ฐฉํด๋ฐ์ง ์๊ณ ํน ์๊ณ ์ถ์ด์(?) ์ด๊ฑธ ์ข ์๋ํํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๐ป ์์ ๋ฃ๊ธฐ๋ฅผ ์๋ํํด ๋ณด์
๐ซ ์์ ๋ค์ด๊ฐ ์๋ ์์ด?
์ ๋ธ๋ผ์ฐ์ ์๋ ๋ ์ด์ ์ฒดํฌ๋ฐ์ค๊ฐ ์ ๋ณด์ฌ์ ๊ตฌ๊ธ๋ง์ผ๋ก ์์ด ๋ฒ์ ์คํฌ๋ฆฐ์ท์ ๊ฐ์ ธ์์ต๋๋ค.
์ค ํด๋ผ์ด์ธํธ๊ฐ ์ค์น๋ ์ํ์์, zoommtg://
๋ก ์์ํ๋ ์ค ๋ฅ๋งํฌ๋ฅผ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ด๋ฉด ์์ ๊ฐ์ ํ๋กฌํํธ๊ฐ ํ์๋ฉ๋๋ค. ์ด๋ ํญ์ ์ด๋ฌํ ์ ํ์ ๋งํฌ๋ฅผ ์ฐ๊ฒฐ๋ ์ฑ์์ ์ด๊ธฐ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ฒดํฌํ๋ฉด ๋ค์๋ถํฐ๋ ์ง๋ฌธ ์์ด ๋ฐ๋ก ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฆฝ๋๋ค.
๋ฅ๋งํฌ๋ฅผ ์์ธํ ๋ณด๋ฉด Query string์ผ๋ก action
, pwd
, confno
๊ฐ ์ ๋ฌ๋๊ณ ์๋ค๋ ๊ฑธ ์ ์ ์์ต๋๋ค. ๋งํฌ ๋ช ๊ฐ๋ฅผ ๋์กฐํด ๋ณด๋ฉด์ ์ฝ๊ฒ ๊ทธ ๋ป์ ์ ์ถํด๋ผ ์ ์์ด์.
action
์ ํด๋ผ์ด์ธํธ๊ฐ ์คํ๋๊ณ ๋์ ๋ฐ์ ํ์์ค ์ ๋ณด๋ก ์ด๋ค ์์ ์ ์ํํ ์ง๋ฅผ ๋งํ๋ ๊ฒ ๊ฐ์์.join
๋ง๊ณ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ญ๊ฐ ์์์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ์ ํฌ๋ ๊ฐ์์ค์ ๋ค์ด๊ฐ๋ ๊ฒ ๋ชฉํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค์.pwd
๋ ๊ฐ์์ค์ ํจ์ค์๋์ ๋๋ค. ์ ํฌ ํ๊ต๋ ๋ชจ๋ ๊ฐ์์ค์ ํจ์ค์๋๋ฅผdimigo
๋ก ํต์ผํ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ํ๋์ฝ๋ฉ ํ์์ด์.confno
๋ ๊ฐ๊ฐ์ ๊ฐ์์ค์ ํ ๋น๋๋ ๊ณ ์ ID์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ์์ค๋ณ๋ก ์ด ๊ฐ๋ง ์ ์ฅํ๋ฉด ๋๋ค์.
ํ์ด์ฌ์๋ webbrowser๋ผ๋ ๋ชจ๋์ด ์์ต๋๋ค. ์์คํ
๊ธฐ๋ณธ ๋ธ๋ผ์ฐ์ ๋ก URL์ ์ด ์ ์๊ฒ ํ๋ ํจ์๋ค์ด ์ ์ธ๋์ด ์๋๋ฐ์. ์ด๊ฑธ ์ด์ฉํ๋ฉด ํ์์ค ์ ๋ณด๋ฅผ ๋ฐ์ ์๋์ผ๋ก ์ ์ํด ์ฃผ๋ ํจ์ open_classroom
์ ๋ง๋ค ์ ์๊ฒ ๋ค์!
def open_classroom(classroom: dict) -> None:
name = classroom['name']
code = classroom['code']
webbrowser.open_new_tab(f'zoommtg://zoom.us/join?action=join&pwd=dimigo&confno={code}')
console.print(f'โ {name} ์์
์ ์ ์๋ฃ', style='dim')
๐ ์ ... ์ ๊ธฐ ํน์ ์๊ฐํ ์์ด?
์ด์ ์ ํฌ๊ฐ ๋ง๋ค ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ค์ ๋ชจ์๋ณผ๊ฒ์!
์์ ์๊ฐ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
// periods.json
{
"์กฐํ": ["08:42", "08:57"],
"1๊ต์": ["08:58", "09:50"],
"2๊ต์": ["09:58", "10:50"],
"3๊ต์": ["10:58", "11:50"],
"4๊ต์": ["11:58", "12:50"],
"5๊ต์": ["13:48", "14:40"],
"6๊ต์": ["14:48", "15:40"],
"7๊ต์": ["15:48", "16:40"],
"์ข
๋ก": ["16:45", "17:55"]
}
์๋ฌด๋๋ ์์
์ด ์ธ์ ์์ํด์ ์ธ์ ๋๋๋์ง ์์์ผ ํ๊ฒ ์ฃ ?
์ ํฌ ํ๊ต์์๋ ์กฐํ์ ์ข
๋ก ์ญ์ ๋ด์ ์ ์๋ ํ์์ค์์ ์งํํ๋๋ฐ์.
์ข
๋ก์ ๋ฆ์๋ค๊ฐ๋ ๋ฐ ์ ์ฒด๊ฐ ์ ํ๋๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์์ผ๋, ๋นผ๋์ง ๋ง๊ณ ๊ฐ์ด ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค! ๐ฅ
์ ใ ใ ใ ์ ๊ฑฐ ์ ๋ ์ฝ๋์ ์ข ๋ก๊ฐ 1์๊ฐ์ผ๋ก ์กํ ์์๋ค์... ์ด์ฉ์ง ๊ณ์ ๋จ์์๋๋ค ํ์ด
์๊ฐํ ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
// timetable.json
[
[
"ํํ I",
"์ด๋๊ณผ ๊ฑด๊ฐ",
"์ํ II",
"์ ๋ณด๋ณดํธ ๊ด๋ฆฌ",
"์ ๋ณด๋ณดํธ ๊ด๋ฆฌ",
"์ฑ๊ณต์ ์ธ ์ง์
์ํ",
"์์ฉํ๋ก๊ทธ๋๋ฐ ํ๋ฉด๊ตฌํ"
],
...
]
๋๋ถ๋ถ์ ๊ณ ๋ฑํ๊ต์์๋ 1์ฃผ์ผ๋ง๋ค ๊ฐ์ ์๊ฐํ๊ฐ ๋ฐ๋ณต๋๊ณ , ์ ํฌ ํ๊ต ์ญ์ ์์ธ๊ฐ ์๋์์ต๋๋ค.
ํ๋ฃจ์ ์งํ๋๋ ์์
๊ณผ๋ชฉ๋ช
(6~7๊ฐ)์ ์์๋๋ก ๋ฐฐ์ด์ ๋ฃ์ด์ ๊ธธ์ด 5์ Nested Array๋ฅผ ๋ง๋ค๋ฉด ๋!
ํ์์ค ๋ฐ์ดํฐ ์ ์ฅํ๊ธฐ
// classrooms.json
[
{
"name": "ํํ I",
"teacher": "์นํฌ์ค",
"code": 4361766687
},
{
"name": "์ด๋๊ณผ ๊ฑด๊ฐ",
"teacher": "๋ชฝํค D. ๋ฃจํผ",
"code": 7864104388
},
{
"name": "์ํ II",
"teacher": "๋กค๋ก๋
ธ์ ์กฐ๋ก",
"code": 7965443330
},
{
"name": "HR",
"teacher": "๋๋ฏธ",
"code": 7864104388,
"homeroom": true
},
...
]
๊ฐ์ฅ ์ค์ํ ๊ฐ์์ค ๋ชฉ๋ก. ๋ค์ด๊ฐ ์์
์ ๊ณผ๋ชฉ์ ๋ง๋ ๊ฐ์์ค์ ์ด์ด ์ค ์ ์๋๋ก ํ๋ ๋ฐ์ดํฐ์
๋๋ค!
๊ณผ๋ชฉ ์ด๋ฆ์ธ name
, ์ ์๋ ์ฑํจ์ธ teacher
, ๊ทธ๋ฆฌ๊ณ ์ค ๊ฐ์์ค์ ๊ณ ์ ID์ธ code
๋ก ์ด๋ฃจ์ด์ง๋ Object Array๋ฅผ ๋ง๋ค๋ฉด ๋๊ฒ ๋ค์.
์ด๋ ์กฐํ์ ์ข
๋ก๊ฐ ์ด๋ฃจ์ด์ง๋ ๋ด์์ ์๋์ ํ์์ค์ homeroom
ํ๋๋ฅผ true
๋ก ์ค์ ํด ์ ์ฅํด ์ค์๋ค. ์ฐ๋ฆฌ์ ์ข
๋ก๋ ์์คํ๋๊น! ๐
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
์ด์ ์ฐ๋ฆฌ์ ํ์ด์ฌ ์คํฌ๋ฆฝํธ์์ ์์์ ๋ง๋ JSON ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ํด์ผ๊ฒ ๋ค์.
def load_json_file(filename: str) -> dict:
with open(filename) as file_stream:
data = json.load(file_stream)
return data
์ฌ๋ฌ ๋ฒ ์ฐ๊ธฐ ๊ท์ฐฎ์ผ๋ ํ์ผ ์ด๋ฆ์ ๋ฐ์, ์ ํ JSON ๋ฐ์ดํฐ๋ฅผ ์ค๋ธ์ ํธ๋ก ๋ง๋ค์ด ๋ฐํํ๋ ํจ์ load_json_file
์ ๋ง๋ค์ด ์ฌ์ฉํฉ์๋ค.
timetable = load_json_file('./timetable.json')
classrooms = load_json_file('./classrooms.json')
periods = load_json_file('./periods.json')
period_names, period_list = map(list, [periods.keys(), periods.values()])
์ด๋ ๊ฒ ์๊ฐํ, ๊ฐ์์ค, ์์
์์/์ข
๋ฃ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค๋๋ค.
์ด๋ periods.json
์์ ์์ดํ
๊ฐ๊ฐ์ key
์ value
๋ฅผ ๋ฆฌ์คํธ๋ก ๋ถ๋ฆฌํด์ ๋์ค์ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ ์ ์๋๋ก ํ์๊ณ ์!
๐งโ๐ซ ์์ ๊ณผ๋ชฉ๋ช ์ ๋ฐ๋ผ ๋ค์ด๊ฐ ํ์์ค ๊ตฌํ๊ธฐ
def get_classroom_from_subject_name(subject_name: str) -> dict:
for classroom in classrooms:
if subject_name == classroom['name']:
return classroom
๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ์ค๋น๋์์ผ๋ ์ด์ ์ด ์ ๋์ฏค์ ์ฝ๊ฒ ํ ์ ์์ฃ ! ๐
๊ณผ๋ชฉ๋ช
์ผ๋ก ํ์์ค ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ํจ์์
๋๋ค.
๐ค ์ผ์ ์๊ฐ๋ง๋ค ์์์ ๋ค์ด๊ฐ๊ธฐ
์ ์ด์ ๊ฐ์ฅ ์ค์ํ ํํธ!
์คํฌ๋ฆฝํธ๋ง ์ผ๋๋ฉด ์๋์ผ๋ก ์์
์ ๋ค์ด๊ฐ ์ ์๋๋ก ๋ง๋๋ ๊ณผ์ ์
๋๋ค.
weekday = datetime.datetime.today().weekday()
classrooms_for_today = [
get_classroom_from_subject_name(subject_name)
for subject_name in timetable[weekday]
]
๋จผ์ Weekday๋ฅผ ๊ตฌํฉ๋๋ค. Weekday๋ ์ค๋์ด ์ผ์ฃผ์ผ์์ ๋ช ๋ฒ์งธ ๋๋ ๋ ์ด๋๋ฅผ ๋ปํ๋๋ฐ์.
0๋ถํฐ ์์ํด์ ์์์ผ์ด 0์ด๊ณ , ๊ธ์์ผ์ด 4์
๋๋ค.
Weekday๋ฅผ ์๋ฉด ๊ทธ๊ฑธ timetable
๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ก ํด์ ์ค๋์ ์๊ฐํ๋ฅผ ๊ตฌํ ์ ์๊ฒ ๋ค์!
์์๋๋ก ๋ค์ด๊ฐ ํ์์ค์ ๋ฆฌ์คํธ๋ฅผ classrooms_for_today
์ ์ ์ฅํ๊ฒ ์ต๋๋ค.
def get_homeroom() -> dict:
for classroom in classrooms:
if 'homeroom' in classroom and classroom['homeroom']:
return classroom
homeroom = get_homeroom()
classrooms_for_today.insert(0, homeroom)
classrooms_for_today.append(homeroom)
์๊น ์ถ๊ฐํ ๋ด์์ ์๋ ํ์์ค์ ๊ตฌํ๋ get_homeroom
ํจ์๋ฅผ ๋ง๋ค์ด ์ฃผ๊ณ , ๋ฐํ๋ ํ์์ค homeroom
์ ๋ฆฌ์คํธ์ ์๋ค์ ํ๋์ฉ ๋ถ์ฌ์ค์๋ค. ์กฐํ์ ์ข
๋ก๋ฅผ ์ํด์์ฃ !
for classroom in classrooms_for_today:
schedule.every().day.at(classroom['start_time']).do(open_classroom, classroom=classroom)
console.print('์์
์ด ๋๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ์ค...', style='dim')
while True:
schedule.run_pending()
schedule ๋ชจ๋์ ์ฌ์ฉํ๋ฉด ํน์ ์๊ฐ์ ํจ์์ ์คํ์ ์ค์ผ์ค๋ง ํ ์ ์์ด์.
์์
์ด ์์๋๋ classroom['start_time']
๋ง๋ค classroom
์ผ๋ก open_classroom
ํจ์๋ฅผ ์คํํด ์ฃผ๋ฉด ์์ฑ์ด๋ค์! ๐
๐ ๊ฐ๋ถ์ธ ํผํ๋ ๋ฐฉ๋ฒ
์ด๋ ๊ฒ ์คํฌ๋ฆฝํธ๋ฅผ ์ง ๋ค์ ์คํํด ๋ดค๋๋ฐ, ๋ฏธ์ฒ ๊ณ ๋ คํ์ง ๋ชปํ ๋ถ๋ถ์ด ์์์ด์.
๐ฌ ์ฃผ๋ ธ ์ ๋๊ฐ๊ณ ๋ญํด..? ์ฃผ๋ ธ...? (์ด์ํ ์ ์ )
๋ฐฉ๊ธ ๋ง๋ ์คํฌ๋ฆฝํธ๋ ์์
์ด ์์๋๋ ์๊ฐ๋ง๋ค ์๋ก์ด ํ์์ค์ ์ฌ๋ ๊ตฌ์กฐ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ "์์
๋~"์ ์ธ์น๊ณ ๋ ์ ๋ ๋ฐฉ์ ๋๊ฐ์ง ์๋๋ค๋ฉด ์ ์๋๋ค๊ป์ ์ ๊ฐ ์๋์ง ์์ฌํ์ค ์ ์๋๊ตฐ์!
๊ฒ๋ค๊ฐ ์ ์น๊ตฌ๋ ์์
๋ ์์ ๋ฐฉ์ ๋น ์ ธ๋์ค์ง ๋ชปํ๋๋ฐ, ์ ์๋๊ป์ ํ์์ค์์ ๊ฐ์ ํด์ฅ ์ํค๋ ๋ฒ์ ๋ชฐ๋ผ์ ๋์ ๋ ๋ณด๋ ๋ค๋ฅธ ๋ฐ ์ ๋ค์ด ์๊ณ ์์๋ค๋ ์ด์ผ๊ธฐ... ์์๋ง ํด๋ ๋์ฐํ ์ฌํ๊ฐ ์ผ์ด๋ ์๋ ์๊ฒ ๊ตฐ์.
์๋ฉด์ ์ํด์ ์ด๋ฐ ์ค์๋ ์ฉ๋ฉํ ์ ์๋ ๋ฒ!
์ ๋ ํ์์ค์ ๋น ์ ธ๋๊ฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด ๋ด
์๋ค. ๐ช
๐ ํ์ฌ ์คํ๋๊ณ ์๋ ์ค ํด๋ผ์ด์ธํธ์ PID ๊ฐ์ ธ์ค๊ธฐ
๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ข
๋ฃํ ์๊ฐ์ด ๋๋ฉด ์ค ํด๋ผ์ด์ธํธ์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์, ์ฃฝ์ฌ๋ฒ๋ฆฌ๋ ๊ฒ์ด์ฃ .
์ด๊ฑธ ์ํด์๋ ์ค ํด๋ผ์ด์ธํธ์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ ์ ์์ด์ผ ํฉ๋๋ค.
๊ฐ๋จํ ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ ค์ ์ฐพ์๋ณผ๊ฒ์.
import psutil
process_pid_list = psutil.pids()
for process_pid in process_pid_list:
process = psutil.Process(process_pid)
print(process)
psutil ๋ชจ๋์ ํ์ด์ฌ์์ ํ์ฌ ์ปดํจํฐ์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ค์ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค๋๋ค.
psutil.pids
ํจ์๋ฅผ ์ฌ์ฉํด์ ํ์ฌ ์คํ๋๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํด ๋ดค์ด์.
...
psutil.Process(pid=53193, name='Google Chrome Helper (Renderer)', status='running', started='04:23:39')
psutil.Process(pid=53216, name='Google Chrome Helper (Renderer)', status='running', started='04:25:31')
psutil.Process(pid=53279, name='LookupViewService', status='running', started='04:29:59')
psutil.Process(pid=53410, name='bluetoothaudiod', status='running', started='04:42:05')
psutil.Process(pid=53501, name='zoom.us', status='running', started='04:54:38')
psutil.Process(pid=53505, name='com.apple.appkit.xpc.openAndSavePanelService', status='running', started='04:54:46')
psutil.Process(pid=53506, name='QuickLookUIService', status='running', started='04:54:47')
psutil.Process(pid=53507, name='ACCFinderSync', status='running', started='04:54:47')
...
์ฐพ์์ต๋๋ค! name
์ด zoom.us
์ธ ๋ฐ๋ก ์ ํ๋ก์ธ์ค(53501)๋ค์.
import psutil
def get_zoom_process():
process_pid_list = psutil.pids()
for process_pid in process_pid_list:
process = psutil.Process(process_pid)
process_name = str(process.name())
if 'zoom' in process_name:
print(process)
return process
return None
์ด์ ์ค ํด๋ผ์ด์ธํธ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐํํ๋ ํจ์ get_zoom_process
๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๐ซ ์ค ํด๋ผ์ด์ธํธ ์ข ๋ฃ์ํค๊ธฐ
def kill_zoom_process():
try:
process = get_zoom_process()
if process != None:
process.kill()
return 1
except:
return 0
return 0
process.kill
์ ์ด์ฉํด ์ฐพ์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํ๋ ํจ์ kill_zoom_process
์
๋๋ค.
์ข
๋ฃ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ 1(์ฑ๊ณต) ๋๋ 0(์คํจ)์ผ๋ก ๋ฐํํ๋๋ก ํ์ด์. if
๋ฌธ์ผ๋ก ์คํ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด์์ง์!
๐ ๊ฒฐ๊ณผ ์ฐ์ด์ฃผ๊ธฐ
def close_classroom() -> None:
if kill_zoom_process():
console.print(f'โ ์์
๋๊ฐ๊ธฐ ์๋ฃ', style='dim')
else:
console.print(f'โ ์์
๋๊ฐ๊ธฐ ์คํจ', style='dim')
์ด๋ ๊ฒ ์์๊ฒ ๊ฒฐ๊ณผ๊น์ง ์ถ๋ ฅํด ์ฃผ๋ ํจ์๋ก ๊ฐ์ธ์ ์ฌ์ฉํฉ์๋ค.
for classroom in classrooms_for_today:
schedule.every().day.at(classroom['start_time']).do(open_classroom, classroom=classroom)
schedule.every().day.at(classroom['end_time']).do(close_classroom)
console.print('์์
์ด ๋๋๊ธธ ๊ธฐ๋ค๋ฆฌ๋ ์ค...', style='dim')
while True:
schedule.run_pending()
์์
์ด ๋๋๋ ์๊ฐ์ธ classroom['end_time']
์ ์๋์ผ๋ก ์คํ๋๋๋ก ์ค์ผ์ค์ ์ถ๊ฐํด ์ฃผ๋ฉด ๋! ๐
๐ ๊ฟ์ ์ฑ๊ณต!
์์ฑ๋ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ๋ชจ์ต
์ง ! ๊ฒฐ๊ตญ ์ ๋ ํ์ด์ฌ ๋๋ถ์ ๋งค์ผ๋งค์ผ ํน ์๊ณ ์ผ์ด๋ ์ฝ๋ฉํ ์ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋๋ฌด ์นผ ๊ฐ์ด ์์
์ด ๋๋์๋ง์ ์ข
๋ฃ๋๋ ๋ฐ๋์ ํ๋ฒ์ ์ํ ์ ์๋์ด ์์
๋๋๊ณ ๋ ํ์ค ๋ง์์ด ์์ผ๋ ๊ธฐ๋ค๋ฆฌ๋ผ๊ณ ํ์
จ๋๋ฐ๋ ํผ์ ์ฉ ๋๊ฐ ๋ฒ๋ ค์... ๋ค๋ฆ๊ฒ ์ ์๋๊ป ์ฐ๋ฝ์ ๋ฐ๊ณ ๋งค์ฐ ์ซ์์ง๋ง ์ปดํจํฐ๊ฐ ์์
์ด ๋๋๊ธฐ ์ ์ ํ๊ฒผ๋ค๊ณ ํ๊ณ๋ฅผ ๋๋ฉฐ ์ฅ๋ฌธ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ณ ๋์ด๊ฐ๋ ๊ฒ ๊ธฐ์ต์ด ๋๋ค์. ์ดํ ๊ฐ์ ์ค์๋ฅผ ํ์ง ์๊ธฐ ์ํด(?) ์กฐ๊ธ์ฉ ์ข
๋ฃ ์๊ฐ์ ๋ฆ์ถฐ ์กฐ์ ํ์ต๋๋ค.
์ค...! ๊ฑฐ์ง๋ง์ด์์ด์ใ
ใ
ใ
ใ
์ฃ์กํฉ๋๋ค๐ฅฐ
๊ทธ๋๋ ์ ๊ฑฐ ์์ด๋ ์์ ๋ชป ๋ค์ด๊ฐ ๋งํผ ๋์ ๋๋ํ ๋ดค์๋ค์! โญ๏ธ
๐ธ ๊ธฐํ
- ์ ์ฝ๋์์ ๋ก๊ทธ ์ฐ์ ๋ ์ ๊ฐ
print
ํจ์ ๋์ ์ฌ์ฉํconsole.print
๋ rich ํจํค์ง์์ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ก๊ทธ๊ฐ ์๋ป์ ธ์. - ์คํฌ๋ฆฐ์ท์ ์๋ ํ
์ด๋ธ ์ญ์ rich์
Table
๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ๋ง๋ค์์ด์.
๐ ์ด์ ๋ ๋งํ ์ ์๋ค.
์ด ๋ฐ์๋ ํ๊ต์์ IT ์ธ๊ธธ์ธ์์ ๊ฑธ์ผ๋ฉฐ ์ด์๋จ๊ธฐ ์ํด์ ์ฌ๋ฌ๊ฐ์ง ๊ฒ๋ค์ ๋ง๋ค์๋๋ฐ์.
์ด์ ๋ ๋งํ ์ ์๋ค! ํ๊ณ ๋ช ๊ฐ ์ฐ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
- ๐ B ๋ชจ ์จ๋ผ์ธ ํ์ต ์์คํ : ์ ํฌ ํ๊ต์์ ์์นจ๋ง๋ค ๋ช ๋ฌธ์ ์ฉ ํ๋๋ก ์ ํด์ง ๊ต๋ด ํ์ต ์์คํ ์ธ๋ฐ์. ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ํ๋ก ํธ์๋์์ ํ๊ณ ์๋ค๋ ๊ฑธ ๋ฐ๊ฒฌํด ๋ฌธ์ ๋ฅผ ํ์ง ์๊ณ ๋ ์ ๋ต์ ๊ฐ์ ธ์ฌ ์ ์์์ต๋๋ค. ๋๋ฌด ๋๋๊ณ ๋ต์ ๋ง์ถ๋ฉด ๋คํค๋๊น bias๋ฅผ ์ค์ ์ผ์ ํ๋ฅ ๋ก ์ฐ๊ฒ ํ๋ ๊ธฐ์ต์ด ๋๋ค์(์ ์ค๋ ฅ์ฒ๋ผ ์ธํ ํด๋ฌ์ ์ฌ์ค์ ๊ฑฐ์ ๋๋ค์ด์๋ค์). TypeScript์ Puppeteer๋ฅผ ์ฌ์ฉํด์ ๋ง๋ค์์ต๋๋ค.
- ๐งโ๐ป ์ธ๊ฐ์ค ์ ์ฒญ ๋งคํฌ๋ก: ์ ํฌ ํ๊ต๋ ๊ธฐ์์ฌ ํน์ฑํ๊ณ ๋ผ์ ์ผ์ ์๊ฐ์ด ์กด์ฌํ๋๋ฐ์. ์ผ์ ๋ ๋ ธํธ๋ถ์ ์ฌ์ฉํ๋ ค๋ฉด ํ๊ต ์ธํธ๋ผ๋ท์ผ๋ก '์ธ๊ฐ์ค ์ข์'์ ์ ์ฒญํด์ผ ํ์ต๋๋ค. ์ธ์ ์ ํ์ด ์๋๋ฐ 1ํ๋ ์ด์๋ ๋๋ฌด ๊ฒฝ์์ด ๋นก์ธ์ ์ ์ฒญ ์์ ์๊ฐ์ ์์ฒญ์ ์๋์ผ๋ก ๋ณด๋ด๊ณ , ์ ์ฒญ์ ์คํจํ๋ค๋ฉด ๋๊ฐ ํฐ์ผ์ ํฌ๊ธฐํ ๋๊น์ง ๋๊ธฐํ๋ค ์ผ๋ฅธ ์ค์คํ๋ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด๊ฑด ๋ค์ผ์ ์ค๋คํํ ํผ๋๊ณ ์ธ์๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. ์ ๋ ๊ฐ ๋ปํ๋ค์ ใ ใ
- โฐ ์จ๋ผ์ธ ์์
์๊ฐ์ ๋ง์ถฐ์ ์น ๋
ธํฐํผ์ผ์ด์
์ ๋ณด๋ด์ฃผ๋ ์๋น์ค: ์ ๋ง๊ณ ๋ค๋ฅธ ์ ๋ค๋ ๋ง์ด ์ค์๋๋ฐ ์ด๋ค์ ์ํด์ ๋ง๋ค์์ต๋๋ค. ๋ฐฑ์๋๋ฅผ ๊ณต๋ถ ์ค์ด๋ ํ๋ฐฐ๋ ๊ฐ์ด ์งํํ ํ๋ก์ ํธ์์ต๋๋ค.
- ๐ ํ๊ธ ์๊ฐํ๋ฅผ ๋ณผ ์ ์๋ ํฌ๋กฌ ์ต์คํ
์
: 1ํ๋
๋ ์น๊ตฌ๊ฐ ๋
ธํธ๋ถ ํ๋๋ผ ์์
์ค๋น๋ฅผ ๋ชปํ๋ ๊ฑธ ๋ณด๊ณ ๋ง๋ค์ด์ค ํฌ๋กฌ ์ต์คํ
์
์
๋๋ค.
๐ฅ ์ฌ๋ด
์น๊ตฌ๊ฐ ๋ฉ์ง ๊ธฐ๋ฅ์ ์ ์ํด ์คฌ์ต๋๋ค.
๐ฅ JUST DO IT
๋น๋ก ํ๋ ์๊ฐ๋ ์์์ง๋ง ํ๊ต์์๋ง ํ ์ ์๋ ํ๋ก์ ํธ๋ค์ ์งํํ๋ค๋ ๊ฒ ์์ฒด๊ฐ ์ ๋ง ์ฌ๋ฏธ์๋ ์ถ์ต์ผ๋ก ๋จ์๋ ๊ฒ ๊ฐ์์. ์ฌ๋ฌ๊ฐ์ง ์ํ ํคํ๋๋ ์์๊ณ , ๋ฟ๋ฏํ๋ ์๊ฐ๋ค๋ ์์์ผ๋๊น์.
๊ทธ๋ฅํด
๋์๋ณด๋ ์ฝ๊ฐ ์ปจ์ ๋ผ ๋์น๋ ๊ธ์ด ๋ ๊ฒ ๊ฐ์ง๋ง, ์ฌ๋ฏธ์๋ ์์ด๋์ด๊ฐ ์๋๋ฐ๋ ์ฃผ์ ํ๋ ํ์ ๋ถ๋ค์ด ๊ณ์๋ค๋ฉด ๋จ๋ค ๋์น๋ณด์ง ๋ง๊ณ ๊ทธ๋ฅ ํด๋ณด์ จ์ผ๋ฉด ์ข๊ฒ ๋ค๋ ๋ป์์ ์ฐ๊ฒ ๋์์ต๋๋ค!
ํน์ ๋ฐ๋ณต๋๋ ํ์๋ ์์ ์ผ๋ก ์ธํด ๊ณ ํต๋ฐ๋ ๋ถ์ด ๊ณ์๋ค๋ฉด, ์ค๋ ๋ค๋ฃฌ ์ฝ๋์ ์ ์ฒด ์์ค๋ ๊นํ๋ธ ์ฌ๊ธฐ์ ์์ผ๋ ํฌํฌํด์ ์ฌ์ฉํด๋ณด์ธ์. ๋ชจ๋ ์ข ๋ฅ์ ๊ธฐ์ฌ๋ ํ์ํฉ๋๋ค๐
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ค ์ฝ๋ก๋ ์ธํํธ ์๋, ์ฐ๋ฆฌ๋ ์ด๋ป๊ฒ ์์ ์๊ฐ์ ์ ์ ์์๊น์?), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@junhoyeo/์ฝ๋ก๋-์ธํํธ-์๋-์ฐ๋ฆฌ๋-์ด๋ป๊ฒ-์์ -์๊ฐ์-์-์-์์๊น์์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค