Geeks With Blogs

Scott Kuhl Warning: I may have no idea what I am talking about! December 2006 Entries
Unsubscribing from Newsletters

Now I'm not stupid and I don't try to unsubscribe from newsletters I didn't request.

But, have you ever noticed, that even with legitimate newsletters the unsubscribe process is shady?  When you subscribe it usually takes about 5 seconds before you get a welcome e-mail and your first newsletter.  When you unsubscribe you get a message that you will be removed from the mailing list in 10 days or some other ridiculously long time frame.

Posted On Thursday, December 21, 2006 9:24 AM

ThinkGeek Saves Christmas

Both items were received yesterday.  They were shipped back on the 15th.  It looks like all of this mess was due to software bugs.

ThinkGeek needs some work on its customer service processes, but they did fix the problem, which ultimately is the biggest issue.  So I will keep shopping with them and hope this was all a fluke.

Read ThinkGeek Ruins Christmas

Posted On Thursday, December 21, 2006 9:12 AM

Adobe Acrobat 8

I'm upgrading my home laptop to Windows Vista.  When I downloaded Adobe Reader, what I got was version 8.  When did that release?

Posted On Wednesday, December 20, 2006 9:17 AM

Worst Trained Tech Support Ever
I'm ranting a lot today, must be the holidays! Last night I had the pleasure of talking to the worst trained technical CSR ever. And he worked for Microsoft. If you want to skip the whole story just read the two sentences in bold. The problem was with my Zune. Over the weekend it stopped syncing. I went to the Zune site and tried every solution on the site until I got to the last (re-install the Zune software) which worked. The only problem I had was that I lost my play counts which I use to filter ......

Posted On Tuesday, December 19, 2006 9:51 AM

ThinkGeek Ruins Christmas
Every year I buy a present or two from ThinkGeek for my wife. This year was no exception. Since she reads this blog I won't say what I bought. I bought 2 items on the 11th, both in stock. I checked back 24 hours later and item 1 was in processing and item 2 was in stock and ready to ship. Well yesterday I noticed that the package still had not arrived. I checked the order and now item 1 was STILL stuck in processing and item 2 was sold out. They didn't bother reserving item 2. WTF! I called ThinkGeek ......

Posted On Tuesday, December 19, 2006 9:10 AM

Vista Zune Compatibility Launch Today

Get it at

I guess I know what I'll be doing on the Christmas break.

Posted On Tuesday, December 19, 2006 8:38 AM

I'm a Zune
Someone at Microsoft is getting sick of the I'm a Mac commercials. Video: Apple Mac vs. PC - Zune vs. Ipod ......

Posted On Thursday, December 14, 2006 8:23 AM

Hell Explained By Chemistry Student
I don't normally post "joke spam" that friends forward on, but this one was good. If it's old and you've seen it, please don't flame me too bad. Thanks Eric! The following is an actual fictional question given on a University of Washingtonchemistry mid-term. Bonus Question: Is Hell exothermic (gives off heat) or endothermic (absorbs heat)? Most of the students wrote proofs of their beliefs using Boyle 's Law (gas cools when it expands and heats when it is compressed) or some variant. One student, ......

Posted On Wednesday, December 13, 2006 4:26 PM

Getting Started with SubSonic (Download PDF)
Here is the full article in PDF format. Complete with bookmarks to each section of the article. Summary SubSonic is an open-source toolset, created by Rob Conery, as an attempt to put the fun back into programming and just get the job done. Inspired by Ruby on Rails, SubSonic takes a minimalist approach to coding and emphasizes convention over configuration. While it takes its inspiration from Ruby on Rails, it is not a port of it. (Check out MonoRail it that's what you're looking for.) Instead, ......

Posted On Saturday, December 9, 2006 2:35 PM

Getting Started with SubSonic - Part 25 (Final), Starter Kits
SubSonic Starter Kit From the CodePlex site, you can also download the SubSonic Starter Kit. To use this, from Visual Studio, select New -> Web Site and pick SubSonic Starter Site. This will give you a good starting template for your own site that includes the following. _Dev\ASPNET_Membership - Web pages for user and role membership editing. _Dev\Generators - The same generators found in the sample web site plus a MigrationGenerator page. Run this page and it will create SQL scripts containing ......

Posted On Friday, December 8, 2006 9:57 PM

Getting Started with SubSonic - Part 24, Sample Web
The sample web that is downloaded along with the SubSonic source has been discussed periodically throughout this guide. The following is a list of what is provided. App_Code\Utility.cs - Miscellaneous functions commonly needed when building web applications. App_Themes - A default theme to get you started. Dev\CodeTemplates - Text file representations of the templates used to generate classes. Use these as a starting point if you need to create custom templates. Dev\DB - Sample database scripts for ......

Posted On Friday, December 8, 2006 9:54 PM

Getting Started with SubSonic - Part 23, Conventions
Controllers Instead of accessing the data functions directly, the Controller design pattern is recommended. To implement this, create a Controller class in the App_Code directory. public class ProductController Then add methods to retrieve the data using collections. public ProductCollection GetAllProducts() And to update the data. public void UpdateProduct(Product product) While there is nothing enforcing these rules, it will make it easier to insert business rules and re-use methods from a single ......

Posted On Friday, December 8, 2006 2:06 PM

Getting Started with SubSonic - Part 22, Code Generation Templates
There is one more way you can tweak SubSonic without changing the code. SubSonic creates the auto-generated classes by using standard text. By adding alternate text files to the templateDirectory defined in the configuration file, you can change this behavior. For a full sample list of these files, check out the CodeTemplates directory in the sample web site. Find the entire series of posts here ......

Posted On Friday, December 8, 2006 2:05 PM

