2021-02-02-TIL
2021-02-02-TIL
네트워크를 일상의 비유로 보기
버스는 모든곳을 다 들른다는 의미에서 CPU에서의 버스, 네트워크 버스도 동일한 의미를 가진다.
버스는 여러 장치가 하나의 통신선을 함께 쓰는 구조다. 컴퓨터 안에서는 CPU, 메모리, 입출력 장치가 같은 버스에 연결되어 데이터를 주고받고, 네트워크의 버스형 구성에서는 모든 노드가 하나의 케이블에 붙는다. 어느 쪽이든 한 노드가 보낸 신호가 버스에 붙은 모든 노드에 닿는다. 그래서 동시에 둘 이상이 보내면 신호가 충돌하므로, 누가 언제 쓸지를 정하는 규칙이 필요하다.
오늘의 톱니바퀴 베이스 : 실 전화기
- 종이컵 : Entity, Transmitter/Receiver, End-point, Terminal, Node
- 실 : Medium, Link
실 전화기는 통신의 최소 구성을 그대로 보여 준다. 말을 보내고 받는 양 끝(노드)과, 그 사이에서 진동을 전달하는 매체(링크)다. 네트워크 용어가 많아 보여도 대부분 이 두 가지 중 하나를 가리키는 다른 이름이다.
왜 토폴로지는 모두 2D인가?
종이 출석부/서명를 뒤로 넘기는데, 옆 분단에서 넘겨주는 경우
토폴로지는 노드가 어떤 모양으로 연결되어 있는지를 나타내는 그림이다. 출석부를 앞에서 뒤로 넘기는 교실은 노드가 한 줄로 이어진 구조이고, 옆 분단에서 넘겨받는 경로가 생기면 연결 모양이 달라진다. 토폴로지는 실제 공간 배치가 아니라 누가 누구와 연결되어 있는지만 나타내므로, 평면 위의 그림으로 충분히 표현된다.
브라우저의 콜백 처리
브라우저의 경우 worker1가 아예 없고 worker2만 있어서 콜백을 받아서 처리하는 코드만 구현해놓는 경우도 많다.
생각해 볼 질문
DNS 룩업 과정을 설명해보세요.
웹 브라우저를 통해서 사이트에 접속하는 과정을 설명해보세요.
두 질문은 이어져 있다. MDN의 설명을 따르면 주소창에 웹 주소를 입력했을 때 브라우저는 먼저 DNS 서버에서 그 사이트가 있는 서버의 실제 주소(IP 주소)를 찾는다. 그다음 그 서버에 HTTP 요청 메시지를 보내고, 이 메시지와 응답은 TCP/IP 연결 위로 오간다. 서버가 응답으로 보낸 파일들을 브라우저가 조립해 화면에 그린다.
DNS 룩업 단계만 보면, RFC 1034는 질의 방식을 두 가지로 나눈다. 재귀(recursive) 질의에서는 질의를 받은 이름 서버가 대신 끝까지 찾아서 답이나 오류만 돌려준다. 반복(iterative) 질의에서는 이름 서버가 답을 모르면 “더 가까운 이름 서버는 저기다”라는 안내(referral)를 돌려주고, 질의한 쪽이 그 서버에 다시 묻는다. 내 컴퓨터는 보통 재귀 질의를 처리해 주는 DNS 서버에 물어보고, 그 서버가 루트, 최상위 도메인, 해당 도메인의 이름 서버를 차례로 따라가며 답을 찾는다.
네트워크 공부하다 보면 항상 Markov Chain 과 Bayesian 확률이 나오던데, 공부해두어야 할까요? 전에 교수님이 이거 2개 모르면 개발자로 취업 못한다고 했는데, 지금도 잘 이해가 안갑니다. 공부 의욕이 생기게 네트워크에서 이 2개가 왜 중요한지 설명 부탁드려요!
미션 진행 중 막힌 문제
탈출안되는 문제 -> </html> 기준으로 탈출
리턴 코드 안나오는 문제
비전공자의 CS 공부 방법
- 기술이 나온이유를 찾는다
- 기술을 간략하게 본다
- 기술이 응용된 사례를 본다
- 간략하게라도 의사코드로 구현해본다
이런식으로하니까 머리에좀들어오더라고요
Jung이 비전공자인데 CS공부를 어떻게 하냐는 질문을 했다. 매주 과제를 받을때마다 모르는 키워드들이 한 페이지에만 4~5개 이상 쏟아진다고 한다. 그래서 거기에 대해 주고받은 대화를 통해 내가 생각한 내용을 간단히 글로 정리해보았다.
이 순서에서 첫 단계는 나머지 단계의 기준이 된다. 기술이 왜 나왔는지 알면, 그 기술이 해결하려던 문제가 기준이 되어 나머지 세부 사항이 그 기준에 붙는다. 모르는 키워드가 한꺼번에 쏟아질 때도 각각을 “무엇을 해결하려고 나왔나”라는 질문 하나로 정리하면 한 페이지의 키워드들이 서로 어떻게 연결되는지 보이기 시작한다.
문제 풀이에서 흔히 하는 실수
Integer.toString(0)는 0으로 변환하지 않는다.
이 메모는 다시 확인이 필요하다. Javadoc 기준으로 Integer.toString(int)는 인자를 부호 있는 십진수 문자열로 바꾸므로 Integer.toString(0)은 "0"을 돌려준다. 헷갈리기 쉬운 경우는 앞자리 0이다. int에는 앞자리 0이라는 정보가 없어서 숫자를 문자열로 바꾸면 사라진다. 게다가 JLS 3.10.1에 따르면 Java 소스에서 0으로 시작하는 정수 리터럴은 8진수로 해석된다. 그래서 010은 십진수 8이고, Integer.toString(010)은 "8"이다. 앞자리 0을 유지해야 하면 처음부터 문자열로 다루거나 String.format("%03d", n)처럼 형식을 지정한다.
- int의 범위를 초과할 수 있는 케이스에 대해 long을 사용해야한다.
- 이차원 배열 상에서 시뮬레이션 하는 경우, 범위를 벗어나지 않도록 검증해야한다.
첫 번째 실수는 int의 최댓값이 약 21억(2^31 − 1)이라는 데서 나온다. 곱셈이나 누적 합에서 이 값을 넘으면 예외 없이 음수 같은 엉뚱한 값이 된다. 피연산자가 모두 int이면 결과를 long 변수에 담아도 계산은 이미 int로 끝난 뒤라 소용이 없으므로, (long) a * b처럼 계산 전에 한쪽을 long으로 바꿔야 한다.
두 번째 실수는 ArrayIndexOutOfBoundsException으로 이어진다. 상하좌우로 이동하는 시뮬레이션에서는 다음 좌표를 계산한 직후, 배열에 접근하기 전에 0 <= nx && nx < n 같은 범위 검사를 먼저 둔다.
댓글
아직 댓글이 없습니다