June 2008 Archives

IronPython integration

| | Comments (0)
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using IronPython.Hosting;
using IronPython.Runtime;

namespace TabbedImages {

    class TabbedImages {

        [STAThread]
        static void Main(string[] rawArgs) {
            List args = new List(rawArgs);
            args.Insert(0, Application.ExecutablePath);

            string dir = Path.GetDirectoryName(Application.ExecutablePath);
            PythonEngine engine = new PythonEngine();
            engine.AddToPath(dir);
            engine.Sys.argv = List.Make(args);

            Dictionary<string, object> d = new Dictionary<string, object>();
            EngineModule engineModule = engine.CreateModule("__main__", d, true);
            engine.DefaultModule = engineModule;

            string path = Path.Combine(dir, "main.py");
            engine.ExecuteFile(path);
        }
    }
}

The website's down

| | Comments (0)

This is a video with sound of an internal systems support guy's fictional morning. It is so funny. Comic gold:

  • remote desktop'ing into a salesguy's machine to discover that all the icons on his desktop form a penis outline
  • deleting boss's email from his sent mail to support denial of never having seen the message
  • attacking coworkers in Halo game

Dev102.com programming challenge #9

| | Comments (0)

Programming challenge #9 has been posted at dev102.com. I think that this is about the shortest solution possible.

I initially did this recursively, but I needed two functions: one for the base case using the root and one for all other cases. Here, I just set up the preconditions in variables outside the loop and iterate over the left and right nodes. Which node is second last depends upon whether we went left or right in the last iteration: if left, then the current; if right, then the parent.

Node secondLast(Node root)
{
 boolean wentRight = true;
 Node parent = NULL, current = root;
 while (current->left && current->right)
 {
  parent = current;
  wentRight = (current->right != NULL);
  current = wentRight ? current->right : current->left;
 }
 return (wentRight ? parent : current);
}

I suppose I could be perverse and write the loop with a body of a single line, assigning to parent, wentRight, and current within a single ternary operator statement:

  current = (wentRight = ((parent = current)->right != NULL)) ?
   current->right : current->left;

I think that's a bit obscure just for the sake of brevity.




2008-06-24: I could even drop the wentRight variable and use the parent variable to record which way we went:

 while (current->left && current->right)
 {
  parent = (current->right != NULL) ? current : NULL;
  current = (parent == NULL) ? current->right : current->left;
 }
 return (parent != NULL) ? parent : current;

Now we're down to a loop with just two variables. I don't think I can make the code shorter and simpler than that.

Ultimate Code Kata

| | Comments (0)

Jeff Atwood (of CodingHorror) has a great article for programmers pursuing self-directed learning. He has lots of ideas on how to practice programming.

ETF resources

| | Comments (0)

Here are some recent resources I found for ETFs. Of particular interest are sites that list current ETFs.




2008-06-25: MoneyCentral also has an ETF list. Unfortunately, you have to page through them 20 at a time. You can't download them all at once.

Learning NHibernate

| | Comments (0)

Open source project websites

| | Comments (0)

Not entirely on the mark. Some of these sites maintain real open source projects. Others, like CodeProject, are write-only sites with no collaboration.

  • [CodePlex]
    CodePlex is Microsoft's open source project hosting web site.
  • [SourceForge]
    SourceForge.net is the world's largest Open Source software development web site. SourceForge.net provides free hosting to Open Source software development projects with a centralized resource for managing projects, issues, communications, and code.
  • [Apache Software Foundation]
    The Apache Software Foundation provides support for the Apache community of open-source software projects. The Apache projects are characterized by a collaborative, consensus based development process, an open and pragmatic software license, and a desire to create high quality software that leads the way in its field.
  • [FreshMeat]
    freshmeat maintains the Web's largest index of Unix and cross-platform software, themes and related "eye-candy", and Palm OS software. Thousands of applications, which are preferably released under an open source license, are meticulously cataloged in the freshmeat database, and links to new applications are added daily. Each entry provides a description of the software, links to download it and to obtain more information, and a history of the project's releases, so readers can keep up-to-date on the latest developments.
  • [CodeProject]
    The Code Project was formed to provide developers with a place to meet and exchange ideas. We hope to provide developers with all the resources they need to help them in their day to day programming, as well as helping them keep up to date with the latest technologies.

Electoral college meets dynamic programming

| | Comments (0)