Getting Started with SubSonic - Part 21, Scaffolding
The scaffold control is used to quickly create developer level admin pages. By dropping a single control on the page, you get a GridView and update controls. This control should appear in your Toolbox under SubSonic Components. Just set the TableName property and you're ready to go. <cc1:Scaffold ID="Scaffold1" runat="server" TableName="Products"><... It is also possible to apply some visual formatting through the EditTableCSSClass, EditTableItemCSSClass, EditTableLabelCSSClass ......

Posted On Friday, December 8, 2006 2:04 PM

Getting Started with SubSonic - Part 20, Stored Procedures
Some tasks are just too complicated for dynamic query building and/or require a greater level of control. To handle this, SubSonic supports stored procedures. Each stored procedure will produce an equivalent static method in the class defined in the configuration file. By default this is SPs. Each method will have one parameter for each stored procedure parameter and return a StoredProcedure object. SubSonic.StoredProcedure sp = SPs.CustOrderHist(customerID); The stored procedure can then either ......

Posted On Friday, December 8, 2006 2:03 PM

Getting Started with SubSonic - Part 19, Queries - Commands
If the querying power of SubSonic falls short for your needs, you can still use the existing functionality and extend it by accessing the commands that are being built before execution. (These can also be very helpful when debugging.) The query object has four commands: BuildCommand, BuildDeleteCommand, BuildSelectCommand and BuildUpdate that all return QueryCommand objects, as well as the GetSql method that returns the raw SQL. string sql = query.GetSql(); Each auto-generated object also has the ......

Posted On Thursday, December 7, 2006 1:26 PM

Getting Started with SubSonic - Part 18, Queries - Aggregate Functions
Three aggregate functions are included as static methods. To get a column average call GetAverage with the table and column name, and an optional Where object. SubSonic.Query.GetAverage(P... Product.Columns.UnitPrice.T... You can also do the same for GetCount and GetSum. Find the entire series of posts here ......

Posted On Thursday, December 7, 2006 1:24 PM

Getting Started with SubSonic - Part 17, Queries - Updating and Deleting
It is possible to issue insert, update and delete commands through the query object by setting the QueryType property. (Your options are Delete, Insert, Select, Update). query.QueryType = SubSonic.QueryType.Insert; If you want to add a specific update setting, such as setting all records to a specific value, you can use the AddUpdateSetting method, which can be called multiple times. query.AddUpdateSetting(Prod... 100); Find the entire series of posts here ......

Posted On Thursday, December 7, 2006 1:23 PM

Getting Started with SubSonic - Part 16, Queries - Filtering
Columns By default, the query will return all columns in the table. This can be changed by supplying a comma delimited list of columns to the SelectList property. query.SelectList = Product.Columns.ProductName + ", " + Product.Columns.SupplierID; Rows The query will also return all rows in the table. This can be changed several ways, the easiest of which is the Top property, which can be set to return only the given number of rows. query.Top = "10"; (I'm not sure the reasoning, but this value needs ......

Posted On Thursday, December 7, 2006 1:22 PM

Getting Started with SubSonic - Part 15, Queries - Ordering
You can order a query by setting the OrderBy property to either ascending or descending and providing a column name. query.OrderBy = SubSonic.OrderBy.Asc(Produc... or query.OrderBy = SubSonic.OrderBy.Desc(Produ... Unfortunately at this time there is no way to order by multiple columns. Find the entire series of posts here ......

Posted On Thursday, December 7, 2006 1:18 PM

Getting Started with SubSonic - Part 14, Queries
Beyond all the basic filtering available in Fetch methods and collection filtering, SubSonic also provides a way to dynamically build SQL queries. To get started, create a new Query object, using the CreateQuery method. SubSonic.Query query = Product.CreateQuery(); or pass it the table name SubSonic.Query query = new SubSonic.Query(product.Tabl... or pass it the table schema SubSonic.Query query = new SubSonic.Query(Product.GetT... The last option will prevent SubSonic from loading ......

Posted On Wednesday, December 6, 2006 10:40 PM

Getting Started with SubSonic - Part 13, Collections
For a more traditional object-oriented approach to multiple objects you can use the auto-generated collections. Just like classes, SubSonic will also generate a collection for every table. (The naming convention for collections is ClassCollection.) These collections are implemented as Generic Lists that include some additional functionality. Loading a Collection The simplest way to load a collection is by calling the Load method with no parameters to retrieve every record. ProductCollection products ......

Posted On Wednesday, December 6, 2006 10:38 PM

Getting Started with SubSonic - Part 12, Classes - Underlying Data
Auto generated classes may expose a simple object based interface, but below the surface the data is being held in ADO.NET DataTables. SubSonic exposes a few methods that allow you to get at the underlying structure. The TableName property returns the name of the actual table associated with the object. product.TableName; The static class method GetTableSchema returns the underlying table. SubSonic.TableSchema.Table tableSchema = Product.GetTableSchema(); Note: There is also a static property Schema ......

Posted On Wednesday, December 6, 2006 10:36 PM

Getting Started with SubSonic - Part 11, Classes - Business Rules
There are two places that business rules can be injected into the Save process. A PreUpdate method is called at the beginning of the Save process and a PostUpdate method is called at the end. Both of these methods are virtual methods defined in each class that take no parameters and have no return value. To define these methods, create a partial class file with the same name as the class. public partial class Product{ protected override void PreUpdate() { // Do something } protected override void ......

Posted On Wednesday, December 6, 2006 10:34 PM

James Kim Found Deceased

Goodbye James.  Rest in peace.

Posted On Wednesday, December 6, 2006 4:35 PM

Copyright © Scott Kuhl | Powered by: