Installing Windows XP on the Fujitsu Siemens Esprimo u9200 in 2017

I recently picked up a brand new vintage 2009 business targeted netbook, sealed in box – the Fujitsu Siemens Esprimo u9200 (fact sheet) (review => archive). At just short of 2KG (4.37 pounds) it’s rather bulky compared to today’s netbooks, but as a rather disposable piece of equipment for travel, which I’d be perfectly fine with leaving at a customs office or having stolen (same thing, I guess), it’s great.

This netbook is from the era during which companies were offering “downgrades” from the included Windows Vista to Windows XP, as loads of people preferred that, and like many cheapass economical machines at the time, it wasn’t really capable of running its included operating system at a satisfying speed. With Windows XP, however, it’s a different story. In fact, using SpeedswitchXP, it can even be permanently underclocked, which makes the fan shut up, and the operating system still performs adequately.

Disclaimer
Windows XP was never is no longer safe for daily use. It’s old, technically outdated, insecure, and many modern browsers no longer support it. When used carefully, as a machine to remote into other things, and when routing all outbound traffic through a VPN, I believe it’s usable, but I wouldn’t recommend it to anyone.

Drivers

Windows XP, even with SP3 preinstalled on the CD, does not contain the drivers for the SATA controller in the u9200. While these can be loaded by pressing F6 during the installation, with a USB floppy drive connected, it’s much more elegant to burn a custom Windows XP install CD with the drivers included, using a process known as slipstreaming. For this, a program called nLite can be used. Wayne Zimmerman has an excellent writeup on how to do this over here (archive).

As for the drivers required for the u9200, I couldn’t find them on the Fujitsu support page, but the one for the Asian market still had them. I stuffed them all in this zip file: u9200_drivers.zip

While the bulk of the drivers are awesome to slipstream onto the CD, giving you full screen resolution, networking, etc. from the get-go, the SATA driver is unfortunately not the correct kind for loading as a plug-in storage driver during the install. For this you need the special “f6 floppy”, which you can get directly from Intel. Or here: STOR_all32_f6flpy_9.5.0.1037_PV.zip

IMPORTANT: When slipstreaming the “f6flpy” driver, DO NOT add it as a “Regular PNP driver” (do this with the rest). You want to add it as a Textmode driver (this is the kind available during text mode install, and thus when selecting the install partition), and you want to specifically select the “Intel(R) ICH8M-E/M SATA AHCI Controller“. If you do not do this, your install CD will still not find the drive.

Selecting the driver should look something like this:

All ready to go:

And that’s it! The Windows XP installer should now recognize your drive (I replaced mine with a cheap SSD, and it still worked). Enjoy the Windows XPerience.

Some useful programs

How to remove the “Favorites” button from Internet Explorer 8 on Windows XP

Reinstalling Windows XP on an ancient (well, vintage 2009) laptop recently, I suddenly remembered how much I hated the “Favorites” button that’s stuck on the favorites bar and shows you your favorites when you click it, just as the bar already does.

This thing:

While the rest of the crap, such as the favorites, the “command bar”, and other things, can easily be turned off via the menus, the Favorites button is not going away so easily. However, there’s a registry setting for that!

In short, you can go into regedit and navigate to HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Toolbars\Restrictions (create any missing keys along the way – mine didn’t have a “Toolbars”, nor a “Restrictions” key). Then make a new DWORD named “NoCommandBar”, and set it to 0x00000001.

..or you could simply import this registry file.

Voila! A nice, clean Internet Explorer:

Next step: Install a better browser ūüôā

The Windows XP PowerToys, archived here for your pleasure

These are apparently slowly disappearing from the intertubes. This is my attempt at archiving them.

-> DOWNLOAD HERE <-

Included PowerToys:

  • Alt-Tab Replacement Task Switcher replaces the simpler Alt-Tab switcher with a more visual one which shows live window previews.
  • CD Slide Show Generator generates a slideshow from photos burned to a CD.
  • ClearType Tuner allows customizing ClearType settings to make it easier to read text on the screen.
  • Color Control Panel Applet allows managing color profiles, changing color profile associations for devices.
  • HTML Slide Show Wizard generates an HTML slideshow presentation.
  • Image Resizer allows right-clicking on multiple image files inside Windows Explorer to batch resize them.
  • Open Command Window Here allows starting a command prompt from any folder in Windows Explorer by right-clicking.
  • Power Calculator is a more advanced graphical calculator application than the built-in Windows Calculator.
  • RAW Image Thumbnailer and Viewer provides thumbnails, previews, printing, and metadata display for RAW images from within Windows Explorer.
  • SyncToy allows synchronizing files and folders.
  • Taskbar Magnifier magnifies part of the screen from the taskbar.
  • Tweak UI customizes Windows XP’s user interface and advanced settings.
  • Virtual Desktop Manager allows switching between four virtual desktops from the taskbar.
  • Webcam Timershot takes pictures at specified time intervals from a webcam.

