Sagan af litlu verkefni sem er tólf ára langt (um BIRMA.NET í fyrsta skipti og satt að segja frá fyrstu hendi)

Fæðing þessa verkefnis má teljast lítil hugmynd sem kom til mín einhvers staðar í lok árs 2007, sem átti að finna endanlega mynd aðeins 12 árum síðar (á þessum tímapunkti - auðvitað, þó að núverandi framkvæmd skv. höfundi, er mjög fullnægjandi).

Þetta byrjaði allt þegar ég, í því ferli að sinna þáverandi opinberu skyldum mínum á bókasafninu, vakti athygli á því að ferlið við að færa inn gögn úr skönnuðum texta efnisyfirlita bóka (og tónlistar) útgáfa í núverandi gagnagrunn, greinilega er hægt að einfalda og gera sjálfvirkan verulega, með því að nýta sér eiginleika reglusemi og endurtekningarhæfni allra gagna sem þarf til inntaks, svo sem nafn höfundar greinarinnar (ef við erum að tala um safn greina), titilinn á greinina (eða undirtitillinn sem endurspeglast í efnisyfirlitinu) og blaðsíðunúmer núverandi efnisyfirlitsatriðis. Í fyrstu var ég nánast sannfærður um að auðvelt væri að finna kerfi sem hentaði til að framkvæma þetta verkefni á netinu. Þegar ég kom á óvart vegna þess að ég fann ekki slíkt verkefni ákvað ég að reyna að útfæra það á eigin spýtur.

Eftir frekar stuttan tíma byrjaði fyrsta frumgerðin að virka sem ég byrjaði strax að nota í daglegum athöfnum og kembi hana samtímis á öll dæmin sem komu upp í hendurnar á mér. Sem betur fer, á mínum venjulega vinnustað, þar sem ég var engan veginn forritari, slapp ég samt með sýnilegan „niðurtíma“ í vinnu minni, þar sem ég var ákaft að kemba hugarfóstur mitt - næstum óhugsandi hlutur í núverandi veruleika, sem gefur til kynna daglegar skýrslur um vinnu yfir daginn. Ferlið við að pússa forritið tók samtals hvorki meira né minna en um það bil ár, en jafnvel eftir það var varla hægt að kalla niðurstöðuna fullkomlega vel - það voru of mörg mismunandi hugtök sem voru ekki alveg skiljanleg fyrir útfærslu: valfrjálsir þættir sem hægt er að sleppa ; framsýn á þætti (í þeim tilgangi að skipta fyrri þáttum í leitarniðurstöður); jafnvel okkar eigin tilraun til að útfæra eitthvað eins og regluleg tjáning (sem hefur einstaka setningafræði). Ég verð að segja að áður en þetta gerðist hafði ég gefist nokkuð upp á forritun (í um það bil 8 ár, ef ekki lengur), svo nýja tækifærið til að beita kunnáttu minni í áhugavert og nauðsynlegt verkefni vakti algjörlega athygli mína. Það kemur ekki á óvart að frumkóði sem varð til - þar sem engar skýrar aðferðir við hönnun hans voru fyrir hendi af minni hálfu - varð fljótt ólýsanlegt samsafn af ólíkum hlutum í C tungumálinu með sumum þáttum C++ og þáttum sjónrænnar forritunar (upphaflega það var ákveðið að nota slíkt hönnunarkerfi eins og Borland C++ Builder - „næstum Delphi, en í C“). Hins vegar bar allt þetta á endanum ávöxt í því að gera daglega starfsemi bókasafnsins sjálfvirk.

