On iki il davam edən kiçik bir layihənin hekayəsi (BIRMA.NET haqqında ilk dəfə və açıq desək, birinci əldən)

Bu layihənin doğulması 2007-ci ilin sonunda hardasa ağlıma gələn, yalnız 12 il sonra öz son formasını tapmağı nəzərdə tutan kiçik bir fikir hesab edilə bilər (bu zaman - əlbəttə ki, hazırkı həyata keçirilsə də, müəllifə görə, çox qənaətbəxşdir).

Hər şey o zaman başladı ki, kitabxanada o vaxtkı rəsmi vəzifələrimi yerinə yetirərkən, kitab (və musiqi) nəşrlərinin məzmun cədvəllərinin skan edilmiş mətnindən məlumatların mövcud verilənlər bazasına daxil edilməsi prosesinin, Məqalə müəllifinin adı (əgər biz məqalələr toplusundan danışırıqsa), məqalənin başlığı kimi daxil edilməsi üçün tələb olunan bütün məlumatların nizamlılığı və təkrarlanma xüsusiyyətindən istifadə edərək, yəqin ki, əhəmiyyətli dərəcədə sadələşdirilə və avtomatlaşdırıla bilər. məqalə (yaxud mündəricatda əks olunmuş alt başlıq) və cari məzmun elementinin səhifə nömrəsi. Əvvəlcə mən praktiki olaraq əmin oldum ki, bu tapşırığı yerinə yetirmək üçün uyğun bir sistem İnternetdə asanlıqla tapıla bilər. Belə bir layihə tapa bilmədiyim üçün bir qədər sürpriz yarandıqda, onu tək başıma həyata keçirməyə çalışmaq qərarına gəldim.

Kifayət qədər qısa müddətdən sonra ilk prototip işə başladı, mən dərhal gündəlik fəaliyyətimdə istifadə etməyə başladım, eyni zamanda əlimə gələn bütün nümunələrdə onu düzəltdi. Xoşbəxtlikdən, heç bir proqramçı olmadığım adi iş yerimdə yenə də işimdə görünən “boş vaxtlardan” xilas oldum, bu müddət ərzində beynimi intensiv şəkildə düzəldirdim - bu, mövcud reallıqlarda demək olar ki, ağlasığmaz bir şeydir. gün ərzində görülən işlər haqqında gündəlik hesabat. Proqramın cilalanması prosesi cəmi bir ildən çox çəkmədi, lakin bundan sonra da nəticəni tamamilə uğurlu adlandırmaq çətin idi - həyata keçirmək üçün kifayət qədər başa düşülməyən çoxlu müxtəlif konsepsiyalar var idi: atlana bilən isteğe bağlı elementlər. ; elementlərin irəli baxışı (əvvəlki elementləri axtarış nəticələrində əvəz etmək məqsədilə); hətta müntəzəm ifadələr (unikal sintaksisi olan) kimi bir şeyi həyata keçirmək üçün öz cəhdimiz. Deməliyəm ki, bundan əvvəl mən proqramlaşdırmadan bir qədər imtina etmişdim (təxminən 8 il, daha çox olmasa da), ona görə də bacarıqlarımı maraqlı və zəruri bir işə tətbiq etmək üçün yeni fürsət diqqətimi tamamilə cəlb etdi. Təəccüblü deyil ki, ortaya çıxan mənbə kodu - mənim tərəfimdən onun dizaynına heç bir aydın yanaşma olmadığı halda - tez bir zamanda C++ dilinin bəzi elementləri və vizual proqramlaşdırma aspektləri ilə C dilində fərqli hissələrin ağlasığmaz qarışıqlığına çevrildi (əvvəlcə bu Borland C++ Builder kimi dizayn sistemindən istifadə etmək qərara alındı ​​- "demək olar ki, Delphi, lakin C-də"). Lakin bütün bunlar son nəticədə kitabxanamızın gündəlik fəaliyyətinin avtomatlaşdırılmasında öz bəhrəsini verdi.

