Posted by: sqlswimmer | November 10, 2014

Summit 2014

It’s hard to believe it’s over.  It felt like a whirlwind while I was in Seattle for my 7th PASS Summit, but now that I’m back home it feels like it was ages ago.  I think time moves more quickly when you’re with friends and that’s where I was, with friends.

I got to reconnect with old friends and meet new ones.  I didn’t attend nearly as many sessions as I would have liked, because let’s face it, cloning technology isn’t quite where it needs to be as Michael Keaton found out in Multiplicity.  With my luck my “Number Four” would have attended one of Paul Randal‘s sessions and I would have wound up doing God knows what to my servers when I got back.

I also got to meet people that I have “worked” with for quite a while virtually, but never met in person.  I must say it’s always refreshing when their “in person” exceeds your expectations.  There are so many genuinely nice people in our community, I am truly in awe.

In years past I have not been able to participate in most of the after-hours activities due to Summit happening right before a big annual swim meet, which meant I couldn’t take a break from training.  This year, my swim meet was the week before Summit so I didn’t need to get up at 4:30 a.m. every morning to make it to practice before breakfast.  I got to see how the “other half” lived at Summit this year.  I must say it was eye opening and entertaining.  They don’t have next year’s swim meet on the calendar yet, but I have the Summit dates, so next year’s meet just may have to go on without me.

If you’ve ever attended a PASS Summit, you know what I’m talking about when I say I’ve already started the count down until next year’s Summit.  If you’ve never attended a Summit, what are you waiting for?

Posted by: sqlswimmer | November 4, 2014

Data Driven Subscription On A Budget, Part 2

Data Driven Subscriptions On A Budget – Part 2

Yes, this is Part 2, you can find Part 1 here to get background information.

This blog will talk about Point 3 – Distribute a report to a fluctuating list of subscribers.

Distribute a report to a (fluctuating) list of subscribers

When using email as your method of delivery for a Data Driven Subscription, best practice is to use metadata to drive that process. Usually a simple table that contains the email address of the recipient and the report name does the trick. This part of the process is no different if you don’t have Data Driven subscriptions. I usually create a table similar to this:

CREATE TABLE dbo.SSRSEmailSubscribers
EmailAddress varchar(128) NOT NULL
,ReportName varchar(128) NOT NULL

Let’s say I have a sales report that needs to go out on a daily basis and the standard format for this report is Excel. Because we don’t have data driven subscriptions, we can’t just query the table and use the resulting list to email the report. Instead we need to create a File Share subscription that generates this report and saves it to a file share. From there we can “pick up” the newly generated Excel file and email it to the recipients.

  1. Create a subscription to your Daily Sales Report in Report Manager, schedule it for a one time execution at a time just a few minutes in the future, and remember the execution time. (This creates the SQL Agent job in SQL Server.)
  2. Take a look at your SQL Agent jobs in SQL Server. If you have never seen or noticed a job created by SSRS, then you will be wondering where your job is because SSRS does not use human readable names for its jobs, it uses those pesky GUIDs as names, ugh! If your server has lots of jobs you may need to sort your jobs by Category to get all the “Report Server” jobs together. Find the job that executed at the time you scheduled (this is why you needed to remember the time!), this will be the job you will need to reference in the next step.
  3. Create a new SQL Agent job and add a step for Transact SQL script. In this new step you need to execute the SQL Agent job that you created back in step 1:

exec msdb.dbo.sp_start_job N'B514C05F-07D5-4C0B-9600-666E9980C7C3'

    where B514C05F-07D5-4C0B-9600-666E9980C7C3 is the GUID from the job that SSRS created.
  1. Next you will need to add a new job step for PowerShell. In this newly created step write your PowerShell script to get the file that was generated (as a result of executing the previous step) and retrieve your list of email addresses. Once you have this information you can send the email with the report attached. There are several ways you can do this, but I chose to use PowerShell. Since PowerShell requires a double quoted semicolon (;) delimited list of email addresses when using SMTP, I wrote my SQL query to return a double quoted semicolon (;) delimited list of the email addresses. You could have just as easily used PowerShell command-lets to format your list. Here’s my PowerShell script:

cd c:

$FilePath = "c:\temp\"
$smtpServer = ""
$smtpFrom =

