10
RAD(락스) [정의] 강력한 소프트웨어 개발도구를 이용하여 매우 짧은 주기로 개발을 진행하는
순차적 소프트웨어 개발 프로세스
[특징]CASE tool, 빠른 개발기간(60~90일), 사용자 적극 참여
[프로세스] JRP(Joint Requirement planning;개획-분석)-JAD(Joint App Design,프로토타입 개발-평가-반복)-CutOver(개발-테스트-인수)
Agile 지라씨(JRAC)
토픽 이름 () RAD(Rapid Application Development)
분류 소프트웨어공학 > SDLC > RAD
키워드(암기) JRP, JAD, Construction Phase, Cutover
암기법(해당경우) 지라씨(JRAC)

기출문제

번호 문제 회차
1 11. JAD(Joint Application Design/Development) 107.컴시응.1.11

 

I. 짧은 개발 주기, 순차적개발모델 RAD 개요

  1. RAD (Rapid Application Development) 정의
    - 2~3개월의 짧은 개발주기 동안 소프트웨어를 개발하기 위한 순차적인 프로세스 모델로 빠른 개발을 위해 개발 툴을 적극적으로 사용
  2. RAD 특징
도구 활용
  1. CASE 도구, RDB, 재사용 Library 등을 활용하여 신속히 개발
사용자 참여
  1. 프로토타이핑 활용, 사용자가 요구사항 정의, 분석, 설계에 참여
짧은 개발기간
  1. 2~3개월의 짧은 기간으로 기술적 위험이 적고 빠른 개발에 적합
  • CASE(Computer Aided SW Engineering) : SW 개발 관련 작업을 자동화, 보조하는 도구

II. RAD 개념도(구성도) 및 구성요소

  1. RAD 개념도 (JAD Cutover 사이에 Construction Phase)

사용자와 함께 모델링 후 프로토타입을 반복 개발 및 수정 보완하여 구현 및 운영

 

 

. RAD의 구성요소

