Episode 642

Javier Lozano on Virtual Conferences

Ten years ago, Javier Lozano started .NET Conf - an online conference to educate people about Microsoft products. Javier discusses the challenges in creating this and other online tech events.

Links:
https://obsproject.com/
https://streamyard.com/


December 2020 Gratitudes

Comments [0]

1/3
Today I am grateful to charitable organizations that find uses for my excess stuff.

1/2
Today I am grateful
-to watch football yesterday with my sons
-to have my son Nick visit here for the week

1/1
Today I am grateful for the possibilities that a new year brings.

12/31
Today I am grateful to catch up with Ondrej and Hattan this week.

12/30
Today I am grateful
-to wake up to a blanket of snow over the city
-to watch Premier League Soccer with my sons yesterday.

12/29
Today I am grateful that my son is visiting me this week.

12/28
Today I am grateful for a second pair of eyeglasses - ideal for reading my computer screen.

12/27
Today I am grateful for a second pair of eyeglasses - ideal for reading my computer screen.

12/26
Today I am grateful for a virtual Christmas celebration with my family yesterday.

12/25
Today I am grateful that God loved us enough to send us his only son.

12/24
Today I am grateful:
-to return to the dentist for the first time in over a year
-for an unseasonably warm day yesterday and hours spent outside

12/23
Today I am grateful to hang out virtually last night with Lee, Matthew, and Serene.

12/22
Today I am grateful to exchange emails with old friends this week.

12/21
Today I am grateful for "Fargo"

12/19
Today I am grateful for my safe deposit box, which is now holding my Will and Power of Attorney.

12/18
Today I am grateful to hang out virtually with Mike this morning.

12/17
Today I am grateful to have my towel rack and toilet handle repaired.

12/16
Today I am grateful:
-for a portrait from David
-to my son who drove over to fix my TV last night
-to start my vacation

12/15
Today I am grateful for Doctor Who

12/14
Today I am grateful for my son's first day working at Microsoft.

12/13
Today I am grateful to drive around Lincolnwood last night with friends looking at holiday light displays.

12/12
Today I am grateful for spellcheckers

12/11
Today I am grateful for surprisingly mild weather yesterday.

12/10
Today I am grateful to fix the switch that toggles water flow between shower and bath, so it no longer sends half the water to each.

12/9
Today I am grateful to my friend Jerry, who shares the knowledge whenever he learns a new word.

12/8
Today I am grateful that my brother is back with his family after months in the US and weeks quarantining in Australia.

12/7
Today I am grateful for a walk around my neighborhood with my son before he drove home yesterday.


Liane Moriarty's 2014 novel Big Little Lies is about secrets in a small town. The story focuses on three friends in Pirriwee - a beach town north of Sydney, Australia.

Single mother Jane arrives in Pirriwee with her 5-year-old son Ziggy. At Ziggy's kindergarten, he is accused of choking one of his female classmates. Rumors about Ziggy continue throughout the school year and some of the Kindergarten parents pressure the school to remove the boy. The Parents take sides in this battle. Two mothers - Madeline and Celeste - befriend Jane and ally themselves with her.

At the novel's beginning, the reader learns that a murder will be committed. This murder is referenced throughout the story, but we must wait until the end to learn who is involved and why.

Moriarty slowly and masterfully peels away layers of her characters to reveal their flaws and the secrets they are hiding.

Madeline is jealous of the affection her daughter Abigail shows to her ex-husband and his new wife Bonnie. Abigail initiates a fundraising campaign that shocks her parents and stepparents.

Celeste is a beautiful woman with two beautiful twins. Her rich, handsome husband Perry is charming and generous; but he flies into a range every few months and beats his wife. Even her closest friends don't suspect the tragedy of her marriage.

And Jane is hiding a dark secret about Ziggy's father.

On one level, the book is a humorous tale of catty, desperate housewives in a suburban community. But Moriarty takes it far beyond that. It is a story of strong women trying to survive against real problems. It is filled with victim blaming, including self-blame by the victims themselves. It shines a light on spousal abuse, bullying, sexual assault, and gossip.

I enjoyed it to the end.


Episode 641

Ed Charbeneau on Blazor Testing

Microsoft Blazor presents some challenges for those creating automated tests. Ed Charbeneau describes ways to address these challenges and some tools to help you create unit tests and functional tests.

Links:
http://blogs.telerik.com
https://youtu.be/WdB723tIWg0
https://twitter.com/edcharbeneau
https://twitch.tv/codeitlive
https://www.twitch.tv/edcharbeneau


Frank Herbert's 1965 novel Dune remains a classic more than a half century after its release.

Dune The Graphic Novel Book 1 shows how hard it is to adapt this great novel visually. David Lynch failed miserably with his 1984 movie and the Syfy Channel had slight success with 2000 mini-series.

Herbert's son Brian Herbert teams with author Kevin J. Anderson to write the text for this adaptation and they do a good job. The pair have made their reputation with a series of respectable novels set in the Dune universe. They are assisted by artist Raul Allen and letterer Patricia Martin.

The graphic novel is good; The storytelling is faithful to the original; the art is attractive; the lettering is good (although I had an issue with some unnecessary low-contrast text on backgrounds), so overall I liked this graphic novel. The main issue comes with the lack of subtlety. While the elder Herbert infused his story with multiple layer and secreted hidden meanings within each line of dialogue, this story is much more straightforward. As such, it lacks the subtlety that made the original so great.

This graphic novel is good to read after finishing the Dune book. The novel can be intimidating, and it is easy to miss things the first time around. This comic helps to clarify them. But do yourself a favour and do not start with the graphic novel. You will miss the excitement of discovering the story layers as they are slowly unfolded within Frank Herbert's original prose.


Episode 640

David Neal on Hand Drawn Illustrations for Powerful Storytelling

David Neal is a technical presenter who often gives inspirational talks. A few years ago, he began adding his own artwork to his slides. He talks about his approach and how it has affected the stories he tells.

Links:
https://twitter.com/reverentgeek
https://www.instagram.com/reverentgeek/
https://reverentgeek.com/
david@reverentgeek.com


The Founding Fathers of the United States hold a special place in my country's history. Centuries after they lived, people still speak with reverence of men like Benjamin Franklin, Thomas Jefferson, James Madison, and Alexander Hamilton. Yet one man of this era stands above even these giants. George Washington cemented his place in history by leading the American army that defeated the British in the Revolution War; then, serving as the first President of the United States.

Ron Chernow's biography Washington: A Life details the General/President's rise and how handled the power he was given.

Washington was born into an upper-middle class family; but rose to become one of the landed gentry by a series of fortuitous events: his widowed mother married a wealthy farmer and George inherited the large estate at Mount Vernon by outliving all other possible heirs; then, George married wealthy widow Martha Custis.

When the American Revolution began, Washington led a poorly-equipped, ill-trained army to victory over one of the great powers in the world. He did so despite infighting among his officers and the young country's lawmakers.

After the war, Washington was the most popular man in America and the logical choice to serve as its first leader. He won the Presidency unanimously and served two terms despite his desire to return to his Virginia estate and manage the farms there.

In his first term, George Washington attempted to unite the factions of the young country - surrounding himself with people of varying opinions. His cabinet and advisors included Northerners and southerners; slaveholders and abolitionists; those who favored a centralized government and those suspicious of concentrated power. Fierce debates arose as to whether the US should align itself more closely with England or France - two countries at war with one another. By his second term, Washington had tired of the infighting among his advisors and those that criticized him publicly. Quarrels between Jefferson, Adams, Hamilton, and Madison left him weary and disillusioned, so he retained a more homogeneous cabinet for his final four years in office.

As with Chernow's earlier biography of Alexander Hamilton, "Washington: A Life" goes beyond the historical facts and gives the reader a taste for Washington's character and personality. Washington was arrogant, stoic, and aloof; he was not given to long speeches, but he was eloquent in his writing; he rejected the idea of a British-style monarchy for America and was hurt that some thought he had ambitions of becoming king; he desperately wanted to leave public life and return to managing Mount Vernon (during the War, he corresponded frequently with the managers of his estate); he was unwavering in his honesty and integrity; he was highly conscious of his public image; he enjoyed the luxuries that came with wealth; he had a difficult relationship with his overly-demanding mother.

In this book, we see a complex man, who held together a nation during arguably its most vulnerable time. Few people had the universal respect to pull off this miracle.

Washington had a strong sense of duty that drove him to server in public office, despite his cash flow problems, which could have been better addressed by staying home and managing his estate. Ultimately, he was the unifying force that the young republic needed. His actions strengthened the central government and the country and defined the office of presidency.

But Washington had his faults.

As a general, he was not a great strategist - he lost more battles than he won - but held together a ragtag, underfunded army for years until the British forces committed a blunder he could exploit.

