DevOps

#DOES20 Reflections

I usually try to write these Three Things I’ve Learned posts at the end of each day of a conference, but this is a little different. This is the first multi-day virtual training event I’ve been to, and because it’s virtual, there’s no travel. Which means my day begins on EDT, and the conference starts (and ends) on PDT. Makes for a very long day.

That being said, I love this conference: DevOps Enterprise Summit 2020 continues to push me to think abstractly about technological problems, and grounds me again in looking at cultural issues within my organization. These are the three things that have resonated with me (so far):

  1. I’ve got to do more to make the pain visible across the organization. Lots of folks have stressed the necessity of communication across teams, disciplines, and to the upper management, and that’s really sticking out to me. I think we’ve done a decent job of complaining, but we haven’t done the best job of proposing better ways of solving problems.
  2. I need to celebrate my team’s victories more. My team works hard, and there are moments when they feel forgotten in the grand scheme of things, particularly when other teams are holding them back. I need to make sure that they realize how much change they’ve promoted, and how far we’ve come as an organization.
  3. Set the Vision, but focus on the first step. A few years ago when I started us on this journey, I laid out a vision, and I need to revisit that. A lot has changed, including both targets we hit, and goals that are no longer on the roadmap. I need to make sure that I frame each step along the way in terms of the value it brings to the service we’re offering.

Virtual conferences are a different kind of fatigue; it’s been rough staying focused. I think I’m going to write another blog post to describe what’s worked for me, and what I’ll do differently in the future.

Back to learning; 3 more hours to go today 🙂

#DOES2020 starts tomorrow

This is one of my favorite conferences, and obviously COVID-19 changes everything. It’ll be interesting to see how going online changes the tone of the conversation. One big benefit is that the cost is definitely lower while the quality of the content is expected to be the same; I miss traveling, though.

I know most folks have done a virtual conference this year and have already mastered the Zoom burnout, but I’m a little concerned about. I’m going to try and beat it by staying engaged with a co-worker who is also attended. I also plan on live-tweeting and or blogging as it comes.

Getting my learn on.

Guest of @RedGate at #DOES20

Haven’t blogged in a bit, and I definitely need to get back to writing. However, just wanted to post a quick note that I’m super excited to be presenting a guest session with RedGate Software‘s Grant Fritchey at the DevOps Enterprise Summit. I’m very excited about this for multiple reasons:

  1. I love this conference; DOES is very inspirational, and there are lots of great speakers and content. It’s focused more on the technical goals than the actual tools, so it’s a good fit for where i am career wise.
  2. I love RedGate Software. Their company is simply an amazing producer of tools for the database community, and they’ve been very supportive of #sqlfamily and #sqlSaturdays for a long time. I’m stoked that they’re expanding their reach.
  3. Grant‘s ok. (Really, he’s a great guy and a lot of fun to talk to).

See y’all in virtual Vegas. Registration for the conference is half-price through August 31; it’s a great deal at $325.

Uploading Multiple RDL files to SSRS

My QA folks have a problem; development has been working on migrating a bunch of reports from a legacy 3rd-party application to SQL Server Reporting Services. Development has finished their “sprint” (*cough* waterfall), and handed over 52 reports to QA, and told the to load them into their QA server. The problem? The web interface only loads 1 report at a time.

Me, being the DevOps guy that I am, thought “well, that’s just silly; there has to be a way to upload all of the reports at once, rather than clicking on some silly buttons over and over again”. I googled, and the best explanation I found was at this blogpost: https://basic-ssrs.blogspot.com/2015/12/upload-multiple-rdl-files-from-local.html (Kudos; this is a VERY well written walk-through).

Unfortunately, I did exactly what the blog suggested, and ran into two problems. The first? Running the .bat file opened and closed a command window in seconds. No feedback. Nothing. I went back and made a minor change to the .bat file; namely, I added the PAUSE command to the end:

“E:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\rs.exe” -i C:\report_upload\Upload_Multiple_RDL_files.rss -s “http://localhost/reportserver” -v FILE_NAME=”C:\report_upload\ConfigurationFile.txt”
pause

This allowed me to discover the second (more important) issue; I ran the .bat file, and now I get the following error:

Unhandled exception:
The definition of this report is not valid or supported by this version of Reporting Services. The report definition may have been created with a later version of Reporting Services, or contain content that is not well-formed or not valid based on Reporting Services schemas. Details: ‘.’, hexadecimal value 0x00, is an invalid character. Line 2563, position 10.

Ummmmm, what?

Back to the Bing. I found another article that describes basically the same process, but at the bottom of the comment section, there was this little gem:

Hello, I was getting the invalid content error:

“….or contain content that is not well-formed or not valid based on Reporting Services schemas. Details: ‘.’, hexadecimal value 0x00, is an invalid character….”

Made some research and found that arrays in vb are created as N+1 long size, and filled with 0x00, so you need to change the script to:

definition = New [Byte](stream.Length – 1) {}

 to get it working.

https://www.mssqltips.com/sqlservertip/3255/sql-server-reporting-services-ssrs-rsexe-utility/

BINGO! Went back to the .rss file and changed the below code block to

 ‘ Deploying the Reports

                    Try

                        Dim stream As FileStream = File.OpenRead(fileFullPath)

                        Dim NameWithExt As String = fileFullPath.Replace(path, “”)

                        Dim NameOnly As String = NameWithExt.Replace(“.rdl”, “”)

                        definition = New [Byte](stream.Length-1) {}

                        stream.Read(definition, 0, CInt(stream.Length))

Ran the.bat, and in just a few minutes, I had a ton of reports loaded to my directory. Now I just gotta fix the datasources.

**Edit – based on comment below, I’ve embedded the entire revised script.

