<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="https://www.fptracker.com"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Valley Programming blogs</title>
 <link>https://www.fptracker.com/blog</link>
 <description>Valley Programming RSS Feed</description>
 <language>en</language>
<item>
 <title>Woo Woo Woo: A binaural beats app</title>
 <link>https://www.fptracker.com/apps/woo-woo-woo-ios-android-binaural-beats-app</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;strong&gt;Woo Woo Woo&lt;/strong&gt; — also known as just Woo Woo — is a simple, totally-private, binaural beats app for meditation, relaxation, focus, and sleep.&lt;/p&gt;

&lt;p&gt;Because we use &lt;a href=&quot;https://en.wikipedia.org/wiki/Beat_(acoustics)#Binaural_beats&quot;&gt;binaural beats&lt;/a&gt; every day, we took the time to create an app that works simply and privately, and has the features we want.&lt;/p&gt;

&lt;div style=&quot;display: block;margin: 0 auto;text-align: center;width:400px;padding: 0.6em 0 2em 0;&quot;&gt;&lt;img style=&quot;border-radius: 24px;&quot; width=&quot;400&quot; src=&quot;/images/woo-woo-woo-binaural-beats-app-ios-android.jpg&quot; /&gt;&lt;/div&gt;


&lt;p&gt;Note 1: This is a paid app because we have a lot of other ideas we’d like to implement over time, and we couldn’t afford to implement those ideas with a free app.&lt;/p&gt;

&lt;p&gt;Note 2: The app Privacy Policy and Technical Support information is shown later on this page.&lt;/p&gt;

&lt;h2 id=&quot;features&quot;&gt;Features&lt;/h2&gt;

&lt;p&gt;These are the current features of our app:&lt;/p&gt;

&lt;ul&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Beat Frequency&lt;/strong&gt;: Adjust from 0.5 to 40 Hz to target the brainwave states you want. (See the brainwave states listed below.)&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Tone Frequency&lt;/strong&gt;: Choose your carrier tone from 40 to 600 Hz. Lower tones tend to be more relaxing, and higher tones tend to be more energizing.&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Presets&lt;/strong&gt;: Easily save your favorite settings, so you can quickly recall those favorites for focus, meditation, and relaxation.&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Background Playback&lt;/strong&gt;: Plays in the background so you can also listen to your favorite music, podcasts, audiobooks, etc., if desired.&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Switch ears&lt;/strong&gt;: The base tone can be switched between the left ear and right ear as desired. We find this helpful when you realize you’re listening to tones, but don’t hear any beats. (We suspect that there is a certain “brain fatigue” in listening to beats, and this might be a way to overcome that.)&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Auto-Stop&lt;/strong&gt;: Optionally stop playback when headphones disconnect.&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;No ads, no subscriptions, no account required&lt;/strong&gt;: Everything works locally on your phone, so the app is completely private.&lt;/li&gt;
&lt;li style=&quot;margin: 1.2em;&quot;&gt;&lt;strong&gt;Works on iPhone, iPad, and Mac, too&lt;/strong&gt;: On iOS, we’ve written the app so it not only works on your iPhone, but also your iPad and Mac, so you can use it anytime, anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;beats&quot;&gt;What are binaural beats?&lt;/h2&gt;

&lt;p&gt;With the app we generally assume that customers already know what &lt;em&gt;binaural beats&lt;/em&gt; are, but in short:&lt;/p&gt;

&lt;p&gt;When you hear two slightly different frequencies in each ear, your brain perceives a third tone — the “beat” — at the difference between them. Research suggests that the Hz of that beat can help guide your brain toward different mental states.&lt;/p&gt;

&lt;h2 id=&quot;states&quot;&gt;Brainwave States&lt;/h2&gt;

&lt;p&gt;Here’s a quick look at Hz ratings and their corresponding brainwave states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Delta (0.5-4 Hz): Deep sleep&lt;/li&gt;
&lt;li&gt;Theta (4-8 Hz): Meditation&lt;/li&gt;
&lt;li&gt;Alpha (8-13 Hz): Relaxation&lt;/li&gt;
&lt;li&gt;Beta (13-30 Hz): Focus&lt;/li&gt;
&lt;li&gt;Gamma (30+ Hz): High cognitive function&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;requirements&quot;&gt;Requirements&lt;/h2&gt;

&lt;p&gt;Stereo headphones or earbuds are required. Binaural beats do not work with speakers.&lt;/p&gt;

&lt;h2 id=&quot;about&quot;&gt;About the name&lt;/h2&gt;

&lt;p&gt;The name &lt;em&gt;Woo Woo Woo&lt;/em&gt; is based both on the sound you hear when you play binaural beats, but also the sound one of our Siberian Huskies makes every day when she wakes around the office (which is usually “woo woo”, but occasionally “arooo...”).&lt;/p&gt;

&lt;div style=&quot;display: block;margin: 0 auto;text-align: center;width:400px;padding: 1em 0;&quot;&gt;&lt;img style=&quot;border-radius: 24px;&quot; width=&quot;400&quot; src=&quot;/images/woo-woo-woo-app-siberian-husky.jpg&quot; /&gt;&lt;/div&gt;

&lt;h2 id=&quot;privacy&quot;&gt;Privacy policy/statement&lt;/h2&gt;

