tag:blogger.com,1999:blog-309260812024-02-19T03:25:13.808-08:00Mitch Fincher: The Distracted ProgrammerI'm blogging about programming, but ... hey look over there - it's something shiny!Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.comBlogger533125tag:blogger.com,1999:blog-30926081.post-80832532947459970982023-10-19T13:18:00.002-07:002023-10-19T13:18:48.847-07:00CostPlusDrugs.com is a winner<p> I just picked up a tube of Mometasone Furoate from CVS. Cost me $44.21. I came home and checked on <a href="http://CostPlusDrugs.com">CostPlusDrugs.com</a>. It's on $14.15 for the same amount and strength. Next time I'll wait and check CostPlusDrugs.com and GoodRx.com before having my doctor phone it in to CVS.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjuwf4d0C2MdsLdtDZZ--pFmL-eg1N-IeV9oE0H5p7I4GdZ68Wja-74akG4duG9Yb-qL15dADkKOtgfqSjQGrRXDGMagDY7XCsLapx7gNzQB8-MWD_qeIlmppCxFWmOKcOYqrlw6r31b__DfDjsZHmPrQ9HuXvWd5PaPZKqgQD67QjWY3vtwMt5" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="351" data-original-width="318" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEjuwf4d0C2MdsLdtDZZ--pFmL-eg1N-IeV9oE0H5p7I4GdZ68Wja-74akG4duG9Yb-qL15dADkKOtgfqSjQGrRXDGMagDY7XCsLapx7gNzQB8-MWD_qeIlmppCxFWmOKcOYqrlw6r31b__DfDjsZHmPrQ9HuXvWd5PaPZKqgQD67QjWY3vtwMt5" width="217" /></a></div><br /><p></p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-73598209146961370102022-09-21T13:37:00.003-07:002022-09-23T15:46:11.635-07:00Best Wordle Words MathematicallyBest Wordle Words Mathematically<div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgXN8X_h1vxt-j4Js6Z5ccuO_kIJwiBQG3qUo4olrrrzNqy39SBVFWzDUHQIXUftE4MHI60jDbDvbBjogmMaSXT1BexaUNEuox7euJXCpi6kwCwHXlQ8cYkpaK8Z5YEbqgNN-3dNAwXjHWX2rJOlc2DI13r3Zj06BSGTQTCqH_vz3pXx5k4og" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="846" data-original-width="704" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEgXN8X_h1vxt-j4Js6Z5ccuO_kIJwiBQG3qUo4olrrrzNqy39SBVFWzDUHQIXUftE4MHI60jDbDvbBjogmMaSXT1BexaUNEuox7euJXCpi6kwCwHXlQ8cYkpaK8Z5YEbqgNN-3dNAwXjHWX2rJOlc2DI13r3Zj06BSGTQTCqH_vz3pXx5k4og" width="200" /></a></div><br /></div><br /></div><div>TLDR: Best Wordle Words</div><div><div><div>AROSE</div><div>UNTIL</div><div>DUCHY</div><div>BLIMP</div><div>GAWKY</div></div><div><br /><br /></div><div><br /></div></div><div>How to select the best words to guess in Wordle?</div><div><br /></div><div>Here's my strategy:</div><div><br /></div><div>1. Find the <a href="https://towardsdatascience.com/a-frequency-analysis-on-wordle-9c5778283363">frequency</a> of letters in words for five letter words:</div><div><div>AESORILTNUDCYMPHBGKFWVQJXQ</div></div><div><br /></div><div>2. Now going left to right find words that contain the most frequently used letters.</div><div><br /></div><div><span id="docs-internal-guid-bc3ad30b-7fff-1887-8dd6-feac5a40679a"><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="background-color: yellow; font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">AESOR</span><span style="font-family: Arial; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"> ILTNU DCYMPHBGKFWVQJXQ</span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="font-family: Arial; white-space: pre-wrap;">How to find what words contain AESOR?</span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><br /></span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">We can use the tool "grep" on unix with something like this which finds all five letters words with AESOR.</span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;">[Trigger warning: actual unix tools code😱:]</span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="background-color: #eeeeee; color: black; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">grep "^[a-z]\{5\}$" /usr/share/dict/words | grep a | grep e | grep s | grep o | grep r</span></span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"><span id="docs-internal-guid-1d11dc3c-7fff-b47a-ade4-d674956e6c0e"></span></span></span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;"><br /></span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 14pt; font-style: normal; font-variant: normal; font-weight: 400; text-decoration: none; vertical-align: baseline; white-space: pre;">One word pops out: “AROSE”.</span></p><p dir="ltr" style="line-height: 1.35; margin-bottom: 0pt; margin-right: -31.5pt; margin-top: 0pt;"><br /></p><div><span style="font-family: Arial; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space: pre-wrap;"><div>2. Now look at the letters that are next:</div><div style="font-size: 26pt;"><span style="background-color: yellow; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div style="font-size: 26pt;"><span style="background-color: yellow; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">ILTNU </span><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">DCYMPHBGKFWVQJXQ</span></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span style="font-size: medium;">Fortunately one word fits the bill, "UNTIL"</span></span></div><div><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">3. Looking at the next letters, we don't have a word that contains "DCYMP", so we get as many as we can and then get the next most frequently used letters:</span></div><div><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><span id="docs-internal-guid-75e82229-7fff-a7ff-d05a-c36fbdd55f76"><p dir="ltr" style="font-size: 26pt; line-height: 1.35; margin-bottom: 0pt; margin-top: 0pt;"><span style="background-color: yellow; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">DCY</span><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">MP</span><span style="background-color: yellow; font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">H</span><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">BGKFWVQJXQ</span></p><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Which produces "DUCHY".</span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Then the next word is "GAWKY".</span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">Enjoy.</span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">---------------------------------------------------------------------------------------------</span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">PS: A bonus graphic showing probability of letter distribution within a word.</span></div><div><span style="font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"> So when you get a "w", it's usually in the first two letters, and a "y" is near the end.</span></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span><img alt="Image" class="css-9pa8cd" draggable="true" src="https://pbs.twimg.com/media/FdU9okYWYAM3A0D?format=jpg&name=small" /></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div><div style="font-size: 26pt;"><span style="font-size: 26pt; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;"><br /></span></div></span></span></div></span></div></span></div>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-64382184432198761052022-09-10T15:05:00.000-07:002022-09-10T15:05:37.216-07:00How to Programmatically Add Tags to Files in OS X on a Mac Using C# Without LibrariesWhile working on photos, I wanted to programmatically add tags to photos. The tags would be read from a file.
I formally used Finder to do this, but it can be tedious for a large universe of tags and there's no record of the association.
Here's my solution which is really awkward and brittle. Surely there is a better way. Please add your comments on that way. Until then, I'll use this code.
<pre>
using System;
using System.Diagnostics;
namespace ImageDescriptions
{
public class Utilities
{
public static string? executeShellCommand(string scriptFile, string arguments)
{
var processInfo = new ProcessStartInfo()
{
FileName = scriptFile,
Arguments = arguments,
UseShellExecute = false,
RedirectStandardOutput = true,
CreateNoWindow = true
};
string? result = string.Empty;
Process process = Process.Start(processInfo); // Start that process.
while (!process.StandardOutput.EndOfStream)
{
result = process.StandardOutput.ReadLine();
System.Console.WriteLine("result: " + result);
}
process.WaitForExit();
return result;
}
/// <summary>
/// Sets tags on a file in OS X.
/// This is really awkward and brittle.
/// </summary>
/// <param name="tagCsv">Comma separated list, e.g., "red,black,green"</param>
/// <param name="filename">file to which we add tags</param>
public static void SetTags(string? tagCsv, string filename)
{
System.Console.WriteLine($"SetTags: '{tagCsv}', '{filename}'");
var tagXmlString = string.Empty;
if (tagCsv == null || String.IsNullOrWhiteSpace(tagCsv)) { return; }
var tags = tagCsv.Split(',');
foreach (var tag in tags)
{
tagXmlString += "<string>" + tag.Trim() + "</string>";
}
var scriptFile = "/usr/bin/xattr";
var arguments = " -w"
+ " com.apple.metadata:_kMDItemUserTags"
+ @" ""<!DOCTYPE plist PUBLIC \'-//Apple//DTD PLIST 1.0//EN\' \'http://www.apple.com/DTDs/PropertyList-1.0.dtd\'><plist version=\'1.0\'>"
+ @" <array>"
+ tagXmlString
+ @" </array></plist>"""
+ " " + filename;
System.Console.WriteLine($"executeShellCommand: {scriptFile}, {arguments}");
Utilities.executeShellCommand(scriptFile, arguments);
}
}
}
</pre>
Here's a program that reads a data file and then calls "SetTags()":
<pre>
using ImageDescriptions;
public class ImageDescription
{
public static void Main(string[] args)
{
if(args.Length < 1)
{
Console.WriteLine("usage: ImageDescription <imageDescription-x.txt>");
Environment.Exit(1);
}
string filename = args[0];
FileStream file = File.OpenRead(filename);
var lines = File.ReadLines(filename);
foreach (var line in lines)
{
Description description = new Description(line);
Console.WriteLine(line);
Console.WriteLine(description);
Utilities.SetTags(description.tags, description.name);
}
}
}
</pre>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBpjW_rWXf-GJsmfsYyoRBcUGoaoUzIsjUZz4VQ3k_wRbxE4MCzxsoWQu4WGP0zHsIhUVvfT7gHFSpUByfrk0cWbEqEfXOoVr06wdYLUE-tBEcNa1X57acIawlks-PQUAIOO6UifbgU9EELfhlLjnwzqz7rtTZkBq88NS1TMiHgnsRIebPLQ/s1000/2013-05-19-1742-IMG_4208.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" width="320" data-original-height="750" data-original-width="1000" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBpjW_rWXf-GJsmfsYyoRBcUGoaoUzIsjUZz4VQ3k_wRbxE4MCzxsoWQu4WGP0zHsIhUVvfT7gHFSpUByfrk0cWbEqEfXOoVr06wdYLUE-tBEcNa1X57acIawlks-PQUAIOO6UifbgU9EELfhlLjnwzqz7rtTZkBq88NS1TMiHgnsRIebPLQ/s320/2013-05-19-1742-IMG_4208.jpg"/></a></div>
A line from the data file looks like this:
<pre>
2013-01-23-0702-IMG_8252.jpg "Dessert pie with fruit -tags:dessert,fruit,healthy,pie"
</pre>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-78708241340529200952022-06-06T10:07:00.003-07:002022-06-06T12:48:54.045-07:00How to find Mac OS tags from the command line<p> I'm playing with tags for labeling photos and found this MacOs command to search for all files with a tag, like "awana":</p><p class="p1" style="font-family: Menlo; font-size: 14px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">mdfind 'kMDItemUserTags == "Awana"'</span></p><p class="p1" style="font-family: Menlo; font-size: 14px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="font-size: 14px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-family: arial;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">By the way macos tags are stored in the binary file '</span><span style="font-variant-ligatures: no-common-ligatures;">.DS_Store' in the same directory as your files, and as an Extended Attribute (EA) of the file.</span></span></p><p class="p1" style="font-family: Menlo; font-size: 14px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="font-family: Menlo; font-size: 14px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-21465203553866162652022-05-21T15:19:00.002-07:002022-05-21T15:19:30.562-07:00Fixing EXIF Errors in JPEG files like "Error: Bad format (0) for IFD1 entry 0"
<p>I've been working on my greatgrandmother's photos and find jewels from 1910 like this one:<p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUcj0JAMbxXmpn9xfsUxa0NCVVIsk5URyNszBghB_rn7JaVtXJ_qF_wNv8Pz__1tAPTzMe8Urujn-CUMjnUr7akmbcj1EQ2LhcmZPhGbTDMAwbJrRzuTRr3bx1_4wyf2oIe5MGJRGDM_tez-DKjRzCcZIFDIJaHMni_SZh3sN24FMGcSsLZA/s532/1910-00-00-WallaceFamily.jpg" style="display: block; padding: 1em 0; text-align: center; "><img alt="" border="0" height="320" data-original-height="532" data-original-width="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjUcj0JAMbxXmpn9xfsUxa0NCVVIsk5URyNszBghB_rn7JaVtXJ_qF_wNv8Pz__1tAPTzMe8Urujn-CUMjnUr7akmbcj1EQ2LhcmZPhGbTDMAwbJrRzuTRr3bx1_4wyf2oIe5MGJRGDM_tez-DKjRzCcZIFDIJaHMni_SZh3sN24FMGcSsLZA/s320/1910-00-00-WallaceFamily.jpg"/></a></div>
<p>Unfortunately, many of the photos from 110 years ago do not have any names written on the back.</p>
<p>As I think about how to preserve my family's story for the next 110 or 300 years, I'd like to write the description on the back of my digital pictures by injecting EXIF image descriptions into the photos themselves.</p>
<p>To do this I downloaded the free command line tool "exiftool" for my mac.</p>
<p>Then, I added photo captions into jpeg files with this command:
<pre>
exiftool -imageDescription="My image description" mypic.jpg
</pre>
<p>
but got errors like this:
</p>
<pre>
"Error: Bad format (0) for IFD1 entry 0"
</pre>
<p>I purchased the tool "metaImage" from the Mac store to add descriptions into the jpeg, but it wouldn't inject the caption into my files. I contacted their tech support and got a quick solution.</p>
<p>Jérémy Vizzini from <a href="neededapps.com">neededapps.com</a> (creator of "metaImage") solved the problem for me. The issue was my jpeg files were corrupt. (Some of the photos were from 2003, so the EXIF standards may have changed, or not have been rigoriously followed decades ago). Jérémy gave me this snippet of exiftool code to fix the jpeg:
<pre>
exiftool -all= -tagsfromfile @ -all:all -unsafe -icc_profile mypic.jpg
</pre>
<p>This fixed the problem. Thanks Jérémy! Now my jpegs will be ready for the next 300 years.</p>
<p>How do you archive your photos to preserve them for 300 years?</p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-64344102655621863962022-05-04T13:05:00.005-07:002022-05-04T13:08:38.470-07:00How to Find Duplicate Images on a Mac or Linux Machine<p>This is how to search recursively all directories on a Mac or Linux machine for duplicate images with a single line of awkward bash script. This method will find duplicates anywhere on your disk below your current directory (try "~"), and find multiple versions.</p>
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh472P5atcUcPdC9zkIs1-GIPctbNmOJKKy-21Ka2xCURUiSHMd29KoZKgL3pa7gzARAkGp9Hw8doICYcND_F7g0rXT8xdRTVOXXkF10seu-sISP08yeTHPJ3sfvmDgna7JZr0E8DMO2aUoCYUS0iDIGZeMvPbC6yjBwBPAPIyTCyUPsH0JzQ/s2006/Screen%20Shot%202022-05-04%20at%203.01.23%20PM.png" style="display: block; padding: 1em 0px; text-align: center;"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh472P5atcUcPdC9zkIs1-GIPctbNmOJKKy-21Ka2xCURUiSHMd29KoZKgL3pa7gzARAkGp9Hw8doICYcND_F7g0rXT8xdRTVOXXkF10seu-sISP08yeTHPJ3sfvmDgna7JZr0E8DMO2aUoCYUS0iDIGZeMvPbC6yjBwBPAPIyTCyUPsH0JzQ/s2006/Screen%20Shot%202022-05-04%20at%203.01.23%20PM.png" style="padding: 1em 0px; text-align: center;"><img alt="" border="0" data-original-height="1524" data-original-width="2006" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh472P5atcUcPdC9zkIs1-GIPctbNmOJKKy-21Ka2xCURUiSHMd29KoZKgL3pa7gzARAkGp9Hw8doICYcND_F7g0rXT8xdRTVOXXkF10seu-sISP08yeTHPJ3sfvmDgna7JZr0E8DMO2aUoCYUS0iDIGZeMvPbC6yjBwBPAPIyTCyUPsH0JzQ/s200/Screen%20Shot%202022-05-04%20at%203.01.23%20PM.png" width="200" /></a><img alt="" border="0" data-original-height="1524" data-original-width="2006" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh472P5atcUcPdC9zkIs1-GIPctbNmOJKKy-21Ka2xCURUiSHMd29KoZKgL3pa7gzARAkGp9Hw8doICYcND_F7g0rXT8xdRTVOXXkF10seu-sISP08yeTHPJ3sfvmDgna7JZr0E8DMO2aUoCYUS0iDIGZeMvPbC6yjBwBPAPIyTCyUPsH0JzQ/s200/Screen%20Shot%202022-05-04%20at%203.01.23%20PM.png" width="200" /></div>
Many commercial products exist to easily find and delete duplicate images like those reviewed <a href="https://www.imymac.com/powermymac/powermymac-vs-cleanmymac.html">here</a>, but if you are like me, and don't like to download apps willy nilly for a single task, and have a bit of shell scripting experience, you can use the following line of tortured bash script to find duplicate files.<p></p>
<p style="font-family: "Courier New", monospace;">find . -type f \( -name "*.jpg" -o -name "*.gif" \) | awk '{print "\"" $0 "\""}' | xargs shasum -a 256 | sort > checksumAndFilename.tmp && cat checksumAndFilename.tmp | awk '{print $1}' | uniq -D | uniq > checksum.tmp && grep -f checksum.tmp checksumAndFilename.tmp | tee duplicates.tmp && echo "output in \"duplicates.tmp\"" && rm checksumAndFilename.tmp checksum.tmp</p>
<p>The basic idea is to search the current directory and all subdirectories for images files, calculate a hash for each file, then sort the hashes and then list adjacent hashes, which would be duplicates. (If this is too much for your brain, just go to <a href="https://www.imymac.com/powermymac/">imymac</a> and buy an app.)</p>
<p>Ok, let's go through the command in detail.</p>
<ol>
<li> Get all the image files in your directory and below. Update "*.jpg" to "*.png" or whatever you need.
<p style="font-family: "Courier New", monospace;">find . -type f \( -name "*.jpg" -o -name "*.gif" \)</p></li>
<li> Surround the file name with double quotes, since some people still insist on the horrible, dasterdardly, awful practice of including spaces in names.
<p style="font-family: "Courier New", monospace;"> awk '{print "\"" $0 "\""}' </p></li>
<li> Pipe the names of the files into shasum to generate a hash
<p style="font-family: "Courier New", monospace;"> xargs shasum -a 256 </p></li>
<li> Sort by the hash value so duplicates will be adjacent and write to a temp file
<p style="font-family: "Courier New", monospace;"> sort > checksumAndFilename.tmp </p>
<p>checksumAndFilename.tmp looks like this. The files with the same hash value would be duplicates.</p>
<pre>ff45b77226369d27b67772e72dfe8dc3387eff06 ./2010-07-04-2224-July4_036.jpg
ff65e3611973092e61127439af6b3c82d0ee055a ./2010-12-29-1408-IMG_9638.jpg
ff680170b0451868a1bda027c801b78f55067366 ./2010-12-24-1010-IMG_9235.jpg
ff918f6f8230deb3cd2208602dadb5c6f88039dc ./2010-03-14-2025-IPhone_8146.jpg
</pre>
<p>We are almost done, but how to only see hash values that are duplicates?</p>
</li>
<li> Get only the hash values that are duplicates
<p style="font-family: "Courier New", monospace;"> cat checksumAndFilename.tmp | awk '{print $1}' | uniq -D | uniq > checksum.tmp </p></li>
<p>checksum.tmp looks like this. This are only the hash values that are duplicated.</p>
<pre>0526e5586cc1e4d2d97e5cc813c8d9b698bc3df2
075a137c8857c8b38555cf632d906ed0581b9224
</pre>
<li> We have only the duplicated hash values. Let's match the hashes back with their filenames
<p style="font-family: "Courier New", monospace;">grep -f checksum.tmp checksumAndFilename.tmp </p></li>
<p>We can see the first two are duplicates, and the next two are as well.</p>
<pre>
0526e5586cc1e4d2d97e5cc813c8d9b698bc3df2 ./2010-11-28-0926-IMG_0300.jpg
0526e5586cc1e4d2d97e5cc813c8d9b698bc3df2 ./IMG_0300.jpg
075a137c8857c8b38555cf632d906ed0581b9224 ./2010-06-08-photoshoot012.jpg
075a137c8857c8b38555cf632d906ed0581b9224 ./2010-06-08-photoshoot_012.jpg
</pre>
<li> Write to the output file and the screen
<p style="font-family: "Courier New", monospace;"> tee duplicates.tmp </p></li>
<li> Let's remind ourselves where the output lives
<p style="font-family: "Courier New", monospace;"> echo "output in \"duplicates.tmp\"" </p></li>
<li> Clean up our mess
<p style="font-family: "Courier New", monospace;"> rm checksumAndFilename.tmp checksum.tmp </p></li>
</ol>
<p>My gut tells me there's some ways to clean this script up. Please add a comment if you can improve the script.</p>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com1tag:blogger.com,1999:blog-30926081.post-5683841540385933932022-03-15T09:19:00.003-07:002022-03-15T09:19:54.409-07:00How to Find IPhone's Unread Messages<p><span style="font-family: arial;"> My IPhone has been declaring I have 1 unread message, but I can't find it.</span></p><p><span style="font-family: arial;"></span></p><div class="separator" style="clear: both; text-align: center;"><span style="font-family: arial;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj1_Bn-EbNOuLsn4_xqC_Zm0fSMfInXkqR1-yyfffhzV8DHeIb8SUfgsWo4VlTLfbD8puZHQdlRSmH3rfVsZisYB1rnxxGrLM7VFCHvrng5oZuGbNvifUqcd-XAk_-OfUxRB4OEjihEXoANn3-Z9VGSvkzPtY7AYmePud56yEv5utjIuBtTOg" style="margin-left: 1em; margin-right: 1em;"></a><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj1_Bn-EbNOuLsn4_xqC_Zm0fSMfInXkqR1-yyfffhzV8DHeIb8SUfgsWo4VlTLfbD8puZHQdlRSmH3rfVsZisYB1rnxxGrLM7VFCHvrng5oZuGbNvifUqcd-XAk_-OfUxRB4OEjihEXoANn3-Z9VGSvkzPtY7AYmePud56yEv5utjIuBtTOg" style="margin-left: 1em; margin-right: 1em;"></a><a href="https://blogger.googleusercontent.com/img/a/AVvXsEg8yCf5MrQwW9x7beP57WzHrEXyK0TlAMaD45Mat3gcsFur4eLiEBlYfcPyegGeSv52_xqVpyk93jR-JdKopqPmSpoOocZMuy-nInA5gtDp0fxyqQByuOuTJzoM-kZH8n5aEMM42hyQatVfcz4o3IuDx30kFENC0YCKF4y3dC5IQyvTlaGGXA" style="margin-left: 1em; margin-right: 1em;"><img data-original-height="2778" data-original-width="1284" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEg8yCf5MrQwW9x7beP57WzHrEXyK0TlAMaD45Mat3gcsFur4eLiEBlYfcPyegGeSv52_xqVpyk93jR-JdKopqPmSpoOocZMuy-nInA5gtDp0fxyqQByuOuTJzoM-kZH8n5aEMM42hyQatVfcz4o3IuDx30kFENC0YCKF4y3dC5IQyvTlaGGXA=w296-h640" width="296" /></a></div><br /></span></div><span style="font-family: arial;"><br /><br /></span><p></p><p><span style="font-family: arial;">The solution was actually easy.</span></p><p><span style="background-color: white; color: #333333; font-size: 16.2px;"><span style="font-family: arial;"> "Hey Siri, read me my unread messages." </span></span></p><p><span style="background-color: white; color: #333333; font-size: 16.2px;"><span style="font-family: arial;">Siri read my one message and closed it.</span></span></p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-28065150469598417512022-03-14T18:24:00.002-07:002022-09-10T15:07:25.676-07:00Is Silver or the S&P 500 a Better Investment?<p> Back in 1979 some friends of mine in Dallas were really into buying silver, as in pre-1965 silver quarters. They firmly believed the US financial system was on the verge of collapse due to congressional overspending. The US dollar would be worthless due to runaway inflation and the silver coins would be worth a fortune and be the de facto currency.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEj29JO6-OOD3axVlNmg3WAhEJSFZrgIf70LzNWhJXVShpD7CPA9vHqZw4m_tYcDeSGxVOxVMQXmYla5mAf-xfd9Cp3jn8-l25deUBiazlArAUmGlScprNSHDZr6mhjxkSacHM6tPqby5hyID06iUZuqEEpnwWGB5exw1EfCCyftp1jnQ2am2A" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="788" data-original-width="800" height="240" src="https://blogger.googleusercontent.com/img/a/AVvXsEj29JO6-OOD3axVlNmg3WAhEJSFZrgIf70LzNWhJXVShpD7CPA9vHqZw4m_tYcDeSGxVOxVMQXmYla5mAf-xfd9Cp3jn8-l25deUBiazlArAUmGlScprNSHDZr6mhjxkSacHM6tPqby5hyID06iUZuqEEpnwWGB5exw1EfCCyftp1jnQ2am2A" width="244" /></a></div><br />As a poor college student I didn't have much money to sock away in silver, but I bought 6 silver quarters which equals a little more than 1 troy oz of pure silver.<p></p><p>Was that a good investment? Let's see. In 1979, silver was about $11. per oz.</p><p></p><p>This year, 2022, my ounce of silver is worth $24.</p><p>What if I'd invested that $24 in the S&P 500 in 1979? The index has risen 12% on average since 1979, so my stocks in 2022 would have a value of $3,120.</p><p>So, $24 from silver or $3,120 from the stock market? You decide.</p><div><br /></div>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-76095384047897417752022-03-06T18:21:00.000-08:002022-03-06T18:21:02.757-08:00What does Google know about me?<p>I just updated my advertising profile at Google. It's easy.</p><p>Visit <a href="https://adssettings.google.com/">https://adssettings.google.com/</a> and you'll see something like this:</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjTxry_94t6b80dtrjJktWivSBAywMv_cpRTDgiIGgzm318oDXzn07B0z6ti00vONrdGv5J5jXCkfjs3e435TDm6jGYipn69KzWHsFi68lrmTCekzrF8o4uNRsqEtela2x7JqXyjls7WD7twiRj59cX_Z_DR6JCCo1citbWwrYmlJU4G8ueCA=s878" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="878" data-original-width="724" src="https://blogger.googleusercontent.com/img/a/AVvXsEjTxry_94t6b80dtrjJktWivSBAywMv_cpRTDgiIGgzm318oDXzn07B0z6ti00vONrdGv5J5jXCkfjs3e435TDm6jGYipn69KzWHsFi68lrmTCekzrF8o4uNRsqEtela2x7JqXyjls7WD7twiRj59cX_Z_DR6JCCo1citbWwrYmlJU4G8ueCA=s16000" /></a></div><br /><p><br /></p><p>You can click on subjects and remove them from your ad lineup. I removed "cats", but kept "dogs".</p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-25576666653726151002022-01-26T09:05:00.000-08:002022-01-26T09:05:25.261-08:00Free Online HTML Validator for an Entire Site - Datayze.com<p></p><div class="separator" style="clear: both; text-align: left;">I recently retired from 42 years of software development and have a little more time to work on my personal website, <a href="https://www.fincher.org">https://www.fincher.org</a>. </div><div class="separator" style="clear: both; text-align: left;">I've been working on it for almost 30 years and some parts are a little, ... , crusty shall we say?</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">I found a wonderful online free website analyzer from the good folks at <a href="https://datayze.com/?category=website">Datayze.com</a> that will gently scan an entire website and show areas that need fixin'.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Thanks Datayze.com!</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFUw40sy6NqeZxcFwGP1drJp3FaAE4q4O7qWxXE3O5znnFqx_Q8_nJLjzMlB-rX-mpMnj4HgIrbjETjSiIfoMygoTxqQli3lkiClP2ZwBkYG1yHU5PKA-jZSy_4B_jLJwRjx_/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img data-original-height="1357" data-original-width="1751" height="496" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcFUw40sy6NqeZxcFwGP1drJp3FaAE4q4O7qWxXE3O5znnFqx_Q8_nJLjzMlB-rX-mpMnj4HgIrbjETjSiIfoMygoTxqQli3lkiClP2ZwBkYG1yHU5PKA-jZSy_4B_jLJwRjx_/w640-h496/image.png" width="640" /></a></div><br /><p></p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-68685094597686783202021-01-02T08:41:00.003-08:002021-01-02T08:41:56.622-08:00Best Remote Ftp Client for the Mac<p> I've been updating my website <a href="https://www.fincher.org">fincher.org</a>, and needed a remote ftp client to access my dreamhost linux server. After some research I settled on <a href="https://cyberduck.io/" target="_blank">CyberDuck</a>. It's awesome! Did I mention it's free?</p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6Xw9P_956cqK6xgRZNMcmsR3ofI2bobCtqvsu5erhSxzOXKH5dq4WOf35Gu23crYT-lEypQUlecL-7noX-oLNpmyQCwo3ZVXpnY7WRVh8uhEKxCnkMq5P1O3xiMZLS9z6k1Z/s2022/Screen+Shot+2021-01-02+at+10.36.48+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="708" data-original-width="2022" height="230" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgc6Xw9P_956cqK6xgRZNMcmsR3ofI2bobCtqvsu5erhSxzOXKH5dq4WOf35Gu23crYT-lEypQUlecL-7noX-oLNpmyQCwo3ZVXpnY7WRVh8uhEKxCnkMq5P1O3xiMZLS9z6k1Z/w658-h230/Screen+Shot+2021-01-02+at+10.36.48+AM.png" width="658" /></a></div><br /><p><br /></p>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-80153559408502763622020-12-26T14:58:00.000-08:002020-12-26T14:58:01.536-08:00Best Electrical Rates in Texas - How to Select an Electrical Provider 2020<p> In Texas we have the luxury (duty?) to select an electrical provider and a plan. We have <a href="http://powertochoose.org">http://powertochoose.org</a>/, the official website of the Public Utility Commission of Texas to help Texans select a provider and a plan.</p><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXTVRO8-KDYMrFiUu2wUhBHyfLrSiu6qL7tz1LF0YoTeIhEC0wxZc30-hY4ztdhd4bVEJU1IQ3bs5zMxjp6sT7jSh3NNjfsb1fl6En5miPC2nIS4zDQmJPfBS_hlk4HFQlq88i/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1169" data-original-width="2048" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgXTVRO8-KDYMrFiUu2wUhBHyfLrSiu6qL7tz1LF0YoTeIhEC0wxZc30-hY4ztdhd4bVEJU1IQ3bs5zMxjp6sT7jSh3NNjfsb1fl6En5miPC2nIS4zDQmJPfBS_hlk4HFQlq88i/" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">From the site we can get a general idea of the price of power, but not a detailed analysis of what the yearly cost would be because electric companies may charge different rates depending on how much electricity we use each month.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">For example suppose company A charges 5 cents for all electricity under 1000 KiloWattHours (KWH), and then 15 cents for any KWH over 1000; and company B charges 15 cents for all electricity under 1000 KWH, and then 5 cents for any KWH over 1000. We have to do some math to figure out what works best for our usage. Here's an example from Green Energy Exchange's rates:</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTXC1R8lb8NoPx9FjjQBWHGRE7D7dLNv9N1vD_jzOM_yR6frgQXd-A8Oln_vSwvNky0-45JQhNNbtWXXWQRVU6Tprk0YzbaEHl6wVpFn0fgo__Zy_HoajpzD7eicE2NJeMbMP/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="630" data-original-width="1628" height="124" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOTXC1R8lb8NoPx9FjjQBWHGRE7D7dLNv9N1vD_jzOM_yR6frgQXd-A8Oln_vSwvNky0-45JQhNNbtWXXWQRVU6Tprk0YzbaEHl6wVpFn0fgo__Zy_HoajpzD7eicE2NJeMbMP/" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: left;">I use <a href="https://www.geekyourrate.com/" target="_blank">GeekYourRate.com/</a> to do the math for me. The site charges $9.95 to take my monthly usage and crank through all the plans to find the best ones for me. Usually I use less than 1,000 KWH, but for three months in the summer, I go a little above 1,000 KWH. Here's the page using my usage:<div class="separator" style="clear: both; text-align: center;"><br /></div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguQ0sPRFwzok41DDZEEEUKpXRxLI6tTrgQwnacv1YVS5giSIFixXk7_v4DPiBUrXNWhC6RI7vLIxzFvUtlpYo3g8uNGFp-CPGhRgljWUAaNNunLDjqWBzJ28hLFPx5zf5lj4Vf/" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1524" data-original-width="2012" height="470" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguQ0sPRFwzok41DDZEEEUKpXRxLI6tTrgQwnacv1YVS5giSIFixXk7_v4DPiBUrXNWhC6RI7vLIxzFvUtlpYo3g8uNGFp-CPGhRgljWUAaNNunLDjqWBzJ28hLFPx5zf5lj4Vf/w621-h470/Screen+Shot+2020-12-22+at+9.45.45+PM.png" width="621" /></a></div><br /><br />GeekYourRate recommended Green Energy Exchange as the cheapest option. I tried their website, but it would never let me proceed beyond the review button - it was always greyed out no matter what I tried. <div><br /></div><div>So I went to the next company, V247. Their website worked and I enrolled.<p></p><p>I like <a href="https://www.geekyourrate.com/" target="_blank">GeekYourRate.com/</a> since it does all the math for me and can save me hundreds of dollars a year.</p><p><br /></p><p><br /></p></div>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-55385900363989944032020-11-27T18:54:00.000-08:002020-11-27T18:54:33.849-08:00Dreamhost upgrade to Apache 2.4 causes "[an error occurred while processing this directive]"<p> I host <a href="https://www.fincher.org">https://www.fincher.org</a> with a great hosting service, Dreamhost. They recently upgraded my server from Apache 2.2 to 2.4. It broke my whole site.</p><p>I wrote a Content Management System (CMS) 20 years ago using Server Side includes and Perl (yes, Perl). It has worked flawlessly for decades and then got tripped up on this upgrade.</p><p>What happened? Testing for empty variables happened. For example, if I want a page to have Google ads, I would define a variable at the top of a file</p><div style="font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; line-height: 18px; white-space: pre;"><div><span style="background-color: #b6d7a8;"><!--#set var="AdsTop" value="AdsTop" --></span></div><div><span style="background-color: #b6d7a8;"></span></div></div><p>and then later include a file that tests for that variable,</p><div style="text-align: left;"><span style="background-color: #b6d7a8;"><!--#if expr="${AdsTop}" --></span></div><p><span style="background-color: #b6d7a8;">... include file with Google Ads ...</span></p><p><span style="background-color: #b6d7a8;"><!--#endif --></span></p><div><br /></div><div>Apache, changed the way variables are tested to be more explicit, which I can appreciate their thinking.</div><div>Now in 2.4 if you want to test if the variable "AdsTop" is not empty use the "-n" option:</div><div><div><span style="background-color: #b6d7a8;"><br /></span></div><div><span style="background-color: #b6d7a8;"><!--#if expr="-n v('AdsTop')" --></span></div><div><span style="background-color: #b6d7a8;">... include file with Google Ads ...</span></div><div style="font-family: Menlo, Monaco, "Courier New", monospace; font-size: 12px; line-height: 18px; white-space: pre;"><div><span style="background-color: #b6d7a8;"><!--#endif --></span></div></div></div><div><br /></div><div>(or use "-z" to test for empty).</div><div><br /></div><div>More details at <a href="https://httpd.apache.org/docs/current/howto/ssi.html">https://httpd.apache.org/docs/current/howto/ssi.html</a> and <a href="https://www.zytrax.com/tech/web/ssi.htm">https://www.zytrax.com/tech/web/ssi.htm</a>.</div><div><br /></div><div>You can skip the upgrade and set <code class="directive" style="background-color: white; color: #287f00; font-family: "Courier New", Courier, monospace; font-size: 14px;"><a href="https://httpd.apache.org/docs/2.4/mod/mod_include.html#ssilegacyexprparser" style="background-color: inherit; color: #35a500;">SSILegacyExprParser</a></code><span style="background-color: white; color: #003366; font-family: Arial, Helvetica, sans-serif; font-size: 14px;"> to on, but in my experience, falling behind on upgrades, eventually bites you in the behind.</span></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-58748999541191448492020-07-04T15:26:00.000-07:002020-07-04T15:56:23.964-07:00Dreem2 Review at 6 weeksI've been using the Dreem2 headband for five weeks now and here are my thoughts:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZVGiD3rTPVe1ldQXxhEkq6wo6-H3RScRql36qyi5gcJQA36L2ZayepwHzNouKsQ-su8PEbp00npDMChQh7TuLpPourPu1QZ8aV39mvjL6SQuwooMzc8wJzgvf1_q74oPA_LVb/s1600/IMG_3652.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZVGiD3rTPVe1ldQXxhEkq6wo6-H3RScRql36qyi5gcJQA36L2ZayepwHzNouKsQ-su8PEbp00npDMChQh7TuLpPourPu1QZ8aV39mvjL6SQuwooMzc8wJzgvf1_q74oPA_LVb/s320/IMG_3652.JPG" width="240" /></a></div>
<br />
1. The technology is very good. It tracks my sleep well and the numbers seem accurate.<br />
2. It's getting more comfortable.<br />
3. I finished the easy "Intro to sleep" class. It was helpful. It's a little frustrating that you can't take all the sessions in one sitting, but upon reflection, it's probably good the way they have it now.<br />
4. Making the bedroom dark was my biggest take-away from the intro class.<br />
5. One helpful number from the night's data is "Sleep Onset", or how long did it take me to fall asleep after turning on the headset.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUFR9BzY5DyBXbsjW1ejugLHmkVSpTqFrrDOcBEl7XKud_cSy41U7s-FQpcvBLDtyG2zc-Bq8cKSa0HOYB-qkLrrxLMnk2yO1emTq9gBspUunguS6SMutATgn1PLCRG5WQT9z/s1600/IMG_C3AE36844DE0-1+2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="739" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxUFR9BzY5DyBXbsjW1ejugLHmkVSpTqFrrDOcBEl7XKud_cSy41U7s-FQpcvBLDtyG2zc-Bq8cKSa0HOYB-qkLrrxLMnk2yO1emTq9gBspUunguS6SMutATgn1PLCRG5WQT9z/s320/IMG_C3AE36844DE0-1+2.jpeg" width="147" /></a></div>
Usually it's under 30 minutes, but it's interesting to check with my food diary for those nights that it is longer. So far, it looks like eating spicy foods, foods with lots of sugar, or lots of carbs hurts my sleep onset number. Without the Dreem2 it would be hard to get the sleep onset number.<br />
<br />
Things to improve in the Dreem2:<br />
1. Charging feedback. Although I set my headband in the charging cradle each night, yesterday it did not charge. There's no easy way to know if the headband is charging without looking at the app. The glowing ring changes colors and varies intensities, but I haven't a clue what it's trying to tell me. Is it charging? Is it trying to charge but doesn't connect to the contacts? Is it having a bad dream? I don't speak glowing ring LED language and C-3PO is nowhere to be found.<br />
<br />
Dreem needs a small card lesson on what the led indicator signals are. Also a text mid-day would be nice if it's not charging.<br />
<br />
2. If I don't fall asleep as quickly as usual, the app asks me why. This is great, but the answers listed do not include "I ate something spicy", or "I drank three cups of 'decaf' coffee after dinner".<br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-91067835085738515492020-06-13T19:43:00.000-07:002020-06-27T15:43:57.124-07:00Review of the Dreem 2 Headset and 10% Discount<u></u><br />
<u><u><br /></u></u>
<u><u><br /></u></u>
<u><u>The Problem:</u></u><br />
<br />
I wake up at 4am sometimes and cannot get back to sleep. It makes the following day hard.<br />
I would love to go to bed at night and get a great night's sleep.<br />
<br />
To that end, I've been keeping a record of all my food, exercise, and other activities in my life. I try to correlate those things with my sleep. I've learned many things through the diary. I've learned certain foods will prevent me from falling asleep for hours. Spicy foods will keep me awake during the night. Stress will wake me up too early.<br />
<br />
But to really tease out the relationships of activities and sleep, I want something more exact than my impression of how I slept, so I can more accurately discover the causes of a bad night's sleep.<br />
<br />
I've been reviewing sleep trackers recently. I tried a watch-type and found it not very accurate.<br />
I was excited to hear about the Dreem 2 headband since it promised sleep-lab grade brain wave monitoring. I was hoping it would give me exact measurements on my sleep.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEVaRuzAhQt-OHbol_IuPChIglGaNEKadAoINWQbvbr0iyO9k7qR4S_H0YhUkCcSh1REBVtE3Y418TY2iwtvYaugvbQO95r4iy20a-jFM4qFiOZNj0x6GZozVdMaccicmIJD_p/s1600/Dream.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEVaRuzAhQt-OHbol_IuPChIglGaNEKadAoINWQbvbr0iyO9k7qR4S_H0YhUkCcSh1REBVtE3Y418TY2iwtvYaugvbQO95r4iy20a-jFM4qFiOZNj0x6GZozVdMaccicmIJD_p/s320/Dream.jpeg" width="320" /></a></div>
Here's what I've discovered about the Dreem 2.<br />
<br />
<u>The Good:</u><br />
Overall the Dreem 2 is amazing. I usually wake up a few times a night to go to the bathroom, and the headband picks up those times exactly. Very impressive - something my wristband could not do. I cannot vouch for the classification of my sleep into light, deep, and REM, but the awake times and sleep times are usually spot on. <br />
In the morning it will display how many total hours I slept, and how many hours in light, deep, and REM sleep.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaB42U8LVBm0_jSseEzlZEWW1cBd1QDmTucDugEbDjmpBCC2pNagCCXsL4aTlCh6ahhuwrxcwpyNAqTd9dnpYrTtZoVs15-xggKgULKlOebkFn89PDiGiHTm6uWUdFc31FzzjW/s1600/IMG_3588.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1600" data-original-width="739" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaB42U8LVBm0_jSseEzlZEWW1cBd1QDmTucDugEbDjmpBCC2pNagCCXsL4aTlCh6ahhuwrxcwpyNAqTd9dnpYrTtZoVs15-xggKgULKlOebkFn89PDiGiHTm6uWUdFc31FzzjW/s320/IMG_3588.PNG" width="147" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEittNiUnPLLXTlR4yRCywE5dtWlL0tmplBLGfzH1Vn_Hqro1clh1-O5cYH9y8dC3gKEpC9tbKwxNmDEObHIsnteKnMpz67VhCoC47S31MuSjFsFMSskQZnhJbieVy9ec6-qhvbQ/s1600/IMG_3586.PNG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="739" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEittNiUnPLLXTlR4yRCywE5dtWlL0tmplBLGfzH1Vn_Hqro1clh1-O5cYH9y8dC3gKEpC9tbKwxNmDEObHIsnteKnMpz67VhCoC47S31MuSjFsFMSskQZnhJbieVy9ec6-qhvbQ/s320/IMG_3586.PNG" width="147" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3fmg3xe8r9IgPFMC5RGGcLpmXOhSlkti_P1GvG014-iDhhdw0yNty013Tgn_4lcQERqtvLAGDk5ROf3EVX_uBjE1ISe5h3Xk3hhXwIIaEr4UXLqt-KcFO_1zpLu4Zh9CUS5Om/s1600/IMG_3583.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="739" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3fmg3xe8r9IgPFMC5RGGcLpmXOhSlkti_P1GvG014-iDhhdw0yNty013Tgn_4lcQERqtvLAGDk5ROf3EVX_uBjE1ISe5h3Xk3hhXwIIaEr4UXLqt-KcFO_1zpLu4Zh9CUS5Om/s320/IMG_3583.PNG" width="147" /></a></div>
<br />
It encourages me to go to bed at the same time each night by giving me a score on sticking to schedule. Sort of like gamification - but strangely I don't want to disappoint it, so I'm going to bed at a regular time now.<br />
<br />
I'm very excited about the possibilities of tracking my lifestyle in the day to my sleep at night. Dreem 2 is the perfect tool for that.<br />
<br />
<u>The Bad:</u><br />
The headband struggles to connect with my iPhone. It will eventually connect, but it can be slow and tedious to keep pressing the headband. I need more feedback about how it progressing with the connection. Did I press the headband button long enough? too long?<br />
<br />
It's fairly comfortable to wear at night. My temples are very sensitive and the pressure is uncomfortable at times, but worth it to get the sleep data. Hopefully in the Dreem 3 they can make the headband thinner as it passes the temples so it doesn't press as much from the pillow to my head.<br />
<br />
<u>Would Like to Have:</u><br />
I'd like to have a summary number for the nights sleep based on length of sleep time and the amount of time in light, deep, and REM sleep. This would help me optimize my activities to get the best night's rest.<br />
<br />
<u>Sleep Classes:</u><br />
The app comes with three sleep programs. I just started the two week sleep basics class. The app also comes with a Cognitive Behavioral Therapy program that I will start after the basics class.<br />
<br />
I will let you know in future posts how it goes.<br />
<br />
Update: To get a 10% discount when purchasing a Dreem headset, enter this code in the Voucher section at checkout: <b style="font-family: arial, helvetica, sans-serif; font-size: 13px;">518A5C3B.</b><br />
<b style="font-family: arial, helvetica, sans-serif; font-size: 13px;"><br /></b>
<br />
<br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-68578033485241930462020-06-01T09:07:00.002-07:002020-06-01T09:07:43.198-07:00In Visual Studio 2019, How to move Resharper menu back to the top menuI love Jetbrain's Resharper extension for Visual Studio 2019, but by default Resharper no longer shows up on the main toolbar in VS, but as a submenu under "Extensions". Very annoying. Especially when using shortcut keys, because it means an extra "alt-x" just to access.<br />
<br />
Fortunately Evgeny K has written an extension that moves it back up to the main toolbar.<br />
You can find it at <a href="https://marketplace.visualstudio.com/items?itemName=Evgeny.RestoreExtensions">https://marketplace.visualstudio.com/items?itemName=Evgeny.RestoreExtensions</a>.<br />
<br />
<img alt="screenshot-1-v2.png" src="https://evgeny.gallerycdn.vsassets.io/extensions/evgeny/restoreextensions/1.0.2/1556184103349/screenshot-1-v2.png" /><br />
<br />
Thank you Evgeny K!Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-42162309033090313782019-09-07T20:03:00.000-07:002019-09-07T20:06:40.647-07:00A Generic Funeral Brochure Template in Google DocumentsI recently designed a funeral brochure in Google Documents and wanted to offer the template to anyone who could use it.<br />
The template document is <a href="https://docs.google.com/document/d/1WV7mWJ3KdITBByFDVTN-wnOuQnqYImBg5Qm3fC3p8u0/edit?usp=sharing">here</a>. (Thanks to wikipedia for the content text).<br />
It consists of a two column table on each page with the correct dimensions to print well.<br />
The pdf created from Google Docs is <a href="https://docs.google.com/document/d/1WV7mWJ3KdITBByFDVTN-wnOuQnqYImBg5Qm3fC3p8u0/edit?usp=sharing">here</a>.<br />
If you set your printer for double-sided printing it will print it out like this:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24gBGodXt7htuK7r1LZaEyhd-2LQ6dfSqv_NnEDrFUbkbVmRi_xyAghX4eOzFAf8IBjmn12vwKW2mJ02htt2ztKlKQsjbRkmkg6po2XdHty2ecZyvdONQp4Y_HmqVb7_o33vB/s1600/IMG_1952.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg24gBGodXt7htuK7r1LZaEyhd-2LQ6dfSqv_NnEDrFUbkbVmRi_xyAghX4eOzFAf8IBjmn12vwKW2mJ02htt2ztKlKQsjbRkmkg6po2XdHty2ecZyvdONQp4Y_HmqVb7_o33vB/s320/IMG_1952.JPG" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim5Gjh_2a0J9LVrs6wFXm2__wWo9q3ZBZRRmmK71RwsJzuptgBa-MlcvO1QHl06fzj9CkiK0KDycNUS6cxavUHtT0zJrMHUTF96tZgjEiwP1H0mRSdhIqYuYB43XbXbR5g3hIR/s1600/IMG_1953.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEim5Gjh_2a0J9LVrs6wFXm2__wWo9q3ZBZRRmmK71RwsJzuptgBa-MlcvO1QHl06fzj9CkiK0KDycNUS6cxavUHtT0zJrMHUTF96tZgjEiwP1H0mRSdhIqYuYB43XbXbR5g3hIR/s320/IMG_1953.JPG" width="240" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5muusFc-YvMcoHfs0Nbk7X3IwGUWbBLMdL0QevWmZXQik0Gbf98WZbCfJhYIwBvS0si9rIeYYNc_VVyUs5O2wx9lXaIHEFFlFpQ7_xU-IMXGGCsiaq9B3ck-xkjxG4L5yaHcq/s1600/IMG_1954.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5muusFc-YvMcoHfs0Nbk7X3IwGUWbBLMdL0QevWmZXQik0Gbf98WZbCfJhYIwBvS0si9rIeYYNc_VVyUs5O2wx9lXaIHEFFlFpQ7_xU-IMXGGCsiaq9B3ck-xkjxG4L5yaHcq/s320/IMG_1954.JPG" width="240" /></a></div>
<br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-87012974379687876482019-09-03T19:56:00.001-07:002019-09-03T19:56:22.044-07:00In Windows 10 the Desktop Window Manager is using 100% of the GPU <div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
Sometimes my Windows 10 machine would get incredibly slow. Even the cursor would start lagging behind.</div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
Looking at the performance monitor I could see that "Desktop Window Manager" was using 100% of my gpu. </div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
<br /></div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
The solution for me was to do this:</div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
On the desktop in empty space, right-click and select "display settings". Make sure all displays and their "scale and layout" are of a 100% size. My issue was out of my three displays, my laptop display had 125% scaling on it. When I switched it to 100% the GPA went back to normal.</div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
<br /></div>
<div dir="ltr" style="background-color: white; color: #1d2228; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px;">
<br /></div>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com1tag:blogger.com,1999:blog-30926081.post-47445501202545042712019-07-13T19:52:00.000-07:002019-07-13T19:52:01.162-07:00Self referencing loop detected for property 'Object' with type 'Castle.Proxies.IServiceContextProxyWhen writing unit tests using Moq objects I occasionally get this error:<br />
Message="Self referencing loop detected for property 'Object' with type 'Castle.Proxies.IServiceContextProxy..."<br />
<br />
It happens when JSON is trying to serialize an object that it thinks has a pointer to itself and could create an infinite loop - although in your code it may not be infinite, but JSON doesn't know that. It's just trying to protect you.<br />
<br />
One way to fix this is to replace the Mock object with real fake object.
<br />
<br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-19546266404378689282019-06-29T20:27:00.000-07:002019-06-29T20:27:51.972-07:00The Most Underrated Wonder of the Ancient World - Obelisks<p>My daughter and me under Cleopatra's Needle at the Met in New York</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL0z9nkryqougVr7bESUEcMrtrk5nvXkzTep4WtywASrF-2ySGD7psKUWABBFA9xvWT48kTZjA2uRVevoxxXEoIt4qbhsz9Ie5FgcQzqlJdIEHqsGIJQd6yC7Lfw6PhGQ51ZO2/s1600/2109-CleopatrasNeedleObelisk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1117" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL0z9nkryqougVr7bESUEcMrtrk5nvXkzTep4WtywASrF-2ySGD7psKUWABBFA9xvWT48kTZjA2uRVevoxxXEoIt4qbhsz9Ie5FgcQzqlJdIEHqsGIJQd6yC7Lfw6PhGQ51ZO2/s400/2109-CleopatrasNeedleObelisk.jpg" width="279" /></a></div>
<ol>
<li>Twenty Eight Egyptian obelisks remain standing today.
</li>
<li> They are built from a single piece of rock.
</li>
<li> The Egyptians did not have iron tools, so it is thought they pounded the granite with heavy dolerate rocks - one of the few things harder than granite.
</li>
<li> An army of workers would have had to labor "an infinity of hours" to create one. If a crack were found in the rock during work, the monolith would be abandoned and work started on another site.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsX0I_fdiug3mbuODceaLnCYxZEkmTGtc0KX7tScvKcmGb5n8CGYjr-_-U2eMfOTYOz0ypNDdHPczRDL7l8rLwvKwm3fl6SrUrHzFDW7xIepSgOQXVmnTRE2TXVPsSSwAs4Vvb/s1600/Assuan_07.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsX0I_fdiug3mbuODceaLnCYxZEkmTGtc0KX7tScvKcmGb5n8CGYjr-_-U2eMfOTYOz0ypNDdHPczRDL7l8rLwvKwm3fl6SrUrHzFDW7xIepSgOQXVmnTRE2TXVPsSSwAs4Vvb/s400/Assuan_07.jpg" width="300" height="400" data-original-width="1200" data-original-height="1600" /></a></div>
</li>
<li> Obelisks could be 100 feet tall and weigh 400 tons.
</li>
<li> Moving them was tricky, because the granite would crack easily if not properly supported. Stone is great in compression, but weak in tension.
</li><li>In 37 AD Gaius Caligula ordered an Egyptian obelisk that was already 1800 years old to be moved to Rome. It was 25 meters tall
with a base of 8 meters and weighed one million pounds and made of pink granite. It remained standing in Rome for 1500 years.
</li><li>The end of the Middle Ages.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-Cd47lS8YZ0whKapIcTF0eV8fmICrjeux-cgwjDvHNN-YuZrYIn-i-EHUPfV_Ob6Wqf8LvcM4c2OSOmHTyxeHM6s_wgxoD907gfGLIFFYQUNHVkAUDWJgzrgQCXd7Sxd-kPb4/s1600/1586_Rome_obelisk_erection.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-Cd47lS8YZ0whKapIcTF0eV8fmICrjeux-cgwjDvHNN-YuZrYIn-i-EHUPfV_Ob6Wqf8LvcM4c2OSOmHTyxeHM6s_wgxoD907gfGLIFFYQUNHVkAUDWJgzrgQCXd7Sxd-kPb4/s400/1586_Rome_obelisk_erection.jpg" width="400" height="337" data-original-width="712" data-original-height="600" /></a></div>
The pope ordered the obelisk moved to the center of St. Peter's square. On September 10, 1586 the obelisk was moved by 907 men, 75 horses and 40 cranes.
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibtyTNFDL03aD-PyoRYkMM2X93NIJZm212-GX-WQa-yUUhoXQtH36F6O-al0Hg-Qwa54JweHqET8Kc6-1sN31bus3vO68H1D-o2dVyiVr7RI7fB9fIN2YwAf8wtQZIMM52UbZu/s1600/1586-LoweringObelisk.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibtyTNFDL03aD-PyoRYkMM2X93NIJZm212-GX-WQa-yUUhoXQtH36F6O-al0Hg-Qwa54JweHqET8Kc6-1sN31bus3vO68H1D-o2dVyiVr7RI7fB9fIN2YwAf8wtQZIMM52UbZu/s400/1586-LoweringObelisk.jpg" width="251" height="400" data-original-width="518" data-original-height="827" /></a></div>
<p>No obelisk had been moved for over a thousand years, and the people of 1586 thought they had at last equalled their Roman ancestors . The fact that they had moved the obelisk only a few hundred meters, instead of from across the Mediterranean did not matter - a new age of technology and engineering was dawning. Some historians mark this engineering marvel as the end of the Middle Ages and the beginning of the Renaissance.</p>
<p>As it looks now:</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjxIREJr8AYwSBMVeCWVBFlYFU17q4rFV6KmgN8oUTYk0DYkv-rRzoOU8M8-YK7nmwRidETOWcQtgTSXSVJYbQGntZy7aUdZFFL7OjfC4M8Gay6z74M4hwPRhHLQJKe_7_jUDq/s1600/Obelisk_and_Fountain_in_St._Peter%2527s_Square_-_panoramio.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjxIREJr8AYwSBMVeCWVBFlYFU17q4rFV6KmgN8oUTYk0DYkv-rRzoOU8M8-YK7nmwRidETOWcQtgTSXSVJYbQGntZy7aUdZFFL7OjfC4M8Gay6z74M4hwPRhHLQJKe_7_jUDq/s400/Obelisk_and_Fountain_in_St._Peter%2527s_Square_-_panoramio.jpg" width="300" height="400" data-original-width="450" data-original-height="600" /></a></div>
</li>
</ol>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com1tag:blogger.com,1999:blog-30926081.post-64745046281388034622019-05-21T13:26:00.001-07:002019-05-21T13:26:51.244-07:00Interview Questions for Older Relatives for Genealogy Research<div style="text-align: center;">
My Great Grandfather, Pickens Steele Fincher
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSfnNkPQqL2m_IvgrU99y4ygr-WIqKJaAuZg9XwxAnT6BGAxALtPRCgXR1-A7Lkwml54kydyT6yteWJbaLDX7n3yA5vfafV9qhQEDENX-eU9RjTz8tFIMXKPurpwY8gJWqTKgj/s1600/1953-00-00-PickensSteeleFincherOnHorse.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1292" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSfnNkPQqL2m_IvgrU99y4ygr-WIqKJaAuZg9XwxAnT6BGAxALtPRCgXR1-A7Lkwml54kydyT6yteWJbaLDX7n3yA5vfafV9qhQEDENX-eU9RjTz8tFIMXKPurpwY8gJWqTKgj/s640/1953-00-00-PickensSteeleFincherOnHorse.jpg" width="517" /></a></div>
During my recent Sabbatical from work I have been researching my family tree.
I've interviewed some relatives about their lives which has been enlightening. I found a few sites on the web that have questions to ask older relatives. Here's some of my favorite ones:<br />
<br />
https://www.deseretnews.com/article/865595932/Genealogy-150-questions-to-ask-family-members-about-their-lives.html
<br />
<br />
http://sites.rootsweb.com/~ohlths/interview2.htm<br />
<br />
https://www.thoughtco.com/fifty-questions-for-family-history-interviews-1420705<br />
<br />
If your parents, or grandparents, are still alive ask them some of these questions and record your conversation on your phone.
They will be gone before you know it.<br />
<br />
You can see more photos about the Fincher clan at <a href="https://www.fincher.org/fincher/index.shtml">https://www.fincher.org/fincher/index.shtml</a><br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com2tag:blogger.com,1999:blog-30926081.post-33191191221001640342019-04-16T20:03:00.000-07:002019-04-16T20:03:38.262-07:00Agile Austin - Why 76% Of Organizations Are Failing At Agile<h1>Why 76% Of Organizations Are Failing At Agile
</h1>
<p>
David Hawks from AgileVelocity.com gave a great presentation to 50 Agilists at <a href="https://www.meetup.com/AgileAustin/events/259804430/">Agile Austin</a> this week.
</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijOP4QjZMGweFlwErVClXuAaPtGkyVr0C-G5KyGaOIe2OVgkUQ-6HaILvp8xAa9-91s53J1OSgS4Oo-oWGVBOx_-kYVvh6jaP6h62YavRKxMKauCq9B48SbtOgrwr8j2cFmJXJ/s1600/IMG_0695.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijOP4QjZMGweFlwErVClXuAaPtGkyVr0C-G5KyGaOIe2OVgkUQ-6HaILvp8xAa9-91s53J1OSgS4Oo-oWGVBOx_-kYVvh6jaP6h62YavRKxMKauCq9B48SbtOgrwr8j2cFmJXJ/s400/IMG_0695.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<p>He used an interactive poll from PollEveryWhere.com which was a nice touch, so the audience could vote in real time on a question and we could see the results in a bar chart.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghu0HyOAKD7vLrBJTTBGBWdTy4AxnxAHhROtgCAkK25iY-tgLY8sG-za757FcQQWLCeuoop6EXfZ3W031wty1VNaCeEmcYV88pJmliuqub4e6AQi_I8jpH0CLXw0ZOrlmZxtKu/s1600/IMG_0696.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghu0HyOAKD7vLrBJTTBGBWdTy4AxnxAHhROtgCAkK25iY-tgLY8sG-za757FcQQWLCeuoop6EXfZ3W031wty1VNaCeEmcYV88pJmliuqub4e6AQi_I8jpH0CLXw0ZOrlmZxtKu/s400/IMG_0696.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<h2>Four phases of change:</h2>
<p>1. "Status Quo"</p>
<p>2. "Chaos and Resistance" When we introduce change the process always get worse.</p>
<p>3. "Integration and Practice" is next in which things slowly get better.</p>
<p>4. "New Status Quo" where things are genuinely better.</p>
<h2>Four Agile Steps:</h2>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8cNcHOzQayJDiZVoqtDQmfost8u2N_OFAc0gDgzWs8z-kyJKJE3o6IPWILQzEHabPUp7XkP-dt7NR50WhfnFmz2exysPft4-jvEHKFFrSD0Fh4u7T1TszIp3sHPYHXXyW4_7G/s1600/IMG_0697.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8cNcHOzQayJDiZVoqtDQmfost8u2N_OFAc0gDgzWs8z-kyJKJE3o6IPWILQzEHabPUp7XkP-dt7NR50WhfnFmz2exysPft4-jvEHKFFrSD0Fh4u7T1TszIp3sHPYHXXyW4_7G/s400/IMG_0697.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<ol>
<li>Align
<p>Why are we going to Agile? It's not just to "do" Agile. Goal should be something like improve time to market, improve productivity, make happier customers, and have better quality. </p>
</li><li>Learn
<p> Everyone needs to understand Agile.</p>
</li><li>Predict
<p>We need to make things predictable before going faster.</p>
</li><li>Accelerate
<p>This is where we actually start getting better.</p>
</li><li>Adapt
<p>Try new things like Experiment Based Development</p>
</li></ol>
<p>David had us do a small task in groups.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf3rZp-2l63SelHMpNVXLbDWtXNLQ4kXxQRlpjIW87YT8uQZHimic_Cm-dX-yunV2yLCJS3rQv-I_gA1yANCxzJE21E0kLaOXrrJ9bR_-MmxqNvpyiagdXLLgqz8N5yAQ6AR8y/s1600/IMG_0698.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf3rZp-2l63SelHMpNVXLbDWtXNLQ4kXxQRlpjIW87YT8uQZHimic_Cm-dX-yunV2yLCJS3rQv-I_gA1yANCxzJE21E0kLaOXrrJ9bR_-MmxqNvpyiagdXLLgqz8N5yAQ6AR8y/s400/IMG_0698.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<p>Why do so many companies struggle?</p>
<p>Most company think of Agile as a team level problem. Upper management just wants the team level to change, but not anything else.
We need to change the System.
We need to change the Organization, the leadership needs to understand Agility.
</p>
<h2>Three Impediments to Successful Agile Transformation</h2>
<ol>
<li>Implementing solutions without clarity in desired results
<p>This produces:
<br>Lots of resistance and frustration
<br>Silo Optimization
<br>No clear measure of success
</p>
<p>We did another exercise on how the importance of different tasks to transform a culture.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJNRAKR1qHl-P3aLfleNx04iJqd_zG4o12MWkNkAIzmPYhIUt6O3EmkY_7l1vSNjoEOZSlLPSs6VHGuy6ChMcW0cDBgS-zi_hAKZ4yHe7Wxi5oGjMyZue_PY65uyPiC7o3oBDT/s1600/IMG_0705.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJNRAKR1qHl-P3aLfleNx04iJqd_zG4o12MWkNkAIzmPYhIUt6O3EmkY_7l1vSNjoEOZSlLPSs6VHGuy6ChMcW0cDBgS-zi_hAKZ4yHe7Wxi5oGjMyZue_PY65uyPiC7o3oBDT/s400/IMG_0705.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<p>Steps to Organizational Change</p>
<pre>
a. Create Urgency - "We have to get better,
or our company may go bust." (Comes for the top level)
b. Form a powerful coalition
c. Create a vision for change
d. Communicate the vision
e. Empower action
f. Create quick wins
g. Build on the change
h. Anchor wins in culture
</pre>
</li><li>No mechanism to resolve organizational level cross department impediments
<pre>
a. Impediments not resolved quickly
b. Resistance is empowered
c. Teams hit a ceiling and become disenfranchised
</pre>
<p>Executives: We totally support agile, but what's the date, and what's the features?</p>
</li><li>Leaders Not Creating Focus
<p>If the leaders say all projects are equally important - the teams have no priorities.</p>
<p>So, the people with the least knowledge of corporate urgency, select the tasks that are coolest, easiest, and whose sponsor screams the loudest.</p>
<pre>
Impact:
a. lots of interruptions
b. No time to improve
c. no flow
d. no ability to forecast
e. slow time to value
</pre>
</li></ol>
<p>David showed us how Agile Velocity evaluates how an Agile transformation is going.</p>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8rVoFWhTQERAYqT6ehCPWhR2UA1Tn5moKJI11KI0S1OTXusubJrvA2nALQIkG_eF6pvN3PBFL87q3YJZa3W4lVBR42Zoz5iaOqBkySAKWbAg2LnaUpRf3j6rd-m5dKa7cJFtE/s1600/IMG_0709.HEIC" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8rVoFWhTQERAYqT6ehCPWhR2UA1Tn5moKJI11KI0S1OTXusubJrvA2nALQIkG_eF6pvN3PBFL87q3YJZa3W4lVBR42Zoz5iaOqBkySAKWbAg2LnaUpRf3j6rd-m5dKa7cJFtE/s400/IMG_0709.HEIC" width="400" height="300" data-original-width="1600" data-original-height="1200" /></a></div>
<p>Approach Agile by asking why, get buy in, break into smaller things.</p>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-534664263084653932019-04-16T11:19:00.000-07:002019-04-26T20:00:21.037-07:00Note to Self: How to Use NUnit with C# .Net in Visual Studio for the MacI always forget the three libraries to use NUnit with Visual Studio.<br />
Note to self: Download these from NuGet: <br />
<ol>
<li>NUnit</li>
<li>Microsoft.NET.Test.Sdk</li>
<li>NUnit3TestAdapter</li>
</ol>
<p>Then select "Run/Run Unit Tests" and VS will create a runner in the bottom pane.</p>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglLDZhnw-itALvkTmsWkDJTOYtumtwlHgt2WqvZOpdB_lYftqac_rl_cdj3zR1uWmCQ6kcUY0GABtwYnt_MOmIQeqjfiKkK0la5ryLgfP-arAYEGBGAhJyxQbTHEUiBd6DSnS7/s1600/Screen+Shot+2019-04-16+at+1.16.21+PM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglLDZhnw-itALvkTmsWkDJTOYtumtwlHgt2WqvZOpdB_lYftqac_rl_cdj3zR1uWmCQ6kcUY0GABtwYnt_MOmIQeqjfiKkK0la5ryLgfP-arAYEGBGAhJyxQbTHEUiBd6DSnS7/s640/Screen+Shot+2019-04-16+at+1.16.21+PM.png" width="640" height="592" data-original-width="1600" data-original-height="1481" /></a></div>
<br clear="all">
<p>PS: Latest endpoint to connect Visual Studio to the Nuget.org repository is
<pre>
https://api.nuget.org/v3/index.json
</pre>
<p>You can put these directly in the csproj:</p>
<pre>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.0.1" />
<PackageReference Include="NUnit" Version="3.11.0" />
<PackageReference Include="NUnit3TestAdapter" Version="3.13.0" />
</ItemGroup>
</pre>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-76088365246439860902019-04-12T13:21:00.000-07:002019-04-13T18:07:14.329-07:00Smallest example I could think of using C# Async/Await and HttpClient.GetAsync() with Generics<style>
dt, h2 { text-decoration: underline; }
h2 { font-size: 120%; }
pre { border: 2px solid #ccc; border-radius: 3em; padding: 1em;}
</style>
<p>Smallest example I could think of using HttpClient.GetAsync() with Generics.</p>
<pre>
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace AsyncHttpClient
{
/// <summary>
/// Tiny example of using HttpClient.GetAsync() with Generics.
/// Uses the REST API calls from the most excellent mysafeinfo.com for presidents and Beatles albums
/// This prints:
/// Requesting presidents
/// Requesting Beatles albums
/// ... waiting ...
/// first president = number: '1','', party: '', term: ''
/// first Beatles album = album name: 'Please Please Me (Mono)', date: '1963-03-22T00:00:00'
/// </summary>
public class President
{
public int president;
public string name, party, term;
public override string ToString() { return $"number: '{president}','{name}', party: '{party}', term: '{term}'"; }
}
public class BeatlesAlbum
{
public string album, date;
public override string ToString() { return $"album name: '{album}', date: '{date}'"; }
}
class AsyncHttpClientExample
{
private static void Main()
{
string presidentsUrl = "https://mysafeinfo.com/api/data?list=presidents&format=json";
string beatlesUrl = "https://mysafeinfo.com/api/data?list=beatlesalbums&format=json&select=ent,typ,rd&alias=ent=artist,typ=album,rd=date";
var asyncHttpClientExample = new AsyncHttpClientExample();
Console.Out.WriteLine("Requesting presidents");
var presidents = asyncHttpClientExample.GetAsync<List<President>>(presidentsUrl);
Console.Out.WriteLine("Requesting Beatles albums");
var albums = asyncHttpClientExample.GetAsync<List<BeatlesAlbum>>(beatlesUrl);
Console.Out.WriteLine("... waiting ...");
Console.Out.WriteLine("first president = {0}", presidents.Result[0]);
Console.Out.WriteLine("first Beatles album = {0}", albums.Result[0]);
}
private async Task<T> GetAsync<T>(string url)
{
HttpClient client = new HttpClient(new HttpClientHandler());
HttpResponseMessage response = await client.GetAsync(url).ConfigureAwait(false);
var jsonString = response.Content.ReadAsStringAsync().Result;
T result = JsonConvert.DeserializeObject<T>(jsonString);
return result;
}
}
}
</pre>
Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0tag:blogger.com,1999:blog-30926081.post-82667837883716085022019-02-21T08:18:00.000-08:002019-02-21T08:18:27.280-08:00Where to Find Your Tesla "Motor Vehicle Purchase Agreement"So, you just bought a shiny new Tesla, but where is your "Motor Vehicle Purchase Agreement" (aka "<strong itemprop="name" style="background-color: white; box-sizing: inherit; color: #666666; font-family: "Gotham Book"; font-size: 15px;">Motor Vehicle Purchase Agreement (MVPA)")</strong>?<br />
<br />
The <a href="https://www.tesla.com/support/newowners#purchase_agreement">FAQ</a> at Tesla is out of date as of Feb 21, 2019.<br />
<br />
You can print it from your Tesla account.<br />
1. Login to www.Tesla.com<br />
2. In the top right-hand corner select "TESLA ACCOUNT" (what's with this ALL-CAPS trend?)<br />
3. Select "Manage"<br />
4. Under the car's picture select "View Details".<br />
5. On the right side, near the bottom by "Motor Vehicle Purchase Agreement" select "View".<br />
6. Your pdf of the "Motor Vehicle Purchase Agreement" will be displayed.<br />
<br />
By the way, the tax form to get your $7,500 federal tax rebate is 8936.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOBHu1xeqG-_sbndAmhMZPoQrbocSetzFZBKBqH5X3LUJvywqBJvte_d_V1y1KNv0fr6IBhLy3j3Zvi5NxVKijTXu6dxo8hqIF-NCPUOixDtnBA4aNpeKOz-PPiPCeCAzHoTBq/s1600/2018-12-31-NewTeslaModel3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgOBHu1xeqG-_sbndAmhMZPoQrbocSetzFZBKBqH5X3LUJvywqBJvte_d_V1y1KNv0fr6IBhLy3j3Zvi5NxVKijTXu6dxo8hqIF-NCPUOixDtnBA4aNpeKOz-PPiPCeCAzHoTBq/s640/2018-12-31-NewTeslaModel3.jpg" width="640" /></a></div>
<br />
<br />
<br />Mitch Fincherhttp://www.blogger.com/profile/06517680094800899962noreply@blogger.com0