"AI 딸깍의 시대" 원리로 돌파하는 Node.js와 CS Part 2 - 스트림 아키텍처와 하드웨어 통제기
안녕하세요 강의 잘듣고있습니다! 풀스택 개발자를 목표로 하고있고, 원리를 배우는게 너무 즐겁고 큰 도움이 되고있습니다. 그런데 당장 nestjs 및 리액트 등으로 웹서비스 개발업무도 할예정인데 nestjs 는 어떻게 공부를하면좋을까요? T 자형 인재가 되고싶습니다! 그리고 강의듣는 순서도 궁금합니다!! 현재 NODE 듣고있고, 유닉스도 결제했습니다..! NESTJS 도 공부빨리해야하는 상황이네요..
안녕하세요. 49. 수동으로 계산하기 램에 주소 0x0d에 0x08의 데이터를 넣는 부분에서 MI와 BUS in을 안꺼주고 AOut 후 Ram in핀을 활성화 할 때 0x0d에 FF가 저장되던데 왜 그런건가요? 버스에 주소값인 0x0d와 a의 값이 0x08이 섞였다 해도 0000_1101과 0000_1000이 섞인 것이니 0xFF가 아닌 0x0D로 나와야하는 것 아닌가요?? 그리고 RI 다음에 클록을 토글시키지 않아도 이미 램에 데이터가 들어가 있는 것은 AO 사이에 플립플롭이 없으니 바로 램에 바로 업데이트 되는 것은 알겠으나 강의에서는 클록 토글을 따로 설명해주셨는데 다른 무슨 이유가 있나요?
ALU 강의에서 질문이 있습니다. 캐리플래그 그러니까 오버플로우 플래그의 경우 5-5계산할 때도 1이 되던데 빼기 연산할 때는 오버플로우의 의미를 가지지 않기 때문에 이 경우에는 빼주는게 맞지 않나요?? SU 신호가 올라오면 CP도 신호가 올라오지 않게 해야하는 것 아닌가 궁금하네요
디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기
wire mem_rd = miss & ~i_cpu_write; 이 코드를 보면 miss (N+1 clk)이고 ~i_cpu_write은 (N clk)인데 ~i_cpu_write 신호는 1 클락을 기다리게 됩니다. 이거에 대해서 AI한테 물어보니 cpu가 pipeline 이면 엄청난 문제가 되고 Handshake / Stall 구조이면 문제가 되지 않는다고 답을 주었습니다. cpu는 pipeline으로 설계한다고 강의 커리큘럼에 나와 있는데 저희가 설계하는 cpu를 cache와 연결 하는 거면 이건 오류가 아닌가요?
메모리 읽기와 쓰기 관련하여. 메모리 읽기라는 명령어가 제어 장치에 입력되었기 때문에 제어장치가 메모리1번지에 접근해서 해당 명령어와 연산을 수행했다고 이해하면 될까요? 아니면 값이 새로 갱신되었다는 플래그를 통해서 제어장치가 Fetch과정을 실행하는 걸까요? 3번지, 4번지에 있는 데이터들을 레지스터에 입력한 뒤에 제어 장치가 ALU에게 연산하라고 하는 제어 신호를 전달한다고 보면 될까요? ALU는 어떤 메커니즘으로 1번째 레지스터에 저장된 데이터가 아니라 2,3번째에 저장된 데이터를 연산할까요?
"AI 딸깍의 시대" 원리로 돌파하는 Node.js와 CS Part 2 - 스트림 아키텍처와 하드웨어 통제기
안녕하세요. AI 딸깍의 시대를 1~4 구매하여 수강 중에 있습니다. 강의를 듣다보니, 의문이 들어서 문의드립니다. AI로 딸깍하니, 얕은 수준으로 다루게 되니 원리를 이해하자를 이야기하고자 해당 강의가 있는 것 같습니다. 실무에서는 라이브러리나 프레임워크로 개발을 진행하게 되는 것 같습니다. 원리를 이해하면 개발을 조금 더 잘하게 된다? AI에 명령을 내릴 때 조금 더 잘 내릴 수 있다? 아니면 장애가 터졌을 때 이유를 알 수 있다? 그것도 아니라면 개발 시 장애를 미리 예측하여 대응할 수 있다로 봐야할까요? 보면서 궁금하여 문의드립니다.
안녕하세요. 현재 Node.js를 학습한 뒤 NestJS를 공부하고 있습니다. 부족한 CS 지식과 Node.js의 내부 동작 원리를 보완할 수 있을 것 같아 강의를 수강하고 있는데, NestJS 학습과 개인 프로젝트를 병행하다 보니 강의를 모두 시청하는 데 많은 시간을 투자하기가 어려운 상황입니다. 그래서 가능하다면 강의 노트를 중심으로 학습하여 시간을 조금 더 효율적으로 활용하고 싶습니다. 혹시 강의 노트만으로도 핵심 내용을 충분히 습득할 수 있을까요? 아니면 영상 강의를 통해서만 얻을 수 있는 중요한 설명이나 실무적인 인사이트가 많은 편인지 궁금합니다. 만약 강의에서만 얻을 수 있는 내용이 많다면 시간을 조금 더 내서라도 영상을 함께 수강하려고 합니다. 의견 부탁드립니다.
강의 2강에 대한 노트에 대한 질문입니다. 💡 [CS 및 실무 적용 Point: MSA와 BFF 아키텍처] 현대의 마이크로서비스 아키텍처(MSA)에서 Node.js는 특히 BFF(Backend For Frontend) 패턴의 핵심 기술로 사용됩니다. 브라우저의 DOM을 다루던 언어적 특성을 살려 클라이언트(React, Vue 등)의 요청을 쉽게 파싱하고, 이식된 운영체제 제어 능력(http, fs)을 통해 백엔드의 여러 마이크로서비스(Java, Python 등)로 비동기 네트워크 요청을 뿌린 뒤, 그 결과를 모아 빠르게 클라이언트에게 반환하는 완벽한 미들웨어 역할을 수행합니다. 해당 설명에서 BFF로 NodeJs를 유용한 이유는 I/O 입출력 특출나기 때문에, BFF로 사용하면, API 요청을 받아서 마이크로 서비스에 통신 요청을 보내는 용도로 사용한다는 건가요? 한번 더 거쳐가면 더 성능이 안 좋은 거 아닌가요? 아니면 원래 SpringBoot로 개발되었던 웹 사이트를 NodeJs로 구현한다면 더 좋다는 의미일까요?
"AI 딸깍의 시대" 원리로 돌파하는 Node.js와 CS Part 2 - 스트림 아키텍처와 하드웨어 통제기
// 3. 작업 종료 알림: end 이벤트를 통해 댐 바닥 확인 streamRead.on("end", async () => { console.log("\\n✅ [종료] 댐 바닥 도착. 모든 데이터 복사 완료!"); // 메서드: 더 보낼 물이 없다고 선언하고 파이프 닫기 절차 진입 // finish 이벤트: 쓰기 파이프가 논리적으로 완벽히 닫혔음을 보장 streamWrite.on("finish", async () => { // 쓰기 파일 디스크립터(번호표) 운영체제에 반환 (메모리 누수 방지) await fileHandleWrite.close(); console.timeEnd("복사_소요_시간"); console.log( `📊 요약: 총 ${chunkCount}회 펌프질, ${pauseCount}회 비상 정지(메모리 방어 성공)`, ); // 메서드: 실험용 임시 파일 삭제 클린업 (unlink) await fs.unlink(SOURCE_FILE); await fs.unlink(DEST_FILE); }); streamWrite.end(); // 메서드: 사용이 끝난 읽기 파일 디스크립터(번호표) 운영체제에 반환 await fileHandleRead.close(); 읽기 스트림과 쓰기 스트림을 종료하는 3번 단계에서 쓰기 스트림을 end 하기 전에 .on finish를 등록을 해야 콘솔에서 요약을 볼 수 있었습니다. 클로드는 레이스 컨디션이 발생해서 그렇다고 하는데 어떤 부분에서 경합이 일어났는지 잘 모르겠습니다.
#include <stdio.h> #include <stdlib.h> int main(void) { char szBuffer[4] = { 0 }; scanf_s("%4c", szBuffer, _countof(szBuffer)); printf("%c%c%c%c\n", szBuffer[0], szBuffer[1], szBuffer[2], szBuffer[3]); return 0; } 위 코드를 똑같이 따라했는데 scanf_s 에 countof 크기 불일치 unsigned 가 나옵니다. 환경 설정도 똑같이 했는데 강사님은 왜 오류가 안나고 저는 나는 걸까요? countof 가 매크로라고 하셨는데 그거랑 무슨 상관이 있는걸까요? 저와 강사님이 쓰는 _countof 함수는 같은거 아닌가요?
강의 내용 중에 궁금한 점이 있어 질문드립니다. #include <stdio.h> int main(void) { char szName[32] = { 0 }; int nAge = 0; printf("나이를 입력하세요. : "); scanf_s("%d", &nAge); printf("이름을 입력하세요 : "); gets_s(szName, sizeof(szName)); return 0; } 처음에는 szName 과 nAge 는 서로 다른 변수이므로 각각 다른 메모리 주소를 갖는다고 생각했습니다. 그래서 scanf_s("%d", &nAge) 를 호출하면 사용자가 입력한 값이 nAge 의 메모리 주소에 저장되고, gets_s(szName, sizeof(szName)) 를 호출하면 입력한 값이 szName 의 메모리 주소에 저장되므로, 두 변수는 서로 다른 메모리 공간을 사용하기 때문에 scanf_s() 에서 입력받은 \n 이 gets_s() 에 영향을 주지 않을 것이라고 생각했습니다. 하지만 실제로는 scanf_s() 로 나이를 입력한 뒤 gets_s() 가 별도의 입력을 받지 않고 바로 종료되었습니다. 강의에서 설명해 주신 내용처럼 scanf_s() 가 남겨 놓은 \n 을 gets_s() 가 읽었기 때문이라고 이해했습니다. 이 부분이 궁금해서 강의를 다시보며 아래와 같이 이해했는데, 제가 이해한 내용이 맞는지 확인 부탁드립니다. - szName 과 nAge 는 서로 다른 메모리 주소를 갖는다. -하지만 scanf_s() , gets_s() 와 같은 입력 함수들은 각 변수의 메모리에서 직접 입력을 받는 것이 아니라, 공통으로 사용하는 stdin 입력 버퍼 에서 데이터를 읽는다. * 이 입력 버퍼는 szName, nAge와 같은 메모리 공간이 아닌 강의 중 강사님이 설명하신 추상화 File의 단 1개의 Buffered I/O로 이해했습니다. -즉, 키보드 입력은 먼저 stdin 의 입력 버퍼에 저장되고, scanf_s() 와 gets_s() 는 이 동일한 입력 버퍼에서 필요한 만큼 데이터를 읽어 각각 nAge 와 szName 에 저장한다. -따라서 scanf_s("%d", &nAge) 는 숫자만 읽고 \n 은 입력 버퍼에 남겨 두며, 이후 gets_s() 가 같은 입력 버퍼에서 남아 있던 \n 을 읽어 바로 종료된다. 제가 위와 같이 이해한 것이 맞는지 확인 부탁드립니다.
let previousContent = ""; const addToFile = async (path, content) => { if (previousContent === content) return; // 중복 실행 방지를 위한 거름망 if(!(await fileExist(path))) return; // file이 존재하는지 않하는 지 체크 try { await appendFile(path, content); previousContent = content; console.log(`✅ ${content} is successfully appended to ${path}`); } catch (error) { if (error.code === "ENOENT") { console.log(`⚠️ ${path} does not exist`); } console.error(`❌ 에러 발생: ${error.message}`); } }; catch error 부분에서 에러 코드로 ENOENT를 사용해서 path가 존재하지 않는 경우를 잡아내는 코드를 작성했지만, 실제로 실행했을 때 appendFile 자체가 이미 새로운 파일을 생성해내는데 성공하였기 때문에 error로 연결되지 않았습니다. 중복 콘텐츠 방지를 위한 if 밑에 또 다른 if로 fileExist를 사용해서 early return을 하는 이런 방식으로 처리를 하는 게 맞을까요? 아니면 제가 놓친 다른 catch error 가 있는 걸까요?
안녕하세요. 최근 디지털 포렌식 분야에 관심을 가지게 되어 관련 공부를 시작하려고 합니다. 디지털 포렌식을 제대로 배우기 위해서는 운영체제와 컴퓨터구조에 대한 기본 이해가 필요하다고 들어, 인프런에서 본 강의를 찾게 되었습니다. 혹시 이 강의가 디지털 포렌식을 공부하기 전에 컴퓨터구조와 운영체제의 기초를 다지기에 적합한 강의인지 궁금합니다. 특히 디지털 포렌식 입문자가 알아야 할 CPU, 메모리, 저장장치, 파일시스템, 프로세스 등의 개념을 이해하는 데 도움이 될지 질문드립니다.