<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Technological Features of Cross-Language Migration from PHP to Python of Software Products Working with Intensive Data</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Barakhnin Vladimir</string-name>
          <email>bar@ict.nsc.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Kozhemyakina Olga</string-name>
          <email>olgakozhemyakina@mail.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Revun Artem</string-name>
          <email>pm@artemrevun.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Shashok Natalia</string-name>
          <email>n.shashok@g.nsu.ru</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Federal Research Center for Information and Computational Technologies</institution>
          ,
          <addr-line>Novosibirsk</addr-line>
          ,
          <country country="RU">Russia</country>
        </aff>
      </contrib-group>
      <fpage>411</fpage>
      <lpage>421</lpage>
      <abstract>
        <p>This article describes the methods of cross-language migration from the PHP programming language to the Python programming language on the example of modernization of the search module of the system for complex analysis of poetic texts. The choice of language was determined by the need of integration of the module in the system, and by the fact that Python has a large number of open libraries that make it possible to work with machine learning technologies, what is an advantage in the intensive data processing. The main problems of cross-language migration are considered and the methods to solve these problems are proposed. The proposed solutions concern the data security, the separation of module representation from the data model, the work with database via declarative mapping. In the process of cross-language migration, the search module was rewritten and all problems were solved, what allowed to integrate it into the information system for complex analysis of poetic texts.</p>
      </abstract>
      <kwd-group>
        <kwd>cross-language migration</kwd>
        <kwd>PHP</kwd>
        <kwd>Python</kwd>
        <kwd>intensive data</kwd>
        <kwd>text analysis information system</kwd>
        <kwd>natural language processing</kwd>
        <kwd>analysis of poetic texts</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>In the practice of the development of the information systems, there are a number of
problems associated with the need of the modernization of the source code of an
application that is already in active usage. This can be caused, for example, by the migration
of an information system into a new programming language. It is necessary to correctly
reproduce the work of all parts of the old code so that there is no noticeable difference
in the code execution time for the end user.</p>
      <p>This article describes the features of migration of a software product that works with
intensive data from the PHP programming language to Python.</p>
      <p>
        The Python programming language, together with the Flask framework, is used to
