Crita siji proyek cilik rolas taun suwene (bab BIRMA.NET kanggo pisanan lan terus terang tangan pisanan)

Lair saka proyek iki bisa dianggep minangka gagasan cilik sing teka ing endi wae ing pungkasan taun 2007, sing ditemtokake kanggo nemokake wangun pungkasan mung 12 taun sabanjure (ing wektu iki - mesthi, sanajan implementasine saiki, miturut kanggo panulis, marem banget).

Iku kabeh diwiwiti nalika, ing proses ngrampungake tugas resmi ing perpustakaan, aku narik kawigaten yen proses ngetik data saka teks sing dipindai saka tabel isi buku (lan musik) publikasi menyang database sing wis ana, ketoke, bisa Ngartekno simplified lan otomatis, njupuk kauntungan saka properti saka orderliness lan repeatability kabeh data dibutuhake kanggo input, kayata jeneng saka penulis artikel (yen kita ngomong bab koleksi artikel), judhul artikel (utawa subtitle sing dibayangke ing daftar isi) lan nomer kaca item daftar isi saiki. Kaping pisanan, aku yakin manawa sistem sing cocog kanggo nindakake tugas iki bisa gampang ditemokake ing Internet. Nalika sawetara kejutan amarga kasunyatane aku ora bisa nemokake proyek kasebut, aku mutusake kanggo nyoba ngetrapake dhewe.

Sawise wektu sing cukup cendhak, prototipe pisanan wiwit bisa digunakake, sing langsung digunakake ing aktivitas saben dina, bebarengan debugging ing kabeh conto sing teka ing tanganku. Begjanipun, ing papan kerja biasanipun, ing pundi kula dudu programmer, aku isih bisa nyingkirake "downtime" sing katon ing karyaku, nalika aku kanthi intensif debugging brainchildku - bab sing meh ora bisa dipikirake ing kasunyatan saiki, sing tegese laporan saben dina ing karya rampung sak dina. Proses polishing program njupuk total ora kurang saka setahun, nanging malah sawise iku asil meh ora bisa disebut rampung sukses - akeh banget konsep beda pisanan glethakaken mudhun sing ora sakabehe cetha kanggo implementasine: unsur opsional sing bisa dilewati; maju ndeleng unsur (kanggo tujuan ngganti unsur sadurunge menyang asil panelusuran); malah usaha kita dhewe kanggo ngleksanakake kaya ekspresi reguler (sing duwe sintaksis unik). Aku kudu ujar manawa sadurunge aku wis nyerah program (kira-kira 8 taun, yen ora luwih), saengga kesempatan anyar kanggo ngetrapake katrampilanku kanggo tugas sing menarik lan perlu wis narik kawigatenku. Ora nggumunake yen kode sumber sing diasilake - yen ora ana pendekatan sing jelas kanggo desaine - cukup cepet dadi mishmash sing ora bisa dibayangake saka potongan-potongan sing beda-beda ing basa C kanthi sawetara unsur C ++ lan aspek pemrograman visual (mulane iku. diputusake nggunakake sistem desain kaya Borland C ++ Builder - "meh Delphi, nanging ing C"). Nanging, kabeh iki pungkasane ngasilake kanthi ngotomatisasi kegiatan saben dina perpustakaan.