구성요소 설 명
JRP
(Joint Requirement Planning
사용자와 함께 요구사항을 분석하고 계획 수립
1~3주간 비즈니스, 데이터, 프로세스 모델링 작성/검토
JAD
(Joint Application development)
개략적 모델링 후 사용자와 함께 프로토타입 개발/수정/보완 반복을 통한 시스템 설계 (3~5)
Construction Phase 대상 시스템 상세 설계 완료 후 SW 구축
Cutover 운영에 필요한 지침서 작성 후 현업 부서로 이전
  • 사용자와 함께 요구사항 분석, 프로토 타입 개발

 

III. RAD 전통 생명주기와의 비교

구 분 RAD 전통 생명주기
목표
핵심 요구사항 만족, 시간 단축
고품질 SW 구현
개발인원 소규모, 사용자와 개발자 협업 대규모 개발 조직
분석/설계 개략적 분석/설계 완벽한 분석/설계
기법 JRD, JAD, Time-boxing 데이터 모델링, 프로세스 모델링
특징 사용자 지속참여, Tool 사용 순차적 접근, 하향식 접근

 

[RAD 참고 개념도 추가]

 

 

반응형

'정보관리기술사 > 소프트웨어공학' 카테고리의 다른 글

프로세스 그룹(5개)  (0) 2024.02.21
프로젝트 특징  (1) 2024.02.20
진화형 개발 모델  (0) 2024.02.18
증분형 개발 모델  (1) 2024.02.17
반복적 개발 모델  (0) 2024.02.16
9
진화형 개발 모델
(Evolutional Model)
[정의] 시스템의 프로토타입을 개발하면서 지속적으로 발전시켜 나가는 방법
[특징] 진화에대한 전체 개요(Outline) 필요, 프로토타입에서 지속 추가 기능,
핵심 개발 후 구성요소 개선

화나
토픽 이름 () 진화형(Evolutional) 개발 모델
분류 SW 공학 > 진화형(Evolutional) 개발 모델
키워드(암기) 진화형(Evolutional), 나무의 나이테, 요구사항 불명확, 피드백(Feedback), N단계 진화
암기법(해당경우) 이볼루션, 진화형,  나이테 (볼수록 화나)

문제

번호 문제 회차
1 1.5 반복점증적(iterative & incremental) 개발방법 적용시 회차 마다 작성되는 반복계획서와 평가서에 포함될 내용을 목차 형식으로 기술하시오. 관리.84.1교시.1
2 CBD프로젝트 수행시 단계(Inception Phase, Elaboration Phase, Construction Phase,Transition Phase)별로 목적(Goal) 이를 달성하기 위한 액티비티를 구체적으로 기술하고, 단계초기(Inception Phase, Elaboration Phase)에 반복, 점진적(Iterative & Incremental)방법론에 의해서 위험관리(Risk Management) 어떻게 전개되는지에 대해서 논하시오. 관리.77.2교시
3 S/W개발시 폭포수형(Waterfall) 개발방법과 RUP(Rational Unified Process)에서 강조하는 반복, 점진적(Iterative & Incremontal)개발방법에 대하여 설명하고, 방법을 비교하시오. 관리.72.2교시

 

I. 진화형 모델(Evolutional Model) 생명주기 특징

정의 시스템의 프로토타입을 개발하면서 지속적으로 발전시켜 나가는 방법
특징
  • 다음 단계로의 진화를 위해 전체 진화단계에 대한 개요(Outline) 필요
  • 프로토타입을 개발하며 지속적으로 발전.(사전에 요구사항 정의가 어려운 경우)
  • 구성요소의 핵심부분을 개발한 후 각 구성요소를 개선시켜 나가는 방법
  • 1단계 진화 완료 다음 단계 분석설계에 반영됨.

II. 구성요소

생명주기 설명
핵심요구사항 개발 요구사항의 핵심적인 부분을 프로토타입으로 개발
1단계 진화 핵심요구사항을 통해 개발된 것을 토대로 피드백 받아 요구사항 진화
n단계 진화 피드백을 통해 N-1단계 까지 개발된 것을 토대로 요구사항 진화
피드백 프로토타입 개발을 통해 필요한 요구사항을 다음 진화 개발에 반영

 

III. 증분형 모델과 진화형 모델의 비교

구분 증분형 모델 진화형 모델
개 념 - 폭포수 모델에 반복적 수행을 결합
- 증분을 반복해 최종 S/W 완성
- S/W 핵심기능으로 프로토타입으로 개발
- 기능을 점진적으로 발전시켜 최종 S/W 완성
특 징 - 증분 병렬개발 가능
- 요구사항이 명확할 경우 적합
- 전체 진화과정에 대한 개요(Outline) 필요
- 요구사항이 불분명한 경우 적합
방 식 - 증분을 개발한 후 통합 - 핵심기능 개발, 지속적인 개선으로 완성
장 점 - 신규 S/W 대한 충격 완화
- 후반 통합의 충격 완화
- S/W 완성도를 점진적으로 향상
- 불완전한 요구사항에 대한 대응 가능
단 점 - 다수 증분의 빌드 관리 부담
- 요구사항변경에 효과적 대응 어려움
- 다수 릴리즈의 버전관리 부담
- 프로젝트 비용 및 일정 증가

 

반응형

'정보관리기술사 > 소프트웨어공학' 카테고리의 다른 글

프로젝트 특징  (1) 2024.02.20
RAD  (0) 2024.02.19
증분형 개발 모델  (1) 2024.02.17
반복적 개발 모델  (0) 2024.02.16
Spiral 모델  (0) 2024.02.15

수직적 마이크로 프로그래밍

상점에서 쇼핑을 한다고 생각해보자, 상점의 한코너에서 다른코너로 이동하면서 물건을 하나씩 카트에 담는다.

각 물건을 찾는 지시는  '명령어'에 해당하고, 상점을 돌아다니는 행위를 '마이크로프로그래밍'에 비유 할 수 있다.

이경우, 각단계가 순차적으로 이루어지고, 한번에 하나의 작업만 수행한다. 이런 방식은 구현이 간단하고 이해하기 쉽지만, 전체적인 쇼핑시간이 길어질 수 있다.


수평적 마이크로 프로그래밍

- 동일하게 상점에서 쇼핑을 하는 상황이나, 이번에는 친구를 여러명 대동해서 쇼핑을 진행한다.

친구들에게 쇼핑리스트를 미리 정한뒤에 각 물건을 할당해서 상점에서 물건을 찾게한다. 이렇게 되면 동시에 작업을 할 수 있어 훨씬 빠르게 쇼핑을 마칠수 있다.

하지만 친구들을 관리해야하고, 조금더 복잡하게 처리가 필요하다는걸 알수 있다.

결국 수직적 프로그래밍은 단순화를 통해서 명령어들을 추가할때 더 쉽지만, 느리다는 특성이 있고,

수평적 프로그래밍은 동시성을 증대시키지만, 명령어를 추가(친구들에게 지시할때 복합적인추가)가 필요하고 친구들이 상점을 찾는동안의 메커니즘을 보면 빠르지만 뭔가 추가시에 불리한 점을 확인 할  수있다.

반응형

'정보관리기술사 > CA_OS' 카테고리의 다른 글

운영체제특권레벨  (0) 2023.11.28
Banker's Algorithm(은행가알고리즘)  (1) 2023.11.27
모니터/Monitor 동기화  (1) 2023.11.26
교착상태(Deadlock)  (0) 2023.11.25
우선순위 역전  (0) 2023.11.24
8
증분형 개발 모델
(Incremental Model)
[정의] 요구사항의 범위 일부분을 반복적으로 개발하며, Speed를 위해 병렬 개발하면서(혹은 스프린트별로) 대상 범위개발하여, 최종제품을 완성하는 방법
[특징] 폭포수 모델 변형, 하나의 시스템 여러 서브로 분리, 점차 증가

 
토픽 이름 () 증분형 개발모델
분류 SDLC > 증분형개발모델
키워드(암기) 스피드, 병행
암기법(해당경우)  

출문제

번호 문제 회차
1 1.5 반복점증적(iterative & incremental) 개발방법 적용시 회차 마다 작성되는 반복계획서와 평가서에 포함될 내용을 목차 형식으로 기술하시오. 관리.84.1교시.1
2 CBD프로젝트 수행시 단계(Inception Phase, Elaboration Phase, Construction Phase,Transition Phase)별로 목적(Goal) 이를 달성하기 위한 액티비티를 구체적으로 기술하고, 단계초기(Inception Phase, Elaboration Phase)에 반복, 점진적(Iterative & Incremental)방법론에 의해서 위험관리(Risk Management) 어떻게 전개되는지에 대해서 논하시오. 관리.77.2교시
3 S/W개발시 폭포수형(Waterfall) 개발방법과 RUP(Rational Unified Process)에서 강조하는 반복, 점진적(Iterative & Incremontal)개발방법에 대하여 설명하고, 방법을 비교하시오. 관리.72.2교시

 

I. 증분형 모델(Incremental Model) 생명주기 특징

정의 요구사항의 범위 일부분을 반복적으로 개발하며, Speed 위해 병렬 개발하면서(혹은 스프린트별로) 대상 범위를 개발하여, 최종제품을 완성하는 방법
특징
  • 폭포수모델 변형과 프로토타이핑 반복개념을 선형순차 모델 요소에 결합시킴.
  • 규모가 큰 개발조직의 경우 병행 개발 통해 개발기간 단축(요구사항이 명확한 경우).
  • 증분이 많고 병행개발이 빈번하면 관리 어려움(PM 조율 노력)

 

II. 증분형 모델과 진화형 모델의 비교

구분 증분형 모델 진화형 모델
개 념 - 폭포수 모델에 반복적 수행을 결합
- 증분을 반복해 최종 S/W 완성
- S/W 핵심기능으로 프로토타입으로
 개발
- 기능을 점진적으로 발전시켜 최종 S/W 완성
특 징 - 증분 병렬개발 가능
- 요구사항이 명확할 경우 적합
- 전체 진화과정에 대한 개요(Outline)
 필요
- 요구사항이 불분명한 경우 적합
방 식 - 증분을 개발한 후 통합 - 핵심기능 개발, 지속적인 개선으로 완성
장 점 - 신규 S/W 대한 충격 완화
- 후반 통합의 충격 완화
- S/W 완성도를 점진적으로 향상
- 불완전한 요구사항에 대한 대응 가능
단 점 - 다수 증분의 빌드 관리 부담
- 요구사항변경에 효과적 대응 어려움
- 다수 릴리즈의 버전관리 부담
- 프로젝트 비용 및 일정 증가
반응형

'정보관리기술사 > 소프트웨어공학' 카테고리의 다른 글

RAD  (0) 2024.02.19
진화형 개발 모델  (0) 2024.02.18
반복적 개발 모델  (0) 2024.02.16
Spiral 모델  (0) 2024.02.15
프로토타이핑 모델  (1) 2024.02.14
7
반복적 개발 모델
(Iteration Model)
[정의] 사용자의 요구사항이나 개발범위를 분해하여 점증적으로 반복 개발하여 최종시스템으로 완성하는 개발 모델
 
토픽 이름 () 반복적 개발
분류 SDLC > 반복적 개발
키워드(암기) 점증적 반복, 증분형 (요구사항 명확, 병행), 진화형 (요구 불명확, N단계 진화)
암기법(해당경우) 점증//, 진화//N 화나

 

기출문제

번호 문제 회차
1 1.5 반복점증적(iterative & incremental) 개발방법 적용시 회차 마다 작성되는 반복계획서와 평가서에 포함될 내용을 목차 형식으로 기술하시오. 관리.84.1교시.1
2 CBD프로젝트 수행시 단계(Inception Phase, Elaboration Phase, Construction Phase,Transition Phase)별로 목적(Goal) 이를 달성하기 위한 액티비티를 구체적으로 기술하고, 단계초기(Inception Phase, Elaboration Phase)에 반복, 점진적(Iterative & Incremental)방법론에 의해서 위험관리(Risk Management) 어떻게 전개되는지에 대해서 논하시오. 관리.77.2교시
3 S/W개발시 폭포수형(Waterfall) 개발방법과 RUP(Rational Unified Process)에서 강조하는 반복, 점진적(Iterative & Incremental)개발방법에 대하여 설명하고, 방법을 비교하시오. 관리.72.2교시

 

I. RAD 기반제공, 반복적 개발 모델(Iteration Model) 개요.

. 정의

- 사용자의 요구사항이나 개발범위를 분해하여 점증적으로 반복 개발하여 최종시스템으로 완성하는 개발 모델 

 

문제 출제 유형 Incremental(증분 개발 모델), Evolutional(진화적 개발 모델) 종류가 있음
3가지 모델 구분 반복적개발 모델, Incremental(증분 개발 모델), Evolutional(진화적 개발 모델)

 

. 반복적 개발 모델의 개념도

 

 

II. 증분형 모델(Incremental Model) 생명주기 특징

정의       요구사항의 범위 일부분을 반복적으로 개발하며, Speed 위해 병렬 개발하면서(혹은 스프린트별로) 대상 범위를 개발하여, 최종제품을 완성하는 방법
특징
  • 폭포수모델 변형과 프로토타이핑 반복개념을 선형순차 모델 요소에 결합시킴.
  • 규모가 큰 개발조직의 경우 병행 개발 통해 개발기간 단축(요구사항이 명확한 경우).
  • 증분이 많고 병행개발이 빈번하면 관리 어려움(PM 조율 노력)

III. 진화형 모델(Evolutional Model) 생명주기 특징

정의       시스템의 프로토타입을 개발하면서 지속적으로 발전시켜 나가는 방법
특징
  • 다음 단계로의 진화를 위해 전체 진화단계에 대한 개요(Outline) 필요
  • 프로토타입을 개발하며 지속적으로 발전.(사전에 요구사항 정의가 어려운 경우)
  • 구성요소의 핵심부분을 개발한 후 각 구성요소를 개선시켜 나가는 방법
  • 1단계 진화 완료 다음 단계 분석설계에 반영됨.

IV. 증분형 모델과 진화형 모델의 비교

반응형

'정보관리기술사 > 소프트웨어공학' 카테고리의 다른 글

진화형 개발 모델  (0) 2024.02.18
증분형 개발 모델  (1) 2024.02.17
Spiral 모델  (0) 2024.02.15
프로토타이핑 모델  (1) 2024.02.14
폭포수 모델  (0) 2024.01.29

Pycharm 버전 : PyCharm 2023.3.3 (Community Edition)

 

1) 가상환경 만들기 설정(conda)

 

 

