Да ли желите боље разумевање бафера у Ноде.јс? Види ово.

Да ли си увек збуњени, попут мене, кад год наиђете речи као што су буффер, Стреам, и бинарни подаци уНоде.јс? Да ли вас тај осећај тера да се клоните разумевања, мислећи да нису намењени вама, већ само Ноде.јс гуруима и програмерима пакета да то разумеју?

Заправо, те речи би могле бити врло застрашујуће, посебно када улазите у веб развој са Ноде.јс без ЦС степена.

Нажалост, многи водичи и књиге прећи ће директно на подучавање како развијати веб апликације са Ноде.јс пакетима, а да вам не дозволе да разумете основне карактеристике Ноде.јс и зашто оне постоје. А неки ће вам дрско рећи да их не требате разумети јер виможда никада неће директно радити са њима.

Па, истина, можда никада нећете радити са њима директно ако одлучите да останете просечан Ноде.јс програмер.

Међутим, ако вас мистерије заиста занимају, а ви се нећете зауставити ни пред чим да бисте задовољили своју радозналост, и ако желите да своје разумевање Ноде.јс-а подигнете на виши ниво, онда заиста желите дубље да истражите како бисте разумели многе основне функције од Ноде.јс, попут Буффер-а , на пример. И управо због тога пишем овај чланак - како би нам помогао да демистификујемо неке од ових карактеристика и подигнемо наше учење Ноде.јс на виши ниво.

Приликом увођења бафера , званични Ноде.јс документи делимично наводе ...

… Механизам за читање или манипулисање токовима бинарних података. BufferКласа је представљен као део Ноде.јс АПИ би се омогућило интеракцију са Октет потока у контексту ствари као ТЦП потока и операције система датотека.

Хммм, осим ако претходно нисте знали све речи у горњим реченицама, оне су вероватно само гомила жаргона. Покушајмо то мало да поједноставимо преформулишући га, како бисмо имали јасан фокус и не бисмо били ометени бројним звонима и звиждуцима тамо. Изводећи из тог увода, могли бисмо са сигурношћу рећи:

BufferКласа је представљен као део Ноде.јс АПИ да би било могуће да се манипулише ни да реагује са потоцима бинарних података.

Сад је то једноставније, зар не? Али ... Ме успремник, токови, бинарни подаци ... и даље много великих ријечи. Па, покушајмо да се позабавимо тим великим речима од последњег до првог.

Бинарни подаци, шта је то?

Вероватно већ знате да рачунари складиште и представљају податке у бинарним датотекама. Бинарни је једноставно скуп или колекција од 1 и 0. На пример, следе пет различитих бинарних датотека, пет различитих скупова 1 и 0:

10, 01, 001, 1110,00101011

Сваки број у бинарни, сваки 1и 0у сету се зове Бит , што је кратак облик бинарних бројева.

Да би сачувао или представио део података, рачунар треба да претвори те податке у свој бинарни приказ. На пример, да би сачувао број 12, рачунар треба да претвори 12 у свој бинарни приказ који је 1100.

Како рачунар зна како да изврши ову конверзију? Па, то је чиста математика. То је једноставан бинарни систем бројева који смо научили из основне математике - изражавајући број у систему бројева основица-2. Рачунари разумеју ту математику.

Али бројеви нису једини тип података са којим радимо. Такође имамо жице, слике, па чак и видео записе. Рачунари знају како да представе све врсте података у бинарним датотекама. Узмимо на пример жице. Како ће рачунар представљати низ „Л“ у бинарним датотекама? Да би било који знак похранили у бинарне датотеке, рачунари ће тај знак прво претворити у број, а затим тај број претворити у његов бинарни приказ. Дакле, за низ „Л“,рачунари ће се прво претворити Л на број који представља Л . Да видимо како.

Отворите прегледача конзолу и налепите следеће кода и онда притисните ентер: "L".charCodeAt(0). Шта сте видели? Број 76? То је број представа или знакова код или код Тачка на карактера Л . Али како рачунар зна који ће тачно број представљати сваки знак? Како зна да користи број 76 за представљање Л ?