&lt;p&gt;With Woo Woo Woo, everything works locally on your phone, so the app is completely private. The only data we save is (a) your “preset” settings, and (b) your last-used settings (so they can be recalled the next time you start the app), and again, that data is only stored on your phone.&lt;/p&gt;

&lt;h2 id=&quot;support&quot;&gt;Technical support&lt;/h2&gt;

&lt;p&gt;To report a bug, make a feature request, or just a general comment, please use &lt;a href=&quot;https://forms.gle/xqcnX3gRiXZqQjfC7&quot; target=&quot;_blank&quot;&gt;this Google Form page&lt;/a&gt;.&lt;/p&gt;

&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 20 Jan 2026 19:44:12 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">223 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Our “Back To Now” app: Now available for iPhone and iPad</title>
 <link>https://www.fptracker.com/apps/back-to-now-app-available-on-ios-android</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;August 9, 2025: Valley Programming is proud to announce the Version 2.0 release of our &lt;a href=&quot;https://apps.apple.com/us/app/back-to-now/id1483964723?platform=iphone&quot; alt=&quot;Back To Now app for iOS&quot; title=&quot;Back To Now app on the Apple App Store&quot;&gt;&lt;em&gt;Back To Now&lt;/em&gt; app for iPhone and iPad devices!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.valleyprogramming.com/images/Back-To-Now-app-icon.jpg&quot; style=&quot;text-align: center; display: block; margin: 0 auto; width: 360px; height: 360px; border-radius: 20%;  object-fit: cover;&quot; /&gt;&lt;/p&gt;

&lt;h2&gt;How it works&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://apps.apple.com/us/app/back-to-now/id1483964723?platform=iphone&quot; alt=&quot;Back To Now app for iOS&quot; title=&quot;Back To Now app on the Apple App Store&quot;&gt;&lt;em&gt;Back To Now&lt;/em&gt;&lt;/a&gt; is a “mindfulness reminder” application that helps you return to the present moment. The basic concept is simple:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Create a list of your favorite mindfulness quotes&lt;/li&gt;
	&lt;li&gt;Add your favorite images&lt;/li&gt;
	&lt;li&gt;Configure your desired reminder schedule&lt;/li&gt;
	&lt;li&gt;Then, receive “mindfulness reminders” as notifications, on your schedule&lt;/li&gt;
	&lt;li&gt;Tap the notifications to see your reminder on top of your images&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a bonus, if you have an Apple Watch, the notifications will also appear on your watch. And if you have a Mac, it will also run there.&lt;/p&gt;


&lt;h2&gt;The Back To Now slideshow&lt;/h2&gt;

&lt;p&gt;This all-new release of Back To Now also offers a slideshow/screensaver mode that helps to keep you &lt;em&gt;constantly&lt;/em&gt; in the present moment.&lt;/p&gt;

&lt;p&gt;The Slideshow is currently in the “More” area of the app. To use it:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Go to the More tab&lt;/li&gt;
	&lt;li&gt;Configure the slideshow settings&lt;/li&gt;
	&lt;li&gt;Start the slideshow&lt;/li&gt;
	&lt;li&gt;Put your phone down where you can see it&lt;/li&gt;
	&lt;li&gt;Observe your beautiful quotes and images, to constantly keep you in the present moment&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;This is what several of the default images and quotes look like in full-screen portrait mode:&lt;/p&gt;

&lt;div style=&quot;display: flex; justify-content: center;&quot;&gt;
    &lt;img src=&quot;/images/7-be-witness-not-judge.jpg&quot; alt=&quot;Back To Now, slideshow image 1&quot; style=&quot;height: 420px; margin-right: 8px; border-radius: 20px;&quot;&gt;
    &lt;img src=&quot;/images/8-walk-as-if-kissing.jpg&quot; alt=&quot;Back To Now, slideshow image 2&quot; style=&quot;height: 420px; margin-right: 8px; border-radius: 20px;&quot;&gt;
    &lt;img src=&quot;/images/2-you-have-to-break-heart.jpg&quot; alt=&quot;Back To Now, slideshow image 3&quot; style=&quot;height: 420px; margin-right: 8px; border-radius: 20px;&quot;&gt;
&lt;/div&gt;

&lt;p style=&quot;padding-top: 1.6em;&quot;&gt;I think the slideshow looks even more beautiful in landscape mode:&lt;/p&gt;

&lt;div style=&quot;text-align: center; padding-bottom: 1.6em;&quot;&gt;
    &lt;img src=&quot;/images/6-carry-bucket-water-monastery-landscape.jpg&quot; alt=&quot;Back To Now slideshow in landscape mode&quot; style=&quot;height: 276px; border-radius: 20px;&quot;&gt;
&lt;/div&gt;


&lt;h2&gt;Current features&lt;/h2&gt;

&lt;p&gt;While we hope to implement many other features in the &lt;em&gt;future&lt;/em&gt;, other &lt;em&gt;current&lt;/em&gt; features include:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Bulk-importing quotes&lt;/li&gt;
	&lt;li&gt;Bulk-importing images from your device&lt;/li&gt;
	&lt;li&gt;Bulk-exporting your quotes, as a way to share them to other devices&lt;/li&gt;
	&lt;li&gt;The ability to put “jitter” in your schedule, to help randomize when they are sent&lt;/li&gt;
	&lt;li&gt;The ability to “pin” quotes, so you only see those quotes during the day (to help you focus on a certain practice, for example)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Privacy: Back To Now is completely private&lt;/h2&gt;