The most controversial aspect of Washington's life is his status as a slave owner. : or note that he appeared to treat his slaves better than his peers (Washington forbade beatings and refused to separate families).

Arguably the most conflicted aspect Washington was his dealings with slavery and Chernow covers this topic considerably. Washington and his wife owned hundreds of slaves and made almost no public effort to promote abolition. Yet he spoke privately of his desire to end slavery and thought the practice would eventually die out on its own. He showed less cruelty to his slaves than most other Virginia farmers, establishing rules against physical beatings and separating families; but he sometimes broke these rules when he felt it was necessary. One can take into account that nearly every wealthy Virginia landowner owned slaves and one can note that he freed his slaves in his will. But he remained publicly silent on the political hot topic, despite being in a position of great influence. Washington's position on slavery evolved throughout his lifetime, but he seems to have never fully grasped the inhumanity and cruelty inherent in one human being owning another

These are the kinds of things that Chernow presents to the reader to show the humanity and complexity of or first President. He praises Washington's achievements, while stripping away his legendary status, showing him as a great, but flawed human, not a demi-god or saint

If you are looking for a comprehensive biography of one of the most influential men in American history - a book that covers his entire life, this one is for you.


Episode 639

Kyle Bunting and Joel Hulen on Data Engineering in Azure

Kyle Bunting and Joel Hulen of Solliance describe Data Engineering and some of tools, such as Azure Synapse Analytics, that allow you to perform Data Engineering at scale in the cloud.

Links:

https://www.solliance.net/


"Dune" by Frank Herbert

Comments [0]

The galactic Emperor had a hidden agenda when he ordered House Atreides to move to the Arrakis, replacing House Harkonnen as the planet's ruling family. Arrakis is a desolate wasteland covered almost entirely in desert, earning it the nickname "Dune"; but Arrakis is the only source of the spice melange - the most valuable substance in the universe.

Duke Leto Atreides's teenage son Paul is beginning to manifest mystical powers that will aid him in the coming battles and betrayals and in his fight for survival on a hostile planet.

Frank Herbert's classic novel Dune is the most complex science fiction novel I have read. In addition to an adventure story and a coming-of-age novel, the book includes insights into politics, sociology, ecology, economics, religion, philosophy, and language. Nearly every dialogue is layered with multiple meanings and nearly every action is a potential betrayal.

Herbert does an amazing job building the world of Arrakis and its people.

Among the creations of the book are:

-Sand Worms - giant tubular creatures that live beneath the surface of the desert sand, as sea dragons might swim in the ocean, breaching the surface from time to time to wreak havoc on protection of the spice.

  • The Bene Gesserit - a cultlike group with impressive mental powers, who strive to produce a superhuman via their secret breeding program.
  • The Fremen - a mysterious nomadic race that live in the deserts of Dune and have a special relationship with the sand worms.
  • Mentats - humans with the ability to think like computers

Although Dune is set centuries in the future, technology has not advanced at the rate one would expect. Advancements have been stunted by humanity's distrust of artificial intelligence and a war fought centuries earlier. Things like interplanetary travel have been made possible by the powers of the Bene Gesserit and the Mentats and the mind-expanding abilities of melange.

The local water scarcity, the global spice monopoly, and the struggle for control between powerful factions serve as a metaphor for similar constrained resources and conflicts on the Earth of today and the effect on global politics. The vast sand oceans and the Fremen people are not far removed from the 20th and 21st century Middle East.

Through it all is Paul - son of a Duke and gifted with great powers that lead others to perceive him as a Messiah. How he uses those powers defines him and defines the power structure of the galaxy.

This was my third reading of this novel, which I first discovered in my late 20s. After all these years, it still holds my interest.


Episode 638

Emily Cooper on the ISTI STEM Challenge

The Illinois Science & Technology Institute (ISTI) organizes a STEM Challenge that allows high school students to work on real-world problems with industry mentors.

Emily Cooper talks about this program, its goals, and the organization.


November 2020 Gratitudes

Comments [0]

12/6
Today I am grateful for a warm home on cold days.

12/5
Today I am grateful to my building's maintenance staff which fixed a bunch of things in my condo yesterday.

12/4
Today I am grateful for a visit from my son Nick.

12/3
Today I am grateful for online shopping

12/2
Today I am grateful for my son's new job.

12/1
Today I am grateful for new tires on my car.

11/30
Today I am grateful to get my bicycle's gears repaired.

11/29
Today I am grateful for a Spartan trifecta yesterday: Michigan State victories in football, basketball, and ice hockey!

11/28
Today I am grateful to those who express appreciation.

11/27
Today I am grateful to celebrate virtual Thanksgiving with family yesterday.

11/26
Today I am grateful to receive phone calls from people I care about.

11/25
Today I am grateful to successfully complete work on a project on which we have been working for months.

11/24
Today I am grateful to awaken to a gently falling snow.

11/23
Today I am grateful for movies and TV on-demand.

11/22
Today I am grateful for unseasonably warm late November Chicago weather.

11/21
Today I am grateful for dinner at The Publican with Tim last night.

11/20
Today I am grateful for my new (to me) Herman Miller Aeron chair.

11/19
Today I am grateful for a negative COVID-19 test.

11/18
Today I am grateful for a hot bath.

11/17
Today I am grateful that American Express quickly replaced my lost card.

11/16
Today I am grateful for my new AirPods.

11/15
Today I am grateful for
-a chance to explore the Natchez Trace yesterday
-an 8-day vacation with visits to Springfield, St. Louis, Memphis, and Nashville.


11/14
Today I am grateful to sit around a bonfire last night with Gaines and Mary.

11/13
Today I am grateful for:
-3 great days in Memphis
-live music last night at Printer's Alley in Nashville
-a bike ride yesterday around Richmond Creek

11/12
Today I am grateful for:
-my first visit to Mississippi
-a visit to the National Civil Rights Museum in Memphis yesterday

11/11
Today I am grateful for a bike ride along the Shelby Farms Greenline Trail in Memphis yesterday.

11/10
Today I am grateful for
-My first-ever visit to Arkansas
-Seeing live music last night on Beale Street
-Meeting Glenn Campbell's son and telling him how much I enjoyed his father's music.

11/9
Today I am grateful for:
-Brunch yesterday with Jeffrey and his family yesterday
-The hospitality and generosity of Kevin and Darlene this weekend.

11/8
Today I am grateful for the millions of Americans who voted against dishonesty, hate, and racism.

11/7
Today I am grateful for my new bike helmet.

11/6
Today I am grateful that John has returned with his puns to save us all.

11/5
Today I am grateful to attend non-work meetings yesterday with my co-workers as part of our annual OneWeek event.

11/4
Today I am grateful to learn a lot about web security yesterday.

11/3
Today I am grateful for the opportunity to vote.

11/2
Today I am grateful for my new bicycle phone mount.


A few years ago, I sat in a cafe in Bergen on the west coast of Norway, sipping a coffee and enjoying a small pastry. It was sweet and satisfying by itself; but I enjoyed it enough to order another; and then, another.

The stories within Neil Gaiman's Norse Mythology are like this. Each story is short and easily consumable (about 10-25 pages) and stands on its own; but together, they weave an epic of the gods of Scandinavia.

We hear the adventures of Odin, Thor, Loki, Balder, and the gods of Asgard, along with the giants, dwarves, creatures, and sentient rocks and plants that inhabit their universe. We hear of shape-shifting and battles, and treachery, and love. We learn about the families of the gods and their births and their deaths.

Gaiman has inserted pagan gods into his books in the past (American Gods and Anansi Boys) and even written entire books around Thor, Loki, and Odin (Odd and the Frost Giants), but those books extended the legends of the deities, while this book pulls from the original source material - the oral stories recounting the adventures of these immortals, from the beginning of the world to Ragnarok - the final battle of the gods.

He does so with a voice that suggests these tales are told around a campfire at night.

Some of these stories were long familiar to me from the reading of my youth and some of them I had not heard. But all seemed fresh as told by Gaiman.

We have always known that Neil Gaiman knows how to tell a story. But with Norse Mythology, he proves that he can tell someone else's story.


MinIO articles and videos

Comments [0]

Recently, I have been working with MinIO – a container-based object storage service. I’ve recorded much of what I’ve learned. The links below will get you up to speed if you want to learn about this technology.

Blog Posts

Getting Started with MinIO Server

Creating and using a MinIO Gateway for Azure

Using the MinIO Java SDK

Managing MinIO with the Amazon S3 SDK

Videos

Creating a MinIO Server

Creating a MinIO Agent for Azure Blob Storage

Using the MinIO Java Client SDK

Accessing MinIO with the AWS S3 SDK


Intro

In my last article, I showed how to manage buckets and objects in MinIO using the MinIO Java SDK.

