Avonelle's Tech Blog

Go Back

Biggify all the things

I’m shocked.

I recently sat through a number of presentations giving by professional, experienced people at a for-pay conference. In almost all the cases, the speakers did not make sure their content was easily viewable in the back of the room. In fact, in many cases it wasn’t even easily readable in the middle of the room.

Why would you invest time and effort in creating slides, code demos, etc., and then make it difficult for your audience to see?

Test your slides AND code AND demo apps (or browser windows) on the projector to be used when you get to the venue. Not just your title slide – ALL your slides. And don’t just look at it from the podium. Open each thing up and walk to the back of the room and check it.

I tried the “PresentOn” command with the VS2012 Productivity Power Tools, but that wasn’t NEARLY enough when I actually tested it in the room. I ended up bumping my font size to 20pt, and I wasn’t in a particularly large room. I also increased the font size of my browser window so people could easily see what was happening.

Also, run through your slides quickly with the projector. Projectors can have different contrast levels. I discovered that one of my slides was hard to read because the projector didn’t provide enough contrast. I quickly edited the slide before I started so that people would be able to read it.

If you will be showing things where you can’t control the font size, get good at the keyboard command for zooming in and out of that area of the screen. Practice! I give credit to one presenter who tried to do this, but quickly became befuddled with it. It is a bit confusing at first, so get comfortable with it before you use it so you can easily switch in and out.

Seriously: this was my biggest pet peeve at this event. It degraded the quality of the presentations because I couldn’t see them. And while I wear glasses, my eyesight is not particularly bad, so it wasn’t me. I even tried moving up a few rows in the room in one case, but it didn’t help enough. And I shouldn’t have to.

It is such an easy thing to do. Why not just do it?

Other things I recommend to presenters, especially technical presenters:

Practice your orientation with the screen, especially if you are going to extend the display as a 2nd monitor. That can be really confusing at first, since in some cases you may end up at a very odd angle to the display. If you don’t have a projector for practice, use a monitor. Run through you presentation at least once in that orientation.

Practice your timing. I saw one presentation where the speaker rushed through her slides. I was pretty sure that she was going to end way early, and she did (25 minutes early). Her content suffered because of it. Another presenter mentioned at the beginning he wasn’t sure how long his presentation would take, and he went well over time.

Practice in front of someone. This is so helpful, even though I really hate doing it.  I got really useful feedback that improved my presentation at least 20%.

Don’t undermine your own credibility. I realized during my practice sessions I use the phrase “I confess” or “I admit” a lot. These phrases are doing nothing for my credibility, and I’m working to eliminate them in all my presentations. The person who told us he didn’t know the length of his presentation also hurt his credibility. It made me think he hadn’t practice it. Look for things you are saying that are undermining your talk and remove them from your talk.

Get rid of your verbal tics. This is related to the previous item. One of the presenters used the phrase “I can’t stress this enough” over and over again. He said this in front of every major point. After the fourth or fifth time, it became meaningless. It was a crutch phrase, like uh or and or so (just less obvious). Get rid of it.

 Leave time for questions. I blew it on this one, too. Next go around, I’ll make sure I leave at least 5 minutes for questions and discussion.

But most importantly: biggify all the things. There is no reason not to.

Posted by Avonelle on Thursday, August 15, 2013. There are 0 Comments.

Mistakes happen when you don’t know what you are doing

Here’s an example of how I screwed something up because I didn’t really think through HOW something worked. I’ve got a table of street addresses that currently has two columns for latitude and longitude values stored as doubles. Since I’m working with SQL Server 2008,I decided I wanted to create a new column for storing the data as a Geography data type so that I could perform some spatial functions on it.

So first I had to write the query to update this new column. And this is where I made my mistake:

update tblAddress set CenterPoint = (geography::Parse('POINT(' + str(longitude) + ' ' + str(latitude) + ')')) where Not latitude is null

Do you see it? I thought that rather than using the CONVERT function, I would just use STR to turn the longitude and latitude values into strings. Unfortunately, using STR as I used it rounded my values to integers. Not that useful when we are talking about values that look like this: 44.9072249

The result was that all my addresses (which are pretty much in the Twin Cities) had the same value in the new Geography column. Oops.

Just thought I’d share for the next guy. (Yeah, probably a waste of time because none of YOU would ever do anything so lame.)

Posted by Avonelle on Monday, August 23, 2010. There are 0 Comments.