Скупови знакова

Скупови знакова су већ дефинисана правила тачног броја који представља сваки знак. Имамо различите дефиниције ових правила. Врло популарна укључују Уницоде и АСЦИИ . ЈаваСцрипт се заиста добро игра са Уницоде скуповима знакова. У ствари, то је Цириллиц у вашем бровсеру да државе које 76 треба да представља Л .

Тако смо видели како рачунари представљају знакове у бројевима. Сада ће рачунар заузврат представљати број 76 свом бинарном представљању. Можда мислите, само претворите 76 у систем бројева базе-2. Не тако брзо!

Кодирање карактера

Као што постоје правила која дефинишу који број треба да представља знак, тако постоје и правила која дефинишу како тај број треба да буде представљен у бинарним датотекама. Конкретно, колико битова користити за представљање броја. То се назива кодирање знакова .

Једна од дефиниција за кодирање знакова је УТФ-8 . УТФ-8 наводи да би знакови требали бити кодирани у бајтовима. Бајт је скуп од осам битова - осам 1 и 0. Дакле, осам 1 и 0 треба користити за представљање тачке кода било ког знака у бинарном систему.

Да бисмо ово разумели, као што смо раније поменули, бинарни приказ броја 12 је 1100. Дакле, када УТФ-8 каже да би 12 требало да буде у осам битова, УТФ-8 каже да рачунар треба да дода више битова на леву страну стварне базе-2 броја 12, да би био бајт. Дакле 12 треба чувати као 00001100. Има смисла?

Стога 76 треба чувати као 01001100.

Ово, пријатељи моји, рачунари чувају низове или знакове у бинарним датотекама. Исто тако, рачунари такође имају одређена правила о томе како слике и видео снимке треба претворити или кодирати и чувати у бинарним датотекама. Поента је у томе што рачунари чувају све типове података у бинарним датотекама, а то је познато као бинарни подаци.

Ако сте супер заинтересовани за ситно кодирање знакова, можда ће вам се свидети овај нежни и детаљан увод.

Сада разумемо шта су бинарни подаци, али шта су токови бинарних податакаод нашег увода до бафера?

Стреам

Стреам у Ноде.јс једноставно значи низ података који се временом премештају са једне тачке на другу. Цео концепт је да имате огромну количину података за обраду, али не морате чекати да сви подаци буду доступни пре него што почнете да их обрађујете.

У основи, ови велики подаци се рашчлањују и шаљу на комаде. Дакле, из оригиналне дефиниције међуспремника („токови бинарних података ... у контексту ... система датотека“) ово једноставно значи да се бинарни подаци премештају у систем датотека. На пример, премештање текстова сачуваних у датотеци филе1.ткт у датотеку филе2.ткт.

Али како нам тачно бафер помаже у интеракцији са бинарним подацима или манипулацији њима током стримовања? Шта је тачно овај бафер?

Пуфер

Видели смо да је ток података кретање података од једне до друге тачке, али како се тачно премештају?

Типично је кретање података обично са намером да их обради или прочита, и на основу њих доноси одлуке. Али постоји минимална и максимална количина података која би процес могао потрајати током времена. Дакле, ако је брзина доласка података бржа од брзине којом процес троши податке, вишак података треба негде сачекати да се њихов ред обради.

С друге стране, ако процес троши податке брже него што стижу, оно мало података који стигну раније треба да сачека да одређена количина података стигне пре него што се пошаље на обраду.

То „подручје чекања је тампон! То је мала физичка локација на рачунару, обично у РАМ меморији, где се подаци привремено сакупљају, чекају и на крају шаљу на обраду током стримовања.

Можемо замислити читав ток и процес бафера као аутобуску станицу. На неким аутобуским станицама аутобус не сме да полази док не дође одређена количина путника или до одређеног времена поласка. Такође, путници могу долазити у различита времена са различитом брзином. Ни путници ни аутобуска станица немају контролу над доласком путника на станицу.