Ing wektu sing padha, aku mutusake, yen ngono, kanggo njupuk kursus kanggo nglatih pangembang piranti lunak profesional. Aku ora ngerti apa bener bisa sinau "dadi programmer" saka awal ing kana, nanging njupuk katrampilan sing wis ana ing wektu iku, aku bisa nguwasani teknologi sing luwih relevan nalika iku, kayata. minangka C #, Visual Studio kanggo pembangunan ing .NET, uga sawetara teknologi related kanggo Java, HTML lan SQL. Kabeh latihan njupuk total rong taun, lan dadi titik wiwitan kanggo proyek liyane saka mine, kang wekasanipun digawe dowo liwat sawetara taun - nanging iki topik kanggo publikasi kapisah. Ing kene mung kudu dicathet yen aku nyoba kanggo ngganti perkembangan sing wis ana ing proyek sing diterangake kanggo nggawe aplikasi jendhela lengkap ing C # lan WinForms sing ngetrapake fungsi sing dibutuhake, lan digunakake minangka basis kanggo proyek diploma mbesuk.
Swara wektu, idea iki wiwit ketoke aku pantes dadi voiced ing konferensi taunan kuwi karo partisipasi saka wakil saka macem-macem perpustakaan minangka "LIBKOM" lan "CRIMEA". Ide, ya, nanging ora implementasine ing wektu iku. Banjur aku uga ngarep-arep yen ana wong sing nulis maneh nggunakake pendekatan sing luwih kompeten. Siji cara utawa liyane, ing taun 2013 aku mutusake kanggo nulis laporan babagan karya awal lan dikirim menyang Panitia Penyelenggara Konferensi kanthi aplikasi kanggo hibah kanggo melu konferensi. Kanggo sandi rada surprise, aplikasi sandi disetujoni, lan aku wiwit nggawe sawetara dandan kanggo project kanggo nyiapake kanggo presentation ing konferensi.

Ing wektu kasebut, proyek kasebut wis entuk jeneng anyar BIRMA, entuk macem-macem kemampuan tambahan (ora ditindakake kanthi lengkap, nanging dianggep) - kabeh rincian bisa ditemokake ing laporanku.

Jujur, angel nelpon BIRMA 2013 sing lengkap; Terus terang, iki minangka kerajinan sing digawe kanthi cepet. Ing babagan kode, meh ora ana inovasi khusus, kajaba upaya sing ora bisa ditindakake kanggo nggawe sintaksis gabungan kanggo parser, kanthi katon kaya basa format IRBIS 64 (lan nyatane, uga sistem ISIS - kanthi kurung minangka struktur siklik; kok Ing wektu iku aku mikir katon apik banget). Parser tanpa ngarep-arep kesandhung ing bunderan kurung kasebut saka jinis sing cocog (amarga kurung uga nindakake peran liyane, yaiku, menehi tandha struktur opsional sajrone parsing sing bisa dilewati). Aku maneh nyaranake saben wong sing pengin kenalan karo sintaksis BIRMA sing angel dibayangake kanthi luwih rinci ing laporanku wektu iku.

Umumé, loro saka berjuang karo parser dhewe, Aku duwe apa-apa liyane kanggo ngomong bab kode versi iki - kajaba kanggo konversi mbalikke saka sumber ana menyang C ++ nalika ngreksa sawetara fitur khas saka kode NET ( jujur, iku angel mangertos , apa persis dijaluk kula kanggo mindhah kabeh bali - mbokmenawa sawetara wedi bodho kanggo njaga kode sumber sandi rahasia, kaya-kaya iku padha karo resep rahasia Coca-Cola).

Mbok menawa keputusan bodho iki uga dadi alesan kanggo kesulitan masangake perpustakaan DLL sing diasilake karo antarmuka sing ana saka workstation sing digawe ing omah kanggo nglebokake data menyang katalog elektronik (ya, aku ora nyebutake kasunyatan penting liyane: wiwit saiki, kabeh kode "mesin" BIRMA kaya samesthine, dipisahake saka bagean antarmuka lan dikemas ing DLL sing cocog). Napa sampeyan kudu nulis workstation sing kapisah kanggo tujuan kasebut, sing, ing tampilan lan cara interaksi karo pangguna, tanpa isin nyalin workstation sing padha "Catalogizer" saka sistem IRBIS 64 - iki minangka pitakonan sing kapisah. Singkat: menehi soliditas sing dibutuhake kanggo pangembangan proyek lulusanku (yen mesin parser sing ora bisa dicerna mung ora cukup). Kajaba iku, aku banjur nemokke sawetara kangelan ing ngleksanakake antarmuka saka workstation Cataloger karo modul dhewe, dipun ginakaken ing loro C ++ lan C #, lan langsung ngakses mesin sandi.

