<?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: lepinekong</title>
    <description>The latest articles on DEV Community by lepinekong (@lepinekong).</description>
    <link>https://dev.to/lepinekong</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%2F19626%2F30357b7a-e7a6-4f2f-9935-34428847c48e.png</url>
      <title>DEV Community: lepinekong</title>
      <link>https://dev.to/lepinekong</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lepinekong"/>
    <language>en</language>
    <item>
      <title>Do you want to make fantastic progress in learning how to code ? Use Deming PDSA continuous improvement process</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sat, 03 Jul 2021 15:40:28 +0000</pubDate>
      <link>https://dev.to/lepinekong/do-you-want-to-make-fantastic-progress-in-learning-how-to-code-use-deming-pdsa-continuous-improvement-process-d9h</link>
      <guid>https://dev.to/lepinekong/do-you-want-to-make-fantastic-progress-in-learning-how-to-code-use-deming-pdsa-continuous-improvement-process-d9h</guid>
      <description>&lt;p&gt;You may have heard of PDCA but actually it's wrong and exported by ignorant consultants (I've been coached by a close friend of Deming that's how I know) : the genuine Deming wheel for continuous improvement for both Quality and Productivity is Deming PDSA for Plan, Do, STUDY, Adjust. It's not about Quality Control like PDCA (C for Check) which made Deming angry because he taught Japanese after WWII the genuine one and they thanked him but outside of Quality field over there nobody really knows what it is about.&lt;/p&gt;

&lt;p&gt;It's about learning in a scientific way by using a spiral of 4 phases :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;P for Plan (in Design sense not in Microsoft Project sense ;))&lt;/li&gt;
&lt;li&gt;D for Do (implementation)&lt;/li&gt;
&lt;li&gt;S for Study (experiment)&lt;/li&gt;
&lt;li&gt;A for Adjust (retrospective)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wanted a tool first for myself to be able to apply this process easily so that I can capitalize on my learning without forgetting everything a few months later because I have to switch to another subject before going back. For example I remember a travel to Cambodia when I wanted to mount a local apache server with multiple virtual domains hosting, I even downloaded documentation for offline, I did it once a few years ago but I couldn't make it work again. It was so frustating.&lt;/p&gt;

&lt;p&gt;Also I don't want to lose time writing all technical details in a blog post on every subject I would learn, I wanted a quick way and that is code as explained in previous post &lt;a href="https://dev.to/lepinekong/code-as-visual-component-3l11"&gt;https://dev.to/lepinekong/code-as-visual-component-3l11&lt;/a&gt; but it's not just about the tool, it's also about the process.&lt;/p&gt;

&lt;p&gt;After 2 years of experimentation, a lot of headaches, I'm now starting to eat my own dog food as I implemented it and still am implementing as a figma plugin (maybe it could be some other platforms in the future) which has grown to a huge code base of about 25000 lines of pure javascript (I didn't even use any framework though I intend to choose Svelte later on with the idea of being able to switch between react and svelte or any other, that is also part of my goals with this tool).&lt;/p&gt;

&lt;p&gt;So here's a little glimpse of what I'm talking about : I'm currently working on diagram named grafcet (more on that in a future post but roughly it's kind of mix between flowchart and state machine) and for links specific to this tool I couldn't find another plugin that could do the job well enough. I will explain much more thoroughly later on, this is an overview of study phase of PDSA above : as you could see I can make a journal of some parts with color to show iterations so that I could explain to others or to myself in the future (which I intend to do be patient there are also tools building to facilitate that)&lt;/p&gt;

&lt;p&gt;Happy watch and keep learning ! &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/7PJSw2eFErs"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>learntocode</category>
      <category>leanprogramming</category>
      <category>tutorialhell</category>
    </item>
    <item>
      <title>Code as Visual Component</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Mon, 28 Jun 2021 12:19:21 +0000</pubDate>
      <link>https://dev.to/lepinekong/code-as-visual-component-3l11</link>
      <guid>https://dev.to/lepinekong/code-as-visual-component-3l11</guid>
      <description>&lt;p&gt;This is the first post of a series to come on Code as Visual Component (NOT Yet Another Visual Programming Language ;)). &lt;/p&gt;

