Jekyll2021-01-12T13:16:54-06:00https://www.gavingreer.com//Gavin GreerPersonal website and blog for cataloging projects, techy things and other stuff I've learned. Gavin GreerSynology Settings for NFS2020-03-06T00:00:00-06:002020-03-06T00:00:00-06:00https://www.gavingreer.com/2020/03/06/synology-nfs-mount<p>I’ve been using a Synology NAS on my home network for several years. They make a great product for anyone who wants a simple NAS with lots of flexibility. I use it to pass files between systems on my network quite a bit. Here’s a quick walkthrough of settings within Synology’s DSM to enable mounting the NAS over the network.<br />
<!--more--></p>
<p>Synology allows you to create Shared Folders each with its own settings for permissions, sharing, encryption, ect. You can think of these as separate logical volumes all on the same NAS device. I’ve got shares for backups, files, photos, Plex, and a home share for each user.</p>
<p><em>For these steps, I’m running Synology DSM version 6.2.2-24922 Update 4 on a DS216j. Most of the guides on Synology’s own site are outdated, referencing DSM 5 or earlier.</em></p>
<p>In this example, I’ll be creating a shared folder called <code class="highlighter-rouge">backups</code>, granting NFS permissions for and mounting it to my RaspberryPi.</p>
<ol>
<li><a href="#create-the-shared-folder">Create the Shared Folder</a></li>
<li><a href="#edit-shared-folder-nfs-permissions">Edit Shared Folder NFS Permissions</a></li>
<li><a href="#enable-nfs-access-through-the-synology-firewall">Enable NFS Access through the Synology Firewall</a></li>
<li><a href="#mount-nas-folder-to-the-pi">Mount NAS folder to the Pi</a></li>
</ol>
<h2 id="create-the-shared-folder">Create the Shared Folder</h2>
<p>Navigate to the Synology DSM, open the Control Panel and select Shared Folder.</p>
<ul>
<li>Click Create and follow the Wizard prompts. I typically agree to the default values with the exception of disabling the Recycle Bin.
<img src="/assets/img/create-share.png" alt="create-share" /></li>
</ul>
<h2 id="edit-shared-folder-nfs-permissions">Edit Shared Folder NFS Permissions</h2>
<p>Once the folder has been created, we have to allow NFS access for the RaspberryPi to connect to the shared folder on the Synology NAS. We do this by adding an NFS rule mapped to the IP address of the Pi (<code class="highlighter-rouge">192.168.1.62</code>).</p>
<ul>
<li>Select the <code class="highlighter-rouge">backups</code> Shared folder and click Edit > NFS Permissions.
<img src="/assets/img/control-panel.png" alt="control-panel" />
<ul>
<li><strong>Note:</strong>Make note of the folder mount path at the bottom left of this window. We’ll need this later.<br />
<img src="/assets/img/mount-path.png" alt="mount-path" /></li>
</ul>
</li>
<li>Click Create and match these settings (changes in <strong>bold</strong>):
<ul>
<li><strong>Hostname or IP*: Enter the local IP address (mine is <code class="highlighter-rouge">192.168.1.62</code>)</strong>
<ul>
<li><em>If you want to open access to this folder from all machines on your local network, use the <code class="highlighter-rouge">*</code> wildcard instead of the specific LAN IP address.</em></li>
</ul>
</li>
<li>Privilege: Read/Write (default)</li>
<li><strong>Squash: Select “Map root to admin” from the drop down menu</strong></li>
<li>Security: sys (default)</li>
<li>Select Enable asynchronous (default)</li>
<li>Deselect Allow connection from non-privileged… (default)</li>
<li><strong>Select the checkbox for “Allow users to access mounted subfolders”</strong>
<img src="/assets/img/nfs-rule.png" alt="nfs-rule" /></li>
</ul>
</li>
<li>Click OK. Click OK.</li>
</ul>
<h2 id="enable-nfs-access-through-the-synology-firewall">Enable NFS Access through the Synology Firewall</h2>
<p>If you have the Synology NAS built in firewall active, you’ll need to enable rules to allow the required NFS ports. <em>If your firewall is disabled, you can skip this step.</em></p>
<ul>
<li>Check your firewall status in the DSM Control Panel under the Security > Firewall tab.
<img src="/assets/img/cp-firewall.png" alt="cp-firewall" /></li>
<li>Click Edit Rules > Create</li>
<li>Under Ports choose Select from a list of built-in applications and click Select. Find Mac/Linux file server and check the box to enable.
<img src="/assets/img/firewall-nfs.png" alt="firewall-nfs" /></li>
<li>If you plan to use this shared folder with Windows machines as well, enable the Windows file server too.</li>
<li>Click OK.</li>
<li>Under Action, select Allow.</li>
<li>Click OK.</li>
<li>Make sure the Enabled check box is checked for the created rule, and Click OK.</li>
<li>Click Apply.</li>
</ul>
<h2 id="mount-nas-folder-to-the-pi">Mount NAS folder to the Pi</h2>
<ul>
<li>First, update the local package index and install <code class="highlighter-rouge">nfs-common</code>.
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>apt update
<span class="nv">$ </span><span class="nb">sudo </span>apt <span class="nb">install </span>nfs-common
</code></pre></div> </div>
</li>
<li>Create a folder on the Pi that will be used as a mount point where we will attach the NAS. This can be anywhere on your system. Typically, mounted volumes are placed in the <code class="highlighter-rouge">/mnt</code> folder. I’m keeping it simple here.
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo mkdir</span> /mnt/backups
</code></pre></div> </div>
</li>
<li>
<p>Attach the NAS shared folder</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>mount <nas.ip.address>:[/share/mount-path] <span class="o">[</span>/mnt/point]
</code></pre></div> </div>
<p>Using my values, here’s the script I executed. Replace these with your values. No response is expected from this command.</p>
<ul>
<li>Remember the mount path from earlier? - <code class="highlighter-rouge">/volume1/backups</code></li>
<li>RaspberryPi mount point - <code class="highlighter-rouge">/mnt/backups</code></li>
<li>
<p>NAS IP - <code class="highlighter-rouge">192.168.1.30</code>.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>mount 192.168.1.30:/volume1/backups /mnt/backups
</code></pre></div> </div>
</li>
<li>If you get a <code class="highlighter-rouge">no such file or directory</code> error, make sure you’re using <code class="highlighter-rouge">sudo</code> and double check the IP address, NAS mount path and local mount point.</li>
<li>if you get a <code class="highlighter-rouge">Timed out</code> error, check your <a href="#enable-nfs-access-through-the-synology-firewall">Synology firewall</a> settings.</li>
</ul>
</li>
<li>Verify the mount was successful by checking the attached disks (<code class="highlighter-rouge">df</code>) and searching for the mount point we created on the Pi (<code class="highlighter-rouge">grep /mnt/backups</code>).
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span><span class="nb">df</span> <span class="nt">-h</span> | <span class="nb">grep</span> /mnt/backups
</code></pre></div> </div>
</li>
<li>If successful, it will return something like this:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> 192.168.1.30:/volume1/backups 5.4T 3.7T 1.8T 68% /mnt/backups
</code></pre></div> </div>
</li>
</ul>
<h2 id="done">Done</h2>
<p>Not too bad! You now have access to the shared folder to use it however you need. You can also mount other shares by creating new mount points and following the same set of instructions to enable NFS access. Using the same RaspberryPi and Synology NAS, I have <code class="highlighter-rouge">/mnt/backups</code> and <code class="highlighter-rouge">/mnt/files</code> attached for different purposes. Neat!</p>
<p>Let me know if you have questions or if there’s something I missed.</p>Gavin GreerI’ve been using a Synology NAS on my home network for several years. They make a great product for anyone who wants a simple NAS with lots of flexibility. I use it to pass files between systems on my network quite a bit. Here’s a quick walkthrough of settings within Synology’s DSM to enable mounting the NAS over the network.Change Linux Hostname2020-02-28T00:00:00-06:002020-02-28T00:00:00-06:00https://www.gavingreer.com/tutorial/linux/2020/02/28/set-hostname<p>This quick guide outlines the steps needed to check and update the hostname of a server running Linux.
<!--more--></p>
<p>For this walk through, I’ll be sharing examples running Ubuntu 18.04.4 LTS. The commands are compatible across many distros. I use VIM, but nano commands will work just as well.</p>
<p>Also, this is the first post with user comments enabled. Test it for me and let me know if there are issues.</p>
<p>Let’s get started.</p>
<h2 id="view-current-hostname">View current hostname</h2>
<p>There are a couple of quick ways to view the host name.</p>
<h3 id="bash-prompt">Bash Prompt</h3>
<p>By default, many operating systems use the hostname as part of the shell prompt.</p>
<p><img src="/assets/img/set-hostname-01.png" alt="shell prompt" /></p>
<p>In this example, the green text of the bash prompt <code class="highlighter-rouge">gavin@mars</code> is in the format <code class="highlighter-rouge">[user]@[hostname]</code>. This isn’t always the case since the prompt can be customized through the user profile.</p>
<h3 id="hostname-command"><code class="highlighter-rouge">hostname</code> command</h3>
<p>Simply enter the command:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">hostname</span>
</code></pre></div></div>
<p>Or read the hostname file:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">cat</span> /etc/hostname
</code></pre></div></div>
<p><img src="/assets/img/set-hostname-02.png" alt="hostname prompt" /></p>
<h2 id="change-the-hostname">Change the hostname</h2>
<p>Set the hostname. It can be anything. I’m using <code class="highlighter-rouge">mars</code> in this example. The <code class="highlighter-rouge">sudo</code> command may be required based on user.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"mars"</span> <span class="o">></span> /etc/hostname
<span class="nv">$ </span><span class="nb">hostname</span> <span class="nt">-F</span> /etc/hostname
</code></pre></div></div>
<p>Verify the change</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">hostname
</span>mars
</code></pre></div></div>
<p>Reboot</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>shutdown <span class="nt">-r</span> 0
</code></pre></div></div>
<p>Your hostname is now updated.</p>
<h2 id="set-the-fqdn">Set the FQDN</h2>
<p>For bonus points, you can also set a fully-qualified domain name (FQDN). This is useful for accessing your VPS over the internet. You will need a registered domain name and access to edit the DNS records.</p>
<p>Edit the <code class="highlighter-rouge">/etc/hosts</code> file. <code class="highlighter-rouge">sudo</code> maybe required.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>vi /etc/hosts
</code></pre></div></div>
<p>Add the following as a new line at the end after everything that’s in this file by default. Replace <code class="highlighter-rouge">mars</code>, <code class="highlighter-rouge"><server.ip></code> and <code class="highlighter-rouge"><domain-name></code> with your values.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><server.ip> mars.<domain-name>.com mars
</code></pre></div></div>
<p>Your file should now look something like this. Its ok if yours has other values.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>127.0.0.1 localhost
<span class="c"># The following lines are desirable for IPv6 capable hosts</span>
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
<server.ip> mars.<domain-name>.com mars
</code></pre></div></div>
<p>Verify the change</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">hostname</span> <span class="nt">-f</span>
mars.<domain-name>.com
</code></pre></div></div>
<p>In order for this to be accessible over the public internet, you’ll need to add an A record to your domain’s DNS. This A (or Alias) record will route all requests to the chosen FQDN to your server’s IP address. This will vary by registrar, but you’ll create a new host record for <code class="highlighter-rouge"><domain-name>.com</code> with the following:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Type Host Value
A Record mars <server.ip>
</code></pre></div></div>
<p>Once this has had a chance to propagate through the DNS servers, you can access your VPS using the FQDN. Like this:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>ssh mars.<domain-name>.com
</code></pre></div></div>
<h3 id="easy-win">Easy win</h3>
<p>Your server now has +10 cool points and as a bonus, you can actually remember the address to access over SSH. Let me know if I missed anything or if you have questions!</p>Gavin GreerThis quick guide outlines the steps needed to check and update the hostname of a server running Linux.Links of the Week #22020-02-21T00:00:00-06:002020-02-21T00:00:00-06:00https://www.gavingreer.com/links%20of%20the%20week/2020/02/21/this-week-002<p>Edition #2 // February 21, 2020<br />
Here’s what I’ve been reading and watching this week.
<!--more--></p>
<h2><a href="https://www.si.com/mlb/2020/02/20/astros-cheating-scandal-clayton-kershaw">Astros' Cheating Haunts Clayton Kershaw's Memory of 2017 World Series</a><em><span style="font-size: smaller;"> - Sports Illustrated</span></em></h2>
<p>
<strong>tl;dr</strong>
<br />
I'm a big Clayton Kershaw fan and this just makes me sad. Kershaw has a reputation for being completely dominant in the regular season, but choking in the post-season. 2017 looked to be the year he turned that around. That is, until he played a game against the Astros at Minute Maid park in Game 5 of the World Series. Kershaw gave up two leads and the Dodgers lost the game and eventually the Series. The recent news that the Astros cheated in 2017 puts all of this in a new and very ugly light. To his credit, Kershow is doing his part to move past it.
</p>
<hr />
<h2><a href="https://www.hanselman.com/blog/CoolWSLWindowsSubsystemForLinuxTipsAndTricksYouOrIDidntKnowWerePossible.aspx">Cool WSL tips and tricks you (or I) didn't know were possible</a><em><span style="font-size: smaller;"> - Scott Hanselman</span></em></h2>
<p>
<strong>tl;dr</strong>
<br />
This article looks at a few examples of the new tools available in WSL2. The tight integration with VS Code is very cool. You can run multiple Linux distros side by side and even migrate Linux installations between Windows systems with just a few Powershell commands. He mentions <a href="https://www.microsoft.com/en-us/p/windows-terminal-preview/9n0dx20hk701">Windows Terminal</a> and I'd also recommend checking it out. You can tell Scott gets a kick out of this stuff. He seems to have fun with it.
</p>
<hr />
<h2><a href="https://clementc.github.io/blog/2018/01/25/moving_cli/">Moving efficiently in the CLI</a><em><span style="font-size: smaller;"> - CLÉMENT CHASTAGNOL</span></em></h2>
<p><img style="margin-bottom: 15px" alt="moving_cli" src="https://clementc.github.io/figures/moving_cli.png" /></p>
<p>
<strong>tl;dr</strong>
<br />
I originally saw this on Twitter. It's a handy reference for quickly navigating through text in the CLI. I didn't know most of these keyboard shortcuts. Neat.
</p>Gavin GreerEdition #2 // February 21, 2020 Here’s what I’ve been reading and watching this week.Links of the Week #12020-02-14T00:00:00-06:002020-02-14T00:00:00-06:00https://www.gavingreer.com/links%20of%20the%20week/2020/02/14/this-week<p>Edition #1 // February 14, 2020<br />
Here’s what I’ve been reading and watching this week.
<!--more--></p>
<h2><a href="https://www.theverge.com/2020/2/11/21132826/microsoft-windows-10x-features-dual-screen-foldable-hands-on-developers">A first look at Microsoft’s new Windows 10X operating system for dual screens</a><em><span style="font-size: smaller;"> - The Verge</span></em></h2>
<p>
<strong>tl;dr</strong>
<br />
Microsoft announced two dual screen devices late in 2019: the laptop sized Surface Neo and the dual screen smartphone Surface Duo. There's lots to get excited about with these devices. Although dual screen laptop prototypes and even production models have existed in the past, it was without native Windows OS support. This article, walks through the new Windows 10X designed for dual, hinged devices. Overall, it looks great. I'm excited to see what else they do with it.
</p>
<hr />
<h2><a href="https://youtu.be/-DtSrdh5dHU">Are we at Peak Smartphone?</a><em><span style="font-size: smaller;"> - MKBHD - YouTube</span></em></h2>
<!-- Feel free to change the width and height to your desired video size. -->
<div class="embed-container">
<iframe src="https://www.youtube.com/embed/-DtSrdh5dHU" width="700" height="480" frameborder="0" allowfullscreen="">
</iframe>
</div>
<p>
<strong>tl;dr</strong>
<br />
Somewhat predictably, Marques' response is both yes and no. I think that yeah, we might be at peak smartphone in the current "glass sandwich" form factor. Where I differ might be in the things he mentions as "outer edge". Are folding phones better? Time will tell. His comparison to "peak car" is interesting too.
</p>
<hr />
<h2><a href="https://itsfoss.com/change-default-terminal-ubuntu/">How to Change the Default Terminal in Ubuntu</a><em><span style="font-size: smaller;"> - It's FOSS</span></em></h2>
<p>
<strong>tl;dr</strong>
<br />
I had never really considered that there were different terminals that could be installed. Plus, I've never had a reason to look for alternatives based on lack of functionality in the default choice. It makes sense though. The terminal is just another piece of software. I think I still prefer the simplicity and transparency of default installations.
</p>
<hr />
<h2><a href="https://www.zdnet.com/article/synology-ds218j-quick-and-simple-way-to-add-terabytes-of-network-attached-storage/">Synology DS218j: A quick and simple way to add terabytes of network attached storage</a><em><span style="font-size: smaller;"> - ZDNet</span></em></h2>
<p>
<strong>tl;dr</strong>
<br />
I have a Synology DS216j at home and I've been really happy with it. This is a very quick look at and updated model. What sets Synology devices apart from other options is the simplicity of setup while still offering a lot of functionality when you're ready for it. If you are looking for a good NAS device, this is a great option.
</p>Gavin GreerEdition #1 // February 14, 2020 Here’s what I’ve been reading and watching this week.How I Use Git2020-02-07T00:00:00-06:002020-02-07T00:00:00-06:00https://www.gavingreer.com/how%20i%20use/git/2020/02/07/how-i-use-git<p>Git is an open source version control system.</p>
<p><em>A what-now?</em>
<!--more--></p>
<h3 id="git-not-get">Git not Get</h3>
<p>Git provides a fancy way to go back in time if you screw up your software… among other things. It makes sharing copies of software simple. It tracks changes in files over time. You can use it to automate tasks. It allows others to use what you’ve built to build new things. It’s fairly ubiquitous in software development.</p>
<p>Git is the underlying system of commands. Sites like <a href="https://github.com">Github</a> and <a href="https://gitlab.com/">Gitlab</a> use this system to allow users to publish code repositories to the internet making them accessible anywhere and to a broad audience. Repository hosting sites like these and others also allow community involvement in public software projects. Any user can get involved through issue tracking and resolution, feature requests, code contributions and more.</p>
<p>Some of the most widely used programming languages (<a href="https://github.com/python/cpython">Python</a>, <a href="https://github.com/golang/go">Go</a>, <a href="https://github.com/apple/swift">Swift</a>) software packages (<a href="https://github.com/kubernetes/kubernetes">Kubernetes</a>, <a href="https://github.com/nodejs/node">Node.js</a>,<a href="https://github.com/pandas-dev/pandas">Pandas</a>) and software applications (<a href="https://github.com/Microsoft/vscode">VSCode</a>) host their entire code base publicly on Github. This is what it means when people say ‘open source software’. There are big name companies behind many of these repositories - Google, Microsoft and Apple.</p>
<p>Git is cool.</p>
<h3 id="just-the-basics">Just the Basics</h3>
<p>I’m not an expert. I’m not even a novice. Git is complex, powerful, confusing and harder to master than the actual programming itself. Everything I do with Git is from the command line and there are two primary ways I use Git (and Github):</p>
<ol>
<li>
<p><strong>Remote backups and access to code through Github</strong><br />
This gives me a ton of options. I can pull my code to any machine and continue working on it from my last change, called a Commit. I can revert to a previous stage if I caused a meltdown. I can store config files and pull them to new machines. I can even take notes and keep logs of what I’m doing, where I had trouble, how I solved problems, etc. There’s loads of flexibiliy and practical applications here.</p>
</li>
<li>
<p><strong>Automated actions</strong><br />
This path is relatively new to me. Git has something called hooks. <a href="https://githooks.com/">Git Hooks</a> are script files triggered during Git actions (commit, push, receive). I’m publishing this blog remotely on a web server using a <a href="https://github.com/nivagator/server-files/blob/master/scripts/post-update-jekyll">post-update</a> hook to build and deploy automatically. I’m working on publishing commit messages to twitter using a <a href="https://github.com/nivagator/server-files/blob/master/scripts/post-commit-tweet">post-commit</a> hook. They can be used for just about anything.</p>
</li>
</ol>
<p>This is just how I use it in my <em>very</em> limited scope. I don’t do anything with branching or forks. Mostly just <code class="highlighter-rouge">status</code>»<code class="highlighter-rouge">add</code>»<code class="highlighter-rouge">commit</code>»<code class="highlighter-rouge">push</code>. I know there’s something called <code class="highlighter-rouge">rebase</code> and <code class="highlighter-rouge">merge</code> that are super scary. <code class="highlighter-rouge">¯\_(ツ)_/¯</code> Someday, maybe, I’d like to contribute to open source projects or fork a public repo and build my own version. That would be neat.</p>Gavin GreerGit is an open source version control system. A what-now?How to quit VIM2020-01-27T00:00:00-06:002020-01-27T00:00:00-06:00https://www.gavingreer.com/tutorial/vim/2020/01/27/how-to-quit-vim<p>Welcome to the wonderful world of VIM. :)</p>
<p>I can completely understand the frustration you might be feeling upon finding this site. Its easy though.
<!--more--></p>
<ol>
<li><strong>Press <code class="highlighter-rouge"><ESC></code></strong>
<ul>
<li>This is to make sure you are in command mode</li>
</ul>
</li>
<li><strong>Type <code class="highlighter-rouge">:q</code> and press <code class="highlighter-rouge"><ENTER></code></strong>
<ul>
<li>In VIM, you begin commands with the colon followed by any number of characters that represent commands. In this case, you want <code class="highlighter-rouge">q</code> for quit.</li>
</ul>
</li>
<li><strong>Learn how to use VIM because its totally worth it.</strong></li>
</ol>
<h2 id="learn-vim">Learn VIM</h2>
<p>I was skeptical at first. I used <code class="highlighter-rouge">nano</code> for most quick edits in the shell and VSCode for all my other development work. But after working through <a href="http://linuxcommand.org/lc3_adv_vimvigor.php">VIM with Vigor</a> from the writers of <em>The Linux Command Line</em> book, I was hooked.</p>
<p>Give it a shot. There’s a lot to learn and its actually a lot of fun.</p>Gavin GreerWelcome to the wonderful world of VIM. :) I can completely understand the frustration you might be feeling upon finding this site. Its easy though.Hello World2020-01-25T00:00:00-06:002020-01-25T00:00:00-06:00https://www.gavingreer.com/2020/01/25/hello-world<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="s">'Hello World!'</span><span class="p">)</span>
</code></pre></div></div>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"Hello World!"</span> <span class="o">>></span> /dev/null
</code></pre></div></div>
<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hello World!</span><span class="dl">"</span><span class="p">)</span>
</code></pre></div></div>Gavin Greerprint('Hello World!') echo "Hello World!" >> /dev/null console.log("Hello World!")