Import email from existing POP3 account to Gmail in 2017

No introduction here. Let’s get to it.

Go to settings

Add an external account

Enter your existing external email address, e.g. “you@otherdomain.com”

Select POP3

Enter your existing credentials
The settings shown are for the Cathedral mail server – yours may be different.
Contact your provider if you’re not sure.

Choose to treat it as an alias

Want to send mail?

If so, enter your SMTP credentials

At this point, Gmail will send a verification code to your GMail address.

After either entering the code into the verification field, or clicking the link in the email they sent you, you’re good to go!

Duplicate bind mounts with chroots on systemd

When setting up jails, I commonly end up with structures like this in my /etc/fstab:

/dev /jail/test/dev auto bind 0 0
/dev/pts /jail/test/dev/pts auto bind 0 0
/dev/shm /jail/test/dev/shm auto bind 0 0
/proc /jail/test/proc auto bind 0 0
/sys /jail/test/sys auto bind 0 0

/dev /jail/test2/dev auto bind 0 0
/dev/pts /jail/test2/dev/pts auto bind 0 0
/dev/shm /jail/test2/dev/shm auto bind 0 0
/proc /jail/test2/proc auto bind 0 0
/sys /jail/test2/sys auto bind 0 0

Now, if you take a bind mount and attempt to mount it while it’s already mounted, your system will most likely let you…

# findmnt /jail/test/dev
TARGET            SOURCE FSTYPE   OPTIONS
/jail/test/dev udev   devtmpfs rw,relatime,size=10240k,nr_inodes=1012462,mode=755
# mount /jail/test/dev
# findmnt /jail/test/dev
TARGET            SOURCE FSTYPE   OPTIONS
/jail/test/dev udev   devtmpfs rw,relatime,size=10240k,nr_inodes=1012462,mode=755
/jail/test/dev udev   devtmpfs rw,relatime,size=10240k,nr_inodes=1012462,mode=755

That’s just an effect of how bind mounts happen to work. However, I found that as soon as I had several of these jails, all bind mounting /dev and various paths in it into the jails, I began seeing duplicates. Lots of duplicates.

# findmnt /jail | wc -l
5172

…that’s bad

Turns out it’s caused by the mount propagation feature, in which a bind mount is supposed to receive additional binds if something is mounted in its parent. Here from man mount (8):

Since Linux 2.6.15 it is possible to mark a mount and its submounts
as shared, private, slave or unbindable. A shared mount provides the
ability to create mirrors of that mount such that mounts and unmounts
within any of the mirrors propagate to the other mirror. A slave
mount receives propagation from its master, but not vice versa. A
private mount carries no propagation abilities. An unbindable mount
is a private mount which cannot be cloned through a bind operation.
The detailed semantics are documented in
Documentation/filesystems/sharedsubtree.txt file in the kernel source
tree.

What happens is that the default “shared” propagation causes any bind below /jail/test/dev, such as /jail/test/dev/pts get propagated up to /dev. It gets even worse when there are many jails, as the propagation down to /dev continues back up to any previously mounted jails:

# mount | grep "type dev"
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
# mount /jail/test/dev && mount | grep "type dev" && echo "so far so good..."
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
udev on /jail/test/dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
so far so good...

# mount /jail/test/dev/pts && mount | grep "type dev" && echo "wait, wtf?"
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
udev on /jail/test/dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /jail/test/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
wait, wtf?

# mount /jail/test2/dev && mount /jail/test2/dev/pts && mount | grep "type dev"
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
udev on /jail/test/dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /jail/test/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
udev on /jail/test2/dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=61165,mode=755)
devpts on /jail/test2/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
devpts on /jail/test/dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

As seen in the documentation, a private mount “carries no propagation abilities”. Thus, all I had to do was make all my jail bind mounts private, as so:

/dev /jail/test/dev auto bind,private 0 0
/dev/pts /jail/test/dev/pts auto bind,private 0 0
/dev/shm /jail/test/dev/shm auto bind,private 0 0
/proc /jail/test/proc auto bind,private 0 0
/sys /jail/test/sys auto bind,private 0 0

