<!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>Extracting and comparing variables on Java source code</article-title>
      </title-group>
      <contrib-group>
        <aff id="aff0">
          <label>0</label>
          <institution>Mirko Raimondo Aiello, Andrea Caruso Department of Mathematics and Informatics University of Catania Catania</institution>
          ,
          <country country="IT">Italy</country>
        </aff>
      </contrib-group>
      <fpage>86</fpage>
      <lpage>90</lpage>
      <abstract>
        <p>-We have realised a Java source code analyser that firstly extracts code from a repository and then analyses the code to gain some knowledge. In particular, for each method of each class the internal variables used are automatically determined. For Java classes, we find method bodies and variable declarations by using regular expressions. The tool has been developed by means of Java and MrJob. Python with the MapReduce model have been used to perform data analysis in a distributed manner.</p>
      </abstract>
      <kwd-group>
        <kwd>Parallelization</kwd>
        <kwd>Java</kwd>
        <kwd>Python</kwd>
        <kwd>MapReduce</kwd>
        <kwd>algorithms</kwd>
        <kwd>data dependence</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        We have developed a system that analyses different versions
of a software system, which is automatically extracted from
a git hub repository [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ]. Essentially, given two versions
of a Java class, we gather: the name of the classes, method
names within classes, the number of starting and ending lines
of methods and variables used by the methods.
      </p>
      <p>The analysis is performed by two different tools. The first
tool, developed in Java, takes as input the source code and get
classes, methods and variables. The second tool, developed
in Python, analyses the output of the first tool and gets
the variables within each method. To mine the data from a
set of Java classes, we use regular expressions, a sequence
of characters that define a search pattern, mainly used in
pattern matching with strings, or string matching, i.e. “find
and replace”-like operations.</p>
      <p>
        Since the said computation can become expensive with the
increasing quantity of code to analyse, the second tool can be
executed in a distributed manner using Hadoop, an Apache
framework providing the MapReduce model, for providing
support to distributed systems accessing big data [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ],
[
        <xref ref-type="bibr" rid="ref18">18</xref>
        ]. Of course distribution depends on the underlying
