Hamabi urteko proiektu txiki baten istorioa (BIRMA.NET-i buruz lehen aldiz eta, egia esan, zuzenean)

Proiektu honen sorrera 2007. urtearen amaieran nonbait etorri zitzaidan ideia txikitzat har daiteke, 12 urte beranduago bere azken forma aurkitzera zuzendua zegoena (garai honetan, noski, nahiz eta egungo ezarpena, egileari, oso pozgarria da) .

Liburutegian orduko nire betebehar ofizialak betetzeko prozesuan, liburu (eta musika) argitalpenen aurkibideen testu eskaneatuetatik datuak lehendik zegoen datu-basean sartzeko prozesuan, arreta jarri nionean hasi zen dena. itxuraz, nabarmen sinplifikatu eta automatizatu daiteke, idazteko beharrezkoak diren datu guztien ordenaren eta errepikakortasunaren propietatea aprobetxatuz, hala nola, artikuluaren egilearen izena (artikulu bilduma bati buruz ari bagara), izenburua. artikulua (edo aurkibidean islatzen den azpititulua) eta uneko aurkibidearen orri-zenbakia. Hasieran, ia sinetsita nengoen Interneten erraz aurki zitekeela zeregin hori burutzeko sistema egokia. Halako proiekturik aurkitu ezin izanak harriduraren bat eragin zuenean, nire kabuz ezartzen saiatzea erabaki nuen.

Denbora gutxiren buruan, lehenengo prototipoa lanean hasi zen, eta berehala hasi nintzen nire eguneroko jardueretan erabiltzen, aldi berean, eskuetara etortzen zitzaizkidan adibide guztietan depuratuz. Zorionez, nire ohiko lantokian, inola ere programatzaile bat ez nintzenean, orduan oraindik ere urrundu nintzen nire lanean ikusten den "etenaldi-denbora" batekin, eta horretan intentsiboki arazketan ari nintzen nire ideiak - egungo errealitatean ia pentsaezina den gauza bat, eta horrek esan nahi du. egunean zehar egindako lanari buruzko eguneroko txostenak. Programa leuntzeko prozesuak, guztira, urtebete inguru behar izan zuen, baina horren ondoren emaitza nekez esan zitekeen guztiz arrakastatsua - hasieran ezartzeko guztiz argi ez zeuden kontzeptu ezberdin gehiegi ezarri ziren: aukerako elementuak. saltatu izan; elementuen aurrera begiratzea (aurreko elementuak bilaketa-emaitzetan ordezkatzeko helburuarekin); nahiz eta gure saiakerak adierazpen erregularrak bezalako zerbait ezartzeko (sintaxi bakarra duena). Esan behar dut hau baino lehen programazioari zertxobait utzi nuela (8 bat urtez, gehiago ez bada), nire gaitasunak zeregin interesgarri eta beharrezko batean aplikatzeko aukera berriak erabat bereganatu zuen nire arreta. Ez da harritzekoa ondoriozko iturburu-kodea -nire aldetik bere diseinurako planteamendu argirik egon ezean- oso azkar C lengoaian pieza ezberdinen nahasketa imajinaezina bihurtu izana C++-ko elementu batzuekin eta programazio bisualaren alderdi batzuekin (hasieran Borland C++ Builder bezalako diseinu sistema bat erabiltzea erabaki zen - "ia Delphi, baina C-n"). Hala ere, horrek guztiak azken finean fruituak eman zituen gure liburutegiaren eguneroko jarduera automatizatzean.

