Порчаҳои ёддоштҳо барои ин мақола тобистони соли гузашта ҷамъоварӣ шуданд. Ҳамаи ин вақт дар сайти расмӣ https://core.telegram.org ҳуҷҷатҳо дар қабати 23 буд, яъне. дар ҷое дар соли 2014 часпида буд (дар хотир доред, ки он замон ҳатто каналҳо вуҷуд надоштанд?). Албатта, дар назария, ин бояд имкон медод, ки муштарии дорои функсия дар он вақт дар соли 2014 амалӣ карда шавад. Аммо дар ин долат хам хуччатхо, аввалан, нопурра буданд, сониян, дар чойхо хилофи худ ме-кард. Каме бештар аз як моҳ пеш, дар моҳи сентябри соли 2019, он буд тасодуфан маълум шуд, ки сайт дорои навсозии калони ҳуҷҷатҳо мебошад, барои қабати комилан тару тоза 105, бо қайд, ки ҳоло ҳама чизро дубора хондан лозим аст. Воқеан, мақолаҳои зиёде аз нав дида баромада шуданд, вале бисёре аз онҳо бетағйир монданд. Аз ин рӯ, ҳангоми хондани танқиди зер дар бораи ҳуҷҷатҳо, шумо бояд дар хотир дошта бошед, ки баъзе аз ин чизҳо дигар аҳамият надоранд, аммо баъзеҳо ҳоло ҳам комиланд. Баъд аз ҳама, 5 сол дар ҷаҳони муосир на танҳо бисёр, балки хеле бисёр. Аз он вақт инҷониб (махсусан агар шумо геочатҳои партофташуда ва эҳёшударо аз он вақт ба инобат нагиред), шумораи усулҳои API дар схема аз сад то дусаду панҷоҳ афзоиш ёфтааст!
Шумо ҳамчун нависандаи ҷавон аз куҷо оғоз мекунед?
Фарқ надорад, ки шумо аз сифр менависед ё истифода баред, масалан, китобхонаҳои тайёр ба монанди Telethon барои Python ё Madeline барои PHP, дар ҳар сурат, аввал ба шумо лозим меояд аризаи худро ба қайд гиред - параметрҳоро ба даст оредapi_id и api_hash (онҳое, ки бо API VKontakte кор кардаанд, фавран мефаҳманд), ки тавассути он сервер барномаро муайян мекунад. Ин бояд ба бо сабабҳои ҳуқуқӣ, вале мо бештар дар бораи он сӯҳбат хоҳем кард, ки чаро муаллифони китобхона наметавонанд онро дар қисми дуюм нашр кунанд. Шояд шумо аз арзишҳои санҷиш қаноатманд бошед, гарчанде ки онҳо хеле маҳдуданд - далел ин аст, ки ҳоло шумо метавонед дар рақами худ сабти ном кунед танҳо якто ариза, бинобар ин саросема нашавед.
Ҳоло, аз нуқтаи назари техникӣ, мо бояд ба он таваҷҷӯҳ кунем, ки пас аз бақайдгирӣ мо бояд аз Telegram дар бораи навсозии ҳуҷҷатҳо, протокол ва ғайра огоҳинома гирем. Яъне тахмин кардан мумкин аст, ки сайти докҳо ба таври оддӣ "баҳо гирифта шудааст" ва махсусан бо онҳое, ки ба мизоҷон шурӯъ карданд, кор карданро идома медоданд, зеро. осонтар аст. Аммо не, чунин чизе мушохида нашуд, маълумоте наомад.
Ва агар шумо аз сифр нависед, пас истифодаи параметрҳои гирифташуда воқеан хеле дур аст. Гарчанде https://core.telegram.org/ ва дар бораи онҳо аввал дар Оғози кор сӯҳбат мекунад, дар асл, шумо аввал бояд амалӣ кунед Протоколи MTProto - аммо агар бовар кунед тарҳ аз рӯи модели OSI дар охири сахифаи тавсифи умумии протокол, баъд тамоман бехуда.
Дар асл, ҳам пеш аз MTProto ва ҳам баъд аз он, дар якчанд сатҳҳо якбора (чунон ки шабакаҳои хориҷӣ, ки дар ядрои OS кор мекунанд, вайронкунии қабат) як мавзӯи калон, дарднок ва даҳшатнок дар роҳ хоҳад шуд ...
Сериализатсияи дуӣ: TL (Type Language) ва схемаи он, қабатҳо ва бисёр калимаҳои даҳшатноки дигар
Дарвоқеъ ин мавзӯъ калиди мушкилоти Telegram аст. Ва агар шумо кӯшиш кунед, ки онро омӯзед, бисёр суханони даҳшатнок хоҳанд буд.
Пас, схема. Агар ин калимаро дар ёд дошта бошӣ, бигӯ: Схемаи JSONШумо дуруст фикр кардед. Мақсад як аст: баъзе забонҳо барои тавсифи маҷмӯи эҳтимолии додаҳои интиқолшуда. Дар асл, дар ин ҷо монандӣ ба охир мерасад. Агар аз сахифа Протоколи MTProto, ё аз дарахти сарчашмаи муштарии расмӣ, мо кӯшиш мекунем, ки ягон схемаро кушоем, мо чизеро мебинем:
Шахсе, ки инро бори аввал мебинад, ба таври интуитивӣ танҳо як қисми он чизе, ки навишта шудааст, эътироф мекунад - хуб, инҳо аз афташ сохторҳо ҳастанд (гарчанде ки ном дар куҷост, дар чап ё рост?), Дар онҳо майдонҳо мавҷуданд, ки пас аз он. навъи ба воситаи ғафс мегузарад ... эҳтимол. Дар ин ҷо, дар қавсҳои кунҷӣ, эҳтимол қолабҳое ҳастанд, ки дар C ++ (дар асл, на он қадар). Ва ҳамаи рамзҳои дигар чӣ маъно доранд, аломатҳои савол, аломатҳои нидо, фоизҳо, торҳо (ва бешубҳа онҳо дар ҷойҳои гуногун чизҳои гуногунро доранд), дар ҷое мавҷуданд, аммо на дар ҷое, рақамҳои шонздаҳӣ - ва муҳимтар аз ҳама, аз ин чӣ гуна ба даст овардан мумкин аст дуруст (ки аз ҷониби сервер рад карда намешавад) ҷараёни байт? Шумо бояд ҳуҷҷатҳоро хонед (Бале, дар наздикии версияи JSON ба схема истинодҳо мавҷуданд - аммо ин онро равшантар намекунад).
Кушодани саҳифа Сериализатсияи маълумотҳои дуӣ ва ба олами ҷодугарии занбурўғҳо ва математикаи дискретӣ, чизе монанд ба матан дар соли 4 ғарқ шавед. Алифбо, намуд, арзиш, комбинатор, комбинатори функсионалӣ, шакли муқаррарӣ, навъи таркибӣ, навъи полиморфӣ... ва ин танҳо саҳифаи аввал аст! Оянда шуморо интизор аст Забони TL, ки гарчанде ки он аллакай як мисоли дархост ва посухи ночизро дар бар мегирад, аммо ба ҳолатҳои маъмулӣ умуман ҷавоб намедиҳад, ки ин маънои онро дорад, ки шумо бояд дар ҳашт лонаҳои дигар аз такрори математикаи аз русӣ ба англисӣ тарҷумашуда гузаред. саҳифаҳо!
Хонандагоне, ки бо забонҳои функсионалӣ ва хулосабарории навъи автоматӣ ошно ҳастанд, албатта, дар ин забон тавсифи ҳатто аз як мисол хеле ошнотар диданд ва гуфта метавонанд, ки ин умуман дар асл бад нест. Эътирозҳо ба ин инҳоянд:
ҳа, цель хуб садо медиҳад, аммо афсӯс ба даст наомадааст
таҳсил дар донишгоҳҳои Русия ҳатто дар байни ихтисосҳои IT фарқ мекунад - на ҳама курси мувофиқро мехонанд
Дар охир, чунон ки мебинем, дар амал чунин аст талаб карда намешавад, зеро танҳо як қисми маҳдуди ҳатто TL, ки тавсиф шудааст, истифода мешавад
Чунон ки гуфтем ЛеоНерд дар канал #perl дар шабакаи FreeNode IRC, кӯшиши амалӣ кардани дарвоза аз Telegram ба Matrix (тарҷумаи иқтибос аз хотира нодуруст аст):
Чунин ба назар мерасад, ки касе, ки бори аввал бо назарияи чопӣ шинос шуда буд, ба ҳаяҷон омад ва кӯшиш кард, ки бо он бозӣ кунад, аслан парвое надорад, ки оё он дар амал зарур буд.
Худатон бубинед, ки оё эҳтиёҷ ба навъҳои бараҳна (int, long ва ғайра) ҳамчун чизи ибтидоӣ саволҳоро ба миён намеорад - дар ниҳоят онҳо бояд дастӣ амалӣ карда шаванд - масалан, биёед кӯшиш кунем, ки аз онҳо ҳосил кунем. вектор. Яъне, дар асл, массиви, агар шумо чизҳои ҳосилшударо бо номҳои хосашон хонед.
Ҳамеша таърифро оғоз мекунад созанда, баъд аз он, ихтиёрӣ (дар амал, ҳамеша) тавассути аломат # бояд CRC32 аз сатри тавсифи нормалшудаи навъи додашуда. Баъдан тавсифи майдонҳо меояд, агар онҳо бошанд - навъи метавонад холӣ бошад. Њамаи он бо аломати баробар ба охир мерасад, номи намуде, ки конструктори додашуда ба он тааллуќ дорад, яъне дар воќеъ, зертип. Навъи дар тарафи рости аломати баробар аст полиморфӣ - яъне он метавонад ба якчанд намуди мушаххас мувофиқат кунад.
Агар таъриф пас аз сатр пайдо шавад ---functions---, он гоҳ синтаксис бетағйир мемонад, аммо маъно дигар хоҳад буд: созанда номи функсияи RPC мегардад, майдонҳо ба параметрҳо табдил меёбанд (хуб, яъне он ҳамон сохтори додашуда боқӣ мемонад, ки дар зер тавсиф шудааст, он танҳо маънои додашуда хоҳад буд) ва "навъи полиморфӣ" навъи натиҷаи баргардонидашуда мебошад. Дуруст аст, ки он ҳанӯз ҳам полиморфӣ боқӣ мемонад - танҳо дар бахш муайян карда шудааст ---types---, ва ин конструктор ба назар гирифта намешавад. Аз рӯи аргументҳояшон изофабории функсияҳои даъватшударо нависед, яъне. бо баъзе сабабҳо, дар TL якчанд функсияҳо бо як ном, вале имзои дигар, ба монанди C++, таъмин карда намешаванд.
Чаро "конструктор" ва "полиморфӣ" агар он OOP набошад? Хуб, дар асл, барои касе осонтар мешавад, ки дар ин бора аз нуқтаи назари OOP фикр кунад - як навъи полиморфӣ ҳамчун синфи абстрактӣ ва конструкторҳо синфҳои насли мустақими он мебошанд, илова бар ин final дар истилохоти як катор забонхо. Дар асл, албатта, дар ин ҷо монандӣ бо усулҳои воқеии созанда дар забонҳои барномасозии OO. Азбаски дар ин ҷо танҳо сохторҳои додаҳо мавҷуданд, усулҳо вуҷуд надоранд (гарчанде ки тавсифи функсияҳо ва усулҳои дар поён овардашуда қодир аст, ки дар сар дар бораи он ки онҳо чӣ гунаанд, нофаҳмиҳо эҷод кунанд, аммо ин дар бораи чизи дигар аст) - шумо метавонед конструкторро ҳамчун арзиш аз он сохта шуда истодааст ҳангоми хондани ҷараёни байтҳо нависед.
Ин чӣ гуна рӯй медиҳад? Deserializer, ки ҳамеша 4 байтро мехонад, арзишро мебинад 0xcrc32 - ва мефаҳмад, ки минбаъд чӣ мешавад field1 бо навъи int, яъне. маҳз 4 байт мехонад, дар ин майдони болои бо навъи PolymorType хонед. Мебинад 0x2crc32 ва мефаҳмад, ки ду соҳаи минбаъда вуҷуд дорад, аввал long, бинобар ин мо 8 байтро мехонем. Ва он гоҳ боз як намуди мураккаб, ки ба ҳамин тарз deserialized аст. Барои намуна, Type3 метавонад дар схема эълон карда шавад, вақте ки мутаносибан ду конструктор, минбаъд бояд бо ҳам вохӯранд 0x12abcd34, пас аз он шумо бояд 4 байти дигарро хонед int, ё 0x6789cdef, ки пас аз он чизе нахоҳад буд. Ҳама чизи дигар - шумо бояд истисноро партоед. Ба ҳар ҳол, пас аз ин мо ба мутолиаи 4 байт бармегардем int майдонҳо field_c в constructorTwo ва дар ин бора мо хондани худро ба охир мерасонем PolymorType.
Ниҳоят, агар дастгир 0xdeadcrc барои constructorThree, пас кор боз мураккабтар мешавад. Майдони аввалини мо bit_flags_of_what_really_present бо навъи # - дар асл, ин танҳо тахаллус барои навъи аст natмаънои «шумораи табиӣ». Яъне, дар асл, unsigned int ягона ҳолатест, ки рақамҳои беимзо дар схемаҳои воқеӣ пайдо мешаванд. Ҳамин тавр, навбатӣ конструксия бо аломати савол аст, ки маънои онро дорад, ки ин майдон аст - он танҳо дар сим мавҷуд хоҳад буд, агар битаи мувофиқ дар майдони истинодшуда (тақрибан ба монанди оператори сегона) насб карда шавад. Пас, фарз кунед, ки ин бит фаъол буд, пас шумо бояд як майдонеро хонед Type, ки дар мисоли мо 2 конструктор дорад. Яке холӣ аст (танҳо аз муайянкунанда иборат аст), дигаре майдон дорад ids бо навъи ids:Vector<long>.
Шумо шояд фикр кунед, ки ҳам шаблонҳо ва ҳам генерикҳо хуб ё Java мебошанд. Аммо не. Қариб. Ин ягона ҳолати қавсҳои кунҷӣ дар схемаҳои воқеӣ ва он ТАНҲО барои Вектор истифода мешавад. Дар ҷараёни байт, ин барои худи навъи Вектор 4 CRC32 байт хоҳад буд, ҳамеша якхела, баъд 4 байт - шумораи элементҳои массив ва сипас худи ин элементҳо.
Ба ин илова кунед, ки сериализатсия ҳамеша бо калимаҳои 4 байт рух медиҳад, ҳама намудҳо ба он баробар мебошанд - навъҳои дарунсохт низ тавсиф карда мешаванд. bytes и string бо serialization дастӣ дарозии ва ин ҳамоҳангӣ аз тарафи 4 - хуб, ба назар мерасад, он муқаррарӣ ва ҳатто нисбатан самаранок садо? Гарчанде ки TL иддао мешавад, ки сериализатсияи самарабахши дуӣ аст, аммо ба ҷаҳаннам бо тавсеаи ҳама чиз, ҳатто арзишҳои булӣ ва сатрҳои як аломати то 4 байт, оё JSON боз ҳам ғафстар хоҳад буд? Нигоҳ кунед, ҳатто майдонҳои нолозимро бо парчамҳои бит гузариш кардан мумкин аст, ҳама чиз хуб аст ва ҳатто барои оянда васеъ карда мешавад, оё шумо баъдтар ба конструктор майдонҳои нави ихтиёриро илова кардаед?..
Аммо не, агар шумо на тавсифи мухтасари ман, балки ҳуҷҷатҳои пурраро хонед ва дар бораи татбиқи он фикр кунед. Аввалан, CRC32-и созанда аз рӯи сатри тавсифи матни схемаи муқарраршуда ҳисоб карда мешавад (хосагии изофӣ хориҷ кунед ва ғ.) - аз ин рӯ, агар майдони нав илова карда шавад, сатри тавсифи навъи он тағир меёбад ва аз ин рӯ, CRC32 ва дар натиҷа сериализатсия мешавад. Ва муштарии кӯҳна чӣ кор мекард, агар ӯ майдонеро бо парчамҳои нав гирифта бошад, аммо намедонист, ки минбаъд бо онҳо чӣ кор кунад? ..
Дуюм, биёед дар хотир дорем CRC32, ки дар ин ҷо асосан ҳамчун истифода бурда мешавад вазифаҳои шудаи барои ба таври ягона муайян кардани кадом навъи сериализатсия (де) карда мешавад. Дар ин ҷо мо бо мушкилоти бархӯрд рӯ ба рӯ мешавем - ва не, эҳтимолият дар як 232 нест, балки хеле бештар аст. Кӣ дар хотир дошт, ки CRC32 барои ошкор (ва ислоҳ кардани) хатогиҳо дар канали коммуникатсия ва мувофиқан беҳтар кардани ин хосиятҳо ба зарари дигарон пешбинӣ шудааст? Масалан, вай ба ивазкунии байтҳо аҳамият надорад: агар шумо CRC32-ро аз ду сатр ҳисоб кунед, дар дуюм шумо 4 байти аввалро бо 4 байти оянда иваз мекунед - ин ҳамон хоҳад буд. Вақте ки мо сатрҳои матниро аз алифбои лотинӣ (ва аломати каме) ҳамчун вуруд дорем ва ин номҳо махсусан тасодуфӣ нестанд, эҳтимолияти чунин ивазшавӣ хеле зиёд мешавад.
Дар омади гап, кй тафтиш кард, ки дар он чо чй буд дар ҳақиқат CRC32? Дар яке аз сарчашмаҳои ибтидоӣ (ҳатто пеш аз Уолтман) функсияи хэш мавҷуд буд, ки ҳар як аломатро ба рақами 239 зарб мекард, ки аз ҷониби ин одамон маҳбуб аст, ҳа ҳа!
Ниҳоят, хуб, мо фаҳмидем, ки конструкторҳо бо навъи майдон Vector<int> и Vector<PolymorType> CRC32-и гуногун хоҳад дошт. Ва дар бораи презентатсия дар сатр чӣ гуфтан мумкин аст? Ва аз ҷиҳати назария, оё он як қисми намуд мешавад? Биё мегӯянд, ки мо як массиви даҳ ҳазор рақамҳо мегузарад, хуб, бо Vector<int> ҳама чиз равшан аст, дарозӣ ва дигар 40000 байт. Ва агар ин Vector<Type2>, ки танхо аз як майдон иборат аст int ва он ягона дар намуд аст - оё мо бояд 10000xabcdef0-ро 34 маротиба ва сипас 4 байт такрор кунем int, ё забон қодир аст, ки инро барои мо аз созанда НАМОИШ диҳад fixedVec ва ба ҷои 80000 40000 байт боз ҳамагӣ XNUMX XNUMX интиқол диҳед?
пас шумо интизори на танҳо вектор, балки вектори истифодабарандагон ҳастед. Аниқтараш, бояд мунтазир бошед - дар коди воқеӣ, ҳар як элемент, агар як навъи луч набошад, конструктор дорад ва ба таври хуб ҳангоми татбиқ тафтиш кардан лозим буд - ва мо маҳз дар ҳар як элементи ин вектор фиристода шудаем. он навъи? Ва агар он як намуди PHP бошад, ки дар он массив метавонад намудҳои гуногунро дар унсурҳои гуногун дошта бошад?
Ин таърифи навъи шаблони hasshmap аст, ҳамчун вектори ҷуфтҳои int - Type. Дар C++ он чизе монанди ин хоҳад буд:
template <T> class IntHash {
vector<pair<int,T>> _map;
}
ҳамин тавр, alpha - калимаи калид! Аммо танҳо дар C++ шумо метавонед T нависед, аммо шумо бояд алфа, бета нависед... Аммо на бештар аз 8 параметр, фантазия дар тета анҷом ёфт. Пас, ба назар чунин мерасад, ки боре дар Санкт-Петербург тақрибан чунин муколамаҳо буданд:
-- Надо сделать в TL шаблоны
-- Бл... Ну пусть параметры зовут альфа, бета,... Какие там ещё буквы есть... О, тэта!
-- Грамматика? Ну потом напишем
-- Смотрите, какой я синтаксис придумал для шаблонов и вектора!
-- Ты долбанулся, как мы это парсить будем?
-- Да не ссыте, он там один в схеме, захаркодить -- и ок
Василий, [09.10.18 17:07] Бештар аз ҳама, хар аз он гарм аст, ки онҳо як даста абстраксияҳоро печонданд ва сипас ба болт заданд ва кодгегераторро бо асобағалҳо пӯшониданд.
Дар натича аввал аз докхо пилот.jpg
Сипас аз рамзи jekichan.webp
Албатта, аз одамоне, ки бо алгоритмҳо ва математика ошно ҳастанд, мо метавонем интизор шавем, ки онҳо Aho, Ullman-ро хондаанд ва бо асбобҳое шиносанд, ки дар тӯли даҳсолаҳо барои навиштани компиляторҳои DSL-и худ стандарти воқеии саноат гаштаанд, дуруст? . .
Бо телеграмма-кли Виталий Валтман аст, чунон ки аз пайдоиши формати TLO берун аз ҳудуди он (cli) фаҳмида мешавад, узви даста - ҳоло китобхона барои таҳлили TL ҷудо карда шудааст. алоҳидатаассуроти вай чй гуна аст Таҳлилгари TL? ..
struct tree *parse_args4 (void) {
PARSE_INIT (type_args4);
struct parse so = save_parse ();
PARSE_TRY (parse_optional_arg_def);
if (S) {
tree_add_child (T, S);
} else {
load_parse (so);
}
if (LEX_CHAR ('!')) {
PARSE_ADD (type_exclam);
EXPECT ("!");
}
PARSE_TRY_PES (parse_type_term);
PARSE_OK;
}
ё
# Regex to match the whole line
match = re.match(r'''
^ # We want to match from the beginning to the end
([w.]+) # The .tl object can contain alpha_name or namespace.alpha_name
(?:
# # After the name, comes the ID of the object
([0-9a-f]+) # The constructor ID is in hexadecimal form
)? # If no constructor ID was given, CRC32 the 'tl' to determine it
(?:s # After that, we want to match its arguments (name:type)
{? # For handling the start of the '{X:Type}' case
w+ # The argument name will always be an alpha-only name
: # Then comes the separator between name:type
[wd<>#.?!]+ # The type is slightly more complex, since it's alphanumeric and it can
# also have Vector<type>, flags:# and flags.0?default, plus :!X as type
}? # For handling the end of the '{X:Type}' case
)* # Match 0 or more arguments
s # Leave a space between the arguments and the equal
=
s # Leave another space between the equal and the result
([wd<>#.?]+) # The result can again be as complex as any argument type
;$ # Finally, the line should always end with ;
''', tl, re.IGNORECASE | re.VERBOSE)
Умуман, дар ниҳоят, таҳлилгар ва генератори код барои зермаҷмӯаи воқеан истифодашудаи TL ба тақрибан 100 сатри грамматика ва ~ 300 сатри генератор (аз ҷумла ҳама) мувофиқат мекунанд. printкоди тавлидшуда), аз ҷумла навъи хушҳолӣ, маълумотро барои интроспекция дар ҳар як синф нависед. Ҳар як намуди полиморфӣ ба синфи абстрактии холӣ табдил дода мешавад ва конструкторҳо аз он мерос мегиранд ва дорои усулҳои сериализатсия ва десериализатсия мебошанд.
Шояд мушкилот сирф дар муштарии ғайрирасмии мо бошад? Не, мо Telegram Desktop 1.2.17-ро иҷро мекунем (версияи бо як қатор тақсимоти Linux таъминшуда), он ба қайди Истисно менависад: навъи MTP ғайричашмдошт ID #b5223b0f дар MTPMessageMedia хонда мешавад…
Google нишон дод, ки мушкилоти шабеҳ аллакай бо яке аз муштариёни ғайрирасмӣ рух додааст, аммо баъд рақамҳои версия ва мувофиқан фарзияҳо гуногун буданд ...
Пас, чӣ бояд кард? Василий ва ман ҷудо шудем: ӯ кӯшиш кард, ки схемаро ба 91 навсозӣ кунад, ман қарор додам, ки чанд рӯз интизор шавам ва 73 кӯшиш кунам. Ҳарду усул кор карданд, аммо азбаски онҳо эмпирикӣ ҳастанд, фаҳмиши он нест, ки чанд версияи шумо бояд ҷаҳида шавад. ё поён, на чӣ қадар вақт шумо бояд интизор шавед.
Шарҳ? Тавре ки шумо метавонед аз нишонаҳои гуногуни ғайримустақим тахмин кунед, сервер аз намудҳои гуногуни равандҳо дар мошинҳои гуногун иборат аст. Эҳтимол, яке аз серверҳое, ки барои "буферсозӣ" масъул аст, он чизеро, ки болотар дода буданд, ба навбат мегузоранд ва онҳо онро бо схемае, ки дар замони тавлид буд, доданд. Ва то даме, ки ин навбат «пӯсида» буд, коре карда наметавонист.
Магар... аммо ин асобаги даҳшатбор аст?!.. Не, пеш аз он ки дар бораи андешаҳои девона фикр кунем, биёед ба коди муштариёни расмӣ назар андозем. Дар версияи Android, мо ягон таҳлилгари TL-ро намеёбем, аммо мо файли вазнинеро пайдо мекунем (github ранг кардани онро рад мекунад) бо (de) сериализатсия. Инҳоянд пораҳои код:
public static class TL_message_layer68 extends TL_message {
public static int constructor = 0xc09be45f;
//...
//еще пачка подобных
//...
public static class TL_message_layer47 extends TL_message {
public static int constructor = 0xc992e15c;
public static Message TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
Message result = null;
switch (constructor) {
case 0x1d86f70e:
result = new TL_messageService_old2();
break;
case 0xa7ab1991:
result = new TL_message_old3();
break;
case 0xc3060325:
result = new TL_message_old4();
break;
case 0x555555fa:
result = new TL_message_secret();
break;
case 0x555555f9:
result = new TL_message_secret_layer72();
break;
case 0x90dddc11:
result = new TL_message_layer72();
break;
case 0xc09be45f:
result = new TL_message_layer68();
break;
case 0xc992e15c:
result = new TL_message_layer47();
break;
case 0x5ba66c13:
result = new TL_message_old7();
break;
case 0xc06b9607:
result = new TL_messageService_layer48();
break;
case 0x83e5de54:
result = new TL_messageEmpty();
break;
case 0x2bebfa86:
result = new TL_message_old6();
break;
case 0x44f9b43d:
result = new TL_message_layer104();
break;
case 0x1c9b1027:
result = new TL_message_layer104_2();
break;
case 0xa367e716:
result = new TL_messageForwarded_old2(); //custom
break;
case 0x5f46804:
result = new TL_messageForwarded_old(); //custom
break;
case 0x567699b3:
result = new TL_message_old2(); //custom
break;
case 0x9f8d60bb:
result = new TL_messageService_old(); //custom
break;
case 0x22eb6aba:
result = new TL_message_old(); //custom
break;
case 0x555555F8:
result = new TL_message_secret_old(); //custom
break;
case 0x9789dac4:
result = new TL_message_layer104_3();
break;
ё
boolean fixCaption = !TextUtils.isEmpty(message) &&
(media instanceof TLRPC.TL_messageMediaPhoto_old ||
media instanceof TLRPC.TL_messageMediaPhoto_layer68 ||
media instanceof TLRPC.TL_messageMediaPhoto_layer74 ||
media instanceof TLRPC.TL_messageMediaDocument_old ||
media instanceof TLRPC.TL_messageMediaDocument_layer68 ||
media instanceof TLRPC.TL_messageMediaDocument_layer74)
&& message.startsWith("-1");
Ҳмм... ин девона ба назар мерасад. Аммо, эҳтимол, ин рамзи тавлидшуда аст, пас хуб? .. Аммо он бешубҳа ҳама версияҳоро дастгирӣ мекунад! Дуруст, маълум нест, ки чаро ҳама чиз дар як тӯда ва чатҳои пинҳонӣ ва ҳар гуна _old7 гӯё ба насли мошини монанд нест ... Бо вуҷуди ин, бештар аз ҳама ман чормащз аз рафт
public static class TL_folders_deleteFolder extends TLObject {
public static int constructor = 0x1c295881;
public int folder_id;
public TLObject deserializeResponse(AbstractSerializedData stream, int constructor, boolean exception) {
return Updates.TLdeserialize(stream, constructor, exception);
}
public void serializeToStream(AbstractSerializedData stream) {
stream.writeInt32(constructor);
stream.writeInt32(folder_id);
}
}
//manually created
//RichText start
public static abstract class RichText extends TLObject {
public String url;
public long webpage_id;
public String email;
public ArrayList<RichText> texts = new ArrayList<>();
public RichText parentRichText;
public static RichText TLdeserialize(AbstractSerializedData stream, int constructor, boolean exception) {
RichText result = null;
switch (constructor) {
case 0x1ccb966a:
result = new TL_textPhone();
break;
case 0xc7fb5e01:
result = new TL_textSuperscript();
break;
Ин шарҳи "дастӣ сохташуда" дар ин ҷо нишон медиҳад, ки танҳо як қисми ин файл бо даст навишта шудааст (метавонед даҳшати нигоҳубинро тасаввур кунед?) ва боқимонда мошин тавлид карда мешавад. Аммо, пас саволи дигар ба миён меояд - ки манбаъҳо дастрасанд пурра не (a la blobs дар зери GPL дар ядрои Linux), аммо ин аллакай мавзӯи қисми дуюм аст.
Аммо басанда. Биёед ба протокол гузарем, ки дар болои он ҳамаи ин силсиласозӣ таъқиб карда мешавад.
MT Proto
Пас биёед кушоем тавсифи умумӣ и тавсифи муфассали протокол ва аввалин чизе, ки мо пешпо мехӯрем, истилоҳот аст. Ва бо фаровонии ҳама чиз. Умуман, ин як тамғаи тиҷоратии Telegram аст - барои занг задан дар ҷойҳои гуногун бо роҳҳои гуногун ё чизҳои гуногун бо як калима ё баръакс (масалан, дар API-и сатҳи баланд, агар шумо бастаи стикерро бинед - ин он чизе нест, ки шумо фикр мекардед).
Масалан, "паём" (паём) ва "сессия" (сессия) - дар ин ҷо онҳо чизи дигареро дар назар доранд, ки дар интерфейси муқаррарии муштарии Telegram фарқ мекунанд. Хуб, бо паём ҳама чиз равшан аст, онро метавон аз рӯи OOP маънидод кард, ё танҳо калимаи "баста" номида мешавад - ин сатҳи пасти интиқол аст, ҳамон паёмҳо, ки дар интерфейс нестанд, бисёранд. аз хизматрасонй. Аммо сессия ... аммо чизи аввал.
Пас аз як рӯз муштарӣ бояд файлеро аз он дархост кунад дигар DC - ва барои ин DC як нав тавлид мешавад auth_key !
Ба система бигӯед, ки ин як корбари нав нест, балки ҳамон як аст ваколат (Сеанси UI), муштарӣ зангҳои API-ро истифода мебарад auth.exportAuthorization дар хона DC auth.importAuthorization дар DC нав.
Бо вуҷуди ин, метавонад якчанд кушода бошад Сеансҳои MTProto (ҳар як бо худ session_id) ба ин DC нав, дар зери вайauth_key.
Дар ниҳоят, муштарӣ метавонад махфияти комили пешгириро талаб кунад. Хар auth_key ки Доимӣ калиди - дар як DC - ва муштарӣ метавонад занг занад auth.bindTempAuthKey барои истифода муваққатӣauth_key - ва боз, танҳо як temp_auth_key дар як DC, умумӣ барои ҳама Сеансҳои MTProto ба ин DC.
Чаро initConnection занги ҷудогона буда наметавонад, аммо бояд парпеч бошад? Бале, чунон ки маълум шуд, он бояд хар дафъа дар аввали хар як машгулият анчом дода шавад, на якдафъаина, мисли калиди асосй. Аммо! Онро корбари беиҷозат занг зада наметавонад! Дар ин ҷо мо ба марҳилае расидем, ки дар он татбиқ карда мешавад Ҳаминаш саҳифаи ҳуҷҷатгузорӣ - ва он ба мо мегӯяд, ки ...
Танҳо як қисми ками усулҳои API барои корбарони беиҷозат дастрас аст:
auth.sendCode
auth.resendCode
account.getPassword
auth.checkPassword
auth.checkPhone
auth.signUp
auth.signIn
auth.importAuthorization
help.getConfig
help.getNearestDc
help.getAppUpdate
help.getCdnConfig
langpack.getLangPack
langpack.getStrings
langpack.getDifference
langpack.getLanguages
langpack.getLanguage
Аввалин аз онхо auth.sendCode, ва он дархости аввалини арзишманд вуҷуд дорад, ки дар он мо api_id ва api_hash мефиристем ва пас аз он мо SMS бо код мегирем. Ва агар мо ба DC-и нодуруст расида бошем (масалан, рақамҳои телефони ин кишварро дигар хидмат мекунанд), пас мо бо рақами DC-и дилхоҳ хато мегирем. Барои фаҳмидани он ки мо бояд бо рақами DC ба кадом суроғаи IP пайваст шавем, ба мо кӯмак мекунад help.getConfig. Замоне ҳамагӣ 5 сабт буд, аммо пас аз рӯйдодҳои маъруфи соли 2018 шумораи онҳо ба таври назаррас афзоиш ёфт.
Дар ин ҷо нишон дода мешавад, ки ин ҷавоб ба кадом паём аст. Аз ин рӯ, дар сатҳи болоии API, шумо бояд дар хотир доред, ки дархости шумо кадом рақамро дошт - ман фикр мекунам, шарҳ додан лозим нест, ки кор асинхронӣ аст ва дар як вақт якчанд дархостҳо вуҷуд доранд, ки ҷавобҳо ба онҳо дода мешаванд. бо ягон тартиб баргардонидан мумкин аст? Аслан, аз ин ва паёмҳои хатогиҳо, ба монанди ҳеҷ коргарон, меъмории паси онро метавон пайгирӣ кард: сервере, ки пайвасти TCP-ро бо шумо нигоҳ медорад, мувозинати фронт аст, он дархостҳоро ба пуштибонҳо равона мекунад ва онҳоро бозпас ҷамъ мекунад. message_id. Дар ин ҷо ҳама чиз равшан, мантиқӣ ва хуб ба назар мерасад.
Бале?.. Ва агар дар ин бора фикр кунед? Охир, худи вокуниши RPC низ майдон дорад msg_id! Оё мо бояд ба сервер фарёд занем "шумо ба ҷавоби ман ҷавоб намедиҳед!"? Ва ҳа, дар бораи тасдиқ чӣ буд? Дар бораи саҳифа паёмҳо дар бораи паёмҳо ба мо мегӯяд, ки чӣ аст
msgs_ack#62d6b459 msg_ids:Vector long = MsgsAck;
ва хар тараф бояд ин корро кунад. Аммо на ҳамеша! Агар шумо RpcResult гиред, он худ ба худ ҳамчун эътироф хизмат мекунад. Яъне, сервер метавонад ба дархости шумо бо MsgsAck посух диҳад, масалан, "Ман онро гирифтам". Дарҳол метавонад ба RpcResult ҷавоб диҳад. Он метавонад ҳарду бошад.
Ва ҳа, шумо ба ҳар ҳол бояд ҷавоб диҳед! Тасдиқ. Дар акси ҳол, сервер онро расониданашуда ҳисоб мекунад ва онро дубора ба шумо мепартояд. Ҳатто пас аз пайвастшавӣ. Аммо дар ин ҷо, албатта, саволи вақт-аут ба миён меояд. Биёед каме дертар ба онҳо назар кунем.
a) Сервер MsgsAck ҷавоб дод - паём расонида шуд, мо онро аз "навбати дигар" нест мекунем.
б) Ё баръакс, ба ӯ чизе маъқул нашуд, ӯ ҷавоб дод badmsg - мо аз "навбати дигар" дубора мефиристем
в) Ҳеҷ чиз маълум нест, зарур аст, ки паёмро аз навбати дигар дубора фиристед - аммо кай маълум нест.
Ниҳоят сервер ҷавоб дод RpcResult - вокуниши воқеӣ (ё хато) - на танҳо расонида шуд, балки коркард шудааст.
Эҳтимол, истифода бурдани зарфхо масъаларо кисман хал карда метавонист. Ин вақтест, ки як қатор паёмҳо дар як паём баста мешаванд ва сервер ба ҳама якбора бо як изҳорот ҷавоб дод. msg_id. Аммо ӯ инчунин ин бастаро рад мекунад, агар чизе хато кунад, инчунин ҳама чизро рад мекунад.
Ва дар ин лаҳза, мулоҳизаҳои ғайритехникӣ ба амал меоянд. Мо аз тачриба асо-сабхои зиёдеро дидем ва илова бар ин, акнун бештар мисолхои маслихату меъмории бадро мебинем — дар чунин шароит оё бовар кардан ва кабул кардани чунин карорхо меарзад? Савол риторикист (албатта не).
Мо дар бораи чӣ гап мезанем? Агар дар мавзӯи "паёмҳои нашъамандӣ дар бораи паёмҳо" шумо ҳоло ҳам метавонед бо эътирозҳое мисли "шумо аблаҳ ҳастед, шумо идеяи олиҷаноби моро нафаҳмидаед!" (аз ин рӯ, аввал ҳуҷҷатҳоро, тавре ки одамони оддӣ бояд бо мисолҳои асоснок ва мубодилаи пакетҳо нависед, пас мо сӯҳбат хоҳем кард), пас вақтҳо / вақтҳо як масъалаи комилан амалӣ ва мушаххас мебошанд, ҳама чиз дар ин ҷо кайҳо маълум аст. Аммо ҳуҷҷатҳо ба мо дар бораи мӯҳлатҳо чӣ мегӯянд?
Сервер одатан гирифтани паёмро аз муштарӣ (одатан, дархости RPC) бо истифода аз посухи RPC эътироф мекунад. Агар посух муддати тӯлонӣ омада бошад, сервер метавонад аввал тасдиқи квитансияро фиристад ва каме дертар худи посухи RPC.
Мизоҷ одатан қабули паёмро аз сервер (одатан ҷавоби RPC) бо илова кардани тасдиқ ба дархости навбатии RPC тасдиқ мекунад, агар он хеле дер интиқол наёбад (агар он тавлид шавад, масалан, пас аз 60-120 сония пас аз қабул). паём аз сервер). Аммо, агар дар муддати тӯлонӣ барои фиристодани паёмҳо ба сервер ягон сабаб вуҷуд надошта бошад ё шумораи зиёди паёмҳои эътирофнашуда аз сервер мавҷуд бошад (масалан, зиёда аз 16), муштарӣ тасдиқи мустақилро интиқол медиҳад.
Мисли пинг кор мекунад. Илова бар ин, пас аз қабули ин, сервер вақтсанҷро оғоз мекунад, ки пайвасти ҷории disconnect_delay пас аз сонияҳоро мебандад, агар он паёми нави як навъ нагирад, ки ҳамаи таймерҳои қаблиро ба таври худкор аз нав барқарор кунад. Агар муштарӣ ин пингҳоро дар ҳар 60 сония як маротиба фиристад, масалан, он метавонад disconnect_delay-ро ба 75 сония баробар кунад.
Шумо аз ақл берун шудед?! Пас аз 60 сония поезд ба вокзал даромада, пассажиронро мефурорад ва мебардорад ва боз дар туннель алокаро гум мекунад. Пас аз 120 сония, вақте ки шумо дар гирду атроф шитофтед, ӯ ба дигараш мерасад ва эҳтимоли зиёд пайвастшавӣ қатъ мешавад. Хуб, маълум аст, ки пойҳо аз куҷо мерӯянд - "Ман зангро шунидам, аммо намедонам дар куҷост", алгоритми Nagle ва варианти TCP_NODELAY мавҷуд аст, ки барои кори интерактивӣ пешбинӣ шудааст. Аммо, бубахшед, арзиши пешфарзии онро таъхир кунед - 200 миллисония. Агар шумо воқеан хоҳед, ки як чизи шабеҳро тасвир кунед ва дар як ҷуфти эҳтимолии бастаҳо сарфа кунед - хуб, онро ҳадди аққал 5 сония гузоред, ё новобаста аз он ки вақти фарорасии паёми "Истифодабаранда чоп мекунад ..." ҳоло ба он баробар аст. Аммо дигар не.
Ва ниҳоят, пингҳо. Яъне, тафтиши зинда будани пайвасти TCP. Ин хандаовар аст, аммо тақрибан 10 сол пеш ман дар бораи паёмбари хобгоҳи факултетамон як матни интиқодӣ навишта будам - дар он ҷо муаллифон серверро аз муштарӣ низ пинг карданд, на баръакс. Аммо донишҷӯёни соли сеюм як чиз ва идораи байналмилалӣ дигар аст, дуруст? ..
Якум, як барномаи хурди таълимӣ. Пайвасти TCP, дар сурати набудани мубодилаи бастаҳо, метавонад ҳафтаҳо зиндагӣ кунад. Ин вобаста ба ҳадаф ҳам хуб ва ҳам бад аст. Хуб, агар шумо пайвасти SSH ба сервер кушода будед, шумо аз компютери худ хестаед, роутери барқро бозоғоз кардед, ба ҷои худ баргаштед - сессия тавассути ин сервер вайрон нашуд (ҳеҷ чиз нанавишт, бастаҳо набуд), қулай. Бад аст, агар дар сервер ҳазорҳо муштарӣ бошанд, ҳар яки онҳо захираҳоро истифода мебаранд (салом Postgres!) Ва мизбони муштарӣ шояд кайҳо боз ба кор андохта шуда бошад - аммо мо дар ин бора намедонем.