Տասներկու տարվա մեկ փոքր նախագծի պատմությունը (BIRMA.NET-ի մասին առաջին անգամ և անկեղծորեն առաջին ձեռքից)

Այս նախագծի ծնունդը կարելի է համարել փոքրիկ գաղափար, որն ինձ մոտ ծագեց ինչ-որ տեղ 2007-ի վերջին, որը վիճակված էր իր վերջնական ձևը գտնել միայն 12 տարի անց (ժամանակի այս պահին, իհարկե, թեև ներկայիս իրականացումը, ըստ. հեղինակին, շատ գոհացուցիչ է):

Ամեն ինչ սկսվեց նրանից, որ գրադարանում իմ այն ​​ժամանակվա պաշտոնական պարտականությունները կատարելիս ուշադրություն հրավիրեցի այն փաստի վրա, որ գրքերի (և երաժշտության) հրապարակումների բովանդակության սկանավորված տեքստից տվյալների մուտքագրման գործընթացը առկա տվյալների բազա. ըստ երևույթին, այն կարող է զգալիորեն պարզեցվել և ավտոմատացվել՝ օգտվելով մուտքագրման համար անհրաժեշտ բոլոր տվյալների կանոնավորության և կրկնելիության հատկությունից, օրինակ՝ հոդվածի հեղինակի անունը (եթե խոսքը հոդվածների հավաքածուի մասին է), վերնագիրը. հոդվածը (կամ բովանդակության աղյուսակում արտացոլված ենթավերնագիրը) և ընթացիկ բովանդակության կետի էջի համարը: Սկզբում ես գործնականում համոզված էի, որ այս առաջադրանքն իրականացնելու համար հարմար համակարգ կարելի է հեշտությամբ գտնել ինտերնետում։ Երբ որոշ զարմանք առաջացրեց այն փաստը, որ ես չկարողացա գտնել նման նախագիծ, որոշեցի փորձել այն իրականացնել ինքնուրույն։

