Recently I have been working on moving a large mature XAF application from .NET Framework to .NET Core. I was asking Claude Opus 4.8 and Fable to help me create a solid plan. However I noticed the tone and register of Claude’s writing has changed in recent versions. It seemed to use flashy phrases and vocabulary like it was trying to show off. Somebody on Reddit said: Opus 4.8 talks like a…
I have converted this whole blog from Octopress to Hugo and modernised the theme. I haven’t blogged in a while, and the prospect of getting Octopress to build on a modern machine had become its own deterrent. So before I could write anything, I had to do something about the platform. But I’m not sure I would ever have bothered until Claude Code made things easy.
Tomorrow could be an exciting moment in the history of maths. Sir Michael Atiyah is presenting a proof of the Riemann Hypothesis at the Heidelberg Laureate Forum which will be available on their youtube channel . There is a good angle by Ken Regan on the Gödel’s Lost Letter blog . The Riemann Hypothesis is one of the most important unsolved problems in mathematics and the subject of one of…
This is part three of a series of posts about the software and tools I find invaluable. See Part 1: essential applications and Part 2: Visual Studio tools . In this post I’m covering the online applications and iPhone apps I find indispensable. Gmail Does the job. Lastpass Everyone needs a password manager. Pinboard (and the PinSwift iPhone app) The best bookmark tracking tool. Simple, fast,…
This is part two of a series of posts about the software and tools I find invaluable. See part 1 and part 3 . CodeRush I’ve been using DevExpress CodeRush since 2005. Check out this video tutorial for a lightening tour of a lot of the features, and look at the DevExpress youtube channel for a load of other tutorials . NCrunch NCrunch provides continuous testing for Visual Studio. When I make…
This is the first in a series of posts where I list the applications that I use and enjoy the most. See part 2 and part 3 . A bit of preamble, my most powerful machine is a Windows-only desktop with lots of RAM and an SSD drive. I use it almost exclusively for development. I also have a Macbook Pro which is configured to dual-boot Windows and MacOS. The Windows machine is more or less a mirror of…
I finally worked out why my Macbook was randomly sleeping. TL;DR - Skip to the end . Clues It only seemed to happen when I was working while sitting up on the bed with the computer on my lap. It seemed to be related to the position of the computer or possibly the lid. The computer would sleep. I’d wake it and login again. Continue. Sometimes it would happen once. Sometimes three times in ten…
I was inspired by two events to jump back into serverless framework. Firstly, I attended the second London serverless meetup yesterday evening which was excellent and showed just how much enthusiasm there is for serverless architectures. Check out their new logo on the left. It was significant that each of the three speakers announced that they are actively hiring serverless developers. Secondly,…
In the last post I built a PHP capable sample project for the Serverless Framework . In this post, I’ll show a concrete use of it. The service I’m building connects runs a PHP function for pretty-printing chess games from the lichess online chess server . James Clarke has written a PHP function to do this using fpdf17 . The lichess exporter takes the game id of any game that has been…
The goal of this post is to explain how to call a PHP function from within an AWS lambda using the Serverless Framework . Prerequisites First check everything we need is installed. $ serverless --version 1.1.0 $ node --version v7.1.0 Install the sample PHP function Install my sample Hello function from my github repository. $ sls install --url https://github.com/ZeroSharp/serverless-php 1 2…
When an XAF list view has no selection-based actions available, the selection box still appears in the grid. Users get confused. In this post, we’ll look at a workaround. The problem In the XAF MainDemo, lets make Departments read-only for the User role. 1 2 3 userRole . AddTypePermissionsRecursively < Department >( SecurityOperations . Create , SecurityPermissionState . Deny ); userRole .…
Sometimes the deadline has arrived and you still have some failing tests. After a discussion with the dev team, you decide to deploy anyway and fix the bugs for the next release. You need to get the build server to ignore the tests. One way is just to mark the test with the [Ignore] attribute. 1 2 3 4 5 6 [Test] [Ignore] // TODO: Fix this test before the next release! public void Test () { // Some…
I’ve blogged before about using BoxStarter to efficiently provision a new development machine. This is working very well for our developers. Maintaining the installation script takes a bit of effort but the benefits are worth it. Recently, the chocolatey developers have been making things more secure and recent versions now require a checksum with any downloaded package. For now, there seems…
Both Chrome and Firefox have a ‘feature’ which allows a user to ignore future calls to confirm() . Once this has been checked, any subsequent calls to confirm() return false immediately without showing the window. In XAF, this behaviour prevents the application from working correctly. For instance, it becomes impossible to confirm a deletion. The following controller provides a work…
I’ve been trying to get better at chess by playing on chess.com . I often analyse my games with the help of a computer to see where I made mistakes. My favourite way of doing this is to make use of Lichess.org ’s import functionality. The latest version of chess.com has greatly improved its own post game analysis, but I still much prefer Lichess’s. So I would often download the…
This is the final part of an ongoing series about the Serverless framework . In the previous posts, the PasswordGenerator always returned ‘Password’. Instead each date should corresponds to a new unique password. We’ll make use of the Crypto-js node package and we’ll see that the AWS lambda copes just fine. Installing a node package Pull in the crypto-js package into the…
This is part of an ongoing series about the Serverless framework : Part 1 , part 2 , part 3 . New version 0.3.1 Edit: since the original version of this post, a new version 0.3.1 of Serverless was released. I have updated the tutorial below to reflect the newer version. Also, TSD has been deprecated in favour of Typings so I’ve updated to use Typings instead. All parts have been updated for…
This is part of an ongoing series about the Serverless framework . For those following along, part 1 and part 2 have been updated for the current latest version of Serverless 0.3.1. In this post, we’ll discuss how a Serverless function actually works. The guts of a serverless function When we visited the deployed endpoint at the end of part 1 , it correctly returned some JSON content. 1 2 3…
Happy New Year everyone! This is the second part of a series about the Serverless framework. Read the first part to get up and running. First I’ll describe the webservice I’m building. Then we’ll configure our environment for Typescript and Mocha testing. Poor man’s dual factor authentication via a password of the day I’m the technical lead for an enterprise…
New version 0.3.1 Edit: since the original version of this post, a new version 0.3.1 of Serverless was released. I have updated the tutorial below to reflect the newer version. I was in the middle of a blog post about the JAWS framework and before I had finished it changed its name to the Serverless framework . It is a very clever way to build apps without worrying about provisioning server or…
This is the second and final dive into some of the new DevExpress XAF 2015.2 features. The first part covers the Report Designer and the new XML serialisation. Batch editing Another feature I’m excited about is the support for batch editing within the web application grids. Let’s see what happens when combined with the validation rules. What happens if I edit two rows but only one has…
Last week, DevExpress released 2015.2.3, their second major version of the year. There are already some good blog posts about the changes: Michael Bogaerts Gustavo Marzioni DevExpress What’s New Rather than repeat general overviews provided in these, this two-part blog post is more of a ‘deep dive’. In particular I’ll be looking at two of the new features in the expressApp…
This is the third part of a series about migrating a large application from XAF 12.1 to XAF 15.1. In this part I will compare the results of a simple stress test between the versions. I have described in previous posts how to stress test XAF applications . One of our most basic tests is to simulate 25 users cycling through all the navigation tabs for an hour. I’m happy to report there is a…
This is the second part of a series about migrating a large application from XAF 12.1 to XAF 15.1. In the 13.1 release, DevExpress made a change to the way XAF Validator class is used. It now requires an IObjectSpace parameter corresponding to the object. It is needed to correctly evaluate any rules which are descendants of the RuleSearchObjectProperties . These include:…
I am the principal software architect for a treasury application in use by over 100 large multinational corporates. Upgrades are generally met with reluctance in the enterprise world and so we’ve been somewhat stuck on an old version of the expressAppFramework. Recently I’ve been pushing to move to the newer version and I have spent about three weeks migrating the substantial code base…
How can I force a full garbage collection easily within an ASP.NET application? The method here is for XAF web applications but the same approach should work with any ASP.NET app. First up: Never mess with the .NET garbage collector. I sometimes mess with the garbage collector in .NET when I’m trying to pin down some memory problem. Also, after a load test , I prefer to force the garbage…
When I recently upgraded to Visual Studio 2015, everything seemed to go very smoothly except that whenever I debugged my main application I got a dialog window with the following strange error: The procedure entry point could not be located in the dynamic link library C:\...\bin\Debug\netutils.dll. After pressing OK everything seemed to work as normal. After a considerable number of dead ends, I…
For a while I’ve noticed an annoying slowness when debugging ASP.NET applications from Visual Studio. Just after every page load it takes about a second before the buttons become clickable. I noticed mostly when debugging XAF applications, perhaps because the pages are quite complex. Turns out the culprit is something called Browser Link which was introduced in Visual Studio 2013. It’s…
Here’s a quick hack when your CSV file has a different separator than Excel is expecting. Add this on the first line of the CSV file: sep=; or sep=, This will override system setting for list separator character and Excel will open the file correctly. Note: Excel expects the separator to match the one defined in the Control Panel/Region/Formats/Additional settings/List Separator . On a…
This post is an overview of the brand new version XAF 14.2. The truly outstanding new feature is the ASP.NET report writer which is now available in all XAF applications. A few months ago, we lost a potential sale because the customer wanted the ability to create custom reports from within the browser. We told them it was impossible to provide a fully-fledged report designer within our web…
ELMAH (Error Logging Modules and Handlers) is an open source library for logging unhandled exceptions. This post explains how to get it running with the DevExpress XAF main demo. A couple of amazing facts about ELMAH. It has been around since 2004! It was written by Atif Aziz who happens to be an old school-friend from the International School of Geneva. XAF provides quite extensive error handling…
This is the fourth and final part of a series about using Roslyn with dependency injection to create a flexible and powerful plug-in framework. Here I review the parts of the solution that deal with the Roslyn runtime compilation of plug-ins. Check out the working example on GitHub . Previously Part 1: The Goal Part 2: The Solution Part 3: Dependency Injection Roslyn Let’s look at some of…
This is the third part of a series about using Roslyn with dependency injection to create a flexible and powerful plug-in framework. Here I review the parts of the solution that deal with dependency injection. Check out the working example on GitHub . Previously Part 1: The Goal Part 2: The Solution Dependency injection The first trick is to use dependency injection to create any instance of the…
Previously: Part 1: The Goal The solution The code for the example is available on GitHub . How it looks So here’s the Hello World page in production: . We navigate to the plugins view and create a new replacement for the HelloWorldGenerator: . Without restarting, we can return to the HelloWorld page and see that the new class is being used because the output has changed. . If you delete the…
The goal How can we replace a given class’s code with new code at runtime? In particular, how we can we do this while allowing dependency injection and sidestepping assembly versioning issues. Let’s say you have bunch of classes like this: 1 2 3 4 5 6 7 8 9 10 11 12 13 public class SomeGenerator : IGenerator { public SomeGenerator ( ISomeDependency dependency , IAnotherDependency…
Whenever NuGet updates or restores a NuGet package, the config files within it are overwritten. Here’s a method to make sure the changes are reapplied via a config transform whenever the solution is built. I’m using the NUnit.Runners NuGet packages. To get our coverage tool to play nicely, I need to replace <supportedRuntime "v2.0.50727"> with <supportedRuntime "v4.0.30319"> within the…
The purpose of this post is to raise your awareness of a toggle which exists in the DevExpress XAF framework which can significantly improve UI performance in the web application. The biggest XAF project I work with has one very complex business object. The layout for this screen includes about 100 properties, several nested tabs, some custom editors, several collection properties and a whole lot…
I’ve been playing around with Boxstarter to configure my entire development environment with hardly any user intervention. Here are the steps: Install Windows 8.1 on a new machine. Login. Open a command prompt and enter the following. START http://boxstarter.org/package/nr/url?http://bit.ly/1kapDXI That’s it! Boxstarter will self-install via ClickOnce, asking for various confirmations…
CCWatcher is a great iPhone app for any developer who is using CruiseControl.NET, Jenkins or Hudson for their continuous integration. We have used CruiseControl.NET for several years to automate all builds. The build kicks off automatically whenever we push changes and this frequently happens a few times a day. We aim to have everything green at the end of every day. A full build with unit tests…
I have finally got around to getting Glimpse working with XAF. Glimpse is an amazing extensible ASP.NET plug-in which gives you valuable information about what is going on within your server in production. It’s also very pretty. Let’s jump right in and have a look at what XAF looks like with Glimpse running. That banner along the bottom of the screen is the Glimpse heads up display…
This is the second part of a review of the new DevExpress 13.2. In the last part we looked in-depth at the new Reports V2 . In this part I’ll go over some of the other new features including the support for warnings and confirmations in the validation module. Soft Validation Rules With 13.2, DevExpress adds support for warning/confirmation messages to the validation engine. Warnings can be…
The first version of XAF I ever installed was called eXpressApp-1.0.CTP2.exe in July 2006! It has certainly come a long way since then. This post is the first part of an overview of the brand new version XAF 13.2 which will be released any day now. This part is an in-depth review of the new report writer features (still in beta). Reports V2 Prior to this version, XAF reports were not source code.…
This post proposes a workaround for a specific XAF rendering problem related to recent versions of Google Chrome. Here is an XAF list view as it looks with IE 10 and DevExpress 13.1.8. This is how the same view looks with Chrome 30. Notice how the column widths are rendered poorly. The minimum space is given to the string field and the date and bool fields are too wide.
In the last post we looked at three solutions to a relatively simple XAF requirement. In this post I’ll discuss another XAF challenge, explain the options and provide a versatile and maintainable solution. In my DevExpress XAF application, I have an object which has several properties like this: In each case, the field is a comma-separated list of currency codes. These fields are not very…
This post aims to look at various solutions to a seemingly simple layout change. With DevExpress XAF , a lot of the difficult things are easy: authentication, authorisation, ORM, reporting, complex form layouts, themes, etc., are all made easy by XAF. On the other hand, some of the easy things are hard. It can be frustratingly difficult to make a small modification to the basic layout. We will…
NDepend is a commercial static analysis tool for .NET managed code. It’s been around a long time (since 2004!). Version 5 was just released and in this post I’m going to try it out on the DevExpress MainDemo. In the past I have always thought of NDepend as a complex tool. I was never sure where to start. In version 5, a lot of work has been done to improve the learning curve. The…
I always run Visual Studio as an administrator. There are various reasons why this is necessary including: using IIS with a web application running web UI tests profiling In fact there’s a list on MSDN of all the actions you require administrator permissions. Here is a way to make sure Visual Studio always opens with elevated privileges, even if you double click on a .sln file. (I’m…
This post is about fixing an annoyance whereby Visual Studio refuses to update extensions when running as an administrator. I always had a problem when an update to an extension or tool tried to open the browser. For instance, I would see this notification in the system tray. And then when I went to Tools/Extensions and Updates… in Visual Studio, I’d get to something like this: But…
In this post I will demonstrate how to add MiniProfiler to the XAF MainDemo web application. MiniProfiler is a simple fast profiler with a pretty user interface. It is fast because it only profiles code that you have explicitly decorated with the MiniProfiler.Step() method. It was designed by the team at StackOverflow . First, add the MiniProfiler NuGet package to the MainDemo.Web project. Then…