&lt;p&gt;It’s important to note using Back To Now is completely safe. All of your data is stored on your device, and it doesn’t do &lt;em&gt;anything&lt;/em&gt; at all over the internet, so it doesn’t track you in any way.&lt;/p&gt;

&lt;h2&gt;Downloads&lt;/h2&gt;

&lt;p&gt;You can find &lt;em&gt;Back To Now&lt;/em&gt; here on the Apple App Store:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://apps.apple.com/us/app/back-to-now/id1483964723?platform=iphone&quot; alt=&quot;Back To Now app for iOS&quot; title=&quot;Back To Now app for iOS&quot;&gt;Back To Now&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Release history&lt;/h2&gt;

&lt;p&gt;This is the app-release history:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Version 2.0.1: The app was showing in the App Store as “Designed for iPad”, when it’s really designed for iPhone.&lt;/li&gt;
	&lt;li&gt;Version 2.0.0: The new main release.&lt;/li&gt;
&lt;/ul&gt;



&lt;!--
&lt;h2&gt;More information&lt;/h2&gt;

&lt;p&gt;For more information, see those links, or see our &lt;a href=&quot;/apps/back-to-now-app-ios-android&quot;&gt;&lt;em&gt;Back To Now&lt;/em&gt; support page&lt;/a&gt;.&lt;/p&gt;
--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 09 Aug 2025 15:39:13 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">194 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Free Scala and functional programming video training courses</title>
 <link>https://www.fptracker.com/blog/2025/free-scala-functional-programming-training-video-courses</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;If you’re interested in learning the &lt;a href=&quot;https://scala-lang.org&quot;&gt;Scala programming language&lt;/a&gt; or functional programming, Alvin Alexander, the author of the &lt;a href=&quot;https://www.amazon.com/Scala-Cookbook-Object-Oriented-Functional-Programming-dp-1492051543/dp/1492051543&quot;&gt;Scala Cookbook&lt;/a&gt;, has created a website dedicated to these two topics. Here’s a link to his &lt;a href=&quot;https://www.learnscala.dev/&quot;&gt;free Scala and functional programming video training courses&lt;/a&gt; on LearnScala.dev.&lt;/p&gt;

&lt;p&gt;As you may know, Mr. Alexander is also the author of &lt;a href=&quot;https://www.amazon.com/Functional-Programming-Simplified-Alvin-Alexander/dp/1979788782/&quot;&gt;Functional Programming, Simplified&lt;/a&gt;, which is one of the best-selling and highly-rated functional programming books of all time.&lt;/p&gt;

&lt;p&gt;Also, please note that these free video training courses are &lt;a href=&quot;https://ziverge.com&quot;&gt;sponsored by Ziverge.&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 21 Dec 2024 17:56:05 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">222 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Free: Introduction To Functional Programming video training course</title>
 <link>https://www.fptracker.com/blog/free-introduction-to-functional-programming-video-training-course-2024</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;As a little update, here’s a link to &lt;a href=&quot;https://alvinalexander.com/video-course/intro-fp/introduction/&quot;&gt;a free “Introduction to Functional Programming” video training course&lt;/a&gt;. The training course consists of over 50 videos, all of which are free.&lt;/p&gt;

&lt;p&gt;This is a free “functional programming in Scala 3” video training course, created by Alvin Alexander, the author of the following Scala and functional programming books:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Scala-Cookbook-Object-Oriented-Functional-Programming-dp-1492051543/dp/1492051543&quot;&gt;Scala Cookbook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.amazon.com/Functional-Programming-Simplified-Alvin-Alexander/dp/1979788782/&quot;&gt;Functional Programming, Simplified&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;&quot;&gt;Learn Functional Programming The Fast Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://amzn.to/3L4YwR4&quot;&gt;Learn Scala 3 The Fast Way! (Book 1: The Adventure Begins)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The free booklet, &lt;a href=&quot;https://alvinalexander.gumroad.com/l/learning-recursion&quot;&gt;Learning Recursion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As you can see from the ratings with all those books, Mr. Alexander is a well-known and highly-rated teacher in the Scala and functional programming community.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 31 Jan 2024 18:14:58 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">221 at https://www.fptracker.com</guid>
</item>
<item>
 <title>The #1 functional programming (and computer programming) book</title>
 <link>https://www.fptracker.com/blog/best-selling-functional-programming-book-2023</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Dateline, April, 2023: Alvin Alexander’s newest book, &lt;a href=&quot;https://www.amazon.com/Learn-Functional-Programming-Fast-Way-ebook/dp/B0BYMDLP8P/&quot;&gt;“Learn Functional Programming The Fast Way!”&lt;/a&gt;, is a #1&amp;nbsp;Best-Seller in three computer programming book categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Computer Programming (general)&lt;/li&gt;
&lt;li&gt;Functional Programming&lt;/li&gt;
&lt;li&gt;Data Modeling and Design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This image shows the book being the best-selling book in Amazon’s &lt;em&gt;Functional Programming&lt;/em&gt; category on April 12, 2023:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/best-functional-programming-book-april-12-2023.jpg&quot; alt=&quot;Learn Functional Programming The Fast Way, best functional programming book&quot; width=&quot;700&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Other images that we haven’t posted here show the book being #1 in the general Computer Programming category and the Data Modeling and Design category.&lt;/p&gt;

