|
New PropertyMaker Release
I recently released an updated version of PropertyMaker, formerly VBPropertyMaker. New features and enhancements include:
- Complete code refactoring including an extensible object model.
- Language selection and expansion. Users are no longer restricted to just VB syntax. Users can choose amongst several different languages including VBScript (Classic ASP), VB 6, VB.Net (Visual Studio 2003 or 2005), and C# (Visual Studio 2003 or 2005).
- Newly enhanced options including String Safety, Override Level, Instance selection, and Property Scope.
- Included input and output font options. Display the text as you want it displayed.
- Refactored user interface.
PropertyMaker is available for download herehttp://www.robertmayo.com/AppSamples/VBPropertyMaker/default.aspx Labels: .Net, Development, Samples, VB.Net
QuickTime & Windows Server 2003 - The Secret
I was just happy as a clam until a couple of weeks ago when my iTunes told me "There is a new version of iTunes. Would you like to download it?" Dunce that I am, I replied yes. iTunes is bundled with QuickTime, and as you may or may not know, the latest version of QuickTime (version 7.0.3) from Apple is fairly incompatible with Windows 2003 Server. Ordinarily, I could care less, but iTunes requires QuickTime to run. The only reason I EVER use iTunes is to put music onto my iPods, and since iTunes was to ONLY thing that I could use, you can imagine how angry I was. After doing a little research, I came across several threads like this one in the Apple support forums. It seems that one of the Security patches ( KB908531) for Windows Server 2003 issued by Microsoft, creates a situation where parts of QuickTime's normal operation (including install) are now "privileged instructions". You could uninstall this security patch and the latest versions of QuickTime and iTunes will work just fine. The problems with this are that 1) you leave your Windows 2003 Server vulnerable to attack, and 2) If you have your Windows Update set to automatically download, you will be consatntly downloading and re-installing this security patch. The latest version of QuickTime claims to have corrected a vulnerability as well. Personally I would rather go with a secure Windows server and a vulnerable older version of QuickTime, so that's what I did. So here's how to clean and revert QuickTime. First, let's get down to the uninstall. Since the latest version of QuickTime fouls up the install, it fails to make the registry entries that would allow the uninstall to show up in Add/Remove Programs. OK, so then what? You could try using the Start Menu item to uninstall QuickTime (Start -> All Programs -> QuickTime -> Uninstall QuickTime). For the same reason (the catastrophic failure during install), it fails to make registry entries that would allow the InstallShield kernel to run the MSI package which would uninstall QuickTime. Download the Windows Installer CleanUp Utility from Microsoft. This will find the MSI installer package and allow you to uninstall its contents fairly quietly. It may still leave the files in place so be sure to delete those files manualy. Usually they are stored in C:\Program Files\QuickTime Here is the step that is really important and must be done before proceeding any further. Open your system folder (usually C:\Windows\system32) and find 2 files, QuickTime.qts and QuickTimeVR.qtx. You must delete these files. They are Apple extensions for QuickTime that function like DLLs. Any QuickTime installer will search for the existence of these files and read the version information out of these files. Don't believe me? Run a file monitor during the install process. OK, so now you have successfully cleaned off QuickTime. If you inadvertently uninstalled iTunes, you must install the latest version of iTunes (which will attempt to reinstall the latest version of QuickTime) and repeat the process. QuickTime 7.0.1 ReinstallerSo now you should have the latest version of iTunes and the not so latest version of QuickTime.
HTML/Javascript: Wait for an asynchronous function to complete.
I happened to have a moment of inspiration today. I was building an HTML page which had some AJAX-based validation. Me personally, I'm in love with AJAX. It's a concept I've been doing myself, thousands of different ways, since long before anything was ever standardized. The problem sometimes with AJAX is the first letter, A, which stands for Asynchronous. The page will not wait for the AJAX-based function to complete before moving on to the next line of execution. I had some validation routines in this page which needed to call some AJAX methods to do their work. Unfortunately one was dependent on the prior one completing. Ordinarily, I use a global javascript variable which tells me that I'm currently validating. If I call an AJAX function, I check whether the variable is set. If it is set, I leave the function. This works in a scenario where the AJAX function is triggered by some user action; a button-click, a textbox change, etc. I make it so the user simply can't perform the 2nd action until the first completes. In the scenario I was working with today, the user would trigger a synchronous action, which subsequently called 2 asynchronous AJAX actions. In theory, the synchronous method could finish executing before the two asynchronous methods even start. The first thought I had would be to loop indefinitely in the synchronous method until the first asynchronous method completes. I know from experience that will not work. When the asynchronous method attempts to execute any script in the calling page, it will not be able to because the synchronous method still has control of the execution while it's looping. I created a little solution that would allow me to block execution until a given condition changes. I use window.setInterval() to periodically check if a condition is set. If the condition is set, I then execute code. In my application, I continued to set the global variable at the beginning of each AJAX function. In the synchronous method, I call one AJAX method, use window.setInterval() to block until the global variable is unset, then call a method which executes the second AJAX method and blocks until it is complete. When the final blocking is complete, another method is called which continues the validation. Voila! Synchronous from asynchronous. An fairly elegant solution which only took me a few minutes to create. I thought I'd share it with the world. You may download sample source here. WaitThread 2006-07-07.zipLabels: AJAX, Javascript, Samples
Success!!! (somewhat)
The bridge was a success! What I found, however, was the Wireless-G Access Point ( WAP54G) I tried to use in the place of my Wireless-B Router/Access Point ( BEFW11S4) was not so successful. So what went wrong? I attempted to substitute the Router/AP with simply an AP. I had to connect the access point to the router (which was still connected to the cable modem) to configure it. I also had to put my laptop on the wired part of the router to configure it. I could configure the Access Point, but only up to a point. The setup utility from Linksys only found the access point about 10% of the time. Once the access point was found, I would configure it the way I wanted (WPA security, SSID, no broadcast). I could connect to the access point and the internet just fine. I did everything I needed except change the IP address from static (192.168.1.245) to a DHCP client. Bear in mind, the AP is still connected to the router. Once I converted the AP to a DHCP client, the laptop could still connect to it wirelessly. I removed the AP from the router, disconnected the router from the modem, connected the AP to the modem, and cycled the power on the AP. In theory, the laptop should have connected to the AP, right? Wrong. Dead wrong. Whenever I made the AP a DHCP client, as soon as I connected it to the modem, it disappeared. The setup utility couldn't find it. The laptop could find it but never get an IP address I tried updating the firmware, updating my drivers on my laptop; I tried everything. I would reset the access point and try the entire exercise all over again. This went on for hours. So what was the missing ingredient? Somewhere along the line, I missed the word router. It turns out I had bought simply an Access Point, not a Router/Access Point. The access point by itself is incapable of acting as an independently routing DHCP server. The idea behind this type of AP is just to give a wired network a wireless point of entry. Should have known better. So the theory behind expanding my network was correct, it was just that I had the wrong equipment. I had bought the AP a couple of months ago, and had waited to buy the bridge. Since I had waited so long, there was no way I could return it. No worries, though. A quick shot over to BestBuy and I was back in business. I grabbed a Wireless-G Router/Access Point ( WRT54G) for fifty bucks. I took it home, set it up, and I was rock-'n-rollin' in under 10 minutes. The router/access point (Wireless-G) is connected to the modem, the bridge (Wireless-G) is connecting the original router/access point (Wireless-B), and everybody connected to either (wireless and wired alike) is happy. Upside: I got my network upgraded to Wireless-G and my existing wired equipment separated from the wireless. Downside: I'm out about $80 for an access point that I don't really have a use for, but that's what eBay is for, right? Funny how the access point by itself costs $80, but the router/access point only costs $50, huh?  Labels: Hardware, Networking
New Toy
 My Wireless-G bridge came today. I was surprised. I ordered it from Dell on Wednesday. I didn't expect it until next week. With it, I'll be able to upgrade my home wireless network from Wireless-B to Wireless-G. I'll also be able to separate my existing Wireless-B router (which has a 4-port wired router built in) from the cable modem. Too many things are physically tethered to the wired router for it to function as the router for those devices AND the wireless access point for my wireless clients. Jokingly, someone at work said I had way too much hardware for one home. I chuckled, but it's probably true. Just wait until I get my wireless network storage and wireless print server(s). Labels: Hardware, Networking
|