Some of the best advice on technical writing that I have ever read suggested the writer try to explain their ideas in more than one way, usually through the magical phrase in other words.
The technique works by introducing your topic in one writing style, vocabulary, point of view, abstraction level, etc. and then the following sentence conveys mostly the same information, but from a different angle, using synonyms, using more/less details and/or introducing requirements or consequences of the idea. (See how I did that?)
It may seem like it is adding superfluous redundancy, but it helps avoid ambiguity and the clever use of synonyms should help make your document easier to find by search engines. Just be careful not to overuse the technique. In other words, some ideas are simple enough that they do not need to be restated.
Saturday, April 10, 2010
Thursday, April 08, 2010
Jamie Cansdale is my hero
Jamie Cansdale (of Mutant Design) is the author of TestDriven.Net, a Visual Studio add-in that "makes it easy to run unit tests" (and it certainly lives up to that description). A simple, casual feature request sent by e-mail two days ago was followed by fabulous customer support that culminated today in a private build that fully implements the feature, even with our unusual environment at work.
Jamie's e-mails came in rapidly and always with offers for more help in getting me to better use his already-fantastic product. I sometimes had trouble keeping up with him! The conversation was to the point and I felt I was being treated as a very important customer, not just some [l]user who needs to be clued in to the basics of computers by some first tier customer support who gets paid minimum wage and doesn't care about their job.
Jamie and I iterated through 6 private builds first by e-mail and then by instant messaging to explore the requirements and smash all the bugs in the implementation so that TD.Net could fully support the DeploymentItemAttribute, just like MSTest, even when the files being referenced were marked as read-only due to the nature of the source control system in use. I came out of this experience a very satisfied customer, as - even though I use the software as a student to write open-source software - I decided to put my money where my mouth is and purchased a professional license.
If you're still reading, what are you waiting for? Go buy the product and/or go provide customer service so good that your users will write blog posts about it!
Monday, November 09, 2009
How to secure your wireless network
Note: The following is a repost of how-to of the same name I wrote tonight at my IT notes site.
Intro
Do you have a wireless router and a wireless device and want to make sure your neighbours aren't freeloading your internet connection or snooping through your network? Follow these instructions to lock down your wi-fi.
Get what you need
- A router that has both wired ports and wireless capability.
- A computer with a wired connection to the router.
- A computer with a wireless network connection (it could be the same computer as in #2).
- A piece of paper large enough to write 5 lines of text on it. You will be filling in the following template:
IP Address User Name Password SSID Passphrase - A pen.
- Some adhesive if the paper in #4 did not have its own.
Let's get started!
- Plug your computer into the router (and switch off or unplug the wireless network adapter if your computer has both). This makes sure you're configuring the right router (and not your neighbour's) as well as gives you a way to fix it if you accidentally lock yourself out. Some routers only allow you to configure them through a wired connection anyway.
- Find out what your gateway's IP Address is. It will be something like 192.168.0.1 but it depends on the manufacturer and model, as well as the initial set-up.
- Windows XP:
- Start > Control Panel
- Double-click on Network Connections
- Double-click on the Local Area Connection icon
- Click on the Support tab
- Write down the numbers that are next to Default Gateway as the IP Address.
- Windows Vista and 7:
- Show the Start menu
- Type network connections in the search box and select View network connections
- Double-click on the Local Area Connection icon
- Click on the Details... button
- Write down the numbers that are next to IPv4 Default Gateway as the IP Address.
- Open your web browser and in the address bar, type http:// followed immediately by the gateway's IP address. For example: http://192.168.0.1
- You should be prompted for a user name and password. If you have never set this, then you have a few options for figuring out what the default user name and password are:
- Find the little user's manual that came with the device. It should have a section on administration or remote access. Worst case, you flip through the 10-20 pages looking for either an image similar to what's on your screen right now or some mention of any of the following words: admin, login, password or user name.
- Find a digital version of the user's manual:
- Go to the manufacturer's website. If it's not printed on the router anywhere, search the web.
- Navigate to their Support section of the website.
- Look for a Product or Model Search and type in the model number of your router.
- One of the links for your router's page (when you eventually find it) should be for the manual, usually as a PDF file.
- Guess! Here are some common combinations:
- user name admin and no password
- no user name and admin as the password
- user name admin and password admin
- no user name and no password
- Now that you have found the default user name and password, you should change them as soon as possible. Look under Tools, Advanced or Maintenance. Invent a password you don't use for anything else and write both the User Name and the Password on your piece of paper.
- Look for a Wireless or WLAN menu. You will know you have found the right page when you see words like SSID, WEP, WPA, Passphrase and Channel.
- Your Network Name is commonly called SSID. You change this from its default of default (or sometimes it's the manufacturer's name) and set it to something that's easy for you and your guests to know it's your router. Keep it simple and a single word if possible, like the name of a pet. Whatever you choose, write it down on your piece of paper.
- The next part is a little trickier. You usually need to select what kind of security you want. If you're reading this, you want to change it from None or Disabled to WPA.
- Side note: Avoid WEP at all costs as it is too easy to break in. Protecting your wireless network with WEP is like putting a sign in front of a pool, kindly asking people not to go swimming. Protecting your wireless network with WPA is like building a fence around your pool. The most determined swimmers can still climb your fence, but casual swimmers that would not have been deterred by the "please don't swim" sign will go look for easier pools to break into.
- Side note number 2: Your router might allow you to select WPA2. In my experience, this protocol is not as compatible with as many devices, so I would not recommend it.
- Now you get to pick a Passphrase (also known as a shared key). A passphrase is like a password, but it's longer and it can contain spaces. Pick an easy to spell one-liner that you and your guests can easily type, something like I am one with everything. It usually needs to be at least 8 characters long and, just like a password, it will be case-sensitive. When you have typed it twice, click whatever Save button there is and you're almost done!
- At this point, your router might want to think for a few seconds or maybe it will automatically reboot. In any case, wait 10-30 seconds and then try connecting to your router using a wireless-capable device. If you are using the same computer, unplug the network cable and then switch on (or plug in) your wireless network adapter. After another 10-15 seconds, you should get a message saying some wireless networks were detected and to click to see a list. You should see your newly-named wireless network in that list with a little padlock indicating it needs a key. If your network is not listed, you can wait another minute or two and then start over in case you got something wrong along the way.
- It works! Yeehaw! Now attach your piece of paper under your router using some light adhesive so that the next time you need to fix something, you will be able to skip steps 2 and 4. It will also be useful when you want to give your guests access to your wireless network; you won't have to try to remember anything, you can just lift up your router and read off the SSID and Passphrase to them.
Wednesday, August 19, 2009
HOWTO: Shop for a laptop
Note: The following is taken verbatim from an e-mail I sent a relative who was interested in purchasing a laptop. It's reposted here so I can share it with the world and subsequently link to it the next time I'm asked about it. That and some feedback from the public at large couldn't hurt!
The best way I found to shop for laptops is to find as many flyers as possible and cut them apart so you have playing-card sized pieces with the picture of the laptop, its price and its specs. The Future Shop and Best Buy flyers are great for this and sometimes the Dell, The Source and Staples flyers are useful too.
You then start to whittle it down by eliminating obviously too-expensive laptops and too-low end laptops. (i.e. those in the $3000 range and those with less than 2 GB of RAM) You just toss the pieces in the garbage. For the next iteration, you start looking more carefully at the specifications, pictures, etc. and tossing out those that don't fit your wants and needs. Repeat until you have about two or three left.
What you do next is you go to the stores, find where the two or three you have left are, and play with them for 5-10 minutes to see if there's a clear winner. If you can't tell the difference between the them, well, the least expensive wins. I recommend you sleep on it at this point.
Laptops usually come with a one-year warranty and you can purchase a few more years after that for up to 3 or 4, depending on the store. That can easily add $300 to the cost of the laptop, so you may want to decide on that before you even step into the store, otherwise you'll be asked to decide at check-out and making a decision about something that's almost 1/3 the cost of the product is not something you want to do quickly.
I would not recommend purchasing a laptop (over a desktop) unless the computer needs to be mobile and moved around a lot. You'll pay more for the privilege of having small pieces that fit inside a portable package and thus the same money could be spent on something more powerful with a bigger screen, etc.
The best way I found to shop for laptops is to find as many flyers as possible and cut them apart so you have playing-card sized pieces with the picture of the laptop, its price and its specs. The Future Shop and Best Buy flyers are great for this and sometimes the Dell, The Source and Staples flyers are useful too.
You then start to whittle it down by eliminating obviously too-expensive laptops and too-low end laptops. (i.e. those in the $3000 range and those with less than 2 GB of RAM) You just toss the pieces in the garbage. For the next iteration, you start looking more carefully at the specifications, pictures, etc. and tossing out those that don't fit your wants and needs. Repeat until you have about two or three left.
What you do next is you go to the stores, find where the two or three you have left are, and play with them for 5-10 minutes to see if there's a clear winner. If you can't tell the difference between the them, well, the least expensive wins. I recommend you sleep on it at this point.
Laptops usually come with a one-year warranty and you can purchase a few more years after that for up to 3 or 4, depending on the store. That can easily add $300 to the cost of the laptop, so you may want to decide on that before you even step into the store, otherwise you'll be asked to decide at check-out and making a decision about something that's almost 1/3 the cost of the product is not something you want to do quickly.
I would not recommend purchasing a laptop (over a desktop) unless the computer needs to be mobile and moved around a lot. You'll pay more for the privilege of having small pieces that fit inside a portable package and thus the same money could be spent on something more powerful with a bigger screen, etc.
Wednesday, April 22, 2009
On uninstalling Google Chrome
I finally gave up with Google Chrome on my laptop. Here's what popped up when I completed the uninstallation process, with my answers:
So maybe I'll eventually re-install it. There's definitely value in the "application mode" as well, which hides the address bar and makes a "tab" its own window using the site/application's "favico" as the application window's icon, but that breaks quickly - as I described above - when you need to go outside that site/application. That "application mode" would also be a neat add-on/extension for Firefox. :)
Google Chrome has been uninstalled.
Thanks for trying out Google Chrome. Please help us improve Google Chrome by telling us why you uninstalled it. Your feedback is much appreciated.
Which of the following best describes you?
I am uninstalling Google Chrome for now, but I may try it again in the future
I am permanently uninstalling Google Chrome
I am only uninstalling briefly. I am going to reinstall straight away (e.g. changing computer, upgrading operating system)
Why are you uninstalling Google Chrome? Please check all that apply
It doesn't load some web pages properly (please list any examples below)
It's missing some features that I use (please provide detail in the box below)
I'm concerned about privacy (please provide detail in the box below)
It seems to slow down my computer
It crashes too often
Other (please provide more details in the text box below)
Please provide any additional detail on your reason for uninstalling:
There are too many Firefox add-ons that I have come to rely on and using Chrome just leaves me "naked" in comparison. I blogged about this potential problem when Chrome initially came out: http://oliiscool.blogspot.com/2008/09/world-in-verdana.html
I first installed Chrome when I heard Gmail and Google Reader had exceptionally good performance in Chrome. This was true, but as soon as I clicked a 3rd-party link from within either, I felt I was abandoned and frequently would end up copy/pasting the URL into Firefox and continue from there.
I definitely appreciate the engineering skills and value of having a process-per-tab kind of browser, but that functionality alone is not sufficient for a heavy add-on user such as myself. In fact, I have checked the "slow down" checkbox since that model seems to in fact be a liability when viewing YouTube videos: I definitely notice much higher CPU usage from Chrome when visiting a site containing an embedded video than visiting the same page with Firefox.
Perhaps not all is lost: the process-per-tab model could still be applied to Firefox and a "Chromium Tab" Firefox add-on that worked similarly to the "IE Tab" add-on (in that it would enable the Webkit/Chromium engine on a per-tab basis) would be fantastic in my books.
So maybe I'll eventually re-install it. There's definitely value in the "application mode" as well, which hides the address bar and makes a "tab" its own window using the site/application's "favico" as the application window's icon, but that breaks quickly - as I described above - when you need to go outside that site/application. That "application mode" would also be a neat add-on/extension for Firefox. :)
Friday, April 03, 2009
Do you still not use a router?
I was helping out an extended family member over the phone the other night when I realized he would connect one of his two computers directly to the cable modem, in turn, depending on which computer he was going to use to get internet access.
This struck me as being very odd. Ten years ago, I was using hubs and later migrated to switches and then router/switch combinations to network computers. I just can't imagine what life would be like to have more than one computer in a house and not some sort of network between them.
More scary was that he called me on April 1st, the day the Conficker author(s) decided to freak everyone out. Since Conficker's primary infection mechanism was to exploit a vulnerability in a Windows service and he had just reinstalled Windows on that computer, I was worried he could get infected and warned him about the dangers of doing so.
In this case, a router would have not only removed the "unplug this computer, plug that computer" inconvenience but also have acted as a firewall between his computer(s) and the internet, therefore making it difficult to get infected by worms like Conficker just because your computer is connected to a [hostile] network.
Thankfully, I have an extra router lying around that I'll give him the next time I see him, but seriously, if you don't have a router, go spend $50 on a networking device that doubles as a firewall. Most internet software is NAT-aware these days, so you're no longer trading off convenience for security.
This struck me as being very odd. Ten years ago, I was using hubs and later migrated to switches and then router/switch combinations to network computers. I just can't imagine what life would be like to have more than one computer in a house and not some sort of network between them.
More scary was that he called me on April 1st, the day the Conficker author(s) decided to freak everyone out. Since Conficker's primary infection mechanism was to exploit a vulnerability in a Windows service and he had just reinstalled Windows on that computer, I was worried he could get infected and warned him about the dangers of doing so.
In this case, a router would have not only removed the "unplug this computer, plug that computer" inconvenience but also have acted as a firewall between his computer(s) and the internet, therefore making it difficult to get infected by worms like Conficker just because your computer is connected to a [hostile] network.
Thankfully, I have an extra router lying around that I'll give him the next time I see him, but seriously, if you don't have a router, go spend $50 on a networking device that doubles as a firewall. Most internet software is NAT-aware these days, so you're no longer trading off convenience for security.
Monday, February 02, 2009
Ego-driven software development
(or "How M.C. Escher Would Have Packaged His Software")
This was too "good" to not blog about. I heard about IronPython Studio, a Visual Studio-based IDE for writing Python code for/with .NET tools. In order to install this interesting gem, you first need to install its pre-requisites, which is one of flavors of the "Visual Studio 2008 Shell": Isolated Mode or Integrated Mode. Sounds easy, right? Wrong!
The actual downloads seem innocent enough (I got both, just to be safe -- as an aside it was hard to tell which one would suit me best): they arrive as executables. Here's how many levels of "packaging" there are:
I'm reminded of Adobe Acrobat Reader installers from, oh, I don't know, ten years ago, before one-file installers were even invented. IronPython itself is available in a single MSI file, while IronPython Studio's download options are both available as an MSI file in a ZIP file.
There is no technical reason for this. There simply is no excuse for these fractal installers except that someone (or an entire team of someones) at Microsoft decided they needed to be involved in the supply chain that brings us internauts this bare Eclipse-wannabe that does not even include a text editor. I mean, seriously, the only thing that could have been worse would have been to wrap the whole thing in a "downloader" (like Visual Studio Express) or in an ISO 9660 file (like Visual Studio 2008 Service Pack 1).
I have a special offer for the person in charge of the Visual Studio team: I will personally come over and deliver atomic wedgies to everyone responsible for these shenanigans! Just give me a call; you know how to find me.
There is some good news after all this: IronPython Studio not only just works, but so does its debugger. Kudos to that team.
This was too "good" to not blog about. I heard about IronPython Studio, a Visual Studio-based IDE for writing Python code for/with .NET tools. In order to install this interesting gem, you first need to install its pre-requisites, which is one of flavors of the "Visual Studio 2008 Shell": Isolated Mode or Integrated Mode. Sounds easy, right? Wrong!
The actual downloads seem innocent enough (I got both, just to be safe -- as an aside it was hard to tell which one would suit me best): they arrive as executables. Here's how many levels of "packaging" there are:
- Running either of vs_AppEnvRedist.exe or vs_ideredist.exe will create a temporary directory where the EXE's files are extracted and an "installer" is launched
- You accept the EULA and click next a few times and what do you end up with? "The redistributable package has been installed". That's right, you ran an installer that installed another installer. Total disk space needed for this (at apogee): 400 MB for the original download, 400 MB for the temporary files and 400 MB for the "redistributable package" = 1200 MB
- As you finish the first "installer", the temporary files are cleaned up, so we're back to consuming 800 MB. You run the second installer and the first thing it does is check its signature, which consumes 400 MB of RAM. It then proceeds to extract files to another temporary directory (400 MB again, although this time it's in a bunch of smaller files - 286 MB of which is various versions of the .NET framework), thus bringing our used disk space back up to 1200 MB. Those of you following at home will notice that I haven't actually installed anything useful yet. Accept another EULA, select the only feature (wut?), pick the destination folder and go (again)! At apogee: 400 MB + 400 MB + 400 MB + whatever installed size it was (I didn't check)
- Oh, it looks like we're actually done! What was I installing, again?
I'm reminded of Adobe Acrobat Reader installers from, oh, I don't know, ten years ago, before one-file installers were even invented. IronPython itself is available in a single MSI file, while IronPython Studio's download options are both available as an MSI file in a ZIP file.
There is no technical reason for this. There simply is no excuse for these fractal installers except that someone (or an entire team of someones) at Microsoft decided they needed to be involved in the supply chain that brings us internauts this bare Eclipse-wannabe that does not even include a text editor. I mean, seriously, the only thing that could have been worse would have been to wrap the whole thing in a "downloader" (like Visual Studio Express) or in an ISO 9660 file (like Visual Studio 2008 Service Pack 1).
I have a special offer for the person in charge of the Visual Studio team: I will personally come over and deliver atomic wedgies to everyone responsible for these shenanigans! Just give me a call; you know how to find me.
There is some good news after all this: IronPython Studio not only just works, but so does its debugger. Kudos to that team.
Saturday, October 25, 2008
Apple sucks at XML
OK, I've officially had it with Apple. Steve Jobs may have style down cold, but his programmers were smoking something fierce when they designed the XML format for their so-called Property list. Don't let that Wikipedia page fool you on the apparent simplicity of the format. Take a look at one of Apple's own samples. Still not convinced? How about a real-world use-case: the emoticon definition file for an Adium theme, a portion of which is reproduced below:
Yes, it's not impossible to grab a value for a given key, but did they have to make it so hard when XML can express the same idea in a much easier format? Or, rather, did they have to be so lazy when writing the code that serializes these property lists to/from XML?
In any case, if you ever have the need to process an XML file created by an Apple program, the following stylesheet will (likely) help restore your sanity. Simply pre-process the XML with my stylesheet and then your XML code or stylesheet will be much easier to write (and read!):
...isn't that a sight for sore eyes? You're welcome.
Do you see what the problem is? For those of you playing at home, here's a hint: how would you write an XPath expression to obtain the "equivalents" of a given image file?<plist version="1.0">
<dict>
<key>AdiumSetVersion</key>
<integer>1</integer>
<key>Emoticons</key>
<dict>
<key>amazing.png</key>
<dict>
<key>Equivalents</key>
<array>
<string>=-o</string>
<string>=-O</string>
<string>:-o</string>
<string>:-O</string>
</array>
<key>Name</key>
<string>Surprised</string>
</dict>
<key>anger.png</key>
<dict>
<key>Equivalents</key>
<array>
<string>>:o</string>
<string>:-@</string>
<string>:@</string>
<string>X(</string>
</array>
<key>Name</key>
<string>Angry</string>
</dict>
<key>bad_egg.png</key>
<dict>
<key>Equivalents</key>
<array>
<string>>-[</string>
<string>>-(</string>
</array>
<key>Name</key>
<string>Nervous</string>
</dict>
(...snip...)
</dict>
</dict>
</plist>
Yes, it's not impossible to grab a value for a given key, but did they have to make it so hard when XML can express the same idea in a much easier format? Or, rather, did they have to be so lazy when writing the code that serializes these property lists to/from XML?
In any case, if you ever have the need to process an XML file created by an Apple program, the following stylesheet will (likely) help restore your sanity. Simply pre-process the XML with my stylesheet and then your XML code or stylesheet will be much easier to write (and read!):
For an example, let's take another look at the sample XML I showed earlier and compare that with the XML sexiness that is generated by applying my stylesheet against it (some spacing was added to the "after" version to better illustrate how they compare to each other):<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" encoding="utf-8" indent="yes" />
<xsl:template match="* | @* | node()">
<xsl:copy>
<!-- if the previous sibling is a 'key' element -->
<xsl:if test="name(preceding-sibling::*[position()=1]) = 'key'">
<xsl:attribute name="key">
<xsl:value-of select="preceding-sibling::key[position()=1]/text()" />
</xsl:attribute>
</xsl:if>
<xsl:apply-templates select="* | @* | node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="key" />
</xsl:stylesheet>
| Before | After |
|---|---|
<plist version="1.0"> | <plist version="1.0"> |
...isn't that a sight for sore eyes? You're welcome.
Wednesday, September 03, 2008
The world in Verdana
OK, by now everybody and their cat has heard about Google Chrome. The general buzz on Slashdot and blogs seems to be "it's not Firefox" and, more specifically, a general lament of the chicken and egg problem surrounding the release of a new platform when there isn't any software (in this case "plug-ins" or "add-ons") to run on it. Well, OK, there are some Chrome plug-ins available, but Chrome extensions are currently NOT supported. On the other hand, the source code is out there and given that it has the "Google brand", it won't be hard to find motivated geeks hacking some neat software to [eventually] bring Chrome on par with Firefox, with said geeks' hidden agenda of being noticed by Google and be offered a nice googlejob where they get to sit on their googlechair, etc.
It's technically not such a bad chicken-and-egg situation, with the massive and thorough testing Google [claims to] have performed. Plus, the browser is more than a fine replacement for users of Internet Explorer or plain, out-of-the-box Firefox, thus making all us geeks appear crazy when non-techies ask us why we're not using Google Chrome, when we use everything else Google throws at us.
Anyway, I didn't set out to write yet another review, but to post solutions to problems I encountered:
I hit issue 119 ( Install Fails on W2K8 with low-rights user ) when I tried to install on my computer as a non-administrator and got the following:

Thankfully, the work-around by stephen.oakman in comment 6 worked and I found the elusive chrome_installer.exe in a folder matching the pattern C:\Documents and Settings\[user]\Local Settings\Application Data\Google\Update\Download\[guid]\chrome_installer.exe and was able to install it successfully.
I also had the same accessibility lament about minimum font sizes and font family overrides. For example, here is the Getting Started page in Firefox 2, with Verdana @ 14pt bliss:

...and this is what Chrome gave me with the same page:

OK, yes, the Firefox version looks weird with the title text not lining up with the logo, etc. but all the content is perfectly legible, which is more important to me. Well, more legible than the fonts picked by the web developer.
Thankfully, I have solved the first half the problem with a few quick searches in the source code and now my C:\Documents and Settings\[user]\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences file contains this little gem:
...which gives me a slight improvement in readability in Chrome:

You can find out what the names of the [other] supported hidden preferences are by peeking into chrome/common/pref_names.cc and cross-referencing with WebContents::GetWebkitPrefs() in chrome/browser/web_contents.cc. In particular, you'll find (as of this writing) that the other half of my problem is already identified in a comment:
...with the more details being:
D'oh. Maybe this will inspire someone else to fix that part of the code or otherwise provide the elusive "let me choose my own damn fonts" setting that I rely on for keeping my sight and posture in good shape.
It's technically not such a bad chicken-and-egg situation, with the massive and thorough testing Google [claims to] have performed. Plus, the browser is more than a fine replacement for users of Internet Explorer or plain, out-of-the-box Firefox, thus making all us geeks appear crazy when non-techies ask us why we're not using Google Chrome, when we use everything else Google throws at us.
Anyway, I didn't set out to write yet another review, but to post solutions to problems I encountered:
Installing Chrome as a non-administrator
I hit issue 119 ( Install Fails on W2K8 with low-rights user ) when I tried to install on my computer as a non-administrator and got the following:

Thankfully, the work-around by stephen.oakman in comment 6 worked and I found the elusive chrome_installer.exe in a folder matching the pattern C:\Documents and Settings\[user]\Local Settings\Application Data\Google\Update\Download\[guid]\chrome_installer.exe and was able to install it successfully.
Setting the minimum font size
I also had the same accessibility lament about minimum font sizes and font family overrides. For example, here is the Getting Started page in Firefox 2, with Verdana @ 14pt bliss:

...and this is what Chrome gave me with the same page:

OK, yes, the Firefox version looks weird with the title text not lining up with the logo, etc. but all the content is perfectly legible, which is more important to me. Well, more legible than the fonts picked by the web developer.
Thankfully, I have solved the first half the problem with a few quick searches in the source code and now my C:\Documents and Settings\[user]\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences file contains this little gem:
"webkit": {
"webprefs": {
"cursive_font_family": "Verdana",
"default_fixed_font_size": 14,
"default_font_size": 14,
"fantasy_font_family": "Verdana",
"fixed_font_family": "Courier New",
"minimum_font_size": 14,
"minimum_logical_font_size": 14,
"sansserif_font_family": "Verdana",
"serif_font_family": "Verdana"
}
}
...which gives me a slight improvement in readability in Chrome:

You can find out what the names of the [other] supported hidden preferences are by peeking into chrome/common/pref_names.cc and cross-referencing with WebContents::GetWebkitPrefs() in chrome/browser/web_contents.cc. In particular, you'll find (as of this writing) that the other half of my problem is already identified in a comment:
// User CSS is currently disabled because it crashes chrome. See
// webkit/glue/webpreferences.h for more details.
...with the more details being:
// TODO(tc): User style sheets will not work in chrome because it tries to
// load the style sheet using a request without a frame.
bool user_style_sheet_enabled;
GURL user_style_sheet_location;
D'oh. Maybe this will inspire someone else to fix that part of the code or otherwise provide the elusive "let me choose my own damn fonts" setting that I rely on for keeping my sight and posture in good shape.
Friday, August 08, 2008
Effort vs. Results
I remember having a conversation with my father when I was a kid about his company's employees. I was shocked to discover they were being paid by the hour. I remember following up with a question along the lines of "Wouldn't that encourage them to take lots of time to do their work?" He assured me that, although it was a possibility, it didn't happen very often. (and presumably he explained that people who did that could lose their job, so it was to their long-term advantage to not slack off)
Fast forward a few years later, when I'm in high-school and a student asks the teacher - after she explained a homework assignment - if any marks would be given for effort. I couldn't help but laugh out loud, thinking he was pulling the teacher's leg. He didn't join me in laughing or smiling (and probably shot me a dirty look). Uh oh. He was serious!?!?
Maybe I found that proposition silly because I figured there was no way for it to be reliably measured: it would have to be self-reported. How hard would it be to say "I spent 100 hours on this" when handing it in? And if I had completed the assignment in 10 hours and produced equivalent results to his, would that mean he would get more marks than I got because he spent more time?? Worse yet, even if it wasn't self-reported, how would it be measured??? And what about the difference between "brain time" and "body time"?
Nowadays, I understand why people are [usually] compensated by how much their skills are in demand and that it is possible to be 10 times better than someone else at what you do. Maybe I also did as a kid? That might explain my reaction in both instances. Could it also explain my drive for correctness? My passion for getting things done and done right?? Now here's a doozy for you: would this knowledge at a younger age have helped other students??? Or maybe I'm just being arrogant and that I should just shut up for being the nerd that didn't have any trouble with his assignments????
Discuss.
P.S.: Please go easy on me as I have been working on this blog post since November and it's only now that I have been able to finish it.
Fast forward a few years later, when I'm in high-school and a student asks the teacher - after she explained a homework assignment - if any marks would be given for effort. I couldn't help but laugh out loud, thinking he was pulling the teacher's leg. He didn't join me in laughing or smiling (and probably shot me a dirty look). Uh oh. He was serious!?!?
Maybe I found that proposition silly because I figured there was no way for it to be reliably measured: it would have to be self-reported. How hard would it be to say "I spent 100 hours on this" when handing it in? And if I had completed the assignment in 10 hours and produced equivalent results to his, would that mean he would get more marks than I got because he spent more time?? Worse yet, even if it wasn't self-reported, how would it be measured??? And what about the difference between "brain time" and "body time"?
Nowadays, I understand why people are [usually] compensated by how much their skills are in demand and that it is possible to be 10 times better than someone else at what you do. Maybe I also did as a kid? That might explain my reaction in both instances. Could it also explain my drive for correctness? My passion for getting things done and done right?? Now here's a doozy for you: would this knowledge at a younger age have helped other students??? Or maybe I'm just being arrogant and that I should just shut up for being the nerd that didn't have any trouble with his assignments????
Discuss.
P.S.: Please go easy on me as I have been working on this blog post since November and it's only now that I have been able to finish it.
Saturday, July 26, 2008
I got in a "jam"...
Round 1A of Google's Code Jam programming contest (in which I participated) ended about an hour-and-a-half ago (there are three sub-rounds of Round 1 and contestants can compete in two of them to try to move on to Round 2).
A failure (on my part) to pay close attention to the requirements of the first problem meant I implemented an algorithm with a complexity of
You see, there was a trick to the problem. Once I realized this, I replaced the double permutation loop with two calls to Sort() and a single
Oh, well... I might try again in Round 1C (Sunday at 05:00 local time!), but in the meantime I thought I'd publish some of the source code that came out of this. I used Visual Studio 2008, which meant I could try out the neat features of the C# that came out with .NET 3.5, such as:
OK, so I didn't need to use LINQ, nor did I use extension methods until after the contest, but here's my touched-up
...which you can use as follows (notice how it's magically a method on any IList<> implementation?):
...and it should produce the following output:
I just wish I had prepared this method before the contest, although I think some actual practice in solving these kinds of problems would have helped me more. Maybe next time... :)
A failure (on my part) to pay close attention to the requirements of the first problem meant I implemented an algorithm with a complexity of
O(n! * n!), which means 25 401 600 iterations for n = 7 (sort of reasonable) but 1 625 702 400 iterations for n = 8, something my laptop wouldn't be able to finish in any reasonable amount of time. It's much worse when you consider that n was expected to go as high as 800! Once I read that, it occurred to me that I had been going at it entirely the wrong way... About an hour-and-a-half of going the wrong way, which involved implementing (and debugging) a nice "permute the items of this list" method.You see, there was a trick to the problem. Once I realized this, I replaced the double permutation loop with two calls to Sort() and a single
O(n) loop. D'oh! My solution to the small input was judged as correct, so I proceeded to the large input. It ran just as fast and so I submitted its output, too. Well, again, I screwed up with the requirements and it turns out my math was overflowing left, right and center and thus, when the contest ended, I got a measly 5 points (out of a possible 15 for that problem and out of a possible 100 for all 3 problems!), which means I ranked 2363 out of 2394. (you don't find out if your submission to the large version is correct until the end of the contest - I also only attempted the first problem)Oh, well... I might try again in Round 1C (Sunday at 05:00 local time!), but in the meantime I thought I'd publish some of the source code that came out of this. I used Visual Studio 2008, which meant I could try out the neat features of the C# that came out with .NET 3.5, such as:
- the
varkeyword - extension methods
- LINQ
OK, so I didn't need to use LINQ, nor did I use extension methods until after the contest, but here's my touched-up
Permutations iterator method, generalized to any IList<T> instance:public static class Extension {
public static IEnumerable<IList<T>> Permutations<T> ( this IList<T> input ) {
int numElements = input.Count;
var slotOffsets = new int[numElements];
var slotBusy = new bool[numElements];
bool allDone = false;
while ( !allDone ) {
#region Set slotBusy flags to false
for ( int i = 0; i < numElements; i++ ) {
slotBusy[i] = false;
}
#endregion
IList<T> permutation = new List<T> ( numElements );
int lastSelected = -1;
for ( int i = 0; i < numElements; i++ ) {
for ( int j = 0; j < numElements; j++ ) {
int selectedSlot = ( lastSelected + 1 + j + slotOffsets[i] ) % numElements;
if ( !slotBusy[selectedSlot] ) {
slotBusy[selectedSlot] = true;
permutation.Add ( input[selectedSlot] );
lastSelected = selectedSlot;
break;
}
}
}
yield return permutation;
#region Update offsets
for ( int i = 0; i < numElements; i++ ) {
slotOffsets[i]++;
if ( slotOffsets[i] < ( numElements - i ) ) {
break;
}
else {
if ( i == numElements - 1 ) {
allDone = true;
}
else {
slotOffsets[i] = 0;
}
}
}
#endregion
}
}
}...which you can use as follows (notice how it's magically a method on any IList<> implementation?):
IList<int> inputList = new List<int> ( new int[] { 1, 2, 3 } );
foreach ( List<int> permutation in inputList.Permutations ( ) ) {
StringBuilder sb = new StringBuilder ( );
sb.Append ( "[" );
bool isFirst = true;
foreach ( var item in permutation ) {
if ( !isFirst ) {
sb.Append ( ", " );
}
else {
isFirst = false;
}
sb.Append ( item );
}
sb.Append ( "]" );
Console.WriteLine ( sb.ToString() );
}...and it should produce the following output:
[1, 2, 3]
[2, 3, 1]
[3, 1, 2]
[1, 3, 2]
[2, 1, 3]
[3, 2, 1]
I just wish I had prepared this method before the contest, although I think some actual practice in solving these kinds of problems would have helped me more. Maybe next time... :)
Tuesday, June 10, 2008
Announcing the web-screen-saver project
I finally got around to posting a little tidbit of source code I had lying around on my computer as the new open-source project web-screen-saver (really lame name, I know). Not only that, but the premise seems a bit lame, too. Who would want a screen-saver that runs in their web browser?
It turns out I do! I have been learning about aviation weather and the best way to stay fresh is to practice every day, so I took a really old Toshiba laptop (Pentium MMX @ 166 MHz, 16 MB RAM and a 2.1 GB HD), got it running again (which involvedsoldering frankensteining an equally-as-old power supply from a Futjitsu laptop, not to mention putting the disassembled laptop back together from memory) and set it on top of my refrigerator. This way, whenever I'm preparing meals, washing dishes, feeding the cat, etc. in the kitchen, I can take a minute or so to browse the latest weather.
Next up was figuring out how to get various semi-frequently-updated images to show up on the screen on a cycle. Various options popped up, such as:
Some of the above options don't make that much sense until you consider that aviation weather is the kind of information that's sensitive to updates (or the lack thereof) and so it is of the utmost importance to always have the latest version of, say, a TAF or a GFA cloud & weather map. With some web browsers reportedly overzealously caching pages or images coupled with sometimes unreliable internet connections, I was trying to explore the space of options so that I could potentially detect the worse case and do something about it.
I ended up deciding to see whether the current browsers that I use/care about indeed [still] suffered from that problem, since it would eliminate an entire class of problems/solutions. Turns out that improper browser caching no longer appears to be a problem, although this could also be due to properconfiguration programming at the server end. That, and the prospect of having to write client-server code that scanned files coming from remote computers sounded more stupid every second I continued to think about it since, you know, web browsers do that sort of thing already!
A few evenings of light programming (i.e. tweaking a few lines of code here and there during a few boring moments of TV watching) and I've got what I think is "version 1.0"-worthy. It's running right now on the trusty laptop in Internet Explorer 6[1] in full-screen mode (hide the status bar, hit F11, then right-click on the toolbars to select auto-hide), although with this much RAM it just swaps and thrashes like hell for a minute or two on every reload. I also need to reboot it every so often because the USB wireless adapter's driver is as stable as the U.S. economy. *cough*
Download version 1.0: awesome-web-screen-saver-1.0.html.
View source of version 1.0: index.html
Live demo (latest version): Aviation Weather Electronic Summary Of Major Events
Once everything loads, all but the first page/image will be "hidden" (it's really aclever lame container resizing trick). After 2 minutes, the next page/image will be shown, etc. until about 33 minutes at which point the whole thing will reload. You can, of course, scroll up and down, but you may want to use the left and right arrow keys, since they are programmed to jump back and forward (respectively) at page/image boundaries.
[1] This will probably cost me a few geek points, but the laptop is still running the Windows 98 copy it came with - I couldn't get any GNU/Linux distro to boot/install and I have better things to do with my time!
It turns out I do! I have been learning about aviation weather and the best way to stay fresh is to practice every day, so I took a really old Toshiba laptop (Pentium MMX @ 166 MHz, 16 MB RAM and a 2.1 GB HD), got it running again (which involved
Next up was figuring out how to get various semi-frequently-updated images to show up on the screen on a cycle. Various options popped up, such as:
- a
cronjob that would triggerwgeton a few URLs with one of:
- a companion program that would convert the HTML pages to images and rescale pure images appropriately and a corresponding client (any of many file-system-based screen-savers)
- a static page that would cycle the pre-downloaded pages or images using a bit of JavaScript
- a number of static pages that serve up one pre-downloaded page or image for a little bit of time before redirecting to the next
- a static page that would cycle the live pages or images using a bit of JavaScript
- a number of static pages that serve up one live page or image for a little bit of time before redirecting to the next
Some of the above options don't make that much sense until you consider that aviation weather is the kind of information that's sensitive to updates (or the lack thereof) and so it is of the utmost importance to always have the latest version of, say, a TAF or a GFA cloud & weather map. With some web browsers reportedly overzealously caching pages or images coupled with sometimes unreliable internet connections, I was trying to explore the space of options so that I could potentially detect the worse case and do something about it.
I ended up deciding to see whether the current browsers that I use/care about indeed [still] suffered from that problem, since it would eliminate an entire class of problems/solutions. Turns out that improper browser caching no longer appears to be a problem, although this could also be due to proper
A few evenings of light programming (i.e. tweaking a few lines of code here and there during a few boring moments of TV watching) and I've got what I think is "version 1.0"-worthy. It's running right now on the trusty laptop in Internet Explorer 6[1] in full-screen mode (hide the status bar, hit F11, then right-click on the toolbars to select auto-hide), although with this much RAM it just swaps and thrashes like hell for a minute or two on every reload. I also need to reboot it every so often because the USB wireless adapter's driver is as stable as the U.S. economy. *cough*
Download
Download version 1.0: awesome-web-screen-saver-1.0.html.
View source of version 1.0: index.html
Live demo (latest version): Aviation Weather Electronic Summary Of Major Events
How to use
Once everything loads, all but the first page/image will be "hidden" (it's really a
Roadmap for future versions
- JavaScript code to live in its own file
- META-based refresh to be adjusted based on the number of "pages"
- better handling of unavailable content (i.e. keep retrying - with suitable back-off - iframes or images that returned anything other than HTTP 200)
- use Google App Engine for the following features:
- configurable content profiles (i.e. pick your own frequently-changing content)
- content caching (i.e. Google's servers can withstand more hits and will probably replicate content to various globally-distributed data centers for higher availability)
- content download scheduling (i.e. while you have both of the previous two features, you might as well configure content with an expected lifetime or scheduled release, so that it is only pulled once, per publishing, from its source)
- stats collection
- general geekiness
Notes
[1] This will probably cost me a few geek points, but the laptop is still running the Windows 98 copy it came with - I couldn't get any GNU/Linux distro to boot/install and I have better things to do with my time!
Thursday, May 08, 2008
"I must use this power only to annoy"
I clicked on an Amazon link to a product the other day and it lead me to its product page. Everything there is fine, except instead of a price, there was a link that read "Click here to see the price". There was also another link that read (Why don't we show the price?) which contained the following text:
Ummm... WTF? If I didn't see a price in a brick-and-mortar store, I wouldn't buy the item! You forcing me to click just to replicate that have-to-ask experience is forcing me to replicate my wouldn't-buy-the-item reaction. I hope you're happy about your lost sale.
Why Don't We Show the Price?
Manufacturers sometimes ask that retailers not display a price if it drops below a certain amount. The "click here to see price" message indicates that the price of the item is so low that the manufacturer requested that it not be advertised (that is, displayed). In a brick-and-mortar store, you would probably have to ask a salesperson what the price of the product is. At Amazon, by clicking on "click here to see price" you are essentially asking to see the price, at which point we show it to you.
Ummm... WTF? If I didn't see a price in a brick-and-mortar store, I wouldn't buy the item! You forcing me to click just to replicate that have-to-ask experience is forcing me to replicate my wouldn't-buy-the-item reaction. I hope you're happy about your lost sale.
Tuesday, April 29, 2008
Hi-tech alumni
What appeared to be a joke article at first glance (Cravath sounds like the french word for a tie) turned out to be a very insightful post by Alex on the topic of quitting and more generally about the habits of a certain class of software developers. I couldn't agree more! In fact, I have found myself proud to announce to my peers that I have worked at Microsoft and Macadamian; that I'm an alumnus or a graduate of sorts from their respective schools [of thought], that I embody some/most of their best practices and serve as a kind of unofficial ambassador.
I can relate to the "bus factor" concept and can even suggest a tangible metric: fantastic developers (who are thus likely to quit) are usually top contributors to corporate wikis, since they are constantly externalizing their knowledge for future colleagues/replacements. This, ironically, increases their value since they can spend more of their [precious] time solving new problems instead of being constantly disturbed for knowledge and acting as a "walking wiki" (which Alex calls "unskilled people"). It's not hard to see how true synergy is achieved by having all documentation at everybody's fingertips. This is what Bill Gates called a Digital Nervous System.
The next logical step to documenting is automating. So even if you feel your "bus factor" is low because everything is documented and your team spends a lot/most of their time solving new problems (which is, by itself, an excellent start) documented AND automated processes are the true mark of excellent talent.
So, in the spirit of the topic, I will quit my job (and there's nothing wrong with that), but I just haven't decided when. And if I start a company, I will include a link to this article in the corporate wiki.
P.S.: I'm posting this to my blog from Google Docs. I had this idea that it would be great to be able to do so and, lo and behold, there it was, under
Update: Ok, it posted, but without a title and the HTML was definitely not clean, but it's a start. I probably just need to tweak a few styles.
I can relate to the "bus factor" concept and can even suggest a tangible metric: fantastic developers (who are thus likely to quit) are usually top contributors to corporate wikis, since they are constantly externalizing their knowledge for future colleagues/replacements. This, ironically, increases their value since they can spend more of their [precious] time solving new problems instead of being constantly disturbed for knowledge and acting as a "walking wiki" (which Alex calls "unskilled people"). It's not hard to see how true synergy is achieved by having all documentation at everybody's fingertips. This is what Bill Gates called a Digital Nervous System.
The next logical step to documenting is automating. So even if you feel your "bus factor" is low because everything is documented and your team spends a lot/most of their time solving new problems (which is, by itself, an excellent start) documented AND automated processes are the true mark of excellent talent.
So, in the spirit of the topic, I will quit my job (and there's nothing wrong with that), but I just haven't decided when. And if I start a company, I will include a link to this article in the corporate wiki.
P.S.: I'm posting this to my blog from Google Docs. I had this idea that it would be great to be able to do so and, lo and behold, there it was, under
Share/Publish as web page...Update: Ok, it posted, but without a title and the HTML was definitely not clean, but it's a start. I probably just need to tweak a few styles.
Friday, February 29, 2008
PalmPilot Jr
Having received my XO's developer key, I immediately upgraded the operating system to build number "Joyride 1638", using one of those "USB-based memory sticks". The large PDA/small laptop now appears to switch to some form of low-power mode whenever the lid is closed, when in "Reader mode" and in the middle of yum-based downloads. A tad too aggressive, if you ask me, but that's life when installing unstable software. It may have had something to do with having the Reader activity opened at the same time, but in any case, I don't think suspending is necessary when the laptop is plugged in. Maybe it would be OK after a much longer timeout, say 10 minutes.
Other than that, the new power management features (coming from build 653 -- which I think had absolutely none, except maybe for the "blank screen" screensaver -- these features are totally new) are really spiffy, and allowed me to go from a full charge this morning and still be going after a ride on the bus, followed by a full day of work (where it spent most of that time closed up). Hmmm... Maybe I didn't explain that correctly, so I'll switch to rough pseudo-code:
...there. I swear those "I write code" t-shirts were invented for me.
Anyway, there are still a few quirks, but the software is definitely getting there, which brings me to the whole point of this post: the XO should [eventually] be sold around the world. I'm thinking it could be ready and in all the stores where laptops and/or educational toys are normally sold (such as Walmart, Toys 'R' Us, ThinkGeek, Amazon.com, Future Shop, Best Buy, Fry's Electronics, Radio Shack, etc.) by next Christmas.
This form of distribution could expand their user base in a way that's not too dissimilar to the G1G1 program, minus the logistics nightmares associated with selling and shipping 80 000 units individually. This way, they ship say, 250 000 units in chunks of 10 or 20 thousand to a few retailers with established distribution channels and the foundation can then focus their efforts on what they do best (designing and building the laptop, marketing to governments of poor countries, etc.), instead of trying to also be a mass-distributor.
Of course, this assumes that the sale of XOs at retail would bring enough revenue to not only make this affordable to the foundation, but also to make money. I don't think they could pitch it for $400 (as in the G1G1 campaign) with a straight face (some Acer laptops are available now for $600), but they could probably do it for less than $200. At that price, they are starting to compete with other educational toys, as well as traditional PDAs that also come with a keyboard, word processing software, a web browser and an extended battery life.
I'm totally serious about this: it could be the source of volume they have been after to bring the price of the units down, not to mention the associated network effects. Think of it this way: as a parent, would you rather get your child an expensive, fragile computer made for adults or an inexpensive, rugged computer made for kids? ("hand-me-down clunkers" and sources of free tech support notwithstanding) How many people missed out due to the G1G1 campaign's short lifespan or high barrier of entry (i.e. you must create a PayPal account - even though the error message only said your credit card was not valid - and then have it authorized for large amounts - which means having it linked to a bank account - on top of the amateur-looking website and the uncertainty of shipping dates, etc.)?
Let's hope they read my blog and credit me after the associated success boom from implementing my master plan. You're welcome. :)
Other than that, the new power management features (coming from build 653 -- which I think had absolutely none, except maybe for the "blank screen" screensaver -- these features are totally new) are really spiffy, and allowed me to go from a full charge this morning and still be going after a ride on the bus, followed by a full day of work (where it spent most of that time closed up). Hmmm... Maybe I didn't explain that correctly, so I'll switch to rough pseudo-code:
laptop.powerMode = PowerMode.OnBattery;
laptop.radio = RadioMode.Off;
me.use ( laptop, 30 /* minutes */ );
laptop.powerMode = PowerMode.Suspend;
Thread.sleep ( 1000 * 60 * 60 * 8 /* 8 hours in milliseconds */ );
laptop.powerMode = PowerMode.OnBattery;
me.use ( laptop, 30 /* minutes */ );
// because I didn't have to shutdown and boot up the laptop again
me.mood = Mood.Happy;
...there. I swear those "I write code" t-shirts were invented for me.
Anyway, there are still a few quirks, but the software is definitely getting there, which brings me to the whole point of this post: the XO should [eventually] be sold around the world. I'm thinking it could be ready and in all the stores where laptops and/or educational toys are normally sold (such as Walmart, Toys 'R' Us, ThinkGeek, Amazon.com, Future Shop, Best Buy, Fry's Electronics, Radio Shack, etc.) by next Christmas.
This form of distribution could expand their user base in a way that's not too dissimilar to the G1G1 program, minus the logistics nightmares associated with selling and shipping 80 000 units individually. This way, they ship say, 250 000 units in chunks of 10 or 20 thousand to a few retailers with established distribution channels and the foundation can then focus their efforts on what they do best (designing and building the laptop, marketing to governments of poor countries, etc.), instead of trying to also be a mass-distributor.
Of course, this assumes that the sale of XOs at retail would bring enough revenue to not only make this affordable to the foundation, but also to make money. I don't think they could pitch it for $400 (as in the G1G1 campaign) with a straight face (some Acer laptops are available now for $600), but they could probably do it for less than $200. At that price, they are starting to compete with other educational toys, as well as traditional PDAs that also come with a keyboard, word processing software, a web browser and an extended battery life.
I'm totally serious about this: it could be the source of volume they have been after to bring the price of the units down, not to mention the associated network effects. Think of it this way: as a parent, would you rather get your child an expensive, fragile computer made for adults or an inexpensive, rugged computer made for kids? ("hand-me-down clunkers" and sources of free tech support notwithstanding) How many people missed out due to the G1G1 campaign's short lifespan or high barrier of entry (i.e. you must create a PayPal account - even though the error message only said your credit card was not valid - and then have it authorized for large amounts - which means having it linked to a bank account - on top of the amateur-looking website and the uncertainty of shipping dates, etc.)?
Let's hope they read my blog and credit me after the associated success boom from implementing my master plan. You're welcome. :)
Tuesday, January 29, 2008
Blogging resumes (and other news)
After far too long of not blogging, I have arranged the circumstances to make it more likely I would blog through the use of an innovative concept I like to call "Blogging on the bus". Such a thing is now possible since the arrival of my late Christmas/early birthday present: an XO laptop (and about an hour of travel by bus to/from work every weekday).
I participated in the G1G1 (give one, get one) campaign and received the small laptop/large PDA device shortly two months after ordering it. Apart from being too small to allow me to touchtype, I really like it. It should be at least faster to write with than with my crusty old Palm III and also easier to read RSS feeds, etc. than same. I'm not sure I have figured out how to have it sleep and wake up (suspend/resume) really fast like my Palm did (thus never having to boot up/shutdown), but the OLPC wiki is nice and should have the answer.
UPDATE: The software that shipped with my unit does not support this yet:
How do I put an XO laptop to sleep?
Also worthy of noting is the successful completion of the courses part of my master's program at Carleton University. I now have to pick a decent topic and a supervisor to get started on this "other half". I'm hoping to add neat features to T.O.D.D. (a.k.a. testoriented), such as automatic testing, thus effectively putting me out of a day job. (ha ha)
Lastly, I would like to thank everybody who left words of thanks for my posting about Hacking the Microsoft Natural keyboard 4000, redux, as well as whoever drove all that traffic to my blog. I think we now have enough evidence to say that Microsoft definitely shipped the wrong mapping for that slider. I wonder if I should also start selling a little "Scroll" sticker (or, really, just a piece of electrical tape - such as this patch kit) alongside a floppy disk containing an automated and friendly version of the software I had posted, calling it an "upgrade kit" of some sort.
I participated in the G1G1 (give one, get one) campaign and received the small laptop/large PDA device shortly two months after ordering it. Apart from being too small to allow me to touchtype, I really like it. It should be at least faster to write with than with my crusty old Palm III and also easier to read RSS feeds, etc. than same. I'm not sure I have figured out how to have it sleep and wake up (suspend/resume) really fast like my Palm did (thus never having to boot up/shutdown), but the OLPC wiki is nice and should have the answer.
UPDATE: The software that shipped with my unit does not support this yet:
How do I put an XO laptop to sleep?
The sleep feature is not enabled in software provided on XOs shipped starting December 2007 in the Give1Get1 program. A software upgrade early in 2008 will support suspend/resume sleep features, for much improved battery life.
Also worthy of noting is the successful completion of the courses part of my master's program at Carleton University. I now have to pick a decent topic and a supervisor to get started on this "other half". I'm hoping to add neat features to T.O.D.D. (a.k.a. testoriented), such as automatic testing, thus effectively putting me out of a day job. (ha ha)
Lastly, I would like to thank everybody who left words of thanks for my posting about Hacking the Microsoft Natural keyboard 4000, redux, as well as whoever drove all that traffic to my blog. I think we now have enough evidence to say that Microsoft definitely shipped the wrong mapping for that slider. I wonder if I should also start selling a little "Scroll" sticker (or, really, just a piece of electrical tape - such as this patch kit) alongside a floppy disk containing an automated and friendly version of the software I had posted, calling it an "upgrade kit" of some sort.
Labels:
hardware,
meta-blogging,
olpc,
school,
testoriented,
xo
Tuesday, May 08, 2007
Your code is suboptimal!
I'm a sucker for t-shirts. Since I'm a geek with too much time on my hands, I'm part of an exclusive club. Then, because I read Eric Sink's Weblog, that makes me part of an even exclusiver club. Lastly, when I saw that Eric was offering to send some of his excellent t-shirts to people who were willing to mimic the character in a public photo plugging SourceGear's upcoming Fortress software, I couldn't resist the opportunity to sign up. 6-8 4-6 weeks later, here it is!
The t-shirt with the "Evil Mastermind" saying "YOUR CODE IS SUBOPTIMAL!" is part of an excellent marketing campaign. | ![]() |
Sunday, April 01, 2007
Please turn to page F%
I was reading the "Tech Weekly" section of a newspaper when I noticed that the staff are still typing page numbers by hand. How else could you explain page F5 (with page F3 folded up under it), as illustrated in this scan of a printout of a picture of a wooden table?
.jpg)
UPDATE: My submission to the Worse Than Failure website has finally appeared.
.jpg)
UPDATE: My submission to the Worse Than Failure website has finally appeared.
Saturday, March 31, 2007
They're more like guidelines...
Finally! An equivalent to SciTE's edge.* settings in Visual Studio! Trouble is, it's not called "edge" or "margin" (Eclipse), but "guidelines". No wonder I couldn't find anything on the topic when I was searching online!
Thanks go out to Sara Ford who blogged about this wonderful feature. If only I had known about this, oh, three years ago! :)
Here you go. Just copy/paste the following into a
Thanks go out to Sara Ford who blogged about this wonderful feature. If only I had known about this, oh, three years ago! :)
Here you go. Just copy/paste the following into a
.reg file and import it. You can change the colour (currently a very pale green) and at which column you want it to show (currently at 80). You can even add more columns apparently, but that's getting a little silly.
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\Text Editor]
"Guides"="RGB(192,220,192) 80"
Monday, February 26, 2007
My name
It looks like Eber Irigoyen might be on to a new meme. I must propagate it by joining them in lamenting the mis-pronunciations of my names:
As a result, I try to go by Oli, but this has proven to be equally as elusive as many people will write down Ali or even Holly! (WTF?)
- aw li vee eh
- aw liver
- dah gue naiz
- dah gue nah
- day je naiz
- day je neh
As a result, I try to go by Oli, but this has proven to be equally as elusive as many people will write down Ali or even Holly! (WTF?)
Subscribe to:
Posts (Atom)