Umumé, cukup aneh, prototipe BIRMA.NET sing rada kikuk iki sing ditakdirake dadi "kuda kerja" sajrone patang taun sabanjure. Ora bisa dikandhakake yen sajrone wektu iki aku ora nyoba golek cara kanggo implementasine anyar sing luwih lengkap babagan ide sing wis suwe. Antarane inovasi liyane, mesthine wis ana urutan siklik sing bisa ngemot unsur opsional - iki kepiye carane aku bakal nggawe ide template universal kanggo deskripsi bibliografi babagan publikasi lan macem-macem perkara liyane sing menarik. Nanging, ing kegiatan praktis ing wektu iku, kabeh iki ing sethitik dikarepake, lan implementasine aku ing wektu iku cukup cukup kanggo ngetik daftar isi. Kajaba iku, arah pangembangan perpustakaan kita wiwit nyimpang luwih akeh menyang digitalisasi arsip museum, pelaporan lan kegiatan liyane sing kurang menarik kanggo aku, sing pungkasane meksa aku ninggalake, menehi dalan kanggo wong-wong sing bakal dadi luwih seneng karo kabeh iki.

Paradoks, sawise acara-acara dramatis kasebut, proyek BIRMA, sing ing wektu kasebut wis duwe kabeh ciri khas proyek konstruksi jangka panjang, katon wiwit urip anyar sing ditunggu-tunggu! Aku duwe luwih akeh wektu luang kanggo pikirane nganggur, aku maneh wiwit nyisir World Wide Web kanggo nggoleki sing padha (untung, saiki aku wis bisa guess kanggo nggoleki kabeh iki ora mung ing ngendi wae, nanging ing GitHub), lan nang endi wae ing Ing wiwitan taun iki, pungkasane aku nemokake produk sing cocog saka perusahaan Salesforce sing kondhang kanthi jeneng sing ora penting. Gorp. Dhewe, bisa nindakake meh kabeh sing dibutuhake saka mesin parser kasebut - yaiku, kanthi cerdas ngisolasi fragmen individu saka teks sing sewenang-wenang, nanging kanthi struktur sing jelas, nalika duwe antarmuka sing ramah pangguna kanggo pangguna pungkasan, kalebu esensi sing bisa dingerteni, kayata. pola, cithakan lan kedadean, lan ing wektu sing padha nggunakake sintaks menowo saka ekspresi reguler, kang dadi incomparably luwih bisa diwaca amarga divisi menyang grup semantik ditetepake kanggo parsing.

Umumé, aku mutusaké sing iki siji Gorp (Aku wonder apa tegese jeneng iki? Mbok sawetara jenis "parser biasa berorientasi umum"?) - persis apa aku wis looking for kanggo dangu. Bener, implementasine langsung kanggo kabutuhan dhewe duwe masalah sing mesin iki mbutuhake ketaatan banget kanggo urutan struktur teks sumber. Kanggo sawetara laporan kayata file log (yaiku, padha diselehake dening pangembang minangka conto sing jelas babagan nggunakake proyek kasebut), iki cukup cocok, nanging kanggo teks sing padha karo tabel isi sing dipindai, ora mungkin. Sawise kabeh, kaca sing padha karo tabel isi bisa diwiwiti kanthi tembung "Daftar Isi", "Isi" lan katrangan awal liyane sing ora perlu dilebokake ing asil analisis sing dituju (lan dipotong kanthi manual. saben wektu uga ora trep). Kajaba iku, ing antarane unsur mbaleni individu, kayata jeneng penulis, judhul lan nomer kaca, kaca bisa ngemot jumlah sampah tartamtu (contone, gambar, lan mung karakter acak), sing uga apik yen bisa dipotong. Nanging, aspek pungkasan durung dadi pinunjul, nanging amarga sing pisanan, implementasine sing wis ana ora bisa miwiti nggoleki struktur sing dibutuhake ing teks saka panggonan tartamtu, nanging mung ngolah saka awal, ora nemokake pola kasebut ana lan ... rampung sandi proyek. Temenan, sawetara tweaking dibutuhake kanggo paling ora ngidini sawetara papan ing antarane struktur sing bola-bali, lan aku bisa kerja maneh.