Useful snippets from the programming world

This morning I ran across two programmer posts that I found particularly interesting.

Comments and Tasks in Visual Studio

This post includes a list of the author’s task list tokens and how they are used. Adding my own tokens is something I’ve always considered doing but haven’t. Plus since the author is a solo developer, he calls out how some tokens are more useful for his approach as a solo-ist. As a fellow solo developer I found this illuminating.

How I use OneNote

This post does an excellent job of explaining how the author uses OneNote for development and debugging. Some of this is my process as well, although I don’t use it for tracking history on all bugs, just those that are particularly complicated to resolve.

Posted by Avonelle on Monday, December 07, 2009. There are 0 Comments.

The answer to Pivotal’s tricky questions: Security, security, security

Once again I was stuck on something with Pivotal, and it turned out security was the answer.

I have an app server rule that attempts to run a Pivotal query and checks for the returned results. Everything was working perfectly, except that the query never returned any results from my code. As it turns out, my user didn’t have the correct permissions for the table, so while the query would run without errors, it never returned any results.

A CDC employee suggested that I try this line of code immediately prior to running the GetRecordset function:

dataAccess.PermissionIgnored = true;

(dataAccess is the instance of the Appserver rule.)

If results are returned after trying this, then the problem is with the permissions. Obviously the right approach is to fix the permissions and not use this everywhere, but it did help me verify that the issues was related to security.

Posted by Avonelle on Thursday, November 05, 2009. There are 0 Comments.

Coding zones of suck: places where it ought to be easier than it is

Tonight was trying to install an upgrade for my customer. In the process, we discovered a stored procedure that I couldn’t move to the new database because it referenced fields that no longer existed. The question is: was it still being used?

I searched for it in VS.NET – no luck. But perhaps it was being referenced from another stored procedure.

That’s when I was reminded of the first coding zone of suck. How could I search through all these stored procedures, other than to script them to my computer and search the files. Lame.

(There used to be a tool that did this. I can’t find it now. People are welcome to remind me. But by the way, I shouldn’t need a special tool.  Ugh.)

Then I thought…well perhaps it used to be referenced in an older version of the code, but we stopped using it and forgot to delete the stored procedure. So maybe I could just search Vault, my handy-dandy source code control software.

Nope. The second zone of suck. Vault does not support searching the code like this. (It doesn’t really surprise me. That would be a tricky thing, since Vault only stores the deltas. But it still sucks.)

Posted by Avonelle on Friday, October 09, 2009. There are 1 Comments.

How I avoided paying $500 to upgrade yet another reporting component

I’m really sick of reporting components. Actually, that’s not entirely true: I like programming reports. And when the reporting components work, they are groovy, too.

I just wish I didn’t have to know so many of them.

For years I worked with Crystal Reports, because that’s what everybody used. It wasn’t without problems, but it was the gold standard. We used to say “Crystal Reports: It sucks less than the competition.”

When .NET rolled around and my projects started needing reports, i looked at several options. I finally settled on ActiveReports, which seemed to do for a reasonable price. In this particular case, I needed to create deliver reports over the web with embedded HTML in some of the text. I ran into problems getting this to work with our HTML, but I was mostly able to sort them out.

A couple of years ago I worked on a project that also needed to deliver reports over the web. In this case, the customer was sold on SQL Server Reports. I spent a lot of time learning the technology, but I figured it would be worth it because I would probably just start using it for all my projects. After all, it comes with SQL Server and it works!

Fast forward to the end of last year when I started a new project converting an Access application to Windows .NET. An important requirement was that end users needed to be able to modify reports and create new ones. Unfortunately, this wasn’t something I could provide with the version of SQL Server they are using. Ugh. So I discovered ComponentOne’s Report for WinForms Designer Edition. I’ve spent quite a bit of time this year learning this component. Unfortunately it isn’t cheap; I had to spend something like $1,800.

Now I’m upgrading a web application using ActiveReports to .NET 2.0. I didn’t think it was a big deal, because while the app was version 1.1, I knew I had already purchased ActiveReports for .NET 2.0.

One snag. ActiveReports for .NET 2.0 doesn’t work with VS2008. Apparently the “2.0” is referring to the version of ActiveReports, not the version of the framework. It does work with ASP.NET 2.0, but the fact that VS2008 also supports 2.0 is meaningless. The designer, will only work in VS2005.

