-->

dev powershell, tip, match, contains, aws, lightsail, wordpress

I was working on a WordPress project recently. The project is to set up a WordPress blog using Amazon Lightsail service. I ended up blogging it here, but I want to talk about something else in this post.

Use Case: Filter results using -Contains operator

Amazon Lightsail comes with pre-packed applications, and you can create an instance by providing the blueprint id. You can search for blueprints by using the Get-LSBlueprintList cmdlet. It returns a list like this:

Screenshot of the terminal showing the results of Get-LSBlueprintList cmdlet

WordPress comes in two different blueprints: Single-site vs multi-site.

So my initial action was to filter the list based on the name containing the word “wordpress”. So I ran this script to get the results:

$applicationName = "wordpress"
Get-LSBlueprintList | Where-Object { 
    ($_.IsActive -eq $TRUE) -and
    ($_.Name -contains $applicationName)
}

To my surprise, this command returned the following result:

Screenshot of the terminal showing the results of Get-LSBlueprintList cmdlet with contains filter, filtering by the word wordpress and isactive set to true

The problem: Missing Wordpress blueprint

In the Amazon Lightsail dashboard, I can see the Wordpress Multisite exists:

Screenshot of Amazon Lightsail dashboard instance selection page with wordpress-multisite highlighted

I even captured the API call the dashboard makes when creating a WordPress Multisite instance and it looks like this:

Screenshot of captured API call showing wordpress_multisite as blueprintid

So how was it possible that wordpress_multisite blueprint id existed but I couldn’t get it via Get-LSBlueprintList? I thought there was something wrong with the cmdlet and even created a supported ticket for AWS!. To my surprise the problem was somewhere else.

The root cause: Contains operator works in mysterious ways!

As a C# developer, when I see “Contains”, I think of checking the existence of a substring in a string.

For example, check out this simple example:

Screenshot of C# application showing Contains function results

It’s checking whether or not the word “wordpress_multisite” contains the word “wordpress” and the answer is yes!

Now, let’s take a look at the Powershell-equivalent:

$wordpressMultisite = "wordpress_multisite"
$containsWordpress = $wordpressMultisite -contains "wordpress"
$containsWordpress

and here is the result:

Screenshot of Powershell script showing Contains operator results with substring

In this case, the answer is no!

The reason is contains operator is by design meant to be used to search collections for a string. For example, the following example illustrates the intended use:

$listOfApplications = "wordpress", "lamp", "nodejs"
$listOfApplicationsContainsWordpress = $listOfApplications -contains "wordpress"
$listOfApplicationsContainsWordpress

and the result is:

Screenshot of Powershell script showing Contains operator results over a list of strings

The solution: Match Operator

The solution is using the match operator for substrings. In my original script, all I had to do was replace contains with match and got the expected results.

Final script:

$applicationName = "wordpress"
Get-LSBlueprintList | Where-Object { 
    ($_.IsActive -eq $TRUE) -and
    ($_.Name -match $applicationName)
}

Output of the script:

Screenshot of Powershell script showing both wordpress and wordpress_nultisite results

Conclusion

So there you have it: Always read the documentation!

As Powershell is based on the .NET framework, I instinctively assumed contains would search a string for substrings, but it works entirely differently.

I lost some time but learned a valuable lesson. I hope you find this post useful too, and it prevents the same thing from happening to you too.

Resources

hobby raspberry_pi, plex, media_server

Raspberry Pis these days are powerful computers that can run a lot of tasks at home with very efficient electricity usage. In this post I’m going to show how to use a Raspberry Pi 4 8GB as a Plex server and serve your own media files in your own network.

Hardware

  • Raspberry Pi 4 (8 GB)
  • Argon ONE case (with M.2 adapter)
  • M.2 SATA SSD (1TB)
  • Standard pi power supply

Getting Started

In this project I used an Argon ONE M.2 Case for Raspberry Pi 4 as it allowed me to use an SSD drive with the Pi which is a lot faster than a microSD card.

