Author: way0utwest

  • The 2019 Learning Goals

    As mentioned in my editorial, I plan on working through books this year for some extra learning. Certainly I’ll still use Pluralsight, websites, and more learn some things, but I want to get through at least 6 books this year and practice those skills. Six seems doable. Eight would be great. Twelve is unlikely and four is a failure. You can see this in my amazing, homegrown career skill thermometer.

    2018-12-20 13_31_33-Presentation1 - PowerPoint

    In any case, my goal tracking will be looking at how I get through books. Here are the ones on my list for now, in no particular order. They’re just listed in the order I bought them during the CyberWeek sale.

    I’m going to start with Pro SQL Server on Linux and go from there. I may add other books, or change mid year, depending on what I find as I go through these books.

  • Looking Forward to 2019

    It’s the final Friday of the year, between the Christmas and New Year days off that many of us have as holidays. Since this is often a very quiet workday, I thought it would be a good day for many of us to stop and think about our future plans for next year.

    I write often about career topics, encouraging you to improve your skill sets and actively manage your career. I think too many of us have been passive in our careers. We learn what our boss asks us to learn. We change jobs when we need to, often just accepting the first offer we get. We let ourselves be interviewed without interviewing the hiring organization. In most cases, we fall from position to position, which often might not be what we did if we actively managed our career.

    I talk about the different things you can do to brand yourself, market yourself, and improve your career in various presentations and writings. However, before you brand yourself, you really need to know what skills and abilities you want to brand. For many of us, this means verifying, practicing, and improving the skills in areas we want to work. To do that, most of us need some sort of plan.

    That’s what this piece is about. What is your plan for 2019? Are there things you want to learn for fun? For your current position? Maybe to set you up to get a new job in a year or two? Andy Warren has written a bit about this, and I think he has some good ideas. We need a plan that’s manageable, but also helps us move forward. We should write this down and have some way of measuring what we want to do with this plan. I’m asking you today to think a bit about what you might want to do and then make some plans.

    I’ve tried a few ideas in the past, with various levels of success, and in 2019 I want to try something else. I like books and learn from them well, so I’m going to take a number of books that I bought from Apress during their $7 sale and start working through them. My goal is to get through a book a month in 2019, adding some skills and practicing some of the techniques to see if I can learn some useful skills in this way.

    If you’re not busy today, work on a plan. Outline the time, the money, and the way in which you plan to learn in 2019 and write that down. If nothing else, maybe you want to go through one article we publish each week and practice some of those skills. You’d certainly learn quite a bit doing that in 2019.

    Steve Jones

    The Voice of the DBA Podcast

    Listen to the MP3 Audio ( 3.5MB) podcast or subscribe to the feed at iTunes and Libsyn.

  • Testing SQL in the Advent of Code

    I like participating in the Advent of Code each year, though my participation often varies wildly as life gets in the way. Still, trying to solve some programming challenges is a good way of practicing your skills. If you’re competitive, you can try and see how quickly you can solve things and get onto the leaderboard.

    One note, if you enjoy the challenges, support the cost of running the site. Sending $5 would make a difference to what I’m sure is a decent amount of effort and some costs. Plus, I’d certainly be happy to buy the author some sushi if I were sitting next to him, so why not send something during the holidays.

    This year’s challenge is over, but you can still work through the challenges. In my case, I’ve gone through a few and hope to get to more in a few spare moments.

    Testing Day 2

    One of the things I’ve done in the past is see a challenge and then start to write some code. I’ve worked through the puzzles in PoSh, Python, and SQL, sometimes all three. When I think I’ve solved it, I often enter a result, which is wrong, and then code some more, repeating as needed.

    This isn’t different from what I’ve done as an employee for a company, but I’ve also realized that the subtle design specification is sometimes mis-interpreted by me. In that case, I’ve essentially been bothering the “QA” people for no reason. It’s an application in this case, but still.

    It would be better to have inputs and outputs specified and checked by the computer, which is way better at checking than I am. I decided to set up test harnesses after Day 1 (which was really easy) for the problems. Here’s Day 2.

    Puzzle A

    The first part of Day 2 is a puzzle about letters, asking you to compute a checksum based on whether any letters are repeated. This isn’t a complex set of instructions, but it would be easy to make a mistake. Across any number of sets, a human might have problems verifying the actual results.

    Since the answer here is a single value, this lends itself to a test. I decided to start by creating a table and then loading the input data into the table. That’s something I often do, so the basics here were:

    CREATE TABLE dbo.Day2
    ( Boxnumber INT
    , boxid VARCHAR(100)
    )
    GO
    INSERT dbo.Day2 (boxnumber,boxid)
    SELECT  ca1.ItemNumber,
             ca2.Item
    FROM    OPENROWSET(BULK 'e:\Documents\GitHub\AdventofCode\2018\Day2\input.txt', SINGLE_CLOB) dt(FileData)
    CROSS APPLY dbo.Split(dt.FileData, CHAR(10)) ca1
    CROSS APPLY (VALUES(REPLACE(ca1.Item, CHAR(13), ''))) ca2(Item);

    Now that I had data, I can write a test. I like to use tsqlt, so I started there. Since I want something to test, I decided to start with a procedure that will hold my solution. Since I’ll code here, I can stub this out.

    CREATE OR ALTER PROCEDURE Day2a
    AS
    BEGIN
         DECLARE @i INT = 1;

    -- Solution goes here
     
    RETURN @i
    END

    With this set up, we can now build a test. The basic outline for a test is Assemble an environment, Act on your code, Assert your results. Let’s follow this template.

    The Assemble is easy. I’ll fake out my table of values and insert the test section from the calendar. I’ll also add the expected result, which is given in the puzzle as 12.

    CREATE OR ALTER PROCEDURE tsqltests.[test Day2a]
    AS
    BEGIN
         ---------------
         -- Assemble
         ---------------
         DECLARE
             @expected INT = 12
           , @actual INT;
         EXEC tsqlt.faketable @TableName = 'Day2', @SchemaName = 'dbo';
         INSERT dbo.Day2
             (
                 Boxnumber
               , boxid
             )
         VALUES
             (1, 'abcdef')
           , (2, 'bababc')
           , (3, 'abbcde')
           , (4, 'abcccd')
           , (5, 'aabcdd')
           , (6, 'abcdee')
           , (7, 'ababab');

    The Act part is easy. I’ll call my procedure and get the result back.

    ---------------
    -- Act
    ---------------
    EXEC @actual = dbo.Day2a;

    The Assert part is also easy. I’ll just compare my actual result to what I expected.

    ---------------
    -- Assert   
    ---------------
    EXEC tSQLt.AssertEquals
         @Expected = @expected
       , @Actual = @actual
       , @Message = N'An incorrect checksum calculation occurred.';

    Once this is done, I’ll run it and it fails because my stub proc returns 1. Now to code the solution, which I can easily check by running my test. I can verify things work with a first change to my procedure.

    CREATE OR ALTER PROCEDURE Day2a
    AS
    BEGIN
         DECLARE @i INT = 1;
    SELECT @i = 12
    RETURN @i

    GO

    EXEC tsqlt.run 'tsqltests.[test Day2a]';

    That’s it, and the solution is to split out the box IDs, count the letters, and where there are repeats, tally those up.

    Puzzle B

    The second part of the puzzle is always a nice twist on the first part. In this case, I get a new set of IDs, which vary by a single character.I need to pick those two box IDs and return the common ones. A new solution needed, but only a slight change to the test.

    First, we change the Assemble section because we have new results and inputs.

        ---------------
         -- Assemble
         ---------------
         DECLARE
             @expected VARCHAR(26) = 'fgij',
             @actual   VARCHAR(26);

        EXEC tsqlt.faketable @TableName = 'Day2', @SchemaName = 'dbo';
         INSERT dbo.Day2 (Boxnumber, boxid) VALUES
    (1, 'abcde'),
    (2, 'fghij'),
    (3, 'klmno'),
    (4, 'pqrst'),
    (5, 'fguij'),
    (6, 'axcye'),
    (7, 'wvxyz')

    Next, I need to change the ACT section. Since I can’t return a string from a procedure, I could use a function, but I’ll just add an OUTPUT parameter to my Act.

    ---------------
    -- Act
    ---------------
    EXEC dbo.Day2a @actual OUTPUT;

    Lastly, I change the proc.

    CREATE OR ALTER PROCEDURE Day2b
       @r VARCHAR(50) out
    AS

    That’s it.

    Good luck solving the puzzles.

  • My SQL Server Travels in 2018

    It’s the end of the year, and I’m looking back at the events and travels I’ve had this year. I keep a list of travels on my blog for speaking as a kind of Speaking CV, and United (my primary airline) provides me with a summary of travel each year.

    Since I’m planning and looking forward to 2019, I thought I’d recap a few of my travels.

    New Events and Places

    Every year I try to visit some new places and events, getting the chance to meet new people and learn about events and places. There are so many to see and attend that this is a never ending goal, but that’s part of the fun.

    New places I visited this year: Cork, Pittsburgh, Nashville, Jacksonville (personal), and Hong Kong (personal).

    New Events for me: ISACA Ireland, Music City Tech, Microsoft Inspire, SQL Sat Pittsburgh, Certified InfoSec.

    I did a few new virtual talks, even though I don’t really enjoy these. I like feedback from in person talks but the Milwaukee and Queensland user groups got me to speak.

    Revisiting Fond Memories

    I was lucky enough to get to revisit a number of places this year. Of those, I enjoyed getting to do some live SQL in the City events, in addition to the streamed ones. I did 4 of each, so a good SQL in the City year.

    It was also great to get back to Baton Rouge, Louisville, Los Angeles, Colorado Springs, Boulder, Oslo, and Cambridge for events. Those are some of my favorite places for SQL events and I’ve been at all of them 3 or more times.

    I was also luck to spend a few days in Washington DC and New York City, two amazing places in the US.

    Of course, as usual, London was the most visited destination. 6 times in 2018, and probably close to 40 trips there in my life.

    Missed Out

    I missed out on SQL Bits in 2018, the first time in quite a few years. Unfortunately this conflicted with other commitments at home, and will again in 2019. Hopefully that will change in 2020.

    I also skipped the VS Live, Dev Connections, Ignite, Build, and SQL Intersection events. I’ve enjoyed those over the years, but this wasn’t the time to go, and next year might not be either. We’ll see what happens.

    All in all it was a great year speaking, and with travel that was manageable. Hopefully that continues in 2019.