Posts

NestJS tutorials

NestJS is a react framework for building efficient, scalable, server-side applications. It also provides built in dependency injection out of the box, which I really like the sound of! I plan on learning about this framework and the ansillary frameworks, libraries and modules that surround it. I’m fairly new to front-end development, so I hope this will be useful to people in a similar position. Getting Started First up, read the NestJS intro and overview docs , which shows how to setup the dev environment, how to generate a hello world app, and some of the basics of how things fit together. I often come up with trivial problems to solve when having a go of new frameworks. In this case I wanted to eventually implement these rules: AskQuestion - what's for tea? - get strategy based on person asked - if mike, provide response based on day of the week - if mrs, randomise response between "beans on toast" and "scrambled eggs on toast" - i...

Fun Retros - Crazy 8 + Impact Effort Map

This 60 minute session is designed to find problems that we might not collectively be aware of, gather ideas on how to solve them, prioritise those ideas, and ensure that they are enacted. [10 minutes] on the jamboard, ask the group to write post-its of problems that need to be solved. These post-its should follow the sentence structure how might we… e.g. How might we get customers to contact us when they have an issue with our product? , or How might we migrate more of our customers from our old system to the new one [4 minutes] ask them to dot vote the post-its with 2 or 3 votes each. Choose the top voted How might we.. question, or if there is no clear winner, ask the group to collectively choose one. [10 minutes] Crazy eight : ask the group to write one post-it every minute for 8 minutes with ideas on how to solve the chosen problem. Start a timer, and when each minute passes ask the group to move on to their next idea. [10 minutes] ask each participant to talk through the...

next.js testing with jest

