Он екі жылға созылған бір шағын жобаның тарихы (BIRMA.NET туралы бірінші рет және шынын айтқанда)

Бұл жобаның дүниеге келуін маған 2007 жылдың аяғында келген шағын идея деп санауға болады, ол өзінің түпкілікті формасын тек 12 жылдан кейін табады (осы уақытта - әрине, қазіргі жүзеге асырылғанымен, авторға, өте қанағаттанарлық) .

Мұның бәрі кітапханадағы сол кездегі қызметтік міндеттерімді орындау барысында мен кітап (және музыкалық) басылымдар мазмұнының сканерленген мәтінінен деректерді қолда бар деректер қорына енгізу үдерісіне назар аударған кезде басталды. мақала авторының аты (егер мақалалар жинағы туралы айтатын болсақ), мақала тақырыбы сияқты енгізу үшін қажетті барлық деректердің реттілік және қайталану қасиетін пайдалана отырып, айтарлықтай жеңілдетілген және автоматтандырылған болуы мүмкін. мақала (немесе мазмұнда көрсетілген субтитр) және ағымдағы мазмұн тармағының бет нөмірі. Бастапқыда мен бұл тапсырманы орындау үшін қолайлы жүйені Интернетте оңай табуға болатынына сенімді болдым. Мұндай жобаны таба алмағандықтан біраз таң қалғанда, мен оны өз бетімше жүзеге асыруға бел будым.

Біраз уақыттан кейін бірінші прототип жұмыс істей бастады, мен оны күнделікті іс-әрекетімде бірден қолдана бастадым, бір уақытта қолыма түскен барлық мысалдарда оны түзету. Бақытымызға орай, мен бағдарламашы болмаған кәдімгі жұмыс орнымда мен әлі де жұмысымда көрінетін «тоқыраудан» құтылдым, оның барысында мен өз миымды қарқынды түрде түзетумен айналыстым - бұл қазіргі шындықта мүмкін емес дерлік нәрсе. күн ішінде атқарылған жұмыстар туралы күнделікті есеп беру. Бағдарламаны жылтырату процесі жалпы алғанда бір жылдан кем емес уақытты алды, бірақ одан кейін де нәтижені толығымен сәтті деп атауға болмайды - бастапқыда іске асыру үшін толық түсініксіз тым көп әртүрлі тұжырымдамалар жасалды: мүмкін болатын қосымша элементтер. өткізіп жіберу; элементтерді алға қарау (іздеу нәтижелеріне алдыңғы элементтерді ауыстыру мақсатында); тіпті тұрақты өрнектер (бірегей синтаксисі бар) сияқты нәрсені жүзеге асыру әрекеті. Айта кету керек, бұған дейін мен бағдарламалаудан біраз бас тарттым (шамамен 8 жыл, көп болмаса), сондықтан қызықты және қажетті тапсырмаға өз дағдыларымды қолданудың жаңа мүмкіндігі менің назарымды толығымен аударды. Алынған бастапқы код – оның дизайнына менің тарапымнан нақты тәсілдер болмаған кезде – тез арада C++ кейбір элементтерімен және визуалды бағдарламалау аспектілерімен Си тіліндегі әр түрлі бөліктердің елестету мүмкін емес үйлесіміне айналуы таңқаларлық емес (бастапқыда ол). Borland C++ Builder сияқты дизайн жүйесін пайдалану туралы шешім қабылданды - «дерлік Delphi, бірақ C тілінде»). Дегенмен, мұның бәрі, сайып келгенде, кітапханамыздың күнделікті қызметін автоматтандыруға өз жемісін берді.

Сонымен қатар, мен кәсіби бағдарламалық жасақтама әзірлеушілерін дайындау курстарынан өтуді шештім. Мен «бағдарламашы болуды» нөлден үйренуге болатынын білмеймін, бірақ сол кездегі дағдыларымды ескере отырып, мен сол кездегі өзектірек технологияларды біршама меңгере алдым. C# сияқты, .NET астында әзірлеуге арналған Visual Studio, сондай-ақ Java, HTML және SQL-ге қатысты кейбір технологиялар. Бүкіл тренинг жалпы екі жылға созылды және менің тағы бір жобамның бастапқы нүктесі болды, ол ақыр соңында бірнеше жылға созылды - бірақ бұл жеке басылымның тақырыбы. Бұл жерде мен сипатталған жобадағы әзірлемелерді қажетті функционалдылықты жүзеге асыратын C# және WinForms-те толыққанды терезе қосымшасын жасау үшін бейімдеуге әрекет жасағанымды атап өткен жөн болар еді. алдағы дипломдық жоба.
Уақыт өте келе бұл идея маған «LIBKOM» және «CRIME» сияқты әртүрлі кітапханалар өкілдерінің қатысуымен өтетін жыл сайынғы конференцияларда айтылуға лайық болып көрінді. Идея, иә, бірақ ол кезде менің жүзеге асыруым емес. Содан кейін мен біреу оны сауатты тәсілдер арқылы қайта жазады деп үміттендім. Әйтеуір, 2013 жылға қарай алдын ала жұмысым туралы баяндама жазып, конференцияға қатысуға грант алуға өтініммен Конференцияны ұйымдастыру комитетіне жіберуді ұйғардым. Біршама таң қалдырғаным, өтінішім мақұлданды, мен оны конференцияда таныстыруға дайындау үшін жобаны жақсартуға кірістім.

