Windows Markdown Viewer 개발기 (WPF + .NET 8 + WebView2)

Windows
로컬 Markdown 파일을 보다 효율적으로 다루기 위해 탐색 + 편집 + 미리보기 + 검색을 하나로 통합한 Windows 전용 뷰어를 개발했습니다. ## 1. 프로젝트 개요기존 Markdown 툴들은 다음과 같은 불편함이 있었습니다- 파일 탐색 기능이 약함- 로컬 기반 작업 흐름이 끊김- 여러 파일을 동시에 관리하기 번거로움이를 해결하기 위해 다음 목표로 개발했습니다- 로컬 파일 중심 워크플로우- IDE 스타일 멀티 탭 구조- 편집 + 미리보기 동시 작업- 외부 변경 대응## 2. 기술 스택Framework : .NET 8UI : WPFRenderer : MarkdigPreview : WebView2Output : WinExe 선택 이유 WPF: Windows 네이티브 UX + 빠른 개발 Markdig: 확장성 높은 Markdown 파서 WebView2: HTML 렌더링 + JS 확장 가능 3. 전체 구조 [Explorer] ────────────────┐ │ ▼ [Tab Manager] │ ┌───────────┬────────────┐ ▼ ▼ ▼ [Editor] [Preview] [Search] 4. 파일 탐색기 (Explorer) 핵심 기능 드라이브 루트부터 탐색 폴더 트리 구조…
Read More

Git 기초부터 고급 명령어까지: 개발자를 위한 가이드

소스관리
Git은 분산형 버전 관리 시스템으로서 개발자에게 필수 도구입니다. 이번 포스팅에서는 Git의 기본 명령어부터 실무에서 활용 가능한 고급 명령어까지 알아봅니다. 1. Git이란? Git의 기본 개념과 중요성 Git 설치 방법과 초기 설정(사용자 이름, 이메일 등) git config --global user.name "홍길동"git config --global user.email "hong@example.com" 2. Git 기본 명령어 정리 저장소 초기화하기: git init 변경사항 추가 및 커밋: git add .git commit -m "Initial commit" 원격 저장소 연결하기: git remote add origin <원격저장소 주소>git push origin main 3. 브랜치 관리와 병합하기 브랜치를 활용하면 협업 및 기능별 작업 관리가 용이합니다. 브랜치 생성 및 전환: git branch feature-logingit checkout feature-login 브랜치 병합: git checkout maingit merge feature-login 병합 충돌 해결 방법 안내 4. Git 고급 명령어와 팁 히스토리 관리(커밋 메시지 변경, 병합): git rebase -i HEAD~3 커밋 취소 또는 되돌리기: git reset --hard <커밋해시>git revert…
Read More

AWS Lightsail을 이용한 웹 서버 구축 가이드

컴퓨터
AWS Lightsail은 아마존이 제공하는 간편한 클라우드 호스팅 서비스입니다. 이번 글에서는 초보자도 쉽게 따라 할 수 있는 AWS Lightsail을 활용하여 웹 서버를 구축하는 과정을 안내하겠습니다. 1. AWS 계정 생성 및 Lightsail 접속하기 AWS Lightsail에 가입하고 로그인합니다. Create instance를 클릭하여 새 인스턴스를 생성합니다. 2. 인스턴스 설정하기 원하는 운영체제(추천: Ubuntu 22.04)를 선택합니다. 인스턴스 플랜(가격과 성능)을 선택합니다. 초보자는 $5 플랜을 추천합니다. 인스턴스 이름을 입력하고 생성합니다. 3. SSH로 서버 접속 및 업데이트하기 AWS에서 제공하는 웹 기반 SSH 또는 PuTTY 등의 클라이언트를 사용해 서버에 접속합니다. 서버를 최신 상태로 업데이트합니다. sudo apt update && sudo apt upgrade -y 4. 웹 서버 설치 (Apache 또는 Nginx) Apache 설치 예시: sudo apt install apache2 -ysudo systemctl start apache2sudo systemctl enable apache2 Nginx 설치 예시: sudo apt install nginx -ysudo systemctl start nginxsudo systemctl enable nginx 5. SSL 인증서 발급…
Read More