Argon ONE comes with a comprehensive used guide and take about 10 minutes to put everything together so it’s not too different than using a regular Pi case. The added benefits are:

  • You get to use a M.2 SATA SSD (Be mindful about the SATA here. It doesn’t work with NVMe SSDs even though it fits. So make sure to buy a M.2 SATA SSD)
  • You get 2 full-sized HDMI ports instead of the micro ones that come with a Pi 4

The final build looks like this with a 5-bay YottaMaster enclosure attached to it:

Software Installation

The easiest installation way I could find is downloading the Plex Media Server for Linux package from Plex Downloads Page

First choose Linux from the OS list

and click Choose Distribution

Once you’ve downloaded the installation package right click and select Package install

After the installation open http://localhost:32400/web and you’re ready to go!

Plex Account

I already had an account so I just logged in with my credentials. This automatically adds the new server to your account so you can see the libraries in other server instances in your account as well.

File Share

Because I attached a 5-bay hard drive enclosure to the Pi, I wanted to use it for a general file server as well. This also helps if your media files are located somewhere else on the network and you want to copy them over the network if you’re not able to attach the source drive directly to the Plex Server Pi.

To create the file server I followed this guide to install Samba on my Pi: Samba: Set up a Raspberry Pi as a File Server for your local network

Troubleshoot File Permission Issue

One issue I had when I tried to add some test folders was that Plex wasn’t able to list the folders in a selected drive. I found the solution here: Plex Media Server cannot see sub folders.. Permissions issue?

Basically added the permissions to the folders in the path as shown in the accepted answer:

sudo chmod a+rX /mnt
sudo chmod a+rX /mnt/sda
sudo chmod a+rX /mnt/sda/will

Client

I’m not going to go into much detail on the client side as there are a vast number of ways to consume content from a Plex Server. In my case, I’m using a Kodi on another Raspberry Pi and as soon as I added the new Plex Server to my Plex account I was able to view the content on my client Kodi Pi.

Conclusion

Overall it was quite straightforward as the server package came ready to install. The only issue I had was to figure out the folder permission issue and after that’s been resolved I was able to enjoy a brand new Plex Server instance in my own network. Hope this helps if you’re after similar results.

Resources

hobby raspberry_pi, productivity, dymo, labelwriter_450

I have a Dymo LabelWriter 450 for years and I love using it. Especially it worked a miracle recently when I organised all ny shelves and bagged and labelled everything. To have the ability of keeping the printer online all the time and print easily I decided to plug it in a Raspberry Pi and share over the network. The steps below explain how it can be done easily:

Step 01: Plug in the printer to the Pi via USB

Simply plug it in and power it on.

Step 02:

  • Click Pi -> Preferences -> Add / Remove Software
  • Search “dymo”
  • Tick the checkbox next to “printer driver for DYMO label printers”
  • Click Apply and wait for the installation to complete

Step 03: Configure printer

  • On the Pi itself, open a browser and go to “http://localhost:631”

  • Click Administration and Add Printer. In the username/password prompt, use the account you used to log in (most likely username “pi”)

  • You should see DYMO printer in the list of Local Printers

  • Change the name of the printer if you like and click Continue

  • Change the drivers if it’s incorrect and click Add Printer

  • Accept or modify the default options and click Set Default Options

  • Confirm the printer is listed in the printers list

Step 04: Share the printer

  • Click Pi -> Preferences -> Print Settings

  • From Printer menu select Shared to share it over the network

Step 05: Setup client machine

Option 1: Add network printer

  • Download and install DYMO software
  • Upon first run, application asks to run Add Network Printer Utility
  • Click Yes

For me, this method did work on one machine and did not work on another one. So for the other machine I used Option 2

Option 2: Add printer using OS’s add printer functionality

I used a Mac for this but should be similar on Windows.

  • Search for Printers & Scanners
  • Click + button
  • It should show the printer on the network:

Step 06: Test

Now that printer is recognized on the client machine, just design your labels and print using DYMO Label app.

Resources