infrastructure and configuration, for which other support may be
needed [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ], [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. To use all the advantages of the
Python language, we adopt the MrJob toolkit that helps to
develop Hadoop programs and test them locally [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ].
      </p>
      <p>Finally, the data obtained from the computation are saved
to a .csv file into the output directory, and can be read using
tools like CSV Viewer. Both the first and second tool will
be subject to evaluation tests, to calculate execution time and
obtain some results from a chosen Java repository.</p>
      <p>Copyright c 2017 held by the authors.</p>
      <p>
        The proposed analysis can be valuable when examining
existing code in view of refactoring opportunities [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ], [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ],
[
        <xref ref-type="bibr" rid="ref16">16</xref>
        ]. Moreover, it is often necessary for developers to find
essential characteristics and metrics which give a view on
the internal characteristics, such as design patterns used [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ],
[
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], or performance related and dependence issues [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ].
This is even valuable for the problem of validating software
systems [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ].
      </p>
      <p>The following of this paper firstly describes the problem
at hand, then describes the proposed solution in detail, then
results are shown, and finally conclusions are drawn.</p>
    </sec>
    <sec id="sec-2">
      <title>II. REQUIREMENTS ANALYSIS</title>
      <p>Requirements analysis in systems engineering and software
engineering encompasses tasks that determine the needs or
conditions to meet for the product. As said previously, the
entire software product is divided in two tools, for each the
following requirements have been identified.</p>
      <p>Analysis of Java source code: the first tool will be able
to analyse Java source codes, obtaining the desired data,
i.e. the names of classes, methods within the classes, the
number of start and end line of each method, and the
variables used by such methods. The results are stored in
appropriate data structures.</p>
      <p>Reading and writing information into files: the second
tool will be able to read .txt files placed in a specific
directory. These files contain the bodies of methods
previously extracted. The extracted data will be placed
in .csv and .txt files. In particular, the overall structure of
the examined Java files will be placed in a .csv file, while
the bodies of the identified methods will be included in
a .txt file.</p>
      <p>Extract variables: the second tool will be able to extract
the names and types of the variables used by each method,
by using the MapReduce paradigm. The variables will be
associated with the method that uses them.</p>
      <p>Comparison of files: the second tool should analyze the
variables that are used within methods, with the purpose
of tracking changes between two different versions of the
same method. The difference will be performed in both
directions, i.e. by identifying variables that can be within
the first version of the method and not in the other version
and vice versa.</p>
    </sec>
    <sec id="sec-3">
      <title>III. PROPOSED APPROACH</title>
      <p>The development of the proposed tools involved different
programming languages combined together in a pipeline with
a bash script. For the Tool 1, used for the pre-processing, we
used Java. For the Tool 2, that computes the differences, we
used Python with MrJob toolkit. Figure 1 shows a general
overview of the developed components.</p>
      <p>All the algorithms of the said tools described here are valid
for an arbitrary number of Java classes. However, to make it
easier to understand the algorithms used in this project, all the
examples and the related images refer to the analysis of the
Java files in Figure 2 and Figure 3.</p>
      <p>The analysis of the class code has been performed by a
ParseText class taking as parameters: (i) an input string holding
the code of the class under analysis, and (ii) a string that
represents the output folder.</p>
      <p>The source code of the class under analysis is read line by
line, and regular expressions (regex) are used on each line to
identify the signature of the methods, and the respective row in
which they occur. Since the lines of code holding method
signatures can have different forms (e.g. the constructor does not
have a return type), then there will be more regex, contained
in a list (classRegexList). By knowing all the starting lines
of code for methods, it is possible to extract the ending lines
of the methods by simply calculating the differences between
the start line of the i-th method and the beginning of the next
method.</p>
      <p>Once these two pieces of information have been obtained,
we can analyse the method body. Obviously, the code will
check that the structure of the method is compliant with the
Java specifications. The next step uses regular expressions
again, and by manipulating strings (by means of replace,
replaceAll, trim) extracts the class name, the signature and
the method body.</p>
      <p>The output generated by the first tool consists of a number
of files in two categories.</p>
      <p>A group of txt files, one for each method found on
the analysed code, containing the name of the reference
class, the start and the end line of the method within the
class, and the method body. A sample output is shown in
Figure 7.</p>
      <p>A cmList.csv file containing the list of the identified
methods, variables, starting and ending lines as shown
in Figure 8.</p>
      <p>The initial step of the second Tool is to scan the directory
in which the first Tool created the .txt files containing the
methods bodies. When Tool 2 identifies the files, it stores the
filenames in a list called “names”. Furthermore, the number
of files taken as input is stored in the variable “n methods”.</p>
      <p>Afterwards, the previously listed files are opened. The
ClassFind job is launched on each of them using the run()
command.</p>
      <p>The MapReduce job consists of two main steps. The first
step consists of a map function and a reduce function, with the
goal to detect variables and insert them into pairs
“methodName, [variablesList]”. The second step consists in a further
reduce function that has as the goal to calculate variables
differences between the examined methods.</p>
      <p>The mapper detects the presence of variables by means
of regular expressions. Each regular expression identifies a
particular sequence of characters to search for in the text.</p>
      <p>The first reducer receives pairs “methodName,
variableName” detected by the mapper and groups them according
to the “methodName” key, forming “methodName,
[variablesList]” pairs.</p>
      <p>The second reducer is more complex than the previous. It
takes as input the identification key of the current method
and the list of variables associated with it. Variables are read
by using the “next” command and stored in the “variables”
string, then used for printing the “variables.txt” file, which
will contain pairs “methodName, [variablesList]”. The dict
type (key-value dictionary) structure “variables list” is used
to store “methodName, [variablesList]” pairs. The variable
“count” is a counter incremented whenever the MapReduce
process has been executed on a method. When it reaches
the value “n metodi”, then all methods have been processed,
and the used variables have been identified and stored in
“variables list”. Now differences can be easily computed.</p>
      <p>Leveraging the “itertools” library, it is possible to calculate
all combinations of pairs of methods, so as to compare
each method with all the others, which is the task of the
“combinations” function.</p>
      <p>The calculation of the differences is managed by Counter
type structures, which allow to take into account the presence
of variables with the same name. Let us suppose, for example,
that a method has 2 i named variables, and the second method
has only one, the difference between the first and the second
method will result in one i variable.</p>
      <p>The difference is performed in the same way also in
the opposite direction. Then, for each pair of methods, two
differences are generated. Different prints for various output
files are managed along the entire process. Finally, the various
strings that contain the results are written on ad-hoc files.</p>
      <p>The variables-finding function of the Tool 2 has been
implemented as a variant of Tool 1, hence both tools detect
methods variables and associate them to the respective
methods. Nevertheless, the two tools achieve this goal in different
ways. Tool 1 uses a classical sequential approach without
employing the MapReduce paradigm, whereas Tool 2 uses
Python and MrJob as described in this section.</p>
      <p>The Tool 2 generates four output files.</p>
      <p>output.txt: created by redirecting the standard output, it is
a file containing, for each pair of analysed methods, the
name of the method, the set of variables of each method
and the two differences between the sets of variables. The
output is shown in Figure 16.
variables.txt: contains the list of the identified methods
and their variables, as shown in Figure 17.
differences.txt: shows the differences between the sets of
variables only, as shown in Figure 18.
time.txt: contains a string giving the time in seconds spent
to search all the methods variables, as shown in Figure 19.</p>
    </sec>
    <sec id="sec-4">
      <title>VI. RESULTS AND TIMING ANALYSIS</title>
      <p>The configuration used for the test is the following.</p>
      <p>LAPTOP: ASUS A56C
CPU: Intel (R) Core (TM) i7-3537U @ 2.00GHz
RAM: 4.00 GB
OS type: 64-bit
OS: Linux Ubuntu 16.04 LTS</p>
      <p>The two tools show similar results from a reliability
standpoint. Both seek the variables by means of regular expressions
using the same approach. All internal variables of methods of
the code under analysis are detected successfully.</p>
      <p>Extraction times for finding the internal variables of the
methods (and inclusion in key-value lists, in the case of Tool
2) were compared. Execution times are listed in Table I.</p>
      <p>Number of files
2
3
4
5
6
6
8
9
10</p>
      <p>Tool 1 (Java)
0.004s
0.006s
0.007s
0.009s
0.011s
0.012s
0.013s
0.013s
0.014s</p>
      <p>TABLE I
ANALYSED EXECUTION TIME STATS.</p>
      <p>Tool 2 (Python)
0.001s
0.002s
0.002s
0.003s
0.004s
0.005s
0.006s
0.007s
0.009s</p>
      <p>
        Both tools show linear progression for the measured
timings, increasing with the number of methods for which
variables are extracted. In general, the Tool 2 is quicker than the
Tool 1. The performance results are summarised in the graph
of Figure 20 (by using gnuplot [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ]).
      </p>
    </sec>
    <sec id="sec-5">
      <title>VII. CONCLUSIONS</title>
      <p>This paper described a pair of tools that analyses Java
source code and extract from them some relevant statistics,
such as method’s names, signatures, starting and ending lines
and variables within methods. The tools have been developed
in Java and Python and a comparison of the results in terms
of execution time has been shown.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <surname>Github</surname>
          </string-name>
          . https://github.com.
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          <source>[2] Mrjob v0.5</source>
          .3. http://pythonhosted.org/mrjob.
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>F.</given-names>
            <surname>Banno`</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Marletta</surname>
          </string-name>
          , G. Pappalardo, and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>Tackling consistency issues for runtime updating distributed systems</article-title>
          .
          <source>In Proceedings of IEEE International Symposium on Parallel &amp; Distributed Processing, Workshops and Phd Forum (IPDPSW)</source>
          , pages
          <fpage>1</fpage>
          -
          <lpage>8</lpage>
          , Atlanta,
          <string-name>
            <surname>GA</surname>
          </string-name>
          ,
          <year>April 2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>G.</given-names>
            <surname>Borowik</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Wozniak</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Fornaia</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , G. Pappalardo, and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>A software architecture assisting workflow executions on cloud resources</article-title>
          .
          <source>International Journal of Electronics and Telecommunications</source>
          ,
          <volume>61</volume>
          :
          <fpage>17</fpage>
          -
          <lpage>23</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>A.</given-names>
            <surname>Calvagna</surname>
          </string-name>
          and
          <string-name>
            <surname>E. Tramontana.</surname>
          </string-name>
          <article-title>Automated conformance testing of Java virtual machines</article-title>
          .
          <source>In Proceedings of Complex, Intelligent and Software Intensive Systems (CISIS)</source>
          . IEEE,
          <year>July 2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>A.</given-names>
            <surname>Calvagna</surname>
          </string-name>
          and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>Delivering dependable reusable components by expressing and enforcing design decisions</article-title>
          .
          <source>In Proceedings Of Compsac</source>
          , pages
          <fpage>493</fpage>
          -
          <lpage>498</lpage>
          , Kyoto, Japan,
          <year>2013</year>
          . IEEE.
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>S.</given-names>
            <surname>Cicciarella</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>Searching design patterns fast by using tree traversals</article-title>
          .
          <source>International Journal of Electronics and Telecommunications</source>
          ,
          <volume>61</volume>
          (
          <issue>4</issue>
          ):
          <fpage>321</fpage>
          -
          <lpage>326</lpage>
          ,
          <year>2015</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>J.</given-names>
            <surname>Dean</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Ghemawat</surname>
          </string-name>
          .
          <article-title>Mapreduce: simplified data processing on large clusters</article-title>
          .
          <source>Communications of the ACM</source>
          ,
          <volume>51</volume>
          (
          <issue>1</issue>
          ):
          <fpage>107</fpage>
          -
          <lpage>113</lpage>
          ,
          <year>2008</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Beck</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Brant</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Opdyke</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Roberts</surname>
          </string-name>
          .
          <article-title>Refactoring: Improving the Design of Existing Code</article-title>
          . Addison-Wesley,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>R.</given-names>
            <surname>Giunta</surname>
          </string-name>
          , G. Pappalardo, and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>Superimposing roles for design patterns into application classes by means of aspects</article-title>
          .
          <source>In Proceedings Of ACM Symposium on Applied Computing (SAC)</source>
          , pages
          <fpage>1866</fpage>
          -
          <lpage>1868</lpage>
          ,
          <string-name>
            <given-names>Riva</given-names>
            <surname>Del Garda</surname>
          </string-name>
          (Trento),
          <source>Italy, March</source>
          <volume>26</volume>
          -30
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>J.</given-names>
            <surname>Loeliger</surname>
          </string-name>
          and
          <string-name>
            <given-names>M.</given-names>
            <surname>McCullough. Version</surname>
          </string-name>
          <article-title>Control with Git: Powerful tools and techniques for collaborative software development.</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          , Inc.,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bonanno</surname>
          </string-name>
          , and
          <string-name>
            <given-names>G.</given-names>
            <surname>Capizzi</surname>
          </string-name>
          .
          <article-title>Exploiting solar wind time series correlation with magnetospheric response by using an hybrid neurowavelet approach</article-title>
          .
          <source>Proceedings of the International Astronomical Union</source>
          ,
          <volume>6</volume>
          (
          <issue>S274</issue>
          ):
          <fpage>156</fpage>
          -
          <lpage>158</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Bonanno</surname>
          </string-name>
          , and
          <string-name>
            <surname>G. Capizzi.</surname>
          </string-name>
          <article-title>An hybrid neuro-wavelet approach for long-term prediction of solar wind</article-title>
          .
          <source>Proceedings of the International Astronomical Union</source>
          ,
          <volume>6</volume>
          (
          <issue>S274</issue>
          ):
          <fpage>153</fpage>
          -
          <lpage>155</lpage>
          ,
          <year>2010</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>C.</given-names>
            <surname>Napoli</surname>
          </string-name>
          , E. Tramontana, and
          <string-name>
            <given-names>G.</given-names>
            <surname>Verga</surname>
          </string-name>
          .
          <article-title>Extracting location names from unstructured italian texts using grammar rules and mapreduce</article-title>
          .
          <source>In Proceedings Of the International Conference on Information and Software Technologies (ICIST)</source>
          , volume
          <volume>639</volume>
          , pages
          <fpage>593</fpage>
          -
          <lpage>601</lpage>
          , Druskininkai, Lithuania, October
          <volume>13</volume>
          -15
          <year>2016</year>
          . Springer.
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>G.</given-names>
            <surname>Pappalardo</surname>
          </string-name>
          and
          <string-name>
            <given-names>E.</given-names>
            <surname>Tramontana</surname>
          </string-name>
          .
          <article-title>Automatically discovering design patterns and assessing concern separations for applications</article-title>
          .
          <source>In Proceedings Of ACM Symposium On Applied Computing (SAC)</source>
          , pages
          <fpage>1591</fpage>
          -
          <lpage>1596</lpage>
          , Dijon, Francia,
          <fpage>23</fpage>
          -
          <lpage>27</lpage>
          Aprile
          <year>2006</year>
          . ACM.
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Chatzigeorgiou</surname>
          </string-name>
          , G. Stephanides, and
          <string-name>
            <given-names>S. T.</given-names>
            <surname>Halkidis</surname>
          </string-name>
          .
          <article-title>Design pattern detection using similarity scoring</article-title>
          .
          <source>Software Engineering</source>
          , IEEE Transactions on,
          <volume>32</volume>
          (
          <issue>11</issue>
          ):
          <fpage>896</fpage>
          -
          <lpage>909</lpage>
          ,
          <year>2006</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>H.</given-names>
            <surname>Washizaki</surname>
          </string-name>
          and
          <string-name>
            <given-names>Y.</given-names>
            <surname>Fukazawa</surname>
          </string-name>
          .
          <article-title>Dynamic hierarchical undo facility in a fine-grained component environment</article-title>
          .
          <source>In Proceedings of International Conference on Tools Pacific: Objects for internet, mobile and embedded applications</source>
          , pages
          <fpage>191</fpage>
          -
          <lpage>199</lpage>
          . Australian Computer Society, Inc.,
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>T.</given-names>
            <surname>White</surname>
          </string-name>
          .
          <article-title>Hadoop: The definitive guide.</article-title>
          <string-name>
            <surname>O'Reilly Media</surname>
          </string-name>
          , Inc.,
          <year>2012</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19]
          <string-name>
            <given-names>T.</given-names>
            <surname>Williams</surname>
          </string-name>
          and
          <string-name>
            <given-names>L.</given-names>
            <surname>Hecking</surname>
          </string-name>
          . Gnuplot,
          <year>2003</year>
          .
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>