Çîroka projeyek piçûk diwanzdeh salan dirêj e (li ser BIRMA.NET-ê ji bo yekem car û bi eşkereyî ji destê pêşîn)

Jidayikbûna vê projeyê dikare wekî ramanek piçûk were hesibandin ku di dawiya sala 2007-an de ji min re hat, ku qeder bû ku tenê 12 sal şûnda forma xwe ya dawî bibîne (di vê demê de - bê guman, her çend pêkanîna heyî, li gorî ji nivîskar re, pir têrker e).

Hemî gava dest pê kir, di pêvajoya pêkanîna erkên xwe yên wê demê yên fermî yên li pirtûkxaneyê de, min bal kişand ser vê yekê ku pêvajoya ketina daneyan ji metna skankirî ya tabloyên naveroka weşanên pirtûkê (û muzîkê) di databasa heyî de, xuya ye, dikare bi girîngî were hêsankirin û otomatîk, sûdwergirtina ji taybetmendiya rêkûpêk û dubarebûna hemî daneyên ku ji bo têketinê hewce ne, wek navê nivîskarê gotarê (eger em qala berhevokek gotaran dikin), sernavê gotar (an jêrnivîsa ku di tabloya naverokê de tê xuyang kirin) û jimareya rûpelê ya tabloya naverokê ya heyî. Di destpêkê de, ez bi pratîkî piştrast bûm ku pergalek ku ji bo pêkanîna vî karî bi hêsanî dikare li ser Înternetê were dîtin. Gava ku hin sosret ji ber vê yekê ku min nikarîbû projeyek wusa bibînim, min biryar da ku hewl bidim ku wê bi tena serê xwe bicîh bikim.

Piştî demek pir kin, prototîpa yekem dest bi xebatê kir, ku min tavilê dest bi karanîna wê di çalakiyên xwe yên rojane de kir, di heman demê de ew li ser hemî mînakên ku ketin destê min de xelet kirin. Xweşbextane, li cîhê karê xwe yê adetî, ku ez bi tu awayî bernamenûs nebûm, wê hingê min dîsa jî di xebata xwe de ji "bêhnvedana" ya xuyayî dûr ketim, di dema ku min bi giranî mêjiyê xwe debug dikir - di rastiyên heyî de tiştek hema hema nepêkan e, ku tê vê wateyê. raporên rojane yên li ser xebatên ku di nava rojê de hatine kirin. Pêvajoya paqijkirina bernameyê bi tevahî ne kêmî salek dirêj kir, lê tewra piştî wê jî nekare encam bi tevahî serfiraz were binav kirin - di destpêkê de gelek têgehên cihêreng hatin danîn ku ji bo bicîhkirinê bi tevahî ne diyar bûn: hêmanên vebijarkî yên ku dikarin be bazdan; dîtina pêşde ya hêmanan (ji bo veguheztina hêmanên berê di encamên lêgerînê de); tewra hewildana me ya ji bo bicihanîna tiştek mîna bêjeyên birêkûpêk (ya ku hevoksaziyek bêhempa heye). Divê ez bibêjim ku berî vê yekê min hinekî dev ji bernamekirinê berda (bi qasî 8 salan, heke ne bêtir), ji ber vê yekê fersenda nû ku ez jêhatîbûna xwe li karekî balkêş û hewce bikim bi tevahî bala min kişand. Ne ecêb e ku koda çavkaniyê ya encam - di nebûna nêzîkatiyên zelal ên sêwirana wê de ji aliyê min ve - bi lez û bez di zimanê C de bi hin hêmanên C++ û aliyên bernamesaziya dîtbarî (di destpêkê de ew bû tevliheviyek bêhempa ya perçeyên cihêreng biryar hate girtin ku pergala sêwiranê wekî Borland C++ Builder - "hema hema Delphi, lê di C" de bikar bîne). Lêbelê, van hemî di dawiyê de fêkî di otomatîkkirina çalakiyên rojane yên pirtûkxaneya me de da.