개발자 포트폴리오 사이트 만들기: GitHub Pages 활용하기

컴퓨터
개발자에게 포트폴리오 웹사이트는 필수입니다. 오늘은 누구나 쉽게 접근 가능한 GitHub Pages를 활용해 자신만의 포트폴리오 사이트를 만드는 과정을 안내하겠습니다. 1. GitHub 계정 생성 및 Repository 만들기 GitHub에 가입합니다. portfolio 또는 원하는 이름으로 새 Repository를 만듭니다. 2. GitHub Pages 활성화 Repository의 Settings에서 Pages 탭으로 이동합니다. Source를 선택해 Branch를 main으로 설정하고, 저장합니다. 설정 후 GitHub가 제공한 URL로 사이트가 접근 가능합니다. 3. 포트폴리오 웹페이지 만들기 HTML과 CSS를 활용하여 간단한 웹페이지를 만듭니다. 자기소개, 기술스택, 프로젝트 경험 등을 포함하세요. 다음은 간단한 HTML 예시입니다: <!DOCTYPE html> <html> <head> <title>개발자 홍길동 포트폴리오</title> <link rel="stylesheet" href="style.css"> </head> <body> <header> <h1>홍길동의 포트폴리오</h1> </header> <section> <h2>자기소개</h2> <p>안녕하세요. 웹 및 앱 개발자 홍길동입니다.</p> </section> <section> <h2>기술 스택</h2> <ul> <li>HTML/CSS/JavaScript</li> <li>Python</li> <li>Android(Java, Kotlin)</li> </ul> </section> <section> <h2>주요 프로젝트</h2> <p>GitHub에 공개한 프로젝트 목록과 링크를 삽입하세요.</p> </section> <footer> <p>이메일: honggildong@example.com</p> </footer> </body> </html> 4. GitHub에…
Read More

Gitea 서버 설치 및 설정 가이드

Linux, 소스관리
이 가이드는 Ubuntu 환경에서 Gitea 서버를 설치하고 설정하는 전체 과정을 단계별로 안내합니다. 1. 시스템 업데이트 sudo apt update sudo apt dist-upgrade -y sudo apt autoremove -y cp /etc/skel/.bashrc /root/.bashrc 2. 로케일 및 시간대 설정 sudo vi /etc/default/locale # 파일 내 LANG=en_US.UTF-8로 설정 dpkg-reconfigure tzdata timedatectl sudo apt install systemd-timesyncd sudo systemctl enable systemd-timesyncd --now timedatectl timesync-status sudo apt install chrony chronyc sourcestats -v 3. Nginx 설치 및 설정 sudo apt install nginx -y sudo vi /etc/nginx/sites-available/gitea # 아래 내용을 파일에 추가 server { listen 80; server_name git.도메인.com; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } sudo ln -s /etc/nginx/sites-available/gitea /etc/nginx/sites-enabled/gitea sudo nginx -t sudo systemctl restart nginx 4. SSL 인증서 발급 (Let's Encrypt) sudo apt install certbot python3-certbot-nginx -y…
Read More

OpenVPN Client 파일 생성서 remote 주소를 IP 말고 도메인으로 설정

Linux, 컴퓨터
OpenVPN을 사용할 때, 클라이언트가 서버에 접속하기 위한 정보는 보통 .ovpn 파일 혹은 공통 템플릿(client-common.txt)에 작성됩니다. 이때 서버 주소를 IP 주소가 아닌 도메인 이름(DNS) 으로 설정하면 훨씬 유연한 구성이 가능합니다. 왜 IP 주소 대신 도메인 주소를 써야 할까? ✔️ IP는 바뀔 수 있다 많은 서버는 고정 IP를 사용하지 않거나, 유동 IP 환경에서 운영되기도 합니다. 예를 들어, 일반 가정용 인터넷이나 일부 클라우드 환경에서는 재부팅 혹은 일정 시간 경과 후 IP가 변경될 수 있습니다. ✔️ 도메인 주소는 항상 유효하다 이를 해결하기 위해 DDNS(Dynamic DNS) 기능을 활용하면, IP가 변경되더라도 도메인 이름을 항상 최신 IP로 연결시킬 수 있습니다. 클라이언트는 접속 시 항상 도메인을 기준으로 DNS 조회를 하므로 IP 변경에 신경 쓰지 않아도 됩니다. #vi /etc/openvpn/server/client-common.txt 설정 예시: client-common.txt에서 도메인 적용하기 OpenVPN의 클라이언트 설정 파일 또는 공통 템플릿 파일에서 다음과 같이 설정을 변경합니다. 기존 설정 (IP…
Read More

