2017. 12. 13. 16:46

폴더를 복사할 때 암호화가 되어서 복사가 안 되는 경우가 있다


이럴 때에 폴더에 복사된 암호화를 풀어서 복사하면 된다


암호화가 걸린 폴더는 폴더명이 녹색이다



폴더 - 마우스 우클릭 - 속성 - 일반 - 고급 - 고급 특성 


- 데이터 보호를 위해 내용을 암호화 해제 - 확인 - 적용 - 확인



이렇게 누르면 된다




갑자기 사진이 안 되네

2017. 12. 5. 00:21

* 식별자


 - 자바스크립트에서 이름을 붙일 때 사용하는 단어


 - 변수명과 함수명


 - 식별자를 만들 때는 다음 규칙을 반드시 지켜야 함


1. 키워드를 사용하면 안 된다


2. 숫자로 시작하면 안 된다


3. 특수 문자는 _ 과 $ 만 허용한다


4. 공백 문자를 포함할 수 없다


이 네 가지 규칙만 만족한다면 모든 단어를 식별자로 사용할 수 있음


alpha

alpha10

_alpha

$alpha

Alpha

ALPHA



반면에 키워드나 숫자로 시작하거나 공백 문자가 있으면 안 됨


break

273alpha

has space



식별자로 한글이나 한자, 일본어 같은 언어를 사용할 수 있으나 대부분 알파벳



* 자바스크립트 개발자가 지키는 관례


1. 생성자 함수의 이름은 항상 대문자로 시작


2. 변수, 인스턴스, 함수, 메서드의 이름은 항상 소문자로 시작


3. 여러 단어로 이루어진 식별자는 각 단어의 첫 글자를 대문자로 시작




자바스크립트의 식별자는 크게 4 종류


 구분

단독으로 사용 

다른 식별자와 함께 사용 

 식별자 뒤에 괄호 없음

변수 

속성 

 식별자 뒤에 괄호 있음

함수 

메서드 







2017. 12. 5. 00:14

* 키워드



- 처음 만들어질 때 정해진 특별한 의미가 있는 단어




break 

 else

instanceof 

true 

 case

false 

new 

try 

 catch

finally

null 

typeof 

 continue

for 

return 

var 

 default

function 

switch 

void 

 delete

if 

this 

while 

 do

in 

throw 

with 


2017. 12. 4. 23:59

자바스크립트를 본격적으로 공부하기 전에 용어 정리


* 표현식


- 값을 만들어내는 간단한 코드


예를 들면


* 273

* 10 + 20 + 30 * 2

* 'RintIanTta'



* 문장


하나 이상의 표현식이 모여 문장이 됨


마침표를 찍듯이 문장의 끝에는 세미콜론을 찍어 문장의 종결을 알림


사실 자바스크립트는 문장 끝에 세미콜론을 입력하지 않아도 줄바꿈만 하면 프로그램 실행에 문제가 없음


하지만, 대부분의 프로그래밍 언어가 문장 끝에 세미 콜론을 입력하므로 자바스크립트도 관례상 입력하는 것 뿐임



* 10 + 20 + 30 * 2;


* var rintiantta = 'Rint' + 'Ian' + 'Tta';


* alert('Hello JavaScript..!');


* 273;


하나의 표현식도 세미콜론만 찍히면 문장이라고 부름


이러한 문장이 모여서 프로그램을 이룸






2017. 11. 9. 19:32

이름을 잘 짓는 간단한 규칙


1. 의도를 분명히 밝혀라


- 좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 많다


- 변수나 함수 그리고 클래스 이름은 다음과 같은 질문에 모두 대답 가능


1. 존재 이유

2. 수행 기능

3. 사용 방법


- 따로 주석이 필요하다면 의도를 분명히 드러내지 못함


int d; // 경과 시간(단위 : 날짜)


이름 d는 아무 의미도 드러나지 않는다


- 측정하려는 값과 단위를 표현하는 이름이 필요하다


int elapsedTimeInDays;


int daysSinceCreation;


int daysSinceModification;


int fileAgeInDays;


의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다



다음 코드는 무엇을 할까?


public vector<int*> getThem() {

    vector<int*> list1;

    for(auto x : theList)

        if(x[0] == 4)

            list1.push_back(x);

    return list1;

}


코드가 하는 일을 짐작하기 어렵다


왜일까? 복잡한 문장은 없다


공백과 들여쓰기도 적당하다


변수는 세 개, 상수는 두 개 뿐이다