Di heman demê de, min biryar da, tenê di rewşê de, ez qursan bikim da ku pêşdebirên nermalava profesyonel perwerde bikim. Ez nizanim gelo bi rastî mimkun e ku meriv li wir ji sifrê fêrî "bûyîna bernamenûs" bibe, lê bi hesibandina jêhatîyên ku min di wê demê de berê hebûn, min karî hindek teknolojiyên ku di wê demê de têkildartir bûn master bikim, mîna wekî C#, Visual Studio ji bo pêşkeftina di bin NET de, û her weha hin teknolojiyên bi Java, HTML û SQL ve girêdayî ne. Tevahiya perwerdeyê bi tevahî du sal girt, û wekî xala destpêkek ji bo projeyek min a din, ya ku di dawiyê de çend salan dirêj kir - xizmet kir - lê ev mijarek ji bo weşanek cihê ye. Li vir tenê minasib e ku ez bibînim ku min hewil da ku pêşkeftinên ku min berê li ser projeya diyarkirî hebûn biguhezînim da ku di C# û WinForms de serîlêdanek paceya bêkêmasî biafirînim ku fonksiyona pêwîst bicîh tîne, û wê wekî bingehek ji bo projeya dîplomaya pêşerojê.
Bi demê re, ev raman ji min re hêja xuya bû ku di konferansên salane yên weha de bi beşdariya nûnerên pirtûkxaneyên cihêreng ên wekî "LIBKOM" û "CRIMEA" were gotin. Fikir, erê, lê ne pêkanîna min a wê demê. Dûv re min jî hêvî kir ku kesek wê bi karanîna nêzîkatiyên jêhatîtir ji nû ve binivîsîne. Bi vî awayî, heta sala 2013-an min biryar da ku ez raporekê li ser xebata xwe ya pêşîn binivîsim û bi serîlêdana ji bo alîkariyê ji bo beşdarbûna konferansê ji Komîteya Amadekar a Konferansê re bişînim. Ji bo min hinekî sosret, serlêdana min hat pejirandin, û min dest bi çêkirina hin çêtirkirinan di projeyê de kir ku ji bo pêşkêşkirina konferansê amade bikim.

Wê demê, proje jixwe navek nû BIRMA wergirtibû, kapasîteyên cûrbecûr (ne ewqas bi tevahî hatine bicîh kirin, lê berevajî tê texmîn kirin) bi dest xistibû - hemî hûrgulî di rapora min de têne dîtin.

Bi rastî, zehmet bû ku meriv ji BIRMA 2013-an re tiştek temam bibêje; Bi eşkereyî bipeyivin, ew keştiyek pir xapînok bû ku bi lez û bez hatî çêkirin. Di warê kodê de, di pratîkê de tu nûbûnek taybetî tune bû, ji bilî hewildanek bêçare ji bo afirandina cûreyek hevoksaziyek yekgirtî ji bo parserê, di xuyangê de ku zimanê formatkirina IRBIS 64 tîne bîra xwe (û bi rastî, pergala DAIŞ jî - bi parantezê wekî strukturên dorhêl; çima Wê demê min digot qey ew pir xweş xuya dike). Parsker bi bêhêvî li van dorhêlên parantezê yên celebê guncan terpilîn (ji ber ku parantez di heman demê de rolek din jî lîstin, ango, wan di dema parskirinê de strukturên vebijarkî yên ku dikarin werin avêtin nîşan kirin). Ez dîsan her kesê ku dixwaze bi hevoksaziya wê demê ya dijwar a xeyalkirin, nerastkirî ya BIRMA-yê re bi hûrgilî nas bike, radigihînim rapora xwe ya wê demê.

Bi gelemperî, ji xeynî ku ez bi parsera xwe re têkoşîn dikim, di derbarê koda vê guhertoyê de tiştek din tune ku ez bibêjim - ji xeynî veguheztina berevajî ya çavkaniyên heyî li C++ dema ku hin taybetmendiyên tîpîk ên koda .NET-ê diparêzin (bi rastî, ew e zehmet e ku meriv fêm bike, tiştê ku bi rastî min teşwîq kir ku ez her tiştî paşde vegerînim - belkî tirsek ehmeq ji bo veşartina kodên çavkaniyê min, mîna ku ew tiştek wekhev be ji reçeteya veşartî ya Coca-Cola re).

