diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index d6471a3..0000000 --- a/.browserslistrc +++ /dev/null @@ -1,2 +0,0 @@ -> 1% -last 2 versions diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 9d08a1a..0000000 --- a/.editorconfig +++ /dev/null @@ -1,9 +0,0 @@ -root = true - -[*] -charset = utf-8 -indent_style = space -indent_size = 2 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 2b4dd40..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,29 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - jest: true - }, - 'extends': [ - 'plugin:vue/essential', - 'eslint:recommended' - ], - rules: { - 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' - }, - parserOptions: { - parser: 'babel-eslint' - }, - overrides: [ - { - files: [ - '**/__tests__/*.{j,t}s?(x)', - '**/tests/unit/**/*.test.{j,t}s?(x)', - ], - env: { - jest: true - } - } - ] -} diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 0a154b5..0000000 --- a/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -.DS_Store -node_modules/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln - -# my edits -old/ -old -*.psd -index_old.html -TODO.txt diff --git a/404.html b/404.html new file mode 100644 index 0000000..f6e02e2 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +
I am a UX Designer with 6 years of experience in building digital products. I am always eager to learn new things and to educate my team on cool new methods I found. I love to code small projects (such as this website) in my free time and also enjoy to drill into data (e.g. google analytics) to gain user insights. Even though I have very broad interests, my passion belongs to tailoring digital products to user needs.
\nThere will always be more to do than you have time for. Prioritization makes sure that you will have the maximum impact for the limited resources you are provided.
\nYou can learn faster what works and what does not which is crucial in fast moving environments.
\nEveryone makes mistakes and to acknowledge them means to grow in your role and as a person.
\nCurrently, I am working as a Senior IT Consultant for MaibornWolff.
\n
I designed an interface where users can input multiple \"code snippets\" to transform their data.
\n\t\t\tA project I worked on for KNIME was to create an interface for a node (KNIME term for encapsulated functionality) where users can create small code snippets to manipulate data. For example, users might want to create a column with the mean of three other columns or cut the surname of a \"name surname\" formatted column. Previously, this was possible with a String Manipulation node for Strings, a Math Formula node for numerical data and a Rule Engine node for conditions. But what if you needed to alter Strings based on conditions? Then it gets complicated. The new node should make it easier for users to create more complex logic.
\n\t\t\tI analyzed the current UI and interaction of the already existing nodes and found out that they had several disadvantages:
\n\t\t\tI improved on these with a design that put the code textfield with a large amount of space in the center of attention. Adding columns, variables and functions was now one click away but this saved precious screen real estate. I also added a small \"evaluate\" functionality that would check your code on the first row of your data so you could iteratively improve your code snippet without having to run it on your entire data each time. On the top an overview of all the code snippets was presented and you could add more code snippets or alter existing ones. The UI for the code editor was designed to make it reusable in other nodes (e.g. filtering rows according to a code snippet with a boolean statement).
\n\t\t\tThe overall reception was positive. Forum users as well as colleagues gave very enthusiastic feedback on the new functionality. One user even wrote a blogpost about the node calling it \"The Swiss Army Knife\".
\n\t\t\tIn the design, however, there is - as always - still room for improvement. The emancipated display of the upper \"overview\" and the lower \"code editor\" component does not make it entirely clear that a selection of a code snippet in the \"overview\" component would change the display in the \"code editor\" component. This drawback was however favored over a dialog-in-a-dialog design.
\n\t\t\tAlso, the design could guide new users better on how to start. They are presented with a blank textfield and a variety of UI components (much like opening a terminal for the first time). The functions which are the core of writing your snippet are hidden behind a dropdown. The aim of the design, however, was to create a good experience for experienced users who want to optimize their data manipulation workflows.
\n\t\t\tOn the whole, I am very content with the process and outcome of this project. I was involved from the research phase over the conceptual phase to the implementation and even helped with programming parts of the \"code editor\" component. Also, the feedback from the community shows that the hours you invest in research and ideation really pay off in the end.
\n\t\t\tI helped to build a product that helps a NGO to organize their citizen councils. One of the big features was a feedback flow for citizens to respond to an invitation for a council and mention their needs.
\n\t\t\tEs geht los organizes citizen councils and has to manage all the candidates that they reached out to and their special needs (e.g. child care, mobility impairments). As there are many people involved it is hard to keep track of all the candidates without a proper tool. Our goal was to build such a tool to help them with keeping track of the candidates, perform statistically sound drawings, organize their agents and collect feedback from their candidates online.
\n\t\t\tI expanded the existing visual identity (called \"Giulia\") to address all the needs of a web application. I expanded the color palette, set up a system for typography based on their existing typefaces and created the first components (buttons, checkboxes, textfields). I tailored the system to the CSS framework Tailwind which we used in development.
\n\t\t\tIn this click prototype (German only) you can see the screens that a candidate goes through after being chosen for a citizen council. The candidate can tick special needs, accept or decline the invitation and give feedback to Es geht los.
\n\t\t\t\n\t\t\tClick on the grey background and then restart (R) to restart the prototype.
\n\t\t\tEs geht los is a German NGO and non-partisan think & do tank by Demokratie Innovation e.V. for lot-based (\"losbasiert\") citizen participation. They organize citizen councils on a local, national level and for public institutions. MaibornWolff offers consulting and software engineering for ambitious IT projects. I was staffed as the UI Designer in a Digital Garage project by MaibornWolff for Demokartie Innovation e.V..
\nAs part of a university course a design team and a UX research team helped a startup to improve their gardening app. I contributed with planning, conducting and evaluating usability tests as part of the UX research team (3 persons in total).
\n\t\t\tGrüner Daumen (\"Green thumb\") is an upcoming gardening app that is designed to inspire and support users with their plant care. The client had questions regarding the usability and design of their application:
\n\t\t\tIn a first usability test participants were introduced to the app with a scenario and asked to perform several tasks while thinking aloud. We recorded the participant's interactions with the application with a camera and evaluated them later. The participants answered two questionnaires (QUESI, meCUE) rating the intuitiveness and the overall impression of the product. Additionally, the team conducted a heuristic analysis (following Jakob Nielsen) to identify usability problems. The insights generated from these methods were condensed and forwarded to the design team.
\n\t\t\tThe design team used the collected insights from the testing and the heuristic analysis to produce a redesigned version of the app.
\n\t\t\tIn a second usability test the redesigned version was evaluated and the results compared to the results of the first version. The same methods were used as in the first usability test to allow for better comparison. Users experienced less problems with the redesigned version and rated it also higher on all scales of the questionnaires.
\n\t\t\tDuring this project I learnt a lot about the design, conduction and evaluation of usability tests. Experiencing that the insights generated through our group's work were of great use for the startup was a big motivational factor. The cooperation and communication between the design team, the UX research team and the startup was challenging, but rewarded us with different perspectives and insights in the process.
\n\t\t\t\"Wir entwickeln momentan eine Smartphone-App und haben uns bei UseTree beworben, weil wir die Abfolge von Bedienschritten für eine innovative Anwendung evaluieren lassen wollten. Daneben war es uns wichtig, herauszufinden, inwieweit wir die Balance zwischen einer spielerischen Bedienung und einem seriösen Design hinbekommen. Das Zusammenspiel von Arbeitspsychologen und Designern im sogenannten Staffellauf, bei dem beide Seiten abwechselnd dieselbe Fragestellung bearbeiten, haben wir als sehr bereichernd und konstruktiv empfunden. Durch die Teilnahme wurde unser Blick für Usability-Fragestellungen maßgeblich geschärft. Zudem haben wir Tools an die Hand bekommen, um diese Fragen zukünftig inhouse weiter bearbeiten zu können. Das Designteam begeisterte uns mit kreativen und hochwertigen Vorschlägen, die wir direkt in die Weiterentwicklung aufnehmen. Nicht zuletzt war ich von der engagierten und offenen Art von UseTree angetan und empfand die Zusammenarbeit als sehr inspierierend.\" - Gesche Heitmann (Gründerin)
\n\t\tI helped to build a website where data scientists can read up on existing functionality of the desktop application. This website also enables them to share and collaborate on data analysis projects.
\n\t\t\tKNIME develops a data science software which lets users create data analysis workflows with small blocks called \"nodes\" in a graphical programming paradigm. The community is big and vibrant and we wanted to give users a platform where they can help each other out and work together on general purpose solutions for common data science problems (e.g. churn prediction, anomaly detection). As the UX Designer on the team I was given the task to create a first prototype for the information architecture and the interaction design.
\nAt first I wanted to find out users shared and collaborated with already existing tools. I interviewed 9 internal data scientists on their usage of similar products. I was especially interested in how they make their own work understandable to others and what helps them to understand other people's work (e.g. text descriptions, screenshots, oral explanations, visual cues).
\n\t\t\tFrom this research I identified challenges that were only poorly addressed by existing solutions. For example, a big challenge for users was the first time they try to use a new node. Sometimes the user did not know what the node could do, sometimes they were not sure how to set it up and sometimes they tried it out and it did not work the way they expected it to.
\n\t\t\tWith these challenges in mind we decided on what user stories to focus and defined the most important features for the KNIME Hub:
\nIn this phase I ranked the content in importance and separated it onto different screens. I drew inspiration from online-communities where users share their content with others (node-red, chefkoch, youtube, soundcloud).
\n\t\t\tI created four pages: A landing page with search, a search results page, a page for nodes and one for workflows. I created links between the pages which should help the users to find what they need.
\n\t\t\tThe first version of the wireframes were discussed in the team and additional content was added. In a second iteration I aimed for higher fidelity in the wireframes and focused more on the layout of the pages. This second version was used for communication to internal stakeholders.
\n\t\t\tThe final visual design was done by an external designer. I supported the development team during the building process and contributed by taking over small frontend tasks.
\nThe KNIME Hub was released and opened to the public during the KNIME Summit in March 2019. Since then it has received great interest and a growing community of active users. From March until October I assisted in the further development of features such as a deeper integration to the desktop application.
\nCheck it out at hub.knime.com.
\n\t\t\tInformation in accordance with section 5 TMG
\n\t\tJohannes Schweig,
\n\t\tTelephone:
\n\t\tE-Mail: hello@johannesschweig.de
\n\t\tInternetadresse: www.johannesschweig.de
\n\t\tJohannes Schweig,
\n\t\tAccountability for content: The contents of our pages have been created with the utmost care. However, we cannot guarantee the contents' accuracy, completeness or topicality. According to statutory provisions, we are furthermore responsible for our own content on these web pages. In this context, please note that we are accordingly not obliged to monitor merely the transmitted or saved information of third parties, or investigate circumstances pointing to illegal activity. Our obligations to remove or block the use of information under generally applicable laws remain unaffected by this as per §§ 8 to 10 of the Telemedia Act (TMG).
\n\t\tAccountability for links: Responsibility for the content of external links (to web pages of third parties) lies solely with the operators of the linked pages. No violations were evident to us at the time of linking. Should any legal infringement become known to us, we will remove the respective link immediately.
\n\t\tCopyright: Our web pages and their contents are subject to German copyright law. Unless expressly permitted by law (§ 44a et seq. of the copyright law), every form of utilizing, reproducing or processing works subject to copyright protection on our web pages requires the prior consent of the respective owner of the rights. Individual reproductions of a work are allowed only for private use, so must not serve either directly or indirectly for earnings. Unauthorized utilization of copyrighted works is punishable (§ 106 of the copyright law).
\n\t\tQuelle: http://www.muster-vorlagen.net
\n\t\tAngaben gemäß § 5 TMG
\n\t\tJohannes Schweig,
\n\t\tTelefon:
\n\t\tE-Mail: hello@johannesschweig.de
\n\t\tInternetadresse: www.johannesschweig.de
\n\t\tJohannes Schweig,
\n\t\tHaftung für Inhalte: Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.
\n\t\tHaftung für Links: Unser Angebot enthält Links zu externen Webseiten Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche Rechtsverstöße überprüft. Rechtswidrige Inhalte waren zum Zeitpunkt der Verlinkung nicht erkennbar. Eine permanente inhaltliche Kontrolle der verlinkten Seiten ist jedoch ohne konkrete Anhaltspunkte einer Rechtsverletzung nicht zumutbar. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.
\n\t\tUrheberrecht: Die durch die Seitenbetreiber erstellten bzw. verwendeten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der Zustimmung des jeweiligen Autors bzw. Erstellers. Downloads und Kopien dieser Seite sind nur für den privaten, nicht kommerziellen Gebrauch gestattet. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet. Insbesondere werden Inhalte Dritter als solche gekennzeichnet. Sollten Sie trotzdem auf eine Urheberrechtsverletzung aufmerksam werden, bitten wir um einen entsprechenden Hinweis. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Inhalte umgehend entfernen.
\n\t\tQuelle: http://www.muster-vorlagen.net
\n\tDuring my work for UseTree we tested the usability of an application with maintenance workers. The aim of the application is to allow for easy and sustainable transfer of knowledge.
\n\t\t\tOur client developed an app that should help mechanics with the repair of subway engines. Mechanics can view different material (photo, video,...) on the repair procedure of an engine and even record video themselves. The leading question was if the application provided substantial help for the work of the mechanics.
\n\t\t\tDuring a field test at a repair shop I conducted testings with two mechanics each lasting one hour. The test included a exploration phase of the application and an interview afterwards. The test focused on the future use case of the application and was aimed to generate insights into the work processes and the integration of the application in these processes. It was set in a challenging environment: Limited time of the worker, loud noises in the repair shop, sparse familiarity with usability testing of the worker.
\nAn additional test in a usability lab focused on the usability aspects of the application. Four students participated in this study.
\n\t\t\tThe client was involved in all stages of test conduction and evaluation. This imparted basic usability competencies to the client and was aimed to integrate user-centered design in the client's workflow. The evaluation of the two tests generated valuable insights for the future development of the application. Several problems were identified regarding the integration of the app at the workplace and new ideas could be collected on how to achieve such an integration in a sustainable manner. The usability test unveiled room for improvement of the ease of use.
\nI carried out a majority of the field test planning and was the on-site examiner. Thus, I learnt a lot about the internal work processes of the mechanics in the repair shop. This project enhanced my knowledge of usability test design as the field test was set in a challenging environment. Finally, I learnt how to condense knowledge about the work situation, context of use and the functionality of the application to create a vision of a use case of maximum benefit.
\n\"Mit Hilfe von UseTree konnten wir das Usability-Konzept unserer Anwendung erfolgreich überprüfen und optimieren. UseTree lieferte wertvolle Hinweise und Verbesserungsansätze und überzeugte uns durch eine professionelle Arbeitsweise und ein hohes Maß an Kreativität. Wir können UseTree als Dienstleister uneingeschränkt weiterempfehlen und freuen uns auf künftige gemeinsame Projekte.\" - André Fiedler (Projektleiter)
\n\t\tIn my free time I programmed a music player and expanded on it over the years. I learnt a lot about User-Centered Design, software engineering and making use of stackoverflow.
\n\t\t\tI was faced with the challenge of still having a lot of mp3s lying around but no suitable software to play and manage them. As streaming services such as Spotify take over traditional music players have shifted their focus (iTunes) or were abandoned all together (Winamp). So I decided to built a desktop music player suited for my own needs.
\n\t\t\tI tried to specify the context of use and the requirements for the music playing application. I identified the following:
\n\t\t\tAfter that, I studied competing products: iTunes, Winamp, MediaMonkey and Windows Media Player. In what way did they fulfill their goals? What are their shortcomings? All of these applications provide a lot of functionality (playlists, file management, tag writing, equalizer and additional settings) and the user is generally expected to actively cue in his/her songs (except Genius-playlists by iTunes). A lot of space in the user interfaces of these applications is taken up by toolbars, menus, cover previews and large context menus. Also, old UI concepts are still in use such as the tree view navigation. Colors and style are mainly aimed to transport the corporate identity of the manufacturing company (WMP by windows, iTunes by apple).
\n\t\t\tI transitioned from a low fidelity prototype on paper to a photoshop mockup to a fully-functioning Java prototype.
\n\t\t\tDuring the use of the application I documented design flaws, bugs and possible improvements. These were then incorporated in the next version of the application. This iterative process of use and improvement led to a constant development cycle. At first, I made changes and added functionality in rapid succession, but often realized in hindsight that the change did not integrate very well with the rest of the application or provided too little value compard to its development costs. Later in the project I spend more time elaborating on possible features which made my work more sustainable and time-efficient.
\n\t\t\tFive key questions followed me during that process:
\n\t\t\tApart from the common media control I implemented three core design features:
\n\t\t\tDuring the iterations of implementation-testing I learnt how to get more efficient in my own workflow and how to counterbalance design and functionality. The experience from my university courses and the job at UseTree about usability, UX and user-centered design guided me through this process. Furthermore, I learnt how to prioritze features and implement only the ones that were important, sustainable and time-efficient. Apart from that my software development skills improved dramatically as I got more proficient in the Java language, the JavaFX frontend framework, SQL and different libraries.
\n\t\t\t\n\t\t\tIn the course of the project I often felt restrained by the limited capabilites of the JavaFX frontend framework. Also, even though I tried, I could never really separate functionality in Model-View-Controller resulting in a messy code base. And in the end I needed a good reason to learn JavaScript, so I decided to rewrite the application with React and Redux. I used nedb for the database part and deployed the whole application as a cross-platfrom compatible electron app.
\n\t\t\t\n\t\tI helped to build a functionality which lets users filter their data based on multiple, nested criteria.
\n\t\t\tDuring my time at KNIME I was asked to create an interface for a node (KNIME term for encapsulated functionality) where users can filter their data based on multiple rules (e.g. filter out all rows in the data where the year column is smaller than 2016).
\n\t\t\tThe existing solution only supported one rule and the aim was to extend the functionality, so it could also work with multiple rules and it should be possible to nest rules (e.g. [condition A AND condition B] OR condition C). Users would not have to worry anymore about writing their queries in SQL because they could comfortably build them in a UI. This has several advantages:
\n\t\t\tI researched about how others have tried to solve this problem and found a number of different user interfaces. Some of them represented their rules as a graph, some of them as a nested list. And they also differed in how they made the actions such as creating or deleting rules available to the user.
\n\t\t\tThen I proceeded to explore the problem space with sketches. This brought up questions such as:
\n\t\t\tTrying to answer those questions helped to find possible solutions, narrowed the problem space, but also improved my understanding of the domain (Querying a database).
\n\t\t\tI came up with a variation where the rules were laid out top to bottom, groups were indicated by different colored rectangles and you could edit the rules right in place (see inline form in image above). It quickly came apparent that this solution would fit for easy queries with few rules and few nesting levels, but not for very complex queries. Then I designed a version where you would have a preview section on one side and an edit section on the other. This would allow for easier layouting as you would only have to display the currently selected rule. All other rules were displayed with a small label. The display of the preview varied: vertical graph, horizontal graph or treeview.\n\t\t\t
I created a small paper protoype and showed it to different colleagues. During the test the colleague had to press the buttons on the paper and I would (as responsively as I could) \"slide in\" the new UI elements (\"Wizard of Oz prototyping\"). After testing we decided that the AND/OR of groups should be positioned on top of them and not between the rules as our participants prefered by this. .
\n\t\t\tIn the end we decided for the treeview as it was easier to implement as the other concepts, was recognized as a familiar component by the users and also showed good results in user interaction.
\n\t\t\tI led a discovery project aiming to improve a core functionality in a web application. I interviewed customers and internal stakeholders. As a result a couple of smaller fixes and a big feature were developed.
\n\t\t\tValsight offers a financial planning solution for big companies. One of the core features is the “scenario manager” where you can create and modify assumptions (+10% more sales next year) and add them to scenarios (best case). Historically grown, it was very complex to understand and use. My task was to talk to users and figure out a way to make it easier to understand and better to use.
\nThe initial timeline for the project was set to 3 weeks. I proposed a project plan with three phases starting with a research phase, then an ideation/creation phase and finally a validation phase. In the end we wanted to have wireframes that we could create stories for and make part of a sprint. In the following, I will focus on the way I conducted the customer interviews and condensed the findings.
\n\t\t\tI prepared a semi-structured interview with around 10 questions asking about
\nI skipped questions that were not applicable for the participant or asked again if there was a chance to gain more insights by diving deeper into a topic.
\nWe managed to recruit customers from four companies and I talked to three internal consultants. The interviews were audio recorded and transcribed later.
\nI printed out the interview protocols on paper and cut them into small snips of a few sentences each. Then I started a data wall where I grouped snips to broader topics. After that I removed smaller topics to focus on the big topics that started to emerge.
\n\t\t\tI presented these topics to my product manager and we decided which topics we would prioritize for now.
\n\t\t\tA couple of smaller features were developed right after concluding the validation with customers. A search functionality was added to the scenario manager to find items in the list faster. Also, a couple of visual tweaks were made to the scenario manager and a convenient keyboard shortcut for faster navigation was introduced.
\nWe had a bigger feature idea about grouping similar assumptions together and making it easier to switch between them. This idea was further iterated and refined until it was ready to be developed and shipped.
\n\t\t\tIn hindsight, I was proud and amazed at how often I would come back to my findings for related topics or just look at the written protocols if I vaguely remembered somebody having said something similar in one of the interviews. A powerful quote from a user really sticks in your head!
\nI also enjoyed passing back the positive feedback from the interviews to the developers. They certainly deserved it.
\nThe project also inspired lots of people involved in building the product and served as a source of feature ideas for the future.
\nOn the other hand, the problem statement could have been clearer. The broad scope of it allowed for a lot of valuable exploration to happen, but it also felt like it was not worth the effort at times. Changing something is very hard if it has been at the core of an application for many years. Usually, there are good reasons why it is the way it is and users are not happy to have their workflow changed.
\nIn my master thesis I examined the effects of wearing eyeglasses on eye tracking. I used methods from statistics and machine learning to correct for eyeglass-induced errors.
\n\t\t\tEye tracking is a useful method which is not only used in research and interactive systems but also in future technologies such as the foveated rendering for VR. Modern eye trackers use a combination of the pupil position and an infrared reflection to infer the point of gaze. Corrective eyeglasses, however, pose a challenge for the eyetracking system. They alter the image of the eye, thus causing errors in the eyetracking signal. These errors are related to the refractive strength of the eyeglasses. In my thesis, I tried to build a classification model that takes eye tracking data as input in order to output the refractive strength of the current user. On the basis of this classification, an error correction is applied that corrects the eye tracking data dependening on the refractive strength.
\nI collected data using a head model with artificial eyes and different pairs of eyeglasses on various positions of the screen. Two datasets were obtained; one for training and testing the models and one dataset for validation. The validation dataset contained a portion of new data. Its aim was to assess how well the models could generalize on new data.
\n\t\t\tI employed several popular machine learning algorithms (KNN, SVM, MLP,...) to build classification models. These models were adjusted on the data (hyperparameters) in a grid search paradigm with a 10-fold cross-validation. The final models were evaluated on training, test and validation set. The Multi-layer perceptron model (MLP) showed the highest performance with a fscore of .99 on the test set and a fscore of .73 on the validation set.
\n\t\t\tI built several models following a weighted-average and a regression approach. The weighted-average model was able to reduce the error by about 50% on the training and test set. The regression model reduced the error by about 25%. Both models performed equally on the validation set with a reduction of 45% in X direction and 10% in Y direction.
\n\t\t\tMy thesis was the first major research project that I conducted from start to finish. I recognized the vitality of an early distinct and definite definition of the task. I learned a lot about the practical application of machine learning on real data and how to deal with problems of data quality like missing and noisy data. I learnt how to make reasonable deductions from preliminary work and how to support my own claims. Lastly, I learnt how to interpret results in the presence of ambiguity and uncertainty and how huge the effort is in order to make small progress in research.
\n \n \n Download the pdf here\n \n\t\tI was the project lead for a big car rental company building a system that automatically processed traffic tickets.
\n\t\t\t, or missing
. Bailing hydration and performing ' +\n 'full client-side render.'\n );\n }\n }\n // either not server-rendered, or hydration failed.\n // create an empty node and replace it\n oldVnode = emptyNodeAt(oldVnode);\n }\n\n // replacing existing element\n var oldElm = oldVnode.elm;\n var parentElm = nodeOps.parentNode(oldElm);\n\n // create new node\n createElm(\n vnode,\n insertedVnodeQueue,\n // extremely rare edge case: do not insert if old element is in a\n // leaving transition. Only happens when combining transition +\n // keep-alive + HOCs. (#4590)\n oldElm._leaveCb ? null : parentElm,\n nodeOps.nextSibling(oldElm)\n );\n\n // update parent placeholder node element, recursively\n if (isDef(vnode.parent)) {\n var ancestor = vnode.parent;\n var patchable = isPatchable(vnode);\n while (ancestor) {\n for (var i = 0; i < cbs.destroy.length; ++i) {\n cbs.destroy[i](ancestor);\n }\n ancestor.elm = vnode.elm;\n if (patchable) {\n for (var i$1 = 0; i$1 < cbs.create.length; ++i$1) {\n cbs.create[i$1](emptyNode, ancestor);\n }\n // #6513\n // invoke insert hooks that may have been merged by create hooks.\n // e.g. for directives that uses the \"inserted\" hook.\n var insert = ancestor.data.hook.insert;\n if (insert.merged) {\n // start at index 1 to avoid re-invoking component mounted hook\n for (var i$2 = 1; i$2 < insert.fns.length; i$2++) {\n insert.fns[i$2]();\n }\n }\n } else {\n registerRef(ancestor);\n }\n ancestor = ancestor.parent;\n }\n }\n\n // destroy old node\n if (isDef(parentElm)) {\n removeVnodes([oldVnode], 0, 0);\n } else if (isDef(oldVnode.tag)) {\n invokeDestroyHook(oldVnode);\n }\n }\n }\n\n invokeInsertHook(vnode, insertedVnodeQueue, isInitialPatch);\n return vnode.elm\n }\n}\n\n/* */\n\nvar directives = {\n create: updateDirectives,\n update: updateDirectives,\n destroy: function unbindDirectives (vnode) {\n updateDirectives(vnode, emptyNode);\n }\n};\n\nfunction updateDirectives (oldVnode, vnode) {\n if (oldVnode.data.directives || vnode.data.directives) {\n _update(oldVnode, vnode);\n }\n}\n\nfunction _update (oldVnode, vnode) {\n var isCreate = oldVnode === emptyNode;\n var isDestroy = vnode === emptyNode;\n var oldDirs = normalizeDirectives$1(oldVnode.data.directives, oldVnode.context);\n var newDirs = normalizeDirectives$1(vnode.data.directives, vnode.context);\n\n var dirsWithInsert = [];\n var dirsWithPostpatch = [];\n\n var key, oldDir, dir;\n for (key in newDirs) {\n oldDir = oldDirs[key];\n dir = newDirs[key];\n if (!oldDir) {\n // new directive, bind\n callHook$1(dir, 'bind', vnode, oldVnode);\n if (dir.def && dir.def.inserted) {\n dirsWithInsert.push(dir);\n }\n } else {\n // existing directive, update\n dir.oldValue = oldDir.value;\n dir.oldArg = oldDir.arg;\n callHook$1(dir, 'update', vnode, oldVnode);\n if (dir.def && dir.def.componentUpdated) {\n dirsWithPostpatch.push(dir);\n }\n }\n }\n\n if (dirsWithInsert.length) {\n var callInsert = function () {\n for (var i = 0; i < dirsWithInsert.length; i++) {\n callHook$1(dirsWithInsert[i], 'inserted', vnode, oldVnode);\n }\n };\n if (isCreate) {\n mergeVNodeHook(vnode, 'insert', callInsert);\n } else {\n callInsert();\n }\n }\n\n if (dirsWithPostpatch.length) {\n mergeVNodeHook(vnode, 'postpatch', function () {\n for (var i = 0; i < dirsWithPostpatch.length; i++) {\n callHook$1(dirsWithPostpatch[i], 'componentUpdated', vnode, oldVnode);\n }\n });\n }\n\n if (!isCreate) {\n for (key in oldDirs) {\n if (!newDirs[key]) {\n // no longer present, unbind\n callHook$1(oldDirs[key], 'unbind', oldVnode, oldVnode, isDestroy);\n }\n }\n }\n}\n\nvar emptyModifiers = Object.create(null);\n\nfunction normalizeDirectives$1 (\n dirs,\n vm\n) {\n var res = Object.create(null);\n if (!dirs) {\n // $flow-disable-line\n return res\n }\n var i, dir;\n for (i = 0; i < dirs.length; i++) {\n dir = dirs[i];\n if (!dir.modifiers) {\n // $flow-disable-line\n dir.modifiers = emptyModifiers;\n }\n res[getRawDirName(dir)] = dir;\n dir.def = resolveAsset(vm.$options, 'directives', dir.name, true);\n }\n // $flow-disable-line\n return res\n}\n\nfunction getRawDirName (dir) {\n return dir.rawName || ((dir.name) + \".\" + (Object.keys(dir.modifiers || {}).join('.')))\n}\n\nfunction callHook$1 (dir, hook, vnode, oldVnode, isDestroy) {\n var fn = dir.def && dir.def[hook];\n if (fn) {\n try {\n fn(vnode.elm, dir, vnode, oldVnode, isDestroy);\n } catch (e) {\n handleError(e, vnode.context, (\"directive \" + (dir.name) + \" \" + hook + \" hook\"));\n }\n }\n}\n\nvar baseModules = [\n ref,\n directives\n];\n\n/* */\n\nfunction updateAttrs (oldVnode, vnode) {\n var opts = vnode.componentOptions;\n if (isDef(opts) && opts.Ctor.options.inheritAttrs === false) {\n return\n }\n if (isUndef(oldVnode.data.attrs) && isUndef(vnode.data.attrs)) {\n return\n }\n var key, cur, old;\n var elm = vnode.elm;\n var oldAttrs = oldVnode.data.attrs || {};\n var attrs = vnode.data.attrs || {};\n // clone observed objects, as the user probably wants to mutate it\n if (isDef(attrs.__ob__)) {\n attrs = vnode.data.attrs = extend({}, attrs);\n }\n\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n setAttr(elm, key, cur);\n }\n }\n // #4391: in IE9, setting type can reset value for input[type=radio]\n // #6666: IE/Edge forces progress value down to 1 before setting a max\n /* istanbul ignore if */\n if ((isIE || isEdge) && attrs.value !== oldAttrs.value) {\n setAttr(elm, 'value', attrs.value);\n }\n for (key in oldAttrs) {\n if (isUndef(attrs[key])) {\n if (isXlink(key)) {\n elm.removeAttributeNS(xlinkNS, getXlinkProp(key));\n } else if (!isEnumeratedAttr(key)) {\n elm.removeAttribute(key);\n }\n }\n }\n}\n\nfunction setAttr (el, key, value) {\n if (el.tagName.indexOf('-') > -1) {\n baseSetAttr(el, key, value);\n } else if (isBooleanAttr(key)) {\n // set attribute for blank value\n // e.g. \n if (isFalsyAttrValue(value)) {\n el.removeAttribute(key);\n } else {\n // technically allowfullscreen is a boolean attribute for