Loading [MathJax]/extensions/TeX/AMSsymbols.js

Tuesday, 10 December 2024

Fixing things - Christmas edition

After an incident with a fox in the garage last year and time taking it's toll, several of the Christmas lights were in-operational when we took them out the loft this December. Not to worry though. I decided to go for the repair option.

Outdoor lights

The outdoor lights were victim of the fox in the garage. Unfortunately from stress it bit through the cable... As it was on the low voltage circuit this was a simple case of stripping back the wires and re-soldering:

And here they are working:


Reindeer

We bought an outdoor reindeer back in 2020 (to add a bit of extra cheer to the Covid year) but almost immediately the LEDs started showing signs of rust. Not so outdoor-friendly unfortunately. It managed to stagger through until last year when several lights failed. So I stripped of the old LEDs and replaced with 2x 5m battery powered LEDs

Leaky Battery

Finally, I accidentally left batteries in one of the indoor lights over the year and they leaked and corroded the spring contact completely. Fortunately this was a standard AA size and a clean and replacement was enough to get the lights working again:

So a great outcome. Fixing three Christmas lights for less than £15 postage and packaging. And of course much less waste that would otherwise have been made.
 


 

Wednesday, 28 June 2023

Gitlab and Quantum Computing Code

So, I've been looking at Quantum Computing recently and as part of this I thought I'd also take the opportunity to learn GitLab by creating a repository with my scripts.

Gitlab

I setup a GitLab account using the free tier and then created a new project, "quantum"

Setting up SSH

To use SSH keys for communication with GitLab, I followed the instructions in the GitLab Docs to create an SSH key and add to my Profile

For Linux my ssh folder is ./ssh. To generate a new key, run

ssh-keygen -t ed25519 -c "A comment"

And follow the prompts for creating a filename and Passphrase

Then from the GitLab page, click on my Profile image (default for now!) and select Edit Profile -> SSH Keys.

In the Key box paste the contents of the .pub public key I created in the previous step. (Starting with ssh-ed25119), set the Title, usage type of "Authentication & Signing" and finally Add Key.

Visual Studio Code Integration  

From the Visual Studio Code welcome page I selected Clone Git Repository...

I then used the Clone with SSH option from the Clone button to obtain the git url and simply pasted that into Visual Studio Code

Running the script

I have an Anaconda Python environment with cirq added. Details about this will be added later.


Tuesday, 20 June 2023

Setting up Unit Tests in Visual Studio 2022

A very quick blog post tonight. This came about when I wanted to setup a new Unit Test project for an existing .NET 6 solution. The problem came with setting up the project package references and I couldn't remember what to add. So for future reference, the packages I added from NuGet were:

  • NUnit - The main unit-testing framework
  • NUnit3TestAdapter - This is used for running NUnit 3.x tests in Visual Studio
  • Microsoft.NET.Test.SDK - MSBuild targets and properties for building .NET test projects
The project was created as a Class library (Console Application also works but it doesn't really make sense given it's not hosting its own executable)

Add a class and within this attribute the tests to be run with either [Test]

        [Test]
        public void Test_Something()
        {
            var expected = "Something";
            var testValue = DoSomething();
            Assert.That(testValue, Is.EqualTo(expected));
        }

Or [TestCase], if you want to supply parameters

        [TestCase("Test1", 1, 2)]
        [TestCase("Test2", 2, 3)]
        public void LatLong_To_Mercator(string testName, int input, int expected)
        {
            // Run test with parameters and Asset against expected
        }

One last thing, the documentation says to add [TestFixture] to the class but this doesn't seem to be needed. The tests run anyway.

Ahha!
Beginning with NUnit 2.5, the TestFixture attribute is optional for non-parameterized, non-generic fixtures. So long as the class contains at least one method marked with the TestTestCase or TestCaseSource attribute, it will be treated as a test fixture.

Wednesday, 22 February 2023

Avalonia and Cross Platform .NET UI

A big advantage of .NET Core is the ability to write code once that can run on both Windows and Linux. This of course has been done before with Java but for those who use C# this was a huge step forward.

Unfortunately the existing UI Frameworks, Winforms and WPF were not supported on Linux so applications like the SuperMarketPlanner, although they were upgraded to .NET Core, were only able to run on Windows. 

Fortunately though .NET Core, now being open source is building a larger ecosystem and one such addition is Avalonia. This is a modern UI framework that can target both Windows and Linux. 

I initially played around before deciding to follow the excellent tutorial to build a Music Store App.

The framework is similar to WPF. We have a markup file to describe how the UI components are arranged, the View. A ViewModel is then setup to define how to bind the view to properties and commands.