Dibe ku ev biryara ehmeqî jî sedema zehmetiyên di berhevkirina pirtûkxaneya DLL ya encam de bi navgîniya heyî ya stasyonek xebatê ya malê-çêkirî re ji bo têketina daneyan di katalogek elektronîkî de (erê, min behsa rastiyek din a girîng nekir: ji niha û pê ve, hemî koda "motora" ya BIRMA wekî ku tê hêvî kirin bû, ew ji beşa navbeynê veqetandî ye û di DLL-ya guncan de hatî paket kirin). Çima hewce bû ku ji bo van mebestan qereqolek cihêreng were nivîsandin, ku her weha, di xuyang û awayê danûstendina xwe de bi bikarhêner re, heman stasyona xebatê "Katalogizer" ya pergala IRBIS 64 bi bêşerm kopî kir - ev pirsek cûda ye. Bi kurtasî: ji bo projeya mezûnbûnê ya min zexmiya pêwîst da pêşkeftinên min ên wê demê (wekî din motora parsera nehesab tenê bi rengekî ne bes bû). Wekî din, min dûv re di cîbicîkirina navgîniya qereqola xebatê ya Cataloger-ê de bi modulên xwe re, ku hem di C++ û hem jî C# de hatine bicîh kirin, û rasterast gihîştina motora xwe de rastî hin dijwariyan hat.

Bi gelemperî, pir ecêb e, ev prototîpa bêkêmasî ya BIRMA.NET-a pêşerojê bû ku çar salên pêş me bibe "hespê kar" min. Nabe ku were gotin ku di vê demê de min bi kêmanî hewl neda ku rêyên ji bo pêkanîna nû, temamtir a ramanek kevnar bibînim. Di nav nûvekirinên din de, diviyabû jixwe rêzikên çerxa hêlîn ên ku dikaribû hêmanên vebijarkî tê de hebin - bi vî rengî min ê ramana şablonên gerdûnî ji bo ravekirinên bîbliyografîk ên weşanan û tiştên cihêreng ên din ên balkêş zindî bikira. Lêbelê, di çalakiyên min ên pratîkî yên wê demê de, ev hemî daxwazek hindik bû, û pêkanîna min di wê demê de ji bo têketina tabloyên naverokê têr bû. Wekî din, vektora pêşkeftina pirtûkxaneya me dest pê kir her ku diçe bêtir ber bi dîjîtalkirina arşîvên muzeyê, ragihandin û çalakiyên din ên ku ji min re hindik eleqedar dibin, ku di dawiyê de min neçar kir ku di dawiyê de dev jê berdim, rê li ber kesên ku dê ji van hemûyan bêtir kêfxweş bibin.

Bi paradoksî, piştî van bûyerên dramatîk bû ku projeya BIRMA, ku di wê demê de jixwe xwediyê hemî taybetmendiyên projeyek avahiyek demdirêj a tîpîk bû, xuya bû ku dest bi jiyana xwe ya nû ya çaverêkirî kir! Ji bo ramanên betal zêdetir wextê min hebû, min dîsa dest pê kir ku tevna gerdûnî ya Cîhanê di lêgerîna tiştek mîna hev de bişewitîne (bi dilşadî, naha ez jixwe dikarim texmîn bikim ku li van hemîyan ne tenê li her deverê, lê li GitHub-ê bigerim), û li cîhek li destpêka vê salê, ez di dawiyê de rastî hilberek têkildar ji pargîdaniya navdar Salesforce di bin navê ne girîng de hatim. Gorp. Bi serê xwe, ew dikaribû hema hema her tiştê ku ji min re lazim bû ji motorek wusa parser bike - ango, bi aqilane perçeyên takekesî ji nivîsa kêfî, lê bi zelalî vesazkirî veqetîne, di heman demê de ku ji bo bikarhênerê dawîn xwedan navgînek bi rengek bikarhêner-heval e, di nav de nebatên weha yên têgihîştî, wek şêweyek, şablon û rûdanek, û di heman demê de bi karanîna hevoksaziya naskirî ya bêjeyên birêkûpêk, ku ji ber dabeşbûna nav komên semantîkî yên diyarkirî yên ji bo parskirinê, bê hempa xwendîtir dibe.