Բավական կարճ ժամանակ անց սկսեց գործել առաջին նախատիպը, որը ես անմիջապես սկսեցի օգտագործել իմ առօրյա գործունեության մեջ՝ միաժամանակ վրիպազերծելով այն բոլոր այն օրինակների վրա, որոնք ձեռքս ընկան։ Բարեբախտաբար, իմ սովորական աշխատավայրում, որտեղ ես ամենևին էլ ծրագրավորող չէի, այնուհետև ես ազատվեցի իմ աշխատանքի տեսանելի «դադարից», որի ընթացքում ես ինտենսիվ կարգաբերում էի իմ միտքը. ամենօրյա հաշվետվություններ օրվա ընթացքում կատարված աշխատանքի վերաբերյալ. Ծրագրի հղկման գործընթացն ընդհանուր առմամբ տևել է ոչ պակաս, քան մոտ մեկ տարի, բայց նույնիսկ դրանից հետո արդյունքը դժվար թե կարելի է անվանել լիովին հաջող. բաց թողնել; տարրերի առաջ դիտում (նախորդ տարրերը որոնման արդյունքներում փոխարինելու նպատակով); նույնիսկ կանոնավոր արտահայտությունների պես մի բան իրականացնելու մեր սեփական փորձը (որն ունի յուրահատուկ շարահյուսություն): Ասեմ, որ մինչ այս ես որոշ չափով հրաժարվել էի ծրագրավորումից (մոտ 8 տարի, եթե ոչ ավելի), ուստի իմ հմտությունները հետաքրքիր և անհրաժեշտ առաջադրանքի մեջ կիրառելու նոր հնարավորությունն ամբողջությամբ գրավեց իմ ուշադրությունը։ Զարմանալի չէ, որ ստացված սկզբնաղբյուրը, իմ կողմից դրա ձևավորման վերաբերյալ որևէ հստակ մոտեցում չունենալու դեպքում, շատ արագ դարձավ C լեզվի տարբեր մասերի աներևակայելի խառնաշփոթ C++ որոշ տարրերով և տեսողական ծրագրավորման ասպեկտներով (սկզբում դա որոշվեց օգտագործել այնպիսի նախագծային համակարգ, ինչպիսին է Borland C++ Builder-ը` «գրեթե Delphi, բայց C-ով»): Այնուամենայնիվ, այս ամենը, ի վերջո, արդյունք տվեց մեր գրադարանի ամենօրյա գործունեության ավտոմատացման գործում:

Միևնույն ժամանակ, ես որոշեցի, ամեն դեպքում, դասընթացներ անցնել պրոֆեսիոնալ ծրագրավորողներ պատրաստելու համար: Չգիտեմ՝ իրականում հնարավո՞ր է այնտեղ զրոյից սովորել «ծրագրավորող լինել», բայց հաշվի առնելով այն հմտությունները, որոնք ես արդեն ունեի այն ժամանակ, ես կարողացա որոշակիորեն տիրապետել այն տեխնոլոգիաներին, որոնք այդ ժամանակ ավելի արդիական էին, ինչպիսիք են. որպես C#, Visual Studio մշակման համար NET-ի ներքո, ինչպես նաև Java-ի, HTML-ի և SQL-ի հետ կապված որոշ տեխնոլոգիաներ: Ամբողջ թրեյնինգը տևեց ընդհանուր առմամբ երկու տարի և ծառայեց որպես մեկնարկային կետ իմ մեկ այլ նախագծի համար, որն ի վերջո ձգվեց մի քանի տարի, բայց սա առանձին հրապարակման թեմա է: Այստեղ միայն տեղին կլինի նշել, որ ես փորձեցի հարմարեցնել այն զարգացումները, որոնք արդեն ունեցել եմ նկարագրված նախագծի վրա՝ ստեղծելու լիարժեք պատուհանի հավելված C#-ում և WinForms-ում, որն իրականացնում է անհրաժեշտ ֆունկցիոնալությունը և օգտագործել այն որպես հիմք առաջիկա դիպլոմային նախագիծը.
Ժամանակի ընթացքում այս միտքը սկսեց ինձ թվալ, որ արժանի է հնչեցնելու ամենամյա գիտաժողովներում տարբեր գրադարանների ներկայացուցիչների մասնակցությամբ, ինչպիսիք են «LIBKOM»-ը և «CRIMEA»-ն: Գաղափարը, այո, բայց ոչ այն ժամանակ դրա իմ իրականացումը։ Հետո ես նաև հույս ունեի, որ ինչ-որ մեկը կվերաշարադրի այն՝ օգտագործելով ավելի գրագետ մոտեցումներ։ Այսպես թե այնպես, մինչև 2013 թվականը որոշեցի իմ նախնական աշխատանքի մասին զեկույց գրել և ուղարկել գիտաժողովի կազմկոմիտե՝ համաժողովին մասնակցելու դրամաշնորհի հայտով։ Ի զարմանս ինձ, իմ հայտը հաստատվեց, և ես սկսեցի որոշակի բարելավումներ կատարել նախագծի մեջ՝ այն պատրաստելու համար համաժողովում ներկայացնելու համար:

Այդ ժամանակ նախագիծն արդեն ստացել էր BIRMA նոր անվանումը, ձեռք էր բերել տարբեր լրացուցիչ (ոչ այնքան ամբողջությամբ իրականացված, այլ ավելի շուտ ենթադրյալ) հնարավորություններ. բոլոր մանրամասները կարելի է գտնել իմ զեկույցում.

Անկեղծ ասած, դժվար էր BIRMA 2013-ը ամբողջական բան անվանել. Անկեղծ ասած, դա շատ հապճեպ արհեստ էր: Կոդի առումով, գործնականում ընդհանրապես հատուկ նորամուծություններ չկային, բացառությամբ վերլուծողի համար ինչ-որ միասնական շարահյուսություն ստեղծելու բավականին անօգնական փորձի, որն արտաքնապես հիշեցնում է IRBIS 64 ձևաչափման լեզուն (և իրականում նաև ISIS համակարգը. փակագծերով՝ որպես ցիկլային կառուցվածք, ինչու Այդ ժամանակ ես կարծում էի, որ այն բավականին գեղեցիկ տեսք ուներ): Վերլուծիչը հուսահատորեն սայթաքեց համապատասխան տիպի փակագծերի այս շրջանակների վրա (քանի որ փակագծերը կատարում էին նաև մեկ այլ դեր, այն է, որ նրանք վերլուծության ընթացքում նշում էին ընտրովի կառույցներ, որոնք կարելի է բաց թողնել): Բոլոր նրանց, ովքեր ցանկանում են ավելի մանրամասն ծանոթանալ BIRMA-ի այն ժամանակ դժվար պատկերացնել, չարդարացված շարահյուսությանը, կրկին հղում եմ անում իմ այն ​​ժամանակվա զեկույցին։

Ընդհանրապես, բացի իմ սեփական վերլուծիչի հետ պայքարից, այլևս ոչինչ չունեմ ասելու այս տարբերակի կոդի հետ կապված. դժվար է հասկանալ, թե կոնկրետ ինչն ինձ դրդեց ետ տեղափոխել ամեն ինչ. հավանաբար ինչ-որ հիմար վախ իմ սկզբնաղբյուրները գաղտնի պահելու համար, կարծես դա Կոկա-Կոլայի գաղտնի բաղադրատոմսին համարժեք մի բան լիներ):

Թերևս այս հիմար որոշումն է նաև առաջացած DLL գրադարանի զուգակցման դժվարությունների պատճառը տնային աշխատանքային կայանի առկա ինտերֆեյսի հետ՝ տվյալների էլեկտրոնային կատալոգ մուտքագրելու համար (այո, ես չնշեցի ևս մեկ կարևոր փաստ. այսուհետ բոլորը BIRMA «շարժիչի» կոդը սպասվածի նման էր, այն առանձնացված է ինտերֆեյսի մասից և փաթեթավորված համապատասխան DLL-ում): Ինչու՞ էր անհրաժեշտ այդ նպատակների համար գրել առանձին աշխատակայան, որն, այնուամենայնիվ, իր տեսքով և օգտագործողի հետ փոխգործակցության եղանակով, անամոթաբար պատճենեց IRBIS 64 համակարգի նույն «Catalogizer» կայանը, սա առանձին հարց է: Մի խոսքով, դա անհրաժեշտ ամրություն տվեց իմ այն ​​ժամանակվա զարգացումներին իմ ավարտական ​​ծրագրի համար (հակառակ դեպքում միայն անմարսելի վերլուծիչ շարժիչը ինչ-որ կերպ բավարար չէր): Բացի այդ, ես այնուհետև հանդիպեցի որոշ դժվարությունների Cataloger աշխատանքային կայանի ինտերֆեյսը իմ սեփական մոդուլներով, որոնք ներդրված էին ինչպես C++, այնպես էլ C#-ում, և ուղղակիորեն մուտք գործելու իմ շարժիչը:

Ընդհանուր առմամբ, տարօրինակ կերպով, ապագա BIRMA.NET-ի այս բավականին անշնորհք նախատիպն էր, որ վիճակված էր դառնալ իմ «աշխատանքային ձին» հաջորդ չորս տարիների ընթացքում: Չի կարելի ասել, որ այս ընթացքում ես գոնե չեմ փորձել ուղիներ գտնել վաղեմի գաղափարի նոր, ավելի ամբողջական իրականացման համար։ Ի թիվս այլ նորարարությունների, արդեն պետք է լինեին ցիկլային հաջորդականություններ, որոնք կարող էին ներառել կամընտիր տարրեր. ահա թե ինչպես էի պատրաստվում կյանքի կոչել հրատարակությունների և այլ հետաքրքիր բաների մատենագիտական ​​նկարագրությունների համընդհանուր ձևանմուշների գաղափարը: Սակայն այն ժամանակվա իմ գործնական գործունեության մեջ այս ամենը քիչ պահանջարկ ուներ, և այն իրականացումը, որն այն ժամանակ ունեի, միանգամայն բավարար էր բովանդակություն մուտքագրելու համար։ Բացի այդ, մեր գրադարանի զարգացման վեկտորը սկսեց ավելի ու ավելի շեղվել դեպի թանգարանային արխիվների թվայնացում, հաշվետվություններ և ինձ քիչ հետաքրքրող այլ գործունեություն, ինչը ի վերջո ստիպեց ինձ վերջնականապես լքել այն՝ տեղը զիջելով նրանց, ովքեր կ ավելի գոհ եղեք այս ամենից:

Պարադոքսալ կերպով, հենց այս դրամատիկ իրադարձություններից հետո էր, որ BIRMA նախագիծը, որն այն ժամանակ արդեն ուներ տիպիկ երկարաժամկետ շինարարական նախագծի բոլոր բնորոշ հատկանիշները, կարծես սկսեց ստանալ իր երկար սպասված նոր կյանքը: Ես ավելի շատ ազատ ժամանակ ունեի պարապ մտքերի համար, նորից սկսեցի սանրել Համաշխարհային սարդոստայնը՝ նման բան փնտրելու համար (բարեբախտաբար, հիմա արդեն կարող էի գուշակել, որ այս ամենը փնտրել ոչ միայն ամենուր, այլ GitHub-ում), և ինչ-որ տեղ At-ում։ այս տարվա սկզբին ես վերջապես հանդիպեցի հայտնի Salesforce ընկերության համապատասխան ապրանքին` աննշան անունով. Գորպ. Ինքնին, այն կարող էր անել գրեթե այն ամենը, ինչ ինձ անհրաժեշտ էր նման վերլուծիչի շարժիչից, մասնավորապես՝ խելամտորեն մեկուսացնել առանձին հատվածները կամայական, բայց հստակ կառուցվածքային տեքստից, մինչդեռ վերջնական օգտագործողի համար ունենալով բավականին հարմար ինտերֆեյս, ներառյալ այնպիսի հասկանալի էություններ, ինչպիսիք են. օրինաչափություն, ձևանմուշ և երևույթ, և միևնույն ժամանակ օգտագործելով կանոնավոր արտահայտությունների ծանոթ շարահյուսությունը, որն անհամեմատ ավելի ընթեռնելի է դառնում վերլուծության համար նշանակված իմաստային խմբերի բաժանվելու պատճառով:

Ընդհանուր առմամբ, ես որոշեցի, որ սա մեկն է Գորպ (Հետաքրքիր է, թե ինչ է նշանակում այս անունը: Գուցե ինչ-որ «ընդհանուր ուղղվածություն ունեցող կանոնավոր վերլուծիչ»:) – հենց այն, ինչ ես փնտրում էի երկար ժամանակ: Ճիշտ է, իմ սեփական կարիքների համար դրա անհապաղ իրականացումը այնպիսի խնդիր ուներ, որ այս շարժիչը պահանջում էր չափազանց խիստ հետևում սկզբնական տեքստի կառուցվածքային հաջորդականությանը: Որոշ զեկույցների համար, ինչպիսիք են տեղեկամատյանների ֆայլերը (մասնավորապես, դրանք տեղադրվել են մշակողների կողմից որպես նախագծի օգտագործման հստակ օրինակներ), սա բավականին հարմար է, բայց սկանավորված բովանդակության նույն տեքստերի համար դա քիչ հավանական է: Ի վերջո, բովանդակության աղյուսակով նույն էջը կարող է սկսվել «Բովանդակության աղյուսակ», «Բովանդակություն» բառերով և ցանկացած այլ նախնական նկարագրությամբ, որը մենք կարիք չունենք տեղադրել նախատեսված վերլուծության արդյունքներում (և դրանք ձեռքով կտրել): ամեն անգամ նույնպես անհարմար է): Բացի այդ, առանձին կրկնվող տարրերի միջև, ինչպիսիք են հեղինակի անունը, վերնագիրը և էջի համարը, էջը կարող է պարունակել որոշակի քանակությամբ աղբ (օրինակ՝ գծագրեր և պարզապես պատահական նիշեր), ինչը նույնպես լավ կլիներ, որ կարողանայիք: կտրել. Այնուամենայնիվ, վերջին ասպեկտը դեռ այնքան էլ նշանակալից չէր, բայց առաջինի պատճառով գոյություն ունեցող իրականացումը չէր կարող որոշակի տեղից սկսել տեքստում անհրաժեշտ կառույցները փնտրել, փոխարենը պարզապես այն հենց սկզբից մշակեց, չգտավ այնտեղ հստակեցրեց օրինաչափությունները և... ավարտեց իմ աշխատանքը: Ակնհայտ է, որ անհրաժեշտ էր որոշակի ճշգրտումներ՝ կրկնվող կառույցների միջև գոնե որոշակի տարածություն թույլ տալու համար, և դա ինձ վերադարձրեց աշխատանքի:

Մեկ այլ խնդիր այն էր, որ նախագիծն ինքնին իրականացվել է Java-ում, և եթե ես ապագայում ծրագրում էի այս տեխնոլոգիան փոխհարաբերելու որոշ միջոցներ կիրառել գոյություն ունեցող տվյալների բազաներում տվյալների մուտքագրման համար ծանոթ հավելվածների հետ (օրինակ՝ Irbis-ի «Cataloguer»), ապա առնվազն դա արեք C#-ում և .NET-ում: Այն չէ, որ Java-ն ինքնին վատ լեզու է. ես մի անգամ նույնիսկ այն օգտագործել եմ մի հետաքրքիր պատուհանի ծրագիր իրականացնելու համար, որն իրագործում էր տնային ծրագրավորվող հաշվիչի ֆունկցիոնալությունը (որպես դասընթացի նախագծի մաս): Իսկ շարահյուսության առումով շատ նման է նույն C-sharp-ին։ Դե, սա միայն պլյուս է. այնքան ավելի հեշտ կլինի ինձ համար ավարտին հասցնել գոյություն ունեցող նախագիծը: Այնուամենայնիվ, ես չէի ուզում նորից ընկղմվել պատուհանների (ավելի ճիշտ, աշխատասեղանի) Java տեխնոլոգիաների այս բավականին անսովոր աշխարհը, ի վերջո, լեզուն ինքնին «հարմարեցված» չէր նման օգտագործման համար, և ես ամենևին էլ չէի ցանկանում կրկնել: նախորդ փորձը. Միգուցե դա հենց այն պատճառով է, որ C#-ը WinForms-ի հետ միասին շատ ավելի մոտ է Delphi-ին, որով մեզանից շատերը ժամանակին սկսել են: Բարեբախտաբար, անհրաժեշտ լուծումը գտնվեց բավականին արագ՝ ի դեմս նախագծի IKVM.NET, ինչը հեշտացնում է գոյություն ունեցող Java ծրագրերի թարգմանությունը կառավարվող .NET կոդի: Ճիշտ է, նախագիծն ինքնին այդ ժամանակ արդեն լքված էր հեղինակների կողմից, բայց դրա վերջին իրականացումը թույլ տվեց ինձ բավականին հաջողությամբ իրականացնել սկզբնաղբյուր տեքստերի համար անհրաժեշտ գործողությունները: Գորպ.

