<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_dodo_.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 04 Oct 2026 07:44:42 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. _dodo_.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_dodo_" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[SQL 수업 예습]]></title>
            <link>https://velog.io/@_dodo_/SQL-%EC%88%98%EC%97%85-%EC%98%88%EC%8A%B5</link>
            <guid>https://velog.io/@_dodo_/SQL-%EC%88%98%EC%97%85-%EC%98%88%EC%8A%B5</guid>
            <pubDate>Sun, 04 Oct 2026 07:44:42 GMT</pubDate>
            <description><![CDATA[<h2 id="스키마와-테이블-행과-열">스키마와 테이블, 행과 열</h2>
<h4 id="schema---데이터베이스의-전체-구조-데이터-타입-제약-조건-테이블-간의-관계-등을-정의한-메타데이터----설계">Schema :  데이터베이스의 전체 구조, 데이터 타입, 제약 조건, 테이블 간의 관계 등을 정의한 메타데이터  ==  설계</h4>
<p>“””  이 데이터베이스는 어떻게 생겼고, 어떤 데이터를 어떻게 저장할 것이다 ””” 라는 약속</p>
<blockquote>
<p>역할 : 어떤 종류의 데이터를 어떤 형식으로 저장할 것인가 - 에 대한 규칙을 정함</p>
</blockquote>
<blockquote>
<p>주요 요소 : table, column, data_type, 제약조건(데이터의 무결성을 보장하기 위한 규칙 | PK,FK )
    * 데이터 무결성이란? 
        데이터의 수명 주기 동안 정확성, 일관성, 유효성이 유지되고 승인 없이 변경되거나 
손상되지 않은 상태</p>
</blockquote>
<ul>
<li>주요 유형 : 개체 무결성(PK | 고유값 | NOT NULL),  참조 무결성(FK | 테이블 
간의 관계가 일관되게 유지되도록 보장), 도메인 무결성(필드의 데이터 타입, NULL여부, 허용된 값 범위 등 올바르게 입력되었는지 확인)</li>
<li>무결성이 중요한 이유 : 오류/실수 방지, 운영 효율성, 규정 준수</li>
</ul>
<blockquote>
<p>[ EX ]
CREATE  TABLE  Customers(
    customer_id  INT  PRIMARY KEY,    - 고객 ID, 정수형, 기본키
    name  VARCHAR(100) NOT NULL,   - 이름, 최대 100자 문자열, NULL아님 
    email  VARCHAR(255)  UNIQUE,     - 이메일, 최대 255자 문자열, 고유해야 함 
    phone_number VARCHAR(20)         - 전화번호, 최대 20자 문자
    );</p>
</blockquote>
<h4 id="sql을-쓸-때는-거의-항상-데이터베이스테이블-두-단어로-위치를-가리킴">SQL을 쓸 때는 거의 항상 데이터베이스.테이블 두 단어로 위치를 가리킴</h4>
<pre><code>EX) FROM pharma_sales.part_d_prescriber</code></pre><h4 id="select-쿼리는-쓰는-순서와-읽는-순서가-다르다">SELECT 쿼리는 쓰는 순서와 읽는 순서가 다르다</h4>
<p>쓰는 순서 
SELECT | FROM | WHERE | AND | ORDER BY | LIMIT</p>
<p>읽는 순서
FROM : 먼저 어떤 테이블을 읽을지 정한다
WHERE : 원본 처방 행에서 주, 약물, 조건을 먼저 줄인다
SELECT : 강의와 분석에 필요한 컬럼만 남긴다
ORDER BY : 처방량, 비용처럼 볼 기준으로 줄을 세운다
LIMIT : 상위 몇 건만 꺼내 결과를 빠르게 확인한다 </p>
<h4 id="-집계-함수-">[ 집계 함수 ]</h4>
<pre><code>어떤 데이터를 집계하는 함수들을 의미.</code></pre><blockquote>
<p>COUNT
“ SELECT  COUNT(*)  FROM citykorea ; “
모든 레코드의 수를 출력하는 query</p>
</blockquote>
<blockquote>
<p>SUM
“ SELECT  SUM(population)  FROM citykorea ; ”
인구수 합계를 출력하는 query</p>
</blockquote>
<blockquote>
<p>MAX  /  MIN
“ SELECT name, max(population)  FROM citykorea ;  ”
가장 많은 인구수를 가진 도시의 이름과, 인구수를 출력한 query</p>
</blockquote>
<blockquote>
<p>AVG
“ SELECT  AVG(population)  FROM citykorea ; ”
citykorea의 평균 인구수를 출력하는 쿼리</p>
</blockquote>
<h4 id="-group-query-">[ Group Query ]</h4>
<p>집계함수의 결과를 특정 컬럼을 기준으로 묶어 결과를 출력해주는 쿼리</p>
<blockquote>
<p>GROUP BY
정의 : 같은 기준을 가진 여러 행을 한 행으로 접어 요약값을 만드는 문법
원본 행을 의사결정 단위로 접는다
원본에 대한 해상도는 떨어지지만 통합본은 볼 수 있음
SQL에서 GROUP BY에 넣는 함수를 제외하고 다 집계함수가 되어야 함
SELECT에 GROUP BY할 것만 둠
나머지 집계함수에 들어갈 것들을 COUNT() AS name
SELECT 와 GROUP BY 순서를 맞추면 좋음
“””
    SELECT  column,  집계함수(column)
    FROM  TABLE
    GROUP BY  column ;
“””</p>
</blockquote>
<blockquote>
<p>HAVING
정의 : GROUP BY로 만든 요약값에 조건을 거는 문법
WHERE과 차이 : WHERE는 집계 전 원본 형 필터, HAVING은 집계 후 그룹 필터
GROUP BY 이후에 생긴 SUM, AVG, COUNT 같은 요약값으로 거른다.
“””
    SELECT  column, 집계함수(column)
    FROM  TABLE
    GROUP BY  column
    HAVING  집계함수(column)  부등호  data ;
“””</p>
</blockquote>
<blockquote>
<p>COUNT DISTINCT
중복을 제거한 고유한 행의 개수를 구하기 위해 적용
“ SELECT  COUNT(DISTINCT  name)  FROM  data_table ; ”
    name 컬럼에서 중복을 제외한 이름의 총 개수</p>
</blockquote>
<blockquote>
<p>LEFT JOIN
왼쪽 테이블의 모든 데이터와 오른쪽 테이블에서 조건이 일치하는 데이터를 연결하여 반환하는 방
“””
SELECT * 
FROM  tableA  A
LEFT  JOIN  tableB  B
ON  A.key = B.key ;
“””
table A는 항상 결과에 포함. A.key = B.key 값이 같은 행이 있다면 함께 출력, 
없으면 table B자리에 NULL</p>
</blockquote>
<h4 id="-case-">[ CASE ]</h4>
<blockquote>
<p>기본 문법 
CASE<br>WHEN 조건1 THEN 조건1  충족할 때 반환되는 값
WHEN 조건2 THEN 조건2  충족할 때 반환되는 값
ELSE 모든 조건 해당되지 않을 때 반환되는 값
END
WHEN - THEN 항상 같이 사용  |   조건문 마지막에 END 꼭 써주기<br>CASE 문을 사용할 때 별칭AS을 사용해주는 것이 좋음
--&gt; EX
CASE WHEN  total_claims &gt;=100  THEN ‘고처방’  ELSE ‘저처방’  END AS  name</p>
</blockquote>
<h4 id="-decimal-">[ DECIMAL ]</h4>
<blockquote>
<p>실수의 값을 정확하게 표현하기 위해 사용 ,  DECIMAL타입은 NUMERIC을 구현하여 만들어짐
    DECIMAL(7,2) == -99999.99 ~ 99999.99 까지 실수를 저장할 수 있도록 
        DECIMAL(A,B) == A는 실수의 총 자릿수  |    B는 소수 부분 
    “ CAST( table_name AS DECIMAL(num , num)) ”</p>
</blockquote>
<h4 id="-with절-">[ with절 ]</h4>
<blockquote>
<p>임시 테이블 , 복잡한 서브쿼리를 가상의 테이블로 미리 정의해 재사용 할 수 있게 해주는 CTE 기능
    쿼리를 단순화하고 가독성을 높일 수 있음</p>
</blockquote>
<blockquote>
<p>--&gt; EX
WITH  SalesEmployees  AS (
    SELECT  FirstName, LastName, JobTitle, Salary
    FROM  employees  e
    JOIN  departments  d  ON  e.DepartmentID = d.DepartmentID
    WHERE  DepartmentName = ‘Sales’ )
SELECT  FirstName, LastName, JobTitle, Salary
FROM  SalesEmployees ; </p>
</blockquote>
<h4 id="-window-함수-">[ WINDOW 함수 ]</h4>
<blockquote>
<p>정의 : 행을 줄이지 않고 계산값을 붙인다. 원본 행을 유지하고, 그룹 안에서 계산한 값을 새 컬럼으로 붙인다.
partition을 어떻게 나눌것인가?  ,  order by 정렬   ,   row number/lag/sum 무엇을 넣을 것인가?
row_number : HCP별 가장 최근 접점 또는 첫 접점을 찾는다.
LAG : 이전 접점, 이전 처방량, 이전 방문값을 현재 행 옆에 붙인다
SUM OVER : 누적 지급액, 누적 처방량, 누적 방문 수를 만듦
원본 함수를 살리고 싶으면 window함수가 좋다.</p>
</blockquote>
<pre><code>[ 기본 문법 ] </code></pre><blockquote>
<p>“ SELECT  WINDOW_FUNCTION (ARGUMENTS)<br>   OVER ( [PARTITION BY column] [ODER BY column] [WINDOWING 절] )
   FROM 테이블명 ; ”</p>
</blockquote>
<blockquote>
<p>--&gt; EX
 “ SELECT  name, age, sal, sum(sal) OVER(ORDER BY sal  ROWS BETWEEN  unbounded preceding AND CURRENT row) 누적 연봉  FROM  test”
처음부터 현재 행까지의 누적 </p>
</blockquote>
<p><a href="https://docs.google.com/document/d/1pV_7qTb-Z_yxnRqVmQplxx1t2VzTKVxDOBQ6xC03yjc/edit?usp=sharing">GOOGLE_DRIVE</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Deep Dive into Backend & AI Integration (Stages 4–6)]]></title>
            <link>https://velog.io/@_dodo_/Deep-Dive-into-Backend-AI-Integration-Stages-46</link>
            <guid>https://velog.io/@_dodo_/Deep-Dive-into-Backend-AI-Integration-Stages-46</guid>
            <pubDate>Wed, 23 Sep 2026 13:33:40 GMT</pubDate>
            <description><![CDATA[<h4 id="this-journey-was-all-about-repeating-a-solid-development-cycle-across-multiple-domain-models">This journey was all about repeating a solid development cycle across multiple domain models.</h4>
<p>&quot;&quot;&quot;
Requirements Definition ➔ API Specification &amp; Design ➔ Infrastructure &amp; Core Implementation ➔ Swagger API Testing ➔ Git PR &amp; Code Review
&quot;&quot;&quot;</p>
<h4 id="📌-stage-4--user-authentication--authorization-apis-9-endpoints">📌 Stage 4 — User Authentication &amp; Authorization APIs (9 Endpoints)</h4>
<p>Design &amp; Review: Converted requirement specifications (REQ-USER-001~009) into detailed API mapping tables. During reviews, I corrected common mistakes like putting hardcoded data into endpoints, swapping Request Body with Response structures, and properly distinguishing Authentication (login status) from Authorization (role permissions).</p>
<p>Implementation: Built core security features using JWT and password hashing (core/security.py). I manually filled in logic for 9 endpoints, catching frequent async bugs like missing await statements.</p>
<p>Testing &amp; Git: Verified full user workflows in Swagger UI (Registration ➔ Login ➔ Auth Header ➔ Profile Fetch). Encountered a Git branching mistake by accidentally setting main as the base branch for a PR, which taught me how to fast-forward sync dev with main.</p>
<h4 id="📌-stage-5--patient--medical-record-apis-with-file-upload-8-endpoints">📌 Stage 5 — Patient &amp; Medical Record APIs with File Upload (8 Endpoints)</h4>
<p>Design &amp; Domain Logic: Handled requirements for Patients and Medical Records. Discovered key database behaviors like how ON DELETE CASCADE automatically deletes associated records and X-rays when a patient is removed. Also mapped out multi-part file uploads for X-ray images.</p>
<p>New Concepts Learned: Applied Query Parameters (search/filtering), Path Parameters (/{patient_id}), and Multipart/Form-Data file handling.</p>
<p>Swagger Testing: Successfully tested the end-to-end flow: Creating a patient ➔ Uploading actual X-ray images to the media/xray/ directory ➔ Retrieving medical records with linked media.</p>
<h4 id="📌-stage-6--ai-pneumonia-prediction-full-workflow">📌 Stage 6 — AI Pneumonia Prediction (Full Workflow)</h4>
<ol>
<li>Model Pipeline &amp; Ensemble Setup</li>
</ol>
<p>Environment &amp; Setup: Installed PyTorch CPU version (uv add torch torchvision --index ...) and analyzed 10 pre-trained .pth checkpoints (ConvNeXt-Tiny 5-fold + DenseNet121 5-fold).</p>
<p>Domain Verification: Re-verified preprocessing specifications (224x224 Resize, ImageNet Normalization) and the OR-ensemble strategy (predicts pneumonia if either model flags it) from an earlier project report (폐렴_Xray_분류_프로젝트_보고서.docx).</p>
<p>Git Strategy &amp; Debugging: Added heavy model weights (worker/models/*.pth) to .gitignore to stay under GitHub&#39;s 100MB limit. Debugged key issues, including a loop return bug that loaded only a single fold, and a tuple syntax mistake in Resize((224, 224)).</p>
<p>Inference Test: Tested with actual X-ray images—achieved accurate predictions with a 0.9986 / 0.9888 confidence score in just 0.78 seconds!</p>
<ol start="2">
<li>API Design &amp; Requirements Alignment</li>
</ol>
<p>Requirements Reconciliation: Compared past design documents against current requirements (REQ-PRED-001/002). Identified key updates: expanded access rights from admin/doctor-only to all departments, and made heatmap URLs optional.</p>
<p>Database Precision Update: Updated DB precision for prediction confidence scores from DECIMAL(5,2) to DECIMAL(5,4) and allowed heatmap_url to be nullable.</p>
<ol start="3">
<li>API Implementation &amp; Asynchronous Execution</li>
</ol>
<p>Database Migration: Ran alembic revision --autogenerate and alembic upgrade head to apply schema updates, verifying accuracy directly via DESCRIBE table queries.</p>
<p>Non-blocking AI Inference: Integrated FastAPI’s run_in_threadpool to run heavy, synchronous PyTorch CPU inference on a background thread without blocking the async event loop!</p>
<p>Logic Implementation: Written and refined run_ai_analysis and list_ai_analysis functions after resolving missing await keywords.</p>
<ol start="4">
<li>End-to-End Testing &amp; Git Repository Clean-up</li>
</ol>
<p>Swagger Testing: Verified full user flows: User Registration ➔ Login ➔ POST /ai-analysis (201 Created with is_pneumonia: true, confidence: 0.9986) ➔ Duplicate request caching check (200 OK) ➔ Error handling (404/401/403).</p>
<p>Git Clean-up: Created PR #9 to dev, synchronized dev to main via fast-forward, and cleaned up the repository by deleting 9 merged branches (both local and remote), leaving a clean repository with only main and dev!</p>
<p><a href="https://docs.google.com/document/d/1x69G9LySLSiFkfTc5W0JO_41HgZkaqlKsCpT9W0fANA/edit?usp=sharing">Google_drive</a><br><a href="https://github.com/annajeong0429-ux/pneumonia_xr_support_service.git">github</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Restarting the X-ray Pneumonia Classification Service Project]]></title>
            <link>https://velog.io/@_dodo_/Restarting-the-X-ray-Pneumonia-Classification-Service-Project</link>
            <guid>https://velog.io/@_dodo_/Restarting-the-X-ray-Pneumonia-Classification-Service-Project</guid>
            <pubDate>Mon, 21 Sep 2026 13:29:45 GMT</pubDate>
            <description><![CDATA[<p>I’ve decided to restart a project I previously worked on with my team: the X-ray Pneumonia Classification Support Service.</p>
<p>Back then, we used Claude Code to generate the entire codebase, resulting in a clean and well-structured project. However, because so much of it was auto-generated, I found it hard to remember which parts I was specifically responsible for and how the underlying logic actually worked.</p>
<p>So, I’m taking a fresh start! My goal this time is to rebuild the code line by line, really understanding every detail (though I’ll still use AI as a smart assistant, of course!). Beyond the backend, I plan to develop a much richer frontend and complete end-to-end deployment on AWS.
Overall, I will proceed according to the template and stages already set up by the bootcamp.</p>
<h4 id="project-roadmap--stage-breakdown">Project Roadmap &amp; Stage Breakdown</h4>
<p>The project follows a structured progression: FastAPI Stages 1–7, followed by Docker Stages 1–4, and finally the Deployment Stage.</p>
<ul>
<li>Stage 1: Repository Setup
Cloned the starter template repository and pushed it to my own GitHub main branch.</li>
<li>Stage 2: Branch Strategy &amp; Core CRUD APIs
Adopted a hybrid branching strategy. Implemented 5 core CRUD API endpoints (Single/List Read, Delete, Create, and Update) and registered the routers in app/main.py.</li>
<li>Stage 3: Database Modeling &amp; Migration
Reviewed the ERD and set up the DB models and registrations as follows:<ol>
<li>Created the .env environment file.</li>
<li>Ran the MySQL container using docker compose up -d mysql.</li>
<li>Built 5 database model files.</li>
<li>Executed database migrations.</li>
<li>Applied the schemas directly to the live database.</li>
</ol>
</li>
</ul>
<p><a href="https://github.com/annajeong0429-ux/pneumonia_xr_support_service.git">github link</a><br><a href="https://docs.google.com/document/d/1x69G9LySLSiFkfTc5W0JO_41HgZkaqlKsCpT9W0fANA/edit?usp=sharing">google drive link</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git Basics: From 3-Way Merge to PR Workflow]]></title>
            <link>https://velog.io/@_dodo_/Git-Basics-From-3-Way-Merge-to-PR-Workflow</link>
            <guid>https://velog.io/@_dodo_/Git-Basics-From-3-Way-Merge-to-PR-Workflow</guid>
            <pubDate>Tue, 19 May 2026 11:52:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_dodo_/post/081fb07f-a24e-47fd-876c-65661c732e99/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_dodo_/post/cf22e7b4-ade0-46df-b3cc-a85d29f2aabf/image.png" alt=""></p>
<h4 id="1-branching--merging-basics">1. Branching &amp; Merging Basics</h4>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
[commit 3]   feature<br>
[commit 2]   main<br> 
[commit 1]<br>
1. Create a branch: git branch feature<br>
2. Switch to the branch: git switch feature<br>
3. Create a commit: git add .. & git commit ..<br>
4. Merge branches: (on main) git merge feature<br>
    4-1. Fast-forward merge.
</div>

<h4 id="2-3-way-merge-concepts">2. 3-Way Merge Concepts</h4>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
&emsp;&emsp;&emsp;[commit 4] feature main == merge commit &emsp;[commit 3]  main&emsp;&emsp;&emsp;&emsp;&emsp;
[commit 3*] feature<br>
[commit 2]  <br>
[commit 1]
Merge = [commit 4] = Combines commit 2, commit 3, and commit 3*
    4-2. 3-way merge
</div>

<p><img src="https://velog.velcdn.com/images/_dodo_/post/733a6817-7421-477c-8a2c-b4c61319abb1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/_dodo_/post/fb3b663c-e15d-45e6-9afc-900285513759/image.png" alt=""></p>
<h4 id="3-remote-repositories--commands">3. Remote Repositories &amp; Commands</h4>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
My Computer      - Local Repository
GitHub           - Remote Repository

<p>git remote add origin [URL]
git remote -v
    (fetch) (push)
git push origin main
git fetch origin main
git merge origin/main
(fetch + merge = pull -&gt; git pull origin main)</p>
</div>

<p><img src="https://velog.velcdn.com/images/_dodo_/post/b402198d-ff95-452d-8b73-4014475e40cb/image.png" alt=""></p>
<h4 id="4-project-workflow">4. Project Workflow</h4>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
- Steps 1 & 2 are mostly done on the Local Machine (My Computer).<br>
- Steps 3 to 5 are mostly managed on GitHub.<br>
- Steps 5 & 6 are typically handled via Cloud / Infrastructure.
</div>

<h4 id="5-useful-shortcut-command">5. Useful Shortcut Command</h4>
<p>Create a new branch named &#39;document&#39; and switch to it simultaneously</p>
<ul>
<li>git switch -c document</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[A Step-by-Step Guide to Git Basics]]></title>
            <link>https://velog.io/@_dodo_/A-Step-by-Step-Guide-to-Git-Basics</link>
            <guid>https://velog.io/@_dodo_/A-Step-by-Step-Guide-to-Git-Basics</guid>
            <pubDate>Mon, 18 May 2026 13:10:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_dodo_/post/685682d9-9e78-4215-9a76-9752d38ad002/image.png" alt=""></p>
<h4 id="setting-up-the-local-repository">Setting Up the Local Repository</h4>
<blockquote>
<ol>
<li>cd Desktop - Move to the Desktop directory</li>
<li>cd git-practice-folder - Move into your specific practice folder</li>
<li>mkdir new-project - Create a new directory for the project</li>
<li>cd new-project - Move into the newly created folder</li>
<li>git init - Initialize a empty Git repository (.git folder created)</li>
<li>code .  - Open the current directory in VS Code</li>
</ol>
</blockquote>
<p><img src="https://velog.velcdn.com/images/_dodo_/post/3684ccab-ca24-4ba2-b266-47b6b112817a/image.png" alt=""></p>
<h4 id="the-git-workflow-working-directory-to-staging-area">The Git Workflow: Working Directory to Staging Area</h4>
<blockquote>
<p>Once VS Code opens, let&#39;s create a file named hello.txt and check its status.
&#39;git status&#39; 
    - output</p>
</blockquote>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  On branch master<br>
No commits yet<br>
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt<br>
nothing added to commit but untracked files present (use "git add" to track)
</div>

<blockquote>
<p>let&#39;s move the file to the Staging Area and take a snapshot (Commit).</p>
</blockquote>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  git add hello.txt<br>
- Move the file to the Staging Area (Like putting it in a shopping cart)<br>
  git commit -m "Add hello.txt"<br>
- Permanently save the snapshot to the Repository with a message
  </div>

<p><img src="https://velog.velcdn.com/images/_dodo_/post/48ef7f65-e509-4fff-adef-c4d7df03eb15/image.png" alt=""></p>
<h4 id="tracking-history-and-time-travel-checkout">Tracking History and Time Travel (Checkout)</h4>
<blockquote>
<p>Let&#39;s make a second file, hi.txt, commit it, and look at our project timeline.</p>
</blockquote>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  1. Create hi.txt, write some content, then stage and commit <br>
  git add hi.txt<br>
  git commit -m "Add hi.txt"
  2. View the project commit history
  git log <br>
  git log --oneline<br>
   * Use this for a cleaner, one-line summary when history gets long
  </div>
> Time-Traveling to a Previous Commit<br>
  git checkout [commit_hash_of_hello.txt]
  output
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  Note: switching to '82f9be7d80e4bed9b8b3b0095c2d6b9de3b2e1fb'. <br>
You are in 'detached HEAD' state... <br>
HEAD is now at 82f9be7 Add hello.txt <br>
  </div>
> Returning to the Present<br>
  git checkout master or 'main' depending on your default branch name

<h4 id="relative-shortcuts-and-branching">Relative Shortcuts and Branching</h4>
<blockquote>
<p>Instead of copying long commit hashes every time, you can travel backward relatively using HEAD</p>
</blockquote>
<ol>
<li>git checkout HEAD~1 - Move back exactly 1 commit before the current one</li>
<li>Creating a New Branch
git branch feat/python - Create a new branch named &#39;feat/python&#39; <br>
git switch feat/python - Switch your active workspace to the new branch</li>
</ol>
<h4 id="handling-secrets-and-visualizing-history">Handling Secrets and Visualizing History</h4>
<blockquote>
<ol>
<li>.env and .gitignore
In real-world projects, we often handle configuration files like secret.env. These contain sensitive system environment variables (API keys, passwords) that should never be exposed online.<br>
To hide them from Git, we use a special file named .gitignore.</li>
</ol>
</blockquote>
<p>  <img src="https://velog.velcdn.com/images/_dodo_/post/44f6106d-c310-438f-9e4e-ae582f8641a9/image.png" alt=""></p>
<blockquote>
<ol start="2">
<li>Visualizing the Git 
As branches grow, the timeline can get messy. You can display a beautiful, text-based visual graph of all your branches splitting and merging using this ultimate command<br></li>
</ol>
<p>*, /, and |, acting like a roadmap for your project history.</p>
</blockquote>
<ul>
<li>git log --all --graph --oneline</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Project - Pneumonia X-ray Binary Classification Model Development]]></title>
            <link>https://velog.io/@_dodo_/Project-Pneumonia-X-ray-Binary-Classification-Model-Development</link>
            <guid>https://velog.io/@_dodo_/Project-Pneumonia-X-ray-Binary-Classification-Model-Development</guid>
            <pubDate>Sat, 16 May 2026 10:53:22 GMT</pubDate>
            <description><![CDATA[<h2 id="project">Project</h2>
<h4 id="pneumonia-x-ray-binary-classification-model-development">Pneumonia X-ray Binary Classification Model Development</h4>
<blockquote>
<ul>
<li>Period: Apr 29, 2026~ May 15, 2026</li>
<li>Key Contributions &amp; Experience</li>
</ul>
</blockquote>
<ol>
<li>Baseline Construction &amp; Transfer Learning: <br>Established an initial training pipeline based on prior technical workflows. Selected ResNet18 as the standard benchmark model and successfully implemented transfer learning by adapting the Fully Connected (FC) layer for binary classification.</li>
<li>Data Pipeline Optimization: <bt>
Applied structural image transformation and augmentation techniques tailored for thoracic radiography scans to improve feature representation.<ol start="3">
<li>Hyperparameter Tuning: 
Configured the training to run for 50 epochs considering the limited dataset scale, gaining hands-on insight into computational bottlenecks and training time efficiency in deep learning models.</li>
<li>Collaborative Peer Review: 
While executed as an individual project, actively engaged in technical discussions and brainstorming sessions with peers. Exchanged research directions, presented empirical hypotheses, and integrated constructive feedback to continuously pivot and refine the model&#39;s structural approach.</li>
</ol>
</li>
</ol>
<h4 id="main-pipeline-source-code">Main Pipeline Source Code</h4>
<p>  Try 1. ResNet18 == Baseline</p>
<div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  Oversampling: N/A <br>
  Tuning: Full fine-tuning <br>
Transform: Resize(224) -> HFlip -> Rotate(10) -> ToTensor -> Normalize <br>
Optimizer: Adam(lr=1e-4) + StepLR <br>
Loss: Weighted CrossEntropyLoss <br>
Training: max_epoch=50, patience=5
</div>
  <br>
  Try 2. EfficientNet B0+B1 esmble
  <div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
Oversampling: Applied <br>
Validation: 5-Fold K-Fold + 5x TTA <br>
Ensemble Logic: 50:50 soft voting probability average: (B0_probs + B1_probs) / 2
</div>
  <br>
  Try 3. ConvNeXt-Tiny
  <div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
  Oversampling: Applied <br>
  Input Scale: 224x224 | Parameters: 28M <br>
  Modification: Replaced head with Linear(in_features, 2)  <br>
  Tuning: Full layer fine-tuning <br>
  Validation: 5-Fold Stratified K-Fold + 5x TTA
</div>
  <br>
  Try 4. DenseNet121
 <div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
Modification: Replaced head with Linear(1024, 2) directly <br>
Parameters: 8M
Validation: 5-Fold Stratified K-Fold + 5x TTA
</div>
  <br>
  Try 5. ConvTiny + DenseNet OR
 <div style="padding: 15px; border: 1px solid #e2e8f0; border-radius: 8px; background-color: #f8fafc; color: #334155;">
Execution: Combined Try 10 and Try 18 via OR logic <br>
Final class = 1 if either model predicted 1<br>
Discrepant outputs accounted for only 1.3% (8/624 samples)
</div>
  <br>


<p>  my report
(<a href="https://docs.google.com/document/d/1ziIdKBA0Pum8dKkn2q6UeUovgWPivUo-/edit?usp=sharing&amp;ouid=108193830019374178715&amp;rtpof=true&amp;sd=true">https://docs.google.com/document/d/1ziIdKBA0Pum8dKkn2q6UeUovgWPivUo-/edit?usp=sharing&amp;ouid=108193830019374178715&amp;rtpof=true&amp;sd=true</a>)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Creating an Invitation Page with Git]]></title>
            <link>https://velog.io/@_dodo_/Creating-an-Invitation-Page-with-Git</link>
            <guid>https://velog.io/@_dodo_/Creating-an-Invitation-Page-with-Git</guid>
            <pubDate>Sat, 16 May 2026 08:17:14 GMT</pubDate>
            <description><![CDATA[<p>HI~ Today, I&#39;m documenting my journey of diving into Git~, and successfully deploying a personal web invitation page using GitHub Pages.<br></p>
<h2 id="1-git-and-github">1. Git and GitHub</h2>
<blockquote>
<ol>
<li>Git : A version control tool and program that operates locally on my computer. It acts as an engine to track and manage changes in the source code.</li>
<li>GitHub : A cloud-based web service where Git repositories are hosted. It serves as a collaboration platform, providing powerful features like Pull Requests, Issues, and Code Reviews.<br>
<em>In Short, Git is the &#39;version control engine&#39;, while GitHub is the &#39;service for collaboration and sharing&#39;</em></li>
</ol>
</blockquote>
<h2 id="2-core-keywords--commit--branch">2. Core Keywords- Commit &amp; Branch</h2>
<blockquote>
<ol>
<li>Commit : A unit of record that saves changes as a specific version. It creates a snapshot of the code, and the key is to leave as clear message explaining &#39;what was changed and why&#39;.</li>
<li>Branch : An independent, virtual workspace. IT allows you to develop new features safely without messing up the existing, stable. Multiple features can be developed simultaneously and merged back later.</li>
</ol>
</blockquote>
<h2 id="3-gits-3-structural-areas">3. Git&#39;s 3 Structural Areas</h2>
<blockquote>
<ol>
<li>Working Directory : The actual project folder on my computer where I edit files.</li>
<li>Staging Area : A temporary &quot;shopping cart&quot; where files are gathered before making a snapshot.  We use the &#39;git add&#39; command here.</li>
<li>Repository : The secure &#39;vault&#39; where the staged files are permanently saved with a label. We use the &#39;git commit&#39; command here.
<img src="https://velog.velcdn.com/images/_dodo_/post/9b37e7d0-b66c-43b3-928f-2b086768e786/image.png" alt=""></li>
</ol>
</blockquote>
<h2 id="4-branch-management-strategy">4. Branch Management Strategy</h2>
<blockquote>
<p>I also explored how professional teams structure and manage their branches effectively.</p>
</blockquote>
<ol>
<li>Main - The most stable version, always ready for production/ deployment.</li>
<li>Dev - The central integration branch where newly developed features are merged and tested.</li>
<li>Feature - Dedicated branches used to develop individual features independently.</li>
<li>Hotfix - Urgent branches created to quickly fix bugs found dirsctly in the production<em>main</em>environment.</li>
</ol>
<h2 id="5-step-by-step-guide-to-creating-the-invitation-page">5. Step by step Guide to Creating the Invitation Page</h2>
<h3 id="step-1-initialize-the-local-repositoty---init">step 1. Initialize the Local Repositoty - init</h3>
<p>Open the terminal-powershell- and initialize the project folder so Git can start tracking.</p>
<ul>
<li>command : git init -- this creates a hidden &#39;.git&#39;folder inside your directoty<h3 id="step-2-create-a-file-and-first-commit---add--commit">step 2. Create a File and First Commit - add , commit</h3>
Open vs code, create the &#39;invitation.html&#39;file, write the markup, and log the very first version.</li>
<li>command : &#39;git add invitation.html&#39;-stage the file , &#39;git commit -m &quot;feat: invitation base&quot;&#39;-commit the file to the vault<h3 id="step-3-feature-development--merging---branch--merge">step 3. Feature Development &amp; Merging - branch , merge</h3>
keep the original codebase safe while experimenting with new styling or designs on a separate branch.</li>
</ul>
<ol>
<li>Create and switch to a design branch: &#39;git switch -c feat/design&#39;</li>
<li>After editing, return to the main line with &#39;git switch main&#39; and combine them via &#39;git merge feat/design&#39;</li>
</ol>
<ul>
<li>Key Check point : Since there were no divergent changes, Git performed a clean &#39;Fast-forward&#39; merge, simply moving the main pointer forward.<h3 id="step-4-connect-to-github--upload---remote--push">step 4. Connect to GitHub &amp; Upload - remote , push</h3>
Publish the local work to the cloud repository so it can be accessed globally.</li>
</ul>
<ol>
<li>link the remote repository : &#39;git remote add origin [my URL]&#39;</li>
<li>push the code : &#39;git push -u origin main&#39;</li>
</ol>
<h3 id="step-5-web-deployment-via-github-pages">step 5. Web Deployment via GitHub Pages</h3>
<ol>
<li>Navigate to &#39;settings&#39; &gt; &#39;pages&#39; within your GitHub repository.</li>
<li>Under the branch configuration, select &#39;main&#39; and click &#39;save&#39;.</li>
<li>After a brief moment, click the generated URL link to confirm your live invitation page works flawlessly across the globe.
<img src="https://velog.velcdn.com/images/_dodo_/post/d3640bbe-5d50-42fe-9dca-2f4b9d1d93f3/image.png" alt="">
<img src="https://velog.velcdn.com/images/_dodo_/post/90203f82-3f89-49a8-974d-c97956953bd7/image.png" alt="">
<img src="https://velog.velcdn.com/images/_dodo_/post/5cf2670c-5238-42a3-b643-a2294b91da4e/image.png" alt=""></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL + PyMongo]]></title>
            <link>https://velog.io/@_dodo_/SQL-PyMongo</link>
            <guid>https://velog.io/@_dodo_/SQL-PyMongo</guid>
            <pubDate>Sat, 14 Mar 2026 08:38:33 GMT</pubDate>
            <description><![CDATA[<h1 id="pymongo">PyMongo</h1>
<h3 id="1setting---mongodb-atlas">1.Setting - MongoDB Atlas</h3>
<h3 id="2using-with-colab">2.Using with Colab</h3>
<p>➀make Collection<br>➁put Document : insert_one, insert_many
➂search Data: find(), find_one()<br>➃Projection
➄sort() &amp; limit()<br>➅Update: update_one(), update_many()
➆delete: delete_one()<br>➇delete Collection: drop
<br>
➀➁➂➃➄➅
temp_collection = db.temp_movies
my_movie = {  &quot;title&quot;: &quot;My Test Movie&quot;,
&quot;year&quot;: 2023, &quot;genres&quot;: [&quot;Action&quot;, &quot;Comedy&quot;] }
result_one = temp_collection.insert_one(my_movies)
display(movies.find_one({“title”:”The Great Train Robbery”))
my_movie_list=[{content},{content},{content}]
result_many= temp_collection.insert_many(my_movies_list)
for doc in temp_collection.find({content}):
display(doc)</p>
<p>➃➄➅
for doc in movies.fine({content},{content}).sort(,-1).limit(5)
display(doc)
uqdate_result_one= \ temp_colletion.update_one(
{content}, {content})
update_result_many= \ temp_collection.update_many(
{content}, {content})
delete_result_one= temp_collection.delete_one({content})
temp_collection.drop()</p>
<hr>
<h3 id="3-aggregation">3. Aggregation</h3>
<p>Step . $match  = WHERE</p>
<blockquote>
<p>① $eq : =     ② $gte: &gt;=     ③ $lte: &lt;=     ④ $gt: &gt;
⑤ $lt: &lt;        ⑥$ne: !=        ⑦ $in: in       ⑧ $nin: not in</p>
</blockquote>
<p>Logical Operators</p>
<blockquote>
<p>① $and        ② $or            ③ $nor</p>
</blockquote>
<p>$goup</p>
<blockquote>
<p>① $sum       ② $avg           ③ $min        ④ $max</p>
</blockquote>
<p>$project = SELECT</p>
<p><a href="https://docs.google.com/document/d/1QctMZDZ-SDymCl6f274CzDwTFWzxD2kBeC0AfXGGmEo/edit?usp=sharing">review</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[DATABASE CLASS-4]]></title>
            <link>https://velog.io/@_dodo_/DATABASE-CLASS-4</link>
            <guid>https://velog.io/@_dodo_/DATABASE-CLASS-4</guid>
            <pubDate>Sat, 14 Mar 2026 08:31:02 GMT</pubDate>
            <description><![CDATA[<p>Data Analysis by PyMySQL
1.</p>
<blockquote>
<p>import  pymysql
conn = pymsql.connect(
host = ‘      ’
user= ‘      ’
password= ‘      ’
db= ‘      ’
charset= utf8m64
cursorclass = pymysql.cursors.DictCursor
)
cursor = conn.cursor()</p>
</blockquote>
<p>2.JOIN + GROUP BY + ORDER BY + LIMIT</p>
<blockquote>
<p>(EX)
cur.execute(“””
SELECT d.first_name, COUNT(*) AS visits
FROM appointments a
JOIN doctors d ON a.doctor_id = d.doctor_id
GROUP BY d.doctor_id
ORDER BY visits DESC
LIMIT 3
“””)</p>
</blockquote>
<p>3.COMMIT() / ROLLBACK()</p>
<blockquote>
<p>TRY ~ EXCEPT AS  - ex -
try: 
  cur.execute(
“UPDATE patient_info SET city=%s WHERE id=%s”,
(‘Busan’, 2)
)
conn.commit()
print(‘정상 업데이트 -&gt; commit 완료’)
except Exception as e:
       conn.rollback()
       print(‘에러발생!! 롤백 실행’)</p>
</blockquote>
<p><a href="https://docs.google.com/document/d/1EyPOC73Ut-o7gnp4XfJZJi0aDdCUDf0wahGzuNqDxTg/edit?usp=drive_link">review</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL practice]]></title>
            <link>https://velog.io/@_dodo_/SQL-practice</link>
            <guid>https://velog.io/@_dodo_/SQL-practice</guid>
            <pubDate>Sat, 14 Mar 2026 07:58:11 GMT</pubDate>
            <description><![CDATA[<h1 id="before-class-review">before class review</h1>
<p><a href="https://docs.google.com/document/d/1GKDxuODd3xxeekdCx7aPFuJpixnlO4FO5eNrQiEkUlQ/edit?usp=sharing">REVIEW</a>
INNER JOIN   vs   LEFT JOIN
inner join:  common data only
left join: all from left + matches form right
<br>
WHERE diagnosis_name = ‘Diabetes’ or ‘Hypertension’   =&gt;  WRONG
WHERE diagnosis_name  in  ( ‘Diabetes’ or ‘Hypertension’ )<br>or
WHERE diagnosis_name=   ‘Diabetes’  or   diagnosis_name= ‘Hypertension’
<br>
SQL- Execution Oder
FROM  → JOIN  → WHERE  → GROUP BY
<br>
When using aggregate functions like COUNT or MAX, we must include a GROUP BY clause to define the groups
<br>
UNION- ALL</p>
<blockquote>
<p>SELECT patient_id AS id
FROM patients WHERE patient_id &lt;=10;
UNION ALL  -&gt;  위의 환자 ID, 밑의 의사 아이디 합쳐서 결과 나옴 
 -&gt;  combine high content’s result and low content’s result
SELECT doctor_id AS id
FROM doctors
WHERE doctor_id BETWEEN 10 AND 20;</p>
</blockquote>
<p>EXISTS ( )  ,  NOT EXISTS ()</p>
<blockquote>
<p>SELECT d.doctor_id, d.first_name, d.specialty
from doctors d
where exists(
    select 1
    from admissions a
    where a.attending_doctor_id = d.doctor id
)
select *
from admissions
where exists (
    select 1
    from patients p
    where p.allergies is not null
    and p.patient_id = a.patient_id
);</p>
</blockquote>
<h1 id="today-class">Today class</h1>
<p>1.SQL Basic process</p>
<blockquote>
<p>Create , Read, Update, Delete
Insert, Select, Update, Delete</p>
</blockquote>
<p>2.DATABASE   CREATE &amp; DELETE</p>
<blockquote>
<p>CREATE  DATABASE  db_name ;        ⇨         USE  db_name ;
DROP DATABASE  db_name; </p>
</blockquote>
<ol start="3">
<li><p>TABLE CREATE &amp; DELETE</p>
<blockquote>
<p>CREATE TABLE  table_name( column1 datatype <del>, column2 datatype</del>) ;
DROP table_name;</p>
</blockquote>
</li>
<li><p>check  or  watch</p>
<blockquote>
<p>DESC  table_name     -&gt;     read a summery 
SHOW  tables;     -&gt;    table list
SHOW CREATE TABLE  table_name;       -&gt;     check  all  SQL tables</p>
</blockquote>
</li>
<li><p>Alter tables</p>
<blockquote>
<p>add column: ALTER  TABLE  (table_name)  ADD  (-) condition;
del column: ALTER TABLE  (table_name)  DROP  COLUMN  (-);
change column type: ALTER  TABLE  (table_name)    MODIFY  column   Type;
change column name: ALTER TABLE  (table_name)   CHANGE  column  condition;
change basic value: ALTER TABLE (table_name)  ALTER(value) SET  DEFAULT(-);
change table name: ALTER  TABLE  (table_name)   RENAME  TO  (-);</p>
</blockquote>
</li>
</ol>
<p>6.INSERT</p>
<blockquote>
<p>INSERT  INTO  table_name  (column1, column2, column3 ….) 
VALUES (‘a1’,’a2’,’a3’.....)</p>
</blockquote>
<p>7.UPDATE</p>
<blockquote>
<p>UPDATE  table_name
SET  column1 = value1,  column2 = value2, column3=value3……
WHERE condition;          –=&gt;  very important    </p>
</blockquote>
<p>8.DELETE</p>
<blockquote>
<p>DELETE  FROM  table_name
WHERE condition;
실무에서는 delete 대신 soft delete 사용 </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[SQL basic and High-level]]></title>
            <link>https://velog.io/@_dodo_/SQL-basic-and-High-level</link>
            <guid>https://velog.io/@_dodo_/SQL-basic-and-High-level</guid>
            <pubDate>Sat, 14 Mar 2026 07:45:39 GMT</pubDate>
            <description><![CDATA[<h1 id="list">LIST</h1>
<ol>
<li>SQL</li>
<li>JOIN</li>
<li>GROUP BY / HAVING / LIMIT / Aggregation
<a href="https://docs.google.com/document/d/1gx0NFsGATZTOLiyJ5WGgtjPpK4SmcOm3OxhOkoVWKJo/edit?usp=sharing">review</a></li>
</ol>
<h1 id="sql">SQL</h1>
<blockquote>
<p>1.SELECT
⇾ Select an Search every or part of columns
2.WHERE 
⇾ WHERE + condition 
⇾ = &gt; &lt; between, in, like, is null, is not null
3.ORDER BY
⇾ ORDER BY column ASC( or DESC ) 
⇾ It is rule that ‘ WHERE  and then  ORDER BY ‘
<img src="blob:https://velog.io/21c52424-22cf-4be4-8253-3d75441551d2" alt=""></p>
</blockquote>
<h1 id="join">JOIN</h1>
<blockquote>
<p>1.one table cannot express medical data.
2.cannot connect patient and story without Join
3.how to use Join
⇾ INNER JOIN
 FROM table A
 INNER JOIN table B ON  A.key=B.key
⇾ LEFT JOIN
     FROM table A
      LEFT JOIN table B ON  A.key = B.key
<img src="blob:https://velog.io/58db1354-696d-4b6c-a931-5dca5411717c" alt=""></p>
</blockquote>
<h1 id="group-by-having-limit">GROUP BY, HAVING, LIMIT</h1>
<blockquote>
<p> GROUPBY
SELECT * FROM table GROUP BY group_column
GROUP BY Requirement: Match with non-aggregated SELECT columns.
 HAVING 
GROUP BY  AND THEN  HAVING 
HAVING condition
LIMIT
limit result numbers
LIMIT  num  or  LIMIT offset, num 
<img src="blob:https://velog.io/cf1d5a80-1bf0-45d2-ae89-81a14ca12271" alt=""></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Let's get start 'Database']]></title>
            <link>https://velog.io/@_dodo_/Lets-get-start-Database</link>
            <guid>https://velog.io/@_dodo_/Lets-get-start-Database</guid>
            <pubDate>Sat, 14 Mar 2026 07:22:29 GMT</pubDate>
            <description><![CDATA[<h1 id="day-1--basic-rdbms--sql">DAY 1.  basic RDBMS &amp; SQL</h1>
<h3 id="introduce-database">Introduce Database</h3>
<h3 id="basic-of-rdbms">Basic of RDBMS</h3>
<h3 id="erd-modeling">ERD Modeling</h3>
<h3 id="basic-sql">Basic SQL</h3>
<div style="border: 1px solid #adb5bd; padding: 15px; border-radius: 8px;">
  <b> Database : A system that stores data safely in a clear structure </b>
  <ul>
    <li>divide a lot of tables and save  -safely store </li>
    <li>search faster  -many people can use this at the same time</li>
  </ul>
  <b> Basic of RDBMS </b>
  <ul>
    <li>Basic word : Database,  Table,  DBMS,  Column,  RDBMS,  Row,  Domain,  Schema</li>
    <li>Database Type  - RDBMS, NoSQL</li>
    <li>important: onecell only has one value</li>
    <li>key type : super key, candidate key, Primary Key, alternate key, Foreign Key, surrogate key</li>
  </ul>
  <b> Integrity,  Normalization </b> 
  <ul>
    <li>Data Integrity: Ensuring that data remains accurate, complete, and protected from unauthorized modification, corruption, or deletion.</li>
    <li>Normalization: 1NF(first normal form), 2NF(second normal form), 3NF(third normal form) 
  </ul>
  <b>ACID</b>
  <ul>
    <li>A(atomicity / 부분성공금지)</li>
    <li>B(consistency / 항상 규칙 충족)</li>
    <li>I(Isolation / 동시에 실행돼도 정확)</li>
    <li>D(durability / 기록 영구 보존)</li>
  </ul>
  <b> ERD, SQL </b>
  <ul>
    <li>Entity Relationship Diagram </li>
    <li>SQL (Structured Query Language) is the standard language designed for managing data in relational database management systems (RDBMS).</li>
  </ul>
</div>

<p><a href="https://docs.google.com/document/d/1wqPlLjPy75K_V5z8v7zptg1wd0twl5kRdshQCQWJu00/edit?usp=sharing">Review</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Data Analysis and Visualization class-3]]></title>
            <link>https://velog.io/@_dodo_/Data-Analysis-and-Visualization-class-3</link>
            <guid>https://velog.io/@_dodo_/Data-Analysis-and-Visualization-class-3</guid>
            <pubDate>Sat, 14 Mar 2026 07:01:55 GMT</pubDate>
            <description><![CDATA[<p><a href="https://colab.research.google.com/drive/1RxSKxXlYZIwT23lBMmt6VkwzmpzdFqrV?usp=sharing">review</a></p>
<h2 id="data-preprocessing">Data Preprocessing</h2>
<p>first step : Data cleaning
  -Missing Values  -  NaN or None or Null
second step : Basic Transformation<br></p>
<blockquote>
<p>Data Preprocessing -  isnull, notnull
isnull : Null=&gt; return True  /  isna == isnull
notnull : Null=&gt; return False  / notna == notnull
<br>
Handling missing values - dropna()
axis=0 del row , axis=1 del column
subset=[&#39;column&#39;s name&#39;]
inplace = False,  inplace= True
<br>
Filling missing values - fillna()
fillna: constant imputation
ffill: forward fill
bfill: backward fill
<br>
Detecting Duplicate data - duplicated()
Ture: duplicated data
False: the first occurrence of the data, the original entry
<br>
delete duplicated row - drop_dulicates
keep option </p>
<ol>
<li>first : keep the first occurrence of the row(basic value)</li>
<li>last : keep the last occurrence of the row</li>
</ol>
</blockquote>
<h2 id="outliers">Outliers</h2>
<p>ex: bp 300/200, bst 700
Data Error -&gt; drop,  clinical extreme -&gt; capping</p>
<blockquote>
<p>Search Outliters to use IQR
IQR &lt; Q1-1.5<em>IQR  &amp;  IQR &gt; Q3+1.5</em>IQR
Q1 = df.quantile(0.25)  ,  Q3 = df.quantile(0.75)
IQR = Q3-Q1<br>
Problem about data types
astype() - type casting
pd.to_numeric() | pd.to_datetime()</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[Data Analysis and Visualization class-2]]></title>
            <link>https://velog.io/@_dodo_/Data-Analysis-and-Visualization-class-2</link>
            <guid>https://velog.io/@_dodo_/Data-Analysis-and-Visualization-class-2</guid>
            <pubDate>Sat, 14 Mar 2026 06:30:57 GMT</pubDate>
            <description><![CDATA[<p><a href="https://colab.research.google.com/drive/1UPUvFVhUSkXmKGu_Ci6jzgYxSzpu-F6n?usp=sharing">my review</a></p>
<h1 id="edaexploratory-data-analysis">EDA(Exploratory Data Analysis)</h1>
<p>Stage 1: Overall Data Overview - Descriptive Statistics<br>
Stage 2: Exploring Differences by Target - Group Analysis<br>
Stage 3: Verifying the Authenticity of Differences - Statistical Hypothesis Testing<br>
Stage 4: Identifying Relationships Between Variables - Correlation Analysis<br></p>
<h2 id="environment-setup">Environment Setup</h2>
<div style="border: 1px solid #adb5bd; padding: 15px; border-radius: 8px;">
  <b> 수업 전 준비 (Pre-class Preparation)</b>
  <ul>
    <li>!apt-get update -qq
!apt-get install -y fonts-nanum* > /dev/null
!fc-list :lang=ko
!rm -rf ~/.cache/matplotlib/*</li>
    <li>!ls /usr/share/fonts/truetype/nanum</li>
    <li>import pandas as pd, import numpy as np</li>
    <li>import matplotlib.pyplot as plt</li>
    <li>import matplotlib.pyplot as plt, from scipy import stats</li>
    <li>!pip install kagglehub, import pandas as pd, import kagglehub</li>
  </ul>
</div>

<h2 id="basic-words">basic words</h2>
<blockquote>
<p><strong>index</strong> : the range and data type of the index
<strong>entries</strong> : the total number of rows in the dataset&lt;
<strong>data columns *<em>: the total count and names of each individual column
*</em>non-null count</strong> : the number of actual data points, excluding missing values(=NaN)
** Dytpe <strong>: the data type of each column
**Memory usage</strong> : the total amount of memory occupied by the DataFrame</p>
</blockquote>
<h2 id="descriptive-analysis---describe">Descriptive analysis - describe()</h2>
<div style="border: 1px solid #dee2e6; padding: 20px; border-radius: 10px; background-color: #f8f9fa;">
  <strong style="font-size: 1.1em; color: #343a40;">Descriptive Statistics: describe()</strong>
  <p style="font-size: 0.9em; color: #666;">Detailed metrics for numerical data</p>
  <ul style="line-height: 1.8; margin-top: 10px;">
    <li><b>Count:</b> Number of actual data points (excluding Null).</li>
    <li><b>Mean & Std:</b> Average and standard deviation (dispersion).</li>
    <li><b>Min & Max:</b> The range of the data.</li>
    <li><b>Quartiles (25%, 50%, 75%):</b> 
      Points that divide the data into four equal parts (Q1, Q2/Median, Q3).
    </li>
  </ul>
</div>

<h2 id="example">example</h2>
<div style="border: 1px solid #dee2e6; padding: 20px; border-radius: 10px; background-color: #f8f9fa;">
  <strong style="font-size: 1.1em; color: #343a40;"></strong>
  <ul style="line-height: 1.8; margin-top: 10px;">
    <li>import pandas as pd



<p>continuous_vars = [
    &#39;BMI&#39;,
    &#39;MentHlth&#39;,
    &#39;PhysHlth&#39;,
    &#39;Age&#39;
]</p>
<p>df_mean_=df[continuous_vars].mean()      # type(df_mean_) - Series -(4.1)</p>
<p>df_median_=df[continuous_vars].median()  # type(df_median_) - Series -(4.1)</p>
<p>df_mode_=df[continuous_vars].mode()      # type(df_mode_) -dataframe - (1.4)
   </li>
  </ul></p>
</div>]]></description>
        </item>
        <item>
            <title><![CDATA[Maybe Coding Isn't a Good Fit for Me]]></title>
            <link>https://velog.io/@_dodo_/Maybe-Coding-Isnt-a-Good-Fit-for-Me</link>
            <guid>https://velog.io/@_dodo_/Maybe-Coding-Isnt-a-Good-Fit-for-Me</guid>
            <pubDate>Sat, 14 Mar 2026 05:35:51 GMT</pubDate>
            <description><![CDATA[<p> I finally realized that I haven&#39;t been able to update my study reviews. 
 Every morning I’d think, &quot;Oops, I really have to do it today!&quot;
 But by the time I finished my classes,homework, and revision, I was exhausted.
 I’ve been going to bed at midnight or even past 1 AM... and just like that,
 a whole two weeks have passed. Oh my god, haha. It’s totally my fault!&quot;
 Anyway I&#39;m getting stared now!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Review_03_3_class]]></title>
            <link>https://velog.io/@_dodo_/Review033class</link>
            <guid>https://velog.io/@_dodo_/Review033class</guid>
            <pubDate>Wed, 04 Mar 2026 08:21:18 GMT</pubDate>
            <description><![CDATA[<p>Data types</p>
<blockquote>
<p>Numerical Data</p>
</blockquote>
<ul>
<li>mean,median calculations are possible<br></li>
</ul>
<ol>
<li>Continuous Data - float type
-distribution analysis
-regression analysis
-ex-
-height=[156.2, 168.8, 180.1]</li>
<li>Discrete Data -int<ul>
<li>can count data</li>
<li>frequency analysis</li>
<li>ex-</li>
<li>patient_counts=[10, 25, 15]</li>
</ul>
</li>
</ol>
<blockquote>
<p> Categorical Data</p>
</blockquote>
<ul>
<li>None calculable</li>
<li>Frequency &amp; Proportions</li>
</ul>
<ol>
<li>Ordinal Data - clear rank
-clear logical order between categories
-statistical metrics
-ex-
-pain_level =[&#39;none&#39;,&#39;normal&#39;,&#39;serious&#39;]</li>
<li>Nominal Data - no rank, just group</li>
</ol>
<p>-no natural order
-frequency analysis
-ex-
genders=[&#39;male&#39;,&#39;female&#39;,&#39;male&#39;]</p>
<blockquote>
<p>satisfaction_scores = [1, 2, 3, 4, 5, 3, 4, 4, 5, 3]
satifs_series = pd.Series(satisfaction)    ## list -&gt; pandas Series
satifs_median = satifs_series.median()     ## 중간값 median
satifs_mode = satifs_series.mode()         ## 최빈값 most frequent
satifs_count = satifs_series.value_counts()  ##빈도수 frequency</p>
</blockquote>
<p> <strong>ext</strong>
  i don&#39;t like computer
  i don&#39;t like python
  i don&#39;t like math
  but i should make it😭
  <a href="https://colab.research.google.com/drive/10covjGIoKDB202PrRS_yRDY8bBjS1WPm?usp=sharing">review rink</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Review_02_25_class]]></title>
            <link>https://velog.io/@_dodo_/Review0225class</link>
            <guid>https://velog.io/@_dodo_/Review0225class</guid>
            <pubDate>Thu, 26 Feb 2026 12:35:51 GMT</pubDate>
            <description><![CDATA[<p>Inheritance</p>
<blockquote>
<p>organized class structure to avoid repeating the same code
when starting a child classs, put the parent class name in brackets
super().<strong>init</strong>()
overriding a parent class method by defining a function with the same name.
<br>
Method Overriding
Redefining a parent&#39;s method in a child class to change its behavior
<br>
-ex-
class MedicalStaff:
 &nbsp;def <strong>init</strong>(self, name, department):
&nbsp;&nbsp;&nbsp; self.name = name
&nbsp;&nbsp;&nbsp;   self.department = departmentdef 
&nbsp;&nbsp;  def introduce(self):
&nbsp;&nbsp;&nbsp;&nbsp;    return f&quot;hello. I&#39;m {self.department} {self.name}&quot;
    <br>
class Doctor(MedicalStaff):
&nbsp;&nbsp;    def <strong>init</strong>(self, specialty):
&nbsp;&nbsp;&nbsp;&nbsp;      super. <strong>init</strong>(name,department)
&nbsp;&nbsp;&nbsp;&nbsp;      self.specialty = specialty<br>&nbsp;&nbsp;&nbsp;    def introduce(self):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      return f&quot;hello. I&#39;m {self.specailty}{self.name}&quot;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;• only change from department to specailty</p>
</blockquote>
<p>File I/O is required</p>
<blockquote>
<p>open() - Open the file, check the mode and decide what do we do
basic: file = open(&#39;file name.txt&#39;, &#39;mode&#39;, encoding=&#39;utf-8&#39;) and file.close()
&nbsp;&nbsp;&nbsp; c&#39;file close&#39; is very important !!!
w= write , r= read, a = add, r+ = read and write, utf-8 = korean
Using with is safer than not using it.!
&nbsp;-&nbsp;ex&nbsp;-
😒
patient_file = open(&#39;patient_info.txt&#39;, &#39;w&#39;, encoding=&#39;utf-8&#39;)
patient_file.write(&#39;patient info&#39;)
patient_file.close()
😊
with open(&#39;patient_info.txt&#39;,&#39;w&#39;,encoding=&#39;utf-8&#39;) as file:
file.write(&#39;patient info&#39;)</p>
</blockquote>
<p>exception handling</p>
<blockquote>
<p>try - except
&nbsp;-&nbsp;ex&nbsp;-
try:
&nbsp;&nbsp;-&gt; Error-prone code
except:
&nbsp;&nbsp;-&gt;Catch every error
&nbsp;&nbsp;print(&#39; A error occurred&#39;)
finally block: this code always runs without any errors
&nbsp;&nbsp;except ZeroDivisionError:# key = 0
&nbsp;&nbsp;print(&#39;height is bigger than zero&#39;)
&nbsp;&nbsp;except ValueError:# when enter str, instead of int
&nbsp;&nbsp;print(&#39;only enter numbers&#39;)
&nbsp;&nbsp;except Exception as e:# unexpected error
&nbsp;&nbsp;print(f&quot;an error occured: {e}&quot;)
&nbsp;&nbsp;finally:
&nbsp;&nbsp;print(&#39;ending the bmi calculate&#39;)
&nbsp;&nbsp;print(&#39;record in the system log&#39;)
<br>
&nbsp;&nbsp; more ~~## FileNotFoundError  - no exist
PermissionError - reject permission
ValueError - value is wrong
IsADirectoryError - try opening folder instead of file
UnicodeDecodeError - read wrong encoding
OSError - error about OS
IOError - IN/OUT General error</p>
</blockquote>
<p><a href="https://colab.research.google.com/drive/1iLLCtrNocrecDs9PYXmx8vo5rCGISWtX?usp=sharing">my review file</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Review_02_24_class]]></title>
            <link>https://velog.io/@_dodo_/Review0224class</link>
            <guid>https://velog.io/@_dodo_/Review0224class</guid>
            <pubDate>Tue, 24 Feb 2026 13:31:26 GMT</pubDate>
            <description><![CDATA[<p>day-5 + lambda</p>
<p> lambda - sorted - key
 lambda x : x[]
 age, name = lambda x : (x[age],x[name])</p>
<p>day-6 + class</p>
<p> every method&#39;s first (vale) is &#39;self&#39;
 returns a value back to the caller when the function ends.</p>
<p> <a href="https://colab.research.google.com/drive/1OaQf0piXTGl67NovwkJwjQO4wyQtXdzT?usp=sharing">my review link</a></p>
<p> this class was difficult...</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Review_02_23_class]]></title>
            <link>https://velog.io/@_dodo_/Review0223</link>
            <guid>https://velog.io/@_dodo_/Review0223</guid>
            <pubDate>Mon, 23 Feb 2026 13:38:31 GMT</pubDate>
            <description><![CDATA[<p><a href="https://colab.research.google.com/drive/1RtqF89VHWyjG1DDASACFDV9VitPGNWDq?usp=sharing">2.23 class</a></p>
<p>Today, we covered defining and calling functions in our coding class.
I found passing a list of dictionaries into a function particularly tricky.
I solved three practice problems to help me understand it.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Review_2_19_class ]]></title>
            <link>https://velog.io/@_dodo_/Review219class</link>
            <guid>https://velog.io/@_dodo_/Review219class</guid>
            <pubDate>Thu, 19 Feb 2026 08:47:24 GMT</pubDate>
            <description><![CDATA[<p>[today review rink]
(<a href="https://colab.research.google.com/drive/1hjh91_sdtUQl8mDruj-34ULRCPhNKOtf?usp=drive_link">https://colab.research.google.com/drive/1hjh91_sdtUQl8mDruj-34ULRCPhNKOtf?usp=drive_link</a>)
Today the class content is If statement!</p>
<h4 id="1-bools-have-only-two-values-t-and-f">1. bools have only two values, T and F</h4>
<pre><code>&gt; ex) patient_age = 25
&gt; if patient_age == 18:
&gt; print(&#39;he has become an adult&#39;)

&gt; ex) is_emergency = False
&gt; if is_emergency:
&gt; print(&#39;It is an emergency&#39;)

&gt; ex) blood_sugar = 180
&gt; is_diabetes = blood_sugar &gt;= 150
&gt; print(is_diabetes)</code></pre><h4 id="2-basic-structure-of-conditional-statements">2. Basic structure of conditional statements</h4>
<blockquote>
<p>-if the condition is true, the code executes.
temp = 38.2
if temp &gt;= 37.5:
print(&#39;checked fever&#39;)
else:
print(&#39;no fever&#39;)</p>
</blockquote>
<p>-if &#39;a&#39; is false
patient_age=16
if patient_age&gt;=18:
print(&#39;prescribe an adult&#39;s med&#39;)
else:</p>
<blockquote>
<p>print(&#39;prescribe a children&#39;s med&#39;)</p>
</blockquote>
<h4 id="3-conditional-operators">3. Conditional Operators</h4>
<blockquote>
<p>비교 연산자 - ex) &gt;, &gt;=, &lt;, &lt;=, ==, !=
포함 연산자 - ex) in , not in
-&gt; A in B : If &#39;B&#39; contains &#39;A&#39;, That&#39;s true.
-&gt; A not in B : If &#39;B&#39; does not contains &#39;A&#39;, That&#39;s true.</p>
</blockquote>
<h4 id="4-logical-operators">4. Logical Operators</h4>
<p>and : If all conditions are true,That&#39;s true.
or : If at least one condition is true, That&#39;s true
not: Inverts the value </p>
<h4 id="5-ternary-operators">5. Ternary Operators</h4>
<blockquote>
<p>If - else -&gt; result&#39;A&#39; if condition else result&#39;B&#39;
 -if condition is true, result&#39;A&#39; is returned
 -if condition is false, result&#39;B&#39; is returned</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>