Bi gelemperî, min biryar da ku ev yek e Gorp (Ez meraq dikim ku wateya vê navî çi ye? Dibe ku hin celebek "parsera birêkûpêk a orîjînal"?) - bi rastî ya ku ez demek dirêj lê digerim. Rast e, pêkanîna wê ya tavilê ji bo hewcedariyên min pirsgirêkek wusa hebû ku vê motorê hewcedariyek pir hişk a rêzika strukturî ya nivîsa çavkanî hewce dike. Ji bo hin raporên wekî pelên têketinê (ango, ew ji hêla pêşdebiran ve wekî nimûneyên zelal ên karanîna projeyê hatine danîn), ev pir maqûl e, lê ji bo heman metnên naverokê yên skandîkirî, ne mimkûn e. Beriya her tiştî, heman rûpelê bi tabloyek naverokê dikare bi peyvên "Tabloya naverokê", "Naveroka" û her ravekirinên pêşîn ên din ên ku ne hewce ne ku em di encamên analîza mebest de cîh bikin dest pê bike (û wan bi destan qut bikin. her car jî nerehet e). Wekî din, di navbera hêmanên ferdî yên dûbarekirî de, wek navê nivîskar, sernav û hejmara rûpelê, dibe ku rûpel hindek zibil hebe (mînak, xêzkirin, û tenê karakterên rasthatî), ku ew jî baş e ku meriv bikaribe birrîn. Lêbelê, aliyê paşîn hîn ne ew qas girîng bû, lê ji ber ya yekem, pêkanîna heyî nikarîbû ji deverek diyar de dest bi lêgerîna strukturên pêwîst di metnê de bike, lê di şûna wê de ew ji destpêkê ve bi hêsanî pêvajo kir, nedît. li wir qalibên diyar kirin û... karê min bi dawî kir. Eşkere ye, hin guheztin hewce bû ku bi kêmî ve hin cîh di navbera strukturên dubare de bihêle, û vê yekê ez vegerim ser kar.

Pirsgirêkek din jî ev bû ku proje bixwe li Java-yê hate bicîh kirin, û heke min plan kir ku di pêşerojê de hin rêgezên pêwendiya vê teknolojiyê bi serîlêdanên nas re ji bo ketina daneyan di databasên heyî de bicîh bikim (wek "Kataloger"ê Irbis), wê hingê bi kêmanî vê yekê di C# û .NET de bikin. Ne ew e ku Java bi xwe zimanek xirab e - min carek jî ew bikar anî da ku serîlêdanek pencereyek balkêş bicîh bîne ku fonksiyona hesabkerek bernamekirî ya navxweyî (wek beşek projeyek qursê) bicîh tîne. Û di warê hevoksaziyê de ew pir dişibihe heman C-sharp. Welê, ev tenê plusek e: ew ê ji min re hêsantir be ku ez projeyek heyî bi dawî bikim. Lêbelê, min nexwest ez careke din têkevim nav vê cîhana bêhempa ya teknolojiyên Java-yê yên pencereyê (an jî sermaseyê) - her tiştî, ziman bi xwe ji bo karanîna wusa ne "amadekirî" bû, û min qet nedixwest dubarekirina ezmûna berê. Dibe ku ew bi rastî ji ber ku C# bi WinForms re pir nêziktir e ji Delphi, ya ku gelek ji me carekê dest pê kir. Xweşbextane, çareseriya pêwîst pir zû hate dîtin - di forma projeyê de IKVM.NET, ku wergerandina bernameyên Java yên heyî di koda .NET ya birêvebir de hêsan dike. Rast e, proje bixwe wê demê ji hêla nivîskaran ve hatibû terikandin, lê pêkanîna wê ya herî paşîn hişt ku ez bi rengek serketî kiryarên pêwîst ji bo nivîsarên çavkaniyê pêk bînim. Gorp.

