2017년 8월 15일 화요일

Windows 10에서 창 배경색(메모장 배경 색) 변경하기





윈도 10에서 메모장을 열면 백색의 강렬함이 눈을 자극한다. 몹시...
그런데 이걸 바꿀수 있는 기능이 이전 윈도우들에서는 제공이 되었으나 지금은 없는 듯 하다.
발전은 못할망정 이건 뭐...
하는 수 없이 윈도우의 레지스트리 변경을 통해 하는 수 밖에 없다.
근데 이건 조심하지 않으면 땀 나는 경우가 있다.
다음 순서로 진행한다

-. 윈도우 키 + R
-. regedit
-. HKEY_CURRENT_USER
-. Control Panel
-. Colors

우측에 여러 항목들이 나타난다. 이들 중에서 
Window라는 항목에 데이터 값이 255 255 255로 되어 있을 것이다.
이 값을 변경하면 윈도의 창 배경색이 바뀐다. 메모장, 아래아 한글...
255 255 255는 차례대로 Red Green Blue의 색상 값이다.

이 색상 값을 어떻게 변경할지를 참조할 사이트는

https://www.w3schools.com/colors/colors_picker.asp

이곳에서 색상의 값과 색상이 어떤 색인지를 확인해서 값을 변경하면 된다.
데이터 값 변경은 해당 항목(Window)에 마우스 우측 클릭 후 "수정" 메뉴 클릭해서 변경하면 된다.

그 다음 항목으로 Window Text 항목이 있는데 이 항목의 데이터 값은 0 0 0으로 되어 있을 것이다.
이것은 글자 색이 검정색임을 의미한다.

이후 PC를 재 부팅한다.

단 이상의 색상들을 변경함으로 인해 윈도우 다른 프로그램들에서 글자가 안 보이는 현상이 없도록 색상 조합을 잘 해줘야 한다.
미덥지 않으면 기존의 색상 값을 다른 곳에 잘 저장해 둘 필요도 있고 혹은 레지스트리 값을 백업해 둘 필요도 있다.

2017년 8월 8일 화요일

리눅스 터미널 창을 탭으로 열기





리눅스에서 터미널을 여러개 띄워놓고 작업을 할 경우 마우스로 드래그해 가면서 창의 크기를 조절해서 화면분할해 가면서 사용해야 하는 불편함이 있다.
이를 보다 간편하게 해결할수 있는 기능이 탭 기능이다.

Ctrl-Shift-T를 하면 현재의 터미널 상에서 새로운 탭(크롬과 같은 웹 브라우저에서 새 탭에서 웹 페이지 여는 것과 같은...)이 생기면서 새로운 터미널 창을 열수 있다.
이렇게 여러개의 탭으로 터미널을 열면 작업하기가 무지 편해 진다.



탭 간의 이동은
 -. Alt + 1/2/3... 으로 각 탭으로 이동하는 방식과
 -. Ctrl + PageUp/PageDown으로 각 탭으로 이동하는 방식이 있다.
위의 방식이 보다 쉬운 방식이리라...

현재 탭 닫기는
Ctrl + Shift + w


2017년 8월 3일 목요일

C++ 2차원 포인터(포인터의 포인터)를 이용한 2차원 배열 다루기





본 프로그램은 n명의 학생 각각이 m개의 과목을 수강할 경우에 대한 
2차원 배열을 선언하는 형태인데 학생 수가 고정되어 있지 않고 가변이고
각 학생의 수강 과목도 고정되어 있지 않고 각각 상이하다고 할 때의 
상황이다. 이때 가장 적합한 2차원 배열의 형태가 "2차원 포인터(포인터의 포인터)"
형태로 선언하는 것에 대한 예제 코드이다.

#include <iostream>
#include <malloc.h>

using namespace std;

void main()
{
//2차원 포인터는 2차원 배열의 형태를 갖는데 
//세로(행, row)도 가변적인 배열, 가로(열, column)도 가변의 크기를 갖는 배열이라는 뜻
int** score;
int studentNum = 0;
int lessonNum = 0;
int allTotalSize = 0;

cout << "학생 수 입력 : ";
cin >> studentNum;

//studentNum 갯수 만큼의 크기를 가진 배열이 선언되는데 이 배열의 각 원소가
//int형 포인터 변수이므로 각 원소가 또 동적 할당으로 임의 크기의 배열의 시작 주소를
//가리키게 되므로 결국 2차원 배열이 되는 것이다.
//즉 studentNum 갯수 만큼의 크기를 가진 int형 포인터 변수가 배열 형태로
//선언되고 그 시작 주소 값을 score에 저장한다.
//통상적으로 이렇게 생성되는 배열을 2차원 배열의 행(row, 가로)의 크기로 본다.
score = new int*[studentNum];
cout << "sizeof(score) : " << sizeof(score) << " byte" << endl;
cout << "_msize(score) : " << _msize(score) << " byte" << endl << endl;

//_msize()함수에 대해: new로 생성된 메모리는 heap 메모리 영역에 생성되고
//heap 메모리 영역은 운영체자가 관리해 주기 때문에 동적 할당된 메모리의 크기를
//알기 위해서는 운영체제의 도움이 필요하다.
//윈도우의 경우 _msize()함수를 통해 알수 있다.
//반면에 sizeof()함수는 포인터 변수 자체의 크기를 반환하는데 포인터 변수는 
    //항상 4byte로 동일하다
//아래의 코드는 score가 가리키는 동적 할당된 메모리 전체의 크기를 반환한다.
//score = new int*[studentNum]으로 할당되었기에 
//studentNum * 4(int형의 크기가 4byte이므로)의 크기를 가진다.
allTotalSize = _msize(score);

//studentNum 갯수 만큼의 배열 각 요소인 int형 포인터 변수 각각에 대해
//동적 메모리 할당을 통해 또 다시 배열을 만든다. 따라서 2차원 배열이 되는 것이다.
//통상적으로 이렇게 생성되는 배열을 2차원 배열의 열(column, 세로)의 크기로 본다.
for (int i = 0; i < studentNum; i++)
{
cout << (i+1) << "번 학생의 수강 과목 수 : ";
cin >> lessonNum;

score[i] = new int[lessonNum];
allTotalSize += _msize(score[i]);
cout << (i + 1) << "번째 배열의 크기 : " << _msize(score[i]) << " byte" 
                                                                                            << endl << endl;
}

cout << endl << "2차원 포인터 배열 전체의 크기 : " << allTotalSize << " byte" 
                                                                                            << endl;

//여기서 성적 입력 및 평균, 총점 처리...

//메모리 해제(동적 할당된 메모리는 사용후 반드 해재해 줘야함!)
for (int i = 0; i < studentNum; i++)
{
delete[] score[i];
//delete score[i]; //이 경우는 i번째 배열 전체가 아닌 그 배열의 시작 주소만 해제 함
}

delete[] score;

cout << endl << "동적 할당 메모리 해제 완료~" << endl;
}

실행 결과는 다음과 같다.