develop the applications in various scientific fields without any restrictions, for
example, the creation of the framework for Covid-19 diagnostics [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] or the improvement of
the user interface of the LHCb Software "control panel for nightly builds" [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. In
particular, the choice of language and framework for the improvement of the interface of
LHCb Software was not chosen by chance: the developers needed to provide the system
support and to have clear, readable code, as well as to use the tools which are already
used for developments earlier [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. Similarly, given that the other modules in the system
of complex analysis of poetic texts are written in Python, the cross-language migration
with the usage of the Flask framework can be carried out to modernize the search
module in the system.
      </p>
      <p>Let's describe the technology for solving this problem on the example of one of the
modules of the information system for the automated complex analysis of poetic texts.</p>
      <p>
        The data on poetic texts which are extracted in the process of their multilevel
analysis (phonetic, metro-rhythmic, strophic, lexical, etc. characteristics) in accordance with
the approach described in [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], refer to intensive data, since they are extracted directly
from the source texts, and are not obtained through the usage of hypothetical patterns
expected from the data, and are also planned to be placed in the public domain. In
addition, according to [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], our system refers to the systems which are working with
intensive data due to the constant expansion of the volume of accumulated data - both in
connection with the expansion of the range of analyzed poetic texts, and in connection
with the increase in the set of extracted characteristics.
      </p>
      <p>In accordance with the modern realities of the software development, there was a need
to modernize this module, which works with the corpuses of poetic texts of large
volume.</p>
      <p>To achieve this goal, the following tasks were set:
─ to investigate the correctness of the considered software;
─ to detect the problems that exist in the initial code;
─ to substantiate the choice between updating and rewriting of the code;
─ to substantiate the choice of the final programming language;
─ to define the architecture of the application;
─ to develop a new version of the software product.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Description of the Problem</title>
      <p>
        The purpose of the development of the information system for the automated complex
analysis of poetic texts [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], implemented at the FRC ICT, is to provide the philologists
with a tool for the analysis of large-volume text corpuses.
      </p>
      <p>The described information system (IS) is a complex of separate modules, each of
which is an independent software product that performs a specific task and, at the same
time, is integrated into the system.</p>
      <p>
        One of the modules of the system, which is responsible for processing of big data in
the database, was written using the PHP programming language, while the Bootstrap
framework was used to organize the user interface. The code provided the solution to
all given tasks, namely, the interaction with the database and the generation of the user
interface. PostgreSQL was chosen as the database management system. This relational
DBMS, although not traditional when it is used in conjunction with PHP, has the ability
to analyze the main linguistic objects (token/word/phrase/sentence/text), what is in
demand when processing text information [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
      </p>
      <p>However, the further development of the system is carried out in the more universal
programming language Python 3, what leads to the problem of the integration of the
modules written in PHP with the new modules.</p>
      <p>During the analysis of the initial code, the following problems were found:
─ the complexity of the code, which causes a lot of internal dependencies, what leads
to low scalability;
─ the inseparability of the visual representation of data and the data model;
─ critically low level of the security of IS.</p>
      <p>
        Thus, despite the fact that the modules written in PHP are functional, they need to
be improved: if the system is functioning, but it is difficult to maintain it or expand it,
then, according to general theoretical guidelines [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], it cannot be considered correct.
2.1
      </p>
      <sec id="sec-2-1">
        <title>Approaches to Improving the Initial Code</title>
        <p>There are two approaches to improving the initial code: the refactoring and the
complete rewriting.</p>
        <p>
          The refactoring is the improvement of the initial code without changing the result of
its execution [
          <xref ref-type="bibr" rid="ref9">9</xref>
          ]. The periodic refactoring can make it easier to understand how the
program works, and in some cases it helps to find the various errors, although the error
detection is not its main purpose. Thus, the refactoring leads to the optimization of the
previously written program, improves the quality of code readability, and allows to add
the new features. However, the refactoring is a very time-consuming process and can
take a long time.
        </p>
        <p>A complete rewriting of the code has the same effect as refactoring, but it is usually
used either when the adding of new functionality within the old concept is unnecessarily
time-consuming (for example, due to incompatible architectures), or when there is a
need of the migration to another programming language. In addition, a complete
rewriting carries the risk of adding the new errors that may not be obvious.</p>
        <p>Also, regardless of the chosen approach, it is necessary to test the resulting product
during the development process, what allows to find the errors in the operation of the
modernized code and to solve them quickly, without having to return to the problem
code after a while.</p>
        <p>To choose between two different approaches, it is necessary to analyze the initial
code of the application for problems and their severity. After that, it is possible to make
a conclusion about the need for refactoring or rewriting of the code.</p>
        <p>In addition, if there is a need to choose between different programming languages,
the differences between the application deployment in probable programming
languages should be determined.
2.2</p>
      </sec>
      <sec id="sec-2-2">
        <title>Analysis of the Inseparability of the Data Representation and Data</title>
      </sec>
      <sec id="sec-2-3">
        <title>Model from Each Other in the Initial Code</title>
        <p>Let's analyze the emerging problems in the initial code.</p>
        <p>The user interface of the module is written in HTML using the Bootstrap framework,
which includes CSS and the JavaScript programming language, while some of the
search fields contain dynamic parameters that the interface requests from the database
during the initialization.</p>
        <p>Let's consider the part of the code under discussion that is responsible for the
dynamic construction of the "Author" field. The program code presented below makes a
request to the database, and, returning the values, generates a field of the select type
using them, which is then displayed as a drop-down list of authors.
&lt;div class="form-group"&gt;
&lt;label class="col-sm-2 form-check-label"&gt;</p>
        <p>&lt;input type="checkbox" id='authorCheckBox'
name='authorCheckBox' class="form-check-input"
onclick='activateAuthorsFieid()'&gt;Автор&lt;/label&gt;</p>
        <p>&lt;select class="selectpicker" multiple id='authorsList'
name='authorsList[]' data-live-search="true"
data-max-options="10" data-actions-box="true" data-width="auto"
title="Ничего не выбрано..." data-size="5"&gt;
&lt;?php</p>
        <p>$select_authors = "SELECT \"LASTNAME\",
\"FIRSTNAME\", \"MIDDLENAME\" FROM \"AUTHOR\";";
$authors = pg_query($select_athors);
while ($authors_list =
pg_fetch_array($authors)) {</p>
        <p>
          $author_string = $authors_list[0]."
".mb_substr($authors_list[
          <xref ref-type="bibr" rid="ref1">1</xref>
          ], 0, 1, UTF8).".
".mb_substr($authors_list[
          <xref ref-type="bibr" rid="ref2">2</xref>
          ], 0, 1, UTF8).".";
        </p>
        <p>echo
