일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- vim
- c# winform
- docker
- git
- c# 추상 클래스
- Data Structure
- 구조체
- github
- c#
- jupyter lab
- Python
- 플러터
- 깃
- gitlab
- 유니티
- HTML
- C++
- Unity
- 포인터
- Algorithm
- c언어
- 다트 언어
- Flutter
- dart 언어
- c# 윈폼
- jupyter
- 도커
- Houdini
- C언어 포인터
- C# delegate
- Today
- Total
목록분류 전체보기 (507)
nomad-programmer
conda로 설치한 모듈을 pyistaller를 이용해 exe파일로 만들경우 엄청난 용량을 가진 파일이 생성된다. 이러한 문제를 해결하려면 conda install 모듈이 아닌 pip install 모듈로 설치한 파일이어야 한다. 281MB 파일이 pip install로 설치한 모듈로 exe파일을 만드니 84MB로 줄었다.
pyinstaller를 이용해 exe파일 생성 후 실행시키니 ModuleNotFoundError: No module named 'pkg_resources.py2_warn' 라는 오류가 발생했다. 구글링 결과 hiddenimports 메뉴 부분에 추가하면 된다고 한다. 그래서 아래처럼 추가하여 해결하였다. 만약 OpenCV를 사용하였는데 "cv2" 임포트 에러가 발생하면, 아래와 같이 binaries에 dll을 추가해준다. a = Analysis(['main.py'], pathex=['D:\\workspace\\python\\test', 'D:\\workspace\\python\\test\\widgets\\preference', 'D:\\workspace\\python\\test\\widgets\\scre..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/XxdDI/btqFbV7Wl4u/CKkKB5DsJx2MHqKX8FThkK/img.png)
키 쌍(key pair)는 EC2 인스턴스에 접속하기 위해 사용하는 암호화된 파일이다. AWS에서는 보안 문제 때문에 EC2 인스턴스에 접속할 때 ID, 비밀번호 방식을 권장하지 않고 있다. (EC2 Linux 인스턴스의 경우 ID, 비밀번호 방식은 기본적으로 사용하지 않도록 설정되어 있다) 키 쌍 접속 방식은 ID와 비밀번호를 입력하지 않고도 접속할 수 있으며 키 쌍 파일만 분실하지만 않으면 매우 안전하다. 이 키 쌍은 RSA 공배 키 알고리즘(Public Key Algorithm)을 사용한다. 암호화 방식에는 두 가지가 있는데 대칭 키와 공개 키 방식이 대표적이다. # 대칭 키 방식은 암호화(Encyption)하는 키와 복호화(Description)하는 키가 동일하여 이 대칭 키를 상대방에게 전달하는..
Elastic IP는 고정된 공인 IP를 제공한다. EC2 인스턴스를 생성하면 기본적으로 공인 IP가 부여된다. 하지만 이 IP 주소는 EC2 인스턴스가 실행되고 있는 동안에만 유효하며 EC2 인스턴스가 중단되면 IP 주소는 반납된다. 따라서 EC2 인스턴스를 다시 실행하면 이 공인 IP는 바뀔 수 있다. 즉, 유동 IP 인 것이다. IPv4 체계에서는 IP 주소가 매우 부족하기 때문에 사용하지 않는 EC2 인스턴스에는 IP주소를 할당하지 않는 것이다. DNS 서버를 통해 도메인에 IP 주소를 연결해 놓았는데 IP 주소가 바뀌면 매우 곤란해진다. 그래서 AWS에서는 Elastic IP를 제공해주고 있다. 특별한 기능이 있는 IP 주소는 아니며 한 번 할당받으면 절대 바뀌지 않는 IP 주소이다. 사용하지 ..
EC2 (Elastic Compute Cloud)는 AWS에서 가장 기본적이면서 널리 쓰이는 인프라이다. EC2는 인터넷에 연결된 가상 서버를 제공해준다. EC2를 사용해야 하는 이유는 효율성과 비용 절감에 있따. EC2는 클릭 몇 번으로 서버를 생성할 수 있기 때문에 실제 서버를 구축하는 것보다 훨씬 간편하고 효율적이다. 또한, 사용한 만큼만 요금을 지불하면 되므로 비용도 절감할 수 있다. EC2 인스턴스는 우리가 일반적으로 보는 PC나 서버와 똑같은 형태이며 Linux나 Windows가 설치되어 있다. 가상 서버이기 때문에 모니터에는 직접 연결할 수 없고 터미널 또는 원격 데스크톱 연결로 접속해야 한다. 시작(Start): EC2 인스턴스를 시작한다. 운영체제가 부팅되고 사용할 수 있는 상태이다. 시..
Git Push rejected: Push to origin/master was rejected jetbrains 에디터에서 git을 사용하다보면 git push rejected 라는 에러로 push가 되지 않을 때가 있다. 이것은 원격 저장소에 커밋 변화가 생겼는데 그 저장소에 push를 하려고 하다보니 이렇게 된 것이다. 그래서 pull로 컷밋 을 가져오려고하면 이 또한 에러나 발생하여 명령 실행이 안된다. 해결 방법: 1. 현 프로젝트의 최상위 디렉토리로 간다. 2. 마우스 우측 클릭을 하여 'Git Bash here' 메뉴를 클릭한다. 3. 아래의 명령을 실행한다. git pull origin master --allow-unrelated-histories 4. edit 메시지 작성 5. 다시 Je..
[] 연산자를 사용한 int형 배열 요소 접근 #include int main() { int i_arr[6] = { 10, 20, 30, 40, 50, 60 }; printf("%d %d %d %d %d %d\n", i_arr[0], i_arr[1], i_arr[2], i_arr[3], i_arr[4], i_arr[5]); printf("%d %d %d %d %d %d\n", (&i_arr[2])[-2], (&i_arr[2])[-1], (&i_arr[2])[0], (&i_arr[2])[1], (&i_arr[2])[2], (&i_arr[2])[3]); return 0; } // 결과 /* 10 20 30 40 50 60 10 20 30 40 50 60 */ &i_arr[2] 를 중심으로 +, - 연산을 하..
c_arr 변수의 메모리 주소가 12ff7c 라고 가정한다. #include void main() { char c_arr[2][2] = {'A', 'B', 'C', 'D'}; printf("%x %x %x %x\n", &c_arr[0][0], c_arr, c_arr[0], c_arr[1]); printf("%x %x %x %x\n", &c_arr[0][0]+1, c_arr+1, c_arr[0]+1, c_arr[1]+1); } // 결과 /* 12ff7c 12ff7c 12ff7c 12ff7e 12ff7d 12ff7e 12ff7d 12ff7f */ &c_arr[0][0]는 char형 1바이트의 주소를 의미하며 여기에 +1을 한 것은 1바이트의 주소를 덧셈하라는 의미이다. c_arr은 char형 배열 2*2의..
c_arr 변수가 0x12ff78의 주소를 사용한다고 가정한다. 형 변환 연산자를 사용하여 상수를 char형 주소로 변환한 후 * 연산자를 사용하여 char형 1바이트에 접근한다. #include int main() { char c_arr[5] = { 'A', 'B', 'C', 'D', 'E' }; printf("%c %c %c %c %c\n", *(char*)0x12ff78, *(char*)0x12ff79, *(char*)0x12ff7a, *(char*)0x12ff7b, *(char*)0x12ff7c); return 0; } // 결과 /* A B C D E */ 정수 0x12ff78 ~ 0x12ff7c에 (char*) 형 변환 연산을 사용하여 char형 주소로 변환한 후 *를 붙여 메모리 자체(값)를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cXmYFi/btqApHkjyXB/9MJZgMTkjGC9o29clk1unK/img.png)
비쥬얼 스튜디오 코드 편집기를 후디니 기본 외부 편집기로 지정한 후 VSCode의 vex extension을 설치하면 매우 편리하다. 그래서 이것을 소개하고자 한다. 먼저, houdini.env 파일을 열어 외부 편집기 변수를 설정한다. // Windows C:\Users\\Documents\houdini18.0\houdini.env // Linux /home//houdini18.0/houdini.env 이렇게하면, 외부 편집기로 Visual Studio Code 를 쓰면서 VEX의 함수 및 상수들을 자동완성 기능으로 편집할 수 있다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/EjePA/btqE0QedDeu/n5xyuN19XWSNbkQoCHrk31/img.png)
#include void main() } int n = 100; // 12ff7c printf("%x\n", &n); printf("%d %d\n", n, *&n); } // 결과 /* 12ff7c 100 100 */ int형 변수 n의 주소가 12ff7c라면 시작 주소는 &n이고, 이 주소에 *를 붙여 *&n 은 변수 n의 4바이트 크기의 메모리를 의미하게 된다. 값은 100이다. *&n 은 n과 같은 메모리의 이름이라고 해도 무방하다. 주소 12ff7c ~ 12ff7f의 4바이트 메모리 이름은 n과 *&n 이다. & 연산자와 * 연산자는 상반된 개념을 가지고 있다. & 연산자는 변수(메모리 이름) 앞에서만 사용하고 * 연산자는 주소 앞에서만 사용한다. 예를 들어 *N과 가이 사용하면 N은 주소이고 &..
형 변환은 암묵적인 형 변환과 명시적인 형 변환이 있다. 암묵적인 형 변환은 컴파일러에 의해 자동으로 변환되고 명시적인 형 변환은 () 연산자를 사용하여 변환한다. char형 변수(1바이트)를 int형 변수(4바이트)에 대입하는 경우 암묵적인 형 변환(자동 형 변환)이 수행된다. 작은 자료형을 큰 자료형으로 변환하는 경우 컴파일러는 자동으로 형 변환을 수행한다. 에를 들어 (char)는 char형으로 자료형을 변환하라는 의미이고 (char*)는 char형 주소로 자료형을 변환하라는 의미이다. #include int main() { char c = 'A'; printf("%x %x %x\n", &c, (char*)&c, (int*)&c); printf("%x %x %x\n", &c+1, (char*)&c+..
C로 프로그램을 만든다면 아마 성능과 규모 확장에 대해 신경이 많이 쓰일 것이다. 코드를 컴파일하기 위해 gcc를 사용한다면 다음과 같은 다른 GNU 도구들을 살펴볼 필요가 있다. gdb gdb(GNU Project Debugger)를 사용하면 컴파일된 프로그램을 실행하는 동안 코드를 조사할 수 있다. 성가신 버그를 추적하고 싶을 때 이 도구는 매우 유용하다. gdb는 명령행에서 직접 사용할 수 있고 Xcode나 여타 다른 통합 개발 환경에서 사용할 수 있다. https://www.gnu.org/software/gdb/ GDB: The GNU Project Debugger GDB: The GNU Project Debugger [bugs] [GDB Maintainers] [contributing] [cur..
gcc는 매우 많은 기능을 갖고 있어서 만들어내는 코드를 매우 다양하게 제어할 수 있다. 최적화 gcc는 코드 성능을 아주 많이 높일 수 있다. 루프를 반복할때마다 변수에 값은 값을 대입하는 코드가 있으면 이런 코드를 루프 밖으로 빼낸다. 단지 몇 군데에서만 사용하는 작은 함수가 있다면 이 함수를 인라인 함수(Inline Function)로 바꾸고 호출하는 코드에 직접 집어 넣는다. 매우 다양한 최적화를 할 수 있지만, 대부분의 최적화 기능은 기본값으로는 해제되어 있다. 최적화하려면 컴파일하는 데 많은 시간이 걸리므로 코드를 개발하는 동안에는 컴파일 시간을 줄이기 위해 최적화 기능을 끄는 편이 좋다. 코드를 배포할 준비가 되면 여러 최적화 기능을 활성화하면 된다. 옵션 설명 -O gcc 명령에 -O 플래..
코드는 언제나 테스트되어야 한다. 테스트를 자동화하면 개발이 훨씬 수월해진다. C 프로그래머가 사용할 수 있는 테스트 프레임워크는 매우 많다. 그 중 AceUnit이라고 불리는 프레임워크도 있다. http://aceunit.sourceforge.net/ AceUnit AceUnit Latest release version: aceunit-0.12.0 What is AceUnit? AceUnit (Advanced C and Embedded Unit): a comfortable C code unit test framework. AceUnit is JUnit 4.x style, easy, modular and flexible. AceUnit can be used in resource constraint env..
sizeof 연산자는 데이터가 얼마나 많은 메모리 공간을 차지하는지 알려준다. 그런데 어떤 "범위의 값"을 가질 수 있는지 알고 싶으면 어떻게 해야 할까? 예를 들어 컴퓨터에서 int형이 4바이트를 차지한다고 알고 있을 때, 저장할 수 있는 가장 큰 값은 무엇일까? 아니면 가장 작은 음의 값은? 차지하는 바이트 수로 크기를 계산할 수 있다만 어려울 수 있다. 대신 "limits.h" 헤더 파일에 정의된 매크로를 사용할 수 있다. long형 변수가 저장할 수 있는 가장 큰 값은 LONG_MAX 매크로에 정의되어 있고 short형 변수가 저장할 수 있는 가장 작은 값은 SHRT_MIN을 사용하면 알 수 있다. 다음 코드는 int와 short가 저장할 수 있는 범위를 보여준다. #include #include..
카운터처럼 작동하는 함수를 다음과 같이 작성할 수 있다. int count = 0; int counter() { return count++; } 이 코드에 문제가 무엇일까? 이 코드는 count라는 전역 변수를 사용한다. 이 변수가 전역 변수이므로 어떤 함수도 count의 값을 바꿀 수 있다. 큰 프로그램을 만들 때는 엉뚱하게 전역 변수를 바꾸는 실수를 범할 수 있기 때문에 너무 많은 전역 변수를 사용하는 건 좋지 않다. 다행히도 C는 전역 메모리에 저장하지만 특정 함수나 파일만 사용할 수 있는 변수도 만들 수 있다. // static 키워드를 사용하면 counter() 함수가 종료되어도 이 값이 유지된다. int counter() { // count는 전역 변수지만, 이 함수만 이 변수에 접근할 수 있..
뮤텍스는 공유 데이터를 보호하는 락이다. 여러 스레드가 한 변수를 동시에 갱신하면, 결과는 예측할 수 없는 상태가 된다. #include #include #include #include #include // 2백만개 int number = 2000000; void error(char *msg) { fprintf(stderr, "%s: %s", msg, strerror(errno)); exit(1); } void *decay_number(void *t) { for (int i = 0; i < 100000; i++) { number = number - 1; } return NULL; } int main(int argc, char *argv[]) { void *result; int ste; pthread_t ..
프로세스가 언제나 답이 되지는 못한다. 다음과 같은 이유가 있기 때문이다. 프로세스를 생성하려면 시간이 걸린다. 어떤 컴퓨터는 프로세스를 새로 만들려면 시간이 꽤 오래 걸린다. 아주 오랜 시간은 아니지만 약간의 시간이 걸린다. 추가로 수행할 일이 0.02~0.03초 걸리더라도 매번 프로세스를 새로 만드는 건 그리 효율적이지 않다. 프로세스는 데이터를 공유하기가 까다롭다. 자식 프로세스를 만들면 부모 프로세스의 모든 데이터를 완전히 복사하게 된다. 그러나 데이터를 복사했으므로, 자식 프로세스가 부모 프로세스에 데이터를 다시 보내려면 파이프와 같은 메커니즘을 사용해야 한다. 프로세스는 그저 어렵기만 하다. 프로세스를 생성하려면 많은 코드를 짜야 한다. 그러면 프로그램은 길어지고, 지저분해지기 마련이다. 스레..
인터넷에 있는 대부분의 저수준 네트워킹 코드는 C로 작성되었다. 네트워크로 연결되는 애플리케이션은 서버와 클라이언트, 두 프로그램이 필요하다. 서버는 동시에 여러 클라이언트와 통신할 수 있어야 한다. 클라이언트와 서버는 프로토콜(protocol)이라는 구조화된 통신 방법을 사용한다. 인터넷에서는 다양한 프로토콜이 사용된다. 이 중에 인터넷 프로토콜(Internet Protocol, IP)과 같은 저수준 프로토콜은 인터넷으로 1과 0으로 된 이진값을 전송하는 방법을 정의한다. 하이퍼텍스트 전송 프로토콜(HyperText Transfer Protocol, HTTP)과 같은 고수준 프로토콜은 웹브라우저와 웹 서버가 통신하는 방법을 정의한다. 클라이언트와 서버는 프로토콜이라는 구조화된 통신 규약을 따른다. C프..