Eyni zamanda, hər ehtimala qarşı, peşəkar proqram tərtibatçılarını hazırlamaq üçün kurslar almaq qərarına gəldim. Orada “proqramçı olmağı” sıfırdan öyrənmək həqiqətən mümkün olub-olmadığını bilmirəm, lakin o vaxt mənim artıq malik olduğum bacarıqları nəzərə alaraq, o vaxt daha aktual olan texnologiyalara bir qədər yiyələnə bildim. C# kimi, .NET altında inkişaf üçün Visual Studio, həmçinin Java, HTML və SQL ilə əlaqəli bəzi texnologiyalar. Bütün təlim cəmi iki il çəkdi və mənim başqa bir layihəm üçün başlanğıc nöqtəsi oldu və nəticədə bir neçə il davam etdi - lakin bu ayrıca nəşr üçün mövzudur. Burada yalnız qeyd etmək yerinə düşərdi ki, mən təsvir olunan layihədə artıq əldə etdiyim inkişafları C# və WinForms dillərində lazımi funksionallığı həyata keçirən tam hüquqlu pəncərə proqramı yaratmaq üçün uyğunlaşdırmağa və ondan istifadə üçün əsas kimi istifadə etməyə cəhd etdim. qarşıdan gələn diplom layihəsi.
Zaman keçdikcə bu fikir mənə “LIBKOM” və “KRİM” kimi müxtəlif kitabxanaların nümayəndələrinin iştirakı ilə keçirilən illik konfranslarda səslənməyə layiq görünməyə başladı. İdeya, bəli, amma o zaman mənim həyata keçirməm deyil. Sonra mən də ümid etdim ki, kimsə onu daha savadlı yanaşmalardan istifadə edərək yenidən yazacaq. Bu və ya digər şəkildə, 2013-cü ilə qədər ilkin işim haqqında hesabat yazıb konfransda iştirak etmək üçün qrant almaq üçün ərizə ilə Konfransın Təşkilat Komitəsinə göndərmək qərarına gəldim. Məni bir qədər təəccübləndirən odur ki, ərizəm təsdiqləndi və mən layihəni konfransda təqdimata hazırlamaq üçün bəzi təkmilləşdirmələr etməyə başladım.

O vaxta qədər layihə artıq yeni BIRMA adını almışdı, müxtəlif əlavə (o qədər də tam həyata keçirilməmiş, əksinə qəbul edilmiş) imkanlar əldə etmişdi - bütün təfərrüatları hesabatımda tapa bilərsiniz.

Düzünü desəm, BIRMA 2013-ü tam bir şey adlandırmaq çətin idi; Açığını desəm, bu, tələsik hazırlanmış çox zərif bir sənət idi. Kod baxımından, IRBIS 64 formatlaşdırma dilini (və əslində, həmçinin ISIS sistemini) xatırladan təhlilçi üçün bir növ vahid sintaksis yaratmaq üçün kifayət qədər aciz cəhddən başqa, praktiki olaraq heç bir xüsusi yenilik yox idi. siklik strukturlar kimi mötərizələrlə; niyə O vaxt mən bunun olduqca gözəl göründüyünü düşündüm). Təhlilçi ümidsiz şəkildə uyğun tipli mötərizələrin bu dairələrində büdrədi (çünki mötərizələr də başqa bir rol oynadı, yəni təhlil zamanı atlana bilən isteğe bağlı strukturları qeyd etdilər). BİRMA-nın o vaxtkı təsəvvürü çətin, əsassız sintaksisi ilə daha ətraflı tanış olmaq istəyən hər kəsi bir daha o vaxtkı hesabatıma yönəldirəm.

Ümumiyyətlə, öz təhlilçimlə mübarizə aparmaqdan başqa, bu versiyanın kodu ilə bağlı deyəcək heç nəyim yoxdur - .NET kodunun bəzi tipik xüsusiyyətlərini qoruyub saxlamaqla mövcud mənbələrin C++ dilinə tərsinə çevrilməsi istisna olmaqla (dürüst olmaq üçün bu başa düşmək çətindir, məni hər şeyi geri qaytarmağa nə sövq etdi - yəqin ki, mənbə kodlarımı gizli saxlamaq üçün hansısa axmaq qorxu, sanki Coca-Cola-nın gizli reseptinə bərabərdir).