화려한 클래스나 다형성 메서드도 없다


단지 배열 목록만 사용한다


문제는 코드의 단순성이 아니라 코드의 함축성이다


다시 말해 코드 맥랙이 코드 자체에 명시적으로 드러나지 않는다


위 코드는 암암리에 독자가 다음과 같은 정보를 안다고 가정한다


1. theList에 무엇이 들어있는가?


2. theList에서 0번째 값이 어째서 중요한가?


3. 값 4는 무슨 의미인가?


4. 함수가 반환하는 리스트 list1을 어떻게 사용하는가?



위 코드 샘플엔 이와 같은 정보가 드러나지 않는다


하지만 정보 제공은 충분히 가능했었다


지뢰찾기 게임을 만든다고 가정하자


그러면 theList가 게임판이라는 사실을 안다


theList를 gameBoard로 바꿔보자


게임판에서 각 칸은 단순 배열로 표현한다


배열에서 0 번째 값은 칸 상태를 뜻한다


값 4는 깃발이 꽂힌 상태를 가리킨다


각 개념에 이름만 붙여도 코드가 상당히 나아진다



public vector<int*> getFlaggedCells( ) {

    vector<int*> flaggedCells;

     for(auto cell : gameBoard)

        if(cell[STATUS_VALUE] == FLAGGED)

            flaggedCells.push_back(cell);

    return flaggedCells;

}



연산자 수와 상수 수는 똑같다


그런데도 코드는 더욱 명확해졌다


한 걸음 나아가 int 배열을 사용하는 대신, 칸을 간단한 클래스로 만든다


isFlagged라는 좀 더 명시적인 함수를 사용해 FLAGGED라는 상수를 감춰도 된다



public vector<Cell> getFlaggedCells( ) {

    vector<Cell> flaggedCells;

     for(auto cell : gameBoard)

        if(cell.isFlagged( ))

            flaggedCells.push_back(cell);

    return flaggedCells;

}


단순히 이름만 고쳤는데도 함수가 하는 일을 이해하기 쉬워졌다


이것이 좋은 이름이 주는 위력이다




2017. 10. 24. 13:05

https://www.codecademy.com/courses/python-advanced-ko/0/1?curriculum_id=53b5e0d8fed2a81590000003

2017. 9. 9. 06:47
2017. 9. 6. 00:13

USB를 꽂고 뺄 때 발생하는 이벤트를 처리하는 함수를 구현한다


WM_DEVICECHANGE 메시지를 재정의한다


메시지 맵에는 다음과 같은 함수가 추가된다


ON_WM_DEVICECHANGE()



다음과 같은 메시지 핸들러 내부를 처리한다


afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData)

{

if(7 == nEventType) // USB 넣고 뺄 때 nEventType이 7로 날라옴

CreateDriveButtons();


return TRUE;


}

2017. 9. 5. 23:56

ON_CONTROL_RANGE 매크로를 이용하여 여러 개의 범위를 처리한다


1. 이벤트가 발생하면 메시지를 처리한다고 결정한다

EX) 버튼이 눌렸을 때 - BN_CLICKED



2. 메시지 핸들러를 등록한다


afx_msg void OnDriveButtonClicked(UINT uID);



3. 처리 범위를 결정한다.



enum enDriveButtonID

{

_EN_ID_DRIVE_BASE_ = 2001,

};


static const size_t nMaxButtonCount(4);



4. ON_CONTROL_RANGE( ) 를 이용하여 범위를 등록한다



ON_CONTROL_RANGE(BN_CLICKED, // 발생 이벤트

  _EN_ID_DRIVE_BASE_, // 시작 ID

  _EN_ID_DRIVE_BASE_ + nMaxButtonCount, // 끝 ID

  OnDriveButtonClicked) // 메시지 처리 함수



5. 메시지 핸들러를 구현한다


void CDlg::OnDriveButtonClicked(UINT uID)

{

for(int nIndex(0); nIndex < nMaxButtonCount; ++nIndex)

{

if(uID == _EN_ID_DRIVE_BASE_ + nIndex)

{

m_strDrive = strFiles[nIndex];

if(m_bSearchMode)

m_editSearch.GetWindowTextW(m_strExtension);

break;

}

}


OnOK();

}

2017. 9. 1. 00:50

* IPC 기법 대신 사용하는 방법이다


이 방법을 Broadcase 통신이라고 하는데 

RegisterWindowMessage( ) API 를 이용한다


