1 00:00:00,000 --> 00:00:09,647 2 00:00:09,647 --> 00:00:11,730 Spreker: Nou laat duik in die verspreiding kode 3 00:00:11,730 --> 00:00:14,470 en neem 'n blik op die konteks waarin die kode wat jy skryf 4 00:00:14,470 --> 00:00:15,780 gaan word bedryf. 5 00:00:15,780 --> 00:00:17,350 Aan die einde van die dag, jy gaan implementeer 6 00:00:17,350 --> 00:00:18,710 die geheel van die web bediener. 7 00:00:18,710 --> 00:00:20,460 Maar ons het ' jy met die geraamte 8 00:00:20,460 --> 00:00:24,090 kode wat het 'n paar funksies, veral met betrekking tot die netwerk. 9 00:00:24,090 --> 00:00:25,390 Kom ons neem 'n blik. 10 00:00:25,390 --> 00:00:27,560 >> So hier na die top van die lêer is 'n klomp 11 00:00:27,560 --> 00:00:30,020 van die funksie te toets makro vereistes. 12 00:00:30,020 --> 00:00:33,570 En dit is net 'n funksie van c, waardeur volgens 'n klomp van die man bladsye 13 00:00:33,570 --> 00:00:36,410 jy het 'n paar van te definieer hierdie konstantes om waar te wees 14 00:00:36,410 --> 00:00:39,920 of selfs spesifieke getalle sodat jy het toegang tot sekere funksies. 15 00:00:39,920 --> 00:00:42,470 Anders sal hulle onverklaarde word en jy sal nie toegang. 16 00:00:42,470 --> 00:00:45,340 So ek het dit gedoen by wyse van die lees van die man bladsye. 17 00:00:45,340 --> 00:00:48,410 Nou benede, in lyne 15 deur 17, het ons 18 00:00:48,410 --> 00:00:50,550 het 'n hele klomp van die perke verklaar. 19 00:00:50,550 --> 00:00:53,370 >> En ons het geleen hierdie van 'n gewilde web server genoem Apache. 20 00:00:53,370 --> 00:00:54,650 En dit is net getalle wat gaan 21 00:00:54,650 --> 00:00:56,810 die totale aantal te beperk grepe wat toegelaat word 22 00:00:56,810 --> 00:01:01,930 in verskillende kontekste vir die HTTP-versoek dat 'n leser word toegelaat om my te stuur. 23 00:01:01,930 --> 00:01:04,310 Volgende, ons definieer octets. 24 00:01:04,310 --> 00:01:07,790 Nou 'n oktet is net 'n fancy manier sê 'n greep of agt stukkies. 25 00:01:07,790 --> 00:01:10,720 Blyk in weleer 'n greep was nie noodwendig agt stukkies, 26 00:01:10,720 --> 00:01:12,339 so oktet is altyd agt stukkies. 27 00:01:12,339 --> 00:01:14,880 So in hierdie geval het ons aangeneem wat is algemeen in die netwerk 28 00:01:14,880 --> 00:01:17,410 wêreld van die roeping van agt grepe 'n oktet. 29 00:01:17,410 --> 00:01:21,840 >> Hier het ek vermeld dat octets sal wees 512, sodat baie soos in forensiese 30 00:01:21,840 --> 00:01:24,170 wanneer ons lees 'n klomp van die grepe op 'n tyd, ook hier, 31 00:01:24,170 --> 00:01:27,390 ons gaan 'n te lees n klomp van die octets op 'n tyd. 32 00:01:27,390 --> 00:01:28,922 Volgende 'n hele klomp van die kop lêers. 33 00:01:28,922 --> 00:01:30,255 Hoe het ek geweet dit te sluit? 34 00:01:30,255 --> 00:01:32,730 Wel, ek lees net die man bladsye vir 'n aantal funksies 35 00:01:32,730 --> 00:01:35,620 dat ons sal gebruik in die verspreiding kode en sluit in die kinders 36 00:01:35,620 --> 00:01:37,390 Ek is opdrag gegee om te. 37 00:01:37,390 --> 00:01:39,090 >> En nou het ons 'n data tipe. 38 00:01:39,090 --> 00:01:41,470 Ons het 'n oktet verklaar char te wees. 39 00:01:41,470 --> 00:01:44,040 En ons sal later sien dat dit is gebruik regdeur die kode. 40 00:01:44,040 --> 00:01:45,670 En ons het verklaar dat 'n hele klomp van prototipes, 41 00:01:45,670 --> 00:01:47,961 en ons sal vinnig loop deur elk van hierdie funksies. 42 00:01:47,961 --> 00:01:50,400 Laastens, en miskien die meeste belangrik in te hou 43 00:01:50,400 --> 00:01:52,520 omgee op hierdie punt in die storie, is dat daar 44 00:01:52,520 --> 00:01:54,520 is, in werklikheid 'n hele n klomp van die globale veranderlikes 45 00:01:54,520 --> 00:02:00,430 by die top van die lêer, wortel, CFD, SFD, versoek, lêer en liggaam. 46 00:02:00,430 --> 00:02:03,960 >> Nou algemeen, met behulp van so baie globale veranderlikes, of globale veranderlikes op alle, 47 00:02:03,960 --> 00:02:05,280 is nie die rug praktyk. 48 00:02:05,280 --> 00:02:09,090 Maar dit blyk ons ​​ook met behulp van 'n tegniek genoem sein hantering later 49 00:02:09,090 --> 00:02:11,930 in die kode, wat ons toelaat om te spoor wanneer die gebruiker tref iets 50 00:02:11,930 --> 00:02:15,080 soos Ctrl C en gesluit die bediener grasieus. 51 00:02:15,080 --> 00:02:18,240 En om te wat grasieus doen en eintlik vry op geheue, 52 00:02:18,240 --> 00:02:20,800 ons nodig het om toegang te hê hierdie globale veranderlikes. 53 00:02:20,800 --> 00:02:24,510 >> En nou, laat ons 'n blik op hoof, wat dryf die geheel van hierdie program. 54 00:02:24,510 --> 00:02:27,720 Eerstens, op die top hier 'n fout nommer veranderlike 55 00:02:27,720 --> 00:02:29,570 wat verskyn om nie te 'n tipe, maar dit is 56 00:02:29,570 --> 00:02:31,500 want dit is eintlik omskryf in 'n lêer genaamd 57 00:02:31,500 --> 00:02:34,800 fout errno.h wat ingesluit hoër op. 58 00:02:34,800 --> 00:02:38,780 As jy dit doen 'n mens Errno om werklik sien die definisie vir hierdie ding, 59 00:02:38,780 --> 00:02:41,230 jy sal sien dat dit 'n spesiale globale veranderlike wat 60 00:02:41,230 --> 00:02:43,350 word deur 'n hele klomp van funksies nie geskryf 61 00:02:43,350 --> 00:02:48,730 deur ons nie, maar deur die skrywers van Linux en ander stelsels om werklik ' 62 00:02:48,730 --> 00:02:52,400 'n aantal aan daardie veranderlike wanneer iets verkeerd gaan, sodat jy kan die wêreld 63 00:02:52,400 --> 00:02:54,830 uit te vind wat het verkeerd gaan. 64 00:02:54,830 --> 00:02:58,540 >> Nou sit jy hier 'n nuwe sal sien tegniek dalk deur getopt, 65 00:02:58,540 --> 00:03:01,790 'n funksie wat help parse opdrag lyn argumente, sodat ons dit nie doen nie 66 00:03:01,790 --> 00:03:05,540 het om tyd te mors om te pla besyfering uit hoe om iets te ontleed soos 8080, 67 00:03:05,540 --> 00:03:08,350 of stamp p, of stamp h om hulp te kry. 68 00:03:08,350 --> 00:03:10,300 getopt doen wese wat vir ons. 69 00:03:10,300 --> 00:03:11,750 Sien die man vir meer. 70 00:03:11,750 --> 00:03:13,960 >> Volgende, ons doen 'n bietjie van die fout nagaan om seker te maak 71 00:03:13,960 --> 00:03:17,420 dat die poort nommer binne die gespesifiseerde reeks in die spec. 72 00:03:17,420 --> 00:03:20,240 Volgende, sien ons 'n oproep na die funksie begin, wie se definisie ons sal 73 00:03:20,240 --> 00:03:24,040 kyk in 'n oomblik, en soos sy naam aandui, begin die web bediener. 74 00:03:24,040 --> 00:03:26,960 Hier het ons 'n oproep tot 'n funksie genoem sein wat sê, 75 00:03:26,960 --> 00:03:30,750 indien en wanneer jy hoor Control C van die gebruiker se sleutelbord, gaan voort en noem 76 00:03:30,750 --> 00:03:34,650 'n funksie genoem hanteerder wat gaan om uiteindelik mooi dinge en ophou 77 00:03:34,650 --> 00:03:35,500 die bediener. 78 00:03:35,500 --> 00:03:39,470 >> Onder dit is wat blyk 'n wees oneindige lus, die eerste lyn van wat 79 00:03:39,470 --> 00:03:41,660 effektief is 'n oproep na 'n funksie genoem 80 00:03:41,660 --> 00:03:45,110 herstel, wat ons onsself implementeer later in orde 81 00:03:45,110 --> 00:03:47,470 te bevry 'n paar van ons globale state. 82 00:03:47,470 --> 00:03:50,480 Daarna is 'n lyn van kode wat voorwaardelik 83 00:03:50,480 --> 00:03:52,576 is die beheer van die opbrengs waarde van gekoppelde. 84 00:03:52,576 --> 00:03:55,700 Nou verbind lyk soos 'n gesegde, iets wat terugkeer waar of vals is. 85 00:03:55,700 --> 00:03:58,040 En dit doen nie, maar daar is iets spesiaals in gekoppelde 86 00:03:58,040 --> 00:03:59,960 in dat dit 'n blok oproep. 87 00:03:59,960 --> 00:04:03,180 Dit sal daar sit en wag totdat die leser 'n gebruiker se 88 00:04:03,180 --> 00:04:05,860 probeer om toegang tot hierdie web bediener en dan net sal dit 89 00:04:05,860 --> 00:04:10,160 terugkeer waar of vals, sodat ons voortgaan aan die binnekant van die IF-stelling. 90 00:04:10,160 --> 00:04:13,870 >> Sodra daar, dit agterkom funksie na 'n funksie genoem parse, wat ons geskryf het, 91 00:04:13,870 --> 00:04:17,230 wat ontleed al die octets, al van die grepe uit 'n leser 92 00:04:17,230 --> 00:04:21,010 na die bediener, sodat ons kan lewer jy terug uiteindelik 'n waarde aan een 93 00:04:21,010 --> 00:04:24,420 van daardie globale veranderlikes wat winkels al die grepe in net 94 00:04:24,420 --> 00:04:26,630 die kop van daardie versoek, nie die liggaam 95 00:04:26,630 --> 00:04:28,920 indien daar was eintlik 'n liggaam om dit te. 96 00:04:28,920 --> 00:04:32,980 >> Nou benede ons begin om te ontleed die kop te trek 97 00:04:32,980 --> 00:04:35,490 'n subset van die inligting dat ons omgee. 98 00:04:35,490 --> 00:04:37,740 Spesifiek, volgens die spesifikasie, ons eerste 99 00:04:37,740 --> 00:04:40,580 wou lyn te vra, wat is net daardie heel eerste lyn wat 100 00:04:40,580 --> 00:04:45,710 hopelik iets soos get sê streep of 'n pad en dan HTTP 1.1. 101 00:04:45,710 --> 00:04:48,150 Ons gebruik hierdie metafoor van 'n naald in 'n hooimied 102 00:04:48,150 --> 00:04:50,370 om te kyk vir spesifieke karakters of adresse. 103 00:04:50,370 --> 00:04:53,120 En inderdaad, daar is 'n aantal funksies in ons verspreiding kode 104 00:04:53,120 --> 00:04:56,930 dat jy ook dalk nuttig vind wanneer jy soek na spesifieke waardes. 105 00:04:56,930 --> 00:05:00,630 >> Uiteindelik het ons hierdie grepe kopieer in 'n veranderlike genoem lyn, 106 00:05:00,630 --> 00:05:03,510 wat sien, ook ons ​​het toegeken op die stapel 107 00:05:03,510 --> 00:05:05,890 deur middel van 'n dinamiese grootte skikking. 108 00:05:05,890 --> 00:05:08,350 En ons is doelbewus probeer om te verhoed dat 'n beroep malloc 109 00:05:08,350 --> 00:05:11,100 want weer, want van Beheer C om 110 00:05:11,100 --> 00:05:14,630 'n potensiële kenmerk van hierdie program, ons wil nie hierdie kode om skielik 111 00:05:14,630 --> 00:05:17,479 onderbreek deur die gebruiker slaan Beheer C, is die resultaat van wat 112 00:05:17,479 --> 00:05:20,270 is dat ek nie dalk 'n kans gratis iets wat ek malloced. 113 00:05:20,270 --> 00:05:23,660 So ek probeer om so veel gebruik van die stapel Ek kan hier. 114 00:05:23,660 --> 00:05:26,040 >> Volgende op, 'n hele klomp van te dos. 115 00:05:26,040 --> 00:05:28,930 Die spesifikasie sal uitlê oor presies wat hier verwag, 116 00:05:28,930 --> 00:05:31,800 maar die kommentaar gee jou 'n aanduiding van wat voorlê. 117 00:05:31,800 --> 00:05:33,830 Jy moet eers die geldigheid van die versoek lyn 118 00:05:33,830 --> 00:05:37,760 en maak seker dat dit lyk soos die spesifikasies grammatika, om so te praat, 119 00:05:37,760 --> 00:05:38,541 sê dit moet. 120 00:05:38,541 --> 00:05:41,290 Jy moet dan iets te onttrek genoem die navraag, die dinge uit 121 00:05:41,290 --> 00:05:44,200 na 'n vraagteken, soos ons gesien het met ons Google byvoorbeeld 122 00:05:44,200 --> 00:05:46,320 in die verbygaan in 'n HD parameter. 123 00:05:46,320 --> 00:05:49,050 Ons het toe koppel saam die wortel van die web bediener 124 00:05:49,050 --> 00:05:52,520 met die pad wat is in daardie versoek eerste reël 125 00:05:52,520 --> 00:05:56,010 en vorm die volle pad van die lêer ons wil om te kyk vir. 126 00:05:56,010 --> 00:06:00,300 >> Daarna gaan ons om seker te maak dat die lêer bestaan ​​en leesbaar. 127 00:06:00,300 --> 00:06:05,100 En dan gaan ons te onttrek sy lêer uitbreiding, die Html of die Php, 128 00:06:05,100 --> 00:06:09,920 of enige sulke uitbreiding wat is by die einde van die string versoek. 129 00:06:09,920 --> 00:06:11,940 Volgende is 'n hele n klomp van die kode wat ons geskryf het 130 00:06:11,940 --> 00:06:15,800 om werklik PHP genereer gegenereerde inhoud vir jou. 131 00:06:15,800 --> 00:06:18,010 In 'n neutedop, is hierdie kode neem in die naam 132 00:06:18,010 --> 00:06:20,250 van die lêer wat jy wil PHP te interpreteer. 133 00:06:20,250 --> 00:06:24,630 Ons gee dit deur iets genoem 'n pyp in PHP se tolk. 134 00:06:24,630 --> 00:06:28,060 Terug te kry die reaksie asof die reaksie was 'n lêer self. 135 00:06:28,060 --> 00:06:32,110 En dan het ons Itereer oor die lêer se grepe, trek hulle almal in een buffer 136 00:06:32,110 --> 00:06:34,180 sodat ons kan uiteindelik druk dit uit. 137 00:06:34,180 --> 00:06:37,230 >> Inderdaad, al hierdie noem hier om dprintf 138 00:06:37,230 --> 00:06:40,110 laat ons iets te druk bekend as 'n lêer descriptor, wat 139 00:06:40,110 --> 00:06:42,350 is net 'n heelgetal Dit verteenwoordig 'n lêer. 140 00:06:42,350 --> 00:06:45,360 Baie soortgelyk in gees nie, maar fundamenteel verskil van 'n lêer 141 00:06:45,360 --> 00:06:46,620 star wyser. 142 00:06:46,620 --> 00:06:50,260 Let op hoe jy sintaksis kan gebruik soos printf hier sodat ek kan dinamiese 143 00:06:50,260 --> 00:06:54,000 voeg iets soos die lengte vir die waarde van 'n HTTP-header 144 00:06:54,000 --> 00:06:55,270 genoem inhoud-Length. 145 00:06:55,270 --> 00:06:57,990 En uiteindelik het ek die funksie reg om werklik te skryf 146 00:06:57,990 --> 00:07:00,040 die liggaam te versoek. 147 00:07:00,040 --> 00:07:03,750 >> Ongelukkig het ons net geïmplementeer ondersteuning vir dinamiese 148 00:07:03,750 --> 00:07:05,350 gegenereer PHP lêers. 149 00:07:05,350 --> 00:07:08,520 Ons het nie ondersteuning vir implementeer statiese lêers soos gifs, en jpegs, 150 00:07:08,520 --> 00:07:10,660 en CSS en HTML-lêers. 151 00:07:10,660 --> 00:07:14,450 Dit is ongelukkig vir jou gelaat om te reageer op die kliënt doel 152 00:07:14,450 --> 00:07:15,090 om dit te doen. 153 00:07:15,090 --> 00:07:20,050 So daar sal jy vind dat daar is ' nie veel inspirasie binne daardie blok, 154 00:07:20,050 --> 00:07:23,520 maar as jy 'n bietjie hoër op hoe ons het oor PHP-kode interpretasie, 155 00:07:23,520 --> 00:07:25,520 die funksies wat jy sal gebruik is 'n bietjie anders. 156 00:07:25,520 --> 00:07:27,561 >> In feite, kan jy leen sommige van die funksies 157 00:07:27,561 --> 00:07:29,620 miskien van die forensiese probleem stel, want 158 00:07:29,620 --> 00:07:32,860 aan die einde van die dag, is al wat jy nodig het om te hier doen is as jy weet wat die lêer oop 159 00:07:32,860 --> 00:07:35,690 en sodra jy weet dit is die sogenaamde MIME type of inhoud tipe, 160 00:07:35,690 --> 00:07:39,040 wat jy nodig het om te lees in die grepe en een of ander manier spoeg hulle terug uit. 161 00:07:39,040 --> 00:07:41,190 >> En nou 'n toer van hierdie lêer se ander funksies. 162 00:07:41,190 --> 00:07:43,820 Up eerste is verbind, wat eenvoudig terugkeer ware 163 00:07:43,820 --> 00:07:47,350 wanneer dit uiteindelik hoor 'n verbinding van 'n gebruiker. 164 00:07:47,350 --> 00:07:48,786 Volgende is fout. 165 00:07:48,786 --> 00:07:52,296 Fout, intussen, as 'n funksie wat ons het al van die verskillende 400 te hanteer 166 00:07:52,296 --> 00:07:55,360 en 500 HTTP status kodes wat jy dalk wil 167 00:07:55,360 --> 00:07:58,500 terug te stuur na die gebruiker, saam met 'n standaard boodskap. 168 00:07:58,500 --> 00:08:01,950 >> Volgende is las, 'n besonder vleis funksie, wie se doel in die lewe 169 00:08:01,950 --> 00:08:06,920 is om te lees van 'n lêer ster wyser om die inhoud van 'n lêer in 'n globale buffer 170 00:08:06,920 --> 00:08:09,000 dat ons globaal verklaar bo [? hoof. ?] 171 00:08:09,000 --> 00:08:12,649 Dit is 'n bietjie kompleks omdat ons het die grepe uit die lêer lees 172 00:08:12,649 --> 00:08:14,690 maar kyk op elke iterasie of ons reeds 173 00:08:14,690 --> 00:08:17,600 druk op die einde van die lêer of iets anders verkeerd geloop het. 174 00:08:17,600 --> 00:08:21,210 En ons gebruik realloc om seker te maak dat die maak wat buffer ons gebruik is groei 175 00:08:21,210 --> 00:08:24,440 en groei en groei en altyd voor die aantal grepe bly 176 00:08:24,440 --> 00:08:25,675 wat ons nodig het om te pas in daar. 177 00:08:25,675 --> 00:08:27,550 Hanteerder, intussen, is die funksie wat kry 178 00:08:27,550 --> 00:08:30,630 genoem by wyse van ' geregistreer Control C as 'n sein 179 00:08:30,630 --> 00:08:32,140 wat ons wil om te onderskep. 180 00:08:32,140 --> 00:08:34,070 Let hier in hanteerder dat dit uiteindelik 181 00:08:34,070 --> 00:08:36,780 oproepe stop, wat van die kursus stop die web bediener. 182 00:08:36,780 --> 00:08:39,750 En ongelukkig lookup nie geïmplementeer word nie. 183 00:08:39,750 --> 00:08:41,940 In die gees, dit is 'n redelik eenvoudige funksie. 184 00:08:41,940 --> 00:08:44,900 Gegewe 'n lêer uitbreiding, is dit nodig om terug te keer is dit sogenaamde MIME 185 00:08:44,900 --> 00:08:46,320 tipe of inhoud tipe. 186 00:08:46,320 --> 00:08:49,260 En ons spesifiseer in die spesifikasie wat dit kartering moet wees. 187 00:08:49,260 --> 00:08:52,330 Maar jy moet om te vertaal dit uiteindelik tot c kode. 188 00:08:52,330 --> 00:08:56,490 >> Volgende is ons insgelyks vleis funksie genoem parse, wie se doel in die lewe 189 00:08:56,490 --> 00:08:59,350 is om te lees, nie van 'n lêer, maar van 'n netwerk konneksie. 190 00:08:59,350 --> 00:09:03,510 Spesifiek, lees en ontleding van die HTTP-versoek wat kom is van 'n leser 191 00:09:03,510 --> 00:09:05,940 na die bediener sodat uiteindelik kan ons ontleed 192 00:09:05,940 --> 00:09:09,530 net op die kop in die versoek lyn en terugkeer diegene aan jou 193 00:09:09,530 --> 00:09:12,720 deur middel van 'n globale buffer wat ons hierbo [verklaar? hoof. ?] 194 00:09:12,720 --> 00:09:14,880 >> Herstel, intussen, is 'n funksie wat ons definieer 195 00:09:14,880 --> 00:09:18,730 wat kry iteratief binnekant genoem van die belangrikste elke keer wat jy oor 196 00:09:18,730 --> 00:09:20,799 gereed om te begin luister vir 'n nuwe verbinding 197 00:09:20,799 --> 00:09:22,840 sodat ons altyd weet die toestand van ons veranderlikes 198 00:09:22,840 --> 00:09:24,870 en sodat ons het ook bevry enige geheue wat 199 00:09:24,870 --> 00:09:28,070 dalk vir toegeken het 'n vorige netwerkverbinding. 200 00:09:28,070 --> 00:09:30,060 Volgende is begin, die funksie wat ons geskryf het 201 00:09:30,060 --> 00:09:31,920 wat bevat 'n hele baie netwerk-kode 202 00:09:31,920 --> 00:09:34,420 wat uiteindelik begin die web bediener. 203 00:09:34,420 --> 00:09:36,680 >> Laaste up is die funksie genoem stop, wat 204 00:09:36,680 --> 00:09:38,770 doen presies dit, is dit stop die web bediener. 205 00:09:38,770 --> 00:09:42,270 Maar eers is dit bevry enige geheue wat nog toegeken is. 206 00:09:42,270 --> 00:09:45,850 Maar dit uiteindelik noem uitgang sonder om selfs terugkeer beheer 207 00:09:45,850 --> 00:09:47,480 aan ons belangrikste funksie. 208 00:09:47,480 --> 00:09:49,480 Uiteindelik, een van die belangrikste tegnieke 209 00:09:49,480 --> 00:09:52,680 wanneer die uitvoering van hierdie web bediener is gaan 'n bietjie van die verhoor en fout te wees, 210 00:09:52,680 --> 00:09:55,886 met een venster oop regs en 'n terminale venster by 211 00:09:55,886 --> 00:09:57,760 links, die bedieners konsole venster, sodat jy 212 00:09:57,760 --> 00:10:00,420 kan sien die boodskappe wat vertoon op die skerm. 213 00:10:00,420 --> 00:10:04,170 >> Maar nog beter 'n derde sou wees venster, 'n tweede terminale venster, 214 00:10:04,170 --> 00:10:07,135 waarin jy Telnet, die gebruik gebruik waarvoor in die spec voorgeskryf. 215 00:10:07,135 --> 00:10:09,640 En Telnet is net 'n baie eenvoudige netwerk program 216 00:10:09,640 --> 00:10:12,660 wat kan jy om voor te gee 'n leser in 'n venster 217 00:10:12,660 --> 00:10:14,540 terwyl jy praat op die ander venster. 218 00:10:14,540 --> 00:10:16,830 Hierdie manier waarop jy kan sien presies tekstuele opdragte 219 00:10:16,830 --> 00:10:18,700 wat kom terug vanaf bediener kliënt 220 00:10:18,700 --> 00:10:20,810 sonder om te skeer rondom Chrome se ontwikkelaar 221 00:10:20,810 --> 00:10:24,010 gereedskap in 'n andersins clunkier koppelvlak. 222 00:10:24,010 --> 00:10:29,099