&lt;p&gt;If you’re interested in functional programming, this is &lt;a href=&quot;https://www.amazon.com/Learn-Functional-Programming-Fast-Way-ebook/dp/B0BYMDLP8P/&quot;&gt;the #1 best seller!&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 12 Apr 2023 16:57:04 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">220 at https://www.fptracker.com</guid>
</item>
<item>
 <title>The User Story Mapping Workshop process</title>
 <link>https://www.fptracker.com/blog/2022/user-story-mapping-workshop-process-longmont-colorado</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;A technique that I’ve known for a long time — but has been improved by my recent &lt;a href=&quot;/2022/alvin-alexander-certified-scrum-master-csm.html&quot;&gt;Certified ScrumMaster (CSM)&lt;/a&gt; and &lt;a href=&quot;/blog/2022/certified-scrum-product-owner-cspo-longmont-colorado.html&quot;&gt;Certified Product Owner (CSPO)&lt;/a&gt; training — is how to conduct a “User Story Mapping Workshop” at the beginning of a new software development project.&lt;/p&gt;

&lt;p&gt;The basics are simple: You get together in a room with the Product Owner, Stakeholders, Subject Matter Experts (SMEs, also known as Domain Experts), Developers, Designers, ScrumMaster, and anyone else who should be there. Then you begin brainstorming the possible user stories and personas (also known as users, or actors).&lt;/p&gt;

&lt;h2 id=&quot;toc_0&quot;&gt;A User Story Mapping Workshop board&lt;/h2&gt;

&lt;p&gt;For example, this is what a User Story Mapping Workshop board might look like if you were brainstorming and inventing Facebook back in the day:&lt;/p&gt;

&lt;div style=&quot;padding: 0 0 1.5em 0&quot;&gt;&lt;img src=&quot;/images/facebook-user-story-workshop-1.jpg&quot; width=&quot;720&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Note that the board includes both potential &lt;em&gt;user stories&lt;/em&gt; (at different levels of detail) as well as &lt;em&gt;personas&lt;/em&gt;. I like to add them all as they come up.&lt;/p&gt;

&lt;p&gt;It’s generally more effective and preferred to do this with actual sticky notes on a wall or table, but in some cases using a software tool can be acceptable. (Though the use of a software tool is generally considered a bad practice. Feel free to ask me about this when we’re working together.)&lt;/p&gt;

&lt;h2 id=&quot;toc_1&quot;&gt;Starting to organize the User Story Mapping board&lt;/h2&gt;

&lt;p&gt;Once you’ve gotten a little way into your effort you will naturally see that the user stories line up into different categories. For instance, if you continued to work on the invention of Facebook, you would eventually start organizing your stories into logical groups like this:&lt;/p&gt;

&lt;div style=&quot;padding: 0 0 1.5em 0&quot;&gt;&lt;img src=&quot;/images/facebook-user-story-workshop-2.jpg&quot; width=&quot;720&quot; /&gt;&lt;/div&gt;

&lt;p&gt;In this grouping:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Posts&lt;/em&gt; are any stories related to adding, editing, or deleting a post&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Friends&lt;/em&gt; are any stories related to adding, editing, or deleting a friend&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Account&lt;/em&gt; is any stories related to managing your account&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;toc_2&quot;&gt;Continuing from here&lt;/h2&gt;

&lt;p&gt;At this point you would continue this process in a variety of ways, including the ongoing management and grouping of stories, adding story details, and much more. I’ll add to this at some point, but until then, if you’re interested in the User Story Mapping Workshop process, I hope this example is helpful.&lt;/p&gt;

&lt;p&gt;Reporting live from Simpsonville, Kentucky&lt;br /&gt;
Alvin Alexander&lt;br /&gt;
Certified ScrumMaster &amp;amp; Certified Scrum Product Owner&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Mon, 09 May 2022 02:15:18 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">219 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Alvin Alexander, Certified Scrum Product Owner (CSPO)</title>
 <link>https://www.fptracker.com/blog/2022/certified-scrum-product-owner-cspo-longmont-colorado</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;As a brief note today (May 2, 2022), Alvin Alexander is now a &lt;em&gt;Certified Scrum Product Owner (CSPO)&lt;/em&gt;, certified by the &lt;a href=&quot;https://www.scrumalliance.org&quot;&gt;Scrum Alliance&lt;/a&gt;. This is in addition to his many years of leading agile software teams in Scrum, Scrum-like, and Scrumban environments, and also being a &lt;a href=&quot;/2022/alvin-alexander-certified-scrum-master-csm.html&quot;&gt;Certified ScrumMaster (CSM)&lt;/a&gt;.&lt;/p&gt;

&lt;div style=&quot;text-align:center;&quot;&gt;
&lt;img
    src=&quot;/images/scrum-seal-csm.png&quot; width=&quot;120&quot; /&gt;&lt;img 
    src=&quot;/images/scrum-seal-cspo.png&quot; width=&quot;120&quot; /&gt;
&lt;/div&gt;