Ji ber vê yekê min hemî guheztinên pêwîst kirin û min ew hemî di DLL-ya celebek guncan de kom kir, ku bi hêsanî dikare ji hêla her projeyên çarçoveyek .NET ve hatî çêkirin di Visual Studio de were "hilgirtin". Di vê navberê de, min ji bo pêşkêşkirina hêsan a encamên vegeriyayî qatek din afirand Gorp, di forma strukturên daneyê yên têkildar de ku dê hêsan be ku meriv di dîmenek tabloyê de pêvajoy bike (hem rêz û stûn wekî bingeh digirin; hem bişkokên ferhengê û hem jî nîşaneyên hejmarî). Welê, karûbarên pêwîst bixwe ji bo pêvajoyê û nîşankirina encaman zû zû hatine nivîsandin.

Di heman demê de, pêvajoya guheztina şablonan ji bo motora nû ji bo ku wê fêr bike ku nimûneyên heyî yên nivîsarên skankirî yên tabloyên naverokê parsek bike, nebû sedema tevliheviyên taybetî. Di rastiyê de, min ne hewce bû ku ez guh bidim şablonên xwe yên berê: Min bi tenê hemî şablonên pêwîst ji sifirê afirandin. Wekî din, heke şablonên ku ji bo xebitandina guhertoya berê ya pergalê hatine çêkirin çarçoveyek pir teng ji bo nivîsarên ku dikarin bi alîkariya wan rast werin pars kirin saz bikin, motora nû jixwe ev gengaz kir ku şablonên bi tevahî gerdûnî yên ku ji bo çend cûreyên nîşankirinê têne pêşve xistin. carek. Tewra min hewl da ku ji bo her nivîsek tabloya naverokê ya kêfî celebek şablonek berfireh binivîsim, her çend, bê guman, tevî hemî îmkanên nû yên ku ji min re vedibin, di nav de, bi taybetî, şiyana tixûbdar a pêkanîna heman rêzikên dubarekirî ( wek mînak paşnav û paşnavên çend nivîskaran li pey hev), ev derket holê ku utopyayek e.

Dibe ku di pêşerojê de gengaz be ku meriv têgehek meta-şablon were bicîh kirin, ku dê bikaribe nivîsa çavkaniyê ji bo pêbaweriya çend şablonên berdest bi carekê ve kontrol bike, û dûv re, li gorî encamên ku hatine bidestxistin, hilbijêrin. ya herî maqûl, bi karanîna cûreyek algorîtmayek jîr. Lê niha ez bêtir li ser pirsek din xemgîn bûm. Parsekek mîna Gorp, tevî hemî pirrengiya wê û guheztinên ku min çêkiribûn, ew dîsa jî bi xwezayê nekaribû ku tiştek wusa hêsan bike ku parsereya min a xwe-nivîskî ji guhertoya yekem ve karîbû bike. Ango: wî jêhatî bû ku hemî perçeyên ku bi maskeya ku di nav şablona ku li cîhê rast hatî bikar anîn de hatî destnîşan kirin peyda bike û ji jêderê derxîne, di heman demê de ku qet eleqedar nebû ka nivîsa hatî dayîn di nav deverên di navbera van perçeyan de çi heye. Heya nuha, min tenê piçek motora nû çêtir kiriye, hişt ku ew li hemî dubarekirinên nû yên gengaz ên rêzek diyarî ya maskeyên weha ji pozîsyona heyî bigere, îhtîmala hebûna di metnê de komek karakterên kêfî yên ku bi tevahî bûn hişt. di parskirinê de nehesibandin, di navbera strukturên dubarekirî yên hatine tespît kirin de têne girtin. Lêbelê, vê yekê nehişt ku bêyî encamên lêgerîna li perçeya berê bi karanîna maskeya têkildar were danîn maskeya din: hişkiya strûktûra nivîsê ya diyarkirî hîn jî cîh ji tevlêbûna keyfî ya karakterên nerêkûpêk re nehiştiye.

