<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tim van Mourik</title>
    <description>The latest articles on DEV Community by Tim van Mourik (@timvanmourik).</description>
    <link>https://dev.to/timvanmourik</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F190115%2F11a791f3-b0cf-403f-bc79-dc8fb08e18fb.jpg</url>
      <title>DEV Community: Tim van Mourik</title>
      <link>https://dev.to/timvanmourik</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/timvanmourik"/>
    <language>en</language>
    <item>
      <title>Visual machine learning (Keras) with GiraffeTools</title>
      <dc:creator>Tim van Mourik</dc:creator>
      <pubDate>Wed, 11 Sep 2019 14:14:36 +0000</pubDate>
      <link>https://dev.to/timvanmourik/visual-machine-learning-keras-with-giraffetools-3pai</link>
      <guid>https://dev.to/timvanmourik/visual-machine-learning-keras-with-giraffetools-3pai</guid>
      <description>&lt;p&gt;***NOTE: the main article about GiraffeTools can be found &lt;a href="https://dev.to/timvanmourik/giraffetools-a-generic-online-workflow-editor-4f6j-temp-slug-2730789"&gt;here&lt;/a&gt;***&lt;/p&gt;

&lt;p&gt;When I started to go down the rabbit hole of ‘machine learning’, it was a puzzling and bewildering experience. After building my first digit recognition network, it did not feel like the concatenation of obscure modules named Conv2D, MaxPooling, or DropOut was very intuitive. Although the outcome brilliantly predicted every new hand-written digit that I fed the model, it did not feel like I knew what I was doing. And more importantly, that I would know how to apply it to my own data.&lt;/p&gt;

&lt;p&gt;This is quite a barrier for people that are new to the machine learning space. Add to that the proficiency in coding that is required for running the network on your data. Wouldn’t it be cool if we could lower this barrier?&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing: Keras with GiraffeTools
&lt;/h3&gt;

&lt;p&gt;What if you could graphically build your machine learning network? And easily integrate the network with the rest of your code and share the results? If only there were tools for a &lt;strong&gt;G&lt;/strong&gt; raphical &lt;strong&gt;I&lt;/strong&gt; nterface for &lt;strong&gt;R&lt;/strong&gt; eproducible &lt;strong&gt;A&lt;/strong&gt; nalysis &lt;strong&gt;F&lt;/strong&gt; or work &lt;strong&gt;F&lt;/strong&gt; low &lt;strong&gt;E&lt;/strong&gt; xperiments!&lt;/p&gt;

&lt;p&gt;That’s what GiraffeTools is: a completely &lt;a href="https://github.com/GiraffeTools/GiraffeTools"&gt;open source&lt;/a&gt; web application that allows you to build Keras networks. It automatically creates code that you can save directly to a GitHub repository as a new commit. Your model is now accessible at: &lt;a href="https://giraffe.tools/workflow/%5BYOUR_GITHUB_HANDLE%5D"&gt;https://giraffe.tools/workflow/ [&lt;strong&gt;YOUR_GITHUB_HANDLE&lt;/strong&gt;]&lt;/a&gt; / [&lt;strong&gt;YOUR_REPOSITORY&lt;/strong&gt;] / [&lt;strong&gt;YOUR_BRANCH_OR_COMMIT&lt;/strong&gt;].&lt;/p&gt;