However, MinIO has the advantage that one can also access it using the Amazon S3 Java API. This is helpful if you are migrating from S3 (a comparable object store hosted by Amazon Web Services) to MinIO.

The code below assumes that the following values are declared and initialized appropriately:

private String endPoint;  // The MinIO endpoint (e.g., "http://127.0.0.1:9000") 
private String accessKey; // The MinIO Access Key 
private String secretKey; // The MinIO Secret Key 
private String bucketName; // A MinIO bucket in which to store objects (e.g., "mybucket") 
private String localFileFolder; // A local folder on your file system to upload/download files to/from MinIO (e.g., "c:\files\")
  

In order to use the S3 SDK, your app must have a reference to it. In a Maven project, this is done by adding the following to the section of the project's POM.XML:


    com.amazonaws
    aws-java-sdk-s3
    1.11.858

  

AmazonS3 Object

In your code, the first thing you will need is an AmazonS3 object, which has methods for managing your MinIO objects.

Here is the code for creating this object.

public static AmazonS3 getAmazonS3Client(String accessKey, String secretKey, String endPoint) { 
    ClientConfiguration clientConfig = new ClientConfiguration(); 
    clientConfig.setProtocol(Protocol.HTTP); 
    AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); 
    AmazonS3 s3client = AmazonS3ClientBuilder 
            .standard() 
            .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, Regions.US_EAST_1.name())) 
            .withPathStyleAccessEnabled(true) 
            .withClientConfiguration(clientConfig) 
             .withCredentials(new AWSStaticCredentialsProvider(credentials)) 
            .build();

    return s3client; 
}
  

Once you have an AmazonS3 object, you can use it to manage MinIO objects.

Uploading a File

For example, here is code to upload a file to a MinIO bucket:

public void UploadWithS3Client(String fileName) throws IOException { 
     AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint); 
    String fileToUpload = localFileFolder + fileName; 
     try { 
        File file = new File(fileToUpload); 
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file); 
        s3Client.putObject(putObjectRequest); 
    } catch (AmazonServiceException ase) { 
        System.out.println("Error Message:    " + ase.getMessage());

    } catch (AmazonClientException ace) { 
        System.out.println("Error Message: " + ace.getMessage()); 
    } 
}
  

List Objects

and code to get a list all the objects in a bucket

public List<String> ListS3Objects() { 
     List<String> blobList = new ArrayList<String>(); 
    System.out.format("Objects in S3 bucket %s:\n", bucketName); 
    AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint); 
     ListObjectsV2Result result = s3Client.listObjectsV2(bucketName); 
    List<S3ObjectSummary> blobs = result.getObjectSummaries(); 
    for (S3ObjectSummary blob : blobs) { 
        blobList.add(blob.getKey()); 
        System.out.println("* " + blob.getKey()); 
    } 
    return blobList; 
 }
  

Download a File

and to download one of those objects to your local file system:

public void DownloadFromMinIOWithS3Client(String objectName) { 
    System.out.format("Downloading %s from S3 bucket %s...\n", objectName, bucketName); 
    AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint); 
    try { 
        S3Object o = s3Client.getObject(bucketName, objectName); 
        S3ObjectInputStream s3is = o.getObjectContent(); 
        String downloadedFile = localFileFolder + "D_" + objectName; 
        FileOutputStream fos = new FileOutputStream(new File(downloadedFile)); 
        byte[] read_buf = new byte[1024]; 
        int read_len = 0; 
        while ((read_len = s3is.read(read_buf)) > 0) { 
            fos.write(read_buf, 0, read_len); 
        } 
        s3is.close(); 
        fos.close(); 
    } catch (AmazonServiceException e) { 
        System.err.println(e.getErrorMessage()); 
        System.exit(1); 
    } catch (FileNotFoundException e) { 
        System.err.println(e.getMessage()); 
         System.exit(1); 
    } catch (IOException e) { 
        System.err.println(e.getMessage()); 
        System.exit(1); 
        } 
    }
  

As you can see, once you have a reference to the object, the rest is just Java IO code.

Print File Contents

Finally, here is code to print the contents of a text object stored in MinIO. Again, it is simple Java IO once you have a reference to the object.

    public void PrintObjectContents(String objectName) throws IOException {
        AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint);
        GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, objectName);
        S3Object objectPortion = s3Client.getObject(rangeObjectRequest);
        System.out.println("Printing bytes retrieved:");
        displayTextInputStream(objectPortion.getObjectContent());
    }

    private static void displayTextInputStream(InputStream input) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;

            System.out.println("    " + line);
        }
        System.out.println();
    }
  

Conclusion

Here is the full code that you can find at https://github.com/DavidGiard/MinIO_Java_Demo:

package com.gcast.gcastminio.services;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

import com.amazonaws.AmazonClientException;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.GetObjectRequest;
import com.amazonaws.services.s3.model.ListObjectsV2Result;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import com.amazonaws.services.s3.model.S3ObjectSummary;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Service
public class S3Service {

    // The following are set in application.properties
    @Value("${minio.endPoint}")
    private String endPoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Value("${localFileFolder}")
    private String localFileFolder;

    public void UploadWithS3Client(String fileName) throws IOException {
        AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint);
        String fileToUpload = localFileFolder + fileName;
        try {
            File file = new File(fileToUpload);

            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file);
            s3Client.putObject(putObjectRequest);
        } catch (AmazonServiceException ase) {
            System.out.println("Error Message:    " + ase.getMessage());

        } catch (AmazonClientException ace) {
            System.out.println("Error Message: " + ace.getMessage());
        }
    }

    public List<String> ListS3Objects() {
        List<String> blobList = new ArrayList<String>();
        System.out.format("Objects in S3 bucket %s:\n", bucketName);
        AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint);
        ListObjectsV2Result result = s3Client.listObjectsV2(bucketName);
        List<S3ObjectSummary> blobs = result.getObjectSummaries();
        for (S3ObjectSummary blob : blobs) {
            blobList.add(blob.getKey());
            System.out.println("* " + blob.getKey());
        }
        return blobList;
    }

    public void PrintObjectContents(String objectName) throws IOException {
        AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint);
        GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, objectName);
        S3Object objectPortion = s3Client.getObject(rangeObjectRequest);
        System.out.println("Printing bytes retrieved:");
        displayTextInputStream(objectPortion.getObjectContent());
    }

    private static void displayTextInputStream(InputStream input) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        while (true) {
            String line = reader.readLine();
            if (line == null)
                break;

            System.out.println("    " + line);
        }
        System.out.println();
    }

	public void DownloadFromMinIOWithS3Client(String objectName) {
		System.out.format("Downloading %s from S3 bucket %s...\n", objectName, bucketName);
		AmazonS3 s3Client = getAmazonS3Client(accessKey, secretKey, endPoint);
		try {
			S3Object o = s3Client.getObject(bucketName, objectName);
			S3ObjectInputStream s3is = o.getObjectContent();
			String downloadedFile = localFileFolder + "D_" + objectName;
			FileOutputStream fos = new FileOutputStream(new File(downloadedFile));
			byte[] read_buf = new byte[1024];
			int read_len = 0;
			while ((read_len = s3is.read(read_buf)) > 0) {
				fos.write(read_buf, 0, read_len);
			}
			s3is.close();
			fos.close();
		} catch (AmazonServiceException e) {
			System.err.println(e.getErrorMessage());
			System.exit(1);
		} catch (FileNotFoundException e) {
			System.err.println(e.getMessage());
			System.exit(1);
		} catch (IOException e) {
			System.err.println(e.getMessage());
			System.exit(1);
			}
		}


    public static AmazonS3 getAmazonS3Client(String accessKey, String secretKey, String endPoint) {
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        AmazonS3 s3client = AmazonS3ClientBuilder
                .standard()
                .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, Regions.US_EAST_1.name()))
                .withPathStyleAccessEnabled(true)
                .withClientConfiguration(clientConfig)
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .build();

        return s3client;
	}
}
  

In this article, you learned how to use the Amazon S3 Java SDK to manage objects in MinIO.


Gaines Kergosien on ADHD

Comments [0]

Episode 637

Gaines Kergosien on ADHD

Gaines Kergosien discusses ways to identify and cope with the challenges of ADHD.

Links:

https://add.org/
http://blog.kergosien.net/
https://speakerdeck.com/gaines/succeeding-with-adhd


Each of the novels in Madeleine L'Engle's Time Quintet contains allusions to religion, often including angelic and demonic beings that battle in a struggle of good versus evil; but, Many Waters" - her fourth book in this series (third chronologically) - takes it a step farther. Here, L'Engle explicitly introduces angels and fallen angels and even the Old Testament prophet Noah and his family.

Throughout the series, Dennys and Sandy have been the forgotten siblings of the remarkable Murry family. These twins mostly stood in the background while older sister Meg and Charles Wallace went on adventures to save the universe.

