Louis-Philippe Véronneau - videohttps://veronneau.org/2020-06-11T00:00:00-04:00How to capture a remote IRC session live2020-06-11T00:00:00-04:002020-06-11T00:00:00-04:00Louis-Philippe Véronneautag:veronneau.org,2020-06-11:/how-to-capture-a-remote-irc-session-live.html<p><a href="https://debconf20.debconf.org/news/2020-06-08-debconf20-moves-online/">DebConf20</a> will be held online this year and I've started doing some work
for the DebConf videoteam to prepare what's to come.</p>
<p>One thing I want us to do is capture a live IRC session and use it as a video
input in <a href="https://github.com/voc/voctomix">Voctomix</a>, the live video mixer we use …</p><p><a href="https://debconf20.debconf.org/news/2020-06-08-debconf20-moves-online/">DebConf20</a> will be held online this year and I've started doing some work
for the DebConf videoteam to prepare what's to come.</p>
<p>One thing I want us to do is capture a live IRC session and use it as a video
input in <a href="https://github.com/voc/voctomix">Voctomix</a>, the live video mixer we use. This way, at the end of a
talk we could show both the attendees asking questions on IRC and the presenter
replying to them side-by-side.</p>
<p><img src="/media/blog/2020-06-11/side-by-side_mockup.png" title="A mockup of a side-by-side voctogui window with someone on the left and a terminal running weechat on the right" alt="A mockup of a side-by-side voctogui window with someone on the left and a terminal running weechat on the right" height="80%" width="80%" style="margin-left: 10%;"></p>
<p>Capturing a live video of an IRC client on a remote headless server is somewhat
more complicated than you might think; as far as I know, neither <code>ffmpeg</code> nor
<code>gstreamer</code> support recording a live ssh pseudoterminal<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
<p>Worse, neither <code>weechat</code> nor <code>irssi</code> run on X: they use ncurses... Although you
can capture an X11 window with <code>ffmpeg -f x11grab</code>, I wasn't able to get them to
run with Xvfb.</p>
<h2>Capturing the framebuffer</h2>
<p>One thing I dislike with this method is the framebuffer isn't always easy to
access on remote machines. If you don't have a serial connection, you can try
using a VNC server that can.</p>
<p>I did my tests in a VM on an KVM hypervisor and used <code>virt-manager</code> to access
the framebuffer.</p>
<p>I had a hard time setting the framebuffer resolution to a 16:9 aspect ratio. The
winning combination ended up passing the <code>nomodeset</code> kernel parameter at boot
and setting up these parameters in <code>/etc/default/grub</code><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>:</p>
<pre>
GRUB_GFXMODE=1280x720
GRUB_GFXPAYLOAD_LINUX=keep
</pre>
<p>To make the text more readable, this is the <code>/etc/default/console-setup</code> file
that seemed to make the most sense:</p>
<pre>
# CONFIGURATION FILE FOR SETUPCON
# Consult the console-setup(5) manual page.
ACTIVE_CONSOLES="/dev/tty[1-6]"
CHARMAP="UTF-8"
CODESET="Lat15"
FONTFACE="TerminusBold"
FONTSIZE="12x24"
</pre>
<p>Once that is done, the only thing left is to run the IRC client and launch
<code>ffmpeg</code>. The magic command to record the framebuffer seems to be something
like:</p>
<div class="highlight"><pre><span></span><code>ffmpeg -f fbdev -framerate 60 -i /dev/fb0 -c:v libvpx -crf 10 -b:v 1M -auto-alt-ref 0 output.webm
</code></pre></div>
<p>Here is what I ended up with:</p>
<video src="https://veronneau.org/media/blog/2020-06-11/framebuffer.webm" title="Video of weechat being ran in the framebuffer" alt="Video of weechat being ran in the framebuffer" height="80%" width="80%" style="margin-left: 10%;" controls></video>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>We need something similarly flexible and featureful that can output to a
TCP socket. <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p>Don't forget to run <code>update-grub</code> before rebooting! <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Using Jitsi Meet with Puppet for self-hosted video conferencing2020-04-09T00:00:00-04:002020-04-09T00:00:00-04:00Louis-Philippe Véronneautag:veronneau.org,2020-04-09:/using-jitsi-meet-with-puppet-for-self-hosted-video-conferencing.html<p><em>Here's a blog post I wrote for the <a href="https://puppet.com/blog/using-jitsi-meet-for-self-hosted-video-conferencing/">puppet.com blog</a>. Many thanks
to Ben Ford and all their team!</em>.</p>
<p>With everything that is currently happening around the world, many of us IT
folks have had to solve complex problems in a very short amount of time. Pretty
quickly at …</p><p><em>Here's a blog post I wrote for the <a href="https://puppet.com/blog/using-jitsi-meet-for-self-hosted-video-conferencing/">puppet.com blog</a>. Many thanks
to Ben Ford and all their team!</em>.</p>
<p>With everything that is currently happening around the world, many of us IT
folks have had to solve complex problems in a very short amount of time. Pretty
quickly at work, I was tasked with finding a way to make virtual meetings easy,
private and secure.</p>
<p>Whereas many would have turned to a SaaS offering, we decided to use <a href="https://jitsi.org/jitsi-meet/">Jitsi
Meet</a>, a modern and fully on-premise FOSS videoconferencing solution.
Jitsi works on all platforms by running in a browser and comes with nifty
Android and iOS applications.</p>
<p>We've been using our instance quite a bit, and so far everyone from technical
to non-technical users have been pretty happy with it.</p>
<p>Jitsi Meet is powered by WebRTC and can be broken into multiple parts across
multiple machines if needed. In addition to the webserver running the Jitsi
Meet JavaScript code, the base configuration uses the Videobridge to manage
users' video feeds, Jicofo as a conference focus to manage media sessions and
the Prosody XMPP server to tie it all together.</p>
<p>Here's a network diagram I took from their <a href="https://github.com/jitsi/jitsi-meet/blob/master/doc/manual-install.md#network-description">documentation</a> to show
how those applications interact:</p>
<p><img src="/media/blog/2020-04-09/jitsi-diagram.png" width="70%" style="margin-left:15%" title="A network diagram that shows how the different bits of jitsi meet work together" alt="A network diagram that shows how the different bits of jitsi meet work together"></p>
<h2>Getting started with the Jitsi Puppet module</h2>
<p>First of all, you'll need a valid domain name and a server with decent
bandwidth. Jitsi has published a <a href="https://jitsi.org/jitsi-videobridge-performance-evaluation/">performance evaluation</a> of the
Videobridge to help you spec your instance appropriately. You will also need to
open TCP ports 443, 4443 and UDP port 10000 in your firewall. The
<a href="https://forge.puppet.com/puppetlabs/firewall"><code>puppetlabs/firewall</code></a> module could come in handy here.</p>
<p>Once that is done, you can use the <a href="https://forge.puppet.com/smash/jitsimeet"><code>smash/jitsimeet</code></a> Puppet module on
a Debian 10 (Buster) server to spin up an instance. A basic configuration would
look like this:</p>
<div class="highlight"><pre><span></span><code><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s">'jitsimeet'</span><span class="p">:</span>
<span class="w"> </span><span class="na">fqdn</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'jitsi.example.com'</span><span class="p">,</span>
<span class="w"> </span><span class="na">repo_key</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="na">puppet</span><span class="p">:</span><span class="o">///</span><span class="na">files</span><span class="o">/</span><span class="na">apt</span><span class="o">/</span><span class="na">jitsimeet</span><span class="err">.</span><span class="na">gpg</span><span class="p">,</span>
<span class="w"> </span><span class="na">manage_certs</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="k">true</span><span class="p">,</span>
<span class="w"> </span><span class="na">jitsi_vhost_ssl_key</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'/etc/letsencrypt/live/jitsi.example.com/privkey.pem'</span>
<span class="w"> </span><span class="na">jitsi_vhost_ssl_cert</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'/etc/letsencrypt/live/jitsi.example.com/cert.pem'</span>
<span class="w"> </span><span class="na">auth_vhost_ssl_key</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'/etc/letsencrypt/live/auth.jitsi.example.com/privkey.pem'</span>
<span class="w"> </span><span class="na">auth_vhost_ssl_cert</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'/etc/letsencrypt/live/auth.jitsi.example.com/cert.pem'</span>
<span class="w"> </span><span class="na">jvb_secret</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'mysupersecretstring'</span><span class="p">,</span>
<span class="w"> </span><span class="na">focus_secret</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'anothersupersecretstring'</span><span class="p">,</span>
<span class="w"> </span><span class="na">focus_user_password</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="s">'yetanothersecret'</span><span class="p">,</span>
<span class="w"> </span><span class="na">meet_custom_options</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="s">'enableWelcomePage'</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="k">true</span><span class="p">,</span>
<span class="w"> </span><span class="s">'disableThirdPartyRequests'</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="k">true</span><span class="p">,</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="p">}</span>
</code></pre></div>
<p>The <code>jitsimeet</code> module is still pretty young: it clearly isn't perfect and some
external help would be very appreciated. If you have some time, here are a few
things that would be nice to work on:</p>
<ul>
<li>Tests using puppet-rspec</li>
<li>Support for other OSes (only Debian 10 at the moment)</li>
<li>Integration with the Apache and Ngnix modules</li>
</ul>
<p>If you use this module to manage your Jitsi Meet instance, please send patches
and bug reports our way!</p>
<h2>Learn more</h2>
<ul>
<li>Read more about <a href="https://jitsi.org">Jitsi</a></li>
<li>Get involved by <a href="https://gitlab.com/shared-puppet-modules-group/jitsimeet">cloning our repo</a></li>
<li>Read about the <a href="https://gitlab.com/shared-puppet-modules-group">SMASH project</a></li>
<li>See some <a href="https://puppet.com/blog/automating-from-zero-to-something/">advice</a> on getting started with automation</li>
</ul>Using Zoom's web client on Linux2020-03-30T00:00:00-04:002020-03-30T00:00:00-04:00Louis-Philippe Véronneautag:veronneau.org,2020-03-30:/using-zooms-web-client-on-linux.html<p>TL;DR: The zoom meeting link you have probably look like this:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/j/123456789
</code></pre></div>
<p>To use the web client, use this instead:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/wc/join/123456789
</code></pre></div>
<h2>Avant-propos</h2>
<p>Like too many institutions, the school where I teach chose to partner up with
Zoom. I wasn't expecting …</p><p>TL;DR: The zoom meeting link you have probably look like this:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/j/123456789
</code></pre></div>
<p>To use the web client, use this instead:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/wc/join/123456789
</code></pre></div>
<h2>Avant-propos</h2>
<p>Like too many institutions, the school where I teach chose to partner up with
Zoom. I wasn't expecting anything else, as my school's IT department is a
Windows shop. Well, I guess I'm still a little disappointed.</p>
<p>Although I had vaguely heard of Zoom before, I had never thought I'd be forced to
use it. Lucky for me, my employer decided not to force us to use it. To finish
the semester, I plan to record myself and talk with my students on a Jitsi Meet
instance.</p>
<p>I will still have to attend meetings on Zoom though. I'm well aware of Zoom's
<a href="https://www.vice.com/en_us/article/k7e599/zoom-ios-app-sends-data-to-facebook-even-if-you-dont-have-a-facebook-account">bad</a> <a href="https://arstechnica.com/information-technology/2019/07/zoom-makes-it-too-easy-for-hackers-to-access-webcams-heres-what-to-do/">privacy record</a> and I will not install their
desktop application. Zoom does offer a web client. Sadly, on Linux you need to
jump through hoops to be able to use it.</p>
<h2>Using Zoom's web client on Linux</h2>
<p>Zoom's web client <a href="https://support.zoom.us/hc/en-us/articles/214629443-Zoom-Web-Client#h_2da60ac7-455e-466f-85d1-974aa68f0703">apparently works better on Chrome</a>, so I
decided to use Chromium.</p>
<p>Without already having the desktop client installed on your machine, the
standard procedure to use the web client would be:</p>
<ol>
<li>Open the link to the meeting in Chromium</li>
<li>Click on the "download & run Zoom" link showed on the page</li>
<li>Click on the "join from your browser" link that then shows up</li>
</ol>
<p>Sadly, that's not what happens on Linux. When you click on the "download & run
Zoom" link, it brings you to a page with instructions on how to install the
desktop client on Linux.</p>
<p>You can thwart that stupid behavior by changing your browser's user agent to
make it look like you are using Windows. This is the UA string I've been using:</p>
<div class="highlight"><pre><span></span><code>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36
</code></pre></div>
<p>With that, when you click on the "download & run Zoom" link, it will try to
download a <code>.exe</code> file. Cancel the download and you should now see the infamous
"join from your browser" link.</p>
<p>Upon closer inspection, it seem you can get to the web client by changing the
meeting's URL. The zoom meeting link you have probably look like this:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/j/123456789
</code></pre></div>
<p>To use the web client, use this instead:</p>
<div class="highlight"><pre><span></span><code>https://zoom.us/wc/join/123456789
</code></pre></div>
<h2>Jitsi Meet Puppet Module</h2>
<p>I've been playing around with Jitsi Meet quite a bit recently and <a href="https://forge.puppet.com/smash/jitsimeet">I've written
a Puppet module</a> to install and configure an instance! The module
certainly isn't perfect, but should wield a working Jitsi instance.</p>
<p>If you already have a Puppet setup, please give it a go! I'm looking forward
receiving feedback (and patches) to improve it.</p>I'm going to FOSDEM 2019 (and to a DebConf video sprint)2018-12-08T00:00:00-05:002018-12-08T00:00:00-05:00Louis-Philippe Véronneautag:veronneau.org,2018-12-08:/im-going-to-fosdem-2019-and-to-a-debconf-video-sprint.html<p>The DebConf video team tries to organise one or two sprints a year outside of
DebConf to fix problems and improve our recording and streaming setup. It helps
us a lot, since hacking on camera-related stuff without actual cameras can
sometimes be problematic.</p>
<p>This year, our <a href="https://wiki.debian.org/Sprints/2019/DebConf%20Video%20team%20sprint%20%40%20FOSDEM%202019">first sprint</a> will take …</p><p>The DebConf video team tries to organise one or two sprints a year outside of
DebConf to fix problems and improve our recording and streaming setup. It helps
us a lot, since hacking on camera-related stuff without actual cameras can
sometimes be problematic.</p>
<p>This year, our <a href="https://wiki.debian.org/Sprints/2019/DebConf%20Video%20team%20sprint%20%40%20FOSDEM%202019">first sprint</a> will take place a week before FOSDEM 2019.
If you have some spare time and are familiar with Ansible or simply want to
learn more about our setup, feel free to drop by!</p>
<p><img src="/media/blog/2018-12-08/bunches.gif" title="A clip from Final Space, s/adventures/beers/g" alt="A clip from Final Space, s/adventures/beers/g" height="30%" width="30%" style="margin-left: 30%;"></p>
<p>I'm of course planning to stay a few days after the sprint and go to FOSDEM.
It will be my first time there and I can't wait to see how large it is! I'm also
pretty siked, as it'll be my first time in Bruxelles too. Let's just say I've
heard good things about Bruxelle's craft beer scene and intend to dedicate
few afternoons/nights to documenting the largest amount of brews I'll be able to
stomach.</p>
<p>Here's a few places I really want to go to, but if you have advices, hit me up!
I'm mainly interested in places where they brew their own beer.</p>
<ul>
<li>Nanobrasserie de l'Ermitage<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup></li>
<li>Brussels Beer Project</li>
<li>Brasserie No Science</li>
<li>En Stoemelings</li>
<li>Beerstorming </li>
<li>Brasserie de la Senne</li>
<li>Brasserie Cantillon</li>
<li>Moeder Lambic</li>
<li>Délirium Café or Little Delirium Café</li>
</ul>
<p>I might also have a go at Brew Dog, as I like their beers a lot and their bar in
Bruxelles seems pretty nice.</p>
<p>Two cheers for bunches of Free Software and beers!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1">
<p>L'Ermitage has been brewing <em>very</em> nice collabs with some of the finest
craft breweries in Quebec (like Dunham!). A must!!! <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>