&lt;p&gt;As an example, take a simple digit recognition network using Keras. The &lt;strong&gt;master&lt;/strong&gt; branch from my &lt;strong&gt;keras-giraffetools-digit-recognition&lt;/strong&gt; repository within my &lt;strong&gt;TimVanMourik&lt;/strong&gt; Github account can be inspected at:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://giraffe.tools/porcupine/TimVanMourik/keras-giraffetools-digit-recognition/master"&gt;https://giraffe.tools/workflow/TimVanMourik/keras-giraffetools-digit-recognition/master&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HkBIFDkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ALeAUSZgqZrRlL57SXvk8Ug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HkBIFDkv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2ALeAUSZgqZrRlL57SXvk8Ug.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://giraffe.tools/porcupine/TimVanMourik/keras-giraffetools-digit-recognition/master"&gt;&lt;/a&gt;&lt;a href="https://giraffe.tools/"&gt;https://giraffe.tools/&lt;/a&gt;&lt;a href="https://giraffe.tools/porcupine/TimVanMourik/keras-giraffetools-digit-recognition/master"&gt;workflow&lt;/a&gt;&lt;a href="https://giraffe.tools/porcupine/TimVanMourik/keras-giraffetools-digit-recognition/master"&gt;/TimVanMourik/keras-giraffetools-digit-recognition/master&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How did I construct this?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I dragged-and-dropped Keras modules into the editor&lt;/li&gt;
&lt;li&gt;I connected them to generate a sequential network (designed after &lt;a href="https://machinelearningmastery.com/handwritten-digit-recognition-using-convolutional-neural-networks-python-keras"&gt;this tutorial&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;GiraffeTools automatically generates the analogous Python-Keras code&lt;/li&gt;
&lt;li&gt;The ‘Save to GitHub’ button saves the Python code to my repository (&lt;a href="https://github.com/TimVanMourik/keras-giraffetools-digit-recognition/blob/master/GIRAFFE/code/neural_net.py"&gt;this Python file&lt;/a&gt;), as well as the visual pipeline representation (&lt;a href="https://github.com/TimVanMourik/keras-giraffetools-digit-recognition/blob/master/GIRAFFE/porcupipeline.pork"&gt;this JSON file&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;I manually wrote Python code to load MNIST data, load the GiraffeTools NeuralNet (&lt;a href="https://github.com/TimVanMourik/keras-giraffetools-digit-recognition/blob/master/digit_recognition.py"&gt;plain python&lt;/a&gt; or &lt;a href="https://github.com/TimVanMourik/keras-giraffetools-digit-recognition/blob/master/digit_recognition.ipynb"&gt;Jupyter Notebook&lt;/a&gt;)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Load MNIST data
from keras.datasets import mnist
# Load NeuralNet as defined and saved by the editor
from GIRAFFE.code.neural\_net import NeuralNet
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;As you would with any Keras network, from here you build, compile, and fit your NeuralNet:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight mosel"&gt;&lt;code&gt;&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Preprocess&lt;/span&gt; &lt;span class="n"&gt;MNIST&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;model&lt;/span&gt;
&lt;span class="k"&gt;model&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;NeuralNet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_classes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="nf"&gt;Compile&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;model&lt;/span&gt;
&lt;span class="k"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'categorical_crossentropy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;optimizer&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'adam'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;=[&lt;/span&gt;&lt;span class="s1"&gt;'accuracy'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Fit&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="k"&gt;model&lt;/span&gt;
&lt;span class="k"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
   &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;validation_data&lt;/span&gt;&lt;span class="p"&gt;=(&lt;/span&gt;&lt;span class="n"&gt;X_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_test&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;         
   &lt;span class="n"&gt;epochs&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         
   &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;All code for this example is available at:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/TimVanMourik/keras-giraffetools-digit-recognition"&gt;TimVanMourik/keras-giraffetools-digit-recognition&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;The easiest way is to fork the repo above and get started from there! If you want to start from scratch, go ahead: &lt;a href="https://giraffe.tools/workflow"&gt;https://giraffe.tools/workflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But there is one caveat: at this moment you have to point to the keras nodes in a GIRAFFE.yml file in the root of your repository. How this works under the hood you can read &lt;a href="https://dev.to/timvanmourik/giraffetools-a-generic-online-workflow-editor-4f6j-temp-slug-2730789"&gt;here&lt;/a&gt;, in the GiraffeTools main article. The TLDR is: you can use GiraffeTools for any other data analysis pipelines as well if you point to your a library file of function. I pre-made and linked this for the Keras application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your input!
&lt;/h3&gt;

&lt;p&gt;I am relatively new to machine learning, so any help to improve this is much appreciated! Via the comment section, GitHub, or the &lt;a href="https://giraffe.tools/slack"&gt;GiraffeTools Slack&lt;/a&gt;. Also, I would love to make the same connection to PyTorch, but I have never used it. If you have PyTorch experience, please get in touch and we’ll build it together!&lt;/p&gt;

</description>
      <category>keras</category>
      <category>pytorch</category>
      <category>visualthinking</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>GiraffeTools: a generic online workflow editor</title>
      <dc:creator>Tim van Mourik</dc:creator>
      <pubDate>Thu, 29 Aug 2019 10:39:12 +0000</pubDate>
      <link>https://dev.to/timvanmourik/giraffetools-a-generic-online-workflow-editor-f7j</link>
      <guid>https://dev.to/timvanmourik/giraffetools-a-generic-online-workflow-editor-f7j</guid>
      <description>&lt;p&gt;&lt;a href="https://giraffe.tools/"&gt;https://giraffe.tools&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The analysis of &lt;em&gt;Big Data&lt;/em&gt; has been a hot topic for at least a decade. These analyses often consists of a sequences of steps that mold and transform the data into features that have some meaningful interpretation. And maybe you want to extract features for subsequent machine learning analyses.&lt;/p&gt;

&lt;p&gt;Would it not be cool to _graphically build analysis pipelines _? This is not a new idea of course. You can find node editors in &lt;a href="https://docs.blender.org/manual/en/2.79/_images/editors_node-editor_nodes_frame_example.png"&gt;graphics&lt;/a&gt;, &lt;a href="https://www.researchgate.net/profile/Kristina_Hettne/publication/264578295/figure/fig4/AS:613949972176926@1523388488995/Taverna-nested-workflow-for-gene-annotation-Blue-boxes-represent-input-and-output.png"&gt;genetic analysis&lt;/a&gt;, &lt;a href="https://daw18osvyl2bu.cloudfront.net/wp-content/uploads/2019/02/HighGear-Workflow-with-Sections-Highlight.jpg"&gt;financial tech&lt;/a&gt;, and in many more places. Yet, if you have written your own data analysis toolbox, wouldn’t it be great if you could give your users access to your tools and example pipelines in a visual manner?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_9V6vcnH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9EC03vcH_67deEdxRx3Ssg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_9V6vcnH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2A9EC03vcH_67deEdxRx3Ssg.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing GiraffeTools
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GiraffeTools&lt;/strong&gt; is a generic &lt;strong&gt;G&lt;/strong&gt; raphical &lt;strong&gt;I&lt;/strong&gt; nterface for &lt;strong&gt;R&lt;/strong&gt; eproducible &lt;strong&gt;A&lt;/strong&gt; nalysis &lt;strong&gt;F&lt;/strong&gt; or work &lt;strong&gt;F&lt;/strong&gt; low &lt;strong&gt;E&lt;/strong&gt; xperiments! I originally developed GiraffeTools for ‘neuroimaging’. On a daily basis, I work with people that analyse all sorts of brain data (MRI, EEG, MEG, etc.), but quickly noticed that all important toolboxes have completely different APIs and are often written in different programming languages.&lt;/p&gt;

&lt;p&gt;So I developed an GitHub-integrated web editor that automatically creates analysis code from a visual workflow…&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;To which you can add your own toolbox&lt;/li&gt;
&lt;li&gt;To which you can add your custom modules to any supported toolbox&lt;/li&gt;
&lt;li&gt;To which you can add a custom ‘grammar’ that transforms the graph representation into code for your toolbox.&lt;/li&gt;
&lt;li&gt;From which you can save any pipeline to a GitHub repository and easily build examples for your users&lt;/li&gt;
&lt;li&gt;In which you can inspect your visual workflow at any previous commit, because your workflow is fully GitHub version controlled!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your project is accessible at: &lt;a href="https://giraffe.tools/github/%24username/%24repository/%24branch_or_commit"&gt;https://giraffe.tools/&lt;/a&gt;&lt;a href="https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample"&gt;workflow&lt;/a&gt;&lt;a href="https://giraffe.tools/github/%24username/%24repository/%24branch_or_commit"&gt;/$username/$repository/$branch_or_commi&lt;/a&gt;t, for example: &lt;a href="https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample"&gt;https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample&lt;/a&gt; looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g3g9hnUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AviEk1aJgmAXbG3A_JdqE-Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g3g9hnUm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AviEk1aJgmAXbG3A_JdqE-Q.png" alt=""&gt;&lt;/a&gt;&lt;a href="https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample"&gt;&lt;/a&gt;&lt;a href="https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample"&gt;https://giraffe.tools/workflow/TimVanMourik/SomeGiraffeExample&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add your own content
&lt;/h3&gt;

&lt;p&gt;Ok, so how does that work? Well, any GitHub project can be a GiraffeTools project by simply putting a &lt;strong&gt;GIRAFFE.yml&lt;/strong&gt; configuration file in the root of your project. There, you can specificy&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A files list that points to a file to which you want to write your visual pipeline,&lt;/li&gt;
&lt;li&gt;A nodes list that points to toolbox modules that you might want to use in your pipeline,&lt;/li&gt;
&lt;li&gt;A grammars list that specifies the interpreter that transforms the graph into code.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**# Content of a GIRAFFE.yml file in the root of your repository.**  
tools:
  workflow:
    # A file in your repository to which the UI state is saved 
    # Currently only a single file is supported 
    files:
      - GIRAFFE/keras.json
    # A list of nodes to load into the editor
    # The path is either relative to the root or a full URL
    nodes:
      - https://raw.githubusercontent.com/TimVanMourik/keras/giraffe-tools/keras_nodes.json
    # You can load your own JavaScript code generator. Documentation will follow soon
    # The path is either relative to the root or a full URL
    grammars:
      - language: 'Keras'
        script: GIRAFFE/test.js
        format: python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now the good part is that once you built a nodes library and a grammars code interpreter, anyone can build pipelines with your software! Anyone can create a new repository and build a custom workflow with your software that is insightful and immediately shareable (by a simple Github ‘fork’).&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started
&lt;/h3&gt;

&lt;p&gt;How what do these files look like? Examples of how to programmatically create a nodes file (Python and MATLAB code) are included in &lt;a href="https://github.com/GiraffeTools/Libraries"&gt;https://github.com/GiraffeTools/Libraries&lt;/a&gt;. It requires a JSON specification of your toolbox, the categories in which you may want to subdivide all your functions, a list of nodes (functions) that you want users to be able to drag and drop into the editor, and a list of their input and output ports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "toolboxes": [
   {
    //specify the name of the toolbox, e.g. Keras
    "name": "Keras",
    //specify a list of categories within the toolbox
    "categories": [
     {
      //specify the name of the category
      "name": "core",
      //specify the nodes within that category
      "nodes": [
       {
        //specify the name and attributes of a single module
        "name": "Dense",
        "category": "core",
        "toolbox": "Keras",
        "web_url": "https://keras.io/layers/core/Dense",
        //add any set of parameters that are required to generate
        //your specific code.
        "code": [
         {
          "language": "Keras",
          "argument": {
           "name": "Dense",
           "import": "from keras.layers import Dense"
          }
         }
        ],
        //add input and output ports.
        "ports": [
         {
          "name": "units",
          "input": false,
          "output": false,
          "visible": true,
          "editable": true,
          "code": [
           {
            "language": "Keras",
            "argument": {
             "kwarg": false,
             "arg": 0
            }
           }
          ]
         },
         ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;These nodes are loaded into the editor to drag’n drop, regardless of whether a grammars code interpreter is specified. Separately, you could work on this interpreter, which is a JavaScript file. In its simplest form it contains a writeCode and writeFiles function. The former translates code the pipeline graph into code, the latter specifies to what file in your repository it is written, in case a user uses the ‘Save to GitHub’ functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight hack"&gt;&lt;code&gt;&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;writeCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"I am creating code here!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;writeFiles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="no"&gt;myFilename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GIRAFFE/my_code.py'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;myFilename&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;writeCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;links&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;writeCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;writeFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This is plain JavaScript that receives the (nodes, links) props, based on which you can write more elaborate code for your specific purpose. Examples are included in &lt;a href="https://github.com/GiraffeTools/CodeGenerators"&gt;https://github.com/GiraffeTools/CodeGenerators&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uhoK6t95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ac7b0AWZCwjhfzpl0aJTiGQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uhoK6t95--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2Ac7b0AWZCwjhfzpl0aJTiGQ.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Project page
&lt;/h3&gt;

&lt;p&gt;As a bonus, there is the project page in which all your commits to a specific project are listed. This way, you can open the workflow at any previous point in time. You can also take a look at code from different branches of our repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open source
&lt;/h3&gt;

&lt;p&gt;The platform is built to create your own open source analysis pipelines. The GiraffeTools code itself is also entirely open source: &lt;a href="https://github.com/GiraffeTools/GiraffeTools"&gt;https://github.com/GiraffeTools/GiraffeTools&lt;/a&gt;! Stars, forks, bug reports, feature requests, or contributions are much appreciated!&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;This article is just an introduction of GiraffeTools. More documentation and Medium posts will follow! This is all &lt;em&gt;work in progress&lt;/em&gt; and in active development! Any feedback is welcome!&lt;/p&gt;

</description>
      <category>datavisualization</category>
      <category>editor</category>
      <category>code</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