I stumbled upon the testing overview in the react docs, which says The default template of React Native ships with [Jest](https://jestjs.io) testing framework . Interesting. I’ll have a quick go of Jest just to see what’s what. Jest [about 30 minutes later…] Well… I wish I’d stumbled across this first, this was super easy! yarn add --dev jest in package.json: { "scripts" : { "test" : "jest" } } Create a ./tests/foo.spec.js file with the contents: test ( 'true is true' , ( ) => { expect ( true ) . toBe ( true ) ; } ) ; And run yarn test The nice thing about Jest, is that it: has fluent syntax so I don’t feel the need for chai, appears to have mocking functionality, but we’ll see later if that’s any good for TDD. This might mean we don’t need sinon. it clearly is a replacement for mocha, so we can swap that out Enzyme on the other hand might still add value if it makes testing components easier! We’ll ...

next.js testing frameworks

I figured the next step was to learn how to approach writing react components using TDD. I found this guide that recommends some libraries for assertions , spies , and also a testing framework and DOM simulator . Also a test runner … Ahhh so many to learn! Why so many libraries?!? This is one of the reasons I’ve previously been so detracted from starting to learn a front-end development framework, as the learning curve appears very steep. Spoiler alert, I don’t end up using most of these, so just read on. Let’s try and understand what each library is for and where it fits in. I’ve been a C# developer for a long time, so I’ll draw a parallel between the two ecosystems. Sinonjs Sinonjs is a spies, stubs and mocks framework. To draw a parallel; it’s pretty much how I’ve used AutoMocker on C# projects. Par examplé : it ( 'needsLogin returns false when the user has been authenticated' , ( ) => { spy = spyOn ( service , 'isAuthenticated' ) . and...

next.js tutorials

I figured I’d keep track of the resources I’ve consumed on my road to learning React with the nextjs framework. I’ve previously had a play with straight React, but I’m starting from practically zero so… let’s see how this goes! Next.js Tutorials First up, I took a look at nextjs.org , which seems to have pretty good documentation and tutorials . I just followed this tutorial through from start to finish one morning. This tutorial gives you plenty of code to copy and paste, but sometimes doesn’t give much explanation as to what each bit is doing. It’s worth spending some time actually reading the code you’re copy/pasting to understand what is going on. There are links for further reading for most sections, which are also worth a read. You can also read further into any given feature in the next.js docs . I also configured a CNAME record under my domain name Name : nextjs . portfolio Data : cname . vercel - dns . com . Resulting in https://nextjs.portfolio.mikemcmillan.dev ...

Clean Engineering

In the last couple of years or so, I’ve been getting more into researching clean code and quality engineering in general. I figured I’d keep track of the resources I’ve consumed, so that I can revisit them in the future. Youtube Video Watched Clean Code - Uncle Bob / Lesson 1 Yes Clean Code - Uncle Bob / Lesson 2 Yes Clean Code - Uncle Bob / Lesson 3 Yes Clean Code - Uncle Bob / Lesson 4 Yes Clean Code - Uncle Bob / Lesson 5 Yes Clean Code - Uncle Bob / Lesson 6 Yes DevTernity 2019: Ian Cooper – The Clean Architecture Yes Agility ≠ Speed - Kevlin Henney Yes GOTO 2016 - Small Is Beautiful - Kevlin Henney No The Forgotten Art of Structured Programming - Kevlin Henney [C++ on Sea 2019] No Books Book Owned? Read? Test Driven Development: By Example 1st Edition - Kent Beck Yes No Agile Principles, Patterns, and Practices in C# 1st Edition - Robert C. Martin Yes Reading Clean Architecture: A Craftsman’s Guide to Sof...

Fun Retros - Liberating Structures - Wicked Questions

Articulate the Paradoxical Challenges That a Group Must Confront to Succeed (25 min.) The aim is to find one or more paradoxical questions in roughly the form of “How is it that we are ____ and we are ____ simultaneously?”. (put this template at the top of your jamboard) It’s important that both sides of the question are appreciative, otherwise this exercise can quickly turn into finger pointing. Once we’ve found some wicked questions, we’re not actually aiming to solve them. A really good wicked question just represents an undeniable reality. An example to help explain it, without anchoring thought processes: “How is it that we are raising our children to be very loyal and attached to the family and also independent individuals?” [5 mins] on the jamboard, add post-its of positive traits of the team. [5 mins] go through each post-it, see if there is already an appreciative opposite or paradox elsewhere on the board. If not can you think of one? [10 mins] pick out the most ...

Fun Retros - Liberating Structures - Min Specs

Specify Only the Absolute “Must dos” and “Must not dos” for Achieving a Purpose (35-50 min.) [10 mins] On the jamboard, put everything that you strive to do on a yellow post-it. And everything you try to avoid doing (bad practices, or processes) in orange. xp practices agile practises coding practises whatever you can think of [10 mins] Now imagine you’re a consultant, going into a business and trying to encourage the adoption of these practices. Your time is finite, so between yourselves choose 5 do, and 5 do-not cards that you absolute can not do without. [5 mins] All of these tickets should be important to you. So instead of dot-voting, you have $100 budget. Allocate your $100 among the tickets. http://www.liberatingstructures.com/14-min-specs/ https://www.workshoptactics.com/pages/100-dollars

Load testing with artillery

So you need to load test an application to find its maximum capacity? This set of basic scripts will get you started. Install artillery with: npm install -g artillery … assuming you already have npm installed. The premium version of artillery comes with all sorts of fancy features, such as the ability to run distributed load tests. But the free version is more than enough to do a basic set of tests. As a word of warning, if you’re running this against a production system, you’ll want to schedule it to run out of hours. loadtest.ps1 Npm only allows a certain amount of CPU to be in use by a process before it starts throwing warnings out. So to get around this, we can spawn multiple processes using this script: param ( [int] $clients = 1 ) <# .SYNOPSIS Run load tests .PARAMETER clients Runs this many concurrent load tests .EXAMPLE .\loadtest.ps1 This will run the load test with a single client .EXAMPLE .\loadtest.ps1 -clients 3 This will run the load test with three cl...

Taking a memory dump of a w3wp process

Taking a memory dump of a w3wp process Taking a memory dump of an IIS worker process in a live system can be problematic, as IIS will kill the process if it has been suspended for more than 60 seconds. Only use these steps if your application is on a high availability cluster, else you’ll take your app down! copy sysinternals procdump.exe and pssuspend.exe to target machine create powershell file with: $iispid = Get-Process svchost | ? { $_ . modules . ModuleName -eq "iisw3adm.dll" } | Select - First 1 - ExpandProperty Id $workerpid = Get-Process w3wp | Sort ws - Descending | Select - First 1 - ExpandProperty Id & ".\pssuspend.exe" $iispid Write-Output "Creating memory dump for w3wp PID $workerpid " & ".\procdump.exe" - ma $workerpid & ".\pssuspend.exe" $iispid - r (taken from stackoverflow ) 3) check the w3wp process has reached the high level of RAM usage that you’re intending to...