/dev /jail/test2/dev auto bind,private 0 0
/dev/pts /jail/test2/dev/pts auto bind,private 0 0
/dev/shm /jail/test2/dev/shm auto bind,private 0 0
/proc /jail/test2/proc auto bind,private 0 0
/sys /jail/test2/sys auto bind,private 0 0

And, after a while…

# findmnt /jail | wc -l
27

That’s better ūüôā

Now, I could probably make mount propagation work for me and not manually specify binds for pts and shm and such, but I didn’t feel like spending the time to work out the implications of that.

Setting all SQL Server databases to “simple” recovery model and deleting all the transaction logs

Sometimes, you just want things brutally simple and stupid. I was searching for how to do this, and stumbled upon this post on SQL Server Central.

Turns out the query listed there doesn’t handle databases with weird names, containing version numbers with “.” in them, for instance.

Thus, I modified it slightly, adding brackets and such, and came up with the following:

USE MASTER
DECLARE
@isql varchar(2000),
@dbname varchar(64),
@logfile varchar(128)
    
DECLARE c1 CURSOR FOR
    SELECT  d.name, mf.name as logfile--, physical_name AS current_file_location, size
    FROM sys.master_files mf
    INNER JOIN sys.databases d
    ON mf.database_id = d.database_id
    WHERE recovery_model_desc <> 'SIMPLE'
    AND d.name NOT IN ('master','model','msdb','tempdb') 
    AND mf.type_desc = 'LOG'
OPEN c1
FETCH NEXT FROM c1 INTO @dbname, @logfile
WHILE @@fetch_status <> -1
    BEGIN
    SELECT @isql = 'ALTER DATABASE [' + @dbname + '] SET RECOVERY SIMPLE'
    PRINT @isql
    --EXEC(@isql)
    SELECT @isql='USE [' + @dbname + '] checkpoint'
    PRINT @isql
    --EXEC(@isql)
    SELECT @isql='USE [' + @dbname + '] DBCC SHRINKFILE ([' + @logfile + '], 0)'
    PRINT @isql
    --EXEC(@isql)
    
    FETCH NEXT FROM c1 INTO @dbname, @logfile
    END
CLOSE c1
DEALLOCATE c1

NOTE: The “EXEC()” statements are commented out, so you can inspect what’s going to happen before adding them back in.

Debugging SQL Server Query Performance

To enable timing of your query:

SET STATISTICS TIME ON

Time statistics provides output like this in the “Messages” tab of SSMS after running a query:

(127 row(s) affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 42 ms.

To show IO statistics:

SET STATISTICS IO ON

..which provides stuff like this:

(74394 row(s) affected)
Table 'Audit'. Scan count 1, logical reads 284, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Users'. Scan count 1, logical reads 27, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

This shows you things like logical and physical reads (memory vs. disk reads). As you can see, my current query runs entirely in memory, but we can change that…

To completely flush the disk cache, query cache, and whatever other cache and start with a clean slate

DBCC FREESYSTEMCACHE ('All')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
CHECKPOINT
DBCC DROPCLEANBUFFERS

Lastly, I’d like to point in the general direction of Erland Sommarskog‘s excellent article with a very long title:
Slow in the Application, Fast in SSMS? – Understanding Performance Mysteries” – archived here.

Happy debugging!

Force SQL Server Database offline

If you right click a database in SSMS and select Tasks => Take Offline, you might find yourself staring at this dialog for hours, if there are active sessions running queries on your database.

Offline

Here’s how to force it to go offline, rolling back any current transactions. Replace [dbname] with the name of your database.

USE master
GO
ALTER DATABASE [dbname]
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

To get it back online, you can do this

USE master
GO
ALTER DATABASE [dbname]
SET ONLINE
GO

Automatic Windows Logon on Domain Member Machines

On a Windows machine, you can normally use Start => Run => control userpasswords2 to enable automatic login for a given user when the system boots. On computers that are part of a domain, this is not the case. However, while the functionality is removed from the user interface when you join a domain, it is still available if you’re comfortable mucking about with the registry.

Using Regedit, go to “Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\WinLogon“.

There are 4 keys you need to set to allow automatic logon:

  • AutoAdminLogon, REG_SZ => 1
  • DefaultDomainName, REG_SZ => YourDomainNameHere
  • DefaultPassword, REG_SZ => YourSecretPasswordInClearText
  • DefaultUserName, REG_SZ => YourUserName

Add or edit the keys to match your domain setup and reboot. Autologin should function as intended after this.

AutoLoginWindowsDomain