&lt;!--break--&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Mon, 09 May 2022 01:26:31 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">218 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Alvin Alexander is now a Certified ScrumMaster (CSM)</title>
 <link>https://www.fptracker.com/2022/alvin-alexander-certified-scrum-master-csm</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;As a brief note today (April 24, 2022), Alvin Alexander is now a &lt;em&gt;Certified ScrumMaster (CSM)&lt;/em&gt;, certified by the &lt;a href=&quot;https://www.scrumalliance.org&quot;&gt;Scrum Alliance&lt;/a&gt;. This is in addition to his many years of leading agile software teams in Scrum, Scrum-like, and Scrumban environments.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Mon, 25 Apr 2022 06:50:45 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">217 at https://www.fptracker.com</guid>
</item>
<item>
 <title>Our “Back To Then” app (for iOS and Android)</title>
 <link>https://www.fptracker.com/apps/back-to-then-app-ios-android</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;em&gt;Back&amp;nbsp;To&amp;nbsp;Then&lt;/em&gt; is a “photo frame”
slideshow app. Just copy your favorite photos into the
app and then press Start Slideshow, and it slowly
rotates your photos in full-screen mode on your device.
When you want to stop the screensaver, just tap the screen
to return to the main menu.&lt;/p&gt;

&lt;p&gt;Back&amp;nbsp;To&amp;nbsp;Then doesn’t have any ads, 
and it doesn’t access the internet, so your photos 
remain completely private to you.&lt;/p&gt;


&lt;h2&gt;How It Works&lt;/h2&gt;

&lt;p&gt;To use Back&amp;nbsp;To&amp;nbsp;Then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy your favorite photos from your photo library into Back&amp;nbsp;To&amp;nbsp;Then.&lt;/li&gt;
&lt;li&gt;Tap Start Slideshow to start the slideshow.&lt;/li&gt;
&lt;li&gt;Optionally, adjust the slideshow Settings as desired.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the slideshow starts, your photos will be displayed in a 
random order, with smooth animation effects. To exit the slideshow, 
tap anywhere on the screen.&lt;/p&gt;


&lt;h2&gt;Managing Images&lt;/h2&gt;

&lt;p&gt;To add and remove images, tap Manage Images on the main screen.&lt;/p&gt;

&lt;blockquote&gt;Note: To help make scrolling faster, smaller versions of your 
images are shown in the Manage Images screen. But don’t worry, your
full, large images are shown in the Screensaver.&lt;/blockquote&gt;

&lt;h3&gt;Adding images&lt;/h3&gt;

&lt;p&gt;To add one or more images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tap the “+” button on the Manage Images screen.&lt;/li&gt;
&lt;li&gt;Select one or more images to add to the Back&amp;nbsp;To&amp;nbsp;Then image library.&lt;/li&gt; 
&lt;/ul&gt;

&lt;blockquote&gt;As a “pro tip,” if you want to add a large number of images, it can
be easier to first create an album in your phone’s Photo app, and put
all the images you want in that album. Then you can select all of those
images from within Back&amp;nbsp;To&amp;nbsp;Then.&lt;/blockquote&gt;


&lt;h3&gt;Removing images&lt;/h3&gt;

&lt;p&gt;To remove an image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Manage Images screen, swipe left or right on the image, and it will
be removed from the Back&amp;nbsp;To&amp;nbsp;Then app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that this &lt;em&gt;will not&lt;/em&gt; affect the image in your phone’s main 
photo library, because these are two separate locations.&lt;/p&gt;


&lt;h2&gt;Managing Settings&lt;/h2&gt;

&lt;p&gt;You can manage the following settings:&lt;/p&gt;

 &lt;dl&gt;
  &lt;dt&gt;&lt;b&gt;Minimum Animation Duration&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;The shortest time that an image will be displayed during
  its animation. (Default is 4 seconds.)&lt;br/&gt;&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;Maximum Animation Duration&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;The longest time an image will be displayed during its animation.
  Larger images typically take more time than smaller images.
   (Default is 10 seconds.)&lt;br/&gt;&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;Image Transition Duration&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;The time for the transition from one image to the next.
   (Default is 5 seconds.)&lt;br/&gt;&lt;/dd&gt;

  &lt;dt&gt;&lt;b&gt;Maximum Image Zoom&lt;/b&gt;&lt;/dt&gt;
  &lt;dd&gt;The maximum amount images will be zoomed-in on during the
  time they are displayed. (Default is 2x.)&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Note that for the time-related settings, the lower the values are,
the faster the animations will move across your screen.&lt;/p&gt;


&lt;h2&gt;Created By&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Back&amp;nbsp;To&amp;nbsp;Then&lt;/em&gt; is lovingly crafted by Valley Programming
(valleyprogramming.com) of Louisville, Kentucky.&lt;/p&gt;

&lt;p&gt;The name &lt;em&gt;Back&amp;nbsp;To&amp;nbsp;Then&lt;/em&gt; is inspired by our
mindfulness app, named &lt;em&gt;Back&amp;nbsp;To&amp;nbsp;Now&lt;/em&gt;. You can find
both apps in Apple’s App Store and the Google Play Store.&lt;/p&gt;