&lt;p&gt;After 2 years of research on DX (Developer's eXperience) I'm now sure of the proof of concept for a new Visual Code Design concept. Personal motivations are :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I wanted to keep a dev journal while training on the jobs. I don't want to lose time and write much "literature" and it is not precise enough, I want to "picture" code with all its context. Git versioning is mandatory but as for getting a mental model it's not appealing enough.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I don't like all the Visual Programming Languages currently : they oblige you to code in a language I have to learn. I want to be able to use all mainstraim and not so mainstream languages (from javascript,...) or frameworks (react,...).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I want to capitalize on code by creating code as component or block, a bit like in scratch but for adults. I want to be able to create them quickly and visually so I chose figma platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I don't want to use drag &amp;amp; drop, it's not very productive, I want to type instead. I want to be able to use it as a complement or integrate with an IDE to be more productive and have clean code by capitalizing with a code knowledge management system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and many more (student and teacher/self-taught to be able to customize and build visual tool and playground thanks to a plugin architecture).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below is a very simple example of a component to select a node in figma as I'm eating my own dog food as self validation first. But as soon as possible (once I have fixed some pesky details), you'll be able to test also (join more than 1000 subscribers at &lt;a href="https://grafcet.online"&gt;https://grafcet.online&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Long term I intend to opensource.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TOmDwkHLH20"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>visualcodedesign</category>
      <category>visualprogramming</category>
      <category>domainspecificlanguage</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Webpack tips: How to output multiple html</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sat, 24 Apr 2021 18:09:01 +0000</pubDate>
      <link>https://dev.to/lepinekong/webpack-tips-how-to-output-multiple-html-3b28</link>
      <guid>https://dev.to/lepinekong/webpack-tips-how-to-output-multiple-html-3b28</guid>
      <description>&lt;p&gt;I'm developping a figma plugin with multiple UIs, so I needed to be able to do so. This requires to use HtmlWebpackPlugin for Webpack. So here it is in case you needed it also, this will save you a few hours of research maybe also I'm using grafcet.online (kind of scratch for professional programming) visual component or DSL (Domain Specific Langage) to avoid stupid configuration error  ;)&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/SQme8Dc88a0"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>htmlwebpackplugin</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I'm back on dev.to : Figma Plugin API Tutorial Update</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sat, 09 Jan 2021 16:22:11 +0000</pubDate>
      <link>https://dev.to/lepinekong/figma-plugin-api-tutorial-update-1kfc</link>
      <guid>https://dev.to/lepinekong/figma-plugin-api-tutorial-update-1kfc</guid>
      <description>&lt;p&gt;I'm back to dev.to I've been very busy developping a huge figma plugin (more than 13000 lines and still counting) :)&lt;/p&gt;

&lt;p&gt;For now I have updated &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/lepinekong/figma-plugin-api-discovery-part-1-45o2"&gt;Figma Plugin API discovery - Part 1 - DEV Community 👩‍💻👨‍💻&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;and&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/lepinekong/figma-plugin-api-discovery-part-2-82j"&gt;Figma Plugin API discovery - Part 2 - DEV Community 👩‍💻👨‍💻&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Figma Plugin API discovery - Part 2</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Mon, 26 Aug 2019 15:47:33 +0000</pubDate>
      <link>https://dev.to/lepinekong/figma-plugin-api-discovery-part-2-82j</link>
      <guid>https://dev.to/lepinekong/figma-plugin-api-discovery-part-2-82j</guid>
      <description>&lt;p&gt;Update: Here's a new update for Part 2 of Figma Plugin API Tutorial :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.figma.com/file/Vpb9JAnfyywPgZRIdQmjci/Getting-Started-with-Figma-Plugin-Creation?node-id=0%3A1"&gt;Getting Started with Figma Plugin Creation – Figma&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SKZENx9v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/i1jWj5I.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SKZENx9v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/i1jWj5I.png" alt="i1jWj5I.png (1407×846)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.figma.com/proto/yHQ7r7LDf4LGzqHb6DoZKO/Figma-Plugin-API-Discovery%40Go%2FGrafcet.Online?node-id=9%3A0&amp;amp;scaling=min-zoom"&gt;▶ Getting Started with Figma Plugin Creation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>figma</category>
      <category>plugin</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Figma Plugin API discovery - Part 1</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sun, 25 Aug 2019 20:49:51 +0000</pubDate>
      <link>https://dev.to/lepinekong/figma-plugin-api-discovery-part-1-45o2</link>
      <guid>https://dev.to/lepinekong/figma-plugin-api-discovery-part-1-45o2</guid>
      <description>&lt;p&gt;Figma announced the availability of a new Plugin API.&lt;/p&gt;

&lt;p&gt;Here's my notes for &lt;a href="https://www.figma.com"&gt;figma&lt;/a&gt; Plugin API discovery - Part 1 (you can try even without Figma account) :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.figma.com/proto/yHQ7r7LDf4LGzqHb6DoZKO/Figma-Plugin-API-Discovery%40Go%2FGrafcet.Online?node-id=1%3A30&amp;amp;scaling=min-zoom"&gt;▶ Figma Plugin API Discovery@Go/Grafcet.Online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LPOmfsMe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/sSFqeCj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LPOmfsMe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/sSFqeCj.png" alt="Grafcet.Online"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/lepinekong/figma-plugin-api-discovery-part-2-82j"&gt;Figma Plugin API discovery - Part 2 - DEV Community 👩‍💻👨‍💻&lt;/a&gt;&lt;/p&gt;

</description>
      <category>figma</category>
      <category>plugin</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Red For Hopeless Programmers III</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sat, 09 Feb 2019 22:18:16 +0000</pubDate>
      <link>https://dev.to/lepinekong/red-for-hopeless-programmers-iii-31a2</link>
      <guid>https://dev.to/lepinekong/red-for-hopeless-programmers-iii-31a2</guid>
      <description>&lt;p&gt;Note: this is a draft, I haven't re-read it yet, if you pinpoint errors, don't hesitate to notify me ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  CRUD Database
&lt;/h2&gt;

&lt;p&gt;This is the 3rd part of the series &lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-i-3g0"&gt;Red for Hopeless Programmers.&lt;/a&gt;&lt;br&gt;
&lt;br&gt;If you haven't yet read them go for part I and part II though I try to make each tutorial understandable standalone for absolute beginner. &lt;br&gt;
&lt;br&gt;Firstable for non coders, CRUD is about operating on datas with these 4 operations: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create Read Update Delete.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Datas can be simple "flat" records like your beloved CSV (Excel text format) file or they can be "nested" or hierarchical which is great for representing real word use cases. &lt;br&gt;
&lt;br&gt;So I'll split this tutorial into 2 sub-series with example on how to create a bookmark database.&lt;br&gt;
&lt;br&gt; III.1 - Create a Bookmark database in CSV format (this article)&lt;br&gt;
&lt;br&gt; III.2 - Create a Bookmark database in Readable Human Format (next article)&lt;/p&gt;
&lt;h3&gt;
  
  
  C - Create