Осы уақытқа дейін жоба BIRMA жаңа атауын алды, әртүрлі қосымша (толық іске асырылмаған, бірақ болжанған) мүмкіндіктерге ие болды - барлық мәліметтерді менің есебімнен табуға болады.

Шынымды айтсам, BIRMA 2013-ті толық деп атау қиын болды; Ашығын айтқанда, бұл асығыс жасалған өте күрделі қолөнер болды. Код тұрғысынан, IRBIS 64 пішімдеу тілін (және шын мәнінде, сонымен қатар ISIS жүйесін) еске түсіретін талдаушы үшін біртұтас синтаксисті құрудың дәрменсіз әрекетін қоспағанда, іс жүзінде ешқандай арнайы жаңалықтар болған жоқ. циклдік құрылымдар ретінде жақшалармен; неге ол кезде мен бұл өте керемет көрінетін деп ойладым). Талдаушы тиісті түрдегі жақшалардың осы шеңберлеріне үмітсіз сүрінді (өйткені жақшалар да басқа рөл атқарды, атап айтқанда, талдау кезінде өткізіп жіберуге болатын қосымша құрылымдарды белгіледі). БИРМА-ның сол кездегі елестету қиын, негізсіз синтаксисімен толығырақ танысқысы келетіндердің барлығын сол кездегі баяндамама тағы да ұсынамын.

Жалпы, жеке талдаушымен күресуден басқа, бұл нұсқаның коды туралы менде басқа ештеңе жоқ - .NET кодының кейбір типтік мүмкіндіктерін сақтай отырып, бар көздерді C++ тіліне кері түрлендіруден басқа (шынымды айтсам, бұл Түсіну қиын, мені бәрін артқа жылжытуға не түрткі болды – кока-коланың құпия рецептімен баламалы нәрсе сияқты, бастапқы кодтарымды құпия сақтаудан қандай да бір ақымақ қорқыныш).

Мүмкін бұл ақымақ шешім, нәтижесінде алынған DLL кітапханасын электронды каталогқа деректерді енгізу үшін үйде жасалған жұмыс станциясының бар интерфейсімен жұптаудағы қиындықтардың себебі болуы мүмкін (иә, мен басқа маңызды фактіні айтқан жоқпын: бұдан былай барлық BIRMA «қозғалтқышының» коды күткендей болды, ол интерфейс бөлігінен бөлініп, сәйкес DLL-ге оралған). Неліктен осы мақсаттар үшін жеке жұмыс станциясын жазу қажет болды, ол өзінің сыртқы түрі мен қолданушымен өзара әрекеттесу әдісімен IRBIS 64 жүйесінің дәл сол «Каталогизатор» жұмыс станциясын ұятсыз көшірді - бұл бөлек мәселе. Қысқасы: бұл менің дипломдық жобам үшін сол кездегі әзірлемелеріме қажетті беріктік берді (әйтпесе, сіңбейтін талдаушы қозғалтқыштың өзі жеткіліксіз болды). Сонымен қатар, мен C++ және C# тілдерінде іске асырылған өз модульдеріммен Cataloger жұмыс станциясының интерфейсін енгізуде және менің қозғалтқышыма тікелей қол жеткізуде кейбір қиындықтарға тап болдым.