I came across a great programming article on how to calculate the combinations of states to produce 270 or more electoral college votes. I've honestly never done any dynamic programming problems like this. At least, I haven't done them the dynamic programming way; I've done them by brute force, and often I haven't gotten an answer because brute force is too slow.

With this in mind, I'll be revisiting some of the Project Euler problems because with this method and insight, so many more problems will be tractable. In particular, I expect this one will succumb to a dynamic programming solution.

In the meantime, here is the python code to solve the problem:

votes = [55, 34, 31, 27, 21, 21, 20, 17, 15, 15,
    15, 13, 12, 11, 11, 11, 11, 10, 10, 10,
    10,  9,  9,  9,  8,  8,  7,  7,  7,  7,
     6,  6,  6,  5,  5,  5,  5,  5,  4,  4,
     4,  4,  4,  3,  3,  3,  3,  3,  3,  3,
     3,
]
import collections
ways = collections.defaultdict(int)
ways[0] = 1
for n in xrange(len(votes)) :
    for v in xrange(270+votes[n]-1, votes[n]-1, -1) :
        ways[v] += ways[v-votes[n]]
print sum(ways[k] for k in ways.iterkeys() if k >= 270)

CodeFetch

| | Comments (0)

[CodeFetch] allows developers to search programming books online for code samples in the language of their choice.

Say you wanted to find a C# code sample that implements a priority queue, like I did here. You could get several implementations from CodeFetch with a simple search. Mind you, the implementations I'm seeing are a bit bizarre. Would you really implement a priority queue by maintaining a sorted array?

An amazing graphic which links the meltdown in sub-prime to other structured products, including CDOs and ABS, across four periods: Jan-Feb 2007; Jul-Aug 2007; Oct-Nov 2007; and early 2008. Originally in the June 2008 Financial Stability Review.

Nature blog: All about nature, travel and vacation

| | Comments (0)

[nature-blog] has some of the most amazing photographs from all over the world. Extraordinary areas covered:

  • Tien Shan Mountains in western China
  • Lake Baikal in Siberia, the world's deepest lake
  • the Dades Valley in Morocco
  • Lake Titicaca of Bolivia and Peru
  • Ellesmere Island of Canada
  • Victoria Falls in Zambia
  • the Atacama Desert in Chile

RSI trader blog

| | Comments (0)

[RSI trader blog] has end of day relative strength calculations for you to trade on, if you think that this analytic is a good signal.

Why tables for layout is stupid

| | Comments (0) | TrackBacks (0)

A great article on using functional CSS layout instead of structural HTML layout. Colorful cartoons, too.

[Why tables for layout is stupid]

dsl.stlsmo.swbell.net

| | Comments (2) | TrackBacks (0)

So here's a weird one. So far this month, I've had about 500 distinct visitors to my website. I think that's pretty good. However, the odd part is that 110 of them are from the same domain, dsl.stlsmo.swbell.net:

68.92.94.178: adsl-68-92-94-178.dsl.stlsmo.swbell.net
68.92.95.18: adsl-68-92-95-18.dsl.stlsmo.swbell.net
68.92.95.180: adsl-68-92-95-180.dsl.stlsmo.swbell.net
68.92.95.214: adsl-68-92-95-214.dsl.stlsmo.swbell.net
68.92.95.24: adsl-68-92-95-24.dsl.stlsmo.swbell.net
68.94.88.15: adsl-68-94-88-15.dsl.stlsmo.swbell.net
68.94.88.185: adsl-68-94-88-185.dsl.stlsmo.swbell.net
68.94.88.205: adsl-68-94-88-205.dsl.stlsmo.swbell.net
68.94.88.232: adsl-68-94-88-232.dsl.stlsmo.swbell.net
68.94.89.154: adsl-68-94-89-154.dsl.stlsmo.swbell.net
68.94.89.16: adsl-68-94-89-16.dsl.stlsmo.swbell.net
68.94.89.162: adsl-68-94-89-162.dsl.stlsmo.swbell.net
68.94.89.166: adsl-68-94-89-166.dsl.stlsmo.swbell.net
68.94.89.178: adsl-68-94-89-178.dsl.stlsmo.swbell.net
68.94.89.247: adsl-68-94-89-247.dsl.stlsmo.swbell.net
68.94.89.78: adsl-68-94-89-78.dsl.stlsmo.swbell.net
68.94.90.165: adsl-68-94-90-165.dsl.stlsmo.swbell.net
68.94.90.221: adsl-68-94-90-221.dsl.stlsmo.swbell.net
68.94.90.3: adsl-68-94-90-3.dsl.stlsmo.swbell.net
68.94.91.106: adsl-68-94-91-106.dsl.stlsmo.swbell.net
68.94.91.205: adsl-68-94-91-205.dsl.stlsmo.swbell.net
68.94.91.27: adsl-68-94-91-27.dsl.stlsmo.swbell.net
68.95.70.166: adsl-68-95-70-166.dsl.stlsmo.swbell.net
68.95.70.73: adsl-68-95-70-73.dsl.stlsmo.swbell.net
68.95.71.65: adsl-68-95-71-65.dsl.stlsmo.swbell.net
68.95.71.70: adsl-68-95-71-70.dsl.stlsmo.swbell.net
69.148.180.103: adsl-69-148-180-103.dsl.stlsmo.swbell.net
69.148.180.2: adsl-69-148-180-2.dsl.stlsmo.swbell.net
69.148.180.210: adsl-69-148-180-210.dsl.stlsmo.swbell.net
69.148.8.102: ppp-69-148-8-102.dsl.stlsmo.swbell.net
69.148.8.11: ppp-69-148-8-11.dsl.stlsmo.swbell.net
69.148.9.122: ppp-69-148-9-122.dsl.stlsmo.swbell.net
69.149.224.194: adsl-69-149-224-194.dsl.stlsmo.swbell.net
69.149.224.227: adsl-69-149-224-227.dsl.stlsmo.swbell.net
69.149.224.234: adsl-69-149-224-234.dsl.stlsmo.swbell.net
69.149.225.190: adsl-69-149-225-190.dsl.stlsmo.swbell.net
69.149.225.226: adsl-69-149-225-226.dsl.stlsmo.swbell.net
69.149.225.37: adsl-69-149-225-37.dsl.stlsmo.swbell.net
69.149.226.179: adsl-69-149-226-179.dsl.stlsmo.swbell.net
69.149.227.195: adsl-69-149-227-195.dsl.stlsmo.swbell.net
69.150.176.169: adsl-69-150-176-169.dsl.stlsmo.swbell.net
69.150.176.241: adsl-69-150-176-241.dsl.stlsmo.swbell.net
69.150.176.84: adsl-69-150-176-84.dsl.stlsmo.swbell.net
69.150.177.152: adsl-69-150-177-152.dsl.stlsmo.swbell.net
69.150.177.48: adsl-69-150-177-48.dsl.stlsmo.swbell.net
69.150.180.211: adsl-69-150-180-211.dsl.stlsmo.swbell.net
69.150.181.105: adsl-69-150-181-105.dsl.stlsmo.swbell.net
69.150.181.237: adsl-69-150-181-237.dsl.stlsmo.swbell.net
69.150.181.244: adsl-69-150-181-244.dsl.stlsmo.swbell.net
69.152.88.106: adsl-69-152-88-106.dsl.stlsmo.swbell.net
69.152.89.77: adsl-69-152-89-77.dsl.stlsmo.swbell.net
69.152.90.204: adsl-69-152-90-204.dsl.stlsmo.swbell.net
69.152.90.206: adsl-69-152-90-206.dsl.stlsmo.swbell.net
69.152.90.209: adsl-69-152-90-209.dsl.stlsmo.swbell.net
69.152.91.137: adsl-69-152-91-137.dsl.stlsmo.swbell.net
69.153.101.177: adsl-69-153-101-177.dsl.stlsmo.swbell.net
69.153.244.39: adsl-69-153-244-39.dsl.stlsmo.swbell.net
69.153.244.45: adsl-69-153-244-45.dsl.stlsmo.swbell.net
69.153.245.11: adsl-69-153-245-11.dsl.stlsmo.swbell.net
69.153.246.118: adsl-69-153-246-118.dsl.stlsmo.swbell.net
69.153.246.132: adsl-69-153-246-132.dsl.stlsmo.swbell.net
69.153.246.22: adsl-69-153-246-22.dsl.stlsmo.swbell.net
69.153.247.248: adsl-69-153-247-248.dsl.stlsmo.swbell.net
69.154.132.121: adsl-69-154-132-121.dsl.stlsmo.swbell.net
69.154.132.17: adsl-69-154-132-17.dsl.stlsmo.swbell.net
69.155.188.143: adsl-69-155-188-143.dsl.stlsmo.swbell.net
69.155.188.45: adsl-69-155-188-45.dsl.stlsmo.swbell.net
69.155.189.123: adsl-69-155-189-123.dsl.stlsmo.swbell.net
69.155.189.147: adsl-69-155-189-147.dsl.stlsmo.swbell.net
69.155.189.216: adsl-69-155-189-216.dsl.stlsmo.swbell.net
69.155.189.33: adsl-69-155-189-33.dsl.stlsmo.swbell.net
69.155.191.82: adsl-69-155-191-82.dsl.stlsmo.swbell.net
69.155.5.242: adsl-69-155-5-242.dsl.stlsmo.swbell.net
69.155.5.90: adsl-69-155-5-90.dsl.stlsmo.swbell.net
69.155.6.106: adsl-69-155-6-106.dsl.stlsmo.swbell.net
69.155.6.113: adsl-69-155-6-113.dsl.stlsmo.swbell.net
69.155.7.105: adsl-69-155-7-105.dsl.stlsmo.swbell.net
70.240.132.129: adsl-70-240-132-129.dsl.stlsmo.swbell.net
70.240.132.144: adsl-70-240-132-144.dsl.stlsmo.swbell.net
70.240.132.59: adsl-70-240-132-59.dsl.stlsmo.swbell.net
70.240.133.103: adsl-70-240-133-103.dsl.stlsmo.swbell.net
70.240.134.10: adsl-70-240-134-10.dsl.stlsmo.swbell.net
70.240.134.121: adsl-70-240-134-121.dsl.stlsmo.swbell.net
70.240.134.19: adsl-70-240-134-19.dsl.stlsmo.swbell.net
70.240.134.47: adsl-70-240-134-47.dsl.stlsmo.swbell.net
70.240.135.64: adsl-70-240-135-64.dsl.stlsmo.swbell.net
70.240.4.5: adsl-70-240-4-5.dsl.stlsmo.swbell.net
70.240.5.126: adsl-70-240-5-126.dsl.stlsmo.swbell.net
70.240.5.20: adsl-70-240-5-20.dsl.stlsmo.swbell.net
70.240.5.205: adsl-70-240-5-205.dsl.stlsmo.swbell.net
70.240.5.56: adsl-70-240-5-56.dsl.stlsmo.swbell.net
70.240.6.14: adsl-70-240-6-14.dsl.stlsmo.swbell.net
70.240.7.152: adsl-70-240-7-152.dsl.stlsmo.swbell.net
70.240.7.4: adsl-70-240-7-4.dsl.stlsmo.swbell.net
70.240.7.86: adsl-70-240-7-86.dsl.stlsmo.swbell.net
70.241.192.213: adsl-70-241-192-213.dsl.stlsmo.swbell.net
70.241.192.23: adsl-70-241-192-23.dsl.stlsmo.swbell.net
70.241.192.242: adsl-70-241-192-242.dsl.stlsmo.swbell.net
70.241.193.165: adsl-70-241-193-165.dsl.stlsmo.swbell.net
70.241.193.27: adsl-70-241-193-27.dsl.stlsmo.swbell.net
70.241.193.43: adsl-70-241-193-43.dsl.stlsmo.swbell.net
70.241.193.82: adsl-70-241-193-82.dsl.stlsmo.swbell.net
70.241.194.202: adsl-70-241-194-202.dsl.stlsmo.swbell.net
70.241.195.146: adsl-70-241-195-146.dsl.stlsmo.swbell.net
70.241.195.246: adsl-70-241-195-246.dsl.stlsmo.swbell.net
70.241.198.29: adsl-70-241-198-29.dsl.stlsmo.swbell.net
70.241.198.34: adsl-70-241-198-34.dsl.stlsmo.swbell.net
70.241.198.70: adsl-70-241-198-70.dsl.stlsmo.swbell.net
70.242.149.153: ppp-70-242-149-153.dsl.stlsmo.swbell.net
70.242.149.233: ppp-70-242-149-233.dsl.stlsmo.swbell.net