Aldi berean, erabaki nuen, badaezpada, software garatzaile profesionalak prestatzeko ikastaroak egitea. Ez dakit benetan posible den hor hutsetik “programatzaile izaten” ikastea, baina ordurako nituen trebetasunak kontuan hartuta, garai hartan garrantzitsuagoak ziren teknologiak zertxobait menperatu ahal izan nituen, hala nola. C# gisa, Visual Studio .NET azpian garatzeko, baita Java, HTML eta SQLrekin lotutako teknologia batzuk ere. Prestakuntza osoak bi urteko iraupena izan zuen guztira, eta nire beste proiektu baterako abiapuntu izan zen, azken finean, hainbat urtetan luzatu zena, baina hau aparteko argitalpen baterako gaia da. Hemen komenigarria litzateke soilik deskribatutako proiektuan lehendik nituen garapenak egokitzeko ahalegina egin nuela C# eta WinForms-en leiho-aplikazio oso bat sortzeko, beharrezko funtzionaltasuna inplementatzen duena, eta oinarri gisa erabiltzeko. hurrengo diploma proiektua.
Denborarekin, ideia hau “LIBKOM” eta “CRIMEA” bezalako hainbat liburutegitako ordezkarien parte-hartzearekin urteroko biltzarretan esateko merezi zuela iruditzen zitzaidan. Ideia, bai, baina ez nire inplementazioa garai hartan. Orduan ere espero nuen norbaitek berridatziko zuela ikuspegi konpetenteagoak erabiliz. Era batera edo bestera, 2013rako erabaki nuen nire aurretiazko lanari buruzko txosten bat idaztea eta Jardunaldien Antolakuntza Batzordera bidaltzea jardunaldietan parte hartzeko diru-laguntza eskaerarekin. Nire harridurarako, nire eskaera onartu zen, eta proiektuan hobekuntza batzuk egiten hasi nintzen kongresuan aurkezteko prestatzeko.

Ordurako, proiektuak jadanik BIRMA izen berria jaso zuen, hainbat gaitasun gehigarri eskuratu zituen (ez hainbeste erabat inplementatu, baizik eta bere gain hartuz) - xehetasun guztiak nire txostenean aurki daitezke.

Egia esateko, zaila izan zen BIRMA 2013ri zerbait osoa deitzea; Egia esanda, oso ziztu bizian egindako artisautza izan zen. Kodeari dagokionez, ia ez zen inolako berrikuntza berezirik izan, analizatzailerako sintaxi bateratu moduko bat sortzeko saiakera bat izan ezik, itxuraz IRBIS 64 formatu-lengoaia (eta, hain zuzen ere, ISIS sistema ere) gogorarazten duena. parentesiekin egitura zikliko gisa; zergatik Garai hartan nahiko polita iruditu zitzaidan). Analizatzaileak itxaropenik gabe estropezu egin zuen dagokion motako parentesi zirkulu horiek (parentesiek beste eginkizun bat ere betetzen baitzuten, hots, hautazko egiturak markatzen baitzituzten analizatzean, salta daitezkeenak). Berriro ere, orduan imajinatzen zaila den, justifikatu gabeko BIRMAren sintaxia zehatzago ezagutu nahi duten guztiak, garai hartako nire txostenera bideratzen ditut.

Orokorrean, nire analizatzailearekin borrokatzeaz gain, ez dut ezer gehiago esateko bertsio honen kodeari buruz - lehendik dauden iturriak C++-ra alderantzizko bihurtzea izan ezik, .NET kodearen ezaugarri tipiko batzuk gordez (zintzoa izateko, hau da. zaila da ulertzea, zerk bultzatu ninduen dena atzera egitera - ziurrenik nire iturburu-kodeak isilpean gordetzeko beldur ergel bat, Coca-Colaren errezeta sekretuaren pareko zerbait balitz bezala).

Beharbada, erabaki ergel hau da ondoriozko DLL liburutegia katalogo elektroniko batean datuak sartzeko etxeko lan-estazio baten interfazearekin parekatzeko zailtasunen arrazoia ere (bai, ez nuen beste datu garrantzitsu bat aipatu: hemendik aurrera, guztiak BIRMA "motorra"ren kodea espero zena zen, interfazearen zatitik bereizita dago eta dagokion DLLan paketatuta dago). Zergatik beharrezkoa zen helburu horietarako lan-estazio bereizia idaztea, eta, hala ere, erabiltzailearen itxuran eta elkarrekintza-metodoan, IRBIS 64 sistemako lan-estazio bera "Katalogizatzailea" lotsagabe kopiatu zuen - hau aparteko galdera da. Laburbilduz: graduazio-proiekturako nire garaiko garapenei beharrezko sendotasuna eman zien (bestela analizatze-motorra digerigaitza bakarrik ez zen nolabait nahikoa). Horrez gain, orduan zailtasun batzuk aurkitu nituen Cataloger lan-estazioko interfazea neure moduluekin ezartzeko, bai C++ eta C#-n inplementatuta, eta zuzenean nire motorra sartzeko.

