라벨이 개발인 게시물 표시

[bat] bat 파일 실행 시 관리자 권한으로 실행하도록 요구하는 샘플 코드

@echo off bcdedit >>nul if %errorlevel% == 1 ( echo ▶ 관리자 권한이 아닙니다. echo ▶ 파일을 우클릭하여 관리자 권한으로 실행하십시오. pause exit ) else ( @echo off :: 관리자 권한으로 실행 되었을 경우 실행 될 코드 여기에 작성. pause exit )

블로그 편집 시 자주 사용하는 html 태그 모음

출력 문자 HTML 코드 < &lt; > &gt; (Tab) <span style="white-space: pre;"> </span>

[C++] string 자료형 대문자, 소문자 변환

https://github.com/MoongStory/StringTool tolower, toupper 기능 참고.

특정 경로의 명령 프롬프트 창 바로 열기

이미지
일반적으로 컴퓨터를 사용하면 별로 쓸일이 그렇게 많지 않지만... 명령 프롬프트 창을 자주 사용하는 불쌍한 직업을 가진 분들에게 이 포스트를 바칩니다. 실행 창에서 "cmd"를 입력하여 명령 프롬프트 창을 열게되면 아래와 같이 윈도우가 설치된 드라이브 아래에 사용자 - 사용자 명이 기본 경로로 하여 창이 열리게 된다. 하지만 위의 경로에서 작업을 하는 일은 거의 없고 대부분 cd 명령어를 이용하여 작업할 곳의 경로로 이동해줘야 한다. 두세번만 이동하면 될 경우엔 그나마 낫지만 작업할 위치가 다른 드라이브이거나 깊다면 매번 cd 명령어로 이동하는건 엄청나게 귀찮다. 이런 경우엔 왼쪽 Shift 키를 누른 상태에서 마우스 우클릭을 하면 된다. 아래의 이미지는 그냥 우클릭한 경우 아래 이미지는 왼쪽 Shift 키를 누른 상태에서 우 클릭한 경우, 빨간 네모로 표시해 놓은 것처럼 "여기서 명령 창 열기" 항목이 추가되었다. 해당 항목을 선택하면 아래 이미지와 같이 현재 경로로 하여 명령 프롬프트 창이 열린다.

Microsoft Windows에서의 system32폴더와 syswow64폴더

64비트 윈도우즈에서 GetSystemDirectory 함수를 호출하면 어떤 결과가 나올까. 만약 32비트 프로세스에서 실행을 한다면 c:\windows\system32 가 나오게 된다. 그리고, 64비트 프로세스에서도 마찬가지로 c:\windows\system32 가 나오게 된다. 하지만 이건 같은것이 아니다. 32비트 프로세스에서 c:\windows\system32 폴더에 뭔가를 쓰게 되면 실질적으로는 c:\windows\syswow64 폴더에 써지게 된다. 즉, 내부적으로 저렇게 리다이렉트가 되는 것이다. 경로를 코드상에 c:\windows\system32 로 하드코딩한 경우도 있을 것이고 GetSystemDirectory 같은 함수로 구했을 수도 있을 것이다. 두 경우 다 보이기에는 c:\windows\system32 로 보이지만, 운영체제 내부적으로 syswow64 폴더로 리다이렉트를 해주게 된다. 이렇게 64비트 운영체제에서 32비트 프로세스가 호환되도록 해놓은 것이다. 64비트 프로세스에서는 c:\windows\system32 가 코드상으로나 물리적으로나 시스템 폴더가 된다. 용어상으로는 32비트 프로세스는 system32, 64비트 프로세스는 syswow64 일거 같으나, 위와 같이 전혀 그렇지가 않은 것이다. SysWow64 폴더는 32비트 프로세스를 위한 폴더인 것이다. 간단한 테스트로, 탐색기로 c:\windows\system32에 있는 cmd.exe 와 c:\windows\syswow64 에 있는 cmd.exe 를 실행시킨다. 작업 관리자로 보면 system32에 있는 cmd.exe는 64비트로 실행되고 있고, syswow64에 있는 cmd.exe는 32비트로 실행된다. syswow64에 있는 cmd.exe 에서 경로를 cd c:\windows\system32 로 옮겨 본다. 그런 후 그 폴더로 파일을 하나 복사해본다. 탐색기로 그 복사된 파일을 찾아보면 c:\windows\system32 폴더에는 없고...

코딩 습관

