Monday, 24 April 2017

Locating an element to test with FlaUI

The WinForms application I'm trying to test is legacy in more ways than I'd like.

Here is FlaUI Inpect looking at a login form I want to test. I need access to 4 items. Each has an AutomationId. The ids are: textUser, textPINCode, buttonHalt, buttonLogin

These 4 controls are custom controls derived from Krypton controls. I think the Krypton controls derive from Windows Forms 2.0

Suppose I have a handle on the top level window ("FormSplashScreen"). What is the XPath to get one of the 4 I want (say textUser)?

Thursday, 6 April 2017

AOP - Aspect Oriented Programming

Aspect-oriented programming was first described 20 years ago due to work of a team led by legendary programmer Gregor Kiczales [who also co-authored the book "The Art of the Metaobject Protocol" ]

What is it?

AOP aims to eliminate the noise of cross-cutting concerns, CCC, by putting them all in one place while still allowing the code previously "tangled" up with CCC to work just as before. The business logic is clearer, easier to read and maintain.

AOP concepts

  • cross-cutting concern, CCC: Is code which applies all over the place and often relates to getting an application to work rather than to any business concern. It cuts across an application. e.g. authentication, logging, exception handling, caching data, wrapping a transaction around something, auditing, ...
  • join point - a place in code where it can be 'cut', joined to, or intercepted. e.g. just before I call svc.SaveName()
  • Pointcut - a set of join points. e.g. just before any SaveName() method in project UI is called.
  • advice - some code to be applied by AOP
  • aspect - a combination of Pointcuts with advice
  • tangling - when CCC(s) are mixed with business or core logic like spaghetti such that the core logic is confusing to read.
  • scattering - having CCCs in multiple methods and classes
  • weaving - how AOP applies aspects to core logic.

Potential applications for ApoG

  • Authentication and Authorization : by putting this all together in one place the problem of security is not confused with other business logic.
  • Data caching
  • Exception handling - hopefully including all unhandled exceptions. ApoG currently has 991 exceptions.
  • Logging - There are over 2000 of these
  • Transaction wrap-around e.g. to save a unit of work. ApoG currently does not have unit of work transactions but these will be needed in future.
  • Auditing? - i.e. The process of saving PDF files and entries to the database can be put in one place.


  • Cleaner code
  • DRY - It applies Don't repeat yourself. It reduces code duplication
  • SRP - It applies the Single Responsibility Principle. Ensures a method or class does only one job.
  • Readability is improved - because one can read the core logic without being distracted by the CCCs
  • Maintenance is easier - because code relating to a CCC is in only one place it is easier to update. Because core logic is cleaner and uncluttered by tangential concerns it is easier to change just the core logic without interfering with anything else.
  • Money is no object because every AOP tool but one is free. Dozens of AOP tools have been written.


  • ????


Top 20 AOP tools

Interception, code. License: MIT OSS

NConcern: Is a relative newcomer. License: OSS

PostSharp: This has been the main .net AOP package since it arrived on the scene. License: Commercial software. Licenses are up to £449 per developer for a lifetime license. Limited licences are less. Not so expensive. Consider: If AOP improves productivity by 5%, the saving is at least £2500 per year, when one considers the average annual cost of a programmer is certainly over £50k/year. PostSharp Express is free but limited.


More articles:

AOP with the RealProxy Class | Principles of AOP, from 2015


Also see book listed above: AOP in .net. Although it may look like many AOP packages are not well documented, they often use similar implementation patterns. Like dependency injection, once one understands the principle, changing tools is relatively easy.

Thursday, 9 February 2017

F-sharp books.