'&lt;option&gt;'.$author_string.'&lt;/option&gt;';</p>
        <p>}
?&gt;
&lt;/select&gt;&lt;br&gt;&lt;small class="col-sm-6 form-text
textmuted"&gt;Выберите автора из списка или воспользуйтесь
поиском&lt;/small&gt;
&lt;/div&gt;</p>
        <p>This example shows that the work with the data is not separated from the formation
of the interface. In particular, if there is a need to call the same query in another part of
the system, for example, to further access to this data, it should be copied. Thus, the
procedural architecture shown in the example leads to code redundancy, and, as a result,
to the possible errors.
2.3</p>
      </sec>
      <sec id="sec-2-4">
        <title>Analysis of the Security Level of the Search Module</title>
        <p>Another problem concerns the analysis of the level of data protection.</p>
        <p>The analysis of the protection level of the search module for poetic texts consists of
the following actions:
─ the analysis of the initial code of the application;
─ the analysis of compiled SQL queries for the vulnerabilities such as SQL injection;
─ the implementation of an SQL injection attack.</p>
        <p>The SQL injection is an attack for which an attacker inserts the deleterious code into
the text of a database request, what makes it possible to execute an unauthorized
request. In this way, a hacker can get stored data or cause damage to the database.</p>
        <p>
          The main reasons for the possibility of SQL injection are the incorrect processing of