У сваком случају, путници који раније дођу мораће да сачекају док аутобуска станица не одлучи да аутобус пошаље на пут. Док путници који стигну када се аутобус већ учитава или када је аутобус већ кренуо треба да сачекају следећи аутобус.

У сваком случају, увек постоји место за чекање. То је бафер за Ноде.јс! Ноде.јс не може да контролише брзину или време доласка података, брзину тока. Само он може одлучити када је време за слање података. Ако још није време, Ноде.јс ће их ставити у међуспремник - „подручје чекања“ - малу локацију у РАМ-у, док не буде време да их пошаље на обраду.

Типичан пример где бисте могли да видите бафер на делу је када стримујете видео на мрежи. Ако је ваша интернетска веза довољно брза, брзина тока ће бити довољно брза да одмах напуните ме успремник и пошаље га на обраду, а затим попуните још један и пошаљите га, па још један, и још један ... до стрима је завршен.

Али ако је ваша веза спора, након обраде првог скупа података који су стигли, видео уређај ће приказати икону за учитавање или текст „међуспремник“, што значи прикупљање више података или чекање да стигне још података. А када се бафер напуни и обради, уређај приказује податке, видео. Током репродукције, више података ће и даље пристизати и чекати у баферу.

Ако је плејер завршио обраду или репродукцију претходних података, а ме успремник још није попуњен, поново ће се приказати текст „међуспремник“, који чека прикупљање додатних података за обраду.

То је Буффер!

Из оригиналне дефиниције бафера показује да док смо у баферу, можемо манипулисати бинарним подацима који се стримују или комуницирати са њима. Какву бисмо интеракцију могли имати са овим сировим бинарним подацима? Имплементација бафера у Ноде.јс пружа нам целу листу онога што је могуће. Да видимо неке од њих.

Интеракција са бафером

Могуће је чак створити и свој бафер! Осим оне коју ће Ноде.јс аутоматски креирати током стрима, могуће је створити и манипулисати сопственим бафером. Занимљиво, зар не? Створимо један!

У зависности од тога шта желите да постигнете, постоје различити начини за стварање бафера. Да видимо.

// Create an empty buffer of size 10. // A buffer that only can accommodate 10 bytes.
const buf1 = Buffer.alloc(10);
// Create a buffer with content
const buf2 = Buffer.from("hello buffer");

Једном када је ваш бафер креиран, можете започети интеракцију с њим

// Examine the structure of a buffer
buf1.toJSON()// { type: 'Buffer', data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] }// an empty buffer
buf2.toJSON()// { type: 'Buffer', data: [ 104, 101, 108, 108, 111, 32, 98, 117, 102, 102, 101, 114 ] }
// the toJSON() method presents the data as the Unicode Code Points of the characters
// Examine the size of a buffer
buf1.length // 10
buf2.length // 12. Auto-assigned based on the initial content when created.
// Write to a bufferbuf1.write("Buffer really rocks!") 
// Decode a buffer
buf1.toString() // 'Buffer rea'
//oops, because buf1 is created to contain only 10 bytes, it couldn't accommodate the rest of the characters
// Compare two buffers

Постоји пуно интеракција које бисмо могли имати са бафером. Идите на званичне документе да бисте се више поиграли овим методама.

На крају, оставићу вам овај мали изазов: Прочитајте извор злиб.јс , једне од основних библиотека Ноде.јс, да бисте видели како користи снагу бафера за манипулисање токовима бинарних података. Испоставило се да су ово датотеке у гзиповању. Док читате, документујте оно што научите и љубазно поделите са нама овде у коментарима.

Надам се да вам је овај увод помогао да боље разумете Ноде.јс бафер.

Ако сматрате да сам добро обавио посао и да други заслужују прилику да то виде, молим вас тапшајте за чланак да бисте помогли ширењу бољег разумевања бафера у нашој заједници Ноде.јс.

Ако имате питање на које нисте добили одговор или ако другачије разумете неке од тачака овде, слободно испустите коментаре овде или путем Твиттера.