Û heke ji bo nimûneyên tabloyên naverokê yên ku ez pê re rû bi rû bûm, hîna ev pirsgirêk ew qas cidî xuya nebû, wê hingê gava ku hewl didin ku mekanîzmayek parskirinê ya nû li karekî mîna parskirina naveroka malperek (ango heman parskirinê) bicîh bikin, wê sînorkirinên li vir hene ew bi hemû eşkerebûna xwe xuya bûn. Beriya her tiştî, danîna maskên pêwîst ji bo perçeyên nîşankirina malperê pir hêsan e, ku di navbera wan de daneyên ku em lê digerin (ya ku pêdivî ye ku were derxistin) werin cîh, lê çawa em dikarin parserê neçar bikin ku tavilê biçe ser ya din Parçeyek wusa, tevî hemî etîketên gengaz û taybetmendiyên HTML-ê yên ku dikarin di nav deverên di navbera wan de werin danîn?

Piştî ku piçek fikirîm, min biryar da ku ez çend şêwazên karûbarê destnîşan bikim (%all_before) и (%all_after), xizmeta armanca eşkere dike ku piştrast bike ku her tiştê ku dibe ku di nivîsa çavkaniyê de hebe berî her şêwazek (maske) ku li dû wan tê paşguh kirin. Wekî din, heke (%all_before) bi hêsanî van tevlêbûnên keyfî paşguh kir, paşê (%all_after), berevajî, destûr da ku ew piştî ku ji perçeya berê ve diçin, li perçeya xwestinê zêde bikin. Ew pir hêsan xuya dike, lê ji bo pêkanîna vê konseptê min neçar ma ku ji nû ve çavkaniyên gorp bişopînim da ku guheztinên pêwîst bikim da ku mentiqê ku jixwe hatî pêkanîn neşikînim. Di dawiyê de, me karî wiya bike (tevî ku pir, pir yekem, her çend pir xelet be jî, pêkanîna parsera min hate nivîsandin, û hêj zûtir - di nav du hefteyan de). Ji niha û pê ve, pergalê bi rastî rengek gerdûnî girt - ne kêmtirî 12 sal piştî hewildanên yekem ên ji bo pêkanîna wê.

Helbet ev ne dawiya xeyalên me ye. Her weha hûn dikarin parsera şablonê gorp di C# de bi tevahî ji nû ve binivîsin, ji bo pêkanîna rêzimanek belaş yek ji pirtûkxaneyên berdest bikar bînin. Ez difikirim ku kod divê bi girîngî were hêsan kirin, û ev ê bihêle ku em di forma çavkaniyên Java yên heyî de ji mîrateyê xilas bibin. Lê digel celebê motora heyî, di heman demê de pir mimkun e ku meriv tiştên cihêreng ên balkêş jî bike, di nav de hewildanek ji bo bicihanîna meta-şablonên ku min berê behs kiriye, nexasim parkirina daneyên cûrbecûr ji malperên cihêreng (lêbelê, ez ji holê ranakim ku amûrên nermalava pispor ên heyî ji bo vê yekê maqûltir in - min hîna ezmûna guncan a karanîna wan nedîtiye).

Bi awayê, vê havînê min berê vexwendnameyek bi e-nameyê ji pargîdaniyek ku teknolojiyên Salesforce bikar tîne (pêşdebirê orjînal Gorp), ji bo xebata paşîn li Riga hevpeyvînek derbas bikin. Mixabin, niha ez ne amade me ji nûvekirinên weha re.

Ger ev materyal hin eleqeyekê çêdike, wê hingê di beşa duyemîn de ez ê hewl bidim ku teknolojiya berhevkirin û dûv re parskirina şablonan bi karanîna mînaka pêkanîna ku di Salesforce de hatî bikar anîn de bi hûrgulî vebêjim. Gorp (Zêdekirinên min, ji bilî çend peyvên fonksiyonê yên ku berê hatine diyar kirin, hema bêje ti guhartinan di hevoksaziya şablonê de bi xwe re nakin, ji ber vê yekê hema hema hemî belgeyên ji bo pergala orîjînal Gorp Ji bo guhertoya min jî maqûl e).

Source: www.habr.com

Add a comment