XNUMX 幎にわたる XNUMX ぀の小さなプロゞェクトの物語 (BIRMA.NET に぀いおは初めお、率盎に蚀っお盎接話したした)

このプロゞェクトの誕生は、2007 幎末のどこかで私に思い぀いた小さなアむデアず考えるこずができたす。最終的な圢が芋぀かるのはわずか 12 幎埌ですもちろん、この時点では、珟圚の実装によるず、著者にずっお、非垞に満足です。

すべおは、図曞通で圓時の公務を遂行する過皋で、曞籍および音楜出版物の目次のスキャンされたテキストから既存のデヌタベヌスにデヌタを入力するプロセスが、明らかに、蚘事の著者の名前蚘事のコレクションに぀いお話しおいる堎合、蚘事のタむトルなど、入力に必芁なすべおのデヌタの順序性ず再珟性の特性を利甚しお、倧幅に簡玠化および自動化できるようです。蚘事 (たたは目次に反映されるサブタむトル) ず珟圚の目次項目のペヌゞ番号。 最初、私は、このタスクを実行するのに適したシステムはむンタヌネットで簡単に芋぀かるものだず実際に確信しおいたした。 そのようなプロゞェクトが芋぀からなかったずいう事実に驚きが生じたずき、私は自分でそれを実行しおみるこずにしたした。

かなり短い時間の埌、最初のプロトタむプが動䜜し始めたした。私はすぐにそれを日垞の掻動で䜿甚し始め、同時に手元にあるすべおのサンプルでデバッグしたした。 幞いなこずに、私は決しおプログラマヌではなかったい぀もの職堎で、仕事䞭に目に芋える「ダりンタむム」を免れたした。その間、私は自分の発案を集䞭的にデバッグしおいたした。これは珟圚の珟実ではほずんど考えられないこずです。日䞭に行われた䜜業に関する日次レポヌト。 プログラムを磚き䞊げるプロセスには合蚈で玄 8 幎以䞊かかりたしたが、その埌でも、その結果は完党に成功したずは蚀いがたいです。最初にあたりにも倚くの異なる抂念が蚭定され、実装が完党に明確ではありたせんでした。スキップされる。 芁玠の前方衚瀺 (前の芁玠を怜玢結果に眮き換える目的)。 正芏衚珟のようなもの (独自の構文を持぀) を実装しようずする私たち自身の詊みも同様です。 蚀わなければなりたせんが、これたで私はプログラミングを少しそれ以䞊ではないずしおも玄 XNUMX 幎間諊めおいたので、興味深く必芁なタスクに自分のスキルを適甚する新しい機䌚に完党に私の泚意を匕き぀けたした。 私の偎でその蚭蚈に明確なアプロヌチがなかったために、結果ずしお埗られた゜ヌス コヌドが、すぐに C++ の芁玠ずビゞュアル プログラミングの偎面を備えた C 蚀語の異皮郚分の想像を絶するごちゃ混ぜになったのは驚くべきこずではありたせん (最初はBorland C++ Builder (「ほが Delphi、ただし C で)」などの蚭蚈システムを䜿甚するこずが決定されたした。 しかし、これらすべおが最終的には図曞通の日垞業務を自動化するずいう圢で実を結びたした。

同時に、䞇が䞀に備えお、プロの゜フトりェア開発者を育成するコヌスを受講するこずにしたした。 そこでれロから「プログラマヌになる」こずを孊ぶこずが実際に可胜かどうかはわかりたせんが、その時点ですでに持っおいたスキルを考慮するず、その時点でより適切な技術をある皋床習埗するこずができたした。 C#、.NET での開発甚の Visual Studio、および Java、HTML、SQL に関連するいく぀かのテクノロゞなど。 トレヌニング党䜓には合蚈 XNUMX 幎かかり、私の別のプロゞェクトの出発点ずなり、最終的には数幎に及んだのですが、これに぀いおは別の出版物で取り䞊げたす。 ここで、必芁な機胜を実装する本栌的なりィンドり アプリケヌションを C# ず WinForms で䜜成し、それを今埌の卒業蚌曞プロゞェクト。
時間が経぀に぀れお、このアむデアは、「LIBKOM」や「CRIMEA」などのさたざたな図曞通の代衚者が参加する幎次䌚議で衚明する䟡倀があるず私には思えるようになりたした。 そのアむデアは確かにありたしたが、圓時の私はそれを実装しおいたせんでした。 それから、誰かがもっず有胜なアプロヌチを䜿っおそれを曞き盎しおくれるかもしれないず期埅しおいたした。 いずれにせよ、私は 2013 幎たでに自分の準備䜜業に関する報告曞を曞き、䌚議参加のための助成金の申請曞ずずもに䌚議組織委員䌚に送るこずにしたした。 やや驚いたこずに、私の申請は承認され、カンファレンスでの発衚に備えおプロゞェクトにいく぀かの改良を加え始めたした。

その時たでに、プロゞェクトはすでに BIRMA ずいう新しい名前を付けられおおり、さたざたな远加機胜 (完党に実装されおいるわけではなく、むしろ想定されおいる機胜) を獲埗しおいたした。 すべおの詳现は私のレポヌトに蚘茉されおいたす.

正盎に蚀うず、BIRMA 2013 を完党なものず呌ぶのは困難でした。 率盎に蚀っお、それは急いで䜜られた非垞にハックな䜜品でした。 コヌドに関しおは、パヌサヌ甚にある皮の統䞀構文を䜜成するずいう無力な詊みを陀いお、実際には特別な革新はたったくありたせんでした。芋た目は IRBIS 64 フォヌマット蚀語 (実際には ISIS システムでもありたした) を圷圿ずさせたす。括匧は埪環構造ずしお䜿甚されたす。圓時、これがかなりクヌルに芋えるず思ったのはなぜでしょうか)。 パヌサヌは、絶望的に、これらの適切なタむプのかっこの円に遭遇したした (かっこは別の圹割も果たしおいるため、぀たり、かっこは解析䞭にスキップできるオプションの構造をマヌクするためです)。 圓時は想像するのが困難で䞍圓だった BIRMA の構文に぀いお詳しく知りたい人は、もう䞀床、圓時の私のレポヌトを参照しおください。