Orokorrean, bitxia bada ere, etorkizuneko BIRMA.NET-en prototipo trakets samarra izan zen hurrengo lau urteetan nire “lan-zaldi” izatera zuzendua zegoena. Ezin da esan denbora horretan ez naizenik behintzat saiatu aspaldiko ideia baten ezarpen berri eta osatuago baterako bideak bilatzen. Beste berrikuntza batzuen artean, aukerako elementuak barne izan zitezkeen sekuentzia zikliko habiaratuak egon beharko lirateke; horrela, argitalpenen deskribapen bibliografikoetarako eta beste hainbat gauza interesgarrientzako txantiloi unibertsalen ideia piztuko nuen. Dena den, garai hartako jarduera praktikoetan, hori guztia eskakizun gutxikoa zen, eta garai hartan neukan ezarpena nahikoa zen aurkibideak sartzeko. Horrez gain, gure liburutegiaren garapen-bektorea gero eta gehiago desbideratzen hasi zen museoko artxiboen digitalizazioaren, erreportajearen eta niretzat interes gutxiko beste jardueren alde, eta horrek azkenean hura uztera behartu ninduen, lekua utziz. poztuago egon guzti honekin.

Paradoxikoki, gertaera dramatiko horien ostean, garai hartan jadanik epe luzeko eraikuntza-proiektu tipiko baten ezaugarri guztiak zituen BIRMA proiektuari hasiera eman ziola aspaldi itxaroten zen bizitza berria! Denbora libre gehiago izan nuen pentsamendu alferrik egiteko, berriro ere World Wide Web orrazten hasi nintzen antzeko zerbaiten bila (zorionez, orain jada asmatzen nuen hori guztia ez edozein lekutan, GitHub-en baizik), eta nonbait. urte honen hasieran, azkenean, Salesforce konpainia ezagunaren dagokion produktu bat topatu nuen izen hutsalarekin. Gorp. Berez, analizatzaile-motor batetik behar nuen ia guztia egin zezakeen, hots, zati banako testu arbitrarioetatik argi egituratuetatik modu adimentsuan isolatzea, azken erabiltzailearentzako interfaze nahiko erabilerraza izan arren, esentzia ulergarriak barne, esaterako. eredua, txantiloia eta agerraldia, eta, aldi berean, esamolde erregularren sintaxi ezaguna erabiliz, analisirako talde semantiko izendatuetan zatitzearen ondorioz ezin irakurgarriagoa bihurtzen dena.

Oro har, hauxe dela erabaki nuen Gorp (Izen honek zer esan nahi duen galdetzen diot? Agian "orientazio orokorreko analizatzaile erregular" moduko bat?) - Aspalditik bilatzen ari naizena zehazki. Egia da, nire beharretarako berehalako ezartzeak halako arazoa zuela non motor honek iturburu-testuaren egitura-sekuentziari zorrotzegia errespetatzea eskatzen zuen. Txosten batzuetarako, esate baterako, erregistro-fitxategietarako (hau da, garatzaileek proiektua erabiltzeko adibide argi gisa jarri zituzten), hau nahiko egokia da, baina eskaneatutako edukien testu berdinetarako, nekez. Azken finean, edukien taula duen orri bera "Aurkibidea", "Edukiak" hitzekin eta nahi den analisiaren emaitzetan jarri behar ez dugun beste edozein aurretiazko deskribapenekin has daiteke (eta eskuz moztuz). aldi bakoitzean ere deserosoa da). Horrez gain, errepikatzen diren elementu indibidualen artean, hala nola egilearen izena, izenburua eta orri-zenbakia, orrialdeak zabor kopuru jakin bat eduki dezake (adibidez, marrazkiak eta ausazko karaktere besterik ez), eta hori ere atsegina izango litzateke. moztu. Hala ere, azken alderdia ez zen oraindik hain esanguratsua, baina lehena dela eta, zegoen inplementazioa ezin zen leku jakin batetik testuan beharrezko egiturak bilatzen hasi, baizik eta hasiera-hasieratik prozesatu, ez zuen aurkitu. han ereduak zehaztu eta... nire lana amaitu. Jakina, doikuntza batzuk behar zirela errepikatzen diren egituren artean gutxienez tarte bat uzteko, eta horrek lanera itzuli ninduen.