1. 함수(매서드) 내에서 return문을 여러 번 쓰는 것보다 가능하면 변수를 사용해서 리턴값을 저장했다가 마지막에 한 번만 사용하는 것이 좋다. int max(int a, int b) { int result = 0; if(a > b) { result = a; } else { result = b; } return result; } 2. 객체지향 코드를 작성할 시 인스턴스 변수를 사용하지 않는 함수(메서드)가 있을 경우 static을 붙이는 것을 고려한다. static을 안 붙인 메서드(인스턴스 메서드)는 실행 시 호출되어야 할 메서드를 찾는 과정이 추가적으로 필요하기 때문에 시간이 더 걸린다. 3. 하나의 함수는 특수한 경우가 아니면 하나의 기능만 하도록 한다. 4. 주석은 필수다. 5. 단순하고 보기 쉬울수록 좋은 코드다. 6. 상수 값들은 따로 한군데에 모아서 관리하는게 편하다. 버튼에 들어가는 텍스트라던지... 아니면 나중에 일일이 화면마다 찾아서 수정해줘야 함 7. 내 생각이 맞다는 생각은 하지 말아라. 항상 틀릴수도 있다고 생각하라. 내가 틀리고 남이 맞을수도 있다. 8. 배우는걸 창피해하지 말아라. 초등학생 아니 유치원생한테도 배울게 있다면 배워라. 9. 빈번한 함수 호출은 속도 저하를 가져온다. 10. 되도록이면 실수형을 사용하지 마라. 마찬가지로 속도 저하를 가져온다. 11. 반복문 내를 최대한 간단하게 하라. 12. 재귀 호출은 사용하지 마라. 13. 불가피한 경우가 아니라면 표준 라이브러리를 사용하자. 14. 비슷한 이름(변수명)들을 함께 쓰는 일은 피할 것. 15. 이름(변수명) 짓는 방식은 일관성을 유지하자. 16. 이름(변수명)을 선택할 때는, 구현에 신경 쓰지 말고 의미에 각별히 신경 쓸 것. 17...

함수 주석 양식

