Random Assignment

Thursday, August 26, 2010 by Rich Armstrong

Up until recently, our support team used a pick-and-choose-type issue selection, where we go through the Inbox project, browsing through issues, seeing which cases we'll deign to spend our precious mental resources on.

Bad idea. First, by time you evaluate the issue to see if it's something you'll deign to spend your precious mental resources on, you've already spent time on it. So have the other three people who looked at it and decided they didn't want it. Every extra person who looks at an issue wastes their time on it.

Second, you tend to get skewed skills. It's much better to expose the entire support staff to the full breadth of requests coming into a given queue. Otherwise, you get things like one LDAP guy who can never go on vacation.

To mitigate this, we've taken two steps. First, we used the FogBugz Python API to create a random assignment script. This script gathers all the cases that come in via email and via our Twitter feed monitor script.  It sorts them by correspondent. That way, you don't spend twenty minutes answering a question while your colleague has gotten the "never mind, I found it" email. Then we dole them out to the people working in the Inbox at the time. If you're out of the office or working on a plug-in, you have a case assigned to you that takes you out of the pool. We rely on the law of large numbers (and the fact that we're not automatons) to spread out the work.

It's been tremendously successful. We all noticed a big productivity bump.


Actions: E-mail, Permalink


SQL Server 2008 Express

Tuesday, June 15, 2010 by Rich Armstrong

We found out recently that SQL Server 2008 Express, the free edition of SQL Server, has increased its database size limit from 4GB to 10GB!

SQL Server is an enterprise-grade database that runs FogBugz flawlessly and almost never corrupts or crashes. In our experience, for running FogBugz, it's far superior to MySQL or Access.

How much usage can you expect before exceeding 10GB? Well, it depends on how you use the software. If you're using FogBugz for regular email correspondence with your users (with normal size attachments), it would take a few years to hit this limit, and we can help you clear out old stuff when that day comes, extending your free usage by a year or more. If you're not using FogBugz for email, attachments, or large log files, you'll probably be fine until The Singularity.


Categories: General, FogBugz

Actions: E-mail, Permalink


Removing Problematic Info

Tuesday, April 28, 2009 by Rich Armstrong

I wanted to provide a solid workaround for case deletion, a common customer request.   If you have access to your own FogBugz database, you can edit and delete cases directly. This applies primarily to people hosting their own install of FogBugz.

If you cannot access the database or if you're using FogBugz On Demand, the simplest way of approximating deletion is to sequester the case. Create a new project named "Sensitive Info", and add it to a new department called "Confidential". Set the department permissions such that only site admins have access, then move the case into the new project and close it.  No one other than site admins will be able to see the case or any reference to it (including case relations).  It will not show up in any searches except by site admins.

If you have access to the database and sequestration doesn't work for you, then the following is an example of one way to proceed.  It is offered without guarantee as to its safety or efficacy, but simply as an example of how one might go about moving data in this way. This example will use MySQL, but the process should be applicable to Access or SQL Server.

First, back up your database.

Let me say that again: back up your database.

Is your database backed up? Okay, then let's proceed.

Next, you'll need to find the ID of the offending BugEvent. Bug events are the entries on the case page.  They look like "Assigned to Joe Biden by Barack Obama" and a timestamp.  They can also take the form of an email, with text like "Replied by Rich" and a timestamp at the top of the email.  If you click on that timestamp, you'll see a #BugEvent value added to the URL.  This is the bug event's ID.

Log into your FogBugz instance of MySQL on the command line.  Run this command:

SHOW DATABASES;

You will get output like this:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| FogBugz            |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.00 sec)

In this case, your FogBugz database is named FogBugz.

Run this SQL:

SELECT * FROM FogBugz.BugEvent 
  WHERE ixBugEvent = 8675309;

The text in the "s" field should match up to the text you want to delete.  Note that if this is an encoded email, the text might be a block of gibberish.

Now, we want to create a table to hold the data we're going to remove.  This is not strictly necessary if you just want to blow away data, but you might come to regret deleting data outright, and this gives you some insurance.

First, create a new database:

CREATE DATABASE DumpingGround;