&lt;/h3&gt;

&lt;p&gt;If it is the first record, the file may not even exist. In some programming languages you have to consider this as a special case, in Red, it's automatically created. So let's say you want to write to file:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;bookmarks.csv&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Your code would be&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
write/lines/append %bookmarks.csv line

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;url;title;category;tags&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;for example&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;line: {&lt;a href="https://dev.to/lepinekong/Red-for-hopeless-programmers---part-ii-258;Red"&gt;https://dev.to/lepinekong/Red-for-hopeless-programmers---part-ii-258;Red&lt;/a&gt; for hopeless programmers - Part II;Red;Csv,"Google Chart"}&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you can execute these 2 instructions in console (just copy and paste if you're lazy):&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F-QO757d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YrddyzL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F-QO757d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/YrddyzL.png" alt="https://i.imgur.com/YrddyzL.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;add an other record:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;line: {&lt;a href="https://dev.to/lepinekong/Red-for-hopeless-programmers---part-i-3g0;Red"&gt;https://dev.to/lepinekong/Red-for-hopeless-programmers---part-i-3g0;Red&lt;/a&gt; for hopeless programmers - Part I;Red;GUI}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  R - Read
&lt;/h3&gt;

&lt;p&gt;Read a line knowing the line index is easy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines/:index
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but often you'll have to lookup a record. Let's say you want article "part II". &lt;br&gt;
You'll search the string "part II" in title's column which is second column and once found, you can thenget the index and afterwards the whole record.&lt;br&gt;
&lt;br&gt;This means you'll first have to split each row into column to search second column like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
foreach line lines [
    record: split line ";"
    ?? record
]        

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rrz42RFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/OOERaQw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rrz42RFv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/OOERaQw.png" alt="https://i.imgur.com/OOERaQw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's now search on second column title:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
index: 0
foreach line lines [
    index: index + 1
    record: split line ";"
    title: record/2
    if find title "part II" [
        print ["found at index" index]
    ]
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When running in console, you should find index 1:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fAGtxQNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/RXQLeue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fAGtxQNO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/RXQLeue.png" alt="https://i.imgur.com/RXQLeue.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  U - Update
&lt;/h3&gt;

&lt;p&gt;to be able to update easily, you should first load the database into a block a lines with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines: read/lines %bookmarks.csv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xD8x7GdV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/KM1MhQC.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xD8x7GdV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/KM1MhQC.png" alt="https://i.imgur.com/KM1MhQC.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;as you can see in above picture, to inspect the lines block, you can use&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;?? lines&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want to update a line index, it's the easiest path. Let's say you want to replace line 2 (line counts from index 1 and not 0 unlike arrays in many other languages.), you would write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines/2: update-value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but often you'll have to lookup a record and update it, we have already seen how above, so once record index is found, you can  update her 4th column (tags):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
new-tag: {"Red","Google Chart","Stock Chart"}
index: 0
foreach line lines [
    index: index + 1
    record: split line ";"
    title: record/2
    if find title "part II" [
        print ["found at index" index]
        record/4: new-tag
        ?? record
    ]
] 
?? lines        

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sLCx8Iei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/Kborf9m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sLCx8Iei--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/Kborf9m.png" alt="https://i.imgur.com/Kborf9m.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;if you inspect lines as seen in picture, you should realize something's wrong: it didn't update with updated record. record is independant from original lines. This is where non coders have some difficulties and prefer excel formulas! &lt;br&gt;
We'll need a future tutorial to see how to use another programming model to simulate the magic of excel. It's about Reactive programming which is more conceptual so I won't dare to deal with it right now. &lt;br&gt;
&lt;br&gt;So just admit for neow you have to recreate that line and update lines.&lt;br&gt;
&lt;br&gt;So how do you recreate the line from record? First idea is you have concatenate each column with separator ";"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
new-tag: {"Red","Google Chart","Stock Chart"}
index: 0
index-found: 0
foreach line lines [
    index: index + 1
    record: split line ";"
    title: record/2
    if find title "part II" [
        index-found: index
        print ["found at index" index-found]
        record/4: new-tag
        ?? record
        line: copy ""
        foreach column record [
            line: rejoin [line column ";"]
        ]
        ?? line
        lines/:index-found: line 
    ]
]

?? lines         

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;devil's in the details, you may have forgotten to remove the supplemental ";" for line when concatenating (yet another impediment non coders have to get accustomed to, I'm working on a solution in the future at  alleviating these pesky details for all but that's another story):&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9XCNDU1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/atCQGET.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9XCNDU1b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/atCQGET.png" alt="https://i.imgur.com/atCQGET.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so you have to add an instruction for doing just this using &lt;a href="tail"&gt;&lt;/a&gt;&lt;a href="https://Redlang.Red/tail"&gt;https://Redlang.Red/tail&lt;/a&gt; function &lt;br&gt;
(read explanation there, I wrote that glossary terms to be able to refer to them so as not to interrupt the flow when writing tutorials):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
new-tag: {"Red","Google Chart","Stock Chart"}
index: 0
index-found: 0
foreach line lines [
    index: index + 1
    record: split line ";"
    title: record/2
    if find title "part II" [
        index-found: index
        print ["found at index" index-found]
        record/4: new-tag
        ?? record
        line: copy ""
        foreach column record [
            line: rejoin [line column ";"]
        ]
        head remove back tail line
        ?? line
        lines/:index-found: line 
    ]
]

?? lines         

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JI8IptOt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/gHNdqBq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JI8IptOt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/gHNdqBq.png" alt="https://i.imgur.com/gHNdqBq.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now things seem fine: updating is the hardest!&lt;br&gt;
&lt;br&gt;Unfortunately you have not finished: lines is in memory but not saved on file. We'll see at the end after delete since delete also requires to save data from memory to file (called persistence operation). Fortunately it will be easy: you have seen the most difficult part already.&lt;/p&gt;
&lt;h3&gt;
  
  
  D - Delete
&lt;/h3&gt;

&lt;p&gt;For deleting you have to position the cursor to the record you want to delete and use remove function. &lt;br&gt;
&lt;br&gt;For example let's say, you added a record by mistake&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;write/lines/append %bookmarks.csv {https://dev.to/lepinekong/Red-for-hopeless-programmers---part-i-3g0;Red for Beginners Programmers;Red;Csv;CRUD}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to remove the last line, you have to first load the lines like already seen, then go to last line by skipping n - 1 lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines: read/lines %bookmarks.csv
n: length? lines
lines: skip lines (n - 1)
remove lines
?? lines

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1sKRnwcB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/tI0AgTL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1sKRnwcB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/tI0AgTL.png" alt="https://i.imgur.com/tI0AgTL.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There seems to be a bug since ?? lines is [] but it's the way skip and remove commands work, after remove cursor is AFTER the end of lines so you have to use head to be able to inspect lines in console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines: head lines
?? lines

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9FQlbjJL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/b2Rvu0I.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9FQlbjJL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/b2Rvu0I.png" alt="https://i.imgur.com/b2Rvu0I.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Persistence of block of lines to file
&lt;/h3&gt;

&lt;p&gt;To persiste block of lines, you just do the symetric of read/lines which is write/lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;write/lines %bookmarks.csv lines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WNPhnD61--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/NapDP6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WNPhnD61--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/NapDP6a.png" alt="https://i.imgur.com/NapDP6a.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's all Folks!&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Me1SCFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://vignette.wikia.nocookie.net/looneytunes/images/a/a4/THAT%27SALLGIFS.gif/revision/latest/scale-to-width-down/260%3Fcb%3D20160806162644" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Me1SCFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://vignette.wikia.nocookie.net/looneytunes/images/a/a4/THAT%27SALLGIFS.gif/revision/latest/scale-to-width-down/260%3Fcb%3D20160806162644" alt="https://vignette.wikia.nocookie.net/looneytunes/images/a/a4/THAT'SALLGIFS.gif/revision/latest/scale-to-width-down/260?cb=20160806162644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hey! not so fast..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OK! I hear some of you who had followed &lt;a href="https://dev.to/lepinekong/Red-for-hopeless-programmers---part-i-3g0"&gt;Red.For.Hopeless.Programmers.I&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How to connect the database to the UI?!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It's not about CRUD per se so It's not part of the contract: you can do it yourself as good exercice 😊&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Grr!!!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;OK binding GUI with data is not something trivial in any programming language even in Red. You can try to do it by yourself &lt;br&gt;
or wait for a next tutorial as I said on Reactive Programming (you can do without it's as hard as doing it in Visual Basic but I'm too lazy to do so as for me). &lt;br&gt;
But the concept is not yet clear even in my head, that's why I don't feel like explaining it for now.&lt;/p&gt;

&lt;h3&gt;
  
  
  Relating links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-i-3g0"&gt;Red for hopeless programmers - Part I | dev.to&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-ii-258"&gt;Red for hopeless programmers - Part II | dev.to&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>red</category>
      <category>tutorial</category>
      <category>crud</category>
      <category>csv</category>
    </item>
    <item>
      <title>Red for hopeless programmers - Part II</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Sat, 16 Dec 2017 22:36:27 +0000</pubDate>
      <link>https://dev.to/lepinekong/red-for-hopeless-programmers---part-ii-258</link>
      <guid>https://dev.to/lepinekong/red-for-hopeless-programmers---part-ii-258</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-i-3g0"&gt;In part I&lt;/a&gt;, we learned how to download historical quotes from Google Finance. In part II, we'll learn how to parse  datas and html files to generate a Google Chart.&lt;/p&gt;

&lt;h2&gt;
  
  
  Simple parsing: split quotes lines
&lt;/h2&gt;

&lt;p&gt;To parse a line separated by comma just use split function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lines: read/lines %quotes.csv
line: lines/2; extract 2nd line (first line is header)
quote: split line ","
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a full example the file you downloaded from Google Finance is in Csv format. If you want to process it for example to calculate the 20 moving average, you have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Read the file line by line&lt;br&gt;
meanwhile you need to skip first line of titles&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reverse the order of lines&lt;br&gt;
since the original lines are sorted by descending date &lt;br&gt;
so as to get the lines sorted by ascending date&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Parse each line of quote, &lt;br&gt;
by splitting each line by comma delimiter&lt;br&gt;
and store it into quotes variable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can then calculate the p=20 moving average (MA)&lt;br&gt;
by extracting close column&lt;br&gt;
and cumulate the value&lt;br&gt;
then divide by number of quotes cumulated&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add MA to last column&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optionally write back to another csv file&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;which will translate into Red code as (you can copy and paste the whole code into Red Console if you're too lazy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; init quotes variable so as to store quotes 
quotes: []
; init cum variable so as to store cumulated value of close
cum: 0
; init n variable so as to divide the cumulated value by n
n: 0

; 1. Read the quotes file line by line
lines: read/lines %quotes.csv; -&amp;gt; ["Date,Open,High,Low,Close,Volume" "d1,o1,h1,l1,c1,v1" "d2,o2,h2,l2,c2,v2" ...]

; meanwhile you need to skip "Date,Open,High,Low,Close,Volume" on first line 
lines: skip lines 1

; 2. Reverse the order of lines
; so as to get the lines sorted by ascending date
lines: reverse lines

; 3. Parse each line of quote
foreach line lines [

    ; splitting each line by comma delimiter
    quote: split line ","; -&amp;gt; [date open high low close volume]

    ;For later use if needed convert string to float open high low close volume
    i: 2; starting at column 2 (skipping date column)
    foreach column skip quote 1 [; skip first date column 
      quote/:i: to-float quote/:i; quote:i refers to the ith column of quote
      i: i + 1
    ]

    ; store it into quotes variable
    append/only quotes quote; -&amp;gt; [[d1 o1 h1 l1 c1 v1] [d2 o2 h2 l2 c2 v2] ...]
    ;append adds quote while evaluating expressions inside the brackets, append/only will add quote literally with bracket

    ; 4. Calculate the p=20 moving average for each line
    p: 20
    close: (to-float quote/5); quote/5: close is the 5th column of quote
    cum: cum + close
    n: n + 1
    either (n &amp;lt; p) [
        ma: ""; no moving average
    ][
        ma: cum / n; moving average by dividing by number of quotes cumulated
    ]

    ;5. Add MA to last column
    append quotes/:n ma; :n refer to the nth line of quotes array
    ;-&amp;gt; [
        ;[d1 o1 h1 l1 c1 v1 ma1] 
        ;[d2 o2 h2 l2 c2 v2 ma2] ...
    ;]
]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5kod6scrwz45tfzoxrrc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F5kod6scrwz45tfzoxrrc.png" alt="parse-quotes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Optionally to check quotes you can type this in Red console (to clear screen you can type Ctrl+L):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;print n: length? quotes
print quotes/:n
probe quotes/:n; will keep the brackets and formats
write-clipboard mold quotes; mold format block to string

; to output csv files
write %quotes-ma0.csv ""
write %quotes-ma1.csv ""
write %quotes-ma2.csv ""
foreach quote quotes [
  write/lines/append %quotes-ma0.csv mold quote;
  quote: form quote
  write/lines/append %quotes-ma1.csv quote; space separator
  quote: replace/all quote " " "," ; replace space by comma separator
  write/lines/append %quotes-ma2.csv quote; comma separator
]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fggoauyx1e731axicsoij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fggoauyx1e731axicsoij.png" alt="Check-quotes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Complex parsing: parsing html file
&lt;/h2&gt;

&lt;p&gt;Now let's say you want to show off your quotes with Google Candlestick Chart [&lt;a href="https://developers.google.com/chart/interactive/docs/gallery/candlestickchart" rel="noopener noreferrer"&gt;https://developers.google.com/chart/interactive/docs/gallery/candlestickchart&lt;/a&gt;] &lt;/p&gt;

&lt;p&gt;You need to replace the sample data within drawChart function below with your own data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"&amp;gt;&amp;lt;/script&amp;gt;
      &amp;lt;script type="text/javascript"&amp;gt;
        google.charts.load('current', {'packages':['corechart']});
        google.charts.setOnLoadCallback(drawChart);

    function drawChart() {
      var data = google.visualization.arrayToDataTable([
        ['Mon', 20, 28, 38, 45, 0],
        ['Tue', 31, 38, 55, 66, 0],
        ['Wed', 50, 55, 77, 80, 10],
        ['Thu', 77, 77, 66, 50, 10],
        ['Fri', 68, 66, 22, 15, 10]
        // Treat first row as data as well.
      ], true);

      var options = {
        legend:'none',
        series: {
            1: {
                type: 'line'
            }
    }    
      };

      var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div'));

      chart.draw(data, options);
    }
      &amp;lt;/script&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      &amp;lt;div id="chart_div" style="width: 100%; height: 500px;"&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
  &amp;lt;/html&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Steps are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store the html content in a variable&lt;/li&gt;
&lt;li&gt;Search through string "var data = google.visualization.arrayToDataTable(["&lt;/li&gt;
&lt;li&gt;After string above, Search for string "// Treat first row as data as well."&lt;/li&gt;
&lt;li&gt;Remove sample data between the two strings&lt;/li&gt;
&lt;li&gt;Insert your data between the two strings&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As preliminary, you need to prepare the data in json format by copying and pasting this code in Red Console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;Prepare format quotes in json format required by Google Charts
json-quotes: {}
foreach quote quotes [
  remove back back tail quote; remove volume column 2nd column from tail of quote
  quote: mold quote; format block to string
  quote: replace/all quote " " ","; replace space separator with comma
  quote: replace/all quote {""} "null"; replace empty moving average with null value
  append json-quotes quote; append quote to json
  append json-quotes ","; append json comma separator between each quote
  append json-quotes newline; append json new line separator between each quote
]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fd4ocwh0x6mn292rg0zw5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fd4ocwh0x6mn292rg0zw5.png" alt="json-quotes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Afterwards copy the html template above to template.html.&lt;br&gt;
You can then read and parse the html content using that rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;1. Store the html content in a variable
html-content: read %template.html

parse-rule: [

    ;2. Search through string "var data = google.visualization.arrayToDataTable(["
    thru {var data = google.visualization.arrayToDataTable([} start:

    ;3. Then search for string "// Treat first row as data as well."
    to {// Treat first row as data as well.} end:

    ; do not forget to enclose these actions between parenthesis
    ; or it won't work 
    (
      ;4. Remove sample data between the two strings
      change/part start "" end

      ;5. Insert your data between the two strings
      insert start json-quotes
    )

]

parse html-content parse-rule
write %chart.html html-content

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fn5987l4o87g92d7ctvm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fn5987l4o87g92d7ctvm8.png" alt="parse-html"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you run chart.html you should get this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F87a4925rz1ooy79n8fhq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F87a4925rz1ooy79n8fhq.png" alt="chart"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whole source code you can copy and paste in Red Console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
; init quotes variable so as to store quotes 
quotes: []
; init cum variable so as to store cumulated value of close
cum: 0
; init n variable so as to divide the cumulated value by n
n: 0

; 1. Read the quotes file line by line
lines: read/lines %quotes.csv; -&amp;gt; ["Date,Open,High,Low,Close,Volume" "d1,o1,h1,l1,c1,v1" "d2,o2,h2,l2,c2,v2" ...]

; meanwhile you need to skip "Date,Open,High,Low,Close,Volume" on first line 
lines: skip lines 1

; 2. Reverse the order of lines
; so as to get the lines sorted by ascending date
lines: reverse lines

; 3. Parse each line of quote
foreach line lines [

    ; splitting each line by comma delimiter
    quote: split line ","; -&amp;gt; [date open high low close volume]

    ;For later use if needed convert string to float open high low close volume
    i: 2; starting at column 2 (skipping date column)
    foreach column skip quote 1 [; skip first date column 
      quote/:i: to-float quote/:i; quote:i refers to the ith column of quote
      i: i + 1
    ]

    ; store it into quotes variable
    append/only quotes quote; -&amp;gt; [[d1 o1 h1 l1 c1 v1] [d2 o2 h2 l2 c2 v2] ...]
    ;append adds quote while evaluating expressions inside the brackets, append/only will add quote literally with bracket

    ; 4. Calculate the p=20 moving average for each line
    p: 20
    close: (to-float quote/5); quote/5: close is the 5th column of quote
    cum: cum + close
    n: n + 1
    either (n &amp;lt; p) [
        ma: ""; no moving average
    ][
        ma: cum / n; moving average by dividing by number of quotes cumulated
    ]

    ;5. Add MA to last column
    append quotes/:n ma; :n refer to the nth line of quotes array
    ;-&amp;gt; [
        ;[d1 o1 h1 l1 c1 v1 ma1] 
        ;[d2 o2 h2 l2 c2 v2 ma2] ...
    ;]
]


json-quotes: {}
foreach quote quotes [
  remove back back tail quote; remove volume column 2nd column from tail of quote
  quote: mold quote; format block to string
  quote: replace/all quote " " ","; replace space separator with comma
  quote: replace/all quote {""} "null"; replace empty moving average with null value
  append json-quotes quote; append quote to json
  append json-quotes ","; append json comma separator between each quote
  append json-quotes newline; append json new line separator between each quote
]


;1. Store the html content in a variable
html-content: read %template.html

parse-rule: [

    ;2. Search through string "var data = google.visualization.arrayToDataTable(["
    thru {var data = google.visualization.arrayToDataTable([} start:

    ;3. Then Search for string "// Treat first row as data as well."
    to {// Treat first row as data as well.} end:

    ; do not forget to enclose these actions between parenthesis
    ; or it won't work 
    (
      ;4. Remove sample data between the two strings
      change/part start "" end

      ;5. Insert your data between the two strings
      insert start json-quotes
    )

]

parse html-content parse-rule

write %chart.html html-content

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>red</category>
      <category>rebol</category>
      <category>googlefinance</category>
      <category>newlanguage</category>
    </item>
    <item>
      <title>Red for hopeless programmers - Part I</title>
      <dc:creator>lepinekong</dc:creator>
      <pubDate>Tue, 07 Nov 2017 17:03:01 +0000</pubDate>
      <link>https://dev.to/lepinekong/red-for-hopeless-programmers---part-i-3g0</link>
      <guid>https://dev.to/lepinekong/red-for-hopeless-programmers---part-i-3g0</guid>
      <description>

&lt;p&gt;&lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-ii-258"&gt;Part II&lt;/a&gt; is available.&lt;/p&gt;

&lt;p&gt;So you wanna learn to code ? You tried hard to tackle C++, C#, Java or even Python or Javascript but soon realise you still can't do any practical stuff like reading historical quotes from Google Finance  to analyse your favorite stocks or just creating a simple recipes database for your mom or teach your own kid how to program.&lt;/p&gt;

&lt;p&gt;You hopelessly gave up, happily I'm a great soul and want to save you from despair thanks to a little gem : Red. &lt;/p&gt;

&lt;h1&gt;
  
  
  What is Red ?
&lt;/h1&gt;

&lt;p&gt;Because you're in a hurry, I'll tell you shortly that &lt;a href="https://www.red-lang.org/"&gt;Red&lt;/a&gt; (download it &lt;a href="https://www.red-lang.org/p/download.html"&gt;here&lt;/a&gt;) is a new programming language which is strongly compatible with a not so new programming language named Rebol. So if you're searching for some answers on Red, you may search for Rebol also.&lt;/p&gt;

&lt;p&gt;The reasons why Rebol is so unknown are unfortunate, I could extend on these but another time maybe. Be assured that after reading this tutorial, you'd probably agree it deserves better recognition - though JSON's inventor, Douglas Crockford, made a great tribute to Carl Sassenrath [&lt;a href="http://www.rebol.com/cgi-bin/blog.r?view=0423"&gt;http://www.rebol.com/cgi-bin/blog.r?view=0423&lt;/a&gt;], Rebol's Creator (who'd also been Amiga's OS Architect).&lt;/p&gt;

&lt;h1&gt;
  
  
  What amazing stuffs you'll learn here
&lt;/h1&gt;

&lt;p&gt;You'll learn these practical stuffs :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;How to download historical quotes from Google Finance (part I)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to easily do webscraping in a few lines instead of dozens in others languages  (&lt;a href="https://dev.to/lepinekong/red-for-hopeless-programmers---part-ii-258"&gt;part II&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to create a simple to-do-list or recipes database app for your mom  (part III)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to send keystrokes to automate your favorite windows's application  (part IV)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Getting Started
&lt;/h1&gt;

&lt;p&gt;To get started:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Download Red Language Platform for Windows from [&lt;a href="http://www.red-lang.org/p/download.html"&gt;http://www.red-lang.org/p/download.html&lt;/a&gt;]. You can try other platforms like MacOSX or Linux on your own because I haven't tested them yet. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install Red&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch Red&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3B_inlZq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ixhuw8gyqq9ky0djma67.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3B_inlZq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ixhuw8gyqq9ky0djma67.png" alt="Red Console"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll then be in Red Console where you can directly type the program below.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to download historical quotes from Google Finance
&lt;/h1&gt;

&lt;p&gt;In plain english, the steps are :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Read the url to get the quotes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memorize the quotes in a memory variable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write the quotes contained in the variable to a csv file&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can literally translate that into Red code by typing the code below in Red Console (if you're too lazy, you can also just copy and paste them into red console):&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; 1. Read the url to get the quotes

Read http://finance.google.com/finance/historical?output=csv&amp;amp;q=AAPL 

; 2. Memorize the quotes in a memory variable

quotes: Read http://finance.google.com/finance/historical?output=csv&amp;amp;q=AAPL 

; 3. Write the quotes contained in the variable to a csv file

write %quotes.csv quotes

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;So a few remarks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In Red, you can put a comment in the code with ";" &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To assign a content or value to a variable, use ":" after the variable name&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A file path must be prefixed with % for example %quotes.csv&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Steps 1 &amp;amp; 2 can be done in one single step in Red so that the program is just:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;; 1&amp;amp;2. Read the quotes url &amp;amp; Memorize the quotes in a memory variable

quotes: Read http://finance.google.com/finance/historical?output=csv&amp;amp;q=AAPL 

; 3. Write the quotes contained in the variable to a csv file

write %quotes.csv quotes

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can check in Red current directory that quotes.csv is there. To know that current directory, type&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;what-dir

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  How to choose the start date
&lt;/h2&gt;

&lt;p&gt;You may want to download quotes only after some start date. In that case, you can ask that input to the user (when you use ask, you must paste only one line at a time, to erase console use "Ctrl L" while maintaining Ctrl Key):&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url-base: http://finance.google.com/finance/historical?output=csv&amp;amp;q=AAPL

start-date: ask {Start date (YYYY-MM-DD): }

url: rejoin [url-base {&amp;amp;startdate=} start-date]

quotes: Read url

write %quotes.csv quotes

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iaUjahRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izp0j0twr5564s4lef39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iaUjahRc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/izp0j0twr5564s4lef39.png" alt="Ask-Date"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explanations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did I use {} instead of "" to represent a string value ? Actually you could use "" in Red but {} is more powerfull as it can contain multiple lines string and embed both "" and {} inside it for example:&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Explanation: {Why did I use {} instead of "" to represent a string value ? 
In fact you can use "" in Red but {} is more powerfull 
as it can contain multiple lines string and embed both "" and {} inside it}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In other programming languages you often have to use so-called "escape sequences" to include double quote " or single quote '.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To concatenate strings you can use rejoin like in the example:&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url: rejoin [url-base {&amp;amp;startdate=} date]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Rejoin argument must be enclosed within a block delimited by []&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercice: Ask user's inputs for Stock symbol, Start date and End date
&lt;/h2&gt;

&lt;p&gt;You can now do a similar exercice with Symbol, Start-Date and End-Date as parameter:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Read http://finance.google.com/finance/historical?output=csv&amp;amp;q={stock-symbol}&amp;amp;startdate={start-date}&amp;amp;enddate={end-date}

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  How to show a Dialog Box for asking user's inputs
&lt;/h2&gt;

&lt;p&gt;Instead of using "Ask" function in the console for user's inputs, you could use a Dialog Box. &lt;/p&gt;

&lt;p&gt;The most basic dialog box in Red is just an empty block you can name whatever you like (avoid form though as it is a standard function [&lt;a href="http://www.rebol.com/docs/words/wform.html%5D"&gt;http://www.rebol.com/docs/words/wform.html]&lt;/a&gt;), for example win like window:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: []
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It won't shows up until you use view command:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;view win
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hxa5F43A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d4zkrp51ros25mlt0ob6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hxa5F43A--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/d4zkrp51ros25mlt0ob6.png" alt="Empty Form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The reason being you can compose your form beforehand and only when it's complete, you'll show the form layout to the end user.&lt;/p&gt;

&lt;p&gt;So let's compose our layout: we need &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;1 stock symbol field&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2 dates fields (start date and end date) &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;1 OK button&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The simplest version of form is:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: []

append win [field field field button]

view win

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--T1-B4iaV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ylcattzxuyzot432mijq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--T1-B4iaV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ylcattzxuyzot432mijq.png" alt="Basic Form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A nicer window with labels (with text keyword) and vertical alignment (with return keyword) is:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: []

append win [text "stock symbol:"]

append win [field]

append win [return]

append win [text "start date:"]

append win [field]

append win [return]

append win [text "end date:"]

append win [field]

append win [return]

append win [button "OK"]

view win

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pPWsQ5aj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1u5vq4lzi4hlrbx0h1hx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pPWsQ5aj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/1u5vq4lzi4hlrbx0h1hx.png" alt="Nicer Form"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you don't need to generate your window dynamically (which is very usefull in real application that's why I showed you that way first), you can just compose your form in compact static way:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: [
    text "stock symbol:" field
    return
    text "start date:" field
    return
    text "end date:" field
    return
    button "OK"
]
view win

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bL8KT8cs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rg76swae9y1rn5xzyt1e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bL8KT8cs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rg76swae9y1rn5xzyt1e.png" alt="Nicer Form Compact"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now when clicking on the "OK" button, the form must close with "unview" so modify the code line by adding a block code like this :&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;button "OK" [unview]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;so that the full code is now:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: [
    text "stock symbol:" field
    return
    text "start date:" field
    return
    text "end date:" field
    return
    button "OK" [unview]
]
view win

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;When the windows closes, you have to get the text value of each field, so you have to name these fields first to be able to refer to them in button "OK" code block:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;win: [
    text "stock symbol:" stock-symbol: field
    return
    text "start date:" start-date: field
    return
    text "end date:" end-date: field
    return
    button "OK" [
        unview 
        print [stock-symbol/text start-date/text end-date/text]
    ]
]
view win

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Above for testing purpose, we're just printing the values in console with &lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    print [stock-symbol/text start-date/text end-date/text]

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;/text for a field means we're refering to the text property value of the field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D3umZo-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/puoe4ev95pl0d4d6e13x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D3umZo-5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/puoe4ev95pl0d4d6e13x.png" alt="fields values"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking the OK button, the console should print the values of the fields:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m4HQble4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m1qsexuh32xleagxysh5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m4HQble4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/m1qsexuh32xleagxysh5.png" alt="test ok"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;We can now replace the print instruction with the code for downloading the quotes. &lt;/p&gt;

&lt;p&gt;For that purpose we'll call a function named "download-quotes" by passing the stock-symbol, the start-date and the end-date:&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;;ask user's inputs:
win: [
    text "stock-symbol" stock-symbol: field
    return
    text "start-date" start-date: field
    return
    text "end-date" end-date: field
    return
    button "OK" [
        unview 
        quotes: download-quotes stock-symbol/text start-date/text end-date/text
        write %quotes.csv quotes
        print "quotes.csv"
    ]
]
view win

;downloading quotes:

download-quotes: function[stock-symbol start-date end-date][

    url-base: http://finance.google.com/finance/historical?output=csv

    url: rejoin [url-base {&amp;amp;q=} stock-symbol 
                {&amp;amp;startdate=} start-date 
                {&amp;amp;enddate=} end-date]

    quotes: Read url    
    return quotes
]

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;That's all Folks for part I. If you like this tutorial, I may start part II soon :)&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rebol Read function [&lt;a href="http://www.rebol.com/docs/words/wread.html"&gt;http://www.rebol.com/docs/words/wread.html&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rebol Write function [&lt;a href="http://www.rebol.com/docs/words/wwrite.html"&gt;http://www.rebol.com/docs/words/wwrite.html&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to Create and Use Text Fields [&lt;a href="http://www.rebol.com/how-to/fields.html"&gt;http://www.rebol.com/how-to/fields.html&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Beginner's Guide to REBOL Visual Interfaces (VID) [&lt;a href="http://rebol.com/docs/easy-vid.html"&gt;http://rebol.com/docs/easy-vid.html&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;REBOL/View VID Developer's Guide [&lt;a href="http://www.rebol.com/docs/view-guide.html"&gt;http://www.rebol.com/docs/view-guide.html&lt;/a&gt;]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


</description>
      <category>red</category>
      <category>beginners</category>
      <category>learntocode</category>
      <category>programminglanguage</category>
    </item>
  </channel>
</rss>
