RSSAmplifier

Blog

Richard Astbury's Blog

/RSS feed ↗49 posts

Latest posts

Building a Conversational Alexa Skill with Microsoft Foundry Agents

What happens if you give Alexa a modern AI agent? Alexa already provides a microphone, a speaker, and a natural place for a conversation, but it has not traditionally been backed by a particularly powerful or stateful AI. Microsoft Foundry agents offer reasoning, tools, and conversation context, but they do not come with a ready-made consumer interface. Combining the two seemed like an interesting…

The Universe's Source Code Might Be Written in Octonions

An experiment in AI-assisted theoretical physics A note on how this was made This project began as a question: what happens if you point a generative AI at one of the hardest unsolved problems in fundamental physics? I’m not a professional physicist. I have a background in software and mathematics, and a long-standing obsession with the question of why the Standard Model has the structure it does…

Finding New Worlds - Using Python and Open Data to Discover an Exoplanet Candidate

The Spark: From Conversation to Code It started with a simple question: “What if we could find planets that others have missed?” NASA’s Kepler and TESS missions have produced petabytes of public data, carefully analyzed by professional astronomers and citizen scientists alike. Thousands of exoplanets have been discovered. But in a dataset this vast, could there still be hidden signals waiting to…

Microsoft Copilot Researcher Solves Today's Wordle Using "Computing Using Agent"

Today I decided to test Microsoft Copilot Researcher’s problem-solving capabilities by asking it to solve today’s Wordle puzzle. What I discovered was fascinating - the AI didn’t just guess randomly, but used a systematic approach through its “Computing Using Agent” feature. The Prompt “do today’s new york times wordle” The Approach The Computer Using Agent has access to a desktop browser. It…

AI Self-Portraits

I thought it would be fun to ask these LLMs to create a self portrait of themselves. I used this prompt: create a self portrait of yourself …and here are the results: Gemini ChatGPT Copilot Grok GitHub Copilot (with Claude Sonnet 4) ╭─────────────────────────────────╮ │ GitHub Copilot Self-Portrait │ ╰─────────────────────────────────╯ ⚡ GITHUB COPILOT ⚡ ┌─────────────────────────────────────┐ │…

Microsoft Tooling for Application Modernisation

In this blog post, we will explore the various Microsoft tooling options available for application modernisation. Whether you are working with ASP.NET or Java, Microsoft provides a range of tools to help you discover, containerise, and migrate your applications to Azure services such as Azure Kubernetes Service (AKS) and Azure App Service. Let’s dive in and explore the options. Azure Migrate: App…

2023 Reading List

In the middle of 2023 I was left at home for a week while my wife and kids went abroad. I was left with a list of DIY tasks, so I decided listen to some audiobooks while glossing the hall stairs and landing. Since then I have been cramming audiobooks into dog walks, car journeys and household tasks. These are the titles I listened to in 2023 (a couple of physical books too). I have rated them out…

Connecting Azure Logic Apps to Azure OpenAI

Most of the GenAI use cases we see are the ‘copilot’ experiences, with a chat assistant helping a user to complete a task. However GenAI can also be used in a variety of ways to support ‘back end’ processes, such as: Classify documents/emails Converting unstructured data into structured data Summarisation of documents/conversations Azure Logic Apps provides a great way to implement business…

Build your own Copilot

An AI generated image of “constructing a large language model”. There are many use cases for generative AI, but one that many people have been excited about is the ability to build a chatbot that can answer questions about any topic. In this post I cover the different levels of sophistication you can build into your chatbot, and how you can use the Azure OpenAI API to build your own Copilot.…

ChatGPT Tips and Tricks

The ChatGPT interface is much more flexible than the chat, text generation and summarisation examples often cited. As a developer there are a few interesting use cases I have played with briefly. Here are a few examples. If you have any more, let me know! Extracting search terms from a question Question: from the question below, extract the relevant search terms as a comma separated list --- what…

GitHub Copilot Tips and Tricks

GitHub Copilot Tips and Tricks Enable/Disable Specific Languages in VSCode In VSCode you can enable and disable specific languages by adding the following to your settings.json file: "github.copilot.enable" : { "*" : true , "plaintext" : true , "markdown" : true , "scminput" : false , "yaml" : false } , Enable/Disable Specific files in your project If you want to enable or disable specific files…

App Modernisation