/******************************************************************************** * 간단한 설명 : * 매개변수로 넘겨준 사이즈만큼의 별로 된 나비 넥타이 모양을 그려줌 * 파라미터 : * int size - 그려줄 나비 넥타이의 크기, 3이상의 홀수 * 리턴 값(int) : * 0 - 정상 종료 * 추가 설명 : * 함수 구현 제한 조건 - 두개의 반복문과 하나의 조건문 * 사용 예 : * Drow_NAVI(7); * 만든 사람 : * Moong * 만든 날짜 : * 2023년 01월 26일 15시 50분 * 최종 수정한 사람 : * Moong * 최종 수정 날짜 : * 2023년 01월 26일 15시 50분 * 참고 : * 서적 또는 블로그 주소 등등 *********************************************************************************/ int Drow_NAVI(int size) { int height = 0, width = 0; int head = 0, tail = 0; int i = 0, j = 0; height = size;  //줄수 = 5줄, 리본의 크기, 홀수만 입력 width = height;  //칸수 = 5칸 head = 1; tail = width - 2; system("cls"); for (i = 0; i < height; i++) // 줄 { for (j = 0; j < width; j++) // 칸 { (i != (height / 2) && ((j >= head && j <= tail) || (j >= tail + 2 && j <= head - 2))) ? printf(" ") : printf("*"); } head++; // 그 다음 ...

C++ 창시자의 조언

인터넷에 떠돌아다니는 글을 가져온건데 실제 비야네 스트롭스트룹(Bjarne Stroustrup)이 쓴 글인지는 모르겠음. C++ 창시자의 조언 1 1. 프로그래밍이란 어떤 문제에 대한 해결책 안에 여러분의 아이디어를 구체적으로 표현한 문장을 써 넣는 것이다. 프로그램의 구조는 이런 아이디어를 최대한 직접적으로 드러내도록 하자. a. 별도의 아이디어로 생각되는 '것'은 클래스로 만든다. b. 별도의 개체(entity)로 생각되는 '것'은 클래스의 객체로 만든다. c. 공통의 인터페이스를 가지면, 이 인터페이스는 추상 클래스로 만든다. d. 두 클래스의 구현 코드가 주요 부분에서 똑같으면, 공통된 부분을 뽑아 기본 클래스로 만든다. e. 객체의 컨테이너가 될 클래스는 템플릿으로 만든다. f. 컨테이너에 대한 알고리즘을 구현하는 함수는 동일 계열의 컨테이너군에 모두 적용할 수 있는 알고리즘을 구현하는 템플릿 함수로 만든다. g. 어떤 클래스, 템플릿이 서로 논리적으로 가까운 관계를 가지고 있으면 이런 것들은 공통의 네임스페이스에 넣는다. 2. 배열이나 복소수처럼 수학적 의미를 가진 개체를 구현하지 않은 클래스를 정의하거나 연결 리스트 같은 하위 수준 타입을 정의하는 경우에는 다음을 따른다. a. 전역 데이터를 사용하지 않는다(멤버를 사용한다). b. 전역 함수를 사용하지 않는다.  c. public 멤버 데이터를 사용하지 않는다.  d. 프렌드를 사용하지 않는다. 단, a와 c를 피하기 위한 경우는 예외이다. e. 클래스에는 '타입필드'를 넣지 않는다. 대신에 가상함수를 사용한다. f. 인라인 함수를 사용하지 않는다. 단, 무시할 수 없는 최적화가 필요한 상황에서는 예외이다. C++ 창시자의 조언 2 1. 어떤 문제에도 당황하지 말자! 시간이 약이다. 생각하고 생각하면 풀린다. 2. 훌륭한 프로그램을 만들기 위해 C...

질문하는 법

서론 누구나 프로그래밍을 하다보면, 모르거나 막히는 부분이 생깁니다. 문제를 어떻게 해결 할 것인가는 수많은 방법이 존재하겠지만, 그 방법조차 모를경우 우리는 타인에게 도움을 요청합니다. 다행히도 프로그래머에게 허용된 몇 안되는 커뮤니티가 아직 존재하기에 우리는 익명의 누군가에게 도움을 요청하고 그 해답을 얻을 수 있는 기회를 얻게 된겁니다. 다만, 질문의 방법을 몰라 제대로 된 답변을 얻지 못하거나 무시당하는 경우가 비일비재 하여 몇가지 적어볼까 합니다. 다음 항목들을 가능한 지켜준다면 누군가의 마음을 움직여 좋은 답을 얻을 수 있지 않을까요? (본문에 사용된 예시는 게임코디 연구소 질답란에서 발췌, 가공했습니다) 명심할 것 - 질문하는 상대는 선배입니다. 가끔, 반말이나 통신체등으로 질문하는걸 보는 경우가 있는데, 이것은 예의에 어긋나는 행동입니다. 친근함을 표현하고 싶을지 모르겠지만 보는 사람에겐 기분나쁜 태도가 될 수도 있는겁니다. - 대답하는 사람이 시간이 남아돌아서 대답해주는게 아닙니다. 질문하기 전에 내가 충분히 노력했는지에 대해 다시 생각해보세요. 답변자의 시간의 가치는 상상을 초월하는 가격입니다. - 답변자는 돈을 받고 답변해주는게 아닙니다. 숙제 해결을 묻거나 코드 분석을 의뢰하지 마세요. 제목 짓기 - 질문에 관련된 제목을 적으세요. 간혹, '도와주세요', '살려주세요' 등의 제목을 보는데, 이런건 119게시판에 적으세요. 답변자가 클릭해서 본문을 읽는 시간조차 상당한 값어치를 한다는 점을 명심하세요. 제목은 짧되 한눈에 무엇에 관한 내용인지에 대해 적어야 합니다. - 답변자가 흥미를 느낄 수 있게끔 적으세요. 답변자가 답변을 적는 경우는 '그 항목에 정통했을때' 와 '그 항목에 관심이 있을 때' 입니다. 제목이 모호...

Path(경로) 네이밍

어디 규칙이나 관습 같은게 아니고 변수명 지을 때마다 헛갈려서 내 맘대로 정의한 것임 FilePath (or Path) - C:\Dir\fileName.dll FileDir (or FileDirectory or Directory) - C:\Dir FolderName (or Folder) - Dir FileName (or Name) - fileName.dll FileExtension (or Extension) - dll

인증서(certmgr.msc)의 실제 저장 위치 (공인인증서 아님)

%UserProfile%\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates 인증서 더블 클릭했을 때 "자세히" 탭에서 "필드" 값 지문(Default인 경우 맨 아래에 있음)의 값이 위 경로의 파일명과 일치.

명령 프롬프트 명령어 모음 (Command-line reference A-Z)

https://technet.microsoft.com/en-us/library/bb490890.aspx

헝가리언 표기법

출처 - 한눈에 보이는 C프로그래밍 (무작정 따라하기) 헝가리언 표기법의 큰 특징 1. 변수의 대,소문자를 구분하여 표현한다. 2. 특별한 접두어를 사용해서 표현한다. ex) int A ge; int G rade O f K orean; char f C hecked; 헝가리언 표기법에서 자주 사용되는 접두어 접두어 설명 사용 예 f 플래그를 정의할 때 주로 사용 됨. char fChecked; c 카운터의 의미를 갖는 변수를 정의할 때 사용 됨. int cPerson; l long형 자료형을 갖는 변수를 정의할 때 사용 됨. long lMaxPerson; p 포인터를 정의할 때 사용 됨. char *pBuf; u unsigned int형을 정의할 때 사용 됨. unsigned int uNumber; w word형 변수를 정의할 때 사용 됨. (단, word형 변수는 unsigned short를 의미) unsigned short wData; dw double word형 변수를 정의할 때 사용 됨. (단, double word형 변수는 unsigned short를 의미) unsigned long dwData; str 문자열 변수를 정의할 때 사용 됨. char *strName