But, in Many Waters, the twins take the stage. After playing with one of their father's laboratory experiments, they find themselves thrust backward in time to encounter Noah and his family prior to the Great Flood. The boys find themselves in the middle of a struggle between Noah's family and others. Angels, fallen angels, and magical creatures play a part in the battle. The story is complicated when Noah receives instructions from God to begin building his ark in preparation for the coming flood.

It was fun to see some minor characters emphasized; and it was fun to read an adventure story with familiar characters. Madeleine L'Engle has made me care about the Murry family.


Using the MinIO Java SDK

Comments [0]

Intro

In previous articles, I showed how to configure a MinIO Server and a MinIO Gateway for Azure.

In those articles, I demonstrated how to manage objects using the MinIO user interface.

In this article, I will show how to use the MinIO Java API to manage MinIO objects.

In order to use the MinIO API, you will need to set a dependency in your project. In a Maven project, this is done by adding the following to the section of the project's POM.XML:


  io.minio
  minio
  7.1.2

  

The code below assumes that the following values are declared and initialized appropriately:

private String endPoint;        // The MinIO endpoint (e.g., "http://127.0.0.1:9000")
private String accessKey;       // The MinIO Access Key
private String secretKey;       // The MinIO Secret Key
private String bucketName;    // A MinIO bucket in which to store objects (e.g., "mybucket")
private String localFileFolder; // A local folder on your file system to upload/download files to/from MinIO (e.g., "c:\files\")

You will also need to import namespaces from the subnamespaces of min.io. Your IDE will help you identify variables that require these namespaces.   

The MinIOClient object

In your code, you will need a MinioClient object to work with MinIO. A builder helps with this.

MinioClient minioClient = MinioClient.builder().endpoint(endPoint).credentials(accessKey, secretKey).build();
  

Buckets

Below is the code to check if a bucket already exists and create it if it does not

boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); 
if (!bucketExists) { 
    minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); 
}
  

Notice the arguments passed to bucketExists. These arguments are creased with a builder (BucketExistsArgs.builder().bucket(bucketName).build()). The arguments for makeBucket use a similar pattern. We will see this pattern in a lot of MinioClient methods.

Uploading a File

Here is the code to upload a file into a MinIO bucket.

String fileName = "file1.txt"; // This file must exist in the local file folder 
String fileToUpload = localFileFolder + fileName; 
UploadObjectArgs args = UploadObjectArgs.builder().bucket(bucketName).object(fileName).filename(fileToUpload).build(); 
minioClient.uploadObject(args);
  

Downloading a File

Here is the code to download an object to a file on your local drive:

String fileName = "file1.txt"; // This file must exist in the MinIO bucket 
String downloadedFile = localFileFolder + "D_" + fileName; 
DownloadObjectArgs args = DownloadObjectArgs.builder().bucket(bucketName).object(fileName) 
        .filename(downloadedFile).build(); 
minioClient.downloadObject(args);
  

Conclusion

The full listing of a class to read and write to MinIO is shown in Listing 1

Listing 1:

package com.gcast.gcastminio.services;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import io.minio.BucketExistsArgs;
import io.minio.DownloadObjectArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.UploadObjectArgs;
import io.minio.errors.MinioException;

@Service
public class MinIOService {

    // The following are set in application.properties
    @Value("${minio.endPoint}")
    private String endPoint;
    @Value("${minio.accessKey}")
    private String accessKey;
    @Value("${minio.secretKey}")
    private String secretKey;
    @Value("${minio.bucketName}")
    private String bucketName;
    @Value("${localFileFolder}")
    private String localFileFolder;

