- Видео 32
- Просмотров 42 602
김진휘
Добавлен 16 май 2013
아. 인생살기 빡세네.
미국 가자!
미국 가자!
코딩 실력을 단기간에 끌어올릴 수 있는 현실적인 방법 [PYTHON]
PIL이라는 외부 모듈이 이미 설치된 상태입니다.
pip install pillow (또는 pip3 install pillow)로 설치해주세요.
[첨언]
1. 항상 이러한 과정을 따르라는 것은 아닙니다.
2. 계속해서 이러한 과정을 통해 에러를 잡고, 모듈에 존재하는 기능들을 효율적으로 찾아보고 응용하는 능력을 기르자는 것입니다.
3. 당연하게도 전반적인 영상의 과정이 항상 옳고 효율적이진 않습니다.
4. 이 과정이 손에 익고 왜 이렇게 하는지 이해하게 될 때면, StackOverflow부터 봐야할지 ChatGPT한테 먼저 물어봐야할지 공식 문서부터 읽어야할지 그 상황이 파악될 겁니다.
5. 이 레벨까지 오를 수 있도록 도움을 주기 위해 '무엇을 어떻게 생각해야 할까?', '어떤 기능이 사용될 수 있을까?', '무엇을 검색해야할까?', '문서와 질문은 어떻게 읽어야할까?' 등을 중점으로 천천히 그리고 자세히 설명해드렸습니다.
pip install pillow (또는 pip3 install pillow)로 설치해주세요.
[첨언]
1. 항상 이러한 과정을 따르라는 것은 아닙니다.
2. 계속해서 이러한 과정을 통해 에러를 잡고, 모듈에 존재하는 기능들을 효율적으로 찾아보고 응용하는 능력을 기르자는 것입니다.
3. 당연하게도 전반적인 영상의 과정이 항상 옳고 효율적이진 않습니다.
4. 이 과정이 손에 익고 왜 이렇게 하는지 이해하게 될 때면, StackOverflow부터 봐야할지 ChatGPT한테 먼저 물어봐야할지 공식 문서부터 읽어야할지 그 상황이 파악될 겁니다.
5. 이 레벨까지 오를 수 있도록 도움을 주기 위해 '무엇을 어떻게 생각해야 할까?', '어떤 기능이 사용될 수 있을까?', '무엇을 검색해야할까?', '문서와 질문은 어떻게 읽어야할까?' 등을 중점으로 천천히 그리고 자세히 설명해드렸습니다.
Просмотров: 673
Видео
XOR Swap (Detail Explanation)
Просмотров 526 месяцев назад
Thank you for watching this video! Please thumbs up and subscribe for more! ⭐️ Timestamps ⭐️ 00:00 | The beginning 00:30 | The logic of XOR 01:50 | XOR Swap example 08:00 | The proof of XOR Swap 13:00 | The meanings
half-derivative of x and cos(x). 이게 머고?
Просмотров 517 месяцев назад
x의 half-derivative 구하는데 감마 함수 값 잘못 썼습니다. 양해부탁드립니다. 정정합니다. Γ(2) / Γ(3/2) = √(2/π) → Γ(2) / Γ(3/2) = 2/√π Γ(3/2) / Γ(1) = √(π/2) → Γ(3/2) / Γ(1) = √π/2 00:00 half-derivative of x 10:55 half-derivative of cos(x) (Dr. Peyam 영상의 내용을 재구성했습니다.)
[MATLAB] How To Solve ODEs (상미분방정식을 푸는 방법)
Просмотров 1,1 тыс.2 года назад
영어에 익숙해지기 위해서 영어로 촬영했습니다. 불편하시다면, 양해를 부탁드리며 죄송합니다. I'm not an English native, but I've recorded this video to be familiar with English. Thank you. 🌠🌠 Refer to my websites 🌠🌠 Github : github.com/KJH-RUclips/MATLAB-ODE My Docs : kjh-icnl.github.io/jinhwi/documents/MATLAB/ode_solver.html ⭐️ Timestamps ⭐️ 00:00 | Introduction 00:49 | dsolve (no initial condition) 04:29 | dsolve (one condition) 06:1...
[OOP 16강] You Can C++ | Exception Handling (예외 처리) / Lambda Function (람다 함수) / STL (표준 라이브러리)
Просмотров 1752 года назад
저의 C 강의 16강을 시청해주셔서 감사합니다. 완강을 하시 모든 분들께 감사드리고 축하드립니다. 너무 고생이 많으셨습니다. 많이 어려운 내용도 많았을 것인데, 인내하고 공부하려고 하는 여러분들의 자세에 박수를 드리고 싶습니다. 다른 주제의 영상들도 많이 찾아봐주시면 감사하겠습니다. 그 다음으로 공부해볼 내용으로는 자료구조 (Data Structrue), 컴퓨터 구조 (Computer Architecture) 등을 추천드립니다. 감사합니다. [ 추가 보충 사항 ] 댓글에 남기도록 하겠습니다. [ 추가로 읽어보면 좋은 사이트 ] w3cschoool.com/c -exception-handling [연습문제 풀러가기] [ Time Stamp ] 00:00:00 Intro (Exception Handling)...
[OOP 15강] You Can C++ | File IO (파일 입출력) / template (템플릿) / functor (펑터)
Просмотров 1762 года назад
저의 C 강의 15강을 시청해주셔서 감사합니다. 사운드를 증가시키긴 했는데 너무 시킨 것 같습니다 ㅠㅠ 죄송합니다 ㅠㅠ [질문 1. POSIX가 무엇인가요?] 서로 다른 운영체제가 호환이 잘 될 수 있도록 IEEE(미국전기전자학회)에서 제정한 표준입니다. System Interface API, Utility 등이 정의되어 있습니다. Solaris와 MacOS는 POSIX 인증을 받은 운영체제이고, Linux와 Android는 POSIX 인증을 받지 않았으나 대부분을 지키고 있습니다. Windows는 아주 일부만 POSIX를 따르며 인증 또한 받지 않았습니다. [ 같이 보면 더욱 좋은 웹사이트 ] [ Time Stamp ] 00:00:00 Intro (File IO) 00:00:15 Concept / 개...
[OOP 14강] You Can C++ | Pure Virtual Function/Special Specifier/Control Output/Makefile/Standard IO
Просмотров 542 года назад
저의 C 강의 14강을 시청해주셔서 감사합니다. [ 같이 보면 더욱 좋은 웹사이트 ] (default constructor [ENG]) : bit.ly/39NelNI (constructor [KOR]) : bit.ly/3xXWTP5 (enum class [ENG]) : bit.ly/3aksEK7 (enum class [KOR]) : bit.ly/3usWlA3 [연습문제 풀러가기] bit.ly/3IuqAuE [ Time Stamp ] 00:00:00 Intro 00:01:23 Pure Virtual Function (1) / 순수 가상 함수 (1) 00:07:42 [Recap] Instantiation / [복습] 인스턴스화 00:10:33 Pure Virtual Function (2) / 순수 가상 함...
[OOP 13강] You Can C++ | Up & Downcast/Override & Virtual Function/Virtual Inheritance/다중 상속
Просмотров 542 года назад
저의 C 강의 13강을 시청해주셔서 감사합니다. 제목은 100자 맞추려다보니... 영어랑 한글이 같이 들어갔습니다. 양해부탁드립니다. [56:51] 부분 코드에 오류가 있습니다. 제가 virtual을 사용하면 Derived Class Method까지 잘 불린다는 것을 보여드리고자 작성한 코드였는데, 실수를 했습니다. a→reproduce(); m→reproduce(); r→reproduce(); 이 아니라 array[0]→reproduce(); array[1]→reproduce(); array[2]→reproduce();가 되어야 합니다. (설명란에 꺽쇠 기호가 허용되지 않아 화살표로 대체했습니다.) 따라서 [59:30] 부분에 a, m, r 객체는 각각 array[0], array[1], array[...
[OOP 12강] You Can C++ | Operator Overloading (연산자 오버로딩) / Inheritance (상속)
Просмотров 532 года назад
저의 C 강의 12강을 시청해주셔서 감사합니다. 코로나 걸리고 나니, 전이랑 목소리가 많이 달라진 것 같습니다. 죄송합니다 ㅠㅠ 여러분도 건강 잘 챙기세요! 오늘은 정말 중요한 Operator Overloading과 Inheritance에 대해서 배웁니다. 너무 중요하기 때문에 두고두고 계속 반복 학습이 중요합니다. 그리고 이번 강의에서는 해당 문법이 생긴 일련의 '흐름'이 중요합니다. 꼭 그 흐름을 잘 파악하시기 바랍니다. 잘 시청해주셔서 감사합니다. [40:00] 부분에서 첨언을 하자면, rhs는 연산에 대한 대상자일 뿐입니다. 연산자를 부르는 주체는 lhs (a)입니다. 이때, member function이라면 a가 어떤 클래스의 'member'인지 알면 어떤 클래스에서 연산자를 부르면 되는지 알...
[OOP 11강] You Can C++ | String (스트링) / Issue on Copy (카피 이슈) / Extra Keywords (클래스 키워드)
Просмотров 552 года назад
저의 C 강의 11강을 시청해주셔서 감사합니다. 오늘 강의는 많이 길어져 버렸네요. 그래도 빨리 설명할 수 있을 줄 알았는데, 많은 것들을 알려드리고자 하는 마음이 커져서 영상이 길어졌습니다. 다음 부터는 양 조절을 잘 하도록 하겠습니다. 잘 시청해주셔서 감사합니다. (2배속으로 들으세요 ㅋㅋ) Time Stamp의 "How to read C Documents" 섹션에는 String 클래스에 존재하는 여러 멤버 함수를 사용하는 예시들이 있습니다. 참고해주시기 바랍니다. In the "How to read C Documents" chapter of the time stamp, there are usages of a few member functions to belong to the string class...
[OOP 10강] You Can C++ | Constructor (생성자), Destructor (소멸자), this pointer (this 포인터)
Просмотров 642 года назад
저의 C 강의 10강을 시청해주셔서 감사합니다. 전 전부 영어로 배웠어서 한글 용어 참고를 위해 다른 문헌들을 읽어보니 번역이 죄다 각각 따로 놀고 있더라구요. Encapsulation 같은 경우, 캡슐화, 은닉화 다양한 이름으로 따로 놀고 있더라구요. 어떤 문헌에서는 캡슐화라고 번역하고, 어디서는 은닉화라고 번역하고, 또 어디서는 캡슐화와 은닉화가 다른 개념이라고 하는데, 솔직히 그냥 Encapsulation으로 공부하시는 게 좋을 것 같습니다. (컴퓨터 공부는 영어로...) 결정적으로 이런 용어에 얽매일 필요가 없습니다. 그냥 이런 게 있구나 하고 넘어가시면 됩니다. [연습문제 풀러가기] bit.ly/3IuqAuE [ 같이 보면 더욱 좋은 웹사이트 ] (비고) [ Time Stamp ] (Updat...
[OOP 9강] You Can C++ | const / Struct / Class / Object-Oriented Programming (객체지향 프로그래밍)
Просмотров 822 года назад
[OOP 9강] You Can C | const / Struct / Class / Object-Oriented Programming (객체지향 프로그래밍)
[OOP 8강] You Can C++ | l/r-value, Reference Type, Double Pointer(이중포인터), Dynamic Allocation(동적할당)
Просмотров 1402 года назад
[OOP 8강] You Can C | l/r-value, Reference Type, Double Pointer(이중포인터), Dynamic Allocation(동적할당)
[OOP 7강] You Can C++ | Function-2(함수-2), Pointer and Array with F(포인터와 함수), Reference Type(레퍼런스 타입)
Просмотров 1062 года назад
[OOP 7강] You Can C | Function-2(함수-2), Pointer and Array with F(포인터와 함수), Reference Type(레퍼런스 타입)
[OOP 6강] You Can C++ | Array (배열) / Pointer (포인터) / Array with Pointer (포인터를 통한 Array의 이해)
Просмотров 1342 года назад
[OOP 6강] You Can C | Array (배열) / Pointer (포인터) / Array with Pointer (포인터를 통한 Array의 이해)
[OOP 5강] You Can C++ | Basic Computer Architecture (컴퓨터 구조 기초) / Coding Style (코딩 스타일)
Просмотров 1612 года назад
[OOP 5강] You Can C | Basic Computer Architecture (컴퓨터 구조 기초) / Coding Style (코딩 스타일)
[OOP 4강] You Can C++ | Function(함수), Variable Scope(유효범위), Namespace(네임스페이스), Makefile(메이크파일)
Просмотров 1352 года назад
[OOP 4강] You Can C | Function(함수), Variable Scope(유효범위), Namespace(네임스페이스), Makefile(메이크파일)
[OOP 3강] You Can C++ | auto(형추론), string(문자열) Flow Control (if, while, for, switch, goto)
Просмотров 1222 года назад
[OOP 3강] You Can C | auto(형추론), string(문자열) Flow Control (if, while, for, switch, goto)
[OOP 2강] You Can C++ | Data Type(자료형) / Variable(변수) / Type Conversion (형변환) / Operator(연산자)
Просмотров 1882 года назад
[OOP 2강] You Can C | Data Type(자료형) / Variable(변수) / Type Conversion (형변환) / Operator(연산자)
[OOP 1강] You Can C++ | Makefile, Shell Script (셸 스크립트), I/O (표준 입출력)
Просмотров 5372 года назад
[OOP 1강] You Can C | Makefile, Shell Script (셸 스크립트), I/O (표준 입출력)
[Python] 병렬처리(Multiprocessing)로 업무 효율을 높이자! (1편)
Просмотров 16 тыс.3 года назад
[Python] 병렬처리(Multiprocessing)로 업무 효율을 높이자! (1편)
[Python] 여러분들은 print 함수를 얼마나 알고 계신가요? (Buffer 개념)
Просмотров 9623 года назад
[Python] 여러분들은 print 함수를 얼마나 알고 계신가요? (Buffer 개념)
VMware에서 가상머신(Virtual Machine) 깔끔하게 지우기
Просмотров 13 тыс.3 года назад
VMware에서 가상머신(Virtual Machine) 깔끔하게 지우기
윈도우(Windows)에서 리눅스(Linux) 환경 구축하기 [Python, C/C++, Java, Swift, pip 설치와 사용법까지]
Просмотров 8493 года назад
윈도우(Windows)에서 리눅스(Linux) 환경 구축하기 [Python, C/C , Java, Swift, pip 설치와 사용법까지]
Python으로 [나만의 번역기] 만들기 (module분석 방법 및 github 꿀팁까지)
Просмотров 1,1 тыс.3 года назад
Python으로 [나만의 번역기] 만들기 (module분석 방법 및 github 꿀팁까지)
C++로 그래프(Grpah) 플롯(Plot)하기 [C++ 그래프 그리기/명령어꿀팁까지]
Просмотров 4,3 тыс.3 года назад
C 로 그래프(Grpah) 플롯(Plot)하기 [C 그래프 그리기/명령어꿀팁까지]
친절한 설명 감사드립니다!
어우 정말 친절하네요. 이렇게 말해주는 사람 없는데 진짜. 다 알려주셨다. 파이썬 뿐만아니라 모든 곳에서 다 적용되는 내용.
도움이 되셨다니 다행이네요! 감사합니다! 코잘알이 되시는 그날까지! ㅎㅎ
탈락
@@진씨공방주식회사 ㅋㅋㅋ̆̈ ㄱㅅ
도함수의 차수를 자연수에서 실수로 확장하는 거군요?!
네 맞습니다!! 여담으로 1/2 미분 뿐만 아니라 3/2 등의 1이상의 실수 미분은 1/2 + n으로 나누어서 미분합니다. 여기서 적분에서 사용하는 방식과 비슷한 방식이 사용될 수 있는데, 반미분을 먼저 하는 것이 쉬울지 n미분을 해서 차수를 내린 다음에 반미분을 하는 것이 쉬울지 선택할 수 있습니다.
x의 half-derivative 구하는데 Γ함수값 오타 있습니다. 정정합니다. Γ(2) / Γ(3/2) = √(2/π) → Γ(2) / Γ(3/2) = 2/√π Γ(3/2) / Γ(1) = √(π/2) → Γ(3/2) / Γ(1) = √π/2 전 분명히 말함.
#define은 컴파일 단계에서 해당 부분을 대체하는 것으로 이해하면 될까요?
네, 맞습니다! #define A B와 같은 형식으로 정의했다면, 실제 함수 내의 코드에서는 A를 B로 대체해서 컴파일합니다. 이와 관련되어서, 쉽게 발생할 수 있는 Semantic Error와 대처법을 설명한 쇼츠영상이 있습니다. ruclips.net/user/shortsgLFOO3PF3Ns 참고하시면 좋을 것 같습니다!
2배속인가요??
2배속은 아니고, 일반적으로는 1.2~1.3배 정도입니다. 배속은 영상에 따라서 1.5배까지도 합니다! 그리고 빨리 지나가도 상관없을 경우에는 2~3배속도 합니다! 개선해야 할 점이 있으면, 알려주세요!
뭐 드시면서 하시나용? 맛있어보여요
.... 네....?
*첨언* 1. C언어와 다르게 C++에서는 선언 및 초기화(e.g. int i=0;)가 statement로 관리됩니다. 따라서 동일 코드 블럭 내에서 실행되지 않을 가능성이 있다면 그것은 에러가 됩니다. 2. 에러 문구 분석 (12번 라인) "jump to case label default:" = label default로 점프를 하면서 에러가 발생되었다. (9번 라인) "note: crosses initialization of 'int v2' " = 'int v2'의 초기화를 건너 뛰었다. 이 점은 12번 라인의 에러에 대한 가능성있는 원인이다. 3. v=1이기 때문에 무조건 case 1을 통과하기 때문에 int v2=2;를 실행하지 않을 수도 있다는 것은 어불성설이지 않은가? 아닙니다. 이는 런타임에 대한 내용이 아니라 컴파일 타임에 대한 내용입니다. 이 부분은 컴파일러가 컴파일 타임에 각 분기(branch)에 대한 검사를 모두 진행합니다. 그렇기 때문에 case 1이 아닌 default로 가는 경우도 컴파일 타임에서 확인하므로 에러를 발생시키는 것입니다. 4. 여기서 말하는 에러 해결 방식은 어쩔 수 없는 경우에 국한됩니다. 그럼에도 불구하고, 가능하면 switch 내에서 새로운 변수를 선언하는 것보다 switch 외부로 꺼내주는 것이 좋은 코드라고 할 수 있습니다.
*첨언* 1. C언어는 선언 및 초기화(e.g. int i=0;)가 statement(명령문)가 아닙니다. 따라서, C++과는 다르게 무조건 실행될 필요가 없습니다. 2. 영상의 결론은 그래서 dump statement를 사용하던, 중괄호로 코드블럭을 구분해주던 에러를 해결하기 위해서는 이런 방법이 있다는 겁니다. 하지만, 이렇게 코딩하는 것보다 switch 안에서는 되도록이면 새로운 변수를 선언하지 않는 것이 가장 좋은 방법입니다. 3. 에러의 원인을 더 자세히 분석해보자면 이렇습니다. label 뒤에는 statement만 올 수 있습니다. 하지만 case 1: label 뒤에는 세미콜론이 없기 때문에 코드 라인이 종결되지 않았습니다. 따라서 label 직후의 코드 라인 파트가 int v2=2;인 것입니다. 그런데 C언어에서는 초기화가 statement가 아니므로 에러가 발생한 것입니다. 4. dump statement의 기능 / 세미콜론은 C/C++ 코드에서 부정적인 영향을 절대 주지 않습니다. 이를 바라보는 관점은 2가지가 있을 수 있습니다. 첫 번째는 label에 해당하는 코드라인을 강제로 끝맞춰주는 것. 두 번째는 아무 역할이 없는 statement의 일부로 사용된 것. 5. C23부터는 label 뒤에 statement가 아니어도 허용하는 제안이 받아들여졌고 이제는 세미콜론을 통한 에러 해결 방식은 필요가 없어질 것입니다. 6. 만약 여러분들의 컴파일러가 저와 같은 코드임에도 불구하고 에러를 발생시키지 않는다면, 여러분들이 사용하고 계신 컴파일러의 버전과 extension이 이 부분을 핸들링하고 있기 때문에 에러가 발생되지 않는 것입니다. (gcc의 경우, extension 적용을 없애고 싶다면, -pedantic-errors 옵션을 추가해보세요.)
혹시나 이상하게 생각할 수도 있는 부분이 있어 댓글 남겨둡니다. - 매크로 함수/상수를 왜 main함수 안에 만들어 놨냐? -> 단순히 쇼츠로 만들 경우에 대한 가독성 향상 목적입니다. 쇼츠의 경우, 양옆, 위아래가 꽤 잘리는 부분이 있기 때문에 그 부분을 미연에 방지하고자 내부에 작성했습니다. - printf 함수를 왜 저렇게 작성했나? -> 이 또한 쇼츠 영상의 해상도 특성상 그렇습니다. 양옆이 많이 제한적이기 때문에 글씨 크기를 크게 만들다보니 길게 적을 수 없고, 한 줄만 내리자니 가독성이 별로이고 해서 저렇게 작성했습니다. - C에서는 Macro를 쓰지만 C++에서는 거의 쓰지 않지 않나? -> 어느 정도 맞습니다. 하지만, Macro를 무조건 배척하는 것은 옳지 않습니다. Macro를 사용하는 이유는 적절히 사용시 유지보수성을 높일 수 있고, 코드의 속도를 향상시킬 수 있습니다. C++에서는 이러한 이유 때문에 inline이라는 컴파일러 친화적인 키워드가 존재합니다. (inline은 Macro와 같은 동작을 컴파일러에게 '제안'한다는 의미)
요즘엔 멀티프로세싱에 ray 많이 쓰더라구요~ 이미 알고 계시겠지만 다른 분들을 위해 ray라는 라이브러리도 있다고 댓글 남겨봅니다
MacOS를 사용하시는 분들은 아래의 경로를 통해 설정하시면 됩니다! kjh-icnl.github.io/jinhwi/documents/CPP/mac_setting.html 이미 C/C++ 설정되어 있으신 분들도 제공된 페이지의 5번 항목을 잘 읽어주시기 바랍니다!!! 제발!!
항상잘보고있습니다!❤
일단 이 영상은 지금 내가 봐도 Trash임;; 이 부분은 쏴리요... 뭐 프로그램 자체가 이상하다는 건 아니고, 설명이나 이런 것들이... 암튼 최근에 google_trans_new 모듈이 동작하지 않는다는 제보를 받고 확인해본 결과, google translator API에 변화가 생겨서 google_trans_new라는 패키지 파일이 업뎃이 안 된 탓임. 만약, 최신 버전의 google_trans_new 모듈이 제대로 깔리고, 이상 없이 작동하면 해당 패키지 수정없이 사용하면 됩니다. 그럼에도 불구하고 requests.exceptions.HTTPError: 404 Client Error: Not Found for url: 이런 에러가 뜬다면, 아래의 Github Repository에 작성된 해결 방법을 따라해보십쇼. github.com/kjh-icnl/GOOPAPA 결국 제가 이 영상으로 전달해드리고 싶은 사항은 번역기를 만드는 게 아니라, Developer Forum이나 Developer 전용 사이트에서 API를 가지고 와서 Python에 적용해 응용하는 걸 보여드리고 싶었던 건데 왜 영상 저렇게 찍었는지는 아직도 저는 모르겠습니다! 암튼 전역 후에 만납시다~ 빠잉
3부작인데 2편부터는 전역하고 올리겠슘~ 😋 전역하고싶다앜!
이렇게 꼬셔놓고 군대가는게 어디있어요 ㅠ.ㅠ
8개의 프로세서를 사용하면 적어도 4배는 빠른데...음.. 방법은 비슷해 보이는데..ㅋ
안녕하세요! 사실 멀티 코어 프로세싱에서는 몇 개의 프로세서로는 무조건 몇 배는 빨라야 한다는 법칙같은 건 없습니다. 이론적으로는 몇 퍼센트의 코드 독립성에 따라 일반적으로 몇 배의 속도 증가한다는 내용이 있습니다. 하지만, 제가 영상에서 언급한 내용과 같이 n개의 프로세서를 활성시켰을 때 n배에 가까울 만큼 빠를 수도 속도 변화에 큰 차이가 없을 수도 오히려 더 느릴 수도 있습니다. 이러한 이유에는 독립성, 코드 작성시 사용한 문법, 캐시 메모리,CPU의 효율성등 영향 조건들이 너무나도 많습니다. 물론 영상에서 설명해놓은 방법보다도 더 효율적인 방식으로 코딩할 수 있으나 영상에서의 코드가 가장 직관적으로 보일 것 같아 이렇게 설명드렸습니다. Python에서는 Process뿐만 아니라 Thead, Semaphore 등의 모듈을 사용해서 더 효율적으로 코드를 작성할 수 있습니다. 어떤 이유에서 4배 정도 빨라졌는지 스스로 고민해보시면 컴퓨팅 사고에 더 도움이 되실 것 같습니다! 감사합니다!
@@MutexLock dataframe 연산처리를 하는데 컴 속도 한계 때문에 부득히 멀티를 사용하게 되었어요. 컴 자원을 특별히 효율적으로 하지는 않았고요 프로세서를 2~14개 까지 실험을 해보니 8개가 가장 효과적이더군요. 그다음 프로세서 증가에 대해선 효과가 적어요. 현재는 10개 프로세서 뛰어서 사용해요.
@@sblee918그렇군요! Dataframe의 경우컴퓨터 분야에서 여러 의미의 dataframe 있습니다만, 추측컨대 thread 사용이 조금 더 효율적일 것으로 보입니다. 또한 CPU 스펙상의 실제 논리 프로세서가 8개인지 12개인지 16개인지, 그리고 CPU의 프로세서 구조가 big.LITTLE인지도 크게 작용했던 것으로 예상됩니다.
멀티프로세싱을 사용하려고 찾아보고있습니다 지금까지 이해하기로 input이 다른 동일한 함수를 각 cpu로 동시에 계산하는걸로 알고있는데요 print 함수에서 설명하시길 multi가 더 오래걸렸다고 하셨는데 multi는 동일 작업 8개를 동시에 수행하여 13초가 걸렸고 single은 12초가 걸렸는데 이게 어떻게 속도가 느려진거라고 말씀하시는지 의아하네요.. 14:16 보시면 8개의 single함수가 동시에 돌아가고있는거 아닌가요?
제가 군입대한 이후에 채널 관리를 잘 못하고 있기도 했고 상황이 그렇게 좋지 못해 답변을 미처 못 드리고 있었습니다. 이 점 대단히 죄송합니다. 그리고 영상 시청하고 질문 남겨주신 점에 대해서는 매우 감사하게 느낍니다. 질문을 보니 상황이 헷갈릴 수도 있다는 생각이 듭니다. Single, multi 모두 1부터 10000000까지의 합을 구하는 것이 목적입니다. 제 생각에는 상황을 multiprocessing의 각 코어들이 모두 1~10000000의 합을 구하는 것으로 생각하신 것 같습니다. 하지만 그러한 사항이 아니라, 1~10000000의 합을 구하는 과정에 있어서 - single은 1~10000000까지 순차적으로 더하고 - multi는 덧셈의 구간을 1/n (영상에선 n=16) 씩 나눠 1~10000000/n, …, 1 + 1*10^7*(n-1)/n~10000000의 합을 먼저 구하고 이렇게 도출된 n개(기대적으로 매우 작은 수)의 결과를 다시 한 번에 합산하는 과정 이기 때문에 multi가 계산 속도에서 약 n배 빠를 것이다라는 기댓값을 가지는 상황입니다. 따라서 1~1*10^7까지의 모든 수를 더하는 행위를 multicore의 수만큼 진행하는 것이 아닌 결론적으로는 single, multi 모두 1번 수행하는 상황입니다. 실제적으로 계산 결과는 훨씬 더 빨리 나오지만 그 계산 결과가 우리 눈에 보이기 까지는 print 함수를 거쳐야 합니다. 그런데 이 print 함수가 감당 가능한 수준의 출력양을 넘어버려 발생하는 병목현상 때문에 우리 눈에 보이기까지의 시간이 매우 오래 걸려버린 상황입니다. 이렇게 늦게나마 자세하게라도 추가 설명을 드렸습니다. 이해가 잘 되셨으면 좋겠습니다! 그리고 늦은 답변 너무 죄송합니다. 다음에는 더욱 빨리 답변드릴 수 있도록 하겠습니다.
@@MutexLock 헐 너무너무 반갑고 담변 정말 감사드립니다. 덕분에 멀티프로세싱 너무 유용하게 잘 사용하고 있어요 ㅎㅎㅎ 영상보면서 오해를 심하게 했었군요 ㅋㅋㅋㅋ 자세히 설명해주셔서 감사합니다 군복무중이시라니 나라 지켜주셔서 감사합니다..! 덕분에 두 다리 쭉 뻗고 잡니다! 화이팅!
어렵네요 어려워...
아오 답답 보다끔
닉값하시네요
좋은 강의 감사합니다. 프로세스 데이터 교환을 프로세스가 병렬 실행되는 동안 연결하고 싶은데 그 중에 코드가 긴 프로세스는 상대적으로 1루프 계산 결과가 느려질텐테 이런 데이터 싱크도 별도로 맞춰 나가야 할까요? 현재 영상 데이터를 받아 픽셀 처리를 기반으로 로봇 HW 제어를 실시간으로 하려고 합니다. 이 구조에 iteration 을 통한 알고리즘 계산이 또 별도로 있어요 ^^;; 이처럼 실행이 무거운 알고리즘은 적당히 나눠서 core 할당 하고 데이터 흐름을 연결하면 그나마 빨라질지 모르겠네요
프로세서로 멀티 태스킹 처리하여 해결 하였습니다
처음 열었을 때 뜨는 서버들에서 삭제할 서버 우클릭 -> manage -> Delete from Disk 하면 깔끔하게 지워지는군요:) 저는 같은 컴공과라서 그런지 어떤 문제가 있을 수 있는지 설명해 주시는게 많은 도움이 되었습니다. 덕분에 깔끔하게 지웠네요:) 감사합니다.
개념적으로 이해가 안되는 부분이 많았는데 잘 설명 해주셔서 이해가 잘되네요. 어디가서 들을 수 없는 값진 강의라고 생각합니다. 감사합니다!
부족한 점이 많은 강의이지만, 좋아해주셔서 감사합니다! 더 좋은 강의를 제공해드릴 수 있도록 노력하겠습니다! 학습하시면서, 궁금한 점 또는 질문이 생기시면 편안하게 질문해주셔도 좋습니다! 오늘 하루도 좋은 하루 보내세요!
I'm learning c++ but I guess I also need to learn Korean 😂😂😂
항상 좋은강의 감사합니당
[필독] ** Struct에 대한 강의 코드 이슈 ** 00:44:02 부분에서 Ubuntu 체제에서는 worker = new Worker{1010, "John"};이 에러를 발생시킬 수도 있습니다(윈도우는 제가 잘 모르겠습니다. 윈도우 사용자 분들은 컴파일러 종류와 함께 알려주십쇼). 이러한 에러는 character sequence (문자열, 배열)을 원소값으로 사용하는 경우에 발생할 수 있습니다. 먼저 C++의 핵심 기능은 struct에 있는 것이 아닌 Class에 있기 때문에 struct보다 class에 더욱 더 초점을 맞추어서 강의한 점이 있습니다. 그러므로써 발생한 struct에 존재하는 이슈를 정확히 파악하지 못해서 송구합니다. 이 문제에 대한 해결책을 알려드리겠습니다. ❗️Solution 1: only C++❗️ //struct 영역에 코드 한 줄을 추가한다 struct Worker{ int id; char name[100]; Worker() = default; // added }; 하지만, 이 코드의 한계는 typedef struct{ ... } Worker; 처럼 정의된 struct에 대해서는 동작하지 않을 수 있습니다. ❗️Solution 2: C/C++ both❗️ // char name[100]과 같은 형식의 데이터 타입을 사용하지 않는다. struct Worker{ int id; int age; // deleted }; 이와 같이 사용한다면, 문자열이나 클래스 등에 대해서는 new를 사용한 초기화에 한계가 있을 수 있습니다. ❗️Solution 3: only C++❗️ // char name[100] 형식의 데이터 타입은 코드의 가장 아래로 미룬다. struct Worker{ int id; int age; // added char name[100]; }; // 그리고 new를 사용한 초기화는 그 위까지만 하고 문자열은 strcpy를 사용한다. int main(){ struct Worker* worker = new Worker{1010, 30}; strcpy(worker->name, "John"); // .. skip .. return 0; } ❗️Solution 4: C/C++ both❗️ // new와 {}의 초기화 방식을 사용하지 않는다. // "Struct는 C언어를 위해서, Class는 C++을 위해서"라는 코딩 철학을 가지신 분들은 이 방법을 많이 채택합니다 // C++로 넘어오면서 struct에도 C언어에는 없는 C++만의 struct 기능이 추가되었지만, struct 사용할 때는 C-Style을 지켜주어야 한다는 철학을 가지신 분들입니다. // 그런 기능을 쓸 것이라면, Class를 써야 한다는 철학도 일맥상통합니다. // 동적할당을 사용한 C-Style은 이렇게 구현이 됩니다. int main(){ struct Worker* worker = (struct Worker*) malloc(sizeof(struct Worker)); worker->id = 1010; strcpy(worker->name, "John"); std::cout << worker->id << " " << worker->name << std::endl; delete worker; } // 이러한 형식은 typedef struct{...} Worker; 의 형식에 대해서도 정상 동작합니다. ❗️Solution 5: only C++❗️ // Constructor를 따로 정의한다. // 이 방식은 앞으로 계속 배울 것입니다. // class에서 사용되는 방식이 거의 동일하게 적용된다고 생각하시면 됩니다.
(읽어보시고 코드를 수정하세요. 바로 복붙만 하면 실행 안 됩니다.) [추가 보충사항 throw exception] #include <exception> // for standard exception class #include <stdexcept> // for runtime error /* Skip */ // Case 1 try{ throw std::runtime_error("RunTime Error"); } catch (const std::exception& e){ std::cerr << e.what() << std::endl; } // Case 2 try{ throw std::runtime_error("RunTime Error"); } catch (const std::runtime_error e){ std::cerr << e.what() << std::endl; } /* (설명) Case 1에서는 표준 에러 중 하나의 Runtime Error를 직접 던졌고, 그 에러를 Standard Exception Class로 잡은 것이다. Case 2에서는 Runtime Error를 던지고 그 에러를 잡은 것도 해당 Runtime Error Class이다. */ [추가 보충 사항 throw()] #include <vector> #include <algorithm> // for sort and for_each #include <stdexcept> // for out_of_range void aProcess(std:vector<int>& _vec){ std::sort(_vec.begin(), _vec.end(), [](int a, int b) throw(out_of_range) { if(a > 100 || b > 100) throw std::out_of_range("Overflow 100"); return a<b; }); std::for_each(_vec.begin(), _vec.end(), [](int x){ std::cout << x << std::endl; }) } /* Skip (in main function)*/ vector<int> vec; vec.push_back(5); vec.push_back(20); vec.push_back(88); vec.push_back(31); vec.push_back(100); // a value to occur an exception aProcess(vec); /* (설명) Lambda Function의 throw에는 던지고자 하는 에러를 넣는 방식을 동적 예외 지정(Dynamic Exception Specification)이라고 부른다. 하지만, 이런 동적 예외 지정은 C++11에서만 사용이 되었고, C++14에서는 Deprecated Warning(더 이상 쓰지 않게 될 문법)이 되었으며 C++17 이후로는 완전히 오류 문법이 되었다. []() throw() {} 그리고 throw std::out_of_range("Overflow 100");로 쓰는 것이 이제는 허용이 된다. */ [추가 보충 사항 Class Iterator] // Reference: cplusplus.com #include <iterator> class MyIterator : public std::iterator<std::input_iterator_tag, int>{ int* p; public: MyIterator(int* x) : p(x) {} MyIterator(const MyIterator& mit) : p(mit.p) {} MyIterator& operator++() { ++p; return *this; } MyIterator operator++(int) { MyIterator tmp(*this); operator++(); return tmp; } bool operator==(const MyIterator& rhs) const { return p==rhs.p; } bool operator!=(const MyIterator& rhs) const { return p!=rhs.p; } int& operator*() { return *p; } }; /* Skip (in main function) */ int numbers[] = {10, 20, 30, 40, 50}; MyIterator from(numbers); MyIterator until(numbers+5); for (MyIterator it=from; it!=until; ++it) std::cout << *it << ' '; std::cout << ' '; /* (설명) std::iterator 를 상속 받음으로써 iterator type으로 사용될 수 있게끔 클래스를 정의할 수 있다. */
flush=True 로 사용하신 예가 무엇일까요?
flush=True를 사용하는 경우는 대표적으로 파일IO나 Terminal 출력에 사용할 때에 사용합니다. 실제 예시로는 제 C++ 강의 5강 예제 문제(2번)에서 flush를 사용하기도 했습니다. 직접 확인하고 싶으시다면, bit.ly/3NDp8Jg 여기서 확인해주세요. 관심가지고 질문해주셔서 감사합니다!
도전해보도록 하겠습니다!!!
덕분에 좋은 라이브러리 알고 가요. 감사합니다
도움이 되셨다니 다행입니다.
말 존나게 느리게 말하네 그냥 말하면될거를
죄송합니다. 느릿느릿한 성격과 늦은 언어 발달때문에 그렇습니다. 더 노력하겠습니다.
배속으로 들으실 생각도 못 할 정도로 낮은 지능과 예의 없는 말투를 지니고 계시네요🙂
그래서 위에안내를 드렸는데굳이 그리말하실 필요가 있나요? 싫으시면 나가면 될것을,,,,
설명을 엄청잘하시네요 ㅎㅎ잘듣고갑니다.강사님
시청해주셔서 감사합니다~ 더욱 좋은 설명을 할 수 있도록 더 노력하겠습니다! ㅎㅎ (강사는 아니고 취미로 올리는 영상입니다 ㅋㅋㅋ)
주피터 노트북에서는 flush=True로 지정하나 flush=False로 지정하나 동일하게 플러쉬가 일어나는군요. 주피터 노트북이 인터렉티브해서 그런거겠죠.
영상 잘 시청해주시고, 따라서 코딩도 해봐주셔서 정말 감사합니다 :) print의 flush 인자에 문제가 있다기보다는 아마 Jupyter Notebook에서 동작하는 time.sleep() 함수에 원인이 있을 겁니다. 한 번 Terminal (Linux, Mac의 경우) 혹은 cmd, Powershell (Windows)에서 실행시켜 보시면 잘 확인될 것 같습니다 :) (무조건 Terminal에서만을 의미하는 것이 아니고 Jupyter Notebook을 사용하지 않는 상태라고 생각하시면 될 것 같습니다.)
@@MutexLock터미널에서는 재대로 작동하는군요. 아마도 주피터 노트북에는 버퍼 개념이 없나봅니다. 들어는대로 프린트를 시키나 봅니다.
제가 성철님의 댓글을 보고, 다시 실행시켜 봤습니다. 1. 일단 제가 첫 댓글을 작성할 때에서의 환경은 웹 브라우저 상의 Jupyter Notebook (jupyter.org에 들어가서)에서 실행시켰었습니다. 그 때 제가 왜 time.sleep()이 문제인 것 같다고 했었냐면, 실행시킬 때마다 sleep이 되지 않고 바로 결과가 나와서 그랬습니다. 근데, 생각해보니 Jupyter Notebook은 Kernel Cache를 사용하기 때문에 바로 바로 결과가 나왔던 것입니다. Kernel Cache를 삭제해주고 실행해보니 (Sleep Time)*(String Length) 만큼 Sleep 했다가 한 번에 모든 글자가 출력되더군요 (flush가 안 됨). (flush = True, False와 상관 없이요.) 2. 그래서 두 번째로 Local에 설치한 Jupyter Notebook에서 실행시켜 봤습니다. 이 때도 실행시마다 항상 Kernel Cache를 비워주면서 실행시켰습니다. 결과는 성철님과 같이 flush의 인자 값에 상관없이 영상에서 flush=True 했을 때와 동일한 결과가 나옵니다. 이 부분은 제가 미처 생각하지 못한 부분이었습니다. 성철님께서 지적해주셔서 제가 이 부분도 알게 되었습니다. 저는 Jupyter Notebook을 그렇게 좋아하지도 않고 많이 쓰지도 않아서 제가 이 부분을 신경쓰지 못 했네요. 이렇게 알려주셔서 감사합니다.
제가 vm웨어 없이 윈도우서버ios 실행시켜버렸는데 탈출하는 방법 있을까요? ㅠㅠㅠ 진짜 멘붕왔어요 ㅠㅠㅠ
답장이 늦어서 죄송합니다 ㅠㅠ 윈도우 서버 ios는 무엇을 의미하는 것인가요?? iso 파일을 말씀하시는 건가요? 만약 맞다면, iso 설치 종료하는 단계가 있거나 안 보이는 경우에는 컴퓨터 재부팅 후에 BIOS에 진입해 부팅순서를 설정해주어야 할 겁니다. 저도 그냥 바로 실행시킨 적이 없어서 확실하진 않지만, 추측컨대 그렇습니다.