Masalah liyane yaiku proyek kasebut dhewe dileksanakake ing Jawa, lan yen aku ngrancang ing mangsa ngarep kanggo ngleksanakake sawetara cara interfacing teknologi iki karo aplikasi menowo kanggo ngetik data menyang database ana (kayata Irbis "Cataloguer"), banjur paling sethithik. nindakake iki ing C # lan .NET. Iku ora sing Jawa dhewe iku basa ala - Aku malah tau digunakake kanggo ngleksanakake aplikasi jendhela menarik sing dipun ginakaken fungsi kalkulator programmable domestik (minangka bagéan saka project mesthi). Lan ing syarat-syarat sintaks iku padha banget padha karo C-sharp. Inggih, iki mung plus: luwih gampang kanggo aku ngrampungake proyek sing wis ana. Nanging, aku ora pengin terjun maneh menyang jagad jendela (utawa luwih apik, desktop) teknologi Jawa - sawise kabeh, basa kasebut dhewe ora "dicocogake" kanggo panggunaan kasebut, lan aku ora pengin mbaleni maneh. pengalaman sadurunge. Mbok menawa amarga C # bebarengan karo WinForms luwih cedhak karo Delphi, sing akeh sing wis diwiwiti. Untunge, solusi sing dibutuhake ditemokake kanthi cepet - ing wangun proyek IKVM.NET, sing nggampangake nerjemahake program Jawa sing ana menyang kode .NET sing dikelola. Bener, proyek kasebut dhewe wis ditinggalake dening penulis ing wektu kasebut, nanging implementasine paling anyar ngidini aku bisa nindakake tumindak sing dibutuhake kanggo teks sumber. Gorp.

Dadi aku digawe kabeh owah-owahan perlu lan nglumpuk kabeh menyang DLL saka jinis cocok, kang bisa gampang "ngangkat munggah" dening proyek sembarang kanggo .NET Framework digawe ing Visual Studio. Ing sawetoro wektu, aku nggawe lapisan liyane kanggo presentation trep saka asil bali Gorp, ing wangun struktur data sing cocog sing bakal trep kanggo proses ing tampilan tabel (njupuk minangka basis loro larik lan kolom; loro tombol kamus lan indeks numerik). Ya, utilitas sing dibutuhake kanggo ngolah lan nampilake asil ditulis kanthi cepet.

Kajaba iku, proses adaptasi cithakan kanggo mesin anyar supaya bisa ngajari ngurai conto teks sing dipindai saka tabel isi ora nyebabake komplikasi khusus. Nyatane, aku ora kudu ngrujuk menyang template sadurunge: Aku mung nggawe kabeh template sing dibutuhake saka awal. Kajaba iku, yen cithakan sing dirancang kanggo nggarap versi sistem sadurunge nyetel kerangka sing cukup sempit kanggo teks sing bisa diurai kanthi bener kanthi bantuan, mesin anyar wis bisa nggawe template sing cukup universal sing cocog kanggo sawetara jinis markup. sapisan. Aku malah nyoba kanggo nulis sawetara jinis cithakan lengkap kanggo sembarang tabel isi teks sewenang-wenang, sanajan, mesthi, malah karo kabeh kemungkinan anyar mbukak kanggo kula, kalebu, ing tartamtu, kemampuan winates kanggo ngleksanakake padha nested urutan mbaleni ( kayata, contone, jeneng lan inisial sawetara penulis ing saurutan), iki dadi utopia.

Mbok menawa ing mangsa ngarep bakal bisa ngetrapake konsep meta-template tartamtu, sing bakal bisa mriksa teks sumber kanggo tundhuk karo sawetara template sing kasedhiya bebarengan, banjur, miturut asil sing dipikolehi, pilih sing paling cocok, nggunakake sawetara jenis algoritma cerdas. Nanging saiki aku luwih prihatin babagan pitakonan liyane. A parser kaya Gorp, Senadyan kabeh versatility lan modifikasi aku digawe, iku isih sipate ora bisa nindakake siji bab ketoke prasaja sing parser poto-ditulis bisa nindakake saka versi pisanan. Yaiku: dheweke nduweni kemampuan kanggo nemokake lan ngekstrak saka teks sumber kabeh fragmen sing cocog karo topeng sing ditemtokake ing cithakan sing digunakake ing panggonan sing bener, nanging ora kasengsem karo apa sing ana ing teks sing diwenehake ing spasi ing antarane fragmen kasebut. Nganti saiki, aku mung rada nambah mesin anyar, supaya bisa nggoleki kabeh repetisi anyar saka urutan topeng kasebut saka posisi saiki, ninggalake kemungkinan ana ing teks set karakter kasepakatan sing rampung. unaccounted kanggo ing parsing, terlampir antarane struktur mbaleni dideteksi. Nanging, iki ora bisa kanggo nyetel topeng sabanjuré preduli saka asil panelusuran fragmen sadurungé nggunakake topeng sing cocog: strictness saka struktur teks diterangake isih ora ninggalake kamar kanggo inklusi sembarang karakter ora duwe aturan baku.

