<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Cloud on sunbro.dev</title><link>https://sunbro.dev/tags/cloud/</link><description>Recent content in Cloud on sunbro.dev</description><generator>Hugo -- 0.131.0</generator><language>en</language><lastBuildDate>Thu, 09 Mar 2023 22:24:07 +0000</lastBuildDate><atom:link href="https://sunbro.dev/tags/cloud/index.xml" rel="self" type="application/rss+xml"/><item><title>Presenting Nocode: The future of programming</title><link>https://sunbro.dev/posts/2020-10-10-nocode-writeup/</link><pubDate>Sat, 10 Oct 2020 20:09:00 +0100</pubDate><guid>https://sunbro.dev/posts/2020-10-10-nocode-writeup/</guid><description>A simple way to write clean single-file code without taking up disk space</description><content:encoded><![CDATA[<h2 id="idea">Idea</h2>
<p>The initial idea comes from a discussion with friends over dinner a couple of
nights ago, when we realized <code>ar(1)</code> can read input from <code>STDIN</code>. While we were
wondering why that would be useful and what it could be used for, one of use
mentioned that <code>gcc(1)</code> can also read input from <code>STDIN</code>. From there, the
conversation derailed into how to &ldquo;misuse&rdquo; that feature in order to do something
completely over the top and useless.</p>
<p>Inspired by Kelsey Hightower&rsquo;s 
<a href="https://github.com/kelseyhightower/nocode" target="_blank" >nocode</a> idea, we wanted to
use <code>gcc(1)</code> to write our code directly on <code>STDIN</code>, compile it, and, if successful,
add and commit it to a git repo. Obviously doing all of this by hand wouldn&rsquo;t cut
it, so all of it had to be &ldquo;automated&rdquo; or neatly wrapped into a useable script.</p>
<p>Which then gave birth to <code>Nocode: A simple way to write clean single-file code without taking up disk space</code>.</p>
<h2 id="implementation">Implementation</h2>
<p><code>Nocode</code> is essentialy a bash script which wraps all of the useful steps.</p>
<p>It starts of by creating and filling a <code>.gitignore</code> file if none exist, as to
not create git clutter with the following steps.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> ! -f <span class="s2">&#34;.gitignore&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;a.out&#34;</span> &gt;&gt; <span class="s2">&#34;.gitignore&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="k">$(</span><span class="nb">echo</span> -n <span class="s2">&#34;*.c&#34;</span> &gt;&gt; <span class="s2">&#34;.gitignore&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>The script then goes on to read the code from <code>STDIN</code>, in order to compiling it.
Before passing the input to <code>gcc(1)</code> it is first given to <code>clang-format</code> in
order to apply the coding style the user wants. This is then input to <code>tee(1)</code> in
order to save it until it is committed to our git repository, and finally into
<code>gcc(1)</code> for compilation.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># &#34;$ARG&#34; is equal to the first argument given to Nocode</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span>clang-format <span class="p">|</span> tee <span class="s2">&#34;</span><span class="nv">$ARG</span><span class="s2">&#34;</span> <span class="p">|</span> gcc -x c -<span class="k">)</span>
</span></span></code></pre></div><p>The next step is to check if the script was called in a git repository, if not
the user is prompted to initialize one. If the user refuses, the script stops and
the generated C file is saved.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check if we&#39;re it a git repository</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span>git status <span class="p">&amp;</span>&gt;/dev/null<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$?</span><span class="s2">&#34;</span> -ne <span class="m">0</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">read</span> -p <span class="s2">&#34;Not a git repository, do you want to create one? [Y/n] &#34;</span> USERCREATEGITINPUT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$USERCREATEGITINPUT</span><span class="s2">&#34;</span> <span class="o">=</span> <span class="s2">&#34;n&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;nocode.sh: leaving file as is&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">exit</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">$(</span>git init <span class="p">&amp;</span>&gt;/dev/null<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span></code></pre></div><p>To finish everything off, the file is added and committed to the repository before
finally being deleted.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Perform all git actions except push, left up to the user</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span>git add <span class="s2">&#34;</span><span class="nv">$ARG</span><span class="s2">&#34;</span> <span class="p">&amp;</span>&gt;/dev/null<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span>git commit -m <span class="s2">&#34;</span><span class="nv">$ARG</span><span class="s2">: update&#34;</span> <span class="p">&amp;</span>&gt;/dev/null<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Remove file because we&#39;re #NoCodeCompliant</span>
</span></span><span class="line"><span class="cl"><span class="k">$(</span>rm <span class="s2">&#34;</span><span class="nv">$ARG</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span></code></pre></div><p>Of course, not all of the boilerplate is presented here because it is not very
interesting. The scource code is available on 
<a href="https://github.com/quentin-dev/nocode" target="_blank" >GitHub</a>. Issues
and PRs are welcome!</p>
<h2 id="usage">Usage</h2>
<p>All you have to do to use <code>Nocode</code> is call it with the filename you want to
save, as follows:</p>
<p><code>./nocode.sh filename.c</code></p>
<p>Once you are done writing your code on <code>STDIN</code>, you can use <code>CTRL+D</code> to send
an <code>EOF</code> in order to tell <code>clang-format</code> that you are done typing.</p>
<p>Pushing the code to the repository&rsquo;s remote is left up to the user in order to
avoid dealing with git credentials.</p>
]]></content:encoded></item></channel></rss>