Bəlkə də bu axmaq qərar, nəticədə DLL kitabxanasını elektron kataloqa məlumat daxil etmək üçün evdə hazırlanmış bir iş stansiyasının mövcud interfeysi ilə qoşalaşdırmaqda çətinliklərin səbəbidir (bəli, başqa bir vacib faktı qeyd etmədim: bundan sonra bütün BIRMA "mühərrikinin" kodu gözlənildiyi kimi idi, interfeys hissəsindən ayrılır və müvafiq DLL-də qablaşdırılır). Niyə bu məqsədlər üçün ayrıca bir iş stansiyası yazmaq lazım idi, hər halda, görünüşü və istifadəçi ilə qarşılıqlı əlaqə üsulu ilə IRBIS 64 sisteminin eyni "Kataloqlaşdırıcısı" iş stansiyasını həyasızcasına kopyaladı - bu ayrı bir sualdır. Qısacası: bu, mənim buraxılış layihəm üçün o vaxtkı inkişaflarıma lazımi möhkəmliyi verdi (əks halda tək həzm olunmayan analiz mühərriki bir növ kifayət deyildi). Bundan əlavə, mən Cataloger iş stansiyasının interfeysini həm C++, həm də C#-da həyata keçirilən öz modullarımla həyata keçirməkdə və birbaşa mühərrikimə daxil olmaqda bəzi çətinliklərlə qarşılaşdım.

Ümumiyyətlə, qəribə də olsa, gələcək BIRMA.NET-in bu kifayət qədər yöndəmsiz prototipi növbəti dörd il ərzində mənim “iş atım” olacaqdı. Demək olmaz ki, bu müddət ərzində mən heç olmasa çoxdankı ideyanın yeni, daha dolğun həyata keçirilməsinin yollarını tapmağa çalışmadım. Digər yeniliklər arasında artıq isteğe bağlı elementləri özündə birləşdirə bilən siklik ardıcıllıqlar olmalı idi - mən nəşrlərin biblioqrafik təsvirləri və müxtəlif maraqlı şeylər üçün universal şablonlar ideyasını belə həyata keçirəcəkdim. Halbuki, o vaxtkı praktiki fəaliyyətimdə bütün bunlar az tələb olunurdu və o vaxtkı tətbiqim məzmun cədvəllərinə daxil olmaq üçün kifayət qədər kifayət idi. Bundan əlavə, kitabxanamızın inkişaf vektoru getdikcə muzey arxivlərinin rəqəmsallaşdırılmasına, hesabatların aparılmasına və mənim üçün az maraq kəsb edən digər fəaliyyətlərə doğru getdikcə daha çox yayınmağa başladı ki, bu da sonda məni nəhayət onu tərk etməyə məcbur etdi. bütün bunlardan daha çox məmnun olun.

Paradoksal olaraq, məhz bu dramatik hadisələrdən sonra o dövrdə tipik uzunmüddətli tikinti layihəsinin bütün xarakterik xüsusiyyətlərinə malik olan BİRMA layihəsi sanki çoxdan gözlənilən yeni həyatını almağa başladı! Boş fikirlər üçün daha çox boş vaxtım var idi, bənzər bir şey axtarmaq üçün yenidən Ümumdünya Şəbəkəsini daramağa başladım (xoşbəxtlikdən, indi bütün bunları nəinki hər yerdə, GitHub-da axtaracağımı təxmin edə bildim) və At-da bir yerdə. bu ilin əvvəlində, nəhayət, tanınmış Salesforce şirkətinin əhəmiyyətsiz adla uyğun məhsulu ilə rastlaşdım. Gorp. Özü, o, belə bir təhlil mühərrikindən mənə lazım olan demək olar ki, hər şeyi edə bilərdi - yəni fərdi fraqmentləri ixtiyari, lakin aydın strukturlaşdırılmış mətndən ağıllı şəkildə təcrid etmək, eyni zamanda son istifadəçi üçün kifayət qədər istifadəçi dostu interfeysi, o cümlədən başa düşülən mahiyyətlər kimi. nümunə, şablon və baş vermə və eyni zamanda müntəzəm ifadələrin tanış sintaksisindən istifadə etməklə, təhlil üçün təyin edilmiş semantik qruplara bölünməsi səbəbindən müqayisə olunmaz dərəcədə daha oxunaqlı olur.

