Pico CSS는 간결함과 시맨틱을 극대화하는미니멀 CSS 프레임워크임. HTML의 시맨틱 요소를 직접 스타일링하고, 전체적으로 클래스 사용을 10개 미만으로 줄여 유지보수성과 읽기 쉬운 코드를 제공함. 클래스가 전혀 없는 버전도 제공되어 HTML 순수주의를 추구하는 사용자에게도 적합함.
주요 특징
Class-light & Semantic
HTML 태그에 직접 스타일을 적용하여,필요한 CSS 클래스 개수를 대폭 줄임
클래스가 없는(class-less)버전도 지원하여 항목 기반 스타일에서 벗어난 자유도 보장함
Just CSS, No Dependencies
외부 라이브러리, 패키지 매니저, JavaScript없이 동작함
HTML 마크업만으로도손쉽게우아한 스타일 구현 가능함
반응형 디자인
폰트 크기와 공간을 화면 크기에 따라 자동으로 조절하여, 모든 기기에서 일관되고 세련된 UI 경험 제공함
추가적인 클래스 지정이나 설정 없이자동 대응됨
라이트/다크 모드 자동 전환
밝은 테마와 어두운 테마를 기본 제공함
브라우저 또는 OS 환경의prefers-color-scheme설정에 따라자동으로 색상 테마가 적용됨
자바스크립트 사용 없이오로지 CSS로 구현함
쉬운 커스터마이징
130개 이상의 CSS 변수제공으로 간단하게 스타일 커스텀 가능함
SASS를 사용한 심화 커스터마이징도 지원함
20개의핸드크래프트 컬러 테마와 30개 이상의모듈형 컴포넌트를 제공, 브랜드별 UI로 간편하게 확장 가능함
"""
python 기존 로또 당첨번호를 이용한 로또 번호 추출 프로그램
"""
import pandas as pd
import random
from collections import Counter
def load_winning_numbers(filepath="winning_numbers.csv"):
"""
CSV 파일에서 로또 당첨 번호를 불러옵니다.
"""
try:
df = pd.read_csv(filepath)
# 추첨 번호(drwtNo1 ~ drwtNo6)만 추출합니다.
winning_nums_cols = [f'drwtNo{i}' for i in range(1, 7)]
return df[winning_nums_cols]
except FileNotFoundError:
print(f"오류: '{filepath}' 파일을 찾을 수 없습니다.")
print("동행복권 웹사이트 등에서 당첨 번호 데이터를 CSV 파일로 다운로드하여 같은 폴더에 넣어주세요.")
return None
except Exception as e:
print(f"데이터 로딩 중 오류 발생: {e}")
return None
def analyze_number_frequency(winning_numbers_df):
"""
각 숫자의 출현 빈도를 분석합니다.
"""
all_numbers = []
# 모든 당첨 번호 목록을 하나로 합칩니다.
for index, row in winning_numbers_df.iterrows():
all_numbers.extend(row.tolist())
# 각 숫자의 출현 횟수를 셉니다.
number_counts = Counter(all_numbers)
# 빈도수 기준으로 내림차순 정렬
sorted_counts = sorted(number_counts.items(), key=lambda item: item[1], reverse=True)
return dict(sorted_counts) # {숫자: 빈도수} 형태로 반환
def generate_random_numbers():
"""
가장 기본적인 방법으로 6개의 무작위 로또 번호를 생성합니다.
"""
return sorted(random.sample(range(1, 46), 6))
def generate_numbers_based_on_frequency(number_frequency, num_recommendations=1, exclude_numbers=None):
"""
과거 당첨 빈도를 기반으로 로또 번호를 추천합니다.
(이 전략은 통계적 예측이 아닌, 자주 나온 번호 중에서 무작위로 선택하는 방식입니다.)
"""
if number_frequency is None:
print("경고: 번호 빈도 분석 데이터를 찾을 수 없어 무작위 번호를 생성합니다.")
return [generate_random_numbers() for _ in range(num_recommendations)]
# 빈도수가 높은 순서대로 숫자 목록을 만듭니다.
# (실제로는 빈도수에 가중치를 두어 추출하는 더 복잡한 알고리즘도 가능합니다)
sorted_numbers = list(number_frequency.keys())
recommendations = []
for _ in range(num_recommendations):
generated_numbers = set()
# 이미 추천된 번호들을 제외할 경우
if exclude_numbers:
available_numbers = [num for num in sorted_numbers if num not in exclude_numbers]
else:
available_numbers = sorted_numbers
# 혹시 available_numbers가 6개 미만일 경우를 대비
if len(available_numbers) < 6:
print("경고: 추천할 수 있는 숫자가 충분하지 않습니다. 모든 번호에서 추출합니다.")
available_numbers = list(range(1, 46))
# 빈도수 기반으로 6개의 고유한 번호 추출
# (단순히 빈도수 높은 순서대로 앞에서 6개 뽑는 것이 아니라,
# 빈도수를 가중치로 해서 랜덤 샘플링하는 것이 더 무작위적입니다.)
# 여기서는 편의상, 빈도수 높은 순서대로 나열된 리스트에서 랜덤하게 뽑습니다.
# 더 나은 방법: 빈도수에 비례하여 숫자를 뽑기 (예: [1,1,1,2,2,3] -> 1,2,3이 나올 확률이 다름)
# 이 예시에서는 단순화하여, 빈도수 순서대로 나열된 숫자 리스트에서 6개를 고유하게 뽑습니다.
# 자주 나온 번호들 중에서 (예: 상위 20개) 무작위로 6개 선택
top_n_numbers = sorted_numbers[:20] # 상위 20개 번호
if len(top_n_numbers) < 6:
# 혹시 상위 20개보다 전체 숫자가 적다면
top_n_numbers = sorted_numbers
# 상위 번호들 또는 전체 번호에서 무작위로 6개 선택
try:
chosen_numbers = sorted(random.sample(top_n_numbers, 6))
except ValueError: # 만약 top_n_numbers가 6개 미만일 경우
chosen_numbers = sorted(random.sample(available_numbers, 6))
recommendations.append(chosen_numbers)
return recommendations
# --- 메인 프로그램 ---
if __name__ == "__main__":
file_path = "winning_numbers.csv" # 로또 당첨 번호 CSV 파일 경로
print("==== 로또 번호 추천 프로그램 ====")
# 1. 과거 당첨 번호 로드
winning_numbers_df = load_winning_numbers(file_path)
if winning_numbers_df is not None:
# 2. 번호 빈도 분석
number_frequency = analyze_number_frequency(winning_numbers_df)
print("\n[과거 당첨 번호 출현 빈도 (상위 10개)]")
for number, count in list(number_frequency.items())[:10]:
print(f" - 숫자 {number}: {count}회")
# 3. 로또 번호 추천
num_sets_to_recommend = 5 # 몇 세트의 번호를 추천받을지 설정
# 빈도 기반 추천
frequency_based_recommendations = generate_numbers_based_on_frequency(
number_frequency,
num_recommendations=num_sets_to_recommend
)
print(f"\n[과거 당첨 빈도 기반 추천 번호 ({num_sets_to_recommend} 세트)]")
for i, numbers in enumerate(frequency_based_recommendations):
print(f" 세트 {i+1}: {numbers}")
# 단순 무작위 추천 (비교용)
random_recommendations = [generate_random_numbers() for _ in range(num_sets_to_recommend)]
print(f"\n[단순 무작위 추천 번호 ({num_sets_to_recommend} 세트)]")
for i, numbers in enumerate(random_recommendations):
print(f" 세트 {i+1}: {numbers}")
else:
print("\n데이터 로딩 실패로 인해 번호 추천을 진행할 수 없습니다.")
print("프로그램을 종료합니다.")
- 더 편하게 Reels 감상(아이폰 용과 다르게 릴스가 기본 화면. 타임라인은 탭해야 보임) - 새로운 팔로잉 탭 도입: 전체(팔로우)/친구(맞팔)/최신(시간순) 보기 - 큰 화면에 최적화된 인스타그램 경험 * 메시지와 알림 두개의 탭을 같이 보기 * Reels 감상시 전체화면 크기로 재생하며 댓글보기 가능 - iPadOS 15.1 이상 - Instagram - App Store 링크(기존 앱이 iPad도 지원)
생성형 AI의 등장 이후 가장 뜨거운 화두는 단연 오픈AI입니다. 하지만 그들은 단순히 강력한 모델을 만드는 데 그치지 않습니다. 오픈AI의 전략은 마치 체스 게임처럼 장기적인 안목으로 설계된 '10년 판짜기'에 가깝죠. 표면적으로는 놀라운 기술적 진보가 전부인 것처럼 보이지만, 그 이면에는 AI 시대의 모든 기술과 시장을 직접 설계하려는 거대한 야망이 숨겨져 있습니다.
오픈AI는 크게 두 가지 핵심 축을 중심으로 기업 개발 전략을 전개하고 있습니다. 첫째는 수직적으로 통합된 기술 스택을 구축하기 위한 전략적 인수이며, 둘째는 지배적인 플랫폼 생태계를 조성하기 위한오픈AI 스타트업 펀드를 통한 벤처 투자입니다. 이러한 이중적 접근 방식은 오픈AI가 연구 중심의 조직에서 성숙한 제품 주도형 기술 대기업으로 빠르게 전환하고 있음을 보여주죠.
오픈AI가 투자했던 스타트업 일부를 보여주는 그래픽입니다. 저는 개발자 도구 '커서'와 에듀테크 '스픽'이 눈에 띄네요. <출처=CB인사이츠>
여기서 잠깐! 오픈AI가 어떤 회사인지를 알고 넘어가는 것도 중요합니다. 오픈AI는 기본적으로 '인공 일반 지능(AGI)이 모든 인류에게 이익을 주도록 보장한다'는사명을 추구하기 위해 비영리 이사회가 통제하는 이른바 '수익 상한'(capped-profit) 기업이라는 독특한 구조를 채택했습니다. 이 구조는 현재 오픈AI의 기업 전략 전반에 깊은 영향을 미치고 있죠.
한편으로는 장기적이고 자본 집약적인 연구를 추구할 수 있는 자유를 부여하지만, 다른 한편으로는 막대한 컴퓨팅 비용을 충당하기 위해 상당한 수익을 창출해야 하는 필요성을 야기합니다.
서두에서 잠깐 언급한 대로 오픈AI가 성장을 위해 전략적 인수와 벤처 투자에 집중하는 것도 이 때문입니다. 핵심 기술과 관련 인재를 확보하기 위해 아예 해당 회사를 사들이거나 오픈AI 스타트업 펀드를 통해 생태계를 키우는 것! 이는 AI라는 거대한 '엔진'의 성능을 끌어올리는 동시에 그 엔진을 활용한 다양한 '차량'(외부 애플리케이션)이 번성할 수 있는 환경을 조성하는 이중 전략인 셈입니다.
이러한 접근 방식은 단순한 기업 성장을 넘어섭니다. AI 기술 스택의 핵심과 떠오르는 애플리케이션 생태계에 대한 통제권을 확보하려는 정교한 계산이죠. 예를 들어'록셋'(데이터 인프라)이나'스탯시그'(제품 테스트)같은 기업 인수는 핵심 성능 지표에 대한 직접적인 통제권을 부여하고 외부 의존도를 낮춥니다. 동시에 스타트업 펀드는 오픈AI API에 깊숙이 의존하는 기업들에 투자함으로써 높은 전환 비용을 만들고 플랫폼의'고착 효과'를 강화합니다.
이는 과거 마이크로소프트가 운영체제(OS)를 통해 개발자 생태계를 장악하고, 애플이 하드웨어부터 소프트웨어, 앱스토어까지 모두 통제했던 전략과 매우 유사합니다. 결국 오픈AI는 AGI를 구축하는 것을 넘어 스스로가 필수불가결한 중심이 되는 시장을 설계하고 있는 것입니다. (여러분의 생각은 어떠신가요?)