- Environment name은 사용할 가상환경 명, Python 버전은 되도록 최신을 선택.

 

- 생성후 생성한 가상환경을 선택한후 OK 클릭

 

 

 

 

 

2) django 패키지설치

 

 

 

명령어 : django-admin startproject config .

 

 

 

 

3) 수행환경 설정

Run > **Edit Configurations...**

  1. + 버튼 클릭 후, Python을 선택하여 새로운 구성을 만듭니다.
  2. Name 필드에 구성 이름을 지정합니다. 예: Django Server.
  3. Script path에서 manage.py 파일을 찾아 선택합니다.
  4. Parameters 필드에 runserver를 입력합니다. 필요에 따라 runserver 0.0.0.0:8000과 같이 호스트와 포트를 지정할 수도 있습니다.
  5. Environment variables 필드에 필요한 환경변수를 설정할 수 있습니다. 예를 들어, Django 설정 모듈을 지정할 때 사용합니다.
  6. Python interpreter를 확인하고, 프로젝트에 맞는 인터프리터가 선택되었는지 확인합니다.
  7. Working directory가 프로젝트 디렉토리로 설정되어 있는지 확인합니다.
  8. 설정을 완료한 후, OK를 클릭하여 창을 닫습니다.

 

반응형

'IT > Django-백앤드' 카테고리의 다른 글