As an example I setup a simple test that used a button to load and display an image. The view below shows the Button and Image elements, with the Image Bound to the Photo property:

<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaTestApp.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaTestApp.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="AvaloniaTestApp">
<Design.DataContext>
<vm:MainWindowViewModel/>
</Design.DataContext>
<StackPanel>
<Button Content="Load Image" Command="{Binding LoadImageCommand}" HorizontalAlignment="Right" VerticalAlignment="Top" />
<Image Stretch="Uniform" Width="400" Source="{Binding Image}"/>
</StackPanel>
</Window>


And the ViewModel code sets up the property to the bitmap. There is a method to load the image from a file that's called from a button command (see the Music Store App demo for how to setup the command)

private Bitmap? _image;
// Property that's bound to the View
public Bitmap? Image
{
get { return _image; }
private set => this.RaiseAndSetIfChanged(ref _image, value);
}
// This can be called for example from a button command
public async Task LoadImage()
{
await using (var imageStream = new FileStream(@"Path\To\Image", FileMode.Open))
{
Image = await Task.Run(()=> Bitmap.DecodeToWidth(imageStream, _imageWidth));
}
}


And here is the application running on Windows...


And Ubuntu...




Tuesday, 6 December 2022

Where did the disk space go?

I like a good mystery. Like this evening when I saw 130GB space free on my 800GB disk partition with only 280 GB of space being reported as used. Where did all the rest of the disk go?!

First up, I ran WinDirStat as an administrator, no, still reported 280GB. What was going on here?

One cause for this apparent mismatch was System Restore points, which don't appear on Disk Usage reports, so to confirm I went and took a look.

In the search box, type Control Panel and open the Control Panel App:

Open All Control Panel Items > Recovery and select Configure System Restore:


Under the System Protection tab open Configure...


The maximum size for Disk Space Usage was set to the size of the disk and 400GB had already been used...


So, setting the Max Usage back down to 10% and there, I now had a decent amount of free space.




Saturday, 26 November 2022

BAD_SYSTEM_CONFIG_INFO

Oh dear. Monday saw a bit of stress with the Desktop PC failing to start. It booted into a blue screen with BAD_SYSTEM_CONFIG_INFO.

After it automatically tried to restore, with no success I tried the steps below

Error 0x74: Bad_system_config_info - Microsoft Support

  • System Restore: No restore point found 
  • System image recovery: Made it 50% through and said it couldn't continue
  • Safe mode: Wouldn't start in any safe mode configurations. Always returned to the same blue screen

At this point I was out of options so as a last resort decided to reinstall from an ISO image

I downloaded the media creation tool from: Download Windows 10 (microsoft.com) and flashed to a USB stick. 8GB is required for this.

Then on I needed to enter the BIOS (holding Esc on startup for this) and set it to boot from the USB.

After this everything went very smoothly. My PC is connected via Ethernet to the network so nothing was required to setup the internet connection and the windows license was still applied after installation.

Finally, and most fortunately, I had actually made a full backup of the PC only the day before so I hadn't lost any data. The last step to restore was painless.

As to why it failed like this? I don't know. I ran CHKDSK afterwards and nothing untoward was reported. Perhaps a bad Windows update? Although I didn't see any reports of issues like this. 


Tuesday, 22 March 2022

Setting up a new Python environment

Over many years of working in software development, managing dependencies to you code, whether in binary or source code format has always been a pain, to be honest. Take your pick from:

  • Cut and paste code
  • Linking against common libraries
  • Coping .zip files (with suitably convoluted folder structure)
  • Installing files to a common location
    • dlls
    • .NET GAC
  • Maven
  • NuGet
  • And so on..

And now into the mix comes Python with its 2.x (OK not really now) and 3.x versions, pip and conda..

A discussion of pip and conda can be found here

Anyway, having installed a new Ubuntu partition I wanted to get back the development environment I'd been using for the last couple of years. This is what I did...

Install Visual Studio Code

It's my tool of choice for Python. On Ubuntu I followed these instructions

I then installed the Python and Pylance extensions for VS Code

To check the Python environment being used, Open the Command Palette with Ctrl-Shift-P and then Python : Select Interpreter

Install Anaconda

It has its quirks but I have been using Anaconda. I installed from scratch using the instructions here.

The default installation included all the necessary libraries for simple machine learning code. 

Installing Cirq

I've been looking at Quantum Computing over the last year using Cirq. I couldn't get this installed using the instructions here.

However python -m pip install Cirq worked and it appeared in my Anaconda base (root) environment in VS Code. Success!

Installing Pygame

And finally, for some playing around with game programming I installed Pygame  with python -m pip install pygame.

So my environment is back up and running on a new OS installation.