<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >

  <title>Erik L. Arneson — Writer and Software Developer</title>
  <subtitle>Erik L. Arneson is a freelance writer and software developer with WordPress experience. He is located in Portland, Oregon.</subtitle>
  <generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
  <link href="https://arnesonium.com/feeds/tutorial.xml" rel="self" type="application/atom+xml" />
  <link href="https://arnesonium.com/" rel="alternate" type="text/html" />
  <updated>2026-06-18T15:03:10+00:00</updated>
  <id>https://arnesonium.com/feeds/tutorial.xml</id>
  <author>
    <name>Erik L. Arneson</name>
  </author>
      <entry>
        
        <title>Recording Podcasts in Linux</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2018/04/recording-podcasts-in-linux/" rel="alternate" type="text/html" title="Recording Podcasts in Linux" />
        <updated>2018-04-01T23:23:02+00:00</updated>
        <id>https://arnesonium.com/2018/04/recording-podcasts-in-linux</id>
          <category term="alsa" />
        
          <category term="audio" />
        
          <category term="ecasound" />
        
          <category term="linux" />
        
          <category term="pulseaudio" />
        
          <category term="tutorial" />
        
          <category term="ubuntu" />
        <content type="html" xml:base="https://arnesonium.com/2018/04/recording-podcasts-in-linux/">&lt;p&gt;I co-host a podcast called &lt;a href=&quot;https://myalchemicalbromance.com/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;My Alchemical Bromance&lt;/a&gt;, and one of the frequent challenges I end up facing is how to record video and voice chats for interviews. A lot of podcasters use external hardware devices, such as the &lt;a href=&quot;https://amzn.to/2Gt0iOc&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Focusrite Scarlett 2i4&lt;/a&gt;, which is a great solution. But I wanted to do it all in software—and in Linux.
&lt;!--more--&gt;&lt;/p&gt;

&lt;h2 id=&quot;my-configuration&quot;&gt;My Configuration&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://amzn.to/2GJJBgt&quot;&gt;&lt;img src=&quot;https://arnesonium.com/wp-content/uploads/2018/04/Blue-Snowball-USB-246x300.png#right&quot; alt=&quot;Blue Snowball USB microphone&quot; width=&quot;246&quot; height=&quot;300&quot; class=&quot;size-medium wp-image-797&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this setup, you need headphones, a microphone, and an Internet connection. I use a &lt;a href=&quot;https://amzn.to/2H4C8Gs&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Blue Snowball USB microphone&lt;/a&gt;, which is affordable, sturdy, and great quality for just recording a podcast.&lt;/p&gt;

&lt;h2 id=&quot;pulseaudio-and-alsa&quot;&gt;PulseAudio and ALSA&lt;/h2&gt;

&lt;p&gt;Anybody who’s played with audio stuff in Linux knows that it’s a total mess. I’m not going to try to explain it all in detail because I’ll get it wrong, and even this section I’m &lt;em&gt;probably&lt;/em&gt; going to get wrong. Feel free to correct me loudly in the comments. There are two very common audio interfaces that we have to deal with. First is ALSA, which is the Advanced Linux Sound Architecture and is the hardware driver layer of the audio system. Next is PulseAudio, which is a sound server that abstracts the hardware layer.&lt;/p&gt;

&lt;h3 id=&quot;pulseaudio-configuration&quot;&gt;PulseAudio Configuration&lt;/h3&gt;

&lt;p&gt;We need two pieces of information from PulseAudio: the system sound monitor, and the microphone monitor. Run the following command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pactl list | &lt;span class=&quot;nb&quot;&gt;grep&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-A2&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&apos;Source #&apos;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You should get output that looks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Source #0
	State: IDLE
	Name: alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
--
Source #1
	State: SUSPENDED
	Name: alsa_input.pci-0000_00_1b.0.analog-stereo
--
Source #9
	State: SUSPENDED
	Name: alsa_input.usb-BLUE_MICROPHONE_Blue_Snowball_201305-00.analog-mono
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The bits you’re interested in are the “Name” for the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;analog-stereo.monitor&lt;/code&gt; entry and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;analog-mono&lt;/code&gt; entry. In my example, you will find them on lines 3 and 11. Save those for the next step.&lt;/p&gt;

&lt;h3 id=&quot;alsa-configuration&quot;&gt;ALSA Configuration&lt;/h3&gt;

&lt;p&gt;Because we’re going to use an ALSA-compatible tool for recording, we need to configure ALSA to talk to PulseAudio (which then talks to ALSA again on the backend – like I said, audio is confusing in Linux and I’m sorry that either of us has to spend any time thinking about it). You will want to open &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$HOME/.asoundrc&lt;/code&gt; and add the following entries.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;# Creating a system sound monitor
pcm.pulse_monitor {
  type pulse
  device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
}

