[리뷰 : 퀴즈 1] [알리 Nahm, Oreoluwa Barbarinsa, 루카스 프레이 타스, 롭 보우 덴] [하버드 대학] [이 CS50입니다.] [CS50.TV] [루카스 프레이 타스] 모든 사람을 환영합니다. 이 퀴즈 1에 대한 리뷰 기사입니다. 그냥 부인,이입니다 - 내 말은, 우리가 다루려고하는거야 가능하지만, 한 많은 자료가 의미하지 않습니다 우리는 퀴즈 1에서 할 수있는 일을 모두 커버하는 것입니다. 그래서 당신은 또한 강의 봐, 섹션, 당신이 할 수있는 모든 일을해야합니다. 퀴즈 1 일 수요일 다음 주 수요일에있을 것입니다. 그래서 공부를해야합니다. 그것은 첫 번째 퀴즈처럼 꽤 많이 될 것 해당 형식에 대한,하지만 아마 훨씬 더 될 것입니다. 내가 50을했을 때 적어도 작년, 나는 훨씬 더 생각했다. 그래서 많이 공부합니다. 나는 데이터 구조를 커버하는거야 및 허프만 코딩. 따라서, 많은 사람들이 복잡 생각 무언가 그러나 나는 가능한 한 쉽게 만들기 위해 노력하겠습니다. 우선, 우리가 너희들이 퀴즈 1 알고 싶은이다 내가 제시하는거야 데이터 구조의 각각의 개념에 대한 설명을 이해합니다. 즉, 당신이하지 않는 것을 의미한다 실제로 퀴즈 1 해시 테이블을 구현한다. 우리는 당신이 전체의 해시 테이블을 구현하지 않습니다 어쩌면 우리는하려고합니다 당신은 몇 가지 기능을 구현할 수 있도록하기 위해, 가장 일반적인 작업,하지만 우리는 당신이 모든 것을 구현하지 못할 것입니다. 따라서 각 데이터 구조의 뒤에 개념을 이해하는 것이 중요합니다 또한 당신이 C 코드 할 수 있는지, 그들 각각의 데이터 구조가 단지 가장 일반적인 작업. 또한, 포인터와 구조체를 검토 할 수 그들은 이러한 데이터 구조에 많이 나타납니다 때문이다. 첫째, 연결리스트. 연결리스트는 실제로 배열과 매우 유사하다, 하지만, 연결리스트와 어레이 사이의 차이, 우선, 연결리스트는 매우 유연한 크기를 가지고있다 어레이에서 어레이에 대한 매우 큰 크기를 선택하는 하나를 가지고있는 동안, 그래서 당신은, 당신이 배열의 모든 데이터를 저장 할 수있을 거라고 알고 또는 당신은 배열의 유연한 길이가의 malloc를 사용해야합니다. 연결리스트에서 그것은 단지 더 많은 요소를하는 것은 매우 쉽습니다, 링크 된 목록에 추가 요소를 넣어 또는 요소를 제거합니다. 실제로, 링크 된 목록이 정렬되지 않도록하려면, 당신이 검색하고 일정 시간의 요소를 제거 할 수 있습니다, 그래서 O (1) 시간은, 그래서 아주 편리합니다. 당신은, 노드 항상 MALLOC 기억에주의하고 무료로이 당신이하지 않으면, 당신은 메모리 누수가있을 것이다해서. 그래서 링크 목록 - 노드의 정의는 우리가 바로 거기에 무슨 같다. 나는 INT의 N을 넣어,하지만 당신은 당신이 원하는 어떤 데이터를 저장할 수 있습니다. 당신은 문자열을 저장하고 싶다면, 괜찮아. 당신이 구조체를 저장할 경우에, 당신이 원하는대로, 이중 괜찮아요. 난 그냥 여기에 예제 INT의 N을 넣어. 그리고 당신은 다음 노드에 대한 포인터가있다. 그래서, 기본적으로, 링크 된리스트는 일부 데이터를 가지며, 그리고, 그것은 다음 노드로 포인트. 는 연결리스트의 마지막 요소의 경우, NULL로 가리킬 것입니다. 그래서이 연결리스트의 예입니다. 좋아, 지금은 연결리스트의 요소를 삽입 할 경우의 우리가 무엇을해야하는지 살펴 보자. 첫째, 함수 삽입 void 형식이 될 것입니다 나는 아무것도 반환하지 않기 때문에. 그리고 인수로 int를 걸릴거야, 내가 삽입 할 무엇을 알고 싶어하기 때문이다. 그래서 가장 먼저 할 일은 무엇인가? 글쎄, 난 newnode에 MALLOC한다, 그래서 첫 번째 줄입니다. 난 그냥 연결리스트에 넣어 새 노드를 만드는거야. 그래서 내가 무엇을 할 수 있습니까? 글쎄, 우리가 알고있는 연결리스트의 구현 방식에 클래스에서, 우리는 항상 전역 변수로 머리를 넣어. 그래서 우리가 할 수있는 것은 머리를 변경합니다. 나는이 새로운 노드가 새로운 머리가 될 수 있습니다, 그것은 이전의 머리를 가리거야. 우리가 어떻게 할 수 있습니까? 나는이해야 할 첫 번째 것은 , 값을 새 노드의 'N'을 변경합니다 함수에 전달 하였다. 그런 다음 newnode 다음의 머리가 될 것입니다. 머리는 newnode 될 것입니다. 그래서 아주 간단합니다. 노드를 삭제하기 위해, 우리는 같이 할 수 있습니다 - 우리가 할 수있는 한 가지 방법은 말을하는 것입니다, 좋아, 내가 삭제하려는 경우, 예를 들어, 3, 내가 할 수있는 것은 바로 이전 노드를 포인트 (3)의 다음 노드. 그래서 난 그냥 그런 일을 할 것입니다. 그러나 그 일의 문제는 무엇인가? 난 메모리 누수가있다, 그래서 나는 더 이상 숫자 3에 액세스 할 수 없습니다. 그 문제는 내가 그 노드를 확보 할 수있을 않을 것입니다. 난 메모리 누수와 (이해할 수없는)이 나를 미워하는 것입니다해야하겠습니다. 그래서 그 대신 그 일을, 나는 아마 임시 포인터가 있어야합니다. 그래서 온도를 넣어. 내가 삭제할 노드를 가리키는 것입니다. 그리고 나서 다음 노드로 지점 이전 노드를 이동할 수 있습니다 I 삭제할 노드의. 그리고 마지막으로, 나는 포인터를 확보 할 수 있습니다. 나는 바로 거기에 생성 된 포인터를 해제해야합니까?에게 나는에, 그냥 있기 때문에이 없습니다 - 차이는이 노드의 malloc를 사용하여 만든 것입니다, 이 하나는 그냥 스택의 NULL 스위치로 선언하는 동안 그래서, 힙입니다. 그래서 나는 그것을 해제 할 필요가 없습니다. 좋아요. 그래서 지금의이 스택에 대해 이야기하자. 스택은 매우 간단합니다. 우리는 단지 배열을 사용하여 클래스에서 스택과 큐를했다, 하지만 당신은 알고 있어야합니다 - 그냥 인식 당신은 또한뿐만 아니라 링크 된 목록을 사용하여 큐에 스택을 할 수있다. 배열을 가지고있는 경우에 어떤 일이 스택 것입니까? 스택은, 우선, 크기를 가져야한다. 당신은 당신이 지금 가지고있는 스택의 크기 무엇 저장해야합니다. 또한 당신은, 숫자의이 경우, 배열이있을 것입니다 당신이 원하는 경우에, 그 배열이 될 수 있습니다 문자열, 구조체의 배열, 저장하려는 아무것도. 스택 소개 : 스택과 연결리스트의 차이 스택 만 스택에 배치 된 마지막 요소에 액세스 할 수 있습니다. 그것은 처음으로 중, 마지막에 불렀다. 당신이 트레이의 스택을 가지고 것처럼, 당신이 스택의 상단에 트레이를 두는 경우에, 당신은 다른 트레이에 액세스 할 수 있도록 먼저 트레이를 제거해야합니다. 그것은 스택과 같은 것입니다. 제가 예를 들어, 스택에 요소를 추가 할 경우에, 나는 무엇을해야 하는가? 그것은 푸시라고, 그것은 매우 간단예요. 당신이해야 할 첫 번째 일이 확인되면, 스택의 크기 크거나 스택의 용량과 동일하지 않다. 이미 전체 용량에 있다면, 당신은 무엇을 추가 할 수 있기 때문이다. 하지 않을 경우 다음, 당신은 스택에 요소를 추가해야합니다. 그리고 마지막으로, 크기를 증가. 그래서 그것은 매우 간단합니다. 그래서 난 그냥 숫자 2를 추가합니다. 나는 팝 싶은 경우에, 이는 내가 제거 할 것을 의미합니다 첨가 원소의 값을 리턴 된 마지막 요소 제가 확인해야 할 첫 번째 일은 스택이 비어 있지 않은 것입니다. 비어 있다면, 난 아무것도 반환 할 수 있기 때문이다. 그 경우는 -1을 반환하고 있습니다. 그렇지 않으면, 나는 사양의 크기를 감소시킬거야, 숫자 (s.size)를 반환합니다. 이유는 크기를 감소하고 s.size를 반환 했습니까? 이 경우에는, 사양 사이즈 4를 가지고 있기 때문에, 정보 나는 네 번째 요소를 반환하려면, 오른쪽? 그러나 네 번째 요소의 인덱스는 무엇인가? 세. 나는이 크기 않기 때문에 - 3이 될 것입니다, 난 그냥 (s.size) s.numbers을 반환 할 수 있습니다 그것은 3이기 때문에. 그래서 그냥 인덱스입니다. 이제 큐. 큐는 거의 같은 것입니다. 유일한 차이는, 대신에 마지막에있는 데, 먼저 밖으로 먼저 아웃, 먼저이 있습니다. 당신이 콘서트에 가서 기다리고있어 아마 경우, 대신 큐의 스택을 가지고 있다면 당신은 행복하지 않을 것이다. 올 마지막 사람이된다는 것은 콘서트를 입력하는 최초의 사람이 될 것입니다. 당신은 아마 행복하지 않을 것입니다. 큐에서 얻을 수있는 첫 번째 사람은 밖으로 얻을 수있는 첫 번째 사람이다. 따라서 큐의 정의에서, 어레이 크기를 갖는, 게다가 또한 스택 헤드 인덱스 헤드를 가져야한다. 지금 첫 번째 요소가있다. 대기열에는 스택에 대한 강요와 같은 것입니다. 당신은 매우 순진했다, 당신은 말할 것이다, 내가 추진했던 것처럼 잘, 나는 정확히 같은 일을 할 수 있습니다. 이 용량을 초과 아니라면 그냥 확인할 수 있습니다. 이 경우, 나는 그렇지 않으면 그냥 새 값을 내보낼 수 있습니다, false를 반환 다음의 크기를 증가. 그런데 왜이 문제입니까? 의이 예제를 보자. 나는 잔뜩 대기열에 노력하고있어, 그리고 난 큐에서 제거하고 큐에거야. 이 명령의 많은,하지만 그것은 매우 간단합니다. 나는 5 큐에, 그래서 5를 추가하는 것, 다음 7 해요 1, 4, 6, 그리고 그 때 나는 뭔가를 큐에서 제거하려면, 이는 내가 첫 번째 요소를 제거하기 위하여려고하고 있다는 것을 의미한다. 그래서, 오른쪽 숫자 3을 제거하는거야? 첫 번째 요소. 좋아요. 나는 다른 무언가를 큐에 저장하려고하면 이제 무슨 일이 일어날까요? 내 구현에 따르면, 나는 인덱스 q.size 다음 번호를 넣어 가고 있었다. 이 경우, 크기는 8이고, 그래서 인덱스 8은 마지막 위치에 바로 여기에있을 것입니다. 내가 바로 여기에 1을 큐에 저장하려고하면, 나는 마지막 위치를 덮어 쓰기 될 것이다 완전히 잘못된 숫자 1,에. 내가 원하는 것은 주위에 감싸고 첫 번째 위치로 이동합니다. 어쩌면 당신은 잘, 그냥 확인해야합니다 말할 것 사실 뭔가를 넣을 수있는 경우. 그렇지 않은 경우, 난 그냥 오, 새로운 전 용량, 말 실제로 용량 - 1, 당신은이 요소를 넣을 수 없습니다. 그러나 문제는 무엇인가? 문제는 내가 바로 여기 모든 큐에서 제거하는 경우 다음 나는 다른 무언가를 추가하려고, 그냥 말할 것입니다, 글쎄, 당신은 0 전체 용량에 있었다. 그래서 큐가 사라 졌어요. 당신은 주위에 포장해야하고, 주위에 포장하는 방법 당신 비전 및 기타 psets를 배운 사람은 모드를 사용하는 것을. 당신은 당신이 q.size + q.head 할 것이라고 이유를 이해하기 집에서 시도 할 수 있습니다 모드 용량,하지만 당신은 바로 여기에 체크하면, 우리는 그것이 작동하는 것을 볼 수 있습니다. 그래서 마지막 예에서, 8 q.size했다 그것은 여기에 배열의이 위치 때문에 헤드는 1이었다. 그래서 + 1 8, 9가됩니다. MOD 용량 9 0 일 것입니다. 그것은 인덱스 0으로 갈 것입니다. 우리는 올바른 위치에있을 것입니다. 그리고 집에서 큐를 시도하십시오. 몇 가지 중요한 사항 : 스택과 큐의 차이를 이해하려고합니다. 집에서, 대기열, 대기열에서 제외, 푸시와 팝을 구현하기에 매우 익숙해하려고합니다. 당신이 그들 각각을 사용합니다 때 또한 이해합니다. 그럼 Pokemons들은 무리와 함께 10 초 동안 휴식을 취할 수 있습니다. 그리고 이제 다시 데이터 구조에 가자. 테이블을 해시. 많은 사람들이 해시 테이블을 무서워했다. 문제는 6 세트에, 맞춤법 검사기. 해시 테이블과 시도는, 많은 사람들이 그들을 무서워. 그들은 이해하기 너무 어려운 것 같아요. 그래? [롭 보덴] 문제는 5를 설정합니다. 문제는, 그래, 5를 설정합니다. 감사합니다 롭. 그래. 여섯 허프 N '퍼프, 그래했다. 문제는 맞춤법 검사기 된 5 설정하고 해시 테이블이나 시도를 사용하도록했다. 많은 사람들은 이해하기 매우 어려운 있다고 생각하지만, 실제로는 매우 간단입니다. 해시 테이블은 기본적으로 무엇입니까? 해시 테이블은 링크 된리스트의 배열이다. 배열 및 해시 테이블 간의 유일한 차이점 해시 테이블에 입력 해시 함수라는 것을 가지고있다. 해시 함수는 무엇입니까? 너희들은 여기에서 읽을 수 있는지 모르겠어요. 이것은 해시 테이블의 예이다. 그래서 당신은 31 요소 배열이 있다고 볼 수 있습니다. 그리고 우리는 해시 테이블에서 수행하는 해시 함수를 가지고있다 그 키를 번역하는 것입니다, 각 인덱스에 값 int. 만약, 예를 들어, 내가 B. 해리슨을 위해 선택하고 싶은 경우에, 내 해시 함수 B. 해리슨을 둘 것입니다, 그리고 해시 함수는 24을 반환한다. 그래서 내가 24 B. 해리슨을 저장할 것을 알고있다. 그래서 그냥 배열을 갖는 해시 테이블을 가지는 사이의 차이입니다. 해시 테이블에서 당신은 당신이 말하려고하는 기능을 가지고 있습니다 위치를 저장할 데이터를 저장하는 데 사용됩니다. 해쉬 함수의 경우, 해시 함수 찾고 싶은 그 결정하고 잘 분산이다. 여기에서 볼 수 있듯이, 당신은 내가 상점에 원하는 많은 양의 데이터가 실제로 19 살 것을 볼 대신 모든 자유가 31, 30 및 29을 사용. 그래서 사용되는 해시 함수는 매우 잘 분산되지 않았습니다. 우리가 잘 분산 말할 때, 그것은 우리가하려는 것을 의미합니다 대략적으로, 적어도 하나 또는 각각에 대해 2 - 마찬가지로, 어레이 인덱스의 각각에 대해 1 또는 제 2 차이. 당신은 대략, 배열의 각 연결 목록에서 같은 수의 원소를 갖고 싶어. 그리고는, 해시 테이블에 유효한의 해시 테이블로 볼 수 있는지 확인하기 쉽습니다. 그런 나무. 이 나무입니다. 컴퓨터 과학에있는 나무는 어떤 이유로 거꾸로입니다. 그래서 여기 당신이 나무의 뿌리와 그 잎이있다. 당신은 부모와 자녀에 대한 명칭을 알아야한다. 각 노드는 부모 아래에있는 노드입니다 그 아이가있다. 따라서, 예를 들어, 2, 바로 3 다른 아이의 부모가 될 것입니다 3 1의 부모와가 다른 어린이가 될 것입니다있다. 그리고 1 등 3의 아이가 될 것,하고. 우리는 훨씬 더 흥미로운, 이진 검색 트리라고이 한 노드의 오른쪽에있는 모든 값 바로 여기에, 오른쪽에있을거야 - 오른쪽에, 루트의 요소보다 큰 것입니다. 오른쪽에 내가 여기 숫자 5가있는 경우, 모든 요소 5보다 큰 것, 왼쪽에 있습니다 모든 요소는 5 이하가 될 수 있습니다. 왜 유용합니다? 글쎄, 난 숫자 7이 여기에 있는지 확인하려는 경우, 예를 들어, 난 그냥 처음 5에 가서 내가 볼거야, 5 7보다 크거나 작? 그것은 더 큰, 그래서 나는 트리의 오른쪽에 있어야 할 것 알고있다. 그래서 보는 훨씬 적은 물건이있다. 이진 검색 트리 노드의 구현에서, 난 그냥 데이터를해야하는거야 그래서 INT N은, 당신은 또한 문자열을 가질 수있다 또는 당신이 원하는 무엇이든. 당신이 큰 것을 정의에주의해야합니다 적은 것입니다. 그래서 당신은 문자열이 있다면, 예를 들어, 당신은 정의 할 수 있습니다 오른쪽에있는 모든 것들 큰 길이를 가지고가는 것을, 왼쪽 하단 길이를해야 할 것입니다, 그래서 당신에게 달렸죠. 어떻게 BST 대해 찾아 구현할 수 있습니까? 우리가해야 할 것이다 첫번째 것은 뿌리가 NULL인지 확인합니다. 이 NULL의 경우, 일이없는 것을 의미한다 당신은 나무, 권리가 없기 때문에? 그래서 false를 반환합니다. 그렇지 않으면, 나는 큰 수 있는지 확인하는거야 루트 값보다. 나는 오른쪽에있는 요소를 찾으려고거야 나무의. 당신은 내가 여기에 재귀를 사용하고 있음을 참조하십시오. 덜 있다면 그리고, 나는 왼쪽 볼거야. 그리고 마지막으로, 그렇지 않은 경우보다 작거나하지 아니라면, 그것이 값 자체의 것을 의미한다. 그래서 난 그냥 true를 반환. 내가 만약, 만약, 경우에 사용하는 것이 여기에서 볼 수 있습니다. 그리고, 기억 퀴즈 0에서, 우리는, 만약의 경우,면을 가진 문제가 있었다 당신은 비 효율성을 찾을하기로했다, 과 비 효율성이 경우 사용되는 것이 었습니다. 당신은 다른 경우, 만약 그렇지 않으면, 경우에 사용하고, 다른 있어야합니다. 경우와 다른 경우 및 다른 여기에 그래서, 나는 다른 사용해야합니까? 않는 사람 - 그래? [학생의 말하기, 청취 불가] 그거 완벽하네요. 그래서 그녀는 문제가되지 않는다는 것을 말하는 것 다만 때문에 우리가 전에했던 비 효율성 것을, 어떤 조건이 만족 된 경우 어쩌면 때문에 그래서 당신은 작업을 수행했습니다,하지만 당신은 다른 모든 조건을 확인하려고했다. 그러나이 경우는 즉시 반환므로, 문제가되지 않는다. 그래서 당신이 경우 다른 사용할 필요가 없습니다. 그리고 마지막으로,의이 시도에 대해 이야기하자, 이는 모든 사람의 마음에 드는 것입니다. 시도는 배열의 나무입니다. 이 값을 조회하는 것은 매우 빠르고, 그러나 많은 메모리를 사용한다. 그리고 단어를 필터링하는 것이, 그래서 때 휴대폰의 전화 번호부처럼, 예를 들어, 내가 모르는, 구현하려는 당신은 B를 입력 할 수 있도록하려면 그냥 B를 가진 사람의 이름이 그것은 예를 들어, 시도를 사용하여 해당 구현하는 것은 매우 쉽다. 어떻게 시도에서 노드를 정의합니까? 당신은 is_word 될 것입니다 부울을 가지고있다. 즉, 해당 노드 전에 모든 문자를 사용하는 것을 나타냅니다 당신은 단어를 형성 할 수 있었다, 다음 노드에 대한 포인터의 배열을해야합니다. 당신은 우리가 부모 노드의 배열, 그래서 노드 * 배열이 있다고 볼 수 있을까요? 그래? 그래서 그 작동 방식을 살펴 보자. 맞춤법 검사를 들면, 우리는 (27)의 요소의 배열을 가지고, 우리는 모든 문자 플러스 아포스트로피가 있기 때문에. 내가 보드에 쓸 수 있도록 원하기 때문에 여기에 전에 그냥 2를 사용하겠습니다. 좋아요. 그래서이 시도의 예입니다. 난 그냥 첫 번째 노드를 정의하면, 나는 2 요소의 배열을해야합니다 NULL 2 포인터는, 그래서 난 그냥 'A'와 'B'를두고있다. 그리고 is_word을 말한다 부울을거야. 그것은 첫 번째에 대해 false가 될 것, 다만, 때문에 그 전에 당신은 어떤 문자를 사용하지 않습니다. 그래서 빈 단어는 단어가 아닙니다. 그래서 거짓. 나는이 사전에 'A'를 추가하고 싶은 경우에, 나는 무엇을해야 할 것인가? 난 그냥 ''에 대한 새 노드를 MALLOC해야 할 것입니다, 다음 true로 단어를 추가 할 수 있습니다. 그래서 그냥 '이'사실이 될 것입니다 한 것을 나타냅니다. 이해가가? 나는 '바'를 추가 할 경우, 나는 'B'에 대한 malloc에​​ 1로해야합니다, 그리고, 나는, false로 부울을 설정하는거야 그 자체로 'B'는 단어가 없기 때문입니다. 그럼 난 또 다른 ''하나, 그래서 '바'를 MALLOC거야, 그리고 난 사실에 단어의 설정하는거야. '바'는 단어이기 때문이다. 내가보고 싶은 경우에 그리고 B는이 사전에있는 경우 그냥 첫 번째, 'B'로 갈 수 있습니다. 내가 내려 가서, 나는 단어를보고, false를 말합니다. 그래서 단어 아니다. 나는 '바'를 확인하고 싶은 경우에, 나는 첫 번째, 'B'로 이동 한 다음 'A'로 이동, 그리고 사실 확인, 그래서 단어입니다. 이해가가? 많은 사람들은 시도에 의해 혼란스러워. 아니? 마지막으로, 허프만 코딩. 허프만 코딩은 매우 유용합니다 메모리를 저장 한 텍스트 파일을 압축하려면, 다만 때문에 예를 들어, 'A'와 'E'를 사용하여 많은 시간, 너희들이 많은 'Q'또는 'Z'를 사용하면 문서에서,하지만 난 모르겠어요. 모든 단일 문자를 단지 1 바이트를 갖는 것은, 하나 하나 - 우리는 ASCII 테이블이 256 자 매우 최적이 아닌, 당신이 더 많이 사용하는 일부 문자가 있습니다해서, 그래서 당신은 아마 사람들을 위해 더 적은 메모리를 사용한다. 어떻게 허프만 코딩을 사용합니까? 우리는 허프만 트리를 수행해야합니다.  허프만 트리 노드가 문자, 'C', 'B', 'A'처럼 될 것입니다 기호가 그, 당신이 어떤 문자, 단어가 텍스트로 표시되는 주파수의 주파수, 당신에 대한 허프만 트리를 만드는 있다고 다음 허프만 트리의 좌측을 가리 예정 노드 그리고 오른쪽 가리 예정 다른 노드. 그래서 그냥 나무를 좋아한다. 어떻게 허프만 트리를 구축합니까? 당신은 가장 낮은 주파수를 가지고있는 2 노드를 선택하는 것입니다. 당신은 넥타이가있는 경우는 2 노드를 선택하는 것입니다 뿐만 아니라 낮은 ASCII 값이 있는지 확인합니다. 그럼 당신은 그 2 노드 중 새 트리를 만들거야 즉, 부모 노드에 결합 된 주파수를해야 할 것입니다. 그리고 당신은 숲에서 아이들이 2 명을 제거하는 것입니다 부모와 함께 그들을 대체합니다. 그리고 당신은 당신이 숲에서 1 나무를 때까지 반복하는 것입니다. 그래서 당신이 ZAMYLA에 대한 허프만 트리를 수행하는 방법을 살펴 보자. 당신은 모든 문자가 'A'를 제외하고 주파수 1을 가지고 여기에서 볼 수 있습니다; 주파수 2가있다. 그래서 내가 ASCII 값과 주파수의 순서에 넣어 모든 문자에 대한 노드를 만들었습니다. 내가 처음 트리를 만들 수 있다면, 그것은 'L'과 'M'과 함께있을 것입니다. 그래서 여기에 있습니다. 한 쌍의 주파수는 2 될 것입니다 그것이 + 1이기 때문에, 가장 낮은 주파수를 가진 다음 2 'Y'와 'Z'입니다. 2의 주파수를 가지고 - 그리고 제가되는 것은 그들 모두가 있습니다. 따라서 다음 중 하나의 최저 ASCII 값을 가지고있는 사람은 어떤 것들입니까? 'A'와 'L'. 그래서 새로운 노드를 작성, 그리고 마지막으로, 4, 2, 그래서 2는 왼쪽에있을 것입니다. 그리고 이것은 허프만 나무입니다. 내가 약간의 텍스트를 기록 할 그런 경우에, 같은 허프만 트리를 사용하여 텍스트로 변환하는 이진 매우 간단합니다. I가 왼쪽으로 이동하면 0 및 오른쪽으로 이동하는 것을 말할 경우, 예를 들어, 1 무엇을 표현하는 것입니다? 과 같이 1, 1, 오른쪽, 너무 좋아, 다음 너무 왼쪽 0, L 것, 다음 1, 0, 0. 그래서 1, 0, 그래서 그냥 1, 0, 'A'. 그리고, 0, 1, 그래서 'Z'. 그리고 1, 0, 0 - 없음. 0, 0은 'Y', 그래서 게으른 것입니다. 그래서 나를 위해 모두의, 롭은 이상 걸릴 것. [롭 보덴] 그래서, 주 7 물건. 우리는 정말 빠른에 가서 많이 있어요. 비트 연산자, 버퍼 오버 플로우, CS50 라이브러리, 다음, HTML, HTTP, CSS. 15~20분 등 모두. 비트 연산자. 당신이 알 필요가 그들 중 6있다. 비트 및 비트 또는, XOR, 왼쪽 시프트, 오른쪽 시프트, 그리고. 마우스 오른쪽 단추로 이동하고 당신은 거의 모든 강의에서 본 없습니다. 우리는 빨리 여기에 갈거야,하지만이 존재 6 있다는 것을 알고하는 것이 좋다. 비트 연산자는 + 4 3을 할 때처럼 기억하십시오. 당신은 3과 4의 진을 취급하지 않습니다. 비트 연산자를 사용하면 실제로 숫자 3과 4의 개별 비트 다루고있다. 그래서 우리는 말을 가장 먼저 한 비트가 아닌 과 용도 모두 모든 비트를 반전합니다. 당신이 C에서이 작업을 작성하는 경우, 그래서 여기에, 당신은 그것을 쓸 것 ~ 11011 또는 무엇이든, 당신은 그것이 ~ 4처럼 쓴다 다음은 4의 이진 표현을 플립 것입니다. 그래서 여기에, 1의에 ~ 약간의 이진수 1101101 정확히 0의 모든 1의를 플립 것입니다 및 모든 0의의. 내가 거기에 말하는 것처럼, 이것의 사용 빈도, 우리는 몇 가지 숫자에 도달 할 좋아하고 우리가 조금에 볼 수있다 모든 비트는 그들 중 하나를 제외하고, 1 곳. 그래서 수를 표현하는 것이 더 쉽다 단지 하나의 비트가 설정되는 경우, 다음 그것의 ~, 그래서 다른 모든 비트가 하나를 제외하고 설정을. 그래서 우리가 조금 더 사용하려고하는지입니다. 비트 또는. 다음은 2 진수,이 2 번호는 그들은 모든 가능한을 대표하기 때문에, 꽤 대표 비트의 조합은 당신이에서 작동 할 필요가 있습니다. I는 각 비트를 OR 연산 할 때, 여기, 우리는 그냥 곧장 비교하는 것입니다. 그래서 왼쪽에 우리는 1과 1이 있습니다. I 비트 단위의 경우 | 사람들을, 나는 무엇을 얻을 것입니까? 한. 0과 1이 내게 줄 것입니다 | 다음 비트 단위? 한. 비트 1과 0은 같은 것, 하나가 될 것입니다. 비트 0 | 0 날 0을 제공하는 것입니다. 0 경우 | 그래서 0을 수있는 유일한 경우는 0입니다. 그리고 당신은 당신의 논리적 인 ORS와 같은 것을 생각할 수 있습니다. 당신은 참으로 1 거짓 0으로 생각한다면, 같은 일이 여기에 적용됩니다. 그래서 진실 또는 사실은 사실이다, 참 또는 거짓 사실이다. 허위 또는 사실은 사실이다, 허위 또는 거짓 사실은 거짓 만 것입니다. 여기 당신이 알아야 할 예입니다 비트 연산자를 사용하는 경우의 아주 좋은 예로서. 여기가 우리 또는 Ox20와 자본 'A', 우리는 우리가 뭔가를 얻을, 두 번째로 이러한 살펴 보겠습니다. 그리고 우리 또는 소문자 'a'는 Ox20, 우리가 뭔가를 얻을 경우. 그럼 ASCII 테이블을 당겨 보자. 좋아요. 여기에서 우리는 'A'는 것을 볼 - 여기에서 우리는 'A'는 6​​5 진수입니다있다. 하지만 Ox41입니다 16 진수로 이동합니다. 확신 우리는 클래스에서 그것을 보았다. 나는 우리가 수업 시간에 본 것 같은데 .. 그것은 16 진수에서 이진수로 변환하는 아주 쉬운 것을. 그래서 여기, 내가 진에 4를 넣고 싶은 경우에, 그것은 단지 0100이 될 것. 이것은 1의 장소, 2의 자리, 4 자리 수, 그래서 이것은 4입니다. 그럼 난 0001이 될 것입니다 바이너리로 1을 분할 할 수 있습니다. 그리고이 진에서 'A'의 표현이 될 것입니다. 소문자 'a'는, 지금 Ox61 될 것 촬영, 이진로 이러한 분열 곳, 그래서 6 - 의 실제로하자 - 더 지우개가 없다? 지우개. Ox61. 그래서 바이너리로 6 분할하면 + 4 + 2 + 0 0가 될 것입니다. 그리고 분할 1은 0001이 될 것입니다. 이들 둘 간의 차이를 살펴보면 우리는 소문자와 대문자 'A'사이의 유일한 차이점이 단일 비트입니다 것을 볼 수 있습니다. 좋아요 - 그래서 다시 여기에오고. 우리가 조금 Ox20이 무엇인지를 보면, 여기에서 돌아 오는 바이너리에 이렇게 분할 Ox20, 0010, 0000입니다. Ox20, 설정 만 비트, 우리가에 관심을이 비트입니다 자본과 소문자 'a'를 사이에 전환과 함께. 만약이 하나, 'A'입니다 I 또는 'A',, 경우 I 또는 Ox20와 'A', 나는 무엇을 얻을 것입니까? [학생, 들림] 소문자 ''이 (가) 1이 비트를 플립 것 때문이다. 그리고 만약 내가 또는 'A'Ox20으로, 나는 무엇을 얻을 것입니까? 소문자 때문에 그냥 오링 ''Ox20와, 난 그냥 1이 단일 비트 OR 연산 할거야, 그것은 문제가되지 않습니다 그래서, 이미 1입니다. 그래서 우리는 'A'와 'A'를 얻을. 비트와. 다시 말하지만, 우리는 우리의 논리와 대응으로 생각할 수 있습니다. 왼쪽 측면에서 우리는 우리의 진실 및 진실이 있습니다. 그것은 사실 일 것, 그리고 모든 경우에 대한 것 , 거짓 & 진실 또는 진실 & 거짓, 거짓 & 거짓 그런 것들 중 어느 것도 해당하지 않습니다. 그래서 우리가 그만 둘은 1000입니다. 그래서 지금, 여기, 여기에 내가 신뢰할 수있는 비트를하지 사용했던 곳이다, 우리는 Ox20 있었다 곳. 그래서이 Ox20입니다. 지금은 무엇을하고 싶은지, 비트 Ox20의 ~. 즉, 모든 비트를 반전 할 것이다. 그래서 1101, 1111이 있습니다. 그래서 'A'~ Ox20 날 무엇을 줄 수 있겠나와 AND 연산? 우리가 정말 생각해야 할 유일한 비트는, 이쪽 이후, 이들의 모든 비트가 1로 설정되어 있으면 우리는 정확히 무엇을 '은'였다받을거야, 를 제외하고, 아마도, 어떤이 비트입니다. 이 1 인 경우, 지금은 0으로 설정 될 것 때문에 이 무엇이든간에,이 값이 0이 될 것입니다과 AND로하기 때문이다. 그래서 '는'~ Ox20이 날 줄 것 & 무엇입니까? [학생은 대답 들리지] 그리고 'a'와 무엇인가 - 그것은 'A'입니다. 그리고 ''& ~ Ox20이 날 줄 것입니까? 'A.' 이것은 현재 1 때문이다. 이 0과 AND 연산, 그것은 0을 만들려고 지금 우리는 'A'를받을거야. >>는 모두 'A'이며, 이러한 유형의 마지막으로, 우리는 XOR있다. 그것은 매우처럼 또는, 독점적으로 의미 또는 제외. 이것은 당신이 일반적으로 또는 현실 세계에서의 생각과 같다. 그래서 당신도 'X'또는 'Y',하지만 두 가지를 모두 수행. 여기 ^ 1 1 0가 될 것입니다. 사실 때문입니다 - 그것은 논리적 진실과 거짓과 마찬가지로 잘 작동하지 않습니다 , 비트 & 및 나처럼 하지만, 사실 ^ 사실은 false입니다. 단지 그들 중 하나에 해당하는 경우 우리는 true를 반환하고 싶기 때문에. 그래서 ^ 1은 0입니다. 무엇 ^ 1 0에 대해? 1. ^ 0 ^ 1 0 0 0, 1이다. 따라서 모든 상황에서, 0 비트 일 0 0가 될 것입니다. 1 비트 일 0 또는 0 비트 1, 그것의 경우 | 또는 ^, 그것은 1이 될 것이고, 그것은 &의 경우는 0이 될 수 있습니다. 그리고 1 비트 1이 1이 아닌 경우에만 전용 또는 첨부. 즉, 0110이다. 그래서 지금 여기, XOR을 사용 - 그래서 우리는 다시 20시입니다. 'A'^ Ox20 우리가 비교하고 이러한 2 비트입니다. 그래서 1 ^ 0은 나에게 무엇을 줄 수 있겠나? 하나. 'A'^ Ox20 저를 줄 수 있겠나? 소문자. 'A'^ Ox20 저를 줄 수 있겠나? 자본 A. 이 때문에이 일을 무엇이든, Ox20이 배타적 논리합 효과적으로 비트가 어떤 내리고있다. 이것이 0이면, 이제 하나가 될 것. 이 1이기 때문에, ^ 1은 0이다. 그래서 우리의 'A' 'A'이되었고, 우리의 'A'는 'A'가되었다. 그래서 XOR은 사건을 뒤집기의 정말 편리한 방법입니다. 당신은 문자의 문자열을 반복 할 모든 단일 문자의 경우 교대, Ox20와 당신은 XOR 모든 것을. 이제 우리는 변화를 떠났다. 왼쪽으로 이동은, 기본적으로, 예정 로, 또는 왼쪽에있는 숫자를 모두 밀어, 그들 뒤에 0의를 삽입합니다. 그래서 여기에 우리가 00001101가있다. 우리는 오른쪽에서 3 0의에서 밀어거야 우리는 01101000를 얻을. 이진이 아닌 측면에서, 우리는 정말 13 왼쪽으로 이동 3, 우리 (104)을 제공 다루고있어 것을 볼 수 있습니다. 그래서 왼쪽으로 이동, 우리는 여기에서 볼, X << Y는 기본적으로 X * 2 ^ Y입니다. ^ 3 13 * 2 ^ 3 2 그래서 * 8 (13) (104), 8입니다. 당신은 일반적으로 이진, 어떻게 각 숫자에 대해 생각하는 경우 우리는 오른쪽에서 시작하는 경우, 그 다음 1의 장소, 다음 2의 장소, 4의 장소입니다. 그래서 오른쪽에서 0의에 밀어, 우리는 단지, 8의 곳으로 4의 자리에 있었던 일을 추진 중입니다 그리고 16의 곳으로 8의 자리에 있던 것들. 각각의 이동은 2로 곱합니다. 그래? 당신이 5로 이동하는 경우 [학생] 어떻게됩니까? [보덴]을 5로 이동하면 당신은 자리를 잃게됩니다. 필연적으로, 같은 일이. 마찬가지로, 정수는 32 비트입니다, 당신이 정말 큰 정수를 추가 할 경우에, 그냥 정수에 맞지 않습니다. 그래서 여기에 같은 일이다. 당신이 5만큼 이동하면, 우리는 단지 그 하나를 잃게됩니다. 그리고는 "대략"나는 무엇을 의미하는 종류의 당신이 너무 멀리 이동하는 경우, 당신은 비트를 잃는 곳. 오른쪽 시프트는 반대가 될 것입니다, 우리는 끝으로 공의를 쑤셔 넣어가는 곳 우리의 목적을 위해, 왼쪽에서 0의 입력합니다. 그래서이 일을, 우리는 기본적으로 우리가 이미 한 일을 반대하고 있습니다. 그리고 우리는 오른쪽에있는 세 개의 0 그냥 떨어 졌 볼 우리는 오른쪽 1101 줄곧 밀고. 이렇게하면, X / 2 ^ Y, 인, 104 3을 다하고 있습니다. 그래서 지금, 여기에서, 비슷한 생각이다. 이유는 단지 약 X / 2 ^ Y이며, 실제로 X / 2 ^ Y? 내가 4로 이동 한 경우, 내가 1을 잃은 것 때문에. 기본적으로, 그냥 일반적으로 정수 나누기의 당신이 생각을, 생각합니다. 그래서, 5 / 좋아한다 2 2. 그것은 2.5 아니다. 그것은 여기에 같은 생각입니다. 우리는 2로 나눌 때 우리는 길을 따라 이상한 비트를 잃을 수 있습니다. 그래서 지금 - 그 비트를 위해이다. 즉, 당신이 알 필요가 전부입니다. 우리가 수업 시간에 본 사용 사례를 기억하고, 같은 비트 마스크는 비트 연산자에 유용합니다 또는 당신은 비트 마스크를 위해 그들을 사용합니다. 대문자와 소문자, 변환은 꽤 원형 예입니다. 좋아, 버퍼 오버 플로우 공격. 누군가는이 기능에 문제 있었는지 기억 나? 우리는 12 바이트의 배열, 12 문자를, 선언을 주목하라 그리고, 우리는 12 문자 전체 문자열 표시 줄의 우리의 버퍼로 복사합니다. 그래서 문제는 여기에 무엇입니까? 왜 12 - 마법의 숫자 (12)는 거의 즉시로 튀어해야합니까? 바는 12 개 이상의 문자로 발생하면 어떻게? 어떤 줄이 문자 수백만의 경우? 여기에서 문제는 방어 적이기입니다. 줄이 긴만큼, 경우 그냥 완전히한다 - 'c'는, 'C'는 12 문자 것을 걱정하지 않는다; 'C'는 많은 바이트를 맞지 않을 수 있음을 걱정하지 않는다. 그냥 완전히 문자를 덮어 쓰게됩니다, 우리는 그것을 위해 할당 한 12 바이트, 그리고 메모리에 과거 모든 것을 실제로 버퍼에 속하지 않는 어떤 문자열 표시 줄이있는. 그래서 이것은 우리가 수업 시간에 본 그림이었다 우리는 우리의 스택 성장이 곳. 당신은이 그림을 사용하거나 다시 익숙해해야합니다. 우리는 우리의 스택이 성장했다, 메모리 주소는 상단에 0에서 시작 그리고 하단에 40 억을 좋아 아래로 성장합니다. 우리는 어딘가에 메모리에 우리의 배열 'C'를이 우리는 바로 아래에 바 우리의 포인터를 가지고, 그리고, 우리는이 저장된 프레임 우리의 반환 주소에 포인터와 우리의 부모 루틴의 스택이 있습니다. 반환 주소가 무엇을 기억하십시오? 주요 기능 모음을 호출 foo 함수를 호출 할 때,의 필연적으로, 반환 바. 그럼 언제 바 반환, 그들은 그것을 foo를 호출로 다시 일어나고 있음을 알 필요가있다. 그래서 리턴 어드레스 때 함수가 반환으로 돌아갑니다 그것이 가지고있는 함수의 주소입니다. , 편리하기 때문에 버퍼 오버 플로우 공격에 대한 중요한 이유는 해커는 반환 주소를 변경. 대신 다시 foo는에가는, 다시 해커가 나를 위로 가고 싶은 곳으로 갈거야. 그리고, 편리, 해커는 자주 다시 가고 싶은 곳 우리가 원래 가지고 버퍼의 시작입니다. 그래서, 다시, 작은 인도를 알 수 있습니다. 어플라이언스는 작은 인도 시스템의 예입니다, 그래서 정수 또는 포인터가 반전 바이트로 저장됩니다. 그래서 여기에 우리가 볼 -가 무엇입니까? 그래. 우리는 Ox80, OxC0, Ox35, OxO8를 참조하십시오. 16 진수를 기억 하는가? 우리는 리틀 인도에서 16 진수를 반대하지 않는다 2 자리의 16 진수는 단일 바이트를 구성, 우리는 바이트를 반대하기 때문이다. 왜 우리는, 같은 80530CO8를 저장하지 않는 때문입니다. 우리는 오른쪽에서 시작하는 대신에, 2 자리의 각 쌍을 저장합니다. 그 주소는 시작의 주소를 의미 우리가 실제로 처음에 복사하고 싶어 우리의 버퍼. 유용한 이유는 무엇 경우 때문에 공격자 대신했다 문자열을 갖는, 일어난 등의 무해한 문자열, 자신의 이름이나 뭐, 어떤 경우, 대신, 해당 문자열은 임의의 코드가 있었다 그 그들이하고 싶었던 어떤나요? 그래서 그들은 수 - 어떤 멋진 코드를 생각할 수 없다. 그래도, 무엇이든 될 수 있습니다. 모든 재앙 코드입니다. 그들이 원하는 경우, 그들은 단지 세그 폴트를에서 뭔가를 할 수 있지만, 무의미한 것입니다. 그들은 일반적으로 시스템을 해킹 해. 좋아요. CS50 라이브러리. 이것은 기본적으로 getInt를, getString는 모든 이러한 기능은 우리가 당신을 위해 제공됩니다. 그래서 우리는 문자 * 문자열이, 그리고 우리가 심하다 추상화의 학기 동안 어떤 시점에서. 문자열은 단지 문자의 배열임을 기억하십시오. 그래서 여기에 우리가있는 getString의 축소 된 버전을 참조하십시오. 당신은 그것을 실제로 구현 어떻게 기억하고 그것을 다시 찾아야한다. 주요 세부 사항, 우리는 한 번에 하나의 문자에 얻을 통지 단지 우리가 키보드로 입력처럼, 이는 표준에서. 그래서 한 번에 하나의 문자, 우리는 너무 많은 문자를받을 경우, 그래서 N + 1 용량보다 큰 경우, 우리는 우리의 버퍼의 용량을 증가 할 필요가있다. 그래서 여기에 우리는 우리의 버퍼의 크기를 두 배로하고 있습니다. 그리고가는 계속, 우리는 우리의 버퍼에 문자를 삽입 우리는 새로운 라인 또는 파일이든의 끝을받을 때까지, 이 경우, 우리는 문자열 다음 실제있는 getString으로 완료 우리는 너무 많은 메모리를 할당하면 다시 가서 조금 줄어들 것처럼 메모리를 축소합니다. 그래서 우리는 표시되지 않습니다,하지만 주요 아이디어는 한 번에 하나의 문자로 읽을 수 있습니다. 그냥 한 번에 모든 것을 읽을 수 없습니다, 그들 버퍼는 특정 크기 때문이다. 이 버퍼에 삽입하려고 할 문자열이 너무 큰 경우에 따라서, 그것은 넘칠. 그래서 여기에 우리는 방지하는 단 하나의 문자에 읽어 한 번에 우리가 필요할 때마다 성장합니다. 그래서의 getInt 및 다른 CS50 라이브러리 함수는 getString에 사용하는 경향 자신의 구현에서. 그래서 나는 여기에서 중요한 사항을 강조했다. 그것은 문자열을 얻을 수있는 getString를 호출합니다. getString에 메모리를 반환하지 못한 경우, getString에 뭔가를 mallocs 기억, 그래서 당신은있는 getString을 호출 할 때마다 만약 당신이 (이해할 수없는) 당신이 가지고있는 그 문자열을 해제하지 않아야합니다. 무언가를 MALLOC에 실패 할 경우, 그래서 여기에, 우리는 단지 플래그로 INT_MAX를 반환하는, 이봐, 우리가 실제로 정수를 얻을 수 없었습니다. 당신은 내가 당신에게 돌아이든 무시하거나, 또는한다 유효한 입력로 취급해서는 안된다. 마지막으로, 그 성공 않은 가정, 우리는 특별한 플래그 sscanf 또는을 사용하여 즉, 첫 번째 정수를 일치 그 정수 후 모든 문자와 일치합니다. 그래서 우리가 1과 동일합니다 알 수 있습니다. 그래서 sscanf에서 반환이 성공적으로 얼마나 많은 일치 한 경우? 성공적으로 정수를 일치하면 1을 반환합니다, 이 정수를 일치하지 않는 경우는 0을 반환합니다, 그것은 2를 반환합니다 이 일치하는 경우 정수는 일부 문자 하였다. 그래서 우리는 1 만 아무것도 일치하는 경우 우리는 다시 시도 알 수 있습니다. 그래서 우리가 입력되지 않은 경우 1, 2, 3, C, 또는 1, 2, 3, X, 다음 1, 2, 3의 정수에 저장된 얻을 것이다, X는 문자에 저장된 얻을 것이다 우리는 단지 정수를 원하기 때문에, sscanf 또는 2를 반환하고, 우리는 다시 시도하십시오. 빨리 HTML, HTTP, CSS를 통해 불고. 하이퍼 텍스트 마크 업 언어는 웹의 구조 및 의미이다. 여기에서 우리는 HTML 태그가 강의에서 예입니다. 우리는 머리 태그, 바디 태그,이 우리는, 우리가 실제로 시작과 닫기 태그가없는 빈 태그의 예를 우리는 단지 링크 및 이미지를 가지고. 폐문 이미지 태그가 없습니다; 태그가 할 필요가 모든 것을 수행 단 하나의 태그가있다. 링크는 예입니다, 우리는 당신이 CSS에 연결하는 방법을 볼 수있을 것이다 스크립트는 외부 스크립트에 연결하는 방법의 예입니다. 그것은 HTML은 프로그래밍 언어 아닌, 매우 간단합니다, 그리고 기억. 여기, 당신이 무엇을 할 것이라고 양식을 정의하거나 적어도 얼마나 기억 하는가? 이러한 형태의 행동과 방법을 가지고 있습니다. 당신이 이제까지 볼 방법은 GET과 POST이다. 그래서 얻는 것은이 URL에 배치되는 버전입니다. 이 URL에 넣어하지 않은 POST입니다. 대신, 형태의 모든 데이터는 HTTP 요청에서 더 많은 숨겨진 삽입됩니다. HTTP 요청이 어디로가는, 그래서 여기에 작업을 정의합니다. 그것이 어디로 가는지은 google.com / 검색입니다. 방법. GET과 POST의 차이를 기억하고, 북마크 뭔가를 원한다면, 단지, 예를 들어 말한다. 당신은 POST의 URL을 즐겨 찾기에 추가 할 수 없을 것입니다 데이터는 URL에 포함되어 있지 않기 때문에. HTTP, 지금은, 하이퍼 텍스트 전송 프로토콜입니다. 하이퍼 텍스트 전송 프로토콜, 당신은 그것을 전송할 기대 하이퍼 텍스트 마크 업 언어, 그것은 않습니다. 그러나 그것은 또한 웹에서 찾을 수있는 이미지를 전송, 당신이 만드는 모든 다운로드가 HTTP 요청으로 시작합니다. 그래서 HTTP 단지 월드 와이드 웹의 언어이다. 그리고 여기 당신은 HTTP 요청의 종류를 인식 할 필요가있다. 측면에 여기 HTTP/1.1은 그 버전의 말한다 프로토콜의 내가 사용하고 있습니다. 당신이 그것을 볼 수 있습니다로 거의 항상, HTTP/1.1 될 것. 그런 다음 우리는 이것이 당신이 볼 수도, 대안 POST되고, GET 것을 참조하십시오. 그리고 방문하려고했던 URL은 www.google.com/search?q = 어쩌구 저쩌구했다. 그래서 그 기억이, 물음표 Q = ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ, 양식에 의해 제출되는 물건의 종류입니다. 그것이 나에게 반환 할 수 있습니다 응답은 다음과 같이 보일 것이다. 다시 말하지만,이 될 것입니다 프로토콜로 시작하는, 상태 코드 하였다. 여기가 200 OK입니다. 그리고 마지막으로, 실제로 요청 웹 페이지가 따라야 할 것입니다. 가능한 상태 코드는 당신이 볼 수있는, 당신은 그 중 몇 가지를 알아야한다. 200 OK 당신은 아마도 이전에 볼 수있다. 403, 404 찾을 수 없음, 500 내부 서버 오류 당신이 웹 사이트에 가서 뭔가 깨진 또는 PHP 코드가 충돌하는 경우, 일반적으로 기기에 우리가 가지고있는 반면, 그 큰 오렌지 박스 그 등장과 같은, 뭔가 잘못이다,라고,이 코드가 작동하지 않습니다 또는이 기능의 나쁜. 보통 웹 사이트는 당신이 기능이 실제로 나쁜 무엇인지 알고 싶지 않아 그래서 대신에 그들은 단지 당신에게 500 내부 서버 오류를 줄 것이다. TCP / IP는 HTTP 하에서 1 층이다. 인터넷 월드 와이드 웹 (World Wide Web)의 외부에 있다는 것을 기억하십시오. 같은 당신이 HTTP를 통해 이동하지 않는 온라인 게임을하는 경우, 그것은 다른 통해거야 - 아직 인터넷을 사용하는 것, 그러나 HTTP를 사용하지 않습니다. HTTP는 TCP / IP를 기반으로 프로토콜의 한 예입니다. IP는 말 그대로 인터넷 프로토콜을 의미한다. 모든 컴퓨터는 IP 주소를 가지고, 그들은 그 4 자리 것들 192.168.2.1, 또는 무엇이든 같이, 즉 로컬 한 경향이있다. 하지만 그 IP 주소의 패턴이다. 그래서 DNS, 도메인 이름 서비스, 즉, 실제 IP 주소로 google.com 같은 것들을 번역거야. 그래서 만약 당신이 URL에 해당 IP 주소를 입력하면, 즉, Google에 당신을 가져올 것입니다,하지만 당신은 그 일을 기억하지 않는 경향이있다. 대신 google.com을 기억하는 경향이있다. 우리는이 마지막으로는이 IP의 TCP 부분입니다 포트입니다. TCP는 더 많은 작업을 수행합니다. 당신은 당신의 웹 브라우저를 실행해야, 같은 생각. 어쩌면 당신은 약간의 전자 메일 응용 프로그램이 실행되고; 어쩌면 당신은 인터넷 실행을 사용하는 다른 프로그램이있다. 그들은 모두 인터넷에 액세스 할 수 있어야합니다, 하지만 컴퓨터는 1 무선 랜 카드 또는 무엇이든 있습니다. 그래서 포트는 우리가 분할 할 수있어 방법입니다 이러한 응용 프로그램은 인터넷을 사용할 수있는 방법. 각 응용 프로그램은, 그것에서들을 수 1 특정 포트를 가져옵니다 기본적으로, HTTP 포트 80을 사용합니다. 일부 이메일 서비스는 25을 사용합니다. 낮은 번호의 사람은 소유되는 경향이있다. 당신은 일반적으로 자신에 대한 높은 번호의 사람을 얻을 수 있습니다. CSS, 캐스 케이 딩 스타일 시트. CSS와 우리 스타일의 웹 페이지가 아닌 HTML로. 당신은 당신의 CSS를 넣을 수 3 곳이 있습니다. 그것은 스타일 태그 사이에, 또는 완전히 별도의 파일에 넣은 다음 링크, 인라인이 될 수 있습니다 그리고 여기에 CSS의 단지 예입니다. 당신은이 패턴을 인식해야한다, 첫 번째 예는 우리 몸에 태그를 일치하는 위치 그리고 여기에 우리 몸의 태그를 중심으로하고 있습니다. 두 번째 예를 들어, 우리는 일을 일치하는 ID 바닥 글과 함께, 우리는 몇 가지 스타일을 적용하고 있습니다. 왼쪽에 해당 ID의 바닥 글 텍스트로 정렬을 주목, 본문 텍스트로 정렬 센터 반면. 바닥 글은 몸 안에 있습니다. 그것은, 대신, 텍스트 정렬 몸이 텍스트 정렬 센터를 말한다하더라도, 왼쪽됩니다. 이는 전체 계단식 부분입니다. 당신은 할 수 있습니다 - 당신은 몸의 스타일을 지정할 수 있습니다, 다음 본문에 일이 좀 더 특정 스타일을 지정할 수 있습니다, 사물이 예상대로 작동합니다. 보다 구체적인 CSS 지정자 우선합니다. 난 그게 생각합니다. [알리 Nahm] 안녕하세요 여러분. 나는 당신의 관심을 얻을 수 있다면. 나는 알리와 나는 정말 빨리 PHP와 SQL을 통해 갈거야. 그래서 우리는 시작할 수 있습니다. PHP는 PHP의 약자 : 하이퍼 텍스트 전처 리기. 여러분 모두가 알고있는 바와 같이, 그것은 서버 측 스크립트 언어입니다, 우리는 웹 사이트의 백 엔드에 사용, 그것은 계산, 뒤에 - 장면의 부분을 많이 수행하는 방법. 구문. 그것은 C, 놀랍게도처럼되지 않습니다. 내가 먼저 이동할 수 없습니다 - 항상 당신이 볼 수있는 경우, 시작합니다. 당신은 당신이 중괄호의 새로운 종류를 필요로 볼 수 있으며, 다음은? PHP가 필요합니다. 즉, 당신은 당신의 PHP 텍스트, PHP 코드를 프레임에이 방법을 항상. 그래서 당신이 종류의 첫 번째 장착 C처럼 될 수 없습니다. 당신은 항상 묶어야합니다. 그리고 지금, 주요 구문은 모든 변수는 $ 문자로 시작해야한다는 것입니다. 당신은 당신이 그들을 정의 할 때 그것을 할 필요가있다, 당신은 그것을 할 필요가 당신은 나중에 그들에게 참조 할 때. 당신은 항상 $가 필요합니다. 그것은 거의 당신의 좋은 친구입니다. 당신은하지 않습니다 - C는 달리, 당신은이 변수 타입의 종류를 넣을 필요가 없습니다. 당신은 $를 필요로하는 동안 그래서, 당신은 같이 넣어 필요가 없습니다 INT x 또는 문자열 Y, 등등, 등등. 그래서 약간의 차이. 이것의 결과, PHP가 약하게 형식임을 의미한다. PHP는 약하게 형식 언어이며, 약하게 변수를 입력하고있다. 즉, 그것은 당신이 변수 유형의 다른 종류의 사이를 전환 할 수 있음을 의미합니다. 당신은 INT로 숫자 1을 저장할 수 있습니다, 당신은 문자열로 저장할 수 있습니다, 당신은 플로트로 저장할 수 있습니다, 그것은 모든 숫자 1이됩니다. 당신은 다른 형태로 저장하는 경우에도, 그것은 여전히​​ - 변수 유형들은 마지막에 들고 있습니다. 그래서 여기 보면, 당신은 PSET 7에서 기억한다면, 당신의 대부분은 아마도이 문제를 가지고 있었다. 두 개의 등호, 3 등호, 4 등호. 좋아요, 4 등호가 없지만, 2, 3이 있습니다. 당신은 값을 확인하기 위해 2 등호를 사용합니다. 그것은 형식을 통해 확인할 수 있습니다. 그래서 당신은 첫 번째 예에서 볼 수있는 경우, 나는 num_int ==의 num_string있다. 그래서 INT와 문자열이 모두 있으며, 기술적으로, 1, 하지만 그들은 서로 다른 유형입니다. 그러나 이중 등호, 그것은 여전히​​ 전달됩니다. 그러나, 삼중 등호, 그것은 값뿐만 아니라 다른 유형을 검사한다. 즉, 그것은 여기 그 두 번째의 경우 전달 않을거야 것을 의미합니다 대신 3 등호를 사용하는 곳. 그래서 당신은 이제 모두 표시해야 큰 차이입니다. 문자열 연결은 PHP에서 사용할 수있는 또 다른 강력한 것입니다. 그것은 기본적으로 그냥이 편리한 점 표기법의 그것은 당신이 함께 문자열을 결합 할 수있는 방법입니다. 그래서 당신은 고양이가 있고 개를 가지고 있고, 당신이 함께 2 문자열을 넣어하려는 경우, 당신은 시간을 사용할 수 있습니다, 그리고 그것이 작동하는 방법의 일종이다. 또한 바로 옆에 서로를 배치 할 수 있습니다, 당신은 아래의 예에서 여기에서 볼 수 있듯이, 나는 문자열 1, 공간 문자열 2 에코 어디. PHP는 다음과 같은 그들을 대체 알 수 있습니다. 배열. 이제, PHP의 배열의 2 종류가 있습니다. 당신은 정기적으로 배열 할 수 있습니다, 당신은 또한 연관 배열을 가질 수 있습니다, 우리는 지금 그들을 통해 갈 것입니다. 일반 배열은, 그냥이 C에 그래서 당신은 번호가 인덱스가 있습니다. 지금 우리는 하나를 만들려고하고 있는지 ... - 그래서 이것은 우리가 빈 배열을 생성하는 방법이다, 우리는거야 인덱스 번호 0에 넣어. 우리는 숫자 6, 값 6을 넣어 것입니다. 여기서 하단에 볼 수 있습니다. Where's - 인덱스 번호 1에서 우리는 값 번호 4를 넣어거야 그래서 당신은 6 거기에 볼 수 있습니다, 4, 거기에 그리고, 우리는 물건을 인쇄하는 등, 우리가 시도하고 인덱스 번호 0에 저장된 값을 출력 할 때, 우리가 출력되는 6 값을 볼 수 있습니다. 쿨? 그래서 당신을 위해 정기적으로 배열합니다. 당신은 또한 현재 일반 배열 정보를 추가 할 수있는 또 다른 방법 당신이 말을 추가 할 수 있습니다. 즉, 특정 인덱스를 지정하지 않는 것을 의미한다. 당신은 수를 볼 수 있습니다, 다음 대괄호로 지정된 인덱스가 없습니다. 그리고 알 - PHP는 단지 목록, 옆 자리의 끝 부분에 추가 알게 될 것이다. 그래서 당신은 그 0 자리에서 바로 1을 볼 수 있습니다 2는 제 자리에 바로 거기에 갔다. (3) 이동은 - 물론 거기에 추가됩니다. 그래서 가지 의미가 있습니다. 당신은 지속적으로 추가하고, 그리고, 우리는, 숫자 1의 인덱스를 반향 할 때 그것은 값 2를 인쇄합니다. 그럼 우리가 연관 배열 인 배열이 있습니다. 대신에 숫자 인덱스를 갖는 연관 배열, 그들이하는 일은 그들이 문자열입니다 인덱스를 가지고 있습니다. 당신은 대신에 볼 수 있습니다 - 나는 모든 사람 숫자 인덱스를 없앤, 지금은 키 1, 키 2, 키, 그리고 그들은 모든 문자열다는 것을 의미하는 큰 따옴표입니다. 그래서 우리는 이러한 예를 가질 수 있습니다. 이것의 예는 우리가 TF를 가지고있다, 그리고 그 인덱스 이름입니다. 우리는 칼로리 식사, 인덱스, 이름으로 "알리"를 넣어거야 우리는 문자열 대신 지능이 시간을 넣을 수 있습니다, 다음 인덱스 좋아, 우리는 그 안에 전체 배열을 넣을 수 있습니다. 그래서이 종류의 - 그것은 우리가 가진 방법과 유사한 개념의 숫자와 indices, 그러나 지금 우리는 주위의 인덱스를 변경할 수 있습니다 대신 문자열로해야합니다. 또한, 단지 개별적으로하는 외에,이 작업을 수행 할 수 당신은 하나의 덩어리에서 모든 작업을 수행 할 수 있습니다. 그래서 당신은 그 배열의 TF를 볼 수 있습니다 그리고, 우리는 하나의 거대한 대괄호 세트에 그들 모두를 설정합니다. 그래서 일을 속도를 높일 수 있습니다. 그렇지보다 문체 선택의 더 많은입니다. 우리는 또한 루프가 있습니다. C에서 우리는 다음과 같이 작동 루프가있다. 우리는 우리의 배열을 가지고, 우리는 목록의 끝에 인덱스 0에서 갔다, 우리는 바로, 모든 인쇄? 문제는 연관 배열의 경우 제외 우리는 반드시 그 숫자 인덱스를 모르는 이제 우리는 문자열 색인을 가지고 있기 때문에. 이제 우리는 다시, 당신이 희망 PSET 7에 사용 된 foreach 루프를 사용합니다. foreach는 루프은리스트의 모든 단일 부분을 알 수 있습니다. 그리고 그것은 당신이 정확하게 숫자 인덱스를 알 필요가 없습니다. 그래서 만약 당신이 배열을 넣어, 당신은 foreach는 구문을 가지고, 그래서 foreach는의. , 그래서 내 배열은 PSET라고하며, 다음과 같은 단어, 같은 그리고 당신은 당신이 사용하고자하는이 지역의 임시 변수를 넣어 다만 특정를 개최거야 특정 것은 - 하나의 인스턴스 또는 배열의 한 부분. , PSET의 숫자 1을 개최하고 어쩌면 숫자 6을 개최합니다 다음은 숫자 2를 개최한다. 그러나이 배열의 모든 단일 값을 통과하는 보장된다. 당신이 PHP에 알아야 할 유용한 기능이 필요하다, 출구, 빈, 에코 그래서, 당신은 특정 파일을 포함하고 있는지 확인합니다. 내가보기 엔 당신이 PSET 7을보고 그 기능을 살펴 좋습니다. 당신은 사람들을 알고있을 수 있습니다, 그래서 나는 확실히 정확하게, 사람들은 모두 무엇을하고 있는지 알고있다. 그리고 지금 우리는 정말 빨리 범위를 통해 갈 것입니다. 범위에서, PHP는 C와 달리, 펑키 물건의 종류 그래서 우리는 그냥 빨리 그것을 통해 갈 것입니다. 그래서 우리는 우리가 거​​기 그 화살표에서 시작 가정 해 봅시다. 그리고 우리는 $ I로 시작하는 것입니다. 그래서 변수는 '난', 0이 될 것입니다 우리는 거기에 그 큰 흰색 상자에 인쇄를 유지하는 것입니다. 우리는 I0로 시작하는거야, 그리고, 우리는 그것을 반향 것입니다. 그래서 0이있다. 그리고 우리는 대한 루프를 증가거야 다음은 1의 값이 될거야. , 하나는 3 미만이다, 그래서 for 루프를 통과 할 것 그리고, 우리는 다시 인쇄 볼 것입니다. 우리는 2로 다시 증가거야 2 미만 3이다, 그래서 루프를 통과 할 수 있습니다, 그것은 2를 인쇄 할 수 있습니다. 그런 다음 3가 3 이상인 것을주의합니다, 그래서 우리는 루프의 탈옥 수 있습니다. 그래서 지금 우리가 종료 한 후 우리는 aFunction에 들어갈 것입니다. 좋아요. 그래서 당신은이 변수에 우리가 만들었으니주의해야 'I'변수는 로컬 범위가되지 않습니다. 즉, 루프에 로컬이 아닌 것을 의미, 그 변수는 우리는 여전히 액세스하고 나중에 변경, 그것은 여전히​​ 유효합니다 있습니다. 이제 함수에 갈 경우에, 당신은, 우리는 또한 'I'변수를 사용하는 것을 볼 수 있습니다 우리는 '나'+ + 증가 할 것입니다. 당신은 그 '나'변수의 복사본이 있다고, C를 기반으로, 처음에 생각합니다. 그것은 어느 것이 올바른 것인지, 완전히 다른 것입니다. 우리가 그것을 인쇄 할 때, 우리는 인쇄하려고하는, 'I'+ + 인쇄거야 그 4, 죄송합니다 - 그리고, 우리는 거 야. 그런 다음 우리는 그 기능 중 종료거야, 그리고 우리는 그 화살표가 지금 어디에있을 것입니다. 그 후, 그러나, 함수는 'I'의 값을 변경하더라도 것을 의미 그것은 외부 기능의 변화가 없었다, 기능은 별도의 범위를 가지고 있기 때문이다. 즉, 우리는 'I'를 반향 때, 함수의 범위 내에서 변경되지 않았 음을 의미 그래서 우리는 다시 3을 인쇄하는 것입니다. C.보다 PHP의 범위에 대한 여러 가지 이제 PHP와 HTML에서. PHP는 웹 페이지를 동적으로 만드는 데 사용됩니다. 이 종류의 일을 다른합니다. 우리는 HTML에서 그것은 다른있다. HTML, 우리는 언제나 롭 보이는 방법 등 같은 정적 인 일을 가지고 PHP 반면, 사용자가 누구인지에 따라 일을 변경할 수 있습니다. 나는이있는 경우에는, 나는 "당신이로 로그인 -"한 다음 이름, 내가 이름을 변경할 수 있습니다. 그래서 지금 이름은 요셉입니다 그것은 "나에 대해"을 가지고 있지만 나는 또한 토미을 가지고 이름을 변경할 수 있습니다. 그리고 다른 일이 될 것입니다. 그래서 우리는 그에 대해 여러 가지를 변경할 수 있습니다, 그리고 이름에 따라 서로 다른 내용을 표시합니다. 그래서 PHP는 종류의 웹 사이트에 어떤 일이 일어나고 있는지 변경할 수 있습니다. 여기에 동일합니다. 또, 서로 다른 내용이 있습니다, 당신은 기술적으로 아직도 표면에 동일한 웹 페이지에 액세스하는 경우에도. HTML을 생성. 당신이 할 수있는 2 가지 방법이 있습니다. 그래서 우리는 지금 그 권리를 통해 이동합니다. 첫 번째 방법은 당신이 있습니다 - 네, 죄송합니다. 그래서 그냥, PHP에서 루프에 대한 일반이 다음은 PHP에서 에코 당신은 HTML을 에코. 롭은 HTML 스크립트를 보여준 무슨 사용 다음 그냥 웹 페이지에 인쇄 할 PHP 프린트를 사용. 다른 방법은 당신이 PHP와 HTML을 분리하는 것처럼 작업을 수행하는 것입니다. 그래서 당신은, 루프 시작 PHP의 라인을 가질 수있다 당신은 별도의 일에 HTML의 라인을 가질 수 있습니다, 다음은 PHP로, 다시 루프를 종료합니다. 그래서 그런지, 그것을 분리하는 것. 왼쪽에서, 당신은 당신이 가질 수있는 모든 -을 그것은 PHP의 단지 1 덩어리입니다. 오른쪽에 당신은, 당신은 PHP의 라인을 가지고 있음을 알 수 당신은 HTML의 라인을 가지고 있고, 다시 PHP의 라인이 있습니다. 그래서 무슨 일을하는지에 그것을 분리. 그리고 당신은 그 중 하나의 방법, 둘 중 하나에 대한주의합니다 그들은 여전히​​ 이미지를 인쇄, 이미지, 이미지, 그래서 HTML은 여전히​​ 같은 방식으로 인쇄되어 있습니다. 그리고 당신은 여전히​​ 3 이미지를 웹 사이트에 표시가 나타납니다. 그래서 같은 일을하고있는 2 가지 방법입니다. 이제 우리는 양식과 요청을해야합니다. 롭, 당신이 보여준대로 이 HTML 형태가 있으며, 우리는 단지이를 통해 산들 바람 것입니다. 당신은 행동이 당신은 방법이, 당신의 행동 종류의 당신이 그것을 보낼 것입니다 당신이 보여주고, 방법은 있는지 그것은 GET 또는 POST 될 것. 그리고 GET 요청은 롭 말했다으로, 폼에 넣어려고하고 있다는 것을 의미 POST 요청이 당신이 URL에 표시되지 않습니다 반면에 당신은, URL로 표시됩니다. 그래서 약간의 차이. 그러나, 비슷한 일이 한 가지 POST 및 GET 동등하게 안전하지 않은 점이다. 그래서 당신은, 때문에 당신이 URL에 표시되지 않습니다 생각할 수 있습니다 즉, POST가 더 안전합니다 의미 하지만 당신은 여전히​​ 당신이 보내는 정보를 쿠키에 볼 수 있습니다. 그렇게 생각하지 않습니다에 대한 하나 또는 다른. 주목해야 할 또 다른 점은 섹션도 변수를 가지고있다. 너희들은 사용자의 ID 정보를 얻을 수 PSET 7이 사용됩니다. 무슨 일이 있었이 연관 배열을 사용할 수 있었다, $ _SESSION, 그리고 당신은 다른 것들에 액세스 할 수있어 그리고 여러 페이지에서 다른 일을 저장합니다. 마지막 것은, 우리는 SQL, 구조화 된 쿼리 언어를 가지고있다 이것은 데이터베이스를 관리하기위한 프로그래밍 언어이다. 정확히, 데이터베이스는 무엇입니까? 그들은 테이블의 모음입니다, 각 테이블은 개체의 유사한 종류가 있습니다. 그래서 우리는 당신의 금융 PSET에서 사용자의 테이블을했다. 그리고 왜 그들은 유용합니다? 그것은 영구적으로 정보를 저장하는 방법이므로. 그것은 물건을 추적하고 물건을 관리하는 방법 실제로 다른 페이지 및 유지 트랙에보고. 반면에 당신은 단지 하나의 즉각적인 순간을 저장하는 경우 다음 나중에 사용, 당신은 당신이 저장 한 아무것도에 액세스 할 수 없습니다. 우리는 우리가 SQL 명령에 사용할 주요 4 가지가있다. 우리는 선택, 삽입, 삭제 및 업데이트를해야합니다. 사람들은 너희가 퀴즈에 대해 알고 정말 중요하다. 우리는 빨리 지금 이상 선택 갈거야. 기본적으로, 당신은 데이터베이스에서 행을 선택하고 있습니다. 그래서 만약 당신이 여기이있는 경우 - 우리는이 2 개의 다른 일을 가지고, 우리는 클래스 테이블에서 선택합니다 여기서 최고 - 굉장한 열의 값이 1이다. 여기에서 볼 수 있도록, 우리는 클래스 이름의이 2 가지가 CS50 및 Stat110, 우리는 클래스 ID와 슬로건이있다. 그래서 우리는 모든 정보를 선택합니다. 그런 다음, 그 종류의 최고 열 밖으로 따기 것을 바로 여기에서 볼 수 있습니다 모든 물건은 1이며, 다음은 클래스 ID, 클래스 이름과는 골라 할 수있는 슬로건이 곳. 이 코드에서 정확히 어떻게해야합니까? 당신은 PHP를 사용합니다. 그래서 종류의 PHP와 SQL이 서로 관련되는 방법입니다. 이제 우리는 우리의 코드를 가지고 있고, 우리는 우리의 쿼리 기능을 사용하려면입니다 우리가 PSET 7에서 한, 우리는 SQL 쿼리를 실행하는 것입니다로. 그럼 우리가해야 할 것입니다 - 우리는 항상 거짓이면 행의 배와 동일한 지 확인해야합니다. 그래서 다시, 당신은 유형과 값을 확인하려면, 그것이 작동하지 않는 경우 다음, 당신은 우리가 PSET 7에서와 마찬가지로, 평소와 같이, 사과하고 싶다. 그렇지 않으면, 당신은 그 편리와 모든 루프를 실행하려면 foreach는 우리가 방금 갔다 것을 반복합니다. , 우리는 통해 반복하고 있고 우리는 지난 만들었습니다 지금 의 우리의 쿼리를 전달한다고 가정하자, 지금 우리는 우리의 foreach 루프가있다. 그리고 첫 번째 행은있다, 그래서 여기에 행이 바로 여기,의, 상자에 넣어 진 것. 그것은 그것이이라도 모든 정보를 인쇄하는 것입니다. 그래서 하단에 인쇄 것 "싶어 HTML을 알아?" 이 루프의 첫 번째 완료 되었기 때문에 그런 다음, 다음 행으로 갈 것 그래서 그 때, 그것의 두 번째 줄을 인쇄 할거야 STAT110 될 것입니다있는 모든 순간을 찾아보세요. 마지막으로 하나는 SQL 취약점에 있습니다. 나는 다윗은이 강연에서 조금 감동 알고있다. 나중에이를 읽을 수 있습니다. 정말 재미 있어요. SQL 인젝션은 까다로운 물건의 종류이다. 의 당신이 바로 쿼리로 그 변수를 고집한다고 가정 해 봅시다, 당신은 첫 번째 라인에서 볼 수있는 것처럼. 그래서 오른쪽, 잘 보인다? 당신은 사용자 이름에 넣는거야 당신의 SQL 쿼리에 대한 암호, 당신이 그것을를 발송하고 데이터 테이블에 무엇이든하고 싶어. 그것은 아주 간단 보인다. 그래서, 누군가에두고 말할 수 암호이 또는 텍스트 여기 - 실제로 빨간색 상자에 있어야합니다. 그래서 그들이에 해당 암호를 넣어 봅시다 - 그것은 그들이 입력 한 내용입니다. 그래서 그들은 퍼팅 또는 "1"= 1입니다. 가지고있는 바보 암호의 종류. 이제 그냥있는 대체 할, 당신은 지금 SQL 쿼리에있는 점에 유의합니다, 당신이주의 것이기 때문에 그것은 항상 true로 평가하는 당신은 SQL 쿼리이 모든 정보를 선택할 수 있습니다 또는 당신은 단지 = 1을 가질 수 있습니다. 그래서 항상 true로 평가하는 것입니다. 즉, 해커가 시스템에 침입 할 수 있다는 것을 의미하기 때문 정말 작동하지 않을 것. 이에 대한 해결책은 PDO 시스템을 사용할 필요가 있다는 것이다, 이는 당신이 물음표를 사용하는 것을 의미 무엇 PSET 7에서 사용되는 사람, 인 당신은 당신이 뭔가를 넣어 원하는 위치의 자리에 물음표를 사용하는가는 곳, 그리고, 당신은 쉼표를해야 할 것입니다, 그리고 당신은 나중에해야합니다 당신의 문자열 후, 당신이 원하는 다른 변수는 물음표로 교체합니다. 그래서 당신은 지금이 빨간색 물음표가 점에 유의합니다. 그 후 순서에 장착하는 알 수 있도록 다음 내 문자열 후 변수를 넣어. 누군가가 이런 식으로 작업을 수행하는 경우 즉, 있는지 확인합니다 그들은, 확인 것, 또는 1 = 1 상황이 백 엔드에, 실제로 SQL 쿼리를 중단하지 않도록해야합니다. 좋아, PHP와 SQL의 회오리 바람, 즉 거의 그것의 너무. 여러분 모두에게 행운을 빕니다, 현재 오레곤에 [Oreoluwatomiwa Babarinsa] 모두 좋아. 일부 자바 스크립트를 통해 갈 시간 일부 다른 것들이 매우 빠르게 그래서 우리는 당신에게 오늘 밤을 개최하지 않습니다. 자바 스크립트. 예. 자바 스크립트는 소문에 의하면, 멋진 물건의 종류입니다. 당신이 정말로 자바 스크립트에 대해 알아야 할 것들, 그것은 일종의처럼 웹 응용 프로그램은 일을 할 것입니다 무엇의 클라이언트 쪽 끝. 당신은 단지 서버 측에서 모든 시간을 처리하는 것을 원하지 않는 몇 가지가있다. 모든 작은 상호 작용, 한 가지를 강조하는 일이 사라지게 만드는. 당신은 정말 당신의 서버에 그 모든 시간을 이야기하고 싶지 않습니다. 그리고 그 중 일부는 서버 측에서 수행도 할 수 없습니다. 우리가 자바 스크립트와 같은 뭔가가 필요 이유입니다. 자바 스크립트에 대한 멋진 것들 : 그것은 동적으로 입력됩니다. 이것이 의미하는 것은 프로그램이 알 필요가 없다는 것입니다 당신이 그것을 쓸 때 무엇을, 정확히, 변수입니다. VM이 실행으로 그냥 그렇게 알아낼 수 있습니다. 재미있어 다른 것들 : 그것은 중괄호 언어의, 이는 구문은 C와 PHP와 비슷한 의미합니다. 당신은 당신이 자바 스크립트를 학습 할 때 많은 재 작업을 할 필요가 없습니다. 여기에서 우리는 자바 스크립트를 조금 있습니다. 여기 흥미로운 점은, 당신이 그것을 보면,이다 우리는 머리 태그에 바로 자바 스크립트의 비트가있다. 어떤 것은 기본적으로 그냥 자바 스크립트 파일이 포함되어 않습니다. 이것은 당신이 당신의 프로그램에 자바 스크립트를 포함 할 수있는 하나의 방법입니다. 그런 다음 두 번째 조금, 실제로 일부 인라인 자바 스크립트입니다 아주 CSS로 인라인 스타일과 유사, 그리고 당신은 매우 빨리 거기에 몇 가지 코드를 작성하고 있습니다. 자바 스크립트는 배열을 가지고 있습니다. 매우 유용합니다, 주위에 데이터를 유지하는 또 다른 방법입니다. 아주 좋은 쉬운 문법. 당신은 모든 액세스와 모든 것을 함께 유지하기 위해 괄호를 사용합니다. 너무 복잡 아무것도 없습니다. 일반적으로 자바 스크립트와 스크립트 언어에 대한 좋은 점 당신이 배열의 크기에 대해 걱정하지 않아도됩니다. 당신은 단지에 Array.length를 사용하고 추적 할 수 있습니다, 또한 배열이 성장 또는 당신이 필요로 축소 할 수 있습니다. 그래서 당신은, 어떤 종류에 대해 걱정할 필요가 없습니다 아, 나는 더 많은 것들을, 또는 그런 일을 할당해야합니다. 여기 좋은 점은 자바 스크립트 객체가 있다는 점입니다. 이것은 객체 지향 언어, 그래서 그것이 무엇이 본질적 그룹 데이터에 당신을위한 방법을 함께 구조체 비슷, 하지만 당신은 구조체처럼 또는 연관 배열 구문에 액세스 할 수 있습니다. 그것은 매우 간단하고 당신이 함께 할 수있는 것은 함께 그룹 데이터입니다 당신이 관련 데이터의 무리가 있다면. 당신이 차를 설명하기 위해 필요한 모든 것들이기 때문에, 당신은 다른 장소의 무리에있을 필요가 없습니다. 당신은 자바에있는 개체로 붙일 수 있습니다. 당신은 아마 알다시피, 반복하는 그 지루한 작업 중 하나입니다. 당신은 다시 이상에 해. 당신은 차에있는 모든 개체 얘기해야 또는 당신은 목록 또는 그런 일에 모든 항목을 통과해야합니다. 그래서 자바 스크립트, PHP, foreach는 구문과 유사 있습니다. 이 경우, 루프에 대한이다. 당신은 개체에 대한이 사용하고 싶습니다. 당신이 배열에 이것을 사용하는 경우 발생하는 몇 가지 문제가 있습니다. 그것은 일반적으로하지만, 이들은 매우 유용합니다, 그런 것들 중 하나입니다 당신은 많은 오버 헤드를 제거하기 때문에 당신은 자신에 의해 개체의 모든 것을 끌어 필요가 없기 때문에. 당신은 모든 키 이름을 기억할 필요가 없습니다. 당신은 종류의 구문에서 그들을 다시 얻을. 이것에 대해, 당신은 기억하고 싶은 당신은 테이블을 해시하는 매우 유사한 방식으로, 모든 키를 다시 얻고있다. 당신이에서 기억한다면 당신은 문자열에 둘 것입니다 때, 당신은 뭔가를 얻을 수 즉,와 관련 지을 수 있었던 값을 가지는 것입니다. 당신이 함께 할 수있는 것은, 당신이 모든 권리를 말할 수있다 나는 차에 넣어, 나는 페라리를했다. 그래서 당신은 나중에 다시 문자열 페라리에 넣을 수 있습니다, 당신은 그를 얻을 수 있습니다. 그리고 당신은 루프를 위해 함께 루프에서이 작업을 수행 할 수 있습니다. 그래서 그냥 개체에 대한 자세한. 당신이 기억해야 할이에서 중요한 건 , 당신이 함께 할 때마다 구문과 같은 오브젝트 구조체를 사용할 수 있다는 것입니다 무엇 문자열로 사용하려고하는 유효한 변수 이름이 아닌 경우를 제외하고. 당신이 거기에 보면 그래서, 우리는 공백으로 키가 있습니다. 글쎄, 당신은 object.key 넣어 있다면, 공간, 공간, 공간, 그건 그냥 문법적으로 의미가 없습니다. 그래서 당신은 괄호 구문이 종류에 해당 할 수 있습니다. 또한, 자바 스크립트는 매우 범위 방향 PHP이다. 당신은 범위를 주소의 2 가지 방법이 있습니다. 당신은 변수 앞에 VAR을 가질 수 없습니다, 그것은 단지이 글로벌을 의미합니다. 당신은 어디에서 볼 수 있습니다. 당신이 if 문이를 넣어하더라도, 다른 곳에서 당신의 코드에서 해당 시점 이후에는 해당 변수를 볼 수 있습니다. 또 다른 한가지는, 그러나, 당신이 처한 어떤 기능 제한의, VAR과 함께합니다 당신이 함수에없는 경우에, 잘, 그것은 세계입니다. 당신이 함수에있는 경우 그것은 그 함수 내에서만 볼 수 있습니다. 나는 그래, 예를 들어,하지만하지 않습니다. 그것은 그 중 하나의 위치를 당신은 당신이 세계로 원하는 변수를 관리 할 수​​ 있습니다 어떤 변수 로컬되고 싶어하지만, 당신이주의해야합니까, 당신이 C에서 할 미립 컨트롤의 형식이 없기 때문에, 뭔가 루프에서 선언되는 경우에는 for 루프에서 숙박을 어디로 가는지. 우리가 실제로 위해 자바 스크립트를 사용하는 방법에 대한 걱정 것은 바로 웹 페이지를 조작한다? 내 말은, 그 이유는 우리가이 일을하고 있습니다. 우리는 DOM이라는 것을 사용, 그렇게하십시오. 문서 객체 모델. 기본적으로, 이것이하는 것은 모든 HTML 걸립니다 서로 중첩 된 개체의 무리로 모델을 밖으로. 이 같은으로 시작. 당신은 거기에 코드의 무리가 그 종류의의 나를 위해, 오른쪽에있다 - 당신은 그 조작하기가 매우 어려울 거라고 생각합니다, 당신은 텍스트의 무리를 통해 분석 할 것입니다 때문에 물건을 따로 따로 조각 필요. 그리고 그것은 정확히 무엇을 포맷하지 않은 경우? 나쁜 일이 일어날 것입니다. 그래서, 자바 스크립트는 당신이 돌봐, 당신은 좋은 데이터 구조를 얻을 당신이 문서가 어디에, 왼쪽에있는 것과 같은, 그 안에 당신이 HTML이라는 무언가가 그 안에 당신은 머리와 몸이 그 머리 속에서 당신은, 등등, 기타 등등 기타 등등 제목이. 따라서, 그것은 단지 있도록 웹 페이지를 조작 간소화 오, 난 그냥이 개체에 얘기하고 싶어. 당신은 당신 자신이 만든 다른 개체에게 이야기 할 매우 비슷한 방식으로 정렬. 내가 말했듯이, 모든 DOM은 문서 객체입니다. 하나, 그것은 단지 하나의 장소 그리고 당신은 일을 찾아 그 안에 갈 수 있습니다 그리고 당신은 그것을 할 수 있습니다 -이 거기, 그 일의 이전 스타일, 당신은 document.getElementById를을하고, 여기서 다음 이름, 당신이 아마 말할 수와,이 잠시 후 매우 다루기 힘든 가져옵니다. 그래서 당신은 아마 그렇게하고 싶지 않아. 우리가 가지고있는 이유 우리는이 이후에 대해 이야기거야 다음 일은. 여기에서 중요한 점은, 그 모든 권리, 당신이 바로,이 모든 요소가? 그래서 어쩌면 내가 페이지를로드 뭔가의 색상을 변경할 수 있습니다. 그래서 뭐? 어떻게 내 사용자가 뭔가를 클릭하면? 나는 그들이 뭔가를 클릭하면 재미있는 일을하고 싶다. 우리는 사건이 이유입니다. 당신은 기본적으로 당신의 DOM의 모든 요소를​​ 찾을 수 있습니다, 다음 이봐, 말한다. 이것은로드 또는 누군가가 클릭하면 하거나 마우스 위에, 그것으로 뭔가를 할 때. 그리고 무엇을 당신이 당신이 당신을 위해 이것을 처리 기능을 가지고있다. 이 기능은 이벤트 핸들러입니다. 어떤 놈들이 -이 말을 단지 멋진 방법, 이 이벤트가 발생하면이 기능은 실행됩니다. 그래서 발생하는 이벤트를 처리합니다. 이렇게하면 이벤트 처리기를 배치하는 방법입니다. 나는 몇 가지 버튼이 있고, 당신이 그것을 클릭하면, 그것은 폭발. 그래서 버튼을 클릭하지 마세요. 이것은 바로, 그 접근 방법 중 하나입니다? , 당신은 버튼 태그를 가지고 있고, 클릭에 당신은 말한다 문자열이 아, 그런데, 나를 위해이 폭발하는 일을. 그렇지 않으면, 당신이 방금 만든 일반 버튼처럼. 또한이 다른 방법으로 작업을 수행 할 수 있습니다, 우리가 jQuery를 이야기 한 후 DOM 요소를 잡아하지만,에 의해 우리는을 절약 할 수 있습니다. jQuery를 : 그것은 크로스 브라우저 인 라이브러리입니다. 당신은 거의 아무것도 사용할 수 있습니다. 그리고 그것은 당신에게 작업 도구를 많이 제공합니다. 자바 스크립트는 강력한 동안, 당신이 필요로하는 모든 도구를 가지고 있지 않기 때문에 정말 웹 응용 프로그램을 해결하기 위해 상자 밖으로 당신이 수행 할 수 있습니다. 그래서, 많은 것들을 단순화 당신에게 많은 기능을 제공합니다 당신이 일반적으로 또 다시 이상, 직접 작성해야 할 것입니다 상자 밖으로. 그냥 일이 매우 간단합니다. 당신은 또한 당신이 그 모든 요소를​​ 보자 셀렉터를 가지고 당신의 DOM 훨씬 더에서 간단하게, 대신이 매우 긴 함수 호출을 사용하는 데. 이 선택기에 대한 자세한. 당신은 당신이의 말을하자이 거기,이 나는 ID를 가진 요소 싶어 "바위." 물론, jQuery를, 그것은 단지 $ 다음 파운드가 문자열, 다음의 "바위." 그것은 매우 간단하고이 문제를 다루는 전통적인 자바 스크립트의 방법보다 훨씬 빠릅니다. 그리고 당신은 클래스와 요소 유형에 대한 비슷한 일이 있습니다. jQuery를입니다 - 멋진 기능 중 하나는 일종의 압축 할 수 있습니다 당신의 DOM에 쿼리 다운 매우, 매우 빨리. 이제 우리는 다시 이벤트 처리에있어, 이것은 당신이 jQuery를 하나의 이벤트를 처리하는 방법이다. 그래서 우리가 여기에 가고있는 것은 우리가 모든 권리, 말하고있는 것입니다. 나는 스크립트 태그가, 오른쪽? 그래서 나는이 인라인 자바 스크립트가있다. 우리가하려고하는 것은 우리가 모든 권리, 말을하려고하고 있습니다. 문서는 문서가로드 된 것 즉, 준비가되면 , 우리는 그 기능에 갈 예정하고 있으며, 우리는 모든 권리를 말하는거야 이 기능은 실제로 다른 일을하고 있어요. 그것은 기본적으로 모든 권리는 나에게 ID를 가진 요소 얻을, 말의 '대한 myid를. " 다음이 당신이 클릭하면 실행하는 기능 핸들러를 제공합니다. 기본적으로이 명령을 주면, 그것이 말하는, 괜찮습니다. 페이지가로드되는, 그래서 나는,이 요소를 찾아 낼거야 그것을이 이벤트 처리기를주고, 그것은 기본적으로 당신을위한 당신의 페이지를 설정합니다. 그리고 이것은 당신이 이벤트 처리에 대해 생각하는 방법이다. 당신은, 생각하는 모든 권리, 뭔가가 발생했을 때, 나는 일이 어떻게할까요 싶어? 당신은, 좋아, 나는이 일에 반드시이 일 회담을해야, 생각하고 싶지 않아 이 일 ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ, 당신은 단지 이벤트의 관점에서 일을 얘기하고 싶어하기 때문이다. 이 경우이 문제가 발생합니다. 이 경우, 그 발생합니다. 일이 다른 일을 실행할 경우에, 그 좋아요. 하지만 당신은 복잡한 코드를 시도하고 싶지 않아 어디, 한 번에 여러 가지를 유발하고 당신이 자신에게 두통을 줄 것입니다 때문입니다. 좋아요. 이제 우리는 우리의 페이지가 이벤트를 처리 할 수​​ 얻을 수 있습니다, 하지만의 내 사용자가 버튼을 클릭 해 봅시다. 뭐, 내가 다시 서버에 그 요청을 보내려면 새 페이지를 다시로드 할 필요가 있기 때문에 나는, 페이지를 다시로드하지 않으 매일 시간이 종류의 지루한 가져오고 왜 필요합니까 제목을 다시 아래로 당겨, 다시 바닥 글, 모든 페이지의 요소를 다시 그냥 인사 나 시간을 새로 고치려면? 우리는 아약스와 같은 무언가가 그런 이유입니다. 우리가 Ajax를 여기에서 할 수있는 것은, 우리가 모든 권리를 말할 수있다 나는 서버에 일부 데이터를 보내려면, 나는 내가 내 페이지를 업데이트 할 수 있습니다 다시 응답을 얻으려면, 아니면 그냥 반드시 사용자에게 아무것도 보여주지 않는 어떤 알고리즘 계산​​을한다. 당신은 무엇을이 작업을 수행해야합니까? 글쎄, 당신은 당신이 얘기를해야 URL이 필요합니다. 서버가 마법처럼 어디 선가에서들을 수 없습니다. 당신은 당신이이 데이터를 전송하고 특정 장소가 필요합니다. 그리고 당신은 또한 보내 일부 데이터를 필요로하거나, 어쩌면 데이터가없는 쿼리입니다. 당신은 안녕, 나는 살아, 또는 그런 식으로 해요, 다시 서버로 ping을 말하고 싶다. 그리고 당신은 기본적으로 성공을 처리하는 기능을 원한다. 의 당신이 당신의 서버에서 일부 정보를 다시 얻을 수 있다고 가정 해 봅시다, 당신은 자신의 페이지에 사용자의 제목을 변경하고 싶습니다. 그래서 당신은 정보를 다시 얻을 것입니다, 당신은 화면에 그 밀어 것입니다. 페이지가 준비가되었을 때 무슨 일이,,입니다 당신은 환영 인사라는이 버튼에 클릭 기능에를 만듭니다. 그 버튼을 누를 때 어떤 일이 그 다음 일은이다, 당신이 greetings.php 이야기, 당신은 POST 요청을 당신은 안녕, 나에게 당신의 페이지에서 뭔가를 얻을 말한다. 우리가 정말, 그 설명해야하지만, greetings.php하지 않습니다 그냥 말을하자, "여러분, 안녕하세요."다시 제공 그래서 우리는, "안녕하세요!"이 문제를 다시 얻을이의 성공 잘못되는 일이 없어야 가정, 우리는 그냥이 목표 위치로 이동 우리가 지정하고 우리가 거​​기에 응답 스틱있다. 그리고 이것은 아약스 쿼리를 설정하는 매우 간단한 방법입니다. 매우 신속하게, 롭 종류의, 이미 언급 일이 잘못 갈 수있는, 나쁜 일이 발생할 수 있습니다, 그래서 당신은 이러한 HTTP 응답 코드에 익숙합니다. 어떤이가하는 모든 것을 좋아했다, 200, 같은 단지입니다. 뭔가 다른, 나쁜 일이 일어났다. 그것은 일반적으로 당신이 기억하고 싶은 것입니다. 그러나이 모든 것을 알고하는 것이 좋다. 그리고 마지막으로, 일단 우리는이 모든 것을 겪었어요, 우리는 디자인에 대해 매우 신속하게 얘기해야 그리고, 우리는 당신이 모두 떠나게 할 수 있습니다. 디자인. 당신이 기억하고 싶은 것들. 이러한 질문에 스스로에게 물어 : 누가 사용할 것? 그들은 무엇을 위해 그것을 사용하는 것입니다? 내 사용자가 무슨 상관이야? 그들은 무엇에 대해 걱정하지 않는다? 당신은 응용 프로그램을 확인하고 그냥 성장하게하고 싶지 않아 이 거대한, 당신도 완료 할 수있는 모든이 걸리는 것이됩니다. 당신은 당신이 해결하려는 개별 목표와 계획과 물건을 갖고 싶어. 이 노력합니다. 이 모든 것은, 기본적으로, 말한다 쉽게 사용자가 사용할 수 있도록, 실제로,이 슬라이드처럼 텍스트의 거대한 덩어리입니다하지 않습니다. 당신은 그 사람이 갈 수 있도록 매우 쉽게 뭔가가되고 싶어요 그들이하고 싶은 것을 할. 당신은 그들이 5 페이지를 탐색하고 싶지 않습니다 귀하의 사이트에 대한 귀하의 주요 기능을 얻을 수 있습니다. 구글은 전에 5 페이지를 가지고 있다면 당신은 무언가를 검색 할 수 있습니다, 아무도 사용하지 것이다. 그리고 마지막으로, 종이 프로토 타입, 포커스 그룹. 좋은 디자인 및 테스트 방법이있다. 당신이 당신을 위해 적합하다고 생각해서, 다른 사람이 작동 생각 의미하지 않는다. 하지만 그래, 바로 그거야. [CS50.TV]