닷넷(.Net Framework) 완전 삭제 프로그램

https://blogs.msdn.microsoft.com/astebner/2008/08/28/net-framework-cleanup-tool-users-guide/

디지털 서명(코드 사인) 제거 프로그램

명령 프롬프트 창에서 첨부되어 있는 프로그램 뒤에 인자 값으로 서명을 제거할 파일 명을 넘겨주면 된다. deleteCertificate.exe 다운로드 ex) "deleteCertificate.exe testFile.exe"

커널 드라이버 전자 서명 (디지털 서명, 코드 사인)

이미지
드라이버 포함 dll 같은 파일들을 서명하기 위한 방법임. 웹에서 사용되는 SSL 서명과는 다른 것이니 참고 바람. 일단 결론부터 말하자면 서명에 필요한 것은 3가지임. 1. 인증서 (구매 필요.) 2. Root CA 인증서 (구매처에서 제공함. 구매하지 않아도 다운로드 가능.) 3. Microsoft 교차 인증서. 일단 인증서는 SHA1 방식과 SHA2(SHA256) 방식이 있는데 SHA2 방식은 EV(Extended Validation) 인증서라고도 함. Windows 10의 경우, Windows 10이 처음 발표된 2015년 7월 29일로부터 90일이 경과한 후부터는 기존에 발급받은 SHA1 인증서와 EV 인증서로 서명된 파일들만 인정해 준다고 함. 2016년 이후로는 SHA1 인증서로 서명한 파일은 아예 인식이 안될거라고 들었는데 이미 발급 받아놓은 SHA1 인증서로 서명해도 잘 됨. 그리고 인증서 발급 기관에서 더 이상 SHA1 인증서를 발급하지 않는 것으로 알고 있음. (맞나? 정확하지 않음.) 따라서 설명은 SHA2 기반으로 함. 그리고 내가 사용중인 인증서가 Symantec에서 구입한 인증서 이므로 Symantec이 기준임. (다른 인증 기관은 설명해주고 싶어도 제가 몰라서... 아마 대동소이하지 않을까 생각됨.) 1. 인증서 (구매 필요) 일단 인증서를 구매해야 함. 어떻게 꼼수로 할 수 있는 방법이 내가 알기로는 전혀 없음. 테스트 서명을 해서 하는 방법이 있긴 하나 PC를 테스트 서명한 파일을 사용할 수 있도록 설정을 해줘야 함. 인증서 가격은 Symantec 기준으로 1년 $499, 2년 $873, 3년 $1248임. (1년 기준으로 2년짜리를 사면 $100, 3년짜리는 $200 달러를 절약할 수 있음) 돈도 돈이거니와(어차피 회사 돈이니...) 어차피 인증서 만료기간이 지나면 또 구매해야 하므로, 처음부터 3년짜리를 사는게 정신건강에 좋음. EV 인증서(SHA2)는 토...

inf 파일 양식

;------------------------------------------------------------------------- ; Null Driver x86 and x64 package ; Copyright (c) Microsoft Corporation. All rights reserved. ;------------------------------------------------------------------------- [Version] Signature="$Windows NT$" Class=SomeDeviceClass ClassGuid={ClassGuid} Provider=%ProviderName% CatalogFile=Driver.cat DriverVer=05/14/2015,1.0.0.0 [Manufacturer] %ProviderName%=ProviderName,NTX86,NTamd64 [ProviderName.NTx86] %CardDeviceName%=NODRV,myfakeID [ProviderName.NTamd64] %CardDeviceName%=NODRV,myfakeID [NODRV] [NODRV.NT.Services] AddService = ,2 [NODRV.NTx86.Services] AddService = ,2 [NODRV.NTAMD64.Services] AddService = ,2 ; =================== Generic ================================== [Strings] ProviderName ="Microsoft" CardDeviceName="Some Device" NULL.DeviceDesc = "Null Device"