special characters and data types, as well as the dynamic query construction [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
        </p>
        <p>There are many ways to implement such attacks, as well as to protect against them.
One of the main methods of leveling and preventing the potential threats is to check the
correctness of the data which is entered from the client to the server. This method is
implemented through the special characters escaping, the strict data type conversion,
and the prepared or parameterized queries.</p>
        <p>However, during the analysis of the application source code, it was found that there
is no verification of the correctness of the entered data, requests are made dynamically,
and the data is transmitted to the DBMS in the form in which they were sent by the
user, without any processing of special characters or restrictions on data types.</p>
        <p>To confirm the presence of the vulnerability, the attack was made by injecting "1
OR 1=1", entered in the filter field by metrorhythmic statistics, regardless of the
selected metric. If the application works correctly, such a string must lead to no search
results for all metrics, but instead, the entire corpus of poetic texts available in the
database is displayed. Accordingly, the SQL injection attack is successful, and the user
may receive incorrect data.
2.4</p>
      </sec>
      <sec id="sec-2-5">
        <title>Differences between the Creation of Applications in PHP and</title>
      </sec>
      <sec id="sec-2-6">
        <title>Python</title>
        <p>
          Today, the Python programming language is more popular than the PHP programming
language. This is indicated by the TIOBE index, where Python ranks second and PHP
ranks ninth [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ]. The TIOBE index is calculated based on key queries in the most
popular search engines: Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube and Baidu.
It is also worth noting that the TIOBE index does not indicate the best of the
programming languages, but only reflects the activity of the global community that searches for
information on each programming language.
        </p>
        <p>Both languages offer a large number of frameworks for development, what allows
to achieve fast, secure and well-scalable applications. However, Python has a large
number of open libraries that let to work with machine learning technologies in a web
environment, what is an advantage when working with big data.</p>
        <p>
          Python is a language with strong implicit dynamic typing, and PHP is a language
with weak implicit dynamic typing. [
          <xref ref-type="bibr" rid="ref12">12</xref>
          ] Therefore, in the tasks where PHP allows to
mix the different data types in expressions, it's necessary to look for other solutions for
Python.
        </p>
        <p>
          Since Python is focused not only on Web development, for the interaction of a
Python program with a server, it is required to use the WSGI interaction standard [
          <xref ref-type="bibr" rid="ref13">13</xref>
          ],
unlike PHP, where such technologies are not necessary. This technology is an
intermediate link between the web server and the application, what allows to process the
information outside the application before sending it to the web server, what, in turn, can
significantly improve the efficiency of the client-server application.
        </p>
        <p>PHP was not created as a programming language and was originally a scripting
language embedded in html-pages, so the separation of data from the interface in PHP is a
non-trivial task. In turn, Python is a general-purpose programming language, so the
separation of data and interface is achieved by simple methods.
3</p>
      </sec>
    </sec>
    <sec id="sec-3">
      <title>Modernization of the Initial Code of the Discussed</title>
    </sec>
    <sec id="sec-4">
      <title>Software Product</title>
      <p>Taking into account the above, the decision about the rewriting of the module in Python
3 was made.</p>
      <p>The rewriting of the module separates the data model from the module
representation, and also allows to solve the scalability problem and to use the data model in other
tasks. The module retains its isolation, what improves the possibility of its usage in the
further development of the system.</p>
      <p>
        As the basis of the system, the Flask framework [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] was chosen, which, using
WSGI, provides simple interaction between the server and the application, has a
builtin html template engine for creating the user interface, allows to evaluate the efficiency
of the application using internal tools, is suitable for building an application that has
various modules, and is also the project with open initial code.
      </p>
      <p>
        The strong side of the Python language is the number of libraries and tools available
for it for both data processing and web programming, what distinguishes it from other
languages, such as PHP. The strong side of the Flask web framework can be called its
easiness, since it requires a small amount of code to get both a web application and a
simple web-API from the functions and modules which are written in Python. [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]
3.1
      </p>
      <sec id="sec-4-1">
        <title>Work of the Module with the Database</title>
        <p>
          The database that the described module works with is described in detail in the article
[
          <xref ref-type="bibr" rid="ref6">6</xref>
          ] and does not need any changes. The task when the module is being rewritten is to
combine the working database with the Python SQLAlchemy module, which uses the
ORM approach.
        </p>
        <p>
          Let's consider the ER diagram of the poems database [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ].
        </p>
        <p>By initializing all the entities which are presented in the diagram as data models in the
SQLAlchemy ORM, the universal tool for working with the database is get. This will
allow to use the data from the database not only for search, but also for other purposes
that may be required for the implementation of certain functions of the system.
3.2</p>
      </sec>
      <sec id="sec-4-2">
        <title>Declarative Mapping of a Procedural Database in the Concepts of</title>
        <p>the SQLAlchemy Object-oriented Paradigm used in the Flask</p>
      </sec>
      <sec id="sec-4-3">
        <title>Software Package</title>
        <p>
          Since the tables in the database already exist, the task is to declare each table as a class
in accordance with the SQLAlchemy syntax [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ]. A base class is created, from which
all classes created on the basis of the tables shown in the ER-diagram are inherited (see
Figure 1). Next, the attributes are defined for each class according to the attributes of
the corresponding table.
        </p>
        <p>The complexity of this declarative mapping is that for each author represented in the
database, a set of tables is created according to its unique identifier, where the identifier
serves as a postfix. In this case, the tables with the same structure store the data from
different authors. The description of each such table as a class separately from each
other is not an effective solution, because there is a code redundancy. It was decided to
create a function with a numeric parameter that returns a class object depending on the
specified parameter – the unique identifier of the author. This solution allows to avoid
a redundancy, since there is no need to add a description of a new class to the database
when a new table is being created, and it is possible to create the queries for each author
dynamically without the need to modify the initial code of the program.</p>
        <p>After declaring the classes, the tables can be used to display the information in the
user interface, as well as to search the tables by the specified parameters.
3.3</p>
      </sec>
      <sec id="sec-4-4">
        <title>User Interface Development</title>
        <p>Since the Flask software environment uses the Jinja2 template engine as a tool, the
interface templates should be prepared. All dynamic elements in the template use the
rules adopted in Jinja2, and the static part is designed to match all the rules for creating
the web documents.</p>
        <p>During the template design process, at the analysis of the previous version of the
interface, it was found that parts of the interface can be divided into separate templates.
The separate documents were created, representing various parts that are common to
most pages: the set of meta tags, two navigation panels (a general and for DB queries),
and the error panel. If necessary, these templates are embedded in other html
documents. In particular, the set of meta tags and the general navigation panel are embedded
in any html-documents, while the navigation panel for database queries is embedded in
the template for searching the database, the template for viewing saved user queries,
and the template for viewing all the works available in the database. In addition, the
pages for user registration and authorization were rewritten.
3.4</p>
      </sec>
      <sec id="sec-4-5">
        <title>Development of the Initial Code of Application</title>
        <p>The Flask software environment uses the concept of "blueprints" to create the various
components of the application. The blueprints are used to expand the application, and
they can also be applied to divide the code into logically related sets of operations.</p>
        <p>The operations in the described module can be divided into two sets: the functions
for working with the data of the corpus in the database and the functions for working
with the user's personal data. Based on this, the blueprints 'main' and 'auth' are written,
respectively.</p>
        <p>The blueprint “main” is a set of the following operations:
─ poems_list – the output of all the poetic texts available in the database;
─ index – the output of the main page of the interface;
─ search – the output of the form used to make a query in the database for data
sampling from the corpus;
─ search_result – the output of query results to the database;
─ save_search – the saving a specific DB query for the user;
─ saved_search – the output of all saved queries for the user.</p>
        <p>The blueprint "auth" combines the following operations:
─ signup_post – the creation of a user,
─ login_post – the authorization,
─ signup – the view of the user creation page,
─ login – the view of the authorization page,
─ signout – the exit application.</p>
        <p>The save_search and saved_search operations are only available for authorized
users, just like in the old version of the application. The difference is that when the code
was rewritten, the Flask Login library was used, which automates the process of
creating of a user session, and in the PHP version of the application, the session was created
manually. At the attempt to open the pages corresponding to these operations without
authorization, the user sees an error message and a request to log in.</p>
        <p>The search_result operation has been split into the separate functions, since the
processing of a user-filled form and the building of a query are different operations. The
function of the building of a query to the database is also divided into component parts,
depending on which part of a query is being built, since the determination of the
columns of the table from which the selection is made and the determination of the data
filtering parameters can also be understood as two different actions.
3.5</p>
      </sec>
      <sec id="sec-4-6">
        <title>Results</title>
        <p>The end result of cross-language migration of the application is a code which is
completely separate from the presentation of html pages, and which dynamically builds the
queries to the database depending on the parameters set by the user. The application
structure has been rebuilt (Figure 2).
4</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Conclusion</title>
      <p>The technological features of cross-language migration between PHP and Python were
identified on the base on the solved tasks.</p>
      <p>Compared to the PHP language, Python does not allow does not allow to embed the
code in html pages, so if there are similar pages in the project, it becomes necessary to
isolate the logic inherent in the embedded code. The setting up of the correct and secure
database queries is done in simpler ways than in PHP, where it may be non-trivial. The
Python scripts and the related frameworks may not be supported by default on the using
web server, and if there is no opportunity to use another web server, it is necessary to
make additional settings.</p>
      <p>There also may be the cases where the different data types are mixed in the initial
code of a PHP application and the implicit but valid conversions occur. In such
situations, when an analog of the application in Python is being written, it is necessary to
have a clear idea of what data is used in a particular situation, and to apply a secure data
type conversion. This imposes the certain limitations related to error processing: it is
necessary to convert all the data sent by the user.</p>
      <p>Acknowledgement. The study was carried with the support of the Russian Science
Foundation (project No. 19-18-00466).</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Palimote</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ebenezer</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Atu</surname>
            ,
            <given-names>L.</given-names>
          </string-name>
          :
          <article-title>A Framework for Diagnosis of Covid-19 Infection using Deep Learning Approach</article-title>
          .
          <source>International Journal of Computer</source>
          Applications in Technology,
          <volume>10</volume>
          (
          <issue>2</issue>
          ),
          <fpage>93</fpage>
          -
          <lpage>98</lpage>
          (
          <year>2021</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Clemencic</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Couturier</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kyriazi</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Improvements to the User Interface for LHCb's Software continuous integration system</article-title>
          .
          <source>Journal of Physics: Conference Series</source>
          ,
          <volume>664</volume>
          (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Clemencic</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Couturier</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          :
          <article-title>A New Nightly Build System for LHCb</article-title>
          .
          <source>Journal of Physics: Conference Series</source>
          ,
          <volume>513</volume>
          (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Steve</surname>
            <given-names>K.</given-names>
          </string-name>
          , et al:
          <article-title>Data-intensive Science: A New Paradigm for Biodiversity Studies</article-title>
          .
          <source>BioScience</source>
          ,
          <volume>59</volume>
          (
          <issue>7</issue>
          ),
          <fpage>613</fpage>
          -
          <lpage>620</lpage>
          (
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Michael</surname>
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Barbara</surname>
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Florian</surname>
            <given-names>A</given-names>
          </string-name>
          .:
          <article-title>On Testing Data-Intensive Software Systems</article-title>
          .
          <source>In: Security and Quality in Cyber-Physical Systems Engineering</source>
          , pp.
          <fpage>129</fpage>
          -
          <lpage>148</lpage>
          . Springer International Publishing,
          <string-name>
            <surname>Cham</surname>
          </string-name>
          (
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Barakhnin</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kozhemyakina</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Borzilova</surname>
          </string-name>
          , Yu.:
          <article-title>The Development of the Information System of the Representation of the Complex Analysis Results for the Poetic Texts</article-title>
          .
          <source>Vestnik NSU</source>
          , Series: Information Technologies,
          <volume>17</volume>
          (
          <issue>1</issue>
          ),
          <fpage>5</fpage>
          -
          <lpage>17</lpage>
          (
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Barakhnin</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kozhemyakina</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mukhamediev</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          , Borzilova,
          <string-name>
            <given-names>Yu.</given-names>
            ,
            <surname>Yakunin</surname>
          </string-name>
          ,
          <string-name>
            <surname>K.</surname>
          </string-name>
          :
          <article-title>The design of the structure of the software system for processing text document corpus</article-title>
          .
          <source>Business Informatics</source>
          ,
          <volume>13</volume>
          (
          <issue>4</issue>
          ),
          <fpage>60</fpage>
          -
          <lpage>72</lpage>
          (
          <year>2019</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Demeyer</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ducasse</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nierstrasz</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          :
          <article-title>Object-Oriented Reengineering Patterns. 1st edn</article-title>
          . Square Bracket Associates,
          <string-name>
            <surname>Switzerland</surname>
          </string-name>
          (
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Fowler</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          , et al.:
          <article-title>Refactoring: Improving the Design of Existing Code. 1st edn</article-title>
          . AddisonWesley, United
          <string-name>
            <surname>States</surname>
          </string-name>
          (
          <year>1999</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Sokolin</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Timokhovich</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Methods for Comprehensive Security of SQL Server Against SQL Injection Attacks</article-title>
          . Academy,
          <volume>3</volume>
          (
          <issue>19</issue>
          ),
          <fpage>7</fpage>
          -
          <lpage>9</lpage>
          (
          <year>2017</year>
          ).
          <article-title>(in Russian)</article-title>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11. TIOBE Index for May
          <year>2021</year>
          , https://www.tiobe.com/tiobe-index/,
          <source>last accessed 07 May</source>
          <year>2021</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Purer</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          :
          <article-title>PHP vs</article-title>
          .
          <article-title>Python vs. Ruby - The web scripting language shootout</article-title>
          . In: Vienna University of Technology, Institute of Computer Languages, Compilers and Languages Group,
          <volume>185</volume>
          .307 Seminar aus Programmiersprachen (
          <year>2009</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Smorodsky</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          :
          <article-title>Using the WSGI Standard When Developing Web Application in Python</article-title>
          . STUDNET,
          <volume>3</volume>
          (
          <issue>5</issue>
          ),
          <fpage>348</fpage>
          -
          <lpage>357</lpage>
          (
          <year>2020</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Flask</surname>
          </string-name>
          <article-title>Documentation (1.1</article-title>
          .x), https://flask.palletsprojects.
          <source>com/en/1</source>
          .1.x/index.html/,
          <source>last accessed 10 May</source>
          <year>2021</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Aslam</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mohammed</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Lokhande</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Efficient Way Of Web Development Using Python And Flask</article-title>
          .
          <source>International Journal of Advanced Research in Computer Science</source>
          ,
          <volume>6</volume>
          (
          <issue>2</issue>
          ),
          <fpage>54</fpage>
          -
          <lpage>57</lpage>
          (
          <year>2015</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16.
          <string-name>
            <surname>Barakhnin</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kozhemyakina</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Borzilova</surname>
          </string-name>
          , Yu.:
          <article-title>The SQL Queries Optimization on the Example for the Search Module of the System for Complex Analysis of Literary Texts</article-title>
          .
          <source>Cloud of Science</source>
          ,
          <volume>7</volume>
          (
          <issue>4</issue>
          ),
          <fpage>749</fpage>
          -
          <lpage>763</lpage>
          (
          <year>2020</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17. SQLAlchemy 1.4 Documentation, https://docs.sqlalchemy.org/en/14/, last accessed 10 May
          <year>2021</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>