발생일: 2014.10.02 키워드: 목디스크, 자세, 경추, 어깨 결림 문제: 종종 목을 돌리기 어려울 정도로 결리고, 어깨가 심하게 뭉치는 경우가 있다. 바르지 못한 자세 때문에 그런 건 확실한데, 누구는 마사지해서 뭉친 근육을 풀라고 하고, 누구는 그냥 쉬는 게 낫다고 한다. 어떻게 하는 게 좋은 걸까? 그러던 중 페북에서 목 디스크에 대한 동영상을 발견했다- 내용이 좋고 주변에도 알려주고 싶어서 정리해뒀다. 해결책: 서울대 강남센터 재활의학과 정선근 교수 (2013년 4월 동영상) http://healthcare.snuh.org/hchealth/lecture/_/movedu/1258/view.do#.VCzbt8cazCS 담이 결렸다고 표현하는데, 어깨가 뭉치고 목이 아픈 것의 대부분은 목의 디스크..
발생일: 2014.03.01 키워드: backbone, 백본, extend, defaults 문제: extend와 defaults 를 어떻게 구분해 사용하면 좋을까 고민하던 중에, 최근 팀에서 사용 방법을 정의했다. 해결책: extend는 주로 프로토타입 확장에서 사용했었는데, var fooPrototype = { getName: function () {}, setName: function () {} }; var barPrototype = _.extend(fooPrototype, { getName: function () {} }); // 하지만 이렇게 하면 `fooPrototype`의 값도 덮어쓰게 된다. fooPrototype.getName === barPrototype.getName; //—> tru..
발생일: 2014.12.28 키워드: alfred, 알프레드, 터미널, termial, taking screen shot on terminal, 스크린샷, 캡처, capture 문제: 터미널에서 커맨드라인 명령으로 스크린 캡처 기능을 사용하려고 한다. 해결책: 아래 명령으로 실행할 수 있다! $ screencapture -ic 논의: 스크린 캡처 단축키는 늘 헷갈린다. 늘 `Cmd + Shift + 4, 5, 6`이 헷갈린다. 어떤 게 클립보드이고, 어떤 게 그냥 캡처이고, 어떤 게 풀스크린인지... 난 알프레드 앱을 엄청 즐겨 사용하고 있고, '스크린샷을 클립보드로 저장'하는 작업을 자주 하고 있어서, 아래 이미지처럼 워크플로우를 만들어 저장해뒀다. 엄청 편리하다! 참고: http://guides.ma..
이전 글: 9. 파일 입출력에서 계속 메모리의 구성 - 코드 영역: 실행할 프로그램의 코드가 저장되는 메모리 공간, CPU는 코드 영역에 저장된 명령문들을 하나씩 가져가서 실행한다. - 데이터 영역: 전역변수와 static으로 선언되는 static 변수가 할당. 프로그램 종료 시까지 남는다. - 스택 영역: 지역변수와 매개변수가 할당된다. 함수가 종료되면 소멸된다. - 힙 영역: 프로그래머가 원하는 시점에 변수를 할당하고 소멸하도록 지원하는 공간 malloc 과 free 생성과 소멸 시기가 지역변수나 전역변수와 다른 유형의 변수는, malloc 과 free 함수로 힙 영역에 할당하고 소멸할 수 있다. 먼저, stdlib.h를 추가해준다. #include void * malloc(size_t size); ..
이전 글: 8. 구조체와 typedef에서 계속 파일 입출력 파일에 저장되어 있는 데이터를 참조하길 원하는 경우, 즉 파일을 읽거나 쓰길 원하는 경우 가장 먼저 해야할 일은, 파일 사이에 데이터가 이동할 수 있는 다리를 놓는 일이다. 즉, 프로그램과 파일 사이에 "스트림(stream)"을 형성해야 한다. 스트림은 운영체제에 의해서 형성되는 소프트웨어적인 상태를 의미하는 것일 뿐이기 때문에, "파일로부터 데이터를 읽거나 쓸 기본적인 준비가 됐구나"라고 이해하면 된다. 파일 열기 FILE * fopen(const char * filename, const char * mode); --> 성공 시 해당 파일의 FILE 구조체 변수의 주소값, 실패 시 NULL 포인터 반환 FILE 구조체 변수의 멤버에 직접 접근..
이전 글: 7. 표준 입출력, 문자와 문자열 처리 함수에서 계속 구조체(Structure) 하나 이상의 변수를 묶어 새로운 자료형을 정의하는 도구 struct type_name { 멤버 선언; }; 구조체 변수 선언 struct type_name val_name; 구조체 멤버를 가져올 때엔 val_name.member_name 으로. struct point { int x; int y; }; 초기화는 배열과 동일한 방식으로 할 수 있다. struct point = { 10, 20 }; 구조체 멤버 중에 배열이나 포인터 변수가 있을 경우, 포인터 변수의 접근 방식을 취한다. struct person { char name[20]; int age; }; struct person man; strcpy(man.na..
이전 글: 6. 함수 포인터와 void 포인터에서 계속 입출력 장치와 스트림 입출력 장치 = 키보드, 마우스, 파일!!!, 카메라, 저장장치 등등.. 스트림 = 한 방향으로 흐르는 데이터의 흐름 = 데이터의 이동수단 운영체제에서 제공하는, 소프트웨어로 구현되어 있는, 가상의 다리(브릿지) 운영체제는 외부 장치와 프로그램과의 데이터 송수신의 도구가 되는 스트림을 제공하고 있다. 콘솔 입출력을 위한 '입력 스트림'과 '출력 스트림'은 프로그램 시작과 동시에 자동으로 생성된다. 프로그램이 종료되면 자동으로 소멸된다. 이들은 표준 스트림이라 한다. * stdin 표준 입력 스트림 (키보드) * stdout 표준 출력 스트림(모니터) * stderr 표준 에러 스트림(모니터) 표준 입출력과 버퍼 표준 입출력 함수..
이전 글: 5. 다차원 배열과 포인터에서 계속 함수 포인터 변수만 메모리에 저장되는 것은 아니다. 함수들도 바이너리 형태로 메모리 공간에 저장되고, 호출 시 실행된다. 메모리 상에 저장된 함수의 주소 값을 저장하는 포인터 변수가 바로 '함수 포인터 변수'이다. 함수는 프로그램 실행 시 '메인 메모리'에 저장되어 실행되고, 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다. (배열의 이름과 마찬가지로 함수의 이름도 그 형태가 상수이다) 함수 이름의 포인터의 형(type)은 반환형과 매개변수의 선언을 통해서 결정짓는다. 예: int SimpleFunc(int num) ==> 반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형 함수 포인터 변수 int (*fptr) (int) -..
이전 글: 4. 포인터와 배열에서 계속 다차원 배열 int[행][열] 2차원 배열도 메모리상에는 1차원 형태로 존재한다. 포인터의 포인터 = 더블 포인터 변수 포인터를 가리키는 값 int n = 3; int *p = &n; int **pp = &p; (예: 포인터 변수를 이용한 Swap) (p.364) 포인터 배열과 포인터 배열의 포인터 형 int * arr[3] = {p1, p2, p3}; // int형 포인터를 인자로 가지고 있는 배열 int **ptr = arr; // int형 포인터를 가리키는 포인터 (더블 포인터) 다중 포인터가 왜 필요한가? - 자료구조를 공부하다 보면 완전 필요하다 - 함수 내에서 함수 외부에 선언된 변수에 접근하는 방법을 제시해준다. 다차원 배열과 포인터 2차원 배열이름의 ..
이전 글: 3. 배열과 문자열에서 계속 포인터 변수 "포인터 변수란 메모리의 주소 값을 저장하기 위한 변수이다." & 연산자: 피연산자의 주소값을 반환하는 연산자 포인터 변수의 크기는 하드웨어와 운영체제에 따라 달라진다. 32비트 시스템에서는 주소값을 32비트로 표현하기 때문에 포인터 변수의 크기는 4 바이트, 64비트 시스템에서는 64비트로 표현하기 때문에 8바이트 크기를 갖는다. int * : int 형 포인터 double * : double 형 포인터 int num1 = 5; double *pnum1 = # // 변수의 자료형에 맞지 않는 포인터 변수의 선언은 문제가 될 수 있다. // (컴파일 에러는 발생하지 않는다) int *ptr1 = 0; 또는 int *ptr2 = NULL; 0과 N..