Ümumiyyətlə, qərara gəldim ki, bu belədir Gorp (Görəsən, bu ad nə deməkdir? Bəlkə bir növ “ümumi yönümlü müntəzəm təhlilçi”?) – tam olaraq uzun müddətdir axtardığım şey. Düzdür, onun öz ehtiyaclarım üçün dərhal həyata keçirilməsi elə bir problem yaratdı ki, bu mühərrik mənbə mətninin struktur ardıcıllığına çox ciddi riayət etməyi tələb etdi. Günlük faylları kimi bəzi hesabatlar üçün (yəni onlar tərtibatçılar tərəfindən layihədən istifadənin aydın nümunələri kimi yerləşdirilmişdir) bu olduqca uyğundur, lakin skan edilmiş məzmun cədvəllərinin eyni mətnləri üçün bu mümkün deyil. Axı, məzmun cədvəli ilə eyni səhifə "Mündəricat", "Mündəricat" sözləri və nəzərdə tutulan təhlilin nəticələrinə yerləşdirməyimiz lazım olmayan hər hansı digər ilkin təsvirlərlə başlaya bilər (və onları əl ilə kəsmək). hər dəfə də əlverişsizdir). Bundan əlavə, müəllifin adı, başlıq və səhifə nömrəsi kimi fərdi təkrarlanan elementlər arasında səhifədə müəyyən miqdarda zibil ola bilər (məsələn, çertyojlar və sadəcə təsadüfi simvollar). kəsmək. Bununla belə, sonuncu aspekt hələ o qədər də əhəmiyyətli deyildi, lakin birinciyə görə, mövcud icra müəyyən bir yerdən mətndə lazımi strukturları axtarmağa başlaya bilmədi, əksinə onu əvvəldən emal etdi, lazımi strukturları tapmadı. orada nümunələri müəyyən etdi və... işimi bitirdi. Aydındır ki, təkrarlanan strukturlar arasında ən azı bir qədər boşluq yaratmaq üçün bəzi tənzimləmələr lazım idi və bu, məni işə qaytardı.

Başqa bir problem, layihənin özünün Java-da həyata keçirilməsi idi və əgər mən gələcəkdə bu texnologiyanı mövcud verilənlər bazalarına məlumat daxil etmək üçün tanış tətbiqlərlə (məsələn, Irbisin “Kataloqçusu”) əlaqə yaratmaq üçün bəzi vasitələr tətbiq etməyi planlaşdırırdımsa, heç olmasa, heç olmasa. bunu C# və .NET-də edin. Java-nın özü pis bir dil deyil - mən hətta bir dəfə yerli proqramlaşdırıla bilən kalkulyatorun funksionallığını həyata keçirən maraqlı bir pəncərə tətbiqini həyata keçirmək üçün istifadə etdim (kurs layihəsinin bir hissəsi kimi). Sintaksis baxımından isə eyni C-sharp-a çox bənzəyir. Yaxşı, bu yalnız bir artıdır: mövcud layihəni yekunlaşdırmaq mənim üçün daha asan olacaq. Bununla belə, mən Java texnologiyalarının bu olduqca qeyri-adi dünyasına (daha doğrusu, masa üstü) yenidən qərq olmaq istəmədim - axı, dilin özü belə istifadə üçün "uyğunlaşdırılmamışdı" və mən heç də təkrarlamağa can atmadım. əvvəlki təcrübə. Bəlkə də məhz ona görədir ki, WinForms ilə birlikdə C# çoxumuzun vaxtilə başladığı Delphi-yə daha yaxındır. Xoşbəxtlikdən, lazımi həll olduqca tez tapıldı - layihə şəklində IKVM.NET, bu, mövcud Java proqramlarını idarə olunan .NET koduna tərcümə etməyi asanlaşdırır. Düzdür, layihənin özü o vaxta qədər müəlliflər tərəfindən tərk edilmişdi, lakin onun son tətbiqi mənə mənbə mətnləri üçün lazımi tədbirləri uğurla həyata keçirməyə imkan verdi. Gorp.