$AddressQuery = "DECLARE @List varchar(MAX);"
$AddressQuery = $AddressQuery + "SELECT @List = COALESCE(@List + '"";""', '') + EmailAddress "

$AddressQuery = $AddressQuery + "FROM dbo.SSRSEmailSubscribers "
$AddressQuery = $AddressQuery + "WHERE ReportName = 'Daily Sales Report'; "
$AddressQuery = $AddressQuery + "SELECT '""' + @List + '""';"
Invoke-Sqlcmd -Query $AddressQuery -ServerInstance "MyServer" -Database "MyDatabase" -Variable $smtpTo

$messageSubject = "Daily Sales Report was executed"
$latest = Get-ChildItem -Path $FilePath -Filter "*.xlsx" | Sort-Object CreationTime -Descending | Select-Object -First 1

$FullFileName = $FilePath + $latest
$body = "Attached is the Daily Sales Report"
send-mailmessage -from $smtpFrom -to $smtpTo -subject $messageSubject -body $body -smtpServer $smtpServer -Attachments $FullFileName

Now schedule this newly created SQL Agent job for the time you need your Daily Sales Report to be executed and Wa-La, you now have a data driven subscription that distributes a report to a fluctuating list of email addresses.

Posted by: sqlswimmer | August 28, 2014

I Didn’t Hyperventilate!

I gave what is officially my second presentation this week. I presented at the Triad SQL BI (Twitter | PASS) user group meeting and I didn’t hyperventilate! That’s a huge deal for someone like me, who is petrified of public speaking.

It started out a little rough though.

Friday, 8/22 (just 4 days before presentation date) – I met Katherine Fraser (SQLSassy) for lunch and she mentioned that their scheduled speaker had just cancelled on them the day before. I asked her what she was going to do and she said unless I wanted to present for her, she had no idea. I jokingly said, “Yeah, sure, I’ll present”. Do not EVER, tell a chapter lead you will present, even if joking around because they will pounce on you! Lesson learned there. I agreed to present a very introductory session on SSIS. I then went home and started to panic.

Saturday, 8/23 – I woke up with a horrible sinus headache and thought I was in the beginning of nasty sinus infection. Now I really started to panic. I sent Martin to the drugstore to buy every sinus medication they had on the shelf. There was no way I could be sick, I could not cancel on Katherine after I had just agreed to present the day before. I proceeded to pound down some Emergen-C and drink about a gallon of water an hour for the rest of the day.

Sunday, 8/24 – I woke up at 4:30 a.m. to take part in the upgrade of major system at work. I felt about the same as Saturday. I pounded some more Emergen-C and worked until 11:30am. After we got the green light from the testers at 3:30 p.m., I went to bed and collapsed.

Monday, 8/25 – Woke up feeling much better, but not great. Pounded more Emergen-C. Started to work on my presentation. Did I mention that I didn’t have anything prepped for a presentation? I’m not a speaker, why on earth would I have a presentation ready to go? Got a call from my boss that the system upgrade wasn’t going so smoothly and had to start firefighting in production.

Tuesday, 8/26 – Presentation day. Got the word from my boss that the system upgrade was still up in the air, but none of the pieces that were broken were anything I could help with or fix. I started to work on my presentation. Just before lunch time I was told I had two conference calls I needed to participate in. Great, another two hours I don’t get to work on my presentation! Finally done with conference calls, when I got a call from my boss, we are rolling back the upgrade and I need to bring the old server back online. Luckily I had been able to create the content of the presentation and test it. I just didn’t have any time to do a practice run through. That was going to have to be enough, it was time to go to Winston-Salem.

I arrived in plenty of time, but I forgot: the power supply for my laptop, my external mouse, speaker evaluation forms and my list of things I needed to take with me to the meeting. Luckily my laptop was fully charged and didn’t die during the presentation (in fact I could have gone on for another 2 ½ hours, thankfully no one wanted to stay that long!). A mouse was provided by our wonderful host, Matt Clepper of Inmar, but not before I had a slight mishap using that @!#$%^& embedded mouse on my laptop. Katherine was well prepared and brought speaker evaluation forms. As for my list of things I needed to bring with me, well, I just had to “adapt and overcome”.

The presentation went pretty well, I didn’t hyperventilate. Sometimes you have to have a very simple goal, just survive without a trip to the ER.

