KEVIN SCHMID: Witam wszystkich. Witamy w seminarium CS50 na Node.js. Nazywam się Kevin. Jestem TF CS50. A ja jestem trochę jak bardzo podekscytowany o seminarium. Myślę Node.js jest bardzo fajne. Mam nadzieję, że to seminarium może być używany jako dobry, myślę, trampolina do niektóre z ostatnich projektów, jeśli jesteś zainteresowany wykorzystaniem coś Node.js. Będziemy jakby zacząć się od seminarium tylko o odrobinie rodzaj tła skalowalność perspektywy Node.js, a następnie my przejść do niektórych przykładów kodu. A ja mam kod na stronie internetowej, i można spojrzeć na kod. I po seminarium, Zajmę się mówi o tym, jak można skonfigurować Node.js na komputerze. OK. Więc zaczynajmy. Więc myślę, że po prostu chcę mówić o serwery WWW, naprawdę, pierwszy. I do początku tej dyskusji, ja w zasadzie ma schemat, który jest od podręcznik wykorzystywany do CS61, które Równanie to pokazuje oddziaływanie pomiędzy procesem klienta, jak Twój internetowy przeglądarki lub jak klienta celem lub coś w tym stylu, a serwer WWW. Tak więc tego rodzaju wygląda podobnie do obraz, który widział w wykładzie na Środa, gdzie w zasadzie mamy kilka proces klienta jak Google Chrome. A następnie jest krok pierwszy Klient wysyła żądanie. Tak, że może być coś Dobrze niech odwiedzić, nie wiem, CS50.net. Więc wydawać, że wniosek. I czy ktoś pamięta nazwę protokół, który określa, w jaki sposób Żądanie powinno być zorganizowane? Tak. PUBLICZNOŚCI: [niesłyszalne]. KEVIN SCHMID: Dokładnie. Tak to jest jak HTTP, prawda? Więc w zasadzie specyfikacji, jak , że wniosek powinien być właściwie określone na zewnątrz, ponieważ w końcu dnia że wniosek jest naprawdę tak jak Ciąg, który w zasadzie mówi, że chce tego. I specyfikacja o czyli HTTP. Tak, jak to jest protokół. Tak więc serwer odbiera że wniosek. Więc macie zainstalowany serwer WWW w urządzeniu CS50. To Apache. A w tym tygodniu, kiedy pracujesz na problemie ustawić siedem, będziesz faktycznie działa z tego serwera. Więc serwer otrzyma ten wniosek, a to musi rodzaju zarysowania jego głowy i powiedzieć, jak dobrze, co mogę z tym zrobić? Tak więc na podstawie tego, co zdecyduje się zrobić, a następnie może się skontaktować z jakąś zasobów. I tak może być zasobem Wiele różnych rzeczy. Z jednej strony, może ona być po prostu jak statycznego pliku HTML. Więc może to być po prostu jak niektórzy HTML, który jest jak na Twoja strona www. Może to być plik obrazu statycznego jak lub jak w filmie, że masz. To może nawet porozmawiać do pewnego rodzaju baza danych jak bazy danych MySQL. Więc nie zawsze mają się komunikować z zasobem, ale W niektórych przypadkach, to może. Tak więc to, co zamierza zrobić po to jest to będzie odesłać odpowiedź. I odpowiedź na to również określone przez HTTP. Tak więc klient może go otrzymać. Można go oderwać od siebie i przetwarza je. A następnie dostać się do strony internetowej jak Google lub CS50.net lub cokolwiek poszedł. OK? Tak to jest, że podstawowa interakcja będziemy się zajmować. I jesteśmy dość dużo będzie koncentrując się na tej części interakcji z serwerem. OK. Fajne. Ktoś ma jakieś pytania do tej pory? OK. Tak jak powiedzieliśmy, serwer WWW otrzymuje tego żądania HTTP, a następnie wystawia ten Odpowiedzi HTTP. I jak rozmawialiśmy wcześniej, CS50 Urządzenie jest serwer WWW Apache. Więc kiedy ludzie pracują na P ustawić siedem, idziesz do pracy z Serwer WWW Apache. Nigdy nie będziesz musiał naprawdę działa z Apache bezpośrednio zbyt wiele. Ci jakby trochę skonfigurować Apache podczas określania hostów wirtualnych lub Gospodarze, V i dostaniemy jak w trochę. Ale w zasadzie, serwer WWW Apache skonfigurowane do pracy z PHP rodzaju z po wyjęciu z pudełka. Więc co tak naprawdę się dzieje, gdy idziesz do jednej z witryn internetowych, takich jak, na przykład, host lokalny ukośnik index.php czy coś, to, że Twoja przeglądarka wysyła wniosek, a następnie Apache siedzi tam i domyśla się z tym zrobić. I działanie jest do wykonania że kod w index.php i następnie wysłać go z powrotem. Więc nie jest to. Więc jakby o tym rozmawialiśmy. Więc może po prostu służyć plik statyczny lub uruchom kod PHP, a następnie problem odpowiedź. Tak to częste pytanie, które może się się dobrze, w jaki sposób tak naprawdę do czynienia wielu użytkowników z konieczności w tym samym czasie? Więc wyobraźcie sobie, że piszesz sieci serwer, jeśli miał, że serwer WWW starasz się pisać w czymś jak C czy coś takiego, w zasadzie można myśleć o tym, jak tam może być jakiś rodzaj kodu, który otrzyma wniosek, ale potem to musi zrobić wszystko działa na nim. Może mieć, na przykład, skontaktować bazy danych lub coś w tym stylu. Prawda? A potem to zrobić tego rodzaju przetworzenia a następnie odesłać odpowiedź. Tak to jest jak wysoki Przegląd poziom. Ale to nie jest oczywiste, w jaki sposób Można to zrobić tak, że dwie osoby lub Nawet 1000 osób może pracować z Serwer WWW w tym samym czasie. Więc rozwiązanie, które wykorzystuje Apache nazywa nici lub procesy. Więc może słyszeliście terminy te przed. Jest OK, jeśli nie ma, ale po prostu uważam, o wątków lub procesów sposobów system operacyjny lub program użytkownika lub coś takiego lub serwer WWW do rodzaju wykonywać wiele rzeczy na raz. Więc może słyszeliście określenie jak nici wykonania. Więc to jest trochę jak jesteś rodzaj pracy wielozadaniowej. A jeśli widziałem na polu twojego laptop, czy coś takiego, wielordzeniowych, co możesz zrobić, to można uruchomić dwa różne wątki na różnych części centralnej, tak że może w rzeczywistości nastąpić w tym samym czasie. Więc to jest naprawdę potężny. I to jest rodzaj Apache Rozwiązaniem tego problemu. Tak są tam tak jakby żadnych problemów z tym podejściem, choć? Więc myślę, że rodzaj napisał je tam. Ale obaj rodzaju używają dużo pamięci. To jest bardzo drogie, aby utworzyć wątek lub procesu. I część rozumowania jest to, że po prostu jak wtedy, gdy masz uruchomiony program w C jak głównym, a następnie, że połączenia Inną funkcją, która ma jakiś stos. Więc nici wymagają całkowicie osobny stos, który może być dość duża. I czy można sobie wyobrazić ton użytkowników na swojej stronie, to masz wiele różnych wątków. To by wiele stosów zarządzania i utrzymania. Więc jest to duże zużycie pamięci. A następnie, także, powiedzmy, że tylko jeden procesor, lub powiedzmy, że mają więcej wątków niż trzeba te Multicory. Prawda? Więc powiedzmy, że miał 10 tematów i miał tylko pięć procesorów. Jesteś rodzaju muszą zrobić to, gdzie przełączania pomiędzy prądem jeden, który jest uruchomiony, ponieważ nie można uruchomić wszystkie 10 na raz. I to się nazywa przełączanie kontekstu. I termin ten w rzeczywistości zawiera kilka różne konteksty, ale niech tylko myśleć o tym, jak zmiana między dwoma wątkami. To może być dość drogie, ponieważ w zasadzie to, co musisz zrobić, to ty przestać, co robisz, zachowaj stan, że prowadzenie wątku, i następnie przełączać się gdzieś indziej. Więc nie każdy rodzaj zobaczyć motywacja, dlaczego wątki i Procesy mogą być trochę nieporęczne? A czy masz pytanie? OK. Fajne. Ktoś ma jakieś pytania? OK. Jeśli więc zrobić krok do tyłu na chwilę, tam jest coś w rodzaju obserwacja, że ​​możemy o Wiele aplikacji internetowych. I to jest naprawdę, że wiele z nich faktycznie nie zrobić dużo użyteczne pracy wewnątrz wątku. Więc czy ktoś rozpoczął się P ustawić siedem w ogóle? Więc chcesz być może opisać niektóre części? Pracowałeś na logowanie lub coś w tym stylu? PUBLICZNOŚCI: Nie. KEVIN SCHMID: OK. Nic nie szkodzi. Przepraszam. Ale w zasadzie, w zestawie P, jesteś będzie dokonanie wielu rodzaj zapytań do bazy danych, aby uzyskać pewne Informacje z tej bazy danych. A co Twój kod będzie się robić, co to proces Apache lub że wątek Apache będzie robić gdy ma się kontakt Baza danych jest to rodzaj będzie siedzi tam i to będzie czekając na bazie odpowiedzieć. Teraz, że może nie brzmieć jak takie wielkie czynienia, ponieważ baza danych jest w twoim Urządzenie CS50, prawda? Ale jest coś w rodzaju sieci Latency tam, bo teraz internetowej Serwer musi wydać własne żądanie Baza danych do komunikacji z bazy danych, a następnie dostać się, że informacje z powrotem. Więc teraz to jest jak dobrze czekać na mnie, jestem zamiar iść coś z bazy danych, a następnie jest Wielu czeka dzieje. Czy to ma sens? A dla niektórych rzeczy to nie jest tak źle. Jeżeli po prostu musi, na przykład Dostęp do pamięci, że nie jest tak, straszne I / O opóźnienie. I kiedy mówię, I / O opóźnienie, co mam na myśli to, jak wszelkiego rodzaju jak moc wejściowa. Jednak, aby uzyskać dostęp do plików na dysku, jak gdybym chciał służyć statyczny HTML plik, który był na mojej stronie internetowej lub coś takiego, że niby trzeba zatrzymać na chwilę, przeczytaj ten plik się z dysku, a następnie w że proces czekam. Nie robię pożyteczną pracę. To nie jest prawda, ze wszystkiego, ale jest powszechne w zestaw aplikacji, takich jak P siedem i wiele aplikacji że nie jesteś rzeczywiście robi dużo myślenia. I kiedy mówię myślenia, to znaczy jak pracy obliczeniowej. Praca więc może być coś obliczeniowa jak, powiedzmy, że chcesz Napisać do serwera WWW, który po prostu obliczone n-liczb Fibonacciego. To nie brzmi jak w szczególności zabawa serwer WWW. Jak bym się nie spodziewał, że strona będzie następnym Facebook, ale pewne rodzaj pracy obliczeniowej. I można sobie wyobrazić, że z wymianą innego rodzaju ciekawe obliczeniowa pracy. Powiedzmy, że chcesz napisać coś że obliczone stopnie oddzielenie dwóch osób lub coś w tym stylu. Tak aby nie wiązać jakieś obliczenia, prawda? I nawet wtedy, zrobić, że jeszcze zrobić wiele czeka na być może trzeba kwerendy bazy danych, aby spojrzeć się, kto jest przyjacielem, który albo coś w tym stylu. Więc nie jest tego rodzaju pojęcia prac obliczeniowych. Czy to ma sens? Czy ktoś ma jakieś pytania? No i myślę, że tam umieścić serwery czatu ponieważ serwery czatu są rodzajem Innym dobrym przykładem. Serwer nie ma czatu zrobić dużo myślenia. To po prostu musi czekać na ludzi, aby wysyłać wiadomości i wtedy, gdy oni, wysłać je. OK? Więc znowu zakręcić, Apache i podobne serwery www, jak tego rozwidla Wiele wątków i procesów, które może być trochę marnotrawstwo. Sądzę więc, że pytanie, które mogą mieć od tego jest nie musimy mieć wiele wątków i procesów? Co zrobić, jeśli mieliśmy tylko jedną? Więc niby namalować obraz z tego, co to będzie wyglądać. Warto więc korzystać tylko jeden wątek. OK? Więc wyobraź sobie, to z jednego wątku. Załóżmy, że nie byliśmy naprawdę robi że dużo użyteczne - i kiedy mówię użyteczne, to znaczy pracę obliczeniową - w tych wielu wątków wcześniej. Więc rodzaj konsolidacji wszystko w jednym wątku. Co z tego, że mieliśmy jeden wątek tego rodzaju po prostu odchodzi w pętli i ciągle coś nie sprawdza Nowy zdarzyć. Tak na przykład, coś nowego się stało może oznaczać, że coś z powrotem bazy danych, albo ktoś wysłany mi nowe żądania HTTP. To są rodzajem zdarzeń się stało, prawda? A następnie, co mogę zrobić, gdy te nowe rzeczy dzieją się w tym samym wątku wykonania, ten pojedynczy wątek wykonanie, można wywołać niektóre kod, który będzie obsługiwać tej konkretnej rzeczy. Tak na przykład, jeśli mam coś z powrotem z bazy danych, nie mogłem uruchomić mojego małe obliczeniowa część, że faktycznie po prostu przygotowuje się do rzeczy wysłać z powrotem do użytkownika. Tak robi, że niby ma sens? Ale to, co naprawdę Konsekwencje tego? Prawda? Dlatego, że zostały napisane dużo kodu, który - i mam zamiar skoczyć do przodu w slajdach, czy to jest OK. Więc jeśli nie masz nic przeciwko, jestem zamiar zrobić krok do tyłu. Więc tego typu rzeczy jest zwana pętla zdarzeń. OK? I to jest podstawowy rodzaj Ideą Node.js. Więc co Node.js jest naprawdę robią w internecie Serwer jest tam jeden wątek która jest w zasadzie po w pętli jak podczas gdy jeden rodzaj przedsię kaptur z Node.js to stale sprawdzenie, czy możemy otrzymać nowe rzeczy? I wtedy to będzie działać teleskopowe że ustanowiony. Ale dobre pytanie brzmi, jak można tak się stało z istniejących rzeczy? Więc umieścić linii kodu C tutaj w zasadzie wygląda to otwarcie złożyć, prawda? I Ona po prostu wyszedł z albumu. Więc musiałem otworzyć jej nowy plik. Więc sposób nasz kod C do działania - i myślę, że powód był wybrałem pliki ponieważ jest to rodzaj stopniu pracy I / O, które zrobiliśmy w C Poczucie, że jest wyjście wejście. Tak nazywamy ten kod robi to f otwarte. A następnie w następnym wierszu naszego Program, możemy pracować z F. Więc będzie to przykład czegoś to jak synchroniczna lub blokowanie, ponieważ na tej pierwszej linii nie czekamy, aż uzyskać plik otwarty. Tak więc w drugiej linii, wiemy, że Można pracować z f, lecz oznacza to, że że druga linia naprawdę nie można uruchomić dopóki pierwsza linia jest wykonywana. Czy to ma sens? Więc będzie to zły umieścić w procedury obsługi zdarzeń. A powodem tego jest to, że tego rodzaju oczekiwania, prawda? Więc byłoby to przywrócić nas z powrotem do tej samej rzeczy. A teraz nawet nie ma korzyści z wielu wątków lub procesy, ponieważ mamy jeden wątek w Node.js. Czy to ma sens dla wszystkich? PUBLICZNOŚCI: Czekaj. Więc co jest wymiana? KEVIN SCHMID: Och, tak, tak. Więc mam zamiar dostać się do wymiana. OK. Co z tego, że mieliśmy coś że wyglądało to? Więc co, jeśli teraz edytowane f otworzyć mały? Więc jestem w tym samym przejściu dwa argumenty, jak wcześniej. Nadal kocham nową piosenkę że wyszedł z. Ale olewam trzecią rzecz, która jest to zmienna o nazwie Code. Ale to, co jest rzeczywiście kod W związku z tym! Jest to jak zmienna zwykłym C? Jest to funkcja, prawda? I to może być trochę dziwne, ponieważ Jestem faktycznie jak teraz przechodząc funkcjonować w innej funkcji. Tak, kilka rzeczy zwrócić uwagę na ten temat. Jeden, nie mam właściwie nazywając Funkcja kodu. Więc nie widzę kodu z lewy nawias, prawo nawias. Jestem tylko przejazdem w kodzie. I C, co to będzie faktycznie to daj mi, że rzeczywisty wskaźnik Kod, i to może go uruchomić. Ale pomyśl o tym, jak jesteś przepuszczenie kodu podczas że plik jest otwarty. Ale co to oznacza to, że teraz Reszta mojego programu, który mógłby zrobić inne rzeczy, może nadal robić inne rzeczy, a my nie, naprawdę czekać, ale tylko z tyłu głowy, że gdy są otwarte, bieg ten plik, że Kod w górę. Czy to ma sens? A teraz idea Node.js jest to, że Kod w rzeczy zrobić z f część powinna być dość krótka i prosta oraz proste i naprawdę nie być bardzo intensywnych obliczeń. To może otworzyć inny plik, ale że powinien być również bardzo szybkie ponieważ powinien po prostu powiedzieć, zrobić kolejny f otworzyć, a następnie wywołać ten inny kod. Więc po prostu się zupełnie jasne, f otwarcie, że ma nową piosenkę Katy Perry done mp3, który będzie dość dużo wrócić natychmiast. A następnie możemy po prostu kontynuować to inne rzeczy, ponieważ wszystko, co teraz f otwarte zaproszenie nie jest powiedzieć, w zasadzie Podstawowym f otwarty kod otworzyć ten plik i kiedy skończysz otwarcie tego plik lub kiedy się go z powrotem, następnie uruchomić ten kod. Ale faktycznie nie uruchomić tego kodu. I trzeba było pytanie? PUBLICZNOŚCI: Wydawało się sugerować kilka razy, że dodanie obliczeniowo intensywne Kod rodzaju złamać [Niesłyszalne] System napędzany. [Niesłyszalne]? KEVIN SCHMID: To jest dobre pytanie. Więc rzeczywiście przykład jak można zintegrować obliczeniowo intensywne Kod w trochę. Tak, gdy mamy do przykładów kodu, Na pewno będę ciągnąć tego. Czy to w porządku? Dziękuję. Co masz na imię? PUBLICZNOŚCI: Aaron. KEVIN SCHMID: Aaron prowadzi się bardzo dobry punkt, którym jest to, że gdybym miał jakiś kod w obliczeniowo rzeczy zrobić z f części, resztę mój program nie może działać i nie można słuchać nowych wniosków lub czegokolwiek, aż wszystkie że materiał jest gotowy. Więc jeśli piszę kod w ogóle węzła chyba że robimy coś jak będę sugerować, później, gdy patrzymy na przykłady kodu, muszę mieć pewność, że mój kod nie związać się Pętla ta impreza. Czy to ma sens? OK. Fajne. Więc Node.js oferuje te ramy, które można zbudować te napędzane zdarzenia Serwery z. Więc ma tego rodzaju asynchroniczne non-blocking I / O bibliotekach, natomiast standardowe biblioteki C, które już zostały pracy z, jak, jeśli tylko wykorzystywać je w taki sam sposób, że mamy stosuje je otwiera i przy f rzeczy, bo te blokują rzeczywiście trzeba czekać na który plik otworzyć. Ale Node.js daje, że i to w zasadzie wiąże się Google V8 Silnik JavaScript, który jest przyczyną że Chrome jest tak szybki w obróbce JavaScript ponieważ ma ten silnik V8. Tak, wiem, że brzmi to jak jeden z tych, WWDC konferencji deweloperów rzecz gdzie po prostu wyrzucić kilka Numer listu rzeczy dla procesorów i powiedzieć, że to jest cool. Ale to jest fajne, że oni to, ponieważ skrypty JavaScript - a może, jeśli nie jesteś zaznajomiony z JavaScript jeszcze dlatego, że nie mieli wykłady na nim - ale JavaScript jest interpretowany język. I to jest ważny punkt też. Dlatego tak ważne dla naszej sieci Serwery się szybko, prawda? A jeśli po prostu działa JavaScript Kod, który był po prostu interpretować byle tłumacza to może być powolne. Korzyści z posiadania tak tego węzła super szybki V8 tłumacza. I nie wiem, czy nazwał go ponieważ uderzenie V8 w czoło rzecz, ale OK. Więc przygotowaliśmy kilka przykładów pod tym adresem URL. Po seminarium, mam iść do sortowania porozmawiać o tym, jak można dostać zestaw węzła się, ale teraz, po prostu jakby chciał przejść przez niektóre przykłady kodu. Więc jeśli chcesz iść dalej, wszystko Kod źródłowy jest dostępny tam. OK? Więc zostawię ten adres URL się za mało. A potem mam zamiar się przełączyć się do terminalu. Czy wszyscy dobrze się z tym adresem? Więc idę do przełączania do mojego terminalu tutaj. Więc tutaj jest kod, który Mam na dzisiaj. Dlaczego nie zacząć simpler.js złożyć? Inną rzeczą jest to, że wszystko to kod zostanie zapisana w Których obsługa JavaScript może lub może nie znać. Myślę, że kilka rzeczy jest to, że wiele kodu JavaScript jest rodzaj Składnia i strukturę bardzo podobne do C, można więc trochę go odebrać jako iść. Próbowałem napisać wiele Kod wyjściowy do tego w sposób, który jest podobne do C tak, aby trochę bardziej czytelne. Ale jak przejść, będę wykazując niektóre dodatkowe funkcje JavaScript, które są całkiem fajne. Ale spójrzmy na ten program przykładowy. Myślę, że wszystko jest odcięte tam. Idę do ustalenia, że ​​Real szybko, jeśli to jest OK, czy nie. Nie wiem, co to zrobi. Jest to, że trochę lepiej? Widać var ​​i rzeczy? OK. Tak więc pierwsza linia jest jak JavaScript Wersja zmiennej deklaracja. Więc po prostu podkreślić, co to by wyglądają jak w C. Tak to jest jak Indeks mnie mówiąc równa się trzy lub coś w tym stylu. Więc nie określić typ. JavaScript ma rodzajów, ale to bardzo dynamicznie wpisany w naturę, tak nie przedstawił jakiegokolwiek rodzaju na nim. Tak to właśnie jest var. To tak, jakby zmienna. OK? I dzwonię tej zmiennej HTTP. I na mojej prawej stronie, mam Wyrażenie, które chcę umieścić w protokole HTTP. I to mówi wymagają protokołu HTTP. Więc to jest trochę podobny do włączenia. To trochę bardziej wydajny niż uwzględnić w ten sposób, że obejmują po prostu skopiować i wkleić nagłówek plik dla prototypów funkcji lub co z definicji typu. Ale wymaga to rzeczywiście będzie aby nam kod. Więc można myśleć o tym, jak importowanie kodu. Gdzieś w module Node.js System lub cokolwiek, mają to wszystko Kod serwera HTTP, więc jestem po prostu ściągam go na własną rękę użytku w tym programie. OK? Tak więc mam tej funkcji które napisałem. I zauważyć, że nie trzeba określać Zwracany typ lub rodzaj argumenty ponownie. Tak jakby luźne wpisany że niby sensie. Dwa argumenty, że zajmuje się, żądanie i odpowiedź. Więc to jest coś jak koncepcyjnie zaznajomieni z obrazka, które mieliśmy Na ekranie przed ponieważ mamy ten wniosek, że posiada od użytkownika. A potem mamy odpowiedź, że możemy napisać rzeczy. Tak więc pierwsza linia ta nie res.writeHead 200 i wtedy to zwykły tekst typu zawartości. Więc kawałek to oprócz mało. Więc skupmy się na res.write za mało. Zapis jest w zasadzie tak, i pisać głowę, są tylko sposoby sortowania pisać rzeczy do odpowiedzi. OK? Więc napisz głowę, czy ktoś pamięta z wykładu HTTP, czy faceci Pamiętam nagłówki w góra rzeczy HTTP? Więc dlaczego nie po prostu demo nagłówki bardzo szybko. Byłoby to pomocne? Czy powinniśmy po prostu rodzaj - OK. Pewny. Więc kiedy przeglądarka przechodzi do google.com lub coś w tym stylu, Jest rzeczywiście trochę więcej - to jest jak tajemnica - nie ma jak trochę więcej informacji że jest przez rurę, niż tylko trochę wyszukiwanie i wszystko. Tak, aby ci pokazać, mam zamiar użyć programu o nazwie Curl. OK? Więc to jest coś, co można uruchomić na linia poleceń Mac OSX lub w Urządzenie lub cokolwiek. I tak, jeśli mam Curl HTTP google.com, Idę zobaczyć kod HTML. I to jest, w sprawiedliwości, po prostu HTML tego rodzaju każe ci przekierowanie na www, jeśli Twoja przeglądarka nie automatycznie obsłużyć przekierowanie. Więc to jest po prostu HTML, ale zamierzam dodać zwijają ten łącznik I flag. OK? I to pokaże mnie nagłówki. Więc to jest również informacja, że ​​jest przez kiedy się tej odpowiedzi. OK? Tak na górze, widać to HTTP 301 przenieść się na stałe. I to jest ważne, bo jakby odnosi się to do kodu stanu. Więc tu jest 301 kod stanu, która jest w zasadzie tylko całkowitą który mówi przeglądarce, lub ktokolwiek czytając to, jeśli udają, że jesteś przeglądarki i widzisz to, w zasadzie teraz, jeśli spojrzeć na że i widzisz 301, wiesz mam zrobić coś specjalnego na podstawie 301, lub stało się coś szczególnego w przeliczeniu na 301. Tak jest napisane na stałe przeniósł. A następnie, w zasadzie, mamy kilka par wartości kluczowych. Więc mamy lokalizację jest www.google.com. A potem jakby wszystko inne rzeczy, ale w zasadzie to, co lokalizacja jest powiedzenie to nowa lokalizacja jest na stronie www.google.com. Więc teraz, jeśli przejdziesz do google.com, będziesz rodzaj zobaczyć rodzaj przeglądarki w mgnieniu na sekundę, a następnie przekierowanie z powrotem do www.google.com. Więc może zawierać odpowiedzi te nagłówki. I kilka rzeczy zwrócić uwagę. Więc powiedzmy, że byliśmy naprawdę udany w odwiedzając stronę internetową. Więc pozwól mi przejść do - co to jest dobra strona? Jestem zły na myśleniu dobry strony internetowe na miejscu. PUBLICZNOŚCI: Wikipedia. KEVIN SCHMID: OK. Zróbmy Wikipedii. Więc zostałem przeniesiony. Oh wait. Czy mogę? Tak, byłem. OK. Więc mam zrobić www. Więc mam zamiar zrobić www. I jak widać, tutaj wszystko jest HTML że przeglądarka będzie przetwarzać na Wikipedii. Ale jeśli trzymać się przesuwać się tutaj, Zobaczymy, co na górze - wow, jest wiele HTML na Wikipedii - ale to, co widzę, co tu jest na górze Status ten kod 200, w przeciwieństwie do 301, które widziałem wcześniej. I zauważyć, że ma ładny przyjazny OK obok. Tak to jest jak dobry kod stanu. Oznacza, że ​​liczba 200 wygląda znajomo? Tak, bo kiedy ja simpler.js, Napisałem 200 tam. Tak, że w zasadzie mówiąc powiedzieć przeglądarki lub kto próbuje dostać się do tego, że są skuteczne. Albo że niby jak my były zbyt udane. I jest to rodzaj specjalnej składni w JavaScript do deklarowania mapa z tych klawiszy, takich jak rodzaj zawartości i te wartości, takie jak zwykły tekst. Więc jeśli patrzeć na odpowiedzi, które wróciłem z Wikipedii wcześniej - Zamierzam spróbować przewinąć się trochę szybciej - masz te klucze, takie jak serwer i te wartości Apache. Więc masz klucze i wartości. Można określić w ten Węzła co do odesłania. Więc to jest rzeczywiście rodzaju, w niektórych sposobów, w pewnym sensie nie jest to Naprawdę, ale to trochę niższy poziom od kodu PHP, który możesz mieć pisanie dla P ustawić siedem ponieważ PHP i Apache jakby trochę zająć te rzeczy dla Ciebie. W PHP można przesłonić domyślne zachowanie pisząc własne nagłówki. Jednakże dla celów tego otrzymujemy pisać nasze własne nagłówki. Więc to ma sens, aby linia wszyscy, linia zapisu głowy? OK. Niesamowite. Więc co mam zrobić, to kończę odpowiedzi mówiąc hello world. OK. Ale to tylko funkcja zwany wniosek obsługi. Więc teraz rzeczywiście trzeba trochę zrobić coś z tej funkcji, tak? Więc co mam zrobić, to nie jest to Linia, która ma sobie równych serwera var HTTP.create serwer, a potem przechodzą w obsługi żądania. Jest to więc rodzaj węzła sposób tworzenia serwera. I zauważyć, że olewam do obsługi żądania. Więc to jest mówienie createServer Funkcja, że ​​chcę, aby uczynić mnie serwera, a gdy ten serwer odbiera odpowiedź, musisz zadzwonić do tego zażądać funkcję obsługi. OK? Tak, że linia prawie kończy się od razu. Więc linia serwera var jest zrobione dobrze po tym, że nie dość dużo. To znaczy, że ma założyć jakiś wewnętrzny państwo wiedzieć, że trzeba by wywołać tę funkcję obsługi żądania, ale to nie będzie siedzieć i powiedzmy ma użytkownikowi wysłana mnie jeszcze wniosek? Czy użytkownik wysłał mi prośbę jeszcze? Więc to nie blokuje. OK? Więc co to będzie zrobić, to jest w zasadzie teraz przechowuje wskaźnik do tego kodu, Funkcja obsługi tego żądania, a następnie będzie działać, gdy ktoś ten kod składa wniosek. A następnie robimy server.listen. 1337 jest dość arbitralny. Nie miałem szczególnego powodu do odbioru tego numeru. To było zupełnie przypadkowe. Ale to właśnie określa port. Więc większość serwerów WWW zobaczysz, że używać portu 80, ponieważ jest to rodzaj z jak konwencji. Więc jeśli pójdę do czegoś, Nie wiem, Wikipedia.org, i umieścić dwukropek 8 - Oh wow, nie można zobaczyć. Przykro mi. Ale jeśli to zrobię Wikipedii - Ja to pisać tutaj tylko po to, jasne jest aparat. Ale jeśli wziąć to pod przeglądarkę z okrężnicy 80, który określa go do Wikipedia.org na porcie 80. Więc jak to jest, jak Stany Zjednoczone mają wiele portów, jak, gdzie można wysyłać rzeczy do rodzaju. Tak to jest jak go do tego konkretnego umieścić na serwerze. OK. Więc po prostu wybrał 1337. Istnieje cały szereg numerów , które można odebrać. To nie był całkowicie wyjątkowy. Ale co mam teraz zrobić jest Zamierzam uruchomić węzeł. Pozwól mi wejść, które faktycznie para linie w dół tak, że można go zobaczyć. Mam zamiar zrobić węzeł, a ja jestem zamierza uruchomić simpler.js. I będziemy rozmawiać o tym, jak uzyskać Węzeł ustawić w trochę. Ale teraz to jest po prostu uruchomienie serwera. Więc jedno możemy spróbować, które nie mogą być tak ekscytujące jest to możliwe w rzeczywistości spróbuj do niego dostęp w Curl. Więc można zrobić Curl, i moja Maszyna jest host lokalny. Zobaczysz również to napisane jak to czasami. Hosta lokalnego i 127.0.0.1 są mili o jak w domowym komputerze. Tak to jest jak rozmawiać z własnego komputera. OK. I wtedy mogę powiedzieć, 1337. Więc jeśli mogę uruchomić tej linii kodu, mówi hello world. A gdybym chciał zobaczyć te rzeczy, które miał zwykły tekst lub typu zawartości cokolwiek, może nawet umieścić to tutaj. I zauważyć, że nie mówi OK. I mam zwykły tekst. I jeszcze trochę to wszystko inne rzeczy będzie dodać, że węzeł w nie dla mnie. To nie jest bardzo ważne. To znaczy, że są jakieś techniczne aspekty, które są rodzajem AT cool o tym mówić, ale tak, aby pokazać ty, ja też mam prawo do zmienić te okolice. Więc może po prostu dodać kilka o takich rzeczach. I to teraz, kiedy patrzę na moje wyjście, to będzie to. Więc te nagłówki na myśli pewne rzeczy do przeglądarek i tego typu rzeczy. I można w zasadzie powiedzieć, nagłówki przeglądarkę jak reagować na coś. Jeśli kiedykolwiek słyszał ciasteczka wcześniej, lub jeśli kiedykolwiek był zirytowany przez stronę internetową, ustawienie ciasteczka, lub włączone ciasteczka lub bloku coś w tym stylu. Rzeczywiście można ustawić pliki cookie w tych nagłówków. Więc powiedzieć jak do przeglądarki Zachowanie w niektórych przypadkach. OK. Tak aby był simpler.js. Czy ktoś ma jakieś pytania na tym pliku z kodem źródłowym? OK. Fajne. Warto więc usunąć z tego r i spojrzeć na simple.js. Więc to jest dość dużo samego programu. Ja tylko napisałem to trochę inaczej bo chciałam sortować z podświetleniem niektóre funkcje JavaScriptu. Więc zauważyć, że program obsługi żądania Funkcja jest całkowicie zniknął. Oh Tak, nie masz pytanie? WIDOWNI: Tak, argumenty , które są przekazywane do tego funkcji, jakie one są? KEVIN SCHMID: To są JavaScript obiekty. W dokumentacji Node.js, to w zasadzie mówi, jakie metody są dostępny na nich. My akurat mają dostęp do Metoda ta nazywa się głowa i koniec zapisu i takie tam. Ale jest cała masa więcej metod. I na przykład, jak jedna z nich w szczególności na rec, można to zrobić coś rec.method które będą powiedzieć, czy jest to GET lub Żądania HTTP POST i takie rzeczy. Więc nie wszystkie rodzaje różne właściwości, ale są zarówno JavaScript obiekty, a oni po prostu funkcje związane z nimi, że ci można napisać rzeczy. OK? Więc zauważyć, że procedury obsługi żądania jest całkowicie zniknął. Ale kod, który miałem na życzenie Ładowarka jest nadal. I jeszcze ten res.writeHead i nadal mam ten res.end. I co jest przykładem, w JavaScript jest idea anonim funkcja. i anonimowo jest jak imię dopasowania dla niej, bo dosłownie nie mieć nazwę. Wniosek nie ma funkcji obsługi w środku. Nie ma nazwy, ale nadal to biorąc argument. Więc nadal mam rec i res. I nadal mam kod. To jest w porządku Kod JavaScript. Więc mogę zadeklarować funkcji bez wyraźnie dając mu nazwę. Jest to trochę mylące na początku. Istnieje kilka przydatnych rzeczy, takich jak , które można zrobić z te funkcje anonimowe. Czy ktoś ma jakieś pytania na temat tego, czy jest to OK, po prostu, na razie, jakby po prostu przyjąć, że będzie zrobić to samo? Tak? PUBLICZNOŚCI: Czy najpierw funkcje klasy w JavaScript? KEVIN SCHMID: Są pierwsze klasy w JavaScript. I po prostu wiem, że te koncepcje przechodząc w anonimowej funkcji takich jak stosuje się do tego, że JavaScript może napisać w swoim końcowym projektu dla przeglądarka też. Tak na przykład w JavaScript na Twoja przeglądarka, jest również nieco wydarzenie napędzany w tym sensie, że to, co będziesz ma to, gdy użytkownik kliknie ten przycisk, chcę uruchomić ten kod. Więc to jest ten sam rodzaj idei po stronie klienta, gdy przycisk myszy lub ich myszkę jakiegoś obrazu na strona www, uruchomić ten kod. Które mogą mieć zastosowanie do serwerów. Więc to jest trochę jak ekscytujące Powodem, dla którego obsługa JavaScript jest naprawdę odpowiednie lub niektórzy ludzie uważają, że to odpowiedni język dla tego rodzaju Serwer kierowca wydarzenie, ponieważ masz te funkcje anonimowe. Masz cały pomysł kod asynchroniczny. OK. Ktoś ma jakieś pytania? OK. Tak aby był simple.js. Więc spójrzmy na jeden lub kilka. Więc to jest sleep.js. Więc jest ktoś zna sen funkcja C? Od Może jeden z wcześniejszych wykładów lub coś w tym stylu? Więc w zasadzie można przekazać w myślę Liczba sekund, lub jeśli używasz U spać kilka milisekund lub nanosekund. I w zasadzie program po prostu przestać działa w tym czasie. Prawda? I to będzie obudzić w końcu i Pokochasz to po prostu nadal działa Program. Więc to jakby daje serwer Wrażenie spania. Więc zauważyć, że mamy takie same res.writeHead 200 w nagłówku, jako wcześniej, ale wtedy to my dzwoniąc Funkcja o nazwie zestaw limit czasu. Ustaw limit czasu jest również dostępna w Twoja przeglądarka Google Chrome lub Safari lub cokolwiek. I w zasadzie to, co tu robi jest to biorąc w funkcji. Wskazówka, ponownie, jest to anonim funkcja. Więc to jest całkiem fajne, ponieważ jesteśmy za pomocą anonimowej funkcji w funkcja anonimowa, które może być trochę dziwne. Ale to nic przy tej funkcji, która jest właściwie mówiąc - i tym sposobem Prace w 5000 milisekund, chcę można wykonać tej funkcji, która po prostu się kończy i pisze hej odpowiedź. Więc to sprawia wrażenie jakby śpi, ale sposób ten faktycznie działa to będziemy działać przez ta linia bardzo szybko. Po prostu coś pisze. A potem my także uruchomić poprzez ta linia bardzo szybko. Więc nie jesteśmy naprawdę dzieje czekać pięć sekund. Jesteśmy po prostu będzie działać kod natychmiast. A jeszcze, znowu, to mało pętla zdarzeń, które teraz ma to coś Rejestry, że w zasadzie jest tylko ciągle dzieje się w kółko i patrząc na zegar w pojedynczym nici i powiedzenie, ma pięć sekund Jeszcze przeszedł? I wtedy, gdy widzi, że drugi ręka przeniosła jak pięć sekund lub cokolwiek, to budzi się i mówi: Och, co mam robić? Oh mam uruchomić ten kod. I wtedy to się uruchomić res.end hej. Więc znowu, my nigdy tu czeka. Więc nie jest to, że ten kod wewnątrz funkcja ta zajmie pięć sekund, aby uruchomić. Ten kod będzie działać prawie natychmiast, co najmniej w odniesieniu do pięć sekund, które Rozmawialiśmy o wcześniej przed. Tak po prostu pokazać w działaniu, Mogę zrobić Node.sleep.js. I coś zrobiłem bałagan? Być może. Przepraszam. Zobaczmy, co możemy zrobić, aby to naprawić. OK. Więc na pewno korzystać Node.js. Ja tylko żartowałem. OK. Chwileczkę. OK. Wiem, co to jest. Więc problem jest to, że w mojej drugiej karcie tutaj, byłem już na prowadzenie Node że sam adres, 1337. Więc błąd, że rzucił, jeśli spojrzymy w nim prawdziwy ściśle, to adres w używać, EADDRINUSE. Tak było już z 1337 tutaj. Więc jeśli zamknę ten off, a ja teraz spróbuj uruchomić to, miejmy nadzieję, że wszystko, będzie dobrze. OK. Więc można mieć tylko jedno sortowanie słuchać na porcie na raz. Innym rozwiązaniem byłoby dla mnie po prostu zmienić ten program i dokonać to jak 1338 czy coś tak. Ale teraz sen działa. Więc właściwie go wypróbować w Przeglądarka tym razem dlatego, że jest trochę nieciekawe, aby zobaczyć że w terminalu. Więc mam zamiar iść do tego 127 adres ponownie w 1337. I czy można go zobaczyć - Nie wiem, czy można - ale moja przeglądarki biorąc bardzo, bardzo długo Czas ładowania lub jak pięć sekund. A potem, że to w końcu zakończył odpowiedź. I nie można go zobaczyć, ponieważ sprawa zostanie przeniesiony na mały, ale jeśli zrobię to trochę mniejszy, to widzę mówi hej. Więc mam hej, ale po pięciu sekundach. I to może być trochę czystsze, aby zobaczyć to tutaj, na terminalu, więc jestem zrobić - zróbmy tu - zróbmy Curl tym adresem ponownie z 1337. A ja po prostu rodzaj siedzieć o pięć sekund. Ale zauważ, że serwer może przyjąć nowych rozwiązań. Tak drukuje to hej. I demo to, w zasadzie, co Co mogę zrobić w tej drugiej zakładce - Więc powiedzmy, zrobić to w innej karty, Mam zamiar zrobić to samo Curl sprawa ponownie. I mam zamiar spróbować je kopnąć facetów w tym samym czasie. Więc mam zamiar to zrobić, a ja jestem będzie ścigać tutaj i jestem zamiar zrobić to jeszcze raz. I zróbmy to tak, że widzę ich obu. Że jeden drukowane hej, a jeden wydrukowane hej wszystkim sposobem na - Zróbmy to eksperyment ponownie. Właściwie, użyjmy tego oszukać, czy to jest OK. Więc mam zamiar używać powłoki, że coś Pozwala mi to w zasadzie uruchomić dwie kopie tego programu równolegle. Więc to uruchomić pierwszy program i Drugi program równolegle. Więc teraz, jeśli klawisz Enter, to będzie aby wniosek ten dość dużo natychmiast w tym samym czasie. Więc dajmy tę szansę. Więc teraz zauważyć, że mówi dwa procesy. A jeśli jesteś ciekawy, że 27000 Numer ID jest w zasadzie procesem. A następnie zauważyć, że wydrukowana Cześć w tym samym czasie. To nie było tak, że trzeba było czekać pięć sekund dla jednego i następnie po tym, pięć sekund później dostać drugą. Więc to rodzaj, w pewnym sensie, jest to naprawdę nie dowody, ale to Intuicyjny dowód, że nie jest to tylko jak czeka pięć sekund, a blokowanie Cały wątek. OK, fajnie. Więc Aaron zadał pytanie wcześniej, że było dobrze, co, jeśli mamy coś zrobić - Tak? PUBLICZNOŚCI: Czekaj. Jak to, że różni się od Bufor printf, choć? Nie jest automatycznie zrobić? Dlaczego musimy się o to martwić? KEVIN SCHMID: Och, mogłeś powiedzieć to jeszcze raz? PUBLICZNOŚCI: nie lubi bufora printf zrobić dokładnie to samo? KEVIN SCHMID: bufor printf? PUBLICZNOŚCI: Tak. OK. Nie był w jednym z quizów były one mówi o tym, jak, jeśli prawo printf coś, a potem się go wstrzymać jeden drugi, a potem trzeba go pętli dziesięć razy, to będzie odczekać dziesięć sekund, a następnie printf wszystko razem? KEVIN SCHMID: Oh, OK. PUBLICZNOŚCI: Czy to jest ten sam co to w tym przypadku? KEVIN SCHMID: Więc pytanie zasadzie w jednym z poprzednich konkursach czy coś, nie było wątpliwości, że w zasadzie jeśli powiesz drukującej F 10 rzeczy na raz, a potem spałem jak w Proces drukowania ci się, w końcu z jakiegoś powodu, to by tylko zrzucić te wszystkie na ekranie. Więc trochę się z dwóch różnych koncepcje tutaj. Sądzę więc, że jedną rzeczą jest to, że w tym przypadku mamy do czynienia z dwoma różnymi rodzaj ludzi pyta serwer rzeczy w tym samym czasie. I dlatego, że z tego rodzaju printf i tak czeka to wszystko zrzuca co raz to bardziej związane z jaki rodzaj printf z - tak jest w rzeczywistości sposobem printf realizowane jest to w zasadzie ma do porozmawiać z systemem operacyjnym napisać że rzeczy do konsoli. Więc nie chcę zrobić wszystko, że rzeczy natychmiast, kiedy mówisz printf niektóre ciąg ponieważ mogłoby uzyskać drogie, jeśli ma się do zrobić to za każdym razem. Więc jeśli nie printf hej, program może faktycznie wydrukować, że nie bezpośrednio do konsoli. Może powiedzieć, OK, napisałem go. A następnie rodzaj czekać, aby dać to trochę więcej, zanim rzeczywiście pisanie go do konsoli. Tak dlatego, że to był przypadek - i jest to rodzaj niezwiązane do snu - jest to, że sen był jakby tylko wtryskiwany jest wykazanie Fakt, że nie ma zapisu to synchronicznie. Ale powodem, że jest po prostu wydajność, dzięki czemu nie trzeba sprawiają, że wiele kontaktów system operacyjny. Ale tutaj, co tak naprawdę próbujemy zrobić z tego snu rzeczy jest po prostu pokaż że gdy mamy dwie osoby odwiedzające Strona ta, to nie będzie umieścić je w linii, gdzie to powie Mam ci pomóc, a potem, kiedy jestem całkowicie wykończone pomaga po nich pięć sekund, a następnie zamierzam przejść do następnej osoby. Więc wniosek pierwszej osobie nie robi związać się tej pętli zdarzeń czy to ma sens. Ale tutaj jest rzeczywiście przykładem czegoś, co będzie tie do pętli zdarzeń. Więc tu jest straszna funkcja obliczyć n-ty Fibonacciego. Jest to dosłownie gorzej sposób można obliczyć n-tą liczbę Fibonacciego. I to jest właściwie tylko do uznania gdzie to pochodzi, Jest rzeczywiście - To znaczy, można spróbować go znaleźć - ale tam jest jak bardzo długiego bloga zakładać, że ktoś napisał. To jest jak jedna z tych rzeczy, Reddit. Ale ktoś skrytykował Node.js i tym, że stosuje się jako przykład. Więc niby chciał tylko pokazać dwa różne perspektywy, aby dostać ogólne rozumienie pojęć za te dwie rzeczy. Ale to jest tylko wybrana jako straszne, strasznie nieskuteczny obliczeniowo intensywny sposób obliczyć n-ta liczba Fibonacciego. Więc tak na marginesie, dlaczego to straszne jak w jeden sposób? Tak? PUBLICZNOŚCI: Kontaktując się rozpocząć się z 1000. 1000 dzieli się na 999 i 998. Każdy to dzieli się na dwie rzeczy. Każdy to dzieli się na dwie rzeczy. KEVIN SCHMID: Prawo. W rynku: w dół. KEVIN SCHMID: Dokładnie. Więc po prostu powtórzyć do kamery, jeśli zadzwoń fib na jak 1000 czy coś tak, to nie jest oczywiście mniej niż lub równa jeden, więc mam zamiar Do tej sprawy jeszcze, a potem idę zadzwonić fib 999 oraz fib 998. A potem prawie wszystkie, które Prace, które nie jest fib 999 rodzaj na tym poziomie. Jeśli pójdziesz, to jeszcze bardziej zbędne niż to, ale jeśli tylko myślę obliczania fib 998 dostaje nam całkiem blisko fib 999. Powinniśmy więc być naprawdę niewiele więcej mądry o tym, jak to za ponowne nich, ale nie jesteśmy ponowne te rzeczy w ogóle. Więc można sobie wyobrazić, to gigantyczna, gigantyczne drzewo, które jest po prostu straszne. Ale i tak, OK. Tak aby był fib. To po prostu zajmuje trochę czasu, aby uruchomić. Tak? PUBLICZNOŚCI: [niesłyszalne]. KEVIN SCHMID: Och, mogłeś powtórzyć pytanie? PUBLICZNOŚCI: [niesłyszalne]. KEVIN SCHMID: Och tak, to jest tylko kod że będzie to coś w rodzaju na po stronie serwera. Więc to nie będzie można znaleźć w przeglądarce lub cokolwiek. Jest to w zasadzie to, co mamy jest to, że gdy użytkownik tutaj dość dużo marki ich wniosek ponownie, gdy rodzaj złożyć wniosek, będziemy nazywać Funkcja ta po stronie serwera. I wtedy będziemy mieć wynik z powrotem z wywołaniem tej funkcji. A potem po prostu wydrukować go do użytkownika. Tak więc użytkownik nie ma tak naprawdę do czynienia z tej funkcji zbyt wiele. Czy to pytanie? Czy to ma sens? OK. Fajne. Więc znowu, robimy to cały res.writeHead co, gdzie wydrukować nagłówek. A potem zakończyć odpowiedź wykonując magiczna liczba jest fib 45. Więc po prostu uruchomić ten serwer. Więc mam zamiar zrobić fib.js. węzłów Więc teraz mój serwer fib jest uruchomiony. I to tutaj, będę wykonać jedną z nich. OK? Więc mam zamiar powiedzieć, Curl. Więc to zajmie trochę czasu, ale miejmy nadzieję, że wkrótce będzie to zakończyć i zostanie wydrukowana, że ​​45th Fibonacci numer. PUBLICZNOŚCI: [niesłyszalne]. KEVIN SCHMID: Powinien się zrobić dość szybko. Więc powinien podjąć 05:55 sekund. Nie wiem, to tylko V8 jest bardzo szybko, w każdym przypadku jest bardzo krótki przykład i celowo nieeleganckie z nietrywialne obliczeń. Więc po chwili robi się to. Ale teraz, co mam zrobić, jeśli sam rodzaj Eksperyment, jak wcześniej, gdzie zrobić dwa wnioski w tym samym czasie? Więc idę do zagięcia że adres, i zamierzam aby zrobić kolejny Curl. I pamiętaj, kiedy zrobiliśmy to dla spać serwer, gdy w zasadzie było to po pięciu sekundach, ale dość znacznie zarówno wrócił tuż w tym samym czasie. Więc to nie był szczególnie związany. Ale spróbujmy go teraz. OK, więc dostaliśmy dwa procesy. Pamiętaj, to są identyfikatory procesów. To będzie trochę niewygodne, a my stoisko. Więc po prostu zostać tutaj i czekać. Tak więc jeden z nich powinno pochodzić powrót po jak - OK, więc jeden wrócił. Ale to dlaczego nie drugi jedna tylko jeszcze wróci? Tak? PUBLICZNOŚCI: serwer nie może nic zrobić podczas jego obliczania, że ​​duża liczba. KEVIN SCHMID: Prawo. Więc odpowiedź była po prostu, że serwer naprawdę nie można nic zrobić, gdy to obliczania tej liczby Fibonacciego. Więc teraz po prostu mam swoje dwie rzeczy z powrotem. Ale myślę, że po prostu myśleć o kodzie trochę więcej, jak to działa i wszystko. Więc ta funkcja jest tu kod Mówiłem to serwer, aby uruchomić, gdy otrzymuje nowe żądanie przychodzące. Więc to po prostu będzie działać przez to Cały kod, a potem to się udać Powrót do pętli zdarzeń, a następnie kontynuować sprawdzania nowych wydarzeń. Więc w zasadzie to, co dzieje się Jest to serwer słuchać nowych rzeczy. Pierwsza osoba zwraca się na to, co 45 jest. Możemy uruchomić ten kod, aby ją obliczyć. Kod ten trwa mniej więcej pięć sześć sekund, aby uruchomić. Następnie wracamy do pętli zdarzeń i sprawdzić nowe wnioski. Więc jest to przykład na to, jak, jeśli mają rzeczy, które są tak zwane obliczyć związany, lub korzystać z wielu obliczeniowych, nie moc, ale jak to obliczeniowo - Myślę, że jedna rzecz do powiedzenia na ten temat jest że ta funkcja ma się całkowicie, w większości przypadków całkiem użyteczne prawo pracy. Cały czas, że zwrotna funkcja została uruchomiona, to było dość dużo spędzać większość czasu po prostu computing, że n-ta liczba Fibonacciego. Ale mieliśmy tylko jeden wątek do czynienia. W modelu Apache, gdy dwie osoby zwrócił się z wnioskiem, aby uzyskać fib 45, my miałaby dwa różne tematy. A następnie praca w systemie operacyjnym byłby, lub poziom użytkownika Kod, który zarządza wątki, by się było pokroić, że się na CPU, a nawet jeśli miał wielu procesorów, rozpowszechniać je równomiernie na CPU tak, że oboje byli wykończenie w przybliżeniu w tym samym czasie. Więc po prostu pokazać, w jaki sposób możemy rozwiązać z - i nie jest całkowita doskonałe rozwiązanie, ale coś w rodzaju, jak to możliwe aby tu wrócić i zrobić trochę lepiej. Więc co mam tutaj jest program o nazwie Fib C. I to w zasadzie używa jeszcze jeden z modułów o nazwie węzła Moduł procesu potomnego. Więc podaję, że na górnym rodzaju o jak ja bym funta obejmują process.h dziecko lub coś. Teraz mam dostęp do tej zmiennej CP który ma wszystkie moje funkcje. Więc teraz to, co robię w tej odpowiedzi Ładowarka jest Używam tego programu kropka slash fib 45. Więc co zrobiłem - i mam zamiar wyjść z tego programu dla trochę - jest Napisałem program w C, który zasadniczo oblicza n-ta liczba Fibonacciego. Więc tutaj jest tylko program pisałem w C, który oblicza tego. Mogę go skompilować i mogę uruchomić to w wierszu poleceń. I to się dzieje, aby obliczyć Numer 45th Fibonacciego. Więc zauważyć, że właśnie trwa prawie tak długo. Prawdopodobnie mógł użyć myślnika 03 do zoptymalizować go, czy coś w tym stylu, ale ja po prostu tak jak regularne Ustawienia kompilatora. I drukuje go. Ale teraz, co mam niby zrobić? Och przepraszam, źle plik. Więc robię te same rzeczy z nagłówek, jak wcześniej. Następnie zrobić to cp.exec. Więc co to będzie zrobić, to jest to zamierza uruchomić ten program. Ale sposób jest to, że to działa to nie będzie czekać na ten program do końca. To po prostu w zasadzie mówi wykonać ten program. Więc w zasadzie do tego typu rodzaj wiersza poleceń. A potem, kiedy skończysz z to uruchom tę funkcję. Więc teraz mamy dostać tego rodzaju Cała sprawa z przywrócone jak my nie czekamy. Czy tego rodzaju mają sens? Tak? PUBLICZNOŚCI: [niesłyszalne]? KEVIN SCHMID: Więc to będzie faktycznie otworzyć nowy proces, aby to zrobić. Więc to jest rzeczywiście, w pewnym sensie, zła, nie bardzo zła, ale jest ważne, aby powiedzieć, że jest to rodzaj wracając do, z jednej strony, Apache model, w którym robimy wątki i procesy dla każdego wniosku lub procesów dla każdego wniosku. Jest to więc rodzaj analogiczne do tego, co robi Apache. W niektórych przypadkach będzie to po prostu użyć nowy wątek, który jest trochę więcej światła waga niż proces, ale może Apache skończyć rozwidlone nowy proces co jest raczej to, co robimy tutaj pośrednio przez działanie dot slash fib 45. A następnie w tym przypadku mamy rodzaj ponosić same koszty procesów. Więc to jest tylko jeden, co można zrobić. Ale żeby pokazać ten rodzaj biegania. I ta rozmowa jest po prostu naprawdę na celu przedstawienie tego rodzaju programów, jak sposób, aby pokazać różne perspektywy na jak zaprojektować serwerów takiego. Tak to działa, i to teraz, jeśli ja to jeszcze raz, mam dwa identyfikatory procesów. Porozmawiajmy o rzeczy zwrócić uwagę. Więc zauważyć, że są one stopniowo. To jest fajne. Ponieważ było 27.122 wcześniej. Ale informacja teraz, wrócili mniej więcej w tym samym czasie. A teraz, dobre pytanie zapytać dlatego, że sprawa jest, których zadaniem był teraz do sortowania, aby te rzeczy rodzaj fair play z każdym inne, te dwa przypadki kropka ukośnik fib 45, że wpadłem lub że ran węzła? Kto rodzaju sprawia, że ​​w porządku, że oboje się trochę zrównoważyć czas pracy? PUBLICZNOŚCI: [niesłyszalne]. KEVIN SCHMID: Tak. Więc w zasadzie, kiedy robię dot slash fib 45 czy coś takiego, teraz jest rodzaju do systemu operacyjnego do obsługiwać środowiska wykonawczego tych programów. A teraz może je zaplanować na różnych procesorach lub jej Można je zaplanować. Może to kawałek do czasu, że jednym Procesor jest to albo że się działać na jednej CPU. Więc to jest idea, że. Czy to ma sens dla wszystkich? Węzeł nie tak teraz gra naprawdę udział w podziału tych zadań. OK. Więc to jest prawie to przykłady. Chciałem tylko pokazać jeszcze jedno ponieważ wiele to dotąd nie całkowicie bardzo praktyczny w niektórych przypadkach. Mogę sobie wyobrazić, wraca do domu po tym porozmawiać i coś i mówi jak, a ja niby mam z tym, że rozmowa Mogę zrobić dla serwera Fibonacciego mój projekt końcowy. Więc tutaj jest po prostu swego rodzaju jeden przykład , że mam nadzieję, że będzie - może nie, ale być może - trochę więcej odpowiednie do rodzaju i końcowych projektów myślenia z wyprzedzeniem na takie rzeczy. Więc to jest chat.js. Więc to jest trochę jak jakieś próbki kodu po stronie serwera, które można użyć do skonfigurować serwer czatu, jak mały może widzieliście na Facebook Chat czy cokolwiek. Więc nie mówię, to jest jak Facebook Czat, ale jest to rodzaj jak dobry - może nie jest dobre, ale może Punktem wyjścia do rozmowy - dobry serwera na swojej stronie internetowej do końcowego projektu. Więc spójrzmy na to, co robi. Więc jesteśmy coraz to nic specjalnego w górę, to var SIO równa wymagają Socket.IO. Więc to jest inna sprawa, że ​​tak nie jest faktycznie są dostarczane z Węzeł, ale można go zainstalować. Jest to moduł Node. Tak to jest jak niektórzy Rozszerzenie do węzła. SocketIO jest rzeczywiście bardzo niby chłodny. To abstrakcja, że ​​w zasadzie to, co to nie znaczy to, że pozwala na mają ten strumień komunikacji między internecie przeglądarka i serwer WWW. Tak więc w większości do tej pory, mieliśmy Są bardzo szybkie jedną sekundę lub dwie drugi w sieci komunikacji między przeglądarka i serwer WWW. Więc to w zasadzie przejść do google.com, get rzeczy, wysłać go z powrotem, a następnie skończymy. Nigdy nie rozmawiamy ponownie, aż do użytkownik wpisze coś innego. Ale co Socket.IO i podobny rodzaj rzeczy - i SocketIO jest rzeczywiście jednym z rzeczy, które są zbudowane na tak WebSocket która dostępna jest rodzaj jako część HTML5 - , które pozwala mieć to nieprzerwany dialog. I to jest bardzo przydatne w serwerze czatu rodzaju rzeczy, ponieważ jest jakby ciągłym dialogu kilka sposobów, bo jeśli na czacie z kimś, można teraz po prostu wysłać komunikat w dół rury, a następnie Serwer może wysłać komunikat w dół rury do drugiej osoby jesteś rozmowy z. A potem możesz mieć tego wymieniać takiego. Więc to jest jakby co SocketIO jest dobre dla. Dlatego, że SocketIO używa WebSockets a jeden jest to, że w dodatek do po prostu starych WebSockets, to też ma pewne sztuczki, aby zasadniczo Przeglądarka to zrobić kompatybilne. Tak przeglądarkach takich jak Internet Explorer niestety nie obsługują WebSockets zaraz po wyjęciu z pudełka. Więc używa innego rodzaju fajne schludny rzeczy z Adobe Flash, aby umożliwić , aby mieć wsparcie krzyż przeglądarki. Więc to jest naprawdę przydatne. I faktycznie, wiem, że jestem rodzaju działa na czas tutaj, ale CS50 Dyskutować, czy widziałeś kiedyś coś jak, nie wiem, puste, i tak jest Odpowiadając na to stanowisko, czy coś tak, że funkcja? To SocketIO. Tak więc, gdy ktoś zaczyna pisać w pole, aby omówić odpowiedzi lub coś, Twoja przeglądarka ma co zwany w SocketIO emituje jakieś wydarzenie, które mówi, ktoś jest odpowiedzi do tego postu. Następnie serwer mówi, OK, co mam zrobić? No to teraz muszę powiedzieć, te inne chłopaki którzy są na CS50 Porozmawiaj patrząc w tym poście, że ktoś odpowiadanie. Więc to jest jakby co SocketIO jest dobre, tego rodzaju ustawicznego strumień dialogu. OK. Więc co mam tutaj - i jesteśmy po prostu będzie ignorować tablicę połączeń na trochę - co mogę zrobić, to mam inny słuchać. Więc to jest tak, jak jest w Socket.IO mówiąc posłuchajmy na tym porcie. A następnie zrobić to na związku. Więc to jest po prostu w zasadzie Gniazdo Io sposób mówienia, kiedy otrzymujemy zasilania, chcę ci aby uruchomić ten kod. I zauważyć, że zamiast rec i res przeszły tam mam gniazda. I to jest w zasadzie Socket Ten pomysł rzecz, że można pisać i czytać od tego użytkownika ma Komunikaty ewentualnie. I wiadomości, które wysyłane może przejść przez ten Socket. Czy to ma sens? Więc to jest ta kontynuuje rzeczą. Więc co mam zrobić, to zadzwonić Socket.emit. I emitują trwa dość dużo dwa argumenty. Pierwszy argument jest ciągiem tylko reprezentującym typ co ty emitowania. Więc w tym przypadku, mam wykorzystanie ten ciąg nowej wiadomości. I to tylko w zasadzie powiedzieć, że typ to coś, co mnie wysyłania, jest nowa wiadomość. Dzięki czemu można słuchać do określonych rodzajów jak nowe wiadomości lub cokolwiek za pomocą kropki na. Więc połączenie i użytkownik wysłał tam, jeśli obejrzysz, gdzie nazywamy punkt na, są to ciągi znaków, które reprezentują inne typy wiadomości użytkowników. Tak, to w zasadzie można mieć ten Emit jeden z tych typów komunikatów i następnie zrobić coś w odpowiedzi na jeden z tych typów komunikatów Więc jestem emitujące ten nową wiadomość. Mamy zamiar ignorować connections.push na sekundę. Ale wtedy mówię, Socket.on użytkownik wysłana. Więc teraz to trochę jak przy Użytkownik wysyła mi wiadomość, chcę uruchomienie tego kodu. I zauważyć, że funkcja anonimowa bierze w tej zmiennej Dane, które nazywane jest w zasadzie dzieje mieć wiadomości użytkownika. Więc teraz niech rodzaju mówi się o tablicy połączeń. Więc to jest przeznaczone dla klienta czatu gdzie w zasadzie każdy trochę w sam czacie. Więc w zasadzie, czego potrzebujemy, aby zachować wokół tablicy, który jest w zasadzie pewne reprezentuje wszystkich ludzi na czacie w kilka sposobów, czy to ma sens. Prawda? Bo musimy wiedzieć, kto tych ludzi są więc możemy wysłać do nich wiadomości że inni ludzie wysyłają do nas. Więc co ten kod czyni to, gdy użytkownik wysyła komunikat - jest to rodzaj wydarzenie - mamy zamiar uruchomić ten kod. I co możemy zrobić, to możemy uruchomić przez to Tablica nazwaliśmy połączenia. I prawie na każdym połączeniu z wyjątkiem jednej, która jest nasza, to jest co ten kod mówi, wysyłamy nowy Wiadomość o tym załączonym wiadomości informacje. Więc jeśli zauważy tutaj, co zrobiłem, kiedy użytkownik faktycznie czyni nowy połączenie jest Dodałem z Sposób JavaScript.push, to w zasadzie tylko, że jak dodać że gniazda jako wartość w Nasza tablica połączeń. Więc teraz, gdy ten kod działa, to będzie wysłać rzeczy do tych, zwłaszcza połączeń. Więc może to być dobry punkt wyjścia dokonywania serwer czatu lub coś podobnego. I niby fajne jest to, że Kod, który można zobaczyć tutaj, jak i na emitują i takie, które jest takie samo rodzaj kodu JavaScript, który by pisać w przeglądarce do interakcji z serwera. Więc dlatego SocketIO jest rodzaj czyste i przydatne w ten sposób. No i jeszcze jedna rzecz bardzo szybko. Był projekt końcowy CS50 ubiegłym roku że w zasadzie realizowane czat Serwer w Node.js. Myślę, że to Harvardchats.org ale nie jestem - OK. Nie jestem pewien, co URL jest, ale Mogę wysłać, że się potem. Ale to trochę ostygnie, co można zrobić z Node.js. Więc mam nadzieję, że w ogóle macie dobre poczucie co Node.js jest przydatna i jak można było być może zastosować do ostatecznego projektu. Będę wysyłając kilka środki wraz z tym. I dziękuję za przybycie. Dziękuję. [Aplauz]