Now, we want to create an exact replica of the BugEvent table in the new database. To do this, we use a handy feature of MySQL called "SHOW CREATE TABLE". (The equivalent in SQL Server is "Script Table As".)

SHOW CREATE TABLE FogBugz.BugEvent;

You'll get something like this:

| BugEvent | CREATE TABLE `BugEvent` (
  `ixBugEvent` int(11) NOT NULL auto_increment,
  `ixBug` int(11) default '0',
  `sVerb` varchar(128) default NULL,
  `dt` datetime default NULL,
  `ixPerson` int(11) default '0',
  `s` longtext,
  `fEmail` smallint(6) default '0',
  `fExternal` smallint(6) default '0',
  `sChanges` longtext,
  PRIMARY KEY  (`ixBugEvent`),
  KEY `bugindex` (`ixBug`),
  KEY `dtindex` (`dt`),
  KEY `BugEventDtAsc` (`dt`,`ixBugEvent`),
  KEY `BugEventDtDesc` (`dt`,`ixBugEvent`)
) ENGINE=MyISAM AUTO_INCREMENT=18675309 DEFAULT CHARSET=latin1 |

We want to create a copy of that table in a new database to store information.  Take everything between the second set of pipes (||) and copy it off, adding a database name to the table name, so it goes from `BugEvent` to DumpingGround.BugEvent. 