Wrap up
Overall it was a good experience. I think I did a good job of presenting and the feedback I got reinforced that. There were some great ideas on what I could have done better and some great comments on what I did well.

Will I speak again? Probably. I’m not sure I’m ready for a SQL Saturday quite yet, but maybe another couple of times at UG meetings and I’ll think about it. A huge “Thank you” goes out to Katherine for taking a chance and believing in me.

Of course I didn’t sleep at all Tuesday night. I kept thinking, “I forgot to tell them…”

Posted by: sqlswimmer | July 1, 2014

Data Driven Subscriptions On A Budget

Data Driven subscriptions in SQL Server Reporting Services (SSRS) is only available if you have the Enterprise or BI Editions for 2012 & 2014, Enterprise or Data Center Editions for 2008R2 or Enterprise for 2008. But what happens when the money is not in the budget for those versions? Can you still get Data Driven subscriptions? The answer is You Bet!

I have worked in large shops in the past where purchasing the Enterprise Edition of SQL Server was never an issue, in fact, it was the standard flavor of SQL Server. But when I switched to a smaller shop, where cost was an issue, I had to say good-bye to all those lovely Enterprise features that I have come to know and love. As the proverb goes, “Necessity is the mother of invention”. So when I was asked to essentially create a data driven subscription in Reporting Services, I paused ever so slightly, then said, “Yeah, I can do that”.

There are a few things you can do with a data driven subscription in SSRS

  1. Trigger the execution of a report based on data
  2. Provide parameters to filter the report data at run time
  3. Distribute a report to a fluctuating list of subscribers
  4. Vary the output format and delivery options.

In this post I will address point 1 only, hopefully at some point I will get around to creating a post about points 2, 3 & 4, but for now, it’s just 1.

Trigger the Execution of a report

Let’s say I have a sales report that needs to go out on a daily basis. This report contains sales for the previous day. But what happens when there are no sales? Our report shows up with no data on it. Now we, as data people, completely understand why this happens, but those in the C-Suite don’t always understand and they think the report is “broken”. This initiates a call to the help desk saying simply, “The Daily Sales Report is broken”. We freak out, thinking, “Great, who promoted what?” We instantly go into trouble shooting mode. But after running the report, seeing no data and running the underlying query, we now understand. The report is not “broken”, there were just no sales. I don’t know about anybody else, but I don’t like those in the C-Suite thinking that we in the dungeon are idiots. So instead of sending them a report with no data, we need to send them an email to let them know there were no sales the previous day. Problem solved, crisis averted, get back to work. Oh but wait, I don’t have the appropriate edition of SQL Server, how the heck can I do this? In three easy steps, that’s how:

  1. Create a subscription to your Daily Sales Report in Report Manager, schedule it for a one time execution at a time just a few minutes in the future, and remember the execution time. (This creates the SQL Agent job in SQL Server.)
  2. Take a look at your SQL Agent jobs in SQL Server. If you have never seen or noticed a job created by SSRS, then you will be wondering where your job is because SSRS does not use human readable names for its jobs, it uses those pesky GUIDs as names, ugh! If your server has lots of jobs you may need to sort your jobs by Category to get all the “Report Server” jobs together. Find the job that executed at the time you scheduled (this is why you needed to remember the time!), this will be the job you will need to reference later.
  3. Create a new SQL Agent job and add a step for executing Transact SQL script. In this newly created step write a query that checks for sales from the previous day, if sales exist, then execute the job that was created by SSRS, otherwise send an email stating that there were no sales. There are several ways you can do either one of these things, but here’s my T-SQL script:

DECLARE @SalesTotal numeric(18,2)
, @Yesterday date
, @BodyMessage nvarchar(max)

SET @Yesterday = DATEADD(DAY, -1, GETDATE())

SELECT @BodyMessage = N'There were no sales for ' + CAST(@Yesterday AS varchar(10))

SELECT @SalesTotal = SUM(InvoicedAmount)
FROM dbo.Sales
WHERE SaleDate = @Yesterday

IF @SalesTotal > 0
EXEC msdb.dbo.sp_start_job @job_name = '4D3D4A1F-F007-4045-B5F6-3C86445D153B'
EXEC msdb.dbo.sp_send_dbmail @recipients = '',
@subject = 'Daily Sales Report',
@body = @BodyMessage