Beləliklə, mən bütün lazımi dəyişiklikləri etdim və hamısını Visual Studio-da yaradılmış .NET Framework üçün istənilən layihələr tərəfindən asanlıqla “toplana bilən” uyğun tipli DLL-yə yığdım. Bu vaxt geri qaytarılan nəticələrin rahat təqdimatı üçün başqa bir təbəqə yaratdım Gorp, cədvəl görünüşündə işləmək üçün əlverişli olan müvafiq məlumat strukturları şəklində (həm sətirlər, həm də sütunlar əsas götürülməklə; həm lüğət açarları, həm də ədədi indekslər). Nəticələri emal etmək və göstərmək üçün lazımi kommunalların özləri olduqca tez yazılmışdır.

Həmçinin, məzmun cədvəllərinin skan edilmiş mətnlərinin mövcud nümunələrini təhlil etməyi öyrətmək üçün yeni mühərrik üçün şablonların uyğunlaşdırılması prosesi heç bir xüsusi fəsad yaratmadı. Əslində, əvvəlki şablonlarıma müraciət etməli deyildim: sadəcə olaraq bütün lazımi şablonları sıfırdan yaratdım. Üstəlik, sistemin əvvəlki versiyası ilə işləmək üçün hazırlanmış şablonlar, onların köməyi ilə düzgün təhlil edilə bilən mətnlər üçün kifayət qədər dar çərçivə təyin edərsə, yeni mühərrik artıq bir neçə növ işarələmə üçün uyğun olan kifayət qədər universal şablonlar hazırlamağa imkan verdi. bir dəfə. Mən hətta hər hansı bir ixtiyari məzmun cədvəli üçün bir növ əhatəli şablon yazmağa çalışdım, baxmayaraq ki, əlbəttə ki, mənim üçün açılan bütün yeni imkanlar, xüsusən də eyni iç-içə təkrarlanan ardıcıllıqları həyata keçirmək üçün məhdud imkanlar olsa da ( məsələn, ardıcıl olaraq bir neçə müəllifin soyadları və baş hərfləri), bu bir utopiya oldu.

Ola bilsin ki, gələcəkdə müəyyən bir meta-şablon konsepsiyasını həyata keçirmək mümkün olacaq ki, bu da mənbə mətninin bir anda mövcud şablonlardan bir neçəsinə uyğunluğunu yoxlamaq və sonra əldə edilən nəticələrə uyğun olaraq, bir növ ağıllı alqoritmdən istifadə edərək ən uyğun olanıdır. Amma indi məni daha çox başqa sual narahat edirdi. Bənzər bir təhlilçi Gorp, bütün çox yönlülüyünə və etdiyim dəyişikliklərə baxmayaraq, mənim özümə yazdığım təhlilçimin ilk versiyadan edə bildiyi sadə görünən bir şeyi edə bilmədi. Məhz: o, lazımi yerdə istifadə olunan şablon daxilində göstərilən maskaya uyğun gələn bütün fraqmentləri mənbə mətndən tapmaq və çıxarmaq qabiliyyətinə malik idi, eyni zamanda bu fraqmentlər arasındakı boşluqlarda verilən mətnin nə olduğu ilə heç maraqlanmırdı. İndiyə qədər mən yeni mühərriki bir az təkmilləşdirdim, ona mövcud vəziyyətdən bu cür maskaların müəyyən bir ardıcıllığının bütün mümkün yeni təkrarlarını axtarmağa imkan verdim və mətndə tamamilə olan ixtiyari simvol dəstlərinin mövcudluğu imkanını buraxdım. təhlildə nəzərə alınmayan, aşkar edilmiş təkrarlanan strukturlar arasında qapalı. Bununla belə, bu, müvafiq maskadan istifadə edərək əvvəlki fraqmentin axtarışının nəticələrindən asılı olmayaraq növbəti maskanı təyin etməyə imkan vermədi: təsvir olunan mətn strukturunun ciddiliyi hələ də qeyri-müntəzəm simvolların ixtiyari daxil edilməsinə yer qoymadı.