Jafnframt ákvað ég, til öryggis, að fara á námskeið til að þjálfa faglega hugbúnaðarframleiðendur. Ég veit ekki hvort það er í rauninni hægt að læra „að vera forritari“ þar frá grunni, en að teknu tilliti til þeirrar kunnáttu sem ég hafði þegar þá tókst mér að ná tökum á tækni sem var meira viðeigandi fyrir þann tíma, t.d. sem C#, Visual Studio fyrir þróun undir .NET, auk nokkurrar tækni sem tengist Java, HTML og SQL. Öll þjálfunin tók samtals tvö ár og var upphafið að öðru verkefni mínu, sem á endanum teygði sig yfir nokkur ár - en þetta er efni fyrir sérstaka útgáfu. Hér er aðeins rétt að taka fram að ég gerði tilraun til að aðlaga þá þróun sem ég hafði þegar á lýst verkefni til að búa til fullbúið gluggaforrit í C# og WinForms sem útfærir nauðsynlega virkni og nota það sem grunn fyrir væntanlegt diplómaverkefni.
Með tímanum fór þessi hugmynd að virðast mér verðug að koma fram á slíkum árlegum ráðstefnum með þátttöku fulltrúa ýmissa bókasafna eins og „LIBKOM“ og „CRIMEA“. Hugmyndin, já, en ekki mín útfærsla á henni á þeim tíma. Svo vonaði ég líka að einhver myndi endurskrifa það með hæfari aðferðum. Með einum eða öðrum hætti ákvað ég fyrir árið 2013 að skrifa skýrslu um frumvinnu mína og senda hana til skipulagsnefndar ráðstefnunnar með umsókn um styrk til þátttöku í ráðstefnunni. Mér til nokkurrar undrunar var umsókn mín samþykkt og ég fór að gera nokkrar endurbætur á verkefninu til að undirbúa það fyrir kynningu á ráðstefnunni.

Á þeim tíma hafði verkefnið þegar fengið nýtt nafn BIRMA, öðlast ýmsa viðbótargetu (ekki svo mikið að fullu útfærð, heldur frekar gert ráð fyrir) - allar upplýsingar er að finna í skýrslunni minni.

Satt að segja var erfitt að kalla BIRMA 2013 eitthvað heill; Í hreinskilni sagt var þetta mjög hakkt handverk gert í flýti. Hvað kóða varðar, voru nánast engar sérstakar nýjungar, nema frekar hjálparlaus tilraun til að búa til einhvers konar sameinaða setningafræði fyrir þáttarann, í útliti sem minnir á IRBIS 64 sniðmálið (og reyndar líka ISIS kerfið - með svigum sem hringlaga mannvirki; hvers vegna Á þeim tíma fannst mér það líta frekar flott út). Þjálfarinn rakst vonlaust á þessa hringi sviga af viðeigandi gerð (þar sem svigar gegndu einnig öðru hlutverki, nefnilega þeir merktu valfrjálsar byggingar við þáttun sem hægt er að sleppa). Enn og aftur vísa ég öllum sem vilja kynna sér þá erfiðu, óréttmæta setningafræði BIRMA nánar til skýrslu minnar þess tíma.

Almennt séð, fyrir utan að eiga í erfiðleikum með minn eigin þáttara, hef ég ekkert meira að segja um kóðann í þessari útgáfu - nema öfug umbreytingu núverandi heimilda í C++ á meðan ég varðveiti nokkra dæmigerða eiginleika .NET kóða (til að vera heiðarlegur, það er erfitt að skilja, hvað nákvæmlega varð til þess að ég færi allt til baka - sennilega einhver heimskulegur ótta við að halda frumkóðum mínum leyndum, eins og það væri eitthvað sem jafngildir leynilegri uppskrift Coca-Cola).

Kannski er þessi heimskulega ákvörðun líka ástæðan fyrir erfiðleikunum við að para DLL-safnið sem myndast við núverandi viðmót heimagerðrar vinnustöðvar til að slá inn gögn í rafrænan vörulista (já, ég nefndi ekki aðra mikilvæga staðreynd: héðan í frá munu allir Kóðinn á BIRMA „vélinni“ var eins og búist var við, hann er aðskilinn frá viðmótshlutanum og pakkað í viðeigandi DLL). Hvers vegna það var nauðsynlegt að skrifa sérstaka vinnustöð í þessum tilgangi, sem hvort sem er, í útliti sínu og aðferð við samskipti við notandann, afritaði blygðunarlaust sömu vinnustöðina „Catalogizer“ af IRBIS 64 kerfinu - þetta er sérstök spurning. Í stuttu máli: það gaf nauðsynlega styrkleika í þá þróun mína fyrir útskriftarverkefnið mitt (annars var ómeltanlegur flokkunarvél einn og sér einhvern veginn ekki nóg). Að auki lenti ég í nokkrum erfiðleikum við að útfæra viðmót Cataloger vinnustöðvarinnar með eigin einingum, útfærðar í bæði C++ og C#, og fá beinan aðgang að vélinni minni.