Beste arazo bat izan zen proiektua bera Javan inplementatu zela, eta etorkizunean aurreikusten banuen teknologia hau lehendik zeuden datu baseetan datuak sartzeko aplikazio ezagunekin konektatzeko baliabide batzuk ezartzea (esaterako, Irbis-en “Katalogoa”), orduan gutxienez. egin hau C# eta .NET-en. Ez da Java bera hizkuntza txarra denik; behin ere erabili nuen leiho-aplikazio interesgarri bat ezartzeko, etxeko kalkulagailu programagarri baten funtzionalitateak inplementatzen zituena (ikastaro proiektu baten barruan). Eta sintaxiari dagokionez, C-sharp beraren oso antzekoa da. Tira, hau abantaila bat baino ez da: orduan eta errazagoa izango zait lehendik dagoen proiektu bat amaitzea. Hala ere, ez nuen berriro murgildu nahi leihoen (edo, hobeto esanda, mahaigaineko) Java teknologien mundu nahiko ezohiko honetan; azken finean, hizkuntza bera ez zegoen erabilera horretarako "egokituta", eta ez nuen batere gogorik errepikatzea. aurreko esperientzia. Beharbada, hain zuzen ere, C# WinForms-ekin batera Delphi-tik askoz hurbilago dagoelako, gutako askok behin hasi ginen. Zorionez, beharrezko irtenbidea nahiko azkar aurkitu zen - proiektuaren forman IKVM.NET, eta horrek lehendik dauden Java programak .NET kode kudeatutako itzultzea errazten du. Egia da, proiektua bera ordurako egileek bertan behera utzi zuten, baina bere azken inplementazioa ahalbidetu zidan iturburu-testuetarako beharrezkoak diren ekintzak nahiko arrakastatsu burutzea. Gorp.

Beraz, beharrezko aldaketa guztiak egin nituen eta dena muntatu nuen mota egokiko DLL batean, Visual Studio-n sortutako .NET Framework-erako edozein proiektuk erraz "jaso" zezakeena. Bitartean, beste geruza bat sortu nuen itzulitako emaitzak eroso aurkezteko Gorp, taula-ikuspegian prozesatzeko komenigarria izango litzatekeen dagozkien datu-egituren moduan (oinarri gisa errenkadak zein zutabeak hartuz; bai hiztegi-gakoak bai zenbakizko indizeak). Bada, emaitzak prozesatzeko eta bistaratzeko beharrezko utilitateak nahiko azkar idatzi ziren.

Era berean, motor berrirako txantiloiak egokitzeko prozesuak edukien taularen eskaneatutako testuen laginak analizatzen irakasteko ez zuen konplikazio berezirik eragin. Izan ere, ez nituen nire aurreko txantiloiak aipatu beharrik ere egin behar: hutsetik sortu ditut beharrezko txantiloi guztiak. Gainera, sistemaren aurreko bertsioarekin lan egiteko diseinatutako txantiloiek beren laguntzarekin behar bezala analizatu daitezkeen testuetarako marko nahiko estua ezartzen badute, motor berriak dagoeneko posible egin zuen hainbat marka motatarako egokiak diren txantiloi unibertsalak garatzea. behin. Nahiz eta edozein eduki-taularen testu arbitrariorako txantiloi integral bat idazten saiatu nintzen, nahiz eta, noski, aukera berri guztiak ireki zitzaizkidan arren, bereziki, habiaraturiko errepikapen-sekuentzia berdinak ezartzeko gaitasun mugatua ( hala nola, abizenak eta inizialak hainbat autore jarraian), utopia izan zen hori.

Beharbada etorkizunean posible izango da meta-txantiloien kontzeptu jakin bat ezartzea, zeinak iturburu-testua eskuragarri dauden hainbat txantiloi aldi berean betetzen duen egiaztatu ahal izango baitu, eta, ondoren, lortutako emaitzen arabera, hautatu egokiena, nolabaiteko algoritmo adimentsua erabiliz. Baina orain beste galdera batek gehiago kezkatzen ninduen. Antzeko analizatzailea Gorp, bere aldakortasun guztia eta egin nituen aldaketak gorabehera, berez ezin izan zuen oraindik nire burua idatzitako analizatzaileak lehen bertsiotik egin ahal izan zuen gauza itxuraz sinple bat egiteko. Alegia: erabilitako txantiloiaren barruan zehaztutako maskararekin bat datozen zati guztiak aurkitu eta ateratzeko gaitasuna zuen leku egokian sorburu-testutik ateratzeko, zati horien arteko tarteetan emandako testuak jasotzen duenaz batere interesatzen ez zitzaion bitartean. Orain arte, motor berria apur bat hobetu dut, maskararen sekuentzia jakin baten errepikapen berri guztiak bilatzeko aukera emanez uneko posiziotik, testuan erabat zeuden karaktere arbitrarioen multzoak agertzeko aukera utziz. analisian konturatu gabe, detektaturiko egitura errepikakorren artean itxita. Hala ere, horrek ez zuen posible egin hurrengo maskara ezartzea aurreko zatia dagokion maskara erabiliz egindako bilaketaren emaitzak kontuan hartu gabe: deskribatutako testu-egituraren zorroztasunak oraindik ez zuen lekurik utzi karaktere irregularrak sartzeari.