Və əgər mənim rastlaşdığım məzmun cədvəlləri nümunələri üçün bu problem hələ o qədər də ciddi görünmürdüsə, veb-saytın məzmununu təhlil etmək kimi oxşar vəzifəyə (yəni eyni təhlil) yeni təhlil mexanizmini tətbiq etməyə çalışarkən, onun məhdudiyyətlər burada bütün aşkarlığı ilə ortaya çıxdı. Axı, veb işarələmə fraqmentləri üçün lazımi maskaları təyin etmək olduqca asandır, aralarında axtardığımız məlumat (çıxarılmalı) yerləşməlidir, lakin təhlilçini dərhal növbəti birinə keçməyə necə məcbur edə bilərik. aralarındakı boşluqlara yerləşdirilə bilən bütün mümkün teqlərə və HTML atributlarına baxmayaraq oxşar fraqment?

Bir az düşündükdən sonra bir neçə xidmət nümunəsi təqdim etmək qərarına gəldim (%hamısı_əvvəl) и (%hamısı_sonra), mənbə mətnində ola biləcək hər şeyin onlardan sonra gələn hər hansı bir nümunədən (maskadan) əvvəl atlanmasını təmin etmək üçün açıq məqsədə xidmət edir. Üstəlik, əgər (%hamısı_əvvəl) sadəcə olaraq bütün bu ixtiyari daxiletmələrə məhəl qoymadı (%hamısı_sonra), əksinə, əvvəlki fraqmentdən köçdükdən sonra onları istədiyiniz fraqmentə əlavə etməyə imkan verdi. Olduqca sadə səslənir, amma bu konsepsiyanı həyata keçirmək üçün artıq tətbiq edilmiş məntiqi pozmamaq üçün lazımi dəyişikliklər etmək üçün yenidən gorp mənbələrini taramalı oldum. Nəhayət, biz bunu bacardıq (baxmayaraq ki, mənim təhlilimin tətbiqi çox, çox ilk, çox səhv olsa da, yazılmışdır və hətta daha sürətli - bir neçə həftə ərzində). Bundan sonra sistem həqiqətən universal bir forma aldı - onun fəaliyyət göstərməsi üçün ilk cəhdlərdən ən azı 12 il sonra.

Təbii ki, bu bizim arzularımızın sonu deyil. Siz həmçinin pulsuz qrammatikanı həyata keçirmək üçün mövcud kitabxanalardan hər hansı birini istifadə edərək, gorp şablon analizini C#-da tamamilə yenidən yaza bilərsiniz. Düşünürəm ki, kod əhəmiyyətli dərəcədə sadələşdirilməlidir və bu, mövcud Java mənbələri şəklində mirasdan qurtulmağa imkan verəcəkdir. Ancaq mövcud mühərrik növü ilə müxtəlif maraqlı şeylər etmək, o cümlədən yuxarıda qeyd etdiyim meta-şablonları həyata keçirmək cəhdi, müxtəlif veb-saytlardan müxtəlif məlumatların təhlilini qeyd etməmək də olduqca mümkündür (lakin istisna etmirəm. mövcud ixtisaslaşdırılmış proqram vasitələrinin bunun üçün daha uyğun olduğunu - sadəcə onlardan istifadə etmək üçün hələ müvafiq təcrübəm olmayıb).

Yeri gəlmişkən, bu yay mən artıq Salesforce texnologiyalarından istifadə edən bir şirkətdən (orijinalın tərtibatçısı) elektron poçtla dəvət aldım. Gorp), Riqada sonrakı iş üçün müsahibədən keçin. Təəssüf ki, hazırda mən bu cür yerləşdirmələrə hazır deyiləm.

Bu material müəyyən maraq doğurursa, ikinci hissədə Salesforce-da istifadə olunan tətbiq nümunəsindən istifadə edərək şablonların tərtib edilməsi və sonradan təhlili texnologiyasını daha ətraflı təsvir etməyə çalışacağam. Gorp (öz əlavələrim, artıq təsvir edilmiş bir neçə funksiya sözü istisna olmaqla, şablon sintaksisinin özündə faktiki olaraq heç bir dəyişiklik etmir, buna görə orijinal sistem üçün demək olar ki, bütün sənədlər Gorp Mənim versiyam üçün də uyğundur).

Mənbə: www.habr.com

Добавить комментарий