Almennt, einkennilega nóg, var það þessi frekar klaufalega frumgerð framtíðar BIRMA.NET sem átti að verða „vinnuhestur“ minn næstu fjögur árin. Það er ekki hægt að segja að á þessum tíma hafi ég ekki að minnsta kosti reynt að finna leiðir fyrir nýja, fullkomnari útfærslu á langvarandi hugmynd. Meðal annarra nýjunga ættu nú þegar að hafa verið hreiðraðir hringrásir sem hefðu getað innihaldið valfrjálsa þætti - þannig ætlaði ég að koma hugmyndinni um alhliða sniðmát fyrir bókfræðilegar lýsingar á ritum og ýmislegt fleira áhugavert til framkvæmda. En í verklegum athöfnum mínum á þessum tíma var allt þetta lítið eftirsótt og sú útfærsla sem ég hafði á þeim tíma dugði alveg til að slá inn efnisyfirlit. Auk þess fór þróunarstefna bókasafns okkar að víkja meira og meira í átt að stafrænni væðingu safnskjalasafna, skýrslugerða og annarrar starfsemi sem ég hafði lítinn áhuga á, sem á endanum neyddi mig til að yfirgefa það að lokum og víkja fyrir þeim sem myndu vilja. vera ánægðari með þetta allt saman.

Það var þversagnakennt að það var eftir þessa stórkostlegu atburði sem BIRMA-verkefnið, sem þá þegar hafði öll einkenni dæmigerðs langtímaframkvæmda, virtist byrja að taka á sig langþráða nýtt líf! Ég hafði meiri frítíma fyrir aðgerðalausar hugsanir, ég byrjaði aftur að greiða veraldarvefinn í leit að einhverju svipuðu (sem betur fer gat ég nú þegar giskað á að leita að þessu öllu ekki bara hvar sem er, heldur á GitHub), og einhvers staðar í At the í byrjun þessa árs rakst ég loksins á samsvarandi vöru frá hinu þekkta Salesforce fyrirtæki undir hinu ómerkilega nafni Gorp. Í sjálfu sér gæti það gert næstum allt sem ég þurfti úr slíkri flokkunarvél - nefnilega að einangra einstök brot á skynsamlegan hátt frá handahófskenndum, en skýrt uppbyggðum texta, á sama tíma og hann hefði nokkuð notendavænt viðmót fyrir endanotandann, þar á meðal svo skiljanlegan kjarna, eins og mynstur, sniðmát og tilvik, og um leið að nota kunnuglega setningafræði reglulegra tjáninga, sem verður óviðjafnanlega læsilegri vegna skiptingar í tilgreinda merkingarhópa til þáttunar.

Almennt séð ákvað ég að þetta væri þessi Gorp (Ég velti því fyrir mér hvað þetta nafn þýðir? Kannski einhvers konar "almennt stilltur venjulegur flokkari"?) - nákvæmlega það sem ég hef verið að leita að lengi. Að vísu var tafarlaus innleiðing þess fyrir mínar þarfir í slíkum vanda að þessi vél krafðist of strangrar fylgni við skipulagsröð frumtextans. Fyrir sumar skýrslur eins og annálaskrár (þ.e. þær voru settar af hönnuði sem skýr dæmi um notkun verkefnisins) hentar þetta vel, en fyrir sömu texta skannaðar efnisyfirliti er það ólíklegt. Þegar öllu er á botninn hvolft getur sama síða með efnisyfirliti byrjað á orðunum „Efnisyfirlit“, „Efnisyfirlit“ og hvers kyns öðrum bráðabirgðalýsingum sem við þurfum ekki að setja í niðurstöður fyrirhugaðrar greiningar (og skera þær handvirkt af hvert skipti er líka óþægilegt). Þar að auki, á milli einstakra endurtekinna þátta, eins og nafns höfundar, titils og blaðsíðunúmers, getur síðan innihaldið ákveðið magn af rusli (til dæmis teikningar og bara handahófskennda stafi), sem það væri líka gaman að geta skera af. Síðasti þátturinn var þó ekki svo merkilegur enn, en vegna þess fyrsta gat núverandi útfærsla ekki farið að leita að nauðsynlegum strúktúrum í textanum frá ákveðnum stað, heldur einfaldlega unnið úr honum strax í upphafi, fann ekki tilgreind mynstur þar og... lauk starfi mínu. Augljóslega þurfti smá lagfæringar til að leyfa að minnsta kosti smá bil á milli endurtekinna mannvirkja og það kom mér aftur til starfa.