OPEN VPN으로 Client 간 접속 및 도메인 접속 차단

Linux, Windows
VPN으로 외부에서 내부 Test 서버를 접속 하기 위해서 조금은 설정을 하다가 일단은 기록을 진행 합니다. 물리적으로 거리가 있고, 동일 네트워크망에 있지 않을 경우에 해당 문제를 해결 하기 위해서 기록을 하는것입니다. 응용을 하기에 따라서 다른 용도로 사용을 할 수 있지만 제가 중점적으로 노리는 효과는 "가상 내부망 구축", "접속할 사이트 제한" 2가지를 중점적으로 해서 처리한 내용입니다. 일단 OPEN VPN 서버 설정을 변경을 하여서 Client간에 통신이 되도록 허용하고, DNS 조정을 통해서 원하지 않는 웹사이트는 접속 하디 않도록 설정을 합니다. # vi /etc/openvpn/server/server.conf # 서버 설정 파일에 클라이언트 간 통신 허용 client-to-client # OPENVPN에 다른 DNS 차단하도록 설정 push "block-outside-dns" # 고정IP 할당하기 위한 설정 client-config-dir /etc/openvpn/ccd # OPENVPN Status 기록 status /var/log/openvpn-status.log status-version 2 # DNS를 현재 서버로 이용하기 push "dhcp-option DNS 10.8.0.1" #※ 이미 있을 경우는 삭제를 하거나 수정하시며 됩니다. 해당 설정을…
Read More

OpenVPN이란? 안전한 원격 접속을 위한 오픈소스 VPN 솔루션

컴퓨터
OpenVPN은 인터넷 상에서 암호화된 안전한 네트워크 통신을 가능하게 해주는 오픈소스 VPN 솔루션입니다. 기업 및 개인 사용자 모두에게 강력한 보안을 제공하면서도 유연한 설정이 가능해 인기가 많습니다. 1. VPN(Virtual Private Network)의 개념 VPN은 공용 네트워크(인터넷)를 통해 사설 네트워크에 **보안된 연결(터널링)**을 만들어주는 기술입니다. 보안성 향상: 데이터 암호화로 도청 방지 IP 우회: 지정된 서버를 통해 외부 IP를 변경 원격 접속: 외부에서도 회사 네트워크에 접속 가능 2. OpenVPN의 특징 오픈소스: 누구나 무료로 사용 가능 고성능: UDP/TCP를 통한 빠르고 안정적인 통신 강력한 암호화: SSL/TLS 기반 보안 운영체제 다양성: Windows, Linux, macOS, Android, iOS 지원 확장성: 인증서 기반 인증, 사용자 관리, 로깅 등 기업 환경에 최적화 가능 3. OpenVPN의 기본 구성 OpenVPN은 서버-클라이언트 구조입니다. 서버: VPN 허브 역할, 인증 및 암호화 설정 클라이언트: 각 장치에서 서버에 접속하여 사설망처럼 사용 OpenVPN 연결은 보통 .ovpn 구성 파일을 통해 설정됩니다.…
Read More

왜 웹서버에 접속이 많을까나?