CREATE TABLE DumpingGround.BugEvent (
 ... 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


Okay, now we have a place to put the data we're going to remove.  Is your database backed up?  Good.  Here's the command to run.

INSERT INTO DumpingGround.bugevent 
  SELECT * FROM FogBugz.bugevent
    WHERE ixBugEvent = 8675309;

You should get this output:
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0

Right now, these two queries should give you the same results:
SELECT * FROM FogBugz.BugEvent 
  WHERE ixBugEvent = 8675309;
SELECT * FROM DumpingGround.BugEvent 
  WHERE ixBugEvent = 8675309;

Now, we just need to remove the data from the bug event in the FogBugz database.  We don't want to delete the row entirely. It might cause problems with data integrity. So here's what we run:

UPDATE FogBugz.BugEvent 
  SET sVerb = 'Removed', ixPerson = -1, s = '' 
  WHERE ixBugEvent = 8675309;

This changes how the event shows in the interface.  It will now say "Removed by FogBugz". The timestamp and any other information, such as assignments or changes in priority, will be preserved, but the data is gone.  You could also experiment with placing text into the "s" column, such as "Please contact an administrator to retrieve this text: Event# 8675309".  That's up to you.

You'll need to secure the DumpingGround database to your satisfaction so that the data remains preserved but secure.





Actions: E-mail, Permalink


Interruptions and EBS

Wednesday, March 25, 2009 by Rich Armstrong

Recently, on our FogBugz support forum, someone asked how to deal with interruptions in Evidence Based Scheduling.  You can read the full discussion here.

I wanted to post my response here, because it highlights some best practices.  The question was basically this: How do I account for my developers getting interrupted?  Sometimes they get pulled away on support issues.  Sometimes those support issues blow up into full-blown projects.  I want to account for this in FogBugz, but I don't want to add more overhead.  What do I do?

Our answer: 

This is one of those areas where we have to decide whether we make the software as complicated as reality, thereby making the software less usable, or keep the software simple, thereby making it a less-than-perfect reflection of reality.  In general, we lean toward the latter. Indulge me in a semi-related example and then I'll detail how this design philosophy applies to EBS and interruptions.

Often, people write us asking that only X type of user be allowed to set X field (e.g., only project admins can set priority). Rather than adding rules to the software, we recommend that this be addressed at the team level. This is because we've generally found that if you try to enforce your will/process on a person or class of people via software rules, they will either bridle at it, ignore you, or work around the system where possible. If you make the system impossible to work around, they will just stop using it and keep things on Post-it notes on their monitor. Everyone loses. 

The best-case scenario is where everyone agrees with and follows the rule.  In this case, the rule is then unnecessary, because everyone is already on board. All you need is minimal oversight to make sure that errors don't slip through. You can do this with a filter pretty easily. If we did this by disallowing a particular action in the interface, then that simply becomes a hindrance in the 3% of instances where you need to work around the rule. If one project admin is sick and the other one on vacation, you need to bother the site admin to make someone a temporary project admin and... well, you get the point. This makes the software less usable, which makes people use it less, which degrades the value of the software.

With respect to EBS, you mention two different kinds of interruption. In one case, it's a support issue, which might give rise to a couple hours of dev work troubleshooting, replicating, and filing a new bug. In another, the interruption blows up into a fully formed project.  I'll address the latter first, because it's handled in EBS.

You can see the trend of your ship date with the Ship Date Over Time graph.  If the line trends to the right, rather than upward, you are adding new work to the release faster than you can finish it. If interruptions blow up into legitimate sub-projects, you need to estimate those projects and figure out what gets dropped from the current release. This is a prime EBS use case, and sort of the thing it was designed to do.

As to the unplanned interruptions, it might be better to deal with these out-of-system, at least partially, rather than trying to track them explicitly. This will be greatly helped if you break up and estimate your regular development tasks in smaller chunks.  This has several benefits.  Not only will this tighten then ship date distributions for all developers, it will tighten the overall ship date confidence distribution.

Then, you just need to figure out the cases where things took much longer than they were estimated and figure out why.  If your developer gets pulled away from a 1 hour bug into a 3 hour call they would charge 4 hours to a 1 hour case.  This is what we would call a slow velocity. They're not super-easy to tease out of the system but you can review closed cases and see what the elapsed vs. estimated times are.

If a dev gets pulled away on one of these calls, she can simply make a note in the case (e.g., "pulled away on Dunder-Mifflin call") and move on with her work.  Then, when the case shows up on your filter of recently closed cases, you have an explanation for why the case ran long. You can then use your managerial skills to figure out what to do about it. The danger here is forcing the devs to account for other cases in which they overran their estimates, but these can be helpful as well (e.g., "took much longer than expected because the Initech API is a mess."). Whether it's a tech call or a messy dependency, these cases highlight risks to your ship date. Reviewing these cases regularly can help you highlight and manage those risks.  And, as we've seen recently, letting a computer tell you about risk can itself be risky. It's knowledge work, and demands a human touch.


So, to summarize, the cushioning effect of EBS should allow you to focus on shipping software, rather than counting hours. We would only recommend tracking interruptions if the tracking gives you clear, actionable information about how to avoid those interruptions and ship your software. If your top dev gets pulled away for 15 minutes to help a customer, thereby overrunning her 2 hour estimate by 30 minutes (when you figure in task-switching penalties), that's not really a big deal. She might've even gained something by the interaction. If you as a manager see that your devs are constantly overrunning their estimates, and that they're forever on the phone with Dunder-Mifflin, or forever chasing down silly PHP config issues, you might want to dedicate some brain time to figuring out how to resolve the larger issue, rather than spending your time figuring out just exactly how much time you're wasting.


Categories: FogBugz

Tags:

Actions: E-mail, Permalink


An API Tutorial Plus Excel 2007 Export... Plus Zombies!

Wednesday, March 18, 2009 by Rich Armstrong

NOTE: FogBugz 7 has been released, and it includes a CSV export plug-in. This article is still a good starting place for people interested in exploring the API, or in extracting other types of data, like hours worked, into a spreadsheet. 

 

Sometimes, you just need an Excel spreadsheet.  Sometimes, you just need to be able to slice and dice your cases in the way that's right for you.  Sometimes, you need to drop the case report into a Powerpoint slide to show to the higher-ups.

Sometimes, you need to go out hunting radioactive zombies and you need a hard copy... because neither WiFi nor 3G will penetrate the lead lining of your specially adapted Semi-Autonomous Radioactive Zombie Eradication Vehicle (SARZEV).

Well, if this sounds like you, then I have good news.  I'm happy to report that because Excel 2007 supports XML, it works well with the FogBugz API.  There's a few steps here, but in the process you'll learn a little about Excel and a lot about our super-easy API.

The first step is to come up with a view into the data that suits your needs.  If you're going out to hunt the undead, information is your most powerful weapon. Well, maybe a rail gun is your most powerful weapon... but information is a close second.

First, get your data. Here's an example of the data you might want:

 

To get this from FogBugz to Excel, you just need to get the same data from the API, which sounds scary, but come on! Aren't you going off to destroy the undead?  Why are you scared of a little API action? Seriously, it's easy.

First, you'll need an API token.  This is a 30-character code that will allow you to act via the API as if you were signed in to FogBugz. I use Chrome almost exclusively, but when I am working with the API, I like to use FireFox. Its XML rendering is a bit friendlier.  You want to go to:

https://[your fogbugz]/api.asp?cmd=logon&email=[your email]&password=[your password] 

 

This token is valid until you hit Log Off in the FogBugz interface or log off in the API. Now, you're ready to build your query.

Remember that page with the original search on it?  If you go and look at the URL string, you'll see a searchFor parameter.  This is the encoded search string that you will use to replicate the exact same search in the API.  Here's what mine looked like:

 

Build that into the URL below and you'll start getting your first data back from the API

https://[your fogbugz]/api.asp?token=[your token]&cmd=search&q=[your search parameter]

So, mine is (broken out for clarity):

https://zombiewatch.fogbugz.com/api.asp?
token=k5ea5jecjsv1qjo7gg54mcngebb852
&cmd=search
&q=assignedto:%22lead-lined%22+status:active

This should give you the same list of cases, but with only the case number.  For our example, we need to add a cols parameter to tell FogBugz what case information to return.

&cols=ixBug,sTitle,sVersion,sComputer

Here, we are using the FogBugz built-in custom fields to denote the type of zombie and its decay level.  We call them "Type" and "Decay" in the interface, but the API needs to be consistent, so we use the original names.  The data is unaffected.

So here's what the whole URL looks like. 

Now, open Excel 2007 and open a new spreadsheet, then choose the Data tab and From Other Sources, then From XML Data Import.

 

Paste your URL into the Open dialog that comes up, then hit Open.

 

You might get one or more messages that look like this.  Just hit OK on each of them.

 

 Then you'll get a message like this:

 

Again, it's fine to just click OK here. And here's you're reward.

 

Okay, so it's not the prettiest thing in the world, but click that "Summarize with Pivot Table" button and you can get something pretty good:

 

From here, you can get charts and graphs and all sorts of other neat reports that will help you make your case that the undead will soon rule the earth.

Be careful out there. 

ps. 

I've created an Auditor read-only user on zombiewatch.fogbugz.com, with the password of "password".

If you want, you can get a new token for this user by going here. With that token, you should be able to play around with the API to your heart's desire.  If you want to mess around with your own site, though, you can do so by going to try.fogbugz.com.

OH, and, duh, here's the full documentation on the API.


Actions: E-mail, Permalink


Placeholders

Saturday, January 31, 2009 by Rich Armstrong

Snippets are a powerful feature of FogBugz, but many people don't know about placeholders in snippets.  These allow you to put a tag in your snippet text that will automatically be replaced with a value from the case.

The easiest way to see how these work is to see them in action. To do this, I created a test snippet which shows me all placeholders and the values they're replaced with.  Take the whole of the text below and copy it into a "test" snippet, then use it in a case (preferably one that's been emailed in).