Annað vandamál var að verkefnið sjálft var útfært í Java, og ef ég ætlaði í framtíðinni að innleiða einhverja aðferð til að tengja þessa tækni við kunnugleg forrit til að slá inn gögn í núverandi gagnagrunna (eins og „Cataloguer“ frá Irbis), þá a.m.k. gerðu þetta í C# og .NET. Það er ekki það að Java sjálft sé slæmt tungumál - ég notaði það einu sinni jafnvel til að útfæra áhugavert gluggaforrit sem útfærði virkni innlendrar forritanlegrar reiknivélar (sem hluti af námskeiðsverkefni). Og hvað varðar setningafræði er það mjög svipað og sama C-sharp. Jæja, þetta er aðeins plús: því auðveldara verður fyrir mig að ganga frá núverandi verkefni. Hins vegar vildi ég ekki sökkva mér aftur inn í þennan frekar óvenjulega heim glugga (eða öllu heldur skjáborðs) Java tækni - þegar allt kemur til alls var tungumálið sjálft ekki „sniðið“ fyrir slíka notkun og ég þráði alls ekki endurtekningu á fyrri reynslu. Kannski er það einmitt vegna þess að C# í tengslum við WinForms er miklu nær Delphi, sem mörg okkar byrjuðu einu sinni með. Sem betur fer fannst nauðsynleg lausn nokkuð fljótt - í formi verkefnisins IKVM.NET, sem gerir það auðvelt að þýða núverandi Java forrit yfir í stýrðan .NET kóða. Að vísu hafði verkefnið sjálft þegar verið yfirgefið af höfundum á þeim tíma, en nýjasta útfærslan gerði mér kleift að framkvæma nauðsynlegar aðgerðir fyrir frumtextana. Gorp.

Þannig að ég gerði allar nauðsynlegar breytingar og setti þetta allt saman í DLL af viðeigandi gerð, sem auðvelt var að "tína upp" með hvaða verkefnum sem er fyrir .NET Framework sem búið var til í Visual Studio. Í millitíðinni bjó ég til annað lag fyrir þægilega kynningu á niðurstöðunum sem skilað var Gorp, í formi samsvarandi gagnauppbygginga sem væri þægilegt að vinna úr í töfluyfirliti (með grunni bæði raðir og dálka; bæði orðabókarlykla og töluskrár). Jæja, nauðsynleg tól sjálf til að vinna og birta niðurstöðurnar voru skrifaðar nokkuð fljótt.

Ferlið við að aðlaga sniðmát fyrir nýju vélina til að kenna henni að flokka núverandi sýnishorn af skönnuðum efnisyfirlitstextum olli heldur engum sérstökum flækjum. Reyndar þurfti ég ekki einu sinni að vísa til fyrri sniðmáta minna: ég bjó einfaldlega til öll nauðsynleg sniðmát frá grunni. Þar að auki, ef sniðmátin sem eru hönnuð til að vinna með fyrri útgáfu kerfisins setja frekar þröngan ramma fyrir texta sem hægt var að flokka rétt með hjálp þeirra, gerði nýja vélin það nú þegar mögulegt að þróa nokkuð alhliða sniðmát sem henta fyrir nokkrar gerðir af álagningu á einu sinni. Ég reyndi meira að segja að skrifa einhvers konar yfirgripsmikið sniðmát fyrir hvaða handahófskennda efnisyfirlitstexta sem er, þó að sjálfsögðu jafnvel með alla nýju möguleikana sem opnuðust fyrir mig, þar á meðal sérstaklega takmarkaða hæfileikann til að útfæra sömu hreiðruðu endurtekningarröðurnar ( eins og til dæmis eftirnöfn og upphafsstafir nokkrir höfundar í röð), þetta reyndist vera útópía.

Kannski verður hægt í framtíðinni að innleiða ákveðið hugtak um meta-sniðmát, sem mun geta athugað upprunatextann til að uppfylla nokkur af tiltækum sniðmátum í einu, og síðan, í samræmi við niðurstöðurnar sem fengust, velja hentugasta, með því að nota einhvers konar greindar reiknirit. En nú hafði ég meiri áhyggjur af annarri spurningu. A parser eins og Gorp, þrátt fyrir alla fjölhæfni þess og breytingarnar sem ég gerði, var það samt í eðli sínu ófært um að gera einn að því er virðist einfaldan hlut sem sjálfskrifaði þáttarinn minn var fær um að gera frá fyrstu útgáfunni. Nefnilega: hann hafði hæfileika til að finna og draga úr frumtextanum öll brot sem passa við grímuna sem tilgreind er í sniðmátinu sem notað var á réttum stað, á sama tíma og hann hafði engan áhuga á því hvað tiltekinn texti inniheldur í bilunum á milli þessara brota. Hingað til hef ég aðeins endurbætt nýju vélina, sem gerir henni kleift að leita að öllum mögulegum nýjum endurtekningum á tiltekinni röð slíkra gríma frá núverandi stöðu, sem skilur eftir möguleikann á tilvist í textanum af settum af handahófskenndum stöfum sem voru algjörlega ógreint í þáttuninni, lokað á milli endurtekinna mannvirkja sem greindust. Hins vegar gerði þetta ekki mögulegt að stilla næstu grímu óháð niðurstöðum leitarinnar að fyrra brotinu með því að nota samsvarandi grímu: strangleiki textauppbyggingarinnar sem lýst er skildi enn ekki eftir rými fyrir handahófskenndar innfellingar á óreglulegum stöfum.

