Stāsts par vienu nelielu projektu divpadsmit gadu garumā (par BIRMA.NET pirmo reizi un atklāti no pirmavotiem)

Å Ä« projekta dzimÅ”anu var uzskatÄ«t par nelielu ideju, kas man radās kaut kur 2007. gada nogalē, kurai savu galÄ«go formu bija lemts atrast tikai pēc 12 gadiem (Å”obrÄ«d ā€“ protams, lai gan paÅ”reizējā realizācija, saskaņā ar autoram ir ļoti apmierinoÅ”s).

Viss sākās ar to, ka, pildot savus toreizējos dienesta pienākumus bibliotēkā, vērsu uzmanÄ«bu uz to, ka notiek datu ievade no grāmatu (un mÅ«zikas) izdevumu satura rādÄ«tāju ieskenētā teksta esoÅ”ajā datubāzē, t.sk. acÄ«mredzot, var ievērojami vienkārÅ”ot un automatizēt, izmantojot sakārtotÄ«bas un atkārtojamÄ«bas Ä«paŔību visiem ievadei nepiecieÅ”amajiem datiem, piemēram, raksta autora vārds (ja mēs runājam par rakstu krājumu), raksta nosaukums. raksts (vai satura rādÄ«tājā atspoguļotais apakÅ”virsraksts) un aktuālā satura rādÄ«tāja pozÄ«cijas lappuses numurs. Sākumā es biju praktiski pārliecināts, ka Ŕī uzdevuma veikÅ”anai piemērotu sistēmu var viegli atrast internetā. Kad kādu pārsteigumu izraisÄ«ja fakts, ka nevarēju atrast Ŕādu projektu, nolēmu mēģināt to Ä«stenot saviem spēkiem.

Pēc diezgan neilga laika sāka darboties pirmais prototips, kuru uzreiz sāku izmantot savās ikdienas darbÄ«bās, vienlaikus atkļūdojot to visos piemēros, kas nonāca manā rokā. Par laimi, manā parastajā darba vietā, kur es nekādā gadÄ«jumā nebiju programmētājs, man tomēr izdevās iztikt ar redzamām ā€œdÄ«kstāvēmā€ savā darbā, kuras laikā es intensÄ«vi atkļūdoju savu prāta bērnu, kas ir gandrÄ«z neiedomājama lieta mÅ«sdienu realitātē, kas nozÄ«mē. ikdienas atskaites par dienas laikā paveikto. Programmas slÄ«pÄ“Å”anas process kopumā aizņēma ne mazāk kā apmēram gadu, taču arÄ« pēc tam rezultātu diez vai varēja saukt par pilnÄ«gi veiksmÄ«gu - sākotnēji tika izstrādāts pārāk daudz dažādu koncepciju, kas nebija lÄ«dz galam skaidras ievieÅ”anai: izvēles elementi, kurus var tikt izlaists; elementu skatÄ«Å”ana uz priekÅ”u (lai aizstātu iepriekŔējos elementus meklÄ“Å”anas rezultātos); pat mÅ«su paÅ”u mēģinājums ieviest kaut ko lÄ«dzÄ«gu regulārām izteiksmēm (kam ir unikāla sintakse). Jāsaka, ka pirms tam biju nedaudz atteicies no programmÄ“Å”anas (apmēram 8 gadus, ja ne vairāk), tāpēc jaunā iespēja pielietot savas prasmes interesantam un nepiecieÅ”amam uzdevumam pilnÄ«bā piesaistÄ«ja manu uzmanÄ«bu. Nav pārsteidzoÅ”i, ka iegÅ«tais pirmkods ā€” tā kā no manas puses nebija skaidras pieejas tā dizainam ā€” diezgan ātri kļuva par neiedomājamu dažādu C valodas elementu sajaukÅ”anu ar dažiem C++ elementiem un vizuālās programmÄ“Å”anas aspektiem (sākotnēji tas bija tika nolemts izmantot tādu projektÄ“Å”anas sistēmu kā Borland C++ Builder - ā€œgandrÄ«z Delphi, bet Cā€). Tomēr tas viss galu galā nesa augļus mÅ«su bibliotēkas ikdienas darbÄ«bu automatizācijā.

