All
[딥러닝] 윈도우에서 Cuda, cuDNN 설치하기
[딥러닝] 윈도우에서 Cuda, cuDNN 설치하기
2024.09.29Cuda와 cuDNN 이란?CUDA toolkitNVDIA에서 개발한 소프트웨어 개발도구 모음GPU가 병렬연산을 수행할 수 있게 해준다. → 고성능 컴퓨팅 연산이 가능하게 됨 CUDA Toolkit 12.1 DownloadsGet the latest feature updates to NVIDIA's proprietary compute stack.developer.nvidia.comcuDNNGPU 가속화 라이브러리로 GPU의 성능을 극대화하고 모델 학습 및 추론 속도를 크게 향상cuda에서 설치한 파일에 덮어씌우는 형태로 설치 CUDA Deep Neural NetworkcuDNN provides researchers and developers with high-performance GPU accelera..
[SVN] Hook Script로 SVN 제어하기
[SVN] Hook Script로 SVN 제어하기
2024.04.14Hook이란? 특정 이벤트가 발생하면 동작하는 프로그램을 의미한다. 훅은 동작 방식에 따라 크게 2가지로 나눌 수 있으며, 그 종류는 다음과 같다. Pre-Hook : 이벤트가 처리되기 전에 수행됨 예) 정책에 맞는 메시지인지, 관리 규칙에 맞는지 등을 검사하고, 규칙에 어긋난다면 거부 등.. Post-Hook : 이벤트가 완전히 처리된 후에 수행됨 예) 커밋된 내용을 업데이트하여 자동으로 빌드 수행 등.. SVN Hook Svn에서 Hook을 설정하는 방법으로는 Server나 Client가 있는데, 해당 저장소를 사용하는 모든 유저에 적용하고 싶다면 Server에 거는 것이 일관성이 있으므로 더 좋다. 하지만 관리 이슈로 해당 서버에 접근할 수 없다면 실행 시 Client에서 스크립트 등록을 약속하고 ..
[VisualSVN Server] 설치 및 사용법
[VisualSVN Server] 설치 및 사용법
2024.04.09목적 VisualSVN Server를 통한 SVN Server 구축 OS Windows 10 사용법 1. VisualSVN Server 다운로드 Download Link https://www.visualsvn.com/server/download/ 이 글에서 VisualSVN Server의 Version은 5.3.2를 사용하며, 64bit로 설치하였다. 각 Windows 환경에 맞는 파일을 다운로드하면 된다. 2. 설치 3. Repository 생성 a. VisualSVN Server Manager 실행 b. Repositories 우클릭 - Create New Repository 클릭 c. Repository type 선택 Regular FSFS repository 표준 Subversion Reposit..
[Reversing.kr] Easy_Crackme
[Reversing.kr] Easy_Crackme
2024.03.10문제 설명 파일 실행 시 사용자가 입력할 수 있는 창이 출력된다. 임의의 값을 입력 시, 부정확한 패스워드라는 문구가 출력된다. 출제자가 정해놓은 패스워드를 맞춰보자. 사용 툴 파일 정보 확인 ExeinfoPE 비밀 번호 분석 X64 dbg 분석 1. 파일정보 확인 확인되는 패킹은 없고, 언어는 C++로 제작되었으며, 32bit라는 정보를 알 수 있다. 2. 분석 내용 처음 attach를 시키면 상단바에 모듈이 ntdll.dll로 되어있는데, easy_crackme.exe로 변경한다. (보기-Modules) 찾는 방법에는 빠르게 문자열참조를 찾는 방법과 위에서부터 호출순서를 확인해 보는 방법이 있는데, 결과적으론 동일하므로 호출을 따라가 본다. 맨 위를 보면 DialogBoxParamA를 호출함을 알 수..
[Unity] Unity Hub 라이선스 활성화 오류
[Unity] Unity Hub 라이선스 활성화 오류
2023.03.11유니티 허브에서 프로젝트를 켜려는데 무한로딩이 발생하며 실행되지 않는 오류가 있었다. 이유를 찾다 라이선스를 확인해 보니 분명 정상적으로 들어가 있던 유니티 라이선스가 비활성화되어 있었다. 해결 방법 해결 방법으로는 총 2가지를 찾았으며, 다음과 같다. 서버 연결과 관련된 이슈로 네트워크 연결 확인 Unity_lic.ulf 파일 삭제 (경로: C:\ProgramData\Unity) 서버 연결과 관련된 이슈 네트워크 연결을 확인한다. 네트워크 연결이 정상적이라면 탭을 확인한다. 라이선스칸에 "라이선스를 새로고침 할 수 없습니다. 다시 시도하세요."라는 문구가 있었으며, 다시 시도를 해서 연결을 확인해 보면 된다. 하지만 이 방법으로 문제해결이 되지 않고 서버 연결 실패나 fail to write licen..
[Effective Modern C++] 42. 삽입 대신 생성 삽입을 고려하라
[Effective Modern C++] 42. 삽입 대신 생성 삽입을 고려하라
2022.10.23생성 삽입 함수들은 삽입 함수들이 하는 모든 일을 할 수 있다. 게다가 좀 더 효율적으로 수행될 수 있는 경우가 있으며, 적어도 이론적으로는, 덜 효율적으로 수행되는 경우는 결코 없다. std::vector vs; vs.push_back("xyzzy"); // 해석 ver vs.push_back(std::string("xyzzy")); // emplace_back은 완벽 전달을 이용하므로 문자열 리터럴이 vector안의 string생성자에게 그대로 전달된다. // 임시 객체의 생성과 소멸 비용이 들지않음 vs.emplace_back("xyzzy"); 생성삽입이 삽입의 성능을 능가하는 경우 1. 추가할 값이 컨테이너에 대입되는 것이 아니라 컨테이너 안에서 생성된다. 위의 예시에서 첫 코드 블럭의 "xyzz..
[Effective Modern C++] 41. 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라
[Effective Modern C++] 41. 이동이 저렴하고 항상 복사되는 복사 가능 매개변수에 대해서는 값 전달을 고려하라
2022.10.23매개변수 전달 방법을 3가지로 나누어 성능을 비교해보자. // 오버로딩 class Widget { public: void addName(const std::string& newName) { names.push_back(newName); } void addName(std::string&& newName) { names.push_back(std::move(newName); } ... private: std::vector names; }; // 보편 참조 class Widget { public: template void addName(T&& newName) { names.push_back(std::forward(newName)); } ... }; // 값 전달 class Widget { public: void..
[Effective Modern C++] 40. 동시성에는 std::atomic을 사용하고, volatile은 특별한 메모리에 사용하라
[Effective Modern C++] 40. 동시성에는 std::atomic을 사용하고, volatile은 특별한 메모리에 사용하라
2022.10.23atomic과 volatile의 차이점에 대해 알아보자. atomic vs volatile std::atomic은 뮤텍스 보호 없이 여러 스레드가 접근하는 데이터를 위한 것으로, 동시적 소프트웨어의 작성을 위한 도구이다. 보통 뮤텍스보다 더 효율적인 기계어 명령들로 구현된다. 아래의 예시를 보자. std::atomic ai(0); // ai를 0으로 초기화 ai = 10; // 원자적으로 ai를 10으로 설정 std::cout
[Effective Modern C++] 39. 일회성(one-shot) 사건 통신에는 void future 객체를 고려하라
[Effective Modern C++] 39. 일회성(one-shot) 사건 통신에는 void future 객체를 고려하라
2022.10.23조건변수 기반 설계 스레드 간 통신을 수행할 때, 조건 변수(condition variable, 줄여서 condvar)를 사용하는 경우가 많다. 조건을 검출하는 과제를 검출 과제(detecting task)라고 부르고, 그 조건에 반응하는 과제를 반응 과제(reacting task)라고 부르도록 한다. 예시를 보자. std::condition_variable cv; // 조건변수 std::mutex m; // cv와 함께 사용할 뮤텍스 // 사건 검출 ... // 반응해야 하는 과제에게 알림. 반응 task가 여러개라면 notify_all을 사용하면 됨 cv.notify_one(); // 반응 task 개념 접근방식 ... { // 임계 영역을 열고, 뮤텍스를 잠근다 std::unique_lock lk(..
[Effective Modern C++] 38. 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라
[Effective Modern C++] 38. 스레드 핸들 소멸자들의 다양한 행동 방식을 주의하라
2022.10.23합류 가능한 스레드는 바탕 시스템의 실행 스레드에 대응된다. 스레드와 비슷한 async의 future 객체도 시스템 스레드에 대응된다. 따라서 std::thread 객체와 future객체 모두 시스템 스레드에 대한 핸들이라고 할 수 있다. 그리고 join가능 스레드를 파괴하면 프로그램이 종료된다.(항목 37 참고) 하지만 future객체의 소멸자는 어떨 때는 암묵적으로 join을 수행한 것과 같은 결과를 내고 어떨 때에는 암묵적으로 detach를 수행한 것과 같은 결과를 내지만, 프로그램이 종료되는 일은 없다. 우선, future객체는 피호출자가 결과를 호출자에게 전송하는 통신 채널의 한쪽 끝이라는 점을 주목해야 한다. 피호출자는 보통은 std::promise객체를 통해서 자신의 계산 결과를 그 통신 채..
[Effective Modern C++] 23. std::move와 std::forward를 숙지하라
[Effective Modern C++] 23. std::move와 std::forward를 숙지하라
2022.09.24std::move와 std::forward는 그냥 캐스팅을 수행하는 함수 템플릿이다. std::move 함수의 이름만 보면 std::move가 이동을 수행해 줄 것처럼 보이지만 위에서 말했던 것처럼 사실 타입 캐스팅이 전부이다. 그런데도 이 함수의 이름이 move인 이유는 rvalue로 캐스팅을 하기 때문이고, 아래의 코드는 std::move를 구현한 코드이다. // C++11 template typename remove_reference::type&& move(T&& param) { using ReturnType = typename remove_reference::type&&; return static_cast(param); } // C++14 더 단순해진 move구현 template decltype(..
[Effective Modern C++] 22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라
[Effective Modern C++] 22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라
2022.09.18Pimpl이란 pointer to implementation을 의미한다. // 기존 class Widget { public: Widget(); ... private: std::string name; std:;vector data; Gadget g1, g2, g3; }; // Pimpl class Widget { public: Widget(); ~Widget(); ... private: struct Impl; Impl *pImpl; }; Pimpl 적용 코드를 보면 string, vector, Gadget을 선언하고 있지 않아 #include 할 필요가 없어져 컴파일 속도가 빨라지게 되었다. 이렇게 선언만 하고 정의를 하지 않는 형식을 불완전한 형식이라고 하며, 구현부에 작성하면 된다. #include "..