Now schedule this newly created SQL Agent job for the time you need your Daily Sales Report to be executed and Wa-La, you now have a data driven subscription for your SSRS report.

There is one really big assumption here, since it’s a small shop, the SSRS instance and the instance where your data live are one in the same. This is easily adaptable if they are not on the same instance by creating a linked server, yes I feel dirty even suggesting it, but like I said, “Necessity is the mother of invention”.

Posted by: sqlswimmer | June 2, 2014

2014 NomCom Slate is Amazing

Serving on the Nomination Committee (NomCom) is such an honor. One that I was lucky enough to experience two years ago. It allows me to give back to the community that has given me so much over the years and continues to give back on a daily basis. This year’s NomCom will also be tasked with “streamlining the process for involving and evaluating candidates and with enhancing opportunities for community engagement in the elections.” I am very excited about this opportunity. When I served two years ago, I thought there was room for improvement in the process and it looks like this will be my opportunity to see if I can make a difference.

This year’s slate is a great one. There are former Board members, chapter leaders, former NomCom members & some very outstanding volunteers. I am excited to see there are so many taking an interest in their community. Please do your research on each candidate and make the choice that is right for you, then get out there and VOTE! It’s your community. Voting opens June 3 and closes June 6.

Posted by: sqlswimmer | March 21, 2014

Disheartening Apples

Question:  How many Oracle DBAs can you fit in Madison Square Garden?

Answer:  None, their egos won’t fit through the door.

No, this blog is not a slight towards Oracle DBAs.  I have several friends who are Oracle DBAs and they are some of the nicest, most humble people you will ever meet, but in my experience, they are the exception.  Early in my career I had to administer Oracle and the person I was supposed to learn from was a hard core Oracle DBA and had been for years.  Probably one of the smartest people I’ve ever worked with but only barely tolerable to be around because his ego was larger than the Goodyear Blimp.  When I was introduced to SQL Server way back in 1996 (yes, I am dating myself), there really weren’t any experts in the field readily available when questions came up.  The internet was just starting to flourish and Google hadn’t even been invented yet.  There were a few guys that I had heard of that were willing to help, Brian Knight, Andy Warren & Steve Jones.  I knew about them because Steve Jones was a local guy in Denver, where I was living at the time.  They created this thing called  These few are the epitome of SQL Server stewards, for both knowledge and professionalism.  Smart, humble, easy going, willing to share knowledge freely and did I mention smart?  Honestly, they have been my role models for “lifting as you climb” in my career.  Okay, now I sound like some creepy stalker, so we’ll move on to the point of this blog.

For those that know me personally, you know I am not a speaker type, so I give back to the SQL community by volunteering behind the scenes in any way I can.  So when I was selected to work on the program committee for PASS Summit 2014, I was so excited I did a little happy dance in my cube at work.  My co-workers are used to seeing my head bob to the music of my headphones, but seeing me do a happy dance was a little startling for some.  This will be my 5th year on the committee, more specifically the abstraction review team.  I love being on the abstract review team, getting to read what people are passionate about teaching is always so exciting.  It kick starts my love of SQL Server and learning.  However, just because I had been on the committee in previous years, I never assumed I would be selected again.  It is such a privilege to be chosen, and trusted, with this huge task.

Recently there has been a lot of chatter in social media about the selection process (or lack thereof according to some).  It saddens me to see some people’s true colors.  Being chosen to speak for any engagement, not just the PASS Summit, is a privilege, not a <insert deity here> given right.  The selection process has improved over the years and has become more streamlined thanks to the investment made by the PASS IT team.  It still has room for improvement, but most things do.  One of the things I like best about this year is the increase in the amount of time we have been given to review the abstracts.  In years past, we’ve had a very small window in which to review the abstracts.  That small window made it very difficult to coordinate team members’ schedules to discuss final rankings and assign rejection reasons.  I am hoping we can do a much better job this year of providing useful feedback to speakers.  Another improvement that was implemented last year was the removal of the speaker from the abstract.  This is a huge deal.  In years past, we could see who submitted the session and I fear that it swayed team members’ opinions of abstracts, both good and bad.  Some would be chosen because they were “well known” speakers and/or authors, it didn’t matter that their abstracts were poorly written, which in my experience often translated into poorly presented sessions.  Some would be excluded for the exact same reason.   As a speaker you need to have enough respect for your audience to provide them with the best written abstract you can, it’s the surest sign of respect.

I congratulate all those that have submitted sessions for the Summit; it’s a huge step just submitting a session for the PASS Summit.  If you are selected to speak, I ask that you remember that it’s a privilege and an honor and that you treat those attending your session(s) with the respect they are due.  If you are not selected, I ask that you not give up.  If you have questions about why your session was not selected, ask.  I have been asked in the past and am always glad to provide additional feedback.

Question:  How many SQL Server DBAs can you fit in the Seattle Convention Center?

Answer:  Unlimited, as long as they remember why they attend and/or speak at the PASS Summit.

Posted by: sqlswimmer | September 23, 2013

Will You Vote?

Voting is one of the many privileges that I have as an American citizen.  It’s a privilege that most Americans take for granted today.  My dad always used to say, “If you don’t like something, change it.”  That’s exactly what voting allows us to do.

What does voting have to do with SQL Server?  Starting on September 25th, everything.  The Professional Association of SQL Server (PASS) Board of Directors elections start that day.  There’s a great slate this year.  Congratulations to all who made it through the Nomination Committee (NomCom) and my sincere thanks to those volunteers on the NomCom for all your hard work to get us to this point.  The rest of the work is up to you, the PASS community.  Will you do your hard work to make sure we have a great Board of Directors?  Will you read about each candidate and their platform?  Will you take the time to vote?

Voting is a very personal thing and I don’t normally share this kind of thing with other people, but after personally witnessing the energy and PASSion that Allen Kinsel puts into our community, I feel I need to state publicly that he has my vote.  I have worked with Allen in the past so it is a very easy decision.  That doesn’t mean my work stops there.  There are still two more seats available and I need to do the work to make sure that I select the right candidates who will represent what is important to me.

Voting itself is easy, takes less than 5 minutes of your time, but will you do the hard work to make sure the issues that are of concern to you, as a community member, are being addressed?  I urge you to read about the candidates and their qualifications and then VOTE!  It’s your community.

Posted by: sqlswimmer | May 30, 2013

Saving Grace

According to Merriam-Webster the definition of grace is:

1a : unmerited divine assistance given humans for their regeneration or sanctification; b : a virtue coming from God; c : a state of sanctification enjoyed through divine grace; 2a : approval, favor <stayed in his good graces>; b archaic : mercy, pardon; c : a special favor : privilege <each in his place, by right, not grace, shall rule his heritage — Rudyard Kipling>; d : disposition to or an act or instance of kindness, courtesy, or clemency; e : a temporary exemption : reprieve; 3a : a charming or attractive trait or characteristic…

That’s quite a lengthy definition; in fact, I captured less than half of what was in the dictionary.  It seems like a lot of words to describe something so simple.

So what does grace have to do with a blog about SQL Server?  Quite a lot actually.

When I first went to college, I wanted to be a teacher; in fact, I wanted to be a math teacher.  I had this great math teacher who inspired me in high school.  He was not only brilliant, but he was infectious with his desire for learning.  He was a young guy, I think it was his first teaching job, but you could tell that teaching was what he was meant to do.  He would explain things in a way that made sense (that’s a gift when teaching high school sophomores abstract algebra).  If he could see that the class was completely lost, he would change mid stride and go a completely different direction.  I don’t think a single person failed that class, he wouldn’t let them.  He was the definition of grace, “..disposition to or an act or instance of kindness, courtesy, or clemency…a charming or attractive trait or characteristic”.

There was another math teacher in my high school.  He was old (probably forty or something crazy like that) and a bit pompous; he had the letters “PhD” behind his name.  His attitude was that he had the credentials, so if you didn’t understand what he was talking about, maybe you didn’t belong in abstract algebra.  He also had a reserved parking space close the entrance, because he had those three little letters after his name, “PhD”.  He was the exact opposite of grace and almost half his class failed.

The point I’m trying to make is that for some people, their driving force is ego, not love of learning and therefore they have no grace.

I recently attended the SQL Saturday event in Atlanta.  I love these events because they are so personal.  You have smaller classes and you can actually interact with the presenters and most of them are just like you and me, regular people.  However, in Atlanta I noticed a very disheartening trend.  Ego is taking hold and grace is losing ground.