Learn F# (MEAP)IntroIsaac AbrahamManningApr-2017400
Real-World Functional Programming with examples in F# and C#Tomas Petricek with Jon SkeetManningDec-2009560
Beginning F# 4.0Robert Pickering, Kit EasonApress2016309
Friendly F# (Fun with game programming)Costantini, Giulia & Maggiore, GiuseppeO'ReillyAug-2011191
F# SuccinctlyFreeRobert PickeringSyncfu-sion201296Free
Analyzing and Visualizing Data with F#Tomas PetricekO'ReillyOct-201547Free, from publisher
FSharp Specification 4.0Fsharp FoundationFsharp Founda-tion365Free, Not really a book but can be published as such
F# Web ProgrammingCommunity for F#GitBookFree. Not really a book because it's just a set of hints!
F# Survival GuideJohn Puopolo, Sandy SquiresCTO Corner2012171Free.
Suave Music Store example77
The Book of F#Interm-ediateDave FancherNo Starch PressMar-2014312
Professional F# 2.0Ted Neward Aaron, C. Erickson, Talbott Crowell, Richard MinerichWrox2011434
Programming F-sharp 3.0, 2eChris SmithO'ReillyOct-2012476
Testing with F#Mikael LundinPacktFeb-2015286
F# for DevelopersTao LiuMicro-soft2013619
Windows Phone 7.5 Application Development with F#Web / mobileLohith G.N.PacktApr-2013138
Building Web, Cloud, and Mobile Solutions with F#Daniel MohlO'ReillyNov-2012176
F# Applied, A practical guide to Web dev in F# using SuaveTamizhvendan S201696link
Expert F# 4.0ExpertDon Syme, Adam Granicz & Antonio CisterninoApress20155824 editions of this book
F# High PerformanceEriawan KusumawardhonoPacktJan-2017338
Mastering F#Alfonso García-Caro Núñez, Suhaib FahadPacktNov-2016264
F# 4.0 Design PatternsGene BelitskiPacktNov-2016318
F# for Quantitative FinanceJohan AstborgPacktDec-2013286
F# 4.0 Programming CookbookKevin AshtonPacktAug-2017371
F# Deep DivesEdited by Tomas Petricek, Phillip TrelfordManningDec-2014372
F# for Machine Learning EssentialsMachine LearningSudipta MukherjeePacktFeb-2016194
Machine Learning Projects for .NET DevelopersMathias BrandewinderApress2015300
Learning F# Functional Data Structures and AlgorithmsCompu-ter sciencyAdnan MasoodPacktJun-2015206
Fsharp for ScientistsJon D HarropWiley2008334
F# for Technical ComputingJon D HarropFlying frog2010279
Programming Language ConceptsPeter SestoftSpringer2012278
Functional Programming Using F#Michael R. Hansen, Hans Rischel CUPMay-2013372

Of interest. Maybe watch/read

Friday, 28 October 2016

VS code, core. Microsoft on all 3 platforms.

Microsoft are writing tools to develop and publish their applications on all 3 platforms. core is a slimmed down open source with web forms mercifully removed. Visual Studio code is a lightweight (by Microsoft standards), programming editor. It's cross platform (iOS, Linux, Win) and not too fat. The setup file I downloaded was 32Mb, taking 133.6Mb of disk space. It installed seriously fast (compared with other dev software from Microsoft).

I suppose this is a virtue of giving geeks more control over the development side. They will actually write tools for authoring software on any and every platform. There is presumably a Chrome version in the works too? Any application written should be portable across platforms with ease. It's a completely different philosophy from what we've been used to.

This blog is just a log of Shawn Wildermuth's long (> 9 hours) Pluralsight course "Building a Web App with ASP.NET Core, MVC 6, EF Core, and Angular", as I acquaint myself with the latest version. So much of it is command line driven, I feel I should write it down to remind myself what to do next time.

Entering code . from the command line executes VScode at lightning speed. e.g.

F:\code\CSharp\HelloWorld>code .

It loads with the project in that folder "HelloWorld", but without intellisense or coloration because each individual language must have support added separately. To add C# support, Ctrl+Shift+X shows a list of extensions, from which I selected C#. Added it, enabled it, the code editor restarts in less than a second. VSCode does not create projects like full Visual Studio. We need to use nodejs and npm for that. My copies of these two were quite old.

F:\code\CSharp\HelloWorld>node --version v4.4.3 F:\code\CSharp\HelloWorld>npm --version 2.15.1

So I installed a new nodejs from, which seemed to take forever! Snooze. Waking up several minutes later I do:

F:\code\CSharp\HelloWorld>node --version v6.9.1 F:\code\CSharp\HelloWorld>npm --version 3.10.8

Now, I'm happier creating a new project from the command line using yoeman, after first installing yoeman (with the global option), the generator is also installed

F:\code\CSharp\HelloWorld>npm install yo -g F:\code\CSharp\HelloWorld>npm install generator-aspnet -g

Now I will generate an application. First moving up a level out of my current project.

F:\code\CSharp\HelloWorld>cd.. F:\code\CSharp>yo aspnet

We see a command line menu system:

? What type of application do you want to create? (Use arrow keys) > Empty Web Application Empty Web Application (F#) Console Application Console Application (F#) Web Application Web Application Basic [without Membership and Authorization] Web Application Basic [without Membership and Authorization] (F#) (Move up and down to reveal more choices)

Pick "Web Application". If the command arrows are not working just enter the number for that choice ( 5 ) Select the Bootstrap option and call it FunWithYo

navigate to it.

F:\code\CSharp>cd FunWithYo F:\code\CSharp\FunWithYo>dir

Attempting to run it at this stage shows it's still missing So we must restore it, before running it.

F:\code\CSharp\FunWithYo>dotnet restore F:\code\CSharp\FunWithYo>dotnet run

The whole can be seen in a browser on port 5000 localhost:5000

My frist core MVC application up. Ctrl+c (from the command line, where it is running) stops it.

Once the new project is complete, code ., opens VS code with the current project loaded. We need to answer Yes to the question
Required assets to build and debug are missing from your project. Add them?

Wednesday, 16 March 2016

Programming Languages and programming

There are probably five main styles of programming, which may overlap, and often relate to particular languages. We have imperative, declarative, object oriented, functional and logic programming styles. These are more commonly called programming paradigms than styles. The list below has each style with an iconic sibling language to implement it.

  • imperative - C, or BASIC
  • declarative - SQL
  • object oriented - Smalltalk
  • functional - Haskell
  • logic - Prolog

Imperative programming begins with the 3 rules of coding: sequence (code executes left to right, top to bottom), selection (if, case) and iteration (loops), and may develop to structured programming. There's something very low level and intuitive about imperative programming but the best programming is rarely done in this style. With imperative programming, our code explains how a problem is solved - the solution can often be understood by tracing through the steps in the code. Imperative code often has a closer relationship to machine code than other styles.

With declarative programming, one declares a statement or code block to solve a problem. Declarative features are generally higher level. We see declarative features in SQL, many functional and logic programming languages.

Object oriented (OO) programming began in the late 1960s, cumulating in Smalltalk (Alan Kay: 1970 to 1980) and design patterns (1990s through to the noughties). 1980s onward saw several post-Smalltalk languages implementing OO features: C++, Java, C#, Javascript. These four now dominate the world of code. Yet your OO-purest is a Smalltalk coder at heart!

Functional programming (FP) began in academia. Elements of LISP (Designed by John McCarthy, 1958) are functional, Robin Milner created ML in 1975. 1980s saw a commercial FP language: Miranda (David Turner). Haskell began in 1987, mostly as a copy of Miranda, ever refining itself, yet staying lean and clean. Modern functional programming stresses, functions as "first class" elements of the language, declarative programming, prefers immutable data. Other commercial FP languages are: OCaml, F#, Scala, Clojure, ...

Logic programming languages began in earnest in the early 1970s with Prolog. Coding styles are very declarative and applications often have an AI basis, data analysis or both.

All these styles mix, to some extent, in actual languages in use. Yet a language is classified with the style which is most important to it. For example we call Scala a functional programing language, even though it is very OO too. Javascript has always had functional features but does not have immutable data. There's even a style called functional Javascript. Yet Javascript will always be an OO language first.

I began this in response to a question : what programming language should one learn first? It's not really a sensible question. You should learn each of the programming language styles, and sub-styles. [e.g. sub-styles: structured programming as a sub-style of imperative programming, design patterns as a sub-style of object-oriented programming, They are not really sub-, but more like meta-, or supra-styles]. We can also recognize certain idioms that span all styles: DRY, SOLID, ... A lot of good coding practices seem orthogonal to implementing specific use cases. You could begin with imperative programming (first six books in list below), and apply the wisdom in the books to your code. Object-oriented languages dominate business, so read books 7 to 12, but only 12 is specific only to OO (in a sense). Finally, you need at least some functional programming and the last two are good starters.

Beginner programmer reading list.

TBH, A beginner can begin with any programming, or programming language book. Yet you won't really have graduated from beginner until you've read most of the 14 books below. Read and apply the lessons of all 14 and you're past beginner/junior programmer level.

  1. Code Complete: A Practical Handbook of Software Construction, 2nd Edition, by Steve McConnell
  2. The Art of Readable Code, by Dustin Boswell and Trevor Foucher
  3. Programming Pearls (2nd Edition), by by Jon Bentley
  4. 97 Things Every Programmer Should Know, by by Kevlin Henney
  5. Clean Code: A Handbook of Agile Software Craftsmanship, by Robert C. Martin
  6. Test Driven Development: By Example, by Kent Beck
  7. Agile Principles, Patterns, and Practices in C#, by Robert C. Martin and Micah Martin
  8. Refactoring: Improving the Design of Existing Code, by by Martin Fowler
  9. Working Effectively with Legacy Code, by by Michael Feathers
  10. Growing Object-Oriented Software, Guided by Tests, by Steve Freeman and Nat Pryce
  11. Agile Java: Crafting Code with Test-Driven Development, by Jeff Langr
  12. Object Design: Roles, Responsibilities, and Collaborations, by Rebecca Wirfs-Brock and Alan McKean
  13. Programming in Haskell, by Graham Hutton
  14. The Joy of Clojure, 2nd Edition, by Michael Fogus and Chris Houser