WPARAM, LPARAM을 이용하여 메시지 통신을 한다



사용 방법은 다음과 같다


* 보내는 프로세스


1. 메시지 등록


UINT nRegisterMessage = RegisterWindowMessage(_T("MyCommunication"));



2. PostMessage를 이용하여 데이터 전송


int nData = 2000;

PostMessage(HWND_BROADCAST, nRegisterMessage, (WPARAM)nData, 0);




* 받는 프로세스


1. 메시지 등록


UINT nRegisterMessage = RegisterWindowMessage(_T("MyCommunication"));



2. 메시지 핸들러 추가


ON_REGISTERED_MESSAGE(nRegisterMessage, &CTestDlg::OnMyHandler)



3. 메시지 처리를 할 함수 구현


LRESULT CTestDlg::OnMyHandler(WPARAM wParam, LPARAM lParam)

{

       int nData = (int)wParam;


       // 그 이외의 함수 처리

}



* 주의  - 최상위 부모에만 전달된다 따라서 자식 윈도우에 전달하고 싶으면 최상위 부모에서 전달해야 한다

2017. 8. 10. 16:17

* 코드 품질


- 함수 복잡도

- 함수 간 호출 관계

- 전역 변수 수

- 함수 및 모듈 수

- 사용되지 않는 변수 및 함수



* 아키텍처 품질


- 요구사항 및 설계 문서 상태

- 모듈 간 호출 관계

- 모듈화 상태

- 아키텍처 스타일

- 아키텍처와 모듈 재사용성



* 반복하지 않기




- 같은 코드가 중복된다면 수정도 여러번 해야 한다





* 한 가지만 하기


- 함수는 한가지를 해야 한다

- 그 한가지를 잘해야 한다

- 그 한가지만을 해야 한다





* 의미있게 이름 짓기



2017. 7. 26. 11:02

http://blogs.nvidia.co.kr/2017/07/17/dli-self-paced-lab/

2017. 7. 11. 16:17

코드 리뷰

프로그래밍/C++ 2017. 7. 11. 16:17

* 코드리뷰에 대한 오해


- 버그를 발견하는 것을 보장하진 않는다


- 코드의 결함을 찾는 것이 목적이 아니라, 서로 배우고 가르쳐 주고, 팀의 협업능력을 높여주는 것이어야 한다. (그렇지 않으면 팀이 깨어진다)



* 코드리뷰가 잘 되려면


- 너무 많은 절차와 규칙을 만들지 마라. 절차를 아주아주아주 간단하게 하라


- 강요하지 마라. 대신 Encourage 하라


- 모든 코드 commit 을 리뷰하도록 한다거나 하는 형태로 Micro - Manage 를 하지마라


- 개개인의 작업 흐름을 끊지마라


- 코드리뷰를 통해 발견한 것들을 널리 공유하라


- 코드리뷰를 늦게 하는것은 안하는 것보다 나쁠수 있다. Iteration 에 포함시켜라


- 한꺼번에 덜하기보다는 조금씩 자주하라


- 툴에 얽메이지 마라, 중요한것은 개발자들이 서로 대화를 하고 코드를 공유하는 것이다


- 너무 많은 리뷰어를 참여시키지 마라. 2-4 명이 적당하다




* 어떻게 잘 되고 있는지 알수 있는가


- 쉽진 않다, 사실 필요없을 수도/불가능 할수도 있다, metric 에 집착할 필요는 없다.


- 장기간의 이득은 측정할 수 없지만 많다


- Simple Metric 들이면 충분할 수 있다. (리뷰에 사용된 시간, 리뷰 comment 등). 

2017. 5. 22. 16:46

HyperText - 문서와 문서가 고리로 연결되어 있다

HTML 의 가장 중요한 특징은 HyperText 가 링크로 되어 있다는 것이다


하나의 링크를 거대한 덩어리로 만든 것을 웹이라고 한다

HTML의 본질은 웹의 본질


링크는 굉장히 중요한 것

여러 가지 일을 하기 때문에 지금은 굉장히 복잡함


2017. 3. 14. 17:26

C Runtime Library와 MFC Library의 import 순서가 바뀌어서 강제로 순서를 바꾸어 주어야 한다


프로젝트 속성 -> 링커 -> 입력 -> 특정 기본 라이브러리 무시 : 

uafxcwd.lib; libcmtd.lib 입력


프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성 : 

uafxcwd.lib; libcmtd.lib 입력