From fe78905b735a51fdf31d3badb6bc92b87f8d8182 Mon Sep 17 00:00:00 2001 From: Mart Lubbers Date: Mon, 24 Nov 2014 22:00:22 +0100 Subject: [PATCH] v0.3 --- thesis2/2.requirementsanddesign.tex | 50 +++++++++++++++++++++++++ thesis2/thesis.tex | 2 +- thesis2/version/mart_thesis_0.3.tar.gz | Bin 0 -> 13914 bytes 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 thesis2/version/mart_thesis_0.3.tar.gz diff --git a/thesis2/2.requirementsanddesign.tex b/thesis2/2.requirementsanddesign.tex index c6ee8f7..db8c35a 100644 --- a/thesis2/2.requirementsanddesign.tex +++ b/thesis2/2.requirementsanddesign.tex @@ -102,3 +102,53 @@ Together they make the following definitive requirements: \end{itemize} \section{Design} +\subsection{Frontend} +We explain the design of the frontend application through examples and use +cases. In this way we can explain certain design choices visually and more +specific. + +\subsection{Backend} +\subsubsection{Program description} +The backend consists of a main module and a set of libraries all written in +\textit{Python}\footnote{\url{https://www.python.org/}}. The main module can, +and is, be embedded in an apache +webserver\footnote{\url{https://httpd.apache.org/}} via the +\textit{mod\_python} apache module\footnote{\url{http://modpython.org/}}. The +module \textit{mod\_python} allows the webserver to execute \textit{Python} +code in the webserver. We chose Python because of the rich set of standard +libraries and solid cross platform capabilities. We chose Python 2 because it +is still the default Python version on all major operating systems and stays +supported until at least the year 2020 meaning that the program can function +safe at least 5 full years. The application consists of a main Python module +that is embedded in the webserver. Finally there are some libraries and there +is a standalone program that does the periodic crawling. + +\subsubsection{Main module} +The main module is the program that deals with the requests, controls the +fronted, converts the data to patterns and sends it to the crawler. The +module serves the frontend in a modular fashion. For example the buttons and +colors can be easily edited by a non programmer by just changing some values in +a text file. In this way even when conventions change the program can still +function without intervention of a programmer that needs to adapt the source. + +\subsubsection{Libraries} +The libraries are called by the main program and take care of all the hard +work. Basically the libaries are a group of python scripts that for example +minimize the graphs, transform the user data into machine readable data, export +the crawled data to XML and much more. + +\subsubsection{Standalone crawler} +The crawler is a program that is used by the main module and technically is +part of the libraries. The thing the crawler stands out is the fact that it +also can run on its own. The crawler has to be runned periodically by a server +to really crawl the websites. The main module communicates with the crawler +when it needs XML data, when a new crawler is added or when data is edited. The +crawler also offers a command line interface that has the same functionality as +the web interface of the control center. + +The crawler saves all the data in a database. The database is a simple +dictionary where all the entries are hashed so that the crawler knows which +ones are already present in the database and which ones are new so that it +does not have to process all the old entries when they appear in the feed. The +crawler also has a function to export the database to XML format. The XML +format is specified in an XSD file for minimal ambiguity. diff --git a/thesis2/thesis.tex b/thesis2/thesis.tex index 87c0adb..e58c326 100644 --- a/thesis2/thesis.tex +++ b/thesis2/thesis.tex @@ -1,4 +1,4 @@ -\documentclass{book} +\documentclass[a4paper]{book} \usepackage[british]{babel} diff --git a/thesis2/version/mart_thesis_0.3.tar.gz b/thesis2/version/mart_thesis_0.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..772c085ce23db4d2297f242a46cc1fe2e15a0db5 GIT binary patch literal 13914 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 literal 0 HcmV?d00001 -- 2.20.1