Django에서 정기배치 작업 만들기  (0) 2024.02.16

 

Django에서 정기 배치 구현하기

Django에서 정기 배치 작업을 구현하기 위해 Celery와 Django-celery-beat를 활용하는 방법입니다.

1단계: Celery와 Django-celery-beat 설치

필요한 패키지를 설치합니다.

pip install celery django-celery-beat

2단계: Celery 설정

Django 프로젝트의 settings.py에 Celery 설정을 추가합니다.


# settings.py

import os

# Celery 설정
CELERY_BROKER_URL = 'redis://localhost:6379/0'  # Redis를 브로커로 사용
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TIMEZONE = 'Asia/Seoul'

# Django-celery-beat 설정
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
    

3단계: Celery 앱 생성

Django 프로젝트 내에 Celery 앱을 초기화하는 코드를 추가합니다.


# __init__.py

from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')

app = Celery('your_project_name')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    

4단계: 정기 배치 작업 생성

특정 작업을 정의하는 Python 함수를 작성하고, Celery의 @app.task 데코레이터를 사용하여 이를 태스크로 등록합니다.


# tasks.py

from celery import shared_task

@shared_task
def my_scheduled_job():
    # 할 일
    print("정기 배치 작업 실행")
    

5단계: 스케줄러 설정