Having spent almost $2,000 on reporting components already this year, you can understand why I didn’t want to drop another $500 for an upgrade for ActiveReports to 3.0. (Using the $2,000 reporting tool is not an option, as it is WinForms only.)

My solution has been to install Visual Studio 2005 side by side with VS2008, and create a class project that includes all the reports. Then I changed the reference in my VS2008 project to point to the DLL for that project.

It is stupid, but it will solve my particular issue.

I’d actually consider upgrading ActiveReports at some point. But I’d rather do it when I’m planning on it.

Posted by Avonelle on Thursday, May 21, 2009. There are 0 Comments.

WinForms MenuStrip Merge Secret Sauce

I’ve been experimenting with merging my MDIChild and MDIParent menus. My goal was to merge menu items within the File menu for each form into one universal File menu, but I was getting two file menus instead.

The secret sauce was that it apparently uses the Text property of the ToolStripMenuItem to match up the menus. And one of my menu items used “File” for the menu name, and the other used “&File” (for Alt-key access.) Once I made both Text properties the same value, it starting working as expected.

Posted by Avonelle on Tuesday, April 28, 2009. There are 0 Comments.

End-user Reporting Component missing a feature I expected

I was a bit disappointed this weekend when I realized that the ComponentOne Report for WinForms Designer Edition control is missing something I expected it would include: a way for end users to build queries. To be completely honest, I suppose it was a faulty assumption on my part; the two items aren’t necessarily the same thing. But it just never occurred to me that the designer wouldn’t include any user interface for the end-user to select the tables, columns, etc. that they will need for their reports.

I spent 5 minutes thinking that perhaps I could just create my own, but that notion was quickly thrown out the window – that would be a lot of work! I found two .NET components that seem to do the job: Active Query Builder and Easy Query .NET. I really liked Easy Query’s approach from an end-user perspective; it looks a lot easier for end-users to understand and work with.

Unfortunately, it is missing something that would make it a lot more work for me to use. Easy Query allows users to build their query via an easy user interface and then generates the requisite SQL, but it cannot take the SQL and transform it into their simple UI. So in addition to saving the SQL for selecting the records as part of the reporting code, I’d have to also save the queries in their custom format. No big deal, but I already have a bunch of queries embedded in many reports, and I’d have to take the time to re-create those again. Since Active Query Builder doesn’t have that limitation, I decided to go with it.

So far it has gone pretty well. The only outstanding problem I’m dealing with is that the reporting component handles parameterized queries with a somewhat different syntax than Active Query Builder. So I will need to do some parsing to address that. But I think it is doable in a fairly straightforward manner (hopefully).

Posted by Avonelle on Monday, April 27, 2009. There are 0 Comments.

Outlook Create Email Macro

I wanted to create a quick Outlook macro for a particular type of email that I need to create regularly. This article was perfect – it included the basics, and I filled in the particulars. Plus it also included steps for putting the macro on my toolbar. Perfect.

Posted by Avonelle on Monday, April 27, 2009. There are 7 Comments.

Conditional comments for browser-specific CSS

This post helped me include CSS on a site that was specific to IE. Very helpful since the CSS that solved an IE problem worked fine in Firefox 2.0 but created a total mess in Firefox 3. (FYI – browser incompatibilities suck.)

Posted by Avonelle on Friday, March 20, 2009. There are 0 Comments.

Thank goodness for AutoScaleMode and AutoScaleDimensions in the .NET CF

Last week one of my customers contacted me with a problem. Their customer had purchased several HTC Touch Pro devices for use with the software I built for them. Unfortunately, the software was practically unusable on the device because it squashed everything into the upper left hand corner of the phone.

I feared that this was going to present a big problem. Fortunately, fixing this issue wasn’t bad at all. Mostly what I had to change was making sure that the AutoScaleDimensions and AutoScaleMode for the forms were set properly. Something of note: the linked article indicates that the designer automatically adds a statement setting these values, but several of my forms did not have the settings. My guess is that some of these forms were created with an earlier version that didn’t support it.

I had a few places where I had some custom scrolling code, but for the most part this was a quick fix. I was able to give the customer a quick turn-around and their customer is pleased with the results. Plus, while the app was created for square screen device, many places now utilize the complete screen if resolution is more rectangular.

Posted by Avonelle on Wednesday, March 04, 2009. There are 0 Comments.

Default <td> width: 0 is my friend