Linux
일단 제가 운영하는 블로그는 몇개 있습니다. 최근에 너무 바빠서 글을 적지 않고 있어서 검색엔진과 다른 사이트에서 방문할 일이 0%에 가깝습니다. 이전에 작성할 글이 있기 때문에 접속이 없다고는 말을 하지 못하지만, 최근에 맞춰서 글이 없어서 방문할 이유가 전혀 없습니다. 그런데, 검색엔징 Bot등이 엄청 방문하니 조용하던 웹서버는 비명을 지르고 있습니다. 서버관리를 통해서 차단을 하고 있지만 이게 차단을 한다고 막아 지는게 아니지만 최대한 자동으로 막아 두고 있습니다. 개인적인 블로그만 운영하고, 커뮤니티도 없고 파일 업로드등도 열어 두지 않는 웹서버라서 제가 모르는 사람이 방문하다고 하여서 할게 블로그에 댓글을 남기는게 끝입니다. 블로그에도 스펨을 막기 위해서 플러그인등을 설치 하는등 여러가지 하고 있어서 뚫고 들어오는 사람이 일주일에 몇명은 있지만, 나날이 발전하는 스펨이야 조금 뚫릴 수 있다고 보고 있습니다. 스펨과 Bot은 그나마 서버 탈취나 취약점 찾기 위한 노력을 한다고 하지만 SEO 사이트들이 들어오는것은 100% 이해를 하지 못하겠습니다. 저는 블로그를…
Read More

워드프레스 Cloudflare 설정후 관리자 페이지 접속 오류

www
워드프레스 속도 및 보안을 위해서 설정을 하였지만, 조금 관리자 페이지에서 문제가 발생하여서, 설정을 변경을 진행 하게 되었습니다. 클라우드플레어에 접속 하여서 Page Rules를 작성하였습니다. 인터넷에 검색을 하면은 Page Rules 메뉴가 정확하지 않은데, 아마 CloudFlare에 변화에 따라서 다른것 같아서 정확한 메뉴 위치는 하시는 순간에 찾아야 정확하게 나올것 같습니다. 일단 저는 워드프레스 성능과, 보안, 캐쉬 모두 비활성화 화여서 관리자 페이지 만큼은 그대로 사용을 위해서 설정을 하였습니다.
Read More

Cloudflare 설정후 홈페이지 접속 문제

www
프록싱을 사용해서 보안이나 속도를 좀 올려 보기 위해서 설정을 하였더니 너무 많은 리다이렉트 기능으로 인해서 접속이 안되는 문제가 있었습니다.해당 문제를 해결하기 위해서 조금 검색을 하다 보니 설정이 있어서 일단은 기록을 합니다. 처음에는 가변형이 되어 있었는데, 자체 SSL 인증서를 사용하기도 하고 하여서 "전체"로 변경을 하고 나서는 접속이 되었습니다.
Read More

Apache Log에 실제 IP 주소가 나오도록하기

Linux
일단 cloudflare 의 글을 참조 하여서 작성되었습니다.참조 주소는 "https://developers.cloudflare.com/support/troubleshooting/restoring-visitor-ips/restoring-original-visitor-ips/" 입니다. 아파치 기능을 활성화 합니다. sudo a2enmod remoteip 비활성화시는 다음과 같은 명령어를 사용 하시면 됩니다. sudo a2dismod remoteip 단일 서버이면 apache 환경설정에 설정하시면 되고, 아닐 경우 각각의 virtualhost에 설정을 하시면 됩니다.아래 내용이 설정할 내용입니다. RemoteIPHeader CF-Connecting-IP 아래는 위 구분을 추가 할 경우에 예시일뿐이니 각자 설정에 맞춰서 설정해 주시기 바랍니다. RemoteIPHeader CF-Connecting-IP ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined 이후에 아파치 환경설정도 변경을 해주시면 됩니다./etc/apache2/apache2.conf 파일에서 LogFormat에서 "%h" 부분을 "%a"로 변경합니다. 아래는 변경하고 난 후의 예시 입니다. LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combinedLogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%a %l %u %t \"%r\" %>s %O" common 그리고 나서 이제 cloudflar의 IP를 허용을 해주어야 하기 때문에 아래의 파일을 수정 합니다.해당 파일이 있을수도 없을수 있으니…
Read More

회사 동일 다수 DB 관리