Django-celery-beat를 사용하여 정기적으로 실행될 작업을 스케줄링합니다.

6단계: Celery 워커와 비트 실행

Celery 워커와 Celery Beat 스케줄러를 실행합니다.


# Celery 워커 실행
celery -A your_project_name worker --loglevel=info

# 별도의 터미널에서 Celery Beat 실행
celery -A your_project_name beat --loglevel=info
    

이제 설정한 간격에 따라 my_scheduled_job 태스크가 자동으로 실행됩니다.

반응형

'IT > Django-백앤드' 카테고리의 다른 글

django 프로젝트 생성 (pycharm에서 설정)  (0) 2024.02.16
6
Spiral 모델 [정의] 소프트웨어의 기능을 나누어 점진적으로 개발하는 모델. PDCA 주기를 시스템 개발에 적용
[특징] 폭포수+프로토타입 장점 수용후 위험관리 추가, 위험요소 확인후 다음단계 진행여부 결정
[단계] 계획 수립->위험 식별->개발 및 검증->고객 평가

계위개고
 
토픽 이름 Spiral 모델
분류 SDLC > Spiral 모델
키워드(암기) 계획 및 정의, 위험분석, 개발, 고객의 평가   
암기법(해당경우) 계위개고

 

기출문제

번호 문제 회차
1 소프트웨어 개발 라이프사이클에 관한 나선형(Spiral)모델과 애자일(Agile)방법에 대하여 유사점과 차이점을 중심으로 비교하여 설명하시오 98.시스템응용.2.1
2   83.정보관리.3.4

 