Жалпы, бір ғажабы, дәл осы болашақ BIRMA.NET прототипі келесі төрт жылда менің «жұмыс атына» айналуы керек еді. Осы уақыт ішінде мен бұрыннан келе жатқан идеяны жаңа, толық жүзеге асырудың жолдарын іздеген жоқпын деп айта алмаймын. Басқа жаңалықтардың ішінде қосымша элементтерді қамтитын кірістірілген циклдік тізбектер болуы керек еді - мен басылымдардың библиографиялық сипаттамасына арналған әмбебап шаблондар идеясын және басқа да қызықты нәрселерді осылайша жүзеге асырмақ болдым. Дегенмен, сол кездегі практикалық қызметімде мұның бәрі аз сұранысқа ие болды және сол кездегі іске асыру мазмұнды енгізу үшін жеткілікті болды. Сонымен қатар, біздің кітапхананың даму векторы мұражай мұрағатын цифрландыруға, есеп беруге және мені онша қызықтырмайтын басқа да іс-шараларға көбірек ауытқи бастады, бұл ақыры мені одан кетуге мәжбүр етті, бұл мені қалағандарға жол берді. осының бәріне риза болыңыз.

Бір ғажабы, дәл осы драмалық оқиғалардан кейін сол кездегі әдеттегі ұзақ мерзімді құрылыс жобасына тән барлық сипаттамаларға ие болған BIRMA жобасы өзінің көптен күткен жаңа өмірін ала бастағандай болды! Менің бос ойларға көбірек бос уақытым болды, мен ұқсас нәрсені іздеу үшін қайтадан World Wide Web-ті тарай бастадым (бақытымызға орай, мен мұның бәрін тек кез келген жерден емес, GitHub-тан іздеймін деп болжадым) және At the бір жерден. осы жылдың басында мен белгілі Salesforce компаниясының елеусіз атауымен сәйкес өнімін таптым. Горп. Өздігінен ол осындай талдаушы қозғалтқыштан маған қажет нәрсенің барлығын дерлік жасай алады - атап айтқанда, жеке фрагменттерді ерікті, бірақ анық құрылымдалған мәтіннен ақылды түрде оқшаулау, сонымен бірге соңғы пайдаланушы үшін өте ыңғайлы интерфейсі бар, оның ішінде түсінікті мәні бар. үлгі, шаблон және құбылыс, сонымен бірге тұрақты тіркестердің таныс синтаксисін қолдану, талдау үшін белгіленген семантикалық топтарға бөлудің арқасында салыстыруға келмейтіндей оқылады.

Жалпы, мен осылай деп шештім Горп (Маған бұл атау нені білдіреді? Мүмкін қандай да бір «жалпы бағытталған тұрақты талдаушы» шығар?) – дәл мен көптен бері іздеген нәрсе. Рас, оны менің жеке қажеттіліктерім үшін дереу жүзеге асыруда проблема туындады, бұл қозғалтқыш бастапқы мәтіннің құрылымдық реттілігін тым қатаң сақтауды талап етті. Журнал файлдары сияқты кейбір есептер үшін (атап айтқанда, оларды әзірлеушілер жобаны пайдаланудың нақты мысалдары ретінде орналастырған) бұл өте қолайлы, бірақ сканерленген мазмұн кестелерінің бірдей мәтіндері үшін бұл екіталай. Өйткені, мазмұны бар бір бет «Мазмұны», «Мазмұны» деген сөздерден және біз болжанған талдау нәтижелеріне орналастырудың қажеті жоқ (және оларды қолмен кесіп тастау) қажет емес кез келген басқа алдын ала сипаттамалардан басталуы мүмкін. әр жолы да ыңғайсыз). Сонымен қатар, автордың аты, тақырыбы және бет нөмірі сияқты жеке қайталанатын элементтердің арасында бетте белгілі бір қоқыс болуы мүмкін (мысалы, сызбалар және жай ғана кездейсоқ таңбалар), оларды орындауға мүмкіндік беру жақсы болар еді. кесіп алу. Дегенмен, соңғы аспект әлі соншалықты маңызды емес еді, бірақ біріншісіне байланысты қолданыстағы енгізу мәтіндегі қажетті құрылымдарды белгілі бір жерден іздеуді бастай алмады, оның орнына оны басынан бастап өңдеп, таба алмады. сол жерде үлгілерді көрсетті және... жұмысымды аяқтады. Әлбетте, қайталанатын құрылымдар арасында кем дегенде біраз бос орын қалдыру үшін кейбір түзетулер қажет болды және бұл мені жұмысқа қайтарды.