History In the early days of Azure (circa 2008) the only compute option was PaaS (Platform as a Service) in the form of Web Roles and Worker Roles. It was often a challenge to get software running in this environment, but the effort often was often rewarded with a system that was stateless, scalable, it might have used the native queues and blobs, and was probably connected into the health…

SFTP in Azure

FTP vs SFTP FTP (or File Transfer Protocol) is a protocol that’s been around for 50 years, and is used for exchanging files between a client and a server. It supports username and password authentication, but doesn’t have encrypted transport. FTPS adds TLS to this protocol to encrypt the traffic. SFTP (or Secure Shell File Transfer Protocol) is a protocol for exchanging files between a client and…

Hello Orleans 4.0

With the advent of .NET 6, C# 10 and Orleans 4.0 (preview) it seems like a great time to take a fresh look at Microsoft Orleans (which is now included in the official Microsoft docs!). What is Orleans? Orleans is an open source framework for building distributed systems in .NET. This makes it easier for a developer to build software which will scale from a single computer to running across a…

Azure Blob Storage Index Tags

Background I think the storage services in Azure are excellent. They provide a cheap and reliable data storage mechanism which can scale to 500TB (per container/table/queue) and provide 20k req/sec throughput. The challenge is the lack of secondary indexing. Blob and Table records are indexed by a sorted key. This allows easy retrieval if you know the name of the thing you want. The key can be…

Cryptocurrency Mining in Azure

TL;DR Don’t bother. Hardware Selection I thought I would try my hand at mining crypto in the cloud. After all, who wouldn’t want to be a bitcoin billionaire? There are a few VM options in Azure which have GPUs installed, I tried Standard NV6 (6 vcpus, 56 GiB memory) - £783.47 /month Standard NC6 (6 vcpus, 56 GiB memory) - £365.62 /month (promotion) It turns out the NC6 is an older model and uses…

Offline maps with vector tiles

On a recent project we wanted to have high quality mapping, but completely offline. Most map providers are online-only, and some permit temporary download as a cache. In my case the whole dataset needed to be downloaded in advance, as the device I’m working with will not be connected to the internet. I decided on the map tiler datasets, they provide various extracts of open street map, as vector…

Adventures in Installing your own Security Camera

I bought a £50 security camera off Amazon to improve security at our home. For a low cost unit it’s fairly capable, it works at night thanks to an array of IR LEDs, and the companion software allows you to control/view the feed from your phone, even outside your home network (which makes me slightly worried!). It supports recording a video feed to a micro SD card, but I couldn’t actually prise the…

Command Driven Map

Summary In a previous post I discussed a pattern for implementing maps in React based web applications using a pub/sub approach. This post expands on the idea, presenting a complementary approach using the command pattern . The basic problem is that the state driven approach of React.js is at odds with API approach of web map components. Using the command pattern allows encapsulation of the logic…

Keeping it Simple

I recently worked on an internal project with a team of grads and inexperienced developers. Five of us in total. It was a short project - a line-of-business application to convert spreadsheets into software. It was a lot of fun. The challenge for me was how to get four people as productive as possible in a short timescale, given the extraordinarily high concept count of modern software development…

Event Driven Map

The Problem After implementing maps in react applications a few times, I have found that map components and react have have quite different, and largely incompatible abstractions. A typical map control is initialised, with a DIV element it uses to render the map: < div id = " map " /> const position = [ 51.505 , - 0.09 ] const map = L . map ( ' map ' ). setView ( position , 13 ) You can then call…

Converting to TypeScript

I started to take JavaScript seriously in 2012 with node.js. It offered a nice module system, a rich package ecosystem and a fast startup/development cycle. However the most compelling thing about JavaScript was that it took me out of the .NET world, including the painfully slow Visual Studio and the cumbersome static type system of C#. JS gave me a refreshing new dynamic world. It felt really…

Azure Maps Data Service - First Impressions

Azure Maps consists of a set of geospatial REST APIs and a JavaScript web map control. Some of the services (including the data service) are in preview. What caught my particular interest was a Data Service which allows you to bring your own data in GeoJSON format, upload it, and then perform spatial queries on the data. After a quick play with the service, there are some interesting things to…

Roll your own Vector Tile service

Vector Tiles are an efficient way of displaying a large amount of data on a mapping control. The traditional approach of adding pushpins, or other layers in the browser fail with large amounts of data. The browser becomes sluggish when the number of points reaches 1000. Colleagues of mine have produced an excellent workshop with detailed steps on how to build your own vector tile layers using…