Eta topatu ditudan edukien adibideetarako arazo honek oraindik ez badu hain larria iruditu, orduan analisi-mekanismo berri bat aplikatzen saiatzen naizenean webgune bateko edukiak analizatzeko (hau da, analisi bera), mugak hemen agertzen ziren beren agerikotasun guztiarekin. Azken finean, nahiko erraza da web-markaren zatietarako beharrezko maskarak ezartzea, horien artean bilatzen ari garen datuak (erauzi behar direnak) kokatu behar dira, baina nola behartu analizatzailea berehala hurrengora pasatzera. antzeko zatia, haien arteko espazioetan jar daitezkeen etiketa eta HTML atributu posible guztiak gorabehera?

Pixka bat pentsatu ondoren, zerbitzu eredu pare bat sartzea erabaki nuen (%all_before) и (%all_after), iturburu-testuan egon daitekeen guztia saltatzen dela ziurtatzeko helburu bistakoa da, jarraitzen duen edozein eredu (maskara) aurretik. Gainera, bada (%all_before) besterik gabe, inklusio arbitrario horiek guztiak baztertu, orduan (%all_after), aitzitik, aurreko zatitik mugitu ondoren nahi den zatiari gehitzeko aukera ematen zuen. Nahiko sinplea dirudi, baina kontzeptu hau ezartzeko gorp iturriak berriro orraztu behar izan ditut beharrezko aldaketak egiteko, jada inplementatutako logika ez apurtzeko. Azkenean, hau egitea lortu dugu (nahiz eta nire analizatzailearen inplementazioa lehenik, oso akatsa izan arren, idatzi zen, eta are azkarrago - pare bat astetan). Hemendik aurrera, sistemak forma benetan unibertsala hartu zuen - funtzionatzeko lehen saiakeretatik 12 urte baino gutxiagora.

Jakina, hau ez da gure ametsen amaiera. Gorp txantiloiaren analizatzailea C#-n ere guztiz berridatzi dezakezu, eskuragarri dauden liburutegietako edozein erabiliz doako gramatika bat ezartzeko. Kodea nabarmen sinplifikatu beharko litzatekeela uste dut, eta honek ondarea kentzeko aukera emango digu lehendik dauden Java iturrien moduan. Baina lehendik dagoen motor motarekin, hainbat gauza interesgarri egitea ere posible da, besteak beste, lehen aipatu ditudan meta-txantiloiak ezartzeko saiakera bat, hainbat webgunetako hainbat datu analizatzea ahaztu gabe (hala ere, ez dut baztertzen lehendik dauden software-tresna espezializatuak egokiagoak direla horretarako - oraindik ez dut haiek erabiltzeko esperientzia egokia izan).

Bide batez, uda honetan dagoeneko jaso dut email bidez Salesforce teknologiak erabiltzen dituen enpresa baten gonbidapena (jatorrizkoaren garatzailea Gorp), elkarrizketa bat gainditu Rigan hurrengo lanerako. Zoritxarrez, momentuz ez nago prest halako birmoldaketetarako.

Material honek nolabaiteko interesa pizten badu, bigarren zatian, Salesforcen erabilitako inplementazioaren adibidea erabiliz txantiloiak biltzeko eta gero analizatzeko teknologia zehatzago deskribatzen saiatuko naiz. Gorp (Nire gehigarriek, dagoeneko deskribatutako funtzio-hitz pare bat izan ezik, ez dute ia aldaketarik egiten txantiloiaren sintaxian, beraz, jatorrizko sistemarako dokumentazio ia guztiak Gorp Nire bertsiorako ere egokia).

Iturria: www.habr.com

Gehitu iruzkin berria