    public void WriteToMinIO(String fileName)
            throws InvalidKeyException, IllegalArgumentException, NoSuchAlgorithmException, IOException {
        try {
            MinioClient minioClient = MinioClient.builder().endpoint(endPoint)
                    .credentials(accessKey, secretKey).build();

            boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
            if (!bucketExists) {
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
            }

            String fileToUpload = localFileFolder + fileName;
            UploadObjectArgs args = UploadObjectArgs.builder().bucket(bucketName).object(fileName)
                    .filename(fileToUpload).build();
            minioClient.uploadObject(args);

            System.out.println(fileToUpload + " successfully uploaded to:");
            System.out.println("   container: " + bucketName);
            System.out.println("   blob: " + fileName);
            System.out.println();
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }

    public void ReadFromMinIO(String fileName)
            throws InvalidKeyException, IllegalArgumentException, NoSuchAlgorithmException, IOException {
        try {
            MinioClient minioClient = MinioClient.builder().endpoint(endPoint)
                    .credentials(accessKey, secretKey).build();
            String downloadedFile = localFileFolder + "D_" + fileName;
            DownloadObjectArgs args = DownloadObjectArgs.builder().bucket(bucketName).object(fileName)
                    .filename(downloadedFile).build();
            minioClient.downloadObject(args);

            System.out.println("Downloaded file to ");
            System.out.println(" " + downloadedFile);
            System.out.println();
        } catch (MinioException e) {
            System.out.println("Error occurred: " + e);
        }
    }
    
}
  

You can download and run  this code from https://github.com/DavidGiard/MinIO_Java_Demo

The code is the same whether you are running a MinIO Server or MinIO Gateway.

In this article, you learned how to use the MinIO Java SDK to read and write objects stored in MinIO.


What is MinIO?


MinIO is an object storage system, similar to Amazon S3 or Azure Blob storage. It is built on top of Docker containers, which makes it easy to scale.

In a previous article, I showed you how to create and use a MinIO Server.

In this article, I will show how to create and use a MinIO Gateway for Azure Blob Storage.

MinIO Gateway

A MinIO Server stores files and objects. By contrast, a MinIO points to some other storage repository where the files are stored. However, it allows you to interact with those files as if they were stored in MinIO.

Prerequisites

Before you begin, you will need to install Docker Desktop, which you can download for either Windows or Mac.

You will also need an Azure Storage Account. This article explains how to create an Azure Storage Account.

Azure Blob Storage

You will need two pieces of information from your Azure Storage Account: the name of the storage account and the access key.

In the Azure Portal (https://portal.azure.com), you can find the storage account name at the top of the Resource page, as shown in Fig. 1.

mga01-StorageAccountName
Fig. 1

You can find the key on the "Access Keys" blade, as shown in Fig. 2.

mga02-StorageAccountKeys
Fig. 2

Note that there are two keys. Either one will work. Click the [Show Keys] button to view the keys and allow copying to your clipboard.

Creating a MinIO Gateway

A MinIO Gateway for Azure is created with the following command:

docker run -p 9000:9000 --name azure-s3 -e "MINIO_ACCESS_KEY=azurestorageaccountname" -e "MINIO_SECRET_KEY=azurestorageaccountkey" minio/minio gateway azure

where

azurestorageaccountname is the name of the Azure storage account and azurestorageaccountkey is an account key from that same storage account.

You can now log into the MinIO Gateway by opening a browser and navigating to http://127.0.0.1:9000/.

When prompted for your login credentials (Fig. 3), enter the storage account name in the "Access key" field and enter the storage account key in the "Secret Key" field.

mga03-Login
Fig. 3

After a successful login, the MinIO Gateway user interface will display, as shown in Fig. 4.

mga04-MinIO

Fig. 4

Note that this looks exactly like the MinIO Server user interface, described in this article.

In fact, you can create buckets and manage files in a MinIO Gateway exactly as you would in a MinIO server. The only difference is that the objects you manipulate are stored in the corresponding Azure Blob storage, rather than in MinIO. Each bucket is mapped to a Blob Storage container and each file is mapped to a blob.

Conclusion

In this article, you learned how to create a MinIO Gateway for Azure.


Episode 636

Omkar Naik on Microsoft Cloud for Health Care

Microsoft Cloud Solution Architect Omkar Naik describes what Microsoft is doing for health care solutions with Azure, Dynamics, Office 365, and other tools and services.

Links:
http://aka.ms/smarterhealth
http://aka.ms/microsoftcloudforhealthcare
http://aka.ms/azure


In "Wayne's World 2", Mike Meyers as the title character says of Peter Frampton's "Frampton Comes Alive" album: "If you lived in the suburbs you were issued it. It came in the mail with samples of Tide".

He is not far from the truth. I was 14 years old in 1976 when my sister won this album by calling into a radio station and we played the heck out of it. Peter Frampton was only 26 years old at the time and that record went on to become the biggest selling album of all time!

To say that Peter Frampton peaked at a young age is to understate the obvious. At 12, he was performing publicly; At 14, he was in a band managed by Bill Wyman of the Rolling Stones; at 16, he was in a band that was getting radio airplay in his native England; at 18, he joined the seminal band Humble Pay; at 21, he began his solo career; and at 26 he recorded his iconic "Comes Alive" album. Along the way, he was invited to play guitar with many of the best rock artists of the day. And as a teenager, he befriended major stars like Wyman, David Bowie, and Pete Townsend.

Through this period, Peter managed to keep his focus and avoid the common pitfalls of sex, drugs, and alcohol that tempt so many rock stars. Until, that is, the extreme fame that came with "Frampton Comes Alive" and the pressure to maintain that pinnacle. It was during this time, that he developed a drug addiction and his career waned - both commercially and artistically.

Yet, Frampton recovered and - although he never matched the commercial success of his mid-20s - he was able to write and perform some excellent music in later years - including winning a Grammy for his 2006 "Fingerprints" album.

Later in his career, Frampton siezed the opportunity to focus on his guitar work and was able to work with many of the best musicians of his time. This continued until a degenerative muscle disorder forced him to announce his final tour and retirement.

Peter Frampton's memoir Do You Feel Like I Do? recounts this meteoric rise, followed by a fall, followed by a recovery.

In between, he talks about his personal life and his relationships.

It does so in a relaxed and enjoyable way. The book's conversational tone makes it clear that Frampton was telling the story to writer Alan Light, rather than writing it himself. But it is light and enjoyable, and Peter comes across a sincere person that one would love to share a cup of tea with. Or a concert. Which I did when I took my 24-year-old son to see him on his final tour 2 years ago.


What is MinIO?

MinIO is an object storage system, similar to Amazon S3 or Azure Blob storage. It is built on top of Docker containers, which makes it easy to scale.

Because MinIO runs in a Docker container, it requires the installation of Docker.

You can either install the Docker engine here or install Docker Desktop at one of the following links:

Starting a MinIO Server

Once Docker is installed, use the following command to start a MinIO server:

docker run -p 9000:9000 -e "MINIO_ACCESS_KEY=myAccessKey" -e "MINIO_SECRET_KEY=mySecretKey" minio/minio server /data

You can replace myAccessKey and mySecretKey with just about any string you like. These will be used to log into the MinIO server. Write down these values and keep them in a safe place! You will need them in order to access your server.

After you run the above command, you can access the server's UI by opening a web browser and navigating to

http://127.0.0.1:9000/

(NOTE: Of course, you may choose to run your server on a different port than 9000. If so, modify the “Docker” command above.)

You will be prompted to log in, as shown in Fig. 1

mio01Login
Fig. 1

Enter the access key and secret key you selected in the Docker command above.

After successfully logging in, you will see the MinIO user interface, as shown in Fig. 2.

mio02-MinIOServer
Fig. 2

MinIO organizes objects into buckets, which are analogous to folders in a file system or containers in Azure blob storage. To create a new bucket, click the [+] icon (Fig. 3) in the lower right of the screen.

mio03-PlusButton
Fig. 3

A popup menu will display, as shown in Fig. 4.

mio04-Menu
Fig. 4

Click the [Create Bucket] icon (Fig. 5) to display the "New Bucket" dialog, as shown in Fig. 6.

mio05-CreateBucketIcon
Fig. 5

mio06-BucketName
Fig. 6

In the "New Bucket" dialog, enter a name for your bucket, as shown in Fig. 7. This name must be unique within this MinIO server, must be at least 3 characters long and may consist only of numbers, periods, hyphens, and lower-case letters. 

mio07-BucketName
Fig. 7

Press ENTER to create the bucket. The Bucket will now be listed along the left side, as shown in Fig. 8.

mio08-Bucket
Fig. 8

You can add files to this bucket by again clicking the lower-left [+] icon to display the popup menu shown in Fig. 9.

mio09-Menu
Fig. 9

Click the "Upload File" icon (Fig. 10) to open a File Selection dialog, as shown in Fig. 11.

mio10-UploadFile
Fig. 10

mio11-SelectFile
Fig. 11

Navigate to and select a file on your local drive and click the [Open] button. The file will be listed within the bucket, as shown in Fig. 12.

mio12-ListFiles
Fig. 12

You can click the […] at the right of the file listing row to expand a menu with options to share, preview, download, or delete the file from MinIO, as shown in Fig. 13

mio13-Menu
Fig. 13

In this article, I introduced MinIO Server and showed the basics of getting started and using this object storage tool.


Episode 635

Rik Hepworth on Azure Governance

Many of the issues around cloud computing have nothing to do with writing code. Asking questions early about expected costs, geographic issues, and technologies to choose can save headaches later.

Rik Hepworth describes this governance - the rules by which we operate the cloud - and how we can better prepare to develop for the cloud.

Links:

http://aka.ms/governancedocs
http://aka.ms/GovernanceDocs
https://github.com/Azure/azure-policy


Tennessee Rhapsody

Comments [0]

It was an 8-day vacation filled with museums and bike riding.

LincolnMuseum It began Saturday morning in Springfield, IL at the Abraham Lincoln Museum. Abe's Presidential Library across the street is closed - a victim of the current pandemic - but the library offered interesting exhibits about the life and times of our 16th President.

From Springfield, I drove to St. Louis, where we met my college friend Darlene, her husband Kevin, and their son Henry at Fitz's in University City. I love this place - mostly for their homemade root beer. Dar and Kevin were kind enough to let us stay at their B&B for 2 days. Sunday, we met my friend Jeff and his family for lunch and biked around Forest Park before watching a star show at the Planetarium at the St. Louis Science Center.

Monday, I drove to Memphis via Arkansas (it was my first time in Arkansas), and I stayed in Memphis until Thursday morning. A long bike ride on Tuesday left me exhausted and I drove around the area Wednesday morning, including a trip into Mississippi (it was my first time in Mississippi) for lunch; a walk by some of the city's mansions; a guided tour of Sun Studio; a drive past Graceland; and an afternoon at the National Civil Rights Museum. This museum was built in the Lorraine Hotel, where Dr. Martin Luther King, Jr. was assassinated in 1968.

BealeStreet I saw some very good live music each night I was in Memphis. The pandemic kept Beale Street more quiet than usual, but there were still some good venues with some good blues. Wednesday evening, we had a chance to see the famous ducks of the Peabody hotel. Each day at 5PM, this avian family is escorted to the hotel penthouse by a bellman in full uniform.

Heritage I drove to Nashville Thursday for some more bike riding and some more live music. Friday morning was a visit to Andrew Jackson's Heritage - the 7th President's plantation outside Nashville. I learned a lot about this complex man. Friday afternoon was spent walking around downtown Nashville and touring the Johnny Cash Museum. Friday evening, I visited my friends Gaines and Mary at their home south of Nashville, where we enjoyed some hot chicken by the bonfire in their backyard.

NatchezTrace Before heading home, we took a drive through the scenic Natchez Trace, stopping at a country café in Leipers Fork, TN for a breakfast of biscuits & gravy and grits.

It was a near-perfect vacation, despite a few setbacks that included a lost credit card and a flat tire on the way home.

I rode about 50 miles, visited 3 museums, saw many live bands, visited some old friends, ate lots of good southern food, gained 2 pounds, and had a great time!

The challenge now is to remain isolated and schedule a COVID test, since Tennessee is a state with a spiking Coronavirus count.

Links


Episode 634

Scott Hanselman on Productivity

Scott Hanselman gives advice on how to use your time both effiently and effectively and maintain high productivity.

Links:

https://www.hanselman.com/

https://hanselminutes.com/


Episode 633

Glenn Block on Racial Justice

For the past few years, Glenn Block has been studying social justice and making himself more aware and more active. Glenn discusses some of the issues faced by marginalized people and what we can do to address these issues.

Books:

Other Links:


October 2020 Gratitudes

Comments [0]

11/1
Today I am grateful for a Spartan football victory over um yesterday.

10/31
Today I am grateful to see Joanna Connor in concert last night in Evanston.

10/30
Today I am grateful for live music and good food at Kaiser Tiger last night.

10/29
Today I am grateful for food that is both healthy and tasty.

10/28
Today I am grateful for matching charitable donations by my employer.

10/27
Today I am grateful for my personal trainer.

10/26
Today I am grateful to see the "Monet in Chicago" exhibit at the Art Institute of Chicago yesterday.

10/25
Today I am grateful for email, text, and other communication tools on my phone that allow me to connect almost anywhere.

10/24
Today I am grateful for assistance from my teammates.

10/23
Today I am grateful to resolve an infrastructure issue yesterday that had prevented me from getting much work done this week.

10/22
Today I am grateful for a ride through Forest Glenn Woods last night.

10/21
Today I am grateful for honest people.

10/20
Today I am grateful for a negative COVID test.

10/19
Today I am grateful for my new Tiles and app to keep track of my wallet, keys, and phone.

10/18
Today I am grateful to attend a blues festival yesterday in Bronzeville.

10/17
Today I am grateful
-to vote yesterday
-for dinner with Tim at Frontera Grill last night

10/16
Today I am grateful for a diverse group of friends.

10/15
Today I am grateful for:
-the hospitality of Doug and Sherree this week
-a few hours working in East Lansing, MI yesterday afternoon.

10/14
Today I am grateful:
-to be Dylan's sponsor at his confirmation last night
-to visit Diane's new home for the first time
-for 7 years at Microsoft

10/13
Today I am grateful:
-to sort through old family photos with my siblings last night
-for a bike ride to Romeo with KL Schwartz Sharp yesterday

10/12
Today I am grateful to visit my brother and his family.

10/11
Today I am grateful to see Michael McDermott in concert last night.

10/10
Today I am grateful for audiobooks

10/9
Today I am grateful for:
- a walk around Fumee Lake and Lake Antoine in Iron Mountain yesterday;
- my first time spending any significant time in Michigan's Upper Peninsula

10/8
Today I am grateful to hike around Pictured Rocks National Lakeshore and Presque Isle yesterday.

10/7
Today I am grateful for my first visit to Tahquamenon Falls and to Whitefish Point yesterday.

10/6
Today I am grateful for a bike ride in and around Petoskey with Patrick, Susan, and KL Schwartz Sharp yesterday.

10/5
Today I am grateful to explore hiking trails in northern Michigan with Patrick and Susan yesterday.

10/4
Today I am grateful for a walk through the woods with Patrick in Harbor Springs, MI yesterday.


British author Anthony Powell spent most of his life creating the 12-volume series A Dance to the Music of Time. The story is semi-autobiographical with narrator Nicholas Jenkins standing in for Powell. But the story is not about Jenkins/Powell. Although he shares 50 years of his life - from the early 1920s to the early 1970s - he reveals very little about himself: We never even learn the names of his children. Instead, the story focuses on the people in the narrator's life during these decades.

We meet many characters. Some exit Nick's life forever; some exit and return in a later book; and some die. The lives of the characters often intertwine - sometimes via implausible coincidences (Nick often runs into friends on the streets of the enormous city of London and in small villages in the UK). The story is told mostly in chronological order, with each book consisting of 3-4 set pieces that provide insight into the characters and the time. The narrative seldom ventures outside of England - even when the Nicholas and his friends serve in World War II.

The novels tell a story of English society during each era. Because most of the characters are upper middle class, the story focuses on the lesser aristocrats and bohemians. History happens off-stage, reflected in the lives of the people in the story. We hear of the world outside through gossip and conversations at a plethora of dinners and cocktail parties.

In this richly layered work, Powell addresses themes of marriage, relationships, divorce; of the connectedness between people and events; and of the varying philosophies that people use to make sense of the world. But mostly, it is about the changes that time brings to individuals and to relationships.

Reading this series can be a challenge. Hundreds of characters are introduced, and the reader cannot always tell immediately which will be significant later. The most interesting character is Kenneth Widmerpool - other the narrator, the only one to appear in every book. Widmerpool is arrogant, ambitious, and decidedly unlikeable, but rises quickly in business, the military, and politics.  Widmerpool exists also to introduce his wife - the beautiful femme fatale Pamela. Like a venomous creature, Pamela lures men to her; then attempts to destroy them.

Powell includes a lot of dialogue, but it is good dialogue because Nick surrounds himself with Clever people.

Each book stands alone; but this is much better read as a complete series. Keeping track of the characters is a challenge, but it is more meaningful when a character appears after an absence of many years.

If you have the time to dedicate to reading the 3000 pages of this series, the rewards are great.


GCast 97:

Accessing MinIO with the AWS S3 SDK

The AWS S3 SDK for Java allows you to read from and write to MinIO. This allows you to easily migrate an application from using S3 to using MinIO Server or Agent.

Code:

https://github.com/DavidGiard/MinIO_Java_Demo/releases/tag/GCast097


Episode 632

Magnus Martensson on the Cloud Adoption Framework

Magnus Martensson on the Cloud Adoption Framework Magnus Martensson describes the Cloud Adoption Framework - a collective set of guidance from Microsoft - and how you can use it to migrate or create applications in the cloud.

https://docs.microsoft.com/en-us/azure/cloud-adoption-framework


At any given time, we all have many things to do. We cannot do them all at once, so we must prioritize them. And we must keep track of them. Most of us keep track in our minds, which forces us to spend mental energy on something other than actually performing these actions.

In his book Getting Things Done, David Allen provides a system for organizing what need to do and accomplishing more. Allen's "GTD" methodology focuses on productivity and remove stress by focusing on things that are important and accomplishing those tasks.

His technique is straightforward.

Distinguish between projects and actions. Projects consist of a list of actions. We perform actions; not projects we perform actions, so identify the actions necessary to complete each project - particularly the very next action you need to perform.

Record these projects and actions in a safe place that you can refer to often. This may be paper or computer files or a software application. This gives you a way to always know what you should be working on and frees you from stressing about them.

Most people keep their list of action items in their head or in an amorphous storage mixed in with other things. This adds unnecessary mental work every time we look at the list.

Allen advocates keeping a "Mind like water", meaning we should focus exclusively on the task at hand.

Allen focuses more on the individual actions in our lives than on long- and medium-term goals; but he does advocate documenting these, as they drive our projects and our actions. A periodic review of our projects and goals is important to ensure we are staying on track.

Here is a key diagram presented in the book to assist you while going through your inbox and determining how to handle each item.

GTD-Flowchart

This was my second reading of David Allen's "Getting Things Done" and my first reading of the current edition, which includes references to some software that can help. Allen tends to favor low-tech approaches, such as recording and organizing with paper, pen, and folders, but he leaves the choice of systems to the reader.

As an obsessive list maker, I was already using many of Allen's techniques, but his process added some clarity to how I should approach my organization.

My life is less stressful in part because of the practices I have adopted from this book.


A Swiftly Tilting Planet is the third book in Madeleine L'Engle's Time Quintet, which follows the adventures of the Murray family. Ten years have passed since book 2's events and Meg is now married to Calvin and expecting their first child. Calvin's mother Branwen visits the Murray family for Thanksgiving, which is interrupted when the US president phones Meg's scientist father to inform him of an impending nuclear war threatened by the South American dictator "Mad Dog" Branzillo.

As in the previous two novels, the family seeks to avert the coming disaster and is assisted by an angelic figure - a winged unicorn named Gaudior in this story. But, while "A Wrinkle in Time" and "A Wind in the Door" dealt with time as a separate dimension, rather than a forward-only vector, this book introduces actual time travel. Meg's genius brother Charles Wallace and Gaudior travel back in time to discover the origins of Mad Dog and attempt to alter history and avert war.

This is a clever adventure story that kept me enthralled. It was nice to see Charles Wallace take a more active role, rather than being the child who must be rescued. Meg remains in the present but communicates telepathically with her brother across the centuries. The story spans hundreds of years, but is tied together by the familial relationship between the characters encountered by Gaudior and CW.  The only weakness was the transparent name games that the author played, which were too easy for the reader to figure out, even though it took genius Charles Wallace more than half the book to get it.

I look forward to volume 4.


Episode 631

Gary Short on The Mathematics of Covid19 & the Hero You've Never Heard Of

Gary Short teaches about the work of 19th century medical statistician William Farr, who pioneered the idea of recording cause of death, which allowed us to compile mortality rates. Gary discusses how Farr's ideas are used today as we draw meaningful information by analyzing the COVID-19 data and the challenges in analyzing that data.


A Wrinkle in Time by Madeleine L'Engle was one of my favourite books when I was a boy; and I enjoyed re-reading it a couple years ago. But I had no idea that L'Engle wrote a sequel. In fact, she wrote a total of five books featuring this family, which are collectively known as the "Time Quintet".

A Wind in the Door is the second book in the series. Meg is in high school and her brother Charles Wallace - a child prodigy whose intelligence borders on superhuman capabilities - is bullied at school because he is so different from his small-town classmates.

Meg and Charles's mother is studying farandolae - theoretical components of the mitochondria of human cells that are too small to be seen by any microscope. Charles Wallace is losing his farandolae and Meg shrinks down to go inside Charles's body and battle the evil forces that are attacking him in an effort to destroy everything in the universe. Meg is accompanied by her high school principal and assisted by an alien creature. During their ordeal, the team discovers that the farandolae are sentient creatures and that their destruction is engineered by the evil Echthroi, who are determined to bring chaos to the universe.

As with "Wrinkle", this book features an angelic creature who aids the children and a malevolent force bent on destroying the universe. In this case, the angelic creature is a many-eyed, many-winged monstrosity that resembles a group of dragons and the demonic race is the Echthroi.

While lacking the scope of the series’ first novel, this book does an excellent job of relating cosmic turmoil with personal struggles. The potential destruction of everything is reflected in the battle to save Charles. L'Engle combines the excitement of fantasy and science fiction with the normalcy of family life and the power of love in both contexts.


Beloved by Toni Morrison is a ghost story. But the haunting is far from the most disturbing part of this book.

Eighteen years ago, Sethe and her children escaped the Kentucky plantation "Sweet Home" to find refuge in Cincinnati at the home of her mother-in-law Baby Suggs. Now, the Civil War is over, Baby Sugs has died, Sethe's two sons have run away, and the house is occupied by Sethe, her daughter Denver, and the ghost of her dead 2-year-old daughter known only as "Beloved".

The townsfolk shun the house - known only by the partial address of "124". Presumably, they avoid 124 because of their fear of the ghost within; but, as the story unfolds, we learn of the tragic secret that drove a wedge between Sethe and the local community.

The novel is filled with symbolism, such as the four horsemen arriving to re-capture escaped slaves; and the incomplete street address - a nod to the incomplete lives of former slaves; and the tree-shaped scars on Sethe's back, which mirror the emotional scars on her soul.

But Morrison deals explicitly with many issues - particularly the dehumanizing aspects of slavery. Families were separated permanently; people were stripped of their names (most of the male slaves at Sweet Home were named "Paul"); beatings were common; negroes were compared to animals; and sexual assault went unpunished. For some, death was preferable to a life of slavery.

This was my second reading of Beloved and I am glad I returned to it, even after 20 years. The story is sometimes difficult to follow as it includes numerous shifts in time and perspective. Much of the book reads more like poetry than prose, forcing the reader to approach each chapter deliberately and more slowly than most novels.

But the extra effort pays off in this beautiful and tragic story.


NoMi04Saturday, I drove 7 hours from Chicago to Harbor Springs, MI and arrived a couple hours before nightfall, so my friend Pat met me and we went hiking through the nature preserve across the street from my Bed & Breakfast. Afterward, Pat drove me around Harbor Springs before we had dinner on the back patio of a local restaurant.

Pat and his wife Susan retired and moved up to Petoskey from Lansing (after a brief stay in nearby Pellston)

I brought my bike with me, but Sunday was too cold and wet for biking, so the three of us hiked area trails and explored the region. We traveled as far north as Sturgeon Bay.

On Monday, Karen joined us for a 20-mile ride along the trails that wind through the area lakes. Pat is a volunteer Trail Ambassador for the local Trails Council, which means he rides around providing to tourists information on the local biking trails. He knows where the good biking is.

NoMi05Tuesday morning, I drove up to Michigan's Upper Peninsula.

Immediately after crossing the Mackinac Bridge into the Upper Peninsula, my thoughts turned toward pasties. A pasty is a meat and vegetable pie introduced to this area by copper miners immigrating centuries ago from Cornwall, England. I had to stop at multiple places before I found one where the wait was less than a half hour. It was worth the effort. Few foods are as hearty as a UP Cornish Pasty.

From St. Ignace, I drove almost straight north as far as it was possible to drive.

NoMi01Whitefish Point juts out into Lake Superior at the entrance to Whitefish Bay (across from Sault Ste Marie) and is the site of hundreds of shipwrecks, including the famous Edmund Fitzgerald. Here, I got my first look at Lake Superior and toured the oldest operational lighthouse on the Lake. I bought a ticket to tour the lighthouse and the Great Lakes Shipwreck Museum. After my tour, I headed south to Paradise, MI to enjoy a cheeseburger in Paradise before driving west to spend the afternoon at Tahquamenon Falls State Park. The park contains a series of beautiful waterfalls along the Tahquamenon River.

NoMi02I spent Tuesday night in Munising near Pictured Rocks National Lakeshore. I had hoped to take a boat cruise along the coast, but rough water forced the cancellation of all Wednesday cruises, so I drove and hiked through the park and along the shore. This park features a number of beautiful waterfalls and rock formations.

The day ended with a drive to Marquette. The highlight of this part of my journey was walking around Presque Isle State Park - a peninsula that extends into Lake Superior, providing gorgeous views of the water and nearby islands.

NoMi03My final night was spent in Iron Mountain. In Iron Mountain, I walked around several area lakes, including a 7-mile hike around Lake Fumee. I was happy to see almost no one during my 2-hour trek. Next time, I will take my bike on this trail, which is unpaved but flat and well-maintained.

A few miles inland and all around the UP, the colors have begun to change as the leaves on the trees lose their bright green color in favor yellow, orange, and red, as if the forests were enveloped in a heatless flame. The effect is so stunning that many people downstate plan their weekend getaways just to drive "up north" and see "the colors" in the fall.

I brought my bike on this journey, but only rode one day thanks to uncertain weather and the rough ground where I ended up. I did manage to see multiple amazing sunsets. The west coast of Michigan is deservedly famous for sunsets over the lake.

This was my first vacation of 2020, so it was long overdue. It convinced me I need to do a better job of disconnecting from my job and being spontaneous.

Links:

More photos

Top of Michigan Trails Council

Great Lakes Shipwreck Museum

Tahquamenon Falls

Pictured Rocks National Lakeshore


Episode 630

Heather Downing on Developer Burnout

Developers can become burned out and the recent pandemic can make this even more prevalent. Heather Downing talks about the symptoms of developer burnout, how to recognize it, and how to deal with it.

https://twitter.com/quorralyne


The 4-Hour Workweek by Timothy Ferriss claims that you can earn more by working 4 hours per week than you currently make working 40 hours. I don't know about that, but the book does contain some good advice to use your time more efficiently.

A good chunk of this book focuses on starting and running your own business. Ferriss covers delegation of authority, marketing strategies, distribution options, and setting prices.  I am not really interest in starting a business, but I still got some useful information from the book.

I most liked his discussions on time management and how to free up your schedule by being deliberate about how you spend your time. 

Her is some of Mr. Ferriss's professional advice:
-Check email less frequently and at set times during the day. Never first thing in the morning.
-Avoid meetings. Ask for the notes instead.
-Eliminate those tasks that are unimportant and/or unproductive
-Delegate tasks you cannot eliminate. You can outsource many of these tasks for a small fee.
-Reduce interruptions. Require a clear agenda before meeting with someone
-Let everyone know you are very busy (even if you are not)
-Use autoreplies and FAQs to respond to questions

He also includes some advice about life beyond business
-Don't defer your rewards until you retire. Instead, take "mini-retirements" several times a year to enjoy life.
-When your work week reduces to 4 hours, fill your time with something fulfilling
-Define your goals. Do you want to be a millionaire, or do you want to live a millionaire lifestyle?

This book has its flaws. It is padded with testimonials (labeled as case studies) and Ferriss comes across as arrogant.

Some of the material here is out of date. Is Yahoo really the best place to launch an online store? Many of now the communication services he recommends are now available free from cell phone providers. Some of the companies and services he recommends no longer exist. But he maintains an active blog to address these changes.

I don't buy into the goal of the title. I don't aspire to work only 4 hours per day, so I don't set that as a realistic goal. But I did find enough useful information in this book to make it worthwhile.

The single biggest impact the book had on me came about halfway through reading it: I set it down and scheduled a vacation for next week!


I was in high school when I first read J.D. Salinger's The Catcher in the Rye - about the same age as the narrator Holden Caufield.

I did not have much in common with Caufield. I have never attended or even visited a private boarding school, much less been kicked out of several as Holden had. At 15 or 16, I did not have the cash necessary to hide and entertain myself in Manhattan for three days. And I did not have the nerve to strike up conversations with strangers or attempt to buy liquor in a bar or hire a prostitute.

But something about Holden's inner monologue resonated with me.  He felt alone in the world - disconnected from his surroundings. He wavered between feelings of superiority over the phonies in his life and inadequacy due to his own failings. He was intelligent, but unfocused - a classic underachiever.

Holden is an extrovert. He craves the company of others and has no trouble approaching strangers. But he is self-destructive and manages to destroy nearly every relationship in his life. Rude to nearly everyone - sometimes flying into a rage at the slightest provocation. Although his observations are often profound, their legitimacy is damaged by his focus on the negative. Haunted by the death of his brothers, he stumbles through life with no plan. The only genuine relationship he has is with his younger sister Phoebe.

Holden is far from likeable. He is too judgmental and far too cynical; but his frustration is understandable, which makes him relatable. He is the worst parts of me - judging the faults of those to whom he is attracted, but harboring resentment against himself. Holden is my feelings of alienation, angst, and insecurity that rear their ugly heads from time to time. 

I felt this a lot in high school.

And now – decades later – I sometimes still fall into that same pit.


Episode 629

Wilfried Motchoffo on A Path to a Tech Career

Wilfried Motchoffo did not take a straight path to a Tech Career. He immigrated to the US 4 years ago from France and Cameroon. He was homeless for almost a year and learned English before teaching himself coding, then taking software engineering classes. A chance encounter while driving for Lyft led to a Microsoft internship.


September 2020 Gratitudes

Comments [0]

10/4
Today I am grateful for a walk through the woods with Pat in Harbor Springs, MI yesterday.

10/3
Today I am grateful to see Deb Talan in concert last night.

10/2
Today I am grateful
-for Hattan's help with my questions yesterday about Kubernetes and Helm
-to explore the artwork at the Harold Washington library yesterday

10/1
Today I am grateful for all the educational videos available online.

9/30
Today I am grateful that I turned off the debate last night when I recognized I was not learning anything useful.

9/29
Today I am grateful for a ride around Goose Island yesterday.

9/28
Today I am grateful to attend the Hyde Park Jazz Festival yesterday.

9/27
Today I am grateful for my first visit to the Garfield Park Conservatory yesterday.

9/25
Today I am grateful for new bed sheets.

9/24
Today I am grateful for a bike ride along the trails in Skokie yesterday.

9/23
Today I am grateful for the lady who cleans my home a couple times a month.

9/22
Today I am grateful to speak at the Chicago Cloud Conference yesterday.

9/21
Today I am grateful to stumble upon a bunch of Mexican and Latinx picnics and music while riding through Humboldt Park yesterday.

9/20
Today I am grateful I've been able to maintain this exercise program for the past 2 months.

9/19
Today I am grateful for Ruth Bader Ginsburg and her lifetime of service to this world.

9/18
Today I am grateful for Jazz Showcase and the impact it has had on the local music scene for over 7 decades.

9/17
Today I am grateful that my sister sold her house yesterday.

9/16
Today I am grateful for ebooks

9/15
Today I am grateful for a walk around Wrigleyville last night with Tim.

9/14
Today I am grateful for lunch yesterday on the beach.

9/13
Today I am grateful for jazz music

9/12
Today I am grateful to finally hang these posters and photos in my home.

9/11
Today I am grateful for my annual physical this morning.

9/10
Today I am grateful to learn something new every day.

9/9
Today I am grateful to work with my personal trainer after a months-long interruption.

9/8
Today I am grateful to awaken to a gently falling rain in the early morning.

9/7
Today I am grateful for my new eyeglasses.


It has been two and a half years since I last visited the universe of Miles Vorkosigan. Other books called to me and drew me in after I finished "Memory", but I still feel a fondness for Miles - the son of a Baron of the galactic empire of the far future, who overcame sever birth defects to lead a life of adventure.

This month, I resumed Miles's story with Komarr.

Serious injuries sustained in the previous book (Memory) have forced Miles to retire from active military duty and become an Imperial Auditor. But life as an Auditor is far from boring. Miles travels to the colony planet of Komarr to investigate the destruction of a terraforming satellite. Komarr is significant to the galaxy due to the number of nearby wormholes, which make interstellar travel possible. It is also significant to Miles as the Miles's father was falsely accused of ordering the massacre or innocent civilians here a generation ago.

Here Miles discovers that money is diverted from the terraforming operation; he is captured twice; he investigates the deaths of two government officials; and he uncovers a plot against the empire.

And, as so often happens in Lois McMaster Bujold's novels, Miles is distracted by the beautiful Ekaterin. This potential romance stands out as the author fleshes out the character of Ekaterin very well. In fact, some of the story is told from her point of view - a rarity in a Miles story.

Komarr has all the elements that make Bujold's novels enjoyable - a resourceful but flawed hero; a mystery to solve; and more than one human interest story.

I look forward to continuing my journey through this universe.


GCast 96:

Using the MinIO Java Client SDK

Learn how to use the Java Client SDK to upload and download files to/from a MinIO server

Code: https://github.com/DavidGiard/MinIO_Java_Demo/releases/tag/GCast096


Episode 628

Alexandria Storm on Natural Language Processing and Inclusion

Alexandria Storm talks about the importance of having an inclusive group when developing software. She recently completed an internship with the Microsoft Bing team and she describes how a diverse representation can improve natural language processing - making searches more relevant by supporting different languages and dialects and taking into account location-sensitive searches.

She also discusses the importance of inclusion among tech companies and entrepreneurs for underrepresented groups, such as women, people of color, and queer and trans people.


"Anansi Boys" by Neil Gaiman

Comments [0]

When Fat Charlie's father died, he learned some secrets about his family: Charlie had a brother named Spider; and their father was in reality the mischievous god Anansi.

Spider shows up at Charlie's door and almost immediately begins using his magic to disrupt Charlie's life.

Neil Gaiman's Anansi Boys is a series of misadventures that takes the reader through alternate realities, ghosts, animal gods and demi-gods, voodoo, and a Caribbean kidnapping. The story draws a contrast between the timid, hyper-average Charlie and his father and brother, who spent their lives focused on wine, women, and song. But it also takes us through transformations as each brother is influenced by the other.

Like the spider-god Anansi, this story weaves a web that traps the characters and the reader in a funny, intriguing quest.

It is great fun in the way that Neil Gaiman has perfected. An excellent story, even by the standards set by Neil!


I enjoyed Eternity's Wheel more than the first two books of the InterWorld trilogy. As with the preceding books, Neil Gaiman's name appears at the top of the authors list, but it was actually written by Mallory Reaves with her father Michael assisting with the ideas.

This book wraps up the FrostNight saga that began in volume 2 - The Silver Dream.

The villains of Binary (which derives their power from science) and HEX (which derives their power from magic) have launched FrostNight in order to destroy all the different earth's from the different dimensions in order to take dominion over the chaos that remains. Joey Harker and the countless other versions of himself that make up InterWorld are battling to stop them. They are assisted by Timewatch - a police force that seeks to stabilize threats to the time stream.

The book is not complex but it introduces some interesting new characters and evolves some existing ones; and includes some clever possible time loop twists.


GCast 95:

Creating a MinIO Agent for Azure Blob Storage

Learn how to use MinIO to manage blobs in an Azure Storage Account


Irma Mesa on Cafecito

Comments [0]

Episode 627

Irma Mesa on Cafecito

Irma Mesa created Cafecito for those who are working from home. Cafecito uses machine learning algorithms to connect people to others with similar interests and schedule time to meet. She talks about building this technology and business and about the b2b service she is planning.

https://meetcafecito.com/

Rachel became fascinated by the sight of a beautiful copy that she would see from her seat on the train every morning. She fantasized about their idyllic life, so she was shocked to see the young wife kissing another man one morning and to learn the next day that this same wife had disappeared. She began investigating the disappearance and it was not long until she had injected herself into the incident and the lives of those involved.

The Girl on the Train by Paula Hawkins is told by three different women:

  • Rachel - An alcoholic who often drinks to the point of blacking out. She is reeling from the loss of her husband, who left her to marry his mistress.
  • Megan - Married to an emotionally abusive husband. She loves him but cannot resist sleeping with other men. She is haunted by a dark secret in her past.
  • Anna - The mistress who took away Rachel's husband. Her idyllic life with her new husband and baby is disrupted by Rachel's stalking.

The story involves the sudden disappearance of Megan. Rachel becomes obsessed with the case. Although she never met Megan, she would see her from her train nearly every day and fantasize about the perfect marriage she witnessed.

This suspenseful novel kept me interested until the end.

I loved the way the author began Megan's story a year before Rachel's, so we were able to see what led to her disappearance; I loved how Hawkins often related the same scene from three different perspectives; I loved how key factors were withheld and revealed later, taking the reader in a new direction; and I loved that each of the narrators was fatally flawed and unreliable, so we were left to guess at the truth.

The only weak point came near the end when the villain arrogantly and foolishly began relating their crime, reminiscent of a James Bond villain.

But this can be forgiven after the rollercoaster ride that is this novel.


Like most slackers, Jake Donaghue seldom puts thought into the future or the consequences of his actions.

Hoping to find a free place to stay, Jake visits his old girlfriend Anna and her actress sister Sadie. He then attempts to re-connect with his estranged friend Hugo. Jake was once close to each of these people but left them abruptly when he felt uncomfortable.

Iris Murdoch's Under the Net takes us through Jake's misadventures, including his kidnapping of a movie star dog, a riot on a film set, and an escape from a hospital.

The book focuses on miscommunications and the resulting misunderstandings and the incorrect perceptions that people tend to have of one another. Jake spends much of the novel searching for someone. He is ultimately searching for himself.

It is a farcical story of the self-destruction of a likeable rogue.

And it is great fun!


GCast 94:

Creating a MinIO Server

Learn how to create a MinIO server, organize into buckets; then, read and write files to the server.


<< Older Posts | Newer Posts >>