&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Fri, 08 Apr 2022 03:13:20 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">215 at https://www.fptracker.com</guid>
</item>
<item>
 <title>A Docker cheat sheet</title>
 <link>https://www.fptracker.com/blog/2022/docker-cheat-sheet-boulder-longmont-colorado</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;This is the beginning of a Docker cheat sheet. I couldn’t find any out here that I liked, so I’m starting to create my own, which will hopefully be organized the way I like it. (This cheat sheet is cross-posted at &lt;a href=&quot;https://alvinalexander.com/programming/docker-cheat-sheet-cheatsheet/&quot;&gt;alvinalexander.com/programming/docker-cheat-sheet-cheatsheet&lt;/a&gt;.)&lt;/p&gt;

&lt;h2 id=&quot;toc_1&quot;&gt;Docker Basics&lt;/h2&gt;

&lt;p&gt;Recommended as a first command on a Docker system:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker version     # should show Client and Server sections&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_2&quot;&gt;Docker Lifecycle&lt;/h2&gt;

&lt;p&gt;This section mostly comes from (&lt;span class=&quot;url&quot;&gt;https://github.com/wsargent/docker-cheat-sheet&lt;/span&gt;):&lt;/p&gt;
&lt;!--break--&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker create     creates a container but does not start it
docker rename     allows the container to be renamed
docker run        creates and starts a container in one operation
docker rm         deletes a container
docker update     updates a container&#039;s resource limits&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_3&quot;&gt;Docker Build&lt;/h2&gt;

&lt;p&gt;Build an image using a &lt;code&gt;Dockerfile&lt;/code&gt; in the current directory:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker build -t scala-webserver-1 .&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Other &lt;code&gt;build&lt;/code&gt; commands:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker build [url]      # create an image from a Dockerfile at a URL
docker build -t [url]   # build an image from a Dockerfile and tag it

docker load [tafile]    # TODO (more on this)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;I needed to use this command when building a Linux distro on macOS (which uses an ARM chip):&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker build --platform linux/amd64 -t scala-webserver-1 .&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;TODO: There is also a &lt;code&gt;docker create&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Example &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;FROM openjdk:11
WORKDIR /home
COPY target/scala-3.1.0/WebServerDocker3-assembly-0.1.0.jar WebServerDocker3-assembly-0.1.0.jar
#CMD java -jar ManualDockerfile2-assembly-0.1.0.jar
EXPOSE 5150
CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;WebServerDocker3-assembly-0.1.0.jar&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Can also expose multiple ports:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;EXPOSE 5150 5151&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_4&quot;&gt;Docker Images&lt;/h2&gt;

&lt;p&gt;List images:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker image ls
docker images
docker images -a
docker images -f dangling=true&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Pull and push images from a registry:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker pull [image]
docker pull alpine
docker pull alpine:latest

docker push [image]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Remove images:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker rmi [image]
docker rmi alpine:latest

docker rmi $(docker images -q)
docker rmi $(docker images -a -q)
docker rmi $(docker images -aq)
docker image prune&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Other image commands:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker history [image]   # show the history of an image&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_5&quot;&gt;Docker Run (run an image)&lt;/h2&gt;

&lt;p&gt;Start a container with an interactive shell:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker run -it alpine /bin/sh
docker run -it rhel7/rhel bash

docker exec -it &amp;lt;container-name&amp;gt; /bin/sh
docker run -it --rm --name my-running-app my-java-app

# example:
$ docker run -it debian:stable /bin/bash
Unable to find image &#039;debian:stable&#039; locally
stable: Pulling from library/debian
d39780c72a13: Pull complete 
Digest: sha256:e8795576943b7bb2ecf2126c3b7f467da64c84f3c4d63f75c24fb91502ab8487
Status: Downloaded newer image for debian:stable
root@ef74a0677a41:/# &lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Run an image, exposing its port 5150 as port 8080 of the container:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker run -p 8080:5150 scala-webserver-1

&amp;gt; curl http://localhost:8080
Have a nice day!&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;More run commands:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker run [image]        # start a container
docker run --rm [image]   # run a container, remove it when it stops
docker run -td [image]    # TODO
docker run -it [image]    # start a container, run a command in it, connect to it (TODO)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;An example from &lt;span class=&quot;url&quot;&gt;https://design.jboss.org/redhatdeveloper/marketing/docker_cheatsheet/cheatsheet/images/docker_cheatsheet_r3v2.pdf&lt;/span&gt;:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker run -d \
    -p 8000:8000 \
    --name=pythonweb \
    -v `pwd`/www:/var/www/html \
    -w /var/www/html \
    rhel7/rhel \
    /bin/python \
    -m SimpleHTTPServer 8000&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_6&quot;&gt;Docker Containers&lt;/h2&gt;

&lt;p&gt;List active/running containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker container ls
docker ps&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;List active/running and stopped containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker container ls -a
docker ps -a&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;List all containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;$ docker container ls -a
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS                        PORTS     NAMES
3fd5b267c069   scala-webserver-1   &quot;java -jar WebServer…&quot;   3 minutes ago   Exited (130) 26 seconds ago             ecstatic_shamir
2835d9c80513   scala-hello-1       &quot;java -jar ManualDoc…&quot;   24 hours ago    Exited (0) 24 hours ago                 busy_sammet

# list by status
docker ps -a -f status=exited
docker ps -a -f status=exited -f status=created

# list by pattern
docker ps -a | grep &quot;pattern&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Start, stop, and restart containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker start [container]

# more &#039;start&#039; options:
docker start [options] [container]
    -a, --attach        # attach stdout/stderr
    -i, --interactive   # attach stdin

docker stop [container]
docker stop -t5 [container]   # stop with a timeout

docker restart [container]

docker pause [container]      # pause processes in a running container
docker unpause [container]

docker attach [container]     # attach STDIN, STDOUT, STDERR to a running container
docker wait [container]       # block a container until (TODO)

docker kill [container]       # send SIGKILL to a container

# kill all running containers:
docker kill $(docker ps -q)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Other container commands:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker events [container]     # list the events from a running container

docker logs [container]       # list the logs from a container
docker logs -f [container]

docker top [container]        # show running processes in a container

docker diff [container]
docker port [container]
docker stats [container]

docker export ...             # export container’s filesystem as a tar archive
docker exec ...               # run a command in a running container
docker pause ...              # pause all processes in a running container&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Information commands:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;code&gt;diff&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;events&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;inspect&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;logs&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;port&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;ps&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;stats&lt;/code&gt;&lt;/li&gt;
	&lt;li&gt;&lt;code&gt;top&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remove a container:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;$ docker container rm 3fd5b267
3fd5b267&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Remove multiple/all containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;# remove all stopped containers:
docker rm $(docker ps -aq)

docker rm $(docker ps --filter status=exited -q)
docker ps --filter status=exited -q | xargs docker rm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Stop all running containers:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;# stop
docker stop $(docker ps -a -q)
docker stop $(docker ps -aq)

# remove
docker rm $(docker ps -a -q)
docker rm $(docker ps -a -f status=exited -q)
docker rm $(docker ps -a -f status=exited -f status=created -q)

# remove by pattern
docker ps -a | grep &quot;pattern&quot; | awk &#039;{print $1}&#039; | xargs docker rm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_7&quot;&gt;Docker Networks&lt;/h2&gt;

&lt;p&gt;List networks:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker network ls
docker network inspect [network]

# connect a container to a network
docker network connect [network] [container]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_8&quot;&gt;“Dangling” resources&lt;/h2&gt;

&lt;p&gt;This section needs more work, but here are some initial examples:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker system df          # show space used by docker objects

# remove all &quot;dangling&quot; resources (images, containers, volumes, networks)
docker system prune       # not tagged or associated with a container
docker system prune -a    # stopped containers and unused images&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;TODO: “Dangling” may mean “not associated with a container,” but I need to research that for a more precise definition.&lt;/p&gt;

&lt;p&gt;Docker pruning commands:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker image prune      # remove unused, dangling images
docker image prune -a   # remove images not used in containers

docker system prune     # prune everything (the entire system)

docker container prune
docker image prune
docker network prune
docker system prune
docker volume prune&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_9&quot;&gt;Dockerfile examples&lt;/h2&gt;

&lt;p&gt;From https://hub.docker.com/r/adoptopenjdk/openjdk11:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;# Dockerfile:
    FROM adoptopenjdk/openjdk11:ubi
    RUN mkdir /opt/app
    COPY japp.jar /opt/app
    CMD [&quot;java&quot;, &quot;-jar&quot;, &quot;/opt/app/japp.jar&quot;]

# You can build and run the Docker image as shown in the following example:
    $ docker build -t japp .
    $ docker run -it --rm japp&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;From https://hub.docker.com/_/openjdk:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;# Dockerfile:
    FROM openjdk:11
    COPY . /usr/src/myapp
    WORKDIR /usr/src/myapp
    RUN javac Main.java
    CMD [&quot;java&quot;, &quot;Main&quot;]

# build and run the Docker image:
    $ docker build -t my-java-app .
    $ docker run -it --rm --name my-running-app my-java-app&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://snyk.io/blog/best-practices-to-build-java-containers-with-docker/&quot;&gt;This snyk.io page&lt;/a&gt; has a good Dockerfile example, including best practices, including this:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab0.....
RUN apk add dumb-init
RUN mkdir /app
RUN addgroup --system javauser &amp;amp;&amp;amp; adduser -S -s /bin/false -G javauser javauser
COPY --from=build /project/target/java-code-workshop-0.0.1-SNAPSHOT.jar /app/java-application.jar
WORKDIR /app
RUN chown -R javauser:javauser /app
USER javauser
CMD &quot;dumb-init&quot; &quot;java&quot; &quot;-jar&quot; &quot;java-application.jar&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h2 id=&quot;toc_10&quot;&gt;Docker Volumes&lt;/h2&gt;

&lt;p&gt;TODO: I haven’t worked with these much yet, but this is what I know:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;high level:
	&lt;ul&gt;
		&lt;li&gt;create a volume&lt;/li&gt;
		&lt;li&gt;create a container&lt;/li&gt;
		&lt;li&gt;mount the volume into the container&lt;/li&gt;
	&lt;/ul&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker volume prune    # delete all volumes&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Create a new volume named &lt;code&gt;vol01&lt;/code&gt;:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker volume create vol01&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;See your volumes:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker volume ls&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Inspect them:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker volume inspect vol01

# shows json output
# `mountpoint` tells you where on the host the volume is surfaced
# volumes with the `local` driver get their own directory under /var/lib/docker/volumes&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Delete them:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;# [1]
docker volume rm &amp;lt;volume-name&amp;gt;

# [2]
docker volume prune
# delete all volumens that are not mounted into a container (or service)
# neither command will delete a volume that’s in use&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;h3 id=&quot;toc_11&quot;&gt;Example&lt;/h3&gt;

&lt;p&gt;Goal: create a new standalone container and mount a volume called &lt;code&gt;als_vol&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Linux:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker container run -dit --name container_and_vol \
    --mount source=als_vol,target=/vol \
    alpine&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note: Docker can use an existing volume, and will also create one if you specify a volume that doesn’t exist. In this case, &lt;code&gt;als_vol&lt;/code&gt; doesn’t exist, so Docker creates it and mounts it into the new container:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;$ docker volume ls
DRIVER    VOLUME NAME
local     als_vol&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now use it:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker container exec -it container_and_vol sh

echo &quot;Hello&quot; &amp;gt; /vol/file1
ls -l /vol
cat /vol/file1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Delete the container:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;docker container rm container_and_vol -f&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The volume still exists:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;$ docker volume ls
DRIVER    VOLUME NAME
local     als_vol&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;On a Linux system you can see the Docker volume like this:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;$ ls -l /var/lib/docker/volumes/als_vol/_data&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;TODO: On macOS you need to do something like this, but in January, 2022 this doesn’t work as-is:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
ls -l /var/lib/docker&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;NOTE: For this section I followed the example in the excellent book, &lt;a href=&quot;https://amzn.to/334KywO&quot;&gt;Docker Deep Dive&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;toc_12&quot;&gt;Dockerfile commands/arguments&lt;/h2&gt;

&lt;p&gt;This is a list of commands you can use in a Docker &lt;code&gt;Dockerfile&lt;/code&gt;:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;#             Comments begin with &#039;#&#039;

ADD           Copy new files, directories, or remote file URLs from into the filesystem of the container

CMD           Allowed only once; if given multiple times, only the last one takes effect.
              The intended command for the image.
              Doesn’t do anything during &#039;build&#039; time.

COPY          Copy files or directories from a source into the filesystem of the container
              COPY readme.txt /home/al

ENTRYPOINT    TODO: A container that will run as an executable? Or, the primary command of your Docker image?

ENV           Set environment variables.
              ENV CONF_FILE=application.conf HEAP_SIZE=2G

EXPOSE        Tells the container runtime that the container listens on these network ports at runtime
              EXPOSE 5150
              EXPOSE 5150 5151

FROM          Sets the base image (ubuntu, openjdk:11, alpine, etc.)

LABEL         Adds metadata (a non-executable instruction)

MAINTAINER    Sets the author field of the generated images

RUN           Execute commands in a new layer on top of the current image and commit the results.
              Runs during &#039;build&#039; time.
              Strongly consider using &#039;&amp;amp;&amp;amp;&#039;: RUN apt-get update &amp;amp;&amp;amp; update apt-get install –y php

USER          Sets the username or UID to use when running the image and commands
              USER alvin

VOLUME        Creates a mount point (path) to external volumes (on the native host or other containers)

WORKDIR       Sets the working directory for any subsequent RUN, CMD, ENTRYPOINT, COPY, and ADD commands.
              If it’s a relative path, it’s relative to the previous WORKDIR.
              WORKDIR /home/alvin
              WORKDIR foo           # results in &quot;/home/alvin/foo&quot;

# NOTE: I haven’t used these yet:
ARG           Defines a variable that users can pass at build-time to the builder  using --build-arg
ONBUILD       Adds an instruction to be executed later, when the image is used as the base for another build
STOPSIGNAL    Sets the system call signal that will be sent to the container to exit&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Here’s an interesting &lt;code&gt;Dockerfile&lt;/code&gt; example from &lt;a href=&quot;https://amzn.to/34uro4f&quot;&gt;Accelerating Development Velocity with Docker&lt;/a&gt;:&lt;/p&gt;

&lt;div&gt;
&lt;pre&gt;
&lt;code class=&quot;language-none&quot;&gt;CMD         &quot;Hello, world!&quot;
ENTRYPOINT  echo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The initial definitions in that list came from this PDF: https://design.jboss.org/redhatdeveloper/marketing/docker_cheatsheet/cheatsheet/images/docker_cheatsheet_r3v2.pdf&lt;/p&gt;

&lt;p&gt;I also added to them based on my own knowledge, and these books:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;a href=&quot;https://amzn.to/334KywO&quot;&gt;Docker Deep Dive&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;https://amzn.to/34uro4f&quot;&gt;Accelerating Development Velocity with Docker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2 id=&quot;toc_13&quot;&gt;Docker on macOS&lt;/h2&gt;

&lt;p&gt;This section is TODO/TBD.&lt;/p&gt;

&lt;p&gt;Where are Docker images on macOS?&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;used to be here: &lt;span class=&quot;filename&quot;&gt;/Users/al/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reporting live from Louisville, Kentucky today,&lt;br/&gt;Alvin Alexander&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 06 Jan 2022 21:10:33 +0000</pubDate>
 <dc:creator>alvin</dc:creator>
 <guid isPermaLink="false">212 at https://www.fptracker.com</guid>
</item>
</channel>
</rss>