I am not a speaker and I never will be.  I have a horrible phobia of public speaking (which is the reason I didn’t become a teacher).  But I want to give back to the community that has helped me get where I am today, so I volunteer behind the scenes for many things.  Atlanta was no different.  I was attending, but I was also a volunteer.  There were some great nationally and internationally known speakers presenting, in addition to the local and regional people and it was so exciting to be part of the largest SQL Saturday event to date.  As it turns out, it was probably the most disappointing PASS event I’d attended to date.  Not because I was disappointed in the content of the sessions I attended or even in the speakers that presented them, but because there were many other speakers who seem to have lost their grace.

I’m not going to give specific examples or name names (that just elicits finger pointing).  But what I am going to do is ask you, as a speaker, why do you do it?  Is it because you have those three little letters, “MVP”, after your name or is because you want to share your knowledge and inspire others to learn more?  If it’s the latter, I applaud you and ask that you keep on doing what you are doing.  We in the community appreciate all your hard work and your generosity in sharing.  If it’s the former then I might suggest you try to save grace and have a slice of humble pie, it never hurt anyone.

Angela Henry


Posted by: sqlswimmer | May 17, 2013


I have recently begun to contemplate pursuing the MCSA Certification.  I have been working with SQL Server for almost 20 years and have never considered getting a certification before now.  I have met so many people through the years who have the certifications and were quite frankly “dumb as a box of rocks”.  They just happen to be good at regurgitating information on an exam but had no practical experience.  Throw them an unusual situation and they stare back at you with blank eyes.

I know having those extra letters behind my name could give me a boost if I was in the job market, but I’m happily settled at my current employer, with no plans to move on.  I realize that anything could happen and I could be out looking for a job tomorrow, but if that were the case maybe I could have used that $450 I spent on certification to pay for groceries.  I am not saying the tests should be free, but it is a hard pill for me to swallow when I’ve managed just fine without those letters after my name this long.

Who knows, I may have missed opportunities that I didn’t even know about because I didn’t have those letters, but how can you miss what you’ve never had?

Posted by: sqlswimmer | May 14, 2013

The Long and Winding Road


“The Long and Winding Road” is one of my favorite Beatles songs, it reminds me of my dad, he was a huge Beatles fan.  My dad passed away almost five years ago, but I still miss him like it was yesterday and I still remember the advice he gave me when I was a kid, “Work hard and don’t let anybody tell you you can’t do something, there’s always a way.  It may not be easy, but there’s always a way.”  I credit that advice for the success I’ve had in my life, both personal and professional.

I started working with SQL Server back on Windows 3.11 (version 4.21a).  I know I’m dating myself here, but that’s kind of the point of this post.  We thought Windows 3.11 was so cool after having to deal with DOS for so many years, we didn’t think it could get any cooler.  But it did.  We got Windows 95, then 98, XP, 7 and now 8.  I can’t wait to see what they come up with next.

The same goes for SQL Server.

We started out with what I thought was a great tool, then they made it better.  We went from having to create devices to hold our database files and keeping track of each file growth, to just being able to create our database files and let them grow on their own.  I don’t know about anybody else, but that made me so happy.  No more sp_helpdb every night to make sure I could recreate my databases if needed in a disaster.

It used to be very hard to write T-SQL code if you weren’t familiar with the database objects, the old iSQL query window didn’t have an object browser so you couldn’t see a list of your tables, let alone column names.  Now we have intellisense built right in to the query window.  This feature alone is with worth its weight in gold.  It allows me to be so much more productive, type the first few letters and hit tab.  “BAM!” as Emeril would say.

BCP really used to be the only way to get data in and out of your database, then they gave DTS.  Once again it’s like going from DOS to Windows.  Then they came out with SSIS.  Holy Cow, I thought I’d won the lottery after writing my first package in under 5 minutes.  It truly was an amazing transformation (pun definitely intended).

There are so many other features that have improved along the way, too many in fact to list them all here.

It’s been a long road,

The wild and windy night
That the rain washed away
Has left a pool of tears
Crying for the day.
Why leave me standing here?
Let me know the way.

There were definitely many tears shed along the way to where I am today, tears of frustration and of joy.  But I wouldn’t change my long and winding road for anything, it’s made me who and what I am today.

SQL Server let me know the way…

Older Posts »



Get every new post delivered to your Inbox.

Join 199 other followers