Rendering leaflet.js tiles in the browser

TL;DR I wrote a fractral viewer using Leaflet.js which renders map tiles in the browser using a pool of service workers. You can view the app and source code . Introduction I’ve used leaflet.js before to render fractals in Go and C# , but I thought it would be intersting to see if it was possible to render tiles in the browser without any cooperation from a tile server. First of all, what is a…

Lego House

On a recent family trip to Denmark we spent a day at the Lego House in Billund. It’s set back behind the Lego theme park, and has only been open for about a year. In the large open plan ground floor there’s a restaurant and a lego shop, these being the only commercial offerings available. The ticket barrier greets you by name, and allows you to walk up a long ramp, winding around a huge lego tree…

Dev East

https://deveast.uk I’m one of the oragniser of Dev East. A single day, single track software developer conference running on 16th March 2018 at Ipswich Town Football Club. The Agenda I want the conference to be inspiring, almost like a TED event. You might not be using bleeding edge technologies on a day-to-day basis, but perhaps it’ll open your mind to what other people are doing with software…

Bulk inserting data into SQL Server

Let’s say with have a simple table in SQL Server CREATE TABLE [ dbo ].[ test ]( [ Value ] [ varchar ]( 36 ) NOT NULL ) …in which we want to insert thousands of values (Guids) from a .NET application. One by one A naive approach is to insert one at a time, like this: public void OneByOne () { const string sql = "INSERT INTO [Test] ([Value]) Values (@Value)" ; for ( var i = 0 ; i < count ; i ++) {…

Review of the HP Envy 13

Note: This isn’t a particularly well balanced, scientific review comparing all 13” laptops on the market. This is just the thoughts of one man who bought one laptop. I was in the market for a new laptop for work. I wanted a 13” (ish) Core i7 (7th gen), 16GB RAM and a 512 GB SSD to replace my 6 year old Lenovo X1. I compared a few laptops on the market: The HP Envy stood out on three counts:…

Benchmarking Image Interpolation in .NET

I am attempting to improve the performance of image resizing in C#. This StackOverflow answer provided some excellent pointers for improving performance. I found these tips make a difference: Set pixel format to PixelFormat.Format32bppPArgb when creating a Bitmap. Set Graphics.CompositingMode to CompositingMode.SourceCopy . Set Graphics.InterpolationMode to InterpolationMode.NearestNeighbor .…

Comparing Microsoft Orleans and Azure Service Fabric Actors

Introduction Never has there been such a good time for C# developers wanting to develop software based on Virtual Actors . At the moment there are two systems available, Orleans and Service Fabric Reliable Actors . Other actor frameworks are available of course. On the JVM there is Orbit , a Virtual Actor implementation, and Akka with more traditional actors. In .NET there is also Akka.NET , a…

The Good Parts

Yesterday I was trying to learn F# by reading through the O’Reilly book and trying a few code samples. I then made a flippant remark: I wish someone would write 'F# - the good parts' &mdash; Richard Astbury (@richorama) May 24, 2016 I got quite a few responses, with people joking that it was all good, or all bad, but I also got serious offers of help. I’ve spent some more time thinking about this,…

Orleans Hello World - 2016 Edition

Orleans has seen lots of improvements over the last year, in terms of the client APIs, the configuration and installation. So the process of getting started is now a little different. Let’s walk through setting up a grain, with a silo host and client application. Creating the grains First of all, open Visual Studio and create a class library which will host our grains. Note that at the time of…

Continuous Integration on the Cheap

Continuous integration is a development practice where every commit to a repository is built and tested. There are some excellent services available, such as Travis CI and AppVeyor which you should use. They’re even free for open source projects. I wanted to build my small .NET application, which is held in a private BitBucket repository, without having to pay anything for a CI service. I don’t…

Syncing data with SQL Server

When building occasionally connected apps, we frequently want to synchronize data between client and server. It’s common to build REST APIs to retrieve records from a database that have changed since we last connected. All too often I’ve seen dates as way of keeping track of a point in time since changes occurred. I think this is a bad idea (as Einstein taught us, time is not reliable ). This post…

Reactify

In this series of blog posts, we’re looking at how to set up a simple web app in node. In the previous installment we looked at building an API in node, and then consuming it from a web app using browserify to build node modules into a JavaScript file for the browser. In this post we’ll look at using react to render the data on the screen. Installing dependencies We’ll need a couple more modules,…

Enter the Browser

In this series of blog posts, we’re looking at how to set up a simple web app in node. In the previous installment we looked at storing data, the node way. In this post we’ll look at moving code into the browser, to make a single page application - the node way! Creating an API Let’s add some extra routes to our express app, to allow data to be posted and retrieved in JSON format. The code is very…

Storing Data

In this series of blog posts, we’re looking at how to set up a simple web app in node. In the previous installment we looked at serving angle brackets, both static files and server-side templates. In this post we’ll look at persisting data to a database. The node way. A Basic Todo List A simple todo list is a great way to explore persisting data. Let’s create a new view to allow users to…

Serving Angle Brackets

In this series of blog posts, we’re looking at how to set up a simple web app in node. In the previous installment we got the basic set up running. In this post we’re going to put the plumbing in for serving html, both static and dynamic pages. Serving static files We could serve static files using express to match on a given path like this app.get('/filename', ...) and returning the file in the…

Setting up Node and Express

I’ve been talking to a few people lately about how I build web applications. There’s no single right-way of doing it, but here’s my workflow, split into small blog posts you can follow. First of all, let’s create a web server using node.js. Setting Up As a prerequisite, install node.js. You can download the latest version here . You’ll also need somewhere on your computer to save the files you’re…

Setting up a Google Hangout On Air

Setting up a Google Hangout is not obvious, here are the steps I take to create one. 1. Create the Hangout On Air Go to https://plus.google.com/hangouts/onair , and click ‘Create Hangout On Air’. 2. Configure the Hangout Set the title, description, start and duration. I also invite the relevant people/circles. You should see your hangout in a list here: https://plus.google.com/events You’re all…

Optimistic Concurrency in Orleans

Introduction Orleans helps the developer with concurrency problems in a distributed system, by providing single instances of your objects running in a single thread (we call these grains). This eliminates problems such as competing threads attempting to access singleton resources. However, concurrency problems can still be encountered. Perhaps you have two users of your system looking at the same…

Thoughts on Deploying Orleans

Yesterday we had a very interesting and productive Orleans meetup, which included the Orleans product team (Sergey and Gabriel) as well as Hoop from 343 Industries. I suggest you watch the recording if you’re interested in the future of Orleans. On the call Sergey mentioned that he would like to make the deployment of Orleans easier. Here are my thoughts. Azure SDK Plugins The Azure SDK has a…

Running io.js on Azure Websites

Download the io.js binary io.js can be downloaded here : https://iojs.org/download/ You just need the iojs.exe file itself which you can get from the nightly builds, for example: https://iojs.org/download/nightly/v1.0.0-nightly2015011284fa1f8c46/win-x64/ Place this file in a bin directory. Configuring Azure To tell Azure Websitest that you want to use this version of node, rather then the version…

Bootstrap provider in Orleans

Thanks to Yevhen Bobrov for pointing this out. The default behavior of an Orleans system is to respond to external signals. Your grains are activated when required, so with no requests coming into the system, nothing happens. The bootstrap provider enables you to hook in some code at silo startup. There are a variety of reasons for doing this, perhaps you want to set some local grains up, or…

Grain placement in Orleans

The default grain placement behavior in Orleans is to activate grains on a random silo in the cluster. However, it is possible to change this behavior on a grain-type basis, by adding an attribute from the Orleans.Placement namespace to the Grain interface. using Orleans.Placement ; namespace MyGrainInterfaces { // you should probably just choose one of these! [ LoadAwarePlacement ] […

Languages

Disclaimer, this post is opinionated, poorly researched, and really just the thoughts in my head. In the office we have a healthy, ongoing discussion about language choice. We generally discuss some hypothetical long term (10, 25, 100 year?) software project, and which language would be the most suitable. With no real requirements it’s more of a fun debate than a serious design exercise, but you…

Thoughts on Julia

I have been playing around with the Julia programming language for about a week. I like it. It has a easy to read syntax, and makes sense. What surprised me the most was after an afternoon I had submitted two PRs on GitHub for libraries in the HTTP stack. It’s not normally the case that I can get my head around a language that fast. Ok, my contribution was small, and I have by no means mastered…

Farewell Wordpress

I have moved my blog to GitHub. I’m fed up with wordpress, and prefer the simplicity of Jekyll and git, using GitHub pages for hosting. The code highlighting is also more pleasant (and supports Julia!). function foo () println ( "hello world" ); end You can fork my blog if you like, and use it to create your own.