Og ef fyrir dæmin um efnisyfirlit sem ég rakst á virtist þetta vandamál ekki enn svo alvarlegt, þá þegar reynt er að beita nýjum þáttunarkerfi á svipað verkefni að þátta innihald vefsíðu (þ.e. sömu þáttun), þá er það takmarkanir eru hér þær birtust með allri sinni augljósu. Þegar öllu er á botninn hvolft er frekar auðvelt að stilla nauðsynlegar grímur fyrir brot af vefmerkingum, á milli þess sem gögnin sem við erum að leita að (sem þarf að draga út) ættu að vera staðsett á milli, en hvernig getum við þvingað þáttarann ​​til að fara strax á næsta svipað brot, þrátt fyrir öll möguleg merki og HTML eiginleika sem hægt er að setja í bilin á milli þeirra?

Eftir að hafa hugsað mig aðeins um ákvað ég að kynna nokkur þjónustumynstur (%allt_áður) и (%allt_eftir), sem þjónar þeim augljósa tilgangi að tryggja að öllu sem kann að vera í frumtextanum sé sleppt á undan einhverju mynstri (grímu) sem fylgir þeim. Þar að auki, ef (%allt_áður) hunsaði þá einfaldlega allar þessar handahófskenndu innlimanir (%allt_eftir), þvert á móti, leyfði þeim að vera bætt við viðkomandi brot eftir að hafa flutt frá fyrra brotinu. Það hljómar frekar einfalt, en til að innleiða þetta hugtak þurfti ég að greiða í gegnum gorp heimildirnar aftur til að gera nauðsynlegar breytingar til að brjóta ekki þegar innleidda rökfræði. Á endanum tókst okkur að gera þetta (þótt jafnvel fyrsta, að vísu mjög gallaða útfærslan á þáttaranum mínum hafi verið skrifuð, og jafnvel hraðar - á nokkrum vikum). Héðan í frá tók kerfið á sig sannarlega alhliða mynd - ekki minna en 12 árum eftir fyrstu tilraunir til að láta það virka.

Auðvitað er þetta ekki endir drauma okkar. Þú getur líka fullkomlega endurskrifað gorp sniðmátþáttarann ​​í C#, með því að nota eitthvað af tiltækum bókasöfnum til að útfæra ókeypis málfræði. Ég held að kóðann ætti að einfalda verulega og þetta mun gera okkur kleift að losna við arfleifð í formi núverandi Java heimilda. En með núverandi gerð vélar er líka alveg hægt að gera ýmislegt áhugavert, þar á meðal tilraun til að útfæra meta-sniðmátið sem ég hef þegar nefnt, svo ekki sé minnst á að flokka ýmis gögn frá ýmsum vefsíðum (þó útiloka ég það ekki að núverandi sérhæfð hugbúnaðarverkfæri henta betur fyrir þetta - ég hef bara ekki haft viðeigandi reynslu af notkun þeirra ennþá).

Við the vegur, í sumar fékk ég þegar boð í tölvupósti frá fyrirtæki sem notar Salesforce tækni (hönnuður upprunalegu Gorp), standast viðtal fyrir síðari vinnu í Riga. Því miður, eins og er, er ég ekki tilbúinn fyrir slíkar endurskipulagningar.

Ef þetta efni vekur áhuga mun ég í seinni hlutanum reyna að lýsa nánar tækninni til að setja saman og í kjölfarið þátta sniðmát með því að nota dæmi um útfærsluna sem notuð er í Salesforce Gorp (Mínar eigin viðbætur, að undanskildum nokkrum fallorðum sem þegar hefur verið lýst, gera nánast engar breytingar á sniðmátssetningafræðinni sjálfu, svo næstum öll skjöl fyrir upprunalega kerfið Gorp Hentar líka fyrir mína útgáfu).

Heimild: www.habr.com

Bæta við athugasemd