I. 위험 최소화를 위한 진화적 프로토타이핑, 나선형 모델의 개요

 . 나선형 모델 (Spiral Model) 정의

- 시스템 개발 생기는 위험을 최소화 하기 위해 나선을 돌면서 점진적으로 개발하는 모델

- 폭포수 모델의 체계적인 측면과 프로토타이핑 모델의 반복적인 특성을 결합하고 위험분석 추가

 . 나선형 모델의 특징

구분 설명
대규모 시스템 적합 사용자 요구사항 식별이 용이하고, 위험관리를 통해 대규모 시스템 위험부담이 시스템에 적합
위험관리 위험에 대한 식별 및 대응계획을 통한 위험 축소 방안 수립 가능
프로젝트 관리 어려움 점진적인 프로세스 프로젝트 관리가 어렵고 복잡하며 개발 시간 장기화 가능성 존재, 프로젝트 산출물 관리의 어려움 및 위험관리 전문가 필요

 

II. 나선형 모델의 구성도 구성요소

  1. 나선형 모델의 구성도

  - 계획 정의, 위험분석, 개발, 고객의 평가 단계를 반복하여 점진적으로 개발

    . 나선형 모델의 구성요소

구성요소 내용 산출물
계획 및 정의 단계
(Planning and Definition)
- 초기 요구분석 프로젝트 계획 수립
- 프로젝트 위험 식별 상세 관리 계획 수립
- 프로세스 단계에 대한 목표수립
- 프로젝트 단계별 계획서
- Risk Check List
위험분석 단계
(Risk Analysis)
- 위험 분석.평가하여 감소 시키는 활동
- 식별된 위험의 종류에 따라 상세 분류 수행
- 위험 분석서
- 상세 분석서
개발 단계
(Engineering)
- 시스템에 특성에 맞는 개발 모델 선택
- 선택한 기능의 개발 검증 생산
- 진화적 프로토타이핑
- 개발 산출물
고객평가 단계
(Customer Evaluation)
- 프로젝트가 검토되고 나선에 대한 추가 반복 수행 여부를 결정
- 다음 단계를 위한 계획 수립
- 요구사항 계획
- 생명주기 계획서
- 통합테스트 계획서

 

III. 나선형 모델과 폭포수 모델의 비교

구분 나선형 모델 폭포수 모델
정의 -Waterfall Model Prototyping Model 장점에 위험분석(Risk Analysis) 추가한 모델 -분석, 설계, 개발, 구현, 시험 및 유지보수 과정을 순차적으로 수행하는 방법
특징 -프로젝트의 완전성 위험감소와 유지보수의 용이
-관리가 어렵고 개발기간이 장기화 가능성 있음
-소프트웨어 개발을 단계적, 순차적, 체계적, 하향식 접근 방식으로 수행.
- 단계별로 완료 다음 단계 진행
장점 -정확한 사용자 요구사항 파악
-위험 부담 감소
-품질 확보
-대규모 시스템에 적합
-가장 오래되고 폭넓게 사용
-전체 과정이 이해하기 용이
-관리용이 (진행과정을 세분화)
-문서 등의 관리와 적용이 용이
단점 -프로젝트 개발에 많은 시간 소요
-프로젝트 관리에 어려움(복잡함)
-위험관리 능력이 성공 여부에 영향
-다수 고객 상대의 상용제품 개발에는 부적합
-초기 요구사항 정의 어려움
-중요 문제점의 초기 발견이 어려움(후반부에 구체화)
- 단계 종결 다음 단계 수행
-사용자 피드백에 의한 반복 단계 불가능
-초기 단계 강조 코딩, 테스트 지연
적용범위 -대규모 시스템 위험 부담이 시스템 개발에 적합 -기술적 위험이 낮고, 유사 프로젝트 경험이 있는 경우 사용.
반응형

'정보관리기술사 > 소프트웨어공학' 카테고리의 다른 글

진화형 개발 모델  (0) 2024.02.18
증분형 개발 모델  (1) 2024.02.17
반복적 개발 모델  (0) 2024.02.16
프로토타이핑 모델  (1) 2024.02.14
폭포수 모델  (0) 2024.01.29

+ Recent posts