CSharp, Windows, 프로그램
DB 가 분리되어 있지만 모두 동일한 DB 일 경우에 컬럼을 동일하게 변경하기 위해서 필요함.먼저 대상이 되는 DB를 수집후 테이블 명을 보고 컬럼을 변경을 할수 있습니다. 각 DB에서 테이블 정보를 수집도 가능합니다. 테이블을 추가 할 경우 다수의 DB에서 동일한 작업이 필요할 경우에 추가를 진행하면은 동시에 다수를 작업을 합니다. 테이블을 한곳에 만들어 두거나 혹은 특정 DB에서 필요한 테이블을 복사 혹은 삭제 처리 할수 있습니다. 테이블 내의 컬럼을 추가 하거나 삭제 변경 할수 있습니다. 컬럼의 형식이나 값을 변경할 경우에 나오는 화면입니다. 테이블에 컬럼을 추가 할 경우에 입력 하는 화면 입니다. 데이터를 볼때 정렬이 필요하면은 정렬 기능을 이용해서 정렬을 해서 전체 테이블에 동일 컬럼이나 값이 일치 하지 않는 것을 확인할때 필요합니다. DB 명세서를 만들때 엑셀 파일로 출력이 가능 합니다. 실제 엑셀로 출력 할 때 테스트나 불필요한 테이블을 제외 하고 저장 할 수 있도록 설정을…
Read More

Windows WSL2 자동 시작 설정

Windows
파워쉘 프로그램 코드 If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { $arguments = "& '" + $myinvocation.mycommand.definition + "'" Start-Process powershell -Verb runAs -ArgumentList $arguments Break } $remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '" $found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'; if ( $found ) { $remoteport = $matches[0]; } else { Write-Output "The Script Exited, the ip address of WSL 2 cannot be found"; exit; } $ports = @(22, 80, 443, 3306); Invoke-Expression "netsh interface portproxy reset"; for ( $i = 0; $i -lt $ports.length; $i++ ) { $port = $ports[$i]; Invoke-Expression "netsh interface portproxy add v4tov4 listenport=$port connectport=$port connectaddress=$remoteport"; } Invoke-Expression "netsh interface portproxy show v4tov4"; 파워쉘 파일을 작업 스케줄러에 등록을 합니다. 저는 c:\wsl_config 폴더 아래에 "wsl_port_forwarding.ps1" 로 만들어서 사용을 합니다. 동작 속성을 다음과 같이 설정을 하시면 됩니다. 프로그램 스크립트…
Read More

폰터 어썸 유료를 내 서버에서 서비스하자

Linux, WWW
※ 자기 서버가 있어야 가능한 기능 입니다. (트래픽주의) 홈페이지를 만들다 보면 사용자에게 주기가 애매한 소스들이 있습니다. 웹이라는 한계성 때문에 어떻게는 사용자가 내용을 알수가 있지만 최대한 주기 싫은 소스에 대해서 내 서버에서 운영을 할 수 있도록 만들어야 하는데 CrossDomain 위반으로 URL Domain이 다를경우에 문제가 생길때가 있습니다. AddType application/font-woff2 .woff2 일단 폰터어썸이 woff2 확장자를 처리를 해야 합니다. 위에 처럼 MIME 을 추가를 해서 처리가 가능하도록 해줘야지만 WEB 서버가 작동을 하게 됩니다. <FilesMatch "\.(ttf|otf|eot|woff|woff2)$"> Header set Access-Control-Allow-Origin "*" </FilesMatch> 위에 처럼 처리를 해줘서 어디서든 불러가서 사용할수 있도록 해주면 일단은 마무리 입니다. 일단 이렇게 사용을 하면은 자기 서버에서 서비스를 할 수 있는것으로 판단은 되지만 잘 작동하지 않을 수도 있지만 저의 입장에서는 현재 그대로 사용을 할 수 있습니다. 이 뿐만 아니라... Javascript를 고객 사이트에 두지 않아도 작동하도록 하는 기능도 작동을 합니다. 원래 이렇게 사용을 하면…
Read More