Тағы бір мәселе, жобаның өзі Java-да жүзеге асырылды және егер мен болашақта осы технологияны бар дерекқорларға деректерді енгізуге арналған таныс қосымшалармен (мысалы, Irbis «Каталогы») байланыстырудың кейбір құралдарын енгізуді жоспарласам, кем дегенде, кем дегенде. мұны C# және .NET тілінде орындаңыз. Java тілінің өзі нашар тіл емес – мен оны бір кездері отандық бағдарламаланатын калькулятордың (курстық жобаның бөлігі ретінде) функционалдығын жүзеге асыратын қызықты терезе қосымшасын енгізу үшін пайдаландым. Ал синтаксисі жағынан сол С-шарпқа өте ұқсас. Бұл тек плюс: бар жобаны аяқтау маған оңайырақ болады. Дегенмен, мен Java технологияларының терезе (дәлірек айтсақ, жұмыс үстелі) әлеміне қайта енгім келмеді - өйткені тілдің өзі мұндай қолдануға «бейімделмеген» және мен қайталануды мүлдем қаламадым. алдыңғы тәжірибе. Мүмкін, бұл C# тілі WinForms-пен бірге Delphi-ге әлдеқайда жақын болғандықтан, көбіміз онымен жұмыс істей бастадық. Бақытымызға орай, қажетті шешім өте тез табылды - жоба түрінде IKVM.NET, бұл бар Java бағдарламаларын басқарылатын .NET кодына аударуды жеңілдетеді. Рас, жобаның өзін сол уақытта авторлар тастап кеткен болатын, бірақ оның соңғы іске асырылуы маған бастапқы мәтіндерге қажетті әрекеттерді сәтті орындауға мүмкіндік берді. Горп.

Сондықтан мен барлық қажетті өзгерістерді енгіздім және барлығын Visual Studio бағдарламасында жасалған .NET Framework үшін кез келген жобалар оңай «алуға» болатын тиісті типтегі DLL-ге жинадым. Осы уақытта мен қайтарылған нәтижелерді ыңғайлы көрсету үшін басқа қабат жасадым Горп, кесте көрінісінде өңдеуге ыңғайлы болатын сәйкес деректер құрылымдары түрінде (негіз ретінде жолдар мен бағандар; сөздік пернелері де, сандық индекстер де алынады). Нәтижелерді өңдеу және көрсету үшін қажетті утилиталар өте тез жазылды.

Сондай-ақ, мазмұн кестелерінің сканерленген мәтіндерінің бар үлгілерін талдауға үйрету үшін жаңа қозғалтқышқа шаблондарды бейімдеу процесі ерекше қиындықтар туғызған жоқ. Шындығында, мен бұрынғы үлгілеріме мүлдем сілтеме жасаудың қажеті жоқ еді: мен барлық қажетті үлгілерді нөлден жасадым. Сонымен қатар, егер жүйенің алдыңғы нұсқасымен жұмыс істеуге арналған шаблондар олардың көмегімен дұрыс талдауға болатын мәтіндер үшін жеткілікті тар шеңберді орнатса, жаңа қозғалтқыш бірнеше белгілеу түрлеріне сәйкес келетін әмбебап үлгілерді жасауға мүмкіндік берді. бір рет. Мен тіпті мазмұнның кез келген еркін мәтіні үшін қандай да бір жан-жақты үлгі жазуға тырыстым, дегенмен, әрине, мен үшін ашылатын барлық жаңа мүмкіндіктермен, атап айтқанда, бірдей кірістірілген қайталауды жүзеге асырудың шектеулі мүмкіндігімен. тізбегі (мысалы, бірнеше авторлардың тегі мен инициалдары сияқты), бұл утопия болып шықты.

Мүмкін, болашақта мета-үлгілердің белгілі бір тұжырымдамасын жүзеге асыруға болады, ол бастапқы мәтінді бірден бірнеше қол жетімді шаблондарға сәйкестігін тексере алады, содан кейін алынған нәтижелерге сәйкес таңдаңыз. интеллектуалды алгоритмнің қандай да бір түрін қолданатын ең қолайлысы. Бірақ қазір мені басқа сұрақ көбірек мазалады. Талдаушы сияқты Горп, оның барлық әмбебаптығына және мен жасаған модификацияларға қарамастан, ол әлі де бірінші нұсқадан-ақ менің өздігінен жазған талдаушы жасай алатын қарапайым болып көрінетін нәрсені жасай алмады. Атап айтқанда: ол бастапқы мәтіннен қажетті жерде қолданылған үлгіде көрсетілген маскаға сәйкес келетін барлық фрагменттерді тауып, шығарып алу мүмкіндігіне ие болды, бірақ бұл фрагменттердің арасындағы бос орындарда берілген мәтінде не бар екенін мүлдем қызықтырмайды. Осы уақытқа дейін мен жаңа қозғалтқышты сәл ғана жетілдірдім, бұл оған қазіргі позициядан осындай маскалардың берілген тізбегінің барлық ықтимал жаңа қайталануларын іздеуге мүмкіндік берді, бұл мәтінде толығымен болатын ерікті таңбалар жиынының болуы мүмкіндігін қалдырды. талдауда есепке алынбаған, анықталған қайталанатын құрылымдар арасында қоршалған. Дегенмен, бұл сәйкес масканы пайдаланып алдыңғы фрагментті іздеу нәтижелеріне қарамастан келесі масканы орнатуға мүмкіндік бермеді: сипатталған мәтін құрылымының қатаңдығы әлі де ретсіз таңбаларды еркін енгізуге орын қалдырмады.

Мазмұндар кестелерінің мысалдары үшін бұл мәселе әлі де маңызды болып көрінбесе, веб-сайт мазмұнын талдаудың ұқсас тапсырмасына (яғни сол талдау) жаңа талдау механизмін қолдануға тырысқанда, оның шектеулер осында олар өзінің барлық айқындығымен пайда болды. Ақыр соңында, веб-белгілеу фрагменттері үшін қажетті маскаларды орнату өте оңай, олардың арасында біз іздейтін деректер (оны алу керек) орналасуы керек, бірақ талдаушыны бірден келесіге өтуге қалай мәжбүрлей аламыз. барлық ықтимал тегтерге және олардың арасындағы бос орындарға орналастыруға болатын HTML атрибуттарына қарамастан ұқсас фрагмент?

Біраз ойланып, мен бірнеше қызмет көрсету үлгісін енгізуді шештім (%барлығы_бұрын) и (%all_after), бастапқы мәтінде болуы мүмкін барлық нәрсе олардан кейінгі кез келген үлгінің (маска) алдында өткізіп жіберуін қамтамасыз етудің айқын мақсатына қызмет етеді. Оның үстіне, егер (%барлығы_бұрын) содан кейін барлық осы ерікті қосуларды елемеді (%all_after), керісінше, алдыңғы фрагменттен жылжытқаннан кейін оларды қажетті фрагментке қосуға мүмкіндік берді. Бұл өте қарапайым болып көрінеді, бірақ бұл тұжырымдаманы жүзеге асыру үшін мен қазірдің өзінде енгізілген логиканы бұзбау үшін қажетті өзгерістерді енгізу үшін горп көздерін қайтадан тарауға тура келді. Ақырында, біз мұны істей алдық (бірақ, ең бірінші, өте қате болса да, менің талдаушымды енгізу жазылды, тіпті тезірек - бірнеше аптада). Осы уақыттан бастап жүйе шын мәнінде әмбебап пішінге ие болды - оның жұмыс істеуіне алғашқы әрекеттерден кейін кемінде 12 жыл өткен соң.

Әрине, бұл біздің армандарымыздың соңы емес. Сондай-ақ тегін грамматиканы енгізу үшін қолжетімді кітапханалардың кез келгенін пайдаланып, gorp үлгісі талдаушысын C# тілінде толығымен қайта жазуға болады. Менің ойымша, кодты айтарлықтай жеңілдету керек және бұл бізге бар Java көздері түріндегі мұрадан құтылуға мүмкіндік береді. Бірақ қозғалтқыштың қолданыстағы түрімен әртүрлі қызықты нәрселерді жасауға болады, соның ішінде мен айтқан мета-үлгілерді енгізу әрекеті, әртүрлі веб-сайттардағы әртүрлі деректерді талдауды айтпағанда (бірақ мен жоққа шығармаймын) Қолданыстағы мамандандырылған бағдарламалық құралдар бұл үшін қолайлырақ - менде оларды пайдаланудың тиісті тәжірибесі болған жоқ).

Айтпақшы, осы жазда мен Salesforce технологияларын қолданатын компаниядан (түпнұсқаны жасаушы) электрондық пошта арқылы шақыру алдым. Горп), Ригадағы келесі жұмыс үшін сұхбаттан өту. Өкінішке орай, қазіргі уақытта мен мұндай қайта орналастыруға дайын емеспін.

Егер бұл материал қызығушылық тудырса, онда екінші бөлімде мен Salesforce жүйесінде қолданылатын іске асыру мысалында шаблондарды құрастыру және кейіннен талдау технологиясын толығырақ сипаттауға тырысамын. Горп (менің жеке толықтыруларым, бұрын сипатталған бірнеше функционалды сөздерді қоспағанда, шаблон синтаксисінің өзіне іс жүзінде ешқандай өзгерістер енгізбейді, сондықтан түпнұсқа жүйеге арналған барлық дерлік құжаттама Горп Менің нұсқама да сәйкес келеді).

Ақпарат көзі: www.habr.com

пікір қалдыру