O'n ikki yil davom etgan bitta kichik loyihaning hikoyasi (birinchi marta BIRMA.NET haqida va ochiqchasiga birinchi qo'l)

Ushbu loyihaning tug'ilishini 2007 yil oxirida qaerdadir paydo bo'lgan kichik bir g'oya deb hisoblash mumkin, u faqat 12 yil o'tgach o'zining yakuniy shaklini topishga mo'ljallangan edi (bu vaqtda - albatta, hozirgi amalga oshirilayotgan bo'lsa-da, muallifga, juda qoniqarli).

Hammasi kutubxonadagi o'sha paytdagi rasmiy vazifamni bajarish jarayonida kitob (va musiqa) nashrlari tarkibining skanerlangan matnidan ma'lumotlarni mavjud ma'lumotlar bazasiga kiritish jarayoniga e'tibor qaratganimdan boshlandi. Ko'rinishidan, maqola muallifining ismi (agar biz maqolalar to'plami haqida gapiradigan bo'lsak), maqola sarlavhasi kabi kiritish uchun zarur bo'lgan barcha ma'lumotlarning tartibliligi va takrorlanishi xususiyatidan foydalangan holda sezilarli darajada soddalashtirilgan va avtomatlashtirilgan bo'lishi mumkin. maqola (yoki mundarijada aks ettirilgan subtitr) va joriy mundarija elementining sahifa raqami. Avvaliga men ushbu vazifani bajarish uchun mos bo'lgan tizimni Internetda osongina topish mumkinligiga deyarli amin bo'ldim. Bunday loyihani topa olmaganim hayratga tushganida, men uni o'zim amalga oshirishga harakat qilishga qaror qildim.

Qisqa vaqtdan so'ng, birinchi prototip ishlay boshladi, men uni darhol kundalik faoliyatimda ishlata boshladim va bir vaqtning o'zida qo'limga kelgan barcha misollarda disk raskadrovka qildim. Yaxshiyamki, men dasturchi bo'lmagan odatdagi ish joyimda, men o'z ishimda ko'rinadigan "ish vaqtlari" dan xalos bo'ldim, bu vaqt davomida men o'z aqlimni jadal ravishda tuzatish bilan shug'ullanardim - bu hozirgi voqelikda deyarli tasavvur qilib bo'lmaydigan narsadir. kun davomida bajarilgan ishlar to'g'risida kundalik hisobotlar. Dasturni sayqallash jarayoni kamida bir yil davom etdi, ammo shundan keyin ham natijani to'liq muvaffaqiyatli deb atash qiyin edi - amalga oshirish uchun tushunarsiz bo'lgan juda ko'p turli xil tushunchalar mavjud edi: o'tkazib yuborilishi mumkin bo'lgan ixtiyoriy elementlar. ; elementlarni oldinga qarab ko'rish (qidiruv natijalariga oldingi elementlarni almashtirish maqsadida); hatto oddiy iboralar kabi narsalarni amalga oshirishga o'z urinishlarimiz (uning noyob sintaksisi mavjud). Aytishim kerakki, bundan oldin men dasturlashdan biroz voz kechgan edim (taxminan 8 yil, agar ko'p bo'lmasa), shuning uchun o'z mahoratimni qiziqarli va zarur vazifaga qo'llashning yangi imkoniyati e'tiborimni butunlay tortdi. Buning ajablanarli joyi yo'q, chunki uning dizayniga hech qanday aniq yondashuvlar bo'lmaganda, natijada paydo bo'lgan manba kodi tezda C++ ning ba'zi elementlari va vizual dasturlash aspektlari bilan C tilidagi turli xil qismlarning tasavvur qilib bo'lmaydigan chalkashligiga aylandi (dastlab bu Borland C++ Builder kabi dizayn tizimidan foydalanishga qaror qilindi - "deyarli Delphi, lekin Cda"). Biroq, bularning barchasi oxir-oqibat kutubxonamizning kundalik faoliyatini avtomatlashtirishda o'z samarasini berdi.

Shu bilan birga, har ehtimolga qarshi, professional dasturiy ta'minot ishlab chiquvchilarni tayyorlash kurslarini o'tashga qaror qildim. "Dasturchi bo'lishni" u erda noldan o'rganish mumkinmi yoki yo'qmi, bilmayman, lekin o'sha paytda ega bo'lgan ko'nikmalarimni inobatga olgan holda, men o'sha paytga qadar dolzarbroq bo'lgan texnologiyalarni biroz o'zlashtira oldim. C# kabi, .NET ostida ishlab chiqish uchun Visual Studio, shuningdek Java, HTML va SQL bilan bog'liq ba'zi texnologiyalar. Butun trening jami ikki yil davom etdi va mening boshqa loyiham uchun boshlang'ich nuqta bo'lib xizmat qildi, u oxir-oqibat bir necha yilga cho'zildi - ammo bu alohida nashr uchun mavzu. Bu erda shuni ta'kidlash joizki, men tasvirlangan loyihada mavjud bo'lgan ishlanmalarni C# va WinForms-da kerakli funksionallikni amalga oshiradigan to'liq huquqli oyna ilovasini yaratish va undan foydalanish uchun asos sifatida ishlatish uchun moslashtirishga harakat qildim. yaqinlashib kelayotgan diplom loyihasi.
Vaqt o'tishi bilan bu g'oya menga "LIBKOM" va "CRIMEA" kabi turli kutubxonalar vakillari ishtirokidagi yillik konferentsiyalarda aytilishga loyiq bo'lib tuyuldi. G'oya, ha, lekin o'sha paytda mening amalga oshirishim emas. Keyin men ham kimdir uni yanada malakali yondashuvlardan foydalangan holda qayta yozishiga umid qildim. Qanday bo'lmasin, 2013 yilga kelib, men o'zimning dastlabki ishim haqida hisobot yozishga va uni konferentsiyada ishtirok etish uchun grant olish uchun ariza bilan Konferentsiya tashkiliy qo'mitasiga yuborishga qaror qildim. Meni biroz hayratda qoldirgan bo‘lsam, arizam ma’qullandi va men uni konferensiyada taqdimotga tayyorlash uchun loyihani biroz yaxshilashni boshladim.

O'sha vaqtga kelib, loyiha allaqachon BIRMA yangi nomini oldi, turli xil qo'shimcha (to'liq amalga oshirilmagan, balki taxmin qilingan) imkoniyatlarga ega bo'ldi - barcha tafsilotlarni mening hisobotimda topish mumkin.

Rostini aytsam, BIRMA 2013ni to'liq bir narsa deb atash qiyin edi; Ochig'ini aytganda, bu shoshqaloqlik bilan qilingan juda xakerlik edi. Kod nuqtai nazaridan, IRBIS 64 formatlash tilini (va aslida ISIS tizimini ham) eslatuvchi tahlilchi uchun qandaydir birlashgan sintaksisni yaratishga bo'lgan nochor urinishdan tashqari, deyarli hech qanday maxsus yangiliklar yo'q edi. tsiklik tuzilmalar sifatida qavslar bilan; nega o'sha paytda men juda zo'r ko'rinardi deb o'yladim). Tahlilchi umidsiz ravishda tegishli turdagi qavslarning ushbu doiralariga qoqildi (chunki qavslar boshqa rolni ham bajargan, ya'ni tahlil qilish paytida ular o'tkazib yuborilishi mumkin bo'lgan ixtiyoriy tuzilmalarni belgilagan). BIRMA ning o'sha paytdagi tasavvur qilish qiyin, asossiz sintaksisi bilan batafsilroq tanishishni istagan har bir kishini o'sha davrdagi hisobotimga yana havola qilaman.

Umuman olganda, o'z tahlilchim bilan kurashishdan tashqari, ushbu versiyaning kodi haqida boshqa hech narsa aytolmayman - mavjud manbalarni .NET kodining ba'zi tipik xususiyatlarini saqlab qolgan holda C++ ga teskari aylantirishdan tashqari (to'g'risini aytsam, bu Tushunish qiyin , meni hamma narsani orqaga qaytarishga aynan nima undadi - ehtimol bu mening manba kodlarimni sir saqlashdan qandaydir ahmoqona qo'rquvdir, go'yo bu Coca-Cola maxfiy retseptiga teng keladigan narsadir).

Ehtimol, bu ahmoqona qaror, shuningdek, DLL kutubxonasini elektron katalogga ma'lumotlarni kiritish uchun uyda ishlab chiqarilgan ish stantsiyasining mavjud interfeysi bilan bog'lashda qiyinchiliklarning sababidir (ha, men boshqa muhim faktni eslatmadim: bundan buyon barcha BIRMA "dvigatel" kodi kutilganidek edi, u interfeys qismidan ajratilgan va tegishli DLL-ga o'ralgan). Nima uchun bu maqsadlar uchun alohida ish stantsiyasini yozish kerak edi, u baribir o'zining tashqi ko'rinishi va foydalanuvchi bilan o'zaro aloqasi usulida IRBIS 64 tizimining xuddi shu "Katalogizator" ish stantsiyasidan uyalmasdan nusxa ko'chirgan - bu alohida savol. Muxtasar qilib aytganda, bu mening bitiruv loyiham uchun o'sha paytdagi ishlanmalarimga kerakli mustahkamlikni berdi (aks holda, hazm bo'lmaydigan tahlil mexanizmining o'zi qandaydir darajada etarli emas edi). Bundan tashqari, men C++ va C# da amalga oshirilgan o'z modullarim bilan Cataloger ish stantsiyasining interfeysini amalga oshirishda va to'g'ridan-to'g'ri dvigatelimga kirishda ba'zi qiyinchiliklarga duch keldim.

Umuman olganda, g'alati tomoni shundaki, kelajakdagi BIRMA.NET ning mana shu juda noqulay prototipi keyingi to'rt yil davomida mening "ishchi ot"imga aylanishi kerak edi. Bu vaqt ichida men hech bo'lmaganda uzoq vaqtdan beri mavjud bo'lgan g'oyani yangi, to'liqroq amalga oshirish yo'llarini topishga harakat qilmaganman deb ayta olmayman. Boshqa yangiliklar qatorida, ixtiyoriy elementlarni o'z ichiga olishi mumkin bo'lgan tsiklik ketma-ketliklar allaqachon mavjud bo'lishi kerak edi - men nashrlarning bibliografik tavsiflari va boshqa qiziqarli narsalar uchun universal shablonlar g'oyasini shu tarzda amalga oshirmoqchi edim. Biroq, o'sha paytdagi amaliy faoliyatimda bularning barchasi juda kam talabga ega edi va men o'sha paytdagi amaliyot mundarijaga kirish uchun etarli edi. Bundan tashqari, kutubxonamizning rivojlanish vektori muzey arxivlarini raqamlashtirish, hisobot berish va men uchun unchalik qiziq bo'lmagan boshqa tadbirlarga tobora ko'proq og'a boshladi, bu esa oxir-oqibat meni uni tark etishga majbur qildi va buni istaganlarga yo'l qo'ydi. bularning barchasidan mamnun bo'ling.

Ajablanarlisi shundaki, o'sha paytdagi odatiy uzoq muddatli qurilish loyihasining barcha o'ziga xos xususiyatlariga ega bo'lgan BIRMA loyihasi ushbu dramatik voqealardan keyin uzoq kutilgan yangi hayotini boshlagandek tuyuldi! Menda behuda o'ylar uchun ko'proq bo'sh vaqtim bor edi, men yana shunga o'xshash narsani qidirish uchun World Wide Web-ni tarashni boshladim (xayriyatki, endi men bularning barchasini nafaqat istalgan joyda, balki GitHub-da) va At the-ning biron bir joyida qidirishni taxmin qila oldim. shu yilning boshida men nihoyat taniqli Salesforce kompaniyasining ahamiyatsiz nom ostida tegishli mahsulotiga duch keldim. Gorp. O'z-o'zidan u bunday tahliliy dvigateldan menga kerak bo'lgan deyarli hamma narsani qila olardi - ya'ni o'zboshimchalik bilan, ammo aniq tuzilgan matndan individual qismlarni oqilona ajratib, oxirgi foydalanuvchi uchun juda qulay interfeysga ega, shu jumladan tushunarli mohiyatlar kabi. naqsh, shablon va hodisa va shu bilan birga muntazam iboralarning tanish sintaksisidan foydalanish, bu tahlil qilish uchun belgilangan semantik guruhlarga bo'linishi tufayli beqiyos o'qilishi mumkin bo'ladi.

Umuman olganda, men bu shunday deb qaror qildim Gorp (Qiziq, bu nom nimani anglatadi? Balki qandaydir "umumiy yo'naltirilgan muntazam tahlilchi"?) - aynan men uzoq vaqtdan beri qidirayotgan narsam. To'g'ri, uni o'z ehtiyojlarim uchun zudlik bilan amalga oshirishda shunday muammo yuzaga keldiki, bu dvigatel manba matnning tizimli ketma-ketligiga juda qattiq rioya qilishni talab qildi. Jurnal fayllari kabi ba'zi hisobotlar uchun (ya'ni, ular ishlab chiquvchilar tomonidan loyihadan foydalanishning aniq misollari sifatida joylashtirilgan) bu juda mos keladi, ammo skanerlangan tarkibning bir xil matnlari uchun bu dargumon. Oxir oqibat, mundarijaga ega o'sha sahifa "Mundarija", "Mundarija" so'zlari va biz mo'ljallangan tahlil natijalariga joylashtirishimiz shart bo'lmagan boshqa dastlabki tavsiflar bilan boshlanishi mumkin (va ularni qo'lda kesib tashlash) har safar ham noqulay). Bundan tashqari, muallifning ismi, sarlavhasi va sahifa raqami kabi individual takrorlanuvchi elementlar o'rtasida sahifada ma'lum miqdordagi axlat (masalan, chizmalar va shunchaki tasodifiy belgilar) bo'lishi mumkin, bu ham yaxshi bo'lar edi. qirqib tashlash. Biroq, oxirgi jihat hali unchalik ahamiyatli emas edi, lekin birinchisi tufayli, mavjud amalga oshirish matndagi kerakli tuzilmalarni ma'lum bir joydan qidirishni boshlay olmadi, aksincha uni boshidanoq qayta ishladi, topa olmadi. u erda naqshlarni ko'rsatdi va ... ishimni tugatdi. Shubhasiz, takrorlanadigan tuzilmalar o'rtasida hech bo'lmaganda biroz bo'sh joy qoldirish uchun biroz sozlash kerak edi va bu meni ishlashga qaytardi.

Yana bir muammo shundaki, loyihaning o'zi Java-da amalga oshirilgan va agar men kelajakda ushbu texnologiyani mavjud ma'lumotlar bazalariga (masalan, Irbis-ning "Katalogchisi") ma'lumotlarni kiritish uchun tanish ilovalar bilan bog'lashning ba'zi vositalarini amalga oshirishni rejalashtirgan bo'lsam, hech bo'lmaganda. buni C# va .NET da bajaring. Bu Java tilining o'zi yomon til emas - men uni hatto mahalliy dasturlashtiriladigan kalkulyatorning (kurs loyihasining bir qismi sifatida) funksiyasini amalga oshiradigan qiziqarli oyna dasturini amalga oshirish uchun ishlatganman. Va sintaksis nuqtai nazaridan u bir xil C-sharpga juda o'xshaydi. Xo'sh, bu faqat ortiqcha: mavjud loyihani yakunlash men uchun osonroq bo'ladi. Biroq, men Java texnologiyalarining bu juda g'ayrioddiy dunyosiga (aniqrog'i, ish stoli) yana sho'ng'ishni xohlamadim - axir, tilning o'zi bunday foydalanish uchun "moslashtirilmagan" va men buni takrorlashni xohlamadim. oldingi tajriba. Ehtimol, aynan C# ning WinForms bilan birgalikda ko'pchiligimiz boshlagan Delphi ga ancha yaqin bo'lgani uchundir. Yaxshiyamki, kerakli yechim juda tez topildi - loyiha shaklida IKVM.NET, bu mavjud Java dasturlarini boshqariladigan .NET kodiga tarjima qilishni osonlashtiradi. To'g'ri, loyihaning o'zi o'sha paytda mualliflar tomonidan allaqachon tark etilgan edi, ammo uning so'nggi amalga oshirilishi menga manba matnlari uchun kerakli harakatlarni muvaffaqiyatli bajarishga imkon berdi. Gorp.

Shunday qilib, men barcha kerakli o'zgarishlarni amalga oshirdim va barchasini tegishli turdagi DLL-ga yig'dim, uni Visual Studio'da yaratilgan .NET Framework uchun har qanday loyihalar osongina "olish" mumkin. Ayni paytda men qaytarilgan natijalarni qulay taqdim etish uchun yana bir qavat yaratdim Gorp, jadval ko'rinishida ishlov berish uchun qulay bo'lgan mos keladigan ma'lumotlar tuzilmalari ko'rinishida (asos sifatida qatorlar va ustunlar; lug'at kalitlari va raqamli indekslar). Xo'sh, natijalarni qayta ishlash va ko'rsatish uchun kerakli yordam dasturlari juda tez yozilgan.

Shuningdek, mundarijalarning skanerlangan matnlarining mavjud namunalarini tahlil qilishni o'rgatish uchun yangi dvigatel uchun shablonlarni moslashtirish jarayoni hech qanday maxsus asoratlarni keltirib chiqarmadi. Aslida, avvalgi shablonlarimga umuman murojaat qilishim shart emas edi: men barcha kerakli shablonlarni noldan yaratdim. Bundan tashqari, agar tizimning oldingi versiyasi bilan ishlash uchun mo'ljallangan shablonlar ularning yordami bilan to'g'ri tahlil qilinishi mumkin bo'lgan matnlar uchun juda tor doirani o'rnatgan bo'lsa, yangi dvigatel allaqachon bir nechta markalash turlariga mos keladigan juda universal shablonlarni ishlab chiqishga imkon berdi. bir marta. Men hatto har qanday ixtiyoriy tarkib matni uchun qandaydir keng qamrovli shablonni yozishga harakat qildim, garchi, albatta, men uchun barcha yangi imkoniyatlar ochilgan bo'lsa ham, xususan, bir xil ichki takrorlanuvchi ketma-ketliklarni amalga oshirishning cheklangan qobiliyati ( masalan, bir nechta mualliflarning familiyalari va bosh harflari kabi), bu utopiya bo'lib chiqdi.

Ehtimol, kelajakda meta-shablonlarning ma'lum bir kontseptsiyasini amalga oshirish mumkin bo'ladi, ular bir vaqtning o'zida bir nechta mavjud shablonlarga dastlabki matnni muvofiqligini tekshirishlari mumkin va keyin olingan natijalarga muvofiq, eng mos keladigani, qandaydir aqlli algoritmdan foydalangan holda. Ammo endi meni boshqa savol qiziqtirardi. Tahlilchi kabi Gorp, uning barcha ko'p qirraliligi va men qilgan o'zgartirishlarimga qaramay, u hali ham o'z-o'zidan yozgan tahlilchim birinchi versiyadanoq qila oladigan oddiy tuyulgan ishni qila olmadi. Ya'ni: u kerakli joyda qo'llanilgan shablonda ko'rsatilgan niqobga mos keladigan barcha bo'laklarni manba matnidan topish va chiqarib olish qobiliyatiga ega edi, lekin bu matnda ushbu bo'laklar orasidagi bo'shliqlarda nima borligi umuman qiziq emas edi. Hozircha men yangi dvigatelni biroz takomillashtirdim, bu esa unga ushbu niqoblarning ma'lum bir ketma-ketligining barcha mumkin bo'lgan yangi takrorlarini joriy holatidan izlash imkonini berdi va matnda to'liq bo'lgan o'zboshimchalik belgilari to'plamining mavjudligi imkoniyatini qoldirdi. tahlil qilishda hisobga olinmagan, aniqlangan takrorlanuvchi tuzilmalar orasiga o'ralgan. Biroq, bu mos keladigan niqob yordamida oldingi fragmentni qidirish natijalaridan qat'i nazar, keyingi niqobni o'rnatishga imkon bermadi: tasvirlangan matn strukturasining qat'iyligi hali ham tartibsiz belgilarni o'zboshimchalik bilan kiritish uchun joy qoldirmadi.

Va agar men duch kelgan mundarija misollari uchun bu muammo hali unchalik jiddiy ko'rinmagan bo'lsa, veb-sayt tarkibini tahlil qilish (ya'ni, bir xil tahlil qilish) uchun yangi tahlil mexanizmini qo'llashga urinayotganda, uning Cheklovlar bu erda ular o'zlarining barcha ravshanligi bilan paydo bo'ldi. Axir, veb-belgilash bo'laklari uchun kerakli niqoblarni o'rnatish juda oson, ular orasida biz izlayotgan ma'lumotlar (ularni chiqarib olish kerak) joylashgan bo'lishi kerak, ammo tahlilchini darhol keyingisiga o'tishga qanday majburlashimiz mumkin. ular orasidagi bo'shliqlarga joylashtirilishi mumkin bo'lgan barcha mumkin bo'lgan teglar va HTML atributlariga qaramay, shunga o'xshash parcha?

Bir oz o'ylab, men bir nechta xizmat ko'rsatish usullarini joriy etishga qaror qildim (%all_oldin) и (%all_after), manba matnida bo'lishi mumkin bo'lgan hamma narsa ulardan keyin keladigan har qanday naqsh (niqob) oldidan o'tkazib yuborilishini ta'minlashning aniq maqsadiga xizmat qiladi. Bundan tashqari, agar (%all_oldin) shunchaki barcha bu o'zboshimchalik kiritish e'tiborsizlik, keyin (%all_after), aksincha, oldingi bo'lakdan ko'chirilgandan so'ng ularni kerakli bo'lakka qo'shish imkonini berdi. Bu juda oddiy ko'rinadi, lekin bu kontseptsiyani amalga oshirish uchun men allaqachon amalga oshirilgan mantiqni buzmaslik uchun kerakli o'zgartirishlarni kiritish uchun gorp manbalarini yana tarashga majbur bo'ldim. Oxir-oqibat, biz buni uddaladik (garchi mening tahlilchimni amalga oshirish juda, birinchi, juda xato bo'lsa ham, yozilgan bo'lsa ham, bir necha hafta ichida). Bundan buyon tizim chinakam universal shaklga ega bo'ldi - uning ishlashiga birinchi urinishlardan kamida 12 yil o'tgach.

Albatta, bu bilan orzularimiz tugamaydi. Bundan tashqari, bepul grammatikani amalga oshirish uchun mavjud kutubxonalarning har qandayidan foydalanib, gorp shablon tahlilchisini C# da butunlay qayta yozishingiz mumkin. Menimcha, kodni sezilarli darajada soddalashtirish kerak va bu bizga mavjud Java manbalari ko'rinishidagi merosdan xalos bo'lish imkonini beradi. Ammo mavjud dvigatel turi bilan turli xil qiziqarli narsalarni qilish mumkin, shu jumladan men yuqorida aytib o'tgan meta-shablonlarni amalga oshirishga urinish, turli veb-saytlardan turli xil ma'lumotlarni tahlil qilish haqida gapirmasa ham bo'ladi (ammo, men istisno qilmayman. Buning uchun mavjud ixtisoslashtirilgan dasturiy vositalar ko'proq mos keladi - men ulardan foydalanish bo'yicha tegishli tajribaga ega emasman).

Aytgancha, bu yozda men Salesforce texnologiyalaridan foydalanadigan kompaniyadan taklifnoma oldim. Gorp), Rigadagi keyingi ish uchun suhbatdan o'ting. Afsuski, hozirda men bunday qayta joylashtirishga tayyor emasman.

Agar ushbu material biroz qiziqish uyg'otsa, ikkinchi qismda men Salesforce-da qo'llaniladigan dastur misolidan foydalanib, shablonlarni kompilyatsiya qilish va keyinchalik tahlil qilish texnologiyasini batafsilroq tasvirlashga harakat qilaman. Gorp (mening qo'shimchalarim, allaqachon tasvirlangan bir nechta funktsional so'zlardan tashqari, shablon sintaksisining o'ziga deyarli hech qanday o'zgartirish kiritmaydi, shuning uchun asl tizim uchun deyarli barcha hujjatlar Gorp Mening versiyam uchun ham mos).

Manba: www.habr.com

a Izoh qo'shish