Այսպիսով, ես կատարեցի բոլոր անհրաժեշտ փոփոխությունները և հավաքեցի այդ ամենը համապատասխան տիպի DLL-ի մեջ, որը հեշտությամբ կարելի էր «վերցնել» Visual Studio-ում ստեղծված .NET Framework-ի ցանկացած նախագծի կողմից: Միևնույն ժամանակ ես ստեղծեցի ևս մեկ շերտ՝ վերադարձված արդյունքները հարմար ներկայացնելու համար Գորպ, համապատասխան տվյալների կառուցվածքների տեսքով, որոնք հարմար կլինի մշակել աղյուսակի տեսքով (հիմք ընդունելով և՛ տողերը, և՛ սյունակները, և՛ բառարանի ստեղները, և՛ թվային ինդեքսները): Դե, արդյունքները մշակելու և ցուցադրելու համար անհրաժեշտ կոմունալ ծառայություններն իրենք բավականին արագ գրվեցին:

Նաև նոր շարժիչի համար ձևանմուշների հարմարեցման գործընթացը, որպեսզի նրան սովորեցնեն վերլուծել բովանդակության սկանավորված տեքստերի առկա նմուշները, որևէ հատուկ բարդություն չի առաջացրել: Իրականում, ես նույնիսկ ստիպված չէի անդրադառնալ իմ նախորդ կաղապարներին. ես պարզապես զրոյից ստեղծել եմ բոլոր անհրաժեշտ կաղապարները: Ավելին, եթե համակարգի նախորդ տարբերակի հետ աշխատելու համար նախատեսված ձևանմուշները սահմանում են բավականին նեղ շրջանակ տեքստերի համար, որոնք կարող են ճիշտ վերլուծվել դրանց օգնությամբ, ապա նոր շարժիչն արդեն հնարավորություն է տվել մշակել բավականին ունիվերսալ կաղապարներ, որոնք հարմար են մի քանի տեսակի նշագրման համար: մեկ անգամ. Ես նույնիսկ փորձեցի գրել ինչ-որ համապարփակ ձևանմուշ ցանկացած կամայական բովանդակության տեքստի համար, թեև, իհարկե, նույնիսկ ինձ համար բացված բոլոր նոր հնարավորություններով, ներառյալ, մասնավորապես, նույն ներդիր կրկնվող հաջորդականությունները իրականացնելու սահմանափակ կարողությունը ( ինչպես, օրինակ, մի քանի հեղինակների անընդմեջ ազգանուններն ու սկզբնատառերը), սա ուտոպիա էր։

