 Friday, August 05, 2005
Time for everyone to update your RSS readers. The Atlanta .NET Regular Guys will not be posting to www.devcow.com/weblogs anymore. We've moved to www.devcow.com/blogs.
Why?
Because the new blogging engine we're using will allow us to host other people's blogs. We have recruited a few select individuals to blog with us:
- Todd Fine - RDA consultant/Microsoft Regional Director
- Mark Dunn - .Net Rocks co-founder/VB.Net MVP/Training guru
- Eric Thompson - all around bright guy who got in b/c he and Brendon are good friends (I suppose now I'll have to be his friend too)
- Dan Attis - co-leader of the Atlanta Microsoft Professionals User Group and part of the team designing the content for the SharePoint 1, 2, 3! event
Of course, you can continue to expect the same quality content from Brendon and myself, posting together as the Atlanta .Net Regular Guys. Feel free to read the blog's aggregate post or jump directly to the ADNRG blog.
-- Matt Ranlett
 Tuesday, August 02, 2005
Do you want to learn more about Visual Studio.Net? Do you not have enough time to slog through a book? How about some nice relaxing videos where you can learn all about Visual Studio.Net? Check out www.learnvisualstudio.net and their rather nice library of training videos. If you’re a member of the Atlanta .Net User Groups, you can get a 10% discount on membership. Send me an e-mail to let me know that you’re interested and I’ll get you the contact info you need.
— Matt Ranlett
posted with BlogJet
 Monday, July 25, 2005
$99 gets you a full day of training from DevelopMentor (former home of Don Box and Chris Sells and our very own Doug Turnure). It's at the Cobb Galleria and you're a sucker if you don't go. Sign up via the banner on the SQL Server User Group - www.atlantamdf.com and you'll help earn the group a donation. You'll also get a kickback of your very own. If you sign up through AtlantaMDF, you'll get a $25 Amex cash card. Of course, you don't have to tell the people reimbursing you that you'll be getting some cash back...
-- Matt Ranlett
PS - you won't see this even on the calendar b/c it's not free.
Wally McClure, in an effort to avoid having to come up with his own content, has started producing a podcast where he gets other people to do the dirty work for him. "I'm not sure I can let you whitewash this fence, I'm having an awful lot of fun..." (vague reference to Tom Sawyer).
Seriously though. Wally is a great guy and it was fun to help him out with a little bit of regurgitated material. Brendon and I basically recorded what we presented at the Atlanta Code Camp, which was a rehash of several webcasts, books, and articles. I hope you don't get too bored if you listen.
http://weblogs.asp.net/wallym/archive/2005/07/24/420403.aspx
-- Matt Ranlett
 Friday, July 15, 2005
I work in a place where we have lots of clients with lots of servers and hundreds of remote terminals. If you ever have a problem on a terminal while it's in use, it's inconvenient to the users to tell them that you need to take over their teminal for a while just so you can look at the event log. So you use remote tools to read the eventlogs. I do this quite frequently, but I thought it might be worth sharing this article someone sent me.
***********************BEGIN ARTICLE************************
Viewing remote Event Logs
By Adrian Grigorof, B.Sc., MCSE
The description of events is not stored in the Event Logs but in Message Files specific to each application. The Event Viewer is able to open remote event log files (binary files with the EVT extension) but not the Message Files. The Message Files (actually DLL or EXE files) are required in order to properly display the description of the event.
For example, assume that computer APPSERVER is running an application called "Smart Application", a service called "smartapp". When the service is started, smartapp generates an application event log entry. Running Event Viewer on APPSERVER on can see the event description as follows:
"The Smart Application service has started successfully."
Running the Event Viewer from the administrators workstation (ADMINWKS) and connecting to the remote registry of APPSERVER, one can see the event description quite differently:
"The description for Event ID (100) in Source (smartapp) could not be found. It contains the following insertion string(s): The Smart Application service has started successfully."
All this means that the Message File specific to Smart Application events is not installed on ADMINWKS or there is no message file defined for that application. In case that there is a message file and if it is desired to display the event properly on the administrator's computer (or on any computer) the Message File dll has to be installed.
Here is the procedure:
1. Locate the dll
All the application event logs messages DLLs are defined under the following registry keys:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application
All the system event logs messages DLLs are defined under the following registry keys:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\System
So, for example, Smart Application would probably have an entry for its Application-type events like the one below:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\SmartApp
EventMessageFile (of REG_EXPAND_SZ type): C:\Program Files\SmartApplication\smartapp.dll
All the application event log messages are defined in the smartapp.dll
2. Export the registry keys
Using REGEDIT select the applicable registry keys. In this example:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Application\SmartApp
On the Registry menu, click Export Registry File and select a file name (for example,SmartApp.reg).
3. Import the registry keys into ADMINWKS
Copy the SmartApp.reg to ADMINWKS and using REGEDIT import the keys in the local registry.
4. Copy the message file on ADMINWKS
From APPSERVER C:\Program Files\SmartApplication copy smartapp.dll to the ADMINWKS C:\Program Files\SmartApplication
5. The events should display the description properly when viewed from ADMINWKS
In some cases, there is no Message File so the description is not displayed properly not even on the computer running the application. This usually indicates a poorly written application (that is the application is creating event log entries but the programmers didn't bother creating Message Files) or the installation of the application was incomplete or corrupted.
In many cases, one can deduct the actual description by reading just the last part of the message. So for example, from "The description for Event ID (100) in Source (smartapp) could not be found. It contains the following insertion string(s): The Smart Application service has started successfully." one can discard everything but "The Smart Application service has started successfully.". This would work for events that do not contain parameters and sometimes may offer clues even for those that do use parameters.
***********************END ARTICLE***************************
-- Matt Ranlett
 Tuesday, June 28, 2005
 Monday, June 13, 2005
I let Brendon sleep in again. D’Arcy and I headed over to the convention center early again for breakfast. I swear – that Canadian is crazy! A wild man!
Anyway, the first session I caught was Rob Howard’s early morning cabana talk about his company Telligent Systems and their Community Server product (the successor to .Text). He answered lots of my questions and provided the group with a roadmap for the future of Community Server. Number 1 cool thing I learned is that Community Server’s main mission recently has been to provide multiple methods of access to their products. Not only can you browse their forums on the web, but they also support NNTP access to the forums so you can browse and reply the forums from your favorite news reader (Agent, Omea, Outlook Express, etc.). Since the Telligent Community Server runs the ASP.Net forums, I’ll be adding them to my list of newsgroups in Omea.
Brendon caught up with me at the cabana (he managed to make it for the last half of the presentation) and then we went to go give our stuff to Mark D. Mark D and Mark B drove down to Orlando from GA and offered to load up all of our stuff in their car so we didn’t have to ship it all back. This turned out to be really useful as Brendon and I took a few boxes of books to give to the groups. We managed to completely fill the trunk of Mark’s CRV.
Back at the conference center everything was shutting down. The vendor area had closed down the night before. The community cabanas were in “give away all the remaining stuff” mode so we got some packs of CDs for the groups. We helped break down the INETA booth by deflating some random palm trees and beach balls. We said our good-byes to everyone who was leaving that day and made plans with those who were sticking around to go out for dinner that evening.
Cut to Bahama Breeze. Brendon, Rob, and Caleb rode with D’Arcy (who’d rented a car as he was sticking around for vacation after the conference with his wife). Trisha and I caught a ride with Keith Nicholson, an old friend of Mark Dunn’s. We all went to Bahama Breeze for an excellent dinner. The rain was really coming down, so our initial plan to go to the hotel pool was crushed. Instead we decided to go to the Pac Man Cafe and Arcade in Port Orlando (near where the Jam Sessions and Influencer’s party had been). Trisha’s actually pretty good at video games. Caleb sucked and Rob didn’t play. Brendon beat us all at every game he played. We had all purchased cards that gave us unlimited play for an hour, so when our hour was up we headed back to the hotel. The plan was to go to the pool.
Back at the hotel, we all ran up to change, but when we got down to the pool we found that they’d already closed it due to the previously bad weather (which was clear by now). Too bad, it was a really nice pool complete with a lazy river to float around in. Brendon, Caleb, and Trisha found the hotel game room, complete with free Foozeball. Once again, Brendon showed off that he was the best at games. Whichever team he was on won. After everyone was tired of losing to Brendon we went up to the bar for a drink. At this point, Brendon was Elimi-dated. Has anyone ever seen that show on UPN or wherever where a group of guys tries to all date one girl, all at one time. She eliminates the potential dates, one at a time, until she’s down to just one. That was our running joke of the evening b/c Trisha was the only girl with 5 other guys. Rob and D’Arcy were Elimi-dated first b/c Rob quit after the Pac Man arcade (and D’Arcy left to drop him off and pick up his wife at the airport). Brendon was next, so it was just Caleb and I drinking a beer outside with Trisha. Ok, I had a beer, Trisha had wine, and Caleb had some fruity girly drink called a Red Devil. We made fun of him for that. Eventually I was the next to go – 12:30 AM and I was tired. So I left Caleb and Trisha with a half dozen of Trisha’s friends who we found inside the bar.
Tech Ed’s over. I had a blast, learned a lot, met tons of great people, got lots of UG swag, and basically ate and drank myself to oblivion. I’m exhausted!
— Matt Ranlett
posted with BlogJet
Brendon slept in this morning, so I left early with D’Arcy and headed over to the convention center to have breakfast. After breakfast I went to Rob Howard’s presentation on building data driven web sites. I’ll post the notes I took in another blog posting.
Yesterday, Mark D. told Brendon and myself that if we took the BizTalk mini-exam that we’d get free copies of the Sams Publishing BizTalk Server Unleashed, regardless of our scores. Now, I’ve never seen BizTalk. I attended 1/2 a session on beginning BizTalk on Monday and a cabana session with Mark Berry on Tuesday. Brendon’s company uses BizTalk in their solutions, so he’s been studying (he actually already had the BizTalk book). Anyway, I went and took the exam and apparently did well enough to get into the BizTalk/Commerce Server/Host Integration Services party at Universal Studios that evening. I was previously unaware of the party. I told Brendon about the party and that he should take the exam even if he already had the book.
I BEAT Brendon on the BizTalk exam! I know I was lucky, but it happens rarely enough that when I beat Brendon at something I get to gloat a bit. Now that I’ve gloated, Brendon says he committed to grinding me into the dirt with his score on the real BizTalk certification exam when it comes time to take it. I’m sure he’ll do it too… But for now, the story is that I beat Brendon at something.
After more cabana sessions, Brendon and I headed over to the BizTalk/Commerce Server/HIS party at Jimmy Buffet’s Marguritaville in Universal Studios. Open bar, prime rib, mahi-mahi… I think I’ve had more to eat and drink this week than ever before! After the party, Brendon and I wander around Universal with Marky Mark and the Funky Bunch (that’s what we started calling Mark Dunn, Mark Berry, and the people from the BizTalk dev team (especially Yumay – the PM for BizTalk – she’s funky). We watched Shrek 4D, rode the Mummy, Terminator 3D, Back to the Future (my head got bashed into the wall so many times on this ride I left with a headache). We also indulged in some more free food. I ate until I was ready to pop!. Good times!
— Matt Ranlett
posted with BlogJet
We started our day at 7:30 am by meeting up with Mark Dunn and heading from breakfast to the second keynote address. This time the speakers were essentially Samantha Bee and Paul Flessner – vice president of Windows Server Systems. Paul’s actually been to Atlanta recently giving a talk about SQL Server. I think he’s had a promotion since then. Anyway, we had a cool demo of the new RFID support built into Visual Studio, SQL Server Reporting Services, and SQL 2005 64 bit vs 32 bit. It turns out that while Microsoft has the 3rd place marketshare of Database $$ behind IBM and Oracle, they are the #1 installed database across all platforms (including Unix, Linux, and mainframe) in the world. This includes leadership in the enterprise application area. The capture fewer $$ b/c they cost so much less. The sideshow talked about a $320,000 per processor cost to install IBM’s DB2 vs Microsoft’s $25,000 per processor cost.
After the keynote it was my turn to work the CodeZone booth. CodeZone has officially launched now, so I can tell you what it is. Head over to www.codezone.com to check out the next evolution in developer web portals, this one supported by Microsoft but driven by the community at large. Sign in and create a profile which identifies your particular development interests and your location (zip code). The portal site will allow you to add your favorite blogs and news feeds to your portal desktop. As the site is based on ASP.Net 2.0 web parts, you can drag the content windows around to fit your particular needs. One of the best parts is the local events container. Since this is a community driven site, if anyone enters something (a new blog, a new event) which the system thinks you might be interested in, you get informed as the new items bubble up onto your screen. This is sort of like a MyYahoo or MySharepoint portal site, but developer focused.
Brendon and I had lunch with Todd Fine and the RDA crew. Most of the lunch conversation was dominated by RDA business, but we did occasionally discuss the conference and the sessions. The RDA people seemed to really be focusing on the BizTalk sessions.
After lunch, Brendon and I headed over to the cabanas to listen to a BizTalk session with Mark Dunn and Mark Berry. Mark Berry presented an intro to BizTalk’s context driven routing. To those of you who aren’t sure what BizTalk is, it’s a product Microsoft sells to help connect systems together by taking messages (output) from one system, performing required changes on the message, and sending the message to the next system in the chain. BizTalk is an Enterprise Application Integration program, able to connect several systems together with a single central point of orchestration. When talking about context based message routing, BizTalk is able to promote certain elements of a message to the message context or header. Then, based on the information in the context, certain operations can be done. For example, let’s say we have an order processing system taking in orders from both the US and Mexico. If we wanted to send the US messages to one shipping department and the Mexican messages to another shipping department, we could promote the origination location information to the context and programmatically decide which send port should receive which message. Logically quite simple, the extreme flexibility of the BizTalk product make this less than trivial to configure. Mark Berry was an excellent instructor and gave me a thorough understanding of the hows and whys behind context driven routing. I’m sure that I’ll have to do more research if I ever actually want to use the entire product, but I’m now aware of the high quality of training programs available at Dunn Training.
Tuesday night featured the CodeZone launch party – open bar, shrimp, sushi, alligator, potato cups filled with cheese and more. The food was great and the company was better. I saw lots of (now) familiar faces and spent some time chatting with Chris Williams from South Carolina, Trisha Lacey from Microsoft and CodeZone, Caleb Jenkins from Oklahoma, Frank La Vigne from Virginia, Rob Zelt from North Carolina, and more. If I miss names, I apologize. I’m writing this from memory and I did have a drink or two. I did want to mention the cool toys Trisha handed out to those of us on the CodeZone beta testing team. We got these neat digital compasses which will be very handy whenever we go camping or driving around in unfamiliar territory.
After the CodeZone launch party, several of us headed over to play the Mobilizer Madness game. If we won we could win a smart phone or some other fancy electronic doodad. Here’s the game: you get an internet aware Pocket PC phone connected to a website. You have to follow the prompts to answer a variety of questions and complete a variety of missions. We had to use the Pocket PC to take a creative photo, answer two questions about previously delivered mobility-based sessions, and interact with a variety of actors sprinkled around the convention center. Our character interactions involved playing Boggle, attempting to pick up a woman at a coffee bar, making a “tourist” laugh, and listening to a story for hints from a guy dressed like a Blues Brother. The entire affair was timed – 1 hour to get as much done as possible. We ended up coming in 5th place out of 15 teams, but we blame our poor performance on the two kids who joined our group. They ended up with the phone as the contest started and were fairly intent on not giving it up. They had this terrible habit of reading half of the question and then taking off running at top speed away from us. We wasted at least 10 minutes and split the group up several times trying to keep up with them. Brendon and I were sure that if we had control of the device we could have done better by fully reading the directions for each mission. Oh well – we didn’t end up in last place.
Following the Mobilizer game, Brendon and I headed over to the DotNetNuke Birds Of a Feather session where the creators of the DotNetNuke web portal software talked to us about the past, present, and future of their software. DotNetNuke runs hundreds of websites ranging from small community sites like the Devcow website to some extremely critical intranet sites. One guy at the BOF session was from a hospital equipment sales company who used DotNetNuke for 1500 users across several countries. The guys from DotNetNuke were extremely nice and were happy to talk about how they were making money on their free software, how they were looking for help from the community to build up their library of modules, and about their involvement and commitment to keep their software free for anyone who wants it. This was a great session and I received a copy of the Wrox book about developing for DotNetNuke as a result of my brilliantly probing (or extremely uninformed) questions.
We ended the day by heading over to the TechNet Jam Session at a local nightclub where who do we see playing piano during Wild Cherry’s “Play that Funky Music” but Atlanta’s own Glen Gordon! He’s good too! We hung around for several hours, having a beer or two while chatting and listening to random blues-y/folksy music before heading out for the evening.
— Matt Ranlett
posted with BlogJet
 Wednesday, June 08, 2005
TechEd day three – the first session of the day is an ASP.Net session led by Mr XML Web Services Tim Ewald.
I showed up late due to a venue change (why when they change rooms do they have to put them on the opposite sides of the mile long conference center?)
- Thinktecture’s code generator takes a WSDL contract schema and creates a framework of the application, complete with all the appropriate web services attributes. This, combined with the WSDL generator Tim was in the process of demonstrating as I walked in (CodeFirst from XMLSoap.com?), allowed Tim to create a skeleton web service without typing a single angle bracket. These third party tools enable schema first design to be less painful than in the past. Remember that when you are specifying an external contract you need to give the web service binding a name and a location. Then in the web service method attribute you need to reference that binding
- It is better to pass objects around through web services rather than passing around individual parameters. Rather than passing strings and integers to the web service methods, use an object as the only parameter in and out. This enforces the contract first design and allows for looser coupling in design. This model also makes it easier to retrieve the body of the message as XML vs multiple parameters. When specifying the service method’s ParameterStyle attribute, be sure to use the SoapParameterStyle.Bare value
- Using the XMLSerializer is a great idea as it handles marshaling. It maps instances to XML and types to XSD. It won’t process data without clear XSD mapping. Restrictions include the fasts that it only processes trees of data, it only handles public data, no duplicate references, limited support for polymorphism and limited support for collections. You’ll notice lots of XML type information in the WSDL generated attributes. This allows support for polymorphic data through the XML Serializer. To do this, you have to inform the parent type about the child type. This is the limitation of polymorphism in the XML Serializer – this is for the XML API. When designing your WSDL contract, you need to annotate your XML base types with the child types so the marshaler and the schema generator can work correctly
- Missing data – if the message doesn’t contain some expected data, the XMLSerializer uses the default value for that data type. Missing ints become equal to 0, missing strings = “”. Extra data is ignored. The XML serializer is not a schema validator – that is up to you. For optional elements, you can detect if the parameter was actually sent over the wire by checking with xyzSpecified (use the XMLIgnore attribute when defining the schema). In the 2.0 version, you can use the “?” style in the definition of the class to define the type as nullable (ex public int? Age). By using he XMLElement IsNullable=”false” attribute means that an optional piece of content which won’t be passed over the wire as nil.
- Access to XML, it is useful to bypass default marshaling and work with raw XML for schema validation, transformation and complete control over (de)serialization. This gives you the ability to make decisions on a per type basis. To work with the XML object, it is inefficient to load up a DOM object to read the XML nodes. Instead implement the IXmlSerializable interface and stream the XML with the ReadXml (XmlReader), WriteXml(XmlWriter), and GetSchema methods. GetSchema is used in 1.0 and 1.1. In 2.0 you can use an XML Schema Provider.
- WSDL.exe running from the command line avoids choices made by visual studio.net and is the only way to generate a server skeleton. This helps resolve proxy namespace issues. Helps with duplicate type issues but you have to be careful with files URIs – use the full URI on the command line eg file://
- Sharing types – the plumbing generates XSD types in service namesspaces by default. If you use the same CLR type across services, you get types in different XSD namespaces. If you generate client code for each service, you get different incompatible types in XSD. This is a problem, so you have to get around it by applying an XMLType attribute to explicitly specify an XSD namespace. This is great but can cause collisions on the WSDL type definitions. In 1.0 you have to reference the external schema (writing the contract by hand) or you could use the SoapExtensionReflector. In 2.0 you can use “wsdl.exe /sharetypes” In 2.0, you must process all the WSDLs at one time for the comparisons to work
- Using facades – data formats exposed on the wire are almost certainly not what the service or client works with internally – it’s a simplified model for easy consumption. Services and clients use the facade pattern to isolate internal details of the service from the client.
- Versioning – ASP.Net offers no intrinsic versioning model. The goal is to evolve service without breaking clients. The most common solution is to build additional endpoints. This requires mapping multiple facades to common internal models.
- WS-I basic profile 1.0. Using this you can claim conformance to the WS-I basic profile using the WebServiceBinding. This is great for interoperability.
Tim’s demos reinforced how web services are a great method for building web applications today. Great show.
— Matt Ranlett
posted with BlogJet
 Tuesday, June 07, 2005
November 7th!!!
Lanuch party announcements to come...
-- Matt Ranlett
 Sunday, June 05, 2005
I’m reading back over some downloaded blogs when I come across this entry by Jay Kimble over at CodeBetter.com. Basically, Jay writes about his having noticed a sort of backlash against the DBA. Take a look at O/R Mappers, object persistence, and even some of the older OODB stuff. Jay postulates that there may be a rebellion of sorts against RDBMS, perhaps due to the power of the DBA or due to the difficulty of SQL. His question – is the time of traditional RDBMS over?
I’ve asked questions in this blog before – about objects vs datasets, etc. I’ve never personally thought about this particular set of questions before, but I can certainly see why someone might have questions like Jay’s. Are we finally heading towards a meld of object based databases? We’re able to put code in the SQL Server DB engine now, and object persistence and datasets look like we can take the data out of the DB and put it in the code? Are we moving towards the next evolution in programmatic data storage?
What do you guys think?
— Matt Ranlett
posted with BlogJet
 Friday, May 27, 2005
I’m not sure why, but figuring out WMI with Microsoft's resources seems to take forever. I have spent a couple days looking over WMI and trying to figure out how to use it the way I want. I didn’t find any good .NET resources until the 3rd day when I had already started to figure out what I needed. That being said, this is the best resource for .NET and WMI that I have found. www.enterprise-minds.com by Klaus Salchner. He has wonderful examples and the best articles on how to use WMI with .NET.
The one major thing that is missing with WMI are the tools to make it understandable and simple. I know it is mostly for sys admins that do scripting, but it shouldn’t be so difficult to find out how to use it. If anyone has worked with WMI leave us some links or resources of better places to find things.
Here are the resources that I finally found that were useful.
—Brendon Schwartz
Posted with BlogJet
 Tuesday, May 24, 2005
The kind folks in the UK sent me a link to a series of short (15 minutes or less) webcasts called MSDN Nuggets. Waiting for something large to compile or for some kind of batch process? Spend the time constructively and watch a short video that teaches you the power of docking Winforms components or something. Bonus, all the presenters seem to have that fun UK accent…
— Matt Ranlett
posted with BlogJet
I’m going to have to give my rusty time-management skills a workout. I’d previously cut DNR recordings from my schedule of “Things I Can Do In A Day” because I’ve been putting in more time on job and community related activities. I’m sure I’ve missed some great episodes (all available for download after the fact). I was reading through the blog on www.msquaredweb.com (just who is Mark, anyway?) when I found a reference to the coolest demonstration of XHTML and CSS I’ve ever seen.
You absolutely must check this out: www.csszengarden.com
Thanks for the link Mark!
— Matt Ranlett
posted with BlogJet
Brendon pointed me to this link where Tim Heuer writes up an excellent post about what every SharePoint developer ought to know. Check it out!
— Matt Ranlett
posted with BlogJet
 Saturday, May 21, 2005
So I’m in the office WAY too early. It’s 5:30 AM as I write this while waiting for a database shrink to complete, but I got into the office at 4 AM. As I drove in this morning, I thought about the JOLT Awards given out by Software Development magazine this year. One of their categories is Best General Books – I decided to go ahead and get the category winner, Head First Design Patterns from O’Reilly Press. I’ve been interested in design patterns for a while now, both as a means for learning more about application architecture and as a means of communicating about applications with other developers [Michael Earls wrote a post about this, but I’m apparently not typing the right keywords into the search engines – I can’t find it]. This book is supposed to be an excellent introduction to patterns, with implementations of each pattern and good and a bad manner. All of the comments on Amazon.com are glowing and the book beat out my other choice (which will be my next purchase anyway) for the JOLT Award. Not that I care about the JOLT Awards, but that means at least one person looked at both books and judged this one a better learning tool.
— Matt Ranlett
posted with BlogJet
[note] – it was Wednesday when I wrote this, I just for got to put it online.
 Wednesday, May 18, 2005
Richard Conn introduced the Academic Relations Program – where Microsoft attempts to establish a relationship with various universities around the country. Pretty much what this means is discounted Visual Studio and Office licenses for universities and university students. Microsoft has even started to reach into the high schools, with 20 high schools in Atlanta alone participating. If you have a high school student or college student interested in the computer sciences, Microsoft offers some excellent internships and scholarships. Another interesting facet of the ARM program is its tie to Microsoft Research and a curriculum available to all for teaching Microsoft technologies.
David Chappell introduced himself by making sure that everyone knew he isn’t Dave Chappelle. Nor is he Dave Chappell from Sonic Software (who ironically also writes books and give technical presentations on enterprise messaging). After some fun at his own expense, David jumped into his presentation by postulating that there is always some kind of application architecture for enterprise systems. This started with mainframes, moved on to client/server systems, and then on to multi-tiered architectures. We may now be on the verge of shifting into the fourth evolution of enterprise systems, service-oriented architecture. The reason this shift is possible now and not before is due to the global vendor agreement on how to consume web services. Service-oriented business logic needs to rest on a foundation that is standard and ubiquitous. On Windows, this platform will be Indigo.
In the simplest sense, Indigo is a bunch of C# classes that extend the .Net framework with a new namespace. Indigo communicates through SOAP messages, functioning as an über SOAP stack. This unifies existing MS technologies (ASMX, .NET Remoting, Enterprise Services, WSE, MSMQ) for distributed applications. It also provides interoperability between .Net apps and others (EJB and WebSphere). Finally, Indigo offers the idea of explicitly building service oriented applications.
An important note is that Indigo is not backwards compatible with existing .Net distributed technologies. . Indigo actually implements much of the functionality of the existing technologies, including SOAP over networking channels and many of the WS-* standards. Once Indigo is release, Microsoft will no longer be enhancing the existing technologies. Indigo will not replace the existing technologies, and will not prevent those technologies from working.
Service-Oriented Applications are generally abstracted into Data (relations), Logic (objects), and Presentation (GUIs). Indigo fits into this picture between the logic and presentation and can be thought of as Access to Services. In the past, the link between Data and Logic has been the mapping of tables to object hierarchies and of SQL types to Java/CLR types. When the object-oriented Religion hit the world, OODBMS systems hit the market, only to fail. It turns out that mapping between the relations and objects is easier. Similarly, when the object religion hit the relationship between Logic and Presentation, Microsoft introduce a way to expose object interfaces –> COM and DCOM. That turned out to be very painful. Indigo goes back to the concept of mapping between services.
Having covered the basics of Indigo’s intentions, we now looked at code.
To create an Indigo service, you must implement a service class – the methods the services provides. You must select a host – the app domain and process the service runs in. Finally you must specify one or more endpoints in which to access the services. You have 2 methods for implementing a service class – mark a class with the ServiceContract attribute. Or mark an interface with the ServiceContract attribute then create a class that implements the interface. A caution – Indigo attributes (OperationContract) and C# modifiers (public, private) are completely separate – you can tag a private method with an OperationContract, thus exposing it to applications OUTSIDE the AppDomain. However, that same method is private within the application. David tried to convince us that this is actually a good idea by explaining that you can create a facade of classes which invoke internal methods and expose their methods as services. However, the facade of classes are not supposed to be called from within the application. The group seemed leery of this – much grumbling about a new “method type” was heard. My personal impression is that this seems to be an attempt to encourage good design (i.e. – the Facade pattern) on future projects.
Additional options in Indigo development: One way calls adds a modifier to the OperationContract (IsOneWay=true) for events. Duplex contracts for both the client and service invoking operations in the other. Message contracts allow working directly with the SOAP messages. all data sent and received by operations must be serialized and de-serialized. The way that they are serialized is based on the data contract. To create and pass your own types or enums, you must define a data contract (more attributes).
A quick aside: SVCUTIL can be used to generate a skeleton service class from WSDL contracts if you want to design your interface contracts before writing code, or contract first development. By contrast, writing the code first and adding the ServiceContract and OperationContract attributes as needed is called code first development.
When defining a host, you can host a service in an arbitrary process (exe, NT service and winform/avalon processes) or host a service in IIS or the Windows Activation Service (WAS) – a lite webhost for machines not running IIS. An app or service would use the ServiceHost generic type. IIS/WAS require virtual directories and a .svc file. Just like ASMX, an instance of the service class will be created when a client request arrives.
Finally, you must specify an endpoint – every client connects to a specific endpoint. Every endpoint has 3 things: an address (where to find it), a binding (how to communicate), and a contract (what can it do). Addresses are usually URIs. Bindings wrap together may aspects of communication such as protocols for conveying SOAP messages (HTTP, TCP, etc) security options, support for wS-* specs, and more. Several predefined bindings will ship with Indigo but custom bindings can be created. An example of a predefined binding is BasicProfileBinding which conforms to WS-I Basic Profile 1.0. WS ProfileBinding supports WS-ReliableMessaging, WS-Security, WS-AtomicTransaction, and other WS-* specs. NetProfileTCPBinding sends binary encoded SOAP with support for reliable messaging, security, and transactions directly over TCP (Indigo to Indigo only). One service can expose separate endpoints, each with a different binding for different clients. Contracts are the name of the class that the endpoint exposes (service class or interface). Endpoints are likely to be defined in config files, but they can also be added directly within the code assembly.
To create an Indigo client, create a channel to a service (typically hidden by a proxy which has been created by SVCUTIL or Visual Studio). Clients also specify a specific endpoint that they will communicate with. That’s about it – nothing very complex.
Services built on Indigo can be reliable, secure, transactional, and queued. Indigo also offers reliable messaging; raw SOAP doesn’t guarantee reliable message transfer but some of the Indigo bindings such as WsHttpBinding, support WS-ReliableMessaging. However, WS-ReliableMessaging doesn’t directly support message queuing – this is still an area where the vendors can’t agree on a standard. Since that the world in general and Microsoft in particular has caught the Security Religion, Indigo allows for security configuration via authentication, message integrity, and message confidentiality. Indigo also uses the .Net security model and the PrinciplePermission concepts. Indigo transactions are built on the new 2.0 System.Transactions namespace. Now transactions are separate from state management (different from Enterprise Services, COM+, and MTS). Indigo apps can use System.Transactions explicitly or can use OperationBehavior attributes (which use System.Transactions under the covers). Indigo supports queuing by running on MSMQ as the transport. This means queuing only works on the Windows platform. There are predefined binding choices which wrap queuing.
When considering upgrading to Indigo services, keep in mind that all existing apps will continue to work. However, if you do decide to upgrade, keep in mind the following questions. Will my Indigo app and apps built with existing technologies be interoperable and will my apps be portable? The Indigo team says yes to both questions for ASMX. Remoting will not be interoperable. Enterprise Services interfaces can be wrapped with an Indigo-supplied tool. ES clients will communicate use an Indigo moniker. WSE 1.0 and 2.0 are not interoperable or portable. WSE 3.0 will be interoperable AND portable, but it hasn’t been released yet. MSMQ is interoperable using MsmqIntegrationBinding, but portability is not a simple task.
Indigo vs Biztalk. Indigo is a platform for building services on .Net. Biztalk is an integration tool which maps between various heterogeneous environments. Biztalk already has adapters for technologies like MSMQ and SQL. Expect an Indigo adapter in Biztalk soon.
There is a March CAP currently available for Indigo and we expect the Beta 1 of Indigo in a matter of weeks.
Questions from the audience included:
Indigo talks to a service, what do I get back, a Dataset? Actually you get XML (SOAP), but the data in the message is some kind of serialized object. So it could be Dataset or objects.
What about the rich type support of Remoting? Indigo can serialize any .Net type when talking to other Indigo services. However, when interacting with other environments, use contract first development to ensure data type interoperability
How will Indigo handle big objects like Datasets? Indigo serializes an object sent to it and drops it on the wire.
MSMQ has a max message size, how does Indigo use MSMQ to transmit larger objects? MSMQ is a transport mechanism like TCP – large files are broken up and sent across the wire in discrete chunks.
Does Indigo require full trust to run on a machine like .Net Remoting does? David Chappell wasn’t, but Doug Turnure doesn’t think so. Research is required.
Can you serialize custom types? Yes with a data contract. Alternatively you can drop in your own seralizer.
I ran across this link a while ago in my RSS aggregator and thought I’d post it here as it’s extremely pertinent: Don Box’s Five Minute Indigo Challenge.
— Matt Ranlett
posted with BlogJet
 Tuesday, May 17, 2005
"ASP.NET 2.0 makes it even better by making you more productive, reducing the amount of code you have to write, making your Web sites easier to manage, and improving your Web site's scalability, reliability, and performance." - Dino Esposito
With over 50 new controls for security, navigation, data, and web parts, all of which increase developer productivity and introduce fewer bugs in the design process, ASP.NET 2.0 will make development faster and make the long term cost of ownership less. ASP.NET 2.0 adds some significant enhancements, including an improved and simplified data access process using data sources which includes database caching for better performance of the web sites. Additionally, there is now an option to pre-compile the web site so that users do not experience slow page loads when the system has to compile them. The Microsoft .NET Framework 2.0 makes deploying, configuring, monitoring, and maintaining Web applications easier. Furthermore, Microsoft has created new tools that can help you set up web sites with the correct configuration changes.
Here are some of the quick reasons that ASP.NET 2.0 has improved over 1.x. There are many more reasons depending on the type of sites, but these are the major reasons that I see for asking your employer to move from ASP.NET 1.x to 2.0.
- Compile on the fly; this allows the developer to create an ASPX page and the code page and put them on the server. ASP.NET 2.0 does not make you compile the page ahead of time, so you can make a bug fix and push the file out without having to recompile the entire site.
- Datasource controls will allow for better performance and less bugs due to the data access layer.
- The new improved View State in ASP.NET 2.0 will increase the performance of the time it takes to deliver a page to the end user.
- 100% backwards compatibility, so any page written in 1.x will work in 2.0
- Cross page post backs so you can send information to another page.
- Create caching based on the new SQLdependency which will allow you to monitor the database for changes
- Post-Cache Substitution so that you can cache parts of pages but not the content that changes, which will increase the performance of the web servers
- With Master Pages you can now create one template for an entire site and only have to change information in one place to make a change to every page that uses the Master Page.
- Visual Studio has been enhanced to let you connect to a web site with many protocols now instead of just FrontPage Extensions. Also you can open a single page in VS2005 and have the ability to edit it without opening the entire project
- ASP.NET 2.0 allows for partial classes which will allow you to have business logic in multiple files.
- We can now get information to the page without the user seeing a full postback with a feature called Script Callbacks. This allows the javascript to make a call to the server for more information without refreshing the page.
- You can now SetFocus on an object when the page starts up.
- New controls such as the WizardControl, DynamicImage Control, FileUpload Control, and the GridView control add a great deal of built in functionality that will help prevent bugs.
- Intellisense everywhere has been added to help developers more quickly create and debug applications.
- The new Heath and Monitoring API will allow us to be notified if there are problems on a web page or on a web server.
- The Panel Control is now scroll able, so you can have the web page scroll and not the browser window
— Brendon Schwartz and Matt Ranlett
Posted with BlogJet
 Thursday, May 12, 2005
I don't know about the other speakers, but Brendon and I are coming up with a brand new presentation for Code Camp. This involves us coming up with a topic (done), an outline for the presentation (done - thanks Brendon), a slide show to keep us on track (mostly done - fine tuning still going on), some canned demos in case time gets to us (we're still working on these - more comments below), and practice some other demos so we can do some live coding but not look like morons when stuff doesn't work (still doing these as well). We've been working/watching webcast/reading books and MSDN articles for a while now. We've been shuffling the slide deck back and forth between us for additions and subtractions. We even got together last night (not easy to do b/c we both work a lot and Brendon lives in northern BFE where I live in Atlanta) and worked from 7pm to midnight. I'd like to say we're ready except for some last minute demo coding and a bit more polish on the slide show (take a few slides out and add a few new ones). We're mostly there and if I had to drop everything and give the presentation right now, I wouldn't be embarrassed for myself.
One thing - has anyone had problems with Visual Studio 2005 Beta 2 and the SQL Express product? I can't seem to connect to my SQL Server, so I can't create or attach a database. This means I am not going to be able to demo any kind of data binding (except from XML). I installed everything on the CD except the J# stuff (personally no interest in Java syntax) and got no errors during the install. I did notice that there are no useful GUI SQL tools that came with the Express edition (no management studio or query analyzer tool) but I'm comfortable with OSQL so that's not a problem. But I can't get any tool (OSQL, VS2005 Datbase Explorer, etc) to connect without timing out. Thoughts? Help!
-- Matt Ranlett
UPDATE - Brendon found the problem. SQL Express installs a named instance of SQL Server, so you can't just connect to the (local) server. You need to connect to (local)\SQLExpress or .\SQLExpress. Once you do that, everything works.
 Tuesday, May 10, 2005
Enter this contest hosted by Microsoft and compete for the chance to win $50,000. The Microsoft Connected Systems 2005 Developer Competition is a global, skill based competition intended to highlight and reward creativity and programming excellence using SQL Server 2005, Visual Studio 2005 and BizTalk 2004/2006. There are 15 categories for the competition, including a SmartPhone app category, a Visual Studio PowerToy category, and more. Entries are accepted up to August 30th. The contest ends September 15th.
Thanks to Martin Crimes for bringing this to my attention.
-- Matt Ranlett
 Monday, May 09, 2005
I flipped through the Microsoft Events site and thought I’d report my findings
Management and Operations of .NET Applications Workshop – $165 – Monday, May 09, 2005 9:00 AM - Tuesday, May 10, 2005 5:00 PM
SQL Server 2005: New Features for Developers – $175 – Monday, May 16, 2005 9:00 AM - Tuesday, May 17, 2005 5:00 PM
MSDN Event – $0.00 – Thursday, May 19, 2005 1:00 PM - Thursday, May 19, 2005 5:00 PM
TechNet Briefing – SQL 2005 & Windows 2003 SP1 Technical Sessions – $0.00 – Tuesday, June 28, 2005 8:30 AM - Tuesday, June 28, 2005 12:00 PM
Visual Studio 2005, Developing Business Value – $99 – Monday, August 01, 2005 9:00 AM - Monday, August 01, 2005 5:00 PM
More stuff going on in Atlanta:
Atlanta Code Camp – May 14th
Pub Club – immediately following the MSDN Event, location to be announced at the MSDN event
— Matt Ranlett
posted with BlogJet
 Saturday, May 07, 2005
I got to spend 2 days with the folks from the Microsoft CLR team, but I don’t feel like I learned enough from them. Heck, I think you could lock me in a room with them for a year and I’d still come out feeling like a mushroom on the underside of a log. However, I was scanning through Kirk Allen Evans’ blog post about a conversation with the CLR team (great questions and answers, btw) when I got to the bottom. A collection of links to other people’s blog postings about their times with the CLR team. Since I’m big on writing what I think, I had to go read what other people had to say. My two favorite posts are:
But I was jealous when I got to read Joseph DeCarlo’s post about what the team talked about while they spent time with the fine development staff of Turner Broadcasting. I’d have loved to hear Jason Z. really explain generics to me (and why they’re different from C++ templates). I wanted to leave a comment on Joseph’s post asking him to give the blow-by-blow, but he appears to have comments turned off. So I’m sending him an e-mail instead.
— Matt Ranlett
posted with BlogJet
 Wednesday, May 04, 2005
I think that lots of people are of the “try it first, read the manual last” mindset. I’m one of them, and it recently jumped up to bite me on the rear. I had previously installed the February CTP of VS2005 and played around a bit. Then I downloaded Beta 2 and ran the installer. It told me to uninstall Beta 1 before continuing. I did so, re-ran the install and everything seemed to go just fine.
Then I tried to create an empty project and look at the form. The empty form wouldn’t display and I got this error:
——————————————————————— Microsoft Visual Studio ——————————————————————- Could not load type 'Microsoft.VisualStudio.Shell.Interop.IVsRunningDocumentTable2' from assembly 'Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
Browsing around on the web, I found that I was not alone, other people ran into the same problem. Apparently there are a set of manual uninstall steps that must be followed in exact order before installing VS2005 Beta 2. Of course, I failed to do this. The Beta 2 install program told me to uninstall the VS tools, but said nothing about the earlier version of the framework or anything. So I didn’t remove any of that other stuff. I tried uninstalling anything even vaguely related to .Net and tried reinstalling Beta 2. Same error message. This went on for like 3 uninstall/reinstall cycles.
Finally I found Aaron Stebner’s blog posting where he talks about creating an automated cleanup tool that helps us get through the “prep the machine for Beta 2” steps. Too late for me to bother with the tool, but he did have this post where he details the manual steps a user can go through to get the machine back in shape. Going through the steps one at a time, I believe this step was the one that finally made things work:
Go to %windir%\assembly and delete anything with *1.2* or *2.0* in the folder name. Delete the GAC_32 and GAC_MSIL folders as well.
You can not view the contents of %windir%\assembly in Windows Explorer when the .NET Framework is installed. In order to view the contents, you will need to set the following registry value and reopen Windows Explorer
Key name: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion Value name: DisableCacheViewer Data type: REG_DWORD Value data: 1
Note: You should remove the DisableCacheViewer value after you complete this step because this is only used for debugging purposes.
I had two different versions of the 2.0 framework, and I think that something, somewhere was conflicting. I know that shouldn’t happen thanks to .Net’s stand-beside ability. I have no proof that this was the magic bullet to the problem (other than everything works now). I just thought I’d throw this info online because it deserves to be easy to find online.
— Matt Ranlett
posted with BlogJet
 Friday, April 22, 2005
With the recent release of VS2005 Beta 2, a lot of people are playing around and experimenting with things like CLR queries in SQL Server 2005, membership websites, etc. Some of these people are thinking about writing their experiences down in an article format so it can be published and shared with the world. It takes time to write an article, especially if you’ve never done it before. Take a look at this set of author guidelines from MSDN (the Mecca of technical publications as far as Microsoft technologies is concerned).
Other writing aids:
Share your thoughts with the world, even if you do nothing more than write a few humble blog posts. You never know when your experiences might prove valuable to someone else.
— Matt Ranlett
 Friday, March 18, 2005
My job involves working with lots of config data, conveniently stored in the system registry. Now, there are all kinds of ways to get at the registry. You can:
- use regedit and a .reg file. To silently import a registry file use the /s switch. To remove a key, prepend the registry key name with a ‘-‘. This is really great for large amounts of data and works well with batch files
- use VBScript or JavaScript and the Windows Scripting Host or WMI for full access to the registry (and the rest of your system
- use the REG command line interface. Check out this list of options:
C:\Documents and Settings\Matt>reg /?
Console Registry Tool for Windows - version 3.0 Copyright (C) Microsoft Corp. 1981-2001. All rights reserved
REG Operation [Parameter List]
Operation [ QUERY | ADD | DELETE | COPY | SAVE | LOAD | UNLOAD | RESTORE | COMPARE | EXPORT | IMPORT ]
Return Code: (Except of REG COMPARE)
0 - Successful 1 - Failed
For help on a specific operation type:
REG Operation /?
Examples:
REG QUERY /? REG ADD /? REG DELETE /? REG COPY /? REG SAVE /? REG RESTORE /? REG LOAD /? REG UNLOAD /? REG COMPARE /? REG EXPORT /? REG IMPORT /?
Before today I didn’t even know this tool existed for me. I’ve used the other two methods frequently for unattended installs on remote machines, but this new tool looks very promising. I learned about it from this post by Scott Hanselman (note the first comment)
— Matt Ranlett
 Thursday, March 17, 2005
At the book club meeting tonight there was a short discussion about being a Microsoft MVP. This got me to thinking… do we all know our MVPs? Do we even know what an MVP is? For those of us who don’t know, an MVP is an outstanding member of the technical community. These outstanding people are recognized by Microsoft for their willingness to participate and help other community members. These are the smart people around the world who write the interesting articles, newsgroup postings, and websites that we all read when we need help. *MVPs are not tested for their technical skills, this award recognizes only their community service efforts.
We have a ton of these folks in the Atlanta/Georgia area. I wanted to try to list a few of them out, but this is going to be an incomplete list as this information is not necessarily easy to come by. My apologies in advance for anyone who got left out or mistakenly credited for living in Atlanta. If you know something is off in this list, please comment on this post and I’ll update the main list.
Jim Behning – Small Business Server
Dave Bernard – Visual Foxpro
Tom Bishop – Tablet PC
Dana Coffey - ASP/ASP.Net
Thomas Divine – Windows Embedded
Mark Dunn – Visual Basic.Net
James Hambleton – Windows Embedded
Geoff Hiten – SQL Server
Teo Lachev – SQL Reporting Services
Dennis Rice – Tablet PC
Michael Sanford – Windows Server SDK
Jerold Schulman – Windows 2000
James Shaw – ASP/ASP.NET
Shawn Wildermuth – C#
Paul Wilson – ASP/ASP.NET
— Matt Ranlett
 Friday, March 11, 2005
In case you haven't heard Chris is going to do something that I am very interested in. It is what most of us developers do, but never really package together. He is going to do something like community server, but using DotNetNuke as the front end. I look forward to it and would love to use it when he gets it up and running.
http://tamasii.com/blog/archive/2005/03/11/48830.aspx
 Thursday, March 10, 2005
Brendan Tompkins just posted a blog about random number generation within .Net. I felt it was topical since we just saw Keith Rome do some random number generation in his AppCenter Test demo for the C# User Group.
Brendan’s post starts off with, “If you want a true random number generator, you will want to look beyond System.Random, to the RNGCryptoServiceProvider in the .NET Framework”.
— Matt Ranlett
 Saturday, March 05, 2005
In our first ever Tales from the Trenches we talked to someone we did not know, Chris Wallace. Well acutally it was just me that talked with Chris because Matt was sick as a dog. Glad you feel better. In the talk (interview) he told me about a project he was working on, which was to write dynamic buttons on his webpage so he would not have to create them everytime he needed a different color button. Great idea especially if you need many different color buttons but don't know what the colors will be ahead of time. Anyway I just wanted to let you know that he has posted a code and blog with how to do it if you are interested. Great job Chris. BTW, Chris was a great guy, talk to him at the Code Camp.
--Brendon Schwartz
 Wednesday, March 02, 2005
Brendon and I were fretting over how difficult it is for us to maintain all the various websites we have to keep up with and wishing we could simply install a portal site like DotNetNuke to make this easier for us. The problem is that I purchased the cheapest web hosting package out there – DiscountASP.net. SQL Server is available to us, but it’s not free. I’m cheap, and Brendon is even cheaper than I am, so you know we didn’t want to spend any extra money. So Brendon had a great idea – see if we could parlay our function as the Atlanta .Net Regular Guys – the glue that helps hold the Atlanta .Net development community together – into a discount on the SQL Server price (which is ordinarily only more $10 a month).
I sent an e-mail to the sales department at DiscountASP.Net asking if we could get a discount on the SQL Server package in exchange for some advertising on our site. The sales person who received my e-mail took a quick look at the site and noticed that we are associated with the Atlanta .Net User Group. He asked me what we were all about. I gave him what I felt was an excellent explanation of the Atlanta .Net Regular Guys, which he promptly forwarded on to the VP of Marketing at DiscountASP.Net
I was quickly contacted by a Mr Eto who asked me for a little more information about the ADNRG (Atlanta .Net Regular Guys) and came back with an offer that was even better than I expected! Not only did we get a great deal on the SQL Server addition to our account, Mr Eto said that DiscountASP.Net is an avid supporter of the .Net user community. We might be getting some swag to give out at the User Groups, including some free hosting plans! That’s awesome!

I have some marketing material from them, but I want to tell you quickly about my personal experience with DiscountASP.Net. When Brendon and I decided to move our site and blog to our own web host and stop leaching off of Michael Earls, we looked at several providers that were recommended to us. We went with DiscountASP.Net because their plan was the lowest cost around. Between the two final contenders, I saved nearly $100 by going with DiscountASP.Net for a year pre-paid. We’ve been impressed with the speed of the servers – we both have commented that other sites that we know are hosted by the other hosting service we considered and both Brendon and I think that those other sites are slower. We like the speed and the cost! Win-win!
<warning – marketing blurb from DiscountASP.Net>
DiscountASP.NET is a Microsoft Certified Partner that focuses on offering the best value in ASP.NET web hosting and SQL hosting. DiscountASP.NET provides affordable, reliable, fast, secure, and feature-rich Microsoft ASP.NET hosting. Features include: FREE ASP.NET Components, .NET Framework, MS SQL, Access, ASP.NET Web Based Control Panel, VS.NET support and more.
</warning>
— Matt Ranlett
 Sunday, February 27, 2005
I just ran into an interesting problem while on my weekend of coding. If I have say 10 checkboxes and I want the end user to select, say 4 (let's call this n for now because it might change). How would I go about doing this? I mean I know how I would do this. I would write client side jscript or vbscipt, but I was looking to see if someone had a more ASP.NET way of doing it. Something more clean that is quick and easy to implement. Or let me know work arounds that you have done besides looping through the check boxes in client side script.
--Brendon Schwartz
 Thursday, February 24, 2005
 Tuesday, February 22, 2005
The dangerous thing about learning more about something is that you usually learn that you don't really know anything about it at all. Here's a great pair of blog entries talking about interview questions which MIGHT be asked of prospective developers in general and .Net developers in particular. Now, I've been a professional developer (ok - amateur masquerading as a pro) for nearly six years and I can't answer a lot of these questions. Like I said, I've got a lot to learn:
Chris Sells posted some "fun" interview questions - http://www.sellsbrothers.com/fun/msiview/. Actually, this page is a bunch of links to interview sites, but the bottom of the page has a link to the questions - divided into 4 categories. Great stuff that brings you back to your early CS classes (implement a linked list...)
Scott Hanselman has posted some interview questions divided into experience levels - if you're a guru you should be able to answer everything where entry level should be good with the top set. There are also some targeted questions for ASP.Net and XML developers. Check Scott Hanselman's post (and a previous post about ASP.Net questions) out at http://www.hanselman.com/blog/WhatAGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions.aspx
Thanks guys, for reminding me that I need to spend more time with my nose in books!
-- Matt Ranlett
I was flipping through the OldNewThing blog for some reason when I got sidetracked by this post about Power Toys and their history. The entire blog is fascinating reading, but this one really caught my eye. Perhaps that's because of the reference to the Mobile Developer's Power Toys. Included in the power tools are several command line utilities (anyone question how MS developers prefer to work?) and some neat tools to work with ActiveSynch. I've never tried them out, but they might be helpful.
-- Matt Ranlett
ps - even BizTalk has Power Toys now!
 Saturday, February 19, 2005
A little while ago Brendon, the local vocal community, and I came up with an idea to help bring us all closer together. Brendon and I, your humble Atlanta .Net Regular Guys, would invite some local member of the community out to lunch or dinner and chat with them about their personal experiences with .Net development. We'd then summarize and paraphrase that interview and post it to this blog for everyone to read. No one is sure about what will come of this, but we're hopeful that some helpful information might leak out. It might be interesting to hear what people around you but outside of your own development teams are doing, succeeding at, and struggling with.
"Tales from the Trenches" - beginning Thursday, Feb 24th.
Our inaugural interview will be Chris Wallace, a VB.Net developer who works as a one man development shop in the medical field. Expect the first post to be Thursday night or Friday. We are not sure yet if this will be a weekly or semi-weekly feature, but we intend to have some fun with this. If anyone has any interview topic requests, start sending them in!
-- Matt Ranlett
 Thursday, February 17, 2005
If you didn't already register for the May 14th Atlanta Code Camp, you are now too late. In just 17 days since the official announcement at January's Atlanta Dot Net User Group meeting, all of the spaces have been taken.
ATTENTION PRESENTERS: If you would like to present at the Atlanta Code Camp, we are still looking for you. You may request a space by doing one of the following things:
- Add a comment to this blog requesting a speaker's berth
- Send an e-mail to Mark Dunn (mark AT NOSPAM dunntraining.com) or Michael Earls (mearls AT NOSPAM hotmail.com) requesting a speaker's berth
ATTENTION PEOPLE WHO DID NOT REGISTER IN TIME: There is a waiting list that is already so long we'll never get through it. You have missed this code camp. I apologize from the bottom of my heart, but our venue has serious space limits which prevent us from opening more spaces. However, we are still looking for the following (which might get you entry to the code camp sessions)
- volunteers to help set up before the event, manage the crowd during the event, and clean up after the event. If you are interested in volunteering, post a comment to this blog entry stating such. I do NOT guarantee entry to the code camp.
While we're still tremendously early in the process, I want to thank everyone for helping to spread the word and make this as successful as an event still three months away can be! If our successes continue in this vein, there will be more code camps in the future.
-- Matt Ranlett
Seventeen days after the official announcement of the Atlanta Code Camp, all the spaces have been filled. We had 200 spaces available and those are now gone! We actually have a waiting list! I think that's totally awesome! Way to go, Atlanta!
Another planning meeting happens next week and we'll begin sorting speakers into the tracks and deciding who presents what and where. Look to www.AtlantaCodeCamp.com for these details as soon as they become available. I'll also be posting that information to this blog.
-- Matt Ranlett
 Wednesday, February 16, 2005
I received a web project to help make some changes. When I tried to open the project, I got an error that the web project could not be opened. IIS couldn't open my project and I got the following error message: "unable to open web project 'ProjectName;. The file path 'C:\blah\blah\blah' does not correspond to the URL 'http://localhost:/projectname'. The two need to map to the same server location. HTTP Error 404: Object not Found."

The problem was that the virtual directory was not set up in the IIS Administration tool. I had to create a new virtual directory with the correct name, path, and permissions (see the next three images)



Finally, once I got the virtual directory all set up, Visual Studio 2003 allowed me to open the project but I got the following error when I tried to open the form in the designer. "The file could not be loaded into the Web Forms designer. Please correct the following error and then try loading it again: The designer could not shown for this file because none of the classes within it can be designed. The designer inspected the following classes in the file: _Defulat --- The base class 'Project.Form' could not be loaded. Ensure the assembly has been referenced or built if it is part of the project. Make sure all of the classes used in the page are built or referenced in the project. Click help for more information".

I rebuilt the solution and everything was fine. I was able to make my tiny change and post the change to the website.
-- Matt Ranlett
Update2****
Check out Don's site, I told you he would agree that COM is not going away. Look at Project E - Essential COM, 2nd Edition
EndUpdate2***
Actually I can't look at OLEView because I only have Visual Studio .NET 2003 installed on my machine. So why do you think that OLEView is not shipped with Visual Studio anymore? Is it because we don't need to use COM anymore, or is it because the Visual Studio package was too large already. A lot of people will argue that COM is dead and that we don't need these silly tools anymore, but I think Don Box would agree that it is still around if not in person than in sprit. He might even tell you COM is love, but I think he was really trying to tell you that the ideas of COM are love not the implementation.
I hope they do ship something that will do the same thing, but I have not been able to find anything yet. If anyone knows what I can use without having to go download OLEView from a machine that already has it please let me know.
The reason I am looking into this is for two reasons. 1) I am doing a presentation on COM interop and Excel 2) I have been working with Microsoft Office, which is still written in unmanaged code.
Both of these reasons are making me think that Microsoft is not just dropping support for COM as we know it; they are helping us move away from it and not use it.
Update****
Matt pointed me to a great page that shows what tools are installed, and even though it says OLEView should be there it was not. It seems my install did not go right, but that I was never told about the problems. You don't really need COM tools anyways. =) So I found that under the Visual C++.NET section there is a place for Win32 tools. I am going to have to check out what happens if you just install C# or VB.NET, do you still get the COM tools you don't need. ;)
--Brendon Schwartz
 Tuesday, February 15, 2005
I was just asked this question and I didn't know the answer:
When you're working on a Winform project in C# (and probably VB) you have the ability to modify the form through the GUI editor and modify the code behind the form through the IDE. However, there is also generated code hidden inside the form which some people like to be able to modify. The only way I know of to edit this generated code is to open the form file in Notepad, make your changes, and save it. Is there a way to modify this code inside of the IDE?
Here is the reason I ask: Say you are creating a form. You want to set some of the property values based on constants rather than having to modify the properties via the IDE. Let's say you want to set the Visible property to FALSE. I don't really want to accept the default values then reset them in the form load or constructor. That just leads to a larger code base for no reason. It would be cleaner to have the code just use the constant value.
Thoughts?
My fear was that if you modify the generated code with Notepad or any other tool, that this code would be regenerated by Visual Studio and any changes would be lost. My initial recommendation was to modify the code in the form's constructor but my questioner wasn't convinced this wasn't just resetting the value after it defaulted to something else.
-- Matt Ranlett
 Monday, February 14, 2005
Someone at work found this great article: http://www.minasi.com/thismonth.htm
"And I quote…:
__
Server 2003's TCP Stack Can Be Too Slow
Sometimes an old tip becomes useful again...
Techie instructor Roger Grimes passed along this tip about Server 2003's FTP server from KB article 891371. Apparently they set the TCPWindowSize -- an important TCP tuning parameter that I discuss in my Tuning CD and talk -- to a too-small value, with the result that downloading something from a 2003-based FTP server would be slower than you'd expect. (In fact, it appears to me that any TCP-based downloads would be affected by this parameter, including HTTP file transfers.)
Fix this by going to HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ Tcpip\ Parameters, and look for TCPWiindowSize. If it's not already there, then create a REG_DWORD entry named TCPWindowSize. Set that parameter to its maximum value of FFFF hex or decimal 65535. Reboot and you should get better throughput. But there may be a few gotchas...
First, you may see no difference. In Windows 2000, you also needed to create and set another REG_DWORD, "GlobalMaxTCPWindowSize," and give it the same value. I'm not sure that's not still a good idea in 2003. Similarly, 2000 had a problem in that if you set the window to its maximum size -- 65535 -- then 2000 ignored you. According to another KB article, the largest value for TCPWindowSize/GlobalMaxTCPWindowSize that would work is 64240. Try different sizes and see which yield the best transfer speeds. By the way, you want to set these values both on the server and the client system."
So after my last idea, I am going to stick with a little more technical post for the time being. Let’s start with Microsoft Office.
With .NET, Microsoft has taken a step forward to make it a little more easy to program with office by using the primary interop assemblies (PIAs). They have even gone through the trouble to give you examples for alot of situations. This is a wonderful start to working with Office. The problem comes up when you write your application for one version of Office, say Office2003, but someone else has Office XP or even worse Office2000. So now you are stuck, do you write another application just for Office XP or Office 2000, or do you try to make one application that works for the Office versions you need? I guess the best approach would be to use late binding for the entire Office interop.
Well I think this is where Microsoft came up short on the programming API you use to program with Office. And yes I know Office is still written in unmanaged code. I think Microsoft should have distributed an Interop for Office not for a specific version of office, but to program against Office. This way you wouldn’t have to write a program for multiple versions of the PIAs.
Here is what my code idea would look like:
public object StartExcel { switch(offieversion) { case Office2003: // Instantiate Excel using PIAs from Office2003. objApp = new Excel.Application(); break; case OfficeXP: // Instantiate Excel using PIAs from OfficeXP. objApp = new Excel.Application(); break; case default: // Get the class type and instantiate Excel. Type objClassType; objClassType = Type.GetTypeFromProgID("Excel.Application"); _Excel = Activator.CreateInstance(objClassType); break; } }
Now you would have to do this for every function that is exposed to office, but then you would have the ability to use any version of office and use the best suggested method to do so. Why does Microsoft make it so difficult to program against office. It is not that hard, but it is not always as straightforward as you might think it could be. If you try to program with LateBinding to office objects you cannot find a good reference to show you the method calls or properties that you need.
Let me know what other people have tried in their applications to get around this problem.
—Brendon Schwartz
 Wednesday, February 09, 2005
I just learned about this and had to post it right away. Does anyone remember their old-school BASIC programming? Stuff like:
10: PRINT HELLO 20: GOTO 10
BASIC used line number labels to identify where in the program execution should occur. Visual Basic did away with line numbers as a requirement, but did not get rid of line number support. There was even a documented feature in Visual Basic 3, Erl() which allowed you to get the last successfully executed line number in your source code. Documentation of this feature disappeared in VB4, but support for it has continued even through VB.Net (it is now sparsely documented)! That means you can enhance your error logging functions to include which exact line of your source code failed. For example:
10: On Error Resume Next 20: Err.Raise(60000) ' Returns 20. 30: MsgBox(Erl())
There is an excellent article on Addison-Wesley’s site which illustrates how helpful line numbers and Erl() can be in your debugging.
For VB6 and earlier, there was an excellent free tool from MZ-Tools which could automate line numbering. MZ-Tools does have a release for VB.Net, but the tool seems to no longer support line numbering. I don’t know of any product which helps you do this.
— Matt Ranlett
 Wednesday, February 02, 2005
A friend of mine asked me an interesting question today. The conversation started out something like this. (The names have been changed to protect the innocent)
Friend: hey brendon - simple question for you if you got a sec? Me: sure thing Friend: Do Html controls (as opposed to WebControls) participate in viewstate during a postback? Me: (good question)
I told him I was pretty sure of this and that, but I did not have documentation offhand to prove anything.
He brought up a good point: The only reason he questioned whether HTML controls do participate in view state is that it has been drilled into everyone’s head that Html* controls are less overhead than UI.Web.* controls and so he assumed the lack of viewstate would be part of that.
In the end he just wanted to be sure how they would work for the companies using his code.
Let me know what you think and I will post what we came up with.
--Brendon Schwartz
 Sunday, January 30, 2005
Everyone needs to mark their calendars RIGHT NOW! The upcoming Atlanta Code Camp has been scheduled for Saturday, May 14th. Leaders, tracks, dates, etc are all online now. Check out the Atlanta.Net UG’s page on this. Click the link that says Code Camp on the left (directions for the blind). Start making your plans to attend and if you want to present, send a message to the people in charge (Atlanta’s Mark Dunn of .Net Rocks fame and our own uber-blogger Michael Earls)
— Matt Ranlett
Have you ever tried to create an ASP.Net web application or service with Visual Studio.Net 2003 and gotten the error “Visual Studio .Net has detected that the specified Web server is not running ASP.NET version 1.1. You will be unable to run ASP.Net Web applications or services.”? I was attempting just this on my tablet and got this very error message. Thinking ahead of my gentle readers, I captured the moment using my snipping tool.

While I myself had no idea how to fix this, and I was in a location where I did not have access to the Internet to do a search on Google, I did have a good resource with me – Brendon, my fellow Regular Guy. He had previously seen this problem and knew what to do. We dug into the .Net framework directory on disk and ran one of the little utility programs that comes with .Net – aspnet_regiis.exe. You can find the file in your Windows\Microsoft.Net\Framework directory. You need to pick the version of the .Net framework you want to install, so if you have 1.0 and 1.1 installed on your machine you’ll have something that looks similar to this screen shot.

Launch the Visual Studio .Net Command Prompt (which builds the framework directories into the path).

Without needing to change directories, you can type in the name of the program and the appropriate switches. In this case you’ll be typing in “aspnet_regiis -i” to install ASP.NET.

I hope you found this educational. This post was of dual purpose for me – 1) to ensure I know this forever by forcing myself to write it down and 2) to test the blogging API’s ability to handle images. I wanted to see if I could upload images without being forced to FTP to the server and code the HTML.
— Matt Ranlett
It is funny how you can draw similarities between two different ideas but still point out their similarities. At first thought, Baseball players and people that work on .NET are usually on two totally different ends of the spectrum, but let me explain why they might be the same.
Similarity – Baseball is at a stage where players have now been around for 20 some years, just like some of the heavy hitters (pun intended) in .NET have been around Windows for some time now.
Difference – Baseball players like to play catch. Developers tend to always be playing catch up, even when a project manager thinks there is plenty of times.
Similarity – The great baseball players try to get together to form better teams or work out groups. We have seen many times in .NET that there are banks of great developers that band together to create an environment that is right for them.
Difference – Baseball players hit things for a living. If a .NET developer hit things for a living, they would probably be sued.
Similarity – Baseball players tend to strike out quite a bit. So do .NET developers, or any computer person for that matter.
Difference – People pay good money to see baseball players at work. I will guarantee that no person in their right mind will come to watch me at work. Ever!
Similarity – Once baseball players get to a certain age they let the younger guys fill in for them and they start to step out of the lime light. Once a .NET developer gets to a certain age, they usually start to move to a manager role (see any similarity yet?), or they start to step out of the lead role and let some younger person take over.
Difference – Baseball players usually only last a couple of years. Most developers last much longer than that.
The point of all of this is that eventually the top dogs in the .NET world will move on and the question will be: who are the rookies today? Is it you? I plan on keeping my batting average as high as I can, you should too. Hope to see you in 20 years when I will reflect on where I have gotten. Hope this one was a little more fun than my usual technical entries. Please add ideas you have on the subject and let me know.
— Brendon Schwartz
While flipping through some of the recent MSDN articles, I came across this posting discussing the differences between ClickOnce deployment and standard Windows Installers
http://msdn.microsoft.com/smartclient/default.aspx?pull=/library/en-us/dndotnet/html/clickoncevsinstaller.asp
Top #1 thing I learned off the first page – “Orca” is the code name for the MSI editor. I didn’t know that. I thought Orca was something to do with Longhorn and XAML and stuff. I’ve heard the name bandied about but not in any kind of context that made it understandable to me.
FYI – did you know that you could subscribe to the MSDN tech articles? Very nice!
— Matt Ranlett
So one of two things have happened. 1. You thought I would never post again or 2. you thought I changed my name to Matt. Well to start off the new year here is my start at weekly posts.
You might ask what the two hop limit is. A very simple explanation of this limit is that impersonation authentication can only be exchanged between two machines by default. This means that if Machine A requests work to be done on Machine B for an impersonated user; Machine B can perform the work, but cannot offload the work to Machine C because the authentication for the user will fail. The easiest way to fix this is by Implement Kerberos Delegation.
Now you are probably asking why this might be of any importance. This comes up most often when using web pages that impersonate the current user and that make calls to web services, a database server, or both. An interesting place to see this is in Microsoft’s Reporting Services which uses web services as the main method of execution yet is promoted to be used with a web front end.
Disclaimer: You should consult with your network administrator to make sure implementing Kerberos delegation will not cause any other problems before rolling out to production. Problems might be things like changing the entire virtual directory to use windows authentication or Authentication may fail with "401.3" Error if Web site's "Host Header" differs from server's NetBIOS name.
Here is an example of where you would run into a problem and be able to fix the problem by turning on Kerberos delegation. Let’s say you have three machines: Machine A is a web server running IIS 6 and ASP.NET, Machine B is a Report Server running Microsoft Reporting Services, and Machine C is a database server running Microsoft SQL Server.
Now let’s say that the web page uses the NT login to determine if the user has access to the web page, to determine the parameters of the report to run, and to be used as the login to the database to give back specific information about the user.
Your chain of execution would be:
- User calls webpage from IE and ASP.NET impersonates current user and Enable Integrated Windows Authentication.
<system.web> < identity impersonate ="true"/>
- ASP.NET pages call Reporting Services web service for report passing the current security context.
' Create an instance of the ReportServer webservice Dim proxy As New ReportServer.ReportingService proxy.Url = "http://localreportserver/ReportServer/ReportService.asmx“ ' Set the user to be the default user, in this case ' the default user will be the windows user that IIS ' is Impersonating. proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
- The Report is set up with the dataset to use Windows NT Integrated Security
- The Database is set up for all domain users to run stored procedures.
If the security information has to be passed from Machine A thru Machine B onto Machine C and the web server is using Impersonation then you will have to turn on Kerberos Delegation or you will get a SQL Server message say “Login Failed for User (Null). Reason: Not associated with a trusted SQL Server connection”, which really in this case means invalid user credentials. So you get with your network administrator open up Active Directory and set the correct settings for Kerberos delegation and off you go.
Another great article on this is at Ode to Code by Scott Allen
Thanks to Matt Ranlett for great feedback and for the never ending help on articles.
-- Brendon Schwartz
When it comes to the User Groups and my past presentations, I've done some with code and some without. Actually, many of the recent presentations were on topics where no code was necessary or possible. But my new resolution is that every presentation I do from now on will have half the PowerPoint slides and at least 20 minutes worth of GOOD code demonstrations.
That brings me to MSDN. This is an awesome resource for those of us who want to present topics. Lots of the work is done for you and you can easily extend these articles into a worthy presentation. Even if you don't extend the topic beyond the scope of the article, lots of people don't read MSDN as often as they should. For these people, a straight presentation of an MSDN article would be a fantastic way to learn something they might otherwise have missed.
At the last VB.Net UG meeting we had 2 brand new presenters. I hope they learned that presenting in front of the group isn't as scary as they thought and that they want to do it again. I'm just here offering suggestions for finding future presentations.
-- Matt Ranlett
Prepare yourselves!
At some point in the next 2 to 6 months we will be hosting a Code Camp in our fair city. Things are still in the early early planning stages, but take a look at the Florida Code Camp's lineup. If the Atlanta Code Camp get's even half as good a lineup it will be a can't miss event.
Speaking of can't miss events, let's chat for a moment about the local developer community. We've got tons of awesome tech firms in the area. We've got dozens of “famous” developers in the area. Atlanta has several Microsoft MVPs. Why is it that we don't get many of these people at our local area user groups? I go to pretty much EVERY UG meeting and we've topped out at maybe 120 people at a single UG meeting. Most of the time we hover between 15 to 40 people per meeting, and a lot of these are the same people showing up at multiple groups. Come on, people! Start showing up to some of these meetings! They're a free resource for you and even if you don't use a single thing you learn at these meetings, I promise you that you'll learn SOMETHING!
With few exceptions, Atlanta seems to be a town full of lazy people. We don't support our local sports franchises and we don't support our local user groups. The user groups are FREE! Most of them have their acts together enough to post what the next topics are at least a week in advance of the meeting. Keep up with the websites and plan to attend at least one UG meeting a month. I promise it will be worth it. And when you come, drag someone along with you. The first meeting I went to, I was dragged to by a friend. Now I'm hooked. I've managed to drag three or four other people along occasionally and they always enjoy themselves.
Paul Lockwood does an excellent job of maintaining a calendar of upcoming events in town. Keep tabs on the calendar and plan accordingly.
-- Matt Ranlett
So what do I mean by this? Well here in Atlanta there seem to be a lot of events going on at the moment. Depending on who you ask about the next up coming event, the response is different. Ok, so that is reasonable. You ask the question, get an answer, and write it in your Pocket PC that you keep in your back pocket (also known as a small paper calendar). Now comes the tricky part; if you already have that event written down then you don’t need to write it again, but if you don’t have that event, you write it down and claim that time and day. So you are probably wondering what the heck this has to with SOA. The reason this is like SOA is that when multiple providers like Microsoft Events.com, User Groups, members of the User Groups, and many other sources ask what is going on they may not get an answer right away. In fact, they may never hear about the other event that is going on - ever! So my thought is when Don Box and his Indigo team figures out how to have seamless communication through computer programs, he could share his findings with the community and we could have an easy way to find out what is going on in our town and any other town that we go to visit.
So for all you smart people in the community - let me know what you think we can use to have some way for all of these user groups and community events to sync up in a nice calendar where we can all go for information. Then I could write an app that calls a web service at Microsoft Events, which would go find out what is going on in town X and let me know - all from my one click desktop app!
Ok so it isn’t really just like SOA, but you get the picture. We need some way for everyone to talk together so we can know what is going on as far as events.
--Brendon Schwartz
Maybe it's what I ate for dinner last night, but whatever it is doesn't like me. Too much leftover candy stolen from neighborhood kids? Bad Karma? Not sure...
Anyway, taking advantage of my quarantined status to work on my Mobility presentation for the VB.Net study group. More a whirlwind tour of the Compact Framework than anything else, I've decided the best way to show this off is by a big involved demo. I'm going to show data access with SQL Server CE. I'm going to do loads of stuff. It's going to be fun. It's going to be cool. It's going to get started right now.
-- Matt Ranlett
Following Brendon and Michael's lead, I wanted to throw some ideas up on the blog mostly as reminders to myself. I have a couple of project ideas, most of which would only be useful to me:
- Excel timesheet front-end: I have to fill out a bunch of silly time sheets. What I want is something I can use to track my time on maybe a bit more of a real-time basis as opposed to figuing out based on old e-mails what I did for the week, and have this time tracker tool automatically fill out the required spreadsheet. The spreadsheet template is posted out on the company network and has a tab with all the available clients and projects and such.
- a VSS pin comparison tool. We use VSS at work a lot. One of the things we have to deal with fairly frequently is building software with source out of branched and pinned source files. The problem is, we have no way of knowing which files are different between the “Next Release“ and the “Current Release“ versions because of the pins. It would be nice to have some way of showing which files have actually changed between the pinned current version and the next release version. Heck, it's been so long since I thought of this one I forgot why I really wanted to do it.
-- Matt Ranlett
Ok. So what I want to do is this; I want to write a wireless app you can use in a grocery or department store. Function 1 - Sales engine
- It needs to scan UPC and/or SKU barcodes
- It needs to be able to look up the item description and basic price in offline mode
- It has to connect across the wire to a COM object (pre-existing) which can tell if the item is on sale or part of some kind of special offer
- It needs to collect a list of approved scanned items (ex. what's in your shopping cart) and keep a running subtotal going
- It should allow for corrections in the list, so you can change quantites, remove items, etc.
- When you are done shopping, it needs to send that list of scanned items to a real POS terminal for verification and tendering
Function 2 - Inventory engine
- It needs to scan UPC and/or SKU barcodes
- It needs to be able to look up the item description in offline mode
- It should allow you to enter the current quantity on hand for the item you just scanned (so you can inventory your cans of soup)
- It needs to collect a list of approved scanned items
- It should allow for corrections to the list
- When you are done, it needs to send that list of scanned items and quantities to a Back Office for reordering purposes
Function 3 - Shelf Labeling
- It needs to scan UPC and/or SKU barcodes
- It needs to be able to look up the item description and price in offline mode
- It should allow you to print a shelf label (via a belt mounted printer) if the current shelf label and the handheld price do not match
- It needs to collect a list of items which have been scanned and those which had new shelf labels printed (for auditing purposes)
- When you are done, it needs to send that list of scanned items to a Back Office for auditing purposes
Sounds like a tall order. I want to try to get function 1 ready for the first Wireless UG presentation. To that end, I'm going to stop wasting my time on the blog and start working.
-- Matt Ranlett
© Copyright 2010 Atlanta .NET Regular Guys
Theme design by Bryan Bell
newtelligence dasBlog 1.7.5016.2  | |  | Page rendered at 3/10/2010 9:35:58 PM (Eastern Standard Time, UTC-05:00)
Reset | Slate | Movable Radio Heat | DasBlog | Just Html | Candid Blue | Discreet Blog Blue | Movable Radio Blue
|
On this page....
| | Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|
| 28 | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 10 | 11 | 12 | 13 | | 14 | 15 | 16 | 17 | 18 | 19 | 20 | | 21 | 22 | 23 | 24 | 25 | 26 | 27 | | 28 | 29 | 30 | 31 | 1 | 2 | 3 | | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
Search
Navigation
Categories
Blogroll
Sign In
|