Tajā paŔā laikā es nolēmu katram gadÄ«jumam apmeklēt kursus, lai apmācÄ«tu profesionālus programmatÅ«ras izstrādātājus. Nezinu, vai tur reāli ir iespējams iemācÄ«ties ā€œpar programmētājuā€ no nulles, taču, ņemot vērā jau tobrÄ«d jau esoŔās prasmes, varēju zināmā mērā apgÅ«t lÄ«dz tam laikam aktuālākas tehnoloÄ£ijas, piemēram, kā C#, Visual Studio izstrādei zem .NET, kā arÄ« dažas tehnoloÄ£ijas, kas saistÄ«tas ar Java, HTML un SQL. Visa apmācÄ«ba kopumā aizņēma divus gadus un kalpoja par sākumpunktu citam manam projektam, kas galu galā stiepās vairākus gadus, taču Ŕī ir atseviŔķas publikācijas tēma. Å eit bÅ«tu tikai vietā atzÄ«mēt, ka es mēģināju pielāgot jau esoÅ”os uzlabojumus aprakstÄ«tajā projektā, lai izveidotu pilnvērtÄ«gu logu lietojumprogrammu C# un WinForms, kas ievieÅ” nepiecieÅ”amo funkcionalitāti, un izmantotu to kā pamatu topoÅ”ais diplomprojekts.
Laika gaitā Ŕī ideja man sāka Ŕķist izskanÄ“Å”anas vērta tādās ikgadējās konferencēs, kurās piedalÄ«jās dažādu bibliotēku pārstāvji kā ā€œLIBKOMā€ un ā€œKRIMAā€. Ideja, jā, bet ne mans toreizējais tās Ä«stenoÅ”ana. Tad arÄ« cerēju, ka kāds to pārrakstÄ«s, izmantojot kompetentākas pieejas. Tā vai citādi, bet lÄ«dz 2013. gadam nolēmu uzrakstÄ«t referātu par savu priekÅ”darbu un nosÅ«tÄ«t to Konferences orgkomitejai ar pieteikumu granta saņemÅ”anai dalÄ«bai konferencē. Man par pārsteigumu mans pieteikums tika apstiprināts, un es sāku veikt dažus uzlabojumus projektā, lai sagatavotu to prezentācijai konferencē.

Līdz tam laikam projekts jau bija ieguvis jaunu nosaukumu BIRMA, ieguvis dažādas papildu (ne tik daudz līdz galam realizētas, bet gan pieņemtas) iespējas - visu informāciju var atrast manā pārskatā.

GodÄ«gi sakot, BIRMA 2013 bija grÅ«ti nosaukt par kaut ko pilnÄ«gu; Atklāti sakot, tas bija ļoti hackly amatniecÄ«ba, kas izgatavota steigā. Koda ziņā Ä«paÅ”u jauninājumu praktiski nebija, ja neskaita diezgan bezpalÄ«dzÄ«gu mēģinājumu izveidot parsētājam kaut kādu vienotu sintaksi, kas pēc izskata atgādina IRBIS 64 formatÄ“Å”anas valodu (un patiesÄ«bā arÄ« ISIS sistēmu - ar iekavām kā cikliskas struktÅ«ras; kāpēc Toreiz man likās, ka tas izskatÄ«jās diezgan forÅ”i). Parsētājs bezcerÄ«gi paklupa uz Å”iem atbilstoŔā tipa iekavu apļiem (jo iekavas pildÄ«ja arÄ« citu lomu, proti, parsÄ“Å”anas laikā iezÄ«mēja neobligātas struktÅ«ras, kuras var izlaist). Visus, kas vēlas sÄ«kāk iepazÄ«ties ar tolaik grÅ«ti iztēlojamo, nepamatoto BIRMA sintaksi, vēlreiz vērÅ”u uz savu tā laika referātu.

Kopumā, izņemot to, ka cÄ«nos ar savu parsētāju, man nav ko vairāk teikt par Ŕīs versijas kodu - izņemot esoÅ”o avotu apgriezto pārveidoÅ”anu par C++, vienlaikus saglabājot dažas tipiskas .NET koda funkcijas (ja godÄ«gi, tas ir grÅ«ti saprast , kas tieÅ”i pamudināja visu pārvietot atpakaļ - iespējams, kaut kādas muļķīgas bailes noslēpt savus pirmkodus, it kā tas bÅ«tu kaut kas lÄ«dzvērtÄ«gs Coca-Cola slepenajai receptei).

Iespējams, ka Å”is stulbais lēmums ir arÄ« iemesls grÅ«tÄ«bām izveidoto DLL bibliotēku savienot pārÄ« ar paÅ”taisÄ«tas darbstacijas esoÅ”o interfeisu datu ievadÄ«Å”anai elektroniskajā katalogā (jā, es neminēju vēl vienu svarÄ«gu faktu: turpmāk visi BIRMA ā€œdzinējaā€ kods bija kā paredzēts, tas ir atdalÄ«ts no interfeisa daļas un iepakots atbilstoŔā DLL). Kāpēc Å”iem nolÅ«kiem bija jāraksta atseviŔķa darbstacija, kas tik un tā savā izskatā un mijiedarbÄ«bas ar lietotāju metodē nekaunÄ«gi kopēja to paÅ”u IRBIS 64 sistēmas darbstaciju ā€œKatalogistsā€ - tas ir atseviŔķs jautājums. ÄŖsāk sakot: tas deva vajadzÄ«go pamatÄ«gumu manam toreizējam izlaidumam manam izlaiduma projektam (citādi ar nesagremojamo parsētāju vien kaut kā nepietika). Turklāt es saskāros ar dažām grÅ«tÄ«bām, ievieÅ”ot Cataloger darbstacijas saskarni ar saviem moduļiem, kas tika ieviesti gan C++, gan C#, un tieÅ”i piekļūt savam dzinējam.

Vispār, dÄ«vainā kārtā, tieÅ”i Å”im visai neveiklajam topoŔā BIRMA.NET prototipam bija lemts kļūt par manu ā€œdarba zirguā€ turpmākos četrus gadus. Nevarētu teikt, ka Å”ajā laikā es vismaz nemēģināju atrast veidus jaunai, pilnÄ«gākai sen pastāvoÅ”as idejas Ä«stenoÅ”anai. Starp citiem jauninājumiem jau vajadzēja bÅ«t ligzdotām cikliskām sekvencēm, kurās varēja bÅ«t iekļauti neobligāti elementi - tā es grasÄ«jos iedzÄ«vināt ideju par universālām veidnēm publikāciju bibliogrāfiskiem aprakstiem un dažādām citām interesantām lietām. Taču manā praktiskajā darbÄ«bā tobrÄ«d tas viss bija maz pieprasÄ«ts, un toreizējā realizācija man bija pilnÄ«gi pietiekama satura rādÄ«tāju ievadÄ«Å”anai. Turklāt mÅ«su bibliotēkas attÄ«stÄ«bas vektors arvien vairāk sāka novirzÄ«ties uz muzeju arhÄ«vu digitalizāciju, atskaitēm un citām mani maz interesējoŔām aktivitātēm, kas galu galā lika beidzot to pamest, dodot vietu tiem, kuri vēlēsies. priecājies par to visu vairāk.

Paradoksāli, bet tieÅ”i pēc Å”iem dramatiskajiem notikumiem BIRMA projekts, kuram tolaik jau bija visas tipiskam ilgtermiņa bÅ«vprojektam raksturÄ«gās iezÄ«mes, Ŕķita, ka sāka uzņemt savu ilgi gaidÄ«to jauno dzÄ«vi! Man bija vairāk brÄ«va laika tukŔām domām, es atkal sāku Ä·emmēt globālo tÄ«mekli, meklējot kaut ko lÄ«dzÄ«gu (par laimi, tagad es jau varēju uzminēt, ka to visu meklÄ“Å”u ne tikai jebkur, bet gan GitHub), un kaut kur plkst. Ŕī gada sākumā es beidzot uzgāju atbilstoÅ”u produktu no pazÄ«stamā Salesforce uzņēmuma ar nenozÄ«mÄ«gu nosaukumu Gorp. Pats par sevi tas varētu darÄ«t gandrÄ«z visu, kas man bija vajadzÄ«gs no Ŕāda parsētāja dzinēja - proti, saprātÄ«gi izolēt atseviŔķus fragmentus no patvaļīga, bet skaidri strukturēta teksta, vienlaikus nodroÅ”inot gala lietotājam diezgan lietotājam draudzÄ«gu saskarni, ieskaitot tādas saprotamas bÅ«tÄ«bas, kā paraugs, veidne un gadÄ«juma, un tajā paŔā laikā izmantojot pazÄ«stamo regulāro izteiksmju sintaksi, kas kļūst nesalÄ«dzināmi lasāmāka, pateicoties sadalÄ«Å”anai noteiktās semantiskās grupās parsÄ“Å”anai.

Vispār es nolēmu, ka Å”is ir tas Gorp (Nez, ko Å”is nosaukums nozÄ«mē? VarbÅ«t kāds "vispārÄ«gi orientēts parastais parsētājs"?) ā€“ tieÅ”i tas, ko esmu meklējis jau ilgu laiku. Tiesa, tā tÅ«lÄ«tējai ievieÅ”anai manām vajadzÄ«bām radās tāda problēma, ka Å”is dzinējs prasÄ«ja pārāk stingru avota teksta strukturālās secÄ«bas ievēroÅ”anu. Dažām atskaitēm, piemēram, žurnālfailiem (proti, izstrādātāji tos ievietoja kā skaidrus projekta izmantoÅ”anas piemērus), tas ir diezgan piemērots, taču tiem paÅ”iem skenēto satura rādÄ«tāju tekstiem tas ir maz ticams. Galu galā viena un tā pati lapa ar satura rādÄ«tāju var sākties ar vārdiem ā€œSatursā€, ā€œSatursā€ un jebkuriem citiem provizoriskiem aprakstiem, kas mums nav jāievieto paredzētās analÄ«zes rezultātos (un tos manuāli nogriežot). katra reize ir arÄ« neērta). Turklāt starp atseviŔķiem atkārtotiem elementiem, piemēram, autora vārdu, nosaukumu un lappuses numuru, lapā var bÅ«t noteikts daudzums atkritumu (piemēram, zÄ«mējumi un vienkārÅ”i nejauÅ”as rakstzÄ«mes), ko arÄ« bÅ«tu jauki nogriezt. Tomēr pēdējais aspekts vēl nebija tik nozÄ«mÄ«gs, bet pirmā dēļ esoŔā realizācija nevarēja sākt meklēt tekstā nepiecieÅ”amās struktÅ«ras no noteiktas vietas, bet tā vietā vienkārÅ”i apstrādāja to no paÅ”a sākuma, neatrada tur noteikti paraugi un... beidzu savu darbu. AcÄ«mredzot bija nepiecieÅ”ama neliela pielāgoÅ”ana, lai vismaz atstātu vietu starp atkārtotajām struktÅ«rām, un tas mani atgrieza darbā.

Vēl viena problēma bija tā, ka pats projekts tika realizēts Java valodā, un, ja es nākotnē plānoju ieviest kādu lÄ«dzekli Ŕīs tehnoloÄ£ijas saskarnei ar pazÄ«stamām lietojumprogrammām datu ievadÄ«Å”anai esoÅ”ajās datubāzēs (piemēram, Irbis ā€œCataloguerā€), tad vismaz vismaz dariet to C# un .NET. Nav jau tā, ka Java pati par sevi bÅ«tu slikta valoda ā€“ es to kādreiz pat izmantoju, lai ieviestu interesantu logu lietojumprogrammu, kas ieviesa paÅ”māju programmējama kalkulatora funkcionalitāti (kā daļa no kursa projekta). Un sintakses ziņā tas ir ļoti lÄ«dzÄ«gs tam paÅ”am C-sharp. Nu, tas ir tikai pluss: jo vieglāk man bÅ«s pabeigt esoÅ”u projektu. Tomēr es nevēlējos atkal ienirt Å”ajā diezgan neparastajā logu (vai drÄ«zāk, darbvirsmas) Java tehnoloÄ£iju pasaulē - galu galā pati valoda nebija ā€œpielāgotaā€ Ŕādai lietoÅ”anai, un es nemaz nevēlējos atkārtot iepriekŔējā pieredze. VarbÅ«t tas ir tieÅ”i tāpēc, ka C# savienojumā ar WinForms ir daudz tuvāks Delphi, ar kuru daudzi no mums savulaik sāka. Par laimi, nepiecieÅ”amais risinājums tika atrasts diezgan ātri ā€“ projekta veidā IKVM.NET, kas ļauj viegli tulkot esoŔās Java programmas pārvaldÄ«tā .NET kodā. Tiesa, paÅ”u projektu autori jau tobrÄ«d bija pametuÅ”i, taču tā jaunākā realizācija ļāva diezgan veiksmÄ«gi veikt nepiecieÅ”amās darbÄ«bas avota tekstiem Gorp.

