Monday, March 24, 2008
Programmatically Executing SQL Scripts
const char splitChar = '☻'; //this character should never appear in command files
if (createDatabaseScript.Contains(splitChar.ToString()) == true)
throw new Exception("Aborting. Splitting this file may break the script because the script contains the split character");
using (dbConnnection)
{
dbConnnection.Open();
SqlCommand createDbCommand = new SqlCommand(string.Empty, dbConnnection);
//split the input script into multiple scripts based on GOs
foreach (string command in createDatabaseScript.Replace("GO", splitChar.ToString()).Split(new Char[] { splitChar }))
{
try
{
createDbCommand.CommandText = command;
createDbCommand.ExecuteNonQuery();
}
catch (Exception ex)
{
//log the error for later review.
results += ex.Message + Environment.NewLine;
}
}
}
Console.Write(results);
Monday, March 17, 2008
FxCop bug - CA1709 & CA 1707
CA 1709 IdentifiersShouldBeCasedCorrectly
I ran into a surprise last week. FxCop is throwing warnings for properties on 2 out of 5 interfaces in a particular project. Interface A implements interface B.
I'm assuming the bug described in this article is causing it: http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2344375&SiteID=1 and that it will be fixed in Visual Studio 2008 Service Pack 1.
Monday, March 10, 2008
Unit Testing Graphics Operations
Here is a simple implementation using Linq.
Setting up the expected value:
Bitmap aBitmap = new Bitmap(181,46); //exact size of the bitmap to reduce the number of bits
Graphics aGraphic = Graphics.FromImage(aBitmap);
target.DrawGrid(aGraphic); //the operation you want to verify
MemoryStream actual = new MemoryStream();
aBitmap.Save(actual,ImageFormat.Bmp);
string aBunch = string.Join(",", actual.ToArray().Select(b => b.ToString()).ToArray());
Copy the string aBunch. We will use this to create the expected byte array.
create the byte array like this but use your pasted values instead of my values
byte[] expected = new byte[] {66,77,78... };
Finishing the unit test:
Bitmap aBitmap = new Bitmap(181,46);
Graphics aGraphic = Graphics.FromImage(aBitmap);
target.DrawGrid(aGraphic);
MemoryStream actual = new MemoryStream();
aBitmap.Save(actual,ImageFormat.Bmp); // get our actual result.
byte[] expected = getExpected("DrawGridTest");
Assert.IsTrue(actual.ToArray().SequenceEqual(expected),"Binary comparison failed.");
This method is getting expected from a function because Visual Studio responds slowly when there are long lines of text. I created a partial class containing the instantiation of expected (I'm using a switch statement). I thought about putting the results in a resource or a file, but I'm preferring code for now.
Friday, February 29, 2008
Speeding up Unit Testing in Visual Studio 2008
Initially I thought it was copying data into the TestResults directory. Some of our unit tests rely on files and our test run copies ~30 MB of data into the TestResults directory.
I found out it was the code coverage instrumentation process slowing it down. On my machine it seems to take about a second to instrument an assembly for code coverage. Our project has 8 assemblies which adds ~8 seconds to every run. While it is important for our server build to have all the assemblies instrumented, when I'm creating unit tests I just need to have my assembly instrumented. Going into the GeneralRun.testrunconfig --> Code Coverage and instrumenting only the assembly I'm working on reduces the run speed by about 7 seconds.
If you do this, ensure you don't accidentally check this change into Team Foundation Server or you won't get complete code coverage results.
Skipping the deployment of the 30MB of data had no noticeable effect on the test run times.
Monday, February 25, 2008
Creating a metafile in .NET
MSDN article on MetaFiles: http://msdn2.microsoft.com/en-us/library/ms536391.aspx
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
MemoryStream metafileStream = new MemoryStream();
Graphics offScreenDC = Graphics.FromHwndInternal(IntPtr.Zero);
IntPtr myImagePointer = offScreenDC.GetHdc();
Metafile meta =
//new Metafile(myImagePointer, EmfType.EmfOnly); //unable to do memoryStreamSave
new Metafile(metafileStream, myImagePointer, EmfType.EmfOnly); //able to do memoryStreamSave
Graphics aGraphic = Graphics.FromImage(meta);
aGraphic.DrawLine(new Pen(Brushes.Black), new Point(0, 0), new Point(29, 29));
aGraphic.Dispose(); //Dispose must be called to flush the drawing instructions.
offScreenDC.ReleaseHdc();
meta.Save(@"c:\metaSave.wmf"); //saves as a png file.
FileStream aWrite = new FileStream(@"c:\StreamSave.wmf",FileMode.Create); //saves as a wmf file
metafileStream.WriteTo(aWrite);
Saturday, September 22, 2007
Rudolf Melik, CEO of Tenrox speaks at PMI-MCAC
Thursday, September 13, 2007
Jay Wren speaks at Flint branch of GLUG.net
Jay is relatively new to speaking. I was very impressed by his personable, enthisiastic, and engaging style. He replied with well thought out answers to each question he was asked. He introduced Test Driven Development with a few slides and then dove into a live demo of NUnit. He asked the audience for sample requirements and used the non trivial task of developing a two way dictionary as his sample. Generally I dislike live coding samples because things go wrong. Jay showed his .net prowess and mastery of Coderush by quickly correcting all type os and errors.
I think Jay summarized test driven development with this statement "How do I use this vs. what do I need." When we code first we are creating what we need. When Jay codes tests first he is consuming his API and thus gains a new perspective on the API which leads to better design and usability.
Jay briefly gave a demo of NCoverExplorer and Coderush. I recently installed Coderush, and thanks to Jay's brief demo I started effectively learning it today. NCoverExplorer is a test analysis tool which shows executed lines, cover % how many times a particular method was called etc.
I was reading Jay's blog today which has some good entries.
Friday, August 17, 2007
Jeff McWherter speaks at GLUG.net
Jeff has a cool website where you can do a bit of stalking to see what TV shows he is going to record, and if he is at home (based on if his laptop is on the network or not).
We had 17 members attend and everyone won a prize!
Thursday, August 16, 2007
Inagural Flint branch of GLUG.net Meeting
Friday, August 10, 2007
SQL Server random number generator
It demonstrates a few interesting ideas:
1) Temporary tables - These are in memory temporary tables (I use these all the time)
2) SQL Server looping with While (you may use these instead of cursors. I've heard cursors are slower)
3) Random number generation with newid() (select top 5 * from [table] order by newid() returns 5 random rows.
4)
declare @tempTable table (column1 int) --declaring a temporary table
declare @i int
set @i =1
While @i <=1000000 begin insert into @temptable (column1) select abs(cast(cast(newid() as varbinary) as int))%5+1 set @i = @i +1 end
--select * from @temptable
select column1 as [value],count(*) as [Occurrences],
cast(count(*)*100 / cast((select count(*) from @temptable) as decimal) as int) as [Percentage] from @temptable
group by column1
Wednesday, July 18, 2007
Jing, a Free Image Capture & Screen Recording tool
We will probably use this tool for training.
Thursday, July 12, 2007
Greater Lansing User Group .net (GLUG.net) July Meeting
When: Thursday July 19th 6:00-8:00 PM
What: We always have give away hundreds or thousands of dollars worth of swag along with free pizza and pop for everyone. This month we will also be announcing the opening of the Flint branch and our Vice President Vivek has secured all our membership 100 MB of free hosting from Verio.
Julia Lerman will be our first female speaker. She will be presenting on ADO.NET Entity Framework.
Visit our website for more details: www.glugnet.org
Friday, July 6, 2007
Updating Binary Data in a Gridview
Our customer needed the ability to update an image in a database. I wanted them to be able to view and edit all the data through the datagrid.
In your data source you need to specify the select command to display the data and the updateCommand to update the data:
SelectCommand="usp_CAMP_get_rejected_batches"
SelectCommandType="StoredProcedure"
UpdateCommand="usp_camp_resubmit_deposit_ticket"
UpdateCommandType="StoredProcedure">
<UpdateParameters>
<asp:Parameter Name="deposit_id" Type="Int32" />
<asp:Parameter Name="deposit_slip_no" Type="String" />
<asp:Parameter Name="deposit_date" Type="DateTime" />
<asp:Parameter Name="Amount" Type="Decimal" />
<asp:Parameter Name="image" /> </UpdateParameters>
</asp:SqlDataSource>
I used a TemplateField to include the FileUpload control which allows a user to select a file from their computer for upload. This also allowed the same column to be used to display the image and change it.
<asp:TemplateField HeaderText="Deposit Ticket">
<EditItemTemplate>
<asp:FileUpload ID="imgUpload" runat="server" />
</EditItemTemplate>
<ItemTemplate>
<asp:Image ImageUrl='<%#DataBinder.Eval(Container.DataItem, "DEPOSIT_IMAGE_URL")%>' runat = "server" />
</ItemTemplate>
</asp:TemplateField>
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
e.NewValues.Add("image", CType(GridView1.Rows(e.RowIndex).Cells.Item(5).Controls(1), FileUpload).FileBytes)
End Sub
- To format data in the grid you need to have HtmlEncode
turned off - For the upldate to send the primary key field and have that field set to invisible you need to specify the primary key in the DataKeyNames property for the GridView.
Friday, June 15, 2007
ArcREADY: Reinforcing the Foundations of Solutions Architecture
Here are my main take aways from the presentation:
Steps in architecting the user experience:
- User Interface Design
- User Research
- Design Planning
- Information Design
- Usability Testing
There are 4 concepts to consider when architecting the user experience:
- Function (works great)
- Aesthetics (looks great)
- Interaction (relates to you)
- Process
There are 3 business principles to consider:
- What is possible?
- What is viable?
- What is desirable to users?
Tuesday, June 12, 2007
XSLT Tool - Cooktop
I found a free one today: Cooktop
It worked for what I wanted and it was free. I would like to have one tool for viewing XML files and editing XSLT, but I don't like CookTop's display as well as I like XML Notepad's hierarchical view
Tuesday, May 29, 2007
Visual Studio 2005 Class Diagrammer
I looked at the Visual Studio 2005 Class Diagrammer briefly when I first started using the product. I didn't think it did much, thought Visio was better, and didn't use it anymore. End of story.
While preparing a presentation on my current project I found Visio wasn't creating the pretty diagrams I wanted. I decided to try the Diagrammer again. After you create a class diagram, you can hit the + key or hit the triple upside down ^ icon to get the diagram to expand. It does a nice job of displaying your class.
I've found a few useful features in the class diagram menu: Show Base Class, Show Derived Class, Change Members Format --> display full signature. There is also a Refactor -->Extract Interface which looks handy.
Changes made to the diagram or in code are instantly synchronized between the two.
Unfortunately there is no integration between Visio and the Class Diagrammer. You can click on an object in the class designer and copy paste it as a picture into PowerPoint Visio (I took independent pictures of each object and created new connector lines in Visio)
.NET report viewer page display problem
After searching around on the internet we found a fix. This fix has to be implemented after the page renders (trying to do it right after setting the zoomMode or after form.show won't update the page numbers)
'''
''' This is to get around a bug in the report viewer which caused it not to display the page numbers.
'''
'''
ReportViewer1.SetDisplayMode(DisplayMode.PrintLayout)
''' ReportViewer1.ZoomMode = ZoomMode.PageWidth
''' '''
'''
Private Sub ReportViewer1_RenderingComplete(ByVal sender As Object, ByVal e As Microsoft.Reporting.WinForms.RenderingCompleteEventArgs) Handles ReportViewer1.RenderingComplete ReportViewer1.SetDisplayMode(DisplayMode.PrintLayout)
ReportViewer1.ZoomMode = ZoomMode.PageWidth
End Sub
Wednesday, April 18, 2007
Elected to Greater Lansing User Group .net
Attendance is around 35 people per meeting which puts us in the top 10% of .net user groups nationwide.
Friday, April 6, 2007
Sasha Verhage, Design lead for Google
Technology - focus on usability and the end result not technology ie. Ajax - some product managers want to 'ajaxify' products. Only do it where it makes sense.
· Google Maps
o Craig's list mashup
· Yahoo Mail – looks like Outlook.
· Ajax programming reduces page views and companies need to find alternate revenue streams (less ad views)
Live Testing
· Google Ads
o in one test changing the font can impact revenue. One test showed bolding search terms in ad results increased revenue 8%
o colors are also important. Green link colors for ads tested very high
o bucket testing (segmenting users into control groups and test groups)
o changing colors can increase revenue (7%-15% in one example based on 200,000 people
· blue color schemes generally win across all demographics
· Brand, Brand Halo - blind 'taste tests' remove branding from websites for blind
User Generated Content
· Use when appropriate (ie travel rating sites, Google Sketchup/Google Earch)
Attention Economy is real
· People trying to do more at once with technology (cell phones, ipods, facebook, myspace)
· multitasking is overrated (it takes ~15 minutes to return to a task you were deeply concentrating on prior to interruption)
· one study estimated interruptions and recovery time at 28% of employee time
· attention has economic value (free cell phones with voice ads, Slate.com customers can pay to have ads removed)
Search Engine Optimization
· SEO increases your likely hood of showing up based on the algorithm and what the user expressed
· trip Advisor gaming Google (the phrase 'Las Vegas' was memtioned 62 times per page on this small site)
Friday, January 19, 2007
Book Summary: Agile Software Development with Scrum
I really liked this book. Sounds like an interesting methodology. I'm trying to use some of the concepts at work (particularly the do work first and show it instead of discuss how to do it). Unfortunately my work environment isn't structured to fully support this development methodology.
Rough Schedule:
- Sprint Planning meeting to determine what goals to set for a sprint
- builds a product increment (working code) after a sprint (30 days of development time) Sprint Backlog cannot be changed from outside the team during a sprint
- demonstrates product increment to team management and client after a sprint (Sprint Review Meeting 4 hours)
- End of Sprint Meeting - reflect on what was accomplished during the sprint
- **Ongoing-15 minute daily team (ideally sized at 5-8 staff) meetings stating:
- what have I done since the last meeting
- what will I do until the next meeting
- what impediments are getting in my way
- autonomous
- self organizing
- don't have roles assigned by management (no titles)
- must not be disturbed or given direction by anyone outside the team during a sprint
- need to be cross functional
- Scrum Master-facilitates meetings and removes impediments
- Product Backlog -prioritized list of business and technical functionality that needs to be completed for the system
- Product Owner-the only one who changes the product backlog
- Sprint Backlog-states what needs to be done in the current sprint
- Pigs-Team members
- Chickens-interested parties who will not be assigned work (they may attend scrum meetings but not speak)
- Release backlog - subset of the product backlog that is scheduled for a release
- Shared Resource Scrum Teams - responsible for code used across multiple Scrum teams