본문 바로가기
MediaSoup 을 사용해서 SFU방식으로 VideoChat 구현하기(1/2) 이론 우리 조 프로젝트는 다대다 화상 통신을 기본으로 하는데, 이 부분을 내가 맡게 되었다. 처음에는 SocketIO를 사용해서 Mesh 방식(P2P)으로 다대다 화상 통신을 구현했는데, Mesh 방식은 1:1 통신에 가장 적합하고, 최대 3명까지 정도에 적합한 방식이라는 의견이 많아서 최대 5인 까지 통신해야 하는 우리 프로젝트 특성을 고려해 미디어 서버를 두는 방식으로 변경하기로 했다. Mesh와 MCU, SFU 방식의 가장 큰 차이는 아래 그림으로 대체하겠다. P2P 방식인 Mesh 방식은 참여자가 모든 다른 참여자에게 자신의 자신의 영상을 보내야 하지만 SFU 방식에서는 미디어 서버에 한 번만 보내면 된다. 구조상으로는 MCU가 가장 간결해보이지만 이 경우 미디어 서버의 부하가 커지기 때문에 우리 조는.. 2023. 1. 22.
reason: BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer 에러 해결 클라이언트로 받은 form 데이터를 mongoose 를 사용해서 mongoDB에 저장할 때, 필수값이 아니고, 자료형이 ObjectId인 데이터가 있었다. 클라이언트에서 해당 값이 null로 들어오기 때문에 그대로 mongodb에 넘겼는데 여기서 계속 에러가 났다. reason: BSONTypeError: Argument passed in must be a string of 12 bytes or a string of 24 hex characters or an integer 위와 같은 에러였는데 처음에는 급하게 해결하느라, 이 값이 null 이면 아예 이 값을 빼고 create 하도록 했었다. if (classMaterial === 'null') { await Class.create({ title, sta.. 2023. 1. 21.
[mongoDB] mongoDB에서 mongoose로 가져온 데이터 가공해서 클라이언트로 리턴하기 (Date 타입 조심하자) 까먹을까봐 급하게 쓰는 글. (정글 끝나면 좀더 보기좋게 수정할게요 ㅠㅠ ) 몽고db는 데이터를 기본적으로 UTC로 저장하기 때문에(Zulu Time) 클라이언트에게 리턴해 줄 때 이를 한국 시간으로 변환해서 줄 필요가 생겼다. find() 로 원하는 document 들의 배열을 forEach문으로 돌면서 가공해서 리턴하려고 했는데, 아니 어떻게 해도 데이터가 안바뀐다.. 어떻게 해도 날짜 데이터값은 바뀌지가 않아서 deepCopy도 시도해보고 온갖 난리를 쳐보다가 찍어본 console.log 데이터를 보고 힌트를 얻었다. 아래 startDateTime만 값이 숫자도, 문자도 아닌 뭔가 다른 데이터 형이다 ..! 설마해서 new Date()를 사용해서 데이터 객체를 생성해서 변경했더니 드디어 변경이된다... 2023. 1. 21.
TCP 3-way handshake 과정을 와이어샤크로 확인해보기! TCP 통신의 3-way-handshake를 공부하다가 이 과정을 조금 더 구체적으로 이해해보고싶어서 이것저것 찾아보니, 와이어샤크라는 오픈소스를 사용해서 패킷의 정보를 확인할 수 있다고 해서 직접해보았다! 우선 wireshark 홈페이지에서 MAC arm 버전을 다운 받았다. 현재 맥북에어 m1을 사용하고 있는데 문제없이 설치가 되었다! ( Chmod와 Wireshark to the system path 까지도 다 같이 설치했다..! ) 자주 사용하는 캠프릿지 영어 사전 웹사이트로 테스트를 해보기로 했다. 터미널에서 nslookup으로 해당 웹사이트의 ip주소를 확인한다. (명령어: nslookup {도메인명} ) nslookup dictionary.cambridge.org 패킷을 확인하기 위해 와이어.. 2022. 12. 19.
git push할 때마다 username, password(키체인) 입력 안하게 하는 방법 예전에 로컬에서 깃 푸시가 안돼서 이것 저것 알아보다가 키체인을 만들어서 푸시한 이후로 계속 git push origin master 할때마다 계속 username, password를 입력하게 되었는데 여간 불편한게 아니었다... 데브옵스 남자친구께서 우연히 이 상황을 보시고 곧 해결해주시었다.. 나와 같은 사람이 또 있을 수 있으므로 해결 방법을 블로그에 남겨보도록 한다!! 이렇게.. 푸시만 하면 나에게 username와 비밀번호를 묻는다. git 아이디랑 keychain을 올바로 입력해야만 원격으로 푸시가 된다. 해결 방법 1. $ git config --global user.name 깃헙id 2. $ git config --global user.email 깃헙이메일주소 3. $ git config .. 2022. 12. 10.
[os] pintos의 load 함수 흐름 유저 프로세스 흐름을 다룰 때, load 함수는 대충 넘어갔었는데, project3의 virtual memory에 들어오고 나니 load 함수를 제대로 파악하지 않으면 결국 코드를 적을 수 없다는 것을 깨닫고 load 함수를 파헤쳐보았다. 덕분에 ELF 파일에 대한 공부도 되고, demand_paging 방식을 구현하기 위해 lazy_load 함수를 작성할 때 보다 수월하게 진행할 수 있었다. 한줄씩 자세하게 설명을 적고싶지만 아직 이번주 과제도 한참 남아서 우선은 그림을 먼저 올리고 시간이 남는다면 ㅠ 한줄씩 풀어보도록 하겠다! 위와 같은 load 함수가 호출하는 load_segment 는 어떤 흐름일지 우선 project 2까지의 load_segment 함수의 흐름을 정리해보겠다. (project3에.. 2022. 12. 9.
[os] 그림으로 보는 vm_alloc_page_with_initializer 함수 WH와 JW가 칭찬해준 그림... 이번주 끝내고 나에게 하루만이라도 시간이 있다면 이 그림과 더불어 상세한 설명을 다시 적을 수 있길 바람... 2022. 12. 9.
[os] 그림으로 보는 핀토스의 가상메모리와 물리메모리의 관계 오랫동안 나를 힘들게 했던 핀토스의 가상메모리와 물리메모리의 관계.. ^^; 삼주동안 열심히 들여다보면서 드디어 이 관계가 조금 명확해 진 것 같아 도식화 하였다. 미래의 핀토스 학생들에게 도움이 될 것이라 믿어 의심치 않으며 그림을 공유합니다 ㅎㅎㅎ 2022. 12. 6.
[OS] pintos의 interrupt frame 이란 + do_iret 함수가 하는 일 인터럽트 프레임 및 do_iret 함수 인터럽트 프레임이란 무엇인지, 그리고 do_iret 에서는 어떤 일을 하는 건지 이제서야 조금 알 것 같아 별도로 글을 작성한다. struct intr_frame do_iret을 이해하려면 인터럽트 프레임 구조체의 크기와, 인터럽트 프레임 구조체 내의 gp_registers 구조체, 그리고 나머지 멤버변수들의 크기를 알고있어야 한다. 데이터 크기 각각의 사이즈를 모두 출력해보았다. (뭘 굳이 찍어봐야 아나 싶은 것들도 있지만 난 아직도 데이터 크기가 어렵다 😭 ) printf( "인터럽트 프레임 사이즈: %d \\n", sizeof(struct intr_frame)); printf( "gp_registers 사이즈: %d \\n", sizeof(struct gp_r.. 2022. 11. 29.
반응형