A lot of folks ask us (as I asked when I first joined) why we don't have a snippet for extracting the first name out of the email's From address.  The simple answer is that this is not just a simple database value that we can pop into the text.  This will be one of my big wishes for future versions of FogBugz, but it won't be coming any time very soon.

Note that these placeholders work in outgoing autoreplies as well. Here's the snippet text: 

{case} (case) for the case ID
{sender} (sender) for the sender's email address
{subject} (subject) for the subject of the message
{ticket} (ticket) for the external ticket ID
{url} (url) for the URL of the FogBugz install
{ticketurl} (ticketurl) for an external link to the case
{ticket} (ticket) for the non-URL portion of the link.
{username} (username) for the name of the logged on user
{useremail} (useremail) for the email of the logged on user 

Categories: General, FogBugz

Tags:

Actions: E-mail, Permalink


Deleting a Wiki Article

Thursday, January 22, 2009 by Rich Armstrong

A lot of people are surprised we don't just have a button to delete a wiki article.  While that would be nice, it's not that simple.  Wiki articles are usually linked to other wiki articles, and these inbound links need to be dealt with before we can move forward with deletion.

Simply go to Wiki > Customize and choose your wiki to edit.  If on the Edit Wiki page you click the "List all articles in this Wiki" link, you'll be taken to a list of all the articles, each of them with a count of inbound links.  Click the number of inbound links and you'll get a pop-up listing the articles that link to the article you'd like to delete.  Once you've edited those articles to remove the links, you can go back to the Edit Wiki page and select "List all orphaned articles in this Wiki".  Your article should now appear in this list, along with a handy delete button.