Ugh. Browser differences are a real pain.

Today’s irritation comes from IE 7 which has resizing my table column widths despite providing explicit ones.

This tidbit provided a solution. I added a default style for the td tag with a width of zero. Now everything is hunky dory.

This may not seem like a big deal, but I had single character columns that were taking up more space that columns with lots of text, which just created a lot of unattractive whitespace.

Posted by Avonelle on Thursday, February 26, 2009. There are 0 Comments.

SQL Server Report with Extra Blank Pages

I wasted an hour on this one today, so hopefully this helps someone else. I was making modifications to an existing report and suddenly every other page had an empty body section. It turns out the width of my report body got accidentally increased. If it is bigger than the size of the page, you end up with these blank pages when saving the report as PDF.

Posted by Avonelle on Thursday, February 19, 2009. There are 0 Comments.

The benefits of rebuilding your tables after a schema change

This post on why it is better to rebuild a table after dropping or adding a column was very informative. Those Red Gate folks are pretty smart – I’ve learned quite a a few things on the simple-talk site.!

Posted by Avonelle on Thursday, February 19, 2009. There are 0 Comments.

Bureaucratic programming

vogon Jeff Atwood’s recent post on the The Ferengi Programmer may be my favorite so far this year. Jeff posits that some programmers fall into a trap where they attempt to define a large set of rules for programming, similar to the Ferengi rules of acquisition. I think the comparison to the rules of acquisition is a bit flawed, since none of the Ferengi in Star Trek seem to be overly burdened by the rules like the programmers Jeff describes. Instead I would argue these programmers are bureaucrats, like the Vogons in the Hitchhiker’s Guide to the Galaxy.

Of course it all begins innocently enough. It starts with a bad project. The project goes wrong somehow – impossible deadlines, miscommunication, poor architecture, something. And it is painful. Afterward the programmers, project manager, customer, whoever, thinks “there must be a better way”. They make a list of what they would do differently. They have a  post mortem meeting to discussion where things went wrong. And next time they try to do better, using the lessons they learned from the first project.

Except the next time, new problems are encountered. Users keep changing their minds. The design is flawed. Or whatever. So there is another post mortem, and they add to the list. Lather, rinse, repeat.

And this is okay. In fact it is good. We should learn from our mistakes. We should try to improve. All good.

But…

There is a belief by some that if we just enforced a set of rules, a collection of standards, best practices, on our programming staff, we could eventually hit some kind of programmer nirvana where nothing would ever go wrong.

Not gonna happen.

Why? First, as the rules get longer and more complex, no one can remember them. And no one follows them. They become a joke. And second, the rules depend on the presence of smart people who care about what they are doing. It doesn’t matter how many rules you have in place – if your people are crap and don’t care about what is going on around them, 1 rule or 100 won’t make any difference.

The bureaucrats think they can prevent problems and chaos with more bureaucracy.

This is mistaken. Rules and standards are useful tools, but they alone cannot prevent problems with software projects. Only smart people who care about the craft make a real difference.

Posted by Avonelle on Thursday, February 12, 2009. There are 0 Comments.

The conflicting priorities of security and testability

How hard is it to test interfaces with payment gateways? In my experience, it isn’t a trivial enterprise. Last week I was working on getting AbleCommerce working properly with First Data. I had everything set up in test mode, and I got authorization for credit cards working fine, but when I tried to actually capture the funds, it was generating an error.

As it turns out, I wasn’t able to actually test capturing the funds. Apparently once you get the authorization working properly, you just assume everything else will be fine. It also occurred to me that even if it did work, there wasn’t a place (that I knew of) on the First Data site that would let me see my test transactions so that I would know that they were processed successfully. I had to run real transactions through, where I discovered that it was important for me to mark the order as “shipped” in AbleCommerce before I tried to capture the dough.

Of course, there are lots of payment gateway choices out there, and perhaps they don’t all work the same way, but my guess is that this is a common issue.

I have another customer with a custom application that does payment capture also. I can change his application so that it runs in “test mode” – in fact it is in a config setting so it is no big deal. But I’m pretty confident that I can’t test the payment integration from my development machine, as typically one of the security rules is that you have to identify in the payment gateway settings the URL your application will be accessing the gateway from. Since a development machine typically doesn’t have a public URL, you have to actually copy your app to production and test that way. Geez. That doesn’t seem like an optimum approach. Also, this is fine for a new app that isn’t available, but what about an existing application? There certainly isn’t a good way to turn off the app (except for your tests).