HTTPS 통신에 필요한 Root 인증서와 Server 인증서 만들기

SAN 인증서에 대한 내용은 아래 링크 참고. 참고 - http://www.solanara.net/solanara/openssl#head_openssl_certs_san 인증서에 추가적인 subject 를 넣고 싶을때 SAN 필드를 사용한다. 웹 서버용 인증서에서 SAN을 사용하는 경우는 보통 DNS 이름을 여러개 주기 위함이다. CN에는 2개 이상의 DNS 이름을 넣을 수 없기 때문이다. CN 필드만 검사하는 구형 브라우저에서는 사용할 수 없는 기능이지만, 2016년 현재 출시 된 모든 상용 브라우저에서 사용 가능하다. 또한 Chrome 58 부터 https 인증서에 SAN 항목이 없으면, (net::ERR_CERT_COMMON_NAME_INVALID)오류가 발생하면서 접속되지 않는다. (Deprecations and Removals in Chrome 58) Firefox 48 부터도 신형 인증서에 한해 SAN 항목이 필수이다. (don't fall back to subject common name for name information for new certificates) ※ 먼저 작업을 위해서는 openssl.exe이 필요하다. 1. cnf 파일 생성 아래 빨간색 글씨로 적어놓은 부분을 그대로 복사하여 cnf 파일을 생성하면 된다. 파일명은 마음대로 하면 되고 확장자만 cnf로 하면 됨. ex) cert.cnf (아래 예제에서 cert.cnf로 사용) (초록 글씨로 표시 된 부분은 맞춰서 수정 필요.) [req] distinguished_name = req_distinguished_name req_extensions = v3_req [req_distinguished_name] countryName = Country Name (2 letter code) countryName_default = KR countryName_min     = 2 countryName_m...

Windows Version Info (윈도우 버전 정보, OSVERSIONINFOEX)

 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx

정규 표현식(regular expression) 구성 요소

출처 - WRITING SECURE CODE (안전한 코드 작성 기술) ^ 문자열의 시작에서 일치하는지 검사한다. $ 문자열의 종료에서 일치하는 검사한다. * {0,}과 동일하며, 앞 패턴과 0번 혹은 그 이상 일치하는지 검사한다. + {1,}과 동일하며, 앞 패턴과 1번 혹은 그 이상 일치하는지 검사한다. ? {0, 1}과 동일하며, 앞 패턴과 0번 혹은 1번 일치하는지 검사한다. {n} 앞 패턴이 정확히 n번인지를 검사한다. {n,} 앞 패턴이 n번 혹은 그 이상인지를 검사한다. {,m} 앞 패턴이 m번 이하인지를 검사한다. {n,m} 앞 패턴이 n번에서 m번인지를 검사한다. . \n 문자를 제외한 한 문자가 일치하는지 검사한다. (pattern) 패턴(pattern)과 일치하는지 검사하여 그 결과 데이터를 변수에 저장한다. 결과를 저장하는 변수는 프로그래밍 언어에 따라 다르다. 패턴 그룹, 예를 들면, (xx)+는 괄호내의 패턴이 1번 이상 있는지를 검사한다. 만약 비-저장을 원하면 (?:xx)로 적어 주면 일반식 엔진은 데이터를 저장하지 않는다. aa|bb aa 혹은 b와 일치하는지 검사한다. [abc] 사각 괄호내에 표시된 문자 중 한 문자(a, b, c)라도 일치하는지 검사한다. [^abc] 사각 괄호내에 표시된 문자 중 모든 문자(a, b, c)가 없는지 검사한다. [a-z] a부터 z까지 범주에 있ㄴ느 문자가 포함되어 있는지 검색한다. \ 이스케이프 문자. \n과 \/은 특수 문자이고, \1과 같이 \d로 표시되면 앞에서 찾은 데이터를 참조하는 데 사용된다. \b 단어와 스페이스간의 위치가 일치하는지 검사한다. 예를 들면 "er\b"는 "never"에서는 "er"이 일치한다고 찾지만, "verb"에서는 일치하지 않는다고 리턴한다. \B 해당 위치에서 단어를 끊어낸다. 예를 들면, "ea*r\B"는 "never early"에서 "ea...