Is there just one user who keeps on getting his IP reassigned? Are all the machines in this provider hopelessly compromised? What could account for so many machines coming from swbell.net?




Update 2008-07-25: Another Movable Type website has the exact same problem.

The Varying Impact of Gas Prices

| | Comments (0) | TrackBacks (0)

[New York Times story]

Gas prices are high throughout the country, but how hard they hit individual families depends on income levels, which vary widely.

Urban Pranksters

| | Comments (0) | TrackBacks (0)

[Urban Prankster] is a new blog from the creators of ImprovEverywhere that:

will feature pranks, hacks, participatory art, flash mobs, and other creative endeavors that take place in public places in cities across the world. If someone does something awesome in the public space, we plan to cover it.

With video.

Open Source Shakespeare

| | Comments (0) | TrackBacks (0)

I was doing a crossword puzzle this afternoon and needed some Shakespeare quotes to complete the clues. (Sometimes, I can't get the answer from the clue alone. I need help.) So I googled for a specific Shakespeare play, act, and scene, and it came up with Open Source Shakespeare. It's amazing! It has all the plays, all the sonnets, and a concordance. What more could you ask for?

US State Quarters Update 2

| | Comments (0) | TrackBacks (0)

I traded for: IL, IA, and RI.

I've updated my list of missing Denver mint coins to reflect this.

FakeTV

| | Comments (0) | TrackBacks (0)

[FakeTV] emulates human watching the tube, supposedly discourages thieves

Firefox addin: GooglePreview

| | Comments (0) | TrackBacks (0)

Firefox addin: GooglePreview

Inserts preview images (thumbnails) of web sites into the Google and Yahoo search results pages.

[Download]

Trending123.com

| | Comments (0) | TrackBacks (0)

Trending123 has stocks and ETFs broken down by sector. For each sector, you can see the components, the recent change and volume, high/low/close, and pivot points (resistance and support) for the entity.

[Stock/sector screening]

StockCharts.com stock scanner

| | Comments (0) | TrackBacks (0)

[StockCharts.com stock scanner]
Scans allow you to quickly find all of the stocks, mutual funds, and indices in our database that meet whatever technical conditions (also called "scan criteria") that you select. For instance, you can scan all the stocks traded on the New York Stock Exchange and find only those that have reached their 52-week highs.

Microsoft Source Analysis for C#

| | Comments (0) | TrackBacks (0)

Microsoft Source Analysis for C#

Source Analysis, also known as StyleCop, analyzes C# source code to enforce a set of best practice style and consistency rules. It can be run from inside of Visual Studio or integrated into an MSBuild project

[Download]

Microsoft FxCop 1.36

FxCop is a code analysis tool that checks .NET managed code assemblies for conformance to the Microsoft .NET Framework Design Guidelines. It uses MSIL parsing, and callgraph analysis to inspect assemblies for more than 200 defects in the following areas:

  • Library design
  • Globalization
  • Naming conventions
  • Performance
  • Interoperability and portability
  • Security
  • Usage

[Download]

  1. Simplified APM with the AsyncEnumerator
    Here Jeffrey Richter introduces his AsyncEnumerator class, which drives an iterator so that different thread pool threads can execute the same code at different times.
  2. Simplified APM with C#
    Jeffrey Richter introduces his AsyncEnumerator class and explains how it harnesses some recent additions to the C# programming language that make working with the asynchronous programming model significantly easier.
  3. Asynchronous Device Operations
    Jeff Richter uses the AsyncResult class to implement the CLR's Asynchronous Programming Model to perform hardware device operations asynchronously.
  4. Implementing the CLR Asynchronous Programming Model

Miniature Enigma machines (from Bletchley Park): for the ubergeek in your family.

Pocket Enigma
Designed exclusively for and only available through Bletchley Park, Pocket Enigma is a little cipher machine with a single wheel that rotates on the CD mount in a compact disk case. It works on exactly the same principles as the real Enigma machine used by the German armed forces during WW II.






Enigma-E
Enables you to build your very own battery powered Electronic Enigma machine, based on those used by Bletchley Park codebreakers during WWII. DIY simulation of the 8 wheel M3 and M4 Enigma. All components are included. Features an alpha-numerical display, lamp panel and 26 key keyboard as well as separate Stecker board. Requires only basic soldering experience, although basic knowledge of electronics may be required to understand the circuit description.

Current design methodologies

| | Comments (0) | TrackBacks (0)

Dev 102 bit twiddling challenge

| | Comments (0) | TrackBacks (0)

Recently Dev102 had a bit twiddling programming challenge.

Given a 1000X1000 grayscale image where each pixel is 8 bits, you need to reverse the order of the bits in each pixel. Example: 10001101 becomes 10110001, 00111101 becomes 10111100 and so on. Provide the most efficient solution in the manner of performance because another input is that you need to handle many images per second.

The challenge amounts to providing code that transforms every byte in a bitmap so that its bits were reversed -- bits 1 and 8 exchange, bits 2 and 7 exchange, bits 3 and 6 exchange, and bits 4 and 5 exchange. The obvious answer is to create a lookup table because an individual byte will always map onto a particular reversed byte. You may as well do the calculation only once and then just use the byte value as a lookup into the table of reversed bytes.

So that part is obvious and not very interesting. How to reverse the bits though?

There are lots of good answers (and I really like this one) but none uses my approach. I took each pair of bits to be exchanged and observed that there can be four possible outcomes: 00, 01, 10, and 11. If they come out 00 or 11, you don't have to do anything: they are already reversed. If they are 01 or 10, then you need to map them to 10 or 01, respectively. And you can get that by XOR-ing the result with the mask that produced the two bit combination. That is:

  1. AND the byte with an appropriate mask
  2. if the result has one bit set of the two,
  3. XOR the masked result with the mask.

And the code looks like this:

def reflected(x) :
    result = 0
    masks = (0x81, 0x42, 0x24, 0x18)
    outcomes = ((0x80, 0x01), (0x40, 0x02), 
        (0x20, 0x04), (0x10, 0x08))
    for mask, outcome in zip(masks, outcomes) :
        y = x & mask
        if y in outcome :
            y ^= mask
        result |= y
    return result

[Python source]

US State Quarters for Trading

| | Comments (0) | TrackBacks (0)

Here are the circulated state quarters that I am willing to trade:

YearStateDenverPhiladelphia
1999PA2
NJ1
2001VT2
RI21
KY2
2002IN2
2003AL11
AR11
ME1
2004TX1
WI2
2005CA1
KS1
MN1
OR2
2006CO2
ND12
NE3
2007ID3
MT3
UT2
WA1
WY2
2008OK7
NM6

If you are interested in having any of these, please look over my list of missing Denver mint coins for coins that you could offer me in exchange. Contact me through comments on this site or email.

US State Quarters update

| | Comments (0) | TrackBacks (1)

A big coin collecting day: I found Denver mint quarters for Wyoming, Montana, Pennsylvania, Missouri, and Kansas! Amazing!

I've updated my list of missing Denver mint coins to reflect this.

Chinese cities

| | Comments (0) | TrackBacks (0)

So Lori is in western China, having passed through Urumqi (a city of 2 000 000-ish) to Kashgar (a city of 200 000-ish).

The number of Chinese cities with populations above 1 000 000 is pretty staggering -- 58 in all. For comparison, the US has only 9 cities with a population over 1 000 000. If Urumqi, ranked 33 by population in China, were in the US, it would nudge out Phoenix for 5th place.

Financial blog links

| | Comments (0) | TrackBacks (0)

MapChannels.com

| | Comments (0) | TrackBacks (0)

MapChannels.com has a pretty cool display of hotels in a city/zip code. Think: google/hotel mashup. What's not to like about the radar sweep search?

The internet phrases I own

| | Comments (0) | TrackBacks (0)

Here are the phrases that I come in the top five hits at search engines:

The Gobi March

| | Comments (0) | TrackBacks (0)

Technically, I think that Racing the Planet's Gobi March actually occurs in the Taklamakan Desert, not the Gobi Desert. The Taklamakan is bounded by "the Kunlun Mountains to the south [the border range of northern Tibet], and Pamir Mountains [which cut north through Afghanistan, Pakistan, and Tajikistan, touching western China] and Tian Shan [Tajikistan as far east as Urumqi]...to the west and north". The Taklamakan comprises most of the area of the Tarim Basin.

Kelly's Cool Tools

| | Comments (0) | TrackBacks (0)

I've been promoting Kelly's Cool Tools to friends and family for years. It is filled with gadgets and tips and such. Here are some of the things I've told people about, and a fair number of the items have become gifts I've given.



World Party

Guide to world's best festivals

world_party_cover-sm.jpg All the world is a party; you just have to know where to look. My favorite "big happys" are traditional religious festivals, which can't be beat for color, intensity and otherness. This Rough Guide serves as a good guide to some of the world's most interesting celebrations. Besides the famous (Mardi Gras, Kuhm Mela), and the infamous (full moon in Hat Rin, Thailand, Love Parade in Berlin), it also lists a hundred smaller lesser known, but still incredible festivals. It's crammed with color photos, history, reviews, and tips. You could map out a pretty good journey trying to keep up with the possibilities here.

-- KK
World Party: The Rough Guide to the World's Best Festivals
Rough Guides 2006, 400 pages
$17
Available from Amazon



Rails-to-Trails

No-car roads

rail_bridge.jpg Rails-to-Trails (or rail trails) are roads without cars. They are where railways go when they die. Bicycles love them.

Every year 2,000 miles of railways in the US are abandoned. So far, about half of the 300,000 miles railways built by 1916 (the railroad peak) have been taken out of service. Some 13,000 of those miles have been repurposed into bike/hike trails.

Why they're great: 1) You get paths with flat to gentle slopes, 2) no cars, 3) no strip development, and 4) often passing through small towns. These wide, sculpted, relaxing paths are perfect for hiking, horseback, cross-country skiing, skates and particularly bicycles. While most of the rails-to-trails are less than 5 miles long, there are 10 in the country stretching over 100 miles and at least one that is 225 continuous miles. These longer trails are a big hit -- easy, civilized bicycle tours: gentle rides without having to compete with cars. As far as I am concerned, riding bicycles on rail trails is the way to go.



Storm Whistle

Ultra-loud, all-weather noisemaker

stormwhistle_sm.jpg I found this incredibly loud whistle while putting together a disaster preparedness kit for my car. I did some non-scientific testing against my Fox 40 (rated 115 decibels) by having my son blow into each of them across a soccer field. The Storm (rated 118-120db) definitely sounded louder (decibels are based on a logarithmic scale with a base of 10, so the Storm's decibel intensity is almost 3 times the Fox 40). It is also advertised as working underwater (the chambers clear as you blow). I haven't tried it underwater yet, but regardless, this is the loudest whistle I have ever heard.

-- Mark Chow-Young
Storm Whistle
$6
Available from Amazon (limited stock)



Leatherman Micra

Classic urban survival multi-tool

leatherman-micra-sm.jpg I'm a computer geek, both by trade and by lifestyle, so I've accumulated several boxes full of tools for disassembling and reassembling all sorts of obscure computer stuff. Since I found the Micra, most of what's in those boxes sits unused in my office. Smaller than most pocket knives, and with the ability to unfold into a completely handy pair of snips, the stainless steel Micra contains two functional flat-blade drivers (micro and "regular") and a #2 Phillips-equivalent screwdriver, so I can achieve most anything I need to do inside a server closet or at a customer's desk. You could opt for the Wave, which features more tools. However, the less expensive Micra is lighter (1.75 vs. 8.5 ounces) and smaller (2.5" vs. 4"), and overall it's much more of an urban survival tool. It comes with tweezers, scissors, nail file, and a bottle opener, but the features that make it the most valuable to me are the "Phillips" blade (a flat blade shaped to fit into a Phillips head) and the micro flat driver blade. I'm constantly opening stuff - packages from FedEx (knife,) packages of sunflower kernels (scissors), laptops (micro screwdriver,) data racks (Phillips) and the like. This tool has everything I use on a daily basis in a simple, little package.

-- Steve Sussex
Leatherman Micra
$16
Available from Amazon



Surefire G2 Light

Super-brightest flashlights

surefire_g2.jpg By far the brightest pocketable flashlights these days are powered by a pair of 3-volt lithium batteries (the kind used in cameras -- 123A). Smaller than your hand they throw out four times more light than huge D-cell monsters. Lithium beacons were pioneered by the law enforcement and military supplier Surefire. They are issued in deluxe $200 plus anodized versions.

Now catering to the rest of us, Surefire puts the same innards into this cheap(er) indestructible plastic version -- the G2 Nitrolon for $34. Like the other Surefires, its xenon bulb is so blindingly bright that it's hot to the touch after a few minutes. It WILL temporarily blind someone closeup in the dark. These torches are the opposite of nifty LED lights which supply a cool light that keeps going forever. Instead these bright xenon lights exhale the sun while inhaling lithium batteries at shocking rate; a pair of lithiums will last only one hour uninterrupted.

About this Archive

This page is an archive of entries from June 2008 listed from newest to oldest.

May 2008 is the previous archive.

July 2008 is the next archive.

Find recent content on the main index or look in the archives to find all content.