Lan yen kanggo conto tabel isi sing aku nemoni masalah iki durung katon serius, mula nalika nyoba ngetrapake mekanisme parsing anyar kanggo tugas sing padha kanggo ngurai isi situs web (yaiku parsing sing padha), watesan kene padha katon karo kabeh obviousness sing. Sawise kabeh, cukup gampang kanggo nyetel topeng sing dibutuhake kanggo fragmen markup web, ing antarane data sing kita goleki (sing kudu diekstrak) kudu ditemokake, nanging kepiye carane bisa meksa parser supaya langsung pindhah menyang sabanjure. pecahan padha, senadyan kabeh tag bisa lan atribut HTML sing bisa diselehake ing spasi ing antarane?

Sawise mikir sethithik, aku mutusake kanggo ngenalake sawetara pola layanan (%all_before) и (%kabeh_sawise), nyedhiyakake tujuan sing jelas kanggo mesthekake yen kabeh sing ana ing teks sumber dilewati sadurunge pola (topeng) sing ana. Menapa malih, yen (%all_before) mung digatèkaké kabeh inklusi kasepakatan iki, banjur (%kabeh_sawise), Kosok baline, ngidini supaya ditambahake menyang fragmen sing dikarepake sawise pindhah saka fragmen sadurunge. Iku muni cukup prasaja, nanging kanggo ngleksanakake konsep iki aku kudu nyisir liwat sumber gorp maneh kanggo nggawe modifikasi perlu supaya ora break logika wis dipun ginakaken. Pungkasane, kita bisa nindakake iki (sanajan sing paling pisanan, sanajan akeh banget, implementasi parser saya ditulis, lan luwih cepet - sajrone sawetara minggu). Wiwit saiki, sistem kasebut dadi wujud universal - ora kurang saka 12 taun sawise upaya pisanan kanggo nindakake fungsi kasebut.

Mesthi, iki dudu pungkasan saka impen kita. Sampeyan uga bisa rampung nulis ulang parser template gorp ing C #, nggunakake sembarang perpustakaan kasedhiya kanggo ngleksanakake grammar free. Aku kode kudu Ngartekno simplified, lan iki bakal ngidini kita kanggo njaluk nyisihaken saka warisan ing wangun ana sumber Jawa. Nanging kanthi jinis mesin sing wis ana, sampeyan uga bisa nindakake macem-macem perkara sing menarik, kalebu nyoba ngleksanakake meta-templates sing wis dakcritakake, ora kanggo ngusir macem-macem data saka macem-macem situs web (Nanging, aku ora nolak. manawa piranti lunak khusus sing ana luwih cocog kanggo iki - aku durung duwe pengalaman sing cocog kanggo nggunakake).

Miturut cara, musim panas iki aku wis nampa undhangan liwat email saka perusahaan sing nggunakake teknologi Salesforce (pangembang asli Gorp), lulus wawancara kanggo karya sabanjure ing Riga. Sayange, ing wayahe aku ora siap kanggo redeployments kuwi.

Yen materi iki arouses sawetara kapentingan, banjur ing bagean kapindho aku bakal nyoba kanggo njlèntrèhaké luwih rinci teknologi kanggo compile lan banjur parsing template nggunakake conto saka implementasine digunakake ing Salesforce. Gorp (tambahanku dhewe, kajaba sawetara tembung fungsi sing wis diterangake, ora nggawe owah-owahan ing sintaksis cithakan dhewe, saengga meh kabeh dokumentasi kanggo sistem asline. Gorp Cocog kanggo versiku uga).

Source: www.habr.com

Add a comment