Tāpēc es veicu visas nepiecieÅ”amās izmaiņas un saliku to visu atbilstoÅ”a tipa DLL, kuru varēja viegli ā€œpaņemtā€ jebkuros Visual Studio izveidotā .NET Framework projektos. Pa to laiku es izveidoju vēl vienu slāni, lai ērti parādÄ«tu atgrieztos rezultātus Gorp, atbilstoÅ”u datu struktÅ«ru veidā, kuras bÅ«tu ērti apstrādāt tabulas skatā (ņemot par pamatu gan rindas, gan kolonnas; gan vārdnÄ«cas atslēgas, gan ciparu indeksus). Nu, paÅ”i nepiecieÅ”amie utilÄ«ti rezultātu apstrādei un parādÄ«Å”anai tika uzrakstÄ«ti diezgan ātri.

ArÄ« veidņu pielāgoÅ”anas process jaunajam dzinējam, lai iemācÄ«tu parsēt esoÅ”os satura rādÄ«tāju skenēto tekstu paraugus, Ä«paÅ”us sarežģījumus neradÄ«ja. PatiesÄ«bā man pat nebija jāatsaucas uz savām iepriekŔējām veidnēm: es vienkārÅ”i izveidoju visas nepiecieÅ”amās veidnes no nulles. Turklāt, ja veidnes, kas paredzētas darbam ar iepriekŔējo sistēmas versiju, noteica diezgan Å”auru ietvaru tekstiem, kurus varēja pareizi parsēt ar to palÄ«dzÄ«bu, jaunais dzinējs jau ļāva izstrādāt diezgan universālas veidnes, kas piemērotas vairākiem iezÄ«mÄ“Å”anas veidiem. vienreiz. Es pat mēģināju uzrakstÄ«t kaut kādu visaptveroÅ”u veidni jebkuram patvaļīgam satura rādÄ«tāja tekstam, lai gan, protams, pat tad, kad man pavērās visas jaunās iespējas, tostarp, jo Ä«paÅ”i, ierobežotā iespēja ieviest tās paÅ”as ligzdotās atkārtotās secÄ«bas ( piemēram, vairāku autoru uzvārdi un iniciāļi pēc kārtas), tā izrādÄ«jās utopija.

Iespējams, nākotnē bÅ«s iespējams ieviest noteiktu metaveidņu koncepciju, kas varēs pārbaudÄ«t avota teksta atbilstÄ«bu vairākām pieejamajām veidnēm uzreiz un pēc tam atbilstoÅ”i iegÅ«tajiem rezultātiem atlasÄ«t vispiemērotākais, izmantojot kaut kādu viedo algoritmu. Bet tagad mani vairāk uztrauca cits jautājums. Parsētājs, piemēram Gorp, neskatoties uz visu savu daudzpusÄ«bu un manis veiktajām modifikācijām, tas joprojām pēc bÅ«tÄ«bas nespēja paveikt vienu Ŕķietami vienkārÅ”u lietu, ko mans paÅ”a rakstÄ«tais parsētājs spēja izdarÄ«t jau no pirmās versijas. Proti: viņam bija iespēja atrast un izvilkt no avota teksta visus fragmentus, kas atbilst Ä«stajā vietā izmantotajā veidnē norādÄ«tajai maskai, vienlaikus nemaz neinteresējoties par to, ko dotajā tekstā atrodas atstarpēs starp Å”iem fragmentiem. LÄ«dz Å”im esmu tikai nedaudz uzlabojis jauno dzinēju, ļaujot tam meklēt visus iespējamos jaunus Ŕādu masku noteiktas secÄ«bas atkārtojumus no paÅ”reizējās pozÄ«cijas, atstājot iespēju tekstā atrasties patvaļīgu rakstzÄ«mju kopas, kas bija pilnÄ«bā nav ņemts vērā parsÄ“Å”anā, atrodas starp atklātajām atkārtotajām struktÅ«rām. Tomēr tas neļāva iestatÄ«t nākamo masku neatkarÄ«gi no iepriekŔējā fragmenta meklÄ“Å”anas rezultātiem, izmantojot atbilstoÅ”o masku: aprakstÄ«tās teksta struktÅ«ras stingrÄ«ba joprojām neatstāja vietu patvaļīgai neregulāru rakstzÄ«mju iekļauÅ”anai.