Categories: FogBugz

Tags: , , ,

Actions: E-mail, Permalink


Shrinking Large SQL Server Transaction Logs

Friday, November 07, 2008 by Rich Armstrong

It's possible with some configurations of SQL server for the transaction logs to grow very large.  This has even at times threatened disk space on some of our customers' servers!  It's an infrequent support request, but to solve this, it's essential to use DBCC SHRINKFILE.  Here's some steps.

Back up your database! 

Launch SQL Server Management Studio.

Open up a query window associated with the database with the large transaction log. (Right-click on the DB and choose new query.)

Get the logical name of the transaction log file.  (Right-click on the DB, select Properties, then in the Files screen, grab the Logical Name... probably ends in something like _Log.)

Execute the following, substituting <log_file_name_Log> with the appropriate logical name of the database log file, no quotes needed:

  1. DBCC SHRINKFILE(<log_file_name_Log>)
  2. BACKUP LOG <database> WITH TRUNCATE_ONLY
  3. DBCC SHRINKFILE(<log_file_name_Log>)

Afterwords, perform a full backup of the database. 

The file should shrink to a ridiculously small shadow of its former self. 


Categories: FogBugz

Actions: E-mail, Permalink


Troubleshooting the FogBugz Screen Shot Tool

Friday, November 07, 2008 by Rich Armstrong

The FogBugz screen shot tool is a pretty simple thing, but you'd be surprised how often people run into difficulty with it.

Luckily, troubleshooting problems is pretty easy.  On Windows, we use the same libraries IE uses, so if you can log onto your FogBugz account with IE, you should be able to use the screen shot tool.

By far the most common mistake happens when people move servers or FogBugz installs. After that, you need to make sure that the FogBugz URL in your screen shot tool points to the right install.  You can find it on the bottom of the screen.

 


Categories: General, FogBugz

Actions: E-mail, Permalink


A Halloween Treat

Friday, October 31, 2008 by Rich Armstrong

I've got a treat to celebrate Halloween for all the FogBugz fans out there!

I had been intending on creating a blog post about how you can set the various options within a case entry form from within the query string of the URL.  Rather, I created a small submission form to show you how to do it.  I should warn you that I'm most decidedly not a web designer, so this thing is bare bones.  It's so ugly it's scary!

Zombie Watch

The big news here is the sEvent parameter.  We can pre-populate the new case submission form with templates for users to fill in.  Kudos to my coworker Adam for figuring this out. We also figured out (finally) how to set the From address on outgoing emails through the URL.

Constructing one of these URLs or forms requires going to the database or into the code of your submission page to figure out what value to give the parameters.  For the public submission page, the settable params are:

  • sTitle
  • ixProject
  • ixArea
  • sCustomerEmail
  • sVersion
  • sComputer
  • sEvent
For normal case creation:
  • ixProject
  • ixArea
  • ixFixFor
  • ixCategory
  • ixPriority
  • ixPersonAssignedTo
  • sTitle
  • sDueDate (in form 2008-10-31)
  • sDueTime (in form 13:00)
  • sVersion
  • sComputer
  • sEvent 
  • hrsCurrEstNew
For the Send Email form:
  • ixProject
  • ixArea
  • ixFixFor
  • ixPriority
  • ixPersonAssignedTo
  • sTo
  • sFrom 
    • (e.g., &sFrom=%22Zombie%20Flanders%22%20%3Ccases@zombiewatch.fogbugz.com%3E)
  • sCc
  • sBcc
  • sTitle
  • sDueDate (in form 2008-10-31)
  • sDueTime (in form 13:00)
  • sVersion
  • sComputer
  • sEvent 
  • hrsCurrEstNew
 