‘ Script Starting Point
' Script to deploy report to report server
' EXECUTE VIA COMMAND LINE
‘ Original script: https://basic-ssrs.blogspot.com/2015/12/upload-multiple-rdl-files-from-local.html
‘ Upload_Multiple_RDL_files.rss

DIM definition As [Byte]() = Nothing
DIM warnings As Warning() = Nothing

Public Sub Main()

' Variable Declaration
        Dim TextLine As String = ""
        Dim LocalDir As String = ""
        Dim ServerDir As String = ""
        Dim definition As [Byte]() = Nothing
        'Dim warnings As Warning() = Nothing

' Reading Configuration Text file and assigning the values to variables
        If System.IO.File.Exists(FILE_NAME) = True Then
            Dim objReader As New System.IO.StreamReader(FILE_NAME)
            Do While objReader.Peek() <> -1
                TextLine = objReader.ReadLine()
                Dim parts As String() = TextLine.Split(New Char() {","c})
                'TextLine & objReader.ReadLine() '& vbNewLine
                LocalDir = parts(0)
                ServerDir = parts(1)

                Dim path As String = LocalDir
                Dim fileEntries As String() = Directory.GetFiles(path)
                Dim fileFullPath As String = ""
                For Each fileFullPath In fileEntries


 ' Deploying the Reports
                    Try
                        Dim stream As FileStream = File.OpenRead(fileFullPath)
                        Dim NameWithExt As String = fileFullPath.Replace(path, "")
                        Dim NameOnly As String = NameWithExt.Replace(".rdl", "")
                        definition = New [Byte](stream.Length-1) {}
                        stream.Read(definition, 0, CInt(stream.Length))

      warnings = rs.CreateReport(NameOnly, ServerDir, True, definition, Nothing)

      If Not (warnings Is Nothing) Then
        DIM warning As Warning
        For Each warning In warnings
        Console.WriteLine(warning.Message)
        Next warning
      Else
       Console.WriteLine("Report: {0} PUBLISHED!", NameOnly)
      End If

     Catch e As IOException
      Console.WriteLine(e.Message)
     End Try
    Next fileFullPath
   Loop
         Else

            Dim MsgBox as String = "File Does Not Exist"

        End If
End Sub

'End of the Script

Adventures in #CoWorking

So, my experiment in coworking has been fun, and I think I’m going to continue it. The biggest benefit has been the fact that when I’m done in the afternoons, I pack up my laptop and go home. Most nights, I don’t even unpack my bag; my day ends at a reasonable hour, and I’m more involved with family when I need to be.

As I posted previously, I had originally started working out of a place in Suwanee, Georgia (about 20 minutes from house; 30-45 with traffic). CEO Centers Flex space is a nice facility, and the day-to-day staff is fine. There’s very few amenities, and it’s a wide open space. The problem is that I take a lot of calls…. and I mean, a LOT of calls. Wide open spaces are apparently not conducive to lots of phone calls, so about two months in to my stay, I came in to the office to find the following note (prominently placed in front of my seat… and only my seat).

Whoops. Time to find a new home.

PARADIGM WORKHUB

I started looking, and luckily, a new workspace had opened up that was actually closer to home and was 10 bucks cheaper a month. It also had corners, and a door that I could close. Because it’s newly open, not a lot of people are there yet. Score.

#SQLSATBR: Database People and #DevOps

Excited to announce that I was chosen to present my session “Database People and DevOps: The Fundamentals” at SQLSaturday Baton Rouge 2019 this August. Very excited to head back close to home this year; I actually attended LSU graduate school for a year before transferring to UGA, so the campus holds a dear place in my heart. SQLSaturday Baton Rouge appears to have grown a lot since the last time I was there, so I’m hoping I can pick ups some ideas for our event in 2020.

This is a fun session for me, and I’ve got some revisions to make after delivering it in Atlanta. I hope folks find it informative, and I give lots of references for future study. This is a summary class, which means I cover a lot of topics at a high level, but I like to build a framework for future study.

Y’all come.

Fix More, Whine Less

I get paralyzed by the thought of NOT doing something correct, so I end up doing nothing. I’ve got to work on that. A three sentence blog post is better than no blog post. Fixing one tiny recurring error is better than just watching the logs fill up. It may be a lost cause, or it may be a moment of hope; whatever.

Just fix something. Something small. A lot of small somethings can make a big something.

My one true #DevOps statement…

After my last post, Brent Ozar offered the following suggestion on kickstarting my thoughts on “People First”

” Come up with the one true sentence, and the inspiration flows out of that. Sometimes you hang the entire post on that one sentence, and sometimes the sentence just ends up slipped in somewhere almost as an aside. “

I mulled over it over the weekend (in between basketball games, date nights, and family technical support), and below is the best I could come up with. I think it’s a useful exercise, and I’m going to focus my energy today on expanding this thought:

The primary purpose of software development is to add value to humanity; however, most software development processes dehumanize the creators.

More to come. And, thanks, Brent! I owe you yet another beer.

Writing is hard…

I’ve recently started working on a book, and have rediscovered that if you don’t exercise on a regular basis, it sucks to start. I need to think of this blog as an opportunity to get my regular writing “steps in”, so that when the time comes to actually start running, I’m ready.

One of the challenges I’m having is articulating my thoughts on the concept of “people first” in DevOps. It’s the first element in Donovan Brown’s definition, and embedded in the first value of the agile manifesto, but yet, people don’t get it. I was recently involved in a Facebook conversation on the evolution of graph databases, and was saddened by the fact that many people who I know and respect still see an ongoing war between developers and DBA’s (and often make assumptions about the other camp).

I may be naive, but I’m trying to find the good in people, and trying to build value to customers. Different roles and skills are necessary, but allowing those roles to foster tribalism to the detriment of the goal is a futile pursuit.

More to come.