Un, ja satura rādÄ«tāju piemēriem, ar kuriem es saskāros, Ŕī problēma vēl neŔķita tik nopietna, tad, mēģinot piemērot jaunu parsÄ“Å”anas mehānismu lÄ«dzÄ«gam tÄ«mekļa vietnes satura parsÄ“Å”anas uzdevumam (t.i., tai paÅ”ai parsÄ“Å”anai), tā ierobežojumi ir Å”eit tie parādÄ«jās ar visu savu acÄ«mredzamo. Galu galā ir diezgan vienkārÅ”i iestatÄ«t nepiecieÅ”amās maskas tÄ«mekļa iezÄ«mÄ“Å”anas fragmentiem, starp kuriem jāatrodas mÅ«su meklētajiem datiem (kas ir jāizvelk), bet kā mēs varam piespiest parsētāju nekavējoties pāriet uz nākamo lÄ«dzÄ«gs fragments, neskatoties uz visiem iespējamajiem tagiem un HTML atribÅ«tiem, ko var ievietot atstarpēs starp tām?

Nedaudz padomājot, nolēmu ieviest pāris apkalpoÅ”anas modeļus (%all_pirms) Šø (%all_after), kas kalpo acÄ«mredzamam mērÄ·im nodroÅ”ināt, ka viss, kas var bÅ«t ietverts avota tekstā, tiek izlaists pirms jebkura raksta (maskas), kas tiem seko. Turklāt, ja (%all_pirms) vienkārÅ”i ignorēja visus Å”os patvaļīgos ieslēgumus (%all_after), gluži pretēji, ļāva tos pievienot vēlamajam fragmentam pēc pārejas no iepriekŔējā fragmenta. Izklausās pavisam vienkārÅ”i, bet Ŕīs koncepcijas Ä«stenoÅ”anai nācās vēlreiz izÄ·emmēt gorp avotus, lai veiktu nepiecieÅ”amās modifikācijas, lai nesajauktu jau ieviesto loÄ£iku. Beigās mums tas izdevās (lai gan tika uzrakstÄ«ta pat pati, pati pirmā, kaut arÄ« ļoti buggy mana parsētāja realizācija, un vēl ātrāk - pāris nedēļu laikā). No Ŕī brīža sistēma ieguva patiesi universālu veidolu ā€“ ne mazāk kā 12 gadus pēc pirmajiem mēģinājumiem padarÄ«t to funkcionējoÅ”u.

Protams, ar to mÅ«su sapņi nebeidzas. Varat arÄ« pilnÄ«bā pārrakstÄ«t gorp veidņu parsētāju C#, izmantojot jebkuru no pieejamajām bibliotēkām bezmaksas gramatikas ievieÅ”anai. Es domāju, ka kods ir bÅ«tiski jāvienkārÅ”o, un tas ļaus mums atbrÄ«voties no mantojuma esoÅ”o Java avotu veidā. Bet ar esoÅ”o dzinēja tipu pilnÄ«gi iespējams paveikt arÄ« dažādas interesantas lietas, tai skaitā mēģinājums realizēt manis jau minētās metaveidnes, nemaz nerunājot par dažādu datu parsÄ“Å”anu no dažādām mājaslapām (tomēr neizslēdzu ka esoÅ”ie specializētie programmatÅ«ras rÄ«ki tam ir piemērotāki ā€“ man vienkārÅ”i vēl nav bijusi atbilstoÅ”a pieredze to lietoÅ”anā).

Starp citu, Å”ovasar es jau saņēmu uzaicinājumu uz e-pastu no uzņēmuma, kas izmanto Salesforce tehnoloÄ£ijas (oriÄ£ināla izstrādātājs Gorp), iziet interviju turpmākajam darbam RÄ«gā. Diemžēl Å”obrÄ«d es neesmu gatavs Ŕādām pārgrupÄ“Å”anām.

Ja Å”is materiāls izraisa zināmu interesi, tad otrajā daļā mēģināŔu sÄ«kāk aprakstÄ«t veidņu kompilÄ“Å”anas un pēc tam parsÄ“Å”anas tehnoloÄ£iju, izmantojot Salesforce izmantotās implementācijas piemēru. Gorp (mani papildinājumi, izņemot pāris jau aprakstÄ«tos funkciju vārdus, praktiski neveic nekādas izmaiņas paŔā veidnes sintaksē, tāpēc gandrÄ«z visa sākotnējās sistēmas dokumentācija Gorp Piemērots arÄ« manai versijai).

Avots: www.habr.com

Pievieno komentāru