This fits with numerous customer requests for the ability to set the outgoing email address, pre-populate email templates, etc, so we're really happy to have figured all this out!
 
Happy Halloween! 

 


Categories: FogBugz

Actions: E-mail, Permalink


Best of Both Worlds: Adding a search to a filter

Tuesday, October 21, 2008 by Rich Armstrong

Here at Fog Creek, we use searches a lot.  Almost to a fault, I would say.  Searches are so flexible that once we find a search that we like, we just bookmark the results page and use that to see the exact view we want.  But filters are still pretty good.  They allow you to see the exact columns you want, allow you to limit the number of rows returned, among other things. 

What a lot of people don't know is that you can mix searches into filters.  I make frequent use of the color:blue search term, which shows me only things that I haven't looked at since they've changed.  It's a great way of staying on top of what's going on in a given area.  Filters only allow you to check the box that specifies "Only items viewed by me" and not it's reverse.  However, you can simply add "color:blue" to the "Search for" field and voila!: only the freshest cases.

Unread Inbox:  All cases in Inbox opened in the last month containing color:blue

I also use negatives in the "Search for" box.  I have a lot of documentation that I intend to write (this is a drop in the ocean), but the customer comes first, so I don't want my eventual goals interfering with providing great customer service.  I want to exclude documentation from my main view of cases assigned to me.  I don't want to become myopic and only look at, say, the Inbox project.  What happens if someone assigns me a FogBugz case?  So, I add "-area:doc" to my main saved filter.  It removes everything that I'm procrastinating (in favor of making you, the customer, happy), and allows me to see only the stuff I want. 


Categories: FogBugz

Actions: E-mail, Permalink


Using Excel Refreshable Web Queries with FogBugz

Wednesday, October 01, 2008 by Rich Armstrong

Customers often write in asking how to get FogBugz data into Microsoft Excel.  Though we do want to provide the ability to export data from FogBugz to Excel, it's still some way off, but that doesn't prevent you from using the two products together.  Excel has a "refreshable web query" functionality that will allow you to pull data from FogBugz into Excel rather than pushing.  Here's how you do it:
  1. Bring up IE and log into FogBugz, selecting "Remember Me"
  2. Figure out your data. Bring up a list of cases that reflects what you want to report.
  3. Copy all. Ctrl+A, Ctrl+C.
  4. Open a new Excel sheet and paste.
  5. Before you do anything else, look in the lower-right corner of the screen. There should be a little clipboard icon there. Click it and select "Refreshable Web Query".
  6. A box should pop up with a mini browser window. Click the yellow arrow next to the list of cases, changing it to a green check box, and click Import.
  7. The report should come up in Excel. This will be a live report that can be refreshed to reflect the current state of the data. To freeze this report in time, select Data > Properties and uncheck all the refresh options, or Data > Connections and remove any connections you find.

Categories: FogBugz

Tags: , ,

Actions: E-mail, Permalink


Entourage 12.1.2 and FogBugz On Demand Lost Passwords

Friday, September 05, 2008 by Rich Armstrong

A patch has recently been released for Microsoft Office 2008 for Mac that has us breathing a bit easier, or would, if we could have everyone who used MSOffice 2008 for Mac install it.

If you use Entourage to handle your mail and have tried to get our FogBugz On Demand servers to send you a link to reset your password, you might've gotten something like this:

http://entoutrage.fogbugz.com/?pg=pgDemandPass=1=asdf123

This is a non-working URL due to the way Entourage handles ampersands in mail.  The real URL should look more like this:  

http://entoutrage.fogbugz.com/?pg=pgDemandPass&ixPerson=1&x=asdf123

If you're getting invalid password reset links and use Entourage, you should update to 12.1.2 take advantage of the latest fixes. 

If that's not an option, you can copy the link to a text editor and just insert the missing portions.  Add "&ixPerson" before the second equal sign, and "&x" before the third, then paste that into your browser.

We've gotten one report that the MH-E interface to the MH mail system has the same issue.  Again, this is an issue with the handling of ampersands in email.  We're not sure if a fix will be coming out for that system.


Categories: General, FogBugz

Tags:

Actions: E-mail, Permalink