Միգուցե ապագայում հնարավոր լինի իրականացնել մետա-կաղապարների որոշակի հայեցակարգ, որը կկարողանա ստուգել սկզբնաղբյուրի տեքստը միանգամից մի քանի առկա կաղապարների հետ համապատասխանության համար, այնուհետև, ստացված արդյունքների համաձայն, ընտրել ամենահարմարը, օգտագործելով ինչ-որ խելացի ալգորիթմ: Բայց հիմա ինձ ավելի շատ մեկ այլ հարց էր հուզում. Նման վերլուծիչ Գորպ, չնայած իր ողջ բազմակողմանիությանը և իմ կատարած փոփոխություններին, այն դեռևս ի սկզբանե ի վիճակի չէր անել մի պարզ թվացող բան, որը իմ ինքնագրված վերլուծիչը կարողացավ անել հենց առաջին տարբերակից: Նա հնարավորություն ուներ գտնել և սկզբնաղբյուր տեքստից հանել բոլոր այն հատվածները, որոնք համապատասխանում են ճիշտ տեղում օգտագործված կաղապարի մեջ նշված դիմակին, մինչդեռ բոլորովին չէր հետաքրքրվում, թե ինչ է պարունակում տվյալ տեքստը այդ հատվածների միջև եղած բացատներում: Մինչ այժմ ես միայն մի փոքր բարելավել եմ նոր շարժիչը, որը թույլ է տալիս նրան փնտրել նման դիմակների տվյալ հաջորդականության բոլոր հնարավոր կրկնությունները ներկայիս դիրքից՝ թողնելով կամայական նիշերի տեքստում առկայության հնարավորությունը, որոնք ամբողջությամբ եղել են։ չհաշվառված վերլուծության մեջ, փակված հայտնաբերված կրկնվող կառույցների միջև: Այնուամենայնիվ, դա թույլ չտվեց տեղադրել հաջորդ դիմակը, անկախ նախորդ հատվածի որոնման արդյունքներից, օգտագործելով համապատասխան դիմակը. նկարագրված տեքստային կառուցվածքի խստությունը դեռ տեղ չէր թողնում անկանոն նիշերի կամայական ընդգրկումների համար:

Եվ եթե բովանդակության աղյուսակների օրինակների համար, որին ես հանդիպեցի, այս խնդիրը դեռ այնքան էլ լուրջ չէր թվում, ապա երբ փորձում եք նոր վերլուծական մեխանիզմ կիրառել կայքի բովանդակությունը վերլուծելու նմանատիպ առաջադրանքում (այսինքն՝ նույն վերլուծությունը), սահմանափակումներն այստեղ են, նրանք հայտնվեցին իրենց ողջ ակնհայտությամբ։ Ի վերջո, բավականին հեշտ է տեղադրել անհրաժեշտ դիմակները վեբ նշագրման հատվածների համար, որոնց միջև պետք է տեղակայվեն մեր փնտրած տվյալները (որոնք պետք է արդյունահանվեն), բայց ինչպես կարող ենք ստիպել վերլուծողին անմիջապես անցնել հաջորդին: նմանատիպ հատված, չնայած բոլոր հնարավոր թեգերին և HTML ատրիբուտներին, որոնք կարող են տեղադրվել նրանց միջև եղած բացատներում:

Մի փոքր մտածելուց հետո որոշեցի ներկայացնել մի քանի սպասարկման օրինաչափություն (% all_before) и (% all_after), ծառայելով ակնհայտ նպատակին՝ ապահովելու, որ այն ամենը, ինչ կարող է պարունակվել սկզբնաղբյուր տեքստում, բաց է թողնվել դրանց հաջորդող ցանկացած օրինաչափությունից (դիմակից): Ընդ որում, եթե (% all_before) պարզապես անտեսեց այս բոլոր կամայական ընդգրկումները, ապա (% all_after), ընդհակառակը, թույլ է տվել դրանք ավելացնել ցանկալի բեկորին նախորդ հատվածից տեղափոխվելուց հետո։ Բավականին պարզ է թվում, բայց այս հայեցակարգն իրականացնելու համար ես ստիպված էի նորից սանրել gorp աղբյուրները, որպեսզի անհրաժեշտ փոփոխությունները կատարեմ, որպեսզի չխախտեմ արդեն իսկ իրականացված տրամաբանությունը։ Ի վերջո, մեզ հաջողվեց դա անել (չնայած նույնիսկ իմ վերլուծիչի ամենաառաջինը, թեև շատ խելագարված, իրականացումը գրվեց, և նույնիսկ ավելի արագ՝ մի քանի շաբաթվա ընթացքում): Այսուհետ համակարգը ստացել է իսկապես ունիվերսալ ձև՝ այն գործելու առաջին փորձերից ոչ պակաս, քան 12 տարի անց:

Իհարկե, սա մեր երազանքների ավարտը չէ։ Կարող եք նաև ամբողջությամբ վերաշարադրել gorp կաղապարի վերլուծիչը C#-ում՝ օգտագործելով հասանելի գրադարաններից որևէ մեկը՝ անվճար քերականություն իրականացնելու համար: Կարծում եմ՝ կոդը պետք է զգալիորեն պարզեցվի, և դա թույլ կտա մեզ ազատվել ժառանգությունից՝ գոյություն ունեցող Java աղբյուրների տեսքով։ Բայց գործող տիպի շարժիչով միանգամայն հնարավոր է նաև տարբեր հետաքրքիր բաներ անել, այդ թվում՝ արդեն նշածս մետա կաղապարների ներդրման փորձը, էլ չեմ խոսում տարբեր կայքերից տարբեր տվյալների վերլուծության մասին (սակայն չեմ բացառում. որ գոյություն ունեցող մասնագիտացված ծրագրային գործիքներն ավելի հարմար են դրա համար. ես պարզապես դրանք օգտագործելու համապատասխան փորձ դեռ չեմ ունեցել):

Ի դեպ, այս ամառ ես արդեն էլեկտրոնային փոստով հրավեր եմ ստացել Salesforce տեխնոլոգիաներ օգտագործող ընկերությունից (օրիգինալը մշակող Գորպ), անցեք հարցազրույց Ռիգայում հետագա աշխատանքի համար: Ցավոք սրտի, այս պահին ես պատրաստ չեմ նման վերաբաշխումների։

Եթե ​​այս նյութը որոշակի հետաքրքրություն առաջացնի, ապա երկրորդ մասում ես կփորձեմ ավելի մանրամասն նկարագրել ձևանմուշները կազմելու և հետագայում վերլուծելու տեխնոլոգիան՝ օգտագործելով Salesforce-ում օգտագործվող իրականացման օրինակը։ Գորպ (Իմ սեփական հավելումները, բացառությամբ արդեն նկարագրված մի քանի ֆունկցիոնալ բառերի, գործնականում ոչ մի փոփոխություն չեն կատարում կաղապարի շարահյուսության մեջ, հետևաբար սկզբնական համակարգի գրեթե բոլոր փաստաթղթերը Գորպ Հարմար է նաև իմ տարբերակին):

Source: www.habr.com

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