본문 바로가기

전체 글

(68)
[Flutter] 출석 관리 앱 구글 시트와 연동되는 간단한 출석 관리 앱을 만들어 봤습니다.이번 앱은 기본적인 로컬 저장 방식에서 한 단계 더 나아가, Google Sheet를 활용해 여러 사람이 함께 데이터를 입력하고 공유할 수 있도록 구성한 것이 특징입니다. 사용 방법은 어렵지 않습니다. 각 사용자는 자신의 Google Sheet를 만들고, 그 안에 제공된 App Script를 붙여 넣어 웹 앱으로 배포한 뒤 URL만 설정해 주면 됩니다. 이렇게 하면 같은 URL을 사용하는 사용자끼리 출석 기록과 수강생 정보를 실시간으로 공유할 수 있습니다. 수업을 진행하는 사람이 출석을 입력하면, 같은 시트를 사용하는 다른 사람도 즉시 동일한 정보를 확인할 수 있고, 수강생 추가나 정보 수정 역시 여러 사람이 함께 관리할 수 있습니다. 작은 학..
printf 에서 숫자 앞에 + 또는 - 자동으로 붙이는 방법 C 언어에서 printf를 사용할 때, 숫자 앞에 + 또는 - 기호를 자동으로 붙이려면 포맷 문자열에서 + 플래그를 사용하면 됩니다. 이 방법을 활용하면 양수 값에도 + 기호가 표시되고, 음수 값은 기본적으로 - 기호가 붙어 출력됩니다. 1. + 플래그 사용법+ 플래그는 숫자가 양수일 경우 + 기호를 자동으로 추가해줍니다.printf("%+d", number);  + : 양수에도 +를 표시하고, 음수는 기본적으로 -를 표시합니다.d : 정수형 데이터를 출력할 때 사용하는 변환 사양입니다.2. 예제 코드아래 코드를 실행하면 + 플래그를 적용했을 때와 그렇지 않을 때의 차이를 확인할 수 있습니다. #include int main() { int pos = 42; int neg = -42; //..
에포크 시간(Epoch Time) 에포크 시간(Epoch Time)란?에포크 시간(Epoch Time)은 1970년 1월 1일 00:00:00 UTC 부터 경과한 초를 나타내는 시간 표현 방식입니다. 에포크 시간을 사용하는 이유✅ 시간 계산이 단순→ 특정 시간 차이를 계산할 때 두 숫자 간의 뺄셈으로 가능✅ 타임존 영향이 없음→ UTC 기준으로 저장되므로 변환이 쉬움✅ 컴퓨터 시스템에서 효율적→ 정수 형태로 저장되므로 데이터베이스나 네트워크에서 처리 속도가 빠름  간단한 언리얼 엔진에서 사용법을 알아봅시다.void AEpochActor::BeginPlay(){ Super::BeginPlay(); FDateTime Now = FDateTime::Now(); int32 year = Now.GetYear(); int32 month = Now...
[C++] Simple Thread - C++에서 멀티스레드를 활용한 간단한 콘솔 프로그램 예제이번 포스팅에서는 C++에서 멀티스레드를 활용한 간단한 콘솔 프로그램을 작성해보겠습니다. 이 프로그램은 사용자가 Enter 키를 누르면 스레드가 실행되고, ESC 키를 누르면 스레드가 종료되는 기능을 구현합니다. - MyThread 클래스 구현먼저, MyThread 클래스를 살펴보겠습니다. 이 클래스는 스레드가 실행되는 동안 "Runing..." 메시지를 매초 출력하다가, Stop 메서드가 호출되면 종료됩니다.// MyThread.h #pragma once#include #include #include // _getch()using namespace std;class MyThread{public: MyThread(); ~MyThread();p..
[UE5] 오브젝트 마스크 (object mask) 2 이전에 만든 오브젝트 마스크에서 엣지 부분에 노이즈를 더해 좀 더 게임스럽게 만들어 보겠습니다. https://jeylee.tistory.com/60 [UE5] 카메라와 플레이어 사이 오브젝트 마스크 (object mask)간단하게 카메라가 충돌하여 플레이어에 가까이 이동하는 것이 아닌 오브젝트의 일부를 마스킹하는 방법을 알아보겠습니다. 머티리얼을 만들기 전에 머티리얼 컬렉션을 먼저 생성하여 줍시다.jeylee.tistory.com 위 게시글에서 이어지는 내용입니다. 머티리얼을 열어줍니다. 이미지 처럼 중간의 자리를 확보합니다. 먼저 간단한 노이즈를 만들어줍니다. 여기서 Noise 노드의 스케일 값을 1로 두면 너무 섬세한 노이즈가 만들어지기 때문에 수치를 0.5 아래로 조절하여 노이즈 느낌을 추가해 줍..
[Python] 크롬 제어하기 (Selenium) 파이썬을 활용하여 가장 기본적인 크롬 브라우저를 제어하는 코드입니다. from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keyschrome_option = Options()chrome_option.add_experimental_option("detach", True)chrome_option.add_argument('--incognito') #시크릿 모드driver = webdriver.Chrome(options=chrome_option)driver.impl..
[UE5] 자연스러운 진행 바 (ProgressBar) #include "MainWidget.h"#include "Math/UnrealMathUtility.h"void UMainWidget::NativeConstruct(){ Super::NativeConstruct(); m_fPercent = 0.0f; GetWorld()->GetTimerManager().SetTimer(timer, this, &UMainWidget::UpdateProgress, 2.0f, true);}void UMainWidget::NativeDestruct(){ Super::NativeDestruct();}void UMainWidget::NativeTick(const FGeometry& MyGeometry, float InDeltaTime){ Super::NativeTick(MyGeom..
[C++] Curve Movement 어떤 움직임을 만들 때 일정한 이동은 너무 단조로워 보일 수 있습니다. 삼각함수를 사용하여 좀 더 재밌는 움직임을 만들어봅시다. float MyWindow::lerp(float a, float b, float t){ return a + (b - a) * t;}void MyWindow::Move_Linear(int x){ int posx = (int)lerp(100, 500, (float)x / 100); SetWindowPos(m_hWnd, HWND_TOP, posx, 100, 200, 200, SWP_NOSIZE | SWP_SHOWWINDOW);}void MyWindow::Move_Curve(int x){ float l = (cos(M_PI * (float)x / 100) + 1) * 0.5f; int..
[C++] OpenCV Window Capture 윈도우 캡처 https://jeylee.tistory.com/55 [C++] OpenCV Setup https://opencv.org/ Home OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI). opencv.org 먼저 OpenCV 설치를 위해 홈에 들 jeylee.tistory.com 이전의 OpenCV Setup을 하셨다면. OpenCV를 활용하여 윈도우의 화면을 캡쳐하는 방법입니다. "ESC" 키로 탈출할수 있습니다. #include #include..
[C++] Window SetFocus() SetForegroundWindow() 프로그램을 만들다가 특정 윈도우를 찾아서 입력을 넣거나 제어를 하고 싶을 때가 있습니다. Alt + Tab 을 하거나 그 프로그램을 찾아 마우스로 클릭을 해주는데 이것을 코드로 한번 해보겠습니다. HWND hwndNotepad = FindWindow(NULL, TEXT("제목 없음 - Windows 메모장")); if (hwndNotepad != NULL) { // 메모장 창을 화면의 최전면으로 가져옵니다. SetForegroundWindow(hwndNotepad); // 메모장 내의 특정 컨트롤 (예를 들어, 편집 컨트롤)의 핸들을 얻습니다. // 메모장의 편집 컨트롤의 정확한 클래스 이름은 시스템 또는 메모장 버전에 따라 다를 수 있으므로, // 이 예제에서는 간단히 메모장의 메인 윈도우 핸들을 사용..
[C++]ConsoleWindow Move 코드를 실행하면 나오는 저 ConsoleWindow를 옮겨봅시다. 이걸 왜 하는가? - 매번 왼쪽 위에 나오잖아. // Width Height int consoleWidth = 600; int consoleHeight = 1200; // 화면의 전체 해상도를 얻습니다. int screenWidth = GetSystemMetrics(SM_CXSCREEN); int screenHeight = GetSystemMetrics(SM_CYSCREEN); // 콘솔 창의 핸들을 얻습니다. HWND consoleWindow = GetConsoleWindow(); // 콘솔 창을 화면의 우측 하단에 위치시킵니다. MoveWindow(consoleWindow, screenWidth - consoleWidth, screen..
[UE5] 벽 뒤에 감지하기 (Scaning System) 이번에는 캐릭터를 중심으로 벽뒤의 오브젝트를 감지하는 스캔 시스템을 만들어 보겠습니다. 언리얼의 주요 기능으로 포스트 프로세스와 커스텀 스텐실 기능을 사용해 보겠습니다. 머티리얼에서 가져다쓸 컬렉션먼저 만들어 줍시다. 필자의 에셋처럼 스칼라 파라미터 Redius와 벡터 파라미터 Location을 각각 만들어줍니다. Rediuse는 스캔 반경을 동작하도록 사용할 변수이고 Location은 원의 시작 위치를 위한 정보입니다. 새롭게 머티리얼을 만들고 도메인을 PostProcess로 변경해 줍니다. 그리고 아래로 내려보면 블렌더블 위치라는 기능도 Before Tonemapping으로 설정해 줍시다. 먼저 간단한 원을 그려 보겠습니다. 위와 같이 만들어 줍시다. 그리고 컬렉션의 정보를 넣어주기 위해 캐릭터 BP..
[C++] 람다 표현식 안녕하세요! 오늘은 C++에서 매우 유용하면서도 간결한 코드 작성을 가능하게 하는 람다 표현식에 대해 알아보고자 합니다. 람다는 함수 객체를 간결하게 표현할 수 있는 기능으로, 모던 C++의 중요한 특징 중 하나입니다. 이번 글에서는 람다 표현식의 기본적인 구문부터 실제 활용 사례까지 살펴보겠습니다. 1. 람다 표현식의 기본 구문 람다 표현식은 보통 함수를 정의하는 데 사용됩니다. 다음은 람다 표현식의 기본적인 구문입니다. [capture list](parameters) -> return_type { // 함수 본문 } - capture list: 람다가 사용할 외부 변수들을 캡처하는 목록입니다. - parameters: 람다 함수의 매개변수입니다. - return_type: 반환 형식입니다. 생략 가능..
[UE5] 카메라와 플레이어 사이 오브젝트 마스크 (object mask) 간단하게 카메라가 충돌하여 플레이어에 가까이 이동하는 것이 아닌 오브젝트의 일부를 마스킹하는 방법을 알아보겠습니다. 머티리얼을 만들기 전에 머티리얼 컬렉션을 먼저 생성하여 줍시다. 그리고 컬렉션을 열어 벡터 파라미터에 로케이션이라는 값을 만들어 줍시다. 오브젝트들이 사용할 머티리얼을 만들고 다음 옵션을 변경하여 줍니다. 머티리얼에 저희가 만든 컬렉션을 불러와 줍시다. 컬렉션을 선택하고 디테일에 있는 에셋을 지정후 파라미터 이름에 Location을 선택해 줍니다. 먼저 간단하게 테스트할 노드를 작성하여 줍니다. mask 노드는 아래와 같이 찾으시면 됩니다. 이 머티리얼을 인스턴스로 만든 뒤 맵에 큐브를 배치하고 콜리전 옵션을 NoCollision으로 변경 머티리얼을 적용해 줍시다. 마지막으로 사용할 캐릭터..
[C++] 스마트 포인터 사용 방법 안녕하세요, 오늘은 C++ 프로그래밍에서 매우 중요한 주제인 "스마트 포인터(Smart Pointer)"에 대해 이야기하고자 합니다. 스마트 포인터는 메모리 누수를 방지하고 객체 수명을 관리하는 데 유용한 도구입니다. 이 게시물에서는 스마트 포인터의 개념, 종류 및 사용 방법에 대해 살펴보겠습니다. 1. 스마트 포인터란? 스마트 포인터는 일반 포인터와 달리 동적으로 할당된 메모리를 자동으로 관리하는 포인터입니다. 이는 메모리 누수를 방지하고 프로그램의 안전성을 높입니다. 스마트 포인터 종류 2. 스마트 포인터 종류 unique_ptr : 동적으로 할당된 메모리를 소유하며 해당 객체가 소멸될 때 메모리를 자동으로 해제합니다. 오직 한 곳에서만 소유될 수 있습니다. shared_ptr : 여러 포인터가 같은..
[UE5] Outline Material (Double Mesh) 이전 글에 Fresnel로 아웃 라인을 만들었습니다. 아웃라인을 만드는 자료를 찾다가 다른 방법을 알게 되어 다시 자료를 남깁니다. [이전 Fresnel 아웃 라인] https://jeylee.tistory.com/57 [UE5] Outline Material (Fresnel) 간단한 메쉬의 OutLine을 그려주는 머티리얼을 만들어봅시다. 먼저 아무 머티리얼을 만들어줍시다. 그리고 디테일 패널의 머티리얼 탭에서 몇 가지 설정을 해줍시다. 블랜드모드 : Masked 셰이딩 모 jeylee.tistory.com 이번에도 새로운 머터리얼을 만들고 디테일 창에 몇 가지 설정을 해줍니다. 블렌드모드 : Masked 셰이딩 모델 : Unlit 양면 : true 기본이 되는 컬러를 파라미터로 만들어줍니다. 처음 설..
[UE5] Outline Material (Fresnel) 간단한 메쉬의 OutLine을 그려주는 머티리얼을 만들어봅시다. 먼저 아무 머티리얼을 만들어줍시다. 그리고 디테일 패널의 머티리얼 탭에서 몇 가지 설정을 해줍시다. 블랜드모드 : Masked 셰이딩 모델 : Unlit 그리고 블루프린트에서 먼저 color를 만들어 이미시브에 연결하여 기본색상을 지정해 줍니다. 다음은 Fresnel(프리넬)을 이용하여 빛에 반사되는 부분에 대하여 오파시티 마스크를 연결하여 줍니다. 프리넬(Fresnel)은 빛이 특정한 표면에 닿을 때 반사되는 정도를 나타내는 개념입니다. 프리넬 효과는 주로 유리, 물, 금속 등의 물질에서 관찰되며, 이것은 빛이 해당 표면과 만날 때 재질의 굴절률(Index of Refraction)에 따라 얼마나 반사되는지를 결정합니다. 마지막으로 월드 ..
[UE4] 스플라인으로 메쉬 배치하기 언리얼에 있는 스플라인 컴포넌트로 메쉬를 배치하는 방법에 대해 알아보겠습니다. 엑터를 하나 만드시고 스플라인 컴포넌트를 추가해 줍시다. 그리고 저희는 게임이 플레이할 때 메쉬를 배치하는 것이 아니라 에디터에서도 이미 배치되어야 하기 때문에 ConstructionScript 탭에서 작업을 할 것입니다. 변수생성 Mesh - 스플라인에 배치할 메시 CreateCount - 생성할 개수 interval - 생성간격 이렇게 3개의 변수를 만들어 주세요. 블루프린트 처음으로 생성할 개수 대비 간격을 계산해 줍니다. 다음으로 카운트의 루프를 돌려줍니다. 그리고 카운트에 대한 미리 계산한 간격으로 스플라인의 Transform을 가져옵니다. 여기서 GetTransformAtDistnaceAlongSpline 함수가 스..
[C++] OpenCV Setup https://opencv.org/ Home OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI). opencv.org 먼저 OpenCV 설치를 위해 홈에 들어가 깃허브에 접속합니다. 깃허브에서 Releaese에 들어가 줍시다. Assets에서 Window가 써진 exe파일을 받아줍시다. 필자가 작성할 때는 4.9.0이지만 다를 수 있습니다. 다운을 받았으면 적당한 위치에 Extract 해줍시다. 보통 C:\ 에 그냥 설치하거나 자신이 설치파일을 ..
[C/C++] ini file read/write C++ 언어로 .ini 파일을 쓰고 읽는 코드를 알아 봅시다. // Main.cpp #include #include #include #include #include // for wstring_convert #include // for codecvt_utf8 using namespace std; int main() { wstring wpath = L"./Sample.ini"; // ini file write ----- wchar_t value[256]; wsprintfW(value, L"this is Value %d", 1); // make value WritePrivateProfileString(L"Section", L"Name", value, wpath.c_str()); // ini file read ..
[C/C++] 윈도우 생성하기 처음 윈도우를 생성하면 보통 프로젝트 생성 때 Window Desktop 프로젝트를 만들어서 생성합니다. 하지만 항상 윈도우를 생성해야 할 때마다 프로젝트를 새로 만들어야 하는가?라는 의문을 가지고 만들어보게 되었습니다. // Main.cpp #include #include "MyWindow.h" using namespace std; int main() { cout ProcessMessages()) { cout
[C/C++] std::wstring to std::string C++을 다루다보면 wstring string을 다루는 경우가 많습니다. 두 타입을 모두 쓰다보면 변환하는 방법이 필요한데 기존의 웹에서 긁어 찾은 방법 입니다. wstring path = L"this is path."; string spath(path.begin(), path.end()); cout
[Visual Studio] 자꾸 까먹는 레이아웃 세팅 visual studio를 새로 설치하면 항상 아래의 레이아웃을 보게 됩니다. 하지만 필자는 솔루션 탐색기가 왼쪽에 배치된 레이아웃을 쓰고싶고 매번 이 세팅을 까먹어서 헛수고를 덜고자 기록합니다. 도구-설정 가져오기 및 내보내기 위 과정을 마치고 나면 아래와 같이 세팅됩니다. 이제 매번 모든 메뉴를 누르는 수고가 없겠죠? (필자는 이 글을 작성 이후에 위 기능을 까먹지 않았다고 합니다.)
[C++] 외부 프로그램 실행 외부 프로그램을 실행시켜봅시다. #include #include #include using namespace std; int main() { ShellExecute(NULL, L"open" , L"Open.txt" , L"" , L"." , SW_SHOW); } 네.. 세상 날먹 코드입니다. 윈도우에서 사용할 수 있는 간단한 프로그램 실행 함수입니다. MSDN의 ShellExecute() : https://learn.microsoft.com/ko-kr/windows/win32/api/shellapi/nf-shellapi-shellexecutew 이 함수의 요구 사항은 핸들/옵션/실행파일이름/파라미터/위치/창표기방법 입니다. 순서대로 해석하자면 NULL - 오류를 표기하려면 부모에 대한 핸들이지만 작성자는..

반응형