Day1
자동차 제조사가 같은 이치
스마트폰 부팅 때 로고 뒤에 나오는 것 → 주로 우분투 부팅 코드
class Student: # 안에서 돌아가는 로직이라는 뜻 def__init__
def __init__(self, name, korean, math, english, science):
self.name = name
self.korean = korean
self.math = math
self.english = english
self.science = science
def get_data(self):
return self.name
data = Student('원빈',100,90,80,70)
data2 = Student('장동건',100,90,80,70)
data2.name ##장동건
data2.get_data() ## 장동건
class sk25(Student):
pass
std1=sk25("서찬웅",100,100,100,100)
std1.name #서찬웅
class sk25(Student):
def __init__(self, name, korean, math, english, science,phone):
super().__init__(name,korean,math,english,science)
self.phone=phone
def get_math(self):
return self.math
std1=sk25("서찬웅",100,100,100,100,'01000000000')
std1.name #서찬웅
std1.get_math() #100
std1.phone
dir(sk25)
a =[1,2,3]
a.__len__() #3
a =[1,2,3]
a.__getitem__(1) #2
class Student:
def __init__(self,name):
self._name=name
a = Student("원빈")
a._name #원빈
a._name = '장동건'
a._name # 장동건
class Student:
def __init__(self,name):
self._name=name
@property
def name(self):
return self.name
@name.setter
def name(self,value):
self._name= value
@name.getter
def name(self):
return self.name
class Student:
def __init__(self,name):
self._name=name
@property
def math(self):
return self.name
@math.setter
def math(self,value):
print("setter")
if 0<=value <=100:
self._name= value
else:
raise ValueError("retry")
@math.getter
def name(self):
print("getter")
return self.name
def __str__(self): #print 출력을 위한 내장함수
return self._name
b = Student('엔코아')
b.math= 101
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[44], line 1
----> 1 b.math= 101
Cell In[43], line 15
13 self._name= value
14 else:
---> 15 raise ValueError("retry")
ValueError: retry
try:
b.math= 101
except Exception as e :
print(e)
#setter
#retry
conda create --name pandas_1 python=3.10
conda activate pandas_1
(pandas_1) C:\Users\rosie>
conda deactivate
pip install ipykernel
(pandas_1) C:\Users\rosie>python -m ipykernel install --user --name pandas_1 --display-name pandas_1


