# Tuesday, December 1, 2020

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 <dependencies> section of the project's POM.XML:

<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-s3</artifactId>
    <version>1.11.858</version>
</dependency>
  

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.

Tuesday, December 1, 2020 7:23:00 AM (GMT Standard Time, UTC+00:00)
# Monday, November 30, 2020

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

Monday, November 30, 2020 7:31:00 AM (GMT Standard Time, UTC+00:00)
# Saturday, November 28, 2020

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.

Saturday, November 28, 2020 9:57:00 AM (GMT Standard Time, UTC+00:00)
# Wednesday, November 25, 2020

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 <dependencies> section of the project's POM.XML:

<dependency>
  <groupId>io.minio</groupId>
  <artifactId>minio</artifactId>
  <version>7.1.2</version>
</dependency>
  

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.

Wednesday, November 25, 2020 9:56:00 AM (GMT Standard Time, UTC+00:00)
# Tuesday, November 24, 2020

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.

Tuesday, November 24, 2020 9:31:00 AM (GMT Standard Time, UTC+00:00)
# Monday, November 23, 2020

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

Monday, November 23, 2020 9:15:00 AM (GMT Standard Time, UTC+00:00)
# Saturday, November 21, 2020

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.

Saturday, November 21, 2020 9:39:00 AM (GMT Standard Time, UTC+00:00)
# Thursday, November 19, 2020

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.

Thursday, November 19, 2020 9:02:00 AM (GMT Standard Time, UTC+00:00)
# Monday, November 16, 2020

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

Monday, November 16, 2020 10:18:00 AM (GMT Standard Time, UTC+00:00)
# Sunday, November 15, 2020

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

Sunday, November 15, 2020 10:15:43 PM (GMT Standard Time, UTC+00:00)