tempdb

Image
So what is tempdb? Well… it’s is a system database that is used by queries that contain: joins, aggregations, cursors, xml variables, triggers, online index builds, sorting, hash matching, temp tables or table variables. There are other bits that use tempdb, but they’re beyond me right now… How should it be configured? 8 tempdb files, 1024mb initial size, 256mb auto growth (unlimited), all located in the same directory. The files must be evenly sized, otherwise more traffic will go to the largest file.

Integration Testing with Cypress

To give a bit of background… I’m working with a small, cross-skilled team of Ruby and dot-net engineers, and we were interested in streamlining our awkward development process. We were feature branch based, but were hoping to incrementally move to trunk based CI/CD. One part of our process that we wanted to optimise first was the QA’s manual regression testing. Doing the same tests over and over is not only a waste of their time, but can’t be the least bit fun. For each test our QA was manually conducting we instead wanted to pair up and write an integration test. This would not only give us better confidence to release, but also expand the automation skill-set of our QA. These tests should automatically run as part of the GitLab pipeline whenever code is committed to source control. If any of the tests fail then the pipeline is to be marked as failed. What is Cypress? Enter cypress.io . This is an opensource javascript framework that can run a set of integration tests from t...

Search for Text in all DB objects

The other day I needed to alter a bunch of sprocs, views, and UDFs, as they had hard-coded references to other databases. I needed to change these to target a different database for testing some new indexes. This bit of SQL saved me a bunch of time: SELECT OBJECT_NAME ( id ) AS ObjectName , [ text ] as ObjectDefinition FROM sys . syscomments WHERE [ text ] like '%\[Foo\]%' ESCAPE '\' FOR XML PATH(' Row '), root(' Table ' ) It outputs a single xml doc that contains the definition of every database object that contained your search terms. This allowed me to easily search through them and update accordingly.

sp_blitzIndex

Some more notes after watching Brent’s How I Use the First Responder Kit: sp BlitzIndex . This sproc will analyse every index across all databases in your sql server and return a prioritised list of potential issues. EXEC sp_blitzIndex @GetAllDatabases = 1 The MoreInfo column is interesting. If you copy the SQL out and run it, it will give you more information on the indexing issue in question. E.g: EXEC dbo . sp_BlitzIndex @DatabaseName = 'YourDatabase' , @SchemaName = 'dbo' , @TableName = 'tFoo' ; If you run this, the top result set it a list of indexes that are on the target table. It shows how many seeks and scans each index has had, the size of the index, etc. Note the URL column for more information on each issue category. Missing indexes are shown in the 2nd result set. The 3rd result set shows the table definition, which is nice to have without having to mess with the SSMS UI.

sp_blitzCache

Some more notes after watching Brent’s How I Use the First Responder Kit: sp BlitzCache . This one shows you the most resource-intensive queries on SQL Server without running a profiler trace . Sounds pretty neat! EXEC sp_blitzCache @SortOrder = 'CPU' , @Top = 10 This outputs the execution plans of the 10 most expensive queries in the query plan cache. By default this is sorted by CPU, but can commonly be set to reads, writes or duration. There are a bunch of other options, which you can see if you add the @Help = 1 parameter. The Warnings column will give you hints as to what the problem might be, for example missing indexes. These warnings are prioritised in the second result set. For example my top warning was: 10 Execution Plans Forced Serialization http://www.brentozar.com/blitzcache/forced-serialization/ Something in your plan is forcing a serial query. Further investigation is needed if this is not by design. 25 If like me, you still have a way to go...