Again, I might be wrong and First Data might be the exception. And I think security, especially for something like credit card processing, is important. But I wish that there was more emphasis on helping developers with a true test environment.

Posted by Avonelle on Monday, February 02, 2009. There are 0 Comments.

Thoughts on software quality

There seems to be two schools of thought about software quality:

School #1: If you write code that is difficult to maintain and/or test or is yucky in some other way, you suck as a programmer, and should be hung from your toenails to die.

School #2: The only thing that really matters is: does your code work? If it doesn't, you suck as a programmer (see school 1).

I think there are a lot of people in school #1 who think that anyone who has ever written crap code doesn't have any professional standards and doesn't care about the quality of the work they do. And I'll admit, if I thought a programmer didn't care, I wouldn't want them on my team either.

The problem is that it isn't that black and white. I don't set out to write bad code. Sometimes I just can't find a better solution to a problem. Or I'm up against a hard deadline. Or I didn't know there was a better way.

Lots of times I look at code I wrote a year ago and think "What was I thinking? There is a much better way to do this." Software development is a journey of learning. I'm never going to be perfect, but I am always getting better.

Davy Brion and JP Hamilton have each written some great posts about how this can happen, and admit they sometimes write crappy code too.

We shouldn't forget about school #2. In the end, most customers and end-users only care about if the code works. But educating them can help them to see that good code quality is more than just "does it work". Clean, easily maintainable code provides a long term benefit to non-coders in quicker iterations and cheaper modifications.

Posted by Avonelle on Sunday, January 25, 2009. There are 0 Comments.

How to discourage anyone from working overtime

Tim Stall has a good post on how to discourage a developer from working overtime. I think what he misses though is that these are things that would discourage anyone, not just a developer.

A friend of mine left her non-programming job of several years in 2008 for a new job that is in many ways less flexible than her first. The previous organization was surprised - they thought her performance had slipped because she started a family and wasn't interested in work anymore. The truth was that they had changed her job so that she was left only with tasks that she found boring. They constantly changed her priorities; every email she got from her supervisor was marked "urgent". After awhile, she lost all motivation to do her job.

Sometimes we act like developers are special creatures. Actually they are pretty normal.

Posted by Avonelle on Saturday, January 10, 2009. There are 1 Comments.

How C# let me down today

I'll admit - C# isn't my regular language of choice. I don't have anything against it personally; I just am not a big fan of case sensitivity and semi-colons. But I never found it truly annoying until today.

As mentioned previously, I'm using the Pivotal web services generator for a way my app to talk to Pivotal. The web services generator creates C# source code, which is fine. Unfortunately, we discovered this issue with the IDs for certain Pivotal objects being hard-coded into the generated code. This is no big deal if you are generating web services for fun or from production, but usually it is preferable to use the same compiled code across development, test and production, and this prevents this approach.

Since I don't expect these web services to change much, I thought an okay workaround would be to modify the generated code to read the IDs from a config file. That way, when we move from test to production, we can just change the IDs. Sounds reasonable, right?

Ugh.

I wanted to make the changes to the generated code in an automated fashion so that if we regenerated, I could just re-run my updates and be good to go. I really only had to change a few places, but this was the one that bit me:

switch (ASRLID)
{
	case  "8000000000000041":
		Contact_for_Order data1 = new Contact_for_Order();

I thought I could just change the "case" line to use a variable. No can do. This is because while switch....case is similar to select case in VB.NET, it has one important difference: it requires that the case items be constants or enums - variables are not permitted. I read a number of explanations about why it works this way, including those of several people who believe this is superior. Bully for them, but in my situation it really wasn't very helpful. (Apparently I'm not the only person who has been frustrated by this.)

At any rate, the solution was for me to also change the switch...case to an If...then statement. (My code only contained one case item anyway, so it isn't the end of the world.) A bit more work, but not a deal breaker.

Posted by Avonelle on Wednesday, January 07, 2009. There are 0 Comments.

Getting started with SQL Server 2008 Spatial Data

John Paul Cook has a great post on how to get started with spatial data in SQL Server 2008. I especially liked that he included a picture of the spatial results tab. Definitely of use if you are looking for a reason to switch to SQL 2008.

Posted by Avonelle on Saturday, October 18, 2008. There are 0 Comments.

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. Next page