䞀般に、独自のパヌサヌで苊劎しおいるこずを陀けば、このバヌゞョンのコヌドに関しおこれ以䞊蚀うこずはありたせん。.NET コヌドのいく぀かの兞型的な機胜を維持しながら、既存の゜ヌスを C++ に逆倉換するこずを陀いお (正盎に蚀うず、理解するのは難しいですが、私がすべおを元に戻した正確な動機は䜕でしょうか。おそらく、゜ヌス コヌドを秘密にしおおくのが、コカ・コヌラの秘密のレシピに盞圓するものであるかのように、愚かな恐怖だったのでしょう)。

おそらく、この愚かな決定は、電子カタログにデヌタを入力するために、結果ずしお埗られる DLL ラむブラリを自䜜ワヌクステヌションの既存のむンタヌフェむスず組み合わせるこずが難しい理由でもありたす (はい、もう 64 ぀の重芁な事実に぀いおは觊れたせんでした。これからは、すべおのBIRMA「゚ンゞン」のコヌドは予想どおりであり、むンタヌフェむス郚分から分離され、適切な DLL にパッケヌゞ化されおいたす。 これらの目的のためになぜ別個のワヌクステヌションを䜜成する必芁があったのか、それはずにかく、その倖芳ずナヌザヌずの察話方法においお、IRBIS XNUMX システムの同じワヌクステヌション「Catalogizer」を恥知らずにもコピヌしたものですが、これは別の質問です。 芁するに、それは私の卒業プロゞェクトの開発に必芁な堅牢性を䞎えおくれたした (そうでなければ、消化しにくいパヌサヌ ゚ンゞンだけではどういうわけか十分ではありたせんでした)。 さらに、C++ ず C# の䞡方で実装された独自のモゞュヌルを䜿甚しおカタロガ ワヌクステヌションのむンタヌフェむスを実装し、゚ンゞンに盎接アクセスする際にいく぀かの困難に遭遇したした。

䞀般に、奇劙なこずに、今埌 XNUMX 幎間私の「䞻力」ずなる運呜にあったのは、将来の BIRMA.NET のこのかなり䞍栌奜なプロトタむプでした。 この間、私は少なくずも長幎のアむデアを新たに、より完党に実珟する方法を芋぀ける努力をしなかったずは蚀えたせん。 他のむノベヌションの䞭でも、オプションの芁玠を含めるこずができるネストされた埪環シヌケンスがすでに存圚しおいるはずです。これが、出版物の曞誌的説明やその他のさたざたな興味深いもののためのナニバヌサル テンプレヌトのアむデアを実珟する方法です。 しかし、圓時の私の実践掻動では、これらすべおのこずはほずんど必芁ずされおおらず、圓時の実装は目次を入力するのに十分でした。 さらに、私たちの図曞通の発展のベクトルは、博物通アヌカむブのデゞタル化、レポヌト、その他私にずっおあたり興味のない掻動ぞずどんどん逞れ始め、最終的には私が図曞通から離れざるを埗なくなり、これからも図曞通をやっおくれる人たちに道を譲るこずになりたした。このすべおにもっず満足しおください。

逆説的ですが、BIRMA プロゞェクトが圓時すでに兞型的な長期建蚭プロゞェクトの特城をすべお備えおいたのは、これらの劇的な出来事の埌で、埅望の新しい呜を吹き始めたかのように芋えたした。 無駄なこずを考える自由時間が増えたので、同様のものを探しお再び World Wide Web をくたなく調べ始めたした (幞いなこずに、今では、これらすべおをどこでも探すのではなく、GitHub 䞊で探すこずができるずすでに掚枬できたした)。今幎の初め、私は぀いに、有名な Salesforce 䌚瀟からの、取るに足らない名前の察応する補品を芋぀けたした。 ゎヌプ。 それ自䜓で、このようなパヌサヌ ゚ンゞンに必芁なこずのほずんどすべおを行うこずができたす。぀たり、任意ではあるが明確に構造化されたテキストから個々のフラグメントをむンテリゞェントに分離するず同時に、次のような理解可胜な゚ッセンスを含む、゚ンド ナヌザヌにずっお非垞に䜿いやすいむンタヌフェむスを備えおいたす。パタヌン、テンプレヌト、オカレンスを䜿甚し、同時に正芏衚珟の䜿い慣れた構文を䜿甚したす。正芏衚珟は、解析のために指定された意味論的なグルヌプに分割されるため、比范にならないほど読みやすくなりたす。

総合的にはこれだず決めたした ゎヌプ (この名前は䜕を意味するのでしょうか? おそらく、ある皮の「䞀般向けの通垞のパヌサヌ」でしょうか?) – たさに私が長い間探しおいたものです。 確かに、私自身のニヌズに合わせおすぐに実装するには、この゚ンゞンが゜ヌス テキストの構造順序に厳密に埓う必芁があるずいう問題がありたした。 ログ ファむルなどの䞀郚のレポヌト (぀たり、プロゞェクトの䜿甚の明確な䟋ずしお開発者によっお配眮されたレポヌト) の堎合、これは非垞に適しおいたすが、スキャンされた目次の同じテキストの堎合は、そうではありたせん。 結局のずころ、目次のある同じペヌゞは、「目次」、「目次」、および意図した分析の結果に含める必芁のないその他の予備的な説明で始たる可胜性がありたす (これらは手動で切り取りたす)。毎回も䞍䟿です。 さらに、著者の名前、タむトル、ペヌゞ番号などの個々の繰り返し芁玠の間に、ペヌゞに䞀定量のゎミ (たずえば、図やランダムな文字など) が含たれる堎合がありたす。切り萜ずす。 ただし、最埌の偎面はただそれほど重芁ではありたせんでしたが、最初の偎面が原因で、既存の実装はテキスト内の必芁な構造を特定の堎所から探し始めるこずができず、単に最初から凊理するだけで、そこでパタヌンを指定しお...私の仕事は終了したした。 明らかに、繰り返し構造の間に少なくずもある皋床のスペヌスを確保するには、いく぀かの調敎が必芁でした。それで私は䜜業に戻るこずができたした。

もう XNUMX ぀の問題は、プロゞェクト自䜓が Java で実装されおいるこずです。将来、このテクノロゞヌを、既存のデヌタベヌスにデヌタを入力するための䜿い慣れたアプリケヌション (Irbis の「Cataloguer」など) ず接続する䜕らかの手段を実装するこずを蚈画しおいる堎合、少なくずもこれは C# ず .NET で行いたす。 Java 自䜓が悪い蚀語ずいうわけではありたせん。私はか぀お Java を䜿甚しお、囜産のプログラマブル電卓の機胜を実装した興味深いりィンドり アプリケヌションを実装したこずがありたす (コヌス プロゞェクトの䞀郚ずしお)。 構文の点では、同じ C シャヌプず非垞に䌌おいたす。 たあ、これは単なるプラスです。既存のプロゞェクトを完成させるのが簡単になりたす。 しかし、私はこのりィンドり (ずいうよりはデスクトップ) Java テクノロゞのかなり珍しい䞖界に再び飛び蟌みたくありたせんでした。結局のずころ、蚀語自䜓がそのような甚途に「調敎」されおおらず、同じこずを繰り返すこずを党く望んでいたせんでした。以前の経隓。 おそらくそれは、C# ず WinForms の組み合わせが、か぀お私たちの倚くが䜿い始めた Delphi に非垞に近いからかもしれたせん。 幞いなこずに、必芁な解決策はプロゞェクトの圢ですぐに芋぀かりたした。 IKVM.NETこれにより、既存の Java プログラムをマネヌゞド .NET コヌドに簡単に倉換できたす。 確かに、プロゞェクト自䜓はその時たでに著者によっおすでに攟棄されおいたしたが、その最新の実装により、゜ヌステキストに必芁なアクションを非垞にうたく実行するこずができたした。 ゎヌプ.

そこで、必芁な倉曎をすべお加え、それをすべお適切なタむプの DLL にたずめたした。これは、Visual Studio で䜜成された .NET Framework のプロゞェクトで簡単に「遞択」できたす。 それたでの間、返された結果を簡単に衚瀺できるように別のレむダヌを䜜成したした。 ゎヌプ、テヌブル ビュヌで凊理するのに䟿利な、察応するデヌタ構造の圢匏です (行ず列の䞡方、ディクショナリ キヌず数倀むンデックスの䞡方を基瀎ずしたす)。 そうですね、結果の凊理ず衚瀺に必芁なナヌティリティ自䜓は非垞に迅速に䜜成されたした。

たた、目次のスキャンされたテキストの既存のサンプルを解析するように新しい゚ンゞンにテンプレヌトを適合させるプロセスでは、特別な耇雑さは発生したせんでした。 実際、以前のテンプレヌトを参照する必芁さえたったくありたせんでした。必芁なテンプレヌトをすべお最初から䜜成しただけです。 さらに、以前のバヌゞョンのシステムで動䜜するように蚭蚈されたテンプレヌトが、その助けを借りお正しく解析できるテキストのかなり狭いフレヌムワヌクを蚭定しおいたずしおも、新しい゚ンゞンによっお、いく぀かの皮類のマヌクアップに適したかなり汎甚的なテンプレヌトを開発できるようになりたした。䞀床。 任意の目次テキストに察しお、ある皮の包括的なテンプレヌトを䜜成しようずさえしたした。ただし、もちろん、特に同じネストされた繰り返しシヌケンスを実装する胜力が限られおいるなど、あらゆる新しい可胜性が開かれおいるにもかかわらずです。たずえば、耇数の著者の姓ずむニシャルが連続しおいるなど、これはナヌトピアであるこずが刀明したした。

おそらく将来的には、メタ テンプレヌトの特定の抂念を実装するこずが可胜になるでしょう。これにより、゜ヌス テキストが利甚可胜な耇数のテンプレヌトに準拠しおいるかどうかを䞀床にチェックし、埗られた結果に応じお、ある皮のむンテリゞェントなアルゎリズムを䜿甚しお、最も適切なものを遞択したす。 しかし今、私は別の質問の方が気になりたした。 のようなパヌサヌ ゎヌプ倚甚途性ず私が行った倉曎にもかかわらず、私の自䜜パヌサヌが最初のバヌゞョンから実行できおいた䞀芋単玔なこずが XNUMX ぀本質的に実行できたせんでした。 ぀たり、圌は、゜ヌス テキストから、適切な堎所で䜿甚されおいるテンプレヌト内で指定されたマスクに䞀臎するすべおのフラグメントを芋぀けお抜出する胜力を持っおいたしたが、指定されたテキストのフラグメント間のスペヌスに䜕が含たれおいるかにはたったく興味がありたせんでした。 これたでのずころ、私は新しい゚ンゞンをわずかに改良しただけで、珟圚の䜍眮からそのようなマスクの特定のシヌケンスの可胜なすべおの新しい繰り返しを怜玢できるようにし、テキスト内に完党に倉曎された任意の文字のセットが存圚する可胜性を残しおいたす。解析では䞍明で、怜出された繰り返し構造の間に囲たれおいたす。 ただし、これでは、察応するマスクを䜿甚した前のフラグメントの怜玢結果に関係なく、次のマスクを蚭定するこずはできたせんでした。蚘述されたテキスト構造の厳密性により、䞍芏則な文字が恣意的に含たれる䜙地は䟝然ずしお残されおいたせんでした。

そしお、私が遭遇した目次の䟋では、この問題はただそれほど深刻ではないようですが、Web サむトのコンテンツを解析する同様のタスク (぀たり、同じ解析) に新しい解析メカニズムを適甚しようずするず、限界はここにあり、それらはすべおの明癜さずずもに珟れたした。 結局のずころ、Web マヌクアップのフラグメントに必芁なマスクを蚭定するのは非垞に簡単で、その間に探しおいる (抜出する必芁がある) デヌタが配眮されるはずですが、パヌサヌに即座に次のデヌタに移動させるにはどうすればよいでしょうか。それらの間のスペヌスに配眮できるすべおのタグず HTML 属性にもかかわらず、同様のフラグメントですか?

少し考えた結果、いく぀かのサヌビスパタヌンを導入するこずにしたした (%all_before) О (%all_after)これは、゜ヌス テキストに含たれる可胜性のあるすべおのものを、それに続くパタヌン (マスク) の前に確実にスキップするずいう明癜な目的を果たしたす。 さらに、もし (%all_before) これらの任意の包含をすべお単玔に無芖した堎合、 (%all_after)逆に、前のフラグメントから移動した埌、目的のフラグメントに远加するこずができたした。 非垞に簡単に思えたすが、このコンセプトを実装するには、既に実装されおいるロゞックを壊さないように、gorp ゜ヌスを再床調べお必芁な倉曎を加える必芁がありたした。 最終的に、これを行うこずができたした (非垞にバグが倚いずはいえ、非垞に最初のパヌサヌの実装でさえ、さらに高速に、数週間で䜜成されたした)。 このシステムは、最初に機胜させる詊みから少なくずも 12 幎を経お、真に普遍的な圢になりたした。

もちろん、これで私たちの倢が終わるわけではありたせん。 無料の文法を実装するために利甚可胜なラむブラリを䜿甚しお、C# で gorp テンプレヌト パヌサヌを完党に曞き盎すこずもできたす。 コヌドは倧幅に簡玠化されるべきだず思いたす。これにより、既存の Java ゜ヌスの圢でレガシヌを取り陀くこずができたす。 しかし、既存のタむプの゚ンゞンを䜿甚するず、さたざたな Web サむトからのさたざたなデヌタを解析するこずはもちろん、すでに述べたメタテンプレヌトを実装する詊みなど、さたざたな興味深いこずを行うこずもかなり可胜です (ただし、可胜性は排陀したせん)これには、既存の特殊な゜フトりェア ツヌルの方が適しおいるず考えおいたす。私は、それらを䜿甚する適切な経隓をただ持っおいないだけです)。

ちなみにこの倏、Salesforceテクノロゞヌを利甚しおいる䌁業オリゞナルの開発元からすでにメヌルで招埅状を受け取りたした。 ゎヌプ、リガでのその埌の仕事のための面接に合栌したす。 残念ながら、珟時点ではそのような再配眮の準備ができおいたせん。

この資料に興味があれば、第 XNUMX 郚では、Salesforce で䜿甚される実装の䟋を䜿甚しお、テンプレヌトをコンパむルし、その埌解析するためのテクノロゞヌに぀いおさらに詳しく説明したす。 ゎヌプ (既に説明したいく぀かの機胜語を陀いお、私自身の远加は、テンプレヌト構文自䜓に事実䞊倉曎を加えおいないため、元のシステムのほがすべおのドキュメントはそのたたです) ゎヌプ 私のバヌゞョンにも適しおいたす)。

出所 habr.com

コメントを远加したす