New Post for Creating a Gif on the CLI.
This commit is contained in:
65
content/posts/create_gif_on_commandline.md
Normal file
65
content/posts/create_gif_on_commandline.md
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
title: 'Create a GIF from a video - Right from the Command Line!'
|
||||||
|
date: 2024-07-03T17:41:15-04:00
|
||||||
|
tags: ["tutorial", "snippets", "commandline"]
|
||||||
|
author: "Me"
|
||||||
|
showToc: true
|
||||||
|
TocOpen: false
|
||||||
|
draft: false
|
||||||
|
hidemeta: false
|
||||||
|
description: 'create_gif_on_commandline'
|
||||||
|
disableHLJS: true # to disable highlightjs
|
||||||
|
disableShare: false
|
||||||
|
disableHLJS: false
|
||||||
|
hideSummary: false
|
||||||
|
searchHidden: true
|
||||||
|
ShowReadingTime: true
|
||||||
|
ShowBreadCrumbs: true
|
||||||
|
ShowPostNavLinks: true
|
||||||
|
ShowWordCount: true
|
||||||
|
ShowRssButtonInSectionTermList: true
|
||||||
|
UseHugoToc: true
|
||||||
|
cover:
|
||||||
|
image: "<image path/url>"
|
||||||
|
alt: "<alt text>"
|
||||||
|
caption: "<text>"
|
||||||
|
relative: false
|
||||||
|
hidden: true
|
||||||
|
---
|
||||||
|
|
||||||
|
Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can't find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I'm given a new solution. Imgur's [video-to-gif](https://imgur.com/vidgif) used to be reliable, but the last few times it hasn't been working as expected.
|
||||||
|
|
||||||
|
This last time, I was trying to convert a very important It's Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no "thank you" reaction gif from when [Dennis reads Charlie's speech?!](https://www.youtube.com/watch?v=ROCKGuuviis). Here's the gif for your own collections.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The command line functions I found came to get this done came mostly from [Funky Cloud Medina's](https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/) post on this. I didn't want to use automator, but just write out a few commands, so here is what I did (on MacOS):
|
||||||
|
|
||||||
|
First, install ffmpeg and gifsicle with Homebrew. `brew install ffmpeg gifsicle`
|
||||||
|
|
||||||
|
Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.
|
||||||
|
```conf
|
||||||
|
mkdir pngs/ gifs/
|
||||||
|
```
|
||||||
|
This will create both `gifs` and `pngs` folders in the directory you're currently in.
|
||||||
|
|
||||||
|
Next, we'll process the movie.
|
||||||
|
|
||||||
|
```
|
||||||
|
ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
```
|
||||||
|
`Untitled.mov` is the name of the video file in the directory you're currently in and outputs each frame to the `pngs` folder with increment digits. The incrementing digits are so you don't overwrite everything and end up with just a single picture file.
|
||||||
|
|
||||||
|
Next, we'll use `sips`, the Scriptable Image Processing System. (Check out `man sips` from your own CLI for more info!)
|
||||||
|
```
|
||||||
|
sips -s format gif pngs/*.png --out gifs
|
||||||
|
```
|
||||||
|
|
||||||
|
Almost there! This is processing all the image files into the gifs folder. Let's now move into the gifs folder with cd: `cd gifs`
|
||||||
|
|
||||||
|
And now we can use [gifsicle](https://www.lcdf.org/gifsicle/) to merge all the images into a single gif! We'll do that with the following command:
|
||||||
|
```
|
||||||
|
gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
```
|
||||||
|
|
||||||
|
And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!
|
||||||
BIN
content/posts/img/iasip_thank_you.gif
Normal file
BIN
content/posts/img/iasip_thank_you.gif
Normal file
Binary file not shown.
BIN
content/posts/img/thankyou.gif
Normal file
BIN
content/posts/img/thankyou.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.0 MiB |
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="404 Page not found" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="404 Page not found" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/404.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/404.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -82,11 +85,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Categories" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Categories" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/categories.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/categories.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Tutorial" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tutorial" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/categories/tutorial.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/categories/tutorial.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<html lang="en" dir="auto">
|
<html lang="en" dir="auto">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta name="generator" content="Hugo 0.124.1"><meta charset="utf-8">
|
<meta name="generator" content="Hugo 0.128.0"><meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<meta name="robots" content="index, follow">
|
<meta name="robots" content="index, follow">
|
||||||
@ -31,7 +31,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Norm-working Packets 💾" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Norm-working Packets 💾" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -98,11 +101,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -151,6 +149,18 @@
|
|||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
|
<article class="post-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to Create a GIF from a video - Right from the Command Line!" href="./posts/create_gif_on_commandline.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
<article class="post-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">How to Revisit your Terminal Session's History
|
<h2 class="entry-hint-parent">How to Revisit your Terminal Session's History
|
||||||
@ -225,19 +235,6 @@ In order to greatly reduce the number of nodes needed in the single recipe, I cr
|
|||||||
<footer class="entry-footer"><span title='2023-10-16 11:34:14 -0400 EDT'>October 16, 2023</span> · 6 min · 1170 words · Me</footer>
|
<footer class="entry-footer"><span title='2023-10-16 11:34:14 -0400 EDT'>October 16, 2023</span> · 6 min · 1170 words · Me</footer>
|
||||||
<a class="entry-link" aria-label="post link to ESP8266 Medicine Indicator Light" href="./posts/medicine_indicator_light.html"></a>
|
<a class="entry-link" aria-label="post link to ESP8266 Medicine Indicator Light" href="./posts/medicine_indicator_light.html"></a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
|
||||||
<header class="entry-header">
|
|
||||||
<h2 class="entry-hint-parent">BirdNET-PI & HomeAssistant: Part 2
|
|
||||||
</h2>
|
|
||||||
</header>
|
|
||||||
<div class="entry-content">
|
|
||||||
<p>Checking for Entities If you’re following up on this from my first post, you’ve already added your AppDaemon script and confirmed that the AppDaemon logs don’t show any errors. Now is the true test if it’s working: do you have the new sensors in HomeAssistant?!
|
|
||||||
The best way to do this is by just type e from any screen in the HomeAssistant UI! That will bring up a list of entities....</p>
|
|
||||||
</div>
|
|
||||||
<footer class="entry-footer"><span title='2023-10-04 10:35:23 -0400 EDT'>October 4, 2023</span> · 10 min · 1986 words · Me</footer>
|
|
||||||
<a class="entry-link" aria-label="post link to BirdNET-PI & HomeAssistant: Part 2" href="./posts/birdnet_homeassistant_part2.html"></a>
|
|
||||||
</article>
|
|
||||||
<footer class="page-footer">
|
<footer class="page-footer">
|
||||||
<nav class="pagination">
|
<nav class="pagination">
|
||||||
<a class="next" href="./page/2.html">Next »
|
<a class="next" href="./page/2.html">Next »
|
||||||
|
|||||||
@ -6,8 +6,34 @@
|
|||||||
<description>Recent content on Norm-working Packets 💾</description>
|
<description>Recent content on Norm-working Packets 💾</description>
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<lastBuildDate>Tue, 19 Mar 2024 11:00:53 -0400</lastBuildDate>
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
<atom:link href="/index.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line!</title>
|
||||||
|
<link>/posts/create_gif_on_commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/posts/create_gif_on_commandline.html</guid>
|
||||||
|
<description>create_gif_on_commandline</description>
|
||||||
|
<content:encoded><![CDATA[<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
]]></content:encoded>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>How to Revisit your Terminal Session's History</title>
|
<title>How to Revisit your Terminal Session's History</title>
|
||||||
<link>/posts/save_terminal_to_file.html</link>
|
<link>/posts/save_terminal_to_file.html</link>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
<html lang="en" dir="auto">
|
<html lang="en" dir="auto">
|
||||||
|
|
||||||
<head>
|
<head>
|
||||||
<meta name="generator" content="Hugo 0.124.1"><meta charset="utf-8">
|
<meta name="generator" content="Hugo 0.128.0"><meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<meta name="robots" content="index, follow">
|
<meta name="robots" content="index, follow">
|
||||||
@ -31,7 +31,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Norm-working Packets 💾" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Norm-working Packets 💾" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -98,16 +101,24 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
<main class="main">
|
<main class="main">
|
||||||
|
|
||||||
|
<article class="post-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">BirdNET-PI & HomeAssistant: Part 2
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Checking for Entities If you’re following up on this from my first post, you’ve already added your AppDaemon script and confirmed that the AppDaemon logs don’t show any errors. Now is the true test if it’s working: do you have the new sensors in HomeAssistant?!
|
||||||
|
The best way to do this is by just type e from any screen in the HomeAssistant UI! That will bring up a list of entities....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2023-10-04 10:35:23 -0400 EDT'>October 4, 2023</span> · 10 min · 1986 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to BirdNET-PI & HomeAssistant: Part 2" href="../posts/birdnet_homeassistant_part2.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
<article class="post-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">Creating a BirdNetPi Dashboard in HomeAssistant - Part 1
|
<h2 class="entry-hint-parent">Creating a BirdNetPi Dashboard in HomeAssistant - Part 1
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Posts" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Posts" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/posts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/posts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -98,11 +101,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -113,6 +111,18 @@
|
|||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<article class="post-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to Create a GIF from a video - Right from the Command Line!" href="./posts/create_gif_on_commandline.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
<article class="post-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">How to Revisit your Terminal Session's History
|
<h2 class="entry-hint-parent">How to Revisit your Terminal Session's History
|
||||||
@ -187,19 +197,6 @@ In order to greatly reduce the number of nodes needed in the single recipe, I cr
|
|||||||
<footer class="entry-footer"><span title='2023-10-16 11:34:14 -0400 EDT'>October 16, 2023</span> · 6 min · 1170 words · Me</footer>
|
<footer class="entry-footer"><span title='2023-10-16 11:34:14 -0400 EDT'>October 16, 2023</span> · 6 min · 1170 words · Me</footer>
|
||||||
<a class="entry-link" aria-label="post link to ESP8266 Medicine Indicator Light" href="./posts/medicine_indicator_light.html"></a>
|
<a class="entry-link" aria-label="post link to ESP8266 Medicine Indicator Light" href="./posts/medicine_indicator_light.html"></a>
|
||||||
</article>
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
|
||||||
<header class="entry-header">
|
|
||||||
<h2 class="entry-hint-parent">BirdNET-PI & HomeAssistant: Part 2
|
|
||||||
</h2>
|
|
||||||
</header>
|
|
||||||
<div class="entry-content">
|
|
||||||
<p>Checking for Entities If you’re following up on this from my first post, you’ve already added your AppDaemon script and confirmed that the AppDaemon logs don’t show any errors. Now is the true test if it’s working: do you have the new sensors in HomeAssistant?!
|
|
||||||
The best way to do this is by just type e from any screen in the HomeAssistant UI! That will bring up a list of entities....</p>
|
|
||||||
</div>
|
|
||||||
<footer class="entry-footer"><span title='2023-10-04 10:35:23 -0400 EDT'>October 4, 2023</span> · 10 min · 1986 words · Me</footer>
|
|
||||||
<a class="entry-link" aria-label="post link to BirdNET-PI & HomeAssistant: Part 2" href="./posts/birdnet_homeassistant_part2.html"></a>
|
|
||||||
</article>
|
|
||||||
<footer class="page-footer">
|
<footer class="page-footer">
|
||||||
<nav class="pagination">
|
<nav class="pagination">
|
||||||
<a class="next" href="./posts/page/2.html">Next »
|
<a class="next" href="./posts/page/2.html">Next »
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Creating a BirdNetPi Dashboard in HomeAssistant - Part 1" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Creating a BirdNetPi Dashboard in HomeAssistant - Part 1" />
|
||||||
<meta property="og:description" content="Learn how to take BirdNET-Pi Detections to create and display entities in HomeAssistant." />
|
<meta property="og:description" content="Learn how to take BirdNET-Pi Detections to create and display entities in HomeAssistant." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/birdnet_homeassistant.html" />
|
<meta property="og:url" content="/posts/birdnet_homeassistant.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="BirdNET-PI & HomeAssistant: Part 2" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="BirdNET-PI & HomeAssistant: Part 2" />
|
||||||
<meta property="og:description" content="A Follow up from the previous post, this tutorial takes all the sensors we created and loads them into a beautiful dashboard!" />
|
<meta property="og:description" content="A Follow up from the previous post, this tutorial takes all the sensors we created and loads them into a beautiful dashboard!" />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/birdnet_homeassistant_part2.html" />
|
<meta property="og:url" content="/posts/birdnet_homeassistant_part2.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
390
public/posts/create_gif_on_commandline.html
Normal file
390
public/posts/create_gif_on_commandline.html
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" dir="auto">
|
||||||
|
|
||||||
|
<head><meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line! | Norm-working Packets 💾</title>
|
||||||
|
<meta name="keywords" content="tutorial, snippets, commandline">
|
||||||
|
<meta name="description" content="create_gif_on_commandline">
|
||||||
|
<meta name="author" content="Me">
|
||||||
|
<link rel="canonical" href="../posts/create_gif_on_commandline.html">
|
||||||
|
<script defer data-domain="selfhosted.rsmsn.co" src="https://analytics.rsmsn.co/js/script.js"></script>
|
||||||
|
<link crossorigin="anonymous" href="../assets/css/stylesheet.b609c58d5c11bb90b1a54e04005d74ad1ddf22165eb79f5533967e57df9c3b50.css" integrity="sha256-tgnFjVwRu5CxpU4EAF10rR3fIhZet59VM5Z+V9+cO1A=" rel="preload stylesheet" as="style">
|
||||||
|
<link rel="icon" href="../favicon.ico">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="../rsmsncircles.ico">
|
||||||
|
<link rel="apple-touch-icon" href="../apple-touch-icon.png">
|
||||||
|
<link rel="mask-icon" href="../safari-pinned-tab.svg">
|
||||||
|
<meta name="theme-color" content="#2e2e33">
|
||||||
|
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||||
|
<link rel="alternate" hreflang="en" href="../posts/create_gif_on_commandline.html">
|
||||||
|
<noscript>
|
||||||
|
<style>
|
||||||
|
#theme-toggle,
|
||||||
|
.top-link {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Create a GIF from a video - Right from the Command Line!" />
|
||||||
|
<meta property="og:description" content="create_gif_on_commandline" />
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:url" content="/posts/create_gif_on_commandline.html" />
|
||||||
|
<meta property="og:image" content="/%3Cimage%20path/url%3E" /><meta property="article:section" content="posts" />
|
||||||
|
<meta property="article:published_time" content="2024-07-03T17:41:15-04:00" />
|
||||||
|
<meta property="article:modified_time" content="2024-07-03T17:41:15-04:00" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:image" content="/%3Cimage%20path/url%3E" />
|
||||||
|
<meta name="twitter:title" content="Create a GIF from a video - Right from the Command Line!"/>
|
||||||
|
<meta name="twitter:description" content="create_gif_on_commandline"/>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "BreadcrumbList",
|
||||||
|
"itemListElement": [
|
||||||
|
{
|
||||||
|
"@type": "ListItem",
|
||||||
|
"position": 1 ,
|
||||||
|
"name": "Posts",
|
||||||
|
"item": "/posts.html"
|
||||||
|
}
|
||||||
|
{
|
||||||
|
"@type": "ListItem",
|
||||||
|
"position": 1 ,
|
||||||
|
"name": "Create a GIF from a video - Right from the Command Line!",
|
||||||
|
"item": "/posts/create_gif_on_commandline.html"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "BlogPosting",
|
||||||
|
"headline": "Create a GIF from a video - Right from the Command Line!",
|
||||||
|
"name": "Create a GIF from a video - Right from the Command Line!",
|
||||||
|
"description": "create_gif_on_commandline",
|
||||||
|
"keywords": [
|
||||||
|
"tutorial", "snippets", "commandline"
|
||||||
|
],
|
||||||
|
"articleBody": "Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s video-to-gif used to be reliable, but the last few times it hasn’t been working as expected.\nThis last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when Dennis reads Charlie’s speech?!. Here’s the gif for your own collections.\nThe command line functions I found came to get this done came mostly from Funky Cloud Medina’s post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):\nFirst, install ffmpeg and gifsicle with Homebrew. brew install ffmpeg gifsicle\nNext, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.\nmkdir pngs/ gifs/ This will create both gifs and pngs folders in the directory you’re currently in.\nNext, we’ll process the movie.\nffmpeg -i Untitled.mov -r 10 pngs/out%04d.png Untitled.mov is the name of the video file in the directory you’re currently in and outputs each frame to the pngs folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.\nNext, we’ll use sips, the Scriptable Image Processing System. (Check out man sips from your own CLI for more info!)\nsips -s format gif pngs/*.png --out gifs Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: cd gifs\nAnd now we can use gifsicle to merge all the images into a single gif! We’ll do that with the following command:\ngifsicle --optimize=3 --delay=10 --loopcount *.gif \u003e ~/Documents/thankyou.gif And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!\n",
|
||||||
|
"wordCount" : "409",
|
||||||
|
"inLanguage": "en",
|
||||||
|
"image":"/%3Cimage%20path/url%3E","datePublished": "2024-07-03T17:41:15-04:00",
|
||||||
|
"dateModified": "2024-07-03T17:41:15-04:00",
|
||||||
|
"author":{
|
||||||
|
"@type": "Person",
|
||||||
|
"name": "Me"
|
||||||
|
},
|
||||||
|
"mainEntityOfPage": {
|
||||||
|
"@type": "WebPage",
|
||||||
|
"@id": "/posts/create_gif_on_commandline.html"
|
||||||
|
},
|
||||||
|
"publisher": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "Norm-working Packets 💾",
|
||||||
|
"logo": {
|
||||||
|
"@type": "ImageObject",
|
||||||
|
"url": "/favicon.ico"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class=" dark" id="top">
|
||||||
|
<script>
|
||||||
|
if (localStorage.getItem("pref-theme") === "light") {
|
||||||
|
document.body.classList.remove('dark')
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<header class="header">
|
||||||
|
<nav class="nav">
|
||||||
|
<div class="logo">
|
||||||
|
<a href="../" accesskey="h" title="Norm-working Packets 💾 (Alt + H)">Norm-working Packets 💾</a>
|
||||||
|
<div class="logo-switches">
|
||||||
|
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||||
|
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||||
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||||
|
stroke-linejoin="round">
|
||||||
|
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||||
|
</svg>
|
||||||
|
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||||
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||||
|
stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="5"></circle>
|
||||||
|
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||||
|
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||||
|
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||||
|
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||||
|
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||||
|
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||||
|
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||||
|
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<ul class="lang-switch"><li>|</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul id="menu">
|
||||||
|
<li>
|
||||||
|
<a href="../posts.html" title="Posts">
|
||||||
|
<span>Posts</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main class="main">
|
||||||
|
|
||||||
|
<article class="post-single">
|
||||||
|
<header class="post-header">
|
||||||
|
<div class="breadcrumbs"><a href="../">Home</a> » <a href="../posts.html">Posts</a></div>
|
||||||
|
<h1 class="post-title entry-hint-parent">
|
||||||
|
Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h1>
|
||||||
|
<div class="post-description">
|
||||||
|
create_gif_on_commandline
|
||||||
|
</div>
|
||||||
|
<div class="post-meta"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="post-content"><p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="post-footer">
|
||||||
|
<ul class="post-tags">
|
||||||
|
<li><a href="../tags/tutorial.html">Tutorial</a></li>
|
||||||
|
<li><a href="../tags/snippets.html">Snippets</a></li>
|
||||||
|
<li><a href="../tags/commandline.html">Commandline</a></li>
|
||||||
|
</ul>
|
||||||
|
<nav class="paginav">
|
||||||
|
<a class="next" href="../posts/save_terminal_to_file.html">
|
||||||
|
<span class="title">Next »</span>
|
||||||
|
<br>
|
||||||
|
<span>How to Revisit your Terminal Session's History</span>
|
||||||
|
</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
<ul class="share-buttons">
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on x"
|
||||||
|
href="https://x.com/intent/tweet/?text=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21&url=%2fposts%2fcreate_gif_on_commandline.html&hashtags=tutorial%2csnippets%2ccommandline">
|
||||||
|
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M512 62.554 L 512 449.446 C 512 483.97 483.97 512 449.446 512 L 62.554 512 C 28.03 512 0 483.97 0 449.446 L 0 62.554 C 0 28.03 28.029 0 62.554 0 L 449.446 0 C 483.971 0 512 28.03 512 62.554 Z M 269.951 190.75 L 182.567 75.216 L 56 75.216 L 207.216 272.95 L 63.9 436.783 L 125.266 436.783 L 235.9 310.383 L 332.567 436.783 L 456 436.783 L 298.367 228.367 L 432.367 75.216 L 371.033 75.216 Z M 127.633 110 L 164.101 110 L 383.481 400.065 L 349.5 400.065 Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on linkedin"
|
||||||
|
href="https://www.linkedin.com/shareArticle?mini=true&url=%2fposts%2fcreate_gif_on_commandline.html&title=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21&summary=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21&source=%2fposts%2fcreate_gif_on_commandline.html">
|
||||||
|
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-288.985,423.278l0,-225.717l-75.04,0l0,225.717l75.04,0Zm270.539,0l0,-129.439c0,-69.333 -37.018,-101.586 -86.381,-101.586c-39.804,0 -57.634,21.891 -67.617,37.266l0,-31.958l-75.021,0c0.995,21.181 0,225.717 0,225.717l75.02,0l0,-126.056c0,-6.748 0.486,-13.492 2.474,-18.315c5.414,-13.475 17.767,-27.434 38.494,-27.434c27.135,0 38.007,20.707 38.007,51.037l0,120.768l75.024,0Zm-307.552,-334.556c-25.674,0 -42.448,16.879 -42.448,39.002c0,21.658 16.264,39.002 41.455,39.002l0.484,0c26.165,0 42.452,-17.344 42.452,-39.002c-0.485,-22.092 -16.241,-38.954 -41.943,-39.002Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on reddit"
|
||||||
|
href="https://reddit.com/submit?url=%2fposts%2fcreate_gif_on_commandline.html&title=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21">
|
||||||
|
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-3.446,265.638c0,-22.964 -18.616,-41.58 -41.58,-41.58c-11.211,0 -21.361,4.457 -28.841,11.666c-28.424,-20.508 -67.586,-33.757 -111.204,-35.278l18.941,-89.121l61.884,13.157c0.756,15.734 13.642,28.29 29.56,28.29c16.407,0 29.706,-13.299 29.706,-29.701c0,-16.403 -13.299,-29.702 -29.706,-29.702c-11.666,0 -21.657,6.792 -26.515,16.578l-69.105,-14.69c-1.922,-0.418 -3.939,-0.042 -5.585,1.036c-1.658,1.073 -2.811,2.761 -3.224,4.686l-21.152,99.438c-44.258,1.228 -84.046,14.494 -112.837,35.232c-7.468,-7.164 -17.589,-11.591 -28.757,-11.591c-22.965,0 -41.585,18.616 -41.585,41.58c0,16.896 10.095,31.41 24.568,37.918c-0.639,4.135 -0.99,8.328 -0.99,12.576c0,63.977 74.469,115.836 166.33,115.836c91.861,0 166.334,-51.859 166.334,-115.836c0,-4.218 -0.347,-8.387 -0.977,-12.493c14.564,-6.47 24.735,-21.034 24.735,-38.001Zm-119.474,108.193c-20.27,20.241 -59.115,21.816 -70.534,21.816c-11.428,0 -50.277,-1.575 -70.522,-21.82c-3.007,-3.008 -3.007,-7.882 0,-10.889c3.003,-2.999 7.882,-3.003 10.885,0c12.777,12.781 40.11,17.317 59.637,17.317c19.522,0 46.86,-4.536 59.657,-17.321c3.016,-2.999 7.886,-2.995 10.885,0.008c3.008,3.011 3.003,7.882 -0.008,10.889Zm-5.23,-48.781c-16.373,0 -29.701,-13.324 -29.701,-29.698c0,-16.381 13.328,-29.714 29.701,-29.714c16.378,0 29.706,13.333 29.706,29.714c0,16.374 -13.328,29.698 -29.706,29.698Zm-160.386,-29.702c0,-16.381 13.328,-29.71 29.714,-29.71c16.369,0 29.689,13.329 29.689,29.71c0,16.373 -13.32,29.693 -29.689,29.693c-16.386,0 -29.714,-13.32 -29.714,-29.693Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on facebook"
|
||||||
|
href="https://facebook.com/sharer/sharer.php?u=%2fposts%2fcreate_gif_on_commandline.html">
|
||||||
|
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-106.468,0l0,-192.915l66.6,0l12.672,-82.621l-79.272,0l0,-53.617c0,-22.603 11.073,-44.636 46.58,-44.636l36.042,0l0,-70.34c0,0 -32.71,-5.582 -63.982,-5.582c-65.288,0 -107.96,39.569 -107.96,111.204l0,62.971l-72.573,0l0,82.621l72.573,0l0,192.915l-191.104,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on whatsapp"
|
||||||
|
href="https://api.whatsapp.com/send?text=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21%20-%20%2fposts%2fcreate_gif_on_commandline.html">
|
||||||
|
<svg version="1.1" viewBox="0 0 512 512" xml:space="preserve" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M449.446,0c34.525,0 62.554,28.03 62.554,62.554l0,386.892c0,34.524 -28.03,62.554 -62.554,62.554l-386.892,0c-34.524,0 -62.554,-28.03 -62.554,-62.554l0,-386.892c0,-34.524 28.029,-62.554 62.554,-62.554l386.892,0Zm-58.673,127.703c-33.842,-33.881 -78.847,-52.548 -126.798,-52.568c-98.799,0 -179.21,80.405 -179.249,179.234c-0.013,31.593 8.241,62.428 23.927,89.612l-25.429,92.884l95.021,-24.925c26.181,14.28 55.659,21.807 85.658,21.816l0.074,0c98.789,0 179.206,-80.413 179.247,-179.243c0.018,-47.895 -18.61,-92.93 -52.451,-126.81Zm-126.797,275.782l-0.06,0c-26.734,-0.01 -52.954,-7.193 -75.828,-20.767l-5.441,-3.229l-56.386,14.792l15.05,-54.977l-3.542,-5.637c-14.913,-23.72 -22.791,-51.136 -22.779,-79.287c0.033,-82.142 66.867,-148.971 149.046,-148.971c39.793,0.014 77.199,15.531 105.329,43.692c28.128,28.16 43.609,65.592 43.594,105.4c-0.034,82.149 -66.866,148.983 -148.983,148.984Zm81.721,-111.581c-4.479,-2.242 -26.499,-13.075 -30.604,-14.571c-4.105,-1.495 -7.091,-2.241 -10.077,2.241c-2.986,4.483 -11.569,14.572 -14.182,17.562c-2.612,2.988 -5.225,3.364 -9.703,1.12c-4.479,-2.241 -18.91,-6.97 -36.017,-22.23c-13.314,-11.876 -22.304,-26.542 -24.916,-31.026c-2.612,-4.484 -0.279,-6.908 1.963,-9.14c2.016,-2.007 4.48,-5.232 6.719,-7.847c2.24,-2.615 2.986,-4.484 4.479,-7.472c1.493,-2.99 0.747,-5.604 -0.374,-7.846c-1.119,-2.241 -10.077,-24.288 -13.809,-33.256c-3.635,-8.733 -7.327,-7.55 -10.077,-7.688c-2.609,-0.13 -5.598,-0.158 -8.583,-0.158c-2.986,0 -7.839,1.121 -11.944,5.604c-4.105,4.484 -15.675,15.32 -15.675,37.364c0,22.046 16.048,43.342 18.287,46.332c2.24,2.99 31.582,48.227 76.511,67.627c10.685,4.615 19.028,7.371 25.533,9.434c10.728,3.41 20.492,2.929 28.209,1.775c8.605,-1.285 26.499,-10.833 30.231,-21.295c3.732,-10.464 3.732,-19.431 2.612,-21.298c-1.119,-1.869 -4.105,-2.99 -8.583,-5.232Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on telegram"
|
||||||
|
href="https://telegram.me/share/url?text=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21&url=%2fposts%2fcreate_gif_on_commandline.html">
|
||||||
|
<svg version="1.1" xml:space="preserve" viewBox="2 2 28 28" height="30px" width="30px" fill="currentColor">
|
||||||
|
<path
|
||||||
|
d="M26.49,29.86H5.5a3.37,3.37,0,0,1-2.47-1,3.35,3.35,0,0,1-1-2.47V5.48A3.36,3.36,0,0,1,3,3,3.37,3.37,0,0,1,5.5,2h21A3.38,3.38,0,0,1,29,3a3.36,3.36,0,0,1,1,2.46V26.37a3.35,3.35,0,0,1-1,2.47A3.38,3.38,0,0,1,26.49,29.86Zm-5.38-6.71a.79.79,0,0,0,.85-.66L24.73,9.24a.55.55,0,0,0-.18-.46.62.62,0,0,0-.41-.17q-.08,0-16.53,6.11a.59.59,0,0,0-.41.59.57.57,0,0,0,.43.52l4,1.24,1.61,4.83a.62.62,0,0,0,.63.43.56.56,0,0,0,.4-.17L16.54,20l4.09,3A.9.9,0,0,0,21.11,23.15ZM13.8,20.71l-1.21-4q8.72-5.55,8.78-5.55c.15,0,.23,0,.23.16a.18.18,0,0,1,0,.06s-2.51,2.3-7.52,6.8Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a target="_blank" rel="noopener noreferrer" aria-label="share Create a GIF from a video - Right from the Command Line! on ycombinator"
|
||||||
|
href="https://news.ycombinator.com/submitlink?t=Create%20a%20GIF%20from%20a%20video%20-%20Right%20from%20the%20Command%20Line%21&u=%2fposts%2fcreate_gif_on_commandline.html">
|
||||||
|
<svg version="1.1" xml:space="preserve" width="30px" height="30px" viewBox="0 0 512 512" fill="currentColor"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape">
|
||||||
|
<path
|
||||||
|
d="M449.446 0C483.971 0 512 28.03 512 62.554L512 449.446C512 483.97 483.97 512 449.446 512L62.554 512C28.03 512 0 483.97 0 449.446L0 62.554C0 28.03 28.029 0 62.554 0L449.446 0ZM183.8767 87.9921H121.8427L230.6673 292.4508V424.0079H281.3328V292.4508L390.1575 87.9921H328.1233L256 238.2489z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<span>© 2024 <a href="../">Norm-working Packets 💾</a></span>
|
||||||
|
<span>
|
||||||
|
Powered by
|
||||||
|
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
|
||||||
|
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
|
||||||
|
</span>
|
||||||
|
</footer>
|
||||||
|
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||||
|
<path d="M12 6H0l6-6z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let menu = document.getElementById('menu')
|
||||||
|
if (menu) {
|
||||||
|
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||||
|
menu.onscroll = function () {
|
||||||
|
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||||
|
anchor.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var id = this.getAttribute("href").substr(1);
|
||||||
|
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||||
|
behavior: "smooth"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||||
|
}
|
||||||
|
if (id === "top") {
|
||||||
|
history.replaceState(null, null, " ");
|
||||||
|
} else {
|
||||||
|
history.pushState(null, null, `#${id}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
var mybutton = document.getElementById("top-link");
|
||||||
|
window.onscroll = function () {
|
||||||
|
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||||
|
mybutton.style.visibility = "visible";
|
||||||
|
mybutton.style.opacity = "1";
|
||||||
|
} else {
|
||||||
|
mybutton.style.visibility = "hidden";
|
||||||
|
mybutton.style.opacity = "0";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||||
|
if (document.body.className.includes("dark")) {
|
||||||
|
document.body.classList.remove('dark');
|
||||||
|
localStorage.setItem("pref-theme", 'light');
|
||||||
|
} else {
|
||||||
|
document.body.classList.add('dark');
|
||||||
|
localStorage.setItem("pref-theme", 'dark');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.querySelectorAll('pre > code').forEach((codeblock) => {
|
||||||
|
const container = codeblock.parentNode.parentNode;
|
||||||
|
|
||||||
|
const copybutton = document.createElement('button');
|
||||||
|
copybutton.classList.add('copy-code');
|
||||||
|
copybutton.innerHTML = 'copy';
|
||||||
|
|
||||||
|
function copyingDone() {
|
||||||
|
copybutton.innerHTML = 'copied!';
|
||||||
|
setTimeout(() => {
|
||||||
|
copybutton.innerHTML = 'copy';
|
||||||
|
}, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
copybutton.addEventListener('click', (cb) => {
|
||||||
|
if ('clipboard' in navigator) {
|
||||||
|
navigator.clipboard.writeText(codeblock.textContent);
|
||||||
|
copyingDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const range = document.createRange();
|
||||||
|
range.selectNodeContents(codeblock);
|
||||||
|
const selection = window.getSelection();
|
||||||
|
selection.removeAllRanges();
|
||||||
|
selection.addRange(range);
|
||||||
|
try {
|
||||||
|
document.execCommand('copy');
|
||||||
|
copyingDone();
|
||||||
|
} catch (e) { };
|
||||||
|
selection.removeRange(range);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (container.classList.contains("highlight")) {
|
||||||
|
container.appendChild(copybutton);
|
||||||
|
} else if (container.parentNode.firstChild == container) {
|
||||||
|
|
||||||
|
} else if (codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.nodeName == "TABLE") {
|
||||||
|
|
||||||
|
codeblock.parentNode.parentNode.parentNode.parentNode.parentNode.appendChild(copybutton);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
codeblock.parentNode.appendChild(copybutton);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Neovim Subtitute Magic" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Neovim Subtitute Magic" />
|
||||||
<meta property="og:description" content="I was able to speed up some of my workflows by learning how to search and replace specifics in Neovim!" />
|
<meta property="og:description" content="I was able to speed up some of my workflows by learning how to search and replace specifics in Neovim!" />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/find_and_replace_in_neovim.html" />
|
<meta property="og:url" content="/posts/find_and_replace_in_neovim.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Google Sheets to Slides with Scripts: an Automation" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Google Sheets to Slides with Scripts: an Automation" />
|
||||||
<meta property="og:description" content="Learn about running a quick automation that turns rows in your Google Sheets and plugs it into a Google Slide template to easily share more attractive content." />
|
<meta property="og:description" content="Learn about running a quick automation that turns rows in your Google Sheets and plugs it into a Google Slide template to easily share more attractive content." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/google_scripts_sheets_to_slides.html" />
|
<meta property="og:url" content="/posts/google_scripts_sheets_to_slides.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Trouble Hosting Hugo with Nginx" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Trouble Hosting Hugo with Nginx" />
|
||||||
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/hosting_hugo_troubles.html" />
|
<meta property="og:url" content="/posts/hosting_hugo_troubles.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
BIN
public/posts/img/iasip_thank_you.gif
Normal file
BIN
public/posts/img/iasip_thank_you.gif
Normal file
Binary file not shown.
BIN
public/posts/img/thankyou.gif
Normal file
BIN
public/posts/img/thankyou.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.0 MiB |
@ -6,8 +6,34 @@
|
|||||||
<description>Recent content in Posts on Norm-working Packets 💾</description>
|
<description>Recent content in Posts on Norm-working Packets 💾</description>
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<lastBuildDate>Tue, 19 Mar 2024 11:00:53 -0400</lastBuildDate>
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
<atom:link href="/posts/index.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="/posts/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line!</title>
|
||||||
|
<link>/posts/create_gif_on_commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/posts/create_gif_on_commandline.html</guid>
|
||||||
|
<description>create_gif_on_commandline</description>
|
||||||
|
<content:encoded><![CDATA[<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
]]></content:encoded>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>How to Revisit your Terminal Session's History</title>
|
<title>How to Revisit your Terminal Session's History</title>
|
||||||
<link>/posts/save_terminal_to_file.html</link>
|
<link>/posts/save_terminal_to_file.html</link>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="ESP8266 Medicine Indicator Light" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="ESP8266 Medicine Indicator Light" />
|
||||||
<meta property="og:description" content="Learn how to make an ESP8266 and a few simple components into an indicator light." />
|
<meta property="og:description" content="Learn how to make an ESP8266 and a few simple components into an indicator light." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/medicine_indicator_light.html" />
|
<meta property="og:url" content="/posts/medicine_indicator_light.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Mini Neovim" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Mini Neovim" />
|
||||||
<meta property="og:description" content="Neovim is already super efficient and lightweight, but sometimes I need a barebones config for my servers and remote, miniature development environments." />
|
<meta property="og:description" content="Neovim is already super efficient and lightweight, but sometimes I need a barebones config for my servers and remote, miniature development environments." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/mini_neovim.html" />
|
<meta property="og:url" content="/posts/mini_neovim.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Pushing a Single Local Git Repo to Multiple Remote Repos" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Pushing a Single Local Git Repo to Multiple Remote Repos" />
|
||||||
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/multiple_git_remotes.html" />
|
<meta property="og:url" content="/posts/multiple_git_remotes.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Tutorial: Move from NginxProxyManager to Nginx" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tutorial: Move from NginxProxyManager to Nginx" />
|
||||||
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
<meta property="og:description" content="Learn one way to push your git changes to multiple remote repositories." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/npm_to_nginx_tutorial.html" />
|
<meta property="og:url" content="/posts/npm_to_nginx_tutorial.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="QuickHits: OpenResty and Package Updates" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="QuickHits: OpenResty and Package Updates" />
|
||||||
<meta property="og:description" content="Every time my OpenResty package tries to update, I can't restart the service with weird errors that don't point exactly to the problem. Here's how I've learned to fix it." />
|
<meta property="og:description" content="Every time my OpenResty package tries to update, I can't restart the service with weird errors that don't point exactly to the problem. Here's how I've learned to fix it." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/openresty_and_package_update_issues.html" /><meta property="article:section" content="posts" />
|
<meta property="og:url" content="/posts/openresty_and_package_update_issues.html" /><meta property="article:section" content="posts" />
|
||||||
@ -138,11 +141,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Posts" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Posts" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/posts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/posts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -98,11 +101,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -113,6 +111,19 @@
|
|||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<article class="post-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">BirdNET-PI & HomeAssistant: Part 2
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Checking for Entities If you’re following up on this from my first post, you’ve already added your AppDaemon script and confirmed that the AppDaemon logs don’t show any errors. Now is the true test if it’s working: do you have the new sensors in HomeAssistant?!
|
||||||
|
The best way to do this is by just type e from any screen in the HomeAssistant UI! That will bring up a list of entities....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2023-10-04 10:35:23 -0400 EDT'>October 4, 2023</span> · 10 min · 1986 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to BirdNET-PI & HomeAssistant: Part 2" href="../../posts/birdnet_homeassistant_part2.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry">
|
<article class="post-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">Creating a BirdNetPi Dashboard in HomeAssistant - Part 1
|
<h2 class="entry-hint-parent">Creating a BirdNetPi Dashboard in HomeAssistant - Part 1
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="How to Revisit your Terminal Session's History" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="How to Revisit your Terminal Session's History" />
|
||||||
<meta property="og:description" content="Go beyond zsh/bash_history and save both your commands and the output to a file for later review! This command will help any homelabber that struggles with documentation for their network and services." />
|
<meta property="og:description" content="Go beyond zsh/bash_history and save both your commands and the output to a file for later review! This command will help any homelabber that struggles with documentation for their network and services." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/save_terminal_to_file.html" />
|
<meta property="og:url" content="/posts/save_terminal_to_file.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -323,6 +321,11 @@ details {
|
|||||||
<li><a href="../tags/documentation.html">Documentation</a></li>
|
<li><a href="../tags/documentation.html">Documentation</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<nav class="paginav">
|
<nav class="paginav">
|
||||||
|
<a class="prev" href="../posts/create_gif_on_commandline.html">
|
||||||
|
<span class="title">« Prev</span>
|
||||||
|
<br>
|
||||||
|
<span>Create a GIF from a video - Right from the Command Line!</span>
|
||||||
|
</a>
|
||||||
<a class="next" href="../posts/google_scripts_sheets_to_slides.html">
|
<a class="next" href="../posts/google_scripts_sheets_to_slides.html">
|
||||||
<span class="title">Next »</span>
|
<span class="title">Next »</span>
|
||||||
<br>
|
<br>
|
||||||
|
|||||||
@ -28,7 +28,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="My First Merged PR!" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="My First Merged PR!" />
|
||||||
<meta property="og:description" content="Child like joy of having my first merged PR! I recently was using Whiptail library and fixed a bug." />
|
<meta property="og:description" content="Child like joy of having my first merged PR! I recently was using Whiptail library and fixed a bug." />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/posts/whiptail-first-merged-pr.html" />
|
<meta property="og:url" content="/posts/whiptail-first-merged-pr.html" />
|
||||||
@ -140,11 +143,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Search" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Search" />
|
||||||
<meta property="og:description" content="search" />
|
<meta property="og:description" content="search" />
|
||||||
<meta property="og:type" content="article" />
|
<meta property="og:type" content="article" />
|
||||||
<meta property="og:url" content="/search.html" /><meta property="article:section" content="" />
|
<meta property="og:url" content="/search.html" /><meta property="article:section" content="" />
|
||||||
@ -133,11 +136,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Series" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Series" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/series.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/series.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -2,6 +2,27 @@
|
|||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||||
<url>
|
<url>
|
||||||
|
<loc>/tags/commandline.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/posts/create_gif_on_commandline.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/posts.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/tags/snippets.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/tags.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
|
<loc>/tags/tutorial.html</loc>
|
||||||
|
<lastmod>2024-07-03T17:41:15-04:00</lastmod>
|
||||||
|
</url><url>
|
||||||
<loc>/tags/cli.html</loc>
|
<loc>/tags/cli.html</loc>
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
||||||
</url><url>
|
</url><url>
|
||||||
@ -10,15 +31,6 @@
|
|||||||
</url><url>
|
</url><url>
|
||||||
<loc>/posts/save_terminal_to_file.html</loc>
|
<loc>/posts/save_terminal_to_file.html</loc>
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
||||||
</url><url>
|
|
||||||
<loc>/</loc>
|
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
|
||||||
</url><url>
|
|
||||||
<loc>/posts.html</loc>
|
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
|
||||||
</url><url>
|
|
||||||
<loc>/tags.html</loc>
|
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
|
||||||
</url><url>
|
</url><url>
|
||||||
<loc>/tags/terminal.html</loc>
|
<loc>/tags/terminal.html</loc>
|
||||||
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
<lastmod>2024-03-19T11:00:53-04:00</lastmod>
|
||||||
@ -76,9 +88,6 @@
|
|||||||
</url><url>
|
</url><url>
|
||||||
<loc>/posts/medicine_indicator_light.html</loc>
|
<loc>/posts/medicine_indicator_light.html</loc>
|
||||||
<lastmod>2023-10-16T11:34:14-04:00</lastmod>
|
<lastmod>2023-10-16T11:34:14-04:00</lastmod>
|
||||||
</url><url>
|
|
||||||
<loc>/tags/tutorial.html</loc>
|
|
||||||
<lastmod>2023-10-16T11:34:14-04:00</lastmod>
|
|
||||||
</url><url>
|
</url><url>
|
||||||
<loc>/posts/birdnet_homeassistant_part2.html</loc>
|
<loc>/posts/birdnet_homeassistant_part2.html</loc>
|
||||||
<lastmod>2023-10-04T10:35:23-04:00</lastmod>
|
<lastmod>2023-10-04T10:35:23-04:00</lastmod>
|
||||||
@ -94,9 +103,6 @@
|
|||||||
</url><url>
|
</url><url>
|
||||||
<loc>/tags/backups.html</loc>
|
<loc>/tags/backups.html</loc>
|
||||||
<lastmod>2023-09-22T15:07:10-04:00</lastmod>
|
<lastmod>2023-09-22T15:07:10-04:00</lastmod>
|
||||||
</url><url>
|
|
||||||
<loc>/tags/commandline.html</loc>
|
|
||||||
<lastmod>2023-09-22T15:07:10-04:00</lastmod>
|
|
||||||
</url><url>
|
</url><url>
|
||||||
<loc>/tags/git.html</loc>
|
<loc>/tags/git.html</loc>
|
||||||
<lastmod>2023-09-22T15:07:10-04:00</lastmod>
|
<lastmod>2023-09-22T15:07:10-04:00</lastmod>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Tags" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tags" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="./search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -104,7 +102,7 @@
|
|||||||
<a href="./tags/cli.html">cli <sup><strong><sup>1</sup></strong></sup> </a>
|
<a href="./tags/cli.html">cli <sup><strong><sup>1</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="./tags/commandline.html">commandline <sup><strong><sup>3</sup></strong></sup> </a>
|
<a href="./tags/commandline.html">commandline <sup><strong><sup>4</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="./tags/diy.html">diy <sup><strong><sup>4</sup></strong></sup> </a>
|
<a href="./tags/diy.html">diy <sup><strong><sup>4</sup></strong></sup> </a>
|
||||||
@ -151,6 +149,9 @@
|
|||||||
<li>
|
<li>
|
||||||
<a href="./tags/snippet.html">snippet <sup><strong><sup>1</sup></strong></sup> </a>
|
<a href="./tags/snippet.html">snippet <sup><strong><sup>1</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="./tags/snippets.html">snippets <sup><strong><sup>1</sup></strong></sup> </a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="./tags/terminal.html">terminal <sup><strong><sup>1</sup></strong></sup> </a>
|
<a href="./tags/terminal.html">terminal <sup><strong><sup>1</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
@ -158,7 +159,7 @@
|
|||||||
<a href="./tags/tools.html">tools <sup><strong><sup>1</sup></strong></sup> </a>
|
<a href="./tags/tools.html">tools <sup><strong><sup>1</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="./tags/tutorial.html">tutorial <sup><strong><sup>1</sup></strong></sup> </a>
|
<a href="./tags/tutorial.html">tutorial <sup><strong><sup>2</sup></strong></sup> </a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</main>
|
</main>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Backups" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Backups" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/backups.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/backups.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Cli" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Cli" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/cli.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/cli.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Commandline" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Commandline" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/commandline.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/commandline.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -98,6 +96,18 @@
|
|||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<article class="post-entry tag-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to Create a GIF from a video - Right from the Command Line!" href="../posts/create_gif_on_commandline.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry tag-entry">
|
<article class="post-entry tag-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">Pushing a Single Local Git Repo to Multiple Remote Repos
|
<h2 class="entry-hint-parent">Pushing a Single Local Git Repo to Multiple Remote Repos
|
||||||
|
|||||||
@ -6,8 +6,34 @@
|
|||||||
<description>Recent content in Commandline on Norm-working Packets 💾</description>
|
<description>Recent content in Commandline on Norm-working Packets 💾</description>
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<lastBuildDate>Fri, 22 Sep 2023 15:07:10 -0400</lastBuildDate>
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
<atom:link href="/tags/commandline/index.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="/tags/commandline/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line!</title>
|
||||||
|
<link>/posts/create_gif_on_commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/posts/create_gif_on_commandline.html</guid>
|
||||||
|
<description>create_gif_on_commandline</description>
|
||||||
|
<content:encoded><![CDATA[<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
]]></content:encoded>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>Pushing a Single Local Git Repo to Multiple Remote Repos</title>
|
<title>Pushing a Single Local Git Repo to Multiple Remote Repos</title>
|
||||||
<link>/posts/multiple_git_remotes.html</link>
|
<link>/posts/multiple_git_remotes.html</link>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Diy" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Diy" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/diy.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/diy.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Documentation" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Documentation" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/documentation.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/documentation.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Esp" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Esp" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/esp.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/esp.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Git" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Git" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/git.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/git.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Google" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Google" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/google.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/google.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Homeassistant" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Homeassistant" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/homeassistant.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/homeassistant.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -6,8 +6,29 @@
|
|||||||
<description>Recent content in Tags on Norm-working Packets 💾</description>
|
<description>Recent content in Tags on Norm-working Packets 💾</description>
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<lastBuildDate>Tue, 19 Mar 2024 11:00:53 -0400</lastBuildDate>
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
<atom:link href="/tags/index.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Commandline</title>
|
||||||
|
<link>/tags/commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/tags/commandline.html</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Snippets</title>
|
||||||
|
<link>/tags/snippets.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/tags/snippets.html</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<title>Tutorial</title>
|
||||||
|
<link>/tags/tutorial.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/tags/tutorial.html</guid>
|
||||||
|
<description></description>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>Cli</title>
|
<title>Cli</title>
|
||||||
<link>/tags/cli.html</link>
|
<link>/tags/cli.html</link>
|
||||||
@ -106,13 +127,6 @@
|
|||||||
<guid>/tags/esp.html</guid>
|
<guid>/tags/esp.html</guid>
|
||||||
<description></description>
|
<description></description>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<title>Tutorial</title>
|
|
||||||
<link>/tags/tutorial.html</link>
|
|
||||||
<pubDate>Mon, 16 Oct 2023 11:34:14 -0400</pubDate>
|
|
||||||
<guid>/tags/tutorial.html</guid>
|
|
||||||
<description></description>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<title>Homeassistant</title>
|
<title>Homeassistant</title>
|
||||||
<link>/tags/homeassistant.html</link>
|
<link>/tags/homeassistant.html</link>
|
||||||
@ -134,13 +148,6 @@
|
|||||||
<guid>/tags/backups.html</guid>
|
<guid>/tags/backups.html</guid>
|
||||||
<description></description>
|
<description></description>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<title>Commandline</title>
|
|
||||||
<link>/tags/commandline.html</link>
|
|
||||||
<pubDate>Fri, 22 Sep 2023 15:07:10 -0400</pubDate>
|
|
||||||
<guid>/tags/commandline.html</guid>
|
|
||||||
<description></description>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<title>Git</title>
|
<title>Git</title>
|
||||||
<link>/tags/git.html</link>
|
<link>/tags/git.html</link>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Neovim" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Neovim" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/neovim.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/neovim.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Nginx" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Nginx" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/nginx.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/nginx.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Opensource" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Opensource" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/opensource.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/opensource.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Python" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Python" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/python.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/python.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Quick Hits" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Quick Hits" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/quick-hits.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/quick-hits.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Scripts" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Scripts" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/scripts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/scripts.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Selfhosted" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Selfhosted" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/selfhosted.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/selfhosted.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Sheets" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Sheets" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/sheets.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/sheets.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Snippet" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Snippet" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/snippet.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/snippet.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
182
public/tags/snippets.html
Normal file
182
public/tags/snippets.html
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" dir="auto">
|
||||||
|
|
||||||
|
<head><meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
|
<meta name="robots" content="index, follow">
|
||||||
|
<title>Snippets | Norm-working Packets 💾</title>
|
||||||
|
<meta name="keywords" content="">
|
||||||
|
<meta name="description" content="A semi-technical blog & series of experiences working in tech and my homelab">
|
||||||
|
<meta name="author" content="Norm Rasmussen">
|
||||||
|
<link rel="canonical" href="../tags/snippets.html">
|
||||||
|
<script defer data-domain="selfhosted.rsmsn.co" src="https://analytics.rsmsn.co/js/script.js"></script>
|
||||||
|
<link crossorigin="anonymous" href="../assets/css/stylesheet.b609c58d5c11bb90b1a54e04005d74ad1ddf22165eb79f5533967e57df9c3b50.css" integrity="sha256-tgnFjVwRu5CxpU4EAF10rR3fIhZet59VM5Z+V9+cO1A=" rel="preload stylesheet" as="style">
|
||||||
|
<link rel="icon" href="../favicon.ico">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="../rsmsncircles.ico">
|
||||||
|
<link rel="apple-touch-icon" href="../apple-touch-icon.png">
|
||||||
|
<link rel="mask-icon" href="../safari-pinned-tab.svg">
|
||||||
|
<meta name="theme-color" content="#2e2e33">
|
||||||
|
<meta name="msapplication-TileColor" content="#2e2e33">
|
||||||
|
<link rel="alternate" type="application/rss+xml" href="../tags/snippets/index.xml">
|
||||||
|
<link rel="alternate" hreflang="en" href="../tags/snippets.html">
|
||||||
|
<noscript>
|
||||||
|
<style>
|
||||||
|
#theme-toggle,
|
||||||
|
.top-link {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Snippets" />
|
||||||
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:url" content="/tags/snippets.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
|
|
||||||
|
<meta name="twitter:card" content="summary"/>
|
||||||
|
<meta name="twitter:title" content="Snippets"/>
|
||||||
|
<meta name="twitter:description" content="A semi-technical blog & series of experiences working in tech and my homelab"/>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="list dark" id="top">
|
||||||
|
<script>
|
||||||
|
if (localStorage.getItem("pref-theme") === "light") {
|
||||||
|
document.body.classList.remove('dark')
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<header class="header">
|
||||||
|
<nav class="nav">
|
||||||
|
<div class="logo">
|
||||||
|
<a href="../" accesskey="h" title="Norm-working Packets 💾 (Alt + H)">Norm-working Packets 💾</a>
|
||||||
|
<div class="logo-switches">
|
||||||
|
<button id="theme-toggle" accesskey="t" title="(Alt + T)">
|
||||||
|
<svg id="moon" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||||
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||||
|
stroke-linejoin="round">
|
||||||
|
<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path>
|
||||||
|
</svg>
|
||||||
|
<svg id="sun" xmlns="http://www.w3.org/2000/svg" width="24" height="18" viewBox="0 0 24 24"
|
||||||
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||||
|
stroke-linejoin="round">
|
||||||
|
<circle cx="12" cy="12" r="5"></circle>
|
||||||
|
<line x1="12" y1="1" x2="12" y2="3"></line>
|
||||||
|
<line x1="12" y1="21" x2="12" y2="23"></line>
|
||||||
|
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
|
||||||
|
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
|
||||||
|
<line x1="1" y1="12" x2="3" y2="12"></line>
|
||||||
|
<line x1="21" y1="12" x2="23" y2="12"></line>
|
||||||
|
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
|
||||||
|
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<ul class="lang-switch"><li>|</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul id="menu">
|
||||||
|
<li>
|
||||||
|
<a href="../posts.html" title="Posts">
|
||||||
|
<span>Posts</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</header>
|
||||||
|
<main class="main">
|
||||||
|
<header class="page-header"><div class="breadcrumbs"><a href="../">Home</a> » <a href="../tags.html">Tags</a></div>
|
||||||
|
<h1>
|
||||||
|
Snippets
|
||||||
|
</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<article class="post-entry tag-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to Create a GIF from a video - Right from the Command Line!" href="../posts/create_gif_on_commandline.html"></a>
|
||||||
|
</article>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="footer">
|
||||||
|
<span>© 2024 <a href="../">Norm-working Packets 💾</a></span>
|
||||||
|
<span>
|
||||||
|
Powered by
|
||||||
|
<a href="https://gohugo.io/" rel="noopener noreferrer" target="_blank">Hugo</a> &
|
||||||
|
<a href="https://github.com/adityatelange/hugo-PaperMod/" rel="noopener" target="_blank">PaperMod</a>
|
||||||
|
</span>
|
||||||
|
</footer>
|
||||||
|
<a href="#top" aria-label="go to top" title="Go to Top (Alt + G)" class="top-link" id="top-link" accesskey="g">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 6" fill="currentColor">
|
||||||
|
<path d="M12 6H0l6-6z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
let menu = document.getElementById('menu')
|
||||||
|
if (menu) {
|
||||||
|
menu.scrollLeft = localStorage.getItem("menu-scroll-position");
|
||||||
|
menu.onscroll = function () {
|
||||||
|
localStorage.setItem("menu-scroll-position", menu.scrollLeft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||||
|
anchor.addEventListener("click", function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var id = this.getAttribute("href").substr(1);
|
||||||
|
if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView({
|
||||||
|
behavior: "smooth"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
document.querySelector(`[id='${decodeURIComponent(id)}']`).scrollIntoView();
|
||||||
|
}
|
||||||
|
if (id === "top") {
|
||||||
|
history.replaceState(null, null, " ");
|
||||||
|
} else {
|
||||||
|
history.pushState(null, null, `#${id}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
var mybutton = document.getElementById("top-link");
|
||||||
|
window.onscroll = function () {
|
||||||
|
if (document.body.scrollTop > 800 || document.documentElement.scrollTop > 800) {
|
||||||
|
mybutton.style.visibility = "visible";
|
||||||
|
mybutton.style.opacity = "1";
|
||||||
|
} else {
|
||||||
|
mybutton.style.visibility = "hidden";
|
||||||
|
mybutton.style.opacity = "0";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script>
|
||||||
|
document.getElementById("theme-toggle").addEventListener("click", () => {
|
||||||
|
if (document.body.className.includes("dark")) {
|
||||||
|
document.body.classList.remove('dark');
|
||||||
|
localStorage.setItem("pref-theme", 'light');
|
||||||
|
} else {
|
||||||
|
document.body.classList.add('dark');
|
||||||
|
localStorage.setItem("pref-theme", 'dark');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
38
public/tags/snippets/index.xml
Normal file
38
public/tags/snippets/index.xml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
<?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>Snippets on Norm-working Packets 💾</title>
|
||||||
|
<link>/tags/snippets.html</link>
|
||||||
|
<description>Recent content in Snippets on Norm-working Packets 💾</description>
|
||||||
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
|
<language>en-us</language>
|
||||||
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
|
<atom:link href="/tags/snippets/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line!</title>
|
||||||
|
<link>/posts/create_gif_on_commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/posts/create_gif_on_commandline.html</guid>
|
||||||
|
<description>create_gif_on_commandline</description>
|
||||||
|
<content:encoded><![CDATA[<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
]]></content:encoded>
|
||||||
|
</item>
|
||||||
|
</channel>
|
||||||
|
</rss>
|
||||||
10
public/tags/snippets/page/1.html
Normal file
10
public/tags/snippets/page/1.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<title>/tags/snippets.html</title>
|
||||||
|
<link rel="canonical" href="../../../tags/snippets.html">
|
||||||
|
<meta name="robots" content="noindex">
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="refresh" content="0; url=../../../tags/snippets.html">
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Terminal" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Terminal" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/terminal.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/terminal.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Tools" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tools" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/tools.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/tools.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -29,7 +29,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
</noscript><meta property="og:title" content="Tutorial" />
|
</noscript>
|
||||||
|
|
||||||
|
|
||||||
|
<meta property="og:title" content="Tutorial" />
|
||||||
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
<meta property="og:description" content="A semi-technical blog & series of experiences working in tech and my homelab" />
|
||||||
<meta property="og:type" content="website" />
|
<meta property="og:type" content="website" />
|
||||||
<meta property="og:url" content="/tags/tutorial.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
<meta property="og:url" content="/tags/tutorial.html" /><meta property="og:site_name" content="Self-hosted Norm" />
|
||||||
@ -83,11 +86,6 @@
|
|||||||
<span>Posts</span>
|
<span>Posts</span>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<a href="../search.html" title="Search (Alt + /)" accesskey=/>
|
|
||||||
<span>Search</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
@ -98,6 +96,18 @@
|
|||||||
</h1>
|
</h1>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<article class="post-entry tag-entry">
|
||||||
|
<header class="entry-header">
|
||||||
|
<h2 class="entry-hint-parent">Create a GIF from a video - Right from the Command Line!
|
||||||
|
</h2>
|
||||||
|
</header>
|
||||||
|
<div class="entry-content">
|
||||||
|
<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution....</p>
|
||||||
|
</div>
|
||||||
|
<footer class="entry-footer"><span title='2024-07-03 17:41:15 -0400 EDT'>July 3, 2024</span> · 2 min · 409 words · Me</footer>
|
||||||
|
<a class="entry-link" aria-label="post link to Create a GIF from a video - Right from the Command Line!" href="../posts/create_gif_on_commandline.html"></a>
|
||||||
|
</article>
|
||||||
|
|
||||||
<article class="post-entry tag-entry">
|
<article class="post-entry tag-entry">
|
||||||
<header class="entry-header">
|
<header class="entry-header">
|
||||||
<h2 class="entry-hint-parent">ESP8266 Medicine Indicator Light
|
<h2 class="entry-hint-parent">ESP8266 Medicine Indicator Light
|
||||||
|
|||||||
@ -6,8 +6,34 @@
|
|||||||
<description>Recent content in Tutorial on Norm-working Packets 💾</description>
|
<description>Recent content in Tutorial on Norm-working Packets 💾</description>
|
||||||
<generator>Hugo -- gohugo.io</generator>
|
<generator>Hugo -- gohugo.io</generator>
|
||||||
<language>en-us</language>
|
<language>en-us</language>
|
||||||
<lastBuildDate>Mon, 16 Oct 2023 11:34:14 -0400</lastBuildDate>
|
<lastBuildDate>Wed, 03 Jul 2024 17:41:15 -0400</lastBuildDate>
|
||||||
<atom:link href="/tags/tutorial/index.xml" rel="self" type="application/rss+xml" />
|
<atom:link href="/tags/tutorial/index.xml" rel="self" type="application/rss+xml" />
|
||||||
|
<item>
|
||||||
|
<title>Create a GIF from a video - Right from the Command Line!</title>
|
||||||
|
<link>/posts/create_gif_on_commandline.html</link>
|
||||||
|
<pubDate>Wed, 03 Jul 2024 17:41:15 -0400</pubDate>
|
||||||
|
<guid>/posts/create_gif_on_commandline.html</guid>
|
||||||
|
<description>create_gif_on_commandline</description>
|
||||||
|
<content:encoded><![CDATA[<p>Finding this little set of commands is one of the main reasons why I love the Command Line. Once I realized that almost everything that I was doing in a UI was possible on the CLI, the world opened up. One of the things I return to from time to time is when I can’t find a GIF I want to use in a message or email. Every time, I look up how to convert a video to a GIF and every time, I’m given a new solution. Imgur’s <a href="https://imgur.com/vidgif">video-to-gif</a> used to be reliable, but the last few times it hasn’t been working as expected.</p>
|
||||||
|
<p>This last time, I was trying to convert a very important It’s Always Sunny in Philadelphia clip to a reaction gif. Can you believe there is no “thank you” reaction gif from when <a href="https://www.youtube.com/watch?v=ROCKGuuviis">Dennis reads Charlie’s speech?!</a>. Here’s the gif for your own collections.</p>
|
||||||
|
<p><img loading="lazy" src="../posts/img/thankyou.gif" alt="Charlie &amp; Dennis Thank you Gif" />
|
||||||
|
</p>
|
||||||
|
<p>The command line functions I found came to get this done came mostly from <a href="https://www.funkycloudmedina.com/2022/06/convert-a-video-file-to-a-gif-using-a-macos-automator-task/">Funky Cloud Medina’s</a> post on this. I didn’t want to use automator, but just write out a few commands, so here is what I did (on MacOS):</p>
|
||||||
|
<p>First, install ffmpeg and gifsicle with Homebrew. <code>brew install ffmpeg gifsicle</code></p>
|
||||||
|
<p>Next, navigate to the directory where your video is. If you plan on doing this regularly, you can create some permanent directories, but I started with creating two temporary directories for the images and then the final gifs.</p>
|
||||||
|
<pre tabindex="0"><code class="language-conf" data-lang="conf">mkdir pngs/ gifs/
|
||||||
|
</code></pre><p>This will create both <code>gifs</code> and <code>pngs</code> folders in the directory you’re currently in.</p>
|
||||||
|
<p>Next, we’ll process the movie.</p>
|
||||||
|
<pre tabindex="0"><code>ffmpeg -i Untitled.mov -r 10 pngs/out%04d.png
|
||||||
|
</code></pre><p><code>Untitled.mov</code> is the name of the video file in the directory you’re currently in and outputs each frame to the <code>pngs</code> folder with increment digits. The incrementing digits are so you don’t overwrite everything and end up with just a single picture file.</p>
|
||||||
|
<p>Next, we’ll use <code>sips</code>, the Scriptable Image Processing System. (Check out <code>man sips</code> from your own CLI for more info!)</p>
|
||||||
|
<pre tabindex="0"><code>sips -s format gif pngs/*.png --out gifs
|
||||||
|
</code></pre><p>Almost there! This is processing all the image files into the gifs folder. Let’s now move into the gifs folder with cd: <code>cd gifs</code></p>
|
||||||
|
<p>And now we can use <a href="https://www.lcdf.org/gifsicle/">gifsicle</a> to merge all the images into a single gif! We’ll do that with the following command:</p>
|
||||||
|
<pre tabindex="0"><code>gifsicle --optimize=3 --delay=10 --loopcount *.gif > ~/Documents/thankyou.gif
|
||||||
|
</code></pre><p>And voila! You should have a auto-playing gif file ready for use in all your reactions and emails. Enjoy!</p>
|
||||||
|
]]></content:encoded>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<title>ESP8266 Medicine Indicator Light</title>
|
<title>ESP8266 Medicine Indicator Light</title>
|
||||||
<link>/posts/medicine_indicator_light.html</link>
|
<link>/posts/medicine_indicator_light.html</link>
|
||||||
|
|||||||
78
thermostat-test.yaml
Normal file
78
thermostat-test.yaml
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
esphome:
|
||||||
|
name: thermostat-bedroom
|
||||||
|
friendly_name: thermostat-bedroom
|
||||||
|
platform: ESP8266
|
||||||
|
board: esp12e
|
||||||
|
#board: nodemcuv2
|
||||||
|
|
||||||
|
# Enable logging
|
||||||
|
logger:
|
||||||
|
|
||||||
|
# Enable Home Assistant API
|
||||||
|
api:
|
||||||
|
encryption:
|
||||||
|
key: "FwV4CMZTQlJAV/tX/ga3sBJ84LgwX8Y94+rUIJAZ7UQ="
|
||||||
|
|
||||||
|
ota:
|
||||||
|
password: "b85f91e578339455d1eb6f4c91a0c413"
|
||||||
|
|
||||||
|
wifi:
|
||||||
|
ssid: "Saints&Strangers_"
|
||||||
|
password: "xYhnac-5mixdu"
|
||||||
|
|
||||||
|
# Enable fallback hotspot (captive portal) in case wifi connection fails
|
||||||
|
ap:
|
||||||
|
ssid: "Thermostat-Bedroom"
|
||||||
|
password: "yUHEnZm3ZARc"
|
||||||
|
|
||||||
|
captive_portal:
|
||||||
|
|
||||||
|
number:
|
||||||
|
- platform: template
|
||||||
|
name: "ac_target_temp_slider"
|
||||||
|
id: "ac_target_temp_slider"
|
||||||
|
step: 1
|
||||||
|
min_value: 50
|
||||||
|
max_value: 80
|
||||||
|
mode: slider
|
||||||
|
|
||||||
|
binary_sensor:
|
||||||
|
- platform: gpio
|
||||||
|
pin: GPIO14
|
||||||
|
name: "Target Temp Increment"
|
||||||
|
device_class: button
|
||||||
|
|
||||||
|
button:
|
||||||
|
- platform: template
|
||||||
|
name: "Target Temp Increment"
|
||||||
|
id: increment_target_temp
|
||||||
|
on_press:
|
||||||
|
- number.increment:
|
||||||
|
id: ac_target_temp_slider
|
||||||
|
cycle: false
|
||||||
|
|
||||||
|
sensor:
|
||||||
|
- platform: homeassistant
|
||||||
|
name: "House Temperature"
|
||||||
|
id: house_temp
|
||||||
|
entity_id: sensor.house_temperature_avg
|
||||||
|
|
||||||
|
font:
|
||||||
|
- file: 'fonts/Roboto-Thin.ttf'
|
||||||
|
id: font1
|
||||||
|
size: 15
|
||||||
|
|
||||||
|
i2c:
|
||||||
|
sda: GPIO4
|
||||||
|
scl: GPIO5
|
||||||
|
|
||||||
|
display:
|
||||||
|
- platform: ssd1306_i2c
|
||||||
|
model: "SSD1306 128x64"
|
||||||
|
address: 0x3D
|
||||||
|
lambda: |-
|
||||||
|
it.printf(0, 0, id(font1), "Set Temp:");
|
||||||
|
it.printf(5, 22, id(font), "%.1f%°F", id(ac_target_temp).state);
|
||||||
|
it.printf(0, 0, id(font1), "Current Temp:");
|
||||||
|
it.printf(5, 22, id(font), "%.1f%°F", id(house_temp).state);
|
||||||
|
|
||||||
Reference in New Issue
Block a user