import pandas as pd
pd.__version__ #'1.5.3'
pd.DataFrame(r.json())
from datetime import datetime, date , timedelta
import requests
url = "https://api.stock.naver.com/chart/domestic/item/{}/day?startDateTime={}&endDateTime={}"
url.format('005930', datetime.now().strftime("%Y%m%d") + "0000", datetime.now().strftime("%Y%m%d") + "0000")
r= requests.get(url.format('005930', "202512010000", datetime.now().strftime("%Y%m%d") + "0000")
)
pd.DataFrame(r.json())
np.array([1,2,3])/10
# array([0.1, 0.2, 0.3])
test={1,2,3}
test | {3,4,5}
test &{3,4,5}
test - {3,4,5}
list(set([1,1,2,2,234,5,6,6,7,77,7,89,9,9,9,9,9,0]))
#[0, 1, 2, 5, 6, 7, 9, 234, 77, 89]
boj_1302.py
n = int(input())
book_list=[]
for _ in range(n):
book_list.append(input())
book_counts={}
for book in book_list:
if book in book_counts:
book_counts[book]+=1
else:
book_counts[book]=1
book_counts=sorted(book_counts.items())
answer_book=''
answer_count=0
for book, count in book_counts:
if count > answer_count:
answer_count=count
answer_book=book
print(answer_book)
"""
강사님 코드. 너무 간단하다...
books = {}
number = int(input())
for _ in range(number):
name = input()
if name in books:
books[name] += 1
else:
books[name] = 1
print(sorted(books.items(), key= lambda x : (-x[1], x[0]))[0][0])
"""
from collections import deque
dq =deque()
dq.append(10)
dq.appendleft(20)
print("1.",dq)
dq.append(30)
print("2.",dq)
dq.pop()
print("3.",dq)
dq.popleft()
print("4.",dq)
모델 서빙을 위해 가르치는 것이었음.
ipv4 → 32비트
255 → ff
IPv4 주소 . . . . . . . . . : 192.168.0.8(기본 설정) ⇒ 공유기 따라 다름
서브넷 마스크 . . . . . . . : 255.255.255.0
링크-로컬 IPv6 주소 . . . . : fe80::b451:bca5:61fd:42bd%8(기본 설정)
→ 완전 로컬.
private ip ⇒ 공유기 ⇒ kt 단말기 ⇒ 네이버 서버
pricate ip ⇒ 172~, 192.~
모수적 통계 기법 ⇒ 분포를 알고 분석
비모수적 통계 기법 ⇒ 분포 모르는 상태로 분석
API(Application Programming Interface)
REST(ful) API
time.sleep(abs(random.gauss(0,1)))
import os
import requests
import time, random
from tqdm import tqdm
if not os.path.isdir("./stock"):
os.mkdir("./stock")
past_day = str(date.today() - timedelta(days=30)).replace("-", "") + '0000'
today = str(date.today()).replace("-", "") + '0000'
for x in tqdm(data.split("\n")[1:]):
# print(i)
# if i == 10:
# break
y = x.replace('"', '').split(",")
if y[2] == 'KOSPI':
# print(y[0], y[1])
url = f"https://api.stock.naver.com/chart/domestic/item/{y[0]}/day?startDateTime={past_day}&endDateTime={today}"
# print(url)
with open(f"./stock/{y[1]}.csv", "a", encoding='utf-8') as f:
for x in requests.get(url).json():
f.write(','.join(map(str,x.values())) + "\n")
time.sleep(abs(random.gauss(0,1)))
streamlit run stock_app.py ip =0.0.0.0
Day2
pip install virtualenv
virtualenv venv
cd venv
cd Scripts
cd activate
(venv) C:\Users\rosie\venv\Scripts>
.net 프레임워크(비쌈.)
클라우드 azure
구글은 gcp
1등 클라우드는 aws
DOS ⇒ powershell
red hat
import pygame
pygame.init()
screen = pygame.display.set_mode((800,600))
##============================== 색상 코드 ==============================##
BLUE=(0,0,255)
WHITE=(255,255,255)
RED=(255,0,0)
SKYBLUE=(136,221,221)
BLACK=(0,0,0)
##============================== 색상 코드 ==============================##
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill(SKYBLUE)
##============================== 눈사람 ==============================##
pygame.draw.circle(screen,WHITE,[400,200],80) #좌표, 지름
pygame.draw.circle(screen,WHITE,[400,350],100) #좌표, 지름
pygame.draw.rect(screen, RED, [340,249,130,30], 50)
pygame.draw.circle(screen, BLACK, [362, 180],5)
pygame.draw.circle(screen, BLACK, [432, 180],5)
pygame.draw.circle(screen, BLACK, [400, 200],5)
##============================== 눈사람 ==============================##
x,y= pygame.mouse.get_pos()
print(f"{x} {y}")
pygame.display.flip()
pygame.quit()
overriding
overloading
import random
random.randrange(0,7)
pip install pyinstaller
pyinstaller --onefile --windowed ./dino/main.py
Day3
import sys
print('출력1',sys.argv[0])
print('출력2',sys.argv[1])
print('출력3',sys.argv[2])
(base) C:\skn-25\wk2>python ./20260107.py 안녕 hi
출력1 ./20260107.py
출력2 안녕
출력3 hi
(base) C:\skn-25\wk2>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 92F2-D5EF
C:\skn-25\wk2 디렉터리
ipynb
2026-01-05 오전 11:29 237 requirements.txt
2026-01-05 오후 04:31 <DIR> stock
2025-12-31 오후 01:27 1,896 stock.py
2026-01-05 오후 05:53 859 stock_app.py
2026-01-05 오후 04:15 <DIR> __pycache__
2026-01-05 오후 05:22 114 삼성전자.csv
10개 파일 440,752 바이트
4개 디렉터리 68,251,316,224 바이트 남음
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('name', help='사용자의 이름')
args = parser.parse_args()
print(args.name)
(base) C:\skn-25\wk2>python ./20260107.py nayeon
nayeon
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', help='사용자의 이름')
parser.add_argument('--age', help='사용자의 나이')
args = parser.parse_args()
print(args.name, args.age)
(base) C:\skn-25\wk2>python ./20260107.py --name nayeon --age 25
nayeon 25
import argparse
parser= argparse.ArgumentParser()
parser.add_argument('--code',help="종목코드 입력")
parser.add_argument('--sdate',help='시작 날짜')
parser.add_argument('--edate',help='끝 날짜')
parser.add_argument('--type',help='일,주,월 선택')
args = parser.parse_args()
print(args.code, args.sdate, args.edate, args.type)
(base) C:\skn-25\wk2>python get_stock.py --code 005930 --sdate 20260101 --edate 20260106 --type day
005930 20260101 20260106 day
import argparse
import requests
## 윗단의 코드들은 다른 코드에서 모듈로 불러올 수 있음
def stock(code, sdate, edate, type_):
return f"https://api.stock.naver.com/chart/domestic/item/{code}/{type_}?startDateTime={sdate}&endDateTime={edate}"
if __name__=="__main__":
## 이 코드를 독단적으로 돌리기 위함. __name__ 이 main인 것임
## 터미널에서 실행 시 돌아갈 수 있음
parser = argparse.ArgumentParser()
parser.add_argument('--code', help="종목 코드를 입력")
parser.add_argument('--sdate', help="시작 날짜")
parser.add_argument('--edate', help="끝 날짜")
parser.add_argument('--type', help="일, 주, 월 선택")
args = parser.parse_args()
# print(args.code, args.sdate, args.edate, args.type)
print(stock(args.code, args.sdate, args.edate, args.type))
(base) C:\skn-25\wk2>python get_stock.py --code 005930 --sdate 20260101 --edate 20260106 --type day
https://api.stock.naver.com/chart/domestic/item/005930/day?startDateTime=20260101&endDateTime=20260106
터미널에서 실행할 것인지 외부에서 모듈로 사용할 것인지에 따라 name에 넘어가는 인자가 변경됨
import 때 다른 python 파일에 같은 함수를 만들 수 있으므로, import 때 * 사용 지양
CS 기준 namespaces 문제
from module_b import add
from module_a import add
import folium
import pickle #데이터의 직렬화, 인코딩 깨짐 신경 안써도 됨
with open("./star.pkl","rb") as f:
data=pickle.load(f)
pickle : 데이터 binary로 저장
seoul_map = folium.Map(location=[37.55, 126.88], tiles="Cartodb Positron", zoom_start=12)
for i in range(len(data['list'])):
folium.Marker(location=[data['list'][i]['lat'], data['list'][i]['lot']],
popup=data['list'][i]['s_name']).add_to(seoul_map)
seoul_map.save("./star.html")
import pandas as pd
df = pd.DataFrame(data['list'])
df.shape
df.head()
df.tail()
df.isnull().sum() #결측치 체크
df['s_name'] #pandas.core.series.Series
type(df['s_name'].values) #numpy.ndarray
numpy 한 줄 ⇒ series
series 묶으면 ⇒ dataframes
결측치 채울 때 지식 중요
import numpy as np
np.array(range(0,11)) #벡터로 보면 됨
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
np.array(range(0,11)) >5
array([False, False, False, False, False, False, True, True, True,
True, True])
mask = np.array(range(0,11)) >5 #로직 설계
np.array(range(0,11))[mask]
array([ 6, 7, 8, 9, 10]법
df.isnull().sum()[df.isnull().sum() ==0] #마스크 적용, 얘는 결측치 없음
df2=df[df.isnull().sum()[df.isnull().sum() ==0].index].copy()
df2.shape
df2[['s_name','gugun_name','addr','lot','lat']].head(2)
| s_name | gugun_name | addr | lot | lat |
|---|---|---|---|---|
| 0 | 역삼아레나빌딩 | 강남구 | 서울특별시 강남구 역삼동 721-13 아레나빌딩 | 127.043069 |
| 1 | 논현역사거리 | 강남구 | 서울특별시 강남구 논현동 142-2 정일빌딩 | 127.022223 |
df3.set_index("s_name",inplace=True)
df3.index
Index(['역삼아레나빌딩', '논현역사거리', '신사역성일빌딩', '국기원사거리', '대치재경빌딩', '봉은사역', '압구정윤성빌딩',
'코엑스별마당', '삼성역섬유센터R', '압구정R',
...
'상봉', '중랑역', '중랑구청', '사가정역', '상봉역', '면목역', '묵동', '망우동', '양원역', '중화역'],
dtype='object', name='s_name', length=671)
df3.iloc[0:2,[3,1]]

df3.loc["역삼아레나빌딩":"신사역성일빌딩",'addr':'lat']

starbucks_agg = df3.gugun_name.value_counts()
gugun_name
강남구 99
서초구 57
중구 54
종로구 43
영등포구 43
송파구 39
import requests
requests.get("https://t1.daumcdn.net/cfile/tistory/272C224C58B4BD540B").json()
서울좌표값
이거 못구했으면 국토부 사이트에서 구해와야함.
시각화가 업무로 넘어간다면 BI
Salesforce는 crm 하는 , 슬랙 만든 회사
tableau
import folium
import pickle #데이터의 직렬화
import requests
import pandas as pd
with open("./star.pkl","rb") as f:
data=pickle.load(f)
df = pd.DataFrame(data['list'])
df2=df[df.isnull().sum()[df.isnull().sum() ==0].index].copy()
df3= df2[['s_name','gugun_name','addr','lot','lat']].copy()
starbucks_agg= df3.gugun_name.value_counts()
seoul_sb = folium.Map(location=[37.55, 126.88], tiles="OpenStreetMap", zoom_start=12)
location = requests.get("https://t1.daumcdn.net/cfile/tistory/272C224C58B4BD540B").json()
agg_df = pd.DataFrame(starbucks_agg).reset_index()
folium.Choropleth(location, data=agg_df,columns=['gugun_name', 'count'], fill_color="PuRd",
key_on='feature.id').add_to(seoul_sb)
코테 푸는 중인데, 내가 2차원 배열에 아주 약하다는 사실을 깨달았다. 2차원 배열 순환하면서 다 출력하는거 어떻게 하는거더라.
pip list --format=freeze > requirements.txt #덮어쓰기
pip list --format=freeze >> requirements.txt #추가
echo # 터미널에 출력
'201107' > '20260101' #False , 날짜 다루기 조심
hex(ord('a'))
import pandas as pd
kbo_df= pd.read_csv('./kbo.csv',encoding="utf-8")
kbo_df.head()
kbo_df.loc[1,'경력']
kbo_df.iloc[1,5] #'태전초(경기광주시리틀)-모가중-야로고BC-동원대'
height= int("188cm/88kg ".split('/')[0].replace("cm",""))
weight= int("188cm/88kg ".split('/')[1].replace("kg",""))
round(weight/(height/100)**2,2) #24.9
kbo_df['신장']=kbo_df['신장/체중'].apply(lambda x : x.split('/')[0].replace("cm",""))
kbo_df['신장'] = kbo_df['신장/체중'].apply(lambda x : x.split('/')[0].replace("cm", ""))
kbo_df['체중'] = kbo_df['신장/체중'].apply(lambda x : x.split('/')[1].replace("kg", ""))
kbo_df=kbo_df[kbo_df['신장']!=''].copy()
kbo_df['신장']=kbo_df['신장'].astype(int)
kbo_df['체중']=kbo_df['체중'].astype(int)
kbo_df['bmi']=(kbo_df['체중']/(kbo_df['신장']/100)**2)
kbo_df.sort_values(by=['bmi'],ascending=False).tail()
좀 더 똑똑하게 만들기.
n = int(input())
list_check = dict()
for _ in range(n):
name, check = input().split()
if check == 'enter':
list_check[name] = 1
else:
del list_check[name]
for name, _ in sorted(list_check.items(), key=lambda x : x[0], reverse=True):
print(name)
Reuters → 유명한 언론 기사, 데이터 비쌈
기업에서 사업하기 전 중요한 task
Day4
리스트 안에 딕셔너리 있는 구조 → 데이터프레임
kbo_df['생년월일'].isnull().sum()
kbo_df['생년월일'].apply(lambda x : len(x) !=13).sum()
from datetime import datetime
kbo_df['days'] = kbo_df['생년월일'].apply(lambda x : \
(datetime.now() - datetime.strptime(x, "%Y년 %m월 %d일")).days)
kbo_df.sort_values(by=['days'])
kbo_df.sort_values(by=['Team','days'],ascending=[True,False])
kbo_df[kbo_df['Team']=='고양 히어로즈']
kbo_df.loc[kbo_df['Team']=='고양 히어로즈','Team'] = '키움 히어로즈'
kbo_df['Team'].unique()
kbo_df[(kbo_df['Team']=='LG 트윈스') & (kbo_df['포지션']=='투수(우투우타)')]
kbo_df[(kbo_df['Team']=='LG 트윈스') | (kbo_df['포지션']=='투수(우투우타)')]
kbo_df['출신초등학교']=kbo_df['경력'].apply(lambda x : x.split('-')[0])
kbo_df['출신초등학교']
import re
p=re.compile("[가-힣a-zA-Z]+초")
kbo_df['출신초등학교'].value_counts()
import logging
import datetime # 예제용
# 로깅 기본 설정 (스크립트 시작 시 한 번만 호출)
log_format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s'
log_datefmt = '%Y-%m-%d %H:%M:%S' # 예: 2025-04-22 10:07:49
logging.basicConfig(level=logging.INFO, # INFO 레벨 이상만 기록
format=log_format,
datefmt=log_datefmt)
# 이제 로깅 함수 사용 가능
logging.debug("상세 디버깅 정보입니다. (INFO 레벨 설정 시 출력 안 됨)")
logging.info("프로그램이 시작되었습니다. (위치: Seoul)") # 위치 정보 활용
logging.warning("설정 파일 (~/config.ini)을 찾을 수 없어 기본값을 사용합니다.")
logging.error("데이터베이스 연결에 실패했습니다.")
logging.critical("시스템의 주요 구성 요소가 작동하지 않습니다!")
(base) C:\skn-25\wk2>python log.py
2026-01-08 11:23:38 - INFO - root - 프로그램이 시작되었습니다. (위치: Seoul)
2026-01-08 11:23:38 - WARNING - root - 설정 파일 (~/config.ini)을 찾을 수 없어 기본값을 사용합니다.
2026-01-08 11:23:38 - ERROR - root - 데이터베이스 연결에 실패했습니다.
2026-01-08 11:23:38 - CRITICAL - root - 시스템의 주요 구성 요소가 작동하지 않습니다!
root가 뭘 하고 다니는지 체크 가능
logging.basicConfig(level=logging.INFO, # INFO 레벨 이상만 기록
format=log_format,
datefmt=log_datefmt)
logging.FileHandler("./logs/mylog.txt",mode='a',encoding='utf-8')
로그파일 핸들러한테 이야기해서 추가하기.
appwiz.cpl

빨간 부분 클릭하고 재부팅
C:\Users\rosie>wsl
다운로드 중: Linux용 Windows 하위 시스템 2.6.3
설치 중: Linux용 Windows 하위 시스템 2.6.3
Linux용 Windows 하위 시스템 2.6.3이(가) 설치되었습니다.
Windows 선택적 구성 요소 설치 중: VirtualMachinePlatform
배포 이미지 서비스 및 관리 도구
버전: 10.0.26100.5074
이미지 버전: 10.0.26100.7462
기능을 사용하도록 설정하는 중
[==========================100.0%==========================]
작업을 완료했습니다.
요청한 작업이 잘 실행되었습니다. 시스템을 다시 시작하면 변경 사항이 적용됩니다.
Linux용 Windows 하위 시스템 설치된 배포가 없습니다.
아래 지침에 따라 배포를 설치하여 이 resolve 수 있습니다.
사용 가능한 배포를 나열하려면 'wsl.exe --list --online' 사용
설치하려면 'wsl.exe --install '를 선택하세요.
unix ⇒ linux ⇒ linux 배포판
배포판마다 조금씩 다름
C:\Users\rosie>wsl --list --online
C:\Users\rosie>wsl --list --online
다음은 설치할 수 있는 유효한 배포 목록입니다.
'wsl.exe --install '을 사용하여 설치합니다.
NAME FRIENDLY NAME
Ubuntu Ubuntu
Ubuntu-24.04 Ubuntu 24.04 LTS
openSUSE-Tumbleweed openSUSE Tumbleweed
C:\Users\rosie>wsl --install Ubuntu-24.04
다운로드 중: Ubuntu 24.04 LTS
설치 중: Ubuntu 24.04 LTS

못생겼당
rosie@ming9:/mnt/c/Users/rosie$ cd ## 아직 남의 집이라 제약 있음
rosie@ming9:~$ pwd
/home/rosie
rosie@ming9:~$
딥러닝에서 활용
tensorflow는 작업시 wsl 사용하라고 가이드 존재.
코랩도 리눅스 기반.(굳이 따지면 컨테이너 기반)
cd : change directory → 그냥 치면 home으로 감.
pwd : 현재 경로
mnt : docking, 연결이라는 뜻.
rosie@ming9:~$ whoami
rosie
rosie@ming9:~$ pwd
/home/rosie
rosie@ming9:~$ sudo su
[sudo] password for rosie:
root@ming9:/home/rosie# pwd
/home/rosie
root@ming9:/home/rosie# whoami
root
root@ming9:/home/rosie# exit
exit
vim ~/.bashrc
rosie@ming9:~$ ls -al
total 32
drwxr-x--- 3 rosie rosie 4096 Jan 8 14:22 .
drwxr-xr-x 3 root root 4096 Jan 8 12:43 ..
-rw------- 1 rosie rosie 49 Jan 8 14:22 .bash_history
-rw-r--r-- 1 rosie rosie 220 Jan 8 12:43 .bash_logout
-rw-r--r-- 1 rosie rosie 3774 Jan 8 14:22 .bashrc
drwx------ 2 rosie rosie 4096 Jan 8 12:43 .cache
-rw-rw-r-- 1 rosie rosie 0 Jan 8 12:43 .motd_shown
-rw-r--r-- 1 rosie rosie 807 Jan 8 12:43 .profile
-rw-r--r-- 1 rosie rosie 0 Jan 8 14:12 .sudo_as_admin_successful
-rw------- 1 rosie rosie 1475 Jan 8 14:22 .viminfo
rosie@ming9:~$
파일에서 . 찍혀있으면 숨겨진 파일
ls -al이면 숨겨진 것도 보이고, ls로만 하면 안보임
순서대로
파일인지 디렉토리인지 / 소유주/ 소유그룹 / 제 3자
rosie@ming9:~$ echo 'hi' >encore.txt
rosie@ming9:~$ chmod 700 ./encore.txt # 권한 변경
-rwx------ 1 rosie rosie 3 Jan 8 14:30 encore.txt #변경됨
rosie@ming9:~$ mkdir workspace
rosie@ming9:~$ cd workspace/
rosie@ming9:~/workspace$ python3
Python 3.12.3 (main, Jun 18 2025, 17:59:45) [GCC 13.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
rosie@ming9:~/workspace$ sudo apt update
rosie@ming9:~/workspace$ sudo apt install python3-pip
rosie@ming9:~/workspace$ apt-get moo
(__)
(oo)
/------\/
/ | ||
* /\---/\
~~ ~~
..."Have you mooed today?"...
pip3 install virtualenv --break-system-packages
rosie@ming9:~/workspace$ ls
encore
rosie@ming9:~/workspace$ ls -al
total 12
drwxr-xr-x 3 rosie rosie 4096 Jan 8 14:42 .
drwxr-x--- 5 rosie rosie 4096 Jan 8 14:42 ..
drwxr-xr-x 4 rosie rosie 4096 Jan 8 14:42 encore
rosie@ming9:~/workspace$
rosie@ming9:~/workspace$ pip3 install virtualenv --break-system-packages-


vscode에 encore라는 가상환경 사용
import bcrypt
bcrypt.hashpw('123'.encode('utf-8'),bcrypt.gensalt())
http://172.19.196.11:8501
localhost:8501

credentials:
usernames:
play:
name: rosie
password: '$2b$12$AsEex2EsRr5DM/JJQJHuBOXMHCVYya/lO3jk6QieSQ2VOugoBYUHO'
import streamlit as st
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader
with open('config.yaml', 'r' , encoding='utf-8') as file:
config = yaml.load(file, Loader=SafeLoader)
authenticator = stauth.Authenticate(
config['credentials'])
authenticator.login()
Day5
DBMS 만드는 회사 ⇒ oracle
씨퀄이라고도 읽는 경우 존재
포그라운드 vs 백그라운드
daemon → 백그라운드에서 실행되는 서비스
sudo apt update
apt install mysql-server
sudo service mysql status

정상적이다.(active)
sudo mysql -uroot

보통 q누르면 나갈 수 있음
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)


mysql> create user play@'%' identified by '123';
Query OK, 0 rows affected (0.03 sec)
mysql> grant all privileges on *.* to play@'%';
Query OK, 0 rows affected (0.02 sec)
mysql> quit
Bye
rosie@ming9:~$ pwd
/home/rosie
rosie@ming9:~$ cd /etc/mysql/mysql.conf.d
rosie@ming9:/etc/mysql/mysql.conf.d$
rosie@ming9:/etc/mysql/mysql.conf.d$ ls -al
total 16
drwxr-xr-x 2 root root 4096 Jan 9 09:18 .
drwxr-xr-x 4 root root 4096 Jan 9 09:18 ..
-rw-r--r-- 1 root root 132 Nov 19 05:53 mysql.cnf
-rw-r--r-- 1 root root 2220 Nov 19 05:53 mysqld.cnf
rosie@ming9:/etc/mysql/mysql.conf.d$
-rw-r--r-- ⇒ 아직 읽을 수만 있음

127.0.0.1 ⇒ Loopback IP . localhost
bind-address ⇒ 0.0.0.0으로 변경 (모두를 받아들임 ^~^.)
vim에서 i 켜면 insert모드, esc 입력하고 :wq 치면 vim에서 나가게 됨.
q!도 가능
rosie@ming9:/etc/mysql/mysql.conf.d$ sudo service mysql status

2 : eth0에 해당하는 ip를 db 생성 때 넣음
⇒ 이 과정으로 ubuntu 계정으로 연결.
rosie@ming9:/etc/mysql/mysql.conf.d$ sudo mysql -uplay -p123
mysql> create database encore;
Query OK, 1 row affected (0.02 sec)
CREATE TABLE encore.members (
id VARCHAR(255) NOT NULL,
name VARCHAR(255),
age INT,
PRIMARY KEY (id)
);

wsl
sudo service mysql status
CREATE TABLE encore.members (
id VARCHAR(255) NOT NULL,
name VARCHAR(255),
age INT,
PRIMARY KEY (id)
);

CREATE TABLE encore.members (
id VARCHAR(255) NOT NULL,
name VARCHAR(255),
age INT,
PRIMARY KEY (id)
);
select * from members;
INSERT INTO members (id, name, age) VALUES ('user1', '홍길동', 30);
INSERT INTO members ( name, age ,id ) VALUES ( '대한민국', 30, 'user2');

INSERT INTO members VALUES ('user6', '장동건', 31);
pip install sqlalchemy
pip install mysqlclient
import MySQLdb
conn=MySQLdb.connect(host='172.19.196.11',user='play',passwd='123',db='encore')
cursor= conn.cursor()
cursor.execute("show tables")
cursor.fetchall() #(('members',),)
cursor.execute("select * from members")
#파이썬에서는 세미콜론 안써도 됨
cursor.fetchall()
#출력
(('user1', '홍길동', 30),
('user2', '대한민국', 30),
('user5', None, None),
('user6', '장동건', 31))

sql= """CREATE TABLE onnuri(
name varchar(100),
market_name varchar(100),
address varchar(100),
category varchar(100),
paper_voucher char(1),
digital_voucher char(1),
year char(4)
)"""
cursor.execute(sql) #0
import csv
sql_insert="INSERT INTO onnuri VALUES (%s %s %s %s %s %s %s)"
file = "./소상공인시장진흥공단_전국 온누리상품권 가맹점 현황_20250731.csv"
with open(file, 'r', encoding='utf-8') as f:
csv_reader = csv.reader(f)
header = next(csv_reader)
# print(f"헤더: {header}")
for row_index, row_data in enumerate(csv_reader):
if len(row_data) != 7:
# print(row_data)
cursor.execute(sql_insert,row_data)

원래 인터넷 주소 : 120.2234..6.7.8…..
⇒ 외울 수 없으므로 DNS 사용.
DNS보다 먼저 작동하는 것이 host.

호스트 파일 편집기에 myserver를 추가하면 db에 추가된다.
SQL라이트 ⇒ 따로 설치가 필요없음.
지금은 mysql쓰는 중

Database에도 주소를 넣을 수 있다.
SELECT * FROM onnuri LIMIT 5;
SELECT name , market_name FROM onnuri LIMIT 5;
DESC onnuri;

SELECT name , market_name FROM onnuri LIMIT 5;
SELECT * FROM onnuri o
WHERE address ='경기';
SELECT * FROM onnuri o
WHERE address ='경기'
-- AND market_name = '단국대 앞 골목형상점가'
AND category = '치킨'
AND name LIKE '%교촌%';

SELECT count(1) CNT
FROM
(SELECT DISTINCT (category)
from onnuri o) A

(encore) rosie@ming9:~$ sudo vim /etc/hosts
(encore) rosie@ming9:~$ ping 8.8.8.8
(encore) rosie@ming9:~$ ping myserver
나중에 회사 서버를 받게 된다.
그러면 dns에 등록하면 됨!