ctl.pulse_monitor {
  type pulse
  device alsa_output.pci-0000_00_1b.0.analog-stereo.monitor
}

# Creating an ALSA interface for the USB microphone
pcm.pulse_usbmic {
  type pulse
  device alsa_input.usb-BLUE_MICROPHONE_Blue_Snowball_201305-00.analog-mono
}

ctl.pulse_usbmic {
  type pulse
  device alsa_input.usb-BLUE_MICROPHONE_Blue_Snowball_201305-00.analog-mono
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You will see that on lines 4 and 9, I used the name of the system monitor PulseAudio device from the previous step. Likewise, on lines 15 and 20, I used the name for the USB microphone device.&lt;/p&gt;

&lt;h2 id=&quot;actually-recording-things&quot;&gt;Actually Recording Things&lt;/h2&gt;

&lt;p&gt;I won’t strongly recommend any particular voice or video chat software in Linux over another. There are a few good ones I’ve used, such as Google Hangouts and Zoom. I’ve used Google Voice to record phone calls, too. Skype has been problematic for me, with lots of drop-outs and weird volume issues, but that could just be my setup. You will need to experiment and find out which works best for you.&lt;/p&gt;

&lt;p&gt;We will use &lt;a href=&quot;http://www.eca.cx/ecasound/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Ecasound&lt;/a&gt; to record to hard disk. To install Ecasound in Ubuntu (and probably Debian), run this command:&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;ecasound ecatools
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To start recording, run this command:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ecasound &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt;:16,1,44100 &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;:1 &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; alsa,pulse_usbmic &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; ecatrack1.wav &lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
         &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt;:16,2,44100 &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;:2 &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; alsa,pulse_monitor &lt;span class=&quot;nt&quot;&gt;-o&lt;/span&gt; ecatrack2.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;At the “ecasound” prompt, type “start” to begin recording. When you are done, type “stop” and then “quit”. Your microphone audio will be in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ecatrack1.wav&lt;/code&gt; and your computer system audio will be in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ecatrack2.wav&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;timing-problems&quot;&gt;Timing Problems&lt;/h2&gt;

&lt;p&gt;This setup essentially uses two different hardware devices to record audio, so it will have one glaring problem: no two hardware timing clocks are the same. Both are sampling at 44.1kHz, but the crystals used to do the timing will never &lt;em&gt;exactly&lt;/em&gt; be at 41,000 samples per second. The variation compounds over time, so for long recordings you will notice unusual lag. This is probably why so many podcasters go for an external hardware solution. But if all you’ve got is a USB microphone and the truth, a software solution will have to do for now.&lt;/p&gt;

&lt;h2 id=&quot;good-luck&quot;&gt;Good Luck!&lt;/h2&gt;

&lt;p&gt;I hope this helps you do better, smarter podcasting. Podcasting in Linux is tricky. There aren’t a lot of good tutorials out there, so you’ll still have to figure a lot out on your own. If you have tips or tutorials that helped you out, please include them in the comments below! I certainly need them.&lt;/p&gt;</content>
      </entry>
    
      <entry>
        
        <title>Slides on a Stick with Raspberry Pi Zero W</title>
        <author>
          <name>Erik L. Arneson</name>
        </author>        
        <link href="https://arnesonium.com/2017/10/slides-on-a-stick-with-raspberry-pi-zero-w/" rel="alternate" type="text/html" title="Slides on a Stick with Raspberry Pi Zero W" />
        <updated>2017-10-15T19:38:19+00:00</updated>
        <id>https://arnesonium.com/2017/10/slides-on-a-stick-with-raspberry-pi-zero-w</id>
          <category term="best-practices" />
        
          <category term="public-speaking" />
        
          <category term="raspberry-pi" />
        
          <category term="tutorial" />
        
          <category term="writing" />
        <content type="html" xml:base="https://arnesonium.com/2017/10/slides-on-a-stick-with-raspberry-pi-zero-w/">&lt;p&gt;If you give presentations often, you will know that one of the biggest headaches is managing slides. You have to figure out software, hardware, and connectors. I’ve usually resorted to bringing a USB thumb drive with my slides in PDF and ODP format, but then I came across an even better idea: the Raspberry Pi Zero W (or RPi0W).
&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Previously, I had been playing with using &lt;a href=&quot;https://arnesonium.com/2017/04/raspberry-pi-gpio-with-erlang/&quot;&gt;Erlang on the RPi0W to control stepper motors&lt;/a&gt;, but this seemed more useful. Follow along to see how I created a portable presentation machine that’s about the size of a pack of gum.&lt;/p&gt;

&lt;h2 id=&quot;hardware-used&quot;&gt;Hardware Used&lt;/h2&gt;

&lt;iframe style=&quot;width:120px;height:240px;float:right;&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; src=&quot;//ws-na.amazon-adsystem.com/widgets/q?ServiceVersion=20070822&amp;amp;OneJS=1&amp;amp;Operation=GetAdHtml&amp;amp;MarketPlace=US&amp;amp;source=ss&amp;amp;ref=as_ss_li_til&amp;amp;ad_type=product_link&amp;amp;tracking_id=aarggaminggroup&amp;amp;marketplace=amazon&amp;amp;region=US&amp;amp;placement=B01HG8DB5E&amp;amp;asins=B01HG8DB5E&amp;amp;linkId=5a34d4956347681153b14f52f9ee75a1&amp;amp;show_border=true&amp;amp;link_opens_in_new_window=true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;I purchased the RPi0W as part of a kit so it would have a nice case and all of the connectors I needed. I also wanted a good way to control it, so I found an inexpensive mini wireless keyboard and mouse on Amazon. You can follow my example or find your own alternatives.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.adafruit.com/product/3410&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Raspberry Pi Zero W Budget Pack from Adafruit&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://amzn.to/2yq8A3E&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Aerb 2.4GHz Mini Wireless Keyboard with Mouse Touchpad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;installing-and-configuring-software&quot;&gt;Installing and Configuring Software&lt;/h2&gt;

&lt;p&gt;I’m not the first person to think of using a Raspberry Pi for slides and presentations. Rob Reilly wrote a &lt;a href=&quot;http://www.raspberry-pi-geek.com/Archive/2014/06/Equip-your-Pi-for-slide-and-video-presentations&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;great article on this topic for Raspberry Pi Geek&lt;/a&gt; which provides some great tips and recommendations. However, I wanted to create a presentation machine that was even faster and more portable.&lt;/p&gt;

&lt;p&gt;I used &lt;a href=&quot;https://www.raspberrypi.org/downloads/raspbian/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;Raspbian Stretch with Desktop&lt;/a&gt;, but knew that I would run into memory and performance issues on the RPi0W. It only has 512MB of RAM, so I would need to use small, efficient applications and cut out unnecessary services and applications on the device. It’s really important that the machine boots up fast and gets running quickly.&lt;/p&gt;

&lt;p&gt;Quickly I gave up on the idea of running LibreOffice Impress. Instead, I would use a lightweight full-screen PDF viewer. I tested out a number of the smaller PDF readers available on Raspbian before finally settling on &lt;a href=&quot;https://naihe2010.github.io/apvlv/&quot; rel=&quot;noopener&quot; target=&quot;_blank&quot;&gt;apvlv&lt;/a&gt;. This reader is tiny, fast, and configurable. It also requires some additional setup.&lt;/p&gt;

&lt;p&gt;Install apvlv on your system with the following commands.&lt;/p&gt;

&lt;pre lang=&quot;bash&quot; line=&quot;1&quot;&gt;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
sudo apt install -y apvlv
&lt;/pre&gt;

&lt;p&gt;These commands might take a while. When you are done, edit the apvlv preferences file. You will probably do this using the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;nano ~/.apvlvrc&lt;/code&gt; but you might want a different text editor. Edit to look like this.&lt;/p&gt;

&lt;pre lang=&quot;ini&quot; line=&quot;1&quot;&gt;
set fullscreen = yes
set zoom = fitwidth
set continuous = no
set scrollbar = no
set content = no
&lt;/pre&gt;

&lt;h2 id=&quot;displaying-slides&quot;&gt;Displaying Slides&lt;/h2&gt;

&lt;p&gt;You will need to get your PDF slides onto the RPi0W. I usually use a webpage to download them, or copy them over via &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;scp&lt;/code&gt;. Do whatever feels best to you.&lt;/p&gt;

&lt;p&gt;Simply use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apvlv&lt;/code&gt; command from a terminal or the menu to load your PDF file. The interface is a little arcane, but easy to get the hang of. You can use the up and down arrows on the mini keyboard to go forward and backward one slide. To exit, hit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;q&lt;/code&gt; and to go to a specific slide type &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:go &amp;lt;number&amp;gt;&lt;/code&gt; and replace “&amp;lt;number&amp;gt;” with the slide number.&lt;/p&gt;

&lt;p&gt;The RPi0W still takes a little while to boot, but you now have an extremely portable device that plugs into any HDMI screen or projector and displays your slides with as little fuss as possible!&lt;/p&gt;</content>
      </entry>
    
</feed>
